From 9fb2bf0a745471371f21c65fb4f17f864cfd4a2c Mon Sep 17 00:00:00 2001 From: latte Date: Sat, 19 Jul 2025 16:20:04 +0200 Subject: [PATCH] removed venv --- .gitignore | 3 +- venv/bin/Activate.ps1 | 247 - venv/bin/activate | 70 - venv/bin/activate.csh | 27 - venv/bin/activate.fish | 69 - venv/bin/dotenv | 8 - venv/bin/httpx | 8 - venv/bin/pip | 8 - venv/bin/pip3 | 8 - venv/bin/pip3.12 | 8 - venv/bin/python | 1 - venv/bin/python3 | 1 - venv/bin/python3.12 | 1 - .../typing_extensions.cpython-312.pyc | Bin 162211 -> 0 bytes .../INSTALLER | 1 - .../aiohappyeyeballs-2.6.1.dist-info/LICENSE | 279 - .../aiohappyeyeballs-2.6.1.dist-info/METADATA | 123 - .../aiohappyeyeballs-2.6.1.dist-info/RECORD | 16 - .../aiohappyeyeballs-2.6.1.dist-info/WHEEL | 4 - .../aiohappyeyeballs/__init__.py | 14 - .../__pycache__/__init__.cpython-312.pyc | Bin 525 -> 0 bytes .../__pycache__/_staggered.cpython-312.pyc | Bin 8027 -> 0 bytes .../__pycache__/impl.cpython-312.pyc | Bin 10138 -> 0 bytes .../__pycache__/types.cpython-312.pyc | Bin 621 -> 0 bytes .../__pycache__/utils.cpython-312.pyc | Bin 3733 -> 0 bytes .../aiohappyeyeballs/_staggered.py | 207 - .../site-packages/aiohappyeyeballs/impl.py | 259 - .../site-packages/aiohappyeyeballs/py.typed | 0 .../site-packages/aiohappyeyeballs/types.py | 17 - .../site-packages/aiohappyeyeballs/utils.py | 97 - .../aiohttp-3.12.14.dist-info/INSTALLER | 1 - .../aiohttp-3.12.14.dist-info/METADATA | 250 - .../aiohttp-3.12.14.dist-info/RECORD | 138 - .../aiohttp-3.12.14.dist-info/REQUESTED | 0 .../aiohttp-3.12.14.dist-info/WHEEL | 6 - .../licenses/LICENSE.txt | 13 - .../aiohttp-3.12.14.dist-info/top_level.txt | 1 - .../aiohttp/.hash/_cparser.pxd.hash | 1 - .../aiohttp/.hash/_find_header.pxd.hash | 1 - .../aiohttp/.hash/_http_parser.pyx.hash | 1 - .../aiohttp/.hash/_http_writer.pyx.hash | 1 - .../site-packages/aiohttp/.hash/hdrs.py.hash | 1 - .../site-packages/aiohttp/__init__.py | 278 - .../__pycache__/__init__.cpython-312.pyc | Bin 5337 -> 0 bytes .../_cookie_helpers.cpython-312.pyc | Bin 10103 -> 0 bytes .../aiohttp/__pycache__/abc.cpython-312.pyc | Bin 12505 -> 0 bytes .../__pycache__/base_protocol.cpython-312.pyc | Bin 4543 -> 0 bytes .../__pycache__/client.cpython-312.pyc | Bin 55557 -> 0 bytes .../client_exceptions.cpython-312.pyc | Bin 17996 -> 0 bytes ...ent_middleware_digest_auth.cpython-312.pyc | Bin 16288 -> 0 bytes .../client_middlewares.cpython-312.pyc | Bin 2296 -> 0 bytes .../__pycache__/client_proto.cpython-312.pyc | Bin 13401 -> 0 bytes .../__pycache__/client_reqrep.cpython-312.pyc | Bin 64752 -> 0 bytes .../__pycache__/client_ws.cpython-312.pyc | Bin 22528 -> 0 bytes .../compression_utils.cpython-312.pyc | Bin 15172 -> 0 bytes .../__pycache__/connector.cpython-312.pyc | Bin 76745 -> 0 bytes .../__pycache__/cookiejar.cpython-312.pyc | Bin 21481 -> 0 bytes .../__pycache__/formdata.cpython-312.pyc | Bin 7638 -> 0 bytes .../aiohttp/__pycache__/hdrs.cpython-312.pyc | Bin 8502 -> 0 bytes .../__pycache__/helpers.cpython-312.pyc | Bin 41751 -> 0 bytes .../aiohttp/__pycache__/http.cpython-312.pyc | Bin 1703 -> 0 bytes .../http_exceptions.cpython-312.pyc | Bin 6172 -> 0 bytes .../__pycache__/http_parser.cpython-312.pyc | Bin 36178 -> 0 bytes .../http_websocket.cpython-312.pyc | Bin 991 -> 0 bytes .../__pycache__/http_writer.cpython-312.pyc | Bin 14553 -> 0 bytes .../aiohttp/__pycache__/log.cpython-312.pyc | Bin 740 -> 0 bytes .../__pycache__/multipart.cpython-312.pyc | Bin 52676 -> 0 bytes .../__pycache__/payload.cpython-312.pyc | Bin 48969 -> 0 bytes .../payload_streamer.cpython-312.pyc | Bin 4428 -> 0 bytes .../__pycache__/pytest_plugin.cpython-312.pyc | Bin 18514 -> 0 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 10950 -> 0 bytes .../__pycache__/streams.cpython-312.pyc | Bin 30985 -> 0 bytes .../__pycache__/tcp_helpers.cpython-312.pyc | Bin 1799 -> 0 bytes .../__pycache__/test_utils.cpython-312.pyc | Bin 34844 -> 0 bytes .../__pycache__/tracing.cpython-312.pyc | Bin 21919 -> 0 bytes .../__pycache__/typedefs.cpython-312.pyc | Bin 2292 -> 0 bytes .../aiohttp/__pycache__/web.cpython-312.pyc | Bin 16507 -> 0 bytes .../__pycache__/web_app.cpython-312.pyc | Bin 27293 -> 0 bytes .../web_exceptions.cpython-312.pyc | Bin 15024 -> 0 bytes .../web_fileresponse.cpython-312.pyc | Bin 17224 -> 0 bytes .../__pycache__/web_log.cpython-312.pyc | Bin 10696 -> 0 bytes .../web_middlewares.cpython-312.pyc | Bin 5648 -> 0 bytes .../__pycache__/web_protocol.cpython-312.pyc | Bin 31299 -> 0 bytes .../__pycache__/web_request.cpython-312.pyc | Bin 38604 -> 0 bytes .../__pycache__/web_response.cpython-312.pyc | Bin 39206 -> 0 bytes .../__pycache__/web_routedef.cpython-312.pyc | Bin 11919 -> 0 bytes .../__pycache__/web_runner.cpython-312.pyc | Bin 19059 -> 0 bytes .../__pycache__/web_server.cpython-312.pyc | Bin 4927 -> 0 bytes .../web_urldispatcher.cpython-312.pyc | Bin 68680 -> 0 bytes .../__pycache__/web_ws.cpython-312.pyc | Bin 31597 -> 0 bytes .../__pycache__/worker.cpython-312.pyc | Bin 12088 -> 0 bytes .../site-packages/aiohttp/_cookie_helpers.py | 309 - .../site-packages/aiohttp/_cparser.pxd | 158 - .../site-packages/aiohttp/_find_header.pxd | 2 - .../site-packages/aiohttp/_headers.pxi | 83 - ...ttp_parser.cpython-312-x86_64-linux-gnu.so | Bin 2878000 -> 0 bytes .../site-packages/aiohttp/_http_parser.pyx | 837 -- ...ttp_writer.cpython-312-x86_64-linux-gnu.so | Bin 511688 -> 0 bytes .../site-packages/aiohttp/_http_writer.pyx | 160 - .../aiohttp/_websocket/.hash/mask.pxd.hash | 1 - .../aiohttp/_websocket/.hash/mask.pyx.hash | 1 - .../_websocket/.hash/reader_c.pxd.hash | 1 - .../aiohttp/_websocket/__init__.py | 1 - .../__pycache__/__init__.cpython-312.pyc | Bin 263 -> 0 bytes .../__pycache__/helpers.cpython-312.pyc | Bin 6010 -> 0 bytes .../__pycache__/models.cpython-312.pyc | Bin 3473 -> 0 bytes .../__pycache__/reader.cpython-312.pyc | Bin 759 -> 0 bytes .../__pycache__/reader_c.cpython-312.pyc | Bin 17608 -> 0 bytes .../__pycache__/reader_py.cpython-312.pyc | Bin 17609 -> 0 bytes .../__pycache__/writer.cpython-312.pyc | Bin 6382 -> 0 bytes .../aiohttp/_websocket/helpers.py | 147 - .../mask.cpython-312-x86_64-linux-gnu.so | Bin 258728 -> 0 bytes .../site-packages/aiohttp/_websocket/mask.pxd | 3 - .../site-packages/aiohttp/_websocket/mask.pyx | 48 - .../aiohttp/_websocket/models.py | 84 - .../aiohttp/_websocket/reader.py | 31 - .../reader_c.cpython-312-x86_64-linux-gnu.so | Bin 1818512 -> 0 bytes .../aiohttp/_websocket/reader_c.pxd | 110 - .../aiohttp/_websocket/reader_c.py | 476 - .../aiohttp/_websocket/reader_py.py | 476 - .../aiohttp/_websocket/writer.py | 178 - .../python3.12/site-packages/aiohttp/abc.py | 268 - .../site-packages/aiohttp/base_protocol.py | 100 - .../site-packages/aiohttp/client.py | 1613 --- .../aiohttp/client_exceptions.py | 421 - .../aiohttp/client_middleware_digest_auth.py | 474 - .../aiohttp/client_middlewares.py | 55 - .../site-packages/aiohttp/client_proto.py | 359 - .../site-packages/aiohttp/client_reqrep.py | 1533 --- .../site-packages/aiohttp/client_ws.py | 428 - .../aiohttp/compression_utils.py | 278 - .../site-packages/aiohttp/connector.py | 1834 --- .../site-packages/aiohttp/cookiejar.py | 522 - .../site-packages/aiohttp/formdata.py | 179 - .../python3.12/site-packages/aiohttp/hdrs.py | 121 - .../site-packages/aiohttp/helpers.py | 958 -- .../python3.12/site-packages/aiohttp/http.py | 72 - .../site-packages/aiohttp/http_exceptions.py | 112 - .../site-packages/aiohttp/http_parser.py | 1050 -- .../site-packages/aiohttp/http_websocket.py | 36 - .../site-packages/aiohttp/http_writer.py | 378 - .../python3.12/site-packages/aiohttp/log.py | 8 - .../site-packages/aiohttp/multipart.py | 1140 -- .../site-packages/aiohttp/payload.py | 1124 -- .../site-packages/aiohttp/payload_streamer.py | 78 - .../python3.12/site-packages/aiohttp/py.typed | 1 - .../site-packages/aiohttp/pytest_plugin.py | 444 - .../site-packages/aiohttp/resolver.py | 274 - .../site-packages/aiohttp/streams.py | 727 - .../site-packages/aiohttp/tcp_helpers.py | 37 - .../site-packages/aiohttp/test_utils.py | 774 -- .../site-packages/aiohttp/tracing.py | 455 - .../site-packages/aiohttp/typedefs.py | 69 - .../python3.12/site-packages/aiohttp/web.py | 605 - .../site-packages/aiohttp/web_app.py | 620 - .../site-packages/aiohttp/web_exceptions.py | 452 - .../site-packages/aiohttp/web_fileresponse.py | 418 - .../site-packages/aiohttp/web_log.py | 216 - .../site-packages/aiohttp/web_middlewares.py | 121 - .../site-packages/aiohttp/web_protocol.py | 792 -- .../site-packages/aiohttp/web_request.py | 916 -- .../site-packages/aiohttp/web_response.py | 856 -- .../site-packages/aiohttp/web_routedef.py | 214 - .../site-packages/aiohttp/web_runner.py | 399 - .../site-packages/aiohttp/web_server.py | 84 - .../aiohttp/web_urldispatcher.py | 1303 -- .../site-packages/aiohttp/web_ws.py | 631 - .../site-packages/aiohttp/worker.py | 255 - .../aiosignal-1.4.0.dist-info/INSTALLER | 1 - .../aiosignal-1.4.0.dist-info/METADATA | 112 - .../aiosignal-1.4.0.dist-info/RECORD | 9 - .../aiosignal-1.4.0.dist-info/WHEEL | 5 - .../licenses/LICENSE | 201 - .../aiosignal-1.4.0.dist-info/top_level.txt | 1 - .../site-packages/aiosignal/__init__.py | 59 - .../__pycache__/__init__.cpython-312.pyc | Bin 2705 -> 0 bytes .../site-packages/aiosignal/py.typed | 0 .../anyio-4.9.0.dist-info/INSTALLER | 1 - .../anyio-4.9.0.dist-info/LICENSE | 20 - .../anyio-4.9.0.dist-info/METADATA | 105 - .../anyio-4.9.0.dist-info/RECORD | 88 - .../site-packages/anyio-4.9.0.dist-info/WHEEL | 5 - .../anyio-4.9.0.dist-info/entry_points.txt | 2 - .../anyio-4.9.0.dist-info/top_level.txt | 1 - .../site-packages/anyio/__init__.py | 85 - .../__pycache__/__init__.cpython-312.pyc | Bin 3601 -> 0 bytes .../__pycache__/from_thread.cpython-312.pyc | Bin 24109 -> 0 bytes .../__pycache__/lowlevel.cpython-312.pyc | Bin 6984 -> 0 bytes .../__pycache__/pytest_plugin.cpython-312.pyc | Bin 13417 -> 0 bytes .../to_interpreter.cpython-312.pyc | Bin 9139 -> 0 bytes .../__pycache__/to_process.cpython-312.pyc | Bin 11892 -> 0 bytes .../__pycache__/to_thread.cpython-312.pyc | Bin 2957 -> 0 bytes .../site-packages/anyio/_backends/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 208 -> 0 bytes .../__pycache__/_asyncio.cpython-312.pyc | Bin 132779 -> 0 bytes .../__pycache__/_trio.cpython-312.pyc | Bin 70500 -> 0 bytes .../site-packages/anyio/_backends/_asyncio.py | 2816 ---- .../site-packages/anyio/_backends/_trio.py | 1334 -- .../site-packages/anyio/_core/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 204 -> 0 bytes .../_asyncio_selector_thread.cpython-312.pyc | Bin 8435 -> 0 bytes .../__pycache__/_eventloop.cpython-312.pyc | Bin 6362 -> 0 bytes .../__pycache__/_exceptions.cpython-312.pyc | Bin 6076 -> 0 bytes .../_core/__pycache__/_fileio.cpython-312.pyc | Bin 41635 -> 0 bytes .../__pycache__/_resources.cpython-312.pyc | Bin 957 -> 0 bytes .../__pycache__/_signals.cpython-312.pyc | Bin 1289 -> 0 bytes .../__pycache__/_sockets.cpython-312.pyc | Bin 31563 -> 0 bytes .../__pycache__/_streams.cpython-312.pyc | Bin 2352 -> 0 bytes .../__pycache__/_subprocesses.cpython-312.pyc | Bin 9664 -> 0 bytes .../_synchronization.cpython-312.pyc | Bin 32203 -> 0 bytes .../_core/__pycache__/_tasks.cpython-312.pyc | Bin 7009 -> 0 bytes .../__pycache__/_tempfile.cpython-312.pyc | Bin 28156 -> 0 bytes .../__pycache__/_testing.cpython-312.pyc | Bin 3584 -> 0 bytes .../__pycache__/_typedattr.cpython-312.pyc | Bin 3854 -> 0 bytes .../anyio/_core/_asyncio_selector_thread.py | 167 - .../site-packages/anyio/_core/_eventloop.py | 166 - .../site-packages/anyio/_core/_exceptions.py | 126 - .../site-packages/anyio/_core/_fileio.py | 742 - .../site-packages/anyio/_core/_resources.py | 18 - .../site-packages/anyio/_core/_signals.py | 27 - .../site-packages/anyio/_core/_sockets.py | 792 -- .../site-packages/anyio/_core/_streams.py | 52 - .../anyio/_core/_subprocesses.py | 202 - .../anyio/_core/_synchronization.py | 732 - .../site-packages/anyio/_core/_tasks.py | 158 - .../site-packages/anyio/_core/_tempfile.py | 616 - .../site-packages/anyio/_core/_testing.py | 78 - .../site-packages/anyio/_core/_typedattr.py | 81 - .../site-packages/anyio/abc/__init__.py | 55 - .../abc/__pycache__/__init__.cpython-312.pyc | Bin 2244 -> 0 bytes .../__pycache__/_eventloop.cpython-312.pyc | Bin 14993 -> 0 bytes .../__pycache__/_resources.cpython-312.pyc | Bin 1651 -> 0 bytes .../abc/__pycache__/_sockets.cpython-312.pyc | Bin 9899 -> 0 bytes .../abc/__pycache__/_streams.cpython-312.pyc | Bin 8455 -> 0 bytes .../__pycache__/_subprocesses.cpython-312.pyc | Bin 3259 -> 0 bytes .../abc/__pycache__/_tasks.cpython-312.pyc | Bin 4535 -> 0 bytes .../abc/__pycache__/_testing.cpython-312.pyc | Bin 2854 -> 0 bytes .../site-packages/anyio/abc/_eventloop.py | 376 - .../site-packages/anyio/abc/_resources.py | 33 - .../site-packages/anyio/abc/_sockets.py | 194 - .../site-packages/anyio/abc/_streams.py | 203 - .../site-packages/anyio/abc/_subprocesses.py | 79 - .../site-packages/anyio/abc/_tasks.py | 101 - .../site-packages/anyio/abc/_testing.py | 65 - .../site-packages/anyio/from_thread.py | 527 - .../site-packages/anyio/lowlevel.py | 161 - .../python3.12/site-packages/anyio/py.typed | 0 .../site-packages/anyio/pytest_plugin.py | 272 - .../site-packages/anyio/streams/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 206 -> 0 bytes .../__pycache__/buffered.cpython-312.pyc | Bin 6135 -> 0 bytes .../streams/__pycache__/file.cpython-312.pyc | Bin 7547 -> 0 bytes .../__pycache__/memory.cpython-312.pyc | Bin 14967 -> 0 bytes .../__pycache__/stapled.cpython-312.pyc | Bin 7567 -> 0 bytes .../streams/__pycache__/text.cpython-312.pyc | Bin 8311 -> 0 bytes .../streams/__pycache__/tls.cpython-312.pyc | Bin 17590 -> 0 bytes .../site-packages/anyio/streams/buffered.py | 119 - .../site-packages/anyio/streams/file.py | 148 - .../site-packages/anyio/streams/memory.py | 317 - .../site-packages/anyio/streams/stapled.py | 141 - .../site-packages/anyio/streams/text.py | 147 - .../site-packages/anyio/streams/tls.py | 352 - .../site-packages/anyio/to_interpreter.py | 218 - .../site-packages/anyio/to_process.py | 258 - .../site-packages/anyio/to_thread.py | 69 - .../python3.12/site-packages/attr/__init__.py | 104 - .../site-packages/attr/__init__.pyi | 389 - .../attr/__pycache__/__init__.cpython-312.pyc | Bin 2634 -> 0 bytes .../attr/__pycache__/_cmp.cpython-312.pyc | Bin 5098 -> 0 bytes .../attr/__pycache__/_compat.cpython-312.pyc | Bin 3524 -> 0 bytes .../attr/__pycache__/_config.cpython-312.pyc | Bin 1130 -> 0 bytes .../attr/__pycache__/_funcs.cpython-312.pyc | Bin 13653 -> 0 bytes .../attr/__pycache__/_make.cpython-312.pyc | Bin 99508 -> 0 bytes .../__pycache__/_next_gen.cpython-312.pyc | Bin 24376 -> 0 bytes .../__pycache__/_version_info.cpython-312.pyc | Bin 3144 -> 0 bytes .../__pycache__/converters.cpython-312.pyc | Bin 4648 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 3601 -> 0 bytes .../attr/__pycache__/filters.cpython-312.pyc | Bin 3015 -> 0 bytes .../attr/__pycache__/setters.cpython-312.pyc | Bin 1935 -> 0 bytes .../__pycache__/validators.cpython-312.pyc | Bin 26245 -> 0 bytes .../lib/python3.12/site-packages/attr/_cmp.py | 160 - .../python3.12/site-packages/attr/_cmp.pyi | 13 - .../python3.12/site-packages/attr/_compat.py | 94 - .../python3.12/site-packages/attr/_config.py | 31 - .../python3.12/site-packages/attr/_funcs.py | 468 - .../python3.12/site-packages/attr/_make.py | 3123 ----- .../site-packages/attr/_next_gen.py | 623 - .../site-packages/attr/_typing_compat.pyi | 15 - .../site-packages/attr/_version_info.py | 86 - .../site-packages/attr/_version_info.pyi | 9 - .../site-packages/attr/converters.py | 162 - .../site-packages/attr/converters.pyi | 19 - .../site-packages/attr/exceptions.py | 95 - .../site-packages/attr/exceptions.pyi | 17 - .../python3.12/site-packages/attr/filters.py | 72 - .../python3.12/site-packages/attr/filters.pyi | 6 - .../python3.12/site-packages/attr/py.typed | 0 .../python3.12/site-packages/attr/setters.py | 79 - .../python3.12/site-packages/attr/setters.pyi | 20 - .../site-packages/attr/validators.py | 710 - .../site-packages/attr/validators.pyi | 86 - .../attrs-25.3.0.dist-info/INSTALLER | 1 - .../attrs-25.3.0.dist-info/METADATA | 232 - .../attrs-25.3.0.dist-info/RECORD | 55 - .../attrs-25.3.0.dist-info/WHEEL | 4 - .../attrs-25.3.0.dist-info/licenses/LICENSE | 21 - .../site-packages/attrs/__init__.py | 69 - .../site-packages/attrs/__init__.pyi | 263 - .../__pycache__/__init__.cpython-312.pyc | Bin 1154 -> 0 bytes .../__pycache__/converters.cpython-312.pyc | Bin 239 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 239 -> 0 bytes .../attrs/__pycache__/filters.cpython-312.pyc | Bin 233 -> 0 bytes .../attrs/__pycache__/setters.cpython-312.pyc | Bin 233 -> 0 bytes .../__pycache__/validators.cpython-312.pyc | Bin 239 -> 0 bytes .../site-packages/attrs/converters.py | 3 - .../site-packages/attrs/exceptions.py | 3 - .../python3.12/site-packages/attrs/filters.py | 3 - .../python3.12/site-packages/attrs/py.typed | 0 .../python3.12/site-packages/attrs/setters.py | 3 - .../site-packages/attrs/validators.py | 3 - .../certifi-2025.7.14.dist-info/INSTALLER | 1 - .../certifi-2025.7.14.dist-info/METADATA | 77 - .../certifi-2025.7.14.dist-info/RECORD | 14 - .../certifi-2025.7.14.dist-info/WHEEL | 5 - .../licenses/LICENSE | 20 - .../certifi-2025.7.14.dist-info/top_level.txt | 1 - .../site-packages/certifi/__init__.py | 4 - .../site-packages/certifi/__main__.py | 12 - .../__pycache__/__init__.cpython-312.pyc | Bin 327 -> 0 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 642 -> 0 bytes .../certifi/__pycache__/core.cpython-312.pyc | Bin 2074 -> 0 bytes .../site-packages/certifi/cacert.pem | 4778 ------- .../python3.12/site-packages/certifi/core.py | 83 - .../python3.12/site-packages/certifi/py.typed | 0 .../dotenv-0.9.9.dist-info/INSTALLER | 1 - .../dotenv-0.9.9.dist-info/LICENSE | 21 - .../dotenv-0.9.9.dist-info/METADATA | 14 - .../dotenv-0.9.9.dist-info/RECORD | 7 - .../dotenv-0.9.9.dist-info/REQUESTED | 0 .../dotenv-0.9.9.dist-info/WHEEL | 6 - .../dotenv-0.9.9.dist-info/top_level.txt | 1 - .../site-packages/dotenv/__init__.py | 49 - .../site-packages/dotenv/__main__.py | 6 - .../__pycache__/__init__.cpython-312.pyc | Bin 1708 -> 0 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 372 -> 0 bytes .../dotenv/__pycache__/cli.cpython-312.pyc | Bin 10104 -> 0 bytes .../__pycache__/ipython.cpython-312.pyc | Bin 1981 -> 0 bytes .../dotenv/__pycache__/main.cpython-312.pyc | Bin 16990 -> 0 bytes .../dotenv/__pycache__/parser.cpython-312.pyc | Bin 10014 -> 0 bytes .../__pycache__/variables.cpython-312.pyc | Bin 5045 -> 0 bytes .../__pycache__/version.cpython-312.pyc | Bin 224 -> 0 bytes .../python3.12/site-packages/dotenv/cli.py | 205 - .../site-packages/dotenv/ipython.py | 39 - .../python3.12/site-packages/dotenv/main.py | 400 - .../python3.12/site-packages/dotenv/parser.py | 175 - .../python3.12/site-packages/dotenv/py.typed | 1 - .../site-packages/dotenv/variables.py | 86 - .../site-packages/dotenv/version.py | 1 - .../frozenlist-1.7.0.dist-info/INSTALLER | 1 - .../frozenlist-1.7.0.dist-info/METADATA | 626 - .../frozenlist-1.7.0.dist-info/RECORD | 12 - .../frozenlist-1.7.0.dist-info/WHEEL | 8 - .../licenses/LICENSE | 201 - .../frozenlist-1.7.0.dist-info/top_level.txt | 1 - .../site-packages/frozenlist/__init__.py | 86 - .../site-packages/frozenlist/__init__.pyi | 47 - .../__pycache__/__init__.cpython-312.pyc | Bin 4080 -> 0 bytes ...frozenlist.cpython-312-x86_64-linux-gnu.so | Bin 789896 -> 0 bytes .../site-packages/frozenlist/_frozenlist.pyx | 148 - .../site-packages/frozenlist/py.typed | 1 - .../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.12/site-packages/h11/__init__.py | 62 - .../h11/__pycache__/__init__.cpython-312.pyc | Bin 1087 -> 0 bytes .../h11/__pycache__/_abnf.cpython-312.pyc | Bin 1793 -> 0 bytes .../__pycache__/_connection.cpython-312.pyc | Bin 23143 -> 0 bytes .../h11/__pycache__/_events.cpython-312.pyc | Bin 13238 -> 0 bytes .../h11/__pycache__/_headers.cpython-312.pyc | Bin 8014 -> 0 bytes .../h11/__pycache__/_readers.cpython-312.pyc | Bin 9670 -> 0 bytes .../_receivebuffer.cpython-312.pyc | Bin 4716 -> 0 bytes .../h11/__pycache__/_state.cpython-312.pyc | Bin 8480 -> 0 bytes .../h11/__pycache__/_util.cpython-312.pyc | Bin 4731 -> 0 bytes .../h11/__pycache__/_version.cpython-312.pyc | Bin 225 -> 0 bytes .../h11/__pycache__/_writers.cpython-312.pyc | Bin 6307 -> 0 bytes .../lib/python3.12/site-packages/h11/_abnf.py | 132 - .../site-packages/h11/_connection.py | 659 - .../python3.12/site-packages/h11/_events.py | 369 - .../python3.12/site-packages/h11/_headers.py | 282 - .../python3.12/site-packages/h11/_readers.py | 250 - .../site-packages/h11/_receivebuffer.py | 153 - .../python3.12/site-packages/h11/_state.py | 365 - .../lib/python3.12/site-packages/h11/_util.py | 135 - .../python3.12/site-packages/h11/_version.py | 16 - .../python3.12/site-packages/h11/_writers.py | 145 - .../lib/python3.12/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-312.pyc | Bin 3183 -> 0 bytes .../httpcore/__pycache__/_api.cpython-312.pyc | Bin 3787 -> 0 bytes .../__pycache__/_exceptions.cpython-312.pyc | Bin 3202 -> 0 bytes .../__pycache__/_models.cpython-312.pyc | Bin 23133 -> 0 bytes .../httpcore/__pycache__/_ssl.cpython-312.pyc | Bin 622 -> 0 bytes .../_synchronization.cpython-312.pyc | Bin 14197 -> 0 bytes .../__pycache__/_trace.cpython-312.pyc | Bin 5614 -> 0 bytes .../__pycache__/_utils.cpython-312.pyc | Bin 1302 -> 0 bytes .../python3.12/site-packages/httpcore/_api.py | 94 - .../site-packages/httpcore/_async/__init__.py | 39 - .../__pycache__/__init__.cpython-312.pyc | Bin 1635 -> 0 bytes .../__pycache__/connection.cpython-312.pyc | Bin 11812 -> 0 bytes .../connection_pool.cpython-312.pyc | Bin 19692 -> 0 bytes .../_async/__pycache__/http11.cpython-312.pyc | Bin 20254 -> 0 bytes .../_async/__pycache__/http2.cpython-312.pyc | Bin 31457 -> 0 bytes .../__pycache__/http_proxy.cpython-312.pyc | Bin 18012 -> 0 bytes .../__pycache__/interfaces.cpython-312.pyc | Bin 5766 -> 0 bytes .../__pycache__/socks_proxy.cpython-312.pyc | Bin 16909 -> 0 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-312.pyc | Bin 211 -> 0 bytes .../__pycache__/anyio.cpython-312.pyc | Bin 8641 -> 0 bytes .../__pycache__/auto.cpython-312.pyc | Bin 2703 -> 0 bytes .../__pycache__/base.cpython-312.pyc | Bin 4905 -> 0 bytes .../__pycache__/mock.cpython-312.pyc | Bin 7169 -> 0 bytes .../__pycache__/sync.cpython-312.pyc | Bin 11442 -> 0 bytes .../__pycache__/trio.cpython-312.pyc | Bin 8978 -> 0 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.12/site-packages/httpcore/_ssl.py | 9 - .../site-packages/httpcore/_sync/__init__.py | 39 - .../__pycache__/__init__.cpython-312.pyc | Bin 1589 -> 0 bytes .../__pycache__/connection.cpython-312.pyc | Bin 10432 -> 0 bytes .../connection_pool.cpython-312.pyc | Bin 18771 -> 0 bytes .../_sync/__pycache__/http11.cpython-312.pyc | Bin 17798 -> 0 bytes .../_sync/__pycache__/http2.cpython-312.pyc | Bin 27462 -> 0 bytes .../__pycache__/http_proxy.cpython-312.pyc | Bin 17195 -> 0 bytes .../__pycache__/interfaces.cpython-312.pyc | Bin 5313 -> 0 bytes .../__pycache__/socks_proxy.cpython-312.pyc | Bin 15660 -> 0 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-312.pyc | Bin 2137 -> 0 bytes .../__pycache__/__version__.cpython-312.pyc | Bin 327 -> 0 bytes .../httpx/__pycache__/_api.cpython-312.pyc | Bin 10362 -> 0 bytes .../httpx/__pycache__/_auth.cpython-312.pyc | Bin 15614 -> 0 bytes .../httpx/__pycache__/_client.cpython-312.pyc | Bin 64199 -> 0 bytes .../httpx/__pycache__/_config.cpython-312.pyc | Bin 10995 -> 0 bytes .../__pycache__/_content.cpython-312.pyc | Bin 10420 -> 0 bytes .../__pycache__/_decoders.cpython-312.pyc | Bin 16772 -> 0 bytes .../__pycache__/_exceptions.cpython-312.pyc | Bin 12097 -> 0 bytes .../httpx/__pycache__/_main.cpython-312.pyc | Bin 20635 -> 0 bytes .../httpx/__pycache__/_models.cpython-312.pyc | Bin 58609 -> 0 bytes .../__pycache__/_multipart.cpython-312.pyc | Bin 13620 -> 0 bytes .../__pycache__/_status_codes.cpython-312.pyc | Bin 7207 -> 0 bytes .../httpx/__pycache__/_types.cpython-312.pyc | Bin 3839 -> 0 bytes .../__pycache__/_urlparse.cpython-312.pyc | Bin 17500 -> 0 bytes .../httpx/__pycache__/_urls.cpython-312.pyc | Bin 27943 -> 0 bytes .../httpx/__pycache__/_utils.cpython-312.pyc | Bin 9376 -> 0 bytes .../site-packages/httpx/__version__.py | 3 - .../python3.12/site-packages/httpx/_api.py | 438 - .../python3.12/site-packages/httpx/_auth.py | 348 - .../python3.12/site-packages/httpx/_client.py | 2019 --- .../python3.12/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.12/site-packages/httpx/_main.py | 506 - .../python3.12/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-312.pyc | Bin 456 -> 0 bytes .../__pycache__/asgi.cpython-312.pyc | Bin 7593 -> 0 bytes .../__pycache__/base.cpython-312.pyc | Bin 3886 -> 0 bytes .../__pycache__/default.cpython-312.pyc | Bin 17139 -> 0 bytes .../__pycache__/mock.cpython-312.pyc | Bin 1954 -> 0 bytes .../__pycache__/wsgi.cpython-312.pyc | Bin 6828 -> 0 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.12/site-packages/httpx/_types.py | 114 - .../site-packages/httpx/_urlparse.py | 527 - .../python3.12/site-packages/httpx/_urls.py | 641 - .../python3.12/site-packages/httpx/_utils.py | 242 - .../python3.12/site-packages/httpx/py.typed | 0 .../idna-3.10.dist-info/INSTALLER | 1 - .../idna-3.10.dist-info/LICENSE.md | 31 - .../idna-3.10.dist-info/METADATA | 250 - .../site-packages/idna-3.10.dist-info/RECORD | 22 - .../site-packages/idna-3.10.dist-info/WHEEL | 4 - .../python3.12/site-packages/idna/__init__.py | 45 - .../idna/__pycache__/__init__.cpython-312.pyc | Bin 895 -> 0 bytes .../idna/__pycache__/codec.cpython-312.pyc | Bin 4995 -> 0 bytes .../idna/__pycache__/compat.cpython-312.pyc | Bin 899 -> 0 bytes .../idna/__pycache__/core.cpython-312.pyc | Bin 16185 -> 0 bytes .../idna/__pycache__/idnadata.cpython-312.pyc | Bin 99485 -> 0 bytes .../__pycache__/intranges.cpython-312.pyc | Bin 2647 -> 0 bytes .../__pycache__/package_data.cpython-312.pyc | Bin 226 -> 0 bytes .../__pycache__/uts46data.cpython-312.pyc | Bin 158855 -> 0 bytes .../python3.12/site-packages/idna/codec.py | 122 - .../python3.12/site-packages/idna/compat.py | 15 - .../lib/python3.12/site-packages/idna/core.py | 437 - .../python3.12/site-packages/idna/idnadata.py | 4243 ------ .../site-packages/idna/intranges.py | 57 - .../site-packages/idna/package_data.py | 1 - .../python3.12/site-packages/idna/py.typed | 0 .../site-packages/idna/uts46data.py | 8681 ------------ .../multidict-6.6.3.dist-info/INSTALLER | 1 - .../multidict-6.6.3.dist-info/METADATA | 148 - .../multidict-6.6.3.dist-info/RECORD | 16 - .../multidict-6.6.3.dist-info/WHEEL | 7 - .../licenses/LICENSE | 13 - .../multidict-6.6.3.dist-info/top_level.txt | 1 - .../site-packages/multidict/__init__.py | 59 - .../__pycache__/__init__.cpython-312.pyc | Bin 1411 -> 0 bytes .../__pycache__/_abc.cpython-312.pyc | Bin 5558 -> 0 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 674 -> 0 bytes .../__pycache__/_multidict_py.cpython-312.pyc | Bin 65525 -> 0 bytes .../site-packages/multidict/_abc.py | 73 - .../site-packages/multidict/_compat.py | 15 - ..._multidict.cpython-312-x86_64-linux-gnu.so | Bin 848672 -> 0 bytes .../site-packages/multidict/_multidict_py.py | 1242 -- .../site-packages/multidict/py.typed | 1 - .../pip-24.0.dist-info/AUTHORS.txt | 760 -- .../pip-24.0.dist-info/INSTALLER | 1 - .../pip-24.0.dist-info/LICENSE.txt | 20 - .../site-packages/pip-24.0.dist-info/METADATA | 88 - .../site-packages/pip-24.0.dist-info/RECORD | 1005 -- .../pip-24.0.dist-info/REQUESTED | 0 .../site-packages/pip-24.0.dist-info/WHEEL | 5 - .../pip-24.0.dist-info/entry_points.txt | 4 - .../pip-24.0.dist-info/top_level.txt | 1 - .../python3.12/site-packages/pip/__init__.py | 13 - .../python3.12/site-packages/pip/__main__.py | 24 - .../site-packages/pip/__pip-runner__.py | 50 - .../pip/__pycache__/__init__.cpython-312.pyc | Bin 705 -> 0 bytes .../pip/__pycache__/__main__.cpython-312.pyc | Bin 861 -> 0 bytes .../__pip-runner__.cpython-312.pyc | Bin 2224 -> 0 bytes .../site-packages/pip/_internal/__init__.py | 18 - .../__pycache__/__init__.cpython-312.pyc | Bin 807 -> 0 bytes .../__pycache__/build_env.cpython-312.pyc | Bin 14314 -> 0 bytes .../__pycache__/cache.cpython-312.pyc | Bin 12685 -> 0 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 17686 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 33304 -> 0 bytes .../__pycache__/main.cpython-312.pyc | Bin 690 -> 0 bytes .../__pycache__/pyproject.cpython-312.pyc | Bin 4991 -> 0 bytes .../self_outdated_check.cpython-312.pyc | Bin 10572 -> 0 bytes .../__pycache__/wheel_builder.cpython-312.pyc | Bin 13669 -> 0 bytes .../site-packages/pip/_internal/build_env.py | 311 - .../site-packages/pip/_internal/cache.py | 290 - .../pip/_internal/cli/__init__.py | 4 - .../cli/__pycache__/__init__.cpython-312.pyc | Bin 298 -> 0 bytes .../autocompletion.cpython-312.pyc | Bin 8485 -> 0 bytes .../__pycache__/base_command.cpython-312.pyc | Bin 10475 -> 0 bytes .../__pycache__/cmdoptions.cpython-312.pyc | Bin 30394 -> 0 bytes .../command_context.cpython-312.pyc | Bin 1801 -> 0 bytes .../cli/__pycache__/main.cpython-312.pyc | Bin 2318 -> 0 bytes .../__pycache__/main_parser.cpython-312.pyc | Bin 4925 -> 0 bytes .../cli/__pycache__/parser.cpython-312.pyc | Bin 15042 -> 0 bytes .../__pycache__/progress_bars.cpython-312.pyc | Bin 2640 -> 0 bytes .../__pycache__/req_command.cpython-312.pyc | Bin 18872 -> 0 bytes .../cli/__pycache__/spinners.cpython-312.pyc | Bin 7860 -> 0 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 395 -> 0 bytes .../pip/_internal/cli/autocompletion.py | 172 - .../pip/_internal/cli/base_command.py | 236 - .../pip/_internal/cli/cmdoptions.py | 1074 -- .../pip/_internal/cli/command_context.py | 27 - .../site-packages/pip/_internal/cli/main.py | 79 - .../pip/_internal/cli/main_parser.py | 134 - .../site-packages/pip/_internal/cli/parser.py | 294 - .../pip/_internal/cli/progress_bars.py | 68 - .../pip/_internal/cli/req_command.py | 505 - .../pip/_internal/cli/spinners.py | 159 - .../pip/_internal/cli/status_codes.py | 6 - .../pip/_internal/commands/__init__.py | 132 - .../__pycache__/__init__.cpython-312.pyc | Bin 4022 -> 0 bytes .../__pycache__/cache.cpython-312.pyc | Bin 9731 -> 0 bytes .../__pycache__/check.cpython-312.pyc | Bin 2110 -> 0 bytes .../__pycache__/completion.cpython-312.pyc | Bin 5212 -> 0 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 13232 -> 0 bytes .../__pycache__/debug.cpython-312.pyc | Bin 10181 -> 0 bytes .../__pycache__/download.cpython-312.pyc | Bin 7609 -> 0 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 4436 -> 0 bytes .../commands/__pycache__/hash.cpython-312.pyc | Bin 3003 -> 0 bytes .../commands/__pycache__/help.cpython-312.pyc | Bin 1693 -> 0 bytes .../__pycache__/index.cpython-312.pyc | Bin 6740 -> 0 bytes .../__pycache__/inspect.cpython-312.pyc | Bin 3995 -> 0 bytes .../__pycache__/install.cpython-312.pyc | Bin 28933 -> 0 bytes .../commands/__pycache__/list.cpython-312.pyc | Bin 15676 -> 0 bytes .../__pycache__/search.cpython-312.pyc | Bin 7641 -> 0 bytes .../commands/__pycache__/show.cpython-312.pyc | Bin 9748 -> 0 bytes .../__pycache__/uninstall.cpython-312.pyc | Bin 4746 -> 0 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 8976 -> 0 bytes .../pip/_internal/commands/cache.py | 225 - .../pip/_internal/commands/check.py | 54 - .../pip/_internal/commands/completion.py | 130 - .../pip/_internal/commands/configuration.py | 280 - .../pip/_internal/commands/debug.py | 201 - .../pip/_internal/commands/download.py | 147 - .../pip/_internal/commands/freeze.py | 109 - .../pip/_internal/commands/hash.py | 59 - .../pip/_internal/commands/help.py | 41 - .../pip/_internal/commands/index.py | 139 - .../pip/_internal/commands/inspect.py | 92 - .../pip/_internal/commands/install.py | 774 -- .../pip/_internal/commands/list.py | 370 - .../pip/_internal/commands/search.py | 174 - .../pip/_internal/commands/show.py | 189 - .../pip/_internal/commands/uninstall.py | 113 - .../pip/_internal/commands/wheel.py | 183 - .../pip/_internal/configuration.py | 383 - .../pip/_internal/distributions/__init__.py | 21 - .../__pycache__/__init__.cpython-312.pyc | Bin 961 -> 0 bytes .../__pycache__/base.cpython-312.pyc | Bin 2882 -> 0 bytes .../__pycache__/installed.cpython-312.pyc | Bin 1720 -> 0 bytes .../__pycache__/sdist.cpython-312.pyc | Bin 8508 -> 0 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 2268 -> 0 bytes .../pip/_internal/distributions/base.py | 51 - .../pip/_internal/distributions/installed.py | 29 - .../pip/_internal/distributions/sdist.py | 156 - .../pip/_internal/distributions/wheel.py | 40 - .../site-packages/pip/_internal/exceptions.py | 728 - .../pip/_internal/index/__init__.py | 2 - .../__pycache__/__init__.cpython-312.pyc | Bin 252 -> 0 bytes .../__pycache__/collector.cpython-312.pyc | Bin 21906 -> 0 bytes .../package_finder.cpython-312.pyc | Bin 40755 -> 0 bytes .../index/__pycache__/sources.cpython-312.pyc | Bin 12624 -> 0 bytes .../pip/_internal/index/collector.py | 507 - .../pip/_internal/index/package_finder.py | 1027 -- .../pip/_internal/index/sources.py | 285 - .../pip/_internal/locations/__init__.py | 467 - .../__pycache__/__init__.cpython-312.pyc | Bin 16796 -> 0 bytes .../__pycache__/_distutils.cpython-312.pyc | Bin 6876 -> 0 bytes .../__pycache__/_sysconfig.cpython-312.pyc | Bin 8031 -> 0 bytes .../__pycache__/base.cpython-312.pyc | Bin 3801 -> 0 bytes .../pip/_internal/locations/_distutils.py | 172 - .../pip/_internal/locations/_sysconfig.py | 213 - .../pip/_internal/locations/base.py | 81 - .../site-packages/pip/_internal/main.py | 12 - .../pip/_internal/metadata/__init__.py | 128 - .../__pycache__/__init__.cpython-312.pyc | Bin 5902 -> 0 bytes .../__pycache__/_json.cpython-312.pyc | Bin 2895 -> 0 bytes .../metadata/__pycache__/base.cpython-312.pyc | Bin 35732 -> 0 bytes .../__pycache__/pkg_resources.cpython-312.pyc | Bin 15810 -> 0 bytes .../pip/_internal/metadata/_json.py | 84 - .../pip/_internal/metadata/base.py | 702 - .../_internal/metadata/importlib/__init__.py | 6 - .../__pycache__/__init__.cpython-312.pyc | Bin 378 -> 0 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 3353 -> 0 bytes .../__pycache__/_dists.cpython-312.pyc | Bin 13445 -> 0 bytes .../__pycache__/_envs.cpython-312.pyc | Bin 11200 -> 0 bytes .../_internal/metadata/importlib/_compat.py | 55 - .../_internal/metadata/importlib/_dists.py | 227 - .../pip/_internal/metadata/importlib/_envs.py | 189 - .../pip/_internal/metadata/pkg_resources.py | 278 - .../pip/_internal/models/__init__.py | 2 - .../__pycache__/__init__.cpython-312.pyc | Bin 286 -> 0 bytes .../__pycache__/candidate.cpython-312.pyc | Bin 1925 -> 0 bytes .../__pycache__/direct_url.cpython-312.pyc | Bin 11219 -> 0 bytes .../format_control.cpython-312.pyc | Bin 4247 -> 0 bytes .../models/__pycache__/index.cpython-312.pyc | Bin 1714 -> 0 bytes .../installation_report.cpython-312.pyc | Bin 2292 -> 0 bytes .../models/__pycache__/link.cpython-312.pyc | Bin 26022 -> 0 bytes .../models/__pycache__/scheme.cpython-312.pyc | Bin 1189 -> 0 bytes .../__pycache__/search_scope.cpython-312.pyc | Bin 5108 -> 0 bytes .../selection_prefs.cpython-312.pyc | Bin 1871 -> 0 bytes .../__pycache__/target_python.cpython-312.pyc | Bin 4974 -> 0 bytes .../models/__pycache__/wheel.cpython-312.pyc | Bin 5800 -> 0 bytes .../pip/_internal/models/candidate.py | 30 - .../pip/_internal/models/direct_url.py | 235 - .../pip/_internal/models/format_control.py | 78 - .../pip/_internal/models/index.py | 28 - .../_internal/models/installation_report.py | 56 - .../pip/_internal/models/link.py | 579 - .../pip/_internal/models/scheme.py | 31 - .../pip/_internal/models/search_scope.py | 132 - .../pip/_internal/models/selection_prefs.py | 51 - .../pip/_internal/models/target_python.py | 122 - .../pip/_internal/models/wheel.py | 92 - .../pip/_internal/network/__init__.py | 2 - .../__pycache__/__init__.cpython-312.pyc | Bin 274 -> 0 bytes .../network/__pycache__/auth.cpython-312.pyc | Bin 22016 -> 0 bytes .../network/__pycache__/cache.cpython-312.pyc | Bin 6538 -> 0 bytes .../__pycache__/download.cpython-312.pyc | Bin 8573 -> 0 bytes .../__pycache__/lazy_wheel.cpython-312.pyc | Bin 11683 -> 0 bytes .../__pycache__/session.cpython-312.pyc | Bin 18794 -> 0 bytes .../network/__pycache__/utils.cpython-312.pyc | Bin 2273 -> 0 bytes .../__pycache__/xmlrpc.cpython-312.pyc | Bin 2969 -> 0 bytes .../pip/_internal/network/auth.py | 561 - .../pip/_internal/network/cache.py | 106 - .../pip/_internal/network/download.py | 186 - .../pip/_internal/network/lazy_wheel.py | 210 - .../pip/_internal/network/session.py | 520 - .../pip/_internal/network/utils.py | 96 - .../pip/_internal/network/xmlrpc.py | 62 - .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 217 -> 0 bytes .../__pycache__/check.cpython-312.pyc | Bin 7599 -> 0 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 10137 -> 0 bytes .../__pycache__/prepare.cpython-312.pyc | Bin 25767 -> 0 bytes .../_internal/operations/build/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 223 -> 0 bytes .../__pycache__/build_tracker.cpython-312.pyc | Bin 7843 -> 0 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 1900 -> 0 bytes .../metadata_editable.cpython-312.pyc | Bin 1934 -> 0 bytes .../metadata_legacy.cpython-312.pyc | Bin 3085 -> 0 bytes .../build/__pycache__/wheel.cpython-312.pyc | Bin 1704 -> 0 bytes .../wheel_editable.cpython-312.pyc | Bin 2045 -> 0 bytes .../__pycache__/wheel_legacy.cpython-312.pyc | Bin 3949 -> 0 bytes .../operations/build/build_tracker.py | 139 - .../_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 | 187 - .../pip/_internal/operations/freeze.py | 255 - .../_internal/operations/install/__init__.py | 2 - .../__pycache__/__init__.cpython-312.pyc | Bin 286 -> 0 bytes .../editable_legacy.cpython-312.pyc | Bin 1837 -> 0 bytes .../install/__pycache__/wheel.cpython-312.pyc | Bin 33879 -> 0 bytes .../operations/install/editable_legacy.py | 46 - .../pip/_internal/operations/install/wheel.py | 734 - .../pip/_internal/operations/prepare.py | 730 - .../site-packages/pip/_internal/pyproject.py | 179 - .../pip/_internal/req/__init__.py | 92 - .../req/__pycache__/__init__.cpython-312.pyc | Bin 3763 -> 0 bytes .../__pycache__/constructors.cpython-312.pyc | Bin 21602 -> 0 bytes .../req/__pycache__/req_file.cpython-312.pyc | Bin 21481 -> 0 bytes .../__pycache__/req_install.cpython-312.pyc | Bin 38434 -> 0 bytes .../req/__pycache__/req_set.cpython-312.pyc | Bin 7238 -> 0 bytes .../__pycache__/req_uninstall.cpython-312.pyc | Bin 32997 -> 0 bytes .../pip/_internal/req/constructors.py | 576 - .../pip/_internal/req/req_file.py | 554 - .../pip/_internal/req/req_install.py | 923 -- .../pip/_internal/req/req_set.py | 119 - .../pip/_internal/req/req_uninstall.py | 649 - .../pip/_internal/resolution/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 217 -> 0 bytes .../__pycache__/base.cpython-312.pyc | Bin 1205 -> 0 bytes .../pip/_internal/resolution/base.py | 20 - .../_internal/resolution/legacy/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 224 -> 0 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 22459 -> 0 bytes .../_internal/resolution/legacy/resolver.py | 598 - .../resolution/resolvelib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 228 -> 0 bytes .../__pycache__/base.cpython-312.pyc | Bin 8357 -> 0 bytes .../__pycache__/candidates.cpython-312.pyc | Bin 30418 -> 0 bytes .../__pycache__/factory.cpython-312.pyc | Bin 32134 -> 0 bytes .../found_candidates.cpython-312.pyc | Bin 6228 -> 0 bytes .../__pycache__/provider.cpython-312.pyc | Bin 10398 -> 0 bytes .../__pycache__/reporter.cpython-312.pyc | Bin 4955 -> 0 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 11449 -> 0 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 12371 -> 0 bytes .../_internal/resolution/resolvelib/base.py | 141 - .../resolution/resolvelib/candidates.py | 597 - .../resolution/resolvelib/factory.py | 812 -- .../resolution/resolvelib/found_candidates.py | 155 - .../resolution/resolvelib/provider.py | 255 - .../resolution/resolvelib/reporter.py | 80 - .../resolution/resolvelib/requirements.py | 166 - .../resolution/resolvelib/resolver.py | 317 - .../pip/_internal/self_outdated_check.py | 248 - .../pip/_internal/utils/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 212 -> 0 bytes .../__pycache__/_jaraco_text.cpython-312.pyc | Bin 4553 -> 0 bytes .../utils/__pycache__/_log.cpython-312.pyc | Bin 1883 -> 0 bytes .../utils/__pycache__/appdirs.cpython-312.pyc | Bin 2427 -> 0 bytes .../utils/__pycache__/compat.cpython-312.pyc | Bin 2230 -> 0 bytes .../compatibility_tags.cpython-312.pyc | Bin 5578 -> 0 bytes .../__pycache__/datetime.cpython-312.pyc | Bin 701 -> 0 bytes .../__pycache__/deprecation.cpython-312.pyc | Bin 4203 -> 0 bytes .../direct_url_helpers.cpython-312.pyc | Bin 3580 -> 0 bytes .../__pycache__/egg_link.cpython-312.pyc | Bin 3243 -> 0 bytes .../__pycache__/encoding.cpython-312.pyc | Bin 2175 -> 0 bytes .../__pycache__/entrypoints.cpython-312.pyc | Bin 4010 -> 0 bytes .../__pycache__/filesystem.cpython-312.pyc | Bin 7475 -> 0 bytes .../__pycache__/filetypes.cpython-312.pyc | Bin 1181 -> 0 bytes .../utils/__pycache__/glibc.cpython-312.pyc | Bin 2359 -> 0 bytes .../utils/__pycache__/hashes.cpython-312.pyc | Bin 7571 -> 0 bytes .../utils/__pycache__/logging.cpython-312.pyc | Bin 13574 -> 0 bytes .../utils/__pycache__/misc.cpython-312.pyc | Bin 34138 -> 0 bytes .../utils/__pycache__/models.cpython-312.pyc | Bin 2729 -> 0 bytes .../__pycache__/packaging.cpython-312.pyc | Bin 2600 -> 0 bytes .../setuptools_build.cpython-312.pyc | Bin 4567 -> 0 bytes .../__pycache__/subprocess.cpython-312.pyc | Bin 8735 -> 0 bytes .../__pycache__/temp_dir.cpython-312.pyc | Bin 12079 -> 0 bytes .../__pycache__/unpacking.cpython-312.pyc | Bin 11125 -> 0 bytes .../utils/__pycache__/urls.cpython-312.pyc | Bin 2422 -> 0 bytes .../__pycache__/virtualenv.cpython-312.pyc | Bin 4497 -> 0 bytes .../utils/__pycache__/wheel.cpython-312.pyc | Bin 5943 -> 0 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 | 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/egg_link.py | 80 - .../pip/_internal/utils/encoding.py | 36 - .../pip/_internal/utils/entrypoints.py | 84 - .../pip/_internal/utils/filesystem.py | 153 - .../pip/_internal/utils/filetypes.py | 27 - .../pip/_internal/utils/glibc.py | 88 - .../pip/_internal/utils/hashes.py | 151 - .../pip/_internal/utils/logging.py | 348 - .../site-packages/pip/_internal/utils/misc.py | 783 -- .../pip/_internal/utils/models.py | 39 - .../pip/_internal/utils/packaging.py | 57 - .../pip/_internal/utils/setuptools_build.py | 146 - .../pip/_internal/utils/subprocess.py | 260 - .../pip/_internal/utils/temp_dir.py | 296 - .../pip/_internal/utils/unpacking.py | 257 - .../site-packages/pip/_internal/utils/urls.py | 62 - .../pip/_internal/utils/virtualenv.py | 104 - .../pip/_internal/utils/wheel.py | 134 - .../pip/_internal/vcs/__init__.py | 15 - .../vcs/__pycache__/__init__.cpython-312.pyc | Bin 551 -> 0 bytes .../vcs/__pycache__/bazaar.cpython-312.pyc | Bin 5043 -> 0 bytes .../vcs/__pycache__/git.cpython-312.pyc | Bin 19012 -> 0 bytes .../vcs/__pycache__/mercurial.cpython-312.pyc | Bin 7632 -> 0 bytes .../__pycache__/subversion.cpython-312.pyc | Bin 12504 -> 0 bytes .../versioncontrol.cpython-312.pyc | Bin 29030 -> 0 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 112 - .../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 | 354 - .../site-packages/pip/_vendor/__init__.py | 121 - .../__pycache__/__init__.cpython-312.pyc | Bin 4713 -> 0 bytes .../_vendor/__pycache__/six.cpython-312.pyc | Bin 41290 -> 0 bytes .../typing_extensions.cpython-312.pyc | Bin 122070 -> 0 bytes .../pip/_vendor/cachecontrol/__init__.py | 28 - .../__pycache__/__init__.cpython-312.pyc | Bin 923 -> 0 bytes .../__pycache__/_cmd.cpython-312.pyc | Bin 2667 -> 0 bytes .../__pycache__/adapter.cpython-312.pyc | Bin 6485 -> 0 bytes .../__pycache__/cache.cpython-312.pyc | Bin 3830 -> 0 bytes .../__pycache__/controller.cpython-312.pyc | Bin 16188 -> 0 bytes .../__pycache__/filewrapper.cpython-312.pyc | Bin 4368 -> 0 bytes .../__pycache__/heuristics.cpython-312.pyc | Bin 6715 -> 0 bytes .../__pycache__/serialize.cpython-312.pyc | Bin 6426 -> 0 bytes .../__pycache__/wrapper.cpython-312.pyc | Bin 1695 -> 0 bytes .../pip/_vendor/cachecontrol/_cmd.py | 70 - .../pip/_vendor/cachecontrol/adapter.py | 161 - .../pip/_vendor/cachecontrol/cache.py | 74 - .../_vendor/cachecontrol/caches/__init__.py | 8 - .../__pycache__/__init__.cpython-312.pyc | Bin 456 -> 0 bytes .../__pycache__/file_cache.cpython-312.pyc | Bin 7731 -> 0 bytes .../__pycache__/redis_cache.cpython-312.pyc | Bin 2759 -> 0 bytes .../_vendor/cachecontrol/caches/file_cache.py | 181 - .../cachecontrol/caches/redis_cache.py | 48 - .../pip/_vendor/cachecontrol/controller.py | 494 - .../pip/_vendor/cachecontrol/filewrapper.py | 119 - .../pip/_vendor/cachecontrol/heuristics.py | 154 - .../pip/_vendor/cachecontrol/serialize.py | 206 - .../pip/_vendor/cachecontrol/wrapper.py | 43 - .../pip/_vendor/certifi/__init__.py | 4 - .../pip/_vendor/certifi/__main__.py | 12 - .../__pycache__/__init__.cpython-312.pyc | Bin 339 -> 0 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 666 -> 0 bytes .../certifi/__pycache__/core.cpython-312.pyc | Bin 3348 -> 0 bytes .../pip/_vendor/certifi/cacert.pem | 4635 ------- .../site-packages/pip/_vendor/certifi/core.py | 119 - .../pip/_vendor/chardet/__init__.py | 115 - .../__pycache__/__init__.cpython-312.pyc | Bin 4589 -> 0 bytes .../__pycache__/big5freq.cpython-312.pyc | Bin 27220 -> 0 bytes .../__pycache__/big5prober.cpython-312.pyc | Bin 1408 -> 0 bytes .../chardistribution.cpython-312.pyc | Bin 9659 -> 0 bytes .../charsetgroupprober.cpython-312.pyc | Bin 4143 -> 0 bytes .../__pycache__/charsetprober.cpython-312.pyc | Bin 5039 -> 0 bytes .../codingstatemachine.cpython-312.pyc | Bin 3899 -> 0 bytes .../codingstatemachinedict.cpython-312.pyc | Bin 810 -> 0 bytes .../__pycache__/cp949prober.cpython-312.pyc | Bin 1417 -> 0 bytes .../chardet/__pycache__/enums.cpython-312.pyc | Bin 3017 -> 0 bytes .../__pycache__/escprober.cpython-312.pyc | Bin 4587 -> 0 bytes .../chardet/__pycache__/escsm.cpython-312.pyc | Bin 15331 -> 0 bytes .../__pycache__/eucjpprober.cpython-312.pyc | Bin 4404 -> 0 bytes .../__pycache__/euckrfreq.cpython-312.pyc | Bin 12103 -> 0 bytes .../__pycache__/euckrprober.cpython-312.pyc | Bin 1411 -> 0 bytes .../__pycache__/euctwfreq.cpython-312.pyc | Bin 27225 -> 0 bytes .../__pycache__/euctwprober.cpython-312.pyc | Bin 1411 -> 0 bytes .../__pycache__/gb2312freq.cpython-312.pyc | Bin 19147 -> 0 bytes .../__pycache__/gb2312prober.cpython-312.pyc | Bin 1424 -> 0 bytes .../__pycache__/hebrewprober.cpython-312.pyc | Bin 5843 -> 0 bytes .../__pycache__/jisfreq.cpython-312.pyc | Bin 22176 -> 0 bytes .../__pycache__/johabfreq.cpython-312.pyc | Bin 83024 -> 0 bytes .../__pycache__/johabprober.cpython-312.pyc | Bin 1415 -> 0 bytes .../__pycache__/jpcntx.cpython-312.pyc | Bin 39570 -> 0 bytes .../langbulgarianmodel.cpython-312.pyc | Bin 83143 -> 0 bytes .../langgreekmodel.cpython-312.pyc | Bin 77009 -> 0 bytes .../langhebrewmodel.cpython-312.pyc | Bin 77520 -> 0 bytes .../langhungarianmodel.cpython-312.pyc | Bin 83097 -> 0 bytes .../langrussianmodel.cpython-312.pyc | Bin 105272 -> 0 bytes .../__pycache__/langthaimodel.cpython-312.pyc | Bin 77698 -> 0 bytes .../langturkishmodel.cpython-312.pyc | Bin 77537 -> 0 bytes .../__pycache__/latin1prober.cpython-312.pyc | Bin 7023 -> 0 bytes .../macromanprober.cpython-312.pyc | Bin 7203 -> 0 bytes .../mbcharsetprober.cpython-312.pyc | Bin 3924 -> 0 bytes .../mbcsgroupprober.cpython-312.pyc | Bin 1609 -> 0 bytes .../__pycache__/mbcssm.cpython-312.pyc | Bin 38666 -> 0 bytes .../__pycache__/resultdict.cpython-312.pyc | Bin 653 -> 0 bytes .../sbcharsetprober.cpython-312.pyc | Bin 6408 -> 0 bytes .../sbcsgroupprober.cpython-312.pyc | Bin 2378 -> 0 bytes .../__pycache__/sjisprober.cpython-312.pyc | Bin 4516 -> 0 bytes .../universaldetector.cpython-312.pyc | Bin 12290 -> 0 bytes .../__pycache__/utf1632prober.cpython-312.pyc | Bin 10000 -> 0 bytes .../__pycache__/utf8prober.cpython-312.pyc | Bin 3196 -> 0 bytes .../__pycache__/version.cpython-312.pyc | Bin 509 -> 0 bytes .../pip/_vendor/chardet/big5freq.py | 386 - .../pip/_vendor/chardet/big5prober.py | 47 - .../pip/_vendor/chardet/chardistribution.py | 261 - .../pip/_vendor/chardet/charsetgroupprober.py | 106 - .../pip/_vendor/chardet/charsetprober.py | 147 - .../pip/_vendor/chardet/cli/__init__.py | 0 .../cli/__pycache__/__init__.cpython-312.pyc | Bin 216 -> 0 bytes .../__pycache__/chardetect.cpython-312.pyc | Bin 4033 -> 0 bytes .../pip/_vendor/chardet/cli/chardetect.py | 112 - .../pip/_vendor/chardet/codingstatemachine.py | 90 - .../_vendor/chardet/codingstatemachinedict.py | 19 - .../pip/_vendor/chardet/cp949prober.py | 49 - .../pip/_vendor/chardet/enums.py | 85 - .../pip/_vendor/chardet/escprober.py | 102 - .../pip/_vendor/chardet/escsm.py | 261 - .../pip/_vendor/chardet/eucjpprober.py | 102 - .../pip/_vendor/chardet/euckrfreq.py | 196 - .../pip/_vendor/chardet/euckrprober.py | 47 - .../pip/_vendor/chardet/euctwfreq.py | 388 - .../pip/_vendor/chardet/euctwprober.py | 47 - .../pip/_vendor/chardet/gb2312freq.py | 284 - .../pip/_vendor/chardet/gb2312prober.py | 47 - .../pip/_vendor/chardet/hebrewprober.py | 316 - .../pip/_vendor/chardet/jisfreq.py | 325 - .../pip/_vendor/chardet/johabfreq.py | 2382 ---- .../pip/_vendor/chardet/johabprober.py | 47 - .../pip/_vendor/chardet/jpcntx.py | 238 - .../pip/_vendor/chardet/langbulgarianmodel.py | 4649 ------- .../pip/_vendor/chardet/langgreekmodel.py | 4397 ------ .../pip/_vendor/chardet/langhebrewmodel.py | 4380 ------ .../pip/_vendor/chardet/langhungarianmodel.py | 4649 ------- .../pip/_vendor/chardet/langrussianmodel.py | 5725 -------- .../pip/_vendor/chardet/langthaimodel.py | 4380 ------ .../pip/_vendor/chardet/langturkishmodel.py | 4380 ------ .../pip/_vendor/chardet/latin1prober.py | 147 - .../pip/_vendor/chardet/macromanprober.py | 162 - .../pip/_vendor/chardet/mbcharsetprober.py | 95 - .../pip/_vendor/chardet/mbcsgroupprober.py | 57 - .../pip/_vendor/chardet/mbcssm.py | 661 - .../pip/_vendor/chardet/metadata/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 221 -> 0 bytes .../__pycache__/languages.cpython-312.pyc | Bin 9776 -> 0 bytes .../pip/_vendor/chardet/metadata/languages.py | 352 - .../pip/_vendor/chardet/resultdict.py | 16 - .../pip/_vendor/chardet/sbcharsetprober.py | 162 - .../pip/_vendor/chardet/sbcsgroupprober.py | 88 - .../pip/_vendor/chardet/sjisprober.py | 105 - .../pip/_vendor/chardet/universaldetector.py | 362 - .../pip/_vendor/chardet/utf1632prober.py | 225 - .../pip/_vendor/chardet/utf8prober.py | 82 - .../pip/_vendor/chardet/version.py | 9 - .../pip/_vendor/colorama/__init__.py | 7 - .../__pycache__/__init__.cpython-312.pyc | Bin 513 -> 0 bytes .../colorama/__pycache__/ansi.cpython-312.pyc | Bin 3971 -> 0 bytes .../__pycache__/ansitowin32.cpython-312.pyc | Bin 16442 -> 0 bytes .../__pycache__/initialise.cpython-312.pyc | Bin 3571 -> 0 bytes .../__pycache__/win32.cpython-312.pyc | Bin 8147 -> 0 bytes .../__pycache__/winterm.cpython-312.pyc | Bin 9109 -> 0 bytes .../pip/_vendor/colorama/ansi.py | 102 - .../pip/_vendor/colorama/ansitowin32.py | 277 - .../pip/_vendor/colorama/initialise.py | 121 - .../pip/_vendor/colorama/tests/__init__.py | 1 - .../__pycache__/__init__.cpython-312.pyc | Bin 219 -> 0 bytes .../__pycache__/ansi_test.cpython-312.pyc | Bin 5488 -> 0 bytes .../ansitowin32_test.cpython-312.pyc | Bin 18124 -> 0 bytes .../initialise_test.cpython-312.pyc | Bin 11769 -> 0 bytes .../__pycache__/isatty_test.cpython-312.pyc | Bin 4925 -> 0 bytes .../tests/__pycache__/utils.cpython-312.pyc | Bin 2509 -> 0 bytes .../__pycache__/winterm_test.cpython-312.pyc | Bin 6633 -> 0 bytes .../pip/_vendor/colorama/tests/ansi_test.py | 76 - .../colorama/tests/ansitowin32_test.py | 294 - .../_vendor/colorama/tests/initialise_test.py | 189 - .../pip/_vendor/colorama/tests/isatty_test.py | 57 - .../pip/_vendor/colorama/tests/utils.py | 49 - .../_vendor/colorama/tests/winterm_test.py | 131 - .../pip/_vendor/colorama/win32.py | 180 - .../pip/_vendor/colorama/winterm.py | 195 - .../pip/_vendor/distlib/__init__.py | 33 - .../__pycache__/__init__.cpython-312.pyc | Bin 1290 -> 0 bytes .../__pycache__/compat.cpython-312.pyc | Bin 45626 -> 0 bytes .../__pycache__/database.cpython-312.pyc | Bin 66048 -> 0 bytes .../distlib/__pycache__/index.cpython-312.pyc | Bin 24387 -> 0 bytes .../__pycache__/locators.cpython-312.pyc | Bin 60179 -> 0 bytes .../__pycache__/manifest.cpython-312.pyc | Bin 15146 -> 0 bytes .../__pycache__/markers.cpython-312.pyc | Bin 7703 -> 0 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 41820 -> 0 bytes .../__pycache__/resources.cpython-312.pyc | Bin 17346 -> 0 bytes .../__pycache__/scripts.cpython-312.pyc | Bin 19601 -> 0 bytes .../distlib/__pycache__/util.cpython-312.pyc | Bin 88277 -> 0 bytes .../__pycache__/version.cpython-312.pyc | Bin 30387 -> 0 bytes .../distlib/__pycache__/wheel.cpython-312.pyc | Bin 51882 -> 0 bytes .../pip/_vendor/distlib/compat.py | 1138 -- .../pip/_vendor/distlib/database.py | 1359 -- .../pip/_vendor/distlib/index.py | 508 - .../pip/_vendor/distlib/locators.py | 1303 -- .../pip/_vendor/distlib/manifest.py | 384 - .../pip/_vendor/distlib/markers.py | 167 - .../pip/_vendor/distlib/metadata.py | 1068 -- .../pip/_vendor/distlib/resources.py | 358 - .../pip/_vendor/distlib/scripts.py | 452 - .../site-packages/pip/_vendor/distlib/util.py | 2025 --- .../pip/_vendor/distlib/version.py | 751 - .../pip/_vendor/distlib/wheel.py | 1099 -- .../pip/_vendor/distro/__init__.py | 54 - .../pip/_vendor/distro/__main__.py | 4 - .../__pycache__/__init__.cpython-312.pyc | Bin 981 -> 0 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 313 -> 0 bytes .../distro/__pycache__/distro.cpython-312.pyc | Bin 53775 -> 0 bytes .../pip/_vendor/distro/distro.py | 1399 -- .../pip/_vendor/idna/__init__.py | 44 - .../idna/__pycache__/__init__.cpython-312.pyc | Bin 902 -> 0 bytes .../idna/__pycache__/codec.cpython-312.pyc | Bin 4654 -> 0 bytes .../idna/__pycache__/compat.cpython-312.pyc | Bin 908 -> 0 bytes .../idna/__pycache__/core.cpython-312.pyc | Bin 16303 -> 0 bytes .../idna/__pycache__/idnadata.cpython-312.pyc | Bin 38403 -> 0 bytes .../__pycache__/intranges.cpython-312.pyc | Bin 2659 -> 0 bytes .../__pycache__/package_data.cpython-312.pyc | Bin 237 -> 0 bytes .../__pycache__/uts46data.cpython-312.pyc | Bin 158891 -> 0 bytes .../site-packages/pip/_vendor/idna/codec.py | 112 - .../site-packages/pip/_vendor/idna/compat.py | 13 - .../site-packages/pip/_vendor/idna/core.py | 400 - .../pip/_vendor/idna/idnadata.py | 2151 --- .../pip/_vendor/idna/intranges.py | 54 - .../pip/_vendor/idna/package_data.py | 2 - .../pip/_vendor/idna/uts46data.py | 8600 ------------ .../pip/_vendor/msgpack/__init__.py | 57 - .../__pycache__/__init__.cpython-312.pyc | Bin 1852 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 2046 -> 0 bytes .../msgpack/__pycache__/ext.cpython-312.pyc | Bin 8689 -> 0 bytes .../__pycache__/fallback.cpython-312.pyc | Bin 43597 -> 0 bytes .../pip/_vendor/msgpack/exceptions.py | 48 - .../site-packages/pip/_vendor/msgpack/ext.py | 193 - .../pip/_vendor/msgpack/fallback.py | 1010 -- .../pip/_vendor/packaging/__about__.py | 26 - .../pip/_vendor/packaging/__init__.py | 25 - .../__pycache__/__about__.cpython-312.pyc | Bin 651 -> 0 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 487 -> 0 bytes .../__pycache__/_manylinux.cpython-312.pyc | Bin 12097 -> 0 bytes .../__pycache__/_musllinux.cpython-312.pyc | Bin 6931 -> 0 bytes .../__pycache__/_structures.cpython-312.pyc | Bin 3262 -> 0 bytes .../__pycache__/markers.cpython-312.pyc | Bin 14079 -> 0 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 6967 -> 0 bytes .../__pycache__/specifiers.cpython-312.pyc | Bin 31268 -> 0 bytes .../__pycache__/tags.cpython-312.pyc | Bin 18977 -> 0 bytes .../__pycache__/utils.cpython-312.pyc | Bin 5889 -> 0 bytes .../__pycache__/version.cpython-312.pyc | Bin 19960 -> 0 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/pkg_resources/__init__.py | 3361 ----- .../__pycache__/__init__.cpython-312.pyc | Bin 146495 -> 0 bytes .../pip/_vendor/platformdirs/__init__.py | 566 - .../pip/_vendor/platformdirs/__main__.py | 53 - .../__pycache__/__init__.cpython-312.pyc | Bin 18050 -> 0 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 1967 -> 0 bytes .../__pycache__/android.cpython-312.pyc | Bin 9465 -> 0 bytes .../__pycache__/api.cpython-312.pyc | Bin 9693 -> 0 bytes .../__pycache__/macos.cpython-312.pyc | Bin 5658 -> 0 bytes .../__pycache__/unix.cpython-312.pyc | Bin 12462 -> 0 bytes .../__pycache__/version.cpython-312.pyc | Bin 332 -> 0 bytes .../__pycache__/windows.cpython-312.pyc | Bin 13020 -> 0 bytes .../pip/_vendor/platformdirs/android.py | 210 - .../pip/_vendor/platformdirs/api.py | 223 - .../pip/_vendor/platformdirs/macos.py | 91 - .../pip/_vendor/platformdirs/unix.py | 223 - .../pip/_vendor/platformdirs/version.py | 4 - .../pip/_vendor/platformdirs/windows.py | 255 - .../pip/_vendor/pygments/__init__.py | 82 - .../pip/_vendor/pygments/__main__.py | 17 - .../__pycache__/__init__.cpython-312.pyc | Bin 3510 -> 0 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 756 -> 0 bytes .../__pycache__/cmdline.cpython-312.pyc | Bin 26627 -> 0 bytes .../__pycache__/console.cpython-312.pyc | Bin 2648 -> 0 bytes .../__pycache__/filter.cpython-312.pyc | Bin 3254 -> 0 bytes .../__pycache__/formatter.cpython-312.pyc | Bin 4591 -> 0 bytes .../__pycache__/lexer.cpython-312.pyc | Bin 38351 -> 0 bytes .../__pycache__/modeline.cpython-312.pyc | Bin 1590 -> 0 bytes .../__pycache__/plugin.cpython-312.pyc | Bin 3418 -> 0 bytes .../__pycache__/regexopt.cpython-312.pyc | Bin 4103 -> 0 bytes .../__pycache__/scanner.cpython-312.pyc | Bin 4778 -> 0 bytes .../__pycache__/sphinxext.cpython-312.pyc | Bin 11068 -> 0 bytes .../__pycache__/style.cpython-312.pyc | Bin 6696 -> 0 bytes .../__pycache__/token.cpython-312.pyc | Bin 8164 -> 0 bytes .../__pycache__/unistring.cpython-312.pyc | Bin 33010 -> 0 bytes .../pygments/__pycache__/util.cpython-312.pyc | Bin 14003 -> 0 bytes .../pip/_vendor/pygments/cmdline.py | 668 - .../pip/_vendor/pygments/console.py | 70 - .../pip/_vendor/pygments/filter.py | 71 - .../pip/_vendor/pygments/filters/__init__.py | 940 -- .../__pycache__/__init__.cpython-312.pyc | Bin 37958 -> 0 bytes .../pip/_vendor/pygments/formatter.py | 124 - .../_vendor/pygments/formatters/__init__.py | 158 - .../__pycache__/__init__.cpython-312.pyc | Bin 6948 -> 0 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 4237 -> 0 bytes .../__pycache__/bbcode.cpython-312.pyc | Bin 4216 -> 0 bytes .../__pycache__/groff.cpython-312.pyc | Bin 7286 -> 0 bytes .../__pycache__/html.cpython-312.pyc | Bin 40594 -> 0 bytes .../__pycache__/img.cpython-312.pyc | Bin 27065 -> 0 bytes .../__pycache__/irc.cpython-312.pyc | Bin 6087 -> 0 bytes .../__pycache__/latex.cpython-312.pyc | Bin 19976 -> 0 bytes .../__pycache__/other.cpython-312.pyc | Bin 6906 -> 0 bytes .../__pycache__/pangomarkup.cpython-312.pyc | Bin 2952 -> 0 bytes .../__pycache__/rtf.cpython-312.pyc | Bin 6148 -> 0 bytes .../__pycache__/svg.cpython-312.pyc | Bin 9088 -> 0 bytes .../__pycache__/terminal.cpython-312.pyc | Bin 5851 -> 0 bytes .../__pycache__/terminal256.cpython-312.pyc | Bin 15179 -> 0 bytes .../_vendor/pygments/formatters/_mapping.py | 23 - .../pip/_vendor/pygments/formatters/bbcode.py | 108 - .../pip/_vendor/pygments/formatters/groff.py | 170 - .../pip/_vendor/pygments/formatters/html.py | 989 -- .../pip/_vendor/pygments/formatters/img.py | 645 - .../pip/_vendor/pygments/formatters/irc.py | 154 - .../pip/_vendor/pygments/formatters/latex.py | 521 - .../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 | 943 -- .../pip/_vendor/pygments/lexers/__init__.py | 362 - .../__pycache__/__init__.cpython-312.pyc | Bin 14674 -> 0 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 64426 -> 0 bytes .../lexers/__pycache__/python.cpython-312.pyc | Bin 42661 -> 0 bytes .../pip/_vendor/pygments/lexers/_mapping.py | 559 - .../pip/_vendor/pygments/lexers/python.py | 1198 -- .../pip/_vendor/pygments/modeline.py | 43 - .../pip/_vendor/pygments/plugin.py | 88 - .../pip/_vendor/pygments/regexopt.py | 91 - .../pip/_vendor/pygments/scanner.py | 104 - .../pip/_vendor/pygments/sphinxext.py | 217 - .../pip/_vendor/pygments/style.py | 197 - .../pip/_vendor/pygments/styles/__init__.py | 103 - .../__pycache__/__init__.cpython-312.pyc | Bin 4470 -> 0 bytes .../pip/_vendor/pygments/token.py | 213 - .../pip/_vendor/pygments/unistring.py | 153 - .../pip/_vendor/pygments/util.py | 330 - .../pip/_vendor/pyparsing/__init__.py | 322 - .../__pycache__/__init__.cpython-312.pyc | Bin 7933 -> 0 bytes .../__pycache__/actions.cpython-312.pyc | Bin 8417 -> 0 bytes .../__pycache__/common.cpython-312.pyc | Bin 13436 -> 0 bytes .../__pycache__/core.cpython-312.pyc | Bin 267730 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 13016 -> 0 bytes .../__pycache__/helpers.cpython-312.pyc | Bin 48523 -> 0 bytes .../__pycache__/results.cpython-312.pyc | Bin 34132 -> 0 bytes .../__pycache__/testing.cpython-312.pyc | Bin 17210 -> 0 bytes .../__pycache__/unicode.cpython-312.pyc | Bin 13206 -> 0 bytes .../__pycache__/util.cpython-312.pyc | Bin 14926 -> 0 bytes .../pip/_vendor/pyparsing/actions.py | 217 - .../pip/_vendor/pyparsing/common.py | 432 - .../pip/_vendor/pyparsing/core.py | 6115 --------- .../pip/_vendor/pyparsing/diagram/__init__.py | 656 - .../__pycache__/__init__.cpython-312.pyc | Bin 26835 -> 0 bytes .../pip/_vendor/pyparsing/exceptions.py | 299 - .../pip/_vendor/pyparsing/helpers.py | 1100 -- .../pip/_vendor/pyparsing/results.py | 796 -- .../pip/_vendor/pyparsing/testing.py | 331 - .../pip/_vendor/pyparsing/unicode.py | 361 - .../pip/_vendor/pyparsing/util.py | 284 - .../pip/_vendor/pyproject_hooks/__init__.py | 23 - .../__pycache__/__init__.cpython-312.pyc | Bin 635 -> 0 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 396 -> 0 bytes .../__pycache__/_impl.cpython-312.pyc | Bin 14747 -> 0 bytes .../pip/_vendor/pyproject_hooks/_compat.py | 8 - .../pip/_vendor/pyproject_hooks/_impl.py | 330 - .../pyproject_hooks/_in_process/__init__.py | 18 - .../__pycache__/__init__.cpython-312.pyc | Bin 1102 -> 0 bytes .../__pycache__/_in_process.cpython-312.pyc | Bin 14419 -> 0 bytes .../_in_process/_in_process.py | 353 - .../pip/_vendor/requests/__init__.py | 182 - .../__pycache__/__init__.cpython-312.pyc | Bin 5475 -> 0 bytes .../__pycache__/__version__.cpython-312.pyc | Bin 606 -> 0 bytes .../_internal_utils.cpython-312.pyc | Bin 2046 -> 0 bytes .../__pycache__/adapters.cpython-312.pyc | Bin 21302 -> 0 bytes .../requests/__pycache__/api.cpython-312.pyc | Bin 7226 -> 0 bytes .../requests/__pycache__/auth.cpython-312.pyc | Bin 13945 -> 0 bytes .../__pycache__/certs.cpython-312.pyc | Bin 944 -> 0 bytes .../__pycache__/compat.cpython-312.pyc | Bin 1529 -> 0 bytes .../__pycache__/cookies.cpython-312.pyc | Bin 25268 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 7069 -> 0 bytes .../requests/__pycache__/help.cpython-312.pyc | Bin 4334 -> 0 bytes .../__pycache__/hooks.cpython-312.pyc | Bin 1074 -> 0 bytes .../__pycache__/models.cpython-312.pyc | Bin 35470 -> 0 bytes .../__pycache__/packages.cpython-312.pyc | Bin 794 -> 0 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 27779 -> 0 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 5981 -> 0 bytes .../__pycache__/structures.cpython-312.pyc | Bin 5639 -> 0 bytes .../__pycache__/utils.cpython-312.pyc | Bin 36291 -> 0 bytes .../pip/_vendor/requests/__version__.py | 14 - .../pip/_vendor/requests/_internal_utils.py | 50 - .../pip/_vendor/requests/adapters.py | 538 - .../site-packages/pip/_vendor/requests/api.py | 157 - .../pip/_vendor/requests/auth.py | 315 - .../pip/_vendor/requests/certs.py | 24 - .../pip/_vendor/requests/compat.py | 67 - .../pip/_vendor/requests/cookies.py | 561 - .../pip/_vendor/requests/exceptions.py | 141 - .../pip/_vendor/requests/help.py | 131 - .../pip/_vendor/requests/hooks.py | 33 - .../pip/_vendor/requests/models.py | 1034 -- .../pip/_vendor/requests/packages.py | 16 - .../pip/_vendor/requests/sessions.py | 833 -- .../pip/_vendor/requests/status_codes.py | 128 - .../pip/_vendor/requests/structures.py | 99 - .../pip/_vendor/requests/utils.py | 1094 -- .../pip/_vendor/resolvelib/__init__.py | 26 - .../__pycache__/__init__.cpython-312.pyc | Bin 656 -> 0 bytes .../__pycache__/providers.cpython-312.pyc | Bin 6873 -> 0 bytes .../__pycache__/reporters.cpython-312.pyc | Bin 2676 -> 0 bytes .../__pycache__/resolvers.cpython-312.pyc | Bin 25919 -> 0 bytes .../__pycache__/structs.cpython-312.pyc | Bin 10528 -> 0 bytes .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 222 -> 0 bytes .../collections_abc.cpython-312.pyc | Bin 442 -> 0 bytes .../resolvelib/compat/collections_abc.py | 6 - .../pip/_vendor/resolvelib/providers.py | 133 - .../pip/_vendor/resolvelib/reporters.py | 43 - .../pip/_vendor/resolvelib/resolvers.py | 547 - .../pip/_vendor/resolvelib/structs.py | 170 - .../pip/_vendor/rich/__init__.py | 177 - .../pip/_vendor/rich/__main__.py | 274 - .../rich/__pycache__/__init__.cpython-312.pyc | Bin 7037 -> 0 bytes .../rich/__pycache__/__main__.cpython-312.pyc | Bin 10326 -> 0 bytes .../__pycache__/_cell_widths.cpython-312.pyc | Bin 7843 -> 0 bytes .../__pycache__/_emoji_codes.cpython-312.pyc | Bin 205998 -> 0 bytes .../_emoji_replace.cpython-312.pyc | Bin 1751 -> 0 bytes .../_export_format.cpython-312.pyc | Bin 2343 -> 0 bytes .../__pycache__/_extension.cpython-312.pyc | Bin 559 -> 0 bytes .../rich/__pycache__/_fileno.cpython-312.pyc | Bin 877 -> 0 bytes .../rich/__pycache__/_inspect.cpython-312.pyc | Bin 12099 -> 0 bytes .../__pycache__/_log_render.cpython-312.pyc | Bin 4169 -> 0 bytes .../rich/__pycache__/_loop.cpython-312.pyc | Bin 1907 -> 0 bytes .../__pycache__/_null_file.cpython-312.pyc | Bin 3642 -> 0 bytes .../__pycache__/_palettes.cpython-312.pyc | Bin 5182 -> 0 bytes .../rich/__pycache__/_pick.cpython-312.pyc | Bin 748 -> 0 bytes .../rich/__pycache__/_ratio.cpython-312.pyc | Bin 6601 -> 0 bytes .../__pycache__/_spinners.cpython-312.pyc | Bin 13201 -> 0 bytes .../rich/__pycache__/_stack.cpython-312.pyc | Bin 987 -> 0 bytes .../rich/__pycache__/_timer.cpython-312.pyc | Bin 887 -> 0 bytes .../_win32_console.cpython-312.pyc | Bin 28998 -> 0 bytes .../rich/__pycache__/_windows.cpython-312.pyc | Bin 2512 -> 0 bytes .../_windows_renderer.cpython-312.pyc | Bin 3595 -> 0 bytes .../rich/__pycache__/_wrap.cpython-312.pyc | Bin 2382 -> 0 bytes .../rich/__pycache__/abc.cpython-312.pyc | Bin 1630 -> 0 bytes .../rich/__pycache__/align.cpython-312.pyc | Bin 12344 -> 0 bytes .../rich/__pycache__/ansi.cpython-312.pyc | Bin 9128 -> 0 bytes .../rich/__pycache__/bar.cpython-312.pyc | Bin 4294 -> 0 bytes .../rich/__pycache__/box.cpython-312.pyc | Bin 11880 -> 0 bytes .../rich/__pycache__/cells.cpython-312.pyc | Bin 5640 -> 0 bytes .../rich/__pycache__/color.cpython-312.pyc | Bin 26592 -> 0 bytes .../__pycache__/color_triplet.cpython-312.pyc | Bin 1723 -> 0 bytes .../rich/__pycache__/columns.cpython-312.pyc | Bin 8609 -> 0 bytes .../rich/__pycache__/console.cpython-312.pyc | Bin 113815 -> 0 bytes .../__pycache__/constrain.cpython-312.pyc | Bin 2280 -> 0 bytes .../__pycache__/containers.cpython-312.pyc | Bin 9248 -> 0 bytes .../rich/__pycache__/control.cpython-312.pyc | Bin 10951 -> 0 bytes .../default_styles.cpython-312.pyc | Bin 10395 -> 0 bytes .../rich/__pycache__/diagnose.cpython-312.pyc | Bin 1509 -> 0 bytes .../rich/__pycache__/emoji.cpython-312.pyc | Bin 4231 -> 0 bytes .../rich/__pycache__/errors.cpython-312.pyc | Bin 1867 -> 0 bytes .../__pycache__/file_proxy.cpython-312.pyc | Bin 3599 -> 0 bytes .../rich/__pycache__/filesize.cpython-312.pyc | Bin 3104 -> 0 bytes .../__pycache__/highlighter.cpython-312.pyc | Bin 9920 -> 0 bytes .../rich/__pycache__/json.cpython-312.pyc | Bin 6057 -> 0 bytes .../rich/__pycache__/jupyter.cpython-312.pyc | Bin 5231 -> 0 bytes .../rich/__pycache__/layout.cpython-312.pyc | Bin 20242 -> 0 bytes .../rich/__pycache__/live.cpython-312.pyc | Bin 19165 -> 0 bytes .../__pycache__/live_render.cpython-312.pyc | Bin 4916 -> 0 bytes .../rich/__pycache__/logging.cpython-312.pyc | Bin 13576 -> 0 bytes .../rich/__pycache__/markup.cpython-312.pyc | Bin 9320 -> 0 bytes .../rich/__pycache__/measure.cpython-312.pyc | Bin 6398 -> 0 bytes .../rich/__pycache__/padding.cpython-312.pyc | Bin 7156 -> 0 bytes .../rich/__pycache__/pager.cpython-312.pyc | Bin 1842 -> 0 bytes .../rich/__pycache__/palette.cpython-312.pyc | Bin 5336 -> 0 bytes .../rich/__pycache__/panel.cpython-312.pyc | Bin 12119 -> 0 bytes .../rich/__pycache__/pretty.cpython-312.pyc | Bin 40078 -> 0 bytes .../rich/__pycache__/progress.cpython-312.pyc | Bin 75100 -> 0 bytes .../__pycache__/progress_bar.cpython-312.pyc | Bin 10411 -> 0 bytes .../rich/__pycache__/prompt.cpython-312.pyc | Bin 14803 -> 0 bytes .../rich/__pycache__/protocol.cpython-312.pyc | Bin 1814 -> 0 bytes .../rich/__pycache__/region.cpython-312.pyc | Bin 589 -> 0 bytes .../rich/__pycache__/repr.cpython-312.pyc | Bin 6648 -> 0 bytes .../rich/__pycache__/rule.cpython-312.pyc | Bin 6590 -> 0 bytes .../rich/__pycache__/scope.cpython-312.pyc | Bin 3852 -> 0 bytes .../rich/__pycache__/screen.cpython-312.pyc | Bin 2506 -> 0 bytes .../rich/__pycache__/segment.cpython-312.pyc | Bin 28183 -> 0 bytes .../rich/__pycache__/spinner.cpython-312.pyc | Bin 6086 -> 0 bytes .../rich/__pycache__/status.cpython-312.pyc | Bin 6090 -> 0 bytes .../rich/__pycache__/style.cpython-312.pyc | Bin 33536 -> 0 bytes .../rich/__pycache__/styled.cpython-312.pyc | Bin 2161 -> 0 bytes .../rich/__pycache__/syntax.cpython-312.pyc | Bin 39634 -> 0 bytes .../rich/__pycache__/table.cpython-312.pyc | Bin 43606 -> 0 bytes .../terminal_theme.cpython-312.pyc | Bin 3370 -> 0 bytes .../rich/__pycache__/text.cpython-312.pyc | Bin 58985 -> 0 bytes .../rich/__pycache__/theme.cpython-312.pyc | Bin 6362 -> 0 bytes .../rich/__pycache__/themes.cpython-312.pyc | Bin 336 -> 0 bytes .../__pycache__/traceback.cpython-312.pyc | Bin 31570 -> 0 bytes .../rich/__pycache__/tree.cpython-312.pyc | Bin 11461 -> 0 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/_export_format.py | 76 - .../pip/_vendor/rich/_extension.py | 10 - .../site-packages/pip/_vendor/rich/_fileno.py | 24 - .../pip/_vendor/rich/_inspect.py | 270 - .../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 | 160 - .../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 | 662 - .../pip/_vendor/rich/_windows.py | 72 - .../pip/_vendor/rich/_windows_renderer.py | 56 - .../site-packages/pip/_vendor/rich/_wrap.py | 56 - .../site-packages/pip/_vendor/rich/abc.py | 33 - .../site-packages/pip/_vendor/rich/align.py | 311 - .../site-packages/pip/_vendor/rich/ansi.py | 240 - .../site-packages/pip/_vendor/rich/bar.py | 94 - .../site-packages/pip/_vendor/rich/box.py | 517 - .../site-packages/pip/_vendor/rich/cells.py | 154 - .../site-packages/pip/_vendor/rich/color.py | 622 - .../pip/_vendor/rich/color_triplet.py | 38 - .../site-packages/pip/_vendor/rich/columns.py | 187 - .../site-packages/pip/_vendor/rich/console.py | 2633 ---- .../pip/_vendor/rich/constrain.py | 37 - .../pip/_vendor/rich/containers.py | 167 - .../site-packages/pip/_vendor/rich/control.py | 225 - .../pip/_vendor/rich/default_styles.py | 190 - .../pip/_vendor/rich/diagnose.py | 37 - .../site-packages/pip/_vendor/rich/emoji.py | 96 - .../site-packages/pip/_vendor/rich/errors.py | 34 - .../pip/_vendor/rich/file_proxy.py | 57 - .../pip/_vendor/rich/filesize.py | 89 - .../pip/_vendor/rich/highlighter.py | 232 - .../site-packages/pip/_vendor/rich/json.py | 140 - .../site-packages/pip/_vendor/rich/jupyter.py | 101 - .../site-packages/pip/_vendor/rich/layout.py | 443 - .../site-packages/pip/_vendor/rich/live.py | 375 - .../pip/_vendor/rich/live_render.py | 113 - .../site-packages/pip/_vendor/rich/logging.py | 289 - .../site-packages/pip/_vendor/rich/markup.py | 246 - .../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 | 308 - .../site-packages/pip/_vendor/rich/pretty.py | 994 -- .../pip/_vendor/rich/progress.py | 1702 --- .../pip/_vendor/rich/progress_bar.py | 224 - .../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 | 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 | 739 - .../site-packages/pip/_vendor/rich/spinner.py | 137 - .../site-packages/pip/_vendor/rich/status.py | 132 - .../site-packages/pip/_vendor/rich/style.py | 796 -- .../site-packages/pip/_vendor/rich/styled.py | 42 - .../site-packages/pip/_vendor/rich/syntax.py | 948 -- .../site-packages/pip/_vendor/rich/table.py | 1002 -- .../pip/_vendor/rich/terminal_theme.py | 153 - .../site-packages/pip/_vendor/rich/text.py | 1307 -- .../site-packages/pip/_vendor/rich/theme.py | 115 - .../site-packages/pip/_vendor/rich/themes.py | 5 - .../pip/_vendor/rich/traceback.py | 756 - .../site-packages/pip/_vendor/rich/tree.py | 251 - .../site-packages/pip/_vendor/six.py | 998 -- .../pip/_vendor/tenacity/__init__.py | 608 - .../__pycache__/__init__.cpython-312.pyc | Bin 27108 -> 0 bytes .../__pycache__/_asyncio.cpython-312.pyc | Bin 4828 -> 0 bytes .../__pycache__/_utils.cpython-312.pyc | Bin 2337 -> 0 bytes .../__pycache__/after.cpython-312.pyc | Bin 1646 -> 0 bytes .../__pycache__/before.cpython-312.pyc | Bin 1486 -> 0 bytes .../__pycache__/before_sleep.cpython-312.pyc | Bin 2324 -> 0 bytes .../tenacity/__pycache__/nap.cpython-312.pyc | Bin 1434 -> 0 bytes .../__pycache__/retry.cpython-312.pyc | Bin 14303 -> 0 bytes .../tenacity/__pycache__/stop.cpython-312.pyc | Bin 5590 -> 0 bytes .../__pycache__/tornadoweb.cpython-312.pyc | Bin 2608 -> 0 bytes .../tenacity/__pycache__/wait.cpython-312.pyc | Bin 12435 -> 0 bytes .../pip/_vendor/tenacity/_asyncio.py | 94 - .../pip/_vendor/tenacity/_utils.py | 76 - .../pip/_vendor/tenacity/after.py | 51 - .../pip/_vendor/tenacity/before.py | 46 - .../pip/_vendor/tenacity/before_sleep.py | 71 - .../site-packages/pip/_vendor/tenacity/nap.py | 43 - .../pip/_vendor/tenacity/retry.py | 272 - .../pip/_vendor/tenacity/stop.py | 103 - .../pip/_vendor/tenacity/tornadoweb.py | 59 - .../pip/_vendor/tenacity/wait.py | 228 - .../pip/_vendor/tomli/__init__.py | 11 - .../__pycache__/__init__.cpython-312.pyc | Bin 406 -> 0 bytes .../tomli/__pycache__/_parser.cpython-312.pyc | Bin 26949 -> 0 bytes .../tomli/__pycache__/_re.cpython-312.pyc | Bin 3930 -> 0 bytes .../tomli/__pycache__/_types.cpython-312.pyc | Bin 388 -> 0 bytes .../pip/_vendor/tomli/_parser.py | 691 - .../site-packages/pip/_vendor/tomli/_re.py | 107 - .../site-packages/pip/_vendor/tomli/_types.py | 10 - .../pip/_vendor/truststore/__init__.py | 13 - .../__pycache__/__init__.cpython-312.pyc | Bin 640 -> 0 bytes .../__pycache__/_api.cpython-312.pyc | Bin 15819 -> 0 bytes .../__pycache__/_macos.cpython-312.pyc | Bin 16684 -> 0 bytes .../__pycache__/_openssl.cpython-312.pyc | Bin 2237 -> 0 bytes .../_ssl_constants.cpython-312.pyc | Bin 1121 -> 0 bytes .../__pycache__/_windows.cpython-312.pyc | Bin 15528 -> 0 bytes .../pip/_vendor/truststore/_api.py | 302 - .../pip/_vendor/truststore/_macos.py | 501 - .../pip/_vendor/truststore/_openssl.py | 66 - .../pip/_vendor/truststore/_ssl_constants.py | 31 - .../pip/_vendor/truststore/_windows.py | 554 - .../pip/_vendor/typing_extensions.py | 3072 ----- .../pip/_vendor/urllib3/__init__.py | 102 - .../__pycache__/__init__.cpython-312.pyc | Bin 3427 -> 0 bytes .../__pycache__/_collections.cpython-312.pyc | Bin 15953 -> 0 bytes .../__pycache__/_version.cpython-312.pyc | Bin 240 -> 0 bytes .../__pycache__/connection.cpython-312.pyc | Bin 20429 -> 0 bytes .../connectionpool.cpython-312.pyc | Bin 36301 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 13515 -> 0 bytes .../__pycache__/fields.cpython-312.pyc | Bin 10435 -> 0 bytes .../__pycache__/filepost.cpython-312.pyc | Bin 4040 -> 0 bytes .../__pycache__/poolmanager.cpython-312.pyc | Bin 20652 -> 0 bytes .../__pycache__/request.cpython-312.pyc | Bin 7316 -> 0 bytes .../__pycache__/response.cpython-312.pyc | Bin 33990 -> 0 bytes .../pip/_vendor/urllib3/_collections.py | 337 - .../pip/_vendor/urllib3/_version.py | 2 - .../pip/_vendor/urllib3/connection.py | 572 - .../pip/_vendor/urllib3/connectionpool.py | 1132 -- .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 220 -> 0 bytes .../_appengine_environ.cpython-312.pyc | Bin 1870 -> 0 bytes .../__pycache__/appengine.cpython-312.pyc | Bin 11586 -> 0 bytes .../__pycache__/ntlmpool.cpython-312.pyc | Bin 5741 -> 0 bytes .../__pycache__/pyopenssl.cpython-312.pyc | Bin 24472 -> 0 bytes .../securetransport.cpython-312.pyc | Bin 35578 -> 0 bytes .../contrib/__pycache__/socks.cpython-312.pyc | Bin 7533 -> 0 bytes .../urllib3/contrib/_appengine_environ.py | 36 - .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 237 -> 0 bytes .../__pycache__/bindings.cpython-312.pyc | Bin 17449 -> 0 bytes .../__pycache__/low_level.cpython-312.pyc | Bin 14823 -> 0 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 | 921 -- .../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-312.pyc | Bin 221 -> 0 bytes .../packages/__pycache__/six.cpython-312.pyc | Bin 41341 -> 0 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 231 -> 0 bytes .../__pycache__/makefile.cpython-312.pyc | Bin 1847 -> 0 bytes .../weakref_finalize.cpython-312.pyc | Bin 7353 -> 0 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 | 553 - .../pip/_vendor/urllib3/request.py | 191 - .../pip/_vendor/urllib3/response.py | 879 -- .../pip/_vendor/urllib3/util/__init__.py | 49 - .../util/__pycache__/__init__.cpython-312.pyc | Bin 1168 -> 0 bytes .../__pycache__/connection.cpython-312.pyc | Bin 4778 -> 0 bytes .../util/__pycache__/proxy.cpython-312.pyc | Bin 1574 -> 0 bytes .../util/__pycache__/queue.cpython-312.pyc | Bin 1374 -> 0 bytes .../util/__pycache__/request.cpython-312.pyc | Bin 4205 -> 0 bytes .../util/__pycache__/response.cpython-312.pyc | Bin 3011 -> 0 bytes .../util/__pycache__/retry.cpython-312.pyc | Bin 21740 -> 0 bytes .../util/__pycache__/ssl_.cpython-312.pyc | Bin 15125 -> 0 bytes .../ssl_match_hostname.cpython-312.pyc | Bin 5093 -> 0 bytes .../__pycache__/ssltransport.cpython-312.pyc | Bin 10794 -> 0 bytes .../util/__pycache__/timeout.cpython-312.pyc | Bin 11161 -> 0 bytes .../util/__pycache__/url.cpython-312.pyc | Bin 15817 -> 0 bytes .../util/__pycache__/wait.cpython-312.pyc | Bin 4425 -> 0 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 | 495 - .../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 | 24 - .../pip/_vendor/webencodings/__init__.py | 342 - .../__pycache__/__init__.cpython-312.pyc | Bin 12023 -> 0 bytes .../__pycache__/labels.cpython-312.pyc | Bin 7154 -> 0 bytes .../__pycache__/mklabels.cpython-312.pyc | Bin 2721 -> 0 bytes .../__pycache__/tests.cpython-312.pyc | Bin 9273 -> 0 bytes .../x_user_defined.cpython-312.pyc | Bin 3317 -> 0 bytes .../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.12/site-packages/pip/py.typed | 4 - .../propcache-0.3.2.dist-info/INSTALLER | 1 - .../propcache-0.3.2.dist-info/METADATA | 373 - .../propcache-0.3.2.dist-info/RECORD | 18 - .../propcache-0.3.2.dist-info/WHEEL | 6 - .../licenses/LICENSE | 202 - .../propcache-0.3.2.dist-info/licenses/NOTICE | 13 - .../propcache-0.3.2.dist-info/top_level.txt | 1 - .../site-packages/propcache/__init__.py | 32 - .../__pycache__/__init__.cpython-312.pyc | Bin 1300 -> 0 bytes .../__pycache__/_helpers.cpython-312.pyc | Bin 1043 -> 0 bytes .../__pycache__/_helpers_py.cpython-312.pyc | Bin 3202 -> 0 bytes .../propcache/__pycache__/api.cpython-312.pyc | Bin 361 -> 0 bytes .../site-packages/propcache/_helpers.py | 39 - ..._helpers_c.cpython-312-x86_64-linux-gnu.so | Bin 770704 -> 0 bytes .../site-packages/propcache/_helpers_c.pyx | 86 - .../site-packages/propcache/_helpers_py.py | 60 - .../python3.12/site-packages/propcache/api.py | 8 - .../site-packages/propcache/py.typed | 1 - .../python_dotenv-1.1.1.dist-info/INSTALLER | 1 - .../python_dotenv-1.1.1.dist-info/METADATA | 733 - .../python_dotenv-1.1.1.dist-info/RECORD | 25 - .../python_dotenv-1.1.1.dist-info/WHEEL | 5 - .../entry_points.txt | 2 - .../licenses/LICENSE | 27 - .../top_level.txt | 1 - .../INSTALLER | 1 - .../METADATA | 302 - .../python_telegram_bot-22.2.dist-info/RECORD | 443 - .../REQUESTED | 0 .../python_telegram_bot-22.2.dist-info/WHEEL | 4 - .../licenses/LICENSE | 619 - .../licenses/LICENSE.dual | 792 -- .../licenses/LICENSE.lesser | 165 - .../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-312.pyc | Bin 476 -> 0 bytes .../sniffio/__pycache__/_impl.cpython-312.pyc | Bin 3187 -> 0 bytes .../__pycache__/_version.cpython-312.pyc | Bin 228 -> 0 bytes .../python3.12/site-packages/sniffio/_impl.py | 95 - .../site-packages/sniffio/_tests/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 207 -> 0 bytes .../__pycache__/test_sniffio.cpython-312.pyc | Bin 3936 -> 0 bytes .../sniffio/_tests/test_sniffio.py | 84 - .../site-packages/sniffio/_version.py | 3 - .../python3.12/site-packages/sniffio/py.typed | 0 .../site-packages/telegram/__init__.py | 609 - .../site-packages/telegram/__main__.py | 54 - .../__pycache__/__init__.cpython-312.pyc | Bin 15801 -> 0 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 1766 -> 0 bytes .../__pycache__/_birthdate.cpython-312.pyc | Bin 2980 -> 0 bytes .../telegram/__pycache__/_bot.cpython-312.pyc | Bin 410780 -> 0 bytes .../__pycache__/_botcommand.cpython-312.pyc | Bin 2934 -> 0 bytes .../_botcommandscope.cpython-312.pyc | Bin 12722 -> 0 bytes .../_botdescription.cpython-312.pyc | Bin 2572 -> 0 bytes .../__pycache__/_botname.cpython-312.pyc | Bin 1696 -> 0 bytes .../__pycache__/_business.cpython-312.pyc | Bin 26142 -> 0 bytes .../_callbackquery.cpython-312.pyc | Bin 29616 -> 0 bytes .../__pycache__/_chat.cpython-312.pyc | Bin 113017 -> 0 bytes .../_chatadministratorrights.cpython-312.pyc | Bin 10767 -> 0 bytes .../_chatbackground.cpython-312.pyc | Bin 22327 -> 0 bytes .../__pycache__/_chatboost.cpython-312.pyc | Bin 19317 -> 0 bytes .../__pycache__/_chatfullinfo.cpython-312.pyc | Bin 28105 -> 0 bytes .../_chatinvitelink.cpython-312.pyc | Bin 8195 -> 0 bytes .../_chatjoinrequest.cpython-312.pyc | Bin 8853 -> 0 bytes .../__pycache__/_chatlocation.cpython-312.pyc | Bin 3305 -> 0 bytes .../__pycache__/_chatmember.cpython-312.pyc | Bin 27726 -> 0 bytes .../_chatmemberupdated.cpython-312.pyc | Bin 8973 -> 0 bytes .../_chatpermissions.cpython-312.pyc | Bin 9933 -> 0 bytes .../_choseninlineresult.cpython-312.pyc | Bin 4226 -> 0 bytes .../_copytextbutton.cpython-312.pyc | Bin 1958 -> 0 bytes .../__pycache__/_dice.cpython-312.pyc | Bin 6415 -> 0 bytes .../__pycache__/_forcereply.cpython-312.pyc | Bin 4165 -> 0 bytes .../__pycache__/_forumtopic.cpython-312.pyc | Bin 8028 -> 0 bytes .../__pycache__/_gifts.cpython-312.pyc | Bin 14872 -> 0 bytes .../__pycache__/_giveaway.cpython-312.pyc | Bin 16674 -> 0 bytes .../_keyboardbutton.cpython-312.pyc | Bin 8819 -> 0 bytes .../_keyboardbuttonpolltype.cpython-312.pyc | Bin 2421 -> 0 bytes .../_keyboardbuttonrequest.cpython-312.pyc | Bin 12019 -> 0 bytes .../_linkpreviewoptions.cpython-312.pyc | Bin 4041 -> 0 bytes .../__pycache__/_loginurl.cpython-312.pyc | Bin 4801 -> 0 bytes .../__pycache__/_menubutton.cpython-312.pyc | Bin 8812 -> 0 bytes .../__pycache__/_message.cpython-312.pyc | Bin 193118 -> 0 bytes ...sageautodeletetimerchanged.cpython-312.pyc | Bin 2624 -> 0 bytes .../_messageentity.cpython-312.pyc | Bin 19252 -> 0 bytes .../__pycache__/_messageid.cpython-312.pyc | Bin 2134 -> 0 bytes .../_messageorigin.cpython-312.pyc | Bin 11606 -> 0 bytes .../_messagereactionupdated.cpython-312.pyc | Bin 8374 -> 0 bytes .../__pycache__/_ownedgift.cpython-312.pyc | Bin 19830 -> 0 bytes .../__pycache__/_paidmedia.cpython-312.pyc | Bin 14595 -> 0 bytes .../_paidmessagepricechanged.cpython-312.pyc | Bin 1923 -> 0 bytes .../__pycache__/_poll.cpython-312.pyc | Bin 28153 -> 0 bytes .../_proximityalerttriggered.cpython-312.pyc | Bin 3002 -> 0 bytes .../__pycache__/_reaction.cpython-312.pyc | Bin 8712 -> 0 bytes .../__pycache__/_reply.cpython-312.pyc | Bin 22550 -> 0 bytes .../_replykeyboardmarkup.cpython-312.pyc | Bin 15821 -> 0 bytes .../_replykeyboardremove.cpython-312.pyc | Bin 3109 -> 0 bytes .../_sentwebappmessage.cpython-312.pyc | Bin 1977 -> 0 bytes .../__pycache__/_shared.cpython-312.pyc | Bin 10949 -> 0 bytes .../__pycache__/_story.cpython-312.pyc | Bin 2539 -> 0 bytes .../__pycache__/_storyarea.cpython-312.pyc | Bin 18063 -> 0 bytes ...witchinlinequerychosenchat.cpython-312.pyc | Bin 3758 -> 0 bytes .../_telegramobject.cpython-312.pyc | Bin 29725 -> 0 bytes .../__pycache__/_uniquegift.cpython-312.pyc | Bin 15477 -> 0 bytes .../__pycache__/_update.cpython-312.pyc | Bin 34148 -> 0 bytes .../__pycache__/_user.cpython-312.pyc | Bin 72843 -> 0 bytes .../_userprofilephotos.cpython-312.pyc | Bin 3166 -> 0 bytes .../__pycache__/_version.cpython-312.pyc | Bin 1710 -> 0 bytes .../__pycache__/_videochat.cpython-312.pyc | Bin 7951 -> 0 bytes .../__pycache__/_webappdata.cpython-312.pyc | Bin 2266 -> 0 bytes .../__pycache__/_webappinfo.cpython-312.pyc | Bin 1946 -> 0 bytes .../__pycache__/_webhookinfo.cpython-312.pyc | Bin 7132 -> 0 bytes .../_writeaccessallowed.cpython-312.pyc | Bin 3297 -> 0 bytes .../__pycache__/constants.cpython-312.pyc | Bin 64438 -> 0 bytes .../__pycache__/error.cpython-312.pyc | Bin 10932 -> 0 bytes .../__pycache__/helpers.cpython-312.pyc | Bin 7442 -> 0 bytes .../__pycache__/warnings.cpython-312.pyc | Bin 2578 -> 0 bytes .../site-packages/telegram/_birthdate.py | 92 - .../python3.12/site-packages/telegram/_bot.py | 11388 ---------------- .../site-packages/telegram/_botcommand.py | 83 - .../telegram/_botcommandscope.py | 268 - .../site-packages/telegram/_botdescription.py | 77 - .../site-packages/telegram/_botname.py | 54 - .../site-packages/telegram/_business.py | 628 - .../site-packages/telegram/_callbackquery.py | 893 -- .../site-packages/telegram/_chat.py | 3695 ----- .../telegram/_chatadministratorrights.py | 247 - .../site-packages/telegram/_chatbackground.py | 532 - .../site-packages/telegram/_chatboost.py | 439 - .../site-packages/telegram/_chatfullinfo.py | 650 - .../site-packages/telegram/_chatinvitelink.py | 205 - .../telegram/_chatjoinrequest.py | 209 - .../site-packages/telegram/_chatlocation.py | 89 - .../site-packages/telegram/_chatmember.py | 662 - .../telegram/_chatmemberupdated.py | 213 - .../telegram/_chatpermissions.py | 244 - .../telegram/_choseninlineresult.py | 105 - .../site-packages/telegram/_copytextbutton.py | 55 - .../site-packages/telegram/_dice.py | 160 - .../site-packages/telegram/_files/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 208 -> 0 bytes .../__pycache__/_basemedium.cpython-312.pyc | Bin 3349 -> 0 bytes .../_basethumbedmedium.cpython-312.pyc | Bin 3642 -> 0 bytes .../_inputstorycontent.cpython-312.pyc | Bin 7917 -> 0 bytes .../__pycache__/animation.cpython-312.pyc | Bin 4790 -> 0 bytes .../_files/__pycache__/audio.cpython-312.pyc | Bin 4962 -> 0 bytes .../__pycache__/chatphoto.cpython-312.pyc | Bin 6651 -> 0 bytes .../__pycache__/contact.cpython-312.pyc | Bin 2427 -> 0 bytes .../__pycache__/document.cpython-312.pyc | Bin 3318 -> 0 bytes .../_files/__pycache__/file.cpython-312.pyc | Bin 16498 -> 0 bytes .../__pycache__/inputfile.cpython-312.pyc | Bin 6096 -> 0 bytes .../__pycache__/inputmedia.cpython-312.pyc | Bin 37794 -> 0 bytes .../inputprofilephoto.cpython-312.pyc | Bin 5261 -> 0 bytes .../__pycache__/inputsticker.cpython-312.pyc | Bin 5270 -> 0 bytes .../__pycache__/location.cpython-312.pyc | Bin 5018 -> 0 bytes .../__pycache__/photosize.cpython-312.pyc | Bin 2598 -> 0 bytes .../__pycache__/sticker.cpython-312.pyc | Bin 15974 -> 0 bytes .../_files/__pycache__/venue.cpython-312.pyc | Bin 4260 -> 0 bytes .../_files/__pycache__/video.cpython-312.pyc | Bin 6759 -> 0 bytes .../__pycache__/videonote.cpython-312.pyc | Bin 4093 -> 0 bytes .../_files/__pycache__/voice.cpython-312.pyc | Bin 3560 -> 0 bytes .../telegram/_files/_basemedium.py | 100 - .../telegram/_files/_basethumbedmedium.py | 101 - .../telegram/_files/_inputstorycontent.py | 166 - .../telegram/_files/animation.py | 119 - .../site-packages/telegram/_files/audio.py | 121 - .../telegram/_files/chatphoto.py | 176 - .../site-packages/telegram/_files/contact.py | 71 - .../site-packages/telegram/_files/document.py | 88 - .../site-packages/telegram/_files/file.py | 371 - .../telegram/_files/inputfile.py | 142 - .../telegram/_files/inputmedia.py | 915 -- .../telegram/_files/inputprofilephoto.py | 138 - .../telegram/_files/inputsticker.py | 119 - .../site-packages/telegram/_files/location.py | 128 - .../telegram/_files/photosize.py | 77 - .../site-packages/telegram/_files/sticker.py | 382 - .../site-packages/telegram/_files/venue.py | 113 - .../site-packages/telegram/_files/video.py | 165 - .../telegram/_files/videonote.py | 107 - .../site-packages/telegram/_files/voice.py | 93 - .../site-packages/telegram/_forcereply.py | 106 - .../site-packages/telegram/_forumtopic.py | 215 - .../site-packages/telegram/_games/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 208 -> 0 bytes .../__pycache__/callbackgame.cpython-312.pyc | Bin 1135 -> 0 bytes .../_games/__pycache__/game.cpython-312.pyc | Bin 8660 -> 0 bytes .../__pycache__/gamehighscore.cpython-312.pyc | Bin 2673 -> 0 bytes .../telegram/_games/callbackgame.py | 35 - .../site-packages/telegram/_games/game.py | 194 - .../telegram/_games/gamehighscore.py | 71 - .../site-packages/telegram/_gifts.py | 357 - .../site-packages/telegram/_giveaway.py | 378 - .../telegram/_inline/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 209 -> 0 bytes .../inlinekeyboardbutton.cpython-312.pyc | Bin 16094 -> 0 bytes .../inlinekeyboardmarkup.cpython-312.pyc | Bin 5880 -> 0 bytes .../__pycache__/inlinequery.cpython-312.pyc | Bin 9066 -> 0 bytes .../inlinequeryresult.cpython-312.pyc | Bin 2700 -> 0 bytes .../inlinequeryresultarticle.cpython-312.pyc | Bin 4625 -> 0 bytes .../inlinequeryresultaudio.cpython-312.pyc | Bin 6026 -> 0 bytes ...linequeryresultcachedaudio.cpython-312.pyc | Bin 4772 -> 0 bytes ...equeryresultcacheddocument.cpython-312.pyc | Bin 5241 -> 0 bytes ...inlinequeryresultcachedgif.cpython-312.pyc | Bin 5369 -> 0 bytes ...equeryresultcachedmpeg4gif.cpython-312.pyc | Bin 5464 -> 0 bytes ...linequeryresultcachedphoto.cpython-312.pyc | Bin 5580 -> 0 bytes ...nequeryresultcachedsticker.cpython-312.pyc | Bin 3378 -> 0 bytes ...linequeryresultcachedvideo.cpython-312.pyc | Bin 5499 -> 0 bytes ...linequeryresultcachedvoice.cpython-312.pyc | Bin 4971 -> 0 bytes .../inlinequeryresultcontact.cpython-312.pyc | Bin 4971 -> 0 bytes .../inlinequeryresultdocument.cpython-312.pyc | Bin 6536 -> 0 bytes .../inlinequeryresultgame.cpython-312.pyc | Bin 2538 -> 0 bytes .../inlinequeryresultgif.cpython-312.pyc | Bin 7808 -> 0 bytes .../inlinequeryresultlocation.cpython-312.pyc | Bin 9160 -> 0 bytes .../inlinequeryresultmpeg4gif.cpython-312.pyc | Bin 7911 -> 0 bytes .../inlinequeryresultphoto.cpython-312.pyc | Bin 6452 -> 0 bytes .../inlinequeryresultsbutton.cpython-312.pyc | Bin 5320 -> 0 bytes .../inlinequeryresultvenue.cpython-312.pyc | Bin 6432 -> 0 bytes .../inlinequeryresultvideo.cpython-312.pyc | Bin 8201 -> 0 bytes .../inlinequeryresultvoice.cpython-312.pyc | Bin 5958 -> 0 bytes ...inputcontactmessagecontent.cpython-312.pyc | Bin 2522 -> 0 bytes ...inputinvoicemessagecontent.cpython-312.pyc | Bin 13215 -> 0 bytes ...nputlocationmessagecontent.cpython-312.pyc | Bin 6729 -> 0 bytes .../inputmessagecontent.cpython-312.pyc | Bin 1415 -> 0 bytes .../inputtextmessagecontent.cpython-312.pyc | Bin 4556 -> 0 bytes .../inputvenuemessagecontent.cpython-312.pyc | Bin 4088 -> 0 bytes .../preparedinlinemessage.cpython-312.pyc | Bin 2898 -> 0 bytes .../telegram/_inline/inlinekeyboardbutton.py | 337 - .../telegram/_inline/inlinekeyboardmarkup.py | 161 - .../telegram/_inline/inlinequery.py | 220 - .../telegram/_inline/inlinequeryresult.py | 79 - .../_inline/inlinequeryresultarticle.py | 129 - .../_inline/inlinequeryresultaudio.py | 144 - .../_inline/inlinequeryresultcachedaudio.py | 116 - .../inlinequeryresultcacheddocument.py | 126 - .../_inline/inlinequeryresultcachedgif.py | 131 - .../inlinequeryresultcachedmpeg4gif.py | 131 - .../_inline/inlinequeryresultcachedphoto.py | 136 - .../_inline/inlinequeryresultcachedsticker.py | 81 - .../_inline/inlinequeryresultcachedvideo.py | 132 - .../_inline/inlinequeryresultcachedvoice.py | 121 - .../_inline/inlinequeryresultcontact.py | 130 - .../_inline/inlinequeryresultdocument.py | 165 - .../telegram/_inline/inlinequeryresultgame.py | 66 - .../telegram/_inline/inlinequeryresultgif.py | 188 - .../_inline/inlinequeryresultlocation.py | 220 - .../_inline/inlinequeryresultmpeg4gif.py | 190 - .../_inline/inlinequeryresultphoto.py | 161 - .../_inline/inlinequeryresultsbutton.py | 116 - .../_inline/inlinequeryresultvenue.py | 160 - .../_inline/inlinequeryresultvideo.py | 196 - .../_inline/inlinequeryresultvoice.py | 141 - .../_inline/inputcontactmessagecontent.py | 68 - .../_inline/inputinvoicemessagecontent.py | 264 - .../_inline/inputlocationmessagecontent.py | 164 - .../telegram/_inline/inputmessagecontent.py | 42 - .../_inline/inputtextmessagecontent.py | 116 - .../_inline/inputvenuemessagecontent.py | 108 - .../telegram/_inline/preparedinlinemessage.py | 78 - .../site-packages/telegram/_keyboardbutton.py | 193 - .../telegram/_keyboardbuttonpolltype.py | 63 - .../telegram/_keyboardbuttonrequest.py | 272 - .../telegram/_linkpreviewoptions.py | 103 - .../site-packages/telegram/_loginurl.py | 105 - .../site-packages/telegram/_menubutton.py | 189 - .../site-packages/telegram/_message.py | 5203 ------- .../_messageautodeletetimerchanged.py | 75 - .../site-packages/telegram/_messageentity.py | 410 - .../site-packages/telegram/_messageid.py | 54 - .../site-packages/telegram/_messageorigin.py | 282 - .../telegram/_messagereactionupdated.py | 199 - .../site-packages/telegram/_ownedgift.py | 419 - .../site-packages/telegram/_paidmedia.py | 339 - .../telegram/_paidmessagepricechanged.py | 55 - .../telegram/_passport/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 211 -> 0 bytes .../__pycache__/credentials.cpython-312.pyc | Bin 23631 -> 0 bytes .../__pycache__/data.cpython-312.pyc | Bin 5980 -> 0 bytes .../encryptedpassportelement.cpython-312.pyc | Bin 12871 -> 0 bytes .../__pycache__/passportdata.cpython-312.pyc | Bin 5732 -> 0 bytes .../passportelementerrors.cpython-312.pyc | Bin 20477 -> 0 bytes .../__pycache__/passportfile.cpython-312.pyc | Bin 8303 -> 0 bytes .../telegram/_passport/credentials.py | 524 - .../site-packages/telegram/_passport/data.py | 186 - .../_passport/encryptedpassportelement.py | 278 - .../telegram/_passport/passportdata.py | 127 - .../_passport/passportelementerrors.py | 441 - .../telegram/_passport/passportfile.py | 213 - .../telegram/_payment/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 210 -> 0 bytes .../__pycache__/invoice.cpython-312.pyc | Bin 4424 -> 0 bytes .../__pycache__/labeledprice.cpython-312.pyc | Bin 2590 -> 0 bytes .../__pycache__/orderinfo.cpython-312.pyc | Bin 3108 -> 0 bytes .../precheckoutquery.cpython-312.pyc | Bin 6000 -> 0 bytes .../refundedpayment.cpython-312.pyc | Bin 3665 -> 0 bytes .../shippingaddress.cpython-312.pyc | Bin 2655 -> 0 bytes .../shippingoption.cpython-312.pyc | Bin 2327 -> 0 bytes .../__pycache__/shippingquery.cpython-312.pyc | Bin 4567 -> 0 bytes .../successfulpayment.cpython-312.pyc | Bin 6568 -> 0 bytes .../telegram/_payment/invoice.py | 134 - .../telegram/_payment/labeledprice.py | 65 - .../telegram/_payment/orderinfo.py | 83 - .../telegram/_payment/precheckoutquery.py | 151 - .../telegram/_payment/refundedpayment.py | 93 - .../telegram/_payment/shippingaddress.py | 89 - .../telegram/_payment/shippingoption.py | 76 - .../telegram/_payment/shippingquery.py | 123 - .../telegram/_payment/stars/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 216 -> 0 bytes .../__pycache__/affiliateinfo.cpython-312.pyc | Bin 5030 -> 0 bytes .../revenuewithdrawalstate.cpython-312.pyc | Bin 7516 -> 0 bytes .../__pycache__/staramount.cpython-312.pyc | Bin 2476 -> 0 bytes .../startransactions.cpython-312.pyc | Bin 7618 -> 0 bytes .../transactionpartner.cpython-312.pyc | Bin 23717 -> 0 bytes .../telegram/_payment/stars/affiliateinfo.py | 116 - .../_payment/stars/revenuewithdrawalstate.py | 180 - .../telegram/_payment/stars/staramount.py | 67 - .../_payment/stars/startransactions.py | 165 - .../_payment/stars/transactionpartner.py | 528 - .../telegram/_payment/successfulpayment.py | 158 - .../site-packages/telegram/_poll.py | 655 - .../telegram/_proximityalerttriggered.py | 78 - .../site-packages/telegram/_reaction.py | 232 - .../site-packages/telegram/_reply.py | 461 - .../telegram/_replykeyboardmarkup.py | 360 - .../telegram/_replykeyboardremove.py | 73 - .../telegram/_sentwebappmessage.py | 56 - .../site-packages/telegram/_shared.py | 253 - .../site-packages/telegram/_story.py | 79 - .../site-packages/telegram/_storyarea.py | 438 - .../telegram/_switchinlinequerychosenchat.py | 100 - .../site-packages/telegram/_telegramobject.py | 721 - .../site-packages/telegram/_uniquegift.py | 401 - .../site-packages/telegram/_update.py | 813 -- .../site-packages/telegram/_user.py | 2399 ---- .../telegram/_userprofilephotos.py | 80 - .../site-packages/telegram/_utils/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 208 -> 0 bytes .../argumentparsing.cpython-312.pyc | Bin 5894 -> 0 bytes .../__pycache__/datetime.cpython-312.pyc | Bin 11836 -> 0 bytes .../__pycache__/defaultvalue.cpython-312.pyc | Bin 4479 -> 0 bytes .../__pycache__/entities.cpython-312.pyc | Bin 2953 -> 0 bytes .../_utils/__pycache__/enum.cpython-312.pyc | Bin 3615 -> 0 bytes .../_utils/__pycache__/files.cpython-312.pyc | Bin 6141 -> 0 bytes .../__pycache__/logging.cpython-312.pyc | Bin 1722 -> 0 bytes .../_utils/__pycache__/markup.cpython-312.pyc | Bin 1466 -> 0 bytes .../_utils/__pycache__/repr.cpython-312.pyc | Bin 1787 -> 0 bytes .../__pycache__/strings.cpython-312.pyc | Bin 1659 -> 0 bytes .../_utils/__pycache__/types.cpython-312.pyc | Bin 2312 -> 0 bytes .../__pycache__/warnings.cpython-312.pyc | Bin 1781 -> 0 bytes .../warnings_transition.cpython-312.pyc | Bin 3419 -> 0 bytes .../telegram/_utils/argumentparsing.py | 169 - .../site-packages/telegram/_utils/datetime.py | 274 - .../telegram/_utils/defaultvalue.py | 148 - .../site-packages/telegram/_utils/entities.py | 73 - .../site-packages/telegram/_utils/enum.py | 90 - .../site-packages/telegram/_utils/files.py | 157 - .../site-packages/telegram/_utils/logging.py | 50 - .../site-packages/telegram/_utils/markup.py | 49 - .../site-packages/telegram/_utils/repr.py | 45 - .../site-packages/telegram/_utils/strings.py | 55 - .../site-packages/telegram/_utils/types.py | 98 - .../site-packages/telegram/_utils/warnings.py | 56 - .../telegram/_utils/warnings_transition.py | 114 - .../site-packages/telegram/_version.py | 56 - .../site-packages/telegram/_videochat.py | 208 - .../site-packages/telegram/_webappdata.py | 64 - .../site-packages/telegram/_webappinfo.py | 59 - .../site-packages/telegram/_webhookinfo.py | 181 - .../telegram/_writeaccessallowed.py | 88 - .../site-packages/telegram/constants.py | 3688 ----- .../site-packages/telegram/error.py | 278 - .../site-packages/telegram/ext/__init__.py | 104 - .../ext/__pycache__/__init__.cpython-312.pyc | Bin 3111 -> 0 bytes .../_aioratelimiter.cpython-312.pyc | Bin 13528 -> 0 bytes .../__pycache__/_application.cpython-312.pyc | Bin 90090 -> 0 bytes .../_applicationbuilder.cpython-312.pyc | Bin 56692 -> 0 bytes .../_basepersistence.cpython-312.pyc | Bin 20570 -> 0 bytes .../_baseratelimiter.cpython-312.pyc | Bin 6600 -> 0 bytes .../_baseupdateprocessor.cpython-312.pyc | Bin 8079 -> 0 bytes .../_callbackcontext.cpython-312.pyc | Bin 19632 -> 0 bytes .../_callbackdatacache.cpython-312.pyc | Bin 19991 -> 0 bytes .../__pycache__/_contexttypes.cpython-312.pyc | Bin 8742 -> 0 bytes .../ext/__pycache__/_defaults.cpython-312.pyc | Bin 15601 -> 0 bytes .../_dictpersistence.cpython-312.pyc | Bin 22288 -> 0 bytes .../ext/__pycache__/_extbot.cpython-312.pyc | Bin 160675 -> 0 bytes .../ext/__pycache__/_jobqueue.cpython-312.pyc | Bin 46303 -> 0 bytes .../_picklepersistence.cpython-312.pyc | Bin 28024 -> 0 bytes .../ext/__pycache__/_updater.cpython-312.pyc | Bin 32273 -> 0 bytes .../ext/__pycache__/filters.cpython-312.pyc | Bin 130053 -> 0 bytes .../telegram/ext/_aioratelimiter.py | 299 - .../telegram/ext/_application.py | 1935 --- .../telegram/ext/_applicationbuilder.py | 1363 -- .../telegram/ext/_basepersistence.py | 440 - .../telegram/ext/_baseratelimiter.py | 142 - .../telegram/ext/_baseupdateprocessor.py | 201 - .../telegram/ext/_callbackcontext.py | 429 - .../telegram/ext/_callbackdatacache.py | 469 - .../telegram/ext/_contexttypes.py | 226 - .../site-packages/telegram/ext/_defaults.py | 361 - .../telegram/ext/_dictpersistence.py | 481 - .../site-packages/telegram/ext/_extbot.py | 5212 ------- .../telegram/ext/_handlers/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 215 -> 0 bytes .../__pycache__/basehandler.cpython-312.pyc | Bin 7639 -> 0 bytes .../businessconnectionhandler.cpython-312.pyc | Bin 4045 -> 0 bytes ...nessmessagesdeletedhandler.cpython-312.pyc | Bin 4092 -> 0 bytes .../callbackqueryhandler.cpython-312.pyc | Bin 9324 -> 0 bytes .../chatboosthandler.cpython-312.pyc | Bin 5350 -> 0 bytes .../chatjoinrequesthandler.cpython-312.pyc | Bin 4678 -> 0 bytes .../chatmemberhandler.cpython-312.pyc | Bin 5154 -> 0 bytes .../choseninlineresulthandler.cpython-312.pyc | Bin 5261 -> 0 bytes .../commandhandler.cpython-312.pyc | Bin 11230 -> 0 bytes .../conversationhandler.cpython-312.pyc | Bin 43842 -> 0 bytes .../inlinequeryhandler.cpython-312.pyc | Bin 6125 -> 0 bytes .../messagehandler.cpython-312.pyc | Bin 4984 -> 0 bytes .../messagereactionhandler.cpython-312.pyc | Bin 7941 -> 0 bytes .../paidmediapurchasedhandler.cpython-312.pyc | Bin 4015 -> 0 bytes .../pollanswerhandler.cpython-312.pyc | Bin 2626 -> 0 bytes .../__pycache__/pollhandler.cpython-312.pyc | Bin 2579 -> 0 bytes .../precheckoutqueryhandler.cpython-312.pyc | Bin 4178 -> 0 bytes .../__pycache__/prefixhandler.cpython-312.pyc | Bin 8637 -> 0 bytes .../shippingqueryhandler.cpython-312.pyc | Bin 2609 -> 0 bytes .../stringcommandhandler.cpython-312.pyc | Bin 4709 -> 0 bytes .../stringregexhandler.cpython-312.pyc | Bin 4857 -> 0 bytes .../__pycache__/typehandler.cpython-312.pyc | Bin 3917 -> 0 bytes .../telegram/ext/_handlers/basehandler.py | 175 - .../_handlers/businessconnectionhandler.py | 95 - .../businessmessagesdeletedhandler.py | 95 - .../ext/_handlers/callbackqueryhandler.py | 208 - .../ext/_handlers/chatboosthandler.py | 130 - .../ext/_handlers/chatjoinrequesthandler.py | 111 - .../ext/_handlers/chatmemberhandler.py | 125 - .../_handlers/choseninlineresulthandler.py | 122 - .../telegram/ext/_handlers/commandhandler.py | 223 - .../ext/_handlers/conversationhandler.py | 958 -- .../ext/_handlers/inlinequeryhandler.py | 139 - .../telegram/ext/_handlers/messagehandler.py | 111 - .../ext/_handlers/messagereactionhandler.py | 180 - .../_handlers/paidmediapurchasedhandler.py | 95 - .../ext/_handlers/pollanswerhandler.py | 71 - .../telegram/ext/_handlers/pollhandler.py | 71 - .../ext/_handlers/precheckoutqueryhandler.py | 103 - .../telegram/ext/_handlers/prefixhandler.py | 184 - .../ext/_handlers/shippingqueryhandler.py | 70 - .../ext/_handlers/stringcommandhandler.py | 108 - .../ext/_handlers/stringregexhandler.py | 115 - .../telegram/ext/_handlers/typehandler.py | 98 - .../site-packages/telegram/ext/_jobqueue.py | 1013 -- .../telegram/ext/_picklepersistence.py | 562 - .../site-packages/telegram/ext/_updater.py | 779 -- .../telegram/ext/_utils/__init__.py | 17 - .../__pycache__/__init__.cpython-312.pyc | Bin 212 -> 0 bytes .../_update_parsing.cpython-312.pyc | Bin 1880 -> 0 bytes .../__pycache__/asyncio.cpython-312.pyc | Bin 2280 -> 0 bytes .../__pycache__/networkloop.cpython-312.pyc | Bin 6434 -> 0 bytes .../_utils/__pycache__/stack.cpython-312.pyc | Bin 2421 -> 0 bytes .../__pycache__/trackingdict.cpython-312.pyc | Bin 5761 -> 0 bytes .../_utils/__pycache__/types.cpython-312.pyc | Bin 1941 -> 0 bytes .../webhookhandler.cpython-312.pyc | Bin 10446 -> 0 bytes .../telegram/ext/_utils/_update_parsing.py | 50 - .../telegram/ext/_utils/asyncio.py | 55 - .../telegram/ext/_utils/networkloop.py | 153 - .../telegram/ext/_utils/stack.py | 76 - .../telegram/ext/_utils/trackingdict.py | 125 - .../telegram/ext/_utils/types.py | 106 - .../telegram/ext/_utils/webhookhandler.py | 223 - .../site-packages/telegram/ext/filters.py | 2947 ---- .../site-packages/telegram/helpers.py | 201 - .../site-packages/telegram/py.typed | 0 .../telegram/request/__init__.py | 24 - .../__pycache__/__init__.cpython-312.pyc | Bin 507 -> 0 bytes .../__pycache__/_baserequest.cpython-312.pyc | Bin 18631 -> 0 bytes .../__pycache__/_httpxrequest.cpython-312.pyc | Bin 13208 -> 0 bytes .../__pycache__/_requestdata.cpython-312.pyc | Bin 6546 -> 0 bytes .../_requestparameter.cpython-312.pyc | Bin 8856 -> 0 bytes .../telegram/request/_baserequest.py | 443 - .../telegram/request/_httpxrequest.py | 299 - .../telegram/request/_requestdata.py | 142 - .../telegram/request/_requestparameter.py | 210 - .../site-packages/telegram/warnings.py | 87 - .../INSTALLER | 1 - .../METADATA | 68 - .../typing_extensions-4.14.1.dist-info/RECORD | 7 - .../typing_extensions-4.14.1.dist-info/WHEEL | 4 - .../licenses/LICENSE | 279 - .../site-packages/typing_extensions.py | 4244 ------ .../yarl-1.20.1.dist-info/INSTALLER | 1 - .../yarl-1.20.1.dist-info/METADATA | 2427 ---- .../yarl-1.20.1.dist-info/RECORD | 26 - .../site-packages/yarl-1.20.1.dist-info/WHEEL | 6 - .../yarl-1.20.1.dist-info/licenses/LICENSE | 202 - .../yarl-1.20.1.dist-info/licenses/NOTICE | 13 - .../yarl-1.20.1.dist-info/top_level.txt | 1 - .../python3.12/site-packages/yarl/__init__.py | 14 - .../yarl/__pycache__/__init__.cpython-312.pyc | Bin 477 -> 0 bytes .../yarl/__pycache__/_parse.cpython-312.pyc | Bin 6989 -> 0 bytes .../yarl/__pycache__/_path.cpython-312.pyc | Bin 1431 -> 0 bytes .../yarl/__pycache__/_query.cpython-312.pyc | Bin 4798 -> 0 bytes .../yarl/__pycache__/_quoters.cpython-312.pyc | Bin 2012 -> 0 bytes .../yarl/__pycache__/_quoting.cpython-312.pyc | Bin 771 -> 0 bytes .../__pycache__/_quoting_py.cpython-312.pyc | Bin 8944 -> 0 bytes .../yarl/__pycache__/_url.cpython-312.pyc | Bin 60584 -> 0 bytes .../python3.12/site-packages/yarl/_parse.py | 203 - .../python3.12/site-packages/yarl/_path.py | 41 - .../python3.12/site-packages/yarl/_query.py | 114 - .../python3.12/site-packages/yarl/_quoters.py | 33 - .../python3.12/site-packages/yarl/_quoting.py | 19 - ..._quoting_c.cpython-312-x86_64-linux-gnu.so | Bin 1092184 -> 0 bytes .../site-packages/yarl/_quoting_c.pyx | 453 - .../site-packages/yarl/_quoting_py.py | 213 - .../lib/python3.12/site-packages/yarl/_url.py | 1604 --- .../python3.12/site-packages/yarl/py.typed | 1 - venv/lib64 | 1 - venv/pyvenv.cfg | 5 - 2081 files changed, 2 insertions(+), 374235 deletions(-) delete mode 100644 venv/bin/Activate.ps1 delete mode 100644 venv/bin/activate delete mode 100644 venv/bin/activate.csh delete mode 100644 venv/bin/activate.fish delete mode 100755 venv/bin/dotenv delete mode 100755 venv/bin/httpx delete mode 100755 venv/bin/pip delete mode 100755 venv/bin/pip3 delete mode 100755 venv/bin/pip3.12 delete mode 120000 venv/bin/python delete mode 120000 venv/bin/python3 delete mode 120000 venv/bin/python3.12 delete mode 100644 venv/lib/python3.12/site-packages/__pycache__/typing_extensions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/INSTALLER delete mode 100644 venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/LICENSE delete mode 100644 venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/METADATA delete mode 100644 venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/RECORD delete mode 100644 venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/WHEEL delete mode 100644 venv/lib/python3.12/site-packages/aiohappyeyeballs/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/aiohappyeyeballs/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohappyeyeballs/__pycache__/_staggered.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohappyeyeballs/__pycache__/impl.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohappyeyeballs/__pycache__/types.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohappyeyeballs/__pycache__/utils.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohappyeyeballs/_staggered.py delete mode 100644 venv/lib/python3.12/site-packages/aiohappyeyeballs/impl.py delete mode 100644 venv/lib/python3.12/site-packages/aiohappyeyeballs/py.typed delete mode 100644 venv/lib/python3.12/site-packages/aiohappyeyeballs/types.py delete mode 100644 venv/lib/python3.12/site-packages/aiohappyeyeballs/utils.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp-3.12.14.dist-info/INSTALLER delete mode 100644 venv/lib/python3.12/site-packages/aiohttp-3.12.14.dist-info/METADATA delete mode 100644 venv/lib/python3.12/site-packages/aiohttp-3.12.14.dist-info/RECORD delete mode 100644 venv/lib/python3.12/site-packages/aiohttp-3.12.14.dist-info/REQUESTED delete mode 100644 venv/lib/python3.12/site-packages/aiohttp-3.12.14.dist-info/WHEEL delete mode 100644 venv/lib/python3.12/site-packages/aiohttp-3.12.14.dist-info/licenses/LICENSE.txt delete mode 100644 venv/lib/python3.12/site-packages/aiohttp-3.12.14.dist-info/top_level.txt delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/.hash/_cparser.pxd.hash delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/.hash/_find_header.pxd.hash delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/.hash/_http_parser.pyx.hash delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/.hash/_http_writer.pyx.hash delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/.hash/hdrs.py.hash delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/_cookie_helpers.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/abc.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/base_protocol.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/client.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/client_exceptions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/client_middleware_digest_auth.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/client_middlewares.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/client_proto.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/client_reqrep.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/client_ws.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/compression_utils.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/connector.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/cookiejar.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/formdata.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/hdrs.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/helpers.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/http.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/http_exceptions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/http_parser.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/http_websocket.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/http_writer.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/log.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/multipart.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/payload.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/payload_streamer.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/pytest_plugin.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/resolver.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/streams.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/tcp_helpers.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/test_utils.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/tracing.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/typedefs.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/web.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_app.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_exceptions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_fileresponse.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_log.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_middlewares.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_protocol.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_request.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_response.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_routedef.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_runner.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_server.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_urldispatcher.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_ws.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/__pycache__/worker.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/_cookie_helpers.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/_cparser.pxd delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/_find_header.pxd delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/_headers.pxi delete mode 100755 venv/lib/python3.12/site-packages/aiohttp/_http_parser.cpython-312-x86_64-linux-gnu.so delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/_http_parser.pyx delete mode 100755 venv/lib/python3.12/site-packages/aiohttp/_http_writer.cpython-312-x86_64-linux-gnu.so delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/_http_writer.pyx delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/_websocket/.hash/mask.pxd.hash delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/_websocket/.hash/mask.pyx.hash delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/_websocket/.hash/reader_c.pxd.hash delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/_websocket/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/_websocket/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/_websocket/__pycache__/helpers.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/_websocket/__pycache__/models.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/_websocket/__pycache__/reader.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/_websocket/__pycache__/reader_c.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/_websocket/__pycache__/reader_py.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/_websocket/__pycache__/writer.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/_websocket/helpers.py delete mode 100755 venv/lib/python3.12/site-packages/aiohttp/_websocket/mask.cpython-312-x86_64-linux-gnu.so delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/_websocket/mask.pxd delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/_websocket/mask.pyx delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/_websocket/models.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/_websocket/reader.py delete mode 100755 venv/lib/python3.12/site-packages/aiohttp/_websocket/reader_c.cpython-312-x86_64-linux-gnu.so delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/_websocket/reader_c.pxd delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/_websocket/reader_c.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/_websocket/reader_py.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/_websocket/writer.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/abc.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/base_protocol.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/client.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/client_exceptions.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/client_middleware_digest_auth.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/client_middlewares.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/client_proto.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/client_reqrep.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/client_ws.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/compression_utils.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/connector.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/cookiejar.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/formdata.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/hdrs.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/helpers.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/http.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/http_exceptions.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/http_parser.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/http_websocket.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/http_writer.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/log.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/multipart.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/payload.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/payload_streamer.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/py.typed delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/pytest_plugin.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/resolver.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/streams.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/tcp_helpers.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/test_utils.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/tracing.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/typedefs.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/web.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/web_app.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/web_exceptions.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/web_fileresponse.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/web_log.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/web_middlewares.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/web_protocol.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/web_request.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/web_response.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/web_routedef.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/web_runner.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/web_server.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/web_urldispatcher.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/web_ws.py delete mode 100644 venv/lib/python3.12/site-packages/aiohttp/worker.py delete mode 100644 venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/INSTALLER delete mode 100644 venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/METADATA delete mode 100644 venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/RECORD delete mode 100644 venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/WHEEL delete mode 100644 venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/licenses/LICENSE delete mode 100644 venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/top_level.txt delete mode 100644 venv/lib/python3.12/site-packages/aiosignal/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/aiosignal/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/aiosignal/py.typed delete mode 100644 venv/lib/python3.12/site-packages/anyio-4.9.0.dist-info/INSTALLER delete mode 100644 venv/lib/python3.12/site-packages/anyio-4.9.0.dist-info/LICENSE delete mode 100644 venv/lib/python3.12/site-packages/anyio-4.9.0.dist-info/METADATA delete mode 100644 venv/lib/python3.12/site-packages/anyio-4.9.0.dist-info/RECORD delete mode 100644 venv/lib/python3.12/site-packages/anyio-4.9.0.dist-info/WHEEL delete mode 100644 venv/lib/python3.12/site-packages/anyio-4.9.0.dist-info/entry_points.txt delete mode 100644 venv/lib/python3.12/site-packages/anyio-4.9.0.dist-info/top_level.txt delete mode 100644 venv/lib/python3.12/site-packages/anyio/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/__pycache__/from_thread.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/__pycache__/lowlevel.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/__pycache__/pytest_plugin.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/__pycache__/to_interpreter.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/__pycache__/to_process.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/__pycache__/to_thread.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/_backends/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/_backends/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/_backends/__pycache__/_asyncio.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/_backends/__pycache__/_trio.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/_backends/_asyncio.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/_backends/_trio.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/_core/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/_core/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_asyncio_selector_thread.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_eventloop.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_exceptions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_fileio.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_resources.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_signals.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_sockets.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_streams.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_subprocesses.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_synchronization.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_tasks.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_tempfile.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_testing.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_typedattr.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/_core/_asyncio_selector_thread.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/_core/_eventloop.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/_core/_exceptions.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/_core/_fileio.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/_core/_resources.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/_core/_signals.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/_core/_sockets.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/_core/_streams.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/_core/_subprocesses.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/_core/_synchronization.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/_core/_tasks.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/_core/_tempfile.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/_core/_testing.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/_core/_typedattr.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/abc/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/abc/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_eventloop.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_resources.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_sockets.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_streams.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_subprocesses.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_tasks.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_testing.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/abc/_eventloop.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/abc/_resources.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/abc/_sockets.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/abc/_streams.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/abc/_subprocesses.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/abc/_tasks.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/abc/_testing.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/from_thread.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/lowlevel.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/py.typed delete mode 100644 venv/lib/python3.12/site-packages/anyio/pytest_plugin.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/streams/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/streams/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/streams/__pycache__/buffered.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/streams/__pycache__/file.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/streams/__pycache__/memory.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/streams/__pycache__/stapled.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/streams/__pycache__/text.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/streams/__pycache__/tls.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/anyio/streams/buffered.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/streams/file.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/streams/memory.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/streams/stapled.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/streams/text.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/streams/tls.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/to_interpreter.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/to_process.py delete mode 100644 venv/lib/python3.12/site-packages/anyio/to_thread.py delete mode 100644 venv/lib/python3.12/site-packages/attr/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/attr/__init__.pyi delete mode 100644 venv/lib/python3.12/site-packages/attr/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/attr/__pycache__/_cmp.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/attr/__pycache__/_compat.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/attr/__pycache__/_config.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/attr/__pycache__/_funcs.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/attr/__pycache__/_make.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/attr/__pycache__/_next_gen.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/attr/__pycache__/_version_info.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/attr/__pycache__/converters.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/attr/__pycache__/exceptions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/attr/__pycache__/filters.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/attr/__pycache__/setters.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/attr/__pycache__/validators.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/attr/_cmp.py delete mode 100644 venv/lib/python3.12/site-packages/attr/_cmp.pyi delete mode 100644 venv/lib/python3.12/site-packages/attr/_compat.py delete mode 100644 venv/lib/python3.12/site-packages/attr/_config.py delete mode 100644 venv/lib/python3.12/site-packages/attr/_funcs.py delete mode 100644 venv/lib/python3.12/site-packages/attr/_make.py delete mode 100644 venv/lib/python3.12/site-packages/attr/_next_gen.py delete mode 100644 venv/lib/python3.12/site-packages/attr/_typing_compat.pyi delete mode 100644 venv/lib/python3.12/site-packages/attr/_version_info.py delete mode 100644 venv/lib/python3.12/site-packages/attr/_version_info.pyi delete mode 100644 venv/lib/python3.12/site-packages/attr/converters.py delete mode 100644 venv/lib/python3.12/site-packages/attr/converters.pyi delete mode 100644 venv/lib/python3.12/site-packages/attr/exceptions.py delete mode 100644 venv/lib/python3.12/site-packages/attr/exceptions.pyi delete mode 100644 venv/lib/python3.12/site-packages/attr/filters.py delete mode 100644 venv/lib/python3.12/site-packages/attr/filters.pyi delete mode 100644 venv/lib/python3.12/site-packages/attr/py.typed delete mode 100644 venv/lib/python3.12/site-packages/attr/setters.py delete mode 100644 venv/lib/python3.12/site-packages/attr/setters.pyi delete mode 100644 venv/lib/python3.12/site-packages/attr/validators.py delete mode 100644 venv/lib/python3.12/site-packages/attr/validators.pyi delete mode 100644 venv/lib/python3.12/site-packages/attrs-25.3.0.dist-info/INSTALLER delete mode 100644 venv/lib/python3.12/site-packages/attrs-25.3.0.dist-info/METADATA delete mode 100644 venv/lib/python3.12/site-packages/attrs-25.3.0.dist-info/RECORD delete mode 100644 venv/lib/python3.12/site-packages/attrs-25.3.0.dist-info/WHEEL delete mode 100644 venv/lib/python3.12/site-packages/attrs-25.3.0.dist-info/licenses/LICENSE delete mode 100644 venv/lib/python3.12/site-packages/attrs/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/attrs/__init__.pyi delete mode 100644 venv/lib/python3.12/site-packages/attrs/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/attrs/__pycache__/converters.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/attrs/__pycache__/exceptions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/attrs/__pycache__/filters.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/attrs/__pycache__/setters.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/attrs/__pycache__/validators.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/attrs/converters.py delete mode 100644 venv/lib/python3.12/site-packages/attrs/exceptions.py delete mode 100644 venv/lib/python3.12/site-packages/attrs/filters.py delete mode 100644 venv/lib/python3.12/site-packages/attrs/py.typed delete mode 100644 venv/lib/python3.12/site-packages/attrs/setters.py delete mode 100644 venv/lib/python3.12/site-packages/attrs/validators.py delete mode 100644 venv/lib/python3.12/site-packages/certifi-2025.7.14.dist-info/INSTALLER delete mode 100644 venv/lib/python3.12/site-packages/certifi-2025.7.14.dist-info/METADATA delete mode 100644 venv/lib/python3.12/site-packages/certifi-2025.7.14.dist-info/RECORD delete mode 100644 venv/lib/python3.12/site-packages/certifi-2025.7.14.dist-info/WHEEL delete mode 100644 venv/lib/python3.12/site-packages/certifi-2025.7.14.dist-info/licenses/LICENSE delete mode 100644 venv/lib/python3.12/site-packages/certifi-2025.7.14.dist-info/top_level.txt delete mode 100644 venv/lib/python3.12/site-packages/certifi/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/certifi/__main__.py delete mode 100644 venv/lib/python3.12/site-packages/certifi/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/certifi/__pycache__/__main__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/certifi/__pycache__/core.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/certifi/cacert.pem delete mode 100644 venv/lib/python3.12/site-packages/certifi/core.py delete mode 100644 venv/lib/python3.12/site-packages/certifi/py.typed delete mode 100644 venv/lib/python3.12/site-packages/dotenv-0.9.9.dist-info/INSTALLER delete mode 100644 venv/lib/python3.12/site-packages/dotenv-0.9.9.dist-info/LICENSE delete mode 100644 venv/lib/python3.12/site-packages/dotenv-0.9.9.dist-info/METADATA delete mode 100644 venv/lib/python3.12/site-packages/dotenv-0.9.9.dist-info/RECORD delete mode 100644 venv/lib/python3.12/site-packages/dotenv-0.9.9.dist-info/REQUESTED delete mode 100644 venv/lib/python3.12/site-packages/dotenv-0.9.9.dist-info/WHEEL delete mode 100644 venv/lib/python3.12/site-packages/dotenv-0.9.9.dist-info/top_level.txt delete mode 100644 venv/lib/python3.12/site-packages/dotenv/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/dotenv/__main__.py delete mode 100644 venv/lib/python3.12/site-packages/dotenv/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/dotenv/__pycache__/__main__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/dotenv/__pycache__/cli.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/dotenv/__pycache__/ipython.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/dotenv/__pycache__/main.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/dotenv/__pycache__/parser.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/dotenv/__pycache__/variables.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/dotenv/__pycache__/version.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/dotenv/cli.py delete mode 100644 venv/lib/python3.12/site-packages/dotenv/ipython.py delete mode 100644 venv/lib/python3.12/site-packages/dotenv/main.py delete mode 100644 venv/lib/python3.12/site-packages/dotenv/parser.py delete mode 100644 venv/lib/python3.12/site-packages/dotenv/py.typed delete mode 100644 venv/lib/python3.12/site-packages/dotenv/variables.py delete mode 100644 venv/lib/python3.12/site-packages/dotenv/version.py delete mode 100644 venv/lib/python3.12/site-packages/frozenlist-1.7.0.dist-info/INSTALLER delete mode 100644 venv/lib/python3.12/site-packages/frozenlist-1.7.0.dist-info/METADATA delete mode 100644 venv/lib/python3.12/site-packages/frozenlist-1.7.0.dist-info/RECORD delete mode 100644 venv/lib/python3.12/site-packages/frozenlist-1.7.0.dist-info/WHEEL delete mode 100644 venv/lib/python3.12/site-packages/frozenlist-1.7.0.dist-info/licenses/LICENSE delete mode 100644 venv/lib/python3.12/site-packages/frozenlist-1.7.0.dist-info/top_level.txt delete mode 100644 venv/lib/python3.12/site-packages/frozenlist/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/frozenlist/__init__.pyi delete mode 100644 venv/lib/python3.12/site-packages/frozenlist/__pycache__/__init__.cpython-312.pyc delete mode 100755 venv/lib/python3.12/site-packages/frozenlist/_frozenlist.cpython-312-x86_64-linux-gnu.so delete mode 100644 venv/lib/python3.12/site-packages/frozenlist/_frozenlist.pyx delete mode 100644 venv/lib/python3.12/site-packages/frozenlist/py.typed delete mode 100644 venv/lib/python3.12/site-packages/h11-0.16.0.dist-info/INSTALLER delete mode 100644 venv/lib/python3.12/site-packages/h11-0.16.0.dist-info/METADATA delete mode 100644 venv/lib/python3.12/site-packages/h11-0.16.0.dist-info/RECORD delete mode 100644 venv/lib/python3.12/site-packages/h11-0.16.0.dist-info/WHEEL delete mode 100644 venv/lib/python3.12/site-packages/h11-0.16.0.dist-info/licenses/LICENSE.txt delete mode 100644 venv/lib/python3.12/site-packages/h11-0.16.0.dist-info/top_level.txt delete mode 100644 venv/lib/python3.12/site-packages/h11/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/h11/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/h11/__pycache__/_abnf.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/h11/__pycache__/_connection.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/h11/__pycache__/_events.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/h11/__pycache__/_headers.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/h11/__pycache__/_readers.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/h11/__pycache__/_receivebuffer.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/h11/__pycache__/_state.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/h11/__pycache__/_util.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/h11/__pycache__/_version.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/h11/__pycache__/_writers.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/h11/_abnf.py delete mode 100644 venv/lib/python3.12/site-packages/h11/_connection.py delete mode 100644 venv/lib/python3.12/site-packages/h11/_events.py delete mode 100644 venv/lib/python3.12/site-packages/h11/_headers.py delete mode 100644 venv/lib/python3.12/site-packages/h11/_readers.py delete mode 100644 venv/lib/python3.12/site-packages/h11/_receivebuffer.py delete mode 100644 venv/lib/python3.12/site-packages/h11/_state.py delete mode 100644 venv/lib/python3.12/site-packages/h11/_util.py delete mode 100644 venv/lib/python3.12/site-packages/h11/_version.py delete mode 100644 venv/lib/python3.12/site-packages/h11/_writers.py delete mode 100644 venv/lib/python3.12/site-packages/h11/py.typed delete mode 100644 venv/lib/python3.12/site-packages/httpcore-1.0.9.dist-info/INSTALLER delete mode 100644 venv/lib/python3.12/site-packages/httpcore-1.0.9.dist-info/METADATA delete mode 100644 venv/lib/python3.12/site-packages/httpcore-1.0.9.dist-info/RECORD delete mode 100644 venv/lib/python3.12/site-packages/httpcore-1.0.9.dist-info/WHEEL delete mode 100644 venv/lib/python3.12/site-packages/httpcore-1.0.9.dist-info/licenses/LICENSE.md delete mode 100644 venv/lib/python3.12/site-packages/httpcore/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/httpcore/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpcore/__pycache__/_api.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpcore/__pycache__/_exceptions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpcore/__pycache__/_models.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpcore/__pycache__/_ssl.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpcore/__pycache__/_synchronization.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpcore/__pycache__/_trace.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpcore/__pycache__/_utils.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_api.py delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_async/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/connection.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/connection_pool.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/http11.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/http2.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/http_proxy.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/interfaces.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/socks_proxy.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_async/connection.py delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_async/connection_pool.py delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_async/http11.py delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_async/http2.py delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_async/http_proxy.py delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_async/interfaces.py delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_async/socks_proxy.py delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_backends/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/anyio.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/auto.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/base.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/mock.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/sync.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/trio.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_backends/anyio.py delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_backends/auto.py delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_backends/base.py delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_backends/mock.py delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_backends/sync.py delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_backends/trio.py delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_exceptions.py delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_models.py delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_ssl.py delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_sync/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/connection.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/connection_pool.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/http11.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/http2.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/http_proxy.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/interfaces.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/socks_proxy.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_sync/connection.py delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_sync/connection_pool.py delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_sync/http11.py delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_sync/http2.py delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_sync/http_proxy.py delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_sync/interfaces.py delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_sync/socks_proxy.py delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_synchronization.py delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_trace.py delete mode 100644 venv/lib/python3.12/site-packages/httpcore/_utils.py delete mode 100644 venv/lib/python3.12/site-packages/httpcore/py.typed delete mode 100644 venv/lib/python3.12/site-packages/httpx-0.28.1.dist-info/INSTALLER delete mode 100644 venv/lib/python3.12/site-packages/httpx-0.28.1.dist-info/METADATA delete mode 100644 venv/lib/python3.12/site-packages/httpx-0.28.1.dist-info/RECORD delete mode 100644 venv/lib/python3.12/site-packages/httpx-0.28.1.dist-info/WHEEL delete mode 100644 venv/lib/python3.12/site-packages/httpx-0.28.1.dist-info/entry_points.txt delete mode 100644 venv/lib/python3.12/site-packages/httpx-0.28.1.dist-info/licenses/LICENSE.md delete mode 100644 venv/lib/python3.12/site-packages/httpx/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/httpx/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpx/__pycache__/__version__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpx/__pycache__/_api.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpx/__pycache__/_auth.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpx/__pycache__/_client.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpx/__pycache__/_config.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpx/__pycache__/_content.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpx/__pycache__/_decoders.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpx/__pycache__/_exceptions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpx/__pycache__/_main.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpx/__pycache__/_models.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpx/__pycache__/_multipart.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpx/__pycache__/_status_codes.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpx/__pycache__/_types.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpx/__pycache__/_urlparse.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpx/__pycache__/_urls.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpx/__pycache__/_utils.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpx/__version__.py delete mode 100644 venv/lib/python3.12/site-packages/httpx/_api.py delete mode 100644 venv/lib/python3.12/site-packages/httpx/_auth.py delete mode 100644 venv/lib/python3.12/site-packages/httpx/_client.py delete mode 100644 venv/lib/python3.12/site-packages/httpx/_config.py delete mode 100644 venv/lib/python3.12/site-packages/httpx/_content.py delete mode 100644 venv/lib/python3.12/site-packages/httpx/_decoders.py delete mode 100644 venv/lib/python3.12/site-packages/httpx/_exceptions.py delete mode 100644 venv/lib/python3.12/site-packages/httpx/_main.py delete mode 100644 venv/lib/python3.12/site-packages/httpx/_models.py delete mode 100644 venv/lib/python3.12/site-packages/httpx/_multipart.py delete mode 100644 venv/lib/python3.12/site-packages/httpx/_status_codes.py delete mode 100644 venv/lib/python3.12/site-packages/httpx/_transports/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/asgi.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/base.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/default.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/mock.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/wsgi.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/httpx/_transports/asgi.py delete mode 100644 venv/lib/python3.12/site-packages/httpx/_transports/base.py delete mode 100644 venv/lib/python3.12/site-packages/httpx/_transports/default.py delete mode 100644 venv/lib/python3.12/site-packages/httpx/_transports/mock.py delete mode 100644 venv/lib/python3.12/site-packages/httpx/_transports/wsgi.py delete mode 100644 venv/lib/python3.12/site-packages/httpx/_types.py delete mode 100644 venv/lib/python3.12/site-packages/httpx/_urlparse.py delete mode 100644 venv/lib/python3.12/site-packages/httpx/_urls.py delete mode 100644 venv/lib/python3.12/site-packages/httpx/_utils.py delete mode 100644 venv/lib/python3.12/site-packages/httpx/py.typed delete mode 100644 venv/lib/python3.12/site-packages/idna-3.10.dist-info/INSTALLER delete mode 100644 venv/lib/python3.12/site-packages/idna-3.10.dist-info/LICENSE.md delete mode 100644 venv/lib/python3.12/site-packages/idna-3.10.dist-info/METADATA delete mode 100644 venv/lib/python3.12/site-packages/idna-3.10.dist-info/RECORD delete mode 100644 venv/lib/python3.12/site-packages/idna-3.10.dist-info/WHEEL delete mode 100644 venv/lib/python3.12/site-packages/idna/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/idna/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/idna/__pycache__/codec.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/idna/__pycache__/compat.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/idna/__pycache__/core.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/idna/__pycache__/idnadata.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/idna/__pycache__/intranges.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/idna/__pycache__/package_data.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/idna/__pycache__/uts46data.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/idna/codec.py delete mode 100644 venv/lib/python3.12/site-packages/idna/compat.py delete mode 100644 venv/lib/python3.12/site-packages/idna/core.py delete mode 100644 venv/lib/python3.12/site-packages/idna/idnadata.py delete mode 100644 venv/lib/python3.12/site-packages/idna/intranges.py delete mode 100644 venv/lib/python3.12/site-packages/idna/package_data.py delete mode 100644 venv/lib/python3.12/site-packages/idna/py.typed delete mode 100644 venv/lib/python3.12/site-packages/idna/uts46data.py delete mode 100644 venv/lib/python3.12/site-packages/multidict-6.6.3.dist-info/INSTALLER delete mode 100644 venv/lib/python3.12/site-packages/multidict-6.6.3.dist-info/METADATA delete mode 100644 venv/lib/python3.12/site-packages/multidict-6.6.3.dist-info/RECORD delete mode 100644 venv/lib/python3.12/site-packages/multidict-6.6.3.dist-info/WHEEL delete mode 100644 venv/lib/python3.12/site-packages/multidict-6.6.3.dist-info/licenses/LICENSE delete mode 100644 venv/lib/python3.12/site-packages/multidict-6.6.3.dist-info/top_level.txt delete mode 100644 venv/lib/python3.12/site-packages/multidict/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/multidict/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/multidict/__pycache__/_abc.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/multidict/__pycache__/_compat.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/multidict/__pycache__/_multidict_py.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/multidict/_abc.py delete mode 100644 venv/lib/python3.12/site-packages/multidict/_compat.py delete mode 100755 venv/lib/python3.12/site-packages/multidict/_multidict.cpython-312-x86_64-linux-gnu.so delete mode 100644 venv/lib/python3.12/site-packages/multidict/_multidict_py.py delete mode 100644 venv/lib/python3.12/site-packages/multidict/py.typed delete mode 100644 venv/lib/python3.12/site-packages/pip-24.0.dist-info/AUTHORS.txt delete mode 100644 venv/lib/python3.12/site-packages/pip-24.0.dist-info/INSTALLER delete mode 100644 venv/lib/python3.12/site-packages/pip-24.0.dist-info/LICENSE.txt delete mode 100644 venv/lib/python3.12/site-packages/pip-24.0.dist-info/METADATA delete mode 100644 venv/lib/python3.12/site-packages/pip-24.0.dist-info/RECORD delete mode 100644 venv/lib/python3.12/site-packages/pip-24.0.dist-info/REQUESTED delete mode 100644 venv/lib/python3.12/site-packages/pip-24.0.dist-info/WHEEL delete mode 100644 venv/lib/python3.12/site-packages/pip-24.0.dist-info/entry_points.txt delete mode 100644 venv/lib/python3.12/site-packages/pip-24.0.dist-info/top_level.txt delete mode 100644 venv/lib/python3.12/site-packages/pip/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/__main__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/__pip-runner__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/__pycache__/__main__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/__pycache__/__pip-runner__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/__pycache__/build_env.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/__pycache__/cache.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/__pycache__/configuration.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/__pycache__/exceptions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/__pycache__/main.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/__pycache__/pyproject.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/build_env.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cache.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/parser.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/autocompletion.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/base_command.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/command_context.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/main.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/main_parser.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/req_command.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/spinners.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/status_codes.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/cache.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/check.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/completion.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/debug.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/download.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/hash.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/help.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/index.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/install.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/list.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/search.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/show.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/cache.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/check.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/completion.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/configuration.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/debug.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/download.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/freeze.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/hash.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/help.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/index.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/inspect.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/install.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/list.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/search.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/show.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/uninstall.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/wheel.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/configuration.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/distributions/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/base.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/distributions/base.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/distributions/installed.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/exceptions.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/index/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/collector.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/sources.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/index/collector.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/index/package_finder.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/index/sources.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/locations/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/base.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/locations/_distutils.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/locations/_sysconfig.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/locations/base.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/main.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/base.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/_json.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/base.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_compat.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_dists.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/candidate.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/format_control.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/index.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/link.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/scheme.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/target_python.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/wheel.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/candidate.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/direct_url.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/format_control.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/index.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/installation_report.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/link.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/scheme.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/search_scope.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/selection_prefs.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/target_python.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/wheel.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/auth.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/cache.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/download.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/session.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/utils.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/auth.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/cache.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/download.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/lazy_wheel.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/session.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/utils.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/check.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/build/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/build/build_tracker.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_editable.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_legacy.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_editable.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_legacy.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/check.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/freeze.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/install/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/install/editable_legacy.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/pyproject.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/constructors.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_file.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_install.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_set.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/constructors.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/req_file.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/req_set.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/base.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/base.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/base.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/provider.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/reporter.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/self_outdated_check.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_log.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compat.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/logging.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/misc.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/models.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/urls.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/_jaraco_text.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/_log.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/appdirs.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/compat.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/compatibility_tags.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/datetime.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/deprecation.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/egg_link.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/encoding.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/entrypoints.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/filetypes.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/glibc.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/hashes.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/logging.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/misc.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/models.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/packaging.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/setuptools_build.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/urls.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/virtualenv.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/wheel.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/git.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/bazaar.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/git.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/mercurial.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/subversion.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/versioncontrol.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/six.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/_cmd.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/cache.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/filewrapper.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/serialize.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/wrapper.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/certifi/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/certifi/__main__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/certifi/cacert.pem delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/certifi/core.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/macromanprober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/resultdict.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/big5freq.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/big5prober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/chardistribution.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetgroupprober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetprober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/chardetect.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachine.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachinedict.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/cp949prober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/enums.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/escprober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/escsm.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/eucjpprober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrfreq.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrprober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwfreq.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwprober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312freq.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312prober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/hebrewprober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/jisfreq.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/johabfreq.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/johabprober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/jpcntx.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/langbulgarianmodel.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/langgreekmodel.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/langhebrewmodel.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/langhungarianmodel.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/langrussianmodel.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/langthaimodel.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/langturkishmodel.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/latin1prober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/macromanprober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcharsetprober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcsgroupprober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcssm.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/languages.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/resultdict.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcharsetprober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcsgroupprober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/sjisprober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/universaldetector.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/utf1632prober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/utf8prober.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/chardet/version.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/ansi.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/ansitowin32.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/initialise.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansi_test.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/initialise_test.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/isatty_test.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/utils.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/winterm_test.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/win32.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/colorama/winterm.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/compat.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/database.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/index.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/locators.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/manifest.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/markers.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/metadata.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/resources.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/version.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/wheel.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distro/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distro/__main__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distro/distro.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/core.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/codec.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/compat.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/core.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/idnadata.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/intranges.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/package_data.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/uts46data.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/msgpack/exceptions.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/msgpack/ext.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__about__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/_manylinux.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/_structures.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/requirements.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/specifiers.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/tags.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/utils.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/version.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__main__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/android.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/api.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/macos.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/version.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/windows.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__main__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/cmdline.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/console.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/filter.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatter.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/_mapping.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/bbcode.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/groff.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/html.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/img.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/irc.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/latex.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/other.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/rtf.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/svg.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal256.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/_mapping.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/python.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/modeline.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/plugin.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/regexopt.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/scanner.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/sphinxext.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/style.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/token.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/unistring.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/util.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/exceptions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/actions.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/common.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/core.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/exceptions.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/helpers.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/results.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/testing.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/unicode.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/util.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_compat.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/api.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/help.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/models.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__version__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/_internal_utils.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/adapters.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/api.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/auth.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/certs.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/compat.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/cookies.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/exceptions.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/help.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/hooks.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/models.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/packages.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/sessions.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/status_codes.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/structures.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/utils.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/providers.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/reporters.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/structs.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__main__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/align.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/box.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/console.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/control.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/json.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/region.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/status.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/style.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/table.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/text.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_cell_widths.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_codes.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_replace.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_export_format.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_extension.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_fileno.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_inspect.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_log_render.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_loop.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_null_file.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_palettes.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_pick.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_spinners.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_stack.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_timer.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows_renderer.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/abc.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/align.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/ansi.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/bar.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/box.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/cells.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/color_triplet.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/columns.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/console.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/constrain.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/containers.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/control.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/default_styles.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/diagnose.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/emoji.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/errors.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/file_proxy.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/filesize.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/json.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/jupyter.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/layout.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/live.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/live_render.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/logging.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/markup.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/measure.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/padding.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/pager.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/palette.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/panel.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/progress.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/progress_bar.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/prompt.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/protocol.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/region.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/repr.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/rule.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/scope.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/screen.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/segment.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/spinner.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/status.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/style.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/styled.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/syntax.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/table.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/terminal_theme.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/text.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/theme.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/themes.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/traceback.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/tree.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/six.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/_asyncio.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/_utils.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/after.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/before.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/before_sleep.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/nap.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/retry.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/stop.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/tornadoweb.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tenacity/wait.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tomli/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tomli/_parser.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tomli/_re.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tomli/_types.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_api.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_macos.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_openssl.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_windows.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/_api.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/_macos.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/_openssl.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/_ssl_constants.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/_windows.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/typing_extensions.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/_collections.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/_version.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/connection.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/connectionpool.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/appengine.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/securetransport.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/socks.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/exceptions.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/fields.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/filepost.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/six.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/poolmanager.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/request.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/response.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/connection.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/proxy.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/queue.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/request.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/response.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/retry.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssltransport.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/timeout.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/url.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/wait.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/vendor.txt delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/webencodings/labels.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/webencodings/mklabels.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py delete mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/webencodings/x_user_defined.py delete mode 100644 venv/lib/python3.12/site-packages/pip/py.typed delete mode 100644 venv/lib/python3.12/site-packages/propcache-0.3.2.dist-info/INSTALLER delete mode 100644 venv/lib/python3.12/site-packages/propcache-0.3.2.dist-info/METADATA delete mode 100644 venv/lib/python3.12/site-packages/propcache-0.3.2.dist-info/RECORD delete mode 100644 venv/lib/python3.12/site-packages/propcache-0.3.2.dist-info/WHEEL delete mode 100644 venv/lib/python3.12/site-packages/propcache-0.3.2.dist-info/licenses/LICENSE delete mode 100644 venv/lib/python3.12/site-packages/propcache-0.3.2.dist-info/licenses/NOTICE delete mode 100644 venv/lib/python3.12/site-packages/propcache-0.3.2.dist-info/top_level.txt delete mode 100644 venv/lib/python3.12/site-packages/propcache/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/propcache/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/propcache/__pycache__/_helpers.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/propcache/__pycache__/_helpers_py.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/propcache/__pycache__/api.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/propcache/_helpers.py delete mode 100755 venv/lib/python3.12/site-packages/propcache/_helpers_c.cpython-312-x86_64-linux-gnu.so delete mode 100644 venv/lib/python3.12/site-packages/propcache/_helpers_c.pyx delete mode 100644 venv/lib/python3.12/site-packages/propcache/_helpers_py.py delete mode 100644 venv/lib/python3.12/site-packages/propcache/api.py delete mode 100644 venv/lib/python3.12/site-packages/propcache/py.typed delete mode 100644 venv/lib/python3.12/site-packages/python_dotenv-1.1.1.dist-info/INSTALLER delete mode 100644 venv/lib/python3.12/site-packages/python_dotenv-1.1.1.dist-info/METADATA delete mode 100644 venv/lib/python3.12/site-packages/python_dotenv-1.1.1.dist-info/RECORD delete mode 100644 venv/lib/python3.12/site-packages/python_dotenv-1.1.1.dist-info/WHEEL delete mode 100644 venv/lib/python3.12/site-packages/python_dotenv-1.1.1.dist-info/entry_points.txt delete mode 100644 venv/lib/python3.12/site-packages/python_dotenv-1.1.1.dist-info/licenses/LICENSE delete mode 100644 venv/lib/python3.12/site-packages/python_dotenv-1.1.1.dist-info/top_level.txt delete mode 100644 venv/lib/python3.12/site-packages/python_telegram_bot-22.2.dist-info/INSTALLER delete mode 100644 venv/lib/python3.12/site-packages/python_telegram_bot-22.2.dist-info/METADATA delete mode 100644 venv/lib/python3.12/site-packages/python_telegram_bot-22.2.dist-info/RECORD delete mode 100644 venv/lib/python3.12/site-packages/python_telegram_bot-22.2.dist-info/REQUESTED delete mode 100644 venv/lib/python3.12/site-packages/python_telegram_bot-22.2.dist-info/WHEEL delete mode 100644 venv/lib/python3.12/site-packages/python_telegram_bot-22.2.dist-info/licenses/LICENSE delete mode 100644 venv/lib/python3.12/site-packages/python_telegram_bot-22.2.dist-info/licenses/LICENSE.dual delete mode 100644 venv/lib/python3.12/site-packages/python_telegram_bot-22.2.dist-info/licenses/LICENSE.lesser delete mode 100644 venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/INSTALLER delete mode 100644 venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/LICENSE delete mode 100644 venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/LICENSE.APACHE2 delete mode 100644 venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/LICENSE.MIT delete mode 100644 venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/METADATA delete mode 100644 venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/RECORD delete mode 100644 venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/WHEEL delete mode 100644 venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/top_level.txt delete mode 100644 venv/lib/python3.12/site-packages/sniffio/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/sniffio/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/sniffio/__pycache__/_impl.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/sniffio/__pycache__/_version.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/sniffio/_impl.py delete mode 100644 venv/lib/python3.12/site-packages/sniffio/_tests/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/sniffio/_tests/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/sniffio/_tests/__pycache__/test_sniffio.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/sniffio/_tests/test_sniffio.py delete mode 100644 venv/lib/python3.12/site-packages/sniffio/_version.py delete mode 100644 venv/lib/python3.12/site-packages/sniffio/py.typed delete mode 100644 venv/lib/python3.12/site-packages/telegram/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/__main__.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/__main__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_birthdate.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_bot.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_botcommand.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_botcommandscope.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_botdescription.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_botname.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_business.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_callbackquery.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_chat.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_chatadministratorrights.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_chatbackground.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_chatboost.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_chatfullinfo.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_chatinvitelink.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_chatjoinrequest.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_chatlocation.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_chatmember.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_chatmemberupdated.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_chatpermissions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_choseninlineresult.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_copytextbutton.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_dice.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_forcereply.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_forumtopic.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_gifts.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_giveaway.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_keyboardbutton.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_keyboardbuttonpolltype.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_keyboardbuttonrequest.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_linkpreviewoptions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_loginurl.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_menubutton.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_message.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_messageautodeletetimerchanged.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_messageentity.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_messageid.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_messageorigin.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_messagereactionupdated.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_ownedgift.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_paidmedia.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_paidmessagepricechanged.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_poll.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_proximityalerttriggered.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_reaction.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_reply.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_replykeyboardmarkup.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_replykeyboardremove.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_sentwebappmessage.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_shared.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_story.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_storyarea.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_switchinlinequerychosenchat.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_telegramobject.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_uniquegift.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_update.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_user.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_userprofilephotos.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_version.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_videochat.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_webappdata.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_webappinfo.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_webhookinfo.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/_writeaccessallowed.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/constants.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/error.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/helpers.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/__pycache__/warnings.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_birthdate.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_bot.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_botcommand.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_botcommandscope.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_botdescription.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_botname.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_business.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_callbackquery.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_chat.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_chatadministratorrights.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_chatbackground.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_chatboost.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_chatfullinfo.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_chatinvitelink.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_chatjoinrequest.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_chatlocation.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_chatmember.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_chatmemberupdated.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_chatpermissions.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_choseninlineresult.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_copytextbutton.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_dice.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/__pycache__/_basemedium.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/__pycache__/_basethumbedmedium.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/__pycache__/_inputstorycontent.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/__pycache__/animation.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/__pycache__/audio.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/__pycache__/chatphoto.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/__pycache__/contact.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/__pycache__/document.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/__pycache__/file.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/__pycache__/inputfile.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/__pycache__/inputmedia.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/__pycache__/inputprofilephoto.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/__pycache__/inputsticker.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/__pycache__/location.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/__pycache__/photosize.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/__pycache__/sticker.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/__pycache__/venue.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/__pycache__/video.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/__pycache__/videonote.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/__pycache__/voice.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/_basemedium.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/_basethumbedmedium.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/_inputstorycontent.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/animation.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/audio.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/chatphoto.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/contact.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/document.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/file.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/inputfile.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/inputmedia.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/inputprofilephoto.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/inputsticker.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/location.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/photosize.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/sticker.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/venue.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/video.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/videonote.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_files/voice.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_forcereply.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_forumtopic.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_games/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_games/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_games/__pycache__/callbackgame.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_games/__pycache__/game.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_games/__pycache__/gamehighscore.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_games/callbackgame.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_games/game.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_games/gamehighscore.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_gifts.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_giveaway.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinekeyboardbutton.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinekeyboardmarkup.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequery.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresult.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultarticle.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultaudio.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultcachedaudio.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultcacheddocument.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultcachedgif.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultcachedmpeg4gif.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultcachedphoto.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultcachedsticker.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultcachedvideo.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultcachedvoice.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultcontact.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultdocument.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultgame.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultgif.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultlocation.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultmpeg4gif.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultphoto.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultsbutton.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultvenue.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultvideo.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultvoice.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inputcontactmessagecontent.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inputinvoicemessagecontent.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inputlocationmessagecontent.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inputmessagecontent.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inputtextmessagecontent.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inputvenuemessagecontent.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/preparedinlinemessage.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/inlinekeyboardbutton.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/inlinekeyboardmarkup.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/inlinequery.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresult.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultarticle.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultaudio.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcachedaudio.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcacheddocument.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcachedgif.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcachedmpeg4gif.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcachedphoto.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcachedsticker.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcachedvideo.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcachedvoice.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcontact.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultdocument.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultgame.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultgif.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultlocation.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultmpeg4gif.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultphoto.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultsbutton.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultvenue.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultvideo.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultvoice.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/inputcontactmessagecontent.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/inputinvoicemessagecontent.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/inputlocationmessagecontent.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/inputmessagecontent.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/inputtextmessagecontent.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/inputvenuemessagecontent.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_inline/preparedinlinemessage.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_keyboardbutton.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_keyboardbuttonpolltype.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_keyboardbuttonrequest.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_linkpreviewoptions.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_loginurl.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_menubutton.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_message.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_messageautodeletetimerchanged.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_messageentity.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_messageid.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_messageorigin.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_messagereactionupdated.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_ownedgift.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_paidmedia.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_paidmessagepricechanged.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_passport/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_passport/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_passport/__pycache__/credentials.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_passport/__pycache__/data.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_passport/__pycache__/encryptedpassportelement.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_passport/__pycache__/passportdata.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_passport/__pycache__/passportelementerrors.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_passport/__pycache__/passportfile.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_passport/credentials.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_passport/data.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_passport/encryptedpassportelement.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_passport/passportdata.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_passport/passportelementerrors.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_passport/passportfile.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_payment/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_payment/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_payment/__pycache__/invoice.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_payment/__pycache__/labeledprice.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_payment/__pycache__/orderinfo.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_payment/__pycache__/precheckoutquery.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_payment/__pycache__/refundedpayment.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_payment/__pycache__/shippingaddress.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_payment/__pycache__/shippingoption.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_payment/__pycache__/shippingquery.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_payment/__pycache__/successfulpayment.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_payment/invoice.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_payment/labeledprice.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_payment/orderinfo.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_payment/precheckoutquery.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_payment/refundedpayment.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_payment/shippingaddress.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_payment/shippingoption.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_payment/shippingquery.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_payment/stars/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_payment/stars/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_payment/stars/__pycache__/affiliateinfo.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_payment/stars/__pycache__/revenuewithdrawalstate.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_payment/stars/__pycache__/staramount.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_payment/stars/__pycache__/startransactions.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_payment/stars/__pycache__/transactionpartner.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_payment/stars/affiliateinfo.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_payment/stars/revenuewithdrawalstate.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_payment/stars/staramount.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_payment/stars/startransactions.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_payment/stars/transactionpartner.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_payment/successfulpayment.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_poll.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_proximityalerttriggered.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_reaction.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_reply.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_replykeyboardmarkup.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_replykeyboardremove.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_sentwebappmessage.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_shared.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_story.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_storyarea.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_switchinlinequerychosenchat.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_telegramobject.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_uniquegift.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_update.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_user.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_userprofilephotos.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_utils/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/argumentparsing.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/datetime.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/defaultvalue.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/entities.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/enum.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/files.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/logging.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/markup.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/repr.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/strings.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/types.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/warnings.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/warnings_transition.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/_utils/argumentparsing.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_utils/datetime.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_utils/defaultvalue.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_utils/entities.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_utils/enum.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_utils/files.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_utils/logging.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_utils/markup.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_utils/repr.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_utils/strings.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_utils/types.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_utils/warnings.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_utils/warnings_transition.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_version.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_videochat.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_webappdata.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_webappinfo.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_webhookinfo.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/_writeaccessallowed.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/constants.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/error.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_aioratelimiter.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_application.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_applicationbuilder.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_basepersistence.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_baseratelimiter.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_baseupdateprocessor.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_callbackcontext.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_callbackdatacache.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_contexttypes.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_defaults.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_dictpersistence.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_extbot.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_jobqueue.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_picklepersistence.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_updater.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/__pycache__/filters.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_aioratelimiter.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_application.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_applicationbuilder.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_basepersistence.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_baseratelimiter.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_baseupdateprocessor.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_callbackcontext.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_callbackdatacache.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_contexttypes.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_defaults.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_dictpersistence.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_extbot.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/basehandler.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/businessconnectionhandler.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/businessmessagesdeletedhandler.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/callbackqueryhandler.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/chatboosthandler.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/chatjoinrequesthandler.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/chatmemberhandler.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/choseninlineresulthandler.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/commandhandler.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/conversationhandler.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/inlinequeryhandler.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/messagehandler.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/messagereactionhandler.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/paidmediapurchasedhandler.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/pollanswerhandler.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/pollhandler.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/precheckoutqueryhandler.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/prefixhandler.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/shippingqueryhandler.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/stringcommandhandler.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/stringregexhandler.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/typehandler.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/basehandler.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/businessconnectionhandler.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/businessmessagesdeletedhandler.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/callbackqueryhandler.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/chatboosthandler.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/chatjoinrequesthandler.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/chatmemberhandler.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/choseninlineresulthandler.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/commandhandler.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/conversationhandler.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/inlinequeryhandler.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/messagehandler.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/messagereactionhandler.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/paidmediapurchasedhandler.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/pollanswerhandler.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/pollhandler.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/precheckoutqueryhandler.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/prefixhandler.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/shippingqueryhandler.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/stringcommandhandler.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/stringregexhandler.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_handlers/typehandler.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_jobqueue.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_picklepersistence.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_updater.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_utils/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_utils/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_utils/__pycache__/_update_parsing.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_utils/__pycache__/asyncio.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_utils/__pycache__/networkloop.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_utils/__pycache__/stack.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_utils/__pycache__/trackingdict.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_utils/__pycache__/types.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_utils/__pycache__/webhookhandler.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_utils/_update_parsing.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_utils/asyncio.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_utils/networkloop.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_utils/stack.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_utils/trackingdict.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_utils/types.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/_utils/webhookhandler.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/ext/filters.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/helpers.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/py.typed delete mode 100644 venv/lib/python3.12/site-packages/telegram/request/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/request/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/request/__pycache__/_baserequest.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/request/__pycache__/_httpxrequest.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/request/__pycache__/_requestdata.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/request/__pycache__/_requestparameter.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/telegram/request/_baserequest.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/request/_httpxrequest.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/request/_requestdata.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/request/_requestparameter.py delete mode 100644 venv/lib/python3.12/site-packages/telegram/warnings.py delete mode 100644 venv/lib/python3.12/site-packages/typing_extensions-4.14.1.dist-info/INSTALLER delete mode 100644 venv/lib/python3.12/site-packages/typing_extensions-4.14.1.dist-info/METADATA delete mode 100644 venv/lib/python3.12/site-packages/typing_extensions-4.14.1.dist-info/RECORD delete mode 100644 venv/lib/python3.12/site-packages/typing_extensions-4.14.1.dist-info/WHEEL delete mode 100644 venv/lib/python3.12/site-packages/typing_extensions-4.14.1.dist-info/licenses/LICENSE delete mode 100644 venv/lib/python3.12/site-packages/typing_extensions.py delete mode 100644 venv/lib/python3.12/site-packages/yarl-1.20.1.dist-info/INSTALLER delete mode 100644 venv/lib/python3.12/site-packages/yarl-1.20.1.dist-info/METADATA delete mode 100644 venv/lib/python3.12/site-packages/yarl-1.20.1.dist-info/RECORD delete mode 100644 venv/lib/python3.12/site-packages/yarl-1.20.1.dist-info/WHEEL delete mode 100644 venv/lib/python3.12/site-packages/yarl-1.20.1.dist-info/licenses/LICENSE delete mode 100644 venv/lib/python3.12/site-packages/yarl-1.20.1.dist-info/licenses/NOTICE delete mode 100644 venv/lib/python3.12/site-packages/yarl-1.20.1.dist-info/top_level.txt delete mode 100644 venv/lib/python3.12/site-packages/yarl/__init__.py delete mode 100644 venv/lib/python3.12/site-packages/yarl/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/yarl/__pycache__/_parse.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/yarl/__pycache__/_path.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/yarl/__pycache__/_query.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/yarl/__pycache__/_quoters.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/yarl/__pycache__/_quoting.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/yarl/__pycache__/_quoting_py.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/yarl/__pycache__/_url.cpython-312.pyc delete mode 100644 venv/lib/python3.12/site-packages/yarl/_parse.py delete mode 100644 venv/lib/python3.12/site-packages/yarl/_path.py delete mode 100644 venv/lib/python3.12/site-packages/yarl/_query.py delete mode 100644 venv/lib/python3.12/site-packages/yarl/_quoters.py delete mode 100644 venv/lib/python3.12/site-packages/yarl/_quoting.py delete mode 100755 venv/lib/python3.12/site-packages/yarl/_quoting_c.cpython-312-x86_64-linux-gnu.so delete mode 100644 venv/lib/python3.12/site-packages/yarl/_quoting_c.pyx delete mode 100644 venv/lib/python3.12/site-packages/yarl/_quoting_py.py delete mode 100644 venv/lib/python3.12/site-packages/yarl/_url.py delete mode 100644 venv/lib/python3.12/site-packages/yarl/py.typed delete mode 120000 venv/lib64 delete mode 100644 venv/pyvenv.cfg diff --git a/.gitignore b/.gitignore index 50a042b..3c56d01 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ -./venv +/venv/ +.venv/ .env \ No newline at end of file diff --git a/venv/bin/Activate.ps1 b/venv/bin/Activate.ps1 deleted file mode 100644 index b49d77b..0000000 --- a/venv/bin/Activate.ps1 +++ /dev/null @@ -1,247 +0,0 @@ -<# -.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 deleted file mode 100644 index bc276ad..0000000 --- a/venv/bin/activate +++ /dev/null @@ -1,70 +0,0 @@ -# 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 - - # Call hash to forget past commands. Without forgetting - # past commands the $PATH changes we made may not be respected - hash -r 2> /dev/null - - 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 - -# on Windows, a path can contain colons and backslashes and has to be converted: -if [ "${OSTYPE:-}" = "cygwin" ] || [ "${OSTYPE:-}" = "msys" ] ; then - # transform D:\path\to\venv to /d/path/to/venv on MSYS - # and to /cygdrive/d/path/to/venv on Cygwin - export VIRTUAL_ENV=$(cygpath /home/matsv/Documents/telegram-sticker-downloader/venv) -else - # use the path as-is - export VIRTUAL_ENV=/home/matsv/Documents/telegram-sticker-downloader/venv -fi - -_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 - -# Call hash to forget past commands. Without forgetting -# past commands the $PATH changes we made may not be respected -hash -r 2> /dev/null diff --git a/venv/bin/activate.csh b/venv/bin/activate.csh deleted file mode 100644 index 8090fbc..0000000 --- a/venv/bin/activate.csh +++ /dev/null @@ -1,27 +0,0 @@ -# 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/matsv/Documents/telegram-sticker-downloader/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 deleted file mode 100644 index b69df2b..0000000 --- a/venv/bin/activate.fish +++ /dev/null @@ -1,69 +0,0 @@ -# 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/matsv/Documents/telegram-sticker-downloader/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/dotenv b/venv/bin/dotenv deleted file mode 100755 index 6e271a8..0000000 --- a/venv/bin/dotenv +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/matsv/Documents/telegram-sticker-downloader/venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from dotenv.__main__ import cli -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(cli()) diff --git a/venv/bin/httpx b/venv/bin/httpx deleted file mode 100755 index 3c3c47c..0000000 --- a/venv/bin/httpx +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/matsv/Documents/telegram-sticker-downloader/venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from httpx 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/pip b/venv/bin/pip deleted file mode 100755 index e0ae56a..0000000 --- a/venv/bin/pip +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/matsv/Documents/telegram-sticker-downloader/venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from pip._internal.cli.main import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/venv/bin/pip3 b/venv/bin/pip3 deleted file mode 100755 index e0ae56a..0000000 --- a/venv/bin/pip3 +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/matsv/Documents/telegram-sticker-downloader/venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from pip._internal.cli.main import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/venv/bin/pip3.12 b/venv/bin/pip3.12 deleted file mode 100755 index e0ae56a..0000000 --- a/venv/bin/pip3.12 +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/matsv/Documents/telegram-sticker-downloader/venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from pip._internal.cli.main import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/venv/bin/python b/venv/bin/python deleted file mode 120000 index b8a0adb..0000000 --- a/venv/bin/python +++ /dev/null @@ -1 +0,0 @@ -python3 \ No newline at end of file diff --git a/venv/bin/python3 b/venv/bin/python3 deleted file mode 120000 index ae65fda..0000000 --- a/venv/bin/python3 +++ /dev/null @@ -1 +0,0 @@ -/usr/bin/python3 \ No newline at end of file diff --git a/venv/bin/python3.12 b/venv/bin/python3.12 deleted file mode 120000 index b8a0adb..0000000 --- a/venv/bin/python3.12 +++ /dev/null @@ -1 +0,0 @@ -python3 \ No newline at end of file diff --git a/venv/lib/python3.12/site-packages/__pycache__/typing_extensions.cpython-312.pyc b/venv/lib/python3.12/site-packages/__pycache__/typing_extensions.cpython-312.pyc deleted file mode 100644 index 41c5c40ce8383d3f92648bcf6b4a36632819629a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162211 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 diff --git a/venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/LICENSE b/venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/LICENSE deleted file mode 100644 index f26bcf4..0000000 --- a/venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/LICENSE +++ /dev/null @@ -1,279 +0,0 @@ -A. HISTORY OF THE SOFTWARE -========================== - -Python was created in the early 1990s by Guido van Rossum at Stichting -Mathematisch Centrum (CWI, see https://www.cwi.nl) in the Netherlands -as a successor of a language called ABC. Guido remains Python's -principal author, although it includes many contributions from others. - -In 1995, Guido continued his work on Python at the Corporation for -National Research Initiatives (CNRI, see https://www.cnri.reston.va.us) -in Reston, Virginia where he released several versions of the -software. - -In May 2000, Guido and the Python core development team moved to -BeOpen.com to form the BeOpen PythonLabs team. In October of the same -year, the PythonLabs team moved to Digital Creations, which became -Zope Corporation. In 2001, the Python Software Foundation (PSF, see -https://www.python.org/psf/) was formed, a non-profit organization -created specifically to own Python-related Intellectual Property. -Zope Corporation was a sponsoring member of the PSF. - -All Python releases are Open Source (see https://opensource.org for -the Open Source Definition). Historically, most, but not all, Python -releases have also been GPL-compatible; the table below summarizes -the various releases. - - Release Derived Year Owner GPL- - from compatible? (1) - - 0.9.0 thru 1.2 1991-1995 CWI yes - 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes - 1.6 1.5.2 2000 CNRI no - 2.0 1.6 2000 BeOpen.com no - 1.6.1 1.6 2001 CNRI yes (2) - 2.1 2.0+1.6.1 2001 PSF no - 2.0.1 2.0+1.6.1 2001 PSF yes - 2.1.1 2.1+2.0.1 2001 PSF yes - 2.1.2 2.1.1 2002 PSF yes - 2.1.3 2.1.2 2002 PSF yes - 2.2 and above 2.1.1 2001-now PSF yes - -Footnotes: - -(1) GPL-compatible doesn't mean that we're distributing Python under - the GPL. All Python licenses, unlike the GPL, let you distribute - a modified version without making your changes open source. The - GPL-compatible licenses make it possible to combine Python with - other software that is released under the GPL; the others don't. - -(2) According to Richard Stallman, 1.6.1 is not GPL-compatible, - because its license has a choice of law clause. According to - CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 - is "not incompatible" with the GPL. - -Thanks to the many outside volunteers who have worked under Guido's -direction to make these releases possible. - - -B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON -=============================================================== - -Python software and documentation are licensed under the -Python Software Foundation License Version 2. - -Starting with Python 3.8.6, examples, recipes, and other code in -the documentation are dual licensed under the PSF License Version 2 -and the Zero-Clause BSD license. - -Some software incorporated into Python is under different licenses. -The licenses are listed with code falling under that license. - - -PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 --------------------------------------------- - -1. This LICENSE AGREEMENT is between the Python Software Foundation -("PSF"), and the Individual or Organization ("Licensee") accessing and -otherwise using this software ("Python") in source or binary form and -its associated documentation. - -2. Subject to the terms and conditions of this License Agreement, PSF hereby -grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, -analyze, test, perform and/or display publicly, prepare derivative works, -distribute, and otherwise use Python alone or in any derivative version, -provided, however, that PSF's License Agreement and PSF's notice of copyright, -i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Python Software Foundation; -All Rights Reserved" are retained in Python alone or in any derivative version -prepared by Licensee. - -3. In the event Licensee prepares a derivative work that is based on -or incorporates Python or any part thereof, and wants to make -the derivative work available to others as provided herein, then -Licensee hereby agrees to include in any such work a brief summary of -the changes made to Python. - -4. PSF is making Python available to Licensee on an "AS IS" -basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON -FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS -A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, -OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -6. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -7. Nothing in this License Agreement shall be deemed to create any -relationship of agency, partnership, or joint venture between PSF and -Licensee. This License Agreement does not grant permission to use PSF -trademarks or trade name in a trademark sense to endorse or promote -products or services of Licensee, or any third party. - -8. By copying, installing or otherwise using Python, Licensee -agrees to be bound by the terms and conditions of this License -Agreement. - - -BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 -------------------------------------------- - -BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 - -1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an -office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the -Individual or Organization ("Licensee") accessing and otherwise using -this software in source or binary form and its associated -documentation ("the Software"). - -2. Subject to the terms and conditions of this BeOpen Python License -Agreement, BeOpen hereby grants Licensee a non-exclusive, -royalty-free, world-wide license to reproduce, analyze, test, perform -and/or display publicly, prepare derivative works, distribute, and -otherwise use the Software alone or in any derivative version, -provided, however, that the BeOpen Python License is retained in the -Software, alone or in any derivative version prepared by Licensee. - -3. BeOpen is making the Software available to Licensee on an "AS IS" -basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE -SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS -AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY -DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -5. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -6. This License Agreement shall be governed by and interpreted in all -respects by the law of the State of California, excluding conflict of -law provisions. Nothing in this License Agreement shall be deemed to -create any relationship of agency, partnership, or joint venture -between BeOpen and Licensee. This License Agreement does not grant -permission to use BeOpen trademarks or trade names in a trademark -sense to endorse or promote products or services of Licensee, or any -third party. As an exception, the "BeOpen Python" logos available at -http://www.pythonlabs.com/logos.html may be used according to the -permissions granted on that web page. - -7. By copying, installing or otherwise using the software, Licensee -agrees to be bound by the terms and conditions of this License -Agreement. - - -CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 ---------------------------------------- - -1. This LICENSE AGREEMENT is between the Corporation for National -Research Initiatives, having an office at 1895 Preston White Drive, -Reston, VA 20191 ("CNRI"), and the Individual or Organization -("Licensee") accessing and otherwise using Python 1.6.1 software in -source or binary form and its associated documentation. - -2. Subject to the terms and conditions of this License Agreement, CNRI -hereby grants Licensee a nonexclusive, royalty-free, world-wide -license to reproduce, analyze, test, perform and/or display publicly, -prepare derivative works, distribute, and otherwise use Python 1.6.1 -alone or in any derivative version, provided, however, that CNRI's -License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) -1995-2001 Corporation for National Research Initiatives; All Rights -Reserved" are retained in Python 1.6.1 alone or in any derivative -version prepared by Licensee. Alternately, in lieu of CNRI's License -Agreement, Licensee may substitute the following text (omitting the -quotes): "Python 1.6.1 is made available subject to the terms and -conditions in CNRI's License Agreement. This Agreement together with -Python 1.6.1 may be located on the internet using the following -unique, persistent identifier (known as a handle): 1895.22/1013. This -Agreement may also be obtained from a proxy server on the internet -using the following URL: http://hdl.handle.net/1895.22/1013". - -3. In the event Licensee prepares a derivative work that is based on -or incorporates Python 1.6.1 or any part thereof, and wants to make -the derivative work available to others as provided herein, then -Licensee hereby agrees to include in any such work a brief summary of -the changes made to Python 1.6.1. - -4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" -basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON -1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS -A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, -OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -6. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -7. This License Agreement shall be governed by the federal -intellectual property law of the United States, including without -limitation the federal copyright law, and, to the extent such -U.S. federal law does not apply, by the law of the Commonwealth of -Virginia, excluding Virginia's conflict of law provisions. -Notwithstanding the foregoing, with regard to derivative works based -on Python 1.6.1 that incorporate non-separable material that was -previously distributed under the GNU General Public License (GPL), the -law of the Commonwealth of Virginia shall govern this License -Agreement only as to issues arising under or with respect to -Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this -License Agreement shall be deemed to create any relationship of -agency, partnership, or joint venture between CNRI and Licensee. This -License Agreement does not grant permission to use CNRI trademarks or -trade name in a trademark sense to endorse or promote products or -services of Licensee, or any third party. - -8. By clicking on the "ACCEPT" button where indicated, or by copying, -installing or otherwise using Python 1.6.1, Licensee agrees to be -bound by the terms and conditions of this License Agreement. - - ACCEPT - - -CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 --------------------------------------------------- - -Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, -The Netherlands. All rights reserved. - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the name of Stichting Mathematisch -Centrum or CWI not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. - -STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO -THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE -FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION ----------------------------------------------------------------------- - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. diff --git a/venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/METADATA b/venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/METADATA deleted file mode 100644 index c632040..0000000 --- a/venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/METADATA +++ /dev/null @@ -1,123 +0,0 @@ -Metadata-Version: 2.3 -Name: aiohappyeyeballs -Version: 2.6.1 -Summary: Happy Eyeballs for asyncio -License: PSF-2.0 -Author: J. Nick Koston -Author-email: nick@koston.org -Requires-Python: >=3.9 -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Natural Language :: English -Classifier: Operating System :: OS Independent -Classifier: Topic :: Software Development :: Libraries -Classifier: Programming Language :: Python :: 3 -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: License :: OSI Approved :: Python Software Foundation License -Project-URL: Bug Tracker, https://github.com/aio-libs/aiohappyeyeballs/issues -Project-URL: Changelog, https://github.com/aio-libs/aiohappyeyeballs/blob/main/CHANGELOG.md -Project-URL: Documentation, https://aiohappyeyeballs.readthedocs.io -Project-URL: Repository, https://github.com/aio-libs/aiohappyeyeballs -Description-Content-Type: text/markdown - -# aiohappyeyeballs - -

- - CI Status - - - Documentation Status - - - Test coverage percentage - -

-

- - Poetry - - - Ruff - - - pre-commit - -

-

- - PyPI Version - - Supported Python versions - License -

- ---- - -**Documentation**: https://aiohappyeyeballs.readthedocs.io - -**Source Code**: https://github.com/aio-libs/aiohappyeyeballs - ---- - -[Happy Eyeballs](https://en.wikipedia.org/wiki/Happy_Eyeballs) -([RFC 8305](https://www.rfc-editor.org/rfc/rfc8305.html)) - -## Use case - -This library exists to allow connecting with -[Happy Eyeballs](https://en.wikipedia.org/wiki/Happy_Eyeballs) -([RFC 8305](https://www.rfc-editor.org/rfc/rfc8305.html)) -when you -already have a list of addrinfo and not a DNS name. - -The stdlib version of `loop.create_connection()` -will only work when you pass in an unresolved name which -is not a good fit when using DNS caching or resolving -names via another method such as `zeroconf`. - -## Installation - -Install this via pip (or your favourite package manager): - -`pip install aiohappyeyeballs` - -## License - -[aiohappyeyeballs is licensed under the same terms as cpython itself.](https://github.com/python/cpython/blob/main/LICENSE) - -## Example usage - -```python - -addr_infos = await loop.getaddrinfo("example.org", 80) - -socket = await start_connection(addr_infos) -socket = await start_connection(addr_infos, local_addr_infos=local_addr_infos, happy_eyeballs_delay=0.2) - -transport, protocol = await loop.create_connection( - MyProtocol, sock=socket, ...) - -# Remove the first address for each family from addr_info -pop_addr_infos_interleave(addr_info, 1) - -# Remove all matching address from addr_info -remove_addr_infos(addr_info, "dead::beef::") - -# Convert a local_addr to local_addr_infos -local_addr_infos = addr_to_addr_infos(("127.0.0.1",0)) -``` - -## Credits - -This package contains code from cpython and is licensed under the same terms as cpython itself. - -This package was created with -[Copier](https://copier.readthedocs.io/) and the -[browniebroke/pypackage-template](https://github.com/browniebroke/pypackage-template) -project template. - diff --git a/venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/RECORD b/venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/RECORD deleted file mode 100644 index 9e0e202..0000000 --- a/venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/RECORD +++ /dev/null @@ -1,16 +0,0 @@ -aiohappyeyeballs-2.6.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -aiohappyeyeballs-2.6.1.dist-info/LICENSE,sha256=Oy-B_iHRgcSZxZolbI4ZaEVdZonSaaqFNzv7avQdo78,13936 -aiohappyeyeballs-2.6.1.dist-info/METADATA,sha256=NSXlhJwAfi380eEjAo7BQ4P_TVal9xi0qkyZWibMsVM,5915 -aiohappyeyeballs-2.6.1.dist-info/RECORD,, -aiohappyeyeballs-2.6.1.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88 -aiohappyeyeballs/__init__.py,sha256=x7kktHEtaD9quBcWDJPuLeKyjuVAI-Jj14S9B_5hcTs,361 -aiohappyeyeballs/__pycache__/__init__.cpython-312.pyc,, -aiohappyeyeballs/__pycache__/_staggered.cpython-312.pyc,, -aiohappyeyeballs/__pycache__/impl.cpython-312.pyc,, -aiohappyeyeballs/__pycache__/types.cpython-312.pyc,, -aiohappyeyeballs/__pycache__/utils.cpython-312.pyc,, -aiohappyeyeballs/_staggered.py,sha256=edfVowFx-P-ywJjIEF3MdPtEMVODujV6CeMYr65otac,6900 -aiohappyeyeballs/impl.py,sha256=Dlcm2mTJ28ucrGnxkb_fo9CZzLAkOOBizOt7dreBbXE,9681 -aiohappyeyeballs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -aiohappyeyeballs/types.py,sha256=YZJIAnyoV4Dz0WFtlaf_OyE4EW7Xus1z7aIfNI6tDDQ,425 -aiohappyeyeballs/utils.py,sha256=on9GxIR0LhEfZu8P6Twi9hepX9zDanuZM20MWsb3xlQ,3028 diff --git a/venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/WHEEL b/venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/WHEEL deleted file mode 100644 index 0582547..0000000 --- a/venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: poetry-core 2.1.1 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/venv/lib/python3.12/site-packages/aiohappyeyeballs/__init__.py b/venv/lib/python3.12/site-packages/aiohappyeyeballs/__init__.py deleted file mode 100644 index 71c689c..0000000 --- a/venv/lib/python3.12/site-packages/aiohappyeyeballs/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -__version__ = "2.6.1" - -from .impl import start_connection -from .types import AddrInfoType, SocketFactoryType -from .utils import addr_to_addr_infos, pop_addr_infos_interleave, remove_addr_infos - -__all__ = ( - "AddrInfoType", - "SocketFactoryType", - "addr_to_addr_infos", - "pop_addr_infos_interleave", - "remove_addr_infos", - "start_connection", -) diff --git a/venv/lib/python3.12/site-packages/aiohappyeyeballs/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohappyeyeballs/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index b1ee961a3ffa9971c081cc265c3fd6d0ee15128d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 525 zcmZ8dJ5L-j5ca-q4=yASi6R9J-4=Hi7bz8r6bT{Gq`6evSY~&^S@yftcd+JieLv#=o|y zcY!rVYiNQnx=Q1V4{hsC^k?&_w-9$0ra6aj%$s0bKcuQGzUD|_!Lao!kn7_cYwVMl z2_3*m;2q9zpiBo(s@2HlsK6Bij0PwN7!Qyke5@vM!dM5+qbSB=E|it)QY-?B@Q?km zSOp>dvoWz`j7!PbPjZI?$-SjZqkt+Nd`FK=vr?dgrvW6KIj*KY2t3qHTk}Or!&`8) z1Km+6PO0s~(&)FdgE{pgz|`{QoS%WGT$m-dwuc^0ahs+`XLqA^X>4eoYp?$>KIIC+WA+y+X!6aEX`j diff --git a/venv/lib/python3.12/site-packages/aiohappyeyeballs/__pycache__/_staggered.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohappyeyeballs/__pycache__/_staggered.cpython-312.pyc deleted file mode 100644 index c9a5a30649735e4547b3754bdccd38f2d84bb724..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8027 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 diff --git a/venv/lib/python3.12/site-packages/aiohappyeyeballs/__pycache__/impl.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohappyeyeballs/__pycache__/impl.cpython-312.pyc deleted file mode 100644 index a2e4ba88e93e84ec5ad7751e9b9b240ee30572a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10138 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 diff --git a/venv/lib/python3.12/site-packages/aiohappyeyeballs/__pycache__/types.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohappyeyeballs/__pycache__/types.cpython-312.pyc deleted file mode 100644 index f59ea62799e84e8a47ffc9d135275112ecb367c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 621 zcmZ8eL2DC16rS0g-6q?_q*4zeg_L-SkSyx0iXcis1TR((3pGr#FUi{3on>Z{vU=&U z|G=C)o0C7pOZH@)lhBj5NDo3!&bEmGAH)0Jd*6F+-s63%Ry}0oLbapHPSb6ynfgIKT#NX2o`3$0Q)J6F3+F0S8>b?{BOctZ`u7HqMf-uj4Cg$-7Vn zGH{CAzylk+AvXQ2Rn{7>^MlRIYLO3j4zd(vW57j&MtnrmG=mI!lrh=)Rn)v{*}C-1 z__W7BI|t*mfHz6RlU7A`tTp#UlO zX&kXkd#|rbUPei%ZK;H=6#R>1z>Asm)-}CP`-+RK2+h!i>4h$1f5c<(W2)rDf6n{k z7!oCY1q_CQ#%-x0GmB`4{5WBph9LY2Bom)SJwMIVh$jy__aFE&QqWFm|A-Dj`u}h5 zn?*o&((JPIIOgG)!4q-Q{B917WMtIB#u)!VyXUC-r-bmm9JPMdw$DiUw0S!DUTfyH z=G<%M~Oxbmv2AH J(UvG~{ug$js&4=Q diff --git a/venv/lib/python3.12/site-packages/aiohappyeyeballs/__pycache__/utils.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohappyeyeballs/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index cbaf2c48ec6389cc8fe35775b05cf2720f95ede6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3733 zcmbVOO>7&-6`o!0E|<%tWQw93*|N2EY%6pu%84V#e@dcA{%aD+l@+5QQV=wEDbXT# z+1Vv+s!Nn8Qh-W*pwR**P_$5cC{&~cl$+a=k4AeTD;r|A25KPfK{vX}$(Q!ckQ5oW z2;2<8*_nB7-h2Dzec$X~d_D<5EB@+-ix0gBeMu(mMkO%W))|EEA{9lD%BXCLi7@oZ zMp$^dQm!-?;nIABPYV$t?T)z9Vnk$+%Bg(Hla?Y9j0H{5M9r;vHJSVp+#nck&l9fB zEWwg-bA^mlH|*p!iHxa)Q^ilXh|h!69@W#9s1j(&O?{P32&(rJKGFkTTRxjs+y2`A zo2%e~XfZeTgNx@HXwrD7TzO6i)9$xvMb4=*#OLpd?FFNtaruofsE+M6pWq6}V%q`T;M$|kv*6bIiFShhnx@dvXpahR+udbLY_E5oUD9^-cZ5h4 zZIs{_n5!t{S$=cM&~qBLl$frN1Zt+KSR~hqWhgNv1;?Nm2`Y*vA=OQx8J@x9Z7^~E zj5)JKUTBNtc#AAMC?q(pl%_j^X~dT_ILXNi(aSUE=TAEB*2wW*ot=6wdUby8{Nx9Y z_wto1bF=fa(fO$>ArX_P9d6Np8sIVpwj6iTj3zU=la82388=BFj@yhI87-+gB8fXn zy(MDlWGZixsFYTFmL6L)(%M)$W|_IMX(OIZYr18QSz1b4z_IkGX(b^u;rPzXIjy+$$V_7J3Gn~mgeKZ=&h|(vC z)WizJLte@JEp$cHkdY`C?RsyZ?(HozD{mI3JA)p7dA_t%y!eH?ryl4piS@of$^AGm zP_}+{8fM-=`3Ij))CcxdUc0kUy4arY-dmZxbF*}*zN^2iRxYhBRC~iE?y-OO-QhdK zE5Z}9T(X-h`|s>833XrK=hrraBemej?*}$RXKSIe_vY^RSLF*;@5L&2aT_8|uB#MsOd*v5X_bz=v2u-s}k*G3>iciducQ4Fi>vJauSE6x&Iw@-1%c7fLb z^@?tgx_qv6Te=C<)Pm$Xi2#+c4cYLorIx8e$y*NLSNULX&ADr-cN35Hf>bhR)$k4G`;r z(rpSI&(7&%a;cbvi<+py!(_uCxbG@+;D>gB;G-ZvO!llm2NmCkhW101yZu%7U_Cfc zlIn+!6ff6`$<6$L0x+NmHwJ{Uw!XTX}UbH@;*U^uyU?)^snASbvd{x z57p$M%1007k-8|CuKiT5Fg0=Tw%qW6p+*lH0Fw-V7)*+No8lnIDxpW>p{Fib#0Man zuU!pBM*l(bfF4iCg zq2ywzED#7>%lS+)4j)T-3ijrAPD^Ses2_6Kh8Hv|qiI+Nl6fW6-D#n0&T; zT-$Z9K_|yg-3xr~qvI#MXPXCw#⋘S(kdtd^uh@QC_^$yBb_I*QVA3>+$Ny>Dqxa z)m>+5(%FU!^q%lio%57Jo6>Mi8eR=lr9(CD@M?DLqs`HGYoqVppL!5@5U-AYw>C0Y m<>nwzf!*d|W20{`^A6JqhRmM4fK#3*HUuO{U%APUCi_1Om93Wm diff --git a/venv/lib/python3.12/site-packages/aiohappyeyeballs/_staggered.py b/venv/lib/python3.12/site-packages/aiohappyeyeballs/_staggered.py deleted file mode 100644 index 9a4ba72..0000000 --- a/venv/lib/python3.12/site-packages/aiohappyeyeballs/_staggered.py +++ /dev/null @@ -1,207 +0,0 @@ -import asyncio -import contextlib - -# PY3.9: Import Callable from typing until we drop Python 3.9 support -# https://github.com/python/cpython/issues/87131 -from typing import ( - TYPE_CHECKING, - Any, - Awaitable, - Callable, - Iterable, - List, - Optional, - Set, - Tuple, - TypeVar, - Union, -) - -_T = TypeVar("_T") - -RE_RAISE_EXCEPTIONS = (SystemExit, KeyboardInterrupt) - - -def _set_result(wait_next: "asyncio.Future[None]") -> None: - """Set the result of a future if it is not already done.""" - if not wait_next.done(): - wait_next.set_result(None) - - -async def _wait_one( - futures: "Iterable[asyncio.Future[Any]]", - loop: asyncio.AbstractEventLoop, -) -> _T: - """Wait for the first future to complete.""" - wait_next = loop.create_future() - - def _on_completion(fut: "asyncio.Future[Any]") -> None: - if not wait_next.done(): - wait_next.set_result(fut) - - for f in futures: - f.add_done_callback(_on_completion) - - try: - return await wait_next - finally: - for f in futures: - f.remove_done_callback(_on_completion) - - -async def staggered_race( - coro_fns: Iterable[Callable[[], Awaitable[_T]]], - delay: Optional[float], - *, - loop: Optional[asyncio.AbstractEventLoop] = None, -) -> Tuple[Optional[_T], Optional[int], List[Optional[BaseException]]]: - """ - Run coroutines with staggered start times and take the first to finish. - - This method takes an iterable of coroutine functions. The first one is - started immediately. From then on, whenever the immediately preceding one - fails (raises an exception), or when *delay* seconds has passed, the next - coroutine is started. This continues until one of the coroutines complete - successfully, in which case all others are cancelled, or until all - coroutines fail. - - The coroutines provided should be well-behaved in the following way: - - * They should only ``return`` if completed successfully. - - * They should always raise an exception if they did not complete - successfully. In particular, if they handle cancellation, they should - probably reraise, like this:: - - try: - # do work - except asyncio.CancelledError: - # undo partially completed work - raise - - Args: - ---- - coro_fns: an iterable of coroutine functions, i.e. callables that - return a coroutine object when called. Use ``functools.partial`` or - lambdas to pass arguments. - - delay: amount of time, in seconds, between starting coroutines. If - ``None``, the coroutines will run sequentially. - - loop: the event loop to use. If ``None``, the running loop is used. - - Returns: - ------- - tuple *(winner_result, winner_index, exceptions)* where - - - *winner_result*: the result of the winning coroutine, or ``None`` - if no coroutines won. - - - *winner_index*: the index of the winning coroutine in - ``coro_fns``, or ``None`` if no coroutines won. If the winning - coroutine may return None on success, *winner_index* can be used - to definitively determine whether any coroutine won. - - - *exceptions*: list of exceptions returned by the coroutines. - ``len(exceptions)`` is equal to the number of coroutines actually - started, and the order is the same as in ``coro_fns``. The winning - coroutine's entry is ``None``. - - """ - loop = loop or asyncio.get_running_loop() - exceptions: List[Optional[BaseException]] = [] - tasks: Set[asyncio.Task[Optional[Tuple[_T, int]]]] = set() - - async def run_one_coro( - coro_fn: Callable[[], Awaitable[_T]], - this_index: int, - start_next: "asyncio.Future[None]", - ) -> Optional[Tuple[_T, int]]: - """ - Run a single coroutine. - - If the coroutine fails, set the exception in the exceptions list and - start the next coroutine by setting the result of the start_next. - - If the coroutine succeeds, return the result and the index of the - coroutine in the coro_fns list. - - If SystemExit or KeyboardInterrupt is raised, re-raise it. - """ - try: - result = await coro_fn() - except RE_RAISE_EXCEPTIONS: - raise - except BaseException as e: - exceptions[this_index] = e - _set_result(start_next) # Kickstart the next coroutine - return None - - return result, this_index - - start_next_timer: Optional[asyncio.TimerHandle] = None - start_next: Optional[asyncio.Future[None]] - task: asyncio.Task[Optional[Tuple[_T, int]]] - done: Union[asyncio.Future[None], asyncio.Task[Optional[Tuple[_T, int]]]] - coro_iter = iter(coro_fns) - this_index = -1 - try: - while True: - if coro_fn := next(coro_iter, None): - this_index += 1 - exceptions.append(None) - start_next = loop.create_future() - task = loop.create_task(run_one_coro(coro_fn, this_index, start_next)) - tasks.add(task) - start_next_timer = ( - loop.call_later(delay, _set_result, start_next) if delay else None - ) - elif not tasks: - # We exhausted the coro_fns list and no tasks are running - # so we have no winner and all coroutines failed. - break - - while tasks or start_next: - done = await _wait_one( - (*tasks, start_next) if start_next else tasks, loop - ) - if done is start_next: - # The current task has failed or the timer has expired - # so we need to start the next task. - start_next = None - if start_next_timer: - start_next_timer.cancel() - start_next_timer = None - - # Break out of the task waiting loop to start the next - # task. - break - - if TYPE_CHECKING: - assert isinstance(done, asyncio.Task) - - tasks.remove(done) - if winner := done.result(): - return *winner, exceptions - finally: - # We either have: - # - a winner - # - all tasks failed - # - a KeyboardInterrupt or SystemExit. - - # - # If the timer is still running, cancel it. - # - if start_next_timer: - start_next_timer.cancel() - - # - # If there are any tasks left, cancel them and than - # wait them so they fill the exceptions list. - # - for task in tasks: - task.cancel() - with contextlib.suppress(asyncio.CancelledError): - await task - - return None, None, exceptions diff --git a/venv/lib/python3.12/site-packages/aiohappyeyeballs/impl.py b/venv/lib/python3.12/site-packages/aiohappyeyeballs/impl.py deleted file mode 100644 index 8f3919a..0000000 --- a/venv/lib/python3.12/site-packages/aiohappyeyeballs/impl.py +++ /dev/null @@ -1,259 +0,0 @@ -"""Base implementation.""" - -import asyncio -import collections -import contextlib -import functools -import itertools -import socket -from typing import List, Optional, Sequence, Set, Union - -from . import _staggered -from .types import AddrInfoType, SocketFactoryType - - -async def start_connection( - addr_infos: Sequence[AddrInfoType], - *, - local_addr_infos: Optional[Sequence[AddrInfoType]] = None, - happy_eyeballs_delay: Optional[float] = None, - interleave: Optional[int] = None, - loop: Optional[asyncio.AbstractEventLoop] = None, - socket_factory: Optional[SocketFactoryType] = None, -) -> socket.socket: - """ - Connect to a TCP server. - - Create a socket connection to a specified destination. The - destination is specified as a list of AddrInfoType tuples as - returned from getaddrinfo(). - - The arguments are, in order: - - * ``family``: the address family, e.g. ``socket.AF_INET`` or - ``socket.AF_INET6``. - * ``type``: the socket type, e.g. ``socket.SOCK_STREAM`` or - ``socket.SOCK_DGRAM``. - * ``proto``: the protocol, e.g. ``socket.IPPROTO_TCP`` or - ``socket.IPPROTO_UDP``. - * ``canonname``: the canonical name of the address, e.g. - ``"www.python.org"``. - * ``sockaddr``: the socket address - - This method is a coroutine which will try to establish the connection - in the background. When successful, the coroutine returns a - socket. - - The expected use case is to use this method in conjunction with - loop.create_connection() to establish a connection to a server:: - - socket = await start_connection(addr_infos) - transport, protocol = await loop.create_connection( - MyProtocol, sock=socket, ...) - """ - if not (current_loop := loop): - current_loop = asyncio.get_running_loop() - - single_addr_info = len(addr_infos) == 1 - - if happy_eyeballs_delay is not None and interleave is None: - # If using happy eyeballs, default to interleave addresses by family - interleave = 1 - - if interleave and not single_addr_info: - addr_infos = _interleave_addrinfos(addr_infos, interleave) - - sock: Optional[socket.socket] = None - # uvloop can raise RuntimeError instead of OSError - exceptions: List[List[Union[OSError, RuntimeError]]] = [] - if happy_eyeballs_delay is None or single_addr_info: - # not using happy eyeballs - for addrinfo in addr_infos: - try: - sock = await _connect_sock( - current_loop, - exceptions, - addrinfo, - local_addr_infos, - None, - socket_factory, - ) - break - except (RuntimeError, OSError): - continue - else: # using happy eyeballs - open_sockets: Set[socket.socket] = set() - try: - sock, _, _ = await _staggered.staggered_race( - ( - functools.partial( - _connect_sock, - current_loop, - exceptions, - addrinfo, - local_addr_infos, - open_sockets, - socket_factory, - ) - for addrinfo in addr_infos - ), - happy_eyeballs_delay, - ) - finally: - # If we have a winner, staggered_race will - # cancel the other tasks, however there is a - # small race window where any of the other tasks - # can be done before they are cancelled which - # will leave the socket open. To avoid this problem - # we pass a set to _connect_sock to keep track of - # the open sockets and close them here if there - # are any "runner up" sockets. - for s in open_sockets: - if s is not sock: - with contextlib.suppress(OSError): - s.close() - open_sockets = None # type: ignore[assignment] - - if sock is None: - all_exceptions = [exc for sub in exceptions for exc in sub] - try: - first_exception = all_exceptions[0] - if len(all_exceptions) == 1: - raise first_exception - else: - # If they all have the same str(), raise one. - model = str(first_exception) - if all(str(exc) == model for exc in all_exceptions): - raise first_exception - # Raise a combined exception so the user can see all - # the various error messages. - msg = "Multiple exceptions: {}".format( - ", ".join(str(exc) for exc in all_exceptions) - ) - # If the errno is the same for all exceptions, raise - # an OSError with that errno. - if isinstance(first_exception, OSError): - first_errno = first_exception.errno - if all( - isinstance(exc, OSError) and exc.errno == first_errno - for exc in all_exceptions - ): - raise OSError(first_errno, msg) - elif isinstance(first_exception, RuntimeError) and all( - isinstance(exc, RuntimeError) for exc in all_exceptions - ): - raise RuntimeError(msg) - # We have a mix of OSError and RuntimeError - # so we have to pick which one to raise. - # and we raise OSError for compatibility - raise OSError(msg) - finally: - all_exceptions = None # type: ignore[assignment] - exceptions = None # type: ignore[assignment] - - return sock - - -async def _connect_sock( - loop: asyncio.AbstractEventLoop, - exceptions: List[List[Union[OSError, RuntimeError]]], - addr_info: AddrInfoType, - local_addr_infos: Optional[Sequence[AddrInfoType]] = None, - open_sockets: Optional[Set[socket.socket]] = None, - socket_factory: Optional[SocketFactoryType] = None, -) -> socket.socket: - """ - Create, bind and connect one socket. - - If open_sockets is passed, add the socket to the set of open sockets. - Any failure caught here will remove the socket from the set and close it. - - Callers can use this set to close any sockets that are not the winner - of all staggered tasks in the result there are runner up sockets aka - multiple winners. - """ - my_exceptions: List[Union[OSError, RuntimeError]] = [] - exceptions.append(my_exceptions) - family, type_, proto, _, address = addr_info - sock = None - try: - if socket_factory is not None: - sock = socket_factory(addr_info) - else: - sock = socket.socket(family=family, type=type_, proto=proto) - if open_sockets is not None: - open_sockets.add(sock) - sock.setblocking(False) - if local_addr_infos is not None: - for lfamily, _, _, _, laddr in local_addr_infos: - # skip local addresses of different family - if lfamily != family: - continue - try: - sock.bind(laddr) - break - except OSError as exc: - msg = ( - f"error while attempting to bind on " - f"address {laddr!r}: " - f"{(exc.strerror or '').lower()}" - ) - exc = OSError(exc.errno, msg) - my_exceptions.append(exc) - else: # all bind attempts failed - if my_exceptions: - raise my_exceptions.pop() - else: - raise OSError(f"no matching local address with {family=} found") - await loop.sock_connect(sock, address) - return sock - except (RuntimeError, OSError) as exc: - my_exceptions.append(exc) - if sock is not None: - if open_sockets is not None: - open_sockets.remove(sock) - try: - sock.close() - except OSError as e: - my_exceptions.append(e) - raise - raise - except: - if sock is not None: - if open_sockets is not None: - open_sockets.remove(sock) - try: - sock.close() - except OSError as e: - my_exceptions.append(e) - raise - raise - finally: - exceptions = my_exceptions = None # type: ignore[assignment] - - -def _interleave_addrinfos( - addrinfos: Sequence[AddrInfoType], first_address_family_count: int = 1 -) -> List[AddrInfoType]: - """Interleave list of addrinfo tuples by family.""" - # Group addresses by family - addrinfos_by_family: collections.OrderedDict[int, List[AddrInfoType]] = ( - collections.OrderedDict() - ) - for addr in addrinfos: - family = addr[0] - if family not in addrinfos_by_family: - addrinfos_by_family[family] = [] - addrinfos_by_family[family].append(addr) - addrinfos_lists = list(addrinfos_by_family.values()) - - reordered: List[AddrInfoType] = [] - if first_address_family_count > 1: - reordered.extend(addrinfos_lists[0][: first_address_family_count - 1]) - del addrinfos_lists[0][: first_address_family_count - 1] - reordered.extend( - a - for a in itertools.chain.from_iterable(itertools.zip_longest(*addrinfos_lists)) - if a is not None - ) - return reordered diff --git a/venv/lib/python3.12/site-packages/aiohappyeyeballs/py.typed b/venv/lib/python3.12/site-packages/aiohappyeyeballs/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/aiohappyeyeballs/types.py b/venv/lib/python3.12/site-packages/aiohappyeyeballs/types.py deleted file mode 100644 index e8c7507..0000000 --- a/venv/lib/python3.12/site-packages/aiohappyeyeballs/types.py +++ /dev/null @@ -1,17 +0,0 @@ -"""Types for aiohappyeyeballs.""" - -import socket - -# PY3.9: Import Callable from typing until we drop Python 3.9 support -# https://github.com/python/cpython/issues/87131 -from typing import Callable, Tuple, Union - -AddrInfoType = Tuple[ - Union[int, socket.AddressFamily], - Union[int, socket.SocketKind], - int, - str, - Tuple, # type: ignore[type-arg] -] - -SocketFactoryType = Callable[[AddrInfoType], socket.socket] diff --git a/venv/lib/python3.12/site-packages/aiohappyeyeballs/utils.py b/venv/lib/python3.12/site-packages/aiohappyeyeballs/utils.py deleted file mode 100644 index ea29adb..0000000 --- a/venv/lib/python3.12/site-packages/aiohappyeyeballs/utils.py +++ /dev/null @@ -1,97 +0,0 @@ -"""Utility functions for aiohappyeyeballs.""" - -import ipaddress -import socket -from typing import Dict, List, Optional, Tuple, Union - -from .types import AddrInfoType - - -def addr_to_addr_infos( - addr: Optional[ - Union[Tuple[str, int, int, int], Tuple[str, int, int], Tuple[str, int]] - ], -) -> Optional[List[AddrInfoType]]: - """Convert an address tuple to a list of addr_info tuples.""" - if addr is None: - return None - host = addr[0] - port = addr[1] - is_ipv6 = ":" in host - if is_ipv6: - flowinfo = 0 - scopeid = 0 - addr_len = len(addr) - if addr_len >= 4: - scopeid = addr[3] # type: ignore[misc] - if addr_len >= 3: - flowinfo = addr[2] # type: ignore[misc] - addr = (host, port, flowinfo, scopeid) - family = socket.AF_INET6 - else: - addr = (host, port) - family = socket.AF_INET - return [(family, socket.SOCK_STREAM, socket.IPPROTO_TCP, "", addr)] - - -def pop_addr_infos_interleave( - addr_infos: List[AddrInfoType], interleave: Optional[int] = None -) -> None: - """ - Pop addr_info from the list of addr_infos by family up to interleave times. - - The interleave parameter is used to know how many addr_infos for - each family should be popped of the top of the list. - """ - seen: Dict[int, int] = {} - if interleave is None: - interleave = 1 - to_remove: List[AddrInfoType] = [] - for addr_info in addr_infos: - family = addr_info[0] - if family not in seen: - seen[family] = 0 - if seen[family] < interleave: - to_remove.append(addr_info) - seen[family] += 1 - for addr_info in to_remove: - addr_infos.remove(addr_info) - - -def _addr_tuple_to_ip_address( - addr: Union[Tuple[str, int], Tuple[str, int, int, int]], -) -> Union[ - Tuple[ipaddress.IPv4Address, int], Tuple[ipaddress.IPv6Address, int, int, int] -]: - """Convert an address tuple to an IPv4Address.""" - return (ipaddress.ip_address(addr[0]), *addr[1:]) - - -def remove_addr_infos( - addr_infos: List[AddrInfoType], - addr: Union[Tuple[str, int], Tuple[str, int, int, int]], -) -> None: - """ - Remove an address from the list of addr_infos. - - The addr value is typically the return value of - sock.getpeername(). - """ - bad_addrs_infos: List[AddrInfoType] = [] - for addr_info in addr_infos: - if addr_info[-1] == addr: - bad_addrs_infos.append(addr_info) - if bad_addrs_infos: - for bad_addr_info in bad_addrs_infos: - addr_infos.remove(bad_addr_info) - return - # Slow path in case addr is formatted differently - match_addr = _addr_tuple_to_ip_address(addr) - for addr_info in addr_infos: - if match_addr == _addr_tuple_to_ip_address(addr_info[-1]): - bad_addrs_infos.append(addr_info) - if bad_addrs_infos: - for bad_addr_info in bad_addrs_infos: - addr_infos.remove(bad_addr_info) - return - raise ValueError(f"Address {addr} not found in addr_infos") diff --git a/venv/lib/python3.12/site-packages/aiohttp-3.12.14.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/aiohttp-3.12.14.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp-3.12.14.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/aiohttp-3.12.14.dist-info/METADATA b/venv/lib/python3.12/site-packages/aiohttp-3.12.14.dist-info/METADATA deleted file mode 100644 index 4f71fd1..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp-3.12.14.dist-info/METADATA +++ /dev/null @@ -1,250 +0,0 @@ -Metadata-Version: 2.4 -Name: aiohttp -Version: 3.12.14 -Summary: Async http client/server framework (asyncio) -Home-page: https://github.com/aio-libs/aiohttp -Maintainer: aiohttp team -Maintainer-email: team@aiohttp.org -License: Apache-2.0 -Project-URL: Chat: Matrix, https://matrix.to/#/#aio-libs:matrix.org -Project-URL: Chat: Matrix Space, https://matrix.to/#/#aio-libs-space:matrix.org -Project-URL: CI: GitHub Actions, https://github.com/aio-libs/aiohttp/actions?query=workflow%3ACI -Project-URL: Coverage: codecov, https://codecov.io/github/aio-libs/aiohttp -Project-URL: Docs: Changelog, https://docs.aiohttp.org/en/stable/changes.html -Project-URL: Docs: RTD, https://docs.aiohttp.org -Project-URL: GitHub: issues, https://github.com/aio-libs/aiohttp/issues -Project-URL: GitHub: repo, https://github.com/aio-libs/aiohttp -Classifier: Development Status :: 5 - Production/Stable -Classifier: Framework :: AsyncIO -Classifier: Intended Audience :: Developers -Classifier: Operating System :: POSIX -Classifier: Operating System :: MacOS :: MacOS X -Classifier: Operating System :: Microsoft :: Windows -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -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: Topic :: Internet :: WWW/HTTP -Requires-Python: >=3.9 -Description-Content-Type: text/x-rst -License-File: LICENSE.txt -Requires-Dist: aiohappyeyeballs>=2.5.0 -Requires-Dist: aiosignal>=1.4.0 -Requires-Dist: async-timeout<6.0,>=4.0; python_version < "3.11" -Requires-Dist: attrs>=17.3.0 -Requires-Dist: frozenlist>=1.1.1 -Requires-Dist: multidict<7.0,>=4.5 -Requires-Dist: propcache>=0.2.0 -Requires-Dist: yarl<2.0,>=1.17.0 -Provides-Extra: speedups -Requires-Dist: aiodns>=3.3.0; extra == "speedups" -Requires-Dist: Brotli; platform_python_implementation == "CPython" and extra == "speedups" -Requires-Dist: brotlicffi; platform_python_implementation != "CPython" and extra == "speedups" -Dynamic: license-file - -================================== -Async http client/server framework -================================== - -.. image:: https://raw.githubusercontent.com/aio-libs/aiohttp/master/docs/aiohttp-plain.svg - :height: 64px - :width: 64px - :alt: aiohttp logo - -| - -.. image:: https://github.com/aio-libs/aiohttp/workflows/CI/badge.svg - :target: https://github.com/aio-libs/aiohttp/actions?query=workflow%3ACI - :alt: GitHub Actions status for master branch - -.. image:: https://codecov.io/gh/aio-libs/aiohttp/branch/master/graph/badge.svg - :target: https://codecov.io/gh/aio-libs/aiohttp - :alt: codecov.io status for master branch - -.. image:: https://img.shields.io/endpoint?url=https://codspeed.io/badge.json - :target: https://codspeed.io/aio-libs/aiohttp - :alt: Codspeed.io status for aiohttp - -.. image:: https://badge.fury.io/py/aiohttp.svg - :target: https://pypi.org/project/aiohttp - :alt: Latest PyPI package version - -.. image:: https://readthedocs.org/projects/aiohttp/badge/?version=latest - :target: https://docs.aiohttp.org/ - :alt: Latest Read The Docs - -.. image:: https://img.shields.io/matrix/aio-libs:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat - :target: https://matrix.to/#/%23aio-libs:matrix.org - :alt: Matrix Room — #aio-libs:matrix.org - -.. image:: https://img.shields.io/matrix/aio-libs-space:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs-space%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat - :target: https://matrix.to/#/%23aio-libs-space:matrix.org - :alt: Matrix Space — #aio-libs-space:matrix.org - - -Key Features -============ - -- Supports both client and server side of HTTP protocol. -- Supports both client and server Web-Sockets out-of-the-box and avoids - Callback Hell. -- Provides Web-server with middleware and pluggable routing. - - -Getting started -=============== - -Client ------- - -To get something from the web: - -.. code-block:: python - - import aiohttp - import asyncio - - async def main(): - - async with aiohttp.ClientSession() as session: - async with session.get('http://python.org') as response: - - print("Status:", response.status) - print("Content-type:", response.headers['content-type']) - - html = await response.text() - print("Body:", html[:15], "...") - - asyncio.run(main()) - -This prints: - -.. code-block:: - - Status: 200 - Content-type: text/html; charset=utf-8 - Body: ... - -Coming from `requests `_ ? Read `why we need so many lines `_. - -Server ------- - -An example using a simple server: - -.. code-block:: python - - # examples/server_simple.py - from aiohttp import web - - async def handle(request): - name = request.match_info.get('name', "Anonymous") - text = "Hello, " + name - return web.Response(text=text) - - async def wshandle(request): - ws = web.WebSocketResponse() - await ws.prepare(request) - - async for msg in ws: - if msg.type == web.WSMsgType.text: - await ws.send_str("Hello, {}".format(msg.data)) - elif msg.type == web.WSMsgType.binary: - await ws.send_bytes(msg.data) - elif msg.type == web.WSMsgType.close: - break - - return ws - - - app = web.Application() - app.add_routes([web.get('/', handle), - web.get('/echo', wshandle), - web.get('/{name}', handle)]) - - if __name__ == '__main__': - web.run_app(app) - - -Documentation -============= - -https://aiohttp.readthedocs.io/ - - -Demos -===== - -https://github.com/aio-libs/aiohttp-demos - - -External links -============== - -* `Third party libraries - `_ -* `Built with aiohttp - `_ -* `Powered by aiohttp - `_ - -Feel free to make a Pull Request for adding your link to these pages! - - -Communication channels -====================== - -*aio-libs Discussions*: https://github.com/aio-libs/aiohttp/discussions - -*Matrix*: `#aio-libs:matrix.org `_ - -We support `Stack Overflow -`_. -Please add *aiohttp* tag to your question there. - -Requirements -============ - -- attrs_ -- multidict_ -- yarl_ -- frozenlist_ - -Optionally you may install the aiodns_ library (highly recommended for sake of speed). - -.. _aiodns: https://pypi.python.org/pypi/aiodns -.. _attrs: https://github.com/python-attrs/attrs -.. _multidict: https://pypi.python.org/pypi/multidict -.. _frozenlist: https://pypi.org/project/frozenlist/ -.. _yarl: https://pypi.python.org/pypi/yarl -.. _async-timeout: https://pypi.python.org/pypi/async_timeout - -License -======= - -``aiohttp`` is offered under the Apache 2 license. - - -Keepsafe -======== - -The aiohttp community would like to thank Keepsafe -(https://www.getkeepsafe.com) for its support in the early days of -the project. - - -Source code -=========== - -The latest developer version is available in a GitHub repository: -https://github.com/aio-libs/aiohttp - -Benchmarks -========== - -If you are interested in efficiency, the AsyncIO community maintains a -list of benchmarks on the official wiki: -https://github.com/python/asyncio/wiki/Benchmarks diff --git a/venv/lib/python3.12/site-packages/aiohttp-3.12.14.dist-info/RECORD b/venv/lib/python3.12/site-packages/aiohttp-3.12.14.dist-info/RECORD deleted file mode 100644 index 250ab10..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp-3.12.14.dist-info/RECORD +++ /dev/null @@ -1,138 +0,0 @@ -aiohttp-3.12.14.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -aiohttp-3.12.14.dist-info/METADATA,sha256=eANbIsB4Kj7_7QofG0pGvr-qVDn7-uqvxOTGuI0iX_w,7613 -aiohttp-3.12.14.dist-info/RECORD,, -aiohttp-3.12.14.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -aiohttp-3.12.14.dist-info/WHEEL,sha256=aSgG0F4rGPZtV0iTEIfy6dtHq6g67Lze3uLfk0vWn88,151 -aiohttp-3.12.14.dist-info/licenses/LICENSE.txt,sha256=n4DQ2311WpQdtFchcsJw7L2PCCuiFd3QlZhZQu2Uqes,588 -aiohttp-3.12.14.dist-info/top_level.txt,sha256=iv-JIaacmTl-hSho3QmphcKnbRRYx1st47yjz_178Ro,8 -aiohttp/.hash/_cparser.pxd.hash,sha256=pjs-sEXNw_eijXGAedwG-BHnlFp8B7sOCgUagIWaU2A,121 -aiohttp/.hash/_find_header.pxd.hash,sha256=_mbpD6vM-CVCKq3ulUvsOAz5Wdo88wrDzfpOsMQaMNA,125 -aiohttp/.hash/_http_parser.pyx.hash,sha256=8LCTs_O4fFH1HswgQLgjUn8gknOO8Z8V63c_hQ4fNnM,125 -aiohttp/.hash/_http_writer.pyx.hash,sha256=uhOanbDG8R2Pxria3xMb15h7biBeeT3ioBoQNwqKYp8,125 -aiohttp/.hash/hdrs.py.hash,sha256=v6IaKbsxjsdQxBzhb5AjP0x_9G3rUe84D7avf7AI4cs,116 -aiohttp/__init__.py,sha256=Pzr8s2ho-qqwAaB81nT1jk2rkDSL3dcAbMguPmcLpyc,8303 -aiohttp/__pycache__/__init__.cpython-312.pyc,, -aiohttp/__pycache__/_cookie_helpers.cpython-312.pyc,, -aiohttp/__pycache__/abc.cpython-312.pyc,, -aiohttp/__pycache__/base_protocol.cpython-312.pyc,, -aiohttp/__pycache__/client.cpython-312.pyc,, -aiohttp/__pycache__/client_exceptions.cpython-312.pyc,, -aiohttp/__pycache__/client_middleware_digest_auth.cpython-312.pyc,, -aiohttp/__pycache__/client_middlewares.cpython-312.pyc,, -aiohttp/__pycache__/client_proto.cpython-312.pyc,, -aiohttp/__pycache__/client_reqrep.cpython-312.pyc,, -aiohttp/__pycache__/client_ws.cpython-312.pyc,, -aiohttp/__pycache__/compression_utils.cpython-312.pyc,, -aiohttp/__pycache__/connector.cpython-312.pyc,, -aiohttp/__pycache__/cookiejar.cpython-312.pyc,, -aiohttp/__pycache__/formdata.cpython-312.pyc,, -aiohttp/__pycache__/hdrs.cpython-312.pyc,, -aiohttp/__pycache__/helpers.cpython-312.pyc,, -aiohttp/__pycache__/http.cpython-312.pyc,, -aiohttp/__pycache__/http_exceptions.cpython-312.pyc,, -aiohttp/__pycache__/http_parser.cpython-312.pyc,, -aiohttp/__pycache__/http_websocket.cpython-312.pyc,, -aiohttp/__pycache__/http_writer.cpython-312.pyc,, -aiohttp/__pycache__/log.cpython-312.pyc,, -aiohttp/__pycache__/multipart.cpython-312.pyc,, -aiohttp/__pycache__/payload.cpython-312.pyc,, -aiohttp/__pycache__/payload_streamer.cpython-312.pyc,, -aiohttp/__pycache__/pytest_plugin.cpython-312.pyc,, -aiohttp/__pycache__/resolver.cpython-312.pyc,, -aiohttp/__pycache__/streams.cpython-312.pyc,, -aiohttp/__pycache__/tcp_helpers.cpython-312.pyc,, -aiohttp/__pycache__/test_utils.cpython-312.pyc,, -aiohttp/__pycache__/tracing.cpython-312.pyc,, -aiohttp/__pycache__/typedefs.cpython-312.pyc,, -aiohttp/__pycache__/web.cpython-312.pyc,, -aiohttp/__pycache__/web_app.cpython-312.pyc,, -aiohttp/__pycache__/web_exceptions.cpython-312.pyc,, -aiohttp/__pycache__/web_fileresponse.cpython-312.pyc,, -aiohttp/__pycache__/web_log.cpython-312.pyc,, -aiohttp/__pycache__/web_middlewares.cpython-312.pyc,, -aiohttp/__pycache__/web_protocol.cpython-312.pyc,, -aiohttp/__pycache__/web_request.cpython-312.pyc,, -aiohttp/__pycache__/web_response.cpython-312.pyc,, -aiohttp/__pycache__/web_routedef.cpython-312.pyc,, -aiohttp/__pycache__/web_runner.cpython-312.pyc,, -aiohttp/__pycache__/web_server.cpython-312.pyc,, -aiohttp/__pycache__/web_urldispatcher.cpython-312.pyc,, -aiohttp/__pycache__/web_ws.cpython-312.pyc,, -aiohttp/__pycache__/worker.cpython-312.pyc,, -aiohttp/_cookie_helpers.py,sha256=xjCVZKrQIfH1bwN5UeNrem8kevnXwZcBoNY94yyk8Qc,12418 -aiohttp/_cparser.pxd,sha256=UnbUYCHg4NdXfgyRVYAMv2KTLWClB4P-xCrvtj_r7ew,4295 -aiohttp/_find_header.pxd,sha256=0GfwFCPN2zxEKTO1_MA5sYq2UfzsG8kcV3aTqvwlz3g,68 -aiohttp/_headers.pxi,sha256=n701k28dVPjwRnx5j6LpJhLTfj7dqu2vJt7f0O60Oyg,2007 -aiohttp/_http_parser.cpython-312-x86_64-linux-gnu.so,sha256=ealDvc9qJCkwzAIYgtKMLkij41Qxk78JXdZiUokTTvg,2878000 -aiohttp/_http_parser.pyx,sha256=1L07PKuJjgDGQuqlmy965a5aoTdOaYWX99gFowLyPiE,28239 -aiohttp/_http_writer.cpython-312-x86_64-linux-gnu.so,sha256=fGELEfKELoBWO-C9VKXunQnqSLURO1RvlGL59rVyOt8,511688 -aiohttp/_http_writer.pyx,sha256=96seJigne4J3LVnB3DAzwTSV12nfZ7HR1JsaR0p13VI,4561 -aiohttp/_websocket/.hash/mask.pxd.hash,sha256=Y0zBddk_ck3pi9-BFzMcpkcvCKvwvZ4GTtZFb9u1nxQ,128 -aiohttp/_websocket/.hash/mask.pyx.hash,sha256=90owpXYM8_kIma4KUcOxhWSk-Uv4NVMBoCYeFM1B3d0,128 -aiohttp/_websocket/.hash/reader_c.pxd.hash,sha256=5xf3oobk6vx4xbJm-xtZ1_QufB8fYFtLQV2MNdqUc1w,132 -aiohttp/_websocket/__init__.py,sha256=Mar3R9_vBN_Ea4lsW7iTAVXD7OKswKPGqF5xgSyt77k,44 -aiohttp/_websocket/__pycache__/__init__.cpython-312.pyc,, -aiohttp/_websocket/__pycache__/helpers.cpython-312.pyc,, -aiohttp/_websocket/__pycache__/models.cpython-312.pyc,, -aiohttp/_websocket/__pycache__/reader.cpython-312.pyc,, -aiohttp/_websocket/__pycache__/reader_c.cpython-312.pyc,, -aiohttp/_websocket/__pycache__/reader_py.cpython-312.pyc,, -aiohttp/_websocket/__pycache__/writer.cpython-312.pyc,, -aiohttp/_websocket/helpers.py,sha256=P-XLv8IUaihKzDenVUqfKU5DJbWE5HvG8uhvUZK8Ic4,5038 -aiohttp/_websocket/mask.cpython-312-x86_64-linux-gnu.so,sha256=PISNT8-1dxCmHxX3aMjYsrAatk5CLnJtjvIvpL7sUcA,258728 -aiohttp/_websocket/mask.pxd,sha256=sBmZ1Amym9kW4Ge8lj1fLZ7mPPya4LzLdpkQExQXv5M,112 -aiohttp/_websocket/mask.pyx,sha256=BHjOtV0O0w7xp9p0LNADRJvGmgfPn9sGeJvSs0fL__4,1397 -aiohttp/_websocket/models.py,sha256=XAzjs_8JYszWXIgZ6R3ZRrF-tX9Q_6LiD49WRYojopM,2121 -aiohttp/_websocket/reader.py,sha256=eC4qS0c5sOeQ2ebAHLaBpIaTVFaSKX79pY2xvh3Pqyw,1030 -aiohttp/_websocket/reader_c.cpython-312-x86_64-linux-gnu.so,sha256=VkB5K9VXo-zC9aaa7p3xOwSTs-OgeYsqZE21uJ1Jd4w,1818512 -aiohttp/_websocket/reader_c.pxd,sha256=nl_njtDrzlQU0rjgGGjZDB-swguE0tX_bCPobkShVa4,2625 -aiohttp/_websocket/reader_c.py,sha256=gSsE_iSBr7-ORvOmgkCT7Jpj4_j3854i_Cp88Se1_6E,18791 -aiohttp/_websocket/reader_py.py,sha256=gSsE_iSBr7-ORvOmgkCT7Jpj4_j3854i_Cp88Se1_6E,18791 -aiohttp/_websocket/writer.py,sha256=9qCnQnCFwPmvf6U6i_7VfTldjpcDfQ_ojeCv5mXoMkw,7139 -aiohttp/abc.py,sha256=jA2jRYAxc217gO96C-wDXcAPcDWjVJpqXrTGfa7uwqM,7148 -aiohttp/base_protocol.py,sha256=Tp8cxUPQvv9kUPk3w6lAzk6d2MAzV3scwI_3Go3C47c,3025 -aiohttp/client.py,sha256=UmwwoDurmDDvxTwa4e1VElko4mc8_Snsvs3CA6SE-kc,57584 -aiohttp/client_exceptions.py,sha256=uyKbxI2peZhKl7lELBMx3UeusNkfpemPWpGFq0r6JeM,11367 -aiohttp/client_middleware_digest_auth.py,sha256=_1RpbyJtbY42-qy5TGYvEa0PXZjAsFmf1CMXp-_626U,16938 -aiohttp/client_middlewares.py,sha256=kP5N9CMzQPMGPIEydeVUiLUTLsw8Vl8Gr4qAWYdu3vM,1918 -aiohttp/client_proto.py,sha256=56_WtLStZGBFPYKzgEgY6v24JkhV1y6JEmmuxeJT2So,12110 -aiohttp/client_reqrep.py,sha256=OJuvhGlFMxq7i0z2WLovzeaAcICeNn3qKA25MhwsZrY,53524 -aiohttp/client_ws.py,sha256=1CIjIXwyzOMIYw6AjUES4-qUwbyVHW1seJKQfg_Rta8,15109 -aiohttp/compression_utils.py,sha256=LDUVfDiChHNb_ojMEITJuoSEbOAQ4Qznu07vTHL-_pY,8868 -aiohttp/connector.py,sha256=WQetKoSW7XnHA9r4o9OWwO3-n7ymOwBd2Tg_xHNw0Bs,68456 -aiohttp/cookiejar.py,sha256=e28ZMQwJ5P0vbPX1OX4Se7-k3zeGvocFEqzGhwpG53k,18922 -aiohttp/formdata.py,sha256=dRmQY8LA6WSj5HzqF9tUzu_SNe6mzZ1DqXXkyg4ga20,6410 -aiohttp/hdrs.py,sha256=2rj5MyA-6yRdYPhW5UKkW4iNWhEAlGIOSBH5D4FmKNE,5111 -aiohttp/helpers.py,sha256=bblNEhp4hFimEmxMdPNxEluBY17L5YUArHYvoxzoEe4,29614 -aiohttp/http.py,sha256=8o8j8xH70OWjnfTWA9V44NR785QPxEPrUtzMXiAVpwc,1842 -aiohttp/http_exceptions.py,sha256=AZafFHgtAkAgrKZf8zYPU8VX2dq32-VAoP-UZxBLU0c,2960 -aiohttp/http_parser.py,sha256=SRADKjgUtYJxUgvvYTyJA0wB8WpKjTcKpzIT8fsE1aE,36896 -aiohttp/http_websocket.py,sha256=8VXFKw6KQUEmPg48GtRMB37v0gTK7A0inoxXuDxMZEc,842 -aiohttp/http_writer.py,sha256=fbRtKPYSqRbtAdr_gqpjF2-4sI1ESL8dPDF-xY_mAMY,12446 -aiohttp/log.py,sha256=BbNKx9e3VMIm0xYjZI0IcBBoS7wjdeIeSaiJE7-qK2g,325 -aiohttp/multipart.py,sha256=YvgDa5-vOAk9njEJAVwa-L6XVu83PNdct56tDJsfSjI,39867 -aiohttp/payload.py,sha256=qHpvXhgJyODHjb6tEq7oyB6ChCBRVZV7kd3QAoMhW8k,41044 -aiohttp/payload_streamer.py,sha256=ZzEYyfzcjGWkVkK3XR2pBthSCSIykYvY3Wr5cGQ2eTc,2211 -aiohttp/py.typed,sha256=sow9soTwP9T_gEAQSVh7Gb8855h04Nwmhs2We-JRgZM,7 -aiohttp/pytest_plugin.py,sha256=z4XwqmsKdyJCKxbGiA5kFf90zcedvomqk4RqjZbhKNk,12901 -aiohttp/resolver.py,sha256=gsrfUpFf8iHlcHfJvY-1fiBHW3PRvRVNb5lNZBg3zlY,10031 -aiohttp/streams.py,sha256=U-qTkuAqIfpJChuKEy-vYn8nQ_Z1MVcW0WO2DHiJz_o,22329 -aiohttp/tcp_helpers.py,sha256=BSadqVWaBpMFDRWnhaaR941N9MiDZ7bdTrxgCb0CW-M,961 -aiohttp/test_utils.py,sha256=ZJSzZWjC76KSbtwddTKcP6vHpUl_ozfAf3F93ewmHRU,23016 -aiohttp/tracing.py,sha256=-6aaW6l0J9uJD45LzR4cijYH0j62pt0U_nn_aVzFku4,14558 -aiohttp/typedefs.py,sha256=wUlqwe9Mw9W8jT3HsYJcYk00qP3EMPz3nTkYXmeNN48,1657 -aiohttp/web.py,sha256=sG_U41AY4S_LBY9sReiBzXKJRZpXk8xgiE_l5S_UPPg,18390 -aiohttp/web_app.py,sha256=lGU_aAMN-h3wy-LTTHi6SeKH8ydt1G51BXcCspgD5ZA,19452 -aiohttp/web_exceptions.py,sha256=7nIuiwhZ39vJJ9KrWqArA5QcWbUdqkz2CLwEpJapeN8,10360 -aiohttp/web_fileresponse.py,sha256=EtDuw5mF7uGkjrrwSBaDQk6F1FJW4pnwE2pZGv3T1QI,16474 -aiohttp/web_log.py,sha256=rX5D7xLOX2B6BMdiZ-chme_KfJfW5IXEoFwLfkfkajs,7865 -aiohttp/web_middlewares.py,sha256=sFI0AgeNjdyAjuz92QtMIpngmJSOxrqe2Jfbs4BNUu0,4165 -aiohttp/web_protocol.py,sha256=c8a0PKGqfhIAiq2RboMsy1NRza4dnj6gnXIWvJUeCF0,27015 -aiohttp/web_request.py,sha256=zN96OlMRlrCFOMRpdh7y9rvHP0Hm8zavC0OFCj0wlSg,29833 -aiohttp/web_response.py,sha256=GlxFuiUqqHoXkGGFymII59SbIKU-itLgsl-bD0wGrzc,29342 -aiohttp/web_routedef.py,sha256=VT1GAx6BrawoDh5RwBwBu5wSABSqgWwAe74AUCyZAEo,6110 -aiohttp/web_runner.py,sha256=v1G1nKiOOQgFnTSR4IMc6I9ReEFDMaHtMLvO_roDM-A,11786 -aiohttp/web_server.py,sha256=-9WDKUAiR9ll-rSdwXSqG6YjaoW79d1R4y0BGSqgUMA,2888 -aiohttp/web_urldispatcher.py,sha256=sFkcsa8qLFkDp47_oW7Z7fiq7DcVXiff1Etn0QN8DJA,44000 -aiohttp/web_ws.py,sha256=lItgmyatkXh0M6EY7JoZnSZkUl6R0wv8B88X4ILqQbU,22739 -aiohttp/worker.py,sha256=zT0iWN5Xze194bO6_VjHou0x7lR_k0MviN6Kadnk22g,8152 diff --git a/venv/lib/python3.12/site-packages/aiohttp-3.12.14.dist-info/REQUESTED b/venv/lib/python3.12/site-packages/aiohttp-3.12.14.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/aiohttp-3.12.14.dist-info/WHEEL b/venv/lib/python3.12/site-packages/aiohttp-3.12.14.dist-info/WHEEL deleted file mode 100644 index e21e9f2..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp-3.12.14.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (80.9.0) -Root-Is-Purelib: false -Tag: cp312-cp312-manylinux_2_17_x86_64 -Tag: cp312-cp312-manylinux2014_x86_64 - diff --git a/venv/lib/python3.12/site-packages/aiohttp-3.12.14.dist-info/licenses/LICENSE.txt b/venv/lib/python3.12/site-packages/aiohttp-3.12.14.dist-info/licenses/LICENSE.txt deleted file mode 100644 index e497a32..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp-3.12.14.dist-info/licenses/LICENSE.txt +++ /dev/null @@ -1,13 +0,0 @@ - Copyright aio-libs contributors. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/venv/lib/python3.12/site-packages/aiohttp-3.12.14.dist-info/top_level.txt b/venv/lib/python3.12/site-packages/aiohttp-3.12.14.dist-info/top_level.txt deleted file mode 100644 index ee4ba4f..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp-3.12.14.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -aiohttp diff --git a/venv/lib/python3.12/site-packages/aiohttp/.hash/_cparser.pxd.hash b/venv/lib/python3.12/site-packages/aiohttp/.hash/_cparser.pxd.hash deleted file mode 100644 index 3f5cd0e..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/.hash/_cparser.pxd.hash +++ /dev/null @@ -1 +0,0 @@ -5276d46021e0e0d7577e0c9155800cbf62932d60a50783fec42aefb63febedec /home/runner/work/aiohttp/aiohttp/aiohttp/_cparser.pxd diff --git a/venv/lib/python3.12/site-packages/aiohttp/.hash/_find_header.pxd.hash b/venv/lib/python3.12/site-packages/aiohttp/.hash/_find_header.pxd.hash deleted file mode 100644 index f006c2d..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/.hash/_find_header.pxd.hash +++ /dev/null @@ -1 +0,0 @@ -d067f01423cddb3c442933b5fcc039b18ab651fcec1bc91c577693aafc25cf78 /home/runner/work/aiohttp/aiohttp/aiohttp/_find_header.pxd diff --git a/venv/lib/python3.12/site-packages/aiohttp/.hash/_http_parser.pyx.hash b/venv/lib/python3.12/site-packages/aiohttp/.hash/_http_parser.pyx.hash deleted file mode 100644 index d8c2036..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/.hash/_http_parser.pyx.hash +++ /dev/null @@ -1 +0,0 @@ -d4bd3b3cab898e00c642eaa59b2f7ae5ae5aa1374e698597f7d805a302f23e21 /home/runner/work/aiohttp/aiohttp/aiohttp/_http_parser.pyx diff --git a/venv/lib/python3.12/site-packages/aiohttp/.hash/_http_writer.pyx.hash b/venv/lib/python3.12/site-packages/aiohttp/.hash/_http_writer.pyx.hash deleted file mode 100644 index 771a6b1..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/.hash/_http_writer.pyx.hash +++ /dev/null @@ -1 +0,0 @@ -f7ab1e2628277b82772d59c1dc3033c13495d769df67b1d1d49b1a474a75dd52 /home/runner/work/aiohttp/aiohttp/aiohttp/_http_writer.pyx diff --git a/venv/lib/python3.12/site-packages/aiohttp/.hash/hdrs.py.hash b/venv/lib/python3.12/site-packages/aiohttp/.hash/hdrs.py.hash deleted file mode 100644 index c8d5524..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/.hash/hdrs.py.hash +++ /dev/null @@ -1 +0,0 @@ -dab8f933203eeb245d60f856e542a45b888d5a110094620e4811f90f816628d1 /home/runner/work/aiohttp/aiohttp/aiohttp/hdrs.py diff --git a/venv/lib/python3.12/site-packages/aiohttp/__init__.py b/venv/lib/python3.12/site-packages/aiohttp/__init__.py deleted file mode 100644 index a3ab781..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/__init__.py +++ /dev/null @@ -1,278 +0,0 @@ -__version__ = "3.12.14" - -from typing import TYPE_CHECKING, Tuple - -from . import hdrs as hdrs -from .client import ( - BaseConnector, - ClientConnectionError, - ClientConnectionResetError, - ClientConnectorCertificateError, - ClientConnectorDNSError, - ClientConnectorError, - ClientConnectorSSLError, - ClientError, - ClientHttpProxyError, - ClientOSError, - ClientPayloadError, - ClientProxyConnectionError, - ClientRequest, - ClientResponse, - ClientResponseError, - ClientSession, - ClientSSLError, - ClientTimeout, - ClientWebSocketResponse, - ClientWSTimeout, - ConnectionTimeoutError, - ContentTypeError, - Fingerprint, - InvalidURL, - InvalidUrlClientError, - InvalidUrlRedirectClientError, - NamedPipeConnector, - NonHttpUrlClientError, - NonHttpUrlRedirectClientError, - RedirectClientError, - RequestInfo, - ServerConnectionError, - ServerDisconnectedError, - ServerFingerprintMismatch, - ServerTimeoutError, - SocketTimeoutError, - TCPConnector, - TooManyRedirects, - UnixConnector, - WSMessageTypeError, - WSServerHandshakeError, - request, -) -from .client_middleware_digest_auth import DigestAuthMiddleware -from .client_middlewares import ClientHandlerType, ClientMiddlewareType -from .compression_utils import set_zlib_backend -from .connector import ( - AddrInfoType as AddrInfoType, - SocketFactoryType as SocketFactoryType, -) -from .cookiejar import CookieJar as CookieJar, DummyCookieJar as DummyCookieJar -from .formdata import FormData as FormData -from .helpers import BasicAuth, ChainMapProxy, ETag -from .http import ( - HttpVersion as HttpVersion, - HttpVersion10 as HttpVersion10, - HttpVersion11 as HttpVersion11, - WebSocketError as WebSocketError, - WSCloseCode as WSCloseCode, - WSMessage as WSMessage, - WSMsgType as WSMsgType, -) -from .multipart import ( - BadContentDispositionHeader as BadContentDispositionHeader, - BadContentDispositionParam as BadContentDispositionParam, - BodyPartReader as BodyPartReader, - MultipartReader as MultipartReader, - MultipartWriter as MultipartWriter, - content_disposition_filename as content_disposition_filename, - parse_content_disposition as parse_content_disposition, -) -from .payload import ( - PAYLOAD_REGISTRY as PAYLOAD_REGISTRY, - AsyncIterablePayload as AsyncIterablePayload, - BufferedReaderPayload as BufferedReaderPayload, - BytesIOPayload as BytesIOPayload, - BytesPayload as BytesPayload, - IOBasePayload as IOBasePayload, - JsonPayload as JsonPayload, - Payload as Payload, - StringIOPayload as StringIOPayload, - StringPayload as StringPayload, - TextIOPayload as TextIOPayload, - get_payload as get_payload, - payload_type as payload_type, -) -from .payload_streamer import streamer as streamer -from .resolver import ( - AsyncResolver as AsyncResolver, - DefaultResolver as DefaultResolver, - ThreadedResolver as ThreadedResolver, -) -from .streams import ( - EMPTY_PAYLOAD as EMPTY_PAYLOAD, - DataQueue as DataQueue, - EofStream as EofStream, - FlowControlDataQueue as FlowControlDataQueue, - StreamReader as StreamReader, -) -from .tracing import ( - TraceConfig as TraceConfig, - TraceConnectionCreateEndParams as TraceConnectionCreateEndParams, - TraceConnectionCreateStartParams as TraceConnectionCreateStartParams, - TraceConnectionQueuedEndParams as TraceConnectionQueuedEndParams, - TraceConnectionQueuedStartParams as TraceConnectionQueuedStartParams, - TraceConnectionReuseconnParams as TraceConnectionReuseconnParams, - TraceDnsCacheHitParams as TraceDnsCacheHitParams, - TraceDnsCacheMissParams as TraceDnsCacheMissParams, - TraceDnsResolveHostEndParams as TraceDnsResolveHostEndParams, - TraceDnsResolveHostStartParams as TraceDnsResolveHostStartParams, - TraceRequestChunkSentParams as TraceRequestChunkSentParams, - TraceRequestEndParams as TraceRequestEndParams, - TraceRequestExceptionParams as TraceRequestExceptionParams, - TraceRequestHeadersSentParams as TraceRequestHeadersSentParams, - TraceRequestRedirectParams as TraceRequestRedirectParams, - TraceRequestStartParams as TraceRequestStartParams, - TraceResponseChunkReceivedParams as TraceResponseChunkReceivedParams, -) - -if TYPE_CHECKING: - # At runtime these are lazy-loaded at the bottom of the file. - from .worker import ( - GunicornUVLoopWebWorker as GunicornUVLoopWebWorker, - GunicornWebWorker as GunicornWebWorker, - ) - -__all__: Tuple[str, ...] = ( - "hdrs", - # client - "AddrInfoType", - "BaseConnector", - "ClientConnectionError", - "ClientConnectionResetError", - "ClientConnectorCertificateError", - "ClientConnectorDNSError", - "ClientConnectorError", - "ClientConnectorSSLError", - "ClientError", - "ClientHttpProxyError", - "ClientOSError", - "ClientPayloadError", - "ClientProxyConnectionError", - "ClientResponse", - "ClientRequest", - "ClientResponseError", - "ClientSSLError", - "ClientSession", - "ClientTimeout", - "ClientWebSocketResponse", - "ClientWSTimeout", - "ConnectionTimeoutError", - "ContentTypeError", - "Fingerprint", - "FlowControlDataQueue", - "InvalidURL", - "InvalidUrlClientError", - "InvalidUrlRedirectClientError", - "NonHttpUrlClientError", - "NonHttpUrlRedirectClientError", - "RedirectClientError", - "RequestInfo", - "ServerConnectionError", - "ServerDisconnectedError", - "ServerFingerprintMismatch", - "ServerTimeoutError", - "SocketFactoryType", - "SocketTimeoutError", - "TCPConnector", - "TooManyRedirects", - "UnixConnector", - "NamedPipeConnector", - "WSServerHandshakeError", - "request", - # client_middleware - "ClientMiddlewareType", - "ClientHandlerType", - # cookiejar - "CookieJar", - "DummyCookieJar", - # formdata - "FormData", - # helpers - "BasicAuth", - "ChainMapProxy", - "DigestAuthMiddleware", - "ETag", - "set_zlib_backend", - # http - "HttpVersion", - "HttpVersion10", - "HttpVersion11", - "WSMsgType", - "WSCloseCode", - "WSMessage", - "WebSocketError", - # multipart - "BadContentDispositionHeader", - "BadContentDispositionParam", - "BodyPartReader", - "MultipartReader", - "MultipartWriter", - "content_disposition_filename", - "parse_content_disposition", - # payload - "AsyncIterablePayload", - "BufferedReaderPayload", - "BytesIOPayload", - "BytesPayload", - "IOBasePayload", - "JsonPayload", - "PAYLOAD_REGISTRY", - "Payload", - "StringIOPayload", - "StringPayload", - "TextIOPayload", - "get_payload", - "payload_type", - # payload_streamer - "streamer", - # resolver - "AsyncResolver", - "DefaultResolver", - "ThreadedResolver", - # streams - "DataQueue", - "EMPTY_PAYLOAD", - "EofStream", - "StreamReader", - # tracing - "TraceConfig", - "TraceConnectionCreateEndParams", - "TraceConnectionCreateStartParams", - "TraceConnectionQueuedEndParams", - "TraceConnectionQueuedStartParams", - "TraceConnectionReuseconnParams", - "TraceDnsCacheHitParams", - "TraceDnsCacheMissParams", - "TraceDnsResolveHostEndParams", - "TraceDnsResolveHostStartParams", - "TraceRequestChunkSentParams", - "TraceRequestEndParams", - "TraceRequestExceptionParams", - "TraceRequestHeadersSentParams", - "TraceRequestRedirectParams", - "TraceRequestStartParams", - "TraceResponseChunkReceivedParams", - # workers (imported lazily with __getattr__) - "GunicornUVLoopWebWorker", - "GunicornWebWorker", - "WSMessageTypeError", -) - - -def __dir__() -> Tuple[str, ...]: - return __all__ + ("__doc__",) - - -def __getattr__(name: str) -> object: - global GunicornUVLoopWebWorker, GunicornWebWorker - - # Importing gunicorn takes a long time (>100ms), so only import if actually needed. - if name in ("GunicornUVLoopWebWorker", "GunicornWebWorker"): - try: - from .worker import GunicornUVLoopWebWorker as guv, GunicornWebWorker as gw - except ImportError: - return None - - GunicornUVLoopWebWorker = guv # type: ignore[misc] - GunicornWebWorker = gw # type: ignore[misc] - return guv if name == "GunicornUVLoopWebWorker" else gw - - raise AttributeError(f"module {__name__} has no attribute {name}") diff --git a/venv/lib/python3.12/site-packages/aiohttp/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index f484b8da1bdf0326e177910dac350a8c96ca9408..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5337 zcmb`K$#WaW6^Ca4kN^pS`%X%t7E6LQYP01r z?tZ>@|3uz3$~}jW^&tI}dNNH@$q^xBwT~MK4`v zT!H~M0E280QY_`!62=e=vtbxvBQVNFVT_HzI2(t{>@r+oSG+p)##NYL6EMjp;TpRJ zQ)~*Zv+FR;rXkJJUY!PG24>kT++a6gj?KYMb`$2=JTS)KE%p}NVz=OJ_BOo3-T{Rv zaGTu*m8o9aMq>doEaRn{3=KHrkY!oOv7BdXHu9h|9qzC@u*ep{UD%9>7EP5Z-0)$`TLR zF^rj3;}N{4z6bBC@1y@V_7fiFA875_P!|Rr|4{2VkN>sK&DLy4>-r$VKGM3eW+(q? zHlp=l{&A@{x$9o^%!yN{PnY~TPr2sn((V!3p!}_vr}rxuvE>j5=_Nw zw0)XE^J#v!$Q@VI`^|B#1^+QE~(ncPA#zrg~hE!KghD8mYd_6-W6p2(`)y)ajKT0Ap zJfr54Q4yytzrk%UuoIgyr%sA3*;Ar^BclBsjL)T0hDFMvaZ$6ehF;Ric|(ngo9B3)Zxkwb&?6uI5jYT_1eIYGCe#xo}QVW7p((M$;^zSUvqk}0acz!swlM+{-aJr(ECUarXc*#I6&G^D&^VLFx*E;M zuac}1iQ$Q4+lWY?48C%Ve z$Yk}L*j>)hMTAk1LPvOkn3}iaj_BL5JniD12Q{{P@J6NmXAge)i#$y8qQfyLa7Qre z9MSHLVaRk+Y9`Oe^m5M~TkNPvPSBvYTo5eanB};Y0r>+)cbiH#52wd#9mr)WUo;of z7{P(-w#|hVpIh1tuVi?E7BgtGYjYd_m^qtVc5f~&3u4gJpJFhU&4cv!1!v%0k=`h$ zd4}stc!hYY_IXHjj22BjW7+2HjjNVbK&hCs>_v>YrgFiCDQVi(_&~8=CPWD_LJfgl z>2{n@M@SIr2@QlsLKC5x&`M|_v=KT8?SxJOy|CdkOu7lY}#b(}Z(`R|&5XUMIXkI7Oi6pM93_CgB3% zA|XW>APf>N5rzoEgb~6hVT>?NxJ^6Nt`VjP*9lh$(}Xl(hA>OGL6{@lB+L^S z;Vr`3gj_8P)nB z*Ppk5_v5?5S?V9MGDX01=k&YW;5ih6#? z%lO{4$X=VqDJO!`ISH$i{z%ljpl`tyDVBpW|@ z=cSUgEUkp+rDZu;J!#umW>*ntpYBD$(uxM}yVu;8SDil7>Qi03!xoAz?@LyT>Sgcz zSN2rI$Dv@^!52mSK)JI2n20F~%^&wEY(GHvBAhEOiBN9Yp%v)s>$C5ZHLfUl^HE2* zq939qMk`8j@kn|alVWvi4Hv(RUVIt~*K~eUH;1PE2iIbIzUtk*7VG+|y?braUKh9lP*_`$cxGYxs|~BWsb7e}3N}HTL{Nl50Bu)Y9=Z zjQ@XdNRvK_os@oCb3Xh#`FwaX`7wP;+9+yAywimq-ro+64Gx|Y39R{yFX?Ij~UeebAtMOj5Gi%(t+Un!o( zifEo21>BQOVoN%U-@|w~w+rnhEZHQqDX$YKzcqh^=89(O&iit5!Ttpk{}#`0%94CZ{ze-8TIyd9h0#Y$lBeXar6b=+XTFrqtcPOc z7x5ioy?I-+p_dG)tmqSk<;)M4-X?x;)ntHPGGqhs%X{=rzm7ipuVy~m}r`hkl I|K8&L3#NHS^#A|> diff --git a/venv/lib/python3.12/site-packages/aiohttp/__pycache__/_cookie_helpers.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/__pycache__/_cookie_helpers.cpython-312.pyc deleted file mode 100644 index 586ae5d081bdb574192e92b7be196ce38ad3e0ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10103 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 L#jn^a#@YV|gWY$= diff --git a/venv/lib/python3.12/site-packages/aiohttp/__pycache__/abc.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/__pycache__/abc.cpython-312.pyc deleted file mode 100644 index cfb2dd1e0f1d9ede9ed62de42e6a37ebb693c73f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12505 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 diff --git a/venv/lib/python3.12/site-packages/aiohttp/__pycache__/base_protocol.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/__pycache__/base_protocol.cpython-312.pyc deleted file mode 100644 index c6538561dca079ca7dd42c2fb99b95b13770cdc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4543 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 ZvQK?)GtBOf4!4q-W-{|7!I62=e*sm?&Uyd< diff --git a/venv/lib/python3.12/site-packages/aiohttp/__pycache__/client.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/__pycache__/client.cpython-312.pyc deleted file mode 100644 index 45105fe723bb05adf0b0ce1d1fe1207777aac8d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55557 zcmd?S3s_s%l`nqu0t5mHAwYlt@kTt&!^YqT#(>|(j=^@KBvmlyV1p5IkAxi)k=RMv zK610=gyr<#;FtyGvk?NW|}+q-cOCwSK9B+ z|F`xzM-sA}bei6o`M&=Ft+UVC@3r51t-bbt%g)Z^@SOWkkDZ9#=C~iyhw>O@!<|(v z$6ewMb3EtdconanQaM%Zt#+!}TjSKQx7Mj;Z=F-e-f7M>_D*-Evv-Cw18>cg-ks^p zR8d&ksVuj_X<%mERJJ?End3G(jc$|EBd}qG9z**ofbQZd; zPOH1fS>!Hu7Q0KFC2pJ3<}P)Xy33qp?s8|j+wQcxE1VT9T=i6?vl4NoO;x$8oz?Cd zXN|koS?jKI)-n6^sd~4=>3}(d*H1OL8=Z~rCTEko+1bo+nNuz9R%a_SXHBhhw>jIG z*)Y}a?r?UvJDr{G_0IL~4bBbjE@zi}qjRIX+u7~zarU@3IXAgCJ2$(xIJdaBI=8xe zoxSdD&TZ~KXPko$o10E;_&>Y)2R=Y8%&&O_`wXKL6z;v8`wb{=*gaUO9Wbslx!@4TPc z8K)j_JDpDVgU$!t4>=!VIMdX_?vFS>;&wS*?nj)DxJR9%?qkkl%r19o%*{J_W;Ra= z?s4b1`?&MC`-Jm^d%`*4o^(#SPdZP!r<_x6x6{qsaXbNbvf&KZWwpE~V6<2>Vj)cGj;E|@y&o^{T;A9FtD_B;LVIp>`Fap&W( zD|9{~gV~%H)SHI{6UCi5c)kHLn;o>M7?_Do)Mq z9e^QG6yUX}eipH_21CBkB@U~Oo8IsIL;zp9b&EQ|_-QTeJ`!n`VbaDE)2 ze4MZ1tFP54cFt#nJmKR-a3Rd|wVUyVn}rh`U-x;{t18K(^I72Re7$g3cuJuT4QsG-)(D3VoPx5WT<9xf|;X8z4!A0@$ zoiM53vmw!sWM=m3g{Oq4nQ4RY>G2%C>*+M-XV0qtuf=BMrFb?<@i@9?t-D4>4%+*t zCWL99ecU73N4;mK$0j^2Z&Nad9I8l$cjnY7QSf?U&K?m*$An{}V<$(>o)R1uARah4 z=<44!*uQu8(9VdaZ~AOR-*;wo!Z&(sN{D3ik4{Z7lfK_0dS-kR(?UeIV`6%ADx%*Z zdS->`VZj&C?-Zs5an$D#Bk9aIF&4?#?E{Je(e9h@`XcH3M^Bxam_8oKIB?20;h_*R zhJ}yL2-9OiL_?wIMrKZtb4pr7Pmmv&7=uqT9vKxQy2I1(=+H*8`giZ2net6AYkl09 z6EhwZJ&&G^Xc4i9Y-mLr*(uK`4=3iM!m(k`*h#@R zFzOqBjrs)1L1B`EfuUi^!jfc>+WGMCKFK0Wa=ymzE@YL_L&9cDP7cTs zn5EBy5+x)ja#on9oHp;wf=r+P8ng>mK!uorstvt2MbdOBHMl&NSlj>>r&z zt0c#ZnmD{4t#$Oc5T{bX(P1gPU8B>y_r&N)iFyuoM6MtECwP8JI5R3TPZ8^}nTaXh zHO9IHmpf+Zb?72;`5&UThju9!ol>5Wtc2V|vSe4gr^h{!T$fuAj|(oZcgl5YR2+4C z(VU6~26yxw-Z$bpI_&D-w|j7C#5J;e|KNecBN4ey#~M~F3ZqnfM~7ufAW=osjk)@U z23&*t4~{(G8b+72zt1&1I1go|e^rGX47!!yy$_ruw;;1-*4ipqN9UWd<>XFPdUYGEw&vjgwju>P!3dAd* zKIm8vAIV}b5Mg}cILMo|XZXO-;PjY>;xO#Il$CDmnG$x|8T<_)56!(ym zbWv&rVlTc>Q!>$mfoMKZ_Z9WqG=F+KOR`BjJbeno<`}+WPr7Wn6UEqai4!=iE;y(9 zFehjPtS2Y~f(|Bi%%owaG$EbWN^>OG>SSC-0xnI)>4i)-yNJ6^mu<2VTxT$x0b%Kx zDI2Ct*7hva znB3CRPsoid*LzaxAUrMwrKRp7V#I9AbH*jgqntOA?H+wJ;WJ|lixd&{8G)XdnLa7- z5xwx}DGZ2h>()g~;^>4|U_Fx8H|m@5Msh^N=$b*tH02UJ;}IR}vm%*N*F{mz*04F% zgHn$yw~Z!ytdDH6V;B`4j->mfPB5ZD?;kOG**NJs;qm&W(H%#!r4W_e9Ge;UPRt6(=#0+#NvfJ)!l4$1SvCD&Rfc zI^Y?babtAww)%uA;W!4)X0LAoQ%$j%_neug38)~pp2nEcIyG^u_0(D43D0y#OIv%Z z7ehcZbvu|0cw0v&JTz-XlujC--WiN`MQab|7p-WE z!g&QN+JbOS-eUifWy!aAAed9VqOGRzI+rYqJ;Cg<6>VAAnD^9ya6!q^z;gA~jO#6d zw!YW8zdQ2H-ay--VEu5wHXJM%S<#M!E!GvSHJoKyv?8LiU>1wWl)pH!Y+3XKO;S=j zSG1jBea`&sQs;6>z}OVjH?L@$!}-Na9n0FK?qGh+inb=4XI-)_`vOIc!MvswZBrOI zI=Vc3wQBkPU}?*BZJ@L>Sh#*gyFP3#T+%F!Ea`*h$`x%T1=G1~S?USqv)B+!-V(o5 z6wIqy(N={mMN3snz9mP{!m^oLv{WCc>IxQb4CZ#<(sqlVR%pND6;(v%LmitM!Dww@ zHG9;DIlwV=2$%q1jTF&&r#wFIn!$qx7kchY0VEC{yvm8;L(sAACQTYVfJ;xnv0((b zj0BvPx+UQB2{<;i@M%tTmO>iOhK{o;M}~L;PKU(L0#fh9mN5~%7posM*-<`XU`E;E zZ5=tw857Wl_)ehnIpLY&9a-WhfEF(h_#^=ej5UUcZX7k*Cw__$&l7lo!0!=wk-+Z| zVAT5znJ6s`d|99-yK(N=`ZtIqA5zkg9!a8bcj)STNr|LBr# z;R!1I>iTp07VDSRUu<2`)`xAS=Y|#sZ)r=V2q^4{CNzt;%V2V-rBqT{%rHrz5s(Ci=k!LS#zQdQnzDB5(=MLrY zTf_X?fv*$lWqbufLO6UCe${Z}5E{r8b6F!a^0oNY;a4v-@eZL`Xkj)D2%{EstdZt5 zd?T+J-^w>Vo$hSqn}sr7@=sVT-}1E9xlU*k4ScI$!|qc%bDcKNjjQ;!rwz^yp%bQd z8L#C#p4K_n3mYbSNA-pMQEgfKw-vR8Qb8g13S0SY$U`4~ zsp`YM%YHj3-wz58fTmQg8kwepD2)o1uN}amw2_w7<;}{T-w9W#Y8{n#eXJhriiNrx zrd}5Q9+Ii;EW0-hbydO9z&s3)G-=dT0_5RdNMa=<}`~&zk^3L%V{y|V;=l|a+ zA>@J*4}lW95~$zEKa3Xp5wzId@7p(g1bxFpDf)#p-UYvVQrbKMo4qM*Mq#rrrOh$e z>`!Sk2AiRjHau(&q_h!Wb8wnREgyeD#avLY(8c;h>bZ`C8hh?(djht5F`lLNI|18$ zXhV~7$ka>4Lp}-H{r9w;g6+^fZQZa{@+0-JY5X+hgnyRz;C-KP2t94ZxSBupv^K_x z8D>~{gooWn6YNHqogG*)0ehHXj|h!IqcXzr-UR!jv3Pt5*!zY1C%>GcM_C8TN+Z+E z8rPK8lw&+nb2`DLlf{PdlRuMyeGu4B@Q)^79%Aku7Cu5f9bBJHuyZjxd0qg!*#x^s zm|ZEbk0oG78J1}2Prx2y*!P_Wz{gyIkFi)dk0)UH81{(-tiZ7Hi~!-BORyV98J|ZP zAIJMiyif2?q2DYMCMdV8Z+{x!?2G>xOp{W7kI^lI|2W*A{r_v-$-7eds`f3*cd&A zjaIgqX^I(L9&zIM#5DGPy`C8nYkIb_Ck7Ih-tr0oo3c9Bl*e-_k_8m)D!L}Ytue*z zU0CK~<1rg6{_#;TZrJ81Ceheym$pG&v{mB5uEGR(0oWhNXL|=8AMGJXJO0upt4rC2 z$aUSd*3| z1-Qgv$*3Nh)y??En>Vu68@8EMVnlV!OP=g@k=AkVWo(`TC!QbOI$I!ZCdvD*Eed`e z)?v)Yd3pIq3qkCn>EqQ%OSMS!0WZ!Fc!Iz=0;dU_0f^)zRh8`6E)y#tYll-ME}O5+s&l0y1Ef%hep7$7G>0yhb) z5V%F)4FW$PKzS5H1i}PjITGKbPs)oJA+R@EQe+crCtS1wVt9?YEr!oG-Td0LsKD>o+I3REgVt6^g&fO2rg^^IBiE^2O_} zr6~d?s1J1tK9wj3@=LosNsr%rEnTSvYtoc={&#+(@ba!@qzdl?@}$34o~92Z)Le_N zK}o(6hu4}w{Y)S6*VyB?C?)YcHferuO}VVe=UUn)mZd=n0cDwYKG7yS!KQ3Y+1WlI zpE>u+r(b<8+t(UPy~ba5&8XyYPMx|Z@M~sNVwR8ihwR}^3F*=xml#o`$FG^}P|WeS z(niE)A8{GkGr2)A#oxYe#XL#u$E1hPRbo}%h&fi%{Kj(zU$5fDueoMcT+JE%M!2-c z?6hJD>gYD*JN};RkDC>fU#oq5B(YEt-e?``Mjq&f5t$pFIK{Wk9A56)5f@aCDcTFe-^%Cwa0J3SG(fZ zpN+3ro$*^S;;2>JaT=#OV{W*~6N)+h9^f8EuRLe>+b2)Pv5HAahl;yk(QJDBrcJLEm= zB;Mr_eFFcUs&%$PnI_oXnEBdIjGh+kqjt#?XxX*A0&pF?2r$`8il2@PWH294ePSLrKQDDH@kC9 z9wE39%Tz1|ubt*+QxGtV1&gWo%qhiX3k5N|XHA}dvw$cFuxMw8M^2!$QcUjbu|%z< znw{c1Gch$qWDo_n=d{41FzhlT(B9dy4m=Gu6{LyS>^gbM&HTx+LL%_QsMqfEFrssY&3aJeR?Cwwj!Rt=u9 z(JAlNmYCD$5wVwMFF)dbevZ4@I((z=E86S#eKkGUI{XVSrTEGGLe+?46IrsdwiZo*tspUq}r1h?NjXpAz#um|@8U=ekLxAwr znF*LOkBm;u2uuh}JW8H_pTHk8PY}YQSRi9arigh!ZeCcR9hIyiTH+5z(uC8r>SN5W zh?Xii6Jv=O4iU%REd?LZQ_6Ya*vxTSXUNi=F0^Bkib_6e3ifr0$(HWM+9CY@J#~WB0$qX@xK5> z^b%ha4MzMELVlgVeebY&=1-5sp%Ua8(R zKXA)X5zZ^TwDscFP+r5$yoP{bD9|*t0+`nj&N4o?bzy5DtL7^I#pze3LoI#5mcCHS zo?y$K?{?g3Ik0NB1xmNAnEL{TzS~*m&zuNml`YpTx31b65!?Q-vE-$VL1W{p$$BaK zVs_Xvv}&mhm)n1muFW;So5@wwyqt9<>*~N4_rJ3LHQO!w(4zJ;+3*xF)~(vB6YMtM zvL7V7JsQkvT{T#q+rO|sY!X&Y zmEjT_@|2wug>`-)%eHE*hUi3K-N3sVby3dzZp3NGf3A0-cey&4Rl8~~3zXltVm=fw z9J-xfgi_B$sS~AdWtFVfw1jFl2WvKeefS#>f9>J#wykX0zfvM_^IczY647Q-b7BVyj4UJcK-ZFIFF0P^)6}GpMtI}|31-*;I z)^eb;!{yENX$x1NI^D`Bi#d~h)pQfOGF9= zEX8GETiv|&jf^5D7!c8nO?lT0c(l`iHptzX2Drq<2f0)`6ufFOwle|e@`Jg3Y=1$) zVJ`vAn;u_mCxKUA)5O=bnA>TGW;g7fK7q|oHX7NbP20!j>?A!Zi}oucJ5AR}40%R` zNDwdn9YPlW9>Ad!-y!oI0Q9^b5u!(uh{n5Qs}gn8%}`pT?K*7eO8t^|<`|35<(id+ z)Rld^yBvIhf}kbCIc_z>^j!8rc2up(F8$lms>?@~`(NI7W#39^+p3`~Txk8NUZ>BL zNUdc8Vj2i}j}d{DCr0okV18GH`2}rcD7Fdj(<-si7xS6&?2KwMJ;8%)jL%N)Mf&(Q z(E=8epTy{fG^mwDsS0x$Dw>VMf)9ed$L(X7P$!p13rb0n^`R;GJqss2qU#$OIW!zE zBQYJs6sc?=8#IHFAA9H6|AwHNPjtB)S`qUpPSg{?c{2>SE@=ZAj%cQXvF98cU&I{P z&K4z4qGBQ4fVFoUd|=81*{r3`7ke)E1dTOvABqCZuld`W#w$mz4t)M0xnI`n&@UUf zZ1ciSG_hsv^4J@O2B|RhE@gHT+wDWxT&yr};)AA&sS48jAde!RP|c~;Aau%hg>~-p z>fclQD2wbFS5IK|`;zKYAcvm=%T4=&8vA`ITiSW7wo|o0zeW9@2D&ce7WLDg) znEbKb6siQM25Cc)G>QK)Ydt(YHU;r%9?g`Ux$#Qk#rE04d)QzKoFlnK0ZXFD>24U% zfFq`4u8Jcqk|u>OHD%)=um*_nB2OKqnH`(k7GQo1vCc=w1a_Xrb%M#Ki%Q+0c||1c zB+3g@QIhf^p=PD>$elpC3p2|pG=2Fbxu`phdTbK=DiKPT6)V1UhC*V4n zG%~m0`{bH>9n9J?x%x(y)-{onC5wDB42dHOYCo5%_EYD>>br*OyE1NorKg(BKM4LE z`t&tSyB4hd%8(39G37*w_J36#!sNPw<>B27&eCwT`D*nSn_p?Zk@lJ<*f8|kX@Hfy z0|CPUsqtgoFM=OPoVYcupE_qYc0QSu(|8w*9ln%#7VEI{7i;bCE|RPZdQ)k#o(ZNMotr@pXRS$n zYRu+uh-|bj#xR(ZyV&pv&%B1sk)PeVT=jC(?>EI}(zU_7+GX!bUSq(}7&e;cr4jM% zO!#$_iXX*G6bX0<_z27ppccn?UE-r;I!j=dz+(jb1m*}lPT&aw=Lnn!h-6|tIWc~g z&gew4#xZQk=aM2>wDBPK0wNWZ_!NPs34Dye#|b<`V4eW6sw5syQabOMCYGFfA}mfM z<6sDZ6cNQ536)PVew2zvkyT@vZ>XZuWwS+V!p{MqM=eR&E#6*~qDkOIYC@rN_Tx;guCZmt3;uqw9k z_gp1onqdob0t_^`DT&)DCV#p@rMYxH2RBp#Ne|{fG9~A#;KH6{jn8xHJ)p9`YO?Zf zyVO1=tM7J+SzT6~{o=1uVnxUq=j&+W_qm!e^$GB$AI`?EQ;jda9bKci{T=lMqZTga zY7lR1gE}79EJ}HjXP9{Au97 zXu1@>Q^E>>G$@`S=_}gC$_Mc2eCBGNd7b;jibUcg2J=g=NGjk38hRNZ$KgEPWzH0KY z@)du_r<`b|G98}++x#(@KdZi^`M6HUVTZK^EQPvB+Hp*J6xu$!6)k(~dbmZN?@w}s z&qq~a2By*~pHs0r&CNBU9zLvm$J^pV=+ow^=9-Y=k0`eBx3|D=7t?%?D41!TuS_w| zHDi*~91jVty25Mp>&0w;6WV>e_svvj2^aeFT7QM8^*5bY`@;eOt!Vq+^|botW!ynWQ;L(&JyJNH`nIRJ#R?ao3%~vM*3+2lk|vNd^C??kB?># z>`_9cI_x{IU?-ncO!2pmCNJy()Mi*6ZksdnNF&cFu2}1!xlYnUt<$do zW3JY(^|yevS_!6Mwm%2yPt`kelQdOIdi-sE^TJm2Acd&Mh0`it@3;Dk7J3oJvq?_z zc`f_ZLJ2$9&gb|pC@y%T?^B9-Tsv=@FPkr&FPS&ZZ<*)jx6b#D>v_}DhPe)ZIqUTn z6}R#Cw8~#T*Xi#Rvwfddu>KBzr$U3d^%w&>=GN<>-^0J&->%R-nSyg0{2M0!vl2r5 zEv~yqtt9!fq$hO}SVB<@Ah!<$cYi)!)9{!G9xvi=rA5v;%c!z8Ep z{B`^BOPcJPuOCDgf%{*C8U(?3PHZzMUvr&3c@+?rYKM)VRtxZAaXyH=pov$<}6_hjYW zZsvOYJ-)Dl$BJQhYWn>fwWq&QQsUpJPy{Wc$D51!#a}CS@wdNQaW&Vi=a9qqnS;!2 zdjC0!e-pJEu@W^HGm;OegDK`Gi6fuCd#;Msh#ypni@FO2oG?rpH=p?J_h=fWuO(3` z)Rw=A(@-&yC>3g6i|_9gjNhnGSIouuWqcym2giEKSh&+>zfm+jv0?IuitqS4UTgjJ z=eNVnTX8$ZbiNj}N`asJC&fkl?XREwQT$6WDQQI?V1kRc6@2_1Pe-aA`H2m#8O80I z5$}H~*!cT59Pwh*xzT(u9YB8eP zS#c5b{rd@+-nlM+*W^nICjLHGlCVzi@|{y`CjTGB6n`tdqNqZAzo+04?p4Jce}9Ve zcQN{RJ>C_kKcfZY%s`#|q*ADL zeF1e{`+0&-<&#~=l|`~-_2WN>EFysVe{jg1tjw4P32 z2z;MDY3>$h2tX+XXaF?0ZAQ1GnT$;m6r04Q!IPXaNl4*W_3Qd&or`t| z{7*Vl#u#6-CEx?g>KGLXUJ`mG4Mlc`UTlFw=rtj|OR~;KiG48BwhME`THN_#V{giMv{a<+Xzqm!EEe50aIQiV6DaQq`W)}uPIMX2=!gA?4n>4*jb0TC_5 zCNc9CC<@x9k{Eon&Bji(L79t`ZiyjE^kLNWVxxl?qV{vjBe6z{lyinqs05`3stY@szgYfC zdC0LX=-3vvS6$t4V_#ImHT0?OaO#G#pKs;&R!QP?+BK6yu)dV>Q*Z^hAX$+82iTYuN}YfK)}B9jz(QocDt%J zs#BNN{W7Y7oA;vCT=mAE-?ne~#cI{McQ`d-fh1(+mCTn6VS5d^to5L9dy5X{*VP)>zOGZj z@9XI*xPM(=GEl8~y;?(O@O*QOo=%VH(ItX+Eh-FkS2Vg=| z-cE>qGOHr#^0+&@OVWBtGFF276iz5W3|=}9OcGgW-=mOY$I%7IR%5Dw`2z0|ylf5u z@%EGUsfm+x{DFq<5?P68EC9mVC24QRS+Rg(|2ZXRCjpu%i4_3QoQO$^tQ=Jml>VP& zw@Ba}0(S_!OW+RyaLyQqDbU6RMRZuKrJy^>0qu4|kZA0L0F`MaOxK&hlO9RdPq>)H zC`o}ynh~jQmBg!GC)1x2C?(KA;3xswU6eE^9VQdW1xY%NXwoD0P|UB9=>~ys68IK@ zZxDC{AYw|CYi5et%!zHA#LLm|7-aczsB;s~vc8mwaYxL%2cSFizzAvmlr?9H_fxPL z;^-Ns9Zpj3_+^TZmbgr=UZhp4NaI8#o90Qe8I&xnK0Yyp6Cg2R^@HS^s*w19$P3O0 zkMfd?I!!7fS^H4ZGpD5Pm-WbcoB}6JRd9BM{C=IleZK`(4L8{8@1`QD7^j1d{2JUcCv@%BsVel_`OZClNgrf{SUc zl8grr439)I7?x?a!T|v&d_6G4N^IZY(9V%v5zQ%_xu(fxBxB!!em0dQg~_`~IVL-9 zBb^1^bcRorf5eaw+_z1*j%xs?gDB;c$NSZ9q5spT} z_+(i+`~1PuEB6$WiRhJrgS4HTNol6eW&L)q7{<`^lF zPWD4A)C+Q9F`|s1bjUxO^ftyc%SN(L9Z3oh@}b^H7KsGPr#vD#KKCi5R!%}816UIu zjajBK%>phqbrAa~?tEcjD-?UF*tfD&N-A&j(9L0)hIv3-MT5AD z92jFLS$#x~^maiC*oE|p+bFE~oMRhE^9W5k5}rrm=11_vzfzgDZQCY^!&V~TyG~lj z?d2`ld0)kR_h01c#)yi8#>thOJ@Xm}<>QP6 zq#o_-aL^%a+KT}@FDJ@L5{^0MKz8YBUU4Xo348gjcZNE420M1%%G)(R@RqS?sqUrD zTgLjUM+42<%;X8^XXx8!KLPl%`oH^{*G;_eLfAslX-<9 zb6wC}cQt**yly@{s@3Q>k;B%Dt;-E7=H~f+%$H1-=bl)2B4BI?WHbPVvvQv6S?F0B zdC_&*6)N2o#DCVVRRp40F*gMaO$gUe3ZeYl741LOsBJmWnD-g&;(foH4v|e;&TW$= zWU33A>VB+K+v*qg!F7%~lwEx@yEhRZ5LWgWq?j`;((v#fzE zJ7!SQ`GWcVx3h`@Srs@X5h`s9mbT3gVP08L6S8*%?HxbOPB&-bbVqLKyIByA4x21t z6KaGlWNHqYngiSJ3z(W$Oo!MZkask2i*ht`1vWaha6|MRYHl)bq5bDMvh$=Mx0 z(Qu_bZ&hrFrgKHrz?3&!ty(E-30PZxoWa?uUeSK3bhWG=GU27&I4M(JjFU2$`Q~s| z+oJ!K^y~Wro%_S(O-owDQ&hTSU{q_lX=}NS$!X5-=UlH2weJkJ@BD7Z_j|tA^WQe# zY(EN@_Ucf1Td=$h-ZHo%d%)TVe*s(5D$%?pXluD%7qoT1Me(Xjn{mj7;?*Kv16NfS zs%#HdwudVFf|Y%*RjpL+SloNNuq;s6u4m!F+jvYbA4wQdG@e)ZL7uAKV z>x0(y*N@+_ZVlIVhHCqRwf(R4uhi~Z%6hY;7Dquswx*!1>FR^GY~8n;)-CRU&d@+% z{c1(^^5M@HUrs|cezE*><*TJNFP&T|ZT~UoP`28&HPp2$*tKibzW%xwoxny~d9;@y z2TMDa_xubK_cDkAqnQ*p2aB7-*0Qh_=VWTa_PTJx22`l9y^+DXaD{`AmGt?d^Rg31 zR6=!|f_0n1Wz{&g5-zL4Y(HF8yWD%Z|AsbP-xaRypnxiCUv9b55^d#5TJCVxl7hwl zXlHeP^=fHDRD<_hMRh;Z;r$a1AbL>6wREG?S<;5Aj+<7;YbQ}f@*7al*5=j9p0I6w zplctkJ&G@psn*d|J4&;IzcC#ijjM(?b2fx9}Cp>-Yo3>)`8nKjkM+|TN=dbD^$59Sh*!^ zuf3`X)o%>eZ@f{kQorrBy6<+f6%c4yTJ~cCv;-nb7F90acR6QCkCRF-=3LHM_T92J zy;)L!^?@7BH=B2c%PU_zd--gjyfa+uczNQ=#LJ#5o|W3Jki9El??UpVCDCeSJ7|4X zbtMxPL3`KN^KYE_lQI?~x^P5h;7|yAFYmqDfr@;+^Q)V_wCVNg@3efgf2I=OajAk@?wZ0dc(z6~)|*S*|*rF&_B+Kb_eA!J_{w6FV$<*TJ%DqXSnVl7uu z{95OCHh*(-sDC)vKa3Xg;;zfPkk|oL@sbWT+g7o(wXkRM_Itu8ntqj>q8Zrf)$&V(!wPbw;bDpCEI^(()GTkLz4^G zcDz|p7j9qw)%q{h2R03@v>%|Lwfds=Fr5S36>QnH(z0jiK-9w7%ISQ`^P8{s-Yn^n zNMoxa8eY?e>U)CqJvRn!+4^pmwJmAF6;((Rmgt7dh8J?)wAyc5ihi~~gLQESF|g%5 zcXr_{oqsGSx-@Zd;*#g0XQiMH!&AUiciUKwgLw!)RMj1<>JFIfGR9A6f!jhO-*m+R-n5MnQDTjnp>ti(9%>8FtS6By%&1}c`X>qE*-ddAY@q= zw5+>cKxOiVrT4a__|pE1`#*EwEnCHM-SaqrcVYkSqH@$~s6Ey}&vB@rDOk`HwiGY* z%YDj`6*P+DH+(3zLNjW0t{Jr&rwKLif`YSH=lA~n-Qg_GR7}GHrXF=yGcohHksC1d zVEGT!uii0ZEdKeswK&lTHyA4m?92Jc{8bDvE#xM<^;hro&{$;QvX7{K5gk&aBl-pF zf>>YmUX)jJ_V)KMUKU}bZCbTYws_k>E!3VXc=1BFK7_m_};sFRGhux9WK47=6&iQT4_S_ zMN2{#I(bK@sVYOMRo5Wg(wbjJ^$6rW)NcwFJ3lPc_J2*N9bx;HSg7q3YC8+H{k@+} zq*E=FhTHd|hcdX_ddfj=^Dm+{6yVQ>NJ6jGCo%qs8#Vf8G*WVGPi8chQ-azS$u_hC0)grrLAOW$!zHBhQ%8?)p&Kr z8)oB%wST+05$4-0tiH3N7&eh@=2E=uc>M|JdO;-mCj3o9cLZ#y^!- zlDSt0{ExKc@<*BaiE7=C@*ET8x*u&;o#@T@(UwY>-!9hy|8_OS@^+nWqAmUHCOz`< zc9)7^4})9uC#y97BdyPPvP|>O`KpuFjDIf3Aaj`x7XMtOK{goYYJ%goaj)ddYkFmW z$Sa-jz}gC%(^#a*`?nE2sl8)6!BAKLBfDftk0qw)J0^_!q?06U%Z06(*&_J~TKt|P z@Fanxb?;Mzdzt_(oFfL(U+4B7XR7$cr)lZ-F#;ba@C<=@0xXIJm?BnO26IT-qrk2_ zojX%bXQ>e$J^A<*<3~F z#}D%OwQ&xX!dw?o=yQeBt#PsOROdMP1g&ptPgo}$2-04QX;ngqX}%bD5l4e`=Q}ATXjhb;IqP%+)*lz+w)!lR3!GJzE4A`X zZ$3T2-kNA5nfZ(adunn?53irl%oX{IQXK|T(uN}qsEkaMx_GX{Z%xIggI=f-C673$ zP^9JFUsIT`MoCCYrS!3b0ZId&v-xe4v@e_VC~5R3(up=~lb+4^_G=(Qmo?d(WW{Wh zc-Dji!HMLDg_C(c51mh9jO&u!aU64*FP8ggyPiG%`~>m*Qs{U}453qT6@Rl3jOWTe zpk8L*t6uUsb4Fj65+3U$aXd*8=73NgH`%S&#^2~>Rp?l)JPvG-@H_mWTfJs_744Uv z82?#5mNHico^@Gj&1p<*aiedGraozg{j2K2$CX|4nnbE2*gP z$;WazSN;J#(_Y1QszYObn{P<5r`eIxZ=^abrqqy_oA>FzaJZn{Z~ss>o*O^ZuccSWKz|a(wLQ6prUr%E$8{se=Qqm8lNSDKy3*Jd2jY zakWZ+6~-&<@{Bbp%k zepIO){@6iPHge|ARZnaAqPcvQg0jhn6nF7A9h{V>xtpu^*UR>WlaIvxDW-E7 zJOl&d8V{%2AR!jy=jZaWe{*)o5_NVlQiE%(sk!F`k&m4|VN-6bWF(Wk}xM7dK-tXXZunefaW>dz5 zxkkiHjKZV`p*8v|{AHM<(V`+{>af(Huu7Hjk7TVDH5cY&G3QDq=1g2~_COA5?_BL~ zHsbkfC!I<-@i$*YZRIy>+x}W6y;b{oZCrW_l2@_mw=A_)mg=CO(y~ZMT9Mjfl2>Iz zvn1gFsZ3JTsOVv=BSnp*#LiyFE`X|AE0`HmvPc>x6+g1>#@I!m^|Wpw?J8TC8pj0n zM!3dUv77a<@Z*A`_PV4c@%u%6cfwO8LJm+$1_V;*#!VR)(Z?2#k@Ul-aGe`3MAU5^ zZW z0{mqGN+lpgBgH65+J2AH^%ejwK+8Y@L&LrIq_laENw@Ev6rj2icbQ5X1w@`muB;L# z!FsbK)57Fy_E3mP@-;N7i$5XoQv%c~Bq@^g!v}XB>Kho0WJ0uIXt1B8aU=P|gZ-|f zgWHD>^zR)UaUB^vG)!n6uGDjTp~F=0$rl1d(nx3OhR%ro*oIC?@F=48fQt_uThqJ; z9D2H^5QUt(Hbh+J%0wX|1#9sK4;>ge(0^cGBn^TsJ9iI>A3;JR*0qiX?}rEmC1_X@ zIHF!sDz9y1dYDS?lu~@+F_+^g+9H8nvmx|ddTvG55Tq3|aNY#^{mAVeND*zjS>CZ|!zqED4oH|EUD!cKS$29mD?*_bfq{GjS#nx1(So3 zT#H{O1T^Hc+kMl{uuFZtBwBQjt(}x;Nw(nvg1Sr9SA3`E4ch5Bi$#zmOW6sw`U~~J ztjbj;h0uG;*by$RzL@!zq=u1{9c~4GAis`OF=nMfMJO%V$sHLgP3;=sazr3YXL8ES)u+N;`Vy0#>9-UyaNNkgc(HCWubQrt$Yk#!4u z=KB}(nXbR8prLBH|7!jlhE`&ctV5W2MImz~ZgPC7{pFr3Jy(x?e(Q?49TF6+8@~AX zE03?V_RbqVGZM;g4B|hd>F=^E;f;RxXK* zV!Uo%F?NQGP%ziCV%+?i{-$wv%22!R8LAn=4V0gdr5YD+zBCf5*&3|b`kH#h(my}A zYAKfSM_+#E%0t)dzP=;azI~;pKUA|PShHuPX5Wfsf5cM$&-dqNclgB1q@ z_l>Mn9R8_JQ)#|!EhSES@uj^N_x|pFu>C5{ix3yW3q0+zCa}_S%N7SAaImbuS?CB? z)h}hd2`}kDqYV_7&x4m#NaDT;9O6*hP_S)i#eQHh`^`M)Db?p!t+sBuv45p?Pte-5 zlyRj2oIrcU;;wK-?c$!>(BulH=KKH@Q3dj<0){F;5@{&CT#8nmR~pE31Pl&9@FPvd zA!BvWSdH6NZ#T3oX1-yn3+I-Ea_fV+^?}^Z)rRJlOJ)y?!!N%?2Sv8s$ zGl`7~iH=fY&d=`-=h*^z^#MaY;A%d2n%4(k(|#xOo0+%r_mZ}_f{>viXsCFp^?L1% zrj^Q_-z~UhIJlZ$9X1t*O+`o@?J1YkpxPGX%23S|HJyOo>`bWaD-$~w_JLbm3htyyj- zVKC))UD!{$rTtEwmds7NnvbfvKvCi0T5Vum7MVA90tVZ1 z4mWba-tAlQacfH*+`dt(gZYg{{gGbH8=ZY=M|w0r=+WWh2fZ3tgw!QROEsZV4V=Db z>fgN|mnlsQK!^E*7{nfq?Ykoxah;4b6-;8UsL8?FC$^5o?w@!nVb5IUOH*9N6={yg z)MVmz5QHy1@pCOu6P~4Dm30K&(=tiifTTyU$Ev+u-euO#>A>j0+Fi_pez@4~dfX$i zft1xKcAHDV6jJ-yMX5M}lG44BKe+D10axgWgI>LkKAwmAdv+(4JlTa#ebN?>sh^i= z+?&7|G><)j(zrgC%{>1LQX{gtY6+Q&0icE(vfD4xh_8Y8t0PUC2(cMBrT|_P79=!z z94KSgS9`@jhEwsY0A8Z8H1tbj{Z1fp%8jX*jA>;|k}Us%79MF`0M-tq-b$CyU$qBI z+gEZs=F{HHGOv;t-L;&r>jQP$Z{_u`7S}8vUny=`Okb_8`~2Yi-f&sXi|)(r=RNOm zx@^bA%tg)OVchb(gnN`RtQ23`b8*j-cX{v)OT+ETy2Tw!9T)e8E#)L7vE2WLr9PSk zUuYnvg86Jo{b6#oqAHL|_oA$XkFnF3+C|Jy_3#zi*85J zxcF;EDSnTLoES|c-NV#odXp7A%IH5sbmE`G*S{)jDdN$RuM8wj%psO&$Qx6>`w2c&NI%)Om!5`ufolN;Al^%{K@J*)w4xw)O|v5AIohf z@!!JI1>KgU_fxDSK*uP=QJ55srmR&_@>6Lvy+_;npUA#uhKR2lJDsL0GdS%>{Nv8SY*0T zK?UlDKGy#I59QNr$SijROE zYnmcCOVtzuDF{cMb|w+7HAUTefq!xO^7PfQplRm~ZNRkiwKSM87pEqO!wCPrO>k|O zb@1>9(Mdj(1c%~ZgAhrImv0hnlBNI{Z_MvQ8cbxa4hKy;uKNO}9XC$H^dE&ZC2QK+ z!M>6HT^~@1BAKjjVop<$=N6GC)nHltJ_Pby_FVM_O}lPb0;XNB6~J^a0-^53hdW|y z{C0-B3Cz0h(rj&8L!5!ZeS;%|G3wmax*}POFp{&o=UU@hSZ7Tmz6rnNsQ|_HG9&DS2uNKj&M3 zr%@*95i3)>Po?f!SuQ~gL$y{rD5=+{Zd!WIs?Mr#NI#pgY}B*+`-!h&pPA+baq29) z&p?uV^N1~(nKbIrb4WVzXU8_beRS-jGZQ$-h2oG@(0f~A?uJk_1&B&I4F4s>$hLl8 zQLzIDSWCwgo+m#ThwJ;6y*yoZ?G+p(DS_f{n4ur9B2I22eL1VC> zaiyRcr)_Y~24{HY2R?ZKM_EiIw@uCOdCdsw$v$qbm6w$q~c`Fod7JOd;)#@K+I9zLl?PWGx?Mt z`pza2RV~qzQT88@@2`w_)PgS{Fflm? ze+lGl;o9l9%xv8)H_^ipVR zZ}{GQ7o8nJqa%>vkdmL+rNX6Dafwx!I6|drppXuYb-Qb2HzDiBxu^lK=d2bN>HIHh zXM7qr*a><9h(ZuERv{X8 zxl7{Jc;c^1sUf0N6+&X0Kl)s{jwfu`D_y^X6NvguY&X~9)}}WyD(^1)81W7vgbzWy zlozg`x6sZS_cf2LaTX*l`~6VyPRO7fN_NoD}Oc66e~$~G~R`)S&*OirSFVqHKI@2u$u8SfyY z`oko-eHY`7dKnGRoR}CpVW)EpbVZ~nsrK-m@XSo{q!)}d_?!}WB>hiPQTH?@J?S1R zru2sbR8%w2 z(S00+pJmxXCcd016D0YOT&t1(6P~-$T@f@^1Trcb{aHbpcA9ZEaUhirk>LL=JeWrG?SWG65#PGN#eQZsI91ke#d8M%=vBhREL5Y|@XzCZTcD3EW*mM(Gz zFx7f=0=j}ohYDSmN7EQ~-<~jidP4L}yXlTxOl+sY(HW!6`9$3RhMdF~OS==iVh+H3 z(=^Tn384EQu(z^?KP-PG277uGEd^Rrys<+OPV~YZBd{rP1 zIHc4>YLwqdmHr5&zhrHrWO`8O{1rm>ekP$N)3_ZnRtAlgfm9Ql*b?G`E$~bWy*ezpFyP^H0@$S}3vsbo+ zv%-)#nM=GD$)O&aEjWxF0Cpp?q@+^5*BkPU`Vk0j4vL~jyeomYc@Rwj`j}kFbu4DF z9Is=mIfVi1x|N)^Kt>x&DK1ThZW@vcg;p<^Ab&+dS3n&bi%rR;;*l~z$V<3%@9w+W zX#Fm#2;c_6q%A|bXIFTXZjQc7`-_bKJS9@*ALej+nPrJ0i9J+zp2Cl*@(i6B$dypVgP#qJO3ET&O8^zhIP}0(7B=jhOi)3eV^`9VNN*^W&>?&}Px-GGf zfR-|oL4ek1A_)kv%RZ&mWC>aP3b=?tUiafVSM*aTE!?3%;1mHSR$59XriD&`DWW@e z)+cyH+S?Kb3DA5#iJ2(UqFVeUMRI`vi6by6RFSx1A~AhLVql20Q!mnfG~0V+6^&`W zWLsO(7U5q~P;U^h5TLCKw#tPjJlw1bK~h@9iRTH>%0s07j@=!fa1kC&Iz^hiNjKlo ztU*%dMq`KgD~kVL2rwa3>On*uYP*)dV=e_$snnY3^(_LTepNa9SWCM zNxE{v?HeEghBYdb46WN3u5Tg;oiN4a;Ti||wULG*Y=OSHVNZC&#_-l1?+mIauG{9~ zrHw&zbu4C!ZD~J*sG@q7l1$E6xQGkH*9GyP(-zHQSOW)NO~Kr{Xg2%KiG3T{H>M5N zr3@@JqPgrFGJ2&;4?ycvG>?5l?MLI2t(uebswn}g;p0mBwB7fUjubnF|+BFUdS=|fl~+Z( zm~kU#wJ&Rz9}L>tf`#qTZiejP3X7wgm~k`I_C&WZ<5sT77VTxmZ7Qz1Gup=rFuGmE z6_f?a+JpHW(S8XvpyJA_mv>+FT|XSC?g^G{ib{n|bulyN&Q8gdUz?`OT=Fd+2$pw3 z?o*d}!*YjSKQ?h0*->qVzHzxf%Hef&jJ>Y&KcO!O4%V;xF{jscE$2n)b$#Fty&!>? zkrhfW45k+@b=^#_yfPQn>hz7bErn4X-l&`A;%GXVGPuIhB^OZ=mp(UQ*D0s=-7GSh zwfcjqaB*o=!wl6;vSH&U$#6Tn=8lf6q6V!lZ~1;m66o@-SKXl(qK8PJ#Y+EDyOCN9 z8bN7!xUm(=kkA^ah2)~u$c?IF6E%;z#&FX*YHyC_@Vd@$_ZBoW3IljFq-_K5>{Oji z)0uCZ@}fF2Adq~>UovARms=3cVn&Q~=4duE=8)0IjHX!I$YtN=*moZLPHGDbm(Uj2 zx0R|<5i_DKltfFI(Z=Ojmo!Tw%biQcpt(L;%CKb=e)Yw&XgT||Q?;vL#!9)mS1)BO zw*)HMu6N%U`BHD7VtdfqA21Mi9TmQcIjsjRqYh?lh_&TL_T3a~%gyY&h3fs>@hrwcnKKs~ z(@6WPBl|t?cRAnf{ch*`p6~rKp+W0gV!cbNYnf}kyVcq)#t}A^(#)1#>)T@9!%pPT z{DFmv`NNs`aHf8zwO1TQ*)UVL&s(pE5sd}m#P2qu!H5MK3_^0>zJcZ<7HBTD&2trZ zLue*qfo6gfo=ro?R^y&b)m}?g0P8TCPtEEP<>_V!y3_8QzkPnWwQYHLFRNHxBVnni zQRt~r?`j%y-8X8NQ`1y6tEmNi`|02gqvUa@$};do!ziz`0^~|G^uq^k@3n$7p}*ZS z^Lz7w^p?R)`F1NrJ7DQs=GyKySrMAbDCTlwH^2^&C1q{bO5&?Sb1nY?|?ide%Pab`R)5G^8~`PXEB-w!V9hPNRJ%Hs2&Kf zmimoW^km+!IS=c(ulLG6ae~R3-Iq|kRNot?lJ%933>H##` z9cP}gP#JESIXinbQ{74T7RSBCagWah=@fUI;*L|>95S&{q#k42<3M=&(#$)vH`9Q@ z1ipy>WhCABN~UUGI|=_hZkvH&K!B;pt2Glm0{i|Ik==#+xXCT_91J z2;y0iFp@#IIPU`)TnhWr4eUd(55eAmpD_4vB9e?G%aY}cSK=;%Sxkv?a8V~c{zMf1 zE3m;`wNiHqyHUyG8)@k3bgdXzb~T|_T&}F(trF(c*A=pAcy6li;N?q~&EyZqE?j;0 zsJbr(U)Ro$yc_?kYV}q2)*VNCNe|!NHSmYkAlU$~17ENK&UKG#tuIbt-zltgaG~!P zT$u_W_*>fYq1Ui9TB4Rl^Ap6xNP>2Oc@es0V{K!fAszgkP%Dv0FOzNVhP9n`9P)tn zcSe_m4Ab#i(;mIOjVnm2BOrHp zZ|naVp>$o(!tV<61C8Tn&8aImnk~|J8&N8-DoZVv%~uSWycXLeUlPdQF=LH*j~Q#4 zzQn94pv+ulIx;X{orw&j{R8V4uvvs6rJa(m7vzdQihkKO(84^a<<6pob_GP+EDy4o z`1k9CqjIqLf{j)u=}IKuJn6jUs4)2}T$Q~t!7A=lH0XmbsA#PeNPH84I6?f18DcL0 zp@gGcx?KvlWWp_r;rO(BITD?=TMY#7{G3d+z)D(8zN_u6xa@V4iCVWjj&*sQxaaP{ zOWL$}`bVagRa~`=o1ffVgsRt#U{Bb-tJaCMJiOw5Fn_I& zX`a6^z}?q$P*e6)M5({4XhVjDAO$=QX0rm`xckI;Ja<;BOL3v;*xo7JqHvi~T3o8V z=TTjelQOddwnYGOdVE>^R~s9PEWmiS05N}2`xmMa%OFf=)i-g^ zL^YRfw3A9wPCMCI$Sq&VtHLg#q936 z6Z7!}f4Xf~rhYdrTEd!~UpHd2oj8YIIsaig{;f>iF1{3_|K7O{`sua&USsFF$=6Oy zzQWZr=QE+W<%0)IzCu+q@8VFu6`+xmFPyhEcB*_bcc+mt=jTkmCSmom$yd^w@L~ey zwI^O)nJoD+`QZdCkSs|Coyk%O%wkFe!IjEniSPPl0v5t#DYUZnl)c-#;e6>{USr1| zq`ix5a#kbN<*3OkkJL>4?5HiV zF`g8oa7JyJNp0IS`OakOH>^x*n1D2@>!g3_ACgB6_nkM`FZCcY=^;2JRy_nX0d6=Y zae4szZoh*3ZP*D*$I9zV8H@a&tEf#t+1v^%`hCDgSM)3BvJuLkO5Ezw%0i7sYMa!^ z>$ar{_EU(mb-G~(-tn@M&29_-C(HItq)u(2y1ao#tXcp0wY%4rYCEA({JSV|oU~qwLdF`#XY@S`)u1-t^0ntK33_yAN7&1b;Bvw=}XtT@%Ho25%OlezO9FBLuqd` zB4ni@5_Dvm6WM0(IJL*tIJtiOaI5h{ge79@g6uXLGumG+G(i#k7iBi;$V_1MM2kk+ z(*8EkWq;|9OFk)C^4DbiHDCJcIJY|g$@!&lGxod|!>vpH)(8I9?5PCrSebs`uaAX2 z_XFfR!$sqV+0D8pBgc0TseFE_;o}>P4ZRG7X;Sv8I5zeWC9N>>Nny=9Xf3CJ9HZJI&>OUhYn74 z=u8qiE7|&$?O@sRZD7wR$5o3Q_~BFdahdHpgUHebC(3cse$&9#9j`yfLMCyeGs&Vt z$~34h;y~*hH)OOFibTtV6H#=-d)<92l5pSf=4n2_0swRiBb)r)aOZ0@zHV$Zp~OOf zqeB5b{KkH~Io%7{u%QCm`?>EkyAQnK%iZRQ&q3ctw|QR2=yJw|&p(5wude&DApxfC zpV*IpfZqcC;qqxfRjK=c->Be#>{DlsbAY$wNqqcYNaZkp3fhoEs6iv#*{MXVS3zEt z$-%f?HYed?hZ=*)aS@$tDL8hh!}k-DoiQr409pf352Ek{vOtIxfOrJe0&FJ8ETqu9 z>V$(_5VB>Xoi8M>WMgxD$koFyh^I%z(!=B?SSIJ>6ZQKm< za$MDPl~CI{SE;ioR(L$2BBIJZA~fxy!SR=rT{p9SlL;qcxegkD{7HfWMZFyAXkO^N z$Qp&_1b#Yqvo-KMF)^}GMI#CD+3SNyes~eE^TB}u1oEozF&KIQaKu?1q%?~r&H^1x zWHB!R&Z(~67?%an8`!73QkUQBJv}**B1jgPMqJ>>T&6Bxq*6F1e>RSi_}Pn7QL$Y`gUhnHrKZu&9 z8b~e|a;l^^c1(17OdwD~xzx!MCqVm{1(M--Q=rrA84lu+kbZzVr8~qzXHRVS{J9Ic z5TMI&(z#yvJz|_icT6rFZ>1*QPmYW@Z;XzP#?GB*fyL~4Uf`4m#>_SYyHa(uL+?X- zPpqA7W2C=d^%H$l=KKBaod9u)RCDn_Unb`LzzmK%+Yg_y5gxzd*xduQy2+fmhyz4q>?6UD)!C$Ut;L475NN_#q~w0Npp z8Gj$v7@%dyzXV=Q188f?T!64HxF4m3ps*4g{=ZM7%x79)gwmZ&2Y7`IlTRRiE3zo~ zQ(w%^U?1UNe;w|C(~j%FPfSOagO%xE0}qoP`*lrxK92i|YR0CI{3hB&&1|+3oU8Nk z#mfHW%6iA*^Nz*Jq2=l(?D;SV6l=5?PF> zCP)0ILO4DLw-Pu{wNnX<&`K3j9i2rBQUjemS0~I#byMvf=0#ML#OSA)&gG{Z1*%d7 zfdFiwy?f%l(`KvqP`Gj4YME3@ddxUqZzI`8(oWJr(n-=q(oNDs(o51u(oZr#!Y?Ir zJIN5q4w7LKt~slFO}R&4?k3@4uK8_}JtS0LFITUcuaMgZvJ$n^n0HmC!fo!SYshv* zW9B$`fUn8K{#9}ZNe@CWrMKsjA556$ z_h|OngQq}F&ExcZg5)I0TO@CjNTYg(+z&{&vX@iixe{iJ&k4tTm(EmPDmp_~d^U{V z{2f|NfUNjg3(*Ir6fX8O9TFr-k~8!ITrW<8U|H-VT75uL&YFLL+(r7(QwkgV7qt0f z5`h4}!K!nQ#wh*&m|Ph-=_6znOtj$ewieY8; zFZH1{m!UUW8VL4lT|2OEuQxvF(K>g2aWMVni7z`&-ipjr&D_Y8w=HTXpFqoH(}SiH zi&ZDnTJ&FoQQ*LCruz>r1`plxFIUvh{%HQKbi>fXiFCuROvUcBR<`CnTA|lJ(MX@Y zx2;*(f1->>|ceQ!R~;6lJw-HwH$nc4$st$MkBIK2}9fum`y zW(~OW_!AUlocKwPuOORP^OZX&A2bav_YMLW_%!4Dh*uOPO4Q4GSh{-HGG$qkpYb~n%ds6hO4e4=2^(pdCa-Kd6sfLD z*%mFQogVj$HJx-6^bD*)zm&l&+J?Ka>BR!=!2&al`LW2(0KHT{APqa%c4KBR=syc4 zQm{dOEcQE9_g-F7q#aFXfVl$eaq4yIRMn|-P96P2b+uQ*ck}z#FI^mvq<^A}`BfN+ z)uS#+x+6uUkQ9}pj<_6>dF%)|5If_}Nms}<=?=LkD?$~Mo{&eTdak%KSsAKC+8wQk zdncpDy)K!Xc9#IGV)T3Wd+&@_xs-3J0)lCLMfyw$% zJs(erH%vB$8f7V=L><@UP(6ON_|=6Pqm`j1hjc=UdT&Y5Dy{jxQ;Z$j#GyVwtF=uQ zw1q=!0QGAv7POT^YXPmZLEAVq0BF4p+RmX3fHvBon>n-z&}Q3c9UQs|&=##j>%0%T z(-%@XycO^^z`HDXH;1zVHs}@(?FO{R2Hnb`y?}1f zI;$iH?&Y=TICL1$oi@4+a_BBVcWaxpA#1#04&MX#UTxSKZzqTD1M~@7AG~q>Y~YG~b&~V818qR1xV3IkaCxdC4+I=m1Jm zC0iZhtxAQ|+C`K@1Fm99Bom9EOcXVVQQ z$Hrb%nHCSHw5X~vmSp2q zxR!Ollt4ZxXMN94$5XNA!&6hS#KqssXbzxqF2!D8FP%Muo@$Q8V_G70R@0}F30=!p zA4?_@T7PLWNpur98@_6`dtTG^@I@`yo~;rc z9w&^mjUtopQ-E8G!RSUyiLz=@_QE-lZ78UkWCb0($dcD)iaR%Ebne_4QMb9MhmldE z>*4~dMQ2fqV;W1vCSnmRh3K*=Kjv6$QcF%7xChQ9Bd=?z0$AfYja|`LzJ=%_AixDx zn+0qnrbomgXi-tQMHJZ9;`x|98BRqmW$Oj5<~oS_2GLHYQd68n2G(CXC;B-VPDJ%f z;n$7X)B?8@_Q2T8lmQ8dPG1bq#FJqI2k)uGm2f;3#kR>dnrRjnHN^n+XSHaIVe{C5 zjibo~A@WjT-Oc$fO10XYZ&j)|@TGIcjW%kNo{;Q>m47TOh%{Ul=h8} ze|0(>H%dI?bJ^)xSYdNTsL)e@^^d-*rXZnk!nN zxwVR@XTs5fx=}^*XbMkNS}Ctq2?@cYA*K>u>WexiYNFM*DneCJpH?~Hh}PV4g?vWZ zk94(GgPekr+FLG*1N$}qWfh$ieUKlNDD~-z2JE%5ruD27mBV1EQqi*JDWs+@g;Q!W z5}9Udcp{}S^`e$afx)R^a9Y6t2fbbu9}}EzJO);GP<=X~#u9oeoQP;@azeGS!9ia8 zQcO=J*$gVGIyE%vnSJU5YHR{sio>A`43HI#(Qj&6Kd5qsFEZGJQB9Oi3dVX+bB=+DQAr{TY;R%?0?pQ zoHZKe;FustrCB~B1uI6==blNXF7dTd!9i7Ht-|c0IM`~KY3dY9UWrAu=pj)rrmInH z3Otdn@d0%j4993j8w#tH9-{R@Q_+d~*ap9M0I7R&){A~3ugA43TAUFm=w$~HWxX$l zR#?oPgg2hGycsH=Yi!A&XGAZ-rbcKu3eS*h}8s@hikjTwK} zhfQkEAvYdbbvl~^ImuZUSW~3x#&@2ddw!+%=?`nWSK8V?@wlpMa$d<7$W(1!X;p8J zynTA5x-L_VOb2Biwzl0KdF%8_bH{DhTfU;Gv1{>(OvCouuD2^Whm4rl2C$N7UVLBw zDH2fUo%Q^AUC1@1CjIr)XnI`tG2n?qq*I6jWb_hj}g`qybr#=7D5LOm>7 zTj^!vg>h;`T;Zm);@`gP-?il5wc@LN=k(lZiq6cP`OxQ|cP-a;E!B1{*Y+>f_W#ni zebwWt_2wj3rFT7@iBg=-gTMv+L%Iw=@%J5E-KA;$9mn^aH>j)x#iNebfhr5kLhUYH z1FaqDYDwZfSiB)Wdemk00PazWOBM7`VpZRy(ZOp&R5)>`w+J`EdoJvS%F(oAK;_3jT{&QImLqI08l=7XEkbF7-5>c(-u9Us40>#*x`@fUQji1L z4)hUp@J+&wBdyauw;gc?PE!7ei&CB1{Qv@D5y;rsHwM@g%l5gnt2vs;dcX(mfFL20F;qqd` z58K~s$hhMh~komP!ZRZr>i4+Bl}sc-i$2evE)wh#*8yROA6cmGqyKa^31)^AF> zSoo$S_56;MvW|YK;~te$*5->ke&jR{D=w;%Tjrc}&oyfBeOwnHc53GFe4iZ!D(p!F z_gw55N*|+OgaW>TXOOa;XU?qCn@XK!x^Zq$?H&X-rGHjx->IIfUhy6I(ATljya`OT z(hH_q+wjiyx$7CFmD4BdhWJ0NMeO{}BGYr|=no(h$qYnp{>?~i3<>rU0&@qxjI@0R zK4x-%Ox0Bc_N=JAE6pt{ zL%Tn&>vRu1Z0gFn5$7tTK=b??i+ZNHf2nSJ&OKTG!s3PcFLAw;^+Al-FU zyP$KG9&$Zt@#-a0br!l|8C0k-qu|f*vrySCP$Bq+P*Kq!{T^2ju)(g)7()w1~Omk zK@2L{2r;s?W69+6;lzw-70}aL1dCIzhILEF0!32Eq&kU;Y6=z_z05+9rot$A4?k<6 z#D&1&8^Mi{u_4`Cq<%((Rl(RsU9$IdH@a5HHH=Mk%xt9G75f-pEd3#F)qOi#x;dB zZnO9kTsn5!PSgQQg;R4!VY8U1xGhaU^t$B>RcM~5OLN1<;IUZ^V8Z~EY!ZqM>gCWX z%}4eNlvUcws(D$B=GSVY-U+8sqsmsJ&gjtx%SJ$}zq}2d6n&wF+Y)TPjS%0eSv?BV ze`IW6>%e|72b?sru-%#!!FeVodO=fR#0_7F$Mj345h7b-jE;>m{yGf5N>U%^o0S~~ zj-wH$Z5nhHQhs$7!Jo_Plzvj3WwU->HkyMF{x)vaSw|^h7*M)ri@y5~0e~!JD&^)5 zkY=C;k3vhW94Fj4)|KNX+F7?g4atgM(OEYViDXuR3M1xp9K8lzLb{zmnq5SIj>b6; zg(5^#1pRJum6mss-Yk~MI8cTq+EQm9pn*;{lTRV+w)8>UtXXO4qUb}Vdd{*|v`cnPBL-8tc0t?4wfA^BVJEL^}J7PMOWa}}#S{_rX|36U7=#fcqFQV%gN=C@T zoQzIgkFTTR4B=)7{6)JI)&Cx)dJz%3mi%2ArE5JA>F(j1?^{TeH-13BG0rEdSzpvK zjf#=QdoFGmX5mF8AdX@HxdVP41;u{B%pyjxsV&Vs{@4TUY z`TDLKuZ?9rQEeiO7qNRzb_)11A{nD+#&yIbsopeT6%o_0ll&Yt^k)!|Ddfbme{{(| z3hi?t^@D4FaqaG&rOu)G;DglP-uUYqt4;@*KOB|bmAwak`pQpUDF*We2sV{eL&!3a z^%xha&^TTNh;uBViqPrd>Ir*=QnW=GG0ChKFIvDorCm#9T^EwcxR@_ZEn7`u%5n4Y zfF3nqke-gvqeivC1|wQLj>im{CDDLumQM+GNVgWhx_&|hKSl5P2 zJ?^2Od3f}}$S0J``MCZdyE_*8K9&#}3I$S7Zb;XV-94mhAhL>jY(ZLnZ;S@>^BH$6|T&@c))dg=oCr&9%CxV~#nRiz?C8Y^9 z({JG&5%Q*fl_(7YSaApNH=avj7tdNgx>rG63fv-OD+EfkbT2`#1NSi+J~@LNiJgMwWq zs9?ILwQlug6qgqz@$3bcoC$@ClOBkZc>1Czu_D2-(ttr=40*YTR|OHzo85$`_-m!E zw)D5C#N=Uke=I}CshRSc9q-#x?YN4Dm!?8GPSYrc`tc}gW?fU^)Foz#Lx$i-l92gP znqLchkXSGHrL4ZSt>HGQf30>bLbc=-goJk(2j`WUJUt%0c*vDxc8Vu=Y&2)kF`2?V8RkU8`tz)quH-^*OQ56DWRp9oM zD^1&PpLp2VKK~qeQ6+zieA_3e$l0P&avu^sSq%kzN7B&6mQNxYr<{XE+=|>S=^tGk zAGzG_&P8`->;4Bl4^o+}$ClKQ91OjknHR^_C>CQ=>w*t!K`9}v(Agj6yu5oS0@gm z&(R3oN9JdV0%rkvv;~N}WmuvCcieEA-H=rW<*o^G=b%3MX9@~#b_aR3KtUcEI-jP% zP@LIr7brkXww8&{|Z5Q<++sVT|ioW~Catfb(Lxo>+oVDans?uFY)LB9>S3O z**PA4Fh);m!?_yLJbTviS2lH6aO}}9|H^UO9+ak=O&=O{O88_xlHXDjMnRB}re&sg z1Yzdk@B##AyVA$4x$D%RD!Q_X@9;}oc>lR^X`9ydYMVM_x2{)mPrU-mI&m(8Q&kyh zFF2TwD@)bf9^MN)(iaTZP!+DGhFXaf`A&gdK~I{{;P^^PHXa2h!*OzVA>S%(@Zz8v zOL0z@=;OwrR2W`X+%zPfyuvJHy2d%-1e2|bYI=mlxc{V(ES#JaB5)z1{OSaP_1X^i z88cT8nhvWgVd@5Zv+F;lYTP&akRg=_{RmEb(@OYhO6Gxc%3@!GE^0 zzxI_d6cX;7Ms%H(vkT{~)bF9zI;KGLNY~g<#oV7JEb|)D%-l>y5l=z|8qx-b|I1Rt z69v;vw&86=KTc?n@WmCiWxu-QS2K#rc}oEzbjUaz=%yr|51xxu@mGrH!WCJ3G1 zbK?-WMn97eejLw8?i_vh=yHAk zQhk3Wu>J1NyJL5seZMQ?-;+`Hte*$XfzKn2M7i~3ZJ3>Pp`)VlVGd>H{T=Ch&T~@U z-?Mak^CXBH$*Jy8;i}Eo>^+Pi*mW@(xXu``t)8JJo*^obBNPeW{^hFnUsScPG_~G| zy&IeV@}hHbWVv_mQt#eO&%R9k6B*wVANq+@2i`sKP3r+f97YFc3~9JqGIdskTe=pk zDRrr^O2Uy#>v=)_Rf6TuDZgRLtB$=?n}QvLJVU}%9Y3nAbayYD%t?se-}|8cLG(e( z((YqC|3T^#0_U0xD{9O9D`fw~RcHcW|EQ?>7zWlZ3)YpZkllO9*#i+NmK_WAq*xly zy@W&rKkEZR{3~}$Z9!?e#aISn+@=Lo7_~}U>ZlQ;;4Heg3FQRZ(CDP{q??RqRMXG; zkyj+OU=+Meq;?}gSEM-D9KNCP`)K@D>}{ zScHfO7lcPG1+``re8rB-fWU>|8^R?>xbzgzV2G6dfcGL3{x8~4iK z6yP!h-h~GHk3Y&8gPJi4ChSOT5l9exLr63e68QfZ@lOWyEcM9kN!1wzZ`cPH@3I_T zFgP(C`c}V%prqz#ctpS(!u3UaLqMW~6nCE^fUWE|JRsl|5vrYW2YqZ4iqdV?)a^>C z*pb}eo2|1Il=VEIOUH@d>MjJ2(K=0k0qdeN#Ve?O!ZvS4yFF^>d*{YVx1``=Mrf0aV2Fad47#t3E?W_B@V$Xt_Y^ z96)WGV@2ayz8B%OVJ2V|=wT<(Hn#aBr)^HO*GL5cKQ?p~g)B6$&Sp-jhBNDMcN|H28A z+XegYRLM_4Ck5RUbWxyEFirvY7bUWCw@vX*MW>njX7Go9{tnJxqxb_3eRw3j+y_V%$K&vR`;25So~k^QTB6Sjdhpw zH*xvroU$zcqtyCOQq6B9|8J%Jzm)d>i`4xuQpfL{wZC!IJgjTD)A4S{o6pf1Qh%ca z9yV^e^ObkMa@+fnBDv~*>w5W@u9yF}Yv|$0Ga1*Jo2L=X4@1D-K!ihu=Px^{*+iJdoKuOqqc-r9xIRZG&qP;CQ~ozRdnJl<%Z`OQs=s_X*0jtSLQm|H6?q3DMda*^M4McH!uu z$6CsC?KLtDvNzMYdrd;THYm%znf9I3LGPNPp#Kh(AYN;dWi`_>_`YX(cw}jKglecX zVsB>ikWro2!0dQQHF{Ms1mZPSmb(|)sGxgI>6Sa@+ZHabNl2_c2lDhTJZE*#Mbwey zF6w!UnCBKs@5uBX$Q&A_vK^Ek%;yIwzctgyX}mRurSaT+5*GU9`o5+5zDyu^^YlZd zX+^18R@#@8_MF? zlB(pK+uZ<2!@+#5`q=Sf(ry>y$NO zo3cg9rphAaQ{^<`(uM62$CLx|de#uGh&ZR5BySA6BJL?S$(zEJk*cXGk~fE|Bc3Tw z#5?6BWlOjwQae>kQyS_8inYE;u{N%ZE&KEGk96|rr|LL*c2J#CA^pzUBLx^W2e74U zkE#%b6kz}Pwa*vusX4&=&#Yzb@7bmrIV0D^8Mx-FH0zkwcmcf}b1iHIPEtd0+S!w8 zuZ5I#eniWqsW#R%)y|nX8)s!*h=Fy>I4}=*Diu5(fXl}<&R#5FQF9+D85O6RPIVEy zO}j8wDHywFD7N~ibRN0~pv_zp_N(;mK}goiHL*2Z)3lDQeN#8pTU4%tavxhyzT-+X zDQlo(_rRCEgo+w~ikOdp<}pn5FKT>^fg3P+%Sh-dC&Zb+e0+wB#zVnCJQRyEkr2y< zxrG4FG1D=g34~%Z@%S7Q42J-y*J7ER2?@nOp~zgAi@-O58JnCu&nQ@jcVZ0$gE5{B zMXxgP7<1voapswW{Rg`(bA0SZh*SrdNDR6ZxZpe_fpDDTqcETw95y%>5JEv_C(2%C zJkAL7b8|5sx(IOGch(yqMm^R z2j$Fx{s9KsGO!RK9>yRDuo9LV0X`Ifd37@Zfmz_fVN9>Y;xkM;u30;2Lb5%fXuO@d zJ|75&;)_gdnt^%6xgc53j_a{G9}}Cyg3xRE3U}eG&n%ga!~(lg|B zGb}GaYCTSNY?S9?JQOSB;uuUb%<+iBr;*C!$_w1}d7uQTTrCQ7Fjfv)8P5k6!?6Gx z#8In3t7Nt(A+t(x6tGWfN^=p88V3v$NtWa^`J6VN)8%vee9n;188NqLg4J=!WQ1FO zdT=52mI?wImLE5v!p?)L|x(O8_E1i|nBklMz%J`ww7ViB${5{L^o z`bJ{Gc|z}faW2eVDi;GTYu5 z%h{c8oXy$nZ=8}NYx$cec?2izPQXs;<1nqT&n9W%3@n)->X{gwn2@w^8kS5D$wdR? z;8-kK<&;z|8SyjL+LTNI7ETU zmwXLIwHVbw)GIlTj}4zbJ$m+qQU8hY(bFRnl6&If`Sa&4OpcEDhflw7?!x%w*qMo= zMu3*I^L$7~h^Qq)kWd-HDVcaqJ`$2?UO>ha;Uwpa7tawq7bnM5^!gitFj64T#pn5G zP`P0M9Yx{&jR$AD4Wd;_q-Kl1LLCN_I#fx-J?P= zyHiI6bqOutqbHyTI$v4PE1A*|d2y^MurJkZI zlVjjE7ebLxIKUULIowGE6S>!?l>-S^DBcqS-iS;vhFAPeBs<`Mc)fiK^^Wc9Cis-A z8LxbDXA**A$(=bLRSGiUcH?z92Xst2#Rkv?bQ*!{HWVeucERIay)XmZQ~++u0sZqK znPoGGMinoViH+V2;P?f^stk%_mB|Q$1UL1v*{{R%>t{ZB? z3!zEgtzrIZe(Ve*FaIDj3AdWm3^F^QgP0;5$y-Kd=hI1*{;|>FkGERp;5(|UOf&-Z2 z@p$_5{17CP78XIW$Q$YhY?4hS2f0LAfP~`*I04TQlDWdXoMaY$d5V5Q>--4-c@_SJ zDTrRD9(Pl{$LWoplbN2ApB>EhT=+(>vl+H1h`zM>lE;^8)-LDj8h$eV&iK2h(zf>G zX^6J;l)3VgsUO8svk$8JKfRnWz4%xwH`5z_`xqOOq5Nsju+0>Ne)0j?2Zrq=Lx8i~lM#)BV20!sP}Br67z8d- zK!U2g2WKe|4$g-Ic;_J_0@?&dfoC0VL|J(W@*In817SgCJIERUA&7ve(S*Z`FaV%I z1p_Zjy5y)5lnUn=R>n)Xh;oD!_Hlv>z-7)U$EAmnC1|2?fIct>Qa<4<@_O%HOyp?7 zOyC-fy?9Jy+C9ufk@f;d6<|wfF9i-olowTSBPft>fk-ARF(}Rz*Q(kLq(n5^rSquO z#Z5q5BT%Z?me-E*8G>o|@P8k52*htrP!OCaY#+8ry=@dWFLNzeV%W<9Bf_%}w4<~g zCpsN$D-m@TnLs=af_1Uth3r^STV-wv1UMg!GjSdO3yAWYFvoLT1k^N8Id@TH@uk8{ zD0h$t?0F6kcf4pHplP{b<<%GiZ!GK*L6cy$|a3paccw+O$0U42Uo1;NN80_o2 z3Oh7^1uwilZ4k^* znx|j4#`E$#o44rvfEG17zT~C6AAns^q;F6l0~XrpK2q|~jut6@{!3|zlGUs50E?p` zLDZCzK6k+8XTlnwWnNZgjZiYEctW6~_zUu>7D^`d+g1FgUVYRe!iEcQ z*1)C|4#yT?UqFH*3oENAORe7lqprFP_Jkf>IyB5Q4L0pY2iiiOY&-B&AYnIy%?QPp z9;9pE6a9RAy62Fr{G!pzXOS%5L$!=pLcjt*2IL2tmke;ofLOp1AlF@41Ud&JfI1w% zTv6c<2ZXqvNMuTtO(_wM0yy(`mSpu82uG@b0-PN(JU@|DL1xkkTzHxvhoSLknB-4E zB;c0d%_=KtV6cFDGVb>;)t9=*d)3eX5u3gR(d*Qfjj~lFhaNiX()Ghx=drZy*rwH$ zw$_rGk*sqxZ5!RRmM^#7Izp;0Wu4zo+rGcq)|J%Vw&yzgKJNao`|d)v^SPw%fytZe zIqn9Bxq5T7sXS2IEsr%fthb+8g0NHUS#-dUk zmULHQ?4qnl<|z-xjF$R0;D7sn0$u%K(;qgUqG(w&hRWR`0fr?}cY}uWlBaagmGkEX zPSftM#it2cqkxsriy)4XoIx}Q#klfk3C^CbXRLsOwW_mDSVaBrfUw4`YRiI#Icrnv3TeW|8WUx#Em1BS`I~GR zTRx+iwHLmtIng*!IYgfkvda*sInL(Yn8P?k_+GkNE-xbt#5a`?Pr$hXa=5{M+ z!kR?BhlE3P2<1go;1G@PQa>)Hg>umWoK?e?M`^Y!Q6`rCj#VlbO>wt6M4+*jBJ35S z>0OF-vaVS)Hth;=v^|la&L2inM0W+Oq6w+)t!CC8M=KQxY-J%otxGmf(`?n7wzrzt z>Owv1Dasea8(-gf=jHN&eKN1MOx*3KZz<*cIB~DixyZPG|}w}WF}Q2 zb(5ZjIqeQ?{StT=gBpLHilRog9`49|8S(n_Cjt5>g=NpXx`apclv>xKQ}2y;sr}D( ztGPnT+DcJFyibKF-M6{|Pw!i_#QRk|vuIh|71TX@I+i#Z_DGmTJKwIrHmGB{nm zWPp3Mij5Gr75Fqw-EMmdd^^JbIL{vedPqmH9i?vsF;BgCCn=U&xV;vrXQ*Y(?SJtX z+6CI@3w#cOiv{I949Dg}VYXObLCZ<8C4#6ms7`@z6cocalNUD?8wFz7X%WO4Sq77> zg2dn>S1=tfj81kl=g&<*%*BJfvZjbFFo47+H&JaR;9JZO6#-D1+X;a+M4=>RRbs0| zwF|wXib9F)zGZgA%3)@D9*s1zZ5dVAB16iz)Eh8%v!RAr1xteCF^Wnp5Es<%gMg?dMF^ITfrSEmS>T9;uS3nLAAyS z3>rNanRW#anGo@*Ns3nuZ$sI&b{2CW)=`oU_jk#p?(!45dug<2;~1i24}u}Euu?A; zyyIZ^+36i8opuPmL1wA%cc9tn+lL08Ue%6<`exqg4_`Fhj6~lg+WQWd4+s+!Ud7v| zA^Kx_6&{J)0(JW%MVTn&m{XZfDW{P74IFm#(h=49khiw%1FH?bN65QY#yZ$QJm3RI z!VGt_1Lq@G_gL48Q0#dYaneK zkaw3BB$^FkS871309i7;u$3i)w^F5+N(5_2(Osl0DlCp>X{6NRoEqr>1s;sF-Hf^} zV;ykTz@U}?0Hy%ttFLz(F%E)9TQ?gEMSWWSDwO#djHV$HaCaGXi8QB1mOB1vYjkR) z1{Vq4$7GS*%af}wt-O??Q~hfbn`0{)}hUWMl% zdaxG5xk9qwQG=6=bAkAb|GFUAfYEZ`-XV4d@VS5yGR_YpTqj1?FhWUD(i4LQe*r5d zu)-1oR*078AjjkWN~VAyn>hGM1iFZIg!sUB50;CWKtIo5oh}{%AGjWRghUe)B;z~} z=Gs_SbRZocW zzC$Wg{8-Z=F3bv&p7^sQJt-2uJt1hG1EfL=L_2Pyl7;7=mpOw`;Q&i@Pow?+jELU> zlgw}b2a^0&8&&CDJ-2c$Y0g=lYrc%N`JuBu=QzEs)ws&HC{0=UmWi^tN`J9X6*X(^ z8Anr6pL2MX+#>_!s3b@xcOY@qt@f<+r1U91>+DP#bME@pGb?9OUF-8%_kj)f;f(um z);$E{sHj=3U#VZax$ewXbSDj42CBMlHM|l|J(I2KN?LPOwMC_ecIWcGAKu)sH)QM$ zNgV*&E0WrryEOc10cZ|T0Ys!-+VG`~=533q;RWGM62h%UJX*UO-s-3VT6;4=^#;*0* z40C9u^WJpwc+OM%6U#dm7@(&sIlgIizjrQU?ZP#14u9(Vw04W4&(OY{ujga$hu#PK zUdZ~!(jDVlTDsyCy{*;aLTk&)ADgHe-?}&B-Ip|O=``kjKdOY@%=_Lu@DG@5nKb5( zAGKmt$9tnB`5A{_I<_oSx%19Tw_aM)ZFqbck8l0(J>ABk)0so3)759PWoMI`oTF;h zwqkp`JZ*1SyPk5V4C%7=jk4ZMS#P#%FMJ0hVds5o-9x)~t>tIN2lkF!tM7wX-hbt% z{*8wHE4Iys=4IO#HMMJ}-|b7D%2iaZdRM$_$5PgGZFjb!Cwc74a{IF8hg?$og_?n_ zuvM?MY}D+{)a<=)-J7#HHf;6xZS|>&jIHVKZ1tN=V{+sHq>bIOk+IUdQQ4NMY)c7g zcNb8Ir{O2%@06z&vYx(V*<%Cc^sd&e)WKt?J7c%T{@z`!PB-iB+;I12-2Hdkv+lv1 zyWyeRvwCvn`G!-#)Wt)>k;UwZ^jYZLQg9`Nm0E-M4%{ z>{<>k^II;nvlfWXO?mdLCRP%uOWEq4qzxxidFQ!X&twG?W90zD66`)M%kI0AQ9A%RLO_*$+bRhwj$i3#RuT%eEcQ?iop*du*e;ZSW=bek|)b_^`4m zbs$^mQ`4NQI_GKM@bqRpy;;xRoVV$b-Q=|-%N|uxHs`~(eRoe}+YTqstaW5;&GML< z+o0H*u`#(OALLpxwuW3=w*mt5tlI;pxz4vy*O#g5%hvUOP3g@2w@xQVmk;FZ?gyUE zjJ-4Gs6=u~>DLxgSJo@njqBIb_5Gha1~!X61lIMbg>-%2=Z?KwX21c~YNvP2{S)sy zUYLW|m-cj~?Okb8*Kfa`&{7qn^wtrIIq<&(ls(@(-u&Wz`q%B1FLs-LJ>-P=Z|ox) zsQRpeez9NonRA?h!VYl-T^c9{Y<~t3JnB(|5Kuhxu9<`eRN`V02Ou$kS~&(PrM9#i zMa-*#V7ja<^?awOE)R>wBf%uXqjEF?vKnGc0?*MR^im4G00q5_A)Jm{)cN#FkMnxQ z@fi-hogrDhxe7kZC4C;Dq8#M_?LXmXK#bGXe0oUg2Q;5qQhS1g;3N@O+%}$$mM! z<-Ynq5T4L|lP7#SB7E@QhgFpDxi7r@#py~~cpnNMi41|_g9JhVdD2SUJZ3U!%d`v=CqsIJ|#*SxoHZSmcs zaJbfkS$jX!0V^`s0V8r$$^s|~kvk|JohgLk&qIt3Nfc3c2bR7D&*^x2Q3Kyg(0)m` zhnCgl4N4kOBVcPyDFa%;#YmpQX%jkhw-ETJnu=LNepGsdE^=AqjZyGu&Vb*DQxcUC z65{1*4o)qYkijiuC^ZMssOolr#{_4pS~S7wMO5n1>Ti9;3lkOa|E%7m-xnK0LX3v;!K)>&i}y8>%cF%t+>XLbc}Q7L`% zLonjJiMjwbTVKelxj1T%B#7qOMm1kZwqoNhX z<5l~=icaNP({JlAG{xS;0euuq9q#;aPQ?uv_FQN&m|dvWya@0SCbVFf#;!KGK2jKR37l4 z<12^-P%%$nL!y0lVUBQAgFHUMd-)q!J&e(xVe|$@3`RuNB+4l`ePi(4T;|Eht|Tk2 zhw^rhXnK-XfR`&D;5XZjCw=cADs(UK{{bU157eCn#H{WErn0tEMqbLR%dpf`ntx;O zD$JX(g2E3VlKtjxl;+lg_pOaNmuItT&qh^SrmAhDsxwp7neH08$7idKC9PlBYw&YJ zCrH7WhW&RZvJKB>Om#`avUd5>7k1|+e6&{FIdbdB509>W|Gu>qD!#N=K@9S0y;qqrtN*n`Ha0U=j&b8 zt=d=YDgAv%+m;?cLCSa5pa8s4(UPfX$yT%_4V$36`B(fKl^vPNj&)DAav*ITNFIb} zv$Y+C>!w_F{i?VkzWv(Ql&Nf(Ue<0_c~?U#p_KOR=(0BFs#-m|ax~Taz}2?t_H4L2 zGpa28SIu{)e}3(gYk$-HY4Fz_*@LID1E)WCpMe>Gn7#wtR|EK~x zd0a)ccdobn^jhi_G6q-*ha2Q%P&2dkmb6KJV2%&g<)5H{t%3YNC5V@q8j#^5jcuo3 z%j8!AES=C6#Ja*u0AP-v0CUu#pa0qj?D9T1+$F9${#B?4)pvK`V^Ckh`w7>9X*VqR zo?tu}_(^DGmGi|hv?_JUl*9$F`RlBJ<0EAqzza$jdqGQIPjRQ(vJ_iC0w2MP1ed=$ z?%h~H?4?RwJq59sr*D5kQ&Ac&NbT#IlN7v`&`yAFM2yY}K+|1#%rZ#bCy4kibR=ea*R2g!!JC*$r} zzxwgD53fCN4{jcL{+FkJaXRO&T|K*UHub^>r`|txxBBOGpVWamIOP0>(mdl_HsXQ* znQns_$iSat-y;jPrxg^?`koEYLC4_e0bW;Y#?_jd`P|j_g`;w-6$Y}^NjW@edvn^< z3~|n0owRS&0=|C)j^XKjB6PweelR?Ayqx~)=jh`W!>_1L$p5O7K5jGos;d(6zoso1 z+h~Y=^rX+pqcFhZlK~z@0Lke0v$3GxFEe};O86;^kkENN1H_QX<7tuik8CFrCfO#w z0&^%@@ju6?38Q9=S}+3LOOE~oG6KGDdXsvjsneUbMrf*zd1UtJ`!?;)Ej^^L2(GFv zBj!xNiMH??%+pf7ZN=PvzeeAktMYDXNrq`wGF^M`R^My?wD}j^>HZU$t{3F$O|xxV zkAPdp^iF-{x^|0#T{{tM5BNeWMdW$Q8nU-$)#8WF~bk6=Ua6T|1Qstc?1aq`1Og8;wO zAS=0zY;X;E19*ST+_To8pNGLWp4}fjluCk$=EZFikpBwrLktEq zn*Lg2q;=a)injk3%1r*O-)Jnf<{Jv4e;|>EqAUM9<@^oR`5UVLzfy;OL)ASt7-{>O zZyii)kl6xbiR;ecTZeOw>Q(EC6-=RcrDF-K9J%t!JJDOwoT~=!%ACFG&TF?`Q%>^J zzCH4m9iug`+n3$T!L>uFi>VjZ{ppq?ncAUr)ljD5=r&bGYqpvwZ}XZ4&4)SN{%x(x zt4ULpTL(>g&6b&>E0$YxI&;osPdi@Bm@cFzFQrYF9%(gt!y~QErP-!zwB`{*?LF|x z_wJqBIC4I7axZghqp9YUkm`8nT&Ai!OHDp1r+N-bx^ZATJ?#_ijtG%y~EhHhPRfq9W`O}VhDRj%46SM5`(JhWj=*rFgw#n+GDb*+!R V|JpVdzd1Ofr#)X&7?Tt6e*q-7cA)?O diff --git a/venv/lib/python3.12/site-packages/aiohttp/__pycache__/client_middlewares.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/__pycache__/client_middlewares.cpython-312.pyc deleted file mode 100644 index 56f9452580ea84c8832d4d8e3ac6f54e238354b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2296 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≪;X$nVA>>voAcoTcc&YSY)y{2&Rw zLmmRII?Nh$Q*P1e%x%aVleUsN2pZa1oQAsv3AO2thuwmtvh^i=O5TGAbfKLJkQ?6c z2i^;i84*G}O}ePhn%*hR{XqxHwS$UbW+}#@q4z(+J*eMoqyEius&6-m75Xc$Mc|gKn0r$h zR?l7QaMDp$qvc^=V54>DW0X^U2J%IvORvqElx{t*&q(qsy?R~NG)oe^Dtw>Aj#?y_ zLPsA9S*wl})?!nL@K{Lm*ndaXq3u@ITuN(- ?&}RWW(TQTL{c}xcoBl-s*o^7U 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 BGid+- diff --git a/venv/lib/python3.12/site-packages/aiohttp/__pycache__/connector.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/__pycache__/connector.cpython-312.pyc deleted file mode 100644 index 65ce5305da8995ba4060fa9c1e8e703457c8870c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76745 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 diff --git a/venv/lib/python3.12/site-packages/aiohttp/__pycache__/hdrs.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/__pycache__/hdrs.cpython-312.pyc deleted file mode 100644 index f54f6ea0d0840d4c8ac34efeff49c5144bf4f4a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8502 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 QcJ-6>zc>`}`|uh5f6no`8~^|S diff --git a/venv/lib/python3.12/site-packages/aiohttp/__pycache__/helpers.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/__pycache__/helpers.cpython-312.pyc deleted file mode 100644 index 9c0bee20ab3b02defa71aead7cb23a2ffcb29971..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41751 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 QmsPvq+UAN{#E>Hq)$ diff --git a/venv/lib/python3.12/site-packages/aiohttp/__pycache__/http.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/__pycache__/http.cpython-312.pyc deleted file mode 100644 index 632af00875c00eabfd827ae18f24681a25e7bd2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1703 zcmaJ?%WoS+7@u9Q->5rd-D#-7Gbcf4k1lMqUz z9E*h1APy}Y5cmEKTzciwh(oFo6$iwjx6&XgdgA-mb__kRmVfj6zWvSP_sxv`Q!*JN z@Em=Ar*b7s$Zr_5o=}sVeWwv}pL|5hq^voFVyinE*Qu@{4>$pCP=g0)5MrYobV58# z!#)o=5gw&cpNE|okJC6$&;(D?Bu~*4Pt!E-pdJ4Eh||ftXczCM-MokP@Lt->`)D8U zr~Q0@4)8%b$cN|@2pU z7GvRudV|vo>>|5VPF#hM={u_}MZ4WG+q}gdHpvZgkCgN(d^d*)IV4}eXJ@UYYPXPG zZ$~Y5OaDgyYSe(0K zt(uZ`&nF)2Y@5W*GN zkV-Bxy9}~bTSz8gWK=bHC-NfubeBo5nd)k!WZkVv){+(N{ibRO#heP*GIHMA#Cz#C}^JWJ`1WK-=#e%uIvTPPil{O2-^+M4ySKeRSxLz!XQ4okB1UNB7 zj37i2@LGyELINR)kU~f!bRcvhbR+a23?Sf95q$_<2>l4X0H0@854?(7%io#)WP0;( z3YwYC!;D>ZE8r)8XXa3hqjn4+JEa2hKq>=Yi2!6&$UDH3Bn;F9F+&9WTo9E;4OFhg z>K>dZ*>D{9vwr==|JzY1U%Jn>q`#%F+w)ztJ))I{J>S{6W!0E*-{0@o>xng1Vau`| z$FfxDmMggJsYL4%RBMny^WfSODh_7J2vmH41DpaosTQU_d zGg%T<-@IQu6{yxcxK`Sp#QQe=s+6y|oaJFkxtG7;mUcO-c{1-Yhiwa+=cHGKvn+CD zcfaPic<1tathSeTs$2QGzh|>kGgtBwPI9hpmu|y7lKIxYVezKw2d^Smxm(_K*fsGs zOo|iB9|4{RG)?=3#GaDjU&+MpWbi3jc&Udq{Ut%@NFZy$A3hrjYWf)gc%B-G>qp_| z*T}$or~Pv${c}%@@Tt*rV)Pu}J`3mr`ceA0`;6!yjghzBIh~w4nVdVFTsWCr_<8c? zUjhBH{^Y{Nqw9CIdyy|A#}oH+U*{f&Gbcvo1-?6q-hKCY_CfGL>4(_|m2cCJyDy!@ W-~1ED`}+j}fyDoxN4=T(i18121HyO! diff --git a/venv/lib/python3.12/site-packages/aiohttp/__pycache__/http_exceptions.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/__pycache__/http_exceptions.cpython-312.pyc deleted file mode 100644 index e45bf6c396f1ee404a7eb00f3717a938262d7333..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6172 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 GW%Yk&0yC2U diff --git a/venv/lib/python3.12/site-packages/aiohttp/__pycache__/http_parser.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/__pycache__/http_parser.cpython-312.pyc deleted file mode 100644 index 222605318757ea3aeeec52b82c7dceea543f174b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36178 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 PkE&IDjf#&NWbprAG;ZvU diff --git a/venv/lib/python3.12/site-packages/aiohttp/__pycache__/http_websocket.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/__pycache__/http_websocket.cpython-312.pyc deleted file mode 100644 index cadec5ad59d1d17a0d56591a426afdcbea80f24f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 991 zcmY*XJ4_of81`Krmp6|Aim0Lt^pRHNL|Hmi6)2p576Rf>BW|&doJms7=aYRT4PDCA zwOhB&MIE}fQ2vtZ-wJ#(A51&7O{{8>{Kl@uYn*w6IdiS#NBm%&1 zx#*4fB{};l$Xnn53pk3Sx(Ze;6-TTHj#^PgY7sYv<5nDNmWC5n0w=8`PFX3Ow$eCb zWx|-Ko5eXR7xI`pgomwR1*iaxpv?2BUdh2M)Z2qqj|uf|j}K;{-W#lXY$y6b>2hn# ziCg0xt(e%qRYlt-sqLbm;8PNi8gUCPL|Kz~tS~cMusx^nu=H0REJk>|YQm?+7EiSq zL@xqZM;^~ya^I#56*WF0V#+IPrm+B54bz-oH2CPHv|L&2Yq@@5gHl3yx@wkP!cdtw zh!0oIB~h6*>|NB|PFBrT#F$-2TvArw?D(jt@S%R14P-lrUX!Y{83-v$<;zh`f_PIv zvl4O=(h?F9G7^#!q7q^fB>%qiq&?R%#&E7jAXa_7C!rDN?Mmn|w*3uV9Z4Vwy59*J#G5V6JkXgiecHEcyW+8!ZZ}CI2z*__6<7Su zMdFdLX3s^BXNyZ_D&gNKQ1oA*bQ%YfQ$J$4 w*YE(oX?`EOb3AtE{lv%oVgA#^m;C4aQFQ4nqE4zuVEiPNOREPOy(x142lcxKz5oCK diff --git a/venv/lib/python3.12/site-packages/aiohttp/__pycache__/http_writer.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/__pycache__/http_writer.cpython-312.pyc deleted file mode 100644 index 0aa4a54a19fbe7ae3a7a9c0efa7e3a1298ee1949..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14553 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 diff --git a/venv/lib/python3.12/site-packages/aiohttp/__pycache__/log.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/__pycache__/log.cpython-312.pyc deleted file mode 100644 index d2d38d0132aafbfb6b98cc40495202d7995a1fbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 740 zcmZ{ize@u#6vuO|+8O+MXq;`>*?L4B(bFxp>B?DI=PE~ zic3p}N?in9+ypl#bF{fScyCC)-{eES??Ik1&LUa8hs(ykhR}OxR3)e4`$LL5WFuSi z&>NsxT zj57|1L#cs{@g(mwybA3kPT3`urVj8VOxdi=QaaP-Q~8L#!=Zlaq(OZkzA1Q%>{08& zmy>WJzypVweuWEHcE&0;Z3iATZD6DYL5p~9oisb5L4(ceMvZV+K&5F~=cWUkOa~*f z;cBz`W3z`}{yEB*Z`Vfo z@*rRCuWk+V+r6d#C|tZb9^v8u7w@lzxYEnM=!KhukzN?+g?@2ksMoGDOqc1u5){Cq diff --git a/venv/lib/python3.12/site-packages/aiohttp/__pycache__/multipart.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/__pycache__/multipart.cpython-312.pyc deleted file mode 100644 index 703e63f60c843905e01f184364c0f4f6607cba7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52676 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 diff --git a/venv/lib/python3.12/site-packages/aiohttp/__pycache__/payload.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/__pycache__/payload.cpython-312.pyc deleted file mode 100644 index 9c41b3cc5d642b2bf8cf5202dec5d0900f9f9353..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48969 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

    Gw7ovHMx7~#a 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 diff --git a/venv/lib/python3.12/site-packages/aiohttp/__pycache__/pytest_plugin.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/__pycache__/pytest_plugin.cpython-312.pyc deleted file mode 100644 index 4566319bd7090f0cf739ed331a39adcaee4f16bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18514 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 O`s_Wm=DRfv`2P(C4OQ6y diff --git a/venv/lib/python3.12/site-packages/aiohttp/__pycache__/streams.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/__pycache__/streams.cpython-312.pyc deleted file mode 100644 index 502582f3473bb718f9648a43b0145bfc314ce5d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30985 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 a+XAAu_ZYgxn)&SuPh8sda{*Dt>i#z$W1#*3 diff --git a/venv/lib/python3.12/site-packages/aiohttp/__pycache__/tcp_helpers.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/__pycache__/tcp_helpers.cpython-312.pyc deleted file mode 100644 index 14377df138fd25c357fac8c826c8d48bda190b2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1799 zcmb6ZO=#Oz_&v#%6w8jYtYIMuo4YWALtHf(%NQLlN#nF3!48WV#22AjFR>k25>L-g zy?Dcg!P@Q69tPPUY(1_dupWDCd)=ib9nLfgh3?XuO9F+Q_MU7nZrIrN3BI5AeeZkU zuYL)I0)Rs8hppU09)Rae=z!2>4)0TD8|WYdbf|L%%s`KF8IDrk;ETSD4>Fz4@E3)Q zKzV;gGtr z&2*X(<=ha-+Uf>Ewr1qZ$d#FBS~@bciW^)>sf&rk^32l0rwO-*V9j)F3lmqsh?KCI zg(vv}Kjmq)!Qs~wZG$Q(bZgs&I^1oaeh#bf`uQp>usf%K_&NuLPQN+_ly+&QuH!bV zbGvPi5LD8N>g&2j?{BFw_F36`me8(2v#sVk{V zi-|NA*&PnEms}sSa#-slk>i4rvx-P5YQ!lkb5^!gL?&?*f(*2dwPMU6dHN`h>DH!c zSelNoQbuN3G4fXxyF$BWzJG3VN^$Z8#cVCRp{*lF(ehS~5L;ng$ax)h&e;{rYU`m8 zWt@*Fs)2*>U?V(M50CvM?T06C_zvXoV|n->*mo;+Gqp3{7>U(KVteI=GFw+>AI$t3 zoNw|VIC4lYgV!3z4!p*(s&BKB!Q@?vyqq0Yvj~2J;*%)OP|0C2(I})KX4CKb%bHO_ z+4f%0698E6Jjb)t$$yv#uFBP51ys30w-?XVYhC}}GqJ{%A*P-Q>#hgYt~n&Es2-5s z4%eB|4*+EGu=Gzs*A)KE_IGJnu}%Sf{jV9-=|4yZo&O1&*-^6dkW8dqsm)BgzN?mHVD^wJrdARdTNtwhU3p=7 z`IA&SrP5!8D^sKnbj!o^&AgSE8Its!)`|+?f$d6V}=Hq>I;f!|K&3cd9*H% z-np_b$7*xWM7dTyka{WoYU}#e&h(G*@8f&ZKVQ6i@$t}wx_E)={s{Kn9{6UlmN*hX zp#R&k{hpzh0QxUOI!w31H^VzZV{p7aIKDUEn26UW;t%{!r1@7ovv}p%wXBbwAPwQ+ z$obg;{?UMc_H8j5az$0ut*olLqUKc0Y~E^bH2otIy7F}SS``sU#m<}Sn9V%9q!|Xg zl+zrI5bXA(JO8@Y)DKZJFLlh?=}o-16UWlWMN2OkD30Hw3brg>VVXRI@HY^94tjqF zp{L-Tr(pP5V7w;26o5~@F?~D!gnzf`<7rBF-fEnks-K-|0w&!fM;>kVLVxH)MTL9h ikR~5$N+Ea|e)nNxc%nW$(F9Domu}Jf`jIDl@%;&{#&nJV diff --git a/venv/lib/python3.12/site-packages/aiohttp/__pycache__/test_utils.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/__pycache__/test_utils.cpython-312.pyc deleted file mode 100644 index 97b9a154467abc3c5b7a5e2f256f03d44ad0d2d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34844 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 S6NVMu?-?!kjj-7){=WfP(HX7) diff --git a/venv/lib/python3.12/site-packages/aiohttp/__pycache__/tracing.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/__pycache__/tracing.cpython-312.pyc deleted file mode 100644 index c77fc54bb799c99ea99a0a04cafbc4e2d9b17a33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21919 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 diff --git a/venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_app.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_app.cpython-312.pyc deleted file mode 100644 index 09dd887bcfbe7ddb2b7a7fd19ebfaa0589ca9b9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27293 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

    ^6_0>ARWqKg|5X1Ez1wki78E!Sc1 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 RNs|ri;x}79pj*tD{|7Hm%0&PG diff --git a/venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_fileresponse.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_fileresponse.cpython-312.pyc deleted file mode 100644 index 1f53f3c85ebd2b404644aa01e8effef5141a37d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17224 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 RDL7}sNN4vdO9qvi{|_Wn8XN!s diff --git a/venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_log.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_log.cpython-312.pyc deleted file mode 100644 index f05595f839498e502532fe403200fc88633a9db0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10696 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 diff --git a/venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_middlewares.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_middlewares.cpython-312.pyc deleted file mode 100644 index 414f5b0ca414ee3cb417ce673f6ab3e2426ba601..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5648 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 diff --git a/venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_protocol.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_protocol.cpython-312.pyc deleted file mode 100644 index 1c6e6742718abed3707f9a3c1a029a0c4582f587..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31299 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 diff --git a/venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_request.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_request.cpython-312.pyc deleted file mode 100644 index b843a931346236b4dde7d1a4f2d32dcb214431bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38604 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 diff --git a/venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_response.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_response.cpython-312.pyc deleted file mode 100644 index 4a7cd612c2f9aa932b3174ff1f1ac1bb78b7f8f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39206 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 D^>sv- diff --git a/venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_runner.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_runner.cpython-312.pyc deleted file mode 100644 index acfc6efd1509930fdf5fed9ced2a749f31179dfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19059 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 z z>G<`rPtqTyZ#Nykwf|3t|9BWEw}Z#OyBFE=kobTN?vIY1-<|x;$#Q$L)SkTC{?xY~ zu_gSE_?D}KSKnA`ir?OHpwx7r;vuodt9#!O9|$n|eU$)Q8hwDxHvtmw#jS?it%hzr z4ZSzXzY;_2J_DTa{K@w@bI$Lgissz9A-U`mDgh^9NC4yL#1j5xAVmpX8T;VxSa&_!l zvedB`?hH?|D!9~&SMa3PTKg*kwgb zrnDOvp~D!Vt+Ys_}-iikisC64VD?Wxwq^YOkXJ~-L`YR0#g+pwwgcuqof#zxi z(Q2Icv^|gnPw%zK>(jq4R0yD-#;e#=0s+raZZ-K0!Is^0OqGdNcq&3crercs7B%OJ z@U*neje$e)*+Ma`*ycumu>^TsVFt7s@QIcw%GA&(Gp^->mka#s#b8#pg7|uKOD5Y_ z(Ak*pSq(VozC6(tP#6}QOgQ=)a^e$(IRKQawj&>*D$v0G#6X{_2pq@#jkJG7!e5fX pG8z0A>HmW4`hxU)Nlui=i7!as{Xp}g?_2K(#~tM!64tPF{|kgbS?mA+ diff --git a/venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_urldispatcher.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_urldispatcher.cpython-312.pyc deleted file mode 100644 index 107b04640fc3eb027f478dd0ef5edb76be03fe3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68680 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

    b0U$_Pat|gkFawD* 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 SY_)h6{3%Z1k{C~-QT{KP-wW0N diff --git a/venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_ws.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_ws.cpython-312.pyc deleted file mode 100644 index 635e871daa36e5d07ed5f7ea9b638fd940648c07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31597 zcmeHwdvsgJdFQ>r#Tx{`_nQPCAPJEoB~cGbqC`;?^%g0MRBXX^Xo?q~2rgP0rTNQ+Cr9Fz5pWl~1&r_H=#r>@I9NwWD(Me-@CeM+d310!KK+=%V;D1fjAJH`Y0T^~k6ApH zF{{TqmgULf<+^Mh8}e#>_A!UYfjB|b`Lf4yJUPs-_vMb|dGeUw;L9H?@Dwn=(N{QD z5+*3YQ;i+J87GLF<)8ibg@>Gpgd#cB3JT+srp4u^& z$2C^xsT-^J)Q>fI8phln_t+}WDptnoYaDCxG%S<+Rhj0DZ2G54Ejh>AxobB5**5+wr{v6-tu`Ql0Jm=MoKC29J(iL-0J;iYn zjT((|`?x%g?Vffq&$CU;_iXnXy&c6U;N2k>w8PbKUfbw}WDSZ>ETn(8ioUItV>H|z zPAqA{$m-e2(n^t5=G~&?_jH}(-R196o*uU$rtKU*7t`$?86Wh;jQav! zY4Etu8#DHv4vb7toUVWJG$M3I#}SSRLxcW+n~zz#_8pq^1x9v_36&K-a)5*?tP!?9_T-IxVsNYCS>(ZoH)UT#MC`8ERT{~6SM5^ z>+RX)9l|FiInX`M0!Xv%?e9Olb5K0u{mi7-ABbg9xLX+=RBPEe==Ua45wyv*9`X85 zPmH5Uns*7P-nGz#YB7AuL@F6lhKPpboK!~H36;c(`}ZE{?%UgYaMwUrZ%+?Ky?>yy zs|&;4kE*PLlYxnW!9YM7Iqr|?hoy-rjEBzen+W)aP+T<$pyrm=BkBt0

    dZG)FnF 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 P43W~b?l1*TG8+^Kh(&NTZ=jp;PWuRZ5J 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 Kb9b9qi2o0qPvi^$ diff --git a/venv/lib/python3.12/site-packages/aiohttp/_cookie_helpers.py b/venv/lib/python3.12/site-packages/aiohttp/_cookie_helpers.py deleted file mode 100644 index 4e9fc96..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/_cookie_helpers.py +++ /dev/null @@ -1,309 +0,0 @@ -""" -Internal cookie handling helpers. - -This module contains internal utilities for cookie parsing and manipulation. -These are not part of the public API and may change without notice. -""" - -import re -import sys -from http.cookies import Morsel -from typing import List, Optional, Sequence, Tuple, cast - -from .log import internal_logger - -__all__ = ( - "parse_set_cookie_headers", - "parse_cookie_header", - "preserve_morsel_with_coded_value", -) - -# Cookie parsing constants -# Allow more characters in cookie names to handle real-world cookies -# that don't strictly follow RFC standards (fixes #2683) -# RFC 6265 defines cookie-name token as per RFC 2616 Section 2.2, -# but many servers send cookies with characters like {} [] () etc. -# This makes the cookie parser more tolerant of real-world cookies -# while still providing some validation to catch obviously malformed names. -_COOKIE_NAME_RE = re.compile(r"^[!#$%&\'()*+\-./0-9:<=>?@A-Z\[\]^_`a-z{|}~]+$") -_COOKIE_KNOWN_ATTRS = frozenset( # AKA Morsel._reserved - ( - "path", - "domain", - "max-age", - "expires", - "secure", - "httponly", - "samesite", - "partitioned", - "version", - "comment", - ) -) -_COOKIE_BOOL_ATTRS = frozenset( # AKA Morsel._flags - ("secure", "httponly", "partitioned") -) - -# SimpleCookie's pattern for parsing cookies with relaxed validation -# Based on http.cookies pattern but extended to allow more characters in cookie names -# to handle real-world cookies (fixes #2683) -_COOKIE_PATTERN = re.compile( - r""" - \s* # Optional whitespace at start of cookie - (?P # Start of group 'key' - # aiohttp has extended to include [] for compatibility with real-world cookies - [\w\d!#%&'~_`><@,:/\$\*\+\-\.\^\|\)\(\?\}\{\=\[\]]+? # Any word of at least one letter - ) # End of group 'key' - ( # Optional group: there may not be a value. - \s*=\s* # Equal Sign - (?P # Start of group 'val' - "(?:[^\\"]|\\.)*" # Any double-quoted string (properly closed) - | # or - "[^";]* # Unmatched opening quote (differs from SimpleCookie - issue #7993) - | # or - # Special case for "expires" attr - RFC 822, RFC 850, RFC 1036, RFC 1123 - (\w{3,6}day|\w{3}),\s # Day of the week or abbreviated day (with comma) - [\w\d\s-]{9,11}\s[\d:]{8}\s # Date and time in specific format - (GMT|[+-]\d{4}) # Timezone: GMT or RFC 2822 offset like -0000, +0100 - # NOTE: RFC 2822 timezone support is an aiohttp extension - # for issue #4493 - SimpleCookie does NOT support this - | # or - # ANSI C asctime() format: "Wed Jun 9 10:18:14 2021" - # NOTE: This is an aiohttp extension for issue #4327 - SimpleCookie does NOT support this format - \w{3}\s+\w{3}\s+[\s\d]\d\s+\d{2}:\d{2}:\d{2}\s+\d{4} - | # or - [\w\d!#%&'~_`><@,:/\$\*\+\-\.\^\|\)\(\?\}\{\=\[\]]* # Any word or empty string - ) # End of group 'val' - )? # End of optional value group - \s* # Any number of spaces. - (\s+|;|$) # Ending either at space, semicolon, or EOS. - """, - re.VERBOSE | re.ASCII, -) - - -def preserve_morsel_with_coded_value(cookie: Morsel[str]) -> Morsel[str]: - """ - Preserve a Morsel's coded_value exactly as received from the server. - - This function ensures that cookie encoding is preserved exactly as sent by - the server, which is critical for compatibility with old servers that have - strict requirements about cookie formats. - - This addresses the issue described in https://github.com/aio-libs/aiohttp/pull/1453 - where Python's SimpleCookie would re-encode cookies, breaking authentication - with certain servers. - - Args: - cookie: A Morsel object from SimpleCookie - - Returns: - A Morsel object with preserved coded_value - - """ - mrsl_val = cast("Morsel[str]", cookie.get(cookie.key, Morsel())) - # We use __setstate__ instead of the public set() API because it allows us to - # bypass validation and set already validated state. This is more stable than - # setting protected attributes directly and unlikely to change since it would - # break pickling. - mrsl_val.__setstate__( # type: ignore[attr-defined] - {"key": cookie.key, "value": cookie.value, "coded_value": cookie.coded_value} - ) - return mrsl_val - - -_unquote_sub = re.compile(r"\\(?:([0-3][0-7][0-7])|(.))").sub - - -def _unquote_replace(m: re.Match[str]) -> str: - """ - Replace function for _unquote_sub regex substitution. - - Handles escaped characters in cookie values: - - Octal sequences are converted to their character representation - - Other escaped characters are unescaped by removing the backslash - """ - if m[1]: - return chr(int(m[1], 8)) - return m[2] - - -def _unquote(value: str) -> str: - """ - Unquote a cookie value. - - Vendored from http.cookies._unquote to ensure compatibility. - - Note: The original implementation checked for None, but we've removed - that check since all callers already ensure the value is not None. - """ - # If there aren't any doublequotes, - # then there can't be any special characters. See RFC 2109. - if len(value) < 2: - return value - if value[0] != '"' or value[-1] != '"': - return value - - # We have to assume that we must decode this string. - # Down to work. - - # Remove the "s - value = value[1:-1] - - # Check for special sequences. Examples: - # \012 --> \n - # \" --> " - # - return _unquote_sub(_unquote_replace, value) - - -def parse_cookie_header(header: str) -> List[Tuple[str, Morsel[str]]]: - """ - Parse a Cookie header according to RFC 6265 Section 5.4. - - Cookie headers contain only name-value pairs separated by semicolons. - There are no attributes in Cookie headers - even names that match - attribute names (like 'path' or 'secure') should be treated as cookies. - - This parser uses the same regex-based approach as parse_set_cookie_headers - to properly handle quoted values that may contain semicolons. - - Args: - header: The Cookie header value to parse - - Returns: - List of (name, Morsel) tuples for compatibility with SimpleCookie.update() - """ - if not header: - return [] - - cookies: List[Tuple[str, Morsel[str]]] = [] - i = 0 - n = len(header) - - while i < n: - # Use the same pattern as parse_set_cookie_headers to find cookies - match = _COOKIE_PATTERN.match(header, i) - if not match: - break - - key = match.group("key") - value = match.group("val") or "" - i = match.end(0) - - # Validate the name - if not key or not _COOKIE_NAME_RE.match(key): - internal_logger.warning("Can not load cookie: Illegal cookie name %r", key) - continue - - # Create new morsel - morsel: Morsel[str] = Morsel() - # Preserve the original value as coded_value (with quotes if present) - # We use __setstate__ instead of the public set() API because it allows us to - # bypass validation and set already validated state. This is more stable than - # setting protected attributes directly and unlikely to change since it would - # break pickling. - morsel.__setstate__( # type: ignore[attr-defined] - {"key": key, "value": _unquote(value), "coded_value": value} - ) - - cookies.append((key, morsel)) - - return cookies - - -def parse_set_cookie_headers(headers: Sequence[str]) -> List[Tuple[str, Morsel[str]]]: - """ - Parse cookie headers using a vendored version of SimpleCookie parsing. - - This implementation is based on SimpleCookie.__parse_string to ensure - compatibility with how SimpleCookie parses cookies, including handling - of malformed cookies with missing semicolons. - - This function is used for both Cookie and Set-Cookie headers in order to be - forgiving. Ideally we would have followed RFC 6265 Section 5.2 (for Cookie - headers) and RFC 6265 Section 4.2.1 (for Set-Cookie headers), but the - real world data makes it impossible since we need to be a bit more forgiving. - - NOTE: This implementation differs from SimpleCookie in handling unmatched quotes. - SimpleCookie will stop parsing when it encounters a cookie value with an unmatched - quote (e.g., 'cookie="value'), causing subsequent cookies to be silently dropped. - This implementation handles unmatched quotes more gracefully to prevent cookie loss. - See https://github.com/aio-libs/aiohttp/issues/7993 - """ - parsed_cookies: List[Tuple[str, Morsel[str]]] = [] - - for header in headers: - if not header: - continue - - # Parse cookie string using SimpleCookie's algorithm - i = 0 - n = len(header) - current_morsel: Optional[Morsel[str]] = None - morsel_seen = False - - while 0 <= i < n: - # Start looking for a cookie - match = _COOKIE_PATTERN.match(header, i) - if not match: - # No more cookies - break - - key, value = match.group("key"), match.group("val") - i = match.end(0) - lower_key = key.lower() - - if key[0] == "$": - if not morsel_seen: - # We ignore attributes which pertain to the cookie - # mechanism as a whole, such as "$Version". - continue - # Process as attribute - if current_morsel is not None: - attr_lower_key = lower_key[1:] - if attr_lower_key in _COOKIE_KNOWN_ATTRS: - current_morsel[attr_lower_key] = value or "" - elif lower_key in _COOKIE_KNOWN_ATTRS: - if not morsel_seen: - # Invalid cookie string - attribute before cookie - break - if lower_key in _COOKIE_BOOL_ATTRS: - # Boolean attribute with any value should be True - if current_morsel is not None: - if lower_key == "partitioned" and sys.version_info < (3, 14): - dict.__setitem__(current_morsel, lower_key, True) - else: - current_morsel[lower_key] = True - elif value is None: - # Invalid cookie string - non-boolean attribute without value - break - elif current_morsel is not None: - # Regular attribute with value - current_morsel[lower_key] = _unquote(value) - elif value is not None: - # This is a cookie name=value pair - # Validate the name - if key in _COOKIE_KNOWN_ATTRS or not _COOKIE_NAME_RE.match(key): - internal_logger.warning( - "Can not load cookies: Illegal cookie name %r", key - ) - current_morsel = None - else: - # Create new morsel - current_morsel = Morsel() - # Preserve the original value as coded_value (with quotes if present) - # We use __setstate__ instead of the public set() API because it allows us to - # bypass validation and set already validated state. This is more stable than - # setting protected attributes directly and unlikely to change since it would - # break pickling. - current_morsel.__setstate__( # type: ignore[attr-defined] - {"key": key, "value": _unquote(value), "coded_value": value} - ) - parsed_cookies.append((key, current_morsel)) - morsel_seen = True - else: - # Invalid cookie string - no value for non-attribute - break - - return parsed_cookies diff --git a/venv/lib/python3.12/site-packages/aiohttp/_cparser.pxd b/venv/lib/python3.12/site-packages/aiohttp/_cparser.pxd deleted file mode 100644 index 1b3be6d..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/_cparser.pxd +++ /dev/null @@ -1,158 +0,0 @@ -from libc.stdint cimport int32_t, uint8_t, uint16_t, uint64_t - - -cdef extern from "llhttp.h": - - struct llhttp__internal_s: - int32_t _index - void* _span_pos0 - void* _span_cb0 - int32_t error - const char* reason - const char* error_pos - void* data - void* _current - uint64_t content_length - uint8_t type - uint8_t method - uint8_t http_major - uint8_t http_minor - uint8_t header_state - uint8_t lenient_flags - uint8_t upgrade - uint8_t finish - uint16_t flags - uint16_t status_code - void* settings - - ctypedef llhttp__internal_s llhttp__internal_t - ctypedef llhttp__internal_t llhttp_t - - ctypedef int (*llhttp_data_cb)(llhttp_t*, const char *at, size_t length) except -1 - ctypedef int (*llhttp_cb)(llhttp_t*) except -1 - - struct llhttp_settings_s: - llhttp_cb on_message_begin - llhttp_data_cb on_url - llhttp_data_cb on_status - llhttp_data_cb on_header_field - llhttp_data_cb on_header_value - llhttp_cb on_headers_complete - llhttp_data_cb on_body - llhttp_cb on_message_complete - llhttp_cb on_chunk_header - llhttp_cb on_chunk_complete - - llhttp_cb on_url_complete - llhttp_cb on_status_complete - llhttp_cb on_header_field_complete - llhttp_cb on_header_value_complete - - ctypedef llhttp_settings_s llhttp_settings_t - - enum llhttp_errno: - HPE_OK, - HPE_INTERNAL, - HPE_STRICT, - HPE_LF_EXPECTED, - HPE_UNEXPECTED_CONTENT_LENGTH, - HPE_CLOSED_CONNECTION, - HPE_INVALID_METHOD, - HPE_INVALID_URL, - HPE_INVALID_CONSTANT, - HPE_INVALID_VERSION, - HPE_INVALID_HEADER_TOKEN, - HPE_INVALID_CONTENT_LENGTH, - HPE_INVALID_CHUNK_SIZE, - HPE_INVALID_STATUS, - HPE_INVALID_EOF_STATE, - HPE_INVALID_TRANSFER_ENCODING, - HPE_CB_MESSAGE_BEGIN, - HPE_CB_HEADERS_COMPLETE, - HPE_CB_MESSAGE_COMPLETE, - HPE_CB_CHUNK_HEADER, - HPE_CB_CHUNK_COMPLETE, - HPE_PAUSED, - HPE_PAUSED_UPGRADE, - HPE_USER - - ctypedef llhttp_errno llhttp_errno_t - - enum llhttp_flags: - F_CHUNKED, - F_CONTENT_LENGTH - - enum llhttp_type: - HTTP_REQUEST, - HTTP_RESPONSE, - HTTP_BOTH - - enum llhttp_method: - HTTP_DELETE, - HTTP_GET, - HTTP_HEAD, - HTTP_POST, - HTTP_PUT, - HTTP_CONNECT, - HTTP_OPTIONS, - HTTP_TRACE, - HTTP_COPY, - HTTP_LOCK, - HTTP_MKCOL, - HTTP_MOVE, - HTTP_PROPFIND, - HTTP_PROPPATCH, - HTTP_SEARCH, - HTTP_UNLOCK, - HTTP_BIND, - HTTP_REBIND, - HTTP_UNBIND, - HTTP_ACL, - HTTP_REPORT, - HTTP_MKACTIVITY, - HTTP_CHECKOUT, - HTTP_MERGE, - HTTP_MSEARCH, - HTTP_NOTIFY, - HTTP_SUBSCRIBE, - HTTP_UNSUBSCRIBE, - HTTP_PATCH, - HTTP_PURGE, - HTTP_MKCALENDAR, - HTTP_LINK, - HTTP_UNLINK, - HTTP_SOURCE, - HTTP_PRI, - HTTP_DESCRIBE, - HTTP_ANNOUNCE, - HTTP_SETUP, - HTTP_PLAY, - HTTP_PAUSE, - HTTP_TEARDOWN, - HTTP_GET_PARAMETER, - HTTP_SET_PARAMETER, - HTTP_REDIRECT, - HTTP_RECORD, - HTTP_FLUSH - - ctypedef llhttp_method llhttp_method_t; - - void llhttp_settings_init(llhttp_settings_t* settings) - void llhttp_init(llhttp_t* parser, llhttp_type type, - const llhttp_settings_t* settings) - - llhttp_errno_t llhttp_execute(llhttp_t* parser, const char* data, size_t len) - - int llhttp_should_keep_alive(const llhttp_t* parser) - - void llhttp_resume_after_upgrade(llhttp_t* parser) - - llhttp_errno_t llhttp_get_errno(const llhttp_t* parser) - const char* llhttp_get_error_reason(const llhttp_t* parser) - const char* llhttp_get_error_pos(const llhttp_t* parser) - - const char* llhttp_method_name(llhttp_method_t method) - - void llhttp_set_lenient_headers(llhttp_t* parser, int enabled) - void llhttp_set_lenient_optional_cr_before_lf(llhttp_t* parser, int enabled) - void llhttp_set_lenient_spaces_after_chunk_size(llhttp_t* parser, int enabled) diff --git a/venv/lib/python3.12/site-packages/aiohttp/_find_header.pxd b/venv/lib/python3.12/site-packages/aiohttp/_find_header.pxd deleted file mode 100644 index 37a6c37..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/_find_header.pxd +++ /dev/null @@ -1,2 +0,0 @@ -cdef extern from "_find_header.h": - int find_header(char *, int) diff --git a/venv/lib/python3.12/site-packages/aiohttp/_headers.pxi b/venv/lib/python3.12/site-packages/aiohttp/_headers.pxi deleted file mode 100644 index 3744721..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/_headers.pxi +++ /dev/null @@ -1,83 +0,0 @@ -# The file is autogenerated from aiohttp/hdrs.py -# Run ./tools/gen.py to update it after the origin changing. - -from . import hdrs -cdef tuple headers = ( - hdrs.ACCEPT, - hdrs.ACCEPT_CHARSET, - hdrs.ACCEPT_ENCODING, - hdrs.ACCEPT_LANGUAGE, - hdrs.ACCEPT_RANGES, - hdrs.ACCESS_CONTROL_ALLOW_CREDENTIALS, - hdrs.ACCESS_CONTROL_ALLOW_HEADERS, - hdrs.ACCESS_CONTROL_ALLOW_METHODS, - hdrs.ACCESS_CONTROL_ALLOW_ORIGIN, - hdrs.ACCESS_CONTROL_EXPOSE_HEADERS, - hdrs.ACCESS_CONTROL_MAX_AGE, - hdrs.ACCESS_CONTROL_REQUEST_HEADERS, - hdrs.ACCESS_CONTROL_REQUEST_METHOD, - hdrs.AGE, - hdrs.ALLOW, - hdrs.AUTHORIZATION, - hdrs.CACHE_CONTROL, - hdrs.CONNECTION, - hdrs.CONTENT_DISPOSITION, - hdrs.CONTENT_ENCODING, - hdrs.CONTENT_LANGUAGE, - hdrs.CONTENT_LENGTH, - hdrs.CONTENT_LOCATION, - hdrs.CONTENT_MD5, - hdrs.CONTENT_RANGE, - hdrs.CONTENT_TRANSFER_ENCODING, - hdrs.CONTENT_TYPE, - hdrs.COOKIE, - hdrs.DATE, - hdrs.DESTINATION, - hdrs.DIGEST, - hdrs.ETAG, - hdrs.EXPECT, - hdrs.EXPIRES, - hdrs.FORWARDED, - hdrs.FROM, - hdrs.HOST, - hdrs.IF_MATCH, - hdrs.IF_MODIFIED_SINCE, - hdrs.IF_NONE_MATCH, - hdrs.IF_RANGE, - hdrs.IF_UNMODIFIED_SINCE, - hdrs.KEEP_ALIVE, - hdrs.LAST_EVENT_ID, - hdrs.LAST_MODIFIED, - hdrs.LINK, - hdrs.LOCATION, - hdrs.MAX_FORWARDS, - hdrs.ORIGIN, - hdrs.PRAGMA, - hdrs.PROXY_AUTHENTICATE, - hdrs.PROXY_AUTHORIZATION, - hdrs.RANGE, - hdrs.REFERER, - hdrs.RETRY_AFTER, - hdrs.SEC_WEBSOCKET_ACCEPT, - hdrs.SEC_WEBSOCKET_EXTENSIONS, - hdrs.SEC_WEBSOCKET_KEY, - hdrs.SEC_WEBSOCKET_KEY1, - hdrs.SEC_WEBSOCKET_PROTOCOL, - hdrs.SEC_WEBSOCKET_VERSION, - hdrs.SERVER, - hdrs.SET_COOKIE, - hdrs.TE, - hdrs.TRAILER, - hdrs.TRANSFER_ENCODING, - hdrs.URI, - hdrs.UPGRADE, - hdrs.USER_AGENT, - hdrs.VARY, - hdrs.VIA, - hdrs.WWW_AUTHENTICATE, - hdrs.WANT_DIGEST, - hdrs.WARNING, - hdrs.X_FORWARDED_FOR, - hdrs.X_FORWARDED_HOST, - hdrs.X_FORWARDED_PROTO, -) diff --git a/venv/lib/python3.12/site-packages/aiohttp/_http_parser.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/aiohttp/_http_parser.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index 54b985d88983c4792e1f8974746dcb84548cb65e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2878000 zcmeFad3+Sb_CDM!!N_6;6pj0cQG?fIfC;c0I(4eLx@XCa3pH$XhEK2O-!Uy-5C3yF7?Zg^ySUUJCWPc(W(wAehx)+lqKl^)tDiNK zF6sF8w$^_gc<7~7+t_*fF@vA{$@Rdx@m&R#i&{_oAhYy} zneV=H=cPx#8GQ48vsYkH>9O;_xpdOD8(#Y5x9N4$u8cl99bSu$y!P4|uwVM#E1{ABa5J9dqR@)2|Ma&iC3DUUa0!+y}Wc|Y%(_|;PneK@k> zDM$T)@GnQtc^mL?cinL60pGjX1CH@N{4U@nEjKkh^3E-nWnMU>_kAC{`RhgZX5Vt@ z*zUhqevq?uW31+q@UaWx`_@{B44F&0&)Y$9%SGY@yLvJQnuj;kD|rFFIDQzUhN; zP(I;^A*Zzs@;<+A?ulEExcls79^j^3lv8!c%90tmP(Jg6#~RKW`ocAva!38#ac6A7 zue(n4iVU#+zXI|C=Lmg!-iF5kZ)Gp%8eL~5OjK6(AA_M4|2bTKtoWLN)_fgIh*tK- zA=Z2WTt=+y?>@>fhUm@%zVcve`|oY|!{HpKh0Yo~dz<)F*|hgJxY$_v-(nND#Wrzx z4=$KiI`eFFM!{rmWk0~i|6H5)-T)UPE1frN_#7Mktv3Ap0oM9^Y~tB&6Ng?laVWHj zLxzpck%O%LnQD`VTW!YIK$|?@Yr}_a^5jsPdVjHr|EV_oS2ldA4Ii=Tmt8jPeb>hS zH8%Dh$aAal`>0L)@j7djhgaCtyV9nASJ{lO6K&$W1Lg*+ddqF<9dDC|zuNF;+vrTU zvHu0~$0}|IY~mBK@&6N>@p!FGzrSgdw;OEyOt)#*?Kb0jnT~FV;^Dj2_Zh|;i_16bBalYRso~v#2@3e{A-);Q7&Zb}1+UVbF)9(iz zW8JQ6Z1N4MK=BQz0LgKvf&rl^kacd z{yc7@bCHez-8SvL(njYAn|>c-V}G-a{(hVBKEj57+J;|f!}qsYZ=7VqUvJ~*BR2he zm`xsDU}OKDP5e)@nKy2;;TPKUd!|i3r`g1(%4VLw+9q$CY{t<=HgUMcroEGG>K$U^ zf3A%`$J@l=Fq{4z0scGTrEk~S=)7s;Pd5ly&7TL`jMJ!1KFqd>!!0)TerV(8;Wl}j z2YwFI8w>buoBq1QCT_3V`1yoQy_;<2hvRM9b(l?_-(eF^1J*x-E!y=0J(n0@_%DYB z!UnRm6%NJq#sH&fuVA1#v^{yG;GGME{e{f8uzif}#Zkk!4LTiloTku$Zl!HG+eg`6 z);pd3F=i$DvjP@BsN-rEmeM{YMexC|1S9M1g2tkKr&h0z{r9u~C$c~5*}j$SA&j&= z3*!-Wf?9mWv7eonCHh$i56{uw;C5ZiIztZ?yr2D-aafkh`U{258E`$oEyC@Ja=T>w zuR2=TyXFded>(|`V^F|){T(6>QvV0mH}D1!HV8XySAmOYA7THGXZ~D{vqSSU#BuA? z;#PNr(D9WB{R>$qnd1}H;xn1;JLd~~8UK4=9HBp6Zm;a$3)%lzsjxqr^&jB;Y1Q)W zap*YI@oD|_J?r~5{W08Mo!nj+hO{*??_+(*AI#X zFZ*jd=TA_}pJTXP2DeMrdj_{FruAj_Mk?naH`f>}^J<=mkMsvz z2Ycwuh_n>@BJRi4H^T)QHrX#fv!6cA&$Tk&*dG`^wB60|baS47EN$65PJ^0G2DhtK zYu6QQU$5D(;5_uQzKs91Y#-6=uVVk5%!_Ck#!k*dzm|t@^0;tlaZ6?1#p6-t&r0rJ z7x(Y^+}=01UN6@R(*kWvI6s>>KjnN<$Ne7RJS=4Uxm>T0^Ge3~8y+v6n*aN_Uz#*O zA7g!&)-NY=o&+`hD`dWviHPN}KUea&XyS1p+x0J=KmA%irgFWlT0Y+|+r@E~?b^Y4 z=+olU$#IJ@FY|LV_j{D%EaQ2+j6<>TU-s8sY~Q5Wr||W(Q=2z_;C2Oh-nf+G@Cp0x z)#j6Y&Ic#wgS_62VjYJTpC#;PjQy13^jy|)u#TL!f06Ml672#r+P>v>wQB83EmvPSI{xYr-{tOh;hw&@x1leB3VJi1yMC;$9IX<0Q zyRPDXacJv}PL5AK$7dwRVYG~=cHK;&=Txv>;`Km2+keB?>n5$fASVz&eKyK1E5QmFT{Jd-YDGce0$|1zR2DIdZUHl`tfa7f zPEmet8N{mW!iw^R@!I7fTQc5~Jcx9Dj^AHYHU}h8Ie#+5ZZQC;d|XK-1)sq9GA`3O z7$pqvxFTp!c_G;6RLskt4t+4EAW$^1Xz`-*ia9`4Ei5VvRKj77ZMBTwxFUZ=QDH%# zq`YiKK}DGe8%7yX+`p;C72wX40BGhzut4X+ih_kj+(}cb{H3xiB3=|2S2VYvsuV59 zEDjV^=J&)Pr)&=Qh&Yl{sRRr%5z;JwEJhUCHlrj^>@Banq^uO%h5q++$+R-rDLq_n z<%OJp7)R#ELTDsifqwJ^i_)nmP*@DslZqCCmqpm8NKY=Rggiksw!mLm^@j%LLfZAz z!5I{9i3|f;#Ys$N%(If&Re^+zh66=@?1D)J;7bv<6I~cvT2z2ZN%=6Td``*Sk|L#D zo`TB6ti^^-Dhd>r&w-Y6yeKW9iy=AV-IqHKD*$J57y8R90#Fr=EvSK;DFO#ZOhN0g zK|th{m(9!1sl**>fRmRL7FJbMkY6Zy$u&h4b4$w?Nl`jM8!8$cTV4hU2y$|~K25TPv?B9V6B+mzChLhPtG!F_{0I!TTT^!4I$pvo&28qa-y{m}jjni$X+q6ZTz&fR#8FzWIFyo3a(CF7i&}n7yfGMLC zLd8w|~Qlp;yN@xVd_ z1Ho5}@eBQd#W*Hmwu8{+RI*#tP?%`~1tnz|IGUGmF!NNFcrEI=M#;n*SAWgt9iL2GP`)~kfz5KB_f3nq#ijqLlw6cnV_$mwoMgyY&RtV#(VX4U8Ru%;y z%=0SqVHq7KsVurk1fDx~O3~F-MP-G!*okMQ?6mm8i<<#U2=FF;6ed7)4&2Bsn^ROR zhgv)bfrI1Jhp@Wh9PRNjzqF{V1lEJRKCe{Vj~^#lwUg6%COQ8 z`CiFAR9IY9wjiJKN>*1~UR63Le?d`^KObU!4R*U&?N(A|1H|MNk->CIAmVF7oag=6 zZyXRvD(omAFbdPkW|vo$!K7ALP%48VgEaxJM_`7_;%Q~z>jF_NBsBIzeqMR`f-1a# z&;$W9KFBKTI!I@n_~J`AxP5>tIE}eWrsP+a`Qb(*Fc(gj)zO%t+mD_(grvFGrJa~h zjQo86;_Cc`V&zp*nZFRGr~HDFa+(tI^Jxbc{Yq-8J`eKLCUYcy6GQch2=y#JEv`4< zHnfkg##j?s0=at+(Y2S-t>RGM^h7$BM+*Ic07v`6i7tEotRRVZnQDtSpyrTR;(1Z!h-p*+P11H!K$Rp z#tLqx0`XBgx3mE6imb%`XqKO0Z)mR*Z=N>!S_QcfCNi8>AQ$EZtb@&M#5wVQ*@u7D z3^}h+bMi;nw>Q!7EK9?MRi*g_bLK#P{g17(2=+)z&3H8bccSN5ioylZzW*#-%d%8S z7%2JHA(1uN^Z`r!S*D2LB%TZ5V<%V!SYnhUlz>HRu3dNG}xUaNl(Lr8_CC_YlG+(A_ zs6NCOM5;km1+3(Gp``L^O_m1io#intMfo;CNMhfLb=e=Qvp6Ph@c!&ne?@tqys+H5 z8PGhn8fmL?a3={*!(@;}efknIei&jcGEZgx%vyAIQ8lc8uru>*vZ2QS*Ugq8vQ+wi zWJybL*}!-U{^V4>hwz449Z87)xMuBP)j^JIVm=^aF?^BMRtO1Q18*Faz)HPfHawY@ z(f8961#X&nBp?q#r{ZH1m{R#+2wMSHRxa*Nm|qep6mLSDMCeB~-1rU13F! zCEl7#QFwcAcGWz%Z<_;gGUoDKEY~RWysW5b4&2<7!)<@bY=3~>0y?9z{0z8gmCP>0 z(%HsEdAVc8=8rfdV`RKI;*3oB_TnG+{6_H~5Bx6~dp-LjJyreDMrZhq|DIF+Usck* zg>QZvz5ajwueXr}pNW9C@o8KAk2~N49DR&2%vBv#0w3AvZA=1;oBaI;`MCx^zyDs% zzY8IG7xO`lmpG#F{hkq@8)?$`8BYm5s_~J>1mCLhZsube?_$1F7r0%K78a_-9$isqtCtzf0qD+1{=3#oR8h#ydG~K8>Hr z_I{0buzgVD^JM;O{1}=48sGAyh+C7!d)5m+s__@GeyhfhVLqnuK_1tg8t-J@xFj+D zLGE9N#z%R)J9Yjc;ipUE-JH*EjrVcAUY+Os^y&P)Lf^0PPUeFe@8-O!*ZA1Kgib`` zBg{8xd^+b&ScG(MH{#HsOaj+;y4Q(4EY z@yV>?)p)0ze>6UJ5655QgLer&sPV~MZ@tFHxV;gLZZ%qZ)5A->UK1GXFKc zi^ox?#;0<<#-)kzFXnm7q4CLV@6`AR$H%4dKIYvTe=g4hUX35gyienuoX>uZH@Lro z8Xw{DSg-M2+^&emKf(1jX?&FPB&zWy>$GaTlk+g9@iF$NQ{$Z+A7gT2{9|{EymDx~ zPp*G7-jLT{jSq6YZjFzyzE|UY%=>hnb^ID{@H`gOd5%N9#>cq7A{rlIohFTUa=lTF zKb`xlRpT2tKVus2X8lf$pUM4bOi7HtpU0O&W85!pjW@VmUX9P< zaq83fCf4_B{9Wu%P~-1lzFy-W;kZRKzE;jZ8lS~FQH{Tq`Bsf@<9Nn2zLEX!)c6SJ ziGe@p0-Icaw(>mb(D)$RJ2gHk^IzlZ*-y8|f5p64<3DHKr}3XL@3-NDHhjIt$5dX4Fc@o(XAdP%+1{t|PUihO&+Q6o ze313)HU3Dpk7#@~+c#-^l=~~H@vB*HQpiPukkyW_iDVKu~jUT}F^%~!g`H03B%lK=2gvVD@rua)uF_+H#Dm&Pw+d$-1SG4IuQA7A%<8sETv z`Zd0d?SmTM$o|)B`~a>uqVWdvO&Z_D*X5|jn{3~z@xO3C#x(v7j!&n?S2J&1mKgsS z>pL{w$?HR>#=p<@E{%`K^^eB?zc5D1hw)bkhkMq{2@yV>?*Z6DL&!EQp znXlJ)562;*@m>79qDkXhSSPCS^OnyhGz>asN6s z-emt>8b6)w-5P%t`{~vAbgtK@@hzOUevN;Hb)3bC`E%LzVjjrSc;9ki=hpbE+1{h^ zj$PvYJg>$F2Z(Rn&(!!OtW&J<_00P;0AaWQ}*= z54gdWs_}mI$EopOT_@t1uJOV5#5c{eG`^K}+!}x6jY7wx@ttpRo@l)LpTa(<@zu;X zXncfmqsII32bW-L*7(*o(eEu9@B3cxZ5kiz5WK1JzGH-bm&UsnaDT`>d0`kq#;F?b zD;4(XI{%xfH?GGz#tj@#&E9oD*voq4d?oXzQL`VwI;|Ri6!TpgFY`_MEA`K0`(kc~ zKVTh)#(V!J>h)>-UbZjR`1-en|BV`-$JfEA z#{2kpnOZd7@Uwq%&-3l=Pl-aR#)r2Eex}Ap_&Vj+c;5%Y&n}G*^7WcseTcCx+3 zx3RvXBGEqbp|Eezcqi+pRwmke`Fhcy@s0*@eQDBo<8z^(6-d(C8qs*y z5u)A}jdxxz>TA>Z;I-_B+>2?@@V+E;QZ+vKj_@;n9@{59E5>iFW*@^J+J&uA;}RO8QL`xcFlvc2qoIlg3`r*mFNK9(Z#&8_h=&pjIN z`%dIZgT^C6T z_y3=J)Lrl%yb%Dq?V`*Z3%5jve@!q$Ey;I}mI7-*})~iJx`gHyl zF^?5%eEp9?KdAA^t9c&QcxSWFk7&H~r%~hOIx4F1vb`-DFV|@?jhFhS#>@4IvCJl( z8ZXyBPK}rP=^8Juziy3}{(CfDUf+EhA74Lce0=?&@p64qtMPJu647|M{%O>Bx&Dc2 zyliia#>;s)rtz}9rpC*8-r(oNGXJH1vc}8&bZWfRPuF;v|89+!O5`(+Li{^_ zaw}GNVJVLI6&`+SIKEXYy!^X?crd8&@Dr5rtybaXcRcW5y~4}irbfO&;qh-8$}OVs z=SULvjSByz!Z#_rTj84(evHCL6@IM3wm6BWKq;rA*QfApoDUdEl}}deXDjv&g+EM*f2zV?t=KyiKA`aF3cp0*T?&7# z!e=S`jSBBp_~i=kQTP=K?^XD}EBs7_e_7#u3V(~j7c2a&3h!6=e=2;n!Z#>@S=r+FIISYEyN>!g_pl+jC{4i%io+w zKB(~WH*%4$Re1T^zsT1sygJV}D7^elb+nHtJp5#Cd}~yA_$l)E)}-+8lhN_5S>fTQ zo8wzl;XjMB@V9>zUj8O99&S~5`P?b9{={Q+)RaspX!ZooeB>>SsdTG z6dryGxMwTq$=jA5)<{yuO$t2Rr0^Fg_RR`^n&M|v;eS%>TNFM=;ae46UAMO>`~XEirtsqw9aG_36~0s9 z$18l7!e6NHMqy9>JC%Bq75*Z{-l6awg-=y@{CnUGn3cpd| z>lJ>o!Z#?qdVd#D_$i8gqry*B_$Gy)rtr-QKTzr4sKOtj@GT18Tj5(3e!8OHrtmWq zKBn-gijJx9GZp(zh5uCHyA*zw!W(mX^8YJ^PgeNL72cunS15d{!e6EEPKEzf;nNlV zY^7Z;g+Ec@vlKpG(Qzw$fx>$fzEI)43O`5TXDa+}3hz^R^}f4U;foY|zrxQ|_-cip zr|?0AFIM^l{Hsls_^`tJ6h2e&r&!@{QtbT-U#IZZ3jbe)4=Vi43SX=6`xL%j;p-K?LE$qLKO+kN zo?_pq@c&TwCWU`h;hPoyHieHW{Az`7QTW>xzE$DxQ1~{5zf<933V)Zvn+kuo!gnhC zj|$(V@bI%=mw$T{54#k8jbfjr z@DC`wTjAF#yhq_5RCuq#|3~3xD*Rw2K0bxtt=JbU{5pmAEBwO>U#;+uD11=ik5KBZ zRrp-2Q{kUe_%4Otpzwbc|BAq05%?ca+zasEg1pbP^ zUlI5#0)Iu|uL%4Vf&cpmc$R;i>>yl$_z=Vf;rWPD5O@9##7VOeI}pbR&q6#HaVz1;h=(AK5}ttgP{d7y#~?loafI+_ z#6uC+6CQ#1aKu5vry@QAv7hiT#HomVgpWdeBw{b&A&8Gc>?YhF@zID~gnJ`C2C7#0KHLh>u6yc>vr0DPkw$7~wsLPe9yCco*Vfh@*sGLwq9QCc>K# zry-6I-hlWd#Px*NBR&~%knlRhry%wdUV}Itv5)Xwh=(Kg622AjsfgW#S0VlzVi)0M zh)+Z8B)kOi>4+VKD-fT7*dRO~F@7|uz4JHff5a}tF~YMDXCQ7RJQ?u_#8JW%5TAv( ziSQW2BN0akk4Bt{xSsF`#AhQ85?3>>;!%jbgohv=jo3}NKjL!{ zy9oD2d>&#a;r%ZH&PMDY`~%|i5gUZ}BEA4|=daZNh~0=|g!drMLEK7s7veF9ql8~W zJQi^i;Z2CgA&wB(QLF_^7BYYR)T*O|&w<4Z^*iCp9 z;)#e|gqI=CL+m8H1o0%q4#E|PFGg$-o{tzmV$$BZpZXuM7jca6EX0>0ZY4Y!@npnN z!V?frLEJ=m4C1MXBZNmIo`$%d@Cd}y5eEsMig*TMKjC4B@go%NKEg*Kz6`OK@DRka z5W5NYM|?SA7vbKBuR!c1y#EEjS0Z*0{sHk-hz-Jf5$7ZB{Dt}-u@7;K@E*hkh+7Ho zLOdIBl<;ea3lTRF-h_A#;t1glh>H-{6JC#aF5)2Jb%^I7_7h%%7%xEWKEih)E>yl$xD2sDcs^o$E5E(7i~1k2A90NEEW}qM zZY4Y!aRuTi;R%Q<5jPPYgE)XVLU=UdD#Z1KMb-#Tyi5k3m> zV#Hp;Ll7@P>?YhF@wJFugnJ{#w~*VNg!exW_;dO}rj@VCl4dPnF zKEih)4k7juz7_E*#BRc?5Qh=F2rol?6JjUfC5Y<~I|x@Gz8SGWcs}A=5O@Ae{g1dF zag6XR#Q#9tN_aBjTMHdwuR$Co{2Jm15H}Itg!tcxBZM~~UW>S%@Os1#A`TK>hxk8; z{e;&bZba-Od>7(}5PJ#Vig+DjH{n%?A4cpVybSRph@FI&Abu3FgK!1n#}FHY=Oca` zap#ZJ|A?Cq#|Y0t`~>1w!jloNM;s+Q0r8WFn+T6V{1oB{;n9enMqE#L1mb592MM2w z_*uk$!ov_ZBlZzK3h{G@y@ZD#-hkLmxIg0O5xWTYM*IR|C*l3@O9I6&B6bk|0r5+S z4Z?d7zl^x^ztsPTqljaK_aNSgxRvlO#G4RD3BQK;6~s-1HzD4PI6`;>;w^~l39m=I z6>*U8I>g%$`w6c>+=AFg_%6h+BK8u#74d6`-Go;mejTxk@G``2Aa)X7g7{6u4#E|P zw<9(P&quriapw=z|A<==#|Y0tyc2ON;mL@1A&wHBfcP!MO@zlFej9Ow@My%l5!VwQ zf%qN7LBgjZeiyNy@G!(}h<${QLi`?LFX17G_aJr??vMC=#4f_U5r2T#Nq9ee|TO^82793i{` z@fV2e39m=|CE_6Ab%?)0>?gbiv5DA6_%6ilh`oewMZ6cWoA4^c9f)0omm&Tdv6Ju; z#NQxx5UxP{EnRb}AmLLH??db-JPdIcVjtn75dVVMOLz$4{fOO!`y>7pv5RnT#J?eS z0?wK033W~LgbqycEN}Mq0=g>I6At1>PT+Y!)!xfJq3^EDxuShDTnjwmI<)Ytcr|dN zC;TFQ{M-}1+OYx8@{D@thWVcGxSgp#2XQj)T{X-T_JUN>Ecm5YPhI9)+mno(9#1;k)4i$VALbkwo8X#f zX&qh);19hSp;ye~(aEK2k?988oY3YK@53XFnXrx@7m8gD?RaI1C-f^k^YD5?Q`20Y zP+nS=Clp9a&kK!9bLRo{m=nGOk-DjAK2Kdr{ZIhF?rCoyfC8B zyU*eAj9trrIdf6}(DvmUlk<9Q?>NX4`rWg9TXJ5wUryN7y*1D$C*+zG>bncv_l$b0 zY9~Bn@m~H)&Wuo3Zm2tFderQjyYV~c_>7-(rsalyN_nPpZqCxLx{uG9Iw`by8hIVs z2abcgQ`4O2hy&eCuN{|`f-Oij*I?sUL{n~`8K3d__>69FryZy2ywF!UDbMaR zAA^j^4Q<8{d^EN$a6w-(33V?0@;6u^o`nBFAXCkiWVemnsiEj?GlxMh(9FE{j_C$z^C`Y3l}d-C{<=zrIRKK5+v7?Sc#URui1&$^*sJsbD-S^ia@oTZ-- z3Mch?3m!;i_JRLB8^7(n{L@}JQRm|>^e-$HI>L^}pxRqIdcV=Qm!o^|<^ zujEY64Q;1>_k`ZbnL2ICI7sGA-%@`D+@5oju7O|whAOKdM4tyg>lJ|R+nX2qIS*vs z|C$n=s~aI(GaRe95vuDr9){Ena6S({a~90%&Fa*Rq!phBhUSF(rgg)h!3i}d)HkgiXL>kq_^U~fDc_mreIv8B>Y$8oXfQxq%uH(2 zmfUbZXpRG#lN;(+l?(}O4xn!PCa?5Z2HP)r0(?5%6GLX-8v1m=+_)Y3~meqb{kzm<+J?vKu8 zoY=?c=#v}zdRAUf20)Krl>BoL*UQ1Gfu7J05DV|?Nk+#IoJD3hA-2So0tZpP9)4C_ zOwRv>n#6{yNr3SxJ z>8ZYfZL5gE7<8iD{ z7}f_f0MEMsiejLo)Zz+}2TRHdT>fH6E`}=GacxiaU5p9Q;mLrm{0L947c*?&AsFYP zS`W;2$!02yhP*J8piY<_10$rjebXk5iUqQBG3ghlc?zdMhQOfx%De-ftU^xIUI7b= z_Sx_sO!DoQz@9S6sCqjOa%^JG?H}rXKXd}dYZpy->b?;&q4mx*tKO?U$>AM4% zbzgeILx;SLeD=golZ=$%ebdZKA;K`q9^MW#>fsN!f!_0Q9-RIgSm%b?LE%wQK;6lt zJM?v!r%5pTmrqy;rwdRjkxKPKX(@OHDOEuZqLQyeC?%68gL2@2aBUIJ{o(8g2x1R7 z$iF9GiUQT6rRr!@btL^4Y*QSkzYtelXM!7!K}Q3T;>esTMF;Joh77$Nh`A|SxAaaK z4$4r=2&e^!?LZ7nGbf5#UVM|IfIou-wY&)@r#P}thMkDQz~69u4EjQd_LH?_e-J~p z(rx7O?~upfa;D&)>9B1Cy4lzresa;HqXGfpV{ z{u+noO_;aAovj#SN9OTycd~^$9|^H;*a>&mf*!cDmE75ftBFw3b5bmb7lClnVpbt{ zMhb-&X_s9l-1)eRqw};-xKS#cFWfl?tYK8vLpO`)JccKP2VEk>{IC=594_1uqq10t zjh13~ZwKy-VHI*`5&%e`GlV-kKA`A$ab`(RIuf%geb6v8fsAs(&`kOfa-tU$26aF| zOf58>{6@DiN$e@tAW*3UO#)-Nfg=0|HGiV~~ss%uG-3SGx zu6j{dg{UiFy+Y0Vf>x-2&?81JQWX5@tS;o9~0oN1FnTWHDn=9Ik9 z>u}+LTefWfHuP#LTp_o92|XN!5?whif!>*$n^LxQt|z6eWn8E^2(5+-CnUs1&o*~D zAOrS(+@}n7J3K4C3G@elUO3%6`D z@l-5iVPO*3`sDh-1Gj|9;XZUypPcZ84idW}tr*R#(HvB3(rTe_(k(D9a<|o_H6RTe z9f?3;c~^4a>>E>;cl8NOT;A2U>QYZ#(y;M;z=3gTu8u|7%fKdZV)imPzbX@sT{BJ| zyBtu<=@Lx>w0EpT7oZC+IMwJF2?_V=y%4^-%ttn0&SsfIAoyZ2K=&-UFe~7S^DFbt z&uAUrLExs(A<}s5Um*dUZD}09l_Z@G*)y=#G8xQNgi!*-48;;Nx^Lkpo)3VTM zx=cD;1$QAy|Na*R_fg@H`834PGUd;MXhC(eINzt!4SLVIHa#!=A9^Md{yRQ0$*H@c z7dkMIAED%ge(&h;6n5vl2nXSI^{YPS`{0ph8-26@9K$6=t?*W_YccArzfmX zb3;E)gBy;_MQ|Z9f0)`AW(#`y(BB*iCqi#`90Bw51{g(fWSiLp-Agy2)gPni)ra>n z;HEL&HGIzqw;VM6WG;pY+`Q>4T$`VCB{~f4f_W|Td#DY^&DC&-D?F$DC5R{-8xQBe zF%R5-PsYQeUJ1MjQA)%7HZtDN_(nVw0oU3GgIjRM1EltySvVN(EimLzO-fBU%8lBR zvVwINa-9coBIJ7=pQv&&3k(AR@q8qu24_e(z3ND)U^E}!HKi{cr`za~4tThhc>)~3 zusj7_Ebh&BvWM+eLV6!w!a|$y-enj(*Z{|Be}{JDhF|1|79U}VLNcsX{n2s*z>X6Z zAK#A8tn)_wlv0DYO6GsX*h*P}ZyiAU!2yFk%L321Q7iC4vN?lBQ>ID5{LW0JfLeQ>^L5qXr39v!-PaEAx41Y^x&;Y!sgbaw!NcDii- zv70)M$ar6LSjQj^O-ElWm?yzm^gsl1Vj@fjx8DhqRTv&L)@6=pmD8QG9qK(jq1QX$ z(L$z!8n7+neRCAuPN%F$fn;wlga7az_q{{$F7rAVd^@0okDaz51HQgY`;X0MaSxL; zKa}LBOmI1s_smPb_P}a5FPwQLJXM;s;^)BdjA-tt-&1OKwDbn;q%RwwW9u@X-9fIJ z`#z$<*Zu??4If08HhBJ+?Szxf=W)^tB|Qb7`k~AWLE45L^bpViciNMmhCA(NKL8u( zo#gm|P*PZ)Fcb5r=A(Gpf8aDszCmP> z6hZI9hAWEq(Mx~m>_4#2zD@ARw!11dqubo`2|0YUkgZzK{w^f*OE@ih>K;j}28qdd z-p0KS&qfoTzkc@|gvv;HW>;R_pbDrhr+FY?xTp;6geS;exWb+dtQW2&L70Ug?9PmC z@yI&#t$8|oRta@`aO5g|DCR0NKFB98gwu>;hoq?WB1s$&P&^fUgOazoNX|AdhSc!{5NQM;?q1)n9>v$YxaD{*|>;NU0V0OVAGd|-RWKspw4fjKR zA^gu{UC29;$3nU+(BcW1EXlZK!6yqIS@6ojOj#(F1-~p*i$YCW5DTz*U^!STid3#w z$_+|6qLdqza+6YSR?1PO+@h3Qm2#U>jwxkRDR(O6E~Shs2Henpocv`OpNGn_{Jj>m zaVmVeQg$h2`8#T8?^bw^QpUxR)Ss!8@!}`>Vx{a?%GF9asFZ7!a=lV+P|6Xd+^CeB zlyb9Djw^TWdjC@Y;Uqsb|~dkrR-G7=}Ot9lyTtU*1j8t z(#w;VxqF$D#JqL*W}dh1{;j+Fp)UhD)G3lEvVJ9gb(X5bqMh z*&zrV-LRV02Kb4O>jRv6>90|q_SYyEvsZ&Ms{X$|%3<-C7ph5{2?ISZbWfU>_N&u8 zum{==J9ELoxW?RP7Q)^W7FT0)Is=?7%v=UIjhN>#!1={IlL1aV<}e00Bbh@P;8bNM zGr&2_{54tBgOi*2Ed!kO%ug8LbZEZK0Ov__8-q3k8yMisYCg&Ur(83_0Ow-!HU>ES z&6NzA5G-cUh@g}KW`dc|08_-A%%C2@cm}lyvKRyr{Eb01g5wzY5e#NfjG!+AAA)@c zi5Sd8u$O@s!G{by2wEAq5xl}63&ArCTnHXwkdELU22KRGFi1tPjDZ6|6@z31#S9Dt zmovbNzj-kOTosr(3~(YbM>2>ZIE4W&FwCPE;L5`s#GnO%!61s@zx_lEnh|`-pb5cy z3>p!#<*spi34a+uvo*k-)5`w2>T_xTMnu>XSa zSLTPf4~r3+7kbxxldv4QADb_t{qpP;@U+TEsks0;4A2ql3E|IGg~h1OgFOyd)q>L%%|X@p8;3vE#|4{(u!|9VPRTzibuRHI|O-{P*BQDVo;5st1rB9 zoa+g5bw=(GB#Yp?=2lETigBb0QeYCo+@ZEvXK8 z20HXX_>2_X=zmPR>^6ALVZQQ~xQ88%Hm^c0{je5j!d=3Fz!B&-e74Sf5B{_it$==q zcYQjXAoovvQd5`t_J8n<@67bqh15rQ{8c#ZzNg@{HS)A=_-0W!d)?DO)*%^6dI_I6 zU@|;R$A+H#jPMVtdl`DffScP_-othzecr^DONHfcU;-^U0AkYePGPx8TFxNLL7$T4 z(6>+%@2KH!ES&ibAhTGUaHl-sWO2eqal-n96Q05o&Jid0;`4T*4RBAlNHrzFDj65&aS@Q_5fuO-3BSRBFwgU{AN zTteA5!H40@84wo?!K3)jRCs7La1gSc6uIotplO~2;|MLnWRX1`&ocK4ZV_^I*+1M* zf@ASeKNh?~2%aef8--vyxM9BCDo!3P1P9?+|75|FNieC`qaau}XhL5~(TCwIc-HdB zqCWKSVj~>!-yq6u!2ft74D7n>LHE(4idXPSMhxh>a|gw3vZ zL|ZS$H^{=7pWqXUaP~0p$?OgHIT+Wo=uq|{$o&LQe~>#~aQi{hybc}}A~yiJx}=p4 zqeSLELFu`}FwgPbh@>D2*CoAoMPK8;YXL{dD(N{8!2Y=#cA@Mi5y3cy2i9gjJN7hw zo+X^=7LNS`D=dK_h85mLhqAF<<`wMNO5%o=pi($t7-cO}m{AmEoa-`B1(%lf zZD_!!Q+1jB*N92}d3@v?N_q^N4Sv>arOC_U1B3%x$dzC31JM{<@1*E$DC)$s>M}Rn zFGS}G(E=eFsPb67=lc9M5?qIZx5Nbl7fP`T7CTai9m8VjLM)}W6dNKw;+V1`9|2r} z=7MPZWB_nS9{LWRwBfDzH|FsNdc&Ri&*EksZ@H7fVPNpd+bVD%{^ZSpd^4<9=^TWxR)#alo5fS;o6wS;pI8S;qThS;iY^S#~MqEH1axr-#EsTN`n*%iIV%x#n82 zQ+{GGrRKQvV6=p@m%!wPA1&N!ww$TF^LGKhKZh$_@u|{-@IC%+^XXS$76@mSfh6AS zPoIKkh|gE!cWvR&0;)9o4O%vAGRMJGffMTO<1O`ygx<-l*H6(~3j-7M4i$RWvEGkw z2)$hsE%k>b0=2kZ*HtyO<*3g)5YZ#7k%Nw5#h8y|kyT*B6lI@4_MQJefTY z@_oX(IhK0&gPui$R#7!WC*tZXoVoeIo+LD=0m8?IdDMW+cmu}Lhf+jJy*l4AR4&ng zt3eV&zth_j`cD^91E#|vXuw7AMi_?v<<~^gq+D&O7mHFr?uQto-cm*H_yFmx#1%z2 zd*2$NSI&BQi!Al(LC>Nq7X#g$IR#TaJm_oi5Naj@SkOBdrz{x%@Qy2uf7ZMD9!tH;h2973 z-*1z8+Pm~V(%UHft6;souy(@sKDNeEZ-CHyf%P6y^j=y^diM*xVXSu->vc3*>OKD= z#qTNByF$_X6+Wd8?Y&dz?Sfk?Z0`itOMl!_Z-LMo$MGAe=w-pTRzYvLh~F~S+rL$` zw+OzYYLPETgPz4K)K^qFC-k+?V`YDs{2zOP zf^iV2;*4=g9-bj4wEN*JtKj^Pm__02E%%CGWV7?zH(Kgl1$q{3x`?V7VH@PQj> zN-wHDdp~|s4f?fWi|B{p@ZD4kz1xJ|Bdj-4(Hpgs^zIa)S;ulY%h>LKYu8D^BWhr3k)kYS94|LbZ}7_Cv{ealO9*zHSN?&J+`Sh#o|2 zGJCP}55t#BE%b(w^M8o>0IDW?AZVH2UC`sze}1Dn`ck%RGe_?29nbeY-ImeW*o4f$g>pWhR< zeE1^=(AaONPvCjEDH@BnB_uaD)lzPSkXwmzC5qf+_^ok}dywTGV>!IzA-PG%S<0O) z?eKxm1>Ouw1f~ zduzC*T!WCi6XmW`5AML@b}I@ zZWYT_upHi9lH4!we=11rCH1;9*GaDc`mgP=lIlOTtx#H25at{l+ zM^Nq-MQ&g=$^Ax;;P^_rxUk@&%T1R|vT)QO>Q%%@{*+PqW+#mc!d^lKXv} zrQ9GPcL>UTe{N4>S6xJMWh{3#%i*0o$(=O8QtqXvD0VNy)!ba8$gRyIxl>r~t1m=j z@gV`pjf4--T69IZkn^M56h*G_Qj&u=9w|{8SPq{*klf#|l9 za=9#rk2XlI|7DhPJD;S+?t&T8e0p?G?B-rha<{VF{?A2Yo2A^&D=p=g3AyDcH&>B6 z!AEivS?*z$Ym#!o*_Lu=3AvFdcZ4Fhc@D|-Ww|R@u2ISzG0#%&^Yzr&FJPK9Ti{(o zd8NOkgydeNN4eX~K`a-Ma(67Sl)GKX;dR_xtjKLzNOIS(+)JN{*fmJG1Lc--7YezH zQ0`Pk?$`>FJCo(gS*~8n~8-D$sNRU`(mQ8UMV-{HcPo1g${nW2Er;O*SF$@9AG zB8xoddUyFlG<@L&R<^%fWrL@a`&j zug_xoJYC40fpUWtx%n@U+%qgUo#oo3+zR*toQ2#+>!`6G!`L)8!DpJ}DgeJW1>Tjj z+(9hYD&1eABghS3iwC)4mUFXQt(5x=j$1UgTE(Qb z*IMg#p>+ppEmpK9?jo&2SnH*CF=X)laMF4S4qAjiS7=Q@t<#_weff8GV_zudfK={Xsu+elUWPC;0PZsalLJ+^@Pw`k6O1YTGxO%#A_C7 z?Rf{=h~KtMscE%VnkSSnFU^UH(&4*FDV3G#Noib~o3!S`L5mh1Ewqk7t#0M*uLp$I z+c$}5jbp7W()!j~YsbGSTCLDq=97xnaqo~{jjYwRTlAufw0v;T!ms5*s|K~^DO!IQ zT2oo;5!Om4t*EuuIYKK7wT@P_J`!5#tmR`ZCuto5-&?fstK$J`T7*VTF`ZbGc}J zXGpZ(+|@hL0G0eYP^TOJYp76jRHvZoGJLDZNI-f39cvd+a@`a(Gf2^ zF@@he$eG5!ujhun7hXPi`MaM=!z&Q%@G=Rz2<)c79v3jM!&MgSa4878PO-x^Iv~7} zfF0iLz|JLhZn5)k~Vt*x@67Al+hz zjRfQqJHOZk#jalLB4XDhc2Tiw6}y<&b&4JSASKo(c22Q_RTb4Ic3!dbiJf2U;1jH9 zQZIH9v1<~$sMxiNT}|&V4@6K zqBmHBc|OY!2?JDk0pE^Ilp&ZXgO(_RHJJPUB^pH}$OtcL(oz#;2qwy)CCXq8W)sU0 z2{OWq8p>)V#12$VltD|B!5YjGmLU>kgctC&U_6h0pOJcsV4@6Kq72qx4r3W2L58Y@ z4mT2I2qwy)CCXq8=KJ@E*boUa!i$=;E*Q9qHv|)9&=O^^26Hvb5D7BEi<&eX|B4L3 zL>aV18LYva#4<#JjPRl+%}kUbm?(pmD1$Ya{aA)bkP%+gq~WBbctbEz1}#wrYcOBF zTf~M)kP%+gq_ri=5KNRoOO(MH%xab)5@duIHEFGhG6WN4&=O^^1~Y?Yhy)qoMNL{u zq71=A8MH(htijxSmuM7`AS1k}NsA`R5KNRoOO(MH%m-M8NRSa;)TA{h$`DMHK}(du z8q6zLhDeYRUeu&DCCU&?ltD|B!5Yk=EJGy72rp{V8WUv*Cd!~C%3uxV_B%yvhy)qo zMNL{HQHEfm3|gWL)?ogfWrzeB;RXDTRiX^RL>aV18LYu{vkZ|SBfO|dt51|6m?(pm zD1$Yazch$O5eYKF3-}p@L>YpKGH8i1ScAEqWrzeB;RSpmJW+;Vq6}K14Ax*SU>PDo zMtD(^R-GtAFi{3AQ3h);(^!T`kP%+gr1=wN2qwy)CCXq8=7;|ju^|#l-|;CpH8VWzZ63um-brwTKOoAVbwcY#fO)1QTV@5@oOkGsH4Pf{gG&{OpP1 zO){z`%Ah66U=8LNmLU>kgcq>B!Si|=MKDnYEl~z*Fn_&GG>S-&p=zN~U2r3$$Pi4F zK}(du8qB9yhDeYRUcmY$QHEfm3|gWL)?hAV86rVOcmeC1L>YpKGH8i1|A)P6fvc*@ z-j|o)tBaL}sYQhiPA{k|7&SpL4~0o(Nm&hLnKMpB6D0q%q%Nel8zW6MG1JSYm%W{) z%&-S&zIv+D!*WV`-xHPeQnHl)x7IrM+y#=H8l5TK{C>)J&f1T)*IwURd+&4Zg?b1d z=rqGO(Tr$;^-bGm__A#?RFayZ9>VMXEVkjBXhyWa`lf9&eA%`cDoM>WQZuzqGkg=x z&`sKUtmNN5>{NI`%a?7Np_0@L^$Not0A2oH9e;hShiw7~iXLS-AiY}*W#q-Lmx@aHu$D87kiL<_8M+BU zNot0A2={fG;hSiNyG1jzAXM7$W!q+`BsD`lgjdfN+we^^BU;EO-c&Oc)N0#is3bK* zJ%mF}Gkg=xh!%9L&oOH-eGg=Ly9THXHBdnf9OpE^H_-sy#2@xZE0G2cqXtTx2KINh z@KmM%UpiSH?%~wtJNVv7beoqpS*i}As*|0n{kiHHY2{R}B>d{1X!LZ6O6ZEt=viT| zRMf6g300aLzTK%*LY2@7zP?#iDr{G2GF2)H|K6!InJS@^yfjNyvf5QDqDqC~!A_+j zs)SDB5LD8*XdJ#%GPtfFct%?b>%Ly;d#5k5cP$hJNZ%&jY~@opW{@*m!je_Up{*~5M}f6b$4a`@$DWo zsmWA0DLmLIoJ@t$IDhh&3e$Jvk+pQ;q&9_}@9dS9@twVB`D4}c+K>!bTFwu}!n5{f zEn>@d$5)6@(WLO>PN}4Pc0IB~elU(c8@Mj~SIBT`ygN>V3xb2Y)1febfUqa4mspk% zo{AFqW<_5x`bPa9@W>mF8(x|!N66=41&4#`S$FcY=!C0B;~V_4k4-A;lN;(XCb*IQ zLPiff8_f-NvE%WZKCv(YRh(DStD5OCZ1nTO9e&prK0|!$#DwSvh8G@zps@gplOO-l z;bK(cT2=%UMnF*nOpbt(2q+gI5jBD-%0)1R%m}6^9Kmx0qDM)1k^A%1{RIlwE4*Cc zl?ty>xKZJ-!p#b|C`^kt`Z3?-7qtUBl4Fy4WuN5=uT*%A!i@@t6>e6zMPWJ|q#w4w z!gPcgxlgB}5uB=Uy22R>XF1sJN-q_6LM8pRd7#z$-{PbByQ4S5CNQ*-?Jl!p*d%tS zRo**C;kgRWQ-?L#FC{)kkL(~$@$ih#)xP!a*<0?aNc zVuuXny;%z9C~PTQsBn?O#R^YWxJ2P{g)0;`43bFV?vmc8cXT^v&}%1c9|jdi*kP!Y zq}(!D;S_~a6;4;!P)XdlQQ0J{aI?ZK3h&SZhgy1Bw{t38Gj{t>$uP(;NLa8yd3e3T z%N1U!@EV1GRt!3IPUj55muM2nQYevNmo&5hM|OJvvk^#=N)iI;5s(o9SrL#E0mTtu z*kstWld&lY?-hH6pRWhe~FbWOhkA*)FNu)txh_ z-Ls_TOze{SAT*m@lG!Ekn#L^coTc4US9Q)N?2;ZnROcf@C1;t}C{{GjlGHM9mpyQ} zc!nn`O+3g@$)S(gC7E4Phad4faJnZdrKE2kDw$o9*(L2{yQB}wJu&F@wC%&7Vp<5% z5uu@yq0&x9rN5SWqEcwT?L#HQAj6=Yj6vi7*g1pRz1T2p9~{~BMN%A78iWR zVjdyk5mMKSI%gA(?7rJu=c5!uC2^rf@+JJx32;~-WApmA*kqS_XZ4vWo~Sf$FGD4V zGUmumXfjKkc$=(*taQm_PgFW@PfewtzQ8lPB(qBrCh`WsiB9#3mCF@gsqh+w8x;;K z+^lem!aMY1=9%YtV$cD-G=t2#&YAi~{H7nXu8Z2CR=MsjwXXZ(5PYn7?H_afEj5uhR&zMWhG#^AFJJ_d9@IYrJNVNk#}Ev>R%~Z~8Giqo^Hr*`3jg<2+I68K0(7 ze;CdrBf}t*jF613Infh?rf-ht^8-plzJ(?k!3riBkuQiH43$8o;U{>aQsyR2r2(*@ zNk%3a83uttn~(Fvp!FLxgG@4Vf^Z{#(~sF1MeVT5?u;HC?TJcveWj_i4-99LkztTY zMo2~_d7c<_PP1l^Nk&crYLpmkl9768VV6xt19Lr5X|K;TmG(8sh&g1Ia}r9(4!bOa z-XG?PL9f}GK_(f&bIdVals;x%hjm@;Z#+@ynvXPilZ*_5z@QZwoinK27pOk+?|9$B1Aa1z zipBTLw*ytCnGZ@x6ymLc6On$=pW2&tNat+Aw=rDsrp`x(O3u_bQe?o7IkJn|VV6C! z%lNe?D((Nep^`(HHR3hq$j1kJ%+f z?Xb)4lDZA>M5XVS8!9=JF}oxQ9p+h**umW;J=@n4mHx3rQ|YHK@XRjBtn0)Bcbe1h z%lmj@&_#ksk=-cA9gB-d#Fp6P_O>KC1JPp_1bUjpPsb zG0%^pcGzXl8J>^zM5U)5HdJybW1b&L=rGTZ#18H*X-4aoR$6c+QCJz3xpq|M>depR zMzY-aU{vO3$VwMKuzjdxj_k~l-A=Zy8}_{?1|2qc`!J}OcxkpsW{X6Au#-{g%N9>m z`rxkZLnV`pOfuTZ7&Pyj&KcD1mG2k-jw8Exgc5UPXa3TJn^Vlk%<(bvbH41HP1qb= zbGyz*hDy$|q>-IT0<3wKBzD+kkL>nZ?}@MkxcRf+5?`%z_M0k+NN+v6DATe1<;;DVlJD#ZY za>!5#79+PY2M%HfbKrnQ-T7-h(P#E7O`jx_iNu8(B?y_fRd>-(#oFm>Jkh7H%FxGT zpR@`^lU+6Y*x$VBi82GO(v<0HGLFeOyDViEt@1>fPp&YOF4Cc9KNu}@p>i5gdyX=-#g8N_6eojrrt$1L$gjY)qr z)G%3Nr_UPpVT(M`Vf;m!4n0h!FqvX!%oKL&v!3W+{lU<|WQUzHJJc2ZvySm>*coX4&X%XH&^&wBLe#Pm=)lF3Y#YJ^{>iwSF`}XnL zz3Dqr%_r~7C-2|}lF@#yp9i;V@Ac%~_2Z0tJ5y;s4JR)Bb6u#|OYZXI(x08EUAh-$ z*FWe^88wmFL}m)i zKa0q0pL>fZH@-ICxUn;3CK~@dqOpD7Up=|*s$;e5?txh}5!ggv3c&xf2yB1;7f-I+ zC(pR9GfgJy{_mo$J^Thw?s|T%cGo>Ib0*T7NK1kCzZz-nn(I8d>w;s9yE;>2qU(P* zy4s)p$&-ur9;#imH)hL3R1;AtpziR9Y9Dv4Cl~!=wsBEsI!qMZ@ln+NXV8;du02Y- zWgpCtiJT^KQsCSnk<;!!)011~9ckRsnF13ncTBXjudDRrice;0SKJG;Vj`r8kQ5-d zTZFW`T;<6X4?WDdqGNUw6}Mkhv}exn{fcK*#p1ps$Czm^Jpm90Jye7*1_$X&D zEc4`M@9(eOY;RcHL^c!ID6n~oZ1%WIJh|EQRO4ojNli5K7R~H$OFX&Oe*0+G>IW;E z2xcM}1+X8CVD@bndUCC${fuilW;9XjhohD~_79%iX=-2XPW@q76RAw3qCnLqQrW)W zdvd4ry^K3KrZds0ZFI7qKHrlIeYmG~p#iX_iAW|QQ9$z9m!0Ryh5o*~aUqz?{H_YY*)z`d@3r~V9alETRfrzo7NaJs@73TG*tqp+oLp~6K97b`qj;Sz<*9c<4( z!;`DL)77|&;}W~lPRhRNbWiT_Y@&9LR9I>OIheI9FO4o3q(?wT1Y|`(P6QN3fE59S z5l|EXlOv!c0?Gwcrd1HY4>5O^K*lu+*D5?m;kgRWQ+R>G^$IUnc%{N?6mC>FtZ=i! zEeikAB8gpIy@NcGBIAebP8jE^%3mafzKc zO4!Gr=q%z>X@`mV&zEA-?Bf7oo?z?tryWl3r0pWtcg zFaAzX{Q7Kb!Pj{MO`Y$ur+a;E#>8}08 zO!qI8-FEe{o~HQmuk;iTG>rb`FxtL9&(jpI{=!W0FNnqVzeaeP*6-HqX+6*|_vg)A z`}-VE)0+0Vnbw~HC?m&mNrRY0A$0P*2$)!?^z) z?UA0QDegTzO}{qG`tLH!KJo}p({x6onWq0To9w@4dYYPscl6X8WEiyL8Dwuc%+u5y z__mpv{{n05iw^ZP9XGAj({Zq2%8p@*-FUF4=}3CZOveslhkfQjo~EE`jh=!-3?sH5 zBkZ>Zd76UQH_Q}lM;6!<(><9z^qMyNp~mz7Gtaj_Jm>Pow8V)Xz;G&QFgc9o=kN3qFu^F_E&p&GE2V(ZI+{UcF(c@y}Ku~#Mkfi zX0ccG@??r{pV6i`dS~Z zeyyjcA#bkJL(cvs&$#_w4^Knx_RAi!{atrY!#v7w5#X;B8FzqPVzLICmz?s8TxabDZ4(=({RF%{cMM0Z|>r0 z2m{*;Vc5@UM(p2s8^SsN)U)tEAA%i7@MQT19@T0e^S`#d{bIZ)wZHzy|6FZ*KX0n$ zw^4QY|H8udrE#9DdfPm0)&Hid_N%d;H2nS%tzpi8(U|t(-ZVV@zpbJD*BDQxYj{|j zE_cV9&h~jzEd9Tvm|f!YWT@JQw4p}qFhkjmt(#lv%cqmjg>O{m+EJOSGe4sn$#Ua^ zQJJ3=R3{|uSbgl%ys2^JgW4=3x3^jB)muDSW77jWLJfPIx8A3>={;{d8Nq&iv!}6d zxnGa{KkVH;+gqo>Hl2?8&xUM&`n{)-?zvq%ol2bs&qym4l8wszz@=U0XF{?&?-SE9 z^%fqhN6BCD`lG%i-tN+Qhlg*64(;2%>vUkx&(#AP{gVb}AJut3=lt}3>^C-bI*hnB z&09Za7w7zkh8|=W{EpYBKz}}_M?+Fj@SK0+DPuWjr)I08!z6iY-L~c162z; z>i)VmRge5JRZm4#JN5@^jOnPeG^(+3W5?EUYrwGI-Gzep{y@PKB2A; zI1yD*AjT~)R~1<3NZ-FRQvDh&JxS^=aixEVNV%_tj{I)O?GxLIx=7V)NOTm5I$5cW z%H$&K=uo%+-!W?Q))I_J-v!=?-}LiK|6Xv?zq7wqL}eG^$IUnc%{N?6mC>FtZ=i!Eeh{Y65YAJEr~Ke%d964 z=M4-_60pg^&c8U&d1>hpkP!h{5s(uB#Svhrl%%FOS>Y6g zQx#5EI78tqg>w|P6fRV_Na13ICo5c{aJj-23eQrwM&Vk8=O{c^;du%#P`F;<R=7+je)t4t*t;_R+UCNRQf*ZsBdax=qxb`mmk)P18 z+`q^B3WA%$Pp;V9T2=3#H5z|eJ3o}@R!XEwt>L$xrAobzzmqBresC_=O+ejng;Vj= zR8TH7?8$p^@0Md@eEGp;786$qs6sA~mn3n%S!6M!bECnpa58sU6hpCpG)S#NpOF8s}o3obGtP2J=~o zQCKi{5C^s4;p?#%37wIagc6tof8~*Qe4HPOb6p~iTw+~#+0$$RAG#|D4*Rxl>yh3q zCGH`Y2y(AWxz|JS*af{_3im;;;g>&;PWIU&sIRSjc7n8YEjmG8RUPz|EhX+JmmI)- ziTh2!X&!8I990P>jO?Ih>r*_A1!UFtM@D_%BBTM-Op=;09n@SRH4mgd?^87c*z2R_ z(kHpkXX#fvj}39n-ru9oP;6^`X>2eS6{@*H@2fkga5^evwuVoB5|nm$F$J4kR4SBS z@;j(BkSeXUFjqH|p9hz)^{>Qs64uYUhtwLDdmAaaDE#CS;s0afNIJ@g+3v**9px)a zvV!ZwYZj8360Vzy^4SS*Er|E|tIm(3!U;=o54o7nIjrj5VN2mcg^Ls}R(P_)B?^}-T%qtRg=-Y9Rd|lVa}}Pa@B)SF6<)6JN`==b+^BF^ z;bw(f6yDy+n>N+%X7c6_I6_@baVB?o4EV}SuCj=J5eEIh!!xLD!I3YREcu5g9I zvlOmTxK`mg3eQz|p27;^E)7(jv0@AC!YX4<~%$Lur3y{mDPj=Q#9fwJx>--yQ0&N^5Ct zEeQ2oiCzjq3IF$(c;7SeMBnORJ#V1Y-t+TY=vVLaZ${YI@G=ca7JZMLO3e?x>2?wi zTZxKT0La?!j^{R`O|1QBEAZNB9j^Oc`6rd>SuFj=sD8_?=YB7he%JjC{a%57Y1L76 z!jFtq2vj$OoSi&7nj5XW2CCvnFf$P=Niiu|;S_~a6;4+;L*Xoia}>4|E>yTk;bMg+ zD_o**xxy6+&r-NX;aY{~C_Go;c?vI3xL)Dq3a?anjlzuzhZSyCxJBU|8nJ@^2CYJa zp98f);hx012!-E4d~qp!X2%rnF^?&HH|imD9P{UB==k$&rtm*&=~wSGa6G*5`JYbV zRWm{1WDt=pZzxP53BebOyRbmUIPBmby5FL(Pq|Z)!pRD!D4eQry22R>XDOVcu%&RJ z!bJ)fD?C}@5{1hZu26WE!ZixlDm+KwxeCuyc!9$83NKf9rNV0zZd5p|aI?ZK3hz(~ zFI~eF{v9)I*m1gG}L1P!ANI_NOR?9|o1#YLbKj@&-S0CU`FPBccs808mPNzwyds3%? zNTK&g!t!-%6*+(&=^8(UDeN!z1k?o%*jsr@Nuk$U5iRvw5Af zj>W@TP|+RilQ_(92m9!`9rpY2{XEz?&=(f&tNQ&c$o>9_!fvSd>>Bj@7aX5N`hDnp z?)SISZ-wqRSNHp`-*?#WMbdAE^n1s((ea)l{q~W5e?|T7qxyaM0`51F7IZkb(*3T$ ziq;+P*CieHyYW6AZ$0W^yn|G~PtW4<-iACuwi^=CN>9EtQq|=k7)5lOfvWQKWP6tV+`%|ZxPNzR*F**85WFo9VO(vo&)2OnH z$wZQociBudbTwz9b%>vc8yUpA2!-!_M8%DhI;QZmcXQmRMQ}pg_+n<1!lNpw#h#NW z;)i zycGVHPQR&BClh^x$cd32t2=%2VKve%ct4_p^!M6bJkn=iA&fLpb=prloi3d|j=U7E zjC9&XMw%j>uDV){G*5T>>a-3!EtXDClurMQ>X8U}^;JC5MCsI`PW_Qi-`T|G?Jk|3 zp*wx$AvMzbujsJTraO70A7F?W=>Sy6F=F+wudn1DZ$xf@Z9m7nhHs@OOJv)9o4Lm~ zd9sInQl*A@rtUFtWrscfpY(W{^!Na(bC2gpj|WJPmDJ-wkscpf&plowJ(lYpn|O8P zq@FV>JM1wLJ%;zk;v$l_XUvrRiBtpcNZ0M%tlPW$8mB$~tdXx`^z>{s&R=yjFg+K0 z99Fnl;TDB` zDnceHoUCw)!l??UE1aQlmcls-TM8E{T%>TZ!jly)QMg>;3WaAWT%&NU!gCa!tMEL9 z7bsk>@N$J$D!fMFMuo!)H!Iwt@D9yN-EitcsU?Xf+(T9Zo0?0&rvK*0%}Kv<(vMhE zK>$C7O;I~!DR0S9*iyJq;Ua~L6`rhciNfUyS13G7;TnZ&6`rH;T!rT;yg=c4g_kS5 zQsFfUH!2)fxLM&Ag?A{Mo@)5fZ2J2JU{em}l8xZ5@(85U3=_zRfUF3}iGbn=up*!^ z0*WGFas-q_fMF9NNxJfi42824&QaJ>xKQCDg^LxQtZ<3K99Fnl;TDB=D4Q;%xLD!I3YREcu5g9IvlOmTxK`mg3eQz|p276w)txrE70?nl(n0Dg#8X452g*ku#bt#}_;QK`ePP;K|cT!B-OnA&{7W2(55 zIUXlF;D?xH4)nwhyVNpo?7f|{35hB9WSy7{l^n`65_j-p5>wO;yKG{L$D7HWC#LAv z4}eymj74H<^98-B;!Y+pi9?yhr1tx}RAQPx=SQ>YmIAPej^Y-O(TIwvBYY&HsQmE-aZ@n$OsS$ zU+2QhyHxTamsut~kvR;Zc2z=6yS@#fn&hj&Dd!}UU-0*mZvA1~vxfgigfg3^B;{|( z3a2QXs&Kl(84719oTIR%aG}CQ3KuIpS>Y0e%N4Frc$UI73fC$;N8z~&&r^7T!u1L- zS9qnuYZPu&IIM89!YvB#&`r}3H9v(%eTITZ=KDk`(nt<63p}yIF3Y2)YkwS%a4^0q z3nZd%$mU>Two6PVvt3e=f0t#`twF^mS=x2>VqRb{*i>uSByqS=$Yj`L*yOXvUfnsH z=>3Po_4^NoN}!N=$5rA8*}-g=@cE1QfF~-wbf~5h#UQiBGan3OE*UCGNU@)s;fYFD z9i*v5hkJ%fhDwG?@B#Oe7Z*gy5j?GR$5cmIhERdi0PUAaEP}NnaQm2%o>j)vPn!%V!Gy!owEstc+>aMiOEpO zBqo!X+9#&r7j;ghc8O_VKP0B^u_iH@9g}*ZWRApfB>u&e&e?>-^!{EtF&QeE#AFgv z`^0q5TlbFm=o_V!Ze84?_C_1lmHX$(`*GnfRLnV`#Ok!%En0lV$ ziAt~c)KoGLm<*K+mD*Ej(OI6T6zZm_Wd4Y)p^~9edn!$x;E75(iJD3#D;X*oDz&H5 z!9|{^^i7SJJlA)5JQhO@>koY#3V`CygStH-J$-u zpwgAkSvX9XaAxiqxo75{mHXSpR`swC8{>R-^X{8l^MkM2S51obg(u=7d=~w88vQp8 z|M~aL@u6(~H#p*}P8dPIvRg`fTcLz|UIDJEFYVge=-;;jUg%rw{6_h{Tz>HG^lQ)- zE7)u`d_LT2Xo<68mRhT}ljZ!`< z_+e=eG<*0{alY^&snBh5YisM$ga(w0IWtl(^4p#U;iNrQad_MpD z#6UQA=+RUASk=AHZ;Zu_dTV0*RaVSO8iQ{Esi{;JhjGX%E8 z`zu!fKpM}2e1FxGEJ*NI&J#fb3r6{?=zAaoTe{TsgE{wIqBdxpxkJaYA43j1e&mI|fE`74*;YG{$aYH?;{oP$`s*r@V_{;J-r z3WnB0bd0Ombe_L*IGbVWem-BtrcwUN3|v-h!iY{e#u@6+!?>;ZXj>=wt5#q*fh`zs zJ&kMrcz3+>SkT2^d9Mh%upv(NSKY*d#5#1uhG4&AJIp+gniw53^df)dNFLXyRGy5= z!89)P_GpGPt|Ff5@oHRS%W^SYr9)||xT`T`8JM9uOlNz0@4@|ykBJUstiSR%J>dPA zluDGRPT+s*2l9|qxns-z4fiR1qhdzvA^xf=$k|1vbHUMZf$$ibz{AiK9CgjQ_Kun( z?FP1LcT`y=yCty(1Bi_{%@ka759f$LMusUoi3RY#e1M7>@zACxYlE4Hm*!n+r6lE1PE0D>eIoa(Py%Yv@{%GDz18c}o+ z3%b>z2evlb?{@Mi$FC3d&z#kb&2rvWX32BxJ(bJrd4cwmxn)rHx6-B920lKP1@Piy z0V-z1!36PWfLZw+hZ={K$NH-d;IgpI-qMKJ1}yK!0@!ATuv}~dPy1psnE;4CH|rWHPwxcmgldkW~o+9#CJyftNO42zSC0#ZtU9p zJ&hSw`WgU=ij_|ASAD>OE_HB|)&-!T&p&DrB7J1u?nUTC@wR%+<2ummUTG}0ViUsh zQ~gnN_7(WQViV%>LkutvHU}&y`v}K29c?ky=W<)nc!IPg8lUE`I-Uj4cmzPjj0E_= zQS1Yl(L=aPjrGG=6x*M2VQL zN33N5#XkVoBQUTCyVoZ#G_St=9Sy1^HE-N;{ zCnj=Rn2J}Opc`!qq3k|x3-d8Y+LD+88`rP^vocczGAl5^R2E=XE);>x3Y0#J1(=mn z04ioAf$V?5GJqLcE$aa{A05tRF&~4Z5t$EY+m{6(W3mV&=8p7N`B(rZZrsR&7AArW zALBZ(1x$QL1j0mw@0VEsCZIOUmt@ibfC^uc@+|8O-Fnq7$KD)TO` z*LL1FZ{T^aqd!(jOH{1K*-yVBf+D_i1V0Hb$A}+C+i|VsGSm)T!x2$A7ryR!g9?kWOt98A%--;fR9IL!cPN*o7$G_nAW^M(k-abVMB zEP&$-mCnU+;872=0FHCF)DXwP0B>Xg9OqgQh~uD-=`4WbTp|K-9H={y1<7@z+xW+C ziGnj?z=Qkubc}xo0JK)~3aSm{+Te44X;xMOaP1x}0CnR;AX5OUef2e20aNe^fI9`4 z$G2F3DR@B~$c?29EWi{jkQy#)=du7(aJvX(3P7LPEWi|8EdrOjm$Cp;aDfQi_0pLv zz!cP{(ZIW7;5kquum#3HT4G+0K=|09zxL0(9q|%N@Kvw3<%+w$UqDNl#nBDwe|pWN zdipCimaM=K`yRqI$I-h)Aa=(*-@tF}(1E71Cm+!CuPVt%ugqLV)2@Bv9Pl-UB z0#p1T3*Z!AO6C=(fInZ)0yxDrQp0tM%UIC04&|LeR028U7|ZcZJ2yJFxCWeixHKh3 z#@g^O7R1+$a+?x+)bT2IINjw{Yz2@6ML(7xZS4&fhre(paUB4p(mrC#D=dJWmWn{^ zgu%^c0qpb;fGk1oM%Lsd$SnY9L@b2Xui>(=P=dA)sCh99V4=wXs38_YfGT1EXfsv> zLK`^Ma29|zM~T2)f*i;K&}M)LByypTo-6=)DrFTQkqaBcubXMiJ?n64;`k@~W1J|j zf(!In&Shc$X8~OMz#kuB0qk>+2weO8g#`(9NEpr>=ZO8U$0`N+jt^z}^#Y##TWCOs zGCgrc>z1!l$&To(LR?xc3ZcrdNRLPA9ucC`q(^^cKM}Yao9--t=f;Xa<^{@sxt=VL zSeNhU$eoVghr$kRG{5aldSGnL02s776TzfD&XwT+4+20c-NE3uumIg%F9PWff&dHP z2A7FIh=Oyb-?IR2kaP%lByNBqoyY>Xfh9HE=$XZWZgn`dk-2l$g)rI#@o!}`Z0VD@ zJciQxIVeL6^E=u5GYdUA&cVfC&$BN%VZDG$Gu5tvH&(XT?AqSSok;=BuY#hNh%?xvGRZ0D(FL{eq0J&}f!zIz_taiYBUA zfKDq#Aa;O_OIZLrOc8-}3WiT$0qk&+2*eI>k`XL`FWjkDfaqfo3*ZZ>Qo|)sG7I1f zi6RhR02enl(TEX8KL^0Hxm$;KSkS!=S*UH?`qfr>10B!f(iru<(u`~Bn^+KE2bYN& zF1!_e5JxVEG;ywO0;3%#P53L17l9ZKoep6E40pH)#Bi|a{w#pu`ij7fJY88pkw=pV zrf&X(%#c)fsH0}&yc)b1xs|dgU(e++-X{QDZ$}8bmj&^42w>6i)(FWJVc;m2N17L_*K=NH0X*j=5s2qto&7Wm;5mIG8{shO1r~r^ zi=>9w2p;+<3t*%BMBql+zp?-}su6)}qY4(lMpH%Lu2Rlt0c`Z990ZAt;BhCgpl6-m zu@OBd<0$k1Hm7av1XHJS>9{&LN7SOXZdDSr+wd`&0T%rX!1ZJ_@iq%!(N{$fU$Lpg zU%4Mz^v}-gPW#|OL{?l@Y=SqZAQrNR?k3CDgs9s=dL6d~Th9Whn9&7`iu&ED0<8Q5 z0QwaxL!tAyEUbKn^ea}zOct;JRvsw=u`*0^1Pfs0ze!>eE5lp%W&y0+OKOOfG50Yn zfR$T5;z5g*(MK59eEhLa1hR|8BJmX#U>Ca-pkl^u7(qIE3v9vubzkmww4a`6W%_6S z3$X>evGpt3?#B3h0r4bpt6+fUOSpN=!uis#_%#$7&jQTC2_g``#>V9s79`Yx_Rb8W z_R$CrvS!QeLCT?C768nv)@-O8Bb71!4|)7T3QT$!*G!6aA`nuH!1!5!=~^lRnJ!H2 zd=_B3_7m@Nr|VW0V7hLQ8Zup&;7S%?x~7RhrVFui3JWk@=ZL@!94D~=)0Hm*nJ!Fl zHVbg*Fb77hn9&on@({Kbfi0M*yLgW=dN-Pt!Ty;u;(1o~+iF&Lp9DksvHEUnD42iE z2V@UKk5>R7b#wExEPzMP7l9ZG7QBZAFx0I86*Cf{(m%jij;(V6(1@65jKAtKE(;UA zDF+#1A_SDPSpX9i0icHK(H09}qTwPC6Tzs5u>dAIPy}Kk1jarr=vjxeF!mFP8yN2a zqKtA3P$~SrGv0Lo?s%c2Fj0yxGEB9KudzE-jTqh2Q) zF&Q;7$`lr0)aOVIH(H*=0*pFe1g>LbvjC&c5P^&u86}kkaE!eG#4*l8Z|oRnNVjqh z1rPrEJsLB3+ysCz%Q+MjUCRO-V6GN{9ALsqi&%h12~UbZ9wlHF?qdNSCCm|lJW7C9 z)UaR=S-E1-#w%C%e1?gdD5*W3&NFZ3W5)v$kkWCUS&b`tNWTZ4d%+oF#a&d4#gGr- zE-*uB(zlz>_GAHOsJjSchG6gS-lc(KhQ0)F{SpIzj|JqHB9IxvFjlYtGc+A1POe{~ z^LZ@54BZPLhgGN0AwC^e6-Zf`8`!&&%VKV(0iY3yvFLUR3qaj-L?AN+d!NJt%+O}Z z6*5DxcQy+!Lm5&-W(bO=vY=NTGB|sEWIYGJ-*>Bk2*NctI)48#0CaMB{ss$R)t5ye zR>kJx85Y2*kBdO8imvZwK~f!#$+>Ge?7~y9#q^K&r+lko(^Q-vVo|cVhE{X`LMW4> zlWO>tfOph&IX3g_)b$_n$_G-ITmE<0V>v z+Bi4({v6KR>*=8X`Hz8= zpR)WJoiDD~bfLd;E;15~Qwb@)D6$nl>b#QICsXl2y{#Td09o8BX7w-tSu2mnGawGx zCjhup2_NmjWigd;01&tY`3hR_Qsff=2xKZT%C}emf@I60MnV|oxPb*A$O5S$1c7hQ zWdR6sy9nICJ(~sH>nvyZ(Q}GDXhqe=zUZKsi(_2lr5&*^RxYDi0Q(*z0ylFX$^wjT zpa^7isL`7RiFJeBo?#x$>-Efo(Q))r&=oPzVfNi9LFZ2;xT1%Ww{zZt5*NruSEUN5 z`1IQjWgY`??F_cw#R6z@vj{{Jv=?FlD03Bnq((n48)4xt+{NgmKsaw`#?(Eqej2-| z?fOaBQvn@)-_L&b;KM+YXcg_ZhPac%jxqy9GluKF0)hb(~l z{}zF3$QN0VSeFA0=z$Tpy;+=0wT-a!cP@!Z`l~b{lLQL{SN>R#+EN}R3#w{a4wgJ@ooozRYfN#JDUa2>1q*(PFSB@%7Uai zY1qV}7z=T>`HoZS^fni#2@fQ62bCj6DZ7J&>4+V9N*46Bz2WLQu$h6SK$%Uk4$ z-LObI2VL@e3#Uonvc`bXUPBSiV=n?=NbVZrDHims!+Qo|8}|i34nG%nWS?26lUdIz z?8^aVEA%CHx*UIO-tvydOM@ea9>yftt$u3~h-Y(5zaHFP?0CA9U?PcTyZ)y4IZ9+d z?!M0f`_{ebnC2eGP#m`~^Qv3`NNQ#GlT*LyT_(>v=6py@dDhrU} zKb8H3q491<68&_`f8%m!`8sJpT1HI1k_G;{<8%YdgnMoS zD0f<(hVcmu>gFVB?3u{$gt%sfOlOa0(WKqTNYsTc&Z58)#I_aCI_2a9M#AIE_qc~0yl{*ShY&JZm0uw!u1u$uU5y&WL{lfx`B2EM{3PiZCUZZhi6iX$U$tckITP(mR zRsp!o!0;My?T#WZ$C-qEWTEe>kLX^@EkOO*(t@ZD%gtZ`)W1{&qCQ-H5(}XInIaJN zv9ub)0;r!S0#P3(J(2}b|8KH85cNUReh`qByRobI97F#UfA6dgzcz;h1{}?Hr6u;s zczMM?dl>%5bG*t?^c&A;v+o#-hX|x)Oyc+dqAp?3uK>`cYtZ*u(6bH?grZ%Z zAjWmOghMUla_I6=0A$g@h`lI96sqb6umBmu2Yy0fU%T4S>+(qLQUG)>3d6I{WdRhP zAOcYso_#zEpzsJ0h{90ha2CJ=28qB;H+@+E2cFKGYbUg$a~}&3+BdG|&Lw`rC?DfG zuqC+;t{ffv=~CMrJ2>+!m&4fSO9P@k-1Ht6K>J%oAlhSwt62c;D@7pMV_2mufc8^F zAljp;2`qs2uglSt1QB#Tf(6h%TWYw`e-H~0{ZmCC(H}LES%74jC<6E8$BnCKyu0K1 z4*+JtefjYn7C0vsm_6rN8|LyiIF=wsr-QXad6kmBVCz*1T$4Av|H<#6|A$v^zK4R5 zw&+3CwX|0ucX2W}eE)FP6*eCvgAkizn)|WdyTxRQr0HpiLB$GGOj zz&j#v1NX};fX$Pnf3Z0N*5fRI%^w7)n30UNir0zg~4 zgav!x{8t2f@BaC;NABx)39OluK+M?*XHlDV9(O& zxar#aWxfe}FOkw>Z)_wVXF;F3A*3vC3;m_zP}9{KDe5{d1FdICWziZbp_~Q1N(WTT z=#^Qv2bfs4+k)Sqr8ZVuklp@{%ZSbcM4^o@@z_NnSnFe4v+KSi z0@rn4W&zB&L9fbu6wo! z#C74JC$a#pYl%Qy7ky;0Af+xVYJ99rr9XE9K%-~Q8NuGP1TYf$cVZV_?q zMCnT68UkJ}3lP_`L?CeuI;67zacy4_xS7z;0_2h|B9OQSn{Rl53;-_~8u1eP&=+j} zHVcyLu&r_Y8cKF=rzFZf&gG!wg8;CgD2eEC3k#s+^&)VU46p!7UM2!j6061EvtYM6 zJj{u9IfpJ(yhoQKxE#97mImA|2eANMriwti#0ox{1?VzS1kxoex$$`#KJ4;20J;&o zK>K%C;4e+ZO^Nm3@e00~T!+=ZDA*bOwmJJ-;E!+1N-jAP;?T*t+zBGt1W`#`@lT=Lr1-9DYRvw(%N_PN13)1$HR59<3t;Lu04iqe4m0>rozuleaY!*T8hMP%!pILu zBVuH@(9JA>kzbM;Vr1CiDi-vq!-=-z=TPr)+B3`_@2ZE?ayplTC!8oPi+T{`vH?;CM5>I^nEP#?-04iqei2>#Cb_D7j%{`CqO~+0L`)BsYCC*>{k94xA zBQJSbY}zL>$;i-mFC&}6U2XxufFxEU>|e_QEHeTkaF-dEumEoHdl86RpvLJefLoj> z0&xojfLvVD&aNNt?CNR%31v=frwlBe!Yx1i`v zEdo&n9`_Oppv-e35M|(TkFfwg>P)lvC`fiQ1f*qu-s>-sy*?>ANBqIH8Wg>V8-b#e zq;*jg-gPPqpy(J8h@$9r7z?22ks=U9(Nr1>plCl4h@zO8?kwoXA!izA^^N5jRgZRei01d&;V0*XTd)H%2*NX!vfIh%jd`j`}!+w0E}Z_ z7GMV7WI?I~6Ks3jl)hCKr&#XzpUYsxky>s544y453xlzWn85-t_)-zL44%XSF!)Rn z2!o-^7#4uRc_NT717jb_0w>H=%;*hjKMPfv67wUTMoAssoy27^W37wZ&e(cfGao(@ zfy@|;_BsnNV=sw7W(@xKGz<1FJqZSr*@7-}`6g!Tb}22h1y`BP0?gLcB9Pg_ur6i6 zfI6He{-FQi5#a@Rv-(?pP6Dr*Bcsx(uR;WBFw3ih;Ca@@`G&Z=G70OAsf-(H{5us$c zne0AqE(nb-Y~NW_qe(T87jIjha9{Pd^_@&z`*qiN@5l-zT#R~6;YrcnX#5p3ru)je zL3#kB_1jaJsr3VC0jvm!7;QIcrInJ8YA?{q0)Ov<4I_opNDVV?xSna zE;VTdrAk-VgwiP2JH-lqV+CJ7*$RHgDuqTT7lf>&P)>57(I04uFFkceTA(GyU-?fc z9cYQe3XHXX4%)A`g3se?N?PBg_w!nk%BEOVE0EbBF9;o*oKMxN(%@KD=+YGG5;dIS zIdC-;UFQ_d+%N`1`nMGtnT*e?R^5Xy3W6O%35SL7ts~WgXY!4#%=++cZ++j|v^UK& zq)%SM(py9tj$MWEqL#Xp8@@p2CU#K1;HL^R&X5b{rrpHw-$tO6)J^os_Olf z#aLc64U+d<+7!KgtD*;>sH5fx>bH9EsjjwHl0G3)b0enIER_$%sg03Hi z{hUT0yF1orx8kPjuhk>q9jnQxKFdF9rB!__l->Z?Y|nX(W_Wax6{@HqF>L65KZ|_; zOoets3A--_y~gDSTdcs0)M6`i(_ECz@!zl%L%+Qtr}AYyg25zhT;z*Q_Th;za3CCm zRqS>1;t)KR1`}2;!oX?^LU%1H$Fe)KKEE1XRSBBT$bBflL0g42cH{L^?|=Cf&A-M$G<`e@6IAW8GPI$alXveDBW6ikO+$((@u$n3=fJGa^@*nfTI^BUhN2gwo?8SD2YDrMZzS%uHfwR$x&Q zTeZzxRFH~vyOXJi%mSC+);t_S^Kged52wxKd06yN2lL>*j{tsI+lsd*qX0tocOZUv z&Z{t4a3q(H2HOcbd?O!8{`sN!9c`~X#j0v8-8a0qw8~klO{*NgL8;$eO;beq;*(%< z(?=>Cy+^!GwVT<9G`vX%N$=wM}+Fcs`~P-7WrW?v9!C&cXs#Z+w_+^?quYd zq=L}B6tX~%(gC@l_%vFq#ODU%(-6TCS{f%X8#&LZ3SUZ29^yhx6>P_X z(7^qwXdM!tW?uw9iNxOpz^zTsz-cPcqK_l#_f~Kt1_8Sv79;j0lVC%|1Nc9_^en8G zCTDJFErit|vVskyZU*M*>`LP2d&n7&Aj(Uoc@g6MkViO2`H0 zy~r1iTS26+@E8mP&9CA_pSi-S9*3r?OVd)qBPkt*3eu88F|Y&P7{xe(F?K0_sp+pd z1(S~z!e%n33?ZiU2q^nt0OSa+dIr&jPBad2H9j8hm>aCOg5gnB^<}A?YI&X#uB0l} zgYS2XHm@cXM)}|y-NZLW`AT=otVf+Fzk=(-VYp;weN&jmmwQU?xKkV#IlttG{e!<9 zjn;R88I#F7N{hn{lwpEP$lPxhgr-am&qKO}O@f~k1V4w{gndiD$M>f#*-E8;W2!zY zy{8~Fk@_n;pddJY?r};`8+EBth0e>Wck5SNS!C+ zssQCvP@Y<|N3=CIwddM9uzaSbbFP6RSziq!) z8#=Jxvvjk%cj3Kazw~X{uj#qA_FIclQ2iw`e7? zwG;bYfQgT|mg9dB*NXaIkrYZ-o}BLZU$hV%DWjzfRVZVtLWfGBELDgeSG9HbzETL= zB9}NhTNR3zLdeZ-A#1Bb>v0D?J}so{+oIPG(Dgr~ z*EiGk^5}JluHTMcPowKEqt{dDIx))6n~|@{zwFH}KbI3^e!fZw{JeUJ_}6o|?u?(m zcl_%d5WiFZdPt^e+wrYd3UPep5P?7Rf-ht_5*cpze_QK;43h~A5J@p{%srzu`|L`&P)W7^)JeBr) z^p%}Cl%d+j{Uhq(r?=LG55jLdKk85Y==!Yab$7bHBzpbbv$&oWy>6oGTcg)&>H5*= z^$T>pEPB0=uKyjqet@pOh+eOi&{q|V`Y-;xx#Pd|eR<@+OX2hsAJ6T;f3X(gwH=m4 zZjL!B9)SV%Zo_7l)>tXD#==62&Tmeq1)8jKP=gl9qbP`^gztEo9X>T&%YfHGC_!sv zDnTbRA!-We5Xs@^p5nsWc2_)B>O5xtO$u$>U8|(fwmq>#3T@jHCrBaoM8{nto)~r4 zW4X}Nyf8s*-Pc-HMVNkM;TtV_kQA*UkyDf~{j@KdEJbTcge?gbbWL5dLdoU zi(WrK*Dpk`Z>H;yqSqn1j)}&HX>{E`dOd}%kB(kXpzD*O*T>WK1<~svbgkmoL3Dj* zRNjxSpNU={zgY6=)88TV(9)qgp_U-$)47BYSB`o{;t@;8h={q-{pPE5NXsX*p&6+( zBRz3q+xi-1>1v*nX&g4X76d<{yJgd?&@@hI?w#M^4hIDH&UoC(p|;#Rqi~1gfqMu0 zz-df=_s)K}Q-rew)ax?=-C-AqjTpWY+TG95*H-HVJDogg{gb&*NB^>m(Oz5Ke~UY9 zbsvK}ZFL`lJ8g9zggb3@$773Wg`#N>t!Zcaaok1bUD(5RYQYO03WfJPXIN$qv*hozf@l09iDZRPUD9|SFw4I;X}K? z(xj#pk@L>J7sugPcx8U57akS`uH~mN=h82J_A(9YO&ABQ%DOf1f62bmAWHt3izKWq zL2ar!_!hU$Xw+$XUfQqj*^2v3ues0ZP#>>sVT06Ehx1gNPSFtQ)XX_9!*_eJrZ@%; zwD>PQ0VjTSV3f~l2*(B9jk5+lZ}}g=@oCGJ(sS@Xo^RAb8eUw71>eM#xxweG?3Ja1 zA!#i;Cwwd2#Q|1P?o;TowP`@0F-}?=v?w$>gvloQ)qO5IghgRYPY*Zvdv zlOMC;;;bgRNllhLW80`6p8g~oNWNhlz4W+<2XkhK=RdspG1R7hBKF|(L{6VPYl#J+ z;$(U#Q~3gvE(l$Si_h?W1dV`SRe=^W3I=^rko}(j+IqSh$ciZg<9bh|j7>|2#JE zQDRQk>r%wQ^+psa%iB@RHm|)mBy!CzfMf_77UEj)@Si=A)lY7riT(v!NaJs zldI~l7%R_`ZoGjWLQV3ouMZ|d0#4QgVXGfbN#*I)9@dTy2Ck- z$fKha^dJvq==u9hdK88Oarxfi-0``m<_9;>w8+9>GadF$#%lr@cm|9&U(sxcFM!goJJP}zmy@^z>FMJ|D zxRmc+fGq=_TowdBv2X_-_C3CG075y?m1Al;%q<;DT^0nJqy53m@cV+$71;OTd3M$6 zvLRAt6WYmK5iOXj*F&Q+H#9wld82b--#@^ydnK=0p%HjCfG3_roF|T}9-38vt0b%8 z(#_^=R-1kL0iZ3KlNlhdir3u^Qfs zM}J@C`Y+1sl0q|+04J_b##5a#9E9U3aO0NT4a;ImyXA+*EltS}j#~mJnVyzH{U?Y2 zfH**%A+Ohyeo6jHvhDHJd7FKiYjdB0RblVxX{lE59eKb}U658-5d6xj#sg8>5nBbp zKhQJN4HkamvFS^Ax{!~DHgFmXwV^1Ut2T{_#8>oHh=&hJ)&YN`Oc(WUJi90g^^&Jh zy?DEPTrh7Vw#!iNxL}Xw{J_$fg5bA2m7miS<`Wk%cOELhXi{kmczXLzK?urN_zx*~ zEnZ*4Sm>z;o-u9WrvmG9TUU~EgwCMtcwF=x9Ut?b4Sh&}Ia+(gg$1E=(~>hkYuZiX zXkbZpDP5-92x0Pej!gRUJuOixAm( z<0F0se<^+lcj(B1oM-XFXmT;dh$n&Ua}lUA>nGKyNyOPhe)h7m&+J1eQ2rC8;C%Lx zQXep!OzoxN8Y;Z{I}Qp%ua=;&1Pa?5QIBZ(HTD~zCBIovTR}#sT3dQ59w4rRvf=w5 zWHTQ@&#tinSl{|DJm(IN1Ig%Vjh`OgNkXEUzVHhO1}H#ozR#%44`enRGI zl(tX7+(E04CbL#IiBZCbkr^LW$N!URD1PLgGA6hr@|Y-^iSho{%cN{5Hb020@s$;P zEkF2Te(-hlUAAXaKHD`P&+OniNu(nh)r0%F6a6Nllss0v4f8kXo&1I^ zabto<@}tja6mkCU3z`|k%`AemJmRicZlr{O48ZNEN;R4F_9(c9n|~zGetil}C}+T7 zm)!>&SGD>pbHRmB&xyFKz8HDA8Gm|b*5$;HiA%A5h#&HY#3cXh=P*nN{&X$`nX8++ zU6EaVa!g+KqRW4k7pxz&GPt;*Y2TQ|tG8r&tp=1fRDWK8m+uwm9+O zEB{4Ztci>0$!*~CWaSzo8L&;_E&}7PB~Z489Ob zn9kk!`RFOHdU8(w#BZpxa0;m6JXT%?1w%c@qM#K_D8w()HZOQcF2R_33}F_GWz&;B ziQ~`u;^E|dXgVI`|!uaJYOfVt(}$gmgR`9hpi4!NCsR`UAk*V0aM$@#oHaiN{#v zhDIS3uR|*4MbF6eg5U*{TTjOQX?RbA8c4T-D6)+H$P$H)*3!K2h6l*Pyfg&qauCGJ zdE=O3Ez3#fVr?IPm`4+83lu*tmulYE0_z6clc%iPo>$PNcati$o{Ic_kZc7!}L(XLwKO1_ZNd_MfVri(Zi<5{vv%F`-{fE%l={k zl=z|j1(pMdEF1o>2mW~7lN?$6))!c;mrue1*z%8EX=T5D`Ee*w)|*zu$@Hdk3oSD9 z_)S`TjA(4CHR#I?4XI^A(NsRDt>0z4PX0A5eoMD*JtGh-lvIgvHt;?)&3@}AHtbP)wK1XbX>Iuib?15fvDkN z6WU&9ABCc71zdprF5czM4}LMGYPJ7Q&ttII$nPG_UkE4p*^5f|8k3#ZkW$vn6Qka@ z%5>rm_6^@64Ucd_Mn&nR8?K@k*m6oQC_we)`Jq`w&gOlhG6At^&nq zONsr@($eA9ka5&c(_bW>;nM~(@1Y7hR|d!M&3Lp#f%TiLA-z91GY-dTlW0)RdU_f3 z-Gpy2#4WsAXk~B2H`<`4tX42zpP+`7JvzyM!y+sDSo~_JTe-@q@%)AM>h)}!

    BT(W0b9WeHaH+hx$M9y?4Q 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%0A8~+ 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

    J3lW%&8Y=G;eh!=EW;TS)V$6!Qp7lej!Oz(tc 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

    6<<2lZH?7aE++1=A<1;S8 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

    e~m)E{1S9uE*YP111KOelCI6I40TAKG-i~H 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 z%0D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 z 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 z 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 U}C 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 diff --git a/venv/lib/python3.12/site-packages/aiohttp/_websocket/reader_c.pxd b/venv/lib/python3.12/site-packages/aiohttp/_websocket/reader_c.pxd deleted file mode 100644 index a7620d8..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/_websocket/reader_c.pxd +++ /dev/null @@ -1,110 +0,0 @@ -import cython - -from .mask cimport _websocket_mask_cython as websocket_mask - - -cdef unsigned int READ_HEADER -cdef unsigned int READ_PAYLOAD_LENGTH -cdef unsigned int READ_PAYLOAD_MASK -cdef unsigned int READ_PAYLOAD - -cdef int OP_CODE_NOT_SET -cdef int OP_CODE_CONTINUATION -cdef int OP_CODE_TEXT -cdef int OP_CODE_BINARY -cdef int OP_CODE_CLOSE -cdef int OP_CODE_PING -cdef int OP_CODE_PONG - -cdef int COMPRESSED_NOT_SET -cdef int COMPRESSED_FALSE -cdef int COMPRESSED_TRUE - -cdef object UNPACK_LEN3 -cdef object UNPACK_CLOSE_CODE -cdef object TUPLE_NEW - -cdef object WSMsgType -cdef object WSMessage - -cdef object WS_MSG_TYPE_TEXT -cdef object WS_MSG_TYPE_BINARY - -cdef set ALLOWED_CLOSE_CODES -cdef set MESSAGE_TYPES_WITH_CONTENT - -cdef tuple EMPTY_FRAME -cdef tuple EMPTY_FRAME_ERROR - -cdef class WebSocketDataQueue: - - cdef unsigned int _size - cdef public object _protocol - cdef unsigned int _limit - cdef object _loop - cdef bint _eof - cdef object _waiter - cdef object _exception - cdef public object _buffer - cdef object _get_buffer - cdef object _put_buffer - - cdef void _release_waiter(self) - - cpdef void feed_data(self, object data, unsigned int size) - - @cython.locals(size="unsigned int") - cdef _read_from_buffer(self) - -cdef class WebSocketReader: - - cdef WebSocketDataQueue queue - cdef unsigned int _max_msg_size - - cdef Exception _exc - cdef bytearray _partial - cdef unsigned int _state - - cdef int _opcode - cdef bint _frame_fin - cdef int _frame_opcode - cdef list _payload_fragments - cdef Py_ssize_t _frame_payload_len - - cdef bytes _tail - cdef bint _has_mask - cdef bytes _frame_mask - cdef Py_ssize_t _payload_bytes_to_read - cdef unsigned int _payload_len_flag - cdef int _compressed - cdef object _decompressobj - cdef bint _compress - - cpdef tuple feed_data(self, object data) - - @cython.locals( - is_continuation=bint, - fin=bint, - has_partial=bint, - payload_merged=bytes, - ) - cpdef void _handle_frame(self, bint fin, int opcode, object payload, int compressed) except * - - @cython.locals( - start_pos=Py_ssize_t, - data_len=Py_ssize_t, - length=Py_ssize_t, - chunk_size=Py_ssize_t, - chunk_len=Py_ssize_t, - data_len=Py_ssize_t, - data_cstr="const unsigned char *", - first_byte="unsigned char", - second_byte="unsigned char", - f_start_pos=Py_ssize_t, - f_end_pos=Py_ssize_t, - has_mask=bint, - fin=bint, - had_fragments=Py_ssize_t, - payload_bytearray=bytearray, - ) - cpdef void _feed_data(self, bytes data) except * diff --git a/venv/lib/python3.12/site-packages/aiohttp/_websocket/reader_c.py b/venv/lib/python3.12/site-packages/aiohttp/_websocket/reader_c.py deleted file mode 100644 index f966a15..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/_websocket/reader_c.py +++ /dev/null @@ -1,476 +0,0 @@ -"""Reader for WebSocket protocol versions 13 and 8.""" - -import asyncio -import builtins -from collections import deque -from typing import Deque, Final, Optional, Set, Tuple, Union - -from ..base_protocol import BaseProtocol -from ..compression_utils import ZLibDecompressor -from ..helpers import _EXC_SENTINEL, set_exception -from ..streams import EofStream -from .helpers import UNPACK_CLOSE_CODE, UNPACK_LEN3, websocket_mask -from .models import ( - WS_DEFLATE_TRAILING, - WebSocketError, - WSCloseCode, - WSMessage, - WSMsgType, -) - -ALLOWED_CLOSE_CODES: Final[Set[int]] = {int(i) for i in WSCloseCode} - -# States for the reader, used to parse the WebSocket frame -# integer values are used so they can be cythonized -READ_HEADER = 1 -READ_PAYLOAD_LENGTH = 2 -READ_PAYLOAD_MASK = 3 -READ_PAYLOAD = 4 - -WS_MSG_TYPE_BINARY = WSMsgType.BINARY -WS_MSG_TYPE_TEXT = WSMsgType.TEXT - -# WSMsgType values unpacked so they can by cythonized to ints -OP_CODE_NOT_SET = -1 -OP_CODE_CONTINUATION = WSMsgType.CONTINUATION.value -OP_CODE_TEXT = WSMsgType.TEXT.value -OP_CODE_BINARY = WSMsgType.BINARY.value -OP_CODE_CLOSE = WSMsgType.CLOSE.value -OP_CODE_PING = WSMsgType.PING.value -OP_CODE_PONG = WSMsgType.PONG.value - -EMPTY_FRAME_ERROR = (True, b"") -EMPTY_FRAME = (False, b"") - -COMPRESSED_NOT_SET = -1 -COMPRESSED_FALSE = 0 -COMPRESSED_TRUE = 1 - -TUPLE_NEW = tuple.__new__ - -cython_int = int # Typed to int in Python, but cython with use a signed int in the pxd - - -class WebSocketDataQueue: - """WebSocketDataQueue resumes and pauses an underlying stream. - - It is a destination for WebSocket data. - """ - - def __init__( - self, protocol: BaseProtocol, limit: int, *, loop: asyncio.AbstractEventLoop - ) -> None: - self._size = 0 - self._protocol = protocol - self._limit = limit * 2 - self._loop = loop - self._eof = False - self._waiter: Optional[asyncio.Future[None]] = None - self._exception: Union[BaseException, None] = None - self._buffer: Deque[Tuple[WSMessage, int]] = deque() - self._get_buffer = self._buffer.popleft - self._put_buffer = self._buffer.append - - def is_eof(self) -> bool: - return self._eof - - def exception(self) -> Optional[BaseException]: - return self._exception - - def set_exception( - self, - exc: BaseException, - exc_cause: builtins.BaseException = _EXC_SENTINEL, - ) -> None: - self._eof = True - self._exception = exc - if (waiter := self._waiter) is not None: - self._waiter = None - set_exception(waiter, exc, exc_cause) - - def _release_waiter(self) -> None: - if (waiter := self._waiter) is None: - return - self._waiter = None - if not waiter.done(): - waiter.set_result(None) - - def feed_eof(self) -> None: - self._eof = True - self._release_waiter() - self._exception = None # Break cyclic references - - def feed_data(self, data: "WSMessage", size: "cython_int") -> None: - self._size += size - self._put_buffer((data, size)) - self._release_waiter() - if self._size > self._limit and not self._protocol._reading_paused: - self._protocol.pause_reading() - - async def read(self) -> WSMessage: - if not self._buffer and not self._eof: - assert not self._waiter - self._waiter = self._loop.create_future() - try: - await self._waiter - except (asyncio.CancelledError, asyncio.TimeoutError): - self._waiter = None - raise - return self._read_from_buffer() - - def _read_from_buffer(self) -> WSMessage: - if self._buffer: - data, size = self._get_buffer() - self._size -= size - if self._size < self._limit and self._protocol._reading_paused: - self._protocol.resume_reading() - return data - if self._exception is not None: - raise self._exception - raise EofStream - - -class WebSocketReader: - def __init__( - self, queue: WebSocketDataQueue, max_msg_size: int, compress: bool = True - ) -> None: - self.queue = queue - self._max_msg_size = max_msg_size - - self._exc: Optional[Exception] = None - self._partial = bytearray() - self._state = READ_HEADER - - self._opcode: int = OP_CODE_NOT_SET - self._frame_fin = False - self._frame_opcode: int = OP_CODE_NOT_SET - self._payload_fragments: list[bytes] = [] - self._frame_payload_len = 0 - - self._tail: bytes = b"" - self._has_mask = False - self._frame_mask: Optional[bytes] = None - self._payload_bytes_to_read = 0 - self._payload_len_flag = 0 - self._compressed: int = COMPRESSED_NOT_SET - self._decompressobj: Optional[ZLibDecompressor] = None - self._compress = compress - - def feed_eof(self) -> None: - self.queue.feed_eof() - - # data can be bytearray on Windows because proactor event loop uses bytearray - # and asyncio types this to Union[bytes, bytearray, memoryview] so we need - # coerce data to bytes if it is not - def feed_data( - self, data: Union[bytes, bytearray, memoryview] - ) -> Tuple[bool, bytes]: - if type(data) is not bytes: - data = bytes(data) - - if self._exc is not None: - return True, data - - try: - self._feed_data(data) - except Exception as exc: - self._exc = exc - set_exception(self.queue, exc) - return EMPTY_FRAME_ERROR - - return EMPTY_FRAME - - def _handle_frame( - self, - fin: bool, - opcode: Union[int, cython_int], # Union intended: Cython pxd uses C int - payload: Union[bytes, bytearray], - compressed: Union[int, cython_int], # Union intended: Cython pxd uses C int - ) -> None: - msg: WSMessage - if opcode in {OP_CODE_TEXT, OP_CODE_BINARY, OP_CODE_CONTINUATION}: - # load text/binary - if not fin: - # got partial frame payload - if opcode != OP_CODE_CONTINUATION: - self._opcode = opcode - self._partial += payload - if self._max_msg_size and len(self._partial) >= self._max_msg_size: - raise WebSocketError( - WSCloseCode.MESSAGE_TOO_BIG, - f"Message size {len(self._partial)} " - f"exceeds limit {self._max_msg_size}", - ) - return - - has_partial = bool(self._partial) - if opcode == OP_CODE_CONTINUATION: - if self._opcode == OP_CODE_NOT_SET: - raise WebSocketError( - WSCloseCode.PROTOCOL_ERROR, - "Continuation frame for non started message", - ) - opcode = self._opcode - self._opcode = OP_CODE_NOT_SET - # previous frame was non finished - # we should get continuation opcode - elif has_partial: - raise WebSocketError( - WSCloseCode.PROTOCOL_ERROR, - "The opcode in non-fin frame is expected " - f"to be zero, got {opcode!r}", - ) - - assembled_payload: Union[bytes, bytearray] - if has_partial: - assembled_payload = self._partial + payload - self._partial.clear() - else: - assembled_payload = payload - - if self._max_msg_size and len(assembled_payload) >= self._max_msg_size: - raise WebSocketError( - WSCloseCode.MESSAGE_TOO_BIG, - f"Message size {len(assembled_payload)} " - f"exceeds limit {self._max_msg_size}", - ) - - # Decompress process must to be done after all packets - # received. - if compressed: - if not self._decompressobj: - self._decompressobj = ZLibDecompressor(suppress_deflate_header=True) - # XXX: It's possible that the zlib backend (isal is known to - # do this, maybe others too?) will return max_length bytes, - # but internally buffer more data such that the payload is - # >max_length, so we return one extra byte and if we're able - # to do that, then the message is too big. - payload_merged = self._decompressobj.decompress_sync( - assembled_payload + WS_DEFLATE_TRAILING, - ( - self._max_msg_size + 1 - if self._max_msg_size - else self._max_msg_size - ), - ) - if self._max_msg_size and len(payload_merged) > self._max_msg_size: - raise WebSocketError( - WSCloseCode.MESSAGE_TOO_BIG, - f"Decompressed message exceeds size limit {self._max_msg_size}", - ) - elif type(assembled_payload) is bytes: - payload_merged = assembled_payload - else: - payload_merged = bytes(assembled_payload) - - if opcode == OP_CODE_TEXT: - try: - text = payload_merged.decode("utf-8") - except UnicodeDecodeError as exc: - raise WebSocketError( - WSCloseCode.INVALID_TEXT, "Invalid UTF-8 text message" - ) from exc - - # XXX: The Text and Binary messages here can be a performance - # bottleneck, so we use tuple.__new__ to improve performance. - # This is not type safe, but many tests should fail in - # test_client_ws_functional.py if this is wrong. - self.queue.feed_data( - TUPLE_NEW(WSMessage, (WS_MSG_TYPE_TEXT, text, "")), - len(payload_merged), - ) - else: - self.queue.feed_data( - TUPLE_NEW(WSMessage, (WS_MSG_TYPE_BINARY, payload_merged, "")), - len(payload_merged), - ) - elif opcode == OP_CODE_CLOSE: - if len(payload) >= 2: - close_code = UNPACK_CLOSE_CODE(payload[:2])[0] - if close_code < 3000 and close_code not in ALLOWED_CLOSE_CODES: - raise WebSocketError( - WSCloseCode.PROTOCOL_ERROR, - f"Invalid close code: {close_code}", - ) - try: - close_message = payload[2:].decode("utf-8") - except UnicodeDecodeError as exc: - raise WebSocketError( - WSCloseCode.INVALID_TEXT, "Invalid UTF-8 text message" - ) from exc - msg = TUPLE_NEW(WSMessage, (WSMsgType.CLOSE, close_code, close_message)) - elif payload: - raise WebSocketError( - WSCloseCode.PROTOCOL_ERROR, - f"Invalid close frame: {fin} {opcode} {payload!r}", - ) - else: - msg = TUPLE_NEW(WSMessage, (WSMsgType.CLOSE, 0, "")) - - self.queue.feed_data(msg, 0) - elif opcode == OP_CODE_PING: - msg = TUPLE_NEW(WSMessage, (WSMsgType.PING, payload, "")) - self.queue.feed_data(msg, len(payload)) - elif opcode == OP_CODE_PONG: - msg = TUPLE_NEW(WSMessage, (WSMsgType.PONG, payload, "")) - self.queue.feed_data(msg, len(payload)) - else: - raise WebSocketError( - WSCloseCode.PROTOCOL_ERROR, f"Unexpected opcode={opcode!r}" - ) - - def _feed_data(self, data: bytes) -> None: - """Return the next frame from the socket.""" - if self._tail: - data, self._tail = self._tail + data, b"" - - start_pos: int = 0 - data_len = len(data) - data_cstr = data - - while True: - # read header - if self._state == READ_HEADER: - if data_len - start_pos < 2: - break - first_byte = data_cstr[start_pos] - second_byte = data_cstr[start_pos + 1] - start_pos += 2 - - fin = (first_byte >> 7) & 1 - rsv1 = (first_byte >> 6) & 1 - rsv2 = (first_byte >> 5) & 1 - rsv3 = (first_byte >> 4) & 1 - opcode = first_byte & 0xF - - # frame-fin = %x0 ; more frames of this message follow - # / %x1 ; final frame of this message - # frame-rsv1 = %x0 ; - # 1 bit, MUST be 0 unless negotiated otherwise - # frame-rsv2 = %x0 ; - # 1 bit, MUST be 0 unless negotiated otherwise - # frame-rsv3 = %x0 ; - # 1 bit, MUST be 0 unless negotiated otherwise - # - # Remove rsv1 from this test for deflate development - if rsv2 or rsv3 or (rsv1 and not self._compress): - raise WebSocketError( - WSCloseCode.PROTOCOL_ERROR, - "Received frame with non-zero reserved bits", - ) - - if opcode > 0x7 and fin == 0: - raise WebSocketError( - WSCloseCode.PROTOCOL_ERROR, - "Received fragmented control frame", - ) - - has_mask = (second_byte >> 7) & 1 - length = second_byte & 0x7F - - # Control frames MUST have a payload - # length of 125 bytes or less - if opcode > 0x7 and length > 125: - raise WebSocketError( - WSCloseCode.PROTOCOL_ERROR, - "Control frame payload cannot be larger than 125 bytes", - ) - - # Set compress status if last package is FIN - # OR set compress status if this is first fragment - # Raise error if not first fragment with rsv1 = 0x1 - if self._frame_fin or self._compressed == COMPRESSED_NOT_SET: - self._compressed = COMPRESSED_TRUE if rsv1 else COMPRESSED_FALSE - elif rsv1: - raise WebSocketError( - WSCloseCode.PROTOCOL_ERROR, - "Received frame with non-zero reserved bits", - ) - - self._frame_fin = bool(fin) - self._frame_opcode = opcode - self._has_mask = bool(has_mask) - self._payload_len_flag = length - self._state = READ_PAYLOAD_LENGTH - - # read payload length - if self._state == READ_PAYLOAD_LENGTH: - len_flag = self._payload_len_flag - if len_flag == 126: - if data_len - start_pos < 2: - break - first_byte = data_cstr[start_pos] - second_byte = data_cstr[start_pos + 1] - start_pos += 2 - self._payload_bytes_to_read = first_byte << 8 | second_byte - elif len_flag > 126: - if data_len - start_pos < 8: - break - self._payload_bytes_to_read = UNPACK_LEN3(data, start_pos)[0] - start_pos += 8 - else: - self._payload_bytes_to_read = len_flag - - self._state = READ_PAYLOAD_MASK if self._has_mask else READ_PAYLOAD - - # read payload mask - if self._state == READ_PAYLOAD_MASK: - if data_len - start_pos < 4: - break - self._frame_mask = data_cstr[start_pos : start_pos + 4] - start_pos += 4 - self._state = READ_PAYLOAD - - if self._state == READ_PAYLOAD: - chunk_len = data_len - start_pos - if self._payload_bytes_to_read >= chunk_len: - f_end_pos = data_len - self._payload_bytes_to_read -= chunk_len - else: - f_end_pos = start_pos + self._payload_bytes_to_read - self._payload_bytes_to_read = 0 - - had_fragments = self._frame_payload_len - self._frame_payload_len += f_end_pos - start_pos - f_start_pos = start_pos - start_pos = f_end_pos - - if self._payload_bytes_to_read != 0: - # If we don't have a complete frame, we need to save the - # data for the next call to feed_data. - self._payload_fragments.append(data_cstr[f_start_pos:f_end_pos]) - break - - payload: Union[bytes, bytearray] - if had_fragments: - # We have to join the payload fragments get the payload - self._payload_fragments.append(data_cstr[f_start_pos:f_end_pos]) - if self._has_mask: - assert self._frame_mask is not None - payload_bytearray = bytearray(b"".join(self._payload_fragments)) - websocket_mask(self._frame_mask, payload_bytearray) - payload = payload_bytearray - else: - payload = b"".join(self._payload_fragments) - self._payload_fragments.clear() - elif self._has_mask: - assert self._frame_mask is not None - payload_bytearray = data_cstr[f_start_pos:f_end_pos] # type: ignore[assignment] - if type(payload_bytearray) is not bytearray: # pragma: no branch - # Cython will do the conversion for us - # but we need to do it for Python and we - # will always get here in Python - payload_bytearray = bytearray(payload_bytearray) - websocket_mask(self._frame_mask, payload_bytearray) - payload = payload_bytearray - else: - payload = data_cstr[f_start_pos:f_end_pos] - - self._handle_frame( - self._frame_fin, self._frame_opcode, payload, self._compressed - ) - self._frame_payload_len = 0 - self._state = READ_HEADER - - # XXX: Cython needs slices to be bounded, so we can't omit the slice end here. - self._tail = data_cstr[start_pos:data_len] if start_pos < data_len else b"" diff --git a/venv/lib/python3.12/site-packages/aiohttp/_websocket/reader_py.py b/venv/lib/python3.12/site-packages/aiohttp/_websocket/reader_py.py deleted file mode 100644 index f966a15..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/_websocket/reader_py.py +++ /dev/null @@ -1,476 +0,0 @@ -"""Reader for WebSocket protocol versions 13 and 8.""" - -import asyncio -import builtins -from collections import deque -from typing import Deque, Final, Optional, Set, Tuple, Union - -from ..base_protocol import BaseProtocol -from ..compression_utils import ZLibDecompressor -from ..helpers import _EXC_SENTINEL, set_exception -from ..streams import EofStream -from .helpers import UNPACK_CLOSE_CODE, UNPACK_LEN3, websocket_mask -from .models import ( - WS_DEFLATE_TRAILING, - WebSocketError, - WSCloseCode, - WSMessage, - WSMsgType, -) - -ALLOWED_CLOSE_CODES: Final[Set[int]] = {int(i) for i in WSCloseCode} - -# States for the reader, used to parse the WebSocket frame -# integer values are used so they can be cythonized -READ_HEADER = 1 -READ_PAYLOAD_LENGTH = 2 -READ_PAYLOAD_MASK = 3 -READ_PAYLOAD = 4 - -WS_MSG_TYPE_BINARY = WSMsgType.BINARY -WS_MSG_TYPE_TEXT = WSMsgType.TEXT - -# WSMsgType values unpacked so they can by cythonized to ints -OP_CODE_NOT_SET = -1 -OP_CODE_CONTINUATION = WSMsgType.CONTINUATION.value -OP_CODE_TEXT = WSMsgType.TEXT.value -OP_CODE_BINARY = WSMsgType.BINARY.value -OP_CODE_CLOSE = WSMsgType.CLOSE.value -OP_CODE_PING = WSMsgType.PING.value -OP_CODE_PONG = WSMsgType.PONG.value - -EMPTY_FRAME_ERROR = (True, b"") -EMPTY_FRAME = (False, b"") - -COMPRESSED_NOT_SET = -1 -COMPRESSED_FALSE = 0 -COMPRESSED_TRUE = 1 - -TUPLE_NEW = tuple.__new__ - -cython_int = int # Typed to int in Python, but cython with use a signed int in the pxd - - -class WebSocketDataQueue: - """WebSocketDataQueue resumes and pauses an underlying stream. - - It is a destination for WebSocket data. - """ - - def __init__( - self, protocol: BaseProtocol, limit: int, *, loop: asyncio.AbstractEventLoop - ) -> None: - self._size = 0 - self._protocol = protocol - self._limit = limit * 2 - self._loop = loop - self._eof = False - self._waiter: Optional[asyncio.Future[None]] = None - self._exception: Union[BaseException, None] = None - self._buffer: Deque[Tuple[WSMessage, int]] = deque() - self._get_buffer = self._buffer.popleft - self._put_buffer = self._buffer.append - - def is_eof(self) -> bool: - return self._eof - - def exception(self) -> Optional[BaseException]: - return self._exception - - def set_exception( - self, - exc: BaseException, - exc_cause: builtins.BaseException = _EXC_SENTINEL, - ) -> None: - self._eof = True - self._exception = exc - if (waiter := self._waiter) is not None: - self._waiter = None - set_exception(waiter, exc, exc_cause) - - def _release_waiter(self) -> None: - if (waiter := self._waiter) is None: - return - self._waiter = None - if not waiter.done(): - waiter.set_result(None) - - def feed_eof(self) -> None: - self._eof = True - self._release_waiter() - self._exception = None # Break cyclic references - - def feed_data(self, data: "WSMessage", size: "cython_int") -> None: - self._size += size - self._put_buffer((data, size)) - self._release_waiter() - if self._size > self._limit and not self._protocol._reading_paused: - self._protocol.pause_reading() - - async def read(self) -> WSMessage: - if not self._buffer and not self._eof: - assert not self._waiter - self._waiter = self._loop.create_future() - try: - await self._waiter - except (asyncio.CancelledError, asyncio.TimeoutError): - self._waiter = None - raise - return self._read_from_buffer() - - def _read_from_buffer(self) -> WSMessage: - if self._buffer: - data, size = self._get_buffer() - self._size -= size - if self._size < self._limit and self._protocol._reading_paused: - self._protocol.resume_reading() - return data - if self._exception is not None: - raise self._exception - raise EofStream - - -class WebSocketReader: - def __init__( - self, queue: WebSocketDataQueue, max_msg_size: int, compress: bool = True - ) -> None: - self.queue = queue - self._max_msg_size = max_msg_size - - self._exc: Optional[Exception] = None - self._partial = bytearray() - self._state = READ_HEADER - - self._opcode: int = OP_CODE_NOT_SET - self._frame_fin = False - self._frame_opcode: int = OP_CODE_NOT_SET - self._payload_fragments: list[bytes] = [] - self._frame_payload_len = 0 - - self._tail: bytes = b"" - self._has_mask = False - self._frame_mask: Optional[bytes] = None - self._payload_bytes_to_read = 0 - self._payload_len_flag = 0 - self._compressed: int = COMPRESSED_NOT_SET - self._decompressobj: Optional[ZLibDecompressor] = None - self._compress = compress - - def feed_eof(self) -> None: - self.queue.feed_eof() - - # data can be bytearray on Windows because proactor event loop uses bytearray - # and asyncio types this to Union[bytes, bytearray, memoryview] so we need - # coerce data to bytes if it is not - def feed_data( - self, data: Union[bytes, bytearray, memoryview] - ) -> Tuple[bool, bytes]: - if type(data) is not bytes: - data = bytes(data) - - if self._exc is not None: - return True, data - - try: - self._feed_data(data) - except Exception as exc: - self._exc = exc - set_exception(self.queue, exc) - return EMPTY_FRAME_ERROR - - return EMPTY_FRAME - - def _handle_frame( - self, - fin: bool, - opcode: Union[int, cython_int], # Union intended: Cython pxd uses C int - payload: Union[bytes, bytearray], - compressed: Union[int, cython_int], # Union intended: Cython pxd uses C int - ) -> None: - msg: WSMessage - if opcode in {OP_CODE_TEXT, OP_CODE_BINARY, OP_CODE_CONTINUATION}: - # load text/binary - if not fin: - # got partial frame payload - if opcode != OP_CODE_CONTINUATION: - self._opcode = opcode - self._partial += payload - if self._max_msg_size and len(self._partial) >= self._max_msg_size: - raise WebSocketError( - WSCloseCode.MESSAGE_TOO_BIG, - f"Message size {len(self._partial)} " - f"exceeds limit {self._max_msg_size}", - ) - return - - has_partial = bool(self._partial) - if opcode == OP_CODE_CONTINUATION: - if self._opcode == OP_CODE_NOT_SET: - raise WebSocketError( - WSCloseCode.PROTOCOL_ERROR, - "Continuation frame for non started message", - ) - opcode = self._opcode - self._opcode = OP_CODE_NOT_SET - # previous frame was non finished - # we should get continuation opcode - elif has_partial: - raise WebSocketError( - WSCloseCode.PROTOCOL_ERROR, - "The opcode in non-fin frame is expected " - f"to be zero, got {opcode!r}", - ) - - assembled_payload: Union[bytes, bytearray] - if has_partial: - assembled_payload = self._partial + payload - self._partial.clear() - else: - assembled_payload = payload - - if self._max_msg_size and len(assembled_payload) >= self._max_msg_size: - raise WebSocketError( - WSCloseCode.MESSAGE_TOO_BIG, - f"Message size {len(assembled_payload)} " - f"exceeds limit {self._max_msg_size}", - ) - - # Decompress process must to be done after all packets - # received. - if compressed: - if not self._decompressobj: - self._decompressobj = ZLibDecompressor(suppress_deflate_header=True) - # XXX: It's possible that the zlib backend (isal is known to - # do this, maybe others too?) will return max_length bytes, - # but internally buffer more data such that the payload is - # >max_length, so we return one extra byte and if we're able - # to do that, then the message is too big. - payload_merged = self._decompressobj.decompress_sync( - assembled_payload + WS_DEFLATE_TRAILING, - ( - self._max_msg_size + 1 - if self._max_msg_size - else self._max_msg_size - ), - ) - if self._max_msg_size and len(payload_merged) > self._max_msg_size: - raise WebSocketError( - WSCloseCode.MESSAGE_TOO_BIG, - f"Decompressed message exceeds size limit {self._max_msg_size}", - ) - elif type(assembled_payload) is bytes: - payload_merged = assembled_payload - else: - payload_merged = bytes(assembled_payload) - - if opcode == OP_CODE_TEXT: - try: - text = payload_merged.decode("utf-8") - except UnicodeDecodeError as exc: - raise WebSocketError( - WSCloseCode.INVALID_TEXT, "Invalid UTF-8 text message" - ) from exc - - # XXX: The Text and Binary messages here can be a performance - # bottleneck, so we use tuple.__new__ to improve performance. - # This is not type safe, but many tests should fail in - # test_client_ws_functional.py if this is wrong. - self.queue.feed_data( - TUPLE_NEW(WSMessage, (WS_MSG_TYPE_TEXT, text, "")), - len(payload_merged), - ) - else: - self.queue.feed_data( - TUPLE_NEW(WSMessage, (WS_MSG_TYPE_BINARY, payload_merged, "")), - len(payload_merged), - ) - elif opcode == OP_CODE_CLOSE: - if len(payload) >= 2: - close_code = UNPACK_CLOSE_CODE(payload[:2])[0] - if close_code < 3000 and close_code not in ALLOWED_CLOSE_CODES: - raise WebSocketError( - WSCloseCode.PROTOCOL_ERROR, - f"Invalid close code: {close_code}", - ) - try: - close_message = payload[2:].decode("utf-8") - except UnicodeDecodeError as exc: - raise WebSocketError( - WSCloseCode.INVALID_TEXT, "Invalid UTF-8 text message" - ) from exc - msg = TUPLE_NEW(WSMessage, (WSMsgType.CLOSE, close_code, close_message)) - elif payload: - raise WebSocketError( - WSCloseCode.PROTOCOL_ERROR, - f"Invalid close frame: {fin} {opcode} {payload!r}", - ) - else: - msg = TUPLE_NEW(WSMessage, (WSMsgType.CLOSE, 0, "")) - - self.queue.feed_data(msg, 0) - elif opcode == OP_CODE_PING: - msg = TUPLE_NEW(WSMessage, (WSMsgType.PING, payload, "")) - self.queue.feed_data(msg, len(payload)) - elif opcode == OP_CODE_PONG: - msg = TUPLE_NEW(WSMessage, (WSMsgType.PONG, payload, "")) - self.queue.feed_data(msg, len(payload)) - else: - raise WebSocketError( - WSCloseCode.PROTOCOL_ERROR, f"Unexpected opcode={opcode!r}" - ) - - def _feed_data(self, data: bytes) -> None: - """Return the next frame from the socket.""" - if self._tail: - data, self._tail = self._tail + data, b"" - - start_pos: int = 0 - data_len = len(data) - data_cstr = data - - while True: - # read header - if self._state == READ_HEADER: - if data_len - start_pos < 2: - break - first_byte = data_cstr[start_pos] - second_byte = data_cstr[start_pos + 1] - start_pos += 2 - - fin = (first_byte >> 7) & 1 - rsv1 = (first_byte >> 6) & 1 - rsv2 = (first_byte >> 5) & 1 - rsv3 = (first_byte >> 4) & 1 - opcode = first_byte & 0xF - - # frame-fin = %x0 ; more frames of this message follow - # / %x1 ; final frame of this message - # frame-rsv1 = %x0 ; - # 1 bit, MUST be 0 unless negotiated otherwise - # frame-rsv2 = %x0 ; - # 1 bit, MUST be 0 unless negotiated otherwise - # frame-rsv3 = %x0 ; - # 1 bit, MUST be 0 unless negotiated otherwise - # - # Remove rsv1 from this test for deflate development - if rsv2 or rsv3 or (rsv1 and not self._compress): - raise WebSocketError( - WSCloseCode.PROTOCOL_ERROR, - "Received frame with non-zero reserved bits", - ) - - if opcode > 0x7 and fin == 0: - raise WebSocketError( - WSCloseCode.PROTOCOL_ERROR, - "Received fragmented control frame", - ) - - has_mask = (second_byte >> 7) & 1 - length = second_byte & 0x7F - - # Control frames MUST have a payload - # length of 125 bytes or less - if opcode > 0x7 and length > 125: - raise WebSocketError( - WSCloseCode.PROTOCOL_ERROR, - "Control frame payload cannot be larger than 125 bytes", - ) - - # Set compress status if last package is FIN - # OR set compress status if this is first fragment - # Raise error if not first fragment with rsv1 = 0x1 - if self._frame_fin or self._compressed == COMPRESSED_NOT_SET: - self._compressed = COMPRESSED_TRUE if rsv1 else COMPRESSED_FALSE - elif rsv1: - raise WebSocketError( - WSCloseCode.PROTOCOL_ERROR, - "Received frame with non-zero reserved bits", - ) - - self._frame_fin = bool(fin) - self._frame_opcode = opcode - self._has_mask = bool(has_mask) - self._payload_len_flag = length - self._state = READ_PAYLOAD_LENGTH - - # read payload length - if self._state == READ_PAYLOAD_LENGTH: - len_flag = self._payload_len_flag - if len_flag == 126: - if data_len - start_pos < 2: - break - first_byte = data_cstr[start_pos] - second_byte = data_cstr[start_pos + 1] - start_pos += 2 - self._payload_bytes_to_read = first_byte << 8 | second_byte - elif len_flag > 126: - if data_len - start_pos < 8: - break - self._payload_bytes_to_read = UNPACK_LEN3(data, start_pos)[0] - start_pos += 8 - else: - self._payload_bytes_to_read = len_flag - - self._state = READ_PAYLOAD_MASK if self._has_mask else READ_PAYLOAD - - # read payload mask - if self._state == READ_PAYLOAD_MASK: - if data_len - start_pos < 4: - break - self._frame_mask = data_cstr[start_pos : start_pos + 4] - start_pos += 4 - self._state = READ_PAYLOAD - - if self._state == READ_PAYLOAD: - chunk_len = data_len - start_pos - if self._payload_bytes_to_read >= chunk_len: - f_end_pos = data_len - self._payload_bytes_to_read -= chunk_len - else: - f_end_pos = start_pos + self._payload_bytes_to_read - self._payload_bytes_to_read = 0 - - had_fragments = self._frame_payload_len - self._frame_payload_len += f_end_pos - start_pos - f_start_pos = start_pos - start_pos = f_end_pos - - if self._payload_bytes_to_read != 0: - # If we don't have a complete frame, we need to save the - # data for the next call to feed_data. - self._payload_fragments.append(data_cstr[f_start_pos:f_end_pos]) - break - - payload: Union[bytes, bytearray] - if had_fragments: - # We have to join the payload fragments get the payload - self._payload_fragments.append(data_cstr[f_start_pos:f_end_pos]) - if self._has_mask: - assert self._frame_mask is not None - payload_bytearray = bytearray(b"".join(self._payload_fragments)) - websocket_mask(self._frame_mask, payload_bytearray) - payload = payload_bytearray - else: - payload = b"".join(self._payload_fragments) - self._payload_fragments.clear() - elif self._has_mask: - assert self._frame_mask is not None - payload_bytearray = data_cstr[f_start_pos:f_end_pos] # type: ignore[assignment] - if type(payload_bytearray) is not bytearray: # pragma: no branch - # Cython will do the conversion for us - # but we need to do it for Python and we - # will always get here in Python - payload_bytearray = bytearray(payload_bytearray) - websocket_mask(self._frame_mask, payload_bytearray) - payload = payload_bytearray - else: - payload = data_cstr[f_start_pos:f_end_pos] - - self._handle_frame( - self._frame_fin, self._frame_opcode, payload, self._compressed - ) - self._frame_payload_len = 0 - self._state = READ_HEADER - - # XXX: Cython needs slices to be bounded, so we can't omit the slice end here. - self._tail = data_cstr[start_pos:data_len] if start_pos < data_len else b"" diff --git a/venv/lib/python3.12/site-packages/aiohttp/_websocket/writer.py b/venv/lib/python3.12/site-packages/aiohttp/_websocket/writer.py deleted file mode 100644 index 19163f9..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/_websocket/writer.py +++ /dev/null @@ -1,178 +0,0 @@ -"""WebSocket protocol versions 13 and 8.""" - -import asyncio -import random -from functools import partial -from typing import Any, Final, Optional, Union - -from ..base_protocol import BaseProtocol -from ..client_exceptions import ClientConnectionResetError -from ..compression_utils import ZLibBackend, ZLibCompressor -from .helpers import ( - MASK_LEN, - MSG_SIZE, - PACK_CLOSE_CODE, - PACK_LEN1, - PACK_LEN2, - PACK_LEN3, - PACK_RANDBITS, - websocket_mask, -) -from .models import WS_DEFLATE_TRAILING, WSMsgType - -DEFAULT_LIMIT: Final[int] = 2**16 - -# For websockets, keeping latency low is extremely important as implementations -# generally expect to be able to send and receive messages quickly. We use a -# larger chunk size than the default to reduce the number of executor calls -# since the executor is a significant source of latency and overhead when -# the chunks are small. A size of 5KiB was chosen because it is also the -# same value python-zlib-ng choose to use as the threshold to release the GIL. - -WEBSOCKET_MAX_SYNC_CHUNK_SIZE = 5 * 1024 - - -class WebSocketWriter: - """WebSocket writer. - - The writer is responsible for sending messages to the client. It is - created by the protocol when a connection is established. The writer - should avoid implementing any application logic and should only be - concerned with the low-level details of the WebSocket protocol. - """ - - def __init__( - self, - protocol: BaseProtocol, - transport: asyncio.Transport, - *, - use_mask: bool = False, - limit: int = DEFAULT_LIMIT, - random: random.Random = random.Random(), - compress: int = 0, - notakeover: bool = False, - ) -> None: - """Initialize a WebSocket writer.""" - self.protocol = protocol - self.transport = transport - self.use_mask = use_mask - self.get_random_bits = partial(random.getrandbits, 32) - self.compress = compress - self.notakeover = notakeover - self._closing = False - self._limit = limit - self._output_size = 0 - self._compressobj: Any = None # actually compressobj - - async def send_frame( - self, message: bytes, opcode: int, compress: Optional[int] = None - ) -> None: - """Send a frame over the websocket with message as its payload.""" - if self._closing and not (opcode & WSMsgType.CLOSE): - raise ClientConnectionResetError("Cannot write to closing transport") - - # RSV are the reserved bits in the frame header. They are used to - # indicate that the frame is using an extension. - # https://datatracker.ietf.org/doc/html/rfc6455#section-5.2 - rsv = 0 - # Only compress larger packets (disabled) - # Does small packet needs to be compressed? - # if self.compress and opcode < 8 and len(message) > 124: - if (compress or self.compress) and opcode < 8: - # RSV1 (rsv = 0x40) is set for compressed frames - # https://datatracker.ietf.org/doc/html/rfc7692#section-7.2.3.1 - rsv = 0x40 - - if compress: - # Do not set self._compress if compressing is for this frame - compressobj = self._make_compress_obj(compress) - else: # self.compress - if not self._compressobj: - self._compressobj = self._make_compress_obj(self.compress) - compressobj = self._compressobj - - message = ( - await compressobj.compress(message) - + compressobj.flush( - ZLibBackend.Z_FULL_FLUSH - if self.notakeover - else ZLibBackend.Z_SYNC_FLUSH - ) - ).removesuffix(WS_DEFLATE_TRAILING) - # Its critical that we do not return control to the event - # loop until we have finished sending all the compressed - # data. Otherwise we could end up mixing compressed frames - # if there are multiple coroutines compressing data. - - msg_length = len(message) - - use_mask = self.use_mask - mask_bit = 0x80 if use_mask else 0 - - # Depending on the message length, the header is assembled differently. - # The first byte is reserved for the opcode and the RSV bits. - first_byte = 0x80 | rsv | opcode - if msg_length < 126: - header = PACK_LEN1(first_byte, msg_length | mask_bit) - header_len = 2 - elif msg_length < 65536: - header = PACK_LEN2(first_byte, 126 | mask_bit, msg_length) - header_len = 4 - else: - header = PACK_LEN3(first_byte, 127 | mask_bit, msg_length) - header_len = 10 - - if self.transport.is_closing(): - raise ClientConnectionResetError("Cannot write to closing transport") - - # https://datatracker.ietf.org/doc/html/rfc6455#section-5.3 - # If we are using a mask, we need to generate it randomly - # and apply it to the message before sending it. A mask is - # a 32-bit value that is applied to the message using a - # bitwise XOR operation. It is used to prevent certain types - # of attacks on the websocket protocol. The mask is only used - # when aiohttp is acting as a client. Servers do not use a mask. - if use_mask: - mask = PACK_RANDBITS(self.get_random_bits()) - message = bytearray(message) - websocket_mask(mask, message) - self.transport.write(header + mask + message) - self._output_size += MASK_LEN - elif msg_length > MSG_SIZE: - self.transport.write(header) - self.transport.write(message) - else: - self.transport.write(header + message) - - self._output_size += header_len + msg_length - - # It is safe to return control to the event loop when using compression - # after this point as we have already sent or buffered all the data. - - # Once we have written output_size up to the limit, we call the - # drain helper which waits for the transport to be ready to accept - # more data. This is a flow control mechanism to prevent the buffer - # from growing too large. The drain helper will return right away - # if the writer is not paused. - if self._output_size > self._limit: - self._output_size = 0 - if self.protocol._paused: - await self.protocol._drain_helper() - - def _make_compress_obj(self, compress: int) -> ZLibCompressor: - return ZLibCompressor( - level=ZLibBackend.Z_BEST_SPEED, - wbits=-compress, - max_sync_chunk_size=WEBSOCKET_MAX_SYNC_CHUNK_SIZE, - ) - - async def close(self, code: int = 1000, message: Union[bytes, str] = b"") -> None: - """Close the websocket, sending the specified code and message.""" - if isinstance(message, str): - message = message.encode("utf-8") - try: - await self.send_frame( - PACK_CLOSE_CODE(code) + message, opcode=WSMsgType.CLOSE - ) - finally: - self._closing = True diff --git a/venv/lib/python3.12/site-packages/aiohttp/abc.py b/venv/lib/python3.12/site-packages/aiohttp/abc.py deleted file mode 100644 index 2574ff9..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/abc.py +++ /dev/null @@ -1,268 +0,0 @@ -import asyncio -import logging -import socket -from abc import ABC, abstractmethod -from collections.abc import Sized -from http.cookies import BaseCookie, Morsel -from typing import ( - TYPE_CHECKING, - Any, - Awaitable, - Callable, - Dict, - Generator, - Iterable, - List, - Optional, - Sequence, - Tuple, - TypedDict, - Union, -) - -from multidict import CIMultiDict -from yarl import URL - -from ._cookie_helpers import parse_set_cookie_headers -from .typedefs import LooseCookies - -if TYPE_CHECKING: - from .web_app import Application - from .web_exceptions import HTTPException - from .web_request import BaseRequest, Request - from .web_response import StreamResponse -else: - BaseRequest = Request = Application = StreamResponse = None - HTTPException = None - - -class AbstractRouter(ABC): - def __init__(self) -> None: - self._frozen = False - - def post_init(self, app: Application) -> None: - """Post init stage. - - Not an abstract method for sake of backward compatibility, - but if the router wants to be aware of the application - it can override this. - """ - - @property - def frozen(self) -> bool: - return self._frozen - - def freeze(self) -> None: - """Freeze router.""" - self._frozen = True - - @abstractmethod - async def resolve(self, request: Request) -> "AbstractMatchInfo": - """Return MATCH_INFO for given request""" - - -class AbstractMatchInfo(ABC): - - __slots__ = () - - @property # pragma: no branch - @abstractmethod - def handler(self) -> Callable[[Request], Awaitable[StreamResponse]]: - """Execute matched request handler""" - - @property - @abstractmethod - def expect_handler( - self, - ) -> Callable[[Request], Awaitable[Optional[StreamResponse]]]: - """Expect handler for 100-continue processing""" - - @property # pragma: no branch - @abstractmethod - def http_exception(self) -> Optional[HTTPException]: - """HTTPException instance raised on router's resolving, or None""" - - @abstractmethod # pragma: no branch - def get_info(self) -> Dict[str, Any]: - """Return a dict with additional info useful for introspection""" - - @property # pragma: no branch - @abstractmethod - def apps(self) -> Tuple[Application, ...]: - """Stack of nested applications. - - Top level application is left-most element. - - """ - - @abstractmethod - def add_app(self, app: Application) -> None: - """Add application to the nested apps stack.""" - - @abstractmethod - def freeze(self) -> None: - """Freeze the match info. - - The method is called after route resolution. - - After the call .add_app() is forbidden. - - """ - - -class AbstractView(ABC): - """Abstract class based view.""" - - def __init__(self, request: Request) -> None: - self._request = request - - @property - def request(self) -> Request: - """Request instance.""" - return self._request - - @abstractmethod - def __await__(self) -> Generator[Any, None, StreamResponse]: - """Execute the view handler.""" - - -class ResolveResult(TypedDict): - """Resolve result. - - This is the result returned from an AbstractResolver's - resolve method. - - :param hostname: The hostname that was provided. - :param host: The IP address that was resolved. - :param port: The port that was resolved. - :param family: The address family that was resolved. - :param proto: The protocol that was resolved. - :param flags: The flags that were resolved. - """ - - hostname: str - host: str - port: int - family: int - proto: int - flags: int - - -class AbstractResolver(ABC): - """Abstract DNS resolver.""" - - @abstractmethod - async def resolve( - self, host: str, port: int = 0, family: socket.AddressFamily = socket.AF_INET - ) -> List[ResolveResult]: - """Return IP address for given hostname""" - - @abstractmethod - async def close(self) -> None: - """Release resolver""" - - -if TYPE_CHECKING: - IterableBase = Iterable[Morsel[str]] -else: - IterableBase = Iterable - - -ClearCookiePredicate = Callable[["Morsel[str]"], bool] - - -class AbstractCookieJar(Sized, IterableBase): - """Abstract Cookie Jar.""" - - def __init__(self, *, loop: Optional[asyncio.AbstractEventLoop] = None) -> None: - self._loop = loop or asyncio.get_running_loop() - - @property - @abstractmethod - def quote_cookie(self) -> bool: - """Return True if cookies should be quoted.""" - - @abstractmethod - def clear(self, predicate: Optional[ClearCookiePredicate] = None) -> None: - """Clear all cookies if no predicate is passed.""" - - @abstractmethod - def clear_domain(self, domain: str) -> None: - """Clear all cookies for domain and all subdomains.""" - - @abstractmethod - def update_cookies(self, cookies: LooseCookies, response_url: URL = URL()) -> None: - """Update cookies.""" - - def update_cookies_from_headers( - self, headers: Sequence[str], response_url: URL - ) -> None: - """Update cookies from raw Set-Cookie headers.""" - if headers and (cookies_to_update := parse_set_cookie_headers(headers)): - self.update_cookies(cookies_to_update, response_url) - - @abstractmethod - def filter_cookies(self, request_url: URL) -> "BaseCookie[str]": - """Return the jar's cookies filtered by their attributes.""" - - -class AbstractStreamWriter(ABC): - """Abstract stream writer.""" - - buffer_size: int = 0 - output_size: int = 0 - length: Optional[int] = 0 - - @abstractmethod - async def write(self, chunk: Union[bytes, bytearray, memoryview]) -> None: - """Write chunk into stream.""" - - @abstractmethod - async def write_eof(self, chunk: bytes = b"") -> None: - """Write last chunk.""" - - @abstractmethod - async def drain(self) -> None: - """Flush the write buffer.""" - - @abstractmethod - def enable_compression( - self, encoding: str = "deflate", strategy: Optional[int] = None - ) -> None: - """Enable HTTP body compression""" - - @abstractmethod - def enable_chunking(self) -> None: - """Enable HTTP chunked mode""" - - @abstractmethod - async def write_headers( - self, status_line: str, headers: "CIMultiDict[str]" - ) -> None: - """Write HTTP headers""" - - def send_headers(self) -> None: - """Force sending buffered headers if not already sent. - - Required only if write_headers() buffers headers instead of sending immediately. - For backwards compatibility, this method does nothing by default. - """ - - -class AbstractAccessLogger(ABC): - """Abstract writer to access log.""" - - __slots__ = ("logger", "log_format") - - def __init__(self, logger: logging.Logger, log_format: str) -> None: - self.logger = logger - self.log_format = log_format - - @abstractmethod - def log(self, request: BaseRequest, response: StreamResponse, time: float) -> None: - """Emit log to logger.""" - - @property - def enabled(self) -> bool: - """Check if logger is enabled.""" - return True diff --git a/venv/lib/python3.12/site-packages/aiohttp/base_protocol.py b/venv/lib/python3.12/site-packages/aiohttp/base_protocol.py deleted file mode 100644 index b0a67ed..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/base_protocol.py +++ /dev/null @@ -1,100 +0,0 @@ -import asyncio -from typing import Optional, cast - -from .client_exceptions import ClientConnectionResetError -from .helpers import set_exception -from .tcp_helpers import tcp_nodelay - - -class BaseProtocol(asyncio.Protocol): - __slots__ = ( - "_loop", - "_paused", - "_drain_waiter", - "_connection_lost", - "_reading_paused", - "transport", - ) - - def __init__(self, loop: asyncio.AbstractEventLoop) -> None: - self._loop: asyncio.AbstractEventLoop = loop - self._paused = False - self._drain_waiter: Optional[asyncio.Future[None]] = None - self._reading_paused = False - - self.transport: Optional[asyncio.Transport] = None - - @property - def connected(self) -> bool: - """Return True if the connection is open.""" - return self.transport is not None - - @property - def writing_paused(self) -> bool: - return self._paused - - def pause_writing(self) -> None: - assert not self._paused - self._paused = True - - def resume_writing(self) -> None: - assert self._paused - self._paused = False - - waiter = self._drain_waiter - if waiter is not None: - self._drain_waiter = None - if not waiter.done(): - waiter.set_result(None) - - def pause_reading(self) -> None: - if not self._reading_paused and self.transport is not None: - try: - self.transport.pause_reading() - except (AttributeError, NotImplementedError, RuntimeError): - pass - self._reading_paused = True - - def resume_reading(self) -> None: - if self._reading_paused and self.transport is not None: - try: - self.transport.resume_reading() - except (AttributeError, NotImplementedError, RuntimeError): - pass - self._reading_paused = False - - def connection_made(self, transport: asyncio.BaseTransport) -> None: - tr = cast(asyncio.Transport, transport) - tcp_nodelay(tr, True) - self.transport = tr - - def connection_lost(self, exc: Optional[BaseException]) -> None: - # Wake up the writer if currently paused. - self.transport = None - if not self._paused: - return - waiter = self._drain_waiter - if waiter is None: - return - self._drain_waiter = None - if waiter.done(): - return - if exc is None: - waiter.set_result(None) - else: - set_exception( - waiter, - ConnectionError("Connection lost"), - exc, - ) - - async def _drain_helper(self) -> None: - if self.transport is None: - raise ClientConnectionResetError("Connection lost") - if not self._paused: - return - waiter = self._drain_waiter - if waiter is None: - waiter = self._loop.create_future() - self._drain_waiter = waiter - await asyncio.shield(waiter) diff --git a/venv/lib/python3.12/site-packages/aiohttp/client.py b/venv/lib/python3.12/site-packages/aiohttp/client.py deleted file mode 100644 index 0c72d59..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/client.py +++ /dev/null @@ -1,1613 +0,0 @@ -"""HTTP Client for asyncio.""" - -import asyncio -import base64 -import hashlib -import json -import os -import sys -import traceback -import warnings -from contextlib import suppress -from types import TracebackType -from typing import ( - TYPE_CHECKING, - Any, - Awaitable, - Callable, - Coroutine, - Final, - FrozenSet, - Generator, - Generic, - Iterable, - List, - Mapping, - Optional, - Sequence, - Set, - Tuple, - Type, - TypedDict, - TypeVar, - Union, -) - -import attr -from multidict import CIMultiDict, MultiDict, MultiDictProxy, istr -from yarl import URL - -from . import hdrs, http, payload -from ._websocket.reader import WebSocketDataQueue -from .abc import AbstractCookieJar -from .client_exceptions import ( - ClientConnectionError, - ClientConnectionResetError, - ClientConnectorCertificateError, - ClientConnectorDNSError, - ClientConnectorError, - ClientConnectorSSLError, - ClientError, - ClientHttpProxyError, - ClientOSError, - ClientPayloadError, - ClientProxyConnectionError, - ClientResponseError, - ClientSSLError, - ConnectionTimeoutError, - ContentTypeError, - InvalidURL, - InvalidUrlClientError, - InvalidUrlRedirectClientError, - NonHttpUrlClientError, - NonHttpUrlRedirectClientError, - RedirectClientError, - ServerConnectionError, - ServerDisconnectedError, - ServerFingerprintMismatch, - ServerTimeoutError, - SocketTimeoutError, - TooManyRedirects, - WSMessageTypeError, - WSServerHandshakeError, -) -from .client_middlewares import ClientMiddlewareType, build_client_middlewares -from .client_reqrep import ( - ClientRequest as ClientRequest, - ClientResponse as ClientResponse, - Fingerprint as Fingerprint, - RequestInfo as RequestInfo, - _merge_ssl_params, -) -from .client_ws import ( - DEFAULT_WS_CLIENT_TIMEOUT, - ClientWebSocketResponse as ClientWebSocketResponse, - ClientWSTimeout as ClientWSTimeout, -) -from .connector import ( - HTTP_AND_EMPTY_SCHEMA_SET, - BaseConnector as BaseConnector, - NamedPipeConnector as NamedPipeConnector, - TCPConnector as TCPConnector, - UnixConnector as UnixConnector, -) -from .cookiejar import CookieJar -from .helpers import ( - _SENTINEL, - DEBUG, - EMPTY_BODY_METHODS, - BasicAuth, - TimeoutHandle, - get_env_proxy_for_url, - sentinel, - strip_auth_from_url, -) -from .http import WS_KEY, HttpVersion, WebSocketReader, WebSocketWriter -from .http_websocket import WSHandshakeError, ws_ext_gen, ws_ext_parse -from .tracing import Trace, TraceConfig -from .typedefs import JSONEncoder, LooseCookies, LooseHeaders, Query, StrOrURL - -__all__ = ( - # client_exceptions - "ClientConnectionError", - "ClientConnectionResetError", - "ClientConnectorCertificateError", - "ClientConnectorDNSError", - "ClientConnectorError", - "ClientConnectorSSLError", - "ClientError", - "ClientHttpProxyError", - "ClientOSError", - "ClientPayloadError", - "ClientProxyConnectionError", - "ClientResponseError", - "ClientSSLError", - "ConnectionTimeoutError", - "ContentTypeError", - "InvalidURL", - "InvalidUrlClientError", - "RedirectClientError", - "NonHttpUrlClientError", - "InvalidUrlRedirectClientError", - "NonHttpUrlRedirectClientError", - "ServerConnectionError", - "ServerDisconnectedError", - "ServerFingerprintMismatch", - "ServerTimeoutError", - "SocketTimeoutError", - "TooManyRedirects", - "WSServerHandshakeError", - # client_reqrep - "ClientRequest", - "ClientResponse", - "Fingerprint", - "RequestInfo", - # connector - "BaseConnector", - "TCPConnector", - "UnixConnector", - "NamedPipeConnector", - # client_ws - "ClientWebSocketResponse", - # client - "ClientSession", - "ClientTimeout", - "ClientWSTimeout", - "request", - "WSMessageTypeError", -) - - -if TYPE_CHECKING: - from ssl import SSLContext -else: - SSLContext = None - -if sys.version_info >= (3, 11) and TYPE_CHECKING: - from typing import Unpack - - -class _RequestOptions(TypedDict, total=False): - params: Query - data: Any - json: Any - cookies: Union[LooseCookies, None] - headers: Union[LooseHeaders, None] - skip_auto_headers: Union[Iterable[str], None] - auth: Union[BasicAuth, None] - allow_redirects: bool - max_redirects: int - compress: Union[str, bool, None] - chunked: Union[bool, None] - expect100: bool - raise_for_status: Union[None, bool, Callable[[ClientResponse], Awaitable[None]]] - read_until_eof: bool - proxy: Union[StrOrURL, None] - proxy_auth: Union[BasicAuth, None] - timeout: "Union[ClientTimeout, _SENTINEL, None]" - ssl: Union[SSLContext, bool, Fingerprint] - server_hostname: Union[str, None] - proxy_headers: Union[LooseHeaders, None] - trace_request_ctx: Union[Mapping[str, Any], None] - read_bufsize: Union[int, None] - auto_decompress: Union[bool, None] - max_line_size: Union[int, None] - max_field_size: Union[int, None] - middlewares: Optional[Sequence[ClientMiddlewareType]] - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class ClientTimeout: - total: Optional[float] = None - connect: Optional[float] = None - sock_read: Optional[float] = None - sock_connect: Optional[float] = None - ceil_threshold: float = 5 - - # pool_queue_timeout: Optional[float] = None - # dns_resolution_timeout: Optional[float] = None - # socket_connect_timeout: Optional[float] = None - # connection_acquiring_timeout: Optional[float] = None - # new_connection_timeout: Optional[float] = None - # http_header_timeout: Optional[float] = None - # response_body_timeout: Optional[float] = None - - # to create a timeout specific for a single request, either - # - create a completely new one to overwrite the default - # - or use http://www.attrs.org/en/stable/api.html#attr.evolve - # to overwrite the defaults - - -# 5 Minute default read timeout -DEFAULT_TIMEOUT: Final[ClientTimeout] = ClientTimeout(total=5 * 60, sock_connect=30) - -# https://www.rfc-editor.org/rfc/rfc9110#section-9.2.2 -IDEMPOTENT_METHODS = frozenset({"GET", "HEAD", "OPTIONS", "TRACE", "PUT", "DELETE"}) - -_RetType = TypeVar("_RetType", ClientResponse, ClientWebSocketResponse) -_CharsetResolver = Callable[[ClientResponse, bytes], str] - - -class ClientSession: - """First-class interface for making HTTP requests.""" - - ATTRS = frozenset( - [ - "_base_url", - "_base_url_origin", - "_source_traceback", - "_connector", - "_loop", - "_cookie_jar", - "_connector_owner", - "_default_auth", - "_version", - "_json_serialize", - "_requote_redirect_url", - "_timeout", - "_raise_for_status", - "_auto_decompress", - "_trust_env", - "_default_headers", - "_skip_auto_headers", - "_request_class", - "_response_class", - "_ws_response_class", - "_trace_configs", - "_read_bufsize", - "_max_line_size", - "_max_field_size", - "_resolve_charset", - "_default_proxy", - "_default_proxy_auth", - "_retry_connection", - "_middlewares", - "requote_redirect_url", - ] - ) - - _source_traceback: Optional[traceback.StackSummary] = None - _connector: Optional[BaseConnector] = None - - def __init__( - self, - base_url: Optional[StrOrURL] = None, - *, - connector: Optional[BaseConnector] = None, - loop: Optional[asyncio.AbstractEventLoop] = None, - cookies: Optional[LooseCookies] = None, - headers: Optional[LooseHeaders] = None, - proxy: Optional[StrOrURL] = None, - proxy_auth: Optional[BasicAuth] = None, - skip_auto_headers: Optional[Iterable[str]] = None, - auth: Optional[BasicAuth] = None, - json_serialize: JSONEncoder = json.dumps, - request_class: Type[ClientRequest] = ClientRequest, - response_class: Type[ClientResponse] = ClientResponse, - ws_response_class: Type[ClientWebSocketResponse] = ClientWebSocketResponse, - version: HttpVersion = http.HttpVersion11, - cookie_jar: Optional[AbstractCookieJar] = None, - connector_owner: bool = True, - raise_for_status: Union[ - bool, Callable[[ClientResponse], Awaitable[None]] - ] = False, - read_timeout: Union[float, _SENTINEL] = sentinel, - conn_timeout: Optional[float] = None, - timeout: Union[object, ClientTimeout] = sentinel, - auto_decompress: bool = True, - trust_env: bool = False, - requote_redirect_url: bool = True, - trace_configs: Optional[List[TraceConfig]] = None, - read_bufsize: int = 2**16, - max_line_size: int = 8190, - max_field_size: int = 8190, - fallback_charset_resolver: _CharsetResolver = lambda r, b: "utf-8", - middlewares: Sequence[ClientMiddlewareType] = (), - ssl_shutdown_timeout: Union[_SENTINEL, None, float] = sentinel, - ) -> None: - # We initialise _connector to None immediately, as it's referenced in __del__() - # and could cause issues if an exception occurs during initialisation. - self._connector: Optional[BaseConnector] = None - - if loop is None: - if connector is not None: - loop = connector._loop - - loop = loop or asyncio.get_running_loop() - - if base_url is None or isinstance(base_url, URL): - self._base_url: Optional[URL] = base_url - self._base_url_origin = None if base_url is None else base_url.origin() - else: - self._base_url = URL(base_url) - self._base_url_origin = self._base_url.origin() - assert self._base_url.absolute, "Only absolute URLs are supported" - if self._base_url is not None and not self._base_url.path.endswith("/"): - raise ValueError("base_url must have a trailing '/'") - - if timeout is sentinel or timeout is None: - self._timeout = DEFAULT_TIMEOUT - if read_timeout is not sentinel: - warnings.warn( - "read_timeout is deprecated, use timeout argument instead", - DeprecationWarning, - stacklevel=2, - ) - self._timeout = attr.evolve(self._timeout, total=read_timeout) - if conn_timeout is not None: - self._timeout = attr.evolve(self._timeout, connect=conn_timeout) - warnings.warn( - "conn_timeout is deprecated, use timeout argument instead", - DeprecationWarning, - stacklevel=2, - ) - else: - if not isinstance(timeout, ClientTimeout): - raise ValueError( - f"timeout parameter cannot be of {type(timeout)} type, " - "please use 'timeout=ClientTimeout(...)'", - ) - self._timeout = timeout - if read_timeout is not sentinel: - raise ValueError( - "read_timeout and timeout parameters " - "conflict, please setup " - "timeout.read" - ) - if conn_timeout is not None: - raise ValueError( - "conn_timeout and timeout parameters " - "conflict, please setup " - "timeout.connect" - ) - - if ssl_shutdown_timeout is not sentinel: - warnings.warn( - "The ssl_shutdown_timeout parameter is deprecated and will be removed in aiohttp 4.0", - DeprecationWarning, - stacklevel=2, - ) - - if connector is None: - connector = TCPConnector( - loop=loop, ssl_shutdown_timeout=ssl_shutdown_timeout - ) - - if connector._loop is not loop: - raise RuntimeError("Session and connector has to use same event loop") - - self._loop = loop - - if loop.get_debug(): - self._source_traceback = traceback.extract_stack(sys._getframe(1)) - - if cookie_jar is None: - cookie_jar = CookieJar(loop=loop) - self._cookie_jar = cookie_jar - - if cookies: - self._cookie_jar.update_cookies(cookies) - - self._connector = connector - self._connector_owner = connector_owner - self._default_auth = auth - self._version = version - self._json_serialize = json_serialize - self._raise_for_status = raise_for_status - self._auto_decompress = auto_decompress - self._trust_env = trust_env - self._requote_redirect_url = requote_redirect_url - self._read_bufsize = read_bufsize - self._max_line_size = max_line_size - self._max_field_size = max_field_size - - # Convert to list of tuples - if headers: - real_headers: CIMultiDict[str] = CIMultiDict(headers) - else: - real_headers = CIMultiDict() - self._default_headers: CIMultiDict[str] = real_headers - if skip_auto_headers is not None: - self._skip_auto_headers = frozenset(istr(i) for i in skip_auto_headers) - else: - self._skip_auto_headers = frozenset() - - self._request_class = request_class - self._response_class = response_class - self._ws_response_class = ws_response_class - - self._trace_configs = trace_configs or [] - for trace_config in self._trace_configs: - trace_config.freeze() - - self._resolve_charset = fallback_charset_resolver - - self._default_proxy = proxy - self._default_proxy_auth = proxy_auth - self._retry_connection: bool = True - self._middlewares = middlewares - - def __init_subclass__(cls: Type["ClientSession"]) -> None: - warnings.warn( - "Inheritance class {} from ClientSession " - "is discouraged".format(cls.__name__), - DeprecationWarning, - stacklevel=2, - ) - - if DEBUG: - - def __setattr__(self, name: str, val: Any) -> None: - if name not in self.ATTRS: - warnings.warn( - "Setting custom ClientSession.{} attribute " - "is discouraged".format(name), - DeprecationWarning, - stacklevel=2, - ) - super().__setattr__(name, val) - - def __del__(self, _warnings: Any = warnings) -> None: - if not self.closed: - kwargs = {"source": self} - _warnings.warn( - f"Unclosed client session {self!r}", ResourceWarning, **kwargs - ) - context = {"client_session": self, "message": "Unclosed client session"} - if self._source_traceback is not None: - context["source_traceback"] = self._source_traceback - self._loop.call_exception_handler(context) - - if sys.version_info >= (3, 11) and TYPE_CHECKING: - - def request( - self, - method: str, - url: StrOrURL, - **kwargs: Unpack[_RequestOptions], - ) -> "_RequestContextManager": ... - - else: - - def request( - self, method: str, url: StrOrURL, **kwargs: Any - ) -> "_RequestContextManager": - """Perform HTTP request.""" - return _RequestContextManager(self._request(method, url, **kwargs)) - - def _build_url(self, str_or_url: StrOrURL) -> URL: - url = URL(str_or_url) - if self._base_url and not url.absolute: - return self._base_url.join(url) - return url - - async def _request( - self, - method: str, - str_or_url: StrOrURL, - *, - params: Query = None, - data: Any = None, - json: Any = None, - cookies: Optional[LooseCookies] = None, - headers: Optional[LooseHeaders] = None, - skip_auto_headers: Optional[Iterable[str]] = None, - auth: Optional[BasicAuth] = None, - allow_redirects: bool = True, - max_redirects: int = 10, - compress: Union[str, bool, None] = None, - chunked: Optional[bool] = None, - expect100: bool = False, - raise_for_status: Union[ - None, bool, Callable[[ClientResponse], Awaitable[None]] - ] = None, - read_until_eof: bool = True, - proxy: Optional[StrOrURL] = None, - proxy_auth: Optional[BasicAuth] = None, - timeout: Union[ClientTimeout, _SENTINEL] = sentinel, - verify_ssl: Optional[bool] = None, - fingerprint: Optional[bytes] = None, - ssl_context: Optional[SSLContext] = None, - ssl: Union[SSLContext, bool, Fingerprint] = True, - server_hostname: Optional[str] = None, - proxy_headers: Optional[LooseHeaders] = None, - trace_request_ctx: Optional[Mapping[str, Any]] = None, - read_bufsize: Optional[int] = None, - auto_decompress: Optional[bool] = None, - max_line_size: Optional[int] = None, - max_field_size: Optional[int] = None, - middlewares: Optional[Sequence[ClientMiddlewareType]] = None, - ) -> ClientResponse: - - # NOTE: timeout clamps existing connect and read timeouts. We cannot - # set the default to None because we need to detect if the user wants - # to use the existing timeouts by setting timeout to None. - - if self.closed: - raise RuntimeError("Session is closed") - - ssl = _merge_ssl_params(ssl, verify_ssl, ssl_context, fingerprint) - - if data is not None and json is not None: - raise ValueError( - "data and json parameters can not be used at the same time" - ) - elif json is not None: - data = payload.JsonPayload(json, dumps=self._json_serialize) - - if not isinstance(chunked, bool) and chunked is not None: - warnings.warn("Chunk size is deprecated #1615", DeprecationWarning) - - redirects = 0 - history: List[ClientResponse] = [] - version = self._version - params = params or {} - - # Merge with default headers and transform to CIMultiDict - headers = self._prepare_headers(headers) - - try: - url = self._build_url(str_or_url) - except ValueError as e: - raise InvalidUrlClientError(str_or_url) from e - - assert self._connector is not None - if url.scheme not in self._connector.allowed_protocol_schema_set: - raise NonHttpUrlClientError(url) - - skip_headers: Optional[Iterable[istr]] - if skip_auto_headers is not None: - skip_headers = { - istr(i) for i in skip_auto_headers - } | self._skip_auto_headers - elif self._skip_auto_headers: - skip_headers = self._skip_auto_headers - else: - skip_headers = None - - if proxy is None: - proxy = self._default_proxy - if proxy_auth is None: - proxy_auth = self._default_proxy_auth - - if proxy is None: - proxy_headers = None - else: - proxy_headers = self._prepare_headers(proxy_headers) - try: - proxy = URL(proxy) - except ValueError as e: - raise InvalidURL(proxy) from e - - if timeout is sentinel: - real_timeout: ClientTimeout = self._timeout - else: - if not isinstance(timeout, ClientTimeout): - real_timeout = ClientTimeout(total=timeout) - else: - real_timeout = timeout - # timeout is cumulative for all request operations - # (request, redirects, responses, data consuming) - tm = TimeoutHandle( - self._loop, real_timeout.total, ceil_threshold=real_timeout.ceil_threshold - ) - handle = tm.start() - - if read_bufsize is None: - read_bufsize = self._read_bufsize - - if auto_decompress is None: - auto_decompress = self._auto_decompress - - if max_line_size is None: - max_line_size = self._max_line_size - - if max_field_size is None: - max_field_size = self._max_field_size - - traces = [ - Trace( - self, - trace_config, - trace_config.trace_config_ctx(trace_request_ctx=trace_request_ctx), - ) - for trace_config in self._trace_configs - ] - - for trace in traces: - await trace.send_request_start(method, url.update_query(params), headers) - - timer = tm.timer() - try: - with timer: - # https://www.rfc-editor.org/rfc/rfc9112.html#name-retrying-requests - retry_persistent_connection = ( - self._retry_connection and method in IDEMPOTENT_METHODS - ) - while True: - url, auth_from_url = strip_auth_from_url(url) - if not url.raw_host: - # NOTE: Bail early, otherwise, causes `InvalidURL` through - # NOTE: `self._request_class()` below. - err_exc_cls = ( - InvalidUrlRedirectClientError - if redirects - else InvalidUrlClientError - ) - raise err_exc_cls(url) - # If `auth` was passed for an already authenticated URL, - # disallow only if this is the initial URL; this is to avoid issues - # with sketchy redirects that are not the caller's responsibility - if not history and (auth and auth_from_url): - raise ValueError( - "Cannot combine AUTH argument with " - "credentials encoded in URL" - ) - - # Override the auth with the one from the URL only if we - # have no auth, or if we got an auth from a redirect URL - if auth is None or (history and auth_from_url is not None): - auth = auth_from_url - - if ( - auth is None - and self._default_auth - and ( - not self._base_url or self._base_url_origin == url.origin() - ) - ): - auth = self._default_auth - # It would be confusing if we support explicit - # Authorization header with auth argument - if ( - headers is not None - and auth is not None - and hdrs.AUTHORIZATION in headers - ): - raise ValueError( - "Cannot combine AUTHORIZATION header " - "with AUTH argument or credentials " - "encoded in URL" - ) - - all_cookies = self._cookie_jar.filter_cookies(url) - - if cookies is not None: - tmp_cookie_jar = CookieJar( - quote_cookie=self._cookie_jar.quote_cookie - ) - tmp_cookie_jar.update_cookies(cookies) - req_cookies = tmp_cookie_jar.filter_cookies(url) - if req_cookies: - all_cookies.load(req_cookies) - - proxy_: Optional[URL] = None - if proxy is not None: - proxy_ = URL(proxy) - elif self._trust_env: - with suppress(LookupError): - proxy_, proxy_auth = await asyncio.to_thread( - get_env_proxy_for_url, url - ) - - req = self._request_class( - method, - url, - params=params, - headers=headers, - skip_auto_headers=skip_headers, - data=data, - cookies=all_cookies, - auth=auth, - version=version, - compress=compress, - chunked=chunked, - expect100=expect100, - loop=self._loop, - response_class=self._response_class, - proxy=proxy_, - proxy_auth=proxy_auth, - timer=timer, - session=self, - ssl=ssl if ssl is not None else True, - server_hostname=server_hostname, - proxy_headers=proxy_headers, - traces=traces, - trust_env=self.trust_env, - ) - - async def _connect_and_send_request( - req: ClientRequest, - ) -> ClientResponse: - # connection timeout - assert self._connector is not None - try: - conn = await self._connector.connect( - req, traces=traces, timeout=real_timeout - ) - except asyncio.TimeoutError as exc: - raise ConnectionTimeoutError( - f"Connection timeout to host {req.url}" - ) from exc - - assert conn.protocol is not None - conn.protocol.set_response_params( - timer=timer, - skip_payload=req.method in EMPTY_BODY_METHODS, - read_until_eof=read_until_eof, - auto_decompress=auto_decompress, - read_timeout=real_timeout.sock_read, - read_bufsize=read_bufsize, - timeout_ceil_threshold=self._connector._timeout_ceil_threshold, - max_line_size=max_line_size, - max_field_size=max_field_size, - ) - try: - resp = await req.send(conn) - try: - await resp.start(conn) - except BaseException: - resp.close() - raise - except BaseException: - conn.close() - raise - return resp - - # Apply middleware (if any) - per-request middleware overrides session middleware - effective_middlewares = ( - self._middlewares if middlewares is None else middlewares - ) - - if effective_middlewares: - handler = build_client_middlewares( - _connect_and_send_request, effective_middlewares - ) - else: - handler = _connect_and_send_request - - try: - resp = await handler(req) - # Client connector errors should not be retried - except ( - ConnectionTimeoutError, - ClientConnectorError, - ClientConnectorCertificateError, - ClientConnectorSSLError, - ): - raise - except (ClientOSError, ServerDisconnectedError): - if retry_persistent_connection: - retry_persistent_connection = False - continue - raise - except ClientError: - raise - except OSError as exc: - if exc.errno is None and isinstance(exc, asyncio.TimeoutError): - raise - raise ClientOSError(*exc.args) from exc - - # Update cookies from raw headers to preserve duplicates - if resp._raw_cookie_headers: - self._cookie_jar.update_cookies_from_headers( - resp._raw_cookie_headers, resp.url - ) - - # redirects - if resp.status in (301, 302, 303, 307, 308) and allow_redirects: - - for trace in traces: - await trace.send_request_redirect( - method, url.update_query(params), headers, resp - ) - - redirects += 1 - history.append(resp) - if max_redirects and redirects >= max_redirects: - if req._body is not None: - await req._body.close() - resp.close() - raise TooManyRedirects( - history[0].request_info, tuple(history) - ) - - # For 301 and 302, mimic IE, now changed in RFC - # https://github.com/kennethreitz/requests/pull/269 - if (resp.status == 303 and resp.method != hdrs.METH_HEAD) or ( - resp.status in (301, 302) and resp.method == hdrs.METH_POST - ): - method = hdrs.METH_GET - data = None - if headers.get(hdrs.CONTENT_LENGTH): - headers.pop(hdrs.CONTENT_LENGTH) - else: - # For 307/308, always preserve the request body - # For 301/302 with non-POST methods, preserve the request body - # https://www.rfc-editor.org/rfc/rfc9110#section-15.4.3-3.1 - # Use the existing payload to avoid recreating it from a potentially consumed file - data = req._body - - r_url = resp.headers.get(hdrs.LOCATION) or resp.headers.get( - hdrs.URI - ) - if r_url is None: - # see github.com/aio-libs/aiohttp/issues/2022 - break - else: - # reading from correct redirection - # response is forbidden - resp.release() - - try: - parsed_redirect_url = URL( - r_url, encoded=not self._requote_redirect_url - ) - except ValueError as e: - if req._body is not None: - await req._body.close() - resp.close() - raise InvalidUrlRedirectClientError( - r_url, - "Server attempted redirecting to a location that does not look like a URL", - ) from e - - scheme = parsed_redirect_url.scheme - if scheme not in HTTP_AND_EMPTY_SCHEMA_SET: - if req._body is not None: - await req._body.close() - resp.close() - raise NonHttpUrlRedirectClientError(r_url) - elif not scheme: - parsed_redirect_url = url.join(parsed_redirect_url) - - try: - redirect_origin = parsed_redirect_url.origin() - except ValueError as origin_val_err: - if req._body is not None: - await req._body.close() - resp.close() - raise InvalidUrlRedirectClientError( - parsed_redirect_url, - "Invalid redirect URL origin", - ) from origin_val_err - - if url.origin() != redirect_origin: - auth = None - headers.pop(hdrs.AUTHORIZATION, None) - - url = parsed_redirect_url - params = {} - resp.release() - continue - - break - - if req._body is not None: - await req._body.close() - # check response status - if raise_for_status is None: - raise_for_status = self._raise_for_status - - if raise_for_status is None: - pass - elif callable(raise_for_status): - await raise_for_status(resp) - elif raise_for_status: - resp.raise_for_status() - - # register connection - if handle is not None: - if resp.connection is not None: - resp.connection.add_callback(handle.cancel) - else: - handle.cancel() - - resp._history = tuple(history) - - for trace in traces: - await trace.send_request_end( - method, url.update_query(params), headers, resp - ) - return resp - - except BaseException as e: - # cleanup timer - tm.close() - if handle: - handle.cancel() - handle = None - - for trace in traces: - await trace.send_request_exception( - method, url.update_query(params), headers, e - ) - raise - - def ws_connect( - self, - url: StrOrURL, - *, - method: str = hdrs.METH_GET, - protocols: Iterable[str] = (), - timeout: Union[ClientWSTimeout, _SENTINEL] = sentinel, - receive_timeout: Optional[float] = None, - autoclose: bool = True, - autoping: bool = True, - heartbeat: Optional[float] = None, - auth: Optional[BasicAuth] = None, - origin: Optional[str] = None, - params: Query = None, - headers: Optional[LooseHeaders] = None, - proxy: Optional[StrOrURL] = None, - proxy_auth: Optional[BasicAuth] = None, - ssl: Union[SSLContext, bool, Fingerprint] = True, - verify_ssl: Optional[bool] = None, - fingerprint: Optional[bytes] = None, - ssl_context: Optional[SSLContext] = None, - server_hostname: Optional[str] = None, - proxy_headers: Optional[LooseHeaders] = None, - compress: int = 0, - max_msg_size: int = 4 * 1024 * 1024, - ) -> "_WSRequestContextManager": - """Initiate websocket connection.""" - return _WSRequestContextManager( - self._ws_connect( - url, - method=method, - protocols=protocols, - timeout=timeout, - receive_timeout=receive_timeout, - autoclose=autoclose, - autoping=autoping, - heartbeat=heartbeat, - auth=auth, - origin=origin, - params=params, - headers=headers, - proxy=proxy, - proxy_auth=proxy_auth, - ssl=ssl, - verify_ssl=verify_ssl, - fingerprint=fingerprint, - ssl_context=ssl_context, - server_hostname=server_hostname, - proxy_headers=proxy_headers, - compress=compress, - max_msg_size=max_msg_size, - ) - ) - - async def _ws_connect( - self, - url: StrOrURL, - *, - method: str = hdrs.METH_GET, - protocols: Iterable[str] = (), - timeout: Union[ClientWSTimeout, _SENTINEL] = sentinel, - receive_timeout: Optional[float] = None, - autoclose: bool = True, - autoping: bool = True, - heartbeat: Optional[float] = None, - auth: Optional[BasicAuth] = None, - origin: Optional[str] = None, - params: Query = None, - headers: Optional[LooseHeaders] = None, - proxy: Optional[StrOrURL] = None, - proxy_auth: Optional[BasicAuth] = None, - ssl: Union[SSLContext, bool, Fingerprint] = True, - verify_ssl: Optional[bool] = None, - fingerprint: Optional[bytes] = None, - ssl_context: Optional[SSLContext] = None, - server_hostname: Optional[str] = None, - proxy_headers: Optional[LooseHeaders] = None, - compress: int = 0, - max_msg_size: int = 4 * 1024 * 1024, - ) -> ClientWebSocketResponse: - if timeout is not sentinel: - if isinstance(timeout, ClientWSTimeout): - ws_timeout = timeout - else: - warnings.warn( - "parameter 'timeout' of type 'float' " - "is deprecated, please use " - "'timeout=ClientWSTimeout(ws_close=...)'", - DeprecationWarning, - stacklevel=2, - ) - ws_timeout = ClientWSTimeout(ws_close=timeout) - else: - ws_timeout = DEFAULT_WS_CLIENT_TIMEOUT - if receive_timeout is not None: - warnings.warn( - "float parameter 'receive_timeout' " - "is deprecated, please use parameter " - "'timeout=ClientWSTimeout(ws_receive=...)'", - DeprecationWarning, - stacklevel=2, - ) - ws_timeout = attr.evolve(ws_timeout, ws_receive=receive_timeout) - - if headers is None: - real_headers: CIMultiDict[str] = CIMultiDict() - else: - real_headers = CIMultiDict(headers) - - default_headers = { - hdrs.UPGRADE: "websocket", - hdrs.CONNECTION: "Upgrade", - hdrs.SEC_WEBSOCKET_VERSION: "13", - } - - for key, value in default_headers.items(): - real_headers.setdefault(key, value) - - sec_key = base64.b64encode(os.urandom(16)) - real_headers[hdrs.SEC_WEBSOCKET_KEY] = sec_key.decode() - - if protocols: - real_headers[hdrs.SEC_WEBSOCKET_PROTOCOL] = ",".join(protocols) - if origin is not None: - real_headers[hdrs.ORIGIN] = origin - if compress: - extstr = ws_ext_gen(compress=compress) - real_headers[hdrs.SEC_WEBSOCKET_EXTENSIONS] = extstr - - # For the sake of backward compatibility, if user passes in None, convert it to True - if ssl is None: - warnings.warn( - "ssl=None is deprecated, please use ssl=True", - DeprecationWarning, - stacklevel=2, - ) - ssl = True - ssl = _merge_ssl_params(ssl, verify_ssl, ssl_context, fingerprint) - - # send request - resp = await self.request( - method, - url, - params=params, - headers=real_headers, - read_until_eof=False, - auth=auth, - proxy=proxy, - proxy_auth=proxy_auth, - ssl=ssl, - server_hostname=server_hostname, - proxy_headers=proxy_headers, - ) - - try: - # check handshake - if resp.status != 101: - raise WSServerHandshakeError( - resp.request_info, - resp.history, - message="Invalid response status", - status=resp.status, - headers=resp.headers, - ) - - if resp.headers.get(hdrs.UPGRADE, "").lower() != "websocket": - raise WSServerHandshakeError( - resp.request_info, - resp.history, - message="Invalid upgrade header", - status=resp.status, - headers=resp.headers, - ) - - if resp.headers.get(hdrs.CONNECTION, "").lower() != "upgrade": - raise WSServerHandshakeError( - resp.request_info, - resp.history, - message="Invalid connection header", - status=resp.status, - headers=resp.headers, - ) - - # key calculation - r_key = resp.headers.get(hdrs.SEC_WEBSOCKET_ACCEPT, "") - match = base64.b64encode(hashlib.sha1(sec_key + WS_KEY).digest()).decode() - if r_key != match: - raise WSServerHandshakeError( - resp.request_info, - resp.history, - message="Invalid challenge response", - status=resp.status, - headers=resp.headers, - ) - - # websocket protocol - protocol = None - if protocols and hdrs.SEC_WEBSOCKET_PROTOCOL in resp.headers: - resp_protocols = [ - proto.strip() - for proto in resp.headers[hdrs.SEC_WEBSOCKET_PROTOCOL].split(",") - ] - - for proto in resp_protocols: - if proto in protocols: - protocol = proto - break - - # websocket compress - notakeover = False - if compress: - compress_hdrs = resp.headers.get(hdrs.SEC_WEBSOCKET_EXTENSIONS) - if compress_hdrs: - try: - compress, notakeover = ws_ext_parse(compress_hdrs) - except WSHandshakeError as exc: - raise WSServerHandshakeError( - resp.request_info, - resp.history, - message=exc.args[0], - status=resp.status, - headers=resp.headers, - ) from exc - else: - compress = 0 - notakeover = False - - conn = resp.connection - assert conn is not None - conn_proto = conn.protocol - assert conn_proto is not None - - # For WS connection the read_timeout must be either receive_timeout or greater - # None == no timeout, i.e. infinite timeout, so None is the max timeout possible - if ws_timeout.ws_receive is None: - # Reset regardless - conn_proto.read_timeout = None - elif conn_proto.read_timeout is not None: - conn_proto.read_timeout = max( - ws_timeout.ws_receive, conn_proto.read_timeout - ) - - transport = conn.transport - assert transport is not None - reader = WebSocketDataQueue(conn_proto, 2**16, loop=self._loop) - conn_proto.set_parser(WebSocketReader(reader, max_msg_size), reader) - writer = WebSocketWriter( - conn_proto, - transport, - use_mask=True, - compress=compress, - notakeover=notakeover, - ) - except BaseException: - resp.close() - raise - else: - return self._ws_response_class( - reader, - writer, - protocol, - resp, - ws_timeout, - autoclose, - autoping, - self._loop, - heartbeat=heartbeat, - compress=compress, - client_notakeover=notakeover, - ) - - def _prepare_headers(self, headers: Optional[LooseHeaders]) -> "CIMultiDict[str]": - """Add default headers and transform it to CIMultiDict""" - # Convert headers to MultiDict - result = CIMultiDict(self._default_headers) - if headers: - if not isinstance(headers, (MultiDictProxy, MultiDict)): - headers = CIMultiDict(headers) - added_names: Set[str] = set() - for key, value in headers.items(): - if key in added_names: - result.add(key, value) - else: - result[key] = value - added_names.add(key) - return result - - if sys.version_info >= (3, 11) and TYPE_CHECKING: - - def get( - self, - url: StrOrURL, - **kwargs: Unpack[_RequestOptions], - ) -> "_RequestContextManager": ... - - def options( - self, - url: StrOrURL, - **kwargs: Unpack[_RequestOptions], - ) -> "_RequestContextManager": ... - - def head( - self, - url: StrOrURL, - **kwargs: Unpack[_RequestOptions], - ) -> "_RequestContextManager": ... - - def post( - self, - url: StrOrURL, - **kwargs: Unpack[_RequestOptions], - ) -> "_RequestContextManager": ... - - def put( - self, - url: StrOrURL, - **kwargs: Unpack[_RequestOptions], - ) -> "_RequestContextManager": ... - - def patch( - self, - url: StrOrURL, - **kwargs: Unpack[_RequestOptions], - ) -> "_RequestContextManager": ... - - def delete( - self, - url: StrOrURL, - **kwargs: Unpack[_RequestOptions], - ) -> "_RequestContextManager": ... - - else: - - def get( - self, url: StrOrURL, *, allow_redirects: bool = True, **kwargs: Any - ) -> "_RequestContextManager": - """Perform HTTP GET request.""" - return _RequestContextManager( - self._request( - hdrs.METH_GET, url, allow_redirects=allow_redirects, **kwargs - ) - ) - - def options( - self, url: StrOrURL, *, allow_redirects: bool = True, **kwargs: Any - ) -> "_RequestContextManager": - """Perform HTTP OPTIONS request.""" - return _RequestContextManager( - self._request( - hdrs.METH_OPTIONS, url, allow_redirects=allow_redirects, **kwargs - ) - ) - - def head( - self, url: StrOrURL, *, allow_redirects: bool = False, **kwargs: Any - ) -> "_RequestContextManager": - """Perform HTTP HEAD request.""" - return _RequestContextManager( - self._request( - hdrs.METH_HEAD, url, allow_redirects=allow_redirects, **kwargs - ) - ) - - def post( - self, url: StrOrURL, *, data: Any = None, **kwargs: Any - ) -> "_RequestContextManager": - """Perform HTTP POST request.""" - return _RequestContextManager( - self._request(hdrs.METH_POST, url, data=data, **kwargs) - ) - - def put( - self, url: StrOrURL, *, data: Any = None, **kwargs: Any - ) -> "_RequestContextManager": - """Perform HTTP PUT request.""" - return _RequestContextManager( - self._request(hdrs.METH_PUT, url, data=data, **kwargs) - ) - - def patch( - self, url: StrOrURL, *, data: Any = None, **kwargs: Any - ) -> "_RequestContextManager": - """Perform HTTP PATCH request.""" - return _RequestContextManager( - self._request(hdrs.METH_PATCH, url, data=data, **kwargs) - ) - - def delete(self, url: StrOrURL, **kwargs: Any) -> "_RequestContextManager": - """Perform HTTP DELETE request.""" - return _RequestContextManager( - self._request(hdrs.METH_DELETE, url, **kwargs) - ) - - async def close(self) -> None: - """Close underlying connector. - - Release all acquired resources. - """ - if not self.closed: - if self._connector is not None and self._connector_owner: - await self._connector.close() - self._connector = None - - @property - def closed(self) -> bool: - """Is client session closed. - - A readonly property. - """ - return self._connector is None or self._connector.closed - - @property - def connector(self) -> Optional[BaseConnector]: - """Connector instance used for the session.""" - return self._connector - - @property - def cookie_jar(self) -> AbstractCookieJar: - """The session cookies.""" - return self._cookie_jar - - @property - def version(self) -> Tuple[int, int]: - """The session HTTP protocol version.""" - return self._version - - @property - def requote_redirect_url(self) -> bool: - """Do URL requoting on redirection handling.""" - return self._requote_redirect_url - - @requote_redirect_url.setter - def requote_redirect_url(self, val: bool) -> None: - """Do URL requoting on redirection handling.""" - warnings.warn( - "session.requote_redirect_url modification is deprecated #2778", - DeprecationWarning, - stacklevel=2, - ) - self._requote_redirect_url = val - - @property - def loop(self) -> asyncio.AbstractEventLoop: - """Session's loop.""" - warnings.warn( - "client.loop property is deprecated", DeprecationWarning, stacklevel=2 - ) - return self._loop - - @property - def timeout(self) -> ClientTimeout: - """Timeout for the session.""" - return self._timeout - - @property - def headers(self) -> "CIMultiDict[str]": - """The default headers of the client session.""" - return self._default_headers - - @property - def skip_auto_headers(self) -> FrozenSet[istr]: - """Headers for which autogeneration should be skipped""" - return self._skip_auto_headers - - @property - def auth(self) -> Optional[BasicAuth]: - """An object that represents HTTP Basic Authorization""" - return self._default_auth - - @property - def json_serialize(self) -> JSONEncoder: - """Json serializer callable""" - return self._json_serialize - - @property - def connector_owner(self) -> bool: - """Should connector be closed on session closing""" - return self._connector_owner - - @property - def raise_for_status( - self, - ) -> Union[bool, Callable[[ClientResponse], Awaitable[None]]]: - """Should `ClientResponse.raise_for_status()` be called for each response.""" - return self._raise_for_status - - @property - def auto_decompress(self) -> bool: - """Should the body response be automatically decompressed.""" - return self._auto_decompress - - @property - def trust_env(self) -> bool: - """ - Should proxies information from environment or netrc be trusted. - - Information is from HTTP_PROXY / HTTPS_PROXY environment variables - or ~/.netrc file if present. - """ - return self._trust_env - - @property - def trace_configs(self) -> List[TraceConfig]: - """A list of TraceConfig instances used for client tracing""" - return self._trace_configs - - def detach(self) -> None: - """Detach connector from session without closing the former. - - Session is switched to closed state anyway. - """ - self._connector = None - - def __enter__(self) -> None: - raise TypeError("Use async with instead") - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - # __exit__ should exist in pair with __enter__ but never executed - pass # pragma: no cover - - async def __aenter__(self) -> "ClientSession": - return self - - async def __aexit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - await self.close() - - -class _BaseRequestContextManager(Coroutine[Any, Any, _RetType], Generic[_RetType]): - - __slots__ = ("_coro", "_resp") - - def __init__(self, coro: Coroutine["asyncio.Future[Any]", None, _RetType]) -> None: - self._coro: Coroutine["asyncio.Future[Any]", None, _RetType] = coro - - def send(self, arg: None) -> "asyncio.Future[Any]": - return self._coro.send(arg) - - def throw(self, *args: Any, **kwargs: Any) -> "asyncio.Future[Any]": - return self._coro.throw(*args, **kwargs) - - def close(self) -> None: - return self._coro.close() - - def __await__(self) -> Generator[Any, None, _RetType]: - ret = self._coro.__await__() - return ret - - def __iter__(self) -> Generator[Any, None, _RetType]: - return self.__await__() - - async def __aenter__(self) -> _RetType: - self._resp: _RetType = await self._coro - return await self._resp.__aenter__() - - async def __aexit__( - self, - exc_type: Optional[Type[BaseException]], - exc: Optional[BaseException], - tb: Optional[TracebackType], - ) -> None: - await self._resp.__aexit__(exc_type, exc, tb) - - -_RequestContextManager = _BaseRequestContextManager[ClientResponse] -_WSRequestContextManager = _BaseRequestContextManager[ClientWebSocketResponse] - - -class _SessionRequestContextManager: - - __slots__ = ("_coro", "_resp", "_session") - - def __init__( - self, - coro: Coroutine["asyncio.Future[Any]", None, ClientResponse], - session: ClientSession, - ) -> None: - self._coro = coro - self._resp: Optional[ClientResponse] = None - self._session = session - - async def __aenter__(self) -> ClientResponse: - try: - self._resp = await self._coro - except BaseException: - await self._session.close() - raise - else: - return self._resp - - async def __aexit__( - self, - exc_type: Optional[Type[BaseException]], - exc: Optional[BaseException], - tb: Optional[TracebackType], - ) -> None: - assert self._resp is not None - self._resp.close() - await self._session.close() - - -if sys.version_info >= (3, 11) and TYPE_CHECKING: - - def request( - method: str, - url: StrOrURL, - *, - version: HttpVersion = http.HttpVersion11, - connector: Optional[BaseConnector] = None, - loop: Optional[asyncio.AbstractEventLoop] = None, - **kwargs: Unpack[_RequestOptions], - ) -> _SessionRequestContextManager: ... - -else: - - def request( - method: str, - url: StrOrURL, - *, - version: HttpVersion = http.HttpVersion11, - connector: Optional[BaseConnector] = None, - loop: Optional[asyncio.AbstractEventLoop] = None, - **kwargs: Any, - ) -> _SessionRequestContextManager: - """Constructs and sends a request. - - Returns response object. - method - HTTP method - url - request url - params - (optional) Dictionary or bytes to be sent in the query - string of the new request - data - (optional) Dictionary, bytes, or file-like object to - send in the body of the request - json - (optional) Any json compatible python object - headers - (optional) Dictionary of HTTP Headers to send with - the request - cookies - (optional) Dict object to send with the request - auth - (optional) BasicAuth named tuple represent HTTP Basic Auth - auth - aiohttp.helpers.BasicAuth - allow_redirects - (optional) If set to False, do not follow - redirects - version - Request HTTP version. - compress - Set to True if request has to be compressed - with deflate encoding. - chunked - Set to chunk size for chunked transfer encoding. - expect100 - Expect 100-continue response from server. - connector - BaseConnector sub-class instance to support - connection pooling. - read_until_eof - Read response until eof if response - does not have Content-Length header. - loop - Optional event loop. - timeout - Optional ClientTimeout settings structure, 5min - total timeout by default. - Usage:: - >>> import aiohttp - >>> async with aiohttp.request('GET', 'http://python.org/') as resp: - ... print(resp) - ... data = await resp.read() - - """ - connector_owner = False - if connector is None: - connector_owner = True - connector = TCPConnector(loop=loop, force_close=True) - - session = ClientSession( - loop=loop, - cookies=kwargs.pop("cookies", None), - version=version, - timeout=kwargs.pop("timeout", sentinel), - connector=connector, - connector_owner=connector_owner, - ) - - return _SessionRequestContextManager( - session._request(method, url, **kwargs), - session, - ) diff --git a/venv/lib/python3.12/site-packages/aiohttp/client_exceptions.py b/venv/lib/python3.12/site-packages/aiohttp/client_exceptions.py deleted file mode 100644 index 1d298e9..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/client_exceptions.py +++ /dev/null @@ -1,421 +0,0 @@ -"""HTTP related errors.""" - -import asyncio -import warnings -from typing import TYPE_CHECKING, Optional, Tuple, Union - -from multidict import MultiMapping - -from .typedefs import StrOrURL - -if TYPE_CHECKING: - import ssl - - SSLContext = ssl.SSLContext -else: - try: - import ssl - - SSLContext = ssl.SSLContext - except ImportError: # pragma: no cover - ssl = SSLContext = None # type: ignore[assignment] - -if TYPE_CHECKING: - from .client_reqrep import ClientResponse, ConnectionKey, Fingerprint, RequestInfo - from .http_parser import RawResponseMessage -else: - RequestInfo = ClientResponse = ConnectionKey = RawResponseMessage = None - -__all__ = ( - "ClientError", - "ClientConnectionError", - "ClientConnectionResetError", - "ClientOSError", - "ClientConnectorError", - "ClientProxyConnectionError", - "ClientSSLError", - "ClientConnectorDNSError", - "ClientConnectorSSLError", - "ClientConnectorCertificateError", - "ConnectionTimeoutError", - "SocketTimeoutError", - "ServerConnectionError", - "ServerTimeoutError", - "ServerDisconnectedError", - "ServerFingerprintMismatch", - "ClientResponseError", - "ClientHttpProxyError", - "WSServerHandshakeError", - "ContentTypeError", - "ClientPayloadError", - "InvalidURL", - "InvalidUrlClientError", - "RedirectClientError", - "NonHttpUrlClientError", - "InvalidUrlRedirectClientError", - "NonHttpUrlRedirectClientError", - "WSMessageTypeError", -) - - -class ClientError(Exception): - """Base class for client connection errors.""" - - -class ClientResponseError(ClientError): - """Base class for exceptions that occur after getting a response. - - request_info: An instance of RequestInfo. - history: A sequence of responses, if redirects occurred. - status: HTTP status code. - message: Error message. - headers: Response headers. - """ - - def __init__( - self, - request_info: RequestInfo, - history: Tuple[ClientResponse, ...], - *, - code: Optional[int] = None, - status: Optional[int] = None, - message: str = "", - headers: Optional[MultiMapping[str]] = None, - ) -> None: - self.request_info = request_info - if code is not None: - if status is not None: - raise ValueError( - "Both code and status arguments are provided; " - "code is deprecated, use status instead" - ) - warnings.warn( - "code argument is deprecated, use status instead", - DeprecationWarning, - stacklevel=2, - ) - if status is not None: - self.status = status - elif code is not None: - self.status = code - else: - self.status = 0 - self.message = message - self.headers = headers - self.history = history - self.args = (request_info, history) - - def __str__(self) -> str: - return "{}, message={!r}, url={!r}".format( - self.status, - self.message, - str(self.request_info.real_url), - ) - - def __repr__(self) -> str: - args = f"{self.request_info!r}, {self.history!r}" - if self.status != 0: - args += f", status={self.status!r}" - if self.message != "": - args += f", message={self.message!r}" - if self.headers is not None: - args += f", headers={self.headers!r}" - return f"{type(self).__name__}({args})" - - @property - def code(self) -> int: - warnings.warn( - "code property is deprecated, use status instead", - DeprecationWarning, - stacklevel=2, - ) - return self.status - - @code.setter - def code(self, value: int) -> None: - warnings.warn( - "code property is deprecated, use status instead", - DeprecationWarning, - stacklevel=2, - ) - self.status = value - - -class ContentTypeError(ClientResponseError): - """ContentType found is not valid.""" - - -class WSServerHandshakeError(ClientResponseError): - """websocket server handshake error.""" - - -class ClientHttpProxyError(ClientResponseError): - """HTTP proxy error. - - Raised in :class:`aiohttp.connector.TCPConnector` if - proxy responds with status other than ``200 OK`` - on ``CONNECT`` request. - """ - - -class TooManyRedirects(ClientResponseError): - """Client was redirected too many times.""" - - -class ClientConnectionError(ClientError): - """Base class for client socket errors.""" - - -class ClientConnectionResetError(ClientConnectionError, ConnectionResetError): - """ConnectionResetError""" - - -class ClientOSError(ClientConnectionError, OSError): - """OSError error.""" - - -class ClientConnectorError(ClientOSError): - """Client connector error. - - Raised in :class:`aiohttp.connector.TCPConnector` if - a connection can not be established. - """ - - def __init__(self, connection_key: ConnectionKey, os_error: OSError) -> None: - self._conn_key = connection_key - self._os_error = os_error - super().__init__(os_error.errno, os_error.strerror) - self.args = (connection_key, os_error) - - @property - def os_error(self) -> OSError: - return self._os_error - - @property - def host(self) -> str: - return self._conn_key.host - - @property - def port(self) -> Optional[int]: - return self._conn_key.port - - @property - def ssl(self) -> Union[SSLContext, bool, "Fingerprint"]: - return self._conn_key.ssl - - def __str__(self) -> str: - return "Cannot connect to host {0.host}:{0.port} ssl:{1} [{2}]".format( - self, "default" if self.ssl is True else self.ssl, self.strerror - ) - - # OSError.__reduce__ does too much black magick - __reduce__ = BaseException.__reduce__ - - -class ClientConnectorDNSError(ClientConnectorError): - """DNS resolution failed during client connection. - - Raised in :class:`aiohttp.connector.TCPConnector` if - DNS resolution fails. - """ - - -class ClientProxyConnectionError(ClientConnectorError): - """Proxy connection error. - - Raised in :class:`aiohttp.connector.TCPConnector` if - connection to proxy can not be established. - """ - - -class UnixClientConnectorError(ClientConnectorError): - """Unix connector error. - - Raised in :py:class:`aiohttp.connector.UnixConnector` - if connection to unix socket can not be established. - """ - - def __init__( - self, path: str, connection_key: ConnectionKey, os_error: OSError - ) -> None: - self._path = path - super().__init__(connection_key, os_error) - - @property - def path(self) -> str: - return self._path - - def __str__(self) -> str: - return "Cannot connect to unix socket {0.path} ssl:{1} [{2}]".format( - self, "default" if self.ssl is True else self.ssl, self.strerror - ) - - -class ServerConnectionError(ClientConnectionError): - """Server connection errors.""" - - -class ServerDisconnectedError(ServerConnectionError): - """Server disconnected.""" - - def __init__(self, message: Union[RawResponseMessage, str, None] = None) -> None: - if message is None: - message = "Server disconnected" - - self.args = (message,) - self.message = message - - -class ServerTimeoutError(ServerConnectionError, asyncio.TimeoutError): - """Server timeout error.""" - - -class ConnectionTimeoutError(ServerTimeoutError): - """Connection timeout error.""" - - -class SocketTimeoutError(ServerTimeoutError): - """Socket timeout error.""" - - -class ServerFingerprintMismatch(ServerConnectionError): - """SSL certificate does not match expected fingerprint.""" - - def __init__(self, expected: bytes, got: bytes, host: str, port: int) -> None: - self.expected = expected - self.got = got - self.host = host - self.port = port - self.args = (expected, got, host, port) - - def __repr__(self) -> str: - return "<{} expected={!r} got={!r} host={!r} port={!r}>".format( - self.__class__.__name__, self.expected, self.got, self.host, self.port - ) - - -class ClientPayloadError(ClientError): - """Response payload error.""" - - -class InvalidURL(ClientError, ValueError): - """Invalid URL. - - URL used for fetching is malformed, e.g. it doesn't contains host - part. - """ - - # Derive from ValueError for backward compatibility - - def __init__(self, url: StrOrURL, description: Union[str, None] = None) -> None: - # The type of url is not yarl.URL because the exception can be raised - # on URL(url) call - self._url = url - self._description = description - - if description: - super().__init__(url, description) - else: - super().__init__(url) - - @property - def url(self) -> StrOrURL: - return self._url - - @property - def description(self) -> "str | None": - return self._description - - def __repr__(self) -> str: - return f"<{self.__class__.__name__} {self}>" - - def __str__(self) -> str: - if self._description: - return f"{self._url} - {self._description}" - return str(self._url) - - -class InvalidUrlClientError(InvalidURL): - """Invalid URL client error.""" - - -class RedirectClientError(ClientError): - """Client redirect error.""" - - -class NonHttpUrlClientError(ClientError): - """Non http URL client error.""" - - -class InvalidUrlRedirectClientError(InvalidUrlClientError, RedirectClientError): - """Invalid URL redirect client error.""" - - -class NonHttpUrlRedirectClientError(NonHttpUrlClientError, RedirectClientError): - """Non http URL redirect client error.""" - - -class ClientSSLError(ClientConnectorError): - """Base error for ssl.*Errors.""" - - -if ssl is not None: - cert_errors = (ssl.CertificateError,) - cert_errors_bases = ( - ClientSSLError, - ssl.CertificateError, - ) - - ssl_errors = (ssl.SSLError,) - ssl_error_bases = (ClientSSLError, ssl.SSLError) -else: # pragma: no cover - cert_errors = tuple() - cert_errors_bases = ( - ClientSSLError, - ValueError, - ) - - ssl_errors = tuple() - ssl_error_bases = (ClientSSLError,) - - -class ClientConnectorSSLError(*ssl_error_bases): # type: ignore[misc] - """Response ssl error.""" - - -class ClientConnectorCertificateError(*cert_errors_bases): # type: ignore[misc] - """Response certificate error.""" - - def __init__( - self, connection_key: ConnectionKey, certificate_error: Exception - ) -> None: - self._conn_key = connection_key - self._certificate_error = certificate_error - self.args = (connection_key, certificate_error) - - @property - def certificate_error(self) -> Exception: - return self._certificate_error - - @property - def host(self) -> str: - return self._conn_key.host - - @property - def port(self) -> Optional[int]: - return self._conn_key.port - - @property - def ssl(self) -> bool: - return self._conn_key.is_ssl - - def __str__(self) -> str: - return ( - "Cannot connect to host {0.host}:{0.port} ssl:{0.ssl} " - "[{0.certificate_error.__class__.__name__}: " - "{0.certificate_error.args}]".format(self) - ) - - -class WSMessageTypeError(TypeError): - """WebSocket message type is not valid.""" diff --git a/venv/lib/python3.12/site-packages/aiohttp/client_middleware_digest_auth.py b/venv/lib/python3.12/site-packages/aiohttp/client_middleware_digest_auth.py deleted file mode 100644 index 35f462f..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/client_middleware_digest_auth.py +++ /dev/null @@ -1,474 +0,0 @@ -""" -Digest authentication middleware for aiohttp client. - -This middleware implements HTTP Digest Authentication according to RFC 7616, -providing a more secure alternative to Basic Authentication. It supports all -standard hash algorithms including MD5, SHA, SHA-256, SHA-512 and their session -variants, as well as both 'auth' and 'auth-int' quality of protection (qop) options. -""" - -import hashlib -import os -import re -import time -from typing import ( - Callable, - Dict, - Final, - FrozenSet, - List, - Literal, - Tuple, - TypedDict, - Union, -) - -from yarl import URL - -from . import hdrs -from .client_exceptions import ClientError -from .client_middlewares import ClientHandlerType -from .client_reqrep import ClientRequest, ClientResponse -from .payload import Payload - - -class DigestAuthChallenge(TypedDict, total=False): - realm: str - nonce: str - qop: str - algorithm: str - opaque: str - domain: str - stale: str - - -DigestFunctions: Dict[str, Callable[[bytes], "hashlib._Hash"]] = { - "MD5": hashlib.md5, - "MD5-SESS": hashlib.md5, - "SHA": hashlib.sha1, - "SHA-SESS": hashlib.sha1, - "SHA256": hashlib.sha256, - "SHA256-SESS": hashlib.sha256, - "SHA-256": hashlib.sha256, - "SHA-256-SESS": hashlib.sha256, - "SHA512": hashlib.sha512, - "SHA512-SESS": hashlib.sha512, - "SHA-512": hashlib.sha512, - "SHA-512-SESS": hashlib.sha512, -} - - -# Compile the regex pattern once at module level for performance -_HEADER_PAIRS_PATTERN = re.compile( - r'(\w+)\s*=\s*(?:"((?:[^"\\]|\\.)*)"|([^\s,]+))' - # | | | | | | | | | || | - # +----|--|-|-|--|----|------|----|--||-----|--> alphanumeric key - # +--|-|-|--|----|------|----|--||-----|--> maybe whitespace - # | | | | | | | || | - # +-|-|--|----|------|----|--||-----|--> = (delimiter) - # +-|--|----|------|----|--||-----|--> maybe whitespace - # | | | | | || | - # +--|----|------|----|--||-----|--> group quoted or unquoted - # | | | | || | - # +----|------|----|--||-----|--> if quoted... - # +------|----|--||-----|--> anything but " or \ - # +----|--||-----|--> escaped characters allowed - # +--||-----|--> or can be empty string - # || | - # +|-----|--> if unquoted... - # +-----|--> anything but , or - # +--> at least one char req'd -) - - -# RFC 7616: Challenge parameters to extract -CHALLENGE_FIELDS: Final[ - Tuple[ - Literal["realm", "nonce", "qop", "algorithm", "opaque", "domain", "stale"], ... - ] -] = ( - "realm", - "nonce", - "qop", - "algorithm", - "opaque", - "domain", - "stale", -) - -# Supported digest authentication algorithms -# Use a tuple of sorted keys for predictable documentation and error messages -SUPPORTED_ALGORITHMS: Final[Tuple[str, ...]] = tuple(sorted(DigestFunctions.keys())) - -# RFC 7616: Fields that require quoting in the Digest auth header -# These fields must be enclosed in double quotes in the Authorization header. -# Algorithm, qop, and nc are never quoted per RFC specifications. -# This frozen set is used by the template-based header construction to -# automatically determine which fields need quotes. -QUOTED_AUTH_FIELDS: Final[FrozenSet[str]] = frozenset( - {"username", "realm", "nonce", "uri", "response", "opaque", "cnonce"} -) - - -def escape_quotes(value: str) -> str: - """Escape double quotes for HTTP header values.""" - return value.replace('"', '\\"') - - -def unescape_quotes(value: str) -> str: - """Unescape double quotes in HTTP header values.""" - return value.replace('\\"', '"') - - -def parse_header_pairs(header: str) -> Dict[str, str]: - """ - Parse key-value pairs from WWW-Authenticate or similar HTTP headers. - - This function handles the complex format of WWW-Authenticate header values, - supporting both quoted and unquoted values, proper handling of commas in - quoted values, and whitespace variations per RFC 7616. - - Examples of supported formats: - - key1="value1", key2=value2 - - key1 = "value1" , key2="value, with, commas" - - key1=value1,key2="value2" - - realm="example.com", nonce="12345", qop="auth" - - Args: - header: The header value string to parse - - Returns: - Dictionary mapping parameter names to their values - """ - return { - stripped_key: unescape_quotes(quoted_val) if quoted_val else unquoted_val - for key, quoted_val, unquoted_val in _HEADER_PAIRS_PATTERN.findall(header) - if (stripped_key := key.strip()) - } - - -class DigestAuthMiddleware: - """ - HTTP digest authentication middleware for aiohttp client. - - This middleware intercepts 401 Unauthorized responses containing a Digest - authentication challenge, calculates the appropriate digest credentials, - and automatically retries the request with the proper Authorization header. - - Features: - - Handles all aspects of Digest authentication handshake automatically - - Supports all standard hash algorithms: - - MD5, MD5-SESS - - SHA, SHA-SESS - - SHA256, SHA256-SESS, SHA-256, SHA-256-SESS - - SHA512, SHA512-SESS, SHA-512, SHA-512-SESS - - Supports 'auth' and 'auth-int' quality of protection modes - - Properly handles quoted strings and parameter parsing - - Includes replay attack protection with client nonce count tracking - - Supports preemptive authentication per RFC 7616 Section 3.6 - - Standards compliance: - - RFC 7616: HTTP Digest Access Authentication (primary reference) - - RFC 2617: HTTP Authentication (deprecated by RFC 7616) - - RFC 1945: Section 11.1 (username restrictions) - - Implementation notes: - The core digest calculation is inspired by the implementation in - https://github.com/requests/requests/blob/v2.18.4/requests/auth.py - with added support for modern digest auth features and error handling. - """ - - def __init__( - self, - login: str, - password: str, - preemptive: bool = True, - ) -> None: - if login is None: - raise ValueError("None is not allowed as login value") - - if password is None: - raise ValueError("None is not allowed as password value") - - if ":" in login: - raise ValueError('A ":" is not allowed in username (RFC 1945#section-11.1)') - - self._login_str: Final[str] = login - self._login_bytes: Final[bytes] = login.encode("utf-8") - self._password_bytes: Final[bytes] = password.encode("utf-8") - - self._last_nonce_bytes = b"" - self._nonce_count = 0 - self._challenge: DigestAuthChallenge = {} - self._preemptive: bool = preemptive - # Set of URLs defining the protection space - self._protection_space: List[str] = [] - - async def _encode( - self, method: str, url: URL, body: Union[Payload, Literal[b""]] - ) -> str: - """ - Build digest authorization header for the current challenge. - - Args: - method: The HTTP method (GET, POST, etc.) - url: The request URL - body: The request body (used for qop=auth-int) - - Returns: - A fully formatted Digest authorization header string - - Raises: - ClientError: If the challenge is missing required parameters or - contains unsupported values - - """ - challenge = self._challenge - if "realm" not in challenge: - raise ClientError( - "Malformed Digest auth challenge: Missing 'realm' parameter" - ) - - if "nonce" not in challenge: - raise ClientError( - "Malformed Digest auth challenge: Missing 'nonce' parameter" - ) - - # Empty realm values are allowed per RFC 7616 (SHOULD, not MUST, contain host name) - realm = challenge["realm"] - nonce = challenge["nonce"] - - # Empty nonce values are not allowed as they are security-critical for replay protection - if not nonce: - raise ClientError( - "Security issue: Digest auth challenge contains empty 'nonce' value" - ) - - qop_raw = challenge.get("qop", "") - algorithm = challenge.get("algorithm", "MD5").upper() - opaque = challenge.get("opaque", "") - - # Convert string values to bytes once - nonce_bytes = nonce.encode("utf-8") - realm_bytes = realm.encode("utf-8") - path = URL(url).path_qs - - # Process QoP - qop = "" - qop_bytes = b"" - if qop_raw: - valid_qops = {"auth", "auth-int"}.intersection( - {q.strip() for q in qop_raw.split(",") if q.strip()} - ) - if not valid_qops: - raise ClientError( - f"Digest auth error: Unsupported Quality of Protection (qop) value(s): {qop_raw}" - ) - - qop = "auth-int" if "auth-int" in valid_qops else "auth" - qop_bytes = qop.encode("utf-8") - - if algorithm not in DigestFunctions: - raise ClientError( - f"Digest auth error: Unsupported hash algorithm: {algorithm}. " - f"Supported algorithms: {', '.join(SUPPORTED_ALGORITHMS)}" - ) - hash_fn: Final = DigestFunctions[algorithm] - - def H(x: bytes) -> bytes: - """RFC 7616 Section 3: Hash function H(data) = hex(hash(data)).""" - return hash_fn(x).hexdigest().encode() - - def KD(s: bytes, d: bytes) -> bytes: - """RFC 7616 Section 3: KD(secret, data) = H(concat(secret, ":", data)).""" - return H(b":".join((s, d))) - - # Calculate A1 and A2 - A1 = b":".join((self._login_bytes, realm_bytes, self._password_bytes)) - A2 = f"{method.upper()}:{path}".encode() - if qop == "auth-int": - if isinstance(body, Payload): # will always be empty bytes unless Payload - entity_bytes = await body.as_bytes() # Get bytes from Payload - else: - entity_bytes = body - entity_hash = H(entity_bytes) - A2 = b":".join((A2, entity_hash)) - - HA1 = H(A1) - HA2 = H(A2) - - # Nonce count handling - if nonce_bytes == self._last_nonce_bytes: - self._nonce_count += 1 - else: - self._nonce_count = 1 - - self._last_nonce_bytes = nonce_bytes - ncvalue = f"{self._nonce_count:08x}" - ncvalue_bytes = ncvalue.encode("utf-8") - - # Generate client nonce - cnonce = hashlib.sha1( - b"".join( - [ - str(self._nonce_count).encode("utf-8"), - nonce_bytes, - time.ctime().encode("utf-8"), - os.urandom(8), - ] - ) - ).hexdigest()[:16] - cnonce_bytes = cnonce.encode("utf-8") - - # Special handling for session-based algorithms - if algorithm.upper().endswith("-SESS"): - HA1 = H(b":".join((HA1, nonce_bytes, cnonce_bytes))) - - # Calculate the response digest - if qop: - noncebit = b":".join( - (nonce_bytes, ncvalue_bytes, cnonce_bytes, qop_bytes, HA2) - ) - response_digest = KD(HA1, noncebit) - else: - response_digest = KD(HA1, b":".join((nonce_bytes, HA2))) - - # Define a dict mapping of header fields to their values - # Group fields into always-present, optional, and qop-dependent - header_fields = { - # Always present fields - "username": escape_quotes(self._login_str), - "realm": escape_quotes(realm), - "nonce": escape_quotes(nonce), - "uri": path, - "response": response_digest.decode(), - "algorithm": algorithm, - } - - # Optional fields - if opaque: - header_fields["opaque"] = escape_quotes(opaque) - - # QoP-dependent fields - if qop: - header_fields["qop"] = qop - header_fields["nc"] = ncvalue - header_fields["cnonce"] = cnonce - - # Build header using templates for each field type - pairs: List[str] = [] - for field, value in header_fields.items(): - if field in QUOTED_AUTH_FIELDS: - pairs.append(f'{field}="{value}"') - else: - pairs.append(f"{field}={value}") - - return f"Digest {', '.join(pairs)}" - - def _in_protection_space(self, url: URL) -> bool: - """ - Check if the given URL is within the current protection space. - - According to RFC 7616, a URI is in the protection space if any URI - in the protection space is a prefix of it (after both have been made absolute). - """ - request_str = str(url) - for space_str in self._protection_space: - # Check if request starts with space URL - if not request_str.startswith(space_str): - continue - # Exact match or space ends with / (proper directory prefix) - if len(request_str) == len(space_str) or space_str[-1] == "/": - return True - # Check next char is / to ensure proper path boundary - if request_str[len(space_str)] == "/": - return True - return False - - def _authenticate(self, response: ClientResponse) -> bool: - """ - Takes the given response and tries digest-auth, if needed. - - Returns true if the original request must be resent. - """ - if response.status != 401: - return False - - auth_header = response.headers.get("www-authenticate", "") - if not auth_header: - return False # No authentication header present - - method, sep, headers = auth_header.partition(" ") - if not sep: - # No space found in www-authenticate header - return False # Malformed auth header, missing scheme separator - - if method.lower() != "digest": - # Not a digest auth challenge (could be Basic, Bearer, etc.) - return False - - if not headers: - # We have a digest scheme but no parameters - return False # Malformed digest header, missing parameters - - # We have a digest auth header with content - if not (header_pairs := parse_header_pairs(headers)): - # Failed to parse any key-value pairs - return False # Malformed digest header, no valid parameters - - # Extract challenge parameters - self._challenge = {} - for field in CHALLENGE_FIELDS: - if value := header_pairs.get(field): - self._challenge[field] = value - - # Update protection space based on domain parameter or default to origin - origin = response.url.origin() - - if domain := self._challenge.get("domain"): - # Parse space-separated list of URIs - self._protection_space = [] - for uri in domain.split(): - # Remove quotes if present - uri = uri.strip('"') - if uri.startswith("/"): - # Path-absolute, relative to origin - self._protection_space.append(str(origin.join(URL(uri)))) - else: - # Absolute URI - self._protection_space.append(str(URL(uri))) - else: - # No domain specified, protection space is entire origin - self._protection_space = [str(origin)] - - # Return True only if we found at least one challenge parameter - return bool(self._challenge) - - async def __call__( - self, request: ClientRequest, handler: ClientHandlerType - ) -> ClientResponse: - """Run the digest auth middleware.""" - response = None - for retry_count in range(2): - # Apply authorization header if: - # 1. This is a retry after 401 (retry_count > 0), OR - # 2. Preemptive auth is enabled AND we have a challenge AND the URL is in protection space - if retry_count > 0 or ( - self._preemptive - and self._challenge - and self._in_protection_space(request.url) - ): - request.headers[hdrs.AUTHORIZATION] = await self._encode( - request.method, request.url, request.body - ) - - # Send the request - response = await handler(request) - - # Check if we need to authenticate - if not self._authenticate(response): - break - - # At this point, response is guaranteed to be defined - assert response is not None - return response diff --git a/venv/lib/python3.12/site-packages/aiohttp/client_middlewares.py b/venv/lib/python3.12/site-packages/aiohttp/client_middlewares.py deleted file mode 100644 index 3ca2cb2..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/client_middlewares.py +++ /dev/null @@ -1,55 +0,0 @@ -"""Client middleware support.""" - -from collections.abc import Awaitable, Callable, Sequence - -from .client_reqrep import ClientRequest, ClientResponse - -__all__ = ("ClientMiddlewareType", "ClientHandlerType", "build_client_middlewares") - -# Type alias for client request handlers - functions that process requests and return responses -ClientHandlerType = Callable[[ClientRequest], Awaitable[ClientResponse]] - -# Type for client middleware - similar to server but uses ClientRequest/ClientResponse -ClientMiddlewareType = Callable[ - [ClientRequest, ClientHandlerType], Awaitable[ClientResponse] -] - - -def build_client_middlewares( - handler: ClientHandlerType, - middlewares: Sequence[ClientMiddlewareType], -) -> ClientHandlerType: - """ - Apply middlewares to request handler. - - The middlewares are applied in reverse order, so the first middleware - in the list wraps all subsequent middlewares and the handler. - - This implementation avoids using partial/update_wrapper to minimize overhead - and doesn't cache to avoid holding references to stateful middleware. - """ - # Optimize for single middleware case - if len(middlewares) == 1: - middleware = middlewares[0] - - async def single_middleware_handler(req: ClientRequest) -> ClientResponse: - return await middleware(req, handler) - - return single_middleware_handler - - # Build the chain for multiple middlewares - current_handler = handler - - for middleware in reversed(middlewares): - # Create a new closure that captures the current state - def make_wrapper( - mw: ClientMiddlewareType, next_h: ClientHandlerType - ) -> ClientHandlerType: - async def wrapped(req: ClientRequest) -> ClientResponse: - return await mw(req, next_h) - - return wrapped - - current_handler = make_wrapper(middleware, current_handler) - - return current_handler diff --git a/venv/lib/python3.12/site-packages/aiohttp/client_proto.py b/venv/lib/python3.12/site-packages/aiohttp/client_proto.py deleted file mode 100644 index e2fb1ce..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/client_proto.py +++ /dev/null @@ -1,359 +0,0 @@ -import asyncio -from contextlib import suppress -from typing import Any, Optional, Tuple, Union - -from .base_protocol import BaseProtocol -from .client_exceptions import ( - ClientConnectionError, - ClientOSError, - ClientPayloadError, - ServerDisconnectedError, - SocketTimeoutError, -) -from .helpers import ( - _EXC_SENTINEL, - EMPTY_BODY_STATUS_CODES, - BaseTimerContext, - set_exception, - set_result, -) -from .http import HttpResponseParser, RawResponseMessage -from .http_exceptions import HttpProcessingError -from .streams import EMPTY_PAYLOAD, DataQueue, StreamReader - - -class ResponseHandler(BaseProtocol, DataQueue[Tuple[RawResponseMessage, StreamReader]]): - """Helper class to adapt between Protocol and StreamReader.""" - - def __init__(self, loop: asyncio.AbstractEventLoop) -> None: - BaseProtocol.__init__(self, loop=loop) - DataQueue.__init__(self, loop) - - self._should_close = False - - self._payload: Optional[StreamReader] = None - self._skip_payload = False - self._payload_parser = None - - self._timer = None - - self._tail = b"" - self._upgraded = False - self._parser: Optional[HttpResponseParser] = None - - self._read_timeout: Optional[float] = None - self._read_timeout_handle: Optional[asyncio.TimerHandle] = None - - self._timeout_ceil_threshold: Optional[float] = 5 - - self._closed: Union[None, asyncio.Future[None]] = None - self._connection_lost_called = False - - @property - def closed(self) -> Union[None, asyncio.Future[None]]: - """Future that is set when the connection is closed. - - This property returns a Future that will be completed when the connection - is closed. The Future is created lazily on first access to avoid creating - futures that will never be awaited. - - Returns: - - A Future[None] if the connection is still open or was closed after - this property was accessed - - None if connection_lost() was already called before this property - was ever accessed (indicating no one is waiting for the closure) - """ - if self._closed is None and not self._connection_lost_called: - self._closed = self._loop.create_future() - return self._closed - - @property - def upgraded(self) -> bool: - return self._upgraded - - @property - def should_close(self) -> bool: - return bool( - self._should_close - or (self._payload is not None and not self._payload.is_eof()) - or self._upgraded - or self._exception is not None - or self._payload_parser is not None - or self._buffer - or self._tail - ) - - def force_close(self) -> None: - self._should_close = True - - def close(self) -> None: - self._exception = None # Break cyclic references - transport = self.transport - if transport is not None: - transport.close() - self.transport = None - self._payload = None - self._drop_timeout() - - def abort(self) -> None: - self._exception = None # Break cyclic references - transport = self.transport - if transport is not None: - transport.abort() - self.transport = None - self._payload = None - self._drop_timeout() - - def is_connected(self) -> bool: - return self.transport is not None and not self.transport.is_closing() - - def connection_lost(self, exc: Optional[BaseException]) -> None: - self._connection_lost_called = True - self._drop_timeout() - - original_connection_error = exc - reraised_exc = original_connection_error - - connection_closed_cleanly = original_connection_error is None - - if self._closed is not None: - # If someone is waiting for the closed future, - # we should set it to None or an exception. If - # self._closed is None, it means that - # connection_lost() was called already - # or nobody is waiting for it. - if connection_closed_cleanly: - set_result(self._closed, None) - else: - assert original_connection_error is not None - set_exception( - self._closed, - ClientConnectionError( - f"Connection lost: {original_connection_error !s}", - ), - original_connection_error, - ) - - if self._payload_parser is not None: - with suppress(Exception): # FIXME: log this somehow? - self._payload_parser.feed_eof() - - uncompleted = None - if self._parser is not None: - try: - uncompleted = self._parser.feed_eof() - except Exception as underlying_exc: - if self._payload is not None: - client_payload_exc_msg = ( - f"Response payload is not completed: {underlying_exc !r}" - ) - if not connection_closed_cleanly: - client_payload_exc_msg = ( - f"{client_payload_exc_msg !s}. " - f"{original_connection_error !r}" - ) - set_exception( - self._payload, - ClientPayloadError(client_payload_exc_msg), - underlying_exc, - ) - - if not self.is_eof(): - if isinstance(original_connection_error, OSError): - reraised_exc = ClientOSError(*original_connection_error.args) - if connection_closed_cleanly: - reraised_exc = ServerDisconnectedError(uncompleted) - # assigns self._should_close to True as side effect, - # we do it anyway below - underlying_non_eof_exc = ( - _EXC_SENTINEL - if connection_closed_cleanly - else original_connection_error - ) - assert underlying_non_eof_exc is not None - assert reraised_exc is not None - self.set_exception(reraised_exc, underlying_non_eof_exc) - - self._should_close = True - self._parser = None - self._payload = None - self._payload_parser = None - self._reading_paused = False - - super().connection_lost(reraised_exc) - - def eof_received(self) -> None: - # should call parser.feed_eof() most likely - self._drop_timeout() - - def pause_reading(self) -> None: - super().pause_reading() - self._drop_timeout() - - def resume_reading(self) -> None: - super().resume_reading() - self._reschedule_timeout() - - def set_exception( - self, - exc: BaseException, - exc_cause: BaseException = _EXC_SENTINEL, - ) -> None: - self._should_close = True - self._drop_timeout() - super().set_exception(exc, exc_cause) - - def set_parser(self, parser: Any, payload: Any) -> None: - # TODO: actual types are: - # parser: WebSocketReader - # payload: WebSocketDataQueue - # but they are not generi enough - # Need an ABC for both types - self._payload = payload - self._payload_parser = parser - - self._drop_timeout() - - if self._tail: - data, self._tail = self._tail, b"" - self.data_received(data) - - def set_response_params( - self, - *, - timer: Optional[BaseTimerContext] = None, - skip_payload: bool = False, - read_until_eof: bool = False, - auto_decompress: bool = True, - read_timeout: Optional[float] = None, - read_bufsize: int = 2**16, - timeout_ceil_threshold: float = 5, - max_line_size: int = 8190, - max_field_size: int = 8190, - ) -> None: - self._skip_payload = skip_payload - - self._read_timeout = read_timeout - - self._timeout_ceil_threshold = timeout_ceil_threshold - - self._parser = HttpResponseParser( - self, - self._loop, - read_bufsize, - timer=timer, - payload_exception=ClientPayloadError, - response_with_body=not skip_payload, - read_until_eof=read_until_eof, - auto_decompress=auto_decompress, - max_line_size=max_line_size, - max_field_size=max_field_size, - ) - - if self._tail: - data, self._tail = self._tail, b"" - self.data_received(data) - - def _drop_timeout(self) -> None: - if self._read_timeout_handle is not None: - self._read_timeout_handle.cancel() - self._read_timeout_handle = None - - def _reschedule_timeout(self) -> None: - timeout = self._read_timeout - if self._read_timeout_handle is not None: - self._read_timeout_handle.cancel() - - if timeout: - self._read_timeout_handle = self._loop.call_later( - timeout, self._on_read_timeout - ) - else: - self._read_timeout_handle = None - - def start_timeout(self) -> None: - self._reschedule_timeout() - - @property - def read_timeout(self) -> Optional[float]: - return self._read_timeout - - @read_timeout.setter - def read_timeout(self, read_timeout: Optional[float]) -> None: - self._read_timeout = read_timeout - - def _on_read_timeout(self) -> None: - exc = SocketTimeoutError("Timeout on reading data from socket") - self.set_exception(exc) - if self._payload is not None: - set_exception(self._payload, exc) - - def data_received(self, data: bytes) -> None: - self._reschedule_timeout() - - if not data: - return - - # custom payload parser - currently always WebSocketReader - if self._payload_parser is not None: - eof, tail = self._payload_parser.feed_data(data) - if eof: - self._payload = None - self._payload_parser = None - - if tail: - self.data_received(tail) - return - - if self._upgraded or self._parser is None: - # i.e. websocket connection, websocket parser is not set yet - self._tail += data - return - - # parse http messages - try: - messages, upgraded, tail = self._parser.feed_data(data) - except BaseException as underlying_exc: - if self.transport is not None: - # connection.release() could be called BEFORE - # data_received(), the transport is already - # closed in this case - self.transport.close() - # should_close is True after the call - if isinstance(underlying_exc, HttpProcessingError): - exc = HttpProcessingError( - code=underlying_exc.code, - message=underlying_exc.message, - headers=underlying_exc.headers, - ) - else: - exc = HttpProcessingError() - self.set_exception(exc, underlying_exc) - return - - self._upgraded = upgraded - - payload: Optional[StreamReader] = None - for message, payload in messages: - if message.should_close: - self._should_close = True - - self._payload = payload - - if self._skip_payload or message.code in EMPTY_BODY_STATUS_CODES: - self.feed_data((message, EMPTY_PAYLOAD), 0) - else: - self.feed_data((message, payload), 0) - - if payload is not None: - # new message(s) was processed - # register timeout handler unsubscribing - # either on end-of-stream or immediately for - # EMPTY_PAYLOAD - if payload is not EMPTY_PAYLOAD: - payload.on_eof(self._drop_timeout) - else: - self._drop_timeout() - - if upgraded and tail: - self.data_received(tail) diff --git a/venv/lib/python3.12/site-packages/aiohttp/client_reqrep.py b/venv/lib/python3.12/site-packages/aiohttp/client_reqrep.py deleted file mode 100644 index 3209440..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/client_reqrep.py +++ /dev/null @@ -1,1533 +0,0 @@ -import asyncio -import codecs -import contextlib -import functools -import io -import re -import sys -import traceback -import warnings -from collections.abc import Mapping -from hashlib import md5, sha1, sha256 -from http.cookies import Morsel, SimpleCookie -from types import MappingProxyType, TracebackType -from typing import ( - TYPE_CHECKING, - Any, - Callable, - Dict, - Iterable, - List, - Literal, - NamedTuple, - Optional, - Tuple, - Type, - Union, -) - -import attr -from multidict import CIMultiDict, CIMultiDictProxy, MultiDict, MultiDictProxy -from yarl import URL - -from . import hdrs, helpers, http, multipart, payload -from ._cookie_helpers import ( - parse_cookie_header, - parse_set_cookie_headers, - preserve_morsel_with_coded_value, -) -from .abc import AbstractStreamWriter -from .client_exceptions import ( - ClientConnectionError, - ClientOSError, - ClientResponseError, - ContentTypeError, - InvalidURL, - ServerFingerprintMismatch, -) -from .compression_utils import HAS_BROTLI -from .formdata import FormData -from .helpers import ( - _SENTINEL, - BaseTimerContext, - BasicAuth, - HeadersMixin, - TimerNoop, - basicauth_from_netrc, - netrc_from_env, - noop, - reify, - set_exception, - set_result, -) -from .http import ( - SERVER_SOFTWARE, - HttpVersion, - HttpVersion10, - HttpVersion11, - StreamWriter, -) -from .streams import StreamReader -from .typedefs import ( - DEFAULT_JSON_DECODER, - JSONDecoder, - LooseCookies, - LooseHeaders, - Query, - RawHeaders, -) - -if TYPE_CHECKING: - import ssl - from ssl import SSLContext -else: - try: - import ssl - from ssl import SSLContext - except ImportError: # pragma: no cover - ssl = None # type: ignore[assignment] - SSLContext = object # type: ignore[misc,assignment] - - -__all__ = ("ClientRequest", "ClientResponse", "RequestInfo", "Fingerprint") - - -if TYPE_CHECKING: - from .client import ClientSession - from .connector import Connection - from .tracing import Trace - - -_CONNECTION_CLOSED_EXCEPTION = ClientConnectionError("Connection closed") -_CONTAINS_CONTROL_CHAR_RE = re.compile(r"[^-!#$%&'*+.^_`|~0-9a-zA-Z]") -json_re = re.compile(r"^application/(?:[\w.+-]+?\+)?json") - - -def _gen_default_accept_encoding() -> str: - return "gzip, deflate, br" if HAS_BROTLI else "gzip, deflate" - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class ContentDisposition: - type: Optional[str] - parameters: "MappingProxyType[str, str]" - filename: Optional[str] - - -class _RequestInfo(NamedTuple): - url: URL - method: str - headers: "CIMultiDictProxy[str]" - real_url: URL - - -class RequestInfo(_RequestInfo): - - def __new__( - cls, - url: URL, - method: str, - headers: "CIMultiDictProxy[str]", - real_url: URL = _SENTINEL, # type: ignore[assignment] - ) -> "RequestInfo": - """Create a new RequestInfo instance. - - For backwards compatibility, the real_url parameter is optional. - """ - return tuple.__new__( - cls, (url, method, headers, url if real_url is _SENTINEL else real_url) - ) - - -class Fingerprint: - HASHFUNC_BY_DIGESTLEN = { - 16: md5, - 20: sha1, - 32: sha256, - } - - def __init__(self, fingerprint: bytes) -> None: - digestlen = len(fingerprint) - hashfunc = self.HASHFUNC_BY_DIGESTLEN.get(digestlen) - if not hashfunc: - raise ValueError("fingerprint has invalid length") - elif hashfunc is md5 or hashfunc is sha1: - raise ValueError("md5 and sha1 are insecure and not supported. Use sha256.") - self._hashfunc = hashfunc - self._fingerprint = fingerprint - - @property - def fingerprint(self) -> bytes: - return self._fingerprint - - def check(self, transport: asyncio.Transport) -> None: - if not transport.get_extra_info("sslcontext"): - return - sslobj = transport.get_extra_info("ssl_object") - cert = sslobj.getpeercert(binary_form=True) - got = self._hashfunc(cert).digest() - if got != self._fingerprint: - host, port, *_ = transport.get_extra_info("peername") - raise ServerFingerprintMismatch(self._fingerprint, got, host, port) - - -if ssl is not None: - SSL_ALLOWED_TYPES = (ssl.SSLContext, bool, Fingerprint, type(None)) -else: # pragma: no cover - SSL_ALLOWED_TYPES = (bool, type(None)) - - -def _merge_ssl_params( - ssl: Union["SSLContext", bool, Fingerprint], - verify_ssl: Optional[bool], - ssl_context: Optional["SSLContext"], - fingerprint: Optional[bytes], -) -> Union["SSLContext", bool, Fingerprint]: - if ssl is None: - ssl = True # Double check for backwards compatibility - if verify_ssl is not None and not verify_ssl: - warnings.warn( - "verify_ssl is deprecated, use ssl=False instead", - DeprecationWarning, - stacklevel=3, - ) - if ssl is not True: - raise ValueError( - "verify_ssl, ssl_context, fingerprint and ssl " - "parameters are mutually exclusive" - ) - else: - ssl = False - if ssl_context is not None: - warnings.warn( - "ssl_context is deprecated, use ssl=context instead", - DeprecationWarning, - stacklevel=3, - ) - if ssl is not True: - raise ValueError( - "verify_ssl, ssl_context, fingerprint and ssl " - "parameters are mutually exclusive" - ) - else: - ssl = ssl_context - if fingerprint is not None: - warnings.warn( - "fingerprint is deprecated, use ssl=Fingerprint(fingerprint) instead", - DeprecationWarning, - stacklevel=3, - ) - if ssl is not True: - raise ValueError( - "verify_ssl, ssl_context, fingerprint and ssl " - "parameters are mutually exclusive" - ) - else: - ssl = Fingerprint(fingerprint) - if not isinstance(ssl, SSL_ALLOWED_TYPES): - raise TypeError( - "ssl should be SSLContext, bool, Fingerprint or None, " - "got {!r} instead.".format(ssl) - ) - return ssl - - -_SSL_SCHEMES = frozenset(("https", "wss")) - - -# ConnectionKey is a NamedTuple because it is used as a key in a dict -# and a set in the connector. Since a NamedTuple is a tuple it uses -# the fast native tuple __hash__ and __eq__ implementation in CPython. -class ConnectionKey(NamedTuple): - # the key should contain an information about used proxy / TLS - # to prevent reusing wrong connections from a pool - host: str - port: Optional[int] - is_ssl: bool - ssl: Union[SSLContext, bool, Fingerprint] - proxy: Optional[URL] - proxy_auth: Optional[BasicAuth] - proxy_headers_hash: Optional[int] # hash(CIMultiDict) - - -def _is_expected_content_type( - response_content_type: str, expected_content_type: str -) -> bool: - if expected_content_type == "application/json": - return json_re.match(response_content_type) is not None - return expected_content_type in response_content_type - - -def _warn_if_unclosed_payload(payload: payload.Payload, stacklevel: int = 2) -> None: - """Warn if the payload is not closed. - - Callers must check that the body is a Payload before calling this method. - - Args: - payload: The payload to check - stacklevel: Stack level for the warning (default 2 for direct callers) - """ - if not payload.autoclose and not payload.consumed: - warnings.warn( - "The previous request body contains unclosed resources. " - "Use await request.update_body() instead of setting request.body " - "directly to properly close resources and avoid leaks.", - ResourceWarning, - stacklevel=stacklevel, - ) - - -class ClientResponse(HeadersMixin): - - # Some of these attributes are None when created, - # but will be set by the start() method. - # As the end user will likely never see the None values, we cheat the types below. - # from the Status-Line of the response - version: Optional[HttpVersion] = None # HTTP-Version - status: int = None # type: ignore[assignment] # Status-Code - reason: Optional[str] = None # Reason-Phrase - - content: StreamReader = None # type: ignore[assignment] # Payload stream - _body: Optional[bytes] = None - _headers: CIMultiDictProxy[str] = None # type: ignore[assignment] - _history: Tuple["ClientResponse", ...] = () - _raw_headers: RawHeaders = None # type: ignore[assignment] - - _connection: Optional["Connection"] = None # current connection - _cookies: Optional[SimpleCookie] = None - _raw_cookie_headers: Optional[Tuple[str, ...]] = None - _continue: Optional["asyncio.Future[bool]"] = None - _source_traceback: Optional[traceback.StackSummary] = None - _session: Optional["ClientSession"] = None - # set up by ClientRequest after ClientResponse object creation - # post-init stage allows to not change ctor signature - _closed = True # to allow __del__ for non-initialized properly response - _released = False - _in_context = False - - _resolve_charset: Callable[["ClientResponse", bytes], str] = lambda *_: "utf-8" - - __writer: Optional["asyncio.Task[None]"] = None - - def __init__( - self, - method: str, - url: URL, - *, - writer: "Optional[asyncio.Task[None]]", - continue100: Optional["asyncio.Future[bool]"], - timer: BaseTimerContext, - request_info: RequestInfo, - traces: List["Trace"], - loop: asyncio.AbstractEventLoop, - session: "ClientSession", - ) -> None: - # URL forbids subclasses, so a simple type check is enough. - assert type(url) is URL - - self.method = method - - self._real_url = url - self._url = url.with_fragment(None) if url.raw_fragment else url - if writer is not None: - self._writer = writer - if continue100 is not None: - self._continue = continue100 - self._request_info = request_info - self._timer = timer if timer is not None else TimerNoop() - self._cache: Dict[str, Any] = {} - self._traces = traces - self._loop = loop - # Save reference to _resolve_charset, so that get_encoding() will still - # work after the response has finished reading the body. - # TODO: Fix session=None in tests (see ClientRequest.__init__). - if session is not None: - # store a reference to session #1985 - self._session = session - self._resolve_charset = session._resolve_charset - if loop.get_debug(): - self._source_traceback = traceback.extract_stack(sys._getframe(1)) - - def __reset_writer(self, _: object = None) -> None: - self.__writer = None - - @property - def _writer(self) -> Optional["asyncio.Task[None]"]: - """The writer task for streaming data. - - _writer is only provided for backwards compatibility - for subclasses that may need to access it. - """ - return self.__writer - - @_writer.setter - def _writer(self, writer: Optional["asyncio.Task[None]"]) -> None: - """Set the writer task for streaming data.""" - if self.__writer is not None: - self.__writer.remove_done_callback(self.__reset_writer) - self.__writer = writer - if writer is None: - return - if writer.done(): - # The writer is already done, so we can clear it immediately. - self.__writer = None - else: - writer.add_done_callback(self.__reset_writer) - - @property - def cookies(self) -> SimpleCookie: - if self._cookies is None: - if self._raw_cookie_headers is not None: - # Parse cookies for response.cookies (SimpleCookie for backward compatibility) - cookies = SimpleCookie() - # Use parse_set_cookie_headers for more lenient parsing that handles - # malformed cookies better than SimpleCookie.load - cookies.update(parse_set_cookie_headers(self._raw_cookie_headers)) - self._cookies = cookies - else: - self._cookies = SimpleCookie() - return self._cookies - - @cookies.setter - def cookies(self, cookies: SimpleCookie) -> None: - self._cookies = cookies - # Generate raw cookie headers from the SimpleCookie - if cookies: - self._raw_cookie_headers = tuple( - morsel.OutputString() for morsel in cookies.values() - ) - else: - self._raw_cookie_headers = None - - @reify - def url(self) -> URL: - return self._url - - @reify - def url_obj(self) -> URL: - warnings.warn("Deprecated, use .url #1654", DeprecationWarning, stacklevel=2) - return self._url - - @reify - def real_url(self) -> URL: - return self._real_url - - @reify - def host(self) -> str: - assert self._url.host is not None - return self._url.host - - @reify - def headers(self) -> "CIMultiDictProxy[str]": - return self._headers - - @reify - def raw_headers(self) -> RawHeaders: - return self._raw_headers - - @reify - def request_info(self) -> RequestInfo: - return self._request_info - - @reify - def content_disposition(self) -> Optional[ContentDisposition]: - raw = self._headers.get(hdrs.CONTENT_DISPOSITION) - if raw is None: - return None - disposition_type, params_dct = multipart.parse_content_disposition(raw) - params = MappingProxyType(params_dct) - filename = multipart.content_disposition_filename(params) - return ContentDisposition(disposition_type, params, filename) - - def __del__(self, _warnings: Any = warnings) -> None: - if self._closed: - return - - if self._connection is not None: - self._connection.release() - self._cleanup_writer() - - if self._loop.get_debug(): - kwargs = {"source": self} - _warnings.warn(f"Unclosed response {self!r}", ResourceWarning, **kwargs) - context = {"client_response": self, "message": "Unclosed response"} - if self._source_traceback: - context["source_traceback"] = self._source_traceback - self._loop.call_exception_handler(context) - - def __repr__(self) -> str: - out = io.StringIO() - ascii_encodable_url = str(self.url) - if self.reason: - ascii_encodable_reason = self.reason.encode( - "ascii", "backslashreplace" - ).decode("ascii") - else: - ascii_encodable_reason = "None" - print( - "".format( - ascii_encodable_url, self.status, ascii_encodable_reason - ), - file=out, - ) - print(self.headers, file=out) - return out.getvalue() - - @property - def connection(self) -> Optional["Connection"]: - return self._connection - - @reify - def history(self) -> Tuple["ClientResponse", ...]: - """A sequence of of responses, if redirects occurred.""" - return self._history - - @reify - def links(self) -> "MultiDictProxy[MultiDictProxy[Union[str, URL]]]": - links_str = ", ".join(self.headers.getall("link", [])) - - if not links_str: - return MultiDictProxy(MultiDict()) - - links: MultiDict[MultiDictProxy[Union[str, URL]]] = MultiDict() - - for val in re.split(r",(?=\s*<)", links_str): - match = re.match(r"\s*<(.*)>(.*)", val) - if match is None: # pragma: no cover - # the check exists to suppress mypy error - continue - url, params_str = match.groups() - params = params_str.split(";")[1:] - - link: MultiDict[Union[str, URL]] = MultiDict() - - for param in params: - match = re.match(r"^\s*(\S*)\s*=\s*(['\"]?)(.*?)(\2)\s*$", param, re.M) - if match is None: # pragma: no cover - # the check exists to suppress mypy error - continue - key, _, value, _ = match.groups() - - link.add(key, value) - - key = link.get("rel", url) - - link.add("url", self.url.join(URL(url))) - - links.add(str(key), MultiDictProxy(link)) - - return MultiDictProxy(links) - - async def start(self, connection: "Connection") -> "ClientResponse": - """Start response processing.""" - self._closed = False - self._protocol = connection.protocol - self._connection = connection - - with self._timer: - while True: - # read response - try: - protocol = self._protocol - message, payload = await protocol.read() # type: ignore[union-attr] - except http.HttpProcessingError as exc: - raise ClientResponseError( - self.request_info, - self.history, - status=exc.code, - message=exc.message, - headers=exc.headers, - ) from exc - - if message.code < 100 or message.code > 199 or message.code == 101: - break - - if self._continue is not None: - set_result(self._continue, True) - self._continue = None - - # payload eof handler - payload.on_eof(self._response_eof) - - # response status - self.version = message.version - self.status = message.code - self.reason = message.reason - - # headers - self._headers = message.headers # type is CIMultiDictProxy - self._raw_headers = message.raw_headers # type is Tuple[bytes, bytes] - - # payload - self.content = payload - - # cookies - if cookie_hdrs := self.headers.getall(hdrs.SET_COOKIE, ()): - # Store raw cookie headers for CookieJar - self._raw_cookie_headers = tuple(cookie_hdrs) - return self - - def _response_eof(self) -> None: - if self._closed: - return - - # protocol could be None because connection could be detached - protocol = self._connection and self._connection.protocol - if protocol is not None and protocol.upgraded: - return - - self._closed = True - self._cleanup_writer() - self._release_connection() - - @property - def closed(self) -> bool: - return self._closed - - def close(self) -> None: - if not self._released: - self._notify_content() - - self._closed = True - if self._loop is None or self._loop.is_closed(): - return - - self._cleanup_writer() - if self._connection is not None: - self._connection.close() - self._connection = None - - def release(self) -> Any: - if not self._released: - self._notify_content() - - self._closed = True - - self._cleanup_writer() - self._release_connection() - return noop() - - @property - def ok(self) -> bool: - """Returns ``True`` if ``status`` is less than ``400``, ``False`` if not. - - This is **not** a check for ``200 OK`` but a check that the response - status is under 400. - """ - return 400 > self.status - - def raise_for_status(self) -> None: - if not self.ok: - # reason should always be not None for a started response - assert self.reason is not None - - # If we're in a context we can rely on __aexit__() to release as the - # exception propagates. - if not self._in_context: - self.release() - - raise ClientResponseError( - self.request_info, - self.history, - status=self.status, - message=self.reason, - headers=self.headers, - ) - - def _release_connection(self) -> None: - if self._connection is not None: - if self.__writer is None: - self._connection.release() - self._connection = None - else: - self.__writer.add_done_callback(lambda f: self._release_connection()) - - async def _wait_released(self) -> None: - if self.__writer is not None: - try: - await self.__writer - except asyncio.CancelledError: - if ( - sys.version_info >= (3, 11) - and (task := asyncio.current_task()) - and task.cancelling() - ): - raise - self._release_connection() - - def _cleanup_writer(self) -> None: - if self.__writer is not None: - self.__writer.cancel() - self._session = None - - def _notify_content(self) -> None: - content = self.content - if content and content.exception() is None: - set_exception(content, _CONNECTION_CLOSED_EXCEPTION) - self._released = True - - async def wait_for_close(self) -> None: - if self.__writer is not None: - try: - await self.__writer - except asyncio.CancelledError: - if ( - sys.version_info >= (3, 11) - and (task := asyncio.current_task()) - and task.cancelling() - ): - raise - self.release() - - async def read(self) -> bytes: - """Read response payload.""" - if self._body is None: - try: - self._body = await self.content.read() - for trace in self._traces: - await trace.send_response_chunk_received( - self.method, self.url, self._body - ) - except BaseException: - self.close() - raise - elif self._released: # Response explicitly released - raise ClientConnectionError("Connection closed") - - protocol = self._connection and self._connection.protocol - if protocol is None or not protocol.upgraded: - await self._wait_released() # Underlying connection released - return self._body - - def get_encoding(self) -> str: - ctype = self.headers.get(hdrs.CONTENT_TYPE, "").lower() - mimetype = helpers.parse_mimetype(ctype) - - encoding = mimetype.parameters.get("charset") - if encoding: - with contextlib.suppress(LookupError, ValueError): - return codecs.lookup(encoding).name - - if mimetype.type == "application" and ( - mimetype.subtype == "json" or mimetype.subtype == "rdap" - ): - # RFC 7159 states that the default encoding is UTF-8. - # RFC 7483 defines application/rdap+json - return "utf-8" - - if self._body is None: - raise RuntimeError( - "Cannot compute fallback encoding of a not yet read body" - ) - - return self._resolve_charset(self, self._body) - - async def text(self, encoding: Optional[str] = None, errors: str = "strict") -> str: - """Read response payload and decode.""" - if self._body is None: - await self.read() - - if encoding is None: - encoding = self.get_encoding() - - return self._body.decode(encoding, errors=errors) # type: ignore[union-attr] - - async def json( - self, - *, - encoding: Optional[str] = None, - loads: JSONDecoder = DEFAULT_JSON_DECODER, - content_type: Optional[str] = "application/json", - ) -> Any: - """Read and decodes JSON response.""" - if self._body is None: - await self.read() - - if content_type: - ctype = self.headers.get(hdrs.CONTENT_TYPE, "").lower() - if not _is_expected_content_type(ctype, content_type): - raise ContentTypeError( - self.request_info, - self.history, - status=self.status, - message=( - "Attempt to decode JSON with unexpected mimetype: %s" % ctype - ), - headers=self.headers, - ) - - stripped = self._body.strip() # type: ignore[union-attr] - if not stripped: - return None - - if encoding is None: - encoding = self.get_encoding() - - return loads(stripped.decode(encoding)) - - async def __aenter__(self) -> "ClientResponse": - self._in_context = True - return self - - async def __aexit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - self._in_context = False - # similar to _RequestContextManager, we do not need to check - # for exceptions, response object can close connection - # if state is broken - self.release() - await self.wait_for_close() - - -class ClientRequest: - GET_METHODS = { - hdrs.METH_GET, - hdrs.METH_HEAD, - hdrs.METH_OPTIONS, - hdrs.METH_TRACE, - } - POST_METHODS = {hdrs.METH_PATCH, hdrs.METH_POST, hdrs.METH_PUT} - ALL_METHODS = GET_METHODS.union(POST_METHODS).union({hdrs.METH_DELETE}) - - DEFAULT_HEADERS = { - hdrs.ACCEPT: "*/*", - hdrs.ACCEPT_ENCODING: _gen_default_accept_encoding(), - } - - # Type of body depends on PAYLOAD_REGISTRY, which is dynamic. - _body: Union[None, payload.Payload] = None - auth = None - response = None - - __writer: Optional["asyncio.Task[None]"] = None # async task for streaming data - - # These class defaults help create_autospec() work correctly. - # If autospec is improved in future, maybe these can be removed. - url = URL() - method = "GET" - - _continue = None # waiter future for '100 Continue' response - - _skip_auto_headers: Optional["CIMultiDict[None]"] = None - - # N.B. - # Adding __del__ method with self._writer closing doesn't make sense - # because _writer is instance method, thus it keeps a reference to self. - # Until writer has finished finalizer will not be called. - - def __init__( - self, - method: str, - url: URL, - *, - params: Query = None, - headers: Optional[LooseHeaders] = None, - skip_auto_headers: Optional[Iterable[str]] = None, - data: Any = None, - cookies: Optional[LooseCookies] = None, - auth: Optional[BasicAuth] = None, - version: http.HttpVersion = http.HttpVersion11, - compress: Union[str, bool, None] = None, - chunked: Optional[bool] = None, - expect100: bool = False, - loop: Optional[asyncio.AbstractEventLoop] = None, - response_class: Optional[Type["ClientResponse"]] = None, - proxy: Optional[URL] = None, - proxy_auth: Optional[BasicAuth] = None, - timer: Optional[BaseTimerContext] = None, - session: Optional["ClientSession"] = None, - ssl: Union[SSLContext, bool, Fingerprint] = True, - proxy_headers: Optional[LooseHeaders] = None, - traces: Optional[List["Trace"]] = None, - trust_env: bool = False, - server_hostname: Optional[str] = None, - ): - if loop is None: - loop = asyncio.get_event_loop() - if match := _CONTAINS_CONTROL_CHAR_RE.search(method): - raise ValueError( - f"Method cannot contain non-token characters {method!r} " - f"(found at least {match.group()!r})" - ) - # URL forbids subclasses, so a simple type check is enough. - assert type(url) is URL, url - if proxy is not None: - assert type(proxy) is URL, proxy - # FIXME: session is None in tests only, need to fix tests - # assert session is not None - if TYPE_CHECKING: - assert session is not None - self._session = session - if params: - url = url.extend_query(params) - self.original_url = url - self.url = url.with_fragment(None) if url.raw_fragment else url - self.method = method.upper() - self.chunked = chunked - self.compress = compress - self.loop = loop - self.length = None - if response_class is None: - real_response_class = ClientResponse - else: - real_response_class = response_class - self.response_class: Type[ClientResponse] = real_response_class - self._timer = timer if timer is not None else TimerNoop() - self._ssl = ssl if ssl is not None else True - self.server_hostname = server_hostname - - if loop.get_debug(): - self._source_traceback = traceback.extract_stack(sys._getframe(1)) - - self.update_version(version) - self.update_host(url) - self.update_headers(headers) - self.update_auto_headers(skip_auto_headers) - self.update_cookies(cookies) - self.update_content_encoding(data) - self.update_auth(auth, trust_env) - self.update_proxy(proxy, proxy_auth, proxy_headers) - - self.update_body_from_data(data) - if data is not None or self.method not in self.GET_METHODS: - self.update_transfer_encoding() - self.update_expect_continue(expect100) - self._traces = [] if traces is None else traces - - def __reset_writer(self, _: object = None) -> None: - self.__writer = None - - def _get_content_length(self) -> Optional[int]: - """Extract and validate Content-Length header value. - - Returns parsed Content-Length value or None if not set. - Raises ValueError if header exists but cannot be parsed as an integer. - """ - if hdrs.CONTENT_LENGTH not in self.headers: - return None - - content_length_hdr = self.headers[hdrs.CONTENT_LENGTH] - try: - return int(content_length_hdr) - except ValueError: - raise ValueError( - f"Invalid Content-Length header: {content_length_hdr}" - ) from None - - @property - def skip_auto_headers(self) -> CIMultiDict[None]: - return self._skip_auto_headers or CIMultiDict() - - @property - def _writer(self) -> Optional["asyncio.Task[None]"]: - return self.__writer - - @_writer.setter - def _writer(self, writer: "asyncio.Task[None]") -> None: - if self.__writer is not None: - self.__writer.remove_done_callback(self.__reset_writer) - self.__writer = writer - writer.add_done_callback(self.__reset_writer) - - def is_ssl(self) -> bool: - return self.url.scheme in _SSL_SCHEMES - - @property - def ssl(self) -> Union["SSLContext", bool, Fingerprint]: - return self._ssl - - @property - def connection_key(self) -> ConnectionKey: - if proxy_headers := self.proxy_headers: - h: Optional[int] = hash(tuple(proxy_headers.items())) - else: - h = None - url = self.url - return tuple.__new__( - ConnectionKey, - ( - url.raw_host or "", - url.port, - url.scheme in _SSL_SCHEMES, - self._ssl, - self.proxy, - self.proxy_auth, - h, - ), - ) - - @property - def host(self) -> str: - ret = self.url.raw_host - assert ret is not None - return ret - - @property - def port(self) -> Optional[int]: - return self.url.port - - @property - def body(self) -> Union[payload.Payload, Literal[b""]]: - """Request body.""" - # empty body is represented as bytes for backwards compatibility - return self._body or b"" - - @body.setter - def body(self, value: Any) -> None: - """Set request body with warning for non-autoclose payloads. - - WARNING: This setter must be called from within an event loop and is not - thread-safe. Setting body outside of an event loop may raise RuntimeError - when closing file-based payloads. - - DEPRECATED: Direct assignment to body is deprecated and will be removed - in a future version. Use await update_body() instead for proper resource - management. - """ - # Close existing payload if present - if self._body is not None: - # Warn if the payload needs manual closing - # stacklevel=3: user code -> body setter -> _warn_if_unclosed_payload - _warn_if_unclosed_payload(self._body, stacklevel=3) - # NOTE: In the future, when we remove sync close support, - # this setter will need to be removed and only the async - # update_body() method will be available. For now, we call - # _close() for backwards compatibility. - self._body._close() - self._update_body(value) - - @property - def request_info(self) -> RequestInfo: - headers: CIMultiDictProxy[str] = CIMultiDictProxy(self.headers) - # These are created on every request, so we use a NamedTuple - # for performance reasons. We don't use the RequestInfo.__new__ - # method because it has a different signature which is provided - # for backwards compatibility only. - return tuple.__new__( - RequestInfo, (self.url, self.method, headers, self.original_url) - ) - - @property - def session(self) -> "ClientSession": - """Return the ClientSession instance. - - This property provides access to the ClientSession that initiated - this request, allowing middleware to make additional requests - using the same session. - """ - return self._session - - def update_host(self, url: URL) -> None: - """Update destination host, port and connection type (ssl).""" - # get host/port - if not url.raw_host: - raise InvalidURL(url) - - # basic auth info - if url.raw_user or url.raw_password: - self.auth = helpers.BasicAuth(url.user or "", url.password or "") - - def update_version(self, version: Union[http.HttpVersion, str]) -> None: - """Convert request version to two elements tuple. - - parser HTTP version '1.1' => (1, 1) - """ - if isinstance(version, str): - v = [part.strip() for part in version.split(".", 1)] - try: - version = http.HttpVersion(int(v[0]), int(v[1])) - except ValueError: - raise ValueError( - f"Can not parse http version number: {version}" - ) from None - self.version = version - - def update_headers(self, headers: Optional[LooseHeaders]) -> None: - """Update request headers.""" - self.headers: CIMultiDict[str] = CIMultiDict() - - # Build the host header - host = self.url.host_port_subcomponent - - # host_port_subcomponent is None when the URL is a relative URL. - # but we know we do not have a relative URL here. - assert host is not None - self.headers[hdrs.HOST] = host - - if not headers: - return - - if isinstance(headers, (dict, MultiDictProxy, MultiDict)): - headers = headers.items() - - for key, value in headers: # type: ignore[misc] - # A special case for Host header - if key in hdrs.HOST_ALL: - self.headers[key] = value - else: - self.headers.add(key, value) - - def update_auto_headers(self, skip_auto_headers: Optional[Iterable[str]]) -> None: - if skip_auto_headers is not None: - self._skip_auto_headers = CIMultiDict( - (hdr, None) for hdr in sorted(skip_auto_headers) - ) - used_headers = self.headers.copy() - used_headers.extend(self._skip_auto_headers) # type: ignore[arg-type] - else: - # Fast path when there are no headers to skip - # which is the most common case. - used_headers = self.headers - - for hdr, val in self.DEFAULT_HEADERS.items(): - if hdr not in used_headers: - self.headers[hdr] = val - - if hdrs.USER_AGENT not in used_headers: - self.headers[hdrs.USER_AGENT] = SERVER_SOFTWARE - - def update_cookies(self, cookies: Optional[LooseCookies]) -> None: - """Update request cookies header.""" - if not cookies: - return - - c = SimpleCookie() - if hdrs.COOKIE in self.headers: - # parse_cookie_header for RFC 6265 compliant Cookie header parsing - c.update(parse_cookie_header(self.headers.get(hdrs.COOKIE, ""))) - del self.headers[hdrs.COOKIE] - - if isinstance(cookies, Mapping): - iter_cookies = cookies.items() - else: - iter_cookies = cookies # type: ignore[assignment] - for name, value in iter_cookies: - if isinstance(value, Morsel): - # Use helper to preserve coded_value exactly as sent by server - c[name] = preserve_morsel_with_coded_value(value) - else: - c[name] = value # type: ignore[assignment] - - self.headers[hdrs.COOKIE] = c.output(header="", sep=";").strip() - - def update_content_encoding(self, data: Any) -> None: - """Set request content encoding.""" - if not data: - # Don't compress an empty body. - self.compress = None - return - - if self.headers.get(hdrs.CONTENT_ENCODING): - if self.compress: - raise ValueError( - "compress can not be set if Content-Encoding header is set" - ) - elif self.compress: - if not isinstance(self.compress, str): - self.compress = "deflate" - self.headers[hdrs.CONTENT_ENCODING] = self.compress - self.chunked = True # enable chunked, no need to deal with length - - def update_transfer_encoding(self) -> None: - """Analyze transfer-encoding header.""" - te = self.headers.get(hdrs.TRANSFER_ENCODING, "").lower() - - if "chunked" in te: - if self.chunked: - raise ValueError( - "chunked can not be set " - 'if "Transfer-Encoding: chunked" header is set' - ) - - elif self.chunked: - if hdrs.CONTENT_LENGTH in self.headers: - raise ValueError( - "chunked can not be set if Content-Length header is set" - ) - - self.headers[hdrs.TRANSFER_ENCODING] = "chunked" - - def update_auth(self, auth: Optional[BasicAuth], trust_env: bool = False) -> None: - """Set basic auth.""" - if auth is None: - auth = self.auth - if auth is None and trust_env and self.url.host is not None: - netrc_obj = netrc_from_env() - with contextlib.suppress(LookupError): - auth = basicauth_from_netrc(netrc_obj, self.url.host) - if auth is None: - return - - if not isinstance(auth, helpers.BasicAuth): - raise TypeError("BasicAuth() tuple is required instead") - - self.headers[hdrs.AUTHORIZATION] = auth.encode() - - def update_body_from_data(self, body: Any, _stacklevel: int = 3) -> None: - """Update request body from data.""" - if self._body is not None: - _warn_if_unclosed_payload(self._body, stacklevel=_stacklevel) - - if body is None: - self._body = None - # Set Content-Length to 0 when body is None for methods that expect a body - if ( - self.method not in self.GET_METHODS - and not self.chunked - and hdrs.CONTENT_LENGTH not in self.headers - ): - self.headers[hdrs.CONTENT_LENGTH] = "0" - return - - # FormData - maybe_payload = body() if isinstance(body, FormData) else body - - try: - body_payload = payload.PAYLOAD_REGISTRY.get(maybe_payload, disposition=None) - except payload.LookupError: - body_payload = FormData(maybe_payload)() # type: ignore[arg-type] - - self._body = body_payload - # enable chunked encoding if needed - if not self.chunked and hdrs.CONTENT_LENGTH not in self.headers: - if (size := body_payload.size) is not None: - self.headers[hdrs.CONTENT_LENGTH] = str(size) - else: - self.chunked = True - - # copy payload headers - assert body_payload.headers - headers = self.headers - skip_headers = self._skip_auto_headers - for key, value in body_payload.headers.items(): - if key in headers or (skip_headers is not None and key in skip_headers): - continue - headers[key] = value - - def _update_body(self, body: Any) -> None: - """Update request body after its already been set.""" - # Remove existing Content-Length header since body is changing - if hdrs.CONTENT_LENGTH in self.headers: - del self.headers[hdrs.CONTENT_LENGTH] - - # Remove existing Transfer-Encoding header to avoid conflicts - if self.chunked and hdrs.TRANSFER_ENCODING in self.headers: - del self.headers[hdrs.TRANSFER_ENCODING] - - # Now update the body using the existing method - # Called from _update_body, add 1 to stacklevel from caller - self.update_body_from_data(body, _stacklevel=4) - - # Update transfer encoding headers if needed (same logic as __init__) - if body is not None or self.method not in self.GET_METHODS: - self.update_transfer_encoding() - - async def update_body(self, body: Any) -> None: - """ - Update request body and close previous payload if needed. - - This method safely updates the request body by first closing any existing - payload to prevent resource leaks, then setting the new body. - - IMPORTANT: Always use this method instead of setting request.body directly. - Direct assignment to request.body will leak resources if the previous body - contains file handles, streams, or other resources that need cleanup. - - Args: - body: The new body content. Can be: - - bytes/bytearray: Raw binary data - - str: Text data (will be encoded using charset from Content-Type) - - FormData: Form data that will be encoded as multipart/form-data - - Payload: A pre-configured payload object - - AsyncIterable: An async iterable of bytes chunks - - File-like object: Will be read and sent as binary data - - None: Clears the body - - Usage: - # CORRECT: Use update_body - await request.update_body(b"new request data") - - # WRONG: Don't set body directly - # request.body = b"new request data" # This will leak resources! - - # Update with form data - form_data = FormData() - form_data.add_field('field', 'value') - await request.update_body(form_data) - - # Clear body - await request.update_body(None) - - Note: - This method is async because it may need to close file handles or - other resources associated with the previous payload. Always await - this method to ensure proper cleanup. - - Warning: - Setting request.body directly is highly discouraged and can lead to: - - Resource leaks (unclosed file handles, streams) - - Memory leaks (unreleased buffers) - - Unexpected behavior with streaming payloads - - It is not recommended to change the payload type in middleware. If the - body was already set (e.g., as bytes), it's best to keep the same type - rather than converting it (e.g., to str) as this may result in unexpected - behavior. - - See Also: - - update_body_from_data: Synchronous body update without cleanup - - body property: Direct body access (STRONGLY DISCOURAGED) - - """ - # Close existing payload if it exists and needs closing - if self._body is not None: - await self._body.close() - self._update_body(body) - - def update_expect_continue(self, expect: bool = False) -> None: - if expect: - self.headers[hdrs.EXPECT] = "100-continue" - elif ( - hdrs.EXPECT in self.headers - and self.headers[hdrs.EXPECT].lower() == "100-continue" - ): - expect = True - - if expect: - self._continue = self.loop.create_future() - - def update_proxy( - self, - proxy: Optional[URL], - proxy_auth: Optional[BasicAuth], - proxy_headers: Optional[LooseHeaders], - ) -> None: - self.proxy = proxy - if proxy is None: - self.proxy_auth = None - self.proxy_headers = None - return - - if proxy_auth and not isinstance(proxy_auth, helpers.BasicAuth): - raise ValueError("proxy_auth must be None or BasicAuth() tuple") - self.proxy_auth = proxy_auth - - if proxy_headers is not None and not isinstance( - proxy_headers, (MultiDict, MultiDictProxy) - ): - proxy_headers = CIMultiDict(proxy_headers) - self.proxy_headers = proxy_headers - - async def write_bytes( - self, - writer: AbstractStreamWriter, - conn: "Connection", - content_length: Optional[int], - ) -> None: - """ - Write the request body to the connection stream. - - This method handles writing different types of request bodies: - 1. Payload objects (using their specialized write_with_length method) - 2. Bytes/bytearray objects - 3. Iterable body content - - Args: - writer: The stream writer to write the body to - conn: The connection being used for this request - content_length: Optional maximum number of bytes to write from the body - (None means write the entire body) - - The method properly handles: - - Waiting for 100-Continue responses if required - - Content length constraints for chunked encoding - - Error handling for network issues, cancellation, and other exceptions - - Signaling EOF and timeout management - - Raises: - ClientOSError: When there's an OS-level error writing the body - ClientConnectionError: When there's a general connection error - asyncio.CancelledError: When the operation is cancelled - - """ - # 100 response - if self._continue is not None: - # Force headers to be sent before waiting for 100-continue - writer.send_headers() - await writer.drain() - await self._continue - - protocol = conn.protocol - assert protocol is not None - try: - # This should be a rare case but the - # self._body can be set to None while - # the task is being started or we wait above - # for the 100-continue response. - # The more likely case is we have an empty - # payload, but 100-continue is still expected. - if self._body is not None: - await self._body.write_with_length(writer, content_length) - except OSError as underlying_exc: - reraised_exc = underlying_exc - - # Distinguish between timeout and other OS errors for better error reporting - exc_is_not_timeout = underlying_exc.errno is not None or not isinstance( - underlying_exc, asyncio.TimeoutError - ) - if exc_is_not_timeout: - reraised_exc = ClientOSError( - underlying_exc.errno, - f"Can not write request body for {self.url !s}", - ) - - set_exception(protocol, reraised_exc, underlying_exc) - except asyncio.CancelledError: - # Body hasn't been fully sent, so connection can't be reused - conn.close() - raise - except Exception as underlying_exc: - set_exception( - protocol, - ClientConnectionError( - "Failed to send bytes into the underlying connection " - f"{conn !s}: {underlying_exc!r}", - ), - underlying_exc, - ) - else: - # Successfully wrote the body, signal EOF and start response timeout - await writer.write_eof() - protocol.start_timeout() - - async def send(self, conn: "Connection") -> "ClientResponse": - # Specify request target: - # - CONNECT request must send authority form URI - # - not CONNECT proxy must send absolute form URI - # - most common is origin form URI - if self.method == hdrs.METH_CONNECT: - connect_host = self.url.host_subcomponent - assert connect_host is not None - path = f"{connect_host}:{self.url.port}" - elif self.proxy and not self.is_ssl(): - path = str(self.url) - else: - path = self.url.raw_path_qs - - protocol = conn.protocol - assert protocol is not None - writer = StreamWriter( - protocol, - self.loop, - on_chunk_sent=( - functools.partial(self._on_chunk_request_sent, self.method, self.url) - if self._traces - else None - ), - on_headers_sent=( - functools.partial(self._on_headers_request_sent, self.method, self.url) - if self._traces - else None - ), - ) - - if self.compress: - writer.enable_compression(self.compress) # type: ignore[arg-type] - - if self.chunked is not None: - writer.enable_chunking() - - # set default content-type - if ( - self.method in self.POST_METHODS - and ( - self._skip_auto_headers is None - or hdrs.CONTENT_TYPE not in self._skip_auto_headers - ) - and hdrs.CONTENT_TYPE not in self.headers - ): - self.headers[hdrs.CONTENT_TYPE] = "application/octet-stream" - - v = self.version - if hdrs.CONNECTION not in self.headers: - if conn._connector.force_close: - if v == HttpVersion11: - self.headers[hdrs.CONNECTION] = "close" - elif v == HttpVersion10: - self.headers[hdrs.CONNECTION] = "keep-alive" - - # status + headers - status_line = f"{self.method} {path} HTTP/{v.major}.{v.minor}" - - # Buffer headers for potential coalescing with body - await writer.write_headers(status_line, self.headers) - - task: Optional["asyncio.Task[None]"] - if self._body or self._continue is not None or protocol.writing_paused: - coro = self.write_bytes(writer, conn, self._get_content_length()) - if sys.version_info >= (3, 12): - # Optimization for Python 3.12, try to write - # bytes immediately to avoid having to schedule - # the task on the event loop. - task = asyncio.Task(coro, loop=self.loop, eager_start=True) - else: - task = self.loop.create_task(coro) - if task.done(): - task = None - else: - self._writer = task - else: - # We have nothing to write because - # - there is no body - # - the protocol does not have writing paused - # - we are not waiting for a 100-continue response - protocol.start_timeout() - writer.set_eof() - task = None - response_class = self.response_class - assert response_class is not None - self.response = response_class( - self.method, - self.original_url, - writer=task, - continue100=self._continue, - timer=self._timer, - request_info=self.request_info, - traces=self._traces, - loop=self.loop, - session=self._session, - ) - return self.response - - async def close(self) -> None: - if self.__writer is not None: - try: - await self.__writer - except asyncio.CancelledError: - if ( - sys.version_info >= (3, 11) - and (task := asyncio.current_task()) - and task.cancelling() - ): - raise - - def terminate(self) -> None: - if self.__writer is not None: - if not self.loop.is_closed(): - self.__writer.cancel() - self.__writer.remove_done_callback(self.__reset_writer) - self.__writer = None - - async def _on_chunk_request_sent(self, method: str, url: URL, chunk: bytes) -> None: - for trace in self._traces: - await trace.send_request_chunk_sent(method, url, chunk) - - async def _on_headers_request_sent( - self, method: str, url: URL, headers: "CIMultiDict[str]" - ) -> None: - for trace in self._traces: - await trace.send_request_headers(method, url, headers) diff --git a/venv/lib/python3.12/site-packages/aiohttp/client_ws.py b/venv/lib/python3.12/site-packages/aiohttp/client_ws.py deleted file mode 100644 index daa57d1..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/client_ws.py +++ /dev/null @@ -1,428 +0,0 @@ -"""WebSocket client for asyncio.""" - -import asyncio -import sys -from types import TracebackType -from typing import Any, Optional, Type, cast - -import attr - -from ._websocket.reader import WebSocketDataQueue -from .client_exceptions import ClientError, ServerTimeoutError, WSMessageTypeError -from .client_reqrep import ClientResponse -from .helpers import calculate_timeout_when, set_result -from .http import ( - WS_CLOSED_MESSAGE, - WS_CLOSING_MESSAGE, - WebSocketError, - WSCloseCode, - WSMessage, - WSMsgType, -) -from .http_websocket import _INTERNAL_RECEIVE_TYPES, WebSocketWriter -from .streams import EofStream -from .typedefs import ( - DEFAULT_JSON_DECODER, - DEFAULT_JSON_ENCODER, - JSONDecoder, - JSONEncoder, -) - -if sys.version_info >= (3, 11): - import asyncio as async_timeout -else: - import async_timeout - - -@attr.s(frozen=True, slots=True) -class ClientWSTimeout: - ws_receive = attr.ib(type=Optional[float], default=None) - ws_close = attr.ib(type=Optional[float], default=None) - - -DEFAULT_WS_CLIENT_TIMEOUT = ClientWSTimeout(ws_receive=None, ws_close=10.0) - - -class ClientWebSocketResponse: - def __init__( - self, - reader: WebSocketDataQueue, - writer: WebSocketWriter, - protocol: Optional[str], - response: ClientResponse, - timeout: ClientWSTimeout, - autoclose: bool, - autoping: bool, - loop: asyncio.AbstractEventLoop, - *, - heartbeat: Optional[float] = None, - compress: int = 0, - client_notakeover: bool = False, - ) -> None: - self._response = response - self._conn = response.connection - - self._writer = writer - self._reader = reader - self._protocol = protocol - self._closed = False - self._closing = False - self._close_code: Optional[int] = None - self._timeout = timeout - self._autoclose = autoclose - self._autoping = autoping - self._heartbeat = heartbeat - self._heartbeat_cb: Optional[asyncio.TimerHandle] = None - self._heartbeat_when: float = 0.0 - if heartbeat is not None: - self._pong_heartbeat = heartbeat / 2.0 - self._pong_response_cb: Optional[asyncio.TimerHandle] = None - self._loop = loop - self._waiting: bool = False - self._close_wait: Optional[asyncio.Future[None]] = None - self._exception: Optional[BaseException] = None - self._compress = compress - self._client_notakeover = client_notakeover - self._ping_task: Optional[asyncio.Task[None]] = None - - self._reset_heartbeat() - - def _cancel_heartbeat(self) -> None: - self._cancel_pong_response_cb() - if self._heartbeat_cb is not None: - self._heartbeat_cb.cancel() - self._heartbeat_cb = None - if self._ping_task is not None: - self._ping_task.cancel() - self._ping_task = None - - def _cancel_pong_response_cb(self) -> None: - if self._pong_response_cb is not None: - self._pong_response_cb.cancel() - self._pong_response_cb = None - - def _reset_heartbeat(self) -> None: - if self._heartbeat is None: - return - self._cancel_pong_response_cb() - loop = self._loop - assert loop is not None - conn = self._conn - timeout_ceil_threshold = ( - conn._connector._timeout_ceil_threshold if conn is not None else 5 - ) - now = loop.time() - when = calculate_timeout_when(now, self._heartbeat, timeout_ceil_threshold) - self._heartbeat_when = when - if self._heartbeat_cb is None: - # We do not cancel the previous heartbeat_cb here because - # it generates a significant amount of TimerHandle churn - # which causes asyncio to rebuild the heap frequently. - # Instead _send_heartbeat() will reschedule the next - # heartbeat if it fires too early. - self._heartbeat_cb = loop.call_at(when, self._send_heartbeat) - - def _send_heartbeat(self) -> None: - self._heartbeat_cb = None - loop = self._loop - now = loop.time() - if now < self._heartbeat_when: - # Heartbeat fired too early, reschedule - self._heartbeat_cb = loop.call_at( - self._heartbeat_when, self._send_heartbeat - ) - return - - conn = self._conn - timeout_ceil_threshold = ( - conn._connector._timeout_ceil_threshold if conn is not None else 5 - ) - when = calculate_timeout_when(now, self._pong_heartbeat, timeout_ceil_threshold) - self._cancel_pong_response_cb() - self._pong_response_cb = loop.call_at(when, self._pong_not_received) - - coro = self._writer.send_frame(b"", WSMsgType.PING) - if sys.version_info >= (3, 12): - # Optimization for Python 3.12, try to send the ping - # immediately to avoid having to schedule - # the task on the event loop. - ping_task = asyncio.Task(coro, loop=loop, eager_start=True) - else: - ping_task = loop.create_task(coro) - - if not ping_task.done(): - self._ping_task = ping_task - ping_task.add_done_callback(self._ping_task_done) - else: - self._ping_task_done(ping_task) - - def _ping_task_done(self, task: "asyncio.Task[None]") -> None: - """Callback for when the ping task completes.""" - if not task.cancelled() and (exc := task.exception()): - self._handle_ping_pong_exception(exc) - self._ping_task = None - - def _pong_not_received(self) -> None: - self._handle_ping_pong_exception( - ServerTimeoutError(f"No PONG received after {self._pong_heartbeat} seconds") - ) - - def _handle_ping_pong_exception(self, exc: BaseException) -> None: - """Handle exceptions raised during ping/pong processing.""" - if self._closed: - return - self._set_closed() - self._close_code = WSCloseCode.ABNORMAL_CLOSURE - self._exception = exc - self._response.close() - if self._waiting and not self._closing: - self._reader.feed_data(WSMessage(WSMsgType.ERROR, exc, None), 0) - - def _set_closed(self) -> None: - """Set the connection to closed. - - Cancel any heartbeat timers and set the closed flag. - """ - self._closed = True - self._cancel_heartbeat() - - def _set_closing(self) -> None: - """Set the connection to closing. - - Cancel any heartbeat timers and set the closing flag. - """ - self._closing = True - self._cancel_heartbeat() - - @property - def closed(self) -> bool: - return self._closed - - @property - def close_code(self) -> Optional[int]: - return self._close_code - - @property - def protocol(self) -> Optional[str]: - return self._protocol - - @property - def compress(self) -> int: - return self._compress - - @property - def client_notakeover(self) -> bool: - return self._client_notakeover - - def get_extra_info(self, name: str, default: Any = None) -> Any: - """extra info from connection transport""" - conn = self._response.connection - if conn is None: - return default - transport = conn.transport - if transport is None: - return default - return transport.get_extra_info(name, default) - - def exception(self) -> Optional[BaseException]: - return self._exception - - async def ping(self, message: bytes = b"") -> None: - await self._writer.send_frame(message, WSMsgType.PING) - - async def pong(self, message: bytes = b"") -> None: - await self._writer.send_frame(message, WSMsgType.PONG) - - async def send_frame( - self, message: bytes, opcode: WSMsgType, compress: Optional[int] = None - ) -> None: - """Send a frame over the websocket.""" - await self._writer.send_frame(message, opcode, compress) - - async def send_str(self, data: str, compress: Optional[int] = None) -> None: - if not isinstance(data, str): - raise TypeError("data argument must be str (%r)" % type(data)) - await self._writer.send_frame( - data.encode("utf-8"), WSMsgType.TEXT, compress=compress - ) - - async def send_bytes(self, data: bytes, compress: Optional[int] = None) -> None: - if not isinstance(data, (bytes, bytearray, memoryview)): - raise TypeError("data argument must be byte-ish (%r)" % type(data)) - await self._writer.send_frame(data, WSMsgType.BINARY, compress=compress) - - async def send_json( - self, - data: Any, - compress: Optional[int] = None, - *, - dumps: JSONEncoder = DEFAULT_JSON_ENCODER, - ) -> None: - await self.send_str(dumps(data), compress=compress) - - async def close(self, *, code: int = WSCloseCode.OK, message: bytes = b"") -> bool: - # we need to break `receive()` cycle first, - # `close()` may be called from different task - if self._waiting and not self._closing: - assert self._loop is not None - self._close_wait = self._loop.create_future() - self._set_closing() - self._reader.feed_data(WS_CLOSING_MESSAGE, 0) - await self._close_wait - - if self._closed: - return False - - self._set_closed() - try: - await self._writer.close(code, message) - except asyncio.CancelledError: - self._close_code = WSCloseCode.ABNORMAL_CLOSURE - self._response.close() - raise - except Exception as exc: - self._close_code = WSCloseCode.ABNORMAL_CLOSURE - self._exception = exc - self._response.close() - return True - - if self._close_code: - self._response.close() - return True - - while True: - try: - async with async_timeout.timeout(self._timeout.ws_close): - msg = await self._reader.read() - except asyncio.CancelledError: - self._close_code = WSCloseCode.ABNORMAL_CLOSURE - self._response.close() - raise - except Exception as exc: - self._close_code = WSCloseCode.ABNORMAL_CLOSURE - self._exception = exc - self._response.close() - return True - - if msg.type is WSMsgType.CLOSE: - self._close_code = msg.data - self._response.close() - return True - - async def receive(self, timeout: Optional[float] = None) -> WSMessage: - receive_timeout = timeout or self._timeout.ws_receive - - while True: - if self._waiting: - raise RuntimeError("Concurrent call to receive() is not allowed") - - if self._closed: - return WS_CLOSED_MESSAGE - elif self._closing: - await self.close() - return WS_CLOSED_MESSAGE - - try: - self._waiting = True - try: - if receive_timeout: - # Entering the context manager and creating - # Timeout() object can take almost 50% of the - # run time in this loop so we avoid it if - # there is no read timeout. - async with async_timeout.timeout(receive_timeout): - msg = await self._reader.read() - else: - msg = await self._reader.read() - self._reset_heartbeat() - finally: - self._waiting = False - if self._close_wait: - set_result(self._close_wait, None) - except (asyncio.CancelledError, asyncio.TimeoutError): - self._close_code = WSCloseCode.ABNORMAL_CLOSURE - raise - except EofStream: - self._close_code = WSCloseCode.OK - await self.close() - return WSMessage(WSMsgType.CLOSED, None, None) - except ClientError: - # Likely ServerDisconnectedError when connection is lost - self._set_closed() - self._close_code = WSCloseCode.ABNORMAL_CLOSURE - return WS_CLOSED_MESSAGE - except WebSocketError as exc: - self._close_code = exc.code - await self.close(code=exc.code) - return WSMessage(WSMsgType.ERROR, exc, None) - except Exception as exc: - self._exception = exc - self._set_closing() - self._close_code = WSCloseCode.ABNORMAL_CLOSURE - await self.close() - return WSMessage(WSMsgType.ERROR, exc, None) - - if msg.type not in _INTERNAL_RECEIVE_TYPES: - # If its not a close/closing/ping/pong message - # we can return it immediately - return msg - - if msg.type is WSMsgType.CLOSE: - self._set_closing() - self._close_code = msg.data - if not self._closed and self._autoclose: - await self.close() - elif msg.type is WSMsgType.CLOSING: - self._set_closing() - elif msg.type is WSMsgType.PING and self._autoping: - await self.pong(msg.data) - continue - elif msg.type is WSMsgType.PONG and self._autoping: - continue - - return msg - - async def receive_str(self, *, timeout: Optional[float] = None) -> str: - msg = await self.receive(timeout) - if msg.type is not WSMsgType.TEXT: - raise WSMessageTypeError( - f"Received message {msg.type}:{msg.data!r} is not WSMsgType.TEXT" - ) - return cast(str, msg.data) - - async def receive_bytes(self, *, timeout: Optional[float] = None) -> bytes: - msg = await self.receive(timeout) - if msg.type is not WSMsgType.BINARY: - raise WSMessageTypeError( - f"Received message {msg.type}:{msg.data!r} is not WSMsgType.BINARY" - ) - return cast(bytes, msg.data) - - async def receive_json( - self, - *, - loads: JSONDecoder = DEFAULT_JSON_DECODER, - timeout: Optional[float] = None, - ) -> Any: - data = await self.receive_str(timeout=timeout) - return loads(data) - - def __aiter__(self) -> "ClientWebSocketResponse": - return self - - async def __anext__(self) -> WSMessage: - msg = await self.receive() - if msg.type in (WSMsgType.CLOSE, WSMsgType.CLOSING, WSMsgType.CLOSED): - raise StopAsyncIteration - return msg - - async def __aenter__(self) -> "ClientWebSocketResponse": - return self - - async def __aexit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - await self.close() diff --git a/venv/lib/python3.12/site-packages/aiohttp/compression_utils.py b/venv/lib/python3.12/site-packages/aiohttp/compression_utils.py deleted file mode 100644 index f08c3d9..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/compression_utils.py +++ /dev/null @@ -1,278 +0,0 @@ -import asyncio -import sys -import zlib -from concurrent.futures import Executor -from typing import Any, Final, Optional, Protocol, TypedDict, cast - -if sys.version_info >= (3, 12): - from collections.abc import Buffer -else: - from typing import Union - - Buffer = Union[bytes, bytearray, "memoryview[int]", "memoryview[bytes]"] - -try: - try: - import brotlicffi as brotli - except ImportError: - import brotli - - HAS_BROTLI = True -except ImportError: # pragma: no cover - HAS_BROTLI = False - -MAX_SYNC_CHUNK_SIZE = 1024 - - -class ZLibCompressObjProtocol(Protocol): - def compress(self, data: Buffer) -> bytes: ... - def flush(self, mode: int = ..., /) -> bytes: ... - - -class ZLibDecompressObjProtocol(Protocol): - def decompress(self, data: Buffer, max_length: int = ...) -> bytes: ... - def flush(self, length: int = ..., /) -> bytes: ... - - @property - def eof(self) -> bool: ... - - -class ZLibBackendProtocol(Protocol): - MAX_WBITS: int - Z_FULL_FLUSH: int - Z_SYNC_FLUSH: int - Z_BEST_SPEED: int - Z_FINISH: int - - def compressobj( - self, - level: int = ..., - method: int = ..., - wbits: int = ..., - memLevel: int = ..., - strategy: int = ..., - zdict: Optional[Buffer] = ..., - ) -> ZLibCompressObjProtocol: ... - def decompressobj( - self, wbits: int = ..., zdict: Buffer = ... - ) -> ZLibDecompressObjProtocol: ... - - def compress( - self, data: Buffer, /, level: int = ..., wbits: int = ... - ) -> bytes: ... - def decompress( - self, data: Buffer, /, wbits: int = ..., bufsize: int = ... - ) -> bytes: ... - - -class CompressObjArgs(TypedDict, total=False): - wbits: int - strategy: int - level: int - - -class ZLibBackendWrapper: - def __init__(self, _zlib_backend: ZLibBackendProtocol): - self._zlib_backend: ZLibBackendProtocol = _zlib_backend - - @property - def name(self) -> str: - return getattr(self._zlib_backend, "__name__", "undefined") - - @property - def MAX_WBITS(self) -> int: - return self._zlib_backend.MAX_WBITS - - @property - def Z_FULL_FLUSH(self) -> int: - return self._zlib_backend.Z_FULL_FLUSH - - @property - def Z_SYNC_FLUSH(self) -> int: - return self._zlib_backend.Z_SYNC_FLUSH - - @property - def Z_BEST_SPEED(self) -> int: - return self._zlib_backend.Z_BEST_SPEED - - @property - def Z_FINISH(self) -> int: - return self._zlib_backend.Z_FINISH - - def compressobj(self, *args: Any, **kwargs: Any) -> ZLibCompressObjProtocol: - return self._zlib_backend.compressobj(*args, **kwargs) - - def decompressobj(self, *args: Any, **kwargs: Any) -> ZLibDecompressObjProtocol: - return self._zlib_backend.decompressobj(*args, **kwargs) - - def compress(self, data: Buffer, *args: Any, **kwargs: Any) -> bytes: - return self._zlib_backend.compress(data, *args, **kwargs) - - def decompress(self, data: Buffer, *args: Any, **kwargs: Any) -> bytes: - return self._zlib_backend.decompress(data, *args, **kwargs) - - # Everything not explicitly listed in the Protocol we just pass through - def __getattr__(self, attrname: str) -> Any: - return getattr(self._zlib_backend, attrname) - - -ZLibBackend: ZLibBackendWrapper = ZLibBackendWrapper(zlib) - - -def set_zlib_backend(new_zlib_backend: ZLibBackendProtocol) -> None: - ZLibBackend._zlib_backend = new_zlib_backend - - -def encoding_to_mode( - encoding: Optional[str] = None, - suppress_deflate_header: bool = False, -) -> int: - if encoding == "gzip": - return 16 + ZLibBackend.MAX_WBITS - - return -ZLibBackend.MAX_WBITS if suppress_deflate_header else ZLibBackend.MAX_WBITS - - -class ZlibBaseHandler: - def __init__( - self, - mode: int, - executor: Optional[Executor] = None, - max_sync_chunk_size: Optional[int] = MAX_SYNC_CHUNK_SIZE, - ): - self._mode = mode - self._executor = executor - self._max_sync_chunk_size = max_sync_chunk_size - - -class ZLibCompressor(ZlibBaseHandler): - def __init__( - self, - encoding: Optional[str] = None, - suppress_deflate_header: bool = False, - level: Optional[int] = None, - wbits: Optional[int] = None, - strategy: Optional[int] = None, - executor: Optional[Executor] = None, - max_sync_chunk_size: Optional[int] = MAX_SYNC_CHUNK_SIZE, - ): - super().__init__( - mode=( - encoding_to_mode(encoding, suppress_deflate_header) - if wbits is None - else wbits - ), - executor=executor, - max_sync_chunk_size=max_sync_chunk_size, - ) - self._zlib_backend: Final = ZLibBackendWrapper(ZLibBackend._zlib_backend) - - kwargs: CompressObjArgs = {} - kwargs["wbits"] = self._mode - if strategy is not None: - kwargs["strategy"] = strategy - if level is not None: - kwargs["level"] = level - self._compressor = self._zlib_backend.compressobj(**kwargs) - self._compress_lock = asyncio.Lock() - - def compress_sync(self, data: bytes) -> bytes: - return self._compressor.compress(data) - - async def compress(self, data: bytes) -> bytes: - """Compress the data and returned the compressed bytes. - - Note that flush() must be called after the last call to compress() - - If the data size is large than the max_sync_chunk_size, the compression - will be done in the executor. Otherwise, the compression will be done - in the event loop. - """ - async with self._compress_lock: - # To ensure the stream is consistent in the event - # there are multiple writers, we need to lock - # the compressor so that only one writer can - # compress at a time. - if ( - self._max_sync_chunk_size is not None - and len(data) > self._max_sync_chunk_size - ): - return await asyncio.get_running_loop().run_in_executor( - self._executor, self._compressor.compress, data - ) - return self.compress_sync(data) - - def flush(self, mode: Optional[int] = None) -> bytes: - return self._compressor.flush( - mode if mode is not None else self._zlib_backend.Z_FINISH - ) - - -class ZLibDecompressor(ZlibBaseHandler): - def __init__( - self, - encoding: Optional[str] = None, - suppress_deflate_header: bool = False, - executor: Optional[Executor] = None, - max_sync_chunk_size: Optional[int] = MAX_SYNC_CHUNK_SIZE, - ): - super().__init__( - mode=encoding_to_mode(encoding, suppress_deflate_header), - executor=executor, - max_sync_chunk_size=max_sync_chunk_size, - ) - self._zlib_backend: Final = ZLibBackendWrapper(ZLibBackend._zlib_backend) - self._decompressor = self._zlib_backend.decompressobj(wbits=self._mode) - - def decompress_sync(self, data: bytes, max_length: int = 0) -> bytes: - return self._decompressor.decompress(data, max_length) - - async def decompress(self, data: bytes, max_length: int = 0) -> bytes: - """Decompress the data and return the decompressed bytes. - - If the data size is large than the max_sync_chunk_size, the decompression - will be done in the executor. Otherwise, the decompression will be done - in the event loop. - """ - if ( - self._max_sync_chunk_size is not None - and len(data) > self._max_sync_chunk_size - ): - return await asyncio.get_running_loop().run_in_executor( - self._executor, self._decompressor.decompress, data, max_length - ) - return self.decompress_sync(data, max_length) - - def flush(self, length: int = 0) -> bytes: - return ( - self._decompressor.flush(length) - if length > 0 - else self._decompressor.flush() - ) - - @property - def eof(self) -> bool: - return self._decompressor.eof - - -class BrotliDecompressor: - # 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 not HAS_BROTLI: - raise RuntimeError( - "The brotli decompression is not available. " - "Please install `Brotli` module" - ) - self._obj = brotli.Decompressor() - - def decompress_sync(self, data: bytes) -> bytes: - if hasattr(self._obj, "decompress"): - return cast(bytes, self._obj.decompress(data)) - return cast(bytes, self._obj.process(data)) - - def flush(self) -> bytes: - if hasattr(self._obj, "flush"): - return cast(bytes, self._obj.flush()) - return b"" diff --git a/venv/lib/python3.12/site-packages/aiohttp/connector.py b/venv/lib/python3.12/site-packages/aiohttp/connector.py deleted file mode 100644 index 0fbacde..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/connector.py +++ /dev/null @@ -1,1834 +0,0 @@ -import asyncio -import functools -import random -import socket -import sys -import traceback -import warnings -from collections import OrderedDict, defaultdict, deque -from contextlib import suppress -from http import HTTPStatus -from itertools import chain, cycle, islice -from time import monotonic -from types import TracebackType -from typing import ( - TYPE_CHECKING, - Any, - Awaitable, - Callable, - DefaultDict, - Deque, - Dict, - Iterator, - List, - Literal, - Optional, - Sequence, - Set, - Tuple, - Type, - Union, - cast, -) - -import aiohappyeyeballs -from aiohappyeyeballs import AddrInfoType, SocketFactoryType - -from . import hdrs, helpers -from .abc import AbstractResolver, ResolveResult -from .client_exceptions import ( - ClientConnectionError, - ClientConnectorCertificateError, - ClientConnectorDNSError, - ClientConnectorError, - ClientConnectorSSLError, - ClientHttpProxyError, - ClientProxyConnectionError, - ServerFingerprintMismatch, - UnixClientConnectorError, - cert_errors, - ssl_errors, -) -from .client_proto import ResponseHandler -from .client_reqrep import ClientRequest, Fingerprint, _merge_ssl_params -from .helpers import ( - _SENTINEL, - ceil_timeout, - is_ip_address, - noop, - sentinel, - set_exception, - set_result, -) -from .log import client_logger -from .resolver import DefaultResolver - -if sys.version_info >= (3, 12): - from collections.abc import Buffer -else: - Buffer = Union[bytes, bytearray, "memoryview[int]", "memoryview[bytes]"] - -if TYPE_CHECKING: - import ssl - - SSLContext = ssl.SSLContext -else: - try: - import ssl - - SSLContext = ssl.SSLContext - except ImportError: # pragma: no cover - ssl = None # type: ignore[assignment] - SSLContext = object # type: ignore[misc,assignment] - -EMPTY_SCHEMA_SET = frozenset({""}) -HTTP_SCHEMA_SET = frozenset({"http", "https"}) -WS_SCHEMA_SET = frozenset({"ws", "wss"}) - -HTTP_AND_EMPTY_SCHEMA_SET = HTTP_SCHEMA_SET | EMPTY_SCHEMA_SET -HIGH_LEVEL_SCHEMA_SET = HTTP_AND_EMPTY_SCHEMA_SET | WS_SCHEMA_SET - -NEEDS_CLEANUP_CLOSED = (3, 13, 0) <= sys.version_info < ( - 3, - 13, - 1, -) or sys.version_info < (3, 12, 7) -# Cleanup closed is no longer needed after https://github.com/python/cpython/pull/118960 -# which first appeared in Python 3.12.7 and 3.13.1 - - -__all__ = ( - "BaseConnector", - "TCPConnector", - "UnixConnector", - "NamedPipeConnector", - "AddrInfoType", - "SocketFactoryType", -) - - -if TYPE_CHECKING: - from .client import ClientTimeout - from .client_reqrep import ConnectionKey - from .tracing import Trace - - -class _DeprecationWaiter: - __slots__ = ("_awaitable", "_awaited") - - def __init__(self, awaitable: Awaitable[Any]) -> None: - self._awaitable = awaitable - self._awaited = False - - def __await__(self) -> Any: - self._awaited = True - return self._awaitable.__await__() - - def __del__(self) -> None: - if not self._awaited: - warnings.warn( - "Connector.close() is a coroutine, " - "please use await connector.close()", - DeprecationWarning, - ) - - -async def _wait_for_close(waiters: List[Awaitable[object]]) -> None: - """Wait for all waiters to finish closing.""" - results = await asyncio.gather(*waiters, return_exceptions=True) - for res in results: - if isinstance(res, Exception): - client_logger.debug("Error while closing connector: %r", res) - - -class Connection: - - _source_traceback = None - - def __init__( - self, - connector: "BaseConnector", - key: "ConnectionKey", - protocol: ResponseHandler, - loop: asyncio.AbstractEventLoop, - ) -> None: - self._key = key - self._connector = connector - self._loop = loop - self._protocol: Optional[ResponseHandler] = protocol - self._callbacks: List[Callable[[], None]] = [] - - if loop.get_debug(): - self._source_traceback = traceback.extract_stack(sys._getframe(1)) - - def __repr__(self) -> str: - return f"Connection<{self._key}>" - - def __del__(self, _warnings: Any = warnings) -> None: - if self._protocol is not None: - kwargs = {"source": self} - _warnings.warn(f"Unclosed connection {self!r}", ResourceWarning, **kwargs) - if self._loop.is_closed(): - return - - self._connector._release(self._key, self._protocol, should_close=True) - - context = {"client_connection": self, "message": "Unclosed connection"} - if self._source_traceback is not None: - context["source_traceback"] = self._source_traceback - self._loop.call_exception_handler(context) - - def __bool__(self) -> Literal[True]: - """Force subclasses to not be falsy, to make checks simpler.""" - return True - - @property - def loop(self) -> asyncio.AbstractEventLoop: - warnings.warn( - "connector.loop property is deprecated", DeprecationWarning, stacklevel=2 - ) - return self._loop - - @property - def transport(self) -> Optional[asyncio.Transport]: - if self._protocol is None: - return None - return self._protocol.transport - - @property - def protocol(self) -> Optional[ResponseHandler]: - return self._protocol - - def add_callback(self, callback: Callable[[], None]) -> None: - if callback is not None: - self._callbacks.append(callback) - - def _notify_release(self) -> None: - callbacks, self._callbacks = self._callbacks[:], [] - - for cb in callbacks: - with suppress(Exception): - cb() - - def close(self) -> None: - self._notify_release() - - if self._protocol is not None: - self._connector._release(self._key, self._protocol, should_close=True) - self._protocol = None - - def release(self) -> None: - self._notify_release() - - if self._protocol is not None: - self._connector._release(self._key, self._protocol) - self._protocol = None - - @property - def closed(self) -> bool: - return self._protocol is None or not self._protocol.is_connected() - - -class _ConnectTunnelConnection(Connection): - """Special connection wrapper for CONNECT tunnels that must never be pooled. - - This connection wraps the proxy connection that will be upgraded with TLS. - It must never be released to the pool because: - 1. Its 'closed' future will never complete, causing session.close() to hang - 2. It represents an intermediate state, not a reusable connection - 3. The real connection (with TLS) will be created separately - """ - - def release(self) -> None: - """Do nothing - don't pool or close the connection. - - These connections are an intermediate state during the CONNECT tunnel - setup and will be cleaned up naturally after the TLS upgrade. If they - were to be pooled, they would never be properly closed, causing - session.close() to wait forever for their 'closed' future. - """ - - -class _TransportPlaceholder: - """placeholder for BaseConnector.connect function""" - - __slots__ = ("closed", "transport") - - def __init__(self, closed_future: asyncio.Future[Optional[Exception]]) -> None: - """Initialize a placeholder for a transport.""" - self.closed = closed_future - self.transport = None - - def close(self) -> None: - """Close the placeholder.""" - - def abort(self) -> None: - """Abort the placeholder (does nothing).""" - - -class BaseConnector: - """Base connector class. - - keepalive_timeout - (optional) Keep-alive timeout. - force_close - Set to True to force close and do reconnect - after each request (and between redirects). - limit - The total number of simultaneous connections. - limit_per_host - Number of simultaneous connections to one host. - enable_cleanup_closed - Enables clean-up closed ssl transports. - Disabled by default. - timeout_ceil_threshold - Trigger ceiling of timeout values when - it's above timeout_ceil_threshold. - loop - Optional event loop. - """ - - _closed = True # prevent AttributeError in __del__ if ctor was failed - _source_traceback = None - - # abort transport after 2 seconds (cleanup broken connections) - _cleanup_closed_period = 2.0 - - allowed_protocol_schema_set = HIGH_LEVEL_SCHEMA_SET - - def __init__( - self, - *, - keepalive_timeout: Union[object, None, float] = sentinel, - force_close: bool = False, - limit: int = 100, - limit_per_host: int = 0, - enable_cleanup_closed: bool = False, - loop: Optional[asyncio.AbstractEventLoop] = None, - timeout_ceil_threshold: float = 5, - ) -> None: - - if force_close: - if keepalive_timeout is not None and keepalive_timeout is not sentinel: - raise ValueError( - "keepalive_timeout cannot be set if force_close is True" - ) - else: - if keepalive_timeout is sentinel: - keepalive_timeout = 15.0 - - loop = loop or asyncio.get_running_loop() - self._timeout_ceil_threshold = timeout_ceil_threshold - - self._closed = False - if loop.get_debug(): - self._source_traceback = traceback.extract_stack(sys._getframe(1)) - - # Connection pool of reusable connections. - # We use a deque to store connections because it has O(1) popleft() - # and O(1) append() operations to implement a FIFO queue. - self._conns: DefaultDict[ - ConnectionKey, Deque[Tuple[ResponseHandler, float]] - ] = defaultdict(deque) - self._limit = limit - self._limit_per_host = limit_per_host - self._acquired: Set[ResponseHandler] = set() - self._acquired_per_host: DefaultDict[ConnectionKey, Set[ResponseHandler]] = ( - defaultdict(set) - ) - self._keepalive_timeout = cast(float, keepalive_timeout) - self._force_close = force_close - - # {host_key: FIFO list of waiters} - # The FIFO is implemented with an OrderedDict with None keys because - # python does not have an ordered set. - self._waiters: DefaultDict[ - ConnectionKey, OrderedDict[asyncio.Future[None], None] - ] = defaultdict(OrderedDict) - - self._loop = loop - self._factory = functools.partial(ResponseHandler, loop=loop) - - # start keep-alive connection cleanup task - self._cleanup_handle: Optional[asyncio.TimerHandle] = None - - # start cleanup closed transports task - self._cleanup_closed_handle: Optional[asyncio.TimerHandle] = None - - if enable_cleanup_closed and not NEEDS_CLEANUP_CLOSED: - warnings.warn( - "enable_cleanup_closed ignored because " - "https://github.com/python/cpython/pull/118960 is fixed " - f"in Python version {sys.version_info}", - DeprecationWarning, - stacklevel=2, - ) - enable_cleanup_closed = False - - self._cleanup_closed_disabled = not enable_cleanup_closed - self._cleanup_closed_transports: List[Optional[asyncio.Transport]] = [] - self._placeholder_future: asyncio.Future[Optional[Exception]] = ( - loop.create_future() - ) - self._placeholder_future.set_result(None) - self._cleanup_closed() - - def __del__(self, _warnings: Any = warnings) -> None: - if self._closed: - return - if not self._conns: - return - - conns = [repr(c) for c in self._conns.values()] - - self._close() - - kwargs = {"source": self} - _warnings.warn(f"Unclosed connector {self!r}", ResourceWarning, **kwargs) - context = { - "connector": self, - "connections": conns, - "message": "Unclosed connector", - } - if self._source_traceback is not None: - context["source_traceback"] = self._source_traceback - self._loop.call_exception_handler(context) - - def __enter__(self) -> "BaseConnector": - warnings.warn( - '"with Connector():" is deprecated, ' - 'use "async with Connector():" instead', - DeprecationWarning, - ) - return self - - def __exit__(self, *exc: Any) -> None: - self._close() - - async def __aenter__(self) -> "BaseConnector": - return self - - async def __aexit__( - self, - exc_type: Optional[Type[BaseException]] = None, - exc_value: Optional[BaseException] = None, - exc_traceback: Optional[TracebackType] = None, - ) -> None: - await self.close() - - @property - def force_close(self) -> bool: - """Ultimately close connection on releasing if True.""" - return self._force_close - - @property - def limit(self) -> int: - """The total number for simultaneous connections. - - If limit is 0 the connector has no limit. - The default limit size is 100. - """ - return self._limit - - @property - def limit_per_host(self) -> int: - """The limit for simultaneous connections to the same endpoint. - - Endpoints are the same if they are have equal - (host, port, is_ssl) triple. - """ - return self._limit_per_host - - def _cleanup(self) -> None: - """Cleanup unused transports.""" - if self._cleanup_handle: - self._cleanup_handle.cancel() - # _cleanup_handle should be unset, otherwise _release() will not - # recreate it ever! - self._cleanup_handle = None - - now = monotonic() - timeout = self._keepalive_timeout - - if self._conns: - connections = defaultdict(deque) - deadline = now - timeout - for key, conns in self._conns.items(): - alive: Deque[Tuple[ResponseHandler, float]] = deque() - for proto, use_time in conns: - if proto.is_connected() and use_time - deadline >= 0: - alive.append((proto, use_time)) - continue - transport = proto.transport - proto.close() - if not self._cleanup_closed_disabled and key.is_ssl: - self._cleanup_closed_transports.append(transport) - - if alive: - connections[key] = alive - - self._conns = connections - - if self._conns: - self._cleanup_handle = helpers.weakref_handle( - self, - "_cleanup", - timeout, - self._loop, - timeout_ceil_threshold=self._timeout_ceil_threshold, - ) - - def _cleanup_closed(self) -> None: - """Double confirmation for transport close. - - Some broken ssl servers may leave socket open without proper close. - """ - if self._cleanup_closed_handle: - self._cleanup_closed_handle.cancel() - - for transport in self._cleanup_closed_transports: - if transport is not None: - transport.abort() - - self._cleanup_closed_transports = [] - - if not self._cleanup_closed_disabled: - self._cleanup_closed_handle = helpers.weakref_handle( - self, - "_cleanup_closed", - self._cleanup_closed_period, - self._loop, - timeout_ceil_threshold=self._timeout_ceil_threshold, - ) - - def close(self, *, abort_ssl: bool = False) -> Awaitable[None]: - """Close all opened transports. - - :param abort_ssl: If True, SSL connections will be aborted immediately - without performing the shutdown handshake. This provides - faster cleanup at the cost of less graceful disconnection. - """ - if not (waiters := self._close(abort_ssl=abort_ssl)): - # If there are no connections to close, we can return a noop - # awaitable to avoid scheduling a task on the event loop. - return _DeprecationWaiter(noop()) - coro = _wait_for_close(waiters) - if sys.version_info >= (3, 12): - # Optimization for Python 3.12, try to close connections - # immediately to avoid having to schedule the task on the event loop. - task = asyncio.Task(coro, loop=self._loop, eager_start=True) - else: - task = self._loop.create_task(coro) - return _DeprecationWaiter(task) - - def _close(self, *, abort_ssl: bool = False) -> List[Awaitable[object]]: - waiters: List[Awaitable[object]] = [] - - if self._closed: - return waiters - - self._closed = True - - try: - if self._loop.is_closed(): - return waiters - - # cancel cleanup task - if self._cleanup_handle: - self._cleanup_handle.cancel() - - # cancel cleanup close task - if self._cleanup_closed_handle: - self._cleanup_closed_handle.cancel() - - for data in self._conns.values(): - for proto, _ in data: - if ( - abort_ssl - and proto.transport - and proto.transport.get_extra_info("sslcontext") is not None - ): - proto.abort() - else: - proto.close() - if closed := proto.closed: - waiters.append(closed) - - for proto in self._acquired: - if ( - abort_ssl - and proto.transport - and proto.transport.get_extra_info("sslcontext") is not None - ): - proto.abort() - else: - proto.close() - if closed := proto.closed: - waiters.append(closed) - - for transport in self._cleanup_closed_transports: - if transport is not None: - transport.abort() - - return waiters - - finally: - self._conns.clear() - self._acquired.clear() - for keyed_waiters in self._waiters.values(): - for keyed_waiter in keyed_waiters: - keyed_waiter.cancel() - self._waiters.clear() - self._cleanup_handle = None - self._cleanup_closed_transports.clear() - self._cleanup_closed_handle = None - - @property - def closed(self) -> bool: - """Is connector closed. - - A readonly property. - """ - return self._closed - - def _available_connections(self, key: "ConnectionKey") -> int: - """ - Return number of available connections. - - The limit, limit_per_host and the connection key are taken into account. - - If it returns less than 1 means that there are no connections - available. - """ - # check total available connections - # If there are no limits, this will always return 1 - total_remain = 1 - - if self._limit and (total_remain := self._limit - len(self._acquired)) <= 0: - return total_remain - - # check limit per host - if host_remain := self._limit_per_host: - if acquired := self._acquired_per_host.get(key): - host_remain -= len(acquired) - if total_remain > host_remain: - return host_remain - - return total_remain - - async def connect( - self, req: ClientRequest, traces: List["Trace"], timeout: "ClientTimeout" - ) -> Connection: - """Get from pool or create new connection.""" - key = req.connection_key - if (conn := await self._get(key, traces)) is not None: - # If we do not have to wait and we can get a connection from the pool - # we can avoid the timeout ceil logic and directly return the connection - return conn - - async with ceil_timeout(timeout.connect, timeout.ceil_threshold): - if self._available_connections(key) <= 0: - await self._wait_for_available_connection(key, traces) - if (conn := await self._get(key, traces)) is not None: - return conn - - placeholder = cast( - ResponseHandler, _TransportPlaceholder(self._placeholder_future) - ) - self._acquired.add(placeholder) - if self._limit_per_host: - self._acquired_per_host[key].add(placeholder) - - try: - # Traces are done inside the try block to ensure that the - # that the placeholder is still cleaned up if an exception - # is raised. - if traces: - for trace in traces: - await trace.send_connection_create_start() - proto = await self._create_connection(req, traces, timeout) - if traces: - for trace in traces: - await trace.send_connection_create_end() - except BaseException: - self._release_acquired(key, placeholder) - raise - else: - if self._closed: - proto.close() - raise ClientConnectionError("Connector is closed.") - - # The connection was successfully created, drop the placeholder - # and add the real connection to the acquired set. There should - # be no awaits after the proto is added to the acquired set - # to ensure that the connection is not left in the acquired set - # on cancellation. - self._acquired.remove(placeholder) - self._acquired.add(proto) - if self._limit_per_host: - acquired_per_host = self._acquired_per_host[key] - acquired_per_host.remove(placeholder) - acquired_per_host.add(proto) - return Connection(self, key, proto, self._loop) - - async def _wait_for_available_connection( - self, key: "ConnectionKey", traces: List["Trace"] - ) -> None: - """Wait for an available connection slot.""" - # We loop here because there is a race between - # the connection limit check and the connection - # being acquired. If the connection is acquired - # between the check and the await statement, we - # need to loop again to check if the connection - # slot is still available. - attempts = 0 - while True: - fut: asyncio.Future[None] = self._loop.create_future() - keyed_waiters = self._waiters[key] - keyed_waiters[fut] = None - if attempts: - # If we have waited before, we need to move the waiter - # to the front of the queue as otherwise we might get - # starved and hit the timeout. - keyed_waiters.move_to_end(fut, last=False) - - try: - # Traces happen in the try block to ensure that the - # the waiter is still cleaned up if an exception is raised. - if traces: - for trace in traces: - await trace.send_connection_queued_start() - await fut - if traces: - for trace in traces: - await trace.send_connection_queued_end() - finally: - # pop the waiter from the queue if its still - # there and not already removed by _release_waiter - keyed_waiters.pop(fut, None) - if not self._waiters.get(key, True): - del self._waiters[key] - - if self._available_connections(key) > 0: - break - attempts += 1 - - async def _get( - self, key: "ConnectionKey", traces: List["Trace"] - ) -> Optional[Connection]: - """Get next reusable connection for the key or None. - - The connection will be marked as acquired. - """ - if (conns := self._conns.get(key)) is None: - return None - - t1 = monotonic() - while conns: - proto, t0 = conns.popleft() - # We will we reuse the connection if its connected and - # the keepalive timeout has not been exceeded - if proto.is_connected() and t1 - t0 <= self._keepalive_timeout: - if not conns: - # The very last connection was reclaimed: drop the key - del self._conns[key] - self._acquired.add(proto) - if self._limit_per_host: - self._acquired_per_host[key].add(proto) - if traces: - for trace in traces: - try: - await trace.send_connection_reuseconn() - except BaseException: - self._release_acquired(key, proto) - raise - return Connection(self, key, proto, self._loop) - - # Connection cannot be reused, close it - transport = proto.transport - proto.close() - # only for SSL transports - if not self._cleanup_closed_disabled and key.is_ssl: - self._cleanup_closed_transports.append(transport) - - # No more connections: drop the key - del self._conns[key] - return None - - def _release_waiter(self) -> None: - """ - Iterates over all waiters until one to be released is found. - - The one to be released is not finished and - belongs to a host that has available connections. - """ - if not self._waiters: - return - - # Having the dict keys ordered this avoids to iterate - # at the same order at each call. - queues = list(self._waiters) - random.shuffle(queues) - - for key in queues: - if self._available_connections(key) < 1: - continue - - waiters = self._waiters[key] - while waiters: - waiter, _ = waiters.popitem(last=False) - if not waiter.done(): - waiter.set_result(None) - return - - def _release_acquired(self, key: "ConnectionKey", proto: ResponseHandler) -> None: - """Release acquired connection.""" - if self._closed: - # acquired connection is already released on connector closing - return - - self._acquired.discard(proto) - if self._limit_per_host and (conns := self._acquired_per_host.get(key)): - conns.discard(proto) - if not conns: - del self._acquired_per_host[key] - self._release_waiter() - - def _release( - self, - key: "ConnectionKey", - protocol: ResponseHandler, - *, - should_close: bool = False, - ) -> None: - if self._closed: - # acquired connection is already released on connector closing - return - - self._release_acquired(key, protocol) - - if self._force_close or should_close or protocol.should_close: - transport = protocol.transport - protocol.close() - - if key.is_ssl and not self._cleanup_closed_disabled: - self._cleanup_closed_transports.append(transport) - return - - self._conns[key].append((protocol, monotonic())) - - if self._cleanup_handle is None: - self._cleanup_handle = helpers.weakref_handle( - self, - "_cleanup", - self._keepalive_timeout, - self._loop, - timeout_ceil_threshold=self._timeout_ceil_threshold, - ) - - async def _create_connection( - self, req: ClientRequest, traces: List["Trace"], timeout: "ClientTimeout" - ) -> ResponseHandler: - raise NotImplementedError() - - -class _DNSCacheTable: - def __init__(self, ttl: Optional[float] = None) -> None: - self._addrs_rr: Dict[Tuple[str, int], Tuple[Iterator[ResolveResult], int]] = {} - self._timestamps: Dict[Tuple[str, int], float] = {} - self._ttl = ttl - - def __contains__(self, host: object) -> bool: - return host in self._addrs_rr - - def add(self, key: Tuple[str, int], addrs: List[ResolveResult]) -> None: - self._addrs_rr[key] = (cycle(addrs), len(addrs)) - - if self._ttl is not None: - self._timestamps[key] = monotonic() - - def remove(self, key: Tuple[str, int]) -> None: - self._addrs_rr.pop(key, None) - - if self._ttl is not None: - self._timestamps.pop(key, None) - - def clear(self) -> None: - self._addrs_rr.clear() - self._timestamps.clear() - - def next_addrs(self, key: Tuple[str, int]) -> List[ResolveResult]: - loop, length = self._addrs_rr[key] - addrs = list(islice(loop, length)) - # Consume one more element to shift internal state of `cycle` - next(loop) - return addrs - - def expired(self, key: Tuple[str, int]) -> bool: - if self._ttl is None: - return False - - return self._timestamps[key] + self._ttl < monotonic() - - -def _make_ssl_context(verified: bool) -> SSLContext: - """Create SSL context. - - This method is not async-friendly and should be called from a thread - because it will load certificates from disk and do other blocking I/O. - """ - if ssl is None: - # No ssl support - return None - if verified: - sslcontext = ssl.create_default_context() - else: - sslcontext = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) - sslcontext.options |= ssl.OP_NO_SSLv2 - sslcontext.options |= ssl.OP_NO_SSLv3 - sslcontext.check_hostname = False - sslcontext.verify_mode = ssl.CERT_NONE - sslcontext.options |= ssl.OP_NO_COMPRESSION - sslcontext.set_default_verify_paths() - sslcontext.set_alpn_protocols(("http/1.1",)) - return sslcontext - - -# The default SSLContext objects are created at import time -# since they do blocking I/O to load certificates from disk, -# and imports should always be done before the event loop starts -# or in a thread. -_SSL_CONTEXT_VERIFIED = _make_ssl_context(True) -_SSL_CONTEXT_UNVERIFIED = _make_ssl_context(False) - - -class TCPConnector(BaseConnector): - """TCP connector. - - verify_ssl - Set to True to check ssl certifications. - fingerprint - Pass the binary sha256 - digest of the expected certificate in DER format to verify - that the certificate the server presents matches. See also - https://en.wikipedia.org/wiki/HTTP_Public_Key_Pinning - resolver - Enable DNS lookups and use this - resolver - use_dns_cache - Use memory cache for DNS lookups. - ttl_dns_cache - Max seconds having cached a DNS entry, None forever. - family - socket address family - local_addr - local tuple of (host, port) to bind socket to - - keepalive_timeout - (optional) Keep-alive timeout. - force_close - Set to True to force close and do reconnect - after each request (and between redirects). - limit - The total number of simultaneous connections. - limit_per_host - Number of simultaneous connections to one host. - enable_cleanup_closed - Enables clean-up closed ssl transports. - Disabled by default. - happy_eyeballs_delay - This is the “Connection Attempt Delay” - as defined in RFC 8305. To disable - the happy eyeballs algorithm, set to None. - interleave - “First Address Family Count” as defined in RFC 8305 - loop - Optional event loop. - socket_factory - A SocketFactoryType function that, if supplied, - will be used to create sockets given an - AddrInfoType. - ssl_shutdown_timeout - DEPRECATED. Will be removed in aiohttp 4.0. - Grace period for SSL shutdown handshake on TLS - connections. Default is 0 seconds (immediate abort). - This parameter allowed for a clean SSL shutdown by - notifying the remote peer of connection closure, - while avoiding excessive delays during connector cleanup. - Note: Only takes effect on Python 3.11+. - """ - - allowed_protocol_schema_set = HIGH_LEVEL_SCHEMA_SET | frozenset({"tcp"}) - - def __init__( - self, - *, - verify_ssl: bool = True, - fingerprint: Optional[bytes] = None, - use_dns_cache: bool = True, - ttl_dns_cache: Optional[int] = 10, - family: socket.AddressFamily = socket.AddressFamily.AF_UNSPEC, - ssl_context: Optional[SSLContext] = None, - ssl: Union[bool, Fingerprint, SSLContext] = True, - local_addr: Optional[Tuple[str, int]] = None, - resolver: Optional[AbstractResolver] = None, - keepalive_timeout: Union[None, float, object] = sentinel, - force_close: bool = False, - limit: int = 100, - limit_per_host: int = 0, - enable_cleanup_closed: bool = False, - loop: Optional[asyncio.AbstractEventLoop] = None, - timeout_ceil_threshold: float = 5, - happy_eyeballs_delay: Optional[float] = 0.25, - interleave: Optional[int] = None, - socket_factory: Optional[SocketFactoryType] = None, - ssl_shutdown_timeout: Union[_SENTINEL, None, float] = sentinel, - ): - super().__init__( - keepalive_timeout=keepalive_timeout, - force_close=force_close, - limit=limit, - limit_per_host=limit_per_host, - enable_cleanup_closed=enable_cleanup_closed, - loop=loop, - timeout_ceil_threshold=timeout_ceil_threshold, - ) - - self._ssl = _merge_ssl_params(ssl, verify_ssl, ssl_context, fingerprint) - - self._resolver: AbstractResolver - if resolver is None: - self._resolver = DefaultResolver(loop=self._loop) - self._resolver_owner = True - else: - self._resolver = resolver - self._resolver_owner = False - - self._use_dns_cache = use_dns_cache - self._cached_hosts = _DNSCacheTable(ttl=ttl_dns_cache) - self._throttle_dns_futures: Dict[ - Tuple[str, int], Set["asyncio.Future[None]"] - ] = {} - self._family = family - self._local_addr_infos = aiohappyeyeballs.addr_to_addr_infos(local_addr) - self._happy_eyeballs_delay = happy_eyeballs_delay - self._interleave = interleave - self._resolve_host_tasks: Set["asyncio.Task[List[ResolveResult]]"] = set() - self._socket_factory = socket_factory - self._ssl_shutdown_timeout: Optional[float] - # Handle ssl_shutdown_timeout with warning for Python < 3.11 - if ssl_shutdown_timeout is sentinel: - self._ssl_shutdown_timeout = 0 - else: - # Deprecation warning for ssl_shutdown_timeout parameter - warnings.warn( - "The ssl_shutdown_timeout parameter is deprecated and will be removed in aiohttp 4.0", - DeprecationWarning, - stacklevel=2, - ) - if ( - sys.version_info < (3, 11) - and ssl_shutdown_timeout is not None - and ssl_shutdown_timeout != 0 - ): - warnings.warn( - f"ssl_shutdown_timeout={ssl_shutdown_timeout} is ignored on Python < 3.11; " - "only ssl_shutdown_timeout=0 is supported. The timeout will be ignored.", - RuntimeWarning, - stacklevel=2, - ) - self._ssl_shutdown_timeout = ssl_shutdown_timeout - - def _close(self, *, abort_ssl: bool = False) -> List[Awaitable[object]]: - """Close all ongoing DNS calls.""" - for fut in chain.from_iterable(self._throttle_dns_futures.values()): - fut.cancel() - - waiters = super()._close(abort_ssl=abort_ssl) - - for t in self._resolve_host_tasks: - t.cancel() - waiters.append(t) - - return waiters - - async def close(self, *, abort_ssl: bool = False) -> None: - """ - Close all opened transports. - - :param abort_ssl: If True, SSL connections will be aborted immediately - without performing the shutdown handshake. If False (default), - the behavior is determined by ssl_shutdown_timeout: - - If ssl_shutdown_timeout=0: connections are aborted - - If ssl_shutdown_timeout>0: graceful shutdown is performed - """ - if self._resolver_owner: - await self._resolver.close() - # Use abort_ssl param if explicitly set, otherwise use ssl_shutdown_timeout default - await super().close(abort_ssl=abort_ssl or self._ssl_shutdown_timeout == 0) - - @property - def family(self) -> int: - """Socket family like AF_INET.""" - return self._family - - @property - def use_dns_cache(self) -> bool: - """True if local DNS caching is enabled.""" - return self._use_dns_cache - - def clear_dns_cache( - self, host: Optional[str] = None, port: Optional[int] = None - ) -> None: - """Remove specified host/port or clear all dns local cache.""" - if host is not None and port is not None: - self._cached_hosts.remove((host, port)) - elif host is not None or port is not None: - raise ValueError("either both host and port or none of them are allowed") - else: - self._cached_hosts.clear() - - async def _resolve_host( - self, host: str, port: int, traces: Optional[Sequence["Trace"]] = None - ) -> List[ResolveResult]: - """Resolve host and return list of addresses.""" - if is_ip_address(host): - return [ - { - "hostname": host, - "host": host, - "port": port, - "family": self._family, - "proto": 0, - "flags": 0, - } - ] - - if not self._use_dns_cache: - - if traces: - for trace in traces: - await trace.send_dns_resolvehost_start(host) - - res = await self._resolver.resolve(host, port, family=self._family) - - if traces: - for trace in traces: - await trace.send_dns_resolvehost_end(host) - - return res - - key = (host, port) - if key in self._cached_hosts and not self._cached_hosts.expired(key): - # get result early, before any await (#4014) - result = self._cached_hosts.next_addrs(key) - - if traces: - for trace in traces: - await trace.send_dns_cache_hit(host) - return result - - futures: Set["asyncio.Future[None]"] - # - # If multiple connectors are resolving the same host, we wait - # for the first one to resolve and then use the result for all of them. - # We use a throttle to ensure that we only resolve the host once - # and then use the result for all the waiters. - # - if key in self._throttle_dns_futures: - # get futures early, before any await (#4014) - futures = self._throttle_dns_futures[key] - future: asyncio.Future[None] = self._loop.create_future() - futures.add(future) - if traces: - for trace in traces: - await trace.send_dns_cache_hit(host) - try: - await future - finally: - futures.discard(future) - return self._cached_hosts.next_addrs(key) - - # update dict early, before any await (#4014) - self._throttle_dns_futures[key] = futures = set() - # In this case we need to create a task to ensure that we can shield - # the task from cancellation as cancelling this lookup should not cancel - # the underlying lookup or else the cancel event will get broadcast to - # all the waiters across all connections. - # - coro = self._resolve_host_with_throttle(key, host, port, futures, traces) - loop = asyncio.get_running_loop() - if sys.version_info >= (3, 12): - # Optimization for Python 3.12, try to send immediately - resolved_host_task = asyncio.Task(coro, loop=loop, eager_start=True) - else: - resolved_host_task = loop.create_task(coro) - - if not resolved_host_task.done(): - self._resolve_host_tasks.add(resolved_host_task) - resolved_host_task.add_done_callback(self._resolve_host_tasks.discard) - - try: - return await asyncio.shield(resolved_host_task) - except asyncio.CancelledError: - - def drop_exception(fut: "asyncio.Future[List[ResolveResult]]") -> None: - with suppress(Exception, asyncio.CancelledError): - fut.result() - - resolved_host_task.add_done_callback(drop_exception) - raise - - async def _resolve_host_with_throttle( - self, - key: Tuple[str, int], - host: str, - port: int, - futures: Set["asyncio.Future[None]"], - traces: Optional[Sequence["Trace"]], - ) -> List[ResolveResult]: - """Resolve host and set result for all waiters. - - This method must be run in a task and shielded from cancellation - to avoid cancelling the underlying lookup. - """ - try: - if traces: - for trace in traces: - await trace.send_dns_cache_miss(host) - - for trace in traces: - await trace.send_dns_resolvehost_start(host) - - addrs = await self._resolver.resolve(host, port, family=self._family) - if traces: - for trace in traces: - await trace.send_dns_resolvehost_end(host) - - self._cached_hosts.add(key, addrs) - for fut in futures: - set_result(fut, None) - except BaseException as e: - # any DNS exception is set for the waiters to raise the same exception. - # This coro is always run in task that is shielded from cancellation so - # we should never be propagating cancellation here. - for fut in futures: - set_exception(fut, e) - raise - finally: - self._throttle_dns_futures.pop(key) - - return self._cached_hosts.next_addrs(key) - - async def _create_connection( - self, req: ClientRequest, traces: List["Trace"], timeout: "ClientTimeout" - ) -> ResponseHandler: - """Create connection. - - Has same keyword arguments as BaseEventLoop.create_connection. - """ - if req.proxy: - _, proto = await self._create_proxy_connection(req, traces, timeout) - else: - _, proto = await self._create_direct_connection(req, traces, timeout) - - return proto - - def _get_ssl_context(self, req: ClientRequest) -> Optional[SSLContext]: - """Logic to get the correct SSL context - - 0. if req.ssl is false, return None - - 1. if ssl_context is specified in req, use it - 2. if _ssl_context is specified in self, use it - 3. otherwise: - 1. if verify_ssl is not specified in req, use self.ssl_context - (will generate a default context according to self.verify_ssl) - 2. if verify_ssl is True in req, generate a default SSL context - 3. if verify_ssl is False in req, generate a SSL context that - won't verify - """ - if not req.is_ssl(): - return None - - if ssl is None: # pragma: no cover - raise RuntimeError("SSL is not supported.") - sslcontext = req.ssl - if isinstance(sslcontext, ssl.SSLContext): - return sslcontext - if sslcontext is not True: - # not verified or fingerprinted - return _SSL_CONTEXT_UNVERIFIED - sslcontext = self._ssl - if isinstance(sslcontext, ssl.SSLContext): - return sslcontext - if sslcontext is not True: - # not verified or fingerprinted - return _SSL_CONTEXT_UNVERIFIED - return _SSL_CONTEXT_VERIFIED - - def _get_fingerprint(self, req: ClientRequest) -> Optional["Fingerprint"]: - ret = req.ssl - if isinstance(ret, Fingerprint): - return ret - ret = self._ssl - if isinstance(ret, Fingerprint): - return ret - return None - - async def _wrap_create_connection( - self, - *args: Any, - addr_infos: List[AddrInfoType], - req: ClientRequest, - timeout: "ClientTimeout", - client_error: Type[Exception] = ClientConnectorError, - **kwargs: Any, - ) -> Tuple[asyncio.Transport, ResponseHandler]: - try: - async with ceil_timeout( - timeout.sock_connect, ceil_threshold=timeout.ceil_threshold - ): - sock = await aiohappyeyeballs.start_connection( - addr_infos=addr_infos, - local_addr_infos=self._local_addr_infos, - happy_eyeballs_delay=self._happy_eyeballs_delay, - interleave=self._interleave, - loop=self._loop, - socket_factory=self._socket_factory, - ) - # Add ssl_shutdown_timeout for Python 3.11+ when SSL is used - if ( - kwargs.get("ssl") - and self._ssl_shutdown_timeout - and sys.version_info >= (3, 11) - ): - kwargs["ssl_shutdown_timeout"] = self._ssl_shutdown_timeout - return await self._loop.create_connection(*args, **kwargs, sock=sock) - except cert_errors as exc: - raise ClientConnectorCertificateError(req.connection_key, exc) from exc - except ssl_errors as exc: - raise ClientConnectorSSLError(req.connection_key, exc) from exc - except OSError as exc: - if exc.errno is None and isinstance(exc, asyncio.TimeoutError): - raise - raise client_error(req.connection_key, exc) from exc - - async def _wrap_existing_connection( - self, - *args: Any, - req: ClientRequest, - timeout: "ClientTimeout", - client_error: Type[Exception] = ClientConnectorError, - **kwargs: Any, - ) -> Tuple[asyncio.Transport, ResponseHandler]: - try: - async with ceil_timeout( - timeout.sock_connect, ceil_threshold=timeout.ceil_threshold - ): - return await self._loop.create_connection(*args, **kwargs) - except cert_errors as exc: - raise ClientConnectorCertificateError(req.connection_key, exc) from exc - except ssl_errors as exc: - raise ClientConnectorSSLError(req.connection_key, exc) from exc - except OSError as exc: - if exc.errno is None and isinstance(exc, asyncio.TimeoutError): - raise - raise client_error(req.connection_key, exc) from exc - - def _fail_on_no_start_tls(self, req: "ClientRequest") -> None: - """Raise a :py:exc:`RuntimeError` on missing ``start_tls()``. - - It is necessary for TLS-in-TLS so that it is possible to - send HTTPS queries through HTTPS proxies. - - This doesn't affect regular HTTP requests, though. - """ - if not req.is_ssl(): - return - - proxy_url = req.proxy - assert proxy_url is not None - if proxy_url.scheme != "https": - return - - self._check_loop_for_start_tls() - - def _check_loop_for_start_tls(self) -> None: - try: - self._loop.start_tls - except AttributeError as attr_exc: - raise RuntimeError( - "An HTTPS request is being sent through an HTTPS proxy. " - "This needs support for TLS in TLS but it is not implemented " - "in your runtime for the stdlib asyncio.\n\n" - "Please upgrade to Python 3.11 or higher. For more details, " - "please see:\n" - "* https://bugs.python.org/issue37179\n" - "* https://github.com/python/cpython/pull/28073\n" - "* https://docs.aiohttp.org/en/stable/" - "client_advanced.html#proxy-support\n" - "* https://github.com/aio-libs/aiohttp/discussions/6044\n", - ) from attr_exc - - def _loop_supports_start_tls(self) -> bool: - try: - self._check_loop_for_start_tls() - except RuntimeError: - return False - else: - return True - - def _warn_about_tls_in_tls( - self, - underlying_transport: asyncio.Transport, - req: ClientRequest, - ) -> None: - """Issue a warning if the requested URL has HTTPS scheme.""" - if req.request_info.url.scheme != "https": - return - - # Check if uvloop is being used, which supports TLS in TLS, - # otherwise assume that asyncio's native transport is being used. - if type(underlying_transport).__module__.startswith("uvloop"): - return - - # Support in asyncio was added in Python 3.11 (bpo-44011) - asyncio_supports_tls_in_tls = sys.version_info >= (3, 11) or getattr( - underlying_transport, - "_start_tls_compatible", - False, - ) - - if asyncio_supports_tls_in_tls: - return - - warnings.warn( - "An HTTPS request is being sent through an HTTPS proxy. " - "This support for TLS in TLS is known to be disabled " - "in the stdlib asyncio (Python <3.11). This is why you'll probably see " - "an error in the log below.\n\n" - "It is possible to enable it via monkeypatching. " - "For more details, see:\n" - "* https://bugs.python.org/issue37179\n" - "* https://github.com/python/cpython/pull/28073\n\n" - "You can temporarily patch this as follows:\n" - "* https://docs.aiohttp.org/en/stable/client_advanced.html#proxy-support\n" - "* https://github.com/aio-libs/aiohttp/discussions/6044\n", - RuntimeWarning, - source=self, - # Why `4`? At least 3 of the calls in the stack originate - # from the methods in this class. - stacklevel=3, - ) - - async def _start_tls_connection( - self, - underlying_transport: asyncio.Transport, - req: ClientRequest, - timeout: "ClientTimeout", - client_error: Type[Exception] = ClientConnectorError, - ) -> Tuple[asyncio.BaseTransport, ResponseHandler]: - """Wrap the raw TCP transport with TLS.""" - tls_proto = self._factory() # Create a brand new proto for TLS - sslcontext = self._get_ssl_context(req) - if TYPE_CHECKING: - # _start_tls_connection is unreachable in the current code path - # if sslcontext is None. - assert sslcontext is not None - - try: - async with ceil_timeout( - timeout.sock_connect, ceil_threshold=timeout.ceil_threshold - ): - try: - # ssl_shutdown_timeout is only available in Python 3.11+ - if sys.version_info >= (3, 11) and self._ssl_shutdown_timeout: - tls_transport = await self._loop.start_tls( - underlying_transport, - tls_proto, - sslcontext, - server_hostname=req.server_hostname or req.host, - ssl_handshake_timeout=timeout.total, - ssl_shutdown_timeout=self._ssl_shutdown_timeout, - ) - else: - tls_transport = await self._loop.start_tls( - underlying_transport, - tls_proto, - sslcontext, - server_hostname=req.server_hostname or req.host, - ssl_handshake_timeout=timeout.total, - ) - except BaseException: - # We need to close the underlying transport since - # `start_tls()` probably failed before it had a - # chance to do this: - if self._ssl_shutdown_timeout == 0: - underlying_transport.abort() - else: - underlying_transport.close() - raise - if isinstance(tls_transport, asyncio.Transport): - fingerprint = self._get_fingerprint(req) - if fingerprint: - try: - fingerprint.check(tls_transport) - except ServerFingerprintMismatch: - tls_transport.close() - if not self._cleanup_closed_disabled: - self._cleanup_closed_transports.append(tls_transport) - raise - except cert_errors as exc: - raise ClientConnectorCertificateError(req.connection_key, exc) from exc - except ssl_errors as exc: - raise ClientConnectorSSLError(req.connection_key, exc) from exc - except OSError as exc: - if exc.errno is None and isinstance(exc, asyncio.TimeoutError): - raise - raise client_error(req.connection_key, exc) from exc - except TypeError as type_err: - # Example cause looks like this: - # TypeError: transport is not supported by start_tls() - - raise ClientConnectionError( - "Cannot initialize a TLS-in-TLS connection to host " - f"{req.host!s}:{req.port:d} through an underlying connection " - f"to an HTTPS proxy {req.proxy!s} ssl:{req.ssl or 'default'} " - f"[{type_err!s}]" - ) from type_err - else: - if tls_transport is None: - msg = "Failed to start TLS (possibly caused by closing transport)" - raise client_error(req.connection_key, OSError(msg)) - tls_proto.connection_made( - tls_transport - ) # Kick the state machine of the new TLS protocol - - return tls_transport, tls_proto - - def _convert_hosts_to_addr_infos( - self, hosts: List[ResolveResult] - ) -> List[AddrInfoType]: - """Converts the list of hosts to a list of addr_infos. - - The list of hosts is the result of a DNS lookup. The list of - addr_infos is the result of a call to `socket.getaddrinfo()`. - """ - addr_infos: List[AddrInfoType] = [] - for hinfo in hosts: - host = hinfo["host"] - is_ipv6 = ":" in host - family = socket.AF_INET6 if is_ipv6 else socket.AF_INET - if self._family and self._family != family: - continue - addr = (host, hinfo["port"], 0, 0) if is_ipv6 else (host, hinfo["port"]) - addr_infos.append( - (family, socket.SOCK_STREAM, socket.IPPROTO_TCP, "", addr) - ) - return addr_infos - - async def _create_direct_connection( - self, - req: ClientRequest, - traces: List["Trace"], - timeout: "ClientTimeout", - *, - client_error: Type[Exception] = ClientConnectorError, - ) -> Tuple[asyncio.Transport, ResponseHandler]: - sslcontext = self._get_ssl_context(req) - fingerprint = self._get_fingerprint(req) - - host = req.url.raw_host - assert host is not None - # Replace multiple trailing dots with a single one. - # A trailing dot is only present for fully-qualified domain names. - # See https://github.com/aio-libs/aiohttp/pull/7364. - if host.endswith(".."): - host = host.rstrip(".") + "." - port = req.port - assert port is not None - try: - # Cancelling this lookup should not cancel the underlying lookup - # or else the cancel event will get broadcast to all the waiters - # across all connections. - hosts = await self._resolve_host(host, port, traces=traces) - except OSError as exc: - if exc.errno is None and isinstance(exc, asyncio.TimeoutError): - raise - # in case of proxy it is not ClientProxyConnectionError - # it is problem of resolving proxy ip itself - raise ClientConnectorDNSError(req.connection_key, exc) from exc - - last_exc: Optional[Exception] = None - addr_infos = self._convert_hosts_to_addr_infos(hosts) - while addr_infos: - # Strip trailing dots, certificates contain FQDN without dots. - # See https://github.com/aio-libs/aiohttp/issues/3636 - server_hostname = ( - (req.server_hostname or host).rstrip(".") if sslcontext else None - ) - - try: - transp, proto = await self._wrap_create_connection( - self._factory, - timeout=timeout, - ssl=sslcontext, - addr_infos=addr_infos, - server_hostname=server_hostname, - req=req, - client_error=client_error, - ) - except (ClientConnectorError, asyncio.TimeoutError) as exc: - last_exc = exc - aiohappyeyeballs.pop_addr_infos_interleave(addr_infos, self._interleave) - continue - - if req.is_ssl() and fingerprint: - try: - fingerprint.check(transp) - except ServerFingerprintMismatch as exc: - transp.close() - if not self._cleanup_closed_disabled: - self._cleanup_closed_transports.append(transp) - last_exc = exc - # Remove the bad peer from the list of addr_infos - sock: socket.socket = transp.get_extra_info("socket") - bad_peer = sock.getpeername() - aiohappyeyeballs.remove_addr_infos(addr_infos, bad_peer) - continue - - return transp, proto - else: - assert last_exc is not None - raise last_exc - - async def _create_proxy_connection( - self, req: ClientRequest, traces: List["Trace"], timeout: "ClientTimeout" - ) -> Tuple[asyncio.BaseTransport, ResponseHandler]: - self._fail_on_no_start_tls(req) - runtime_has_start_tls = self._loop_supports_start_tls() - - headers: Dict[str, str] = {} - if req.proxy_headers is not None: - headers = req.proxy_headers # type: ignore[assignment] - headers[hdrs.HOST] = req.headers[hdrs.HOST] - - url = req.proxy - assert url is not None - proxy_req = ClientRequest( - hdrs.METH_GET, - url, - headers=headers, - auth=req.proxy_auth, - loop=self._loop, - ssl=req.ssl, - ) - - # create connection to proxy server - transport, proto = await self._create_direct_connection( - proxy_req, [], timeout, client_error=ClientProxyConnectionError - ) - - auth = proxy_req.headers.pop(hdrs.AUTHORIZATION, None) - if auth is not None: - if not req.is_ssl(): - req.headers[hdrs.PROXY_AUTHORIZATION] = auth - else: - proxy_req.headers[hdrs.PROXY_AUTHORIZATION] = auth - - if req.is_ssl(): - if runtime_has_start_tls: - self._warn_about_tls_in_tls(transport, req) - - # For HTTPS requests over HTTP proxy - # we must notify proxy to tunnel connection - # so we send CONNECT command: - # CONNECT www.python.org:443 HTTP/1.1 - # Host: www.python.org - # - # next we must do TLS handshake and so on - # to do this we must wrap raw socket into secure one - # asyncio handles this perfectly - proxy_req.method = hdrs.METH_CONNECT - proxy_req.url = req.url - key = req.connection_key._replace( - proxy=None, proxy_auth=None, proxy_headers_hash=None - ) - conn = _ConnectTunnelConnection(self, key, proto, self._loop) - proxy_resp = await proxy_req.send(conn) - try: - protocol = conn._protocol - assert protocol is not None - - # read_until_eof=True will ensure the connection isn't closed - # once the response is received and processed allowing - # START_TLS to work on the connection below. - protocol.set_response_params( - read_until_eof=runtime_has_start_tls, - timeout_ceil_threshold=self._timeout_ceil_threshold, - ) - resp = await proxy_resp.start(conn) - except BaseException: - proxy_resp.close() - conn.close() - raise - else: - conn._protocol = None - try: - if resp.status != 200: - message = resp.reason - if message is None: - message = HTTPStatus(resp.status).phrase - raise ClientHttpProxyError( - proxy_resp.request_info, - resp.history, - status=resp.status, - message=message, - headers=resp.headers, - ) - if not runtime_has_start_tls: - rawsock = transport.get_extra_info("socket", default=None) - if rawsock is None: - raise RuntimeError( - "Transport does not expose socket instance" - ) - # Duplicate the socket, so now we can close proxy transport - rawsock = rawsock.dup() - except BaseException: - # It shouldn't be closed in `finally` because it's fed to - # `loop.start_tls()` and the docs say not to touch it after - # passing there. - transport.close() - raise - finally: - if not runtime_has_start_tls: - transport.close() - - if not runtime_has_start_tls: - # HTTP proxy with support for upgrade to HTTPS - sslcontext = self._get_ssl_context(req) - return await self._wrap_existing_connection( - self._factory, - timeout=timeout, - ssl=sslcontext, - sock=rawsock, - server_hostname=req.host, - req=req, - ) - - return await self._start_tls_connection( - # Access the old transport for the last time before it's - # closed and forgotten forever: - transport, - req=req, - timeout=timeout, - ) - finally: - proxy_resp.close() - - return transport, proto - - -class UnixConnector(BaseConnector): - """Unix socket connector. - - path - Unix socket path. - keepalive_timeout - (optional) Keep-alive timeout. - force_close - Set to True to force close and do reconnect - after each request (and between redirects). - limit - The total number of simultaneous connections. - limit_per_host - Number of simultaneous connections to one host. - loop - Optional event loop. - """ - - allowed_protocol_schema_set = HIGH_LEVEL_SCHEMA_SET | frozenset({"unix"}) - - def __init__( - self, - path: str, - force_close: bool = False, - keepalive_timeout: Union[object, float, None] = sentinel, - limit: int = 100, - limit_per_host: int = 0, - loop: Optional[asyncio.AbstractEventLoop] = None, - ) -> None: - super().__init__( - force_close=force_close, - keepalive_timeout=keepalive_timeout, - limit=limit, - limit_per_host=limit_per_host, - loop=loop, - ) - self._path = path - - @property - def path(self) -> str: - """Path to unix socket.""" - return self._path - - async def _create_connection( - self, req: ClientRequest, traces: List["Trace"], timeout: "ClientTimeout" - ) -> ResponseHandler: - try: - async with ceil_timeout( - timeout.sock_connect, ceil_threshold=timeout.ceil_threshold - ): - _, proto = await self._loop.create_unix_connection( - self._factory, self._path - ) - except OSError as exc: - if exc.errno is None and isinstance(exc, asyncio.TimeoutError): - raise - raise UnixClientConnectorError(self.path, req.connection_key, exc) from exc - - return proto - - -class NamedPipeConnector(BaseConnector): - """Named pipe connector. - - Only supported by the proactor event loop. - See also: https://docs.python.org/3/library/asyncio-eventloop.html - - path - Windows named pipe path. - keepalive_timeout - (optional) Keep-alive timeout. - force_close - Set to True to force close and do reconnect - after each request (and between redirects). - limit - The total number of simultaneous connections. - limit_per_host - Number of simultaneous connections to one host. - loop - Optional event loop. - """ - - allowed_protocol_schema_set = HIGH_LEVEL_SCHEMA_SET | frozenset({"npipe"}) - - def __init__( - self, - path: str, - force_close: bool = False, - keepalive_timeout: Union[object, float, None] = sentinel, - limit: int = 100, - limit_per_host: int = 0, - loop: Optional[asyncio.AbstractEventLoop] = None, - ) -> None: - super().__init__( - force_close=force_close, - keepalive_timeout=keepalive_timeout, - limit=limit, - limit_per_host=limit_per_host, - loop=loop, - ) - if not isinstance( - self._loop, - asyncio.ProactorEventLoop, # type: ignore[attr-defined] - ): - raise RuntimeError( - "Named Pipes only available in proactor loop under windows" - ) - self._path = path - - @property - def path(self) -> str: - """Path to the named pipe.""" - return self._path - - async def _create_connection( - self, req: ClientRequest, traces: List["Trace"], timeout: "ClientTimeout" - ) -> ResponseHandler: - try: - async with ceil_timeout( - timeout.sock_connect, ceil_threshold=timeout.ceil_threshold - ): - _, proto = await self._loop.create_pipe_connection( # type: ignore[attr-defined] - self._factory, self._path - ) - # the drain is required so that the connection_made is called - # and transport is set otherwise it is not set before the - # `assert conn.transport is not None` - # in client.py's _request method - await asyncio.sleep(0) - # other option is to manually set transport like - # `proto.transport = trans` - except OSError as exc: - if exc.errno is None and isinstance(exc, asyncio.TimeoutError): - raise - raise ClientConnectorError(req.connection_key, exc) from exc - - return cast(ResponseHandler, proto) diff --git a/venv/lib/python3.12/site-packages/aiohttp/cookiejar.py b/venv/lib/python3.12/site-packages/aiohttp/cookiejar.py deleted file mode 100644 index 193648d..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/cookiejar.py +++ /dev/null @@ -1,522 +0,0 @@ -import asyncio -import calendar -import contextlib -import datetime -import heapq -import itertools -import os # noqa -import pathlib -import pickle -import re -import time -import warnings -from collections import defaultdict -from collections.abc import Mapping -from http.cookies import BaseCookie, Morsel, SimpleCookie -from typing import ( - DefaultDict, - Dict, - Iterable, - Iterator, - List, - Optional, - Set, - Tuple, - Union, -) - -from yarl import URL - -from ._cookie_helpers import preserve_morsel_with_coded_value -from .abc import AbstractCookieJar, ClearCookiePredicate -from .helpers import is_ip_address -from .typedefs import LooseCookies, PathLike, StrOrURL - -__all__ = ("CookieJar", "DummyCookieJar") - - -CookieItem = Union[str, "Morsel[str]"] - -# We cache these string methods here as their use is in performance critical code. -_FORMAT_PATH = "{}/{}".format -_FORMAT_DOMAIN_REVERSED = "{1}.{0}".format - -# The minimum number of scheduled cookie expirations before we start cleaning up -# the expiration heap. This is a performance optimization to avoid cleaning up the -# heap too often when there are only a few scheduled expirations. -_MIN_SCHEDULED_COOKIE_EXPIRATION = 100 -_SIMPLE_COOKIE = SimpleCookie() - - -class CookieJar(AbstractCookieJar): - """Implements cookie storage adhering to RFC 6265.""" - - DATE_TOKENS_RE = re.compile( - r"[\x09\x20-\x2F\x3B-\x40\x5B-\x60\x7B-\x7E]*" - r"(?P[\x00-\x08\x0A-\x1F\d:a-zA-Z\x7F-\xFF]+)" - ) - - DATE_HMS_TIME_RE = re.compile(r"(\d{1,2}):(\d{1,2}):(\d{1,2})") - - DATE_DAY_OF_MONTH_RE = re.compile(r"(\d{1,2})") - - DATE_MONTH_RE = re.compile( - "(jan)|(feb)|(mar)|(apr)|(may)|(jun)|(jul)|(aug)|(sep)|(oct)|(nov)|(dec)", - re.I, - ) - - DATE_YEAR_RE = re.compile(r"(\d{2,4})") - - # calendar.timegm() fails for timestamps after datetime.datetime.max - # Minus one as a loss of precision occurs when timestamp() is called. - MAX_TIME = ( - int(datetime.datetime.max.replace(tzinfo=datetime.timezone.utc).timestamp()) - 1 - ) - try: - calendar.timegm(time.gmtime(MAX_TIME)) - except (OSError, ValueError): - # Hit the maximum representable time on Windows - # https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/localtime-localtime32-localtime64 - # Throws ValueError on PyPy 3.9, OSError elsewhere - MAX_TIME = calendar.timegm((3000, 12, 31, 23, 59, 59, -1, -1, -1)) - except OverflowError: - # #4515: datetime.max may not be representable on 32-bit platforms - MAX_TIME = 2**31 - 1 - # Avoid minuses in the future, 3x faster - SUB_MAX_TIME = MAX_TIME - 1 - - def __init__( - self, - *, - unsafe: bool = False, - quote_cookie: bool = True, - treat_as_secure_origin: Union[StrOrURL, List[StrOrURL], None] = None, - loop: Optional[asyncio.AbstractEventLoop] = None, - ) -> None: - super().__init__(loop=loop) - self._cookies: DefaultDict[Tuple[str, str], SimpleCookie] = defaultdict( - SimpleCookie - ) - self._morsel_cache: DefaultDict[Tuple[str, str], Dict[str, Morsel[str]]] = ( - defaultdict(dict) - ) - self._host_only_cookies: Set[Tuple[str, str]] = set() - self._unsafe = unsafe - self._quote_cookie = quote_cookie - if treat_as_secure_origin is None: - treat_as_secure_origin = [] - elif isinstance(treat_as_secure_origin, URL): - treat_as_secure_origin = [treat_as_secure_origin.origin()] - elif isinstance(treat_as_secure_origin, str): - treat_as_secure_origin = [URL(treat_as_secure_origin).origin()] - else: - treat_as_secure_origin = [ - URL(url).origin() if isinstance(url, str) else url.origin() - for url in treat_as_secure_origin - ] - self._treat_as_secure_origin = treat_as_secure_origin - self._expire_heap: List[Tuple[float, Tuple[str, str, str]]] = [] - self._expirations: Dict[Tuple[str, str, str], float] = {} - - @property - def quote_cookie(self) -> bool: - return self._quote_cookie - - def save(self, file_path: PathLike) -> None: - file_path = pathlib.Path(file_path) - with file_path.open(mode="wb") as f: - pickle.dump(self._cookies, f, pickle.HIGHEST_PROTOCOL) - - def load(self, file_path: PathLike) -> None: - file_path = pathlib.Path(file_path) - with file_path.open(mode="rb") as f: - self._cookies = pickle.load(f) - - def clear(self, predicate: Optional[ClearCookiePredicate] = None) -> None: - if predicate is None: - self._expire_heap.clear() - self._cookies.clear() - self._morsel_cache.clear() - self._host_only_cookies.clear() - self._expirations.clear() - return - - now = time.time() - to_del = [ - key - for (domain, path), cookie in self._cookies.items() - for name, morsel in cookie.items() - if ( - (key := (domain, path, name)) in self._expirations - and self._expirations[key] <= now - ) - or predicate(morsel) - ] - if to_del: - self._delete_cookies(to_del) - - def clear_domain(self, domain: str) -> None: - self.clear(lambda x: self._is_domain_match(domain, x["domain"])) - - def __iter__(self) -> "Iterator[Morsel[str]]": - self._do_expiration() - for val in self._cookies.values(): - yield from val.values() - - def __len__(self) -> int: - """Return number of cookies. - - This function does not iterate self to avoid unnecessary expiration - checks. - """ - return sum(len(cookie.values()) for cookie in self._cookies.values()) - - def _do_expiration(self) -> None: - """Remove expired cookies.""" - if not (expire_heap_len := len(self._expire_heap)): - return - - # If the expiration heap grows larger than the number expirations - # times two, we clean it up to avoid keeping expired entries in - # the heap and consuming memory. We guard this with a minimum - # threshold to avoid cleaning up the heap too often when there are - # only a few scheduled expirations. - if ( - expire_heap_len > _MIN_SCHEDULED_COOKIE_EXPIRATION - and expire_heap_len > len(self._expirations) * 2 - ): - # Remove any expired entries from the expiration heap - # that do not match the expiration time in the expirations - # as it means the cookie has been re-added to the heap - # with a different expiration time. - self._expire_heap = [ - entry - for entry in self._expire_heap - if self._expirations.get(entry[1]) == entry[0] - ] - heapq.heapify(self._expire_heap) - - now = time.time() - to_del: List[Tuple[str, str, str]] = [] - # Find any expired cookies and add them to the to-delete list - while self._expire_heap: - when, cookie_key = self._expire_heap[0] - if when > now: - break - heapq.heappop(self._expire_heap) - # Check if the cookie hasn't been re-added to the heap - # with a different expiration time as it will be removed - # later when it reaches the top of the heap and its - # expiration time is met. - if self._expirations.get(cookie_key) == when: - to_del.append(cookie_key) - - if to_del: - self._delete_cookies(to_del) - - def _delete_cookies(self, to_del: List[Tuple[str, str, str]]) -> None: - for domain, path, name in to_del: - self._host_only_cookies.discard((domain, name)) - self._cookies[(domain, path)].pop(name, None) - self._morsel_cache[(domain, path)].pop(name, None) - self._expirations.pop((domain, path, name), None) - - def _expire_cookie(self, when: float, domain: str, path: str, name: str) -> None: - cookie_key = (domain, path, name) - if self._expirations.get(cookie_key) == when: - # Avoid adding duplicates to the heap - return - heapq.heappush(self._expire_heap, (when, cookie_key)) - self._expirations[cookie_key] = when - - def update_cookies(self, cookies: LooseCookies, response_url: URL = URL()) -> None: - """Update cookies.""" - hostname = response_url.raw_host - - if not self._unsafe and is_ip_address(hostname): - # Don't accept cookies from IPs - return - - if isinstance(cookies, Mapping): - cookies = cookies.items() - - for name, cookie in cookies: - if not isinstance(cookie, Morsel): - tmp = SimpleCookie() - tmp[name] = cookie # type: ignore[assignment] - cookie = tmp[name] - - domain = cookie["domain"] - - # ignore domains with trailing dots - if domain and domain[-1] == ".": - domain = "" - del cookie["domain"] - - if not domain and hostname is not None: - # Set the cookie's domain to the response hostname - # and set its host-only-flag - self._host_only_cookies.add((hostname, name)) - domain = cookie["domain"] = hostname - - if domain and domain[0] == ".": - # Remove leading dot - domain = domain[1:] - cookie["domain"] = domain - - if hostname and not self._is_domain_match(domain, hostname): - # Setting cookies for different domains is not allowed - continue - - path = cookie["path"] - if not path or path[0] != "/": - # Set the cookie's path to the response path - path = response_url.path - if not path.startswith("/"): - path = "/" - else: - # Cut everything from the last slash to the end - path = "/" + path[1 : path.rfind("/")] - cookie["path"] = path - path = path.rstrip("/") - - if max_age := cookie["max-age"]: - try: - delta_seconds = int(max_age) - max_age_expiration = min(time.time() + delta_seconds, self.MAX_TIME) - self._expire_cookie(max_age_expiration, domain, path, name) - except ValueError: - cookie["max-age"] = "" - - elif expires := cookie["expires"]: - if expire_time := self._parse_date(expires): - self._expire_cookie(expire_time, domain, path, name) - else: - cookie["expires"] = "" - - key = (domain, path) - if self._cookies[key].get(name) != cookie: - # Don't blow away the cache if the same - # cookie gets set again - self._cookies[key][name] = cookie - self._morsel_cache[key].pop(name, None) - - self._do_expiration() - - def filter_cookies(self, request_url: URL = URL()) -> "BaseCookie[str]": - """Returns this jar's cookies filtered by their attributes.""" - # We always use BaseCookie now since all - # cookies set on on filtered are fully constructed - # Morsels, not just names and values. - filtered: BaseCookie[str] = BaseCookie() - if not self._cookies: - # Skip do_expiration() if there are no cookies. - return filtered - self._do_expiration() - if not self._cookies: - # Skip rest of function if no non-expired cookies. - return filtered - if type(request_url) is not URL: - warnings.warn( - "filter_cookies expects yarl.URL instances only," - f"and will stop working in 4.x, got {type(request_url)}", - DeprecationWarning, - stacklevel=2, - ) - request_url = URL(request_url) - hostname = request_url.raw_host or "" - - is_not_secure = request_url.scheme not in ("https", "wss") - if is_not_secure and self._treat_as_secure_origin: - request_origin = URL() - with contextlib.suppress(ValueError): - request_origin = request_url.origin() - is_not_secure = request_origin not in self._treat_as_secure_origin - - # Send shared cookie - key = ("", "") - for c in self._cookies[key].values(): - # Check cache first - if c.key in self._morsel_cache[key]: - filtered[c.key] = self._morsel_cache[key][c.key] - continue - - # Build and cache the morsel - mrsl_val = self._build_morsel(c) - self._morsel_cache[key][c.key] = mrsl_val - filtered[c.key] = mrsl_val - - if is_ip_address(hostname): - if not self._unsafe: - return filtered - domains: Iterable[str] = (hostname,) - else: - # Get all the subdomains that might match a cookie (e.g. "foo.bar.com", "bar.com", "com") - domains = itertools.accumulate( - reversed(hostname.split(".")), _FORMAT_DOMAIN_REVERSED - ) - - # Get all the path prefixes that might match a cookie (e.g. "", "/foo", "/foo/bar") - paths = itertools.accumulate(request_url.path.split("/"), _FORMAT_PATH) - # Create every combination of (domain, path) pairs. - pairs = itertools.product(domains, paths) - - path_len = len(request_url.path) - # Point 2: https://www.rfc-editor.org/rfc/rfc6265.html#section-5.4 - for p in pairs: - if p not in self._cookies: - continue - for name, cookie in self._cookies[p].items(): - domain = cookie["domain"] - - if (domain, name) in self._host_only_cookies and domain != hostname: - continue - - # Skip edge case when the cookie has a trailing slash but request doesn't. - if len(cookie["path"]) > path_len: - continue - - if is_not_secure and cookie["secure"]: - continue - - # We already built the Morsel so reuse it here - if name in self._morsel_cache[p]: - filtered[name] = self._morsel_cache[p][name] - continue - - # Build and cache the morsel - mrsl_val = self._build_morsel(cookie) - self._morsel_cache[p][name] = mrsl_val - filtered[name] = mrsl_val - - return filtered - - def _build_morsel(self, cookie: Morsel[str]) -> Morsel[str]: - """Build a morsel for sending, respecting quote_cookie setting.""" - if self._quote_cookie and cookie.coded_value and cookie.coded_value[0] == '"': - return preserve_morsel_with_coded_value(cookie) - morsel: Morsel[str] = Morsel() - if self._quote_cookie: - value, coded_value = _SIMPLE_COOKIE.value_encode(cookie.value) - else: - coded_value = value = cookie.value - # We use __setstate__ instead of the public set() API because it allows us to - # bypass validation and set already validated state. This is more stable than - # setting protected attributes directly and unlikely to change since it would - # break pickling. - morsel.__setstate__({"key": cookie.key, "value": value, "coded_value": coded_value}) # type: ignore[attr-defined] - return morsel - - @staticmethod - def _is_domain_match(domain: str, hostname: str) -> bool: - """Implements domain matching adhering to RFC 6265.""" - if hostname == domain: - return True - - if not hostname.endswith(domain): - return False - - non_matching = hostname[: -len(domain)] - - if not non_matching.endswith("."): - return False - - return not is_ip_address(hostname) - - @classmethod - def _parse_date(cls, date_str: str) -> Optional[int]: - """Implements date string parsing adhering to RFC 6265.""" - if not date_str: - return None - - found_time = False - found_day = False - found_month = False - found_year = False - - hour = minute = second = 0 - day = 0 - month = 0 - year = 0 - - for token_match in cls.DATE_TOKENS_RE.finditer(date_str): - - token = token_match.group("token") - - if not found_time: - time_match = cls.DATE_HMS_TIME_RE.match(token) - if time_match: - found_time = True - hour, minute, second = (int(s) for s in time_match.groups()) - continue - - if not found_day: - day_match = cls.DATE_DAY_OF_MONTH_RE.match(token) - if day_match: - found_day = True - day = int(day_match.group()) - continue - - if not found_month: - month_match = cls.DATE_MONTH_RE.match(token) - if month_match: - found_month = True - assert month_match.lastindex is not None - month = month_match.lastindex - continue - - if not found_year: - year_match = cls.DATE_YEAR_RE.match(token) - if year_match: - found_year = True - year = int(year_match.group()) - - if 70 <= year <= 99: - year += 1900 - elif 0 <= year <= 69: - year += 2000 - - if False in (found_day, found_month, found_year, found_time): - return None - - if not 1 <= day <= 31: - return None - - if year < 1601 or hour > 23 or minute > 59 or second > 59: - return None - - return calendar.timegm((year, month, day, hour, minute, second, -1, -1, -1)) - - -class DummyCookieJar(AbstractCookieJar): - """Implements a dummy cookie storage. - - It can be used with the ClientSession when no cookie processing is needed. - - """ - - def __init__(self, *, loop: Optional[asyncio.AbstractEventLoop] = None) -> None: - super().__init__(loop=loop) - - def __iter__(self) -> "Iterator[Morsel[str]]": - while False: - yield None - - def __len__(self) -> int: - return 0 - - @property - def quote_cookie(self) -> bool: - return True - - def clear(self, predicate: Optional[ClearCookiePredicate] = None) -> None: - pass - - def clear_domain(self, domain: str) -> None: - pass - - def update_cookies(self, cookies: LooseCookies, response_url: URL = URL()) -> None: - pass - - def filter_cookies(self, request_url: URL) -> "BaseCookie[str]": - return SimpleCookie() diff --git a/venv/lib/python3.12/site-packages/aiohttp/formdata.py b/venv/lib/python3.12/site-packages/aiohttp/formdata.py deleted file mode 100644 index bdf591f..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/formdata.py +++ /dev/null @@ -1,179 +0,0 @@ -import io -import warnings -from typing import Any, Iterable, List, Optional -from urllib.parse import urlencode - -from multidict import MultiDict, MultiDictProxy - -from . import hdrs, multipart, payload -from .helpers import guess_filename -from .payload import Payload - -__all__ = ("FormData",) - - -class FormData: - """Helper class for form body generation. - - Supports multipart/form-data and application/x-www-form-urlencoded. - """ - - def __init__( - self, - fields: Iterable[Any] = (), - quote_fields: bool = True, - charset: Optional[str] = None, - *, - default_to_multipart: bool = False, - ) -> None: - self._writer = multipart.MultipartWriter("form-data") - self._fields: List[Any] = [] - self._is_multipart = default_to_multipart - self._quote_fields = quote_fields - self._charset = charset - - if isinstance(fields, dict): - fields = list(fields.items()) - elif not isinstance(fields, (list, tuple)): - fields = (fields,) - self.add_fields(*fields) - - @property - def is_multipart(self) -> bool: - return self._is_multipart - - def add_field( - self, - name: str, - value: Any, - *, - content_type: Optional[str] = None, - filename: Optional[str] = None, - content_transfer_encoding: Optional[str] = None, - ) -> None: - - if isinstance(value, io.IOBase): - self._is_multipart = True - elif isinstance(value, (bytes, bytearray, memoryview)): - msg = ( - "In v4, passing bytes will no longer create a file field. " - "Please explicitly use the filename parameter or pass a BytesIO object." - ) - if filename is None and content_transfer_encoding is None: - warnings.warn(msg, DeprecationWarning) - filename = name - - type_options: MultiDict[str] = MultiDict({"name": name}) - if filename is not None and not isinstance(filename, str): - raise TypeError("filename must be an instance of str. Got: %s" % filename) - if filename is None and isinstance(value, io.IOBase): - filename = guess_filename(value, name) - if filename is not None: - type_options["filename"] = filename - self._is_multipart = True - - headers = {} - if content_type is not None: - if not isinstance(content_type, str): - raise TypeError( - "content_type must be an instance of str. Got: %s" % content_type - ) - headers[hdrs.CONTENT_TYPE] = content_type - self._is_multipart = True - if content_transfer_encoding is not None: - if not isinstance(content_transfer_encoding, str): - raise TypeError( - "content_transfer_encoding must be an instance" - " of str. Got: %s" % content_transfer_encoding - ) - msg = ( - "content_transfer_encoding is deprecated. " - "To maintain compatibility with v4 please pass a BytesPayload." - ) - warnings.warn(msg, DeprecationWarning) - self._is_multipart = True - - self._fields.append((type_options, headers, value)) - - def add_fields(self, *fields: Any) -> None: - to_add = list(fields) - - while to_add: - rec = to_add.pop(0) - - if isinstance(rec, io.IOBase): - k = guess_filename(rec, "unknown") - self.add_field(k, rec) # type: ignore[arg-type] - - elif isinstance(rec, (MultiDictProxy, MultiDict)): - to_add.extend(rec.items()) - - elif isinstance(rec, (list, tuple)) and len(rec) == 2: - k, fp = rec - self.add_field(k, fp) # type: ignore[arg-type] - - else: - raise TypeError( - "Only io.IOBase, multidict and (name, file) " - "pairs allowed, use .add_field() for passing " - "more complex parameters, got {!r}".format(rec) - ) - - def _gen_form_urlencoded(self) -> payload.BytesPayload: - # form data (x-www-form-urlencoded) - data = [] - for type_options, _, value in self._fields: - data.append((type_options["name"], value)) - - charset = self._charset if self._charset is not None else "utf-8" - - if charset == "utf-8": - content_type = "application/x-www-form-urlencoded" - else: - content_type = "application/x-www-form-urlencoded; charset=%s" % charset - - return payload.BytesPayload( - urlencode(data, doseq=True, encoding=charset).encode(), - content_type=content_type, - ) - - def _gen_form_data(self) -> multipart.MultipartWriter: - """Encode a list of fields using the multipart/form-data MIME format""" - for dispparams, headers, value in self._fields: - try: - if hdrs.CONTENT_TYPE in headers: - part = payload.get_payload( - value, - content_type=headers[hdrs.CONTENT_TYPE], - headers=headers, - encoding=self._charset, - ) - else: - part = payload.get_payload( - value, headers=headers, encoding=self._charset - ) - except Exception as exc: - raise TypeError( - "Can not serialize value type: %r\n " - "headers: %r\n value: %r" % (type(value), headers, value) - ) from exc - - if dispparams: - part.set_content_disposition( - "form-data", quote_fields=self._quote_fields, **dispparams - ) - # FIXME cgi.FieldStorage doesn't likes body parts with - # Content-Length which were sent via chunked transfer encoding - assert part.headers is not None - part.headers.popall(hdrs.CONTENT_LENGTH, None) - - self._writer.append_payload(part) - - self._fields.clear() - return self._writer - - def __call__(self) -> Payload: - if self._is_multipart: - return self._gen_form_data() - else: - return self._gen_form_urlencoded() diff --git a/venv/lib/python3.12/site-packages/aiohttp/hdrs.py b/venv/lib/python3.12/site-packages/aiohttp/hdrs.py deleted file mode 100644 index c8d6b35..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/hdrs.py +++ /dev/null @@ -1,121 +0,0 @@ -"""HTTP Headers constants.""" - -# After changing the file content call ./tools/gen.py -# to regenerate the headers parser -import itertools -from typing import Final, Set - -from multidict import istr - -METH_ANY: Final[str] = "*" -METH_CONNECT: Final[str] = "CONNECT" -METH_HEAD: Final[str] = "HEAD" -METH_GET: Final[str] = "GET" -METH_DELETE: Final[str] = "DELETE" -METH_OPTIONS: Final[str] = "OPTIONS" -METH_PATCH: Final[str] = "PATCH" -METH_POST: Final[str] = "POST" -METH_PUT: Final[str] = "PUT" -METH_TRACE: Final[str] = "TRACE" - -METH_ALL: Final[Set[str]] = { - METH_CONNECT, - METH_HEAD, - METH_GET, - METH_DELETE, - METH_OPTIONS, - METH_PATCH, - METH_POST, - METH_PUT, - METH_TRACE, -} - -ACCEPT: Final[istr] = istr("Accept") -ACCEPT_CHARSET: Final[istr] = istr("Accept-Charset") -ACCEPT_ENCODING: Final[istr] = istr("Accept-Encoding") -ACCEPT_LANGUAGE: Final[istr] = istr("Accept-Language") -ACCEPT_RANGES: Final[istr] = istr("Accept-Ranges") -ACCESS_CONTROL_MAX_AGE: Final[istr] = istr("Access-Control-Max-Age") -ACCESS_CONTROL_ALLOW_CREDENTIALS: Final[istr] = istr("Access-Control-Allow-Credentials") -ACCESS_CONTROL_ALLOW_HEADERS: Final[istr] = istr("Access-Control-Allow-Headers") -ACCESS_CONTROL_ALLOW_METHODS: Final[istr] = istr("Access-Control-Allow-Methods") -ACCESS_CONTROL_ALLOW_ORIGIN: Final[istr] = istr("Access-Control-Allow-Origin") -ACCESS_CONTROL_EXPOSE_HEADERS: Final[istr] = istr("Access-Control-Expose-Headers") -ACCESS_CONTROL_REQUEST_HEADERS: Final[istr] = istr("Access-Control-Request-Headers") -ACCESS_CONTROL_REQUEST_METHOD: Final[istr] = istr("Access-Control-Request-Method") -AGE: Final[istr] = istr("Age") -ALLOW: Final[istr] = istr("Allow") -AUTHORIZATION: Final[istr] = istr("Authorization") -CACHE_CONTROL: Final[istr] = istr("Cache-Control") -CONNECTION: Final[istr] = istr("Connection") -CONTENT_DISPOSITION: Final[istr] = istr("Content-Disposition") -CONTENT_ENCODING: Final[istr] = istr("Content-Encoding") -CONTENT_LANGUAGE: Final[istr] = istr("Content-Language") -CONTENT_LENGTH: Final[istr] = istr("Content-Length") -CONTENT_LOCATION: Final[istr] = istr("Content-Location") -CONTENT_MD5: Final[istr] = istr("Content-MD5") -CONTENT_RANGE: Final[istr] = istr("Content-Range") -CONTENT_TRANSFER_ENCODING: Final[istr] = istr("Content-Transfer-Encoding") -CONTENT_TYPE: Final[istr] = istr("Content-Type") -COOKIE: Final[istr] = istr("Cookie") -DATE: Final[istr] = istr("Date") -DESTINATION: Final[istr] = istr("Destination") -DIGEST: Final[istr] = istr("Digest") -ETAG: Final[istr] = istr("Etag") -EXPECT: Final[istr] = istr("Expect") -EXPIRES: Final[istr] = istr("Expires") -FORWARDED: Final[istr] = istr("Forwarded") -FROM: Final[istr] = istr("From") -HOST: Final[istr] = istr("Host") -IF_MATCH: Final[istr] = istr("If-Match") -IF_MODIFIED_SINCE: Final[istr] = istr("If-Modified-Since") -IF_NONE_MATCH: Final[istr] = istr("If-None-Match") -IF_RANGE: Final[istr] = istr("If-Range") -IF_UNMODIFIED_SINCE: Final[istr] = istr("If-Unmodified-Since") -KEEP_ALIVE: Final[istr] = istr("Keep-Alive") -LAST_EVENT_ID: Final[istr] = istr("Last-Event-ID") -LAST_MODIFIED: Final[istr] = istr("Last-Modified") -LINK: Final[istr] = istr("Link") -LOCATION: Final[istr] = istr("Location") -MAX_FORWARDS: Final[istr] = istr("Max-Forwards") -ORIGIN: Final[istr] = istr("Origin") -PRAGMA: Final[istr] = istr("Pragma") -PROXY_AUTHENTICATE: Final[istr] = istr("Proxy-Authenticate") -PROXY_AUTHORIZATION: Final[istr] = istr("Proxy-Authorization") -RANGE: Final[istr] = istr("Range") -REFERER: Final[istr] = istr("Referer") -RETRY_AFTER: Final[istr] = istr("Retry-After") -SEC_WEBSOCKET_ACCEPT: Final[istr] = istr("Sec-WebSocket-Accept") -SEC_WEBSOCKET_VERSION: Final[istr] = istr("Sec-WebSocket-Version") -SEC_WEBSOCKET_PROTOCOL: Final[istr] = istr("Sec-WebSocket-Protocol") -SEC_WEBSOCKET_EXTENSIONS: Final[istr] = istr("Sec-WebSocket-Extensions") -SEC_WEBSOCKET_KEY: Final[istr] = istr("Sec-WebSocket-Key") -SEC_WEBSOCKET_KEY1: Final[istr] = istr("Sec-WebSocket-Key1") -SERVER: Final[istr] = istr("Server") -SET_COOKIE: Final[istr] = istr("Set-Cookie") -TE: Final[istr] = istr("TE") -TRAILER: Final[istr] = istr("Trailer") -TRANSFER_ENCODING: Final[istr] = istr("Transfer-Encoding") -UPGRADE: Final[istr] = istr("Upgrade") -URI: Final[istr] = istr("URI") -USER_AGENT: Final[istr] = istr("User-Agent") -VARY: Final[istr] = istr("Vary") -VIA: Final[istr] = istr("Via") -WANT_DIGEST: Final[istr] = istr("Want-Digest") -WARNING: Final[istr] = istr("Warning") -WWW_AUTHENTICATE: Final[istr] = istr("WWW-Authenticate") -X_FORWARDED_FOR: Final[istr] = istr("X-Forwarded-For") -X_FORWARDED_HOST: Final[istr] = istr("X-Forwarded-Host") -X_FORWARDED_PROTO: Final[istr] = istr("X-Forwarded-Proto") - -# These are the upper/lower case variants of the headers/methods -# Example: {'hOst', 'host', 'HoST', 'HOSt', 'hOsT', 'HosT', 'hoSt', ...} -METH_HEAD_ALL: Final = frozenset( - map("".join, itertools.product(*zip(METH_HEAD.upper(), METH_HEAD.lower()))) -) -METH_CONNECT_ALL: Final = frozenset( - map("".join, itertools.product(*zip(METH_CONNECT.upper(), METH_CONNECT.lower()))) -) -HOST_ALL: Final = frozenset( - map("".join, itertools.product(*zip(HOST.upper(), HOST.lower()))) -) diff --git a/venv/lib/python3.12/site-packages/aiohttp/helpers.py b/venv/lib/python3.12/site-packages/aiohttp/helpers.py deleted file mode 100644 index ace4f0e..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/helpers.py +++ /dev/null @@ -1,958 +0,0 @@ -"""Various helper functions""" - -import asyncio -import base64 -import binascii -import contextlib -import datetime -import enum -import functools -import inspect -import netrc -import os -import platform -import re -import sys -import time -import weakref -from collections import namedtuple -from contextlib import suppress -from email.parser import HeaderParser -from email.utils import parsedate -from math import ceil -from pathlib import Path -from types import MappingProxyType, TracebackType -from typing import ( - Any, - Callable, - ContextManager, - Dict, - Generator, - Generic, - Iterable, - Iterator, - List, - Mapping, - Optional, - Protocol, - Tuple, - Type, - TypeVar, - Union, - get_args, - overload, -) -from urllib.parse import quote -from urllib.request import getproxies, proxy_bypass - -import attr -from multidict import MultiDict, MultiDictProxy, MultiMapping -from propcache.api import under_cached_property as reify -from yarl import URL - -from . import hdrs -from .log import client_logger - -if sys.version_info >= (3, 11): - import asyncio as async_timeout -else: - import async_timeout - -__all__ = ("BasicAuth", "ChainMapProxy", "ETag", "reify") - -IS_MACOS = platform.system() == "Darwin" -IS_WINDOWS = platform.system() == "Windows" - -PY_310 = sys.version_info >= (3, 10) -PY_311 = sys.version_info >= (3, 11) - - -_T = TypeVar("_T") -_S = TypeVar("_S") - -_SENTINEL = enum.Enum("_SENTINEL", "sentinel") -sentinel = _SENTINEL.sentinel - -NO_EXTENSIONS = bool(os.environ.get("AIOHTTP_NO_EXTENSIONS")) - -# https://datatracker.ietf.org/doc/html/rfc9112#section-6.3-2.1 -EMPTY_BODY_STATUS_CODES = frozenset((204, 304, *range(100, 200))) -# https://datatracker.ietf.org/doc/html/rfc9112#section-6.3-2.1 -# https://datatracker.ietf.org/doc/html/rfc9112#section-6.3-2.2 -EMPTY_BODY_METHODS = hdrs.METH_HEAD_ALL - -DEBUG = sys.flags.dev_mode or ( - not sys.flags.ignore_environment and bool(os.environ.get("PYTHONASYNCIODEBUG")) -) - - -CHAR = {chr(i) for i in range(0, 128)} -CTL = {chr(i) for i in range(0, 32)} | { - chr(127), -} -SEPARATORS = { - "(", - ")", - "<", - ">", - "@", - ",", - ";", - ":", - "\\", - '"', - "/", - "[", - "]", - "?", - "=", - "{", - "}", - " ", - chr(9), -} -TOKEN = CHAR ^ CTL ^ SEPARATORS - - -class noop: - def __await__(self) -> Generator[None, None, None]: - yield - - -class BasicAuth(namedtuple("BasicAuth", ["login", "password", "encoding"])): - """Http basic authentication helper.""" - - def __new__( - cls, login: str, password: str = "", encoding: str = "latin1" - ) -> "BasicAuth": - if login is None: - raise ValueError("None is not allowed as login value") - - if password is None: - raise ValueError("None is not allowed as password value") - - if ":" in login: - raise ValueError('A ":" is not allowed in login (RFC 1945#section-11.1)') - - return super().__new__(cls, login, password, encoding) - - @classmethod - def decode(cls, auth_header: str, encoding: str = "latin1") -> "BasicAuth": - """Create a BasicAuth object from an Authorization HTTP header.""" - try: - auth_type, encoded_credentials = auth_header.split(" ", 1) - except ValueError: - raise ValueError("Could not parse authorization header.") - - if auth_type.lower() != "basic": - raise ValueError("Unknown authorization method %s" % auth_type) - - try: - decoded = base64.b64decode( - encoded_credentials.encode("ascii"), validate=True - ).decode(encoding) - except binascii.Error: - raise ValueError("Invalid base64 encoding.") - - try: - # RFC 2617 HTTP Authentication - # https://www.ietf.org/rfc/rfc2617.txt - # the colon must be present, but the username and password may be - # otherwise blank. - username, password = decoded.split(":", 1) - except ValueError: - raise ValueError("Invalid credentials.") - - return cls(username, password, encoding=encoding) - - @classmethod - def from_url(cls, url: URL, *, encoding: str = "latin1") -> Optional["BasicAuth"]: - """Create BasicAuth from url.""" - if not isinstance(url, URL): - raise TypeError("url should be yarl.URL instance") - # Check raw_user and raw_password first as yarl is likely - # to already have these values parsed from the netloc in the cache. - if url.raw_user is None and url.raw_password is None: - return None - return cls(url.user or "", url.password or "", encoding=encoding) - - def encode(self) -> str: - """Encode credentials.""" - creds = (f"{self.login}:{self.password}").encode(self.encoding) - return "Basic %s" % base64.b64encode(creds).decode(self.encoding) - - -def strip_auth_from_url(url: URL) -> Tuple[URL, Optional[BasicAuth]]: - """Remove user and password from URL if present and return BasicAuth object.""" - # Check raw_user and raw_password first as yarl is likely - # to already have these values parsed from the netloc in the cache. - if url.raw_user is None and url.raw_password is None: - return url, None - return url.with_user(None), BasicAuth(url.user or "", url.password or "") - - -def netrc_from_env() -> Optional[netrc.netrc]: - """Load netrc from file. - - Attempt to load it from the path specified by the env-var - NETRC or in the default location in the user's home directory. - - Returns None if it couldn't be found or fails to parse. - """ - netrc_env = os.environ.get("NETRC") - - if netrc_env is not None: - netrc_path = Path(netrc_env) - else: - try: - home_dir = Path.home() - except RuntimeError as e: # pragma: no cover - # if pathlib can't resolve home, it may raise a RuntimeError - client_logger.debug( - "Could not resolve home directory when " - "trying to look for .netrc file: %s", - e, - ) - return None - - netrc_path = home_dir / ("_netrc" if IS_WINDOWS else ".netrc") - - try: - return netrc.netrc(str(netrc_path)) - except netrc.NetrcParseError as e: - client_logger.warning("Could not parse .netrc file: %s", e) - except OSError as e: - netrc_exists = False - with contextlib.suppress(OSError): - netrc_exists = netrc_path.is_file() - # we couldn't read the file (doesn't exist, permissions, etc.) - if netrc_env or netrc_exists: - # only warn if the environment wanted us to load it, - # or it appears like the default file does actually exist - client_logger.warning("Could not read .netrc file: %s", e) - - return None - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class ProxyInfo: - proxy: URL - proxy_auth: Optional[BasicAuth] - - -def basicauth_from_netrc(netrc_obj: Optional[netrc.netrc], host: str) -> BasicAuth: - """ - Return :py:class:`~aiohttp.BasicAuth` credentials for ``host`` from ``netrc_obj``. - - :raises LookupError: if ``netrc_obj`` is :py:data:`None` or if no - entry is found for the ``host``. - """ - if netrc_obj is None: - raise LookupError("No .netrc file found") - auth_from_netrc = netrc_obj.authenticators(host) - - if auth_from_netrc is None: - raise LookupError(f"No entry for {host!s} found in the `.netrc` file.") - login, account, password = auth_from_netrc - - # TODO(PY311): username = login or account - # Up to python 3.10, account could be None if not specified, - # and login will be empty string if not specified. From 3.11, - # login and account will be empty string if not specified. - username = login if (login or account is None) else account - - # TODO(PY311): Remove this, as password will be empty string - # if not specified - if password is None: - password = "" - - return BasicAuth(username, password) - - -def proxies_from_env() -> Dict[str, ProxyInfo]: - proxy_urls = { - k: URL(v) - for k, v in getproxies().items() - if k in ("http", "https", "ws", "wss") - } - netrc_obj = netrc_from_env() - stripped = {k: strip_auth_from_url(v) for k, v in proxy_urls.items()} - ret = {} - for proto, val in stripped.items(): - proxy, auth = val - if proxy.scheme in ("https", "wss"): - client_logger.warning( - "%s proxies %s are not supported, ignoring", proxy.scheme.upper(), proxy - ) - continue - if netrc_obj and auth is None: - if proxy.host is not None: - try: - auth = basicauth_from_netrc(netrc_obj, proxy.host) - except LookupError: - auth = None - ret[proto] = ProxyInfo(proxy, auth) - return ret - - -def get_env_proxy_for_url(url: URL) -> Tuple[URL, Optional[BasicAuth]]: - """Get a permitted proxy for the given URL from the env.""" - if url.host is not None and proxy_bypass(url.host): - raise LookupError(f"Proxying is disallowed for `{url.host!r}`") - - proxies_in_env = proxies_from_env() - try: - proxy_info = proxies_in_env[url.scheme] - except KeyError: - raise LookupError(f"No proxies found for `{url!s}` in the env") - else: - return proxy_info.proxy, proxy_info.proxy_auth - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class MimeType: - type: str - subtype: str - suffix: str - parameters: "MultiDictProxy[str]" - - -@functools.lru_cache(maxsize=56) -def parse_mimetype(mimetype: str) -> MimeType: - """Parses a MIME type into its components. - - mimetype is a MIME type string. - - Returns a MimeType object. - - Example: - - >>> parse_mimetype('text/html; charset=utf-8') - MimeType(type='text', subtype='html', suffix='', - parameters={'charset': 'utf-8'}) - - """ - if not mimetype: - return MimeType( - type="", subtype="", suffix="", parameters=MultiDictProxy(MultiDict()) - ) - - parts = mimetype.split(";") - params: MultiDict[str] = MultiDict() - for item in parts[1:]: - if not item: - continue - key, _, value = item.partition("=") - params.add(key.lower().strip(), value.strip(' "')) - - fulltype = parts[0].strip().lower() - if fulltype == "*": - fulltype = "*/*" - - mtype, _, stype = fulltype.partition("/") - stype, _, suffix = stype.partition("+") - - return MimeType( - type=mtype, subtype=stype, suffix=suffix, parameters=MultiDictProxy(params) - ) - - -@functools.lru_cache(maxsize=56) -def parse_content_type(raw: str) -> Tuple[str, MappingProxyType[str, str]]: - """Parse Content-Type header. - - Returns a tuple of the parsed content type and a - MappingProxyType of parameters. - """ - msg = HeaderParser().parsestr(f"Content-Type: {raw}") - content_type = msg.get_content_type() - params = msg.get_params(()) - content_dict = dict(params[1:]) # First element is content type again - return content_type, MappingProxyType(content_dict) - - -def guess_filename(obj: Any, default: Optional[str] = None) -> Optional[str]: - name = getattr(obj, "name", None) - if name and isinstance(name, str) and name[0] != "<" and name[-1] != ">": - return Path(name).name - return default - - -not_qtext_re = re.compile(r"[^\041\043-\133\135-\176]") -QCONTENT = {chr(i) for i in range(0x20, 0x7F)} | {"\t"} - - -def quoted_string(content: str) -> str: - """Return 7-bit content as quoted-string. - - Format content into a quoted-string as defined in RFC5322 for - Internet Message Format. Notice that this is not the 8-bit HTTP - format, but the 7-bit email format. Content must be in usascii or - a ValueError is raised. - """ - if not (QCONTENT > set(content)): - raise ValueError(f"bad content for quoted-string {content!r}") - return not_qtext_re.sub(lambda x: "\\" + x.group(0), content) - - -def content_disposition_header( - disptype: str, quote_fields: bool = True, _charset: str = "utf-8", **params: str -) -> str: - """Sets ``Content-Disposition`` header for MIME. - - This is the MIME payload Content-Disposition header from RFC 2183 - and RFC 7579 section 4.2, not the HTTP Content-Disposition from - RFC 6266. - - disptype is a disposition type: inline, attachment, form-data. - Should be valid extension token (see RFC 2183) - - quote_fields performs value quoting to 7-bit MIME headers - according to RFC 7578. Set to quote_fields to False if recipient - can take 8-bit file names and field values. - - _charset specifies the charset to use when quote_fields is True. - - params is a dict with disposition params. - """ - if not disptype or not (TOKEN > set(disptype)): - raise ValueError(f"bad content disposition type {disptype!r}") - - value = disptype - if params: - lparams = [] - for key, val in params.items(): - if not key or not (TOKEN > set(key)): - raise ValueError(f"bad content disposition parameter {key!r}={val!r}") - if quote_fields: - if key.lower() == "filename": - qval = quote(val, "", encoding=_charset) - lparams.append((key, '"%s"' % qval)) - else: - try: - qval = quoted_string(val) - except ValueError: - qval = "".join( - (_charset, "''", quote(val, "", encoding=_charset)) - ) - lparams.append((key + "*", qval)) - else: - lparams.append((key, '"%s"' % qval)) - else: - qval = val.replace("\\", "\\\\").replace('"', '\\"') - lparams.append((key, '"%s"' % qval)) - sparams = "; ".join("=".join(pair) for pair in lparams) - value = "; ".join((value, sparams)) - return value - - -def is_ip_address(host: Optional[str]) -> bool: - """Check if host looks like an IP Address. - - This check is only meant as a heuristic to ensure that - a host is not a domain name. - """ - if not host: - return False - # For a host to be an ipv4 address, it must be all numeric. - # The host must contain a colon to be an IPv6 address. - return ":" in host or host.replace(".", "").isdigit() - - -_cached_current_datetime: Optional[int] = None -_cached_formatted_datetime = "" - - -def rfc822_formatted_time() -> str: - global _cached_current_datetime - global _cached_formatted_datetime - - now = int(time.time()) - if now != _cached_current_datetime: - # Weekday and month names for HTTP date/time formatting; - # always English! - # Tuples are constants stored in codeobject! - _weekdayname = ("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun") - _monthname = ( - "", # Dummy so we can use 1-based month numbers - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec", - ) - - year, month, day, hh, mm, ss, wd, *tail = time.gmtime(now) - _cached_formatted_datetime = "%s, %02d %3s %4d %02d:%02d:%02d GMT" % ( - _weekdayname[wd], - day, - _monthname[month], - year, - hh, - mm, - ss, - ) - _cached_current_datetime = now - return _cached_formatted_datetime - - -def _weakref_handle(info: "Tuple[weakref.ref[object], str]") -> None: - ref, name = info - ob = ref() - if ob is not None: - with suppress(Exception): - getattr(ob, name)() - - -def weakref_handle( - ob: object, - name: str, - timeout: float, - loop: asyncio.AbstractEventLoop, - timeout_ceil_threshold: float = 5, -) -> Optional[asyncio.TimerHandle]: - if timeout is not None and timeout > 0: - when = loop.time() + timeout - if timeout >= timeout_ceil_threshold: - when = ceil(when) - - return loop.call_at(when, _weakref_handle, (weakref.ref(ob), name)) - return None - - -def call_later( - cb: Callable[[], Any], - timeout: float, - loop: asyncio.AbstractEventLoop, - timeout_ceil_threshold: float = 5, -) -> Optional[asyncio.TimerHandle]: - if timeout is None or timeout <= 0: - return None - now = loop.time() - when = calculate_timeout_when(now, timeout, timeout_ceil_threshold) - return loop.call_at(when, cb) - - -def calculate_timeout_when( - loop_time: float, - timeout: float, - timeout_ceiling_threshold: float, -) -> float: - """Calculate when to execute a timeout.""" - when = loop_time + timeout - if timeout > timeout_ceiling_threshold: - return ceil(when) - return when - - -class TimeoutHandle: - """Timeout handle""" - - __slots__ = ("_timeout", "_loop", "_ceil_threshold", "_callbacks") - - def __init__( - self, - loop: asyncio.AbstractEventLoop, - timeout: Optional[float], - ceil_threshold: float = 5, - ) -> None: - self._timeout = timeout - self._loop = loop - self._ceil_threshold = ceil_threshold - self._callbacks: List[ - Tuple[Callable[..., None], Tuple[Any, ...], Dict[str, Any]] - ] = [] - - def register( - self, callback: Callable[..., None], *args: Any, **kwargs: Any - ) -> None: - self._callbacks.append((callback, args, kwargs)) - - def close(self) -> None: - self._callbacks.clear() - - def start(self) -> Optional[asyncio.TimerHandle]: - timeout = self._timeout - if timeout is not None and timeout > 0: - when = self._loop.time() + timeout - if timeout >= self._ceil_threshold: - when = ceil(when) - return self._loop.call_at(when, self.__call__) - else: - return None - - def timer(self) -> "BaseTimerContext": - if self._timeout is not None and self._timeout > 0: - timer = TimerContext(self._loop) - self.register(timer.timeout) - return timer - else: - return TimerNoop() - - def __call__(self) -> None: - for cb, args, kwargs in self._callbacks: - with suppress(Exception): - cb(*args, **kwargs) - - self._callbacks.clear() - - -class BaseTimerContext(ContextManager["BaseTimerContext"]): - - __slots__ = () - - def assert_timeout(self) -> None: - """Raise TimeoutError if timeout has been exceeded.""" - - -class TimerNoop(BaseTimerContext): - - __slots__ = () - - def __enter__(self) -> BaseTimerContext: - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - return - - -class TimerContext(BaseTimerContext): - """Low resolution timeout context manager""" - - __slots__ = ("_loop", "_tasks", "_cancelled", "_cancelling") - - def __init__(self, loop: asyncio.AbstractEventLoop) -> None: - self._loop = loop - self._tasks: List[asyncio.Task[Any]] = [] - self._cancelled = False - self._cancelling = 0 - - def assert_timeout(self) -> None: - """Raise TimeoutError if timer has already been cancelled.""" - if self._cancelled: - raise asyncio.TimeoutError from None - - def __enter__(self) -> BaseTimerContext: - task = asyncio.current_task(loop=self._loop) - if task is None: - raise RuntimeError("Timeout context manager should be used inside a task") - - if sys.version_info >= (3, 11): - # Remember if the task was already cancelling - # so when we __exit__ we can decide if we should - # raise asyncio.TimeoutError or let the cancellation propagate - self._cancelling = task.cancelling() - - if self._cancelled: - raise asyncio.TimeoutError from None - - self._tasks.append(task) - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> Optional[bool]: - enter_task: Optional[asyncio.Task[Any]] = None - if self._tasks: - enter_task = self._tasks.pop() - - if exc_type is asyncio.CancelledError and self._cancelled: - assert enter_task is not None - # The timeout was hit, and the task was cancelled - # so we need to uncancel the last task that entered the context manager - # since the cancellation should not leak out of the context manager - if sys.version_info >= (3, 11): - # If the task was already cancelling don't raise - # asyncio.TimeoutError and instead return None - # to allow the cancellation to propagate - if enter_task.uncancel() > self._cancelling: - return None - raise asyncio.TimeoutError from exc_val - return None - - def timeout(self) -> None: - if not self._cancelled: - for task in set(self._tasks): - task.cancel() - - self._cancelled = True - - -def ceil_timeout( - delay: Optional[float], ceil_threshold: float = 5 -) -> async_timeout.Timeout: - if delay is None or delay <= 0: - return async_timeout.timeout(None) - - loop = asyncio.get_running_loop() - now = loop.time() - when = now + delay - if delay > ceil_threshold: - when = ceil(when) - return async_timeout.timeout_at(when) - - -class HeadersMixin: - """Mixin for handling headers.""" - - ATTRS = frozenset(["_content_type", "_content_dict", "_stored_content_type"]) - - _headers: MultiMapping[str] - _content_type: Optional[str] = None - _content_dict: Optional[Dict[str, str]] = None - _stored_content_type: Union[str, None, _SENTINEL] = sentinel - - def _parse_content_type(self, raw: Optional[str]) -> None: - self._stored_content_type = raw - if raw is None: - # default value according to RFC 2616 - self._content_type = "application/octet-stream" - self._content_dict = {} - else: - content_type, content_mapping_proxy = parse_content_type(raw) - self._content_type = content_type - # _content_dict needs to be mutable so we can update it - self._content_dict = content_mapping_proxy.copy() - - @property - def content_type(self) -> str: - """The value of content part for Content-Type HTTP header.""" - raw = self._headers.get(hdrs.CONTENT_TYPE) - if self._stored_content_type != raw: - self._parse_content_type(raw) - assert self._content_type is not None - return self._content_type - - @property - def charset(self) -> Optional[str]: - """The value of charset part for Content-Type HTTP header.""" - raw = self._headers.get(hdrs.CONTENT_TYPE) - if self._stored_content_type != raw: - self._parse_content_type(raw) - assert self._content_dict is not None - return self._content_dict.get("charset") - - @property - def content_length(self) -> Optional[int]: - """The value of Content-Length HTTP header.""" - content_length = self._headers.get(hdrs.CONTENT_LENGTH) - return None if content_length is None else int(content_length) - - -def set_result(fut: "asyncio.Future[_T]", result: _T) -> None: - if not fut.done(): - fut.set_result(result) - - -_EXC_SENTINEL = BaseException() - - -class ErrorableProtocol(Protocol): - def set_exception( - self, - exc: BaseException, - exc_cause: BaseException = ..., - ) -> None: ... # pragma: no cover - - -def set_exception( - fut: "asyncio.Future[_T] | ErrorableProtocol", - exc: BaseException, - exc_cause: BaseException = _EXC_SENTINEL, -) -> None: - """Set future exception. - - If the future is marked as complete, this function is a no-op. - - :param exc_cause: An exception that is a direct cause of ``exc``. - Only set if provided. - """ - if asyncio.isfuture(fut) and fut.done(): - return - - exc_is_sentinel = exc_cause is _EXC_SENTINEL - exc_causes_itself = exc is exc_cause - if not exc_is_sentinel and not exc_causes_itself: - exc.__cause__ = exc_cause - - fut.set_exception(exc) - - -@functools.total_ordering -class AppKey(Generic[_T]): - """Keys for static typing support in Application.""" - - __slots__ = ("_name", "_t", "__orig_class__") - - # This may be set by Python when instantiating with a generic type. We need to - # support this, in order to support types that are not concrete classes, - # like Iterable, which can't be passed as the second parameter to __init__. - __orig_class__: Type[object] - - def __init__(self, name: str, t: Optional[Type[_T]] = None): - # Prefix with module name to help deduplicate key names. - frame = inspect.currentframe() - while frame: - if frame.f_code.co_name == "": - module: str = frame.f_globals["__name__"] - break - frame = frame.f_back - - self._name = module + "." + name - self._t = t - - def __lt__(self, other: object) -> bool: - if isinstance(other, AppKey): - return self._name < other._name - return True # Order AppKey above other types. - - def __repr__(self) -> str: - t = self._t - if t is None: - with suppress(AttributeError): - # Set to type arg. - t = get_args(self.__orig_class__)[0] - - if t is None: - t_repr = "<>" - elif isinstance(t, type): - if t.__module__ == "builtins": - t_repr = t.__qualname__ - else: - t_repr = f"{t.__module__}.{t.__qualname__}" - else: - t_repr = repr(t) - return f"" - - -class ChainMapProxy(Mapping[Union[str, AppKey[Any]], Any]): - __slots__ = ("_maps",) - - def __init__(self, maps: Iterable[Mapping[Union[str, AppKey[Any]], Any]]) -> None: - self._maps = tuple(maps) - - def __init_subclass__(cls) -> None: - raise TypeError( - "Inheritance class {} from ChainMapProxy " - "is forbidden".format(cls.__name__) - ) - - @overload # type: ignore[override] - def __getitem__(self, key: AppKey[_T]) -> _T: ... - - @overload - def __getitem__(self, key: str) -> Any: ... - - def __getitem__(self, key: Union[str, AppKey[_T]]) -> Any: - for mapping in self._maps: - try: - return mapping[key] - except KeyError: - pass - raise KeyError(key) - - @overload # type: ignore[override] - def get(self, key: AppKey[_T], default: _S) -> Union[_T, _S]: ... - - @overload - def get(self, key: AppKey[_T], default: None = ...) -> Optional[_T]: ... - - @overload - def get(self, key: str, default: Any = ...) -> Any: ... - - def get(self, key: Union[str, AppKey[_T]], default: Any = None) -> Any: - try: - return self[key] - except KeyError: - return default - - def __len__(self) -> int: - # reuses stored hash values if possible - return len(set().union(*self._maps)) - - def __iter__(self) -> Iterator[Union[str, AppKey[Any]]]: - d: Dict[Union[str, AppKey[Any]], Any] = {} - for mapping in reversed(self._maps): - # reuses stored hash values if possible - d.update(mapping) - return iter(d) - - def __contains__(self, key: object) -> bool: - return any(key in m for m in self._maps) - - def __bool__(self) -> bool: - return any(self._maps) - - def __repr__(self) -> str: - content = ", ".join(map(repr, self._maps)) - return f"ChainMapProxy({content})" - - -# https://tools.ietf.org/html/rfc7232#section-2.3 -_ETAGC = r"[!\x23-\x7E\x80-\xff]+" -_ETAGC_RE = re.compile(_ETAGC) -_QUOTED_ETAG = rf'(W/)?"({_ETAGC})"' -QUOTED_ETAG_RE = re.compile(_QUOTED_ETAG) -LIST_QUOTED_ETAG_RE = re.compile(rf"({_QUOTED_ETAG})(?:\s*,\s*|$)|(.)") - -ETAG_ANY = "*" - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class ETag: - value: str - is_weak: bool = False - - -def validate_etag_value(value: str) -> None: - if value != ETAG_ANY and not _ETAGC_RE.fullmatch(value): - raise ValueError( - f"Value {value!r} is not a valid etag. Maybe it contains '\"'?" - ) - - -def parse_http_date(date_str: Optional[str]) -> Optional[datetime.datetime]: - """Process a date string, return a datetime object""" - if date_str is not None: - timetuple = parsedate(date_str) - if timetuple is not None: - with suppress(ValueError): - return datetime.datetime(*timetuple[:6], tzinfo=datetime.timezone.utc) - return None - - -@functools.lru_cache -def must_be_empty_body(method: str, code: int) -> bool: - """Check if a request must return an empty body.""" - return ( - code in EMPTY_BODY_STATUS_CODES - or method in EMPTY_BODY_METHODS - or (200 <= code < 300 and method in hdrs.METH_CONNECT_ALL) - ) - - -def should_remove_content_length(method: str, code: int) -> bool: - """Check if a Content-Length header should be removed. - - This should always be a subset of must_be_empty_body - """ - # https://www.rfc-editor.org/rfc/rfc9110.html#section-8.6-8 - # https://www.rfc-editor.org/rfc/rfc9110.html#section-15.4.5-4 - return code in EMPTY_BODY_STATUS_CODES or ( - 200 <= code < 300 and method in hdrs.METH_CONNECT_ALL - ) diff --git a/venv/lib/python3.12/site-packages/aiohttp/http.py b/venv/lib/python3.12/site-packages/aiohttp/http.py deleted file mode 100644 index a1feae2..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/http.py +++ /dev/null @@ -1,72 +0,0 @@ -import sys -from http import HTTPStatus -from typing import Mapping, Tuple - -from . import __version__ -from .http_exceptions import HttpProcessingError as HttpProcessingError -from .http_parser import ( - HeadersParser as HeadersParser, - HttpParser as HttpParser, - HttpRequestParser as HttpRequestParser, - HttpResponseParser as HttpResponseParser, - RawRequestMessage as RawRequestMessage, - RawResponseMessage as RawResponseMessage, -) -from .http_websocket import ( - WS_CLOSED_MESSAGE as WS_CLOSED_MESSAGE, - WS_CLOSING_MESSAGE as WS_CLOSING_MESSAGE, - WS_KEY as WS_KEY, - WebSocketError as WebSocketError, - WebSocketReader as WebSocketReader, - WebSocketWriter as WebSocketWriter, - WSCloseCode as WSCloseCode, - WSMessage as WSMessage, - WSMsgType as WSMsgType, - ws_ext_gen as ws_ext_gen, - ws_ext_parse as ws_ext_parse, -) -from .http_writer import ( - HttpVersion as HttpVersion, - HttpVersion10 as HttpVersion10, - HttpVersion11 as HttpVersion11, - StreamWriter as StreamWriter, -) - -__all__ = ( - "HttpProcessingError", - "RESPONSES", - "SERVER_SOFTWARE", - # .http_writer - "StreamWriter", - "HttpVersion", - "HttpVersion10", - "HttpVersion11", - # .http_parser - "HeadersParser", - "HttpParser", - "HttpRequestParser", - "HttpResponseParser", - "RawRequestMessage", - "RawResponseMessage", - # .http_websocket - "WS_CLOSED_MESSAGE", - "WS_CLOSING_MESSAGE", - "WS_KEY", - "WebSocketReader", - "WebSocketWriter", - "ws_ext_gen", - "ws_ext_parse", - "WSMessage", - "WebSocketError", - "WSMsgType", - "WSCloseCode", -) - - -SERVER_SOFTWARE: str = "Python/{0[0]}.{0[1]} aiohttp/{1}".format( - sys.version_info, __version__ -) - -RESPONSES: Mapping[int, Tuple[str, str]] = { - v: (v.phrase, v.description) for v in HTTPStatus.__members__.values() -} diff --git a/venv/lib/python3.12/site-packages/aiohttp/http_exceptions.py b/venv/lib/python3.12/site-packages/aiohttp/http_exceptions.py deleted file mode 100644 index 7738302..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/http_exceptions.py +++ /dev/null @@ -1,112 +0,0 @@ -"""Low-level http related exceptions.""" - -from textwrap import indent -from typing import Optional, Union - -from .typedefs import _CIMultiDict - -__all__ = ("HttpProcessingError",) - - -class HttpProcessingError(Exception): - """HTTP error. - - Shortcut for raising HTTP errors with custom code, message and headers. - - code: HTTP Error code. - message: (optional) Error message. - headers: (optional) Headers to be sent in response, a list of pairs - """ - - code = 0 - message = "" - headers = None - - def __init__( - self, - *, - code: Optional[int] = None, - message: str = "", - headers: Optional[_CIMultiDict] = None, - ) -> None: - if code is not None: - self.code = code - self.headers = headers - self.message = message - - def __str__(self) -> str: - msg = indent(self.message, " ") - return f"{self.code}, message:\n{msg}" - - def __repr__(self) -> str: - return f"<{self.__class__.__name__}: {self.code}, message={self.message!r}>" - - -class BadHttpMessage(HttpProcessingError): - - code = 400 - message = "Bad Request" - - def __init__(self, message: str, *, headers: Optional[_CIMultiDict] = None) -> None: - super().__init__(message=message, headers=headers) - self.args = (message,) - - -class HttpBadRequest(BadHttpMessage): - - code = 400 - message = "Bad Request" - - -class PayloadEncodingError(BadHttpMessage): - """Base class for payload errors""" - - -class ContentEncodingError(PayloadEncodingError): - """Content encoding error.""" - - -class TransferEncodingError(PayloadEncodingError): - """transfer encoding error.""" - - -class ContentLengthError(PayloadEncodingError): - """Not enough data to satisfy content length header.""" - - -class LineTooLong(BadHttpMessage): - def __init__( - self, line: str, limit: str = "Unknown", actual_size: str = "Unknown" - ) -> None: - super().__init__( - f"Got more than {limit} bytes ({actual_size}) when reading {line}." - ) - self.args = (line, limit, actual_size) - - -class InvalidHeader(BadHttpMessage): - def __init__(self, hdr: Union[bytes, str]) -> None: - hdr_s = hdr.decode(errors="backslashreplace") if isinstance(hdr, bytes) else hdr - super().__init__(f"Invalid HTTP header: {hdr!r}") - self.hdr = hdr_s - self.args = (hdr,) - - -class BadStatusLine(BadHttpMessage): - def __init__(self, line: str = "", error: Optional[str] = None) -> None: - if not isinstance(line, str): - line = repr(line) - super().__init__(error or f"Bad status line {line!r}") - self.args = (line,) - self.line = line - - -class BadHttpMethod(BadStatusLine): - """Invalid HTTP method in status line.""" - - def __init__(self, line: str = "", error: Optional[str] = None) -> None: - super().__init__(line, error or f"Bad HTTP method in status line {line!r}") - - -class InvalidURLError(BadHttpMessage): - pass diff --git a/venv/lib/python3.12/site-packages/aiohttp/http_parser.py b/venv/lib/python3.12/site-packages/aiohttp/http_parser.py deleted file mode 100644 index 9f864b2..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/http_parser.py +++ /dev/null @@ -1,1050 +0,0 @@ -import abc -import asyncio -import re -import string -from contextlib import suppress -from enum import IntEnum -from typing import ( - Any, - ClassVar, - Final, - Generic, - List, - Literal, - NamedTuple, - Optional, - Pattern, - Set, - Tuple, - Type, - TypeVar, - Union, -) - -from multidict import CIMultiDict, CIMultiDictProxy, istr -from yarl import URL - -from . import hdrs -from .base_protocol import BaseProtocol -from .compression_utils import HAS_BROTLI, BrotliDecompressor, ZLibDecompressor -from .helpers import ( - _EXC_SENTINEL, - DEBUG, - EMPTY_BODY_METHODS, - EMPTY_BODY_STATUS_CODES, - NO_EXTENSIONS, - BaseTimerContext, - set_exception, -) -from .http_exceptions import ( - BadHttpMessage, - BadHttpMethod, - BadStatusLine, - ContentEncodingError, - ContentLengthError, - InvalidHeader, - InvalidURLError, - LineTooLong, - TransferEncodingError, -) -from .http_writer import HttpVersion, HttpVersion10 -from .streams import EMPTY_PAYLOAD, StreamReader -from .typedefs import RawHeaders - -__all__ = ( - "HeadersParser", - "HttpParser", - "HttpRequestParser", - "HttpResponseParser", - "RawRequestMessage", - "RawResponseMessage", -) - -_SEP = Literal[b"\r\n", b"\n"] - -ASCIISET: Final[Set[str]] = set(string.printable) - -# See https://www.rfc-editor.org/rfc/rfc9110.html#name-overview -# and https://www.rfc-editor.org/rfc/rfc9110.html#name-tokens -# -# method = token -# tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." / -# "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA -# token = 1*tchar -_TCHAR_SPECIALS: Final[str] = re.escape("!#$%&'*+-.^_`|~") -TOKENRE: Final[Pattern[str]] = re.compile(f"[0-9A-Za-z{_TCHAR_SPECIALS}]+") -VERSRE: Final[Pattern[str]] = re.compile(r"HTTP/(\d)\.(\d)", re.ASCII) -DIGITS: Final[Pattern[str]] = re.compile(r"\d+", re.ASCII) -HEXDIGITS: Final[Pattern[bytes]] = re.compile(rb"[0-9a-fA-F]+") - - -class RawRequestMessage(NamedTuple): - method: str - path: str - version: HttpVersion - headers: "CIMultiDictProxy[str]" - raw_headers: RawHeaders - should_close: bool - compression: Optional[str] - upgrade: bool - chunked: bool - url: URL - - -class RawResponseMessage(NamedTuple): - version: HttpVersion - code: int - reason: str - headers: CIMultiDictProxy[str] - raw_headers: RawHeaders - should_close: bool - compression: Optional[str] - upgrade: bool - chunked: bool - - -_MsgT = TypeVar("_MsgT", RawRequestMessage, RawResponseMessage) - - -class ParseState(IntEnum): - - PARSE_NONE = 0 - PARSE_LENGTH = 1 - PARSE_CHUNKED = 2 - PARSE_UNTIL_EOF = 3 - - -class ChunkState(IntEnum): - PARSE_CHUNKED_SIZE = 0 - PARSE_CHUNKED_CHUNK = 1 - PARSE_CHUNKED_CHUNK_EOF = 2 - PARSE_MAYBE_TRAILERS = 3 - PARSE_TRAILERS = 4 - - -class HeadersParser: - def __init__( - self, - max_line_size: int = 8190, - max_headers: int = 32768, - max_field_size: int = 8190, - lax: bool = False, - ) -> None: - self.max_line_size = max_line_size - self.max_headers = max_headers - self.max_field_size = max_field_size - self._lax = lax - - def parse_headers( - self, lines: List[bytes] - ) -> Tuple["CIMultiDictProxy[str]", RawHeaders]: - headers: CIMultiDict[str] = CIMultiDict() - # note: "raw" does not mean inclusion of OWS before/after the field value - raw_headers = [] - - lines_idx = 0 - line = lines[lines_idx] - line_count = len(lines) - - while line: - # Parse initial header name : value pair. - try: - bname, bvalue = line.split(b":", 1) - except ValueError: - raise InvalidHeader(line) from None - - if len(bname) == 0: - raise InvalidHeader(bname) - - # https://www.rfc-editor.org/rfc/rfc9112.html#section-5.1-2 - if {bname[0], bname[-1]} & {32, 9}: # {" ", "\t"} - raise InvalidHeader(line) - - bvalue = bvalue.lstrip(b" \t") - if len(bname) > self.max_field_size: - raise LineTooLong( - "request header name {}".format( - bname.decode("utf8", "backslashreplace") - ), - str(self.max_field_size), - str(len(bname)), - ) - name = bname.decode("utf-8", "surrogateescape") - if not TOKENRE.fullmatch(name): - raise InvalidHeader(bname) - - header_length = len(bvalue) - - # next line - lines_idx += 1 - line = lines[lines_idx] - - # consume continuation lines - continuation = self._lax and line and line[0] in (32, 9) # (' ', '\t') - - # Deprecated: https://www.rfc-editor.org/rfc/rfc9112.html#name-obsolete-line-folding - if continuation: - bvalue_lst = [bvalue] - while continuation: - header_length += len(line) - if header_length > self.max_field_size: - raise LineTooLong( - "request header field {}".format( - bname.decode("utf8", "backslashreplace") - ), - str(self.max_field_size), - str(header_length), - ) - bvalue_lst.append(line) - - # next line - lines_idx += 1 - if lines_idx < line_count: - line = lines[lines_idx] - if line: - continuation = line[0] in (32, 9) # (' ', '\t') - else: - line = b"" - break - bvalue = b"".join(bvalue_lst) - else: - if header_length > self.max_field_size: - raise LineTooLong( - "request header field {}".format( - bname.decode("utf8", "backslashreplace") - ), - str(self.max_field_size), - str(header_length), - ) - - bvalue = bvalue.strip(b" \t") - value = bvalue.decode("utf-8", "surrogateescape") - - # https://www.rfc-editor.org/rfc/rfc9110.html#section-5.5-5 - if "\n" in value or "\r" in value or "\x00" in value: - raise InvalidHeader(bvalue) - - headers.add(name, value) - raw_headers.append((bname, bvalue)) - - return (CIMultiDictProxy(headers), tuple(raw_headers)) - - -def _is_supported_upgrade(headers: CIMultiDictProxy[str]) -> bool: - """Check if the upgrade header is supported.""" - return headers.get(hdrs.UPGRADE, "").lower() in {"tcp", "websocket"} - - -class HttpParser(abc.ABC, Generic[_MsgT]): - lax: ClassVar[bool] = False - - def __init__( - self, - protocol: Optional[BaseProtocol] = None, - loop: Optional[asyncio.AbstractEventLoop] = None, - limit: int = 2**16, - max_line_size: int = 8190, - max_headers: int = 32768, - max_field_size: int = 8190, - timer: Optional[BaseTimerContext] = None, - code: Optional[int] = None, - method: Optional[str] = None, - payload_exception: Optional[Type[BaseException]] = None, - response_with_body: bool = True, - read_until_eof: bool = False, - auto_decompress: bool = True, - ) -> None: - self.protocol = protocol - self.loop = loop - self.max_line_size = max_line_size - self.max_headers = max_headers - self.max_field_size = max_field_size - self.timer = timer - self.code = code - self.method = method - self.payload_exception = payload_exception - self.response_with_body = response_with_body - self.read_until_eof = read_until_eof - - self._lines: List[bytes] = [] - self._tail = b"" - self._upgraded = False - self._payload = None - self._payload_parser: Optional[HttpPayloadParser] = None - self._auto_decompress = auto_decompress - self._limit = limit - self._headers_parser = HeadersParser( - max_line_size, max_headers, max_field_size, self.lax - ) - - @abc.abstractmethod - def parse_message(self, lines: List[bytes]) -> _MsgT: ... - - @abc.abstractmethod - def _is_chunked_te(self, te: str) -> bool: ... - - def feed_eof(self) -> Optional[_MsgT]: - if self._payload_parser is not None: - self._payload_parser.feed_eof() - self._payload_parser = None - else: - # try to extract partial message - if self._tail: - self._lines.append(self._tail) - - if self._lines: - if self._lines[-1] != "\r\n": - self._lines.append(b"") - with suppress(Exception): - return self.parse_message(self._lines) - return None - - def feed_data( - self, - data: bytes, - SEP: _SEP = b"\r\n", - EMPTY: bytes = b"", - CONTENT_LENGTH: istr = hdrs.CONTENT_LENGTH, - METH_CONNECT: str = hdrs.METH_CONNECT, - SEC_WEBSOCKET_KEY1: istr = hdrs.SEC_WEBSOCKET_KEY1, - ) -> Tuple[List[Tuple[_MsgT, StreamReader]], bool, bytes]: - - messages = [] - - if self._tail: - data, self._tail = self._tail + data, b"" - - data_len = len(data) - start_pos = 0 - loop = self.loop - - should_close = False - while start_pos < data_len: - - # read HTTP message (request/response line + headers), \r\n\r\n - # and split by lines - if self._payload_parser is None and not self._upgraded: - pos = data.find(SEP, start_pos) - # consume \r\n - if pos == start_pos and not self._lines: - start_pos = pos + len(SEP) - continue - - if pos >= start_pos: - if should_close: - raise BadHttpMessage("Data after `Connection: close`") - - # line found - line = data[start_pos:pos] - if SEP == b"\n": # For lax response parsing - line = line.rstrip(b"\r") - self._lines.append(line) - start_pos = pos + len(SEP) - - # \r\n\r\n found - if self._lines[-1] == EMPTY: - try: - msg: _MsgT = self.parse_message(self._lines) - finally: - self._lines.clear() - - def get_content_length() -> Optional[int]: - # payload length - length_hdr = msg.headers.get(CONTENT_LENGTH) - if length_hdr is None: - return None - - # Shouldn't allow +/- or other number formats. - # https://www.rfc-editor.org/rfc/rfc9110#section-8.6-2 - # msg.headers is already stripped of leading/trailing wsp - if not DIGITS.fullmatch(length_hdr): - raise InvalidHeader(CONTENT_LENGTH) - - return int(length_hdr) - - length = get_content_length() - # do not support old websocket spec - if SEC_WEBSOCKET_KEY1 in msg.headers: - raise InvalidHeader(SEC_WEBSOCKET_KEY1) - - self._upgraded = msg.upgrade and _is_supported_upgrade( - msg.headers - ) - - method = getattr(msg, "method", self.method) - # code is only present on responses - code = getattr(msg, "code", 0) - - assert self.protocol is not None - # calculate payload - empty_body = code in EMPTY_BODY_STATUS_CODES or bool( - method and method in EMPTY_BODY_METHODS - ) - if not empty_body and ( - ((length is not None and length > 0) or msg.chunked) - and not self._upgraded - ): - payload = StreamReader( - self.protocol, - timer=self.timer, - loop=loop, - limit=self._limit, - ) - payload_parser = HttpPayloadParser( - payload, - length=length, - chunked=msg.chunked, - method=method, - compression=msg.compression, - code=self.code, - response_with_body=self.response_with_body, - auto_decompress=self._auto_decompress, - lax=self.lax, - headers_parser=self._headers_parser, - ) - if not payload_parser.done: - self._payload_parser = payload_parser - elif method == METH_CONNECT: - assert isinstance(msg, RawRequestMessage) - payload = StreamReader( - self.protocol, - timer=self.timer, - loop=loop, - limit=self._limit, - ) - self._upgraded = True - self._payload_parser = HttpPayloadParser( - payload, - method=msg.method, - compression=msg.compression, - auto_decompress=self._auto_decompress, - lax=self.lax, - headers_parser=self._headers_parser, - ) - elif not empty_body and length is None and self.read_until_eof: - payload = StreamReader( - self.protocol, - timer=self.timer, - loop=loop, - limit=self._limit, - ) - payload_parser = HttpPayloadParser( - payload, - length=length, - chunked=msg.chunked, - method=method, - compression=msg.compression, - code=self.code, - response_with_body=self.response_with_body, - auto_decompress=self._auto_decompress, - lax=self.lax, - headers_parser=self._headers_parser, - ) - if not payload_parser.done: - self._payload_parser = payload_parser - else: - payload = EMPTY_PAYLOAD - - messages.append((msg, payload)) - should_close = msg.should_close - else: - self._tail = data[start_pos:] - data = EMPTY - break - - # no parser, just store - elif self._payload_parser is None and self._upgraded: - assert not self._lines - break - - # feed payload - elif data and start_pos < data_len: - assert not self._lines - assert self._payload_parser is not None - try: - eof, data = self._payload_parser.feed_data(data[start_pos:], SEP) - except BaseException as underlying_exc: - reraised_exc = underlying_exc - if self.payload_exception is not None: - reraised_exc = self.payload_exception(str(underlying_exc)) - - set_exception( - self._payload_parser.payload, - reraised_exc, - underlying_exc, - ) - - eof = True - data = b"" - if isinstance( - underlying_exc, (InvalidHeader, TransferEncodingError) - ): - raise - - if eof: - start_pos = 0 - data_len = len(data) - self._payload_parser = None - continue - else: - break - - if data and start_pos < data_len: - data = data[start_pos:] - else: - data = EMPTY - - return messages, self._upgraded, data - - def parse_headers( - self, lines: List[bytes] - ) -> Tuple[ - "CIMultiDictProxy[str]", RawHeaders, Optional[bool], Optional[str], bool, bool - ]: - """Parses RFC 5322 headers from a stream. - - Line continuations are supported. Returns list of header name - and value pairs. Header name is in upper case. - """ - headers, raw_headers = self._headers_parser.parse_headers(lines) - close_conn = None - encoding = None - upgrade = False - chunked = False - - # https://www.rfc-editor.org/rfc/rfc9110.html#section-5.5-6 - # https://www.rfc-editor.org/rfc/rfc9110.html#name-collected-abnf - singletons = ( - hdrs.CONTENT_LENGTH, - hdrs.CONTENT_LOCATION, - hdrs.CONTENT_RANGE, - hdrs.CONTENT_TYPE, - hdrs.ETAG, - hdrs.HOST, - hdrs.MAX_FORWARDS, - hdrs.SERVER, - hdrs.TRANSFER_ENCODING, - hdrs.USER_AGENT, - ) - bad_hdr = next((h for h in singletons if len(headers.getall(h, ())) > 1), None) - if bad_hdr is not None: - raise BadHttpMessage(f"Duplicate '{bad_hdr}' header found.") - - # keep-alive - conn = headers.get(hdrs.CONNECTION) - if conn: - v = conn.lower() - if v == "close": - close_conn = True - elif v == "keep-alive": - close_conn = False - # https://www.rfc-editor.org/rfc/rfc9110.html#name-101-switching-protocols - elif v == "upgrade" and headers.get(hdrs.UPGRADE): - upgrade = True - - # encoding - enc = headers.get(hdrs.CONTENT_ENCODING) - if enc: - enc = enc.lower() - if enc in ("gzip", "deflate", "br"): - encoding = enc - - # chunking - te = headers.get(hdrs.TRANSFER_ENCODING) - if te is not None: - if self._is_chunked_te(te): - chunked = True - - if hdrs.CONTENT_LENGTH in headers: - raise BadHttpMessage( - "Transfer-Encoding can't be present with Content-Length", - ) - - return (headers, raw_headers, close_conn, encoding, upgrade, chunked) - - def set_upgraded(self, val: bool) -> None: - """Set connection upgraded (to websocket) mode. - - :param bool val: new state. - """ - self._upgraded = val - - -class HttpRequestParser(HttpParser[RawRequestMessage]): - """Read request status line. - - Exception .http_exceptions.BadStatusLine - could be raised in case of any errors in status line. - Returns RawRequestMessage. - """ - - def parse_message(self, lines: List[bytes]) -> RawRequestMessage: - # request line - line = lines[0].decode("utf-8", "surrogateescape") - try: - method, path, version = line.split(" ", maxsplit=2) - except ValueError: - raise BadHttpMethod(line) from None - - if len(path) > self.max_line_size: - raise LineTooLong( - "Status line is too long", str(self.max_line_size), str(len(path)) - ) - - # method - if not TOKENRE.fullmatch(method): - raise BadHttpMethod(method) - - # version - match = VERSRE.fullmatch(version) - if match is None: - raise BadStatusLine(line) - version_o = HttpVersion(int(match.group(1)), int(match.group(2))) - - if method == "CONNECT": - # authority-form, - # https://datatracker.ietf.org/doc/html/rfc7230#section-5.3.3 - url = URL.build(authority=path, encoded=True) - elif path.startswith("/"): - # origin-form, - # https://datatracker.ietf.org/doc/html/rfc7230#section-5.3.1 - path_part, _hash_separator, url_fragment = path.partition("#") - path_part, _question_mark_separator, qs_part = path_part.partition("?") - - # NOTE: `yarl.URL.build()` is used to mimic what the Cython-based - # NOTE: parser does, otherwise it results into the same - # NOTE: HTTP Request-Line input producing different - # NOTE: `yarl.URL()` objects - url = URL.build( - path=path_part, - query_string=qs_part, - fragment=url_fragment, - encoded=True, - ) - elif path == "*" and method == "OPTIONS": - # asterisk-form, - url = URL(path, encoded=True) - else: - # absolute-form for proxy maybe, - # https://datatracker.ietf.org/doc/html/rfc7230#section-5.3.2 - url = URL(path, encoded=True) - if url.scheme == "": - # not absolute-form - raise InvalidURLError( - path.encode(errors="surrogateescape").decode("latin1") - ) - - # read headers - ( - headers, - raw_headers, - close, - compression, - upgrade, - chunked, - ) = self.parse_headers(lines[1:]) - - if close is None: # then the headers weren't set in the request - if version_o <= HttpVersion10: # HTTP 1.0 must asks to not close - close = True - else: # HTTP 1.1 must ask to close. - close = False - - return RawRequestMessage( - method, - path, - version_o, - headers, - raw_headers, - close, - compression, - upgrade, - chunked, - url, - ) - - def _is_chunked_te(self, te: str) -> bool: - if te.rsplit(",", maxsplit=1)[-1].strip(" \t").lower() == "chunked": - return True - # https://www.rfc-editor.org/rfc/rfc9112#section-6.3-2.4.3 - raise BadHttpMessage("Request has invalid `Transfer-Encoding`") - - -class HttpResponseParser(HttpParser[RawResponseMessage]): - """Read response status line and headers. - - BadStatusLine could be raised in case of any errors in status line. - Returns RawResponseMessage. - """ - - # Lax mode should only be enabled on response parser. - lax = not DEBUG - - def feed_data( - self, - data: bytes, - SEP: Optional[_SEP] = None, - *args: Any, - **kwargs: Any, - ) -> Tuple[List[Tuple[RawResponseMessage, StreamReader]], bool, bytes]: - if SEP is None: - SEP = b"\r\n" if DEBUG else b"\n" - return super().feed_data(data, SEP, *args, **kwargs) - - def parse_message(self, lines: List[bytes]) -> RawResponseMessage: - line = lines[0].decode("utf-8", "surrogateescape") - try: - version, status = line.split(maxsplit=1) - except ValueError: - raise BadStatusLine(line) from None - - try: - status, reason = status.split(maxsplit=1) - except ValueError: - status = status.strip() - reason = "" - - if len(reason) > self.max_line_size: - raise LineTooLong( - "Status line is too long", str(self.max_line_size), str(len(reason)) - ) - - # version - match = VERSRE.fullmatch(version) - if match is None: - raise BadStatusLine(line) - version_o = HttpVersion(int(match.group(1)), int(match.group(2))) - - # The status code is a three-digit ASCII number, no padding - if len(status) != 3 or not DIGITS.fullmatch(status): - raise BadStatusLine(line) - status_i = int(status) - - # read headers - ( - headers, - raw_headers, - close, - compression, - upgrade, - chunked, - ) = self.parse_headers(lines[1:]) - - if close is None: - if version_o <= HttpVersion10: - close = True - # https://www.rfc-editor.org/rfc/rfc9112.html#name-message-body-length - elif 100 <= status_i < 200 or status_i in {204, 304}: - close = False - elif hdrs.CONTENT_LENGTH in headers or hdrs.TRANSFER_ENCODING in headers: - close = False - else: - # https://www.rfc-editor.org/rfc/rfc9112.html#section-6.3-2.8 - close = True - - return RawResponseMessage( - version_o, - status_i, - reason.strip(), - headers, - raw_headers, - close, - compression, - upgrade, - chunked, - ) - - def _is_chunked_te(self, te: str) -> bool: - # https://www.rfc-editor.org/rfc/rfc9112#section-6.3-2.4.2 - return te.rsplit(",", maxsplit=1)[-1].strip(" \t").lower() == "chunked" - - -class HttpPayloadParser: - def __init__( - self, - payload: StreamReader, - length: Optional[int] = None, - chunked: bool = False, - compression: Optional[str] = None, - code: Optional[int] = None, - method: Optional[str] = None, - response_with_body: bool = True, - auto_decompress: bool = True, - lax: bool = False, - *, - headers_parser: HeadersParser, - ) -> None: - self._length = 0 - self._type = ParseState.PARSE_UNTIL_EOF - self._chunk = ChunkState.PARSE_CHUNKED_SIZE - self._chunk_size = 0 - self._chunk_tail = b"" - self._auto_decompress = auto_decompress - self._lax = lax - self._headers_parser = headers_parser - self._trailer_lines: list[bytes] = [] - self.done = False - - # payload decompression wrapper - if response_with_body and compression and self._auto_decompress: - real_payload: Union[StreamReader, DeflateBuffer] = DeflateBuffer( - payload, compression - ) - else: - real_payload = payload - - # payload parser - if not response_with_body: - # don't parse payload if it's not expected to be received - self._type = ParseState.PARSE_NONE - real_payload.feed_eof() - self.done = True - elif chunked: - self._type = ParseState.PARSE_CHUNKED - elif length is not None: - self._type = ParseState.PARSE_LENGTH - self._length = length - if self._length == 0: - real_payload.feed_eof() - self.done = True - - self.payload = real_payload - - def feed_eof(self) -> None: - if self._type == ParseState.PARSE_UNTIL_EOF: - self.payload.feed_eof() - elif self._type == ParseState.PARSE_LENGTH: - raise ContentLengthError( - "Not enough data to satisfy content length header." - ) - elif self._type == ParseState.PARSE_CHUNKED: - raise TransferEncodingError( - "Not enough data to satisfy transfer length header." - ) - - def feed_data( - self, chunk: bytes, SEP: _SEP = b"\r\n", CHUNK_EXT: bytes = b";" - ) -> Tuple[bool, bytes]: - # Read specified amount of bytes - if self._type == ParseState.PARSE_LENGTH: - required = self._length - chunk_len = len(chunk) - - if required >= chunk_len: - self._length = required - chunk_len - self.payload.feed_data(chunk, chunk_len) - if self._length == 0: - self.payload.feed_eof() - return True, b"" - else: - self._length = 0 - self.payload.feed_data(chunk[:required], required) - self.payload.feed_eof() - return True, chunk[required:] - - # Chunked transfer encoding parser - elif self._type == ParseState.PARSE_CHUNKED: - if self._chunk_tail: - chunk = self._chunk_tail + chunk - self._chunk_tail = b"" - - while chunk: - - # read next chunk size - if self._chunk == ChunkState.PARSE_CHUNKED_SIZE: - pos = chunk.find(SEP) - if pos >= 0: - i = chunk.find(CHUNK_EXT, 0, pos) - if i >= 0: - size_b = chunk[:i] # strip chunk-extensions - # Verify no LF in the chunk-extension - if b"\n" in (ext := chunk[i:pos]): - exc = TransferEncodingError( - f"Unexpected LF in chunk-extension: {ext!r}" - ) - set_exception(self.payload, exc) - raise exc - else: - size_b = chunk[:pos] - - if self._lax: # Allow whitespace in lax mode. - size_b = size_b.strip() - - if not re.fullmatch(HEXDIGITS, size_b): - exc = TransferEncodingError( - chunk[:pos].decode("ascii", "surrogateescape") - ) - set_exception(self.payload, exc) - raise exc - size = int(bytes(size_b), 16) - - chunk = chunk[pos + len(SEP) :] - if size == 0: # eof marker - self._chunk = ChunkState.PARSE_TRAILERS - if self._lax and chunk.startswith(b"\r"): - chunk = chunk[1:] - else: - self._chunk = ChunkState.PARSE_CHUNKED_CHUNK - self._chunk_size = size - self.payload.begin_http_chunk_receiving() - else: - self._chunk_tail = chunk - return False, b"" - - # read chunk and feed buffer - if self._chunk == ChunkState.PARSE_CHUNKED_CHUNK: - required = self._chunk_size - chunk_len = len(chunk) - - if required > chunk_len: - self._chunk_size = required - chunk_len - self.payload.feed_data(chunk, chunk_len) - return False, b"" - else: - self._chunk_size = 0 - self.payload.feed_data(chunk[:required], required) - chunk = chunk[required:] - self._chunk = ChunkState.PARSE_CHUNKED_CHUNK_EOF - self.payload.end_http_chunk_receiving() - - # toss the CRLF at the end of the chunk - if self._chunk == ChunkState.PARSE_CHUNKED_CHUNK_EOF: - if self._lax and chunk.startswith(b"\r"): - chunk = chunk[1:] - if chunk[: len(SEP)] == SEP: - chunk = chunk[len(SEP) :] - self._chunk = ChunkState.PARSE_CHUNKED_SIZE - else: - self._chunk_tail = chunk - return False, b"" - - if self._chunk == ChunkState.PARSE_TRAILERS: - pos = chunk.find(SEP) - if pos < 0: # No line found - self._chunk_tail = chunk - return False, b"" - - line = chunk[:pos] - chunk = chunk[pos + len(SEP) :] - if SEP == b"\n": # For lax response parsing - line = line.rstrip(b"\r") - self._trailer_lines.append(line) - - # \r\n\r\n found, end of stream - if self._trailer_lines[-1] == b"": - # Headers and trailers are defined the same way, - # so we reuse the HeadersParser here. - try: - trailers, raw_trailers = self._headers_parser.parse_headers( - self._trailer_lines - ) - finally: - self._trailer_lines.clear() - self.payload.feed_eof() - return True, chunk - - # Read all bytes until eof - elif self._type == ParseState.PARSE_UNTIL_EOF: - self.payload.feed_data(chunk, len(chunk)) - - return False, b"" - - -class DeflateBuffer: - """DeflateStream decompress stream and feed data into specified stream.""" - - decompressor: Any - - def __init__(self, out: StreamReader, encoding: Optional[str]) -> None: - self.out = out - self.size = 0 - self.encoding = encoding - self._started_decoding = False - - self.decompressor: Union[BrotliDecompressor, ZLibDecompressor] - if encoding == "br": - if not HAS_BROTLI: # pragma: no cover - raise ContentEncodingError( - "Can not decode content-encoding: brotli (br). " - "Please install `Brotli`" - ) - self.decompressor = BrotliDecompressor() - else: - self.decompressor = ZLibDecompressor(encoding=encoding) - - def set_exception( - self, - exc: BaseException, - exc_cause: BaseException = _EXC_SENTINEL, - ) -> None: - set_exception(self.out, exc, exc_cause) - - def feed_data(self, chunk: bytes, size: int) -> None: - if not size: - return - - self.size += size - - # RFC1950 - # bits 0..3 = CM = 0b1000 = 8 = "deflate" - # bits 4..7 = CINFO = 1..7 = windows size. - if ( - not self._started_decoding - and self.encoding == "deflate" - and chunk[0] & 0xF != 8 - ): - # Change the decoder to decompress incorrectly compressed data - # Actually we should issue a warning about non-RFC-compliant data. - self.decompressor = ZLibDecompressor( - encoding=self.encoding, suppress_deflate_header=True - ) - - try: - chunk = self.decompressor.decompress_sync(chunk) - except Exception: - raise ContentEncodingError( - "Can not decode content-encoding: %s" % self.encoding - ) - - self._started_decoding = True - - if chunk: - self.out.feed_data(chunk, len(chunk)) - - def feed_eof(self) -> None: - chunk = self.decompressor.flush() - - if chunk or self.size > 0: - self.out.feed_data(chunk, len(chunk)) - if self.encoding == "deflate" and not self.decompressor.eof: - raise ContentEncodingError("deflate") - - self.out.feed_eof() - - def begin_http_chunk_receiving(self) -> None: - self.out.begin_http_chunk_receiving() - - def end_http_chunk_receiving(self) -> None: - self.out.end_http_chunk_receiving() - - -HttpRequestParserPy = HttpRequestParser -HttpResponseParserPy = HttpResponseParser -RawRequestMessagePy = RawRequestMessage -RawResponseMessagePy = RawResponseMessage - -try: - if not NO_EXTENSIONS: - from ._http_parser import ( # type: ignore[import-not-found,no-redef] - HttpRequestParser, - HttpResponseParser, - RawRequestMessage, - RawResponseMessage, - ) - - HttpRequestParserC = HttpRequestParser - HttpResponseParserC = HttpResponseParser - RawRequestMessageC = RawRequestMessage - RawResponseMessageC = RawResponseMessage -except ImportError: # pragma: no cover - pass diff --git a/venv/lib/python3.12/site-packages/aiohttp/http_websocket.py b/venv/lib/python3.12/site-packages/aiohttp/http_websocket.py deleted file mode 100644 index 6b4b30e..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/http_websocket.py +++ /dev/null @@ -1,36 +0,0 @@ -"""WebSocket protocol versions 13 and 8.""" - -from ._websocket.helpers import WS_KEY, ws_ext_gen, ws_ext_parse -from ._websocket.models import ( - WS_CLOSED_MESSAGE, - WS_CLOSING_MESSAGE, - WebSocketError, - WSCloseCode, - WSHandshakeError, - WSMessage, - WSMsgType, -) -from ._websocket.reader import WebSocketReader -from ._websocket.writer import WebSocketWriter - -# Messages that the WebSocketResponse.receive needs to handle internally -_INTERNAL_RECEIVE_TYPES = frozenset( - (WSMsgType.CLOSE, WSMsgType.CLOSING, WSMsgType.PING, WSMsgType.PONG) -) - - -__all__ = ( - "WS_CLOSED_MESSAGE", - "WS_CLOSING_MESSAGE", - "WS_KEY", - "WebSocketReader", - "WebSocketWriter", - "WSMessage", - "WebSocketError", - "WSMsgType", - "WSCloseCode", - "ws_ext_gen", - "ws_ext_parse", - "WSHandshakeError", - "WSMessage", -) diff --git a/venv/lib/python3.12/site-packages/aiohttp/http_writer.py b/venv/lib/python3.12/site-packages/aiohttp/http_writer.py deleted file mode 100644 index a140b21..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/http_writer.py +++ /dev/null @@ -1,378 +0,0 @@ -"""Http related parsers and protocol.""" - -import asyncio -import sys -from typing import ( # noqa - TYPE_CHECKING, - Any, - Awaitable, - Callable, - Iterable, - List, - NamedTuple, - Optional, - Union, -) - -from multidict import CIMultiDict - -from .abc import AbstractStreamWriter -from .base_protocol import BaseProtocol -from .client_exceptions import ClientConnectionResetError -from .compression_utils import ZLibCompressor -from .helpers import NO_EXTENSIONS - -__all__ = ("StreamWriter", "HttpVersion", "HttpVersion10", "HttpVersion11") - - -MIN_PAYLOAD_FOR_WRITELINES = 2048 -IS_PY313_BEFORE_313_2 = (3, 13, 0) <= sys.version_info < (3, 13, 2) -IS_PY_BEFORE_312_9 = sys.version_info < (3, 12, 9) -SKIP_WRITELINES = IS_PY313_BEFORE_313_2 or IS_PY_BEFORE_312_9 -# writelines is not safe for use -# on Python 3.12+ until 3.12.9 -# on Python 3.13+ until 3.13.2 -# and on older versions it not any faster than write -# CVE-2024-12254: https://github.com/python/cpython/pull/127656 - - -class HttpVersion(NamedTuple): - major: int - minor: int - - -HttpVersion10 = HttpVersion(1, 0) -HttpVersion11 = HttpVersion(1, 1) - - -_T_OnChunkSent = Optional[Callable[[bytes], Awaitable[None]]] -_T_OnHeadersSent = Optional[Callable[["CIMultiDict[str]"], Awaitable[None]]] - - -class StreamWriter(AbstractStreamWriter): - - length: Optional[int] = None - chunked: bool = False - _eof: bool = False - _compress: Optional[ZLibCompressor] = None - - def __init__( - self, - protocol: BaseProtocol, - loop: asyncio.AbstractEventLoop, - on_chunk_sent: _T_OnChunkSent = None, - on_headers_sent: _T_OnHeadersSent = None, - ) -> None: - self._protocol = protocol - self.loop = loop - self._on_chunk_sent: _T_OnChunkSent = on_chunk_sent - self._on_headers_sent: _T_OnHeadersSent = on_headers_sent - self._headers_buf: Optional[bytes] = None - self._headers_written: bool = False - - @property - def transport(self) -> Optional[asyncio.Transport]: - return self._protocol.transport - - @property - def protocol(self) -> BaseProtocol: - return self._protocol - - def enable_chunking(self) -> None: - self.chunked = True - - def enable_compression( - self, encoding: str = "deflate", strategy: Optional[int] = None - ) -> None: - self._compress = ZLibCompressor(encoding=encoding, strategy=strategy) - - def _write(self, chunk: Union[bytes, bytearray, memoryview]) -> None: - size = len(chunk) - self.buffer_size += size - self.output_size += size - transport = self._protocol.transport - if transport is None or transport.is_closing(): - raise ClientConnectionResetError("Cannot write to closing transport") - transport.write(chunk) - - def _writelines(self, chunks: Iterable[bytes]) -> None: - size = 0 - for chunk in chunks: - size += len(chunk) - self.buffer_size += size - self.output_size += size - transport = self._protocol.transport - if transport is None or transport.is_closing(): - raise ClientConnectionResetError("Cannot write to closing transport") - if SKIP_WRITELINES or size < MIN_PAYLOAD_FOR_WRITELINES: - transport.write(b"".join(chunks)) - else: - transport.writelines(chunks) - - def _write_chunked_payload( - self, chunk: Union[bytes, bytearray, "memoryview[int]", "memoryview[bytes]"] - ) -> None: - """Write a chunk with proper chunked encoding.""" - chunk_len_pre = f"{len(chunk):x}\r\n".encode("ascii") - self._writelines((chunk_len_pre, chunk, b"\r\n")) - - def _send_headers_with_payload( - self, - chunk: Union[bytes, bytearray, "memoryview[int]", "memoryview[bytes]"], - is_eof: bool, - ) -> None: - """Send buffered headers with payload, coalescing into single write.""" - # Mark headers as written - self._headers_written = True - headers_buf = self._headers_buf - self._headers_buf = None - - if TYPE_CHECKING: - # Safe because callers (write() and write_eof()) only invoke this method - # after checking that self._headers_buf is truthy - assert headers_buf is not None - - if not self.chunked: - # Non-chunked: coalesce headers with body - if chunk: - self._writelines((headers_buf, chunk)) - else: - self._write(headers_buf) - return - - # Coalesce headers with chunked data - if chunk: - chunk_len_pre = f"{len(chunk):x}\r\n".encode("ascii") - if is_eof: - self._writelines((headers_buf, chunk_len_pre, chunk, b"\r\n0\r\n\r\n")) - else: - self._writelines((headers_buf, chunk_len_pre, chunk, b"\r\n")) - elif is_eof: - self._writelines((headers_buf, b"0\r\n\r\n")) - else: - self._write(headers_buf) - - async def write( - self, - chunk: Union[bytes, bytearray, memoryview], - *, - drain: bool = True, - LIMIT: int = 0x10000, - ) -> None: - """ - Writes chunk of data to a stream. - - write_eof() indicates end of stream. - writer can't be used after write_eof() method being called. - write() return drain future. - """ - if self._on_chunk_sent is not None: - await self._on_chunk_sent(chunk) - - if isinstance(chunk, memoryview): - if chunk.nbytes != len(chunk): - # just reshape it - chunk = chunk.cast("c") - - if self._compress is not None: - chunk = await self._compress.compress(chunk) - if not chunk: - return - - if self.length is not None: - chunk_len = len(chunk) - if self.length >= chunk_len: - self.length = self.length - chunk_len - else: - chunk = chunk[: self.length] - self.length = 0 - if not chunk: - return - - # Handle buffered headers for small payload optimization - if self._headers_buf and not self._headers_written: - self._send_headers_with_payload(chunk, False) - if drain and self.buffer_size > LIMIT: - self.buffer_size = 0 - await self.drain() - return - - if chunk: - if self.chunked: - self._write_chunked_payload(chunk) - else: - self._write(chunk) - - if drain and self.buffer_size > LIMIT: - self.buffer_size = 0 - await self.drain() - - async def write_headers( - self, status_line: str, headers: "CIMultiDict[str]" - ) -> None: - """Write headers to the stream.""" - if self._on_headers_sent is not None: - await self._on_headers_sent(headers) - # status + headers - buf = _serialize_headers(status_line, headers) - self._headers_written = False - self._headers_buf = buf - - def send_headers(self) -> None: - """Force sending buffered headers if not already sent.""" - if not self._headers_buf or self._headers_written: - return - - self._headers_written = True - headers_buf = self._headers_buf - self._headers_buf = None - - if TYPE_CHECKING: - # Safe because we only enter this block when self._headers_buf is truthy - assert headers_buf is not None - - self._write(headers_buf) - - def set_eof(self) -> None: - """Indicate that the message is complete.""" - if self._eof: - return - - # If headers haven't been sent yet, send them now - # This handles the case where there's no body at all - if self._headers_buf and not self._headers_written: - self._headers_written = True - headers_buf = self._headers_buf - self._headers_buf = None - - if TYPE_CHECKING: - # Safe because we only enter this block when self._headers_buf is truthy - assert headers_buf is not None - - # Combine headers and chunked EOF marker in a single write - if self.chunked: - self._writelines((headers_buf, b"0\r\n\r\n")) - else: - self._write(headers_buf) - elif self.chunked and self._headers_written: - # Headers already sent, just send the final chunk marker - self._write(b"0\r\n\r\n") - - self._eof = True - - async def write_eof(self, chunk: bytes = b"") -> None: - if self._eof: - return - - if chunk and self._on_chunk_sent is not None: - await self._on_chunk_sent(chunk) - - # Handle body/compression - if self._compress: - chunks: List[bytes] = [] - chunks_len = 0 - if chunk and (compressed_chunk := await self._compress.compress(chunk)): - chunks_len = len(compressed_chunk) - chunks.append(compressed_chunk) - - flush_chunk = self._compress.flush() - chunks_len += len(flush_chunk) - chunks.append(flush_chunk) - assert chunks_len - - # Send buffered headers with compressed data if not yet sent - if self._headers_buf and not self._headers_written: - self._headers_written = True - headers_buf = self._headers_buf - self._headers_buf = None - - if self.chunked: - # Coalesce headers with compressed chunked data - chunk_len_pre = f"{chunks_len:x}\r\n".encode("ascii") - self._writelines( - (headers_buf, chunk_len_pre, *chunks, b"\r\n0\r\n\r\n") - ) - else: - # Coalesce headers with compressed data - self._writelines((headers_buf, *chunks)) - await self.drain() - self._eof = True - return - - # Headers already sent, just write compressed data - if self.chunked: - chunk_len_pre = f"{chunks_len:x}\r\n".encode("ascii") - self._writelines((chunk_len_pre, *chunks, b"\r\n0\r\n\r\n")) - elif len(chunks) > 1: - self._writelines(chunks) - else: - self._write(chunks[0]) - await self.drain() - self._eof = True - return - - # No compression - send buffered headers if not yet sent - if self._headers_buf and not self._headers_written: - # Use helper to send headers with payload - self._send_headers_with_payload(chunk, True) - await self.drain() - self._eof = True - return - - # Handle remaining body - if self.chunked: - if chunk: - # Write final chunk with EOF marker - self._writelines( - (f"{len(chunk):x}\r\n".encode("ascii"), chunk, b"\r\n0\r\n\r\n") - ) - else: - self._write(b"0\r\n\r\n") - await self.drain() - self._eof = True - return - - if chunk: - self._write(chunk) - await self.drain() - - self._eof = True - - async def drain(self) -> None: - """Flush the write buffer. - - The intended use is to write - - await w.write(data) - await w.drain() - """ - protocol = self._protocol - if protocol.transport is not None and protocol._paused: - await protocol._drain_helper() - - -def _safe_header(string: str) -> str: - if "\r" in string or "\n" in string: - raise ValueError( - "Newline or carriage return detected in headers. " - "Potential header injection attack." - ) - return string - - -def _py_serialize_headers(status_line: str, headers: "CIMultiDict[str]") -> bytes: - headers_gen = (_safe_header(k) + ": " + _safe_header(v) for k, v in headers.items()) - line = status_line + "\r\n" + "\r\n".join(headers_gen) + "\r\n\r\n" - return line.encode("utf-8") - - -_serialize_headers = _py_serialize_headers - -try: - import aiohttp._http_writer as _http_writer # type: ignore[import-not-found] - - _c_serialize_headers = _http_writer._serialize_headers - if not NO_EXTENSIONS: - _serialize_headers = _c_serialize_headers -except ImportError: - pass diff --git a/venv/lib/python3.12/site-packages/aiohttp/log.py b/venv/lib/python3.12/site-packages/aiohttp/log.py deleted file mode 100644 index 3cecea2..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/log.py +++ /dev/null @@ -1,8 +0,0 @@ -import logging - -access_logger = logging.getLogger("aiohttp.access") -client_logger = logging.getLogger("aiohttp.client") -internal_logger = logging.getLogger("aiohttp.internal") -server_logger = logging.getLogger("aiohttp.server") -web_logger = logging.getLogger("aiohttp.web") -ws_logger = logging.getLogger("aiohttp.websocket") diff --git a/venv/lib/python3.12/site-packages/aiohttp/multipart.py b/venv/lib/python3.12/site-packages/aiohttp/multipart.py deleted file mode 100644 index 0260514..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/multipart.py +++ /dev/null @@ -1,1140 +0,0 @@ -import base64 -import binascii -import json -import re -import sys -import uuid -import warnings -from collections import deque -from collections.abc import Mapping, Sequence -from types import TracebackType -from typing import ( - TYPE_CHECKING, - Any, - Deque, - Dict, - Iterator, - List, - Optional, - Tuple, - Type, - Union, - cast, -) -from urllib.parse import parse_qsl, unquote, urlencode - -from multidict import CIMultiDict, CIMultiDictProxy - -from .compression_utils import ZLibCompressor, ZLibDecompressor -from .hdrs import ( - CONTENT_DISPOSITION, - CONTENT_ENCODING, - CONTENT_LENGTH, - CONTENT_TRANSFER_ENCODING, - CONTENT_TYPE, -) -from .helpers import CHAR, TOKEN, parse_mimetype, reify -from .http import HeadersParser -from .log import internal_logger -from .payload import ( - JsonPayload, - LookupError, - Order, - Payload, - StringPayload, - get_payload, - payload_type, -) -from .streams import StreamReader - -if sys.version_info >= (3, 11): - from typing import Self -else: - from typing import TypeVar - - Self = TypeVar("Self", bound="BodyPartReader") - -__all__ = ( - "MultipartReader", - "MultipartWriter", - "BodyPartReader", - "BadContentDispositionHeader", - "BadContentDispositionParam", - "parse_content_disposition", - "content_disposition_filename", -) - - -if TYPE_CHECKING: - from .client_reqrep import ClientResponse - - -class BadContentDispositionHeader(RuntimeWarning): - pass - - -class BadContentDispositionParam(RuntimeWarning): - pass - - -def parse_content_disposition( - header: Optional[str], -) -> Tuple[Optional[str], Dict[str, str]]: - def is_token(string: str) -> bool: - return bool(string) and TOKEN >= set(string) - - def is_quoted(string: str) -> bool: - return string[0] == string[-1] == '"' - - def is_rfc5987(string: str) -> bool: - return is_token(string) and string.count("'") == 2 - - def is_extended_param(string: str) -> bool: - return string.endswith("*") - - def is_continuous_param(string: str) -> bool: - pos = string.find("*") + 1 - if not pos: - return False - substring = string[pos:-1] if string.endswith("*") else string[pos:] - return substring.isdigit() - - def unescape(text: str, *, chars: str = "".join(map(re.escape, CHAR))) -> str: - return re.sub(f"\\\\([{chars}])", "\\1", text) - - if not header: - return None, {} - - disptype, *parts = header.split(";") - if not is_token(disptype): - warnings.warn(BadContentDispositionHeader(header)) - return None, {} - - params: Dict[str, str] = {} - while parts: - item = parts.pop(0) - - if "=" not in item: - warnings.warn(BadContentDispositionHeader(header)) - return None, {} - - key, value = item.split("=", 1) - key = key.lower().strip() - value = value.lstrip() - - if key in params: - warnings.warn(BadContentDispositionHeader(header)) - return None, {} - - if not is_token(key): - warnings.warn(BadContentDispositionParam(item)) - continue - - elif is_continuous_param(key): - if is_quoted(value): - value = unescape(value[1:-1]) - elif not is_token(value): - warnings.warn(BadContentDispositionParam(item)) - continue - - elif is_extended_param(key): - if is_rfc5987(value): - encoding, _, value = value.split("'", 2) - encoding = encoding or "utf-8" - else: - warnings.warn(BadContentDispositionParam(item)) - continue - - try: - value = unquote(value, encoding, "strict") - except UnicodeDecodeError: # pragma: nocover - warnings.warn(BadContentDispositionParam(item)) - continue - - else: - failed = True - if is_quoted(value): - failed = False - value = unescape(value[1:-1].lstrip("\\/")) - elif is_token(value): - failed = False - elif parts: - # maybe just ; in filename, in any case this is just - # one case fix, for proper fix we need to redesign parser - _value = f"{value};{parts[0]}" - if is_quoted(_value): - parts.pop(0) - value = unescape(_value[1:-1].lstrip("\\/")) - failed = False - - if failed: - warnings.warn(BadContentDispositionHeader(header)) - return None, {} - - params[key] = value - - return disptype.lower(), params - - -def content_disposition_filename( - params: Mapping[str, str], name: str = "filename" -) -> Optional[str]: - name_suf = "%s*" % name - if not params: - return None - elif name_suf in params: - return params[name_suf] - elif name in params: - return params[name] - else: - parts = [] - fnparams = sorted( - (key, value) for key, value in params.items() if key.startswith(name_suf) - ) - for num, (key, value) in enumerate(fnparams): - _, tail = key.split("*", 1) - if tail.endswith("*"): - tail = tail[:-1] - if tail == str(num): - parts.append(value) - else: - break - if not parts: - return None - value = "".join(parts) - if "'" in value: - encoding, _, value = value.split("'", 2) - encoding = encoding or "utf-8" - return unquote(value, encoding, "strict") - return value - - -class MultipartResponseWrapper: - """Wrapper around the MultipartReader. - - It takes care about - underlying connection and close it when it needs in. - """ - - def __init__( - self, - resp: "ClientResponse", - stream: "MultipartReader", - ) -> None: - self.resp = resp - self.stream = stream - - def __aiter__(self) -> "MultipartResponseWrapper": - return self - - async def __anext__( - self, - ) -> Union["MultipartReader", "BodyPartReader"]: - part = await self.next() - if part is None: - raise StopAsyncIteration - return part - - def at_eof(self) -> bool: - """Returns True when all response data had been read.""" - return self.resp.content.at_eof() - - async def next( - self, - ) -> Optional[Union["MultipartReader", "BodyPartReader"]]: - """Emits next multipart reader object.""" - item = await self.stream.next() - if self.stream.at_eof(): - await self.release() - return item - - async def release(self) -> None: - """Release the connection gracefully. - - All remaining content is read to the void. - """ - await self.resp.release() - - -class BodyPartReader: - """Multipart reader for single body part.""" - - chunk_size = 8192 - - def __init__( - self, - boundary: bytes, - headers: "CIMultiDictProxy[str]", - content: StreamReader, - *, - subtype: str = "mixed", - default_charset: Optional[str] = None, - ) -> None: - self.headers = headers - self._boundary = boundary - self._boundary_len = len(boundary) + 2 # Boundary + \r\n - self._content = content - self._default_charset = default_charset - self._at_eof = False - self._is_form_data = subtype == "form-data" - # https://datatracker.ietf.org/doc/html/rfc7578#section-4.8 - length = None if self._is_form_data else self.headers.get(CONTENT_LENGTH, None) - self._length = int(length) if length is not None else None - self._read_bytes = 0 - self._unread: Deque[bytes] = deque() - self._prev_chunk: Optional[bytes] = None - self._content_eof = 0 - self._cache: Dict[str, Any] = {} - - def __aiter__(self: Self) -> Self: - return self - - async def __anext__(self) -> bytes: - part = await self.next() - if part is None: - raise StopAsyncIteration - return part - - async def next(self) -> Optional[bytes]: - item = await self.read() - if not item: - return None - return item - - async def read(self, *, decode: bool = False) -> bytes: - """Reads body part data. - - decode: Decodes data following by encoding - method from Content-Encoding header. If it missed - data remains untouched - """ - if self._at_eof: - return b"" - data = bytearray() - while not self._at_eof: - data.extend(await self.read_chunk(self.chunk_size)) - if decode: - return self.decode(data) - return data - - async def read_chunk(self, size: int = chunk_size) -> bytes: - """Reads body part content chunk of the specified size. - - size: chunk size - """ - if self._at_eof: - return b"" - if self._length: - chunk = await self._read_chunk_from_length(size) - else: - chunk = await self._read_chunk_from_stream(size) - - # For the case of base64 data, we must read a fragment of size with a - # remainder of 0 by dividing by 4 for string without symbols \n or \r - encoding = self.headers.get(CONTENT_TRANSFER_ENCODING) - if encoding and encoding.lower() == "base64": - stripped_chunk = b"".join(chunk.split()) - remainder = len(stripped_chunk) % 4 - - while remainder != 0 and not self.at_eof(): - over_chunk_size = 4 - remainder - over_chunk = b"" - - if self._prev_chunk: - over_chunk = self._prev_chunk[:over_chunk_size] - self._prev_chunk = self._prev_chunk[len(over_chunk) :] - - if len(over_chunk) != over_chunk_size: - over_chunk += await self._content.read(4 - len(over_chunk)) - - if not over_chunk: - self._at_eof = True - - stripped_chunk += b"".join(over_chunk.split()) - chunk += over_chunk - remainder = len(stripped_chunk) % 4 - - self._read_bytes += len(chunk) - if self._read_bytes == self._length: - self._at_eof = True - if self._at_eof: - clrf = await self._content.readline() - assert ( - b"\r\n" == clrf - ), "reader did not read all the data or it is malformed" - return chunk - - async def _read_chunk_from_length(self, size: int) -> bytes: - # Reads body part content chunk of the specified size. - # The body part must has Content-Length header with proper value. - assert self._length is not None, "Content-Length required for chunked read" - chunk_size = min(size, self._length - self._read_bytes) - chunk = await self._content.read(chunk_size) - if self._content.at_eof(): - self._at_eof = True - return chunk - - async def _read_chunk_from_stream(self, size: int) -> bytes: - # Reads content chunk of body part with unknown length. - # The Content-Length header for body part is not necessary. - assert ( - size >= self._boundary_len - ), "Chunk size must be greater or equal than boundary length + 2" - first_chunk = self._prev_chunk is None - if first_chunk: - self._prev_chunk = await self._content.read(size) - - chunk = b"" - # content.read() may return less than size, so we need to loop to ensure - # we have enough data to detect the boundary. - while len(chunk) < self._boundary_len: - chunk += await self._content.read(size) - self._content_eof += int(self._content.at_eof()) - assert self._content_eof < 3, "Reading after EOF" - if self._content_eof: - break - if len(chunk) > size: - self._content.unread_data(chunk[size:]) - chunk = chunk[:size] - - assert self._prev_chunk is not None - window = self._prev_chunk + chunk - sub = b"\r\n" + self._boundary - if first_chunk: - idx = window.find(sub) - else: - idx = window.find(sub, max(0, len(self._prev_chunk) - len(sub))) - if idx >= 0: - # pushing boundary back to content - with warnings.catch_warnings(): - warnings.filterwarnings("ignore", category=DeprecationWarning) - self._content.unread_data(window[idx:]) - if size > idx: - self._prev_chunk = self._prev_chunk[:idx] - chunk = window[len(self._prev_chunk) : idx] - if not chunk: - self._at_eof = True - result = self._prev_chunk - self._prev_chunk = chunk - return result - - async def readline(self) -> bytes: - """Reads body part by line by line.""" - if self._at_eof: - return b"" - - if self._unread: - line = self._unread.popleft() - else: - line = await self._content.readline() - - if line.startswith(self._boundary): - # the very last boundary may not come with \r\n, - # so set single rules for everyone - sline = line.rstrip(b"\r\n") - boundary = self._boundary - last_boundary = self._boundary + b"--" - # ensure that we read exactly the boundary, not something alike - if sline == boundary or sline == last_boundary: - self._at_eof = True - self._unread.append(line) - return b"" - else: - next_line = await self._content.readline() - if next_line.startswith(self._boundary): - line = line[:-2] # strip CRLF but only once - self._unread.append(next_line) - - return line - - async def release(self) -> None: - """Like read(), but reads all the data to the void.""" - if self._at_eof: - return - while not self._at_eof: - await self.read_chunk(self.chunk_size) - - async def text(self, *, encoding: Optional[str] = None) -> str: - """Like read(), but assumes that body part contains text data.""" - data = await self.read(decode=True) - # see https://www.w3.org/TR/html5/forms.html#multipart/form-data-encoding-algorithm - # and https://dvcs.w3.org/hg/xhr/raw-file/tip/Overview.html#dom-xmlhttprequest-send - encoding = encoding or self.get_charset(default="utf-8") - return data.decode(encoding) - - async def json(self, *, encoding: Optional[str] = None) -> Optional[Dict[str, Any]]: - """Like read(), but assumes that body parts contains JSON data.""" - data = await self.read(decode=True) - if not data: - return None - encoding = encoding or self.get_charset(default="utf-8") - return cast(Dict[str, Any], json.loads(data.decode(encoding))) - - async def form(self, *, encoding: Optional[str] = None) -> List[Tuple[str, str]]: - """Like read(), but assumes that body parts contain form urlencoded data.""" - data = await self.read(decode=True) - if not data: - return [] - if encoding is not None: - real_encoding = encoding - else: - real_encoding = self.get_charset(default="utf-8") - try: - decoded_data = data.rstrip().decode(real_encoding) - except UnicodeDecodeError: - raise ValueError("data cannot be decoded with %s encoding" % real_encoding) - - return parse_qsl( - decoded_data, - keep_blank_values=True, - encoding=real_encoding, - ) - - def at_eof(self) -> bool: - """Returns True if the boundary was reached or False otherwise.""" - return self._at_eof - - def decode(self, data: bytes) -> bytes: - """Decodes data. - - Decoding is done according the specified Content-Encoding - or Content-Transfer-Encoding headers value. - """ - if CONTENT_TRANSFER_ENCODING in self.headers: - data = self._decode_content_transfer(data) - # https://datatracker.ietf.org/doc/html/rfc7578#section-4.8 - if not self._is_form_data and CONTENT_ENCODING in self.headers: - return self._decode_content(data) - return data - - def _decode_content(self, data: bytes) -> bytes: - encoding = self.headers.get(CONTENT_ENCODING, "").lower() - if encoding == "identity": - return data - if encoding in {"deflate", "gzip"}: - return ZLibDecompressor( - encoding=encoding, - suppress_deflate_header=True, - ).decompress_sync(data) - - raise RuntimeError(f"unknown content encoding: {encoding}") - - def _decode_content_transfer(self, data: bytes) -> bytes: - encoding = self.headers.get(CONTENT_TRANSFER_ENCODING, "").lower() - - if encoding == "base64": - return base64.b64decode(data) - elif encoding == "quoted-printable": - return binascii.a2b_qp(data) - elif encoding in ("binary", "8bit", "7bit"): - return data - else: - raise RuntimeError(f"unknown content transfer encoding: {encoding}") - - def get_charset(self, default: str) -> str: - """Returns charset parameter from Content-Type header or default.""" - ctype = self.headers.get(CONTENT_TYPE, "") - mimetype = parse_mimetype(ctype) - return mimetype.parameters.get("charset", self._default_charset or default) - - @reify - def name(self) -> Optional[str]: - """Returns name specified in Content-Disposition header. - - If the header is missing or malformed, returns None. - """ - _, params = parse_content_disposition(self.headers.get(CONTENT_DISPOSITION)) - return content_disposition_filename(params, "name") - - @reify - def filename(self) -> Optional[str]: - """Returns filename specified in Content-Disposition header. - - Returns None if the header is missing or malformed. - """ - _, params = parse_content_disposition(self.headers.get(CONTENT_DISPOSITION)) - return content_disposition_filename(params, "filename") - - -@payload_type(BodyPartReader, order=Order.try_first) -class BodyPartReaderPayload(Payload): - _value: BodyPartReader - # _autoclose = False (inherited) - Streaming reader that may have resources - - def __init__(self, value: BodyPartReader, *args: Any, **kwargs: Any) -> None: - super().__init__(value, *args, **kwargs) - - params: Dict[str, str] = {} - if value.name is not None: - params["name"] = value.name - if value.filename is not None: - params["filename"] = value.filename - - if params: - self.set_content_disposition("attachment", True, **params) - - def decode(self, encoding: str = "utf-8", errors: str = "strict") -> str: - raise TypeError("Unable to decode.") - - async def as_bytes(self, encoding: str = "utf-8", errors: str = "strict") -> bytes: - """Raises TypeError as body parts should be consumed via write(). - - This is intentional: BodyPartReader payloads are designed for streaming - large data (potentially gigabytes) and must be consumed only once via - the write() method to avoid memory exhaustion. They cannot be buffered - in memory for reuse. - """ - raise TypeError("Unable to read body part as bytes. Use write() to consume.") - - async def write(self, writer: Any) -> None: - field = self._value - chunk = await field.read_chunk(size=2**16) - while chunk: - await writer.write(field.decode(chunk)) - chunk = await field.read_chunk(size=2**16) - - -class MultipartReader: - """Multipart body reader.""" - - #: Response wrapper, used when multipart readers constructs from response. - response_wrapper_cls = MultipartResponseWrapper - #: Multipart reader class, used to handle multipart/* body parts. - #: None points to type(self) - multipart_reader_cls: Optional[Type["MultipartReader"]] = None - #: Body part reader class for non multipart/* content types. - part_reader_cls = BodyPartReader - - def __init__(self, headers: Mapping[str, str], content: StreamReader) -> None: - self._mimetype = parse_mimetype(headers[CONTENT_TYPE]) - assert self._mimetype.type == "multipart", "multipart/* content type expected" - if "boundary" not in self._mimetype.parameters: - raise ValueError( - "boundary missed for Content-Type: %s" % headers[CONTENT_TYPE] - ) - - self.headers = headers - self._boundary = ("--" + self._get_boundary()).encode() - self._content = content - self._default_charset: Optional[str] = None - self._last_part: Optional[Union["MultipartReader", BodyPartReader]] = None - self._at_eof = False - self._at_bof = True - self._unread: List[bytes] = [] - - def __aiter__(self: Self) -> Self: - return self - - async def __anext__( - self, - ) -> Optional[Union["MultipartReader", BodyPartReader]]: - part = await self.next() - if part is None: - raise StopAsyncIteration - return part - - @classmethod - def from_response( - cls, - response: "ClientResponse", - ) -> MultipartResponseWrapper: - """Constructs reader instance from HTTP response. - - :param response: :class:`~aiohttp.client.ClientResponse` instance - """ - obj = cls.response_wrapper_cls( - response, cls(response.headers, response.content) - ) - return obj - - def at_eof(self) -> bool: - """Returns True if the final boundary was reached, false otherwise.""" - return self._at_eof - - async def next( - self, - ) -> Optional[Union["MultipartReader", BodyPartReader]]: - """Emits the next multipart body part.""" - # So, if we're at BOF, we need to skip till the boundary. - if self._at_eof: - return None - await self._maybe_release_last_part() - if self._at_bof: - await self._read_until_first_boundary() - self._at_bof = False - else: - await self._read_boundary() - if self._at_eof: # we just read the last boundary, nothing to do there - return None - - part = await self.fetch_next_part() - # https://datatracker.ietf.org/doc/html/rfc7578#section-4.6 - if ( - self._last_part is None - and self._mimetype.subtype == "form-data" - and isinstance(part, BodyPartReader) - ): - _, params = parse_content_disposition(part.headers.get(CONTENT_DISPOSITION)) - if params.get("name") == "_charset_": - # Longest encoding in https://encoding.spec.whatwg.org/encodings.json - # is 19 characters, so 32 should be more than enough for any valid encoding. - charset = await part.read_chunk(32) - if len(charset) > 31: - raise RuntimeError("Invalid default charset") - self._default_charset = charset.strip().decode() - part = await self.fetch_next_part() - self._last_part = part - return self._last_part - - async def release(self) -> None: - """Reads all the body parts to the void till the final boundary.""" - while not self._at_eof: - item = await self.next() - if item is None: - break - await item.release() - - async def fetch_next_part( - self, - ) -> Union["MultipartReader", BodyPartReader]: - """Returns the next body part reader.""" - headers = await self._read_headers() - return self._get_part_reader(headers) - - def _get_part_reader( - self, - headers: "CIMultiDictProxy[str]", - ) -> Union["MultipartReader", BodyPartReader]: - """Dispatches the response by the `Content-Type` header. - - Returns a suitable reader instance. - - :param dict headers: Response headers - """ - ctype = headers.get(CONTENT_TYPE, "") - mimetype = parse_mimetype(ctype) - - if mimetype.type == "multipart": - if self.multipart_reader_cls is None: - return type(self)(headers, self._content) - return self.multipart_reader_cls(headers, self._content) - else: - return self.part_reader_cls( - self._boundary, - headers, - self._content, - subtype=self._mimetype.subtype, - default_charset=self._default_charset, - ) - - def _get_boundary(self) -> str: - boundary = self._mimetype.parameters["boundary"] - if len(boundary) > 70: - raise ValueError("boundary %r is too long (70 chars max)" % boundary) - - return boundary - - async def _readline(self) -> bytes: - if self._unread: - return self._unread.pop() - return await self._content.readline() - - async def _read_until_first_boundary(self) -> None: - while True: - chunk = await self._readline() - if chunk == b"": - raise ValueError( - "Could not find starting boundary %r" % (self._boundary) - ) - chunk = chunk.rstrip() - if chunk == self._boundary: - return - elif chunk == self._boundary + b"--": - self._at_eof = True - return - - async def _read_boundary(self) -> None: - chunk = (await self._readline()).rstrip() - if chunk == self._boundary: - pass - elif chunk == self._boundary + b"--": - self._at_eof = True - epilogue = await self._readline() - next_line = await self._readline() - - # the epilogue is expected and then either the end of input or the - # parent multipart boundary, if the parent boundary is found then - # it should be marked as unread and handed to the parent for - # processing - if next_line[:2] == b"--": - self._unread.append(next_line) - # otherwise the request is likely missing an epilogue and both - # lines should be passed to the parent for processing - # (this handles the old behavior gracefully) - else: - self._unread.extend([next_line, epilogue]) - else: - raise ValueError(f"Invalid boundary {chunk!r}, expected {self._boundary!r}") - - async def _read_headers(self) -> "CIMultiDictProxy[str]": - lines = [] - while True: - chunk = await self._content.readline() - chunk = chunk.strip() - lines.append(chunk) - if not chunk: - break - parser = HeadersParser() - headers, raw_headers = parser.parse_headers(lines) - return headers - - async def _maybe_release_last_part(self) -> None: - """Ensures that the last read body part is read completely.""" - if self._last_part is not None: - if not self._last_part.at_eof(): - await self._last_part.release() - self._unread.extend(self._last_part._unread) - self._last_part = None - - -_Part = Tuple[Payload, str, str] - - -class MultipartWriter(Payload): - """Multipart body writer.""" - - _value: None - # _consumed = False (inherited) - Can be encoded multiple times - _autoclose = True # No file handles, just collects parts in memory - - def __init__(self, subtype: str = "mixed", boundary: Optional[str] = None) -> None: - boundary = boundary if boundary is not None else uuid.uuid4().hex - # The underlying Payload API demands a str (utf-8), not bytes, - # so we need to ensure we don't lose anything during conversion. - # As a result, require the boundary to be ASCII only. - # In both situations. - - try: - self._boundary = boundary.encode("ascii") - except UnicodeEncodeError: - raise ValueError("boundary should contain ASCII only chars") from None - ctype = f"multipart/{subtype}; boundary={self._boundary_value}" - - super().__init__(None, content_type=ctype) - - self._parts: List[_Part] = [] - self._is_form_data = subtype == "form-data" - - def __enter__(self) -> "MultipartWriter": - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - pass - - def __iter__(self) -> Iterator[_Part]: - return iter(self._parts) - - def __len__(self) -> int: - return len(self._parts) - - def __bool__(self) -> bool: - return True - - _valid_tchar_regex = re.compile(rb"\A[!#$%&'*+\-.^_`|~\w]+\Z") - _invalid_qdtext_char_regex = re.compile(rb"[\x00-\x08\x0A-\x1F\x7F]") - - @property - def _boundary_value(self) -> str: - """Wrap boundary parameter value in quotes, if necessary. - - Reads self.boundary and returns a unicode string. - """ - # Refer to RFCs 7231, 7230, 5234. - # - # parameter = token "=" ( token / quoted-string ) - # token = 1*tchar - # quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE - # qdtext = HTAB / SP / %x21 / %x23-5B / %x5D-7E / obs-text - # obs-text = %x80-FF - # quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text ) - # tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" - # / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" - # / DIGIT / ALPHA - # ; any VCHAR, except delimiters - # VCHAR = %x21-7E - value = self._boundary - if re.match(self._valid_tchar_regex, value): - return value.decode("ascii") # cannot fail - - if re.search(self._invalid_qdtext_char_regex, value): - raise ValueError("boundary value contains invalid characters") - - # escape %x5C and %x22 - quoted_value_content = value.replace(b"\\", b"\\\\") - quoted_value_content = quoted_value_content.replace(b'"', b'\\"') - - return '"' + quoted_value_content.decode("ascii") + '"' - - @property - def boundary(self) -> str: - return self._boundary.decode("ascii") - - def append(self, obj: Any, headers: Optional[Mapping[str, str]] = None) -> Payload: - if headers is None: - headers = CIMultiDict() - - if isinstance(obj, Payload): - obj.headers.update(headers) - return self.append_payload(obj) - else: - try: - payload = get_payload(obj, headers=headers) - except LookupError: - raise TypeError("Cannot create payload from %r" % obj) - else: - return self.append_payload(payload) - - def append_payload(self, payload: Payload) -> Payload: - """Adds a new body part to multipart writer.""" - encoding: Optional[str] = None - te_encoding: Optional[str] = None - if self._is_form_data: - # https://datatracker.ietf.org/doc/html/rfc7578#section-4.7 - # https://datatracker.ietf.org/doc/html/rfc7578#section-4.8 - assert ( - not {CONTENT_ENCODING, CONTENT_LENGTH, CONTENT_TRANSFER_ENCODING} - & payload.headers.keys() - ) - # Set default Content-Disposition in case user doesn't create one - if CONTENT_DISPOSITION not in payload.headers: - name = f"section-{len(self._parts)}" - payload.set_content_disposition("form-data", name=name) - else: - # compression - encoding = payload.headers.get(CONTENT_ENCODING, "").lower() - if encoding and encoding not in ("deflate", "gzip", "identity"): - raise RuntimeError(f"unknown content encoding: {encoding}") - if encoding == "identity": - encoding = None - - # te encoding - te_encoding = payload.headers.get(CONTENT_TRANSFER_ENCODING, "").lower() - if te_encoding not in ("", "base64", "quoted-printable", "binary"): - raise RuntimeError(f"unknown content transfer encoding: {te_encoding}") - if te_encoding == "binary": - te_encoding = None - - # size - size = payload.size - if size is not None and not (encoding or te_encoding): - payload.headers[CONTENT_LENGTH] = str(size) - - self._parts.append((payload, encoding, te_encoding)) # type: ignore[arg-type] - return payload - - def append_json( - self, obj: Any, headers: Optional[Mapping[str, str]] = None - ) -> Payload: - """Helper to append JSON part.""" - if headers is None: - headers = CIMultiDict() - - return self.append_payload(JsonPayload(obj, headers=headers)) - - def append_form( - self, - obj: Union[Sequence[Tuple[str, str]], Mapping[str, str]], - headers: Optional[Mapping[str, str]] = None, - ) -> Payload: - """Helper to append form urlencoded part.""" - assert isinstance(obj, (Sequence, Mapping)) - - if headers is None: - headers = CIMultiDict() - - if isinstance(obj, Mapping): - obj = list(obj.items()) - data = urlencode(obj, doseq=True) - - return self.append_payload( - StringPayload( - data, headers=headers, content_type="application/x-www-form-urlencoded" - ) - ) - - @property - def size(self) -> Optional[int]: - """Size of the payload.""" - total = 0 - for part, encoding, te_encoding in self._parts: - if encoding or te_encoding or part.size is None: - return None - - total += int( - 2 - + len(self._boundary) - + 2 - + part.size # b'--'+self._boundary+b'\r\n' - + len(part._binary_headers) - + 2 # b'\r\n' - ) - - total += 2 + len(self._boundary) + 4 # b'--'+self._boundary+b'--\r\n' - return total - - def decode(self, encoding: str = "utf-8", errors: str = "strict") -> str: - """Return string representation of the multipart data. - - WARNING: This method may do blocking I/O if parts contain file payloads. - It should not be called in the event loop. Use as_bytes().decode() instead. - """ - return "".join( - "--" - + self.boundary - + "\r\n" - + part._binary_headers.decode(encoding, errors) - + part.decode() - for part, _e, _te in self._parts - ) - - async def as_bytes(self, encoding: str = "utf-8", errors: str = "strict") -> bytes: - """Return bytes representation of the multipart data. - - This method is async-safe and calls as_bytes on underlying payloads. - """ - parts: List[bytes] = [] - - # Process each part - for part, _e, _te in self._parts: - # Add boundary - parts.append(b"--" + self._boundary + b"\r\n") - - # Add headers - parts.append(part._binary_headers) - - # Add payload content using as_bytes for async safety - part_bytes = await part.as_bytes(encoding, errors) - parts.append(part_bytes) - - # Add trailing CRLF - parts.append(b"\r\n") - - # Add closing boundary - parts.append(b"--" + self._boundary + b"--\r\n") - - return b"".join(parts) - - async def write(self, writer: Any, close_boundary: bool = True) -> None: - """Write body.""" - for part, encoding, te_encoding in self._parts: - if self._is_form_data: - # https://datatracker.ietf.org/doc/html/rfc7578#section-4.2 - assert CONTENT_DISPOSITION in part.headers - assert "name=" in part.headers[CONTENT_DISPOSITION] - - await writer.write(b"--" + self._boundary + b"\r\n") - await writer.write(part._binary_headers) - - if encoding or te_encoding: - w = MultipartPayloadWriter(writer) - if encoding: - w.enable_compression(encoding) - if te_encoding: - w.enable_encoding(te_encoding) - await part.write(w) # type: ignore[arg-type] - await w.write_eof() - else: - await part.write(writer) - - await writer.write(b"\r\n") - - if close_boundary: - await writer.write(b"--" + self._boundary + b"--\r\n") - - async def close(self) -> None: - """ - Close all part payloads that need explicit closing. - - IMPORTANT: This method must not await anything that might not finish - immediately, as it may be called during cleanup/cancellation. Schedule - any long-running operations without awaiting them. - """ - if self._consumed: - return - self._consumed = True - - # Close all parts that need explicit closing - # We catch and log exceptions to ensure all parts get a chance to close - # we do not use asyncio.gather() here because we are not allowed - # to suspend given we may be called during cleanup - for idx, (part, _, _) in enumerate(self._parts): - if not part.autoclose and not part.consumed: - try: - await part.close() - except Exception as exc: - internal_logger.error( - "Failed to close multipart part %d: %s", idx, exc, exc_info=True - ) - - -class MultipartPayloadWriter: - def __init__(self, writer: Any) -> None: - self._writer = writer - self._encoding: Optional[str] = None - self._compress: Optional[ZLibCompressor] = None - self._encoding_buffer: Optional[bytearray] = None - - def enable_encoding(self, encoding: str) -> None: - if encoding == "base64": - self._encoding = encoding - self._encoding_buffer = bytearray() - elif encoding == "quoted-printable": - self._encoding = "quoted-printable" - - def enable_compression( - self, encoding: str = "deflate", strategy: Optional[int] = None - ) -> None: - self._compress = ZLibCompressor( - encoding=encoding, - suppress_deflate_header=True, - strategy=strategy, - ) - - async def write_eof(self) -> None: - if self._compress is not None: - chunk = self._compress.flush() - if chunk: - self._compress = None - await self.write(chunk) - - if self._encoding == "base64": - if self._encoding_buffer: - await self._writer.write(base64.b64encode(self._encoding_buffer)) - - async def write(self, chunk: bytes) -> None: - if self._compress is not None: - if chunk: - chunk = await self._compress.compress(chunk) - if not chunk: - return - - if self._encoding == "base64": - buf = self._encoding_buffer - assert buf is not None - buf.extend(chunk) - - if buf: - div, mod = divmod(len(buf), 3) - enc_chunk, self._encoding_buffer = (buf[: div * 3], buf[div * 3 :]) - if enc_chunk: - b64chunk = base64.b64encode(enc_chunk) - await self._writer.write(b64chunk) - elif self._encoding == "quoted-printable": - await self._writer.write(binascii.b2a_qp(chunk)) - else: - await self._writer.write(chunk) diff --git a/venv/lib/python3.12/site-packages/aiohttp/payload.py b/venv/lib/python3.12/site-packages/aiohttp/payload.py deleted file mode 100644 index 3affa71..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/payload.py +++ /dev/null @@ -1,1124 +0,0 @@ -import asyncio -import enum -import io -import json -import mimetypes -import os -import sys -import warnings -from abc import ABC, abstractmethod -from collections.abc import Iterable -from itertools import chain -from typing import ( - IO, - TYPE_CHECKING, - Any, - Dict, - Final, - List, - Optional, - Set, - TextIO, - Tuple, - Type, - Union, -) - -from multidict import CIMultiDict - -from . import hdrs -from .abc import AbstractStreamWriter -from .helpers import ( - _SENTINEL, - content_disposition_header, - guess_filename, - parse_mimetype, - sentinel, -) -from .streams import StreamReader -from .typedefs import JSONEncoder, _CIMultiDict - -__all__ = ( - "PAYLOAD_REGISTRY", - "get_payload", - "payload_type", - "Payload", - "BytesPayload", - "StringPayload", - "IOBasePayload", - "BytesIOPayload", - "BufferedReaderPayload", - "TextIOPayload", - "StringIOPayload", - "JsonPayload", - "AsyncIterablePayload", -) - -TOO_LARGE_BYTES_BODY: Final[int] = 2**20 # 1 MB -READ_SIZE: Final[int] = 2**16 # 64 KB -_CLOSE_FUTURES: Set[asyncio.Future[None]] = set() - - -class LookupError(Exception): - """Raised when no payload factory is found for the given data type.""" - - -class Order(str, enum.Enum): - normal = "normal" - try_first = "try_first" - try_last = "try_last" - - -def get_payload(data: Any, *args: Any, **kwargs: Any) -> "Payload": - return PAYLOAD_REGISTRY.get(data, *args, **kwargs) - - -def register_payload( - factory: Type["Payload"], type: Any, *, order: Order = Order.normal -) -> None: - PAYLOAD_REGISTRY.register(factory, type, order=order) - - -class payload_type: - def __init__(self, type: Any, *, order: Order = Order.normal) -> None: - self.type = type - self.order = order - - def __call__(self, factory: Type["Payload"]) -> Type["Payload"]: - register_payload(factory, self.type, order=self.order) - return factory - - -PayloadType = Type["Payload"] -_PayloadRegistryItem = Tuple[PayloadType, Any] - - -class PayloadRegistry: - """Payload registry. - - note: we need zope.interface for more efficient adapter search - """ - - __slots__ = ("_first", "_normal", "_last", "_normal_lookup") - - def __init__(self) -> None: - self._first: List[_PayloadRegistryItem] = [] - self._normal: List[_PayloadRegistryItem] = [] - self._last: List[_PayloadRegistryItem] = [] - self._normal_lookup: Dict[Any, PayloadType] = {} - - def get( - self, - data: Any, - *args: Any, - _CHAIN: "Type[chain[_PayloadRegistryItem]]" = chain, - **kwargs: Any, - ) -> "Payload": - if self._first: - for factory, type_ in self._first: - if isinstance(data, type_): - return factory(data, *args, **kwargs) - # Try the fast lookup first - if lookup_factory := self._normal_lookup.get(type(data)): - return lookup_factory(data, *args, **kwargs) - # Bail early if its already a Payload - if isinstance(data, Payload): - return data - # Fallback to the slower linear search - for factory, type_ in _CHAIN(self._normal, self._last): - if isinstance(data, type_): - return factory(data, *args, **kwargs) - raise LookupError() - - def register( - self, factory: PayloadType, type: Any, *, order: Order = Order.normal - ) -> None: - if order is Order.try_first: - self._first.append((factory, type)) - elif order is Order.normal: - self._normal.append((factory, type)) - if isinstance(type, Iterable): - for t in type: - self._normal_lookup[t] = factory - else: - self._normal_lookup[type] = factory - elif order is Order.try_last: - self._last.append((factory, type)) - else: - raise ValueError(f"Unsupported order {order!r}") - - -class Payload(ABC): - - _default_content_type: str = "application/octet-stream" - _size: Optional[int] = None - _consumed: bool = False # Default: payload has not been consumed yet - _autoclose: bool = False # Default: assume resource needs explicit closing - - def __init__( - self, - value: Any, - headers: Optional[ - Union[_CIMultiDict, Dict[str, str], Iterable[Tuple[str, str]]] - ] = None, - content_type: Union[str, None, _SENTINEL] = sentinel, - filename: Optional[str] = None, - encoding: Optional[str] = None, - **kwargs: Any, - ) -> None: - self._encoding = encoding - self._filename = filename - self._headers: _CIMultiDict = CIMultiDict() - self._value = value - if content_type is not sentinel and content_type is not None: - self._headers[hdrs.CONTENT_TYPE] = content_type - elif self._filename is not None: - if sys.version_info >= (3, 13): - guesser = mimetypes.guess_file_type - else: - guesser = mimetypes.guess_type - content_type = guesser(self._filename)[0] - if content_type is None: - content_type = self._default_content_type - self._headers[hdrs.CONTENT_TYPE] = content_type - else: - self._headers[hdrs.CONTENT_TYPE] = self._default_content_type - if headers: - self._headers.update(headers) - - @property - def size(self) -> Optional[int]: - """Size of the payload in bytes. - - Returns the number of bytes that will be transmitted when the payload - is written. For string payloads, this is the size after encoding to bytes, - not the length of the string. - """ - return self._size - - @property - def filename(self) -> Optional[str]: - """Filename of the payload.""" - return self._filename - - @property - def headers(self) -> _CIMultiDict: - """Custom item headers""" - return self._headers - - @property - def _binary_headers(self) -> bytes: - return ( - "".join([k + ": " + v + "\r\n" for k, v in self.headers.items()]).encode( - "utf-8" - ) - + b"\r\n" - ) - - @property - def encoding(self) -> Optional[str]: - """Payload encoding""" - return self._encoding - - @property - def content_type(self) -> str: - """Content type""" - return self._headers[hdrs.CONTENT_TYPE] - - @property - def consumed(self) -> bool: - """Whether the payload has been consumed and cannot be reused.""" - return self._consumed - - @property - def autoclose(self) -> bool: - """ - Whether the payload can close itself automatically. - - Returns True if the payload has no file handles or resources that need - explicit closing. If False, callers must await close() to release resources. - """ - return self._autoclose - - def set_content_disposition( - self, - disptype: str, - quote_fields: bool = True, - _charset: str = "utf-8", - **params: Any, - ) -> None: - """Sets ``Content-Disposition`` header.""" - self._headers[hdrs.CONTENT_DISPOSITION] = content_disposition_header( - disptype, quote_fields=quote_fields, _charset=_charset, **params - ) - - @abstractmethod - def decode(self, encoding: str = "utf-8", errors: str = "strict") -> str: - """ - Return string representation of the value. - - This is named decode() to allow compatibility with bytes objects. - """ - - @abstractmethod - async def write(self, writer: AbstractStreamWriter) -> None: - """ - Write payload to the writer stream. - - Args: - writer: An AbstractStreamWriter instance that handles the actual writing - - This is a legacy method that writes the entire payload without length constraints. - - Important: - For new implementations, use write_with_length() instead of this method. - This method is maintained for backwards compatibility and will eventually - delegate to write_with_length(writer, None) in all implementations. - - All payload subclasses must override this method for backwards compatibility, - but new code should use write_with_length for more flexibility and control. - - """ - - # write_with_length is new in aiohttp 3.12 - # it should be overridden by subclasses - async def write_with_length( - self, writer: AbstractStreamWriter, content_length: Optional[int] - ) -> None: - """ - Write payload with a specific content length constraint. - - Args: - writer: An AbstractStreamWriter instance that handles the actual writing - content_length: Maximum number of bytes to write (None for unlimited) - - This method allows writing payload content with a specific length constraint, - which is particularly useful for HTTP responses with Content-Length header. - - Note: - This is the base implementation that provides backwards compatibility - for subclasses that don't override this method. Specific payload types - should override this method to implement proper length-constrained writing. - - """ - # Backwards compatibility for subclasses that don't override this method - # and for the default implementation - await self.write(writer) - - async def as_bytes(self, encoding: str = "utf-8", errors: str = "strict") -> bytes: - """ - Return bytes representation of the value. - - This is a convenience method that calls decode() and encodes the result - to bytes using the specified encoding. - """ - # Use instance encoding if available, otherwise use parameter - actual_encoding = self._encoding or encoding - return self.decode(actual_encoding, errors).encode(actual_encoding) - - def _close(self) -> None: - """ - Async safe synchronous close operations for backwards compatibility. - - This method exists only for backwards compatibility with code that - needs to clean up payloads synchronously. In the future, we will - drop this method and only support the async close() method. - - WARNING: This method must be safe to call from within the event loop - without blocking. Subclasses should not perform any blocking I/O here. - - WARNING: This method must be called from within an event loop for - certain payload types (e.g., IOBasePayload). Calling it outside an - event loop may raise RuntimeError. - """ - # This is a no-op by default, but subclasses can override it - # for non-blocking cleanup operations. - - async def close(self) -> None: - """ - Close the payload if it holds any resources. - - IMPORTANT: This method must not await anything that might not finish - immediately, as it may be called during cleanup/cancellation. Schedule - any long-running operations without awaiting them. - - In the future, this will be the only close method supported. - """ - self._close() - - -class BytesPayload(Payload): - _value: bytes - # _consumed = False (inherited) - Bytes are immutable and can be reused - _autoclose = True # No file handle, just bytes in memory - - def __init__( - self, value: Union[bytes, bytearray, memoryview], *args: Any, **kwargs: Any - ) -> None: - if "content_type" not in kwargs: - kwargs["content_type"] = "application/octet-stream" - - super().__init__(value, *args, **kwargs) - - if isinstance(value, memoryview): - self._size = value.nbytes - elif isinstance(value, (bytes, bytearray)): - self._size = len(value) - else: - raise TypeError(f"value argument must be byte-ish, not {type(value)!r}") - - if self._size > TOO_LARGE_BYTES_BODY: - kwargs = {"source": self} - warnings.warn( - "Sending a large body directly with raw bytes might" - " lock the event loop. You should probably pass an " - "io.BytesIO object instead", - ResourceWarning, - **kwargs, - ) - - def decode(self, encoding: str = "utf-8", errors: str = "strict") -> str: - return self._value.decode(encoding, errors) - - async def as_bytes(self, encoding: str = "utf-8", errors: str = "strict") -> bytes: - """ - Return bytes representation of the value. - - This method returns the raw bytes content of the payload. - It is equivalent to accessing the _value attribute directly. - """ - return self._value - - async def write(self, writer: AbstractStreamWriter) -> None: - """ - Write the entire bytes payload to the writer stream. - - Args: - writer: An AbstractStreamWriter instance that handles the actual writing - - This method writes the entire bytes content without any length constraint. - - Note: - For new implementations that need length control, use write_with_length(). - This method is maintained for backwards compatibility and is equivalent - to write_with_length(writer, None). - - """ - await writer.write(self._value) - - async def write_with_length( - self, writer: AbstractStreamWriter, content_length: Optional[int] - ) -> None: - """ - Write bytes payload with a specific content length constraint. - - Args: - writer: An AbstractStreamWriter instance that handles the actual writing - content_length: Maximum number of bytes to write (None for unlimited) - - This method writes either the entire byte sequence or a slice of it - up to the specified content_length. For BytesPayload, this operation - is performed efficiently using array slicing. - - """ - if content_length is not None: - await writer.write(self._value[:content_length]) - else: - await writer.write(self._value) - - -class StringPayload(BytesPayload): - def __init__( - self, - value: str, - *args: Any, - encoding: Optional[str] = None, - content_type: Optional[str] = None, - **kwargs: Any, - ) -> None: - - if encoding is None: - if content_type is None: - real_encoding = "utf-8" - content_type = "text/plain; charset=utf-8" - else: - mimetype = parse_mimetype(content_type) - real_encoding = mimetype.parameters.get("charset", "utf-8") - else: - if content_type is None: - content_type = "text/plain; charset=%s" % encoding - real_encoding = encoding - - super().__init__( - value.encode(real_encoding), - encoding=real_encoding, - content_type=content_type, - *args, - **kwargs, - ) - - -class StringIOPayload(StringPayload): - def __init__(self, value: IO[str], *args: Any, **kwargs: Any) -> None: - super().__init__(value.read(), *args, **kwargs) - - -class IOBasePayload(Payload): - _value: io.IOBase - # _consumed = False (inherited) - File can be re-read from the same position - _start_position: Optional[int] = None - # _autoclose = False (inherited) - Has file handle that needs explicit closing - - def __init__( - self, value: IO[Any], disposition: str = "attachment", *args: Any, **kwargs: Any - ) -> None: - if "filename" not in kwargs: - kwargs["filename"] = guess_filename(value) - - super().__init__(value, *args, **kwargs) - - if self._filename is not None and disposition is not None: - if hdrs.CONTENT_DISPOSITION not in self.headers: - self.set_content_disposition(disposition, filename=self._filename) - - def _set_or_restore_start_position(self) -> None: - """Set or restore the start position of the file-like object.""" - if self._start_position is None: - try: - self._start_position = self._value.tell() - except (OSError, AttributeError): - self._consumed = True # Cannot seek, mark as consumed - return - try: - self._value.seek(self._start_position) - except (OSError, AttributeError): - # Failed to seek back - mark as consumed since we've already read - self._consumed = True - - def _read_and_available_len( - self, remaining_content_len: Optional[int] - ) -> Tuple[Optional[int], bytes]: - """ - Read the file-like object and return both its total size and the first chunk. - - Args: - remaining_content_len: Optional limit on how many bytes to read in this operation. - If None, READ_SIZE will be used as the default chunk size. - - Returns: - A tuple containing: - - The total size of the remaining unread content (None if size cannot be determined) - - The first chunk of bytes read from the file object - - This method is optimized to perform both size calculation and initial read - in a single operation, which is executed in a single executor job to minimize - context switches and file operations when streaming content. - - """ - self._set_or_restore_start_position() - size = self.size # Call size only once since it does I/O - return size, self._value.read( - min(READ_SIZE, size or READ_SIZE, remaining_content_len or READ_SIZE) - ) - - def _read(self, remaining_content_len: Optional[int]) -> bytes: - """ - Read a chunk of data from the file-like object. - - Args: - remaining_content_len: Optional maximum number of bytes to read. - If None, READ_SIZE will be used as the default chunk size. - - Returns: - A chunk of bytes read from the file object, respecting the - remaining_content_len limit if specified. - - This method is used for subsequent reads during streaming after - the initial _read_and_available_len call has been made. - - """ - return self._value.read(remaining_content_len or READ_SIZE) # type: ignore[no-any-return] - - @property - def size(self) -> Optional[int]: - """ - Size of the payload in bytes. - - Returns the total size of the payload content from the initial position. - This ensures consistent Content-Length for requests, including 307/308 redirects - where the same payload instance is reused. - - Returns None if the size cannot be determined (e.g., for unseekable streams). - """ - try: - # Store the start position on first access. - # This is critical when the same payload instance is reused (e.g., 307/308 - # redirects). Without storing the initial position, after the payload is - # read once, the file position would be at EOF, which would cause the - # size calculation to return 0 (file_size - EOF position). - # By storing the start position, we ensure the size calculation always - # returns the correct total size for any subsequent use. - if self._start_position is None: - try: - self._start_position = self._value.tell() - except (OSError, AttributeError): - # Can't get position, can't determine size - return None - - # Return the total size from the start position - # This ensures Content-Length is correct even after reading - return os.fstat(self._value.fileno()).st_size - self._start_position - except (AttributeError, OSError): - return None - - async def write(self, writer: AbstractStreamWriter) -> None: - """ - Write the entire file-like payload to the writer stream. - - Args: - writer: An AbstractStreamWriter instance that handles the actual writing - - This method writes the entire file content without any length constraint. - It delegates to write_with_length() with no length limit for implementation - consistency. - - Note: - For new implementations that need length control, use write_with_length() directly. - This method is maintained for backwards compatibility with existing code. - - """ - await self.write_with_length(writer, None) - - async def write_with_length( - self, writer: AbstractStreamWriter, content_length: Optional[int] - ) -> None: - """ - Write file-like payload with a specific content length constraint. - - Args: - writer: An AbstractStreamWriter instance that handles the actual writing - content_length: Maximum number of bytes to write (None for unlimited) - - This method implements optimized streaming of file content with length constraints: - - 1. File reading is performed in a thread pool to avoid blocking the event loop - 2. Content is read and written in chunks to maintain memory efficiency - 3. Writing stops when either: - - All available file content has been written (when size is known) - - The specified content_length has been reached - 4. File resources are properly closed even if the operation is cancelled - - The implementation carefully handles both known-size and unknown-size payloads, - as well as constrained and unconstrained content lengths. - - """ - loop = asyncio.get_running_loop() - total_written_len = 0 - remaining_content_len = content_length - - # Get initial data and available length - available_len, chunk = await loop.run_in_executor( - None, self._read_and_available_len, remaining_content_len - ) - # Process data chunks until done - while chunk: - chunk_len = len(chunk) - - # Write data with or without length constraint - if remaining_content_len is None: - await writer.write(chunk) - else: - await writer.write(chunk[:remaining_content_len]) - remaining_content_len -= chunk_len - - total_written_len += chunk_len - - # Check if we're done writing - if self._should_stop_writing( - available_len, total_written_len, remaining_content_len - ): - return - - # Read next chunk - chunk = await loop.run_in_executor( - None, - self._read, - ( - min(READ_SIZE, remaining_content_len) - if remaining_content_len is not None - else READ_SIZE - ), - ) - - def _should_stop_writing( - self, - available_len: Optional[int], - total_written_len: int, - remaining_content_len: Optional[int], - ) -> bool: - """ - Determine if we should stop writing data. - - Args: - available_len: Known size of the payload if available (None if unknown) - total_written_len: Number of bytes already written - remaining_content_len: Remaining bytes to be written for content-length limited responses - - Returns: - True if we should stop writing data, based on either: - - Having written all available data (when size is known) - - Having written all requested content (when content-length is specified) - - """ - return (available_len is not None and total_written_len >= available_len) or ( - remaining_content_len is not None and remaining_content_len <= 0 - ) - - def _close(self) -> None: - """ - Async safe synchronous close operations for backwards compatibility. - - This method exists only for backwards - compatibility. Use the async close() method instead. - - WARNING: This method MUST be called from within an event loop. - Calling it outside an event loop will raise RuntimeError. - """ - # Skip if already consumed - if self._consumed: - return - self._consumed = True # Mark as consumed to prevent further writes - # Schedule file closing without awaiting to prevent cancellation issues - loop = asyncio.get_running_loop() - close_future = loop.run_in_executor(None, self._value.close) - # Hold a strong reference to the future to prevent it from being - # garbage collected before it completes. - _CLOSE_FUTURES.add(close_future) - close_future.add_done_callback(_CLOSE_FUTURES.remove) - - async def close(self) -> None: - """ - Close the payload if it holds any resources. - - IMPORTANT: This method must not await anything that might not finish - immediately, as it may be called during cleanup/cancellation. Schedule - any long-running operations without awaiting them. - """ - self._close() - - def decode(self, encoding: str = "utf-8", errors: str = "strict") -> str: - """ - Return string representation of the value. - - WARNING: This method does blocking I/O and should not be called in the event loop. - """ - return self._read_all().decode(encoding, errors) - - def _read_all(self) -> bytes: - """Read the entire file-like object and return its content as bytes.""" - self._set_or_restore_start_position() - # Use readlines() to ensure we get all content - return b"".join(self._value.readlines()) - - async def as_bytes(self, encoding: str = "utf-8", errors: str = "strict") -> bytes: - """ - Return bytes representation of the value. - - This method reads the entire file content and returns it as bytes. - It is equivalent to reading the file-like object directly. - The file reading is performed in an executor to avoid blocking the event loop. - """ - loop = asyncio.get_running_loop() - return await loop.run_in_executor(None, self._read_all) - - -class TextIOPayload(IOBasePayload): - _value: io.TextIOBase - # _autoclose = False (inherited) - Has text file handle that needs explicit closing - - def __init__( - self, - value: TextIO, - *args: Any, - encoding: Optional[str] = None, - content_type: Optional[str] = None, - **kwargs: Any, - ) -> None: - - if encoding is None: - if content_type is None: - encoding = "utf-8" - content_type = "text/plain; charset=utf-8" - else: - mimetype = parse_mimetype(content_type) - encoding = mimetype.parameters.get("charset", "utf-8") - else: - if content_type is None: - content_type = "text/plain; charset=%s" % encoding - - super().__init__( - value, - content_type=content_type, - encoding=encoding, - *args, - **kwargs, - ) - - def _read_and_available_len( - self, remaining_content_len: Optional[int] - ) -> Tuple[Optional[int], bytes]: - """ - Read the text file-like object and return both its total size and the first chunk. - - Args: - remaining_content_len: Optional limit on how many bytes to read in this operation. - If None, READ_SIZE will be used as the default chunk size. - - Returns: - A tuple containing: - - The total size of the remaining unread content (None if size cannot be determined) - - The first chunk of bytes read from the file object, encoded using the payload's encoding - - This method is optimized to perform both size calculation and initial read - in a single operation, which is executed in a single executor job to minimize - context switches and file operations when streaming content. - - Note: - TextIOPayload handles encoding of the text content before writing it - to the stream. If no encoding is specified, UTF-8 is used as the default. - - """ - self._set_or_restore_start_position() - size = self.size - chunk = self._value.read( - min(READ_SIZE, size or READ_SIZE, remaining_content_len or READ_SIZE) - ) - return size, chunk.encode(self._encoding) if self._encoding else chunk.encode() - - def _read(self, remaining_content_len: Optional[int]) -> bytes: - """ - Read a chunk of data from the text file-like object. - - Args: - remaining_content_len: Optional maximum number of bytes to read. - If None, READ_SIZE will be used as the default chunk size. - - Returns: - A chunk of bytes read from the file object and encoded using the payload's - encoding. The data is automatically converted from text to bytes. - - This method is used for subsequent reads during streaming after - the initial _read_and_available_len call has been made. It properly - handles text encoding, converting the text content to bytes using - the specified encoding (or UTF-8 if none was provided). - - """ - chunk = self._value.read(remaining_content_len or READ_SIZE) - return chunk.encode(self._encoding) if self._encoding else chunk.encode() - - def decode(self, encoding: str = "utf-8", errors: str = "strict") -> str: - """ - Return string representation of the value. - - WARNING: This method does blocking I/O and should not be called in the event loop. - """ - self._set_or_restore_start_position() - return self._value.read() - - async def as_bytes(self, encoding: str = "utf-8", errors: str = "strict") -> bytes: - """ - Return bytes representation of the value. - - This method reads the entire text file content and returns it as bytes. - It encodes the text content using the specified encoding. - The file reading is performed in an executor to avoid blocking the event loop. - """ - loop = asyncio.get_running_loop() - - # Use instance encoding if available, otherwise use parameter - actual_encoding = self._encoding or encoding - - def _read_and_encode() -> bytes: - self._set_or_restore_start_position() - # TextIO read() always returns the full content - return self._value.read().encode(actual_encoding, errors) - - return await loop.run_in_executor(None, _read_and_encode) - - -class BytesIOPayload(IOBasePayload): - _value: io.BytesIO - _size: int # Always initialized in __init__ - _autoclose = True # BytesIO is in-memory, safe to auto-close - - def __init__(self, value: io.BytesIO, *args: Any, **kwargs: Any) -> None: - super().__init__(value, *args, **kwargs) - # Calculate size once during initialization - self._size = len(self._value.getbuffer()) - self._value.tell() - - @property - def size(self) -> int: - """Size of the payload in bytes. - - Returns the number of bytes in the BytesIO buffer that will be transmitted. - This is calculated once during initialization for efficiency. - """ - return self._size - - def decode(self, encoding: str = "utf-8", errors: str = "strict") -> str: - self._set_or_restore_start_position() - return self._value.read().decode(encoding, errors) - - async def write(self, writer: AbstractStreamWriter) -> None: - return await self.write_with_length(writer, None) - - async def write_with_length( - self, writer: AbstractStreamWriter, content_length: Optional[int] - ) -> None: - """ - Write BytesIO payload with a specific content length constraint. - - Args: - writer: An AbstractStreamWriter instance that handles the actual writing - content_length: Maximum number of bytes to write (None for unlimited) - - This implementation is specifically optimized for BytesIO objects: - - 1. Reads content in chunks to maintain memory efficiency - 2. Yields control back to the event loop periodically to prevent blocking - when dealing with large BytesIO objects - 3. Respects content_length constraints when specified - 4. Properly cleans up by closing the BytesIO object when done or on error - - The periodic yielding to the event loop is important for maintaining - responsiveness when processing large in-memory buffers. - - """ - self._set_or_restore_start_position() - loop_count = 0 - remaining_bytes = content_length - while chunk := self._value.read(READ_SIZE): - if loop_count > 0: - # Avoid blocking the event loop - # if they pass a large BytesIO object - # and we are not in the first iteration - # of the loop - await asyncio.sleep(0) - if remaining_bytes is None: - await writer.write(chunk) - else: - await writer.write(chunk[:remaining_bytes]) - remaining_bytes -= len(chunk) - if remaining_bytes <= 0: - return - loop_count += 1 - - async def as_bytes(self, encoding: str = "utf-8", errors: str = "strict") -> bytes: - """ - Return bytes representation of the value. - - This method reads the entire BytesIO content and returns it as bytes. - It is equivalent to accessing the _value attribute directly. - """ - self._set_or_restore_start_position() - return self._value.read() - - async def close(self) -> None: - """ - Close the BytesIO payload. - - This does nothing since BytesIO is in-memory and does not require explicit closing. - """ - - -class BufferedReaderPayload(IOBasePayload): - _value: io.BufferedIOBase - # _autoclose = False (inherited) - Has buffered file handle that needs explicit closing - - def decode(self, encoding: str = "utf-8", errors: str = "strict") -> str: - self._set_or_restore_start_position() - return self._value.read().decode(encoding, errors) - - -class JsonPayload(BytesPayload): - def __init__( - self, - value: Any, - encoding: str = "utf-8", - content_type: str = "application/json", - dumps: JSONEncoder = json.dumps, - *args: Any, - **kwargs: Any, - ) -> None: - - super().__init__( - dumps(value).encode(encoding), - content_type=content_type, - encoding=encoding, - *args, - **kwargs, - ) - - -if TYPE_CHECKING: - from typing import AsyncIterable, AsyncIterator - - _AsyncIterator = AsyncIterator[bytes] - _AsyncIterable = AsyncIterable[bytes] -else: - from collections.abc import AsyncIterable, AsyncIterator - - _AsyncIterator = AsyncIterator - _AsyncIterable = AsyncIterable - - -class AsyncIterablePayload(Payload): - - _iter: Optional[_AsyncIterator] = None - _value: _AsyncIterable - _cached_chunks: Optional[List[bytes]] = None - # _consumed stays False to allow reuse with cached content - _autoclose = True # Iterator doesn't need explicit closing - - def __init__(self, value: _AsyncIterable, *args: Any, **kwargs: Any) -> None: - if not isinstance(value, AsyncIterable): - raise TypeError( - "value argument must support " - "collections.abc.AsyncIterable interface, " - "got {!r}".format(type(value)) - ) - - if "content_type" not in kwargs: - kwargs["content_type"] = "application/octet-stream" - - super().__init__(value, *args, **kwargs) - - self._iter = value.__aiter__() - - async def write(self, writer: AbstractStreamWriter) -> None: - """ - Write the entire async iterable payload to the writer stream. - - Args: - writer: An AbstractStreamWriter instance that handles the actual writing - - This method iterates through the async iterable and writes each chunk - to the writer without any length constraint. - - Note: - For new implementations that need length control, use write_with_length() directly. - This method is maintained for backwards compatibility with existing code. - - """ - await self.write_with_length(writer, None) - - async def write_with_length( - self, writer: AbstractStreamWriter, content_length: Optional[int] - ) -> None: - """ - Write async iterable payload with a specific content length constraint. - - Args: - writer: An AbstractStreamWriter instance that handles the actual writing - content_length: Maximum number of bytes to write (None for unlimited) - - This implementation handles streaming of async iterable content with length constraints: - - 1. If cached chunks are available, writes from them - 2. Otherwise iterates through the async iterable one chunk at a time - 3. Respects content_length constraints when specified - 4. Does NOT generate cache - that's done by as_bytes() - - """ - # If we have cached chunks, use them - if self._cached_chunks is not None: - remaining_bytes = content_length - for chunk in self._cached_chunks: - if remaining_bytes is None: - await writer.write(chunk) - elif remaining_bytes > 0: - await writer.write(chunk[:remaining_bytes]) - remaining_bytes -= len(chunk) - else: - break - return - - # If iterator is exhausted and we don't have cached chunks, nothing to write - if self._iter is None: - return - - # Stream from the iterator - remaining_bytes = content_length - - try: - while True: - if sys.version_info >= (3, 10): - chunk = await anext(self._iter) - else: - chunk = await self._iter.__anext__() - if remaining_bytes is None: - await writer.write(chunk) - # If we have a content length limit - elif remaining_bytes > 0: - await writer.write(chunk[:remaining_bytes]) - remaining_bytes -= len(chunk) - # We still want to exhaust the iterator even - # if we have reached the content length limit - # since the file handle may not get closed by - # the iterator if we don't do this - except StopAsyncIteration: - # Iterator is exhausted - self._iter = None - self._consumed = True # Mark as consumed when streamed without caching - - def decode(self, encoding: str = "utf-8", errors: str = "strict") -> str: - """Decode the payload content as a string if cached chunks are available.""" - if self._cached_chunks is not None: - return b"".join(self._cached_chunks).decode(encoding, errors) - raise TypeError("Unable to decode - content not cached. Call as_bytes() first.") - - async def as_bytes(self, encoding: str = "utf-8", errors: str = "strict") -> bytes: - """ - Return bytes representation of the value. - - This method reads the entire async iterable content and returns it as bytes. - It generates and caches the chunks for future reuse. - """ - # If we have cached chunks, return them joined - if self._cached_chunks is not None: - return b"".join(self._cached_chunks) - - # If iterator is exhausted and no cache, return empty - if self._iter is None: - return b"" - - # Read all chunks and cache them - chunks: List[bytes] = [] - async for chunk in self._iter: - chunks.append(chunk) - - # Iterator is exhausted, cache the chunks - self._iter = None - self._cached_chunks = chunks - # Keep _consumed as False to allow reuse with cached chunks - - return b"".join(chunks) - - -class StreamReaderPayload(AsyncIterablePayload): - def __init__(self, value: StreamReader, *args: Any, **kwargs: Any) -> None: - super().__init__(value.iter_any(), *args, **kwargs) - - -PAYLOAD_REGISTRY = PayloadRegistry() -PAYLOAD_REGISTRY.register(BytesPayload, (bytes, bytearray, memoryview)) -PAYLOAD_REGISTRY.register(StringPayload, str) -PAYLOAD_REGISTRY.register(StringIOPayload, io.StringIO) -PAYLOAD_REGISTRY.register(TextIOPayload, io.TextIOBase) -PAYLOAD_REGISTRY.register(BytesIOPayload, io.BytesIO) -PAYLOAD_REGISTRY.register(BufferedReaderPayload, (io.BufferedReader, io.BufferedRandom)) -PAYLOAD_REGISTRY.register(IOBasePayload, io.IOBase) -PAYLOAD_REGISTRY.register(StreamReaderPayload, StreamReader) -# try_last for giving a chance to more specialized async interables like -# multipart.BodyPartReaderPayload override the default -PAYLOAD_REGISTRY.register(AsyncIterablePayload, AsyncIterable, order=Order.try_last) diff --git a/venv/lib/python3.12/site-packages/aiohttp/payload_streamer.py b/venv/lib/python3.12/site-packages/aiohttp/payload_streamer.py deleted file mode 100644 index 831fdc0..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/payload_streamer.py +++ /dev/null @@ -1,78 +0,0 @@ -""" -Payload implementation for coroutines as data provider. - -As a simple case, you can upload data from file:: - - @aiohttp.streamer - async def file_sender(writer, file_name=None): - with open(file_name, 'rb') as f: - chunk = f.read(2**16) - while chunk: - await writer.write(chunk) - - chunk = f.read(2**16) - -Then you can use `file_sender` like this: - - async with session.post('http://httpbin.org/post', - data=file_sender(file_name='huge_file')) as resp: - print(await resp.text()) - -..note:: Coroutine must accept `writer` as first argument - -""" - -import types -import warnings -from typing import Any, Awaitable, Callable, Dict, Tuple - -from .abc import AbstractStreamWriter -from .payload import Payload, payload_type - -__all__ = ("streamer",) - - -class _stream_wrapper: - def __init__( - self, - coro: Callable[..., Awaitable[None]], - args: Tuple[Any, ...], - kwargs: Dict[str, Any], - ) -> None: - self.coro = types.coroutine(coro) - self.args = args - self.kwargs = kwargs - - async def __call__(self, writer: AbstractStreamWriter) -> None: - await self.coro(writer, *self.args, **self.kwargs) - - -class streamer: - def __init__(self, coro: Callable[..., Awaitable[None]]) -> None: - warnings.warn( - "@streamer is deprecated, use async generators instead", - DeprecationWarning, - stacklevel=2, - ) - self.coro = coro - - def __call__(self, *args: Any, **kwargs: Any) -> _stream_wrapper: - return _stream_wrapper(self.coro, args, kwargs) - - -@payload_type(_stream_wrapper) -class StreamWrapperPayload(Payload): - async def write(self, writer: AbstractStreamWriter) -> None: - await self._value(writer) - - def decode(self, encoding: str = "utf-8", errors: str = "strict") -> str: - raise TypeError("Unable to decode.") - - -@payload_type(streamer) -class StreamPayload(StreamWrapperPayload): - def __init__(self, value: Any, *args: Any, **kwargs: Any) -> None: - super().__init__(value(), *args, **kwargs) - - async def write(self, writer: AbstractStreamWriter) -> None: - await self._value(writer) diff --git a/venv/lib/python3.12/site-packages/aiohttp/py.typed b/venv/lib/python3.12/site-packages/aiohttp/py.typed deleted file mode 100644 index f5642f7..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/py.typed +++ /dev/null @@ -1 +0,0 @@ -Marker diff --git a/venv/lib/python3.12/site-packages/aiohttp/pytest_plugin.py b/venv/lib/python3.12/site-packages/aiohttp/pytest_plugin.py deleted file mode 100644 index 7d59fe8..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/pytest_plugin.py +++ /dev/null @@ -1,444 +0,0 @@ -import asyncio -import contextlib -import inspect -import warnings -from typing import ( - Any, - Awaitable, - Callable, - Dict, - Iterator, - Optional, - Protocol, - Union, - overload, -) - -import pytest - -from .test_utils import ( - BaseTestServer, - RawTestServer, - TestClient, - TestServer, - loop_context, - setup_test_loop, - teardown_test_loop, - unused_port as _unused_port, -) -from .web import Application, BaseRequest, Request -from .web_protocol import _RequestHandler - -try: - import uvloop -except ImportError: # pragma: no cover - uvloop = None # type: ignore[assignment] - - -class AiohttpClient(Protocol): - @overload - async def __call__( - self, - __param: Application, - *, - server_kwargs: Optional[Dict[str, Any]] = None, - **kwargs: Any, - ) -> TestClient[Request, Application]: ... - @overload - async def __call__( - self, - __param: BaseTestServer, - *, - server_kwargs: Optional[Dict[str, Any]] = None, - **kwargs: Any, - ) -> TestClient[BaseRequest, None]: ... - - -class AiohttpServer(Protocol): - def __call__( - self, app: Application, *, port: Optional[int] = None, **kwargs: Any - ) -> Awaitable[TestServer]: ... - - -class AiohttpRawServer(Protocol): - def __call__( - self, handler: _RequestHandler, *, port: Optional[int] = None, **kwargs: Any - ) -> Awaitable[RawTestServer]: ... - - -def pytest_addoption(parser): # type: ignore[no-untyped-def] - parser.addoption( - "--aiohttp-fast", - action="store_true", - default=False, - help="run tests faster by disabling extra checks", - ) - parser.addoption( - "--aiohttp-loop", - action="store", - default="pyloop", - help="run tests with specific loop: pyloop, uvloop or all", - ) - parser.addoption( - "--aiohttp-enable-loop-debug", - action="store_true", - default=False, - help="enable event loop debug mode", - ) - - -def pytest_fixture_setup(fixturedef): # type: ignore[no-untyped-def] - """Set up pytest fixture. - - Allow fixtures to be coroutines. Run coroutine fixtures in an event loop. - """ - func = fixturedef.func - - if inspect.isasyncgenfunction(func): - # async generator fixture - is_async_gen = True - elif inspect.iscoroutinefunction(func): - # regular async fixture - is_async_gen = False - else: - # not an async fixture, nothing to do - return - - strip_request = False - if "request" not in fixturedef.argnames: - fixturedef.argnames += ("request",) - strip_request = True - - def wrapper(*args, **kwargs): # type: ignore[no-untyped-def] - request = kwargs["request"] - if strip_request: - del kwargs["request"] - - # if neither the fixture nor the test use the 'loop' fixture, - # 'getfixturevalue' will fail because the test is not parameterized - # (this can be removed someday if 'loop' is no longer parameterized) - if "loop" not in request.fixturenames: - raise Exception( - "Asynchronous fixtures must depend on the 'loop' fixture or " - "be used in tests depending from it." - ) - - _loop = request.getfixturevalue("loop") - - if is_async_gen: - # for async generators, we need to advance the generator once, - # then advance it again in a finalizer - gen = func(*args, **kwargs) - - def finalizer(): # type: ignore[no-untyped-def] - try: - return _loop.run_until_complete(gen.__anext__()) - except StopAsyncIteration: - pass - - request.addfinalizer(finalizer) - return _loop.run_until_complete(gen.__anext__()) - else: - return _loop.run_until_complete(func(*args, **kwargs)) - - fixturedef.func = wrapper - - -@pytest.fixture -def fast(request): # type: ignore[no-untyped-def] - """--fast config option""" - return request.config.getoption("--aiohttp-fast") - - -@pytest.fixture -def loop_debug(request): # type: ignore[no-untyped-def] - """--enable-loop-debug config option""" - return request.config.getoption("--aiohttp-enable-loop-debug") - - -@contextlib.contextmanager -def _runtime_warning_context(): # type: ignore[no-untyped-def] - """Context manager which checks for RuntimeWarnings. - - This exists specifically to - avoid "coroutine 'X' was never awaited" warnings being missed. - - If RuntimeWarnings occur in the context a RuntimeError is raised. - """ - with warnings.catch_warnings(record=True) as _warnings: - yield - rw = [ - "{w.filename}:{w.lineno}:{w.message}".format(w=w) - for w in _warnings - if w.category == RuntimeWarning - ] - if rw: - raise RuntimeError( - "{} Runtime Warning{},\n{}".format( - len(rw), "" if len(rw) == 1 else "s", "\n".join(rw) - ) - ) - - -@contextlib.contextmanager -def _passthrough_loop_context(loop, fast=False): # type: ignore[no-untyped-def] - """Passthrough loop context. - - Sets up and tears down a loop unless one is passed in via the loop - argument when it's passed straight through. - """ - if loop: - # loop already exists, pass it straight through - yield loop - else: - # this shadows loop_context's standard behavior - loop = setup_test_loop() - yield loop - teardown_test_loop(loop, fast=fast) - - -def pytest_pycollect_makeitem(collector, name, obj): # type: ignore[no-untyped-def] - """Fix pytest collecting for coroutines.""" - if collector.funcnamefilter(name) and inspect.iscoroutinefunction(obj): - return list(collector._genfunctions(name, obj)) - - -def pytest_pyfunc_call(pyfuncitem): # type: ignore[no-untyped-def] - """Run coroutines in an event loop instead of a normal function call.""" - fast = pyfuncitem.config.getoption("--aiohttp-fast") - if inspect.iscoroutinefunction(pyfuncitem.function): - existing_loop = ( - pyfuncitem.funcargs.get("proactor_loop") - or pyfuncitem.funcargs.get("selector_loop") - or pyfuncitem.funcargs.get("uvloop_loop") - or pyfuncitem.funcargs.get("loop", None) - ) - - with _runtime_warning_context(): - with _passthrough_loop_context(existing_loop, fast=fast) as _loop: - testargs = { - arg: pyfuncitem.funcargs[arg] - for arg in pyfuncitem._fixtureinfo.argnames - } - _loop.run_until_complete(pyfuncitem.obj(**testargs)) - - return True - - -def pytest_generate_tests(metafunc): # type: ignore[no-untyped-def] - if "loop_factory" not in metafunc.fixturenames: - return - - loops = metafunc.config.option.aiohttp_loop - avail_factories: dict[str, Callable[[], asyncio.AbstractEventLoop]] - avail_factories = {"pyloop": asyncio.new_event_loop} - - if uvloop is not None: # pragma: no cover - avail_factories["uvloop"] = uvloop.new_event_loop - - if loops == "all": - loops = "pyloop,uvloop?" - - factories = {} # type: ignore[var-annotated] - for name in loops.split(","): - required = not name.endswith("?") - name = name.strip(" ?") - if name not in avail_factories: # pragma: no cover - if required: - raise ValueError( - "Unknown loop '%s', available loops: %s" - % (name, list(factories.keys())) - ) - else: - continue - factories[name] = avail_factories[name] - metafunc.parametrize( - "loop_factory", list(factories.values()), ids=list(factories.keys()) - ) - - -@pytest.fixture -def loop( - loop_factory: Callable[[], asyncio.AbstractEventLoop], - fast: bool, - loop_debug: bool, -) -> Iterator[asyncio.AbstractEventLoop]: - """Return an instance of the event loop.""" - with loop_context(loop_factory, fast=fast) as _loop: - if loop_debug: - _loop.set_debug(True) # pragma: no cover - asyncio.set_event_loop(_loop) - yield _loop - - -@pytest.fixture -def proactor_loop() -> Iterator[asyncio.AbstractEventLoop]: - factory = asyncio.ProactorEventLoop # type: ignore[attr-defined] - - with loop_context(factory) as _loop: - asyncio.set_event_loop(_loop) - yield _loop - - -@pytest.fixture -def unused_port(aiohttp_unused_port: Callable[[], int]) -> Callable[[], int]: - warnings.warn( - "Deprecated, use aiohttp_unused_port fixture instead", - DeprecationWarning, - stacklevel=2, - ) - return aiohttp_unused_port - - -@pytest.fixture -def aiohttp_unused_port() -> Callable[[], int]: - """Return a port that is unused on the current host.""" - return _unused_port - - -@pytest.fixture -def aiohttp_server(loop: asyncio.AbstractEventLoop) -> Iterator[AiohttpServer]: - """Factory to create a TestServer instance, given an app. - - aiohttp_server(app, **kwargs) - """ - servers = [] - - async def go( - app: Application, - *, - host: str = "127.0.0.1", - port: Optional[int] = None, - **kwargs: Any, - ) -> TestServer: - server = TestServer(app, host=host, port=port) - await server.start_server(loop=loop, **kwargs) - servers.append(server) - return server - - yield go - - async def finalize() -> None: - while servers: - await servers.pop().close() - - loop.run_until_complete(finalize()) - - -@pytest.fixture -def test_server(aiohttp_server): # type: ignore[no-untyped-def] # pragma: no cover - warnings.warn( - "Deprecated, use aiohttp_server fixture instead", - DeprecationWarning, - stacklevel=2, - ) - return aiohttp_server - - -@pytest.fixture -def aiohttp_raw_server(loop: asyncio.AbstractEventLoop) -> Iterator[AiohttpRawServer]: - """Factory to create a RawTestServer instance, given a web handler. - - aiohttp_raw_server(handler, **kwargs) - """ - servers = [] - - async def go( - handler: _RequestHandler, *, port: Optional[int] = None, **kwargs: Any - ) -> RawTestServer: - server = RawTestServer(handler, port=port) - await server.start_server(loop=loop, **kwargs) - servers.append(server) - return server - - yield go - - async def finalize() -> None: - while servers: - await servers.pop().close() - - loop.run_until_complete(finalize()) - - -@pytest.fixture -def raw_test_server( # type: ignore[no-untyped-def] # pragma: no cover - aiohttp_raw_server, -): - warnings.warn( - "Deprecated, use aiohttp_raw_server fixture instead", - DeprecationWarning, - stacklevel=2, - ) - return aiohttp_raw_server - - -@pytest.fixture -def aiohttp_client(loop: asyncio.AbstractEventLoop) -> Iterator[AiohttpClient]: - """Factory to create a TestClient instance. - - aiohttp_client(app, **kwargs) - aiohttp_client(server, **kwargs) - aiohttp_client(raw_server, **kwargs) - """ - clients = [] - - @overload - async def go( - __param: Application, - *, - server_kwargs: Optional[Dict[str, Any]] = None, - **kwargs: Any, - ) -> TestClient[Request, Application]: ... - - @overload - async def go( - __param: BaseTestServer, - *, - server_kwargs: Optional[Dict[str, Any]] = None, - **kwargs: Any, - ) -> TestClient[BaseRequest, None]: ... - - async def go( - __param: Union[Application, BaseTestServer], - *args: Any, - server_kwargs: Optional[Dict[str, Any]] = None, - **kwargs: Any, - ) -> TestClient[Any, Any]: - if isinstance(__param, Callable) and not isinstance( # type: ignore[arg-type] - __param, (Application, BaseTestServer) - ): - __param = __param(loop, *args, **kwargs) - kwargs = {} - else: - assert not args, "args should be empty" - - if isinstance(__param, Application): - server_kwargs = server_kwargs or {} - server = TestServer(__param, loop=loop, **server_kwargs) - client = TestClient(server, loop=loop, **kwargs) - elif isinstance(__param, BaseTestServer): - client = TestClient(__param, loop=loop, **kwargs) - else: - raise ValueError("Unknown argument type: %r" % type(__param)) - - await client.start_server() - clients.append(client) - return client - - yield go - - async def finalize() -> None: - while clients: - await clients.pop().close() - - loop.run_until_complete(finalize()) - - -@pytest.fixture -def test_client(aiohttp_client): # type: ignore[no-untyped-def] # pragma: no cover - warnings.warn( - "Deprecated, use aiohttp_client fixture instead", - DeprecationWarning, - stacklevel=2, - ) - return aiohttp_client diff --git a/venv/lib/python3.12/site-packages/aiohttp/resolver.py b/venv/lib/python3.12/site-packages/aiohttp/resolver.py deleted file mode 100644 index b20e567..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/resolver.py +++ /dev/null @@ -1,274 +0,0 @@ -import asyncio -import socket -import weakref -from typing import Any, Dict, Final, List, Optional, Tuple, Type, Union - -from .abc import AbstractResolver, ResolveResult - -__all__ = ("ThreadedResolver", "AsyncResolver", "DefaultResolver") - - -try: - import aiodns - - aiodns_default = hasattr(aiodns.DNSResolver, "getaddrinfo") -except ImportError: # pragma: no cover - aiodns = None # type: ignore[assignment] - aiodns_default = False - - -_NUMERIC_SOCKET_FLAGS = socket.AI_NUMERICHOST | socket.AI_NUMERICSERV -_NAME_SOCKET_FLAGS = socket.NI_NUMERICHOST | socket.NI_NUMERICSERV -_AI_ADDRCONFIG = socket.AI_ADDRCONFIG -if hasattr(socket, "AI_MASK"): - _AI_ADDRCONFIG &= socket.AI_MASK - - -class ThreadedResolver(AbstractResolver): - """Threaded resolver. - - Uses an Executor for synchronous getaddrinfo() calls. - concurrent.futures.ThreadPoolExecutor is used by default. - """ - - def __init__(self, loop: Optional[asyncio.AbstractEventLoop] = None) -> None: - self._loop = loop or asyncio.get_running_loop() - - async def resolve( - self, host: str, port: int = 0, family: socket.AddressFamily = socket.AF_INET - ) -> List[ResolveResult]: - infos = await self._loop.getaddrinfo( - host, - port, - type=socket.SOCK_STREAM, - family=family, - flags=_AI_ADDRCONFIG, - ) - - hosts: List[ResolveResult] = [] - for family, _, proto, _, address in infos: - if family == socket.AF_INET6: - if len(address) < 3: - # IPv6 is not supported by Python build, - # or IPv6 is not enabled in the host - continue - if address[3]: - # This is essential for link-local IPv6 addresses. - # LL IPv6 is a VERY rare case. Strictly speaking, we should use - # getnameinfo() unconditionally, but performance makes sense. - resolved_host, _port = await self._loop.getnameinfo( - address, _NAME_SOCKET_FLAGS - ) - port = int(_port) - else: - resolved_host, port = address[:2] - else: # IPv4 - assert family == socket.AF_INET - resolved_host, port = address # type: ignore[misc] - hosts.append( - ResolveResult( - hostname=host, - host=resolved_host, - port=port, - family=family, - proto=proto, - flags=_NUMERIC_SOCKET_FLAGS, - ) - ) - - return hosts - - async def close(self) -> None: - pass - - -class AsyncResolver(AbstractResolver): - """Use the `aiodns` package to make asynchronous DNS lookups""" - - def __init__( - self, - loop: Optional[asyncio.AbstractEventLoop] = None, - *args: Any, - **kwargs: Any, - ) -> None: - if aiodns is None: - raise RuntimeError("Resolver requires aiodns library") - - self._loop = loop or asyncio.get_running_loop() - self._manager: Optional[_DNSResolverManager] = None - # If custom args are provided, create a dedicated resolver instance - # This means each AsyncResolver with custom args gets its own - # aiodns.DNSResolver instance - if args or kwargs: - self._resolver = aiodns.DNSResolver(*args, **kwargs) - return - # Use the shared resolver from the manager for default arguments - self._manager = _DNSResolverManager() - self._resolver = self._manager.get_resolver(self, self._loop) - - if not hasattr(self._resolver, "gethostbyname"): - # aiodns 1.1 is not available, fallback to DNSResolver.query - self.resolve = self._resolve_with_query # type: ignore - - async def resolve( - self, host: str, port: int = 0, family: socket.AddressFamily = socket.AF_INET - ) -> List[ResolveResult]: - try: - resp = await self._resolver.getaddrinfo( - host, - port=port, - type=socket.SOCK_STREAM, - family=family, - flags=_AI_ADDRCONFIG, - ) - except aiodns.error.DNSError as exc: - msg = exc.args[1] if len(exc.args) >= 1 else "DNS lookup failed" - raise OSError(None, msg) from exc - hosts: List[ResolveResult] = [] - for node in resp.nodes: - address: Union[Tuple[bytes, int], Tuple[bytes, int, int, int]] = node.addr - family = node.family - if family == socket.AF_INET6: - if len(address) > 3 and address[3]: - # This is essential for link-local IPv6 addresses. - # LL IPv6 is a VERY rare case. Strictly speaking, we should use - # getnameinfo() unconditionally, but performance makes sense. - result = await self._resolver.getnameinfo( - (address[0].decode("ascii"), *address[1:]), - _NAME_SOCKET_FLAGS, - ) - resolved_host = result.node - else: - resolved_host = address[0].decode("ascii") - port = address[1] - else: # IPv4 - assert family == socket.AF_INET - resolved_host = address[0].decode("ascii") - port = address[1] - hosts.append( - ResolveResult( - hostname=host, - host=resolved_host, - port=port, - family=family, - proto=0, - flags=_NUMERIC_SOCKET_FLAGS, - ) - ) - - if not hosts: - raise OSError(None, "DNS lookup failed") - - return hosts - - async def _resolve_with_query( - self, host: str, port: int = 0, family: int = socket.AF_INET - ) -> List[Dict[str, Any]]: - qtype: Final = "AAAA" if family == socket.AF_INET6 else "A" - - try: - resp = await self._resolver.query(host, qtype) - except aiodns.error.DNSError as exc: - msg = exc.args[1] if len(exc.args) >= 1 else "DNS lookup failed" - raise OSError(None, msg) from exc - - hosts = [] - for rr in resp: - hosts.append( - { - "hostname": host, - "host": rr.host, - "port": port, - "family": family, - "proto": 0, - "flags": socket.AI_NUMERICHOST, - } - ) - - if not hosts: - raise OSError(None, "DNS lookup failed") - - return hosts - - async def close(self) -> None: - if self._manager: - # Release the resolver from the manager if using the shared resolver - self._manager.release_resolver(self, self._loop) - self._manager = None # Clear reference to manager - self._resolver = None # type: ignore[assignment] # Clear reference to resolver - return - # Otherwise cancel our dedicated resolver - if self._resolver is not None: - self._resolver.cancel() - self._resolver = None # type: ignore[assignment] # Clear reference - - -class _DNSResolverManager: - """Manager for aiodns.DNSResolver objects. - - This class manages shared aiodns.DNSResolver instances - with no custom arguments across different event loops. - """ - - _instance: Optional["_DNSResolverManager"] = None - - def __new__(cls) -> "_DNSResolverManager": - if cls._instance is None: - cls._instance = super().__new__(cls) - cls._instance._init() - return cls._instance - - def _init(self) -> None: - # Use WeakKeyDictionary to allow event loops to be garbage collected - self._loop_data: weakref.WeakKeyDictionary[ - asyncio.AbstractEventLoop, - tuple["aiodns.DNSResolver", weakref.WeakSet["AsyncResolver"]], - ] = weakref.WeakKeyDictionary() - - def get_resolver( - self, client: "AsyncResolver", loop: asyncio.AbstractEventLoop - ) -> "aiodns.DNSResolver": - """Get or create the shared aiodns.DNSResolver instance for a specific event loop. - - Args: - client: The AsyncResolver instance requesting the resolver. - This is required to track resolver usage. - loop: The event loop to use for the resolver. - """ - # Create a new resolver and client set for this loop if it doesn't exist - if loop not in self._loop_data: - resolver = aiodns.DNSResolver(loop=loop) - client_set: weakref.WeakSet["AsyncResolver"] = weakref.WeakSet() - self._loop_data[loop] = (resolver, client_set) - else: - # Get the existing resolver and client set - resolver, client_set = self._loop_data[loop] - - # Register this client with the loop - client_set.add(client) - return resolver - - def release_resolver( - self, client: "AsyncResolver", loop: asyncio.AbstractEventLoop - ) -> None: - """Release the resolver for an AsyncResolver client when it's closed. - - Args: - client: The AsyncResolver instance to release. - loop: The event loop the resolver was using. - """ - # Remove client from its loop's tracking - current_loop_data = self._loop_data.get(loop) - if current_loop_data is None: - return - resolver, client_set = current_loop_data - client_set.discard(client) - # If no more clients for this loop, cancel and remove its resolver - if not client_set: - if resolver is not None: - resolver.cancel() - del self._loop_data[loop] - - -_DefaultType = Type[Union[AsyncResolver, ThreadedResolver]] -DefaultResolver: _DefaultType = AsyncResolver if aiodns_default else ThreadedResolver diff --git a/venv/lib/python3.12/site-packages/aiohttp/streams.py b/venv/lib/python3.12/site-packages/aiohttp/streams.py deleted file mode 100644 index 7a3f64d..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/streams.py +++ /dev/null @@ -1,727 +0,0 @@ -import asyncio -import collections -import warnings -from typing import ( - Awaitable, - Callable, - Deque, - Final, - Generic, - List, - Optional, - Tuple, - TypeVar, -) - -from .base_protocol import BaseProtocol -from .helpers import ( - _EXC_SENTINEL, - BaseTimerContext, - TimerNoop, - set_exception, - set_result, -) -from .log import internal_logger - -__all__ = ( - "EMPTY_PAYLOAD", - "EofStream", - "StreamReader", - "DataQueue", -) - -_T = TypeVar("_T") - - -class EofStream(Exception): - """eof stream indication.""" - - -class AsyncStreamIterator(Generic[_T]): - - __slots__ = ("read_func",) - - def __init__(self, read_func: Callable[[], Awaitable[_T]]) -> None: - self.read_func = read_func - - def __aiter__(self) -> "AsyncStreamIterator[_T]": - return self - - async def __anext__(self) -> _T: - try: - rv = await self.read_func() - except EofStream: - raise StopAsyncIteration - if rv == b"": - raise StopAsyncIteration - return rv - - -class ChunkTupleAsyncStreamIterator: - - __slots__ = ("_stream",) - - def __init__(self, stream: "StreamReader") -> None: - self._stream = stream - - def __aiter__(self) -> "ChunkTupleAsyncStreamIterator": - return self - - async def __anext__(self) -> Tuple[bytes, bool]: - rv = await self._stream.readchunk() - if rv == (b"", False): - raise StopAsyncIteration - return rv - - -class AsyncStreamReaderMixin: - - __slots__ = () - - def __aiter__(self) -> AsyncStreamIterator[bytes]: - return AsyncStreamIterator(self.readline) # type: ignore[attr-defined] - - def iter_chunked(self, n: int) -> AsyncStreamIterator[bytes]: - """Returns an asynchronous iterator that yields chunks of size n.""" - return AsyncStreamIterator(lambda: self.read(n)) # type: ignore[attr-defined] - - def iter_any(self) -> AsyncStreamIterator[bytes]: - """Yield all available data as soon as it is received.""" - return AsyncStreamIterator(self.readany) # type: ignore[attr-defined] - - def iter_chunks(self) -> ChunkTupleAsyncStreamIterator: - """Yield chunks of data as they are received by the server. - - The yielded objects are tuples - of (bytes, bool) as returned by the StreamReader.readchunk method. - """ - return ChunkTupleAsyncStreamIterator(self) # type: ignore[arg-type] - - -class StreamReader(AsyncStreamReaderMixin): - """An enhancement of asyncio.StreamReader. - - Supports asynchronous iteration by line, chunk or as available:: - - async for line in reader: - ... - async for chunk in reader.iter_chunked(1024): - ... - async for slice in reader.iter_any(): - ... - - """ - - __slots__ = ( - "_protocol", - "_low_water", - "_high_water", - "_loop", - "_size", - "_cursor", - "_http_chunk_splits", - "_buffer", - "_buffer_offset", - "_eof", - "_waiter", - "_eof_waiter", - "_exception", - "_timer", - "_eof_callbacks", - "_eof_counter", - "total_bytes", - ) - - def __init__( - self, - protocol: BaseProtocol, - limit: int, - *, - timer: Optional[BaseTimerContext] = None, - loop: Optional[asyncio.AbstractEventLoop] = None, - ) -> None: - self._protocol = protocol - self._low_water = limit - self._high_water = limit * 2 - if loop is None: - loop = asyncio.get_event_loop() - self._loop = loop - self._size = 0 - self._cursor = 0 - self._http_chunk_splits: Optional[List[int]] = None - self._buffer: Deque[bytes] = collections.deque() - self._buffer_offset = 0 - self._eof = False - self._waiter: Optional[asyncio.Future[None]] = None - self._eof_waiter: Optional[asyncio.Future[None]] = None - self._exception: Optional[BaseException] = None - self._timer = TimerNoop() if timer is None else timer - self._eof_callbacks: List[Callable[[], None]] = [] - self._eof_counter = 0 - self.total_bytes = 0 - - def __repr__(self) -> str: - info = [self.__class__.__name__] - if self._size: - info.append("%d bytes" % self._size) - if self._eof: - info.append("eof") - if self._low_water != 2**16: # default limit - info.append("low=%d high=%d" % (self._low_water, self._high_water)) - if self._waiter: - info.append("w=%r" % self._waiter) - if self._exception: - info.append("e=%r" % self._exception) - return "<%s>" % " ".join(info) - - def get_read_buffer_limits(self) -> Tuple[int, int]: - return (self._low_water, self._high_water) - - def exception(self) -> Optional[BaseException]: - return self._exception - - def set_exception( - self, - exc: BaseException, - exc_cause: BaseException = _EXC_SENTINEL, - ) -> None: - self._exception = exc - self._eof_callbacks.clear() - - waiter = self._waiter - if waiter is not None: - self._waiter = None - set_exception(waiter, exc, exc_cause) - - waiter = self._eof_waiter - if waiter is not None: - self._eof_waiter = None - set_exception(waiter, exc, exc_cause) - - def on_eof(self, callback: Callable[[], None]) -> None: - if self._eof: - try: - callback() - except Exception: - internal_logger.exception("Exception in eof callback") - else: - self._eof_callbacks.append(callback) - - def feed_eof(self) -> None: - self._eof = True - - waiter = self._waiter - if waiter is not None: - self._waiter = None - set_result(waiter, None) - - waiter = self._eof_waiter - if waiter is not None: - self._eof_waiter = None - set_result(waiter, None) - - if self._protocol._reading_paused: - self._protocol.resume_reading() - - for cb in self._eof_callbacks: - try: - cb() - except Exception: - internal_logger.exception("Exception in eof callback") - - self._eof_callbacks.clear() - - def is_eof(self) -> bool: - """Return True if 'feed_eof' was called.""" - return self._eof - - def at_eof(self) -> bool: - """Return True if the buffer is empty and 'feed_eof' was called.""" - return self._eof and not self._buffer - - async def wait_eof(self) -> None: - if self._eof: - return - - assert self._eof_waiter is None - self._eof_waiter = self._loop.create_future() - try: - await self._eof_waiter - finally: - self._eof_waiter = None - - def unread_data(self, data: bytes) -> None: - """rollback reading some data from stream, inserting it to buffer head.""" - warnings.warn( - "unread_data() is deprecated " - "and will be removed in future releases (#3260)", - DeprecationWarning, - stacklevel=2, - ) - if not data: - return - - if self._buffer_offset: - self._buffer[0] = self._buffer[0][self._buffer_offset :] - self._buffer_offset = 0 - self._size += len(data) - self._cursor -= len(data) - self._buffer.appendleft(data) - self._eof_counter = 0 - - # TODO: size is ignored, remove the param later - def feed_data(self, data: bytes, size: int = 0) -> None: - assert not self._eof, "feed_data after feed_eof" - - if not data: - return - - data_len = len(data) - self._size += data_len - self._buffer.append(data) - self.total_bytes += data_len - - waiter = self._waiter - if waiter is not None: - self._waiter = None - set_result(waiter, None) - - if self._size > self._high_water and not self._protocol._reading_paused: - self._protocol.pause_reading() - - def begin_http_chunk_receiving(self) -> None: - if self._http_chunk_splits is None: - if self.total_bytes: - raise RuntimeError( - "Called begin_http_chunk_receiving when some data was already fed" - ) - self._http_chunk_splits = [] - - def end_http_chunk_receiving(self) -> None: - if self._http_chunk_splits is None: - raise RuntimeError( - "Called end_chunk_receiving without calling " - "begin_chunk_receiving first" - ) - - # self._http_chunk_splits contains logical byte offsets from start of - # the body transfer. Each offset is the offset of the end of a chunk. - # "Logical" means bytes, accessible for a user. - # If no chunks containing logical data were received, current position - # is difinitely zero. - pos = self._http_chunk_splits[-1] if self._http_chunk_splits else 0 - - if self.total_bytes == pos: - # We should not add empty chunks here. So we check for that. - # Note, when chunked + gzip is used, we can receive a chunk - # of compressed data, but that data may not be enough for gzip FSM - # to yield any uncompressed data. That's why current position may - # not change after receiving a chunk. - return - - self._http_chunk_splits.append(self.total_bytes) - - # wake up readchunk when end of http chunk received - waiter = self._waiter - if waiter is not None: - self._waiter = None - set_result(waiter, None) - - async def _wait(self, func_name: str) -> None: - if not self._protocol.connected: - raise RuntimeError("Connection closed.") - - # StreamReader uses a future to link the protocol feed_data() method - # to a read coroutine. Running two read coroutines at the same time - # would have an unexpected behaviour. It would not possible to know - # which coroutine would get the next data. - if self._waiter is not None: - raise RuntimeError( - "%s() called while another coroutine is " - "already waiting for incoming data" % func_name - ) - - waiter = self._waiter = self._loop.create_future() - try: - with self._timer: - await waiter - finally: - self._waiter = None - - async def readline(self) -> bytes: - return await self.readuntil() - - async def readuntil(self, separator: bytes = b"\n") -> bytes: - seplen = len(separator) - if seplen == 0: - raise ValueError("Separator should be at least one-byte string") - - if self._exception is not None: - raise self._exception - - chunk = b"" - chunk_size = 0 - not_enough = True - - while not_enough: - while self._buffer and not_enough: - offset = self._buffer_offset - ichar = self._buffer[0].find(separator, offset) + 1 - # Read from current offset to found separator or to the end. - data = self._read_nowait_chunk( - ichar - offset + seplen - 1 if ichar else -1 - ) - chunk += data - chunk_size += len(data) - if ichar: - not_enough = False - - if chunk_size > self._high_water: - raise ValueError("Chunk too big") - - if self._eof: - break - - if not_enough: - await self._wait("readuntil") - - return chunk - - async def read(self, n: int = -1) -> bytes: - if self._exception is not None: - raise self._exception - - # migration problem; with DataQueue you have to catch - # EofStream exception, so common way is to run payload.read() inside - # infinite loop. what can cause real infinite loop with StreamReader - # lets keep this code one major release. - if __debug__: - if self._eof and not self._buffer: - self._eof_counter = getattr(self, "_eof_counter", 0) + 1 - if self._eof_counter > 5: - internal_logger.warning( - "Multiple access to StreamReader in eof state, " - "might be infinite loop.", - stack_info=True, - ) - - if not n: - return b"" - - if n < 0: - # This used to just loop creating a new waiter hoping to - # collect everything in self._buffer, but that would - # deadlock if the subprocess sends more than self.limit - # bytes. So just call self.readany() until EOF. - blocks = [] - while True: - block = await self.readany() - if not block: - break - blocks.append(block) - return b"".join(blocks) - - # TODO: should be `if` instead of `while` - # because waiter maybe triggered on chunk end, - # without feeding any data - while not self._buffer and not self._eof: - await self._wait("read") - - return self._read_nowait(n) - - async def readany(self) -> bytes: - if self._exception is not None: - raise self._exception - - # TODO: should be `if` instead of `while` - # because waiter maybe triggered on chunk end, - # without feeding any data - while not self._buffer and not self._eof: - await self._wait("readany") - - return self._read_nowait(-1) - - async def readchunk(self) -> Tuple[bytes, bool]: - """Returns a tuple of (data, end_of_http_chunk). - - When chunked transfer - encoding is used, end_of_http_chunk is a boolean indicating if the end - of the data corresponds to the end of a HTTP chunk , otherwise it is - always False. - """ - while True: - if self._exception is not None: - raise self._exception - - while self._http_chunk_splits: - pos = self._http_chunk_splits.pop(0) - if pos == self._cursor: - return (b"", True) - if pos > self._cursor: - return (self._read_nowait(pos - self._cursor), True) - internal_logger.warning( - "Skipping HTTP chunk end due to data " - "consumption beyond chunk boundary" - ) - - if self._buffer: - return (self._read_nowait_chunk(-1), False) - # return (self._read_nowait(-1), False) - - if self._eof: - # Special case for signifying EOF. - # (b'', True) is not a final return value actually. - return (b"", False) - - await self._wait("readchunk") - - async def readexactly(self, n: int) -> bytes: - if self._exception is not None: - raise self._exception - - blocks: List[bytes] = [] - while n > 0: - block = await self.read(n) - if not block: - partial = b"".join(blocks) - raise asyncio.IncompleteReadError(partial, len(partial) + n) - blocks.append(block) - n -= len(block) - - return b"".join(blocks) - - def read_nowait(self, n: int = -1) -> bytes: - # default was changed to be consistent with .read(-1) - # - # I believe the most users don't know about the method and - # they are not affected. - if self._exception is not None: - raise self._exception - - if self._waiter and not self._waiter.done(): - raise RuntimeError( - "Called while some coroutine is waiting for incoming data." - ) - - return self._read_nowait(n) - - def _read_nowait_chunk(self, n: int) -> bytes: - first_buffer = self._buffer[0] - offset = self._buffer_offset - if n != -1 and len(first_buffer) - offset > n: - data = first_buffer[offset : offset + n] - self._buffer_offset += n - - elif offset: - self._buffer.popleft() - data = first_buffer[offset:] - self._buffer_offset = 0 - - else: - data = self._buffer.popleft() - - data_len = len(data) - self._size -= data_len - self._cursor += data_len - - chunk_splits = self._http_chunk_splits - # Prevent memory leak: drop useless chunk splits - while chunk_splits and chunk_splits[0] < self._cursor: - chunk_splits.pop(0) - - if self._size < self._low_water and self._protocol._reading_paused: - self._protocol.resume_reading() - return data - - def _read_nowait(self, n: int) -> bytes: - """Read not more than n bytes, or whole buffer if n == -1""" - self._timer.assert_timeout() - - chunks = [] - while self._buffer: - chunk = self._read_nowait_chunk(n) - chunks.append(chunk) - if n != -1: - n -= len(chunk) - if n == 0: - break - - return b"".join(chunks) if chunks else b"" - - -class EmptyStreamReader(StreamReader): # lgtm [py/missing-call-to-init] - - __slots__ = ("_read_eof_chunk",) - - def __init__(self) -> None: - self._read_eof_chunk = False - self.total_bytes = 0 - - def __repr__(self) -> str: - return "<%s>" % self.__class__.__name__ - - def exception(self) -> Optional[BaseException]: - return None - - def set_exception( - self, - exc: BaseException, - exc_cause: BaseException = _EXC_SENTINEL, - ) -> None: - pass - - def on_eof(self, callback: Callable[[], None]) -> None: - try: - callback() - except Exception: - internal_logger.exception("Exception in eof callback") - - def feed_eof(self) -> None: - pass - - def is_eof(self) -> bool: - return True - - def at_eof(self) -> bool: - return True - - async def wait_eof(self) -> None: - return - - def feed_data(self, data: bytes, n: int = 0) -> None: - pass - - async def readline(self) -> bytes: - return b"" - - async def read(self, n: int = -1) -> bytes: - return b"" - - # TODO add async def readuntil - - async def readany(self) -> bytes: - return b"" - - async def readchunk(self) -> Tuple[bytes, bool]: - if not self._read_eof_chunk: - self._read_eof_chunk = True - return (b"", False) - - return (b"", True) - - async def readexactly(self, n: int) -> bytes: - raise asyncio.IncompleteReadError(b"", n) - - def read_nowait(self, n: int = -1) -> bytes: - return b"" - - -EMPTY_PAYLOAD: Final[StreamReader] = EmptyStreamReader() - - -class DataQueue(Generic[_T]): - """DataQueue is a general-purpose blocking queue with one reader.""" - - def __init__(self, loop: asyncio.AbstractEventLoop) -> None: - self._loop = loop - self._eof = False - self._waiter: Optional[asyncio.Future[None]] = None - self._exception: Optional[BaseException] = None - self._buffer: Deque[Tuple[_T, int]] = collections.deque() - - def __len__(self) -> int: - return len(self._buffer) - - def is_eof(self) -> bool: - return self._eof - - def at_eof(self) -> bool: - return self._eof and not self._buffer - - def exception(self) -> Optional[BaseException]: - return self._exception - - def set_exception( - self, - exc: BaseException, - exc_cause: BaseException = _EXC_SENTINEL, - ) -> None: - self._eof = True - self._exception = exc - if (waiter := self._waiter) is not None: - self._waiter = None - set_exception(waiter, exc, exc_cause) - - def feed_data(self, data: _T, size: int = 0) -> None: - self._buffer.append((data, size)) - if (waiter := self._waiter) is not None: - self._waiter = None - set_result(waiter, None) - - def feed_eof(self) -> None: - self._eof = True - if (waiter := self._waiter) is not None: - self._waiter = None - set_result(waiter, None) - - async def read(self) -> _T: - if not self._buffer and not self._eof: - assert not self._waiter - self._waiter = self._loop.create_future() - try: - await self._waiter - except (asyncio.CancelledError, asyncio.TimeoutError): - self._waiter = None - raise - if self._buffer: - data, _ = self._buffer.popleft() - return data - if self._exception is not None: - raise self._exception - raise EofStream - - def __aiter__(self) -> AsyncStreamIterator[_T]: - return AsyncStreamIterator(self.read) - - -class FlowControlDataQueue(DataQueue[_T]): - """FlowControlDataQueue resumes and pauses an underlying stream. - - It is a destination for parsed data. - - This class is deprecated and will be removed in version 4.0. - """ - - def __init__( - self, protocol: BaseProtocol, limit: int, *, loop: asyncio.AbstractEventLoop - ) -> None: - super().__init__(loop=loop) - self._size = 0 - self._protocol = protocol - self._limit = limit * 2 - - def feed_data(self, data: _T, size: int = 0) -> None: - super().feed_data(data, size) - self._size += size - - if self._size > self._limit and not self._protocol._reading_paused: - self._protocol.pause_reading() - - async def read(self) -> _T: - if not self._buffer and not self._eof: - assert not self._waiter - self._waiter = self._loop.create_future() - try: - await self._waiter - except (asyncio.CancelledError, asyncio.TimeoutError): - self._waiter = None - raise - if self._buffer: - data, size = self._buffer.popleft() - self._size -= size - if self._size < self._limit and self._protocol._reading_paused: - self._protocol.resume_reading() - return data - if self._exception is not None: - raise self._exception - raise EofStream diff --git a/venv/lib/python3.12/site-packages/aiohttp/tcp_helpers.py b/venv/lib/python3.12/site-packages/aiohttp/tcp_helpers.py deleted file mode 100644 index 88b2442..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/tcp_helpers.py +++ /dev/null @@ -1,37 +0,0 @@ -"""Helper methods to tune a TCP connection""" - -import asyncio -import socket -from contextlib import suppress -from typing import Optional # noqa - -__all__ = ("tcp_keepalive", "tcp_nodelay") - - -if hasattr(socket, "SO_KEEPALIVE"): - - def tcp_keepalive(transport: asyncio.Transport) -> None: - sock = transport.get_extra_info("socket") - if sock is not None: - sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) - -else: - - def tcp_keepalive(transport: asyncio.Transport) -> None: # pragma: no cover - pass - - -def tcp_nodelay(transport: asyncio.Transport, value: bool) -> None: - sock = transport.get_extra_info("socket") - - if sock is None: - return - - if sock.family not in (socket.AF_INET, socket.AF_INET6): - return - - value = bool(value) - - # socket may be closed already, on windows OSError get raised - with suppress(OSError): - sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, value) diff --git a/venv/lib/python3.12/site-packages/aiohttp/test_utils.py b/venv/lib/python3.12/site-packages/aiohttp/test_utils.py deleted file mode 100644 index 87c3142..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/test_utils.py +++ /dev/null @@ -1,774 +0,0 @@ -"""Utilities shared by tests.""" - -import asyncio -import contextlib -import gc -import inspect -import ipaddress -import os -import socket -import sys -import warnings -from abc import ABC, abstractmethod -from types import TracebackType -from typing import ( - TYPE_CHECKING, - Any, - Callable, - Generic, - Iterator, - List, - Optional, - Type, - TypeVar, - cast, - overload, -) -from unittest import IsolatedAsyncioTestCase, mock - -from aiosignal import Signal -from multidict import CIMultiDict, CIMultiDictProxy -from yarl import URL - -import aiohttp -from aiohttp.client import ( - _RequestContextManager, - _RequestOptions, - _WSRequestContextManager, -) - -from . import ClientSession, hdrs -from .abc import AbstractCookieJar -from .client_reqrep import ClientResponse -from .client_ws import ClientWebSocketResponse -from .helpers import sentinel -from .http import HttpVersion, RawRequestMessage -from .streams import EMPTY_PAYLOAD, StreamReader -from .typedefs import StrOrURL -from .web import ( - Application, - AppRunner, - BaseRequest, - BaseRunner, - Request, - Server, - ServerRunner, - SockSite, - UrlMappingMatchInfo, -) -from .web_protocol import _RequestHandler - -if TYPE_CHECKING: - from ssl import SSLContext -else: - SSLContext = None - -if sys.version_info >= (3, 11) and TYPE_CHECKING: - from typing import Unpack - -if sys.version_info >= (3, 11): - from typing import Self -else: - Self = Any - -_ApplicationNone = TypeVar("_ApplicationNone", Application, None) -_Request = TypeVar("_Request", bound=BaseRequest) - -REUSE_ADDRESS = os.name == "posix" and sys.platform != "cygwin" - - -def get_unused_port_socket( - host: str, family: socket.AddressFamily = socket.AF_INET -) -> socket.socket: - return get_port_socket(host, 0, family) - - -def get_port_socket( - host: str, port: int, family: socket.AddressFamily -) -> socket.socket: - s = socket.socket(family, socket.SOCK_STREAM) - if REUSE_ADDRESS: - # Windows has different semantics for SO_REUSEADDR, - # so don't set it. Ref: - # https://docs.microsoft.com/en-us/windows/win32/winsock/using-so-reuseaddr-and-so-exclusiveaddruse - s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - s.bind((host, port)) - return s - - -def unused_port() -> int: - """Return a port that is unused on the current host.""" - with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: - s.bind(("127.0.0.1", 0)) - return cast(int, s.getsockname()[1]) - - -class BaseTestServer(ABC): - __test__ = False - - def __init__( - self, - *, - scheme: str = "", - loop: Optional[asyncio.AbstractEventLoop] = None, - host: str = "127.0.0.1", - port: Optional[int] = None, - skip_url_asserts: bool = False, - socket_factory: Callable[ - [str, int, socket.AddressFamily], socket.socket - ] = get_port_socket, - **kwargs: Any, - ) -> None: - self._loop = loop - self.runner: Optional[BaseRunner] = None - self._root: Optional[URL] = None - self.host = host - self.port = port - self._closed = False - self.scheme = scheme - self.skip_url_asserts = skip_url_asserts - self.socket_factory = socket_factory - - async def start_server( - self, loop: Optional[asyncio.AbstractEventLoop] = None, **kwargs: Any - ) -> None: - if self.runner: - return - self._loop = loop - self._ssl = kwargs.pop("ssl", None) - self.runner = await self._make_runner(handler_cancellation=True, **kwargs) - await self.runner.setup() - if not self.port: - self.port = 0 - absolute_host = self.host - try: - version = ipaddress.ip_address(self.host).version - except ValueError: - version = 4 - if version == 6: - absolute_host = f"[{self.host}]" - family = socket.AF_INET6 if version == 6 else socket.AF_INET - _sock = self.socket_factory(self.host, self.port, family) - self.host, self.port = _sock.getsockname()[:2] - site = SockSite(self.runner, sock=_sock, ssl_context=self._ssl) - await site.start() - server = site._server - assert server is not None - sockets = server.sockets # type: ignore[attr-defined] - assert sockets is not None - self.port = sockets[0].getsockname()[1] - if not self.scheme: - self.scheme = "https" if self._ssl else "http" - self._root = URL(f"{self.scheme}://{absolute_host}:{self.port}") - - @abstractmethod # pragma: no cover - async def _make_runner(self, **kwargs: Any) -> BaseRunner: - pass - - def make_url(self, path: StrOrURL) -> URL: - assert self._root is not None - url = URL(path) - if not self.skip_url_asserts: - assert not url.absolute - return self._root.join(url) - else: - return URL(str(self._root) + str(path)) - - @property - def started(self) -> bool: - return self.runner is not None - - @property - def closed(self) -> bool: - return self._closed - - @property - def handler(self) -> Server: - # for backward compatibility - # web.Server instance - runner = self.runner - assert runner is not None - assert runner.server is not None - return runner.server - - async def close(self) -> None: - """Close all fixtures created by the test client. - - After that point, the TestClient is no longer usable. - - This is an idempotent function: running close multiple times - will not have any additional effects. - - close is also run when the object is garbage collected, and on - exit when used as a context manager. - - """ - if self.started and not self.closed: - assert self.runner is not None - await self.runner.cleanup() - self._root = None - self.port = None - self._closed = True - - def __enter__(self) -> None: - raise TypeError("Use async with instead") - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_value: Optional[BaseException], - traceback: Optional[TracebackType], - ) -> None: - # __exit__ should exist in pair with __enter__ but never executed - pass # pragma: no cover - - async def __aenter__(self) -> "BaseTestServer": - await self.start_server(loop=self._loop) - return self - - async def __aexit__( - self, - exc_type: Optional[Type[BaseException]], - exc_value: Optional[BaseException], - traceback: Optional[TracebackType], - ) -> None: - await self.close() - - -class TestServer(BaseTestServer): - def __init__( - self, - app: Application, - *, - scheme: str = "", - host: str = "127.0.0.1", - port: Optional[int] = None, - **kwargs: Any, - ): - self.app = app - super().__init__(scheme=scheme, host=host, port=port, **kwargs) - - async def _make_runner(self, **kwargs: Any) -> BaseRunner: - return AppRunner(self.app, **kwargs) - - -class RawTestServer(BaseTestServer): - def __init__( - self, - handler: _RequestHandler, - *, - scheme: str = "", - host: str = "127.0.0.1", - port: Optional[int] = None, - **kwargs: Any, - ) -> None: - self._handler = handler - super().__init__(scheme=scheme, host=host, port=port, **kwargs) - - async def _make_runner(self, debug: bool = True, **kwargs: Any) -> ServerRunner: - srv = Server(self._handler, loop=self._loop, debug=debug, **kwargs) - return ServerRunner(srv, debug=debug, **kwargs) - - -class TestClient(Generic[_Request, _ApplicationNone]): - """ - A test client implementation. - - To write functional tests for aiohttp based servers. - - """ - - __test__ = False - - @overload - def __init__( - self: "TestClient[Request, Application]", - server: TestServer, - *, - cookie_jar: Optional[AbstractCookieJar] = None, - **kwargs: Any, - ) -> None: ... - @overload - def __init__( - self: "TestClient[_Request, None]", - server: BaseTestServer, - *, - cookie_jar: Optional[AbstractCookieJar] = None, - **kwargs: Any, - ) -> None: ... - def __init__( - self, - server: BaseTestServer, - *, - cookie_jar: Optional[AbstractCookieJar] = None, - loop: Optional[asyncio.AbstractEventLoop] = None, - **kwargs: Any, - ) -> None: - if not isinstance(server, BaseTestServer): - raise TypeError( - "server must be TestServer instance, found type: %r" % type(server) - ) - self._server = server - self._loop = loop - if cookie_jar is None: - cookie_jar = aiohttp.CookieJar(unsafe=True, loop=loop) - self._session = ClientSession(loop=loop, cookie_jar=cookie_jar, **kwargs) - self._session._retry_connection = False - self._closed = False - self._responses: List[ClientResponse] = [] - self._websockets: List[ClientWebSocketResponse] = [] - - async def start_server(self) -> None: - await self._server.start_server(loop=self._loop) - - @property - def host(self) -> str: - return self._server.host - - @property - def port(self) -> Optional[int]: - return self._server.port - - @property - def server(self) -> BaseTestServer: - return self._server - - @property - def app(self) -> _ApplicationNone: - return getattr(self._server, "app", None) # type: ignore[return-value] - - @property - def session(self) -> ClientSession: - """An internal aiohttp.ClientSession. - - Unlike the methods on the TestClient, client session requests - do not automatically include the host in the url queried, and - will require an absolute path to the resource. - - """ - return self._session - - def make_url(self, path: StrOrURL) -> URL: - return self._server.make_url(path) - - async def _request( - self, method: str, path: StrOrURL, **kwargs: Any - ) -> ClientResponse: - resp = await self._session.request(method, self.make_url(path), **kwargs) - # save it to close later - self._responses.append(resp) - return resp - - if sys.version_info >= (3, 11) and TYPE_CHECKING: - - def request( - self, method: str, path: StrOrURL, **kwargs: Unpack[_RequestOptions] - ) -> _RequestContextManager: ... - - def get( - self, - path: StrOrURL, - **kwargs: Unpack[_RequestOptions], - ) -> _RequestContextManager: ... - - def options( - self, - path: StrOrURL, - **kwargs: Unpack[_RequestOptions], - ) -> _RequestContextManager: ... - - def head( - self, - path: StrOrURL, - **kwargs: Unpack[_RequestOptions], - ) -> _RequestContextManager: ... - - def post( - self, - path: StrOrURL, - **kwargs: Unpack[_RequestOptions], - ) -> _RequestContextManager: ... - - def put( - self, - path: StrOrURL, - **kwargs: Unpack[_RequestOptions], - ) -> _RequestContextManager: ... - - def patch( - self, - path: StrOrURL, - **kwargs: Unpack[_RequestOptions], - ) -> _RequestContextManager: ... - - def delete( - self, - path: StrOrURL, - **kwargs: Unpack[_RequestOptions], - ) -> _RequestContextManager: ... - - else: - - def request( - self, method: str, path: StrOrURL, **kwargs: Any - ) -> _RequestContextManager: - """Routes a request to tested http server. - - The interface is identical to aiohttp.ClientSession.request, - except the loop kwarg is overridden by the instance used by the - test server. - - """ - return _RequestContextManager(self._request(method, path, **kwargs)) - - def get(self, path: StrOrURL, **kwargs: Any) -> _RequestContextManager: - """Perform an HTTP GET request.""" - return _RequestContextManager(self._request(hdrs.METH_GET, path, **kwargs)) - - def post(self, path: StrOrURL, **kwargs: Any) -> _RequestContextManager: - """Perform an HTTP POST request.""" - return _RequestContextManager(self._request(hdrs.METH_POST, path, **kwargs)) - - def options(self, path: StrOrURL, **kwargs: Any) -> _RequestContextManager: - """Perform an HTTP OPTIONS request.""" - return _RequestContextManager( - self._request(hdrs.METH_OPTIONS, path, **kwargs) - ) - - def head(self, path: StrOrURL, **kwargs: Any) -> _RequestContextManager: - """Perform an HTTP HEAD request.""" - return _RequestContextManager(self._request(hdrs.METH_HEAD, path, **kwargs)) - - def put(self, path: StrOrURL, **kwargs: Any) -> _RequestContextManager: - """Perform an HTTP PUT request.""" - return _RequestContextManager(self._request(hdrs.METH_PUT, path, **kwargs)) - - def patch(self, path: StrOrURL, **kwargs: Any) -> _RequestContextManager: - """Perform an HTTP PATCH request.""" - return _RequestContextManager( - self._request(hdrs.METH_PATCH, path, **kwargs) - ) - - def delete(self, path: StrOrURL, **kwargs: Any) -> _RequestContextManager: - """Perform an HTTP PATCH request.""" - return _RequestContextManager( - self._request(hdrs.METH_DELETE, path, **kwargs) - ) - - def ws_connect(self, path: StrOrURL, **kwargs: Any) -> _WSRequestContextManager: - """Initiate websocket connection. - - The api corresponds to aiohttp.ClientSession.ws_connect. - - """ - return _WSRequestContextManager(self._ws_connect(path, **kwargs)) - - async def _ws_connect( - self, path: StrOrURL, **kwargs: Any - ) -> ClientWebSocketResponse: - ws = await self._session.ws_connect(self.make_url(path), **kwargs) - self._websockets.append(ws) - return ws - - async def close(self) -> None: - """Close all fixtures created by the test client. - - After that point, the TestClient is no longer usable. - - This is an idempotent function: running close multiple times - will not have any additional effects. - - close is also run on exit when used as a(n) (asynchronous) - context manager. - - """ - if not self._closed: - for resp in self._responses: - resp.close() - for ws in self._websockets: - await ws.close() - await self._session.close() - await self._server.close() - self._closed = True - - def __enter__(self) -> None: - raise TypeError("Use async with instead") - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc: Optional[BaseException], - tb: Optional[TracebackType], - ) -> None: - # __exit__ should exist in pair with __enter__ but never executed - pass # pragma: no cover - - async def __aenter__(self) -> Self: - await self.start_server() - return self - - async def __aexit__( - self, - exc_type: Optional[Type[BaseException]], - exc: Optional[BaseException], - tb: Optional[TracebackType], - ) -> None: - await self.close() - - -class AioHTTPTestCase(IsolatedAsyncioTestCase): - """A base class to allow for unittest web applications using aiohttp. - - Provides the following: - - * self.client (aiohttp.test_utils.TestClient): an aiohttp test client. - * self.loop (asyncio.BaseEventLoop): the event loop in which the - application and server are running. - * self.app (aiohttp.web.Application): the application returned by - self.get_application() - - Note that the TestClient's methods are asynchronous: you have to - execute function on the test client using asynchronous methods. - """ - - async def get_application(self) -> Application: - """Get application. - - This method should be overridden - to return the aiohttp.web.Application - object to test. - """ - return self.get_app() - - def get_app(self) -> Application: - """Obsolete method used to constructing web application. - - Use .get_application() coroutine instead. - """ - raise RuntimeError("Did you forget to define get_application()?") - - async def asyncSetUp(self) -> None: - self.loop = asyncio.get_running_loop() - return await self.setUpAsync() - - async def setUpAsync(self) -> None: - self.app = await self.get_application() - self.server = await self.get_server(self.app) - self.client = await self.get_client(self.server) - - await self.client.start_server() - - async def asyncTearDown(self) -> None: - return await self.tearDownAsync() - - async def tearDownAsync(self) -> None: - await self.client.close() - - async def get_server(self, app: Application) -> TestServer: - """Return a TestServer instance.""" - return TestServer(app, loop=self.loop) - - async def get_client(self, server: TestServer) -> TestClient[Request, Application]: - """Return a TestClient instance.""" - return TestClient(server, loop=self.loop) - - -def unittest_run_loop(func: Any, *args: Any, **kwargs: Any) -> Any: - """ - A decorator dedicated to use with asynchronous AioHTTPTestCase test methods. - - In 3.8+, this does nothing. - """ - warnings.warn( - "Decorator `@unittest_run_loop` is no longer needed in aiohttp 3.8+", - DeprecationWarning, - stacklevel=2, - ) - return func - - -_LOOP_FACTORY = Callable[[], asyncio.AbstractEventLoop] - - -@contextlib.contextmanager -def loop_context( - loop_factory: _LOOP_FACTORY = asyncio.new_event_loop, fast: bool = False -) -> Iterator[asyncio.AbstractEventLoop]: - """A contextmanager that creates an event_loop, for test purposes. - - Handles the creation and cleanup of a test loop. - """ - loop = setup_test_loop(loop_factory) - yield loop - teardown_test_loop(loop, fast=fast) - - -def setup_test_loop( - loop_factory: _LOOP_FACTORY = asyncio.new_event_loop, -) -> asyncio.AbstractEventLoop: - """Create and return an asyncio.BaseEventLoop instance. - - The caller should also call teardown_test_loop, - once they are done with the loop. - """ - loop = loop_factory() - asyncio.set_event_loop(loop) - return loop - - -def teardown_test_loop(loop: asyncio.AbstractEventLoop, fast: bool = False) -> None: - """Teardown and cleanup an event_loop created by setup_test_loop.""" - closed = loop.is_closed() - if not closed: - loop.call_soon(loop.stop) - loop.run_forever() - loop.close() - - if not fast: - gc.collect() - - asyncio.set_event_loop(None) - - -def _create_app_mock() -> mock.MagicMock: - def get_dict(app: Any, key: str) -> Any: - return app.__app_dict[key] - - def set_dict(app: Any, key: str, value: Any) -> None: - app.__app_dict[key] = value - - app = mock.MagicMock(spec=Application) - app.__app_dict = {} - app.__getitem__ = get_dict - app.__setitem__ = set_dict - - app._debug = False - app.on_response_prepare = Signal(app) - app.on_response_prepare.freeze() - return app - - -def _create_transport(sslcontext: Optional[SSLContext] = None) -> mock.Mock: - transport = mock.Mock() - - def get_extra_info(key: str) -> Optional[SSLContext]: - if key == "sslcontext": - return sslcontext - else: - return None - - transport.get_extra_info.side_effect = get_extra_info - return transport - - -def make_mocked_request( - method: str, - path: str, - headers: Any = None, - *, - match_info: Any = sentinel, - version: HttpVersion = HttpVersion(1, 1), - closing: bool = False, - app: Any = None, - writer: Any = sentinel, - protocol: Any = sentinel, - transport: Any = sentinel, - payload: StreamReader = EMPTY_PAYLOAD, - sslcontext: Optional[SSLContext] = None, - client_max_size: int = 1024**2, - loop: Any = ..., -) -> Request: - """Creates mocked web.Request testing purposes. - - Useful in unit tests, when spinning full web server is overkill or - specific conditions and errors are hard to trigger. - """ - task = mock.Mock() - if loop is ...: - # no loop passed, try to get the current one if - # its is running as we need a real loop to create - # executor jobs to be able to do testing - # with a real executor - try: - loop = asyncio.get_running_loop() - except RuntimeError: - loop = mock.Mock() - loop.create_future.return_value = () - - if version < HttpVersion(1, 1): - closing = True - - if headers: - headers = CIMultiDictProxy(CIMultiDict(headers)) - raw_hdrs = tuple( - (k.encode("utf-8"), v.encode("utf-8")) for k, v in headers.items() - ) - else: - headers = CIMultiDictProxy(CIMultiDict()) - raw_hdrs = () - - chunked = "chunked" in headers.get(hdrs.TRANSFER_ENCODING, "").lower() - - message = RawRequestMessage( - method, - path, - version, - headers, - raw_hdrs, - closing, - None, - False, - chunked, - URL(path), - ) - if app is None: - app = _create_app_mock() - - if transport is sentinel: - transport = _create_transport(sslcontext) - - if protocol is sentinel: - protocol = mock.Mock() - protocol.transport = transport - type(protocol).peername = mock.PropertyMock( - return_value=transport.get_extra_info("peername") - ) - type(protocol).ssl_context = mock.PropertyMock(return_value=sslcontext) - - if writer is sentinel: - writer = mock.Mock() - writer.write_headers = make_mocked_coro(None) - writer.write = make_mocked_coro(None) - writer.write_eof = make_mocked_coro(None) - writer.drain = make_mocked_coro(None) - writer.transport = transport - - protocol.transport = transport - protocol.writer = writer - - req = Request( - message, payload, protocol, writer, task, loop, client_max_size=client_max_size - ) - - match_info = UrlMappingMatchInfo( - {} if match_info is sentinel else match_info, mock.Mock() - ) - match_info.add_app(app) - req._match_info = match_info - - return req - - -def make_mocked_coro( - return_value: Any = sentinel, raise_exception: Any = sentinel -) -> Any: - """Creates a coroutine mock.""" - - async def mock_coro(*args: Any, **kwargs: Any) -> Any: - if raise_exception is not sentinel: - raise raise_exception - if not inspect.isawaitable(return_value): - return return_value - await return_value - - return mock.Mock(wraps=mock_coro) diff --git a/venv/lib/python3.12/site-packages/aiohttp/tracing.py b/venv/lib/python3.12/site-packages/aiohttp/tracing.py deleted file mode 100644 index 568fa7f..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/tracing.py +++ /dev/null @@ -1,455 +0,0 @@ -from types import SimpleNamespace -from typing import TYPE_CHECKING, Mapping, Optional, Type, TypeVar - -import attr -from aiosignal import Signal -from multidict import CIMultiDict -from yarl import URL - -from .client_reqrep import ClientResponse - -if TYPE_CHECKING: - from .client import ClientSession - - _ParamT_contra = TypeVar("_ParamT_contra", contravariant=True) - _TracingSignal = Signal[ClientSession, SimpleNamespace, _ParamT_contra] - - -__all__ = ( - "TraceConfig", - "TraceRequestStartParams", - "TraceRequestEndParams", - "TraceRequestExceptionParams", - "TraceConnectionQueuedStartParams", - "TraceConnectionQueuedEndParams", - "TraceConnectionCreateStartParams", - "TraceConnectionCreateEndParams", - "TraceConnectionReuseconnParams", - "TraceDnsResolveHostStartParams", - "TraceDnsResolveHostEndParams", - "TraceDnsCacheHitParams", - "TraceDnsCacheMissParams", - "TraceRequestRedirectParams", - "TraceRequestChunkSentParams", - "TraceResponseChunkReceivedParams", - "TraceRequestHeadersSentParams", -) - - -class TraceConfig: - """First-class used to trace requests launched via ClientSession objects.""" - - def __init__( - self, trace_config_ctx_factory: Type[SimpleNamespace] = SimpleNamespace - ) -> None: - self._on_request_start: _TracingSignal[TraceRequestStartParams] = Signal(self) - self._on_request_chunk_sent: _TracingSignal[TraceRequestChunkSentParams] = ( - Signal(self) - ) - self._on_response_chunk_received: _TracingSignal[ - TraceResponseChunkReceivedParams - ] = Signal(self) - self._on_request_end: _TracingSignal[TraceRequestEndParams] = Signal(self) - self._on_request_exception: _TracingSignal[TraceRequestExceptionParams] = ( - Signal(self) - ) - self._on_request_redirect: _TracingSignal[TraceRequestRedirectParams] = Signal( - self - ) - self._on_connection_queued_start: _TracingSignal[ - TraceConnectionQueuedStartParams - ] = Signal(self) - self._on_connection_queued_end: _TracingSignal[ - TraceConnectionQueuedEndParams - ] = Signal(self) - self._on_connection_create_start: _TracingSignal[ - TraceConnectionCreateStartParams - ] = Signal(self) - self._on_connection_create_end: _TracingSignal[ - TraceConnectionCreateEndParams - ] = Signal(self) - self._on_connection_reuseconn: _TracingSignal[ - TraceConnectionReuseconnParams - ] = Signal(self) - self._on_dns_resolvehost_start: _TracingSignal[ - TraceDnsResolveHostStartParams - ] = Signal(self) - self._on_dns_resolvehost_end: _TracingSignal[TraceDnsResolveHostEndParams] = ( - Signal(self) - ) - self._on_dns_cache_hit: _TracingSignal[TraceDnsCacheHitParams] = Signal(self) - self._on_dns_cache_miss: _TracingSignal[TraceDnsCacheMissParams] = Signal(self) - self._on_request_headers_sent: _TracingSignal[TraceRequestHeadersSentParams] = ( - Signal(self) - ) - - self._trace_config_ctx_factory = trace_config_ctx_factory - - def trace_config_ctx( - self, trace_request_ctx: Optional[Mapping[str, str]] = None - ) -> SimpleNamespace: - """Return a new trace_config_ctx instance""" - return self._trace_config_ctx_factory(trace_request_ctx=trace_request_ctx) - - def freeze(self) -> None: - self._on_request_start.freeze() - self._on_request_chunk_sent.freeze() - self._on_response_chunk_received.freeze() - self._on_request_end.freeze() - self._on_request_exception.freeze() - self._on_request_redirect.freeze() - self._on_connection_queued_start.freeze() - self._on_connection_queued_end.freeze() - self._on_connection_create_start.freeze() - self._on_connection_create_end.freeze() - self._on_connection_reuseconn.freeze() - self._on_dns_resolvehost_start.freeze() - self._on_dns_resolvehost_end.freeze() - self._on_dns_cache_hit.freeze() - self._on_dns_cache_miss.freeze() - self._on_request_headers_sent.freeze() - - @property - def on_request_start(self) -> "_TracingSignal[TraceRequestStartParams]": - return self._on_request_start - - @property - def on_request_chunk_sent( - self, - ) -> "_TracingSignal[TraceRequestChunkSentParams]": - return self._on_request_chunk_sent - - @property - def on_response_chunk_received( - self, - ) -> "_TracingSignal[TraceResponseChunkReceivedParams]": - return self._on_response_chunk_received - - @property - def on_request_end(self) -> "_TracingSignal[TraceRequestEndParams]": - return self._on_request_end - - @property - def on_request_exception( - self, - ) -> "_TracingSignal[TraceRequestExceptionParams]": - return self._on_request_exception - - @property - def on_request_redirect( - self, - ) -> "_TracingSignal[TraceRequestRedirectParams]": - return self._on_request_redirect - - @property - def on_connection_queued_start( - self, - ) -> "_TracingSignal[TraceConnectionQueuedStartParams]": - return self._on_connection_queued_start - - @property - def on_connection_queued_end( - self, - ) -> "_TracingSignal[TraceConnectionQueuedEndParams]": - return self._on_connection_queued_end - - @property - def on_connection_create_start( - self, - ) -> "_TracingSignal[TraceConnectionCreateStartParams]": - return self._on_connection_create_start - - @property - def on_connection_create_end( - self, - ) -> "_TracingSignal[TraceConnectionCreateEndParams]": - return self._on_connection_create_end - - @property - def on_connection_reuseconn( - self, - ) -> "_TracingSignal[TraceConnectionReuseconnParams]": - return self._on_connection_reuseconn - - @property - def on_dns_resolvehost_start( - self, - ) -> "_TracingSignal[TraceDnsResolveHostStartParams]": - return self._on_dns_resolvehost_start - - @property - def on_dns_resolvehost_end( - self, - ) -> "_TracingSignal[TraceDnsResolveHostEndParams]": - return self._on_dns_resolvehost_end - - @property - def on_dns_cache_hit(self) -> "_TracingSignal[TraceDnsCacheHitParams]": - return self._on_dns_cache_hit - - @property - def on_dns_cache_miss(self) -> "_TracingSignal[TraceDnsCacheMissParams]": - return self._on_dns_cache_miss - - @property - def on_request_headers_sent( - self, - ) -> "_TracingSignal[TraceRequestHeadersSentParams]": - return self._on_request_headers_sent - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class TraceRequestStartParams: - """Parameters sent by the `on_request_start` signal""" - - method: str - url: URL - headers: "CIMultiDict[str]" - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class TraceRequestChunkSentParams: - """Parameters sent by the `on_request_chunk_sent` signal""" - - method: str - url: URL - chunk: bytes - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class TraceResponseChunkReceivedParams: - """Parameters sent by the `on_response_chunk_received` signal""" - - method: str - url: URL - chunk: bytes - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class TraceRequestEndParams: - """Parameters sent by the `on_request_end` signal""" - - method: str - url: URL - headers: "CIMultiDict[str]" - response: ClientResponse - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class TraceRequestExceptionParams: - """Parameters sent by the `on_request_exception` signal""" - - method: str - url: URL - headers: "CIMultiDict[str]" - exception: BaseException - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class TraceRequestRedirectParams: - """Parameters sent by the `on_request_redirect` signal""" - - method: str - url: URL - headers: "CIMultiDict[str]" - response: ClientResponse - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class TraceConnectionQueuedStartParams: - """Parameters sent by the `on_connection_queued_start` signal""" - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class TraceConnectionQueuedEndParams: - """Parameters sent by the `on_connection_queued_end` signal""" - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class TraceConnectionCreateStartParams: - """Parameters sent by the `on_connection_create_start` signal""" - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class TraceConnectionCreateEndParams: - """Parameters sent by the `on_connection_create_end` signal""" - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class TraceConnectionReuseconnParams: - """Parameters sent by the `on_connection_reuseconn` signal""" - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class TraceDnsResolveHostStartParams: - """Parameters sent by the `on_dns_resolvehost_start` signal""" - - host: str - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class TraceDnsResolveHostEndParams: - """Parameters sent by the `on_dns_resolvehost_end` signal""" - - host: str - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class TraceDnsCacheHitParams: - """Parameters sent by the `on_dns_cache_hit` signal""" - - host: str - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class TraceDnsCacheMissParams: - """Parameters sent by the `on_dns_cache_miss` signal""" - - host: str - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class TraceRequestHeadersSentParams: - """Parameters sent by the `on_request_headers_sent` signal""" - - method: str - url: URL - headers: "CIMultiDict[str]" - - -class Trace: - """Internal dependency holder class. - - Used to keep together the main dependencies used - at the moment of send a signal. - """ - - def __init__( - self, - session: "ClientSession", - trace_config: TraceConfig, - trace_config_ctx: SimpleNamespace, - ) -> None: - self._trace_config = trace_config - self._trace_config_ctx = trace_config_ctx - self._session = session - - async def send_request_start( - self, method: str, url: URL, headers: "CIMultiDict[str]" - ) -> None: - return await self._trace_config.on_request_start.send( - self._session, - self._trace_config_ctx, - TraceRequestStartParams(method, url, headers), - ) - - async def send_request_chunk_sent( - self, method: str, url: URL, chunk: bytes - ) -> None: - return await self._trace_config.on_request_chunk_sent.send( - self._session, - self._trace_config_ctx, - TraceRequestChunkSentParams(method, url, chunk), - ) - - async def send_response_chunk_received( - self, method: str, url: URL, chunk: bytes - ) -> None: - return await self._trace_config.on_response_chunk_received.send( - self._session, - self._trace_config_ctx, - TraceResponseChunkReceivedParams(method, url, chunk), - ) - - async def send_request_end( - self, - method: str, - url: URL, - headers: "CIMultiDict[str]", - response: ClientResponse, - ) -> None: - return await self._trace_config.on_request_end.send( - self._session, - self._trace_config_ctx, - TraceRequestEndParams(method, url, headers, response), - ) - - async def send_request_exception( - self, - method: str, - url: URL, - headers: "CIMultiDict[str]", - exception: BaseException, - ) -> None: - return await self._trace_config.on_request_exception.send( - self._session, - self._trace_config_ctx, - TraceRequestExceptionParams(method, url, headers, exception), - ) - - async def send_request_redirect( - self, - method: str, - url: URL, - headers: "CIMultiDict[str]", - response: ClientResponse, - ) -> None: - return await self._trace_config._on_request_redirect.send( - self._session, - self._trace_config_ctx, - TraceRequestRedirectParams(method, url, headers, response), - ) - - async def send_connection_queued_start(self) -> None: - return await self._trace_config.on_connection_queued_start.send( - self._session, self._trace_config_ctx, TraceConnectionQueuedStartParams() - ) - - async def send_connection_queued_end(self) -> None: - return await self._trace_config.on_connection_queued_end.send( - self._session, self._trace_config_ctx, TraceConnectionQueuedEndParams() - ) - - async def send_connection_create_start(self) -> None: - return await self._trace_config.on_connection_create_start.send( - self._session, self._trace_config_ctx, TraceConnectionCreateStartParams() - ) - - async def send_connection_create_end(self) -> None: - return await self._trace_config.on_connection_create_end.send( - self._session, self._trace_config_ctx, TraceConnectionCreateEndParams() - ) - - async def send_connection_reuseconn(self) -> None: - return await self._trace_config.on_connection_reuseconn.send( - self._session, self._trace_config_ctx, TraceConnectionReuseconnParams() - ) - - async def send_dns_resolvehost_start(self, host: str) -> None: - return await self._trace_config.on_dns_resolvehost_start.send( - self._session, self._trace_config_ctx, TraceDnsResolveHostStartParams(host) - ) - - async def send_dns_resolvehost_end(self, host: str) -> None: - return await self._trace_config.on_dns_resolvehost_end.send( - self._session, self._trace_config_ctx, TraceDnsResolveHostEndParams(host) - ) - - async def send_dns_cache_hit(self, host: str) -> None: - return await self._trace_config.on_dns_cache_hit.send( - self._session, self._trace_config_ctx, TraceDnsCacheHitParams(host) - ) - - async def send_dns_cache_miss(self, host: str) -> None: - return await self._trace_config.on_dns_cache_miss.send( - self._session, self._trace_config_ctx, TraceDnsCacheMissParams(host) - ) - - async def send_request_headers( - self, method: str, url: URL, headers: "CIMultiDict[str]" - ) -> None: - return await self._trace_config._on_request_headers_sent.send( - self._session, - self._trace_config_ctx, - TraceRequestHeadersSentParams(method, url, headers), - ) diff --git a/venv/lib/python3.12/site-packages/aiohttp/typedefs.py b/venv/lib/python3.12/site-packages/aiohttp/typedefs.py deleted file mode 100644 index cc8c082..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/typedefs.py +++ /dev/null @@ -1,69 +0,0 @@ -import json -import os -from typing import ( - TYPE_CHECKING, - Any, - Awaitable, - Callable, - Iterable, - Mapping, - Protocol, - Tuple, - Union, -) - -from multidict import CIMultiDict, CIMultiDictProxy, MultiDict, MultiDictProxy, istr -from yarl import URL, Query as _Query - -Query = _Query - -DEFAULT_JSON_ENCODER = json.dumps -DEFAULT_JSON_DECODER = json.loads - -if TYPE_CHECKING: - _CIMultiDict = CIMultiDict[str] - _CIMultiDictProxy = CIMultiDictProxy[str] - _MultiDict = MultiDict[str] - _MultiDictProxy = MultiDictProxy[str] - from http.cookies import BaseCookie, Morsel - - from .web import Request, StreamResponse -else: - _CIMultiDict = CIMultiDict - _CIMultiDictProxy = CIMultiDictProxy - _MultiDict = MultiDict - _MultiDictProxy = MultiDictProxy - -Byteish = Union[bytes, bytearray, memoryview] -JSONEncoder = Callable[[Any], str] -JSONDecoder = Callable[[str], Any] -LooseHeaders = Union[ - Mapping[str, str], - Mapping[istr, str], - _CIMultiDict, - _CIMultiDictProxy, - Iterable[Tuple[Union[str, istr], str]], -] -RawHeaders = Tuple[Tuple[bytes, bytes], ...] -StrOrURL = Union[str, URL] - -LooseCookiesMappings = Mapping[str, Union[str, "BaseCookie[str]", "Morsel[Any]"]] -LooseCookiesIterables = Iterable[ - Tuple[str, Union[str, "BaseCookie[str]", "Morsel[Any]"]] -] -LooseCookies = Union[ - LooseCookiesMappings, - LooseCookiesIterables, - "BaseCookie[str]", -] - -Handler = Callable[["Request"], Awaitable["StreamResponse"]] - - -class Middleware(Protocol): - def __call__( - self, request: "Request", handler: Handler - ) -> Awaitable["StreamResponse"]: ... - - -PathLike = Union[str, "os.PathLike[str]"] diff --git a/venv/lib/python3.12/site-packages/aiohttp/web.py b/venv/lib/python3.12/site-packages/aiohttp/web.py deleted file mode 100644 index 8307ff4..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/web.py +++ /dev/null @@ -1,605 +0,0 @@ -import asyncio -import logging -import os -import socket -import sys -import warnings -from argparse import ArgumentParser -from collections.abc import Iterable -from contextlib import suppress -from importlib import import_module -from typing import ( - TYPE_CHECKING, - Any, - Awaitable, - Callable, - Iterable as TypingIterable, - List, - Optional, - Set, - Type, - Union, - cast, -) - -from .abc import AbstractAccessLogger -from .helpers import AppKey as AppKey -from .log import access_logger -from .typedefs import PathLike -from .web_app import Application as Application, CleanupError as CleanupError -from .web_exceptions import ( - HTTPAccepted as HTTPAccepted, - HTTPBadGateway as HTTPBadGateway, - HTTPBadRequest as HTTPBadRequest, - HTTPClientError as HTTPClientError, - HTTPConflict as HTTPConflict, - HTTPCreated as HTTPCreated, - HTTPError as HTTPError, - HTTPException as HTTPException, - HTTPExpectationFailed as HTTPExpectationFailed, - HTTPFailedDependency as HTTPFailedDependency, - HTTPForbidden as HTTPForbidden, - HTTPFound as HTTPFound, - HTTPGatewayTimeout as HTTPGatewayTimeout, - HTTPGone as HTTPGone, - HTTPInsufficientStorage as HTTPInsufficientStorage, - HTTPInternalServerError as HTTPInternalServerError, - HTTPLengthRequired as HTTPLengthRequired, - HTTPMethodNotAllowed as HTTPMethodNotAllowed, - HTTPMisdirectedRequest as HTTPMisdirectedRequest, - HTTPMove as HTTPMove, - HTTPMovedPermanently as HTTPMovedPermanently, - HTTPMultipleChoices as HTTPMultipleChoices, - HTTPNetworkAuthenticationRequired as HTTPNetworkAuthenticationRequired, - HTTPNoContent as HTTPNoContent, - HTTPNonAuthoritativeInformation as HTTPNonAuthoritativeInformation, - HTTPNotAcceptable as HTTPNotAcceptable, - HTTPNotExtended as HTTPNotExtended, - HTTPNotFound as HTTPNotFound, - HTTPNotImplemented as HTTPNotImplemented, - HTTPNotModified as HTTPNotModified, - HTTPOk as HTTPOk, - HTTPPartialContent as HTTPPartialContent, - HTTPPaymentRequired as HTTPPaymentRequired, - HTTPPermanentRedirect as HTTPPermanentRedirect, - HTTPPreconditionFailed as HTTPPreconditionFailed, - HTTPPreconditionRequired as HTTPPreconditionRequired, - HTTPProxyAuthenticationRequired as HTTPProxyAuthenticationRequired, - HTTPRedirection as HTTPRedirection, - HTTPRequestEntityTooLarge as HTTPRequestEntityTooLarge, - HTTPRequestHeaderFieldsTooLarge as HTTPRequestHeaderFieldsTooLarge, - HTTPRequestRangeNotSatisfiable as HTTPRequestRangeNotSatisfiable, - HTTPRequestTimeout as HTTPRequestTimeout, - HTTPRequestURITooLong as HTTPRequestURITooLong, - HTTPResetContent as HTTPResetContent, - HTTPSeeOther as HTTPSeeOther, - HTTPServerError as HTTPServerError, - HTTPServiceUnavailable as HTTPServiceUnavailable, - HTTPSuccessful as HTTPSuccessful, - HTTPTemporaryRedirect as HTTPTemporaryRedirect, - HTTPTooManyRequests as HTTPTooManyRequests, - HTTPUnauthorized as HTTPUnauthorized, - HTTPUnavailableForLegalReasons as HTTPUnavailableForLegalReasons, - HTTPUnprocessableEntity as HTTPUnprocessableEntity, - HTTPUnsupportedMediaType as HTTPUnsupportedMediaType, - HTTPUpgradeRequired as HTTPUpgradeRequired, - HTTPUseProxy as HTTPUseProxy, - HTTPVariantAlsoNegotiates as HTTPVariantAlsoNegotiates, - HTTPVersionNotSupported as HTTPVersionNotSupported, - NotAppKeyWarning as NotAppKeyWarning, -) -from .web_fileresponse import FileResponse as FileResponse -from .web_log import AccessLogger -from .web_middlewares import ( - middleware as middleware, - normalize_path_middleware as normalize_path_middleware, -) -from .web_protocol import ( - PayloadAccessError as PayloadAccessError, - RequestHandler as RequestHandler, - RequestPayloadError as RequestPayloadError, -) -from .web_request import ( - BaseRequest as BaseRequest, - FileField as FileField, - Request as Request, -) -from .web_response import ( - ContentCoding as ContentCoding, - Response as Response, - StreamResponse as StreamResponse, - json_response as json_response, -) -from .web_routedef import ( - AbstractRouteDef as AbstractRouteDef, - RouteDef as RouteDef, - RouteTableDef as RouteTableDef, - StaticDef as StaticDef, - delete as delete, - get as get, - head as head, - options as options, - patch as patch, - post as post, - put as put, - route as route, - static as static, - view as view, -) -from .web_runner import ( - AppRunner as AppRunner, - BaseRunner as BaseRunner, - BaseSite as BaseSite, - GracefulExit as GracefulExit, - NamedPipeSite as NamedPipeSite, - ServerRunner as ServerRunner, - SockSite as SockSite, - TCPSite as TCPSite, - UnixSite as UnixSite, -) -from .web_server import Server as Server -from .web_urldispatcher import ( - AbstractResource as AbstractResource, - AbstractRoute as AbstractRoute, - DynamicResource as DynamicResource, - PlainResource as PlainResource, - PrefixedSubAppResource as PrefixedSubAppResource, - Resource as Resource, - ResourceRoute as ResourceRoute, - StaticResource as StaticResource, - UrlDispatcher as UrlDispatcher, - UrlMappingMatchInfo as UrlMappingMatchInfo, - View as View, -) -from .web_ws import ( - WebSocketReady as WebSocketReady, - WebSocketResponse as WebSocketResponse, - WSMsgType as WSMsgType, -) - -__all__ = ( - # web_app - "AppKey", - "Application", - "CleanupError", - # web_exceptions - "NotAppKeyWarning", - "HTTPAccepted", - "HTTPBadGateway", - "HTTPBadRequest", - "HTTPClientError", - "HTTPConflict", - "HTTPCreated", - "HTTPError", - "HTTPException", - "HTTPExpectationFailed", - "HTTPFailedDependency", - "HTTPForbidden", - "HTTPFound", - "HTTPGatewayTimeout", - "HTTPGone", - "HTTPInsufficientStorage", - "HTTPInternalServerError", - "HTTPLengthRequired", - "HTTPMethodNotAllowed", - "HTTPMisdirectedRequest", - "HTTPMove", - "HTTPMovedPermanently", - "HTTPMultipleChoices", - "HTTPNetworkAuthenticationRequired", - "HTTPNoContent", - "HTTPNonAuthoritativeInformation", - "HTTPNotAcceptable", - "HTTPNotExtended", - "HTTPNotFound", - "HTTPNotImplemented", - "HTTPNotModified", - "HTTPOk", - "HTTPPartialContent", - "HTTPPaymentRequired", - "HTTPPermanentRedirect", - "HTTPPreconditionFailed", - "HTTPPreconditionRequired", - "HTTPProxyAuthenticationRequired", - "HTTPRedirection", - "HTTPRequestEntityTooLarge", - "HTTPRequestHeaderFieldsTooLarge", - "HTTPRequestRangeNotSatisfiable", - "HTTPRequestTimeout", - "HTTPRequestURITooLong", - "HTTPResetContent", - "HTTPSeeOther", - "HTTPServerError", - "HTTPServiceUnavailable", - "HTTPSuccessful", - "HTTPTemporaryRedirect", - "HTTPTooManyRequests", - "HTTPUnauthorized", - "HTTPUnavailableForLegalReasons", - "HTTPUnprocessableEntity", - "HTTPUnsupportedMediaType", - "HTTPUpgradeRequired", - "HTTPUseProxy", - "HTTPVariantAlsoNegotiates", - "HTTPVersionNotSupported", - # web_fileresponse - "FileResponse", - # web_middlewares - "middleware", - "normalize_path_middleware", - # web_protocol - "PayloadAccessError", - "RequestHandler", - "RequestPayloadError", - # web_request - "BaseRequest", - "FileField", - "Request", - # web_response - "ContentCoding", - "Response", - "StreamResponse", - "json_response", - # web_routedef - "AbstractRouteDef", - "RouteDef", - "RouteTableDef", - "StaticDef", - "delete", - "get", - "head", - "options", - "patch", - "post", - "put", - "route", - "static", - "view", - # web_runner - "AppRunner", - "BaseRunner", - "BaseSite", - "GracefulExit", - "ServerRunner", - "SockSite", - "TCPSite", - "UnixSite", - "NamedPipeSite", - # web_server - "Server", - # web_urldispatcher - "AbstractResource", - "AbstractRoute", - "DynamicResource", - "PlainResource", - "PrefixedSubAppResource", - "Resource", - "ResourceRoute", - "StaticResource", - "UrlDispatcher", - "UrlMappingMatchInfo", - "View", - # web_ws - "WebSocketReady", - "WebSocketResponse", - "WSMsgType", - # web - "run_app", -) - - -if TYPE_CHECKING: - from ssl import SSLContext -else: - try: - from ssl import SSLContext - except ImportError: # pragma: no cover - SSLContext = object # type: ignore[misc,assignment] - -# Only display warning when using -Wdefault, -We, -X dev or similar. -warnings.filterwarnings("ignore", category=NotAppKeyWarning, append=True) - -HostSequence = TypingIterable[str] - - -async def _run_app( - app: Union[Application, Awaitable[Application]], - *, - host: Optional[Union[str, HostSequence]] = None, - port: Optional[int] = None, - path: Union[PathLike, TypingIterable[PathLike], None] = None, - sock: Optional[Union[socket.socket, TypingIterable[socket.socket]]] = None, - shutdown_timeout: float = 60.0, - keepalive_timeout: float = 75.0, - ssl_context: Optional[SSLContext] = None, - print: Optional[Callable[..., None]] = print, - backlog: int = 128, - access_log_class: Type[AbstractAccessLogger] = AccessLogger, - access_log_format: str = AccessLogger.LOG_FORMAT, - access_log: Optional[logging.Logger] = access_logger, - handle_signals: bool = True, - reuse_address: Optional[bool] = None, - reuse_port: Optional[bool] = None, - handler_cancellation: bool = False, -) -> None: - # An internal function to actually do all dirty job for application running - if asyncio.iscoroutine(app): - app = await app - - app = cast(Application, app) - - runner = AppRunner( - app, - handle_signals=handle_signals, - access_log_class=access_log_class, - access_log_format=access_log_format, - access_log=access_log, - keepalive_timeout=keepalive_timeout, - shutdown_timeout=shutdown_timeout, - handler_cancellation=handler_cancellation, - ) - - await runner.setup() - - sites: List[BaseSite] = [] - - try: - if host is not None: - if isinstance(host, str): - sites.append( - TCPSite( - runner, - host, - port, - ssl_context=ssl_context, - backlog=backlog, - reuse_address=reuse_address, - reuse_port=reuse_port, - ) - ) - else: - for h in host: - sites.append( - TCPSite( - runner, - h, - port, - ssl_context=ssl_context, - backlog=backlog, - reuse_address=reuse_address, - reuse_port=reuse_port, - ) - ) - elif path is None and sock is None or port is not None: - sites.append( - TCPSite( - runner, - port=port, - ssl_context=ssl_context, - backlog=backlog, - reuse_address=reuse_address, - reuse_port=reuse_port, - ) - ) - - if path is not None: - if isinstance(path, (str, os.PathLike)): - sites.append( - UnixSite( - runner, - path, - ssl_context=ssl_context, - backlog=backlog, - ) - ) - else: - for p in path: - sites.append( - UnixSite( - runner, - p, - ssl_context=ssl_context, - backlog=backlog, - ) - ) - - if sock is not None: - if not isinstance(sock, Iterable): - sites.append( - SockSite( - runner, - sock, - ssl_context=ssl_context, - backlog=backlog, - ) - ) - else: - for s in sock: - sites.append( - SockSite( - runner, - s, - ssl_context=ssl_context, - backlog=backlog, - ) - ) - for site in sites: - await site.start() - - if print: # pragma: no branch - names = sorted(str(s.name) for s in runner.sites) - print( - "======== Running on {} ========\n" - "(Press CTRL+C to quit)".format(", ".join(names)) - ) - - # sleep forever by 1 hour intervals, - while True: - await asyncio.sleep(3600) - finally: - await runner.cleanup() - - -def _cancel_tasks( - to_cancel: Set["asyncio.Task[Any]"], loop: asyncio.AbstractEventLoop -) -> None: - if not to_cancel: - return - - for task in to_cancel: - task.cancel() - - loop.run_until_complete(asyncio.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, - } - ) - - -def run_app( - app: Union[Application, Awaitable[Application]], - *, - host: Optional[Union[str, HostSequence]] = None, - port: Optional[int] = None, - path: Union[PathLike, TypingIterable[PathLike], None] = None, - sock: Optional[Union[socket.socket, TypingIterable[socket.socket]]] = None, - shutdown_timeout: float = 60.0, - keepalive_timeout: float = 75.0, - ssl_context: Optional[SSLContext] = None, - print: Optional[Callable[..., None]] = print, - backlog: int = 128, - access_log_class: Type[AbstractAccessLogger] = AccessLogger, - access_log_format: str = AccessLogger.LOG_FORMAT, - access_log: Optional[logging.Logger] = access_logger, - handle_signals: bool = True, - reuse_address: Optional[bool] = None, - reuse_port: Optional[bool] = None, - handler_cancellation: bool = False, - loop: Optional[asyncio.AbstractEventLoop] = None, -) -> None: - """Run an app locally""" - if loop is None: - loop = asyncio.new_event_loop() - - # Configure if and only if in debugging mode and using the default logger - if loop.get_debug() and access_log and access_log.name == "aiohttp.access": - if access_log.level == logging.NOTSET: - access_log.setLevel(logging.DEBUG) - if not access_log.hasHandlers(): - access_log.addHandler(logging.StreamHandler()) - - main_task = loop.create_task( - _run_app( - app, - host=host, - port=port, - path=path, - sock=sock, - shutdown_timeout=shutdown_timeout, - keepalive_timeout=keepalive_timeout, - ssl_context=ssl_context, - print=print, - backlog=backlog, - access_log_class=access_log_class, - access_log_format=access_log_format, - access_log=access_log, - handle_signals=handle_signals, - reuse_address=reuse_address, - reuse_port=reuse_port, - handler_cancellation=handler_cancellation, - ) - ) - - try: - asyncio.set_event_loop(loop) - loop.run_until_complete(main_task) - except (GracefulExit, KeyboardInterrupt): # pragma: no cover - pass - finally: - try: - main_task.cancel() - with suppress(asyncio.CancelledError): - loop.run_until_complete(main_task) - finally: - _cancel_tasks(asyncio.all_tasks(loop), loop) - loop.run_until_complete(loop.shutdown_asyncgens()) - loop.close() - - -def main(argv: List[str]) -> None: - arg_parser = ArgumentParser( - description="aiohttp.web Application server", prog="aiohttp.web" - ) - arg_parser.add_argument( - "entry_func", - help=( - "Callable returning the `aiohttp.web.Application` instance to " - "run. Should be specified in the 'module:function' syntax." - ), - metavar="entry-func", - ) - arg_parser.add_argument( - "-H", - "--hostname", - help="TCP/IP hostname to serve on (default: localhost)", - default=None, - ) - arg_parser.add_argument( - "-P", - "--port", - help="TCP/IP port to serve on (default: %(default)r)", - type=int, - default=8080, - ) - arg_parser.add_argument( - "-U", - "--path", - help="Unix file system path to serve on. Can be combined with hostname " - "to serve on both Unix and TCP.", - ) - args, extra_argv = arg_parser.parse_known_args(argv) - - # Import logic - mod_str, _, func_str = args.entry_func.partition(":") - if not func_str or not mod_str: - arg_parser.error("'entry-func' not in 'module:function' syntax") - if mod_str.startswith("."): - arg_parser.error("relative module names not supported") - try: - module = import_module(mod_str) - except ImportError as ex: - arg_parser.error(f"unable to import {mod_str}: {ex}") - try: - func = getattr(module, func_str) - except AttributeError: - arg_parser.error(f"module {mod_str!r} has no attribute {func_str!r}") - - # Compatibility logic - if args.path is not None and not hasattr(socket, "AF_UNIX"): - arg_parser.error( - "file system paths not supported by your operating environment" - ) - - logging.basicConfig(level=logging.DEBUG) - - if args.path and args.hostname is None: - host = port = None - else: - host = args.hostname or "localhost" - port = args.port - - app = func(extra_argv) - run_app(app, host=host, port=port, path=args.path) - arg_parser.exit(message="Stopped\n") - - -if __name__ == "__main__": # pragma: no branch - main(sys.argv[1:]) # pragma: no cover diff --git a/venv/lib/python3.12/site-packages/aiohttp/web_app.py b/venv/lib/python3.12/site-packages/aiohttp/web_app.py deleted file mode 100644 index 619c008..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/web_app.py +++ /dev/null @@ -1,620 +0,0 @@ -import asyncio -import logging -import warnings -from functools import lru_cache, partial, update_wrapper -from typing import ( - TYPE_CHECKING, - Any, - AsyncIterator, - Awaitable, - Callable, - Dict, - Iterable, - Iterator, - List, - Mapping, - MutableMapping, - Optional, - Sequence, - Tuple, - Type, - TypeVar, - Union, - cast, - overload, -) - -from aiosignal import Signal -from frozenlist import FrozenList - -from . import hdrs -from .abc import ( - AbstractAccessLogger, - AbstractMatchInfo, - AbstractRouter, - AbstractStreamWriter, -) -from .helpers import DEBUG, AppKey -from .http_parser import RawRequestMessage -from .log import web_logger -from .streams import StreamReader -from .typedefs import Handler, Middleware -from .web_exceptions import NotAppKeyWarning -from .web_log import AccessLogger -from .web_middlewares import _fix_request_current_app -from .web_protocol import RequestHandler -from .web_request import Request -from .web_response import StreamResponse -from .web_routedef import AbstractRouteDef -from .web_server import Server -from .web_urldispatcher import ( - AbstractResource, - AbstractRoute, - Domain, - MaskDomain, - MatchedSubAppResource, - PrefixedSubAppResource, - SystemRoute, - UrlDispatcher, -) - -__all__ = ("Application", "CleanupError") - - -if TYPE_CHECKING: - _AppSignal = Signal["Application"] - _RespPrepareSignal = Signal[Request, StreamResponse] - _Middlewares = FrozenList[Middleware] - _MiddlewaresHandlers = Optional[Sequence[Tuple[Middleware, bool]]] - _Subapps = List["Application"] -else: - # No type checker mode, skip types - _AppSignal = Signal - _RespPrepareSignal = Signal - _Middlewares = FrozenList - _MiddlewaresHandlers = Optional[Sequence] - _Subapps = List - -_T = TypeVar("_T") -_U = TypeVar("_U") -_Resource = TypeVar("_Resource", bound=AbstractResource) - - -def _build_middlewares( - handler: Handler, apps: Tuple["Application", ...] -) -> Callable[[Request], Awaitable[StreamResponse]]: - """Apply middlewares to handler.""" - for app in apps[::-1]: - for m, _ in app._middlewares_handlers: # type: ignore[union-attr] - handler = update_wrapper(partial(m, handler=handler), handler) - return handler - - -_cached_build_middleware = lru_cache(maxsize=1024)(_build_middlewares) - - -class Application(MutableMapping[Union[str, AppKey[Any]], Any]): - ATTRS = frozenset( - [ - "logger", - "_debug", - "_router", - "_loop", - "_handler_args", - "_middlewares", - "_middlewares_handlers", - "_has_legacy_middlewares", - "_run_middlewares", - "_state", - "_frozen", - "_pre_frozen", - "_subapps", - "_on_response_prepare", - "_on_startup", - "_on_shutdown", - "_on_cleanup", - "_client_max_size", - "_cleanup_ctx", - ] - ) - - def __init__( - self, - *, - logger: logging.Logger = web_logger, - router: Optional[UrlDispatcher] = None, - middlewares: Iterable[Middleware] = (), - handler_args: Optional[Mapping[str, Any]] = None, - client_max_size: int = 1024**2, - loop: Optional[asyncio.AbstractEventLoop] = None, - debug: Any = ..., # mypy doesn't support ellipsis - ) -> None: - if router is None: - router = UrlDispatcher() - else: - warnings.warn( - "router argument is deprecated", DeprecationWarning, stacklevel=2 - ) - assert isinstance(router, AbstractRouter), router - - if loop is not None: - warnings.warn( - "loop argument is deprecated", DeprecationWarning, stacklevel=2 - ) - - if debug is not ...: - warnings.warn( - "debug argument is deprecated", DeprecationWarning, stacklevel=2 - ) - self._debug = debug - self._router: UrlDispatcher = router - self._loop = loop - self._handler_args = handler_args - self.logger = logger - - self._middlewares: _Middlewares = FrozenList(middlewares) - - # initialized on freezing - self._middlewares_handlers: _MiddlewaresHandlers = None - # initialized on freezing - self._run_middlewares: Optional[bool] = None - self._has_legacy_middlewares: bool = True - - self._state: Dict[Union[AppKey[Any], str], object] = {} - self._frozen = False - self._pre_frozen = False - self._subapps: _Subapps = [] - - self._on_response_prepare: _RespPrepareSignal = Signal(self) - self._on_startup: _AppSignal = Signal(self) - self._on_shutdown: _AppSignal = Signal(self) - self._on_cleanup: _AppSignal = Signal(self) - self._cleanup_ctx = CleanupContext() - self._on_startup.append(self._cleanup_ctx._on_startup) - self._on_cleanup.append(self._cleanup_ctx._on_cleanup) - self._client_max_size = client_max_size - - def __init_subclass__(cls: Type["Application"]) -> None: - warnings.warn( - "Inheritance class {} from web.Application " - "is discouraged".format(cls.__name__), - DeprecationWarning, - stacklevel=3, - ) - - if DEBUG: # pragma: no cover - - def __setattr__(self, name: str, val: Any) -> None: - if name not in self.ATTRS: - warnings.warn( - "Setting custom web.Application.{} attribute " - "is discouraged".format(name), - DeprecationWarning, - stacklevel=2, - ) - super().__setattr__(name, val) - - # MutableMapping API - - def __eq__(self, other: object) -> bool: - return self is other - - @overload # type: ignore[override] - def __getitem__(self, key: AppKey[_T]) -> _T: ... - - @overload - def __getitem__(self, key: str) -> Any: ... - - def __getitem__(self, key: Union[str, AppKey[_T]]) -> Any: - return self._state[key] - - def _check_frozen(self) -> None: - if self._frozen: - warnings.warn( - "Changing state of started or joined application is deprecated", - DeprecationWarning, - stacklevel=3, - ) - - @overload # type: ignore[override] - def __setitem__(self, key: AppKey[_T], value: _T) -> None: ... - - @overload - def __setitem__(self, key: str, value: Any) -> None: ... - - def __setitem__(self, key: Union[str, AppKey[_T]], value: Any) -> None: - self._check_frozen() - if not isinstance(key, AppKey): - warnings.warn( - "It is recommended to use web.AppKey instances for keys.\n" - + "https://docs.aiohttp.org/en/stable/web_advanced.html" - + "#application-s-config", - category=NotAppKeyWarning, - stacklevel=2, - ) - self._state[key] = value - - def __delitem__(self, key: Union[str, AppKey[_T]]) -> None: - self._check_frozen() - del self._state[key] - - def __len__(self) -> int: - return len(self._state) - - def __iter__(self) -> Iterator[Union[str, AppKey[Any]]]: - return iter(self._state) - - def __hash__(self) -> int: - return id(self) - - @overload # type: ignore[override] - def get(self, key: AppKey[_T], default: None = ...) -> Optional[_T]: ... - - @overload - def get(self, key: AppKey[_T], default: _U) -> Union[_T, _U]: ... - - @overload - def get(self, key: str, default: Any = ...) -> Any: ... - - def get(self, key: Union[str, AppKey[_T]], default: Any = None) -> Any: - return self._state.get(key, default) - - ######## - @property - def loop(self) -> asyncio.AbstractEventLoop: - # Technically the loop can be None - # but we mask it by explicit type cast - # to provide more convenient type annotation - warnings.warn("loop property is deprecated", DeprecationWarning, stacklevel=2) - return cast(asyncio.AbstractEventLoop, self._loop) - - def _set_loop(self, loop: Optional[asyncio.AbstractEventLoop]) -> None: - if loop is None: - loop = asyncio.get_event_loop() - if self._loop is not None and self._loop is not loop: - raise RuntimeError( - "web.Application instance initialized with different loop" - ) - - self._loop = loop - - # set loop debug - if self._debug is ...: - self._debug = loop.get_debug() - - # set loop to sub applications - for subapp in self._subapps: - subapp._set_loop(loop) - - @property - def pre_frozen(self) -> bool: - return self._pre_frozen - - def pre_freeze(self) -> None: - if self._pre_frozen: - return - - self._pre_frozen = True - self._middlewares.freeze() - self._router.freeze() - self._on_response_prepare.freeze() - self._cleanup_ctx.freeze() - self._on_startup.freeze() - self._on_shutdown.freeze() - self._on_cleanup.freeze() - self._middlewares_handlers = tuple(self._prepare_middleware()) - self._has_legacy_middlewares = any( - not new_style for _, new_style in self._middlewares_handlers - ) - - # If current app and any subapp do not have middlewares avoid run all - # of the code footprint that it implies, which have a middleware - # hardcoded per app that sets up the current_app attribute. If no - # middlewares are configured the handler will receive the proper - # current_app without needing all of this code. - self._run_middlewares = True if self.middlewares else False - - for subapp in self._subapps: - subapp.pre_freeze() - self._run_middlewares = self._run_middlewares or subapp._run_middlewares - - @property - def frozen(self) -> bool: - return self._frozen - - def freeze(self) -> None: - if self._frozen: - return - - self.pre_freeze() - self._frozen = True - for subapp in self._subapps: - subapp.freeze() - - @property - def debug(self) -> bool: - warnings.warn("debug property is deprecated", DeprecationWarning, stacklevel=2) - return self._debug # type: ignore[no-any-return] - - def _reg_subapp_signals(self, subapp: "Application") -> None: - def reg_handler(signame: str) -> None: - subsig = getattr(subapp, signame) - - async def handler(app: "Application") -> None: - await subsig.send(subapp) - - appsig = getattr(self, signame) - appsig.append(handler) - - reg_handler("on_startup") - reg_handler("on_shutdown") - reg_handler("on_cleanup") - - def add_subapp(self, prefix: str, subapp: "Application") -> PrefixedSubAppResource: - if not isinstance(prefix, str): - raise TypeError("Prefix must be str") - prefix = prefix.rstrip("/") - if not prefix: - raise ValueError("Prefix cannot be empty") - factory = partial(PrefixedSubAppResource, prefix, subapp) - return self._add_subapp(factory, subapp) - - def _add_subapp( - self, resource_factory: Callable[[], _Resource], subapp: "Application" - ) -> _Resource: - if self.frozen: - raise RuntimeError("Cannot add sub application to frozen application") - if subapp.frozen: - raise RuntimeError("Cannot add frozen application") - resource = resource_factory() - self.router.register_resource(resource) - self._reg_subapp_signals(subapp) - self._subapps.append(subapp) - subapp.pre_freeze() - if self._loop is not None: - subapp._set_loop(self._loop) - return resource - - def add_domain(self, domain: str, subapp: "Application") -> MatchedSubAppResource: - if not isinstance(domain, str): - raise TypeError("Domain must be str") - elif "*" in domain: - rule: Domain = MaskDomain(domain) - else: - rule = Domain(domain) - factory = partial(MatchedSubAppResource, rule, subapp) - return self._add_subapp(factory, subapp) - - def add_routes(self, routes: Iterable[AbstractRouteDef]) -> List[AbstractRoute]: - return self.router.add_routes(routes) - - @property - def on_response_prepare(self) -> _RespPrepareSignal: - return self._on_response_prepare - - @property - def on_startup(self) -> _AppSignal: - return self._on_startup - - @property - def on_shutdown(self) -> _AppSignal: - return self._on_shutdown - - @property - def on_cleanup(self) -> _AppSignal: - return self._on_cleanup - - @property - def cleanup_ctx(self) -> "CleanupContext": - return self._cleanup_ctx - - @property - def router(self) -> UrlDispatcher: - return self._router - - @property - def middlewares(self) -> _Middlewares: - return self._middlewares - - def _make_handler( - self, - *, - loop: Optional[asyncio.AbstractEventLoop] = None, - access_log_class: Type[AbstractAccessLogger] = AccessLogger, - **kwargs: Any, - ) -> Server: - - if not issubclass(access_log_class, AbstractAccessLogger): - raise TypeError( - "access_log_class must be subclass of " - "aiohttp.abc.AbstractAccessLogger, got {}".format(access_log_class) - ) - - self._set_loop(loop) - self.freeze() - - kwargs["debug"] = self._debug - kwargs["access_log_class"] = access_log_class - if self._handler_args: - for k, v in self._handler_args.items(): - kwargs[k] = v - - return Server( - self._handle, # type: ignore[arg-type] - request_factory=self._make_request, - loop=self._loop, - **kwargs, - ) - - def make_handler( - self, - *, - loop: Optional[asyncio.AbstractEventLoop] = None, - access_log_class: Type[AbstractAccessLogger] = AccessLogger, - **kwargs: Any, - ) -> Server: - - warnings.warn( - "Application.make_handler(...) is deprecated, use AppRunner API instead", - DeprecationWarning, - stacklevel=2, - ) - - return self._make_handler( - loop=loop, access_log_class=access_log_class, **kwargs - ) - - async def startup(self) -> None: - """Causes on_startup signal - - Should be called in the event loop along with the request handler. - """ - await self.on_startup.send(self) - - async def shutdown(self) -> None: - """Causes on_shutdown signal - - Should be called before cleanup() - """ - await self.on_shutdown.send(self) - - async def cleanup(self) -> None: - """Causes on_cleanup signal - - Should be called after shutdown() - """ - if self.on_cleanup.frozen: - await self.on_cleanup.send(self) - else: - # If an exception occurs in startup, ensure cleanup contexts are completed. - await self._cleanup_ctx._on_cleanup(self) - - def _make_request( - self, - message: RawRequestMessage, - payload: StreamReader, - protocol: RequestHandler, - writer: AbstractStreamWriter, - task: "asyncio.Task[None]", - _cls: Type[Request] = Request, - ) -> Request: - if TYPE_CHECKING: - assert self._loop is not None - return _cls( - message, - payload, - protocol, - writer, - task, - self._loop, - client_max_size=self._client_max_size, - ) - - def _prepare_middleware(self) -> Iterator[Tuple[Middleware, bool]]: - for m in reversed(self._middlewares): - if getattr(m, "__middleware_version__", None) == 1: - yield m, True - else: - warnings.warn( - f'old-style middleware "{m!r}" deprecated, see #2252', - DeprecationWarning, - stacklevel=2, - ) - yield m, False - - yield _fix_request_current_app(self), True - - async def _handle(self, request: Request) -> StreamResponse: - loop = asyncio.get_event_loop() - debug = loop.get_debug() - match_info = await self._router.resolve(request) - if debug: # pragma: no cover - if not isinstance(match_info, AbstractMatchInfo): - raise TypeError( - "match_info should be AbstractMatchInfo " - "instance, not {!r}".format(match_info) - ) - match_info.add_app(self) - - match_info.freeze() - - request._match_info = match_info - - if request.headers.get(hdrs.EXPECT): - resp = await match_info.expect_handler(request) - await request.writer.drain() - if resp is not None: - return resp - - handler = match_info.handler - - if self._run_middlewares: - # If its a SystemRoute, don't cache building the middlewares since - # they are constructed for every MatchInfoError as a new handler - # is made each time. - if not self._has_legacy_middlewares and not isinstance( - match_info.route, SystemRoute - ): - handler = _cached_build_middleware(handler, match_info.apps) - else: - for app in match_info.apps[::-1]: - for m, new_style in app._middlewares_handlers: # type: ignore[union-attr] - if new_style: - handler = update_wrapper( - partial(m, handler=handler), handler - ) - else: - handler = await m(app, handler) # type: ignore[arg-type,assignment] - - return await handler(request) - - def __call__(self) -> "Application": - """gunicorn compatibility""" - return self - - def __repr__(self) -> str: - return f"" - - def __bool__(self) -> bool: - return True - - -class CleanupError(RuntimeError): - @property - def exceptions(self) -> List[BaseException]: - return cast(List[BaseException], self.args[1]) - - -if TYPE_CHECKING: - _CleanupContextBase = FrozenList[Callable[[Application], AsyncIterator[None]]] -else: - _CleanupContextBase = FrozenList - - -class CleanupContext(_CleanupContextBase): - def __init__(self) -> None: - super().__init__() - self._exits: List[AsyncIterator[None]] = [] - - async def _on_startup(self, app: Application) -> None: - for cb in self: - it = cb(app).__aiter__() - await it.__anext__() - self._exits.append(it) - - async def _on_cleanup(self, app: Application) -> None: - errors = [] - for it in reversed(self._exits): - try: - await it.__anext__() - except StopAsyncIteration: - pass - except (Exception, asyncio.CancelledError) as exc: - errors.append(exc) - else: - errors.append(RuntimeError(f"{it!r} has more than one 'yield'")) - if errors: - if len(errors) == 1: - raise errors[0] - else: - raise CleanupError("Multiple errors on cleanup stage", errors) diff --git a/venv/lib/python3.12/site-packages/aiohttp/web_exceptions.py b/venv/lib/python3.12/site-packages/aiohttp/web_exceptions.py deleted file mode 100644 index ee2c1e7..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/web_exceptions.py +++ /dev/null @@ -1,452 +0,0 @@ -import warnings -from typing import Any, Dict, Iterable, List, Optional, Set # noqa - -from yarl import URL - -from .typedefs import LooseHeaders, StrOrURL -from .web_response import Response - -__all__ = ( - "HTTPException", - "HTTPError", - "HTTPRedirection", - "HTTPSuccessful", - "HTTPOk", - "HTTPCreated", - "HTTPAccepted", - "HTTPNonAuthoritativeInformation", - "HTTPNoContent", - "HTTPResetContent", - "HTTPPartialContent", - "HTTPMove", - "HTTPMultipleChoices", - "HTTPMovedPermanently", - "HTTPFound", - "HTTPSeeOther", - "HTTPNotModified", - "HTTPUseProxy", - "HTTPTemporaryRedirect", - "HTTPPermanentRedirect", - "HTTPClientError", - "HTTPBadRequest", - "HTTPUnauthorized", - "HTTPPaymentRequired", - "HTTPForbidden", - "HTTPNotFound", - "HTTPMethodNotAllowed", - "HTTPNotAcceptable", - "HTTPProxyAuthenticationRequired", - "HTTPRequestTimeout", - "HTTPConflict", - "HTTPGone", - "HTTPLengthRequired", - "HTTPPreconditionFailed", - "HTTPRequestEntityTooLarge", - "HTTPRequestURITooLong", - "HTTPUnsupportedMediaType", - "HTTPRequestRangeNotSatisfiable", - "HTTPExpectationFailed", - "HTTPMisdirectedRequest", - "HTTPUnprocessableEntity", - "HTTPFailedDependency", - "HTTPUpgradeRequired", - "HTTPPreconditionRequired", - "HTTPTooManyRequests", - "HTTPRequestHeaderFieldsTooLarge", - "HTTPUnavailableForLegalReasons", - "HTTPServerError", - "HTTPInternalServerError", - "HTTPNotImplemented", - "HTTPBadGateway", - "HTTPServiceUnavailable", - "HTTPGatewayTimeout", - "HTTPVersionNotSupported", - "HTTPVariantAlsoNegotiates", - "HTTPInsufficientStorage", - "HTTPNotExtended", - "HTTPNetworkAuthenticationRequired", -) - - -class NotAppKeyWarning(UserWarning): - """Warning when not using AppKey in Application.""" - - -############################################################ -# HTTP Exceptions -############################################################ - - -class HTTPException(Response, Exception): - - # You should set in subclasses: - # status = 200 - - status_code = -1 - empty_body = False - - __http_exception__ = True - - def __init__( - self, - *, - headers: Optional[LooseHeaders] = None, - reason: Optional[str] = None, - body: Any = None, - text: Optional[str] = None, - content_type: Optional[str] = None, - ) -> None: - if body is not None: - warnings.warn( - "body argument is deprecated for http web exceptions", - DeprecationWarning, - ) - Response.__init__( - self, - status=self.status_code, - headers=headers, - reason=reason, - body=body, - text=text, - content_type=content_type, - ) - Exception.__init__(self, self.reason) - if self.body is None and not self.empty_body: - self.text = f"{self.status}: {self.reason}" - - def __bool__(self) -> bool: - return True - - -class HTTPError(HTTPException): - """Base class for exceptions with status codes in the 400s and 500s.""" - - -class HTTPRedirection(HTTPException): - """Base class for exceptions with status codes in the 300s.""" - - -class HTTPSuccessful(HTTPException): - """Base class for exceptions with status codes in the 200s.""" - - -class HTTPOk(HTTPSuccessful): - status_code = 200 - - -class HTTPCreated(HTTPSuccessful): - status_code = 201 - - -class HTTPAccepted(HTTPSuccessful): - status_code = 202 - - -class HTTPNonAuthoritativeInformation(HTTPSuccessful): - status_code = 203 - - -class HTTPNoContent(HTTPSuccessful): - status_code = 204 - empty_body = True - - -class HTTPResetContent(HTTPSuccessful): - status_code = 205 - empty_body = True - - -class HTTPPartialContent(HTTPSuccessful): - status_code = 206 - - -############################################################ -# 3xx redirection -############################################################ - - -class HTTPMove(HTTPRedirection): - def __init__( - self, - location: StrOrURL, - *, - headers: Optional[LooseHeaders] = None, - reason: Optional[str] = None, - body: Any = None, - text: Optional[str] = None, - content_type: Optional[str] = None, - ) -> None: - if not location: - raise ValueError("HTTP redirects need a location to redirect to.") - super().__init__( - headers=headers, - reason=reason, - body=body, - text=text, - content_type=content_type, - ) - self.headers["Location"] = str(URL(location)) - self.location = location - - -class HTTPMultipleChoices(HTTPMove): - status_code = 300 - - -class HTTPMovedPermanently(HTTPMove): - status_code = 301 - - -class HTTPFound(HTTPMove): - status_code = 302 - - -# This one is safe after a POST (the redirected location will be -# retrieved with GET): -class HTTPSeeOther(HTTPMove): - status_code = 303 - - -class HTTPNotModified(HTTPRedirection): - # FIXME: this should include a date or etag header - status_code = 304 - empty_body = True - - -class HTTPUseProxy(HTTPMove): - # Not a move, but looks a little like one - status_code = 305 - - -class HTTPTemporaryRedirect(HTTPMove): - status_code = 307 - - -class HTTPPermanentRedirect(HTTPMove): - status_code = 308 - - -############################################################ -# 4xx client error -############################################################ - - -class HTTPClientError(HTTPError): - pass - - -class HTTPBadRequest(HTTPClientError): - status_code = 400 - - -class HTTPUnauthorized(HTTPClientError): - status_code = 401 - - -class HTTPPaymentRequired(HTTPClientError): - status_code = 402 - - -class HTTPForbidden(HTTPClientError): - status_code = 403 - - -class HTTPNotFound(HTTPClientError): - status_code = 404 - - -class HTTPMethodNotAllowed(HTTPClientError): - status_code = 405 - - def __init__( - self, - method: str, - allowed_methods: Iterable[str], - *, - headers: Optional[LooseHeaders] = None, - reason: Optional[str] = None, - body: Any = None, - text: Optional[str] = None, - content_type: Optional[str] = None, - ) -> None: - allow = ",".join(sorted(allowed_methods)) - super().__init__( - headers=headers, - reason=reason, - body=body, - text=text, - content_type=content_type, - ) - self.headers["Allow"] = allow - self.allowed_methods: Set[str] = set(allowed_methods) - self.method = method.upper() - - -class HTTPNotAcceptable(HTTPClientError): - status_code = 406 - - -class HTTPProxyAuthenticationRequired(HTTPClientError): - status_code = 407 - - -class HTTPRequestTimeout(HTTPClientError): - status_code = 408 - - -class HTTPConflict(HTTPClientError): - status_code = 409 - - -class HTTPGone(HTTPClientError): - status_code = 410 - - -class HTTPLengthRequired(HTTPClientError): - status_code = 411 - - -class HTTPPreconditionFailed(HTTPClientError): - status_code = 412 - - -class HTTPRequestEntityTooLarge(HTTPClientError): - status_code = 413 - - def __init__(self, max_size: float, actual_size: float, **kwargs: Any) -> None: - kwargs.setdefault( - "text", - "Maximum request body size {} exceeded, " - "actual body size {}".format(max_size, actual_size), - ) - super().__init__(**kwargs) - - -class HTTPRequestURITooLong(HTTPClientError): - status_code = 414 - - -class HTTPUnsupportedMediaType(HTTPClientError): - status_code = 415 - - -class HTTPRequestRangeNotSatisfiable(HTTPClientError): - status_code = 416 - - -class HTTPExpectationFailed(HTTPClientError): - status_code = 417 - - -class HTTPMisdirectedRequest(HTTPClientError): - status_code = 421 - - -class HTTPUnprocessableEntity(HTTPClientError): - status_code = 422 - - -class HTTPFailedDependency(HTTPClientError): - status_code = 424 - - -class HTTPUpgradeRequired(HTTPClientError): - status_code = 426 - - -class HTTPPreconditionRequired(HTTPClientError): - status_code = 428 - - -class HTTPTooManyRequests(HTTPClientError): - status_code = 429 - - -class HTTPRequestHeaderFieldsTooLarge(HTTPClientError): - status_code = 431 - - -class HTTPUnavailableForLegalReasons(HTTPClientError): - status_code = 451 - - def __init__( - self, - link: Optional[StrOrURL], - *, - headers: Optional[LooseHeaders] = None, - reason: Optional[str] = None, - body: Any = None, - text: Optional[str] = None, - content_type: Optional[str] = None, - ) -> None: - super().__init__( - headers=headers, - reason=reason, - body=body, - text=text, - content_type=content_type, - ) - self._link = None - if link: - self._link = URL(link) - self.headers["Link"] = f'<{str(self._link)}>; rel="blocked-by"' - - @property - def link(self) -> Optional[URL]: - return self._link - - -############################################################ -# 5xx Server Error -############################################################ -# Response status codes beginning with the digit "5" indicate cases in -# which the server is aware that it has erred or is incapable of -# performing the request. Except when responding to a HEAD request, the -# server SHOULD include an entity containing an explanation of the error -# situation, and whether it is a temporary or permanent condition. User -# agents SHOULD display any included entity to the user. These response -# codes are applicable to any request method. - - -class HTTPServerError(HTTPError): - pass - - -class HTTPInternalServerError(HTTPServerError): - status_code = 500 - - -class HTTPNotImplemented(HTTPServerError): - status_code = 501 - - -class HTTPBadGateway(HTTPServerError): - status_code = 502 - - -class HTTPServiceUnavailable(HTTPServerError): - status_code = 503 - - -class HTTPGatewayTimeout(HTTPServerError): - status_code = 504 - - -class HTTPVersionNotSupported(HTTPServerError): - status_code = 505 - - -class HTTPVariantAlsoNegotiates(HTTPServerError): - status_code = 506 - - -class HTTPInsufficientStorage(HTTPServerError): - status_code = 507 - - -class HTTPNotExtended(HTTPServerError): - status_code = 510 - - -class HTTPNetworkAuthenticationRequired(HTTPServerError): - status_code = 511 diff --git a/venv/lib/python3.12/site-packages/aiohttp/web_fileresponse.py b/venv/lib/python3.12/site-packages/aiohttp/web_fileresponse.py deleted file mode 100644 index 344611c..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/web_fileresponse.py +++ /dev/null @@ -1,418 +0,0 @@ -import asyncio -import io -import os -import pathlib -import sys -from contextlib import suppress -from enum import Enum, auto -from mimetypes import MimeTypes -from stat import S_ISREG -from types import MappingProxyType -from typing import ( # noqa - IO, - TYPE_CHECKING, - Any, - Awaitable, - Callable, - Final, - Iterator, - List, - Optional, - Set, - Tuple, - Union, - cast, -) - -from . import hdrs -from .abc import AbstractStreamWriter -from .helpers import ETAG_ANY, ETag, must_be_empty_body -from .typedefs import LooseHeaders, PathLike -from .web_exceptions import ( - HTTPForbidden, - HTTPNotFound, - HTTPNotModified, - HTTPPartialContent, - HTTPPreconditionFailed, - HTTPRequestRangeNotSatisfiable, -) -from .web_response import StreamResponse - -__all__ = ("FileResponse",) - -if TYPE_CHECKING: - from .web_request import BaseRequest - - -_T_OnChunkSent = Optional[Callable[[bytes], Awaitable[None]]] - - -NOSENDFILE: Final[bool] = bool(os.environ.get("AIOHTTP_NOSENDFILE")) - -CONTENT_TYPES: Final[MimeTypes] = MimeTypes() - -# File extension to IANA encodings map that will be checked in the order defined. -ENCODING_EXTENSIONS = MappingProxyType( - {ext: CONTENT_TYPES.encodings_map[ext] for ext in (".br", ".gz")} -) - -FALLBACK_CONTENT_TYPE = "application/octet-stream" - -# Provide additional MIME type/extension pairs to be recognized. -# https://en.wikipedia.org/wiki/List_of_archive_formats#Compression_only -ADDITIONAL_CONTENT_TYPES = MappingProxyType( - { - "application/gzip": ".gz", - "application/x-brotli": ".br", - "application/x-bzip2": ".bz2", - "application/x-compress": ".Z", - "application/x-xz": ".xz", - } -) - - -class _FileResponseResult(Enum): - """The result of the file response.""" - - SEND_FILE = auto() # Ie a regular file to send - NOT_ACCEPTABLE = auto() # Ie a socket, or non-regular file - PRE_CONDITION_FAILED = auto() # Ie If-Match or If-None-Match failed - NOT_MODIFIED = auto() # 304 Not Modified - - -# Add custom pairs and clear the encodings map so guess_type ignores them. -CONTENT_TYPES.encodings_map.clear() -for content_type, extension in ADDITIONAL_CONTENT_TYPES.items(): - CONTENT_TYPES.add_type(content_type, extension) - - -_CLOSE_FUTURES: Set[asyncio.Future[None]] = set() - - -class FileResponse(StreamResponse): - """A response object can be used to send files.""" - - def __init__( - self, - path: PathLike, - chunk_size: int = 256 * 1024, - status: int = 200, - reason: Optional[str] = None, - headers: Optional[LooseHeaders] = None, - ) -> None: - super().__init__(status=status, reason=reason, headers=headers) - - self._path = pathlib.Path(path) - self._chunk_size = chunk_size - - def _seek_and_read(self, fobj: IO[Any], offset: int, chunk_size: int) -> bytes: - fobj.seek(offset) - return fobj.read(chunk_size) # type: ignore[no-any-return] - - async def _sendfile_fallback( - self, writer: AbstractStreamWriter, fobj: IO[Any], offset: int, count: int - ) -> AbstractStreamWriter: - # To keep memory usage low,fobj is transferred in chunks - # controlled by the constructor's chunk_size argument. - - chunk_size = self._chunk_size - loop = asyncio.get_event_loop() - chunk = await loop.run_in_executor( - None, self._seek_and_read, fobj, offset, chunk_size - ) - while chunk: - await writer.write(chunk) - count = count - chunk_size - if count <= 0: - break - chunk = await loop.run_in_executor(None, fobj.read, min(chunk_size, count)) - - await writer.drain() - return writer - - async def _sendfile( - self, request: "BaseRequest", fobj: IO[Any], offset: int, count: int - ) -> AbstractStreamWriter: - writer = await super().prepare(request) - assert writer is not None - - if NOSENDFILE or self.compression: - return await self._sendfile_fallback(writer, fobj, offset, count) - - loop = request._loop - transport = request.transport - assert transport is not None - - try: - await loop.sendfile(transport, fobj, offset, count) - except NotImplementedError: - return await self._sendfile_fallback(writer, fobj, offset, count) - - await super().write_eof() - return writer - - @staticmethod - def _etag_match(etag_value: str, etags: Tuple[ETag, ...], *, weak: bool) -> bool: - if len(etags) == 1 and etags[0].value == ETAG_ANY: - return True - return any( - etag.value == etag_value for etag in etags if weak or not etag.is_weak - ) - - async def _not_modified( - self, request: "BaseRequest", etag_value: str, last_modified: float - ) -> Optional[AbstractStreamWriter]: - self.set_status(HTTPNotModified.status_code) - self._length_check = False - self.etag = etag_value # type: ignore[assignment] - self.last_modified = last_modified # type: ignore[assignment] - # Delete any Content-Length headers provided by user. HTTP 304 - # should always have empty response body - return await super().prepare(request) - - async def _precondition_failed( - self, request: "BaseRequest" - ) -> Optional[AbstractStreamWriter]: - self.set_status(HTTPPreconditionFailed.status_code) - self.content_length = 0 - return await super().prepare(request) - - def _make_response( - self, request: "BaseRequest", accept_encoding: str - ) -> Tuple[ - _FileResponseResult, Optional[io.BufferedReader], os.stat_result, Optional[str] - ]: - """Return the response result, io object, stat result, and encoding. - - If an uncompressed file is returned, the encoding is set to - :py:data:`None`. - - This method should be called from a thread executor - since it calls os.stat which may block. - """ - file_path, st, file_encoding = self._get_file_path_stat_encoding( - accept_encoding - ) - if not file_path: - return _FileResponseResult.NOT_ACCEPTABLE, None, st, None - - etag_value = f"{st.st_mtime_ns:x}-{st.st_size:x}" - - # https://www.rfc-editor.org/rfc/rfc9110#section-13.1.1-2 - if (ifmatch := request.if_match) is not None and not self._etag_match( - etag_value, ifmatch, weak=False - ): - return _FileResponseResult.PRE_CONDITION_FAILED, None, st, file_encoding - - if ( - (unmodsince := request.if_unmodified_since) is not None - and ifmatch is None - and st.st_mtime > unmodsince.timestamp() - ): - return _FileResponseResult.PRE_CONDITION_FAILED, None, st, file_encoding - - # https://www.rfc-editor.org/rfc/rfc9110#section-13.1.2-2 - if (ifnonematch := request.if_none_match) is not None and self._etag_match( - etag_value, ifnonematch, weak=True - ): - return _FileResponseResult.NOT_MODIFIED, None, st, file_encoding - - if ( - (modsince := request.if_modified_since) is not None - and ifnonematch is None - and st.st_mtime <= modsince.timestamp() - ): - return _FileResponseResult.NOT_MODIFIED, None, st, file_encoding - - fobj = file_path.open("rb") - with suppress(OSError): - # fstat() may not be available on all platforms - # Once we open the file, we want the fstat() to ensure - # the file has not changed between the first stat() - # and the open(). - st = os.stat(fobj.fileno()) - return _FileResponseResult.SEND_FILE, fobj, st, file_encoding - - def _get_file_path_stat_encoding( - self, accept_encoding: str - ) -> Tuple[Optional[pathlib.Path], os.stat_result, Optional[str]]: - file_path = self._path - for file_extension, file_encoding in ENCODING_EXTENSIONS.items(): - if file_encoding not in accept_encoding: - continue - - compressed_path = file_path.with_suffix(file_path.suffix + file_extension) - with suppress(OSError): - # Do not follow symlinks and ignore any non-regular files. - st = compressed_path.lstat() - if S_ISREG(st.st_mode): - return compressed_path, st, file_encoding - - # Fallback to the uncompressed file - st = file_path.stat() - return file_path if S_ISREG(st.st_mode) else None, st, None - - async def prepare(self, request: "BaseRequest") -> Optional[AbstractStreamWriter]: - loop = asyncio.get_running_loop() - # Encoding comparisons should be case-insensitive - # https://www.rfc-editor.org/rfc/rfc9110#section-8.4.1 - accept_encoding = request.headers.get(hdrs.ACCEPT_ENCODING, "").lower() - try: - response_result, fobj, st, file_encoding = await loop.run_in_executor( - None, self._make_response, request, accept_encoding - ) - except PermissionError: - self.set_status(HTTPForbidden.status_code) - return await super().prepare(request) - except OSError: - # Most likely to be FileNotFoundError or OSError for circular - # symlinks in python >= 3.13, so respond with 404. - self.set_status(HTTPNotFound.status_code) - return await super().prepare(request) - - # Forbid special files like sockets, pipes, devices, etc. - if response_result is _FileResponseResult.NOT_ACCEPTABLE: - self.set_status(HTTPForbidden.status_code) - return await super().prepare(request) - - if response_result is _FileResponseResult.PRE_CONDITION_FAILED: - return await self._precondition_failed(request) - - if response_result is _FileResponseResult.NOT_MODIFIED: - etag_value = f"{st.st_mtime_ns:x}-{st.st_size:x}" - last_modified = st.st_mtime - return await self._not_modified(request, etag_value, last_modified) - - assert fobj is not None - try: - return await self._prepare_open_file(request, fobj, st, file_encoding) - finally: - # We do not await here because we do not want to wait - # for the executor to finish before returning the response - # so the connection can begin servicing another request - # as soon as possible. - close_future = loop.run_in_executor(None, fobj.close) - # Hold a strong reference to the future to prevent it from being - # garbage collected before it completes. - _CLOSE_FUTURES.add(close_future) - close_future.add_done_callback(_CLOSE_FUTURES.remove) - - async def _prepare_open_file( - self, - request: "BaseRequest", - fobj: io.BufferedReader, - st: os.stat_result, - file_encoding: Optional[str], - ) -> Optional[AbstractStreamWriter]: - status = self._status - file_size: int = st.st_size - file_mtime: float = st.st_mtime - count: int = file_size - start: Optional[int] = None - - if (ifrange := request.if_range) is None or file_mtime <= ifrange.timestamp(): - # If-Range header check: - # condition = cached date >= last modification date - # return 206 if True else 200. - # if False: - # Range header would not be processed, return 200 - # if True but Range header missing - # return 200 - try: - rng = request.http_range - start = rng.start - end: Optional[int] = rng.stop - except ValueError: - # https://tools.ietf.org/html/rfc7233: - # A server generating a 416 (Range Not Satisfiable) response to - # a byte-range request SHOULD send a Content-Range header field - # with an unsatisfied-range value. - # The complete-length in a 416 response indicates the current - # length of the selected representation. - # - # Will do the same below. Many servers ignore this and do not - # send a Content-Range header with HTTP 416 - self._headers[hdrs.CONTENT_RANGE] = f"bytes */{file_size}" - self.set_status(HTTPRequestRangeNotSatisfiable.status_code) - return await super().prepare(request) - - # If a range request has been made, convert start, end slice - # notation into file pointer offset and count - if start is not None: - if start < 0 and end is None: # return tail of file - start += file_size - if start < 0: - # if Range:bytes=-1000 in request header but file size - # is only 200, there would be trouble without this - start = 0 - count = file_size - start - else: - # rfc7233:If the last-byte-pos value is - # absent, or if the value is greater than or equal to - # the current length of the representation data, - # the byte range is interpreted as the remainder - # of the representation (i.e., the server replaces the - # value of last-byte-pos with a value that is one less than - # the current length of the selected representation). - count = ( - min(end if end is not None else file_size, file_size) - start - ) - - if start >= file_size: - # HTTP 416 should be returned in this case. - # - # According to https://tools.ietf.org/html/rfc7233: - # If a valid byte-range-set includes at least one - # byte-range-spec with a first-byte-pos that is less than - # the current length of the representation, or at least one - # suffix-byte-range-spec with a non-zero suffix-length, - # then the byte-range-set is satisfiable. Otherwise, the - # byte-range-set is unsatisfiable. - self._headers[hdrs.CONTENT_RANGE] = f"bytes */{file_size}" - self.set_status(HTTPRequestRangeNotSatisfiable.status_code) - return await super().prepare(request) - - status = HTTPPartialContent.status_code - # Even though you are sending the whole file, you should still - # return a HTTP 206 for a Range request. - self.set_status(status) - - # If the Content-Type header is not already set, guess it based on the - # extension of the request path. The encoding returned by guess_type - # can be ignored since the map was cleared above. - if hdrs.CONTENT_TYPE not in self._headers: - if sys.version_info >= (3, 13): - guesser = CONTENT_TYPES.guess_file_type - else: - guesser = CONTENT_TYPES.guess_type - self.content_type = guesser(self._path)[0] or FALLBACK_CONTENT_TYPE - - if file_encoding: - self._headers[hdrs.CONTENT_ENCODING] = file_encoding - self._headers[hdrs.VARY] = hdrs.ACCEPT_ENCODING - # Disable compression if we are already sending - # a compressed file since we don't want to double - # compress. - self._compression = False - - self.etag = f"{st.st_mtime_ns:x}-{st.st_size:x}" # type: ignore[assignment] - self.last_modified = file_mtime # type: ignore[assignment] - self.content_length = count - - self._headers[hdrs.ACCEPT_RANGES] = "bytes" - - if status == HTTPPartialContent.status_code: - real_start = start - assert real_start is not None - self._headers[hdrs.CONTENT_RANGE] = "bytes {}-{}/{}".format( - real_start, real_start + count - 1, file_size - ) - - # If we are sending 0 bytes calling sendfile() will throw a ValueError - if count == 0 or must_be_empty_body(request.method, status): - return await super().prepare(request) - - # be aware that start could be None or int=0 here. - offset = start or 0 - - return await self._sendfile(request, fobj, offset, count) diff --git a/venv/lib/python3.12/site-packages/aiohttp/web_log.py b/venv/lib/python3.12/site-packages/aiohttp/web_log.py deleted file mode 100644 index d5ea2be..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/web_log.py +++ /dev/null @@ -1,216 +0,0 @@ -import datetime -import functools -import logging -import os -import re -import time as time_mod -from collections import namedtuple -from typing import Any, Callable, Dict, Iterable, List, Tuple # noqa - -from .abc import AbstractAccessLogger -from .web_request import BaseRequest -from .web_response import StreamResponse - -KeyMethod = namedtuple("KeyMethod", "key method") - - -class AccessLogger(AbstractAccessLogger): - """Helper object to log access. - - Usage: - log = logging.getLogger("spam") - log_format = "%a %{User-Agent}i" - access_logger = AccessLogger(log, log_format) - access_logger.log(request, response, time) - - Format: - %% The percent sign - %a Remote IP-address (IP-address of proxy if using reverse proxy) - %t Time when the request was started to process - %P The process ID of the child that serviced the request - %r First line of request - %s Response status code - %b Size of response in bytes, including HTTP headers - %T Time taken to serve the request, in seconds - %Tf Time taken to serve the request, in seconds with floating fraction - in .06f format - %D Time taken to serve the request, in microseconds - %{FOO}i request.headers['FOO'] - %{FOO}o response.headers['FOO'] - %{FOO}e os.environ['FOO'] - - """ - - LOG_FORMAT_MAP = { - "a": "remote_address", - "t": "request_start_time", - "P": "process_id", - "r": "first_request_line", - "s": "response_status", - "b": "response_size", - "T": "request_time", - "Tf": "request_time_frac", - "D": "request_time_micro", - "i": "request_header", - "o": "response_header", - } - - LOG_FORMAT = '%a %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"' - FORMAT_RE = re.compile(r"%(\{([A-Za-z0-9\-_]+)\}([ioe])|[atPrsbOD]|Tf?)") - CLEANUP_RE = re.compile(r"(%[^s])") - _FORMAT_CACHE: Dict[str, Tuple[str, List[KeyMethod]]] = {} - - def __init__(self, logger: logging.Logger, log_format: str = LOG_FORMAT) -> None: - """Initialise the logger. - - logger is a logger object to be used for logging. - log_format is a string with apache compatible log format description. - - """ - super().__init__(logger, log_format=log_format) - - _compiled_format = AccessLogger._FORMAT_CACHE.get(log_format) - if not _compiled_format: - _compiled_format = self.compile_format(log_format) - AccessLogger._FORMAT_CACHE[log_format] = _compiled_format - - self._log_format, self._methods = _compiled_format - - def compile_format(self, log_format: str) -> Tuple[str, List[KeyMethod]]: - """Translate log_format into form usable by modulo formatting - - All known atoms will be replaced with %s - Also methods for formatting of those atoms will be added to - _methods in appropriate order - - For example we have log_format = "%a %t" - This format will be translated to "%s %s" - Also contents of _methods will be - [self._format_a, self._format_t] - These method will be called and results will be passed - to translated string format. - - Each _format_* method receive 'args' which is list of arguments - given to self.log - - Exceptions are _format_e, _format_i and _format_o methods which - also receive key name (by functools.partial) - - """ - # list of (key, method) tuples, we don't use an OrderedDict as users - # can repeat the same key more than once - methods = list() - - for atom in self.FORMAT_RE.findall(log_format): - if atom[1] == "": - format_key1 = self.LOG_FORMAT_MAP[atom[0]] - m = getattr(AccessLogger, "_format_%s" % atom[0]) - key_method = KeyMethod(format_key1, m) - else: - format_key2 = (self.LOG_FORMAT_MAP[atom[2]], atom[1]) - m = getattr(AccessLogger, "_format_%s" % atom[2]) - key_method = KeyMethod(format_key2, functools.partial(m, atom[1])) - - methods.append(key_method) - - log_format = self.FORMAT_RE.sub(r"%s", log_format) - log_format = self.CLEANUP_RE.sub(r"%\1", log_format) - return log_format, methods - - @staticmethod - def _format_i( - key: str, request: BaseRequest, response: StreamResponse, time: float - ) -> str: - if request is None: - return "(no headers)" - - # suboptimal, make istr(key) once - return request.headers.get(key, "-") - - @staticmethod - def _format_o( - key: str, request: BaseRequest, response: StreamResponse, time: float - ) -> str: - # suboptimal, make istr(key) once - return response.headers.get(key, "-") - - @staticmethod - def _format_a(request: BaseRequest, response: StreamResponse, time: float) -> str: - if request is None: - return "-" - ip = request.remote - return ip if ip is not None else "-" - - @staticmethod - def _format_t(request: BaseRequest, response: StreamResponse, time: float) -> str: - tz = datetime.timezone(datetime.timedelta(seconds=-time_mod.timezone)) - now = datetime.datetime.now(tz) - start_time = now - datetime.timedelta(seconds=time) - return start_time.strftime("[%d/%b/%Y:%H:%M:%S %z]") - - @staticmethod - def _format_P(request: BaseRequest, response: StreamResponse, time: float) -> str: - return "<%s>" % os.getpid() - - @staticmethod - def _format_r(request: BaseRequest, response: StreamResponse, time: float) -> str: - if request is None: - return "-" - return "{} {} HTTP/{}.{}".format( - request.method, - request.path_qs, - request.version.major, - request.version.minor, - ) - - @staticmethod - def _format_s(request: BaseRequest, response: StreamResponse, time: float) -> int: - return response.status - - @staticmethod - def _format_b(request: BaseRequest, response: StreamResponse, time: float) -> int: - return response.body_length - - @staticmethod - def _format_T(request: BaseRequest, response: StreamResponse, time: float) -> str: - return str(round(time)) - - @staticmethod - def _format_Tf(request: BaseRequest, response: StreamResponse, time: float) -> str: - return "%06f" % time - - @staticmethod - def _format_D(request: BaseRequest, response: StreamResponse, time: float) -> str: - return str(round(time * 1000000)) - - def _format_line( - self, request: BaseRequest, response: StreamResponse, time: float - ) -> Iterable[Tuple[str, Callable[[BaseRequest, StreamResponse, float], str]]]: - return [(key, method(request, response, time)) for key, method in self._methods] - - @property - def enabled(self) -> bool: - """Check if logger is enabled.""" - # Avoid formatting the log line if it will not be emitted. - return self.logger.isEnabledFor(logging.INFO) - - def log(self, request: BaseRequest, response: StreamResponse, time: float) -> None: - try: - fmt_info = self._format_line(request, response, time) - - values = list() - extra = dict() - for key, value in fmt_info: - values.append(value) - - if key.__class__ is str: - extra[key] = value - else: - k1, k2 = key # type: ignore[misc] - dct = extra.get(k1, {}) # type: ignore[var-annotated,has-type] - dct[k2] = value # type: ignore[index,has-type] - extra[k1] = dct # type: ignore[has-type,assignment] - - self.logger.info(self._log_format % tuple(values), extra=extra) - except Exception: - self.logger.exception("Error in logging") diff --git a/venv/lib/python3.12/site-packages/aiohttp/web_middlewares.py b/venv/lib/python3.12/site-packages/aiohttp/web_middlewares.py deleted file mode 100644 index 2f1f5f5..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/web_middlewares.py +++ /dev/null @@ -1,121 +0,0 @@ -import re -from typing import TYPE_CHECKING, Tuple, Type, TypeVar - -from .typedefs import Handler, Middleware -from .web_exceptions import HTTPMove, HTTPPermanentRedirect -from .web_request import Request -from .web_response import StreamResponse -from .web_urldispatcher import SystemRoute - -__all__ = ( - "middleware", - "normalize_path_middleware", -) - -if TYPE_CHECKING: - from .web_app import Application - -_Func = TypeVar("_Func") - - -async def _check_request_resolves(request: Request, path: str) -> Tuple[bool, Request]: - alt_request = request.clone(rel_url=path) - - match_info = await request.app.router.resolve(alt_request) - alt_request._match_info = match_info - - if match_info.http_exception is None: - return True, alt_request - - return False, request - - -def middleware(f: _Func) -> _Func: - f.__middleware_version__ = 1 # type: ignore[attr-defined] - return f - - -def normalize_path_middleware( - *, - append_slash: bool = True, - remove_slash: bool = False, - merge_slashes: bool = True, - redirect_class: Type[HTTPMove] = HTTPPermanentRedirect, -) -> Middleware: - """Factory for producing a middleware that normalizes the path of a request. - - Normalizing means: - - Add or remove a trailing slash to the path. - - Double slashes are replaced by one. - - The middleware returns as soon as it finds a path that resolves - correctly. The order if both merge and append/remove are enabled is - 1) merge slashes - 2) append/remove slash - 3) both merge slashes and append/remove slash. - If the path resolves with at least one of those conditions, it will - redirect to the new path. - - Only one of `append_slash` and `remove_slash` can be enabled. If both - are `True` the factory will raise an assertion error - - If `append_slash` is `True` the middleware will append a slash when - needed. If a resource is defined with trailing slash and the request - comes without it, it will append it automatically. - - If `remove_slash` is `True`, `append_slash` must be `False`. When enabled - the middleware will remove trailing slashes and redirect if the resource - is defined - - If merge_slashes is True, merge multiple consecutive slashes in the - path into one. - """ - correct_configuration = not (append_slash and remove_slash) - assert correct_configuration, "Cannot both remove and append slash" - - @middleware - async def impl(request: Request, handler: Handler) -> StreamResponse: - if isinstance(request.match_info.route, SystemRoute): - paths_to_check = [] - if "?" in request.raw_path: - path, query = request.raw_path.split("?", 1) - query = "?" + query - else: - query = "" - path = request.raw_path - - if merge_slashes: - paths_to_check.append(re.sub("//+", "/", path)) - if append_slash and not request.path.endswith("/"): - paths_to_check.append(path + "/") - if remove_slash and request.path.endswith("/"): - paths_to_check.append(path[:-1]) - if merge_slashes and append_slash: - paths_to_check.append(re.sub("//+", "/", path + "/")) - if merge_slashes and remove_slash: - merged_slashes = re.sub("//+", "/", path) - paths_to_check.append(merged_slashes[:-1]) - - for path in paths_to_check: - path = re.sub("^//+", "/", path) # SECURITY: GHSA-v6wp-4m6f-gcjg - resolves, request = await _check_request_resolves(request, path) - if resolves: - raise redirect_class(request.raw_path + query) - - return await handler(request) - - return impl - - -def _fix_request_current_app(app: "Application") -> Middleware: - @middleware - async def impl(request: Request, handler: Handler) -> StreamResponse: - match_info = request.match_info - prev = match_info.current_app - match_info.current_app = app - try: - return await handler(request) - finally: - match_info.current_app = prev - - return impl diff --git a/venv/lib/python3.12/site-packages/aiohttp/web_protocol.py b/venv/lib/python3.12/site-packages/aiohttp/web_protocol.py deleted file mode 100644 index e1923aa..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/web_protocol.py +++ /dev/null @@ -1,792 +0,0 @@ -import asyncio -import asyncio.streams -import sys -import traceback -import warnings -from collections import deque -from contextlib import suppress -from html import escape as html_escape -from http import HTTPStatus -from logging import Logger -from typing import ( - TYPE_CHECKING, - Any, - Awaitable, - Callable, - Deque, - Optional, - Sequence, - Tuple, - Type, - Union, - cast, -) - -import attr -import yarl -from propcache import under_cached_property - -from .abc import AbstractAccessLogger, AbstractStreamWriter -from .base_protocol import BaseProtocol -from .helpers import ceil_timeout -from .http import ( - HttpProcessingError, - HttpRequestParser, - HttpVersion10, - RawRequestMessage, - StreamWriter, -) -from .http_exceptions import BadHttpMethod -from .log import access_logger, server_logger -from .streams import EMPTY_PAYLOAD, StreamReader -from .tcp_helpers import tcp_keepalive -from .web_exceptions import HTTPException, HTTPInternalServerError -from .web_log import AccessLogger -from .web_request import BaseRequest -from .web_response import Response, StreamResponse - -__all__ = ("RequestHandler", "RequestPayloadError", "PayloadAccessError") - -if TYPE_CHECKING: - import ssl - - from .web_server import Server - - -_RequestFactory = Callable[ - [ - RawRequestMessage, - StreamReader, - "RequestHandler", - AbstractStreamWriter, - "asyncio.Task[None]", - ], - BaseRequest, -] - -_RequestHandler = Callable[[BaseRequest], Awaitable[StreamResponse]] - -ERROR = RawRequestMessage( - "UNKNOWN", - "/", - HttpVersion10, - {}, # type: ignore[arg-type] - {}, # type: ignore[arg-type] - True, - None, - False, - False, - yarl.URL("/"), -) - - -class RequestPayloadError(Exception): - """Payload parsing error.""" - - -class PayloadAccessError(Exception): - """Payload was accessed after response was sent.""" - - -_PAYLOAD_ACCESS_ERROR = PayloadAccessError() - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class _ErrInfo: - status: int - exc: BaseException - message: str - - -_MsgType = Tuple[Union[RawRequestMessage, _ErrInfo], StreamReader] - - -class RequestHandler(BaseProtocol): - """HTTP protocol implementation. - - RequestHandler handles incoming HTTP request. It reads request line, - request headers and request payload and calls handle_request() method. - By default it always returns with 404 response. - - RequestHandler handles errors in incoming request, like bad - status line, bad headers or incomplete payload. If any error occurs, - connection gets closed. - - keepalive_timeout -- number of seconds before closing - keep-alive connection - - tcp_keepalive -- TCP keep-alive is on, default is on - - debug -- enable debug mode - - logger -- custom logger object - - access_log_class -- custom class for access_logger - - access_log -- custom logging object - - access_log_format -- access log format string - - loop -- Optional event loop - - max_line_size -- Optional maximum header line size - - max_field_size -- Optional maximum header field size - - max_headers -- Optional maximum header size - - timeout_ceil_threshold -- Optional value to specify - threshold to ceil() timeout - values - - """ - - __slots__ = ( - "_request_count", - "_keepalive", - "_manager", - "_request_handler", - "_request_factory", - "_tcp_keepalive", - "_next_keepalive_close_time", - "_keepalive_handle", - "_keepalive_timeout", - "_lingering_time", - "_messages", - "_message_tail", - "_handler_waiter", - "_waiter", - "_task_handler", - "_upgrade", - "_payload_parser", - "_request_parser", - "_reading_paused", - "logger", - "debug", - "access_log", - "access_logger", - "_close", - "_force_close", - "_current_request", - "_timeout_ceil_threshold", - "_request_in_progress", - "_logging_enabled", - "_cache", - ) - - def __init__( - self, - manager: "Server", - *, - loop: asyncio.AbstractEventLoop, - # Default should be high enough that it's likely longer than a reverse proxy. - keepalive_timeout: float = 3630, - tcp_keepalive: bool = True, - logger: Logger = server_logger, - access_log_class: Type[AbstractAccessLogger] = AccessLogger, - access_log: Logger = access_logger, - access_log_format: str = AccessLogger.LOG_FORMAT, - debug: bool = False, - max_line_size: int = 8190, - max_headers: int = 32768, - max_field_size: int = 8190, - lingering_time: float = 10.0, - read_bufsize: int = 2**16, - auto_decompress: bool = True, - timeout_ceil_threshold: float = 5, - ): - super().__init__(loop) - - # _request_count is the number of requests processed with the same connection. - self._request_count = 0 - self._keepalive = False - self._current_request: Optional[BaseRequest] = None - self._manager: Optional[Server] = manager - self._request_handler: Optional[_RequestHandler] = manager.request_handler - self._request_factory: Optional[_RequestFactory] = manager.request_factory - - self._tcp_keepalive = tcp_keepalive - # placeholder to be replaced on keepalive timeout setup - self._next_keepalive_close_time = 0.0 - self._keepalive_handle: Optional[asyncio.Handle] = None - self._keepalive_timeout = keepalive_timeout - self._lingering_time = float(lingering_time) - - self._messages: Deque[_MsgType] = deque() - self._message_tail = b"" - - self._waiter: Optional[asyncio.Future[None]] = None - self._handler_waiter: Optional[asyncio.Future[None]] = None - self._task_handler: Optional[asyncio.Task[None]] = None - - self._upgrade = False - self._payload_parser: Any = None - self._request_parser: Optional[HttpRequestParser] = HttpRequestParser( - self, - loop, - read_bufsize, - max_line_size=max_line_size, - max_field_size=max_field_size, - max_headers=max_headers, - payload_exception=RequestPayloadError, - auto_decompress=auto_decompress, - ) - - self._timeout_ceil_threshold: float = 5 - try: - self._timeout_ceil_threshold = float(timeout_ceil_threshold) - except (TypeError, ValueError): - pass - - self.logger = logger - self.debug = debug - self.access_log = access_log - if access_log: - self.access_logger: Optional[AbstractAccessLogger] = access_log_class( - access_log, access_log_format - ) - self._logging_enabled = self.access_logger.enabled - else: - self.access_logger = None - self._logging_enabled = False - - self._close = False - self._force_close = False - self._request_in_progress = False - self._cache: dict[str, Any] = {} - - def __repr__(self) -> str: - return "<{} {}>".format( - self.__class__.__name__, - "connected" if self.transport is not None else "disconnected", - ) - - @under_cached_property - def ssl_context(self) -> Optional["ssl.SSLContext"]: - """Return SSLContext if available.""" - return ( - None - if self.transport is None - else self.transport.get_extra_info("sslcontext") - ) - - @under_cached_property - def peername( - self, - ) -> Optional[Union[str, Tuple[str, int, int, int], Tuple[str, int]]]: - """Return peername if available.""" - return ( - None - if self.transport is None - else self.transport.get_extra_info("peername") - ) - - @property - def keepalive_timeout(self) -> float: - return self._keepalive_timeout - - async def shutdown(self, timeout: Optional[float] = 15.0) -> None: - """Do worker process exit preparations. - - We need to clean up everything and stop accepting requests. - It is especially important for keep-alive connections. - """ - self._force_close = True - - if self._keepalive_handle is not None: - self._keepalive_handle.cancel() - - # Wait for graceful handler completion - if self._request_in_progress: - # The future is only created when we are shutting - # down while the handler is still processing a request - # to avoid creating a future for every request. - self._handler_waiter = self._loop.create_future() - try: - async with ceil_timeout(timeout): - await self._handler_waiter - except (asyncio.CancelledError, asyncio.TimeoutError): - self._handler_waiter = None - if ( - sys.version_info >= (3, 11) - and (task := asyncio.current_task()) - and task.cancelling() - ): - raise - # Then cancel handler and wait - try: - async with ceil_timeout(timeout): - if self._current_request is not None: - self._current_request._cancel(asyncio.CancelledError()) - - if self._task_handler is not None and not self._task_handler.done(): - await asyncio.shield(self._task_handler) - except (asyncio.CancelledError, asyncio.TimeoutError): - if ( - sys.version_info >= (3, 11) - and (task := asyncio.current_task()) - and task.cancelling() - ): - raise - - # force-close non-idle handler - if self._task_handler is not None: - self._task_handler.cancel() - - self.force_close() - - def connection_made(self, transport: asyncio.BaseTransport) -> None: - super().connection_made(transport) - - real_transport = cast(asyncio.Transport, transport) - if self._tcp_keepalive: - tcp_keepalive(real_transport) - - assert self._manager is not None - self._manager.connection_made(self, real_transport) - - loop = self._loop - if sys.version_info >= (3, 12): - task = asyncio.Task(self.start(), loop=loop, eager_start=True) - else: - task = loop.create_task(self.start()) - self._task_handler = task - - def connection_lost(self, exc: Optional[BaseException]) -> None: - if self._manager is None: - return - self._manager.connection_lost(self, exc) - - # Grab value before setting _manager to None. - handler_cancellation = self._manager.handler_cancellation - - self.force_close() - super().connection_lost(exc) - self._manager = None - self._request_factory = None - self._request_handler = None - self._request_parser = None - - if self._keepalive_handle is not None: - self._keepalive_handle.cancel() - - if self._current_request is not None: - if exc is None: - exc = ConnectionResetError("Connection lost") - self._current_request._cancel(exc) - - if handler_cancellation and self._task_handler is not None: - self._task_handler.cancel() - - self._task_handler = None - - if self._payload_parser is not None: - self._payload_parser.feed_eof() - self._payload_parser = None - - def set_parser(self, parser: Any) -> None: - # Actual type is WebReader - assert self._payload_parser is None - - self._payload_parser = parser - - if self._message_tail: - self._payload_parser.feed_data(self._message_tail) - self._message_tail = b"" - - def eof_received(self) -> None: - pass - - def data_received(self, data: bytes) -> None: - if self._force_close or self._close: - return - # parse http messages - messages: Sequence[_MsgType] - if self._payload_parser is None and not self._upgrade: - assert self._request_parser is not None - try: - messages, upgraded, tail = self._request_parser.feed_data(data) - except HttpProcessingError as exc: - messages = [ - (_ErrInfo(status=400, exc=exc, message=exc.message), EMPTY_PAYLOAD) - ] - upgraded = False - tail = b"" - - for msg, payload in messages or (): - self._request_count += 1 - self._messages.append((msg, payload)) - - waiter = self._waiter - if messages and waiter is not None and not waiter.done(): - # don't set result twice - waiter.set_result(None) - - self._upgrade = upgraded - if upgraded and tail: - self._message_tail = tail - - # no parser, just store - elif self._payload_parser is None and self._upgrade and data: - self._message_tail += data - - # feed payload - elif data: - eof, tail = self._payload_parser.feed_data(data) - if eof: - self.close() - - def keep_alive(self, val: bool) -> None: - """Set keep-alive connection mode. - - :param bool val: new state. - """ - self._keepalive = val - if self._keepalive_handle: - self._keepalive_handle.cancel() - self._keepalive_handle = None - - def close(self) -> None: - """Close connection. - - Stop accepting new pipelining messages and close - connection when handlers done processing messages. - """ - self._close = True - if self._waiter: - self._waiter.cancel() - - def force_close(self) -> None: - """Forcefully close connection.""" - self._force_close = True - if self._waiter: - self._waiter.cancel() - if self.transport is not None: - self.transport.close() - self.transport = None - - def log_access( - self, request: BaseRequest, response: StreamResponse, time: Optional[float] - ) -> None: - if self.access_logger is not None and self.access_logger.enabled: - if TYPE_CHECKING: - assert time is not None - self.access_logger.log(request, response, self._loop.time() - time) - - def log_debug(self, *args: Any, **kw: Any) -> None: - if self.debug: - self.logger.debug(*args, **kw) - - def log_exception(self, *args: Any, **kw: Any) -> None: - self.logger.exception(*args, **kw) - - def _process_keepalive(self) -> None: - self._keepalive_handle = None - if self._force_close or not self._keepalive: - return - - loop = self._loop - now = loop.time() - close_time = self._next_keepalive_close_time - if now < close_time: - # Keep alive close check fired too early, reschedule - self._keepalive_handle = loop.call_at(close_time, self._process_keepalive) - return - - # handler in idle state - if self._waiter and not self._waiter.done(): - self.force_close() - - async def _handle_request( - self, - request: BaseRequest, - start_time: Optional[float], - request_handler: Callable[[BaseRequest], Awaitable[StreamResponse]], - ) -> Tuple[StreamResponse, bool]: - self._request_in_progress = True - try: - try: - self._current_request = request - resp = await request_handler(request) - finally: - self._current_request = None - except HTTPException as exc: - resp = exc - resp, reset = await self.finish_response(request, resp, start_time) - except asyncio.CancelledError: - raise - except asyncio.TimeoutError as exc: - self.log_debug("Request handler timed out.", exc_info=exc) - resp = self.handle_error(request, 504) - resp, reset = await self.finish_response(request, resp, start_time) - except Exception as exc: - resp = self.handle_error(request, 500, exc) - resp, reset = await self.finish_response(request, resp, start_time) - else: - # Deprecation warning (See #2415) - if getattr(resp, "__http_exception__", False): - warnings.warn( - "returning HTTPException object is deprecated " - "(#2415) and will be removed, " - "please raise the exception instead", - DeprecationWarning, - ) - - resp, reset = await self.finish_response(request, resp, start_time) - finally: - self._request_in_progress = False - if self._handler_waiter is not None: - self._handler_waiter.set_result(None) - - return resp, reset - - async def start(self) -> None: - """Process incoming request. - - It reads request line, request headers and request payload, then - calls handle_request() method. Subclass has to override - handle_request(). start() handles various exceptions in request - or response handling. Connection is being closed always unless - keep_alive(True) specified. - """ - loop = self._loop - manager = self._manager - assert manager is not None - keepalive_timeout = self._keepalive_timeout - resp = None - assert self._request_factory is not None - assert self._request_handler is not None - - while not self._force_close: - if not self._messages: - try: - # wait for next request - self._waiter = loop.create_future() - await self._waiter - finally: - self._waiter = None - - message, payload = self._messages.popleft() - - # time is only fetched if logging is enabled as otherwise - # its thrown away and never used. - start = loop.time() if self._logging_enabled else None - - manager.requests_count += 1 - writer = StreamWriter(self, loop) - if isinstance(message, _ErrInfo): - # make request_factory work - request_handler = self._make_error_handler(message) - message = ERROR - else: - request_handler = self._request_handler - - # Important don't hold a reference to the current task - # as on traceback it will prevent the task from being - # collected and will cause a memory leak. - request = self._request_factory( - message, - payload, - self, - writer, - self._task_handler or asyncio.current_task(loop), # type: ignore[arg-type] - ) - try: - # a new task is used for copy context vars (#3406) - coro = self._handle_request(request, start, request_handler) - if sys.version_info >= (3, 12): - task = asyncio.Task(coro, loop=loop, eager_start=True) - else: - task = loop.create_task(coro) - try: - resp, reset = await task - except ConnectionError: - self.log_debug("Ignored premature client disconnection") - break - - # Drop the processed task from asyncio.Task.all_tasks() early - del task - if reset: - self.log_debug("Ignored premature client disconnection 2") - break - - # notify server about keep-alive - self._keepalive = bool(resp.keep_alive) - - # check payload - if not payload.is_eof(): - lingering_time = self._lingering_time - if not self._force_close and lingering_time: - self.log_debug( - "Start lingering close timer for %s sec.", lingering_time - ) - - now = loop.time() - end_t = now + lingering_time - - try: - while not payload.is_eof() and now < end_t: - async with ceil_timeout(end_t - now): - # read and ignore - await payload.readany() - now = loop.time() - except (asyncio.CancelledError, asyncio.TimeoutError): - if ( - sys.version_info >= (3, 11) - and (t := asyncio.current_task()) - and t.cancelling() - ): - raise - - # if payload still uncompleted - if not payload.is_eof() and not self._force_close: - self.log_debug("Uncompleted request.") - self.close() - - payload.set_exception(_PAYLOAD_ACCESS_ERROR) - - except asyncio.CancelledError: - self.log_debug("Ignored premature client disconnection") - self.force_close() - raise - except Exception as exc: - self.log_exception("Unhandled exception", exc_info=exc) - self.force_close() - except BaseException: - self.force_close() - raise - finally: - request._task = None # type: ignore[assignment] # Break reference cycle in case of exception - if self.transport is None and resp is not None: - self.log_debug("Ignored premature client disconnection.") - - if self._keepalive and not self._close and not self._force_close: - # start keep-alive timer - close_time = loop.time() + keepalive_timeout - self._next_keepalive_close_time = close_time - if self._keepalive_handle is None: - self._keepalive_handle = loop.call_at( - close_time, self._process_keepalive - ) - else: - break - - # remove handler, close transport if no handlers left - if not self._force_close: - self._task_handler = None - if self.transport is not None: - self.transport.close() - - async def finish_response( - self, request: BaseRequest, resp: StreamResponse, start_time: Optional[float] - ) -> Tuple[StreamResponse, bool]: - """Prepare the response and write_eof, then log access. - - This has to - be called within the context of any exception so the access logger - can get exception information. Returns True if the client disconnects - prematurely. - """ - request._finish() - if self._request_parser is not None: - self._request_parser.set_upgraded(False) - self._upgrade = False - if self._message_tail: - self._request_parser.feed_data(self._message_tail) - self._message_tail = b"" - try: - prepare_meth = resp.prepare - except AttributeError: - if resp is None: - self.log_exception("Missing return statement on request handler") - else: - self.log_exception( - "Web-handler should return a response instance, " - "got {!r}".format(resp) - ) - exc = HTTPInternalServerError() - resp = Response( - status=exc.status, reason=exc.reason, text=exc.text, headers=exc.headers - ) - prepare_meth = resp.prepare - try: - await prepare_meth(request) - await resp.write_eof() - except ConnectionError: - self.log_access(request, resp, start_time) - return resp, True - - self.log_access(request, resp, start_time) - return resp, False - - def handle_error( - self, - request: BaseRequest, - status: int = 500, - exc: Optional[BaseException] = None, - message: Optional[str] = None, - ) -> StreamResponse: - """Handle errors. - - Returns HTTP response with specific status code. Logs additional - information. It always closes current connection. - """ - if self._request_count == 1 and isinstance(exc, BadHttpMethod): - # BadHttpMethod is common when a client sends non-HTTP - # or encrypted traffic to an HTTP port. This is expected - # to happen when connected to the public internet so we log - # it at the debug level as to not fill logs with noise. - self.logger.debug( - "Error handling request from %s", request.remote, exc_info=exc - ) - else: - self.log_exception( - "Error handling request from %s", request.remote, exc_info=exc - ) - - # some data already got sent, connection is broken - if request.writer.output_size > 0: - raise ConnectionError( - "Response is sent already, cannot send another response " - "with the error message" - ) - - ct = "text/plain" - if status == HTTPStatus.INTERNAL_SERVER_ERROR: - title = "{0.value} {0.phrase}".format(HTTPStatus.INTERNAL_SERVER_ERROR) - msg = HTTPStatus.INTERNAL_SERVER_ERROR.description - tb = None - if self.debug: - with suppress(Exception): - tb = traceback.format_exc() - - if "text/html" in request.headers.get("Accept", ""): - if tb: - tb = html_escape(tb) - msg = f"

    Traceback:

    \n
    {tb}
    " - message = ( - "" - "{title}" - "\n

    {title}

    " - "\n{msg}\n\n" - ).format(title=title, msg=msg) - ct = "text/html" - else: - if tb: - msg = tb - message = title + "\n\n" + msg - - resp = Response(status=status, text=message, content_type=ct) - resp.force_close() - - return resp - - def _make_error_handler( - self, err_info: _ErrInfo - ) -> Callable[[BaseRequest], Awaitable[StreamResponse]]: - async def handler(request: BaseRequest) -> StreamResponse: - return self.handle_error( - request, err_info.status, err_info.exc, err_info.message - ) - - return handler diff --git a/venv/lib/python3.12/site-packages/aiohttp/web_request.py b/venv/lib/python3.12/site-packages/aiohttp/web_request.py deleted file mode 100644 index 0bc69b7..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/web_request.py +++ /dev/null @@ -1,916 +0,0 @@ -import asyncio -import datetime -import io -import re -import socket -import string -import tempfile -import types -import warnings -from types import MappingProxyType -from typing import ( - TYPE_CHECKING, - Any, - Dict, - Final, - Iterator, - Mapping, - MutableMapping, - Optional, - Pattern, - Tuple, - Union, - cast, -) -from urllib.parse import parse_qsl - -import attr -from multidict import ( - CIMultiDict, - CIMultiDictProxy, - MultiDict, - MultiDictProxy, - MultiMapping, -) -from yarl import URL - -from . import hdrs -from ._cookie_helpers import parse_cookie_header -from .abc import AbstractStreamWriter -from .helpers import ( - _SENTINEL, - DEBUG, - ETAG_ANY, - LIST_QUOTED_ETAG_RE, - ChainMapProxy, - ETag, - HeadersMixin, - parse_http_date, - reify, - sentinel, - set_exception, -) -from .http_parser import RawRequestMessage -from .http_writer import HttpVersion -from .multipart import BodyPartReader, MultipartReader -from .streams import EmptyStreamReader, StreamReader -from .typedefs import ( - DEFAULT_JSON_DECODER, - JSONDecoder, - LooseHeaders, - RawHeaders, - StrOrURL, -) -from .web_exceptions import HTTPRequestEntityTooLarge -from .web_response import StreamResponse - -__all__ = ("BaseRequest", "FileField", "Request") - - -if TYPE_CHECKING: - from .web_app import Application - from .web_protocol import RequestHandler - from .web_urldispatcher import UrlMappingMatchInfo - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class FileField: - name: str - filename: str - file: io.BufferedReader - content_type: str - headers: CIMultiDictProxy[str] - - -_TCHAR: Final[str] = string.digits + string.ascii_letters + r"!#$%&'*+.^_`|~-" -# '-' at the end to prevent interpretation as range in a char class - -_TOKEN: Final[str] = rf"[{_TCHAR}]+" - -_QDTEXT: Final[str] = r"[{}]".format( - r"".join(chr(c) for c in (0x09, 0x20, 0x21) + tuple(range(0x23, 0x7F))) -) -# qdtext includes 0x5C to escape 0x5D ('\]') -# qdtext excludes obs-text (because obsoleted, and encoding not specified) - -_QUOTED_PAIR: Final[str] = r"\\[\t !-~]" - -_QUOTED_STRING: Final[str] = r'"(?:{quoted_pair}|{qdtext})*"'.format( - qdtext=_QDTEXT, quoted_pair=_QUOTED_PAIR -) - -_FORWARDED_PAIR: Final[str] = ( - r"({token})=({token}|{quoted_string})(:\d{{1,4}})?".format( - token=_TOKEN, quoted_string=_QUOTED_STRING - ) -) - -_QUOTED_PAIR_REPLACE_RE: Final[Pattern[str]] = re.compile(r"\\([\t !-~])") -# same pattern as _QUOTED_PAIR but contains a capture group - -_FORWARDED_PAIR_RE: Final[Pattern[str]] = re.compile(_FORWARDED_PAIR) - -############################################################ -# HTTP Request -############################################################ - - -class BaseRequest(MutableMapping[str, Any], HeadersMixin): - - POST_METHODS = { - hdrs.METH_PATCH, - hdrs.METH_POST, - hdrs.METH_PUT, - hdrs.METH_TRACE, - hdrs.METH_DELETE, - } - - ATTRS = HeadersMixin.ATTRS | frozenset( - [ - "_message", - "_protocol", - "_payload_writer", - "_payload", - "_headers", - "_method", - "_version", - "_rel_url", - "_post", - "_read_bytes", - "_state", - "_cache", - "_task", - "_client_max_size", - "_loop", - "_transport_sslcontext", - "_transport_peername", - ] - ) - _post: Optional[MultiDictProxy[Union[str, bytes, FileField]]] = None - _read_bytes: Optional[bytes] = None - - def __init__( - self, - message: RawRequestMessage, - payload: StreamReader, - protocol: "RequestHandler", - payload_writer: AbstractStreamWriter, - task: "asyncio.Task[None]", - loop: asyncio.AbstractEventLoop, - *, - client_max_size: int = 1024**2, - state: Optional[Dict[str, Any]] = None, - scheme: Optional[str] = None, - host: Optional[str] = None, - remote: Optional[str] = None, - ) -> None: - self._message = message - self._protocol = protocol - self._payload_writer = payload_writer - - self._payload = payload - self._headers: CIMultiDictProxy[str] = message.headers - self._method = message.method - self._version = message.version - self._cache: Dict[str, Any] = {} - url = message.url - if url.absolute: - if scheme is not None: - url = url.with_scheme(scheme) - if host is not None: - url = url.with_host(host) - # absolute URL is given, - # override auto-calculating url, host, and scheme - # all other properties should be good - self._cache["url"] = url - self._cache["host"] = url.host - self._cache["scheme"] = url.scheme - self._rel_url = url.relative() - else: - self._rel_url = url - if scheme is not None: - self._cache["scheme"] = scheme - if host is not None: - self._cache["host"] = host - - self._state = {} if state is None else state - self._task = task - self._client_max_size = client_max_size - self._loop = loop - - self._transport_sslcontext = protocol.ssl_context - self._transport_peername = protocol.peername - - if remote is not None: - self._cache["remote"] = remote - - def clone( - self, - *, - method: Union[str, _SENTINEL] = sentinel, - rel_url: Union[StrOrURL, _SENTINEL] = sentinel, - headers: Union[LooseHeaders, _SENTINEL] = sentinel, - scheme: Union[str, _SENTINEL] = sentinel, - host: Union[str, _SENTINEL] = sentinel, - remote: Union[str, _SENTINEL] = sentinel, - client_max_size: Union[int, _SENTINEL] = sentinel, - ) -> "BaseRequest": - """Clone itself with replacement some attributes. - - Creates and returns a new instance of Request object. If no parameters - are given, an exact copy is returned. If a parameter is not passed, it - will reuse the one from the current request object. - """ - if self._read_bytes: - raise RuntimeError("Cannot clone request after reading its content") - - dct: Dict[str, Any] = {} - if method is not sentinel: - dct["method"] = method - if rel_url is not sentinel: - new_url: URL = URL(rel_url) - dct["url"] = new_url - dct["path"] = str(new_url) - if headers is not sentinel: - # a copy semantic - dct["headers"] = CIMultiDictProxy(CIMultiDict(headers)) - dct["raw_headers"] = tuple( - (k.encode("utf-8"), v.encode("utf-8")) - for k, v in dct["headers"].items() - ) - - message = self._message._replace(**dct) - - kwargs = {} - if scheme is not sentinel: - kwargs["scheme"] = scheme - if host is not sentinel: - kwargs["host"] = host - if remote is not sentinel: - kwargs["remote"] = remote - if client_max_size is sentinel: - client_max_size = self._client_max_size - - return self.__class__( - message, - self._payload, - self._protocol, - self._payload_writer, - self._task, - self._loop, - client_max_size=client_max_size, - state=self._state.copy(), - **kwargs, - ) - - @property - def task(self) -> "asyncio.Task[None]": - return self._task - - @property - def protocol(self) -> "RequestHandler": - return self._protocol - - @property - def transport(self) -> Optional[asyncio.Transport]: - if self._protocol is None: - return None - return self._protocol.transport - - @property - def writer(self) -> AbstractStreamWriter: - return self._payload_writer - - @property - def client_max_size(self) -> int: - return self._client_max_size - - @reify - def message(self) -> RawRequestMessage: - warnings.warn("Request.message is deprecated", DeprecationWarning, stacklevel=3) - return self._message - - @reify - def rel_url(self) -> URL: - return self._rel_url - - @reify - def loop(self) -> asyncio.AbstractEventLoop: - warnings.warn( - "request.loop property is deprecated", DeprecationWarning, stacklevel=2 - ) - return self._loop - - # MutableMapping API - - def __getitem__(self, key: str) -> Any: - return self._state[key] - - def __setitem__(self, key: str, value: Any) -> None: - self._state[key] = value - - def __delitem__(self, key: str) -> None: - del self._state[key] - - def __len__(self) -> int: - return len(self._state) - - def __iter__(self) -> Iterator[str]: - return iter(self._state) - - ######## - - @reify - def secure(self) -> bool: - """A bool indicating if the request is handled with SSL.""" - return self.scheme == "https" - - @reify - def forwarded(self) -> Tuple[Mapping[str, str], ...]: - """A tuple containing all parsed Forwarded header(s). - - Makes an effort to parse Forwarded headers as specified by RFC 7239: - - - It adds one (immutable) dictionary per Forwarded 'field-value', ie - per proxy. The element corresponds to the data in the Forwarded - field-value added by the first proxy encountered by the client. Each - subsequent item corresponds to those added by later proxies. - - It checks that every value has valid syntax in general as specified - in section 4: either a 'token' or a 'quoted-string'. - - It un-escapes found escape sequences. - - It does NOT validate 'by' and 'for' contents as specified in section - 6. - - It does NOT validate 'host' contents (Host ABNF). - - It does NOT validate 'proto' contents for valid URI scheme names. - - Returns a tuple containing one or more immutable dicts - """ - elems = [] - for field_value in self._message.headers.getall(hdrs.FORWARDED, ()): - length = len(field_value) - pos = 0 - need_separator = False - elem: Dict[str, str] = {} - elems.append(types.MappingProxyType(elem)) - while 0 <= pos < length: - match = _FORWARDED_PAIR_RE.match(field_value, pos) - if match is not None: # got a valid forwarded-pair - if need_separator: - # bad syntax here, skip to next comma - pos = field_value.find(",", pos) - else: - name, value, port = match.groups() - if value[0] == '"': - # quoted string: remove quotes and unescape - value = _QUOTED_PAIR_REPLACE_RE.sub(r"\1", value[1:-1]) - if port: - value += port - elem[name.lower()] = value - pos += len(match.group(0)) - need_separator = True - elif field_value[pos] == ",": # next forwarded-element - need_separator = False - elem = {} - elems.append(types.MappingProxyType(elem)) - pos += 1 - elif field_value[pos] == ";": # next forwarded-pair - need_separator = False - pos += 1 - elif field_value[pos] in " \t": - # Allow whitespace even between forwarded-pairs, though - # RFC 7239 doesn't. This simplifies code and is in line - # with Postel's law. - pos += 1 - else: - # bad syntax here, skip to next comma - pos = field_value.find(",", pos) - return tuple(elems) - - @reify - def scheme(self) -> str: - """A string representing the scheme of the request. - - Hostname is resolved in this order: - - - overridden value by .clone(scheme=new_scheme) call. - - type of connection to peer: HTTPS if socket is SSL, HTTP otherwise. - - 'http' or 'https'. - """ - if self._transport_sslcontext: - return "https" - else: - return "http" - - @reify - def method(self) -> str: - """Read only property for getting HTTP method. - - The value is upper-cased str like 'GET', 'POST', 'PUT' etc. - """ - return self._method - - @reify - def version(self) -> HttpVersion: - """Read only property for getting HTTP version of request. - - Returns aiohttp.protocol.HttpVersion instance. - """ - return self._version - - @reify - def host(self) -> str: - """Hostname of the request. - - Hostname is resolved in this order: - - - overridden value by .clone(host=new_host) call. - - HOST HTTP header - - socket.getfqdn() value - - For example, 'example.com' or 'localhost:8080'. - - For historical reasons, the port number may be included. - """ - host = self._message.headers.get(hdrs.HOST) - if host is not None: - return host - return socket.getfqdn() - - @reify - def remote(self) -> Optional[str]: - """Remote IP of client initiated HTTP request. - - The IP is resolved in this order: - - - overridden value by .clone(remote=new_remote) call. - - peername of opened socket - """ - if self._transport_peername is None: - return None - if isinstance(self._transport_peername, (list, tuple)): - return str(self._transport_peername[0]) - return str(self._transport_peername) - - @reify - def url(self) -> URL: - """The full URL of the request.""" - # authority is used here because it may include the port number - # and we want yarl to parse it correctly - return URL.build(scheme=self.scheme, authority=self.host).join(self._rel_url) - - @reify - def path(self) -> str: - """The URL including *PATH INFO* without the host or scheme. - - E.g., ``/app/blog`` - """ - return self._rel_url.path - - @reify - def path_qs(self) -> str: - """The URL including PATH_INFO and the query string. - - E.g, /app/blog?id=10 - """ - return str(self._rel_url) - - @reify - def raw_path(self) -> str: - """The URL including raw *PATH INFO* without the host or scheme. - - Warning, the path is unquoted and may contains non valid URL characters - - E.g., ``/my%2Fpath%7Cwith%21some%25strange%24characters`` - """ - return self._message.path - - @reify - def query(self) -> "MultiMapping[str]": - """A multidict with all the variables in the query string.""" - return self._rel_url.query - - @reify - def query_string(self) -> str: - """The query string in the URL. - - E.g., id=10 - """ - return self._rel_url.query_string - - @reify - def headers(self) -> CIMultiDictProxy[str]: - """A case-insensitive multidict proxy with all headers.""" - return self._headers - - @reify - def raw_headers(self) -> RawHeaders: - """A sequence of pairs for all headers.""" - return self._message.raw_headers - - @reify - def if_modified_since(self) -> Optional[datetime.datetime]: - """The value of If-Modified-Since HTTP header, or None. - - This header is represented as a `datetime` object. - """ - return parse_http_date(self.headers.get(hdrs.IF_MODIFIED_SINCE)) - - @reify - def if_unmodified_since(self) -> Optional[datetime.datetime]: - """The value of If-Unmodified-Since HTTP header, or None. - - This header is represented as a `datetime` object. - """ - return parse_http_date(self.headers.get(hdrs.IF_UNMODIFIED_SINCE)) - - @staticmethod - def _etag_values(etag_header: str) -> Iterator[ETag]: - """Extract `ETag` objects from raw header.""" - if etag_header == ETAG_ANY: - yield ETag( - is_weak=False, - value=ETAG_ANY, - ) - else: - for match in LIST_QUOTED_ETAG_RE.finditer(etag_header): - is_weak, value, garbage = match.group(2, 3, 4) - # Any symbol captured by 4th group means - # that the following sequence is invalid. - if garbage: - break - - yield ETag( - is_weak=bool(is_weak), - value=value, - ) - - @classmethod - def _if_match_or_none_impl( - cls, header_value: Optional[str] - ) -> Optional[Tuple[ETag, ...]]: - if not header_value: - return None - - return tuple(cls._etag_values(header_value)) - - @reify - def if_match(self) -> Optional[Tuple[ETag, ...]]: - """The value of If-Match HTTP header, or None. - - This header is represented as a `tuple` of `ETag` objects. - """ - return self._if_match_or_none_impl(self.headers.get(hdrs.IF_MATCH)) - - @reify - def if_none_match(self) -> Optional[Tuple[ETag, ...]]: - """The value of If-None-Match HTTP header, or None. - - This header is represented as a `tuple` of `ETag` objects. - """ - return self._if_match_or_none_impl(self.headers.get(hdrs.IF_NONE_MATCH)) - - @reify - def if_range(self) -> Optional[datetime.datetime]: - """The value of If-Range HTTP header, or None. - - This header is represented as a `datetime` object. - """ - return parse_http_date(self.headers.get(hdrs.IF_RANGE)) - - @reify - def keep_alive(self) -> bool: - """Is keepalive enabled by client?""" - return not self._message.should_close - - @reify - def cookies(self) -> Mapping[str, str]: - """Return request cookies. - - A read-only dictionary-like object. - """ - # Use parse_cookie_header for RFC 6265 compliant Cookie header parsing - # that accepts special characters in cookie names (fixes #2683) - parsed = parse_cookie_header(self.headers.get(hdrs.COOKIE, "")) - # Extract values from Morsel objects - return MappingProxyType({name: morsel.value for name, morsel in parsed}) - - @reify - def http_range(self) -> slice: - """The content of Range HTTP header. - - Return a slice instance. - - """ - rng = self._headers.get(hdrs.RANGE) - start, end = None, None - if rng is not None: - try: - pattern = r"^bytes=(\d*)-(\d*)$" - start, end = re.findall(pattern, rng)[0] - except IndexError: # pattern was not found in header - raise ValueError("range not in acceptable format") - - end = int(end) if end else None - start = int(start) if start else None - - if start is None and end is not None: - # end with no start is to return tail of content - start = -end - end = None - - if start is not None and end is not None: - # end is inclusive in range header, exclusive for slice - end += 1 - - if start >= end: - raise ValueError("start cannot be after end") - - if start is end is None: # No valid range supplied - raise ValueError("No start or end of range specified") - - return slice(start, end, 1) - - @reify - def content(self) -> StreamReader: - """Return raw payload stream.""" - return self._payload - - @property - def has_body(self) -> bool: - """Return True if request's HTTP BODY can be read, False otherwise.""" - warnings.warn( - "Deprecated, use .can_read_body #2005", DeprecationWarning, stacklevel=2 - ) - return not self._payload.at_eof() - - @property - def can_read_body(self) -> bool: - """Return True if request's HTTP BODY can be read, False otherwise.""" - return not self._payload.at_eof() - - @reify - def body_exists(self) -> bool: - """Return True if request has HTTP BODY, False otherwise.""" - return type(self._payload) is not EmptyStreamReader - - async def release(self) -> None: - """Release request. - - Eat unread part of HTTP BODY if present. - """ - while not self._payload.at_eof(): - await self._payload.readany() - - async def read(self) -> bytes: - """Read request body if present. - - Returns bytes object with full request content. - """ - if self._read_bytes is None: - body = bytearray() - while True: - chunk = await self._payload.readany() - body.extend(chunk) - if self._client_max_size: - body_size = len(body) - if body_size >= self._client_max_size: - raise HTTPRequestEntityTooLarge( - max_size=self._client_max_size, actual_size=body_size - ) - if not chunk: - break - self._read_bytes = bytes(body) - return self._read_bytes - - async def text(self) -> str: - """Return BODY as text using encoding from .charset.""" - bytes_body = await self.read() - encoding = self.charset or "utf-8" - return bytes_body.decode(encoding) - - async def json(self, *, loads: JSONDecoder = DEFAULT_JSON_DECODER) -> Any: - """Return BODY as JSON.""" - body = await self.text() - return loads(body) - - async def multipart(self) -> MultipartReader: - """Return async iterator to process BODY as multipart.""" - return MultipartReader(self._headers, self._payload) - - async def post(self) -> "MultiDictProxy[Union[str, bytes, FileField]]": - """Return POST parameters.""" - if self._post is not None: - return self._post - if self._method not in self.POST_METHODS: - self._post = MultiDictProxy(MultiDict()) - return self._post - - content_type = self.content_type - if content_type not in ( - "", - "application/x-www-form-urlencoded", - "multipart/form-data", - ): - self._post = MultiDictProxy(MultiDict()) - return self._post - - out: MultiDict[Union[str, bytes, FileField]] = MultiDict() - - if content_type == "multipart/form-data": - multipart = await self.multipart() - max_size = self._client_max_size - - field = await multipart.next() - while field is not None: - size = 0 - field_ct = field.headers.get(hdrs.CONTENT_TYPE) - - if isinstance(field, BodyPartReader): - assert field.name is not None - - # Note that according to RFC 7578, the Content-Type header - # is optional, even for files, so we can't assume it's - # present. - # https://tools.ietf.org/html/rfc7578#section-4.4 - if field.filename: - # store file in temp file - tmp = await self._loop.run_in_executor( - None, tempfile.TemporaryFile - ) - chunk = await field.read_chunk(size=2**16) - while chunk: - chunk = field.decode(chunk) - await self._loop.run_in_executor(None, tmp.write, chunk) - size += len(chunk) - if 0 < max_size < size: - await self._loop.run_in_executor(None, tmp.close) - raise HTTPRequestEntityTooLarge( - max_size=max_size, actual_size=size - ) - chunk = await field.read_chunk(size=2**16) - await self._loop.run_in_executor(None, tmp.seek, 0) - - if field_ct is None: - field_ct = "application/octet-stream" - - ff = FileField( - field.name, - field.filename, - cast(io.BufferedReader, tmp), - field_ct, - field.headers, - ) - out.add(field.name, ff) - else: - # deal with ordinary data - value = await field.read(decode=True) - if field_ct is None or field_ct.startswith("text/"): - charset = field.get_charset(default="utf-8") - out.add(field.name, value.decode(charset)) - else: - out.add(field.name, value) - size += len(value) - if 0 < max_size < size: - raise HTTPRequestEntityTooLarge( - max_size=max_size, actual_size=size - ) - else: - raise ValueError( - "To decode nested multipart you need to use custom reader", - ) - - field = await multipart.next() - else: - data = await self.read() - if data: - charset = self.charset or "utf-8" - out.extend( - parse_qsl( - data.rstrip().decode(charset), - keep_blank_values=True, - encoding=charset, - ) - ) - - self._post = MultiDictProxy(out) - return self._post - - def get_extra_info(self, name: str, default: Any = None) -> Any: - """Extra info from protocol transport""" - protocol = self._protocol - if protocol is None: - return default - - transport = protocol.transport - if transport is None: - return default - - return transport.get_extra_info(name, default) - - def __repr__(self) -> str: - ascii_encodable_path = self.path.encode("ascii", "backslashreplace").decode( - "ascii" - ) - return "<{} {} {} >".format( - self.__class__.__name__, self._method, ascii_encodable_path - ) - - def __eq__(self, other: object) -> bool: - return id(self) == id(other) - - def __bool__(self) -> bool: - return True - - async def _prepare_hook(self, response: StreamResponse) -> None: - return - - def _cancel(self, exc: BaseException) -> None: - set_exception(self._payload, exc) - - def _finish(self) -> None: - if self._post is None or self.content_type != "multipart/form-data": - return - - # NOTE: Release file descriptors for the - # NOTE: `tempfile.Temporaryfile`-created `_io.BufferedRandom` - # NOTE: instances of files sent within multipart request body - # NOTE: via HTTP POST request. - for file_name, file_field_object in self._post.items(): - if isinstance(file_field_object, FileField): - file_field_object.file.close() - - -class Request(BaseRequest): - - ATTRS = BaseRequest.ATTRS | frozenset(["_match_info"]) - - _match_info: Optional["UrlMappingMatchInfo"] = None - - if DEBUG: - - def __setattr__(self, name: str, val: Any) -> None: - if name not in self.ATTRS: - warnings.warn( - "Setting custom {}.{} attribute " - "is discouraged".format(self.__class__.__name__, name), - DeprecationWarning, - stacklevel=2, - ) - super().__setattr__(name, val) - - def clone( - self, - *, - method: Union[str, _SENTINEL] = sentinel, - rel_url: Union[StrOrURL, _SENTINEL] = sentinel, - headers: Union[LooseHeaders, _SENTINEL] = sentinel, - scheme: Union[str, _SENTINEL] = sentinel, - host: Union[str, _SENTINEL] = sentinel, - remote: Union[str, _SENTINEL] = sentinel, - client_max_size: Union[int, _SENTINEL] = sentinel, - ) -> "Request": - ret = super().clone( - method=method, - rel_url=rel_url, - headers=headers, - scheme=scheme, - host=host, - remote=remote, - client_max_size=client_max_size, - ) - new_ret = cast(Request, ret) - new_ret._match_info = self._match_info - return new_ret - - @reify - def match_info(self) -> "UrlMappingMatchInfo": - """Result of route resolving.""" - match_info = self._match_info - assert match_info is not None - return match_info - - @property - def app(self) -> "Application": - """Application instance.""" - match_info = self._match_info - assert match_info is not None - return match_info.current_app - - @property - def config_dict(self) -> ChainMapProxy: - match_info = self._match_info - assert match_info is not None - lst = match_info.apps - app = self.app - idx = lst.index(app) - sublist = list(reversed(lst[: idx + 1])) - return ChainMapProxy(sublist) - - async def _prepare_hook(self, response: StreamResponse) -> None: - match_info = self._match_info - if match_info is None: - return - for app in match_info._apps: - if on_response_prepare := app.on_response_prepare: - await on_response_prepare.send(self, response) diff --git a/venv/lib/python3.12/site-packages/aiohttp/web_response.py b/venv/lib/python3.12/site-packages/aiohttp/web_response.py deleted file mode 100644 index cdc90cc..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/web_response.py +++ /dev/null @@ -1,856 +0,0 @@ -import asyncio -import collections.abc -import datetime -import enum -import json -import math -import time -import warnings -from concurrent.futures import Executor -from http import HTTPStatus -from http.cookies import SimpleCookie -from typing import ( - TYPE_CHECKING, - Any, - Dict, - Iterator, - MutableMapping, - Optional, - Union, - cast, -) - -from multidict import CIMultiDict, istr - -from . import hdrs, payload -from .abc import AbstractStreamWriter -from .compression_utils import ZLibCompressor -from .helpers import ( - ETAG_ANY, - QUOTED_ETAG_RE, - ETag, - HeadersMixin, - must_be_empty_body, - parse_http_date, - rfc822_formatted_time, - sentinel, - should_remove_content_length, - validate_etag_value, -) -from .http import SERVER_SOFTWARE, HttpVersion10, HttpVersion11 -from .payload import Payload -from .typedefs import JSONEncoder, LooseHeaders - -REASON_PHRASES = {http_status.value: http_status.phrase for http_status in HTTPStatus} -LARGE_BODY_SIZE = 1024**2 - -__all__ = ("ContentCoding", "StreamResponse", "Response", "json_response") - - -if TYPE_CHECKING: - from .web_request import BaseRequest - - BaseClass = MutableMapping[str, Any] -else: - BaseClass = collections.abc.MutableMapping - - -# TODO(py311): Convert to StrEnum for wider use -class ContentCoding(enum.Enum): - # The content codings that we have support for. - # - # Additional registered codings are listed at: - # https://www.iana.org/assignments/http-parameters/http-parameters.xhtml#content-coding - deflate = "deflate" - gzip = "gzip" - identity = "identity" - - -CONTENT_CODINGS = {coding.value: coding for coding in ContentCoding} - -############################################################ -# HTTP Response classes -############################################################ - - -class StreamResponse(BaseClass, HeadersMixin): - - _body: Union[None, bytes, bytearray, Payload] - _length_check = True - _body = None - _keep_alive: Optional[bool] = None - _chunked: bool = False - _compression: bool = False - _compression_strategy: Optional[int] = None - _compression_force: Optional[ContentCoding] = None - _req: Optional["BaseRequest"] = None - _payload_writer: Optional[AbstractStreamWriter] = None - _eof_sent: bool = False - _must_be_empty_body: Optional[bool] = None - _body_length = 0 - _cookies: Optional[SimpleCookie] = None - _send_headers_immediately = True - - def __init__( - self, - *, - status: int = 200, - reason: Optional[str] = None, - headers: Optional[LooseHeaders] = None, - _real_headers: Optional[CIMultiDict[str]] = None, - ) -> None: - """Initialize a new stream response object. - - _real_headers is an internal parameter used to pass a pre-populated - headers object. It is used by the `Response` class to avoid copying - the headers when creating a new response object. It is not intended - to be used by external code. - """ - self._state: Dict[str, Any] = {} - - if _real_headers is not None: - self._headers = _real_headers - elif headers is not None: - self._headers: CIMultiDict[str] = CIMultiDict(headers) - else: - self._headers = CIMultiDict() - - self._set_status(status, reason) - - @property - def prepared(self) -> bool: - return self._eof_sent or self._payload_writer is not None - - @property - def task(self) -> "Optional[asyncio.Task[None]]": - if self._req: - return self._req.task - else: - return None - - @property - def status(self) -> int: - return self._status - - @property - def chunked(self) -> bool: - return self._chunked - - @property - def compression(self) -> bool: - return self._compression - - @property - def reason(self) -> str: - return self._reason - - def set_status( - self, - status: int, - reason: Optional[str] = None, - ) -> None: - assert ( - not self.prepared - ), "Cannot change the response status code after the headers have been sent" - self._set_status(status, reason) - - def _set_status(self, status: int, reason: Optional[str]) -> None: - self._status = int(status) - if reason is None: - reason = REASON_PHRASES.get(self._status, "") - elif "\n" in reason: - raise ValueError("Reason cannot contain \\n") - self._reason = reason - - @property - def keep_alive(self) -> Optional[bool]: - return self._keep_alive - - def force_close(self) -> None: - self._keep_alive = False - - @property - def body_length(self) -> int: - return self._body_length - - @property - def output_length(self) -> int: - warnings.warn("output_length is deprecated", DeprecationWarning) - assert self._payload_writer - return self._payload_writer.buffer_size - - def enable_chunked_encoding(self, chunk_size: Optional[int] = None) -> None: - """Enables automatic chunked transfer encoding.""" - if hdrs.CONTENT_LENGTH in self._headers: - raise RuntimeError( - "You can't enable chunked encoding when a content length is set" - ) - if chunk_size is not None: - warnings.warn("Chunk size is deprecated #1615", DeprecationWarning) - self._chunked = True - - def enable_compression( - self, - force: Optional[Union[bool, ContentCoding]] = None, - strategy: Optional[int] = None, - ) -> None: - """Enables response compression encoding.""" - # Backwards compatibility for when force was a bool <0.17. - if isinstance(force, bool): - force = ContentCoding.deflate if force else ContentCoding.identity - warnings.warn( - "Using boolean for force is deprecated #3318", DeprecationWarning - ) - elif force is not None: - assert isinstance( - force, ContentCoding - ), "force should one of None, bool or ContentEncoding" - - self._compression = True - self._compression_force = force - self._compression_strategy = strategy - - @property - def headers(self) -> "CIMultiDict[str]": - return self._headers - - @property - def cookies(self) -> SimpleCookie: - if self._cookies is None: - self._cookies = SimpleCookie() - return self._cookies - - def set_cookie( - self, - name: str, - value: str, - *, - expires: Optional[str] = None, - domain: Optional[str] = None, - max_age: Optional[Union[int, str]] = None, - path: str = "/", - secure: Optional[bool] = None, - httponly: Optional[bool] = None, - version: Optional[str] = None, - samesite: Optional[str] = None, - partitioned: Optional[bool] = None, - ) -> None: - """Set or update response cookie. - - Sets new cookie or updates existent with new value. - Also updates only those params which are not None. - """ - if self._cookies is None: - self._cookies = SimpleCookie() - - self._cookies[name] = value - c = self._cookies[name] - - if expires is not None: - c["expires"] = expires - elif c.get("expires") == "Thu, 01 Jan 1970 00:00:00 GMT": - del c["expires"] - - if domain is not None: - c["domain"] = domain - - if max_age is not None: - c["max-age"] = str(max_age) - elif "max-age" in c: - del c["max-age"] - - c["path"] = path - - if secure is not None: - c["secure"] = secure - if httponly is not None: - c["httponly"] = httponly - if version is not None: - c["version"] = version - if samesite is not None: - c["samesite"] = samesite - - if partitioned is not None: - c["partitioned"] = partitioned - - def del_cookie( - self, - name: str, - *, - domain: Optional[str] = None, - path: str = "/", - secure: Optional[bool] = None, - httponly: Optional[bool] = None, - samesite: Optional[str] = None, - ) -> None: - """Delete cookie. - - Creates new empty expired cookie. - """ - # TODO: do we need domain/path here? - if self._cookies is not None: - self._cookies.pop(name, None) - self.set_cookie( - name, - "", - max_age=0, - expires="Thu, 01 Jan 1970 00:00:00 GMT", - domain=domain, - path=path, - secure=secure, - httponly=httponly, - samesite=samesite, - ) - - @property - def content_length(self) -> Optional[int]: - # Just a placeholder for adding setter - return super().content_length - - @content_length.setter - def content_length(self, value: Optional[int]) -> None: - if value is not None: - value = int(value) - if self._chunked: - raise RuntimeError( - "You can't set content length when chunked encoding is enable" - ) - self._headers[hdrs.CONTENT_LENGTH] = str(value) - else: - self._headers.pop(hdrs.CONTENT_LENGTH, None) - - @property - def content_type(self) -> str: - # Just a placeholder for adding setter - return super().content_type - - @content_type.setter - def content_type(self, value: str) -> None: - self.content_type # read header values if needed - self._content_type = str(value) - self._generate_content_type_header() - - @property - def charset(self) -> Optional[str]: - # Just a placeholder for adding setter - return super().charset - - @charset.setter - def charset(self, value: Optional[str]) -> None: - ctype = self.content_type # read header values if needed - if ctype == "application/octet-stream": - raise RuntimeError( - "Setting charset for application/octet-stream " - "doesn't make sense, setup content_type first" - ) - assert self._content_dict is not None - if value is None: - self._content_dict.pop("charset", None) - else: - self._content_dict["charset"] = str(value).lower() - self._generate_content_type_header() - - @property - def last_modified(self) -> Optional[datetime.datetime]: - """The value of Last-Modified HTTP header, or None. - - This header is represented as a `datetime` object. - """ - return parse_http_date(self._headers.get(hdrs.LAST_MODIFIED)) - - @last_modified.setter - def last_modified( - self, value: Optional[Union[int, float, datetime.datetime, str]] - ) -> None: - if value is None: - self._headers.pop(hdrs.LAST_MODIFIED, None) - elif isinstance(value, (int, float)): - self._headers[hdrs.LAST_MODIFIED] = time.strftime( - "%a, %d %b %Y %H:%M:%S GMT", time.gmtime(math.ceil(value)) - ) - elif isinstance(value, datetime.datetime): - self._headers[hdrs.LAST_MODIFIED] = time.strftime( - "%a, %d %b %Y %H:%M:%S GMT", value.utctimetuple() - ) - elif isinstance(value, str): - self._headers[hdrs.LAST_MODIFIED] = value - else: - msg = f"Unsupported type for last_modified: {type(value).__name__}" - raise TypeError(msg) - - @property - def etag(self) -> Optional[ETag]: - quoted_value = self._headers.get(hdrs.ETAG) - if not quoted_value: - return None - elif quoted_value == ETAG_ANY: - return ETag(value=ETAG_ANY) - match = QUOTED_ETAG_RE.fullmatch(quoted_value) - if not match: - return None - is_weak, value = match.group(1, 2) - return ETag( - is_weak=bool(is_weak), - value=value, - ) - - @etag.setter - def etag(self, value: Optional[Union[ETag, str]]) -> None: - if value is None: - self._headers.pop(hdrs.ETAG, None) - elif (isinstance(value, str) and value == ETAG_ANY) or ( - isinstance(value, ETag) and value.value == ETAG_ANY - ): - self._headers[hdrs.ETAG] = ETAG_ANY - elif isinstance(value, str): - validate_etag_value(value) - self._headers[hdrs.ETAG] = f'"{value}"' - elif isinstance(value, ETag) and isinstance(value.value, str): - validate_etag_value(value.value) - hdr_value = f'W/"{value.value}"' if value.is_weak else f'"{value.value}"' - self._headers[hdrs.ETAG] = hdr_value - else: - raise ValueError( - f"Unsupported etag type: {type(value)}. " - f"etag must be str, ETag or None" - ) - - def _generate_content_type_header( - self, CONTENT_TYPE: istr = hdrs.CONTENT_TYPE - ) -> None: - assert self._content_dict is not None - assert self._content_type is not None - params = "; ".join(f"{k}={v}" for k, v in self._content_dict.items()) - if params: - ctype = self._content_type + "; " + params - else: - ctype = self._content_type - self._headers[CONTENT_TYPE] = ctype - - async def _do_start_compression(self, coding: ContentCoding) -> None: - if coding is ContentCoding.identity: - return - assert self._payload_writer is not None - self._headers[hdrs.CONTENT_ENCODING] = coding.value - self._payload_writer.enable_compression( - coding.value, self._compression_strategy - ) - # Compressed payload may have different content length, - # remove the header - self._headers.popall(hdrs.CONTENT_LENGTH, None) - - async def _start_compression(self, request: "BaseRequest") -> None: - if self._compression_force: - await self._do_start_compression(self._compression_force) - return - # Encoding comparisons should be case-insensitive - # https://www.rfc-editor.org/rfc/rfc9110#section-8.4.1 - accept_encoding = request.headers.get(hdrs.ACCEPT_ENCODING, "").lower() - for value, coding in CONTENT_CODINGS.items(): - if value in accept_encoding: - await self._do_start_compression(coding) - return - - async def prepare(self, request: "BaseRequest") -> Optional[AbstractStreamWriter]: - if self._eof_sent: - return None - if self._payload_writer is not None: - return self._payload_writer - self._must_be_empty_body = must_be_empty_body(request.method, self.status) - return await self._start(request) - - async def _start(self, request: "BaseRequest") -> AbstractStreamWriter: - self._req = request - writer = self._payload_writer = request._payload_writer - - await self._prepare_headers() - await request._prepare_hook(self) - await self._write_headers() - - return writer - - async def _prepare_headers(self) -> None: - request = self._req - assert request is not None - writer = self._payload_writer - assert writer is not None - keep_alive = self._keep_alive - if keep_alive is None: - keep_alive = request.keep_alive - self._keep_alive = keep_alive - - version = request.version - - headers = self._headers - if self._cookies: - for cookie in self._cookies.values(): - value = cookie.output(header="")[1:] - headers.add(hdrs.SET_COOKIE, value) - - if self._compression: - await self._start_compression(request) - - if self._chunked: - if version != HttpVersion11: - raise RuntimeError( - "Using chunked encoding is forbidden " - "for HTTP/{0.major}.{0.minor}".format(request.version) - ) - if not self._must_be_empty_body: - writer.enable_chunking() - headers[hdrs.TRANSFER_ENCODING] = "chunked" - elif self._length_check: # Disabled for WebSockets - writer.length = self.content_length - if writer.length is None: - if version >= HttpVersion11: - if not self._must_be_empty_body: - writer.enable_chunking() - headers[hdrs.TRANSFER_ENCODING] = "chunked" - elif not self._must_be_empty_body: - keep_alive = False - - # HTTP 1.1: https://tools.ietf.org/html/rfc7230#section-3.3.2 - # HTTP 1.0: https://tools.ietf.org/html/rfc1945#section-10.4 - if self._must_be_empty_body: - if hdrs.CONTENT_LENGTH in headers and should_remove_content_length( - request.method, self.status - ): - del headers[hdrs.CONTENT_LENGTH] - # https://datatracker.ietf.org/doc/html/rfc9112#section-6.1-10 - # https://datatracker.ietf.org/doc/html/rfc9112#section-6.1-13 - if hdrs.TRANSFER_ENCODING in headers: - del headers[hdrs.TRANSFER_ENCODING] - elif (writer.length if self._length_check else self.content_length) != 0: - # https://www.rfc-editor.org/rfc/rfc9110#section-8.3-5 - headers.setdefault(hdrs.CONTENT_TYPE, "application/octet-stream") - headers.setdefault(hdrs.DATE, rfc822_formatted_time()) - headers.setdefault(hdrs.SERVER, SERVER_SOFTWARE) - - # connection header - if hdrs.CONNECTION not in headers: - if keep_alive: - if version == HttpVersion10: - headers[hdrs.CONNECTION] = "keep-alive" - elif version == HttpVersion11: - headers[hdrs.CONNECTION] = "close" - - async def _write_headers(self) -> None: - request = self._req - assert request is not None - writer = self._payload_writer - assert writer is not None - # status line - version = request.version - status_line = f"HTTP/{version[0]}.{version[1]} {self._status} {self._reason}" - await writer.write_headers(status_line, self._headers) - # Send headers immediately if not opted into buffering - if self._send_headers_immediately: - writer.send_headers() - - async def write(self, data: Union[bytes, bytearray, memoryview]) -> None: - assert isinstance( - data, (bytes, bytearray, memoryview) - ), "data argument must be byte-ish (%r)" % type(data) - - if self._eof_sent: - raise RuntimeError("Cannot call write() after write_eof()") - if self._payload_writer is None: - raise RuntimeError("Cannot call write() before prepare()") - - await self._payload_writer.write(data) - - async def drain(self) -> None: - assert not self._eof_sent, "EOF has already been sent" - assert self._payload_writer is not None, "Response has not been started" - warnings.warn( - "drain method is deprecated, use await resp.write()", - DeprecationWarning, - stacklevel=2, - ) - await self._payload_writer.drain() - - async def write_eof(self, data: bytes = b"") -> None: - assert isinstance( - data, (bytes, bytearray, memoryview) - ), "data argument must be byte-ish (%r)" % type(data) - - if self._eof_sent: - return - - assert self._payload_writer is not None, "Response has not been started" - - await self._payload_writer.write_eof(data) - self._eof_sent = True - self._req = None - self._body_length = self._payload_writer.output_size - self._payload_writer = None - - def __repr__(self) -> str: - if self._eof_sent: - info = "eof" - elif self.prepared: - assert self._req is not None - info = f"{self._req.method} {self._req.path} " - else: - info = "not prepared" - return f"<{self.__class__.__name__} {self.reason} {info}>" - - def __getitem__(self, key: str) -> Any: - return self._state[key] - - def __setitem__(self, key: str, value: Any) -> None: - self._state[key] = value - - def __delitem__(self, key: str) -> None: - del self._state[key] - - def __len__(self) -> int: - return len(self._state) - - def __iter__(self) -> Iterator[str]: - return iter(self._state) - - def __hash__(self) -> int: - return hash(id(self)) - - def __eq__(self, other: object) -> bool: - return self is other - - def __bool__(self) -> bool: - return True - - -class Response(StreamResponse): - - _compressed_body: Optional[bytes] = None - _send_headers_immediately = False - - def __init__( - self, - *, - body: Any = None, - status: int = 200, - reason: Optional[str] = None, - text: Optional[str] = None, - headers: Optional[LooseHeaders] = None, - content_type: Optional[str] = None, - charset: Optional[str] = None, - zlib_executor_size: Optional[int] = None, - zlib_executor: Optional[Executor] = None, - ) -> None: - if body is not None and text is not None: - raise ValueError("body and text are not allowed together") - - if headers is None: - real_headers: CIMultiDict[str] = CIMultiDict() - else: - real_headers = CIMultiDict(headers) - - if content_type is not None and "charset" in content_type: - raise ValueError("charset must not be in content_type argument") - - if text is not None: - if hdrs.CONTENT_TYPE in real_headers: - if content_type or charset: - raise ValueError( - "passing both Content-Type header and " - "content_type or charset params " - "is forbidden" - ) - else: - # fast path for filling headers - if not isinstance(text, str): - raise TypeError("text argument must be str (%r)" % type(text)) - if content_type is None: - content_type = "text/plain" - if charset is None: - charset = "utf-8" - real_headers[hdrs.CONTENT_TYPE] = content_type + "; charset=" + charset - body = text.encode(charset) - text = None - elif hdrs.CONTENT_TYPE in real_headers: - if content_type is not None or charset is not None: - raise ValueError( - "passing both Content-Type header and " - "content_type or charset params " - "is forbidden" - ) - elif content_type is not None: - if charset is not None: - content_type += "; charset=" + charset - real_headers[hdrs.CONTENT_TYPE] = content_type - - super().__init__(status=status, reason=reason, _real_headers=real_headers) - - if text is not None: - self.text = text - else: - self.body = body - - self._zlib_executor_size = zlib_executor_size - self._zlib_executor = zlib_executor - - @property - def body(self) -> Optional[Union[bytes, Payload]]: - return self._body - - @body.setter - def body(self, body: Any) -> None: - if body is None: - self._body = None - elif isinstance(body, (bytes, bytearray)): - self._body = body - else: - try: - self._body = body = payload.PAYLOAD_REGISTRY.get(body) - except payload.LookupError: - raise ValueError("Unsupported body type %r" % type(body)) - - headers = self._headers - - # set content-type - if hdrs.CONTENT_TYPE not in headers: - headers[hdrs.CONTENT_TYPE] = body.content_type - - # copy payload headers - if body.headers: - for key, value in body.headers.items(): - if key not in headers: - headers[key] = value - - self._compressed_body = None - - @property - def text(self) -> Optional[str]: - if self._body is None: - return None - # Note: When _body is a Payload (e.g. FilePayload), this may do blocking I/O - # This is generally safe as most common payloads (BytesPayload, StringPayload) - # don't do blocking I/O, but be careful with file-based payloads - return self._body.decode(self.charset or "utf-8") - - @text.setter - def text(self, text: str) -> None: - assert text is None or isinstance( - text, str - ), "text argument must be str (%r)" % type(text) - - if self.content_type == "application/octet-stream": - self.content_type = "text/plain" - if self.charset is None: - self.charset = "utf-8" - - self._body = text.encode(self.charset) - self._compressed_body = None - - @property - def content_length(self) -> Optional[int]: - if self._chunked: - return None - - if hdrs.CONTENT_LENGTH in self._headers: - return int(self._headers[hdrs.CONTENT_LENGTH]) - - if self._compressed_body is not None: - # Return length of the compressed body - return len(self._compressed_body) - elif isinstance(self._body, Payload): - # A payload without content length, or a compressed payload - return None - elif self._body is not None: - return len(self._body) - else: - return 0 - - @content_length.setter - def content_length(self, value: Optional[int]) -> None: - raise RuntimeError("Content length is set automatically") - - async def write_eof(self, data: bytes = b"") -> None: - if self._eof_sent: - return - if self._compressed_body is None: - body: Optional[Union[bytes, Payload]] = self._body - else: - body = self._compressed_body - assert not data, f"data arg is not supported, got {data!r}" - assert self._req is not None - assert self._payload_writer is not None - if body is None or self._must_be_empty_body: - await super().write_eof() - elif isinstance(self._body, Payload): - await self._body.write(self._payload_writer) - await self._body.close() - await super().write_eof() - else: - await super().write_eof(cast(bytes, body)) - - async def _start(self, request: "BaseRequest") -> AbstractStreamWriter: - if hdrs.CONTENT_LENGTH in self._headers: - if should_remove_content_length(request.method, self.status): - del self._headers[hdrs.CONTENT_LENGTH] - elif not self._chunked: - if isinstance(self._body, Payload): - if self._body.size is not None: - self._headers[hdrs.CONTENT_LENGTH] = str(self._body.size) - else: - body_len = len(self._body) if self._body else "0" - # https://www.rfc-editor.org/rfc/rfc9110.html#section-8.6-7 - if body_len != "0" or ( - self.status != 304 and request.method not in hdrs.METH_HEAD_ALL - ): - self._headers[hdrs.CONTENT_LENGTH] = str(body_len) - - return await super()._start(request) - - async def _do_start_compression(self, coding: ContentCoding) -> None: - if self._chunked or isinstance(self._body, Payload): - return await super()._do_start_compression(coding) - if coding is ContentCoding.identity: - return - # Instead of using _payload_writer.enable_compression, - # compress the whole body - compressor = ZLibCompressor( - encoding=coding.value, - max_sync_chunk_size=self._zlib_executor_size, - executor=self._zlib_executor, - ) - assert self._body is not None - if self._zlib_executor_size is None and len(self._body) > LARGE_BODY_SIZE: - warnings.warn( - "Synchronous compression of large response bodies " - f"({len(self._body)} bytes) might block the async event loop. " - "Consider providing a custom value to zlib_executor_size/" - "zlib_executor response properties or disabling compression on it." - ) - self._compressed_body = ( - await compressor.compress(self._body) + compressor.flush() - ) - self._headers[hdrs.CONTENT_ENCODING] = coding.value - self._headers[hdrs.CONTENT_LENGTH] = str(len(self._compressed_body)) - - -def json_response( - data: Any = sentinel, - *, - text: Optional[str] = None, - body: Optional[bytes] = None, - status: int = 200, - reason: Optional[str] = None, - headers: Optional[LooseHeaders] = None, - content_type: str = "application/json", - dumps: JSONEncoder = json.dumps, -) -> Response: - if data is not sentinel: - if text or body: - raise ValueError("only one of data, text, or body should be specified") - else: - text = dumps(data) - return Response( - text=text, - body=body, - status=status, - reason=reason, - headers=headers, - content_type=content_type, - ) diff --git a/venv/lib/python3.12/site-packages/aiohttp/web_routedef.py b/venv/lib/python3.12/site-packages/aiohttp/web_routedef.py deleted file mode 100644 index f51b6cd..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/web_routedef.py +++ /dev/null @@ -1,214 +0,0 @@ -import abc -import os # noqa -from typing import ( - TYPE_CHECKING, - Any, - Callable, - Dict, - Iterator, - List, - Optional, - Sequence, - Type, - Union, - overload, -) - -import attr - -from . import hdrs -from .abc import AbstractView -from .typedefs import Handler, PathLike - -if TYPE_CHECKING: - from .web_request import Request - from .web_response import StreamResponse - from .web_urldispatcher import AbstractRoute, UrlDispatcher -else: - Request = StreamResponse = UrlDispatcher = AbstractRoute = None - - -__all__ = ( - "AbstractRouteDef", - "RouteDef", - "StaticDef", - "RouteTableDef", - "head", - "options", - "get", - "post", - "patch", - "put", - "delete", - "route", - "view", - "static", -) - - -class AbstractRouteDef(abc.ABC): - @abc.abstractmethod - def register(self, router: UrlDispatcher) -> List[AbstractRoute]: - pass # pragma: no cover - - -_HandlerType = Union[Type[AbstractView], Handler] - - -@attr.s(auto_attribs=True, frozen=True, repr=False, slots=True) -class RouteDef(AbstractRouteDef): - method: str - path: str - handler: _HandlerType - kwargs: Dict[str, Any] - - def __repr__(self) -> str: - info = [] - for name, value in sorted(self.kwargs.items()): - info.append(f", {name}={value!r}") - return " {handler.__name__!r}{info}>".format( - method=self.method, path=self.path, handler=self.handler, info="".join(info) - ) - - def register(self, router: UrlDispatcher) -> List[AbstractRoute]: - if self.method in hdrs.METH_ALL: - reg = getattr(router, "add_" + self.method.lower()) - return [reg(self.path, self.handler, **self.kwargs)] - else: - return [ - router.add_route(self.method, self.path, self.handler, **self.kwargs) - ] - - -@attr.s(auto_attribs=True, frozen=True, repr=False, slots=True) -class StaticDef(AbstractRouteDef): - prefix: str - path: PathLike - kwargs: Dict[str, Any] - - def __repr__(self) -> str: - info = [] - for name, value in sorted(self.kwargs.items()): - info.append(f", {name}={value!r}") - return " {path}{info}>".format( - prefix=self.prefix, path=self.path, info="".join(info) - ) - - def register(self, router: UrlDispatcher) -> List[AbstractRoute]: - resource = router.add_static(self.prefix, self.path, **self.kwargs) - routes = resource.get_info().get("routes", {}) - return list(routes.values()) - - -def route(method: str, path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: - return RouteDef(method, path, handler, kwargs) - - -def head(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: - return route(hdrs.METH_HEAD, path, handler, **kwargs) - - -def options(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: - return route(hdrs.METH_OPTIONS, path, handler, **kwargs) - - -def get( - path: str, - handler: _HandlerType, - *, - name: Optional[str] = None, - allow_head: bool = True, - **kwargs: Any, -) -> RouteDef: - return route( - hdrs.METH_GET, path, handler, name=name, allow_head=allow_head, **kwargs - ) - - -def post(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: - return route(hdrs.METH_POST, path, handler, **kwargs) - - -def put(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: - return route(hdrs.METH_PUT, path, handler, **kwargs) - - -def patch(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: - return route(hdrs.METH_PATCH, path, handler, **kwargs) - - -def delete(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: - return route(hdrs.METH_DELETE, path, handler, **kwargs) - - -def view(path: str, handler: Type[AbstractView], **kwargs: Any) -> RouteDef: - return route(hdrs.METH_ANY, path, handler, **kwargs) - - -def static(prefix: str, path: PathLike, **kwargs: Any) -> StaticDef: - return StaticDef(prefix, path, kwargs) - - -_Deco = Callable[[_HandlerType], _HandlerType] - - -class RouteTableDef(Sequence[AbstractRouteDef]): - """Route definition table""" - - def __init__(self) -> None: - self._items: List[AbstractRouteDef] = [] - - def __repr__(self) -> str: - return f"" - - @overload - def __getitem__(self, index: int) -> AbstractRouteDef: ... - - @overload - def __getitem__(self, index: slice) -> List[AbstractRouteDef]: ... - - def __getitem__(self, index): # type: ignore[no-untyped-def] - return self._items[index] - - def __iter__(self) -> Iterator[AbstractRouteDef]: - return iter(self._items) - - def __len__(self) -> int: - return len(self._items) - - def __contains__(self, item: object) -> bool: - return item in self._items - - def route(self, method: str, path: str, **kwargs: Any) -> _Deco: - def inner(handler: _HandlerType) -> _HandlerType: - self._items.append(RouteDef(method, path, handler, kwargs)) - return handler - - return inner - - def head(self, path: str, **kwargs: Any) -> _Deco: - return self.route(hdrs.METH_HEAD, path, **kwargs) - - def get(self, path: str, **kwargs: Any) -> _Deco: - return self.route(hdrs.METH_GET, path, **kwargs) - - def post(self, path: str, **kwargs: Any) -> _Deco: - return self.route(hdrs.METH_POST, path, **kwargs) - - def put(self, path: str, **kwargs: Any) -> _Deco: - return self.route(hdrs.METH_PUT, path, **kwargs) - - def patch(self, path: str, **kwargs: Any) -> _Deco: - return self.route(hdrs.METH_PATCH, path, **kwargs) - - def delete(self, path: str, **kwargs: Any) -> _Deco: - return self.route(hdrs.METH_DELETE, path, **kwargs) - - def options(self, path: str, **kwargs: Any) -> _Deco: - return self.route(hdrs.METH_OPTIONS, path, **kwargs) - - def view(self, path: str, **kwargs: Any) -> _Deco: - return self.route(hdrs.METH_ANY, path, **kwargs) - - def static(self, prefix: str, path: PathLike, **kwargs: Any) -> None: - self._items.append(StaticDef(prefix, path, kwargs)) diff --git a/venv/lib/python3.12/site-packages/aiohttp/web_runner.py b/venv/lib/python3.12/site-packages/aiohttp/web_runner.py deleted file mode 100644 index bcfec72..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/web_runner.py +++ /dev/null @@ -1,399 +0,0 @@ -import asyncio -import signal -import socket -import warnings -from abc import ABC, abstractmethod -from typing import TYPE_CHECKING, Any, List, Optional, Set - -from yarl import URL - -from .typedefs import PathLike -from .web_app import Application -from .web_server import Server - -if TYPE_CHECKING: - from ssl import SSLContext -else: - try: - from ssl import SSLContext - except ImportError: # pragma: no cover - SSLContext = object # type: ignore[misc,assignment] - -__all__ = ( - "BaseSite", - "TCPSite", - "UnixSite", - "NamedPipeSite", - "SockSite", - "BaseRunner", - "AppRunner", - "ServerRunner", - "GracefulExit", -) - - -class GracefulExit(SystemExit): - code = 1 - - -def _raise_graceful_exit() -> None: - raise GracefulExit() - - -class BaseSite(ABC): - __slots__ = ("_runner", "_ssl_context", "_backlog", "_server") - - def __init__( - self, - runner: "BaseRunner", - *, - shutdown_timeout: float = 60.0, - ssl_context: Optional[SSLContext] = None, - backlog: int = 128, - ) -> None: - if runner.server is None: - raise RuntimeError("Call runner.setup() before making a site") - if shutdown_timeout != 60.0: - msg = "shutdown_timeout should be set on BaseRunner" - warnings.warn(msg, DeprecationWarning, stacklevel=2) - runner._shutdown_timeout = shutdown_timeout - self._runner = runner - self._ssl_context = ssl_context - self._backlog = backlog - self._server: Optional[asyncio.AbstractServer] = None - - @property - @abstractmethod - def name(self) -> str: - pass # pragma: no cover - - @abstractmethod - async def start(self) -> None: - self._runner._reg_site(self) - - async def stop(self) -> None: - self._runner._check_site(self) - if self._server is not None: # Maybe not started yet - self._server.close() - - self._runner._unreg_site(self) - - -class TCPSite(BaseSite): - __slots__ = ("_host", "_port", "_reuse_address", "_reuse_port") - - def __init__( - self, - runner: "BaseRunner", - host: Optional[str] = None, - port: Optional[int] = None, - *, - shutdown_timeout: float = 60.0, - ssl_context: Optional[SSLContext] = None, - backlog: int = 128, - reuse_address: Optional[bool] = None, - reuse_port: Optional[bool] = None, - ) -> None: - super().__init__( - runner, - shutdown_timeout=shutdown_timeout, - ssl_context=ssl_context, - backlog=backlog, - ) - self._host = host - if port is None: - port = 8443 if self._ssl_context else 8080 - self._port = port - self._reuse_address = reuse_address - self._reuse_port = reuse_port - - @property - def name(self) -> str: - scheme = "https" if self._ssl_context else "http" - host = "0.0.0.0" if not self._host else self._host - return str(URL.build(scheme=scheme, host=host, port=self._port)) - - async def start(self) -> None: - await super().start() - loop = asyncio.get_event_loop() - server = self._runner.server - assert server is not None - self._server = await loop.create_server( - server, - self._host, - self._port, - ssl=self._ssl_context, - backlog=self._backlog, - reuse_address=self._reuse_address, - reuse_port=self._reuse_port, - ) - - -class UnixSite(BaseSite): - __slots__ = ("_path",) - - def __init__( - self, - runner: "BaseRunner", - path: PathLike, - *, - shutdown_timeout: float = 60.0, - ssl_context: Optional[SSLContext] = None, - backlog: int = 128, - ) -> None: - super().__init__( - runner, - shutdown_timeout=shutdown_timeout, - ssl_context=ssl_context, - backlog=backlog, - ) - self._path = path - - @property - def name(self) -> str: - scheme = "https" if self._ssl_context else "http" - return f"{scheme}://unix:{self._path}:" - - async def start(self) -> None: - await super().start() - loop = asyncio.get_event_loop() - server = self._runner.server - assert server is not None - self._server = await loop.create_unix_server( - server, - self._path, - ssl=self._ssl_context, - backlog=self._backlog, - ) - - -class NamedPipeSite(BaseSite): - __slots__ = ("_path",) - - def __init__( - self, runner: "BaseRunner", path: str, *, shutdown_timeout: float = 60.0 - ) -> None: - loop = asyncio.get_event_loop() - if not isinstance( - loop, asyncio.ProactorEventLoop # type: ignore[attr-defined] - ): - raise RuntimeError( - "Named Pipes only available in proactor loop under windows" - ) - super().__init__(runner, shutdown_timeout=shutdown_timeout) - self._path = path - - @property - def name(self) -> str: - return self._path - - async def start(self) -> None: - await super().start() - loop = asyncio.get_event_loop() - server = self._runner.server - assert server is not None - _server = await loop.start_serving_pipe( # type: ignore[attr-defined] - server, self._path - ) - self._server = _server[0] - - -class SockSite(BaseSite): - __slots__ = ("_sock", "_name") - - def __init__( - self, - runner: "BaseRunner", - sock: socket.socket, - *, - shutdown_timeout: float = 60.0, - ssl_context: Optional[SSLContext] = None, - backlog: int = 128, - ) -> None: - super().__init__( - runner, - shutdown_timeout=shutdown_timeout, - ssl_context=ssl_context, - backlog=backlog, - ) - self._sock = sock - scheme = "https" if self._ssl_context else "http" - if hasattr(socket, "AF_UNIX") and sock.family == socket.AF_UNIX: - name = f"{scheme}://unix:{sock.getsockname()}:" - else: - host, port = sock.getsockname()[:2] - name = str(URL.build(scheme=scheme, host=host, port=port)) - self._name = name - - @property - def name(self) -> str: - return self._name - - async def start(self) -> None: - await super().start() - loop = asyncio.get_event_loop() - server = self._runner.server - assert server is not None - self._server = await loop.create_server( - server, sock=self._sock, ssl=self._ssl_context, backlog=self._backlog - ) - - -class BaseRunner(ABC): - __slots__ = ("_handle_signals", "_kwargs", "_server", "_sites", "_shutdown_timeout") - - def __init__( - self, - *, - handle_signals: bool = False, - shutdown_timeout: float = 60.0, - **kwargs: Any, - ) -> None: - self._handle_signals = handle_signals - self._kwargs = kwargs - self._server: Optional[Server] = None - self._sites: List[BaseSite] = [] - self._shutdown_timeout = shutdown_timeout - - @property - def server(self) -> Optional[Server]: - return self._server - - @property - def addresses(self) -> List[Any]: - ret: List[Any] = [] - for site in self._sites: - server = site._server - if server is not None: - sockets = server.sockets # type: ignore[attr-defined] - if sockets is not None: - for sock in sockets: - ret.append(sock.getsockname()) - return ret - - @property - def sites(self) -> Set[BaseSite]: - return set(self._sites) - - async def setup(self) -> None: - loop = asyncio.get_event_loop() - - if self._handle_signals: - try: - loop.add_signal_handler(signal.SIGINT, _raise_graceful_exit) - loop.add_signal_handler(signal.SIGTERM, _raise_graceful_exit) - except NotImplementedError: # pragma: no cover - # add_signal_handler is not implemented on Windows - pass - - self._server = await self._make_server() - - @abstractmethod - async def shutdown(self) -> None: - """Call any shutdown hooks to help server close gracefully.""" - - async def cleanup(self) -> None: - # The loop over sites is intentional, an exception on gather() - # leaves self._sites in unpredictable state. - # The loop guaranties that a site is either deleted on success or - # still present on failure - for site in list(self._sites): - await site.stop() - - if self._server: # If setup succeeded - # Yield to event loop to ensure incoming requests prior to stopping the sites - # have all started to be handled before we proceed to close idle connections. - await asyncio.sleep(0) - self._server.pre_shutdown() - await self.shutdown() - await self._server.shutdown(self._shutdown_timeout) - await self._cleanup_server() - - self._server = None - if self._handle_signals: - loop = asyncio.get_running_loop() - try: - loop.remove_signal_handler(signal.SIGINT) - loop.remove_signal_handler(signal.SIGTERM) - except NotImplementedError: # pragma: no cover - # remove_signal_handler is not implemented on Windows - pass - - @abstractmethod - async def _make_server(self) -> Server: - pass # pragma: no cover - - @abstractmethod - async def _cleanup_server(self) -> None: - pass # pragma: no cover - - def _reg_site(self, site: BaseSite) -> None: - if site in self._sites: - raise RuntimeError(f"Site {site} is already registered in runner {self}") - self._sites.append(site) - - def _check_site(self, site: BaseSite) -> None: - if site not in self._sites: - raise RuntimeError(f"Site {site} is not registered in runner {self}") - - def _unreg_site(self, site: BaseSite) -> None: - if site not in self._sites: - raise RuntimeError(f"Site {site} is not registered in runner {self}") - self._sites.remove(site) - - -class ServerRunner(BaseRunner): - """Low-level web server runner""" - - __slots__ = ("_web_server",) - - def __init__( - self, web_server: Server, *, handle_signals: bool = False, **kwargs: Any - ) -> None: - super().__init__(handle_signals=handle_signals, **kwargs) - self._web_server = web_server - - async def shutdown(self) -> None: - pass - - async def _make_server(self) -> Server: - return self._web_server - - async def _cleanup_server(self) -> None: - pass - - -class AppRunner(BaseRunner): - """Web Application runner""" - - __slots__ = ("_app",) - - def __init__( - self, app: Application, *, handle_signals: bool = False, **kwargs: Any - ) -> None: - super().__init__(handle_signals=handle_signals, **kwargs) - if not isinstance(app, Application): - raise TypeError( - "The first argument should be web.Application " - "instance, got {!r}".format(app) - ) - self._app = app - - @property - def app(self) -> Application: - return self._app - - async def shutdown(self) -> None: - await self._app.shutdown() - - async def _make_server(self) -> Server: - loop = asyncio.get_event_loop() - self._app._set_loop(loop) - self._app.on_startup.freeze() - await self._app.startup() - self._app.freeze() - - return self._app._make_handler(loop=loop, **self._kwargs) - - async def _cleanup_server(self) -> None: - await self._app.cleanup() diff --git a/venv/lib/python3.12/site-packages/aiohttp/web_server.py b/venv/lib/python3.12/site-packages/aiohttp/web_server.py deleted file mode 100644 index 328aca1..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/web_server.py +++ /dev/null @@ -1,84 +0,0 @@ -"""Low level HTTP server.""" - -import asyncio -from typing import Any, Awaitable, Callable, Dict, List, Optional # noqa - -from .abc import AbstractStreamWriter -from .http_parser import RawRequestMessage -from .streams import StreamReader -from .web_protocol import RequestHandler, _RequestFactory, _RequestHandler -from .web_request import BaseRequest - -__all__ = ("Server",) - - -class Server: - def __init__( - self, - handler: _RequestHandler, - *, - request_factory: Optional[_RequestFactory] = None, - handler_cancellation: bool = False, - loop: Optional[asyncio.AbstractEventLoop] = None, - **kwargs: Any, - ) -> None: - self._loop = loop or asyncio.get_running_loop() - self._connections: Dict[RequestHandler, asyncio.Transport] = {} - self._kwargs = kwargs - # requests_count is the number of requests being processed by the server - # for the lifetime of the server. - self.requests_count = 0 - self.request_handler = handler - self.request_factory = request_factory or self._make_request - self.handler_cancellation = handler_cancellation - - @property - def connections(self) -> List[RequestHandler]: - return list(self._connections.keys()) - - def connection_made( - self, handler: RequestHandler, transport: asyncio.Transport - ) -> None: - self._connections[handler] = transport - - def connection_lost( - self, handler: RequestHandler, exc: Optional[BaseException] = None - ) -> None: - if handler in self._connections: - if handler._task_handler: - handler._task_handler.add_done_callback( - lambda f: self._connections.pop(handler, None) - ) - else: - del self._connections[handler] - - def _make_request( - self, - message: RawRequestMessage, - payload: StreamReader, - protocol: RequestHandler, - writer: AbstractStreamWriter, - task: "asyncio.Task[None]", - ) -> BaseRequest: - return BaseRequest(message, payload, protocol, writer, task, self._loop) - - def pre_shutdown(self) -> None: - for conn in self._connections: - conn.close() - - async def shutdown(self, timeout: Optional[float] = None) -> None: - coros = (conn.shutdown(timeout) for conn in self._connections) - await asyncio.gather(*coros) - self._connections.clear() - - def __call__(self) -> RequestHandler: - try: - return RequestHandler(self, loop=self._loop, **self._kwargs) - except TypeError: - # Failsafe creation: remove all custom handler_args - kwargs = { - k: v - for k, v in self._kwargs.items() - if k in ["debug", "access_log_class"] - } - return RequestHandler(self, loop=self._loop, **kwargs) diff --git a/venv/lib/python3.12/site-packages/aiohttp/web_urldispatcher.py b/venv/lib/python3.12/site-packages/aiohttp/web_urldispatcher.py deleted file mode 100644 index 28ae251..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/web_urldispatcher.py +++ /dev/null @@ -1,1303 +0,0 @@ -import abc -import asyncio -import base64 -import functools -import hashlib -import html -import inspect -import keyword -import os -import re -import sys -import warnings -from functools import wraps -from pathlib import Path -from types import MappingProxyType -from typing import ( - TYPE_CHECKING, - Any, - Awaitable, - Callable, - Container, - Dict, - Final, - Generator, - Iterable, - Iterator, - List, - Mapping, - NoReturn, - Optional, - Pattern, - Set, - Sized, - Tuple, - Type, - TypedDict, - Union, - cast, -) - -from yarl import URL, __version__ as yarl_version - -from . import hdrs -from .abc import AbstractMatchInfo, AbstractRouter, AbstractView -from .helpers import DEBUG -from .http import HttpVersion11 -from .typedefs import Handler, PathLike -from .web_exceptions import ( - HTTPException, - HTTPExpectationFailed, - HTTPForbidden, - HTTPMethodNotAllowed, - HTTPNotFound, -) -from .web_fileresponse import FileResponse -from .web_request import Request -from .web_response import Response, StreamResponse -from .web_routedef import AbstractRouteDef - -__all__ = ( - "UrlDispatcher", - "UrlMappingMatchInfo", - "AbstractResource", - "Resource", - "PlainResource", - "DynamicResource", - "AbstractRoute", - "ResourceRoute", - "StaticResource", - "View", -) - - -if TYPE_CHECKING: - from .web_app import Application - - BaseDict = Dict[str, str] -else: - BaseDict = dict - -CIRCULAR_SYMLINK_ERROR = ( - (OSError,) - if sys.version_info < (3, 10) and sys.platform.startswith("win32") - else (RuntimeError,) if sys.version_info < (3, 13) else () -) - -YARL_VERSION: Final[Tuple[int, ...]] = tuple(map(int, yarl_version.split(".")[:2])) - -HTTP_METHOD_RE: Final[Pattern[str]] = re.compile( - r"^[0-9A-Za-z!#\$%&'\*\+\-\.\^_`\|~]+$" -) -ROUTE_RE: Final[Pattern[str]] = re.compile( - r"(\{[_a-zA-Z][^{}]*(?:\{[^{}]*\}[^{}]*)*\})" -) -PATH_SEP: Final[str] = re.escape("/") - - -_ExpectHandler = Callable[[Request], Awaitable[Optional[StreamResponse]]] -_Resolve = Tuple[Optional["UrlMappingMatchInfo"], Set[str]] - -html_escape = functools.partial(html.escape, quote=True) - - -class _InfoDict(TypedDict, total=False): - path: str - - formatter: str - pattern: Pattern[str] - - directory: Path - prefix: str - routes: Mapping[str, "AbstractRoute"] - - app: "Application" - - domain: str - - rule: "AbstractRuleMatching" - - http_exception: HTTPException - - -class AbstractResource(Sized, Iterable["AbstractRoute"]): - def __init__(self, *, name: Optional[str] = None) -> None: - self._name = name - - @property - def name(self) -> Optional[str]: - return self._name - - @property - @abc.abstractmethod - def canonical(self) -> str: - """Exposes the resource's canonical path. - - For example '/foo/bar/{name}' - - """ - - @abc.abstractmethod # pragma: no branch - def url_for(self, **kwargs: str) -> URL: - """Construct url for resource with additional params.""" - - @abc.abstractmethod # pragma: no branch - async def resolve(self, request: Request) -> _Resolve: - """Resolve resource. - - Return (UrlMappingMatchInfo, allowed_methods) pair. - """ - - @abc.abstractmethod - def add_prefix(self, prefix: str) -> None: - """Add a prefix to processed URLs. - - Required for subapplications support. - """ - - @abc.abstractmethod - def get_info(self) -> _InfoDict: - """Return a dict with additional info useful for introspection""" - - def freeze(self) -> None: - pass - - @abc.abstractmethod - def raw_match(self, path: str) -> bool: - """Perform a raw match against path""" - - -class AbstractRoute(abc.ABC): - def __init__( - self, - method: str, - handler: Union[Handler, Type[AbstractView]], - *, - expect_handler: Optional[_ExpectHandler] = None, - resource: Optional[AbstractResource] = None, - ) -> None: - - if expect_handler is None: - expect_handler = _default_expect_handler - - assert inspect.iscoroutinefunction(expect_handler) or ( - sys.version_info < (3, 14) and asyncio.iscoroutinefunction(expect_handler) - ), f"Coroutine is expected, got {expect_handler!r}" - - method = method.upper() - if not HTTP_METHOD_RE.match(method): - raise ValueError(f"{method} is not allowed HTTP method") - - assert callable(handler), handler - if inspect.iscoroutinefunction(handler) or ( - sys.version_info < (3, 14) and asyncio.iscoroutinefunction(handler) - ): - pass - elif inspect.isgeneratorfunction(handler): - warnings.warn( - "Bare generators are deprecated, use @coroutine wrapper", - DeprecationWarning, - ) - elif isinstance(handler, type) and issubclass(handler, AbstractView): - pass - else: - warnings.warn( - "Bare functions are deprecated, use async ones", DeprecationWarning - ) - - @wraps(handler) - async def handler_wrapper(request: Request) -> StreamResponse: - result = old_handler(request) # type: ignore[call-arg] - if asyncio.iscoroutine(result): - result = await result - assert isinstance(result, StreamResponse) - return result - - old_handler = handler - handler = handler_wrapper - - self._method = method - self._handler = handler - self._expect_handler = expect_handler - self._resource = resource - - @property - def method(self) -> str: - return self._method - - @property - def handler(self) -> Handler: - return self._handler - - @property - @abc.abstractmethod - def name(self) -> Optional[str]: - """Optional route's name, always equals to resource's name.""" - - @property - def resource(self) -> Optional[AbstractResource]: - return self._resource - - @abc.abstractmethod - def get_info(self) -> _InfoDict: - """Return a dict with additional info useful for introspection""" - - @abc.abstractmethod # pragma: no branch - def url_for(self, *args: str, **kwargs: str) -> URL: - """Construct url for route with additional params.""" - - async def handle_expect_header(self, request: Request) -> Optional[StreamResponse]: - return await self._expect_handler(request) - - -class UrlMappingMatchInfo(BaseDict, AbstractMatchInfo): - - __slots__ = ("_route", "_apps", "_current_app", "_frozen") - - def __init__(self, match_dict: Dict[str, str], route: AbstractRoute) -> None: - super().__init__(match_dict) - self._route = route - self._apps: List[Application] = [] - self._current_app: Optional[Application] = None - self._frozen = False - - @property - def handler(self) -> Handler: - return self._route.handler - - @property - def route(self) -> AbstractRoute: - return self._route - - @property - def expect_handler(self) -> _ExpectHandler: - return self._route.handle_expect_header - - @property - def http_exception(self) -> Optional[HTTPException]: - return None - - def get_info(self) -> _InfoDict: # type: ignore[override] - return self._route.get_info() - - @property - def apps(self) -> Tuple["Application", ...]: - return tuple(self._apps) - - def add_app(self, app: "Application") -> None: - if self._frozen: - raise RuntimeError("Cannot change apps stack after .freeze() call") - if self._current_app is None: - self._current_app = app - self._apps.insert(0, app) - - @property - def current_app(self) -> "Application": - app = self._current_app - assert app is not None - return app - - @current_app.setter - def current_app(self, app: "Application") -> None: - if DEBUG: # pragma: no cover - if app not in self._apps: - raise RuntimeError( - "Expected one of the following apps {!r}, got {!r}".format( - self._apps, app - ) - ) - self._current_app = app - - def freeze(self) -> None: - self._frozen = True - - def __repr__(self) -> str: - return f"" - - -class MatchInfoError(UrlMappingMatchInfo): - - __slots__ = ("_exception",) - - def __init__(self, http_exception: HTTPException) -> None: - self._exception = http_exception - super().__init__({}, SystemRoute(self._exception)) - - @property - def http_exception(self) -> HTTPException: - return self._exception - - def __repr__(self) -> str: - return "".format( - self._exception.status, self._exception.reason - ) - - -async def _default_expect_handler(request: Request) -> None: - """Default handler for Expect header. - - Just send "100 Continue" to client. - raise HTTPExpectationFailed if value of header is not "100-continue" - """ - expect = request.headers.get(hdrs.EXPECT, "") - if request.version == HttpVersion11: - if expect.lower() == "100-continue": - await request.writer.write(b"HTTP/1.1 100 Continue\r\n\r\n") - # Reset output_size as we haven't started the main body yet. - request.writer.output_size = 0 - else: - raise HTTPExpectationFailed(text="Unknown Expect: %s" % expect) - - -class Resource(AbstractResource): - def __init__(self, *, name: Optional[str] = None) -> None: - super().__init__(name=name) - self._routes: Dict[str, ResourceRoute] = {} - self._any_route: Optional[ResourceRoute] = None - self._allowed_methods: Set[str] = set() - - def add_route( - self, - method: str, - handler: Union[Type[AbstractView], Handler], - *, - expect_handler: Optional[_ExpectHandler] = None, - ) -> "ResourceRoute": - if route := self._routes.get(method, self._any_route): - raise RuntimeError( - "Added route will never be executed, " - f"method {route.method} is already " - "registered" - ) - - route_obj = ResourceRoute(method, handler, self, expect_handler=expect_handler) - self.register_route(route_obj) - return route_obj - - def register_route(self, route: "ResourceRoute") -> None: - assert isinstance( - route, ResourceRoute - ), f"Instance of Route class is required, got {route!r}" - if route.method == hdrs.METH_ANY: - self._any_route = route - self._allowed_methods.add(route.method) - self._routes[route.method] = route - - async def resolve(self, request: Request) -> _Resolve: - if (match_dict := self._match(request.rel_url.path_safe)) is None: - return None, set() - if route := self._routes.get(request.method, self._any_route): - return UrlMappingMatchInfo(match_dict, route), self._allowed_methods - return None, self._allowed_methods - - @abc.abstractmethod - def _match(self, path: str) -> Optional[Dict[str, str]]: - pass # pragma: no cover - - def __len__(self) -> int: - return len(self._routes) - - def __iter__(self) -> Iterator["ResourceRoute"]: - return iter(self._routes.values()) - - # TODO: implement all abstract methods - - -class PlainResource(Resource): - def __init__(self, path: str, *, name: Optional[str] = None) -> None: - super().__init__(name=name) - assert not path or path.startswith("/") - self._path = path - - @property - def canonical(self) -> str: - return self._path - - def freeze(self) -> None: - if not self._path: - self._path = "/" - - def add_prefix(self, prefix: str) -> None: - assert prefix.startswith("/") - assert not prefix.endswith("/") - assert len(prefix) > 1 - self._path = prefix + self._path - - def _match(self, path: str) -> Optional[Dict[str, str]]: - # string comparison is about 10 times faster than regexp matching - if self._path == path: - return {} - return None - - def raw_match(self, path: str) -> bool: - return self._path == path - - def get_info(self) -> _InfoDict: - return {"path": self._path} - - def url_for(self) -> URL: # type: ignore[override] - return URL.build(path=self._path, encoded=True) - - def __repr__(self) -> str: - name = "'" + self.name + "' " if self.name is not None else "" - return f"" - - -class DynamicResource(Resource): - - DYN = re.compile(r"\{(?P[_a-zA-Z][_a-zA-Z0-9]*)\}") - DYN_WITH_RE = re.compile(r"\{(?P[_a-zA-Z][_a-zA-Z0-9]*):(?P.+)\}") - GOOD = r"[^{}/]+" - - def __init__(self, path: str, *, name: Optional[str] = None) -> None: - super().__init__(name=name) - self._orig_path = path - pattern = "" - formatter = "" - for part in ROUTE_RE.split(path): - match = self.DYN.fullmatch(part) - if match: - pattern += "(?P<{}>{})".format(match.group("var"), self.GOOD) - formatter += "{" + match.group("var") + "}" - continue - - match = self.DYN_WITH_RE.fullmatch(part) - if match: - pattern += "(?P<{var}>{re})".format(**match.groupdict()) - formatter += "{" + match.group("var") + "}" - continue - - if "{" in part or "}" in part: - raise ValueError(f"Invalid path '{path}'['{part}']") - - part = _requote_path(part) - formatter += part - pattern += re.escape(part) - - try: - compiled = re.compile(pattern) - except re.error as exc: - raise ValueError(f"Bad pattern '{pattern}': {exc}") from None - assert compiled.pattern.startswith(PATH_SEP) - assert formatter.startswith("/") - self._pattern = compiled - self._formatter = formatter - - @property - def canonical(self) -> str: - return self._formatter - - def add_prefix(self, prefix: str) -> None: - assert prefix.startswith("/") - assert not prefix.endswith("/") - assert len(prefix) > 1 - self._pattern = re.compile(re.escape(prefix) + self._pattern.pattern) - self._formatter = prefix + self._formatter - - def _match(self, path: str) -> Optional[Dict[str, str]]: - match = self._pattern.fullmatch(path) - if match is None: - return None - return { - key: _unquote_path_safe(value) for key, value in match.groupdict().items() - } - - def raw_match(self, path: str) -> bool: - return self._orig_path == path - - def get_info(self) -> _InfoDict: - return {"formatter": self._formatter, "pattern": self._pattern} - - def url_for(self, **parts: str) -> URL: - url = self._formatter.format_map({k: _quote_path(v) for k, v in parts.items()}) - return URL.build(path=url, encoded=True) - - def __repr__(self) -> str: - name = "'" + self.name + "' " if self.name is not None else "" - return "".format( - name=name, formatter=self._formatter - ) - - -class PrefixResource(AbstractResource): - def __init__(self, prefix: str, *, name: Optional[str] = None) -> None: - assert not prefix or prefix.startswith("/"), prefix - assert prefix in ("", "/") or not prefix.endswith("/"), prefix - super().__init__(name=name) - self._prefix = _requote_path(prefix) - self._prefix2 = self._prefix + "/" - - @property - def canonical(self) -> str: - return self._prefix - - def add_prefix(self, prefix: str) -> None: - assert prefix.startswith("/") - assert not prefix.endswith("/") - assert len(prefix) > 1 - self._prefix = prefix + self._prefix - self._prefix2 = self._prefix + "/" - - def raw_match(self, prefix: str) -> bool: - return False - - # TODO: impl missing abstract methods - - -class StaticResource(PrefixResource): - VERSION_KEY = "v" - - def __init__( - self, - prefix: str, - directory: PathLike, - *, - name: Optional[str] = None, - expect_handler: Optional[_ExpectHandler] = None, - chunk_size: int = 256 * 1024, - show_index: bool = False, - follow_symlinks: bool = False, - append_version: bool = False, - ) -> None: - super().__init__(prefix, name=name) - try: - directory = Path(directory).expanduser().resolve(strict=True) - except FileNotFoundError as error: - raise ValueError(f"'{directory}' does not exist") from error - if not directory.is_dir(): - raise ValueError(f"'{directory}' is not a directory") - self._directory = directory - self._show_index = show_index - self._chunk_size = chunk_size - self._follow_symlinks = follow_symlinks - self._expect_handler = expect_handler - self._append_version = append_version - - self._routes = { - "GET": ResourceRoute( - "GET", self._handle, self, expect_handler=expect_handler - ), - "HEAD": ResourceRoute( - "HEAD", self._handle, self, expect_handler=expect_handler - ), - } - self._allowed_methods = set(self._routes) - - def url_for( # type: ignore[override] - self, - *, - filename: PathLike, - append_version: Optional[bool] = None, - ) -> URL: - if append_version is None: - append_version = self._append_version - filename = str(filename).lstrip("/") - - url = URL.build(path=self._prefix, encoded=True) - # filename is not encoded - if YARL_VERSION < (1, 6): - url = url / filename.replace("%", "%25") - else: - url = url / filename - - if append_version: - unresolved_path = self._directory.joinpath(filename) - try: - if self._follow_symlinks: - normalized_path = Path(os.path.normpath(unresolved_path)) - normalized_path.relative_to(self._directory) - filepath = normalized_path.resolve() - else: - filepath = unresolved_path.resolve() - filepath.relative_to(self._directory) - except (ValueError, FileNotFoundError): - # ValueError for case when path point to symlink - # with follow_symlinks is False - return url # relatively safe - if filepath.is_file(): - # TODO cache file content - # with file watcher for cache invalidation - with filepath.open("rb") as f: - file_bytes = f.read() - h = self._get_file_hash(file_bytes) - url = url.with_query({self.VERSION_KEY: h}) - return url - return url - - @staticmethod - def _get_file_hash(byte_array: bytes) -> str: - m = hashlib.sha256() # todo sha256 can be configurable param - m.update(byte_array) - b64 = base64.urlsafe_b64encode(m.digest()) - return b64.decode("ascii") - - def get_info(self) -> _InfoDict: - return { - "directory": self._directory, - "prefix": self._prefix, - "routes": self._routes, - } - - def set_options_route(self, handler: Handler) -> None: - if "OPTIONS" in self._routes: - raise RuntimeError("OPTIONS route was set already") - self._routes["OPTIONS"] = ResourceRoute( - "OPTIONS", handler, self, expect_handler=self._expect_handler - ) - self._allowed_methods.add("OPTIONS") - - async def resolve(self, request: Request) -> _Resolve: - path = request.rel_url.path_safe - method = request.method - if not path.startswith(self._prefix2) and path != self._prefix: - return None, set() - - allowed_methods = self._allowed_methods - if method not in allowed_methods: - return None, allowed_methods - - match_dict = {"filename": _unquote_path_safe(path[len(self._prefix) + 1 :])} - return (UrlMappingMatchInfo(match_dict, self._routes[method]), allowed_methods) - - def __len__(self) -> int: - return len(self._routes) - - def __iter__(self) -> Iterator[AbstractRoute]: - return iter(self._routes.values()) - - async def _handle(self, request: Request) -> StreamResponse: - rel_url = request.match_info["filename"] - filename = Path(rel_url) - if filename.anchor: - # rel_url is an absolute name like - # /static/\\machine_name\c$ or /static/D:\path - # where the static dir is totally different - raise HTTPForbidden() - - unresolved_path = self._directory.joinpath(filename) - loop = asyncio.get_running_loop() - return await loop.run_in_executor( - None, self._resolve_path_to_response, unresolved_path - ) - - def _resolve_path_to_response(self, unresolved_path: Path) -> StreamResponse: - """Take the unresolved path and query the file system to form a response.""" - # Check for access outside the root directory. For follow symlinks, URI - # cannot traverse out, but symlinks can. Otherwise, no access outside - # root is permitted. - try: - if self._follow_symlinks: - normalized_path = Path(os.path.normpath(unresolved_path)) - normalized_path.relative_to(self._directory) - file_path = normalized_path.resolve() - else: - file_path = unresolved_path.resolve() - file_path.relative_to(self._directory) - except (ValueError, *CIRCULAR_SYMLINK_ERROR) as error: - # ValueError is raised for the relative check. Circular symlinks - # raise here on resolving for python < 3.13. - raise HTTPNotFound() from error - - # if path is a directory, return the contents if permitted. Note the - # directory check will raise if a segment is not readable. - try: - if file_path.is_dir(): - if self._show_index: - return Response( - text=self._directory_as_html(file_path), - content_type="text/html", - ) - else: - raise HTTPForbidden() - except PermissionError as error: - raise HTTPForbidden() from error - - # Return the file response, which handles all other checks. - return FileResponse(file_path, chunk_size=self._chunk_size) - - def _directory_as_html(self, dir_path: Path) -> str: - """returns directory's index as html.""" - assert dir_path.is_dir() - - relative_path_to_dir = dir_path.relative_to(self._directory).as_posix() - index_of = f"Index of /{html_escape(relative_path_to_dir)}" - h1 = f"

    {index_of}

    " - - index_list = [] - dir_index = dir_path.iterdir() - for _file in sorted(dir_index): - # show file url as relative to static path - rel_path = _file.relative_to(self._directory).as_posix() - quoted_file_url = _quote_path(f"{self._prefix}/{rel_path}") - - # if file is a directory, add '/' to the end of the name - if _file.is_dir(): - file_name = f"{_file.name}/" - else: - file_name = _file.name - - index_list.append( - f'
  1. {html_escape(file_name)}
  2. ' - ) - ul = "
      \n{}\n
    ".format("\n".join(index_list)) - body = f"\n{h1}\n{ul}\n" - - head_str = f"\n{index_of}\n" - html = f"\n{head_str}\n{body}\n" - - return html - - def __repr__(self) -> str: - name = "'" + self.name + "'" if self.name is not None else "" - return " {directory!r}>".format( - name=name, path=self._prefix, directory=self._directory - ) - - -class PrefixedSubAppResource(PrefixResource): - def __init__(self, prefix: str, app: "Application") -> None: - super().__init__(prefix) - self._app = app - self._add_prefix_to_resources(prefix) - - def add_prefix(self, prefix: str) -> None: - super().add_prefix(prefix) - self._add_prefix_to_resources(prefix) - - def _add_prefix_to_resources(self, prefix: str) -> None: - router = self._app.router - for resource in router.resources(): - # Since the canonical path of a resource is about - # to change, we need to unindex it and then reindex - router.unindex_resource(resource) - resource.add_prefix(prefix) - router.index_resource(resource) - - def url_for(self, *args: str, **kwargs: str) -> URL: - raise RuntimeError(".url_for() is not supported by sub-application root") - - def get_info(self) -> _InfoDict: - return {"app": self._app, "prefix": self._prefix} - - async def resolve(self, request: Request) -> _Resolve: - match_info = await self._app.router.resolve(request) - match_info.add_app(self._app) - if isinstance(match_info.http_exception, HTTPMethodNotAllowed): - methods = match_info.http_exception.allowed_methods - else: - methods = set() - return match_info, methods - - def __len__(self) -> int: - return len(self._app.router.routes()) - - def __iter__(self) -> Iterator[AbstractRoute]: - return iter(self._app.router.routes()) - - def __repr__(self) -> str: - return " {app!r}>".format( - prefix=self._prefix, app=self._app - ) - - -class AbstractRuleMatching(abc.ABC): - @abc.abstractmethod # pragma: no branch - async def match(self, request: Request) -> bool: - """Return bool if the request satisfies the criteria""" - - @abc.abstractmethod # pragma: no branch - def get_info(self) -> _InfoDict: - """Return a dict with additional info useful for introspection""" - - @property - @abc.abstractmethod # pragma: no branch - def canonical(self) -> str: - """Return a str""" - - -class Domain(AbstractRuleMatching): - re_part = re.compile(r"(?!-)[a-z\d-]{1,63}(? None: - super().__init__() - self._domain = self.validation(domain) - - @property - def canonical(self) -> str: - return self._domain - - def validation(self, domain: str) -> str: - if not isinstance(domain, str): - raise TypeError("Domain must be str") - domain = domain.rstrip(".").lower() - if not domain: - raise ValueError("Domain cannot be empty") - elif "://" in domain: - raise ValueError("Scheme not supported") - url = URL("http://" + domain) - assert url.raw_host is not None - if not all(self.re_part.fullmatch(x) for x in url.raw_host.split(".")): - raise ValueError("Domain not valid") - if url.port == 80: - return url.raw_host - return f"{url.raw_host}:{url.port}" - - async def match(self, request: Request) -> bool: - host = request.headers.get(hdrs.HOST) - if not host: - return False - return self.match_domain(host) - - def match_domain(self, host: str) -> bool: - return host.lower() == self._domain - - def get_info(self) -> _InfoDict: - return {"domain": self._domain} - - -class MaskDomain(Domain): - re_part = re.compile(r"(?!-)[a-z\d\*-]{1,63}(? None: - super().__init__(domain) - mask = self._domain.replace(".", r"\.").replace("*", ".*") - self._mask = re.compile(mask) - - @property - def canonical(self) -> str: - return self._mask.pattern - - def match_domain(self, host: str) -> bool: - return self._mask.fullmatch(host) is not None - - -class MatchedSubAppResource(PrefixedSubAppResource): - def __init__(self, rule: AbstractRuleMatching, app: "Application") -> None: - AbstractResource.__init__(self) - self._prefix = "" - self._app = app - self._rule = rule - - @property - def canonical(self) -> str: - return self._rule.canonical - - def get_info(self) -> _InfoDict: - return {"app": self._app, "rule": self._rule} - - async def resolve(self, request: Request) -> _Resolve: - if not await self._rule.match(request): - return None, set() - match_info = await self._app.router.resolve(request) - match_info.add_app(self._app) - if isinstance(match_info.http_exception, HTTPMethodNotAllowed): - methods = match_info.http_exception.allowed_methods - else: - methods = set() - return match_info, methods - - def __repr__(self) -> str: - return f" {self._app!r}>" - - -class ResourceRoute(AbstractRoute): - """A route with resource""" - - def __init__( - self, - method: str, - handler: Union[Handler, Type[AbstractView]], - resource: AbstractResource, - *, - expect_handler: Optional[_ExpectHandler] = None, - ) -> None: - super().__init__( - method, handler, expect_handler=expect_handler, resource=resource - ) - - def __repr__(self) -> str: - return " {handler!r}".format( - method=self.method, resource=self._resource, handler=self.handler - ) - - @property - def name(self) -> Optional[str]: - if self._resource is None: - return None - return self._resource.name - - def url_for(self, *args: str, **kwargs: str) -> URL: - """Construct url for route with additional params.""" - assert self._resource is not None - return self._resource.url_for(*args, **kwargs) - - def get_info(self) -> _InfoDict: - assert self._resource is not None - return self._resource.get_info() - - -class SystemRoute(AbstractRoute): - def __init__(self, http_exception: HTTPException) -> None: - super().__init__(hdrs.METH_ANY, self._handle) - self._http_exception = http_exception - - def url_for(self, *args: str, **kwargs: str) -> URL: - raise RuntimeError(".url_for() is not allowed for SystemRoute") - - @property - def name(self) -> Optional[str]: - return None - - def get_info(self) -> _InfoDict: - return {"http_exception": self._http_exception} - - async def _handle(self, request: Request) -> StreamResponse: - raise self._http_exception - - @property - def status(self) -> int: - return self._http_exception.status - - @property - def reason(self) -> str: - return self._http_exception.reason - - def __repr__(self) -> str: - return "".format(self=self) - - -class View(AbstractView): - async def _iter(self) -> StreamResponse: - if self.request.method not in hdrs.METH_ALL: - self._raise_allowed_methods() - method: Optional[Callable[[], Awaitable[StreamResponse]]] - method = getattr(self, self.request.method.lower(), None) - if method is None: - self._raise_allowed_methods() - ret = await method() - assert isinstance(ret, StreamResponse) - return ret - - def __await__(self) -> Generator[Any, None, StreamResponse]: - return self._iter().__await__() - - def _raise_allowed_methods(self) -> NoReturn: - allowed_methods = {m for m in hdrs.METH_ALL if hasattr(self, m.lower())} - raise HTTPMethodNotAllowed(self.request.method, allowed_methods) - - -class ResourcesView(Sized, Iterable[AbstractResource], Container[AbstractResource]): - def __init__(self, resources: List[AbstractResource]) -> None: - self._resources = resources - - def __len__(self) -> int: - return len(self._resources) - - def __iter__(self) -> Iterator[AbstractResource]: - yield from self._resources - - def __contains__(self, resource: object) -> bool: - return resource in self._resources - - -class RoutesView(Sized, Iterable[AbstractRoute], Container[AbstractRoute]): - def __init__(self, resources: List[AbstractResource]): - self._routes: List[AbstractRoute] = [] - for resource in resources: - for route in resource: - self._routes.append(route) - - def __len__(self) -> int: - return len(self._routes) - - def __iter__(self) -> Iterator[AbstractRoute]: - yield from self._routes - - def __contains__(self, route: object) -> bool: - return route in self._routes - - -class UrlDispatcher(AbstractRouter, Mapping[str, AbstractResource]): - - NAME_SPLIT_RE = re.compile(r"[.:-]") - - def __init__(self) -> None: - super().__init__() - self._resources: List[AbstractResource] = [] - self._named_resources: Dict[str, AbstractResource] = {} - self._resource_index: dict[str, list[AbstractResource]] = {} - self._matched_sub_app_resources: List[MatchedSubAppResource] = [] - - async def resolve(self, request: Request) -> UrlMappingMatchInfo: - resource_index = self._resource_index - allowed_methods: Set[str] = set() - - # Walk the url parts looking for candidates. We walk the url backwards - # to ensure the most explicit match is found first. If there are multiple - # candidates for a given url part because there are multiple resources - # registered for the same canonical path, we resolve them in a linear - # fashion to ensure registration order is respected. - url_part = request.rel_url.path_safe - while url_part: - for candidate in resource_index.get(url_part, ()): - match_dict, allowed = await candidate.resolve(request) - if match_dict is not None: - return match_dict - else: - allowed_methods |= allowed - if url_part == "/": - break - url_part = url_part.rpartition("/")[0] or "/" - - # - # We didn't find any candidates, so we'll try the matched sub-app - # resources which we have to walk in a linear fashion because they - # have regex/wildcard match rules and we cannot index them. - # - # For most cases we do not expect there to be many of these since - # currently they are only added by `add_domain` - # - for resource in self._matched_sub_app_resources: - match_dict, allowed = await resource.resolve(request) - if match_dict is not None: - return match_dict - else: - allowed_methods |= allowed - - if allowed_methods: - return MatchInfoError(HTTPMethodNotAllowed(request.method, allowed_methods)) - - return MatchInfoError(HTTPNotFound()) - - def __iter__(self) -> Iterator[str]: - return iter(self._named_resources) - - def __len__(self) -> int: - return len(self._named_resources) - - def __contains__(self, resource: object) -> bool: - return resource in self._named_resources - - def __getitem__(self, name: str) -> AbstractResource: - return self._named_resources[name] - - def resources(self) -> ResourcesView: - return ResourcesView(self._resources) - - def routes(self) -> RoutesView: - return RoutesView(self._resources) - - def named_resources(self) -> Mapping[str, AbstractResource]: - return MappingProxyType(self._named_resources) - - def register_resource(self, resource: AbstractResource) -> None: - assert isinstance( - resource, AbstractResource - ), f"Instance of AbstractResource class is required, got {resource!r}" - if self.frozen: - raise RuntimeError("Cannot register a resource into frozen router.") - - name = resource.name - - if name is not None: - parts = self.NAME_SPLIT_RE.split(name) - for part in parts: - if keyword.iskeyword(part): - raise ValueError( - f"Incorrect route name {name!r}, " - "python keywords cannot be used " - "for route name" - ) - if not part.isidentifier(): - raise ValueError( - "Incorrect route name {!r}, " - "the name should be a sequence of " - "python identifiers separated " - "by dash, dot or column".format(name) - ) - if name in self._named_resources: - raise ValueError( - "Duplicate {!r}, " - "already handled by {!r}".format(name, self._named_resources[name]) - ) - self._named_resources[name] = resource - self._resources.append(resource) - - if isinstance(resource, MatchedSubAppResource): - # We cannot index match sub-app resources because they have match rules - self._matched_sub_app_resources.append(resource) - else: - self.index_resource(resource) - - def _get_resource_index_key(self, resource: AbstractResource) -> str: - """Return a key to index the resource in the resource index.""" - if "{" in (index_key := resource.canonical): - # strip at the first { to allow for variables, and than - # rpartition at / to allow for variable parts in the path - # For example if the canonical path is `/core/locations{tail:.*}` - # the index key will be `/core` since index is based on the - # url parts split by `/` - index_key = index_key.partition("{")[0].rpartition("/")[0] - return index_key.rstrip("/") or "/" - - def index_resource(self, resource: AbstractResource) -> None: - """Add a resource to the resource index.""" - resource_key = self._get_resource_index_key(resource) - # There may be multiple resources for a canonical path - # so we keep them in a list to ensure that registration - # order is respected. - self._resource_index.setdefault(resource_key, []).append(resource) - - def unindex_resource(self, resource: AbstractResource) -> None: - """Remove a resource from the resource index.""" - resource_key = self._get_resource_index_key(resource) - self._resource_index[resource_key].remove(resource) - - def add_resource(self, path: str, *, name: Optional[str] = None) -> Resource: - if path and not path.startswith("/"): - raise ValueError("path should be started with / or be empty") - # Reuse last added resource if path and name are the same - if self._resources: - resource = self._resources[-1] - if resource.name == name and resource.raw_match(path): - return cast(Resource, resource) - if not ("{" in path or "}" in path or ROUTE_RE.search(path)): - resource = PlainResource(path, name=name) - self.register_resource(resource) - return resource - resource = DynamicResource(path, name=name) - self.register_resource(resource) - return resource - - def add_route( - self, - method: str, - path: str, - handler: Union[Handler, Type[AbstractView]], - *, - name: Optional[str] = None, - expect_handler: Optional[_ExpectHandler] = None, - ) -> AbstractRoute: - resource = self.add_resource(path, name=name) - return resource.add_route(method, handler, expect_handler=expect_handler) - - def add_static( - self, - prefix: str, - path: PathLike, - *, - name: Optional[str] = None, - expect_handler: Optional[_ExpectHandler] = None, - chunk_size: int = 256 * 1024, - show_index: bool = False, - follow_symlinks: bool = False, - append_version: bool = False, - ) -> AbstractResource: - """Add static files view. - - prefix - url prefix - path - folder with files - - """ - assert prefix.startswith("/") - if prefix.endswith("/"): - prefix = prefix[:-1] - resource = StaticResource( - prefix, - path, - name=name, - expect_handler=expect_handler, - chunk_size=chunk_size, - show_index=show_index, - follow_symlinks=follow_symlinks, - append_version=append_version, - ) - self.register_resource(resource) - return resource - - def add_head(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: - """Shortcut for add_route with method HEAD.""" - return self.add_route(hdrs.METH_HEAD, path, handler, **kwargs) - - def add_options(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: - """Shortcut for add_route with method OPTIONS.""" - return self.add_route(hdrs.METH_OPTIONS, path, handler, **kwargs) - - def add_get( - self, - path: str, - handler: Handler, - *, - name: Optional[str] = None, - allow_head: bool = True, - **kwargs: Any, - ) -> AbstractRoute: - """Shortcut for add_route with method GET. - - If allow_head is true, another - route is added allowing head requests to the same endpoint. - """ - resource = self.add_resource(path, name=name) - if allow_head: - resource.add_route(hdrs.METH_HEAD, handler, **kwargs) - return resource.add_route(hdrs.METH_GET, handler, **kwargs) - - def add_post(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: - """Shortcut for add_route with method POST.""" - return self.add_route(hdrs.METH_POST, path, handler, **kwargs) - - def add_put(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: - """Shortcut for add_route with method PUT.""" - return self.add_route(hdrs.METH_PUT, path, handler, **kwargs) - - def add_patch(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: - """Shortcut for add_route with method PATCH.""" - return self.add_route(hdrs.METH_PATCH, path, handler, **kwargs) - - def add_delete(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: - """Shortcut for add_route with method DELETE.""" - return self.add_route(hdrs.METH_DELETE, path, handler, **kwargs) - - def add_view( - self, path: str, handler: Type[AbstractView], **kwargs: Any - ) -> AbstractRoute: - """Shortcut for add_route with ANY methods for a class-based view.""" - return self.add_route(hdrs.METH_ANY, path, handler, **kwargs) - - def freeze(self) -> None: - super().freeze() - for resource in self._resources: - resource.freeze() - - def add_routes(self, routes: Iterable[AbstractRouteDef]) -> List[AbstractRoute]: - """Append routes to route table. - - Parameter should be a sequence of RouteDef objects. - - Returns a list of registered AbstractRoute instances. - """ - registered_routes = [] - for route_def in routes: - registered_routes.extend(route_def.register(self)) - return registered_routes - - -def _quote_path(value: str) -> str: - if YARL_VERSION < (1, 6): - value = value.replace("%", "%25") - return URL.build(path=value, encoded=False).raw_path - - -def _unquote_path_safe(value: str) -> str: - if "%" not in value: - return value - return value.replace("%2F", "/").replace("%25", "%") - - -def _requote_path(value: str) -> str: - # Quote non-ascii characters and other characters which must be quoted, - # but preserve existing %-sequences. - result = _quote_path(value) - if "%" in value: - result = result.replace("%25", "%") - return result diff --git a/venv/lib/python3.12/site-packages/aiohttp/web_ws.py b/venv/lib/python3.12/site-packages/aiohttp/web_ws.py deleted file mode 100644 index 575f9a3..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/web_ws.py +++ /dev/null @@ -1,631 +0,0 @@ -import asyncio -import base64 -import binascii -import hashlib -import json -import sys -from typing import Any, Final, Iterable, Optional, Tuple, Union, cast - -import attr -from multidict import CIMultiDict - -from . import hdrs -from ._websocket.reader import WebSocketDataQueue -from ._websocket.writer import DEFAULT_LIMIT -from .abc import AbstractStreamWriter -from .client_exceptions import WSMessageTypeError -from .helpers import calculate_timeout_when, set_exception, set_result -from .http import ( - WS_CLOSED_MESSAGE, - WS_CLOSING_MESSAGE, - WS_KEY, - WebSocketError, - WebSocketReader, - WebSocketWriter, - WSCloseCode, - WSMessage, - WSMsgType as WSMsgType, - ws_ext_gen, - ws_ext_parse, -) -from .http_websocket import _INTERNAL_RECEIVE_TYPES -from .log import ws_logger -from .streams import EofStream -from .typedefs import JSONDecoder, JSONEncoder -from .web_exceptions import HTTPBadRequest, HTTPException -from .web_request import BaseRequest -from .web_response import StreamResponse - -if sys.version_info >= (3, 11): - import asyncio as async_timeout -else: - import async_timeout - -__all__ = ( - "WebSocketResponse", - "WebSocketReady", - "WSMsgType", -) - -THRESHOLD_CONNLOST_ACCESS: Final[int] = 5 - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class WebSocketReady: - ok: bool - protocol: Optional[str] - - def __bool__(self) -> bool: - return self.ok - - -class WebSocketResponse(StreamResponse): - - _length_check: bool = False - _ws_protocol: Optional[str] = None - _writer: Optional[WebSocketWriter] = None - _reader: Optional[WebSocketDataQueue] = None - _closed: bool = False - _closing: bool = False - _conn_lost: int = 0 - _close_code: Optional[int] = None - _loop: Optional[asyncio.AbstractEventLoop] = None - _waiting: bool = False - _close_wait: Optional[asyncio.Future[None]] = None - _exception: Optional[BaseException] = None - _heartbeat_when: float = 0.0 - _heartbeat_cb: Optional[asyncio.TimerHandle] = None - _pong_response_cb: Optional[asyncio.TimerHandle] = None - _ping_task: Optional[asyncio.Task[None]] = None - - def __init__( - self, - *, - timeout: float = 10.0, - receive_timeout: Optional[float] = None, - autoclose: bool = True, - autoping: bool = True, - heartbeat: Optional[float] = None, - protocols: Iterable[str] = (), - compress: bool = True, - max_msg_size: int = 4 * 1024 * 1024, - writer_limit: int = DEFAULT_LIMIT, - ) -> None: - super().__init__(status=101) - self._protocols = protocols - self._timeout = timeout - self._receive_timeout = receive_timeout - self._autoclose = autoclose - self._autoping = autoping - self._heartbeat = heartbeat - if heartbeat is not None: - self._pong_heartbeat = heartbeat / 2.0 - self._compress: Union[bool, int] = compress - self._max_msg_size = max_msg_size - self._writer_limit = writer_limit - - def _cancel_heartbeat(self) -> None: - self._cancel_pong_response_cb() - if self._heartbeat_cb is not None: - self._heartbeat_cb.cancel() - self._heartbeat_cb = None - if self._ping_task is not None: - self._ping_task.cancel() - self._ping_task = None - - def _cancel_pong_response_cb(self) -> None: - if self._pong_response_cb is not None: - self._pong_response_cb.cancel() - self._pong_response_cb = None - - def _reset_heartbeat(self) -> None: - if self._heartbeat is None: - return - self._cancel_pong_response_cb() - req = self._req - timeout_ceil_threshold = ( - req._protocol._timeout_ceil_threshold if req is not None else 5 - ) - loop = self._loop - assert loop is not None - now = loop.time() - when = calculate_timeout_when(now, self._heartbeat, timeout_ceil_threshold) - self._heartbeat_when = when - if self._heartbeat_cb is None: - # We do not cancel the previous heartbeat_cb here because - # it generates a significant amount of TimerHandle churn - # which causes asyncio to rebuild the heap frequently. - # Instead _send_heartbeat() will reschedule the next - # heartbeat if it fires too early. - self._heartbeat_cb = loop.call_at(when, self._send_heartbeat) - - def _send_heartbeat(self) -> None: - self._heartbeat_cb = None - loop = self._loop - assert loop is not None and self._writer is not None - now = loop.time() - if now < self._heartbeat_when: - # Heartbeat fired too early, reschedule - self._heartbeat_cb = loop.call_at( - self._heartbeat_when, self._send_heartbeat - ) - return - - req = self._req - timeout_ceil_threshold = ( - req._protocol._timeout_ceil_threshold if req is not None else 5 - ) - when = calculate_timeout_when(now, self._pong_heartbeat, timeout_ceil_threshold) - self._cancel_pong_response_cb() - self._pong_response_cb = loop.call_at(when, self._pong_not_received) - - coro = self._writer.send_frame(b"", WSMsgType.PING) - if sys.version_info >= (3, 12): - # Optimization for Python 3.12, try to send the ping - # immediately to avoid having to schedule - # the task on the event loop. - ping_task = asyncio.Task(coro, loop=loop, eager_start=True) - else: - ping_task = loop.create_task(coro) - - if not ping_task.done(): - self._ping_task = ping_task - ping_task.add_done_callback(self._ping_task_done) - else: - self._ping_task_done(ping_task) - - def _ping_task_done(self, task: "asyncio.Task[None]") -> None: - """Callback for when the ping task completes.""" - if not task.cancelled() and (exc := task.exception()): - self._handle_ping_pong_exception(exc) - self._ping_task = None - - def _pong_not_received(self) -> None: - if self._req is not None and self._req.transport is not None: - self._handle_ping_pong_exception( - asyncio.TimeoutError( - f"No PONG received after {self._pong_heartbeat} seconds" - ) - ) - - def _handle_ping_pong_exception(self, exc: BaseException) -> None: - """Handle exceptions raised during ping/pong processing.""" - if self._closed: - return - self._set_closed() - self._set_code_close_transport(WSCloseCode.ABNORMAL_CLOSURE) - self._exception = exc - if self._waiting and not self._closing and self._reader is not None: - self._reader.feed_data(WSMessage(WSMsgType.ERROR, exc, None), 0) - - def _set_closed(self) -> None: - """Set the connection to closed. - - Cancel any heartbeat timers and set the closed flag. - """ - self._closed = True - self._cancel_heartbeat() - - async def prepare(self, request: BaseRequest) -> AbstractStreamWriter: - # make pre-check to don't hide it by do_handshake() exceptions - if self._payload_writer is not None: - return self._payload_writer - - protocol, writer = self._pre_start(request) - payload_writer = await super().prepare(request) - assert payload_writer is not None - self._post_start(request, protocol, writer) - await payload_writer.drain() - return payload_writer - - def _handshake( - self, request: BaseRequest - ) -> Tuple["CIMultiDict[str]", Optional[str], int, bool]: - headers = request.headers - if "websocket" != headers.get(hdrs.UPGRADE, "").lower().strip(): - raise HTTPBadRequest( - text=( - "No WebSocket UPGRADE hdr: {}\n Can " - '"Upgrade" only to "WebSocket".' - ).format(headers.get(hdrs.UPGRADE)) - ) - - if "upgrade" not in headers.get(hdrs.CONNECTION, "").lower(): - raise HTTPBadRequest( - text="No CONNECTION upgrade hdr: {}".format( - headers.get(hdrs.CONNECTION) - ) - ) - - # find common sub-protocol between client and server - protocol: Optional[str] = None - if hdrs.SEC_WEBSOCKET_PROTOCOL in headers: - req_protocols = [ - str(proto.strip()) - for proto in headers[hdrs.SEC_WEBSOCKET_PROTOCOL].split(",") - ] - - for proto in req_protocols: - if proto in self._protocols: - protocol = proto - break - else: - # No overlap found: Return no protocol as per spec - ws_logger.warning( - "%s: Client protocols %r don’t overlap server-known ones %r", - request.remote, - req_protocols, - self._protocols, - ) - - # check supported version - version = headers.get(hdrs.SEC_WEBSOCKET_VERSION, "") - if version not in ("13", "8", "7"): - raise HTTPBadRequest(text=f"Unsupported version: {version}") - - # check client handshake for validity - key = headers.get(hdrs.SEC_WEBSOCKET_KEY) - try: - if not key or len(base64.b64decode(key)) != 16: - raise HTTPBadRequest(text=f"Handshake error: {key!r}") - except binascii.Error: - raise HTTPBadRequest(text=f"Handshake error: {key!r}") from None - - accept_val = base64.b64encode( - hashlib.sha1(key.encode() + WS_KEY).digest() - ).decode() - response_headers = CIMultiDict( - { - hdrs.UPGRADE: "websocket", - hdrs.CONNECTION: "upgrade", - hdrs.SEC_WEBSOCKET_ACCEPT: accept_val, - } - ) - - notakeover = False - compress = 0 - if self._compress: - extensions = headers.get(hdrs.SEC_WEBSOCKET_EXTENSIONS) - # Server side always get return with no exception. - # If something happened, just drop compress extension - compress, notakeover = ws_ext_parse(extensions, isserver=True) - if compress: - enabledext = ws_ext_gen( - compress=compress, isserver=True, server_notakeover=notakeover - ) - response_headers[hdrs.SEC_WEBSOCKET_EXTENSIONS] = enabledext - - if protocol: - response_headers[hdrs.SEC_WEBSOCKET_PROTOCOL] = protocol - return ( - response_headers, - protocol, - compress, - notakeover, - ) - - def _pre_start(self, request: BaseRequest) -> Tuple[Optional[str], WebSocketWriter]: - self._loop = request._loop - - headers, protocol, compress, notakeover = self._handshake(request) - - self.set_status(101) - self.headers.update(headers) - self.force_close() - self._compress = compress - transport = request._protocol.transport - assert transport is not None - writer = WebSocketWriter( - request._protocol, - transport, - compress=compress, - notakeover=notakeover, - limit=self._writer_limit, - ) - - return protocol, writer - - def _post_start( - self, request: BaseRequest, protocol: Optional[str], writer: WebSocketWriter - ) -> None: - self._ws_protocol = protocol - self._writer = writer - - self._reset_heartbeat() - - loop = self._loop - assert loop is not None - self._reader = WebSocketDataQueue(request._protocol, 2**16, loop=loop) - request.protocol.set_parser( - WebSocketReader( - self._reader, self._max_msg_size, compress=bool(self._compress) - ) - ) - # disable HTTP keepalive for WebSocket - request.protocol.keep_alive(False) - - def can_prepare(self, request: BaseRequest) -> WebSocketReady: - if self._writer is not None: - raise RuntimeError("Already started") - try: - _, protocol, _, _ = self._handshake(request) - except HTTPException: - return WebSocketReady(False, None) - else: - return WebSocketReady(True, protocol) - - @property - def prepared(self) -> bool: - return self._writer is not None - - @property - def closed(self) -> bool: - return self._closed - - @property - def close_code(self) -> Optional[int]: - return self._close_code - - @property - def ws_protocol(self) -> Optional[str]: - return self._ws_protocol - - @property - def compress(self) -> Union[int, bool]: - return self._compress - - def get_extra_info(self, name: str, default: Any = None) -> Any: - """Get optional transport information. - - If no value associated with ``name`` is found, ``default`` is returned. - """ - writer = self._writer - if writer is None: - return default - transport = writer.transport - if transport is None: - return default - return transport.get_extra_info(name, default) - - def exception(self) -> Optional[BaseException]: - return self._exception - - async def ping(self, message: bytes = b"") -> None: - if self._writer is None: - raise RuntimeError("Call .prepare() first") - await self._writer.send_frame(message, WSMsgType.PING) - - async def pong(self, message: bytes = b"") -> None: - # unsolicited pong - if self._writer is None: - raise RuntimeError("Call .prepare() first") - await self._writer.send_frame(message, WSMsgType.PONG) - - async def send_frame( - self, message: bytes, opcode: WSMsgType, compress: Optional[int] = None - ) -> None: - """Send a frame over the websocket.""" - if self._writer is None: - raise RuntimeError("Call .prepare() first") - await self._writer.send_frame(message, opcode, compress) - - async def send_str(self, data: str, compress: Optional[int] = None) -> None: - if self._writer is None: - raise RuntimeError("Call .prepare() first") - if not isinstance(data, str): - raise TypeError("data argument must be str (%r)" % type(data)) - await self._writer.send_frame( - data.encode("utf-8"), WSMsgType.TEXT, compress=compress - ) - - async def send_bytes(self, data: bytes, compress: Optional[int] = None) -> None: - if self._writer is None: - raise RuntimeError("Call .prepare() first") - if not isinstance(data, (bytes, bytearray, memoryview)): - raise TypeError("data argument must be byte-ish (%r)" % type(data)) - await self._writer.send_frame(data, WSMsgType.BINARY, compress=compress) - - async def send_json( - self, - data: Any, - compress: Optional[int] = None, - *, - dumps: JSONEncoder = json.dumps, - ) -> None: - await self.send_str(dumps(data), compress=compress) - - async def write_eof(self) -> None: # type: ignore[override] - if self._eof_sent: - return - if self._payload_writer is None: - raise RuntimeError("Response has not been started") - - await self.close() - self._eof_sent = True - - async def close( - self, *, code: int = WSCloseCode.OK, message: bytes = b"", drain: bool = True - ) -> bool: - """Close websocket connection.""" - if self._writer is None: - raise RuntimeError("Call .prepare() first") - - if self._closed: - return False - self._set_closed() - - try: - await self._writer.close(code, message) - writer = self._payload_writer - assert writer is not None - if drain: - await writer.drain() - except (asyncio.CancelledError, asyncio.TimeoutError): - self._set_code_close_transport(WSCloseCode.ABNORMAL_CLOSURE) - raise - except Exception as exc: - self._exception = exc - self._set_code_close_transport(WSCloseCode.ABNORMAL_CLOSURE) - return True - - reader = self._reader - assert reader is not None - # we need to break `receive()` cycle before we can call - # `reader.read()` as `close()` may be called from different task - if self._waiting: - assert self._loop is not None - assert self._close_wait is None - self._close_wait = self._loop.create_future() - reader.feed_data(WS_CLOSING_MESSAGE, 0) - await self._close_wait - - if self._closing: - self._close_transport() - return True - - try: - async with async_timeout.timeout(self._timeout): - while True: - msg = await reader.read() - if msg.type is WSMsgType.CLOSE: - self._set_code_close_transport(msg.data) - return True - except asyncio.CancelledError: - self._set_code_close_transport(WSCloseCode.ABNORMAL_CLOSURE) - raise - except Exception as exc: - self._exception = exc - self._set_code_close_transport(WSCloseCode.ABNORMAL_CLOSURE) - return True - - def _set_closing(self, code: WSCloseCode) -> None: - """Set the close code and mark the connection as closing.""" - self._closing = True - self._close_code = code - self._cancel_heartbeat() - - def _set_code_close_transport(self, code: WSCloseCode) -> None: - """Set the close code and close the transport.""" - self._close_code = code - self._close_transport() - - def _close_transport(self) -> None: - """Close the transport.""" - if self._req is not None and self._req.transport is not None: - self._req.transport.close() - - async def receive(self, timeout: Optional[float] = None) -> WSMessage: - if self._reader is None: - raise RuntimeError("Call .prepare() first") - - receive_timeout = timeout or self._receive_timeout - while True: - if self._waiting: - raise RuntimeError("Concurrent call to receive() is not allowed") - - if self._closed: - self._conn_lost += 1 - if self._conn_lost >= THRESHOLD_CONNLOST_ACCESS: - raise RuntimeError("WebSocket connection is closed.") - return WS_CLOSED_MESSAGE - elif self._closing: - return WS_CLOSING_MESSAGE - - try: - self._waiting = True - try: - if receive_timeout: - # Entering the context manager and creating - # Timeout() object can take almost 50% of the - # run time in this loop so we avoid it if - # there is no read timeout. - async with async_timeout.timeout(receive_timeout): - msg = await self._reader.read() - else: - msg = await self._reader.read() - self._reset_heartbeat() - finally: - self._waiting = False - if self._close_wait: - set_result(self._close_wait, None) - except asyncio.TimeoutError: - raise - except EofStream: - self._close_code = WSCloseCode.OK - await self.close() - return WSMessage(WSMsgType.CLOSED, None, None) - except WebSocketError as exc: - self._close_code = exc.code - await self.close(code=exc.code) - return WSMessage(WSMsgType.ERROR, exc, None) - except Exception as exc: - self._exception = exc - self._set_closing(WSCloseCode.ABNORMAL_CLOSURE) - await self.close() - return WSMessage(WSMsgType.ERROR, exc, None) - - if msg.type not in _INTERNAL_RECEIVE_TYPES: - # If its not a close/closing/ping/pong message - # we can return it immediately - return msg - - if msg.type is WSMsgType.CLOSE: - self._set_closing(msg.data) - # Could be closed while awaiting reader. - if not self._closed and self._autoclose: - # The client is likely going to close the - # connection out from under us so we do not - # want to drain any pending writes as it will - # likely result writing to a broken pipe. - await self.close(drain=False) - elif msg.type is WSMsgType.CLOSING: - self._set_closing(WSCloseCode.OK) - elif msg.type is WSMsgType.PING and self._autoping: - await self.pong(msg.data) - continue - elif msg.type is WSMsgType.PONG and self._autoping: - continue - - return msg - - async def receive_str(self, *, timeout: Optional[float] = None) -> str: - msg = await self.receive(timeout) - if msg.type is not WSMsgType.TEXT: - raise WSMessageTypeError( - f"Received message {msg.type}:{msg.data!r} is not WSMsgType.TEXT" - ) - return cast(str, msg.data) - - async def receive_bytes(self, *, timeout: Optional[float] = None) -> bytes: - msg = await self.receive(timeout) - if msg.type is not WSMsgType.BINARY: - raise WSMessageTypeError( - f"Received message {msg.type}:{msg.data!r} is not WSMsgType.BINARY" - ) - return cast(bytes, msg.data) - - async def receive_json( - self, *, loads: JSONDecoder = json.loads, timeout: Optional[float] = None - ) -> Any: - data = await self.receive_str(timeout=timeout) - return loads(data) - - async def write(self, data: bytes) -> None: - raise RuntimeError("Cannot call .write() for websocket") - - def __aiter__(self) -> "WebSocketResponse": - return self - - async def __anext__(self) -> WSMessage: - msg = await self.receive() - if msg.type in (WSMsgType.CLOSE, WSMsgType.CLOSING, WSMsgType.CLOSED): - raise StopAsyncIteration - return msg - - def _cancel(self, exc: BaseException) -> None: - # web_protocol calls this from connection_lost - # or when the server is shutting down. - self._closing = True - self._cancel_heartbeat() - if self._reader is not None: - set_exception(self._reader, exc) diff --git a/venv/lib/python3.12/site-packages/aiohttp/worker.py b/venv/lib/python3.12/site-packages/aiohttp/worker.py deleted file mode 100644 index f7281bf..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/worker.py +++ /dev/null @@ -1,255 +0,0 @@ -"""Async gunicorn worker for aiohttp.web""" - -import asyncio -import inspect -import os -import re -import signal -import sys -from types import FrameType -from typing import TYPE_CHECKING, Any, Optional - -from gunicorn.config import AccessLogFormat as GunicornAccessLogFormat -from gunicorn.workers import base - -from aiohttp import web - -from .helpers import set_result -from .web_app import Application -from .web_log import AccessLogger - -if TYPE_CHECKING: - import ssl - - SSLContext = ssl.SSLContext -else: - try: - import ssl - - SSLContext = ssl.SSLContext - except ImportError: # pragma: no cover - ssl = None # type: ignore[assignment] - SSLContext = object # type: ignore[misc,assignment] - - -__all__ = ("GunicornWebWorker", "GunicornUVLoopWebWorker") - - -class GunicornWebWorker(base.Worker): # type: ignore[misc,no-any-unimported] - - DEFAULT_AIOHTTP_LOG_FORMAT = AccessLogger.LOG_FORMAT - DEFAULT_GUNICORN_LOG_FORMAT = GunicornAccessLogFormat.default - - def __init__(self, *args: Any, **kw: Any) -> None: # pragma: no cover - super().__init__(*args, **kw) - - self._task: Optional[asyncio.Task[None]] = None - self.exit_code = 0 - self._notify_waiter: Optional[asyncio.Future[bool]] = None - - def init_process(self) -> None: - # create new event_loop after fork - asyncio.get_event_loop().close() - - self.loop = asyncio.new_event_loop() - asyncio.set_event_loop(self.loop) - - super().init_process() - - def run(self) -> None: - self._task = self.loop.create_task(self._run()) - - try: # ignore all finalization problems - self.loop.run_until_complete(self._task) - except Exception: - self.log.exception("Exception in gunicorn worker") - self.loop.run_until_complete(self.loop.shutdown_asyncgens()) - self.loop.close() - - sys.exit(self.exit_code) - - async def _run(self) -> None: - runner = None - if isinstance(self.wsgi, Application): - app = self.wsgi - elif inspect.iscoroutinefunction(self.wsgi) or ( - sys.version_info < (3, 14) and asyncio.iscoroutinefunction(self.wsgi) - ): - wsgi = await self.wsgi() - if isinstance(wsgi, web.AppRunner): - runner = wsgi - app = runner.app - else: - app = wsgi - else: - raise RuntimeError( - "wsgi app should be either Application or " - "async function returning Application, got {}".format(self.wsgi) - ) - - if runner is None: - access_log = self.log.access_log if self.cfg.accesslog else None - runner = web.AppRunner( - app, - logger=self.log, - keepalive_timeout=self.cfg.keepalive, - access_log=access_log, - access_log_format=self._get_valid_log_format( - self.cfg.access_log_format - ), - shutdown_timeout=self.cfg.graceful_timeout / 100 * 95, - ) - await runner.setup() - - ctx = self._create_ssl_context(self.cfg) if self.cfg.is_ssl else None - - runner = runner - assert runner is not None - server = runner.server - assert server is not None - for sock in self.sockets: - site = web.SockSite( - runner, - sock, - ssl_context=ctx, - ) - await site.start() - - # If our parent changed then we shut down. - pid = os.getpid() - try: - while self.alive: # type: ignore[has-type] - self.notify() - - cnt = server.requests_count - if self.max_requests and cnt > self.max_requests: - self.alive = False - self.log.info("Max requests, shutting down: %s", self) - - elif pid == os.getpid() and self.ppid != os.getppid(): - self.alive = False - self.log.info("Parent changed, shutting down: %s", self) - else: - await self._wait_next_notify() - except BaseException: - pass - - await runner.cleanup() - - def _wait_next_notify(self) -> "asyncio.Future[bool]": - self._notify_waiter_done() - - loop = self.loop - assert loop is not None - self._notify_waiter = waiter = loop.create_future() - self.loop.call_later(1.0, self._notify_waiter_done, waiter) - - return waiter - - def _notify_waiter_done( - self, waiter: Optional["asyncio.Future[bool]"] = None - ) -> None: - if waiter is None: - waiter = self._notify_waiter - if waiter is not None: - set_result(waiter, True) - - if waiter is self._notify_waiter: - self._notify_waiter = None - - def init_signals(self) -> None: - # Set up signals through the event loop API. - - self.loop.add_signal_handler( - signal.SIGQUIT, self.handle_quit, signal.SIGQUIT, None - ) - - self.loop.add_signal_handler( - signal.SIGTERM, self.handle_exit, signal.SIGTERM, None - ) - - self.loop.add_signal_handler( - signal.SIGINT, self.handle_quit, signal.SIGINT, None - ) - - self.loop.add_signal_handler( - signal.SIGWINCH, self.handle_winch, signal.SIGWINCH, None - ) - - self.loop.add_signal_handler( - signal.SIGUSR1, self.handle_usr1, signal.SIGUSR1, None - ) - - self.loop.add_signal_handler( - signal.SIGABRT, self.handle_abort, signal.SIGABRT, None - ) - - # Don't let SIGTERM and SIGUSR1 disturb active requests - # by interrupting system calls - signal.siginterrupt(signal.SIGTERM, False) - signal.siginterrupt(signal.SIGUSR1, False) - # Reset signals so Gunicorn doesn't swallow subprocess return codes - # See: https://github.com/aio-libs/aiohttp/issues/6130 - - def handle_quit(self, sig: int, frame: Optional[FrameType]) -> None: - self.alive = False - - # worker_int callback - self.cfg.worker_int(self) - - # wakeup closing process - self._notify_waiter_done() - - def handle_abort(self, sig: int, frame: Optional[FrameType]) -> None: - self.alive = False - self.exit_code = 1 - self.cfg.worker_abort(self) - sys.exit(1) - - @staticmethod - def _create_ssl_context(cfg: Any) -> "SSLContext": - """Creates SSLContext instance for usage in asyncio.create_server. - - See ssl.SSLSocket.__init__ for more details. - """ - if ssl is None: # pragma: no cover - raise RuntimeError("SSL is not supported.") - - ctx = ssl.SSLContext(cfg.ssl_version) - ctx.load_cert_chain(cfg.certfile, cfg.keyfile) - ctx.verify_mode = cfg.cert_reqs - if cfg.ca_certs: - ctx.load_verify_locations(cfg.ca_certs) - if cfg.ciphers: - ctx.set_ciphers(cfg.ciphers) - return ctx - - def _get_valid_log_format(self, source_format: str) -> str: - if source_format == self.DEFAULT_GUNICORN_LOG_FORMAT: - return self.DEFAULT_AIOHTTP_LOG_FORMAT - elif re.search(r"%\([^\)]+\)", source_format): - raise ValueError( - "Gunicorn's style options in form of `%(name)s` are not " - "supported for the log formatting. Please use aiohttp's " - "format specification to configure access log formatting: " - "http://docs.aiohttp.org/en/stable/logging.html" - "#format-specification" - ) - else: - return source_format - - -class GunicornUVLoopWebWorker(GunicornWebWorker): - def init_process(self) -> None: - import uvloop - - # Close any existing event loop before setting a - # new policy. - asyncio.get_event_loop().close() - - # Setup uvloop policy, so that every - # asyncio.get_event_loop() will create an instance - # of uvloop event loop. - asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) - - super().init_process() diff --git a/venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/METADATA b/venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/METADATA deleted file mode 100644 index 03a6f0f..0000000 --- a/venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/METADATA +++ /dev/null @@ -1,112 +0,0 @@ -Metadata-Version: 2.4 -Name: aiosignal -Version: 1.4.0 -Summary: aiosignal: a list of registered asynchronous callbacks -Home-page: https://github.com/aio-libs/aiosignal -Maintainer: aiohttp team -Maintainer-email: team@aiohttp.org -License: Apache 2.0 -Project-URL: Chat: Gitter, https://gitter.im/aio-libs/Lobby -Project-URL: CI: GitHub Actions, https://github.com/aio-libs/aiosignal/actions -Project-URL: Coverage: codecov, https://codecov.io/github/aio-libs/aiosignal -Project-URL: Docs: RTD, https://docs.aiosignal.org -Project-URL: GitHub: issues, https://github.com/aio-libs/aiosignal/issues -Project-URL: GitHub: repo, https://github.com/aio-libs/aiosignal -Classifier: License :: OSI Approved :: Apache Software License -Classifier: Intended Audience :: Developers -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Development Status :: 5 - Production/Stable -Classifier: Operating System :: POSIX -Classifier: Operating System :: MacOS :: MacOS X -Classifier: Operating System :: Microsoft :: Windows -Classifier: Framework :: AsyncIO -Requires-Python: >=3.9 -Description-Content-Type: text/x-rst -License-File: LICENSE -Requires-Dist: frozenlist>=1.1.0 -Requires-Dist: typing-extensions>=4.2; python_version < "3.13" -Dynamic: license-file - -========= -aiosignal -========= - -.. image:: https://github.com/aio-libs/aiosignal/workflows/CI/badge.svg - :target: https://github.com/aio-libs/aiosignal/actions?query=workflow%3ACI - :alt: GitHub status for master branch - -.. image:: https://codecov.io/gh/aio-libs/aiosignal/branch/master/graph/badge.svg?flag=pytest - :target: https://codecov.io/gh/aio-libs/aiosignal?flags[0]=pytest - :alt: codecov.io status for master branch - -.. image:: https://badge.fury.io/py/aiosignal.svg - :target: https://pypi.org/project/aiosignal - :alt: Latest PyPI package version - -.. image:: https://readthedocs.org/projects/aiosignal/badge/?version=latest - :target: https://aiosignal.readthedocs.io/ - :alt: Latest Read The Docs - -.. image:: https://img.shields.io/discourse/topics?server=https%3A%2F%2Faio-libs.discourse.group%2F - :target: https://aio-libs.discourse.group/ - :alt: Discourse group for io-libs - -.. image:: https://badges.gitter.im/Join%20Chat.svg - :target: https://gitter.im/aio-libs/Lobby - :alt: Chat on Gitter - -Introduction -============ - -A project to manage callbacks in `asyncio` projects. - -``Signal`` is a list of registered asynchronous callbacks. - -The signal's life-cycle has two stages: after creation its content -could be filled by using standard list operations: ``sig.append()`` -etc. - -After you call ``sig.freeze()`` the signal is *frozen*: adding, removing -and dropping callbacks is forbidden. - -The only available operation is calling the previously registered -callbacks by using ``await sig.send(data)``. - -For concrete usage examples see the `Signals - -section of the `Web Server Advanced -` chapter of the `aiohttp -documentation`_. - - -Installation ------------- - -:: - - $ pip install aiosignal - - -Documentation -============= - -https://aiosignal.readthedocs.io/ - -License -======= - -``aiosignal`` is offered under the Apache 2 license. - -Source code -=========== - -The project is hosted on GitHub_ - -Please file an issue in the `bug tracker -`_ if you have found a bug -or have some suggestions to improve the library. - -.. _GitHub: https://github.com/aio-libs/aiosignal -.. _aiohttp documentation: https://docs.aiohttp.org/ diff --git a/venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/RECORD b/venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/RECORD deleted file mode 100644 index df5ca06..0000000 --- a/venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/RECORD +++ /dev/null @@ -1,9 +0,0 @@ -aiosignal-1.4.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -aiosignal-1.4.0.dist-info/METADATA,sha256=CSR-8dqLxpZyjUcTDnAuQwf299EB1sSFv_nzpxznAI0,3662 -aiosignal-1.4.0.dist-info/RECORD,, -aiosignal-1.4.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91 -aiosignal-1.4.0.dist-info/licenses/LICENSE,sha256=b9UkPpLdf5jsacesN3co50kFcJ_1J6W_mNbQJjwE9bY,11332 -aiosignal-1.4.0.dist-info/top_level.txt,sha256=z45aNOKGDdrI1roqZY3BGXQ22kJFPHBmVdwtLYLtXC0,10 -aiosignal/__init__.py,sha256=TIkmUG9HTBt4dfq2nISYBiZiRB2xwvFtEZydLP0HPL4,1537 -aiosignal/__pycache__/__init__.cpython-312.pyc,, -aiosignal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/WHEEL b/venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/WHEEL deleted file mode 100644 index e7fa31b..0000000 --- a/venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (80.9.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/licenses/LICENSE b/venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/licenses/LICENSE deleted file mode 100644 index 7082a2d..0000000 --- a/venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/licenses/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2013-2019 Nikolay Kim and Andrew Svetlov - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/top_level.txt b/venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/top_level.txt deleted file mode 100644 index ac6df3a..0000000 --- a/venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -aiosignal diff --git a/venv/lib/python3.12/site-packages/aiosignal/__init__.py b/venv/lib/python3.12/site-packages/aiosignal/__init__.py deleted file mode 100644 index 5ede009..0000000 --- a/venv/lib/python3.12/site-packages/aiosignal/__init__.py +++ /dev/null @@ -1,59 +0,0 @@ -import sys -from typing import Any, Awaitable, Callable, TypeVar - -from frozenlist import FrozenList - -if sys.version_info >= (3, 11): - from typing import Unpack -else: - from typing_extensions import Unpack - -if sys.version_info >= (3, 13): - from typing import TypeVarTuple -else: - from typing_extensions import TypeVarTuple - -_T = TypeVar("_T") -_Ts = TypeVarTuple("_Ts", default=Unpack[tuple[()]]) - -__version__ = "1.4.0" - -__all__ = ("Signal",) - - -class Signal(FrozenList[Callable[[Unpack[_Ts]], Awaitable[object]]]): - """Coroutine-based signal implementation. - - To connect a callback to a signal, use any list method. - - Signals are fired using the send() coroutine, which takes named - arguments. - """ - - __slots__ = ("_owner",) - - def __init__(self, owner: object): - super().__init__() - self._owner = owner - - def __repr__(self) -> str: - return "".format( - self._owner, self.frozen, list(self) - ) - - async def send(self, *args: Unpack[_Ts], **kwargs: Any) -> None: - """ - Sends data to all registered receivers. - """ - if not self.frozen: - raise RuntimeError("Cannot send non-frozen signal.") - - for receiver in self: - await receiver(*args, **kwargs) - - def __call__( - self, func: Callable[[Unpack[_Ts]], Awaitable[_T]] - ) -> Callable[[Unpack[_Ts]], Awaitable[_T]]: - """Decorator to add a function to this Signal.""" - self.append(func) - return func diff --git a/venv/lib/python3.12/site-packages/aiosignal/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiosignal/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 1e63c071161c39af56a82d58a9d6f1920f3b8928..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2705 zcmZ`*&2JmW6`%d&@=KH`y7hO~7Lb~dMEXNb5!X%aT1^wU)uC2m@HzegGNCx1W znfK5pV@v6qnuxl1Ual1D6@WlyTfmRwUTrKVbH zO|vu!`HH945>`SYjLZ-A%{-f_y6`hXcmhspU?FKGCF1L1m+J1mLQmh(QOn|1b6 zhZm(d^)e5ZnEyjJjEeFTH1s451SI-T{JK+FD9YSGZnn$K^i-!CbucO0)3IVthxbt- zL0Q#lc+rw}rZiDHjV7+Tv%ce1Ky`m4daJ#+VetmUjuA_u#FD9GDO9#psxYl8uac@n z)ms@$ry5ICWvbs&ErTWi2Z0(j07Z=^t2#}ABtz3I+m``G11$FpBe3w5vZ_impg*`u zUX!e$tE8CaL*UrbpDzbIXhg2h#%G+6Q8N@zG2I%xyT<&;iQK?1rBWu0>A6jHjc?N(pqX2eYwK201GSl&!rUyWqH5SbUw5Qy~C^Q|;%&N=bsz&Jgvt~5M%#iu? zR1u8#d>Jzr=iJJi8956qG<~PWsBpmHvki1AEQu{bZwHG$cTUYe!bqx6*qcAhFI_)Zl)lSFXq-n6d(}8CXEGk>)=u#S<`A z$oxJ`T~3dyKHK$IQNIX4tKS&AtVk|dk>8VkCA|&}ei<}=E8kUqp=n_G z&4Nmr^0&yFi9aceQc+oYQIr6dhhdR%R$=aS#(O1$=a-IO zc6>jGMA?~s;E#79?G#edWXa z;q}Sw{OHEZ?fmGY%xF6^`mq9%oy_RdFat(zo|=&UAf45>j0q`Ls|~;M<#mst76JLP zG~N#a);=Vov@|-&paD5izy*wynvRLau>m3{nsY<5_bBW@W*$1UXbrIvMx393t2qA0-~&i75joZZhYm8H2I$Fi;&ok22mwDoF7m9?Ym)lUda z9YfJl>mz#vrcTPx#y0eg@Lsw@VEG^v)BDjL?m7icE9?|NapUSc3+vZ5Uwtrh|3}-$ zUThc6cNCEACWqEuSReWIx7Wru4sD*jcWgUfYA4J8(?BLL6HXO};mu7b*Qi;CuS@r_ z;)&w1Sg>)bo9@^@ICiKwgY^MXhAt1C29b(~y81SIEn+^(LXN2?fQq#U{}l){lhlv@!0i>fylJqx{`Ujc#fJ{6lCw3M6 zkuuy?hSwJVsvQ5jdhD@!>WjRQ$7<=HT4r_n^=mEpLp{It&5h?b4{Y-LhuSC4J=7;! z%I?5{R(dyepq2QqJ|Y!Xt#t#A4Bs2wIQAg<{`2kAm$pw_Y9IVwJA3&P0tbYn{|9h_ Bn9cwI diff --git a/venv/lib/python3.12/site-packages/aiosignal/py.typed b/venv/lib/python3.12/site-packages/aiosignal/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/anyio-4.9.0.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/anyio-4.9.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.12/site-packages/anyio-4.9.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/anyio-4.9.0.dist-info/LICENSE b/venv/lib/python3.12/site-packages/anyio-4.9.0.dist-info/LICENSE deleted file mode 100644 index 104eebf..0000000 --- a/venv/lib/python3.12/site-packages/anyio-4.9.0.dist-info/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -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.12/site-packages/anyio-4.9.0.dist-info/METADATA b/venv/lib/python3.12/site-packages/anyio-4.9.0.dist-info/METADATA deleted file mode 100644 index 9d87e1d..0000000 --- a/venv/lib/python3.12/site-packages/anyio-4.9.0.dist-info/METADATA +++ /dev/null @@ -1,105 +0,0 @@ -Metadata-Version: 2.2 -Name: anyio -Version: 4.9.0 -Summary: High level compatibility layer for multiple asynchronous event loop implementations -Author-email: Alex Grönholm -License: 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: License :: OSI Approved :: MIT License -Classifier: Framework :: AnyIO -Classifier: Typing :: Typed -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -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 -Requires-Python: >=3.9 -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: sniffio>=1.1 -Requires-Dist: typing_extensions>=4.5; python_version < "3.13" -Provides-Extra: trio -Requires-Dist: trio>=0.26.1; extra == "trio" -Provides-Extra: test -Requires-Dist: anyio[trio]; extra == "test" -Requires-Dist: blockbuster>=1.5.23; extra == "test" -Requires-Dist: coverage[toml]>=7; extra == "test" -Requires-Dist: exceptiongroup>=1.2.0; extra == "test" -Requires-Dist: hypothesis>=4.0; extra == "test" -Requires-Dist: psutil>=5.9; extra == "test" -Requires-Dist: pytest>=7.0; extra == "test" -Requires-Dist: trustme; extra == "test" -Requires-Dist: truststore>=0.9.1; python_version >= "3.10" and extra == "test" -Requires-Dist: uvloop>=0.21; (platform_python_implementation == "CPython" and platform_system != "Windows" and python_version < "3.14") and extra == "test" -Provides-Extra: doc -Requires-Dist: packaging; extra == "doc" -Requires-Dist: Sphinx~=8.2; extra == "doc" -Requires-Dist: sphinx_rtd_theme; extra == "doc" -Requires-Dist: sphinx-autodoc-typehints>=1.2.0; extra == "doc" - -.. 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 - -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. - -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 -* Asynchronous file I/O (using worker threads) -* Signal handling - -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/ -.. _Hypothesis: https://hypothesis.works/ diff --git a/venv/lib/python3.12/site-packages/anyio-4.9.0.dist-info/RECORD b/venv/lib/python3.12/site-packages/anyio-4.9.0.dist-info/RECORD deleted file mode 100644 index 40eedc8..0000000 --- a/venv/lib/python3.12/site-packages/anyio-4.9.0.dist-info/RECORD +++ /dev/null @@ -1,88 +0,0 @@ -anyio-4.9.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -anyio-4.9.0.dist-info/LICENSE,sha256=U2GsncWPLvX9LpsJxoKXwX8ElQkJu8gCO9uC6s8iwrA,1081 -anyio-4.9.0.dist-info/METADATA,sha256=vvkWPXXTbrpTCFK7zdcYwQcSQhx6Q4qITM9t_PEQCrY,4682 -anyio-4.9.0.dist-info/RECORD,, -anyio-4.9.0.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91 -anyio-4.9.0.dist-info/entry_points.txt,sha256=_d6Yu6uiaZmNe0CydowirE9Cmg7zUL2g08tQpoS3Qvc,39 -anyio-4.9.0.dist-info/top_level.txt,sha256=QglSMiWX8_5dpoVAEIHdEYzvqFMdSYWmCj6tYw2ITkQ,6 -anyio/__init__.py,sha256=t8bZuNXa5ncwXBaNKbv48BDgZt48RT_zCEtrnPmjNU8,4993 -anyio/__pycache__/__init__.cpython-312.pyc,, -anyio/__pycache__/from_thread.cpython-312.pyc,, -anyio/__pycache__/lowlevel.cpython-312.pyc,, -anyio/__pycache__/pytest_plugin.cpython-312.pyc,, -anyio/__pycache__/to_interpreter.cpython-312.pyc,, -anyio/__pycache__/to_process.cpython-312.pyc,, -anyio/__pycache__/to_thread.cpython-312.pyc,, -anyio/_backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -anyio/_backends/__pycache__/__init__.cpython-312.pyc,, -anyio/_backends/__pycache__/_asyncio.cpython-312.pyc,, -anyio/_backends/__pycache__/_trio.cpython-312.pyc,, -anyio/_backends/_asyncio.py,sha256=AT1oaTfCE-9YFxooMlvld2yDqY5U2A-ANMcBDh9eRfI,93455 -anyio/_backends/_trio.py,sha256=HVfDqRGQ7Xj3JfTcYdgzmC7pZEplqU4NOO5kxNNSZnk,40429 -anyio/_core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -anyio/_core/__pycache__/__init__.cpython-312.pyc,, -anyio/_core/__pycache__/_asyncio_selector_thread.cpython-312.pyc,, -anyio/_core/__pycache__/_eventloop.cpython-312.pyc,, -anyio/_core/__pycache__/_exceptions.cpython-312.pyc,, -anyio/_core/__pycache__/_fileio.cpython-312.pyc,, -anyio/_core/__pycache__/_resources.cpython-312.pyc,, -anyio/_core/__pycache__/_signals.cpython-312.pyc,, -anyio/_core/__pycache__/_sockets.cpython-312.pyc,, -anyio/_core/__pycache__/_streams.cpython-312.pyc,, -anyio/_core/__pycache__/_subprocesses.cpython-312.pyc,, -anyio/_core/__pycache__/_synchronization.cpython-312.pyc,, -anyio/_core/__pycache__/_tasks.cpython-312.pyc,, -anyio/_core/__pycache__/_tempfile.cpython-312.pyc,, -anyio/_core/__pycache__/_testing.cpython-312.pyc,, -anyio/_core/__pycache__/_typedattr.cpython-312.pyc,, -anyio/_core/_asyncio_selector_thread.py,sha256=2PdxFM3cs02Kp6BSppbvmRT7q7asreTW5FgBxEsflBo,5626 -anyio/_core/_eventloop.py,sha256=t_tAwBFPjF8jrZGjlJ6bbYy6KA3bjsbZxV9mvh9t1i0,4695 -anyio/_core/_exceptions.py,sha256=RlPRlwastdmfDPoskdXNO6SI8_l3fclA2wtW6cokU9I,3503 -anyio/_core/_fileio.py,sha256=qFZhkLIz0cGXluvih_vcPUTucgq8UFVgsTCtYbijZIg,23340 -anyio/_core/_resources.py,sha256=NbmU5O5UX3xEyACnkmYX28Fmwdl-f-ny0tHym26e0w0,435 -anyio/_core/_signals.py,sha256=vulT1M1xdLYtAR-eY5TamIgaf1WTlOwOrMGwswlTTr8,905 -anyio/_core/_sockets.py,sha256=5Okc_UThGDEN9KCnsIhqWPRHBNuSy6b4NmG1i51TVF4,27150 -anyio/_core/_streams.py,sha256=OnaKgoDD-FcMSwLvkoAUGP51sG2ZdRvMpxt9q2w1gYA,1804 -anyio/_core/_subprocesses.py,sha256=EXm5igL7dj55iYkPlbYVAqtbqxJxjU-6OndSTIx9SRg,8047 -anyio/_core/_synchronization.py,sha256=DwUh8Tl6cG_UMVC_GyzPoC_U9BpfDfjMl9SINSxcZN4,20320 -anyio/_core/_tasks.py,sha256=f3CuWwo06cCZ6jaOv-JHFKWkgpgf2cvaF25Oh4augMA,4757 -anyio/_core/_tempfile.py,sha256=s-_ucacXbxBH5Bo5eo65lN0lPwZQd5B8yNN_9nARpCM,19696 -anyio/_core/_testing.py,sha256=YUGwA5cgFFbUTv4WFd7cv_BSVr4ryTtPp8owQA3JdWE,2118 -anyio/_core/_typedattr.py,sha256=P4ozZikn3-DbpoYcvyghS_FOYAgbmUxeoU8-L_07pZM,2508 -anyio/abc/__init__.py,sha256=c2OQbTCS_fQowviMXanLPh8m29ccwkXmpDr7uyNZYOo,2652 -anyio/abc/__pycache__/__init__.cpython-312.pyc,, -anyio/abc/__pycache__/_eventloop.cpython-312.pyc,, -anyio/abc/__pycache__/_resources.cpython-312.pyc,, -anyio/abc/__pycache__/_sockets.cpython-312.pyc,, -anyio/abc/__pycache__/_streams.cpython-312.pyc,, -anyio/abc/__pycache__/_subprocesses.cpython-312.pyc,, -anyio/abc/__pycache__/_tasks.cpython-312.pyc,, -anyio/abc/__pycache__/_testing.cpython-312.pyc,, -anyio/abc/_eventloop.py,sha256=UmL8DZCvQTgxzmyBZcGm9kWj9VQY8BMWueLh5S8yWN4,9682 -anyio/abc/_resources.py,sha256=DrYvkNN1hH6Uvv5_5uKySvDsnknGVDe8FCKfko0VtN8,783 -anyio/abc/_sockets.py,sha256=KhWtJxan8jpBXKwPaFeQzI4iRXdFaOIn0HXtDZnaO7U,6262 -anyio/abc/_streams.py,sha256=He_JpkAW2g5veOzcUq0XsRC2nId_i35L-d8cs7Uj1ZQ,6598 -anyio/abc/_subprocesses.py,sha256=cumAPJTktOQtw63IqG0lDpyZqu_l1EElvQHMiwJgL08,2067 -anyio/abc/_tasks.py,sha256=yJWbMwowvqjlAX4oJ3l9Is1w-zwynr2lX1Z02AWJqsY,3080 -anyio/abc/_testing.py,sha256=tBJUzkSfOXJw23fe8qSJ03kJlShOYjjaEyFB6k6MYT8,1821 -anyio/from_thread.py,sha256=MbXHZpgM9wgsRkbGhMNMomEGYj7Y_QYq6a5BZ3c5Ev8,17478 -anyio/lowlevel.py,sha256=nkgmW--SdxGVp0cmLUYazjkigveRm5HY7-gW8Bpp9oY,4169 -anyio/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -anyio/pytest_plugin.py,sha256=qXNwk9Pa7hPQKWocgLl9qijqKGMkGzdH2wJa-jPkGUM,9375 -anyio/streams/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -anyio/streams/__pycache__/__init__.cpython-312.pyc,, -anyio/streams/__pycache__/buffered.cpython-312.pyc,, -anyio/streams/__pycache__/file.cpython-312.pyc,, -anyio/streams/__pycache__/memory.cpython-312.pyc,, -anyio/streams/__pycache__/stapled.cpython-312.pyc,, -anyio/streams/__pycache__/text.cpython-312.pyc,, -anyio/streams/__pycache__/tls.cpython-312.pyc,, -anyio/streams/buffered.py,sha256=UCldKC168YuLvT7n3HtNPnQ2iWAMSTYQWbZvzLwMwkM,4500 -anyio/streams/file.py,sha256=6uoTNb5KbMoj-6gS3_xrrL8uZN8Q4iIvOS1WtGyFfKw,4383 -anyio/streams/memory.py,sha256=o1OVVx0OooteTTe2GytJreum93Ucuw5s4cAsr3X0-Ag,10560 -anyio/streams/stapled.py,sha256=U09pCrmOw9kkNhe6tKopsm1QIMT1lFTFvtb-A7SIe4k,4302 -anyio/streams/text.py,sha256=6x8w8xlfCZKTUWQoJiMPoMhSSJFUBRKgoBNSBtbd9yg,5094 -anyio/streams/tls.py,sha256=HxzpVmUgo8SUSIBass_lvef1pAI1uRSrnysM3iEGzl4,13199 -anyio/to_interpreter.py,sha256=UhuNCIucCRN7ZtyJg35Mlamzs1JpgDvK4xnL4TDWrAo,6527 -anyio/to_process.py,sha256=ZvruelRM-HNmqDaql4sdNODg2QD_uSlwSCxnV4OhsfQ,9595 -anyio/to_thread.py,sha256=WM2JQ2MbVsd5D5CM08bQiTwzZIvpsGjfH1Fy247KoDQ,2396 diff --git a/venv/lib/python3.12/site-packages/anyio-4.9.0.dist-info/WHEEL b/venv/lib/python3.12/site-packages/anyio-4.9.0.dist-info/WHEEL deleted file mode 100644 index 9c3ae63..0000000 --- a/venv/lib/python3.12/site-packages/anyio-4.9.0.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (76.0.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/venv/lib/python3.12/site-packages/anyio-4.9.0.dist-info/entry_points.txt b/venv/lib/python3.12/site-packages/anyio-4.9.0.dist-info/entry_points.txt deleted file mode 100644 index 44dd9bd..0000000 --- a/venv/lib/python3.12/site-packages/anyio-4.9.0.dist-info/entry_points.txt +++ /dev/null @@ -1,2 +0,0 @@ -[pytest11] -anyio = anyio.pytest_plugin diff --git a/venv/lib/python3.12/site-packages/anyio-4.9.0.dist-info/top_level.txt b/venv/lib/python3.12/site-packages/anyio-4.9.0.dist-info/top_level.txt deleted file mode 100644 index c77c069..0000000 --- a/venv/lib/python3.12/site-packages/anyio-4.9.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -anyio diff --git a/venv/lib/python3.12/site-packages/anyio/__init__.py b/venv/lib/python3.12/site-packages/anyio/__init__.py deleted file mode 100644 index 578cda6..0000000 --- a/venv/lib/python3.12/site-packages/anyio/__init__.py +++ /dev/null @@ -1,85 +0,0 @@ -from __future__ import annotations - -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_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 BrokenWorkerIntepreter as BrokenWorkerIntepreter -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 DelimiterNotFound as DelimiterNotFound -from ._core._exceptions import EndOfStream as EndOfStream -from ._core._exceptions import IncompleteRead as IncompleteRead -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 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 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 diff --git a/venv/lib/python3.12/site-packages/anyio/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 313225a206361ec5feaade64b771593b1304274e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3601 zcmZ{m$x|H36~?pKnyuM|ge0^BLK3u)&-vdv{Ddzj`6K`5hGd}>&$QkB`;8{7#{0KZJ z=a?UZ=jA-}1UM&i%#-edw~4A6a+`St{6fB9ehPjmU#3Kj zP_OX+@!RTMeEp~7QXYRNzPG80Ehj#`Duk5i_lc7BGkf(d?k#;@e_i>0U+w2fzcBSh zzxq^3;}?nli-9`vi7c%RuYX6T;Z(WB^!*?*BPZ~~?`S^QTCJki%8!i5@f6w}yDBnF z*EM!bYhU?x2-|70S*C9(*HyNm-dKj^njyJrb7m)S;#+}Na53wqGAW>MyHrs2Y!qo{ zrx>Z#AlNS!lJz#f3W}~h=LXh3LYrp8l5Z_KE^T1lh8gXVF(@eC$XAR_huSP8jZV{| zb1iRlvCY5EAV|~;e0IG-`1pA^qn_opR@1)kus`goKDd$ z7$MfBBDe?s+l_vPZARvQ`KhX&~zd^xM`a^ypKI>s65I4wI6CHs>W9ac+Ze5(^FocOGdEs znzk`aPP~;jyl|9JEy!f!xY<5$7EH^DN~@LB!HWAnFm2IQ3M0p&i_kP5__jk=3ytoh z#)+8vg#+9)_}dvy`07?GxztAACp?)XpO=cJrp#>GQl44Z!xf{cjv6OAb#KpZJu|kp zXSZK$87oU`>zfNXM7PZIE#9*5@MtE-8=2w0v8#h3rP$e|BB*>GJBBBdQ&SnG}z5vtf9FU38UUl*MNareAV` z(Y0ZN9Qk5Y)Np93^W_d)WvxaHluti$gP@@6Vb=63PNzv4Nt#ILH=k~Slsl77Z!A^d z@~&ISnIUN-X(#C*=_KhQ!7oLjdq_?}%9-jQRI;2v_mbl@$r+M93P~2HtK~b?XUW`F z?OCZ_p+0xQ$h9cc=V_FFk_#jkNiLCGCb>d_7oX7ANCrp-Nrp(SlMF+Sr{ZfI>KkP2 zPUbJ}R4=d!^-bz?i`>158%26g2fp(ezXJ6LMU0YUNp6#jk=!AYXC$i>P)F6b+<+`L-LTwnV7f&WmeYp8R8Hd#P`7e(7@0Z> z51nYQ+-Mk7m649mF~lFlk5KWm%I*c8%6euL9%OTYRrHXZVK!2(qW8!MRYAPDN9^Fx zcLNhwBa8e!$hyu>wor=p0{`yl*qv;Mm+%P6>b|+F!Yto{tYJ7lD!(yWDE-_xS-B-o z^e$$lUnn7d>Wc4cQ>j!euKYthj>TLoHezu-7Pn$C8Hq4TBVlf?y7qNH{ zi?LV?u>x|jSdPVg?)CDgnwnJ2PYoiqgt0N|%ftyk=0PC-0I*NRVj>ocM?KJ3i^Uz7 zVsV>?MSq0Ch$+TnF%yeT4#4t`R)t>ocuCn<;13-UhK{RA$C)1*L`Tn;i@#a^YW>Ug zcRd5|+6Vt7YEpy0TKZeM?eoLmw*G$SU3&O0>G40O$N%{8x9KN;?H~9&{cYpf@9Pou ML!+o~)e5`z9}5;Y^Z)<= diff --git a/venv/lib/python3.12/site-packages/anyio/__pycache__/from_thread.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/__pycache__/from_thread.cpython-312.pyc deleted file mode 100644 index 35aa6898d07ca2a3a404e117b2fc92f8c4bf7987..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24109 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 diff --git a/venv/lib/python3.12/site-packages/anyio/__pycache__/pytest_plugin.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/__pycache__/pytest_plugin.cpython-312.pyc deleted file mode 100644 index f54237bfe4248bc44038111db3f2da2b22196d26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13417 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 UG0QfjI)+q^@?QeF2Fm>Y7YCo#m;e9( diff --git a/venv/lib/python3.12/site-packages/anyio/__pycache__/to_interpreter.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/__pycache__/to_interpreter.cpython-312.pyc deleted file mode 100644 index d05be1d607cd6be81f467dc93f563bbb5d7e633e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9139 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 Xow`hwU7@YNrQxLj(dFFFV0QioQgX;) diff --git a/venv/lib/python3.12/site-packages/anyio/__pycache__/to_thread.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/__pycache__/to_thread.cpython-312.pyc deleted file mode 100644 index 9bc18f48723fb92602d848229f8ad1166ef382c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2957 zcmZuz&2Jn<7O(!8c6(<0G2<*rfH(z-LS{oez^;g7NJ12ZgmwuC3}`1rJvH5ByW^g! zQFV{a7_XFt2==fC4nR1p_KpI7z;fcg7l#~TT3CPpfiJ5;&T3aV?R(WdW83a3` zs_OUqy;uFOv9Th7=imQ$Yw?XyLcYh!;IT8q*!}^GYa}3n5s|jhFbuTK$ZVKUT9MVZ z8@6tlm8dE_v zn7nE?_Vvu#)D}9c8EJ_LArqE_Qp6Xa?w)5+#99#tdt|QH;jb|TroFi zkHtOVdoAWKaS=e{#Cg_Xewg(B7`DTNtD3oG!SJmT&N0(+?rW~wiFoR~Dq!$Z>dtvD z^JJMtsr!Ik3o_`W)X5dH!hD1T6W4cvSzOtYu2ZQ z>$zy&0kOOVUOqCfS??AK_$U|oX?(jI8Ydpe^qpkqN^}b|>D;=D4 zkqudcJ%BuLN+yt@+e|3CksB-oikPJV? zzvp1Yp(R1annwFHN99~#`XAT%>?n3xWda02+|fs99LLPUgeCXrqq$Z!G=vu6_(vx}5C zgj7e*iQe-s(%;WKKJ(a98kM^lf`vj6Cy*4jFq=X4EyfAt(}*wgsAj53XjE0~u@$Dp zwEApLJ?QOq$mD>ZaB(_yWZBNk|?LHR@ylF%wA^a8-v4xLl9IR=v|p7Nz*z%;QhgA+-5P zyc5_0kLwz-`VL~9Ug{2Zsvdx~_rWjz6TE&V|GPr^PZD=(ePnv$!AI8JgI~MlzG;lT zVEj;?-q?TOKcj`w;_Y!#J#w>h^j77}jmnt~xBS;&{n)85_V+DPJ-bcJs`FoBmYqH^ z3-~HKcj9sI{`RSJ#Q3Li#{Rqjh7T>n2Z4v|ZfrjR#x=5Y#SE_x=-vAa`d$IfRzK8& zg!>QkXO_eEh6TzpmoIJgKr5NDe-$U9+it-nA?LL_Ukbmg6x<<$fXVebI~4xi;U`;{ zxu0bB3&=++V>)-^<%{OB@bZxTglyyC6n@yKLxb08Fyi~*b%orXB;`XlOVhVXr*D)_ z-z=S7x6i7>&{Zp|15m6UJD+Fzix;!6fs2DrfJ>JirGpQHOX?sFp4>Y`%QCfFQbr2J zxmrS#uF(rpaIO8-`}Ta1Zv8oAi9R;buIDN0CHQb}~#YoQzAQWk{_t z_=B*68>|dXY7E;enNyFynQ(yvV!cf@fg@1(8P?NiA($HfJMPnM8FV9lMxB5*{Md;< zfLGr#3}cf#{5>gdlB1jC{!Mc5M^fJ;^jpihWli0%rruxq(whFpKCy0}_{o0qyHfT2 zS>Wu7`&DWG$HkkaBUjvhnH)a4arnr_vETkuI%YT<#mD*j;gjmDOcQ4TJ(Ni XAEmAbfhV&H|4Fco@J$IJCJpohSLr%% diff --git a/venv/lib/python3.12/site-packages/anyio/_backends/__pycache__/_asyncio.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/_backends/__pycache__/_asyncio.cpython-312.pyc deleted file mode 100644 index 50ba192e107b23003516e1d0e532db75eb235924..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132779 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%0DcL^2!LS0gQdjsosjx0wP#-Di2o=C? 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 diff --git a/venv/lib/python3.12/site-packages/anyio/_backends/__pycache__/_trio.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/_backends/__pycache__/_trio.cpython-312.pyc deleted file mode 100644 index c7b4d041394db97a915737b252c242688aaaf7af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70500 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 diff --git a/venv/lib/python3.12/site-packages/anyio/_backends/_asyncio.py b/venv/lib/python3.12/site-packages/anyio/_backends/_asyncio.py deleted file mode 100644 index ed91f40..0000000 --- a/venv/lib/python3.12/site-packages/anyio/_backends/_asyncio.py +++ /dev/null @@ -1,2816 +0,0 @@ -from __future__ import annotations - -import array -import asyncio -import concurrent.futures -import contextvars -import math -import os -import socket -import sys -import threading -import weakref -from asyncio import ( - AbstractEventLoop, - CancelledError, - all_tasks, - create_task, - current_task, - get_running_loop, - sleep, -) -from asyncio.base_events import _run_until_complete_cb # type: ignore[attr-defined] -from collections import OrderedDict, deque -from collections.abc import ( - AsyncGenerator, - AsyncIterator, - Awaitable, - Callable, - Collection, - Coroutine, - Iterable, - Sequence, -) -from concurrent.futures import Future -from contextlib import AbstractContextManager, suppress -from contextvars import Context, copy_context -from dataclasses import dataclass -from functools import partial, wraps -from inspect import ( - CORO_RUNNING, - CORO_SUSPENDED, - getcoroutinestate, - iscoroutine, -) -from io import IOBase -from os import PathLike -from queue import Queue -from signal import Signals -from socket import AddressFamily, SocketKind -from threading import Thread -from types import CodeType, TracebackType -from typing import ( - IO, - TYPE_CHECKING, - Any, - Optional, - TypeVar, - cast, -) -from weakref import WeakKeyDictionary - -import sniffio - -from .. import ( - CapacityLimiterStatistics, - EventStatistics, - LockStatistics, - TaskInfo, - abc, -) -from .._core._eventloop import claim_worker_thread, threadlocals -from .._core._exceptions import ( - BrokenResourceError, - BusyResourceError, - ClosedResourceError, - EndOfStream, - WouldBlock, - iterate_exceptions, -) -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 ( - AsyncBackend, - IPSockAddrType, - SocketListener, - UDPPacketType, - UNIXDatagramPacketType, -) -from ..abc._eventloop import StrOrBytesPath -from ..lowlevel import RunVar -from ..streams.memory import MemoryObjectReceiveStream, MemoryObjectSendStream - -if TYPE_CHECKING: - from _typeshed import FileDescriptorLike -else: - FileDescriptorLike = object - -if sys.version_info >= (3, 10): - from typing import ParamSpec -else: - from typing_extensions import ParamSpec - -if sys.version_info >= (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], - exc_val: BaseException, - exc_tb: TracebackType, - ) -> None: - self.close() - - def close(self) -> None: - """Shutdown and close event loop.""" - if self._state is not _State.INITIALIZED: - return - try: - loop = self._loop - _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() - 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 by 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._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 - cannot_swallow_exc_val = False - if exc_val is not None: - for exc in iterate_exceptions(exc_val): - if isinstance(exc, CancelledError) and is_anyio_cancellation( - exc - ): - self._cancelled_caught = True - else: - cannot_swallow_exc_val = True - - return self._cancelled_caught and not cannot_swallow_exc_val - 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() - 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(f"Cancelled by cancel scope {id(origin):x}") - 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) -> None: - if not self._cancel_called: - if self._timeout_handle: - self._timeout_handle.cancel() - self._timeout_handle = None - - self._cancel_called = True - 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 | None: - 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: - 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) - 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[Optional[T_Retval], Optional[BaseException]] - - -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") - - -class BlockingPortal(abc.BlockingPortal): - def __new__(cls) -> BlockingPortal: - return object.__new__(cls) - - def __init__(self) -> None: - super().__init__() - self._loop = get_running_loop() - - 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: - AsyncIOBackend.run_sync_from_thread( - partial(self._task_group.start_soon, name=name), - (self._call_func, func, args, kwargs, future), - self._loop, - ) - - -# -# 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 - - async def send(self, item: bytes) -> None: - self._stream.write(item) - await self._stream.drain() - - async def aclose(self) -> None: - 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 - 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: - if process.returncode is 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: - 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 = BrokenResourceError() - self.exception.__cause__ = 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 self._protocol.exception from None - 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 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: - if not self._transport.is_closing(): - self._closed = True - 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: - if not self._transport.is_closing(): - self._closed = True - 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: - if not self._transport.is_closing(): - self._closed = True - 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.Event]] = RunVar("read_events") -_write_events: RunVar[dict[int, asyncio.Event]] = 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 < 1: - raise ValueError("total_tokens must be >= 1") - - 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 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) - 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 - - # 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 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: - import uvloop - - loop_factory = uvloop.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): - import uvloop - - loop_factory = uvloop.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(sniffio.current_async_library_cvar.set, 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(scope: CancelScope) -> T_Retval: - __tracebackhide__ = True - 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: - scope._tasks.discard(task) - - loop = cast(AbstractEventLoop, token) - context = copy_context() - context.run(sniffio.current_async_library_cvar.set, "asyncio") - wrapper = task_wrapper(threadlocals.current_cancel_scope) - f: concurrent.futures.Future[T_Retval] = context.run( - asyncio.run_coroutine_threadsafe, wrapper, 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: - sniffio.current_async_library_cvar.set("asyncio") - f.set_result(func(*args)) - except BaseException as exc: - f.set_exception(exc) - if not isinstance(exc, Exception): - raise - - f: concurrent.futures.Future[T_Retval] = Future() - loop = cast(AbstractEventLoop, token) - loop.call_soon_threadsafe(wrapper) - return f.result() - - @classmethod - def create_blocking_portal(cls) -> abc.BlockingPortal: - return BlockingPortal() - - @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: - await cls.checkpoint() - try: - read_events = _read_events.get() - except LookupError: - read_events = {} - _read_events.set(read_events) - - if not isinstance(obj, int): - obj = obj.fileno() - - if read_events.get(obj): - raise BusyResourceError("reading from") - - loop = get_running_loop() - event = asyncio.Event() - try: - loop.add_reader(obj, event.set) - except NotImplementedError: - from anyio._core._asyncio_selector_thread import get_selector - - selector = get_selector() - selector.add_reader(obj, event.set) - remove_reader = selector.remove_reader - else: - remove_reader = loop.remove_reader - - read_events[obj] = event - try: - await event.wait() - finally: - remove_reader(obj) - del read_events[obj] - - @classmethod - async def wait_writable(cls, obj: FileDescriptorLike) -> None: - await cls.checkpoint() - try: - write_events = _write_events.get() - except LookupError: - write_events = {} - _write_events.set(write_events) - - if not isinstance(obj, int): - obj = obj.fileno() - - if write_events.get(obj): - raise BusyResourceError("writing to") - - loop = get_running_loop() - event = asyncio.Event() - try: - loop.add_writer(obj, event.set) - except NotImplementedError: - from anyio._core._asyncio_selector_thread import get_selector - - selector = get_selector() - selector.add_writer(obj, event.set) - remove_writer = selector.remove_writer - else: - remove_writer = loop.remove_writer - - write_events[obj] = event - try: - await event.wait() - finally: - del write_events[obj] - remove_writer(obj) - - @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.12/site-packages/anyio/_backends/_trio.py b/venv/lib/python3.12/site-packages/anyio/_backends/_trio.py deleted file mode 100644 index b80cc04..0000000 --- a/venv/lib/python3.12/site-packages/anyio/_backends/_trio.py +++ /dev/null @@ -1,1334 +0,0 @@ -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 concurrent.futures import Future -from contextlib import AbstractContextManager -from dataclasses import dataclass -from functools import partial -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, - 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, - wait_readable, - wait_writable, -) -from trio.socket import SocketType as TrioSocketType -from trio.to_thread import run_sync - -from .. import ( - CapacityLimiterStatistics, - EventStatistics, - LockStatistics, - 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 HasFileno - -if sys.version_info >= (3, 10): - from typing import ParamSpec -else: - from typing_extensions import ParamSpec - -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) -> None: - self.__original.cancel() - - @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) - - -# -# Threads -# - - -class BlockingPortal(abc.BlockingPortal): - def __new__(cls) -> BlockingPortal: - return object.__new__(cls) - - def __init__(self) -> None: - super().__init__() - self._token = trio.lowlevel.current_trio_token() - - 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: - trio.from_thread.run_sync( - partial(self._task_group.start_soon, name=name), - self._call_func, - func, - args, - kwargs, - future, - trio_token=self._token, - ) - - -# -# 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 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: - return trio.from_thread.run(func, *args) - - @classmethod - def run_sync_from_thread( - cls, - func: Callable[[Unpack[PosArgsT]], T_Retval], - args: tuple[Unpack[PosArgsT]], - token: object, - ) -> T_Retval: - return trio.from_thread.run_sync(func, *args) - - @classmethod - def create_blocking_portal(cls) -> abc.BlockingPortal: - return BlockingPortal() - - @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: HasFileno | int) -> 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: HasFileno | int) -> 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 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.12/site-packages/anyio/_core/__init__.py b/venv/lib/python3.12/site-packages/anyio/_core/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index eff2b36275d625fa083231223c726180f4a258a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204 zcmZ9FK?=e!5JeNKAVLq~q8-$&xN_|kLQDr6+9V}OE5U=fbMIL^hI>J}>&j&7hxz}_ zFz{b_z9Lbd$E{BJPWG>H9xrzi$eNy>#LnV2rk|;S+9(9Yy&K?YM6XbL2Oe9zSgs1^ zrD)I=mAUHH@Cq#qs0V1}8M@$Wqj%+I3r>10IxZT1K?ht1X@Ci15g3zNddA8wOv}A8 VRo~*lE@C&0;}U!`N~z5v{QyzRINAUJ diff --git a/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_asyncio_selector_thread.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_asyncio_selector_thread.cpython-312.pyc deleted file mode 100644 index 89e7225f5237874da6e674f83bab61dae08fb9bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8435 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 H?M3__+FL0O diff --git a/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_eventloop.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_eventloop.cpython-312.pyc deleted file mode 100644 index 9f0925f2129084b16488ff966b98cfdb0ee5aa0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6362 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 diff --git a/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_exceptions.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_exceptions.cpython-312.pyc deleted file mode 100644 index dd7e9fb442c088216e84fc714418d685366b8485..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6076 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 diff --git a/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_fileio.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_fileio.cpython-312.pyc deleted file mode 100644 index fe0445297fd67666a155e3d77d79c7d4befc2744..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41635 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%0DaNpEcPO3@_XZ5ykvubMTu> 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 B3-bT~ diff --git a/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_resources.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_resources.cpython-312.pyc deleted file mode 100644 index 69400a8ec44a627af6ff8116ff15b9e313100c88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 957 zcmY*XO=#3W6rR~^vfJJ6f=YXn4gMT*Xk!%-iYQC#N$5dO-AkAz)7`Ym%rZ0Sy0(H? z5sH=Gtf$_kdQicu^z23OU<nii5$r_@Em(>NU$UDnzQE+0_rCYu_lEbmQYj&@-&@PA z4;Y~z$tAN~58%Tq05*|_JRG19H!wzC&eMWis5Laec~1}Wq2AB|7d_)?zF~9=*3f>E zZsE907~_g4pEJ3i)C6CpF1yUVM<tJhOZTC3%A6w1rNModx2c=>GBW_IB7_gO0Nh0w z)Tq<=cAs?}J;Ez^LCcZ`|BQjr3R=(y{tRXDRhV!Y@?UD3+B02;J|0fK?d&B`7vDhZ zm5XQsN!-a{Gz%OI-Ur$&>fpCp2V1#^Z%QWERKO)Q2{TDDYD;j&BWa5M$fgeg(@p0M zsAtM#=J8URIn906G*!!&rkfOzfaxH!<Es{rl-VJ^N{AdPu`bYAvtMAcO#}%~GbaDf zSG-rY*KEepL;)TmHhN-WgQQKZTwKh=#(FAGCeL7+C!yWqA+<xI<dQwj-6*6?Nn6o? zHlgpBRKB}N#hAxCEa1eW!d{|m$qxKEyA47)yEZ;?)t0`ZV{PItk|vcljNo(Iak-$j zlQov(?QVRgC&-!SuqyLW5OhTqge0Qn9XNiW<HzXeEGmsWKYxI7y7}tzZn3g4yf(aE z-K~yp@HPImTKiV4eJR%d=nzjy-;1^5!R@cKpwg3ay@Fp{s$=aPzHPkE1Nb-uu1^@y z4%X|X!j4e@$BdO1Wk?XoGR20VDiSQt&u~VqLR@m3`3OAJaYV9>u}0?HKGjh~F3R-9 x(<xq~Ltr3Lf#aljGvr<r&|6{@uE~PSb8sAJ7~?&3;U}u?q1usA#-<nn|34Mv^#lL_ diff --git a/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_signals.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_signals.cpython-312.pyc deleted file mode 100644 index c62c4a896e74c11275e62968dc3f6d402b528b06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1289 zcmZuw&ubhv6xQrdd)IC;)IKDoJaX!Scc!U(T55wyAox(Xu!X>yFsq$Wc9dwOLDH_X zX$d*>(o3$s^<H}E|B*{V3oQ$VLg^uwVsKA6<!Ll)FsTNlr_s}U@B8$<mz$d%g5%$x zzRP~B6Y{s)tVYcn!R0q-oRO5IfgpJ>3Ib=>L@lq6>ZM&5jl4N(mUct5^7g2Wb~9~> zwS0ZF9+36wOV`u(4~<c0vDWLnap8NxvP-2@mRhc)!R_XuS;*wbGEJ@0_+#gAVyvc# zy`!XMPwZDz(kXK%?IE8^D$JX}N7|Y)8&h{Zp3vkmlWF2|tOnvEZ9;;}&(Js{HDcYp za{N-Qk1EX7wp_j^FUSxJr8{`o0USe1wFS)*#^+p4K^3l8XPJeuEC=K33Ol9yprD#w z{T!@L!Kx|-gHKsF4PiX?7sKJvy`$rA$K#&AubG``IRGl5M3-qL)yzQR34z=*0uPmb z&xcn;!fD2n3>KV;)RbWz5}yy`ET1rKe7Ru=r&LRXGZ?^qE>m@CAXUr&J`<Q(Q7A-T zK?I4w=S(cXDBu>jfeAC#VWV@!)2mDxeM+t**bKe6ghVT2`h}nt3(tWTh2V+TLB-s) zQogRxbG7S3AnS;nNsHMv!#D}nNaX?w&F0(@RKd%rOa;@9pR0Oo#$bw-%N3Gc<Q5FG zFy|BoIkVYd{H&y#t57IagfvZKA2F^Xj;lI*HNA#fS$>2{kSiar4=>b;E#m|SZy!gQ z%2||CYv$2imCSMkVIs=}o1#+s#&T4z?j!S3D4H@IVWIO#@JUoGY^LO1c>D9n;M?{K z6gswpi4ZtfQJg5vqN)TF77OkAyPTY1ZsPQuT-+iXU;N(v__yvSe{}a=clUn1|EjzH zs<D5G$K<%z&|O@03#VnvtM6&}|8013tzA!sUil9m^t#JV96y|)a#<W}*L%wk6D0&o z%1#gIB+(7`w^PX&(dlNH(X-{#cVdRvt$Toy;}XixL~o*}-oWYY+LyUXXM!E*ZQMGB rO%JDwdJqKX<kml=cTW1}<OUiSt*zkT&kwdQ>bU;Z-21PIYZ>YtZhwB> diff --git a/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_sockets.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_sockets.cpython-312.pyc deleted file mode 100644 index 0b5e8b92456da1e9c6ea7641901f0b9cbfb2f6c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31563 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 X^oBPYneR>8$%pPJyqN<ZQ+NJ9>%e@B diff --git a/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_streams.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_streams.cpython-312.pyc deleted file mode 100644 index 25d8538786a7ee44bbca53ae39b8cba74862ba57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2352 zcmb7FO>Epm6drqRXV<$)wt==ZDb=X0O15h3LW_`AsG>hWtCplCX%Smhj$_a6y6c~1 zJWkjpNCox4ky}AR&?`z09654Cg2SfiA+lNtsa$$NsnUYf6K`zqDh*O4W~JFTZ=UCU z@6Gq#{5CwSA{c*t|5>v%gwR92=#P9V2%9%RxP@$F3oi16njmmlbj6wo|2a43Ni`|a zNv`ZEH3ekZR@@;kU(0)iTESCms(?g9BztH@NKdU5Mf5(h^EZ)QASF^D#XYb=^67tF z<g1ljW;@&wE9xV@s0eY<^!<RD%nAH(8rDN|oi@2*QV^vjllqTDZkLPqd_cT_c4ii? z6N`OFEaEJZSw@NJ#k;m{%@W_v^t+$aC$_WTiNwmBagGtsO7Wy~22R*K1nXOfpqgMK zNQqF(6_70zQ2z(X$la7{5(J^d6BZy~#PAYuMv$O0!o-)k8=$Kg#_7Zen>aPYsToeq zG&QlAYm!XyT8JG$hZ!USTc(c}2+op3Z0tHMl6+9DN4`~^e*u82X_(jMGZ)piNlg!X z=BLI&RId|igie=Ku^)L0gyNu{_ziKBxHfit%m7kqh$EjlE}owcA-j{6`FVh9QWhpa zc!UdXV6_~-ks?d|@E{BxL=^{c;F8(lE<BTR!{qQZ0U=&;STj*jr_p4%L3~0TD@{N> zpaU=9l%;xp!lWIL5CeIdd=>ckq~AF=gO69zgmPG#hHcWO#DY7rt5tklJ32TF<I5p| zkY1F)kAsMErf^PPo76Oohwk_xBc`pTu~Nb!>Q~`%S=4q34{?%bDZ9)g7`$_?X6p>x zw3YEKA)gF0tcA_L6YebwEK&36I;a1((RvFZI>Go?$pCw$FRx_wVUZR3I$K!D%JfTN zS+K<x*wC%}xh?zR7h|kA_)=n}fh^xq`XwwNHrm&-a$n*_zC7^td5*o*-&r1bU_1Y- ztBbR!GBn+Na~m_U7ln+op8!9Apil~q&q#xFl>(7iQ*-<}<q>!HZ~qnw2dKfn_DKV1 zvq-v(*VurS*rbifBR<1TGXy*0Z{Z53e?}+msFpD0|M6tN63VXznwbjZwOTG&ByOb` zOB{Wi1NgD(gq%^PZxOCwv3kXHBl0e#0j2zo<FPXthoMJ)1T7KhPWk0h-s~yw>lB(j zsz`Cpa>ICZTPothAm&)+B}76A%z1r0Yw69vBRZf77xgoNl_Vt88F5Jidc{--_0}SE z$_|!%H!y8N^+n<@>aMe(w>zvE_{X%@-_S$wFx7_m%mxW{)9*NeZdd^&de#d=t=)-- z48tc&hS5Fnf?R5u(LsP1c44}KHWXBv_|E>J`EB!V@z9;_&-(Aj?&&l4$M*JKom(5b z+$&vPFOGk6>27gfqC2@ZcB)r8wO)L=SH$;A<qc8TF)jRA-oHMv_h~^M9(gi?c1+$; zR?GTNqif}NzLM{k58aN|%2W6Bv%l_K(`S047kl}Oo8TQ)#Drke6@~7CWh~br4~*{S zvXVCPSV@~e_iWMvu0Hqd44$KYH$H;5?mzdE^-Zo-<Twv`Fg;=zv1%AzU`H;OONQ}D zWV+c7B-9Qp!=U4U=11rW@JD$SQeL&m#EUc3V7iGOE2DCL;~+Y5O4!Ji<x9f)z5|(X zyqXGs6fQlH`Br)qKczCl0n{VtasYtxwncgE#|pG|&P2|oIM1JIScNHLN3zbYr4L?0 z&y=VG-o|p0tQ6@1e(C`Iv;5m>z$a)0HhAv}FTk{s69nM_+W!z0AE5CEXwN^AB#4g@ zpGrvG@%1Zfh4CB86Xl=)!AXUlif`{)RVRCgPyh1X>f!S}_57-I;c1R<C*J-A33-_3 diff --git a/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_subprocesses.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_subprocesses.cpython-312.pyc deleted file mode 100644 index 55d5017c544f5708446d1dd27adc0689dfb84d37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9664 zcmeHNYiu0Xb-uH2a^GBX`6h>?9$bkc^+=>-Z7ZQ|QJ|wxbVw!6+A2BR8Imi`&TQ_? zlA^M7Wh-qZLrr8jj`Tw)9Kb;3Dna|RDA3kI1Sv)TkY);Q26ikU2~hnhR&WZ*M1l02 zdv}*haizd<;QB|0+`DJ)+{ZcRo^$T`?(Dz&{j~(H|N5Kn&gz|n{2FgcSBMkBNB<-c za+#bUGLZ$9q=keaAZ=4^2^)OdReRczaHO3HXWEr;rQHcPd+ty@>6%0hqn&DP+MDn) z+NJu^{)9grNCeWsM3B|F)lfQ|2&d~3b?HbVlCDqGL%m0?Q5(|HL=@;+*{e3Dn-Wco z_NmS3mPCs{6x*qTC5AV?W&hkugitqd7l4u55^Vy}T<or$-zgELL+O-*a%kGo3>_1q z99FvIx+j5_ZL&@AD}FhG6#NmnUT!GTQMvJIu!elvKe<(I`kpJ%jq|`v)#how>i^?s zk=x`J7{6!H7HhwYiiru9SJE`yl+2W_86z==<sUQ_wdAm=P-#k4EKiwoe_hICQre8= z8B@NKRkWl6z1>eQnu;-e97xZoWX>K-%_%Xv<rp0vJz~{8BdMw)k5WCU7{(Dwb!vs4 z(bE}KG0W93rEU1QWgpZQE$0ah*svT)$uRHQIDhV9_q$+k$ZvQ?F()MCabikJ&MBIV zl}V~drZQnl#@xgV)w7wH?XDd<+(k=<1~uc08D&sSNyZs}iO&}elb$>iEZ<I{C?{zX z^soYBCOuA>aQJ+D=pAzR_i)96mNTVgvZm!UOgW`lF8I>n7QYorEoX98NzPgJ<brJ3 z6>Z+~8m2_eENE_8xBQGxka1d-W(+ILo=s@V!h``DLfJhT$uK6SWy5l04F$$y(pWy_ zv`Hl{nqfJ!X%IAt8o?_FAN0#}ga{wK3u6CO!`Fxa-YL7!H%tq%@IBvBC}(@cpA%m3 znx$Ugqt}b{tAdHjVpopj1nM#!rF%`t*>d)rBj?JwbDmsHt~Te*`EveTAQ$|J<9dL% zI|u&pT^Qp>w#)XvbUMiw$T?wi%~BZcdB*lygXu1feZ5Fjw6^p9OLe*MDNm{0#y4%x z)t&Ng+?S|asCs+ZdA%r^K%j-M)PCdpu_IP#FS|C4Sd@QbJcuwyL4!wNwkpp~g)3Wf zIwzFYp{zv**8=0Y+9;8&qm*=6b&Q5j(w@hi>*#-Qor6_lD_dL{h_oy&ZFyc?d4XJL zcnSJ0MV9JwPWr_^51)$ikt$2sId=#&wZp_P%PzCEOtqCL&|#InrJ2D}Bf0wPMN0)6 zhP{ekIZ|!3>YS8Es~BsH93q#5i!v+!jFrzFA{YM+KJUQi4fy;;5820c1M~lgt=A#q zB!;kH6Uev0`vh|F&C~X8lLY}<U)<E1X>v>JtGxA3?F&N8BmEwXzgC3n8(B@1G!gt? zp_-(MNj;sGG+9hRwP<9gGCaCM8(CbCQl^;I%#<nu0WDdiHTrAWNd5hyp(v7S=<&E1 zpU!H@_~ga_{WPmh@`mw@M5T0Trnso2%vpuvbS8xjKs0p`qZEF_1JRgORJBjkp@jzX z@{L2(r;E)EHaUut)HPE|X>17Sr<_)jSrc~|QIpaN4v>LZ%OpvehA7dQY+BJwK0uKv z7JTC(i`9$^MK1GUf(|5#s(}EF3^4A>Dq?&Thhf1xF6tUgJ1xd#$&@xJ1NX1VzA6u% zJ@U<w6UUBC_LZfQ#Oai(>``Io6ZNT6O44Mym>hw@C!Y`}CmB1FlcGKk8$?Q0KykCF zO+xWK<TGIBAr$~Wf0{|RDsXK4+2be1L4}W1PbEKW<BW@`X;9fX%_@`7nMx@`5#!2f zFx8hUY;|j5F^L^vz01o|@(ZxXbV`Hdzz`R}j)5Plm|3cUHOjDH%(Bf{u-v_ym|2kH z;_$QxsS&WlmJ--WLc1A-nbm?$=g^Sl6onPn=_0qnlp#(j(>hf|aHo=`mw77sZskOf zA~2aZPlN^{rg^>v{AN@MGAK50N&{B}CzD0!nWDOe9#WoQUZN><C_|j4dYW|rUxpT9 zQ5}_2S0pBJ=DHfxKw8H<BB_FhZ*qyT@xgD5pBNn;89F`*BTEoqKx<Qq2ziQJ<^W=X zkx`PV>BZ8N5C&KR1l|f!1u{Qsh`rxRX|ldxfCH+Fu}Y>kB}j3R<w;v+LtSGqp}NXs zEOjdSe3_XIixGPv^ojAUQjO{vMVl01$=FDo_f*o@#MG8Ft!SnuGgIDCF^!bm8xxI1 z!&D%6Lh1_!2L)&-ErF>)z^=5<<ZMcn%R0)?6mq}=Di4g14Q`EL{bKLv@v-3-wkoca zH^w2z^Yk2hV`vf~<Rob-16Imn_MD<*L=+oXGZz&2#yDBD69}PY^=)ENF&;fPW~#7F zOizO=q~@7LFk!$4_}HaA3RZq}(VPXz4nHLx=>Kw`_y}oO)>}Cwt3U<)@ncq|(4eJk z26jjE9toV64bQY=C}we~DtFh1*e<K+5$v=4yzJMSG6VQ(Ug-m6fM2tRA`sx;Y6?7= zTLwgzN{irOq&!hYI1y)HER0_~5qOBTts3R=j=4DBpD?0O#Q@PuTX88>C>tc3H_pPZ zAwE9x7JY$*Z`kEPu2TGFJ2|s0zW!xll+(Ds7sIipYiAS+3%e1Pc^Z-|W}qym!z}L& z#5d=GcvIl`W&_KVvfm|Jj_fA~;3T3lXI--AY^UrzH>@mkWdsD-S}Wvf(Srn9IxE|7 zx-|X;M^3=gfJMUcG+`uWrwCIl=K@A$%LC|iUQ)A4%!!Z?P-z+gqpX~^TvJ(a5QY%5 z+ME^SPbV;r!Ackg&Wc&m+4ao8te#c|(voS+4?L?Uc@{KaDylLAA#{&nrU3ZTJrF@P zRfpI@2f!fa2h`NmK!&;3f&P8_2Ml0nPX;iuG@}>;lD3%A2Vgp?3`}eUMsVxQqUDoe zskI5t(wQzWwu$0~(f_2XLo726_g6M~9(XmLh2p_~k_TtW`{AZHn$NrPtzGwtP$L$w zxU@a*tNX#R3&*ZB{D-fzV27#)R}L0jq`UWTJAd4{+O_|D@QU+2Pshgw=I!VFgErxk zV~_2J!fw}__C2;M5vaH>?6Li{0f><^J8-KgC2TBx<B1~6_0XAARbNo#cl@*+hNB%= z;J~yCi*77>u-Jyhb}V*au@j44EMi#f!UFA%BE*Wh=m313so!)a@?!CzU@ttf>?sYv zKet`Wfr&yaWYvBXO@JSG_%PCzv`O(ef+8AY3|h5(XEAhL<IE!OmIGW<wp>zD)eXgR zU{-I{@+mNBp@@Ge0)7e@ickcpv8d%P1_X-m>0u>^Sog^_@kQunxr?S?*~}Ts1&1AY z{NaM!5%v>$09qIb($I9bTwkSMz!AI^21SRU20Ix43a1a;e*Sx2a5@hZ0>tBAb~jx) zvE1JOexPZ&d2luG^s?va-!ydPJ;7f_TmM>qt05m`|Gr=z{_8vQ(Vl$E?tHj8?+@n# zkvudFM1I#EjJocVU<isfXIFt09i%p#A2{$2<JZ*l!S^HERwFy^6K@SXh2mOwJ{bMM z%dfqh57k}vzwW=HUOW2tBkzp-<KQnshwnW8(b8*6KW@lJ+b^eIPp?ILSE9Yw8djqN zYoUSV&_KC<*GhEPYP4@H)VCb!yHnSEx$pJ9H~QCn;<8V?-v}%)X72X@zntkONp$-w zBWH)s5B<{ZyVSTA?pX=<y!D;;!oBYY#JB6;PF_2-w)?4--A}D{9e&sS^XT&P-&zg4 zu<Uu^H{RAON8cX*Nzb)~wSmEvfx*@7Prp0#^PyGm*s^1+a6|yTe9Uz6aiJR~{<sh# z;k^&?p}q%qeBy%wGV_3QgQ~fQ#d-l5gW3{%_mKJ@V+|JaT>NN<@Xx|fm*ZbNK;3W& zL)%<8+;*gEBS&lOH`;}vot_&VcBH!ozcRGn`7==%+U5CKR~OJXZNgBW=cc_8=@wzA z-*dCofpn)AI^5hP4DEH@-0eVmzzc)kj0;EIj+;*m?u46L+XO6k3h?+AG~MsK)yK+y zR_<l>`&~yJHMhPb3_TIJ^<_8Ew}~6t-*#i)+cmDEt?t`F;b@)jcF2u%qZ{h!L6EI{ z#^#3`{G7u*=<k5wJ5Y)&1#-2oIN?+*Alq<f$a&$;3wL&Q=PTYh*qtBFJzfG&bmIA$ z?7})5*}99Js@(aY4PH4iE#yjPan90dob0|@lMB2pd|!ZbAEELD4$m+yI*O+Wop9vF zcHc3~#WC6cL+1%q&kP=wK7am?4L&{I7o~FgQXTIXQ6kTr_zB8qf$OVJ`+te-t8fIT z;Z@)?riNQ_H0<RZXUiohUBpA$Or>raa0Y}9-<Wf5#?Ns2mChO_VlSzTqZwwEmFbkm zv2=MoE0DBUfuM_!5KiYyFs*X_66RzG^>YPO`MZYC52XKp^lZS}oj(zJt`7b`AzZFL z$fv`{)yMp7f$+mTR3KmW#&8zS%k->Ka_8c4E#JLH9)<!81t1=X)jXU{KQ@t$*=RlV zqEBGgARR>d(?Sx<HMaoA;f8^)`X0)%S&GeOW5ro$VO)iRA+y4iKsv;;LwUD%+1;3L zZa?ojKYt-`$L)heJKxd?w+k17cifR>cW1t92i(5A;^~0LmxNc(Y&;L|`$f2WHN0&t zyl*AE50deM-B;(j1NrtNvhjNj@VpQu-tfIfpzaf&&s88kCl)@}x={xVzB*Vt7!hvx zgu$@mhTjQvtedH8JvO%K?W>p*ORt<?-2CJu13PDY{B=N1MEu2+y<QKv4EhZpe-U0R zp9G3MVyN&rn46<5Mu~81Ii_@7WdLctVe=HFu81Jln~Lwi@zrr3zTYU1%&;ZCs^b8Y z0W*d&zlL=PHP`)RA%M4&%-q&PFb2%PnPn_8EP5O}As}6E87{t1!6|vm@|<X#90Gm` zs56bvJoIY42vlPo+z5xUIkQA2cQsuw!#;-XP+a<TEdH=$bOhTmB+VG#ECL<Hr<-}D zxc;$iR_(;ZbQVtIm5B*zhbqes$EQ{>sl)FE;3yG(lF%<rB`F^MP&^-@E-di<v1Nk; zQ+D!V(+ygKHMJY38XRXcoQ&w$a+!<x(*=qdJY}ndj>IsuWycwiAK*rTa}-n6^$c@i z%f)_BU@*XL`QY^pzM`MNH~IWm0%1Pv1SZoOJ~Kc76OMS8JyLwPX$2=HDt=)Baw7ia z?%D#>NAMxch1We#rgb^1Du<~Abpm{hJ_tf^bRr19BHh0xwI7n9RWkGeiGDyDKO}=I zWbi|>bCvA;EouIM#6BR~@7P^y_Q;Aoa%tf`d&jRF;%^<h@3eKj)$>;Nn!fy%(dF*Z zmA2>41}@dClIIIP(%PBt-jVOwiT`!ceAo8;w%&YWYreT9-_eur5cBO_`HpTt&G~TT zUeAmmj0<`H!GfJpaF*k1D!4iAAwIEC!|7V$?<#mX?L*qn=>YMC3PDbXNNr~!%;`E( z+g*rox}MZE6dE`kCH0MkMou@8rnW*er&~y{t<cKpHsWn9v~#+H_}U7coEAxBPoay` z-NY9xaPAA+h^zgh?Yur=CtP$WA1`|6bAsSvk|TkFiv>3$Jt$udBe~d&^r3WqMg~y0 zAR|L4TbPk`C|ZP(^(a{bBcmu-BO{wou4YEIpjfSpY(uHq841D$3yiOVNL>Ekbzv=? H1grU9Wyy!L diff --git a/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_synchronization.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_synchronization.cpython-312.pyc deleted file mode 100644 index c5151f21618694a73ca50a121f61b9350e678fea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32203 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 diff --git a/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_tasks.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_tasks.cpython-312.pyc deleted file mode 100644 index 259f3617adec05ae484a35d3d4a9b8d25ba958fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7009 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 diff --git a/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_tempfile.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_tempfile.cpython-312.pyc deleted file mode 100644 index cab5d146c1fa6af52ef8360f2233a2144d4dca13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28156 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 A(f|Me diff --git a/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_testing.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_testing.cpython-312.pyc deleted file mode 100644 index bda978b428eca9eff4031b2842784940124c4efd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3584 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 a_$vaS^&^_5=UYQ*`UZVGl%Ugs+kXKY>qOiD diff --git a/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_typedattr.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_typedattr.cpython-312.pyc deleted file mode 100644 index a1725c80805645560fb55ad53d589971e3bd69a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3854 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 diff --git a/venv/lib/python3.12/site-packages/anyio/_core/_asyncio_selector_thread.py b/venv/lib/python3.12/site-packages/anyio/_core/_asyncio_selector_thread.py deleted file mode 100644 index 9f35bae..0000000 --- a/venv/lib/python3.12/site-packages/anyio/_core/_asyncio_selector_thread.py +++ /dev/null @@ -1,167 +0,0 @@ -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.12/site-packages/anyio/_core/_eventloop.py b/venv/lib/python3.12/site-packages/anyio/_core/_eventloop.py deleted file mode 100644 index 6dcb458..0000000 --- a/venv/lib/python3.12/site-packages/anyio/_core/_eventloop.py +++ /dev/null @@ -1,166 +0,0 @@ -from __future__ import annotations - -import math -import sys -import threading -from collections.abc import Awaitable, Callable, Generator -from contextlib import contextmanager -from importlib import import_module -from typing import TYPE_CHECKING, Any, TypeVar - -import sniffio - -if sys.version_info >= (3, 11): - from typing import TypeVarTuple, Unpack -else: - from typing_extensions import TypeVarTuple, Unpack - -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 <backend options>`) - :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 - - """ - try: - asynclib_name = sniffio.current_async_library() - except sniffio.AsyncLibraryNotFoundError: - pass - else: - 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 sniffio.current_async_library_cvar.get(None) is None: - # Since we're in control of the event loop, we can cache the name of the async - # library - token = sniffio.current_async_library_cvar.set(backend) - - try: - backend_options = backend_options or {} - return async_backend.run(func, args, {}, backend_options) - finally: - if token: - sniffio.current_async_library_cvar.reset(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) - - """ - 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_cancelled_exc_class() -> type[BaseException]: - """Return the current async library's cancellation exception class.""" - return get_async_backend().cancelled_exception_class() - - -# -# Private API -# - - -@contextmanager -def claim_worker_thread( - backend_class: type[AsyncBackend], token: object -) -> Generator[Any, None, None]: - threadlocals.current_async_backend = backend_class - threadlocals.current_token = token - try: - yield - finally: - del threadlocals.current_async_backend - del threadlocals.current_token - - -def get_async_backend(asynclib_name: str | None = None) -> type[AsyncBackend]: - if asynclib_name is None: - asynclib_name = sniffio.current_async_library() - - # 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 diff --git a/venv/lib/python3.12/site-packages/anyio/_core/_exceptions.py b/venv/lib/python3.12/site-packages/anyio/_core/_exceptions.py deleted file mode 100644 index 16b9448..0000000 --- a/venv/lib/python3.12/site-packages/anyio/_core/_exceptions.py +++ /dev/null @@ -1,126 +0,0 @@ -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 BrokenWorkerIntepreter(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 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.""" - - -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 diff --git a/venv/lib/python3.12/site-packages/anyio/_core/_fileio.py b/venv/lib/python3.12/site-packages/anyio/_core/_fileio.py deleted file mode 100644 index a0d6198..0000000 --- a/venv/lib/python3.12/site-packages/anyio/_core/_fileio.py +++ /dev/null @@ -1,742 +0,0 @@ -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__() - - 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, - dirs_exist_ok: bool = False, - preserve_metadata: bool = False, - ) -> Path: - func = partial( - self._path.copy, - follow_symlinks=follow_symlinks, - dirs_exist_ok=dirs_exist_ok, - preserve_metadata=preserve_metadata, - ) - return Path(await to_thread.run_sync(func, target)) - - async def copy_into( - self, - target_dir: str | os.PathLike[str], - *, - follow_symlinks: bool = True, - dirs_exist_ok: bool = False, - preserve_metadata: bool = False, - ) -> Path: - func = partial( - self._path.copy_into, - follow_symlinks=follow_symlinks, - dirs_exist_ok=dirs_exist_ok, - preserve_metadata=preserve_metadata, - ) - return Path(await to_thread.run_sync(func, 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) - ) - - def glob(self, pattern: str) -> AsyncIterator[Path]: - gen = self._path.glob(pattern) - 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 - ) - - 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: - return Path(self._path.relative_to(*other, 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)) - - def rglob(self, pattern: str) -> AsyncIterator[Path]: - gen = self._path.rglob(pattern) - 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: - # Path.write_text() does not support the "newline" parameter before Python 3.10 - def sync_write_text() -> int: - with self._path.open( - "w", encoding=encoding, errors=errors, newline=newline - ) as fp: - return fp.write(data) - - return await to_thread.run_sync(sync_write_text) - - -PathLike.register(Path) diff --git a/venv/lib/python3.12/site-packages/anyio/_core/_resources.py b/venv/lib/python3.12/site-packages/anyio/_core/_resources.py deleted file mode 100644 index b9a5344..0000000 --- a/venv/lib/python3.12/site-packages/anyio/_core/_resources.py +++ /dev/null @@ -1,18 +0,0 @@ -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.12/site-packages/anyio/_core/_signals.py b/venv/lib/python3.12/site-packages/anyio/_core/_signals.py deleted file mode 100644 index f3451d3..0000000 --- a/venv/lib/python3.12/site-packages/anyio/_core/_signals.py +++ /dev/null @@ -1,27 +0,0 @@ -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 - - .. 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.12/site-packages/anyio/_core/_sockets.py b/venv/lib/python3.12/site-packages/anyio/_core/_sockets.py deleted file mode 100644 index 054bcdd..0000000 --- a/venv/lib/python3.12/site-packages/anyio/_core/_sockets.py +++ /dev/null @@ -1,792 +0,0 @@ -from __future__ import annotations - -import errno -import os -import socket -import ssl -import stat -import sys -from collections.abc import Awaitable -from ipaddress import IPv6Address, ip_address -from os import PathLike, chmod -from socket import AddressFamily, SocketKind -from typing import TYPE_CHECKING, Any, Literal, cast, overload - -from .. import to_thread -from ..abc import ( - ConnectedUDPSocket, - ConnectedUNIXDatagramSocket, - IPAddressType, - IPSockAddrType, - SocketListener, - SocketStream, - UDPSocket, - UNIXDatagramSocket, - UNIXSocketStream, -) -from ..streams.stapled import MultiListener -from ..streams.tls import 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, 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 OSError: if the connection attempt 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, *rest, 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 i, (af, addr) in enumerate(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 - - """ - 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 list of listener objects - - """ - asynclib = get_async_backend() - backlog = min(backlog, 65536) - local_host = str(local_host) if local_host is not None else None - gai_res = await getaddrinfo( - local_host, - local_port, - family=family, - type=socket.SocketKind.SOCK_STREAM if sys.platform == "win32" else 0, - flags=socket.AI_PASSIVE | socket.AI_ADDRCONFIG, - ) - listeners: list[SocketListener] = [] - try: - # The set() is here to work around a glibc bug: - # https://sourceware.org/bugzilla/show_bug.cgi?id=14969 - sockaddr: tuple[str, int] | tuple[str, int, int, int] - for fam, kind, *_, sockaddr in sorted(set(gai_res)): - # Workaround for an 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 - if sys.platform != "win32" and kind is not SocketKind.SOCK_STREAM: - continue - - raw_socket = socket.socket(fam) - raw_socket.setblocking(False) - - # For Windows, enable exclusive address use. For others, enable address - # reuse. - if sys.platform == "win32": - raw_socket.setsockopt(socket.SOL_SOCKET, socket.SO_EXCLUSIVEADDRUSE, 1) - else: - raw_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - - if reuse_port: - raw_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) - - # If only IPv6 was requested, disable dual stack operation - if fam == socket.AF_INET6: - raw_socket.setsockopt(IPPROTO_IPV6, socket.IPV6_V6ONLY, 1) - - # Workaround for #554 - if "%" in sockaddr[0]: - addr, scope_id = sockaddr[0].split("%", 1) - sockaddr = (addr, sockaddr[1], 0, int(scope_id)) - - raw_socket.bind(sockaddr) - raw_socket.listen(backlog) - listener = asynclib.create_tcp_listener(raw_socket) - listeners.append(listener) - except BaseException: - for listener in listeners: - await listener.aclose() - - raise - - return MultiListener(listeners) - - -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) - - .. 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 - - """ - 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 - - """ - 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 - - """ - 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 - - .. 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) - - -# -# 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 diff --git a/venv/lib/python3.12/site-packages/anyio/_core/_streams.py b/venv/lib/python3.12/site-packages/anyio/_core/_streams.py deleted file mode 100644 index 6a9814e..0000000 --- a/venv/lib/python3.12/site-packages/anyio/_core/_streams.py +++ /dev/null @@ -1,52 +0,0 @@ -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.12/site-packages/anyio/_core/_subprocesses.py b/venv/lib/python3.12/site-packages/anyio/_core/_subprocesses.py deleted file mode 100644 index 36d9b30..0000000 --- a/venv/lib/python3.12/site-packages/anyio/_core/_subprocesses.py +++ /dev/null @@ -1,202 +0,0 @@ -from __future__ import annotations - -import sys -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, Union, cast - -from ..abc import Process -from ._eventloop import get_async_backend -from ._tasks import create_task_group - -if sys.version_info >= (3, 10): - from typing import TypeAlias -else: - from typing_extensions import TypeAlias - -StrOrBytesPath: TypeAlias = Union[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.12/site-packages/anyio/_core/_synchronization.py b/venv/lib/python3.12/site-packages/anyio/_core/_synchronization.py deleted file mode 100644 index a633132..0000000 --- a/venv/lib/python3.12/site-packages/anyio/_core/_synchronization.py +++ /dev/null @@ -1,732 +0,0 @@ -from __future__ import annotations - -import math -from collections import deque -from dataclasses import dataclass -from types import TracebackType - -from sniffio import AsyncLibraryNotFoundError - -from ..lowlevel import checkpoint -from ._eventloop import get_async_backend -from ._exceptions import BusyResourceError -from ._tasks import CancelScope -from ._testing import TaskInfo, get_current_task - - -@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 AsyncLibraryNotFoundError: - 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 AsyncLibraryNotFoundError: - 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() - event = Event() - self._waiters.append(event) - self.release() - try: - await event.wait() - except BaseException: - if not event.is_set(): - self._waiters.remove(event) - - raise - finally: - with CancelScope(shield=True): - await self.acquire() - - 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 AsyncLibraryNotFoundError: - 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 AsyncLibraryNotFoundError: - 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, - ) -> bool | 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. - - """ - 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, - ) -> bool | 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.12/site-packages/anyio/_core/_tasks.py b/venv/lib/python3.12/site-packages/anyio/_core/_tasks.py deleted file mode 100644 index fe49015..0000000 --- a/venv/lib/python3.12/site-packages/anyio/_core/_tasks.py +++ /dev/null @@ -1,158 +0,0 @@ -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 - """ - - 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) -> None: - """Cancel this scope immediately.""" - 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`\\] - - """ - 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 - - """ - 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 - - """ - return get_async_backend().current_effective_deadline() - - -def create_task_group() -> TaskGroup: - """ - Create a task group. - - :return: a task group - - """ - return get_async_backend().create_task_group() diff --git a/venv/lib/python3.12/site-packages/anyio/_core/_tempfile.py b/venv/lib/python3.12/site-packages/anyio/_core/_tempfile.py deleted file mode 100644 index 26d70ec..0000000 --- a/venv/lib/python3.12/site-packages/anyio/_core/_tempfile.py +++ /dev/null @@ -1,616 +0,0 @@ -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 - (Python 3.10+). - :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, - } - if sys.version_info >= (3, 10): - params["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.12/site-packages/anyio/_core/_testing.py b/venv/lib/python3.12/site-packages/anyio/_core/_testing.py deleted file mode 100644 index 9e28b22..0000000 --- a/venv/lib/python3.12/site-packages/anyio/_core/_testing.py +++ /dev/null @@ -1,78 +0,0 @@ -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 - - """ - 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 - - """ - 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.12/site-packages/anyio/_core/_typedattr.py b/venv/lib/python3.12/site-packages/anyio/_core/_typedattr.py deleted file mode 100644 index f358a44..0000000 --- a/venv/lib/python3.12/site-packages/anyio/_core/_typedattr.py +++ /dev/null @@ -1,81 +0,0 @@ -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.12/site-packages/anyio/abc/__init__.py b/venv/lib/python3.12/site-packages/anyio/abc/__init__.py deleted file mode 100644 index 3d3b61c..0000000 --- a/venv/lib/python3.12/site-packages/anyio/abc/__init__.py +++ /dev/null @@ -1,55 +0,0 @@ -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 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 Listener as Listener -from ._streams import ObjectReceiveStream as ObjectReceiveStream -from ._streams import ObjectSendStream as ObjectSendStream -from ._streams import ObjectStream as ObjectStream -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.12/site-packages/anyio/abc/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 2d777b5b670c5a772c74505e1824724021f397ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2244 zcmZvd&u<e)6vt<i*z4bR636-J{KO#+u@^#$Qc6)1QXmq7h=i(|Qf=4XAzs)Y*6cXQ z^wJ{-E~p23s(P)s^nd8Frz%2iSMsUqA(sk@s!E*t-q_9$AX2{h%=gWEJ3I4s@=G!q zBk=S0_g~lU0{w}D?oYT4%ImLs2zf?KVk$Oq6sjo1>@j=o9;cV~O764!oDdC34%uNx zrK;pGaD+xAtH4njl^g+%(U{~YaGb^^$AA+wAvq45q)EvM;1o?sP6DTCT5<|FLo<@o z!2Pseat3&S4oL2|2c0a<N*(|nqC=7gfpat`ISV{Yhb0dIkI)gxIp9$`DtQ=qjE+ej z0UoF0l1G6j=!E1k;5^Ms9tWPJlaeQZr|6XAJn%G~mOKeOLuVvU0ngG|$<x4dbWZY& zeab1&g5+6y-Z@QAOP&K>pbL^u*+plOE&><KdHamBM3<ZrEjeXcb~LIvXX#lPJ8hqH zmg%zO1^c|SLRS>hL)ZuKd*ONK-0yqc1~~fLjXhV|-Uj({ju5&Ec^|S>vuG|p?`=o! zH;%HpWS;5f`O1?#`-rXTm%6bhg+B7dYICVrIzX$a1aZT4Jz)sTbNvH+9(aj0zv))j zjp_sDnlMhv@onaN4PIqn3|#SCmsJHb?`&*sdoWLcJAUNe-28mQ5XLSyoWpQ(b8F2s zIrIIUW*w`fHf1iF9VgwMye0&<Dh(kgwXGYLFPO_Xq$S$Uw&2WgV4Q?CY~fl(r%Lqr zqH=eRt>whDf#Z?GRc6qA>j~L4x4GUF>^7@1YmXg1xxeFY!!{k7$*$R5-y|4!T+VFE zsMzd%b;jSBaiZezyWwu_{`Zwjp?RW0Ogi19$g#~Fyj8gm2l@7!W!m<MB8iUIEt5Zb zsrMHddwar(a=CY+-NNb?_o~n)aJJDM!+&s%dyP5_VmR1_UTt6~w!?gJy8(U358%cm z#ZZvGV$_YQC7L%Z#}bSOQRqn1!rl%-pYAbN1bsK4TZ8B}bBub;<Je*GD~4NT_IA~4 zcjdYbQ!ICP%j3eZgP5*6p4qUOt_S2%%y65QS2ilu^3CGM7`)dI4Guw$pClLzpJRJo zorl^6biDj-e2!Oq5Yc`4!T4N-A&;O$QSe^_kE0||k|-&ZG)e}gA7uaptH|y0`5<~( zlp&NH$}q|Z$|%Yh$~ejdN*-krWeQ~)Wd>yyBuMIhqf&350P{IqJR}I~0=C}gr*KvQ zoro@A`(c;(JPvbu6*jZ1<GoSio@+glHws_Cgd)l!${Ca;kRZ`XXxA;F6~D(lM;A5t ztW91<r_YA3J_y5k7`7jT_YAwi{6N)pNrAe{pcw=YV!klA@E=;D1`E?&!@={=pu~^l zH7I#wX*JJbnqvrmPuuXS4F?X%*95Z}-ccoZ6}Uin$@Ct&wr7}(YjBKvnr&6IdQ;Rq z_k8)>vgSiqm7v8Q7`x2ZWGiUU3YxB4t|fH6TyMUKTxz$=WquW&j5n(PGsw$cMNwL0 z_Aj#1A{ScZa*J%WI=m{KWjS1Gk*hL#u|?Kf<dQT$lasH@A>@`@WU)m)X%UzMSvxIq zQ)ZQ<4;9M)MZ!wYzXT;k6iB)FDoirjr&qtd{_NJ%Tl?9<etP~N(xc3ObL|f`_4wg; pi61KaYVkL9<yUp(r@JrI_22V_$Lfp7*vk;idKDp|1mA%7_#fhYhTQ-F diff --git a/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_eventloop.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_eventloop.cpython-312.pyc deleted file mode 100644 index c65e60f623eb60f2a5098e13c4e0dc71ada2cb24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14993 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 diff --git a/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_resources.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_resources.cpython-312.pyc deleted file mode 100644 index 4a187a65ad3bb597c172b2e11966711d0db84273..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1651 zcmZux&2Jk;6rb5IukCy^wIPsJ?J5#QmKv{s15$+$Y4{KVawri<i_m7gJBf|=!_2Ic zIPD=c5h?<STf>Qa6!<$haN`16DH4c7;euR@5ah&rv$l!_V|n)X=Dm6I-tWDcZ)ayK z1jcV)-fqw9g#3)cWS9k@qfG$EBqSk?NK8FS5o?ha>z*DPo}pwtGGoiL6gHw#Y<o5( z8sT<mp3=gTSJudDB(#o5SmOFu_9>i*!>bI+jmobG8#J%7BuO)tb<#vOw7j%>bL}mj zv3!oTWF}aU#XM`LAz03CfXG`c=xz*p92QFWeTRvhZUpFUGREi7(W|g>OgQmqNIWg1 zo*rtR5tc&z$neZEnf`@#Xu!I~OJO-QkBrl?KhGXmjY>YdDhEk$i_5ex0>1xE#euOp z4$^5c$(<l#QaW3ya99+9luFK85qB8wY>PBW`_d6(53*TNF5XQ=SAvPdl4-*rO)|ch zIWbGvHW$uryA!lwd)60;bh0*gI*H6!5&*~~kG7mNaX9P|*Og<IgiZi~NaqG}cw>{P zh&GkkUMFiRs}mB8>!s4wU_K;-j^+ToK`8KdhrCU`)_3U%T^ChYJ)yaQ$4T7hoOj)J z8gn;hncQ(-PJ@07F-SM#5#JUpUXfWR=yI_Vrn^a$vXBdRhbKF3)M>fB0n|2muKCQf zuIyxdr3b}@T&2sBK__)tD{%cseDwx-#rK&?(f9YCm?}u~k){rDNsROt^49_RVZL^+ z`nNPdzN?!wKrk8DDJt8S08Fy|;NN_VEhoKj2zTK&?7FWV>mQpY@G~IKlg~`#N6dmT zw53(>+%UvEEaW!d3;YZ^H7_CBVNq_WrIv~byGUF>!!l+7b%E3t|C^dpEP|cHNo6*i zA@jA*yPtGFjlZ`qeP>@fmouQdTfai@)62%Ob%p+aZPBX8c0e)mhPGc@!){ewH6grN zlv`jY6tz}yiW<oK_2~$Ul&_+t1rvn#5gBu?8FYQjg|I=FTSW^ip<xTG*8UO_^xjRl zM6c`xyoayB`_3I_Jx#cH3=Qg2x{2y>rJ8ydCaNd#C<7fdG=YLxf~ir?ZQoB=%zYo5 zDNe(Fgm}jHKkTz;tSR|^m<F&6HIY%8N#7R>=mWVI_);ns)O8qvL<(l`aTPe>U*3Z0 zh&<Fx(;m)|h1$XEBZHdtp=Ftuf4q2oXu@}Bk&D-cB}6t^cxqTiR3VkQQ5DezV%2}w zsJT4S0X;+{9B``+fmSQS#Rlr()md*;F`unIybh3$z|PKfxIhB?U4@*RNU{`Ipxgr7 zNw!4^wOAJAQYBQJfGv4$zfchLqPPYk-V2Ffs8dSM$npd7^clH&MwWgus`u6o-#nmy QSc`P|i|s!Ne3YMm0K0*v)c^nh diff --git a/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_sockets.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_sockets.cpython-312.pyc deleted file mode 100644 index fd6a9a54e1f7cf37f445a846dbdd9cfd4fabfe2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9899 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 L`6KqnH2i-7W>IS4 diff --git a/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_streams.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_streams.cpython-312.pyc deleted file mode 100644 index 63dd2a98931ba04d5bdafdf70a65369a3fc70e32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8455 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 H(m($%ec_u- diff --git a/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_subprocesses.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_subprocesses.cpython-312.pyc deleted file mode 100644 index bff82304c1a5dd733bbc531ed1eb6d732d9d0065..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3259 zcmcIn-ESL35Z|@W-ydz7RzQWSRYgTDnzLF|fh+_~)ha|SX_OQd`GNEKZj+pPA7*!* zV8ctH5Bvvx<GreQ<G<jEH#n&R2`bSSWNMJ0Pt4remvfqaM2LGB&(6&5%=~tCcKuzg zRwnTM{`F^D^F=~_!NK&)#S9&{fw@C$VpErRv`s1U88_o)+u4ZEx|)}3=YZGjoSXLw z?Lx%o-J(}&m%MVjOi6|;5xa1k*hOBrmyOqMR|cg<`5_J(G_07uA1G5ffiGcLH@i{^ z(^4K+TY(Ld!n(8Ro34CF;|aAzIq<DDE`z?Xcq0?eT^uOB#x3q_^K~V->4kL^t#jXw z$5!k(rds?%$G-w|hj7xSHfd*U+Rk##uG*Q~+P#T=I|q`QolQydkwi;L3LvT5xs;^H zOVLXCU0JeXIno^hOcF1Nt`g}E+r@o!)krsIm-f-sCc5%Iy858fI1(0CMPP9$hvyf4 zW+HxDBJhL0WZPUwfSv^#tYx{Tl&y~JcYCq9z8dtn-_b3Ee)?sA`H~Pit^#v~P{43N zzsc^<MrQbNnN7YMrlVNjSB}fn7H5+M8UNH#QZFZFEx}b^_^rqYmCOokj?tuMCDto< z$z2+1lDiucLt>Bp=2qbGre`X--Mkc7eUJM}HWhdIrZBw)sT}Jj7YlZ<<GX=rbJ5)9 z{&v%Ky3O7ID$IXVKYOkz9mN-VrghWY<g#h{11D&jU8`yAV!@@}8-&^p<Tb2L;M8$c zgFs{+$ZzEDTjU>!_4P$Yqcfm^j6nI*F=`Po0BfA&b)5^(@lC~LI_)zIQn2_&-*pGf z*<iguN~i1c6nxiwcEj-@Ie7+VI+9tY>q^$?Br8rLJ>BSZ^u!-bTfMfv{1KA_skk?t zEaAZ5<n`sH>zCI)=yaG0(gCF$>pGL1!>J5fE!M)b`efbcYMNFj@w_4sE>Q;(@1Qsg zY*<Q6hjUYG6VWlS7-QAlB4eQBxxjv(xVz#Y9H~-DrSQLDcV+qN)&Gp$O^E!tuxV(u zTa7qk0FXF}1Yxrfw)D5R2ER?9!fwe-CZlFM-T2+|PXYHrdylnb#EW%O$GvC5shl{8 z5B<cU-}ky)u+v=M)LF|ml?eqE#iBzwzW?EBr;&sj7f~Z44nb;RJ~oq>Dr0dyRZ{MU z^V5n-3Eu$Y6in&<hH&kL>BRL^4_m&pr$6aWsp@Rcv4@qZcNm;MnAe>oV{{*P%KiGI z&X#BTCEGG3gG-eSxMImMvL`KK2dX4lxXa<ZuLM3%w}+>sQ;s9R20c77&1zTHI#_aN zF(<g{;ksrUfrt*NRHkp6!e)-&>#G+;IVY9v_`}*XqG)*WV8NVwRxm+dy?8Wva1RrP z^;9@8UOHGjZ$B#@E(G9p;HY5QOjIzwIuq3jyruH-eui1cS8%{ifkCKYeKa)j3R>g) zFcOQ`ft#2N%V5qvXOUq%Yj|w-3ARW3@)K{isllPJXc)ffal;79hT#Qv-$lM^7@zb_ zccLj6h8<XjA@DvGb4ccqyoBU9kg(Vj@OTkwAYMh;2_y{3NhGf!iLN4SlTp(U737fM z>sUSja-009z4vo&{!u2EtB$iIe{_W0s1DqtOfiuGH#+)MSs}3lZghm?>p$R<G`A2f ziKIT#U^vQ8b=qXgL<hrBb*iJe3v_nk1-d(v<`(y87iY9fDeWKNbcse6MU?kSql%Dk z^x;VckPGO7B+SA)C`LKie=ri0=eHCEG%6bLNtOcsPY_W;62UnO@#Eq<@qWH5&VmVc oU5Ps}%2G=2lamj~iTmXE19Ivo^46dE%aktBue`rV#6)5K3r&14fB*mh diff --git a/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_tasks.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_tasks.cpython-312.pyc deleted file mode 100644 index 96a6348d285af3dc14a8694d0e33eb299ec67b83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4535 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 diff --git a/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_testing.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_testing.cpython-312.pyc deleted file mode 100644 index 8aaaf8de459ef267d25ed24dc5084d7f22caff20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2854 zcmd5;&2QX96d!xnySCSxex)sqD6uMNwUF)#DglZrL|dw=NaO$!LXIM9)}Cxk{ISe< zlWgdrh#dL{Ae9pbZdLhDxWT2egi^$b3)(h_Lr=Un_HNc`sCvY^dh`6=o98#b_h#Pw z+-#Zzp1*$hdi{KzkU#Kc{Af9&>~8~epZLUALJ}#Cq9Ct^s-wbK2`f?6sYaTkNqIG_ zMRlhh>5d*5juDxTDdk$&h%Cp7nod(8Dq&5(_E5>c;LNDx7V+!5#MfE%C*xtIkRKbW zE%Q%&X(?HQ#&MF;G)Q8x)Kathwd*%NVJXdKXji11dTGSc^~7&gvzcpR7<;!^%s5RG zp6NGe7}9RYGUG<VlR+B9EYokNpavoMs$7eQS$%ofXP;A^sqV6uN08GZ9A*DIc)w2= zaTK4x;uWXj>%O`R%V(NF%0J)mE4$T)g&(I@w(w2AI;E{2(l&f;N~<5zT7GRxYYgkH zW@aukk$yUeVaYq(wBflKd$cbGAx)XEsm(zb#66pBvN*NFB<Z*9o12UeZ4bb)BkD6d zT?cS_>o5kwPP$(*FSWM<&<+GDne;1Y#HPJSp;x3*E*E*gOxdqVyzY?C$OC2R0Vc63 zShyz8z<w5V){}^JBASZL&PRzih#)f2Nm<BxoJN;L8h9IwU-px&I7}cu-htRRJ7Li6 z^oNk@_)7cjcRC_S+2ua<HfWED4vmLF(xF|i<HEWj(Y<zmm>I4Mz8QDjo!JAR+7sys z2uMKvle^^6u~YXN`@j;figfCcYeM0DG9>&sFdQegs{AAjna;L7H-#F?>d0-<Fsn&X zSKuVf2|pzb;k(;G3c;Kz2P1{EU{b^~vdGyvei{T`QG>wd&vYzGOQi%bm6^cLKpof= z{<sV5-gq0>Yr%Fp;H+&<3>W(pkRB`CwL$DHVxq?q8zs2o4$s)wqP!;-?F}~EO1N*s zTb@2UP4a>|$_o@zx_;n_GYBVM#84rJa;w_IfQ3HRDb5E72P_vc-(KTMB*ll;HF3Bk z)A68^r^70iD_51(@`wfE2ngkgn1xN@N^by?TiEZ+PbK9jgIB@Dz6#_U@>03k*_%XI zO3eQ?9f*9Mnj!(o+KX!<$DJcCWqcb5-x$_2hhQz_Z^A5YBYBxR-}&)qEK}I)lVW|o zz)?L_-6iXZ!(ubMTxpkFl<PW&qg9llG5I!s?KyyS1PBdEC&5_wehC`vd9^$*d<HZv zou7qaXAX~?mFrZno7*1i<8EEG@7PNTw1QXAV78<itIkd4iuN*ePu7Ja6g%M9;366{ zx=9iil2(nMN7==3H(hDB+Y5HN*RHtBAc}{pt8%%|X8gcQSD-)VQZBt(<JJq-tN-D4 z(x_L!o1DC0gLUqfUxGlSFKz(`E?&pTE|nuY%Eduw2R^bYg4HrJ-F0K=Zmye|t{Wx( zAVl7B-LD2TEHri3^%Ku^IiAxT??`+O$vlz^NZvq#jX_qlJZWUYBx!(L`~qZ`JW(r} zzHchp?5IX+vm;g0<{qD17-=wq<mAOs9XXwxcxz-JXA<-D(*|(+m9hP3Msf|!dVJ>U zNP`h(o|qrik<*EJ=BWW(VUM!87u#D$+v}S3=-h{+3XUItA;-r?^Qi{!()SY;xO};? zG?mPN%NX@SDn#ozqPaG})&sEN0i0=Avm&cNpXS&bC63uKF9}1qbKniHjVio9aBRz5 zM`8fUYA_Z01IK$SM>J&x<N%jJf2Lo}bNB(j0(N-m5DP#?6-7~gBNzT4)*iXEM{fU0 eZts!#-!<#r^0%vZ)xT@+D%SV!{X<}oYx);MZ1w>F diff --git a/venv/lib/python3.12/site-packages/anyio/abc/_eventloop.py b/venv/lib/python3.12/site-packages/anyio/abc/_eventloop.py deleted file mode 100644 index 4cfce83..0000000 --- a/venv/lib/python3.12/site-packages/anyio/abc/_eventloop.py +++ /dev/null @@ -1,376 +0,0 @@ -from __future__ import annotations - -import math -import sys -from abc import ABCMeta, abstractmethod -from collections.abc import AsyncIterator, Awaitable, Callable, Sequence -from contextlib import AbstractContextManager -from os import PathLike -from signal import Signals -from socket import AddressFamily, SocketKind, socket -from typing import ( - IO, - TYPE_CHECKING, - Any, - TypeVar, - Union, - overload, -) - -if sys.version_info >= (3, 11): - from typing import TypeVarTuple, Unpack -else: - from typing_extensions import TypeVarTuple, Unpack - -if sys.version_info >= (3, 10): - from typing import TypeAlias -else: - from typing_extensions import TypeAlias - -if TYPE_CHECKING: - from _typeshed import HasFileno - - from .._core._synchronization import CapacityLimiter, Event, Lock, Semaphore - from .._core._tasks import CancelScope - from .._core._testing import TaskInfo - from ..from_thread import BlockingPortal - 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 = Union[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: - """ - - @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 - def create_blocking_portal(cls) -> BlockingPortal: - 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: HasFileno | int) -> None: - pass - - @classmethod - @abstractmethod - async def wait_writable(cls, obj: HasFileno | int) -> None: - 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.12/site-packages/anyio/abc/_resources.py b/venv/lib/python3.12/site-packages/anyio/abc/_resources.py deleted file mode 100644 index 10df115..0000000 --- a/venv/lib/python3.12/site-packages/anyio/abc/_resources.py +++ /dev/null @@ -1,33 +0,0 @@ -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.12/site-packages/anyio/abc/_sockets.py b/venv/lib/python3.12/site-packages/anyio/abc/_sockets.py deleted file mode 100644 index 1c6a450..0000000 --- a/venv/lib/python3.12/site-packages/anyio/abc/_sockets.py +++ /dev/null @@ -1,194 +0,0 @@ -from __future__ import annotations - -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 types import TracebackType -from typing import Any, TypeVar, Union - -from .._core._typedattr import ( - TypedAttributeProvider, - TypedAttributeSet, - typed_attribute, -) -from ._streams import ByteStream, Listener, UnreliableObjectStream -from ._tasks import TaskGroup - -IPAddressType = Union[str, IPv4Address, IPv6Address] -IPSockAddrType = tuple[str, int] -SockAddrType = Union[IPSockAddrType, str] -UDPPacketType = tuple[bytes, IPSockAddrType] -UNIXDatagramPacketType = tuple[bytes, str] -T_Retval = TypeVar("T_Retval") - - -class _NullAsyncContextManager: - async def __aenter__(self) -> None: - pass - - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> bool | None: - return None - - -class SocketAttribute(TypedAttributeSet): - #: the address family of the underlying socket - family: AddressFamily = typed_attribute() - #: the local socket address of the underlying socket - local_address: SockAddrType = typed_attribute() - #: for IP addresses, the local port the underlying socket is bound to - local_port: int = typed_attribute() - #: the underlying stdlib socket object - raw_socket: socket.socket = typed_attribute() - #: the remote address the underlying socket is connected to - remote_address: SockAddrType = typed_attribute() - #: for IP addresses, the remote port the underlying socket is connected to - 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`. - """ - - -class UNIXSocketStream(SocketStream): - @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`. - """ - - @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`. - """ - - 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`. - """ - - -class UNIXDatagramSocket( - UnreliableObjectStream[UNIXDatagramPacketType], _SocketProvider -): - """ - Represents an unconnected Unix datagram socket. - - Supports all relevant extra attributes from :class:`~SocketAttribute`. - """ - - 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`. - """ diff --git a/venv/lib/python3.12/site-packages/anyio/abc/_streams.py b/venv/lib/python3.12/site-packages/anyio/abc/_streams.py deleted file mode 100644 index f11d97b..0000000 --- a/venv/lib/python3.12/site-packages/anyio/abc/_streams.py +++ /dev/null @@ -1,203 +0,0 @@ -from __future__ import annotations - -from abc import abstractmethod -from collections.abc import Callable -from typing import Any, Generic, TypeVar, Union - -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 - - @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 - - @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 = Union[ - UnreliableObjectReceiveStream[bytes], ByteReceiveStream -] -#: Type alias for all unreliable bytes-oriented send streams. -AnyUnreliableByteSendStream = Union[UnreliableObjectSendStream[bytes], ByteSendStream] -#: Type alias for all unreliable bytes-oriented streams. -AnyUnreliableByteStream = Union[UnreliableObjectStream[bytes], ByteStream] -#: Type alias for all bytes-oriented receive streams. -AnyByteReceiveStream = Union[ObjectReceiveStream[bytes], ByteReceiveStream] -#: Type alias for all bytes-oriented send streams. -AnyByteSendStream = Union[ObjectSendStream[bytes], ByteSendStream] -#: Type alias for all bytes-oriented streams. -AnyByteStream = Union[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) - """ diff --git a/venv/lib/python3.12/site-packages/anyio/abc/_subprocesses.py b/venv/lib/python3.12/site-packages/anyio/abc/_subprocesses.py deleted file mode 100644 index ce0564c..0000000 --- a/venv/lib/python3.12/site-packages/anyio/abc/_subprocesses.py +++ /dev/null @@ -1,79 +0,0 @@ -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.12/site-packages/anyio/abc/_tasks.py b/venv/lib/python3.12/site-packages/anyio/abc/_tasks.py deleted file mode 100644 index f6e5c40..0000000 --- a/venv/lib/python3.12/site-packages/anyio/abc/_tasks.py +++ /dev/null @@ -1,101 +0,0 @@ -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, TypeVar, overload - -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) -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. - - :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 - :return: the value passed to ``task_status.started()`` - :raises RuntimeError: if the task finishes without calling - ``task_status.started()`` - - .. 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 | None: - """Exit the task group context waiting for all tasks to finish.""" diff --git a/venv/lib/python3.12/site-packages/anyio/abc/_testing.py b/venv/lib/python3.12/site-packages/anyio/abc/_testing.py deleted file mode 100644 index 7c50ed7..0000000 --- a/venv/lib/python3.12/site-packages/anyio/abc/_testing.py +++ /dev/null @@ -1,65 +0,0 @@ -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.12/site-packages/anyio/from_thread.py b/venv/lib/python3.12/site-packages/anyio/from_thread.py deleted file mode 100644 index 6179097..0000000 --- a/venv/lib/python3.12/site-packages/anyio/from_thread.py +++ /dev/null @@ -1,527 +0,0 @@ -from __future__ import annotations - -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 inspect import isawaitable -from threading import Lock, Thread, get_ident -from types import TracebackType -from typing import ( - Any, - Generic, - TypeVar, - cast, - overload, -) - -from ._core import _eventloop -from ._core._eventloop import get_async_backend, get_cancelled_exc_class, threadlocals -from ._core._synchronization import Event -from ._core._tasks import CancelScope, create_task_group -from .abc import AsyncBackend -from .abc._tasks import TaskStatus - -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 run( - func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], *args: Unpack[PosArgsT] -) -> T_Retval: - """ - Call a coroutine function from a worker thread. - - :param func: a coroutine function - :param args: positional arguments for the callable - :return: the return value of the coroutine function - - """ - try: - async_backend = threadlocals.current_async_backend - token = threadlocals.current_token - except AttributeError: - raise RuntimeError( - "This function can only be run from an AnyIO worker thread" - ) from None - - return async_backend.run_async_from_thread(func, args, token=token) - - -def run_sync( - func: Callable[[Unpack[PosArgsT]], T_Retval], *args: Unpack[PosArgsT] -) -> 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 - :return: the return value of the callable - - """ - try: - async_backend = threadlocals.current_async_backend - token = threadlocals.current_token - except AttributeError: - raise RuntimeError( - "This function can only be run from an AnyIO worker thread" - ) from None - - return async_backend.run_sync_from_thread(func, args, token=token) - - -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.""" - - def __new__(cls) -> BlockingPortal: - return get_async_backend().create_blocking_portal() - - def __init__(self) -> None: - self._event_loop_thread_id: int | None = get_ident() - self._stop_event = Event() - self._task_group = create_task_group() - self._cancelled_exc_class = get_cancelled_exc_class() - - 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 | None: - 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() - - 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() and self._event_loop_thread_id not in ( - None, - get_ident(), - ): - self.call(scope.cancel) - - try: - retval_or_awaitable = func(*args, **kwargs) - if isawaitable(retval_or_awaitable): - with CancelScope() as scope: - if future.cancelled(): - scope.cancel() - else: - future.add_done_callback(callback) - - retval = await retval_or_awaitable - else: - retval = retval_or_awaitable - except self._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. - - Implementers must ensure that the future is resolved when the task finishes. - - :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 - - """ - raise NotImplementedError - - @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 -) -> 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 - :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_: - future.set_result(portal_) - await portal_.sleep_until_stopped() - - def run_blocking_portal() -> None: - if future.set_running_or_notify_cancel(): - try: - _eventloop.run( - 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) - 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: - async_backend: AsyncBackend = threadlocals.current_async_backend - except AttributeError: - raise RuntimeError( - "This function can only be run from an AnyIO worker thread" - ) from None - - async_backend.check_cancelled() diff --git a/venv/lib/python3.12/site-packages/anyio/lowlevel.py b/venv/lib/python3.12/site-packages/anyio/lowlevel.py deleted file mode 100644 index 14c7668..0000000 --- a/venv/lib/python3.12/site-packages/anyio/lowlevel.py +++ /dev/null @@ -1,161 +0,0 @@ -from __future__ import annotations - -import enum -from dataclasses import dataclass -from typing import Any, Generic, Literal, TypeVar, overload -from weakref import WeakKeyDictionary - -from ._core._eventloop import get_async_backend - -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() - - -def current_token() -> object: - """ - Return a backend specific token object that can be used to get back to the event - loop. - - """ - return get_async_backend().current_token() - - -_run_vars: WeakKeyDictionary[Any, dict[str, Any]] = WeakKeyDictionary() -_token_wrappers: dict[Any, _TokenWrapper] = {} - - -@dataclass(frozen=True) -class _TokenWrapper: - __slots__ = "_token", "__weakref__" - _token: object - - -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 - - -class RunVar(Generic[T]): - """ - Like a :class:`~contextvars.ContextVar`, except scoped to the running event loop. - """ - - __slots__ = "_name", "_default" - - NO_VALUE_SET: Literal[_NoValueSet.NO_VALUE_SET] = _NoValueSet.NO_VALUE_SET - - _token_wrappers: set[_TokenWrapper] = 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[str, T]: - token = current_token() - try: - return _run_vars[token] - except KeyError: - run_vars = _run_vars[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._name] - 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._name, RunVar.NO_VALUE_SET)) - current_vars[self._name] = 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._name] - except KeyError: - pass - else: - self._current_vars[self._name] = token._value - - token._redeemed = True - - def __repr__(self) -> str: - return f"<RunVar name={self._name!r}>" diff --git a/venv/lib/python3.12/site-packages/anyio/py.typed b/venv/lib/python3.12/site-packages/anyio/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/anyio/pytest_plugin.py b/venv/lib/python3.12/site-packages/anyio/pytest_plugin.py deleted file mode 100644 index 21e4ab2..0000000 --- a/venv/lib/python3.12/site-packages/anyio/pytest_plugin.py +++ /dev/null @@ -1,272 +0,0 @@ -from __future__ import annotations - -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 -import sniffio -from _pytest.fixtures import SubRequest -from _pytest.outcomes import Exit - -from ._core._eventloop import get_all_backends, get_async_backend -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 sniffio.current_async_library_cvar.get(None) is None: - # Since we're in control of the event loop, we can cache the name of the - # async library - token = sniffio.current_async_library_cvar.set(backend_name) - _runner_stack.callback(sniffio.current_async_library_cvar.reset, 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_configure(config: Any) -> None: - config.addinivalue_line( - "markers", - "anyio: mark the (coroutine function) test to be run asynchronously via anyio.", - ) - - -@pytest.hookimpl(hookwrapper=True) -def pytest_fixture_setup(fixturedef: Any, request: Any) -> Generator[Any]: - def wrapper( - *args: Any, 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: Any, name: Any, obj: Any) -> None: - if collector.istestfunction(obj, name): - inner_func = obj.hypothesis.inner_test if hasattr(obj, "hypothesis") else obj - if iscoroutinefunction(inner_func): - marker = collector.get_closest_marker("anyio") - own_markers = getattr(obj, "pytestmark", ()) - if marker or any(marker.name == "anyio" for marker in own_markers): - pytest.mark.usefixtures("anyio_backend")(obj) - - -@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_all_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.12/site-packages/anyio/streams/__init__.py b/venv/lib/python3.12/site-packages/anyio/streams/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 494c51b9b1681bc63d9c48e9bde70d29fc66b3fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 206 zcmZ9FO$x#=5QP(~AVLq~q8-$&xN_|kLTraNn4glQmEb|#x%Vs{!@VHgb!D>k!Myj) zFz{Y^z9Lbd$E{8IPWG>H9xrzi$eNy>#LnV2rk_bcYZQXw-VJaxRj*Kc2OcFhmaD>f zQC-j$wYh3(c#ReY)B{LyhA#Nl=v}$lf)gH#j#n4npaZUhFyOpJt{gBXwD63TU6_`8 WW$Iqy!7gGujpGu0GfJt=BK-i}XF1aV diff --git a/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/buffered.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/buffered.cpython-312.pyc deleted file mode 100644 index fa006165caf5537e2d8e857fcc57d01f20822a64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6135 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 Nkla!IjnQZD{~wL*rl$Y^ diff --git a/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/file.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/file.cpython-312.pyc deleted file mode 100644 index 754400be35656471b9a6d466bfc6b8b3e76c13b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7547 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 diff --git a/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/memory.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/memory.cpython-312.pyc deleted file mode 100644 index 01cc14fa6e89c0e6dbf0e5bc6d7c68f060425292..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14967 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 diff --git a/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/stapled.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/stapled.cpython-312.pyc deleted file mode 100644 index 4c75bff5e759ed3f48415ddec85e58ea91055bfe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7567 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 diff --git a/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/text.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/text.cpython-312.pyc deleted file mode 100644 index 1ceba3902b3ac8db0d4ee358f538e63df8663737..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8311 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 a*melM_cr`KmTB0MCqOf<2O>~x*Z&6U_N<No diff --git a/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/tls.cpython-312.pyc b/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/tls.cpython-312.pyc deleted file mode 100644 index 11673a252aa0643e488293d772883de33a33dee7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17590 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 MfcGqzB@^&}0YRa$KL7v# diff --git a/venv/lib/python3.12/site-packages/anyio/streams/buffered.py b/venv/lib/python3.12/site-packages/anyio/streams/buffered.py deleted file mode 100644 index f5d5e83..0000000 --- a/venv/lib/python3.12/site-packages/anyio/streams/buffered.py +++ /dev/null @@ -1,119 +0,0 @@ -from __future__ import annotations - -from collections.abc import Callable, Mapping -from dataclasses import dataclass, field -from typing import Any - -from .. import ClosedResourceError, DelimiterNotFound, EndOfStream, IncompleteRead -from ..abc import AnyByteReceiveStream, ByteReceiveStream - - -@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 - - 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) diff --git a/venv/lib/python3.12/site-packages/anyio/streams/file.py b/venv/lib/python3.12/site-packages/anyio/streams/file.py deleted file mode 100644 index f492464..0000000 --- a/venv/lib/python3.12/site-packages/anyio/streams/file.py +++ /dev/null @@ -1,148 +0,0 @@ -from __future__ import annotations - -from collections.abc import Callable, Mapping -from io import SEEK_SET, UnsupportedOperation -from os import PathLike -from pathlib import Path -from typing import Any, BinaryIO, cast - -from .. import ( - BrokenResourceError, - ClosedResourceError, - EndOfStream, - TypedAttributeSet, - to_thread, - typed_attribute, -) -from ..abc import ByteReceiveStream, ByteSendStream - - -class FileStreamAttribute(TypedAttributeSet): - #: the open file descriptor - file: BinaryIO = 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: BinaryIO): - 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(cast(BinaryIO, 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(cast(BinaryIO, 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.12/site-packages/anyio/streams/memory.py b/venv/lib/python3.12/site-packages/anyio/streams/memory.py deleted file mode 100644 index 83bf1d9..0000000 --- a/venv/lib/python3.12/site-packages/anyio/streams/memory.py +++ /dev/null @@ -1,317 +0,0 @@ -from __future__ import annotations - -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, - 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, - source=self, - ) diff --git a/venv/lib/python3.12/site-packages/anyio/streams/stapled.py b/venv/lib/python3.12/site-packages/anyio/streams/stapled.py deleted file mode 100644 index 80f64a2..0000000 --- a/venv/lib/python3.12/site-packages/anyio/streams/stapled.py +++ /dev/null @@ -1,141 +0,0 @@ -from __future__ import annotations - -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.12/site-packages/anyio/streams/text.py b/venv/lib/python3.12/site-packages/anyio/streams/text.py deleted file mode 100644 index f1a1127..0000000 --- a/venv/lib/python3.12/site-packages/anyio/streams/text.py +++ /dev/null @@ -1,147 +0,0 @@ -from __future__ import annotations - -import codecs -from collections.abc import Callable, Mapping -from dataclasses import InitVar, dataclass, field -from typing import Any - -from ..abc import ( - AnyByteReceiveStream, - AnyByteSendStream, - AnyByteStream, - ObjectReceiveStream, - ObjectSendStream, - ObjectStream, -) - - -@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, - } diff --git a/venv/lib/python3.12/site-packages/anyio/streams/tls.py b/venv/lib/python3.12/site-packages/anyio/streams/tls.py deleted file mode 100644 index 70a41cc..0000000 --- a/venv/lib/python3.12/site-packages/anyio/streams/tls.py +++ /dev/null @@ -1,352 +0,0 @@ -from __future__ import annotations - -import logging -import re -import ssl -import sys -from collections.abc import Callable, Mapping -from dataclasses import dataclass -from functools import wraps -from typing import Any, TypeVar - -from .. import ( - BrokenResourceError, - EndOfStream, - aclose_forcefully, - get_cancelled_exc_class, - to_thread, -) -from .._core._typedattr import TypedAttributeSet, typed_attribute -from ..abc import AnyByteStream, ByteStream, Listener, TaskGroup - -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") -_PCTRTT = tuple[tuple[str, str], ...] -_PCTRTTT = 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, - } diff --git a/venv/lib/python3.12/site-packages/anyio/to_interpreter.py b/venv/lib/python3.12/site-packages/anyio/to_interpreter.py deleted file mode 100644 index 8a2e993..0000000 --- a/venv/lib/python3.12/site-packages/anyio/to_interpreter.py +++ /dev/null @@ -1,218 +0,0 @@ -from __future__ import annotations - -import atexit -import os -import pickle -import sys -from collections import deque -from collections.abc import Callable -from textwrap import dedent -from typing import Any, Final, TypeVar - -from . import current_time, to_thread -from ._core._exceptions import BrokenWorkerIntepreter -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 - -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 -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") - - -class Worker: - _run_func = compile( - dedent(""" - import _interpqueues as queues - import _interpreters as interpreters - from pickle import loads, dumps, HIGHEST_PROTOCOL - - item = queues.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: - queues.put(queue_id, (retval, is_exception), FMT_UNPICKLED, UNBOUND) - except interpreters.NotShareableError: - retval = dumps(retval, HIGHEST_PROTOCOL) - queues.put(queue_id, (retval, is_exception), FMT_PICKLED, UNBOUND) - """), - "<string>", - "exec", - ) - - last_used: float = 0 - - _initialized: bool = False - _interpreter_id: int - _queue_id: int - - def initialize(self) -> None: - import _interpqueues as queues - import _interpreters as interpreters - - self._interpreter_id = interpreters.create() - self._queue_id = queues.create(2, FMT_UNPICKLED, UNBOUND) - self._initialized = True - interpreters.set___main___attrs( - self._interpreter_id, - { - "queue_id": self._queue_id, - "FMT_PICKLED": FMT_PICKLED, - "FMT_UNPICKLED": FMT_UNPICKLED, - "UNBOUND": UNBOUND, - }, - ) - - def destroy(self) -> None: - import _interpqueues as queues - import _interpreters as interpreters - - if self._initialized: - interpreters.destroy(self._interpreter_id) - queues.destroy(self._queue_id) - - def _call( - self, - func: Callable[..., T_Retval], - args: tuple[Any], - ) -> tuple[Any, bool]: - import _interpqueues as queues - import _interpreters as interpreters - - if not self._initialized: - self.initialize() - - payload = pickle.dumps((func, args), pickle.HIGHEST_PROTOCOL) - queues.put(self._queue_id, payload, FMT_PICKLED, UNBOUND) - - res: Any - is_exception: bool - if exc_info := interpreters.exec(self._interpreter_id, self._run_func): - raise BrokenWorkerIntepreter(exc_info) - - (res, is_exception), fmt = queues.get(self._queue_id)[:2] - if fmt == FMT_PICKLED: - res = pickle.loads(res) - - return res, is_exception - - async def call( - self, - func: Callable[..., T_Retval], - args: tuple[Any], - limiter: CapacityLimiter, - ) -> T_Retval: - result, is_exception = await to_thread.run_sync( - self._call, - func, - args, - limiter=limiter, - ) - if is_exception: - raise result - - return result - - -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. - - If the ``cancellable`` option is enabled and the task waiting for its completion is - cancelled, the call will still run its course but its return value (or any raised - exception) will be ignored. - - .. warning:: This feature is **experimental**. The upstream interpreter API has not - yet been finalized or thoroughly tested, so don't rely on this for anything - mission critical. - - :param func: a callable - :param args: positional arguments for the callable - :param limiter: capacity limiter to use to limit the total amount of subinterpreters - running (if omitted, the default limiter is used) - :return: the result of the call - :raises BrokenWorkerIntepreter: if there's an internal error in a subinterpreter - - """ - if sys.version_info <= (3, 13): - raise RuntimeError("subinterpreters require at least Python 3.13") - - 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 worker.call(func, args, 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 that is 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.12/site-packages/anyio/to_process.py b/venv/lib/python3.12/site-packages/anyio/to_process.py deleted file mode 100644 index 495de2a..0000000 --- a/venv/lib/python3.12/site-packages/anyio/to_process.py +++ /dev/null @@ -1,258 +0,0 @@ -from __future__ import annotations - -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) - :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.12/site-packages/anyio/to_thread.py b/venv/lib/python3.12/site-packages/anyio/to_thread.py deleted file mode 100644 index 5070516..0000000 --- a/venv/lib/python3.12/site-packages/anyio/to_thread.py +++ /dev/null @@ -1,69 +0,0 @@ -from __future__ import annotations - -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 ``cancellable`` 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) - :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 - - """ - return get_async_backend().current_default_thread_limiter() diff --git a/venv/lib/python3.12/site-packages/attr/__init__.py b/venv/lib/python3.12/site-packages/attr/__init__.py deleted file mode 100644 index 5c6e065..0000000 --- a/venv/lib/python3.12/site-packages/attr/__init__.py +++ /dev/null @@ -1,104 +0,0 @@ -# SPDX-License-Identifier: MIT - -""" -Classes Without Boilerplate -""" - -from functools import partial -from typing import Callable, Literal, Protocol - -from . import converters, exceptions, filters, setters, validators -from ._cmp import cmp_using -from ._config import get_run_validators, set_run_validators -from ._funcs import asdict, assoc, astuple, has, resolve_types -from ._make import ( - NOTHING, - Attribute, - Converter, - Factory, - _Nothing, - attrib, - attrs, - evolve, - fields, - fields_dict, - make_class, - validate, -) -from ._next_gen import define, field, frozen, mutable -from ._version_info import VersionInfo - - -s = attributes = attrs -ib = attr = attrib -dataclass = partial(attrs, auto_attribs=True) # happy Easter ;) - - -class AttrsInstance(Protocol): - pass - - -NothingType = Literal[_Nothing.NOTHING] - -__all__ = [ - "NOTHING", - "Attribute", - "AttrsInstance", - "Converter", - "Factory", - "NothingType", - "asdict", - "assoc", - "astuple", - "attr", - "attrib", - "attributes", - "attrs", - "cmp_using", - "converters", - "define", - "evolve", - "exceptions", - "field", - "fields", - "fields_dict", - "filters", - "frozen", - "get_run_validators", - "has", - "ib", - "make_class", - "mutable", - "resolve_types", - "s", - "set_run_validators", - "setters", - "validate", - "validators", -] - - -def _make_getattr(mod_name: str) -> Callable: - """ - Create a metadata proxy for packaging information that uses *mod_name* in - its warnings and errors. - """ - - def __getattr__(name: str) -> str: - if name not in ("__version__", "__version_info__"): - msg = f"module {mod_name} has no attribute {name}" - raise AttributeError(msg) - - from importlib.metadata import metadata - - meta = metadata("attrs") - - if name == "__version_info__": - return VersionInfo._from_version_string(meta["version"]) - - return meta["version"] - - return __getattr__ - - -__getattr__ = _make_getattr(__name__) diff --git a/venv/lib/python3.12/site-packages/attr/__init__.pyi b/venv/lib/python3.12/site-packages/attr/__init__.pyi deleted file mode 100644 index 133e501..0000000 --- a/venv/lib/python3.12/site-packages/attr/__init__.pyi +++ /dev/null @@ -1,389 +0,0 @@ -import enum -import sys - -from typing import ( - Any, - Callable, - Generic, - Literal, - Mapping, - Protocol, - Sequence, - TypeVar, - overload, -) - -# `import X as X` is required to make these public -from . import converters as converters -from . import exceptions as exceptions -from . import filters as filters -from . import setters as setters -from . import validators as validators -from ._cmp import cmp_using as cmp_using -from ._typing_compat import AttrsInstance_ -from ._version_info import VersionInfo -from attrs import ( - define as define, - field as field, - mutable as mutable, - frozen as frozen, - _EqOrderType, - _ValidatorType, - _ConverterType, - _ReprArgType, - _OnSetAttrType, - _OnSetAttrArgType, - _FieldTransformer, - _ValidatorArgType, -) - -if sys.version_info >= (3, 10): - from typing import TypeGuard, TypeAlias -else: - from typing_extensions import TypeGuard, TypeAlias - -if sys.version_info >= (3, 11): - from typing import dataclass_transform -else: - from typing_extensions import dataclass_transform - -__version__: str -__version_info__: VersionInfo -__title__: str -__description__: str -__url__: str -__uri__: str -__author__: str -__email__: str -__license__: str -__copyright__: str - -_T = TypeVar("_T") -_C = TypeVar("_C", bound=type) - -_FilterType = Callable[["Attribute[_T]", _T], bool] - -# We subclass this here to keep the protocol's qualified name clean. -class AttrsInstance(AttrsInstance_, Protocol): - pass - -_A = TypeVar("_A", bound=type[AttrsInstance]) - -class _Nothing(enum.Enum): - NOTHING = enum.auto() - -NOTHING = _Nothing.NOTHING -NothingType: TypeAlias = Literal[_Nothing.NOTHING] - -# NOTE: Factory lies about its return type to make this possible: -# `x: List[int] # = Factory(list)` -# Work around mypy issue #4554 in the common case by using an overload. - -@overload -def Factory(factory: Callable[[], _T]) -> _T: ... -@overload -def Factory( - factory: Callable[[Any], _T], - takes_self: Literal[True], -) -> _T: ... -@overload -def Factory( - factory: Callable[[], _T], - takes_self: Literal[False], -) -> _T: ... - -In = TypeVar("In") -Out = TypeVar("Out") - -class Converter(Generic[In, Out]): - @overload - def __init__(self, converter: Callable[[In], Out]) -> None: ... - @overload - def __init__( - self, - converter: Callable[[In, AttrsInstance, Attribute], Out], - *, - takes_self: Literal[True], - takes_field: Literal[True], - ) -> None: ... - @overload - def __init__( - self, - converter: Callable[[In, Attribute], Out], - *, - takes_field: Literal[True], - ) -> None: ... - @overload - def __init__( - self, - converter: Callable[[In, AttrsInstance], Out], - *, - takes_self: Literal[True], - ) -> None: ... - -class Attribute(Generic[_T]): - name: str - default: _T | None - validator: _ValidatorType[_T] | None - repr: _ReprArgType - cmp: _EqOrderType - eq: _EqOrderType - order: _EqOrderType - hash: bool | None - init: bool - converter: Converter | None - metadata: dict[Any, Any] - type: type[_T] | None - kw_only: bool - on_setattr: _OnSetAttrType - alias: str | None - - def evolve(self, **changes: Any) -> "Attribute[Any]": ... - -# NOTE: We had several choices for the annotation to use for type arg: -# 1) Type[_T] -# - Pros: Handles simple cases correctly -# - Cons: Might produce less informative errors in the case of conflicting -# TypeVars e.g. `attr.ib(default='bad', type=int)` -# 2) Callable[..., _T] -# - Pros: Better error messages than #1 for conflicting TypeVars -# - Cons: Terrible error messages for validator checks. -# e.g. attr.ib(type=int, validator=validate_str) -# -> error: Cannot infer function type argument -# 3) type (and do all of the work in the mypy plugin) -# - Pros: Simple here, and we could customize the plugin with our own errors. -# - Cons: Would need to write mypy plugin code to handle all the cases. -# We chose option #1. - -# `attr` lies about its return type to make the following possible: -# attr() -> Any -# attr(8) -> int -# attr(validator=<some callable>) -> Whatever the callable expects. -# This makes this type of assignments possible: -# x: int = attr(8) -# -# This form catches explicit None or no default but with no other arguments -# returns Any. -@overload -def attrib( - default: None = ..., - validator: None = ..., - repr: _ReprArgType = ..., - cmp: _EqOrderType | None = ..., - hash: bool | None = ..., - init: bool = ..., - metadata: Mapping[Any, Any] | None = ..., - type: None = ..., - converter: None = ..., - factory: None = ..., - kw_only: bool = ..., - eq: _EqOrderType | None = ..., - order: _EqOrderType | None = ..., - on_setattr: _OnSetAttrArgType | None = ..., - alias: str | None = ..., -) -> Any: ... - -# This form catches an explicit None or no default and infers the type from the -# other arguments. -@overload -def attrib( - default: None = ..., - validator: _ValidatorArgType[_T] | None = ..., - repr: _ReprArgType = ..., - cmp: _EqOrderType | None = ..., - hash: bool | None = ..., - init: bool = ..., - metadata: Mapping[Any, Any] | None = ..., - type: type[_T] | None = ..., - converter: _ConverterType - | list[_ConverterType] - | tuple[_ConverterType] - | None = ..., - factory: Callable[[], _T] | None = ..., - kw_only: bool = ..., - eq: _EqOrderType | None = ..., - order: _EqOrderType | None = ..., - on_setattr: _OnSetAttrArgType | None = ..., - alias: str | None = ..., -) -> _T: ... - -# This form catches an explicit default argument. -@overload -def attrib( - default: _T, - validator: _ValidatorArgType[_T] | None = ..., - repr: _ReprArgType = ..., - cmp: _EqOrderType | None = ..., - hash: bool | None = ..., - init: bool = ..., - metadata: Mapping[Any, Any] | None = ..., - type: type[_T] | None = ..., - converter: _ConverterType - | list[_ConverterType] - | tuple[_ConverterType] - | None = ..., - factory: Callable[[], _T] | None = ..., - kw_only: bool = ..., - eq: _EqOrderType | None = ..., - order: _EqOrderType | None = ..., - on_setattr: _OnSetAttrArgType | None = ..., - alias: str | None = ..., -) -> _T: ... - -# This form covers type=non-Type: e.g. forward references (str), Any -@overload -def attrib( - default: _T | None = ..., - validator: _ValidatorArgType[_T] | None = ..., - repr: _ReprArgType = ..., - cmp: _EqOrderType | None = ..., - hash: bool | None = ..., - init: bool = ..., - metadata: Mapping[Any, Any] | None = ..., - type: object = ..., - converter: _ConverterType - | list[_ConverterType] - | tuple[_ConverterType] - | None = ..., - factory: Callable[[], _T] | None = ..., - kw_only: bool = ..., - eq: _EqOrderType | None = ..., - order: _EqOrderType | None = ..., - on_setattr: _OnSetAttrArgType | None = ..., - alias: str | None = ..., -) -> Any: ... -@overload -@dataclass_transform(order_default=True, field_specifiers=(attrib, field)) -def attrs( - maybe_cls: _C, - these: dict[str, Any] | None = ..., - repr_ns: str | None = ..., - repr: bool = ..., - cmp: _EqOrderType | None = ..., - hash: bool | None = ..., - init: bool = ..., - slots: bool = ..., - frozen: bool = ..., - weakref_slot: bool = ..., - str: bool = ..., - auto_attribs: bool = ..., - kw_only: bool = ..., - cache_hash: bool = ..., - auto_exc: bool = ..., - eq: _EqOrderType | None = ..., - order: _EqOrderType | None = ..., - auto_detect: bool = ..., - collect_by_mro: bool = ..., - getstate_setstate: bool | None = ..., - on_setattr: _OnSetAttrArgType | None = ..., - field_transformer: _FieldTransformer | None = ..., - match_args: bool = ..., - unsafe_hash: bool | None = ..., -) -> _C: ... -@overload -@dataclass_transform(order_default=True, field_specifiers=(attrib, field)) -def attrs( - maybe_cls: None = ..., - these: dict[str, Any] | None = ..., - repr_ns: str | None = ..., - repr: bool = ..., - cmp: _EqOrderType | None = ..., - hash: bool | None = ..., - init: bool = ..., - slots: bool = ..., - frozen: bool = ..., - weakref_slot: bool = ..., - str: bool = ..., - auto_attribs: bool = ..., - kw_only: bool = ..., - cache_hash: bool = ..., - auto_exc: bool = ..., - eq: _EqOrderType | None = ..., - order: _EqOrderType | None = ..., - auto_detect: bool = ..., - collect_by_mro: bool = ..., - getstate_setstate: bool | None = ..., - on_setattr: _OnSetAttrArgType | None = ..., - field_transformer: _FieldTransformer | None = ..., - match_args: bool = ..., - unsafe_hash: bool | None = ..., -) -> Callable[[_C], _C]: ... -def fields(cls: type[AttrsInstance]) -> Any: ... -def fields_dict(cls: type[AttrsInstance]) -> dict[str, Attribute[Any]]: ... -def validate(inst: AttrsInstance) -> None: ... -def resolve_types( - cls: _A, - globalns: dict[str, Any] | None = ..., - localns: dict[str, Any] | None = ..., - attribs: list[Attribute[Any]] | None = ..., - include_extras: bool = ..., -) -> _A: ... - -# TODO: add support for returning a proper attrs class from the mypy plugin -# we use Any instead of _CountingAttr so that e.g. `make_class('Foo', -# [attr.ib()])` is valid -def make_class( - name: str, - attrs: list[str] | tuple[str, ...] | dict[str, Any], - bases: tuple[type, ...] = ..., - class_body: dict[str, Any] | None = ..., - repr_ns: str | None = ..., - repr: bool = ..., - cmp: _EqOrderType | None = ..., - hash: bool | None = ..., - init: bool = ..., - slots: bool = ..., - frozen: bool = ..., - weakref_slot: bool = ..., - str: bool = ..., - auto_attribs: bool = ..., - kw_only: bool = ..., - cache_hash: bool = ..., - auto_exc: bool = ..., - eq: _EqOrderType | None = ..., - order: _EqOrderType | None = ..., - collect_by_mro: bool = ..., - on_setattr: _OnSetAttrArgType | None = ..., - field_transformer: _FieldTransformer | None = ..., -) -> type: ... - -# _funcs -- - -# TODO: add support for returning TypedDict from the mypy plugin -# FIXME: asdict/astuple do not honor their factory args. Waiting on one of -# these: -# https://github.com/python/mypy/issues/4236 -# https://github.com/python/typing/issues/253 -# XXX: remember to fix attrs.asdict/astuple too! -def asdict( - inst: AttrsInstance, - recurse: bool = ..., - filter: _FilterType[Any] | None = ..., - dict_factory: type[Mapping[Any, Any]] = ..., - retain_collection_types: bool = ..., - value_serializer: Callable[[type, Attribute[Any], Any], Any] | None = ..., - tuple_keys: bool | None = ..., -) -> dict[str, Any]: ... - -# TODO: add support for returning NamedTuple from the mypy plugin -def astuple( - inst: AttrsInstance, - recurse: bool = ..., - filter: _FilterType[Any] | None = ..., - tuple_factory: type[Sequence[Any]] = ..., - retain_collection_types: bool = ..., -) -> tuple[Any, ...]: ... -def has(cls: type) -> TypeGuard[type[AttrsInstance]]: ... -def assoc(inst: _T, **changes: Any) -> _T: ... -def evolve(inst: _T, **changes: Any) -> _T: ... - -# _config -- - -def set_run_validators(run: bool) -> None: ... -def get_run_validators() -> bool: ... - -# aliases -- - -s = attributes = attrs -ib = attr = attrib -dataclass = attrs # Technically, partial(attrs, auto_attribs=True) ;) diff --git a/venv/lib/python3.12/site-packages/attr/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/attr/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index e9a008f8d3feffc298b42a391d54067d6c9297ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2634 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 diff --git a/venv/lib/python3.12/site-packages/attr/__pycache__/_cmp.cpython-312.pyc b/venv/lib/python3.12/site-packages/attr/__pycache__/_cmp.cpython-312.pyc deleted file mode 100644 index f7eac573d09718eb99ffbbee44ef152ba8f95a26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5098 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 U0cppBoFcs}ZT2eCPsDfs2bnql=>Px# diff --git a/venv/lib/python3.12/site-packages/attr/__pycache__/_compat.cpython-312.pyc b/venv/lib/python3.12/site-packages/attr/__pycache__/_compat.cpython-312.pyc deleted file mode 100644 index 1972ff065e8fd3450495087c0f49482a401fe6d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3524 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 ZQ2Ok{`r7A@KHp9$&BSgbB&CH?{tMu(FtY#v diff --git a/venv/lib/python3.12/site-packages/attr/__pycache__/_config.cpython-312.pyc b/venv/lib/python3.12/site-packages/attr/__pycache__/_config.cpython-312.pyc deleted file mode 100644 index c5cc0c914a912669b9a1f8ecd1b76641e2e9b61d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1130 zcmd5*&rcLF6mEAGSeNBTFo6if6g}W1Fe9KIi19%5U`#X-yl|QAP9M7yW~Q6AyJQfP z)p#)R;tdbRyWvmqvIh@l;(^3}fVdtEC)>h;(Ssg+$-KUK{rdIw_3OuxkuuWOdH=NW zz(MG%`RQBXH0aIhU>`BWaJ{gJSb<{ZyhNJ?R@C0f2He4Xq7Et$tu$!UIAT<BA@d3O zM{Xm;eRe$-^`|#Qy*2Ijkvf~(L#n?yIyjBw2*b~?8qiQ{d-&iK{{rtJ>SP7i+5J%_ z+SWmlod&1|2*L$PxgzIf5h{S_N<Bi>GQwbswqmtFG&nn(Dq9-Q)6-1>AyvRuSIP2{ zx8hwV_ceJG$CkFHsUYEPU<;(yQY2D@#*+UEuvDfh3nPk?6n03pN|h3_S|uq>KsIRz z9(f{xoaDXpdOg!c7D-x*fn9T}XM9mA6;S5c#O}p;eWrPmw4@@ssv769_s}io<wzPJ zO+(0wCYxW_$eM6Z2rlxm->%Fp<c_AvokZ59={q6Eq2J&M_z6|A?ce2LD}hu=UqK9Y zL6b$PqHr6;BI7%0%qaumw;^r&aa8l0nQHKK#amkTWu#zHA9I`5LHg$Keh~6>E2?|V zOc)hdSJHvJqFo1lA4iqRH{rV*pN7fj(W|eVFQZd$o!4o%G<!IC>G`9cMxoHSz8O7O zJ&o!>>#3hd>&V5shqh6VLA6Bs5Ayi0G+<uWUp3%jVcPcriHaV?uyN)Rt(($;G;jT+ zu`}J`w1pXs3<Uv=;~=ohPwv95Gi^NQIxgK#IBUglM~v$U(`-4X-I0SaJ{m+7(w)26 YE#K-49ZpPk#=Z?!@O1BT3C~!HpIZtuTmS$7 diff --git a/venv/lib/python3.12/site-packages/attr/__pycache__/_funcs.cpython-312.pyc b/venv/lib/python3.12/site-packages/attr/__pycache__/_funcs.cpython-312.pyc deleted file mode 100644 index 679fc93aba4ca297ca1bdc7a64662ba772889423..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13653 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 Oll-dv37)TJJp3nJ(7glz diff --git a/venv/lib/python3.12/site-packages/attr/__pycache__/_make.cpython-312.pyc b/venv/lib/python3.12/site-packages/attr/__pycache__/_make.cpython-312.pyc deleted file mode 100644 index 3863609492a45ff9b9285821ccadede87708c928..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99508 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 diff --git a/venv/lib/python3.12/site-packages/attr/__pycache__/_next_gen.cpython-312.pyc b/venv/lib/python3.12/site-packages/attr/__pycache__/_next_gen.cpython-312.pyc deleted file mode 100644 index 7f23c47254599b832b331554dba0738292b8648c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24376 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 diff --git a/venv/lib/python3.12/site-packages/attr/__pycache__/_version_info.cpython-312.pyc b/venv/lib/python3.12/site-packages/attr/__pycache__/_version_info.cpython-312.pyc deleted file mode 100644 index 54759ce5b467bf2069f7654a710750903964921f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3144 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 diff --git a/venv/lib/python3.12/site-packages/attr/__pycache__/converters.cpython-312.pyc b/venv/lib/python3.12/site-packages/attr/__pycache__/converters.cpython-312.pyc deleted file mode 100644 index 8d33ac7434d508271ed9057195c07a11b188bbd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4648 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 V7#zMge;`~EPaUj^r^Ep+_`fFzw7LKQ diff --git a/venv/lib/python3.12/site-packages/attr/__pycache__/exceptions.cpython-312.pyc b/venv/lib/python3.12/site-packages/attr/__pycache__/exceptions.cpython-312.pyc deleted file mode 100644 index ca5d0be538dd2166e082bd5bd3be755cce910590..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3601 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 S;Gj#qSJ`!|`h>tsy6Im9No8jM diff --git a/venv/lib/python3.12/site-packages/attr/__pycache__/filters.cpython-312.pyc b/venv/lib/python3.12/site-packages/attr/__pycache__/filters.cpython-312.pyc deleted file mode 100644 index 99064f515f921f60a93d04a8bb3f3c910dd3526f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3015 zcmds3L2nyH6rR~#JGPrN4Rs&^(N0^`V$-fmD*>vC(_nJ~wGurb6)I=5J9f5R?^-is zrwM6gp-M@rO634FC)8_HkoW=o11>3{60$f{;sUo21EM+c-g<4P1yO-o4vgfdH#6_e zyl-Z{Z~gVqP>Mine)hqPK0wG1*y%Pca@q&Mxk(&yjyTlOJX+PxX_PqnRdP;u46ue1 z0~?!*X9ngcQ-z>f4Sa8o)g>?2Jyv!-#f4<$K(HxGDIrZuI<BpznB_bDAyuz=e9BDy zL}9-SZ6zlm)}5{^ZsSO|#lg|x*Y?2NB&s*((5qyD6v^!<@^&<{Ekb)_1c3UhHOl%~ zk}>9sDF*EwuIj><%wl25EGV<7vIyq6FS(kM*tb1PN)90a5Fv*!q#33^fF=gT9!E59 zfO(5hK(s*4KSRi6+OK<os_tcw+mR>f_4ES$l-{J2Tpu^c9Qi_@rK|LGMr);9>H1Px zzRg>Pnyc|ut)-bqTe|H@iTR9e*}0jZ%5zmq$wsai*!3#+mCPyb@rtmjN2GG?i(DLW zf?3}SEQgC+gZqt~=T7Hpb805=kDD(a%Sl)9BQ?vuXjQn(A=F%S-)3!YD|xcQeSWDX z^7DI2vgWy}G&^G{^Q0HpmM8OOZ+;l6lH*{0B)>PwHzN}(2R?uH%feUbyP5pQ2kwka z+;1mf_QTP=bY);KeUfJ=@P%bG0em1WT`D1x;6>*q2Ei9YU>=2N7ba~(l#dYYzMFX+ z5#{fToe=V0ArZ)#e}`n`Atc2J$@tw&0g)6tNRYBU8bHUutCmPY7M@yb$F?UR(lCzN zBVPm4B)_Cc@+r9HTj_5{Ce{-Z-zP@kh_IJmPvpa15qrh;L~&!l7>sWaBNlH%F0s*c z8=}OEYvZzu+M>Q_Y}bed(p81`A@Z7j&A6s5X-oQ&QPx2}5|`-$1*U7(BGetSwIH~q zII|)dV+ugAP~I%h3uYzDBFwCr3Zo}QMV<&f6bhVSFM6(2?;#5hGk8pgLp_jYPu$LD z`U#lyE+(mfxxVey9d5FM<+Ew5ptFX>e5(p;fttcZPh6q`B5mp~S%5OFX^;0uaFa;} z{0qlBfb7m5HB>DJcYjc*4~0tB!-XsK0y?q{5!nv$v&<5eP)(weOp`T0|J}g1XDq+M zof9Y6F%S>)D4VoxUQ>81u3wRC)>Sib&fIfCj9tC#X&+oE`n&Od-v;xE4r)m+fcJ1) z)*Iv!m1zoUdSQEh6u4}J^9If@YYlRigscahOqNQac$Z2o0}pyN)=KscxfN?zUY)mM zI3mRkSgjSqC@E3M8EZD1owuHduCFvd-o414=yj*?yDE=?0mZvFICA66@|hL6Hn@M2 zXhZwI8y>rHW%<gj(Y4`&n>q~K8y;JEb8UDZy#8cLj6&Kf4Ox_l2|N+O(Ck5jb&0)T zqN+}vI@PIaAlh2&he=$bjm{R(Zx0!N;Z|{dEOW;gZ5EbBKZ^Zk#A2z9on$cGJQHqb zLuju7dmanVR{oY}P5|G~Y}OA{7M>OI?TOKiU;2O3?RcMVeTGHMW0nNDsnu1Fx*^r= z?ZiPpB;ILo9v|@ryVMh7u&#Ix%%7+fT@6sFdr3Vib*CmV?^Q7WluEl&@F9u#B=*4q zT{a;(AH}9<cX0?}k7E1*G{~#dnRsiURB{3vbR<@)TJTp2DH9SlWM7!H+KCRyxs^Cs t4V=2i^Wr6l1YQt{Y~Ii*r9a0tYW$iY^!d$rg2p$W9;4~@D`3Li{s2%S*~$O_ diff --git a/venv/lib/python3.12/site-packages/attr/__pycache__/setters.cpython-312.pyc b/venv/lib/python3.12/site-packages/attr/__pycache__/setters.cpython-312.pyc deleted file mode 100644 index 050a095e66c93e20c8b129914e31ed166f8f5cd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1935 zcma)7&rjS&6rQoYUhnc_fe;{71JjfQ8D+gmdZ{9WlqN+zR3t5@AhoX7o@EVQdo|-- z3SBB%MJiEyK&mP@RU8}fr}P3!qy$Tmh}s@{BhX4!PJJ`Giy)~go;1(nH{&;N-uJ!d zU%R@p2xRr=ugah32>m8r+M={3M^iA_KpvV!9`=*~SCm-=i@6%86>V07x%L3fro0qr z-P1v*y)<Y;K{T`7ax<G<GR(~K<?QXKQi;M~iPSjtNI8lYI4MPpM4`=T?8Gs%vVUUu z%EU?9cB8Q5&ppCP{}hXsX?P3P{bDVqA2Jp(x8+<uM8IhnM}45agOJxy348c~v4R_T z2ARroDN8^;t%bx10x}NA#gy@J;)EVyG_J9b#AVu^)}5e6NmP=yz~M23NUf~&VOgXO zpZZbgcpmj`-Xu4!S=X&=a?w>~JWT~@Mdx4~S)hKx8>peIs1H+j&}W?pt!N5rXbsfB z4RyQq)r$H<w}u)jM2x2&AyZEbKjg6!x-`*6di-LN3F)FO<4Y7)PxR(Zl631vTpTK{ zN>*RFg>qD(g^CmNdf`sw)+#iNc_F3&onuZV&tu<Rpe*l2i(wEs9%Y3(4eN!#FBYmx zaXAX#v##GLa6hK`s^cy=bCefE7=_khR&^=qTx3qQN<F*kSLyOwLR%9-<T?SLv`(%G zX!uo7|E!{CT?1>%{=mgUgfrIK)L!r4rm=P9mrIX(^AA5bP{DYhqn^IC%n|HI%m8I7 ztXs@`KyiWh7lh^Dk!a#bCcJluC9w`C{MD_e`VM+f=g^Ke$a=we3K~H&k@O?sa|6Yo zoANC-@$$zK%X^GMI%1#*Y33fNN8*SSDXB!BU-GGU7D_M;Jez8Q?L@KdM73?3i=zRe z<^}YUq&FJ`<3$);6eirD6LpO2Xv1#?pMrH6d=VxmgP(5~F4)`R;TmE}Lzw}l&5KZ8 zlNGh0a=8wCR3#skHXkuCR#wmF$JI05OvU&ZCqP2qb7EP)Wc-+x<HRo!KPF{|pS5bH zOqGcXB{`ebLc#8)W1eJ==cdLou!V`_FoAS}>s;Ii^4LnG(b`Pe+hD%}gHM8zsWfs= z)5E*z;jPQN>9J?Ip&esr-{^j74DA|2tGD(#I-9l^T57etu5V_ZXqWao`ggSc|4IKm zIESLf;`zFWw6f85*Ia>48H)xb1=6f-x1i$CDdAn&7K{X$LCtpoL>mTxPQaipfBj!D zK%0bq1l^3}^QTiU3{iLrn$zu0x?_~rg7{2K7BNF>&fIPvX=+L4`1~YgR~+ak!>}vK z`n=t`%+wpmxpEU1L>BP1@JqK`v3J4#K8zN82i+)>JBBK4{9%m#p1ZL5&gT6mxv{-- z{p<ICoY?6cd6DZ`zp(kyR_SprzhmT2z&CAn!2iVdA{Pn}HK~@RU%Ip!LmTHz#34I~ ztU<{h8AGB+#d+$+NoxA8efOU1Ly`}&a9<e{&<AP(on$6B5CHN5DCl1pztk11{cRvT k@Elz|)N^>~a8$=5hkZGG{&2JxpMPn=rM@@5NlAzQ0%YjZ&;S4c diff --git a/venv/lib/python3.12/site-packages/attr/__pycache__/validators.cpython-312.pyc b/venv/lib/python3.12/site-packages/attr/__pycache__/validators.cpython-312.pyc deleted file mode 100644 index 5f6e96d6964510b1c4b7e27f9bb5676858ef919c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26245 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 C=~>_a diff --git a/venv/lib/python3.12/site-packages/attr/_cmp.py b/venv/lib/python3.12/site-packages/attr/_cmp.py deleted file mode 100644 index 09bab49..0000000 --- a/venv/lib/python3.12/site-packages/attr/_cmp.py +++ /dev/null @@ -1,160 +0,0 @@ -# SPDX-License-Identifier: MIT - - -import functools -import types - -from ._make import __ne__ - - -_operation_names = {"eq": "==", "lt": "<", "le": "<=", "gt": ">", "ge": ">="} - - -def cmp_using( - eq=None, - lt=None, - le=None, - gt=None, - ge=None, - require_same_type=True, - class_name="Comparable", -): - """ - Create a class that can be passed into `attrs.field`'s ``eq``, ``order``, - and ``cmp`` arguments to customize field comparison. - - The resulting class will have a full set of ordering methods if at least - one of ``{lt, le, gt, ge}`` and ``eq`` are provided. - - Args: - eq (typing.Callable | None): - Callable used to evaluate equality of two objects. - - lt (typing.Callable | None): - Callable used to evaluate whether one object is less than another - object. - - le (typing.Callable | None): - Callable used to evaluate whether one object is less than or equal - to another object. - - gt (typing.Callable | None): - Callable used to evaluate whether one object is greater than - another object. - - ge (typing.Callable | None): - Callable used to evaluate whether one object is greater than or - equal to another object. - - require_same_type (bool): - When `True`, equality and ordering methods will return - `NotImplemented` if objects are not of the same type. - - class_name (str | None): Name of class. Defaults to "Comparable". - - See `comparison` for more details. - - .. versionadded:: 21.1.0 - """ - - body = { - "__slots__": ["value"], - "__init__": _make_init(), - "_requirements": [], - "_is_comparable_to": _is_comparable_to, - } - - # Add operations. - num_order_functions = 0 - has_eq_function = False - - if eq is not None: - has_eq_function = True - body["__eq__"] = _make_operator("eq", eq) - body["__ne__"] = __ne__ - - if lt is not None: - num_order_functions += 1 - body["__lt__"] = _make_operator("lt", lt) - - if le is not None: - num_order_functions += 1 - body["__le__"] = _make_operator("le", le) - - if gt is not None: - num_order_functions += 1 - body["__gt__"] = _make_operator("gt", gt) - - if ge is not None: - num_order_functions += 1 - body["__ge__"] = _make_operator("ge", ge) - - type_ = types.new_class( - class_name, (object,), {}, lambda ns: ns.update(body) - ) - - # Add same type requirement. - if require_same_type: - type_._requirements.append(_check_same_type) - - # Add total ordering if at least one operation was defined. - if 0 < num_order_functions < 4: - if not has_eq_function: - # functools.total_ordering requires __eq__ to be defined, - # so raise early error here to keep a nice stack. - msg = "eq must be define is order to complete ordering from lt, le, gt, ge." - raise ValueError(msg) - type_ = functools.total_ordering(type_) - - return type_ - - -def _make_init(): - """ - Create __init__ method. - """ - - def __init__(self, value): - """ - Initialize object with *value*. - """ - self.value = value - - return __init__ - - -def _make_operator(name, func): - """ - Create operator method. - """ - - def method(self, other): - if not self._is_comparable_to(other): - return NotImplemented - - result = func(self.value, other.value) - if result is NotImplemented: - return NotImplemented - - return result - - method.__name__ = f"__{name}__" - method.__doc__ = ( - f"Return a {_operation_names[name]} b. Computed by attrs." - ) - - return method - - -def _is_comparable_to(self, other): - """ - Check whether `other` is comparable to `self`. - """ - return all(func(self, other) for func in self._requirements) - - -def _check_same_type(self, other): - """ - Return True if *self* and *other* are of the same type, False otherwise. - """ - return other.value.__class__ is self.value.__class__ diff --git a/venv/lib/python3.12/site-packages/attr/_cmp.pyi b/venv/lib/python3.12/site-packages/attr/_cmp.pyi deleted file mode 100644 index cc7893b..0000000 --- a/venv/lib/python3.12/site-packages/attr/_cmp.pyi +++ /dev/null @@ -1,13 +0,0 @@ -from typing import Any, Callable - -_CompareWithType = Callable[[Any, Any], bool] - -def cmp_using( - eq: _CompareWithType | None = ..., - lt: _CompareWithType | None = ..., - le: _CompareWithType | None = ..., - gt: _CompareWithType | None = ..., - ge: _CompareWithType | None = ..., - require_same_type: bool = ..., - class_name: str = ..., -) -> type: ... diff --git a/venv/lib/python3.12/site-packages/attr/_compat.py b/venv/lib/python3.12/site-packages/attr/_compat.py deleted file mode 100644 index 22fcd78..0000000 --- a/venv/lib/python3.12/site-packages/attr/_compat.py +++ /dev/null @@ -1,94 +0,0 @@ -# SPDX-License-Identifier: MIT - -import inspect -import platform -import sys -import threading - -from collections.abc import Mapping, Sequence # noqa: F401 -from typing import _GenericAlias - - -PYPY = platform.python_implementation() == "PyPy" -PY_3_9_PLUS = sys.version_info[:2] >= (3, 9) -PY_3_10_PLUS = sys.version_info[:2] >= (3, 10) -PY_3_11_PLUS = sys.version_info[:2] >= (3, 11) -PY_3_12_PLUS = sys.version_info[:2] >= (3, 12) -PY_3_13_PLUS = sys.version_info[:2] >= (3, 13) -PY_3_14_PLUS = sys.version_info[:2] >= (3, 14) - - -if PY_3_14_PLUS: # pragma: no cover - import annotationlib - - _get_annotations = annotationlib.get_annotations - -else: - - def _get_annotations(cls): - """ - Get annotations for *cls*. - """ - return cls.__dict__.get("__annotations__", {}) - - -class _AnnotationExtractor: - """ - Extract type annotations from a callable, returning None whenever there - is none. - """ - - __slots__ = ["sig"] - - def __init__(self, callable): - try: - self.sig = inspect.signature(callable) - except (ValueError, TypeError): # inspect failed - self.sig = None - - def get_first_param_type(self): - """ - Return the type annotation of the first argument if it's not empty. - """ - if not self.sig: - return None - - params = list(self.sig.parameters.values()) - if params and params[0].annotation is not inspect.Parameter.empty: - return params[0].annotation - - return None - - def get_return_type(self): - """ - Return the return type if it's not empty. - """ - if ( - self.sig - and self.sig.return_annotation is not inspect.Signature.empty - ): - return self.sig.return_annotation - - return None - - -# Thread-local global to track attrs instances which are already being repr'd. -# This is needed because there is no other (thread-safe) way to pass info -# about the instances that are already being repr'd through the call stack -# in order to ensure we don't perform infinite recursion. -# -# For instance, if an instance contains a dict which contains that instance, -# we need to know that we're already repr'ing the outside instance from within -# the dict's repr() call. -# -# This lives here rather than in _make.py so that the functions in _make.py -# don't have a direct reference to the thread-local in their globals dict. -# If they have such a reference, it breaks cloudpickle. -repr_context = threading.local() - - -def get_generic_base(cl): - """If this is a generic class (A[str]), return the generic base for it.""" - if cl.__class__ is _GenericAlias: - return cl.__origin__ - return None diff --git a/venv/lib/python3.12/site-packages/attr/_config.py b/venv/lib/python3.12/site-packages/attr/_config.py deleted file mode 100644 index 4b25772..0000000 --- a/venv/lib/python3.12/site-packages/attr/_config.py +++ /dev/null @@ -1,31 +0,0 @@ -# SPDX-License-Identifier: MIT - -__all__ = ["get_run_validators", "set_run_validators"] - -_run_validators = True - - -def set_run_validators(run): - """ - Set whether or not validators are run. By default, they are run. - - .. deprecated:: 21.3.0 It will not be removed, but it also will not be - moved to new ``attrs`` namespace. Use `attrs.validators.set_disabled()` - instead. - """ - if not isinstance(run, bool): - msg = "'run' must be bool." - raise TypeError(msg) - global _run_validators - _run_validators = run - - -def get_run_validators(): - """ - Return whether or not validators are run. - - .. deprecated:: 21.3.0 It will not be removed, but it also will not be - moved to new ``attrs`` namespace. Use `attrs.validators.get_disabled()` - instead. - """ - return _run_validators diff --git a/venv/lib/python3.12/site-packages/attr/_funcs.py b/venv/lib/python3.12/site-packages/attr/_funcs.py deleted file mode 100644 index c39fb8a..0000000 --- a/venv/lib/python3.12/site-packages/attr/_funcs.py +++ /dev/null @@ -1,468 +0,0 @@ -# SPDX-License-Identifier: MIT - - -import copy - -from ._compat import PY_3_9_PLUS, get_generic_base -from ._make import _OBJ_SETATTR, NOTHING, fields -from .exceptions import AttrsAttributeNotFoundError - - -def asdict( - inst, - recurse=True, - filter=None, - dict_factory=dict, - retain_collection_types=False, - value_serializer=None, -): - """ - Return the *attrs* attribute values of *inst* as a dict. - - Optionally recurse into other *attrs*-decorated classes. - - Args: - inst: Instance of an *attrs*-decorated class. - - recurse (bool): Recurse into classes that are also *attrs*-decorated. - - filter (~typing.Callable): - A callable whose return code determines whether an attribute or - element is included (`True`) or dropped (`False`). Is called with - the `attrs.Attribute` as the first argument and the value as the - second argument. - - dict_factory (~typing.Callable): - A callable to produce dictionaries from. For example, to produce - ordered dictionaries instead of normal Python dictionaries, pass in - ``collections.OrderedDict``. - - retain_collection_types (bool): - Do not convert to `list` when encountering an attribute whose type - is `tuple` or `set`. Only meaningful if *recurse* is `True`. - - value_serializer (typing.Callable | None): - A hook that is called for every attribute or dict key/value. It - receives the current instance, field and value and must return the - (updated) value. The hook is run *after* the optional *filter* has - been applied. - - Returns: - Return type of *dict_factory*. - - Raises: - attrs.exceptions.NotAnAttrsClassError: - If *cls* is not an *attrs* class. - - .. versionadded:: 16.0.0 *dict_factory* - .. versionadded:: 16.1.0 *retain_collection_types* - .. versionadded:: 20.3.0 *value_serializer* - .. versionadded:: 21.3.0 - If a dict has a collection for a key, it is serialized as a tuple. - """ - attrs = fields(inst.__class__) - rv = dict_factory() - for a in attrs: - v = getattr(inst, a.name) - if filter is not None and not filter(a, v): - continue - - if value_serializer is not None: - v = value_serializer(inst, a, v) - - if recurse is True: - if has(v.__class__): - rv[a.name] = asdict( - v, - recurse=True, - filter=filter, - dict_factory=dict_factory, - retain_collection_types=retain_collection_types, - value_serializer=value_serializer, - ) - elif isinstance(v, (tuple, list, set, frozenset)): - cf = v.__class__ if retain_collection_types is True else list - items = [ - _asdict_anything( - i, - is_key=False, - filter=filter, - dict_factory=dict_factory, - retain_collection_types=retain_collection_types, - value_serializer=value_serializer, - ) - for i in v - ] - try: - rv[a.name] = cf(items) - except TypeError: - if not issubclass(cf, tuple): - raise - # Workaround for TypeError: cf.__new__() missing 1 required - # positional argument (which appears, for a namedturle) - rv[a.name] = cf(*items) - elif isinstance(v, dict): - df = dict_factory - rv[a.name] = df( - ( - _asdict_anything( - kk, - is_key=True, - filter=filter, - dict_factory=df, - retain_collection_types=retain_collection_types, - value_serializer=value_serializer, - ), - _asdict_anything( - vv, - is_key=False, - filter=filter, - dict_factory=df, - retain_collection_types=retain_collection_types, - value_serializer=value_serializer, - ), - ) - for kk, vv in v.items() - ) - else: - rv[a.name] = v - else: - rv[a.name] = v - return rv - - -def _asdict_anything( - val, - is_key, - filter, - dict_factory, - retain_collection_types, - value_serializer, -): - """ - ``asdict`` only works on attrs instances, this works on anything. - """ - if getattr(val.__class__, "__attrs_attrs__", None) is not None: - # Attrs class. - rv = asdict( - val, - recurse=True, - filter=filter, - dict_factory=dict_factory, - retain_collection_types=retain_collection_types, - value_serializer=value_serializer, - ) - elif isinstance(val, (tuple, list, set, frozenset)): - if retain_collection_types is True: - cf = val.__class__ - elif is_key: - cf = tuple - else: - cf = list - - rv = cf( - [ - _asdict_anything( - i, - is_key=False, - filter=filter, - dict_factory=dict_factory, - retain_collection_types=retain_collection_types, - value_serializer=value_serializer, - ) - for i in val - ] - ) - elif isinstance(val, dict): - df = dict_factory - rv = df( - ( - _asdict_anything( - kk, - is_key=True, - filter=filter, - dict_factory=df, - retain_collection_types=retain_collection_types, - value_serializer=value_serializer, - ), - _asdict_anything( - vv, - is_key=False, - filter=filter, - dict_factory=df, - retain_collection_types=retain_collection_types, - value_serializer=value_serializer, - ), - ) - for kk, vv in val.items() - ) - else: - rv = val - if value_serializer is not None: - rv = value_serializer(None, None, rv) - - return rv - - -def astuple( - inst, - recurse=True, - filter=None, - tuple_factory=tuple, - retain_collection_types=False, -): - """ - Return the *attrs* attribute values of *inst* as a tuple. - - Optionally recurse into other *attrs*-decorated classes. - - Args: - inst: Instance of an *attrs*-decorated class. - - recurse (bool): - Recurse into classes that are also *attrs*-decorated. - - filter (~typing.Callable): - A callable whose return code determines whether an attribute or - element is included (`True`) or dropped (`False`). Is called with - the `attrs.Attribute` as the first argument and the value as the - second argument. - - tuple_factory (~typing.Callable): - A callable to produce tuples from. For example, to produce lists - instead of tuples. - - retain_collection_types (bool): - Do not convert to `list` or `dict` when encountering an attribute - which type is `tuple`, `dict` or `set`. Only meaningful if - *recurse* is `True`. - - Returns: - Return type of *tuple_factory* - - Raises: - attrs.exceptions.NotAnAttrsClassError: - If *cls* is not an *attrs* class. - - .. versionadded:: 16.2.0 - """ - attrs = fields(inst.__class__) - rv = [] - retain = retain_collection_types # Very long. :/ - for a in attrs: - v = getattr(inst, a.name) - if filter is not None and not filter(a, v): - continue - if recurse is True: - if has(v.__class__): - rv.append( - astuple( - v, - recurse=True, - filter=filter, - tuple_factory=tuple_factory, - retain_collection_types=retain, - ) - ) - elif isinstance(v, (tuple, list, set, frozenset)): - cf = v.__class__ if retain is True else list - items = [ - ( - astuple( - j, - recurse=True, - filter=filter, - tuple_factory=tuple_factory, - retain_collection_types=retain, - ) - if has(j.__class__) - else j - ) - for j in v - ] - try: - rv.append(cf(items)) - except TypeError: - if not issubclass(cf, tuple): - raise - # Workaround for TypeError: cf.__new__() missing 1 required - # positional argument (which appears, for a namedturle) - rv.append(cf(*items)) - elif isinstance(v, dict): - df = v.__class__ if retain is True else dict - rv.append( - df( - ( - ( - astuple( - kk, - tuple_factory=tuple_factory, - retain_collection_types=retain, - ) - if has(kk.__class__) - else kk - ), - ( - astuple( - vv, - tuple_factory=tuple_factory, - retain_collection_types=retain, - ) - if has(vv.__class__) - else vv - ), - ) - for kk, vv in v.items() - ) - ) - else: - rv.append(v) - else: - rv.append(v) - - return rv if tuple_factory is list else tuple_factory(rv) - - -def has(cls): - """ - Check whether *cls* is a class with *attrs* attributes. - - Args: - cls (type): Class to introspect. - - Raises: - TypeError: If *cls* is not a class. - - Returns: - bool: - """ - attrs = getattr(cls, "__attrs_attrs__", None) - if attrs is not None: - return True - - # No attrs, maybe it's a specialized generic (A[str])? - generic_base = get_generic_base(cls) - if generic_base is not None: - generic_attrs = getattr(generic_base, "__attrs_attrs__", None) - if generic_attrs is not None: - # Stick it on here for speed next time. - cls.__attrs_attrs__ = generic_attrs - return generic_attrs is not None - return False - - -def assoc(inst, **changes): - """ - Copy *inst* and apply *changes*. - - This is different from `evolve` that applies the changes to the arguments - that create the new instance. - - `evolve`'s behavior is preferable, but there are `edge cases`_ where it - doesn't work. Therefore `assoc` is deprecated, but will not be removed. - - .. _`edge cases`: https://github.com/python-attrs/attrs/issues/251 - - Args: - inst: Instance of a class with *attrs* attributes. - - changes: Keyword changes in the new copy. - - Returns: - A copy of inst with *changes* incorporated. - - Raises: - attrs.exceptions.AttrsAttributeNotFoundError: - If *attr_name* couldn't be found on *cls*. - - attrs.exceptions.NotAnAttrsClassError: - If *cls* is not an *attrs* class. - - .. deprecated:: 17.1.0 - Use `attrs.evolve` instead if you can. This function will not be - removed du to the slightly different approach compared to - `attrs.evolve`, though. - """ - new = copy.copy(inst) - attrs = fields(inst.__class__) - for k, v in changes.items(): - a = getattr(attrs, k, NOTHING) - if a is NOTHING: - msg = f"{k} is not an attrs attribute on {new.__class__}." - raise AttrsAttributeNotFoundError(msg) - _OBJ_SETATTR(new, k, v) - return new - - -def resolve_types( - cls, globalns=None, localns=None, attribs=None, include_extras=True -): - """ - Resolve any strings and forward annotations in type annotations. - - This is only required if you need concrete types in :class:`Attribute`'s - *type* field. In other words, you don't need to resolve your types if you - only use them for static type checking. - - With no arguments, names will be looked up in the module in which the class - was created. If this is not what you want, for example, if the name only - exists inside a method, you may pass *globalns* or *localns* to specify - other dictionaries in which to look up these names. See the docs of - `typing.get_type_hints` for more details. - - Args: - cls (type): Class to resolve. - - globalns (dict | None): Dictionary containing global variables. - - localns (dict | None): Dictionary containing local variables. - - attribs (list | None): - List of attribs for the given class. This is necessary when calling - from inside a ``field_transformer`` since *cls* is not an *attrs* - class yet. - - include_extras (bool): - Resolve more accurately, if possible. Pass ``include_extras`` to - ``typing.get_hints``, if supported by the typing module. On - supported Python versions (3.9+), this resolves the types more - accurately. - - Raises: - TypeError: If *cls* is not a class. - - attrs.exceptions.NotAnAttrsClassError: - If *cls* is not an *attrs* class and you didn't pass any attribs. - - NameError: If types cannot be resolved because of missing variables. - - Returns: - *cls* so you can use this function also as a class decorator. Please - note that you have to apply it **after** `attrs.define`. That means the - decorator has to come in the line **before** `attrs.define`. - - .. versionadded:: 20.1.0 - .. versionadded:: 21.1.0 *attribs* - .. versionadded:: 23.1.0 *include_extras* - """ - # Since calling get_type_hints is expensive we cache whether we've - # done it already. - if getattr(cls, "__attrs_types_resolved__", None) != cls: - import typing - - kwargs = {"globalns": globalns, "localns": localns} - - if PY_3_9_PLUS: - kwargs["include_extras"] = include_extras - - hints = typing.get_type_hints(cls, **kwargs) - for field in fields(cls) if attribs is None else attribs: - if field.name in hints: - # Since fields have been frozen we must work around it. - _OBJ_SETATTR(field, "type", hints[field.name]) - # We store the class we resolved so that subclasses know they haven't - # been resolved. - cls.__attrs_types_resolved__ = cls - - # Return the class so you can use it as a decorator too. - return cls diff --git a/venv/lib/python3.12/site-packages/attr/_make.py b/venv/lib/python3.12/site-packages/attr/_make.py deleted file mode 100644 index e84d979..0000000 --- a/venv/lib/python3.12/site-packages/attr/_make.py +++ /dev/null @@ -1,3123 +0,0 @@ -# SPDX-License-Identifier: MIT - -from __future__ import annotations - -import abc -import contextlib -import copy -import enum -import inspect -import itertools -import linecache -import sys -import types -import unicodedata - -from collections.abc import Callable, Mapping -from functools import cached_property -from typing import Any, NamedTuple, TypeVar - -# We need to import _compat itself in addition to the _compat members to avoid -# having the thread-local in the globals here. -from . import _compat, _config, setters -from ._compat import ( - PY_3_10_PLUS, - PY_3_11_PLUS, - PY_3_13_PLUS, - _AnnotationExtractor, - _get_annotations, - get_generic_base, -) -from .exceptions import ( - DefaultAlreadySetError, - FrozenInstanceError, - NotAnAttrsClassError, - UnannotatedAttributeError, -) - - -# This is used at least twice, so cache it here. -_OBJ_SETATTR = object.__setattr__ -_INIT_FACTORY_PAT = "__attr_factory_%s" -_CLASSVAR_PREFIXES = ( - "typing.ClassVar", - "t.ClassVar", - "ClassVar", - "typing_extensions.ClassVar", -) -# we don't use a double-underscore prefix because that triggers -# name mangling when trying to create a slot for the field -# (when slots=True) -_HASH_CACHE_FIELD = "_attrs_cached_hash" - -_EMPTY_METADATA_SINGLETON = types.MappingProxyType({}) - -# Unique object for unequivocal getattr() defaults. -_SENTINEL = object() - -_DEFAULT_ON_SETATTR = setters.pipe(setters.convert, setters.validate) - - -class _Nothing(enum.Enum): - """ - Sentinel to indicate the lack of a value when `None` is ambiguous. - - If extending attrs, you can use ``typing.Literal[NOTHING]`` to show - that a value may be ``NOTHING``. - - .. versionchanged:: 21.1.0 ``bool(NOTHING)`` is now False. - .. versionchanged:: 22.2.0 ``NOTHING`` is now an ``enum.Enum`` variant. - """ - - NOTHING = enum.auto() - - def __repr__(self): - return "NOTHING" - - def __bool__(self): - return False - - -NOTHING = _Nothing.NOTHING -""" -Sentinel to indicate the lack of a value when `None` is ambiguous. - -When using in 3rd party code, use `attrs.NothingType` for type annotations. -""" - - -class _CacheHashWrapper(int): - """ - An integer subclass that pickles / copies as None - - This is used for non-slots classes with ``cache_hash=True``, to avoid - serializing a potentially (even likely) invalid hash value. Since `None` - is the default value for uncalculated hashes, whenever this is copied, - the copy's value for the hash should automatically reset. - - See GH #613 for more details. - """ - - def __reduce__(self, _none_constructor=type(None), _args=()): # noqa: B008 - return _none_constructor, _args - - -def attrib( - default=NOTHING, - validator=None, - repr=True, - cmp=None, - hash=None, - init=True, - metadata=None, - type=None, - converter=None, - factory=None, - kw_only=False, - eq=None, - order=None, - on_setattr=None, - alias=None, -): - """ - Create a new field / attribute on a class. - - Identical to `attrs.field`, except it's not keyword-only. - - Consider using `attrs.field` in new code (``attr.ib`` will *never* go away, - though). - - .. warning:: - - Does **nothing** unless the class is also decorated with - `attr.s` (or similar)! - - - .. versionadded:: 15.2.0 *convert* - .. versionadded:: 16.3.0 *metadata* - .. versionchanged:: 17.1.0 *validator* can be a ``list`` now. - .. versionchanged:: 17.1.0 - *hash* is `None` and therefore mirrors *eq* by default. - .. versionadded:: 17.3.0 *type* - .. deprecated:: 17.4.0 *convert* - .. versionadded:: 17.4.0 - *converter* as a replacement for the deprecated *convert* to achieve - consistency with other noun-based arguments. - .. versionadded:: 18.1.0 - ``factory=f`` is syntactic sugar for ``default=attr.Factory(f)``. - .. versionadded:: 18.2.0 *kw_only* - .. versionchanged:: 19.2.0 *convert* keyword argument removed. - .. versionchanged:: 19.2.0 *repr* also accepts a custom callable. - .. deprecated:: 19.2.0 *cmp* Removal on or after 2021-06-01. - .. versionadded:: 19.2.0 *eq* and *order* - .. versionadded:: 20.1.0 *on_setattr* - .. versionchanged:: 20.3.0 *kw_only* backported to Python 2 - .. versionchanged:: 21.1.0 - *eq*, *order*, and *cmp* also accept a custom callable - .. versionchanged:: 21.1.0 *cmp* undeprecated - .. versionadded:: 22.2.0 *alias* - """ - eq, eq_key, order, order_key = _determine_attrib_eq_order( - cmp, eq, order, True - ) - - if hash is not None and hash is not True and hash is not False: - msg = "Invalid value for hash. Must be True, False, or None." - raise TypeError(msg) - - if factory is not None: - if default is not NOTHING: - msg = ( - "The `default` and `factory` arguments are mutually exclusive." - ) - raise ValueError(msg) - if not callable(factory): - msg = "The `factory` argument must be a callable." - raise ValueError(msg) - default = Factory(factory) - - if metadata is None: - metadata = {} - - # Apply syntactic sugar by auto-wrapping. - if isinstance(on_setattr, (list, tuple)): - on_setattr = setters.pipe(*on_setattr) - - if validator and isinstance(validator, (list, tuple)): - validator = and_(*validator) - - if converter and isinstance(converter, (list, tuple)): - converter = pipe(*converter) - - return _CountingAttr( - default=default, - validator=validator, - repr=repr, - cmp=None, - hash=hash, - init=init, - converter=converter, - metadata=metadata, - type=type, - kw_only=kw_only, - eq=eq, - eq_key=eq_key, - order=order, - order_key=order_key, - on_setattr=on_setattr, - alias=alias, - ) - - -def _compile_and_eval( - script: str, - globs: dict[str, Any] | None, - locs: Mapping[str, object] | None = None, - filename: str = "", -) -> None: - """ - Evaluate the script with the given global (globs) and local (locs) - variables. - """ - bytecode = compile(script, filename, "exec") - eval(bytecode, globs, locs) - - -def _linecache_and_compile( - script: str, - filename: str, - globs: dict[str, Any] | None, - locals: Mapping[str, object] | None = None, -) -> dict[str, Any]: - """ - Cache the script with _linecache_, compile it and return the _locals_. - """ - - locs = {} if locals is None else locals - - # In order of debuggers like PDB being able to step through the code, - # we add a fake linecache entry. - count = 1 - base_filename = filename - while True: - linecache_tuple = ( - len(script), - None, - script.splitlines(True), - filename, - ) - old_val = linecache.cache.setdefault(filename, linecache_tuple) - if old_val == linecache_tuple: - break - - filename = f"{base_filename[:-1]}-{count}>" - count += 1 - - _compile_and_eval(script, globs, locs, filename) - - return locs - - -def _make_attr_tuple_class(cls_name: str, attr_names: list[str]) -> type: - """ - Create a tuple subclass to hold `Attribute`s for an `attrs` class. - - The subclass is a bare tuple with properties for names. - - class MyClassAttributes(tuple): - __slots__ = () - x = property(itemgetter(0)) - """ - attr_class_name = f"{cls_name}Attributes" - body = {} - for i, attr_name in enumerate(attr_names): - - def getter(self, i=i): - return self[i] - - body[attr_name] = property(getter) - return type(attr_class_name, (tuple,), body) - - -# Tuple class for extracted attributes from a class definition. -# `base_attrs` is a subset of `attrs`. -class _Attributes(NamedTuple): - attrs: type - base_attrs: list[Attribute] - base_attrs_map: dict[str, type] - - -def _is_class_var(annot): - """ - Check whether *annot* is a typing.ClassVar. - - The string comparison hack is used to avoid evaluating all string - annotations which would put attrs-based classes at a performance - disadvantage compared to plain old classes. - """ - annot = str(annot) - - # Annotation can be quoted. - if annot.startswith(("'", '"')) and annot.endswith(("'", '"')): - annot = annot[1:-1] - - return annot.startswith(_CLASSVAR_PREFIXES) - - -def _has_own_attribute(cls, attrib_name): - """ - Check whether *cls* defines *attrib_name* (and doesn't just inherit it). - """ - return attrib_name in cls.__dict__ - - -def _collect_base_attrs( - cls, taken_attr_names -) -> tuple[list[Attribute], dict[str, type]]: - """ - Collect attr.ibs from base classes of *cls*, except *taken_attr_names*. - """ - base_attrs = [] - base_attr_map = {} # A dictionary of base attrs to their classes. - - # Traverse the MRO and collect attributes. - for base_cls in reversed(cls.__mro__[1:-1]): - for a in getattr(base_cls, "__attrs_attrs__", []): - if a.inherited or a.name in taken_attr_names: - continue - - a = a.evolve(inherited=True) # noqa: PLW2901 - base_attrs.append(a) - base_attr_map[a.name] = base_cls - - # For each name, only keep the freshest definition i.e. the furthest at the - # back. base_attr_map is fine because it gets overwritten with every new - # instance. - filtered = [] - seen = set() - for a in reversed(base_attrs): - if a.name in seen: - continue - filtered.insert(0, a) - seen.add(a.name) - - return filtered, base_attr_map - - -def _collect_base_attrs_broken(cls, taken_attr_names): - """ - Collect attr.ibs from base classes of *cls*, except *taken_attr_names*. - - N.B. *taken_attr_names* will be mutated. - - Adhere to the old incorrect behavior. - - Notably it collects from the front and considers inherited attributes which - leads to the buggy behavior reported in #428. - """ - base_attrs = [] - base_attr_map = {} # A dictionary of base attrs to their classes. - - # Traverse the MRO and collect attributes. - for base_cls in cls.__mro__[1:-1]: - for a in getattr(base_cls, "__attrs_attrs__", []): - if a.name in taken_attr_names: - continue - - a = a.evolve(inherited=True) # noqa: PLW2901 - taken_attr_names.add(a.name) - base_attrs.append(a) - base_attr_map[a.name] = base_cls - - return base_attrs, base_attr_map - - -def _transform_attrs( - cls, these, auto_attribs, kw_only, collect_by_mro, field_transformer -) -> _Attributes: - """ - Transform all `_CountingAttr`s on a class into `Attribute`s. - - If *these* is passed, use that and don't look for them on the class. - - If *collect_by_mro* is True, collect them in the correct MRO order, - otherwise use the old -- incorrect -- order. See #428. - - Return an `_Attributes`. - """ - cd = cls.__dict__ - anns = _get_annotations(cls) - - if these is not None: - ca_list = list(these.items()) - elif auto_attribs is True: - ca_names = { - name - for name, attr in cd.items() - if attr.__class__ is _CountingAttr - } - ca_list = [] - annot_names = set() - for attr_name, type in anns.items(): - if _is_class_var(type): - continue - annot_names.add(attr_name) - a = cd.get(attr_name, NOTHING) - - if a.__class__ is not _CountingAttr: - a = attrib(a) - ca_list.append((attr_name, a)) - - unannotated = ca_names - annot_names - if unannotated: - raise UnannotatedAttributeError( - "The following `attr.ib`s lack a type annotation: " - + ", ".join( - sorted(unannotated, key=lambda n: cd.get(n).counter) - ) - + "." - ) - else: - ca_list = sorted( - ( - (name, attr) - for name, attr in cd.items() - if attr.__class__ is _CountingAttr - ), - key=lambda e: e[1].counter, - ) - - fca = Attribute.from_counting_attr - own_attrs = [ - fca(attr_name, ca, anns.get(attr_name)) for attr_name, ca in ca_list - ] - - if collect_by_mro: - base_attrs, base_attr_map = _collect_base_attrs( - cls, {a.name for a in own_attrs} - ) - else: - base_attrs, base_attr_map = _collect_base_attrs_broken( - cls, {a.name for a in own_attrs} - ) - - if kw_only: - own_attrs = [a.evolve(kw_only=True) for a in own_attrs] - base_attrs = [a.evolve(kw_only=True) for a in base_attrs] - - attrs = base_attrs + own_attrs - - if field_transformer is not None: - attrs = tuple(field_transformer(cls, attrs)) - - # Check attr order after executing the field_transformer. - # Mandatory vs non-mandatory attr order only matters when they are part of - # the __init__ signature and when they aren't kw_only (which are moved to - # the end and can be mandatory or non-mandatory in any order, as they will - # be specified as keyword args anyway). Check the order of those attrs: - had_default = False - for a in (a for a in attrs if a.init is not False and a.kw_only is False): - if had_default is True and a.default is NOTHING: - msg = f"No mandatory attributes allowed after an attribute with a default value or factory. Attribute in question: {a!r}" - raise ValueError(msg) - - if had_default is False and a.default is not NOTHING: - had_default = True - - # Resolve default field alias after executing field_transformer. - # This allows field_transformer to differentiate between explicit vs - # default aliases and supply their own defaults. - for a in attrs: - if not a.alias: - # Evolve is very slow, so we hold our nose and do it dirty. - _OBJ_SETATTR.__get__(a)("alias", _default_init_alias_for(a.name)) - - # Create AttrsClass *after* applying the field_transformer since it may - # add or remove attributes! - attr_names = [a.name for a in attrs] - AttrsClass = _make_attr_tuple_class(cls.__name__, attr_names) - - return _Attributes(AttrsClass(attrs), base_attrs, base_attr_map) - - -def _make_cached_property_getattr(cached_properties, original_getattr, cls): - lines = [ - # Wrapped to get `__class__` into closure cell for super() - # (It will be replaced with the newly constructed class after construction). - "def wrapper(_cls):", - " __class__ = _cls", - " def __getattr__(self, item, cached_properties=cached_properties, original_getattr=original_getattr, _cached_setattr_get=_cached_setattr_get):", - " func = cached_properties.get(item)", - " if func is not None:", - " result = func(self)", - " _setter = _cached_setattr_get(self)", - " _setter(item, result)", - " return result", - ] - if original_getattr is not None: - lines.append( - " return original_getattr(self, item)", - ) - else: - lines.extend( - [ - " try:", - " return super().__getattribute__(item)", - " except AttributeError:", - " if not hasattr(super(), '__getattr__'):", - " raise", - " return super().__getattr__(item)", - " original_error = f\"'{self.__class__.__name__}' object has no attribute '{item}'\"", - " raise AttributeError(original_error)", - ] - ) - - lines.extend( - [ - " return __getattr__", - "__getattr__ = wrapper(_cls)", - ] - ) - - unique_filename = _generate_unique_filename(cls, "getattr") - - glob = { - "cached_properties": cached_properties, - "_cached_setattr_get": _OBJ_SETATTR.__get__, - "original_getattr": original_getattr, - } - - return _linecache_and_compile( - "\n".join(lines), unique_filename, glob, locals={"_cls": cls} - )["__getattr__"] - - -def _frozen_setattrs(self, name, value): - """ - Attached to frozen classes as __setattr__. - """ - if isinstance(self, BaseException) and name in ( - "__cause__", - "__context__", - "__traceback__", - "__suppress_context__", - "__notes__", - ): - BaseException.__setattr__(self, name, value) - return - - raise FrozenInstanceError - - -def _frozen_delattrs(self, name): - """ - Attached to frozen classes as __delattr__. - """ - if isinstance(self, BaseException) and name in ("__notes__",): - BaseException.__delattr__(self, name) - return - - raise FrozenInstanceError - - -def evolve(*args, **changes): - """ - Create a new instance, based on the first positional argument with - *changes* applied. - - .. tip:: - - On Python 3.13 and later, you can also use `copy.replace` instead. - - Args: - - inst: - Instance of a class with *attrs* attributes. *inst* must be passed - as a positional argument. - - changes: - Keyword changes in the new copy. - - Returns: - A copy of inst with *changes* incorporated. - - Raises: - TypeError: - If *attr_name* couldn't be found in the class ``__init__``. - - attrs.exceptions.NotAnAttrsClassError: - If *cls* is not an *attrs* class. - - .. versionadded:: 17.1.0 - .. deprecated:: 23.1.0 - It is now deprecated to pass the instance using the keyword argument - *inst*. It will raise a warning until at least April 2024, after which - it will become an error. Always pass the instance as a positional - argument. - .. versionchanged:: 24.1.0 - *inst* can't be passed as a keyword argument anymore. - """ - try: - (inst,) = args - except ValueError: - msg = ( - f"evolve() takes 1 positional argument, but {len(args)} were given" - ) - raise TypeError(msg) from None - - cls = inst.__class__ - attrs = fields(cls) - for a in attrs: - if not a.init: - continue - attr_name = a.name # To deal with private attributes. - init_name = a.alias - if init_name not in changes: - changes[init_name] = getattr(inst, attr_name) - - return cls(**changes) - - -class _ClassBuilder: - """ - Iteratively build *one* class. - """ - - __slots__ = ( - "_add_method_dunders", - "_attr_names", - "_attrs", - "_base_attr_map", - "_base_names", - "_cache_hash", - "_cls", - "_cls_dict", - "_delete_attribs", - "_frozen", - "_has_custom_setattr", - "_has_post_init", - "_has_pre_init", - "_is_exc", - "_on_setattr", - "_pre_init_has_args", - "_repr_added", - "_script_snippets", - "_slots", - "_weakref_slot", - "_wrote_own_setattr", - ) - - def __init__( - self, - cls: type, - these, - slots, - frozen, - weakref_slot, - getstate_setstate, - auto_attribs, - kw_only, - cache_hash, - is_exc, - collect_by_mro, - on_setattr, - has_custom_setattr, - field_transformer, - ): - attrs, base_attrs, base_map = _transform_attrs( - cls, - these, - auto_attribs, - kw_only, - collect_by_mro, - field_transformer, - ) - - self._cls = cls - self._cls_dict = dict(cls.__dict__) if slots else {} - self._attrs = attrs - self._base_names = {a.name for a in base_attrs} - self._base_attr_map = base_map - self._attr_names = tuple(a.name for a in attrs) - self._slots = slots - self._frozen = frozen - self._weakref_slot = weakref_slot - self._cache_hash = cache_hash - self._has_pre_init = bool(getattr(cls, "__attrs_pre_init__", False)) - self._pre_init_has_args = False - if self._has_pre_init: - # Check if the pre init method has more arguments than just `self` - # We want to pass arguments if pre init expects arguments - pre_init_func = cls.__attrs_pre_init__ - pre_init_signature = inspect.signature(pre_init_func) - self._pre_init_has_args = len(pre_init_signature.parameters) > 1 - self._has_post_init = bool(getattr(cls, "__attrs_post_init__", False)) - self._delete_attribs = not bool(these) - self._is_exc = is_exc - self._on_setattr = on_setattr - - self._has_custom_setattr = has_custom_setattr - self._wrote_own_setattr = False - - self._cls_dict["__attrs_attrs__"] = self._attrs - - if frozen: - self._cls_dict["__setattr__"] = _frozen_setattrs - self._cls_dict["__delattr__"] = _frozen_delattrs - - self._wrote_own_setattr = True - elif on_setattr in ( - _DEFAULT_ON_SETATTR, - setters.validate, - setters.convert, - ): - has_validator = has_converter = False - for a in attrs: - if a.validator is not None: - has_validator = True - if a.converter is not None: - has_converter = True - - if has_validator and has_converter: - break - if ( - ( - on_setattr == _DEFAULT_ON_SETATTR - and not (has_validator or has_converter) - ) - or (on_setattr == setters.validate and not has_validator) - or (on_setattr == setters.convert and not has_converter) - ): - # If class-level on_setattr is set to convert + validate, but - # there's no field to convert or validate, pretend like there's - # no on_setattr. - self._on_setattr = None - - if getstate_setstate: - ( - self._cls_dict["__getstate__"], - self._cls_dict["__setstate__"], - ) = self._make_getstate_setstate() - - # tuples of script, globs, hook - self._script_snippets: list[ - tuple[str, dict, Callable[[dict, dict], Any]] - ] = [] - self._repr_added = False - - # We want to only do this check once; in 99.9% of cases these - # exist. - if not hasattr(self._cls, "__module__") or not hasattr( - self._cls, "__qualname__" - ): - self._add_method_dunders = self._add_method_dunders_safe - else: - self._add_method_dunders = self._add_method_dunders_unsafe - - def __repr__(self): - return f"<_ClassBuilder(cls={self._cls.__name__})>" - - def _eval_snippets(self) -> None: - """ - Evaluate any registered snippets in one go. - """ - script = "\n".join([snippet[0] for snippet in self._script_snippets]) - globs = {} - for _, snippet_globs, _ in self._script_snippets: - globs.update(snippet_globs) - - locs = _linecache_and_compile( - script, - _generate_unique_filename(self._cls, "methods"), - globs, - ) - - for _, _, hook in self._script_snippets: - hook(self._cls_dict, locs) - - def build_class(self): - """ - Finalize class based on the accumulated configuration. - - Builder cannot be used after calling this method. - """ - self._eval_snippets() - if self._slots is True: - cls = self._create_slots_class() - else: - cls = self._patch_original_class() - if PY_3_10_PLUS: - cls = abc.update_abstractmethods(cls) - - # The method gets only called if it's not inherited from a base class. - # _has_own_attribute does NOT work properly for classmethods. - if ( - getattr(cls, "__attrs_init_subclass__", None) - and "__attrs_init_subclass__" not in cls.__dict__ - ): - cls.__attrs_init_subclass__() - - return cls - - def _patch_original_class(self): - """ - Apply accumulated methods and return the class. - """ - cls = self._cls - base_names = self._base_names - - # Clean class of attribute definitions (`attr.ib()`s). - if self._delete_attribs: - for name in self._attr_names: - if ( - name not in base_names - and getattr(cls, name, _SENTINEL) is not _SENTINEL - ): - # An AttributeError can happen if a base class defines a - # class variable and we want to set an attribute with the - # same name by using only a type annotation. - with contextlib.suppress(AttributeError): - delattr(cls, name) - - # Attach our dunder methods. - for name, value in self._cls_dict.items(): - setattr(cls, name, value) - - # If we've inherited an attrs __setattr__ and don't write our own, - # reset it to object's. - if not self._wrote_own_setattr and getattr( - cls, "__attrs_own_setattr__", False - ): - cls.__attrs_own_setattr__ = False - - if not self._has_custom_setattr: - cls.__setattr__ = _OBJ_SETATTR - - return cls - - def _create_slots_class(self): - """ - Build and return a new class with a `__slots__` attribute. - """ - cd = { - k: v - for k, v in self._cls_dict.items() - if k not in (*tuple(self._attr_names), "__dict__", "__weakref__") - } - - # If our class doesn't have its own implementation of __setattr__ - # (either from the user or by us), check the bases, if one of them has - # an attrs-made __setattr__, that needs to be reset. We don't walk the - # MRO because we only care about our immediate base classes. - # XXX: This can be confused by subclassing a slotted attrs class with - # XXX: a non-attrs class and subclass the resulting class with an attrs - # XXX: class. See `test_slotted_confused` for details. For now that's - # XXX: OK with us. - if not self._wrote_own_setattr: - cd["__attrs_own_setattr__"] = False - - if not self._has_custom_setattr: - for base_cls in self._cls.__bases__: - if base_cls.__dict__.get("__attrs_own_setattr__", False): - cd["__setattr__"] = _OBJ_SETATTR - break - - # Traverse the MRO to collect existing slots - # and check for an existing __weakref__. - existing_slots = {} - weakref_inherited = False - for base_cls in self._cls.__mro__[1:-1]: - if base_cls.__dict__.get("__weakref__", None) is not None: - weakref_inherited = True - existing_slots.update( - { - name: getattr(base_cls, name) - for name in getattr(base_cls, "__slots__", []) - } - ) - - base_names = set(self._base_names) - - names = self._attr_names - if ( - self._weakref_slot - and "__weakref__" not in getattr(self._cls, "__slots__", ()) - and "__weakref__" not in names - and not weakref_inherited - ): - names += ("__weakref__",) - - cached_properties = { - name: cached_prop.func - for name, cached_prop in cd.items() - if isinstance(cached_prop, cached_property) - } - - # Collect methods with a `__class__` reference that are shadowed in the new class. - # To know to update them. - additional_closure_functions_to_update = [] - if cached_properties: - class_annotations = _get_annotations(self._cls) - for name, func in cached_properties.items(): - # Add cached properties to names for slotting. - names += (name,) - # Clear out function from class to avoid clashing. - del cd[name] - additional_closure_functions_to_update.append(func) - annotation = inspect.signature(func).return_annotation - if annotation is not inspect.Parameter.empty: - class_annotations[name] = annotation - - original_getattr = cd.get("__getattr__") - if original_getattr is not None: - additional_closure_functions_to_update.append(original_getattr) - - cd["__getattr__"] = _make_cached_property_getattr( - cached_properties, original_getattr, self._cls - ) - - # We only add the names of attributes that aren't inherited. - # Setting __slots__ to inherited attributes wastes memory. - slot_names = [name for name in names if name not in base_names] - - # There are slots for attributes from current class - # that are defined in parent classes. - # As their descriptors may be overridden by a child class, - # we collect them here and update the class dict - reused_slots = { - slot: slot_descriptor - for slot, slot_descriptor in existing_slots.items() - if slot in slot_names - } - slot_names = [name for name in slot_names if name not in reused_slots] - cd.update(reused_slots) - if self._cache_hash: - slot_names.append(_HASH_CACHE_FIELD) - - cd["__slots__"] = tuple(slot_names) - - cd["__qualname__"] = self._cls.__qualname__ - - # Create new class based on old class and our methods. - cls = type(self._cls)(self._cls.__name__, self._cls.__bases__, cd) - - # The following is a fix for - # <https://github.com/python-attrs/attrs/issues/102>. - # If a method mentions `__class__` or uses the no-arg super(), the - # compiler will bake a reference to the class in the method itself - # as `method.__closure__`. Since we replace the class with a - # clone, we rewrite these references so it keeps working. - for item in itertools.chain( - cls.__dict__.values(), additional_closure_functions_to_update - ): - if isinstance(item, (classmethod, staticmethod)): - # Class- and staticmethods hide their functions inside. - # These might need to be rewritten as well. - closure_cells = getattr(item.__func__, "__closure__", None) - elif isinstance(item, property): - # Workaround for property `super()` shortcut (PY3-only). - # There is no universal way for other descriptors. - closure_cells = getattr(item.fget, "__closure__", None) - else: - closure_cells = getattr(item, "__closure__", None) - - if not closure_cells: # Catch None or the empty list. - continue - for cell in closure_cells: - try: - match = cell.cell_contents is self._cls - except ValueError: # noqa: PERF203 - # ValueError: Cell is empty - pass - else: - if match: - cell.cell_contents = cls - return cls - - def add_repr(self, ns): - script, globs = _make_repr_script(self._attrs, ns) - - def _attach_repr(cls_dict, globs): - cls_dict["__repr__"] = self._add_method_dunders(globs["__repr__"]) - - self._script_snippets.append((script, globs, _attach_repr)) - self._repr_added = True - return self - - def add_str(self): - if not self._repr_added: - msg = "__str__ can only be generated if a __repr__ exists." - raise ValueError(msg) - - def __str__(self): - return self.__repr__() - - self._cls_dict["__str__"] = self._add_method_dunders(__str__) - return self - - def _make_getstate_setstate(self): - """ - Create custom __setstate__ and __getstate__ methods. - """ - # __weakref__ is not writable. - state_attr_names = tuple( - an for an in self._attr_names if an != "__weakref__" - ) - - def slots_getstate(self): - """ - Automatically created by attrs. - """ - return {name: getattr(self, name) for name in state_attr_names} - - hash_caching_enabled = self._cache_hash - - def slots_setstate(self, state): - """ - Automatically created by attrs. - """ - __bound_setattr = _OBJ_SETATTR.__get__(self) - if isinstance(state, tuple): - # Backward compatibility with attrs instances pickled with - # attrs versions before v22.2.0 which stored tuples. - for name, value in zip(state_attr_names, state): - __bound_setattr(name, value) - else: - for name in state_attr_names: - if name in state: - __bound_setattr(name, state[name]) - - # The hash code cache is not included when the object is - # serialized, but it still needs to be initialized to None to - # indicate that the first call to __hash__ should be a cache - # miss. - if hash_caching_enabled: - __bound_setattr(_HASH_CACHE_FIELD, None) - - return slots_getstate, slots_setstate - - def make_unhashable(self): - self._cls_dict["__hash__"] = None - return self - - def add_hash(self): - script, globs = _make_hash_script( - self._cls, - self._attrs, - frozen=self._frozen, - cache_hash=self._cache_hash, - ) - - def attach_hash(cls_dict: dict, locs: dict) -> None: - cls_dict["__hash__"] = self._add_method_dunders(locs["__hash__"]) - - self._script_snippets.append((script, globs, attach_hash)) - - return self - - def add_init(self): - script, globs, annotations = _make_init_script( - self._cls, - self._attrs, - self._has_pre_init, - self._pre_init_has_args, - self._has_post_init, - self._frozen, - self._slots, - self._cache_hash, - self._base_attr_map, - self._is_exc, - self._on_setattr, - attrs_init=False, - ) - - def _attach_init(cls_dict, globs): - init = globs["__init__"] - init.__annotations__ = annotations - cls_dict["__init__"] = self._add_method_dunders(init) - - self._script_snippets.append((script, globs, _attach_init)) - - return self - - def add_replace(self): - self._cls_dict["__replace__"] = self._add_method_dunders( - lambda self, **changes: evolve(self, **changes) - ) - return self - - def add_match_args(self): - self._cls_dict["__match_args__"] = tuple( - field.name - for field in self._attrs - if field.init and not field.kw_only - ) - - def add_attrs_init(self): - script, globs, annotations = _make_init_script( - self._cls, - self._attrs, - self._has_pre_init, - self._pre_init_has_args, - self._has_post_init, - self._frozen, - self._slots, - self._cache_hash, - self._base_attr_map, - self._is_exc, - self._on_setattr, - attrs_init=True, - ) - - def _attach_attrs_init(cls_dict, globs): - init = globs["__attrs_init__"] - init.__annotations__ = annotations - cls_dict["__attrs_init__"] = self._add_method_dunders(init) - - self._script_snippets.append((script, globs, _attach_attrs_init)) - - return self - - def add_eq(self): - cd = self._cls_dict - - script, globs = _make_eq_script(self._attrs) - - def _attach_eq(cls_dict, globs): - cls_dict["__eq__"] = self._add_method_dunders(globs["__eq__"]) - - self._script_snippets.append((script, globs, _attach_eq)) - - cd["__ne__"] = __ne__ - - return self - - def add_order(self): - cd = self._cls_dict - - cd["__lt__"], cd["__le__"], cd["__gt__"], cd["__ge__"] = ( - self._add_method_dunders(meth) - for meth in _make_order(self._cls, self._attrs) - ) - - return self - - def add_setattr(self): - sa_attrs = {} - for a in self._attrs: - on_setattr = a.on_setattr or self._on_setattr - if on_setattr and on_setattr is not setters.NO_OP: - sa_attrs[a.name] = a, on_setattr - - if not sa_attrs: - return self - - if self._has_custom_setattr: - # We need to write a __setattr__ but there already is one! - msg = "Can't combine custom __setattr__ with on_setattr hooks." - raise ValueError(msg) - - # docstring comes from _add_method_dunders - def __setattr__(self, name, val): - try: - a, hook = sa_attrs[name] - except KeyError: - nval = val - else: - nval = hook(self, a, val) - - _OBJ_SETATTR(self, name, nval) - - self._cls_dict["__attrs_own_setattr__"] = True - self._cls_dict["__setattr__"] = self._add_method_dunders(__setattr__) - self._wrote_own_setattr = True - - return self - - def _add_method_dunders_unsafe(self, method: Callable) -> Callable: - """ - Add __module__ and __qualname__ to a *method*. - """ - method.__module__ = self._cls.__module__ - - method.__qualname__ = f"{self._cls.__qualname__}.{method.__name__}" - - method.__doc__ = ( - f"Method generated by attrs for class {self._cls.__qualname__}." - ) - - return method - - def _add_method_dunders_safe(self, method: Callable) -> Callable: - """ - Add __module__ and __qualname__ to a *method* if possible. - """ - with contextlib.suppress(AttributeError): - method.__module__ = self._cls.__module__ - - with contextlib.suppress(AttributeError): - method.__qualname__ = f"{self._cls.__qualname__}.{method.__name__}" - - with contextlib.suppress(AttributeError): - method.__doc__ = f"Method generated by attrs for class {self._cls.__qualname__}." - - return method - - -def _determine_attrs_eq_order(cmp, eq, order, default_eq): - """ - Validate the combination of *cmp*, *eq*, and *order*. Derive the effective - values of eq and order. If *eq* is None, set it to *default_eq*. - """ - if cmp is not None and any((eq is not None, order is not None)): - msg = "Don't mix `cmp` with `eq' and `order`." - raise ValueError(msg) - - # cmp takes precedence due to bw-compatibility. - if cmp is not None: - return cmp, cmp - - # If left None, equality is set to the specified default and ordering - # mirrors equality. - if eq is None: - eq = default_eq - - if order is None: - order = eq - - if eq is False and order is True: - msg = "`order` can only be True if `eq` is True too." - raise ValueError(msg) - - return eq, order - - -def _determine_attrib_eq_order(cmp, eq, order, default_eq): - """ - Validate the combination of *cmp*, *eq*, and *order*. Derive the effective - values of eq and order. If *eq* is None, set it to *default_eq*. - """ - if cmp is not None and any((eq is not None, order is not None)): - msg = "Don't mix `cmp` with `eq' and `order`." - raise ValueError(msg) - - def decide_callable_or_boolean(value): - """ - Decide whether a key function is used. - """ - if callable(value): - value, key = True, value - else: - key = None - return value, key - - # cmp takes precedence due to bw-compatibility. - if cmp is not None: - cmp, cmp_key = decide_callable_or_boolean(cmp) - return cmp, cmp_key, cmp, cmp_key - - # If left None, equality is set to the specified default and ordering - # mirrors equality. - if eq is None: - eq, eq_key = default_eq, None - else: - eq, eq_key = decide_callable_or_boolean(eq) - - if order is None: - order, order_key = eq, eq_key - else: - order, order_key = decide_callable_or_boolean(order) - - if eq is False and order is True: - msg = "`order` can only be True if `eq` is True too." - raise ValueError(msg) - - return eq, eq_key, order, order_key - - -def _determine_whether_to_implement( - cls, flag, auto_detect, dunders, default=True -): - """ - Check whether we should implement a set of methods for *cls*. - - *flag* is the argument passed into @attr.s like 'init', *auto_detect* the - same as passed into @attr.s and *dunders* is a tuple of attribute names - whose presence signal that the user has implemented it themselves. - - Return *default* if no reason for either for or against is found. - """ - if flag is True or flag is False: - return flag - - if flag is None and auto_detect is False: - return default - - # Logically, flag is None and auto_detect is True here. - for dunder in dunders: - if _has_own_attribute(cls, dunder): - return False - - return default - - -def attrs( - maybe_cls=None, - these=None, - repr_ns=None, - repr=None, - cmp=None, - hash=None, - init=None, - slots=False, - frozen=False, - weakref_slot=True, - str=False, - auto_attribs=False, - kw_only=False, - cache_hash=False, - auto_exc=False, - eq=None, - order=None, - auto_detect=False, - collect_by_mro=False, - getstate_setstate=None, - on_setattr=None, - field_transformer=None, - match_args=True, - unsafe_hash=None, -): - r""" - A class decorator that adds :term:`dunder methods` according to the - specified attributes using `attr.ib` or the *these* argument. - - Consider using `attrs.define` / `attrs.frozen` in new code (``attr.s`` will - *never* go away, though). - - Args: - repr_ns (str): - When using nested classes, there was no way in Python 2 to - automatically detect that. This argument allows to set a custom - name for a more meaningful ``repr`` output. This argument is - pointless in Python 3 and is therefore deprecated. - - .. caution:: - Refer to `attrs.define` for the rest of the parameters, but note that they - can have different defaults. - - Notably, leaving *on_setattr* as `None` will **not** add any hooks. - - .. versionadded:: 16.0.0 *slots* - .. versionadded:: 16.1.0 *frozen* - .. versionadded:: 16.3.0 *str* - .. versionadded:: 16.3.0 Support for ``__attrs_post_init__``. - .. versionchanged:: 17.1.0 - *hash* supports `None` as value which is also the default now. - .. versionadded:: 17.3.0 *auto_attribs* - .. versionchanged:: 18.1.0 - If *these* is passed, no attributes are deleted from the class body. - .. versionchanged:: 18.1.0 If *these* is ordered, the order is retained. - .. versionadded:: 18.2.0 *weakref_slot* - .. deprecated:: 18.2.0 - ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` now raise a - `DeprecationWarning` if the classes compared are subclasses of - each other. ``__eq`` and ``__ne__`` never tried to compared subclasses - to each other. - .. versionchanged:: 19.2.0 - ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` now do not consider - subclasses comparable anymore. - .. versionadded:: 18.2.0 *kw_only* - .. versionadded:: 18.2.0 *cache_hash* - .. versionadded:: 19.1.0 *auto_exc* - .. deprecated:: 19.2.0 *cmp* Removal on or after 2021-06-01. - .. versionadded:: 19.2.0 *eq* and *order* - .. versionadded:: 20.1.0 *auto_detect* - .. versionadded:: 20.1.0 *collect_by_mro* - .. versionadded:: 20.1.0 *getstate_setstate* - .. versionadded:: 20.1.0 *on_setattr* - .. versionadded:: 20.3.0 *field_transformer* - .. versionchanged:: 21.1.0 - ``init=False`` injects ``__attrs_init__`` - .. versionchanged:: 21.1.0 Support for ``__attrs_pre_init__`` - .. versionchanged:: 21.1.0 *cmp* undeprecated - .. versionadded:: 21.3.0 *match_args* - .. versionadded:: 22.2.0 - *unsafe_hash* as an alias for *hash* (for :pep:`681` compliance). - .. deprecated:: 24.1.0 *repr_ns* - .. versionchanged:: 24.1.0 - Instances are not compared as tuples of attributes anymore, but using a - big ``and`` condition. This is faster and has more correct behavior for - uncomparable values like `math.nan`. - .. versionadded:: 24.1.0 - If a class has an *inherited* classmethod called - ``__attrs_init_subclass__``, it is executed after the class is created. - .. deprecated:: 24.1.0 *hash* is deprecated in favor of *unsafe_hash*. - """ - if repr_ns is not None: - import warnings - - warnings.warn( - DeprecationWarning( - "The `repr_ns` argument is deprecated and will be removed in or after August 2025." - ), - stacklevel=2, - ) - - eq_, order_ = _determine_attrs_eq_order(cmp, eq, order, None) - - # unsafe_hash takes precedence due to PEP 681. - if unsafe_hash is not None: - hash = unsafe_hash - - if isinstance(on_setattr, (list, tuple)): - on_setattr = setters.pipe(*on_setattr) - - def wrap(cls): - is_frozen = frozen or _has_frozen_base_class(cls) - is_exc = auto_exc is True and issubclass(cls, BaseException) - has_own_setattr = auto_detect and _has_own_attribute( - cls, "__setattr__" - ) - - if has_own_setattr and is_frozen: - msg = "Can't freeze a class with a custom __setattr__." - raise ValueError(msg) - - builder = _ClassBuilder( - cls, - these, - slots, - is_frozen, - weakref_slot, - _determine_whether_to_implement( - cls, - getstate_setstate, - auto_detect, - ("__getstate__", "__setstate__"), - default=slots, - ), - auto_attribs, - kw_only, - cache_hash, - is_exc, - collect_by_mro, - on_setattr, - has_own_setattr, - field_transformer, - ) - - if _determine_whether_to_implement( - cls, repr, auto_detect, ("__repr__",) - ): - builder.add_repr(repr_ns) - - if str is True: - builder.add_str() - - eq = _determine_whether_to_implement( - cls, eq_, auto_detect, ("__eq__", "__ne__") - ) - if not is_exc and eq is True: - builder.add_eq() - if not is_exc and _determine_whether_to_implement( - cls, order_, auto_detect, ("__lt__", "__le__", "__gt__", "__ge__") - ): - builder.add_order() - - if not frozen: - builder.add_setattr() - - nonlocal hash - if ( - hash is None - and auto_detect is True - and _has_own_attribute(cls, "__hash__") - ): - hash = False - - if hash is not True and hash is not False and hash is not None: - # Can't use `hash in` because 1 == True for example. - msg = "Invalid value for hash. Must be True, False, or None." - raise TypeError(msg) - - if hash is False or (hash is None and eq is False) or is_exc: - # Don't do anything. Should fall back to __object__'s __hash__ - # which is by id. - if cache_hash: - msg = "Invalid value for cache_hash. To use hash caching, hashing must be either explicitly or implicitly enabled." - raise TypeError(msg) - elif hash is True or ( - hash is None and eq is True and is_frozen is True - ): - # Build a __hash__ if told so, or if it's safe. - builder.add_hash() - else: - # Raise TypeError on attempts to hash. - if cache_hash: - msg = "Invalid value for cache_hash. To use hash caching, hashing must be either explicitly or implicitly enabled." - raise TypeError(msg) - builder.make_unhashable() - - if _determine_whether_to_implement( - cls, init, auto_detect, ("__init__",) - ): - builder.add_init() - else: - builder.add_attrs_init() - if cache_hash: - msg = "Invalid value for cache_hash. To use hash caching, init must be True." - raise TypeError(msg) - - if PY_3_13_PLUS and not _has_own_attribute(cls, "__replace__"): - builder.add_replace() - - if ( - PY_3_10_PLUS - and match_args - and not _has_own_attribute(cls, "__match_args__") - ): - builder.add_match_args() - - return builder.build_class() - - # maybe_cls's type depends on the usage of the decorator. It's a class - # if it's used as `@attrs` but `None` if used as `@attrs()`. - if maybe_cls is None: - return wrap - - return wrap(maybe_cls) - - -_attrs = attrs -""" -Internal alias so we can use it in functions that take an argument called -*attrs*. -""" - - -def _has_frozen_base_class(cls): - """ - Check whether *cls* has a frozen ancestor by looking at its - __setattr__. - """ - return cls.__setattr__ is _frozen_setattrs - - -def _generate_unique_filename(cls: type, func_name: str) -> str: - """ - Create a "filename" suitable for a function being generated. - """ - return ( - f"<attrs generated {func_name} {cls.__module__}." - f"{getattr(cls, '__qualname__', cls.__name__)}>" - ) - - -def _make_hash_script( - cls: type, attrs: list[Attribute], frozen: bool, cache_hash: bool -) -> tuple[str, dict]: - attrs = tuple( - a for a in attrs if a.hash is True or (a.hash is None and a.eq is True) - ) - - tab = " " - - type_hash = hash(_generate_unique_filename(cls, "hash")) - # If eq is custom generated, we need to include the functions in globs - globs = {} - - hash_def = "def __hash__(self" - hash_func = "hash((" - closing_braces = "))" - if not cache_hash: - hash_def += "):" - else: - hash_def += ", *" - - hash_def += ", _cache_wrapper=__import__('attr._make')._make._CacheHashWrapper):" - hash_func = "_cache_wrapper(" + hash_func - closing_braces += ")" - - method_lines = [hash_def] - - def append_hash_computation_lines(prefix, indent): - """ - Generate the code for actually computing the hash code. - Below this will either be returned directly or used to compute - a value which is then cached, depending on the value of cache_hash - """ - - method_lines.extend( - [ - indent + prefix + hash_func, - indent + f" {type_hash},", - ] - ) - - for a in attrs: - if a.eq_key: - cmp_name = f"_{a.name}_key" - globs[cmp_name] = a.eq_key - method_lines.append( - indent + f" {cmp_name}(self.{a.name})," - ) - else: - method_lines.append(indent + f" self.{a.name},") - - method_lines.append(indent + " " + closing_braces) - - if cache_hash: - method_lines.append(tab + f"if self.{_HASH_CACHE_FIELD} is None:") - if frozen: - append_hash_computation_lines( - f"object.__setattr__(self, '{_HASH_CACHE_FIELD}', ", tab * 2 - ) - method_lines.append(tab * 2 + ")") # close __setattr__ - else: - append_hash_computation_lines( - f"self.{_HASH_CACHE_FIELD} = ", tab * 2 - ) - method_lines.append(tab + f"return self.{_HASH_CACHE_FIELD}") - else: - append_hash_computation_lines("return ", tab) - - script = "\n".join(method_lines) - return script, globs - - -def _add_hash(cls: type, attrs: list[Attribute]): - """ - Add a hash method to *cls*. - """ - script, globs = _make_hash_script( - cls, attrs, frozen=False, cache_hash=False - ) - _compile_and_eval( - script, globs, filename=_generate_unique_filename(cls, "__hash__") - ) - cls.__hash__ = globs["__hash__"] - return cls - - -def __ne__(self, other): - """ - Check equality and either forward a NotImplemented or - return the result negated. - """ - result = self.__eq__(other) - if result is NotImplemented: - return NotImplemented - - return not result - - -def _make_eq_script(attrs: list) -> tuple[str, dict]: - """ - Create __eq__ method for *cls* with *attrs*. - """ - attrs = [a for a in attrs if a.eq] - - lines = [ - "def __eq__(self, other):", - " if other.__class__ is not self.__class__:", - " return NotImplemented", - ] - - globs = {} - if attrs: - lines.append(" return (") - for a in attrs: - if a.eq_key: - cmp_name = f"_{a.name}_key" - # Add the key function to the global namespace - # of the evaluated function. - globs[cmp_name] = a.eq_key - lines.append( - f" {cmp_name}(self.{a.name}) == {cmp_name}(other.{a.name})" - ) - else: - lines.append(f" self.{a.name} == other.{a.name}") - if a is not attrs[-1]: - lines[-1] = f"{lines[-1]} and" - lines.append(" )") - else: - lines.append(" return True") - - script = "\n".join(lines) - - return script, globs - - -def _make_order(cls, attrs): - """ - Create ordering methods for *cls* with *attrs*. - """ - attrs = [a for a in attrs if a.order] - - def attrs_to_tuple(obj): - """ - Save us some typing. - """ - return tuple( - key(value) if key else value - for value, key in ( - (getattr(obj, a.name), a.order_key) for a in attrs - ) - ) - - def __lt__(self, other): - """ - Automatically created by attrs. - """ - if other.__class__ is self.__class__: - return attrs_to_tuple(self) < attrs_to_tuple(other) - - return NotImplemented - - def __le__(self, other): - """ - Automatically created by attrs. - """ - if other.__class__ is self.__class__: - return attrs_to_tuple(self) <= attrs_to_tuple(other) - - return NotImplemented - - def __gt__(self, other): - """ - Automatically created by attrs. - """ - if other.__class__ is self.__class__: - return attrs_to_tuple(self) > attrs_to_tuple(other) - - return NotImplemented - - def __ge__(self, other): - """ - Automatically created by attrs. - """ - if other.__class__ is self.__class__: - return attrs_to_tuple(self) >= attrs_to_tuple(other) - - return NotImplemented - - return __lt__, __le__, __gt__, __ge__ - - -def _add_eq(cls, attrs=None): - """ - Add equality methods to *cls* with *attrs*. - """ - if attrs is None: - attrs = cls.__attrs_attrs__ - - script, globs = _make_eq_script(attrs) - _compile_and_eval( - script, globs, filename=_generate_unique_filename(cls, "__eq__") - ) - cls.__eq__ = globs["__eq__"] - cls.__ne__ = __ne__ - - return cls - - -def _make_repr_script(attrs, ns) -> tuple[str, dict]: - """ - Create the source and globs for a __repr__ and return it. - """ - # Figure out which attributes to include, and which function to use to - # format them. The a.repr value can be either bool or a custom - # callable. - attr_names_with_reprs = tuple( - (a.name, (repr if a.repr is True else a.repr), a.init) - for a in attrs - if a.repr is not False - ) - globs = { - name + "_repr": r for name, r, _ in attr_names_with_reprs if r != repr - } - globs["_compat"] = _compat - globs["AttributeError"] = AttributeError - globs["NOTHING"] = NOTHING - attribute_fragments = [] - for name, r, i in attr_names_with_reprs: - accessor = ( - "self." + name if i else 'getattr(self, "' + name + '", NOTHING)' - ) - fragment = ( - "%s={%s!r}" % (name, accessor) - if r == repr - else "%s={%s_repr(%s)}" % (name, name, accessor) - ) - attribute_fragments.append(fragment) - repr_fragment = ", ".join(attribute_fragments) - - if ns is None: - cls_name_fragment = '{self.__class__.__qualname__.rsplit(">.", 1)[-1]}' - else: - cls_name_fragment = ns + ".{self.__class__.__name__}" - - lines = [ - "def __repr__(self):", - " try:", - " already_repring = _compat.repr_context.already_repring", - " except AttributeError:", - " already_repring = {id(self),}", - " _compat.repr_context.already_repring = already_repring", - " else:", - " if id(self) in already_repring:", - " return '...'", - " else:", - " already_repring.add(id(self))", - " try:", - f" return f'{cls_name_fragment}({repr_fragment})'", - " finally:", - " already_repring.remove(id(self))", - ] - - return "\n".join(lines), globs - - -def _add_repr(cls, ns=None, attrs=None): - """ - Add a repr method to *cls*. - """ - if attrs is None: - attrs = cls.__attrs_attrs__ - - script, globs = _make_repr_script(attrs, ns) - _compile_and_eval( - script, globs, filename=_generate_unique_filename(cls, "__repr__") - ) - cls.__repr__ = globs["__repr__"] - return cls - - -def fields(cls): - """ - Return the tuple of *attrs* attributes for a class. - - The tuple also allows accessing the fields by their names (see below for - examples). - - Args: - cls (type): Class to introspect. - - Raises: - TypeError: If *cls* is not a class. - - attrs.exceptions.NotAnAttrsClassError: - If *cls* is not an *attrs* class. - - Returns: - tuple (with name accessors) of `attrs.Attribute` - - .. versionchanged:: 16.2.0 Returned tuple allows accessing the fields - by name. - .. versionchanged:: 23.1.0 Add support for generic classes. - """ - generic_base = get_generic_base(cls) - - if generic_base is None and not isinstance(cls, type): - msg = "Passed object must be a class." - raise TypeError(msg) - - attrs = getattr(cls, "__attrs_attrs__", None) - - if attrs is None: - if generic_base is not None: - attrs = getattr(generic_base, "__attrs_attrs__", None) - if attrs is not None: - # Even though this is global state, stick it on here to speed - # it up. We rely on `cls` being cached for this to be - # efficient. - cls.__attrs_attrs__ = attrs - return attrs - msg = f"{cls!r} is not an attrs-decorated class." - raise NotAnAttrsClassError(msg) - - return attrs - - -def fields_dict(cls): - """ - Return an ordered dictionary of *attrs* attributes for a class, whose keys - are the attribute names. - - Args: - cls (type): Class to introspect. - - Raises: - TypeError: If *cls* is not a class. - - attrs.exceptions.NotAnAttrsClassError: - If *cls* is not an *attrs* class. - - Returns: - dict[str, attrs.Attribute]: Dict of attribute name to definition - - .. versionadded:: 18.1.0 - """ - if not isinstance(cls, type): - msg = "Passed object must be a class." - raise TypeError(msg) - attrs = getattr(cls, "__attrs_attrs__", None) - if attrs is None: - msg = f"{cls!r} is not an attrs-decorated class." - raise NotAnAttrsClassError(msg) - return {a.name: a for a in attrs} - - -def validate(inst): - """ - Validate all attributes on *inst* that have a validator. - - Leaves all exceptions through. - - Args: - inst: Instance of a class with *attrs* attributes. - """ - if _config._run_validators is False: - return - - for a in fields(inst.__class__): - v = a.validator - if v is not None: - v(inst, a, getattr(inst, a.name)) - - -def _is_slot_attr(a_name, base_attr_map): - """ - Check if the attribute name comes from a slot class. - """ - cls = base_attr_map.get(a_name) - return cls and "__slots__" in cls.__dict__ - - -def _make_init_script( - cls, - attrs, - pre_init, - pre_init_has_args, - post_init, - frozen, - slots, - cache_hash, - base_attr_map, - is_exc, - cls_on_setattr, - attrs_init, -) -> tuple[str, dict, dict]: - has_cls_on_setattr = ( - cls_on_setattr is not None and cls_on_setattr is not setters.NO_OP - ) - - if frozen and has_cls_on_setattr: - msg = "Frozen classes can't use on_setattr." - raise ValueError(msg) - - needs_cached_setattr = cache_hash or frozen - filtered_attrs = [] - attr_dict = {} - for a in attrs: - if not a.init and a.default is NOTHING: - continue - - filtered_attrs.append(a) - attr_dict[a.name] = a - - if a.on_setattr is not None: - if frozen is True: - msg = "Frozen classes can't use on_setattr." - raise ValueError(msg) - - needs_cached_setattr = True - elif has_cls_on_setattr and a.on_setattr is not setters.NO_OP: - needs_cached_setattr = True - - script, globs, annotations = _attrs_to_init_script( - filtered_attrs, - frozen, - slots, - pre_init, - pre_init_has_args, - post_init, - cache_hash, - base_attr_map, - is_exc, - needs_cached_setattr, - has_cls_on_setattr, - "__attrs_init__" if attrs_init else "__init__", - ) - if cls.__module__ in sys.modules: - # This makes typing.get_type_hints(CLS.__init__) resolve string types. - globs.update(sys.modules[cls.__module__].__dict__) - - globs.update({"NOTHING": NOTHING, "attr_dict": attr_dict}) - - if needs_cached_setattr: - # Save the lookup overhead in __init__ if we need to circumvent - # setattr hooks. - globs["_cached_setattr_get"] = _OBJ_SETATTR.__get__ - - return script, globs, annotations - - -def _setattr(attr_name: str, value_var: str, has_on_setattr: bool) -> str: - """ - Use the cached object.setattr to set *attr_name* to *value_var*. - """ - return f"_setattr('{attr_name}', {value_var})" - - -def _setattr_with_converter( - attr_name: str, value_var: str, has_on_setattr: bool, converter: Converter -) -> str: - """ - Use the cached object.setattr to set *attr_name* to *value_var*, but run - its converter first. - """ - return f"_setattr('{attr_name}', {converter._fmt_converter_call(attr_name, value_var)})" - - -def _assign(attr_name: str, value: str, has_on_setattr: bool) -> str: - """ - Unless *attr_name* has an on_setattr hook, use normal assignment. Otherwise - relegate to _setattr. - """ - if has_on_setattr: - return _setattr(attr_name, value, True) - - return f"self.{attr_name} = {value}" - - -def _assign_with_converter( - attr_name: str, value_var: str, has_on_setattr: bool, converter: Converter -) -> str: - """ - Unless *attr_name* has an on_setattr hook, use normal assignment after - conversion. Otherwise relegate to _setattr_with_converter. - """ - if has_on_setattr: - return _setattr_with_converter(attr_name, value_var, True, converter) - - return f"self.{attr_name} = {converter._fmt_converter_call(attr_name, value_var)}" - - -def _determine_setters( - frozen: bool, slots: bool, base_attr_map: dict[str, type] -): - """ - Determine the correct setter functions based on whether a class is frozen - and/or slotted. - """ - if frozen is True: - if slots is True: - return (), _setattr, _setattr_with_converter - - # Dict frozen classes assign directly to __dict__. - # But only if the attribute doesn't come from an ancestor slot - # class. - # Note _inst_dict will be used again below if cache_hash is True - - def fmt_setter( - attr_name: str, value_var: str, has_on_setattr: bool - ) -> str: - if _is_slot_attr(attr_name, base_attr_map): - return _setattr(attr_name, value_var, has_on_setattr) - - return f"_inst_dict['{attr_name}'] = {value_var}" - - def fmt_setter_with_converter( - attr_name: str, - value_var: str, - has_on_setattr: bool, - converter: Converter, - ) -> str: - if has_on_setattr or _is_slot_attr(attr_name, base_attr_map): - return _setattr_with_converter( - attr_name, value_var, has_on_setattr, converter - ) - - return f"_inst_dict['{attr_name}'] = {converter._fmt_converter_call(attr_name, value_var)}" - - return ( - ("_inst_dict = self.__dict__",), - fmt_setter, - fmt_setter_with_converter, - ) - - # Not frozen -- we can just assign directly. - return (), _assign, _assign_with_converter - - -def _attrs_to_init_script( - attrs: list[Attribute], - is_frozen: bool, - is_slotted: bool, - call_pre_init: bool, - pre_init_has_args: bool, - call_post_init: bool, - does_cache_hash: bool, - base_attr_map: dict[str, type], - is_exc: bool, - needs_cached_setattr: bool, - has_cls_on_setattr: bool, - method_name: str, -) -> tuple[str, dict, dict]: - """ - Return a script of an initializer for *attrs*, a dict of globals, and - annotations for the initializer. - - The globals are required by the generated script. - """ - lines = ["self.__attrs_pre_init__()"] if call_pre_init else [] - - if needs_cached_setattr: - lines.append( - # Circumvent the __setattr__ descriptor to save one lookup per - # assignment. Note _setattr will be used again below if - # does_cache_hash is True. - "_setattr = _cached_setattr_get(self)" - ) - - extra_lines, fmt_setter, fmt_setter_with_converter = _determine_setters( - is_frozen, is_slotted, base_attr_map - ) - lines.extend(extra_lines) - - args = [] - kw_only_args = [] - attrs_to_validate = [] - - # This is a dictionary of names to validator and converter callables. - # Injecting this into __init__ globals lets us avoid lookups. - names_for_globals = {} - annotations = {"return": None} - - for a in attrs: - if a.validator: - attrs_to_validate.append(a) - - attr_name = a.name - has_on_setattr = a.on_setattr is not None or ( - a.on_setattr is not setters.NO_OP and has_cls_on_setattr - ) - # a.alias is set to maybe-mangled attr_name in _ClassBuilder if not - # explicitly provided - arg_name = a.alias - - has_factory = isinstance(a.default, Factory) - maybe_self = "self" if has_factory and a.default.takes_self else "" - - if a.converter is not None and not isinstance(a.converter, Converter): - converter = Converter(a.converter) - else: - converter = a.converter - - if a.init is False: - if has_factory: - init_factory_name = _INIT_FACTORY_PAT % (a.name,) - if converter is not None: - lines.append( - fmt_setter_with_converter( - attr_name, - init_factory_name + f"({maybe_self})", - has_on_setattr, - converter, - ) - ) - names_for_globals[converter._get_global_name(a.name)] = ( - converter.converter - ) - else: - lines.append( - fmt_setter( - attr_name, - init_factory_name + f"({maybe_self})", - has_on_setattr, - ) - ) - names_for_globals[init_factory_name] = a.default.factory - elif converter is not None: - lines.append( - fmt_setter_with_converter( - attr_name, - f"attr_dict['{attr_name}'].default", - has_on_setattr, - converter, - ) - ) - names_for_globals[converter._get_global_name(a.name)] = ( - converter.converter - ) - else: - lines.append( - fmt_setter( - attr_name, - f"attr_dict['{attr_name}'].default", - has_on_setattr, - ) - ) - elif a.default is not NOTHING and not has_factory: - arg = f"{arg_name}=attr_dict['{attr_name}'].default" - if a.kw_only: - kw_only_args.append(arg) - else: - args.append(arg) - - if converter is not None: - lines.append( - fmt_setter_with_converter( - attr_name, arg_name, has_on_setattr, converter - ) - ) - names_for_globals[converter._get_global_name(a.name)] = ( - converter.converter - ) - else: - lines.append(fmt_setter(attr_name, arg_name, has_on_setattr)) - - elif has_factory: - arg = f"{arg_name}=NOTHING" - if a.kw_only: - kw_only_args.append(arg) - else: - args.append(arg) - lines.append(f"if {arg_name} is not NOTHING:") - - init_factory_name = _INIT_FACTORY_PAT % (a.name,) - if converter is not None: - lines.append( - " " - + fmt_setter_with_converter( - attr_name, arg_name, has_on_setattr, converter - ) - ) - lines.append("else:") - lines.append( - " " - + fmt_setter_with_converter( - attr_name, - init_factory_name + "(" + maybe_self + ")", - has_on_setattr, - converter, - ) - ) - names_for_globals[converter._get_global_name(a.name)] = ( - converter.converter - ) - else: - lines.append( - " " + fmt_setter(attr_name, arg_name, has_on_setattr) - ) - lines.append("else:") - lines.append( - " " - + fmt_setter( - attr_name, - init_factory_name + "(" + maybe_self + ")", - has_on_setattr, - ) - ) - names_for_globals[init_factory_name] = a.default.factory - else: - if a.kw_only: - kw_only_args.append(arg_name) - else: - args.append(arg_name) - - if converter is not None: - lines.append( - fmt_setter_with_converter( - attr_name, arg_name, has_on_setattr, converter - ) - ) - names_for_globals[converter._get_global_name(a.name)] = ( - converter.converter - ) - else: - lines.append(fmt_setter(attr_name, arg_name, has_on_setattr)) - - if a.init is True: - if a.type is not None and converter is None: - annotations[arg_name] = a.type - elif converter is not None and converter._first_param_type: - # Use the type from the converter if present. - annotations[arg_name] = converter._first_param_type - - if attrs_to_validate: # we can skip this if there are no validators. - names_for_globals["_config"] = _config - lines.append("if _config._run_validators is True:") - for a in attrs_to_validate: - val_name = "__attr_validator_" + a.name - attr_name = "__attr_" + a.name - lines.append(f" {val_name}(self, {attr_name}, self.{a.name})") - names_for_globals[val_name] = a.validator - names_for_globals[attr_name] = a - - if call_post_init: - lines.append("self.__attrs_post_init__()") - - # Because this is set only after __attrs_post_init__ is called, a crash - # will result if post-init tries to access the hash code. This seemed - # preferable to setting this beforehand, in which case alteration to field - # values during post-init combined with post-init accessing the hash code - # would result in silent bugs. - if does_cache_hash: - if is_frozen: - if is_slotted: - init_hash_cache = f"_setattr('{_HASH_CACHE_FIELD}', None)" - else: - init_hash_cache = f"_inst_dict['{_HASH_CACHE_FIELD}'] = None" - else: - init_hash_cache = f"self.{_HASH_CACHE_FIELD} = None" - lines.append(init_hash_cache) - - # For exceptions we rely on BaseException.__init__ for proper - # initialization. - if is_exc: - vals = ",".join(f"self.{a.name}" for a in attrs if a.init) - - lines.append(f"BaseException.__init__(self, {vals})") - - args = ", ".join(args) - pre_init_args = args - if kw_only_args: - # leading comma & kw_only args - args += f"{', ' if args else ''}*, {', '.join(kw_only_args)}" - pre_init_kw_only_args = ", ".join( - [ - f"{kw_arg_name}={kw_arg_name}" - # We need to remove the defaults from the kw_only_args. - for kw_arg_name in (kwa.split("=")[0] for kwa in kw_only_args) - ] - ) - pre_init_args += ", " if pre_init_args else "" - pre_init_args += pre_init_kw_only_args - - if call_pre_init and pre_init_has_args: - # If pre init method has arguments, pass same arguments as `__init__`. - lines[0] = f"self.__attrs_pre_init__({pre_init_args})" - - # Python <3.12 doesn't allow backslashes in f-strings. - NL = "\n " - return ( - f"""def {method_name}(self, {args}): - {NL.join(lines) if lines else "pass"} -""", - names_for_globals, - annotations, - ) - - -def _default_init_alias_for(name: str) -> str: - """ - The default __init__ parameter name for a field. - - This performs private-name adjustment via leading-unscore stripping, - and is the default value of Attribute.alias if not provided. - """ - - return name.lstrip("_") - - -class Attribute: - """ - *Read-only* representation of an attribute. - - .. warning:: - - You should never instantiate this class yourself. - - The class has *all* arguments of `attr.ib` (except for ``factory`` which is - only syntactic sugar for ``default=Factory(...)`` plus the following: - - - ``name`` (`str`): The name of the attribute. - - ``alias`` (`str`): The __init__ parameter name of the attribute, after - any explicit overrides and default private-attribute-name handling. - - ``inherited`` (`bool`): Whether or not that attribute has been inherited - from a base class. - - ``eq_key`` and ``order_key`` (`typing.Callable` or `None`): The - callables that are used for comparing and ordering objects by this - attribute, respectively. These are set by passing a callable to - `attr.ib`'s ``eq``, ``order``, or ``cmp`` arguments. See also - :ref:`comparison customization <custom-comparison>`. - - Instances of this class are frequently used for introspection purposes - like: - - - `fields` returns a tuple of them. - - Validators get them passed as the first argument. - - The :ref:`field transformer <transform-fields>` hook receives a list of - them. - - The ``alias`` property exposes the __init__ parameter name of the field, - with any overrides and default private-attribute handling applied. - - - .. versionadded:: 20.1.0 *inherited* - .. versionadded:: 20.1.0 *on_setattr* - .. versionchanged:: 20.2.0 *inherited* is not taken into account for - equality checks and hashing anymore. - .. versionadded:: 21.1.0 *eq_key* and *order_key* - .. versionadded:: 22.2.0 *alias* - - For the full version history of the fields, see `attr.ib`. - """ - - # These slots must NOT be reordered because we use them later for - # instantiation. - __slots__ = ( # noqa: RUF023 - "name", - "default", - "validator", - "repr", - "eq", - "eq_key", - "order", - "order_key", - "hash", - "init", - "metadata", - "type", - "converter", - "kw_only", - "inherited", - "on_setattr", - "alias", - ) - - def __init__( - self, - name, - default, - validator, - repr, - cmp, # XXX: unused, remove along with other cmp code. - hash, - init, - inherited, - metadata=None, - type=None, - converter=None, - kw_only=False, - eq=None, - eq_key=None, - order=None, - order_key=None, - on_setattr=None, - alias=None, - ): - eq, eq_key, order, order_key = _determine_attrib_eq_order( - cmp, eq_key or eq, order_key or order, True - ) - - # Cache this descriptor here to speed things up later. - bound_setattr = _OBJ_SETATTR.__get__(self) - - # Despite the big red warning, people *do* instantiate `Attribute` - # themselves. - bound_setattr("name", name) - bound_setattr("default", default) - bound_setattr("validator", validator) - bound_setattr("repr", repr) - bound_setattr("eq", eq) - bound_setattr("eq_key", eq_key) - bound_setattr("order", order) - bound_setattr("order_key", order_key) - bound_setattr("hash", hash) - bound_setattr("init", init) - bound_setattr("converter", converter) - bound_setattr( - "metadata", - ( - types.MappingProxyType(dict(metadata)) # Shallow copy - if metadata - else _EMPTY_METADATA_SINGLETON - ), - ) - bound_setattr("type", type) - bound_setattr("kw_only", kw_only) - bound_setattr("inherited", inherited) - bound_setattr("on_setattr", on_setattr) - bound_setattr("alias", alias) - - def __setattr__(self, name, value): - raise FrozenInstanceError - - @classmethod - def from_counting_attr(cls, name: str, ca: _CountingAttr, type=None): - # type holds the annotated value. deal with conflicts: - if type is None: - type = ca.type - elif ca.type is not None: - msg = f"Type annotation and type argument cannot both be present for '{name}'." - raise ValueError(msg) - return cls( - name, - ca._default, - ca._validator, - ca.repr, - None, - ca.hash, - ca.init, - False, - ca.metadata, - type, - ca.converter, - ca.kw_only, - ca.eq, - ca.eq_key, - ca.order, - ca.order_key, - ca.on_setattr, - ca.alias, - ) - - # Don't use attrs.evolve since fields(Attribute) doesn't work - def evolve(self, **changes): - """ - Copy *self* and apply *changes*. - - This works similarly to `attrs.evolve` but that function does not work - with :class:`attrs.Attribute`. - - It is mainly meant to be used for `transform-fields`. - - .. versionadded:: 20.3.0 - """ - new = copy.copy(self) - - new._setattrs(changes.items()) - - return new - - # Don't use _add_pickle since fields(Attribute) doesn't work - def __getstate__(self): - """ - Play nice with pickle. - """ - return tuple( - getattr(self, name) if name != "metadata" else dict(self.metadata) - for name in self.__slots__ - ) - - def __setstate__(self, state): - """ - Play nice with pickle. - """ - self._setattrs(zip(self.__slots__, state)) - - def _setattrs(self, name_values_pairs): - bound_setattr = _OBJ_SETATTR.__get__(self) - for name, value in name_values_pairs: - if name != "metadata": - bound_setattr(name, value) - else: - bound_setattr( - name, - ( - types.MappingProxyType(dict(value)) - if value - else _EMPTY_METADATA_SINGLETON - ), - ) - - -_a = [ - Attribute( - name=name, - default=NOTHING, - validator=None, - repr=True, - cmp=None, - eq=True, - order=False, - hash=(name != "metadata"), - init=True, - inherited=False, - alias=_default_init_alias_for(name), - ) - for name in Attribute.__slots__ -] - -Attribute = _add_hash( - _add_eq( - _add_repr(Attribute, attrs=_a), - attrs=[a for a in _a if a.name != "inherited"], - ), - attrs=[a for a in _a if a.hash and a.name != "inherited"], -) - - -class _CountingAttr: - """ - Intermediate representation of attributes that uses a counter to preserve - the order in which the attributes have been defined. - - *Internal* data structure of the attrs library. Running into is most - likely the result of a bug like a forgotten `@attr.s` decorator. - """ - - __slots__ = ( - "_default", - "_validator", - "alias", - "converter", - "counter", - "eq", - "eq_key", - "hash", - "init", - "kw_only", - "metadata", - "on_setattr", - "order", - "order_key", - "repr", - "type", - ) - __attrs_attrs__ = ( - *tuple( - Attribute( - name=name, - alias=_default_init_alias_for(name), - default=NOTHING, - validator=None, - repr=True, - cmp=None, - hash=True, - init=True, - kw_only=False, - eq=True, - eq_key=None, - order=False, - order_key=None, - inherited=False, - on_setattr=None, - ) - for name in ( - "counter", - "_default", - "repr", - "eq", - "order", - "hash", - "init", - "on_setattr", - "alias", - ) - ), - Attribute( - name="metadata", - alias="metadata", - default=None, - validator=None, - repr=True, - cmp=None, - hash=False, - init=True, - kw_only=False, - eq=True, - eq_key=None, - order=False, - order_key=None, - inherited=False, - on_setattr=None, - ), - ) - cls_counter = 0 - - def __init__( - self, - default, - validator, - repr, - cmp, - hash, - init, - converter, - metadata, - type, - kw_only, - eq, - eq_key, - order, - order_key, - on_setattr, - alias, - ): - _CountingAttr.cls_counter += 1 - self.counter = _CountingAttr.cls_counter - self._default = default - self._validator = validator - self.converter = converter - self.repr = repr - self.eq = eq - self.eq_key = eq_key - self.order = order - self.order_key = order_key - self.hash = hash - self.init = init - self.metadata = metadata - self.type = type - self.kw_only = kw_only - self.on_setattr = on_setattr - self.alias = alias - - def validator(self, meth): - """ - Decorator that adds *meth* to the list of validators. - - Returns *meth* unchanged. - - .. versionadded:: 17.1.0 - """ - if self._validator is None: - self._validator = meth - else: - self._validator = and_(self._validator, meth) - return meth - - def default(self, meth): - """ - Decorator that allows to set the default for an attribute. - - Returns *meth* unchanged. - - Raises: - DefaultAlreadySetError: If default has been set before. - - .. versionadded:: 17.1.0 - """ - if self._default is not NOTHING: - raise DefaultAlreadySetError - - self._default = Factory(meth, takes_self=True) - - return meth - - -_CountingAttr = _add_eq(_add_repr(_CountingAttr)) - - -class Factory: - """ - Stores a factory callable. - - If passed as the default value to `attrs.field`, the factory is used to - generate a new value. - - Args: - factory (typing.Callable): - A callable that takes either none or exactly one mandatory - positional argument depending on *takes_self*. - - takes_self (bool): - Pass the partially initialized instance that is being initialized - as a positional argument. - - .. versionadded:: 17.1.0 *takes_self* - """ - - __slots__ = ("factory", "takes_self") - - def __init__(self, factory, takes_self=False): - self.factory = factory - self.takes_self = takes_self - - def __getstate__(self): - """ - Play nice with pickle. - """ - return tuple(getattr(self, name) for name in self.__slots__) - - def __setstate__(self, state): - """ - Play nice with pickle. - """ - for name, value in zip(self.__slots__, state): - setattr(self, name, value) - - -_f = [ - Attribute( - name=name, - default=NOTHING, - validator=None, - repr=True, - cmp=None, - eq=True, - order=False, - hash=True, - init=True, - inherited=False, - ) - for name in Factory.__slots__ -] - -Factory = _add_hash(_add_eq(_add_repr(Factory, attrs=_f), attrs=_f), attrs=_f) - - -class Converter: - """ - Stores a converter callable. - - Allows for the wrapped converter to take additional arguments. The - arguments are passed in the order they are documented. - - Args: - converter (Callable): A callable that converts the passed value. - - takes_self (bool): - Pass the partially initialized instance that is being initialized - as a positional argument. (default: `False`) - - takes_field (bool): - Pass the field definition (an :class:`Attribute`) into the - converter as a positional argument. (default: `False`) - - .. versionadded:: 24.1.0 - """ - - __slots__ = ( - "__call__", - "_first_param_type", - "_global_name", - "converter", - "takes_field", - "takes_self", - ) - - def __init__(self, converter, *, takes_self=False, takes_field=False): - self.converter = converter - self.takes_self = takes_self - self.takes_field = takes_field - - ex = _AnnotationExtractor(converter) - self._first_param_type = ex.get_first_param_type() - - if not (self.takes_self or self.takes_field): - self.__call__ = lambda value, _, __: self.converter(value) - elif self.takes_self and not self.takes_field: - self.__call__ = lambda value, instance, __: self.converter( - value, instance - ) - elif not self.takes_self and self.takes_field: - self.__call__ = lambda value, __, field: self.converter( - value, field - ) - else: - self.__call__ = lambda value, instance, field: self.converter( - value, instance, field - ) - - rt = ex.get_return_type() - if rt is not None: - self.__call__.__annotations__["return"] = rt - - @staticmethod - def _get_global_name(attr_name: str) -> str: - """ - Return the name that a converter for an attribute name *attr_name* - would have. - """ - return f"__attr_converter_{attr_name}" - - def _fmt_converter_call(self, attr_name: str, value_var: str) -> str: - """ - Return a string that calls the converter for an attribute name - *attr_name* and the value in variable named *value_var* according to - `self.takes_self` and `self.takes_field`. - """ - if not (self.takes_self or self.takes_field): - return f"{self._get_global_name(attr_name)}({value_var})" - - if self.takes_self and self.takes_field: - return f"{self._get_global_name(attr_name)}({value_var}, self, attr_dict['{attr_name}'])" - - if self.takes_self: - return f"{self._get_global_name(attr_name)}({value_var}, self)" - - return f"{self._get_global_name(attr_name)}({value_var}, attr_dict['{attr_name}'])" - - def __getstate__(self): - """ - Return a dict containing only converter and takes_self -- the rest gets - computed when loading. - """ - return { - "converter": self.converter, - "takes_self": self.takes_self, - "takes_field": self.takes_field, - } - - def __setstate__(self, state): - """ - Load instance from state. - """ - self.__init__(**state) - - -_f = [ - Attribute( - name=name, - default=NOTHING, - validator=None, - repr=True, - cmp=None, - eq=True, - order=False, - hash=True, - init=True, - inherited=False, - ) - for name in ("converter", "takes_self", "takes_field") -] - -Converter = _add_hash( - _add_eq(_add_repr(Converter, attrs=_f), attrs=_f), attrs=_f -) - - -def make_class( - name, attrs, bases=(object,), class_body=None, **attributes_arguments -): - r""" - A quick way to create a new class called *name* with *attrs*. - - .. note:: - - ``make_class()`` is a thin wrapper around `attr.s`, not `attrs.define` - which means that it doesn't come with some of the improved defaults. - - For example, if you want the same ``on_setattr`` behavior as in - `attrs.define`, you have to pass the hooks yourself: ``make_class(..., - on_setattr=setters.pipe(setters.convert, setters.validate)`` - - .. warning:: - - It is *your* duty to ensure that the class name and the attribute names - are valid identifiers. ``make_class()`` will *not* validate them for - you. - - Args: - name (str): The name for the new class. - - attrs (list | dict): - A list of names or a dictionary of mappings of names to `attr.ib`\ - s / `attrs.field`\ s. - - The order is deduced from the order of the names or attributes - inside *attrs*. Otherwise the order of the definition of the - attributes is used. - - bases (tuple[type, ...]): Classes that the new class will subclass. - - class_body (dict): - An optional dictionary of class attributes for the new class. - - attributes_arguments: Passed unmodified to `attr.s`. - - Returns: - type: A new class with *attrs*. - - .. versionadded:: 17.1.0 *bases* - .. versionchanged:: 18.1.0 If *attrs* is ordered, the order is retained. - .. versionchanged:: 23.2.0 *class_body* - .. versionchanged:: 25.2.0 Class names can now be unicode. - """ - # Class identifiers are converted into the normal form NFKC while parsing - name = unicodedata.normalize("NFKC", name) - - if isinstance(attrs, dict): - cls_dict = attrs - elif isinstance(attrs, (list, tuple)): - cls_dict = {a: attrib() for a in attrs} - else: - msg = "attrs argument must be a dict or a list." - raise TypeError(msg) - - pre_init = cls_dict.pop("__attrs_pre_init__", None) - post_init = cls_dict.pop("__attrs_post_init__", None) - user_init = cls_dict.pop("__init__", None) - - body = {} - if class_body is not None: - body.update(class_body) - if pre_init is not None: - body["__attrs_pre_init__"] = pre_init - if post_init is not None: - body["__attrs_post_init__"] = post_init - if user_init is not None: - body["__init__"] = user_init - - type_ = types.new_class(name, bases, {}, lambda ns: ns.update(body)) - - # For pickling to work, the __module__ variable needs to be set to the - # frame where the class is created. Bypass this step in environments where - # sys._getframe is not defined (Jython for example) or sys._getframe is not - # defined for arguments greater than 0 (IronPython). - with contextlib.suppress(AttributeError, ValueError): - type_.__module__ = sys._getframe(1).f_globals.get( - "__name__", "__main__" - ) - - # We do it here for proper warnings with meaningful stacklevel. - cmp = attributes_arguments.pop("cmp", None) - ( - attributes_arguments["eq"], - attributes_arguments["order"], - ) = _determine_attrs_eq_order( - cmp, - attributes_arguments.get("eq"), - attributes_arguments.get("order"), - True, - ) - - cls = _attrs(these=cls_dict, **attributes_arguments)(type_) - # Only add type annotations now or "_attrs()" will complain: - cls.__annotations__ = { - k: v.type for k, v in cls_dict.items() if v.type is not None - } - return cls - - -# These are required by within this module so we define them here and merely -# import into .validators / .converters. - - -@attrs(slots=True, unsafe_hash=True) -class _AndValidator: - """ - Compose many validators to a single one. - """ - - _validators = attrib() - - def __call__(self, inst, attr, value): - for v in self._validators: - v(inst, attr, value) - - -def and_(*validators): - """ - A validator that composes multiple validators into one. - - When called on a value, it runs all wrapped validators. - - Args: - validators (~collections.abc.Iterable[typing.Callable]): - Arbitrary number of validators. - - .. versionadded:: 17.1.0 - """ - vals = [] - for validator in validators: - vals.extend( - validator._validators - if isinstance(validator, _AndValidator) - else [validator] - ) - - return _AndValidator(tuple(vals)) - - -def pipe(*converters): - """ - A converter that composes multiple converters into one. - - When called on a value, it runs all wrapped converters, returning the - *last* value. - - Type annotations will be inferred from the wrapped converters', if they - have any. - - converters (~collections.abc.Iterable[typing.Callable]): - Arbitrary number of converters. - - .. versionadded:: 20.1.0 - """ - - return_instance = any(isinstance(c, Converter) for c in converters) - - if return_instance: - - def pipe_converter(val, inst, field): - for c in converters: - val = ( - c(val, inst, field) if isinstance(c, Converter) else c(val) - ) - - return val - - else: - - def pipe_converter(val): - for c in converters: - val = c(val) - - return val - - if not converters: - # If the converter list is empty, pipe_converter is the identity. - A = TypeVar("A") - pipe_converter.__annotations__.update({"val": A, "return": A}) - else: - # Get parameter type from first converter. - t = _AnnotationExtractor(converters[0]).get_first_param_type() - if t: - pipe_converter.__annotations__["val"] = t - - last = converters[-1] - if not PY_3_11_PLUS and isinstance(last, Converter): - last = last.__call__ - - # Get return type from last converter. - rt = _AnnotationExtractor(last).get_return_type() - if rt: - pipe_converter.__annotations__["return"] = rt - - if return_instance: - return Converter(pipe_converter, takes_self=True, takes_field=True) - return pipe_converter diff --git a/venv/lib/python3.12/site-packages/attr/_next_gen.py b/venv/lib/python3.12/site-packages/attr/_next_gen.py deleted file mode 100644 index 9290664..0000000 --- a/venv/lib/python3.12/site-packages/attr/_next_gen.py +++ /dev/null @@ -1,623 +0,0 @@ -# SPDX-License-Identifier: MIT - -""" -These are keyword-only APIs that call `attr.s` and `attr.ib` with different -default values. -""" - -from functools import partial - -from . import setters -from ._funcs import asdict as _asdict -from ._funcs import astuple as _astuple -from ._make import ( - _DEFAULT_ON_SETATTR, - NOTHING, - _frozen_setattrs, - attrib, - attrs, -) -from .exceptions import UnannotatedAttributeError - - -def define( - maybe_cls=None, - *, - these=None, - repr=None, - unsafe_hash=None, - hash=None, - init=None, - slots=True, - frozen=False, - weakref_slot=True, - str=False, - auto_attribs=None, - kw_only=False, - cache_hash=False, - auto_exc=True, - eq=None, - order=False, - auto_detect=True, - getstate_setstate=None, - on_setattr=None, - field_transformer=None, - match_args=True, -): - r""" - A class decorator that adds :term:`dunder methods` according to - :term:`fields <field>` specified using :doc:`type annotations <types>`, - `field()` calls, or the *these* argument. - - Since *attrs* patches or replaces an existing class, you cannot use - `object.__init_subclass__` with *attrs* classes, because it runs too early. - As a replacement, you can define ``__attrs_init_subclass__`` on your class. - It will be called by *attrs* classes that subclass it after they're - created. See also :ref:`init-subclass`. - - Args: - slots (bool): - Create a :term:`slotted class <slotted classes>` that's more - memory-efficient. Slotted classes are generally superior to the - default dict classes, but have some gotchas you should know about, - so we encourage you to read the :term:`glossary entry <slotted - classes>`. - - auto_detect (bool): - Instead of setting the *init*, *repr*, *eq*, and *hash* arguments - explicitly, assume they are set to True **unless any** of the - involved methods for one of the arguments is implemented in the - *current* class (meaning, it is *not* inherited from some base - class). - - So, for example by implementing ``__eq__`` on a class yourself, - *attrs* will deduce ``eq=False`` and will create *neither* - ``__eq__`` *nor* ``__ne__`` (but Python classes come with a - sensible ``__ne__`` by default, so it *should* be enough to only - implement ``__eq__`` in most cases). - - Passing True or False` to *init*, *repr*, *eq*, or *hash* - overrides whatever *auto_detect* would determine. - - auto_exc (bool): - If the class subclasses `BaseException` (which implicitly includes - any subclass of any exception), the following happens to behave - like a well-behaved Python exception class: - - - the values for *eq*, *order*, and *hash* are ignored and the - instances compare and hash by the instance's ids [#]_ , - - all attributes that are either passed into ``__init__`` or have a - default value are additionally available as a tuple in the - ``args`` attribute, - - the value of *str* is ignored leaving ``__str__`` to base - classes. - - .. [#] - Note that *attrs* will *not* remove existing implementations of - ``__hash__`` or the equality methods. It just won't add own - ones. - - on_setattr (~typing.Callable | list[~typing.Callable] | None | ~typing.Literal[attrs.setters.NO_OP]): - A callable that is run whenever the user attempts to set an - attribute (either by assignment like ``i.x = 42`` or by using - `setattr` like ``setattr(i, "x", 42)``). It receives the same - arguments as validators: the instance, the attribute that is being - modified, and the new value. - - If no exception is raised, the attribute is set to the return value - of the callable. - - If a list of callables is passed, they're automatically wrapped in - an `attrs.setters.pipe`. - - If left None, the default behavior is to run converters and - validators whenever an attribute is set. - - init (bool): - Create a ``__init__`` method that initializes the *attrs* - attributes. Leading underscores are stripped for the argument name, - unless an alias is set on the attribute. - - .. seealso:: - `init` shows advanced ways to customize the generated - ``__init__`` method, including executing code before and after. - - repr(bool): - Create a ``__repr__`` method with a human readable representation - of *attrs* attributes. - - str (bool): - Create a ``__str__`` method that is identical to ``__repr__``. This - is usually not necessary except for `Exception`\ s. - - eq (bool | None): - If True or None (default), add ``__eq__`` and ``__ne__`` methods - that check two instances for equality. - - .. seealso:: - `comparison` describes how to customize the comparison behavior - going as far comparing NumPy arrays. - - order (bool | None): - If True, add ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` - methods that behave like *eq* above and allow instances to be - ordered. - - They compare the instances as if they were tuples of their *attrs* - attributes if and only if the types of both classes are - *identical*. - - If `None` mirror value of *eq*. - - .. seealso:: `comparison` - - unsafe_hash (bool | None): - If None (default), the ``__hash__`` method is generated according - how *eq* and *frozen* are set. - - 1. If *both* are True, *attrs* will generate a ``__hash__`` for - you. - 2. If *eq* is True and *frozen* is False, ``__hash__`` will be set - to None, marking it unhashable (which it is). - 3. If *eq* is False, ``__hash__`` will be left untouched meaning - the ``__hash__`` method of the base class will be used. If the - base class is `object`, this means it will fall back to id-based - hashing. - - Although not recommended, you can decide for yourself and force - *attrs* to create one (for example, if the class is immutable even - though you didn't freeze it programmatically) by passing True or - not. Both of these cases are rather special and should be used - carefully. - - .. seealso:: - - - Our documentation on `hashing`, - - Python's documentation on `object.__hash__`, - - and the `GitHub issue that led to the default \ behavior - <https://github.com/python-attrs/attrs/issues/136>`_ for more - details. - - hash (bool | None): - Deprecated alias for *unsafe_hash*. *unsafe_hash* takes precedence. - - cache_hash (bool): - Ensure that the object's hash code is computed only once and stored - on the object. If this is set to True, hashing must be either - explicitly or implicitly enabled for this class. If the hash code - is cached, avoid any reassignments of fields involved in hash code - computation or mutations of the objects those fields point to after - object creation. If such changes occur, the behavior of the - object's hash code is undefined. - - frozen (bool): - Make instances immutable after initialization. If someone attempts - to modify a frozen instance, `attrs.exceptions.FrozenInstanceError` - is raised. - - .. note:: - - 1. This is achieved by installing a custom ``__setattr__`` - method on your class, so you can't implement your own. - - 2. True immutability is impossible in Python. - - 3. This *does* have a minor a runtime performance `impact - <how-frozen>` when initializing new instances. In other - words: ``__init__`` is slightly slower with ``frozen=True``. - - 4. If a class is frozen, you cannot modify ``self`` in - ``__attrs_post_init__`` or a self-written ``__init__``. You - can circumvent that limitation by using - ``object.__setattr__(self, "attribute_name", value)``. - - 5. Subclasses of a frozen class are frozen too. - - kw_only (bool): - Make all attributes keyword-only in the generated ``__init__`` (if - *init* is False, this parameter is ignored). - - weakref_slot (bool): - Make instances weak-referenceable. This has no effect unless - *slots* is True. - - field_transformer (~typing.Callable | None): - A function that is called with the original class object and all - fields right before *attrs* finalizes the class. You can use this, - for example, to automatically add converters or validators to - fields based on their types. - - .. seealso:: `transform-fields` - - match_args (bool): - If True (default), set ``__match_args__`` on the class to support - :pep:`634` (*Structural Pattern Matching*). It is a tuple of all - non-keyword-only ``__init__`` parameter names on Python 3.10 and - later. Ignored on older Python versions. - - collect_by_mro (bool): - If True, *attrs* collects attributes from base classes correctly - according to the `method resolution order - <https://docs.python.org/3/howto/mro.html>`_. If False, *attrs* - will mimic the (wrong) behavior of `dataclasses` and :pep:`681`. - - See also `issue #428 - <https://github.com/python-attrs/attrs/issues/428>`_. - - getstate_setstate (bool | None): - .. note:: - - This is usually only interesting for slotted classes and you - should probably just set *auto_detect* to True. - - If True, ``__getstate__`` and ``__setstate__`` are generated and - attached to the class. This is necessary for slotted classes to be - pickleable. If left None, it's True by default for slotted classes - and False for dict classes. - - If *auto_detect* is True, and *getstate_setstate* is left None, and - **either** ``__getstate__`` or ``__setstate__`` is detected - directly on the class (meaning: not inherited), it is set to False - (this is usually what you want). - - auto_attribs (bool | None): - If True, look at type annotations to determine which attributes to - use, like `dataclasses`. If False, it will only look for explicit - :func:`field` class attributes, like classic *attrs*. - - If left None, it will guess: - - 1. If any attributes are annotated and no unannotated - `attrs.field`\ s are found, it assumes *auto_attribs=True*. - 2. Otherwise it assumes *auto_attribs=False* and tries to collect - `attrs.field`\ s. - - If *attrs* decides to look at type annotations, **all** fields - **must** be annotated. If *attrs* encounters a field that is set to - a :func:`field` / `attr.ib` but lacks a type annotation, an - `attrs.exceptions.UnannotatedAttributeError` is raised. Use - ``field_name: typing.Any = field(...)`` if you don't want to set a - type. - - .. warning:: - - For features that use the attribute name to create decorators - (for example, :ref:`validators <validators>`), you still *must* - assign :func:`field` / `attr.ib` to them. Otherwise Python will - either not find the name or try to use the default value to - call, for example, ``validator`` on it. - - Attributes annotated as `typing.ClassVar`, and attributes that are - neither annotated nor set to an `field()` are **ignored**. - - these (dict[str, object]): - A dictionary of name to the (private) return value of `field()` - mappings. This is useful to avoid the definition of your attributes - within the class body because you can't (for example, if you want - to add ``__repr__`` methods to Django models) or don't want to. - - If *these* is not `None`, *attrs* will *not* search the class body - for attributes and will *not* remove any attributes from it. - - The order is deduced from the order of the attributes inside - *these*. - - Arguably, this is a rather obscure feature. - - .. versionadded:: 20.1.0 - .. versionchanged:: 21.3.0 Converters are also run ``on_setattr``. - .. versionadded:: 22.2.0 - *unsafe_hash* as an alias for *hash* (for :pep:`681` compliance). - .. versionchanged:: 24.1.0 - Instances are not compared as tuples of attributes anymore, but using a - big ``and`` condition. This is faster and has more correct behavior for - uncomparable values like `math.nan`. - .. versionadded:: 24.1.0 - If a class has an *inherited* classmethod called - ``__attrs_init_subclass__``, it is executed after the class is created. - .. deprecated:: 24.1.0 *hash* is deprecated in favor of *unsafe_hash*. - .. versionadded:: 24.3.0 - Unless already present, a ``__replace__`` method is automatically - created for `copy.replace` (Python 3.13+ only). - - .. note:: - - The main differences to the classic `attr.s` are: - - - Automatically detect whether or not *auto_attribs* should be `True` - (c.f. *auto_attribs* parameter). - - Converters and validators run when attributes are set by default -- - if *frozen* is `False`. - - *slots=True* - - Usually, this has only upsides and few visible effects in everyday - programming. But it *can* lead to some surprising behaviors, so - please make sure to read :term:`slotted classes`. - - - *auto_exc=True* - - *auto_detect=True* - - *order=False* - - Some options that were only relevant on Python 2 or were kept around - for backwards-compatibility have been removed. - - """ - - def do_it(cls, auto_attribs): - return attrs( - maybe_cls=cls, - these=these, - repr=repr, - hash=hash, - unsafe_hash=unsafe_hash, - init=init, - slots=slots, - frozen=frozen, - weakref_slot=weakref_slot, - str=str, - auto_attribs=auto_attribs, - kw_only=kw_only, - cache_hash=cache_hash, - auto_exc=auto_exc, - eq=eq, - order=order, - auto_detect=auto_detect, - collect_by_mro=True, - getstate_setstate=getstate_setstate, - on_setattr=on_setattr, - field_transformer=field_transformer, - match_args=match_args, - ) - - def wrap(cls): - """ - Making this a wrapper ensures this code runs during class creation. - - We also ensure that frozen-ness of classes is inherited. - """ - nonlocal frozen, on_setattr - - had_on_setattr = on_setattr not in (None, setters.NO_OP) - - # By default, mutable classes convert & validate on setattr. - if frozen is False and on_setattr is None: - on_setattr = _DEFAULT_ON_SETATTR - - # However, if we subclass a frozen class, we inherit the immutability - # and disable on_setattr. - for base_cls in cls.__bases__: - if base_cls.__setattr__ is _frozen_setattrs: - if had_on_setattr: - msg = "Frozen classes can't use on_setattr (frozen-ness was inherited)." - raise ValueError(msg) - - on_setattr = setters.NO_OP - break - - if auto_attribs is not None: - return do_it(cls, auto_attribs) - - try: - return do_it(cls, True) - except UnannotatedAttributeError: - return do_it(cls, False) - - # maybe_cls's type depends on the usage of the decorator. It's a class - # if it's used as `@attrs` but `None` if used as `@attrs()`. - if maybe_cls is None: - return wrap - - return wrap(maybe_cls) - - -mutable = define -frozen = partial(define, frozen=True, on_setattr=None) - - -def field( - *, - default=NOTHING, - validator=None, - repr=True, - hash=None, - init=True, - metadata=None, - type=None, - converter=None, - factory=None, - kw_only=False, - eq=None, - order=None, - on_setattr=None, - alias=None, -): - """ - Create a new :term:`field` / :term:`attribute` on a class. - - .. warning:: - - Does **nothing** unless the class is also decorated with - `attrs.define` (or similar)! - - Args: - default: - A value that is used if an *attrs*-generated ``__init__`` is used - and no value is passed while instantiating or the attribute is - excluded using ``init=False``. - - If the value is an instance of `attrs.Factory`, its callable will - be used to construct a new value (useful for mutable data types - like lists or dicts). - - If a default is not set (or set manually to `attrs.NOTHING`), a - value *must* be supplied when instantiating; otherwise a - `TypeError` will be raised. - - .. seealso:: `defaults` - - factory (~typing.Callable): - Syntactic sugar for ``default=attr.Factory(factory)``. - - validator (~typing.Callable | list[~typing.Callable]): - Callable that is called by *attrs*-generated ``__init__`` methods - after the instance has been initialized. They receive the - initialized instance, the :func:`~attrs.Attribute`, and the passed - value. - - The return value is *not* inspected so the validator has to throw - an exception itself. - - If a `list` is passed, its items are treated as validators and must - all pass. - - Validators can be globally disabled and re-enabled using - `attrs.validators.get_disabled` / `attrs.validators.set_disabled`. - - The validator can also be set using decorator notation as shown - below. - - .. seealso:: :ref:`validators` - - repr (bool | ~typing.Callable): - Include this attribute in the generated ``__repr__`` method. If - True, include the attribute; if False, omit it. By default, the - built-in ``repr()`` function is used. To override how the attribute - value is formatted, pass a ``callable`` that takes a single value - and returns a string. Note that the resulting string is used as-is, - which means it will be used directly *instead* of calling - ``repr()`` (the default). - - eq (bool | ~typing.Callable): - If True (default), include this attribute in the generated - ``__eq__`` and ``__ne__`` methods that check two instances for - equality. To override how the attribute value is compared, pass a - callable that takes a single value and returns the value to be - compared. - - .. seealso:: `comparison` - - order (bool | ~typing.Callable): - If True (default), include this attributes in the generated - ``__lt__``, ``__le__``, ``__gt__`` and ``__ge__`` methods. To - override how the attribute value is ordered, pass a callable that - takes a single value and returns the value to be ordered. - - .. seealso:: `comparison` - - hash (bool | None): - Include this attribute in the generated ``__hash__`` method. If - None (default), mirror *eq*'s value. This is the correct behavior - according the Python spec. Setting this value to anything else - than None is *discouraged*. - - .. seealso:: `hashing` - - init (bool): - Include this attribute in the generated ``__init__`` method. - - It is possible to set this to False and set a default value. In - that case this attributed is unconditionally initialized with the - specified default value or factory. - - .. seealso:: `init` - - converter (typing.Callable | Converter): - A callable that is called by *attrs*-generated ``__init__`` methods - to convert attribute's value to the desired format. - - If a vanilla callable is passed, it is given the passed-in value as - the only positional argument. It is possible to receive additional - arguments by wrapping the callable in a `Converter`. - - Either way, the returned value will be used as the new value of the - attribute. The value is converted before being passed to the - validator, if any. - - .. seealso:: :ref:`converters` - - metadata (dict | None): - An arbitrary mapping, to be used by third-party code. - - .. seealso:: `extending-metadata`. - - type (type): - The type of the attribute. Nowadays, the preferred method to - specify the type is using a variable annotation (see :pep:`526`). - This argument is provided for backwards-compatibility and for usage - with `make_class`. Regardless of the approach used, the type will - be stored on ``Attribute.type``. - - Please note that *attrs* doesn't do anything with this metadata by - itself. You can use it as part of your own code or for `static type - checking <types>`. - - kw_only (bool): - Make this attribute keyword-only in the generated ``__init__`` (if - ``init`` is False, this parameter is ignored). - - on_setattr (~typing.Callable | list[~typing.Callable] | None | ~typing.Literal[attrs.setters.NO_OP]): - Allows to overwrite the *on_setattr* setting from `attr.s`. If left - None, the *on_setattr* value from `attr.s` is used. Set to - `attrs.setters.NO_OP` to run **no** `setattr` hooks for this - attribute -- regardless of the setting in `define()`. - - alias (str | None): - Override this attribute's parameter name in the generated - ``__init__`` method. If left None, default to ``name`` stripped - of leading underscores. See `private-attributes`. - - .. versionadded:: 20.1.0 - .. versionchanged:: 21.1.0 - *eq*, *order*, and *cmp* also accept a custom callable - .. versionadded:: 22.2.0 *alias* - .. versionadded:: 23.1.0 - The *type* parameter has been re-added; mostly for `attrs.make_class`. - Please note that type checkers ignore this metadata. - - .. seealso:: - - `attr.ib` - """ - return attrib( - default=default, - validator=validator, - repr=repr, - hash=hash, - init=init, - metadata=metadata, - type=type, - converter=converter, - factory=factory, - kw_only=kw_only, - eq=eq, - order=order, - on_setattr=on_setattr, - alias=alias, - ) - - -def asdict(inst, *, recurse=True, filter=None, value_serializer=None): - """ - Same as `attr.asdict`, except that collections types are always retained - and dict is always used as *dict_factory*. - - .. versionadded:: 21.3.0 - """ - return _asdict( - inst=inst, - recurse=recurse, - filter=filter, - value_serializer=value_serializer, - retain_collection_types=True, - ) - - -def astuple(inst, *, recurse=True, filter=None): - """ - Same as `attr.astuple`, except that collections types are always retained - and `tuple` is always used as the *tuple_factory*. - - .. versionadded:: 21.3.0 - """ - return _astuple( - inst=inst, recurse=recurse, filter=filter, retain_collection_types=True - ) diff --git a/venv/lib/python3.12/site-packages/attr/_typing_compat.pyi b/venv/lib/python3.12/site-packages/attr/_typing_compat.pyi deleted file mode 100644 index ca7b71e..0000000 --- a/venv/lib/python3.12/site-packages/attr/_typing_compat.pyi +++ /dev/null @@ -1,15 +0,0 @@ -from typing import Any, ClassVar, Protocol - -# MYPY is a special constant in mypy which works the same way as `TYPE_CHECKING`. -MYPY = False - -if MYPY: - # A protocol to be able to statically accept an attrs class. - class AttrsInstance_(Protocol): - __attrs_attrs__: ClassVar[Any] - -else: - # For type checkers without plug-in support use an empty protocol that - # will (hopefully) be combined into a union. - class AttrsInstance_(Protocol): - pass diff --git a/venv/lib/python3.12/site-packages/attr/_version_info.py b/venv/lib/python3.12/site-packages/attr/_version_info.py deleted file mode 100644 index 51a1312..0000000 --- a/venv/lib/python3.12/site-packages/attr/_version_info.py +++ /dev/null @@ -1,86 +0,0 @@ -# SPDX-License-Identifier: MIT - - -from functools import total_ordering - -from ._funcs import astuple -from ._make import attrib, attrs - - -@total_ordering -@attrs(eq=False, order=False, slots=True, frozen=True) -class VersionInfo: - """ - A version object that can be compared to tuple of length 1--4: - - >>> attr.VersionInfo(19, 1, 0, "final") <= (19, 2) - True - >>> attr.VersionInfo(19, 1, 0, "final") < (19, 1, 1) - True - >>> vi = attr.VersionInfo(19, 2, 0, "final") - >>> vi < (19, 1, 1) - False - >>> vi < (19,) - False - >>> vi == (19, 2,) - True - >>> vi == (19, 2, 1) - False - - .. versionadded:: 19.2 - """ - - year = attrib(type=int) - minor = attrib(type=int) - micro = attrib(type=int) - releaselevel = attrib(type=str) - - @classmethod - def _from_version_string(cls, s): - """ - Parse *s* and return a _VersionInfo. - """ - v = s.split(".") - if len(v) == 3: - v.append("final") - - return cls( - year=int(v[0]), minor=int(v[1]), micro=int(v[2]), releaselevel=v[3] - ) - - def _ensure_tuple(self, other): - """ - Ensure *other* is a tuple of a valid length. - - Returns a possibly transformed *other* and ourselves as a tuple of - the same length as *other*. - """ - - if self.__class__ is other.__class__: - other = astuple(other) - - if not isinstance(other, tuple): - raise NotImplementedError - - if not (1 <= len(other) <= 4): - raise NotImplementedError - - return astuple(self)[: len(other)], other - - def __eq__(self, other): - try: - us, them = self._ensure_tuple(other) - except NotImplementedError: - return NotImplemented - - return us == them - - def __lt__(self, other): - try: - us, them = self._ensure_tuple(other) - except NotImplementedError: - return NotImplemented - - # Since alphabetically "dev0" < "final" < "post1" < "post2", we don't - # have to do anything special with releaselevel for now. - return us < them diff --git a/venv/lib/python3.12/site-packages/attr/_version_info.pyi b/venv/lib/python3.12/site-packages/attr/_version_info.pyi deleted file mode 100644 index 45ced08..0000000 --- a/venv/lib/python3.12/site-packages/attr/_version_info.pyi +++ /dev/null @@ -1,9 +0,0 @@ -class VersionInfo: - @property - def year(self) -> int: ... - @property - def minor(self) -> int: ... - @property - def micro(self) -> int: ... - @property - def releaselevel(self) -> str: ... diff --git a/venv/lib/python3.12/site-packages/attr/converters.py b/venv/lib/python3.12/site-packages/attr/converters.py deleted file mode 100644 index 0a79dee..0000000 --- a/venv/lib/python3.12/site-packages/attr/converters.py +++ /dev/null @@ -1,162 +0,0 @@ -# SPDX-License-Identifier: MIT - -""" -Commonly useful converters. -""" - -import typing - -from ._compat import _AnnotationExtractor -from ._make import NOTHING, Converter, Factory, pipe - - -__all__ = [ - "default_if_none", - "optional", - "pipe", - "to_bool", -] - - -def optional(converter): - """ - A converter that allows an attribute to be optional. An optional attribute - is one which can be set to `None`. - - Type annotations will be inferred from the wrapped converter's, if it has - any. - - Args: - converter (typing.Callable): - the converter that is used for non-`None` values. - - .. versionadded:: 17.1.0 - """ - - if isinstance(converter, Converter): - - def optional_converter(val, inst, field): - if val is None: - return None - return converter(val, inst, field) - - else: - - def optional_converter(val): - if val is None: - return None - return converter(val) - - xtr = _AnnotationExtractor(converter) - - t = xtr.get_first_param_type() - if t: - optional_converter.__annotations__["val"] = typing.Optional[t] - - rt = xtr.get_return_type() - if rt: - optional_converter.__annotations__["return"] = typing.Optional[rt] - - if isinstance(converter, Converter): - return Converter(optional_converter, takes_self=True, takes_field=True) - - return optional_converter - - -def default_if_none(default=NOTHING, factory=None): - """ - A converter that allows to replace `None` values by *default* or the result - of *factory*. - - Args: - default: - Value to be used if `None` is passed. Passing an instance of - `attrs.Factory` is supported, however the ``takes_self`` option is - *not*. - - factory (typing.Callable): - A callable that takes no parameters whose result is used if `None` - is passed. - - Raises: - TypeError: If **neither** *default* or *factory* is passed. - - TypeError: If **both** *default* and *factory* are passed. - - ValueError: - If an instance of `attrs.Factory` is passed with - ``takes_self=True``. - - .. versionadded:: 18.2.0 - """ - if default is NOTHING and factory is None: - msg = "Must pass either `default` or `factory`." - raise TypeError(msg) - - if default is not NOTHING and factory is not None: - msg = "Must pass either `default` or `factory` but not both." - raise TypeError(msg) - - if factory is not None: - default = Factory(factory) - - if isinstance(default, Factory): - if default.takes_self: - msg = "`takes_self` is not supported by default_if_none." - raise ValueError(msg) - - def default_if_none_converter(val): - if val is not None: - return val - - return default.factory() - - else: - - def default_if_none_converter(val): - if val is not None: - return val - - return default - - return default_if_none_converter - - -def to_bool(val): - """ - Convert "boolean" strings (for example, from environment variables) to real - booleans. - - Values mapping to `True`: - - - ``True`` - - ``"true"`` / ``"t"`` - - ``"yes"`` / ``"y"`` - - ``"on"`` - - ``"1"`` - - ``1`` - - Values mapping to `False`: - - - ``False`` - - ``"false"`` / ``"f"`` - - ``"no"`` / ``"n"`` - - ``"off"`` - - ``"0"`` - - ``0`` - - Raises: - ValueError: For any other value. - - .. versionadded:: 21.3.0 - """ - if isinstance(val, str): - val = val.lower() - - if val in (True, "true", "t", "yes", "y", "on", "1", 1): - return True - if val in (False, "false", "f", "no", "n", "off", "0", 0): - return False - - msg = f"Cannot convert value to bool: {val!r}" - raise ValueError(msg) diff --git a/venv/lib/python3.12/site-packages/attr/converters.pyi b/venv/lib/python3.12/site-packages/attr/converters.pyi deleted file mode 100644 index 12bd0c4..0000000 --- a/venv/lib/python3.12/site-packages/attr/converters.pyi +++ /dev/null @@ -1,19 +0,0 @@ -from typing import Callable, Any, overload - -from attrs import _ConverterType, _CallableConverterType - -@overload -def pipe(*validators: _CallableConverterType) -> _CallableConverterType: ... -@overload -def pipe(*validators: _ConverterType) -> _ConverterType: ... -@overload -def optional(converter: _CallableConverterType) -> _CallableConverterType: ... -@overload -def optional(converter: _ConverterType) -> _ConverterType: ... -@overload -def default_if_none(default: Any) -> _CallableConverterType: ... -@overload -def default_if_none( - *, factory: Callable[[], Any] -) -> _CallableConverterType: ... -def to_bool(val: str | int | bool) -> bool: ... diff --git a/venv/lib/python3.12/site-packages/attr/exceptions.py b/venv/lib/python3.12/site-packages/attr/exceptions.py deleted file mode 100644 index 3b7abb8..0000000 --- a/venv/lib/python3.12/site-packages/attr/exceptions.py +++ /dev/null @@ -1,95 +0,0 @@ -# SPDX-License-Identifier: MIT - -from __future__ import annotations - -from typing import ClassVar - - -class FrozenError(AttributeError): - """ - A frozen/immutable instance or attribute have been attempted to be - modified. - - It mirrors the behavior of ``namedtuples`` by using the same error message - and subclassing `AttributeError`. - - .. versionadded:: 20.1.0 - """ - - msg = "can't set attribute" - args: ClassVar[tuple[str]] = [msg] - - -class FrozenInstanceError(FrozenError): - """ - A frozen instance has been attempted to be modified. - - .. versionadded:: 16.1.0 - """ - - -class FrozenAttributeError(FrozenError): - """ - A frozen attribute has been attempted to be modified. - - .. versionadded:: 20.1.0 - """ - - -class AttrsAttributeNotFoundError(ValueError): - """ - An *attrs* function couldn't find an attribute that the user asked for. - - .. versionadded:: 16.2.0 - """ - - -class NotAnAttrsClassError(ValueError): - """ - A non-*attrs* class has been passed into an *attrs* function. - - .. versionadded:: 16.2.0 - """ - - -class DefaultAlreadySetError(RuntimeError): - """ - A default has been set when defining the field and is attempted to be reset - using the decorator. - - .. versionadded:: 17.1.0 - """ - - -class UnannotatedAttributeError(RuntimeError): - """ - A class with ``auto_attribs=True`` has a field without a type annotation. - - .. versionadded:: 17.3.0 - """ - - -class PythonTooOldError(RuntimeError): - """ - It was attempted to use an *attrs* feature that requires a newer Python - version. - - .. versionadded:: 18.2.0 - """ - - -class NotCallableError(TypeError): - """ - A field requiring a callable has been set with a value that is not - callable. - - .. versionadded:: 19.2.0 - """ - - def __init__(self, msg, value): - super(TypeError, self).__init__(msg, value) - self.msg = msg - self.value = value - - def __str__(self): - return str(self.msg) diff --git a/venv/lib/python3.12/site-packages/attr/exceptions.pyi b/venv/lib/python3.12/site-packages/attr/exceptions.pyi deleted file mode 100644 index f268011..0000000 --- a/venv/lib/python3.12/site-packages/attr/exceptions.pyi +++ /dev/null @@ -1,17 +0,0 @@ -from typing import Any - -class FrozenError(AttributeError): - msg: str = ... - -class FrozenInstanceError(FrozenError): ... -class FrozenAttributeError(FrozenError): ... -class AttrsAttributeNotFoundError(ValueError): ... -class NotAnAttrsClassError(ValueError): ... -class DefaultAlreadySetError(RuntimeError): ... -class UnannotatedAttributeError(RuntimeError): ... -class PythonTooOldError(RuntimeError): ... - -class NotCallableError(TypeError): - msg: str = ... - value: Any = ... - def __init__(self, msg: str, value: Any) -> None: ... diff --git a/venv/lib/python3.12/site-packages/attr/filters.py b/venv/lib/python3.12/site-packages/attr/filters.py deleted file mode 100644 index 689b170..0000000 --- a/venv/lib/python3.12/site-packages/attr/filters.py +++ /dev/null @@ -1,72 +0,0 @@ -# SPDX-License-Identifier: MIT - -""" -Commonly useful filters for `attrs.asdict` and `attrs.astuple`. -""" - -from ._make import Attribute - - -def _split_what(what): - """ - Returns a tuple of `frozenset`s of classes and attributes. - """ - return ( - frozenset(cls for cls in what if isinstance(cls, type)), - frozenset(cls for cls in what if isinstance(cls, str)), - frozenset(cls for cls in what if isinstance(cls, Attribute)), - ) - - -def include(*what): - """ - Create a filter that only allows *what*. - - Args: - what (list[type, str, attrs.Attribute]): - What to include. Can be a type, a name, or an attribute. - - Returns: - Callable: - A callable that can be passed to `attrs.asdict`'s and - `attrs.astuple`'s *filter* argument. - - .. versionchanged:: 23.1.0 Accept strings with field names. - """ - cls, names, attrs = _split_what(what) - - def include_(attribute, value): - return ( - value.__class__ in cls - or attribute.name in names - or attribute in attrs - ) - - return include_ - - -def exclude(*what): - """ - Create a filter that does **not** allow *what*. - - Args: - what (list[type, str, attrs.Attribute]): - What to exclude. Can be a type, a name, or an attribute. - - Returns: - Callable: - A callable that can be passed to `attrs.asdict`'s and - `attrs.astuple`'s *filter* argument. - - .. versionchanged:: 23.3.0 Accept field name string as input argument - """ - cls, names, attrs = _split_what(what) - - def exclude_(attribute, value): - return not ( - value.__class__ in cls - or attribute.name in names - or attribute in attrs - ) - - return exclude_ diff --git a/venv/lib/python3.12/site-packages/attr/filters.pyi b/venv/lib/python3.12/site-packages/attr/filters.pyi deleted file mode 100644 index 974abdc..0000000 --- a/venv/lib/python3.12/site-packages/attr/filters.pyi +++ /dev/null @@ -1,6 +0,0 @@ -from typing import Any - -from . import Attribute, _FilterType - -def include(*what: type | str | Attribute[Any]) -> _FilterType[Any]: ... -def exclude(*what: type | str | Attribute[Any]) -> _FilterType[Any]: ... diff --git a/venv/lib/python3.12/site-packages/attr/py.typed b/venv/lib/python3.12/site-packages/attr/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/attr/setters.py b/venv/lib/python3.12/site-packages/attr/setters.py deleted file mode 100644 index 78b0839..0000000 --- a/venv/lib/python3.12/site-packages/attr/setters.py +++ /dev/null @@ -1,79 +0,0 @@ -# SPDX-License-Identifier: MIT - -""" -Commonly used hooks for on_setattr. -""" - -from . import _config -from .exceptions import FrozenAttributeError - - -def pipe(*setters): - """ - Run all *setters* and return the return value of the last one. - - .. versionadded:: 20.1.0 - """ - - def wrapped_pipe(instance, attrib, new_value): - rv = new_value - - for setter in setters: - rv = setter(instance, attrib, rv) - - return rv - - return wrapped_pipe - - -def frozen(_, __, ___): - """ - Prevent an attribute to be modified. - - .. versionadded:: 20.1.0 - """ - raise FrozenAttributeError - - -def validate(instance, attrib, new_value): - """ - Run *attrib*'s validator on *new_value* if it has one. - - .. versionadded:: 20.1.0 - """ - if _config._run_validators is False: - return new_value - - v = attrib.validator - if not v: - return new_value - - v(instance, attrib, new_value) - - return new_value - - -def convert(instance, attrib, new_value): - """ - Run *attrib*'s converter -- if it has one -- on *new_value* and return the - result. - - .. versionadded:: 20.1.0 - """ - c = attrib.converter - if c: - # This can be removed once we drop 3.8 and use attrs.Converter instead. - from ._make import Converter - - if not isinstance(c, Converter): - return c(new_value) - - return c(new_value, instance, attrib) - - return new_value - - -# Sentinel for disabling class-wide *on_setattr* hooks for certain attributes. -# Sphinx's autodata stopped working, so the docstring is inlined in the API -# docs. -NO_OP = object() diff --git a/venv/lib/python3.12/site-packages/attr/setters.pyi b/venv/lib/python3.12/site-packages/attr/setters.pyi deleted file mode 100644 index 73abf36..0000000 --- a/venv/lib/python3.12/site-packages/attr/setters.pyi +++ /dev/null @@ -1,20 +0,0 @@ -from typing import Any, NewType, NoReturn, TypeVar - -from . import Attribute -from attrs import _OnSetAttrType - -_T = TypeVar("_T") - -def frozen( - instance: Any, attribute: Attribute[Any], new_value: Any -) -> NoReturn: ... -def pipe(*setters: _OnSetAttrType) -> _OnSetAttrType: ... -def validate(instance: Any, attribute: Attribute[_T], new_value: _T) -> _T: ... - -# convert is allowed to return Any, because they can be chained using pipe. -def convert( - instance: Any, attribute: Attribute[Any], new_value: Any -) -> Any: ... - -_NoOpType = NewType("_NoOpType", object) -NO_OP: _NoOpType diff --git a/venv/lib/python3.12/site-packages/attr/validators.py b/venv/lib/python3.12/site-packages/attr/validators.py deleted file mode 100644 index e7b7552..0000000 --- a/venv/lib/python3.12/site-packages/attr/validators.py +++ /dev/null @@ -1,710 +0,0 @@ -# SPDX-License-Identifier: MIT - -""" -Commonly useful validators. -""" - -import operator -import re - -from contextlib import contextmanager -from re import Pattern - -from ._config import get_run_validators, set_run_validators -from ._make import _AndValidator, and_, attrib, attrs -from .converters import default_if_none -from .exceptions import NotCallableError - - -__all__ = [ - "and_", - "deep_iterable", - "deep_mapping", - "disabled", - "ge", - "get_disabled", - "gt", - "in_", - "instance_of", - "is_callable", - "le", - "lt", - "matches_re", - "max_len", - "min_len", - "not_", - "optional", - "or_", - "set_disabled", -] - - -def set_disabled(disabled): - """ - Globally disable or enable running validators. - - By default, they are run. - - Args: - disabled (bool): If `True`, disable running all validators. - - .. warning:: - - This function is not thread-safe! - - .. versionadded:: 21.3.0 - """ - set_run_validators(not disabled) - - -def get_disabled(): - """ - Return a bool indicating whether validators are currently disabled or not. - - Returns: - bool:`True` if validators are currently disabled. - - .. versionadded:: 21.3.0 - """ - return not get_run_validators() - - -@contextmanager -def disabled(): - """ - Context manager that disables running validators within its context. - - .. warning:: - - This context manager is not thread-safe! - - .. versionadded:: 21.3.0 - """ - set_run_validators(False) - try: - yield - finally: - set_run_validators(True) - - -@attrs(repr=False, slots=True, unsafe_hash=True) -class _InstanceOfValidator: - type = attrib() - - def __call__(self, inst, attr, value): - """ - We use a callable class to be able to change the ``__repr__``. - """ - if not isinstance(value, self.type): - msg = f"'{attr.name}' must be {self.type!r} (got {value!r} that is a {value.__class__!r})." - raise TypeError( - msg, - attr, - self.type, - value, - ) - - def __repr__(self): - return f"<instance_of validator for type {self.type!r}>" - - -def instance_of(type): - """ - A validator that raises a `TypeError` if the initializer is called with a - wrong type for this particular attribute (checks are performed using - `isinstance` therefore it's also valid to pass a tuple of types). - - Args: - type (type | tuple[type]): The type to check for. - - Raises: - TypeError: - With a human readable error message, the attribute (of type - `attrs.Attribute`), the expected type, and the value it got. - """ - return _InstanceOfValidator(type) - - -@attrs(repr=False, frozen=True, slots=True) -class _MatchesReValidator: - pattern = attrib() - match_func = attrib() - - def __call__(self, inst, attr, value): - """ - We use a callable class to be able to change the ``__repr__``. - """ - if not self.match_func(value): - msg = f"'{attr.name}' must match regex {self.pattern.pattern!r} ({value!r} doesn't)" - raise ValueError( - msg, - attr, - self.pattern, - value, - ) - - def __repr__(self): - return f"<matches_re validator for pattern {self.pattern!r}>" - - -def matches_re(regex, flags=0, func=None): - r""" - A validator that raises `ValueError` if the initializer is called with a - string that doesn't match *regex*. - - Args: - regex (str, re.Pattern): - A regex string or precompiled pattern to match against - - flags (int): - Flags that will be passed to the underlying re function (default 0) - - func (typing.Callable): - Which underlying `re` function to call. Valid options are - `re.fullmatch`, `re.search`, and `re.match`; the default `None` - means `re.fullmatch`. For performance reasons, the pattern is - always precompiled using `re.compile`. - - .. versionadded:: 19.2.0 - .. versionchanged:: 21.3.0 *regex* can be a pre-compiled pattern. - """ - valid_funcs = (re.fullmatch, None, re.search, re.match) - if func not in valid_funcs: - msg = "'func' must be one of {}.".format( - ", ".join( - sorted((e and e.__name__) or "None" for e in set(valid_funcs)) - ) - ) - raise ValueError(msg) - - if isinstance(regex, Pattern): - if flags: - msg = "'flags' can only be used with a string pattern; pass flags to re.compile() instead" - raise TypeError(msg) - pattern = regex - else: - pattern = re.compile(regex, flags) - - if func is re.match: - match_func = pattern.match - elif func is re.search: - match_func = pattern.search - else: - match_func = pattern.fullmatch - - return _MatchesReValidator(pattern, match_func) - - -@attrs(repr=False, slots=True, unsafe_hash=True) -class _OptionalValidator: - validator = attrib() - - def __call__(self, inst, attr, value): - if value is None: - return - - self.validator(inst, attr, value) - - def __repr__(self): - return f"<optional validator for {self.validator!r} or None>" - - -def optional(validator): - """ - A validator that makes an attribute optional. An optional attribute is one - which can be set to `None` in addition to satisfying the requirements of - the sub-validator. - - Args: - validator - (typing.Callable | tuple[typing.Callable] | list[typing.Callable]): - A validator (or validators) that is used for non-`None` values. - - .. versionadded:: 15.1.0 - .. versionchanged:: 17.1.0 *validator* can be a list of validators. - .. versionchanged:: 23.1.0 *validator* can also be a tuple of validators. - """ - if isinstance(validator, (list, tuple)): - return _OptionalValidator(_AndValidator(validator)) - - return _OptionalValidator(validator) - - -@attrs(repr=False, slots=True, unsafe_hash=True) -class _InValidator: - options = attrib() - _original_options = attrib(hash=False) - - def __call__(self, inst, attr, value): - try: - in_options = value in self.options - except TypeError: # e.g. `1 in "abc"` - in_options = False - - if not in_options: - msg = f"'{attr.name}' must be in {self._original_options!r} (got {value!r})" - raise ValueError( - msg, - attr, - self._original_options, - value, - ) - - def __repr__(self): - return f"<in_ validator with options {self._original_options!r}>" - - -def in_(options): - """ - A validator that raises a `ValueError` if the initializer is called with a - value that does not belong in the *options* provided. - - The check is performed using ``value in options``, so *options* has to - support that operation. - - To keep the validator hashable, dicts, lists, and sets are transparently - transformed into a `tuple`. - - Args: - options: Allowed options. - - Raises: - ValueError: - With a human readable error message, the attribute (of type - `attrs.Attribute`), the expected options, and the value it got. - - .. versionadded:: 17.1.0 - .. versionchanged:: 22.1.0 - The ValueError was incomplete until now and only contained the human - readable error message. Now it contains all the information that has - been promised since 17.1.0. - .. versionchanged:: 24.1.0 - *options* that are a list, dict, or a set are now transformed into a - tuple to keep the validator hashable. - """ - repr_options = options - if isinstance(options, (list, dict, set)): - options = tuple(options) - - return _InValidator(options, repr_options) - - -@attrs(repr=False, slots=False, unsafe_hash=True) -class _IsCallableValidator: - def __call__(self, inst, attr, value): - """ - We use a callable class to be able to change the ``__repr__``. - """ - if not callable(value): - message = ( - "'{name}' must be callable " - "(got {value!r} that is a {actual!r})." - ) - raise NotCallableError( - msg=message.format( - name=attr.name, value=value, actual=value.__class__ - ), - value=value, - ) - - def __repr__(self): - return "<is_callable validator>" - - -def is_callable(): - """ - A validator that raises a `attrs.exceptions.NotCallableError` if the - initializer is called with a value for this particular attribute that is - not callable. - - .. versionadded:: 19.1.0 - - Raises: - attrs.exceptions.NotCallableError: - With a human readable error message containing the attribute - (`attrs.Attribute`) name, and the value it got. - """ - return _IsCallableValidator() - - -@attrs(repr=False, slots=True, unsafe_hash=True) -class _DeepIterable: - member_validator = attrib(validator=is_callable()) - iterable_validator = attrib( - default=None, validator=optional(is_callable()) - ) - - def __call__(self, inst, attr, value): - """ - We use a callable class to be able to change the ``__repr__``. - """ - if self.iterable_validator is not None: - self.iterable_validator(inst, attr, value) - - for member in value: - self.member_validator(inst, attr, member) - - def __repr__(self): - iterable_identifier = ( - "" - if self.iterable_validator is None - else f" {self.iterable_validator!r}" - ) - return ( - f"<deep_iterable validator for{iterable_identifier}" - f" iterables of {self.member_validator!r}>" - ) - - -def deep_iterable(member_validator, iterable_validator=None): - """ - A validator that performs deep validation of an iterable. - - Args: - member_validator: Validator to apply to iterable members. - - iterable_validator: - Validator to apply to iterable itself (optional). - - Raises - TypeError: if any sub-validators fail - - .. versionadded:: 19.1.0 - """ - if isinstance(member_validator, (list, tuple)): - member_validator = and_(*member_validator) - return _DeepIterable(member_validator, iterable_validator) - - -@attrs(repr=False, slots=True, unsafe_hash=True) -class _DeepMapping: - key_validator = attrib(validator=is_callable()) - value_validator = attrib(validator=is_callable()) - mapping_validator = attrib(default=None, validator=optional(is_callable())) - - def __call__(self, inst, attr, value): - """ - We use a callable class to be able to change the ``__repr__``. - """ - if self.mapping_validator is not None: - self.mapping_validator(inst, attr, value) - - for key in value: - self.key_validator(inst, attr, key) - self.value_validator(inst, attr, value[key]) - - def __repr__(self): - return f"<deep_mapping validator for objects mapping {self.key_validator!r} to {self.value_validator!r}>" - - -def deep_mapping(key_validator, value_validator, mapping_validator=None): - """ - A validator that performs deep validation of a dictionary. - - Args: - key_validator: Validator to apply to dictionary keys. - - value_validator: Validator to apply to dictionary values. - - mapping_validator: - Validator to apply to top-level mapping attribute (optional). - - .. versionadded:: 19.1.0 - - Raises: - TypeError: if any sub-validators fail - """ - return _DeepMapping(key_validator, value_validator, mapping_validator) - - -@attrs(repr=False, frozen=True, slots=True) -class _NumberValidator: - bound = attrib() - compare_op = attrib() - compare_func = attrib() - - def __call__(self, inst, attr, value): - """ - We use a callable class to be able to change the ``__repr__``. - """ - if not self.compare_func(value, self.bound): - msg = f"'{attr.name}' must be {self.compare_op} {self.bound}: {value}" - raise ValueError(msg) - - def __repr__(self): - return f"<Validator for x {self.compare_op} {self.bound}>" - - -def lt(val): - """ - A validator that raises `ValueError` if the initializer is called with a - number larger or equal to *val*. - - The validator uses `operator.lt` to compare the values. - - Args: - val: Exclusive upper bound for values. - - .. versionadded:: 21.3.0 - """ - return _NumberValidator(val, "<", operator.lt) - - -def le(val): - """ - A validator that raises `ValueError` if the initializer is called with a - number greater than *val*. - - The validator uses `operator.le` to compare the values. - - Args: - val: Inclusive upper bound for values. - - .. versionadded:: 21.3.0 - """ - return _NumberValidator(val, "<=", operator.le) - - -def ge(val): - """ - A validator that raises `ValueError` if the initializer is called with a - number smaller than *val*. - - The validator uses `operator.ge` to compare the values. - - Args: - val: Inclusive lower bound for values - - .. versionadded:: 21.3.0 - """ - return _NumberValidator(val, ">=", operator.ge) - - -def gt(val): - """ - A validator that raises `ValueError` if the initializer is called with a - number smaller or equal to *val*. - - The validator uses `operator.ge` to compare the values. - - Args: - val: Exclusive lower bound for values - - .. versionadded:: 21.3.0 - """ - return _NumberValidator(val, ">", operator.gt) - - -@attrs(repr=False, frozen=True, slots=True) -class _MaxLengthValidator: - max_length = attrib() - - def __call__(self, inst, attr, value): - """ - We use a callable class to be able to change the ``__repr__``. - """ - if len(value) > self.max_length: - msg = f"Length of '{attr.name}' must be <= {self.max_length}: {len(value)}" - raise ValueError(msg) - - def __repr__(self): - return f"<max_len validator for {self.max_length}>" - - -def max_len(length): - """ - A validator that raises `ValueError` if the initializer is called - with a string or iterable that is longer than *length*. - - Args: - length (int): Maximum length of the string or iterable - - .. versionadded:: 21.3.0 - """ - return _MaxLengthValidator(length) - - -@attrs(repr=False, frozen=True, slots=True) -class _MinLengthValidator: - min_length = attrib() - - def __call__(self, inst, attr, value): - """ - We use a callable class to be able to change the ``__repr__``. - """ - if len(value) < self.min_length: - msg = f"Length of '{attr.name}' must be >= {self.min_length}: {len(value)}" - raise ValueError(msg) - - def __repr__(self): - return f"<min_len validator for {self.min_length}>" - - -def min_len(length): - """ - A validator that raises `ValueError` if the initializer is called - with a string or iterable that is shorter than *length*. - - Args: - length (int): Minimum length of the string or iterable - - .. versionadded:: 22.1.0 - """ - return _MinLengthValidator(length) - - -@attrs(repr=False, slots=True, unsafe_hash=True) -class _SubclassOfValidator: - type = attrib() - - def __call__(self, inst, attr, value): - """ - We use a callable class to be able to change the ``__repr__``. - """ - if not issubclass(value, self.type): - msg = f"'{attr.name}' must be a subclass of {self.type!r} (got {value!r})." - raise TypeError( - msg, - attr, - self.type, - value, - ) - - def __repr__(self): - return f"<subclass_of validator for type {self.type!r}>" - - -def _subclass_of(type): - """ - A validator that raises a `TypeError` if the initializer is called with a - wrong type for this particular attribute (checks are performed using - `issubclass` therefore it's also valid to pass a tuple of types). - - Args: - type (type | tuple[type, ...]): The type(s) to check for. - - Raises: - TypeError: - With a human readable error message, the attribute (of type - `attrs.Attribute`), the expected type, and the value it got. - """ - return _SubclassOfValidator(type) - - -@attrs(repr=False, slots=True, unsafe_hash=True) -class _NotValidator: - validator = attrib() - msg = attrib( - converter=default_if_none( - "not_ validator child '{validator!r}' " - "did not raise a captured error" - ) - ) - exc_types = attrib( - validator=deep_iterable( - member_validator=_subclass_of(Exception), - iterable_validator=instance_of(tuple), - ), - ) - - def __call__(self, inst, attr, value): - try: - self.validator(inst, attr, value) - except self.exc_types: - pass # suppress error to invert validity - else: - raise ValueError( - self.msg.format( - validator=self.validator, - exc_types=self.exc_types, - ), - attr, - self.validator, - value, - self.exc_types, - ) - - def __repr__(self): - return f"<not_ validator wrapping {self.validator!r}, capturing {self.exc_types!r}>" - - -def not_(validator, *, msg=None, exc_types=(ValueError, TypeError)): - """ - A validator that wraps and logically 'inverts' the validator passed to it. - It will raise a `ValueError` if the provided validator *doesn't* raise a - `ValueError` or `TypeError` (by default), and will suppress the exception - if the provided validator *does*. - - Intended to be used with existing validators to compose logic without - needing to create inverted variants, for example, ``not_(in_(...))``. - - Args: - validator: A validator to be logically inverted. - - msg (str): - Message to raise if validator fails. Formatted with keys - ``exc_types`` and ``validator``. - - exc_types (tuple[type, ...]): - Exception type(s) to capture. Other types raised by child - validators will not be intercepted and pass through. - - Raises: - ValueError: - With a human readable error message, the attribute (of type - `attrs.Attribute`), the validator that failed to raise an - exception, the value it got, and the expected exception types. - - .. versionadded:: 22.2.0 - """ - try: - exc_types = tuple(exc_types) - except TypeError: - exc_types = (exc_types,) - return _NotValidator(validator, msg, exc_types) - - -@attrs(repr=False, slots=True, unsafe_hash=True) -class _OrValidator: - validators = attrib() - - def __call__(self, inst, attr, value): - for v in self.validators: - try: - v(inst, attr, value) - except Exception: # noqa: BLE001, PERF203, S112 - continue - else: - return - - msg = f"None of {self.validators!r} satisfied for value {value!r}" - raise ValueError(msg) - - def __repr__(self): - return f"<or validator wrapping {self.validators!r}>" - - -def or_(*validators): - """ - A validator that composes multiple validators into one. - - When called on a value, it runs all wrapped validators until one of them is - satisfied. - - Args: - validators (~collections.abc.Iterable[typing.Callable]): - Arbitrary number of validators. - - Raises: - ValueError: - If no validator is satisfied. Raised with a human-readable error - message listing all the wrapped validators and the value that - failed all of them. - - .. versionadded:: 24.1.0 - """ - vals = [] - for v in validators: - vals.extend(v.validators if isinstance(v, _OrValidator) else [v]) - - return _OrValidator(tuple(vals)) diff --git a/venv/lib/python3.12/site-packages/attr/validators.pyi b/venv/lib/python3.12/site-packages/attr/validators.pyi deleted file mode 100644 index a0fdda7..0000000 --- a/venv/lib/python3.12/site-packages/attr/validators.pyi +++ /dev/null @@ -1,86 +0,0 @@ -from types import UnionType -from typing import ( - Any, - AnyStr, - Callable, - Container, - ContextManager, - Iterable, - Mapping, - Match, - Pattern, - TypeVar, - overload, -) - -from attrs import _ValidatorType -from attrs import _ValidatorArgType - -_T = TypeVar("_T") -_T1 = TypeVar("_T1") -_T2 = TypeVar("_T2") -_T3 = TypeVar("_T3") -_I = TypeVar("_I", bound=Iterable) -_K = TypeVar("_K") -_V = TypeVar("_V") -_M = TypeVar("_M", bound=Mapping) - -def set_disabled(run: bool) -> None: ... -def get_disabled() -> bool: ... -def disabled() -> ContextManager[None]: ... - -# To be more precise on instance_of use some overloads. -# If there are more than 3 items in the tuple then we fall back to Any -@overload -def instance_of(type: type[_T]) -> _ValidatorType[_T]: ... -@overload -def instance_of(type: tuple[type[_T]]) -> _ValidatorType[_T]: ... -@overload -def instance_of( - type: tuple[type[_T1], type[_T2]], -) -> _ValidatorType[_T1 | _T2]: ... -@overload -def instance_of( - type: tuple[type[_T1], type[_T2], type[_T3]], -) -> _ValidatorType[_T1 | _T2 | _T3]: ... -@overload -def instance_of(type: tuple[type, ...]) -> _ValidatorType[Any]: ... -@overload -def instance_of(type: UnionType) -> _ValidatorType[Any]: ... -def optional( - validator: ( - _ValidatorType[_T] - | list[_ValidatorType[_T]] - | tuple[_ValidatorType[_T]] - ), -) -> _ValidatorType[_T | None]: ... -def in_(options: Container[_T]) -> _ValidatorType[_T]: ... -def and_(*validators: _ValidatorType[_T]) -> _ValidatorType[_T]: ... -def matches_re( - regex: Pattern[AnyStr] | AnyStr, - flags: int = ..., - func: Callable[[AnyStr, AnyStr, int], Match[AnyStr] | None] | None = ..., -) -> _ValidatorType[AnyStr]: ... -def deep_iterable( - member_validator: _ValidatorArgType[_T], - iterable_validator: _ValidatorType[_I] | None = ..., -) -> _ValidatorType[_I]: ... -def deep_mapping( - key_validator: _ValidatorType[_K], - value_validator: _ValidatorType[_V], - mapping_validator: _ValidatorType[_M] | None = ..., -) -> _ValidatorType[_M]: ... -def is_callable() -> _ValidatorType[_T]: ... -def lt(val: _T) -> _ValidatorType[_T]: ... -def le(val: _T) -> _ValidatorType[_T]: ... -def ge(val: _T) -> _ValidatorType[_T]: ... -def gt(val: _T) -> _ValidatorType[_T]: ... -def max_len(length: int) -> _ValidatorType[_T]: ... -def min_len(length: int) -> _ValidatorType[_T]: ... -def not_( - validator: _ValidatorType[_T], - *, - msg: str | None = None, - exc_types: type[Exception] | Iterable[type[Exception]] = ..., -) -> _ValidatorType[_T]: ... -def or_(*validators: _ValidatorType[_T]) -> _ValidatorType[_T]: ... diff --git a/venv/lib/python3.12/site-packages/attrs-25.3.0.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/attrs-25.3.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.12/site-packages/attrs-25.3.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/attrs-25.3.0.dist-info/METADATA b/venv/lib/python3.12/site-packages/attrs-25.3.0.dist-info/METADATA deleted file mode 100644 index 029afee..0000000 --- a/venv/lib/python3.12/site-packages/attrs-25.3.0.dist-info/METADATA +++ /dev/null @@ -1,232 +0,0 @@ -Metadata-Version: 2.4 -Name: attrs -Version: 25.3.0 -Summary: Classes Without Boilerplate -Project-URL: Documentation, https://www.attrs.org/ -Project-URL: Changelog, https://www.attrs.org/en/stable/changelog.html -Project-URL: GitHub, https://github.com/python-attrs/attrs -Project-URL: Funding, https://github.com/sponsors/hynek -Project-URL: Tidelift, https://tidelift.com/subscription/pkg/pypi-attrs?utm_source=pypi-attrs&utm_medium=pypi -Author-email: Hynek Schlawack <hs@ox.cx> -License-Expression: MIT -License-File: LICENSE -Keywords: attribute,boilerplate,class -Classifier: Development Status :: 5 - Production/Stable -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 :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Typing :: Typed -Requires-Python: >=3.8 -Provides-Extra: benchmark -Requires-Dist: cloudpickle; (platform_python_implementation == 'CPython') and extra == 'benchmark' -Requires-Dist: hypothesis; extra == 'benchmark' -Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'benchmark' -Requires-Dist: pympler; extra == 'benchmark' -Requires-Dist: pytest-codspeed; extra == 'benchmark' -Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'benchmark' -Requires-Dist: pytest-xdist[psutil]; extra == 'benchmark' -Requires-Dist: pytest>=4.3.0; extra == 'benchmark' -Provides-Extra: cov -Requires-Dist: cloudpickle; (platform_python_implementation == 'CPython') and extra == 'cov' -Requires-Dist: coverage[toml]>=5.3; extra == 'cov' -Requires-Dist: hypothesis; extra == 'cov' -Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'cov' -Requires-Dist: pympler; extra == 'cov' -Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'cov' -Requires-Dist: pytest-xdist[psutil]; extra == 'cov' -Requires-Dist: pytest>=4.3.0; extra == 'cov' -Provides-Extra: dev -Requires-Dist: cloudpickle; (platform_python_implementation == 'CPython') and extra == 'dev' -Requires-Dist: hypothesis; extra == 'dev' -Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'dev' -Requires-Dist: pre-commit-uv; extra == 'dev' -Requires-Dist: pympler; extra == 'dev' -Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'dev' -Requires-Dist: pytest-xdist[psutil]; extra == 'dev' -Requires-Dist: pytest>=4.3.0; extra == 'dev' -Provides-Extra: docs -Requires-Dist: cogapp; extra == 'docs' -Requires-Dist: furo; extra == 'docs' -Requires-Dist: myst-parser; extra == 'docs' -Requires-Dist: sphinx; extra == 'docs' -Requires-Dist: sphinx-notfound-page; extra == 'docs' -Requires-Dist: sphinxcontrib-towncrier; extra == 'docs' -Requires-Dist: towncrier; extra == 'docs' -Provides-Extra: tests -Requires-Dist: cloudpickle; (platform_python_implementation == 'CPython') and extra == 'tests' -Requires-Dist: hypothesis; extra == 'tests' -Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'tests' -Requires-Dist: pympler; extra == 'tests' -Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'tests' -Requires-Dist: pytest-xdist[psutil]; extra == 'tests' -Requires-Dist: pytest>=4.3.0; extra == 'tests' -Provides-Extra: tests-mypy -Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'tests-mypy' -Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'tests-mypy' -Description-Content-Type: text/markdown - -<p align="center"> - <a href="https://www.attrs.org/"> - <img src="https://raw.githubusercontent.com/python-attrs/attrs/main/docs/_static/attrs_logo.svg" width="35%" alt="attrs" /> - </a> -</p> - - -*attrs* is the Python package that will bring back the **joy** of **writing classes** by relieving you from the drudgery of implementing object protocols (aka [dunder methods](https://www.attrs.org/en/latest/glossary.html#term-dunder-methods)). -[Trusted by NASA](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-github-profile/customizing-your-profile/personalizing-your-profile#list-of-qualifying-repositories-for-mars-2020-helicopter-contributor-achievement) for Mars missions since 2020! - -Its main goal is to help you to write **concise** and **correct** software without slowing down your code. - - -## Sponsors - -*attrs* would not be possible without our [amazing sponsors](https://github.com/sponsors/hynek). -Especially those generously supporting us at the *The Organization* tier and higher: - -<!-- sponsor-break-begin --> - -<p align="center"> - -<!-- [[[cog -import pathlib, tomllib - -for sponsor in tomllib.loads(pathlib.Path("pyproject.toml").read_text())["tool"]["sponcon"]["sponsors"]: - print(f'<a href="{sponsor["url"]}"><img title="{sponsor["title"]}" src="https://www.attrs.org/en/25.3.0/_static/sponsors/{sponsor["img"]}" width="190" /></a>') -]]] --> -<a href="https://www.variomedia.de/"><img title="Variomedia AG" src="https://www.attrs.org/en/25.3.0/_static/sponsors/Variomedia.svg" width="190" /></a> -<a href="https://tidelift.com/?utm_source=lifter&utm_medium=referral&utm_campaign=hynek"><img title="Tidelift" src="https://www.attrs.org/en/25.3.0/_static/sponsors/Tidelift.svg" width="190" /></a> -<a href="https://klaviyo.com/"><img title="Klaviyo" src="https://www.attrs.org/en/25.3.0/_static/sponsors/Klaviyo.svg" width="190" /></a> -<a href="https://privacy-solutions.org/"><img title="Privacy Solutions" src="https://www.attrs.org/en/25.3.0/_static/sponsors/Privacy-Solutions.svg" width="190" /></a> -<a href="https://www.emsys-renewables.com/"><img title="emsys renewables" src="https://www.attrs.org/en/25.3.0/_static/sponsors/emsys-renewables.svg" width="190" /></a> -<a href="https://filepreviews.io/"><img title="FilePreviews" src="https://www.attrs.org/en/25.3.0/_static/sponsors/FilePreviews.svg" width="190" /></a> -<a href="https://polar.sh/"><img title="Polar" src="https://www.attrs.org/en/25.3.0/_static/sponsors/Polar.svg" width="190" /></a> -<!-- [[[end]]] --> - -</p> - -<!-- sponsor-break-end --> - -<p align="center"> - <strong>Please consider <a href="https://github.com/sponsors/hynek">joining them</a> to help make <em>attrs</em>’s maintenance more sustainable!</strong> -</p> - -<!-- teaser-end --> - -## Example - -*attrs* gives you a class decorator and a way to declaratively define the attributes on that class: - -<!-- code-begin --> - -```pycon ->>> from attrs import asdict, define, make_class, Factory - ->>> @define -... class SomeClass: -... a_number: int = 42 -... list_of_numbers: list[int] = Factory(list) -... -... def hard_math(self, another_number): -... return self.a_number + sum(self.list_of_numbers) * another_number - - ->>> sc = SomeClass(1, [1, 2, 3]) ->>> sc -SomeClass(a_number=1, list_of_numbers=[1, 2, 3]) - ->>> sc.hard_math(3) -19 ->>> sc == SomeClass(1, [1, 2, 3]) -True ->>> sc != SomeClass(2, [3, 2, 1]) -True - ->>> asdict(sc) -{'a_number': 1, 'list_of_numbers': [1, 2, 3]} - ->>> SomeClass() -SomeClass(a_number=42, list_of_numbers=[]) - ->>> C = make_class("C", ["a", "b"]) ->>> C("foo", "bar") -C(a='foo', b='bar') -``` - -After *declaring* your attributes, *attrs* gives you: - -- a concise and explicit overview of the class's attributes, -- a nice human-readable `__repr__`, -- equality-checking methods, -- an initializer, -- and much more, - -*without* writing dull boilerplate code again and again and *without* runtime performance penalties. - ---- - -This example uses *attrs*'s modern APIs that have been introduced in version 20.1.0, and the *attrs* package import name that has been added in version 21.3.0. -The classic APIs (`@attr.s`, `attr.ib`, plus their serious-business aliases) and the `attr` package import name will remain **indefinitely**. - -Check out [*On The Core API Names*](https://www.attrs.org/en/latest/names.html) for an in-depth explanation! - - -### Hate Type Annotations!? - -No problem! -Types are entirely **optional** with *attrs*. -Simply assign `attrs.field()` to the attributes instead of annotating them with types: - -```python -from attrs import define, field - -@define -class SomeClass: - a_number = field(default=42) - list_of_numbers = field(factory=list) -``` - - -## Data Classes - -On the tin, *attrs* might remind you of `dataclasses` (and indeed, `dataclasses` [are a descendant](https://hynek.me/articles/import-attrs/) of *attrs*). -In practice it does a lot more and is more flexible. -For instance, it allows you to define [special handling of NumPy arrays for equality checks](https://www.attrs.org/en/stable/comparison.html#customization), allows more ways to [plug into the initialization process](https://www.attrs.org/en/stable/init.html#hooking-yourself-into-initialization), has a replacement for `__init_subclass__`, and allows for stepping through the generated methods using a debugger. - -For more details, please refer to our [comparison page](https://www.attrs.org/en/stable/why.html#data-classes), but generally speaking, we are more likely to commit crimes against nature to make things work that one would expect to work, but that are quite complicated in practice. - - -## Project Information - -- [**Changelog**](https://www.attrs.org/en/stable/changelog.html) -- [**Documentation**](https://www.attrs.org/) -- [**PyPI**](https://pypi.org/project/attrs/) -- [**Source Code**](https://github.com/python-attrs/attrs) -- [**Contributing**](https://github.com/python-attrs/attrs/blob/main/.github/CONTRIBUTING.md) -- [**Third-party Extensions**](https://github.com/python-attrs/attrs/wiki/Extensions-to-attrs) -- **Get Help**: use the `python-attrs` tag on [Stack Overflow](https://stackoverflow.com/questions/tagged/python-attrs) - - -### *attrs* for Enterprise - -Available as part of the [Tidelift Subscription](https://tidelift.com/?utm_source=lifter&utm_medium=referral&utm_campaign=hynek). - -The maintainers of *attrs* and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications. -Save time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use. - -## Release Information - -### Changes - -- Restore support for generator-based `field_transformer`s. - [#1417](https://github.com/python-attrs/attrs/issues/1417) - - - ---- - -[Full changelog →](https://www.attrs.org/en/stable/changelog.html) diff --git a/venv/lib/python3.12/site-packages/attrs-25.3.0.dist-info/RECORD b/venv/lib/python3.12/site-packages/attrs-25.3.0.dist-info/RECORD deleted file mode 100644 index b04b541..0000000 --- a/venv/lib/python3.12/site-packages/attrs-25.3.0.dist-info/RECORD +++ /dev/null @@ -1,55 +0,0 @@ -attr/__init__.py,sha256=fOYIvt1eGSqQre4uCS3sJWKZ0mwAuC8UD6qba5OS9_U,2057 -attr/__init__.pyi,sha256=QIXnnHPoucmDWkbpNsWTP-cgJ1bn8le7DjyRa_wYdew,11281 -attr/__pycache__/__init__.cpython-312.pyc,, -attr/__pycache__/_cmp.cpython-312.pyc,, -attr/__pycache__/_compat.cpython-312.pyc,, -attr/__pycache__/_config.cpython-312.pyc,, -attr/__pycache__/_funcs.cpython-312.pyc,, -attr/__pycache__/_make.cpython-312.pyc,, -attr/__pycache__/_next_gen.cpython-312.pyc,, -attr/__pycache__/_version_info.cpython-312.pyc,, -attr/__pycache__/converters.cpython-312.pyc,, -attr/__pycache__/exceptions.cpython-312.pyc,, -attr/__pycache__/filters.cpython-312.pyc,, -attr/__pycache__/setters.cpython-312.pyc,, -attr/__pycache__/validators.cpython-312.pyc,, -attr/_cmp.py,sha256=3Nn1TjxllUYiX_nJoVnEkXoDk0hM1DYKj5DE7GZe4i0,4117 -attr/_cmp.pyi,sha256=U-_RU_UZOyPUEQzXE6RMYQQcjkZRY25wTH99sN0s7MM,368 -attr/_compat.py,sha256=4hlXbWhdDjQCDK6FKF1EgnZ3POiHgtpp54qE0nxaGHg,2704 -attr/_config.py,sha256=dGq3xR6fgZEF6UBt_L0T-eUHIB4i43kRmH0P28sJVw8,843 -attr/_funcs.py,sha256=5-tUKJtp3h5El55EcDl6GWXFp68fT8D8U7uCRN6497I,15854 -attr/_make.py,sha256=lBUPPmxiA1BeHzB6OlHoCEh--tVvM1ozXO8eXOa6g4c,96664 -attr/_next_gen.py,sha256=7FRkbtl_N017SuBhf_Vw3mw2c2pGZhtCGOzadgz7tp4,24395 -attr/_typing_compat.pyi,sha256=XDP54TUn-ZKhD62TOQebmzrwFyomhUCoGRpclb6alRA,469 -attr/_version_info.py,sha256=exSqb3b5E-fMSsgZAlEw9XcLpEgobPORCZpcaEglAM4,2121 -attr/_version_info.pyi,sha256=x_M3L3WuB7r_ULXAWjx959udKQ4HLB8l-hsc1FDGNvk,209 -attr/converters.py,sha256=GlDeOzPeTFgeBBLbj9G57Ez5lAk68uhSALRYJ_exe84,3861 -attr/converters.pyi,sha256=orU2bff-VjQa2kMDyvnMQV73oJT2WRyQuw4ZR1ym1bE,643 -attr/exceptions.py,sha256=HRFq4iybmv7-DcZwyjl6M1euM2YeJVK_hFxuaBGAngI,1977 -attr/exceptions.pyi,sha256=zZq8bCUnKAy9mDtBEw42ZhPhAUIHoTKedDQInJD883M,539 -attr/filters.py,sha256=ZBiKWLp3R0LfCZsq7X11pn9WX8NslS2wXM4jsnLOGc8,1795 -attr/filters.pyi,sha256=3J5BG-dTxltBk1_-RuNRUHrv2qu1v8v4aDNAQ7_mifA,208 -attr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -attr/setters.py,sha256=5-dcT63GQK35ONEzSgfXCkbB7pPkaR-qv15mm4PVSzQ,1617 -attr/setters.pyi,sha256=NnVkaFU1BB4JB8E4JuXyrzTUgvtMpj8p3wBdJY7uix4,584 -attr/validators.py,sha256=WaB1HLAHHqRHWsrv_K9H-sJ7ESil3H3Cmv2d8TtVZx4,20046 -attr/validators.pyi,sha256=s2WhKPqskxbsckJfKk8zOuuB088GfgpyxcCYSNFLqNU,2603 -attrs-25.3.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -attrs-25.3.0.dist-info/METADATA,sha256=W38cREj7s1wqNf1fg4hVwZmL1xh0AdSp4IhtTMROinw,10993 -attrs-25.3.0.dist-info/RECORD,, -attrs-25.3.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87 -attrs-25.3.0.dist-info/licenses/LICENSE,sha256=iCEVyV38KvHutnFPjsbVy8q_Znyv-HKfQkINpj9xTp8,1109 -attrs/__init__.py,sha256=qeQJZ4O08yczSn840v9bYOaZyRE81WsVi-QCrY3krCU,1107 -attrs/__init__.pyi,sha256=nZmInocjM7tHV4AQw0vxO_fo6oJjL_PonlV9zKKW8DY,7931 -attrs/__pycache__/__init__.cpython-312.pyc,, -attrs/__pycache__/converters.cpython-312.pyc,, -attrs/__pycache__/exceptions.cpython-312.pyc,, -attrs/__pycache__/filters.cpython-312.pyc,, -attrs/__pycache__/setters.cpython-312.pyc,, -attrs/__pycache__/validators.cpython-312.pyc,, -attrs/converters.py,sha256=8kQljrVwfSTRu8INwEk8SI0eGrzmWftsT7rM0EqyohM,76 -attrs/exceptions.py,sha256=ACCCmg19-vDFaDPY9vFl199SPXCQMN_bENs4DALjzms,76 -attrs/filters.py,sha256=VOUMZug9uEU6dUuA0dF1jInUK0PL3fLgP0VBS5d-CDE,73 -attrs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -attrs/setters.py,sha256=eL1YidYQV3T2h9_SYIZSZR1FAcHGb1TuCTy0E0Lv2SU,73 -attrs/validators.py,sha256=xcy6wD5TtTkdCG1f4XWbocPSO0faBjk5IfVJfP6SUj0,76 diff --git a/venv/lib/python3.12/site-packages/attrs-25.3.0.dist-info/WHEEL b/venv/lib/python3.12/site-packages/attrs-25.3.0.dist-info/WHEEL deleted file mode 100644 index 12228d4..0000000 --- a/venv/lib/python3.12/site-packages/attrs-25.3.0.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: hatchling 1.27.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/venv/lib/python3.12/site-packages/attrs-25.3.0.dist-info/licenses/LICENSE b/venv/lib/python3.12/site-packages/attrs-25.3.0.dist-info/licenses/LICENSE deleted file mode 100644 index 2bd6453..0000000 --- a/venv/lib/python3.12/site-packages/attrs-25.3.0.dist-info/licenses/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 Hynek Schlawack and the attrs 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.12/site-packages/attrs/__init__.py b/venv/lib/python3.12/site-packages/attrs/__init__.py deleted file mode 100644 index e8023ff..0000000 --- a/venv/lib/python3.12/site-packages/attrs/__init__.py +++ /dev/null @@ -1,69 +0,0 @@ -# SPDX-License-Identifier: MIT - -from attr import ( - NOTHING, - Attribute, - AttrsInstance, - Converter, - Factory, - NothingType, - _make_getattr, - assoc, - cmp_using, - define, - evolve, - field, - fields, - fields_dict, - frozen, - has, - make_class, - mutable, - resolve_types, - validate, -) -from attr._next_gen import asdict, astuple - -from . import converters, exceptions, filters, setters, validators - - -__all__ = [ - "NOTHING", - "Attribute", - "AttrsInstance", - "Converter", - "Factory", - "NothingType", - "__author__", - "__copyright__", - "__description__", - "__doc__", - "__email__", - "__license__", - "__title__", - "__url__", - "__version__", - "__version_info__", - "asdict", - "assoc", - "astuple", - "cmp_using", - "converters", - "define", - "evolve", - "exceptions", - "field", - "fields", - "fields_dict", - "filters", - "frozen", - "has", - "make_class", - "mutable", - "resolve_types", - "setters", - "validate", - "validators", -] - -__getattr__ = _make_getattr(__name__) diff --git a/venv/lib/python3.12/site-packages/attrs/__init__.pyi b/venv/lib/python3.12/site-packages/attrs/__init__.pyi deleted file mode 100644 index 648fa7a..0000000 --- a/venv/lib/python3.12/site-packages/attrs/__init__.pyi +++ /dev/null @@ -1,263 +0,0 @@ -import sys - -from typing import ( - Any, - Callable, - Mapping, - Sequence, - overload, - TypeVar, -) - -# Because we need to type our own stuff, we have to make everything from -# attr explicitly public too. -from attr import __author__ as __author__ -from attr import __copyright__ as __copyright__ -from attr import __description__ as __description__ -from attr import __email__ as __email__ -from attr import __license__ as __license__ -from attr import __title__ as __title__ -from attr import __url__ as __url__ -from attr import __version__ as __version__ -from attr import __version_info__ as __version_info__ -from attr import assoc as assoc -from attr import Attribute as Attribute -from attr import AttrsInstance as AttrsInstance -from attr import cmp_using as cmp_using -from attr import converters as converters -from attr import Converter as Converter -from attr import evolve as evolve -from attr import exceptions as exceptions -from attr import Factory as Factory -from attr import fields as fields -from attr import fields_dict as fields_dict -from attr import filters as filters -from attr import has as has -from attr import make_class as make_class -from attr import NOTHING as NOTHING -from attr import resolve_types as resolve_types -from attr import setters as setters -from attr import validate as validate -from attr import validators as validators -from attr import attrib, asdict as asdict, astuple as astuple -from attr import NothingType as NothingType - -if sys.version_info >= (3, 11): - from typing import dataclass_transform -else: - from typing_extensions import dataclass_transform - -_T = TypeVar("_T") -_C = TypeVar("_C", bound=type) - -_EqOrderType = bool | Callable[[Any], Any] -_ValidatorType = Callable[[Any, "Attribute[_T]", _T], Any] -_CallableConverterType = Callable[[Any], Any] -_ConverterType = _CallableConverterType | Converter[Any, Any] -_ReprType = Callable[[Any], str] -_ReprArgType = bool | _ReprType -_OnSetAttrType = Callable[[Any, "Attribute[Any]", Any], Any] -_OnSetAttrArgType = _OnSetAttrType | list[_OnSetAttrType] | setters._NoOpType -_FieldTransformer = Callable[ - [type, list["Attribute[Any]"]], list["Attribute[Any]"] -] -# FIXME: in reality, if multiple validators are passed they must be in a list -# or tuple, but those are invariant and so would prevent subtypes of -# _ValidatorType from working when passed in a list or tuple. -_ValidatorArgType = _ValidatorType[_T] | Sequence[_ValidatorType[_T]] - -@overload -def field( - *, - default: None = ..., - validator: None = ..., - repr: _ReprArgType = ..., - hash: bool | None = ..., - init: bool = ..., - metadata: Mapping[Any, Any] | None = ..., - converter: None = ..., - factory: None = ..., - kw_only: bool = ..., - eq: bool | None = ..., - order: bool | None = ..., - on_setattr: _OnSetAttrArgType | None = ..., - alias: str | None = ..., - type: type | None = ..., -) -> Any: ... - -# This form catches an explicit None or no default and infers the type from the -# other arguments. -@overload -def field( - *, - default: None = ..., - validator: _ValidatorArgType[_T] | None = ..., - repr: _ReprArgType = ..., - hash: bool | None = ..., - init: bool = ..., - metadata: Mapping[Any, Any] | None = ..., - converter: _ConverterType - | list[_ConverterType] - | tuple[_ConverterType] - | None = ..., - factory: Callable[[], _T] | None = ..., - kw_only: bool = ..., - eq: _EqOrderType | None = ..., - order: _EqOrderType | None = ..., - on_setattr: _OnSetAttrArgType | None = ..., - alias: str | None = ..., - type: type | None = ..., -) -> _T: ... - -# This form catches an explicit default argument. -@overload -def field( - *, - default: _T, - validator: _ValidatorArgType[_T] | None = ..., - repr: _ReprArgType = ..., - hash: bool | None = ..., - init: bool = ..., - metadata: Mapping[Any, Any] | None = ..., - converter: _ConverterType - | list[_ConverterType] - | tuple[_ConverterType] - | None = ..., - factory: Callable[[], _T] | None = ..., - kw_only: bool = ..., - eq: _EqOrderType | None = ..., - order: _EqOrderType | None = ..., - on_setattr: _OnSetAttrArgType | None = ..., - alias: str | None = ..., - type: type | None = ..., -) -> _T: ... - -# This form covers type=non-Type: e.g. forward references (str), Any -@overload -def field( - *, - default: _T | None = ..., - validator: _ValidatorArgType[_T] | None = ..., - repr: _ReprArgType = ..., - hash: bool | None = ..., - init: bool = ..., - metadata: Mapping[Any, Any] | None = ..., - converter: _ConverterType - | list[_ConverterType] - | tuple[_ConverterType] - | None = ..., - factory: Callable[[], _T] | None = ..., - kw_only: bool = ..., - eq: _EqOrderType | None = ..., - order: _EqOrderType | None = ..., - on_setattr: _OnSetAttrArgType | None = ..., - alias: str | None = ..., - type: type | None = ..., -) -> Any: ... -@overload -@dataclass_transform(field_specifiers=(attrib, field)) -def define( - maybe_cls: _C, - *, - these: dict[str, Any] | None = ..., - repr: bool = ..., - unsafe_hash: bool | None = ..., - hash: bool | None = ..., - init: bool = ..., - slots: bool = ..., - frozen: bool = ..., - weakref_slot: bool = ..., - str: bool = ..., - auto_attribs: bool = ..., - kw_only: bool = ..., - cache_hash: bool = ..., - auto_exc: bool = ..., - eq: bool | None = ..., - order: bool | None = ..., - auto_detect: bool = ..., - getstate_setstate: bool | None = ..., - on_setattr: _OnSetAttrArgType | None = ..., - field_transformer: _FieldTransformer | None = ..., - match_args: bool = ..., -) -> _C: ... -@overload -@dataclass_transform(field_specifiers=(attrib, field)) -def define( - maybe_cls: None = ..., - *, - these: dict[str, Any] | None = ..., - repr: bool = ..., - unsafe_hash: bool | None = ..., - hash: bool | None = ..., - init: bool = ..., - slots: bool = ..., - frozen: bool = ..., - weakref_slot: bool = ..., - str: bool = ..., - auto_attribs: bool = ..., - kw_only: bool = ..., - cache_hash: bool = ..., - auto_exc: bool = ..., - eq: bool | None = ..., - order: bool | None = ..., - auto_detect: bool = ..., - getstate_setstate: bool | None = ..., - on_setattr: _OnSetAttrArgType | None = ..., - field_transformer: _FieldTransformer | None = ..., - match_args: bool = ..., -) -> Callable[[_C], _C]: ... - -mutable = define - -@overload -@dataclass_transform(frozen_default=True, field_specifiers=(attrib, field)) -def frozen( - maybe_cls: _C, - *, - these: dict[str, Any] | None = ..., - repr: bool = ..., - unsafe_hash: bool | None = ..., - hash: bool | None = ..., - init: bool = ..., - slots: bool = ..., - frozen: bool = ..., - weakref_slot: bool = ..., - str: bool = ..., - auto_attribs: bool = ..., - kw_only: bool = ..., - cache_hash: bool = ..., - auto_exc: bool = ..., - eq: bool | None = ..., - order: bool | None = ..., - auto_detect: bool = ..., - getstate_setstate: bool | None = ..., - on_setattr: _OnSetAttrArgType | None = ..., - field_transformer: _FieldTransformer | None = ..., - match_args: bool = ..., -) -> _C: ... -@overload -@dataclass_transform(frozen_default=True, field_specifiers=(attrib, field)) -def frozen( - maybe_cls: None = ..., - *, - these: dict[str, Any] | None = ..., - repr: bool = ..., - unsafe_hash: bool | None = ..., - hash: bool | None = ..., - init: bool = ..., - slots: bool = ..., - frozen: bool = ..., - weakref_slot: bool = ..., - str: bool = ..., - auto_attribs: bool = ..., - kw_only: bool = ..., - cache_hash: bool = ..., - auto_exc: bool = ..., - eq: bool | None = ..., - order: bool | None = ..., - auto_detect: bool = ..., - getstate_setstate: bool | None = ..., - on_setattr: _OnSetAttrArgType | None = ..., - field_transformer: _FieldTransformer | None = ..., - match_args: bool = ..., -) -> Callable[[_C], _C]: ... diff --git a/venv/lib/python3.12/site-packages/attrs/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/attrs/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 0a5bd280d48dfae76b3cfda70db497134b0b1bf7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1154 zcmaKqJC7Vi5XWcsF|&``-Fu&X4;v&Ltnl4{Nf8nU0y|j(9Cgy_o2lDvUDwR2yLat{ z#C!^f5F$f-6hcJODFJc@Twuu&Rdahn0>K2osVY@h{j0iv8Vq_7eJ{TKa`t&EihgD1 z_G_+<>+i_;Ix3<fHW9`m#)fEMQ#7$9TG$qCOhkgINU<Y2*cDyui5~VvA2-AX4#WV5 zVu&L#!cDP>TVe~h#WwDU9o!YWG1qOFJ=_=jcpwhQZx$_c2k(lzcqk6>NF3p@IK~rk z5=YahXn!AzdyNQExc_5(qforDO2+9+cE-CQoqYE6@sr7?q5GltR$nYUgaMoGN$I>Q za|qp!s&Wa|gAM5?D)*ILh5n@SGhI%fuI7|4QC)$Yf>(4fw3TyJ9=bWs<-$=?ND8>r zC4>Z)m03b)UurN#Na~*p{hPlmbnYo=t1qAo&6#qcR~OC=RSYREyt**d&Vu7I(o=I6 zI!k4Ap*)NmAyKX_k}BsHa|17V=5agp^4k%pCOpq!?sZjC%}Z@)E;1bW+UTvTRo0E) zvV5tQZaT7UM#4xL9YW|ysTO`#St)4;GOy+<tEV$h?nuf4TyAyUhyp1Es+^3jlz>Vb zGW${*okQv1ChoO2Y*OyRt`lhSj-*m_Q_5RMmzR~4_JEb}i?nwbea0bUgE3$nF@}s0 zW0P^r*kWumb{M;iJ;n)RpK*^c8NV4?e5?Pz3ftuawUk=L-va*8`#;-q$1vnhXR?In zo?cUVGa%0v)`QjK)cR|gtdO^*3~#F=WvP%CNQ+%RMk#-Yt|=>e4cV+h$WVE=%s#I2 z1w!dv=E1<!Dm-;w=T~4)i|ScvDpi2ZmQXG;qc5`gif*}l@9f=2nbRIl=PJKaQ*asU zb(xg9)O71-^VRFl`&bnV10UE&)Rmu~J16|!jN|xKvKKdAMgPWi9eWtXZ~qpZ{}P@5 bnLOw>UZj6a;%IdI&Eubk55DT#cc{!?Y7#>^ diff --git a/venv/lib/python3.12/site-packages/attrs/__pycache__/converters.cpython-312.pyc b/venv/lib/python3.12/site-packages/attrs/__pycache__/converters.cpython-312.pyc deleted file mode 100644 index 671b7429af219162166a2da55043628bb71095b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 239 zcmX@j%ge<81P$}5Gkk#bV-N=hn4pZ$d_cx@h7^Vr#vF#VOpFYbOq$FuL6Vw`w-~kj zfFyrnNlB4ja(-S}YEemQQSnNK&mj3<>G~P@xvBcOi6zBl`Y!p&rManjCB^zBsX3|X zMTxn(#U+`^*{MakDf#7jIr)hxsYUu_sd;7kIhjfN1(hWk`FX~AhDQ3unI);Z1&PVo ziRr1u`XIZC^%0io6;%G>u*uC&Da}c>E8+m!%Lv59Adh`uW@Kdi%ErJbSHuS70swI1 BL#hA( diff --git a/venv/lib/python3.12/site-packages/attrs/__pycache__/exceptions.cpython-312.pyc b/venv/lib/python3.12/site-packages/attrs/__pycache__/exceptions.cpython-312.pyc deleted file mode 100644 index 097bd426d0852a4c8eb31a3a0f1b582fe68892c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 239 zcmX@j%ge<81P$}5Gkk#bV-N=hn4pZ$d_cx@h7^Vr#vF#VOpFYbOq$FuL6Vw`w-~kj zfFyrnNlB4jYDIEtK}lwQUhztX&mj3<>G~P@xvBcOi6zBl`Y!p&rManjCB^zBsX3|X zMTxn(#U+`^*{MakDf#7jIr)hxsYUu_sd;7kIhjfN1(hWk`FX~AhDQ3unI);Z1&PVo ziRr1u`XIZC^%0io6;%G>u*uC&Da}c>E8+m!%Lv59Adh`uW@Kdi%ErJbSHuS70sv{U BLzn;n diff --git a/venv/lib/python3.12/site-packages/attrs/__pycache__/filters.cpython-312.pyc b/venv/lib/python3.12/site-packages/attrs/__pycache__/filters.cpython-312.pyc deleted file mode 100644 index d543ec351d08cac069ad1a5a12137c75ef40fd2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233 zcmX@j%ge<81P$}5GdzLxV-N=hn4pZ$d_cx@h7^Vr#vF#VOpFYbOq$FuL6Vw`w-~kj zfFw_1NlB4jT4qj3YEkh@hR-0$Un%+-`MIh3xrrskW%@4p$)&lec_qdAC8;^7=|zdT zy2T}#$=Rtzx+(ePc{%xsDXB&JWvO{(`Z<|N`URCG8Tom}dWJ^&#hE3kx&?{J*@@|? y#rhzNiuIv3=@nG|;;_lhPbtkwwJYKPTFMB-#UL+zU}j`w{L03_C|$$`<N^ST89@2~ diff --git a/venv/lib/python3.12/site-packages/attrs/__pycache__/setters.cpython-312.pyc b/venv/lib/python3.12/site-packages/attrs/__pycache__/setters.cpython-312.pyc deleted file mode 100644 index ded565913f5c15abdc65e94f1ef979815f848e2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233 zcmX@j%ge<81P$}5GdzLxV-N=hn4pZ$d_cx@h7^Vr#vF#VOpFYbOq$FuL6Vw`w-~kj zfFw_1NlB4jacW6PYEkh@hR-0$Un%+-`MIh3xrrskW%@4p$)&lec_qdAC8;^7=|zdT zy2T}#$=Rtzx+(ePc{%xsDXB&JWvO{(`Z<|N`URCG8Tom}dWJ^&#hE3kx&?{J*@@|? y#rhzNiuIv3=@nG|;;_lhPbtkwwJYKPTFMB-#UL+zU}j`w{L03_C|$$`<N^SgjX@j$ diff --git a/venv/lib/python3.12/site-packages/attrs/__pycache__/validators.cpython-312.pyc b/venv/lib/python3.12/site-packages/attrs/__pycache__/validators.cpython-312.pyc deleted file mode 100644 index d30e532ca12627e89a15c88a8dd0b6a727ab7bc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 239 zcmX@j%ge<81P$}5Gkk#bV-N=hn4pZ$d_cx@h7^Vr#vF#VOpFYbOq$FuL6Vw`w-~kj zfFyrnNlB4jSz=CRN@7WVQSnNK&mj3<>G~P@xvBcOi6zBl`Y!p&rManjCB^zBsX3|X zMTxn(#U+`^*{MakDf#7jIr)hxsYUu_sd;7kIhjfN1(hWk`FX~AhDQ3unI);Z1&PVo ziRr1u`XIZC^%0io6;%G>u*uC&Da}c>E8+m!%Lv59Adh`uW@Kdi%ErJbSHuS70svxx BLxunV diff --git a/venv/lib/python3.12/site-packages/attrs/converters.py b/venv/lib/python3.12/site-packages/attrs/converters.py deleted file mode 100644 index 7821f6c..0000000 --- a/venv/lib/python3.12/site-packages/attrs/converters.py +++ /dev/null @@ -1,3 +0,0 @@ -# SPDX-License-Identifier: MIT - -from attr.converters import * # noqa: F403 diff --git a/venv/lib/python3.12/site-packages/attrs/exceptions.py b/venv/lib/python3.12/site-packages/attrs/exceptions.py deleted file mode 100644 index 3323f9d..0000000 --- a/venv/lib/python3.12/site-packages/attrs/exceptions.py +++ /dev/null @@ -1,3 +0,0 @@ -# SPDX-License-Identifier: MIT - -from attr.exceptions import * # noqa: F403 diff --git a/venv/lib/python3.12/site-packages/attrs/filters.py b/venv/lib/python3.12/site-packages/attrs/filters.py deleted file mode 100644 index 3080f48..0000000 --- a/venv/lib/python3.12/site-packages/attrs/filters.py +++ /dev/null @@ -1,3 +0,0 @@ -# SPDX-License-Identifier: MIT - -from attr.filters import * # noqa: F403 diff --git a/venv/lib/python3.12/site-packages/attrs/py.typed b/venv/lib/python3.12/site-packages/attrs/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/attrs/setters.py b/venv/lib/python3.12/site-packages/attrs/setters.py deleted file mode 100644 index f3d73bb..0000000 --- a/venv/lib/python3.12/site-packages/attrs/setters.py +++ /dev/null @@ -1,3 +0,0 @@ -# SPDX-License-Identifier: MIT - -from attr.setters import * # noqa: F403 diff --git a/venv/lib/python3.12/site-packages/attrs/validators.py b/venv/lib/python3.12/site-packages/attrs/validators.py deleted file mode 100644 index 037e124..0000000 --- a/venv/lib/python3.12/site-packages/attrs/validators.py +++ /dev/null @@ -1,3 +0,0 @@ -# SPDX-License-Identifier: MIT - -from attr.validators import * # noqa: F403 diff --git a/venv/lib/python3.12/site-packages/certifi-2025.7.14.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/certifi-2025.7.14.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.12/site-packages/certifi-2025.7.14.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/certifi-2025.7.14.dist-info/METADATA b/venv/lib/python3.12/site-packages/certifi-2025.7.14.dist-info/METADATA deleted file mode 100644 index a2dece8..0000000 --- a/venv/lib/python3.12/site-packages/certifi-2025.7.14.dist-info/METADATA +++ /dev/null @@ -1,77 +0,0 @@ -Metadata-Version: 2.4 -Name: certifi -Version: 2025.7.14 -Summary: Python package for providing Mozilla's CA Bundle. -Home-page: https://github.com/certifi/python-certifi -Author: Kenneth Reitz -Author-email: me@kennethreitz.com -License: MPL-2.0 -Project-URL: Source, https://github.com/certifi/python-certifi -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0) -Classifier: Natural Language :: English -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.7 -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 -Requires-Python: >=3.7 -License-File: LICENSE -Dynamic: author -Dynamic: author-email -Dynamic: classifier -Dynamic: description -Dynamic: home-page -Dynamic: license -Dynamic: license-file -Dynamic: project-url -Dynamic: requires-python -Dynamic: summary - -Certifi: Python SSL Certificates -================================ - -Certifi provides Mozilla's carefully curated collection of Root Certificates for -validating the trustworthiness of SSL certificates while verifying the identity -of TLS hosts. It has been extracted from the `Requests`_ project. - -Installation ------------- - -``certifi`` is available on PyPI. Simply install it with ``pip``:: - - $ pip install certifi - -Usage ------ - -To reference the installed certificate authority (CA) bundle, you can use the -built-in function:: - - >>> import certifi - - >>> certifi.where() - '/usr/local/lib/python3.7/site-packages/certifi/cacert.pem' - -Or from the command line:: - - $ python -m certifi - /usr/local/lib/python3.7/site-packages/certifi/cacert.pem - -Enjoy! - -.. _`Requests`: https://requests.readthedocs.io/en/master/ - -Addition/Removal of Certificates --------------------------------- - -Certifi does not support any addition/removal or other modification of the -CA trust store content. This project is intended to provide a reliable and -highly portable root of trust to python deployments. Look to upstream projects -for methods to use alternate trust. diff --git a/venv/lib/python3.12/site-packages/certifi-2025.7.14.dist-info/RECORD b/venv/lib/python3.12/site-packages/certifi-2025.7.14.dist-info/RECORD deleted file mode 100644 index 53636b1..0000000 --- a/venv/lib/python3.12/site-packages/certifi-2025.7.14.dist-info/RECORD +++ /dev/null @@ -1,14 +0,0 @@ -certifi-2025.7.14.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -certifi-2025.7.14.dist-info/METADATA,sha256=7cmDKO0a-fVcP_WCfZ4DpLKgDMu_AEAYhTT5lswQToY,2423 -certifi-2025.7.14.dist-info/RECORD,, -certifi-2025.7.14.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91 -certifi-2025.7.14.dist-info/licenses/LICENSE,sha256=6TcW2mucDVpKHfYP5pWzcPBpVgPSH2-D8FPkLPwQyvc,989 -certifi-2025.7.14.dist-info/top_level.txt,sha256=KMu4vUCfsjLrkPbSNdgdekS-pVJzBAJFO__nI8NF6-U,8 -certifi/__init__.py,sha256=dvNDUdAXp-hzoYcf09PXzLmHIlPfypaBQPFp5esDXyo,94 -certifi/__main__.py,sha256=xBBoj905TUWBLRGANOcf7oi6e-3dMP4cEoG9OyMs11g,243 -certifi/__pycache__/__init__.cpython-312.pyc,, -certifi/__pycache__/__main__.cpython-312.pyc,, -certifi/__pycache__/core.cpython-312.pyc,, -certifi/cacert.pem,sha256=lm3cYJxEv9SoAx4Atc3NiT1D92d965vcID6H39f_93o,290057 -certifi/core.py,sha256=XFXycndG5pf37ayeF8N32HUuDafsyhkVMbO4BAPWHa0,3394 -certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/venv/lib/python3.12/site-packages/certifi-2025.7.14.dist-info/WHEEL b/venv/lib/python3.12/site-packages/certifi-2025.7.14.dist-info/WHEEL deleted file mode 100644 index e7fa31b..0000000 --- a/venv/lib/python3.12/site-packages/certifi-2025.7.14.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (80.9.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/venv/lib/python3.12/site-packages/certifi-2025.7.14.dist-info/licenses/LICENSE b/venv/lib/python3.12/site-packages/certifi-2025.7.14.dist-info/licenses/LICENSE deleted file mode 100644 index 62b076c..0000000 --- a/venv/lib/python3.12/site-packages/certifi-2025.7.14.dist-info/licenses/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -This package contains a modified version of ca-bundle.crt: - -ca-bundle.crt -- Bundle of CA Root Certificates - -This is a bundle of X.509 certificates of public Certificate Authorities -(CA). These were automatically extracted from Mozilla's root certificates -file (certdata.txt). This file can be found in the mozilla source tree: -https://hg.mozilla.org/mozilla-central/file/tip/security/nss/lib/ckfw/builtins/certdata.txt -It contains the certificates in PEM format and therefore -can be directly used with curl / libcurl / php_curl, or with -an Apache+mod_ssl webserver for SSL client authentication. -Just configure this file as the SSLCACertificateFile.# - -***** BEGIN LICENSE BLOCK ***** -This Source Code Form is subject to the terms of the Mozilla Public License, -v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain -one at http://mozilla.org/MPL/2.0/. - -***** END LICENSE BLOCK ***** -@(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $ diff --git a/venv/lib/python3.12/site-packages/certifi-2025.7.14.dist-info/top_level.txt b/venv/lib/python3.12/site-packages/certifi-2025.7.14.dist-info/top_level.txt deleted file mode 100644 index 963eac5..0000000 --- a/venv/lib/python3.12/site-packages/certifi-2025.7.14.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -certifi diff --git a/venv/lib/python3.12/site-packages/certifi/__init__.py b/venv/lib/python3.12/site-packages/certifi/__init__.py deleted file mode 100644 index e837049..0000000 --- a/venv/lib/python3.12/site-packages/certifi/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .core import contents, where - -__all__ = ["contents", "where"] -__version__ = "2025.07.14" diff --git a/venv/lib/python3.12/site-packages/certifi/__main__.py b/venv/lib/python3.12/site-packages/certifi/__main__.py deleted file mode 100644 index 8945b5d..0000000 --- a/venv/lib/python3.12/site-packages/certifi/__main__.py +++ /dev/null @@ -1,12 +0,0 @@ -import argparse - -from certifi import contents, where - -parser = argparse.ArgumentParser() -parser.add_argument("-c", "--contents", action="store_true") -args = parser.parse_args() - -if args.contents: - print(contents()) -else: - print(where()) diff --git a/venv/lib/python3.12/site-packages/certifi/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/certifi/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index b3a2f1173404aad31c4e6f649ffc70649ad95ccf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 327 zcmYjMJx{|h5Vez(mPTbmNG!nEp>bP4EQpDjACLhn#7AP)AC>K<DlGILu(7f8TUZ!T z7Lb@&5K^~JI1)&_;oZA?cY3<#UayNhz8-JOOJ6^l<`2QISnYf9fEZ#}Ac<2fgEYX1 z1uQIrG-Od4En5AJPwdzFLEXu<a-f{8Tk{eOn9$En<msk69*&Qb;Yl(&y6Cs+DA)h( zx=m>&1f_LMX$8h|ttfp$D}RdC1u3-zA~R<za<224Y%+)g0fourz&f5!zzmq4E1@$6 zhE$*`BKQ@VE?lYAVKN#M%N-1+Sw6`Mup|fL_%$b#a>X5`$#k*qoJ!4R0?thAbDO8^ ej;HSsWBi5=-sA22`Ac{2uKl{TyNu1I_kIAQPg^Dc diff --git a/venv/lib/python3.12/site-packages/certifi/__pycache__/__main__.cpython-312.pyc b/venv/lib/python3.12/site-packages/certifi/__pycache__/__main__.cpython-312.pyc deleted file mode 100644 index c083b7f998feb9025d7cf43bf31a2f88d998ebf9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 642 zcmZuu&ubJh7)|E)3~nnf!s2OBL|2>!_1X$T&&8wcWr&kFJKLGbkYu-P^-u&+>BXC# zJS*#e;>D$vt?^RvAYMf1ttT_no$kdz^1ZzGzAs;r&#hJf^!W4s>EJ}ipVg)r_5z$7 zYVZ~iKwt*?RWve~8+{`;`z8bipkU}VNy|80z`jlGVQa}Zh?vA8_9tg*o-q(;-)f^S z<9QvAdP8f;H;Aw34tzb0#yN#&8Uz!#(9Hj7J@<EI-0B(1i&-IQA%(Jc29(oXBaC;0 zFg&LNAsMHU<RjXH%E7TrS<wrWhj~(BE~s*2%4PZ_<<)(7)u>u|z>`s~%Ra0eTsgIq zs|%QrNGH~s3Tn363uV=-UGlV$A3^mc;50!4mQ$2tDaL4%#dVfIl4dmFI1hzP<88`A z!gh*`VL~|?(_)OW^f4+Ya=?mvYj^G<kxCktINrty6==~cilQ8+MHH=-lT&X!XJnMo z`}~qVw|YeJNH2d)2;q0I`U_k;_Peh-bH6+Dy9fT&J?98GbI_iF_M6Rjw?91l0@{aQ t{m5<2-OkMI9Jp8ZtYg!Cx$%7Co8`a0xqs`cb@_)z*Y|I{*y0y;@qbBWpo;(i diff --git a/venv/lib/python3.12/site-packages/certifi/__pycache__/core.cpython-312.pyc b/venv/lib/python3.12/site-packages/certifi/__pycache__/core.cpython-312.pyc deleted file mode 100644 index 7d93044b58129c64725c167a7688f2cd16b08c33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2074 zcmbVN&u`;I6dpTH<NR8ewzTPH)kHx+12hrcY8O;M-EEP8R$bIqh>egeV^15WNgT~g zf3Xtkfx~j5x9wrI>VZR7<qz0D0SOKbSrlY?KmrN%f{IcJsVCkzwv&dQc+$N0JoBD2 z{=RP}Kg8n^1oqdH2gSQ_gns7_o{4VKI)LO6GEe~-f+3cLg5X54AQ~}4`bsJUuuzh{ zwoWvH>z^S+MxnZ|9IW&e`YNG9NI-_D$uPo307q6uBLr`Vy15K_Y)6ESFm%KV*D6Xu z`A<irt0UU($i~0G5gij|u9~^pPUK79B9WD%Nz)a}*eK&P!EA$6X_^&r+N@HhmCG74 zt!lb#>FvZ?P3szeQ?7<9X^W&yM$@`gWw^>{E^^AhZ_(~+zew+VEkZ$f2*7Aff_sFR zzgFV2J!Sx)20C(A1hj*)!eUmmqw4IP+4q-L)Y+9!ZCO?Ew#iiWDQfZl3q4=7DmY)! z7~RazS^7qW?<&u58LttoGC`TCuVXS{SX<Syr5TvyH*s|{Up7C_*LGOZs@}}KIhm&> z!xJ@4U)R<!&AYJWb&FuY&Q_e?Y=fZcY@2Y6@Ii;b?V=M&X-bK@l-M8IX9p`kORo{m zepWo?UvnCDayz6^b=53mJIFoNVb(VvsUKmg8>!v<%*TrHD#r}rNN8uJkUP~C4AEQl zq9!rE3CEZ(%n}H^*N)r?zY{UVt10z+StqgqFZVixE}oas)4-w~a`C)~baa%B*fEdT zkMFE}K=@wBHE_0Evdn5tV@1Nh*A7rd>@e^Sf+MPG_i2pNVao)snH1(6HVDVTL7jwo zS8%I{2_~bEzX*fQgWE;t{V0|=j;79sQ8M%G%ZK4cX0n-?u4ks7Ei^J8Hm-m4aQ-AY z_V__FHC0bdHBz@4$=eSXPGSS!-23|8<9p9zZ~UPokL9HEOP3hrEb-C$1ROBv@`K=t z@Q}Gu^*&c6pIvx?YewKZ$?FCzgNx(^SRov9JE&3JG_!&&<Em~MW_2waZ~!D+ly;b4 z%}@a<)(eg7on4ZG!W<0x3OJClGPHNUp`@D1cwHGkywOl@HI<pVGV}eb$I47YSvr=N zTw&XiL(mxXT|z;E2?vEIkX+L7-Hwj=WqIUYrkcon1vB35Sc!AkV^=8C*K{e?Qw)!c zi^(w$!OO}dT+LaT3_`HwHOy3BbA(HV40AWaU4lD)-g}^Q<mI@xV3EEHu1jMHlzi#n z?Za~8`t<)+m47dAq%W(=5FK@Jw854UNkYg9gje?NlN0T*y#xv68scmx_D2sEp51<~ z%pS|LF0q8aZ!z0%hg8+DbU1GTx<lJAa0KkwCMFdAA5^otYT1KkrDhQZw`q=GYHbi5 z)6P+L4zL4o8&Q55oo$db&obOyvE2*#o%Wy8dt@9+_(`JM;LZYqAp9)`1*sK7LiAS@ zZ%Kmi`k9QRP%|)C4-D>Y{S+AcQ=0s3V0d@_m%)+Ug)?a+cw_Ho3qd%W6oSjbo_>ya a{3n8fGeUP|qFo8$Y)S~uxs`K*1I@qt2BnAq diff --git a/venv/lib/python3.12/site-packages/certifi/cacert.pem b/venv/lib/python3.12/site-packages/certifi/cacert.pem deleted file mode 100644 index 64c05d7..0000000 --- a/venv/lib/python3.12/site-packages/certifi/cacert.pem +++ /dev/null @@ -1,4778 +0,0 @@ - -# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Label: "Entrust Root Certification Authority" -# Serial: 1164660820 -# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 -# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 -# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 -Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW -KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw -NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw -NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy -ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV -BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo -Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 -4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 -KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI -rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi -94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB -sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi -gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo -kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE -vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t -O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua -AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP -9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ -eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m -0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2" -# Serial: 1289 -# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b -# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 -# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 ------BEGIN CERTIFICATE----- -MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa -GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg -Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J -WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB -rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp -+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 -ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i -Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz -PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og -/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH -oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI -yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud -EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 -A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL -MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT -ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f -BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn -g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl -fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K -WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha -B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc -hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR -TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD -mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z -ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y -4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza -8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3" -# Serial: 1478 -# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf -# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 -# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 ------BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM -V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB -4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr -H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd -8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv -vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT -mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe -btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc -T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt -WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ -c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A -4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD -VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG -CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 -aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 -aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu -dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw -czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G -A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg -Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 -7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem -d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd -+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B -4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN -t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x -DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 -k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s -zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j -Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT -mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK -4SVhM7JZG+Ju1zdXtg2pEto= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root CA" -# Serial: 17154717934120587862167794914071425081 -# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 -# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 -# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c -JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP -mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ -wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 -VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ -AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB -AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun -pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC -dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf -fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm -NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx -H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root CA" -# Serial: 10944719598952040374951832963794454346 -# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e -# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 -# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert High Assurance EV Root CA" -# Serial: 3553400076410547919724730734378100087 -# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a -# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 -# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j -ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 -LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug -RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm -+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW -PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM -xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB -Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 -hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg -EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA -FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec -nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z -eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF -hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 -Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep -+OkuE6N36B9K ------END CERTIFICATE----- - -# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG -# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG -# Label: "SwissSign Gold CA - G2" -# Serial: 13492815561806991280 -# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 -# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 -# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=SecureTrust CA O=SecureTrust Corporation -# Subject: CN=SecureTrust CA O=SecureTrust Corporation -# Label: "SecureTrust CA" -# Serial: 17199774589125277788362757014266862032 -# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 -# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 -# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz -MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv -cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz -Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO -0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao -wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj -7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS -8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT -BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg -JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 -6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ -3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm -D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS -CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- - -# Issuer: CN=Secure Global CA O=SecureTrust Corporation -# Subject: CN=Secure Global CA O=SecureTrust Corporation -# Label: "Secure Global CA" -# Serial: 9751836167731051554232119481456978597 -# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de -# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b -# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx -MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg -Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ -iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa -/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ -jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI -HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 -sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w -gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw -KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG -AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L -URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO -H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm -I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY -iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- - -# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO Certification Authority O=COMODO CA Limited -# Label: "COMODO Certification Authority" -# Serial: 104350513648249232941998508985834464573 -# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 -# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b -# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB -gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV -BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw -MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl -YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P -RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 -UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI -2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 -Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp -+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ -DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O -nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW -/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g -PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u -QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY -SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv -IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 -zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd -BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB -ZQ== ------END CERTIFICATE----- - -# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Label: "COMODO ECC Certification Authority" -# Serial: 41578283867086692638256921589707938090 -# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 -# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 -# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT -IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw -MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy -ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N -T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR -FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J -cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW -BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm -fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv -GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- - -# Issuer: CN=Certigna O=Dhimyotis -# Subject: CN=Certigna O=Dhimyotis -# Label: "Certigna" -# Serial: 18364802974209362175 -# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff -# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 -# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d ------BEGIN CERTIFICATE----- -MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV -BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X -DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ -BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 -QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny -gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw -zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q -130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 -JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw -ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT -AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj -AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG -9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h -bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc -fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu -HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w -t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw -WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== ------END CERTIFICATE----- - -# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority -# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority -# Label: "ePKI Root Certification Authority" -# Serial: 28956088682735189655030529057352760477 -# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 -# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 -# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 ------BEGIN CERTIFICATE----- -MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe -MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 -ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw -IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL -SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH -SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh -ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X -DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 -TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ -fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA -sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU -WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS -nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH -dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip -NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC -AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF -MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH -ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB -uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl -PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP -JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ -gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 -j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 -5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB -o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS -/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z -Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE -W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D -hNQ+IIX3Sj0rnP0qCglN6oH4EZw= ------END CERTIFICATE----- - -# Issuer: O=certSIGN OU=certSIGN ROOT CA -# Subject: O=certSIGN OU=certSIGN ROOT CA -# Label: "certSIGN ROOT CA" -# Serial: 35210227249154 -# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 -# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b -# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb ------BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT -AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD -QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP -MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do -0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ -UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d -RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ -OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv -JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C -AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O -BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ -LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY -MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ -44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I -Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw -i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN -9u6wWk5JRFRYX0KD ------END CERTIFICATE----- - -# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) -# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) -# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" -# Serial: 80544274841616 -# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 -# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 -# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG -EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 -MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl -cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR -dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB -pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM -b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz -IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT -lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz -AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 -VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG -ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 -BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG -AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M -U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh -bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C -+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F -uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 -XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= ------END CERTIFICATE----- - -# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Label: "Microsec e-Szigno Root CA 2009" -# Serial: 14014712776195784473 -# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 -# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e -# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 ------BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD -VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 -ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G -CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y -OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx -FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp -Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP -kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc -cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U -fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 -N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC -xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 -+rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM -Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG -SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h -mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk -ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c -2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t -HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Label: "GlobalSign Root CA - R3" -# Serial: 4835703278459759426209954 -# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 -# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad -# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 -MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 -RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT -gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm -KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd -QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ -XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o -LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU -RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp -jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK -6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX -mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs -Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH -WD9f ------END CERTIFICATE----- - -# Issuer: CN=Izenpe.com O=IZENPE S.A. -# Subject: CN=Izenpe.com O=IZENPE S.A. -# Label: "Izenpe.com" -# Serial: 917563065490389241595536686991402621 -# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 -# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 -# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Label: "Go Daddy Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 -# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b -# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT -EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp -ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz -NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH -EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE -AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD -E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH -/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy -DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh -GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR -tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA -AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX -WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu -9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr -gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo -2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI -4uJEvlz36hz1 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 -# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e -# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs -ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw -MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj -aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp -Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg -nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 -HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N -Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN -dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 -HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G -CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU -sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 -4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg -8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 -mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Services Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 -# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f -# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs -ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 -MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD -VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy -ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy -dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p -OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 -8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K -Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe -hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk -6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q -AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI -bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB -ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z -qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd -iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn -0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN -sSi6 ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Commercial O=AffirmTrust -# Subject: CN=AffirmTrust Commercial O=AffirmTrust -# Label: "AffirmTrust Commercial" -# Serial: 8608355977964138876 -# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 -# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 -# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP -Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr -ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL -MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 -yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr -VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ -nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG -XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj -vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt -Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g -N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC -nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Networking O=AffirmTrust -# Subject: CN=AffirmTrust Networking O=AffirmTrust -# Label: "AffirmTrust Networking" -# Serial: 8957382827206547757 -# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f -# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f -# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y -YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua -kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL -QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp -6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG -yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i -QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO -tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu -QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ -Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u -olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 -x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Premium O=AffirmTrust -# Subject: CN=AffirmTrust Premium O=AffirmTrust -# Label: "AffirmTrust Premium" -# Serial: 7893706540734352110 -# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 -# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 -# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz -dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG -A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U -cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf -qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ -JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ -+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS -s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 -HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 -70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG -V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S -qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S -5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia -C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX -OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE -FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 -KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg -Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B -8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ -MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc -0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ -u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF -u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH -YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 -GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO -RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e -KeC2uAloGRwYQw== ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust -# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust -# Label: "AffirmTrust Premium ECC" -# Serial: 8401224907861490260 -# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d -# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb -# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 ------BEGIN CERTIFICATE----- -MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC -VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ -cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ -BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt -VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D -0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 -ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G -A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs -aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I -flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA" -# Serial: 279744 -# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 -# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e -# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM -MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D -ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU -cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 -WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg -Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw -IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH -UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM -TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU -BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM -kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x -AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV -HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y -sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL -I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 -J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY -VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- - -# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Label: "TWCA Root Certification Authority" -# Serial: 1 -# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 -# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 -# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 ------BEGIN CERTIFICATE----- -MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES -MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU -V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz -WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO -LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE -AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH -K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX -RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z -rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx -3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq -hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC -MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls -XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D -lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn -aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ -YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Label: "Security Communication RootCA2" -# Serial: 0 -# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 -# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 -# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl -MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe -U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX -DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy -dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj -YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV -OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr -zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM -VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ -hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO -ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw -awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs -OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 -DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF -coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc -okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 -t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy -1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ -SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 ------END CERTIFICATE----- - -# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Label: "Actalis Authentication Root CA" -# Serial: 6271844772424770508 -# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 -# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac -# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 ------BEGIN CERTIFICATE----- -MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE -BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w -MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 -IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC -SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 -ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv -UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX -4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 -KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ -gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb -rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ -51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F -be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe -KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F -v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn -fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 -jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz -ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt -ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL -e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 -jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz -WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V -SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j -pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX -X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok -fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R -K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU -ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU -LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT -LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 2 Root CA" -# Serial: 2 -# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 -# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 -# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr -6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV -L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 -1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx -MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ -QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB -arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr -Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi -FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS -P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN -9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz -uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h -9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s -A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t -OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo -+fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 -KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 -DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us -H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ -I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 -5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h -3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz -Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 3 Root CA" -# Serial: 2 -# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec -# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 -# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y -ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E -N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 -tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX -0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c -/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X -KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY -zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS -O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D -34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP -K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv -Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj -QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV -cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS -IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 -HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa -O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv -033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u -dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE -kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 -3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD -u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq -4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 3" -# Serial: 1 -# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef -# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 -# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN -8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ -RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 -hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 -ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM -EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 -A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy -WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ -1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 -6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT -91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml -e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p -TpPDpFQUWw== ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 2009" -# Serial: 623603 -# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f -# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 -# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 ------BEGIN CERTIFICATE----- -MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha -ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM -HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 -UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 -tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R -ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM -lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp -/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G -A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G -A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj -dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy -MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl -cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js -L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL -BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni -acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 -o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K -zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 -PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y -Johw1+qRzT65ysCQblrGXnRl11z+o+I= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 EV 2009" -# Serial: 623604 -# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 -# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 -# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw -NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV -BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn -ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 -3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z -qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR -p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 -HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw -ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea -HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw -Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh -c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E -RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt -dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku -Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp -3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 -nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF -CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na -xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX -KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 ------END CERTIFICATE----- - -# Issuer: CN=CA Disig Root R2 O=Disig a.s. -# Subject: CN=CA Disig Root R2 O=Disig a.s. -# Label: "CA Disig Root R2" -# Serial: 10572350602393338211 -# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 -# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 -# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV -BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu -MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy -MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx -EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw -ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe -NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH -PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I -x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe -QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR -yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO -QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 -H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ -QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD -i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs -nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 -rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI -hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM -tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf -GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb -lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka -+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal -TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i -nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 -gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr -G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os -zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x -L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL ------END CERTIFICATE----- - -# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Label: "ACCVRAIZ1" -# Serial: 6828503384748696800 -# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 -# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 -# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 ------BEGIN CERTIFICATE----- -MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE -AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw -CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ -BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND -VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb -qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY -HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo -G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA -lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr -IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ -0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH -k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 -4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO -m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa -cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl -uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI -KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls -ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG -AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 -VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT -VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG -CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA -cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA -QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA -7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA -cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA -QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA -czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu -aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt -aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud -DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF -BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp -D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU -JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m -AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD -vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms -tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH -7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h -I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA -h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF -d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H -pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 ------END CERTIFICATE----- - -# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Label: "TWCA Global Root CA" -# Serial: 3262 -# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 -# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 -# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx -EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT -VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 -NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT -B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF -10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz -0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh -MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH -zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc -46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 -yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi -laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP -oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA -BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE -qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm -4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL -1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn -LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF -H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo -RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ -nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh -15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW -6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW -nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j -wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz -aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy -KwbQBM0= ------END CERTIFICATE----- - -# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera -# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera -# Label: "TeliaSonera Root CA v1" -# Serial: 199041966741090107964904287217786801558 -# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c -# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 -# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 ------BEGIN CERTIFICATE----- -MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw -NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv -b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD -VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F -VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 -7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X -Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ -/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs -81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm -dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe -Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu -sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 -pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs -slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ -arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD -VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG -9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl -dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx -0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj -TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed -Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 -Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI -OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 -vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW -t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn -HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx -SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 2" -# Serial: 1 -# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a -# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 -# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd -AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC -FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi -1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq -jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ -wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ -WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy -NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC -uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw -IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 -g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN -9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP -BSeOE6Fuwg== ------END CERTIFICATE----- - -# Issuer: CN=Atos TrustedRoot 2011 O=Atos -# Subject: CN=Atos TrustedRoot 2011 O=Atos -# Label: "Atos TrustedRoot 2011" -# Serial: 6643877497813316402 -# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 -# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 -# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE -AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG -EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM -FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC -REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp -Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM -VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ -SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ -4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L -cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi -eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG -A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 -DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j -vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP -DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc -maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D -lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv -KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 1 G3" -# Serial: 687049649626669250736271037606554624078720034195 -# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab -# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 -# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 -MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV -wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe -rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 -68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh -4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp -UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o -abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc -3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G -KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt -hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO -Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt -zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD -ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC -MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 -cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN -qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 -YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv -b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 -8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k -NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj -ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp -q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt -nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2 G3" -# Serial: 390156079458959257446133169266079962026824725800 -# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 -# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 -# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 -MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf -qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW -n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym -c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ -O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 -o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j -IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq -IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz -8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh -vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l -7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG -cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD -ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 -AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC -roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga -W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n -lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE -+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV -csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd -dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg -KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM -HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 -WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3 G3" -# Serial: 268090761170461462463995952157327242137089239581 -# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 -# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d -# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 -MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR -/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu -FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR -U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c -ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR -FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k -A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw -eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl -sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp -VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q -A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ -ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD -ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px -KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI -FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv -oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg -u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP -0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf -3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl -8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ -DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN -PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ -ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G2" -# Serial: 15385348160840213938643033620894905419 -# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d -# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f -# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 ------BEGIN CERTIFICATE----- -MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA -n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc -biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp -EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA -bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu -YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB -AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW -BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI -QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I -0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni -lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 -B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv -ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo -IhNzbM8m9Yop5w== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G3" -# Serial: 15459312981008553731928384953135426796 -# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb -# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 -# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 ------BEGIN CERTIFICATE----- -MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg -RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq -hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf -Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q -RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD -AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY -JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv -6pZjamVFkpUBtA== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G2" -# Serial: 4293743540046975378534879503202253541 -# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 -# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 -# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f ------BEGIN CERTIFICATE----- -MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH -MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI -2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx -1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ -q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz -tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ -vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP -BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV -5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY -1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 -NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG -Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 -8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe -pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl -MrY= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G3" -# Serial: 7089244469030293291760083333884364146 -# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca -# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e -# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 ------BEGIN CERTIFICATE----- -MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe -Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw -EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x -IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF -K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG -fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO -Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd -BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx -AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ -oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 -sycX ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Trusted Root G4" -# Serial: 7451500558977370777930084869016614236 -# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 -# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 -# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 ------BEGIN CERTIFICATE----- -MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg -RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y -ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If -xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV -ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO -DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ -jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ -CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi -EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM -fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY -uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK -chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t -9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD -ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 -SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd -+SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc -fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa -sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N -cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N -0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie -4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI -r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 -/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm -gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ ------END CERTIFICATE----- - -# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Label: "COMODO RSA Certification Authority" -# Serial: 101909084537582093308941363524873193117 -# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 -# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 -# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 ------BEGIN CERTIFICATE----- -MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB -hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV -BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT -EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR -6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X -pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC -9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV -/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf -Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z -+pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w -qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah -SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC -u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf -Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq -crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E -FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB -/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl -wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM -4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV -2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna -FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ -CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK -boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke -jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL -S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb -QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl -0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB -NVOFBkpdn627G190 ------END CERTIFICATE----- - -# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Label: "USERTrust RSA Certification Authority" -# Serial: 2645093764781058787591871645665788717 -# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 -# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e -# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 ------BEGIN CERTIFICATE----- -MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB -iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl -cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV -BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw -MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV -BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU -aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B -3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY -tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ -Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 -VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT -79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 -c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT -Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l -c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee -UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE -Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd -BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF -Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO -VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 -ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs -8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR -iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze -Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ -XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ -qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB -VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB -L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG -jjxDah2nGN59PRbxYvnKkKj9 ------END CERTIFICATE----- - -# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Label: "USERTrust ECC Certification Authority" -# Serial: 123013823720199481456569720443997572134 -# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 -# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 -# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a ------BEGIN CERTIFICATE----- -MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL -MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl -eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT -JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT -Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg -VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo -I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng -o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G -A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB -zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW -RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 -# Label: "GlobalSign ECC Root CA - R5" -# Serial: 32785792099990507226680698011560947931244 -# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 -# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa -# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 ------BEGIN CERTIFICATE----- -MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc -8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke -hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI -KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg -515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO -xwy8p2Fp8fc74SrL+SvzZpA3 ------END CERTIFICATE----- - -# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust -# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust -# Label: "IdenTrust Commercial Root CA 1" -# Serial: 13298821034946342390520003877796839426 -# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 -# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 -# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu -VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw -MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw -JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT -3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU -+ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp -S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 -bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi -T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL -vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK -Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK -dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT -c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv -l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N -iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD -ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH -6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt -LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 -nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 -+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK -W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT -AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq -l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG -4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ -mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A -7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H ------END CERTIFICATE----- - -# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust -# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust -# Label: "IdenTrust Public Sector Root CA 1" -# Serial: 13298821034946342390521976156843933698 -# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba -# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd -# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f ------BEGIN CERTIFICATE----- -MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu -VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN -MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 -MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 -ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy -RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS -bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF -/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R -3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw -EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy -9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V -GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ -2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV -WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD -W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN -AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj -t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV -DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 -TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G -lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW -mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df -WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 -+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ -tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA -GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv -8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - G2" -# Serial: 1246989352 -# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 -# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 -# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 ------BEGIN CERTIFICATE----- -MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 -cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs -IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz -dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy -NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu -dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt -dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 -aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T -RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN -cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW -wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 -U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 -jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN -BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ -jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ -Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v -1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R -nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH -VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - EC1" -# Serial: 51543124481930649114116133369 -# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc -# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 -# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 ------BEGIN CERTIFICATE----- -MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG -A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 -d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu -dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq -RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy -MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD -VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 -L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g -Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi -A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt -ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH -Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O -BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC -R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX -hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G ------END CERTIFICATE----- - -# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority -# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority -# Label: "CFCA EV ROOT" -# Serial: 407555286 -# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 -# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 -# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd ------BEGIN CERTIFICATE----- -MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD -TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx -MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j -aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP -T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 -sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL -TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 -/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp -7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz -EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt -hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP -a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot -aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg -TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV -PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv -cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL -tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd -BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB -ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT -ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL -jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS -ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy -P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 -xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d -Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN -5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe -/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z -AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ -5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GB CA" -# Serial: 157768595616588414422159278966750757568 -# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d -# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed -# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 ------BEGIN CERTIFICATE----- -MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt -MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg -Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i -YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x -CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG -b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh -bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 -HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx -WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX -1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk -u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P -99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r -M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB -BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh -cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 -gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO -ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf -aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic -Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= ------END CERTIFICATE----- - -# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. -# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. -# Label: "SZAFIR ROOT CA2" -# Serial: 357043034767186914217277344587386743377558296292 -# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 -# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de -# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe ------BEGIN CERTIFICATE----- -MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL -BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 -ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw -NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L -cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg -Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN -QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT -3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw -3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 -3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 -BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN -XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF -AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw -8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG -nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP -oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy -d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg -LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA 2" -# Serial: 44979900017204383099463764357512596969 -# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 -# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 -# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 ------BEGIN CERTIFICATE----- -MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB -gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu -QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG -A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz -OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ -VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 -b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA -DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn -0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB -OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE -fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E -Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m -o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i -sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW -OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez -Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS -adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n -3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ -F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf -CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 -XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm -djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ -WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb -AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq -P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko -b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj -XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P -5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi -DrW5viSP ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions RootCA 2015" -# Serial: 0 -# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce -# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 -# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 ------BEGIN CERTIFICATE----- -MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix -DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k -IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT -N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v -dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG -A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh -ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx -QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA -4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 -AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 -4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C -ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV -9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD -gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 -Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq -NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko -LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc -Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd -ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I -XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI -M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot -9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V -Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea -j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh -X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ -l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf -bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 -pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK -e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 -vm9qp/UsQu0yrbYhnr68 ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" -# Serial: 0 -# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef -# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 -# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 ------BEGIN CERTIFICATE----- -MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN -BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl -bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv -b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ -BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj -YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 -MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 -dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg -QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa -jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi -C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep -lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof -TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR ------END CERTIFICATE----- - -# Issuer: CN=ISRG Root X1 O=Internet Security Research Group -# Subject: CN=ISRG Root X1 O=Internet Security Research Group -# Label: "ISRG Root X1" -# Serial: 172886928669790476064670243504169061120 -# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e -# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 -# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw -TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh -cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 -WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu -ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc -h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ -0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U -A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW -T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH -B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC -B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv -KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn -OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn -jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw -qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI -rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq -hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL -ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ -3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK -NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 -ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur -TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC -jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc -oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq -4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA -mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d -emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= ------END CERTIFICATE----- - -# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM -# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM -# Label: "AC RAIZ FNMT-RCM" -# Serial: 485876308206448804701554682760554759 -# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d -# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 -# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx -CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ -WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ -BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG -Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ -yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf -BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz -WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF -tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z -374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC -IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL -mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 -wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS -MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 -ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet -UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H -YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 -LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD -nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 -RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM -LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf -77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N -JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm -fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp -6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp -1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B -9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok -RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv -uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 1 O=Amazon -# Subject: CN=Amazon Root CA 1 O=Amazon -# Label: "Amazon Root CA 1" -# Serial: 143266978916655856878034712317230054538369994 -# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 -# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 -# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e ------BEGIN CERTIFICATE----- -MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF -ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 -b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv -b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj -ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM -9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw -IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 -VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L -93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm -jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA -A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI -U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs -N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv -o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU -5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy -rqXRfboQnoZsG4q5WTP468SQvvG5 ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 2 O=Amazon -# Subject: CN=Amazon Root CA 2 O=Amazon -# Label: "Amazon Root CA 2" -# Serial: 143266982885963551818349160658925006970653239 -# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 -# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a -# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF -ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 -b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv -b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK -gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ -W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg -1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K -8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r -2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me -z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR -8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj -mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz -7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 -+XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI -0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB -Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm -UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 -LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY -+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS -k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl -7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm -btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl -urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ -fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 -n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE -76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H -9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT -4PsJYGw= ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 3 O=Amazon -# Subject: CN=Amazon Root CA 3 O=Amazon -# Label: "Amazon Root CA 3" -# Serial: 143266986699090766294700635381230934788665930 -# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 -# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e -# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 ------BEGIN CERTIFICATE----- -MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 -MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g -Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG -A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg -Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl -ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr -ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr -BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM -YyRIHN8wfdVoOw== ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 4 O=Amazon -# Subject: CN=Amazon Root CA 4 O=Amazon -# Label: "Amazon Root CA 4" -# Serial: 143266989758080763974105200630763877849284878 -# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd -# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be -# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 ------BEGIN CERTIFICATE----- -MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 -MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g -Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG -A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg -Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi -9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk -M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB -MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw -CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW -1KyLa2tJElMzrdfkviT8tQp21KW8EA== ------END CERTIFICATE----- - -# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM -# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM -# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" -# Serial: 1 -# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 -# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca -# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 ------BEGIN CERTIFICATE----- -MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx -GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp -bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w -KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 -BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy -dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG -EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll -IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU -QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT -TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg -LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 -a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr -LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr -N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X -YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ -iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f -AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH -V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL -BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh -AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf -IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 -lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c -8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf -lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= ------END CERTIFICATE----- - -# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. -# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. -# Label: "GDCA TrustAUTH R5 ROOT" -# Serial: 9009899650740120186 -# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 -# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 -# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 ------BEGIN CERTIFICATE----- -MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE -BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ -IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 -MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV -BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w -HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj -Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj -TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u -KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj -qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm -MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 -ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP -zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk -L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC -jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA -HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC -AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg -p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm -DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 -COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry -L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf -JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg -IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io -2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV -09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ -XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq -T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe -MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== ------END CERTIFICATE----- - -# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation -# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation -# Label: "SSL.com Root Certification Authority RSA" -# Serial: 8875640296558310041 -# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 -# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb -# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 ------BEGIN CERTIFICATE----- -MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE -BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK -DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz -OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv -dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv -bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN -AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R -xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX -qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC -C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 -6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh -/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF -YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E -JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc -US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 -ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm -+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi -M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G -A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV -cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc -Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs -PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ -q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 -cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr -a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I -H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y -K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu -nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf -oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY -Ic2wBlX7Jz9TkHCpBB5XJ7k= ------END CERTIFICATE----- - -# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation -# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation -# Label: "SSL.com Root Certification Authority ECC" -# Serial: 8495723813297216424 -# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e -# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a -# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 ------BEGIN CERTIFICATE----- -MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC -VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T -U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz -WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 -b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS -b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB -BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI -7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg -CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud -EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD -VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T -kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ -gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl ------END CERTIFICATE----- - -# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation -# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation -# Label: "SSL.com EV Root Certification Authority RSA R2" -# Serial: 6248227494352943350 -# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 -# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a -# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c ------BEGIN CERTIFICATE----- -MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV -BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE -CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy -MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G -A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD -DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq -M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf -OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa -4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 -HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR -aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA -b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ -Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV -PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO -pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu -UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY -MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV -HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 -9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW -s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 -Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg -cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM -79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz -/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt -ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm -Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK -QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ -w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi -S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 -mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== ------END CERTIFICATE----- - -# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation -# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation -# Label: "SSL.com EV Root Certification Authority ECC" -# Serial: 3182246526754555285 -# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 -# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d -# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 ------BEGIN CERTIFICATE----- -MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC -VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T -U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx -NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv -dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv -bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 -AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA -VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku -WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP -MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX -5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ -ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg -h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 -# Label: "GlobalSign Root CA - R6" -# Serial: 1417766617973444989252670301619537 -# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae -# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1 -# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69 ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg -MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh -bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx -MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET -MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ -KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI -xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k -ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD -aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw -LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw -1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX -k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 -SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h -bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n -WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY -rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce -MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu -bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN -nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt -Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 -55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj -vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf -cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz -oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp -nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs -pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v -JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R -8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 -5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GC CA" -# Serial: 44084345621038548146064804565436152554 -# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23 -# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31 -# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d ------BEGIN CERTIFICATE----- -MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw -CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91 -bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg -Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ -BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu -ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS -b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni -eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W -p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T -rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV -57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg -Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 ------END CERTIFICATE----- - -# Issuer: CN=UCA Global G2 Root O=UniTrust -# Subject: CN=UCA Global G2 Root O=UniTrust -# Label: "UCA Global G2 Root" -# Serial: 124779693093741543919145257850076631279 -# MD5 Fingerprint: 80:fe:f0:c4:4a:f0:5c:62:32:9f:1c:ba:78:a9:50:f8 -# SHA1 Fingerprint: 28:f9:78:16:19:7a:ff:18:25:18:aa:44:fe:c1:a0:ce:5c:b6:4c:8a -# SHA256 Fingerprint: 9b:ea:11:c9:76:fe:01:47:64:c1:be:56:a6:f9:14:b5:a5:60:31:7a:bd:99:88:39:33:82:e5:16:1a:a0:49:3c ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9 -MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH -bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x -CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds -b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr -b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9 -kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm -VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R -VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc -C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj -tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY -D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv -j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl -NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6 -iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP -O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV -ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj -L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 -1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl -1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU -b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV -PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj -y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb -EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg -DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI -+Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy -YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX -UB+K+wb1whnw0A== ------END CERTIFICATE----- - -# Issuer: CN=UCA Extended Validation Root O=UniTrust -# Subject: CN=UCA Extended Validation Root O=UniTrust -# Label: "UCA Extended Validation Root" -# Serial: 106100277556486529736699587978573607008 -# MD5 Fingerprint: a1:f3:5f:43:c6:34:9b:da:bf:8c:7e:05:53:ad:96:e2 -# SHA1 Fingerprint: a3:a1:b0:6f:24:61:23:4a:e3:36:a5:c2:37:fc:a6:ff:dd:f0:d7:3a -# SHA256 Fingerprint: d4:3a:f9:b3:54:73:75:5c:96:84:fc:06:d7:d8:cb:70:ee:5c:28:e7:73:fb:29:4e:b4:1e:e7:17:22:92:4d:24 ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH -MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF -eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx -MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV -BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog -D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS -sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop -O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk -sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi -c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj -VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz -KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/ -TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G -sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs -1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD -fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN -l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR -ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ -VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5 -c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp -4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s -t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj -2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO -vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C -xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx -cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM -fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax ------END CERTIFICATE----- - -# Issuer: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 -# Subject: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 -# Label: "Certigna Root CA" -# Serial: 269714418870597844693661054334862075617 -# MD5 Fingerprint: 0e:5c:30:62:27:eb:5b:bc:d7:ae:62:ba:e9:d5:df:77 -# SHA1 Fingerprint: 2d:0d:52:14:ff:9e:ad:99:24:01:74:20:47:6e:6c:85:27:27:f5:43 -# SHA256 Fingerprint: d4:8d:3d:23:ee:db:50:a4:59:e5:51:97:60:1c:27:77:4b:9d:7b:18:c9:4d:5a:05:95:11:a1:02:50:b9:31:68 ------BEGIN CERTIFICATE----- -MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw -WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw -MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x -MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD -VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX -BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw -ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO -ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M -CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu -I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm -TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh -C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf -ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz -IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT -Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k -JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5 -hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB -GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of -1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov -L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo -dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr -aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq -hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L -6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG -HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6 -0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB -lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi -o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1 -gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v -faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63 -Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh -jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw -3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= ------END CERTIFICATE----- - -# Issuer: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI -# Subject: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI -# Label: "emSign Root CA - G1" -# Serial: 235931866688319308814040 -# MD5 Fingerprint: 9c:42:84:57:dd:cb:0b:a7:2e:95:ad:b6:f3:da:bc:ac -# SHA1 Fingerprint: 8a:c7:ad:8f:73:ac:4e:c1:b5:75:4d:a5:40:f4:fc:cf:7c:b5:8e:8c -# SHA256 Fingerprint: 40:f6:af:03:46:a9:9a:a1:cd:1d:55:5a:4e:9c:ce:62:c7:f9:63:46:03:ee:40:66:15:83:3d:c8:c8:d0:03:67 ------BEGIN CERTIFICATE----- -MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD -VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU -ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH -MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO -MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv -Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz -f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO -8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq -d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM -tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt -Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB -o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD -AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x -PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM -wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d -GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH -6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby -RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx -iN66zB+Afko= ------END CERTIFICATE----- - -# Issuer: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI -# Subject: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI -# Label: "emSign ECC Root CA - G3" -# Serial: 287880440101571086945156 -# MD5 Fingerprint: ce:0b:72:d1:9f:88:8e:d0:50:03:e8:e3:b8:8b:67:40 -# SHA1 Fingerprint: 30:43:fa:4f:f2:57:dc:a0:c3:80:ee:2e:58:ea:78:b2:3f:e6:bb:c1 -# SHA256 Fingerprint: 86:a1:ec:ba:08:9c:4a:8d:3b:be:27:34:c6:12:ba:34:1d:81:3e:04:3c:f9:e8:a8:62:cd:5c:57:a3:6b:be:6b ------BEGIN CERTIFICATE----- -MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG -EwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo -bm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g -RzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ -TjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s -b2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw -djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0 -WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS -fvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB -zhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq -hkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB -CUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD -+JbNR6iC8hZVdyR+EhCVBCyj ------END CERTIFICATE----- - -# Issuer: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI -# Subject: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI -# Label: "emSign Root CA - C1" -# Serial: 825510296613316004955058 -# MD5 Fingerprint: d8:e3:5d:01:21:fa:78:5a:b0:df:ba:d2:ee:2a:5f:68 -# SHA1 Fingerprint: e7:2e:f1:df:fc:b2:09:28:cf:5d:d4:d5:67:37:b1:51:cb:86:4f:01 -# SHA256 Fingerprint: 12:56:09:aa:30:1d:a0:a2:49:b9:7a:82:39:cb:6a:34:21:6f:44:dc:ac:9f:39:54:b1:42:92:f2:e8:c8:60:8f ------BEGIN CERTIFICATE----- -MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG -A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg -SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw -MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln -biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v -dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ -BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ -HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH -3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH -GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c -xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1 -aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq -TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL -BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87 -/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4 -kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG -YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT -+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo -WXzhriKi4gp6D/piq1JM4fHfyr6DDUI= ------END CERTIFICATE----- - -# Issuer: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI -# Subject: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI -# Label: "emSign ECC Root CA - C3" -# Serial: 582948710642506000014504 -# MD5 Fingerprint: 3e:53:b3:a3:81:ee:d7:10:f8:d3:b0:1d:17:92:f5:d5 -# SHA1 Fingerprint: b6:af:43:c2:9b:81:53:7d:f6:ef:6b:c3:1f:1f:60:15:0c:ee:48:66 -# SHA256 Fingerprint: bc:4d:80:9b:15:18:9d:78:db:3e:1d:8c:f4:f9:72:6a:79:5d:a1:64:3c:a5:f1:35:8e:1d:db:0e:dc:0d:7e:b3 ------BEGIN CERTIFICATE----- -MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG -EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx -IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw -MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln -biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND -IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci -MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti -sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O -BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB -Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c -3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J -0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== ------END CERTIFICATE----- - -# Issuer: CN=Hongkong Post Root CA 3 O=Hongkong Post -# Subject: CN=Hongkong Post Root CA 3 O=Hongkong Post -# Label: "Hongkong Post Root CA 3" -# Serial: 46170865288971385588281144162979347873371282084 -# MD5 Fingerprint: 11:fc:9f:bd:73:30:02:8a:fd:3f:f3:58:b9:cb:20:f0 -# SHA1 Fingerprint: 58:a2:d0:ec:20:52:81:5b:c1:f3:f8:64:02:24:4e:c2:8e:02:4b:02 -# SHA256 Fingerprint: 5a:2f:c0:3f:0c:83:b0:90:bb:fa:40:60:4b:09:88:44:6c:76:36:18:3d:f9:84:6e:17:10:1a:44:7f:b8:ef:d6 ------BEGIN CERTIFICATE----- -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 -mpv0 ------END CERTIFICATE----- - -# Issuer: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation -# Subject: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation -# Label: "Microsoft ECC Root Certificate Authority 2017" -# Serial: 136839042543790627607696632466672567020 -# MD5 Fingerprint: dd:a1:03:e6:4a:93:10:d1:bf:f0:19:42:cb:fe:ed:67 -# SHA1 Fingerprint: 99:9a:64:c3:7f:f4:7d:9f:ab:95:f1:47:69:89:14:60:ee:c4:c3:c5 -# SHA256 Fingerprint: 35:8d:f3:9d:76:4a:f9:e1:b7:66:e9:c9:72:df:35:2e:e1:5c:fa:c2:27:af:6a:d1:d7:0e:8e:4a:6e:dc:ba:02 ------BEGIN CERTIFICATE----- -MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQsw -CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYD -VQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIw -MTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4MjMxNjA0WjBlMQswCQYDVQQGEwJV -UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNy -b3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQBgcq -hkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZR -ogPZnZH6thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYb -hGBKia/teQ87zvH2RPUBeMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8E -BTADAQH/MB0GA1UdDgQWBBTIy5lycFIM+Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3 -FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlfXu5gKcs68tvWMoQZP3zV -L8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaReNtUjGUB -iudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= ------END CERTIFICATE----- - -# Issuer: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation -# Subject: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation -# Label: "Microsoft RSA Root Certificate Authority 2017" -# Serial: 40975477897264996090493496164228220339 -# MD5 Fingerprint: 10:ff:00:ff:cf:c9:f8:c7:7a:c0:ee:35:8e:c9:0f:47 -# SHA1 Fingerprint: 73:a5:e6:4a:3b:ff:83:16:ff:0e:dc:cc:61:8a:90:6e:4e:ae:4d:74 -# SHA256 Fingerprint: c7:41:f7:0f:4b:2a:8d:88:bf:2e:71:c1:41:22:ef:53:ef:10:eb:a0:cf:a5:e6:4c:fa:20:f4:18:85:30:73:e0 ------BEGIN CERTIFICATE----- -MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBl -MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw -NAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 -IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIwNzE4MjMwMDIzWjBlMQswCQYDVQQG -EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1N -aWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZ -Nt9GkMml7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0 -ZdDMbRnMlfl7rEqUrQ7eS0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1 -HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw71VdyvD/IybLeS2v4I2wDwAW9lcfNcztm -gGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+dkC0zVJhUXAoP8XFWvLJ -jEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49FyGcohJUc -aDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaG -YaRSMLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6 -W6IYZVcSn2i51BVrlMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4K -UGsTuqwPN1q3ErWQgR5WrlcihtnJ0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH -+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJClTUFLkqqNfs+avNJVgyeY+Q -W5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZC -LgLNFgVZJ8og6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OC -gMNPOsduET/m4xaRhPtthH80dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6 -tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk+ONVFT24bcMKpBLBaYVu32TxU5nh -SnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex/2kskZGT4d9Mozd2 -TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDyAmH3 -pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGR -xpl/j8nWZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiApp -GWSZI1b7rCoucL5mxAyE7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9 -dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKTc0QWbej09+CVgI+WXTik9KveCjCHk9hN -AHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D5KbvtwEwXlGjefVwaaZB -RA+GsCyRxj3qrg+E ------END CERTIFICATE----- - -# Issuer: CN=e-Szigno Root CA 2017 O=Microsec Ltd. -# Subject: CN=e-Szigno Root CA 2017 O=Microsec Ltd. -# Label: "e-Szigno Root CA 2017" -# Serial: 411379200276854331539784714 -# MD5 Fingerprint: de:1f:f6:9e:84:ae:a7:b4:21:ce:1e:58:7d:d1:84:98 -# SHA1 Fingerprint: 89:d4:83:03:4f:9e:9a:48:80:5f:72:37:d4:a9:a6:ef:cb:7c:1f:d1 -# SHA256 Fingerprint: be:b0:0b:30:83:9b:9b:c3:2c:32:e4:44:79:05:95:06:41:f2:64:21:b1:5e:d0:89:19:8b:51:8a:e2:ea:1b:99 ------BEGIN CERTIFICATE----- -MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNV -BAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRk -LjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJv -b3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZaFw00MjA4MjIxMjA3MDZaMHExCzAJ -BgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMg -THRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25v -IFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtv -xie+RJCxs1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+H -Wyx7xf58etqjYzBhMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBSHERUI0arBeAyxr87GyZDvvzAEwDAfBgNVHSMEGDAWgBSHERUI0arB -eAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEAtVfd14pVCzbhhkT61Nlo -jbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxOsvxyqltZ -+efcMQ== ------END CERTIFICATE----- - -# Issuer: O=CERTSIGN SA OU=certSIGN ROOT CA G2 -# Subject: O=CERTSIGN SA OU=certSIGN ROOT CA G2 -# Label: "certSIGN Root CA G2" -# Serial: 313609486401300475190 -# MD5 Fingerprint: 8c:f1:75:8a:c6:19:cf:94:b7:f7:65:20:87:c3:97:c7 -# SHA1 Fingerprint: 26:f9:93:b4:ed:3d:28:27:b0:b9:4b:a7:e9:15:1d:a3:8d:92:e5:32 -# SHA256 Fingerprint: 65:7c:fe:2f:a7:3f:aa:38:46:25:71:f3:32:a2:36:3a:46:fc:e7:02:09:51:71:07:02:cd:fb:b6:ee:da:33:05 ------BEGIN CERTIFICATE----- -MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNV -BAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04g -Uk9PVCBDQSBHMjAeFw0xNzAyMDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJ -BgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJ -R04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDF -dRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05N0Iw -vlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZ -uIt4ImfkabBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhp -n+Sc8CnTXPnGFiWeI8MgwT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKs -cpc/I1mbySKEwQdPzH/iV8oScLumZfNpdWO9lfsbl83kqK/20U6o2YpxJM02PbyW -xPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91QqhngLjYl/rNUssuHLoPj1P -rCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732jcZZroiF -DsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fx -DTvf95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgy -LcsUDFDYg2WD7rlcz8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6C -eWRgKRM+o/1Pcmqr4tTluCRVLERLiohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSCIS1mxteg4BXrzkwJ -d8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOBywaK8SJJ6ejq -kX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC -b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQl -qiCA2ClV9+BB/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0 -OJD7uNGzcgbJceaBxXntC6Z58hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+c -NywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5BiKDUyUM/FHE5r7iOZULJK2v0ZXk -ltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklWatKcsWMy5WHgUyIO -pwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tUSxfj -03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZk -PuXaTH4MNMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE -1LlSVHJ7liXMvGnjSG4N0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MX -QRBdJ3NghVdJIgc= ------END CERTIFICATE----- - -# Issuer: CN=Trustwave Global Certification Authority O=Trustwave Holdings, Inc. -# Subject: CN=Trustwave Global Certification Authority O=Trustwave Holdings, Inc. -# Label: "Trustwave Global Certification Authority" -# Serial: 1846098327275375458322922162 -# MD5 Fingerprint: f8:1c:18:2d:2f:ba:5f:6d:a1:6c:bc:c7:ab:91:c7:0e -# SHA1 Fingerprint: 2f:8f:36:4f:e1:58:97:44:21:59:87:a5:2a:9a:d0:69:95:26:7f:b5 -# SHA256 Fingerprint: 97:55:20:15:f5:dd:fc:3c:87:88:c0:06:94:45:55:40:88:94:45:00:84:f1:00:86:70:86:bc:1a:2b:b5:8d:c8 ------BEGIN CERTIFICATE----- -MIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQsw -CQYDVQQGEwJVUzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28x -ITAfBgNVBAoMGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1 -c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMx -OTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJVUzERMA8GA1UECAwI -SWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2ZSBI -b2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB -ALldUShLPDeS0YLOvR29zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0Xzn -swuvCAAJWX/NKSqIk4cXGIDtiLK0thAfLdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu -7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4BqstTnoApTAbqOl5F2brz8 -1Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9oWN0EACyW -80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotP -JqX+OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1l -RtzuzWniTY+HKE40Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfw -hI0Vcnyh78zyiGG69Gm7DIwLdVcEuE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10 -coos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm+9jaJXLE9gCxInm943xZYkqc -BW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqjifLJS3tBEW1n -twiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1Ud -DwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W -0OhUKDtkLSGm+J1WE2pIPU/HPinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfe -uyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0HZJDmHvUqoai7PF35owgLEQzxPy0Q -lG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla4gt5kNdXElE1GYhB -aCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5RvbbE -sLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPT -MaCm/zjdzyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qe -qu5AvzSxnI9O4fKSTx+O856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxh -VicGaeVyQYHTtgGJoC86cnn+OjC/QezHYj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8 -h6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu3R3y4G5OBVixwJAWKqQ9 -EEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP29FpHOTK -yeC2nOnOcXHebD8WpHk= ------END CERTIFICATE----- - -# Issuer: CN=Trustwave Global ECC P256 Certification Authority O=Trustwave Holdings, Inc. -# Subject: CN=Trustwave Global ECC P256 Certification Authority O=Trustwave Holdings, Inc. -# Label: "Trustwave Global ECC P256 Certification Authority" -# Serial: 4151900041497450638097112925 -# MD5 Fingerprint: 5b:44:e3:8d:5d:36:86:26:e8:0d:05:d2:59:a7:83:54 -# SHA1 Fingerprint: b4:90:82:dd:45:0c:be:8b:5b:b1:66:d3:e2:a4:08:26:cd:ed:42:cf -# SHA256 Fingerprint: 94:5b:bc:82:5e:a5:54:f4:89:d1:fd:51:a7:3d:df:2e:a6:24:ac:70:19:a0:52:05:22:5c:22:a7:8c:cf:a8:b4 ------BEGIN CERTIFICATE----- -MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYD -VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf -BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3 -YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x -NzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYDVQQGEwJVUzERMA8G -A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0 -d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF -Q0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqG -SM49AwEHA0IABH77bOYj43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoN -FWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqmP62jQzBBMA8GA1UdEwEB/wQFMAMBAf8w -DwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt0UrrdaVKEJmzsaGLSvcw -CgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjzRM4q3wgh -DDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7 ------END CERTIFICATE----- - -# Issuer: CN=Trustwave Global ECC P384 Certification Authority O=Trustwave Holdings, Inc. -# Subject: CN=Trustwave Global ECC P384 Certification Authority O=Trustwave Holdings, Inc. -# Label: "Trustwave Global ECC P384 Certification Authority" -# Serial: 2704997926503831671788816187 -# MD5 Fingerprint: ea:cf:60:c4:3b:b9:15:29:40:a1:97:ed:78:27:93:d6 -# SHA1 Fingerprint: e7:f3:a3:c8:cf:6f:c3:04:2e:6d:0e:67:32:c5:9e:68:95:0d:5e:d2 -# SHA256 Fingerprint: 55:90:38:59:c8:c0:c3:eb:b8:75:9e:ce:4e:25:57:22:5f:f5:75:8b:bd:38:eb:d4:82:76:60:1e:1b:d5:80:97 ------BEGIN CERTIFICATE----- -MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYD -VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf -BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3 -YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x -NzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYDVQQGEwJVUzERMA8G -A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0 -d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF -Q0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuB -BAAiA2IABGvaDXU1CDFHBa5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJ -j9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr/TklZvFe/oyujUF5nQlgziip04pt89ZF -1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNVHQ8BAf8EBQMDBwYAMB0G -A1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNnADBkAjA3 -AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsC -MGclCrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVu -Sw== ------END CERTIFICATE----- - -# Issuer: CN=NAVER Global Root Certification Authority O=NAVER BUSINESS PLATFORM Corp. -# Subject: CN=NAVER Global Root Certification Authority O=NAVER BUSINESS PLATFORM Corp. -# Label: "NAVER Global Root Certification Authority" -# Serial: 9013692873798656336226253319739695165984492813 -# MD5 Fingerprint: c8:7e:41:f6:25:3b:f5:09:b3:17:e8:46:3d:bf:d0:9b -# SHA1 Fingerprint: 8f:6b:f2:a9:27:4a:da:14:a0:c4:f4:8e:61:27:f9:c0:1e:78:5d:d1 -# SHA256 Fingerprint: 88:f4:38:dc:f8:ff:d1:fa:8f:42:91:15:ff:e5:f8:2a:e1:e0:6e:0c:70:c3:75:fa:ad:71:7b:34:a4:9e:72:65 ------BEGIN CERTIFICATE----- -MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEM -BQAwaTELMAkGA1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRG -T1JNIENvcnAuMTIwMAYDVQQDDClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4NDJaFw0zNzA4MTgyMzU5NTlaMGkx -CzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVTUyBQTEFURk9STSBD -b3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVA -iQqrDZBbUGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH -38dq6SZeWYp34+hInDEW+j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lE -HoSTGEq0n+USZGnQJoViAbbJAh2+g1G7XNr4rRVqmfeSVPc0W+m/6imBEtRTkZaz -kVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2aacp+yPOiNgSnABIqKYP -szuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4Yb8Obtoq -vC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHf -nZ3zVHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaG -YQ5fG8Ir4ozVu53BA0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo -0es+nPxdGoMuK8u180SdOqcXYZaicdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3a -CJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejyYhbLgGvtPe31HzClrkvJE+2K -AQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNVHQ4EFgQU0p+I -36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB -Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoN -qo0hV4/GPnrK21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatj -cu3cvuzHV+YwIHHW1xDBE1UBjCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm -+LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bxhYTeodoS76TiEJd6eN4MUZeoIUCL -hr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTgE34h5prCy8VCZLQe -lHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTHD8z7 -p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8 -piKCk5XQA76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLR -LBT/DShycpWbXgnbiUSYqqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX -5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oGI/hGoiLtk/bdmuYqh7GYVPEi92tF4+KO -dh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmgkpzNNIaRkPpkUZ3+/uul -9XXeifdy ------END CERTIFICATE----- - -# Issuer: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS O=FNMT-RCM OU=Ceres -# Subject: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS O=FNMT-RCM OU=Ceres -# Label: "AC RAIZ FNMT-RCM SERVIDORES SEGUROS" -# Serial: 131542671362353147877283741781055151509 -# MD5 Fingerprint: 19:36:9c:52:03:2f:d2:d1:bb:23:cc:dd:1e:12:55:bb -# SHA1 Fingerprint: 62:ff:d9:9e:c0:65:0d:03:ce:75:93:d2:ed:3f:2d:32:c9:e3:e5:4a -# SHA256 Fingerprint: 55:41:53:b1:3d:2c:f9:dd:b7:53:bf:be:1a:4e:0a:e0:8d:0a:a4:18:70:58:fe:60:a2:b8:62:b2:e4:b8:7b:cb ------BEGIN CERTIFICATE----- -MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQsw -CQYDVQQGEwJFUzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgw -FgYDVQRhDA9WQVRFUy1RMjgyNjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1S -Q00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4MTIyMDA5MzczM1oXDTQzMTIyMDA5 -MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQtUkNNMQ4wDAYDVQQL -DAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNBQyBS -QUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuB -BAAiA2IABPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LH -sbI6GA60XYyzZl2hNPk2LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oK -Um8BA06Oi6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD -VR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqGSM49BAMDA2kAMGYCMQCu -SuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoDzBOQn5IC -MQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJy -v+c= ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign Root R46 O=GlobalSign nv-sa -# Subject: CN=GlobalSign Root R46 O=GlobalSign nv-sa -# Label: "GlobalSign Root R46" -# Serial: 1552617688466950547958867513931858518042577 -# MD5 Fingerprint: c4:14:30:e4:fa:66:43:94:2a:6a:1b:24:5f:19:d0:ef -# SHA1 Fingerprint: 53:a2:b0:4b:ca:6b:d6:45:e6:39:8a:8e:c4:0d:d2:bf:77:c3:a2:90 -# SHA256 Fingerprint: 4f:a3:12:6d:8d:3a:11:d1:c4:85:5a:4f:80:7c:ba:d6:cf:91:9d:3a:5a:88:b0:3b:ea:2c:63:72:d9:3c:40:c9 ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUA -MEYxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYD -VQQDExNHbG9iYWxTaWduIFJvb3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMy -MDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYt -c2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08EsCVeJ -OaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQG -vGIFAha/r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud -316HCkD7rRlr+/fKYIje2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo -0q3v84RLHIf8E6M6cqJaESvWJ3En7YEtbWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSE -y132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvjK8Cd+RTyG/FWaha/LIWF -zXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD412lPFzYE -+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCN -I/onccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzs -x2sZy/N78CsHpdlseVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqa -ByFrgY/bxFn63iLABJzjqls2k+g9vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC -4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEMBQADggIBAHx4 -7PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg -JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti -2kM3S+LGteWygxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIk -pnnpHs6i58FZFZ8d4kuaPp92CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRF -FRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZmOUdkLG5NrmJ7v2B0GbhWrJKsFjLt -rWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qqJZ4d16GLuc1CLgSk -ZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwyeqiv5 -u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP -4vkYxboznxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6 -N3ec592kD3ZDZopD8p/7DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3 -vouXsXgxT7PntgMTzlSdriVZzH81Xwj3QEUxeCp6 ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign Root E46 O=GlobalSign nv-sa -# Subject: CN=GlobalSign Root E46 O=GlobalSign nv-sa -# Label: "GlobalSign Root E46" -# Serial: 1552617690338932563915843282459653771421763 -# MD5 Fingerprint: b5:b8:66:ed:de:08:83:e3:c9:e2:01:34:06:ac:51:6f -# SHA1 Fingerprint: 39:b4:6c:d5:fe:80:06:eb:e2:2f:4a:bb:08:33:a0:af:db:b9:dd:84 -# SHA256 Fingerprint: cb:b9:c4:4d:84:b8:04:3e:10:50:ea:31:a6:9f:51:49:55:d7:bf:d2:e2:c6:b4:93:01:01:9a:d6:1d:9f:50:58 ------BEGIN CERTIFICATE----- -MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYx -CzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQD -ExNHbG9iYWxTaWduIFJvb3QgRTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAw -MDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2Ex -HDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkBjtjq -R+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGdd -yXqBPCCjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud -DgQWBBQxCpCPtsad0kRLgLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ -7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZkvLtoURMMA/cVi4RguYv/Uo7njLwcAjA8 -+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+CAezNIm8BZ/3Hobui3A= ------END CERTIFICATE----- - -# Issuer: CN=GLOBALTRUST 2020 O=e-commerce monitoring GmbH -# Subject: CN=GLOBALTRUST 2020 O=e-commerce monitoring GmbH -# Label: "GLOBALTRUST 2020" -# Serial: 109160994242082918454945253 -# MD5 Fingerprint: 8a:c7:6f:cb:6d:e3:cc:a2:f1:7c:83:fa:0e:78:d7:e8 -# SHA1 Fingerprint: d0:67:c1:13:51:01:0c:aa:d0:c7:6a:65:37:31:16:26:4f:53:71:a2 -# SHA256 Fingerprint: 9a:29:6a:51:82:d1:d4:51:a2:e3:7f:43:9b:74:da:af:a2:67:52:33:29:f9:0f:9a:0d:20:07:c3:34:e2:3c:9a ------BEGIN CERTIFICATE----- -MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkG -A1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkw -FwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYx -MDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9u -aXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMIICIjANBgkq -hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWiD59b -RatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9Z -YybNpyrOVPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3 -QWPKzv9pj2gOlTblzLmMCcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPw -yJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCmfecqQjuCgGOlYx8ZzHyyZqjC0203b+J+ -BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKAA1GqtH6qRNdDYfOiaxaJ -SaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9ORJitHHmkH -r96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj0 -4KlGDfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9Me -dKZssCz3AwyIDMvUclOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIw -q7ejMZdnrY8XD2zHc+0klGvIg5rQmjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2 -nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1UdIwQYMBaAFNwu -H9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA -VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJC -XtzoRlgHNQIw4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd -6IwPS3BD0IL/qMy/pJTAvoe9iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf -+I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS8cE54+X1+NZK3TTN+2/BT+MAi1bi -kvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2HcqtbepBEX4tdJP7 -wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxSvTOB -TI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6C -MUO+1918oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn -4rnvyOL2NSl6dPrFf4IFYqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+I -aFvowdlxfv1k7/9nR4hYJS8+hge9+6jlgqispdNpQ80xiEmEU5LAsTkbOYMBMMTy -qfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg== ------END CERTIFICATE----- - -# Issuer: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz -# Subject: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz -# Label: "ANF Secure Server Root CA" -# Serial: 996390341000653745 -# MD5 Fingerprint: 26:a6:44:5a:d9:af:4e:2f:b2:1d:b6:65:b0:4e:e8:96 -# SHA1 Fingerprint: 5b:6e:68:d0:cc:15:b6:a0:5f:1e:c1:5f:ae:02:fc:6b:2f:5d:6f:74 -# SHA256 Fingerprint: fb:8f:ec:75:91:69:b9:10:6b:1e:51:16:44:c6:18:c5:13:04:37:3f:6c:06:43:08:8d:8b:ef:fd:1b:99:75:99 ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=Certum EC-384 CA O=Asseco Data Systems S.A. OU=Certum Certification Authority -# Subject: CN=Certum EC-384 CA O=Asseco Data Systems S.A. OU=Certum Certification Authority -# Label: "Certum EC-384 CA" -# Serial: 160250656287871593594747141429395092468 -# MD5 Fingerprint: b6:65:b3:96:60:97:12:a1:ec:4e:e1:3d:a3:c6:c9:f1 -# SHA1 Fingerprint: f3:3e:78:3c:ac:df:f4:a2:cc:ac:67:55:69:56:d7:e5:16:3c:e1:ed -# SHA256 Fingerprint: 6b:32:80:85:62:53:18:aa:50:d1:73:c9:8d:8b:da:09:d5:7e:27:41:3d:11:4c:f7:87:a0:f5:d0:6c:03:0c:f6 ------BEGIN CERTIFICATE----- -MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQsw -CQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScw -JQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMT -EENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2MDcyNDU0WhcNNDMwMzI2MDcyNDU0 -WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBT -LkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAX -BgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATE -KI6rGFtqvm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7Tm -Fy8as10CW4kjPMIRBSqniBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68Kj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI0GZnQkdjrzife81r1HfS+8 -EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNoADBlAjADVS2m5hjEfO/J -UG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0QoSZ/6vn -nvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k= ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Root CA O=Asseco Data Systems S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Root CA O=Asseco Data Systems S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Root CA" -# Serial: 40870380103424195783807378461123655149 -# MD5 Fingerprint: 51:e1:c2:e7:fe:4c:84:af:59:0e:2f:f4:54:6f:ea:29 -# SHA1 Fingerprint: c8:83:44:c0:18:ae:9f:cc:f1:87:b7:8f:22:d1:c5:d7:45:84:ba:e5 -# SHA256 Fingerprint: fe:76:96:57:38:55:77:3e:37:a9:5e:7a:d4:d9:cc:96:c3:01:57:c1:5d:31:76:5b:a9:b1:57:04:e1:ae:78:fd ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=TunTrust Root CA O=Agence Nationale de Certification Electronique -# Subject: CN=TunTrust Root CA O=Agence Nationale de Certification Electronique -# Label: "TunTrust Root CA" -# Serial: 108534058042236574382096126452369648152337120275 -# MD5 Fingerprint: 85:13:b9:90:5b:36:5c:b6:5e:b8:5a:f8:e0:31:57:b4 -# SHA1 Fingerprint: cf:e9:70:84:0f:e0:73:0f:9d:f6:0c:7f:2c:4b:ee:20:46:34:9c:bb -# SHA256 Fingerprint: 2e:44:10:2a:b5:8c:b8:54:19:45:1c:8e:19:d9:ac:f3:66:2c:af:bc:61:4b:6a:53:96:0a:30:f7:d0:e2:eb:41 ------BEGIN CERTIFICATE----- -MIIFszCCA5ugAwIBAgIUEwLV4kBMkkaGFmddtLu7sms+/BMwDQYJKoZIhvcNAQEL -BQAwYTELMAkGA1UEBhMCVE4xNzA1BgNVBAoMLkFnZW5jZSBOYXRpb25hbGUgZGUg -Q2VydGlmaWNhdGlvbiBFbGVjdHJvbmlxdWUxGTAXBgNVBAMMEFR1blRydXN0IFJv -b3QgQ0EwHhcNMTkwNDI2MDg1NzU2WhcNNDQwNDI2MDg1NzU2WjBhMQswCQYDVQQG -EwJUTjE3MDUGA1UECgwuQWdlbmNlIE5hdGlvbmFsZSBkZSBDZXJ0aWZpY2F0aW9u -IEVsZWN0cm9uaXF1ZTEZMBcGA1UEAwwQVHVuVHJ1c3QgUm9vdCBDQTCCAiIwDQYJ -KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMPN0/y9BFPdDCA61YguBUtB9YOCfvdZ -n56eY+hz2vYGqU8ftPkLHzmMmiDQfgbU7DTZhrx1W4eI8NLZ1KMKsmwb60ksPqxd -2JQDoOw05TDENX37Jk0bbjBU2PWARZw5rZzJJQRNmpA+TkBuimvNKWfGzC3gdOgF -VwpIUPp6Q9p+7FuaDmJ2/uqdHYVy7BG7NegfJ7/Boce7SBbdVtfMTqDhuazb1YMZ -GoXRlJfXyqNlC/M4+QKu3fZnz8k/9YosRxqZbwUN/dAdgjH8KcwAWJeRTIAAHDOF -li/LQcKLEITDCSSJH7UP2dl3RxiSlGBcx5kDPP73lad9UKGAwqmDrViWVSHbhlnU -r8a83YFuB9tgYv7sEG7aaAH0gxupPqJbI9dkxt/con3YS7qC0lH4Zr8GRuR5KiY2 -eY8fTpkdso8MDhz/yV3A/ZAQprE38806JG60hZC/gLkMjNWb1sjxVj8agIl6qeIb -MlEsPvLfe/ZdeikZjuXIvTZxi11Mwh0/rViizz1wTaZQmCXcI/m4WEEIcb9PuISg -jwBUFfyRbVinljvrS5YnzWuioYasDXxU5mZMZl+QviGaAkYt5IPCgLnPSz7ofzwB -7I9ezX/SKEIBlYrilz0QIX32nRzFNKHsLA4KUiwSVXAkPcvCFDVDXSdOvsC9qnyW -5/yeYa1E0wCXAgMBAAGjYzBhMB0GA1UdDgQWBBQGmpsfU33x9aTI04Y+oXNZtPdE -ITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFAaamx9TffH1pMjThj6hc1m0 -90QhMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAqgVutt0Vyb+z -xiD2BkewhpMl0425yAA/l/VSJ4hxyXT968pk21vvHl26v9Hr7lxpuhbI87mP0zYu -QEkHDVneixCwSQXi/5E/S7fdAo74gShczNxtr18UnH1YeA32gAm56Q6XKRm4t+v4 -FstVEuTGfbvE7Pi1HE4+Z7/FXxttbUcoqgRYYdZ2vyJ/0Adqp2RT8JeNnYA/u8EH -22Wv5psymsNUk8QcCMNE+3tjEUPRahphanltkE8pjkcFwRJpadbGNjHh/PqAulxP -xOu3Mqz4dWEX1xAZufHSCe96Qp1bWgvUxpVOKs7/B9dPfhgGiPEZtdmYu65xxBzn -dFlY7wyJz4sfdZMaBBSSSFCp61cpABbjNhzI+L/wM9VBD8TMPN3pM0MBkRArHtG5 -Xc0yGYuPjCB31yLEQtyEFpslbei0VXF/sHyz03FJuc9SpAQ/3D2gu68zngowYI7b -nV2UqL1g52KAdoGDDIzMMEZJ4gzSqK/rYXHv5yJiqfdcZGyfFoxnNidF9Ql7v/YQ -CvGwjVRDjAS6oz/v4jXH+XTgbzRB0L9zZVcg+ZtnemZoJE6AZb0QmQZZ8mWvuMZH -u/2QeItBcy6vVR/cO5JyboTT0GFMDcx2V+IthSIVNg3rAZ3r2OvEhJn7wAzMMujj -d9qDRIueVSjAi1jTkD5OGwDxFa2DK5o= ------END CERTIFICATE----- - -# Issuer: CN=HARICA TLS RSA Root CA 2021 O=Hellenic Academic and Research Institutions CA -# Subject: CN=HARICA TLS RSA Root CA 2021 O=Hellenic Academic and Research Institutions CA -# Label: "HARICA TLS RSA Root CA 2021" -# Serial: 76817823531813593706434026085292783742 -# MD5 Fingerprint: 65:47:9b:58:86:dd:2c:f0:fc:a2:84:1f:1e:96:c4:91 -# SHA1 Fingerprint: 02:2d:05:82:fa:88:ce:14:0c:06:79:de:7f:14:10:e9:45:d7:a5:6d -# SHA256 Fingerprint: d9:5d:0e:8e:da:79:52:5b:f9:be:b1:1b:14:d2:10:0d:32:94:98:5f:0c:62:d9:fa:bd:9c:d9:99:ec:cb:7b:1d ------BEGIN CERTIFICATE----- -MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBs -MQswCQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0Eg -Um9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUzOFoXDTQ1MDIxMzEwNTUzN1owbDEL -MAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl -YXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNBIFJv -b3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569l -mwVnlskNJLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE -4VGC/6zStGndLuwRo0Xua2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uv -a9of08WRiFukiZLRgeaMOVig1mlDqa2YUlhu2wr7a89o+uOkXjpFc5gH6l8Cct4M -pbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K5FrZx40d/JiZ+yykgmvw -Kh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEvdmn8kN3b -LW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcY -AuUR0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqB -AGMUuTNe3QvboEUHGjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYq -E613TBoYm5EPWNgGVMWX+Ko/IIqmhaZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHr -W2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQCPxrvrNQKlr9qEgYRtaQQJKQ -CoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE -AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAU -X15QvWiWkKQUEapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3 -f5Z2EMVGpdAgS1D0NTsY9FVqQRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxaja -H6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxDQpSbIPDRzbLrLFPCU3hKTwSUQZqP -JzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcRj88YxeMn/ibvBZ3P -zzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5vZSt -jBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0 -/L5H9MG0qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pT -BGIBnfHAT+7hOtSLIBD6Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79 -aPib8qXPMThcFarmlwDB31qlpzmq6YR/PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YW -xw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnnkf3/W9b3raYvAwtt41dU -63ZTGI0RmLo= ------END CERTIFICATE----- - -# Issuer: CN=HARICA TLS ECC Root CA 2021 O=Hellenic Academic and Research Institutions CA -# Subject: CN=HARICA TLS ECC Root CA 2021 O=Hellenic Academic and Research Institutions CA -# Label: "HARICA TLS ECC Root CA 2021" -# Serial: 137515985548005187474074462014555733966 -# MD5 Fingerprint: ae:f7:4c:e5:66:35:d1:b7:9b:8c:22:93:74:d3:4b:b0 -# SHA1 Fingerprint: bc:b0:c1:9d:e9:98:92:70:19:38:57:e9:8d:a7:b4:5d:6e:ee:01:48 -# SHA256 Fingerprint: 3f:99:cc:47:4a:cf:ce:4d:fe:d5:87:94:66:5e:47:8d:15:47:73:9f:2e:78:0f:1b:b4:ca:9b:13:30:97:d4:01 ------BEGIN CERTIFICATE----- -MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQsw -CQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2Vh -cmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9v -dCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoXDTQ1MDIxMzExMDEwOVowbDELMAkG -A1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj -aCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJvb3Qg -Q0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7 -KKrxcm1lAEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9Y -STHMmE5gEYd103KUkE+bECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQD -AgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAircJRQO9gcS3ujwLEXQNw -SaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/QwCZ61IygN -nxS2PFOiTAZpffpskcYqSUXm7LcT4Tps ------END CERTIFICATE----- - -# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" -# Serial: 1977337328857672817 -# MD5 Fingerprint: 4e:6e:9b:54:4c:ca:b7:fa:48:e4:90:b1:15:4b:1c:a3 -# SHA1 Fingerprint: 0b:be:c2:27:22:49:cb:39:aa:db:35:5c:53:e3:8c:ae:78:ff:b6:fe -# SHA256 Fingerprint: 57:de:05:83:ef:d2:b2:6e:03:61:da:99:da:9d:f4:64:8d:ef:7e:e8:44:1c:3b:72:8a:fa:9b:cd:e0:f9:b2:6a ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UE -BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h -cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1 -MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg -Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 -thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM -cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG -L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i -NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h -X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b -m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy -Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja -EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T -KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF -6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh -OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1UdDgQWBBRlzeurNR4APn7VdMAc -tHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4wgZswgZgGBFUd -IAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j -b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABC -AG8AbgBhAG4AbwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAw -ADEANzAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9m -iWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL4QjbEwj4KKE1soCzC1HA01aajTNF -Sa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDbLIpgD7dvlAceHabJ -hfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1ilI45P -Vf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZE -EAEeiGaPcjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV -1aUsIC+nmCjuRfzxuIgALI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2t -CsvMo2ebKHTEm9caPARYpoKdrcd7b/+Alun4jWq9GJAd/0kakFI3ky88Al2CdgtR -5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH9IBk9W6VULgRfhVwOEqw -f9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpfNIbnYrX9 -ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNK -GbqEZycPvEJdvSRUDewdcAZfpLz6IHxV ------END CERTIFICATE----- - -# Issuer: CN=vTrus ECC Root CA O=iTrusChina Co.,Ltd. -# Subject: CN=vTrus ECC Root CA O=iTrusChina Co.,Ltd. -# Label: "vTrus ECC Root CA" -# Serial: 630369271402956006249506845124680065938238527194 -# MD5 Fingerprint: de:4b:c1:f5:52:8c:9b:43:e1:3e:8f:55:54:17:8d:85 -# SHA1 Fingerprint: f6:9c:db:b0:fc:f6:02:13:b6:52:32:a6:a3:91:3f:16:70:da:c3:e1 -# SHA256 Fingerprint: 30:fb:ba:2c:32:23:8e:2a:98:54:7a:f9:79:31:e5:50:42:8b:9b:3f:1c:8e:eb:66:33:dc:fa:86:c5:b2:7d:d3 ------BEGIN CERTIFICATE----- -MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMw -RzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAY -BgNVBAMTEXZUcnVzIEVDQyBSb290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDcz -MTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28u -LEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYwEAYHKoZIzj0CAQYF -K4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+cToL0 -v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUd -e4BdS49nTPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIw -V53dVvHH4+m4SVBrm2nDb+zDfSXkV5UTQJtS0zvzQBm8JsctBp61ezaf9SXUY2sA -AjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQLYgmRWAD5Tfs0aNoJrSEG -GJTO ------END CERTIFICATE----- - -# Issuer: CN=vTrus Root CA O=iTrusChina Co.,Ltd. -# Subject: CN=vTrus Root CA O=iTrusChina Co.,Ltd. -# Label: "vTrus Root CA" -# Serial: 387574501246983434957692974888460947164905180485 -# MD5 Fingerprint: b8:c9:37:df:fa:6b:31:84:64:c5:ea:11:6a:1b:75:fc -# SHA1 Fingerprint: 84:1a:69:fb:f5:cd:1a:25:34:13:3d:e3:f8:fc:b8:99:d0:c9:14:b7 -# SHA256 Fingerprint: 8a:71:de:65:59:33:6f:42:6c:26:e5:38:80:d0:0d:88:a1:8d:a4:c6:a9:1f:0d:cb:61:94:e2:06:c5:c9:63:87 ------BEGIN CERTIFICATE----- -MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQEL -BQAwQzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4x -FjAUBgNVBAMTDXZUcnVzIFJvb3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMx -MDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoGA1UEChMTaVRydXNDaGluYSBDby4s -THRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZotsSKYc -IrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykU -AyyNJJrIZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+ -GrPSbcKvdmaVayqwlHeFXgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z9 -8Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KAYPxMvDVTAWqXcoKv8R1w6Jz1717CbMdH -flqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70kLJrxLT5ZOrpGgrIDajt -J8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2AXPKBlim -0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZN -pGvu/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQ -UqqzApVg+QxMaPnu1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHW -OXSuTEGC2/KmSNGzm/MzqvOmwMVO9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMB -AAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYgscasGrz2iTAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAKbqSSaet -8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd -nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1j -bhd47F18iMjrjld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvM -Kar5CKXiNxTKsbhm7xqC5PD48acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIiv -TDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJnxDHO2zTlJQNgJXtxmOTAGytfdELS -S8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554WgicEFOwE30z9J4nfr -I8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4sEb9 -b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNB -UvupLnKWnyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1P -Ti07NEPhmg4NpGaXutIcSkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929ven -sBxXVsFy6K2ir40zSbofitzmdHxghm+Hl3s= ------END CERTIFICATE----- - -# Issuer: CN=ISRG Root X2 O=Internet Security Research Group -# Subject: CN=ISRG Root X2 O=Internet Security Research Group -# Label: "ISRG Root X2" -# Serial: 87493402998870891108772069816698636114 -# MD5 Fingerprint: d3:9e:c4:1e:23:3c:a6:df:cf:a3:7e:6d:e0:14:e6:e5 -# SHA1 Fingerprint: bd:b1:b9:3c:d5:97:8d:45:c6:26:14:55:f8:db:95:c7:5a:d1:53:af -# SHA256 Fingerprint: 69:72:9b:8e:15:a8:6e:fc:17:7a:57:af:b7:17:1d:fc:64:ad:d2:8c:2f:ca:8c:f1:50:7e:34:45:3c:cb:14:70 ------BEGIN CERTIFICATE----- -MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQsw -CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg -R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00 -MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5ldCBT -ZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNSRyBSb290IFgyMHYw -EAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0HttwW -+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9 -ItgKbppbd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zAdBgNVHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZI -zj0EAwMDaAAwZQIwe3lORlCEwkSHRhtFcP9Ymd70/aTSVaYgLXTWNLxBo1BfASdW -tL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1 -/q4AaOeMSQ+2b1tbFfLn ------END CERTIFICATE----- - -# Issuer: CN=HiPKI Root CA - G1 O=Chunghwa Telecom Co., Ltd. -# Subject: CN=HiPKI Root CA - G1 O=Chunghwa Telecom Co., Ltd. -# Label: "HiPKI Root CA - G1" -# Serial: 60966262342023497858655262305426234976 -# MD5 Fingerprint: 69:45:df:16:65:4b:e8:68:9a:8f:76:5f:ff:80:9e:d3 -# SHA1 Fingerprint: 6a:92:e4:a8:ee:1b:ec:96:45:37:e3:29:57:49:cd:96:e3:e5:d2:60 -# SHA256 Fingerprint: f0:15:ce:3c:c2:39:bf:ef:06:4b:e9:f1:d2:c4:17:e1:a0:26:4a:0a:94:be:1f:0c:8d:12:18:64:eb:69:49:cc ------BEGIN CERTIFICATE----- -MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBP -MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 -ZC4xGzAZBgNVBAMMEkhpUEtJIFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRa -Fw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3 -YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kgUm9vdCBDQSAtIEcx -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0o9Qw -qNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twv -Vcg3Px+kwJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6 -lZgRZq2XNdZ1AYDgr/SEYYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnz -Qs7ZngyzsHeXZJzA9KMuH5UHsBffMNsAGJZMoYFL3QRtU6M9/Aes1MU3guvklQgZ -KILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfdhSi8MEyr48KxRURHH+CK -FgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj1jOXTyFj -HluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDr -y+K49a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ -/W3c1pzAtH2lsN0/Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgM -a/aOEmem8rJY5AIJEzypuxC00jBF8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6 -fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQDAgGGMA0GCSqG -SIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi -7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqc -SE5XCV0vrPSltJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6Fza -ZsT0pPBWGTMpWmWSBUdGSquEwx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9Tc -XzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07QJNBAsNB1CI69aO4I1258EHBGG3zg -iLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv5wiZqAxeJoBF1Pho -L5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+GpzjLrF -Ne85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wr -kkVbbiVghUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+ -vhV4nYWBSipX3tUZQ9rbyltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQU -YDksswBVLuT1sw5XxJFBAJw/6KXf6vb/yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ== ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Label: "GlobalSign ECC Root CA - R4" -# Serial: 159662223612894884239637590694 -# MD5 Fingerprint: 26:29:f8:6d:e1:88:bf:a2:65:7f:aa:c4:cd:0f:7f:fc -# SHA1 Fingerprint: 6b:a0:b0:98:e1:71:ef:5a:ad:fe:48:15:80:77:10:f4:bd:6f:0b:28 -# SHA256 Fingerprint: b0:85:d7:0b:96:4f:19:1a:73:e4:af:0d:54:ae:7a:0e:07:aa:fd:af:9b:71:dd:08:62:13:8a:b7:32:5a:24:a2 ------BEGIN CERTIFICATE----- -MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYD -VQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2Jh -bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgw -MTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0g -UjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wWTAT -BgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkWymOx -uYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNV -HQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/ -+wpu+74zyTyjhNUwCgYIKoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147 -bmF0774BxL4YSFlhgjICICadVGNA3jdgUM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R1 O=Google Trust Services LLC -# Subject: CN=GTS Root R1 O=Google Trust Services LLC -# Label: "GTS Root R1" -# Serial: 159662320309726417404178440727 -# MD5 Fingerprint: 05:fe:d0:bf:71:a8:a3:76:63:da:01:e0:d8:52:dc:40 -# SHA1 Fingerprint: e5:8c:1c:c4:91:3b:38:63:4b:e9:10:6e:e3:ad:8e:6b:9d:d9:81:4a -# SHA256 Fingerprint: d9:47:43:2a:bd:e7:b7:fa:90:fc:2e:6b:59:10:1b:12:80:e0:e1:c7:e4:e4:0f:a3:c6:88:7f:ff:57:a7:f4:cf ------BEGIN CERTIFICATE----- -MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw -MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaMf/vo -27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7w -Cl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjw -TcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0Pfybl -qAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaH -szVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4Zor8 -Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUspzBmk -MiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92 -wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70p -aDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrN -VjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQID -AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBAJ+qQibb -C5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe -QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuy -h6f88/qBVRRiClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM4 -7HLwEXWdyzRSjeZ2axfG34arJ45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8J -ZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYciNuaCp+0KueIHoI17eko8cdLiA6Ef -MgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5meLMFrUKTX5hgUvYU/ -Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJFfbdT -6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ -0E6yove+7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm -2tIMPNuzjsmhDYAPexZ3FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bb -bP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3gm3c ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R2 O=Google Trust Services LLC -# Subject: CN=GTS Root R2 O=Google Trust Services LLC -# Label: "GTS Root R2" -# Serial: 159662449406622349769042896298 -# MD5 Fingerprint: 1e:39:c0:53:e6:1e:29:82:0b:ca:52:55:36:5d:57:dc -# SHA1 Fingerprint: 9a:44:49:76:32:db:de:fa:d0:bc:fb:5a:7b:17:bd:9e:56:09:24:94 -# SHA256 Fingerprint: 8d:25:cd:97:22:9d:bf:70:35:6b:da:4e:b3:cc:73:40:31:e2:4c:f0:0f:af:cf:d3:2d:c7:6e:b5:84:1c:7e:a8 ------BEGIN CERTIFICATE----- -MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw -MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3LvCvpt -nfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY -6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAu -MC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7k -RXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXuPuWg -f9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1mKPV -+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K8Yzo -dDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RW -Ir9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKa -G73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCq -gc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwID -AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBAB/Kzt3H -vqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8 -0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyC -B19m3H0Q/gxhswWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2u -NmSRXbBoGOqKYcl3qJfEycel/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMg -yALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVnjWQye+mew4K6Ki3pHrTgSAai/Gev -HyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y59PYjJbigapordwj6 -xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M7YNR -TOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924Sg -JPFI/2R80L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV -7LXTWtiBmelDGDfrs7vRWGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl -6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjWHYbL ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R3 O=Google Trust Services LLC -# Subject: CN=GTS Root R3 O=Google Trust Services LLC -# Label: "GTS Root R3" -# Serial: 159662495401136852707857743206 -# MD5 Fingerprint: 3e:e7:9d:58:02:94:46:51:94:e5:e0:22:4a:8b:e7:73 -# SHA1 Fingerprint: ed:e5:71:80:2b:c8:92:b9:5b:83:3c:d2:32:68:3f:09:cd:a0:1e:46 -# SHA256 Fingerprint: 34:d8:a7:3e:e2:08:d9:bc:db:0d:95:65:20:93:4b:4e:40:e6:94:82:59:6e:8b:6f:73:c8:42:6b:01:0a:6f:48 ------BEGIN CERTIFICATE----- -MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYD -VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG -A1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw -WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz -IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQAIgNi -AAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout736G -jOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL2 -4CejQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7 -VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azTL818+FsuVbu/3ZL3pAzcMeGiAjEA/Jdm -ZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV11RZt+cRLInUue4X ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R4 O=Google Trust Services LLC -# Subject: CN=GTS Root R4 O=Google Trust Services LLC -# Label: "GTS Root R4" -# Serial: 159662532700760215368942768210 -# MD5 Fingerprint: 43:96:83:77:19:4d:76:b3:9d:65:52:e4:1d:22:a5:e8 -# SHA1 Fingerprint: 77:d3:03:67:b5:e0:0c:15:f6:0c:38:61:df:7c:e1:3b:92:46:4d:47 -# SHA256 Fingerprint: 34:9d:fa:40:58:c5:e2:63:12:3b:39:8a:e7:95:57:3c:4e:13:13:c8:3f:e6:8f:93:55:6c:d5:e8:03:1b:3c:7d ------BEGIN CERTIFICATE----- -MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYD -VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG -A1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw -WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz -IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi -AATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzuhXyi -QHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvR -HYqjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D -9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/Cr8deVl5c1RxYIigL9zC2L7F8AjEA8GE8 -p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh4rsUecrNIdSUtUlD ------END CERTIFICATE----- - -# Issuer: CN=Telia Root CA v2 O=Telia Finland Oyj -# Subject: CN=Telia Root CA v2 O=Telia Finland Oyj -# Label: "Telia Root CA v2" -# Serial: 7288924052977061235122729490515358 -# MD5 Fingerprint: 0e:8f:ac:aa:82:df:85:b1:f4:dc:10:1c:fc:99:d9:48 -# SHA1 Fingerprint: b9:99:cd:d1:73:50:8a:c4:47:05:08:9c:8c:88:fb:be:a0:2b:40:cd -# SHA256 Fingerprint: 24:2b:69:74:2f:cb:1e:5b:2a:bf:98:89:8b:94:57:21:87:54:4e:5b:4d:99:11:78:65:73:62:1f:6a:74:b8:2c ------BEGIN CERTIFICATE----- -MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQx -CzAJBgNVBAYTAkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UE -AwwQVGVsaWEgUm9vdCBDQSB2MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1 -NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZ -MBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ76zBq -AMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9 -vVYiQJ3q9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9 -lRdU2HhE8Qx3FZLgmEKnpNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTOD -n3WhUidhOPFZPY5Q4L15POdslv5e2QJltI5c0BE0312/UqeBAMN/mUWZFdUXyApT -7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW5olWK8jjfN7j/4nlNW4o -6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNrRBH0pUPC -TEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6 -WT0EBXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63R -DolUK5X6wK0dmBR4M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZI -pEYslOqodmJHixBTB0hXbOKSTbauBcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGj -YzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7Wxy+G2CQ5MB0GA1UdDgQWBBRy -rOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw -AwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ -8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi -0f6X+J8wfBj5tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMM -A8iZGok1GTzTyVR8qPAs5m4HeW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBS -SRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+Cy748fdHif64W1lZYudogsYMVoe+K -TTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygCQMez2P2ccGrGKMOF -6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15h2Er -3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMt -Ty3EHD70sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pT -VmBds9hCG1xLEooc6+t9xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAW -ysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQraVplI/owd8k+BsHMYeB2F326CjYSlKA -rBPuUBQemMc= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST BR Root CA 1 2020 O=D-Trust GmbH -# Subject: CN=D-TRUST BR Root CA 1 2020 O=D-Trust GmbH -# Label: "D-TRUST BR Root CA 1 2020" -# Serial: 165870826978392376648679885835942448534 -# MD5 Fingerprint: b5:aa:4b:d5:ed:f7:e3:55:2e:8f:72:0a:f3:75:b8:ed -# SHA1 Fingerprint: 1f:5b:98:f0:e3:b5:f7:74:3c:ed:e6:b0:36:7d:32:cd:f4:09:41:67 -# SHA256 Fingerprint: e5:9a:aa:81:60:09:c2:2b:ff:5b:25:ba:d3:7d:f3:06:f0:49:79:7c:1f:81:d8:5a:b0:89:e6:57:bd:8f:00:44 ------BEGIN CERTIFICATE----- -MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQsw -CQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRS -VVNUIEJSIFJvb3QgQ0EgMSAyMDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5 -NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAG -A1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAGByqGSM49AgEGBSuB -BAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7dPYS -zuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0 -QVK5buXuQqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/ -VbNafAkl1bK6CKBrqx9tMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6g -PKA6hjhodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X2JyX3Jvb3Rf -Y2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5l -dC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxPPUQtVHJ1 -c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjO -PQQDAwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFW -wKrY7RjEsK70PvomAjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHV -dWNbFJWcHwHP2NVypw87 ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST EV Root CA 1 2020 O=D-Trust GmbH -# Subject: CN=D-TRUST EV Root CA 1 2020 O=D-Trust GmbH -# Label: "D-TRUST EV Root CA 1 2020" -# Serial: 126288379621884218666039612629459926992 -# MD5 Fingerprint: 8c:2d:9d:70:9f:48:99:11:06:11:fb:e9:cb:30:c0:6e -# SHA1 Fingerprint: 61:db:8c:21:59:69:03:90:d8:7c:9c:12:86:54:cf:9d:3d:f4:dd:07 -# SHA256 Fingerprint: 08:17:0d:1a:a3:64:53:90:1a:2f:95:92:45:e3:47:db:0c:8d:37:ab:aa:bc:56:b8:1a:a1:00:dc:95:89:70:db ------BEGIN CERTIFICATE----- -MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQsw -CQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRS -VVNUIEVWIFJvb3QgQ0EgMSAyMDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5 -NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAG -A1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAGByqGSM49AgEGBSuB -BAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8ZRCC -/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rD -wpdhQntJraOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3 -OqQo5FD4pPfsazK2/umLMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6g -PKA6hjhodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X2V2X3Jvb3Rf -Y2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5l -dC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxPPUQtVHJ1 -c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjO -PQQDAwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CA -y/m0sRtW9XLS/BnRAjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJb -gfM0agPnIjhQW+0ZT0MW ------END CERTIFICATE----- - -# Issuer: CN=DigiCert TLS ECC P384 Root G5 O=DigiCert, Inc. -# Subject: CN=DigiCert TLS ECC P384 Root G5 O=DigiCert, Inc. -# Label: "DigiCert TLS ECC P384 Root G5" -# Serial: 13129116028163249804115411775095713523 -# MD5 Fingerprint: d3:71:04:6a:43:1c:db:a6:59:e1:a8:a3:aa:c5:71:ed -# SHA1 Fingerprint: 17:f3:de:5e:9f:0f:19:e9:8e:f6:1f:32:26:6e:20:c4:07:ae:30:ee -# SHA256 Fingerprint: 01:8e:13:f0:77:25:32:cf:80:9b:d1:b1:72:81:86:72:83:fc:48:c6:e1:3b:e9:c6:98:12:85:4a:49:0c:1b:05 ------BEGIN CERTIFICATE----- -MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURp -Z2lDZXJ0IFRMUyBFQ0MgUDM4NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2 -MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJ -bmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQgUm9vdCBHNTB2MBAG -ByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1TzvdlHJS -7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp -0zVozptjn4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICIS -B4CIfBFqMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49 -BAMDA2gAMGUCMQCJao1H5+z8blUD2WdsJk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQ -LgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIxAJSdYsiJvRmEFOml+wG4 -DXZDjC5Ty3zfDBeWUA== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert TLS RSA4096 Root G5 O=DigiCert, Inc. -# Subject: CN=DigiCert TLS RSA4096 Root G5 O=DigiCert, Inc. -# Label: "DigiCert TLS RSA4096 Root G5" -# Serial: 11930366277458970227240571539258396554 -# MD5 Fingerprint: ac:fe:f7:34:96:a9:f2:b3:b4:12:4b:e4:27:41:6f:e1 -# SHA1 Fingerprint: a7:88:49:dc:5d:7c:75:8c:8c:de:39:98:56:b3:aa:d0:b2:a5:71:35 -# SHA256 Fingerprint: 37:1a:00:dc:05:33:b3:72:1a:7e:eb:40:e8:41:9e:70:79:9d:2b:0a:0f:2c:1d:80:69:31:65:f7:ce:c4:ad:75 ------BEGIN CERTIFICATE----- -MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBN -MQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMT -HERpZ2lDZXJ0IFRMUyBSU0E0MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcN -NDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQs -IEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2IFJvb3QgRzUwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS87IE+ -ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG0 -2C+JFvuUAT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgp -wgscONyfMXdcvyej/Cestyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZM -pG2T6T867jp8nVid9E6P/DsjyG244gXazOvswzH016cpVIDPRFtMbzCe88zdH5RD -nU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnVDdXifBBiqmvwPXbzP6Po -sMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9qTXeXAaDx -Zre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cd -Lvvyz6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvX -KyY//SovcfXWJL5/MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNe -XoVPzthwiHvOAbWWl9fNff2C+MIkwcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPL -tgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4EFgQUUTMc7TZArxfTJc1paPKv -TiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcN -AQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw -GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7H -PNtQOa27PShNlnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLF -O4uJ+DQtpBflF+aZfTCIITfNMBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQ -REtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/u4cnYiWB39yhL/btp/96j1EuMPik -AdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9GOUrYU9DzLjtxpdRv -/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh47a+ -p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilw -MUc/dNAUFvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WF -qUITVuwhd4GTWgzqltlJyqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCK -ovfepEWFJqgejF0pW8hL2JpqA15w8oVPbEtoL8pU9ozaMv7Da4M/OMZ+ ------END CERTIFICATE----- - -# Issuer: CN=Certainly Root R1 O=Certainly -# Subject: CN=Certainly Root R1 O=Certainly -# Label: "Certainly Root R1" -# Serial: 188833316161142517227353805653483829216 -# MD5 Fingerprint: 07:70:d4:3e:82:87:a0:fa:33:36:13:f4:fa:33:e7:12 -# SHA1 Fingerprint: a0:50:ee:0f:28:71:f4:27:b2:12:6d:6f:50:96:25:ba:cc:86:42:af -# SHA256 Fingerprint: 77:b8:2c:d8:64:4c:43:05:f7:ac:c5:cb:15:6b:45:67:50:04:03:3d:51:c6:0c:62:02:a8:e0:c3:34:67:d3:a0 ------BEGIN CERTIFICATE----- -MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAw -PTELMAkGA1UEBhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2Vy -dGFpbmx5IFJvb3QgUjEwHhcNMjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9 -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0 -YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANA2 -1B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O5MQT -vqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbed -aFySpvXl8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b0 -1C7jcvk2xusVtyWMOvwlDbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5 -r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGIXsXwClTNSaa/ApzSRKft43jvRl5tcdF5 -cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkNKPl6I7ENPT2a/Z2B7yyQ -wHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQAjeZjOVJ -6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA -2CnbrlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyH -Wyf5QBGenDPBt+U1VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMR -eiFPCyEQtkA6qyI6BJyLm4SGcprSp6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB -/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTgqj8ljZ9EXME66C6u -d0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAszHQNTVfSVcOQr -PbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d -8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi -1wrykXprOQ4vMMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrd -rRT90+7iIgXr0PK3aBLXWopBGsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9di -taY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+gjwN/KUD+nsa2UUeYNrEjvn8K8l7 -lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgHJBu6haEaBQmAupVj -yTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7fpYn -Kx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLy -yCwzk5Iwx06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5n -wXARPbv0+Em34yaXOp/SX3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6 -OV+KmalBWQewLK8= ------END CERTIFICATE----- - -# Issuer: CN=Certainly Root E1 O=Certainly -# Subject: CN=Certainly Root E1 O=Certainly -# Label: "Certainly Root E1" -# Serial: 8168531406727139161245376702891150584 -# MD5 Fingerprint: 0a:9e:ca:cd:3e:52:50:c6:36:f3:4b:a3:ed:a7:53:e9 -# SHA1 Fingerprint: f9:e1:6d:dc:01:89:cf:d5:82:45:63:3e:c5:37:7d:c2:eb:93:6f:2b -# SHA256 Fingerprint: b4:58:5f:22:e4:ac:75:6a:4e:86:12:a1:36:1c:5d:9d:03:1a:93:fd:84:fe:bb:77:8f:a3:06:8b:0f:c4:2d:c2 ------BEGIN CERTIFICATE----- -MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQsw -CQYDVQQGEwJVUzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlu -bHkgUm9vdCBFMTAeFw0yMTA0MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJ -BgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlubHkxGjAYBgNVBAMTEUNlcnRhaW5s -eSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4fxzf7flHh4axpMCK -+IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9YBk2 -QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4 -hevIIgcwCgYIKoZIzj0EAwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozm -ut6Dacpps6kFtZaSF4fC0urQe87YQVt8rgIwRt7qy12a7DLCZRawTDBcMPPaTnOG -BtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR ------END CERTIFICATE----- - -# Issuer: CN=Security Communication ECC RootCA1 O=SECOM Trust Systems CO.,LTD. -# Subject: CN=Security Communication ECC RootCA1 O=SECOM Trust Systems CO.,LTD. -# Label: "Security Communication ECC RootCA1" -# Serial: 15446673492073852651 -# MD5 Fingerprint: 7e:43:b0:92:68:ec:05:43:4c:98:ab:5d:35:2e:7e:86 -# SHA1 Fingerprint: b8:0e:26:a9:bf:d2:b2:3b:c0:ef:46:c9:ba:c7:bb:f6:1d:0d:41:41 -# SHA256 Fingerprint: e7:4f:bd:a5:5b:d5:64:c4:73:a3:6b:44:1a:a7:99:c8:a6:8e:07:74:40:e8:28:8b:9f:a1:e5:0e:4b:ba:ca:11 ------BEGIN CERTIFICATE----- -MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYT -AkpQMSUwIwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYD -VQQDEyJTZWN1cml0eSBDb21tdW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYx -NjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTELMAkGA1UEBhMCSlAxJTAjBgNVBAoT -HFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNVBAMTIlNlY3VyaXR5 -IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQAIgNi -AASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+Cnnfdl -dB9sELLo5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpK -ULGjQjBAMB0GA1UdDgQWBBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu -9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3LsnNdo4gIxwwCMQDAqy0O -be0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70eN9k= ------END CERTIFICATE----- - -# Issuer: CN=BJCA Global Root CA1 O=BEIJING CERTIFICATE AUTHORITY -# Subject: CN=BJCA Global Root CA1 O=BEIJING CERTIFICATE AUTHORITY -# Label: "BJCA Global Root CA1" -# Serial: 113562791157148395269083148143378328608 -# MD5 Fingerprint: 42:32:99:76:43:33:36:24:35:07:82:9b:28:f9:d0:90 -# SHA1 Fingerprint: d5:ec:8d:7b:4c:ba:79:f4:e7:e8:cb:9d:6b:ae:77:83:10:03:21:6a -# SHA256 Fingerprint: f3:89:6f:88:fe:7c:0a:88:27:66:a7:fa:6a:d2:74:9f:b5:7a:7f:3e:98:fb:76:9c:1f:a7:b0:9c:2c:44:d5:ae ------BEGIN CERTIFICATE----- -MIIFdDCCA1ygAwIBAgIQVW9l47TZkGobCdFsPsBsIDANBgkqhkiG9w0BAQsFADBU -MQswCQYDVQQGEwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRI -T1JJVFkxHTAbBgNVBAMMFEJKQ0EgR2xvYmFsIFJvb3QgQ0ExMB4XDTE5MTIxOTAz -MTYxN1oXDTQ0MTIxMjAzMTYxN1owVDELMAkGA1UEBhMCQ04xJjAkBgNVBAoMHUJF -SUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRCSkNBIEdsb2Jh -bCBSb290IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFmCL3Z -xRVhy4QEQaVpN3cdwbB7+sN3SJATcmTRuHyQNZ0YeYjjlwE8R4HyDqKYDZ4/N+AZ -spDyRhySsTphzvq3Rp4Dhtczbu33RYx2N95ulpH3134rhxfVizXuhJFyV9xgw8O5 -58dnJCNPYwpj9mZ9S1WnP3hkSWkSl+BMDdMJoDIwOvqfwPKcxRIqLhy1BDPapDgR -at7GGPZHOiJBhyL8xIkoVNiMpTAK+BcWyqw3/XmnkRd4OJmtWO2y3syJfQOcs4ll -5+M7sSKGjwZteAf9kRJ/sGsciQ35uMt0WwfCyPQ10WRjeulumijWML3mG90Vr4Tq -nMfK9Q7q8l0ph49pczm+LiRvRSGsxdRpJQaDrXpIhRMsDQa4bHlW/KNnMoH1V6XK -V0Jp6VwkYe/iMBhORJhVb3rCk9gZtt58R4oRTklH2yiUAguUSiz5EtBP6DF+bHq/ -pj+bOT0CFqMYs2esWz8sgytnOYFcuX6U1WTdno9uruh8W7TXakdI136z1C2OVnZO -z2nxbkRs1CTqjSShGL+9V/6pmTW12xB3uD1IutbB5/EjPtffhZ0nPNRAvQoMvfXn -jSXWgXSHRtQpdaJCbPdzied9v3pKH9MiyRVVz99vfFXQpIsHETdfg6YmV6YBW37+ -WGgHqel62bno/1Afq8K0wM7o6v0PvY1NuLxxAgMBAAGjQjBAMB0GA1UdDgQWBBTF -7+3M2I0hxkjk49cULqcWk+WYATAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE -AwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAUoKsITQfI/Ki2Pm4rzc2IInRNwPWaZ+4 -YRC6ojGYWUfo0Q0lHhVBDOAqVdVXUsv45Mdpox1NcQJeXyFFYEhcCY5JEMEE3Kli -awLwQ8hOnThJdMkycFRtwUf8jrQ2ntScvd0g1lPJGKm1Vrl2i5VnZu69mP6u775u -+2D2/VnGKhs/I0qUJDAnyIm860Qkmss9vk/Ves6OF8tiwdneHg56/0OGNFK8YT88 -X7vZdrRTvJez/opMEi4r89fO4aL/3Xtw+zuhTaRjAv04l5U/BXCga99igUOLtFkN -SoxUnMW7gZ/NfaXvCyUeOiDbHPwfmGcCCtRzRBPbUYQaVQNW4AB+dAb/OMRyHdOo -P2gxXdMJxy6MW2Pg6Nwe0uxhHvLe5e/2mXZgLR6UcnHGCyoyx5JO1UbXHfmpGQrI -+pXObSOYqgs4rZpWDW+N8TEAiMEXnM0ZNjX+VVOg4DwzX5Ze4jLp3zO7Bkqp2IRz -znfSxqxx4VyjHQy7Ct9f4qNx2No3WqB4K/TUfet27fJhcKVlmtOJNBir+3I+17Q9 -eVzYH6Eze9mCUAyTF6ps3MKCuwJXNq+YJyo5UOGwifUll35HaBC07HPKs5fRJNz2 -YqAo07WjuGS3iGJCz51TzZm+ZGiPTx4SSPfSKcOYKMryMguTjClPPGAyzQWWYezy -r/6zcCwupvI= ------END CERTIFICATE----- - -# Issuer: CN=BJCA Global Root CA2 O=BEIJING CERTIFICATE AUTHORITY -# Subject: CN=BJCA Global Root CA2 O=BEIJING CERTIFICATE AUTHORITY -# Label: "BJCA Global Root CA2" -# Serial: 58605626836079930195615843123109055211 -# MD5 Fingerprint: 5e:0a:f6:47:5f:a6:14:e8:11:01:95:3f:4d:01:eb:3c -# SHA1 Fingerprint: f4:27:86:eb:6e:b8:6d:88:31:67:02:fb:ba:66:a4:53:00:aa:7a:a6 -# SHA256 Fingerprint: 57:4d:f6:93:1e:27:80:39:66:7b:72:0a:fd:c1:60:0f:c2:7e:b6:6d:d3:09:29:79:fb:73:85:64:87:21:28:82 ------BEGIN CERTIFICATE----- -MIICJTCCAaugAwIBAgIQLBcIfWQqwP6FGFkGz7RK6zAKBggqhkjOPQQDAzBUMQsw -CQYDVQQGEwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJ -VFkxHTAbBgNVBAMMFEJKQ0EgR2xvYmFsIFJvb3QgQ0EyMB4XDTE5MTIxOTAzMTgy -MVoXDTQ0MTIxMjAzMTgyMVowVDELMAkGA1UEBhMCQ04xJjAkBgNVBAoMHUJFSUpJ -TkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRCSkNBIEdsb2JhbCBS -b290IENBMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABJ3LgJGNU2e1uVCxA/jlSR9B -IgmwUVJY1is0j8USRhTFiy8shP8sbqjV8QnjAyEUxEM9fMEsxEtqSs3ph+B99iK+ -+kpRuDCK/eHeGBIK9ke35xe/J4rUQUyWPGCWwf0VHKNCMEAwHQYDVR0OBBYEFNJK -sVF/BvDRgh9Obl+rg/xI1LCRMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8W9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA -94M04TVOSG0ED1cxMDAtsaqdAzjbBgIxAMvMh1PLet8gUXOQwKhbYdDFUDn9hf7B -43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w== ------END CERTIFICATE----- - -# Issuer: CN=Sectigo Public Server Authentication Root E46 O=Sectigo Limited -# Subject: CN=Sectigo Public Server Authentication Root E46 O=Sectigo Limited -# Label: "Sectigo Public Server Authentication Root E46" -# Serial: 88989738453351742415770396670917916916 -# MD5 Fingerprint: 28:23:f8:b2:98:5c:37:16:3b:3e:46:13:4e:b0:b3:01 -# SHA1 Fingerprint: ec:8a:39:6c:40:f0:2e:bc:42:75:d4:9f:ab:1c:1a:5b:67:be:d2:9a -# SHA256 Fingerprint: c9:0f:26:f0:fb:1b:40:18:b2:22:27:51:9b:5c:a2:b5:3e:2c:a5:b3:be:5c:f1:8e:fe:1b:ef:47:38:0c:53:83 ------BEGIN CERTIFICATE----- -MIICOjCCAcGgAwIBAgIQQvLM2htpN0RfFf51KBC49DAKBggqhkjOPQQDAzBfMQsw -CQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1T -ZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwHhcN -MjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5WjBfMQswCQYDVQQGEwJHQjEYMBYG -A1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBT -ZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAAR2+pmpbiDt+dd34wc7qNs9Xzjoq1WmVk/WSOrsfy2qw7LFeeyZYX8QeccC -WvkEN/U0NSt3zn8gj1KjAIns1aeibVvjS5KToID1AZTc8GgHHs3u/iVStSBDHBv+ -6xnOQ6OjQjBAMB0GA1UdDgQWBBTRItpMWfFLXyY4qp3W7usNw/upYTAOBgNVHQ8B -Af8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNnADBkAjAn7qRa -qCG76UeXlImldCBteU/IvZNeWBj7LRoAasm4PdCkT0RHlAFWovgzJQxC36oCMB3q -4S6ILuH5px0CMk7yn2xVdOOurvulGu7t0vzCAxHrRVxgED1cf5kDW21USAGKcw== ------END CERTIFICATE----- - -# Issuer: CN=Sectigo Public Server Authentication Root R46 O=Sectigo Limited -# Subject: CN=Sectigo Public Server Authentication Root R46 O=Sectigo Limited -# Label: "Sectigo Public Server Authentication Root R46" -# Serial: 156256931880233212765902055439220583700 -# MD5 Fingerprint: 32:10:09:52:00:d5:7e:6c:43:df:15:c0:b1:16:93:e5 -# SHA1 Fingerprint: ad:98:f9:f3:e4:7d:75:3b:65:d4:82:b3:a4:52:17:bb:6e:f5:e4:38 -# SHA256 Fingerprint: 7b:b6:47:a6:2a:ee:ac:88:bf:25:7a:a5:22:d0:1f:fe:a3:95:e0:ab:45:c7:3f:93:f6:56:54:ec:38:f2:5a:06 ------BEGIN CERTIFICATE----- -MIIFijCCA3KgAwIBAgIQdY39i658BwD6qSWn4cetFDANBgkqhkiG9w0BAQwFADBf -MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQD -Ey1TZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYw -HhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5WjBfMQswCQYDVQQGEwJHQjEY -MBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1Ymxp -YyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCTvtU2UnXYASOgHEdCSe5jtrch/cSV1UgrJnwUUxDa -ef0rty2k1Cz66jLdScK5vQ9IPXtamFSvnl0xdE8H/FAh3aTPaE8bEmNtJZlMKpnz -SDBh+oF8HqcIStw+KxwfGExxqjWMrfhu6DtK2eWUAtaJhBOqbchPM8xQljeSM9xf -iOefVNlI8JhD1mb9nxc4Q8UBUQvX4yMPFF1bFOdLvt30yNoDN9HWOaEhUTCDsG3X -ME6WW5HwcCSrv0WBZEMNvSE6Lzzpng3LILVCJ8zab5vuZDCQOc2TZYEhMbUjUDM3 -IuM47fgxMMxF/mL50V0yeUKH32rMVhlATc6qu/m1dkmU8Sf4kaWD5QazYw6A3OAS -VYCmO2a0OYctyPDQ0RTp5A1NDvZdV3LFOxxHVp3i1fuBYYzMTYCQNFu31xR13NgE -SJ/AwSiItOkcyqex8Va3e0lMWeUgFaiEAin6OJRpmkkGj80feRQXEgyDet4fsZfu -+Zd4KKTIRJLpfSYFplhym3kT2BFfrsU4YjRosoYwjviQYZ4ybPUHNs2iTG7sijbt -8uaZFURww3y8nDnAtOFr94MlI1fZEoDlSfB1D++N6xybVCi0ITz8fAr/73trdf+L -HaAZBav6+CuBQug4urv7qv094PPK306Xlynt8xhW6aWWrL3DkJiy4Pmi1KZHQ3xt -zwIDAQABo0IwQDAdBgNVHQ4EFgQUVnNYZJX5khqwEioEYnmhQBWIIUkwDgYDVR0P -AQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAC9c -mTz8Bl6MlC5w6tIyMY208FHVvArzZJ8HXtXBc2hkeqK5Duj5XYUtqDdFqij0lgVQ -YKlJfp/imTYpE0RHap1VIDzYm/EDMrraQKFz6oOht0SmDpkBm+S8f74TlH7Kph52 -gDY9hAaLMyZlbcp+nv4fjFg4exqDsQ+8FxG75gbMY/qB8oFM2gsQa6H61SilzwZA -Fv97fRheORKkU55+MkIQpiGRqRxOF3yEvJ+M0ejf5lG5Nkc/kLnHvALcWxxPDkjB -JYOcCj+esQMzEhonrPcibCTRAUH4WAP+JWgiH5paPHxsnnVI84HxZmduTILA7rpX -DhjvLpr3Etiga+kFpaHpaPi8TD8SHkXoUsCjvxInebnMMTzD9joiFgOgyY9mpFui -TdaBJQbpdqQACj7LzTWb4OE4y2BThihCQRxEV+ioratF4yUQvNs+ZUH7G6aXD+u5 -dHn5HrwdVw1Hr8Mvn4dGp+smWg9WY7ViYG4A++MnESLn/pmPNPW56MORcr3Ywx65 -LvKRRFHQV80MNNVIIb/bE/FmJUNS0nAiNs2fxBx1IK1jcmMGDw4nztJqDby1ORrp -0XZ60Vzk50lJLVU3aPAaOpg+VBeHVOmmJ1CJeyAvP/+/oYtKR5j/K3tJPsMpRmAY -QqszKbrAKbkTidOIijlBO8n9pu0f9GBj39ItVQGL ------END CERTIFICATE----- - -# Issuer: CN=SSL.com TLS RSA Root CA 2022 O=SSL Corporation -# Subject: CN=SSL.com TLS RSA Root CA 2022 O=SSL Corporation -# Label: "SSL.com TLS RSA Root CA 2022" -# Serial: 148535279242832292258835760425842727825 -# MD5 Fingerprint: d8:4e:c6:59:30:d8:fe:a0:d6:7a:5a:2c:2c:69:78:da -# SHA1 Fingerprint: ec:2c:83:40:72:af:26:95:10:ff:0e:f2:03:ee:31:70:f6:78:9d:ca -# SHA256 Fingerprint: 8f:af:7d:2e:2c:b4:70:9b:b8:e0:b3:36:66:bf:75:a5:dd:45:b5:de:48:0f:8e:a8:d4:bf:e6:be:bc:17:f2:ed ------BEGIN CERTIFICATE----- -MIIFiTCCA3GgAwIBAgIQb77arXO9CEDii02+1PdbkTANBgkqhkiG9w0BAQsFADBO -MQswCQYDVQQGEwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQD -DBxTU0wuY29tIFRMUyBSU0EgUm9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzQyMloX -DTQ2MDgxOTE2MzQyMVowTjELMAkGA1UEBhMCVVMxGDAWBgNVBAoMD1NTTCBDb3Jw -b3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgUlNBIFJvb3QgQ0EgMjAyMjCC -AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANCkCXJPQIgSYT41I57u9nTP -L3tYPc48DRAokC+X94xI2KDYJbFMsBFMF3NQ0CJKY7uB0ylu1bUJPiYYf7ISf5OY -t6/wNr/y7hienDtSxUcZXXTzZGbVXcdotL8bHAajvI9AI7YexoS9UcQbOcGV0ins -S657Lb85/bRi3pZ7QcacoOAGcvvwB5cJOYF0r/c0WRFXCsJbwST0MXMwgsadugL3 -PnxEX4MN8/HdIGkWCVDi1FW24IBydm5MR7d1VVm0U3TZlMZBrViKMWYPHqIbKUBO -L9975hYsLfy/7PO0+r4Y9ptJ1O4Fbtk085zx7AGL0SDGD6C1vBdOSHtRwvzpXGk3 -R2azaPgVKPC506QVzFpPulJwoxJF3ca6TvvC0PeoUidtbnm1jPx7jMEWTO6Af77w -dr5BUxIzrlo4QqvXDz5BjXYHMtWrifZOZ9mxQnUjbvPNQrL8VfVThxc7wDNY8VLS -+YCk8OjwO4s4zKTGkH8PnP2L0aPP2oOnaclQNtVcBdIKQXTbYxE3waWglksejBYS -d66UNHsef8JmAOSqg+qKkK3ONkRN0VHpvB/zagX9wHQfJRlAUW7qglFA35u5CCoG -AtUjHBPW6dvbxrB6y3snm/vg1UYk7RBLY0ulBY+6uB0rpvqR4pJSvezrZ5dtmi2f -gTIFZzL7SAg/2SW4BCUvAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j -BBgwFoAU+y437uOEeicuzRk1sTN8/9REQrkwHQYDVR0OBBYEFPsuN+7jhHonLs0Z -NbEzfP/UREK5MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAjYlt -hEUY8U+zoO9opMAdrDC8Z2awms22qyIZZtM7QbUQnRC6cm4pJCAcAZli05bg4vsM -QtfhWsSWTVTNj8pDU/0quOr4ZcoBwq1gaAafORpR2eCNJvkLTqVTJXojpBzOCBvf -R4iyrT7gJ4eLSYwfqUdYe5byiB0YrrPRpgqU+tvT5TgKa3kSM/tKWTcWQA673vWJ -DPFs0/dRa1419dvAJuoSc06pkZCmF8NsLzjUo3KUQyxi4U5cMj29TH0ZR6LDSeeW -P4+a0zvkEdiLA9z2tmBVGKaBUfPhqBVq6+AL8BQx1rmMRTqoENjwuSfr98t67wVy -lrXEj5ZzxOhWc5y8aVFjvO9nHEMaX3cZHxj4HCUp+UmZKbaSPaKDN7EgkaibMOlq -bLQjk2UEqxHzDh1TJElTHaE/nUiSEeJ9DU/1172iWD54nR4fK/4huxoTtrEoZP2w -AgDHbICivRZQIA9ygV/MlP+7mea6kMvq+cYMwq7FGc4zoWtcu358NFcXrfA/rs3q -r5nsLFR+jM4uElZI7xc7P0peYNLcdDa8pUNjyw9bowJWCZ4kLOGGgYz+qxcs+sji -Mho6/4UIyYOf8kpIEFR3N+2ivEC+5BB09+Rbu7nzifmPQdjH5FCQNYA+HLhNkNPU -98OwoX6EyneSMSy4kLGCenROmxMmtNVQZlR4rmA= ------END CERTIFICATE----- - -# Issuer: CN=SSL.com TLS ECC Root CA 2022 O=SSL Corporation -# Subject: CN=SSL.com TLS ECC Root CA 2022 O=SSL Corporation -# Label: "SSL.com TLS ECC Root CA 2022" -# Serial: 26605119622390491762507526719404364228 -# MD5 Fingerprint: 99:d7:5c:f1:51:36:cc:e9:ce:d9:19:2e:77:71:56:c5 -# SHA1 Fingerprint: 9f:5f:d9:1a:54:6d:f5:0c:71:f0:ee:7a:bd:17:49:98:84:73:e2:39 -# SHA256 Fingerprint: c3:2f:fd:9f:46:f9:36:d1:6c:36:73:99:09:59:43:4b:9a:d6:0a:af:bb:9e:7c:f3:36:54:f1:44:cc:1b:a1:43 ------BEGIN CERTIFICATE----- -MIICOjCCAcCgAwIBAgIQFAP1q/s3ixdAW+JDsqXRxDAKBggqhkjOPQQDAzBOMQsw -CQYDVQQGEwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxT -U0wuY29tIFRMUyBFQ0MgUm9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzM0OFoXDTQ2 -MDgxOTE2MzM0N1owTjELMAkGA1UEBhMCVVMxGDAWBgNVBAoMD1NTTCBDb3Jwb3Jh -dGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgRUNDIFJvb3QgQ0EgMjAyMjB2MBAG -ByqGSM49AgEGBSuBBAAiA2IABEUpNXP6wrgjzhR9qLFNoFs27iosU8NgCTWyJGYm -acCzldZdkkAZDsalE3D07xJRKF3nzL35PIXBz5SQySvOkkJYWWf9lCcQZIxPBLFN -SeR7T5v15wj4A4j3p8OSSxlUgaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSME -GDAWgBSJjy+j6CugFFR781a4Jl9nOAuc0DAdBgNVHQ4EFgQUiY8vo+groBRUe/NW -uCZfZzgLnNAwDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2gAMGUCMFXjIlbp -15IkWE8elDIPDAI2wv2sdDJO4fscgIijzPvX6yv/N33w7deedWo1dlJF4AIxAMeN -b0Igj762TVntd00pxCAgRWSGOlDGxK0tk/UYfXLtqc/ErFc2KAhl3zx5Zn6g6g== ------END CERTIFICATE----- - -# Issuer: CN=Atos TrustedRoot Root CA ECC TLS 2021 O=Atos -# Subject: CN=Atos TrustedRoot Root CA ECC TLS 2021 O=Atos -# Label: "Atos TrustedRoot Root CA ECC TLS 2021" -# Serial: 81873346711060652204712539181482831616 -# MD5 Fingerprint: 16:9f:ad:f1:70:ad:79:d6:ed:29:b4:d1:c5:79:70:a8 -# SHA1 Fingerprint: 9e:bc:75:10:42:b3:02:f3:81:f4:f7:30:62:d4:8f:c3:a7:51:b2:dd -# SHA256 Fingerprint: b2:fa:e5:3e:14:cc:d7:ab:92:12:06:47:01:ae:27:9c:1d:89:88:fa:cb:77:5f:a8:a0:08:91:4e:66:39:88:a8 ------BEGIN CERTIFICATE----- -MIICFTCCAZugAwIBAgIQPZg7pmY9kGP3fiZXOATvADAKBggqhkjOPQQDAzBMMS4w -LAYDVQQDDCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgRUNDIFRMUyAyMDIxMQ0w -CwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0yMTA0MjIwOTI2MjNaFw00MTA0 -MTcwOTI2MjJaMEwxLjAsBgNVBAMMJUF0b3MgVHJ1c3RlZFJvb3QgUm9vdCBDQSBF -Q0MgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYTAkRFMHYwEAYHKoZI -zj0CAQYFK4EEACIDYgAEloZYKDcKZ9Cg3iQZGeHkBQcfl+3oZIK59sRxUM6KDP/X -tXa7oWyTbIOiaG6l2b4siJVBzV3dscqDY4PMwL502eCdpO5KTlbgmClBk1IQ1SQ4 -AjJn8ZQSb+/Xxd4u/RmAo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR2 -KCXWfeBmmnoJsmo7jjPXNtNPojAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMD -aAAwZQIwW5kp85wxtolrbNa9d+F851F+uDrNozZffPc8dz7kUK2o59JZDCaOMDtu -CCrCp1rIAjEAmeMM56PDr9NJLkaCI2ZdyQAUEv049OGYa3cpetskz2VAv9LcjBHo -9H1/IISpQuQo ------END CERTIFICATE----- - -# Issuer: CN=Atos TrustedRoot Root CA RSA TLS 2021 O=Atos -# Subject: CN=Atos TrustedRoot Root CA RSA TLS 2021 O=Atos -# Label: "Atos TrustedRoot Root CA RSA TLS 2021" -# Serial: 111436099570196163832749341232207667876 -# MD5 Fingerprint: d4:d3:46:b8:9a:c0:9c:76:5d:9e:3a:c3:b9:99:31:d2 -# SHA1 Fingerprint: 18:52:3b:0d:06:37:e4:d6:3a:df:23:e4:98:fb:5b:16:fb:86:74:48 -# SHA256 Fingerprint: 81:a9:08:8e:a5:9f:b3:64:c5:48:a6:f8:55:59:09:9b:6f:04:05:ef:bf:18:e5:32:4e:c9:f4:57:ba:00:11:2f ------BEGIN CERTIFICATE----- -MIIFZDCCA0ygAwIBAgIQU9XP5hmTC/srBRLYwiqipDANBgkqhkiG9w0BAQwFADBM -MS4wLAYDVQQDDCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgUlNBIFRMUyAyMDIx -MQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0yMTA0MjIwOTIxMTBaFw00 -MTA0MTcwOTIxMDlaMEwxLjAsBgNVBAMMJUF0b3MgVHJ1c3RlZFJvb3QgUm9vdCBD -QSBSU0EgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYTAkRFMIICIjAN -BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtoAOxHm9BYx9sKOdTSJNy/BBl01Z -4NH+VoyX8te9j2y3I49f1cTYQcvyAh5x5en2XssIKl4w8i1mx4QbZFc4nXUtVsYv -Ye+W/CBGvevUez8/fEc4BKkbqlLfEzfTFRVOvV98r61jx3ncCHvVoOX3W3WsgFWZ -kmGbzSoXfduP9LVq6hdKZChmFSlsAvFr1bqjM9xaZ6cF4r9lthawEO3NUDPJcFDs -GY6wx/J0W2tExn2WuZgIWWbeKQGb9Cpt0xU6kGpn8bRrZtkh68rZYnxGEFzedUln -nkL5/nWpo63/dgpnQOPF943HhZpZnmKaau1Fh5hnstVKPNe0OwANwI8f4UDErmwh -3El+fsqyjW22v5MvoVw+j8rtgI5Y4dtXz4U2OLJxpAmMkokIiEjxQGMYsluMWuPD -0xeqqxmjLBvk1cbiZnrXghmmOxYsL3GHX0WelXOTwkKBIROW1527k2gV+p2kHYzy -geBYBr3JtuP2iV2J+axEoctr+hbxx1A9JNr3w+SH1VbxT5Aw+kUJWdo0zuATHAR8 -ANSbhqRAvNncTFd+rrcztl524WWLZt+NyteYr842mIycg5kDcPOvdO3GDjbnvezB -c6eUWsuSZIKmAMFwoW4sKeFYV+xafJlrJaSQOoD0IJ2azsct+bJLKZWD6TWNp0lI -pw9MGZHQ9b8Q4HECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU -dEmZ0f+0emhFdcN+tNzMzjkz2ggwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB -DAUAA4ICAQAjQ1MkYlxt/T7Cz1UAbMVWiLkO3TriJQ2VSpfKgInuKs1l+NsW4AmS -4BjHeJi78+xCUvuppILXTdiK/ORO/auQxDh1MoSf/7OwKwIzNsAQkG8dnK/haZPs -o0UvFJ/1TCplQ3IM98P4lYsU84UgYt1UU90s3BiVaU+DR3BAM1h3Egyi61IxHkzJ -qM7F78PRreBrAwA0JrRUITWXAdxfG/F851X6LWh3e9NpzNMOa7pNdkTWwhWaJuyw -xfW70Xp0wmzNxbVe9kzmWy2B27O3Opee7c9GslA9hGCZcbUztVdF5kJHdWoOsAgM -rr3e97sPWD2PAzHoPYJQyi9eDF20l74gNAf0xBLh7tew2VktafcxBPTy+av5EzH4 -AXcOPUIjJsyacmdRIXrMPIWo6iFqO9taPKU0nprALN+AnCng33eU0aKAQv9qTFsR -0PXNor6uzFFcw9VUewyu1rkGd4Di7wcaaMxZUa1+XGdrudviB0JbuAEFWDlN5LuY -o7Ey7Nmj1m+UI/87tyll5gfp77YZ6ufCOB0yiJA8EytuzO+rdwY0d4RPcuSBhPm5 -dDTedk+SKlOxJTnbPP/lPqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcE -oji2jbDwN/zIIX8/syQbPYtuzE2wFg2WHYMfRsCbvUOZ58SWLs5fyQ== ------END CERTIFICATE----- - -# Issuer: CN=TrustAsia Global Root CA G3 O=TrustAsia Technologies, Inc. -# Subject: CN=TrustAsia Global Root CA G3 O=TrustAsia Technologies, Inc. -# Label: "TrustAsia Global Root CA G3" -# Serial: 576386314500428537169965010905813481816650257167 -# MD5 Fingerprint: 30:42:1b:b7:bb:81:75:35:e4:16:4f:53:d2:94:de:04 -# SHA1 Fingerprint: 63:cf:b6:c1:27:2b:56:e4:88:8e:1c:23:9a:b6:2e:81:47:24:c3:c7 -# SHA256 Fingerprint: e0:d3:22:6a:eb:11:63:c2:e4:8f:f9:be:3b:50:b4:c6:43:1b:e7:bb:1e:ac:c5:c3:6b:5d:5e:c5:09:03:9a:08 ------BEGIN CERTIFICATE----- -MIIFpTCCA42gAwIBAgIUZPYOZXdhaqs7tOqFhLuxibhxkw8wDQYJKoZIhvcNAQEM -BQAwWjELMAkGA1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dp -ZXMsIEluYy4xJDAiBgNVBAMMG1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHMzAe -Fw0yMTA1MjAwMjEwMTlaFw00NjA1MTkwMjEwMTlaMFoxCzAJBgNVBAYTAkNOMSUw -IwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQwIgYDVQQDDBtU -cnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzMwggIiMA0GCSqGSIb3DQEBAQUAA4IC -DwAwggIKAoICAQDAMYJhkuSUGwoqZdC+BqmHO1ES6nBBruL7dOoKjbmzTNyPtxNS -T1QY4SxzlZHFZjtqz6xjbYdT8PfxObegQ2OwxANdV6nnRM7EoYNl9lA+sX4WuDqK -AtCWHwDNBSHvBm3dIZwZQ0WhxeiAysKtQGIXBsaqvPPW5vxQfmZCHzyLpnl5hkA1 -nyDvP+uLRx+PjsXUjrYsyUQE49RDdT/VP68czH5GX6zfZBCK70bwkPAPLfSIC7Ep -qq+FqklYqL9joDiR5rPmd2jE+SoZhLsO4fWvieylL1AgdB4SQXMeJNnKziyhWTXA -yB1GJ2Faj/lN03J5Zh6fFZAhLf3ti1ZwA0pJPn9pMRJpxx5cynoTi+jm9WAPzJMs -hH/x/Gr8m0ed262IPfN2dTPXS6TIi/n1Q1hPy8gDVI+lhXgEGvNz8teHHUGf59gX -zhqcD0r83ERoVGjiQTz+LISGNzzNPy+i2+f3VANfWdP3kXjHi3dqFuVJhZBFcnAv -kV34PmVACxmZySYgWmjBNb9Pp1Hx2BErW+Canig7CjoKH8GB5S7wprlppYiU5msT -f9FkPz2ccEblooV7WIQn3MSAPmeamseaMQ4w7OYXQJXZRe0Blqq/DPNL0WP3E1jA -uPP6Z92bfW1K/zJMtSU7/xxnD4UiWQWRkUF3gdCFTIcQcf+eQxuulXUtgQIDAQAB -o2MwYTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEDk5PIj7zjKsK5Xf/Ih -MBY027ySMB0GA1UdDgQWBBRA5OTyI+84yrCuV3/yITAWNNu8kjAOBgNVHQ8BAf8E -BAMCAQYwDQYJKoZIhvcNAQEMBQADggIBACY7UeFNOPMyGLS0XuFlXsSUT9SnYaP4 -wM8zAQLpw6o1D/GUE3d3NZ4tVlFEbuHGLige/9rsR82XRBf34EzC4Xx8MnpmyFq2 -XFNFV1pF1AWZLy4jVe5jaN/TG3inEpQGAHUNcoTpLrxaatXeL1nHo+zSh2bbt1S1 -JKv0Q3jbSwTEb93mPmY+KfJLaHEih6D4sTNjduMNhXJEIlU/HHzp/LgV6FL6qj6j -ITk1dImmasI5+njPtqzn59ZW/yOSLlALqbUHM/Q4X6RJpstlcHboCoWASzY9M/eV -VHUl2qzEc4Jl6VL1XP04lQJqaTDFHApXB64ipCz5xUG3uOyfT0gA+QEEVcys+TIx -xHWVBqB/0Y0n3bOppHKH/lmLmnp0Ft0WpWIp6zqW3IunaFnT63eROfjXy9mPX1on -AX1daBli2MjN9LdyR75bl87yraKZk62Uy5P2EgmVtqvXO9A/EcswFi55gORngS1d -7XB4tmBZrOFdRWOPyN9yaFvqHbgB8X7754qz41SgOAngPN5C8sLtLpvzHzW2Ntjj -gKGLzZlkD8Kqq7HK9W+eQ42EVJmzbsASZthwEPEGNTNDqJwuuhQxzhB/HIbjj9LV -+Hfsm6vxL2PZQl/gZ4FkkfGXL/xuJvYz+NO1+MRiqzFRJQJ6+N1rZdVtTTDIZbpo -FGWsJwt0ivKH ------END CERTIFICATE----- - -# Issuer: CN=TrustAsia Global Root CA G4 O=TrustAsia Technologies, Inc. -# Subject: CN=TrustAsia Global Root CA G4 O=TrustAsia Technologies, Inc. -# Label: "TrustAsia Global Root CA G4" -# Serial: 451799571007117016466790293371524403291602933463 -# MD5 Fingerprint: 54:dd:b2:d7:5f:d8:3e:ed:7c:e0:0b:2e:cc:ed:eb:eb -# SHA1 Fingerprint: 57:73:a5:61:5d:80:b2:e6:ac:38:82:fc:68:07:31:ac:9f:b5:92:5a -# SHA256 Fingerprint: be:4b:56:cb:50:56:c0:13:6a:52:6d:f4:44:50:8d:aa:36:a0:b5:4f:42:e4:ac:38:f7:2a:f4:70:e4:79:65:4c ------BEGIN CERTIFICATE----- -MIICVTCCAdygAwIBAgIUTyNkuI6XY57GU4HBdk7LKnQV1tcwCgYIKoZIzj0EAwMw -WjELMAkGA1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMs -IEluYy4xJDAiBgNVBAMMG1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHNDAeFw0y -MTA1MjAwMjEwMjJaFw00NjA1MTkwMjEwMjJaMFoxCzAJBgNVBAYTAkNOMSUwIwYD -VQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQwIgYDVQQDDBtUcnVz -dEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATx -s8045CVD5d4ZCbuBeaIVXxVjAd7Cq92zphtnS4CDr5nLrBfbK5bKfFJV4hrhPVbw -LxYI+hW8m7tH5j/uqOFMjPXTNvk4XatwmkcN4oFBButJ+bAp3TPsUKV/eSm4IJij -YzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUpbtKl86zK3+kMd6Xg1mD -pm9xy94wHQYDVR0OBBYEFKW7SpfOsyt/pDHel4NZg6ZvccveMA4GA1UdDwEB/wQE -AwIBBjAKBggqhkjOPQQDAwNnADBkAjBe8usGzEkxn0AAbbd+NvBNEU/zy4k6LHiR -UKNbwMp1JvK/kF0LgoxgKJ/GcJpo5PECMFxYDlZ2z1jD1xCMuo6u47xkdUfFVZDj -/bpV6wfEU6s3qe4hsiFbYI89MvHVI5TWWA== ------END CERTIFICATE----- - -# Issuer: CN=CommScope Public Trust ECC Root-01 O=CommScope -# Subject: CN=CommScope Public Trust ECC Root-01 O=CommScope -# Label: "CommScope Public Trust ECC Root-01" -# Serial: 385011430473757362783587124273108818652468453534 -# MD5 Fingerprint: 3a:40:a7:fc:03:8c:9c:38:79:2f:3a:a2:6c:b6:0a:16 -# SHA1 Fingerprint: 07:86:c0:d8:dd:8e:c0:80:98:06:98:d0:58:7a:ef:de:a6:cc:a2:5d -# SHA256 Fingerprint: 11:43:7c:da:7b:b4:5e:41:36:5f:45:b3:9a:38:98:6b:0d:e0:0d:ef:34:8e:0c:7b:b0:87:36:33:80:0b:c3:8b ------BEGIN CERTIFICATE----- -MIICHTCCAaOgAwIBAgIUQ3CCd89NXTTxyq4yLzf39H91oJ4wCgYIKoZIzj0EAwMw -TjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29t -bVNjb3BlIFB1YmxpYyBUcnVzdCBFQ0MgUm9vdC0wMTAeFw0yMTA0MjgxNzM1NDNa -Fw00NjA0MjgxNzM1NDJaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21tU2Nv -cGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgRUNDIFJvb3QtMDEw -djAQBgcqhkjOPQIBBgUrgQQAIgNiAARLNumuV16ocNfQj3Rid8NeeqrltqLxeP0C -flfdkXmcbLlSiFS8LwS+uM32ENEp7LXQoMPwiXAZu1FlxUOcw5tjnSCDPgYLpkJE -hRGnSjot6dZoL0hOUysHP029uax3OVejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSOB2LAUN3GGQYARnQE9/OufXVNMDAKBggq -hkjOPQQDAwNoADBlAjEAnDPfQeMjqEI2Jpc1XHvr20v4qotzVRVcrHgpD7oh2MSg -2NED3W3ROT3Ek2DS43KyAjB8xX6I01D1HiXo+k515liWpDVfG2XqYZpwI7UNo5uS -Um9poIyNStDuiw7LR47QjRE= ------END CERTIFICATE----- - -# Issuer: CN=CommScope Public Trust ECC Root-02 O=CommScope -# Subject: CN=CommScope Public Trust ECC Root-02 O=CommScope -# Label: "CommScope Public Trust ECC Root-02" -# Serial: 234015080301808452132356021271193974922492992893 -# MD5 Fingerprint: 59:b0:44:d5:65:4d:b8:5c:55:19:92:02:b6:d1:94:b2 -# SHA1 Fingerprint: 3c:3f:ef:57:0f:fe:65:93:86:9e:a0:fe:b0:f6:ed:8e:d1:13:c7:e5 -# SHA256 Fingerprint: 2f:fb:7f:81:3b:bb:b3:c8:9a:b4:e8:16:2d:0f:16:d7:15:09:a8:30:cc:9d:73:c2:62:e5:14:08:75:d1:ad:4a ------BEGIN CERTIFICATE----- -MIICHDCCAaOgAwIBAgIUKP2ZYEFHpgE6yhR7H+/5aAiDXX0wCgYIKoZIzj0EAwMw -TjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29t -bVNjb3BlIFB1YmxpYyBUcnVzdCBFQ0MgUm9vdC0wMjAeFw0yMTA0MjgxNzQ0NTRa -Fw00NjA0MjgxNzQ0NTNaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21tU2Nv -cGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgRUNDIFJvb3QtMDIw -djAQBgcqhkjOPQIBBgUrgQQAIgNiAAR4MIHoYx7l63FRD/cHB8o5mXxO1Q/MMDAL -j2aTPs+9xYa9+bG3tD60B8jzljHz7aRP+KNOjSkVWLjVb3/ubCK1sK9IRQq9qEmU -v4RDsNuESgMjGWdqb8FuvAY5N9GIIvejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTmGHX/72DehKT1RsfeSlXjMjZ59TAKBggq -hkjOPQQDAwNnADBkAjAmc0l6tqvmSfR9Uj/UQQSugEODZXW5hYA4O9Zv5JOGq4/n -ich/m35rChJVYaoR4HkCMHfoMXGsPHED1oQmHhS48zs73u1Z/GtMMH9ZzkXpc2AV -mkzw5l4lIhVtwodZ0LKOag== ------END CERTIFICATE----- - -# Issuer: CN=CommScope Public Trust RSA Root-01 O=CommScope -# Subject: CN=CommScope Public Trust RSA Root-01 O=CommScope -# Label: "CommScope Public Trust RSA Root-01" -# Serial: 354030733275608256394402989253558293562031411421 -# MD5 Fingerprint: 0e:b4:15:bc:87:63:5d:5d:02:73:d4:26:38:68:73:d8 -# SHA1 Fingerprint: 6d:0a:5f:f7:b4:23:06:b4:85:b3:b7:97:64:fc:ac:75:f5:33:f2:93 -# SHA256 Fingerprint: 02:bd:f9:6e:2a:45:dd:9b:f1:8f:c7:e1:db:df:21:a0:37:9b:a3:c9:c2:61:03:44:cf:d8:d6:06:fe:c1:ed:81 ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIUPgNJgXUWdDGOTKvVxZAplsU5EN0wDQYJKoZIhvcNAQEL -BQAwTjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwi -Q29tbVNjb3BlIFB1YmxpYyBUcnVzdCBSU0EgUm9vdC0wMTAeFw0yMTA0MjgxNjQ1 -NTRaFw00NjA0MjgxNjQ1NTNaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21t -U2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgUlNBIFJvb3Qt -MDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwSGWjDR1C45FtnYSk -YZYSwu3D2iM0GXb26v1VWvZVAVMP8syMl0+5UMuzAURWlv2bKOx7dAvnQmtVzslh -suitQDy6uUEKBU8bJoWPQ7VAtYXR1HHcg0Hz9kXHgKKEUJdGzqAMxGBWBB0HW0al -DrJLpA6lfO741GIDuZNqihS4cPgugkY4Iw50x2tBt9Apo52AsH53k2NC+zSDO3Oj -WiE260f6GBfZumbCk6SP/F2krfxQapWsvCQz0b2If4b19bJzKo98rwjyGpg/qYFl -P8GMicWWMJoKz/TUyDTtnS+8jTiGU+6Xn6myY5QXjQ/cZip8UlF1y5mO6D1cv547 -KI2DAg+pn3LiLCuz3GaXAEDQpFSOm117RTYm1nJD68/A6g3czhLmfTifBSeolz7p -UcZsBSjBAg/pGG3svZwG1KdJ9FQFa2ww8esD1eo9anbCyxooSU1/ZOD6K9pzg4H/ -kQO9lLvkuI6cMmPNn7togbGEW682v3fuHX/3SZtS7NJ3Wn2RnU3COS3kuoL4b/JO -Hg9O5j9ZpSPcPYeoKFgo0fEbNttPxP/hjFtyjMcmAyejOQoBqsCyMWCDIqFPEgkB -Ea801M/XrmLTBQe0MXXgDW1XT2mH+VepuhX2yFJtocucH+X8eKg1mp9BFM6ltM6U -CBwJrVbl2rZJmkrqYxhTnCwuwwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUN12mmnQywsL5x6YVEFm45P3luG0wDQYJ -KoZIhvcNAQELBQADggIBAK+nz97/4L1CjU3lIpbfaOp9TSp90K09FlxD533Ahuh6 -NWPxzIHIxgvoLlI1pKZJkGNRrDSsBTtXAOnTYtPZKdVUvhwQkZyybf5Z/Xn36lbQ -nmhUQo8mUuJM3y+Xpi/SB5io82BdS5pYV4jvguX6r2yBS5KPQJqTRlnLX3gWsWc+ -QgvfKNmwrZggvkN80V4aCRckjXtdlemrwWCrWxhkgPut4AZ9HcpZuPN4KWfGVh2v -trV0KnahP/t1MJ+UXjulYPPLXAziDslg+MkfFoom3ecnf+slpoq9uC02EJqxWE2a -aE9gVOX2RhOOiKy8IUISrcZKiX2bwdgt6ZYD9KJ0DLwAHb/WNyVntHKLr4W96ioD -j8z7PEQkguIBpQtZtjSNMgsSDesnwv1B10A8ckYpwIzqug/xBpMu95yo9GA+o/E4 -Xo4TwbM6l4c/ksp4qRyv0LAbJh6+cOx69TOY6lz/KwsETkPdY34Op054A5U+1C0w -lREQKC6/oAI+/15Z0wUOlV9TRe9rh9VIzRamloPh37MG88EU26fsHItdkJANclHn -YfkUyq+Dj7+vsQpZXdxc1+SWrVtgHdqul7I52Qb1dgAT+GhMIbA1xNxVssnBQVoc -icCMb3SgazNNtQEo/a2tiRc7ppqEvOuM6sRxJKi6KfkIsidWNTJf6jn7MZrVGczw ------END CERTIFICATE----- - -# Issuer: CN=CommScope Public Trust RSA Root-02 O=CommScope -# Subject: CN=CommScope Public Trust RSA Root-02 O=CommScope -# Label: "CommScope Public Trust RSA Root-02" -# Serial: 480062499834624527752716769107743131258796508494 -# MD5 Fingerprint: e1:29:f9:62:7b:76:e2:96:6d:f3:d4:d7:0f:ae:1f:aa -# SHA1 Fingerprint: ea:b0:e2:52:1b:89:93:4c:11:68:f2:d8:9a:ac:22:4c:a3:8a:57:ae -# SHA256 Fingerprint: ff:e9:43:d7:93:42:4b:4f:7c:44:0c:1c:3d:64:8d:53:63:f3:4b:82:dc:87:aa:7a:9f:11:8f:c5:de:e1:01:f1 ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIUVBa/O345lXGN0aoApYYNK496BU4wDQYJKoZIhvcNAQEL -BQAwTjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwi -Q29tbVNjb3BlIFB1YmxpYyBUcnVzdCBSU0EgUm9vdC0wMjAeFw0yMTA0MjgxNzE2 -NDNaFw00NjA0MjgxNzE2NDJaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21t -U2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgUlNBIFJvb3Qt -MDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDh+g77aAASyE3VrCLE -NQE7xVTlWXZjpX/rwcRqmL0yjReA61260WI9JSMZNRTpf4mnG2I81lDnNJUDMrG0 -kyI9p+Kx7eZ7Ti6Hmw0zdQreqjXnfuU2mKKuJZ6VszKWpCtYHu8//mI0SFHRtI1C -rWDaSWqVcN3SAOLMV2MCe5bdSZdbkk6V0/nLKR8YSvgBKtJjCW4k6YnS5cciTNxz -hkcAqg2Ijq6FfUrpuzNPDlJwnZXjfG2WWy09X6GDRl224yW4fKcZgBzqZUPckXk2 -LHR88mcGyYnJ27/aaL8j7dxrrSiDeS/sOKUNNwFnJ5rpM9kzXzehxfCrPfp4sOcs -n/Y+n2Dg70jpkEUeBVF4GiwSLFworA2iI540jwXmojPOEXcT1A6kHkIfhs1w/tku -FT0du7jyU1fbzMZ0KZwYszZ1OC4PVKH4kh+Jlk+71O6d6Ts2QrUKOyrUZHk2EOH5 -kQMreyBUzQ0ZGshBMjTRsJnhkB4BQDa1t/qp5Xd1pCKBXbCL5CcSD1SIxtuFdOa3 -wNemKfrb3vOTlycEVS8KbzfFPROvCgCpLIscgSjX74Yxqa7ybrjKaixUR9gqiC6v -wQcQeKwRoi9C8DfF8rhW3Q5iLc4tVn5V8qdE9isy9COoR+jUKgF4z2rDN6ieZdIs -5fq6M8EGRPbmz6UNp2YINIos8wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUR9DnsSL/nSz12Vdgs7GxcJXvYXowDQYJ -KoZIhvcNAQELBQADggIBAIZpsU0v6Z9PIpNojuQhmaPORVMbc0RTAIFhzTHjCLqB -KCh6krm2qMhDnscTJk3C2OVVnJJdUNjCK9v+5qiXz1I6JMNlZFxHMaNlNRPDk7n3 -+VGXu6TwYofF1gbTl4MgqX67tiHCpQ2EAOHyJxCDut0DgdXdaMNmEMjRdrSzbyme -APnCKfWxkxlSaRosTKCL4BWaMS/TiJVZbuXEs1DIFAhKm4sTg7GkcrI7djNB3Nyq -pgdvHSQSn8h2vS/ZjvQs7rfSOBAkNlEv41xdgSGn2rtO/+YHqP65DSdsu3BaVXoT -6fEqSWnHX4dXTEN5bTpl6TBcQe7rd6VzEojov32u5cSoHw2OHG1QAk8mGEPej1WF -sQs3BWDJVTkSBKEqz3EWnzZRSb9wO55nnPt7eck5HHisd5FUmrh1CoFSl+NmYWvt -PjgelmFV4ZFUjO2MJB+ByRCac5krFk5yAD9UG/iNuovnFNa2RU9g7Jauwy8CTl2d -lklyALKrdVwPaFsdZcJfMw8eD/A7hvWwTruc9+olBdytoptLFwG+Qt81IR2tq670 -v64fG9PiO/yzcnMcmyiQiRM9HcEARwmWmjgb3bHPDcK0RPOWlc4yOo80nOAXx17O -rg3bhzjlP1v9mxnhMUF6cKojawHhRUzNlM47ni3niAIi9G7oyOzWPPO5std3eqx7 ------END CERTIFICATE----- - -# Issuer: CN=Telekom Security TLS ECC Root 2020 O=Deutsche Telekom Security GmbH -# Subject: CN=Telekom Security TLS ECC Root 2020 O=Deutsche Telekom Security GmbH -# Label: "Telekom Security TLS ECC Root 2020" -# Serial: 72082518505882327255703894282316633856 -# MD5 Fingerprint: c1:ab:fe:6a:10:2c:03:8d:bc:1c:22:32:c0:85:a7:fd -# SHA1 Fingerprint: c0:f8:96:c5:a9:3b:01:06:21:07:da:18:42:48:bc:e9:9d:88:d5:ec -# SHA256 Fingerprint: 57:8a:f4:de:d0:85:3f:4e:59:98:db:4a:ea:f9:cb:ea:8d:94:5f:60:b6:20:a3:8d:1a:3c:13:b2:bc:7b:a8:e1 ------BEGIN CERTIFICATE----- -MIICQjCCAcmgAwIBAgIQNjqWjMlcsljN0AFdxeVXADAKBggqhkjOPQQDAzBjMQsw -CQYDVQQGEwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBH -bWJIMSswKQYDVQQDDCJUZWxla29tIFNlY3VyaXR5IFRMUyBFQ0MgUm9vdCAyMDIw -MB4XDTIwMDgyNTA3NDgyMFoXDTQ1MDgyNTIzNTk1OVowYzELMAkGA1UEBhMCREUx -JzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkgR21iSDErMCkGA1UE -AwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgRUNDIFJvb3QgMjAyMDB2MBAGByqGSM49 -AgEGBSuBBAAiA2IABM6//leov9Wq9xCazbzREaK9Z0LMkOsVGJDZos0MKiXrPk/O -tdKPD/M12kOLAoC+b1EkHQ9rK8qfwm9QMuU3ILYg/4gND21Ju9sGpIeQkpT0CdDP -f8iAC8GXs7s1J8nCG6NCMEAwHQYDVR0OBBYEFONyzG6VmUex5rNhTNHLq+O6zd6f -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2cA -MGQCMHVSi7ekEE+uShCLsoRbQuHmKjYC2qBuGT8lv9pZMo7k+5Dck2TOrbRBR2Di -z6fLHgIwN0GMZt9Ba9aDAEH9L1r3ULRn0SyocddDypwnJJGDSA3PzfdUga/sf+Rn -27iQ7t0l ------END CERTIFICATE----- - -# Issuer: CN=Telekom Security TLS RSA Root 2023 O=Deutsche Telekom Security GmbH -# Subject: CN=Telekom Security TLS RSA Root 2023 O=Deutsche Telekom Security GmbH -# Label: "Telekom Security TLS RSA Root 2023" -# Serial: 44676229530606711399881795178081572759 -# MD5 Fingerprint: bf:5b:eb:54:40:cd:48:71:c4:20:8d:7d:de:0a:42:f2 -# SHA1 Fingerprint: 54:d3:ac:b3:bd:57:56:f6:85:9d:ce:e5:c3:21:e2:d4:ad:83:d0:93 -# SHA256 Fingerprint: ef:c6:5c:ad:bb:59:ad:b6:ef:e8:4d:a2:23:11:b3:56:24:b7:1b:3b:1e:a0:da:8b:66:55:17:4e:c8:97:86:46 ------BEGIN CERTIFICATE----- -MIIFszCCA5ugAwIBAgIQIZxULej27HF3+k7ow3BXlzANBgkqhkiG9w0BAQwFADBj -MQswCQYDVQQGEwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0 -eSBHbWJIMSswKQYDVQQDDCJUZWxla29tIFNlY3VyaXR5IFRMUyBSU0EgUm9vdCAy -MDIzMB4XDTIzMDMyODEyMTY0NVoXDTQ4MDMyNzIzNTk1OVowYzELMAkGA1UEBhMC -REUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkgR21iSDErMCkG -A1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgUlNBIFJvb3QgMjAyMzCCAiIwDQYJ -KoZIhvcNAQEBBQADggIPADCCAgoCggIBAO01oYGA88tKaVvC+1GDrib94W7zgRJ9 -cUD/h3VCKSHtgVIs3xLBGYSJwb3FKNXVS2xE1kzbB5ZKVXrKNoIENqil/Cf2SfHV -cp6R+SPWcHu79ZvB7JPPGeplfohwoHP89v+1VmLhc2o0mD6CuKyVU/QBoCcHcqMA -U6DksquDOFczJZSfvkgdmOGjup5czQRxUX11eKvzWarE4GC+j4NSuHUaQTXtvPM6 -Y+mpFEXX5lLRbtLevOP1Czvm4MS9Q2QTps70mDdsipWol8hHD/BeEIvnHRz+sTug -BTNoBUGCwQMrAcjnj02r6LX2zWtEtefdi+zqJbQAIldNsLGyMcEWzv/9FIS3R/qy -8XDe24tsNlikfLMR0cN3f1+2JeANxdKz+bi4d9s3cXFH42AYTyS2dTd4uaNir73J -co4vzLuu2+QVUhkHM/tqty1LkCiCc/4YizWN26cEar7qwU02OxY2kTLvtkCJkUPg -8qKrBC7m8kwOFjQgrIfBLX7JZkcXFBGk8/ehJImr2BrIoVyxo/eMbcgByU/J7MT8 -rFEz0ciD0cmfHdRHNCk+y7AO+oMLKFjlKdw/fKifybYKu6boRhYPluV75Gp6SG12 -mAWl3G0eQh5C2hrgUve1g8Aae3g1LDj1H/1Joy7SWWO/gLCMk3PLNaaZlSJhZQNg -+y+TS/qanIA7AgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtqeX -gj10hZv3PJ+TmpV5dVKMbUcwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS2 -p5eCPXSFm/c8n5OalXl1UoxtRzANBgkqhkiG9w0BAQwFAAOCAgEAqMxhpr51nhVQ -pGv7qHBFfLp+sVr8WyP6Cnf4mHGCDG3gXkaqk/QeoMPhk9tLrbKmXauw1GLLXrtm -9S3ul0A8Yute1hTWjOKWi0FpkzXmuZlrYrShF2Y0pmtjxrlO8iLpWA1WQdH6DErw -M807u20hOq6OcrXDSvvpfeWxm4bu4uB9tPcy/SKE8YXJN3nptT+/XOR0so8RYgDd -GGah2XsjX/GO1WfoVNpbOms2b/mBsTNHM3dA+VKq3dSDz4V4mZqTuXNnQkYRIer+ -CqkbGmVps4+uFrb2S1ayLfmlyOw7YqPta9BO1UAJpB+Y1zqlklkg5LB9zVtzaL1t -xKITDmcZuI1CfmwMmm6gJC3VRRvcxAIU/oVbZZfKTpBQCHpCNfnqwmbU+AGuHrS+ -w6jv/naaoqYfRvaE7fzbzsQCzndILIyy7MMAo+wsVRjBfhnu4S/yrYObnqsZ38aK -L4x35bcF7DvB7L6Gs4a8wPfc5+pbrrLMtTWGS9DiP7bY+A4A7l3j941Y/8+LN+lj -X273CXE2whJdV/LItM3z7gLfEdxquVeEHVlNjM7IDiPCtyaaEBRx/pOyiriA8A4Q -ntOoUAw3gi/q4Iqd4Sw5/7W0cwDk90imc6y/st53BIe0o82bNSQ3+pCTE4FCxpgm -dTdmQRCsu/WU48IxK63nI1bMNSWSs1A= ------END CERTIFICATE----- - -# Issuer: CN=FIRMAPROFESIONAL CA ROOT-A WEB O=Firmaprofesional SA -# Subject: CN=FIRMAPROFESIONAL CA ROOT-A WEB O=Firmaprofesional SA -# Label: "FIRMAPROFESIONAL CA ROOT-A WEB" -# Serial: 65916896770016886708751106294915943533 -# MD5 Fingerprint: 82:b2:ad:45:00:82:b0:66:63:f8:5f:c3:67:4e:ce:a3 -# SHA1 Fingerprint: a8:31:11:74:a6:14:15:0d:ca:77:dd:0e:e4:0c:5d:58:fc:a0:72:a5 -# SHA256 Fingerprint: be:f2:56:da:f2:6e:9c:69:bd:ec:16:02:35:97:98:f3:ca:f7:18:21:a0:3e:01:82:57:c5:3c:65:61:7f:3d:4a ------BEGIN CERTIFICATE----- -MIICejCCAgCgAwIBAgIQMZch7a+JQn81QYehZ1ZMbTAKBggqhkjOPQQDAzBuMQsw -CQYDVQQGEwJFUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25hbCBTQTEYMBYGA1UE -YQwPVkFURVMtQTYyNjM0MDY4MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFMIENB -IFJPT1QtQSBXRUIwHhcNMjIwNDA2MDkwMTM2WhcNNDcwMzMxMDkwMTM2WjBuMQsw -CQYDVQQGEwJFUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25hbCBTQTEYMBYGA1UE -YQwPVkFURVMtQTYyNjM0MDY4MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFMIENB -IFJPT1QtQSBXRUIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARHU+osEaR3xyrq89Zf -e9MEkVz6iMYiuYMQYneEMy3pA4jU4DP37XcsSmDq5G+tbbT4TIqk5B/K6k84Si6C -cyvHZpsKjECcfIr28jlgst7L7Ljkb+qbXbdTkBgyVcUgt5SjYzBhMA8GA1UdEwEB -/wQFMAMBAf8wHwYDVR0jBBgwFoAUk+FDY1w8ndYn81LsF7Kpryz3dvgwHQYDVR0O -BBYEFJPhQ2NcPJ3WJ/NS7Beyqa8s93b4MA4GA1UdDwEB/wQEAwIBBjAKBggqhkjO -PQQDAwNoADBlAjAdfKR7w4l1M+E7qUW/Runpod3JIha3RxEL2Jq68cgLcFBTApFw -hVmpHqTm6iMxoAACMQD94vizrxa5HnPEluPBMBnYfubDl94cT7iJLzPrSA8Z94dG -XSaQpYXFuXqUPoeovQA= ------END CERTIFICATE----- - -# Issuer: CN=TWCA CYBER Root CA O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA CYBER Root CA O=TAIWAN-CA OU=Root CA -# Label: "TWCA CYBER Root CA" -# Serial: 85076849864375384482682434040119489222 -# MD5 Fingerprint: 0b:33:a0:97:52:95:d4:a9:fd:bb:db:6e:a3:55:5b:51 -# SHA1 Fingerprint: f6:b1:1c:1a:83:38:e9:7b:db:b3:a8:c8:33:24:e0:2d:9c:7f:26:66 -# SHA256 Fingerprint: 3f:63:bb:28:14:be:17:4e:c8:b6:43:9c:f0:8d:6d:56:f0:b7:c4:05:88:3a:56:48:a3:34:42:4d:6b:3e:c5:58 ------BEGIN CERTIFICATE----- -MIIFjTCCA3WgAwIBAgIQQAE0jMIAAAAAAAAAATzyxjANBgkqhkiG9w0BAQwFADBQ -MQswCQYDVQQGEwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290 -IENBMRswGQYDVQQDExJUV0NBIENZQkVSIFJvb3QgQ0EwHhcNMjIxMTIyMDY1NDI5 -WhcNNDcxMTIyMTU1OTU5WjBQMQswCQYDVQQGEwJUVzESMBAGA1UEChMJVEFJV0FO -LUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NBIENZQkVSIFJvb3Qg -Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDG+Moe2Qkgfh1sTs6P -40czRJzHyWmqOlt47nDSkvgEs1JSHWdyKKHfi12VCv7qze33Kc7wb3+szT3vsxxF -avcokPFhV8UMxKNQXd7UtcsZyoC5dc4pztKFIuwCY8xEMCDa6pFbVuYdHNWdZsc/ -34bKS1PE2Y2yHer43CdTo0fhYcx9tbD47nORxc5zb87uEB8aBs/pJ2DFTxnk684i -JkXXYJndzk834H/nY62wuFm40AZoNWDTNq5xQwTxaWV4fPMf88oon1oglWa0zbfu -j3ikRRjpJi+NmykosaS3Om251Bw4ckVYsV7r8Cibt4LK/c/WMw+f+5eesRycnupf -Xtuq3VTpMCEobY5583WSjCb+3MX2w7DfRFlDo7YDKPYIMKoNM+HvnKkHIuNZW0CP -2oi3aQiotyMuRAlZN1vH4xfyIutuOVLF3lSnmMlLIJXcRolftBL5hSmO68gnFSDA -S9TMfAxsNAwmmyYxpjyn9tnQS6Jk/zuZQXLB4HCX8SS7K8R0IrGsayIyJNN4KsDA -oS/xUgXJP+92ZuJF2A09rZXIx4kmyA+upwMu+8Ff+iDhcK2wZSA3M2Cw1a/XDBzC -kHDXShi8fgGwsOsVHkQGzaRP6AzRwyAQ4VRlnrZR0Bp2a0JaWHY06rc3Ga4udfmW -5cFZ95RXKSWNOkyrTZpB0F8mAwIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSdhWEUfMFib5do5E83QOGt4A1WNzAd -BgNVHQ4EFgQUnYVhFHzBYm+XaORPN0DhreANVjcwDQYJKoZIhvcNAQEMBQADggIB -AGSPesRiDrWIzLjHhg6hShbNcAu3p4ULs3a2D6f/CIsLJc+o1IN1KriWiLb73y0t -tGlTITVX1olNc79pj3CjYcya2x6a4CD4bLubIp1dhDGaLIrdaqHXKGnK/nZVekZn -68xDiBaiA9a5F/gZbG0jAn/xX9AKKSM70aoK7akXJlQKTcKlTfjF/biBzysseKNn -TKkHmvPfXvt89YnNdJdhEGoHK4Fa0o635yDRIG4kqIQnoVesqlVYL9zZyvpoBJ7t -RCT5dEA7IzOrg1oYJkK2bVS1FmAwbLGg+LhBoF1JSdJlBTrq/p1hvIbZv97Tujqx -f36SNI7JAG7cmL3c7IAFrQI932XtCwP39xaEBDG6k5TY8hL4iuO/Qq+n1M0RFxbI -Qh0UqEL20kCGoE8jypZFVmAGzbdVAaYBlGX+bgUJurSkquLvWL69J1bY73NxW0Qz -8ppy6rBePm6pUlvscG21h483XjyMnM7k8M4MZ0HMzvaAq07MTFb1wWFZk7Q+ptq4 -NxKfKjLji7gh7MMrZQzvIt6IKTtM1/r+t+FHvpw+PoP7UV31aPcuIYXcv/Fa4nzX -xeSDwWrruoBa3lwtcHb4yOWHh8qgnaHlIhInD0Q9HWzq1MKLL295q39QpsQZp6F6 -t5b5wR9iWqJDB0BeJsas7a5wFsWqynKKTbDPAYsDP27X ------END CERTIFICATE----- - -# Issuer: CN=SecureSign Root CA12 O=Cybertrust Japan Co., Ltd. -# Subject: CN=SecureSign Root CA12 O=Cybertrust Japan Co., Ltd. -# Label: "SecureSign Root CA12" -# Serial: 587887345431707215246142177076162061960426065942 -# MD5 Fingerprint: c6:89:ca:64:42:9b:62:08:49:0b:1e:7f:e9:07:3d:e8 -# SHA1 Fingerprint: 7a:22:1e:3d:de:1b:06:ac:9e:c8:47:70:16:8e:3c:e5:f7:6b:06:f4 -# SHA256 Fingerprint: 3f:03:4b:b5:70:4d:44:b2:d0:85:45:a0:20:57:de:93:eb:f3:90:5f:ce:72:1a:cb:c7:30:c0:6d:da:ee:90:4e ------BEGIN CERTIFICATE----- -MIIDcjCCAlqgAwIBAgIUZvnHwa/swlG07VOX5uaCwysckBYwDQYJKoZIhvcNAQEL -BQAwUTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28u -LCBMdGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExMjAeFw0yMDA0MDgw -NTM2NDZaFw00MDA0MDgwNTM2NDZaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpD -eWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBS -b290IENBMTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6OcE3emhF -KxS06+QT61d1I02PJC0W6K6OyX2kVzsqdiUzg2zqMoqUm048luT9Ub+ZyZN+v/mt -p7JIKwccJ/VMvHASd6SFVLX9kHrko+RRWAPNEHl57muTH2SOa2SroxPjcf59q5zd -J1M3s6oYwlkm7Fsf0uZlfO+TvdhYXAvA42VvPMfKWeP+bl+sg779XSVOKik71gur -FzJ4pOE+lEa+Ym6b3kaosRbnhW70CEBFEaCeVESE99g2zvVQR9wsMJvuwPWW0v4J -hscGWa5Pro4RmHvzC1KqYiaqId+OJTN5lxZJjfU+1UefNzFJM3IFTQy2VYzxV4+K -h9GtxRESOaCtAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBRXNPN0zwRL1SXm8UC2LEzZLemgrTANBgkqhkiG9w0BAQsF -AAOCAQEAPrvbFxbS8hQBICw4g0utvsqFepq2m2um4fylOqyttCg6r9cBg0krY6Ld -mmQOmFxv3Y67ilQiLUoT865AQ9tPkbeGGuwAtEGBpE/6aouIs3YIcipJQMPTw4WJ -mBClnW8Zt7vPemVV2zfrPIpyMpcemik+rY3moxtt9XUa5rBouVui7mlHJzWhhpmA -8zNL4WukJsPvdFlseqJkth5Ew1DgDzk9qTPxpfPSvWKErI4cqc1avTc7bgoitPQV -55FYxTpE05Uo2cBl6XLK0A+9H7MV2anjpEcJnuDLN/v9vZfVvhgaaaI5gdka9at/ -yOPiZwud9AzqVN/Ssq+xIvEg37xEHA== ------END CERTIFICATE----- - -# Issuer: CN=SecureSign Root CA14 O=Cybertrust Japan Co., Ltd. -# Subject: CN=SecureSign Root CA14 O=Cybertrust Japan Co., Ltd. -# Label: "SecureSign Root CA14" -# Serial: 575790784512929437950770173562378038616896959179 -# MD5 Fingerprint: 71:0d:72:fa:92:19:65:5e:89:04:ac:16:33:f0:bc:d5 -# SHA1 Fingerprint: dd:50:c0:f7:79:b3:64:2e:74:a2:b8:9d:9f:d3:40:dd:bb:f0:f2:4f -# SHA256 Fingerprint: 4b:00:9c:10:34:49:4f:9a:b5:6b:ba:3b:a1:d6:27:31:fc:4d:20:d8:95:5a:dc:ec:10:a9:25:60:72:61:e3:38 ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIUZNtaDCBO6Ncpd8hQJ6JaJ90t8sswDQYJKoZIhvcNAQEM -BQAwUTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28u -LCBMdGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExNDAeFw0yMDA0MDgw -NzA2MTlaFw00NTA0MDgwNzA2MTlaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpD -eWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBS -b290IENBMTQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDF0nqh1oq/ -FjHQmNE6lPxauG4iwWL3pwon71D2LrGeaBLwbCRjOfHw3xDG3rdSINVSW0KZnvOg -vlIfX8xnbacuUKLBl422+JX1sLrcneC+y9/3OPJH9aaakpUqYllQC6KxNedlsmGy -6pJxaeQp8E+BgQQ8sqVb1MWoWWd7VRxJq3qdwudzTe/NCcLEVxLbAQ4jeQkHO6Lo -/IrPj8BGJJw4J+CDnRugv3gVEOuGTgpa/d/aLIJ+7sr2KeH6caH3iGicnPCNvg9J -kdjqOvn90Ghx2+m1K06Ckm9mH+Dw3EzsytHqunQG+bOEkJTRX45zGRBdAuVwpcAQ -0BB8b8VYSbSwbprafZX1zNoCr7gsfXmPvkPx+SgojQlD+Ajda8iLLCSxjVIHvXib -y8posqTdDEx5YMaZ0ZPxMBoH064iwurO8YQJzOAUbn8/ftKChazcqRZOhaBgy/ac -18izju3Gm5h1DVXoX+WViwKkrkMpKBGk5hIwAUt1ax5mnXkvpXYvHUC0bcl9eQjs -0Wq2XSqypWa9a4X0dFbD9ed1Uigspf9mR6XU/v6eVL9lfgHWMI+lNpyiUBzuOIAB -SMbHdPTGrMNASRZhdCyvjG817XsYAFs2PJxQDcqSMxDxJklt33UkN4Ii1+iW/RVL -ApY+B3KVfqs9TC7XyvDf4Fg/LS8EmjijAQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUBpOjCl4oaTeqYR3r6/wtbyPk -86AwDQYJKoZIhvcNAQEMBQADggIBAJaAcgkGfpzMkwQWu6A6jZJOtxEaCnFxEM0E -rX+lRVAQZk5KQaID2RFPeje5S+LGjzJmdSX7684/AykmjbgWHfYfM25I5uj4V7Ib -ed87hwriZLoAymzvftAj63iP/2SbNDefNWWipAA9EiOWWF3KY4fGoweITedpdopT -zfFP7ELyk+OZpDc8h7hi2/DsHzc/N19DzFGdtfCXwreFamgLRB7lUe6TzktuhsHS -DCRZNhqfLJGP4xjblJUK7ZGqDpncllPjYYPGFrojutzdfhrGe0K22VoF3Jpf1d+4 -2kd92jjbrDnVHmtsKheMYc2xbXIBw8MgAGJoFjHVdqqGuw6qnsb58Nn4DSEC5MUo -FlkRudlpcyqSeLiSV5sI8jrlL5WwWLdrIBRtFO8KvH7YVdiI2i/6GaX7i+B/OfVy -K4XELKzvGUWSTLNhB9xNH27SgRNcmvMSZ4PPmz+Ln52kuaiWA3rF7iDeM9ovnhp6 -dB7h7sxaOgTdsxoEqBRjrLdHEoOabPXm6RUVkRqEGQ6UROcSjiVbgGcZ3GOTEAtl -Lor6CZpO2oYofaphNdgOpygau1LgePhsumywbrmHXumZNTfxPWQrqaA0k89jL9WB -365jJ6UeTo3cKXhZ+PmhIIynJkBugnLNeLLIjzwec+fBH7/PzqUqm9tEZDKgu39c -JRNItX+S ------END CERTIFICATE----- - -# Issuer: CN=SecureSign Root CA15 O=Cybertrust Japan Co., Ltd. -# Subject: CN=SecureSign Root CA15 O=Cybertrust Japan Co., Ltd. -# Label: "SecureSign Root CA15" -# Serial: 126083514594751269499665114766174399806381178503 -# MD5 Fingerprint: 13:30:fc:c4:62:a6:a9:de:b5:c1:68:af:b5:d2:31:47 -# SHA1 Fingerprint: cb:ba:83:c8:c1:5a:5d:f1:f9:73:6f:ca:d7:ef:28:13:06:4a:07:7d -# SHA256 Fingerprint: e7:78:f0:f0:95:fe:84:37:29:cd:1a:00:82:17:9e:53:14:a9:c2:91:44:28:05:e1:fb:1d:8f:b6:b8:88:6c:3a ------BEGIN CERTIFICATE----- -MIICIzCCAamgAwIBAgIUFhXHw9hJp75pDIqI7fBw+d23PocwCgYIKoZIzj0EAwMw -UTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBM -dGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExNTAeFw0yMDA0MDgwODMy -NTZaFw00NTA0MDgwODMyNTZaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpDeWJl -cnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBSb290 -IENBMTUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQLUHSNZDKZmbPSYAi4Io5GdCx4 -wCtELW1fHcmuS1Iggz24FG1Th2CeX2yF2wYUleDHKP+dX+Sq8bOLbe1PL0vJSpSR -ZHX+AezB2Ot6lHhWGENfa4HL9rzatAy2KZMIaY+jQjBAMA8GA1UdEwEB/wQFMAMB -Af8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTrQciu/NWeUUj1vYv0hyCTQSvT -9DAKBggqhkjOPQQDAwNoADBlAjEA2S6Jfl5OpBEHvVnCB96rMjhTKkZEBhd6zlHp -4P9mLQlO4E/0BdGF9jVg3PVys0Z9AjBEmEYagoUeYWmJSwdLZrWeqrqgHkHZAXQ6 -bkU6iYAZezKYVWOr62Nuk22rGwlgMU4= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST BR Root CA 2 2023 O=D-Trust GmbH -# Subject: CN=D-TRUST BR Root CA 2 2023 O=D-Trust GmbH -# Label: "D-TRUST BR Root CA 2 2023" -# Serial: 153168538924886464690566649552453098598 -# MD5 Fingerprint: e1:09:ed:d3:60:d4:56:1b:47:1f:b7:0c:5f:1b:5f:85 -# SHA1 Fingerprint: 2d:b0:70:ee:71:94:af:69:68:17:db:79:ce:58:9f:a0:6b:96:f7:87 -# SHA256 Fingerprint: 05:52:e6:f8:3f:df:65:e8:fa:96:70:e6:66:df:28:a4:e2:13:40:b5:10:cb:e5:25:66:f9:7c:4f:b9:4b:2b:d1 ------BEGIN CERTIFICATE----- -MIIFqTCCA5GgAwIBAgIQczswBEhb2U14LnNLyaHcZjANBgkqhkiG9w0BAQ0FADBI -MQswCQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlE -LVRSVVNUIEJSIFJvb3QgQ0EgMiAyMDIzMB4XDTIzMDUwOTA4NTYzMVoXDTM4MDUw -OTA4NTYzMFowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEi -MCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDIgMjAyMzCCAiIwDQYJKoZIhvcN -AQEBBQADggIPADCCAgoCggIBAK7/CVmRgApKaOYkP7in5Mg6CjoWzckjYaCTcfKr -i3OPoGdlYNJUa2NRb0kz4HIHE304zQaSBylSa053bATTlfrdTIzZXcFhfUvnKLNE -gXtRr90zsWh81k5M/itoucpmacTsXld/9w3HnDY25QdgrMBM6ghs7wZ8T1soegj8 -k12b9py0i4a6Ibn08OhZWiihNIQaJZG2tY/vsvmA+vk9PBFy2OMvhnbFeSzBqZCT -Rphny4NqoFAjpzv2gTng7fC5v2Xx2Mt6++9zA84A9H3X4F07ZrjcjrqDy4d2A/wl -2ecjbwb9Z/Pg/4S8R7+1FhhGaRTMBffb00msa8yr5LULQyReS2tNZ9/WtT5PeB+U -cSTq3nD88ZP+npNa5JRal1QMNXtfbO4AHyTsA7oC9Xb0n9Sa7YUsOCIvx9gvdhFP -/Wxc6PWOJ4d/GUohR5AdeY0cW/jPSoXk7bNbjb7EZChdQcRurDhaTyN0dKkSw/bS -uREVMweR2Ds3OmMwBtHFIjYoYiMQ4EbMl6zWK11kJNXuHA7e+whadSr2Y23OC0K+ -0bpwHJwh5Q8xaRfX/Aq03u2AnMuStIv13lmiWAmlY0cL4UEyNEHZmrHZqLAbWt4N -DfTisl01gLmB1IRpkQLLddCNxbU9CZEJjxShFHR5PtbJFR2kWVki3PaKRT08EtY+ -XTIvAgMBAAGjgY4wgYswDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUZ5Dw1t61 -GNVGKX5cq/ieCLxklRAwDgYDVR0PAQH/BAQDAgEGMEkGA1UdHwRCMEAwPqA8oDqG -OGh0dHA6Ly9jcmwuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3RfYnJfcm9vdF9jYV8y -XzIwMjMuY3JsMA0GCSqGSIb3DQEBDQUAA4ICAQA097N3U9swFrktpSHxQCF16+tI -FoE9c+CeJyrrd6kTpGoKWloUMz1oH4Guaf2Mn2VsNELZLdB/eBaxOqwjMa1ef67n -riv6uvw8l5VAk1/DLQOj7aRvU9f6QA4w9QAgLABMjDu0ox+2v5Eyq6+SmNMW5tTR -VFxDWy6u71cqqLRvpO8NVhTaIasgdp4D/Ca4nj8+AybmTNudX0KEPUUDAxxZiMrc -LmEkWqTqJwtzEr5SswrPMhfiHocaFpVIbVrg0M8JkiZmkdijYQ6qgYF/6FKC0ULn -4B0Y+qSFNueG4A3rvNTJ1jxD8V1Jbn6Bm2m1iWKPiFLY1/4nwSPFyysCu7Ff/vtD -hQNGvl3GyiEm/9cCnnRK3PgTFbGBVzbLZVzRHTF36SXDw7IyN9XxmAnkbWOACKsG -koHU6XCPpz+y7YaMgmo1yEJagtFSGkUPFaUA8JR7ZSdXOUPPfH/mvTWze/EZTN46 -ls/pdu4D58JDUjxqgejBWoC9EV2Ta/vH5mQ/u2kc6d0li690yVRAysuTEwrt+2aS -Ecr1wPrYg1UDfNPFIkZ1cGt5SAYqgpq/5usWDiJFAbzdNpQ0qTUmiteXue4Icr80 -knCDgKs4qllo3UCkGJCy89UDyibK79XH4I9TjvAA46jtn/mtd+ArY0+ew+43u3gJ -hJ65bvspmZDogNOfJA== ------END CERTIFICATE----- - -# Issuer: CN=TrustAsia TLS ECC Root CA O=TrustAsia Technologies, Inc. -# Subject: CN=TrustAsia TLS ECC Root CA O=TrustAsia Technologies, Inc. -# Label: "TrustAsia TLS ECC Root CA" -# Serial: 310892014698942880364840003424242768478804666567 -# MD5 Fingerprint: 09:48:04:77:d2:fc:65:93:71:66:b1:11:95:4f:06:8c -# SHA1 Fingerprint: b5:ec:39:f3:a1:66:37:ae:c3:05:94:57:e2:be:11:be:b7:a1:7f:36 -# SHA256 Fingerprint: c0:07:6b:9e:f0:53:1f:b1:a6:56:d6:7c:4e:be:97:cd:5d:ba:a4:1e:f4:45:98:ac:c2:48:98:78:c9:2d:87:11 ------BEGIN CERTIFICATE----- -MIICMTCCAbegAwIBAgIUNnThTXxlE8msg1UloD5Sfi9QaMcwCgYIKoZIzj0EAwMw -WDELMAkGA1UEBhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dpZXMs -IEluYy4xIjAgBgNVBAMTGVRydXN0QXNpYSBUTFMgRUNDIFJvb3QgQ0EwHhcNMjQw -NTE1MDU0MTU2WhcNNDQwNTE1MDU0MTU1WjBYMQswCQYDVQQGEwJDTjElMCMGA1UE -ChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywgSW5jLjEiMCAGA1UEAxMZVHJ1c3RB -c2lhIFRMUyBFQ0MgUm9vdCBDQTB2MBAGByqGSM49AgEGBSuBBAAiA2IABLh/pVs/ -AT598IhtrimY4ZtcU5nb9wj/1WrgjstEpvDBjL1P1M7UiFPoXlfXTr4sP/MSpwDp -guMqWzJ8S5sUKZ74LYO1644xST0mYekdcouJtgq7nDM1D9rs3qlKH8kzsaNCMEAw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQULIVTu7FDzTLqnqOH/qKYqKaT6RAw -DgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2gAMGUCMFRH18MtYYZI9HlaVQ01 -L18N9mdsd0AaRuf4aFtOJx24mH1/k78ITcTaRTChD15KeAIxAKORh/IRM4PDwYqR -OkwrULG9IpRdNYlzg8WbGf60oenUoWa2AaU2+dhoYSi3dOGiMQ== ------END CERTIFICATE----- - -# Issuer: CN=TrustAsia TLS RSA Root CA O=TrustAsia Technologies, Inc. -# Subject: CN=TrustAsia TLS RSA Root CA O=TrustAsia Technologies, Inc. -# Label: "TrustAsia TLS RSA Root CA" -# Serial: 160405846464868906657516898462547310235378010780 -# MD5 Fingerprint: 3b:9e:c3:86:0f:34:3c:6b:c5:46:c4:8e:1d:e7:19:12 -# SHA1 Fingerprint: a5:46:50:c5:62:ea:95:9a:1a:a7:04:6f:17:58:c7:29:53:3d:03:fa -# SHA256 Fingerprint: 06:c0:8d:7d:af:d8:76:97:1e:b1:12:4f:e6:7f:84:7e:c0:c7:a1:58:d3:ea:53:cb:e9:40:e2:ea:97:91:f4:c3 ------BEGIN CERTIFICATE----- -MIIFgDCCA2igAwIBAgIUHBjYz+VTPyI1RlNUJDxsR9FcSpwwDQYJKoZIhvcNAQEM -BQAwWDELMAkGA1UEBhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dp -ZXMsIEluYy4xIjAgBgNVBAMTGVRydXN0QXNpYSBUTFMgUlNBIFJvb3QgQ0EwHhcN -MjQwNTE1MDU0MTU3WhcNNDQwNTE1MDU0MTU2WjBYMQswCQYDVQQGEwJDTjElMCMG -A1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywgSW5jLjEiMCAGA1UEAxMZVHJ1 -c3RBc2lhIFRMUyBSU0EgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC -AgoCggIBAMMWuBtqpERz5dZO9LnPWwvB0ZqB9WOwj0PBuwhaGnrhB3YmH49pVr7+ -NmDQDIPNlOrnxS1cLwUWAp4KqC/lYCZUlviYQB2srp10Zy9U+5RjmOMmSoPGlbYJ -Q1DNDX3eRA5gEk9bNb2/mThtfWza4mhzH/kxpRkQcwUqwzIZheo0qt1CHjCNP561 -HmHVb70AcnKtEj+qpklz8oYVlQwQX1Fkzv93uMltrOXVmPGZLmzjyUT5tUMnCE32 -ft5EebuyjBza00tsLtbDeLdM1aTk2tyKjg7/D8OmYCYozza/+lcK7Fs/6TAWe8Tb -xNRkoDD75f0dcZLdKY9BWN4ArTr9PXwaqLEX8E40eFgl1oUh63kd0Nyrz2I8sMeX -i9bQn9P+PN7F4/w6g3CEIR0JwqH8uyghZVNgepBtljhb//HXeltt08lwSUq6HTrQ -UNoyIBnkiz/r1RYmNzz7dZ6wB3C4FGB33PYPXFIKvF1tjVEK2sUYyJtt3LCDs3+j -TnhMmCWr8n4uIF6CFabW2I+s5c0yhsj55NqJ4js+k8UTav/H9xj8Z7XvGCxUq0DT -bE3txci3OE9kxJRMT6DNrqXGJyV1J23G2pyOsAWZ1SgRxSHUuPzHlqtKZFlhaxP8 -S8ySpg+kUb8OWJDZgoM5pl+z+m6Ss80zDoWo8SnTq1mt1tve1CuBAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFLgHkXlcBvRG/XtZylomkadFK/hT -MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQwFAAOCAgEAIZtqBSBdGBanEqT3 -Rz/NyjuujsCCztxIJXgXbODgcMTWltnZ9r96nBO7U5WS/8+S4PPFJzVXqDuiGev4 -iqME3mmL5Dw8veWv0BIb5Ylrc5tvJQJLkIKvQMKtuppgJFqBTQUYo+IzeXoLH5Pt -7DlK9RME7I10nYEKqG/odv6LTytpEoYKNDbdgptvT+Bz3Ul/KD7JO6NXBNiT2Twp -2xIQaOHEibgGIOcberyxk2GaGUARtWqFVwHxtlotJnMnlvm5P1vQiJ3koP26TpUJ -g3933FEFlJ0gcXax7PqJtZwuhfG5WyRasQmr2soaB82G39tp27RIGAAtvKLEiUUj -pQ7hRGU+isFqMB3iYPg6qocJQrmBktwliJiJ8Xw18WLK7nn4GS/+X/jbh87qqA8M -pugLoDzga5SYnH+tBuYc6kIQX+ImFTw3OffXvO645e8D7r0i+yiGNFjEWn9hongP -XvPKnbwbPKfILfanIhHKA9jnZwqKDss1jjQ52MjqjZ9k4DewbNfFj8GQYSbbJIwe -SsCI3zWQzj8C9GRh3sfIB5XeMhg6j6JCQCTl1jNdfK7vsU1P1FeQNWrcrgSXSYk0 -ly4wBOeY99sLAZDBHwo/+ML+TvrbmnNzFrwFuHnYWa8G5z9nODmxfKuU4CkUpijy -323imttUQ/hHWKNddBWcwauwxzQ= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST EV Root CA 2 2023 O=D-Trust GmbH -# Subject: CN=D-TRUST EV Root CA 2 2023 O=D-Trust GmbH -# Label: "D-TRUST EV Root CA 2 2023" -# Serial: 139766439402180512324132425437959641711 -# MD5 Fingerprint: 96:b4:78:09:f0:09:cb:77:eb:bb:1b:4d:6f:36:bc:b6 -# SHA1 Fingerprint: a5:5b:d8:47:6c:8f:19:f7:4c:f4:6d:6b:b6:c2:79:82:22:df:54:8b -# SHA256 Fingerprint: 8e:82:21:b2:e7:d4:00:78:36:a1:67:2f:0d:cc:29:9c:33:bc:07:d3:16:f1:32:fa:1a:20:6d:58:71:50:f1:ce ------BEGIN CERTIFICATE----- -MIIFqTCCA5GgAwIBAgIQaSYJfoBLTKCnjHhiU19abzANBgkqhkiG9w0BAQ0FADBI -MQswCQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlE -LVRSVVNUIEVWIFJvb3QgQ0EgMiAyMDIzMB4XDTIzMDUwOTA5MTAzM1oXDTM4MDUw -OTA5MTAzMlowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEi -MCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDIgMjAyMzCCAiIwDQYJKoZIhvcN -AQEBBQADggIPADCCAgoCggIBANiOo4mAC7JXUtypU0w3uX9jFxPvp1sjW2l1sJkK -F8GLxNuo4MwxusLyzV3pt/gdr2rElYfXR8mV2IIEUD2BCP/kPbOx1sWy/YgJ25yE -7CUXFId/MHibaljJtnMoPDT3mfd/06b4HEV8rSyMlD/YZxBTfiLNTiVR8CUkNRFe -EMbsh2aJgWi6zCudR3Mfvc2RpHJqnKIbGKBv7FD0fUDCqDDPvXPIEysQEx6Lmqg6 -lHPTGGkKSv/BAQP/eX+1SH977ugpbzZMlWGG2Pmic4ruri+W7mjNPU0oQvlFKzIb -RlUWaqZLKfm7lVa/Rh3sHZMdwGWyH6FDrlaeoLGPaxK3YG14C8qKXO0elg6DpkiV -jTujIcSuWMYAsoS0I6SWhjW42J7YrDRJmGOVxcttSEfi8i4YHtAxq9107PncjLgc -jmgjutDzUNzPZY9zOjLHfP7KgiJPvo5iR2blzYfi6NUPGJ/lBHJLRjwQ8kTCZFZx -TnXonMkmdMV9WdEKWw9t/p51HBjGGjp82A0EzM23RWV6sY+4roRIPrN6TagD4uJ+ -ARZZaBhDM7DS3LAaQzXupdqpRlyuhoFBAUp0JuyfBr/CBTdkdXgpaP3F9ev+R/nk -hbDhezGdpn9yo7nELC7MmVcOIQxFAZRl62UJxmMiCzNJkkg8/M3OsD6Onov4/knF -NXJHAgMBAAGjgY4wgYswDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUqvyREBuH -kV8Wub9PS5FeAByxMoAwDgYDVR0PAQH/BAQDAgEGMEkGA1UdHwRCMEAwPqA8oDqG -OGh0dHA6Ly9jcmwuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3RfZXZfcm9vdF9jYV8y -XzIwMjMuY3JsMA0GCSqGSIb3DQEBDQUAA4ICAQCTy6UfmRHsmg1fLBWTxj++EI14 -QvBukEdHjqOSMo1wj/Zbjb6JzkcBahsgIIlbyIIQbODnmaprxiqgYzWRaoUlrRc4 -pZt+UPJ26oUFKidBK7GB0aL2QHWpDsvxVUjY7NHss+jOFKE17MJeNRqrphYBBo7q -3C+jisosketSjl8MmxfPy3MHGcRqwnNU73xDUmPBEcrCRbH0O1P1aa4846XerOhU -t7KR/aypH/KH5BfGSah82ApB9PI+53c0BFLd6IHyTS9URZ0V4U/M5d40VxDJI3IX -cI1QcB9WbMy5/zpaT2N6w25lBx2Eof+pDGOJbbJAiDnXH3dotfyc1dZnaVuodNv8 -ifYbMvekJKZ2t0dT741Jj6m2g1qllpBFYfXeA08mD6iL8AOWsKwV0HFaanuU5nCT -2vFp4LJiTZ6P/4mdm13NRemUAiKN4DV/6PEEeXFsVIP4M7kFMhtYVRFP0OUnR3Hs -7dpn1mKmS00PaaLJvOwiS5THaJQXfuKOKD62xur1NGyfN4gHONuGcfrNlUhDbqNP -gofXNJhuS5N5YHVpD/Aa1VP6IQzCP+k/HxiMkl14p3ZnGbuy6n/pcAlWVqOwDAst -Nl7F6cTVg8uGF5csbBNvh1qvSaYd2804BC5f4ko1Di1L+KIkBI3Y4WNeApI02phh -XBxvWHZks/wCuPWdCg== ------END CERTIFICATE----- - -# Issuer: CN=SwissSign RSA TLS Root CA 2022 - 1 O=SwissSign AG -# Subject: CN=SwissSign RSA TLS Root CA 2022 - 1 O=SwissSign AG -# Label: "SwissSign RSA TLS Root CA 2022 - 1" -# Serial: 388078645722908516278762308316089881486363258315 -# MD5 Fingerprint: 16:2e:e4:19:76:81:85:ba:8e:91:58:f1:15:ef:72:39 -# SHA1 Fingerprint: 81:34:0a:be:4c:cd:ce:cc:e7:7d:cc:8a:d4:57:e2:45:a0:77:5d:ce -# SHA256 Fingerprint: 19:31:44:f4:31:e0:fd:db:74:07:17:d4:de:92:6a:57:11:33:88:4b:43:60:d3:0e:27:29:13:cb:e6:60:ce:41 ------BEGIN CERTIFICATE----- -MIIFkzCCA3ugAwIBAgIUQ/oMX04bgBhE79G0TzUfRPSA7cswDQYJKoZIhvcNAQEL -BQAwUTELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzErMCkGA1UE -AxMiU3dpc3NTaWduIFJTQSBUTFMgUm9vdCBDQSAyMDIyIC0gMTAeFw0yMjA2MDgx -MTA4MjJaFw00NzA2MDgxMTA4MjJaMFExCzAJBgNVBAYTAkNIMRUwEwYDVQQKEwxT -d2lzc1NpZ24gQUcxKzApBgNVBAMTIlN3aXNzU2lnbiBSU0EgVExTIFJvb3QgQ0Eg -MjAyMiAtIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDLKmjiC8NX -vDVjvHClO/OMPE5Xlm7DTjak9gLKHqquuN6orx122ro10JFwB9+zBvKK8i5VUXu7 -LCTLf5ImgKO0lPaCoaTo+nUdWfMHamFk4saMla+ju45vVs9xzF6BYQ1t8qsCLqSX -5XH8irCRIFucdFJtrhUnWXjyCcplDn/L9Ovn3KlMd/YrFgSVrpxxpT8q2kFC5zyE -EPThPYxr4iuRR1VPuFa+Rd4iUU1OKNlfGUEGjw5NBuBwQCMBauTLE5tzrE0USJIt -/m2n+IdreXXhvhCxqohAWVTXz8TQm0SzOGlkjIHRI36qOTw7D59Ke4LKa2/KIj4x -0LDQKhySio/YGZxH5D4MucLNvkEM+KRHBdvBFzA4OmnczcNpI/2aDwLOEGrOyvi5 -KaM2iYauC8BPY7kGWUleDsFpswrzd34unYyzJ5jSmY0lpx+Gs6ZUcDj8fV3oT4MM -0ZPlEuRU2j7yrTrePjxF8CgPBrnh25d7mUWe3f6VWQQvdT/TromZhqwUtKiE+shd -OxtYk8EXlFXIC+OCeYSf8wCENO7cMdWP8vpPlkwGqnj73mSiI80fPsWMvDdUDrta -clXvyFu1cvh43zcgTFeRc5JzrBh3Q4IgaezprClG5QtO+DdziZaKHG29777YtvTK -wP1H8K4LWCDFyB02rpeNUIMmJCn3nTsPBQIDAQABo2MwYTAPBgNVHRMBAf8EBTAD -AQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBRvjmKLk0Ow4UD2p8P98Q+4 -DxU4pTAdBgNVHQ4EFgQUb45ii5NDsOFA9qfD/fEPuA8VOKUwDQYJKoZIhvcNAQEL -BQADggIBAKwsKUF9+lz1GpUYvyypiqkkVHX1uECry6gkUSsYP2OprphWKwVDIqO3 -10aewCoSPY6WlkDfDDOLazeROpW7OSltwAJsipQLBwJNGD77+3v1dj2b9l4wBlgz -Hqp41eZUBDqyggmNzhYzWUUo8aWjlw5DI/0LIICQ/+Mmz7hkkeUFjxOgdg3XNwwQ -iJb0Pr6VvfHDffCjw3lHC1ySFWPtUnWK50Zpy1FVCypM9fJkT6lc/2cyjlUtMoIc -gC9qkfjLvH4YoiaoLqNTKIftV+Vlek4ASltOU8liNr3CjlvrzG4ngRhZi0Rjn9UM -ZfQpZX+RLOV/fuiJz48gy20HQhFRJjKKLjpHE7iNvUcNCfAWpO2Whi4Z2L6MOuhF -LhG6rlrnub+xzI/goP+4s9GFe3lmozm1O2bYQL7Pt2eLSMkZJVX8vY3PXtpOpvJp -zv1/THfQwUY1mFwjmwJFQ5Ra3bxHrSL+ul4vkSkphnsh3m5kt8sNjzdbowhq6/Td -Ao9QAwKxuDdollDruF/UKIqlIgyKhPBZLtU30WHlQnNYKoH3dtvi4k0NX/a3vgW0 -rk4N3hY9A4GzJl5LuEsAz/+MF7psYC0nhzck5npgL7XTgwSqT0N1osGDsieYK7EO -gLrAhV5Cud+xYJHT6xh+cHiudoO+cVrQkOPKwRYlZ0rwtnu64ZzZ ------END CERTIFICATE----- diff --git a/venv/lib/python3.12/site-packages/certifi/core.py b/venv/lib/python3.12/site-packages/certifi/core.py deleted file mode 100644 index 1c9661c..0000000 --- a/venv/lib/python3.12/site-packages/certifi/core.py +++ /dev/null @@ -1,83 +0,0 @@ -""" -certifi.py -~~~~~~~~~~ - -This module returns the installation location of cacert.pem or its contents. -""" -import sys -import atexit - -def exit_cacert_ctx() -> None: - _CACERT_CTX.__exit__(None, None, None) # type: ignore[union-attr] - - -if sys.version_info >= (3, 11): - - from importlib.resources import as_file, files - - _CACERT_CTX = None - _CACERT_PATH = None - - def where() -> str: - # This is slightly terrible, but we want to delay extracting the file - # in cases where we're inside of a zipimport situation until someone - # actually calls where(), but we don't want to re-extract the file - # on every call of where(), so we'll do it once then store it in a - # global variable. - global _CACERT_CTX - global _CACERT_PATH - if _CACERT_PATH is None: - # This is slightly janky, the importlib.resources API wants you to - # manage the cleanup of this file, so it doesn't actually return a - # path, it returns a context manager that will give you the path - # when you enter it and will do any cleanup when you leave it. In - # the common case of not needing a temporary file, it will just - # return the file system location and the __exit__() is a no-op. - # - # We also have to hold onto the actual context manager, because - # it will do the cleanup whenever it gets garbage collected, so - # we will also store that at the global level as well. - _CACERT_CTX = as_file(files("certifi").joinpath("cacert.pem")) - _CACERT_PATH = str(_CACERT_CTX.__enter__()) - atexit.register(exit_cacert_ctx) - - return _CACERT_PATH - - def contents() -> str: - return files("certifi").joinpath("cacert.pem").read_text(encoding="ascii") - -else: - - from importlib.resources import path as get_path, read_text - - _CACERT_CTX = None - _CACERT_PATH = None - - def where() -> str: - # This is slightly terrible, but we want to delay extracting the - # file in cases where we're inside of a zipimport situation until - # someone actually calls where(), but we don't want to re-extract - # the file on every call of where(), so we'll do it once then store - # it in a global variable. - global _CACERT_CTX - global _CACERT_PATH - if _CACERT_PATH is None: - # This is slightly janky, the importlib.resources API wants you - # to manage the cleanup of this file, so it doesn't actually - # return a path, it returns a context manager that will give - # you the path when you enter it and will do any cleanup when - # you leave it. In the common case of not needing a temporary - # file, it will just return the file system location and the - # __exit__() is a no-op. - # - # We also have to hold onto the actual context manager, because - # it will do the cleanup whenever it gets garbage collected, so - # we will also store that at the global level as well. - _CACERT_CTX = get_path("certifi", "cacert.pem") - _CACERT_PATH = str(_CACERT_CTX.__enter__()) - atexit.register(exit_cacert_ctx) - - return _CACERT_PATH - - def contents() -> str: - return read_text("certifi", "cacert.pem", encoding="ascii") diff --git a/venv/lib/python3.12/site-packages/certifi/py.typed b/venv/lib/python3.12/site-packages/certifi/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/dotenv-0.9.9.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/dotenv-0.9.9.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.12/site-packages/dotenv-0.9.9.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/dotenv-0.9.9.dist-info/LICENSE b/venv/lib/python3.12/site-packages/dotenv-0.9.9.dist-info/LICENSE deleted file mode 100644 index 0452e84..0000000 --- a/venv/lib/python3.12/site-packages/dotenv-0.9.9.dist-info/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2018 Pedro Burón - -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.12/site-packages/dotenv-0.9.9.dist-info/METADATA b/venv/lib/python3.12/site-packages/dotenv-0.9.9.dist-info/METADATA deleted file mode 100644 index 273e7f9..0000000 --- a/venv/lib/python3.12/site-packages/dotenv-0.9.9.dist-info/METADATA +++ /dev/null @@ -1,14 +0,0 @@ -Metadata-Version: 2.1 -Name: dotenv -Version: 0.9.9 -Summary: Deprecated package -Home-page: https://github.com/pedroburon/dotenv -Author: Pedro Burón -Author-email: pedroburonv@gmail.com -License: UNKNOWN -Platform: UNKNOWN -License-File: LICENSE -Requires-Dist: python-dotenv - -UNKNOWN - diff --git a/venv/lib/python3.12/site-packages/dotenv-0.9.9.dist-info/RECORD b/venv/lib/python3.12/site-packages/dotenv-0.9.9.dist-info/RECORD deleted file mode 100644 index 5f552a9..0000000 --- a/venv/lib/python3.12/site-packages/dotenv-0.9.9.dist-info/RECORD +++ /dev/null @@ -1,7 +0,0 @@ -dotenv-0.9.9.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -dotenv-0.9.9.dist-info/LICENSE,sha256=UDN9gmLB0tw_cK1WQ5POBgI5Iu13Bt4kf9VSMrrjJ7c,1069 -dotenv-0.9.9.dist-info/METADATA,sha256=C-L93MBAM6T9nTEUOLcRWO_CuLfoo4Zd9WIpxnMu4e0,279 -dotenv-0.9.9.dist-info/RECORD,, -dotenv-0.9.9.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -dotenv-0.9.9.dist-info/WHEEL,sha256=Kh9pAotZVRFj97E15yTA4iADqXdQfIVTHcNaZTjxeGM,110 -dotenv-0.9.9.dist-info/top_level.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 diff --git a/venv/lib/python3.12/site-packages/dotenv-0.9.9.dist-info/REQUESTED b/venv/lib/python3.12/site-packages/dotenv-0.9.9.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/dotenv-0.9.9.dist-info/WHEEL b/venv/lib/python3.12/site-packages/dotenv-0.9.9.dist-info/WHEEL deleted file mode 100644 index 0c3c990..0000000 --- a/venv/lib/python3.12/site-packages/dotenv-0.9.9.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.45.1) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/venv/lib/python3.12/site-packages/dotenv-0.9.9.dist-info/top_level.txt b/venv/lib/python3.12/site-packages/dotenv-0.9.9.dist-info/top_level.txt deleted file mode 100644 index 8b13789..0000000 --- a/venv/lib/python3.12/site-packages/dotenv-0.9.9.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/venv/lib/python3.12/site-packages/dotenv/__init__.py b/venv/lib/python3.12/site-packages/dotenv/__init__.py deleted file mode 100644 index 7f4c631..0000000 --- a/venv/lib/python3.12/site-packages/dotenv/__init__.py +++ /dev/null @@ -1,49 +0,0 @@ -from typing import Any, Optional - -from .main import (dotenv_values, find_dotenv, get_key, load_dotenv, set_key, - unset_key) - - -def load_ipython_extension(ipython: Any) -> None: - from .ipython import load_ipython_extension - load_ipython_extension(ipython) - - -def get_cli_string( - path: Optional[str] = None, - action: Optional[str] = None, - key: Optional[str] = None, - value: Optional[str] = None, - quote: Optional[str] = None, -): - """Returns a string suitable for running as a shell script. - - Useful for converting a arguments passed to a fabric task - to be passed to a `local` or `run` command. - """ - command = ['dotenv'] - if quote: - command.append(f'-q {quote}') - if path: - command.append(f'-f {path}') - if action: - command.append(action) - if key: - command.append(key) - if value: - if ' ' in value: - command.append(f'"{value}"') - else: - command.append(value) - - return ' '.join(command).strip() - - -__all__ = ['get_cli_string', - 'load_dotenv', - 'dotenv_values', - 'get_key', - 'set_key', - 'unset_key', - 'find_dotenv', - 'load_ipython_extension'] diff --git a/venv/lib/python3.12/site-packages/dotenv/__main__.py b/venv/lib/python3.12/site-packages/dotenv/__main__.py deleted file mode 100644 index 3977f55..0000000 --- a/venv/lib/python3.12/site-packages/dotenv/__main__.py +++ /dev/null @@ -1,6 +0,0 @@ -"""Entry point for cli, enables execution with `python -m dotenv`""" - -from .cli import cli - -if __name__ == "__main__": - cli() diff --git a/venv/lib/python3.12/site-packages/dotenv/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/dotenv/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index fedb88a39d9ca63e9973ff9708823c1ecc35c4ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1708 zcmZ`(&u<$=6rS1N_S#O`n9!288Knu5g%Sf1qK8lkH6kaBLg~eq&1PrpY_dPx*|m$y zMha36_!Jij)lyXyacWim6E2{p!d|H&5~tn_IaJDtnYEpSDt)%UdGqGm_uhOv<KME` zG+=h`=kGQ$G5~+`$;dK8=jcb~JOmhE=l~a%p(~UH2(W-fM|7pK<jQ5)RmzI1mQ`0P zYi_EXV(SutSjI|4!s@P6PN%@=gU7H&1fpMNd2#B*OP_f9iI*99l{C)o%H>QI;M^~; zoNX$F@mIXTf)I<Jd(Bw;sutS5XF9JSk1BB%`yuffM#FUKB#8Bj?O|gOi`6O#jV;oQ zb;mbPqrotms(T|>wQJ3A!}nr^lCVy_lEu@HOk@uK9U%rxB8UYp(KduY01=G9vmqOT zCMbv{$}|QA7*8f;hp7$nEo(Gj%|8_=7oCoA7-tX&3=lf56gPaA6kRh68pUPbs=LGs zgJMV=Ql+LlAB48GMd&>C?|D2mp~VK<d(pAii-Z0b7e4y97}z11ubI}CStUVnpheLz zY|jo2W1-d@6z0`cUOdZS2fUPuJ?Xv9r!S=IM=Sthsb+>7v0_?W?^xtA%8AIae7DXt zxA-PU#{ER0Wu^pIs0z2`NTT^j-aM=1kdK8(dITN|r@BSptz0nzZ*U=9JwI;*&tw$n z&9|`5))naoSc=33pp)mbu^fqy0G1z%r@6fg=X0Yo94u{eMc%MT9%b1)tKX3IY&hO# zC;R@dUnfT~Kqd-8YI{`_)a}q*cL=KZ6w$ip@t~OyHi+Y(z@m07Tu7%8vpWH))SZNC z`Cfz2FkvH;RtM(_)yyCu7==EoP%+o3ZK2Q%wvwk=aGm^*vF7-e>8v4EdX3dyLzeHl zriT|2eyj}6*?n>TE@DtY$B=zz3L-l~wHonoEN%L>7t4GvwSqz?*j{O#!#f-%IlRjt zR)>iLh0XX*5TY0OLXKZ&%dw4t92Bu2zevGP40b^O5*WYq!{*LPPtA0-vAtX?*O}<t z>8!N3545?Ss-FhG>3q?S4z$^xnjHq)jRWmkPtSET6MLmrsk3;HneL6{yAzY0xd%(# z{M5tJgVO%$etp0CWOaY(MgGIXVeFHGeBn^f?cHeIXs<liul%Xc{Grc0*Jpp1X6Z%N zSwTxWr77l9z9*`2;Qz=}=fH1aawiLNiCZBTD`B(7UKiyjh)N7%$u(_n@OZ*cawI8F z6Y(n@i%gxQV5}O3={Sb*6eN8lA|7i?u8->uxk=w=Y<@R`T?Ty-LiiUzuO$ety#@^W zngD0_Z}kBio-7~np`QU$)7>kmd--aYIaAaB=u>d6o4(jyY|ZyY<{xJA?c1#{`!e(U m3ScYOTUYxkpJ{-t-D-W-Pw`oLI6LAQ{#{b_x$o7a%l`n}=$3&1 diff --git a/venv/lib/python3.12/site-packages/dotenv/__pycache__/__main__.cpython-312.pyc b/venv/lib/python3.12/site-packages/dotenv/__pycache__/__main__.cpython-312.pyc deleted file mode 100644 index 4f38dac2b2a31f0bccdc791a1b9adade6c3ce188..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 372 zcmXw#y-ve05XbE#s1c|e3rI*FsYGf4E9%s)JU|!MjjxT>*p3{xC1qkj;tkl?5s$*g z)=o%>fvr-vPB?0N!+q%fclXnMHk-%D+x+b@d-Cz8E)Ev#lTF(vuSlRi5?BN|R=AHb zf<T0mON4A3Aiy7cF-BEXMXjSnr>C8*NMWRQWMnK!b9qHT^I;Apfd@#ZP8v<-(q&{& zR4(&HqKGgK^lb2l{lXSrg??-mGp4xIjNP}wRf92MQpRlP6?IE<1&qC;O^vV}(ab2I zio0?~yC$6~(5|Eoau{2#lG4d^0yYt5u5-f$SUU3uX)cF!M{(P}zM-XbkQ6+f@G+Eh z2SpDU?V{Socgl!q4jo&6u%<09yjzDD<0b0;qSNp2<Yn;{o-L!sb8j7@=-kF$@ejlj BYux|< diff --git a/venv/lib/python3.12/site-packages/dotenv/__pycache__/cli.cpython-312.pyc b/venv/lib/python3.12/site-packages/dotenv/__pycache__/cli.cpython-312.pyc deleted file mode 100644 index 07e11ae4392137697312091bcebe34ef7da6bc05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10104 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 HH01vcLD0tV diff --git a/venv/lib/python3.12/site-packages/dotenv/__pycache__/ipython.cpython-312.pyc b/venv/lib/python3.12/site-packages/dotenv/__pycache__/ipython.cpython-312.pyc deleted file mode 100644 index a0953d28fda86d6912aa581d385ce9ce1419b051..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1981 zcmah~J!}+56rS0?`?rlbY%oZy6ijqDcP9dhB0)e%kO(0Rf;3#StarzEi}&X;Gd^<% zNE9wyq@Z&mMTv_PAR{FuWvEi534#Q(LJCqUIy+~H$W`9V-r9r|8J*tDeDn6roA3SH zFQrl*!C3hAR%={G=ufdphcQ_6XJE06T;yUO1-O9&rJ)3BL&XA9d@ax$dSEn+Ak)YI zrn;J+4RVcKkZ<HMBC3KuL$1DvT!Y|MHL<!nFy1J*nMKqncC(e-Yk^hN*tlpnJ%`14 z-wTNqh)rCS6SExOW(;()Hf_!aB;@h1Jh9R}i-+4bWkdjsQ!i}3#=@);7iPWCwcLo4 zuoD;j$WAxTz!y15K48`V62vkhsDWM7P!xDa>NBi07rTmh=|g>0OFoyV;bs8MzJuo6 zJki~PTYOkr1(wAihC8%~Qj7mLH!|Jf%1B%~f4R$BQFu1u=fX};sYbngwHkE@rJhUT zJmV217N_&1_x}0N^&FcMlSgK%VUn93<3Neov8iXz_=Ev3hV5`K3S+HB{5BZv^m5fI z*qn(N=}m6inVk=%p6S@W&xF|-Vh+^eLPD$6ws~s{pYCZjAh~zqDzT~4GQALf4kb2& zyZx@&@|rC|&DqFz31u)-ledU@{VgNcD_X3FB8IWXyKNF@Trz9V`<#vddyXPWOoU)m zWL5tqh-Jh@xaGKwZoI9RqIh+H-cfEVHwMug9LnjAnnOI3BDYnD^>*IgQF&?S1il|i zcRMqn!pV2WLp9BPjJoJO#IvcwAw-8T;)QhYDyxGxU~~<17tl@h8d|^=ZTj=x9>)&D zh?^prO~Ep(d;($2q_N1R;jZMUxFa?aUg<8_P?6tp=KQ5|ltwhx+fX5#imU0k5PLxY z^%^7oY^;d_j5QGj`7sk@nJ~6Uy%hzd9@w09>SrTImLjWj;*%z|gDPa1Ge>CEjTS;t zX@u50;A`FYX6kL3!^dhzKddv4lWN;`=Ikb6^~BA(mnhWQUAhnM>y`hN^|eGxc+3ch zyJ&L)jU4=ne|PKaTlddC9X`6Gy&9W%K6d!Y*x{wZx}xQFznqv{nfvkhqw>><Q%e^% zizrvVcj12dhXW4|{G|O{dR+QFJN@@&0ga6Rg%nUP?)r7K@~n8|MR9ap2Vjc{>b@_X zDWk{b@|h|1@evGix{{5vmKE9ov8*_6SwZB^`(j<RtS{zmKRKZym8j^Zu?iiD3KHeZ z9-uxf5j`k`$SNsB$XEno5p5XA*z;5$d!d)svc)BT<>XrFqfK2kjEyWZh6FaZ^1)i^ z_zt!dtQ@<4_0i$A-Iq62Y+S*w^x+MqpkKm$6&WLaU10qjm`DVG;~RU$Ih{;BaJDN5 z5K&pOx@xdkMo?34p8_TZ->$Qr%<bZe(%XN9G@<1{v5NwqOk!usj$NCEq#dS%^Q6r) z$v_3inL!dTahWL@ipONj9voQYCiHOzeT!B=MflD{(cML_w8C?3{}XNhHy3}?j>uO{ zS4#2dAd6}a^vIg@fQok|;SfC}KJZ_aoxc?sz$BEisI<WLLRn2o^~m@MSLh)jB$*<x zTiKIITAZR)*oybCPe81z7~?<C=_ly)8wKMN8wkW31L3K411UqB%07Gv-}|(W#0;@h OhSnw2|5(9O()>R^z3ICE diff --git a/venv/lib/python3.12/site-packages/dotenv/__pycache__/main.cpython-312.pyc b/venv/lib/python3.12/site-packages/dotenv/__pycache__/main.cpython-312.pyc deleted file mode 100644 index e399d04513e8d0cc6af1a192b5765b3a2ba1041f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16990 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 diff --git a/venv/lib/python3.12/site-packages/dotenv/__pycache__/parser.cpython-312.pyc b/venv/lib/python3.12/site-packages/dotenv/__pycache__/parser.cpython-312.pyc deleted file mode 100644 index 05091e02ab1a5b961e680c50c38608174ab46421..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10014 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 SU8_G>yPn-Qw2gThx%>|i?r4+% diff --git a/venv/lib/python3.12/site-packages/dotenv/__pycache__/variables.cpython-312.pyc b/venv/lib/python3.12/site-packages/dotenv/__pycache__/variables.cpython-312.pyc deleted file mode 100644 index 7647bb75c9ac4fa7623147120d58b407af27b256..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5045 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 diff --git a/venv/lib/python3.12/site-packages/dotenv/__pycache__/version.cpython-312.pyc b/venv/lib/python3.12/site-packages/dotenv/__pycache__/version.cpython-312.pyc deleted file mode 100644 index 3e0297a9ddb846b697f30c938f8ee37eaf276aee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224 zcmX@j%ge<81m*LpGsJ-OV-N=h7@>^M96-i&h7^V<hDt_FrYcrLJs|YcWW2>4A77SQ zRGgWg7azZp;WJ46uT=ev{M=Oi+{BXNGJTi)<kH;Kypm%5lGL2k^rFOE-QtqW<m}WU z-IV<Dyqx^Rl++^qvedjX{hZ7s{esGpjQl)fJwqe?;>?m%-GapA?8NlcV*Ql-5|A3G qWqJjbzc_4i^HWN5QtgV^fVP61S`6~Z2WCb_#v6R1jod{nKrR5(-9KLd diff --git a/venv/lib/python3.12/site-packages/dotenv/cli.py b/venv/lib/python3.12/site-packages/dotenv/cli.py deleted file mode 100644 index 075a7af..0000000 --- a/venv/lib/python3.12/site-packages/dotenv/cli.py +++ /dev/null @@ -1,205 +0,0 @@ -import json -import os -import shlex -import sys -from contextlib import contextmanager -from typing import Any, Dict, IO, Iterator, List, Optional - -if sys.platform == 'win32': - from subprocess import Popen - -try: - import click -except ImportError: - sys.stderr.write('It seems python-dotenv is not installed with cli option. \n' - 'Run pip install "python-dotenv[cli]" to fix this.') - sys.exit(1) - -from .main import dotenv_values, set_key, unset_key -from .version import __version__ - - -def enumerate_env() -> Optional[str]: - """ - Return a path for the ${pwd}/.env file. - - If pwd does not exist, return None. - """ - try: - cwd = os.getcwd() - except FileNotFoundError: - return None - path = os.path.join(cwd, '.env') - return path - - -@click.group() -@click.option('-f', '--file', default=enumerate_env(), - type=click.Path(file_okay=True), - help="Location of the .env file, defaults to .env file in current working directory.") -@click.option('-q', '--quote', default='always', - type=click.Choice(['always', 'never', 'auto']), - help="Whether to quote or not the variable values. Default mode is always. This does not affect parsing.") -@click.option('-e', '--export', default=False, - type=click.BOOL, - help="Whether to write the dot file as an executable bash script.") -@click.version_option(version=__version__) -@click.pass_context -def cli(ctx: click.Context, file: Any, quote: Any, export: Any) -> None: - """This script is used to set, get or unset values from a .env file.""" - ctx.obj = {'QUOTE': quote, 'EXPORT': export, 'FILE': file} - - -@contextmanager -def stream_file(path: os.PathLike) -> Iterator[IO[str]]: - """ - Open a file and yield the corresponding (decoded) stream. - - Exits with error code 2 if the file cannot be opened. - """ - - try: - with open(path) as stream: - yield stream - except OSError as exc: - print(f"Error opening env file: {exc}", file=sys.stderr) - exit(2) - - -@cli.command() -@click.pass_context -@click.option('--format', default='simple', - type=click.Choice(['simple', 'json', 'shell', 'export']), - help="The format in which to display the list. Default format is simple, " - "which displays name=value without quotes.") -def list(ctx: click.Context, format: bool) -> None: - """Display all the stored key/value.""" - file = ctx.obj['FILE'] - - with stream_file(file) as stream: - values = dotenv_values(stream=stream) - - if format == 'json': - click.echo(json.dumps(values, indent=2, sort_keys=True)) - else: - prefix = 'export ' if format == 'export' else '' - for k in sorted(values): - v = values[k] - if v is not None: - if format in ('export', 'shell'): - v = shlex.quote(v) - click.echo(f'{prefix}{k}={v}') - - -@cli.command() -@click.pass_context -@click.argument('key', required=True) -@click.argument('value', required=True) -def set(ctx: click.Context, key: Any, value: Any) -> None: - """Store the given key/value.""" - file = ctx.obj['FILE'] - quote = ctx.obj['QUOTE'] - export = ctx.obj['EXPORT'] - success, key, value = set_key(file, key, value, quote, export) - if success: - click.echo(f'{key}={value}') - else: - exit(1) - - -@cli.command() -@click.pass_context -@click.argument('key', required=True) -def get(ctx: click.Context, key: Any) -> None: - """Retrieve the value for the given key.""" - file = ctx.obj['FILE'] - - with stream_file(file) as stream: - values = dotenv_values(stream=stream) - - stored_value = values.get(key) - if stored_value: - click.echo(stored_value) - else: - exit(1) - - -@cli.command() -@click.pass_context -@click.argument('key', required=True) -def unset(ctx: click.Context, key: Any) -> None: - """Removes the given key.""" - file = ctx.obj['FILE'] - quote = ctx.obj['QUOTE'] - success, key = unset_key(file, key, quote) - if success: - click.echo(f"Successfully removed {key}") - else: - exit(1) - - -@cli.command(context_settings={'ignore_unknown_options': True}) -@click.pass_context -@click.option( - "--override/--no-override", - default=True, - help="Override variables from the environment file with those from the .env file.", -) -@click.argument('commandline', nargs=-1, type=click.UNPROCESSED) -def run(ctx: click.Context, override: bool, commandline: List[str]) -> None: - """Run command with environment variables present.""" - file = ctx.obj['FILE'] - if not os.path.isfile(file): - raise click.BadParameter( - f'Invalid value for \'-f\' "{file}" does not exist.', - ctx=ctx - ) - dotenv_as_dict = { - k: v - for (k, v) in dotenv_values(file).items() - if v is not None and (override or k not in os.environ) - } - - if not commandline: - click.echo('No command given.') - exit(1) - run_command(commandline, dotenv_as_dict) - - -def run_command(command: List[str], env: Dict[str, str]) -> None: - """Replace the current process with the specified command. - - Replaces the current process with the specified command and the variables from `env` - added in the current environment variables. - - Parameters - ---------- - command: List[str] - The command and it's parameters - env: Dict - The additional environment variables - - Returns - ------- - None - This function does not return any value. It replaces the current process with the new one. - - """ - # copy the current environment variables and add the vales from - # `env` - cmd_env = os.environ.copy() - cmd_env.update(env) - - if sys.platform == 'win32': - # execvpe on Windows returns control immediately - # rather than once the command has finished. - p = Popen(command, - universal_newlines=True, - bufsize=0, - shell=False, - env=cmd_env) - _, _ = p.communicate() - - exit(p.returncode) - else: - os.execvpe(command[0], args=command, env=cmd_env) diff --git a/venv/lib/python3.12/site-packages/dotenv/ipython.py b/venv/lib/python3.12/site-packages/dotenv/ipython.py deleted file mode 100644 index 7df727c..0000000 --- a/venv/lib/python3.12/site-packages/dotenv/ipython.py +++ /dev/null @@ -1,39 +0,0 @@ -from IPython.core.magic import Magics, line_magic, magics_class # type: ignore -from IPython.core.magic_arguments import (argument, magic_arguments, # type: ignore - parse_argstring) # type: ignore - -from .main import find_dotenv, load_dotenv - - -@magics_class -class IPythonDotEnv(Magics): - - @magic_arguments() - @argument( - '-o', '--override', action='store_true', - help="Indicate to override existing variables" - ) - @argument( - '-v', '--verbose', action='store_true', - help="Indicate function calls to be verbose" - ) - @argument('dotenv_path', nargs='?', type=str, default='.env', - help='Search in increasingly higher folders for the `dotenv_path`') - @line_magic - def dotenv(self, line): - args = parse_argstring(self.dotenv, line) - # Locate the .env file - dotenv_path = args.dotenv_path - try: - dotenv_path = find_dotenv(dotenv_path, True, True) - except IOError: - print("cannot find .env file") - return - - # Load the .env file - load_dotenv(dotenv_path, verbose=args.verbose, override=args.override) - - -def load_ipython_extension(ipython): - """Register the %dotenv magic.""" - ipython.register_magics(IPythonDotEnv) diff --git a/venv/lib/python3.12/site-packages/dotenv/main.py b/venv/lib/python3.12/site-packages/dotenv/main.py deleted file mode 100644 index 8e6a7cf..0000000 --- a/venv/lib/python3.12/site-packages/dotenv/main.py +++ /dev/null @@ -1,400 +0,0 @@ -import io -import logging -import os -import pathlib -import shutil -import sys -import tempfile -from collections import OrderedDict -from contextlib import contextmanager -from typing import IO, Dict, Iterable, Iterator, Mapping, Optional, Tuple, Union - -from .parser import Binding, parse_stream -from .variables import parse_variables - -# A type alias for a string path to be used for the paths in this file. -# These paths may flow to `open()` and `shutil.move()`; `shutil.move()` -# only accepts string paths, not byte paths or file descriptors. See -# https://github.com/python/typeshed/pull/6832. -StrPath = Union[str, "os.PathLike[str]"] - -logger = logging.getLogger(__name__) - - -def with_warn_for_invalid_lines(mappings: Iterator[Binding]) -> Iterator[Binding]: - for mapping in mappings: - if mapping.error: - logger.warning( - "python-dotenv could not parse statement starting at line %s", - mapping.original.line, - ) - yield mapping - - -class DotEnv: - def __init__( - self, - dotenv_path: Optional[StrPath], - stream: Optional[IO[str]] = None, - verbose: bool = False, - encoding: Optional[str] = None, - interpolate: bool = True, - override: bool = True, - ) -> None: - self.dotenv_path: Optional[StrPath] = dotenv_path - self.stream: Optional[IO[str]] = stream - self._dict: Optional[Dict[str, Optional[str]]] = None - self.verbose: bool = verbose - self.encoding: Optional[str] = encoding - self.interpolate: bool = interpolate - self.override: bool = override - - @contextmanager - def _get_stream(self) -> Iterator[IO[str]]: - if self.dotenv_path and os.path.isfile(self.dotenv_path): - with open(self.dotenv_path, encoding=self.encoding) as stream: - yield stream - elif self.stream is not None: - yield self.stream - else: - if self.verbose: - logger.info( - "python-dotenv could not find configuration file %s.", - self.dotenv_path or ".env", - ) - yield io.StringIO("") - - def dict(self) -> Dict[str, Optional[str]]: - """Return dotenv as dict""" - if self._dict: - return self._dict - - raw_values = self.parse() - - if self.interpolate: - self._dict = OrderedDict( - resolve_variables(raw_values, override=self.override) - ) - else: - self._dict = OrderedDict(raw_values) - - return self._dict - - def parse(self) -> Iterator[Tuple[str, Optional[str]]]: - with self._get_stream() as stream: - for mapping in with_warn_for_invalid_lines(parse_stream(stream)): - if mapping.key is not None: - yield mapping.key, mapping.value - - def set_as_environment_variables(self) -> bool: - """ - Load the current dotenv as system environment variable. - """ - if not self.dict(): - return False - - for k, v in self.dict().items(): - if k in os.environ and not self.override: - continue - if v is not None: - os.environ[k] = v - - return True - - def get(self, key: str) -> Optional[str]: - """ """ - data = self.dict() - - if key in data: - return data[key] - - if self.verbose: - logger.warning("Key %s not found in %s.", key, self.dotenv_path) - - return None - - -def get_key( - dotenv_path: StrPath, - key_to_get: str, - encoding: Optional[str] = "utf-8", -) -> Optional[str]: - """ - Get the value of a given key from the given .env. - - Returns `None` if the key isn't found or doesn't have a value. - """ - return DotEnv(dotenv_path, verbose=True, encoding=encoding).get(key_to_get) - - -@contextmanager -def rewrite( - path: StrPath, - encoding: Optional[str], -) -> Iterator[Tuple[IO[str], IO[str]]]: - pathlib.Path(path).touch() - - with tempfile.NamedTemporaryFile(mode="w", encoding=encoding, delete=False) as dest: - error = None - try: - with open(path, encoding=encoding) as source: - yield (source, dest) - except BaseException as err: - error = err - - if error is None: - shutil.move(dest.name, path) - else: - os.unlink(dest.name) - raise error from None - - -def set_key( - dotenv_path: StrPath, - key_to_set: str, - value_to_set: str, - quote_mode: str = "always", - export: bool = False, - encoding: Optional[str] = "utf-8", -) -> Tuple[Optional[bool], str, str]: - """ - Adds or Updates a key/value to the given .env - - If the .env path given doesn't exist, fails instead of risking creating - an orphan .env somewhere in the filesystem - """ - if quote_mode not in ("always", "auto", "never"): - raise ValueError(f"Unknown quote_mode: {quote_mode}") - - quote = quote_mode == "always" or ( - quote_mode == "auto" and not value_to_set.isalnum() - ) - - if quote: - value_out = "'{}'".format(value_to_set.replace("'", "\\'")) - else: - value_out = value_to_set - if export: - line_out = f"export {key_to_set}={value_out}\n" - else: - line_out = f"{key_to_set}={value_out}\n" - - with rewrite(dotenv_path, encoding=encoding) as (source, dest): - replaced = False - missing_newline = False - for mapping in with_warn_for_invalid_lines(parse_stream(source)): - if mapping.key == key_to_set: - dest.write(line_out) - replaced = True - else: - dest.write(mapping.original.string) - missing_newline = not mapping.original.string.endswith("\n") - if not replaced: - if missing_newline: - dest.write("\n") - dest.write(line_out) - - return True, key_to_set, value_to_set - - -def unset_key( - dotenv_path: StrPath, - key_to_unset: str, - quote_mode: str = "always", - encoding: Optional[str] = "utf-8", -) -> Tuple[Optional[bool], str]: - """ - Removes a given key from the given `.env` file. - - If the .env path given doesn't exist, fails. - If the given key doesn't exist in the .env, fails. - """ - if not os.path.exists(dotenv_path): - logger.warning("Can't delete from %s - it doesn't exist.", dotenv_path) - return None, key_to_unset - - removed = False - with rewrite(dotenv_path, encoding=encoding) as (source, dest): - for mapping in with_warn_for_invalid_lines(parse_stream(source)): - if mapping.key == key_to_unset: - removed = True - else: - dest.write(mapping.original.string) - - if not removed: - logger.warning( - "Key %s not removed from %s - key doesn't exist.", key_to_unset, dotenv_path - ) - return None, key_to_unset - - return removed, key_to_unset - - -def resolve_variables( - values: Iterable[Tuple[str, Optional[str]]], - override: bool, -) -> Mapping[str, Optional[str]]: - new_values: Dict[str, Optional[str]] = {} - - for name, value in values: - if value is None: - result = None - else: - atoms = parse_variables(value) - env: Dict[str, Optional[str]] = {} - if override: - env.update(os.environ) # type: ignore - env.update(new_values) - else: - env.update(new_values) - env.update(os.environ) # type: ignore - result = "".join(atom.resolve(env) for atom in atoms) - - new_values[name] = result - - return new_values - - -def _walk_to_root(path: str) -> Iterator[str]: - """ - Yield directories starting from the given directory up to the root - """ - if not os.path.exists(path): - raise IOError("Starting path not found") - - if os.path.isfile(path): - path = os.path.dirname(path) - - last_dir = None - current_dir = os.path.abspath(path) - while last_dir != current_dir: - yield current_dir - parent_dir = os.path.abspath(os.path.join(current_dir, os.path.pardir)) - last_dir, current_dir = current_dir, parent_dir - - -def find_dotenv( - filename: str = ".env", - raise_error_if_not_found: bool = False, - usecwd: bool = False, -) -> str: - """ - Search in increasingly higher folders for the given file - - Returns path to the file if found, or an empty string otherwise - """ - - def _is_interactive(): - """Decide whether this is running in a REPL or IPython notebook""" - if hasattr(sys, "ps1") or hasattr(sys, "ps2"): - return True - try: - main = __import__("__main__", None, None, fromlist=["__file__"]) - except ModuleNotFoundError: - return False - return not hasattr(main, "__file__") - - def _is_debugger(): - return sys.gettrace() is not None - - if usecwd or _is_interactive() or _is_debugger() or getattr(sys, "frozen", False): - # Should work without __file__, e.g. in REPL or IPython notebook. - path = os.getcwd() - else: - # will work for .py files - frame = sys._getframe() - current_file = __file__ - - while frame.f_code.co_filename == current_file or not os.path.exists( - frame.f_code.co_filename - ): - assert frame.f_back is not None - frame = frame.f_back - frame_filename = frame.f_code.co_filename - path = os.path.dirname(os.path.abspath(frame_filename)) - - for dirname in _walk_to_root(path): - check_path = os.path.join(dirname, filename) - if os.path.isfile(check_path): - return check_path - - if raise_error_if_not_found: - raise IOError("File not found") - - return "" - - -def load_dotenv( - dotenv_path: Optional[StrPath] = None, - stream: Optional[IO[str]] = None, - verbose: bool = False, - override: bool = False, - interpolate: bool = True, - encoding: Optional[str] = "utf-8", -) -> bool: - """Parse a .env file and then load all the variables found as environment variables. - - Parameters: - dotenv_path: Absolute or relative path to .env file. - stream: Text stream (such as `io.StringIO`) with .env content, used if - `dotenv_path` is `None`. - verbose: Whether to output a warning the .env file is missing. - override: Whether to override the system environment variables with the variables - from the `.env` file. - encoding: Encoding to be used to read the file. - Returns: - Bool: True if at least one environment variable is set else False - - If both `dotenv_path` and `stream` are `None`, `find_dotenv()` is used to find the - .env file with it's default parameters. If you need to change the default parameters - of `find_dotenv()`, you can explicitly call `find_dotenv()` and pass the result - to this function as `dotenv_path`. - """ - if dotenv_path is None and stream is None: - dotenv_path = find_dotenv() - - dotenv = DotEnv( - dotenv_path=dotenv_path, - stream=stream, - verbose=verbose, - interpolate=interpolate, - override=override, - encoding=encoding, - ) - return dotenv.set_as_environment_variables() - - -def dotenv_values( - dotenv_path: Optional[StrPath] = None, - stream: Optional[IO[str]] = None, - verbose: bool = False, - interpolate: bool = True, - encoding: Optional[str] = "utf-8", -) -> Dict[str, Optional[str]]: - """ - Parse a .env file and return its content as a dict. - - The returned dict will have `None` values for keys without values in the .env file. - For example, `foo=bar` results in `{"foo": "bar"}` whereas `foo` alone results in - `{"foo": None}` - - Parameters: - dotenv_path: Absolute or relative path to the .env file. - stream: `StringIO` object with .env content, used if `dotenv_path` is `None`. - verbose: Whether to output a warning if the .env file is missing. - encoding: Encoding to be used to read the file. - - If both `dotenv_path` and `stream` are `None`, `find_dotenv()` is used to find the - .env file. - """ - if dotenv_path is None and stream is None: - dotenv_path = find_dotenv() - - return DotEnv( - dotenv_path=dotenv_path, - stream=stream, - verbose=verbose, - interpolate=interpolate, - override=True, - encoding=encoding, - ).dict() diff --git a/venv/lib/python3.12/site-packages/dotenv/parser.py b/venv/lib/python3.12/site-packages/dotenv/parser.py deleted file mode 100644 index 735f14a..0000000 --- a/venv/lib/python3.12/site-packages/dotenv/parser.py +++ /dev/null @@ -1,175 +0,0 @@ -import codecs -import re -from typing import (IO, Iterator, Match, NamedTuple, Optional, # noqa:F401 - Pattern, Sequence, Tuple) - - -def make_regex(string: str, extra_flags: int = 0) -> Pattern[str]: - return re.compile(string, re.UNICODE | extra_flags) - - -_newline = make_regex(r"(\r\n|\n|\r)") -_multiline_whitespace = make_regex(r"\s*", extra_flags=re.MULTILINE) -_whitespace = make_regex(r"[^\S\r\n]*") -_export = make_regex(r"(?:export[^\S\r\n]+)?") -_single_quoted_key = make_regex(r"'([^']+)'") -_unquoted_key = make_regex(r"([^=\#\s]+)") -_equal_sign = make_regex(r"(=[^\S\r\n]*)") -_single_quoted_value = make_regex(r"'((?:\\'|[^'])*)'") -_double_quoted_value = make_regex(r'"((?:\\"|[^"])*)"') -_unquoted_value = make_regex(r"([^\r\n]*)") -_comment = make_regex(r"(?:[^\S\r\n]*#[^\r\n]*)?") -_end_of_line = make_regex(r"[^\S\r\n]*(?:\r\n|\n|\r|$)") -_rest_of_line = make_regex(r"[^\r\n]*(?:\r|\n|\r\n)?") -_double_quote_escapes = make_regex(r"\\[\\'\"abfnrtv]") -_single_quote_escapes = make_regex(r"\\[\\']") - - -class Original(NamedTuple): - string: str - line: int - - -class Binding(NamedTuple): - key: Optional[str] - value: Optional[str] - original: Original - error: bool - - -class Position: - def __init__(self, chars: int, line: int) -> None: - self.chars = chars - self.line = line - - @classmethod - def start(cls) -> "Position": - return cls(chars=0, line=1) - - def set(self, other: "Position") -> None: - self.chars = other.chars - self.line = other.line - - def advance(self, string: str) -> None: - self.chars += len(string) - self.line += len(re.findall(_newline, string)) - - -class Error(Exception): - pass - - -class Reader: - def __init__(self, stream: IO[str]) -> None: - self.string = stream.read() - self.position = Position.start() - self.mark = Position.start() - - def has_next(self) -> bool: - return self.position.chars < len(self.string) - - def set_mark(self) -> None: - self.mark.set(self.position) - - def get_marked(self) -> Original: - return Original( - string=self.string[self.mark.chars:self.position.chars], - line=self.mark.line, - ) - - def peek(self, count: int) -> str: - return self.string[self.position.chars:self.position.chars + count] - - def read(self, count: int) -> str: - result = self.string[self.position.chars:self.position.chars + count] - if len(result) < count: - raise Error("read: End of string") - self.position.advance(result) - return result - - def read_regex(self, regex: Pattern[str]) -> Sequence[str]: - match = regex.match(self.string, self.position.chars) - if match is None: - raise Error("read_regex: Pattern not found") - self.position.advance(self.string[match.start():match.end()]) - return match.groups() - - -def decode_escapes(regex: Pattern[str], string: str) -> str: - def decode_match(match: Match[str]) -> str: - return codecs.decode(match.group(0), 'unicode-escape') # type: ignore - - return regex.sub(decode_match, string) - - -def parse_key(reader: Reader) -> Optional[str]: - char = reader.peek(1) - if char == "#": - return None - elif char == "'": - (key,) = reader.read_regex(_single_quoted_key) - else: - (key,) = reader.read_regex(_unquoted_key) - return key - - -def parse_unquoted_value(reader: Reader) -> str: - (part,) = reader.read_regex(_unquoted_value) - return re.sub(r"\s+#.*", "", part).rstrip() - - -def parse_value(reader: Reader) -> str: - char = reader.peek(1) - if char == u"'": - (value,) = reader.read_regex(_single_quoted_value) - return decode_escapes(_single_quote_escapes, value) - elif char == u'"': - (value,) = reader.read_regex(_double_quoted_value) - return decode_escapes(_double_quote_escapes, value) - elif char in (u"", u"\n", u"\r"): - return u"" - else: - return parse_unquoted_value(reader) - - -def parse_binding(reader: Reader) -> Binding: - reader.set_mark() - try: - reader.read_regex(_multiline_whitespace) - if not reader.has_next(): - return Binding( - key=None, - value=None, - original=reader.get_marked(), - error=False, - ) - reader.read_regex(_export) - key = parse_key(reader) - reader.read_regex(_whitespace) - if reader.peek(1) == "=": - reader.read_regex(_equal_sign) - value: Optional[str] = parse_value(reader) - else: - value = None - reader.read_regex(_comment) - reader.read_regex(_end_of_line) - return Binding( - key=key, - value=value, - original=reader.get_marked(), - error=False, - ) - except Error: - reader.read_regex(_rest_of_line) - return Binding( - key=None, - value=None, - original=reader.get_marked(), - error=True, - ) - - -def parse_stream(stream: IO[str]) -> Iterator[Binding]: - reader = Reader(stream) - while reader.has_next(): - yield parse_binding(reader) diff --git a/venv/lib/python3.12/site-packages/dotenv/py.typed b/venv/lib/python3.12/site-packages/dotenv/py.typed deleted file mode 100644 index 7632ecf..0000000 --- a/venv/lib/python3.12/site-packages/dotenv/py.typed +++ /dev/null @@ -1 +0,0 @@ -# Marker file for PEP 561 diff --git a/venv/lib/python3.12/site-packages/dotenv/variables.py b/venv/lib/python3.12/site-packages/dotenv/variables.py deleted file mode 100644 index 667f2f2..0000000 --- a/venv/lib/python3.12/site-packages/dotenv/variables.py +++ /dev/null @@ -1,86 +0,0 @@ -import re -from abc import ABCMeta, abstractmethod -from typing import Iterator, Mapping, Optional, Pattern - -_posix_variable: Pattern[str] = re.compile( - r""" - \$\{ - (?P<name>[^\}:]*) - (?::- - (?P<default>[^\}]*) - )? - \} - """, - re.VERBOSE, -) - - -class Atom(metaclass=ABCMeta): - def __ne__(self, other: object) -> bool: - result = self.__eq__(other) - if result is NotImplemented: - return NotImplemented - return not result - - @abstractmethod - def resolve(self, env: Mapping[str, Optional[str]]) -> str: ... - - -class Literal(Atom): - def __init__(self, value: str) -> None: - self.value = value - - def __repr__(self) -> str: - return f"Literal(value={self.value})" - - def __eq__(self, other: object) -> bool: - if not isinstance(other, self.__class__): - return NotImplemented - return self.value == other.value - - def __hash__(self) -> int: - return hash((self.__class__, self.value)) - - def resolve(self, env: Mapping[str, Optional[str]]) -> str: - return self.value - - -class Variable(Atom): - def __init__(self, name: str, default: Optional[str]) -> None: - self.name = name - self.default = default - - def __repr__(self) -> str: - return f"Variable(name={self.name}, default={self.default})" - - def __eq__(self, other: object) -> bool: - if not isinstance(other, self.__class__): - return NotImplemented - return (self.name, self.default) == (other.name, other.default) - - def __hash__(self) -> int: - return hash((self.__class__, self.name, self.default)) - - def resolve(self, env: Mapping[str, Optional[str]]) -> str: - default = self.default if self.default is not None else "" - result = env.get(self.name, default) - return result if result is not None else "" - - -def parse_variables(value: str) -> Iterator[Atom]: - cursor = 0 - - for match in _posix_variable.finditer(value): - (start, end) = match.span() - name = match["name"] - default = match["default"] - - if start > cursor: - yield Literal(value=value[cursor:start]) - - yield Variable(name=name, default=default) - cursor = end - - length = len(value) - if cursor < length: - yield Literal(value=value[cursor:length]) diff --git a/venv/lib/python3.12/site-packages/dotenv/version.py b/venv/lib/python3.12/site-packages/dotenv/version.py deleted file mode 100644 index a82b376..0000000 --- a/venv/lib/python3.12/site-packages/dotenv/version.py +++ /dev/null @@ -1 +0,0 @@ -__version__ = "1.1.1" diff --git a/venv/lib/python3.12/site-packages/frozenlist-1.7.0.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/frozenlist-1.7.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.12/site-packages/frozenlist-1.7.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/frozenlist-1.7.0.dist-info/METADATA b/venv/lib/python3.12/site-packages/frozenlist-1.7.0.dist-info/METADATA deleted file mode 100644 index 2618ac4..0000000 --- a/venv/lib/python3.12/site-packages/frozenlist-1.7.0.dist-info/METADATA +++ /dev/null @@ -1,626 +0,0 @@ -Metadata-Version: 2.4 -Name: frozenlist -Version: 1.7.0 -Summary: A list-like structure which implements collections.abc.MutableSequence -Home-page: https://github.com/aio-libs/frozenlist -Maintainer: aiohttp team <team@aiohttp.org> -Maintainer-email: team@aiohttp.org -License: Apache-2.0 -Project-URL: Chat: Matrix, https://matrix.to/#/#aio-libs:matrix.org -Project-URL: Chat: Matrix Space, https://matrix.to/#/#aio-libs-space:matrix.org -Project-URL: CI: Github Actions, https://github.com/aio-libs/frozenlist/actions -Project-URL: Code of Conduct, https://github.com/aio-libs/.github/blob/master/CODE_OF_CONDUCT.md -Project-URL: Coverage: codecov, https://codecov.io/github/aio-libs/frozenlist -Project-URL: Docs: Changelog, https://github.com/aio-libs/frozenlist/blob/master/CHANGES.rst#changelog -Project-URL: Docs: RTD, https://frozenlist.aio-libs.org -Project-URL: GitHub: issues, https://github.com/aio-libs/frozenlist/issues -Project-URL: GitHub: repo, https://github.com/aio-libs/frozenlist -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Operating System :: POSIX -Classifier: Operating System :: MacOS :: MacOS X -Classifier: Operating System :: Microsoft :: Windows -Classifier: Programming Language :: Cython -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -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 :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Requires-Python: >=3.9 -Description-Content-Type: text/x-rst -License-File: LICENSE -Dynamic: license-file - -frozenlist -========== - -.. image:: https://github.com/aio-libs/frozenlist/workflows/CI/badge.svg - :target: https://github.com/aio-libs/frozenlist/actions - :alt: GitHub status for master branch - -.. image:: https://codecov.io/gh/aio-libs/frozenlist/branch/master/graph/badge.svg?flag=pytest - :target: https://codecov.io/gh/aio-libs/frozenlist?flags[]=pytest - :alt: codecov.io status for master branch - -.. image:: https://img.shields.io/pypi/v/frozenlist.svg?logo=Python&logoColor=white - :target: https://pypi.org/project/frozenlist - :alt: frozenlist @ PyPI - -.. image:: https://readthedocs.org/projects/frozenlist/badge/?version=latest - :target: https://frozenlist.aio-libs.org - :alt: Read The Docs build status badge - -.. image:: https://img.shields.io/matrix/aio-libs:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat - :target: https://matrix.to/#/%23aio-libs:matrix.org - :alt: Matrix Room — #aio-libs:matrix.org - -.. image:: https://img.shields.io/matrix/aio-libs-space:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs-space%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat - :target: https://matrix.to/#/%23aio-libs-space:matrix.org - :alt: Matrix Space — #aio-libs-space:matrix.org - -Introduction ------------- - -``frozenlist.FrozenList`` is a list-like structure which implements -``collections.abc.MutableSequence``. The list is *mutable* until ``FrozenList.freeze`` -is called, after which list modifications raise ``RuntimeError``: - - ->>> from frozenlist import FrozenList ->>> fl = FrozenList([17, 42]) ->>> fl.append('spam') ->>> fl.append('Vikings') ->>> fl -<FrozenList(frozen=False, [17, 42, 'spam', 'Vikings'])> ->>> fl.freeze() ->>> fl -<FrozenList(frozen=True, [17, 42, 'spam', 'Vikings'])> ->>> fl.frozen -True ->>> fl.append("Monty") -Traceback (most recent call last): - File "<stdin>", line 1, in <module> - File "frozenlist/_frozenlist.pyx", line 97, in frozenlist._frozenlist.FrozenList.append - self._check_frozen() - File "frozenlist/_frozenlist.pyx", line 19, in frozenlist._frozenlist.FrozenList._check_frozen - raise RuntimeError("Cannot modify frozen list.") -RuntimeError: Cannot modify frozen list. - - -FrozenList is also hashable, but only when frozen. Otherwise it also throws a RuntimeError: - - ->>> fl = FrozenList([17, 42, 'spam']) ->>> hash(fl) -Traceback (most recent call last): - File "<stdin>", line 1, in <module> - File "frozenlist/_frozenlist.pyx", line 111, in frozenlist._frozenlist.FrozenList.__hash__ - raise RuntimeError("Cannot hash unfrozen list.") -RuntimeError: Cannot hash unfrozen list. ->>> fl.freeze() ->>> hash(fl) -3713081631934410656 ->>> dictionary = {fl: 'Vikings'} # frozen fl can be a dict key ->>> dictionary -{<FrozenList(frozen=True, [1, 2])>: 'Vikings'} - - -Installation ------------- - -:: - - $ pip install frozenlist - - -Documentation -------------- - -https://frozenlist.aio-libs.org - -Communication channels ----------------------- - -We have a *Matrix Space* `#aio-libs-space:matrix.org -<https://matrix.to/#/%23aio-libs-space:matrix.org>`_ which is -also accessible via Gitter. - -License -------- - -``frozenlist`` is offered under the Apache 2 license. - -Source code ------------ - -The project is hosted on GitHub_ - -Please file an issue in the `bug tracker -<https://github.com/aio-libs/frozenlist/issues>`_ if you have found a bug -or have some suggestions to improve the library. - -.. _GitHub: https://github.com/aio-libs/frozenlist - -========= -Changelog -========= - -.. - You should *NOT* be adding new change log entries to this file, this - file is managed by towncrier. You *may* edit previous change logs to - fix problems like typo corrections or such. - To add a new change log entry, please see - https://pip.pypa.io/en/latest/development/contributing/#news-entries - we named the news folder "changes". - - WARNING: Don't drop the next directive! - -.. towncrier release notes start - -v1.7.0 -====== - -*(2025-06-09)* - - -Features --------- - -- Added deepcopy support to FrozenList -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#659 <https://github.com/aio-libs/frozenlist/issues/659>`__. - - -Packaging updates and notes for downstreams -------------------------------------------- - -- Fixed an issue where ``frozenlist`` binary wheels would be built with debugging symbols and line tracing enabled, which significantly impacted performance. Line tracing is now disabled by default and can only be enabled explicitly -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - This change ensures that production builds are optimized for performance. Developers who need line tracing for debugging purposes can still enable it by: - - 1. Setting the ``FROZENLIST_CYTHON_TRACING`` environment variable - 2. Using the ``--config-setting=with-cython-tracing=true`` option with pip - - *Related issues and pull requests on GitHub:* - `#660 <https://github.com/aio-libs/frozenlist/issues/660>`__. - -- Enabled ``PIP_CONSTRAINT`` environment variable in the build configuration to ensure the pinned Cython version from ``requirements/cython.txt`` is used during wheel builds. - - *Related issues and pull requests on GitHub:* - `#661 <https://github.com/aio-libs/frozenlist/issues/661>`__. - - ----- - - -v1.6.2 -====== - -*(2025-06-03)* - - -No significant changes. - - ----- - - -v1.6.1 -====== - -*(2025-06-02)* - - -Bug fixes ---------- - -- Correctly use ``cimport`` for including ``PyBool_FromLong`` -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__. - - *Related issues and pull requests on GitHub:* - `#653 <https://github.com/aio-libs/frozenlist/issues/653>`__. - - -Packaging updates and notes for downstreams -------------------------------------------- - -- Exclude ``_frozenlist.cpp`` from bdists/wheels -- by `@musicinmybrain <https://github.com/sponsors/musicinmybrain>`__. - - *Related issues and pull requests on GitHub:* - `#649 <https://github.com/aio-libs/frozenlist/issues/649>`__. - -- Updated to use Cython 3.1 universally across the build path -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__. - - *Related issues and pull requests on GitHub:* - `#654 <https://github.com/aio-libs/frozenlist/issues/654>`__. - - ----- - - -v1.6.0 -====== - -*(2025-04-17)* - - -Bug fixes ---------- - -- Stopped implicitly allowing the use of Cython pre-release versions when - building the distribution package -- by `@ajsanchezsanz <https://github.com/sponsors/ajsanchezsanz>`__ and - `@markgreene74 <https://github.com/sponsors/markgreene74>`__. - - *Related commits on GitHub:* - `41591f2 <https://github.com/aio-libs/frozenlist/commit/41591f2>`__. - - -Features --------- - -- Implemented support for the free-threaded build of CPython 3.13 -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__. - - *Related issues and pull requests on GitHub:* - `#618 <https://github.com/aio-libs/frozenlist/issues/618>`__. - -- Started building armv7l wheels -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#642 <https://github.com/aio-libs/frozenlist/issues/642>`__. - - -Packaging updates and notes for downstreams -------------------------------------------- - -- Stopped implicitly allowing the use of Cython pre-release versions when - building the distribution package -- by `@ajsanchezsanz <https://github.com/sponsors/ajsanchezsanz>`__ and - `@markgreene74 <https://github.com/sponsors/markgreene74>`__. - - *Related commits on GitHub:* - `41591f2 <https://github.com/aio-libs/frozenlist/commit/41591f2>`__. - -- Started building wheels for the free-threaded build of CPython 3.13 -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__. - - *Related issues and pull requests on GitHub:* - `#618 <https://github.com/aio-libs/frozenlist/issues/618>`__. - -- The packaging metadata switched to including an SPDX license identifier introduced in `PEP 639 <https://peps.python.org/pep-639>`__ -- by `@cdce8p <https://github.com/sponsors/cdce8p>`__. - - *Related issues and pull requests on GitHub:* - `#639 <https://github.com/aio-libs/frozenlist/issues/639>`__. - - -Contributor-facing changes --------------------------- - -- GitHub Actions CI/CD is now configured to manage caching pip-ecosystem - dependencies using `re-actors/cache-python-deps`_ -- an action by - `@webknjaz <https://github.com/sponsors/webknjaz>`__ that takes into account ABI stability and the exact - version of Python runtime. - - .. _`re-actors/cache-python-deps`: - https://github.com/marketplace/actions/cache-python-deps - - *Related issues and pull requests on GitHub:* - `#633 <https://github.com/aio-libs/frozenlist/issues/633>`__. - -- Organized dependencies into test and lint dependencies so that no - unnecessary ones are installed during CI runs -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__. - - *Related issues and pull requests on GitHub:* - `#636 <https://github.com/aio-libs/frozenlist/issues/636>`__. - - ----- - - -1.5.0 (2024-10-22) -================== - -Bug fixes ---------- - -- An incorrect signature of the ``__class_getitem__`` class method - has been fixed, adding a missing ``class_item`` argument under - Python 3.8 and older. - - This change also improves the code coverage of this method that - was previously missing -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__. - - - *Related issues and pull requests on GitHub:* - `#567 <https://github.com/aio-libs/frozenlist/issues/567>`__, `#571 <https://github.com/aio-libs/frozenlist/issues/571>`__. - - -Improved documentation ----------------------- - -- Rendered issue, PR, and commit links now lead to - ``frozenlist``'s repo instead of ``yarl``'s repo. - - - *Related issues and pull requests on GitHub:* - `#573 <https://github.com/aio-libs/frozenlist/issues/573>`__. - -- On the ``Contributing docs`` page, - a link to the ``Towncrier philosophy`` has been fixed. - - - *Related issues and pull requests on GitHub:* - `#574 <https://github.com/aio-libs/frozenlist/issues/574>`__. - - -Packaging updates and notes for downstreams -------------------------------------------- - -- A name of a temporary building directory now reflects - that it's related to ``frozenlist``, not ``yarl``. - - - *Related issues and pull requests on GitHub:* - `#573 <https://github.com/aio-libs/frozenlist/issues/573>`__. - -- Declared Python 3.13 supported officially in the distribution package metadata. - - - *Related issues and pull requests on GitHub:* - `#595 <https://github.com/aio-libs/frozenlist/issues/595>`__. - - ----- - - -1.4.1 (2023-12-15) -================== - -Packaging updates and notes for downstreams -------------------------------------------- - -- Declared Python 3.12 and PyPy 3.8-3.10 supported officially - in the distribution package metadata. - - - *Related issues and pull requests on GitHub:* - `#553 <https://github.com/aio-libs/frozenlist/issues/553>`__. - -- Replaced the packaging is replaced from an old-fashioned ``setup.py`` to an - in-tree `PEP 517 <https://peps.python.org/pep-517>`__ build backend -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__. - - Whenever the end-users or downstream packagers need to build ``frozenlist`` - from source (a Git checkout or an sdist), they may pass a ``config_settings`` - flag ``pure-python``. If this flag is not set, a C-extension will be built - and included into the distribution. - - Here is how this can be done with ``pip``: - - .. code-block:: console - - $ python3 -m pip install . --config-settings=pure-python= - - This will also work with ``-e | --editable``. - - The same can be achieved via ``pypa/build``: - - .. code-block:: console - - $ python3 -m build --config-setting=pure-python= - - Adding ``-w | --wheel`` can force ``pypa/build`` produce a wheel from source - directly, as opposed to building an ``sdist`` and then building from it. - - - *Related issues and pull requests on GitHub:* - `#560 <https://github.com/aio-libs/frozenlist/issues/560>`__. - - -Contributor-facing changes --------------------------- - -- It is now possible to request line tracing in Cython builds using the - ``with-cython-tracing`` `PEP 517 <https://peps.python.org/pep-517>`__ config setting - -- `@webknjaz <https://github.com/sponsors/webknjaz>`__. - - This can be used in CI and development environment to measure coverage - on Cython modules, but is not normally useful to the end-users or - downstream packagers. - - Here's a usage example: - - .. code-block:: console - - $ python3 -Im pip install . --config-settings=with-cython-tracing=true - - For editable installs, this setting is on by default. Otherwise, it's - off unless requested explicitly. - - The following produces C-files required for the Cython coverage - plugin to map the measurements back to the PYX-files: - - .. code-block:: console - - $ python -Im pip install -e . - - Alternatively, the ``FROZENLIST_CYTHON_TRACING=1`` environment variable - can be set to do the same as the `PEP 517 <https://peps.python.org/pep-517>`__ config setting. - - - *Related issues and pull requests on GitHub:* - `#560 <https://github.com/aio-libs/frozenlist/issues/560>`__. - -- Coverage collection has been implemented for the Cython modules - -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__. - - It will also be reported to Codecov from any non-release CI jobs. - - - *Related issues and pull requests on GitHub:* - `#561 <https://github.com/aio-libs/frozenlist/issues/561>`__. - -- A step-by-step ``Release Guide`` guide has - been added, describing how to release *frozenlist* -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__. - - This is primarily targeting the maintainers. - - - *Related issues and pull requests on GitHub:* - `#563 <https://github.com/aio-libs/frozenlist/issues/563>`__. - -- Detailed ``Contributing Guidelines`` on - authoring the changelog fragments have been published in the - documentation -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__. - - - *Related issues and pull requests on GitHub:* - `#564 <https://github.com/aio-libs/frozenlist/issues/564>`__. - - ----- - - -1.4.0 (2023-07-12) -================== - -The published source distribution package became buildable -under Python 3.12. - - ----- - - -Bugfixes --------- - -- Removed an unused ``typing.Tuple`` import - `#411 <https://github.com/aio-libs/frozenlist/issues/411>`_ - - -Deprecations and Removals -------------------------- - -- Dropped Python 3.7 support. - `#413 <https://github.com/aio-libs/frozenlist/issues/413>`_ - - -Misc ----- - -- `#410 <https://github.com/aio-libs/frozenlist/issues/410>`_, `#433 <https://github.com/aio-libs/frozenlist/issues/433>`_ - - ----- - - -1.3.3 (2022-11-08) -================== - -- Fixed CI runs when creating a new release, where new towncrier versions - fail when the current version section is already present. - - ----- - - -1.3.2 (2022-11-08) -================== - -Misc ----- - -- Updated the CI runs to better check for test results and to avoid deprecated syntax. `#327 <https://github.com/aio-libs/frozenlist/issues/327>`_ - - ----- - - -1.3.1 (2022-08-02) -================== - -The published source distribution package became buildable -under Python 3.11. - - ----- - - -1.3.0 (2022-01-18) -================== - -Bugfixes --------- - -- Do not install C sources with binary distributions. - `#250 <https://github.com/aio-libs/frozenlist/issues/250>`_ - - -Deprecations and Removals -------------------------- - -- Dropped Python 3.6 support - `#274 <https://github.com/aio-libs/frozenlist/issues/274>`_ - - ----- - - -1.2.0 (2021-10-16) -================== - -Features --------- - -- ``FrozenList`` now supports being used as a generic type as per PEP 585, e.g. ``frozen_int_list: FrozenList[int]`` (requires Python 3.9 or newer). - `#172 <https://github.com/aio-libs/frozenlist/issues/172>`_ -- Added support for Python 3.10. - `#227 <https://github.com/aio-libs/frozenlist/issues/227>`_ -- Started shipping platform-specific wheels with the ``musl`` tag targeting typical Alpine Linux runtimes. - `#227 <https://github.com/aio-libs/frozenlist/issues/227>`_ -- Started shipping platform-specific arm64 wheels for Apple Silicon. - `#227 <https://github.com/aio-libs/frozenlist/issues/227>`_ - - ----- - - -1.1.1 (2020-11-14) -================== - -Bugfixes --------- - -- Provide x86 Windows wheels. - `#169 <https://github.com/aio-libs/frozenlist/issues/169>`_ - - ----- - - -1.1.0 (2020-10-13) -================== - -Features --------- - -- Add support for hashing of a frozen list. - `#136 <https://github.com/aio-libs/frozenlist/issues/136>`_ - -- Support Python 3.8 and 3.9. - -- Provide wheels for ``aarch64``, ``i686``, ``ppc64le``, ``s390x`` architectures on - Linux as well as ``x86_64``. - - ----- - - -1.0.0 (2019-11-09) -================== - -Deprecations and Removals -------------------------- - -- Dropped support for Python 3.5; only 3.6, 3.7 and 3.8 are supported going forward. - `#24 <https://github.com/aio-libs/frozenlist/issues/24>`_ diff --git a/venv/lib/python3.12/site-packages/frozenlist-1.7.0.dist-info/RECORD b/venv/lib/python3.12/site-packages/frozenlist-1.7.0.dist-info/RECORD deleted file mode 100644 index b9b1cf7..0000000 --- a/venv/lib/python3.12/site-packages/frozenlist-1.7.0.dist-info/RECORD +++ /dev/null @@ -1,12 +0,0 @@ -frozenlist-1.7.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -frozenlist-1.7.0.dist-info/METADATA,sha256=i17YUbVkOZpMhJDnyO7BchCLeyIldtx6rtj5IKVYG0A,18620 -frozenlist-1.7.0.dist-info/RECORD,, -frozenlist-1.7.0.dist-info/WHEEL,sha256=kaf3GlniTxElItJKanA5i_DdhhelZhGNqtfvwRkHPG0,224 -frozenlist-1.7.0.dist-info/licenses/LICENSE,sha256=b9UkPpLdf5jsacesN3co50kFcJ_1J6W_mNbQJjwE9bY,11332 -frozenlist-1.7.0.dist-info/top_level.txt,sha256=jivtxsPXA3nK3WBWW2LW5Mtu_GHt8UZA13NeCs2cKuA,11 -frozenlist/__init__.py,sha256=lK5sikKJ0TltduFRDrIHU9o0tU_6wsgi43kJ0vucBOw,2108 -frozenlist/__init__.pyi,sha256=vMEoES1xGegPtVXoCi9XydEeHsyuIq-KdeXwP5PdsaA,1470 -frozenlist/__pycache__/__init__.cpython-312.pyc,, -frozenlist/_frozenlist.cpython-312-x86_64-linux-gnu.so,sha256=lLvms87Jm5c6Za9N-eJUruCtdsTRKrRCsc5hPRR2eog,789896 -frozenlist/_frozenlist.pyx,sha256=t-aGjuEiVt_MZPBJ0RnraavVmPBK6arz3i48ZvXuYsU,3708 -frozenlist/py.typed,sha256=sow9soTwP9T_gEAQSVh7Gb8855h04Nwmhs2We-JRgZM,7 diff --git a/venv/lib/python3.12/site-packages/frozenlist-1.7.0.dist-info/WHEEL b/venv/lib/python3.12/site-packages/frozenlist-1.7.0.dist-info/WHEEL deleted file mode 100644 index 4afdbc4..0000000 --- a/venv/lib/python3.12/site-packages/frozenlist-1.7.0.dist-info/WHEEL +++ /dev/null @@ -1,8 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (80.9.0) -Root-Is-Purelib: false -Tag: cp312-cp312-manylinux_2_5_x86_64 -Tag: cp312-cp312-manylinux1_x86_64 -Tag: cp312-cp312-manylinux_2_17_x86_64 -Tag: cp312-cp312-manylinux2014_x86_64 - diff --git a/venv/lib/python3.12/site-packages/frozenlist-1.7.0.dist-info/licenses/LICENSE b/venv/lib/python3.12/site-packages/frozenlist-1.7.0.dist-info/licenses/LICENSE deleted file mode 100644 index 7082a2d..0000000 --- a/venv/lib/python3.12/site-packages/frozenlist-1.7.0.dist-info/licenses/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2013-2019 Nikolay Kim and Andrew Svetlov - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/venv/lib/python3.12/site-packages/frozenlist-1.7.0.dist-info/top_level.txt b/venv/lib/python3.12/site-packages/frozenlist-1.7.0.dist-info/top_level.txt deleted file mode 100644 index 52f13fc..0000000 --- a/venv/lib/python3.12/site-packages/frozenlist-1.7.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -frozenlist diff --git a/venv/lib/python3.12/site-packages/frozenlist/__init__.py b/venv/lib/python3.12/site-packages/frozenlist/__init__.py deleted file mode 100644 index a8019ad..0000000 --- a/venv/lib/python3.12/site-packages/frozenlist/__init__.py +++ /dev/null @@ -1,86 +0,0 @@ -import os -import types -from collections.abc import MutableSequence -from functools import total_ordering - -__version__ = "1.7.0" - -__all__ = ("FrozenList", "PyFrozenList") # type: Tuple[str, ...] - - -NO_EXTENSIONS = bool(os.environ.get("FROZENLIST_NO_EXTENSIONS")) # type: bool - - -@total_ordering -class FrozenList(MutableSequence): - __slots__ = ("_frozen", "_items") - __class_getitem__ = classmethod(types.GenericAlias) - - def __init__(self, items=None): - self._frozen = False - if items is not None: - items = list(items) - else: - items = [] - self._items = items - - @property - def frozen(self): - return self._frozen - - def freeze(self): - self._frozen = True - - def __getitem__(self, index): - return self._items[index] - - def __setitem__(self, index, value): - if self._frozen: - raise RuntimeError("Cannot modify frozen list.") - self._items[index] = value - - def __delitem__(self, index): - if self._frozen: - raise RuntimeError("Cannot modify frozen list.") - del self._items[index] - - def __len__(self): - return self._items.__len__() - - def __iter__(self): - return self._items.__iter__() - - def __reversed__(self): - return self._items.__reversed__() - - def __eq__(self, other): - return list(self) == other - - def __le__(self, other): - return list(self) <= other - - def insert(self, pos, item): - if self._frozen: - raise RuntimeError("Cannot modify frozen list.") - self._items.insert(pos, item) - - def __repr__(self): - return f"<FrozenList(frozen={self._frozen}, {self._items!r})>" - - def __hash__(self): - if self._frozen: - return hash(tuple(self)) - else: - raise RuntimeError("Cannot hash unfrozen list.") - - -PyFrozenList = FrozenList - - -if not NO_EXTENSIONS: - try: - from ._frozenlist import FrozenList as CFrozenList # type: ignore - except ImportError: # pragma: no cover - pass - else: - FrozenList = CFrozenList # type: ignore diff --git a/venv/lib/python3.12/site-packages/frozenlist/__init__.pyi b/venv/lib/python3.12/site-packages/frozenlist/__init__.pyi deleted file mode 100644 index ae803ef..0000000 --- a/venv/lib/python3.12/site-packages/frozenlist/__init__.pyi +++ /dev/null @@ -1,47 +0,0 @@ -from typing import ( - Generic, - Iterable, - Iterator, - List, - MutableSequence, - Optional, - TypeVar, - Union, - overload, -) - -_T = TypeVar("_T") -_Arg = Union[List[_T], Iterable[_T]] - -class FrozenList(MutableSequence[_T], Generic[_T]): - def __init__(self, items: Optional[_Arg[_T]] = None) -> None: ... - @property - def frozen(self) -> bool: ... - def freeze(self) -> None: ... - @overload - def __getitem__(self, i: int) -> _T: ... - @overload - def __getitem__(self, s: slice) -> FrozenList[_T]: ... - @overload - def __setitem__(self, i: int, o: _T) -> None: ... - @overload - def __setitem__(self, s: slice, o: Iterable[_T]) -> None: ... - @overload - def __delitem__(self, i: int) -> None: ... - @overload - def __delitem__(self, i: slice) -> None: ... - def __len__(self) -> int: ... - def __iter__(self) -> Iterator[_T]: ... - def __reversed__(self) -> Iterator[_T]: ... - def __eq__(self, other: object) -> bool: ... - def __le__(self, other: FrozenList[_T]) -> bool: ... - def __ne__(self, other: object) -> bool: ... - def __lt__(self, other: FrozenList[_T]) -> bool: ... - def __ge__(self, other: FrozenList[_T]) -> bool: ... - def __gt__(self, other: FrozenList[_T]) -> bool: ... - def insert(self, pos: int, item: _T) -> None: ... - def __repr__(self) -> str: ... - def __hash__(self) -> int: ... - -# types for C accelerators are the same -CFrozenList = PyFrozenList = FrozenList diff --git a/venv/lib/python3.12/site-packages/frozenlist/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/frozenlist/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 8f3d49ca2d29d871b756d02eabffb88ca5bb518a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4080 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 diff --git a/venv/lib/python3.12/site-packages/frozenlist/_frozenlist.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/frozenlist/_frozenlist.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index d0821d06a32bef8e13a59e075ebb3b493a3212a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 789896 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%0A<wbv6laIr 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 T#=}MU#fzWNX#E;O?Y8m%sxc+L diff --git a/venv/lib/python3.12/site-packages/frozenlist/_frozenlist.pyx b/venv/lib/python3.12/site-packages/frozenlist/_frozenlist.pyx deleted file mode 100644 index a82d8c8..0000000 --- a/venv/lib/python3.12/site-packages/frozenlist/_frozenlist.pyx +++ /dev/null @@ -1,148 +0,0 @@ -# cython: freethreading_compatible = True -# distutils: language = c++ - -from cpython.bool cimport PyBool_FromLong -from libcpp.atomic cimport atomic - -import copy -import types -from collections.abc import MutableSequence - - -cdef class FrozenList: - __class_getitem__ = classmethod(types.GenericAlias) - - cdef atomic[bint] _frozen - cdef list _items - - def __init__(self, items=None): - self._frozen.store(False) - if items is not None: - items = list(items) - else: - items = [] - self._items = items - - @property - def frozen(self): - return PyBool_FromLong(self._frozen.load()) - - cdef object _check_frozen(self): - if self._frozen.load(): - raise RuntimeError("Cannot modify frozen list.") - - cdef inline object _fast_len(self): - return len(self._items) - - def freeze(self): - self._frozen.store(True) - - def __getitem__(self, index): - return self._items[index] - - def __setitem__(self, index, value): - self._check_frozen() - self._items[index] = value - - def __delitem__(self, index): - self._check_frozen() - del self._items[index] - - def __len__(self): - return self._fast_len() - - def __iter__(self): - return self._items.__iter__() - - def __reversed__(self): - return self._items.__reversed__() - - def __richcmp__(self, other, op): - if op == 0: # < - return list(self) < other - if op == 1: # <= - return list(self) <= other - if op == 2: # == - return list(self) == other - if op == 3: # != - return list(self) != other - if op == 4: # > - return list(self) > other - if op == 5: # => - return list(self) >= other - - def insert(self, pos, item): - self._check_frozen() - self._items.insert(pos, item) - - def __contains__(self, item): - return item in self._items - - def __iadd__(self, items): - self._check_frozen() - self._items += list(items) - return self - - def index(self, item): - return self._items.index(item) - - def remove(self, item): - self._check_frozen() - self._items.remove(item) - - def clear(self): - self._check_frozen() - self._items.clear() - - def extend(self, items): - self._check_frozen() - self._items += list(items) - - def reverse(self): - self._check_frozen() - self._items.reverse() - - def pop(self, index=-1): - self._check_frozen() - return self._items.pop(index) - - def append(self, item): - self._check_frozen() - return self._items.append(item) - - def count(self, item): - return self._items.count(item) - - def __repr__(self): - return '<FrozenList(frozen={}, {!r})>'.format(self._frozen.load(), - self._items) - - def __hash__(self): - if self._frozen.load(): - return hash(tuple(self._items)) - else: - raise RuntimeError("Cannot hash unfrozen list.") - - def __deepcopy__(self, memo): - cdef FrozenList new_list - obj_id = id(self) - - # Return existing copy if already processed (circular reference) - if obj_id in memo: - return memo[obj_id] - - # Create new instance and register immediately - new_list = self.__class__([]) - memo[obj_id] = new_list - - # Deep copy items - new_list._items[:] = [copy.deepcopy(item, memo) for item in self._items] - - # Preserve frozen state - if self._frozen.load(): - new_list.freeze() - - return new_list - - -MutableSequence.register(FrozenList) diff --git a/venv/lib/python3.12/site-packages/frozenlist/py.typed b/venv/lib/python3.12/site-packages/frozenlist/py.typed deleted file mode 100644 index f5642f7..0000000 --- a/venv/lib/python3.12/site-packages/frozenlist/py.typed +++ /dev/null @@ -1 +0,0 @@ -Marker diff --git a/venv/lib/python3.12/site-packages/h11-0.16.0.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/h11-0.16.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.12/site-packages/h11-0.16.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/h11-0.16.0.dist-info/METADATA b/venv/lib/python3.12/site-packages/h11-0.16.0.dist-info/METADATA deleted file mode 100644 index 8a2f639..0000000 --- a/venv/lib/python3.12/site-packages/h11-0.16.0.dist-info/METADATA +++ /dev/null @@ -1,202 +0,0 @@ -Metadata-Version: 2.4 -Name: h11 -Version: 0.16.0 -Summary: A pure-Python, bring-your-own-I/O implementation of HTTP/1.1 -Home-page: https://github.com/python-hyper/h11 -Author: Nathaniel J. Smith -Author-email: njs@pobox.com -License: MIT -Classifier: Development Status :: 3 - Alpha -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -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 -Classifier: Topic :: System :: Networking -Requires-Python: >=3.8 -License-File: LICENSE.txt -Dynamic: author -Dynamic: author-email -Dynamic: classifier -Dynamic: description -Dynamic: home-page -Dynamic: license -Dynamic: license-file -Dynamic: requires-python -Dynamic: summary - -h11 -=== - -.. image:: https://travis-ci.org/python-hyper/h11.svg?branch=master - :target: https://travis-ci.org/python-hyper/h11 - :alt: Automated test status - -.. image:: https://codecov.io/gh/python-hyper/h11/branch/master/graph/badge.svg - :target: https://codecov.io/gh/python-hyper/h11 - :alt: Test coverage - -.. image:: https://readthedocs.org/projects/h11/badge/?version=latest - :target: http://h11.readthedocs.io/en/latest/?badge=latest - :alt: Documentation Status - -This is a little HTTP/1.1 library written from scratch in Python, -heavily inspired by `hyper-h2 <https://hyper-h2.readthedocs.io/>`_. - -It's a "bring-your-own-I/O" library; h11 contains no IO code -whatsoever. This means you can hook h11 up to your favorite network -API, and that could be anything you want: synchronous, threaded, -asynchronous, or your own implementation of `RFC 6214 -<https://tools.ietf.org/html/rfc6214>`_ -- h11 won't judge you. -(Compare this to the current state of the art, where every time a `new -network API <https://trio.readthedocs.io/>`_ comes along then someone -gets to start over reimplementing the entire HTTP protocol from -scratch.) Cory Benfield made an `excellent blog post describing the -benefits of this approach -<https://lukasa.co.uk/2015/10/The_New_Hyper/>`_, or if you like video -then here's his `PyCon 2016 talk on the same theme -<https://www.youtube.com/watch?v=7cC3_jGwl_U>`_. - -This also means that h11 is not immediately useful out of the box: -it's a toolkit for building programs that speak HTTP, not something -that could directly replace ``requests`` or ``twisted.web`` or -whatever. But h11 makes it much easier to implement something like -``requests`` or ``twisted.web``. - -At a high level, working with h11 goes like this: - -1) First, create an ``h11.Connection`` object to track the state of a - single HTTP/1.1 connection. - -2) When you read data off the network, pass it to - ``conn.receive_data(...)``; you'll get back a list of objects - representing high-level HTTP "events". - -3) When you want to send a high-level HTTP event, create the - corresponding "event" object and pass it to ``conn.send(...)``; - this will give you back some bytes that you can then push out - through the network. - -For example, a client might instantiate and then send a -``h11.Request`` object, then zero or more ``h11.Data`` objects for the -request body (e.g., if this is a POST), and then a -``h11.EndOfMessage`` to indicate the end of the message. Then the -server would then send back a ``h11.Response``, some ``h11.Data``, and -its own ``h11.EndOfMessage``. If either side violates the protocol, -you'll get a ``h11.ProtocolError`` exception. - -h11 is suitable for implementing both servers and clients, and has a -pleasantly symmetric API: the events you send as a client are exactly -the ones that you receive as a server and vice-versa. - -`Here's an example of a tiny HTTP client -<https://github.com/python-hyper/h11/blob/master/examples/basic-client.py>`_ - -It also has `a fine manual <https://h11.readthedocs.io/>`_. - -FAQ ---- - -*Whyyyyy?* - -I wanted to play with HTTP in `Curio -<https://curio.readthedocs.io/en/latest/tutorial.html>`__ and `Trio -<https://trio.readthedocs.io>`__, which at the time didn't have any -HTTP libraries. So I thought, no big deal, Python has, like, a dozen -different implementations of HTTP, surely I can find one that's -reusable. I didn't find one, but I did find Cory's call-to-arms -blog-post. So I figured, well, fine, if I have to implement HTTP from -scratch, at least I can make sure no-one *else* has to ever again. - -*Should I use it?* - -Maybe. You should be aware that it's a very young project. But, it's -feature complete and has an exhaustive test-suite and complete docs, -so the next step is for people to try using it and see how it goes -:-). If you do then please let us know -- if nothing else we'll want -to talk to you before making any incompatible changes! - -*What are the features/limitations?* - -Roughly speaking, it's trying to be a robust, complete, and non-hacky -implementation of the first "chapter" of the HTTP/1.1 spec: `RFC 7230: -HTTP/1.1 Message Syntax and Routing -<https://tools.ietf.org/html/rfc7230>`_. That is, it mostly focuses on -implementing HTTP at the level of taking bytes on and off the wire, -and the headers related to that, and tries to be anal about spec -conformance. It doesn't know about higher-level concerns like URL -routing, conditional GETs, cross-origin cookie policies, or content -negotiation. But it does know how to take care of framing, -cross-version differences in keep-alive handling, and the "obsolete -line folding" rule, so you can focus your energies on the hard / -interesting parts for your application, and it tries to support the -full specification in the sense that any useful HTTP/1.1 conformant -application should be able to use h11. - -It's pure Python, and has no dependencies outside of the standard -library. - -It has a test suite with 100.0% coverage for both statements and -branches. - -Currently it supports Python 3 (testing on 3.8-3.12) and PyPy 3. -The last Python 2-compatible version was h11 0.11.x. -(Originally it had a Cython wrapper for `http-parser -<https://github.com/nodejs/http-parser>`_ and a beautiful nested state -machine implemented with ``yield from`` to postprocess the output. But -I had to take these out -- the new *parser* needs fewer lines-of-code -than the old *parser wrapper*, is written in pure Python, uses no -exotic language syntax, and has more features. It's sad, really; that -old state machine was really slick. I just need a few sentences here -to mourn that.) - -I don't know how fast it is. I haven't benchmarked or profiled it yet, -so it's probably got a few pointless hot spots, and I've been trying -to err on the side of simplicity and robustness instead of -micro-optimization. But at the architectural level I tried hard to -avoid fundamentally bad decisions, e.g., I believe that all the -parsing algorithms remain linear-time even in the face of pathological -input like slowloris, and there are no byte-by-byte loops. (I also -believe that it maintains bounded memory usage in the face of -arbitrary/pathological input.) - -The whole library is ~800 lines-of-code. You can read and understand -the whole thing in less than an hour. Most of the energy invested in -this so far has been spent on trying to keep things simple by -minimizing special-cases and ad hoc state manipulation; even though it -is now quite small and simple, I'm still annoyed that I haven't -figured out how to make it even smaller and simpler. (Unfortunately, -HTTP does not lend itself to simplicity.) - -The API is ~feature complete and I don't expect the general outlines -to change much, but you can't judge an API's ergonomics until you -actually document and use it, so I'd expect some changes in the -details. - -*How do I try it?* - -.. code-block:: sh - - $ pip install h11 - $ git clone git@github.com:python-hyper/h11 - $ cd h11/examples - $ python basic-client.py - -and go from there. - -*License?* - -MIT - -*Code of conduct?* - -Contributors are requested to follow our `code of conduct -<https://github.com/python-hyper/h11/blob/master/CODE_OF_CONDUCT.md>`_ in -all project spaces. diff --git a/venv/lib/python3.12/site-packages/h11-0.16.0.dist-info/RECORD b/venv/lib/python3.12/site-packages/h11-0.16.0.dist-info/RECORD deleted file mode 100644 index a8f8e63..0000000 --- a/venv/lib/python3.12/site-packages/h11-0.16.0.dist-info/RECORD +++ /dev/null @@ -1,29 +0,0 @@ -h11-0.16.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -h11-0.16.0.dist-info/METADATA,sha256=KPMmCYrAn8unm48YD5YIfIQf4kViFct7hyqcfVzRnWQ,8348 -h11-0.16.0.dist-info/RECORD,, -h11-0.16.0.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91 -h11-0.16.0.dist-info/licenses/LICENSE.txt,sha256=N9tbuFkm2yikJ6JYZ_ELEjIAOuob5pzLhRE4rbjm82E,1124 -h11-0.16.0.dist-info/top_level.txt,sha256=F7dC4jl3zeh8TGHEPaWJrMbeuoWbS379Gwdi-Yvdcis,4 -h11/__init__.py,sha256=iO1KzkSO42yZ6ffg-VMgbx_ZVTWGUY00nRYEWn-s3kY,1507 -h11/__pycache__/__init__.cpython-312.pyc,, -h11/__pycache__/_abnf.cpython-312.pyc,, -h11/__pycache__/_connection.cpython-312.pyc,, -h11/__pycache__/_events.cpython-312.pyc,, -h11/__pycache__/_headers.cpython-312.pyc,, -h11/__pycache__/_readers.cpython-312.pyc,, -h11/__pycache__/_receivebuffer.cpython-312.pyc,, -h11/__pycache__/_state.cpython-312.pyc,, -h11/__pycache__/_util.cpython-312.pyc,, -h11/__pycache__/_version.cpython-312.pyc,, -h11/__pycache__/_writers.cpython-312.pyc,, -h11/_abnf.py,sha256=ybixr0xsupnkA6GFAyMubuXF6Tc1lb_hF890NgCsfNc,4815 -h11/_connection.py,sha256=k9YRVf6koZqbttBW36xSWaJpWdZwa-xQVU9AHEo9DuI,26863 -h11/_events.py,sha256=I97aXoal1Wu7dkL548BANBUCkOIbe-x5CioYA9IBY14,11792 -h11/_headers.py,sha256=P7D-lBNxHwdLZPLimmYwrPG-9ZkjElvvJZJdZAgSP-4,10412 -h11/_readers.py,sha256=a4RypORUCC3d0q_kxPuBIM7jTD8iLt5X91TH0FsduN4,8590 -h11/_receivebuffer.py,sha256=xrspsdsNgWFxRfQcTXxR8RrdjRXXTK0Io5cQYWpJ1Ws,5252 -h11/_state.py,sha256=_5LG_BGR8FCcFQeBPH-TMHgm_-B-EUcWCnQof_9XjFE,13231 -h11/_util.py,sha256=LWkkjXyJaFlAy6Lt39w73UStklFT5ovcvo0TkY7RYuk,4888 -h11/_version.py,sha256=GVSsbPSPDcOuF6ptfIiXnVJoaEm3ygXbMnqlr_Giahw,686 -h11/_writers.py,sha256=oFKm6PtjeHfbj4RLX7VB7KDc1gIY53gXG3_HR9ltmTA,5081 -h11/py.typed,sha256=sow9soTwP9T_gEAQSVh7Gb8855h04Nwmhs2We-JRgZM,7 diff --git a/venv/lib/python3.12/site-packages/h11-0.16.0.dist-info/WHEEL b/venv/lib/python3.12/site-packages/h11-0.16.0.dist-info/WHEEL deleted file mode 100644 index 1eb3c49..0000000 --- a/venv/lib/python3.12/site-packages/h11-0.16.0.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (78.1.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/venv/lib/python3.12/site-packages/h11-0.16.0.dist-info/licenses/LICENSE.txt b/venv/lib/python3.12/site-packages/h11-0.16.0.dist-info/licenses/LICENSE.txt deleted file mode 100644 index 8f080ea..0000000 --- a/venv/lib/python3.12/site-packages/h11-0.16.0.dist-info/licenses/LICENSE.txt +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016 Nathaniel J. Smith <njs@pobox.com> and other 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.12/site-packages/h11-0.16.0.dist-info/top_level.txt b/venv/lib/python3.12/site-packages/h11-0.16.0.dist-info/top_level.txt deleted file mode 100644 index 0d24def..0000000 --- a/venv/lib/python3.12/site-packages/h11-0.16.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -h11 diff --git a/venv/lib/python3.12/site-packages/h11/__init__.py b/venv/lib/python3.12/site-packages/h11/__init__.py deleted file mode 100644 index 989e92c..0000000 --- a/venv/lib/python3.12/site-packages/h11/__init__.py +++ /dev/null @@ -1,62 +0,0 @@ -# A highish-level implementation of the HTTP/1.1 wire protocol (RFC 7230), -# containing no networking code at all, loosely modelled on hyper-h2's generic -# implementation of HTTP/2 (and in particular the h2.connection.H2Connection -# class). There's still a bunch of subtle details you need to get right if you -# want to make this actually useful, because it doesn't implement all the -# semantics to check that what you're asking to write to the wire is sensible, -# but at least it gets you out of dealing with the wire itself. - -from h11._connection import Connection, NEED_DATA, PAUSED -from h11._events import ( - ConnectionClosed, - Data, - EndOfMessage, - Event, - InformationalResponse, - Request, - Response, -) -from h11._state import ( - CLIENT, - CLOSED, - DONE, - ERROR, - IDLE, - MIGHT_SWITCH_PROTOCOL, - MUST_CLOSE, - SEND_BODY, - SEND_RESPONSE, - SERVER, - SWITCHED_PROTOCOL, -) -from h11._util import LocalProtocolError, ProtocolError, RemoteProtocolError -from h11._version import __version__ - -PRODUCT_ID = "python-h11/" + __version__ - - -__all__ = ( - "Connection", - "NEED_DATA", - "PAUSED", - "ConnectionClosed", - "Data", - "EndOfMessage", - "Event", - "InformationalResponse", - "Request", - "Response", - "CLIENT", - "CLOSED", - "DONE", - "ERROR", - "IDLE", - "MUST_CLOSE", - "SEND_BODY", - "SEND_RESPONSE", - "SERVER", - "SWITCHED_PROTOCOL", - "ProtocolError", - "LocalProtocolError", - "RemoteProtocolError", -) diff --git a/venv/lib/python3.12/site-packages/h11/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/h11/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 451fe1b245aa1186cce0114bb7040099bac3ca7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1087 zcma))&u`N(6vvbPNZO=Xf354*G2k#Edg!9T351YF6R}EdQ>7gUbFf0{t<~bVBx%vc z1^x;+?atrAX;(`~NIP*sn|7$Q6Lz+NhJ=KreDeHkKYyR!`>JV*z{by`_oI`vAe`{Y z^+;S9=SR%=Bn*Y2=m}T^B2It=PJ*P!eF-mx(;$r{AYmEEI0G^`3$j=N3RZy{?@4+& ztN{%#fCZcfd0YSmTm(g20wr7qWxNO$aRpTH5?I1jP>s)|yk)!sR&Wi}@G4l1eQEC& zUIS~)meATEQw44hWpL*pQ_ue3V(Uq&G>PvcHyRV4X1k_oKx1pLMWx=>PTw@@GA;bs z(DX=%hBRe3kwbH)KeTo`C=8uFMAPOB`4O$O{9O`Yhlg`K8-)|%hlt8HdOJm7L^Ic} zx=N*HyJdC<{BN<VSXirTvOu<N*)-KM+9s`ZTF<u!u>Z0(Xl}!vZ4IoZ)uu{kr$2!4 zF`Dh0T?0O|j8{~PP224EtZv_=Qs1;+m^Lk59%q?d2ViNJ+QfCdUO*z^63+|*5>V~t zv}_|xB6P!97pV&23<V)e5W+)sauAJ(-xzIf>h)@nWN#XzI9P88fy5zmWH_=MynO<d zBgdg}EO6vG3LHg_GRGoEg=2}M%CW++%u!?L*6-3hyL|(?zw7vy464TKh!-gQ4^32w z_lJ=ap?~WuaRvVpNwaZ?X*BjOrN*MUUYd(nu3j)$<t~NQ#n@>MV9TH~gpTJy_(eEp zOTvY#j|fIO>!@(18^oPro`oJE5A6jGZiLa;-A6%VNZ$D#afT?+S)Mc98^6&nYx8hp z^MM|YBh;8U?mp|)P-hZ!2*>_7f^cJUaFKa}$#CkSr@=jTr^vpr!*H4uMR8sd#K*_N zqj@4DCguXe8OOYo<I`)L#a2xaJL0j>{wAz{*J__%A8YqND5ui0n)oOO>n!3g6^|P+ diff --git a/venv/lib/python3.12/site-packages/h11/__pycache__/_abnf.cpython-312.pyc b/venv/lib/python3.12/site-packages/h11/__pycache__/_abnf.cpython-312.pyc deleted file mode 100644 index dbfe15e27b5e5e3a6a1b8ef3b572bb3fd1513767..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1793 zcma)6O>E;t6dosbnm;E_TH5ZGg)Uuaosv3jMOT!PQrM;2OR2<)1vgo*8&8|i#4ffI zT4#-XMM#Jh2M$O`2rgBRoDe6(5eeE;D_=QqLyq>a(w=x@r)_$RHS&8i^L=mL``&2& zWZ5`^@4p|~)xWa{{X-__U!?0i{fk2AJER~HDU?WIN(?C>F|33|8q*>ZLJIw9@|<*O zm23@#5FR+{F8xe>O^H!JGkv3DfR6NyjzeY%U<~xlNGeg01xBoIMoNi`X<#J!W^jN` z_KnUcte6Exs&B@ik`{-6!S&5};UL2gT9M81l3C7KW1IP#6SrP{Z8A4K^H6&9_=`gR zO*wC^<i+x|mDnup&&}pb`?qn~ifukD?H39qqijvKw`;hrNUcg$*6r!3<wZZ*^wniP zXJx0lOBGEuv1;1<vUPWAd1EQyt8xPuy9naj{9^lq2Orv(h?ZP$UO@bb&HE55+U}li zP29VGe?uUgs%h>?Evy?gO)YLhCFRnLZ+Pn+vfsdFRa1)Xz}oycSu|yR2b;yVjz4Q+ z!<2$KY_@yD*;dq#)SkDk7pMGk9|svonl5QuhGgP>s4r)&U*-8{7^ZAC4XL6jP)yIn z=0Q6jp<~&Aq#+AprM;>y8=wd1l_2M?<lmR`+hro?y}KXZSz84e+Ox0E6>QrIzcrH! z>Z??n>aJweEI8%TCx>h-1#`&pe9KRF*%z~<m(=w`#1Fe+kl$rYZ5OL<{IW?d<BRQP zeA8R8o9MX;Ze&~28?xyR?9{a_xo)^@u-k3_1(<ZzO;)k2U|sSdZX{@mo4VQuK=m}$ zO`h-8YbtgVJyN>t73nVad|)IH&5d8G;>Io%ag%`?<fDh+#d=C!t>=$~s@A{)RAjV- zJ6fgLfIDmmCa&WhU2fzJvsT%~dS1~!SL+%nMrdKRCDdzM!rlSgHFbVwc1|#ACeH84 zm0fuU8$xw<R*>W^b$e#-;CXbZp()KeF6v`&AUw3lsKDO~QxxTKXn=FVUKYhB9mb2I z)Swgh-lb4%#9_{c#*b0vEcLRJIOA51xy4g%<%Ep&-&g-w1LLs3NKYT9CQehi6Ebce zJ~;XWjFa%9G&AHOnqi+o)S)jw>cnW~W+#e9Ui!A?`(7APtal5=(@x|pGx5#XX=dVt zjKYsQKh?lEsk8JOPST@k<_3v043S1|JlQ7f97GzQ{QkiAgGkp=`Z~#U;g}OnxrGxl z-urdrw`*V^Q##5NJQQX4XB^5E4u?CLDD!rQL-UKj@V-x?B)w4-A9W&L5~Xs->?@}% ze?rE>;p)*E7!W6k*g+@e(IIBkLm?*fZ)W7laEGCpNGF04*{}G{0P#t2`ZW;yf9*&0 A4*&oF diff --git a/venv/lib/python3.12/site-packages/h11/__pycache__/_connection.cpython-312.pyc b/venv/lib/python3.12/site-packages/h11/__pycache__/_connection.cpython-312.pyc deleted file mode 100644 index bb8befd42a9b239090286cd24a9e5c927f4df13d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23143 zcmch9du&^0mfz(|qD0E1-Y;9amSstl^{{Nk4>^v<w&X`fmOQpR&al~`Xx=M{G9Q|I zFD*-vH`&=>D|e=i3<R~Z<2Lec(8x&8xb2|u0zsRd=8qID3Q|%k4&kCMnxYK~Y?a7G z7PEh}zw_M}DN&g$X4-4(<K_2$oO8b4Ip6vC?@CIFIXr*$k6)YkUlSbnU+IhfxU`qe zc?-wg=LAl$M7XHMZ;4v{)~L;Ii`xD6sKf7w7WfOIh5o{*)9;KH`HP~({$dL!SOr_e z6?OaF(Gq`2beDfu)Z_O=y?$@B)L$Ac^Ovza_DFfO!e0@s^jAi!{8cQ@5vh*W_-mrI z{#y3EAW|2t_t&%c!pQFE9{-+bgTEo#=x>bjem=U_zc<?CZ;I~o?~6A3o1^>v`=c%X z7M9-`X^pn|+oC?dFWT;JXK_W51JMqDN3_%5Y2n5>q4>`%{w^zbo)cVea)MiI7u!E9 z`M|D@-`~wrb|J;HCFP*t_4f#+VzF2%mW^3!Q9vjY4~^M{@;B}N!$O7FyDilzzJUBr zp^|coPVoqRs%5pXK&V3Lqpa0xv|96lRqM&InOa}nm-NL~oUxsb&19TsgONz^Mnufm zLqS=|*!#mFgo9zcJBO!~a6A@_WSsF^q7;b-g^Xh)F-4h2W~Ri9<5~>qUt)DRUtz|3 zHXe(KAu4h<5|>2*l?9bx#yt=dhQ}_6vK$;onSonkOvzMUjE%*mXi#n7iYQOTW3rej zydwT2AyV6Vl+Tv&j*Chl6pu!OfeA4vh*G9{A}9yM+f!&Q&~xx05@Sj@mJl;uc}rHG z6?G1r?jN{vHRHO%O3T!DpCwarMGT4ITjH6-*qA6`LOg-1*DsEoy%0D%JTx?LcEpUh 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 diff --git a/venv/lib/python3.12/site-packages/h11/__pycache__/_events.cpython-312.pyc b/venv/lib/python3.12/site-packages/h11/__pycache__/_events.cpython-312.pyc deleted file mode 100644 index ffb22d02aa25062459aa35e70b2bf1e63f807a10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13238 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 diff --git a/venv/lib/python3.12/site-packages/h11/__pycache__/_headers.cpython-312.pyc b/venv/lib/python3.12/site-packages/h11/__pycache__/_headers.cpython-312.pyc deleted file mode 100644 index f7f5dbbea1a7c34d5a962e9ace152700824be142..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8014 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 M%w_#&CkOTa0n<H6#{d8T diff --git a/venv/lib/python3.12/site-packages/h11/__pycache__/_readers.cpython-312.pyc b/venv/lib/python3.12/site-packages/h11/__pycache__/_readers.cpython-312.pyc deleted file mode 100644 index b4621aca11f8469f384e87d9d092d10c386e51f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9670 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 F{ueNDj8y;t diff --git a/venv/lib/python3.12/site-packages/h11/__pycache__/_receivebuffer.cpython-312.pyc b/venv/lib/python3.12/site-packages/h11/__pycache__/_receivebuffer.cpython-312.pyc deleted file mode 100644 index 8ed3974fbc004e334925e7ac7591dc5faae1b664..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4716 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 U8h9^H{Qq>t7zUgIq5TK{1wBX&lmGw# diff --git a/venv/lib/python3.12/site-packages/h11/__pycache__/_state.cpython-312.pyc b/venv/lib/python3.12/site-packages/h11/__pycache__/_state.cpython-312.pyc deleted file mode 100644 index 2ef5be8b6e9b465704902081acd27700f784cca6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8480 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 diff --git a/venv/lib/python3.12/site-packages/h11/__pycache__/_util.cpython-312.pyc b/venv/lib/python3.12/site-packages/h11/__pycache__/_util.cpython-312.pyc deleted file mode 100644 index b720298e80d4be46787a0427f42306a888b58930..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4731 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 diff --git a/venv/lib/python3.12/site-packages/h11/__pycache__/_version.cpython-312.pyc b/venv/lib/python3.12/site-packages/h11/__pycache__/_version.cpython-312.pyc deleted file mode 100644 index 9589a583ce6fa06e561e98bf14889a58c42d4ca7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225 zcmX@j%ge<81n=fmXRKplV0aATzyKqZ@tFh2n9h*G5XDf*sL52tW}s(irf1-%$#{!9 zKE5oqs5mn}FFt-H!)K6&U&;Cz`MIh3xrrskW%@4p$)&lec_qdAC8;^7=|zdTy2T}# z$=Rtzx+(ePc{%xsDXB&JWvO{(`Z<|N`URCG8Tom}dWJ^&#hE3kx&?{J*@@|?#rheB whWaq8^a?6}aoFVMr<CTT+7+<@?F6~Bm<LFFU}j`w{Gh<VFW$&q!~zrm0J4ogc>n+a diff --git a/venv/lib/python3.12/site-packages/h11/__pycache__/_writers.cpython-312.pyc b/venv/lib/python3.12/site-packages/h11/__pycache__/_writers.cpython-312.pyc deleted file mode 100644 index b954010c83fbfe8e4d94b51a030b04654d4529cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6307 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 diff --git a/venv/lib/python3.12/site-packages/h11/_abnf.py b/venv/lib/python3.12/site-packages/h11/_abnf.py deleted file mode 100644 index 933587f..0000000 --- a/venv/lib/python3.12/site-packages/h11/_abnf.py +++ /dev/null @@ -1,132 +0,0 @@ -# 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>{field_name})" - r":" - r"{OWS}" - r"(?P<field_value>{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<http_version>[0-9]\.[0-9])" -request_line = ( - r"(?P<method>{method})" - r" " - r"(?P<target>{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>{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>{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>{chunk_size})" - r"(?P<chunk_ext>{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.12/site-packages/h11/_connection.py b/venv/lib/python3.12/site-packages/h11/_connection.py deleted file mode 100644 index e37d82a..0000000 --- a/venv/lib/python3.12/site-packages/h11/_connection.py +++ /dev/null @@ -1,659 +0,0 @@ -# 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: <client state>, SERVER: <server state>} - - 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 <events>` 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.12/site-packages/h11/_events.py b/venv/lib/python3.12/site-packages/h11/_events.py deleted file mode 100644 index ca1c3ad..0000000 --- a/venv/lib/python3.12/site-packages/h11/_events.py +++ /dev/null @@ -1,369 +0,0 @@ -# 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 <bytes-like object>` 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 - <https://tools.ietf.org/html/rfc7230#section-5.3>`_. Always a byte - string. :term:`Bytes-like objects <bytes-like object>` 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 <headers-format>` 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 - <http_version-format>` 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 <headers-format>` 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 - <http_version-format>` 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 <headers-format>` 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 - <http_version-format>` 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 - <headers-format>` 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.12/site-packages/h11/_headers.py b/venv/lib/python3.12/site-packages/h11/_headers.py deleted file mode 100644 index 31da3e2..0000000 --- a/venv/lib/python3.12/site-packages/h11/_headers.py +++ /dev/null @@ -1,282 +0,0 @@ -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 "<Headers(%s)>" % 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.12/site-packages/h11/_readers.py b/venv/lib/python3.12/site-packages/h11/_readers.py deleted file mode 100644 index 576804c..0000000 --- a/venv/lib/python3.12/site-packages/h11/_readers.py +++ /dev/null @@ -1,250 +0,0 @@ -# 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.12/site-packages/h11/_receivebuffer.py b/venv/lib/python3.12/site-packages/h11/_receivebuffer.py deleted file mode 100644 index e5c4e08..0000000 --- a/venv/lib/python3.12/site-packages/h11/_receivebuffer.py +++ /dev/null @@ -1,153 +0,0 @@ -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.12/site-packages/h11/_state.py b/venv/lib/python3.12/site-packages/h11/_state.py deleted file mode 100644 index 3ad444b..0000000 --- a/venv/lib/python3.12/site-packages/h11/_state.py +++ /dev/null @@ -1,365 +0,0 @@ -################################################################ -# 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.12/site-packages/h11/_util.py b/venv/lib/python3.12/site-packages/h11/_util.py deleted file mode 100644 index 6718445..0000000 --- a/venv/lib/python3.12/site-packages/h11/_util.py +++ /dev/null @@ -1,135 +0,0 @@ -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.12/site-packages/h11/_version.py b/venv/lib/python3.12/site-packages/h11/_version.py deleted file mode 100644 index 76e7327..0000000 --- a/venv/lib/python3.12/site-packages/h11/_version.py +++ /dev/null @@ -1,16 +0,0 @@ -# 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.12/site-packages/h11/_writers.py b/venv/lib/python3.12/site-packages/h11/_writers.py deleted file mode 100644 index 939cdb9..0000000 --- a/venv/lib/python3.12/site-packages/h11/_writers.py +++ /dev/null @@ -1,145 +0,0 @@ -# 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.12/site-packages/h11/py.typed b/venv/lib/python3.12/site-packages/h11/py.typed deleted file mode 100644 index f5642f7..0000000 --- a/venv/lib/python3.12/site-packages/h11/py.typed +++ /dev/null @@ -1 +0,0 @@ -Marker diff --git a/venv/lib/python3.12/site-packages/httpcore-1.0.9.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/httpcore-1.0.9.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.12/site-packages/httpcore-1.0.9.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/httpcore-1.0.9.dist-info/METADATA b/venv/lib/python3.12/site-packages/httpcore-1.0.9.dist-info/METADATA deleted file mode 100644 index 8056834..0000000 --- a/venv/lib/python3.12/site-packages/httpcore-1.0.9.dist-info/METADATA +++ /dev/null @@ -1,625 +0,0 @@ -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 <tom@tomchristie.com> -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) -# <Response [200]> -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'<!doctype html>\n<html>\n<head>\n<title>Example Domain</title>\n\n<meta charset="utf-8"/>\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.12/site-packages/httpcore-1.0.9.dist-info/RECORD b/venv/lib/python3.12/site-packages/httpcore-1.0.9.dist-info/RECORD deleted file mode 100644 index 44d4769..0000000 --- a/venv/lib/python3.12/site-packages/httpcore-1.0.9.dist-info/RECORD +++ /dev/null @@ -1,68 +0,0 @@ -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-312.pyc,, -httpcore/__pycache__/_api.cpython-312.pyc,, -httpcore/__pycache__/_exceptions.cpython-312.pyc,, -httpcore/__pycache__/_models.cpython-312.pyc,, -httpcore/__pycache__/_ssl.cpython-312.pyc,, -httpcore/__pycache__/_synchronization.cpython-312.pyc,, -httpcore/__pycache__/_trace.cpython-312.pyc,, -httpcore/__pycache__/_utils.cpython-312.pyc,, -httpcore/_api.py,sha256=unZmeDschBWCGCPCwkS3Wot9euK6bg_kKxLtGTxw214,3146 -httpcore/_async/__init__.py,sha256=EWdl2v4thnAHzJpqjU4h2a8DUiGAvNiWrkii9pfhTf0,1221 -httpcore/_async/__pycache__/__init__.cpython-312.pyc,, -httpcore/_async/__pycache__/connection.cpython-312.pyc,, -httpcore/_async/__pycache__/connection_pool.cpython-312.pyc,, -httpcore/_async/__pycache__/http11.cpython-312.pyc,, -httpcore/_async/__pycache__/http2.cpython-312.pyc,, -httpcore/_async/__pycache__/http_proxy.cpython-312.pyc,, -httpcore/_async/__pycache__/interfaces.cpython-312.pyc,, -httpcore/_async/__pycache__/socks_proxy.cpython-312.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-312.pyc,, -httpcore/_backends/__pycache__/anyio.cpython-312.pyc,, -httpcore/_backends/__pycache__/auto.cpython-312.pyc,, -httpcore/_backends/__pycache__/base.cpython-312.pyc,, -httpcore/_backends/__pycache__/mock.cpython-312.pyc,, -httpcore/_backends/__pycache__/sync.cpython-312.pyc,, -httpcore/_backends/__pycache__/trio.cpython-312.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-312.pyc,, -httpcore/_sync/__pycache__/connection.cpython-312.pyc,, -httpcore/_sync/__pycache__/connection_pool.cpython-312.pyc,, -httpcore/_sync/__pycache__/http11.cpython-312.pyc,, -httpcore/_sync/__pycache__/http2.cpython-312.pyc,, -httpcore/_sync/__pycache__/http_proxy.cpython-312.pyc,, -httpcore/_sync/__pycache__/interfaces.cpython-312.pyc,, -httpcore/_sync/__pycache__/socks_proxy.cpython-312.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.12/site-packages/httpcore-1.0.9.dist-info/WHEEL b/venv/lib/python3.12/site-packages/httpcore-1.0.9.dist-info/WHEEL deleted file mode 100644 index 12228d4..0000000 --- a/venv/lib/python3.12/site-packages/httpcore-1.0.9.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: hatchling 1.27.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/venv/lib/python3.12/site-packages/httpcore-1.0.9.dist-info/licenses/LICENSE.md b/venv/lib/python3.12/site-packages/httpcore-1.0.9.dist-info/licenses/LICENSE.md deleted file mode 100644 index 311b2b5..0000000 --- a/venv/lib/python3.12/site-packages/httpcore-1.0.9.dist-info/licenses/LICENSE.md +++ /dev/null @@ -1,27 +0,0 @@ -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.12/site-packages/httpcore/__init__.py b/venv/lib/python3.12/site-packages/httpcore/__init__.py deleted file mode 100644 index 9a92dc4..0000000 --- a/venv/lib/python3.12/site-packages/httpcore/__init__.py +++ /dev/null @@ -1,141 +0,0 @@ -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.12/site-packages/httpcore/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpcore/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 52fbca5b6d0821010163457a6170e92fd2b3578a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3183 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 Sc{Zd04i_3zk!O>d#Qy=G>rVIp diff --git a/venv/lib/python3.12/site-packages/httpcore/__pycache__/_api.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpcore/__pycache__/_api.cpython-312.pyc deleted file mode 100644 index 0016244048ac164502a74dfc76cb5eb1561b6224..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3787 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 diff --git a/venv/lib/python3.12/site-packages/httpcore/__pycache__/_exceptions.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpcore/__pycache__/_exceptions.cpython-312.pyc deleted file mode 100644 index ed88643204ae2c2f350acf40d2c30b5d5d19c1f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3202 zcma)-O>7%Q6vt<F*N)d;apNRS(zJx6RCPmY+6swQrBa|3tte3l1yl=UZFeV)8++Hx zZayp$grXdZ#36i$<b+ajXrl;mLMkWdnM-m&lx+@3T;PJNrbt!kf%nE=YZO^K(!PE3 zdo%ApJ0Ckg$6{du<?pXQoLW~1`2#Dp60ADAPbnd*#2^OElT77JGnCOA(BuCFXsw?o z#FSpBwTewj*dh~P<VMufvFaKU3m7u=kM9wq*mF`blx1bJ8qS0y@)|J$%ftvWWmB%; zj4Egw(2$3Q1yzBDJv1U{1ZdPlqk_hO##ywUHzsI1(1eG^1>Fa<!;_(1&?L}K)?Uw$ z5VQ+uw}<W%bU)A@5A6`N7igb{CIvkJwBMuFDd<6<hgfG_txM2nfDU+Qx1i4g9rV!s zC7K%g3ny^Ql?z(Y4RYqpa8rj(Q7^dUL-6c=3FdV|VY{fXQNEH^DJ3NcIrXN82|u++ z7s!q3qSOQ6)Ryl&dB2a4_as6VrA65Z)Y>f21!)r~7Mp$wpS&P1(9P;d7U+_skR{Mv zq#w~aI!ET^t7MLTE6>ps9ZSisdSPB?MJH#OZXoBdg6)QLcFwdN&D2>+;W#8$X7jom zn&eg?i(b&N@NMH>AAs^?Iz43-Sh}D&_H6pRrOy<Y>DXz9<=J(v6-I0)r%y9JVpwx# z-qH-l)3eN+P3Lph(#4W9WtpdrpE#MeVE`jVO`q1TGdn%yI7Qv!ER9-~A=<}_B{vQ; z?m;{TqiDmgp8)eGdHgXcE5Sf~Clq_U6X|?NltBFcz|d{=mikTPA(7PK?P&kaiz|~m z?Y(P5YxBRfAN{Snf9<U=rq}JQ#IbS!T9kuCjsII#q3csS1!<S)XoxN=D!GZyC+cWG z{(Nwh$lpi6+#>;~-wVhP(xGv^)V9Me9^X~MNQN3DBf;*G-0oK`(_}hM{Fvp8&T6^5 zb}i4wHe@%H&6-+)WwUNLn=M$zOdkDcHv7ShmajxM$S$gIOw8MBrURT^+!@Q{z7pbH zHST**;c;%wmo9K_@iCsj?wx2vA|cg-RW#k`2qS`se5)kiHtm^W(c%s>K+v&tE5ElK z?0CY_2&W;3Ro`;4nnsK7>PI0ohtO#VA@VJhoL~jZVLs%93Yx)YIYhqYIxbtfmiM7H zfFfv)pwsv`M84G$S8@er%{UioXL0Wp6CZ?Tq*)7*Z>`9<W#y}Sd&?Zg>}XCj%OLVC z6R#e@mP%sI(7f2Jgvhs2WP)i%OPQmX9nI-x8AQHiqVIC}gSON;hUw9~+^mDhzs?wQ z<}5zl;y^u*>Cv2T)<NW7r@BBbbdF<sG#8t75c$?oad}#ZynwmUTy7RY<Xa>x7N>>E zNlcDryjcZNs>coMmg%s02kuO`fJ?=kdEIS$Ln{hLxl$@J9)y-|qJBba!FaW2K{MfE z<!<Pb!?@;HTwI-%>qGq5#a~wZ3dIj<0LLK?v^Z|!B#3<~Hj!9iG5unC#ORxEizlJ8 zmD}qaKLe@oHnb0bEz6YB2V~y^68k;byL#@kbL&TL58oQTliMDA>F$vqhkqFUDYt!Q zd~0xgJNf1oNx*e1MSrDz+qADNwbA%i&(Si0_nmjX%Wh=vUfCXb<ssI0Wg;CAEgp4J zs;*sqMBw!(1ZJhT;jg6{{>r6>zc%9W4_5p*_ANE|R>z>H()FCD(iBM!dHSDjv|2gq P@uMEU{~sKyxN83cAMR4# diff --git a/venv/lib/python3.12/site-packages/httpcore/__pycache__/_models.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpcore/__pycache__/_models.cpython-312.pyc deleted file mode 100644 index fb50b21ca8b306ec79f2d4050d27a0baac4ccbbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23133 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 diff --git a/venv/lib/python3.12/site-packages/httpcore/__pycache__/_ssl.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpcore/__pycache__/_ssl.cpython-312.pyc deleted file mode 100644 index 94f553c0ef96d6154b6b38b28dfdc324d9e2a476..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 622 zcmYjNPiqrF6rag%(vp}(Eqd`{Pj-dvVC%7XQSc(U<d#F1b>^kJ>F!RLnWP3Q<luLx zUKCLf=|}J*cq$4ltGAxKNFknj@=cQ=4!rmKz5nmcw|2Wp@cnuBGX08pZVmTp3o?6% z<cJ6&Xij=_q&+HXKnA``UShu{yw`ruo6ykzZQY%!p}>q($(Kol*h&v&W>6gwLtSv- z<~j%B@q)i1hh$LyFR-9y#rX!SjxEtuA1`K5?9wG6?S%Ep(>kwia|MZkSU^7+<tFB` zH1NVyw{n??cnm7*PvTti#ALG6)d~k?vVK<84^mJNQuNF#w4HGGQm|AOz>37^F?%BU zsDRRFW*~<>l@yUS8Q%vL33*W35un%@$}!8c=WIAJsVuiQA8aw58Hk1n-%s{Hv(%U& zmkL;nD{l@b)tXxuZMU+zh6^-Mbckw7eg!v9gN>75<9l#_`t;0io%-u1{`#kTpQ8`a zNA|<tI&0mWc4nANLSNahRrUv~X1Dw7@%*T(o?nP++h7aT<?2o$#VChI>N=YCW_<_M cg-0p<Nt)**xM+BE?M?Un?%UnJ1nE`rKM{(OQ~&?~ diff --git a/venv/lib/python3.12/site-packages/httpcore/__pycache__/_synchronization.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpcore/__pycache__/_synchronization.cpython-312.pyc deleted file mode 100644 index e8544e9c2e5e41c9259cc23a05f70c50fb8c426d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14197 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 ao7i>5HMr4weS<`4lVfnJ^?HYd^#1^VXNNcd diff --git a/venv/lib/python3.12/site-packages/httpcore/__pycache__/_trace.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpcore/__pycache__/_trace.cpython-312.pyc deleted file mode 100644 index c63749a00737f3f64a4a66d6e58a4aa31c3d4037..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5614 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 A5C8xG diff --git a/venv/lib/python3.12/site-packages/httpcore/__pycache__/_utils.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpcore/__pycache__/_utils.cpython-312.pyc deleted file mode 100644 index 0e26a1466f5c0d7f01f709f72636f816da66b0e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1302 zcmYjQ--{bX9G}_UY;u>R(YAWxQ5>$&Ua*(7tyB<EPsAUkT&4BJAcRe3l5B2wXPuc` z*t)?K1bf^=QxvX>=soygiQql<fAHmK`*5r$eP~~Nk;3(<PtI(zO@`(B{qFbIe7-;C zuVQf?$n)PXU$>zNz$5jO9&IeZ!#AX`4KTpa1s<$IsASF6s#?PJs-AG8YG4EF-x}3S zsFgGSs_-(5^S19(VGD=)e60b;NfRnB1Udll(3je65P^Y)p<jwXXVz;HFq-f_jNtW5 z1hKX*0WuisVgeL^jxlkXVc1w-27tdPvZ+$!QVC};97zP~43@>*Sdw|3d!!lwBG`g0 z(2|9ZCbxVkBl}uk@9QF;`bFAkg8eF($yZ42Q~tajBQiRrsXmn=IK|m{A=OU#C>;-& zx!vd#ryi*!5l=9s{3<A$*B;Izd9D!AWj^Y)iD(msY{Y3}orp8Y=E%Xs7fzF4R1c9O zIBGgBL74Cca{@ux8RT%ph>h*KODajarPWD-S<@2oi0yME+P08{Br&MoZ8qhN4);$B zM7%(RGGB#M#%>MUbsfKzB&{&g*jO$j>Pr-;N4qXYj^`2V*n+sBOqbNasVC9d!X86e zW2!@+$C;kvpFbBH0d?K-Tx_Z$d>ZRK<Z&)=ZPBF6i?b~vcT}+0<isTn5gT<%U8Ytv z&N0$*xFFK_+2u=@K3ywkVng*Q&MI1K;@D)W4`B>zF${P{MyckaXHBauQCXfX_=fc% zZFD`^Qf^7uq{VD+g$qZvo2_8l^Id9V!mJJAZ&<EVw}Mc#seit5_MF8XK~@60v2M2r zx7tDk4a$gB>k7x^l^~3dI=nWXTrC|4dr6{Di_CwJWB{JL0u~mB?k4`-_%nYeKPnDB z-p?Kxd~^Hs&gxIE@0X4}JqqRuHw&AE+u3`$*M58Jj|;mO?!I~d<okOkKY6@xV!MB< zzth_JVprS!;4Zws@b+fmhB<`8vj?SP!;iM2z1-qK?#RvjW`3(USlu@=-(9?Z@kZ}w z^Vi~!#RtZzgM4WSx6NDT@T>3Vw%*$_UOkk!K-pkw`>!1z!>^1PiqIPMiR^1KTc#dR z*^K9FwPsfio78Gdy<4Upo*Y@SvrHA6RDB1qmz8{6l4rShJc_$6d6zB9U-c5WGCt8E Vg#Uo0N1*t(`sSaSC*Wcd_di&@Jy8Gv diff --git a/venv/lib/python3.12/site-packages/httpcore/_api.py b/venv/lib/python3.12/site-packages/httpcore/_api.py deleted file mode 100644 index 38b961d..0000000 --- a/venv/lib/python3.12/site-packages/httpcore/_api.py +++ /dev/null @@ -1,94 +0,0 @@ -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.12/site-packages/httpcore/_async/__init__.py b/venv/lib/python3.12/site-packages/httpcore/_async/__init__.py deleted file mode 100644 index 88dc7f0..0000000 --- a/venv/lib/python3.12/site-packages/httpcore/_async/__init__.py +++ /dev/null @@ -1,39 +0,0 @@ -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.12/site-packages/httpcore/_async/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 1b41e68b3b9cc285bccddef84f984088a140d719..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1635 zcmbVM&5zqe6n|qoaXuZ|ZObB9WC=tSZ8s+2iV#sjP$4ZVS`IZrUe}&(thGI6JlSoQ z3!pu6-y1?)(5g31TzlZee_)XlCoU*zkU-0Yd6UGEN;yzV{>_{B<>&W)Ge5W64Uo_8 z-+Vs$$pH8jH>;<z6y`rl;S53uNel^b2|-zlwM2JyCF`+~RNRV^jkubauBqfoTubV1 zoj@HUs&OM}y3OUT9=8+AwFn$Q*!qsRok{x@psiPdw+U$Q9)#v8gtdp-q6)Wp7rx#) zh6nmxI3`bcHl$~>^t7bs_R6zs{YGSlE-5yK`6LbAzjJ5rCQDNqh=`@7dac@HESBo4 zrFXx-HcEq48umDQFp-)~rCB@ON(JTj{eVi_mC}2#b_kY@Rm<}KV17kz&wzqULU6TE z54BUn)hDED@R~I32KXPVN0&lJzVl59XCO*jNFFZbuSi$hJ&A@w&?FNyv<0)rIkiVZ zWCJ@NXBp$-hJ9}=Y%!wt{%EjoXMS+#A5c5W?UV^SN^{}IF%5h6$1?JI7G*1)N)s?n zKT-KUz1}+~MeCz+Dx!qG%Q@rcdST==zF!zVKgf&f;W4f`R&Lw&1#?C$p-$q9{K$ES z1>=OKB6kFh=>hkXom@o0A>}(EJ5FQfhm<=<G(B?S=$?~J#E7MD^!fuQj|AOWmYq9T z3l`;gJ`UUQyeN%?=k>BlQCn?Jww^YW-pbs<wqBL+1^jaP<(Wn<y-nu2zG2NkZ(DO| zfOD;=aw^6=-90xjaq1`3^NNP&B`h4rD7QTCv#}p9Ec`M?0mm8hO9(hp1x+c;O$n#) zhi25Rg%6q~eLAYr+aKQi;I?Ah|7OmX%=3)QN&m$hRmW49le6G3kJz)(M+HmzaBKu` zOIT54(J1WP$>NBu`%n%G>CZP1RBLf;{CR{IOPy*r_JJcP<4dIxRb7)KDY?A=fL9Ul z=37h%2czP4yU!Jkpu9L#MA2C*yiDF3Dn(I67WVrpOVPlMm*G{Rau<zgbv@)9vlkV0 zfYj%T=B)%zr8+-FQ?+Ipi-i`Z=gH&fc~AV^MeWT6?cU;D>4xV&-<L4c2_aM1p2F)> z=uY7^Da?#Iv8KlM?3!9{Jib<IYG0av&32%+@fb{E{b^JxlI9X-6}kO;w)r2Hi`<qU d`L;TM@2f)-e&`Gh{gF-(&Cc)z{m~|o_z$v8p^E?j diff --git a/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/connection.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/connection.cpython-312.pyc deleted file mode 100644 index 859312337d09ba955a830be7d86dffa0efa4eb5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11812 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 Hux0!|JkmSz diff --git a/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/connection_pool.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/connection_pool.cpython-312.pyc deleted file mode 100644 index 43b086501835a6494b9fc9297fd61429a4493fe0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19692 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 X>7>8+Aw@!u61IAJ^8*Szg5m!KrG!%m diff --git a/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/http11.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/http11.cpython-312.pyc deleted file mode 100644 index e8301d50c882da29649b3a778832dd5d83624b21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20254 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 diff --git a/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/http2.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/http2.cpython-312.pyc deleted file mode 100644 index d69782037871597a4e89d41ccde5cb00ff20af8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31457 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 E2a6v+K>z>% diff --git a/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/http_proxy.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/http_proxy.cpython-312.pyc deleted file mode 100644 index 4fd9ad32a1b15e0c653efef4c9a2572cd6fff7e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18012 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 YW$z{h>E<EbgbrSrJwK-qA(Qq015%tfsQ>@~ diff --git a/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/interfaces.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/interfaces.cpython-312.pyc deleted file mode 100644 index 8ee36c1c047094e0b5ad4fad10f1029b20266954..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5766 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 F^B+b@gP8yT diff --git a/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/socks_proxy.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/socks_proxy.cpython-312.pyc deleted file mode 100644 index bb7b39b513125a952d6b8c579733d854777fb646..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16909 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 diff --git a/venv/lib/python3.12/site-packages/httpcore/_async/connection.py b/venv/lib/python3.12/site-packages/httpcore/_async/connection.py deleted file mode 100644 index b42581d..0000000 --- a/venv/lib/python3.12/site-packages/httpcore/_async/connection.py +++ /dev/null @@ -1,222 +0,0 @@ -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.12/site-packages/httpcore/_async/connection_pool.py b/venv/lib/python3.12/site-packages/httpcore/_async/connection_pool.py deleted file mode 100644 index 96e973d..0000000 --- a/venv/lib/python3.12/site-packages/httpcore/_async/connection_pool.py +++ /dev/null @@ -1,420 +0,0 @@ -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 - [ - <AsyncHTTPConnection ['https://example.com:443', HTTP/1.1, ACTIVE, Request Count: 6]>, - <AsyncHTTPConnection ['https://example.com:443', HTTP/1.1, IDLE, Request Count: 9]> , - <AsyncHTTPConnection ['http://example.com:80', HTTP/1.1, IDLE, Request Count: 1]>, - ] - ``` - """ - 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.12/site-packages/httpcore/_async/http11.py b/venv/lib/python3.12/site-packages/httpcore/_async/http11.py deleted file mode 100644 index e6d6d70..0000000 --- a/venv/lib/python3.12/site-packages/httpcore/_async/http11.py +++ /dev/null @@ -1,379 +0,0 @@ -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.12/site-packages/httpcore/_async/http2.py b/venv/lib/python3.12/site-packages/httpcore/_async/http2.py deleted file mode 100644 index dbd0bee..0000000 --- a/venv/lib/python3.12/site-packages/httpcore/_async/http2.py +++ /dev/null @@ -1,592 +0,0 @@ -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.12/site-packages/httpcore/_async/http_proxy.py b/venv/lib/python3.12/site-packages/httpcore/_async/http_proxy.py deleted file mode 100644 index cc9d920..0000000 --- a/venv/lib/python3.12/site-packages/httpcore/_async/http_proxy.py +++ /dev/null @@ -1,367 +0,0 @@ -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 <username>:<password>"}`. - 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.12/site-packages/httpcore/_async/interfaces.py b/venv/lib/python3.12/site-packages/httpcore/_async/interfaces.py deleted file mode 100644 index 361583b..0000000 --- a/venv/lib/python3.12/site-packages/httpcore/_async/interfaces.py +++ /dev/null @@ -1,137 +0,0 @@ -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.12/site-packages/httpcore/_async/socks_proxy.py b/venv/lib/python3.12/site-packages/httpcore/_async/socks_proxy.py deleted file mode 100644 index b363f55..0000000 --- a/venv/lib/python3.12/site-packages/httpcore/_async/socks_proxy.py +++ /dev/null @@ -1,341 +0,0 @@ -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.12/site-packages/httpcore/_backends/__init__.py b/venv/lib/python3.12/site-packages/httpcore/_backends/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 286ce0e0f9ec2e7c2ea29cfbfbefcd4bf42914ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211 zcmZ9GJqp4=5QVcwL4+K{A{o?HtgOAlvPp(yN%n``NhEj>JA2RKG3*6Nm&#4+gE#M+ z#}xBQl1&u!dEDwb-}Cs_xD3rb8lo+`JR`RV+c@7$4r-$ilpx>3*%X~ZO&$natejA( zCs{P;($ZXYYeb0-del9%G6y?QZS*1A?ZHdJ)QX}J6?&+NY+)P%&qIZ}^uW2)k~q)o ZFs+ZulwFG_w+b(?U_Zk*W{kNw&<`i|JG=k@ diff --git a/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/anyio.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/anyio.cpython-312.pyc deleted file mode 100644 index 166b08fd716f2a99029639212ccee73aaed53840..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8641 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 J5cs7}{{PBy$cg{} diff --git a/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/auto.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/auto.cpython-312.pyc deleted file mode 100644 index 9fac62e32373587777c56b25ac4232173e56a84d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2703 zcmcImU2GIp6ux)<_Wy^LT__+d3#A>PyJ_VoCQ4Yv03mKoz?U_3GTj;2h25F;&MdfP zF$Nlgi7{#-?UOIQXsU^cPa1#1voBOkx|u+f5E6MYn=D4`ljqFrwp&tt<F-BX-E+@9 z_uliJb8ml+M1lm`pPybXy)6-PA3MD!dVqHF0Op8BG+H55TA&m$SK$hr#%n@_uL=bL zbfP9z#Hv(~s=k7+>M!^y;mC2K`DTgc*L@4T=dTcGaB|=wc4X>=RKqZB)h?Tcm4C>2 z%0#iwm~PmLYBh|aQYlX}l{Fqx9Oa$J>B*N)y?jQQeD%!9$-Fa|L!-QIUozQ+7uDhg z-O!wYe&uPK>1wrzEB0D<FSPRpXy%Ac3REL-9!aCKLV*tu{Ly^g_erVwHGWns2(C?F z?Wh*i1Q-*wkS2mB3C<dJLb<wacDGi<Q}mhu;2I&c^8tWUgu+(rmGLG7d;uc@%{pjz zw@k=_ry^HqlWN?BQ9{_DO9WTtuW%UjCfBoR5(U?ATZ4d=h!kDnT`PWls|NXszeHsz z@A#GJZaf8>l}!d2;&OHdI^E*{h2fmhI62wt`y5|MwN%??3=@b&QN&P0KscgmG{93F zuq-%&rB}{6zV0fX84g*v=@hhOBU>`7dbX<C*2U~GvskY}URYUMujuEPS{<|OGBD1@ zH1m>CF;z`x*^9byF$+19tu^eDX*`=5pU7HeTOX^zVbpWFl`YwJt!Oem+dH3?Re_;Q zt>HwJvQf5s`kA3V<}z!Bux_juK>R@-zeDcCH_Z$4=YNgMcar;VC&#WIZ^e@Hdwz+f z?#9RN9X$HY)Q7?+kq7bYz105CqKMmrWW(NnEDY(@9G??uzKFQjd;r|c_!xkf8BKD2 zB{zCztJ!c3it;k#$PI3ee^(SCm%zT8J*(D)obQ%(zphD}T$67KP4P>*&>er$-)VA~ zyuTm*BsV*_JXE63E?0H4Zaa~RSyU^Es%cEOEGKH2K#HxHHMg#1o+V*9F9AYD(=ha+ zt=PqyEU`ftaD<X+*^W>%nawt%<q(Q3Al&$1BBW9*fy%8QW;XS+(&rCXv0ek=a?*~I z*x*t$wHQs^j;5FV>0ADED={=T_0iN)BD0vtw8C-x-MF>2Wu&!LZih%R+aXdi_&1T_ z!8VZs!8T6<yB@bW=r3D4!1L9OIUl`2bG$G&0_aDY6NR5dKsQASvba)hV2hD_qPm|p zhrnO=o>-T^z5V=gUaT?9YZw~rMYL{|-%>m(WuePdO|?s_^H%EABL@RCvtvDS`dp2G zk@X4)kEHPbkaTD<aR?ZiANe{1L?jP)2#4fwNDjA34)j;Z5s@4!%nd_DeUCK#AOgC{ z15dQrUk(^1mz?VWo_>KXbW3+#T1HlAp-@(R#Uff2U9ZWU7kr<k12vju;W>H*kp?`o zp+DyCoC#1{&w+5G+=>qTS0RipCPqKsbUQJ=6dS+gANLZz6&qi+w!>^lcMc+YM3_qh z_?G5~@SO<gCZQl@&XJgI*O}o6dDGBkKA+FaVYUrsI=lr>z%wo?8(v*6htI+tZKs+k zw05g}CJ1Id1*YQiu-&MYjdPikw$9Y)ivIeV=YFbZyBlm-0EEoJntqnT{vH(W4Fa#C zcY`n)(W<q;c7ehX-JN*)VNl3Ec<mHJt?G*61Qn%fYV``@u%f(KS1aC#M-ARV40D}f z@V_7(ki@Hi5F!+~GwVGNv!ufX#cVr8b`H08kG75;Ye!;Y@b~D3wg}(0L}CMNA0j^) z*xn8x3X;v~b_h|J3>|Up+ffqS)`_8R6g`2PK%naezTgHX`w;nY3XXvrm=Xf?D9MQv zEZf_g9K;iztpjmzLWY&#NM6*PxPt#pm6&OiXWakF+*jNYrd3O4_$V<y3Ot^BPL@IB zy2kr?+5fy3xg+cVbTR3zogmsgrSvXI-zSj=<iKy_#3DKINZLmyZVe3oMd0hY_!laE BVI2Sf diff --git a/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/base.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/base.cpython-312.pyc deleted file mode 100644 index 2effaf849fc0bf6a66374795ab9af8b174d4d3c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4905 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 diff --git a/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/mock.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/mock.cpython-312.pyc deleted file mode 100644 index 969079364a16c1e60ae226732ec55f9f83ea0875..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7169 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 L@B4t7#47z4Ptu{V diff --git a/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/sync.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/sync.cpython-312.pyc deleted file mode 100644 index 069281094e1b30dffb33bf24a8b602d000a9d40c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11442 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 UK9?V|+|Pw)`+i5@!FK0=0Z8t|0ssI2 diff --git a/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/trio.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/trio.cpython-312.pyc deleted file mode 100644 index 425ed2ce1be3df0189891dd37b893e55850c25ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8978 zcmeHNYit|Yb)NTdNQw_plr35Bhb>CBB(JqzxodA?QTDzZIklVw%j}w^I3t@fAIi+g zwzO2b@EU;@a2p#fVgp?SUcl(C;RI>_r9gq!)Sm$TBU%o~PF%pi?vE}C6x>LK0%r^K zoI5ilMbnO9?9X1ohj-3B_s)Ht?>xr;*3jUjp#1mG-#?e!K~bOMgI##DLT_Ay$_+}U zWI9Qu=m<??ok=nghWxS-mi%%NPG)5;$)|*fkP;(e$`Ns-q==MqMw}^E#FcVK+^L30 z1N7%*A?ZnZBi@uR;!F7>ewt#a*C|=NLdg!rf0s4i9cd(73Aj$hSLOy5nUL#C6baFW zE0#`Y^q8K=q_wFp8Du&PcQ}(yD{=jps%BKfV?CWtq?F8pZupK}iYxQj<2$kW`9%7x zA)QiUvMKDssx9gKftt`2v%yX3c8ez!n~y5?INFyqzL+%{rcZ|7K6W~K^1G+sJUL|q zj%thP_>`hw%&6xlV)64zS~eQ1nbW$e#8Powj9sk7(;M#s=LV%v5n85Tvn83n!og-c zWtYre;bFU-vRme$#>)*d4{d@(NtEnCTKSW`vH&uo?1Sy)A`aOvJK$G>O>8urr`1Hp zngi~gU9b-Gpf?(!a)Zj!St@F`QH#_adJ48)jA~@|cNl}yl;o@-n9mya?&^A+9yymu zDI=+vu3Z?J%)}Q`N?O-ObS0^rRb#1rnx23iQTNH2i|J%0CM)X51too9B$=2QnP1e; zWzq+R_rElv!4d46hs}$fRkV?Fx;`JzsLDum#@tUB5Y{j}zi2q3(L_3-N25!D%Cd%S zW;0AmlYo3c6?e3+aDV0Az!go!t^LLaN`!wO;<|6afxb=AxOV0PmyX9vicH_N>S;R5 zEVFuf*XB4|rt+%`cD+i@Ve=}#I#EM>u99<C+U;6JF2OEyy4U7sIeS(w!<_Z<ispQ_ zMCCWjR?B9oIXvQ;G8e32z+;yF1!MR85Fp@vc+1bY8|+Vbo?7O!d>r8b{_a{kLQ_w2 zrm0t`t2=wC{gg&uWN7Lgm@Q4E*-Pv@)I}QZZp{dbRIThHWy=1Ny-0`HDT7U<XW=SJ zso16H%%ZMnA(z3=!fnzG4)2BGKAp)-Co>m`603OrMqonCfF_<&w9JAUH`QCkQ!xVJ zWJXiu?Jal?hI2NSNJe9`x}vJMIfh$R;!5Iz64l_2hXfVilTtgdMbs^v@mQ5;Mum$x zYlwgsQNRs@lVf^J!@JQ%irRwxI6wk<$y;@Gk%3LxKLYtr>JM;pL!+N{ejL2H@NwI( z&#rjBaQh1G_Po3O<M$t8wJ-1PyPc@2mPD@Kxgu^lDNozY*Vh~RzM@#E?V&$-qw{*_ zt&Vm7=vNfe&{pgl`1HglCklN>@_k2sBdzrvS?@bl=s0zaEAH5}#e+l%#kN@JOh$Or zaq16Stj&L1Y2Cu{iOAR56wLba(U!1>zPGD6%&_<NcTMc&bAEba(2;B8vA#nBey+<2 zGPyw-IeYnum!;f(5&4HC;IA@#*d?xtBGl{a>eY&_(i*+^{~8PXj^$YzON{t7ZGBSr zKv#pc`ggU-)W2GOjb5tl@ct03hVaLwcEXR^g`^va3rP<W#67ha32K?zhlHq?LjzM8 zjU|&Io~V`~%q+~#g7WP~kv&KTfN1EYROt|Z5e@c|uS$ssryphi9thE*fA<E9?#4$? z)1_=hf##~Jb##f54sF*Zy5Uf<x%Ec!da}?wly4sThvv2Bq4nnRf^U4yH@?L}JE)Cx z2oy#-^vE|3N(8JD1>|w1;cM*;nCj)DZDEeS*U>yN&fXg%s?$VNC&;0qv^apD>y|*K zMs<)s&WC9+cSMBNc-eTtplBLCL<4skDwctx=Ad3%=1{Vx+_j#|@Xwg=PlHPUmxV`A zR+~U5#F(cj#Nr63a1jt5HJnHn0XuaRs!RT=V=^TVpjaCa6YV^WKTUp=EO@%}p6+!| zZ^6-f-_iS6!@F|1V}QOz@8&)c2IzRT=`EXZ9~dHQh3r#JIGWLK*n}sTWxmP;*D>Q@ zbUm<yngUK1BQrAl3+}GvdoK&R-xkX9w(&(1FI5})ItF~ZLy#5f8T2PklebT^77A*g z^<Cvz3HGdrY45Csg{vJlT<GY3k<tfHuq?tJplPcq+vWtP`ZF@8S12CVoE0yFBfKpB zSiDGIwA_H&_tl?SmCL|S5okJnJj59;O-n}OnY6B4(haYss23D9dM=~s=~zlJeCTOv z(4Lxy=wc?RfV?T9C1fS!sRcDO=O(D(=^4`W^a<0kCaO@uH^VJwqUU01SvwayuNYD} z7$G{L;$emyraSQx4v8vJgL;M&XKp&%1`A$=hTaQ-K_I3#A!&L{)uVb+TWYFOvoiM} z^w9nb2+_2Xn;P6--?R8}1p<>Lo+a*tg94B{bNx)w?fdD8k4_YK_7>ZQitXLSo$Z@0 zq1n0O-1JmD4nb-yF?>Vo!(hve==JEWGwZ>zuPE9-R&4DnwC>Nh?q6>`P-r@^)^q^i z&_A}tLk}3h*Lrhs-P^zB=r2iBa1621KL%LoAN%7Mfwtd+N79O5d;a?QzeyE*y?I}6 zvAN}%^v4o7EUk~Xq}oxw)>K&U<)fiVfxb6Hhez3a`+{MP$uUh6<9x1}o;c{p?clJ! z%Yppf07&Kz(#SzTl?b3RtDF?x$FDX7!UOzj7ai_(tagi7AK;O{kA;y}NBK!sTz%OO zBgD%91FuJ@0%)Z-E&vxJE15nImQ4M#N{j)jQQZSNVA0DUH-}fPrr2J$+FZZ)9Nv(c zGL3I%$lC{?m#d~39&L4;s{>+l<>;f*&z2`6voAby8T6hqGDk*UsK3%>rfMgd=iIeD zS*Bhb^g?6NSNA++251^<ihXVx^A>d(3_!h|CcDX#HFv|B(UjH{xg7s3vsw08z&Z`4 zIwVY)2$GqZgCvRJiYF5gnMY%?td>EJJP29_B6N^QXi*GCVgQ4o2E&=q5@|q^bX+mP ztqbO(BBB_sC_<ApaAWkWqC<d$V_0ydew#=EAK3(GUGOlkD5{CNx*AJs^BI6H3*X$+ zq`!%!h6hIkyjEivQf1VmFkFZ;T||y>b^?dIMMH%_P&7S`H{ofir3wnSkM!rzto<(# z2(nz>YlrW<I&Z)Anf|Nno$NoK{+BcVbml?diIPAy?YwdL`r$%gC?6PFa}S~Dk^8Q$ zVqixhFqjVvt_SuO0tfPe1BJl1@_}!y2ac|}k3PTD_<h%|BEaOk*WX<^{;;v_=J#)( z{`AZzXC5?;6<azBEu;CC(QCpcO9k5Prr$P>eF0Cix8=g_SMs}Gc@P+1bC0hD#*2ZL z8%M4mS#x)l-ydu#1PAiLfzNiX2VYt_4ibexe?HK^9@w+y-c$4jRJ82d9L6$U6`=+2 zs;;xROjjJ9EdAU%N6*zkr573tb*}8NZks_lvjWq%N{!CZ)0FA73g%^=05LOI!5gi< zj^qs_=)qXIE%QoE0%NJY>PkI%-xch05(r!?h`QUZx2*^dJv(nU-){P}<CBgDp3!1( zS0T7JAKbfg9M09-VmJNPGx`NQ?Y`Yt=sA$@Iq<+cw&oaH^Ntn0!IcJbP;l|_wl8^g z%z(va;=`7f2&$qlsA+?n%A^&0aU?kb`4XLY6OY{_OVX9?A~Gjn9D_GAD1y2Vp49Im zA>kIzUquP^J3zp>FW2udQ&Zrrprf+n0nHx<uLrWN=ur{J<*^gA*nUUNSUwz!Q{RFg zg9R}%>XK7m#FXst(e$GAq9s3BUNsDaoS5uGz=%c-XEd71$O}oVyQ9$`EyR*$i`oi9 ztAj{}k&GgF6$xU2il=vnA{%KQC%Rt5|H24Vn+9@)+F)qDV^eVQZJRsY{Gp9Dn(qT= zY0prxtFI)r@Vg%cdrLh00yebvl|-yLsKyS`R&r9#whb5XHV!uOO`8Ke-)z1QUloUc z<zii4dgJ@Rsw92QG_K57(z(?&S&$h>?Xt*|#p)J#c34Sb2~xydgkPj#(_DC0tvvKp zyxNT@M@_$hAkB)J_z#$~nA&?*^dx-K(UV?wHMS)?#j0edXvZASk?btTCpEHo05t{U zuPg^iPU|enQLdfjbY%HS>OF8ymL-PDI_Bz_^Q`pO5UE@ZaCjm$$;{eky==(;(qXTN zL{SH8qnb(-wLNiKe}t-Nhc%-e_%Oj?Tw`!(SdE5cCLV)iCYXCg(?ae)5y^-rr_JOk zo(xIR7~aghl8)-}dD}=kHPfJH=5;fIaheg#53vh=$1s89J*XKT%OL<+{Ag22<`6J5 z1dETrjn>;NW>DjTXbr#X;H#H*R9)ubs)jUl)P4uVjBJ`Hck7y~yV%~jGWFE-X?2kE z&>i^Ock3j31ZiY@vWIUNc{n;&7@f?IP8M6*Z%zKXVUuO{H*QhPP~$ZL5TSG5?;%_n zxputR)PL=Gp{YOL)PL*3{iflsAe0%|l3;`_7REJ$o!#r+?lnhu$pzgZ*n!3p1q2d9 zwIX(cC=l+U?**H~ZuZ_#TbSZ=B0ce%Bj;$vdanccxgnIvy+#9PmEyyaw91RXUv=~0 zPI1-mht~S(lUxM|SONs>Grxp<<7t$q00CbG1lv*~75iWJt4G;GejXsO)$s`k5VEWV z0U|(vP!|Hk7lME?P`xk&RE<yt0gMF!e?rUEGoUb4NeUm)@P%~ZlI6dve}MuBn^txL zz$B)hGxa)#ZRMma(PMQ6cy;m;0b5h6#$M{Ir^;0VAK_SeAa=6i8&YYmR;5`>rH|!D zkNvB>KKgcH@a=0tv19Ku^_YilTPzF)-&r7OVe7F-4V|Dtk)gFj0Rcs>m8mFlCsAYx z6uD*M2%qEViB}ytz7^|Tj<Ce$1_I$uI`=A#oFjZ#kX9KH_^T2hZWC8MerVm6Xh19W zAtoBo!7?p+B`mF%V91s~ZI-Y7GxED#Fsi|8Nky3lKMhTpA!-U7uB>hIkrU8jCVDNu zW0>^$Ij}W!Udf3*ghcP$M{_rKtb4i(j_&)8ZY#;#(o6px-OYV0^y1e(@HO2kF)8Sr znRW#~GF5r0XkpY-NbpWR?zg<jH{rV-2CqNd_I>_6+cPEpEc&A=hJkRwXR%IRQgK?z zB|nc1WpQv{=a50ZZxAkVkOdX9>+1KApg*U^k(@<>+oApd$u1<A0#)C!NeU|36(CnA za2>n*;j>)v+moe+7QW|^$B%Ai4;U41Bf6PAWjC`2WOw$Iz|HId&$Q(=B46^L>*+<_ zVH^pDkpk8*@C(C$k1Ar#fnBi8@>Zd?IY{$8<^*wWp(gaPXBQx(03Tb$iv<q5mNW!& zcS*1Wk$>gCL#UVnRnfmx(Xk{SSIM_m^Mem&nh4ey+)NCTs+bH{F`cB6GeD3rH)Z=q zJ$4*69sSqTAAtziCrUdGq{PxR{U21%=alnzRKw?#Ym1X;W{U!{fn=+RqTi(R)Ek?^ d_h`C#&ELC8VP$ikd5P{>YwZ6Y3Vz9Y{|~>g63YMp diff --git a/venv/lib/python3.12/site-packages/httpcore/_backends/anyio.py b/venv/lib/python3.12/site-packages/httpcore/_backends/anyio.py deleted file mode 100644 index a140095..0000000 --- a/venv/lib/python3.12/site-packages/httpcore/_backends/anyio.py +++ /dev/null @@ -1,146 +0,0 @@ -from __future__ import annotations - -import ssl -import typing - -import anyio - -from .._exceptions import ( - ConnectError, - ConnectTimeout, - ReadError, - ReadTimeout, - WriteError, - WriteTimeout, - map_exceptions, -) -from .._utils import is_socket_readable -from .base import SOCKET_OPTION, AsyncNetworkBackend, AsyncNetworkStream - - -class AnyIOStream(AsyncNetworkStream): - def __init__(self, stream: anyio.abc.ByteStream) -> 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.12/site-packages/httpcore/_backends/auto.py b/venv/lib/python3.12/site-packages/httpcore/_backends/auto.py deleted file mode 100644 index 49f0e69..0000000 --- a/venv/lib/python3.12/site-packages/httpcore/_backends/auto.py +++ /dev/null @@ -1,52 +0,0 @@ -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.12/site-packages/httpcore/_backends/base.py b/venv/lib/python3.12/site-packages/httpcore/_backends/base.py deleted file mode 100644 index cf55c8b..0000000 --- a/venv/lib/python3.12/site-packages/httpcore/_backends/base.py +++ /dev/null @@ -1,101 +0,0 @@ -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.12/site-packages/httpcore/_backends/mock.py b/venv/lib/python3.12/site-packages/httpcore/_backends/mock.py deleted file mode 100644 index 9b6edca..0000000 --- a/venv/lib/python3.12/site-packages/httpcore/_backends/mock.py +++ /dev/null @@ -1,143 +0,0 @@ -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 "<httpcore.MockStream>" - - -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 "<httpcore.AsyncMockStream>" - - -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.12/site-packages/httpcore/_backends/sync.py b/venv/lib/python3.12/site-packages/httpcore/_backends/sync.py deleted file mode 100644 index 4018a09..0000000 --- a/venv/lib/python3.12/site-packages/httpcore/_backends/sync.py +++ /dev/null @@ -1,241 +0,0 @@ -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.12/site-packages/httpcore/_backends/trio.py b/venv/lib/python3.12/site-packages/httpcore/_backends/trio.py deleted file mode 100644 index 6f53f5f..0000000 --- a/venv/lib/python3.12/site-packages/httpcore/_backends/trio.py +++ /dev/null @@ -1,159 +0,0 @@ -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.12/site-packages/httpcore/_exceptions.py b/venv/lib/python3.12/site-packages/httpcore/_exceptions.py deleted file mode 100644 index bc28d44..0000000 --- a/venv/lib/python3.12/site-packages/httpcore/_exceptions.py +++ /dev/null @@ -1,81 +0,0 @@ -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.12/site-packages/httpcore/_models.py b/venv/lib/python3.12/site-packages/httpcore/_models.py deleted file mode 100644 index 8a65f13..0000000 --- a/venv/lib/python3.12/site-packages/httpcore/_models.py +++ /dev/null @@ -1,516 +0,0 @@ -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.12/site-packages/httpcore/_ssl.py b/venv/lib/python3.12/site-packages/httpcore/_ssl.py deleted file mode 100644 index c99c5a6..0000000 --- a/venv/lib/python3.12/site-packages/httpcore/_ssl.py +++ /dev/null @@ -1,9 +0,0 @@ -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.12/site-packages/httpcore/_sync/__init__.py b/venv/lib/python3.12/site-packages/httpcore/_sync/__init__.py deleted file mode 100644 index b476d76..0000000 --- a/venv/lib/python3.12/site-packages/httpcore/_sync/__init__.py +++ /dev/null @@ -1,39 +0,0 @@ -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.12/site-packages/httpcore/_sync/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 22e41a71f189d868a9cb7ec53380229eb6696b72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1589 zcmbVM&5zqe6n|qoaXy{4fwBmSjHtSb%En5#BE+g7sF0QwEr%K*uWL^?*7}Q?@ouwR z0PT_c-Vow~R=siJ+B5%wMNXW!pr}CtEf?lZzNBqAP)qswef#CT-^?%Vb_3+|$9G?j z3IpIbRF+R=A<TZ3!YPChk{A-=5`wZ8Yl-gaO4ef|skjv-8*w!;T~o=GxR%u2I)OT7 zRO3d{bejvU9=8+AwFvA(*!qFEopJjOpsnk`+5|NC07CNw!rCKk-i6z|2j5;hf`|G& zI3gD!8#1!FinL_p&1GcI`klxMJyKd9-o3kfD@#)vh$u_ZvetI9ES8o_7&92G?b239 z+b+u<j-}FFyKbj~vIl-ZrMZJK!?iD1j8454{{Ut$Nc9vbxFiHu3-wStF<gC2dIqaW z*G_<)E+1VA9r>GWNH_(t@`dElLjH#Iw4LK<TL_xuf`+!p?1EE!Bt$;6d6DNC6K~r0 z3t@{9wf9EDJv;Y<1Am{|5x3J!*ip)bAICK8+n>tJ%{<DNHdQ9b82wDu`+T#1M#|PF zMJl3%zRy_3&h*mYG=5MTKHKMI_23BK96Psd`#g0<Swfw}7yQt9FAIu<rh+?y#&n<g z$rcw;a6s8sm>s2Y=7*FyhcrEO;^@AUkHsiU-|7#B4vz%gTC~j_>;;>0JU&hX$Md2z z5}w!3$7OA)9B*7$M}O&Q;Xq%M@D==e<+Z6sF274=y56;>ptr4=bikQbRv8rqOLxu; zteN@=^}Mp-c}W%)G0H8^`=apUxrbfBEMT}@b{PSesh}x^nJM7}{?v@RHIG5J<V@qv z$G1MZqlopt>2gh$cuu;cPtis7@eI1~EI8m%_I#XC$&xb+XTaJLmb{qH2#0puU5{Y3 zBBVR(BB+7lve-)qudHlp$T$Lqpq#I+oM`Hq3`xl3jRvfWfOpw^FSrhsx6`{+HiFfC zpfbwN+Ti8#PEaMvDza`cP*utXDqfBkf~s9MqUBA%8CEYV>cFVamCf4;o<enA%BGsi zA{QGiP0y3Z&+{()yYt%HbF#g|dNK^pJKvKq)d?XJxG{m76SzKs*QGEu>cpBDH>OwB zd-KWFT2uSl{Cm0uweAxziS?IJsYr55m{z3v&vfHIJm=h&ANjsIgdeNhCj8XdHuT3j PK{PwtFYAvth{S&Z@l%eQ diff --git a/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/connection.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/connection.cpython-312.pyc deleted file mode 100644 index 6473eeebeecb8ad9356f8db8c96817efe023a384..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10432 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 U@FZ|W$M~|o&i^2oQMU2_0Er~k*#H0l diff --git a/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/connection_pool.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/connection_pool.cpython-312.pyc deleted file mode 100644 index a53391db37abc58a4b126eb418f4e10290970426..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18771 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 diff --git a/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/http11.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/http11.cpython-312.pyc deleted file mode 100644 index 12be3f42524707711b90741fa6c14a4fdfc7002a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17798 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 diff --git a/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/http2.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/http2.cpython-312.pyc deleted file mode 100644 index cfaade78b877295adf7b68b33f8bfa22b0591a63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27462 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 diff --git a/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/http_proxy.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/http_proxy.cpython-312.pyc deleted file mode 100644 index 4452118effbb798f1a895ee6f64ef7bd0893d562..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17195 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 diff --git a/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/interfaces.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/interfaces.cpython-312.pyc deleted file mode 100644 index 3abe2276875b5232e6f4807e65f64cb6aba2e061..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5313 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 diff --git a/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/socks_proxy.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/socks_proxy.cpython-312.pyc deleted file mode 100644 index 1fa60396e2fc75ee22e57aba1c7bffd3075414de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15660 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 diff --git a/venv/lib/python3.12/site-packages/httpcore/_sync/connection.py b/venv/lib/python3.12/site-packages/httpcore/_sync/connection.py deleted file mode 100644 index 363f8be..0000000 --- a/venv/lib/python3.12/site-packages/httpcore/_sync/connection.py +++ /dev/null @@ -1,222 +0,0 @@ -from __future__ import annotations - -import itertools -import logging -import ssl -import types -import typing - -from .._backends.sync import SyncBackend -from .._backends.base import SOCKET_OPTION, NetworkBackend, NetworkStream -from .._exceptions import ConnectError, ConnectTimeout -from .._models import Origin, Request, Response -from .._ssl import default_ssl_context -from .._synchronization import Lock -from .._trace import Trace -from .http11 import HTTP11Connection -from .interfaces import ConnectionInterface - -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 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.12/site-packages/httpcore/_sync/connection_pool.py b/venv/lib/python3.12/site-packages/httpcore/_sync/connection_pool.py deleted file mode 100644 index 9ccfa53..0000000 --- a/venv/lib/python3.12/site-packages/httpcore/_sync/connection_pool.py +++ /dev/null @@ -1,420 +0,0 @@ -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 - [ - <HTTPConnection ['https://example.com:443', HTTP/1.1, ACTIVE, Request Count: 6]>, - <HTTPConnection ['https://example.com:443', HTTP/1.1, IDLE, Request Count: 9]> , - <HTTPConnection ['http://example.com:80', HTTP/1.1, IDLE, Request Count: 1]>, - ] - ``` - """ - 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.12/site-packages/httpcore/_sync/http11.py b/venv/lib/python3.12/site-packages/httpcore/_sync/http11.py deleted file mode 100644 index ebd3a97..0000000 --- a/venv/lib/python3.12/site-packages/httpcore/_sync/http11.py +++ /dev/null @@ -1,379 +0,0 @@ -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.12/site-packages/httpcore/_sync/http2.py b/venv/lib/python3.12/site-packages/httpcore/_sync/http2.py deleted file mode 100644 index ddcc189..0000000 --- a/venv/lib/python3.12/site-packages/httpcore/_sync/http2.py +++ /dev/null @@ -1,592 +0,0 @@ -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.12/site-packages/httpcore/_sync/http_proxy.py b/venv/lib/python3.12/site-packages/httpcore/_sync/http_proxy.py deleted file mode 100644 index ecca88f..0000000 --- a/venv/lib/python3.12/site-packages/httpcore/_sync/http_proxy.py +++ /dev/null @@ -1,367 +0,0 @@ -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 <username>:<password>"}`. - 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.12/site-packages/httpcore/_sync/interfaces.py b/venv/lib/python3.12/site-packages/httpcore/_sync/interfaces.py deleted file mode 100644 index e673d4c..0000000 --- a/venv/lib/python3.12/site-packages/httpcore/_sync/interfaces.py +++ /dev/null @@ -1,137 +0,0 @@ -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.12/site-packages/httpcore/_sync/socks_proxy.py b/venv/lib/python3.12/site-packages/httpcore/_sync/socks_proxy.py deleted file mode 100644 index 0ca96dd..0000000 --- a/venv/lib/python3.12/site-packages/httpcore/_sync/socks_proxy.py +++ /dev/null @@ -1,341 +0,0 @@ -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.12/site-packages/httpcore/_synchronization.py b/venv/lib/python3.12/site-packages/httpcore/_synchronization.py deleted file mode 100644 index 2ecc9e9..0000000 --- a/venv/lib/python3.12/site-packages/httpcore/_synchronization.py +++ /dev/null @@ -1,318 +0,0 @@ -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.12/site-packages/httpcore/_trace.py b/venv/lib/python3.12/site-packages/httpcore/_trace.py deleted file mode 100644 index 5f1cd7c..0000000 --- a/venv/lib/python3.12/site-packages/httpcore/_trace.py +++ /dev/null @@ -1,107 +0,0 @@ -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.12/site-packages/httpcore/_utils.py b/venv/lib/python3.12/site-packages/httpcore/_utils.py deleted file mode 100644 index c44ff93..0000000 --- a/venv/lib/python3.12/site-packages/httpcore/_utils.py +++ /dev/null @@ -1,37 +0,0 @@ -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.12/site-packages/httpcore/py.typed b/venv/lib/python3.12/site-packages/httpcore/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/httpx-0.28.1.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/httpx-0.28.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.12/site-packages/httpx-0.28.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/httpx-0.28.1.dist-info/METADATA b/venv/lib/python3.12/site-packages/httpx-0.28.1.dist-info/METADATA deleted file mode 100644 index b0d2b19..0000000 --- a/venv/lib/python3.12/site-packages/httpx-0.28.1.dist-info/METADATA +++ /dev/null @@ -1,203 +0,0 @@ -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 <tom@tomchristie.com> -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 - -<p align="center"> - <a href="https://www.python-httpx.org/"><img width="350" height="208" src="https://raw.githubusercontent.com/encode/httpx/master/docs/img/butterfly.png" alt='HTTPX'></a> -</p> - -<p align="center"><strong>HTTPX</strong> <em>- A next-generation HTTP client for Python.</em></p> - -<p align="center"> -<a href="https://github.com/encode/httpx/actions"> - <img src="https://github.com/encode/httpx/workflows/Test%20Suite/badge.svg" alt="Test Suite"> -</a> -<a href="https://pypi.org/project/httpx/"> - <img src="https://badge.fury.io/py/httpx.svg" alt="Package version"> -</a> -</p> - -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 -<Response [200 OK]> ->>> r.status_code -200 ->>> r.headers['content-type'] -'text/html; charset=UTF-8' ->>> r.text -'<!doctype html>\n<html>\n<head>\n<title>Example Domain</title>...' -``` - -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... - -<p align="center"> - <img width="700" src="https://raw.githubusercontent.com/encode/httpx/master/docs/img/httpx-help.png" alt='httpx --help'> -</p> - -Sending a request... - -<p align="center"> - <img width="700" src="https://raw.githubusercontent.com/encode/httpx/master/docs/img/httpx-request.png" alt='httpx http://httpbin.org/json'> -</p> - -## 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. - ---- - -<p align="center"><i>HTTPX is <a href="https://github.com/encode/httpx/blob/master/LICENSE.md">BSD licensed</a> code.<br/>Designed & crafted with care.</i><br/>&mdash; 🦋 &mdash;</p> - -## 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.12/site-packages/httpx-0.28.1.dist-info/RECORD b/venv/lib/python3.12/site-packages/httpx-0.28.1.dist-info/RECORD deleted file mode 100644 index f8e4bc2..0000000 --- a/venv/lib/python3.12/site-packages/httpx-0.28.1.dist-info/RECORD +++ /dev/null @@ -1,54 +0,0 @@ -../../../bin/httpx,sha256=YQVUoe35eYu33jTnQAsCro4JaA2Q8OBzDDi27WSnD8g,254 -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-312.pyc,, -httpx/__pycache__/__version__.cpython-312.pyc,, -httpx/__pycache__/_api.cpython-312.pyc,, -httpx/__pycache__/_auth.cpython-312.pyc,, -httpx/__pycache__/_client.cpython-312.pyc,, -httpx/__pycache__/_config.cpython-312.pyc,, -httpx/__pycache__/_content.cpython-312.pyc,, -httpx/__pycache__/_decoders.cpython-312.pyc,, -httpx/__pycache__/_exceptions.cpython-312.pyc,, -httpx/__pycache__/_main.cpython-312.pyc,, -httpx/__pycache__/_models.cpython-312.pyc,, -httpx/__pycache__/_multipart.cpython-312.pyc,, -httpx/__pycache__/_status_codes.cpython-312.pyc,, -httpx/__pycache__/_types.cpython-312.pyc,, -httpx/__pycache__/_urlparse.cpython-312.pyc,, -httpx/__pycache__/_urls.cpython-312.pyc,, -httpx/__pycache__/_utils.cpython-312.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-312.pyc,, -httpx/_transports/__pycache__/asgi.cpython-312.pyc,, -httpx/_transports/__pycache__/base.cpython-312.pyc,, -httpx/_transports/__pycache__/default.cpython-312.pyc,, -httpx/_transports/__pycache__/mock.cpython-312.pyc,, -httpx/_transports/__pycache__/wsgi.cpython-312.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.12/site-packages/httpx-0.28.1.dist-info/WHEEL b/venv/lib/python3.12/site-packages/httpx-0.28.1.dist-info/WHEEL deleted file mode 100644 index 21aaa72..0000000 --- a/venv/lib/python3.12/site-packages/httpx-0.28.1.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: hatchling 1.26.3 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/venv/lib/python3.12/site-packages/httpx-0.28.1.dist-info/entry_points.txt b/venv/lib/python3.12/site-packages/httpx-0.28.1.dist-info/entry_points.txt deleted file mode 100644 index 8ae9600..0000000 --- a/venv/lib/python3.12/site-packages/httpx-0.28.1.dist-info/entry_points.txt +++ /dev/null @@ -1,2 +0,0 @@ -[console_scripts] -httpx = httpx:main diff --git a/venv/lib/python3.12/site-packages/httpx-0.28.1.dist-info/licenses/LICENSE.md b/venv/lib/python3.12/site-packages/httpx-0.28.1.dist-info/licenses/LICENSE.md deleted file mode 100644 index ab79d16..0000000 --- a/venv/lib/python3.12/site-packages/httpx-0.28.1.dist-info/licenses/LICENSE.md +++ /dev/null @@ -1,12 +0,0 @@ -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.12/site-packages/httpx/__init__.py b/venv/lib/python3.12/site-packages/httpx/__init__.py deleted file mode 100644 index e9addde..0000000 --- a/venv/lib/python3.12/site-packages/httpx/__init__.py +++ /dev/null @@ -1,105 +0,0 @@ -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.12/site-packages/httpx/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpx/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 21fb0301f3be8f6bbfd52c38ed60d5d3e8c7e6bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2137 zcmY*ZOK%)S5boL6%<k;Nk4+-L5(7bs7D!gWB@jSyY=>BKEVEuK%A%+>nJK&z&rC1f zy|$Nt<O3I!AaWxogg79f2#LP{S57%ZgvN*iTyjB90usuJ>Y07ukzM;$Rd>C*s(z|e zN(8^ZzP#SOZV~c_W=3CO2p-oBLcSnA@r{r~M#qRUolHbJ#L%)#nEfs@M7c4_k5OTa z%rUaYs5nNYF|x;~JVq6birQZ`tVXp?%^;h^FMMrurZWU)?hHfi%);~{x$+z#ojTO7 zy);T?^6Q&-FdO}G<K_{(dlY7&{uJ`Q<rnW{6BTB5^LUO7a>ofwy+F8$`IY?qC%I1T zGP(KI4%y9KCObyMexPkNvZ_X@55nU?PX;WeR23<efeZnmP3bmpk;of{GG0WIi`*by z^-^ak)t>eL<3%J`ZNn!a`IyLIL>OOY6uCh@BG>Ziwf|E;J2^2Rjoj)3t^M$ub{Cwk zl)YWYV^QSBz7qy9I9?b)EK$}EeJ5tp;r-aT3ZB~+;7Gi~;e&p_!FPP<LF_~91t6Rq z;E)^-Vj<ly1pid&qPqo-=%Zr5`X{!*8S5Ot<Oi}F#GB4eAiHlky`VQzJ13H`-or?) zoZuM@7HgRm1EKOg9>h}RU^kErgX<<0y4KDUXm(iy&B&EvySd1`euPPgri2hSxf`7n zGVr#5pY+*I95UAj-rR<GyBP*on>`GK#jl-u<<+JLB%JKI-j=%wqM3xzq%?>FN$IKH zfSc$nAv4<bvq<*Huhz_;R^=d*shs{hn=6(MN~Bo+-1^kIHT{|W7>|&~64&p=bDHQE zQkD7jcb41SjYW@fsb=QIAok9=0w%IrDjP^xmmJ(k*@<8wd7j~o3+?vW<VJ43FT1L8 z*h~@Gz)Lixa}#5Qp`Fq~$OJ5L&bZ2Z4BJ(e7g!vFCsSc{$hCtASYImS*;W83eLoC5 zsmzoYYR1DTB~T$k>akeDu2hvpK%4l;sjY&K&mlpT76UA=OoGa80zPOLTwj?Nkm5|J zqRuP5Qqyo<y0R})LFI7HrR8|r4Fi9pwW10uK@>=gWQBQdxW<`e9t)Fe$(yOlMdocy z>Q!6?*;+`VC?niqd@J=~vSeU&zq!)uDtnEwa8!U?j|t4|ka?9yc6Xpk$xmt|+rw(v z@Ak3J*IaBtOsj?YrAk}Fk;T~-L`=eAi>4kkERr%?Lr@-q)IxR0tum=?DXRt8OR)e| z8=;Y^AkqdZr;U`nxUZ^14)5Tw_{vWCq4jm$kCS#WN3l)~!P2e=Ns-i4o3V>-JZOQB zTfxKnSH~qzjm>VLi=J+D@JC6itbVbXjrAqEu(G_g+NO(3=jS(8+NyMk;}E7d%LyL& zu3S1aG#T8YB}yaa_mhp9PsX*8Q3VdN&*Rm`v1HgLv!`;@?FA}NT|Fo!O;?=;*v-MF zveL%I4P#RnB`8pjJ|GmTLUFZWC*m<ZC^nU&2^OkA<)DYcJneHlnx}e~r)_61M>_d5 zC6iLzju?6&)LkmjDIKB$rLh~~c%T<9h2D$G6o4)z|CaEo-X0YsPpmi7q~GRUWc30R zH;^1;4a4}IoV`oV?vvSlQr{;>lfPs8<mm*=CEy6E4svCq{#)*uM|0;5JF{m#Y-LD! z=Emtg>wfjfBa$&*-#dTbp8naMyKB$gZr`(?|HZ1^vTh%}JLP=!^7rOF>-57sp8EHI oWr#KVh?I=_KRGL3Kgc6`BJ_UzAzPR~Lw-0@JZENqEEq`t1MrBn<^TWy diff --git a/venv/lib/python3.12/site-packages/httpx/__pycache__/__version__.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpx/__pycache__/__version__.cpython-312.pyc deleted file mode 100644 index 2f40e8542067a593d752b2d49ab759e246e7d527..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 327 zcmYjNJx{|h5KS7sN-0Hvn6p-DV%jbY2!X`FggSJ}Vww0ztU7UIyP+vd`4w#J{1*N| zl$9MJb?bx^fy51W_wID}-rYyHyKfo$dV7w!iJvw2Gy6ALADQIUqE=v0JFsahXcbO> ztJ;pW&KAqTjhn(kyAh-yiDn{o@21m<8*&Dz9=MM}x|2f3ratzUJLmrB!XMuEovMwo zW|{-WRS#ndDwHg%=S`u5aSl>7;N4o+N;WZyMFJ=xTIJ|gg!9DgS4abgNRq@;nuRlv z9u-e17leXDIixw_>;YwsfU!RuA;mO!83|`30)?6z&_6amD>i$ViJ)^1SF&x0>p!Sd a<Gvl+w#$Q)Rl7XCUiHeuvzLzCHH{xGqh!ti diff --git a/venv/lib/python3.12/site-packages/httpx/__pycache__/_api.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpx/__pycache__/_api.cpython-312.pyc deleted file mode 100644 index a4d3e8822f26f778e492c9f0bed45ac4d2ea40af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10362 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 I^|Ukn56=zbDF6Tf diff --git a/venv/lib/python3.12/site-packages/httpx/__pycache__/_auth.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpx/__pycache__/_auth.cpython-312.pyc deleted file mode 100644 index 170bacffef493ee34cbfa032cd03adabdbb9873b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15614 zcmdUWYj7J!df*Iz!Gm~`03RSJa`=!$@M%gUCE0qIq#o2tro0lhis@B>5N0HT0s(qv zD2g!XQ?yP3u9Op%&8?_-H)i&JoD_SrN?oo_sjDQ`=B{e1?hi*$4)8=<VJb;g{3k`5 zOvUTFs=M#&!3;nMqJ4FBKhhGrd%k{mfA4Pmcc-(Ag78nj|L&yNO;LY`A6j74483uj zrl@-qM{#tNnx@BT8uNyzVcbAc<G7Kerg0NVnQ?}s=5aHm#;9f5I&LLxOi|l(*?1Y` z8O|KFPdmmPByWj2r(NT&Y4^B$+B5DUFl)4Yx?;Ry+B@!@_Ko{!iZ@TSYg5ao0*+ye z8m6npt7z&9#g+Yp9<Me~Cn(PTKE*jcGN^UOYY5B<Fc)9*kueAL6Q~=Yo&snsftCZb zq5xV)pk9Fb3ZV4_S_#l9nBlAWnQ1wFtcH0*p!zce2WZ6}ipAnmNQ%T`;wXIEE)DeY zv2dK@;ln)>5=1^YDM>TIXhf7gg9E@u&Nqd)6c5Lv#{?lR1dNJhI3B+m;YG!AmValK z7bV4dmKSHBPaaCGQapHRUV>sX<U~nOEVHq9X5$i$!30M_;$*<2m<DI1NyRo45+h-f zEjt>y0$r)#QC>PbjM=cZ9!ztaN^iUlANMGp8mBo5(18Y2FaR1D00k_Z@qN>{*+!}V z;M)Y>7X91GG4O4jHwSEj8@dT?!Ya#H2rw0%4M#(w$X<>MY$zIKLofqACPl(z$5=5u z$xriQcNwWa7H1>VGf{xVBsRo`XGJMKUAjppE6!e0yPm*RO|YRD$HuSmf)L?&(i;rK zPITjd!OPM3Tw7p*o#v&<IF}pk<YgACl$;UE#d(oE*>eVl2~V;ik>w)dRW=k3^RO6L zON^K1;=)xn42u#w5i%?CA{kelkA)|Ncr21o*El0YrXy118g!_27LA9mLaX`sEGtgN zXQTO<!;G<guyER>S6E&Ti~<XKp`4AxM2QbUCzp#CEXCOwA$|?EgcWD_a3mCsBzTT= zsPD9jyRa7_iJgnU8C~LWF&ukoo}CzuM&K~i-JKZ3p*4sA_{oQHUD5e&(&O=P4xIoA zRMcvrD0;&OAEzi9&?`y*kiG|8XP*A4agGicLKbL1nj*FwyUvGaCBD?5;Q8fF4Qm3P zz;VokBs>~cP${O9otTgCQEq~bNUy5+gmot-CiD?VxmI6?Vh#Oc3@{>0)~xOY90woc z5O)w)aLq`Q?4?lnDr`G!FM@G;>=i!73n3{kbhB^4xrReAz0(}pL?kvExe6x{f64sx z?hmowV5)=cguqL)LTrL<1I!TkP<S#DyFz9Jb4F~y$?5Y7s4Id&W}^~J9!vEp=GLrs zsPzJrE9KW5za)hsF~Ez<0#GG(E%E{oT*1NQ7G7{VB0C+5%|j=ItBFWS5fP{d=_n-R z5C_j`^da@opqNBHdReh()e)aq_Nz-hlksW3XF4Q_*Lse|!?VaB#2$%{@>hh=be9PH z<SH+8aq+oWG#=u3q30SOyVetpT<V#b2a=EN?e5*vBSs{?YX(j(1Z=Sfnez1>LTKGH z^NLNUxP)sEct)Oa?1D*%PKf@I`tk;~-buNuZaIG?ngDXsY^Ap#Jpu{R1HNlWPfY=^ zI0&93J!LG0Qq)H|5KSeishr?0td*ocLKy;K!5~@G97QD!I+V8M$ZWv~Jy^9G`4mPr zZa*^gV3@M!TWGnYF+a-fy)BgF&`Me<!AMhY0b$Qk*Ntycb2$P}{G*OwUqjuj#x>)! zBJvZx-OxPC@s~q@vYmi)fIINT3nB}ox0Si8WLL~iNfVXr>s`))1S0tRHLO3!a*?sK z;dm@OD+nOj=YgYY3|-}W1bqV*r4rFL0`wKk;cxI#oSRonK$)CS3wx!QV*GVUsVb<a z@{?ReWHpNOoD`oqDIqTbo#LTMsD_q84QY;yMzLyaf}kJ{F8Hz3wN)@AyabK60uMt) z@j65*E>}<vPsYCUseNbG;k|Qu@$~J{HMjT9dyDTaUrD=nrA*H&s+Oc5w5Kd<u8QoA z*1HR-k*wRBakoEpw`V;y_ndc~zw2H%8J$(x+J+AU_X8^<>DsO(%es?td%xUtQNE@x zDB4-|si$(?2<iV4QT4kySUY%_ezK!{u!nlmO=G^tHu#$H$$kUoU!^hsni29Z5SP&a z5~cm?h^uCM;`$zF!0!U_{m^jF_?rv^wEF)-Y(F)jRC_78)of30FV5u~k>A06)a{G# z=l@1z_?eFTUq^;SyFl&bUoRaB^+*j&NGCg?0RTcHMl4267&SvwL_qE$)hgjr1;JJl zx_}LrAbNp>D*X4l?som4C*x>Zbu?{DNWZg%kg6K)#qP$^Rl72tU8|m5FQcb*JLPQt za@|9f@BY=M^+nP;4wJgc4teRH&_k5z-w!g7ebPn`8B9+CCd_x251FVZM+}hvxq-&m zWE=7rf9@m@H;s9Z5#Xc1c97!;Hi#6nsud&x()<jl2Hht#P3P^in(B2nrx<mzqwyGj zF;LK4K#EVa<=PSza+?k=25gEo7>tFc`Cw2f3kIj-+-wx{j$rVe*-$iBVhIMhcsLj& zhpnD1a#&#}Mr{~XLbL&Y6yc7<G9ghFfW)H^y-$5^C}XVaHPnvgRg*u9aqWhwim6(E zrJAYARyV90AzicW*<c`D-?IhSyNN)d2M0i_Ck%gj$mzlK1`D7fvx?yiU@n<BGcl`} zc@szu$MM-1sM7HmB3$Awq1M4DFnf@5pl9tyLA9F=30H{bgR&2F^ck?LKpO*%D#VIJ zn<v&t=u#9k(p-O?q${G@OQEYE$FRGcbm}A~lX|w;M~t8AWMR7_mm|<^u97O@wy<Gb z957FMqk=3hNhhfw<kT=vJp}AQs}!dYFc9gbnD9eXwK-K-!5K$l5h)l<R2HtiTLaHQ zcOqin4JupdPnmwZjBNFmiNGXOWor*)aux<Pl~a!Zq=&rHl(Ro5v_FKsP(kR!h~PxQ z^oX=hRBf3Vo&hl=6VO6L>>>;x>#DdjwK%n0opv>)txY+-u(FyS1tJ)LT8Wk%>JNjd zh==pGMm85a*&G2~Bt)W^ka&auGzyr74oHMfjJhxarw%3T!-(KHj;|sg%6_3&i{62Z zSPl_lw~?`Kl+jG>rkQ4%)!JAw41apiQ5A`%2vyBFR8>6y3}+>lzj>YkOWy<46Z8M~ znA!&Flz>FsNe~!}Xf6P`h@he>TJc2T8W|gV6CDVVaFK<c!$>@QEuhv-FcJ{~%*>Y{ z0cgp&)dI%qXfjU`L<ks^ir}T$NR(4;?@3VFcmcQ$Id}Ezp;1L=tF{KkibRNO5OF@5 zDn`yJQK5TcbgX_KDv7Ai0an+unfkqQ{oY3-k0;ahCsL-rvii5dab)f~jzhjUfX0(s zTww`EAB0cc?k0F2FpMfrWHfOh=b`{IJp|Phi@HqlCG_CUFGweb--31`idK~vI(jl4 z2jz}~Da#%AqI=mbTidd(O5I#)Y@)-32WN(c<ls_}0na2|ih3ozMV^ieV7lpZS<fvP zCEaw&8!c11xdemdf@W?lfU7HM`hfbe;T-kQIJ$w@@oK`X;@?B?txd%vF#&BN0g+8H zb3D5E9x|$Segq3%#{z;Hh!hGV#jo-)5hnt8kyFwIJdQ+tej{H*xm!?U13Ls9@mAkE zaQDEECReVf8(#U7w#WO^dycN|IF|MvPg$RP{L5`=PfNzrE_>S3p3W4LEw5f?mgZL7 zjjPs1f=i<h%>wrIl^wi>Y!X~L;6)@e70v*dupQw5=8)^;Dyv1WBUG=X7@>oQmapMT zxH=+u3s@5}3c@YkgA76b0@gG_Z<q~C)uz?RuxcBu9)>?X<W3*7egM6|ppZ2&AWc=) z#Bes^j5LFXwoE|zlo%r{>OA;tLhNqv+6m#^?BxiEND!h?aJtUUfHOzqGHh7jIdo5k zq9TGp4#rheaaM@3lW|c}xzFeeatLNgZ|o;C<iLd*1@jz?Xr0OEs{va4C<oojgn%jq zBw*k}44I~450Vt*<mGrE$9YURb>TeJE5&d|H6O3eaDIq2QIoqtZI~%r<ysy4;cNF_ zTanUroyc)&UgS84ur0Wn{{flpI8G@i0&pRukD@SzbY2v+UBG?%btVZeXB1>2ljl{y z#!&$%3Q*I4HMJHW8+E2mPn8u_hEL8^f&((6pW$BTHk?q1N)$r?1=;%@NE8<`IYb8V zRmTNUF#--KCPV^4#lkSwRnJ8=&s7%^9@o~xL4lp{<_||_o<D{HF$$5&Jbg78U#skE z&G`1pzP*o5{O41Dd@9p-RPH;P_8m*vvUcC9y?*87gV0Y-uT}VOy|HelUg^v99G82J zXZ_79z4z-M*&a9jv18pxy>f!ypbW3LQYY@5Sv<3RMs{>UZEx+ZH-07JVcZ<tJs9{` zz>9@rFj?UQM&E*{G&jxf?2Fv=AvS#jBciFJ$_IKG+Hi?7l_e6L3wcYP4+?MM=UI%3 z^ekj4gs<F%j93K`GBX2X-Lx`H*M_SMl&u<_mtpNN{OKWw&-6w!@PIroJ5TY(Qm(p} zLQCK|)GZCwopkyvaJ14;SH6yxgSsW49Q`A>3*-#EjWZ&BaSoyymT^wPf9=}kkd|^T z&J0$ML;J>*b8{AeIXMq!h1A8Bb2dobTm@GKsb}6E@CvBP2CRzljidbuD@0xAj-5NF z7|)FiCae&V&x8eYd-?|wj$Eby+~2!L1w%#!w{wxO^fnwmI22WbHm{iz`3QPBxl_A% zQK<_Ko<4Er?8&i_H-cklf+K_HMuNxBj}DKWJTtmQlL7v(YBCd$xkpJl=P%9g3(9q^ z1>}LQ!EvC(2C+{PI5e?zzB&&wVpKpX4lqO|QEWk7A+-fHjZ|?5(SIKdPlDaS$FA_8 z%f`Tq$p^#n*_b2{S0E0d>n3PjB)s`cLtTpe7bqZ(yBpMVf741^+TW2f-F6k`vj<;K znVwnev-LY(qRHxVWk0NPJGmkRfb;8XhoN%;4b3U-qaZEd|N0)~iwiYiB9lwVBF=CX z)-Jj@BgpI$eO#jjdLEtPCCW<4C{A~jAEhp~fUDjJK0s6+i-M+oPT}oBQQ%CPgcRx9 zEi@G~m?)S7HHFTGq5wN%06jOiXMihuImf`4Rr~z^u&;(GWO7A8*eN03Bms7<L=A0i zQ)mnog(Us4St|$6tafLp+Afw+0cCXLE)ZD4GdDNaRUoDLgoPtl-Yg-HhcuDP0f%rI zn&gGH0?KemniYW%I9{<{;U#i8uQ1?n0h15pLP(Irxd_~*dw`tq245#4;R<x6Si<Uc zy?|S*l#9@V3JIzf6o?pHnCe4o#X5E(^mFzVq7hJ?>bF;Y4ZZ@h)AfTVP)~%H6*>LD z?#|d7pV}L<J$rLf-&4Kp%lNxwf7gbwNZMPe+NQgQQr0!Q7h1{o#+AKK?Yman4}LO| zIXWi8|MoFZ37p=wx|U2`hg{c@sq2&L`d0f-r0Yh$pv*RJ>QvTUn{l(Un@zi$Gwv?g z-Sr^ySML4j&1ay(x&zxcwqzRn<i@^77amXk!k%s%%QJ#!R{t8BghO)25Zo{<jb$nW za%BJ}+gVm%BEmczzKp%@slDzw)EZIMptNIW#<5R!?EA#B>e%<pF_N<+kyvgHRUWOS ze_k_WfFxW<mT2SwA;7gWuo>_L7)vSPoUVj_7wRsU7MKNd(o~A+Xe0_O0vsfw;ak*A zIzla23JgpgS%KI=zgVy)t=pNJr5Og0dye^k7t#gWLYbs9jAWTc4oOSWhT`^izX=3r z(!w#Q3YTIZ+PoL+P|N(awH!%HDaHbCJ*?Wi7Mz?dX}LxTUg**Gbv?#tu57`@!RWab z_HWd}Eup|CA!$!KlFp<n>HgU95eg3o=fE<Nban!_j+F}@&bd%tz;4QceYmtaCp|X} zFb~gro;m$yGT=@;DMRYRaF$%4qxVy%aP@jS#Hs|zUbt|fYcOvJ@T^M1`J2D7Ngj+# z^sW-;Dm-+VhO75i^&uv59l>=(box*;NnR(WWH>(E-1$y?=1?<Id?!X-@TQ=-lZa`6 zUJ5sN#%Drsb$+P%`h21}|B~S=ngt&O;dNiphX}V*7}7OZk0|8fK0A5^96ZwGv@iiX zr<m1_MinEB2#Uis019&$;dP)ej}dw{6K!vVqPPgKeYf8NAp+F{cEtuPQi2CA@tA<N zjDTmQFrZ&WW+0h~MkE1ARxzv3q7)-AT*VhuJIAdZ)-@FCDSn<ji4u^E0~JMFRCtH< zqdpo^=%8W-S9O#V6}x&ULDcLNh5!}gReoM!u7#qr@Ja#Nm0GM~<gbSn3%o!Q@l60? z7D0<Gk$Qg+gR(?je$w5=l3@)hi0#0v;f;WY+R>J&@0II&AGM_G2V|>1WnQ9}27u9d zs_rBglegYmsd?%StXc!B?!elvwv_#OW$Vg!(v_WGPzGCf>R8s_@L}Ekx({|_{GGDD z^TD}CO=*AM;<r-6OO?+Xcdg8R@LuZFvhk^-ew~2^>sGsMn9lkdS1huxE#vEveLZPk zFZ5FaRMYaI`@Z{u{n7b!&1<QX*?mVoc}?Coy7cx+ja=EDsqB?2d!JSAT^;+i)bVWZ zz~c_N_t;X$GA~!OW-2=5ijHR$UBBo{4L|qp&Q{f}^glZJ$>r6v=QoW8pKF~mI9*?E z!a8ekB`~L|*Hb5+SHQ#`RX?jZ@K{`R4E;}>^DzCDh&<s*&)|XK0QHvv+fj@0FZXzk z8jSzdz(9VBevOtBVe1Eh+5eV{IC%k796;O1vC+bkQV%IK28mPnzKe6ET$gE%e&4ZR z<P4?QH|S2f9+mGK#w%fULERGe)n#2PTrh#3q=Z#9h0d>{umJZ(CFetz(yOL)y({01 zw$db1;2|{|Kr|+G(X{}6G?+CSv_&BS`Z9<#Y6>^1D3opidx9R1qM)(l1zVE3PL~>q zGbMmegbhJm@R2#{dhkNoOHOx3(NOTIt$C{P#WIf3#HrAVBfMmPakLWaNZRt}sPzLg zqo$f(90_`8E&)aTHixAkp6xe0$(M~~xnf*!#427|ZcW-iOj@p(7aTByZ;qd(SH^6! z8xC!)TKbZ+*arVN%a6<pPH5Nq;+_cZ((t5{vl9QEU2uc?;pEE5mlbk$l0%pSbDR@) zVE2nXC!N}iQM#R@0`Ac;FljviQ=z=5FP?_XzoYNLlh{QtG_^*hv_~Deux(M$%FgMx zO14S<x+<v!^ninZ*TjXSkYbyJXS?K<RJ|Czp~@Kv>Lj`f<;)A0Qr!pP{U~^-4|l8m znqWQT4(7`n)TiG1<*^?e$#^?uZ)e)uo$>a|-u|?AAE?l(3+y-yKpsBqd}aT2qB$g( zE_mW3s`6aDFUU(wbbCewJhHr^umL=nLUn~`42mHZR?K0db|ft7%vrF2{w-8e81=@X z9ozpdL;;_03G=9QD9r543_RE!K>&vlk<&cp-o|pP5Sjxq3wD@UeZoa{P&L8IgJ`#@ z&lXj`hAQAu1yQW<kV-Y+9Pk!Pj7P8WK~Q_hbcw2?sLgX~15pwJ?!304*mQMJzynbX zgT0E0%)~IbM=_2-WQA9{s&?@MtO2lIbvx|psRYR>+fkJYNkO=~7lk`eQAGQFi+;hr zuAV$%abm}|C;z{(gTIC2hLZ+eqSBx7^~t`zM{i~NN96vIO#i6dKbr1;Q}%s3W&39n zZQBpE;DY+C#kZDCAG+?l9@u{7e&~Me`-_G@ZCI@yNjp!b3~TPHJMS*On{l_u?v|7( z>ntbrEm%KO(<Rq*rE7W~`Btk3($0M;!{54mOJ{FQrHpId+U2p#j&2$Ld%IKCY<Xp- ze79V_`++Ibc0g`B@c6)A9Qo5D>GD%4bJps}Sp83}{^f7W)&{ug)O!K1cE;Wy+Z!_W zR@vT~w(rW=dt`ghBg-@U{!c4vmVF=k@B3GVANYUP_^|QuuGN;ow0|gFF`OEPH)$DH zqwH#2vHb_<A2=V)t-2c1t|KX9*6vEZwpP~waQ7d$A9+`6`xj5aPSj&fgw#A9_+;-d zjH|V$QwaC(z_n&88}0?~2DQXn{b^0Zvh?Bn{rLxV>Bjza%>a1WRdp=m-z)p~rv3e& zJ1x~^DLW{9j!M;l&9-)BTKnYIK2XoBvZLu!yDQt&1|N*<XvngdGs%t}+1B=4g*A80 za$lydSFY=Q)RC?`EV~b{S`VxDGKCBVX^v<>ES!I7594+QEc&3529&Uv%bTwy?`B{q z4BPdm_muN#L+uipP~Om1>q}?}kWfnhDY&cE%|NYwUZ!*Ko0Zya=LTHfIQkii!_QEo zg4YV)hJ-K=#Uw?hd4+-3Hjo(N@QaIC0UjO1r{VS+7&1H=hDXSgp<dy)v8C$AQS60| zQ#6_sTHN}0OjrhJqP~!Ni}_OzvgsM923}N$d&!=5)Mp$mvZDnY9Vt3%wWZE4mXXZu zu{-07<F~$>ak8?LO*@-qYqMH#77Lc?TNh<(ZHoSTpj<E}mIrVBn~b|ncDJS7?GN@o z7+Q7rWZVO?dm!!JziQpD;!>erj9Wu+>CYj9_wEaDs|K2{5$?gk8B*Y#-u98QCM3b} zv7e%d<HAg03uugHj=6dicAZJWZ-mI{GvK~3fG-t%l`%SL0!@%f+Dhr>NlU@gW~(-e zrZcI1-G0?XB^fwr%P3sJ5gQf-yzn~^B`ohQ9BO`dp*g`o=G_HFz3EFBIzcWeHa-T= zsNi`mpaHxHpN3!6s7zWwr5)~#(RHUdbFv|4VU~}c84Z5>{F$+1M}x;t9y@*XoZ`-X zjvagB&C`Qp#}sct9UbT>lrah&5q=YAnZhBgF!)Rq<{={G<Yj^?4n6?biwITN+df37 z+fWT(lMJj{{n^@<lsnt7bJbe6R_#wYo;S5WIF#u)EO#7Ecf6i%8vKH?+J<OgKdHgR z_m-HY*{s{M)cgI}tfzj(Bzszy9Ka2I{#CYD_V#{mq{`W~%C>b2<*ZyUqn!Tbkq^(@ zKl9+&pA0<S`5zCZ>j!1W;Nt1^a_n^7M|tXD;B6Qet{i^^as!;{c@!&Uu)&1~tsOTS zWJx1<k?46yIpY-?J#m6P&%*Mq@|!d`yy*`NocYIq$^}SdN*X@4Xg%Jf1J+S;Mcc_9 z5$?jQL?j5!|B~p==`b1qezr3+6Bpn&6Y$H0xWvx$kkx*t#B+(N^YE-2e+vUH6VNhP zq7|^s2~RWr%0kr!$Rj3I!!jubffp8FM8KH1bTZ#lf$Jmpu!Nv=4OTTl&!X^soGdz6 z2)3w*@_X=^s4nC@1uD-;#F6hn4ZsnUitwc5xx4(%^~LMU<`rYw-3kKVUa`b29?5!Z z*X-`4Q%i@Q+S%t7J6CsoCtY!2)p23XhfHPnYVY7`#Zb!f+*P-H;=zSyuKrbPKRNAD zVH5^X->q3ypEn8xRcS=jCVm^02e;$r4T#{D9oI!(m<m7Apz4DZ<knFBN02B+@QA6J z9jcFNIZ-4{!hZrl!jr$vQ!nqfbb<T#m4g((>z7e{UY8%0%;gEx2$UDUYxx+UigB9j z7k-L4Ge`uuUnD8qBN7!B?$?3^zx{)!sQaL*`Z_O$In?KfSP+nu1w5wW>tvL2<cjlW zkP&gv-=K2pSk_l}@6=uJz!MgaU#IV$hBLZ%`0n9sO(RiQwtRhFZaYJpS51wpO{X>} z8)M$6GBFJsjverH_3#b`JTds7m1NrY<T8Ut)y$f0#|DE%>xa9UBcvjx9Y@xUkgnMr z8w{iy6SSE*u;KAA^_#7BW`G<%nSK~%u7{k`Qv933^B`t;pk>?^l2b2^O#ovE%nUh; zo+D=8ybaj#4QN1YhrCgu;u2x{cz${BB|f_BKu9M>T^Rj0jL<Aqr;Bb3waXijyMW|@ z{)68D^6-4`v>Lf9zBih6)TB){SzF~ZQ>EGx>jxU~P4eYg_}LY_NfvOa0v?<2hZy}C zMh_r@-)WMYWyOq-hz9!9M`JE{Kmz(jckXGe>L|4b!3D|Bp!-xLUQfk>Z=U(6NG_LD z`amL5%)wbH0$@9i;=l-%DaASV)|<zI!z0IrPn{e+A-E6*ucP787bb|thWa=Z6(RC+ zfgG4pHVRKLxv^RJwWYcnTX*Oy>p}J5^<hDVhOkSNh>Q|`#6i=)q?-SZa{V=BBmeDx zO*wx_)&G)e{|9Q<-%vd=)$=!0mrQl78EqM3^;2W@FHJkXFjMx|Zdm@s{A)B_^*M#{ z<~2hZ-MrMdNkOt%>!H~t(<TMU=B_$556R|1-arp5`8Fv`H{WC!x@vhKQ`afib^bF2 IALMBM4;k^MCjbBd diff --git a/venv/lib/python3.12/site-packages/httpx/__pycache__/_client.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpx/__pycache__/_client.cpython-312.pyc deleted file mode 100644 index f407faaf1c3e6acb2bf1d59bf08138380fd0d1cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64199 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 b_}Tm2b%MD|WS<dxdxL%RTI-LjCb<7USOe)- diff --git a/venv/lib/python3.12/site-packages/httpx/__pycache__/_config.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpx/__pycache__/_config.cpython-312.pyc deleted file mode 100644 index e5bc76ed9c3e5f245219573b590dd6f344a40162..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10995 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 diff --git a/venv/lib/python3.12/site-packages/httpx/__pycache__/_content.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpx/__pycache__/_content.cpython-312.pyc deleted file mode 100644 index a96320f7b48c8b6613af913a1b22f43811bf056e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10420 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 BBX9r! diff --git a/venv/lib/python3.12/site-packages/httpx/__pycache__/_decoders.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpx/__pycache__/_decoders.cpython-312.pyc deleted file mode 100644 index fe08a832f9fe9fe38810472317c03df17f74d815..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16772 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 ScayhwRrTG+ymc=P`F{Z^d5(<$ diff --git a/venv/lib/python3.12/site-packages/httpx/__pycache__/_exceptions.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpx/__pycache__/_exceptions.cpython-312.pyc deleted file mode 100644 index 32ac11ca9f29136727e711ab8690f3348921d975..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12097 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 F{XfHt5;p(< diff --git a/venv/lib/python3.12/site-packages/httpx/__pycache__/_main.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpx/__pycache__/_main.cpython-312.pyc deleted file mode 100644 index 43895348656a525c3eae504888184548fbae87be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20635 zcmd6OTW}j!mRL8?02*%sAi%fSe2D_ZheW+b4?iS|dYK|+k@7>b1_Pm+A}A2xbc2!z zgFEz=w}wnPC2Bpj;>P1Fw`x+M)~p)N&g_PhpY>y>*2z{SfJhDDHYah_Oe%4**}$f% zJj<y{<(%8y07yZmc4oIKka+v{z2~0$=yT3J=iGDu)^4{@@ca9J{rZsQ8H)NPzG%Nn zB}1>jZ=|Su6i@MVgc_kQ(=_IF5#41SdFn6g$&<Ovkf-6Yfjo_ujpS*%%#x>BeOfMC z$-7N`+SR8+eLCT(=b1>!i0iTo`qJ};h<n6y*+cTiNa=|8vX|sd5#LDJ<uaNQ48wc0 zVdtNsGM<Xd6?~9q-()UV^4EAXJgfK+&-1o74VSCU)Z_nnfp-8@4L}X@PJr6+IE<O% zuk$4URm%_YE_iY<h7<X|wcHa*>xKG3T?GK~ZsmEo;R%opIfzDpIH%#wKZSZI@5#Sw zIVf)w8V2>)i`qvsALczU)?G0A(B?Vu!+a^s)X(4Gy#Ud&xfb9fybsEE7b!1;^47=7 zNBD9mZ_`nNariZDO!+5oS*UoAR^AEBH}iE`j;|Ez7pmUV6+nGUtII$6YQBcwA=LA= z3*38#ZD8y8dcFZx23DVM<eL_Dz6Z38KQe}Ik?f{~Z{~OLe!$-H6xet3t$bS!d;3#h z@8I|Fdxd(^`?XCSlNY{oVV|~2WW@WQ0_Oq#Ab$u(v77(K!r^V_cZ5I6+jC<+_7wP^ z;h)XHKL_yJt@-o(aTWfA(8_l$oZNOy-TWz7aUFkp;mo$!&+_MlPW}bH=P6*%^S$uZ zEqvd?g>CV^$X^85M!x?kU<Y`su#aHAwD8ilvwQi8U;7p9Tl231wdoalcp_z9=C7!| zzV;NoUL~`!2yOf~7XsQCw{q=o`_4!CZ@tO9rxNi0Z_ms7$94YL=Quh)En9=pXe=I# zhhtHx_j43MP-yImgoS7va<+@Yx5or2-YtqT5#HI0f;0-C0^|*$7%xa6b(-XX;sZVu zy?%tjO){RV8&<_ut^hK_DytNhX^S;MC8=RkVU3dKX<oOW*MuPb1Sk#5lj?cqp9G76 zH~wSBQm`8A<1-s3s>kN?Vf*HHeB(_#yI|H<V1iE4!_Fd57M|seymi6$9()P>!CDlD zv}<feAY2M`Vahvrr`F#SVM=({wlHqqvn@<1@7)&0$CqsjQ_fdx3scGGw$mrh3%1j3 z@$BGhw}s*Ox@}=#Gu{>kw&`tQcJj^J!oW7ZEldl)ds`UT;<trq=Q|2uit=@m&Qswy z<=@krD7$hk7U8d+85p?m3U}n%SUfI>gOTwgvM~grNkCy_8XlA4;lc65j^kWZxE<%N z3sFHNvW&xaT!@IV_Qat}Qt-NPgi}xs#p9#5uXGUf+?CLHFnaaarHeh!a##8;44m!j z?Z0}ZgOqYI6A=dEB684xUniSJgFGLOUYA+O1O)!NAe%1)#o&kl<B=Ie=-11pXe@9` z433IcXeJw^_;^H+ttUZJis4a|vx$nfkyfs)4Vn$bcy$Ely9dtnolLy0%3DsUY~`e} z&=41txYOMOt=xsaeoQZ6a(tlcOe=S?yQh1gyOmQ%-pZZnK7O*@a^<8j7#xelk0|Y8 zB5BHn2e}|8DiWQ$7URdcu*8L<p~x60`BxJSZKF7@QJj*btxWIn^WEG_$9pbyKg+eZ zw{LX3I3|eW909_4OI$pr;eaO>9};q1z^b+<%G*MSH57xd7LBWD2fAMw*l0a59v3*R z;>l=mr0t2iHXiZt!FcdVWAmSii6b0=*bZA$+aO{a3`c~`Q$2OIryJ+2%(jJKRG_v) z>1`WEl*3XiS~yGpx&FT1ryEpb+Yn+H5`sJ~tV)}YeSx#e7vqo`k)VPRh1|7vo4-PP z0#Jrxu^ZtnGcEY2^<8TH6X%HEu`M_jAJRs3slWRoP+@=nvm1YRNfN{;umKm0@<17q zbSozEPo|4@u76Yr0poJbZOz;uP$v>iVY@L2aOF!z#n{Mbyq)Wf0lmbBf^lw40zQO! z-4w)YF-hoXyUE=OM<SeXdlX&?zT+_1m>5nd@<3UeR+Un*@uoh7C@3>n3TqeS;$rw_ zI2ehH10_QbQuta#z;TWQ<LwC-aEKVYJ+3YU(D=sLegP(4NcqqlCxCD;+o9N4gy*g) z<AMg<b-=F;f#8BqDGHL*p76G{#ls^)Y)s>nQ$2mh2R0G|YT?abWDM}cU<JsKK=8$3 zwQq2-QC0Lwd7%M{Tku*WEDdR$0k1`c5YkL5Of5)eEXCl%A<wjOLOcX4&gG@Yf%ZLD zH{8G`u}CC#t4$R6un6s?japdU7%WFPM3zaZ2b5}k`-ZixEgHkm1D|=L;$&EYfe2iG ze-B5>pdF5)eZvIg4)VBj<N3$dQ2E9v$U8dW!wsqnJc2|31P6FPI*yLU#5f2s_%N_^ zeC$><5({cV6?u8%x&GiyW#wUoiSC*cIUrYq95OeoMi4$95@ImQ@nLB+5*#Pw0C??f zH<2r$KP0up-j|dN2j6IP45$)5@2#B31C+M}AVhd--L-ERk*6c08&w1}J_J&C1im)x zNrYpB+c12;S!Tp=Xh=4}N0MT&XPCOwjA2v^N8_>qKc*lX2FQcCE{1v80)!I?#Uf)P zQQ3rfF?P$Z6L-PZBkqPoLcN>gHm-FH!DsG(FDBjWI2j9#jesncI^se^xDL|34ffH{ z4MEH;pdfbK6rwjfBH?QtqvOCx(S7ZEJ3FLsT!8%{bOVMib&!p;BQO#SN83loWeXW* z0B0)hg>KPfCjDP9DJH2khx<-sI<o4hPdn<D9gUNxKVz)lJ^#k}lzaE$E0gC}m}fIe z!JB<*Cgtv2I)gRcTWd1x@sAH?^_0Q=h|(F1StDhzA+9(3eq}4Ub8h<Fs;xS0t6sI$ zrEPWdb&Gt;R<~?BIthr(t4wK{DV@18-?(Iae=x<At}y5G#aCCD26#hc8MYy-qs`CL zj|>d-VWA8brMNA_9)4udLm8VZt4}pve56;$qQdP?wY{>ntRutj-`qCk_NR8gw8Ffc z>$bfJ{+3khg{`>ivpT)G?UBI<BPq#^q$<PqD?Q{#Tw6F1n+lq8?@aAFyTY7PJDzDv z)g4=5p2>~FmGWFt`pnO>Hp8CXjD4mf)le|}nO&*s!z;`Y^^?ssJ!Hz)fefgS>fFLS zg?61Dt;Aj^y@xg&Dc+n61H{%JpVJc2?s-E1i>8PT$?G&-@-@IQp_|Z8=*?6-XH5<l zvA*It>nm>4dL4FXx%_juh<%jQ4SVtsT28Y;wXqDBYBl+%rWN;7<N5}wpl4qmM#~MC zYq|WhkrMSZ^(wT!McvlFO5LLUOmD&lasySZwt?|cVS_#@Q+~T_Qk4T)e_e>nW>DYa zM0b#l@$pfRbTShPN^w~)#YIqW$FCFlAR8mXZP@>0A2bS(d;qq=zzA$c&<tb|fQLtA z1~-418H<M_vb`$;3IOcXr($DK-p|OaCI@93NH!c;fV4Fu79~puB-F7v_=)Jb-rApr zK|BqW*WpjP3&|vv@l>sP8q%JIRZnx;(>(83_8gk*$(TGTQ*EYl=W6Aibmg8!&vNB~ zY3G!AX75Zet23BgYo3aGNADh8EAf2qm3x7^fmQF(wD;)J*}v-hY2Wg(^UL1eRd0XV z+rO^Yl{&JN&h7yIw>f_O$Uv2p-<g=6Sar6foh@HdwAq!hm1L~;tO2qck{d?#ljDvP z4D}&XbD~lIVFL~6DcL}_xKN=F1nG_Nz)ut&phX=|N5Q)>p)1Z0C#gI7J4{G_oeJr$ zR#DVzfDI^{Nz!6TQeTW)GzyH;Nqv$T)ZNv+Rl`sd2GWWe#ueZ4E9!C4YZN?Tgpn2D zouZzL9Jl4W;PaSFN#i>d&m>JG)xAT#Yq(A)4V&iJQZPsT*N+Ua7?R9(Fz@PN1zH&@ z1gkcoPr$$?z(-Qd$C6~VIrqbA(`t)boAQ2BZ^Ec3Ckd83_qOkq4M8as4sX!hhVBTr zL0kML@gQ_08$f*m8_}qkb+VBc(0L~7$HWM5U{FM+WQJqmD5wD@)j|``U`rF|9TKQY z;`0O#(f<feu@4Hwi=;FXj)Fd6hCK2R`KgSgXsrPiC2Y>bv=CnbQ1nMhpF%Q8eNtIF zJv4V2w&jyA{7v5neP8KyPU9yBo?jeTI`GHdsnR=@)0J;k&z+oadcf|<V&&xNFDQ7x z=Iij@`R4RDSMBv_d;Q#@W&7^QQyF{doh#E<R_(QEd+n-yXWG7V?$)xs18PcqQ@3Zn zJ?oog=jgfSxr&s1cgoh9>AeJ9?lFGy+_|Or`<JHn-#I#cbmrEwwKiqp=5%uh{_U|p zJ+^3CZumy3{_q3#2yo^eBMiW9oa}}nz_x#Q`tZ!9WouQ6srrX?7mVy5)-3=dp%MN^ zT$jW6A=}Ya%951}6_S3A5nHs)sBo)-*7z&fc$lPa(i_ihPQ}<L@63pnz~=Dv_<(SM ze052hqz080^uP+nJ0_LgHC8ZA0ONc;KER?+nzn-}U<K2JQDudq3{->_pv5i9Z|D`z z!ODm)V1fs3;(18?jCcX_C?;eV?iyfbfI%D>9TJ0}wD%*7S+=1-45*YX8^KJ8k4dt9 zGb}QWcnJ|1l?uWF;!9ZkG9<<5y(~xXimIO@_y9C`0~?`KoTRcg%2~DQs7pKQ=9-rs zEt98_j4D!A?vb7{J674+G+R4oTw$9(vsbR#>(X|Fv$teTl)(zSfvbFKe3qWwIa@yG znmahR>z{>;O-R7#Qvbl*al*-N+COrhc7<#Ue9MKq479~xF)c~k9VT>n%_s>z;ssjM zN+$FLSc}Ph<gG2gq#h2c;JA9hp!uC)htd_5v5Y2T>B4h@r|buO+rLFW;8`^F-lrA8 z${-EO=3rC`2l$|PW8l6HOspXRG#NAcFBB)<0hk~N@n(1^R+S%fC_aH~$D{G!ZQ0mQ zo+5B5u!T5)04TZ%ylf_<9tZcNNHiBzSPKNSS23El%I9H#dK>;E36f&=(^?6L)J0*X z<k;ldHM=V>Zs*MN2bZc+7Y0)H+GYDC5V?wBHM4Vtsn`sun>)3*`{Pmq*joVjkf{(m zq2En%GDmQ&L{1iv#y^(en9T&2)Ft&fVlfopeM(YD8t_nv*Do+REJjcUiX5FJjlUDg z{Z{<|$r*daYp|MP2$BJj$82$`LK#JfL>$5#p(m4g1@jm)AYR3UNX1>43u8iP3Y9HF zQ#t)vqpB@ZFam(zhd*f?l1b_jNI}mQ!+fozdET}-xHR(d%gZH~{uzm@a9hj~m;AdD z7hOnP+UEwHS|?6`96}9g%TJSoJbeRJRrH(D9xWo-G&qoox!U2Jt(ZrO5-@)%IKf11 zfUhK9ujM9~0#ZlAVaspWyQKhLlORjs?9#Ac%#peQY~ZpYkOpn;G&PPVe??$;QyimV z$PdPd?wTz>4F@O{?7KPb9WjEnnzN3<3U$Ky*%M~@D)rV_&N?;sf|d*Fz~>C~1SdGg zaFhpwuz)o-=wk^VcMT2(BrZ0{T?<EpaN2<G$!GnJtz!5zU=e#Ui9#Y9__2{uNw&O% zK2maGEi*a6o98K69}&P?rW&Juqu7NQkfmgcV&f|2EOsj5M^cy!X;fh{MYVQp<}ndj z>d)X$`UsMuBHPtG&n~<6PM-V3<jPpRtJbQtwQAW~Gv|9?ZO-Z#dsC*Y_TI$ZiMPKq z!>pB6-Amj}%r(w`d!=meT?X7urPcSIx%<r2$zQp=_p0tzt-2c0t_D!bTb5o(^}n2Q zH7vVcnKEWr=N<dBeP-|>Tl1NcpQXRwFgvumqdmQ&eYvtDRk0_v=Typf`XPJf*N<FO z=?*YubDjSolhwnUV$FU)HFvqGkKEp_7X3$l8q)Snt{e-@6?9>G{l5^#y-tB+hAO6g zYV328y85wd*nwjvuSX~Kaij_Ii{nz0-=I!YM#Mh?A}+$dJe>sdk=GTHXA-pMtFME3 zhwP%iNr_EK21;t71lgq+76x_^19Ai4GD6-&^162ml$5vX80xLof)O+Mapp$Znimeq zTw9(cqGiVu`v#WI_01IRd+5n+-_gCBb9m9zTN5zKKYs$WvR1~V9@^wa2W|c%L-FRK zJ7&(|)=&8@y$PlTIADW5f`_5f*tKCe3jiLLBsdaG7_kmEAXEnwg8)D1=j4@`1}516 z?&A?)&@i0dfX*Kcfzt?%C(yM$HVUq7V{mj7PEy1%L_tgiBlx8RF;4V-S${(qC+fe< zAR?KCAp{7@t-R@0%>Zm09>l{2L7W1lAHttR0jYxT$mRf#u&?so@ZI6JBVSTBL+7+* zN<VdJ&FY;IzR&-ld-m#zb$7<*y3;e=GrNCIKRY&ee70uA)|@G?`I0i(_s=jHk1ti( zk@j?C8g~H?d3)(u7Ha>*_Q$rloAX19-@boi{_0Zw(kt%=e|lx9FV)oZu>AZNdIbEH zw|0*Cfw1Cj{fTFB;Kvn9!9U-TDXqBIbGK*i;5=~s{pR_K#d@&7>wfg|;tQ#|=O30H z|EvI@JXP2Euyo%SP8dnnP1)TA<2*4pHWvmqe`wpAt$>+jE4SFlihc*2oBN>-K{)vW zq`y<>jy?(YGNJft*mf(Epq(Lg12;awjRO|&CK`qf3!Fm)!$H8XA21O90PZyu<=&iL z2QI4OeSqD}vkFi1X2@F<ek<ex(yNv9`WMjakGJjBrfrX4m7Bg+WniJch(4;x#0fLh z7YX9Y)mxyxh~qg|Z+*h7?Me0>9q&k*wYeA0_X%yBN$cjXk+g`dPk=4aRsgpDqU#>_ zX!Mn|Xt3H7)d;fYF0$rcSaT1oxtq|6EuK?<k~ZG6P^w8-qRvpfciT3;$J&&UHWk`; zeGSCZgnhy>;hZRm=hUO5J?Tg~lO>vhrS?}&+E(S-f>eW+C49w%ou?+8U*8^VfXd#) z4p2DM!`F5-8;FNS+d&YDae<eap_mj;l(cYNDjXgV$GAl86WWE~OgsV+7_v<i;$vbo zKwN{eRXG|B;E8g=nZqWK^LQeh6J`z~6!6@XBcUycnt~q4Xaezw1Y=b3TO=tGh!J6* zC~qNWxVeL6K&u?nCiGkfm#BnlI8qG3e7NI17kcpoJRXDd$s=6Ci*@AGwm>Q$Ni?8+ zymxQA1cHC7n^IdFVpE?IgFsA)dW7%%TJV9yE)^*pRtw>q0^r?j2<0Z1Xjaf|3rPGh zio4fu+p346r6xPj+l6L+Fc6Ny{&NWnjiK-;oGZ&#s2mjp5vMNuBz27f!N@4M#?&<; zJCryK%|x`*{4T}i%OE!52FBxO#R>5*2yQrh5rQM)TiD`XVuD?Ycd$;Q0@5FY-6(#E zBF3bIl7(#Dg^8l$8elen;vPV(z@L;MTjwL=<7Q*VWKB6c9+*0QbUNeo%$%A|PBE$` znkwHlUpmjGe0v|Vof)$|<?4K3?)=fMjLSO{O}m;vW%X6B`gW&%yXVg@`;JUm)rPaq zdF$fw`;Jue;iZcAkAD2^51vh(xR~<wKV%08o;?rDdw%qC0UmGFs<$QWZJ9r|?ES`+ zCF8DMbvLHnjmz$xQ>KgyROb4$tA5$lh<$RazSgv_b=lVrJvu8^oqN*GJ<HC{f`RW@ zEL*fL?OVDD`}g?LNXpl<!otxoQLt0xos0VyccpwsSJ-2pSbZ6r=g#@*^Qp?cE4EJc zWu>xp{>pOY;fJ;(Sp#J&11F=!k#Ze;U_SWMLm9VkX8dl)lxdBvnY})L>F4Y|GOGg* z%m;qjyrp*F=jz%WePBMCIdpWXH+|@ZG`oMwHZwRoGXL@#yJI#v|I*^s_d%=gA$X2F zFdxZO?wI|(bY(l7e;H>?nKEw5mMO2EvTp{@nkmasMI}IWP5ZHsAu2%zN`EJn0POE# zr!(3HMyyBdZOgCNrdr^NFZ53qvBZmQspu#wu)B-3Dzee?6gZcF^zpY%>)eK?Kx3-S za+{X94e#-mT6q2eP@?!k7nv^)tL27q|J?EebKq;O`*(GqS~0^lTbjXZ(hvu;N%<x9 zw`mDZ!}y%K1-=eyj9xHl!TIEbuug-|KeZJABWw?BoF*7gL%vqaB~98I13fUqO<H;W znZy&wo%weyx4`DrgSR>vxWoiks^DL~6g?JuDT%%X<9`(l0NmEq6LWKK!U0<@IWg}M zqSxa?iCtGfCSQk5Lu$tecQtPF>g(~Kbfd6jBGHzIg!n6rOohl86)<0L<k@}gdj=<( zz~f=Q78C=w!aVfiKB-14VW5!`no9O(Fs=-7h{=!O@jB=R*h<@sd4FlK%}4PH9)k6N z!+Uk;GJ8SGnNI}8E+t6Fp>?Xhdj>@CfDgjS3~W!lT4)>rfB4v_Y=p@NVH(d9#28+L zD<JDJ8p#5Nmlz<98rg75gg4nZHVQryK`xDsjVLt%Eg(za{Vegb$gEbRcw8Kydytp_ z@X5f^i|=Ar)`C@+?OFq+b3<roEP6viX`$^`%3kHl!D+j__(K5t4g5)XNK(utlMgNO z)~tG)(%z<3uRrber&^9Idyh``u9@w3YNl&e&9!MW1iy4<*h6cq4c#ls3DJCGimhE{ zJ934MX|{2h-I;s$r&<3pyL;Vgv>3CL(=b58$&<yMDQ{WW|HGsAkFM^1CcXQarJ=tX z`RT~=?w(Z3`IN60wxe=xwcMXB_h)QnYi`&kANc(9^s>7p<L2g>l)Dwqp(<L|DW<|Q zWryP^-;P!9uC#a8vKOKfbmjqisykyVz0*70J9}WoR)_h%>Au<Xi?6I6xR^e0ajNg3 zt^W%HLVi_+qxy=B?F*7_NNB5kq(9;5=JY?~4BdV>hlCRChh{z57Etkk@EzSGJq|1v zR|O;-Hx+IoYO7?<N70YYLk(BaFa&TY`ruFqEmHCuF0wV`w}IcMbM8eQurfrRaG(i? zc@E=l;XFoh4PsQFBs;O}BsqIm{DTGv5f9yvZ6|_!E|UAcUe<@=w`Bu~aV8E23Fi;w zrcj!l;0H<%pf6Kgf;zaFNlECAgrh|Z#o8w)Knuz;dc(do@USPQ6SGarPA<iAzh1LC zSFN>aYc2Q-pw{78b#Q41m#W*l?C4Cfo#1>k?Ast`n}1MRN&PGTalO9y^5Y>CF28DQ z!$(N!a#100!-beEWnceU)U!JEgQ1Czks{#iG4|fq_4aPiZ6HR}fZhQRM3$j2FMxgv zfsYVo_+uD>Yy^P=(YdhFe+jSRzrzI2Xk`{cR7qGc#>*=)!P1t~ul!14XtDSKG^@px zJPH|gC1-38Ox3WMpH=KgGrq|)Q$rb(b7tS~e`n28e(%`bV{?|p_=@M)6bnQ?Gn9ge z0jBnG?*>kg&@7G&7fnRBJmk0jL|DeWk5AjUh=Nii)GS{QHXhvz(f=+GK4Eh0AOPfp zQOYD1Qf4s7Q~V3)ZZj=eA>fpc2ujrC&!D;u=g&cAlKKLoj$AWctEK)2rTz@-_!Z-L zvnRutzI*14Gk<W7OcFkc6Xh}nT?S(0dV%;NG=_2pqpT9FcF!Q8Ya1aUBmYEq3<{!z z$=!sfyJG-E^EWU&Fm_?UI5@&%5)2M@8zny=mf{5T3LrZI*BHWJ=!zdhX~LYlNB~Vj z;!P+MQE^H@h%Nf-p_CVIW2p~IA-b5v?nCjQY#>=#CtkzV8G-m45zT&VihK+(!$eq! z<xraI9|N4PLBwmWe>H>#z=uTCwUjZD@OnH{AQ=(WEkulDEi;6;|2-6mRfw8Vre@-m zOB&*T!WuF?7%y<s?QxJj_z<fRTv-V*or8i!P-DbplbX2>mGCQlUPL8M+yRMPqC{nb z@vBB<i>S)s4VADI7>oq3=TV9rHZVd!283&ib?_qAW6}VLI$ZG~7UTzE$wynux?9)8 zMyST6030MtTGw_n(eje=@)R-BBC2~L>UJPVuq&B`Q3{|<iLy<J>Q@{b`PB*)YU-$W z69!)cRtE;BC0kN2!9lPDu6;?DH0I*#=)$ckX-Qha;bVsrI|eYo4|Hr-(p4;;E(u2) z@thFIZ)k9Ik=v^BPXD9<v{h3<O)jP^X$F@T6VDw(6pNqB$ATtHAeKUv&tV!){#2U< z#_3Kv->}DXj>9CpYmhV*ZBDws&S?lD%{^S?+)=a^xZd1(jU4VB!oNKJt?zOCfaF(9 zL;sF@c$Ze6e~KpFn(txU#OIuZpr4zzYV2<vQ8f0)%AeKB<H+>n2P(w%2~Qk3nf!{` zKgH}FO`uPdCQFBNmXC%70>RigatHY(J=)lZky*C<;2_DI^guXQ&T<5m=4;oeaQ3gl zJ<kcx?|I%@P@cE)N{%gY$%2~i@u+&qEjBWO_iiu-P`mL)0PsQuUU1MZd?Ao}wE-?| z4GH-R3Itqc@Oqi72Wbv0{{W^VE@N^Alb>UPZXiD`zKsuy_#d!{2w);_{}x|S*HUbe z|BSg5CM%H07I2IS5NU(Aj1z_{Ad;>o*ef0QJfe6Z71PHnB7=$F!{iNY$naq}V=@np zMMLpeEF$40JUG({M#yN0h7b29AgWOr$~ZQ})1abO64`p#KmgBo0|5wj9+$+w#$Mn= zDgZa_LSXUvy<`JbqAQ<vj``KX*($3=*6q*m6&DOVfkZ1%j3B*mJ4Eas2{$kNnveYy zRg=NX72<yfpu?yaoPh-Nf|KA&a(_})|EK(Y;YabizW2RT#w=55C|$FAW}D{AmJII? zuGr6KsZ#Ua)QjLCE4x>7w+3P_GbJ84SDrofb~005yXLK!ZG8K3##fc`R^WSi_3X>< z*zu)qZ>GB82d}O+9ZWYJ{K?q+*H@Z)Q&oN03d&u(4o6K8745O_g;OPWCB$H-Jk4vR zO>;ww?8DN-pTQ~h`Mc-8*9T|Wt7Xj(%9_{8ch22jDc|!|Gqm|i4`X_CkTS5S#mwwl zbvHe5H%-0xkZGIW3&~dp5HVukAfRLpzj@S3*~-79^e{uW?_TTO)>Ze;w0q~Wdl$I% z)H80w_xZVf?}S%(>`Cv~ld9RfSiaP-<W2dWTVbDHW36}CX?DhS$2x8OP1Xd6HYEH& zGtRD~)SnzL?ds5fu<uY;gW<y#7V;l<vQYj}gQ2U{{LwBGlzh}-==z4~qx~i<KWgsY zt^aH0cun_C{m*t9;00`U2vS5hyv+2*q5^PG7oZn$V-WubCaBW-=~EDHFaWuY67)NV zVxrJ~QMr$)2BlpCA}?rQA>lu=f!Ntf6wtpxY#0i(VN=2+l5j5$?!6wwq6$1ty+Te? zuaMeSC6?mq)dHl-5XAq9hzOPbFU*lqehxX{?JHRDcbJgCqg<Eb|Hd-xN&I_E@@*cQ zFTuo!ZvvQH8n^(y?=J9tUligefuRRLH7ytrOFRr@iNrsI28mkGT|sqjKMx1O@Vo+^ z?p97MJ02asN?1zVGHf-FgDg4nUBaohI6;C)&h`}ymnFu^hMkyy?Zo{9o_n-iHg+gw zeMFh&k|<I`H`*^~_k4+Mvth{(M#1_eGzAyOU&2GoVnXboFEIBKCRkt4f1@H~kSG*M zLvko?HoOI&kjxtr_<T1Jlt2-2yN<6Ya}(8D;gtcOf@^Kij7VhCjC?iHjL2q^Ljj%e zDddvt3+7A+iU>8*bQ!=veFhskPQ<yg@;}ERkZ+JDBC_tjE$gl!d^^`5Pd5i-OCT^f z2Al&DSp*G^68|eEWZb{R++j?942kU2?xnOV*HXk|SZdFelKUq%yhMiwY<P!`>;kft z6sbNfJ9z>1n)vtBIyI8hLh6)jcBTNVBgQ7-h9q0zWG5sLl90&$BAWteK}00N;<7ye zt~!WehP!y+yHdiR?E|k~=niz9>F#>rZ0~8A)i|CQgybp<i6a#QIKg2|BADP72ABLW zAcA~v=;=b&z{P<9nN>3bGJ{Mc8!kohV!;2wR#TYZ22Hj^;*%iewD>bb2X+Zj5@Z&x z8j!nxvQe=XWd;dFe1t8@x5T~XK1Ga6vIT9h$6%sk5#d?U4!aNhr=&2f3HT{!`WICF zFR7AGDeI?{<x|T3OUm{s<@=N>{gm>2O1Vh}QrCZ@s(wK={er6b1;u@)H?Qi;9_Y(H zWjyP~b2MGCepzRs9giw4bal4UNmpmwWm!EuKeIWr26)1uNhy~#VUDF7%~><%ER@l_ zZiU>VMk8IBbzA95(hi=a9X!=`m{Zze4%%7Pt&m%<E}_rT*`1Wtb*FW@b>`;1<lW?4 z*Su%$OuDRXUP_g9rY-v>O&O>^HhpZ?H0PPMrL9eqY^JQ{-s^W?pW8QY{Gsi>ZLxo8 z*ZZea2VO|;>Pa>9q|45ysM2*K4ss`Tn(m>q`bPRZow3-}jCa49d9F*zd}c7O8xRIA z#Cd3N5w==sI12J*_3-@6>dzYB3A3^JvL?*2l(A&pjJawn&8dK#3drRExf~#utv1t6 z0tin62u~FdbAZvZZpK_W-0GP0ez)e0n%S`xx+z2B+m1JO%ot|7R-iN54)4`(RA(4R zhG8>|En~K28FEq5Zr16trIgOG6~bbllBOy%c2~xH<dNM3P$dOWPJ+h{crxZgkE}+h zb`(_GNVNr)FNb9R<4EiT%8F2lsWIYki?28vQ|2bp?SaQzXn3Jpdu7I41gAEzf}V>H z-(EPlwxUzWjo(%d-GO7!+(SQd+F-7g1#^X2SaBWTPMLY&aXc^}SSCjX_ySh^xkryJ zczK3_W5^PSS<0AO9&hi$&xO^1zVY#DrFXlA;DyK64BC07ym%RC=H#-uB4a-H$i%=L zECq8Qt7gt&DZ27703ZgJFJmvyn0KoE9HiTkmh|u>91KsOP<wsWggM|~SJsR<3uWc9 zR?OKb+peq~a}LVt$T~4sLOB|;F3h<x=fPYlWv$D4G3TRT?aDA$PB}c;3d~hfWmVZK z%vDo%SGERoJ0M&tTZ=i4ayDh_Fjr4G+}Q@qH3GMM*#x<D7Z9_OSYaKMoD(Q`og`jh j2qjkqUs}oKTjX;Dn7on}dP-Nf4$00hUSgmVB8vYX?p{Tb diff --git a/venv/lib/python3.12/site-packages/httpx/__pycache__/_models.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpx/__pycache__/_models.cpython-312.pyc deleted file mode 100644 index fc7fb86afcfbf8b72d93a78eaad9980fb8b775c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58609 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 diff --git a/venv/lib/python3.12/site-packages/httpx/__pycache__/_multipart.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpx/__pycache__/_multipart.cpython-312.pyc deleted file mode 100644 index 283b2568477b3f4c8e80cfaaa1a400069aca877e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13620 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 diff --git a/venv/lib/python3.12/site-packages/httpx/__pycache__/_status_codes.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpx/__pycache__/_status_codes.cpython-312.pyc deleted file mode 100644 index 19ad4dfbd2e9d0129fc7b535f07a9e44a53914a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7207 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 P`TOwHPe9f*cjo^9pOLV? diff --git a/venv/lib/python3.12/site-packages/httpx/__pycache__/_types.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpx/__pycache__/_types.cpython-312.pyc deleted file mode 100644 index 2f7c1cb40b58bc76a2f9061db832bb7a5de1b899..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3839 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 diff --git a/venv/lib/python3.12/site-packages/httpx/__pycache__/_urlparse.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpx/__pycache__/_urlparse.cpython-312.pyc deleted file mode 100644 index f275fd6044b7cdcb043084e4f41b20831c9754ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17500 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 VP8FDb<@B7|X8P4p&#4O2{{bYXaP|NI diff --git a/venv/lib/python3.12/site-packages/httpx/__pycache__/_urls.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpx/__pycache__/_urls.cpython-312.pyc deleted file mode 100644 index c1fc51bcb7f4b213e0c6d6519327fbd0c48117b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27943 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 diff --git a/venv/lib/python3.12/site-packages/httpx/__pycache__/_utils.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpx/__pycache__/_utils.cpython-312.pyc deleted file mode 100644 index 0a1ffeb0c85d15b80578e436fab1c1e1b6ae7ff9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9376 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 diff --git a/venv/lib/python3.12/site-packages/httpx/__version__.py b/venv/lib/python3.12/site-packages/httpx/__version__.py deleted file mode 100644 index 801bfac..0000000 --- a/venv/lib/python3.12/site-packages/httpx/__version__.py +++ /dev/null @@ -1,3 +0,0 @@ -__title__ = "httpx" -__description__ = "A next generation HTTP client, for Python 3." -__version__ = "0.28.1" diff --git a/venv/lib/python3.12/site-packages/httpx/_api.py b/venv/lib/python3.12/site-packages/httpx/_api.py deleted file mode 100644 index c3cda1e..0000000 --- a/venv/lib/python3.12/site-packages/httpx/_api.py +++ /dev/null @@ -1,438 +0,0 @@ -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 - <Response [200 OK]> - ``` - """ - 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.12/site-packages/httpx/_auth.py b/venv/lib/python3.12/site-packages/httpx/_auth.py deleted file mode 100644 index b03971a..0000000 --- a/venv/lib/python3.12/site-packages/httpx/_auth.py +++ /dev/null @@ -1,348 +0,0 @@ -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.12/site-packages/httpx/_client.py b/venv/lib/python3.12/site-packages/httpx/_client.py deleted file mode 100644 index 2249231..0000000 --- a/venv/lib/python3.12/site-packages/httpx/_client.py +++ /dev/null @@ -1,2019 +0,0 @@ -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.12/site-packages/httpx/_config.py b/venv/lib/python3.12/site-packages/httpx/_config.py deleted file mode 100644 index 467a6c9..0000000 --- a/venv/lib/python3.12/site-packages/httpx/_config.py +++ /dev/null @@ -1,248 +0,0 @@ -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=<str>` 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=<ssl_context>` 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.12/site-packages/httpx/_content.py b/venv/lib/python3.12/site-packages/httpx/_content.py deleted file mode 100644 index 6f479a0..0000000 --- a/venv/lib/python3.12/site-packages/httpx/_content.py +++ /dev/null @@ -1,240 +0,0 @@ -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 (<headers>, <stream>). - """ - if data is not None and not isinstance(data, Mapping): - # We prefer to separate `content=<bytes|str|byte iterator|bytes aiterator>` - # for raw request content, and `data=<form data>` for url encoded or - # multipart form content. - # - # However for compat with requests, we *do* still support - # `data=<bytes...>` 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 - (<headers>, <stream>). - """ - 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.12/site-packages/httpx/_decoders.py b/venv/lib/python3.12/site-packages/httpx/_decoders.py deleted file mode 100644 index 899dfad..0000000 --- a/venv/lib/python3.12/site-packages/httpx/_decoders.py +++ /dev/null @@ -1,393 +0,0 @@ -""" -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.12/site-packages/httpx/_exceptions.py b/venv/lib/python3.12/site-packages/httpx/_exceptions.py deleted file mode 100644 index 77f45a6..0000000 --- a/venv/lib/python3.12/site-packages/httpx/_exceptions.py +++ /dev/null @@ -1,379 +0,0 @@ -""" -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.12/site-packages/httpx/_main.py b/venv/lib/python3.12/site-packages/httpx/_main.py deleted file mode 100644 index cffa4bb..0000000 --- a/venv/lib/python3.12/site-packages/httpx/_main.py +++ /dev/null @@ -1,506 +0,0 @@ -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]<URL> [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]<NAME VALUE> ...", - "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]<NAME VALUE> ...", "Form data to include in the request body." - ) - table.add_row( - "-f, --files [cyan]<NAME FILENAME> ...", - "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]<NAME VALUE> ...", - "Include additional HTTP headers in the request.", - ) - table.add_row( - "--cookies [cyan]<NAME VALUE> ...", "Cookies to include in the request." - ) - table.add_row( - "--auth [cyan]<USER PASS>", - "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.12/site-packages/httpx/_models.py b/venv/lib/python3.12/site-packages/httpx/_models.py deleted file mode 100644 index 67d74bf..0000000 --- a/venv/lib/python3.12/site-packages/httpx/_models.py +++ /dev/null @@ -1,1277 +0,0 @@ -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; '<http:/.../front.jpeg>; type="image/jpeg",<http://.../back.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"<Response [{self.status_code} {self.reason_phrase}]>" - - 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"<Cookie {cookie.name}={cookie.value} for {cookie.domain} />" - for cookie in self.jar - ] - ) - - return f"<Cookies[{cookies_repr}]>" - - 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.12/site-packages/httpx/_multipart.py b/venv/lib/python3.12/site-packages/httpx/_multipart.py deleted file mode 100644 index b4761af..0000000 --- a/venv/lib/python3.12/site-packages/httpx/_multipart.py +++ /dev/null @@ -1,300 +0,0 @@ -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.12/site-packages/httpx/_status_codes.py b/venv/lib/python3.12/site-packages/httpx/_status_codes.py deleted file mode 100644 index 133a623..0000000 --- a/venv/lib/python3.12/site-packages/httpx/_status_codes.py +++ /dev/null @@ -1,162 +0,0 @@ -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.12/site-packages/httpx/_transports/__init__.py b/venv/lib/python3.12/site-packages/httpx/_transports/__init__.py deleted file mode 100644 index 7a32105..0000000 --- a/venv/lib/python3.12/site-packages/httpx/_transports/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -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.12/site-packages/httpx/_transports/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 87d21e0c23f8f556a320849d52fe8ba3bd7967c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 456 zcmZ9IF-rq66vvb6=@sRcR$Tl9CtQQNN}(dCgCbZETta$@cSm!{c}ZIjCqIRogPVh& z#BUJXoLofg*2$c;wfYF*_s{>myu3X7{tB@1et(lRApozHn1%BL<F<u6KmmmuJUMVm za8AygYIAZciUD;V;Kfo|3*0w*I|!hGn}KKi&e_3Hw;)30ve2f{QKg9Xh+@BI{$Dvw zIqY^%7gGMoV;S`q-1EgAC&99DiHcL>_G};HQFciNTpKsDRmL4vmWMIn9OFkYu123+ zp+sg3WkjnX+LzHFV?ryW8E0`pvQX(X>a!xGawNDUloe>m#1Qechw@S<QtY(0wvkFT z3v&|nNz4>Vw9c;)*0bpq!Z;PF#<-Q2llpEZ>439#v1VUT{h8XZ+eZyT_yU^WYkdlz NZhh6c^@@h|zX0#hkCp%c diff --git a/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/asgi.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/asgi.cpython-312.pyc deleted file mode 100644 index 6cd8c0e98b08570bdc7b11a936c31b028e7590e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7593 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 J2Z)Ky{{a41-_rm9 diff --git a/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/base.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/base.cpython-312.pyc deleted file mode 100644 index 9e98f43cc731266399624b3ca02f73bbe034f1cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3886 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 QUvFxswZc~nBq(+N1!sE1LI3~& diff --git a/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/default.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/default.cpython-312.pyc deleted file mode 100644 index 562f419bc6f225b593698c772b20046f59a78dff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17139 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 diff --git a/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/mock.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/mock.cpython-312.pyc deleted file mode 100644 index 1f0871b05d99ced9c67e67521e9a40525e6fa567..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1954 zcmbtUO>7fK6rNe{de@GBLI}hJ61G%LanxY((^jIWQkqtciked3<jZRDPLd7#V`kR` z2LlnHDp9GTUT_Xo#i56wh<i^JoO^LZC88BoBXMZCRF;xTh*RHNuLF*%_Rwef?VC6A z-pu>nH}i8kog^TCet&hkArkTo2W^SB47&Lf7<FP0gIdI<MM}{YETJeEF+;RswpbKx zsVIS8GU8U;mW#5j6ctLCFw@gc_v*{UDaxctVIR1P$$wcR%<O#?)wT@55Fk2+(NT_+ zAy3g_S|FbiL%B^1naNC9g?dnmnW~UaJV!H6gD%~1TwnK1*YPHv3+NOA`7FCsVV)l- zXPH-q8TOpEW_m`ws#E$%_t<%^J21!nAiZPwxm&upJzK(k+Jfmp=;jH~b;3xI8U#?2 z40>BE#uB9UGvbB-WAU|d48~Gb%*!16Q;HH{GJ<vtlOnQpQlmAZp+A%=xlbpcOnF*& z42y9nPV|^H$ultRVW_IUv<uU&%?h^edzT9zyQPZF9N#PW%wkhqw?{nREL~)L#BgUF z%he6W3zwO5xnP+W3gxOl?K;Pg96eU>OrMRE_0mOsig|@;-!ES&Xnq?euV4c%N6OVe z(KORBeNCI&+X2;)w!a(CmH;(R*82t*#BWlYFzBorn;BMp9Sp2`20OGvR--W`H8KOM zcS?<}Mp4%UUuw_R1V5rWA*&J6UYCyt3dPutx=CxoIUvl$+&g0-kJO6CRNYZ^WQiJK zuA1ObL(iCH0<?K45INJ0un9rZ^i0R|b*IEQ?i(b|SIg`Z&Ru>##<S>=d7F<s;-iPv zsH(~lt02?bNsE@v9q7chb9OgGc<+IlCryPUx|dRmsXLkV-F@{_-=4ZBKi++KL3x_p zw|w}A@n5ndPkZ(^4t(~w=X4`=dOh2>kmX3T4gz8;ZXp4`1LHKI|JjaP@LpVn0`3a+ z*jJJS5&yeA$(pb;>oozJ^FFzA6#mMC*evB~IAC53Bz+rwz6V?(?7R=GPFQ;*;KFWh zgL~*7!R=TxfT_ko{Xt%YC};OB*^Bnq?h|F8p$v3ly_F)}{Sn&h18>!@FN|*>(9Jz0 zG5Dg{O>#poy*D7)&EC-zy-P<Gu|5peBT7e;;v+#uJ4r!L<i(IubN%Ole&ekhuh!J? z&5DLWoHM_|oj{y$9R>k8$jp)Zd=M2fFdxS|>gYDpv>>Tzwrf-@v{RaPsiIr08NLhG z_oKpk?~{-jAtA#@DpW{c?_E&0$)-T1gUz@i<u-QZni71QagyxWl+o(VL~i(o?kyRt zFk?Q8XPB(Oso@M9i66xMYT0zA0vXT7EU#5SczeVP@Hle?R&l(sfik9BmVUuvLDy@j z1c@=1yA|JbSdi+#N7gh5fQ|5><!_=w#)oyiR8F<9_>hl)58n=N5>zurDgBikdPdT} zled2($2T&)OYWk(JiBbJ<QjuV*D}ZEyVkRNmToNGxF;`HSB9PppIjS0`QwR)y$`Q6 pKKNp7_)O#AnYHYf^C>7lwZD<vKQC{^571nrcW5R37Xd3g$KP-}(Z>J) diff --git a/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/wsgi.cpython-312.pyc b/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/wsgi.cpython-312.pyc deleted file mode 100644 index 4ed33fd61a51b33f848349e644d33f3bdf10b3ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6828 zcmbU_TWlLwc6a!GiKHZ3k|o(1OIq8ECF&8UPW;+9l58uoB}d{W2vcV?=8PoDLk{=O z&^BobPyz#?yk6M;Xl<j5TKlyQvc={zML*iVe)LDOwh%M10T;Vyo1cP-Tx{20J?9RG zlITZ)UWxa4?wRwt_nve9rLN9Lp#0b0UYq;2fsjAoz$#9&!)^RKbnX&~NSs1aT%6;u zZ&Pe>8*A-xJ8K<r2Wy>ir(~BLiYw)gyHlRH2jK0JQ}L#JaUb+ul3Veo0`UMxWaoUV z^|{TK1^|yo38q5v5c`%_38(7g^&GL`j_yrJt0(!s;>>=$QS#4n@f}iF3S4)@ciPBl zBGp|dQc(7NWv{?AvDpyJ`sF}%wmD~u)PIj45zg?7>9negdQwem<KNqG(q_0P<)3F| zO*cG~vX+4r86bmGxpd;aoGwr4R2Ea;BOx$d_nxT9F)F43km@kuo5<)RR}-V@85KsM zkETwKp3G#FWP*Lfun94v4kxR75*3z^B7({Q^0|#^=-efGb*(@w))z>D43i7H30dF@ zoW|XB=@o_vnRmdpno{6qIoOT7K}py+GDRF@7V0m#@rd1UBz2h@UaWOhRW!qym=lv} zkb~o*D&=sPO<&S*KhHl;_06d%xi2N^+U34sHIYrpX<h5nWksH)VyaiulZi_*?UmFk zX+;$!nf6_l)0g{{<i);BPM=fLZ$<|O`!x7mZ$?a95@%(tZ%)@USNjCr5~J34MVn1V zGdZJG&@Lr2f+CAjGCeEEsf?ZzOoC_=P=r72FjR}=u|IU%@rxsi!=?J2KN6dBu;?`W z;m3{bcYk{4r^_SDhaV2FH4Z!q43wR)Say*>aB*}4wvq%^R;kE|+d%ufOJow~Bmzgk zDRE$Eb}(xjv<}HF*`amj91)KZM1^kJMxug)p{#2348ylYqnreoEwd~Tp{i@WawG{U zaF*6#y{hFL80k3ZMNz>r9fo^W1`F1y;S$&s6O7>&sH|lb9rdWm%8cPM#}!4=oj{J^ z5rkwqsS85Bc{>YHYoP<cv^`LPfSY#Tn^~THsIN60DmrfZA2$zty>G4goucEH0on{8 z+bkJn(1n)#7tk3a9LTaj=AmC(z?NO6E&nxl7cQNf9tX*hzq4QAXb4~<9L3K^Y!pc` z92t@7FYo}i`*I%G0+3<y@So&=7D;JG%iXhg&i+U^Z*y_D)X?;c_kXZM|IZp8p3j?i zaWC)zlIJ!~!0M}b_^cjytLhH`E9I+7%K=9@V(|k<7ujN>#Z5d@25p0Gen*WSm`3-* ziiS5RQ11`jI=Xap#ot*9gl~;4js5am*-ipoOabE&2jvk<lb*}Kd5Mk!|KdeO{^TND zT-pV+0X<98hGSe!%OKKyF97Q*tpHb+DSkZSLQ_eLDOnH<pCF`EDXU;VAP7Itii){H z_W~%zbHjM~k}#r7=62yMR;Wy^9;)kP!)9|H+3?t$&Cj4}HK7qE0l#Vi;bY-8-i3P0 zf#l+LFERflr`6lu!eO;vce2CkV29Nf@z6RzBicdNJ|4<RK9SXQHN{siA6}mmb$(7v zONy-Vnw-X)ho|O~pz%_Y$_ZV`@w&>3X&%+Zi<wN6VT;Ylyp~L5V5iPs5gAZclL2K? z<7cwz1U@vPlGJlNOaKORQRb%s#WXL{S$3aBeGJ?5^fYS|N)j$v{y5L>$><Op9)KOk z;TNfbvd&2bRGx;n=CZ8hdib20<r6@r271o`89<74$@0mxri<x>%*$8teM$mT78gLA zs3__cjUfO!lj($#m1N*J$BUAbH2L5YYI-I)o2Be+tC9~=%gBl3Oftbpg6;TWlvMT6 z;}eRgX-Bs6xk;ME>b5-x7&cT|h4r55gqEPmjLr=7cxRuMy_iz7X}xn3fXXRVmjxi5 z9`7884o2UM9_nP<P5HfC#8rZhS9`VMu4v3+<&BCadwDbk%Q&pp-xM#vP%)_iHJOYc zUropv=6+1`z5ILd0L!4RBp4k!3}AT48PJaf0}D)+u+ze6$v~S^vx>xDlzE0+it@wq zj0g_^n%Q)WX65N9KLoe|0<3|}o)Q&Jp5|v%$_z09u8da2mrcy^A{Z%{GSY!61a<3Z ziRuh5f(DsYzSZ9khr@J}s{C!y2eO5-psK3#8Bw3()ii%)E(zEzt3Z8P?C_g>FdfQL z73mfoBGQw*rc)-NO<^%2O}a+UBbi{gYHI8GHL+PIYdir@PqpBa#jg7Ip#xVvxJ^QJ zv0&T!L>KHZLU>jRj;+sg!3iULOIWe4eWzguHjN!GQ@!EeA~3_hg;B$go{%6@s!}cD zVs8eG0%F>SRX<h(SPep@Av1VB_{xid_i?^y+aanx?B{U9L8ul<IZSpm!;9`Ib-!J7 z{NA&-)V2@XmTm37dRoj^zREUi4#SU$EDsES5&R<bMHmJ5`nT}^@>l1#Dg{1(<*Ul; zx?ltB9&>JMJ<kH1tuusN<+OGPEI7#~*?;w_eSz(JaD-3L0)#fN_|i*upmEFxU&I6y zggK(4lvtUE;H$QPXX%n$@U0!SE8zc;dGv5=$}8w<sR4uGD<EGIjLoA{Qd1<iCG}U} z!MD7o=xB4S6ztY+$pd_JTJxK&<o#7>0j1o%IcN3e(KV?l;3<AU$X|l}EjSlk1?TH& zo{!XQhoR+<&7<Mh6v-#~tte^1U2sc*%N%t|bp>}GAYsP!`tQLd;64VBH>VsBINu1v zF9g4!mq-mYZb@S?SPT`zGj=I>y>0=e(_2Ff3;~~~N{?5^^Ug}aYsq!Nw-jEqy-z;p zmO_;_NSl^|Qiyq5=#%0FQB$ZBAi@aoIj6sAEiQ%U-?I9fttBrLWA(fKrO+_B<-Qe2 z*k>W4yZ|mD(~5f`P;k#<I95}(SW@8i>oc}Hwwn<LS*Tk8Z2CJEqJqCrSMdF|-inu| zSR|XUF9a6cS4d>X`1j`lH2Dv3O<=@>o|56jS_3~8?+c38R_v7F6tzS$nfIKD#m@H) zL<b_Fe1Jupmu0Gfca{&aQI;x#mY9=Ma^A-#lIcuV&$H_|YF@|rFk48$8=KVUASoc_ z>o;dIR87d5mak(|G@BMw@U@KK<j4m<8<~m;=SE^@CWa0F)X?PU`Is<%^4y5wJ%2KG zMi?DGHDLq*YVu=YDmFPfej1=gCO;gRG@-1)`H9Jx5vr`5pPYzI3{9Lh{F5W+CSoJP z$>HJ2=UlJB2_TQa(8PFbWIQIsK0ZHU1g+88k@3^9GlmmoAtWk}Hj_BswvFg?<Ms1b zc8q&&I1AhjN5OW(4v{cq4<H8J7AWC9wgsQQyH>bE@uWepa}pX2v6@fQbI&nFOkI@3 z6Zuoy-zU@YhTxT@V4}wqH344Ai75E0RL7W>C1f_|Ej-up1E}NADq#ovu*-14Mm?(; zVQZ@}2buz18y@hhApD(CjXF)1)98ws!<}sS0=%D1o9L{kc5!jhjHH9x>B}Gb|8R8; zdB89b!qjqrwCyd9mAVhD1ooENyNl<(ZQKi8GfF~6nOTE!-4;W@DyF8)Fw;XZ;b7Qd zj*dbvzf(zS`X>+uKsX4KJ?K7NxIod@$=7ctt@r|u!J!!%c30xaA&3T899fACd-%%2 z$#m{QWVhi!>o;sk)o^1PL>rwj+!bfhu)|S;upP2vpbK`Qn6m<u<uud|=mJs~DH(D@ z5_4!U#@FWzCl~<D87@gqsFDmvS_OjP{;xPZ6O215UNM~6Oa?MoZYpOKF(I4o5xW8L z&NS@Fv~D;x@GyY@8T>)`AUYV4dNZQ{`^;<~JLg~laL(yRxYG@Zt0Yy^hR>9+a7oS? zflB|fsAOfs4pVd-fLYv4@eTrKj#-?*$aXR~iqz6Etj=P^oUeN5F=wq>z5DLF6>Hjl z3i9o*v!+h~kM<T=#B)dwctW=VOM#og$2*(v#_z<J-M<O_I<&U4zvz1!YPxl8>Dqdz zV>Q(ADD=U@_r7Ud?K=L=>_1-m`%CL5&ac9M*9S$%)Ar6%$G!*G?q6H)7+CEXD7AK% z+B(+T4z9KxeAM>NZ?)g$zs#5T?$X|UrQMySJwJJnzMrl_ly>nC+U~cl?~1JMij>;B z9*o@|TW{}OZSP%gKeXC@=<AQx+K-poIv*Upf7HbJxNXlp{cqkWbwsL2e&`4{`ikyy zCyDg`F7#z+{lL-H14n-(4)5Emf$rk__X4Gc_VtFY)rPL+(`yYq>kWge4TEb9ht?a8 ztu`F{X6m21)*4O~hf1M_mDXdcp<|_{-OKhnsoVBa+y3>o=xST^;gz+v!^P9Lhi;rL zdjT&Tx8}B@ANX4F>@Kym7wgJCa<H%L_If)@JDSUOXrJzRv+RTxa)-?a*h<+$f`fnZ z;#?DHXu8{Sr{&)M<r8c5gGJXL>pPZRYxVn!uBV~amC(Kw&pxP2q3)GX|B9y{>Tmrm z_bxmfc(l9s>+bczu}6brrG}1WZndFvCD8fDrd{_AuD2dsZ9TZw+WSykZS7xc8YueV z;~j_o<g_>X{w>^k+kX3Jkp2nQ--<8A@446N_~oDcrsvl^z+LCzM}fD?c7Q9oe<092 z^O11NJ^#axzWMO?q2U$J@SivQFwJhVe?HQ4=CCW`h#4gB9T+?u?T5dC@kqctOn$Uk zc9<X~tSV;Mv3V3(4+D_=j>@$VldtNd6I-tmGmYe+Gl&ZFo9u!y52A}6zzOu%=o?T$ z?oyD{gdms+r8LgtZN4R)gh?Eh$?1WPh9}@U`N6iw=_#M$$i6p9ZMz|MDfRT1>jKXG zPwU#tPH0hdU1c}+Jfvw?*^50N_Waljkft{nd^t#b!Hp2iJ!?PW9O2k^A+-jt8+qPX zn_3fM7ffC#EJs=}JvNhtEE}Z9C_brl3M)M9^kb+Dmx%zFge;n@Xr?sqMuG$`tjQX6 z<G^td!g1=wZXG_`!qAzKp)vFZye8P3EK!Vlj9_&fMQ4Mex(s&=P<<#;is1@M6s~Zf z2;Xy-hhx&K5i7jPW@hgMT>v<IuC-aH%65+9o{-Kz5bt*+{2lRqN9z8A?0-VKo{)~G zcJI2q`H{W(iKF|8Bl^_YxcK20pMLh~?cp`&u0<ONJ<zt|Yg=@0xSU+@S=i6D-v0C% Vf#z9zlH*3W+von9unv>+{{n)#h3EhP diff --git a/venv/lib/python3.12/site-packages/httpx/_transports/asgi.py b/venv/lib/python3.12/site-packages/httpx/_transports/asgi.py deleted file mode 100644 index 2bc4efa..0000000 --- a/venv/lib/python3.12/site-packages/httpx/_transports/asgi.py +++ /dev/null @@ -1,187 +0,0 @@ -from __future__ import annotations - -import typing - -from .._models import Request, Response -from .._types import AsyncByteStream -from .base import AsyncBaseTransport - -if typing.TYPE_CHECKING: # pragma: no cover - import asyncio - - import trio - - Event = typing.Union[asyncio.Event, trio.Event] - - -_Message = typing.MutableMapping[str, typing.Any] -_Receive = typing.Callable[[], typing.Awaitable[_Message]] -_Send = typing.Callable[ - [typing.MutableMapping[str, typing.Any]], typing.Awaitable[None] -] -_ASGIApp = typing.Callable[ - [typing.MutableMapping[str, typing.Any], _Receive, _Send], typing.Awaitable[None] -] - -__all__ = ["ASGITransport"] - - -def is_running_trio() -> 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.12/site-packages/httpx/_transports/base.py b/venv/lib/python3.12/site-packages/httpx/_transports/base.py deleted file mode 100644 index 66fd99d..0000000 --- a/venv/lib/python3.12/site-packages/httpx/_transports/base.py +++ /dev/null @@ -1,86 +0,0 @@ -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.12/site-packages/httpx/_transports/default.py b/venv/lib/python3.12/site-packages/httpx/_transports/default.py deleted file mode 100644 index d5aa05f..0000000 --- a/venv/lib/python3.12/site-packages/httpx/_transports/default.py +++ /dev/null @@ -1,406 +0,0 @@ -""" -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.12/site-packages/httpx/_transports/mock.py b/venv/lib/python3.12/site-packages/httpx/_transports/mock.py deleted file mode 100644 index 8c418f5..0000000 --- a/venv/lib/python3.12/site-packages/httpx/_transports/mock.py +++ /dev/null @@ -1,43 +0,0 @@ -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.12/site-packages/httpx/_transports/wsgi.py b/venv/lib/python3.12/site-packages/httpx/_transports/wsgi.py deleted file mode 100644 index 8592ffe..0000000 --- a/venv/lib/python3.12/site-packages/httpx/_transports/wsgi.py +++ /dev/null @@ -1,149 +0,0 @@ -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.12/site-packages/httpx/_types.py b/venv/lib/python3.12/site-packages/httpx/_types.py deleted file mode 100644 index 704dfdf..0000000 --- a/venv/lib/python3.12/site-packages/httpx/_types.py +++ /dev/null @@ -1,114 +0,0 @@ -""" -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.12/site-packages/httpx/_urlparse.py b/venv/lib/python3.12/site-packages/httpx/_urlparse.py deleted file mode 100644 index bf190fd..0000000 --- a/venv/lib/python3.12/site-packages/httpx/_urlparse.py +++ /dev/null @@ -1,527 +0,0 @@ -""" -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>{scheme}):)?" - r"(?://(?P<authority>{authority}))?" - r"(?P<path>{path})" - r"(?:\?(?P<query>{query}))?" - r"(?:#(?P<fragment>{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>{userinfo})@)?" r"(?P<host>{host})" r":?(?P<port>{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.12/site-packages/httpx/_urls.py b/venv/lib/python3.12/site-packages/httpx/_urls.py deleted file mode 100644 index 147a8fa..0000000 --- a/venv/lib/python3.12/site-packages/httpx/_urls.py +++ /dev/null @@ -1,641 +0,0 @@ -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 `<host>` or `<host>:<port>` 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.12/site-packages/httpx/_utils.py b/venv/lib/python3.12/site-packages/httpx/_utils.py deleted file mode 100644 index 7fe827d..0000000 --- a/venv/lib/python3.12/site-packages/httpx/_utils.py +++ /dev/null @@ -1,242 +0,0 @@ -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.12/site-packages/httpx/py.typed b/venv/lib/python3.12/site-packages/httpx/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/idna-3.10.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/idna-3.10.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.12/site-packages/idna-3.10.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/idna-3.10.dist-info/LICENSE.md b/venv/lib/python3.12/site-packages/idna-3.10.dist-info/LICENSE.md deleted file mode 100644 index 19b6b45..0000000 --- a/venv/lib/python3.12/site-packages/idna-3.10.dist-info/LICENSE.md +++ /dev/null @@ -1,31 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2013-2024, 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.12/site-packages/idna-3.10.dist-info/METADATA b/venv/lib/python3.12/site-packages/idna-3.10.dist-info/METADATA deleted file mode 100644 index c42623e..0000000 --- a/venv/lib/python3.12/site-packages/idna-3.10.dist-info/METADATA +++ /dev/null @@ -1,250 +0,0 @@ -Metadata-Version: 2.1 -Name: idna -Version: 3.10 -Summary: Internationalized Domain Names in Applications (IDNA) -Author-email: Kim Davies <kim+pypi@gumleaf.org> -Requires-Python: >=3.6 -Description-Content-Type: text/x-rst -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Intended Audience :: System Administrators -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: 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 :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Internet :: Name Service (DNS) -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: Utilities -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 the Internationalized Domain Names in -Applications (IDNA) protocol as specified in `RFC 5891 -<https://tools.ietf.org/html/rfc5891>`_. This is the latest version of -the protocol and is sometimes referred to as “IDNA 2008”. - -This library also provides support for Unicode Technical -Standard 46, `Unicode IDNA Compatibility Processing -<https://unicode.org/reports/tr46/>`_. - -This acts as a suitable replacement for the “encodings.idna” -module that comes with the Python standard library, but which -only supports the older superseded IDNA specification (`RFC 3490 -<https://tools.ietf.org/html/rfc3490>`_). - -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: - -.. 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 A-labels or U-labels -respectively. - -.. code-block:: pycon - - >>> import idna - >>> idna.encode('ドメイン.テスト') - b'xn--eckwd4c7c.xn--zckzah' - >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah')) - ドメイン.テスト - -You may use the codec encoding and decoding methods using the -``idna.codec`` module: - -.. code-block:: pycon - - >>> import idna.codec - >>> print('домен.испытание'.encode('idna2008')) - b'xn--d1acufc.xn--80akhbyknj4f' - >>> print(b'xn--d1acufc.xn--80akhbyknj4f'.decode('idna2008')) - домен.испытание - -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) -+++++++++++++++++++++++++++++++ - -As described in `RFC 5895 <https://tools.ietf.org/html/rfc5895>`_, the -IDNA specification does not normalize input from different potential -ways a user may input a domain name. This functionality, known as -a “mapping”, is considered by the specification to be a local -user-interface issue distinct from IDNA conversion functionality. - -This library provides one such mapping that was developed by the -Unicode Consortium. Known as `Unicode IDNA Compatibility Processing -<https://unicode.org/reports/tr46/>`_, it provides for both a regular -mapping for typical applications, as well as a transitional mapping to -help migrate from older IDNA 2003 applications. Strings are -preprocessed according to Section 4.4 “Preprocessing for IDNA2008” -prior to the IDNA operations. - -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 - -Transitional processing provides conversions to help transition from -the older 2003 standard to the current standard. For example, in the -original IDNA specification, the *LATIN SMALL LETTER SHARP S* (ß) was -converted into two *LATIN SMALL LETTER S* (ss), whereas in the current -IDNA specification this conversion is not performed. - -.. code-block:: pycon - - >>> idna.encode('Königsgäßchen', uts46=True, transitional=True) - 'xn--knigsgsschen-lcb0w' - -Implementers should use transitional processing with caution, only in -rare cases where conversion from legacy labels to current labels must be -performed (i.e. IDNA implementations that pre-date 2008). For typical -applications that just need to convert labels, transitional processing -is unlikely to be beneficial and could produce unexpected incompatible -results. - -``encodings.idna`` Compatibility -++++++++++++++++++++++++++++++++ - -Function calls from the Python built-in ``encodings.idna`` module are -mapped to their IDNA 2008 equivalents using the ``idna.compat`` module. -Simply substitute the ``import`` clause in your code to refer to the new -module name. - -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 positional context (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. These tables are -computed 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 - <https://www.iana.org/>`_. - -* ``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 <https://pypi.org/project/idna/>`_. - -* **Version support**. This library supports Python 3.6 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. - Removing support for older versions should be well justified in that the - maintenance burden has become too high. - -* **Python 2**. Python 2 is supported by version 2.x of this library. - Use "idna<3" in your requirements file if you need this library for - a Python 2 application. Be advised that these versions are no longer - actively developed. - -* **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 - <https://unicode.org/reports/tr46/>`_. - -* **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 <https://github.com/kjd/idna/issues/18>`_ for more discussion. - diff --git a/venv/lib/python3.12/site-packages/idna-3.10.dist-info/RECORD b/venv/lib/python3.12/site-packages/idna-3.10.dist-info/RECORD deleted file mode 100644 index 9cfce7f..0000000 --- a/venv/lib/python3.12/site-packages/idna-3.10.dist-info/RECORD +++ /dev/null @@ -1,22 +0,0 @@ -idna-3.10.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -idna-3.10.dist-info/LICENSE.md,sha256=pZ8LDvNjWHQQmkRhykT_enDVBpboFHZ7-vch1Mmw2w8,1541 -idna-3.10.dist-info/METADATA,sha256=URR5ZyDfQ1PCEGhkYoojqfi2Ra0tau2--lhwG4XSfjI,10158 -idna-3.10.dist-info/RECORD,, -idna-3.10.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 -idna/__init__.py,sha256=MPqNDLZbXqGaNdXxAFhiqFPKEQXju2jNQhCey6-5eJM,868 -idna/__pycache__/__init__.cpython-312.pyc,, -idna/__pycache__/codec.cpython-312.pyc,, -idna/__pycache__/compat.cpython-312.pyc,, -idna/__pycache__/core.cpython-312.pyc,, -idna/__pycache__/idnadata.cpython-312.pyc,, -idna/__pycache__/intranges.cpython-312.pyc,, -idna/__pycache__/package_data.cpython-312.pyc,, -idna/__pycache__/uts46data.cpython-312.pyc,, -idna/codec.py,sha256=PEew3ItwzjW4hymbasnty2N2OXvNcgHB-JjrBuxHPYY,3422 -idna/compat.py,sha256=RzLy6QQCdl9784aFhb2EX9EKGCJjg0P3PilGdeXXcx8,316 -idna/core.py,sha256=YJYyAMnwiQEPjVC4-Fqu_p4CJ6yKKuDGmppBNQNQpFs,13239 -idna/idnadata.py,sha256=W30GcIGvtOWYwAjZj4ZjuouUutC6ffgNuyjJy7fZ-lo,78306 -idna/intranges.py,sha256=amUtkdhYcQG8Zr-CoMM_kVRacxkivC1WgxN1b63KKdU,1898 -idna/package_data.py,sha256=q59S3OXsc5VI8j6vSD0sGBMyk6zZ4vWFREE88yCJYKs,21 -idna/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -idna/uts46data.py,sha256=rt90K9J40gUSwppDPCrhjgi5AA6pWM65dEGRSf6rIhM,239289 diff --git a/venv/lib/python3.12/site-packages/idna-3.10.dist-info/WHEEL b/venv/lib/python3.12/site-packages/idna-3.10.dist-info/WHEEL deleted file mode 100644 index 3b5e64b..0000000 --- a/venv/lib/python3.12/site-packages/idna-3.10.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: flit 3.9.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/venv/lib/python3.12/site-packages/idna/__init__.py b/venv/lib/python3.12/site-packages/idna/__init__.py deleted file mode 100644 index cfdc030..0000000 --- a/venv/lib/python3.12/site-packages/idna/__init__.py +++ /dev/null @@ -1,45 +0,0 @@ -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.12/site-packages/idna/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/idna/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index ed76dd76ada2110ea3c70604fee42300a2c08916..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 895 zcmbu7yN(kv6o&0dGPz9d$z~}K9TF+BqXk5TkYJZ$n|%N`mNPaP6JH{a6NqTwDd;HZ zcoyEk5)~C4Vue=P3VUXuSR@);d~?n}<MW?0_UB%&1N?gX;Z06!0DKL}?-gAK7uE;w z0R<EaAR&S>LXoVYnyjO`Y@mjWQ7oINDO;!|+o&x&s3Q}U$S&&29_q<H>dOHd$RQfa z5gN%c8pBX85)(N^(=x7!135!82v&gBKSFf4Z_MLw&|A;Pu6K5N{`48A{JAmOxOPaZ zaCoM6L~wedDcfkStUJ7^oM>g)YwKbn$dU=y$#Ryh@zR%bgDTGVo17`E*KSq`Tye{Z zz?qgyu9$I2rB@Z&Ria*GE~YH=)-GnMdTy&vlC3QsKEj4cvT^;gMPICJ<mHWAyK(it z+=&HKE1SDXr4`n2wYnDP(2e|vhNu-Q%5sD&FD4l8m?^kc7|*9>=6{;;rwL3wpb-!U zGy_@z?SOFfCJE>U^aA<;2LXeCVZbP0954x(dYsR1xq7Az`!An=TDbO~QOky0cSEu@ zSusqBCFPK=i7^oZ<4@qiHwCU}nrq2YNo=u8Pj$AHOxYr}Ot6(9a#2{Gt(jR+{YnW< zC^PAfsa-1gGTrQLuGNF1<NImBEn8f>6)C5Rq!@=Qf$`C1f7N;{HQfsK#N6?w;ffXu ikMA`I;bk;|(IxmBKkorJ{{rs*s2?QJyQaDAcl-kW#r3TK diff --git a/venv/lib/python3.12/site-packages/idna/__pycache__/codec.cpython-312.pyc b/venv/lib/python3.12/site-packages/idna/__pycache__/codec.cpython-312.pyc deleted file mode 100644 index a4b116fc7ef0381b0e9e883add7306d4c1ca4672..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4995 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 Q=boQ=3Z5@u`f&^X7hKUCQ~&?~ diff --git a/venv/lib/python3.12/site-packages/idna/__pycache__/compat.cpython-312.pyc b/venv/lib/python3.12/site-packages/idna/__pycache__/compat.cpython-312.pyc deleted file mode 100644 index 3ecdda11c77a1d66cf605d0c3b39b2eafc620ca5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 899 zcmb7CziSjh6rR~%_bV}KP!c4vjm2V;jR^sZC<J41U=}1vbA_<C^Kx0TyR*#9MOH0> z*x95@DzObV{vS3cc8g$PA?XgzDwS_GxnQXS^WOXBo0<3CH}hq3vPp0pet5mNMhW?; z!FX7g!RQ4B$Al3^6Oz&nO^uF02{V|Pn5osVQoCa#w!mRF)OIcAyt6uW#0J!$v1`oY zd1M@9YREKM9VoL|191~^t7v$wGo8#cN^?CcN_!`Zd3J^c=_Q9j#2J(hWR<s*unS4) z2vB{IMS9nGm>B3enn80+)D`!Je7cOc$SDmxDr&gnl!`h!sVVoo>+kUt{4`YZz~A6e zKZQ(5UqJ#r5vB`L#nC>91;$@y2@e?v{{XTBKZ(13UZ_2utt>uR_GPSKArGVdum{qQ zSr+;cPxDYM=0#cC=IdKe+HG+SQ#v?D6KD>}_tuT0d+#3&teFvF^8ZbV79PX4^qoTA zdC`=Z#IS5^b5vA|CvGCvPcEjkxvp6%gMZ7%=vc(J)H8xt^X-jb-CbT<dgw9^(#^PX z`zlUi32qjqkPFD&TyVuBo_MsJ4!CNkc>-EkU{8hM0!yC8BL1$nK0YgMBcp|q+Mr0y zxxw9M-<q2PYqKidn<yPs<Z;#$`qhR0v85Gp0T(*xH!e-7L}_;m1+r4TZ0I-?A}lI3 zsw}4$T2ykK*Vj_c`UyN1b9jON9P&Aup-CzILFRrDcj!<$d$ckn=uTEg+70V^Y3F41 eqc^y7|Ld*!iu^o%MF#Z9)N27fv3^&+>fsMU6w84C diff --git a/venv/lib/python3.12/site-packages/idna/__pycache__/core.cpython-312.pyc b/venv/lib/python3.12/site-packages/idna/__pycache__/core.cpython-312.pyc deleted file mode 100644 index b5b2858434e39649a8277bfefa5b9b886c2222ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16185 zcmd6OS#TUza$r^8_lf%;8UO*XNrE5=lG0EI3F6=lN(87Op^?BwR{?0C(G6A?NCIkD z5Uucn8iv)B>|krfuzNgQFKCTzdS}Ac#M%+E<#0^w%tti}3N&l5v2+am!7n!jY=oAM z^={^?qZ=S}&CWz@A^P1fU%q@V^X1Ez__@<*qu`tSqc=wXrk$dGg&Fm8Dv8xO9Yx)u z7>c2z)PNk*12oC&26PbXqWTHLfMLQoV5BKV&lsYn3G;xNq>WL_gmu6QY14p>F%Q^v z6ibg)sDl(@#_|y@=LVcQ>L|rn-=-KF>-tEql)6c&9ZDUnTPyXDQYVzUib}nt)D5Mc zqEa8@W&Mng^$!~u|J#Ov63CY_CGhjHWy2<>6w1n(GLo-=Hsz47ggo{sg?t6%tC&jG z$W}mJR|$xbo(850YN|KXRI_CY+#0B@VfH|MDO0PJZh6}{P)o{ibOTcdt+o{91CXzi z^9&93^^gycd;`G<F>ZvidId6;ZdIULm?nVU0IiK|DPY?;te3GRkeZ>_R%IldXA9(; zo^DI#ybbD_nY~O9aNiElcaRZEhb_!b7@@^V$$v~c&}scxt<Z88{0hA)h8;{B^xCHM z+4q%wkmfdKH?$8<)4~0Za2xanb&}=GBp->#LQ%<hE(VE5xNU;8WQj1b5EJ4<koHDm zJQs?Mu!+HNJjRD2u}4;Dl`ueXHP+fX<$%PiyM8ry?O*@)_y6_pe(+it^4h2DLu%Cn zMYkxH!rcx#ogUCn>w<d8dc3Q*qnqR6+|2$Xp#&RXuZCHIRA4yH1wzqi09&-Ov2dJ; z#6|)f8x8R+6PV=ULs51j(R<e*Sq2AVp$T?yP_hjUPQ;n1D5f2QgO{d4QKiN_ILO4q zgM)XeRYdN|#kSG-1lu+d;uDwKy5ixf2{y(j+ITj~j&Pxg)&w63kF#7W6TcFR#zPFt zwOwXom)oL|p|;6sel#9y-?e9NTOz`<t&^efcnAp8hGc6C$2oS_<TQukfCMf`BrFiT zP2D#fdSI|{UbX65(aMRGI1*tZGQFPb)<|__l#K<3poU|^@`3`LE=@s}%qkG#*g!1K z2NEGZk{FJ#OfP3g6mU^wWPF$^Q3Fh97<X$JWAV4b*mFE~ITVdBopFYpjKfBnd42=Z zp#T#}z$(YDz?#B>Pr+u4#=~TZVa4TMfk+}SmH0BO%Mfb}s*17h(Xhs<Z-sUFMyxww z-?LZwna&N!^P_BF9g;|6GT}fZ7LaR6&p?F#>N%hg=P(GsPow;4Z4Ou^>B5teiDUUG zE*4h#3d$)X{Pgf!{UZo&QM^_+2B*!&kH^;JOH%47p~kaxl4j`fZGcO#2#QJVQHZ|^ zO2W>gfFK{EQ(<2N*nLz`-^(FVGl6rl@ffgHAUqo4LSdfekYrP_2-1^C9;0M0%1YL7 zd}1gP0}&wU!=s#JK)#l2uY{sgEa8WsjzhUD(U%iALLk85o|ZfywUmy7;b<t4;2NN~ z8Gebw5X@047XPxPHfyQ99nLg-I3ik_=Q?s`%Y4VR%Pa1xWp`cHU3W*HIr2mEl6%{V zuSTdnB>D~uj>9>-W9}H?9?6slbCF3tTug6mReE8V;#J{st;knc0Uo6(`NlS(c9O=K zeWXAKD$>0{180UZNgwAJ4!cNZ8Ha>I2d)tc*HOYY7)cDujkp%5+=UIcKmatb*WB*Q z_&)sZozdmy1KH*S_bz9fUli?!1j8YDhIC@xmcuEKEw>dCx2PmFrfoVXP(FrM7avg8 z^-7k>sn|5GFPthSBGB2pGzYtlN?>ng!K{O7Gp-d%_hL25%Q*@N{_eBapG}<*?RA2o zjv)3`STXcwSQUs)u$r-)+wsQ1-TThZB35wbz=^=^#6gR2G7e4wYjeAy_yAV<6?{sU z?KN3@P5R{`j3i?;G{i<XM-2B~@m?q(1ANy7d`C~~ru9KX@1sM|vZwzpE$O3d49K(x z$1Ot1N94>P8EX)ljPRq}GtlNBwv+K&G27<%|L#oc$h9|f?vk9{Eia`5j`K(q7zqx< z^;=e3)$IUeb2O7Q2ZwizW^@X=`e{SZ*!$?;p~s{D4M9&ow+|xNg@`ftEClOzp<l*3 z!E=a#g81{$>M*uMIS1QOM*M?QH~SXCi{`z>*jvM+Y<PSy%5&?u4Ubo{AwLE#0S%j; z)fFUI67*`7d%CFCPEgeMpw+B?)==QZF#|x@@FflE2A(x0jf|d1#;rUu9{Cu<m?r7e zGK%8yXeD1^b(4B^d=(<dLnC9n3~PGhIAfaC-8f~SlDdRGNhj!O)7RidF=iqW6s9BC zSuRtY9w3=wI{>nk;Hn2Ym|~4Z7~8%n#wwm_d<{;9Su;b;TE3L7sb7n(ChjQUYrjl$ zRYiC@Hp3IBsLWW62^F2n%*`<~Kyr-(8{j6L#hjZ^xHoA5${J@aH~Ny6q!C*H-7gf4 z=UE5Qy8#>Dx4_1)VsqoViVckQF5+|JJy>HioR5VaR8kms+7vA9?cwm;kf@nG>H%4# z)J6DdJS7Rw2i}+sg!sT@95hhS+#w6vG<{amb)14<Z$CL^feQ}<IIaU>(x+x#=!tL% zzF21|f;KS)RYNQ&WSSO<1D@I$IE$KD$El#L0F66>Aa&in@avOwo$%}Kmvm<!f23E^ z_x7EhIjX2p1%O1QFDOjw(Z`vE0$gNdlyBwZtx<NEmuCt`oi+&$WF$q#=75V)${-%3 zbY^d7C`Pp0iOAJJ4D@*}6b<mxlWgM4L0h;^wLjO5sU8fDVsH$D;~3ybzus(c5;z$$ zD`hsi!jLn&PvKD!U}H=oa3#Wz1|m_oegN79BCTJIph>c_^4vgWssY3#=Q_P#*5TW* z!oabUT+k}Z;TN#PhE3%oL()f>tFppm)rOGt93Pb&vV;btP}#D>XhSSFNC=72E}(w0 zer1#8F+rjqs*!++zXUd&qaJw6=1#2mYtrX39iqSabIN4ga@{<ypFg`&Qny^vnk{Kv z7!phN%v*EzlC<ufLl1p*LZELsFpv!lEWJ7?Tx7*phlSB`F%T7f6M|y`+6fiGMSCz; zS$q9N-U$F7yC_H52a%lHzh<JmHOro0))QQ4x<}vLCVJZEj_1st)XA*5F6Z)H*XOLh zRCv)^nREHC>mRzRg_>8FYlgBlLrdWiVRS+a$Hbbr=$aHPlMnnAbEk6kO>-xUXV7eH z+I$B8Y<E3ySL7*sz3VY$_qf(7sPe7C)`{h<e0D1@OkEYXPK#wTf@cPr2{r9mcYCg` z@unl^txB_t-o{+r)|3OP(x(>P+wPY)<QjI|Jo%u!ArleH+g7&h5O!V^w}ga>P~Jp& zDuuvHS@%mTWsP4pLi%LZ-BK7pBm>-Z<WJKugU2t?l%rw=r{62O&Ipz>4;0;Cozj8_ zA~{lDfkd%3u-UZ&j#ybqRRpx011$kB6ZXP&fzd?xHJWG+L{3TcX_Xg-*pWy~;RfL6 z0z)WDeBr{-AJoenV8QF+NSsry+(bh|G!%uhOx~ezci<zTsB#@(Iqp0(xdFcfs+p*C z_?FGpS#x!|J5&F`G11(V31!XO7CINrZ7Z&Fq2h$-Iw@FAs(REqS|ObXtu8_W^<f4y zq$)7rDf3sT0!A)PrGTT0VvNL;WWrVn3*^bM&X7D%t<Xy|=mFKNL0j)5&|j!WxI#0! z*4CMQvK$!=C5o@pqtlaM7a-EFonr!_7!%kBGDbZz2<4y9t&jc>d^15A1UUqVseli0 zJj#8L1F~!i1!REzL0YzLY$UW>CbZmYFh0(`4*0zXzeEQFpud|P^Doa|nwv@WFPbX} zO_lveYTmk<YQOeox+$akAec!kR&6IOIz?BPVCmYF>e>!H1@OOahcZBKRS8Q{L`f*# zmqi!VX}qSw8P?M|(^NziI2z%I>ctyEG%^F06gYKzAQ$LVH=;GBRI-~BNYPzm!(na+ zF#eB78d!OC^VMX{C@Z@~^Y#UH(cDhve@Jv47A%MJddjj-*5CE8fa`Q$)F#O0`!m=T z#biiQ%FR*PNVB>m=ta2MQZ(m-yS}W%Hx#tZ!j{9njDE&OQN^03s;w06t7L-%D>KGf zeL=5L`!XiRq}rFesMjul)@|S|fG_#R0Q$ynOtqC4Rjk9xuo*t60T)^^W))8vyBja8 ztJRpPsE1YUF{}gq&A=FD^)wa39}PO29&~ch)}NXo;K;jGL<`!!y3Jt5ul|2AW1Bj= zFP*Vbo^ev&N6|3fJ_={u2R9PNPH4F8H@jP=jnl@Uqc`FR!0~{xjHtc+J=|-Mmgs(> zBS~}@(flG#Xce?@P1vph8<Y=Tj)0Liw9&RB8HuG@Hi$UKz~YFPOrp9-`Vp4r_CxQW zNmhx%2+0zj90Yx5ij{Qnafyydj&;4zvLfp{vbN)rbt5!{gF$eNi$nb%!!Hp97K1ay z?Mv-X`)?ln{+n~h9+=&!1ERSyXLqH%?>w_Y%t+k}ji8#e{GeA1w2SV2OV6HJbf3wU zS3hw2=5;IHvQ#4d^35w5UFL}BZTXzCSj*-+R;nA9tM_E9_bgZM&sOjMN%-TYPw1a+ z`|*TW-8FwI=dQk;$h3cWbrDW{PesmKd#5oI{^7PCb>7o|bWEt<pY`s~l~$&7_dTWm z>?zHA0p{Zp%HzxVE7p$+R<7<J+C=Y;-|V<K7!;Hi-@Fxsn71tF_Cm@JSmb@Al+Xzd zgl|MAFa;p6QdtyQwbz0$3PAPKOmDycbplbJgex-H;9ZO^Nr!b;b>q;7^A<#6fvsh6 zNa}aSbTkFmbnS%RTwF2+0=x97c7SQI7*pDTkeN0CMrP7$Z<78RECQR?6U&URpmQm> zDPzLpATk_$eJ}$UjhG4&Mo8JnxD^_!KMg}U4jB6e7!J~NUy=fm2X@6-L(;%FNf~{^ zT7-##aj88MmFvpgTDfywxkoFfZ|nk^8x4Rp<4x+xT7k)*Gcvw$j2m%HVgZ5!<Y(bw zvWV`Q-lg?3GbPv$F6R}vmNa#v24EW*|2o*DjSL&8h4YhPd%p%Y!D%CGa>al2H$eM> z(0dexY=2K=3U;t$Jj$``cw`lJaAXYv$#jez;@B&Zf7?w_*n;}i@BUZGatx&3NGKMP zEGOZSZX8qkW1(2&BFL*q1Os3aD)PS|0NsShO_Y4Z>>D%|#2+__rQ;ajc1$4S5OKGe zv;zejs(+5{-u)73N4VHApIEXt{y|^5^!<TM{ms`QLs%B(<ME?-Oket-{N{_IyCE~Y z=-&Ag|Gje`w}0aO=`(-zy11w7XQstHy&w>Q(H~g7saF=Q)gT!Dz@IwzepNbjbIYQ= z?oQ`|@rNhwdH<w$#b29dGo1_dKREh9Y+*$79}pY|ih8E6E*w~_+oMXBb*)E5|1*N) znWEM?U-{>h!CEta1Y}g|{5!t`;&jDbnQlmrExCg~8u(cE@rk9@qrW&PymDR`82s$y z#rx&ec`NkD+dw2eu)0#)maL6w_A_fEfu*z7BCL|z`t*?x;rSq#IUu@&_seS@>nYFn zydLV2GB8oKCv?v{D2F$1r~DP4Q{NbX-Sf0H9L<opV^%W|u2&0rMFN2Of;u$$hBXr@ z=LLJdW};H-;qIc@^Jl5T6Hk$RRBwBl0krtG$7_mRp$EOG`UItD@F(B8wrJMgP}&8m z>}#cp;Sr6#kXG7g8a=3O<yxtpM;kNw#(<MIevGVMD)iy#8@s<nUvisM<rR0xO7XQS ze3ZdzO=1sUr<OCOv3fOKi1|h}T`+lqR5s5*F^}v_z5;Dj6<byFuF*Gcd<(p-<SbI> z{30JLj8MQDXz|xYc-wwEc=J2du^IbsX9NSq<AtAm1q#9mKs8c)vs$y2;`YKmEbL^< zZwH$z)K&cj>Ix0Y@QiVaA8vh?oD4Je?ukh>zM_3lGQIRl$Eo98lBM%ZZ-4js{u49X zPk?R<Z>C@b#>=|;fc~^a^^IAgS<gJLnv)Bb#Sk+V3WL)_fR6`I>6O8420|P7%#+qm z?NR<4j6Jiy`3BhW;SKl)%OzVR0p=e*6brMGacG)n6Ot995XXh4B@@FU{zQ$Juh>Jd zV8qTq%sJdi%#!mC<(GU9@M=?*AAs2eQQOILJBOB1@~+37##8_UJm!c)0fz=nFh7%* ztT2`$qmc8GxWC|0DW8;f<y8uoi+dXy{ZIHM?#aib*_&#*-E^l?sNAt+-U;gPEyqnq z`n#g1Y2K*5(Y<`_O}Or-ouaE*urxn3IOo|VL&=K4pXy#RRIM1Q()*VT^$*dQD*78& zsS2Y@F+}>yQr!E`%v<0MH+}xj)#a9sY)i){+p;Yum+Yr<j*=DUmh{yhRV)WPv%$_! zPGo~;mYgr;bvCDOrMxM_F7z#x?^&tZldI@jt~i;kIQffi;q1WA&j_zw6v9mQHD+me zOc<XOhcAg0+^SwzU6!YGrDdSXSL|IYp<H!O17GpiXPOrLpZQx?%35<Joy#RBvLz>e zv0r%k!p{#0-y0N$!rAYIm)M9f78lt`vE&lKE%yOjuW!vl`5SYdL(86?tf%K6r+#++ z(>I0luL`dZX3q~Ug;-&DTnt4;&jfVwyP%8Hm2U-NtnH(W?)j<D45eSJ)l(%~KBtT@ z!Lqts$=T(S3)zwjD;2fr(GT4V{)J0-%YU-<-qeqG0Ep7ERlNa+Hh6t`J#=}JaKOs_ z!*eh6_;ml|d+w;yxX#XprzJU4*C25V9Japh<$JbRhu6+ekSwTbkq;!Sa*J5^Fr=Mc zvf~8ECe3UDvIz_m7pRy)l^z8-RV>kXoC^6iGg9DL0@!^^JkT;`3?;&m$c#(2jq&k# zAR3R2zy%#;w`7`%5-xx@Hrf42@_}y|@?bamaLLXZghwRTV2HFGoaETy$W`**e^-7u zmh5s35drHSkWF$Q?gqfG0m>zkkeH+LI<wK4E33X0y&26sBbM!$x35@S^KUF!s#o0g znH@{+T`NAYc<&T_t%9R9=dKbgRbQ;wYd@!Gqw~JSk=H}~1RfELo|JLPP`2U=-1*MJ zIkB-l>uaAo`OsdQ9$&J{M#*iWD=1ik5A0=vp)7$Gplj_1sK2&$==6V2(-5xPG)Q8y zX>@SJej7zB;U^pHt5q>Nrc1&?Ch5&AXCJ}P_>p?eQYDvR$a~bZx(T@sxOQra*3<P2 zxLF}I*sPkWwcg8TOjEX0*u|<NBYRKE7vq*97)BL?Yjn|e)|dmVQuJ3t?n8Fmyp2hP z4T`IFq!+VF5-!6VSj<y={I72t)?I-1D)T`<O{E0ZbU?oXWi(6VHCk;SwDfYn2c((V ze>xOJhZFF8>u4q0eJ7meftM67nE)G&j6}f65ncnq+yn>paC|Dp5EB{qJp|C8bPH%! z`=^Zc+;(i}R-a;(4nZgPCX{n?7`%l6vMx7|0iIsq!vYR@oMeNOnBx=pG|64Z%KaFi z)t0-4%^WIcqXQ@R4ipu$D)%3-AqH*8ry#R{Pgm@vDfTvd=Ymk%wq)O(*BRhBuBz^j zcYd%lb49FbyM7WbQ{^@D_6NS&WnW{~*C_hn5iW<XGqqWB?d{l-xiwc-f2Z+IOl;UM zG(01eJv(o|@2(>3-6#6`1xJ6*Ubbwn%>vJki1y|Tm$h#PPZIkc(&n(}>ku3r4=w)G z$t6nwM8UGVJ_|ykMRac$EZg%2y>Um*Q@!kI$a)$w2Sv}Wd1FB^<m{fgQ(vsLQl199 zp;fLp%G1Ur#}=@sy>lvWgpz+-Yla6l6f8T44L>Nl2wadbJDw!)PLTF?I;nqX^L7TQ zPn~6*&H7K9Xbgj;oiFM^&52KdpDmJ~X&>akoi!n$*G^1+>kmcOS-WsU6Y)Y3@q#Z; zQECF*ThM8|*u|x=iNT8ThsvGFIBP080}6~{24>PH&0v`VsGKfojup9QjA>^PjIDg6 zwXtxEWN7vAVAhhf$nSx(R&Y?U6|taZidSr2Mrdh4C2Q7}v?`V<52R$v6g*#WR>;XF zX&VS3OVT!HN*a=;8Ms}}8e-d%wzn#w1+hmZTv}VO?Qv!ejs@UgFPqZK4K+^kB4jJv zQdQ9jcd1)&XV8S&rVjURa1{bN;YS3CcJeCs2u<`dt}*RyE4Rn6AaIkKzyRkFn%ws^ zVNzJXr|)~3aPiC>Im@<AgeGPGQ`NhYyaJ*}s_b|b2!+8-nK)E~_J6LwZ{Gp*s1CCU zP`^iZkvjwU!&#^J#J&UQj>(}v+9P-y0PFlf?<3rA+yDd;{R%fs;&$#85+CP&2P-c^ z0AdEV8CB5ACDTwO0WQjtU5>&3YgjhQOSa=NhP_HWIc42@gJzDt4qOO<+PRyU#)n1j zeGG66$rPXBC#S$G3^NAwDwS-gZVVE?W645h!o{zEuO=VjrxKDK+#{lJ0U{pK$V0^N zB?pR9Px=gk6Ln~k`%lo~6pFF$5Ha>IhOG~r?zx_arCZXM#Zqu?C<l$)3eFAvE2S0b zlJ_sn+w!_nt1DL?SeW^^bFuBv532t0mF4d5X1l*DoDT_1OqfgvVP5Q>60S~XyQj0| zGxNuCrL|z>dUd`h7i^tBiO&hoet$MYFS_e<TbeVMJ{V8gA9%{rjqf>gB~|J0d#CU2 zR1@1jt`@#?3TwCCblo)NyfuP%TTX7AX<q33lh&Wwer6KRp8Idk?7%R#+mZD&VZ-ut z`+K!3Wr6pjf~Vn&d<)EEZ7=00U$zIb_CTg|!6e$-1Vh^wYj(<0^*N=tx>kG*#Y*~s zcoZyRuL&1J*?|!8rHF~)xagTI($e+NP1dge^oXHTr~6d*T;~f$Tn;V*I|44hu+_qv zItt|0^rn9Yl7E@rq_SPY3Fa2umgK_+c(rC0Ua>f5vB3&Nl|f~pSrn4S5o*>1BEkpi zJZ^;zU*XYy)*LG>sMVXbEiftgpP50-m>J`U{KQb~_oWG1Q18vkv%irT%#E0TfnqH1 zrfCL2y#oZBrAUF-L?+CO0*p<Y36ugBVAgIZyvs7$JLffg*EE8uZ`1ya_F@Q!h<!}c z2MdHrYBK<xsz^j7jVj&OU1uDs28M1AL`33MihPRBq-nXu+N37doQlqLG%*^Vio(Bt zfG2k#q&keNQVnDo%DCaF82LAd02hKR2W8+%5(?m5LTS0H=Lx-w$h0R8+0r5(xkS0@ zf1+4l<ckc->s8o+)UFwK7de>0Vxru6>_m@}^stGwYfcxjQOJ^vs7fe0Bx7PS8sWhm zU2$qh=i3Cx7IKe~Orgn1(A^{h8e+KTp#wN>ZG(vWQw;ty1_golEM)ON0TNSDUNR9Z z6U0c7c-lcr*6d&t!AmwsuTmnt*3fAx6}s(Tve)Kydg}<i0;c(n)Rp($^Bs>(l*Nfk z4V^xiNs5kr^E9Y7;0%TG?!MWX^ZIU;-z-o2-><oDdg!fR_O@ibEeo{h-9B%+ZwH%w zMwjN_dmZf=F45H@SXy#s=lsxHGpVzS=JK4wm)bjj0!;k#;Qa&^ccXC!*g>Fl|MySN z)A#KTXz}jp>!;K8pE+tC`l{2XMc;P8u|02xmX95jr6gx@z3aU0Oof*$RXK~}UF&sg zs#&yD&ULKVx1=v+b}rdvmmNj%BA)tRtnDWn8;!HYn;<Lth6Tqk-20&9Ndo!)Jx6B? z^=V6K=kxlowm+d<lSKbSBoRm&+z;eSQUznWw(}j|ToQqaT#;Ht5*a`e89}ir<8kYd zZ?k({fxp4O7tQsWab4|I>}mwE%><Ij^tF=6BugTA41^SsL7-YGGRRycgES>YkwM1) z2N`4l8MJACM!OM$3^HsggR~aEhD5O`5~V`B8})S_KaMUw$|b3Xy9>l5LW27<OrdW= zKlc%Y;0a6aPk)ZZe}RF<=-fTb{v`(F`tw(q`Y#ZGePlC+MqcKAjKNPZ*aHFi{~uKw zA*u+uZIR#)k%=EeBd~Zl490!<K2?9aZ^>Q%WgI*uI$GCpu-&_|j%lx(9uzqGOF0<$ zy5XIJzd`05TC(7iKlzW29?@Pc7^=TmYoi=sx}#xU=yA7KbhQhXcC^gwlNt0{O{bmu z)Lz;d&<E+Bpsv3sXy}12sK;PCcN-`p=|HNYx+s~z^8?gb4jGI?ewG*0gmqT!-x|q3 z(r_bKjdxth4F51R8Huv;N~W-!tZoUW$}qs|J~+_A|3x-n7I%SU7>dWE<bhSbRkvcz zZVZSa3`IIIC(Cwf^o%1uV6rKiSe)O&vbQln)0Vt@@aT{w_%%$SwT3+OkzMh`^1S@d zjxTb53l%7m5_jPi0`#KkUsBFrQr2HmzW+fr{0mj~->Gd6s;UL5Jm;;LbLITCslB%j z-aII5IVk#{6DZG`3B+K^u|`3(=D_svqV#kjosN)n-eIJjX@8!ADC1wnDDR=^!*r@W zPhp(V%khF?mE`jlnhvC(14QXkEDMmL`94yV>QjpJv<IGayBFFsC$d}G@_>)$Ue_u{ zc|gmPp30nC=*$dc>vog6PYfjbSqW+K*wIPTo>VwbVVq&)_#VGX^7&IbfRJe<Jr=eq zK#c$taE2(e59i^@dvtUModUctPWP{pIByHmrD^C3QKpkb3xF5o9-pUMXfIYlgjEpT z>mt!7&>3?1etIiimYPcUfnB^(sNI__hY_LZV;~Mh`Ci&Xm!|*%MCqngjPlJ@G`t(6 z_23bBT&QTx`gY|hD7x3aiqYePb@cAEK2JfkP(q?lU`)sf=gzNUoIgfWC6(|Fohz@& zRc?7~-%2~t&$17IRtnCBthq6-hq4C_Pu>VIyhKCFj42D{EzMgoWuyG%dF%<V(kA<= l6H{jka35O(bj?#hp^N~9SOJPD87QV~l*zhghZNb${}<@y9<u-d diff --git a/venv/lib/python3.12/site-packages/idna/__pycache__/idnadata.cpython-312.pyc b/venv/lib/python3.12/site-packages/idna/__pycache__/idnadata.cpython-312.pyc deleted file mode 100644 index 8160c841060813aab4e14ff7c3ebc36f6c9bc0fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99485 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 diff --git a/venv/lib/python3.12/site-packages/idna/__pycache__/intranges.cpython-312.pyc b/venv/lib/python3.12/site-packages/idna/__pycache__/intranges.cpython-312.pyc deleted file mode 100644 index 158ad7fb46722f50857c2f8394f0daade950cdfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2647 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 DZ)K-I diff --git a/venv/lib/python3.12/site-packages/idna/__pycache__/package_data.cpython-312.pyc b/venv/lib/python3.12/site-packages/idna/__pycache__/package_data.cpython-312.pyc deleted file mode 100644 index e4565f395526b26bb2285a176c418941b12f9004..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 226 zcmX@j%ge<81P$}5Gem*(V-N=h7@>^M96-i&h7^V<hDt_FrYaU=JwpROO~zZ?@$qG; zMa7x<dGYZp89sxQ|H{zM$j?pH&rK{TF4K3(PcF?(%_}L^FG<ZwO)pB!)h#Z`OwLX% z(oM-P&&$bAOi3-$FH6lU)6dCF(l4ki$;i(Gnr@_DoLQ2pTacKXotU0lte=^Zm#7cr u#it~eB<dAZ{^GF7%}*)KNwq6t16mAnY%$0$AD9^#8E^23G;$ZQ0J#8plRyRl diff --git a/venv/lib/python3.12/site-packages/idna/__pycache__/uts46data.cpython-312.pyc b/venv/lib/python3.12/site-packages/idna/__pycache__/uts46data.cpython-312.pyc deleted file mode 100644 index 79dfcb71609a9d72c4ae259738a6bb32d54e49e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158855 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 Aj{pDw diff --git a/venv/lib/python3.12/site-packages/idna/codec.py b/venv/lib/python3.12/site-packages/idna/codec.py deleted file mode 100644 index 913abfd..0000000 --- a/venv/lib/python3.12/site-packages/idna/codec.py +++ /dev/null @@ -1,122 +0,0 @@ -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, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamwriter=StreamWriter, - streamreader=StreamReader, - ) - - -codecs.register(search_function) diff --git a/venv/lib/python3.12/site-packages/idna/compat.py b/venv/lib/python3.12/site-packages/idna/compat.py deleted file mode 100644 index 1df9f2a..0000000 --- a/venv/lib/python3.12/site-packages/idna/compat.py +++ /dev/null @@ -1,15 +0,0 @@ -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.12/site-packages/idna/core.py b/venv/lib/python3.12/site-packages/idna/core.py deleted file mode 100644 index 9115f12..0000000 --- a/venv/lib/python3.12/site-packages/idna/core.py +++ /dev/null @@ -1,437 +0,0 @@ -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 = 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.12/site-packages/idna/idnadata.py b/venv/lib/python3.12/site-packages/idna/idnadata.py deleted file mode 100644 index 4be6004..0000000 --- a/venv/lib/python3.12/site-packages/idna/idnadata.py +++ /dev/null @@ -1,4243 +0,0 @@ -# This file is automatically generated by tools/idna-data - -__version__ = "15.1.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, - 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, - 0x10EAB: 84, - 0x10EAC: 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, - 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, - 0x1171E: 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, - 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, - 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, - 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, - 0x898000008E2, - 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, - 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, - 0xA7D10000A7D2, - 0xA7D30000A7D4, - 0xA7D50000A7D6, - 0xA7D70000A7D8, - 0xA7D90000A7DA, - 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, - 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, - 0x10E8000010EAA, - 0x10EAB00010EAD, - 0x10EB000010EB2, - 0x10EFD00010F1D, - 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, - 0x114000001144B, - 0x114500001145A, - 0x1145E00011462, - 0x11480000114C6, - 0x114C7000114C8, - 0x114D0000114DA, - 0x11580000115B6, - 0x115B8000115C1, - 0x115D8000115DE, - 0x1160000011641, - 0x1164400011645, - 0x116500001165A, - 0x11680000116B9, - 0x116C0000116CA, - 0x117000001171B, - 0x1171D0001172C, - 0x117300001173A, - 0x1174000011747, - 0x118000001183B, - 0x118C0000118EA, - 0x118FF00011907, - 0x119090001190A, - 0x1190C00011914, - 0x1191500011917, - 0x1191800011936, - 0x1193700011939, - 0x1193B00011944, - 0x119500001195A, - 0x119A0000119A8, - 0x119AA000119D8, - 0x119DA000119E2, - 0x119E3000119E5, - 0x11A0000011A3F, - 0x11A4700011A48, - 0x11A5000011A9A, - 0x11A9D00011A9E, - 0x11AB000011AF9, - 0x11C0000011C09, - 0x11C0A00011C37, - 0x11C3800011C41, - 0x11C5000011C5A, - 0x11C7200011C90, - 0x11C9200011CA8, - 0x11CA900011CB7, - 0x11D0000011D07, - 0x11D0800011D0A, - 0x11D0B00011D37, - 0x11D3A00011D3B, - 0x11D3C00011D3E, - 0x11D3F00011D48, - 0x11D5000011D5A, - 0x11D6000011D66, - 0x11D6700011D69, - 0x11D6A00011D8F, - 0x11D9000011D92, - 0x11D9300011D99, - 0x11DA000011DAA, - 0x11EE000011EF7, - 0x11F0000011F11, - 0x11F1200011F3B, - 0x11F3E00011F43, - 0x11F5000011F5A, - 0x11FB000011FB1, - 0x120000001239A, - 0x1248000012544, - 0x12F9000012FF1, - 0x1300000013430, - 0x1344000013456, - 0x1440000014647, - 0x1680000016A39, - 0x16A4000016A5F, - 0x16A6000016A6A, - 0x16A7000016ABF, - 0x16AC000016ACA, - 0x16AD000016AEE, - 0x16AF000016AF5, - 0x16B0000016B37, - 0x16B4000016B44, - 0x16B5000016B5A, - 0x16B6300016B78, - 0x16B7D00016B90, - 0x16E6000016E80, - 0x16F0000016F4B, - 0x16F4F00016F88, - 0x16F8F00016FA0, - 0x16FE000016FE2, - 0x16FE300016FE5, - 0x16FF000016FF2, - 0x17000000187F8, - 0x1880000018CD6, - 0x18D0000018D09, - 0x1AFF00001AFF4, - 0x1AFF50001AFFC, - 0x1AFFD0001AFFF, - 0x1B0000001B123, - 0x1B1320001B133, - 0x1B1500001B153, - 0x1B1550001B156, - 0x1B1640001B168, - 0x1B1700001B2FC, - 0x1BC000001BC6B, - 0x1BC700001BC7D, - 0x1BC800001BC89, - 0x1BC900001BC9A, - 0x1BC9D0001BC9F, - 0x1CF000001CF2E, - 0x1CF300001CF47, - 0x1DA000001DA37, - 0x1DA3B0001DA6D, - 0x1DA750001DA76, - 0x1DA840001DA85, - 0x1DA9B0001DAA0, - 0x1DAA10001DAB0, - 0x1DF000001DF1F, - 0x1DF250001DF2B, - 0x1E0000001E007, - 0x1E0080001E019, - 0x1E01B0001E022, - 0x1E0230001E025, - 0x1E0260001E02B, - 0x1E08F0001E090, - 0x1E1000001E12D, - 0x1E1300001E13E, - 0x1E1400001E14A, - 0x1E14E0001E14F, - 0x1E2900001E2AF, - 0x1E2C00001E2FA, - 0x1E4D00001E4FA, - 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.12/site-packages/idna/intranges.py b/venv/lib/python3.12/site-packages/idna/intranges.py deleted file mode 100644 index 7bfaa8d..0000000 --- a/venv/lib/python3.12/site-packages/idna/intranges.py +++ /dev/null @@ -1,57 +0,0 @@ -""" -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.12/site-packages/idna/package_data.py b/venv/lib/python3.12/site-packages/idna/package_data.py deleted file mode 100644 index 514ff7e..0000000 --- a/venv/lib/python3.12/site-packages/idna/package_data.py +++ /dev/null @@ -1 +0,0 @@ -__version__ = "3.10" diff --git a/venv/lib/python3.12/site-packages/idna/py.typed b/venv/lib/python3.12/site-packages/idna/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/idna/uts46data.py b/venv/lib/python3.12/site-packages/idna/uts46data.py deleted file mode 100644 index eb89432..0000000 --- a/venv/lib/python3.12/site-packages/idna/uts46data.py +++ /dev/null @@ -1,8681 +0,0 @@ -# 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__ = "15.1.0" - - -def _seg_0() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x0, "3"), - (0x1, "3"), - (0x2, "3"), - (0x3, "3"), - (0x4, "3"), - (0x5, "3"), - (0x6, "3"), - (0x7, "3"), - (0x8, "3"), - (0x9, "3"), - (0xA, "3"), - (0xB, "3"), - (0xC, "3"), - (0xD, "3"), - (0xE, "3"), - (0xF, "3"), - (0x10, "3"), - (0x11, "3"), - (0x12, "3"), - (0x13, "3"), - (0x14, "3"), - (0x15, "3"), - (0x16, "3"), - (0x17, "3"), - (0x18, "3"), - (0x19, "3"), - (0x1A, "3"), - (0x1B, "3"), - (0x1C, "3"), - (0x1D, "3"), - (0x1E, "3"), - (0x1F, "3"), - (0x20, "3"), - (0x21, "3"), - (0x22, "3"), - (0x23, "3"), - (0x24, "3"), - (0x25, "3"), - (0x26, "3"), - (0x27, "3"), - (0x28, "3"), - (0x29, "3"), - (0x2A, "3"), - (0x2B, "3"), - (0x2C, "3"), - (0x2D, "V"), - (0x2E, "V"), - (0x2F, "3"), - (0x30, "V"), - (0x31, "V"), - (0x32, "V"), - (0x33, "V"), - (0x34, "V"), - (0x35, "V"), - (0x36, "V"), - (0x37, "V"), - (0x38, "V"), - (0x39, "V"), - (0x3A, "3"), - (0x3B, "3"), - (0x3C, "3"), - (0x3D, "3"), - (0x3E, "3"), - (0x3F, "3"), - (0x40, "3"), - (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, "3"), - (0x5C, "3"), - (0x5D, "3"), - (0x5E, "3"), - (0x5F, "3"), - (0x60, "3"), - (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, "3"), - (0x7C, "3"), - (0x7D, "3"), - (0x7E, "3"), - (0x7F, "3"), - (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, "3", " "), - (0xA1, "V"), - (0xA2, "V"), - (0xA3, "V"), - (0xA4, "V"), - (0xA5, "V"), - (0xA6, "V"), - (0xA7, "V"), - (0xA8, "3", " ̈"), - (0xA9, "V"), - (0xAA, "M", "a"), - (0xAB, "V"), - (0xAC, "V"), - (0xAD, "I"), - (0xAE, "V"), - (0xAF, "3", " ̄"), - (0xB0, "V"), - (0xB1, "V"), - (0xB2, "M", "2"), - (0xB3, "M", "3"), - (0xB4, "3", " ́"), - (0xB5, "M", "μ"), - (0xB6, "V"), - (0xB7, "V"), - (0xB8, "3", " ̧"), - (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, "3", " ̆"), - (0x2D9, "3", " ̇"), - (0x2DA, "3", " ̊"), - (0x2DB, "3", " ̨"), - (0x2DC, "3", " ̃"), - (0x2DD, "3", " ̋"), - (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, "3", " ι"), - (0x37B, "V"), - (0x37E, "3", ";"), - (0x37F, "M", "ϳ"), - (0x380, "X"), - (0x384, "3", " ́"), - (0x385, "3", " ̈́"), - (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, "X"), - (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"), - (0x898, "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, "X"), - (0x10C7, "M", "ⴧ"), - (0x10C8, "X"), - (0x10CD, "M", "ⴭ"), - (0x10CE, "X"), - (0x10D0, "V"), - (0x10FC, "M", "ნ"), - (0x10FD, "V"), - (0x115F, "X"), - (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"), - ] - - -def _seg_14() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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, "X"), - (0x17B6, "V"), - (0x17DE, "X"), - (0x17E0, "V"), - (0x17EA, "X"), - (0x17F0, "V"), - (0x17FA, "X"), - (0x1800, "V"), - (0x1806, "X"), - (0x1807, "V"), - (0x180B, "I"), - (0x180E, "X"), - (0x180F, "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"), - (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"), - (0x1B50, "V"), - (0x1B7F, "X"), - (0x1B80, "V"), - (0x1BF4, "X"), - (0x1BFC, "V"), - (0x1C38, "X"), - (0x1C3B, "V"), - (0x1C4A, "X"), - (0x1C4D, "V"), - (0x1C80, "M", "в"), - ] - - -def _seg_15() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1C81, "M", "д"), - (0x1C82, "M", "о"), - (0x1C83, "M", "с"), - (0x1C84, "M", "т"), - (0x1C86, "M", "ъ"), - (0x1C87, "M", "ѣ"), - (0x1C88, "M", "ꙋ"), - (0x1C89, "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"), - (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", "ɔ"), - ] - - -def _seg_16() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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"), - (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"), - ] - - -def _seg_17() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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"), - (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"), - ] - - -def _seg_18() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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", "ỏ"), - (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", "ự"), - ] - - -def _seg_19() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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", "ὕ"), - (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", "ἇι"), - ] - - -def _seg_20() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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, "3", " ̓"), - (0x1FBE, "M", "ι"), - (0x1FBF, "3", " ̓"), - (0x1FC0, "3", " ͂"), - (0x1FC1, "3", " ̈͂"), - (0x1FC2, "M", "ὴι"), - (0x1FC3, "M", "ηι"), - (0x1FC4, "M", "ήι"), - (0x1FC5, "X"), - (0x1FC6, "V"), - (0x1FC7, "M", "ῆι"), - (0x1FC8, "M", "ὲ"), - (0x1FC9, "M", "έ"), - (0x1FCA, "M", "ὴ"), - (0x1FCB, "M", "ή"), - (0x1FCC, "M", "ηι"), - (0x1FCD, "3", " ̓̀"), - (0x1FCE, "3", " ̓́"), - (0x1FCF, "3", " ̓͂"), - (0x1FD0, "V"), - (0x1FD3, "M", "ΐ"), - (0x1FD4, "X"), - (0x1FD6, "V"), - (0x1FD8, "M", "ῐ"), - (0x1FD9, "M", "ῑ"), - (0x1FDA, "M", "ὶ"), - (0x1FDB, "M", "ί"), - (0x1FDC, "X"), - (0x1FDD, "3", " ̔̀"), - (0x1FDE, "3", " ̔́"), - (0x1FDF, "3", " ̔͂"), - (0x1FE0, "V"), - (0x1FE3, "M", "ΰ"), - (0x1FE4, "V"), - (0x1FE8, "M", "ῠ"), - (0x1FE9, "M", "ῡ"), - (0x1FEA, "M", "ὺ"), - (0x1FEB, "M", "ύ"), - (0x1FEC, "M", "ῥ"), - (0x1FED, "3", " ̈̀"), - (0x1FEE, "3", " ̈́"), - (0x1FEF, "3", "`"), - (0x1FF0, "X"), - (0x1FF2, "M", "ὼι"), - (0x1FF3, "M", "ωι"), - (0x1FF4, "M", "ώι"), - (0x1FF5, "X"), - (0x1FF6, "V"), - ] - - -def _seg_21() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1FF7, "M", "ῶι"), - (0x1FF8, "M", "ὸ"), - (0x1FF9, "M", "ό"), - (0x1FFA, "M", "ὼ"), - (0x1FFB, "M", "ώ"), - (0x1FFC, "M", "ωι"), - (0x1FFD, "3", " ́"), - (0x1FFE, "3", " ̔"), - (0x1FFF, "X"), - (0x2000, "3", " "), - (0x200B, "I"), - (0x200C, "D", ""), - (0x200E, "X"), - (0x2010, "V"), - (0x2011, "M", "‐"), - (0x2012, "V"), - (0x2017, "3", " ̳"), - (0x2018, "V"), - (0x2024, "X"), - (0x2027, "V"), - (0x2028, "X"), - (0x202F, "3", " "), - (0x2030, "V"), - (0x2033, "M", "′′"), - (0x2034, "M", "′′′"), - (0x2035, "V"), - (0x2036, "M", "‵‵"), - (0x2037, "M", "‵‵‵"), - (0x2038, "V"), - (0x203C, "3", "!!"), - (0x203D, "V"), - (0x203E, "3", " ̅"), - (0x203F, "V"), - (0x2047, "3", "??"), - (0x2048, "3", "?!"), - (0x2049, "3", "!?"), - (0x204A, "V"), - (0x2057, "M", "′′′′"), - (0x2058, "V"), - (0x205F, "3", " "), - (0x2060, "I"), - (0x2061, "X"), - (0x2064, "I"), - (0x2065, "X"), - (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, "3", "+"), - (0x207B, "M", "−"), - (0x207C, "3", "="), - (0x207D, "3", "("), - (0x207E, "3", ")"), - (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"), - (0x2088, "M", "8"), - (0x2089, "M", "9"), - (0x208A, "3", "+"), - (0x208B, "M", "−"), - (0x208C, "3", "="), - (0x208D, "3", "("), - (0x208E, "3", ")"), - (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, "3", "a/c"), - (0x2101, "3", "a/s"), - (0x2102, "M", "c"), - (0x2103, "M", "°c"), - (0x2104, "V"), - ] - - -def _seg_22() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2105, "3", "c/o"), - (0x2106, "3", "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, "X"), - (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"), - (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"), - ] - - -def _seg_23() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x217D, "M", "c"), - (0x217E, "M", "d"), - (0x217F, "M", "m"), - (0x2180, "V"), - (0x2183, "X"), - (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"), - (0x2427, "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, "3", "(1)"), - (0x2475, "3", "(2)"), - (0x2476, "3", "(3)"), - (0x2477, "3", "(4)"), - (0x2478, "3", "(5)"), - (0x2479, "3", "(6)"), - (0x247A, "3", "(7)"), - (0x247B, "3", "(8)"), - (0x247C, "3", "(9)"), - (0x247D, "3", "(10)"), - (0x247E, "3", "(11)"), - (0x247F, "3", "(12)"), - (0x2480, "3", "(13)"), - (0x2481, "3", "(14)"), - (0x2482, "3", "(15)"), - (0x2483, "3", "(16)"), - (0x2484, "3", "(17)"), - (0x2485, "3", "(18)"), - (0x2486, "3", "(19)"), - (0x2487, "3", "(20)"), - (0x2488, "X"), - (0x249C, "3", "(a)"), - (0x249D, "3", "(b)"), - (0x249E, "3", "(c)"), - (0x249F, "3", "(d)"), - (0x24A0, "3", "(e)"), - (0x24A1, "3", "(f)"), - (0x24A2, "3", "(g)"), - (0x24A3, "3", "(h)"), - (0x24A4, "3", "(i)"), - (0x24A5, "3", "(j)"), - (0x24A6, "3", "(k)"), - (0x24A7, "3", "(l)"), - (0x24A8, "3", "(m)"), - (0x24A9, "3", "(n)"), - (0x24AA, "3", "(o)"), - (0x24AB, "3", "(p)"), - (0x24AC, "3", "(q)"), - (0x24AD, "3", "(r)"), - (0x24AE, "3", "(s)"), - (0x24AF, "3", "(t)"), - (0x24B0, "3", "(u)"), - (0x24B1, "3", "(v)"), - (0x24B2, "3", "(w)"), - (0x24B3, "3", "(x)"), - (0x24B4, "3", "(y)"), - (0x24B5, "3", "(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"), - ] - - -def _seg_24() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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, "3", "::="), - (0x2A75, "3", "=="), - (0x2A76, "3", "==="), - (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", "ⰻ"), - (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", "ⱜ"), - ] - - -def _seg_25() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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"), - (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", "ⳇ"), - ] - - -def _seg_26() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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"), - (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", "卩"), - ] - - -def _seg_27() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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", "牛"), - (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", "而"), - ] - - -def _seg_28() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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", "鬲"), - (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, "3", " "), - (0x3001, "V"), - (0x3002, "M", "."), - (0x3003, "V"), - (0x3036, "M", "〒"), - (0x3037, "V"), - (0x3038, "M", "十"), - (0x3039, "M", "卄"), - (0x303A, "M", "卅"), - (0x303B, "V"), - (0x3040, "X"), - ] - - -def _seg_29() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x3041, "V"), - (0x3097, "X"), - (0x3099, "V"), - (0x309B, "3", " ゙"), - (0x309C, "3", " ゚"), - (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, "X"), - (0x3165, "M", "ᄔ"), - (0x3166, "M", "ᄕ"), - (0x3167, "M", "ᇇ"), - (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", "ᆅ"), - ] - - -def _seg_30() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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"), - (0x31E4, "X"), - (0x31F0, "V"), - (0x3200, "3", "(ᄀ)"), - (0x3201, "3", "(ᄂ)"), - (0x3202, "3", "(ᄃ)"), - (0x3203, "3", "(ᄅ)"), - (0x3204, "3", "(ᄆ)"), - (0x3205, "3", "(ᄇ)"), - (0x3206, "3", "(ᄉ)"), - (0x3207, "3", "(ᄋ)"), - (0x3208, "3", "(ᄌ)"), - (0x3209, "3", "(ᄎ)"), - (0x320A, "3", "(ᄏ)"), - (0x320B, "3", "(ᄐ)"), - (0x320C, "3", "(ᄑ)"), - (0x320D, "3", "(ᄒ)"), - (0x320E, "3", "(가)"), - (0x320F, "3", "(나)"), - (0x3210, "3", "(다)"), - (0x3211, "3", "(라)"), - (0x3212, "3", "(마)"), - (0x3213, "3", "(바)"), - (0x3214, "3", "(사)"), - (0x3215, "3", "(아)"), - (0x3216, "3", "(자)"), - (0x3217, "3", "(차)"), - (0x3218, "3", "(카)"), - (0x3219, "3", "(타)"), - (0x321A, "3", "(파)"), - (0x321B, "3", "(하)"), - (0x321C, "3", "(주)"), - (0x321D, "3", "(오전)"), - (0x321E, "3", "(오후)"), - (0x321F, "X"), - (0x3220, "3", "(一)"), - (0x3221, "3", "(二)"), - (0x3222, "3", "(三)"), - (0x3223, "3", "(四)"), - (0x3224, "3", "(五)"), - (0x3225, "3", "(六)"), - (0x3226, "3", "(七)"), - (0x3227, "3", "(八)"), - (0x3228, "3", "(九)"), - (0x3229, "3", "(十)"), - (0x322A, "3", "(月)"), - (0x322B, "3", "(火)"), - (0x322C, "3", "(水)"), - (0x322D, "3", "(木)"), - (0x322E, "3", "(金)"), - (0x322F, "3", "(土)"), - (0x3230, "3", "(日)"), - (0x3231, "3", "(株)"), - (0x3232, "3", "(有)"), - (0x3233, "3", "(社)"), - (0x3234, "3", "(名)"), - (0x3235, "3", "(特)"), - (0x3236, "3", "(財)"), - (0x3237, "3", "(祝)"), - (0x3238, "3", "(労)"), - (0x3239, "3", "(代)"), - (0x323A, "3", "(呼)"), - (0x323B, "3", "(学)"), - (0x323C, "3", "(監)"), - (0x323D, "3", "(企)"), - (0x323E, "3", "(資)"), - (0x323F, "3", "(協)"), - (0x3240, "3", "(祭)"), - (0x3241, "3", "(休)"), - (0x3242, "3", "(自)"), - (0x3243, "3", "(至)"), - (0x3244, "M", "問"), - (0x3245, "M", "幼"), - (0x3246, "M", "文"), - (0x3247, "M", "箏"), - (0x3248, "V"), - (0x3250, "M", "pte"), - (0x3251, "M", "21"), - ] - - -def _seg_31() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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", "名"), - (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"), - ] - - -def _seg_32() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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", "ル"), - (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", "グラムトン"), - ] - - -def _seg_33() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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点"), - (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", "大正"), - ] - - -def _seg_34() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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ω"), - (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日"), - ] - - -def _seg_35() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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", "ꙟ"), - (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"), - ] - - -def _seg_36() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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"), - (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"), - ] - - -def _seg_37() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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"), - (0xA7C9, "M", "ꟊ"), - (0xA7CA, "V"), - (0xA7CB, "X"), - (0xA7D0, "M", "ꟑ"), - (0xA7D1, "V"), - (0xA7D2, "X"), - (0xA7D3, "V"), - (0xA7D4, "X"), - (0xA7D5, "V"), - (0xA7D6, "M", "ꟗ"), - (0xA7D7, "V"), - (0xA7D8, "M", "ꟙ"), - (0xA7D9, "V"), - (0xA7DA, "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"), - ] - - -def _seg_38() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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", "Ꮇ"), - (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", "Ꮮ"), - ] - - -def _seg_39() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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", "濫"), - (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", "雷"), - ] - - -def _seg_40() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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", "閭"), - (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", "玲"), - ] - - -def _seg_41() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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", "離"), - (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", "晴"), - ] - - -def _seg_42() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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", "禎"), - (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", "塚"), - ] - - -def _seg_43() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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", "調"), - (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"), - ] - - -def _seg_44() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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, "3", "+"), - (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", "پ"), - (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", "ى"), - ] - - -def _seg_45() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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", "قح"), - (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", "يي"), - ] - - -def _seg_46() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFC5B, "M", "ذٰ"), - (0xFC5C, "M", "رٰ"), - (0xFC5D, "M", "ىٰ"), - (0xFC5E, "3", " ٌّ"), - (0xFC5F, "3", " ٍّ"), - (0xFC60, "3", " َّ"), - (0xFC61, "3", " ُّ"), - (0xFC62, "3", " ِّ"), - (0xFC63, "3", " ّٰ"), - (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", "ئج"), - (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", "فج"), - ] - - -def _seg_47() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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", "سى"), - (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", "صي"), - ] - - -def _seg_48() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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", "فخم"), - (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", "شحي"), - ] - - -def _seg_49() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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, "3", "صلى الله عليه وسلم"), - (0xFDFB, "3", "جل جلاله"), - (0xFDFC, "M", "ریال"), - (0xFDFD, "V"), - (0xFE00, "I"), - (0xFE10, "3", ","), - (0xFE11, "M", "、"), - (0xFE12, "X"), - (0xFE13, "3", ":"), - (0xFE14, "3", ";"), - (0xFE15, "3", "!"), - (0xFE16, "3", "?"), - (0xFE17, "M", "〖"), - (0xFE18, "M", "〗"), - (0xFE19, "X"), - (0xFE20, "V"), - (0xFE30, "X"), - (0xFE31, "M", "—"), - (0xFE32, "M", "–"), - (0xFE33, "3", "_"), - (0xFE35, "3", "("), - (0xFE36, "3", ")"), - (0xFE37, "3", "{"), - (0xFE38, "3", "}"), - (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, "3", "["), - (0xFE48, "3", "]"), - (0xFE49, "3", " ̅"), - (0xFE4D, "3", "_"), - (0xFE50, "3", ","), - (0xFE51, "M", "、"), - (0xFE52, "X"), - (0xFE54, "3", ";"), - (0xFE55, "3", ":"), - (0xFE56, "3", "?"), - (0xFE57, "3", "!"), - (0xFE58, "M", "—"), - (0xFE59, "3", "("), - (0xFE5A, "3", ")"), - (0xFE5B, "3", "{"), - (0xFE5C, "3", "}"), - (0xFE5D, "M", "〔"), - (0xFE5E, "M", "〕"), - (0xFE5F, "3", "#"), - (0xFE60, "3", "&"), - (0xFE61, "3", "*"), - ] - - -def _seg_50() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFE62, "3", "+"), - (0xFE63, "M", "-"), - (0xFE64, "3", "<"), - (0xFE65, "3", ">"), - (0xFE66, "3", "="), - (0xFE67, "X"), - (0xFE68, "3", "\\"), - (0xFE69, "3", "$"), - (0xFE6A, "3", "%"), - (0xFE6B, "3", "@"), - (0xFE6C, "X"), - (0xFE70, "3", " ً"), - (0xFE71, "M", "ـً"), - (0xFE72, "3", " ٌ"), - (0xFE73, "V"), - (0xFE74, "3", " ٍ"), - (0xFE75, "X"), - (0xFE76, "3", " َ"), - (0xFE77, "M", "ـَ"), - (0xFE78, "3", " ُ"), - (0xFE79, "M", "ـُ"), - (0xFE7A, "3", " ِ"), - (0xFE7B, "M", "ـِ"), - (0xFE7C, "3", " ّ"), - (0xFE7D, "M", "ـّ"), - (0xFE7E, "3", " ْ"), - (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", "و"), - (0xFEEF, "M", "ى"), - (0xFEF1, "M", "ي"), - (0xFEF5, "M", "لآ"), - (0xFEF7, "M", "لأ"), - (0xFEF9, "M", "لإ"), - (0xFEFB, "M", "لا"), - (0xFEFD, "X"), - (0xFEFF, "I"), - (0xFF00, "X"), - (0xFF01, "3", "!"), - (0xFF02, "3", '"'), - (0xFF03, "3", "#"), - (0xFF04, "3", "$"), - (0xFF05, "3", "%"), - (0xFF06, "3", "&"), - (0xFF07, "3", "'"), - (0xFF08, "3", "("), - (0xFF09, "3", ")"), - (0xFF0A, "3", "*"), - (0xFF0B, "3", "+"), - (0xFF0C, "3", ","), - (0xFF0D, "M", "-"), - (0xFF0E, "M", "."), - (0xFF0F, "3", "/"), - (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, "3", ":"), - (0xFF1B, "3", ";"), - (0xFF1C, "3", "<"), - (0xFF1D, "3", "="), - (0xFF1E, "3", ">"), - ] - - -def _seg_51() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFF1F, "3", "?"), - (0xFF20, "3", "@"), - (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, "3", "["), - (0xFF3C, "3", "\\"), - (0xFF3D, "3", "]"), - (0xFF3E, "3", "^"), - (0xFF3F, "3", "_"), - (0xFF40, "3", "`"), - (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, "3", "{"), - (0xFF5C, "3", "|"), - (0xFF5D, "3", "}"), - (0xFF5E, "3", "~"), - (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", "ツ"), - ] - - -def _seg_52() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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, "X"), - (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"), - (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, "3", " ̄"), - (0xFFE4, "M", "¦"), - (0xFFE5, "M", "¥"), - (0xFFE6, "M", "₩"), - (0xFFE7, "X"), - (0xFFE8, "M", "│"), - (0xFFE9, "M", "←"), - (0xFFEA, "M", "↑"), - (0xFFEB, "M", "→"), - (0xFFEC, "M", "↓"), - (0xFFED, "M", "■"), - ] - - -def _seg_53() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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", "𐐶"), - (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", "𐓡"), - ] - - -def _seg_54() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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", "𐖱"), - (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"), - (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", "ɗ"), - ] - - -def _seg_55() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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"), - (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"), - ] - - -def _seg_56() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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", "𐳭"), - (0x10CAE, "M", "𐳮"), - (0x10CAF, "M", "𐳯"), - (0x10CB0, "M", "𐳰"), - (0x10CB1, "M", "𐳱"), - (0x10CB2, "M", "𐳲"), - (0x10CB3, "X"), - (0x10CC0, "V"), - (0x10CF3, "X"), - (0x10CFA, "V"), - (0x10D28, "X"), - (0x10D30, "V"), - (0x10D3A, "X"), - (0x10E60, "V"), - (0x10E7F, "X"), - (0x10E80, "V"), - (0x10EAA, "X"), - (0x10EAB, "V"), - (0x10EAE, "X"), - (0x10EB0, "V"), - (0x10EB2, "X"), - (0x10EFD, "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"), - ] - - -def _seg_57() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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"), - (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"), - (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"), - (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", "𑣊"), - ] - - -def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x118AB, "M", "𑣋"), - (0x118AC, "M", "𑣌"), - (0x118AD, "M", "𑣍"), - (0x118AE, "M", "𑣎"), - (0x118AF, "M", "𑣏"), - (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"), - (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"), - ] - - -def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x11F5A, "X"), - (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"), - (0x14400, "V"), - (0x14647, "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"), - (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"), - (0x18D00, "V"), - (0x18D09, "X"), - (0x1AFF0, "V"), - (0x1AFF4, "X"), - (0x1AFF5, "V"), - (0x1AFFC, "X"), - (0x1AFFD, "V"), - ] - - -def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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"), - (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, "X"), - (0x1D17B, "V"), - (0x1D1BB, "M", "𝆹𝅥"), - (0x1D1BC, "M", "𝆺𝅥"), - (0x1D1BD, "M", "𝆹𝅥𝅮"), - (0x1D1BE, "M", "𝆺𝅥𝅮"), - (0x1D1BF, "M", "𝆹𝅥𝅯"), - (0x1D1C0, "M", "𝆺𝅥𝅯"), - (0x1D1C1, "V"), - (0x1D1EB, "X"), - (0x1D200, "V"), - (0x1D246, "X"), - (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"), - ] - - -def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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"), - (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"), - ] - - -def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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"), - (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"), - ] - - -def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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"), - (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"), - ] - - -def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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"), - (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"), - ] - - -def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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"), - (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"), - ] - - -def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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"), - (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"), - ] - - -def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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", "σ"), - (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", "η"), - ] - - -def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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", "ε"), - (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", "ω"), - ] - - -def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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", "χ"), - (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", "κ"), - ] - - -def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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"), - (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", "ж"), - ] - - -def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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", "ұ"), - (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"), - (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", "𞤯"), - ] - - -def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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", "ش"), - (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", "س"), - ] - - -def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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", "د"), - (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", "ذ"), - ] - - -def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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, "3", "0,"), - (0x1F102, "3", "1,"), - (0x1F103, "3", "2,"), - (0x1F104, "3", "3,"), - (0x1F105, "3", "4,"), - (0x1F106, "3", "5,"), - (0x1F107, "3", "6,"), - (0x1F108, "3", "7,"), - (0x1F109, "3", "8,"), - (0x1F10A, "3", "9,"), - (0x1F10B, "V"), - (0x1F110, "3", "(a)"), - (0x1F111, "3", "(b)"), - (0x1F112, "3", "(c)"), - (0x1F113, "3", "(d)"), - (0x1F114, "3", "(e)"), - (0x1F115, "3", "(f)"), - (0x1F116, "3", "(g)"), - (0x1F117, "3", "(h)"), - (0x1F118, "3", "(i)"), - (0x1F119, "3", "(j)"), - (0x1F11A, "3", "(k)"), - (0x1F11B, "3", "(l)"), - (0x1F11C, "3", "(m)"), - (0x1F11D, "3", "(n)"), - (0x1F11E, "3", "(o)"), - (0x1F11F, "3", "(p)"), - (0x1F120, "3", "(q)"), - (0x1F121, "3", "(r)"), - (0x1F122, "3", "(s)"), - (0x1F123, "3", "(t)"), - (0x1F124, "3", "(u)"), - (0x1F125, "3", "(v)"), - (0x1F126, "3", "(w)"), - (0x1F127, "3", "(x)"), - (0x1F128, "3", "(y)"), - (0x1F129, "3", "(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"), - ] - - -def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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"), - (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"), - (0x1F8B2, "X"), - (0x1F900, "V"), - (0x1FA54, "X"), - (0x1FA60, "V"), - (0x1FA6E, "X"), - (0x1FA70, "V"), - (0x1FA7D, "X"), - (0x1FA80, "V"), - (0x1FA89, "X"), - ] - - -def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1FA90, "V"), - (0x1FABE, "X"), - (0x1FABF, "V"), - (0x1FAC6, "X"), - (0x1FACE, "V"), - (0x1FADC, "X"), - (0x1FAE0, "V"), - (0x1FAE9, "X"), - (0x1FAF0, "V"), - (0x1FAF9, "X"), - (0x1FB00, "V"), - (0x1FB93, "X"), - (0x1FB94, "V"), - (0x1FBCB, "X"), - (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", "免"), - (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", "咢"), - ] - - -def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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, "X"), - (0x2F869, "M", "嬈"), - (0x2F86A, "M", "嬾"), - (0x2F86C, "M", "𡧈"), - (0x2F86D, "M", "寃"), - (0x2F86E, "M", "寘"), - (0x2F86F, "M", "寧"), - (0x2F870, "M", "寳"), - (0x2F871, "M", "𡬘"), - (0x2F872, "M", "寿"), - (0x2F873, "M", "将"), - (0x2F874, "X"), - (0x2F875, "M", "尢"), - (0x2F876, "M", "㞁"), - (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", "慎"), - ] - - -def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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", "杓"), - (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", "滇"), - ] - - -def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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, "X"), - (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", "𥃳"), - (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, "X"), - (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", "𦉇"), - ] - - -def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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", "䔫"), - (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, "X"), - (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", "起"), - ] - - -def _seg_81() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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", "鳽"), - (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() -) # type: Tuple[Union[Tuple[int, str], Tuple[int, str, str]], ...] diff --git a/venv/lib/python3.12/site-packages/multidict-6.6.3.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/multidict-6.6.3.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.12/site-packages/multidict-6.6.3.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/multidict-6.6.3.dist-info/METADATA b/venv/lib/python3.12/site-packages/multidict-6.6.3.dist-info/METADATA deleted file mode 100644 index 3669824..0000000 --- a/venv/lib/python3.12/site-packages/multidict-6.6.3.dist-info/METADATA +++ /dev/null @@ -1,148 +0,0 @@ -Metadata-Version: 2.4 -Name: multidict -Version: 6.6.3 -Summary: multidict implementation -Home-page: https://github.com/aio-libs/multidict -Author: Andrew Svetlov -Author-email: andrew.svetlov@gmail.com -License: Apache License 2.0 -Project-URL: Chat: Matrix, https://matrix.to/#/#aio-libs:matrix.org -Project-URL: Chat: Matrix Space, https://matrix.to/#/#aio-libs-space:matrix.org -Project-URL: CI: GitHub, https://github.com/aio-libs/multidict/actions -Project-URL: Code of Conduct, https://github.com/aio-libs/.github/blob/master/CODE_OF_CONDUCT.md -Project-URL: Coverage: codecov, https://codecov.io/github/aio-libs/multidict -Project-URL: Docs: Changelog, https://multidict.aio-libs.org/en/latest/changes/ -Project-URL: Docs: RTD, https://multidict.aio-libs.org -Project-URL: GitHub: issues, https://github.com/aio-libs/multidict/issues -Project-URL: GitHub: repo, https://github.com/aio-libs/multidict -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -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 -Requires-Python: >=3.9 -Description-Content-Type: text/x-rst -License-File: LICENSE -Requires-Dist: typing-extensions>=4.1.0; python_version < "3.11" -Dynamic: license-file - -========= -multidict -========= - -.. image:: https://github.com/aio-libs/multidict/actions/workflows/ci-cd.yml/badge.svg - :target: https://github.com/aio-libs/multidict/actions - :alt: GitHub status for master branch - -.. image:: https://codecov.io/gh/aio-libs/multidict/branch/master/graph/badge.svg?flag=pytest - :target: https://codecov.io/gh/aio-libs/multidict?flags[]=pytest - :alt: Coverage metrics - -.. image:: https://img.shields.io/pypi/v/multidict.svg - :target: https://pypi.org/project/multidict - :alt: PyPI - -.. image:: https://readthedocs.org/projects/multidict/badge/?version=latest - :target: https://multidict.aio-libs.org - :alt: Read The Docs build status badge - -.. image:: https://img.shields.io/endpoint?url=https://codspeed.io/badge.json - :target: https://codspeed.io/aio-libs/multidict - :alt: CodSpeed - -.. image:: https://img.shields.io/pypi/pyversions/multidict.svg - :target: https://pypi.org/project/multidict - :alt: Python versions - -.. image:: https://img.shields.io/matrix/aio-libs:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat - :target: https://matrix.to/#/%23aio-libs:matrix.org - :alt: Matrix Room — #aio-libs:matrix.org - -.. image:: https://img.shields.io/matrix/aio-libs-space:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs-space%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat - :target: https://matrix.to/#/%23aio-libs-space:matrix.org - :alt: Matrix Space — #aio-libs-space:matrix.org - -Multidict is dict-like collection of *key-value pairs* where key -might occur more than once in the container. - -Introduction ------------- - -*HTTP Headers* and *URL query string* require specific data structure: -*multidict*. It behaves mostly like a regular ``dict`` but it may have -several *values* for the same *key* and *preserves insertion ordering*. - -The *key* is ``str`` (or ``istr`` for case-insensitive dictionaries). - -``multidict`` has four multidict classes: -``MultiDict``, ``MultiDictProxy``, ``CIMultiDict`` -and ``CIMultiDictProxy``. - -Immutable proxies (``MultiDictProxy`` and -``CIMultiDictProxy``) provide a dynamic view for the -proxied multidict, the view reflects underlying collection changes. They -implement the ``collections.abc.Mapping`` interface. - -Regular mutable (``MultiDict`` and ``CIMultiDict``) classes -implement ``collections.abc.MutableMapping`` and allows them to change -their own content. - - -*Case insensitive* (``CIMultiDict`` and -``CIMultiDictProxy``) assume the *keys* are case -insensitive, e.g.:: - - >>> dct = CIMultiDict(key='val') - >>> 'Key' in dct - True - >>> dct['Key'] - 'val' - -*Keys* should be ``str`` or ``istr`` instances. - -The library has optional C Extensions for speed. - - -License -------- - -Apache 2 - -Library Installation --------------------- - -.. code-block:: bash - - $ pip install multidict - -The library is Python 3 only! - -PyPI contains binary wheels for Linux, Windows and MacOS. If you want to install -``multidict`` on another operating system (or *Alpine Linux* inside a Docker) the -tarball will be used to compile the library from source. It requires a C compiler and -Python headers to be installed. - -To skip the compilation, please use the `MULTIDICT_NO_EXTENSIONS` environment variable, -e.g.: - -.. code-block:: bash - - $ MULTIDICT_NO_EXTENSIONS=1 pip install multidict - -Please note, the pure Python (uncompiled) version is about 20-50 times slower depending on -the usage scenario!!! - -For extension development, set the ``MULTIDICT_DEBUG_BUILD`` environment variable to compile -the extensions in debug mode: - -.. code-block:: console - - $ MULTIDICT_DEBUG_BUILD=1 pip install multidict - -Changelog ---------- -See `RTD page <http://multidict.aio-libs.org/en/latest/changes>`_. diff --git a/venv/lib/python3.12/site-packages/multidict-6.6.3.dist-info/RECORD b/venv/lib/python3.12/site-packages/multidict-6.6.3.dist-info/RECORD deleted file mode 100644 index 1158d96..0000000 --- a/venv/lib/python3.12/site-packages/multidict-6.6.3.dist-info/RECORD +++ /dev/null @@ -1,16 +0,0 @@ -multidict-6.6.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -multidict-6.6.3.dist-info/METADATA,sha256=WeQBPmmQP6AovkUG5ZB-CgPKfINp7-tIoezMhUL1IJI,5270 -multidict-6.6.3.dist-info/RECORD,, -multidict-6.6.3.dist-info/WHEEL,sha256=DxRnWQz-Kp9-4a4hdDHsSv0KUC3H7sN9Nbef3-8RjXU,190 -multidict-6.6.3.dist-info/licenses/LICENSE,sha256=k9Ealo4vDzY3PECBH_bSDhc_WMPKtYhM1mF7v9eVSSo,611 -multidict-6.6.3.dist-info/top_level.txt,sha256=-euDElkk5_qkmfIJ7WiqCab02ZlSFZWynejKg59qZQQ,10 -multidict/__init__.py,sha256=O0b0Yq-jV26Yc-AzqGfsZ03H50lgdpCHXxTw1hGE340,1227 -multidict/__pycache__/__init__.cpython-312.pyc,, -multidict/__pycache__/_abc.cpython-312.pyc,, -multidict/__pycache__/_compat.cpython-312.pyc,, -multidict/__pycache__/_multidict_py.cpython-312.pyc,, -multidict/_abc.py,sha256=e_0JDJi7E6LWS0A3gUJ17SkgDLlmg8ffjfylTu_vboc,2402 -multidict/_compat.py,sha256=TcRjCStk2iIY1_DwDNj8kNpJRQ9rtLj92Xvk1z2G_ak,422 -multidict/_multidict.cpython-312-x86_64-linux-gnu.so,sha256=HbippIT7lTYfY1PyGAD3v9y-TAMZHXJF6z8dHC6enqc,848672 -multidict/_multidict_py.py,sha256=VGQ58P7VOd6lRf3WVAinb62aD16DPdAWRt68qmiJMXE,39955 -multidict/py.typed,sha256=e9bmbH3UFxsabQrnNFPG9qxIXztwbcM6IKDYnvZwprY,15 diff --git a/venv/lib/python3.12/site-packages/multidict-6.6.3.dist-info/WHEEL b/venv/lib/python3.12/site-packages/multidict-6.6.3.dist-info/WHEEL deleted file mode 100644 index f3e8a97..0000000 --- a/venv/lib/python3.12/site-packages/multidict-6.6.3.dist-info/WHEEL +++ /dev/null @@ -1,7 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (80.9.0) -Root-Is-Purelib: false -Tag: cp312-cp312-manylinux_2_17_x86_64 -Tag: cp312-cp312-manylinux2014_x86_64 -Tag: cp312-cp312-manylinux_2_28_x86_64 - diff --git a/venv/lib/python3.12/site-packages/multidict-6.6.3.dist-info/licenses/LICENSE b/venv/lib/python3.12/site-packages/multidict-6.6.3.dist-info/licenses/LICENSE deleted file mode 100644 index 8727172..0000000 --- a/venv/lib/python3.12/site-packages/multidict-6.6.3.dist-info/licenses/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ - Copyright 2016 Andrew Svetlov and aio-libs contributors - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/venv/lib/python3.12/site-packages/multidict-6.6.3.dist-info/top_level.txt b/venv/lib/python3.12/site-packages/multidict-6.6.3.dist-info/top_level.txt deleted file mode 100644 index afcecdf..0000000 --- a/venv/lib/python3.12/site-packages/multidict-6.6.3.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -multidict diff --git a/venv/lib/python3.12/site-packages/multidict/__init__.py b/venv/lib/python3.12/site-packages/multidict/__init__.py deleted file mode 100644 index c506324..0000000 --- a/venv/lib/python3.12/site-packages/multidict/__init__.py +++ /dev/null @@ -1,59 +0,0 @@ -"""Multidict implementation. - -HTTP Headers and URL query string require specific data structure: -multidict. It behaves mostly like a dict but it can have -several values for the same key. -""" - -from typing import TYPE_CHECKING - -from ._abc import MultiMapping, MutableMultiMapping -from ._compat import USE_EXTENSIONS - -__all__ = ( - "MultiMapping", - "MutableMultiMapping", - "MultiDictProxy", - "CIMultiDictProxy", - "MultiDict", - "CIMultiDict", - "upstr", - "istr", - "getversion", -) - -__version__ = "6.6.3" - - -if TYPE_CHECKING or not USE_EXTENSIONS: - from ._multidict_py import ( - CIMultiDict, - CIMultiDictProxy, - MultiDict, - MultiDictProxy, - getversion, - istr, - ) -else: - from collections.abc import ItemsView, KeysView, ValuesView - - from ._multidict import ( - CIMultiDict, - CIMultiDictProxy, - MultiDict, - MultiDictProxy, - _ItemsView, - _KeysView, - _ValuesView, - getversion, - istr, - ) - - MultiMapping.register(MultiDictProxy) - MutableMultiMapping.register(MultiDict) - KeysView.register(_KeysView) - ItemsView.register(_ItemsView) - ValuesView.register(_ValuesView) - - -upstr = istr diff --git a/venv/lib/python3.12/site-packages/multidict/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/multidict/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 560799060d988cb5a68adb906cffc1ab42afca20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1411 zcmZuwO>f&a7^Y;(ACkWkCw9_ZxONw#h=nyk4@0pHNR7p7lLbp!Y&uMkCDztLS}H}k zQ+DzGL2v6W!>+@y`~E{OGho1hfSq<2dUH_}0eTwgHgU3<hev$*KF|9l@_DJG1F=Rw zf8T!&0r*=Q=PUDW^XeM~fFFSeEZ`}gN))PEssg->2T6uP3sTL}=C($%G-u_+K5ON@ zoK?VTq~csu6Wlz}sbLwkXccM6D$%l4rWLC~t5#J3xN2QX3=zFRR_Lm=N^4e)u32mI zs5)8ypR#V%X~SyJ4Qpc&MFkjsd+WUX#TS=<6CKE<0Kw6ga!OY?wWXZK70&8XPW=jJ zZ7FAC!Fk(xvv~5yUQD>}`7TF34GE@rz#Z-fgO;xE9vvN^UF>+6MaUU==)srw(c>7i z1Vx<rgC1h|aqKgUq7b|OBi}`y!yW02T^=+1kxtK}w@`<pF77)+93dJ+oFs_&#~3+i zp1d220yuJ=0g@a&!b8j)f`$%>h2l}b5bujb4#nsgCoTPj9BflbOGjTHwC$bU_RhV| z{%0@b#G7hboVT^-grO)it?k9!=@NYTP)N%U4%>G7tE2Y*Vdsne!)AeLLd~)Q((;^p zSIp&r1>YrUb*J;6lfs3a8kd}@7KdU0DfA`kJ<LTTkr?QScDr@EwcX4zLuM&RkgtH{ zC6pzU1T-^gp~Eqa9{Tu6n!ksWw>$med=m0h6uKlts@n@)!M+e0_CmQxv)_C#&DpjW zxVD{Uc_Qb;<kL%`?R4EslgQa_KtqSKob(EfLx|8Aw*9U#VU%oo{-f<MSytU5b6Rl& zLa-|@S=5rbDzf*ggcX@WUj$>T^0X#lO}g?7_rzQ=V?|;93SJ2WZ+x>KP;63%M?>>& z;KuS2M<&Mv_n1SsBJR7#m~DB%lK~0jbvB21Ff@tZHN%AWgTZ#|!&_$LbG#Kg?y=Lu zk$KUOY1{t5=eFGnlQ;Q0H1J}AKW5iOW_j77-v!JvilV$!H3hyd1LggH!1iC@#tiC) zI?By9K&3u1US<JY`Kf%S=Cte?5HPy~3Z);kvztKsR2joh&Y&(m0$xiHGVR*v{uFMG z;pVf}1U640`V%&$5RD=FWpe^=p2GFf?i8+%;rdg50?{d~k2+IWAH(|7lL@?j3LB%( Vr?4@Gjc3LLelW|<GcqJ9{ukXUaK!)s diff --git a/venv/lib/python3.12/site-packages/multidict/__pycache__/_abc.cpython-312.pyc b/venv/lib/python3.12/site-packages/multidict/__pycache__/_abc.cpython-312.pyc deleted file mode 100644 index ecac7f01915b9072c02ae90ac456b6ea9198345f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5558 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 Ns)M)x#UY+K|36QrxRC$= diff --git a/venv/lib/python3.12/site-packages/multidict/__pycache__/_compat.cpython-312.pyc b/venv/lib/python3.12/site-packages/multidict/__pycache__/_compat.cpython-312.pyc deleted file mode 100644 index 3e1ebb30029d6eecbc862395a16c72e56644baf1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 674 zcmY*V&ubG=5T3U`vYRxCO)(S|tkee0AziBCNh`%h2xuBi3T6)t+w3#hWH)bl`|@M) zlCvj!%1t~;rT>DLoV~Q>AZ$TWJoOgrMRIbNHnz@T=9^*ozHjDREEWMj`XArbKO=x& zK{E^S0-SyI!2op7kqPQ~MJnO|a~K+-+4^N|gfH<7>D+<OAH=MxqR)UD(evrmd~ng| zeDgklDq%4SJw$l~Sc-xwW0}ff&;?yI!&XF%AaIe3?gE}$0V*QUL#kZ%XI<#=W$2=` zbQ&<`y~S7CFH5=2-1AZ;zg5Y;DP{A;+*ZEm2?e*{o(2Zf$ct30w#f|LsInL7sK*h< zlWkLDZwa+LVV4lolW?nJP}1`F8fISXf3l?QvN~y149hmLg<DKxhQBHl%7wBQ-!5ja zDgzB3=*{IUn^2ael+Z757TBHEl{&GoVrk6jD4V3(4!9hJVH4M=W@Q{^RGXM)bkc2^ zMAI=<I=(N(G<KD93lCS<9w?5%aK_fEO|6C<<=<&arAjPYW2?41m7iEdZ<~0XCVk=H z4UXlf36BsuhVU_5JDI=!;q^e>QwKYHJBKSzN6Gck{Ih;+ET#IrA5!W_N{ys@`;U*L zwZ1S;E*~bAzbBOaN1uBA_z9nwaDuq>Q@%41L0I@R2|;x6H*n(8_{Qz`@rmf8sk7iK T4#T011Pl|>#w~t$6Z!csgcq_0 diff --git a/venv/lib/python3.12/site-packages/multidict/__pycache__/_multidict_py.cpython-312.pyc b/venv/lib/python3.12/site-packages/multidict/__pycache__/_multidict_py.cpython-312.pyc deleted file mode 100644 index 3977fd373ccc8f2ba107df9ed046dbab82f75f3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65525 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 diff --git a/venv/lib/python3.12/site-packages/multidict/_abc.py b/venv/lib/python3.12/site-packages/multidict/_abc.py deleted file mode 100644 index 54253e9..0000000 --- a/venv/lib/python3.12/site-packages/multidict/_abc.py +++ /dev/null @@ -1,73 +0,0 @@ -import abc -from collections.abc import Iterable, Mapping, MutableMapping -from typing import TYPE_CHECKING, Protocol, TypeVar, Union, overload - -if TYPE_CHECKING: - from ._multidict_py import istr -else: - istr = str - -_V = TypeVar("_V") -_V_co = TypeVar("_V_co", covariant=True) -_T = TypeVar("_T") - - -class SupportsKeys(Protocol[_V_co]): - def keys(self) -> Iterable[str]: ... - def __getitem__(self, key: str, /) -> _V_co: ... - - -class SupportsIKeys(Protocol[_V_co]): - def keys(self) -> Iterable[istr]: ... - def __getitem__(self, key: istr, /) -> _V_co: ... - - -MDArg = Union[SupportsKeys[_V], SupportsIKeys[_V], Iterable[tuple[str, _V]], None] - - -class MultiMapping(Mapping[str, _V_co]): - @overload - def getall(self, key: str) -> list[_V_co]: ... - @overload - def getall(self, key: str, default: _T) -> Union[list[_V_co], _T]: ... - @abc.abstractmethod - def getall(self, key: str, default: _T = ...) -> Union[list[_V_co], _T]: - """Return all values for key.""" - - @overload - def getone(self, key: str) -> _V_co: ... - @overload - def getone(self, key: str, default: _T) -> Union[_V_co, _T]: ... - @abc.abstractmethod - def getone(self, key: str, default: _T = ...) -> Union[_V_co, _T]: - """Return first value for key.""" - - -class MutableMultiMapping(MultiMapping[_V], MutableMapping[str, _V]): - @abc.abstractmethod - def add(self, key: str, value: _V) -> None: - """Add value to list.""" - - @abc.abstractmethod - def extend(self, arg: MDArg[_V] = None, /, **kwargs: _V) -> None: - """Add everything from arg and kwargs to the mapping.""" - - @abc.abstractmethod - def merge(self, arg: MDArg[_V] = None, /, **kwargs: _V) -> None: - """Merge into the mapping, adding non-existing keys.""" - - @overload - def popone(self, key: str) -> _V: ... - @overload - def popone(self, key: str, default: _T) -> Union[_V, _T]: ... - @abc.abstractmethod - def popone(self, key: str, default: _T = ...) -> Union[_V, _T]: - """Remove specified key and return the corresponding value.""" - - @overload - def popall(self, key: str) -> list[_V]: ... - @overload - def popall(self, key: str, default: _T) -> Union[list[_V], _T]: ... - @abc.abstractmethod - def popall(self, key: str, default: _T = ...) -> Union[list[_V], _T]: - """Remove all occurrences of key and return the list of corresponding values.""" diff --git a/venv/lib/python3.12/site-packages/multidict/_compat.py b/venv/lib/python3.12/site-packages/multidict/_compat.py deleted file mode 100644 index 264d327..0000000 --- a/venv/lib/python3.12/site-packages/multidict/_compat.py +++ /dev/null @@ -1,15 +0,0 @@ -import os -import platform - -NO_EXTENSIONS = bool(os.environ.get("MULTIDICT_NO_EXTENSIONS")) - -PYPY = platform.python_implementation() == "PyPy" - -USE_EXTENSIONS = not NO_EXTENSIONS and not PYPY - -if USE_EXTENSIONS: - try: - from . import _multidict # type: ignore[attr-defined] # noqa: F401 - except ImportError: # pragma: no cover - # FIXME: Refactor for coverage. See #837. - USE_EXTENSIONS = False diff --git a/venv/lib/python3.12/site-packages/multidict/_multidict.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/multidict/_multidict.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index d234bb7a08fbc578b7e3044a480198ad8fc7a04a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 848672 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 diff --git a/venv/lib/python3.12/site-packages/multidict/_multidict_py.py b/venv/lib/python3.12/site-packages/multidict/_multidict_py.py deleted file mode 100644 index 6b68d52..0000000 --- a/venv/lib/python3.12/site-packages/multidict/_multidict_py.py +++ /dev/null @@ -1,1242 +0,0 @@ -import enum -import functools -import reprlib -import sys -from array import array -from collections.abc import ( - ItemsView, - Iterable, - Iterator, - KeysView, - Mapping, - ValuesView, -) -from dataclasses import dataclass -from typing import ( - TYPE_CHECKING, - Any, - ClassVar, - Generic, - NoReturn, - Optional, - TypeVar, - Union, - cast, - overload, -) - -from ._abc import MDArg, MultiMapping, MutableMultiMapping, SupportsKeys - -if sys.version_info >= (3, 11): - from typing import Self -else: - from typing_extensions import Self - - -class istr(str): - """Case insensitive str.""" - - __is_istr__ = True - __istr_identity__: Optional[str] = None - - -_V = TypeVar("_V") -_T = TypeVar("_T") - -_SENTINEL = enum.Enum("_SENTINEL", "sentinel") -sentinel = _SENTINEL.sentinel - -_version = array("Q", [0]) - - -class _Iter(Generic[_T]): - __slots__ = ("_size", "_iter") - - def __init__(self, size: int, iterator: Iterator[_T]): - self._size = size - self._iter = iterator - - def __iter__(self) -> Self: - return self - - def __next__(self) -> _T: - return next(self._iter) - - def __length_hint__(self) -> int: - return self._size - - -class _ViewBase(Generic[_V]): - def __init__( - self, - md: "MultiDict[_V]", - ): - self._md = md - - def __len__(self) -> int: - return len(self._md) - - -class _ItemsView(_ViewBase[_V], ItemsView[str, _V]): - def __contains__(self, item: object) -> bool: - if not isinstance(item, (tuple, list)) or len(item) != 2: - return False - key, value = item - try: - identity = self._md._identity(key) - except TypeError: - return False - hash_ = hash(identity) - for slot, idx, e in self._md._keys.iter_hash(hash_): - if e.identity == identity and value == e.value: - return True - return False - - def __iter__(self) -> _Iter[tuple[str, _V]]: - return _Iter(len(self), self._iter(self._md._version)) - - def _iter(self, version: int) -> Iterator[tuple[str, _V]]: - for e in self._md._keys.iter_entries(): - if version != self._md._version: - raise RuntimeError("Dictionary changed during iteration") - yield self._md._key(e.key), e.value - - @reprlib.recursive_repr() - def __repr__(self) -> str: - lst = [] - for e in self._md._keys.iter_entries(): - lst.append(f"'{e.key}': {e.value!r}") - body = ", ".join(lst) - return f"<{self.__class__.__name__}({body})>" - - def _parse_item( - self, arg: Union[tuple[str, _V], _T] - ) -> Optional[tuple[int, str, str, _V]]: - if not isinstance(arg, tuple): - return None - if len(arg) != 2: - return None - try: - identity = self._md._identity(arg[0]) - return (hash(identity), identity, arg[0], arg[1]) - except TypeError: - return None - - def _tmp_set(self, it: Iterable[_T]) -> set[tuple[str, _V]]: - tmp = set() - for arg in it: - item = self._parse_item(arg) - if item is None: - continue - else: - tmp.add((item[1], item[3])) - return tmp - - def __and__(self, other: Iterable[Any]) -> set[tuple[str, _V]]: - ret = set() - try: - it = iter(other) - except TypeError: - return NotImplemented - for arg in it: - item = self._parse_item(arg) - if item is None: - continue - hash_, identity, key, value = item - for slot, idx, e in self._md._keys.iter_hash(hash_): - e.hash = -1 - if e.identity == identity and e.value == value: - ret.add((e.key, e.value)) - self._md._keys.restore_hash(hash_) - return ret - - def __rand__(self, other: Iterable[_T]) -> set[_T]: - ret = set() - try: - it = iter(other) - except TypeError: - return NotImplemented - for arg in it: - item = self._parse_item(arg) - if item is None: - continue - hash_, identity, key, value = item - for slot, idx, e in self._md._keys.iter_hash(hash_): - if e.identity == identity and e.value == value: - ret.add(arg) - break - return ret - - def __or__(self, other: Iterable[_T]) -> set[Union[tuple[str, _V], _T]]: - ret: set[Union[tuple[str, _V], _T]] = set(self) - try: - it = iter(other) - except TypeError: - return NotImplemented - for arg in it: - item: Optional[tuple[int, str, str, _V]] = self._parse_item(arg) - if item is None: - ret.add(arg) - continue - hash_, identity, key, value = item - for slot, idx, e in self._md._keys.iter_hash(hash_): - if e.identity == identity and e.value == value: # pragma: no branch - break - else: - ret.add(arg) - return ret - - def __ror__(self, other: Iterable[_T]) -> set[Union[tuple[str, _V], _T]]: - try: - ret: set[Union[tuple[str, _V], _T]] = set(other) - except TypeError: - return NotImplemented - tmp = self._tmp_set(ret) - - for e in self._md._keys.iter_entries(): - if (e.identity, e.value) not in tmp: - ret.add((e.key, e.value)) - return ret - - def __sub__(self, other: Iterable[_T]) -> set[Union[tuple[str, _V], _T]]: - ret: set[Union[tuple[str, _V], _T]] = set() - try: - it = iter(other) - except TypeError: - return NotImplemented - tmp = self._tmp_set(it) - - for e in self._md._keys.iter_entries(): - if (e.identity, e.value) not in tmp: - ret.add((e.key, e.value)) - - return ret - - def __rsub__(self, other: Iterable[_T]) -> set[_T]: - ret: set[_T] = set() - try: - it = iter(other) - except TypeError: - return NotImplemented - for arg in it: - item = self._parse_item(arg) - if item is None: - ret.add(arg) - continue - - hash_, identity, key, value = item - for slot, idx, e in self._md._keys.iter_hash(hash_): - if e.identity == identity and e.value == value: # pragma: no branch - break - else: - ret.add(arg) - return ret - - def __xor__(self, other: Iterable[_T]) -> set[Union[tuple[str, _V], _T]]: - try: - rgt = set(other) - except TypeError: - return NotImplemented - ret: set[Union[tuple[str, _V], _T]] = self - rgt - ret |= rgt - self - return ret - - __rxor__ = __xor__ - - def isdisjoint(self, other: Iterable[tuple[str, _V]]) -> bool: - for arg in other: - item = self._parse_item(arg) - if item is None: - continue - - hash_, identity, key, value = item - for slot, idx, e in self._md._keys.iter_hash(hash_): - if e.identity == identity and e.value == value: # pragma: no branch - return False - return True - - -class _ValuesView(_ViewBase[_V], ValuesView[_V]): - def __contains__(self, value: object) -> bool: - for e in self._md._keys.iter_entries(): - if e.value == value: - return True - return False - - def __iter__(self) -> _Iter[_V]: - return _Iter(len(self), self._iter(self._md._version)) - - def _iter(self, version: int) -> Iterator[_V]: - for e in self._md._keys.iter_entries(): - if version != self._md._version: - raise RuntimeError("Dictionary changed during iteration") - yield e.value - - @reprlib.recursive_repr() - def __repr__(self) -> str: - lst = [] - for e in self._md._keys.iter_entries(): - lst.append(repr(e.value)) - body = ", ".join(lst) - return f"<{self.__class__.__name__}({body})>" - - -class _KeysView(_ViewBase[_V], KeysView[str]): - def __contains__(self, key: object) -> bool: - if not isinstance(key, str): - return False - identity = self._md._identity(key) - hash_ = hash(identity) - for slot, idx, e in self._md._keys.iter_hash(hash_): - if e.identity == identity: # pragma: no branch - return True - return False - - def __iter__(self) -> _Iter[str]: - return _Iter(len(self), self._iter(self._md._version)) - - def _iter(self, version: int) -> Iterator[str]: - for e in self._md._keys.iter_entries(): - if version != self._md._version: - raise RuntimeError("Dictionary changed during iteration") - yield self._md._key(e.key) - - def __repr__(self) -> str: - lst = [] - for e in self._md._keys.iter_entries(): - lst.append(f"'{e.key}'") - body = ", ".join(lst) - return f"<{self.__class__.__name__}({body})>" - - def __and__(self, other: Iterable[object]) -> set[str]: - ret = set() - try: - it = iter(other) - except TypeError: - return NotImplemented - for key in it: - if not isinstance(key, str): - continue - identity = self._md._identity(key) - hash_ = hash(identity) - for slot, idx, e in self._md._keys.iter_hash(hash_): - if e.identity == identity: # pragma: no branch - ret.add(e.key) - break - return ret - - def __rand__(self, other: Iterable[_T]) -> set[_T]: - ret = set() - try: - it = iter(other) - except TypeError: - return NotImplemented - for key in it: - if not isinstance(key, str): - continue - if key in self._md: - ret.add(key) - return cast(set[_T], ret) - - def __or__(self, other: Iterable[_T]) -> set[Union[str, _T]]: - ret: set[Union[str, _T]] = set(self) - try: - it = iter(other) - except TypeError: - return NotImplemented - for key in it: - if not isinstance(key, str): - ret.add(key) - continue - if key not in self._md: - ret.add(key) - return ret - - def __ror__(self, other: Iterable[_T]) -> set[Union[str, _T]]: - try: - ret: set[Union[str, _T]] = set(other) - except TypeError: - return NotImplemented - - tmp = set() - for key in ret: - if not isinstance(key, str): - continue - identity = self._md._identity(key) - tmp.add(identity) - - for e in self._md._keys.iter_entries(): - if e.identity not in tmp: - ret.add(e.key) - return ret - - def __sub__(self, other: Iterable[object]) -> set[str]: - ret = set(self) - try: - it = iter(other) - except TypeError: - return NotImplemented - for key in it: - if not isinstance(key, str): - continue - identity = self._md._identity(key) - hash_ = hash(identity) - for slot, idx, e in self._md._keys.iter_hash(hash_): - if e.identity == identity: # pragma: no branch - ret.discard(e.key) - break - return ret - - def __rsub__(self, other: Iterable[_T]) -> set[_T]: - try: - ret: set[_T] = set(other) - except TypeError: - return NotImplemented - for key in other: - if not isinstance(key, str): - continue - if key in self._md: - ret.discard(key) # type: ignore[arg-type] - return ret - - def __xor__(self, other: Iterable[_T]) -> set[Union[str, _T]]: - try: - rgt = set(other) - except TypeError: - return NotImplemented - ret: set[Union[str, _T]] = self - rgt # type: ignore[assignment] - ret |= rgt - self - return ret - - __rxor__ = __xor__ - - def isdisjoint(self, other: Iterable[object]) -> bool: - for key in other: - if not isinstance(key, str): - continue - if key in self._md: - return False - return True - - -class _CSMixin: - _ci: ClassVar[bool] = False - - def _key(self, key: str) -> str: - return key - - def _identity(self, key: str) -> str: - if isinstance(key, str): - return key - else: - raise TypeError("MultiDict keys should be either str or subclasses of str") - - -class _CIMixin: - _ci: ClassVar[bool] = True - - def _key(self, key: str) -> str: - if type(key) is istr: - return key - else: - return istr(key) - - def _identity(self, key: str) -> str: - if isinstance(key, istr): - ret = key.__istr_identity__ - if ret is None: - ret = key.lower() - key.__istr_identity__ = ret - return ret - if isinstance(key, str): - return key.lower() - else: - raise TypeError("MultiDict keys should be either str or subclasses of str") - - -def estimate_log2_keysize(n: int) -> int: - # 7 == HT_MINSIZE - 1 - return (((n * 3 + 1) // 2) | 7).bit_length() - - -@dataclass -class _Entry(Generic[_V]): - hash: int - identity: str - key: str - value: _V - - -@dataclass -class _HtKeys(Generic[_V]): # type: ignore[misc] - LOG_MINSIZE: ClassVar[int] = 3 - MINSIZE: ClassVar[int] = 8 - PREALLOCATED_INDICES: ClassVar[dict[int, array]] = { # type: ignore[type-arg] - log2_size: array( - "b" if log2_size < 8 else "h", (-1 for i in range(1 << log2_size)) - ) - for log2_size in range(3, 10) - } - - log2_size: int - usable: int - - indices: array # type: ignore[type-arg] # in py3.9 array is not generic - entries: list[Optional[_Entry[_V]]] - - @functools.cached_property - def nslots(self) -> int: - return 1 << self.log2_size - - @functools.cached_property - def mask(self) -> int: - return self.nslots - 1 - - if sys.implementation.name != "pypy": - - def __sizeof__(self) -> int: - return ( - object.__sizeof__(self) - + sys.getsizeof(self.indices) - + sys.getsizeof(self.entries) - ) - - @classmethod - def new(cls, log2_size: int, entries: list[Optional[_Entry[_V]]]) -> Self: - size = 1 << log2_size - usable = (size << 1) // 3 - if log2_size < 10: - indices = cls.PREALLOCATED_INDICES[log2_size].__copy__() - elif log2_size < 16: - indices = array("h", (-1 for i in range(size))) - elif log2_size < 32: - indices = array("l", (-1 for i in range(size))) - else: # pragma: no cover # don't test huge multidicts - indices = array("q", (-1 for i in range(size))) - ret = cls( - log2_size=log2_size, - usable=usable, - indices=indices, - entries=entries, - ) - return ret - - def clone(self) -> "_HtKeys[_V]": - entries = [ - _Entry(e.hash, e.identity, e.key, e.value) if e is not None else None - for e in self.entries - ] - - return _HtKeys( - log2_size=self.log2_size, - usable=self.usable, - indices=self.indices.__copy__(), - entries=entries, - ) - - def build_indices(self, update: bool) -> None: - mask = self.mask - indices = self.indices - for idx, e in enumerate(self.entries): - assert e is not None - hash_ = e.hash - if update: - if hash_ == -1: - hash_ = hash(e.identity) - else: - assert hash_ != -1 - i = hash_ & mask - perturb = hash_ & sys.maxsize - while indices[i] != -1: - perturb >>= 5 - i = mask & (i * 5 + perturb + 1) - indices[i] = idx - - def find_empty_slot(self, hash_: int) -> int: - mask = self.mask - indices = self.indices - i = hash_ & mask - perturb = hash_ & sys.maxsize - ix = indices[i] - while ix != -1: - perturb >>= 5 - i = (i * 5 + perturb + 1) & mask - ix = indices[i] - return i - - def iter_hash(self, hash_: int) -> Iterator[tuple[int, int, _Entry[_V]]]: - mask = self.mask - indices = self.indices - entries = self.entries - i = hash_ & mask - perturb = hash_ & sys.maxsize - ix = indices[i] - while ix != -1: - if ix != -2: - e = entries[ix] - if e.hash == hash_: - yield i, ix, e - perturb >>= 5 - i = (i * 5 + perturb + 1) & mask - ix = indices[i] - - def del_idx(self, hash_: int, idx: int) -> None: - mask = self.mask - indices = self.indices - i = hash_ & mask - perturb = hash_ & sys.maxsize - ix = indices[i] - while ix != idx: - perturb >>= 5 - i = (i * 5 + perturb + 1) & mask - ix = indices[i] - indices[i] = -2 - - def iter_entries(self) -> Iterator[_Entry[_V]]: - return filter(None, self.entries) - - def restore_hash(self, hash_: int) -> None: - mask = self.mask - indices = self.indices - entries = self.entries - i = hash_ & mask - perturb = hash_ & sys.maxsize - ix = indices[i] - while ix != -1: - if ix != -2: - entry = entries[ix] - if entry.hash == -1: - entry.hash = hash_ - perturb >>= 5 - i = (i * 5 + perturb + 1) & mask - ix = indices[i] - - -class MultiDict(_CSMixin, MutableMultiMapping[_V]): - """Dictionary with the support for duplicate keys.""" - - __slots__ = ("_keys", "_used", "_version") - - def __init__(self, arg: MDArg[_V] = None, /, **kwargs: _V): - self._used = 0 - v = _version - v[0] += 1 - self._version = v[0] - if not kwargs: - md = None - if isinstance(arg, MultiDictProxy): - md = arg._md - elif isinstance(arg, MultiDict): - md = arg - if md is not None and md._ci is self._ci: - self._from_md(md) - return - - it = self._parse_args(arg, kwargs) - log2_size = estimate_log2_keysize(cast(int, next(it))) - if log2_size > 17: # pragma: no cover - # Don't overallocate really huge keys space in init - log2_size = 17 - self._keys: _HtKeys[_V] = _HtKeys.new(log2_size, []) - self._extend_items(cast(Iterator[_Entry[_V]], it)) - - def _from_md(self, md: "MultiDict[_V]") -> None: - # Copy everything as-is without compacting the new multidict, - # otherwise it requires reindexing - self._keys = md._keys.clone() - self._used = md._used - - @overload - def getall(self, key: str) -> list[_V]: ... - @overload - def getall(self, key: str, default: _T) -> Union[list[_V], _T]: ... - def getall( - self, key: str, default: Union[_T, _SENTINEL] = sentinel - ) -> Union[list[_V], _T]: - """Return a list of all values matching the key.""" - identity = self._identity(key) - hash_ = hash(identity) - res = [] - restore = [] - for slot, idx, e in self._keys.iter_hash(hash_): - if e.identity == identity: # pragma: no branch - res.append(e.value) - e.hash = -1 - restore.append(idx) - - if res: - entries = self._keys.entries - for idx in restore: - entries[idx].hash = hash_ # type: ignore[union-attr] - return res - if not res and default is not sentinel: - return default - raise KeyError("Key not found: %r" % key) - - @overload - def getone(self, key: str) -> _V: ... - @overload - def getone(self, key: str, default: _T) -> Union[_V, _T]: ... - def getone( - self, key: str, default: Union[_T, _SENTINEL] = sentinel - ) -> Union[_V, _T]: - """Get first value matching the key. - - Raises KeyError if the key is not found and no default is provided. - """ - identity = self._identity(key) - hash_ = hash(identity) - for slot, idx, e in self._keys.iter_hash(hash_): - if e.identity == identity: # pragma: no branch - return e.value - if default is not sentinel: - return default - raise KeyError("Key not found: %r" % key) - - # Mapping interface # - - def __getitem__(self, key: str) -> _V: - return self.getone(key) - - @overload - def get(self, key: str, /) -> Union[_V, None]: ... - @overload - def get(self, key: str, /, default: _T) -> Union[_V, _T]: ... - def get(self, key: str, default: Union[_T, None] = None) -> Union[_V, _T, None]: - """Get first value matching the key. - - If the key is not found, returns the default (or None if no default is provided) - """ - return self.getone(key, default) - - def __iter__(self) -> Iterator[str]: - return iter(self.keys()) - - def __len__(self) -> int: - return self._used - - def keys(self) -> KeysView[str]: - """Return a new view of the dictionary's keys.""" - return _KeysView(self) - - def items(self) -> ItemsView[str, _V]: - """Return a new view of the dictionary's items *(key, value) pairs).""" - return _ItemsView(self) - - def values(self) -> _ValuesView[_V]: - """Return a new view of the dictionary's values.""" - return _ValuesView(self) - - def __eq__(self, other: object) -> bool: - if not isinstance(other, Mapping): - return NotImplemented - if isinstance(other, MultiDictProxy): - return self == other._md - if isinstance(other, MultiDict): - lft = self._keys - rht = other._keys - if self._used != other._used: - return False - for e1, e2 in zip(lft.iter_entries(), rht.iter_entries()): - if e1.identity != e2.identity or e1.value != e2.value: - return False - return True - if self._used != len(other): - return False - for k, v in self.items(): - nv = other.get(k, sentinel) - if v != nv: - return False - return True - - def __contains__(self, key: object) -> bool: - if not isinstance(key, str): - return False - identity = self._identity(key) - hash_ = hash(identity) - for slot, idx, e in self._keys.iter_hash(hash_): - if e.identity == identity: # pragma: no branch - return True - return False - - @reprlib.recursive_repr() - def __repr__(self) -> str: - body = ", ".join(f"'{e.key}': {e.value!r}" for e in self._keys.iter_entries()) - return f"<{self.__class__.__name__}({body})>" - - if sys.implementation.name != "pypy": - - def __sizeof__(self) -> int: - return object.__sizeof__(self) + sys.getsizeof(self._keys) - - def __reduce__(self) -> tuple[type[Self], tuple[list[tuple[str, _V]]]]: - return (self.__class__, (list(self.items()),)) - - def add(self, key: str, value: _V) -> None: - identity = self._identity(key) - hash_ = hash(identity) - self._add_with_hash(_Entry(hash_, identity, key, value)) - self._incr_version() - - def copy(self) -> Self: - """Return a copy of itself.""" - cls = self.__class__ - return cls(self) - - __copy__ = copy - - def extend(self, arg: MDArg[_V] = None, /, **kwargs: _V) -> None: - """Extend current MultiDict with more values. - - This method must be used instead of update. - """ - it = self._parse_args(arg, kwargs) - newsize = self._used + cast(int, next(it)) - self._resize(estimate_log2_keysize(newsize), False) - self._extend_items(cast(Iterator[_Entry[_V]], it)) - - def _parse_args( - self, - arg: MDArg[_V], - kwargs: Mapping[str, _V], - ) -> Iterator[Union[int, _Entry[_V]]]: - identity_func = self._identity - if arg: - if isinstance(arg, MultiDictProxy): - arg = arg._md - if isinstance(arg, MultiDict): - yield len(arg) + len(kwargs) - if self._ci is not arg._ci: - for e in arg._keys.iter_entries(): - identity = identity_func(e.key) - yield _Entry(hash(identity), identity, e.key, e.value) - else: - for e in arg._keys.iter_entries(): - yield _Entry(e.hash, e.identity, e.key, e.value) - if kwargs: - for key, value in kwargs.items(): - identity = identity_func(key) - yield _Entry(hash(identity), identity, key, value) - else: - if hasattr(arg, "keys"): - arg = cast(SupportsKeys[_V], arg) - arg = [(k, arg[k]) for k in arg.keys()] - if kwargs: - arg = list(arg) - arg.extend(list(kwargs.items())) - try: - yield len(arg) + len(kwargs) # type: ignore[arg-type] - except TypeError: - yield 0 - for pos, item in enumerate(arg): - if not len(item) == 2: - raise ValueError( - f"multidict update sequence element #{pos}" - f"has length {len(item)}; 2 is required" - ) - identity = identity_func(item[0]) - yield _Entry(hash(identity), identity, item[0], item[1]) - else: - yield len(kwargs) - for key, value in kwargs.items(): - identity = identity_func(key) - yield _Entry(hash(identity), identity, key, value) - - def _extend_items(self, items: Iterable[_Entry[_V]]) -> None: - for e in items: - self._add_with_hash(e) - self._incr_version() - - def clear(self) -> None: - """Remove all items from MultiDict.""" - self._used = 0 - self._keys = _HtKeys.new(_HtKeys.LOG_MINSIZE, []) - self._incr_version() - - # Mapping interface # - - def __setitem__(self, key: str, value: _V) -> None: - identity = self._identity(key) - hash_ = hash(identity) - found = False - - for slot, idx, e in self._keys.iter_hash(hash_): - if e.identity == identity: # pragma: no branch - if not found: - e.key = key - e.value = value - e.hash = -1 - found = True - self._incr_version() - elif e.hash != -1: # pragma: no branch - self._del_at(slot, idx) - - if not found: - self._add_with_hash(_Entry(hash_, identity, key, value)) - else: - self._keys.restore_hash(hash_) - - def __delitem__(self, key: str) -> None: - found = False - identity = self._identity(key) - hash_ = hash(identity) - for slot, idx, e in self._keys.iter_hash(hash_): - if e.identity == identity: # pragma: no branch - self._del_at(slot, idx) - found = True - if not found: - raise KeyError(key) - else: - self._incr_version() - - @overload - def setdefault( - self: "MultiDict[Union[_T, None]]", key: str, default: None = None - ) -> Union[_T, None]: ... - @overload - def setdefault(self, key: str, default: _V) -> _V: ... - def setdefault(self, key: str, default: Union[_V, None] = None) -> Union[_V, None]: # type: ignore[misc] - """Return value for key, set value to default if key is not present.""" - identity = self._identity(key) - hash_ = hash(identity) - for slot, idx, e in self._keys.iter_hash(hash_): - if e.identity == identity: # pragma: no branch - return e.value - self.add(key, default) # type: ignore[arg-type] - return default - - @overload - def popone(self, key: str) -> _V: ... - @overload - def popone(self, key: str, default: _T) -> Union[_V, _T]: ... - def popone( - self, key: str, default: Union[_T, _SENTINEL] = sentinel - ) -> Union[_V, _T]: - """Remove specified key and return the corresponding value. - - If key is not found, d is returned if given, otherwise - KeyError is raised. - - """ - identity = self._identity(key) - hash_ = hash(identity) - for slot, idx, e in self._keys.iter_hash(hash_): - if e.identity == identity: # pragma: no branch - value = e.value - self._del_at(slot, idx) - self._incr_version() - return value - if default is sentinel: - raise KeyError(key) - else: - return default - - # Type checking will inherit signature for pop() if we don't confuse it here. - if not TYPE_CHECKING: - pop = popone - - @overload - def popall(self, key: str) -> list[_V]: ... - @overload - def popall(self, key: str, default: _T) -> Union[list[_V], _T]: ... - def popall( - self, key: str, default: Union[_T, _SENTINEL] = sentinel - ) -> Union[list[_V], _T]: - """Remove all occurrences of key and return the list of corresponding - values. - - If key is not found, default is returned if given, otherwise - KeyError is raised. - - """ - found = False - identity = self._identity(key) - hash_ = hash(identity) - ret = [] - for slot, idx, e in self._keys.iter_hash(hash_): - if e.identity == identity: # pragma: no branch - found = True - ret.append(e.value) - self._del_at(slot, idx) - self._incr_version() - - if not found: - if default is sentinel: - raise KeyError(key) - else: - return default - else: - return ret - - def popitem(self) -> tuple[str, _V]: - """Remove and return an arbitrary (key, value) pair.""" - if self._used <= 0: - raise KeyError("empty multidict") - - pos = len(self._keys.entries) - 1 - entry = self._keys.entries.pop() - - while entry is None: - pos -= 1 - entry = self._keys.entries.pop() - - ret = self._key(entry.key), entry.value - self._keys.del_idx(entry.hash, pos) - self._used -= 1 - self._incr_version() - return ret - - def update(self, arg: MDArg[_V] = None, /, **kwargs: _V) -> None: - """Update the dictionary, overwriting existing keys.""" - it = self._parse_args(arg, kwargs) - newsize = self._used + cast(int, next(it)) - log2_size = estimate_log2_keysize(newsize) - if log2_size > 17: # pragma: no cover - # Don't overallocate really huge keys space in update, - # duplicate keys could reduce the resulting anount of entries - log2_size = 17 - if log2_size > self._keys.log2_size: - self._resize(log2_size, False) - try: - self._update_items(cast(Iterator[_Entry[_V]], it)) - finally: - self._post_update() - - def _update_items(self, items: Iterator[_Entry[_V]]) -> None: - for entry in items: - found = False - hash_ = entry.hash - identity = entry.identity - for slot, idx, e in self._keys.iter_hash(hash_): - if e.identity == identity: # pragma: no branch - if not found: - found = True - e.key = entry.key - e.value = entry.value - e.hash = -1 - else: - self._del_at_for_upd(e) - if not found: - self._add_with_hash_for_upd(entry) - - def _post_update(self) -> None: - keys = self._keys - indices = keys.indices - entries = keys.entries - for slot in range(keys.nslots): - idx = indices[slot] - if idx >= 0: - e2 = entries[idx] - assert e2 is not None - if e2.key is None: - entries[idx] = None - indices[slot] = -2 - self._used -= 1 - if e2.hash == -1: - e2.hash = hash(e2.identity) - - self._incr_version() - - def merge(self, arg: MDArg[_V] = None, /, **kwargs: _V) -> None: - """Merge into the dictionary, adding non-existing keys.""" - it = self._parse_args(arg, kwargs) - newsize = self._used + cast(int, next(it)) - log2_size = estimate_log2_keysize(newsize) - if log2_size > 17: # pragma: no cover - # Don't overallocate really huge keys space in update, - # duplicate keys could reduce the resulting anount of entries - log2_size = 17 - if log2_size > self._keys.log2_size: - self._resize(log2_size, False) - try: - self._merge_items(cast(Iterator[_Entry[_V]], it)) - finally: - self._post_update() - - def _merge_items(self, items: Iterator[_Entry[_V]]) -> None: - for entry in items: - hash_ = entry.hash - identity = entry.identity - for slot, idx, e in self._keys.iter_hash(hash_): - if e.identity == identity: # pragma: no branch - break - else: - self._add_with_hash_for_upd(entry) - - def _incr_version(self) -> None: - v = _version - v[0] += 1 - self._version = v[0] - - def _resize(self, log2_newsize: int, update: bool) -> None: - oldkeys = self._keys - newentries = self._used - - if len(oldkeys.entries) == newentries: - entries = oldkeys.entries - else: - entries = [e for e in oldkeys.entries if e is not None] - newkeys: _HtKeys[_V] = _HtKeys.new(log2_newsize, entries) - newkeys.usable -= newentries - newkeys.build_indices(update) - self._keys = newkeys - - def _add_with_hash(self, entry: _Entry[_V]) -> None: - if self._keys.usable <= 0: - self._resize((self._used * 3 | _HtKeys.MINSIZE - 1).bit_length(), False) - keys = self._keys - slot = keys.find_empty_slot(entry.hash) - keys.indices[slot] = len(keys.entries) - keys.entries.append(entry) - self._incr_version() - self._used += 1 - keys.usable -= 1 - - def _add_with_hash_for_upd(self, entry: _Entry[_V]) -> None: - if self._keys.usable <= 0: - self._resize((self._used * 3 | _HtKeys.MINSIZE - 1).bit_length(), True) - keys = self._keys - slot = keys.find_empty_slot(entry.hash) - keys.indices[slot] = len(keys.entries) - entry.hash = -1 - keys.entries.append(entry) - self._incr_version() - self._used += 1 - keys.usable -= 1 - - def _del_at(self, slot: int, idx: int) -> None: - self._keys.entries[idx] = None - self._keys.indices[slot] = -2 - self._used -= 1 - - def _del_at_for_upd(self, entry: _Entry[_V]) -> None: - entry.key = None # type: ignore[assignment] - entry.value = None # type: ignore[assignment] - - -class CIMultiDict(_CIMixin, MultiDict[_V]): - """Dictionary with the support for duplicate case-insensitive keys.""" - - -class MultiDictProxy(_CSMixin, MultiMapping[_V]): - """Read-only proxy for MultiDict instance.""" - - __slots__ = ("_md",) - - _md: MultiDict[_V] - - def __init__(self, arg: Union[MultiDict[_V], "MultiDictProxy[_V]"]): - if not isinstance(arg, (MultiDict, MultiDictProxy)): - raise TypeError( - f"ctor requires MultiDict or MultiDictProxy instance, not {type(arg)}" - ) - if isinstance(arg, MultiDictProxy): - self._md = arg._md - else: - self._md = arg - - def __reduce__(self) -> NoReturn: - raise TypeError(f"can't pickle {self.__class__.__name__} objects") - - @overload - def getall(self, key: str) -> list[_V]: ... - @overload - def getall(self, key: str, default: _T) -> Union[list[_V], _T]: ... - def getall( - self, key: str, default: Union[_T, _SENTINEL] = sentinel - ) -> Union[list[_V], _T]: - """Return a list of all values matching the key.""" - if default is not sentinel: - return self._md.getall(key, default) - else: - return self._md.getall(key) - - @overload - def getone(self, key: str) -> _V: ... - @overload - def getone(self, key: str, default: _T) -> Union[_V, _T]: ... - def getone( - self, key: str, default: Union[_T, _SENTINEL] = sentinel - ) -> Union[_V, _T]: - """Get first value matching the key. - - Raises KeyError if the key is not found and no default is provided. - """ - if default is not sentinel: - return self._md.getone(key, default) - else: - return self._md.getone(key) - - # Mapping interface # - - def __getitem__(self, key: str) -> _V: - return self.getone(key) - - @overload - def get(self, key: str, /) -> Union[_V, None]: ... - @overload - def get(self, key: str, /, default: _T) -> Union[_V, _T]: ... - def get(self, key: str, default: Union[_T, None] = None) -> Union[_V, _T, None]: - """Get first value matching the key. - - If the key is not found, returns the default (or None if no default is provided) - """ - return self._md.getone(key, default) - - def __iter__(self) -> Iterator[str]: - return iter(self._md.keys()) - - def __len__(self) -> int: - return len(self._md) - - def keys(self) -> KeysView[str]: - """Return a new view of the dictionary's keys.""" - return self._md.keys() - - def items(self) -> ItemsView[str, _V]: - """Return a new view of the dictionary's items *(key, value) pairs).""" - return self._md.items() - - def values(self) -> _ValuesView[_V]: - """Return a new view of the dictionary's values.""" - return self._md.values() - - def __eq__(self, other: object) -> bool: - return self._md == other - - def __contains__(self, key: object) -> bool: - return key in self._md - - @reprlib.recursive_repr() - def __repr__(self) -> str: - body = ", ".join(f"'{k}': {v!r}" for k, v in self.items()) - return f"<{self.__class__.__name__}({body})>" - - def copy(self) -> MultiDict[_V]: - """Return a copy of itself.""" - return MultiDict(self._md) - - -class CIMultiDictProxy(_CIMixin, MultiDictProxy[_V]): - """Read-only proxy for CIMultiDict instance.""" - - def __init__(self, arg: Union[MultiDict[_V], MultiDictProxy[_V]]): - if not isinstance(arg, (CIMultiDict, CIMultiDictProxy)): - raise TypeError( - "ctor requires CIMultiDict or CIMultiDictProxy instance" - f", not {type(arg)}" - ) - - super().__init__(arg) - - def copy(self) -> CIMultiDict[_V]: - """Return a copy of itself.""" - return CIMultiDict(self._md) - - -def getversion(md: Union[MultiDict[object], MultiDictProxy[object]]) -> int: - if isinstance(md, MultiDictProxy): - md = md._md - elif not isinstance(md, MultiDict): - raise TypeError("Parameter should be multidict or proxy") - return md._version diff --git a/venv/lib/python3.12/site-packages/multidict/py.typed b/venv/lib/python3.12/site-packages/multidict/py.typed deleted file mode 100644 index dfe8cc0..0000000 --- a/venv/lib/python3.12/site-packages/multidict/py.typed +++ /dev/null @@ -1 +0,0 @@ -PEP-561 marker. \ No newline at end of file diff --git a/venv/lib/python3.12/site-packages/pip-24.0.dist-info/AUTHORS.txt b/venv/lib/python3.12/site-packages/pip-24.0.dist-info/AUTHORS.txt deleted file mode 100644 index 0e63548..0000000 --- a/venv/lib/python3.12/site-packages/pip-24.0.dist-info/AUTHORS.txt +++ /dev/null @@ -1,760 +0,0 @@ -@Switch01 -A_Rog -Aakanksha Agrawal -Abhinav Sagar -ABHYUDAY PRATAP SINGH -abs51295 -AceGentile -Adam Chainz -Adam Tse -Adam Wentz -admin -Adrien Morison -ahayrapetyan -Ahilya -AinsworthK -Akash Srivastava -Alan Yee -Albert Tugushev -Albert-Guan -albertg -Alberto Sottile -Aleks Bunin -Ales Erjavec -Alethea Flowers -Alex Gaynor -Alex Grönholm -Alex Hedges -Alex Loosley -Alex Morega -Alex Stachowiak -Alexander Shtyrov -Alexandre Conrad -Alexey Popravka -Aleš Erjavec -Alli -Ami Fischman -Ananya Maiti -Anatoly Techtonik -Anders Kaseorg -Andre Aguiar -Andreas Lutro -Andrei Geacar -Andrew Gaul -Andrew Shymanel -Andrey Bienkowski -Andrey Bulgakov -Andrés Delfino -Andy Freeland -Andy Kluger -Ani Hayrapetyan -Aniruddha Basak -Anish Tambe -Anrs Hu -Anthony Sottile -Antoine Musso -Anton Ovchinnikov -Anton Patrushev -Antonio Alvarado Hernandez -Antony Lee -Antti Kaihola -Anubhav Patel -Anudit Nagar -Anuj Godase -AQNOUCH Mohammed -AraHaan -Arindam Choudhury -Armin Ronacher -Artem -Arun Babu Neelicattu -Ashley Manton -Ashwin Ramaswami -atse -Atsushi Odagiri -Avinash Karhana -Avner Cohen -Awit (Ah-Wit) Ghirmai -Baptiste Mispelon -Barney Gale -barneygale -Bartek Ogryczak -Bastian Venthur -Ben Bodenmiller -Ben Darnell -Ben Hoyt -Ben Mares -Ben Rosser -Bence Nagy -Benjamin Peterson -Benjamin VanEvery -Benoit Pierre -Berker Peksag -Bernard -Bernard Tyers -Bernardo B. Marques -Bernhard M. Wiedemann -Bertil Hatt -Bhavam Vidyarthi -Blazej Michalik -Bogdan Opanchuk -BorisZZZ -Brad Erickson -Bradley Ayers -Brandon L. Reiss -Brandt Bucher -Brett Randall -Brett Rosen -Brian Cristante -Brian Rosner -briantracy -BrownTruck -Bruno Oliveira -Bruno Renié -Bruno S -Bstrdsmkr -Buck Golemon -burrows -Bussonnier Matthias -bwoodsend -c22 -Caleb Martinez -Calvin Smith -Carl Meyer -Carlos Liam -Carol Willing -Carter Thayer -Cass -Chandrasekhar Atina -Chih-Hsuan Yen -Chris Brinker -Chris Hunt -Chris Jerdonek -Chris Kuehl -Chris McDonough -Chris Pawley -Chris Pryer -Chris Wolfe -Christian Clauss -Christian Heimes -Christian Oudard -Christoph Reiter -Christopher Hunt -Christopher Snyder -cjc7373 -Clark Boylan -Claudio Jolowicz -Clay McClure -Cody -Cody Soyland -Colin Watson -Collin Anderson -Connor Osborn -Cooper Lees -Cooper Ry Lees -Cory Benfield -Cory Wright -Craig Kerstiens -Cristian Sorinel -Cristina -Cristina Muñoz -Curtis Doty -cytolentino -Daan De Meyer -Dale -Damian -Damian Quiroga -Damian Shaw -Dan Black -Dan Savilonis -Dan Sully -Dane Hillard -daniel -Daniel Collins -Daniel Hahler -Daniel Holth -Daniel Jost -Daniel Katz -Daniel Shaulov -Daniele Esposti -Daniele Nicolodi -Daniele Procida -Daniil Konovalenko -Danny Hermes -Danny McClanahan -Darren Kavanagh -Dav Clark -Dave Abrahams -Dave Jones -David Aguilar -David Black -David Bordeynik -David Caro -David D Lowe -David Evans -David Hewitt -David Linke -David Poggi -David Pursehouse -David Runge -David Tucker -David Wales -Davidovich -ddelange -Deepak Sharma -Deepyaman Datta -Denise Yu -dependabot[bot] -derwolfe -Desetude -Devesh Kumar Singh -Diego Caraballo -Diego Ramirez -DiegoCaraballo -Dimitri Merejkowsky -Dimitri Papadopoulos -Dirk Stolle -Dmitry Gladkov -Dmitry Volodin -Domen Kožar -Dominic Davis-Foster -Donald Stufft -Dongweiming -doron zarhi -Dos Moonen -Douglas Thor -DrFeathers -Dustin Ingram -Dwayne Bailey -Ed Morley -Edgar Ramírez -Edgar Ramírez Mondragón -Ee Durbin -Efflam Lemaillet -efflamlemaillet -Eitan Adler -ekristina -elainechan -Eli Schwartz -Elisha Hollander -Ellen Marie Dash -Emil Burzo -Emil Styrke -Emmanuel Arias -Endoh Takanao -enoch -Erdinc Mutlu -Eric Cousineau -Eric Gillingham -Eric Hanchrow -Eric Hopper -Erik M. Bray -Erik Rose -Erwin Janssen -Eugene Vereshchagin -everdimension -Federico -Felipe Peter -Felix Yan -fiber-space -Filip Kokosiński -Filipe Laíns -Finn Womack -finnagin -Flavio Amurrio -Florian Briand -Florian Rathgeber -Francesco -Francesco Montesano -Frost Ming -Gabriel Curio -Gabriel de Perthuis -Garry Polley -gavin -gdanielson -Geoffrey Sneddon -George Song -Georgi Valkov -Georgy Pchelkin -ghost -Giftlin Rajaiah -gizmoguy1 -gkdoc -Godefroid Chapelle -Gopinath M -GOTO Hayato -gousaiyang -gpiks -Greg Roodt -Greg Ward -Guilherme Espada -Guillaume Seguin -gutsytechster -Guy Rozendorn -Guy Tuval -gzpan123 -Hanjun Kim -Hari Charan -Harsh Vardhan -harupy -Harutaka Kawamura -hauntsaninja -Henrich Hartzer -Henry Schreiner -Herbert Pfennig -Holly Stotelmyer -Honnix -Hsiaoming Yang -Hugo Lopes Tavares -Hugo van Kemenade -Hugues Bruant -Hynek Schlawack -Ian Bicking -Ian Cordasco -Ian Lee -Ian Stapleton Cordasco -Ian Wienand -Igor Kuzmitshov -Igor Sobreira -Ilan Schnell -Illia Volochii -Ilya Baryshev -Inada Naoki -Ionel Cristian Mărieș -Ionel Maries Cristian -Itamar Turner-Trauring -Ivan Pozdeev -J. Nick Koston -Jacob Kim -Jacob Walls -Jaime Sanz -jakirkham -Jakub Kuczys -Jakub Stasiak -Jakub Vysoky -Jakub Wilk -James Cleveland -James Curtin -James Firth -James Gerity -James Polley -Jan Pokorný -Jannis Leidel -Jarek Potiuk -jarondl -Jason Curtis -Jason R. Coombs -JasonMo -JasonMo1 -Jay Graves -Jean Abou Samra -Jean-Christophe Fillion-Robin -Jeff Barber -Jeff Dairiki -Jeff Widman -Jelmer Vernooij -jenix21 -Jeremy Stanley -Jeremy Zafran -Jesse Rittner -Jiashuo Li -Jim Fisher -Jim Garrison -Jiun Bae -Jivan Amara -Joe Bylund -Joe Michelini -John Paton -John T. Wodder II -John-Scott Atlakson -johnthagen -Jon Banafato -Jon Dufresne -Jon Parise -Jonas Nockert -Jonathan Herbert -Joonatan Partanen -Joost Molenaar -Jorge Niedbalski -Joseph Bylund -Joseph Long -Josh Bronson -Josh Hansen -Josh Schneier -Joshua -Juan Luis Cano Rodríguez -Juanjo Bazán -Judah Rand -Julian Berman -Julian Gethmann -Julien Demoor -Jussi Kukkonen -jwg4 -Jyrki Pulliainen -Kai Chen -Kai Mueller -Kamal Bin Mustafa -kasium -kaustav haldar -keanemind -Keith Maxwell -Kelsey Hightower -Kenneth Belitzky -Kenneth Reitz -Kevin Burke -Kevin Carter -Kevin Frommelt -Kevin R Patterson -Kexuan Sun -Kit Randel -Klaas van Schelven -KOLANICH -kpinc -Krishna Oza -Kumar McMillan -Kurt McKee -Kyle Persohn -lakshmanaram -Laszlo Kiss-Kollar -Laurent Bristiel -Laurent LAPORTE -Laurie O -Laurie Opperman -layday -Leon Sasson -Lev Givon -Lincoln de Sousa -Lipis -lorddavidiii -Loren Carvalho -Lucas Cimon -Ludovic Gasc -Lukas Geiger -Lukas Juhrich -Luke Macken -Luo Jiebin -luojiebin -luz.paz -László Kiss Kollár -M00nL1ght -Marc Abramowitz -Marc Tamlyn -Marcus Smith -Mariatta -Mark Kohler -Mark Williams -Markus Hametner -Martey Dodoo -Martin Fischer -Martin Häcker -Martin Pavlasek -Masaki -Masklinn -Matej Stuchlik -Mathew Jennings -Mathieu Bridon -Mathieu Kniewallner -Matt Bacchi -Matt Good -Matt Maker -Matt Robenolt -matthew -Matthew Einhorn -Matthew Feickert -Matthew Gilliard -Matthew Iversen -Matthew Treinish -Matthew Trumbell -Matthew Willson -Matthias Bussonnier -mattip -Maurits van Rees -Max W Chase -Maxim Kurnikov -Maxime Rouyrre -mayeut -mbaluna -mdebi -memoselyk -meowmeowcat -Michael -Michael Aquilina -Michael E. Karpeles -Michael Klich -Michael Mintz -Michael Williamson -michaelpacer -Michał Górny -Mickaël Schoentgen -Miguel Araujo Perez -Mihir Singh -Mike -Mike Hendricks -Min RK -MinRK -Miro Hrončok -Monica Baluna -montefra -Monty Taylor -Muha Ajjan‮ -Nadav Wexler -Nahuel Ambrosini -Nate Coraor -Nate Prewitt -Nathan Houghton -Nathaniel J. Smith -Nehal J Wani -Neil Botelho -Nguyễn Gia Phong -Nicholas Serra -Nick Coghlan -Nick Stenning -Nick Timkovich -Nicolas Bock -Nicole Harris -Nikhil Benesch -Nikhil Ladha -Nikita Chepanov -Nikolay Korolev -Nipunn Koorapati -Nitesh Sharma -Niyas Sait -Noah -Noah Gorny -Nowell Strite -NtaleGrey -nvdv -OBITORASU -Ofek Lev -ofrinevo -Oliver Freund -Oliver Jeeves -Oliver Mannion -Oliver Tonnhofer -Olivier Girardot -Olivier Grisel -Ollie Rutherfurd -OMOTO Kenji -Omry Yadan -onlinejudge95 -Oren Held -Oscar Benjamin -Oz N Tiram -Pachwenko -Patrick Dubroy -Patrick Jenkins -Patrick Lawson -patricktokeeffe -Patrik Kopkan -Paul Ganssle -Paul Kehrer -Paul Moore -Paul Nasrat -Paul Oswald -Paul van der Linden -Paulus Schoutsen -Pavel Safronov -Pavithra Eswaramoorthy -Pawel Jasinski -Paweł Szramowski -Pekka Klärck -Peter Gessler -Peter Lisák -Peter Waller -petr-tik -Phaneendra Chiruvella -Phil Elson -Phil Freo -Phil Pennock -Phil Whelan -Philip Jägenstedt -Philip Molloy -Philippe Ombredanne -Pi Delport -Pierre-Yves Rofes -Pieter Degroote -pip -Prabakaran Kumaresshan -Prabhjyotsing Surjit Singh Sodhi -Prabhu Marappan -Pradyun Gedam -Prashant Sharma -Pratik Mallya -pre-commit-ci[bot] -Preet Thakkar -Preston Holmes -Przemek Wrzos -Pulkit Goyal -q0w -Qiangning Hong -Qiming Xu -Quentin Lee -Quentin Pradet -R. David Murray -Rafael Caricio -Ralf Schmitt -Razzi Abuissa -rdb -Reece Dunham -Remi Rampin -Rene Dudfield -Riccardo Magliocchetti -Riccardo Schirone -Richard Jones -Richard Si -Ricky Ng-Adam -Rishi -RobberPhex -Robert Collins -Robert McGibbon -Robert Pollak -Robert T. McGibbon -robin elisha robinson -Roey Berman -Rohan Jain -Roman Bogorodskiy -Roman Donchenko -Romuald Brunet -ronaudinho -Ronny Pfannschmidt -Rory McCann -Ross Brattain -Roy Wellington Ⅳ -Ruairidh MacLeod -Russell Keith-Magee -Ryan Shepherd -Ryan Wooden -ryneeverett -Sachi King -Salvatore Rinchiera -sandeepkiran-js -Sander Van Balen -Savio Jomton -schlamar -Scott Kitterman -Sean -seanj -Sebastian Jordan -Sebastian Schaetz -Segev Finer -SeongSoo Cho -Sergey Vasilyev -Seth Michael Larson -Seth Woodworth -Shahar Epstein -Shantanu -shireenrao -Shivansh-007 -Shlomi Fish -Shovan Maity -Simeon Visser -Simon Cross -Simon Pichugin -sinoroc -sinscary -snook92 -socketubs -Sorin Sbarnea -Srinivas Nyayapati -Stavros Korokithakis -Stefan Scherfke -Stefano Rivera -Stephan Erb -Stephen Rosen -stepshal -Steve (Gadget) Barnes -Steve Barnes -Steve Dower -Steve Kowalik -Steven Myint -Steven Silvester -stonebig -studioj -Stéphane Bidoul -Stéphane Bidoul (ACSONE) -Stéphane Klein -Sumana Harihareswara -Surbhi Sharma -Sviatoslav Sydorenko -Swat009 -Sylvain -Takayuki SHIMIZUKAWA -Taneli Hukkinen -tbeswick -Thiago -Thijs Triemstra -Thomas Fenzl -Thomas Grainger -Thomas Guettler -Thomas Johansson -Thomas Kluyver -Thomas Smith -Thomas VINCENT -Tim D. Smith -Tim Gates -Tim Harder -Tim Heap -tim smith -tinruufu -Tobias Hermann -Tom Forbes -Tom Freudenheim -Tom V -Tomas Hrnciar -Tomas Orsava -Tomer Chachamu -Tommi Enenkel | AnB -Tomáš Hrnčiar -Tony Beswick -Tony Narlock -Tony Zhaocheng Tan -TonyBeswick -toonarmycaptain -Toshio Kuratomi -toxinu -Travis Swicegood -Tushar Sadhwani -Tzu-ping Chung -Valentin Haenel -Victor Stinner -victorvpaulo -Vikram - Google -Viktor Szépe -Ville Skyttä -Vinay Sajip -Vincent Philippon -Vinicyus Macedo -Vipul Kumar -Vitaly Babiy -Vladimir Fokow -Vladimir Rutsky -W. Trevor King -Wil Tan -Wilfred Hughes -William Edwards -William ML Leslie -William T Olson -William Woodruff -Wilson Mo -wim glenn -Winson Luk -Wolfgang Maier -Wu Zhenyu -XAMES3 -Xavier Fernandez -xoviat -xtreak -YAMAMOTO Takashi -Yen Chi Hsuan -Yeray Diaz Diaz -Yoval P -Yu Jian -Yuan Jing Vincent Yan -Yusuke Hayashi -Zearin -Zhiping Deng -ziebam -Zvezdan Petkovic -Łukasz Langa -Роман Донченко -Семён Марьясин -‮rekcäH nitraM‮ diff --git a/venv/lib/python3.12/site-packages/pip-24.0.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/pip-24.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.12/site-packages/pip-24.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/pip-24.0.dist-info/LICENSE.txt b/venv/lib/python3.12/site-packages/pip-24.0.dist-info/LICENSE.txt deleted file mode 100644 index 8e7b65e..0000000 --- a/venv/lib/python3.12/site-packages/pip-24.0.dist-info/LICENSE.txt +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2008-present The pip developers (see AUTHORS.txt file) - -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.12/site-packages/pip-24.0.dist-info/METADATA b/venv/lib/python3.12/site-packages/pip-24.0.dist-info/METADATA deleted file mode 100644 index e5b45bd..0000000 --- a/venv/lib/python3.12/site-packages/pip-24.0.dist-info/METADATA +++ /dev/null @@ -1,88 +0,0 @@ -Metadata-Version: 2.1 -Name: pip -Version: 24.0 -Summary: The PyPA recommended tool for installing Python packages. -Author-email: The pip developers <distutils-sig@python.org> -License: MIT -Project-URL: Homepage, https://pip.pypa.io/ -Project-URL: Documentation, https://pip.pypa.io -Project-URL: Source, https://github.com/pypa/pip -Project-URL: Changelog, https://pip.pypa.io/en/stable/news/ -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Topic :: Software Development :: Build Tools -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.7 -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 :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Requires-Python: >=3.7 -Description-Content-Type: text/x-rst -License-File: LICENSE.txt -License-File: AUTHORS.txt - -pip - The Python Package Installer -================================== - -.. image:: https://img.shields.io/pypi/v/pip.svg - :target: https://pypi.org/project/pip/ - :alt: PyPI - -.. image:: https://img.shields.io/pypi/pyversions/pip - :target: https://pypi.org/project/pip - :alt: PyPI - Python Version - -.. image:: https://readthedocs.org/projects/pip/badge/?version=latest - :target: https://pip.pypa.io/en/latest - :alt: Documentation - -pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes. - -Please take a look at our documentation for how to install and use pip: - -* `Installation`_ -* `Usage`_ - -We release updates regularly, with a new version every 3 months. Find more details in our documentation: - -* `Release notes`_ -* `Release process`_ - -If you find bugs, need help, or want to talk to the developers, please use our mailing lists or chat rooms: - -* `Issue tracking`_ -* `Discourse channel`_ -* `User IRC`_ - -If you want to get involved head over to GitHub to get the source code, look at our development documentation and feel free to jump on the developer mailing lists and chat rooms: - -* `GitHub page`_ -* `Development documentation`_ -* `Development IRC`_ - -Code of Conduct ---------------- - -Everyone interacting in the pip project's codebases, issue trackers, chat -rooms, and mailing lists is expected to follow the `PSF Code of Conduct`_. - -.. _package installer: https://packaging.python.org/guides/tool-recommendations/ -.. _Python Package Index: https://pypi.org -.. _Installation: https://pip.pypa.io/en/stable/installation/ -.. _Usage: https://pip.pypa.io/en/stable/ -.. _Release notes: https://pip.pypa.io/en/stable/news.html -.. _Release process: https://pip.pypa.io/en/latest/development/release-process/ -.. _GitHub page: https://github.com/pypa/pip -.. _Development documentation: https://pip.pypa.io/en/latest/development -.. _Issue tracking: https://github.com/pypa/pip/issues -.. _Discourse channel: https://discuss.python.org/c/packaging -.. _User IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa -.. _Development IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa-dev -.. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md diff --git a/venv/lib/python3.12/site-packages/pip-24.0.dist-info/RECORD b/venv/lib/python3.12/site-packages/pip-24.0.dist-info/RECORD deleted file mode 100644 index 39ffae4..0000000 --- a/venv/lib/python3.12/site-packages/pip-24.0.dist-info/RECORD +++ /dev/null @@ -1,1005 +0,0 @@ -../../../bin/pip,sha256=M1IZo_dAKleSX1vMLVTWP24xqoaIX_vGAQYi8JJ87B8,271 -../../../bin/pip3,sha256=M1IZo_dAKleSX1vMLVTWP24xqoaIX_vGAQYi8JJ87B8,271 -../../../bin/pip3.12,sha256=M1IZo_dAKleSX1vMLVTWP24xqoaIX_vGAQYi8JJ87B8,271 -pip-24.0.dist-info/AUTHORS.txt,sha256=SwXm4nkwRkmtnO1ZY-dLy7EPeoQNXMNLby5CN3GlNhY,10388 -pip-24.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pip-24.0.dist-info/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093 -pip-24.0.dist-info/METADATA,sha256=kNEfJ3_Vho2mee4lfJdlbd5RHIqsfQJSMUB-bOkIOeI,3581 -pip-24.0.dist-info/RECORD,, -pip-24.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip-24.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92 -pip-24.0.dist-info/entry_points.txt,sha256=Fa_c0b-xGFaYxagIruvpJD6qqXmNTA02vAVIkmMj-9o,125 -pip-24.0.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pip/__init__.py,sha256=oAk1nFpLmUVS5Ln7NxvNoGUn5Vkn6FGQjPaNDf8Q8pk,355 -pip/__main__.py,sha256=WzbhHXTbSE6gBY19mNN9m4s5o_365LOvTYSgqgbdBhE,854 -pip/__pip-runner__.py,sha256=EnrfKmKMzWAdqg_JicLCOP9Y95Ux7zHh4ObvqLtQcjo,1444 -pip/__pycache__/__init__.cpython-312.pyc,, -pip/__pycache__/__main__.cpython-312.pyc,, -pip/__pycache__/__pip-runner__.cpython-312.pyc,, -pip/_internal/__init__.py,sha256=iqZ5-YQsQV08tkUc7L806Reop6tguLFWf70ySF6be0Y,515 -pip/_internal/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/__pycache__/build_env.cpython-312.pyc,, -pip/_internal/__pycache__/cache.cpython-312.pyc,, -pip/_internal/__pycache__/configuration.cpython-312.pyc,, -pip/_internal/__pycache__/exceptions.cpython-312.pyc,, -pip/_internal/__pycache__/main.cpython-312.pyc,, -pip/_internal/__pycache__/pyproject.cpython-312.pyc,, -pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc,, -pip/_internal/__pycache__/wheel_builder.cpython-312.pyc,, -pip/_internal/build_env.py,sha256=1ESpqw0iupS_K7phZK5zshVE5Czy9BtGLFU4W6Enva8,10243 -pip/_internal/cache.py,sha256=uiYD-9F0Bv1C8ZyWE85lpzDmQf7hcUkgL99GmI8I41Q,10370 -pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132 -pip/_internal/cli/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc,, -pip/_internal/cli/__pycache__/base_command.cpython-312.pyc,, -pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc,, -pip/_internal/cli/__pycache__/command_context.cpython-312.pyc,, -pip/_internal/cli/__pycache__/main.cpython-312.pyc,, -pip/_internal/cli/__pycache__/main_parser.cpython-312.pyc,, -pip/_internal/cli/__pycache__/parser.cpython-312.pyc,, -pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc,, -pip/_internal/cli/__pycache__/req_command.cpython-312.pyc,, -pip/_internal/cli/__pycache__/spinners.cpython-312.pyc,, -pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc,, -pip/_internal/cli/autocompletion.py,sha256=_br_5NgSxSuvPjMF0MLHzS5s6BpSkQAQHKrLK89VauM,6690 -pip/_internal/cli/base_command.py,sha256=iuVWGa2oTq7gBReo0er3Z0tXJ2oqBIC6QjDHcnDhKXY,8733 -pip/_internal/cli/cmdoptions.py,sha256=V8ggG6AtHpHKkH_6tRU0mhJaZTeqtrFpu75ghvMXXJk,30063 -pip/_internal/cli/command_context.py,sha256=RHgIPwtObh5KhMrd3YZTkl8zbVG-6Okml7YbFX4Ehg0,774 -pip/_internal/cli/main.py,sha256=Uzxt_YD1hIvB1AW5mxt6IVcht5G712AtMqdo51UMhmQ,2816 -pip/_internal/cli/main_parser.py,sha256=laDpsuBDl6kyfywp9eMMA9s84jfH2TJJn-vmL0GG90w,4338 -pip/_internal/cli/parser.py,sha256=KW6C3-7-4ErTNB0TfLTKwOdHcd-qefCeGnrOoE2r0RQ,10781 -pip/_internal/cli/progress_bars.py,sha256=So4mPoSjXkXiSHiTzzquH3VVyVD_njXlHJSExYPXAow,1968 -pip/_internal/cli/req_command.py,sha256=c7_XHABnXmD3_qlK9-r37KqdKBAcgmVKvQ2WcTrNLfc,18369 -pip/_internal/cli/spinners.py,sha256=hIJ83GerdFgFCdobIA23Jggetegl_uC4Sp586nzFbPE,5118 -pip/_internal/cli/status_codes.py,sha256=sEFHUaUJbqv8iArL3HAtcztWZmGOFX01hTesSytDEh0,116 -pip/_internal/commands/__init__.py,sha256=5oRO9O3dM2vGuh0bFw4HOVletryrz5HHMmmPWwJrH9U,3882 -pip/_internal/commands/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/commands/__pycache__/cache.cpython-312.pyc,, -pip/_internal/commands/__pycache__/check.cpython-312.pyc,, -pip/_internal/commands/__pycache__/completion.cpython-312.pyc,, -pip/_internal/commands/__pycache__/configuration.cpython-312.pyc,, -pip/_internal/commands/__pycache__/debug.cpython-312.pyc,, -pip/_internal/commands/__pycache__/download.cpython-312.pyc,, -pip/_internal/commands/__pycache__/freeze.cpython-312.pyc,, -pip/_internal/commands/__pycache__/hash.cpython-312.pyc,, -pip/_internal/commands/__pycache__/help.cpython-312.pyc,, -pip/_internal/commands/__pycache__/index.cpython-312.pyc,, -pip/_internal/commands/__pycache__/inspect.cpython-312.pyc,, -pip/_internal/commands/__pycache__/install.cpython-312.pyc,, -pip/_internal/commands/__pycache__/list.cpython-312.pyc,, -pip/_internal/commands/__pycache__/search.cpython-312.pyc,, -pip/_internal/commands/__pycache__/show.cpython-312.pyc,, -pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc,, -pip/_internal/commands/__pycache__/wheel.cpython-312.pyc,, -pip/_internal/commands/cache.py,sha256=xg76_ZFEBC6zoQ3gXLRfMZJft4z2a0RwH4GEFZC6nnU,7944 -pip/_internal/commands/check.py,sha256=Rb13Q28yoLh0j1gpx5SU0jlResNct21eQCRsnaO9xKA,1782 -pip/_internal/commands/completion.py,sha256=HT4lD0bgsflHq2IDgYfiEdp7IGGtE7s6MgI3xn0VQEw,4287 -pip/_internal/commands/configuration.py,sha256=n98enwp6y0b5G6fiRQjaZo43FlJKYve_daMhN-4BRNc,9766 -pip/_internal/commands/debug.py,sha256=63972uUCeMIGOdMMVeIUGrOjTOqTVWplFC82a-hcKyA,6777 -pip/_internal/commands/download.py,sha256=e4hw088zGo26WmJaMIRvCniLlLmoOjqolGyfHjsCkCQ,5335 -pip/_internal/commands/freeze.py,sha256=qrIHS_-c6JPrQ92hMhAv9kkl0bHgFpRLwYJDdbcYr1o,3243 -pip/_internal/commands/hash.py,sha256=EVVOuvGtoPEdFi8SNnmdqlCQrhCxV-kJsdwtdcCnXGQ,1703 -pip/_internal/commands/help.py,sha256=gcc6QDkcgHMOuAn5UxaZwAStsRBrnGSn_yxjS57JIoM,1132 -pip/_internal/commands/index.py,sha256=CNXQer_PeZKSJooURcCFCBEKGfwyNoUWYP_MWczAcOM,4775 -pip/_internal/commands/inspect.py,sha256=2wSPt9yfr3r6g-s2S5L6PvRtaHNVyb4TuodMStJ39cw,3188 -pip/_internal/commands/install.py,sha256=VxDd-BD3a27ApeE2OK34rfBXS6Zo2wtemK9-HCwPqxM,28782 -pip/_internal/commands/list.py,sha256=-QbpPuGDiGN1SdThsk2ml8beBnepliefbGhMAN8tkzU,12547 -pip/_internal/commands/search.py,sha256=sbBZiARRc050QquOKcCvOr2K3XLsoYebLKZGRi__iUI,5697 -pip/_internal/commands/show.py,sha256=t5jia4zcYJRJZy4U_Von7zMl03hJmmcofj6oDNTnj7Y,6419 -pip/_internal/commands/uninstall.py,sha256=OIqO9tqadY8kM4HwhFf1Q62fUIp7v8KDrTRo8yWMz7Y,3886 -pip/_internal/commands/wheel.py,sha256=CSnX8Pmf1oPCnd7j7bn1_f58G9KHNiAblvVJ5zykN-A,6476 -pip/_internal/configuration.py,sha256=XkAiBS0hpzsM-LF0Qu5hvPWO_Bs67-oQKRYFBuMbESs,14006 -pip/_internal/distributions/__init__.py,sha256=Hq6kt6gXBgjNit5hTTWLAzeCNOKoB-N0pGYSqehrli8,858 -pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/distributions/__pycache__/base.cpython-312.pyc,, -pip/_internal/distributions/__pycache__/installed.cpython-312.pyc,, -pip/_internal/distributions/__pycache__/sdist.cpython-312.pyc,, -pip/_internal/distributions/__pycache__/wheel.cpython-312.pyc,, -pip/_internal/distributions/base.py,sha256=oRSEvnv2ZjBnargamnv2fcJa1n6gUDKaW0g6CWSEpWs,1743 -pip/_internal/distributions/installed.py,sha256=QinHFbWAQ8oE0pbD8MFZWkwlnfU1QYTccA1vnhrlYOU,842 -pip/_internal/distributions/sdist.py,sha256=4K3V0VNMllHbBzCJibjwd_tylUKpmIdu2AQyhplvCQo,6709 -pip/_internal/distributions/wheel.py,sha256=-ma3sOtUQj0AxXCEb6_Fhmjl3nh4k3A0HC2taAb2N-4,1277 -pip/_internal/exceptions.py,sha256=TmF1iNFEneSWaemwlg6a5bpPuq2cMHK7d1-SvjsQHb0,23634 -pip/_internal/index/__init__.py,sha256=vpt-JeTZefh8a-FC22ZeBSXFVbuBcXSGiILhQZJaNpQ,30 -pip/_internal/index/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/index/__pycache__/collector.cpython-312.pyc,, -pip/_internal/index/__pycache__/package_finder.cpython-312.pyc,, -pip/_internal/index/__pycache__/sources.cpython-312.pyc,, -pip/_internal/index/collector.py,sha256=sH0tL_cOoCk6pLLfCSGVjFM4rPEJtllF-VobvAvLSH4,16590 -pip/_internal/index/package_finder.py,sha256=S_nC8gzVIMY6ikWfKoSOzRtoesUqnfNhAPl_BwSOusA,37843 -pip/_internal/index/sources.py,sha256=dJegiR9f86kslaAHcv9-R5L_XBf5Rzm_FkyPteDuPxI,8688 -pip/_internal/locations/__init__.py,sha256=Dh8LJWG8LRlDK4JIj9sfRF96TREzE--N_AIlx7Tqoe4,15365 -pip/_internal/locations/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc,, -pip/_internal/locations/__pycache__/_sysconfig.cpython-312.pyc,, -pip/_internal/locations/__pycache__/base.cpython-312.pyc,, -pip/_internal/locations/_distutils.py,sha256=H9ZHK_35rdDV1Qsmi4QeaBULjFT4Mbu6QuoVGkJ6QHI,6009 -pip/_internal/locations/_sysconfig.py,sha256=jyNVtUfMIf0mtyY-Xp1m9yQ8iwECozSVVFmjkN9a2yw,7680 -pip/_internal/locations/base.py,sha256=RQiPi1d4FVM2Bxk04dQhXZ2PqkeljEL2fZZ9SYqIQ78,2556 -pip/_internal/main.py,sha256=r-UnUe8HLo5XFJz8inTcOOTiu_sxNhgHb6VwlGUllOI,340 -pip/_internal/metadata/__init__.py,sha256=9pU3W3s-6HtjFuYhWcLTYVmSaziklPv7k2x8p7X1GmA,4339 -pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/metadata/__pycache__/_json.cpython-312.pyc,, -pip/_internal/metadata/__pycache__/base.cpython-312.pyc,, -pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc,, -pip/_internal/metadata/_json.py,sha256=Rz5M5ciSNvITwaTQR6NfN8TgKgM5WfTws4D6CFknovE,2627 -pip/_internal/metadata/base.py,sha256=l3Wgku4xlgr8s4p6fS-3qQ4QKOpPbWLRwi5d9omEFG4,25907 -pip/_internal/metadata/importlib/__init__.py,sha256=jUUidoxnHcfITHHaAWG1G2i5fdBYklv_uJcjo2x7VYE,135 -pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/metadata/importlib/__pycache__/_compat.cpython-312.pyc,, -pip/_internal/metadata/importlib/__pycache__/_dists.cpython-312.pyc,, -pip/_internal/metadata/importlib/__pycache__/_envs.cpython-312.pyc,, -pip/_internal/metadata/importlib/_compat.py,sha256=GAe_prIfCE4iUylrnr_2dJRlkkBVRUbOidEoID7LPoE,1882 -pip/_internal/metadata/importlib/_dists.py,sha256=UPl1wUujFqiwiltRJ1tMF42WRINO1sSpNNlYQ2mX0mk,8297 -pip/_internal/metadata/importlib/_envs.py,sha256=XTaFIYERP2JF0QUZuPx2ETiugXbPEcZ8q8ZKeht6Lpc,7456 -pip/_internal/metadata/pkg_resources.py,sha256=opjw4IBSqHvie6sXJ_cbT42meygoPEUfNURJuWZY7sk,10035 -pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63 -pip/_internal/models/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/models/__pycache__/candidate.cpython-312.pyc,, -pip/_internal/models/__pycache__/direct_url.cpython-312.pyc,, -pip/_internal/models/__pycache__/format_control.cpython-312.pyc,, -pip/_internal/models/__pycache__/index.cpython-312.pyc,, -pip/_internal/models/__pycache__/installation_report.cpython-312.pyc,, -pip/_internal/models/__pycache__/link.cpython-312.pyc,, -pip/_internal/models/__pycache__/scheme.cpython-312.pyc,, -pip/_internal/models/__pycache__/search_scope.cpython-312.pyc,, -pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc,, -pip/_internal/models/__pycache__/target_python.cpython-312.pyc,, -pip/_internal/models/__pycache__/wheel.cpython-312.pyc,, -pip/_internal/models/candidate.py,sha256=hEPu8VdGE5qVASv6vLz-R-Rgh5-7LMbai1jgthMCd8M,931 -pip/_internal/models/direct_url.py,sha256=FwouYBKcqckh7B-k2H3HVgRhhFTukFwqiS3kfvtFLSk,6889 -pip/_internal/models/format_control.py,sha256=wtsQqSK9HaUiNxQEuB-C62eVimw6G4_VQFxV9-_KDBE,2486 -pip/_internal/models/index.py,sha256=tYnL8oxGi4aSNWur0mG8DAP7rC6yuha_MwJO8xw0crI,1030 -pip/_internal/models/installation_report.py,sha256=zRVZoaz-2vsrezj_H3hLOhMZCK9c7TbzWgC-jOalD00,2818 -pip/_internal/models/link.py,sha256=XirOAGv1jgMu7vu87kuPbohGj7VHpwVrd2q3KUgVQNg,20777 -pip/_internal/models/scheme.py,sha256=3EFQp_ICu_shH1-TBqhl0QAusKCPDFOlgHFeN4XowWs,738 -pip/_internal/models/search_scope.py,sha256=ASVyyZxiJILw7bTIVVpJx8J293M3Hk5F33ilGn0e80c,4643 -pip/_internal/models/selection_prefs.py,sha256=KZdi66gsR-_RUXUr9uejssk3rmTHrQVJWeNA2sV-VSY,1907 -pip/_internal/models/target_python.py,sha256=34EkorrMuRvRp-bjqHKJ-bOO71m9xdjN2b8WWFEC2HU,4272 -pip/_internal/models/wheel.py,sha256=YqazoIZyma_Q1ejFa1C7NHKQRRWlvWkdK96VRKmDBeI,3600 -pip/_internal/network/__init__.py,sha256=jf6Tt5nV_7zkARBrKojIXItgejvoegVJVKUbhAa5Ioc,50 -pip/_internal/network/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/network/__pycache__/auth.cpython-312.pyc,, -pip/_internal/network/__pycache__/cache.cpython-312.pyc,, -pip/_internal/network/__pycache__/download.cpython-312.pyc,, -pip/_internal/network/__pycache__/lazy_wheel.cpython-312.pyc,, -pip/_internal/network/__pycache__/session.cpython-312.pyc,, -pip/_internal/network/__pycache__/utils.cpython-312.pyc,, -pip/_internal/network/__pycache__/xmlrpc.cpython-312.pyc,, -pip/_internal/network/auth.py,sha256=TC-OcW2KU4W6R1hU4qPgQXvVH54adACpZz6sWq-R9NA,20541 -pip/_internal/network/cache.py,sha256=48A971qCzKNFvkb57uGEk7-0xaqPS0HWj2711QNTxkU,3935 -pip/_internal/network/download.py,sha256=i0Tn55CD5D7XYEFY3TxiYaCf0OaaTQ6SScNgCsSeV14,6086 -pip/_internal/network/lazy_wheel.py,sha256=2PXVduYZPCPZkkQFe1J1GbfHJWeCU--FXonGyIfw9eU,7638 -pip/_internal/network/session.py,sha256=9tqEDD8JiVaFdplOEXJxNo9cjRfBZ6RIa0yQQ_qBNiM,18698 -pip/_internal/network/utils.py,sha256=6A5SrUJEEUHxbGtbscwU2NpCyz-3ztiDlGWHpRRhsJ8,4073 -pip/_internal/network/xmlrpc.py,sha256=sAxzOacJ-N1NXGPvap9jC3zuYWSnnv3GXtgR2-E2APA,1838 -pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/operations/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/operations/__pycache__/check.cpython-312.pyc,, -pip/_internal/operations/__pycache__/freeze.cpython-312.pyc,, -pip/_internal/operations/__pycache__/prepare.cpython-312.pyc,, -pip/_internal/operations/build/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/operations/build/__pycache__/build_tracker.cpython-312.pyc,, -pip/_internal/operations/build/__pycache__/metadata.cpython-312.pyc,, -pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc,, -pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-312.pyc,, -pip/_internal/operations/build/__pycache__/wheel.cpython-312.pyc,, -pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc,, -pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-312.pyc,, -pip/_internal/operations/build/build_tracker.py,sha256=z-H5DOknZdBa3dh2Vq6VBMY5qLYIKmlj2p6CGZK5Lc8,4832 -pip/_internal/operations/build/metadata.py,sha256=9S0CUD8U3QqZeXp-Zyt8HxwU90lE4QrnYDgrqZDzBnc,1422 -pip/_internal/operations/build/metadata_editable.py,sha256=VLL7LvntKE8qxdhUdEJhcotFzUsOSI8NNS043xULKew,1474 -pip/_internal/operations/build/metadata_legacy.py,sha256=o-eU21As175hDC7dluM1fJJ_FqokTIShyWpjKaIpHZw,2198 -pip/_internal/operations/build/wheel.py,sha256=sT12FBLAxDC6wyrDorh8kvcZ1jG5qInCRWzzP-UkJiQ,1075 -pip/_internal/operations/build/wheel_editable.py,sha256=yOtoH6zpAkoKYEUtr8FhzrYnkNHQaQBjWQ2HYae1MQg,1417 -pip/_internal/operations/build/wheel_legacy.py,sha256=C9j6rukgQI1n_JeQLoZGuDdfUwzCXShyIdPTp6edbMQ,3064 -pip/_internal/operations/check.py,sha256=fsqA88iGaqftCr2tlP3sSU202CSkoODRtW0O-JU9M4Y,6806 -pip/_internal/operations/freeze.py,sha256=uqoeTAf6HOYVMR2UgAT8N85UZoGEVEoQdan_Ao6SOfk,9816 -pip/_internal/operations/install/__init__.py,sha256=mX7hyD2GNBO2mFGokDQ30r_GXv7Y_PLdtxcUv144e-s,51 -pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc,, -pip/_internal/operations/install/__pycache__/wheel.cpython-312.pyc,, -pip/_internal/operations/install/editable_legacy.py,sha256=YeR0KadWXw_ZheC1NtAG1qVIEkOgRGHc23x-YtGW7NU,1282 -pip/_internal/operations/install/wheel.py,sha256=9hGb1c4bRnPIb2FG7CtUSPfPxqprmHQBtwIAlWPNTtE,27311 -pip/_internal/operations/prepare.py,sha256=57Oq87HfunX3Rbqp47FdaJr9cHbAKUm_3gv7WhBAqbE,28128 -pip/_internal/pyproject.py,sha256=4Xszp11xgr126yzG6BbJA0oaQ9WXuhb0jyUb-y_6lPQ,7152 -pip/_internal/req/__init__.py,sha256=TELFgZOof3lhMmaICVWL9U7PlhXo9OufokbMAJ6J2GI,2738 -pip/_internal/req/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/req/__pycache__/constructors.cpython-312.pyc,, -pip/_internal/req/__pycache__/req_file.cpython-312.pyc,, -pip/_internal/req/__pycache__/req_install.cpython-312.pyc,, -pip/_internal/req/__pycache__/req_set.cpython-312.pyc,, -pip/_internal/req/__pycache__/req_uninstall.cpython-312.pyc,, -pip/_internal/req/constructors.py,sha256=8hlY56imEthLORRwmloyKz3YOyXymIaKsNB6P9ewvNI,19018 -pip/_internal/req/req_file.py,sha256=M8ttOZL-PwAj7scPElhW3ZD2hiD9mm_6FJAGIbwAzEI,17790 -pip/_internal/req/req_install.py,sha256=wtOPxkyRSM8comTks8oL1Gp2oyGqbH7JwIDRci2QiPk,35460 -pip/_internal/req/req_set.py,sha256=iMYDUToSgkxFyrP_OrTtPSgw4dwjRyGRDpGooTqeA4Y,4704 -pip/_internal/req/req_uninstall.py,sha256=nmvTQaRCC0iu-5Tw0djlXJhSj6WmqHRvT3qkkEdC35E,24551 -pip/_internal/resolution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/resolution/__pycache__/base.cpython-312.pyc,, -pip/_internal/resolution/base.py,sha256=qlmh325SBVfvG6Me9gc5Nsh5sdwHBwzHBq6aEXtKsLA,583 -pip/_internal/resolution/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc,, -pip/_internal/resolution/legacy/resolver.py,sha256=Xk24jQ62GvLr4Mc7IjN_qiO88qp0BImzVmPIFz9QLOE,24025 -pip/_internal/resolution/resolvelib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-312.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-312.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-312.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-312.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-312.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc,, -pip/_internal/resolution/resolvelib/base.py,sha256=jg5COmHLhmBIKOR-4spdJD3jyULYa1BdsqiBu2YJnJ4,5173 -pip/_internal/resolution/resolvelib/candidates.py,sha256=19Ki91Po-MSxBknGIfOGkaWkFdOznN0W_nKv7jL28L0,21052 -pip/_internal/resolution/resolvelib/factory.py,sha256=vqqk-hjchdhShwWVdeW2_A-5ZblLhE_nC_v3Mhz4Svc,32292 -pip/_internal/resolution/resolvelib/found_candidates.py,sha256=hvL3Hoa9VaYo-qEOZkBi2Iqw251UDxPz-uMHVaWmLpE,5705 -pip/_internal/resolution/resolvelib/provider.py,sha256=4t23ivjruqM6hKBX1KpGiTt-M4HGhRcZnGLV0c01K7U,9824 -pip/_internal/resolution/resolvelib/reporter.py,sha256=YFm9hQvz4DFCbjZeFTQ56hTz3Ac-mDBnHkeNRVvMHLY,3100 -pip/_internal/resolution/resolvelib/requirements.py,sha256=-kJONP0WjDfdTvBAs2vUXPgAnOyNIBEAXY4b72ogtPE,5696 -pip/_internal/resolution/resolvelib/resolver.py,sha256=nLJOsVMEVi2gQUVJoUFKMZAeu2f7GRMjGMvNSWyz0Bc,12592 -pip/_internal/self_outdated_check.py,sha256=saxQLB8UzIFtMScquytG10TOTsYVFJQ_mkW1NY-46wE,8378 -pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/utils/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc,, -pip/_internal/utils/__pycache__/_log.cpython-312.pyc,, -pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc,, -pip/_internal/utils/__pycache__/compat.cpython-312.pyc,, -pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc,, -pip/_internal/utils/__pycache__/datetime.cpython-312.pyc,, -pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc,, -pip/_internal/utils/__pycache__/direct_url_helpers.cpython-312.pyc,, -pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc,, -pip/_internal/utils/__pycache__/encoding.cpython-312.pyc,, -pip/_internal/utils/__pycache__/entrypoints.cpython-312.pyc,, -pip/_internal/utils/__pycache__/filesystem.cpython-312.pyc,, -pip/_internal/utils/__pycache__/filetypes.cpython-312.pyc,, -pip/_internal/utils/__pycache__/glibc.cpython-312.pyc,, -pip/_internal/utils/__pycache__/hashes.cpython-312.pyc,, -pip/_internal/utils/__pycache__/logging.cpython-312.pyc,, -pip/_internal/utils/__pycache__/misc.cpython-312.pyc,, -pip/_internal/utils/__pycache__/models.cpython-312.pyc,, -pip/_internal/utils/__pycache__/packaging.cpython-312.pyc,, -pip/_internal/utils/__pycache__/setuptools_build.cpython-312.pyc,, -pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc,, -pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc,, -pip/_internal/utils/__pycache__/unpacking.cpython-312.pyc,, -pip/_internal/utils/__pycache__/urls.cpython-312.pyc,, -pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc,, -pip/_internal/utils/__pycache__/wheel.cpython-312.pyc,, -pip/_internal/utils/_jaraco_text.py,sha256=yvDGelTVugRayPaOF2k4ab0Ky4d3uOkAfuOQjASjImY,3351 -pip/_internal/utils/_log.py,sha256=-jHLOE_THaZz5BFcCnoSL9EYAtJ0nXem49s9of4jvKw,1015 -pip/_internal/utils/appdirs.py,sha256=swgcTKOm3daLeXTW6v5BUS2Ti2RvEnGRQYH_yDXklAo,1665 -pip/_internal/utils/compat.py,sha256=ACyBfLgj3_XG-iA5omEDrXqDM0cQKzi8h8HRBInzG6Q,1884 -pip/_internal/utils/compatibility_tags.py,sha256=ydin8QG8BHqYRsPY4OL6cmb44CbqXl1T0xxS97VhHkk,5377 -pip/_internal/utils/datetime.py,sha256=m21Y3wAtQc-ji6Veb6k_M5g6A0ZyFI4egchTdnwh-pQ,242 -pip/_internal/utils/deprecation.py,sha256=NKo8VqLioJ4nnXXGmW4KdasxF90EFHkZaHeX1fT08C8,3627 -pip/_internal/utils/direct_url_helpers.py,sha256=6F1tc2rcKaCZmgfVwsE6ObIe_Pux23mUVYA-2D9wCFc,3206 -pip/_internal/utils/egg_link.py,sha256=0FePZoUYKv4RGQ2t6x7w5Z427wbA_Uo3WZnAkrgsuqo,2463 -pip/_internal/utils/encoding.py,sha256=qqsXDtiwMIjXMEiIVSaOjwH5YmirCaK-dIzb6-XJsL0,1169 -pip/_internal/utils/entrypoints.py,sha256=YlhLTRl2oHBAuqhc-zmL7USS67TPWVHImjeAQHreZTQ,3064 -pip/_internal/utils/filesystem.py,sha256=RhMIXUaNVMGjc3rhsDahWQ4MavvEQDdqXqgq-F6fpw8,5122 -pip/_internal/utils/filetypes.py,sha256=i8XAQ0eFCog26Fw9yV0Yb1ygAqKYB1w9Cz9n0fj8gZU,716 -pip/_internal/utils/glibc.py,sha256=Mesxxgg3BLxheLZx-dSf30b6gKpOgdVXw6W--uHSszQ,3113 -pip/_internal/utils/hashes.py,sha256=MjOigC75z6qoRMkgHiHqot7eqxfwDZSrEflJMPm-bHE,5118 -pip/_internal/utils/logging.py,sha256=fdtuZJ-AKkqwDTANDvGcBEpssL8el7T1jnwk1CnZl3Y,11603 -pip/_internal/utils/misc.py,sha256=fNXwaeeikvnUt4CPMFIL4-IQbZDxxjj4jDpzCi4ZsOw,23623 -pip/_internal/utils/models.py,sha256=5GoYU586SrxURMvDn_jBMJInitviJg4O5-iOU-6I0WY,1193 -pip/_internal/utils/packaging.py,sha256=5Wm6_x7lKrlqVjPI5MBN_RurcRHwVYoQ7Ksrs84de7s,2108 -pip/_internal/utils/setuptools_build.py,sha256=ouXpud-jeS8xPyTPsXJ-m34NPvK5os45otAzdSV_IJE,4435 -pip/_internal/utils/subprocess.py,sha256=zzdimb75jVLE1GU4WlTZ055gczhD7n1y1xTcNc7vNZQ,9207 -pip/_internal/utils/temp_dir.py,sha256=DUAw22uFruQdK43i2L2K53C-CDjRCPeAsBKJpu-rHQ4,9312 -pip/_internal/utils/unpacking.py,sha256=SBb2iV1crb89MDRTEKY86R4A_UOWApTQn9VQVcMDOlE,8821 -pip/_internal/utils/urls.py,sha256=AhaesUGl-9it6uvG6fsFPOr9ynFpGaTMk4t5XTX7Z_Q,1759 -pip/_internal/utils/virtualenv.py,sha256=S6f7csYorRpiD6cvn3jISZYc3I8PJC43H5iMFpRAEDU,3456 -pip/_internal/utils/wheel.py,sha256=i4BwUNHattzN0ixy3HBAF04tZPRh2CcxaT6t86viwkE,4499 -pip/_internal/vcs/__init__.py,sha256=UAqvzpbi0VbZo3Ub6skEeZAw-ooIZR-zX_WpCbxyCoU,596 -pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc,, -pip/_internal/vcs/__pycache__/git.cpython-312.pyc,, -pip/_internal/vcs/__pycache__/mercurial.cpython-312.pyc,, -pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc,, -pip/_internal/vcs/__pycache__/versioncontrol.cpython-312.pyc,, -pip/_internal/vcs/bazaar.py,sha256=j0oin0fpGRHcCFCxEcpPCQoFEvA-DMLULKdGP8Nv76o,3519 -pip/_internal/vcs/git.py,sha256=CeKBGJnl6uskvvjkAUXrJVxbHJrpS_B_pyfFdjL3CRc,18121 -pip/_internal/vcs/mercurial.py,sha256=oULOhzJ2Uie-06d1omkL-_Gc6meGaUkyogvqG9ZCyPs,5249 -pip/_internal/vcs/subversion.py,sha256=vhZs8L-TNggXqM1bbhl-FpbxE3TrIB6Tgnx8fh3S2HE,11729 -pip/_internal/vcs/versioncontrol.py,sha256=3eIjtOMYvOY5qP6BMYIYDZ375CSuec6kSEB0bOo1cSs,22787 -pip/_internal/wheel_builder.py,sha256=qTTzQV8F6b1jNsFCda1TRQC8J7gK-m7iuRNgKo7Dj68,11801 -pip/_vendor/__init__.py,sha256=U51NPwXdA-wXOiANIQncYjcMp6txgeOL5nHxksJeyas,4993 -pip/_vendor/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/__pycache__/six.cpython-312.pyc,, -pip/_vendor/__pycache__/typing_extensions.cpython-312.pyc,, -pip/_vendor/cachecontrol/__init__.py,sha256=ctHagMhQXuvQDdm4TirZrwDOT5H8oBNAJqzdKI6sovk,676 -pip/_vendor/cachecontrol/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-312.pyc,, -pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc,, -pip/_vendor/cachecontrol/__pycache__/cache.cpython-312.pyc,, -pip/_vendor/cachecontrol/__pycache__/controller.cpython-312.pyc,, -pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-312.pyc,, -pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-312.pyc,, -pip/_vendor/cachecontrol/__pycache__/serialize.cpython-312.pyc,, -pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-312.pyc,, -pip/_vendor/cachecontrol/_cmd.py,sha256=iist2EpzJvDVIhMAxXq8iFnTBsiZAd6iplxfmNboNyk,1737 -pip/_vendor/cachecontrol/adapter.py,sha256=_CcWvUP9048qAZjsNqViaHbdcLs9mmFNixVfpO7oebE,6392 -pip/_vendor/cachecontrol/cache.py,sha256=OTQj72tUf8C1uEgczdl3Gc8vkldSzsTITKtDGKMx4z8,1952 -pip/_vendor/cachecontrol/caches/__init__.py,sha256=dtrrroK5BnADR1GWjCZ19aZ0tFsMfvFBtLQQU1sp_ag,303 -pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-312.pyc,, -pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-312.pyc,, -pip/_vendor/cachecontrol/caches/file_cache.py,sha256=3z8AWKD-vfKeiJqIzLmJyIYtR2yd6Tsh3u1TyLRQoIQ,5352 -pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=9rmqwtYu_ljVkW6_oLqbC7EaX_a8YT_yLuna-eS0dgo,1386 -pip/_vendor/cachecontrol/controller.py,sha256=keCFA3ZaNVaWTwHd6F1zqWhb4vyvNx_UvZuo5iIYMfo,18384 -pip/_vendor/cachecontrol/filewrapper.py,sha256=STttGmIPBvZzt2b51dUOwoWX5crcMCpKZOisM3f5BNc,4292 -pip/_vendor/cachecontrol/heuristics.py,sha256=fdFbk9W8IeLrjteIz_fK4mj2HD_Y7COXF2Uc8TgjT1c,4828 -pip/_vendor/cachecontrol/serialize.py,sha256=0dHeMaDwysVAAnGVlhMOP4tDliohgNK0Jxk_zsOiWxw,7173 -pip/_vendor/cachecontrol/wrapper.py,sha256=hsGc7g8QGQTT-4f8tgz3AM5qwScg6FO0BSdLSRdEvpU,1417 -pip/_vendor/certifi/__init__.py,sha256=L_j-d0kYuA_MzA2_2hraF1ovf6KT6DTquRdV3paQwOk,94 -pip/_vendor/certifi/__main__.py,sha256=1k3Cr95vCxxGRGDljrW3wMdpZdL3Nhf0u1n-k2qdsCY,255 -pip/_vendor/certifi/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc,, -pip/_vendor/certifi/__pycache__/core.cpython-312.pyc,, -pip/_vendor/certifi/cacert.pem,sha256=eU0Dn_3yd8BH4m8sfVj4Glhl2KDrcCSg-sEWT-pNJ88,281617 -pip/_vendor/certifi/core.py,sha256=DNTl8b_B6C4vO3Vc9_q2uvwHpNnBQoy5onDC4McImxc,4531 -pip/_vendor/chardet/__init__.py,sha256=57R-HSxj0PWmILMN0GFmUNqEMfrEVSamXyjD-W6_fbs,4797 -pip/_vendor/chardet/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/big5freq.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/big5prober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/chardistribution.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/charsetprober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/cp949prober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/enums.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/escprober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/escsm.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/eucjpprober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/euckrfreq.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/euckrprober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/euctwfreq.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/euctwprober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/gb2312freq.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/gb2312prober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/hebrewprober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/jisfreq.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/johabfreq.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/johabprober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/jpcntx.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/langthaimodel.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/latin1prober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/macromanprober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/mbcssm.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/resultdict.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/sjisprober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/universaldetector.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/utf1632prober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/utf8prober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/version.cpython-312.pyc,, -pip/_vendor/chardet/big5freq.py,sha256=ltcfP-3PjlNHCoo5e4a7C4z-2DhBTXRfY6jbMbB7P30,31274 -pip/_vendor/chardet/big5prober.py,sha256=lPMfwCX6v2AaPgvFh_cSWZcgLDbWiFCHLZ_p9RQ9uxE,1763 -pip/_vendor/chardet/chardistribution.py,sha256=13B8XUG4oXDuLdXvfbIWwLFeR-ZU21AqTS1zcdON8bU,10032 -pip/_vendor/chardet/charsetgroupprober.py,sha256=UKK3SaIZB2PCdKSIS0gnvMtLR9JJX62M-fZJu3OlWyg,3915 -pip/_vendor/chardet/charsetprober.py,sha256=L3t8_wIOov8em-vZWOcbkdsrwe43N6_gqNh5pH7WPd4,5420 -pip/_vendor/chardet/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/chardet/cli/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-312.pyc,, -pip/_vendor/chardet/cli/chardetect.py,sha256=zibMVg5RpKb-ME9_7EYG4ZM2Sf07NHcQzZ12U-rYJho,3242 -pip/_vendor/chardet/codingstatemachine.py,sha256=K7k69sw3jY5DmTXoSJQVsUtFIQKYPQVOSJJhBuGv_yE,3732 -pip/_vendor/chardet/codingstatemachinedict.py,sha256=0GY3Hi2qIZvDrOOJ3AtqppM1RsYxr_66ER4EHjuMiMc,542 -pip/_vendor/chardet/cp949prober.py,sha256=0jKRV7fECuWI16rNnks0ZECKA1iZYCIEaP8A1ZvjUSI,1860 -pip/_vendor/chardet/enums.py,sha256=TzECiZoCKNMqgwU76cPCeKWFBqaWvAdLMev5_bCkhY8,1683 -pip/_vendor/chardet/escprober.py,sha256=Kho48X65xE0scFylIdeJjM2bcbvRvv0h0WUbMWrJD3A,4006 -pip/_vendor/chardet/escsm.py,sha256=AqyXpA2FQFD7k-buBty_7itGEYkhmVa8X09NLRul3QM,12176 -pip/_vendor/chardet/eucjpprober.py,sha256=5KYaM9fsxkRYzw1b5k0fL-j_-ezIw-ij9r97a9MHxLY,3934 -pip/_vendor/chardet/euckrfreq.py,sha256=3mHuRvXfsq_QcQysDQFb8qSudvTiol71C6Ic2w57tKM,13566 -pip/_vendor/chardet/euckrprober.py,sha256=hiFT6wM174GIwRvqDsIcuOc-dDsq2uPKMKbyV8-1Xnc,1753 -pip/_vendor/chardet/euctwfreq.py,sha256=2alILE1Lh5eqiFJZjzRkMQXolNJRHY5oBQd-vmZYFFM,36913 -pip/_vendor/chardet/euctwprober.py,sha256=NxbpNdBtU0VFI0bKfGfDkpP7S2_8_6FlO87dVH0ogws,1753 -pip/_vendor/chardet/gb2312freq.py,sha256=49OrdXzD-HXqwavkqjo8Z7gvs58hONNzDhAyMENNkvY,20735 -pip/_vendor/chardet/gb2312prober.py,sha256=KPEBueaSLSvBpFeINMu0D6TgHcR90e5PaQawifzF4o0,1759 -pip/_vendor/chardet/hebrewprober.py,sha256=96T_Lj_OmW-fK7JrSHojYjyG3fsGgbzkoTNleZ3kfYE,14537 -pip/_vendor/chardet/jisfreq.py,sha256=mm8tfrwqhpOd3wzZKS4NJqkYBQVcDfTM2JiQ5aW932E,25796 -pip/_vendor/chardet/johabfreq.py,sha256=dBpOYG34GRX6SL8k_LbS9rxZPMjLjoMlgZ03Pz5Hmqc,42498 -pip/_vendor/chardet/johabprober.py,sha256=O1Qw9nVzRnun7vZp4UZM7wvJSv9W941mEU9uDMnY3DU,1752 -pip/_vendor/chardet/jpcntx.py,sha256=uhHrYWkLxE_rF5OkHKInm0HUsrjgKHHVQvtt3UcvotA,27055 -pip/_vendor/chardet/langbulgarianmodel.py,sha256=vmbvYFP8SZkSxoBvLkFqKiH1sjma5ihk3PTpdy71Rr4,104562 -pip/_vendor/chardet/langgreekmodel.py,sha256=JfB7bupjjJH2w3X_mYnQr9cJA_7EuITC2cRW13fUjeI,98484 -pip/_vendor/chardet/langhebrewmodel.py,sha256=3HXHaLQPNAGcXnJjkIJfozNZLTvTJmf4W5Awi6zRRKc,98196 -pip/_vendor/chardet/langhungarianmodel.py,sha256=WxbeQIxkv8YtApiNqxQcvj-tMycsoI4Xy-fwkDHpP_Y,101363 -pip/_vendor/chardet/langrussianmodel.py,sha256=s395bTZ87ESTrZCOdgXbEjZ9P1iGPwCl_8xSsac_DLY,128035 -pip/_vendor/chardet/langthaimodel.py,sha256=7bJlQitRpTnVGABmbSznHnJwOHDy3InkTvtFUx13WQI,102774 -pip/_vendor/chardet/langturkishmodel.py,sha256=XY0eGdTIy4eQ9Xg1LVPZacb-UBhHBR-cq0IpPVHowKc,95372 -pip/_vendor/chardet/latin1prober.py,sha256=p15EEmFbmQUwbKLC7lOJVGHEZwcG45ubEZYTGu01J5g,5380 -pip/_vendor/chardet/macromanprober.py,sha256=9anfzmY6TBfUPDyBDOdY07kqmTHpZ1tK0jL-p1JWcOY,6077 -pip/_vendor/chardet/mbcharsetprober.py,sha256=Wr04WNI4F3X_VxEverNG-H25g7u-MDDKlNt-JGj-_uU,3715 -pip/_vendor/chardet/mbcsgroupprober.py,sha256=iRpaNBjV0DNwYPu_z6TiHgRpwYahiM7ztI_4kZ4Uz9A,2131 -pip/_vendor/chardet/mbcssm.py,sha256=hUtPvDYgWDaA2dWdgLsshbwRfm3Q5YRlRogdmeRUNQw,30391 -pip/_vendor/chardet/metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/chardet/metadata/__pycache__/languages.cpython-312.pyc,, -pip/_vendor/chardet/metadata/languages.py,sha256=FhvBIdZFxRQ-dTwkb_0madRKgVBCaUMQz9I5xqjE5iQ,13560 -pip/_vendor/chardet/resultdict.py,sha256=ez4FRvN5KaSosJeJ2WzUyKdDdg35HDy_SSLPXKCdt5M,402 -pip/_vendor/chardet/sbcharsetprober.py,sha256=-nd3F90i7GpXLjehLVHqVBE0KlWzGvQUPETLBNn4o6U,6400 -pip/_vendor/chardet/sbcsgroupprober.py,sha256=gcgI0fOfgw_3YTClpbra_MNxwyEyJ3eUXraoLHYb59E,4137 -pip/_vendor/chardet/sjisprober.py,sha256=aqQufMzRw46ZpFlzmYaYeT2-nzmKb-hmcrApppJ862k,4007 -pip/_vendor/chardet/universaldetector.py,sha256=xYBrg4x0dd9WnT8qclfADVD9ondrUNkqPmvte1pa520,14848 -pip/_vendor/chardet/utf1632prober.py,sha256=pw1epGdMj1hDGiCu1AHqqzOEfjX8MVdiW7O1BlT8-eQ,8505 -pip/_vendor/chardet/utf8prober.py,sha256=8m08Ub5490H4jQ6LYXvFysGtgKoKsHUd2zH_i8_TnVw,2812 -pip/_vendor/chardet/version.py,sha256=lGtJcxGM44Qz4Cbk4rbbmrKxnNr1-97U25TameLehZw,244 -pip/_vendor/colorama/__init__.py,sha256=wePQA4U20tKgYARySLEC047ucNX-g8pRLpYBuiHlLb8,266 -pip/_vendor/colorama/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/colorama/__pycache__/ansi.cpython-312.pyc,, -pip/_vendor/colorama/__pycache__/ansitowin32.cpython-312.pyc,, -pip/_vendor/colorama/__pycache__/initialise.cpython-312.pyc,, -pip/_vendor/colorama/__pycache__/win32.cpython-312.pyc,, -pip/_vendor/colorama/__pycache__/winterm.cpython-312.pyc,, -pip/_vendor/colorama/ansi.py,sha256=Top4EeEuaQdBWdteKMEcGOTeKeF19Q-Wo_6_Cj5kOzQ,2522 -pip/_vendor/colorama/ansitowin32.py,sha256=vPNYa3OZbxjbuFyaVo0Tmhmy1FZ1lKMWCnT7odXpItk,11128 -pip/_vendor/colorama/initialise.py,sha256=-hIny86ClXo39ixh5iSCfUIa2f_h_bgKRDW7gqs-KLU,3325 -pip/_vendor/colorama/tests/__init__.py,sha256=MkgPAEzGQd-Rq0w0PZXSX2LadRWhUECcisJY8lSrm4Q,75 -pip/_vendor/colorama/tests/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-312.pyc,, -pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-312.pyc,, -pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-312.pyc,, -pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-312.pyc,, -pip/_vendor/colorama/tests/__pycache__/utils.cpython-312.pyc,, -pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-312.pyc,, -pip/_vendor/colorama/tests/ansi_test.py,sha256=FeViDrUINIZcr505PAxvU4AjXz1asEiALs9GXMhwRaE,2839 -pip/_vendor/colorama/tests/ansitowin32_test.py,sha256=RN7AIhMJ5EqDsYaCjVo-o4u8JzDD4ukJbmevWKS70rY,10678 -pip/_vendor/colorama/tests/initialise_test.py,sha256=BbPy-XfyHwJ6zKozuQOvNvQZzsx9vdb_0bYXn7hsBTc,6741 -pip/_vendor/colorama/tests/isatty_test.py,sha256=Pg26LRpv0yQDB5Ac-sxgVXG7hsA1NYvapFgApZfYzZg,1866 -pip/_vendor/colorama/tests/utils.py,sha256=1IIRylG39z5-dzq09R_ngufxyPZxgldNbrxKxUGwGKE,1079 -pip/_vendor/colorama/tests/winterm_test.py,sha256=qoWFPEjym5gm2RuMwpf3pOis3a5r_PJZFCzK254JL8A,3709 -pip/_vendor/colorama/win32.py,sha256=YQOKwMTwtGBbsY4dL5HYTvwTeP9wIQra5MvPNddpxZs,6181 -pip/_vendor/colorama/winterm.py,sha256=XCQFDHjPi6AHYNdZwy0tA02H-Jh48Jp-HvCjeLeLp3U,7134 -pip/_vendor/distlib/__init__.py,sha256=hJKF7FHoqbmGckncDuEINWo_OYkDNiHODtYXSMcvjcc,625 -pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/distlib/__pycache__/compat.cpython-312.pyc,, -pip/_vendor/distlib/__pycache__/database.cpython-312.pyc,, -pip/_vendor/distlib/__pycache__/index.cpython-312.pyc,, -pip/_vendor/distlib/__pycache__/locators.cpython-312.pyc,, -pip/_vendor/distlib/__pycache__/manifest.cpython-312.pyc,, -pip/_vendor/distlib/__pycache__/markers.cpython-312.pyc,, -pip/_vendor/distlib/__pycache__/metadata.cpython-312.pyc,, -pip/_vendor/distlib/__pycache__/resources.cpython-312.pyc,, -pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc,, -pip/_vendor/distlib/__pycache__/util.cpython-312.pyc,, -pip/_vendor/distlib/__pycache__/version.cpython-312.pyc,, -pip/_vendor/distlib/__pycache__/wheel.cpython-312.pyc,, -pip/_vendor/distlib/compat.py,sha256=Un-uIBvy02w-D267OG4VEhuddqWgKj9nNkxVltAb75w,41487 -pip/_vendor/distlib/database.py,sha256=0V9Qvs0Vrxa2F_-hLWitIyVyRifJ0pCxyOI-kEOBwsA,51965 -pip/_vendor/distlib/index.py,sha256=lTbw268rRhj8dw1sib3VZ_0EhSGgoJO3FKJzSFMOaeA,20797 -pip/_vendor/distlib/locators.py,sha256=o1r_M86_bRLafSpetmyfX8KRtFu-_Q58abvQrnOSnbA,51767 -pip/_vendor/distlib/manifest.py,sha256=3qfmAmVwxRqU1o23AlfXrQGZzh6g_GGzTAP_Hb9C5zQ,14168 -pip/_vendor/distlib/markers.py,sha256=n3DfOh1yvZ_8EW7atMyoYeZFXjYla0Nz0itQlojCd0A,5268 -pip/_vendor/distlib/metadata.py,sha256=pB9WZ9mBfmQxc9OVIldLS5CjOoQRvKAvUwwQyKwKQtQ,39693 -pip/_vendor/distlib/resources.py,sha256=LwbPksc0A1JMbi6XnuPdMBUn83X7BPuFNWqPGEKI698,10820 -pip/_vendor/distlib/scripts.py,sha256=nQFXN6G7nOWNDUyxirUep-3WOlJhB7McvCs9zOnkGTI,18315 -pip/_vendor/distlib/util.py,sha256=XSznxEi_i3T20UJuaVc0qXHz5ksGUCW1khYlBprN_QE,67530 -pip/_vendor/distlib/version.py,sha256=9pXkduchve_aN7JG6iL9VTYV_kqNSGoc2Dwl8JuySnQ,23747 -pip/_vendor/distlib/wheel.py,sha256=FVQCve8u-L0QYk5-YTZc7s4WmNQdvjRWTK08KXzZVX4,43958 -pip/_vendor/distro/__init__.py,sha256=2fHjF-SfgPvjyNZ1iHh_wjqWdR_Yo5ODHwZC0jLBPhc,981 -pip/_vendor/distro/__main__.py,sha256=bu9d3TifoKciZFcqRBuygV3GSuThnVD_m2IK4cz96Vs,64 -pip/_vendor/distro/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/distro/__pycache__/__main__.cpython-312.pyc,, -pip/_vendor/distro/__pycache__/distro.cpython-312.pyc,, -pip/_vendor/distro/distro.py,sha256=UZO1LjIhtFCMdlbiz39gj3raV-Amf3SBwzGzfApiMHw,49330 -pip/_vendor/idna/__init__.py,sha256=KJQN1eQBr8iIK5SKrJ47lXvxG0BJ7Lm38W4zT0v_8lk,849 -pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/idna/__pycache__/codec.cpython-312.pyc,, -pip/_vendor/idna/__pycache__/compat.cpython-312.pyc,, -pip/_vendor/idna/__pycache__/core.cpython-312.pyc,, -pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc,, -pip/_vendor/idna/__pycache__/intranges.cpython-312.pyc,, -pip/_vendor/idna/__pycache__/package_data.cpython-312.pyc,, -pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc,, -pip/_vendor/idna/codec.py,sha256=6ly5odKfqrytKT9_7UrlGklHnf1DSK2r9C6cSM4sa28,3374 -pip/_vendor/idna/compat.py,sha256=0_sOEUMT4CVw9doD3vyRhX80X19PwqFoUBs7gWsFME4,321 -pip/_vendor/idna/core.py,sha256=1JxchwKzkxBSn7R_oCE12oBu3eVux0VzdxolmIad24M,12950 -pip/_vendor/idna/idnadata.py,sha256=xUjqKqiJV8Ho_XzBpAtv5JFoVPSupK-SUXvtjygUHqw,44375 -pip/_vendor/idna/intranges.py,sha256=YBr4fRYuWH7kTKS2tXlFjM24ZF1Pdvcir-aywniInqg,1881 -pip/_vendor/idna/package_data.py,sha256=C_jHJzmX8PI4xq0jpzmcTMxpb5lDsq4o5VyxQzlVrZE,21 -pip/_vendor/idna/uts46data.py,sha256=zvjZU24s58_uAS850Mcd0NnD0X7_gCMAMjzWNIeUJdc,206539 -pip/_vendor/msgpack/__init__.py,sha256=hyGhlnmcJkxryJBKC3X5FnEph375kQoL_mG8LZUuXgY,1132 -pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc,, -pip/_vendor/msgpack/__pycache__/ext.cpython-312.pyc,, -pip/_vendor/msgpack/__pycache__/fallback.cpython-312.pyc,, -pip/_vendor/msgpack/exceptions.py,sha256=dCTWei8dpkrMsQDcjQk74ATl9HsIBH0ybt8zOPNqMYc,1081 -pip/_vendor/msgpack/ext.py,sha256=C5MK8JhVYGYFWPvxsORsqZAnvOXefYQ57m1Ym0luW5M,6079 -pip/_vendor/msgpack/fallback.py,sha256=tvNBHyxxFbuVlC8GZShETClJxjLiDMOja4XwwyvNm2g,34544 -pip/_vendor/packaging/__about__.py,sha256=ugASIO2w1oUyH8_COqQ2X_s0rDhjbhQC3yJocD03h2c,661 -pip/_vendor/packaging/__init__.py,sha256=b9Kk5MF7KxhhLgcDmiUWukN-LatWFxPdNug0joPhHSk,497 -pip/_vendor/packaging/__pycache__/__about__.cpython-312.pyc,, -pip/_vendor/packaging/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc,, -pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc,, -pip/_vendor/packaging/__pycache__/_structures.cpython-312.pyc,, -pip/_vendor/packaging/__pycache__/markers.cpython-312.pyc,, -pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc,, -pip/_vendor/packaging/__pycache__/specifiers.cpython-312.pyc,, -pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc,, -pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc,, -pip/_vendor/packaging/__pycache__/version.cpython-312.pyc,, -pip/_vendor/packaging/_manylinux.py,sha256=XcbiXB-qcjv3bcohp6N98TMpOP4_j3m-iOA8ptK2GWY,11488 -pip/_vendor/packaging/_musllinux.py,sha256=_KGgY_qc7vhMGpoqss25n2hiLCNKRtvz9mCrS7gkqyc,4378 -pip/_vendor/packaging/_structures.py,sha256=q3eVNmbWJGG_S0Dit_S3Ao8qQqz_5PYTXFAKBZe5yr4,1431 -pip/_vendor/packaging/markers.py,sha256=AJBOcY8Oq0kYc570KuuPTkvuqjAlhufaE2c9sCUbm64,8487 -pip/_vendor/packaging/requirements.py,sha256=NtDlPBtojpn1IUC85iMjPNsUmufjpSlwnNA-Xb4m5NA,4676 -pip/_vendor/packaging/specifiers.py,sha256=LRQ0kFsHrl5qfcFNEEJrIFYsnIHQUJXY9fIsakTrrqE,30110 -pip/_vendor/packaging/tags.py,sha256=lmsnGNiJ8C4D_Pf9PbM0qgbZvD9kmB9lpZBQUZa3R_Y,15699 -pip/_vendor/packaging/utils.py,sha256=dJjeat3BS-TYn1RrUFVwufUMasbtzLfYRoy_HXENeFQ,4200 -pip/_vendor/packaging/version.py,sha256=_fLRNrFrxYcHVfyo8vk9j8s6JM8N_xsSxVFr6RJyco8,14665 -pip/_vendor/pkg_resources/__init__.py,sha256=hTAeJCNYb7dJseIDVsYK3mPQep_gphj4tQh-bspX8bg,109364 -pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/platformdirs/__init__.py,sha256=SkhEYVyC_HUHC6KX7n4M_6coyRMtEB38QMyOYIAX6Yk,20155 -pip/_vendor/platformdirs/__main__.py,sha256=fVvSiTzr2-RM6IsjWjj4fkaOtDOgDhUWv6sA99do4CQ,1476 -pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/platformdirs/__pycache__/__main__.cpython-312.pyc,, -pip/_vendor/platformdirs/__pycache__/android.cpython-312.pyc,, -pip/_vendor/platformdirs/__pycache__/api.cpython-312.pyc,, -pip/_vendor/platformdirs/__pycache__/macos.cpython-312.pyc,, -pip/_vendor/platformdirs/__pycache__/unix.cpython-312.pyc,, -pip/_vendor/platformdirs/__pycache__/version.cpython-312.pyc,, -pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc,, -pip/_vendor/platformdirs/android.py,sha256=y_EEMKwYl2-bzYBDovksSn8m76on0Lda8eyJksVQE9U,7211 -pip/_vendor/platformdirs/api.py,sha256=jWtX06jAJytYrkJDOqEls97mCkyHRSZkoqUlbMK5Qew,7132 -pip/_vendor/platformdirs/macos.py,sha256=LueVOoVgGWDBwQb8OFwXkVKfVn33CM1Lkwf1-A86tRQ,3678 -pip/_vendor/platformdirs/unix.py,sha256=22JhR8ZY0aLxSVCFnKrc6f1iz6Gv42K24Daj7aTjfSg,8809 -pip/_vendor/platformdirs/version.py,sha256=mavZTQIJIXfdewEaSTn7EWrNfPZWeRofb-74xqW5f2M,160 -pip/_vendor/platformdirs/windows.py,sha256=4TtbPGoWG2PRgI11uquDa7eRk8TcxvnUNuuMGZItnXc,9573 -pip/_vendor/pygments/__init__.py,sha256=6AuDljQtvf89DTNUyWM7k3oUlP_lq70NU-INKKteOBY,2983 -pip/_vendor/pygments/__main__.py,sha256=es8EKMvXj5yToIfQ-pf3Dv5TnIeeM6sME0LW-n4ecHo,353 -pip/_vendor/pygments/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/pygments/__pycache__/__main__.cpython-312.pyc,, -pip/_vendor/pygments/__pycache__/cmdline.cpython-312.pyc,, -pip/_vendor/pygments/__pycache__/console.cpython-312.pyc,, -pip/_vendor/pygments/__pycache__/filter.cpython-312.pyc,, -pip/_vendor/pygments/__pycache__/formatter.cpython-312.pyc,, -pip/_vendor/pygments/__pycache__/lexer.cpython-312.pyc,, -pip/_vendor/pygments/__pycache__/modeline.cpython-312.pyc,, -pip/_vendor/pygments/__pycache__/plugin.cpython-312.pyc,, -pip/_vendor/pygments/__pycache__/regexopt.cpython-312.pyc,, -pip/_vendor/pygments/__pycache__/scanner.cpython-312.pyc,, -pip/_vendor/pygments/__pycache__/sphinxext.cpython-312.pyc,, -pip/_vendor/pygments/__pycache__/style.cpython-312.pyc,, -pip/_vendor/pygments/__pycache__/token.cpython-312.pyc,, -pip/_vendor/pygments/__pycache__/unistring.cpython-312.pyc,, -pip/_vendor/pygments/__pycache__/util.cpython-312.pyc,, -pip/_vendor/pygments/cmdline.py,sha256=byxYJp9gnjVeyhRlZ3UTMgo_LhkXh1afvN8wJBtAcc8,23685 -pip/_vendor/pygments/console.py,sha256=2wZ5W-U6TudJD1_NLUwjclMpbomFM91lNv11_60sfGY,1697 -pip/_vendor/pygments/filter.py,sha256=j5aLM9a9wSx6eH1oy473oSkJ02hGWNptBlVo4s1g_30,1938 -pip/_vendor/pygments/filters/__init__.py,sha256=h_koYkUFo-FFUxjs564JHUAz7O3yJpVwI6fKN3MYzG0,40386 -pip/_vendor/pygments/filters/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/pygments/formatter.py,sha256=J9OL9hXLJKZk7moUgKwpjW9HNf4WlJFg_o_-Z_S_tTY,4178 -pip/_vendor/pygments/formatters/__init__.py,sha256=_xgAcdFKr0QNYwh_i98AU9hvfP3X2wAkhElFcRRF3Uo,5424 -pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-312.pyc,, -pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-312.pyc,, -pip/_vendor/pygments/formatters/__pycache__/groff.cpython-312.pyc,, -pip/_vendor/pygments/formatters/__pycache__/html.cpython-312.pyc,, -pip/_vendor/pygments/formatters/__pycache__/img.cpython-312.pyc,, -pip/_vendor/pygments/formatters/__pycache__/irc.cpython-312.pyc,, -pip/_vendor/pygments/formatters/__pycache__/latex.cpython-312.pyc,, -pip/_vendor/pygments/formatters/__pycache__/other.cpython-312.pyc,, -pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc,, -pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-312.pyc,, -pip/_vendor/pygments/formatters/__pycache__/svg.cpython-312.pyc,, -pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-312.pyc,, -pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-312.pyc,, -pip/_vendor/pygments/formatters/_mapping.py,sha256=1Cw37FuQlNacnxRKmtlPX4nyLoX9_ttko5ZwscNUZZ4,4176 -pip/_vendor/pygments/formatters/bbcode.py,sha256=r1b7wzWTJouADDLh-Z11iRi4iQxD0JKJ1qHl6mOYxsA,3314 -pip/_vendor/pygments/formatters/groff.py,sha256=xy8Zf3tXOo6MWrXh7yPGWx3lVEkg_DhY4CxmsDb0IVo,5094 -pip/_vendor/pygments/formatters/html.py,sha256=PIzAyilNqaTzSSP2slDG2VDLE3qNioWy2rgtSSoviuI,35610 -pip/_vendor/pygments/formatters/img.py,sha256=XKXmg2_XONrR4mtq2jfEU8XCsoln3VSGTw-UYiEokys,21938 -pip/_vendor/pygments/formatters/irc.py,sha256=Ep-m8jd3voFO6Fv57cUGFmz6JVA67IEgyiBOwv0N4a0,4981 -pip/_vendor/pygments/formatters/latex.py,sha256=FGzJ-YqSTE8z_voWPdzvLY5Tq8jE_ygjGjM6dXZJ8-k,19351 -pip/_vendor/pygments/formatters/other.py,sha256=gPxkk5BdAzWTCgbEHg1lpLi-1F6ZPh5A_aotgLXHnzg,5073 -pip/_vendor/pygments/formatters/pangomarkup.py,sha256=6LKnQc8yh49f802bF0sPvbzck4QivMYqqoXAPaYP8uU,2212 -pip/_vendor/pygments/formatters/rtf.py,sha256=aA0v_psW6KZI3N18TKDifxeL6mcF8EDXcPXDWI4vhVQ,5014 -pip/_vendor/pygments/formatters/svg.py,sha256=dQONWypbzfvzGCDtdp3M_NJawScJvM2DiHbx1k-ww7g,7335 -pip/_vendor/pygments/formatters/terminal.py,sha256=FG-rpjRpFmNpiGB4NzIucvxq6sQIXB3HOTo2meTKtrU,4674 -pip/_vendor/pygments/formatters/terminal256.py,sha256=13SJ3D5pFdqZ9zROE6HbWnBDwHvOGE8GlsmqGhprRp4,11753 -pip/_vendor/pygments/lexer.py,sha256=2BpqLlT2ExvOOi7vnjK5nB4Fp-m52ldiPaXMox5uwug,34618 -pip/_vendor/pygments/lexers/__init__.py,sha256=j5KEi5O_VQ5GS59H49l-10gzUOkWKxlwGeVMlGO2MMk,12130 -pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-312.pyc,, -pip/_vendor/pygments/lexers/__pycache__/python.cpython-312.pyc,, -pip/_vendor/pygments/lexers/_mapping.py,sha256=Hts4r_ZQ8icftGM7gkBPeED5lyVSv4affFgXYE6Ap04,72281 -pip/_vendor/pygments/lexers/python.py,sha256=c7jnmKFU9DLxTJW0UbwXt6Z9FJqbBlVsWA1Qr9xSA_w,53424 -pip/_vendor/pygments/modeline.py,sha256=eF2vO4LpOGoPvIKKkbPfnyut8hT4UiebZPpb-BYGQdI,986 -pip/_vendor/pygments/plugin.py,sha256=j1Fh310RbV2DQ9nvkmkqvlj38gdyuYKllLnGxbc8sJM,2591 -pip/_vendor/pygments/regexopt.py,sha256=jg1ALogcYGU96TQS9isBl6dCrvw5y5--BP_K-uFk_8s,3072 -pip/_vendor/pygments/scanner.py,sha256=b_nu5_f3HCgSdp5S_aNRBQ1MSCm4ZjDwec2OmTRickw,3092 -pip/_vendor/pygments/sphinxext.py,sha256=wBFYm180qea9JKt__UzhRlNRNhczPDFDaqGD21sbuso,6882 -pip/_vendor/pygments/style.py,sha256=C4qyoJrUTkq-OV3iO-8Vz3UtWYpJwSTdh5_vlGCGdNQ,6257 -pip/_vendor/pygments/styles/__init__.py,sha256=he7HjQx7sC0d2kfTVLjUs0J15mtToJM6M1brwIm9--Q,3700 -pip/_vendor/pygments/styles/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/pygments/token.py,sha256=seNsmcch9OEHXYirh8Ool7w8xDhfNTbLj5rHAC-gc_o,6184 -pip/_vendor/pygments/unistring.py,sha256=FaUfG14NBJEKLQoY9qj6JYeXrpYcLmKulghdxOGFaOc,63223 -pip/_vendor/pygments/util.py,sha256=AEVY0qonyyEMgv4Do2dINrrqUAwUk2XYSqHM650uzek,10230 -pip/_vendor/pyparsing/__init__.py,sha256=9m1JbE2JTLdBG0Mb6B0lEaZj181Wx5cuPXZpsbHEYgE,9116 -pip/_vendor/pyparsing/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/pyparsing/__pycache__/actions.cpython-312.pyc,, -pip/_vendor/pyparsing/__pycache__/common.cpython-312.pyc,, -pip/_vendor/pyparsing/__pycache__/core.cpython-312.pyc,, -pip/_vendor/pyparsing/__pycache__/exceptions.cpython-312.pyc,, -pip/_vendor/pyparsing/__pycache__/helpers.cpython-312.pyc,, -pip/_vendor/pyparsing/__pycache__/results.cpython-312.pyc,, -pip/_vendor/pyparsing/__pycache__/testing.cpython-312.pyc,, -pip/_vendor/pyparsing/__pycache__/unicode.cpython-312.pyc,, -pip/_vendor/pyparsing/__pycache__/util.cpython-312.pyc,, -pip/_vendor/pyparsing/actions.py,sha256=05uaIPOznJPQ7VgRdmGCmG4sDnUPtwgv5qOYIqbL2UY,6567 -pip/_vendor/pyparsing/common.py,sha256=p-3c83E5-DjlkF35G0O9-kjQRpoejP-2_z0hxZ-eol4,13387 -pip/_vendor/pyparsing/core.py,sha256=yvuRlLpXSF8mgk-QhiW3OVLqD9T0rsj9tbibhRH4Yaw,224445 -pip/_vendor/pyparsing/diagram/__init__.py,sha256=nxmDOoYF9NXuLaGYy01tKFjkNReWJlrGFuJNWEiTo84,24215 -pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/pyparsing/exceptions.py,sha256=6Jc6W1eDZBzyFu1J0YrcdNFVBC-RINujZmveSnB8Rxw,9523 -pip/_vendor/pyparsing/helpers.py,sha256=BZJHCA8SS0pYio30KGQTc9w2qMOaK4YpZ7hcvHbnTgk,38646 -pip/_vendor/pyparsing/results.py,sha256=9dyqQ-w3MjfmxWbFt8KEPU6IfXeyRdoWp2Og802rUQY,26692 -pip/_vendor/pyparsing/testing.py,sha256=eJncg0p83zm1FTPvM9auNT6oavIvXaibmRFDf1qmwkY,13488 -pip/_vendor/pyparsing/unicode.py,sha256=fAPdsJiARFbkPAih6NkYry0dpj4jPqelGVMlE4wWFW8,10646 -pip/_vendor/pyparsing/util.py,sha256=vTMzTdwSDyV8d_dSgquUTdWgBFoA_W30nfxEJDsshRQ,8670 -pip/_vendor/pyproject_hooks/__init__.py,sha256=kCehmy0UaBa9oVMD7ZIZrnswfnP3LXZ5lvnNJAL5JBM,491 -pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-312.pyc,, -pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-312.pyc,, -pip/_vendor/pyproject_hooks/_compat.py,sha256=by6evrYnqkisiM-MQcvOKs5bgDMzlOSgZqRHNqf04zE,138 -pip/_vendor/pyproject_hooks/_impl.py,sha256=61GJxzQip0IInhuO69ZI5GbNQ82XEDUB_1Gg5_KtUoc,11920 -pip/_vendor/pyproject_hooks/_in_process/__init__.py,sha256=9gQATptbFkelkIy0OfWFEACzqxXJMQDWCH9rBOAZVwQ,546 -pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-312.pyc,, -pip/_vendor/pyproject_hooks/_in_process/_in_process.py,sha256=m2b34c917IW5o-Q_6TYIHlsK9lSUlNiyrITTUH_zwew,10927 -pip/_vendor/requests/__init__.py,sha256=owujob4dk45Siy4EYtbCKR6wcFph7E04a_v_OuAacBA,5169 -pip/_vendor/requests/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/requests/__pycache__/__version__.cpython-312.pyc,, -pip/_vendor/requests/__pycache__/_internal_utils.cpython-312.pyc,, -pip/_vendor/requests/__pycache__/adapters.cpython-312.pyc,, -pip/_vendor/requests/__pycache__/api.cpython-312.pyc,, -pip/_vendor/requests/__pycache__/auth.cpython-312.pyc,, -pip/_vendor/requests/__pycache__/certs.cpython-312.pyc,, -pip/_vendor/requests/__pycache__/compat.cpython-312.pyc,, -pip/_vendor/requests/__pycache__/cookies.cpython-312.pyc,, -pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc,, -pip/_vendor/requests/__pycache__/help.cpython-312.pyc,, -pip/_vendor/requests/__pycache__/hooks.cpython-312.pyc,, -pip/_vendor/requests/__pycache__/models.cpython-312.pyc,, -pip/_vendor/requests/__pycache__/packages.cpython-312.pyc,, -pip/_vendor/requests/__pycache__/sessions.cpython-312.pyc,, -pip/_vendor/requests/__pycache__/status_codes.cpython-312.pyc,, -pip/_vendor/requests/__pycache__/structures.cpython-312.pyc,, -pip/_vendor/requests/__pycache__/utils.cpython-312.pyc,, -pip/_vendor/requests/__version__.py,sha256=ssI3Ezt7PaxgkOW45GhtwPUclo_SO_ygtIm4A74IOfw,435 -pip/_vendor/requests/_internal_utils.py,sha256=nMQymr4hs32TqVo5AbCrmcJEhvPUh7xXlluyqwslLiQ,1495 -pip/_vendor/requests/adapters.py,sha256=idj6cZcId3L5xNNeJ7ieOLtw3awJk5A64xUfetHwq3M,19697 -pip/_vendor/requests/api.py,sha256=q61xcXq4tmiImrvcSVLTbFyCiD2F-L_-hWKGbz4y8vg,6449 -pip/_vendor/requests/auth.py,sha256=h-HLlVx9j8rKV5hfSAycP2ApOSglTz77R0tz7qCbbEE,10187 -pip/_vendor/requests/certs.py,sha256=PVPooB0jP5hkZEULSCwC074532UFbR2Ptgu0I5zwmCs,575 -pip/_vendor/requests/compat.py,sha256=IhK9quyX0RRuWTNcg6d2JGSAOUbM6mym2p_2XjLTwf4,1286 -pip/_vendor/requests/cookies.py,sha256=kD3kNEcCj-mxbtf5fJsSaT86eGoEYpD3X0CSgpzl7BM,18560 -pip/_vendor/requests/exceptions.py,sha256=FA-_kVwBZ2jhXauRctN_ewHVK25b-fj0Azyz1THQ0Kk,3823 -pip/_vendor/requests/help.py,sha256=FnAAklv8MGm_qb2UilDQgS6l0cUttiCFKUjx0zn2XNA,3879 -pip/_vendor/requests/hooks.py,sha256=CiuysiHA39V5UfcCBXFIx83IrDpuwfN9RcTUgv28ftQ,733 -pip/_vendor/requests/models.py,sha256=dDZ-iThotky-Noq9yy97cUEJhr3wnY6mv-xR_ePg_lk,35288 -pip/_vendor/requests/packages.py,sha256=njJmVifY4aSctuW3PP5EFRCxjEwMRDO6J_feG2dKWsI,695 -pip/_vendor/requests/sessions.py,sha256=-LvTzrPtetSTrR3buxu4XhdgMrJFLB1q5D7P--L2Xhw,30373 -pip/_vendor/requests/status_codes.py,sha256=FvHmT5uH-_uimtRz5hH9VCbt7VV-Nei2J9upbej6j8g,4235 -pip/_vendor/requests/structures.py,sha256=-IbmhVz06S-5aPSZuUthZ6-6D9XOjRuTXHOabY041XM,2912 -pip/_vendor/requests/utils.py,sha256=kOPn0qYD6xRTzaxbqTdYiSInBZHl6379AJsyIgzYGLY,33460 -pip/_vendor/resolvelib/__init__.py,sha256=h509TdEcpb5-44JonaU3ex2TM15GVBLjM9CNCPwnTTs,537 -pip/_vendor/resolvelib/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/resolvelib/__pycache__/providers.cpython-312.pyc,, -pip/_vendor/resolvelib/__pycache__/reporters.cpython-312.pyc,, -pip/_vendor/resolvelib/__pycache__/resolvers.cpython-312.pyc,, -pip/_vendor/resolvelib/__pycache__/structs.cpython-312.pyc,, -pip/_vendor/resolvelib/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-312.pyc,, -pip/_vendor/resolvelib/compat/collections_abc.py,sha256=uy8xUZ-NDEw916tugUXm8HgwCGiMO0f-RcdnpkfXfOs,156 -pip/_vendor/resolvelib/providers.py,sha256=fuuvVrCetu5gsxPB43ERyjfO8aReS3rFQHpDgiItbs4,5871 -pip/_vendor/resolvelib/reporters.py,sha256=TSbRmWzTc26w0ggsV1bxVpeWDB8QNIre6twYl7GIZBE,1601 -pip/_vendor/resolvelib/resolvers.py,sha256=G8rsLZSq64g5VmIq-lB7UcIJ1gjAxIQJmTF4REZleQ0,20511 -pip/_vendor/resolvelib/structs.py,sha256=0_1_XO8z_CLhegP3Vpf9VJ3zJcfLm0NOHRM-i0Ykz3o,4963 -pip/_vendor/rich/__init__.py,sha256=dRxjIL-SbFVY0q3IjSMrfgBTHrm1LZDgLOygVBwiYZc,6090 -pip/_vendor/rich/__main__.py,sha256=TT8sb9PTnsnKhhrGuHkLN0jdN0dtKhtPkEr9CidDbPM,8478 -pip/_vendor/rich/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/__main__.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_cell_widths.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_emoji_codes.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_emoji_replace.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_export_format.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_extension.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_fileno.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_inspect.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_log_render.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_loop.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_null_file.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_palettes.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_pick.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_ratio.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_spinners.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_stack.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_timer.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_windows.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_windows_renderer.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_wrap.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/abc.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/align.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/ansi.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/bar.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/box.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/cells.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/color.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/color_triplet.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/columns.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/console.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/constrain.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/containers.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/control.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/default_styles.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/diagnose.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/emoji.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/errors.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/file_proxy.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/filesize.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/highlighter.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/json.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/jupyter.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/layout.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/live.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/live_render.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/logging.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/markup.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/measure.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/padding.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/pager.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/palette.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/panel.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/progress.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/progress_bar.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/prompt.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/protocol.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/region.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/repr.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/rule.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/scope.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/screen.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/segment.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/spinner.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/status.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/style.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/styled.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/syntax.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/table.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/terminal_theme.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/text.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/theme.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/themes.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/traceback.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/tree.cpython-312.pyc,, -pip/_vendor/rich/_cell_widths.py,sha256=2n4EiJi3X9sqIq0O16kUZ_zy6UYMd3xFfChlKfnW1Hc,10096 -pip/_vendor/rich/_emoji_codes.py,sha256=hu1VL9nbVdppJrVoijVshRlcRRe_v3dju3Mmd2sKZdY,140235 -pip/_vendor/rich/_emoji_replace.py,sha256=n-kcetsEUx2ZUmhQrfeMNc-teeGhpuSQ5F8VPBsyvDo,1064 -pip/_vendor/rich/_export_format.py,sha256=qxgV3nKnXQu1hfbnRVswPYy-AwIg1X0LSC47cK5s8jk,2100 -pip/_vendor/rich/_extension.py,sha256=Xt47QacCKwYruzjDi-gOBq724JReDj9Cm9xUi5fr-34,265 -pip/_vendor/rich/_fileno.py,sha256=HWZxP5C2ajMbHryvAQZseflVfQoGzsKOHzKGsLD8ynQ,799 -pip/_vendor/rich/_inspect.py,sha256=oZJGw31e64dwXSCmrDnvZbwVb1ZKhWfU8wI3VWohjJk,9695 -pip/_vendor/rich/_log_render.py,sha256=1ByI0PA1ZpxZY3CGJOK54hjlq4X-Bz_boIjIqCd8Kns,3225 -pip/_vendor/rich/_loop.py,sha256=hV_6CLdoPm0va22Wpw4zKqM0RYsz3TZxXj0PoS-9eDQ,1236 -pip/_vendor/rich/_null_file.py,sha256=tGSXk_v-IZmbj1GAzHit8A3kYIQMiCpVsCFfsC-_KJ4,1387 -pip/_vendor/rich/_palettes.py,sha256=cdev1JQKZ0JvlguV9ipHgznTdnvlIzUFDBb0It2PzjI,7063 -pip/_vendor/rich/_pick.py,sha256=evDt8QN4lF5CiwrUIXlOJCntitBCOsI3ZLPEIAVRLJU,423 -pip/_vendor/rich/_ratio.py,sha256=2lLSliL025Y-YMfdfGbutkQDevhcyDqc-DtUYW9mU70,5472 -pip/_vendor/rich/_spinners.py,sha256=U2r1_g_1zSjsjiUdAESc2iAMc3i4ri_S8PYP6kQ5z1I,19919 -pip/_vendor/rich/_stack.py,sha256=-C8OK7rxn3sIUdVwxZBBpeHhIzX0eI-VM3MemYfaXm0,351 -pip/_vendor/rich/_timer.py,sha256=zelxbT6oPFZnNrwWPpc1ktUeAT-Vc4fuFcRZLQGLtMI,417 -pip/_vendor/rich/_win32_console.py,sha256=P0vxI2fcndym1UU1S37XAzQzQnkyY7YqAKmxm24_gug,22820 -pip/_vendor/rich/_windows.py,sha256=dvNl9TmfPzNVxiKk5WDFihErZ5796g2UC9-KGGyfXmk,1926 -pip/_vendor/rich/_windows_renderer.py,sha256=t74ZL3xuDCP3nmTp9pH1L5LiI2cakJuQRQleHCJerlk,2783 -pip/_vendor/rich/_wrap.py,sha256=xfV_9t0Sg6rzimmrDru8fCVmUlalYAcHLDfrJZnbbwQ,1840 -pip/_vendor/rich/abc.py,sha256=ON-E-ZqSSheZ88VrKX2M3PXpFbGEUUZPMa_Af0l-4f0,890 -pip/_vendor/rich/align.py,sha256=Ji-Yokfkhnfe_xMmr4ISjZB07TJXggBCOYoYa-HDAr8,10368 -pip/_vendor/rich/ansi.py,sha256=iD6532QYqnBm6hADulKjrV8l8kFJ-9fEVooHJHH3hMg,6906 -pip/_vendor/rich/bar.py,sha256=a7UD303BccRCrEhGjfMElpv5RFYIinaAhAuqYqhUvmw,3264 -pip/_vendor/rich/box.py,sha256=FJ6nI3jD7h2XNFU138bJUt2HYmWOlRbltoCEuIAZhew,9842 -pip/_vendor/rich/cells.py,sha256=627ztJs9zOL-38HJ7kXBerR-gT8KBfYC8UzEwMJDYYo,4509 -pip/_vendor/rich/color.py,sha256=9Gh958U3f75WVdLTeC0U9nkGTn2n0wnojKpJ6jQEkIE,18224 -pip/_vendor/rich/color_triplet.py,sha256=3lhQkdJbvWPoLDO-AnYImAWmJvV5dlgYNCVZ97ORaN4,1054 -pip/_vendor/rich/columns.py,sha256=HUX0KcMm9dsKNi11fTbiM_h2iDtl8ySCaVcxlalEzq8,7131 -pip/_vendor/rich/console.py,sha256=pDvkbLkvtZIMIwQx_jkZ-seyNl4zGBLviXoWXte9fwg,99218 -pip/_vendor/rich/constrain.py,sha256=1VIPuC8AgtKWrcncQrjBdYqA3JVWysu6jZo1rrh7c7Q,1288 -pip/_vendor/rich/containers.py,sha256=aKgm5UDHn5Nmui6IJaKdsZhbHClh_X7D-_Wg8Ehrr7s,5497 -pip/_vendor/rich/control.py,sha256=DSkHTUQLorfSERAKE_oTAEUFefZnZp4bQb4q8rHbKws,6630 -pip/_vendor/rich/default_styles.py,sha256=-Fe318kMVI_IwciK5POpThcO0-9DYJ67TZAN6DlmlmM,8082 -pip/_vendor/rich/diagnose.py,sha256=an6uouwhKPAlvQhYpNNpGq9EJysfMIOvvCbO3oSoR24,972 -pip/_vendor/rich/emoji.py,sha256=omTF9asaAnsM4yLY94eR_9dgRRSm1lHUszX20D1yYCQ,2501 -pip/_vendor/rich/errors.py,sha256=5pP3Kc5d4QJ_c0KFsxrfyhjiPVe7J1zOqSFbFAzcV-Y,642 -pip/_vendor/rich/file_proxy.py,sha256=Tl9THMDZ-Pk5Wm8sI1gGg_U5DhusmxD-FZ0fUbcU0W0,1683 -pip/_vendor/rich/filesize.py,sha256=9fTLAPCAwHmBXdRv7KZU194jSgNrRb6Wx7RIoBgqeKY,2508 -pip/_vendor/rich/highlighter.py,sha256=p3C1g4QYzezFKdR7NF9EhPbzQDvdPUhGRgSyGGEmPko,9584 -pip/_vendor/rich/json.py,sha256=EYp9ucj-nDjYDkHCV6Mk1ve8nUOpuFLaW76X50Mis2M,5032 -pip/_vendor/rich/jupyter.py,sha256=QyoKoE_8IdCbrtiSHp9TsTSNyTHY0FO5whE7jOTd9UE,3252 -pip/_vendor/rich/layout.py,sha256=RFYL6HdCFsHf9WRpcvi3w-fpj-8O5dMZ8W96VdKNdbI,14007 -pip/_vendor/rich/live.py,sha256=vZzYvu7fqwlv3Gthl2xiw1Dc_O80VlGcCV0DOHwCyDM,14273 -pip/_vendor/rich/live_render.py,sha256=zElm3PrfSIvjOce28zETHMIUf9pFYSUA5o0AflgUP64,3667 -pip/_vendor/rich/logging.py,sha256=uB-cB-3Q4bmXDLLpbOWkmFviw-Fde39zyMV6tKJ2WHQ,11903 -pip/_vendor/rich/markup.py,sha256=xzF4uAafiEeEYDJYt_vUnJOGoTU8RrH-PH7WcWYXjCg,8198 -pip/_vendor/rich/measure.py,sha256=HmrIJX8sWRTHbgh8MxEay_83VkqNW_70s8aKP5ZcYI8,5305 -pip/_vendor/rich/padding.py,sha256=kTFGsdGe0os7tXLnHKpwTI90CXEvrceeZGCshmJy5zw,4970 -pip/_vendor/rich/pager.py,sha256=SO_ETBFKbg3n_AgOzXm41Sv36YxXAyI3_R-KOY2_uSc,828 -pip/_vendor/rich/palette.py,sha256=lInvR1ODDT2f3UZMfL1grq7dY_pDdKHw4bdUgOGaM4Y,3396 -pip/_vendor/rich/panel.py,sha256=wGMe40J8KCGgQoM0LyjRErmGIkv2bsYA71RCXThD0xE,10574 -pip/_vendor/rich/pretty.py,sha256=eLEYN9xVaMNuA6EJVYm4li7HdOHxCqmVKvnOqJpyFt0,35852 -pip/_vendor/rich/progress.py,sha256=n4KF9vky8_5iYeXcyZPEvzyLplWlDvFLkM5JI0Bs08A,59706 -pip/_vendor/rich/progress_bar.py,sha256=cEoBfkc3lLwqba4XKsUpy4vSQKDh2QQ5J2J94-ACFoo,8165 -pip/_vendor/rich/prompt.py,sha256=x0mW-pIPodJM4ry6grgmmLrl8VZp99kqcmdnBe70YYA,11303 -pip/_vendor/rich/protocol.py,sha256=5hHHDDNHckdk8iWH5zEbi-zuIVSF5hbU2jIo47R7lTE,1391 -pip/_vendor/rich/region.py,sha256=rNT9xZrVZTYIXZC0NYn41CJQwYNbR-KecPOxTgQvB8Y,166 -pip/_vendor/rich/repr.py,sha256=9Z8otOmM-tyxnyTodvXlectP60lwahjGiDTrbrxPSTg,4431 -pip/_vendor/rich/rule.py,sha256=0fNaS_aERa3UMRc3T5WMpN_sumtDxfaor2y3of1ftBk,4602 -pip/_vendor/rich/scope.py,sha256=TMUU8qo17thyqQCPqjDLYpg_UU1k5qVd-WwiJvnJVas,2843 -pip/_vendor/rich/screen.py,sha256=YoeReESUhx74grqb0mSSb9lghhysWmFHYhsbMVQjXO8,1591 -pip/_vendor/rich/segment.py,sha256=XLnJEFvcV3bjaVzMNUJiem3n8lvvI9TJ5PTu-IG2uTg,24247 -pip/_vendor/rich/spinner.py,sha256=15koCmF0DQeD8-k28Lpt6X_zJQUlzEhgo_6A6uy47lc,4339 -pip/_vendor/rich/status.py,sha256=gJsIXIZeSo3urOyxRUjs6VrhX5CZrA0NxIQ-dxhCnwo,4425 -pip/_vendor/rich/style.py,sha256=3hiocH_4N8vwRm3-8yFWzM7tSwjjEven69XqWasSQwM,27073 -pip/_vendor/rich/styled.py,sha256=eZNnzGrI4ki_54pgY3Oj0T-x3lxdXTYh4_ryDB24wBU,1258 -pip/_vendor/rich/syntax.py,sha256=jgDiVCK6cpR0NmBOpZmIu-Ud4eaW7fHvjJZkDbjpcSA,35173 -pip/_vendor/rich/table.py,sha256=-WzesL-VJKsaiDU3uyczpJMHy6VCaSewBYJwx8RudI8,39684 -pip/_vendor/rich/terminal_theme.py,sha256=1j5-ufJfnvlAo5Qsi_ACZiXDmwMXzqgmFByObT9-yJY,3370 -pip/_vendor/rich/text.py,sha256=_8JBlSau0c2z8ENOZMi1hJ7M1ZGY408E4-hXjHyyg1A,45525 -pip/_vendor/rich/theme.py,sha256=belFJogzA0W0HysQabKaHOc3RWH2ko3fQAJhoN-AFdo,3777 -pip/_vendor/rich/themes.py,sha256=0xgTLozfabebYtcJtDdC5QkX5IVUEaviqDUJJh4YVFk,102 -pip/_vendor/rich/traceback.py,sha256=yCLVrCtyoFNENd9mkm2xeG3KmqkTwH9xpFOO7p2Bq0A,29604 -pip/_vendor/rich/tree.py,sha256=BMbUYNjS9uodNPfvtY_odmU09GA5QzcMbQ5cJZhllQI,9169 -pip/_vendor/six.py,sha256=TOOfQi7nFGfMrIvtdr6wX4wyHH8M7aknmuLfo2cBBrM,34549 -pip/_vendor/tenacity/__init__.py,sha256=3kvAL6KClq8GFo2KFhmOzskRKSDQI-ubrlfZ8AQEEI0,20493 -pip/_vendor/tenacity/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/tenacity/__pycache__/_asyncio.cpython-312.pyc,, -pip/_vendor/tenacity/__pycache__/_utils.cpython-312.pyc,, -pip/_vendor/tenacity/__pycache__/after.cpython-312.pyc,, -pip/_vendor/tenacity/__pycache__/before.cpython-312.pyc,, -pip/_vendor/tenacity/__pycache__/before_sleep.cpython-312.pyc,, -pip/_vendor/tenacity/__pycache__/nap.cpython-312.pyc,, -pip/_vendor/tenacity/__pycache__/retry.cpython-312.pyc,, -pip/_vendor/tenacity/__pycache__/stop.cpython-312.pyc,, -pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-312.pyc,, -pip/_vendor/tenacity/__pycache__/wait.cpython-312.pyc,, -pip/_vendor/tenacity/_asyncio.py,sha256=Qi6wgQsGa9MQibYRy3OXqcDQswIZZ00dLOoSUGN-6o8,3551 -pip/_vendor/tenacity/_utils.py,sha256=ubs6a7sxj3JDNRKWCyCU2j5r1CB7rgyONgZzYZq6D_4,2179 -pip/_vendor/tenacity/after.py,sha256=S5NCISScPeIrKwIeXRwdJl3kV9Q4nqZfnNPDx6Hf__g,1682 -pip/_vendor/tenacity/before.py,sha256=dIZE9gmBTffisfwNkK0F1xFwGPV41u5GK70UY4Pi5Kc,1562 -pip/_vendor/tenacity/before_sleep.py,sha256=YmpgN9Y7HGlH97U24vvq_YWb5deaK4_DbiD8ZuFmy-E,2372 -pip/_vendor/tenacity/nap.py,sha256=fRWvnz1aIzbIq9Ap3gAkAZgDH6oo5zxMrU6ZOVByq0I,1383 -pip/_vendor/tenacity/retry.py,sha256=jrzD_mxA5mSTUEdiYB7SHpxltjhPSYZSnSRATb-ggRc,8746 -pip/_vendor/tenacity/stop.py,sha256=YMJs7ZgZfND65PRLqlGB_agpfGXlemx_5Hm4PKnBqpQ,3086 -pip/_vendor/tenacity/tornadoweb.py,sha256=po29_F1Mt8qZpsFjX7EVwAT0ydC_NbVia9gVi7R_wXA,2142 -pip/_vendor/tenacity/wait.py,sha256=3FcBJoCDgym12_dN6xfK8C1gROY0Hn4NSI2u8xv50uE,8024 -pip/_vendor/tomli/__init__.py,sha256=JhUwV66DB1g4Hvt1UQCVMdfCu-IgAV8FXmvDU9onxd4,396 -pip/_vendor/tomli/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/tomli/__pycache__/_parser.cpython-312.pyc,, -pip/_vendor/tomli/__pycache__/_re.cpython-312.pyc,, -pip/_vendor/tomli/__pycache__/_types.cpython-312.pyc,, -pip/_vendor/tomli/_parser.py,sha256=g9-ENaALS-B8dokYpCuzUFalWlog7T-SIYMjLZSWrtM,22633 -pip/_vendor/tomli/_re.py,sha256=dbjg5ChZT23Ka9z9DHOXfdtSpPwUfdgMXnj8NOoly-w,2943 -pip/_vendor/tomli/_types.py,sha256=-GTG2VUqkpxwMqzmVO4F7ybKddIbAnuAHXfmWQcTi3Q,254 -pip/_vendor/truststore/__init__.py,sha256=qzTLSH8PvAkY1fr6QQ2vV-KwE_M83wdXugtpJaP_AbM,403 -pip/_vendor/truststore/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/truststore/__pycache__/_api.cpython-312.pyc,, -pip/_vendor/truststore/__pycache__/_macos.cpython-312.pyc,, -pip/_vendor/truststore/__pycache__/_openssl.cpython-312.pyc,, -pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-312.pyc,, -pip/_vendor/truststore/__pycache__/_windows.cpython-312.pyc,, -pip/_vendor/truststore/_api.py,sha256=xjuEu_rlH4hcdJTROImEyOEqdw-F8t5vO2H2BToY0Ro,9893 -pip/_vendor/truststore/_macos.py,sha256=BjvAKoAjXhdIPuxpY124HJIFswDb0pq8DjynzJOVwqc,17694 -pip/_vendor/truststore/_openssl.py,sha256=LLUZ7ZGaio-i5dpKKjKCSeSufmn6T8pi9lDcFnvSyq0,2324 -pip/_vendor/truststore/_ssl_constants.py,sha256=NUD4fVKdSD02ri7-db0tnO0VqLP9aHuzmStcW7tAl08,1130 -pip/_vendor/truststore/_windows.py,sha256=1x_EhROeJ9QK1sMAjfnZC7awYI8UnBJYL-TjACUYI4A,17468 -pip/_vendor/typing_extensions.py,sha256=EWpcpyQnVmc48E9fSyPGs-vXgHcAk9tQABQIxmMsCGk,111130 -pip/_vendor/urllib3/__init__.py,sha256=iXLcYiJySn0GNbWOOZDDApgBL1JgP44EZ8i1760S8Mc,3333 -pip/_vendor/urllib3/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/urllib3/__pycache__/_collections.cpython-312.pyc,, -pip/_vendor/urllib3/__pycache__/_version.cpython-312.pyc,, -pip/_vendor/urllib3/__pycache__/connection.cpython-312.pyc,, -pip/_vendor/urllib3/__pycache__/connectionpool.cpython-312.pyc,, -pip/_vendor/urllib3/__pycache__/exceptions.cpython-312.pyc,, -pip/_vendor/urllib3/__pycache__/fields.cpython-312.pyc,, -pip/_vendor/urllib3/__pycache__/filepost.cpython-312.pyc,, -pip/_vendor/urllib3/__pycache__/poolmanager.cpython-312.pyc,, -pip/_vendor/urllib3/__pycache__/request.cpython-312.pyc,, -pip/_vendor/urllib3/__pycache__/response.cpython-312.pyc,, -pip/_vendor/urllib3/_collections.py,sha256=Rp1mVyBgc_UlAcp6M3at1skJBXR5J43NawRTvW2g_XY,10811 -pip/_vendor/urllib3/_version.py,sha256=azoM7M7BUADl2kBhMVR6PPf2GhBDI90me1fcnzTwdcw,64 -pip/_vendor/urllib3/connection.py,sha256=92k9td_y4PEiTIjNufCUa1NzMB3J3w0LEdyokYgXnW8,20300 -pip/_vendor/urllib3/connectionpool.py,sha256=ItVDasDnPRPP9R8bNxY7tPBlC724nJ9nlxVgXG_SLbI,39990 -pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-312.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-312.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-312.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-312.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-312.pyc,, -pip/_vendor/urllib3/contrib/_appengine_environ.py,sha256=bDbyOEhW2CKLJcQqAKAyrEHN-aklsyHFKq6vF8ZFsmk,957 -pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-312.pyc,, -pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-312.pyc,, -pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=4Xk64qIkPBt09A5q-RIFUuDhNc9mXilVapm7WnYnzRw,17632 -pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=B2JBB2_NRP02xK6DCa1Pa9IuxrPwxzDzZbixQkb7U9M,13922 -pip/_vendor/urllib3/contrib/appengine.py,sha256=VR68eAVE137lxTgjBDwCna5UiBZTOKa01Aj_-5BaCz4,11036 -pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=NlfkW7WMdW8ziqudopjHoW299og1BTWi0IeIibquFwk,4528 -pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=hDJh4MhyY_p-oKlFcYcQaVQRDv6GMmBGuW9yjxyeejM,17081 -pip/_vendor/urllib3/contrib/securetransport.py,sha256=yhZdmVjY6PI6EeFbp7qYOp6-vp1Rkv2NMuOGaEj7pmc,34448 -pip/_vendor/urllib3/contrib/socks.py,sha256=aRi9eWXo9ZEb95XUxef4Z21CFlnnjbEiAo9HOseoMt4,7097 -pip/_vendor/urllib3/exceptions.py,sha256=0Mnno3KHTNfXRfY7638NufOPkUb6mXOm-Lqj-4x2w8A,8217 -pip/_vendor/urllib3/fields.py,sha256=kvLDCg_JmH1lLjUUEY_FLS8UhY7hBvDPuVETbY8mdrM,8579 -pip/_vendor/urllib3/filepost.py,sha256=5b_qqgRHVlL7uLtdAYBzBh-GHmU5AfJVt_2N0XS3PeY,2440 -pip/_vendor/urllib3/packages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/urllib3/packages/__pycache__/six.cpython-312.pyc,, -pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-312.pyc,, -pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-312.pyc,, -pip/_vendor/urllib3/packages/backports/makefile.py,sha256=nbzt3i0agPVP07jqqgjhaYjMmuAi_W5E0EywZivVO8E,1417 -pip/_vendor/urllib3/packages/backports/weakref_finalize.py,sha256=tRCal5OAhNSRyb0DhHp-38AtIlCsRP8BxF3NX-6rqIA,5343 -pip/_vendor/urllib3/packages/six.py,sha256=b9LM0wBXv7E7SrbCjAm4wwN-hrH-iNxv18LgWNMMKPo,34665 -pip/_vendor/urllib3/poolmanager.py,sha256=dnQHy25qCcoJZGM8zrcmuW48tHF3UO83bxvkySwtf24,20705 -pip/_vendor/urllib3/request.py,sha256=YTWFNr7QIwh7E1W9dde9LM77v2VWTJ5V78XuTTw7D1A,6691 -pip/_vendor/urllib3/response.py,sha256=fmDJAFkG71uFTn-sVSTh2Iw0WmcXQYqkbRjihvwBjU8,30641 -pip/_vendor/urllib3/util/__init__.py,sha256=JEmSmmqqLyaw8P51gUImZh8Gwg9i1zSe-DoqAitn2nc,1155 -pip/_vendor/urllib3/util/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/urllib3/util/__pycache__/connection.cpython-312.pyc,, -pip/_vendor/urllib3/util/__pycache__/proxy.cpython-312.pyc,, -pip/_vendor/urllib3/util/__pycache__/queue.cpython-312.pyc,, -pip/_vendor/urllib3/util/__pycache__/request.cpython-312.pyc,, -pip/_vendor/urllib3/util/__pycache__/response.cpython-312.pyc,, -pip/_vendor/urllib3/util/__pycache__/retry.cpython-312.pyc,, -pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-312.pyc,, -pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc,, -pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-312.pyc,, -pip/_vendor/urllib3/util/__pycache__/timeout.cpython-312.pyc,, -pip/_vendor/urllib3/util/__pycache__/url.cpython-312.pyc,, -pip/_vendor/urllib3/util/__pycache__/wait.cpython-312.pyc,, -pip/_vendor/urllib3/util/connection.py,sha256=5Lx2B1PW29KxBn2T0xkN1CBgRBa3gGVJBKoQoRogEVk,4901 -pip/_vendor/urllib3/util/proxy.py,sha256=zUvPPCJrp6dOF0N4GAVbOcl6o-4uXKSrGiTkkr5vUS4,1605 -pip/_vendor/urllib3/util/queue.py,sha256=nRgX8_eX-_VkvxoX096QWoz8Ps0QHUAExILCY_7PncM,498 -pip/_vendor/urllib3/util/request.py,sha256=C0OUt2tcU6LRiQJ7YYNP9GvPrSvl7ziIBekQ-5nlBZk,3997 -pip/_vendor/urllib3/util/response.py,sha256=GJpg3Egi9qaJXRwBh5wv-MNuRWan5BIu40oReoxWP28,3510 -pip/_vendor/urllib3/util/retry.py,sha256=6ENvOZ8PBDzh8kgixpql9lIrb2dxH-k7ZmBanJF2Ng4,22050 -pip/_vendor/urllib3/util/ssl_.py,sha256=X4-AqW91aYPhPx6-xbf66yHFQKbqqfC_5Zt4WkLX1Hc,17177 -pip/_vendor/urllib3/util/ssl_match_hostname.py,sha256=Ir4cZVEjmAk8gUAIHWSi7wtOO83UCYABY2xFD1Ql_WA,5758 -pip/_vendor/urllib3/util/ssltransport.py,sha256=NA-u5rMTrDFDFC8QzRKUEKMG0561hOD4qBTr3Z4pv6E,6895 -pip/_vendor/urllib3/util/timeout.py,sha256=cwq4dMk87mJHSBktK1miYJ-85G-3T3RmT20v7SFCpno,10168 -pip/_vendor/urllib3/util/url.py,sha256=lCAE7M5myA8EDdW0sJuyyZhVB9K_j38ljWhHAnFaWoE,14296 -pip/_vendor/urllib3/util/wait.py,sha256=fOX0_faozG2P7iVojQoE1mbydweNyTcm-hXEfFrTtLI,5403 -pip/_vendor/vendor.txt,sha256=4NKk7fQhVsZw0U-0zmm9Q2LgGyaPXacFbnJAaS0Q6EY,493 -pip/_vendor/webencodings/__init__.py,sha256=qOBJIuPy_4ByYH6W_bNgJF-qYQ2DoU-dKsDu5yRWCXg,10579 -pip/_vendor/webencodings/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/webencodings/__pycache__/labels.cpython-312.pyc,, -pip/_vendor/webencodings/__pycache__/mklabels.cpython-312.pyc,, -pip/_vendor/webencodings/__pycache__/tests.cpython-312.pyc,, -pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-312.pyc,, -pip/_vendor/webencodings/labels.py,sha256=4AO_KxTddqGtrL9ns7kAPjb0CcN6xsCIxbK37HY9r3E,8979 -pip/_vendor/webencodings/mklabels.py,sha256=GYIeywnpaLnP0GSic8LFWgd0UVvO_l1Nc6YoF-87R_4,1305 -pip/_vendor/webencodings/tests.py,sha256=OtGLyjhNY1fvkW1GvLJ_FV9ZoqC9Anyjr7q3kxTbzNs,6563 -pip/_vendor/webencodings/x_user_defined.py,sha256=yOqWSdmpytGfUgh_Z6JYgDNhoc-BAHyyeeT15Fr42tM,4307 -pip/py.typed,sha256=EBVvvPRTn_eIpz5e5QztSCdrMX7Qwd7VP93RSoIlZ2I,286 diff --git a/venv/lib/python3.12/site-packages/pip-24.0.dist-info/REQUESTED b/venv/lib/python3.12/site-packages/pip-24.0.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/pip-24.0.dist-info/WHEEL b/venv/lib/python3.12/site-packages/pip-24.0.dist-info/WHEEL deleted file mode 100644 index 98c0d20..0000000 --- a/venv/lib/python3.12/site-packages/pip-24.0.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/venv/lib/python3.12/site-packages/pip-24.0.dist-info/entry_points.txt b/venv/lib/python3.12/site-packages/pip-24.0.dist-info/entry_points.txt deleted file mode 100644 index 26fa361..0000000 --- a/venv/lib/python3.12/site-packages/pip-24.0.dist-info/entry_points.txt +++ /dev/null @@ -1,4 +0,0 @@ -[console_scripts] -pip = pip._internal.cli.main:main -pip3 = pip._internal.cli.main:main -pip3.12 = pip._internal.cli.main:main diff --git a/venv/lib/python3.12/site-packages/pip-24.0.dist-info/top_level.txt b/venv/lib/python3.12/site-packages/pip-24.0.dist-info/top_level.txt deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.12/site-packages/pip-24.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/pip/__init__.py b/venv/lib/python3.12/site-packages/pip/__init__.py deleted file mode 100644 index be0e3ed..0000000 --- a/venv/lib/python3.12/site-packages/pip/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -from typing import List, Optional - -__version__ = "24.0" - - -def main(args: Optional[List[str]] = None) -> int: - """This is an internal API only meant for use by pip's own console scripts. - - For additional details, see https://github.com/pypa/pip/issues/7498. - """ - from pip._internal.utils.entrypoints import _wrapper - - return _wrapper(args) diff --git a/venv/lib/python3.12/site-packages/pip/__main__.py b/venv/lib/python3.12/site-packages/pip/__main__.py deleted file mode 100644 index 5991326..0000000 --- a/venv/lib/python3.12/site-packages/pip/__main__.py +++ /dev/null @@ -1,24 +0,0 @@ -import os -import sys - -# Remove '' and current working directory from the first entry -# of sys.path, if present to avoid using current directory -# in pip commands check, freeze, install, list and show, -# when invoked as python -m pip <command> -if sys.path[0] in ("", os.getcwd()): - sys.path.pop(0) - -# If we are running from a wheel, add the wheel to sys.path -# This allows the usage python pip-*.whl/pip install pip-*.whl -if __package__ == "": - # __file__ is pip-*.whl/pip/__main__.py - # first dirname call strips of '/__main__.py', second strips off '/pip' - # Resulting path is the name of the wheel itself - # Add that to sys.path so we can import pip - path = os.path.dirname(os.path.dirname(__file__)) - sys.path.insert(0, path) - -if __name__ == "__main__": - from pip._internal.cli.main import main as _main - - sys.exit(_main()) diff --git a/venv/lib/python3.12/site-packages/pip/__pip-runner__.py b/venv/lib/python3.12/site-packages/pip/__pip-runner__.py deleted file mode 100644 index 49a148a..0000000 --- a/venv/lib/python3.12/site-packages/pip/__pip-runner__.py +++ /dev/null @@ -1,50 +0,0 @@ -"""Execute exactly this copy of pip, within a different environment. - -This file is named as it is, to ensure that this module can't be imported via -an import statement. -""" - -# /!\ This version compatibility check section must be Python 2 compatible. /!\ - -import sys - -# Copied from setup.py -PYTHON_REQUIRES = (3, 7) - - -def version_str(version): # type: ignore - return ".".join(str(v) for v in version) - - -if sys.version_info[:2] < PYTHON_REQUIRES: - raise SystemExit( - "This version of pip does not support python {} (requires >={}).".format( - version_str(sys.version_info[:2]), version_str(PYTHON_REQUIRES) - ) - ) - -# From here on, we can use Python 3 features, but the syntax must remain -# Python 2 compatible. - -import runpy # noqa: E402 -from importlib.machinery import PathFinder # noqa: E402 -from os.path import dirname # noqa: E402 - -PIP_SOURCES_ROOT = dirname(dirname(__file__)) - - -class PipImportRedirectingFinder: - @classmethod - def find_spec(self, fullname, path=None, target=None): # type: ignore - if fullname != "pip": - return None - - spec = PathFinder.find_spec(fullname, [PIP_SOURCES_ROOT], target) - assert spec, (PIP_SOURCES_ROOT, fullname) - return spec - - -sys.meta_path.insert(0, PipImportRedirectingFinder()) - -assert __name__ == "__main__", "Cannot run __pip-runner__.py as a non-main module" -runpy.run_module("pip", run_name="__main__", alter_sys=True) diff --git a/venv/lib/python3.12/site-packages/pip/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index fa85598e35245cde4b30ac3f371ccab0d07b2c2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 705 zcmX|9J8u**5Vm*s9^4TSk0umgXwXSy4Iu)8P$Z-X2?+(HP+hZf*3O-kUE8v~7d8Yb z1qBifT|z?*;-}C+yA2>Jx}ZRlit&*!@{DJ!@i*Ui{Ap&Uhd}ao&&N4N=tl^SrFG;S z+yZA8al~<fN<746G>kCf(J<y6o`^_bk<3C)P~H-)^@O)ywubFG9&~>OkU`WWkEHWW z_p$L(D^_eJ^9$+ql_p_!<eIh>zOpJX_%AVdK@Tp1f$Eq?q52DqQG~YfHu`v!y^03$ z*6!1>bOaVtL@F;V)FAhtJS18bH7NyCo~&z2DksQVO^h^G9nqVL<XSmh2;y=pjdy9U zM?fAxD&t)KBTKmOOcw4MaYB%>_r~3&bR_+_T1#_XQd1j70h3DSD&gqug~dDR6v#%v zet?^9wrQC$!opKrg3L5KW|>wVpi`l|t&N6LXS?A}WW)PUeHTCoIn3!;mx7key9r&^ zc~!zKN4+S-$g*<Id6{nrJIA51LNhKbod`9dg<J!Qeyr8a^u|1O(u+C6@(nfuu7P$2 zY^2Y!)YMH<GO27IDz-u088AEOPY<;gzxU6*S$@6rIhj3xL+EN{&}rJfHd2jj7?n-H zH2o}_2<u?XS=PkP+a`vtridSqJsI-CpF8Z{D>bhQv1HFe7>4NvVD@8-@mF;D+o|(A f{a@`4zVPbVUb46P_QaRdSN0La@AKbbn?n5s%>Tf2 diff --git a/venv/lib/python3.12/site-packages/pip/__pycache__/__main__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/__pycache__/__main__.cpython-312.pyc deleted file mode 100644 index e36da2dd144e0a6d10d3e82f01e7addba0bf75ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 861 zcmb7C&ubGw6n?Y2`JGfMwa`{P*o!$Ni?Nb`Vkq{|Lor@d$Yoh~rpYGzi`{MNT95{W zHhAcYVC}_TmHa7Qv{jHPLcx=_KyN)c(_~4Z_24_q`{vCz@B8L4UvjxLu+TnkG@pt9 zzxgJL*a)1wLIAsf0V4zI!;I>Ppq3O-#~H&6+h9Qe0<HMC9-;mStO^})=PvKjN=58( z#?WUjcpxA#EVOR{xR05}B_3M2A@ltDAIwCg6y>_`51*6g6^0lC5&FUqGp8vmo;kh2 zrY9L`GgHqZV6#E3*^75sJsZs@(nb)V0OezUIQ<a?np6~1)h$KIBPwx}pP+*6QPB%L zDmkj(r11vvwRKEI$98B&Q5;oks|}(kG=X*3Qcc3Utm+0Y#dXUguFos{gjJ>;-6<-% z<rBs=ikhJpxsJ>K1C5=jQ;EFL{m*d1U7c!j(>950s=n8emuzj#B$n^VJ~2qcRn3Cu z>sp(*1#GWdhOJ`a${k{LWJ7;0JAvP{tvkirCE3$`QW$ylWM)E+o?3K*)8u{A#%l(7 z;7&75{ujLWY#E3Mp(98gL3)q{DX~@QR<;+r_rg*bgzj$eHh8!3_3HdLasDSeT<$J! zt#nty$=9_(5~M5P%>!|2kcRBUPPtd!srITLO8e!#@_u!%`l)g_w{V!bySWtItaWSQ pV(5RDt{;n;?Ux7Q%r9x-Sjuib<c)hz-aPvuT^l4onsuj`wZGYIy}<wg diff --git a/venv/lib/python3.12/site-packages/pip/__pycache__/__pip-runner__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/__pycache__/__pip-runner__.cpython-312.pyc deleted file mode 100644 index ac806d7f14f708c2be734cacc891b20521a64383..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2224 zcmaJ>O-vg{6n?Y2{>QNsLm;F{HcFb}%Gf1Im8c@5YC;kc2?&rwEmf<{?id#AU1xVq zFh3GSNKK_m<xmxRsW?<sB3h}(9((V_U{uITky5pXawGAfEvLTmdIM70j<j!P_Rag| zy*J-`KS!fsz@dCSGxm)S;5WAMMyRo<*#ux2RLFu#R4z}lMCG%bDl9^lr(`_n8SKw0 zr~2A~auXbY*~J0%ss8ckzTR7*=6?~^@MbpZ=QwY-hNx_K`vp?>E07J~9LNU?p=^jS zUxWE@A(D*{W*=c6ZSriqIUD8RCa9rBP{ST>_7FyO(!JxL96x<<=dM+PxQEsn3J-w* zJ*-A1IsmM|ZBUy${Q^537(e?jI8imC9{Mh}#=ANKWiA<?{<e3DDkYnWbV^q2d|9-| zG)q*BVp%kDVo@um#D^OG(?wZSwOo#xRJTQ{Pim&27jT^phew!6PRmmfXI(B(Rg^7J zvvHdeZ39nRC6gkuY`gFULoMNHMb_W4#rtShC>o}XW|Nv6mi5M7v~1a??j1YK>HZ|Q z!@S=Kpimkw#}pvo$27I`D3D2H{Gb;9v7vH{Fbmhg%a!*+!;s|r_elCR#0zLtN4x_B zQD@<!7{DB1Y<0&h@i4w5%Y?vZhXp9Z_xwYWB>hR^@Rn^RIfqNX<B&;<kxCTzw9J@M zpqYYfTa%gVhEie?S{a+>>8L3eIxSmMCaBq|8V~inA*<BPOk%z>dF_6tShmLu{X)9y ze8$pj+F6v933-%S8GNXWB%$myOS(=?NlF*Xd!g=8s?({W*)x4|lA4xg=n}e=?#>&E zoVR+?uk>;B&1y#R2mCb;8;R7)gD<YFkmVceiPYZ~OYcHUD@NrA<A$c=9BANKEE%F1 zLFq&e++kv>fPGdgih0<M9Qyq7r<W0K_2y<GRgI)7LaK%;*kO5@zFH?y1E4`YQ8g$M z%CJSNRAdYh-T1|sIkCf}4@#Pe`kpH@bICNi6dsiAu^XC>8DkErn#s7RusgiLIKoDa z72h&Yz)k~Mj`Avx>>wU9vO<|81*d&bEB4i?IYbeSDz>JNx)<~-EGOQ;#^%y*3>Qcg zY!?%kurZM`?2~1@(NsJmHqR3K70xJ`<-OvZ6J`Y~dK>n&vn0oP?k$j60ZGgCJ3PL4 zk~fbaloQHf=#o{WiW48~8<d6z?hRe*9hQa$21b%TN3du<=LB=5e4eGn5sH{C$8XE# zD78_Gb{306WTXC`W*cs&&;EB3(ywlO6Hi)KP|U;gNMfn95qV=f(fWJr*jDV!dhE>V zt<B8UO8Whu&Q)W5kA$bOL?zg@dGy@lV5Oz28ti&xZ^sgkA|_)YhSiVm1|^BPDM?OP zlH7iQ>n2HhP?GBb;4Y%%Wy>m1tO>R5>=UR%xZbxQn90Oh{Oa6Zgl%8^CFl1w*Ld(B ze!*6*0XxR7EXbNJNz+}|WS!9tYe{^qs#tH6k(GKUJ1x4tnT+KlSnENwseA5(<h+fA zXqByG!U;%{YAEP4k9#LJ_~FQ{fqrSI_wK#Eq2A$ou{cd$`Dl91aKgi73%g(Mlx92r zoMB?WaC`_}EISFeUt&W@7i0x{Gd0UD2LgtbX76ey8UeAcEJ@}u+}3m9gfLyQ<i5S8 zThz48Q|xS*`Q3=+3_H!<qMpdTV7L3f$GnLDSiM^n6uUej<OL@Xp%w=c+4V!>*nI4z zpODVoAP9jiKC#XxmOfazTj5(*G8=sIX}Ebi*tZoNTn`RDZE9WNx7s?^+d3W}d3?Ik zmZ~;&KAHLPYBh7G#&e-?jTa*RT@ZZ!+7TepXYlqjIR0y*{i{o>m#fE9)kJ3n;(z*s zr1=G)*gXnF_$2yqbPJl-p?T@<dfWMG+r>?I_jw?;^xj6`L<NQ_r-rI111Gj2KJVLt T_&UUwT2|YCuz!K>dc^+#4Qed0 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/__init__.py b/venv/lib/python3.12/site-packages/pip/_internal/__init__.py deleted file mode 100644 index 96c6b88..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/__init__.py +++ /dev/null @@ -1,18 +0,0 @@ -from typing import List, Optional - -from pip._internal.utils import _log - -# init_logging() must be called before any call to logging.getLogger() -# which happens at import of most modules. -_log.init_logging() - - -def main(args: (Optional[List[str]]) = None) -> int: - """This is preserved for old console scripts that may still be referencing - it. - - For additional details, see https://github.com/pypa/pip/issues/7498. - """ - from pip._internal.utils.entrypoints import _wrapper - - return _wrapper(args) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 78d30c511930bf5c9e4ff19cf02a5dce7a34db69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 807 zcmZuvJ8u**5Vm*sE}NG`NSaW95i}=}wE{>X2&IasP$;0f=5Tf=dnUVU%l2J#5Tq1z zH0cOUdX$F$K|>@Yq-_vF6m&s>CKcn&g^H0q4{ILZ%=qK%>=Z#t4`24ffROLrxS-Zp zIemu8TauBC7Nn$IS_a*KdOIk>GU`T@1O%ezO{R<Bb9pp2(R(6`AOH&OMSSx&Yr(`; zl(k>Cy74IN#6P`nC#a)G(z-f+tesSqC_1!`dWFh2>PVQ})@=iBV5*dQ_c4Vi{XM;k z43SbqhDcvgk8GFjlB2Qr6VeG^96s$!%kXFe7R(SbwxtYHMaEK9SyceDsgc@Q=K8|1 zQjC~&vMAUlFauj)ph{(xPcbCvlBq^{h$%#t$#c{!11Dr*Z!rtN`p#*4pYvS0{$Mjn zRmt^83$CT+(%J!7zH)c<UeY8oxCeq=$GsgRv<8DSxrUxePgV{LjwBf%8k<1n%t$MI zwPw=C1g4Fm(XCIy*jdT@ssvsNXNP=UrGpZqEO$^qZbZ3+eWlxAmNK<d6-s1a_z<cg zFXSddbbVFbNtSPOD;+Fpk#36|v3l75!0;Zb()D_Y9@SAPWMyWsw*L%v4%r_0GecUd z-=^pH*WavtiWX1t5&PTdOxA5T(l|)tcV{AG_56PtHU1;kGffrz2suX7p>?JXvGu0d zdtzpNifLqL@q<!jg96sf0-ApDb_Ll<NGbhFuKyr6PhvtZ??qq8+%cK^Oy+;JV|ryj XK3F(N-z^?rx^Y6#{t*85qDlN0Nl@3K diff --git a/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/build_env.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/build_env.cpython-312.pyc deleted file mode 100644 index 1dec3b65797dd5e85f41a5d5ca6971600902bbe7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14314 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 QlkF{ZJo6<3F&*^(1DYwfBme*a diff --git a/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/cache.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/cache.cpython-312.pyc deleted file mode 100644 index 0cba94894ee3df4cb044c2364ebb50d935bb1ce1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12685 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/configuration.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/configuration.cpython-312.pyc deleted file mode 100644 index 9951c9216ef8acc50d72283d3a9f4962b538c9d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17686 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/exceptions.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/exceptions.cpython-312.pyc deleted file mode 100644 index 8014ef96f4805e57444613434806e0348ecc5640..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33304 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 Sx#*xM*5V+XPXvlEK>h!#Uy2q0 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/main.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/main.cpython-312.pyc deleted file mode 100644 index 9bdb51a3c8ac784ab859863c1a18879ca9d48707..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 690 zcmX|9J#Q2-5Vd#rjw2sJh$<9d5Y0(sEfORMLa8Du6pEy}CUVwuw^nx7*4TI9AV?Gx zNHlbWCN+qkLIdqK2vN}m1)5ZhkC4%N_W5JpyczrR;^G`5D~_I*+nli<aq{0fXW(Ro zz&oay<`t{?fY-?&;Y@dR3JGvXmuNo@ok2FtbmvuP(3vLv3qK=4KWVea#)r1|#06s; zRc*GJ!jW&g2w{v(L3z(DB^1ZWHFA`b>m=rU!8uFV0Y6}$&Q5Q!e){ZayEI<V=MX&L z1hg1h6t>c$u#LAB2w$La!HZC;AZj%gKA5T!yC4vTfY21C8O;eY6Y{wkctjLRYx7U7 z&=8cV{B7X@L>Yqf52PHKP>y%=!q(DFos!NtX}lkUm-p_j-Op!4m{1XY-u8C(Q8@=l zy|_*%^BvO!Kx#!kCN(~XCg9XrTJ_kAF$u=z&#;dqLYx{|+8Si7f}h9@Ta0Up@-jdL zBUJS=)m7{PE^E8rR90y~Ie}&(E3-=yLus4U{LYH>Ccv^&#hx0G)+qa23~`$#chfeD z0Ou)hM#Enw_mcftV4bz^^H<((yjlN}EuGLJ)wbF1w%ssw)I^N;hB2Z|eZV%Qa%LnS z87{=F_|i^$4{NK(6|7^VjhE?fkvmQ~=ik_kU)>(R`ugc%cDVKa;@3+zj~UHB6u;wd G#_|{Q=)5ri diff --git a/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/pyproject.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/pyproject.cpython-312.pyc deleted file mode 100644 index f09bcc3454ac2a19cc442d4d9ececeb3bcdc5e7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4991 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc deleted file mode 100644 index f03e2ca723a5bd782e32aac7f640f2ad90e415b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10572 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-312.pyc deleted file mode 100644 index 0d2ef8619be6bda99988c76647f030b320e28f59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13669 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 MRo!<&j#A$L0lex;iU0rr diff --git a/venv/lib/python3.12/site-packages/pip/_internal/build_env.py b/venv/lib/python3.12/site-packages/pip/_internal/build_env.py deleted file mode 100644 index 4f704a3..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/build_env.py +++ /dev/null @@ -1,311 +0,0 @@ -"""Build Environment used for isolation during sdist building -""" - -import logging -import os -import pathlib -import site -import sys -import textwrap -from collections import OrderedDict -from types import TracebackType -from typing import TYPE_CHECKING, Iterable, List, Optional, Set, Tuple, Type, Union - -from pip._vendor.certifi import where -from pip._vendor.packaging.requirements import Requirement -from pip._vendor.packaging.version import Version - -from pip import __file__ as pip_location -from pip._internal.cli.spinners import open_spinner -from pip._internal.locations import get_platlib, get_purelib, get_scheme -from pip._internal.metadata import get_default_environment, get_environment -from pip._internal.utils.subprocess import call_subprocess -from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds - -if TYPE_CHECKING: - from pip._internal.index.package_finder import PackageFinder - -logger = logging.getLogger(__name__) - - -def _dedup(a: str, b: str) -> Union[Tuple[str], Tuple[str, str]]: - return (a, b) if a != b else (a,) - - -class _Prefix: - def __init__(self, path: str) -> None: - self.path = path - self.setup = False - scheme = get_scheme("", prefix=path) - self.bin_dir = scheme.scripts - self.lib_dirs = _dedup(scheme.purelib, scheme.platlib) - - -def get_runnable_pip() -> str: - """Get a file to pass to a Python executable, to run the currently-running pip. - - This is used to run a pip subprocess, for installing requirements into the build - environment. - """ - source = pathlib.Path(pip_location).resolve().parent - - if not source.is_dir(): - # This would happen if someone is using pip from inside a zip file. In that - # case, we can use that directly. - return str(source) - - return os.fsdecode(source / "__pip-runner__.py") - - -def _get_system_sitepackages() -> Set[str]: - """Get system site packages - - Usually from site.getsitepackages, - but fallback on `get_purelib()/get_platlib()` if unavailable - (e.g. in a virtualenv created by virtualenv<20) - - Returns normalized set of strings. - """ - if hasattr(site, "getsitepackages"): - system_sites = site.getsitepackages() - else: - # virtualenv < 20 overwrites site.py without getsitepackages - # fallback on get_purelib/get_platlib. - # this is known to miss things, but shouldn't in the cases - # where getsitepackages() has been removed (inside a virtualenv) - system_sites = [get_purelib(), get_platlib()] - return {os.path.normcase(path) for path in system_sites} - - -class BuildEnvironment: - """Creates and manages an isolated environment to install build deps""" - - def __init__(self) -> None: - temp_dir = TempDirectory(kind=tempdir_kinds.BUILD_ENV, globally_managed=True) - - self._prefixes = OrderedDict( - (name, _Prefix(os.path.join(temp_dir.path, name))) - for name in ("normal", "overlay") - ) - - self._bin_dirs: List[str] = [] - self._lib_dirs: List[str] = [] - for prefix in reversed(list(self._prefixes.values())): - self._bin_dirs.append(prefix.bin_dir) - self._lib_dirs.extend(prefix.lib_dirs) - - # Customize site to: - # - ensure .pth files are honored - # - prevent access to system site packages - system_sites = _get_system_sitepackages() - - self._site_dir = os.path.join(temp_dir.path, "site") - if not os.path.exists(self._site_dir): - os.mkdir(self._site_dir) - with open( - os.path.join(self._site_dir, "sitecustomize.py"), "w", encoding="utf-8" - ) as fp: - fp.write( - textwrap.dedent( - """ - import os, site, sys - - # First, drop system-sites related paths. - original_sys_path = sys.path[:] - known_paths = set() - for path in {system_sites!r}: - site.addsitedir(path, known_paths=known_paths) - system_paths = set( - os.path.normcase(path) - for path in sys.path[len(original_sys_path):] - ) - original_sys_path = [ - path for path in original_sys_path - if os.path.normcase(path) not in system_paths - ] - sys.path = original_sys_path - - # Second, add lib directories. - # ensuring .pth file are processed. - for path in {lib_dirs!r}: - assert not path in sys.path - site.addsitedir(path) - """ - ).format(system_sites=system_sites, lib_dirs=self._lib_dirs) - ) - - def __enter__(self) -> None: - self._save_env = { - name: os.environ.get(name, None) - for name in ("PATH", "PYTHONNOUSERSITE", "PYTHONPATH") - } - - path = self._bin_dirs[:] - old_path = self._save_env["PATH"] - if old_path: - path.extend(old_path.split(os.pathsep)) - - pythonpath = [self._site_dir] - - os.environ.update( - { - "PATH": os.pathsep.join(path), - "PYTHONNOUSERSITE": "1", - "PYTHONPATH": os.pathsep.join(pythonpath), - } - ) - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - for varname, old_value in self._save_env.items(): - if old_value is None: - os.environ.pop(varname, None) - else: - os.environ[varname] = old_value - - def check_requirements( - self, reqs: Iterable[str] - ) -> Tuple[Set[Tuple[str, str]], Set[str]]: - """Return 2 sets: - - conflicting requirements: set of (installed, wanted) reqs tuples - - missing requirements: set of reqs - """ - missing = set() - conflicting = set() - if reqs: - env = ( - get_environment(self._lib_dirs) - if hasattr(self, "_lib_dirs") - else get_default_environment() - ) - for req_str in reqs: - req = Requirement(req_str) - # We're explicitly evaluating with an empty extra value, since build - # environments are not provided any mechanism to select specific extras. - if req.marker is not None and not req.marker.evaluate({"extra": ""}): - continue - dist = env.get_distribution(req.name) - if not dist: - missing.add(req_str) - continue - if isinstance(dist.version, Version): - installed_req_str = f"{req.name}=={dist.version}" - else: - installed_req_str = f"{req.name}==={dist.version}" - if not req.specifier.contains(dist.version, prereleases=True): - conflicting.add((installed_req_str, req_str)) - # FIXME: Consider direct URL? - return conflicting, missing - - def install_requirements( - self, - finder: "PackageFinder", - requirements: Iterable[str], - prefix_as_string: str, - *, - kind: str, - ) -> None: - prefix = self._prefixes[prefix_as_string] - assert not prefix.setup - prefix.setup = True - if not requirements: - return - self._install_requirements( - get_runnable_pip(), - finder, - requirements, - prefix, - kind=kind, - ) - - @staticmethod - def _install_requirements( - pip_runnable: str, - finder: "PackageFinder", - requirements: Iterable[str], - prefix: _Prefix, - *, - kind: str, - ) -> None: - args: List[str] = [ - sys.executable, - pip_runnable, - "install", - "--ignore-installed", - "--no-user", - "--prefix", - prefix.path, - "--no-warn-script-location", - ] - if logger.getEffectiveLevel() <= logging.DEBUG: - args.append("-v") - for format_control in ("no_binary", "only_binary"): - formats = getattr(finder.format_control, format_control) - args.extend( - ( - "--" + format_control.replace("_", "-"), - ",".join(sorted(formats or {":none:"})), - ) - ) - - index_urls = finder.index_urls - if index_urls: - args.extend(["-i", index_urls[0]]) - for extra_index in index_urls[1:]: - args.extend(["--extra-index-url", extra_index]) - else: - args.append("--no-index") - for link in finder.find_links: - args.extend(["--find-links", link]) - - for host in finder.trusted_hosts: - args.extend(["--trusted-host", host]) - if finder.allow_all_prereleases: - args.append("--pre") - if finder.prefer_binary: - args.append("--prefer-binary") - args.append("--") - args.extend(requirements) - extra_environ = {"_PIP_STANDALONE_CERT": where()} - with open_spinner(f"Installing {kind}") as spinner: - call_subprocess( - args, - command_desc=f"pip subprocess to install {kind}", - spinner=spinner, - extra_environ=extra_environ, - ) - - -class NoOpBuildEnvironment(BuildEnvironment): - """A no-op drop-in replacement for BuildEnvironment""" - - def __init__(self) -> None: - pass - - def __enter__(self) -> None: - pass - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - pass - - def cleanup(self) -> None: - pass - - def install_requirements( - self, - finder: "PackageFinder", - requirements: Iterable[str], - prefix_as_string: str, - *, - kind: str, - ) -> None: - raise NotImplementedError() diff --git a/venv/lib/python3.12/site-packages/pip/_internal/cache.py b/venv/lib/python3.12/site-packages/pip/_internal/cache.py deleted file mode 100644 index f45ac23..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/cache.py +++ /dev/null @@ -1,290 +0,0 @@ -"""Cache Management -""" - -import hashlib -import json -import logging -import os -from pathlib import Path -from typing import Any, Dict, List, Optional - -from pip._vendor.packaging.tags import Tag, interpreter_name, interpreter_version -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.exceptions import InvalidWheelFilename -from pip._internal.models.direct_url import DirectUrl -from pip._internal.models.link import Link -from pip._internal.models.wheel import Wheel -from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds -from pip._internal.utils.urls import path_to_url - -logger = logging.getLogger(__name__) - -ORIGIN_JSON_NAME = "origin.json" - - -def _hash_dict(d: Dict[str, str]) -> str: - """Return a stable sha224 of a dictionary.""" - s = json.dumps(d, sort_keys=True, separators=(",", ":"), ensure_ascii=True) - return hashlib.sha224(s.encode("ascii")).hexdigest() - - -class Cache: - """An abstract class - provides cache directories for data from links - - :param cache_dir: The root of the cache. - """ - - def __init__(self, cache_dir: str) -> None: - super().__init__() - assert not cache_dir or os.path.isabs(cache_dir) - self.cache_dir = cache_dir or None - - def _get_cache_path_parts(self, link: Link) -> List[str]: - """Get parts of part that must be os.path.joined with cache_dir""" - - # We want to generate an url to use as our cache key, we don't want to - # just re-use the URL because it might have other items in the fragment - # and we don't care about those. - key_parts = {"url": link.url_without_fragment} - if link.hash_name is not None and link.hash is not None: - key_parts[link.hash_name] = link.hash - if link.subdirectory_fragment: - key_parts["subdirectory"] = link.subdirectory_fragment - - # Include interpreter name, major and minor version in cache key - # to cope with ill-behaved sdists that build a different wheel - # depending on the python version their setup.py is being run on, - # and don't encode the difference in compatibility tags. - # https://github.com/pypa/pip/issues/7296 - key_parts["interpreter_name"] = interpreter_name() - key_parts["interpreter_version"] = interpreter_version() - - # Encode our key url with sha224, we'll use this because it has similar - # security properties to sha256, but with a shorter total output (and - # thus less secure). However the differences don't make a lot of - # difference for our use case here. - hashed = _hash_dict(key_parts) - - # We want to nest the directories some to prevent having a ton of top - # level directories where we might run out of sub directories on some - # FS. - parts = [hashed[:2], hashed[2:4], hashed[4:6], hashed[6:]] - - return parts - - def _get_candidates(self, link: Link, canonical_package_name: str) -> List[Any]: - can_not_cache = not self.cache_dir or not canonical_package_name or not link - if can_not_cache: - return [] - - path = self.get_path_for_link(link) - if os.path.isdir(path): - return [(candidate, path) for candidate in os.listdir(path)] - return [] - - def get_path_for_link(self, link: Link) -> str: - """Return a directory to store cached items in for link.""" - raise NotImplementedError() - - def get( - self, - link: Link, - package_name: Optional[str], - supported_tags: List[Tag], - ) -> Link: - """Returns a link to a cached item if it exists, otherwise returns the - passed link. - """ - raise NotImplementedError() - - -class SimpleWheelCache(Cache): - """A cache of wheels for future installs.""" - - def __init__(self, cache_dir: str) -> None: - super().__init__(cache_dir) - - def get_path_for_link(self, link: Link) -> str: - """Return a directory to store cached wheels for link - - Because there are M wheels for any one sdist, we provide a directory - to cache them in, and then consult that directory when looking up - cache hits. - - We only insert things into the cache if they have plausible version - numbers, so that we don't contaminate the cache with things that were - not unique. E.g. ./package might have dozens of installs done for it - and build a version of 0.0...and if we built and cached a wheel, we'd - end up using the same wheel even if the source has been edited. - - :param link: The link of the sdist for which this will cache wheels. - """ - parts = self._get_cache_path_parts(link) - assert self.cache_dir - # Store wheels within the root cache_dir - return os.path.join(self.cache_dir, "wheels", *parts) - - def get( - self, - link: Link, - package_name: Optional[str], - supported_tags: List[Tag], - ) -> Link: - candidates = [] - - if not package_name: - return link - - canonical_package_name = canonicalize_name(package_name) - for wheel_name, wheel_dir in self._get_candidates(link, canonical_package_name): - try: - wheel = Wheel(wheel_name) - except InvalidWheelFilename: - continue - if canonicalize_name(wheel.name) != canonical_package_name: - logger.debug( - "Ignoring cached wheel %s for %s as it " - "does not match the expected distribution name %s.", - wheel_name, - link, - package_name, - ) - continue - if not wheel.supported(supported_tags): - # Built for a different python/arch/etc - continue - candidates.append( - ( - wheel.support_index_min(supported_tags), - wheel_name, - wheel_dir, - ) - ) - - if not candidates: - return link - - _, wheel_name, wheel_dir = min(candidates) - return Link(path_to_url(os.path.join(wheel_dir, wheel_name))) - - -class EphemWheelCache(SimpleWheelCache): - """A SimpleWheelCache that creates it's own temporary cache directory""" - - def __init__(self) -> None: - self._temp_dir = TempDirectory( - kind=tempdir_kinds.EPHEM_WHEEL_CACHE, - globally_managed=True, - ) - - super().__init__(self._temp_dir.path) - - -class CacheEntry: - def __init__( - self, - link: Link, - persistent: bool, - ): - self.link = link - self.persistent = persistent - self.origin: Optional[DirectUrl] = None - origin_direct_url_path = Path(self.link.file_path).parent / ORIGIN_JSON_NAME - if origin_direct_url_path.exists(): - try: - self.origin = DirectUrl.from_json( - origin_direct_url_path.read_text(encoding="utf-8") - ) - except Exception as e: - logger.warning( - "Ignoring invalid cache entry origin file %s for %s (%s)", - origin_direct_url_path, - link.filename, - e, - ) - - -class WheelCache(Cache): - """Wraps EphemWheelCache and SimpleWheelCache into a single Cache - - This Cache allows for gracefully degradation, using the ephem wheel cache - when a certain link is not found in the simple wheel cache first. - """ - - def __init__(self, cache_dir: str) -> None: - super().__init__(cache_dir) - self._wheel_cache = SimpleWheelCache(cache_dir) - self._ephem_cache = EphemWheelCache() - - def get_path_for_link(self, link: Link) -> str: - return self._wheel_cache.get_path_for_link(link) - - def get_ephem_path_for_link(self, link: Link) -> str: - return self._ephem_cache.get_path_for_link(link) - - def get( - self, - link: Link, - package_name: Optional[str], - supported_tags: List[Tag], - ) -> Link: - cache_entry = self.get_cache_entry(link, package_name, supported_tags) - if cache_entry is None: - return link - return cache_entry.link - - def get_cache_entry( - self, - link: Link, - package_name: Optional[str], - supported_tags: List[Tag], - ) -> Optional[CacheEntry]: - """Returns a CacheEntry with a link to a cached item if it exists or - None. The cache entry indicates if the item was found in the persistent - or ephemeral cache. - """ - retval = self._wheel_cache.get( - link=link, - package_name=package_name, - supported_tags=supported_tags, - ) - if retval is not link: - return CacheEntry(retval, persistent=True) - - retval = self._ephem_cache.get( - link=link, - package_name=package_name, - supported_tags=supported_tags, - ) - if retval is not link: - return CacheEntry(retval, persistent=False) - - return None - - @staticmethod - def record_download_origin(cache_dir: str, download_info: DirectUrl) -> None: - origin_path = Path(cache_dir) / ORIGIN_JSON_NAME - if origin_path.exists(): - try: - origin = DirectUrl.from_json(origin_path.read_text(encoding="utf-8")) - except Exception as e: - logger.warning( - "Could not read origin file %s in cache entry (%s). " - "Will attempt to overwrite it.", - origin_path, - e, - ) - else: - # TODO: use DirectUrl.equivalent when - # https://github.com/pypa/pip/pull/10564 is merged. - if origin.url != download_info.url: - logger.warning( - "Origin URL %s in cache entry %s does not match download URL " - "%s. This is likely a pip bug or a cache corruption issue. " - "Will overwrite it with the new value.", - origin.url, - cache_dir, - download_info.url, - ) - origin_path.write_text(download_info.to_json(), encoding="utf-8") diff --git a/venv/lib/python3.12/site-packages/pip/_internal/cli/__init__.py b/venv/lib/python3.12/site-packages/pip/_internal/cli/__init__.py deleted file mode 100644 index e589bb9..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/cli/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -"""Subpackage containing all of pip's command line interface related code -""" - -# This file intentionally does not import submodules diff --git a/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 1698b071f93cee0dd7a6cb278143817d04f5508b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 298 zcmXw#F-`+95JlG^f+$k%;0~qOjDQwVA<@y$(O8Z>*|lPijqP2u&~gVldd|WPXt@9) zT`IgN{AT{2Ddx?5EEe;sNWDF`FQtBs;a}`vcC%t$D_z}J16xj>Ztl8ukZLO%<jPZ) zh72`aTFd>02NO<H={qM$b885>p^R}O74nEyX4GY@aeljGpC>|SuY`E7cH_4F1GL^D zIGIxq*IsoFDJRHiv5C^vDI2xLSZn`C)=P~MdZZq#Swk3d>*->3b`Hs8tPhL{3KEDv r2$B|*H6ThfS%_5__Onapb!YJ^9v6b~=rsQ1`-n02Ghu8RrzQRZ?yg$f diff --git a/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc deleted file mode 100644 index a707387f11169482078a942d2395102ce5e35056..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8485 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 Cte~U- diff --git a/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-312.pyc deleted file mode 100644 index 0ef801a985d40d5ca6f3baf40a9f15826cc2da4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10475 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc deleted file mode 100644 index d24e382dc86b46ebdc46554a5fe81839be649fe7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30394 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-312.pyc deleted file mode 100644 index 042bbcccd4ff46a9788da5da3f6346535e79f008..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1801 zcmZ`(O>Ep$5Pr{p>rHp-q?@!Qq9|$7Dvp%61w{gcP__-N0I@>p3RH8jjQx_hwY|%; zlkA2ZqAC(w3678=ByLEBz=c!A1$ySPTT&%5l^VnaZc8JSs&HVQy}M1K@FdThnKy4d z^UcirIh*Z5u&ggXoRfHjerG~^2`y&lZD7`rjcn{959`?DbPh9_b9qnD1y9sPPtqlf zI7B3yw}o%TbuPKBr#N&O+0rVqQyraLmDTj0%s}O$^lKF-yb_w$_2{To@<UPyJ<~U5 z303*%=*2|yR-%d0mx)iP8J1|2Dpt$n9g{|!Q7o!BN?WA`lRBm!TFI{y+R0)X<c}Z^ zf^=*nowHLlG=pt!HKX%HurU#B{u!{D;cQ`5Sa12zC0isZBC`{)k!J+RMbOhVRKa@J z6{N~h?qbP<i0yW$PUUq!k|+u1sc+$yAGQI&@wZa|=2N_eLZ*$^O}vag5fN(t7T^Vq z(E<^nFx9qfTfk{MHB<#03zt+e5`+0Np^<DDj_-tq5p@G&cqWh*w3G!AW%ucz2tq*I znJ8@-mTLxqVFc{Y11nD|+FZ#anrDW=f;LsM<~`zvfff>%%u>@E3qr@bPUx6jTJ+tL zX%ng~5Pv~)o%gkJHJmH?FN~jmUJIO%jFq9pP}V>zJ7o>x3JLX1SF>D4vl0Z`L5`QJ zRDl4No;?KG@pf`DSOfz=9<QJWa`tAbA)nlk`?m(p)PxQB)PqxJzj&`E+?V@zzy_&& zp-|XY4hghF@a^0N@+QL28_Vb#@CO&=-at2ST#(LDn%Q>B(@~=d@MELT_%$3)2=MK$ z2bqJSbxf=9^YbXci!e)9;TA?8_f+_+Xb}$`uv|om{yTmVLmI_PDo4A)5A6Y>VtNd= zfHm3x?FAZT_7;3;;4lpLT4dSvcY*xDklfCl*vyUG%Z=3Kk-9RnJun=j+2n-u=vGhP zX3tQgXXr14v&Vn!?%U;IZ%XLQXl?3#W^gyfM0WPiQ{}(GIQYJCJbw&-p2<t-EAeIi z8yT4IWl;Sf=K0i*DG={U>Ab?<Rd~=w-K};t%CxlLKwDXRvF;2~5j_82)q=Qchgazu zjM~AqjMrPk3R8^>D*qJYC<|RrXuCZDeg-)`2_zYm1bEsHilxEB@ZNVnzNdoi3ffX~ zo67J#Ww<U6*OlRICJr`~!A(VLC|dp8<S$CTF6U_<Si^5KuocuJY`}ffBQW4yhT)a$ zd6)4S!}ws{bd!^KfGB$+C~I_jf)SQBWpfjU3eP|??-p@g!+=i8!BN~vlW`}}Bg~W$ z_WT4>KpwB6zd2r1n_WoiZE~_WddsPgyx4f|rAG*a9lot@_VVHdeA~Y>-58&2A}0Ja zy&LawHnH1+nvS|!rG_UXew^Z%BPpzw9e*~7I8K0tki^ac`Whu(Si?V&Ur8`{m7WHX qRWUdVq{(B9AEI*)(L@7H{3d2<#aqP<@$?F}EA`?F_z_|>_VXVt)SPSp diff --git a/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main.cpython-312.pyc deleted file mode 100644 index 986fc8da5521caad895a683cb2f1527206ad4b52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2318 zcma)7O>7fK6rTOF*FUin6PyqTIKe>}WV<Oy6qHubCaO@QfZ)(#Rk9ZE;H=pnYj*PE z)PWp0Bob1%)u^=em?|84Yfn`{RI1cVA|eHCh>8R~a0`%16<qpeoy`KhbR_$I^Szlj zZ{EE3_K%j9FoIF~?yFH0LFfsacthF(FMk2>HBwOlshrB|T!C{XU*KIS6a-g_1<{pK zK>{i00V7xl8gfDA*gjDY8R0_M#gZN|qJ^l71A2=QE5uwJ)Z<2Lq1DB*-ex2U2@dfH z^OXahQ@+IQi(GS7*r`U<5SDQeCwBqGergzZToTpDHL1{9<1;N&sk1~g6jDnm)vB(Q z6slQf3Y(PFs+MNbT=*F?Hj?2TaagmdBcG|VC5oQmoTxHJt&(L_bxbkLTdE4NaS<3p zF;yU9C4v?DCL^EKszZcW1hf$qR|#$&>4*v`+fIOBI!4UW)(zOvh{aog-^&G_#k-DX zc2LH<qXOK!1EPw$&@`gnOQA~O-8B#ip2{Ap3U|asb_NU%QF!s@s6;*F%f&4S>*5~k zb0I|AJhqO!m-rIAoaUx^(C+iJm6V5kN%wlV((55#s)5C=+rrt0J^m`E%2)YubSLC# zr=_}7$$ENU)_KpL^JqV!2~U$o#GDr1h-tg0@nxmM#~xCpy6_G9cH1g=<*88Rf7+m( z-j+(2hkWVz3zoMtqO!-=dr0N{l^38Qr-duR^`Dw@f}22-!UZ(J!JYm1roFwsggB(8 zMY>&6m5i_RkQ%IuUYt4Po+Vxpum28bf%MPHgh!q+mz{uCHZ6ju;<-cB%jF`$wlzjd z*v<$}Kq;|Oa%3n0T((Hf2^f|-rsJvL(7AJG&Yeg(XsYit+pn4B6lP_U>a$Z5qu5N@ zm{P{-R!M;!;cQm3EgcN8x|6qYha=cE+pVr~N1jlK37c#uc1hDICfoDGpkIogHy4o* zb3dt>HdS=JxV5yXTjer%!b*#<sv@k2oPbSLU>#|KXcRlVWjjG#GqH`Uj)*5U>I9mO zIw5d;3kHTiDV`c0b|kkUuocX-BdPe}SeXQwUC~f9GZP@J8$+B7wP-2^ZX&l~2zavO zaM%fMH65Gzlyb)_BR^^xIBzJ_9?uV2r7;8gnw_Uu$7P}zS(|F5%a~+UYr@nm1ul>u z$L4rm*DmI(H9BgUM{@n|=WV!AwyKmaD`jlwt6DW*gvN*o^uT;c*TBAJ=BhQ)2PeCK zIRG|vcQk_@1|u`|NAbk`<lJO~Yw)x6S#dLpq?T22_p-SAVZ39d_vq4xBYz9L6xa+S zsdZI6uq+-}5f45UTd$35h?3O)sQb{u(Ffh{Ez4cA@{NNVt)g^_dnCtJ<<4cf^H%b9 z_s#AFenmdKDWiCI<BK2n{MxzHe|jbM+03VpBZ>Kexq*iKAkwoW_WZNijiT)@kN{TY z$b5J%+%(cS_WhCX`x^UJ<jh<At;FrFn_Vk%nz8bne4}kXG8cKh5d;ITHxnr8T7Q9f z@aU-=n~%;#mv#>PtgOl>m*tbMHzcNbW%olw?zY7~PNTc2^x$4}FC7}(E!@kVN)IN5 z`$-8V_xJ7?Y7_4FCx@cKZ&3+wh8xN3a)QO8YL$vb!Wt(e732tHFkwxAupUE_j1SOS zmC>w+6Ol0~c&Oa=L*?M1a&LUCpzPcfcDnz&jJ;>k{gM$k!=2<iYnq=oyP2V#Zz~}k zvHO9vn}xCCZS@${bh}wup)#h!&5W0eZd$`7_cPZ8n-WKW9CNej2lNt1L|DUrB@Z+^ z#7E==Oj(1mFTmf1z;WDjp5w$PsAUbs)=+2-h1XF0Pt@}lI=+sMt)u>RlwC)MABVbT sJ61zo%b~8u2M<E&nZWab9<FzGvLQCk-wZ9sdp8iw7fPE<kmF$eU$H4EbN~PV diff --git a/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-312.pyc deleted file mode 100644 index aba4c44777af736ac11800e1cd7fe933bf293e0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4925 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/parser.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/parser.cpython-312.pyc deleted file mode 100644 index 9fea79f8dc14f163100365eabe8a743983d6463a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15042 zcmaibdvqJuncob60RaL8K!OB8NF+z1C=n7LmSjn`WXX~xTaqPHv1NM`dc9Z(GbBOc zLC*|D5hi18j&~PKv}>|XL%K=URN`|)t&>LE_MBBu|EQDZ59jo>B}942ov01dO;79p zU{hH;O3!J3-<=r{q+sVB@;>H%_q*@!dGViXYN|Pe#NWI=*u0zL{)q}!5X{V42hVY{ zoW%8U5--_Od>_wJTc3@k_C7mH9eoa#3Vi}nd&-%v>Z{_ZjU(ksyZhYf>b~l<r_Yo2 z_IcAaeKo93NcqzKK0nJlQ-O4CUv0Xsua1?gQo(e6UwyivuYu=moXih(T7z3p<;M3h zJ_>zd8+V$MTyJucTec1DGrpF`@7s-1UxYzc1JWZ$N?*6IuU>quLHozbTN?QiWHW>G z0n#rwm%g@)+oFM7_^G%mi`fw^nazkJaYdCCQI)mPk&g*UZ<N<v>gdRbBCBdt(CsHO z<GSNiGNI}2({e^u;#yYG9p{s(rVB5Qj-+HXsClXPT<?WH>Ww}9!V4E(h}!g;li5sv za$pqD=tZyFP<&cZvI>Ce6<LZWv{-yp8;tcU*>r4FN$GA?Q?%@*Y&MlBpP<_;tgRsP zm)LKa!#;Dg$Jk$+?2zpEcSu6NGtc$&lJiY3_PI)S4*AN_7<tJdyZRm22}hsX%}I@4 z2<MhvQZ@bw-X(e76#A+quUU3THE8dVe5JA<Wv>({m1|M1k?Kn2Aj&?e9_0q}n^Owm zn?KK8;rjv?xoB7qenpWrZTyU!8hIwGq~n?<E4fEch}aKJOUg=53i~2nmX%9c?BXE6 z#C{8oa<s8*Q@eFXTp3Vx=kS=30>P+~=}nlYk*x&XAwT}t6h!}$$1UO~Y?AE>lq5TH z4$5hz7DF}^H--1jvLrMiCpmMtv1nPvT3UCMo3c-Ef8|9DpG56@{9p4tH_k;}y&t!r zm0p{UUy0FVVk22KNoVF`>QoOTGm@OqV#!QGk<-X2G=h&Q(uJ|4qzy(Lx>Fq-)siW_ zc0kr*Sgv$36Hmp|WKPxvoMc(iT`^!tYOxrg9jct_R|3GG)DjwZES5;cRW%k<9Vm;U zc=bWHXE2+Vd$9WI<(^a7#3*&G_GofS9#G=xE>%k=hGnHo%8q4H*|>ylxh!Wc_oR}S zdPc^z!E9!K_uhRyn2Fpq5>E`r2V}KpBstQ9VPJq5UQZ&G>@hB1_sF=?jGl8_D{OtY zHSz{PsHYKqewAC@*^zfH`nMNcZ7c0NDZ8!U+I}x0E=TqiBKwvikKTH|5IJ;vTOo2J z@63-)`R}=Erm70A@Z63?S9E^ok}J9fRGjWK$UvfeUx^0M|Jn{jv)lwXRN8-hFvA3I zQMHTQO`eEGC}y0)n1M2eYn;pss8O3jJFIL+q*6DcsEA1PhKk_1Xr)D{2)dOp1`%E5 zR{X(b|L%f+_rk#?|Gq`nK4lwqQI)<NSNhW$o2Dv{Bxr-J;6#Q^^K(pZmK)$E9TWVJ zRa=%SEfbC*g4`4;LrXke18Z@39QdK~UQHZdg0lkjW}I4;HIxa5)sti!K80nj!&og+ zX#pXXY!mkP%}r)w@|0DYS?eMz62^?Hx;b36J<ENAM_mPidWBab3~z;YLv+nH1*@+~ z;S1K*HbgtSDNG1ohRa$BD+P<T57D*R6xP=a1lN%(R^!UE@B$-{Vq8pQ)9H8@4on>U zOP0hGn4OsIw|J&`vc-5t64SC4$01X@t4nAOQ?s-Qd{`90SySM*{bGkYm{oviMC%k& z*~|dtqMf4LJ#bj;*wxj)t5e+7)n%OZUD3_>%(Hyh>e3|pqA{Ay&_Ipxqjz%_S)~NQ zNT?FRs_0zQqkCd(SafZ{EaD?0az@gtV>CeHn>{6GbZ0UHIYHAsT6|bmW0&KpQCW9L zGNgbia}9JMl^p}Ibs96!9Yfh<ChA<j{>m=&sdP}s4(d%I2}q@TXskb@3rai6x!skh zKxG2cN=SZ&=qgvN=K^(k$Ev4x+0%T-)4bvhymfBs+?;bcyt@$Iy|A|s?z-#kUZMJ} zcRX9m>Z65lbYWW|+<DjAb<g9=Yu|c&`n7K!wIKMpgLl2#4a5ac^IcEtO0a46$jp(& z;O<55Zp160t+Sb#%$?AY1?NvZH$BT8j~6-~U+OrLKW!nYde`@kZ+`5?<n_rPzOfWO zbl3aXs=xNFv8l0X?OT(JuB|538kFM_NaqHkOm~-2t1vPk$`Emfv62cuZbROl!&f@Z zy?WIJCfKP8#AWV*?Qr!?&LY8w@MQxD_L+3m>@c^z(yDKSd7N-GA_CF%)J-Sv&`LC{ z_(O9IQ*SJ~T8t?OqbgY5h6xbKViU+9Lvlt%uEJF!v|34u7^1_nDXeoM$!3wb_f3v9 zX`8TNS?sx7>GVIHQAZV7)COh5Nma~dQsanZF(Z$ql1MMf+L$b7L^cI>#{nz$Cl$~D zbD>JelKtz5GFcJVA)zGM`gfOLa-Qm!Xf+OtuTNG#u!&;Sp*)H?=w4H{p<Y$prO8*c zF(p2tJ0+Q9o~YfpIY$ZBo>m7`T0YzqgME6<ePP4QiC?mF4B{Btsy&EsOR714%d&4r z!M9`n#pU*ch4zF0?#kc4@po^0FuHW;xev9a_7|6YFXink{<?g%v7er@nQhor+8MU1 z{{tC1mdfzDv<S(;WI3oT1&OzINrBuxY0KCoJNAhmD(!L!l#@#AZIT#IiS4aJlo$z* z-YPIYt;Famv9z+YBUqzCPqyzuj-B8UJHGFro-cCaRghJ6M>?L&=&qB*A2O1vdrqzI z_yfLLc@hIt4pT(8FIuHn4aQZ7@F0qYtfxCuM6a>QI8I2F;{<$yqNk{Zx#v$K4{{p6 zB&Rm+dY!rJW&4ra`6YW_2KNkbs;?os%Kh3Cy5|o~YqPJ<ygvWTUH_hy@b(#DHQYWe ztVY_GBb|jv=faCik$w4drSejwn@TOqkv)aTo*$k0$%UI2Zl7D~JoDj>rO1W+xs~Sa zbEoI`&%ZvOzO`>Lau8pFEsNfk)nJ2hhMe+9GL_v()##eC<3nNtJ3crFSZqFO>t#!* z96^Oezn({a1O2KoSHr-Z+x8_3VSs#<Fw`KTHK+v%&p%fhpMx$S@j1GD2^y6ZN{4&| zUucw-NEeQ^NpwzeZ`l*J0WM*C6$f?_YSaXy&oj1bZU>~yNth!lk-2iYBw^#xe$qb1 z-NZ^fi+-Um3+hNJsVN7jBpAfuMdX#25a|vgBf1+@EXD|mN~30c)nKc~QLIcR%E?d+ zP%7~WkoTVbKgr$9-QKa(^W;C&AD`EzU!IfRes!__c;1Z&BKKS4Q{!_@Oa8V+SKIGC zwQ~(8c&0*q+q>TpwdDlyiPtBO<!qf|w3almOgt^eVh}B2>8v!GqP#a2du=qHGHa@0 zF)5pf#S{kyz*HjL1v!D;9NlT~HQkPTqwFMrc8W;LR8CR!6^brWbR3ahW2$utIhBgV zZt@C~6KIQ$8w)~euR>8B{?-42=<_$Ze{>uxIs{?&T%yP!S-8lOTQB~WN<|+p>|bCf zzsMo`fqjjVqKoV0U*JEnhlS>qP|Iv~CR=3rNA?@(>1SEG>h`V)fGIv|7h31h0g{Ep z8YRVQrx2WPD{@E{+SVv31_DB80Z>S80SZZRhaiOJPtuS=3n$koDf(=}j`?7bLqfnv zZY4gWgk3r|zXYaM3beEo){Y~pWJVdPrs|CWrWI$ugPBzvFsoECbA=0xRnVJX8j)b* z$qby5`{Sc2P2Fg?&`*x4S~gwDPB9AeMKU8AmLX$vzru`BrYQa5Ah<LBMyUf?B}NMd zYjgr8jjJz<@|6+LVf0S5=}s}8f(VKtW4`oB)UqPP+c98)RIey<LIb-;w}g!uPe`^$ z3$xP`DK#q^W+{=(QX-k9M3|*SZG6NsnyCyu(`XesJR3M-NzSo>_c4nK2kyoVZCp`S z`m?-NA~TgCG;6y!i#w@?5>^pkCH`0$?~v=^;aKF0sc{t!fvNsg?zsZKA)>RJ0!U{C z%vR5nHm#&uP6@CVZ6kY8sTPD(c^MdJ$u|X47(QLLo;I!C0<zXl0fqq{y{xagO(Q*s z1q(_A=_a}H6!$8uGB66*he)H}6eb+n7VFbG;kIy0+OM@bxCuM1h^<$*zx2ZSs82Z$ zc)dEQLX*<snS^XvMa$2=9*7y|J!Tzs-DTyJy@bFHBbP#^58Y>+ehZRmQ%am_zzaw( zQ{<6UJRvK@T+8(^-DjdS)HqdlGs_#}e|Bhg2B|FRWmgS)nFf|z=a*jh?u{d&7V7^* z1e4WDQ*++8;_<(AWa`MGXZyWi^PKeV@H@kI_Z+<&JhtdPwirBS>PgGqj)J#iq5daZ zZf;qQ9xX(V-t``PNZo4Q_U<e1yt3T9x6r(Ix%oh$`M|CIzaRd);icxM^1b)!n`TZI z>d72bzc26pwWn#W|J}?xnOnl0mIL?vO>^BpYP;+2UfKT0;<mlhzWYwDzGW`+Bk68% z|H`(uY2RvN`==aV)5}lWSGKk<Z|y2<?OI6O-GBN+`_lgNOIx3taTo1WUvzSTrbSnn zQQN3nc?Gjo{+OayDf$zNh^H!lN)c_2LaU-&qKF8yTE>xN`bd#P6*~}tBYk3X3a(<H zUTB*C>W$d-Sdl~acJMPwKB34U^wewvp|@`2+8}Dmt>to=wOke|NyV^q3$RL8F&niT zFr}LWRA!(n(Qkv5-C;@KeIAmLai|%^-*BkyN$JYE#r0vDDF7L>LVpLDS$I+^Q>_Ub zY{z!89phG3)GaFM5Z3rW*DANEpjAxpxYMBD6wuCrd(7u{pJgTxsDz?1yVFV*Y$dLV zad99C`>$x(uDfAo4#XwNGKCHhpk9+@nqiEURNX$39Z^Ulvt+qZ<kwe87YsOBn{_cx z4;pru4VZH~A71nB3UGf8RO%T-&;eas?apb(a-h8sXrI>>0|yr_7Xk<K!m7)=?1~gz zk!4p)!PRotC9bT0ft7jNeB1o!U02ttzdr9}M{k2af%p|s*R=^m5S1%(3wYf42nW5Y z;(nNP_X{+_30oyjYVio3V{{iP1mw>rPRq14mhld<foYRdJ0SriQlqBeKz<ZR1jg=& z#;SMsM(w)C+%UqRT)~8NCsYKO$4oU%x5G!K^T~}Wn!l`744vk-SJ<6RFw;P;9!G?o zadI$b`&tUVmUmuT^lgJ4UfZx-+g7M;14(l4%%52C`rmqX>e=bnW+!JRKk~MN61jI0 zAqtx6dT-Rbi4f^__#F(fny8WPxxkL%X*!q6>-5DnqGaJI(Z&_J4hFgUGs=+yW{?<> za+(#riH!O@qBpss%`G&n1VcqTrLEhIw0kd0SKYPC?&gBKc}+lVF~m82MUb@MeEt03 zjqLSoVcWq^N#0$vqlSoG(CCdi+Cb1OMSg7+H4jU!lKp!;+;ngN%7WySop9;F!6&)< ztC`$d{id(43eHqlMe)IlHZ=q<J3#z=Ab!=zdt`ja7aI{f$qig~lkAbBuLh1jUs=7Y zyaeYWIsg2?;u;dsd{Y4FtV4aR6hzN7N{3XBavhVbgE+noN)k<SswqDk=f(2YjtwRg zgC)T@si|dx@wk{6loP|IOk7Q*BT?>)g(V9fL}u55$1160GvwQfr$kt>lkrQadxku~ zNi~}y+czUfx`Q+{<u5QI<}+gyeBF^qgtA1!$-GBmFGwgyXUz!ZBA0bpQE!r1h<OzW zg(2*&dpnp=7yz^#jKE<z5tSY214Q&Mktify>P}<EOiW^Wq$T|@5H<~9G3Ubc!p*`C z^T%zepqp6kxW7Sr^&le1Hbo!T(3E#vbKeWK&7WBcbs_IrCH?rD<B$#V;}3h^j5EHS z25TRd#}x&+4c;kQPew@pH8QiD`wOfNWLvNp)kUt2(@HB^$?LR(Q@SP{>+1<;uj9Mi z_ifgW@SIjMp;Z#pVPGY31%c<j1}SCI@pZ?znU3*e+!g!RxG_Fz@6C0b$cQqz`NeD^ zF$%p)5~We{2W~u!hsBR+l2NDbVW-v*NSVZ>2MikZGI<)<ive920R{~gfN@oK$XAk@ z#W`smm2Xl+>!{o1D~V0!552~~ZwkJ-N^0i@2$CAq=MZ6gZ4P%B^5=4}y%21lPb}<T z3id2|dp^JCZ(R0w6#N~ZayEDPp0{?f{)yWcZ$G_Q_tahQ$$KEvXQs|fKTj@*-xmdd zJWxrJ`bKR%_wC?`di#yG6Mp+o{Q|NZm?-Ui8~)e+1gm`xYt7v96>o@S8?cjs5;iAW z0^$*DPH0W)%K-Pb?OGM=O=MiH$Y{SzSOOF7<+wk_X@b2<m=M%Pjjjj_mCUSoEKnve zU2BC`&!X2>Go<u9!#b@Dw{x;;0*2Ph5QDEhK4G755`C?xI95#v{bi@`+E<`nVb-t0 zzc=Z$TB3|z8RjaCnzi{3Kg&ZbsBv)D8Xb6YU|QB}W89DJIIGTH-8qoTUW%u3!eJ1^ z!?{Ce2Qt}*kE)1kD(-4mcZqSBCA3|5gFz>gEEIBjL>upZz;`pJTC~cbL{pfGF5m?~ z8g4ZhJ_q0$6D0Z4=zv0INTm}|)Wytrx-W|d9ZFJ?V_5}{2^a#sMuoKkFCk(E4v$r| z=!IToeql#nC4rx)Jq4z*>0*o?L@<o96x+ZB44k?Bl_=aFX!LK;kNRsw|A)~&7q_Kt z{?v`L*Uv7DEjAs>`yg6wf8?L-wj<S~^PQUBK6R!@rF;#{Q%9;HsBCM$;koWv7WWp! zy-VW$PdShKaKXDZe{L@L>tN_!AT;Zp@vhWAw^HAFU$EEKk+9mdx@G6`md?VK&V`G& zwk>UWbn1Nm^z=n?JaymkcdP`O=LQOaoy&o)LZE9wy>)V7=%c{n#YUhmZso!|>58_( z6}L6Iu&c0jA8B{3Gp=bnP=uQ1_D>JK?fV28UF#=y!2RyiHjMOlD%l3UQU6pI|DEcm zIvn#SDErd`k0DluQMJMDLxhtN>{SO5>~$|lB_9YbB%n42i@1U@5+)Yb2{KV63hX*p zxLj8KDQ=p7^*@@|z|J(K8lz=-4ARex(pH~z$*=O)THs<Y*<jY;P1}z!L~L_YknEQ^ z#pmX<pjEMM51DjK^O+=YR%+*D4op>}JI_Ly#l~ba2SEHP<CXAAY2Duks6T|Ig0*JS z@emf``z*k|6S49Z$x`rGL8=-CQB?jPc96WFn*y;@2^J&7uJ4z8S3H;b-(Ro>Zng${ zK`u!Q*%YiD#U469;GL#Z!613u(6&wBC{74O3a$5ka5#YEfq*+RH@=|%YS#asqn3E+ zreN;6ZK!=y1&U}<;hb2f2|BYdwCmwkr5S-V4@DoY2gxq65zJZ`+WjyLo|?cpB6%iV zs3#)2DH!!hZqf}qLdAJumC(-wH{h6X{eb_m6T+n15GFH0?CTe;tHWAX+7F1g6<6R1 zjAoj@_A{_28`u#}-K1S3EuRHoFR@YU8;P^l2?JI;VYt@ppeH+Jbb#Dq5bsESU;&~W zJ-GQpr%)(Ag<s>Yy=n<*ZQNck-7&1>*Ko&p8uJef@vTD5HKWF4oz5{X>dpOtSprSF zykY*Z43*+o5|(qu9#zADPS$pV|E#MY)ds7=`xsQ3sz|qZDoe@<ly*(SqZxHXP9&k5 z48qC}uhsy2;0TMR1~)9T$isi%UqWOkNvhaE3cDKZ&e^)Udf_*#h6_TGW14~|D;^`? zA5W=rE<)TplO-zwMw^sOmJZi~n7d#a1Uf~$-k}GxY%KlbfTg#oGOR#`0FX)!%i=iR z_hqu3BK6V3kc&XFx91U97E}%IIl6TrksUSPFXsMYGjbEE)QOB0#IxKuMwjWz$OCY( zTqY}pCPR!M)L$|Rs%Aszq0xwjvPfdeYokdF8QLCsMKHE*CWGj%1gsR7@Ji8ewuTMy z+xaqyH!5Rvx|2;6HY>anR!H^HtC^I*tO$l(+KHFE5LOi8HF`B`Y)b8rXW)6U<Gb<= zipU^oh(K>s?uUqUJFI28&%|jy9fZuD%|I^F%-2RW);MGAJ*&S|G#|KDp*i{5qt%9Q zbeIskNsEoi82`G0z&tlPe_5}>iJ{Kct!^smkJiC7<tSwc-*Ro0M5Rr(`u_?*H4gr8 zmAmid8e7Q~I4|8uUr#TE9wnvlUVY=+Pv_mM;jPQzqlNI%rSOw$+#~LesWbVL)4|n- zrrFp`Z2rZClh^x}8Xn0%gQpsSQ2y&Hf$-|4=SHjkhPNiCCKtt{1^>~at*SP3FVZ%D z^1I#t;w043y6|lCO!NG%JGIe!4b9&hT55=X!tp2=Fw-YLv!nEzvZ}Uwk><I?cRP%# zw%;_u(D$Btw{Z_-sptQ8Y^6Rt`|QlKD_dIT+80|Nzuk7b0shM;4<c$h_*=Ws5Gs1D zUOVp8;x$y$Y;q>~_Am_SC!hI;(CORpX>GYNT4;<e?7Y=>>$Q&>A72cep0*c4r&nql z*=Tp)sqI{8Y@U5%=8eV1eT#v8h*ttlvo$j{u-=oeAh3Id-njM@B0Woyz0*~AbG01W zT?p-7ICSgeQs}X1`)XtJa^s#t<DNT>dl!^x$4XP{a#K&Cspn49fm{2gohyOXY3Hne z#y{^|sJa!rB`pTd-+u8<;QR+KF9pu8h9b+MjzXwoA%wcbQs^)+?%0(-GyU@HD>JVw zdAAkgJhrPS@mzf~nd1)TPu|-~^6$Cp=WYd;wjKcN#cw`GCb@&aMti>EZ_N8YzyBQ1 zg|~mo3ALe$YiWD(0L0^_1OIGyU@h$cd+?bLd&IWw!DkM>wvDoF|M$}n*La3kAHh-k z>0!^AJ+_~<d(YMi|H<V&+amnDGjev1^TR#jS)cHW8lK`>;p`UoFIt4N9qtWECYkx@ zPOgpMynd0TR&8B3+*FcSEAul;3b;sS3$Bu{v66CV$p(z8LB`n}D)&`M3bQa-<6shV zNj_Z1Yr%m}gI3_7hJC0c^Q}Xbq@a>)xL#MeMX6thR+8!<Pu5xOEN%~__b4z_kT<N6 zK`OTowOQ@fQ%Eo+If+a_mB!8Fh_r+I13Oq!s+oL2u0j?dUqqROp8PVKf>x5|%VhJC zpVpckGZFEV{MY$wA4@DPGZEQx-@0I^yv$IU71MZDYFIQ)%jLRBGv1FU^Nf$iGg^}U zproAZllZXFJPJ3AnuH~@Q{3!K?TCsJ2^iEyO2XPLj%Af$82jt=5Def6{ItSyr<%S| z!+ZB0R)BFrg=zH;dh@S%=;I7Ur284pJz^EQBas~$hbNcV8Ca|7t5F%BR8j=XSm2K+ z_g9Ea>m=+}iemIa!nj^#%2Ud}MQQUhS-p<1Z}j8l+AHv=hrxVMuGHTHCv!Fg>hW^^ zj(_)Wf?H;voOyEo(HlpvA6*LWUG(lPI_>VBl2djoRP?*v7AWKO;pJdQAxJLT=9|sS z(IbWEk)<da9m~5`h=lGbg!aG;3To$mj?X{ykna|cWKuJ!`GYr(TtBiD>dBubm+Y?h z_J8ExwTZxYbT4-tE_58eedvSJOC9H@U2~y#x4g6EPN2Q$A>?4Qf$&>zOuaF8Wy#;M z=<4|VeghW(o#l;@pPf4U?eu#W7lJ?h>aw@H;O+iBk>;KU><R0SBd6@#&+YD02kbxh zww`*#{_{r!<du_Hn+>{s$rwvc2}Ucigqy>cn_exNz^EJ1-c3Ox^9>8^-60R7Ea)-? z`kjpON66r{jfYu4W9&tzGL3Ke?TbbRqxExWJ(i<Mls}eJ{uUo{;R+{&$!9z0P;>wU zu6lC#h4EvN?*-qDyc4<W+JP@`xu@LU?wUV2e_+8jANk1D$t>8>`b~}|!{hA$9`hvv z$;!+GZ(O85r5YyokshSbq?tUa&=NC2OJR5IKTwfIT-j5eq#BC;75>%#hKPB}dEpR* zpGfPcZjZ2g)n8W>kdi~Ku2@Am7Z+?SQXS+fxT`#r^K#X`-_}qrA_(F6GdC_=zd$dn z!ng4p3&{uUy;b-__TDO7^hJc$Rd?O=fw|yZVlIpeb82D7Vz9g5?pYI1SA6W45MHQX zNZi`LFnF`2$f0=q)Ca*25+8*BeeW6-i^pyCLe%JK4IcbxvC}4W&9O&ZUGw$ydaKLu z56}#wt!z#8Dl#F0HX7?le2N_a_I6aShNMi-H}Lx-CTQzUJXa!Mwi9e^*?QB#V~ei0 z;MYjqrC%d;<JU;tc$K1!s<0E{(I_Kn`j$;V<$fgQX<;-_4{rpc-(soV=_KAl6FV_9 z0ypT;d1eGPPRtx?^oFzSv860+cr?Zyt+96yy4Ual81KRi-y_@lBZQaurXnJG;CjM% zQFu)G1&VYx)i)5~s`LCmaxMSF`F_dyf63MSlB-7MzjLj>;vW5od-Q*CkNt`}`z!9$ zsymWzTy{qa?#SF@OYR+4o%fv=cz(xR$8zMcLgcag9F^`%wr0L*amS(i9Mb#8`5+&h e3okcy7n-{7b12;JJa6N>7Mu3`mZJ<C;Qt3m%#b+% diff --git a/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc deleted file mode 100644 index 2850b571b21aa56e9654ce4ffe9a5784927692d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2640 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 O{2h7tfedTm2mBA%IHcDA diff --git a/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-312.pyc deleted file mode 100644 index 58e6b9e5218475b9fe2ddcd01bb879288b68643c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18872 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%0D{ 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-312.pyc deleted file mode 100644 index 75d754adb166537e52b9de34e1903da84ec5270a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7860 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 WT^c%E7&!6;KCs#Md1$df=Klc25ZEXH diff --git a/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc deleted file mode 100644 index eb705295f26a5c484988f8775fd79d7e3ee68291..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 395 zcmXw#KTpC?6vbaD1;jK$#6Tjm2?M;St1&@ZBN1OsOEKxv)V>#J=)d&6Vu%ah!p+^! z;(}Y#)rrl7jmb9X9e($m<lNkw`zeZ5kd^)ZI%8S?&dq;ue`4Ft#2diC0GKm4Trdil zH+Wn$idZm&WvNr%<k3w&uqou=a};wlGoVf>Eo=H<AZuDG$f~NSsi>oSq&y*WZyS@L zI@bFm8BI*2jLlm`M^f5)ROQJ~(KYi%AC4qb8mfQ!8dA)M{&;XFYy0d6*k+r+E{3zf zBha%LT|g<YV~_ZZLPlINjV!NAnPbmM)WyMz?*<ko5nK>|0bS=AhD$aJ{L9|?1*8rm z-O#e<)|5~fIw3S2pOMJ7Txh!vq|9P5HSGWs+6$Mv%9R)3*d^CdJ-Z@*1U<{}!*d*$ jR1a6>q;jwll3INwCe79wG?LTy8nlw*lP^$<j<V=4RUdH` diff --git a/venv/lib/python3.12/site-packages/pip/_internal/cli/autocompletion.py b/venv/lib/python3.12/site-packages/pip/_internal/cli/autocompletion.py deleted file mode 100644 index e5950b9..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/cli/autocompletion.py +++ /dev/null @@ -1,172 +0,0 @@ -"""Logic that powers autocompletion installed by ``pip completion``. -""" - -import optparse -import os -import sys -from itertools import chain -from typing import Any, Iterable, List, Optional - -from pip._internal.cli.main_parser import create_main_parser -from pip._internal.commands import commands_dict, create_command -from pip._internal.metadata import get_default_environment - - -def autocomplete() -> None: - """Entry Point for completion of main and subcommand options.""" - # Don't complete if user hasn't sourced bash_completion file. - if "PIP_AUTO_COMPLETE" not in os.environ: - return - cwords = os.environ["COMP_WORDS"].split()[1:] - cword = int(os.environ["COMP_CWORD"]) - try: - current = cwords[cword - 1] - except IndexError: - current = "" - - parser = create_main_parser() - subcommands = list(commands_dict) - options = [] - - # subcommand - subcommand_name: Optional[str] = None - for word in cwords: - if word in subcommands: - subcommand_name = word - break - # subcommand options - if subcommand_name is not None: - # special case: 'help' subcommand has no options - if subcommand_name == "help": - sys.exit(1) - # special case: list locally installed dists for show and uninstall - should_list_installed = not current.startswith("-") and subcommand_name in [ - "show", - "uninstall", - ] - if should_list_installed: - env = get_default_environment() - lc = current.lower() - installed = [ - dist.canonical_name - for dist in env.iter_installed_distributions(local_only=True) - if dist.canonical_name.startswith(lc) - and dist.canonical_name not in cwords[1:] - ] - # if there are no dists installed, fall back to option completion - if installed: - for dist in installed: - print(dist) - sys.exit(1) - - should_list_installables = ( - not current.startswith("-") and subcommand_name == "install" - ) - if should_list_installables: - for path in auto_complete_paths(current, "path"): - print(path) - sys.exit(1) - - subcommand = create_command(subcommand_name) - - for opt in subcommand.parser.option_list_all: - if opt.help != optparse.SUPPRESS_HELP: - options += [ - (opt_str, opt.nargs) for opt_str in opt._long_opts + opt._short_opts - ] - - # filter out previously specified options from available options - prev_opts = [x.split("=")[0] for x in cwords[1 : cword - 1]] - options = [(x, v) for (x, v) in options if x not in prev_opts] - # filter options by current input - options = [(k, v) for k, v in options if k.startswith(current)] - # get completion type given cwords and available subcommand options - completion_type = get_path_completion_type( - cwords, - cword, - subcommand.parser.option_list_all, - ) - # get completion files and directories if ``completion_type`` is - # ``<file>``, ``<dir>`` or ``<path>`` - if completion_type: - paths = auto_complete_paths(current, completion_type) - options = [(path, 0) for path in paths] - for option in options: - opt_label = option[0] - # append '=' to options which require args - if option[1] and option[0][:2] == "--": - opt_label += "=" - print(opt_label) - else: - # show main parser options only when necessary - - opts = [i.option_list for i in parser.option_groups] - opts.append(parser.option_list) - flattened_opts = chain.from_iterable(opts) - if current.startswith("-"): - for opt in flattened_opts: - if opt.help != optparse.SUPPRESS_HELP: - subcommands += opt._long_opts + opt._short_opts - else: - # get completion type given cwords and all available options - completion_type = get_path_completion_type(cwords, cword, flattened_opts) - if completion_type: - subcommands = list(auto_complete_paths(current, completion_type)) - - print(" ".join([x for x in subcommands if x.startswith(current)])) - sys.exit(1) - - -def get_path_completion_type( - cwords: List[str], cword: int, opts: Iterable[Any] -) -> Optional[str]: - """Get the type of path completion (``file``, ``dir``, ``path`` or None) - - :param cwords: same as the environmental variable ``COMP_WORDS`` - :param cword: same as the environmental variable ``COMP_CWORD`` - :param opts: The available options to check - :return: path completion type (``file``, ``dir``, ``path`` or None) - """ - if cword < 2 or not cwords[cword - 2].startswith("-"): - return None - for opt in opts: - if opt.help == optparse.SUPPRESS_HELP: - continue - for o in str(opt).split("/"): - if cwords[cword - 2].split("=")[0] == o: - if not opt.metavar or any( - x in ("path", "file", "dir") for x in opt.metavar.split("/") - ): - return opt.metavar - return None - - -def auto_complete_paths(current: str, completion_type: str) -> Iterable[str]: - """If ``completion_type`` is ``file`` or ``path``, list all regular files - and directories starting with ``current``; otherwise only list directories - starting with ``current``. - - :param current: The word to be completed - :param completion_type: path completion type(``file``, ``path`` or ``dir``) - :return: A generator of regular files and/or directories - """ - directory, filename = os.path.split(current) - current_path = os.path.abspath(directory) - # Don't complete paths if they can't be accessed - if not os.access(current_path, os.R_OK): - return - filename = os.path.normcase(filename) - # list all files that start with ``filename`` - file_list = ( - x for x in os.listdir(current_path) if os.path.normcase(x).startswith(filename) - ) - for f in file_list: - opt = os.path.join(current_path, f) - comp_file = os.path.normcase(os.path.join(directory, f)) - # complete regular files when there is not ``<dir>`` after option - # complete directories when there is ``<file>``, ``<path>`` or - # ``<dir>``after option - if completion_type != "dir" and os.path.isfile(opt): - yield comp_file - elif os.path.isdir(opt): - yield os.path.join(comp_file, "") diff --git a/venv/lib/python3.12/site-packages/pip/_internal/cli/base_command.py b/venv/lib/python3.12/site-packages/pip/_internal/cli/base_command.py deleted file mode 100644 index db9d5cc..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/cli/base_command.py +++ /dev/null @@ -1,236 +0,0 @@ -"""Base Command class, and related routines""" - -import functools -import logging -import logging.config -import optparse -import os -import sys -import traceback -from optparse import Values -from typing import Any, Callable, List, Optional, Tuple - -from pip._vendor.rich import traceback as rich_traceback - -from pip._internal.cli import cmdoptions -from pip._internal.cli.command_context import CommandContextMixIn -from pip._internal.cli.parser import ConfigOptionParser, UpdatingDefaultsHelpFormatter -from pip._internal.cli.status_codes import ( - ERROR, - PREVIOUS_BUILD_DIR_ERROR, - UNKNOWN_ERROR, - VIRTUALENV_NOT_FOUND, -) -from pip._internal.exceptions import ( - BadCommand, - CommandError, - DiagnosticPipError, - InstallationError, - NetworkConnectionError, - PreviousBuildDirError, - UninstallationError, -) -from pip._internal.utils.filesystem import check_path_owner -from pip._internal.utils.logging import BrokenStdoutLoggingError, setup_logging -from pip._internal.utils.misc import get_prog, normalize_path -from pip._internal.utils.temp_dir import TempDirectoryTypeRegistry as TempDirRegistry -from pip._internal.utils.temp_dir import global_tempdir_manager, tempdir_registry -from pip._internal.utils.virtualenv import running_under_virtualenv - -__all__ = ["Command"] - -logger = logging.getLogger(__name__) - - -class Command(CommandContextMixIn): - usage: str = "" - ignore_require_venv: bool = False - - def __init__(self, name: str, summary: str, isolated: bool = False) -> None: - super().__init__() - - self.name = name - self.summary = summary - self.parser = ConfigOptionParser( - usage=self.usage, - prog=f"{get_prog()} {name}", - formatter=UpdatingDefaultsHelpFormatter(), - add_help_option=False, - name=name, - description=self.__doc__, - isolated=isolated, - ) - - self.tempdir_registry: Optional[TempDirRegistry] = None - - # Commands should add options to this option group - optgroup_name = f"{self.name.capitalize()} Options" - self.cmd_opts = optparse.OptionGroup(self.parser, optgroup_name) - - # Add the general options - gen_opts = cmdoptions.make_option_group( - cmdoptions.general_group, - self.parser, - ) - self.parser.add_option_group(gen_opts) - - self.add_options() - - def add_options(self) -> None: - pass - - def handle_pip_version_check(self, options: Values) -> None: - """ - This is a no-op so that commands by default do not do the pip version - check. - """ - # Make sure we do the pip version check if the index_group options - # are present. - assert not hasattr(options, "no_index") - - def run(self, options: Values, args: List[str]) -> int: - raise NotImplementedError - - def parse_args(self, args: List[str]) -> Tuple[Values, List[str]]: - # factored out for testability - return self.parser.parse_args(args) - - def main(self, args: List[str]) -> int: - try: - with self.main_context(): - return self._main(args) - finally: - logging.shutdown() - - def _main(self, args: List[str]) -> int: - # We must initialize this before the tempdir manager, otherwise the - # configuration would not be accessible by the time we clean up the - # tempdir manager. - self.tempdir_registry = self.enter_context(tempdir_registry()) - # Intentionally set as early as possible so globally-managed temporary - # directories are available to the rest of the code. - self.enter_context(global_tempdir_manager()) - - options, args = self.parse_args(args) - - # Set verbosity so that it can be used elsewhere. - self.verbosity = options.verbose - options.quiet - - level_number = setup_logging( - verbosity=self.verbosity, - no_color=options.no_color, - user_log_file=options.log, - ) - - always_enabled_features = set(options.features_enabled) & set( - cmdoptions.ALWAYS_ENABLED_FEATURES - ) - if always_enabled_features: - logger.warning( - "The following features are always enabled: %s. ", - ", ".join(sorted(always_enabled_features)), - ) - - # Make sure that the --python argument isn't specified after the - # subcommand. We can tell, because if --python was specified, - # we should only reach this point if we're running in the created - # subprocess, which has the _PIP_RUNNING_IN_SUBPROCESS environment - # variable set. - if options.python and "_PIP_RUNNING_IN_SUBPROCESS" not in os.environ: - logger.critical( - "The --python option must be placed before the pip subcommand name" - ) - sys.exit(ERROR) - - # TODO: Try to get these passing down from the command? - # without resorting to os.environ to hold these. - # This also affects isolated builds and it should. - - if options.no_input: - os.environ["PIP_NO_INPUT"] = "1" - - if options.exists_action: - os.environ["PIP_EXISTS_ACTION"] = " ".join(options.exists_action) - - if options.require_venv and not self.ignore_require_venv: - # If a venv is required check if it can really be found - if not running_under_virtualenv(): - logger.critical("Could not find an activated virtualenv (required).") - sys.exit(VIRTUALENV_NOT_FOUND) - - if options.cache_dir: - options.cache_dir = normalize_path(options.cache_dir) - if not check_path_owner(options.cache_dir): - logger.warning( - "The directory '%s' or its parent directory is not owned " - "or is not writable by the current user. The cache " - "has been disabled. Check the permissions and owner of " - "that directory. If executing pip with sudo, you should " - "use sudo's -H flag.", - options.cache_dir, - ) - options.cache_dir = None - - def intercepts_unhandled_exc( - run_func: Callable[..., int] - ) -> Callable[..., int]: - @functools.wraps(run_func) - def exc_logging_wrapper(*args: Any) -> int: - try: - status = run_func(*args) - assert isinstance(status, int) - return status - except DiagnosticPipError as exc: - logger.error("%s", exc, extra={"rich": True}) - logger.debug("Exception information:", exc_info=True) - - return ERROR - except PreviousBuildDirError as exc: - logger.critical(str(exc)) - logger.debug("Exception information:", exc_info=True) - - return PREVIOUS_BUILD_DIR_ERROR - except ( - InstallationError, - UninstallationError, - BadCommand, - NetworkConnectionError, - ) as exc: - logger.critical(str(exc)) - logger.debug("Exception information:", exc_info=True) - - return ERROR - except CommandError as exc: - logger.critical("%s", exc) - logger.debug("Exception information:", exc_info=True) - - return ERROR - except BrokenStdoutLoggingError: - # Bypass our logger and write any remaining messages to - # stderr because stdout no longer works. - print("ERROR: Pipe to stdout was broken", file=sys.stderr) - if level_number <= logging.DEBUG: - traceback.print_exc(file=sys.stderr) - - return ERROR - except KeyboardInterrupt: - logger.critical("Operation cancelled by user") - logger.debug("Exception information:", exc_info=True) - - return ERROR - except BaseException: - logger.critical("Exception:", exc_info=True) - - return UNKNOWN_ERROR - - return exc_logging_wrapper - - try: - if not options.debug_mode: - run = intercepts_unhandled_exc(self.run) - else: - run = self.run - rich_traceback.install(show_locals=True) - return run(options, args) - finally: - self.handle_pip_version_check(options) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py b/venv/lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py deleted file mode 100644 index d643256..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py +++ /dev/null @@ -1,1074 +0,0 @@ -""" -shared options and groups - -The principle here is to define options once, but *not* instantiate them -globally. One reason being that options with action='append' can carry state -between parses. pip parses general options twice internally, and shouldn't -pass on state. To be consistent, all options will follow this design. -""" - -# The following comment should be removed at some point in the future. -# mypy: strict-optional=False - -import importlib.util -import logging -import os -import textwrap -from functools import partial -from optparse import SUPPRESS_HELP, Option, OptionGroup, OptionParser, Values -from textwrap import dedent -from typing import Any, Callable, Dict, Optional, Tuple - -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.cli.parser import ConfigOptionParser -from pip._internal.exceptions import CommandError -from pip._internal.locations import USER_CACHE_DIR, get_src_prefix -from pip._internal.models.format_control import FormatControl -from pip._internal.models.index import PyPI -from pip._internal.models.target_python import TargetPython -from pip._internal.utils.hashes import STRONG_HASHES -from pip._internal.utils.misc import strtobool - -logger = logging.getLogger(__name__) - - -def raise_option_error(parser: OptionParser, option: Option, msg: str) -> None: - """ - Raise an option parsing error using parser.error(). - - Args: - parser: an OptionParser instance. - option: an Option instance. - msg: the error text. - """ - msg = f"{option} error: {msg}" - msg = textwrap.fill(" ".join(msg.split())) - parser.error(msg) - - -def make_option_group(group: Dict[str, Any], parser: ConfigOptionParser) -> OptionGroup: - """ - Return an OptionGroup object - group -- assumed to be dict with 'name' and 'options' keys - parser -- an optparse Parser - """ - option_group = OptionGroup(parser, group["name"]) - for option in group["options"]: - option_group.add_option(option()) - return option_group - - -def check_dist_restriction(options: Values, check_target: bool = False) -> None: - """Function for determining if custom platform options are allowed. - - :param options: The OptionParser options. - :param check_target: Whether or not to check if --target is being used. - """ - dist_restriction_set = any( - [ - options.python_version, - options.platforms, - options.abis, - options.implementation, - ] - ) - - binary_only = FormatControl(set(), {":all:"}) - sdist_dependencies_allowed = ( - options.format_control != binary_only and not options.ignore_dependencies - ) - - # Installations or downloads using dist restrictions must not combine - # source distributions and dist-specific wheels, as they are not - # guaranteed to be locally compatible. - if dist_restriction_set and sdist_dependencies_allowed: - raise CommandError( - "When restricting platform and interpreter constraints using " - "--python-version, --platform, --abi, or --implementation, " - "either --no-deps must be set, or --only-binary=:all: must be " - "set and --no-binary must not be set (or must be set to " - ":none:)." - ) - - if check_target: - if not options.dry_run and dist_restriction_set and not options.target_dir: - raise CommandError( - "Can not use any platform or abi specific options unless " - "installing via '--target' or using '--dry-run'" - ) - - -def _path_option_check(option: Option, opt: str, value: str) -> str: - return os.path.expanduser(value) - - -def _package_name_option_check(option: Option, opt: str, value: str) -> str: - return canonicalize_name(value) - - -class PipOption(Option): - TYPES = Option.TYPES + ("path", "package_name") - TYPE_CHECKER = Option.TYPE_CHECKER.copy() - TYPE_CHECKER["package_name"] = _package_name_option_check - TYPE_CHECKER["path"] = _path_option_check - - -########### -# options # -########### - -help_: Callable[..., Option] = partial( - Option, - "-h", - "--help", - dest="help", - action="help", - help="Show help.", -) - -debug_mode: Callable[..., Option] = partial( - Option, - "--debug", - dest="debug_mode", - action="store_true", - default=False, - help=( - "Let unhandled exceptions propagate outside the main subroutine, " - "instead of logging them to stderr." - ), -) - -isolated_mode: Callable[..., Option] = partial( - Option, - "--isolated", - dest="isolated_mode", - action="store_true", - default=False, - help=( - "Run pip in an isolated mode, ignoring environment variables and user " - "configuration." - ), -) - -require_virtualenv: Callable[..., Option] = partial( - Option, - "--require-virtualenv", - "--require-venv", - dest="require_venv", - action="store_true", - default=False, - help=( - "Allow pip to only run in a virtual environment; " - "exit with an error otherwise." - ), -) - -override_externally_managed: Callable[..., Option] = partial( - Option, - "--break-system-packages", - dest="override_externally_managed", - action="store_true", - help="Allow pip to modify an EXTERNALLY-MANAGED Python installation", -) - -python: Callable[..., Option] = partial( - Option, - "--python", - dest="python", - help="Run pip with the specified Python interpreter.", -) - -verbose: Callable[..., Option] = partial( - Option, - "-v", - "--verbose", - dest="verbose", - action="count", - default=0, - help="Give more output. Option is additive, and can be used up to 3 times.", -) - -no_color: Callable[..., Option] = partial( - Option, - "--no-color", - dest="no_color", - action="store_true", - default=False, - help="Suppress colored output.", -) - -version: Callable[..., Option] = partial( - Option, - "-V", - "--version", - dest="version", - action="store_true", - help="Show version and exit.", -) - -quiet: Callable[..., Option] = partial( - Option, - "-q", - "--quiet", - dest="quiet", - action="count", - default=0, - help=( - "Give less output. Option is additive, and can be used up to 3" - " times (corresponding to WARNING, ERROR, and CRITICAL logging" - " levels)." - ), -) - -progress_bar: Callable[..., Option] = partial( - Option, - "--progress-bar", - dest="progress_bar", - type="choice", - choices=["on", "off"], - default="on", - help="Specify whether the progress bar should be used [on, off] (default: on)", -) - -log: Callable[..., Option] = partial( - PipOption, - "--log", - "--log-file", - "--local-log", - dest="log", - metavar="path", - type="path", - help="Path to a verbose appending log.", -) - -no_input: Callable[..., Option] = partial( - Option, - # Don't ask for input - "--no-input", - dest="no_input", - action="store_true", - default=False, - help="Disable prompting for input.", -) - -keyring_provider: Callable[..., Option] = partial( - Option, - "--keyring-provider", - dest="keyring_provider", - choices=["auto", "disabled", "import", "subprocess"], - default="auto", - help=( - "Enable the credential lookup via the keyring library if user input is allowed." - " Specify which mechanism to use [disabled, import, subprocess]." - " (default: disabled)" - ), -) - -proxy: Callable[..., Option] = partial( - Option, - "--proxy", - dest="proxy", - type="str", - default="", - help="Specify a proxy in the form scheme://[user:passwd@]proxy.server:port.", -) - -retries: Callable[..., Option] = partial( - Option, - "--retries", - dest="retries", - type="int", - default=5, - help="Maximum number of retries each connection should attempt " - "(default %default times).", -) - -timeout: Callable[..., Option] = partial( - Option, - "--timeout", - "--default-timeout", - metavar="sec", - dest="timeout", - type="float", - default=15, - help="Set the socket timeout (default %default seconds).", -) - - -def exists_action() -> Option: - return Option( - # Option when path already exist - "--exists-action", - dest="exists_action", - type="choice", - choices=["s", "i", "w", "b", "a"], - default=[], - action="append", - metavar="action", - help="Default action when a path already exists: " - "(s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort.", - ) - - -cert: Callable[..., Option] = partial( - PipOption, - "--cert", - dest="cert", - type="path", - metavar="path", - help=( - "Path to PEM-encoded CA certificate bundle. " - "If provided, overrides the default. " - "See 'SSL Certificate Verification' in pip documentation " - "for more information." - ), -) - -client_cert: Callable[..., Option] = partial( - PipOption, - "--client-cert", - dest="client_cert", - type="path", - default=None, - metavar="path", - help="Path to SSL client certificate, a single file containing the " - "private key and the certificate in PEM format.", -) - -index_url: Callable[..., Option] = partial( - Option, - "-i", - "--index-url", - "--pypi-url", - dest="index_url", - metavar="URL", - default=PyPI.simple_url, - help="Base URL of the Python Package Index (default %default). " - "This should point to a repository compliant with PEP 503 " - "(the simple repository API) or a local directory laid out " - "in the same format.", -) - - -def extra_index_url() -> Option: - return Option( - "--extra-index-url", - dest="extra_index_urls", - metavar="URL", - action="append", - default=[], - help="Extra URLs of package indexes to use in addition to " - "--index-url. Should follow the same rules as " - "--index-url.", - ) - - -no_index: Callable[..., Option] = partial( - Option, - "--no-index", - dest="no_index", - action="store_true", - default=False, - help="Ignore package index (only looking at --find-links URLs instead).", -) - - -def find_links() -> Option: - return Option( - "-f", - "--find-links", - dest="find_links", - action="append", - default=[], - metavar="url", - help="If a URL or path to an html file, then parse for links to " - "archives such as sdist (.tar.gz) or wheel (.whl) files. " - "If a local path or file:// URL that's a directory, " - "then look for archives in the directory listing. " - "Links to VCS project URLs are not supported.", - ) - - -def trusted_host() -> Option: - return Option( - "--trusted-host", - dest="trusted_hosts", - action="append", - metavar="HOSTNAME", - default=[], - help="Mark this host or host:port pair as trusted, even though it " - "does not have valid or any HTTPS.", - ) - - -def constraints() -> Option: - return Option( - "-c", - "--constraint", - dest="constraints", - action="append", - default=[], - metavar="file", - help="Constrain versions using the given constraints file. " - "This option can be used multiple times.", - ) - - -def requirements() -> Option: - return Option( - "-r", - "--requirement", - dest="requirements", - action="append", - default=[], - metavar="file", - help="Install from the given requirements file. " - "This option can be used multiple times.", - ) - - -def editable() -> Option: - return Option( - "-e", - "--editable", - dest="editables", - action="append", - default=[], - metavar="path/url", - help=( - "Install a project in editable mode (i.e. setuptools " - '"develop mode") from a local project path or a VCS url.' - ), - ) - - -def _handle_src(option: Option, opt_str: str, value: str, parser: OptionParser) -> None: - value = os.path.abspath(value) - setattr(parser.values, option.dest, value) - - -src: Callable[..., Option] = partial( - PipOption, - "--src", - "--source", - "--source-dir", - "--source-directory", - dest="src_dir", - type="path", - metavar="dir", - default=get_src_prefix(), - action="callback", - callback=_handle_src, - help="Directory to check out editable projects into. " - 'The default in a virtualenv is "<venv path>/src". ' - 'The default for global installs is "<current dir>/src".', -) - - -def _get_format_control(values: Values, option: Option) -> Any: - """Get a format_control object.""" - return getattr(values, option.dest) - - -def _handle_no_binary( - option: Option, opt_str: str, value: str, parser: OptionParser -) -> None: - existing = _get_format_control(parser.values, option) - FormatControl.handle_mutual_excludes( - value, - existing.no_binary, - existing.only_binary, - ) - - -def _handle_only_binary( - option: Option, opt_str: str, value: str, parser: OptionParser -) -> None: - existing = _get_format_control(parser.values, option) - FormatControl.handle_mutual_excludes( - value, - existing.only_binary, - existing.no_binary, - ) - - -def no_binary() -> Option: - format_control = FormatControl(set(), set()) - return Option( - "--no-binary", - dest="format_control", - action="callback", - callback=_handle_no_binary, - type="str", - default=format_control, - help="Do not use binary packages. Can be supplied multiple times, and " - 'each time adds to the existing value. Accepts either ":all:" to ' - 'disable all binary packages, ":none:" to empty the set (notice ' - "the colons), or one or more package names with commas between " - "them (no colons). Note that some packages are tricky to compile " - "and may fail to install when this option is used on them.", - ) - - -def only_binary() -> Option: - format_control = FormatControl(set(), set()) - return Option( - "--only-binary", - dest="format_control", - action="callback", - callback=_handle_only_binary, - type="str", - default=format_control, - help="Do not use source packages. Can be supplied multiple times, and " - 'each time adds to the existing value. Accepts either ":all:" to ' - 'disable all source packages, ":none:" to empty the set, or one ' - "or more package names with commas between them. Packages " - "without binary distributions will fail to install when this " - "option is used on them.", - ) - - -platforms: Callable[..., Option] = partial( - Option, - "--platform", - dest="platforms", - metavar="platform", - action="append", - default=None, - help=( - "Only use wheels compatible with <platform>. Defaults to the " - "platform of the running system. Use this option multiple times to " - "specify multiple platforms supported by the target interpreter." - ), -) - - -# This was made a separate function for unit-testing purposes. -def _convert_python_version(value: str) -> Tuple[Tuple[int, ...], Optional[str]]: - """ - Convert a version string like "3", "37", or "3.7.3" into a tuple of ints. - - :return: A 2-tuple (version_info, error_msg), where `error_msg` is - non-None if and only if there was a parsing error. - """ - if not value: - # The empty string is the same as not providing a value. - return (None, None) - - parts = value.split(".") - if len(parts) > 3: - return ((), "at most three version parts are allowed") - - if len(parts) == 1: - # Then we are in the case of "3" or "37". - value = parts[0] - if len(value) > 1: - parts = [value[0], value[1:]] - - try: - version_info = tuple(int(part) for part in parts) - except ValueError: - return ((), "each version part must be an integer") - - return (version_info, None) - - -def _handle_python_version( - option: Option, opt_str: str, value: str, parser: OptionParser -) -> None: - """ - Handle a provided --python-version value. - """ - version_info, error_msg = _convert_python_version(value) - if error_msg is not None: - msg = f"invalid --python-version value: {value!r}: {error_msg}" - raise_option_error(parser, option=option, msg=msg) - - parser.values.python_version = version_info - - -python_version: Callable[..., Option] = partial( - Option, - "--python-version", - dest="python_version", - metavar="python_version", - action="callback", - callback=_handle_python_version, - type="str", - default=None, - help=dedent( - """\ - The Python interpreter version to use for wheel and "Requires-Python" - compatibility checks. Defaults to a version derived from the running - interpreter. The version can be specified using up to three dot-separated - integers (e.g. "3" for 3.0.0, "3.7" for 3.7.0, or "3.7.3"). A major-minor - version can also be given as a string without dots (e.g. "37" for 3.7.0). - """ - ), -) - - -implementation: Callable[..., Option] = partial( - Option, - "--implementation", - dest="implementation", - metavar="implementation", - default=None, - help=( - "Only use wheels compatible with Python " - "implementation <implementation>, e.g. 'pp', 'jy', 'cp', " - " or 'ip'. If not specified, then the current " - "interpreter implementation is used. Use 'py' to force " - "implementation-agnostic wheels." - ), -) - - -abis: Callable[..., Option] = partial( - Option, - "--abi", - dest="abis", - metavar="abi", - action="append", - default=None, - help=( - "Only use wheels compatible with Python abi <abi>, e.g. 'pypy_41'. " - "If not specified, then the current interpreter abi tag is used. " - "Use this option multiple times to specify multiple abis supported " - "by the target interpreter. Generally you will need to specify " - "--implementation, --platform, and --python-version when using this " - "option." - ), -) - - -def add_target_python_options(cmd_opts: OptionGroup) -> None: - cmd_opts.add_option(platforms()) - cmd_opts.add_option(python_version()) - cmd_opts.add_option(implementation()) - cmd_opts.add_option(abis()) - - -def make_target_python(options: Values) -> TargetPython: - target_python = TargetPython( - platforms=options.platforms, - py_version_info=options.python_version, - abis=options.abis, - implementation=options.implementation, - ) - - return target_python - - -def prefer_binary() -> Option: - return Option( - "--prefer-binary", - dest="prefer_binary", - action="store_true", - default=False, - help=( - "Prefer binary packages over source packages, even if the " - "source packages are newer." - ), - ) - - -cache_dir: Callable[..., Option] = partial( - PipOption, - "--cache-dir", - dest="cache_dir", - default=USER_CACHE_DIR, - metavar="dir", - type="path", - help="Store the cache data in <dir>.", -) - - -def _handle_no_cache_dir( - option: Option, opt: str, value: str, parser: OptionParser -) -> None: - """ - Process a value provided for the --no-cache-dir option. - - This is an optparse.Option callback for the --no-cache-dir option. - """ - # The value argument will be None if --no-cache-dir is passed via the - # command-line, since the option doesn't accept arguments. However, - # the value can be non-None if the option is triggered e.g. by an - # environment variable, like PIP_NO_CACHE_DIR=true. - if value is not None: - # Then parse the string value to get argument error-checking. - try: - strtobool(value) - except ValueError as exc: - raise_option_error(parser, option=option, msg=str(exc)) - - # Originally, setting PIP_NO_CACHE_DIR to a value that strtobool() - # converted to 0 (like "false" or "no") caused cache_dir to be disabled - # rather than enabled (logic would say the latter). Thus, we disable - # the cache directory not just on values that parse to True, but (for - # backwards compatibility reasons) also on values that parse to False. - # In other words, always set it to False if the option is provided in - # some (valid) form. - parser.values.cache_dir = False - - -no_cache: Callable[..., Option] = partial( - Option, - "--no-cache-dir", - dest="cache_dir", - action="callback", - callback=_handle_no_cache_dir, - help="Disable the cache.", -) - -no_deps: Callable[..., Option] = partial( - Option, - "--no-deps", - "--no-dependencies", - dest="ignore_dependencies", - action="store_true", - default=False, - help="Don't install package dependencies.", -) - -ignore_requires_python: Callable[..., Option] = partial( - Option, - "--ignore-requires-python", - dest="ignore_requires_python", - action="store_true", - help="Ignore the Requires-Python information.", -) - -no_build_isolation: Callable[..., Option] = partial( - Option, - "--no-build-isolation", - dest="build_isolation", - action="store_false", - default=True, - help="Disable isolation when building a modern source distribution. " - "Build dependencies specified by PEP 518 must be already installed " - "if this option is used.", -) - -check_build_deps: Callable[..., Option] = partial( - Option, - "--check-build-dependencies", - dest="check_build_deps", - action="store_true", - default=False, - help="Check the build dependencies when PEP517 is used.", -) - - -def _handle_no_use_pep517( - option: Option, opt: str, value: str, parser: OptionParser -) -> None: - """ - Process a value provided for the --no-use-pep517 option. - - This is an optparse.Option callback for the no_use_pep517 option. - """ - # Since --no-use-pep517 doesn't accept arguments, the value argument - # will be None if --no-use-pep517 is passed via the command-line. - # However, the value can be non-None if the option is triggered e.g. - # by an environment variable, for example "PIP_NO_USE_PEP517=true". - if value is not None: - msg = """A value was passed for --no-use-pep517, - probably using either the PIP_NO_USE_PEP517 environment variable - or the "no-use-pep517" config file option. Use an appropriate value - of the PIP_USE_PEP517 environment variable or the "use-pep517" - config file option instead. - """ - raise_option_error(parser, option=option, msg=msg) - - # If user doesn't wish to use pep517, we check if setuptools and wheel are installed - # and raise error if it is not. - packages = ("setuptools", "wheel") - if not all(importlib.util.find_spec(package) for package in packages): - msg = ( - f"It is not possible to use --no-use-pep517 " - f"without {' and '.join(packages)} installed." - ) - raise_option_error(parser, option=option, msg=msg) - - # Otherwise, --no-use-pep517 was passed via the command-line. - parser.values.use_pep517 = False - - -use_pep517: Any = partial( - Option, - "--use-pep517", - dest="use_pep517", - action="store_true", - default=None, - help="Use PEP 517 for building source distributions " - "(use --no-use-pep517 to force legacy behaviour).", -) - -no_use_pep517: Any = partial( - Option, - "--no-use-pep517", - dest="use_pep517", - action="callback", - callback=_handle_no_use_pep517, - default=None, - help=SUPPRESS_HELP, -) - - -def _handle_config_settings( - option: Option, opt_str: str, value: str, parser: OptionParser -) -> None: - key, sep, val = value.partition("=") - if sep != "=": - parser.error(f"Arguments to {opt_str} must be of the form KEY=VAL") - dest = getattr(parser.values, option.dest) - if dest is None: - dest = {} - setattr(parser.values, option.dest, dest) - if key in dest: - if isinstance(dest[key], list): - dest[key].append(val) - else: - dest[key] = [dest[key], val] - else: - dest[key] = val - - -config_settings: Callable[..., Option] = partial( - Option, - "-C", - "--config-settings", - dest="config_settings", - type=str, - action="callback", - callback=_handle_config_settings, - metavar="settings", - help="Configuration settings to be passed to the PEP 517 build backend. " - "Settings take the form KEY=VALUE. Use multiple --config-settings options " - "to pass multiple keys to the backend.", -) - -build_options: Callable[..., Option] = partial( - Option, - "--build-option", - dest="build_options", - metavar="options", - action="append", - help="Extra arguments to be supplied to 'setup.py bdist_wheel'.", -) - -global_options: Callable[..., Option] = partial( - Option, - "--global-option", - dest="global_options", - action="append", - metavar="options", - help="Extra global options to be supplied to the setup.py " - "call before the install or bdist_wheel command.", -) - -no_clean: Callable[..., Option] = partial( - Option, - "--no-clean", - action="store_true", - default=False, - help="Don't clean up build directories.", -) - -pre: Callable[..., Option] = partial( - Option, - "--pre", - action="store_true", - default=False, - help="Include pre-release and development versions. By default, " - "pip only finds stable versions.", -) - -disable_pip_version_check: Callable[..., Option] = partial( - Option, - "--disable-pip-version-check", - dest="disable_pip_version_check", - action="store_true", - default=True, - help="Don't periodically check PyPI to determine whether a new version " - "of pip is available for download. Implied with --no-index.", -) - -root_user_action: Callable[..., Option] = partial( - Option, - "--root-user-action", - dest="root_user_action", - default="warn", - choices=["warn", "ignore"], - help="Action if pip is run as a root user. By default, a warning message is shown.", -) - - -def _handle_merge_hash( - option: Option, opt_str: str, value: str, parser: OptionParser -) -> None: - """Given a value spelled "algo:digest", append the digest to a list - pointed to in a dict by the algo name.""" - if not parser.values.hashes: - parser.values.hashes = {} - try: - algo, digest = value.split(":", 1) - except ValueError: - parser.error( - f"Arguments to {opt_str} must be a hash name " - "followed by a value, like --hash=sha256:" - "abcde..." - ) - if algo not in STRONG_HASHES: - parser.error( - "Allowed hash algorithms for {} are {}.".format( - opt_str, ", ".join(STRONG_HASHES) - ) - ) - parser.values.hashes.setdefault(algo, []).append(digest) - - -hash: Callable[..., Option] = partial( - Option, - "--hash", - # Hash values eventually end up in InstallRequirement.hashes due to - # __dict__ copying in process_line(). - dest="hashes", - action="callback", - callback=_handle_merge_hash, - type="string", - help="Verify that the package's archive matches this " - "hash before installing. Example: --hash=sha256:abcdef...", -) - - -require_hashes: Callable[..., Option] = partial( - Option, - "--require-hashes", - dest="require_hashes", - action="store_true", - default=False, - help="Require a hash to check each requirement against, for " - "repeatable installs. This option is implied when any package in a " - "requirements file has a --hash option.", -) - - -list_path: Callable[..., Option] = partial( - PipOption, - "--path", - dest="path", - type="path", - action="append", - help="Restrict to the specified installation path for listing " - "packages (can be used multiple times).", -) - - -def check_list_path_option(options: Values) -> None: - if options.path and (options.user or options.local): - raise CommandError("Cannot combine '--path' with '--user' or '--local'") - - -list_exclude: Callable[..., Option] = partial( - PipOption, - "--exclude", - dest="excludes", - action="append", - metavar="package", - type="package_name", - help="Exclude specified package from the output", -) - - -no_python_version_warning: Callable[..., Option] = partial( - Option, - "--no-python-version-warning", - dest="no_python_version_warning", - action="store_true", - default=False, - help="Silence deprecation warnings for upcoming unsupported Pythons.", -) - - -# Features that are now always on. A warning is printed if they are used. -ALWAYS_ENABLED_FEATURES = [ - "no-binary-enable-wheel-cache", # always on since 23.1 -] - -use_new_feature: Callable[..., Option] = partial( - Option, - "--use-feature", - dest="features_enabled", - metavar="feature", - action="append", - default=[], - choices=[ - "fast-deps", - "truststore", - ] - + ALWAYS_ENABLED_FEATURES, - help="Enable new functionality, that may be backward incompatible.", -) - -use_deprecated_feature: Callable[..., Option] = partial( - Option, - "--use-deprecated", - dest="deprecated_features_enabled", - metavar="feature", - action="append", - default=[], - choices=[ - "legacy-resolver", - ], - help=("Enable deprecated functionality, that will be removed in the future."), -) - - -########## -# groups # -########## - -general_group: Dict[str, Any] = { - "name": "General Options", - "options": [ - help_, - debug_mode, - isolated_mode, - require_virtualenv, - python, - verbose, - version, - quiet, - log, - no_input, - keyring_provider, - proxy, - retries, - timeout, - exists_action, - trusted_host, - cert, - client_cert, - cache_dir, - no_cache, - disable_pip_version_check, - no_color, - no_python_version_warning, - use_new_feature, - use_deprecated_feature, - ], -} - -index_group: Dict[str, Any] = { - "name": "Package Index Options", - "options": [ - index_url, - extra_index_url, - no_index, - find_links, - ], -} diff --git a/venv/lib/python3.12/site-packages/pip/_internal/cli/command_context.py b/venv/lib/python3.12/site-packages/pip/_internal/cli/command_context.py deleted file mode 100644 index 139995a..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/cli/command_context.py +++ /dev/null @@ -1,27 +0,0 @@ -from contextlib import ExitStack, contextmanager -from typing import ContextManager, Generator, TypeVar - -_T = TypeVar("_T", covariant=True) - - -class CommandContextMixIn: - def __init__(self) -> None: - super().__init__() - self._in_main_context = False - self._main_context = ExitStack() - - @contextmanager - def main_context(self) -> Generator[None, None, None]: - assert not self._in_main_context - - self._in_main_context = True - try: - with self._main_context: - yield - finally: - self._in_main_context = False - - def enter_context(self, context_provider: ContextManager[_T]) -> _T: - assert self._in_main_context - - return self._main_context.enter_context(context_provider) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/cli/main.py b/venv/lib/python3.12/site-packages/pip/_internal/cli/main.py deleted file mode 100644 index 7e061f5..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/cli/main.py +++ /dev/null @@ -1,79 +0,0 @@ -"""Primary application entrypoint. -""" -import locale -import logging -import os -import sys -import warnings -from typing import List, Optional - -from pip._internal.cli.autocompletion import autocomplete -from pip._internal.cli.main_parser import parse_command -from pip._internal.commands import create_command -from pip._internal.exceptions import PipError -from pip._internal.utils import deprecation - -logger = logging.getLogger(__name__) - - -# Do not import and use main() directly! Using it directly is actively -# discouraged by pip's maintainers. The name, location and behavior of -# this function is subject to change, so calling it directly is not -# portable across different pip versions. - -# In addition, running pip in-process is unsupported and unsafe. This is -# elaborated in detail at -# https://pip.pypa.io/en/stable/user_guide/#using-pip-from-your-program. -# That document also provides suggestions that should work for nearly -# all users that are considering importing and using main() directly. - -# However, we know that certain users will still want to invoke pip -# in-process. If you understand and accept the implications of using pip -# in an unsupported manner, the best approach is to use runpy to avoid -# depending on the exact location of this entry point. - -# The following example shows how to use runpy to invoke pip in that -# case: -# -# sys.argv = ["pip", your, args, here] -# runpy.run_module("pip", run_name="__main__") -# -# Note that this will exit the process after running, unlike a direct -# call to main. As it is not safe to do any processing after calling -# main, this should not be an issue in practice. - - -def main(args: Optional[List[str]] = None) -> int: - if args is None: - args = sys.argv[1:] - - # Suppress the pkg_resources deprecation warning - # Note - we use a module of .*pkg_resources to cover - # the normal case (pip._vendor.pkg_resources) and the - # devendored case (a bare pkg_resources) - warnings.filterwarnings( - action="ignore", category=DeprecationWarning, module=".*pkg_resources" - ) - - # Configure our deprecation warnings to be sent through loggers - deprecation.install_warning_logger() - - autocomplete() - - try: - cmd_name, cmd_args = parse_command(args) - except PipError as exc: - sys.stderr.write(f"ERROR: {exc}") - sys.stderr.write(os.linesep) - sys.exit(1) - - # Needed for locale.getpreferredencoding(False) to work - # in pip._internal.utils.encoding.auto_decode - try: - locale.setlocale(locale.LC_ALL, "") - except locale.Error as e: - # setlocale can apparently crash if locale are uninitialized - logger.debug("Ignoring error %s when setting locale", e) - command = create_command(cmd_name, isolated=("--isolated" in cmd_args)) - - return command.main(cmd_args) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/cli/main_parser.py b/venv/lib/python3.12/site-packages/pip/_internal/cli/main_parser.py deleted file mode 100644 index 5ade356..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/cli/main_parser.py +++ /dev/null @@ -1,134 +0,0 @@ -"""A single place for constructing and exposing the main parser -""" - -import os -import subprocess -import sys -from typing import List, Optional, Tuple - -from pip._internal.build_env import get_runnable_pip -from pip._internal.cli import cmdoptions -from pip._internal.cli.parser import ConfigOptionParser, UpdatingDefaultsHelpFormatter -from pip._internal.commands import commands_dict, get_similar_commands -from pip._internal.exceptions import CommandError -from pip._internal.utils.misc import get_pip_version, get_prog - -__all__ = ["create_main_parser", "parse_command"] - - -def create_main_parser() -> ConfigOptionParser: - """Creates and returns the main parser for pip's CLI""" - - parser = ConfigOptionParser( - usage="\n%prog <command> [options]", - add_help_option=False, - formatter=UpdatingDefaultsHelpFormatter(), - name="global", - prog=get_prog(), - ) - parser.disable_interspersed_args() - - parser.version = get_pip_version() - - # add the general options - gen_opts = cmdoptions.make_option_group(cmdoptions.general_group, parser) - parser.add_option_group(gen_opts) - - # so the help formatter knows - parser.main = True # type: ignore - - # create command listing for description - description = [""] + [ - f"{name:27} {command_info.summary}" - for name, command_info in commands_dict.items() - ] - parser.description = "\n".join(description) - - return parser - - -def identify_python_interpreter(python: str) -> Optional[str]: - # If the named file exists, use it. - # If it's a directory, assume it's a virtual environment and - # look for the environment's Python executable. - if os.path.exists(python): - if os.path.isdir(python): - # bin/python for Unix, Scripts/python.exe for Windows - # Try both in case of odd cases like cygwin. - for exe in ("bin/python", "Scripts/python.exe"): - py = os.path.join(python, exe) - if os.path.exists(py): - return py - else: - return python - - # Could not find the interpreter specified - return None - - -def parse_command(args: List[str]) -> Tuple[str, List[str]]: - parser = create_main_parser() - - # Note: parser calls disable_interspersed_args(), so the result of this - # call is to split the initial args into the general options before the - # subcommand and everything else. - # For example: - # args: ['--timeout=5', 'install', '--user', 'INITools'] - # general_options: ['--timeout==5'] - # args_else: ['install', '--user', 'INITools'] - general_options, args_else = parser.parse_args(args) - - # --python - if general_options.python and "_PIP_RUNNING_IN_SUBPROCESS" not in os.environ: - # Re-invoke pip using the specified Python interpreter - interpreter = identify_python_interpreter(general_options.python) - if interpreter is None: - raise CommandError( - f"Could not locate Python interpreter {general_options.python}" - ) - - pip_cmd = [ - interpreter, - get_runnable_pip(), - ] - pip_cmd.extend(args) - - # Set a flag so the child doesn't re-invoke itself, causing - # an infinite loop. - os.environ["_PIP_RUNNING_IN_SUBPROCESS"] = "1" - returncode = 0 - try: - proc = subprocess.run(pip_cmd) - returncode = proc.returncode - except (subprocess.SubprocessError, OSError) as exc: - raise CommandError(f"Failed to run pip under {interpreter}: {exc}") - sys.exit(returncode) - - # --version - if general_options.version: - sys.stdout.write(parser.version) - sys.stdout.write(os.linesep) - sys.exit() - - # pip || pip help -> print_help() - if not args_else or (args_else[0] == "help" and len(args_else) == 1): - parser.print_help() - sys.exit() - - # the subcommand name - cmd_name = args_else[0] - - if cmd_name not in commands_dict: - guess = get_similar_commands(cmd_name) - - msg = [f'unknown command "{cmd_name}"'] - if guess: - msg.append(f'maybe you meant "{guess}"') - - raise CommandError(" - ".join(msg)) - - # all the args without the subcommand - cmd_args = args[:] - cmd_args.remove(cmd_name) - - return cmd_name, cmd_args diff --git a/venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py b/venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py deleted file mode 100644 index ae554b2..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py +++ /dev/null @@ -1,294 +0,0 @@ -"""Base option parser setup""" - -import logging -import optparse -import shutil -import sys -import textwrap -from contextlib import suppress -from typing import Any, Dict, Generator, List, Tuple - -from pip._internal.cli.status_codes import UNKNOWN_ERROR -from pip._internal.configuration import Configuration, ConfigurationError -from pip._internal.utils.misc import redact_auth_from_url, strtobool - -logger = logging.getLogger(__name__) - - -class PrettyHelpFormatter(optparse.IndentedHelpFormatter): - """A prettier/less verbose help formatter for optparse.""" - - def __init__(self, *args: Any, **kwargs: Any) -> None: - # help position must be aligned with __init__.parseopts.description - kwargs["max_help_position"] = 30 - kwargs["indent_increment"] = 1 - kwargs["width"] = shutil.get_terminal_size()[0] - 2 - super().__init__(*args, **kwargs) - - def format_option_strings(self, option: optparse.Option) -> str: - return self._format_option_strings(option) - - def _format_option_strings( - self, option: optparse.Option, mvarfmt: str = " <{}>", optsep: str = ", " - ) -> str: - """ - Return a comma-separated list of option strings and metavars. - - :param option: tuple of (short opt, long opt), e.g: ('-f', '--format') - :param mvarfmt: metavar format string - :param optsep: separator - """ - opts = [] - - if option._short_opts: - opts.append(option._short_opts[0]) - if option._long_opts: - opts.append(option._long_opts[0]) - if len(opts) > 1: - opts.insert(1, optsep) - - if option.takes_value(): - assert option.dest is not None - metavar = option.metavar or option.dest.lower() - opts.append(mvarfmt.format(metavar.lower())) - - return "".join(opts) - - def format_heading(self, heading: str) -> str: - if heading == "Options": - return "" - return heading + ":\n" - - def format_usage(self, usage: str) -> str: - """ - Ensure there is only one newline between usage and the first heading - if there is no description. - """ - msg = "\nUsage: {}\n".format(self.indent_lines(textwrap.dedent(usage), " ")) - return msg - - def format_description(self, description: str) -> str: - # leave full control over description to us - if description: - if hasattr(self.parser, "main"): - label = "Commands" - else: - label = "Description" - # some doc strings have initial newlines, some don't - description = description.lstrip("\n") - # some doc strings have final newlines and spaces, some don't - description = description.rstrip() - # dedent, then reindent - description = self.indent_lines(textwrap.dedent(description), " ") - description = f"{label}:\n{description}\n" - return description - else: - return "" - - def format_epilog(self, epilog: str) -> str: - # leave full control over epilog to us - if epilog: - return epilog - else: - return "" - - def indent_lines(self, text: str, indent: str) -> str: - new_lines = [indent + line for line in text.split("\n")] - return "\n".join(new_lines) - - -class UpdatingDefaultsHelpFormatter(PrettyHelpFormatter): - """Custom help formatter for use in ConfigOptionParser. - - This is updates the defaults before expanding them, allowing - them to show up correctly in the help listing. - - Also redact auth from url type options - """ - - def expand_default(self, option: optparse.Option) -> str: - default_values = None - if self.parser is not None: - assert isinstance(self.parser, ConfigOptionParser) - self.parser._update_defaults(self.parser.defaults) - assert option.dest is not None - default_values = self.parser.defaults.get(option.dest) - help_text = super().expand_default(option) - - if default_values and option.metavar == "URL": - if isinstance(default_values, str): - default_values = [default_values] - - # If its not a list, we should abort and just return the help text - if not isinstance(default_values, list): - default_values = [] - - for val in default_values: - help_text = help_text.replace(val, redact_auth_from_url(val)) - - return help_text - - -class CustomOptionParser(optparse.OptionParser): - def insert_option_group( - self, idx: int, *args: Any, **kwargs: Any - ) -> optparse.OptionGroup: - """Insert an OptionGroup at a given position.""" - group = self.add_option_group(*args, **kwargs) - - self.option_groups.pop() - self.option_groups.insert(idx, group) - - return group - - @property - def option_list_all(self) -> List[optparse.Option]: - """Get a list of all options, including those in option groups.""" - res = self.option_list[:] - for i in self.option_groups: - res.extend(i.option_list) - - return res - - -class ConfigOptionParser(CustomOptionParser): - """Custom option parser which updates its defaults by checking the - configuration files and environmental variables""" - - def __init__( - self, - *args: Any, - name: str, - isolated: bool = False, - **kwargs: Any, - ) -> None: - self.name = name - self.config = Configuration(isolated) - - assert self.name - super().__init__(*args, **kwargs) - - def check_default(self, option: optparse.Option, key: str, val: Any) -> Any: - try: - return option.check_value(key, val) - except optparse.OptionValueError as exc: - print(f"An error occurred during configuration: {exc}") - sys.exit(3) - - def _get_ordered_configuration_items( - self, - ) -> Generator[Tuple[str, Any], None, None]: - # Configuration gives keys in an unordered manner. Order them. - override_order = ["global", self.name, ":env:"] - - # Pool the options into different groups - section_items: Dict[str, List[Tuple[str, Any]]] = { - name: [] for name in override_order - } - for section_key, val in self.config.items(): - # ignore empty values - if not val: - logger.debug( - "Ignoring configuration key '%s' as it's value is empty.", - section_key, - ) - continue - - section, key = section_key.split(".", 1) - if section in override_order: - section_items[section].append((key, val)) - - # Yield each group in their override order - for section in override_order: - for key, val in section_items[section]: - yield key, val - - def _update_defaults(self, defaults: Dict[str, Any]) -> Dict[str, Any]: - """Updates the given defaults with values from the config files and - the environ. Does a little special handling for certain types of - options (lists).""" - - # Accumulate complex default state. - self.values = optparse.Values(self.defaults) - late_eval = set() - # Then set the options with those values - for key, val in self._get_ordered_configuration_items(): - # '--' because configuration supports only long names - option = self.get_option("--" + key) - - # Ignore options not present in this parser. E.g. non-globals put - # in [global] by users that want them to apply to all applicable - # commands. - if option is None: - continue - - assert option.dest is not None - - if option.action in ("store_true", "store_false"): - try: - val = strtobool(val) - except ValueError: - self.error( - f"{val} is not a valid value for {key} option, " - "please specify a boolean value like yes/no, " - "true/false or 1/0 instead." - ) - elif option.action == "count": - with suppress(ValueError): - val = strtobool(val) - with suppress(ValueError): - val = int(val) - if not isinstance(val, int) or val < 0: - self.error( - f"{val} is not a valid value for {key} option, " - "please instead specify either a non-negative integer " - "or a boolean value like yes/no or false/true " - "which is equivalent to 1/0." - ) - elif option.action == "append": - val = val.split() - val = [self.check_default(option, key, v) for v in val] - elif option.action == "callback": - assert option.callback is not None - late_eval.add(option.dest) - opt_str = option.get_opt_string() - val = option.convert_value(opt_str, val) - # From take_action - args = option.callback_args or () - kwargs = option.callback_kwargs or {} - option.callback(option, opt_str, val, self, *args, **kwargs) - else: - val = self.check_default(option, key, val) - - defaults[option.dest] = val - - for key in late_eval: - defaults[key] = getattr(self.values, key) - self.values = None - return defaults - - def get_default_values(self) -> optparse.Values: - """Overriding to make updating the defaults after instantiation of - the option parser possible, _update_defaults() does the dirty work.""" - if not self.process_default_values: - # Old, pre-Optik 1.5 behaviour. - return optparse.Values(self.defaults) - - # Load the configuration, or error out in case of an error - try: - self.config.load() - except ConfigurationError as err: - self.exit(UNKNOWN_ERROR, str(err)) - - defaults = self._update_defaults(self.defaults.copy()) # ours - for option in self._get_all_options(): - assert option.dest is not None - default = defaults.get(option.dest) - if isinstance(default, str): - opt_str = option.get_opt_string() - defaults[option.dest] = option.check_value(opt_str, default) - return optparse.Values(defaults) - - def error(self, msg: str) -> None: - self.print_usage(sys.stderr) - self.exit(UNKNOWN_ERROR, f"{msg}\n") diff --git a/venv/lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py b/venv/lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py deleted file mode 100644 index 0ad1403..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py +++ /dev/null @@ -1,68 +0,0 @@ -import functools -from typing import Callable, Generator, Iterable, Iterator, Optional, Tuple - -from pip._vendor.rich.progress import ( - BarColumn, - DownloadColumn, - FileSizeColumn, - Progress, - ProgressColumn, - SpinnerColumn, - TextColumn, - TimeElapsedColumn, - TimeRemainingColumn, - TransferSpeedColumn, -) - -from pip._internal.utils.logging import get_indentation - -DownloadProgressRenderer = Callable[[Iterable[bytes]], Iterator[bytes]] - - -def _rich_progress_bar( - iterable: Iterable[bytes], - *, - bar_type: str, - size: int, -) -> Generator[bytes, None, None]: - assert bar_type == "on", "This should only be used in the default mode." - - if not size: - total = float("inf") - columns: Tuple[ProgressColumn, ...] = ( - TextColumn("[progress.description]{task.description}"), - SpinnerColumn("line", speed=1.5), - FileSizeColumn(), - TransferSpeedColumn(), - TimeElapsedColumn(), - ) - else: - total = size - columns = ( - TextColumn("[progress.description]{task.description}"), - BarColumn(), - DownloadColumn(), - TransferSpeedColumn(), - TextColumn("eta"), - TimeRemainingColumn(), - ) - - progress = Progress(*columns, refresh_per_second=30) - task_id = progress.add_task(" " * (get_indentation() + 2), total=total) - with progress: - for chunk in iterable: - yield chunk - progress.update(task_id, advance=len(chunk)) - - -def get_download_progress_renderer( - *, bar_type: str, size: Optional[int] = None -) -> DownloadProgressRenderer: - """Get an object that can be used to render the download progress. - - Returns a callable, that takes an iterable to "wrap". - """ - if bar_type == "on": - return functools.partial(_rich_progress_bar, bar_type=bar_type, size=size) - else: - return iter # no-op, when passed an iterator diff --git a/venv/lib/python3.12/site-packages/pip/_internal/cli/req_command.py b/venv/lib/python3.12/site-packages/pip/_internal/cli/req_command.py deleted file mode 100644 index 6f2f79c..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/cli/req_command.py +++ /dev/null @@ -1,505 +0,0 @@ -"""Contains the Command base classes that depend on PipSession. - -The classes in this module are in a separate module so the commands not -needing download / PackageFinder capability don't unnecessarily import the -PackageFinder machinery and all its vendored dependencies, etc. -""" - -import logging -import os -import sys -from functools import partial -from optparse import Values -from typing import TYPE_CHECKING, Any, List, Optional, Tuple - -from pip._internal.cache import WheelCache -from pip._internal.cli import cmdoptions -from pip._internal.cli.base_command import Command -from pip._internal.cli.command_context import CommandContextMixIn -from pip._internal.exceptions import CommandError, PreviousBuildDirError -from pip._internal.index.collector import LinkCollector -from pip._internal.index.package_finder import PackageFinder -from pip._internal.models.selection_prefs import SelectionPreferences -from pip._internal.models.target_python import TargetPython -from pip._internal.network.session import PipSession -from pip._internal.operations.build.build_tracker import BuildTracker -from pip._internal.operations.prepare import RequirementPreparer -from pip._internal.req.constructors import ( - install_req_from_editable, - install_req_from_line, - install_req_from_parsed_requirement, - install_req_from_req_string, -) -from pip._internal.req.req_file import parse_requirements -from pip._internal.req.req_install import InstallRequirement -from pip._internal.resolution.base import BaseResolver -from pip._internal.self_outdated_check import pip_self_version_check -from pip._internal.utils.temp_dir import ( - TempDirectory, - TempDirectoryTypeRegistry, - tempdir_kinds, -) -from pip._internal.utils.virtualenv import running_under_virtualenv - -if TYPE_CHECKING: - from ssl import SSLContext - -logger = logging.getLogger(__name__) - - -def _create_truststore_ssl_context() -> Optional["SSLContext"]: - if sys.version_info < (3, 10): - raise CommandError("The truststore feature is only available for Python 3.10+") - - try: - import ssl - except ImportError: - logger.warning("Disabling truststore since ssl support is missing") - return None - - try: - from pip._vendor import truststore - except ImportError as e: - raise CommandError(f"The truststore feature is unavailable: {e}") - - return truststore.SSLContext(ssl.PROTOCOL_TLS_CLIENT) - - -class SessionCommandMixin(CommandContextMixIn): - - """ - A class mixin for command classes needing _build_session(). - """ - - def __init__(self) -> None: - super().__init__() - self._session: Optional[PipSession] = None - - @classmethod - def _get_index_urls(cls, options: Values) -> Optional[List[str]]: - """Return a list of index urls from user-provided options.""" - index_urls = [] - if not getattr(options, "no_index", False): - url = getattr(options, "index_url", None) - if url: - index_urls.append(url) - urls = getattr(options, "extra_index_urls", None) - if urls: - index_urls.extend(urls) - # Return None rather than an empty list - return index_urls or None - - def get_default_session(self, options: Values) -> PipSession: - """Get a default-managed session.""" - if self._session is None: - self._session = self.enter_context(self._build_session(options)) - # there's no type annotation on requests.Session, so it's - # automatically ContextManager[Any] and self._session becomes Any, - # then https://github.com/python/mypy/issues/7696 kicks in - assert self._session is not None - return self._session - - def _build_session( - self, - options: Values, - retries: Optional[int] = None, - timeout: Optional[int] = None, - fallback_to_certifi: bool = False, - ) -> PipSession: - cache_dir = options.cache_dir - assert not cache_dir or os.path.isabs(cache_dir) - - if "truststore" in options.features_enabled: - try: - ssl_context = _create_truststore_ssl_context() - except Exception: - if not fallback_to_certifi: - raise - ssl_context = None - else: - ssl_context = None - - session = PipSession( - cache=os.path.join(cache_dir, "http-v2") if cache_dir else None, - retries=retries if retries is not None else options.retries, - trusted_hosts=options.trusted_hosts, - index_urls=self._get_index_urls(options), - ssl_context=ssl_context, - ) - - # Handle custom ca-bundles from the user - if options.cert: - session.verify = options.cert - - # Handle SSL client certificate - if options.client_cert: - session.cert = options.client_cert - - # Handle timeouts - if options.timeout or timeout: - session.timeout = timeout if timeout is not None else options.timeout - - # Handle configured proxies - if options.proxy: - session.proxies = { - "http": options.proxy, - "https": options.proxy, - } - - # Determine if we can prompt the user for authentication or not - session.auth.prompting = not options.no_input - session.auth.keyring_provider = options.keyring_provider - - return session - - -class IndexGroupCommand(Command, SessionCommandMixin): - - """ - Abstract base class for commands with the index_group options. - - This also corresponds to the commands that permit the pip version check. - """ - - def handle_pip_version_check(self, options: Values) -> None: - """ - Do the pip version check if not disabled. - - This overrides the default behavior of not doing the check. - """ - # Make sure the index_group options are present. - assert hasattr(options, "no_index") - - if options.disable_pip_version_check or options.no_index: - return - - # Otherwise, check if we're using the latest version of pip available. - session = self._build_session( - options, - retries=0, - timeout=min(5, options.timeout), - # This is set to ensure the function does not fail when truststore is - # specified in use-feature but cannot be loaded. This usually raises a - # CommandError and shows a nice user-facing error, but this function is not - # called in that try-except block. - fallback_to_certifi=True, - ) - with session: - pip_self_version_check(session, options) - - -KEEPABLE_TEMPDIR_TYPES = [ - tempdir_kinds.BUILD_ENV, - tempdir_kinds.EPHEM_WHEEL_CACHE, - tempdir_kinds.REQ_BUILD, -] - - -def warn_if_run_as_root() -> None: - """Output a warning for sudo users on Unix. - - In a virtual environment, sudo pip still writes to virtualenv. - On Windows, users may run pip as Administrator without issues. - This warning only applies to Unix root users outside of virtualenv. - """ - if running_under_virtualenv(): - return - if not hasattr(os, "getuid"): - return - # On Windows, there are no "system managed" Python packages. Installing as - # Administrator via pip is the correct way of updating system environments. - # - # We choose sys.platform over utils.compat.WINDOWS here to enable Mypy platform - # checks: https://mypy.readthedocs.io/en/stable/common_issues.html - if sys.platform == "win32" or sys.platform == "cygwin": - return - - if os.getuid() != 0: - return - - logger.warning( - "Running pip as the 'root' user can result in broken permissions and " - "conflicting behaviour with the system package manager. " - "It is recommended to use a virtual environment instead: " - "https://pip.pypa.io/warnings/venv" - ) - - -def with_cleanup(func: Any) -> Any: - """Decorator for common logic related to managing temporary - directories. - """ - - def configure_tempdir_registry(registry: TempDirectoryTypeRegistry) -> None: - for t in KEEPABLE_TEMPDIR_TYPES: - registry.set_delete(t, False) - - def wrapper( - self: RequirementCommand, options: Values, args: List[Any] - ) -> Optional[int]: - assert self.tempdir_registry is not None - if options.no_clean: - configure_tempdir_registry(self.tempdir_registry) - - try: - return func(self, options, args) - except PreviousBuildDirError: - # This kind of conflict can occur when the user passes an explicit - # build directory with a pre-existing folder. In that case we do - # not want to accidentally remove it. - configure_tempdir_registry(self.tempdir_registry) - raise - - return wrapper - - -class RequirementCommand(IndexGroupCommand): - def __init__(self, *args: Any, **kw: Any) -> None: - super().__init__(*args, **kw) - - self.cmd_opts.add_option(cmdoptions.no_clean()) - - @staticmethod - def determine_resolver_variant(options: Values) -> str: - """Determines which resolver should be used, based on the given options.""" - if "legacy-resolver" in options.deprecated_features_enabled: - return "legacy" - - return "resolvelib" - - @classmethod - def make_requirement_preparer( - cls, - temp_build_dir: TempDirectory, - options: Values, - build_tracker: BuildTracker, - session: PipSession, - finder: PackageFinder, - use_user_site: bool, - download_dir: Optional[str] = None, - verbosity: int = 0, - ) -> RequirementPreparer: - """ - Create a RequirementPreparer instance for the given parameters. - """ - temp_build_dir_path = temp_build_dir.path - assert temp_build_dir_path is not None - legacy_resolver = False - - resolver_variant = cls.determine_resolver_variant(options) - if resolver_variant == "resolvelib": - lazy_wheel = "fast-deps" in options.features_enabled - if lazy_wheel: - logger.warning( - "pip is using lazily downloaded wheels using HTTP " - "range requests to obtain dependency information. " - "This experimental feature is enabled through " - "--use-feature=fast-deps and it is not ready for " - "production." - ) - else: - legacy_resolver = True - lazy_wheel = False - if "fast-deps" in options.features_enabled: - logger.warning( - "fast-deps has no effect when used with the legacy resolver." - ) - - return RequirementPreparer( - build_dir=temp_build_dir_path, - src_dir=options.src_dir, - download_dir=download_dir, - build_isolation=options.build_isolation, - check_build_deps=options.check_build_deps, - build_tracker=build_tracker, - session=session, - progress_bar=options.progress_bar, - finder=finder, - require_hashes=options.require_hashes, - use_user_site=use_user_site, - lazy_wheel=lazy_wheel, - verbosity=verbosity, - legacy_resolver=legacy_resolver, - ) - - @classmethod - def make_resolver( - cls, - preparer: RequirementPreparer, - finder: PackageFinder, - options: Values, - wheel_cache: Optional[WheelCache] = None, - use_user_site: bool = False, - ignore_installed: bool = True, - ignore_requires_python: bool = False, - force_reinstall: bool = False, - upgrade_strategy: str = "to-satisfy-only", - use_pep517: Optional[bool] = None, - py_version_info: Optional[Tuple[int, ...]] = None, - ) -> BaseResolver: - """ - Create a Resolver instance for the given parameters. - """ - make_install_req = partial( - install_req_from_req_string, - isolated=options.isolated_mode, - use_pep517=use_pep517, - ) - resolver_variant = cls.determine_resolver_variant(options) - # The long import name and duplicated invocation is needed to convince - # Mypy into correctly typechecking. Otherwise it would complain the - # "Resolver" class being redefined. - if resolver_variant == "resolvelib": - import pip._internal.resolution.resolvelib.resolver - - return pip._internal.resolution.resolvelib.resolver.Resolver( - preparer=preparer, - finder=finder, - wheel_cache=wheel_cache, - make_install_req=make_install_req, - use_user_site=use_user_site, - ignore_dependencies=options.ignore_dependencies, - ignore_installed=ignore_installed, - ignore_requires_python=ignore_requires_python, - force_reinstall=force_reinstall, - upgrade_strategy=upgrade_strategy, - py_version_info=py_version_info, - ) - import pip._internal.resolution.legacy.resolver - - return pip._internal.resolution.legacy.resolver.Resolver( - preparer=preparer, - finder=finder, - wheel_cache=wheel_cache, - make_install_req=make_install_req, - use_user_site=use_user_site, - ignore_dependencies=options.ignore_dependencies, - ignore_installed=ignore_installed, - ignore_requires_python=ignore_requires_python, - force_reinstall=force_reinstall, - upgrade_strategy=upgrade_strategy, - py_version_info=py_version_info, - ) - - def get_requirements( - self, - args: List[str], - options: Values, - finder: PackageFinder, - session: PipSession, - ) -> List[InstallRequirement]: - """ - Parse command-line arguments into the corresponding requirements. - """ - requirements: List[InstallRequirement] = [] - for filename in options.constraints: - for parsed_req in parse_requirements( - filename, - constraint=True, - finder=finder, - options=options, - session=session, - ): - req_to_add = install_req_from_parsed_requirement( - parsed_req, - isolated=options.isolated_mode, - user_supplied=False, - ) - requirements.append(req_to_add) - - for req in args: - req_to_add = install_req_from_line( - req, - comes_from=None, - isolated=options.isolated_mode, - use_pep517=options.use_pep517, - user_supplied=True, - config_settings=getattr(options, "config_settings", None), - ) - requirements.append(req_to_add) - - for req in options.editables: - req_to_add = install_req_from_editable( - req, - user_supplied=True, - isolated=options.isolated_mode, - use_pep517=options.use_pep517, - config_settings=getattr(options, "config_settings", None), - ) - requirements.append(req_to_add) - - # NOTE: options.require_hashes may be set if --require-hashes is True - for filename in options.requirements: - for parsed_req in parse_requirements( - filename, finder=finder, options=options, session=session - ): - req_to_add = install_req_from_parsed_requirement( - parsed_req, - isolated=options.isolated_mode, - use_pep517=options.use_pep517, - user_supplied=True, - config_settings=parsed_req.options.get("config_settings") - if parsed_req.options - else None, - ) - requirements.append(req_to_add) - - # If any requirement has hash options, enable hash checking. - if any(req.has_hash_options for req in requirements): - options.require_hashes = True - - if not (args or options.editables or options.requirements): - opts = {"name": self.name} - if options.find_links: - raise CommandError( - "You must give at least one requirement to {name} " - '(maybe you meant "pip {name} {links}"?)'.format( - **dict(opts, links=" ".join(options.find_links)) - ) - ) - else: - raise CommandError( - "You must give at least one requirement to {name} " - '(see "pip help {name}")'.format(**opts) - ) - - return requirements - - @staticmethod - def trace_basic_info(finder: PackageFinder) -> None: - """ - Trace basic information about the provided objects. - """ - # Display where finder is looking for packages - search_scope = finder.search_scope - locations = search_scope.get_formatted_locations() - if locations: - logger.info(locations) - - def _build_package_finder( - self, - options: Values, - session: PipSession, - target_python: Optional[TargetPython] = None, - ignore_requires_python: Optional[bool] = None, - ) -> PackageFinder: - """ - Create a package finder appropriate to this requirement command. - - :param ignore_requires_python: Whether to ignore incompatible - "Requires-Python" values in links. Defaults to False. - """ - link_collector = LinkCollector.create(session, options=options) - selection_prefs = SelectionPreferences( - allow_yanked=True, - format_control=options.format_control, - allow_all_prereleases=options.pre, - prefer_binary=options.prefer_binary, - ignore_requires_python=ignore_requires_python, - ) - - return PackageFinder.create( - link_collector=link_collector, - selection_prefs=selection_prefs, - target_python=target_python, - ) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/cli/spinners.py b/venv/lib/python3.12/site-packages/pip/_internal/cli/spinners.py deleted file mode 100644 index cf2b976..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/cli/spinners.py +++ /dev/null @@ -1,159 +0,0 @@ -import contextlib -import itertools -import logging -import sys -import time -from typing import IO, Generator, Optional - -from pip._internal.utils.compat import WINDOWS -from pip._internal.utils.logging import get_indentation - -logger = logging.getLogger(__name__) - - -class SpinnerInterface: - def spin(self) -> None: - raise NotImplementedError() - - def finish(self, final_status: str) -> None: - raise NotImplementedError() - - -class InteractiveSpinner(SpinnerInterface): - def __init__( - self, - message: str, - file: Optional[IO[str]] = None, - spin_chars: str = "-\\|/", - # Empirically, 8 updates/second looks nice - min_update_interval_seconds: float = 0.125, - ): - self._message = message - if file is None: - file = sys.stdout - self._file = file - self._rate_limiter = RateLimiter(min_update_interval_seconds) - self._finished = False - - self._spin_cycle = itertools.cycle(spin_chars) - - self._file.write(" " * get_indentation() + self._message + " ... ") - self._width = 0 - - def _write(self, status: str) -> None: - assert not self._finished - # Erase what we wrote before by backspacing to the beginning, writing - # spaces to overwrite the old text, and then backspacing again - backup = "\b" * self._width - self._file.write(backup + " " * self._width + backup) - # Now we have a blank slate to add our status - self._file.write(status) - self._width = len(status) - self._file.flush() - self._rate_limiter.reset() - - def spin(self) -> None: - if self._finished: - return - if not self._rate_limiter.ready(): - return - self._write(next(self._spin_cycle)) - - def finish(self, final_status: str) -> None: - if self._finished: - return - self._write(final_status) - self._file.write("\n") - self._file.flush() - self._finished = True - - -# Used for dumb terminals, non-interactive installs (no tty), etc. -# We still print updates occasionally (once every 60 seconds by default) to -# act as a keep-alive for systems like Travis-CI that take lack-of-output as -# an indication that a task has frozen. -class NonInteractiveSpinner(SpinnerInterface): - def __init__(self, message: str, min_update_interval_seconds: float = 60.0) -> None: - self._message = message - self._finished = False - self._rate_limiter = RateLimiter(min_update_interval_seconds) - self._update("started") - - def _update(self, status: str) -> None: - assert not self._finished - self._rate_limiter.reset() - logger.info("%s: %s", self._message, status) - - def spin(self) -> None: - if self._finished: - return - if not self._rate_limiter.ready(): - return - self._update("still running...") - - def finish(self, final_status: str) -> None: - if self._finished: - return - self._update(f"finished with status '{final_status}'") - self._finished = True - - -class RateLimiter: - def __init__(self, min_update_interval_seconds: float) -> None: - self._min_update_interval_seconds = min_update_interval_seconds - self._last_update: float = 0 - - def ready(self) -> bool: - now = time.time() - delta = now - self._last_update - return delta >= self._min_update_interval_seconds - - def reset(self) -> None: - self._last_update = time.time() - - -@contextlib.contextmanager -def open_spinner(message: str) -> Generator[SpinnerInterface, None, None]: - # Interactive spinner goes directly to sys.stdout rather than being routed - # through the logging system, but it acts like it has level INFO, - # i.e. it's only displayed if we're at level INFO or better. - # Non-interactive spinner goes through the logging system, so it is always - # in sync with logging configuration. - if sys.stdout.isatty() and logger.getEffectiveLevel() <= logging.INFO: - spinner: SpinnerInterface = InteractiveSpinner(message) - else: - spinner = NonInteractiveSpinner(message) - try: - with hidden_cursor(sys.stdout): - yield spinner - except KeyboardInterrupt: - spinner.finish("canceled") - raise - except Exception: - spinner.finish("error") - raise - else: - spinner.finish("done") - - -HIDE_CURSOR = "\x1b[?25l" -SHOW_CURSOR = "\x1b[?25h" - - -@contextlib.contextmanager -def hidden_cursor(file: IO[str]) -> Generator[None, None, None]: - # The Windows terminal does not support the hide/show cursor ANSI codes, - # even via colorama. So don't even try. - if WINDOWS: - yield - # We don't want to clutter the output with control characters if we're - # writing to a file, or if the user is running with --quiet. - # See https://github.com/pypa/pip/issues/3418 - elif not file.isatty() or logger.getEffectiveLevel() > logging.INFO: - yield - else: - file.write(HIDE_CURSOR) - try: - yield - finally: - file.write(SHOW_CURSOR) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/cli/status_codes.py b/venv/lib/python3.12/site-packages/pip/_internal/cli/status_codes.py deleted file mode 100644 index 5e29502..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/cli/status_codes.py +++ /dev/null @@ -1,6 +0,0 @@ -SUCCESS = 0 -ERROR = 1 -UNKNOWN_ERROR = 2 -VIRTUALENV_NOT_FOUND = 3 -PREVIOUS_BUILD_DIR_ERROR = 4 -NO_MATCHES_FOUND = 23 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/__init__.py b/venv/lib/python3.12/site-packages/pip/_internal/commands/__init__.py deleted file mode 100644 index 858a410..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/commands/__init__.py +++ /dev/null @@ -1,132 +0,0 @@ -""" -Package containing all pip commands -""" - -import importlib -from collections import namedtuple -from typing import Any, Dict, Optional - -from pip._internal.cli.base_command import Command - -CommandInfo = namedtuple("CommandInfo", "module_path, class_name, summary") - -# This dictionary does a bunch of heavy lifting for help output: -# - Enables avoiding additional (costly) imports for presenting `--help`. -# - The ordering matters for help display. -# -# Even though the module path starts with the same "pip._internal.commands" -# prefix, the full path makes testing easier (specifically when modifying -# `commands_dict` in test setup / teardown). -commands_dict: Dict[str, CommandInfo] = { - "install": CommandInfo( - "pip._internal.commands.install", - "InstallCommand", - "Install packages.", - ), - "download": CommandInfo( - "pip._internal.commands.download", - "DownloadCommand", - "Download packages.", - ), - "uninstall": CommandInfo( - "pip._internal.commands.uninstall", - "UninstallCommand", - "Uninstall packages.", - ), - "freeze": CommandInfo( - "pip._internal.commands.freeze", - "FreezeCommand", - "Output installed packages in requirements format.", - ), - "inspect": CommandInfo( - "pip._internal.commands.inspect", - "InspectCommand", - "Inspect the python environment.", - ), - "list": CommandInfo( - "pip._internal.commands.list", - "ListCommand", - "List installed packages.", - ), - "show": CommandInfo( - "pip._internal.commands.show", - "ShowCommand", - "Show information about installed packages.", - ), - "check": CommandInfo( - "pip._internal.commands.check", - "CheckCommand", - "Verify installed packages have compatible dependencies.", - ), - "config": CommandInfo( - "pip._internal.commands.configuration", - "ConfigurationCommand", - "Manage local and global configuration.", - ), - "search": CommandInfo( - "pip._internal.commands.search", - "SearchCommand", - "Search PyPI for packages.", - ), - "cache": CommandInfo( - "pip._internal.commands.cache", - "CacheCommand", - "Inspect and manage pip's wheel cache.", - ), - "index": CommandInfo( - "pip._internal.commands.index", - "IndexCommand", - "Inspect information available from package indexes.", - ), - "wheel": CommandInfo( - "pip._internal.commands.wheel", - "WheelCommand", - "Build wheels from your requirements.", - ), - "hash": CommandInfo( - "pip._internal.commands.hash", - "HashCommand", - "Compute hashes of package archives.", - ), - "completion": CommandInfo( - "pip._internal.commands.completion", - "CompletionCommand", - "A helper command used for command completion.", - ), - "debug": CommandInfo( - "pip._internal.commands.debug", - "DebugCommand", - "Show information useful for debugging.", - ), - "help": CommandInfo( - "pip._internal.commands.help", - "HelpCommand", - "Show help for commands.", - ), -} - - -def create_command(name: str, **kwargs: Any) -> Command: - """ - Create an instance of the Command class with the given name. - """ - module_path, class_name, summary = commands_dict[name] - module = importlib.import_module(module_path) - command_class = getattr(module, class_name) - command = command_class(name=name, summary=summary, **kwargs) - - return command - - -def get_similar_commands(name: str) -> Optional[str]: - """Command name auto-correct.""" - from difflib import get_close_matches - - name = name.lower() - - close_commands = get_close_matches(name, commands_dict.keys()) - - if close_commands: - return close_commands[0] - else: - return None diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 907f546b82193cdd246bd4e7e817970c89921fbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4022 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/cache.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/cache.cpython-312.pyc deleted file mode 100644 index 5fd4d64c4e5a6da58688c08e7d587c434dd796bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9731 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 I!kVo7e|HkC)&Kwi diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/check.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/check.cpython-312.pyc deleted file mode 100644 index bb555b354e143c5b428cf42267dcded670aa9b4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2110 zcma(SOK%fLc-G#RUqBK!Pe_*1s5K<(0#XA~TNMRLrKYKrs2sM9R-4_4y<{I|W;T&i zN8-RC2M*yx)I&vYpj<fiKlD-yB+_kAk!TOS1wvYhQ@>f;Nm_B}%KGMe%zW?f^G}6B z7QttK|84az8KLK#=zLNe+5HZXyU0O~;30#bDNpcIMoQp#+DrSQAtt!!Nxp2z2`+hx zuNtbKF)|4)ds#nc<ovvm_X|cL;VIq`|EO_PKq-XLb**Fg;KW^<LW?rGQ|Kyk)LY2O zV0km$=JwQuQua?yOqYaMzGit5rhti4E@f~klcDchfm2Gw(v_K+FK1$9_N&RsE3>nu zblhcEvAt;4EPK(aV3T4NpR@_K7(UE17f9%vZa|skdDw|hEn6foJzTNuy19f2b;E#~ zV8f&}Y`Y6Cu)uPDnYf@Rj94vVcFWxsgghtTt`5gth};kyWTYIyNINM*bkbOIL@Z-v z0OXE@)dks+Z;3{xu9Va`KgpeLhqW?s4HI{vuI;<0wWFb0)mp-u9r`tkx$_>@99+YJ zg9F>eRA1@MYRNZRBVk4RI;=4s#$2qlu~@W7g~l?$EFyv3&UfNB?-)++&OmMMBG#@D zLYs*gp>I+Mt)^E+w*RV;?$l90tkYNMfSbIKR^^6t8O@EsYo(EHB=KMGWUH;4AFFCZ zYDwXC56~Hw>4+Vnp)}M+#!2z)ZHg_vfNsAfqT9NN8Zx{o{|^iDzJ*?h2qIa{uI5(r zhb)1IU@70oHgcP7FTqYf*f|S!Bq}y!nretdX330kPiE1f_u`?P<Xe978zpIa<@6}k z;79O{$R(KLW7=}nwX2#-wIE~%_0|a_8?B7D9#pOUM?MZ%@@_t2T0M+f{g7PKS58ca z+B^vtanP~BuTyOyi~>h5DTL>faJPvHAXeIaPI8>ZgCz=pQXv*8_7=zy&N&Jo&K;hn zLd}Bl2r4Et**uLE-=&<4b9NXkc&^Pjkq6;*Y%?>kd`!BzlI(u3)?*d$L=@*Z)^;RL zLvCmRF1Oma4PVo8HS}@Ww-{Y2Uk>dkiL1;o%qy|{amrkK5tDHzTn@a@axf_`;b5uk zx%1^(omIo&yngmvnZoFfcP6P^b8BT-01T7B^2#t$e525EvOV-#9ejy`m1BqJQU^{S zI7goYxQVt$KYcX%SyO#`Ew?_mt)996`D69M_Q?AWhaQc5)KrhJDeFVej-Pso)J*r< z)K>4wdt=Ss@{`_)X79w>)ve*tdtP(+{7WPky4SPY$Bu6mKiMj3Tg9QR;_$|eJ74T& zq^|B4X%O#7pkk+pPQ3RLW#6bwzxd-=Q@;wf3f;|Pr`OeuGxunsbF!neZ>tC<M)nE{ z*9!M`B+&JuALV=QEdDUJ-P6A|^?Sbm=Yb24^B1>!2G^!{Axzl7*;qA`TA5~?HBCQs zA`b(eH_aQ7<?#XorI@A@+JHzAg}qDomLPmk<1}R?PD7^2Fpv)r8R4Q69Pm;npbHRs z8o({|i+E{A6bb`3uk6Sp($K~SI|z>Z#ryVyfdqX>UvW-L4cAaA#)=nKD!lJh*mS%< zTMooBtJi?ta%31vuJ4yzw>?*%w<tE-wI_Uq#c#L-{}C*raLvK=U`+mdGpu0(OBwd9 zp7c;MV+SJ__y5~^#9WW+FgtcKesQLP*%SnU3DLM8GLHy|Bt`E6=OAsb)el=m_?Vmp z0pHa05`dkwAPB#rBTv!LQ`GkdI`<p8_;*SaQZEpIy(|*WJ<ANP^*zZ9HZy}87anEa SxhcPrM}?vFi9G~IV&WfT%rdM1 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/completion.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/completion.cpython-312.pyc deleted file mode 100644 index 52530333cd0de937def73b95511252be78586c7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5212 zcmbVQU2Gd!6&~B;pE!2nB>l<uk4q97&(g6sEh=idUbRhA=+dSkNh#}WG)z3#j??js z_s%#!PAu)iO0*JEwGvV*fzZMWt-2CLJg_{i1c(=28Wl*GZ6zd@2gFOD<$-<Tobk-q zPMn3^ku~?+d(Zjqx#ym9?iv3+9*=VH<bJfa@L_`E{)!#<2|C2{6(H_%3a9u~E?aMX zSs(QMs=pM-27EXcQ2A0Y8?<R&4VA*#uuTWmNU0;+VbdWsTI$Sp0v*oAl!(%yM3qh@ z_Cr1!_j6z4l=wTG(nZ4$1ND`&U8_E!`|sG95PVkXTe4cA22lK!qG3WC9@9%DSyPal zzCJcKK0OU&q(Dun%=AL_Vswy{i)FHAEKpUgk(^#CtJEy&8Zk_nnQKOl70YIAPcEt{ zQTdpU<D$fQB*2pzI7z{qSzGf+<Q=<qb#iKa^2!^TBpFKDUFpWPsf*K@fuXfEoUM0f zU!JSg2FRN&!tQELYjcmGbY`eQf4a=%<w@!M^_goD3S1eV8PAN6p%HTOwX{N)(pp7T zi9j0K*J_>u&h97?b)wL`Tv1ITULreoPS()Gbt(BD%_bT|01zbNBwBy=74b}JZqS35 z5GW~-7JH$HtSGxIwX8G602A$LpoTdzL&@aW^{J`xi5YQ35caZ8Tf5Yk8JTM}kEe2z zaf*2|J4=SD#)3qbWEEUNGwF&sD}rz)LsVT><cg{1D_V}s&7CFY0@XYmLIw%WA{WUs zy+rb5*<3h5axxqT%GkcC6dBE#>S~jmZ8S14bZ)>Kq^d!^4kDvIX+y8D98IUt*D*9s z5Jn3SEtECz^ExA{3`0%g?wQpWf|DC=9Nn<TmoM6+TxmXUPj5-e7r`zF1yM%voIOeO zWP^eusVhyfK$4D{YEeUf6UabggS$lR2q4KeCtCt5B9>;#Ma>{$k%;0BY*Qfh*s+69 z5Jz^vG(w?y-Cf>7Mq0OIvZ7WXMp-SI<V|8Pi|5e1*6he!0~|97E`X0~C?e)%GLURz zK4E}}xt2)#F62fJ0Gu(IoS}v(PND%WISw@X=8QZ)zEYMo15%wpMDPP5YPw0j<B8(> zZAF{IoL-P~H!Ecbrj}qOWQuBXiHes^TH0gPmUQ9Zc#Aj1ljl6mDkq1~A5M@VRW{5U zkOFooV9#7o_1sO8A+zA(bY*UIbQ+Jr6&{{lKRY)pU}UCdSg|yX8NVrCqXp1_4XBjO zV%#X23(0|cdLsk7H;;lt<J!`woqOszy#eBF64~%+usRtWH)X4ys_QGHu28K2=O^xP zE>C)w7iL<$5E+xl9X}CV*j<`T(UQL8oLZ~?{~xQZ|Nms&rEH5t)6t{Wn8ff9+BtDM zPu%H<h%rbmVfvg0UnOv}(-lZ}7?h?w4;?28T9iPkHt67Qn1(#BYmsSE+#v<t;^$>! z!3w}_VDXsytY}$Zrpzuka`hsn{th{v=cj?V%TW&Nr>tM`Wdn*o%R?m;e232ll@JXn zVH&29mw-<R(2jgaiNH*Bl^3E`&zM)h0EOwjdg?rZ+NKQY-N~fH)X6+06@$VR1Bu=p zhSsTlQZrVFQM1Cdi5%o{?}-3~mDlrc!{}XZom=##8pNVgn>9v2PoLsf0t&By{_lq$ zI(zkf76hyX15gbHmCnzJ5L4oS&;<zHpA#XW^Z-IHAoT4(;G1__rx(M!$CQ2TZT8S# z=k;-`oUnhQ8WKhHo2p-&w>k||XB5i_!(?~@R?zmI>e2BMTq%uH15%;(iJ~m{UP!j9 z1uJOFTD$`HfW@OTRD+@jE(!Qm)&Y>!BYR>Y8>oZ63+#D@Ujv`Aw9OY2#fF!IRGD?6 z)Zm_rG`JaB0(6h$N{XbHO~Z;p)rS;ZR92`gGlMd#5AJZvOlMdsFdgn7sQL}6<_+{% z^2thiK`+rX-228-`l6nzl&EGJX_Kn7z~qt$86bC)GEvc&HLSKMOD|DvDXkXg)8$oj zLDx>DMoy-UqDjRvBo4VijWpCNX{iYH9MhnZastOd!i}8rs@2(0*r*;I^X7oUfJ`+_ zPlBq(@8I<|w-t%qiQkTIM#x5lY{m9%#S&Y6WUIG-s|S9sY{$8dFTUWy9ntLs*AZ`K z?Q>ZV+N|kMVf_rKhg{TSHtOjn)LvAe^LFQEWOySoeBXEfD?iIT$ow&K<~i(yv%>Ym zGAv$Z1tZs-4lpF_1mcHdzRQ`&Z$Isl#zSYW7BJlpO>RB#&`C%axjTH$U*K~7IY6!P zif^5-g2cQ2?{)B8Em-5%eT!~Vb&#-G4=izP%|x%apGEug*6r2XCcWaVGuUg7tN7g@ zUhLj2WA?aX?ylbVcH-`+7Bc%>E_0ttwL@DEwb$W&-qpdy^l|0^7ipR^`(1kRkV`e% z#iI?{rIcX1^_9@#7hH};yB>5`-PyKkk@NfD)N1@PCxolwB$UUdfnPzpQkkB&hYLjr zOj6Hzeo?eIjCB086#Q1G{(a8Syw(2ksi|vIqvQ>}LP{0GBxTt!$XYF0<q6z#Lc;2G zK6Ni&n~<i*rY=v;Ok4a-x@rKB&P=M<Kvo1l*p``Gwn7S3Aa7U!_{YEs!EFiogrOH( z!7?gtbze9?J??%%11v+AvjT<<X+l<ER&bd?60!J2y{HLchL&f?@P#&nh4G&UqrPz5 z?l@`9V1vM5;A&Woz{3usM1WPa>i*q%1%}aajbFp-ZSLcq!OfoJMo;od&&#($Pfwls z;P@|I`&0jg`(L`Z@4es;jy&$aa4Qb4t<K&%ncJCrmo_>Fp6)+-S9(`^ni$wj9N$PB ze{cDxwIA0W%|A(;*-V_<NSyoa!fzHIC(b=deDit0f1vBur57PC-uwOZW^Zz%H~A>^ zLE*#FuS$=5lTUiD{2_MrY2Tq+6CcOA@4SBd_08Ckjo6W`#FsY{CpQu&AD#Z?*`J^N zp!Vd{)hCIG7Xg2~3$XSbzBTcme;wpr8uJ+#^FN7=y~+!I)&=y0&}l^^2|p_&$%;x+ zNmnW=(lJSTt0Jq;Ojwc>JqN>m#e#-6C!=pw;CorZ^v;d|62lb4@XCgRGMN>CgJh?m z`+#E@1GbqNM!x;}1`tLXUhi;!<}-gebnG#I@Hsya9Nqr9uPb=?-sx=)n*00i=N`Od zlaGuSI8w(#7@?bqh&Bu_D+1}UevP3TR>)i}LoHfY=NMctDer<w<<w#d?sB~R?W=>K zO{_Ld@L!c#F@O!O___!7w<1-{qH3f{MF<!4Cw2l~L-?|{c@`;e>z_nkt=slBb{-}$ z;TmX!?SRkc`-qEv#C1R84nN}#{*62N41eM_@9*Q^?%s|@;*ss%u2^LISQMxO`}-pQ byzCo2;D5~ZzNq@X>N|Wd{BI5#d$Iol??f74 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-312.pyc deleted file mode 100644 index 59a0f6ca72f20a663f6ef1390e9b59855e495a35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13232 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 H&{_WnIlDH2 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/debug.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/debug.cpython-312.pyc deleted file mode 100644 index d825ef084de3b3c38316a1ef63214e8a0349919d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10181 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 Cq&~_3 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/download.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/download.cpython-312.pyc deleted file mode 100644 index f90ded0b8912f7f8e79f6c92e9f9446e9141c7e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7609 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 Y4Ij7{d=WhF^>jY&IP_nJ5@vV*1J(<qfdBvi diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-312.pyc deleted file mode 100644 index b5af9a6ca534b3323700fe519ef1799447482fd9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4436 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 CGZf$e diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/hash.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/hash.cpython-312.pyc deleted file mode 100644 index 6ff24b14eeb3078388df9a3423bfa683c2ab0434..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3003 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/help.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/help.cpython-312.pyc deleted file mode 100644 index db2029711d1fc81591d7fb10c163cb4087209445..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1693 zcmZux%}*pn6tABCoZ(~m7{0UE3#$tzOuKBN9+r(O64%6#7<7}JOQ-27h93HBtGa<1 zhqy5u(3t3+z-&~GY`E|*=+z4wHgV}lf^j`~8wI1`WL5X{f*UKH_kQp7t5>gn^{Res zYs&#T%x^zlv;_cuWkx#0COEl6!6twJayD?d62~!|u`>=|;$zI)f+Lp17z?)K$R#<( zqOCaDQkDZ5@GgMTI)E|~clji5DOXj-v%fQAoQtG8h8-e8k?_7n0;=U{&v6VFGC23q z^z_W!9EGh-?+nHsHj_+=l$yrLBn6uQff5HnDFe9@4>KhJ@+A=pNP;4gkupGIpoFpu z5|r14q?D-THnRO@{#x(cqPL<hQjfaeVbx5EA+_F|8jqKK?3L9UP5;dgBiZu<%X3L2 z7`RL#38NsyuG!peTpVMR*(X=Hm{E?hNEuz@oy?lx@N1O8EU43xS$S(xU8?iT9DXYU z>SA5mrE}O=lObQ19s($Q!<V@=r7q*1x>9LN{$7+&tjkGUI+p`MK8=7<r8C9nx~`<L zss5Cs>kAjw&(^b*uJaiws`RAjT<<m^T{rGCX3l|85GZNP6@Y1foc}d5cWJ~5Smp16 z6>eOf#Tgnp&PQ$O3Fy!=gQ(ra$Ow?$^hSj;3Up#QmTlnFNot*;yX1N+ZhCy`$Qd_M z>vW9jJW{J(s5;1S19havs}t&YOVsOIeo?pF0Abg#i|LZMoz{REbGU<wDEFQV(Q4d+ zn6+Ib8NQEPh-GF770+@b$u}@TILi5$=F?dtjprhPAbSBbE^rGIFC<n>2kNfjphzs! z+dv}TA>~L;>tOSe?ql){Ym1(PG{*?Yvi6Q=h7NKAq6NrCWo$STB(TgSgeM?n!1fG? zu(picWzDwcHNP4xdhYe&wMmUw0h;g)bIB+pqEQC4=L~4+${MS`=vN~ihi)x@;i43& zgONhEskjgR&IsAuAApKRtB@T!?i<>=^<ZV=c0&QJg{`T_En|m;v7P>d!sN!xanCE; ztJ{@5ZohkSzw7$O^kKg6w4-}7_aL`_skjsFl=nW^A9~|S$D7Z(hPT4+YG2oOMjw81 z(53CSYQJ=;+x-V!uWrasmHe0OpSAy_Tz;%vexi&%%lB@y|8x2h=otJHaM_`sy9Ym? zZSWMG5!Ufvh_|M|_fz?|^ZXC(9F?>5<P|;UUDu<Wt~(wKZA5XauHOp{o1F-?WL<}z zNr4y=%2m{Dm0b@b9iw}pMKvQAv-^$dQwk!U1UTa9;p1UyJ_09H0(^;yY$_NauTilM z4h6L#aBTzkXO0Jl_l3TOFd+7Az1{#+?G$#*M*}h3Bd5%R$I=vW_4MsY`i(6gNkP@O z+;URJ@C!X{Tg7>UJij@ZJxbC41d+f9LPGBnL?r3*{{Ln|t0qdGytwa^O<iSW#kH}G uo+&pHE^p!@HQ5VBR4V9caNH3XIs$#afypEGT|1RjuJ5a>e*voE4F3Wr3b{D| diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/index.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/index.cpython-312.pyc deleted file mode 100644 index d892ff0b0876b66afcbe4334159138ffbed0e29a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6740 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-312.pyc deleted file mode 100644 index f1e01fcfeffd461b054734b35ac5a2b0a8a6e8fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3995 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 C2<89) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/install.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/install.cpython-312.pyc deleted file mode 100644 index bc28ebfa14e5564a93d017d11c3d9d2ca0090a97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28933 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/list.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/list.cpython-312.pyc deleted file mode 100644 index 35d27814159226acd2f65432e4d26fb81edeed29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15676 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/search.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/search.cpython-312.pyc deleted file mode 100644 index 7fe9d2ad94e84ebb8261a854e1a3847990cc8aaa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7641 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/show.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/show.cpython-312.pyc deleted file mode 100644 index e932d2f56aff595a666ee16a0a98b8fa2cadf4a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9748 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc deleted file mode 100644 index 1caec2c109b3998a813d303667ca2eb34b1c54f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4746 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-312.pyc deleted file mode 100644 index d87083e4ad72f151d5fb9565032e92de0ba26b32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8976 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/cache.py b/venv/lib/python3.12/site-packages/pip/_internal/commands/cache.py deleted file mode 100644 index 3283361..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/commands/cache.py +++ /dev/null @@ -1,225 +0,0 @@ -import os -import textwrap -from optparse import Values -from typing import Any, List - -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import ERROR, SUCCESS -from pip._internal.exceptions import CommandError, PipError -from pip._internal.utils import filesystem -from pip._internal.utils.logging import getLogger - -logger = getLogger(__name__) - - -class CacheCommand(Command): - """ - Inspect and manage pip's wheel cache. - - Subcommands: - - - dir: Show the cache directory. - - info: Show information about the cache. - - list: List filenames of packages stored in the cache. - - remove: Remove one or more package from the cache. - - purge: Remove all items from the cache. - - ``<pattern>`` can be a glob expression or a package name. - """ - - ignore_require_venv = True - usage = """ - %prog dir - %prog info - %prog list [<pattern>] [--format=[human, abspath]] - %prog remove <pattern> - %prog purge - """ - - def add_options(self) -> None: - self.cmd_opts.add_option( - "--format", - action="store", - dest="list_format", - default="human", - choices=("human", "abspath"), - help="Select the output format among: human (default) or abspath", - ) - - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options: Values, args: List[str]) -> int: - handlers = { - "dir": self.get_cache_dir, - "info": self.get_cache_info, - "list": self.list_cache_items, - "remove": self.remove_cache_items, - "purge": self.purge_cache, - } - - if not options.cache_dir: - logger.error("pip cache commands can not function since cache is disabled.") - return ERROR - - # Determine action - if not args or args[0] not in handlers: - logger.error( - "Need an action (%s) to perform.", - ", ".join(sorted(handlers)), - ) - return ERROR - - action = args[0] - - # Error handling happens here, not in the action-handlers. - try: - handlers[action](options, args[1:]) - except PipError as e: - logger.error(e.args[0]) - return ERROR - - return SUCCESS - - def get_cache_dir(self, options: Values, args: List[Any]) -> None: - if args: - raise CommandError("Too many arguments") - - logger.info(options.cache_dir) - - def get_cache_info(self, options: Values, args: List[Any]) -> None: - if args: - raise CommandError("Too many arguments") - - num_http_files = len(self._find_http_files(options)) - num_packages = len(self._find_wheels(options, "*")) - - http_cache_location = self._cache_dir(options, "http-v2") - old_http_cache_location = self._cache_dir(options, "http") - wheels_cache_location = self._cache_dir(options, "wheels") - http_cache_size = filesystem.format_size( - filesystem.directory_size(http_cache_location) - + filesystem.directory_size(old_http_cache_location) - ) - wheels_cache_size = filesystem.format_directory_size(wheels_cache_location) - - message = ( - textwrap.dedent( - """ - Package index page cache location (pip v23.3+): {http_cache_location} - Package index page cache location (older pips): {old_http_cache_location} - Package index page cache size: {http_cache_size} - Number of HTTP files: {num_http_files} - Locally built wheels location: {wheels_cache_location} - Locally built wheels size: {wheels_cache_size} - Number of locally built wheels: {package_count} - """ # noqa: E501 - ) - .format( - http_cache_location=http_cache_location, - old_http_cache_location=old_http_cache_location, - http_cache_size=http_cache_size, - num_http_files=num_http_files, - wheels_cache_location=wheels_cache_location, - package_count=num_packages, - wheels_cache_size=wheels_cache_size, - ) - .strip() - ) - - logger.info(message) - - def list_cache_items(self, options: Values, args: List[Any]) -> None: - if len(args) > 1: - raise CommandError("Too many arguments") - - if args: - pattern = args[0] - else: - pattern = "*" - - files = self._find_wheels(options, pattern) - if options.list_format == "human": - self.format_for_human(files) - else: - self.format_for_abspath(files) - - def format_for_human(self, files: List[str]) -> None: - if not files: - logger.info("No locally built wheels cached.") - return - - results = [] - for filename in files: - wheel = os.path.basename(filename) - size = filesystem.format_file_size(filename) - results.append(f" - {wheel} ({size})") - logger.info("Cache contents:\n") - logger.info("\n".join(sorted(results))) - - def format_for_abspath(self, files: List[str]) -> None: - if files: - logger.info("\n".join(sorted(files))) - - def remove_cache_items(self, options: Values, args: List[Any]) -> None: - if len(args) > 1: - raise CommandError("Too many arguments") - - if not args: - raise CommandError("Please provide a pattern") - - files = self._find_wheels(options, args[0]) - - no_matching_msg = "No matching packages" - if args[0] == "*": - # Only fetch http files if no specific pattern given - files += self._find_http_files(options) - else: - # Add the pattern to the log message - no_matching_msg += f' for pattern "{args[0]}"' - - if not files: - logger.warning(no_matching_msg) - - for filename in files: - os.unlink(filename) - logger.verbose("Removed %s", filename) - logger.info("Files removed: %s", len(files)) - - def purge_cache(self, options: Values, args: List[Any]) -> None: - if args: - raise CommandError("Too many arguments") - - return self.remove_cache_items(options, ["*"]) - - def _cache_dir(self, options: Values, subdir: str) -> str: - return os.path.join(options.cache_dir, subdir) - - def _find_http_files(self, options: Values) -> List[str]: - old_http_dir = self._cache_dir(options, "http") - new_http_dir = self._cache_dir(options, "http-v2") - return filesystem.find_files(old_http_dir, "*") + filesystem.find_files( - new_http_dir, "*" - ) - - def _find_wheels(self, options: Values, pattern: str) -> List[str]: - wheel_dir = self._cache_dir(options, "wheels") - - # The wheel filename format, as specified in PEP 427, is: - # {distribution}-{version}(-{build})?-{python}-{abi}-{platform}.whl - # - # Additionally, non-alphanumeric values in the distribution are - # normalized to underscores (_), meaning hyphens can never occur - # before `-{version}`. - # - # Given that information: - # - If the pattern we're given contains a hyphen (-), the user is - # providing at least the version. Thus, we can just append `*.whl` - # to match the rest of it. - # - If the pattern we're given doesn't contain a hyphen (-), the - # user is only providing the name. Thus, we append `-*.whl` to - # match the hyphen before the version, followed by anything else. - # - # PEP 427: https://www.python.org/dev/peps/pep-0427/ - pattern = pattern + ("*.whl" if "-" in pattern else "-*.whl") - - return filesystem.find_files(wheel_dir, pattern) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/check.py b/venv/lib/python3.12/site-packages/pip/_internal/commands/check.py deleted file mode 100644 index 5efd0a3..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/commands/check.py +++ /dev/null @@ -1,54 +0,0 @@ -import logging -from optparse import Values -from typing import List - -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import ERROR, SUCCESS -from pip._internal.operations.check import ( - check_package_set, - create_package_set_from_installed, - warn_legacy_versions_and_specifiers, -) -from pip._internal.utils.misc import write_output - -logger = logging.getLogger(__name__) - - -class CheckCommand(Command): - """Verify installed packages have compatible dependencies.""" - - usage = """ - %prog [options]""" - - def run(self, options: Values, args: List[str]) -> int: - package_set, parsing_probs = create_package_set_from_installed() - warn_legacy_versions_and_specifiers(package_set) - missing, conflicting = check_package_set(package_set) - - for project_name in missing: - version = package_set[project_name].version - for dependency in missing[project_name]: - write_output( - "%s %s requires %s, which is not installed.", - project_name, - version, - dependency[0], - ) - - for project_name in conflicting: - version = package_set[project_name].version - for dep_name, dep_version, req in conflicting[project_name]: - write_output( - "%s %s has requirement %s, but you have %s %s.", - project_name, - version, - req, - dep_name, - dep_version, - ) - - if missing or conflicting or parsing_probs: - return ERROR - else: - write_output("No broken requirements found.") - return SUCCESS diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/completion.py b/venv/lib/python3.12/site-packages/pip/_internal/commands/completion.py deleted file mode 100644 index 9e89e27..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/commands/completion.py +++ /dev/null @@ -1,130 +0,0 @@ -import sys -import textwrap -from optparse import Values -from typing import List - -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import SUCCESS -from pip._internal.utils.misc import get_prog - -BASE_COMPLETION = """ -# pip {shell} completion start{script}# pip {shell} completion end -""" - -COMPLETION_SCRIPTS = { - "bash": """ - _pip_completion() - {{ - COMPREPLY=( $( COMP_WORDS="${{COMP_WORDS[*]}}" \\ - COMP_CWORD=$COMP_CWORD \\ - PIP_AUTO_COMPLETE=1 $1 2>/dev/null ) ) - }} - complete -o default -F _pip_completion {prog} - """, - "zsh": """ - #compdef -P pip[0-9.]# - __pip() {{ - compadd $( COMP_WORDS="$words[*]" \\ - COMP_CWORD=$((CURRENT-1)) \\ - PIP_AUTO_COMPLETE=1 $words[1] 2>/dev/null ) - }} - if [[ $zsh_eval_context[-1] == loadautofunc ]]; then - # autoload from fpath, call function directly - __pip "$@" - else - # eval/source/. command, register function for later - compdef __pip -P 'pip[0-9.]#' - fi - """, - "fish": """ - function __fish_complete_pip - set -lx COMP_WORDS (commandline -o) "" - set -lx COMP_CWORD ( \\ - math (contains -i -- (commandline -t) $COMP_WORDS)-1 \\ - ) - set -lx PIP_AUTO_COMPLETE 1 - string split \\ -- (eval $COMP_WORDS[1]) - end - complete -fa "(__fish_complete_pip)" -c {prog} - """, - "powershell": """ - if ((Test-Path Function:\\TabExpansion) -and -not ` - (Test-Path Function:\\_pip_completeBackup)) {{ - Rename-Item Function:\\TabExpansion _pip_completeBackup - }} - function TabExpansion($line, $lastWord) {{ - $lastBlock = [regex]::Split($line, '[|;]')[-1].TrimStart() - if ($lastBlock.StartsWith("{prog} ")) {{ - $Env:COMP_WORDS=$lastBlock - $Env:COMP_CWORD=$lastBlock.Split().Length - 1 - $Env:PIP_AUTO_COMPLETE=1 - (& {prog}).Split() - Remove-Item Env:COMP_WORDS - Remove-Item Env:COMP_CWORD - Remove-Item Env:PIP_AUTO_COMPLETE - }} - elseif (Test-Path Function:\\_pip_completeBackup) {{ - # Fall back on existing tab expansion - _pip_completeBackup $line $lastWord - }} - }} - """, -} - - -class CompletionCommand(Command): - """A helper command to be used for command completion.""" - - ignore_require_venv = True - - def add_options(self) -> None: - self.cmd_opts.add_option( - "--bash", - "-b", - action="store_const", - const="bash", - dest="shell", - help="Emit completion code for bash", - ) - self.cmd_opts.add_option( - "--zsh", - "-z", - action="store_const", - const="zsh", - dest="shell", - help="Emit completion code for zsh", - ) - self.cmd_opts.add_option( - "--fish", - "-f", - action="store_const", - const="fish", - dest="shell", - help="Emit completion code for fish", - ) - self.cmd_opts.add_option( - "--powershell", - "-p", - action="store_const", - const="powershell", - dest="shell", - help="Emit completion code for powershell", - ) - - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options: Values, args: List[str]) -> int: - """Prints the completion code of the given shell""" - shells = COMPLETION_SCRIPTS.keys() - shell_options = ["--" + shell for shell in sorted(shells)] - if options.shell in shells: - script = textwrap.dedent( - COMPLETION_SCRIPTS.get(options.shell, "").format(prog=get_prog()) - ) - print(BASE_COMPLETION.format(script=script, shell=options.shell)) - return SUCCESS - else: - sys.stderr.write( - "ERROR: You must pass {}\n".format(" or ".join(shell_options)) - ) - return SUCCESS diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/configuration.py b/venv/lib/python3.12/site-packages/pip/_internal/commands/configuration.py deleted file mode 100644 index 1a1dc6b..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/commands/configuration.py +++ /dev/null @@ -1,280 +0,0 @@ -import logging -import os -import subprocess -from optparse import Values -from typing import Any, List, Optional - -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import ERROR, SUCCESS -from pip._internal.configuration import ( - Configuration, - Kind, - get_configuration_files, - kinds, -) -from pip._internal.exceptions import PipError -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import get_prog, write_output - -logger = logging.getLogger(__name__) - - -class ConfigurationCommand(Command): - """ - Manage local and global configuration. - - Subcommands: - - - list: List the active configuration (or from the file specified) - - edit: Edit the configuration file in an editor - - get: Get the value associated with command.option - - set: Set the command.option=value - - unset: Unset the value associated with command.option - - debug: List the configuration files and values defined under them - - Configuration keys should be dot separated command and option name, - with the special prefix "global" affecting any command. For example, - "pip config set global.index-url https://example.org/" would configure - the index url for all commands, but "pip config set download.timeout 10" - would configure a 10 second timeout only for "pip download" commands. - - If none of --user, --global and --site are passed, a virtual - environment configuration file is used if one is active and the file - exists. Otherwise, all modifications happen to the user file by - default. - """ - - ignore_require_venv = True - usage = """ - %prog [<file-option>] list - %prog [<file-option>] [--editor <editor-path>] edit - - %prog [<file-option>] get command.option - %prog [<file-option>] set command.option value - %prog [<file-option>] unset command.option - %prog [<file-option>] debug - """ - - def add_options(self) -> None: - self.cmd_opts.add_option( - "--editor", - dest="editor", - action="store", - default=None, - help=( - "Editor to use to edit the file. Uses VISUAL or EDITOR " - "environment variables if not provided." - ), - ) - - self.cmd_opts.add_option( - "--global", - dest="global_file", - action="store_true", - default=False, - help="Use the system-wide configuration file only", - ) - - self.cmd_opts.add_option( - "--user", - dest="user_file", - action="store_true", - default=False, - help="Use the user configuration file only", - ) - - self.cmd_opts.add_option( - "--site", - dest="site_file", - action="store_true", - default=False, - help="Use the current environment configuration file only", - ) - - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options: Values, args: List[str]) -> int: - handlers = { - "list": self.list_values, - "edit": self.open_in_editor, - "get": self.get_name, - "set": self.set_name_value, - "unset": self.unset_name, - "debug": self.list_config_values, - } - - # Determine action - if not args or args[0] not in handlers: - logger.error( - "Need an action (%s) to perform.", - ", ".join(sorted(handlers)), - ) - return ERROR - - action = args[0] - - # Determine which configuration files are to be loaded - # Depends on whether the command is modifying. - try: - load_only = self._determine_file( - options, need_value=(action in ["get", "set", "unset", "edit"]) - ) - except PipError as e: - logger.error(e.args[0]) - return ERROR - - # Load a new configuration - self.configuration = Configuration( - isolated=options.isolated_mode, load_only=load_only - ) - self.configuration.load() - - # Error handling happens here, not in the action-handlers. - try: - handlers[action](options, args[1:]) - except PipError as e: - logger.error(e.args[0]) - return ERROR - - return SUCCESS - - def _determine_file(self, options: Values, need_value: bool) -> Optional[Kind]: - file_options = [ - key - for key, value in ( - (kinds.USER, options.user_file), - (kinds.GLOBAL, options.global_file), - (kinds.SITE, options.site_file), - ) - if value - ] - - if not file_options: - if not need_value: - return None - # Default to user, unless there's a site file. - elif any( - os.path.exists(site_config_file) - for site_config_file in get_configuration_files()[kinds.SITE] - ): - return kinds.SITE - else: - return kinds.USER - elif len(file_options) == 1: - return file_options[0] - - raise PipError( - "Need exactly one file to operate upon " - "(--user, --site, --global) to perform." - ) - - def list_values(self, options: Values, args: List[str]) -> None: - self._get_n_args(args, "list", n=0) - - for key, value in sorted(self.configuration.items()): - write_output("%s=%r", key, value) - - def get_name(self, options: Values, args: List[str]) -> None: - key = self._get_n_args(args, "get [name]", n=1) - value = self.configuration.get_value(key) - - write_output("%s", value) - - def set_name_value(self, options: Values, args: List[str]) -> None: - key, value = self._get_n_args(args, "set [name] [value]", n=2) - self.configuration.set_value(key, value) - - self._save_configuration() - - def unset_name(self, options: Values, args: List[str]) -> None: - key = self._get_n_args(args, "unset [name]", n=1) - self.configuration.unset_value(key) - - self._save_configuration() - - def list_config_values(self, options: Values, args: List[str]) -> None: - """List config key-value pairs across different config files""" - self._get_n_args(args, "debug", n=0) - - self.print_env_var_values() - # Iterate over config files and print if they exist, and the - # key-value pairs present in them if they do - for variant, files in sorted(self.configuration.iter_config_files()): - write_output("%s:", variant) - for fname in files: - with indent_log(): - file_exists = os.path.exists(fname) - write_output("%s, exists: %r", fname, file_exists) - if file_exists: - self.print_config_file_values(variant) - - def print_config_file_values(self, variant: Kind) -> None: - """Get key-value pairs from the file of a variant""" - for name, value in self.configuration.get_values_in_config(variant).items(): - with indent_log(): - write_output("%s: %s", name, value) - - def print_env_var_values(self) -> None: - """Get key-values pairs present as environment variables""" - write_output("%s:", "env_var") - with indent_log(): - for key, value in sorted(self.configuration.get_environ_vars()): - env_var = f"PIP_{key.upper()}" - write_output("%s=%r", env_var, value) - - def open_in_editor(self, options: Values, args: List[str]) -> None: - editor = self._determine_editor(options) - - fname = self.configuration.get_file_to_edit() - if fname is None: - raise PipError("Could not determine appropriate file.") - elif '"' in fname: - # This shouldn't happen, unless we see a username like that. - # If that happens, we'd appreciate a pull request fixing this. - raise PipError( - f'Can not open an editor for a file name containing "\n{fname}' - ) - - try: - subprocess.check_call(f'{editor} "{fname}"', shell=True) - except FileNotFoundError as e: - if not e.filename: - e.filename = editor - raise - except subprocess.CalledProcessError as e: - raise PipError(f"Editor Subprocess exited with exit code {e.returncode}") - - def _get_n_args(self, args: List[str], example: str, n: int) -> Any: - """Helper to make sure the command got the right number of arguments""" - if len(args) != n: - msg = ( - f"Got unexpected number of arguments, expected {n}. " - f'(example: "{get_prog()} config {example}")' - ) - raise PipError(msg) - - if n == 1: - return args[0] - else: - return args - - def _save_configuration(self) -> None: - # We successfully ran a modifying command. Need to save the - # configuration. - try: - self.configuration.save() - except Exception: - logger.exception( - "Unable to save configuration. Please report this as a bug." - ) - raise PipError("Internal Error.") - - def _determine_editor(self, options: Values) -> str: - if options.editor is not None: - return options.editor - elif "VISUAL" in os.environ: - return os.environ["VISUAL"] - elif "EDITOR" in os.environ: - return os.environ["EDITOR"] - else: - raise PipError("Could not determine editor to use.") diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/debug.py b/venv/lib/python3.12/site-packages/pip/_internal/commands/debug.py deleted file mode 100644 index 7e5271c..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/commands/debug.py +++ /dev/null @@ -1,201 +0,0 @@ -import importlib.resources -import locale -import logging -import os -import sys -from optparse import Values -from types import ModuleType -from typing import Any, Dict, List, Optional - -import pip._vendor -from pip._vendor.certifi import where -from pip._vendor.packaging.version import parse as parse_version - -from pip._internal.cli import cmdoptions -from pip._internal.cli.base_command import Command -from pip._internal.cli.cmdoptions import make_target_python -from pip._internal.cli.status_codes import SUCCESS -from pip._internal.configuration import Configuration -from pip._internal.metadata import get_environment -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import get_pip_version - -logger = logging.getLogger(__name__) - - -def show_value(name: str, value: Any) -> None: - logger.info("%s: %s", name, value) - - -def show_sys_implementation() -> None: - logger.info("sys.implementation:") - implementation_name = sys.implementation.name - with indent_log(): - show_value("name", implementation_name) - - -def create_vendor_txt_map() -> Dict[str, str]: - with importlib.resources.open_text("pip._vendor", "vendor.txt") as f: - # Purge non version specifying lines. - # Also, remove any space prefix or suffixes (including comments). - lines = [ - line.strip().split(" ", 1)[0] for line in f.readlines() if "==" in line - ] - - # Transform into "module" -> version dict. - return dict(line.split("==", 1) for line in lines) - - -def get_module_from_module_name(module_name: str) -> Optional[ModuleType]: - # Module name can be uppercase in vendor.txt for some reason... - module_name = module_name.lower().replace("-", "_") - # PATCH: setuptools is actually only pkg_resources. - if module_name == "setuptools": - module_name = "pkg_resources" - - try: - __import__(f"pip._vendor.{module_name}", globals(), locals(), level=0) - return getattr(pip._vendor, module_name) - except ImportError: - # We allow 'truststore' to fail to import due - # to being unavailable on Python 3.9 and earlier. - if module_name == "truststore" and sys.version_info < (3, 10): - return None - raise - - -def get_vendor_version_from_module(module_name: str) -> Optional[str]: - module = get_module_from_module_name(module_name) - version = getattr(module, "__version__", None) - - if module and not version: - # Try to find version in debundled module info. - assert module.__file__ is not None - env = get_environment([os.path.dirname(module.__file__)]) - dist = env.get_distribution(module_name) - if dist: - version = str(dist.version) - - return version - - -def show_actual_vendor_versions(vendor_txt_versions: Dict[str, str]) -> None: - """Log the actual version and print extra info if there is - a conflict or if the actual version could not be imported. - """ - for module_name, expected_version in vendor_txt_versions.items(): - extra_message = "" - actual_version = get_vendor_version_from_module(module_name) - if not actual_version: - extra_message = ( - " (Unable to locate actual module version, using" - " vendor.txt specified version)" - ) - actual_version = expected_version - elif parse_version(actual_version) != parse_version(expected_version): - extra_message = ( - " (CONFLICT: vendor.txt suggests version should" - f" be {expected_version})" - ) - logger.info("%s==%s%s", module_name, actual_version, extra_message) - - -def show_vendor_versions() -> None: - logger.info("vendored library versions:") - - vendor_txt_versions = create_vendor_txt_map() - with indent_log(): - show_actual_vendor_versions(vendor_txt_versions) - - -def show_tags(options: Values) -> None: - tag_limit = 10 - - target_python = make_target_python(options) - tags = target_python.get_sorted_tags() - - # Display the target options that were explicitly provided. - formatted_target = target_python.format_given() - suffix = "" - if formatted_target: - suffix = f" (target: {formatted_target})" - - msg = f"Compatible tags: {len(tags)}{suffix}" - logger.info(msg) - - if options.verbose < 1 and len(tags) > tag_limit: - tags_limited = True - tags = tags[:tag_limit] - else: - tags_limited = False - - with indent_log(): - for tag in tags: - logger.info(str(tag)) - - if tags_limited: - msg = f"...\n[First {tag_limit} tags shown. Pass --verbose to show all.]" - logger.info(msg) - - -def ca_bundle_info(config: Configuration) -> str: - levels = {key.split(".", 1)[0] for key, _ in config.items()} - if not levels: - return "Not specified" - - levels_that_override_global = ["install", "wheel", "download"] - global_overriding_level = [ - level for level in levels if level in levels_that_override_global - ] - if not global_overriding_level: - return "global" - - if "global" in levels: - levels.remove("global") - return ", ".join(levels) - - -class DebugCommand(Command): - """ - Display debug information. - """ - - usage = """ - %prog <options>""" - ignore_require_venv = True - - def add_options(self) -> None: - cmdoptions.add_target_python_options(self.cmd_opts) - self.parser.insert_option_group(0, self.cmd_opts) - self.parser.config.load() - - def run(self, options: Values, args: List[str]) -> int: - logger.warning( - "This command is only meant for debugging. " - "Do not use this with automation for parsing and getting these " - "details, since the output and options of this command may " - "change without notice." - ) - show_value("pip version", get_pip_version()) - show_value("sys.version", sys.version) - show_value("sys.executable", sys.executable) - show_value("sys.getdefaultencoding", sys.getdefaultencoding()) - show_value("sys.getfilesystemencoding", sys.getfilesystemencoding()) - show_value( - "locale.getpreferredencoding", - locale.getpreferredencoding(), - ) - show_value("sys.platform", sys.platform) - show_sys_implementation() - - show_value("'cert' config value", ca_bundle_info(self.parser.config)) - show_value("REQUESTS_CA_BUNDLE", os.environ.get("REQUESTS_CA_BUNDLE")) - show_value("CURL_CA_BUNDLE", os.environ.get("CURL_CA_BUNDLE")) - show_value("pip._vendor.certifi.where()", where()) - show_value("pip._vendor.DEBUNDLED", pip._vendor.DEBUNDLED) - - show_vendor_versions() - - show_tags(options) - - return SUCCESS diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/download.py b/venv/lib/python3.12/site-packages/pip/_internal/commands/download.py deleted file mode 100644 index 54247a7..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/commands/download.py +++ /dev/null @@ -1,147 +0,0 @@ -import logging -import os -from optparse import Values -from typing import List - -from pip._internal.cli import cmdoptions -from pip._internal.cli.cmdoptions import make_target_python -from pip._internal.cli.req_command import RequirementCommand, with_cleanup -from pip._internal.cli.status_codes import SUCCESS -from pip._internal.operations.build.build_tracker import get_build_tracker -from pip._internal.req.req_install import check_legacy_setup_py_options -from pip._internal.utils.misc import ensure_dir, normalize_path, write_output -from pip._internal.utils.temp_dir import TempDirectory - -logger = logging.getLogger(__name__) - - -class DownloadCommand(RequirementCommand): - """ - Download packages from: - - - PyPI (and other indexes) using requirement specifiers. - - VCS project urls. - - Local project directories. - - Local or remote source archives. - - pip also supports downloading from "requirements files", which provide - an easy way to specify a whole environment to be downloaded. - """ - - usage = """ - %prog [options] <requirement specifier> [package-index-options] ... - %prog [options] -r <requirements file> [package-index-options] ... - %prog [options] <vcs project url> ... - %prog [options] <local project path> ... - %prog [options] <archive url/path> ...""" - - def add_options(self) -> None: - self.cmd_opts.add_option(cmdoptions.constraints()) - self.cmd_opts.add_option(cmdoptions.requirements()) - self.cmd_opts.add_option(cmdoptions.no_deps()) - self.cmd_opts.add_option(cmdoptions.global_options()) - self.cmd_opts.add_option(cmdoptions.no_binary()) - self.cmd_opts.add_option(cmdoptions.only_binary()) - self.cmd_opts.add_option(cmdoptions.prefer_binary()) - self.cmd_opts.add_option(cmdoptions.src()) - self.cmd_opts.add_option(cmdoptions.pre()) - self.cmd_opts.add_option(cmdoptions.require_hashes()) - self.cmd_opts.add_option(cmdoptions.progress_bar()) - self.cmd_opts.add_option(cmdoptions.no_build_isolation()) - self.cmd_opts.add_option(cmdoptions.use_pep517()) - self.cmd_opts.add_option(cmdoptions.no_use_pep517()) - self.cmd_opts.add_option(cmdoptions.check_build_deps()) - self.cmd_opts.add_option(cmdoptions.ignore_requires_python()) - - self.cmd_opts.add_option( - "-d", - "--dest", - "--destination-dir", - "--destination-directory", - dest="download_dir", - metavar="dir", - default=os.curdir, - help="Download packages into <dir>.", - ) - - cmdoptions.add_target_python_options(self.cmd_opts) - - index_opts = cmdoptions.make_option_group( - cmdoptions.index_group, - self.parser, - ) - - self.parser.insert_option_group(0, index_opts) - self.parser.insert_option_group(0, self.cmd_opts) - - @with_cleanup - def run(self, options: Values, args: List[str]) -> int: - options.ignore_installed = True - # editable doesn't really make sense for `pip download`, but the bowels - # of the RequirementSet code require that property. - options.editables = [] - - cmdoptions.check_dist_restriction(options) - - options.download_dir = normalize_path(options.download_dir) - ensure_dir(options.download_dir) - - session = self.get_default_session(options) - - target_python = make_target_python(options) - finder = self._build_package_finder( - options=options, - session=session, - target_python=target_python, - ignore_requires_python=options.ignore_requires_python, - ) - - build_tracker = self.enter_context(get_build_tracker()) - - directory = TempDirectory( - delete=not options.no_clean, - kind="download", - globally_managed=True, - ) - - reqs = self.get_requirements(args, options, finder, session) - check_legacy_setup_py_options(options, reqs) - - preparer = self.make_requirement_preparer( - temp_build_dir=directory, - options=options, - build_tracker=build_tracker, - session=session, - finder=finder, - download_dir=options.download_dir, - use_user_site=False, - verbosity=self.verbosity, - ) - - resolver = self.make_resolver( - preparer=preparer, - finder=finder, - options=options, - ignore_requires_python=options.ignore_requires_python, - use_pep517=options.use_pep517, - py_version_info=options.python_version, - ) - - self.trace_basic_info(finder) - - requirement_set = resolver.resolve(reqs, check_supported_wheels=True) - - downloaded: List[str] = [] - for req in requirement_set.requirements.values(): - if req.satisfied_by is None: - assert req.name is not None - preparer.save_linked_requirement(req) - downloaded.append(req.name) - - preparer.prepare_linked_requirements_more(requirement_set.requirements.values()) - requirement_set.warn_legacy_versions_and_specifiers() - - if downloaded: - write_output("Successfully downloaded %s", " ".join(downloaded)) - - return SUCCESS diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/freeze.py b/venv/lib/python3.12/site-packages/pip/_internal/commands/freeze.py deleted file mode 100644 index e64cb3d..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/commands/freeze.py +++ /dev/null @@ -1,109 +0,0 @@ -import sys -from optparse import Values -from typing import AbstractSet, List - -from pip._internal.cli import cmdoptions -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import SUCCESS -from pip._internal.operations.freeze import freeze -from pip._internal.utils.compat import stdlib_pkgs - - -def _should_suppress_build_backends() -> bool: - return sys.version_info < (3, 12) - - -def _dev_pkgs() -> AbstractSet[str]: - pkgs = {"pip"} - - if _should_suppress_build_backends(): - pkgs |= {"setuptools", "distribute", "wheel"} - pkgs |= {"setuptools", "distribute", "wheel", "pkg-resources"} - - return pkgs - - -class FreezeCommand(Command): - """ - Output installed packages in requirements format. - - packages are listed in a case-insensitive sorted order. - """ - - usage = """ - %prog [options]""" - log_streams = ("ext://sys.stderr", "ext://sys.stderr") - - def add_options(self) -> None: - self.cmd_opts.add_option( - "-r", - "--requirement", - dest="requirements", - action="append", - default=[], - metavar="file", - help=( - "Use the order in the given requirements file and its " - "comments when generating output. This option can be " - "used multiple times." - ), - ) - self.cmd_opts.add_option( - "-l", - "--local", - dest="local", - action="store_true", - default=False, - help=( - "If in a virtualenv that has global access, do not output " - "globally-installed packages." - ), - ) - self.cmd_opts.add_option( - "--user", - dest="user", - action="store_true", - default=False, - help="Only output packages installed in user-site.", - ) - self.cmd_opts.add_option(cmdoptions.list_path()) - self.cmd_opts.add_option( - "--all", - dest="freeze_all", - action="store_true", - help=( - "Do not skip these packages in the output:" - " {}".format(", ".join(_dev_pkgs())) - ), - ) - self.cmd_opts.add_option( - "--exclude-editable", - dest="exclude_editable", - action="store_true", - help="Exclude editable package from output.", - ) - self.cmd_opts.add_option(cmdoptions.list_exclude()) - - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options: Values, args: List[str]) -> int: - skip = set(stdlib_pkgs) - if not options.freeze_all: - skip.update(_dev_pkgs()) - - if options.excludes: - skip.update(options.excludes) - - cmdoptions.check_list_path_option(options) - - for line in freeze( - requirement=options.requirements, - local_only=options.local, - user_only=options.user, - paths=options.path, - isolated=options.isolated_mode, - skip=skip, - exclude_editable=options.exclude_editable, - ): - sys.stdout.write(line + "\n") - return SUCCESS diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/hash.py b/venv/lib/python3.12/site-packages/pip/_internal/commands/hash.py deleted file mode 100644 index 042dac8..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/commands/hash.py +++ /dev/null @@ -1,59 +0,0 @@ -import hashlib -import logging -import sys -from optparse import Values -from typing import List - -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import ERROR, SUCCESS -from pip._internal.utils.hashes import FAVORITE_HASH, STRONG_HASHES -from pip._internal.utils.misc import read_chunks, write_output - -logger = logging.getLogger(__name__) - - -class HashCommand(Command): - """ - Compute a hash of a local package archive. - - These can be used with --hash in a requirements file to do repeatable - installs. - """ - - usage = "%prog [options] <file> ..." - ignore_require_venv = True - - def add_options(self) -> None: - self.cmd_opts.add_option( - "-a", - "--algorithm", - dest="algorithm", - choices=STRONG_HASHES, - action="store", - default=FAVORITE_HASH, - help="The hash algorithm to use: one of {}".format( - ", ".join(STRONG_HASHES) - ), - ) - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options: Values, args: List[str]) -> int: - if not args: - self.parser.print_usage(sys.stderr) - return ERROR - - algorithm = options.algorithm - for path in args: - write_output( - "%s:\n--hash=%s:%s", path, algorithm, _hash_of_file(path, algorithm) - ) - return SUCCESS - - -def _hash_of_file(path: str, algorithm: str) -> str: - """Return the hash digest of a file.""" - with open(path, "rb") as archive: - hash = hashlib.new(algorithm) - for chunk in read_chunks(archive): - hash.update(chunk) - return hash.hexdigest() diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/help.py b/venv/lib/python3.12/site-packages/pip/_internal/commands/help.py deleted file mode 100644 index 6206631..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/commands/help.py +++ /dev/null @@ -1,41 +0,0 @@ -from optparse import Values -from typing import List - -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import SUCCESS -from pip._internal.exceptions import CommandError - - -class HelpCommand(Command): - """Show help for commands""" - - usage = """ - %prog <command>""" - ignore_require_venv = True - - def run(self, options: Values, args: List[str]) -> int: - from pip._internal.commands import ( - commands_dict, - create_command, - get_similar_commands, - ) - - try: - # 'pip help' with no args is handled by pip.__init__.parseopt() - cmd_name = args[0] # the command we need help for - except IndexError: - return SUCCESS - - if cmd_name not in commands_dict: - guess = get_similar_commands(cmd_name) - - msg = [f'unknown command "{cmd_name}"'] - if guess: - msg.append(f'maybe you meant "{guess}"') - - raise CommandError(" - ".join(msg)) - - command = create_command(cmd_name) - command.parser.print_help() - - return SUCCESS diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/index.py b/venv/lib/python3.12/site-packages/pip/_internal/commands/index.py deleted file mode 100644 index f55e9e4..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/commands/index.py +++ /dev/null @@ -1,139 +0,0 @@ -import logging -from optparse import Values -from typing import Any, Iterable, List, Optional, Union - -from pip._vendor.packaging.version import LegacyVersion, Version - -from pip._internal.cli import cmdoptions -from pip._internal.cli.req_command import IndexGroupCommand -from pip._internal.cli.status_codes import ERROR, SUCCESS -from pip._internal.commands.search import print_dist_installation_info -from pip._internal.exceptions import CommandError, DistributionNotFound, PipError -from pip._internal.index.collector import LinkCollector -from pip._internal.index.package_finder import PackageFinder -from pip._internal.models.selection_prefs import SelectionPreferences -from pip._internal.models.target_python import TargetPython -from pip._internal.network.session import PipSession -from pip._internal.utils.misc import write_output - -logger = logging.getLogger(__name__) - - -class IndexCommand(IndexGroupCommand): - """ - Inspect information available from package indexes. - """ - - ignore_require_venv = True - usage = """ - %prog versions <package> - """ - - def add_options(self) -> None: - cmdoptions.add_target_python_options(self.cmd_opts) - - self.cmd_opts.add_option(cmdoptions.ignore_requires_python()) - self.cmd_opts.add_option(cmdoptions.pre()) - self.cmd_opts.add_option(cmdoptions.no_binary()) - self.cmd_opts.add_option(cmdoptions.only_binary()) - - index_opts = cmdoptions.make_option_group( - cmdoptions.index_group, - self.parser, - ) - - self.parser.insert_option_group(0, index_opts) - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options: Values, args: List[str]) -> int: - handlers = { - "versions": self.get_available_package_versions, - } - - logger.warning( - "pip index is currently an experimental command. " - "It may be removed/changed in a future release " - "without prior warning." - ) - - # Determine action - if not args or args[0] not in handlers: - logger.error( - "Need an action (%s) to perform.", - ", ".join(sorted(handlers)), - ) - return ERROR - - action = args[0] - - # Error handling happens here, not in the action-handlers. - try: - handlers[action](options, args[1:]) - except PipError as e: - logger.error(e.args[0]) - return ERROR - - return SUCCESS - - def _build_package_finder( - self, - options: Values, - session: PipSession, - target_python: Optional[TargetPython] = None, - ignore_requires_python: Optional[bool] = None, - ) -> PackageFinder: - """ - Create a package finder appropriate to the index command. - """ - link_collector = LinkCollector.create(session, options=options) - - # Pass allow_yanked=False to ignore yanked versions. - selection_prefs = SelectionPreferences( - allow_yanked=False, - allow_all_prereleases=options.pre, - ignore_requires_python=ignore_requires_python, - ) - - return PackageFinder.create( - link_collector=link_collector, - selection_prefs=selection_prefs, - target_python=target_python, - ) - - def get_available_package_versions(self, options: Values, args: List[Any]) -> None: - if len(args) != 1: - raise CommandError("You need to specify exactly one argument") - - target_python = cmdoptions.make_target_python(options) - query = args[0] - - with self._build_session(options) as session: - finder = self._build_package_finder( - options=options, - session=session, - target_python=target_python, - ignore_requires_python=options.ignore_requires_python, - ) - - versions: Iterable[Union[LegacyVersion, Version]] = ( - candidate.version for candidate in finder.find_all_candidates(query) - ) - - if not options.pre: - # Remove prereleases - versions = ( - version for version in versions if not version.is_prerelease - ) - versions = set(versions) - - if not versions: - raise DistributionNotFound( - f"No matching distribution found for {query}" - ) - - formatted_versions = [str(ver) for ver in sorted(versions, reverse=True)] - latest = formatted_versions[0] - - write_output(f"{query} ({latest})") - write_output("Available versions: {}".format(", ".join(formatted_versions))) - print_dist_installation_info(query, latest) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/inspect.py b/venv/lib/python3.12/site-packages/pip/_internal/commands/inspect.py deleted file mode 100644 index 27c8fa3..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/commands/inspect.py +++ /dev/null @@ -1,92 +0,0 @@ -import logging -from optparse import Values -from typing import Any, Dict, List - -from pip._vendor.packaging.markers import default_environment -from pip._vendor.rich import print_json - -from pip import __version__ -from pip._internal.cli import cmdoptions -from pip._internal.cli.req_command import Command -from pip._internal.cli.status_codes import SUCCESS -from pip._internal.metadata import BaseDistribution, get_environment -from pip._internal.utils.compat import stdlib_pkgs -from pip._internal.utils.urls import path_to_url - -logger = logging.getLogger(__name__) - - -class InspectCommand(Command): - """ - Inspect the content of a Python environment and produce a report in JSON format. - """ - - ignore_require_venv = True - usage = """ - %prog [options]""" - - def add_options(self) -> None: - self.cmd_opts.add_option( - "--local", - action="store_true", - default=False, - help=( - "If in a virtualenv that has global access, do not list " - "globally-installed packages." - ), - ) - self.cmd_opts.add_option( - "--user", - dest="user", - action="store_true", - default=False, - help="Only output packages installed in user-site.", - ) - self.cmd_opts.add_option(cmdoptions.list_path()) - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options: Values, args: List[str]) -> int: - cmdoptions.check_list_path_option(options) - dists = get_environment(options.path).iter_installed_distributions( - local_only=options.local, - user_only=options.user, - skip=set(stdlib_pkgs), - ) - output = { - "version": "1", - "pip_version": __version__, - "installed": [self._dist_to_dict(dist) for dist in dists], - "environment": default_environment(), - # TODO tags? scheme? - } - print_json(data=output) - return SUCCESS - - def _dist_to_dict(self, dist: BaseDistribution) -> Dict[str, Any]: - res: Dict[str, Any] = { - "metadata": dist.metadata_dict, - "metadata_location": dist.info_location, - } - # direct_url. Note that we don't have download_info (as in the installation - # report) since it is not recorded in installed metadata. - direct_url = dist.direct_url - if direct_url is not None: - res["direct_url"] = direct_url.to_dict() - else: - # Emulate direct_url for legacy editable installs. - editable_project_location = dist.editable_project_location - if editable_project_location is not None: - res["direct_url"] = { - "url": path_to_url(editable_project_location), - "dir_info": { - "editable": True, - }, - } - # installer - installer = dist.installer - if dist.installer: - res["installer"] = installer - # requested - if dist.installed_with_dist_info: - res["requested"] = dist.requested - return res diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/install.py b/venv/lib/python3.12/site-packages/pip/_internal/commands/install.py deleted file mode 100644 index e944bb9..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/commands/install.py +++ /dev/null @@ -1,774 +0,0 @@ -import errno -import json -import operator -import os -import shutil -import site -from optparse import SUPPRESS_HELP, Values -from typing import List, Optional - -from pip._vendor.rich import print_json - -from pip._internal.cache import WheelCache -from pip._internal.cli import cmdoptions -from pip._internal.cli.cmdoptions import make_target_python -from pip._internal.cli.req_command import ( - RequirementCommand, - warn_if_run_as_root, - with_cleanup, -) -from pip._internal.cli.status_codes import ERROR, SUCCESS -from pip._internal.exceptions import CommandError, InstallationError -from pip._internal.locations import get_scheme -from pip._internal.metadata import get_environment -from pip._internal.models.installation_report import InstallationReport -from pip._internal.operations.build.build_tracker import get_build_tracker -from pip._internal.operations.check import ConflictDetails, check_install_conflicts -from pip._internal.req import install_given_reqs -from pip._internal.req.req_install import ( - InstallRequirement, - check_legacy_setup_py_options, -) -from pip._internal.utils.compat import WINDOWS -from pip._internal.utils.filesystem import test_writable_dir -from pip._internal.utils.logging import getLogger -from pip._internal.utils.misc import ( - check_externally_managed, - ensure_dir, - get_pip_version, - protect_pip_from_modification_on_windows, - write_output, -) -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.utils.virtualenv import ( - running_under_virtualenv, - virtualenv_no_global, -) -from pip._internal.wheel_builder import build, should_build_for_install_command - -logger = getLogger(__name__) - - -class InstallCommand(RequirementCommand): - """ - Install packages from: - - - PyPI (and other indexes) using requirement specifiers. - - VCS project urls. - - Local project directories. - - Local or remote source archives. - - pip also supports installing from "requirements files", which provide - an easy way to specify a whole environment to be installed. - """ - - usage = """ - %prog [options] <requirement specifier> [package-index-options] ... - %prog [options] -r <requirements file> [package-index-options] ... - %prog [options] [-e] <vcs project url> ... - %prog [options] [-e] <local project path> ... - %prog [options] <archive url/path> ...""" - - def add_options(self) -> None: - self.cmd_opts.add_option(cmdoptions.requirements()) - self.cmd_opts.add_option(cmdoptions.constraints()) - self.cmd_opts.add_option(cmdoptions.no_deps()) - self.cmd_opts.add_option(cmdoptions.pre()) - - self.cmd_opts.add_option(cmdoptions.editable()) - self.cmd_opts.add_option( - "--dry-run", - action="store_true", - dest="dry_run", - default=False, - help=( - "Don't actually install anything, just print what would be. " - "Can be used in combination with --ignore-installed " - "to 'resolve' the requirements." - ), - ) - self.cmd_opts.add_option( - "-t", - "--target", - dest="target_dir", - metavar="dir", - default=None, - help=( - "Install packages into <dir>. " - "By default this will not replace existing files/folders in " - "<dir>. Use --upgrade to replace existing packages in <dir> " - "with new versions." - ), - ) - cmdoptions.add_target_python_options(self.cmd_opts) - - self.cmd_opts.add_option( - "--user", - dest="use_user_site", - action="store_true", - help=( - "Install to the Python user install directory for your " - "platform. Typically ~/.local/, or %APPDATA%\\Python on " - "Windows. (See the Python documentation for site.USER_BASE " - "for full details.)" - ), - ) - self.cmd_opts.add_option( - "--no-user", - dest="use_user_site", - action="store_false", - help=SUPPRESS_HELP, - ) - self.cmd_opts.add_option( - "--root", - dest="root_path", - metavar="dir", - default=None, - help="Install everything relative to this alternate root directory.", - ) - self.cmd_opts.add_option( - "--prefix", - dest="prefix_path", - metavar="dir", - default=None, - help=( - "Installation prefix where lib, bin and other top-level " - "folders are placed. Note that the resulting installation may " - "contain scripts and other resources which reference the " - "Python interpreter of pip, and not that of ``--prefix``. " - "See also the ``--python`` option if the intention is to " - "install packages into another (possibly pip-free) " - "environment." - ), - ) - - self.cmd_opts.add_option(cmdoptions.src()) - - self.cmd_opts.add_option( - "-U", - "--upgrade", - dest="upgrade", - action="store_true", - help=( - "Upgrade all specified packages to the newest available " - "version. The handling of dependencies depends on the " - "upgrade-strategy used." - ), - ) - - self.cmd_opts.add_option( - "--upgrade-strategy", - dest="upgrade_strategy", - default="only-if-needed", - choices=["only-if-needed", "eager"], - help=( - "Determines how dependency upgrading should be handled " - "[default: %default]. " - '"eager" - dependencies are upgraded regardless of ' - "whether the currently installed version satisfies the " - "requirements of the upgraded package(s). " - '"only-if-needed" - are upgraded only when they do not ' - "satisfy the requirements of the upgraded package(s)." - ), - ) - - self.cmd_opts.add_option( - "--force-reinstall", - dest="force_reinstall", - action="store_true", - help="Reinstall all packages even if they are already up-to-date.", - ) - - self.cmd_opts.add_option( - "-I", - "--ignore-installed", - dest="ignore_installed", - action="store_true", - help=( - "Ignore the installed packages, overwriting them. " - "This can break your system if the existing package " - "is of a different version or was installed " - "with a different package manager!" - ), - ) - - self.cmd_opts.add_option(cmdoptions.ignore_requires_python()) - self.cmd_opts.add_option(cmdoptions.no_build_isolation()) - self.cmd_opts.add_option(cmdoptions.use_pep517()) - self.cmd_opts.add_option(cmdoptions.no_use_pep517()) - self.cmd_opts.add_option(cmdoptions.check_build_deps()) - self.cmd_opts.add_option(cmdoptions.override_externally_managed()) - - self.cmd_opts.add_option(cmdoptions.config_settings()) - self.cmd_opts.add_option(cmdoptions.global_options()) - - self.cmd_opts.add_option( - "--compile", - action="store_true", - dest="compile", - default=True, - help="Compile Python source files to bytecode", - ) - - self.cmd_opts.add_option( - "--no-compile", - action="store_false", - dest="compile", - help="Do not compile Python source files to bytecode", - ) - - self.cmd_opts.add_option( - "--no-warn-script-location", - action="store_false", - dest="warn_script_location", - default=True, - help="Do not warn when installing scripts outside PATH", - ) - self.cmd_opts.add_option( - "--no-warn-conflicts", - action="store_false", - dest="warn_about_conflicts", - default=True, - help="Do not warn about broken dependencies", - ) - self.cmd_opts.add_option(cmdoptions.no_binary()) - self.cmd_opts.add_option(cmdoptions.only_binary()) - self.cmd_opts.add_option(cmdoptions.prefer_binary()) - self.cmd_opts.add_option(cmdoptions.require_hashes()) - self.cmd_opts.add_option(cmdoptions.progress_bar()) - self.cmd_opts.add_option(cmdoptions.root_user_action()) - - index_opts = cmdoptions.make_option_group( - cmdoptions.index_group, - self.parser, - ) - - self.parser.insert_option_group(0, index_opts) - self.parser.insert_option_group(0, self.cmd_opts) - - self.cmd_opts.add_option( - "--report", - dest="json_report_file", - metavar="file", - default=None, - help=( - "Generate a JSON file describing what pip did to install " - "the provided requirements. " - "Can be used in combination with --dry-run and --ignore-installed " - "to 'resolve' the requirements. " - "When - is used as file name it writes to stdout. " - "When writing to stdout, please combine with the --quiet option " - "to avoid mixing pip logging output with JSON output." - ), - ) - - @with_cleanup - def run(self, options: Values, args: List[str]) -> int: - if options.use_user_site and options.target_dir is not None: - raise CommandError("Can not combine '--user' and '--target'") - - # Check whether the environment we're installing into is externally - # managed, as specified in PEP 668. Specifying --root, --target, or - # --prefix disables the check, since there's no reliable way to locate - # the EXTERNALLY-MANAGED file for those cases. An exception is also - # made specifically for "--dry-run --report" for convenience. - installing_into_current_environment = ( - not (options.dry_run and options.json_report_file) - and options.root_path is None - and options.target_dir is None - and options.prefix_path is None - ) - if ( - installing_into_current_environment - and not options.override_externally_managed - ): - check_externally_managed() - - upgrade_strategy = "to-satisfy-only" - if options.upgrade: - upgrade_strategy = options.upgrade_strategy - - cmdoptions.check_dist_restriction(options, check_target=True) - - logger.verbose("Using %s", get_pip_version()) - options.use_user_site = decide_user_install( - options.use_user_site, - prefix_path=options.prefix_path, - target_dir=options.target_dir, - root_path=options.root_path, - isolated_mode=options.isolated_mode, - ) - - target_temp_dir: Optional[TempDirectory] = None - target_temp_dir_path: Optional[str] = None - if options.target_dir: - options.ignore_installed = True - options.target_dir = os.path.abspath(options.target_dir) - if ( - # fmt: off - os.path.exists(options.target_dir) and - not os.path.isdir(options.target_dir) - # fmt: on - ): - raise CommandError( - "Target path exists but is not a directory, will not continue." - ) - - # Create a target directory for using with the target option - target_temp_dir = TempDirectory(kind="target") - target_temp_dir_path = target_temp_dir.path - self.enter_context(target_temp_dir) - - global_options = options.global_options or [] - - session = self.get_default_session(options) - - target_python = make_target_python(options) - finder = self._build_package_finder( - options=options, - session=session, - target_python=target_python, - ignore_requires_python=options.ignore_requires_python, - ) - build_tracker = self.enter_context(get_build_tracker()) - - directory = TempDirectory( - delete=not options.no_clean, - kind="install", - globally_managed=True, - ) - - try: - reqs = self.get_requirements(args, options, finder, session) - check_legacy_setup_py_options(options, reqs) - - wheel_cache = WheelCache(options.cache_dir) - - # Only when installing is it permitted to use PEP 660. - # In other circumstances (pip wheel, pip download) we generate - # regular (i.e. non editable) metadata and wheels. - for req in reqs: - req.permit_editable_wheels = True - - preparer = self.make_requirement_preparer( - temp_build_dir=directory, - options=options, - build_tracker=build_tracker, - session=session, - finder=finder, - use_user_site=options.use_user_site, - verbosity=self.verbosity, - ) - resolver = self.make_resolver( - preparer=preparer, - finder=finder, - options=options, - wheel_cache=wheel_cache, - use_user_site=options.use_user_site, - ignore_installed=options.ignore_installed, - ignore_requires_python=options.ignore_requires_python, - force_reinstall=options.force_reinstall, - upgrade_strategy=upgrade_strategy, - use_pep517=options.use_pep517, - ) - - self.trace_basic_info(finder) - - requirement_set = resolver.resolve( - reqs, check_supported_wheels=not options.target_dir - ) - - if options.json_report_file: - report = InstallationReport(requirement_set.requirements_to_install) - if options.json_report_file == "-": - print_json(data=report.to_dict()) - else: - with open(options.json_report_file, "w", encoding="utf-8") as f: - json.dump(report.to_dict(), f, indent=2, ensure_ascii=False) - - if options.dry_run: - # In non dry-run mode, the legacy versions and specifiers check - # will be done as part of conflict detection. - requirement_set.warn_legacy_versions_and_specifiers() - would_install_items = sorted( - (r.metadata["name"], r.metadata["version"]) - for r in requirement_set.requirements_to_install - ) - if would_install_items: - write_output( - "Would install %s", - " ".join("-".join(item) for item in would_install_items), - ) - return SUCCESS - - try: - pip_req = requirement_set.get_requirement("pip") - except KeyError: - modifying_pip = False - else: - # If we're not replacing an already installed pip, - # we're not modifying it. - modifying_pip = pip_req.satisfied_by is None - protect_pip_from_modification_on_windows(modifying_pip=modifying_pip) - - reqs_to_build = [ - r - for r in requirement_set.requirements.values() - if should_build_for_install_command(r) - ] - - _, build_failures = build( - reqs_to_build, - wheel_cache=wheel_cache, - verify=True, - build_options=[], - global_options=global_options, - ) - - if build_failures: - raise InstallationError( - "Could not build wheels for {}, which is required to " - "install pyproject.toml-based projects".format( - ", ".join(r.name for r in build_failures) # type: ignore - ) - ) - - to_install = resolver.get_installation_order(requirement_set) - - # Check for conflicts in the package set we're installing. - conflicts: Optional[ConflictDetails] = None - should_warn_about_conflicts = ( - not options.ignore_dependencies and options.warn_about_conflicts - ) - if should_warn_about_conflicts: - conflicts = self._determine_conflicts(to_install) - - # Don't warn about script install locations if - # --target or --prefix has been specified - warn_script_location = options.warn_script_location - if options.target_dir or options.prefix_path: - warn_script_location = False - - installed = install_given_reqs( - to_install, - global_options, - root=options.root_path, - home=target_temp_dir_path, - prefix=options.prefix_path, - warn_script_location=warn_script_location, - use_user_site=options.use_user_site, - pycompile=options.compile, - ) - - lib_locations = get_lib_location_guesses( - user=options.use_user_site, - home=target_temp_dir_path, - root=options.root_path, - prefix=options.prefix_path, - isolated=options.isolated_mode, - ) - env = get_environment(lib_locations) - - installed.sort(key=operator.attrgetter("name")) - items = [] - for result in installed: - item = result.name - try: - installed_dist = env.get_distribution(item) - if installed_dist is not None: - item = f"{item}-{installed_dist.version}" - except Exception: - pass - items.append(item) - - if conflicts is not None: - self._warn_about_conflicts( - conflicts, - resolver_variant=self.determine_resolver_variant(options), - ) - - installed_desc = " ".join(items) - if installed_desc: - write_output( - "Successfully installed %s", - installed_desc, - ) - except OSError as error: - show_traceback = self.verbosity >= 1 - - message = create_os_error_message( - error, - show_traceback, - options.use_user_site, - ) - logger.error(message, exc_info=show_traceback) - - return ERROR - - if options.target_dir: - assert target_temp_dir - self._handle_target_dir( - options.target_dir, target_temp_dir, options.upgrade - ) - if options.root_user_action == "warn": - warn_if_run_as_root() - return SUCCESS - - def _handle_target_dir( - self, target_dir: str, target_temp_dir: TempDirectory, upgrade: bool - ) -> None: - ensure_dir(target_dir) - - # Checking both purelib and platlib directories for installed - # packages to be moved to target directory - lib_dir_list = [] - - # Checking both purelib and platlib directories for installed - # packages to be moved to target directory - scheme = get_scheme("", home=target_temp_dir.path) - purelib_dir = scheme.purelib - platlib_dir = scheme.platlib - data_dir = scheme.data - - if os.path.exists(purelib_dir): - lib_dir_list.append(purelib_dir) - if os.path.exists(platlib_dir) and platlib_dir != purelib_dir: - lib_dir_list.append(platlib_dir) - if os.path.exists(data_dir): - lib_dir_list.append(data_dir) - - for lib_dir in lib_dir_list: - for item in os.listdir(lib_dir): - if lib_dir == data_dir: - ddir = os.path.join(data_dir, item) - if any(s.startswith(ddir) for s in lib_dir_list[:-1]): - continue - target_item_dir = os.path.join(target_dir, item) - if os.path.exists(target_item_dir): - if not upgrade: - logger.warning( - "Target directory %s already exists. Specify " - "--upgrade to force replacement.", - target_item_dir, - ) - continue - if os.path.islink(target_item_dir): - logger.warning( - "Target directory %s already exists and is " - "a link. pip will not automatically replace " - "links, please remove if replacement is " - "desired.", - target_item_dir, - ) - continue - if os.path.isdir(target_item_dir): - shutil.rmtree(target_item_dir) - else: - os.remove(target_item_dir) - - shutil.move(os.path.join(lib_dir, item), target_item_dir) - - def _determine_conflicts( - self, to_install: List[InstallRequirement] - ) -> Optional[ConflictDetails]: - try: - return check_install_conflicts(to_install) - except Exception: - logger.exception( - "Error while checking for conflicts. Please file an issue on " - "pip's issue tracker: https://github.com/pypa/pip/issues/new" - ) - return None - - def _warn_about_conflicts( - self, conflict_details: ConflictDetails, resolver_variant: str - ) -> None: - package_set, (missing, conflicting) = conflict_details - if not missing and not conflicting: - return - - parts: List[str] = [] - if resolver_variant == "legacy": - parts.append( - "pip's legacy dependency resolver does not consider dependency " - "conflicts when selecting packages. This behaviour is the " - "source of the following dependency conflicts." - ) - else: - assert resolver_variant == "resolvelib" - parts.append( - "pip's dependency resolver does not currently take into account " - "all the packages that are installed. This behaviour is the " - "source of the following dependency conflicts." - ) - - # NOTE: There is some duplication here, with commands/check.py - for project_name in missing: - version = package_set[project_name][0] - for dependency in missing[project_name]: - message = ( - f"{project_name} {version} requires {dependency[1]}, " - "which is not installed." - ) - parts.append(message) - - for project_name in conflicting: - version = package_set[project_name][0] - for dep_name, dep_version, req in conflicting[project_name]: - message = ( - "{name} {version} requires {requirement}, but {you} have " - "{dep_name} {dep_version} which is incompatible." - ).format( - name=project_name, - version=version, - requirement=req, - dep_name=dep_name, - dep_version=dep_version, - you=("you" if resolver_variant == "resolvelib" else "you'll"), - ) - parts.append(message) - - logger.critical("\n".join(parts)) - - -def get_lib_location_guesses( - user: bool = False, - home: Optional[str] = None, - root: Optional[str] = None, - isolated: bool = False, - prefix: Optional[str] = None, -) -> List[str]: - scheme = get_scheme( - "", - user=user, - home=home, - root=root, - isolated=isolated, - prefix=prefix, - ) - return [scheme.purelib, scheme.platlib] - - -def site_packages_writable(root: Optional[str], isolated: bool) -> bool: - return all( - test_writable_dir(d) - for d in set(get_lib_location_guesses(root=root, isolated=isolated)) - ) - - -def decide_user_install( - use_user_site: Optional[bool], - prefix_path: Optional[str] = None, - target_dir: Optional[str] = None, - root_path: Optional[str] = None, - isolated_mode: bool = False, -) -> bool: - """Determine whether to do a user install based on the input options. - - If use_user_site is False, no additional checks are done. - If use_user_site is True, it is checked for compatibility with other - options. - If use_user_site is None, the default behaviour depends on the environment, - which is provided by the other arguments. - """ - # In some cases (config from tox), use_user_site can be set to an integer - # rather than a bool, which 'use_user_site is False' wouldn't catch. - if (use_user_site is not None) and (not use_user_site): - logger.debug("Non-user install by explicit request") - return False - - if use_user_site: - if prefix_path: - raise CommandError( - "Can not combine '--user' and '--prefix' as they imply " - "different installation locations" - ) - if virtualenv_no_global(): - raise InstallationError( - "Can not perform a '--user' install. User site-packages " - "are not visible in this virtualenv." - ) - logger.debug("User install by explicit request") - return True - - # If we are here, user installs have not been explicitly requested/avoided - assert use_user_site is None - - # user install incompatible with --prefix/--target - if prefix_path or target_dir: - logger.debug("Non-user install due to --prefix or --target option") - return False - - # If user installs are not enabled, choose a non-user install - if not site.ENABLE_USER_SITE: - logger.debug("Non-user install because user site-packages disabled") - return False - - # If we have permission for a non-user install, do that, - # otherwise do a user install. - if site_packages_writable(root=root_path, isolated=isolated_mode): - logger.debug("Non-user install because site-packages writeable") - return False - - logger.info( - "Defaulting to user installation because normal site-packages " - "is not writeable" - ) - return True - - -def create_os_error_message( - error: OSError, show_traceback: bool, using_user_site: bool -) -> str: - """Format an error message for an OSError - - It may occur anytime during the execution of the install command. - """ - parts = [] - - # Mention the error if we are not going to show a traceback - parts.append("Could not install packages due to an OSError") - if not show_traceback: - parts.append(": ") - parts.append(str(error)) - else: - parts.append(".") - - # Spilt the error indication from a helper message (if any) - parts[-1] += "\n" - - # Suggest useful actions to the user: - # (1) using user site-packages or (2) verifying the permissions - if error.errno == errno.EACCES: - user_option_part = "Consider using the `--user` option" - permissions_part = "Check the permissions" - - if not running_under_virtualenv() and not using_user_site: - parts.extend( - [ - user_option_part, - " or ", - permissions_part.lower(), - ] - ) - else: - parts.append(permissions_part) - parts.append(".\n") - - # Suggest the user to enable Long Paths if path length is - # more than 260 - if ( - WINDOWS - and error.errno == errno.ENOENT - and error.filename - and len(error.filename) > 260 - ): - parts.append( - "HINT: This error might have occurred since " - "this system does not have Windows Long Path " - "support enabled. You can find information on " - "how to enable this at " - "https://pip.pypa.io/warnings/enable-long-paths\n" - ) - - return "".join(parts).strip() + "\n" diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/list.py b/venv/lib/python3.12/site-packages/pip/_internal/commands/list.py deleted file mode 100644 index 32fb19b..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/commands/list.py +++ /dev/null @@ -1,370 +0,0 @@ -import json -import logging -from optparse import Values -from typing import TYPE_CHECKING, Generator, List, Optional, Sequence, Tuple, cast - -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.cli import cmdoptions -from pip._internal.cli.req_command import IndexGroupCommand -from pip._internal.cli.status_codes import SUCCESS -from pip._internal.exceptions import CommandError -from pip._internal.index.collector import LinkCollector -from pip._internal.index.package_finder import PackageFinder -from pip._internal.metadata import BaseDistribution, get_environment -from pip._internal.models.selection_prefs import SelectionPreferences -from pip._internal.network.session import PipSession -from pip._internal.utils.compat import stdlib_pkgs -from pip._internal.utils.misc import tabulate, write_output - -if TYPE_CHECKING: - from pip._internal.metadata.base import DistributionVersion - - class _DistWithLatestInfo(BaseDistribution): - """Give the distribution object a couple of extra fields. - - These will be populated during ``get_outdated()``. This is dirty but - makes the rest of the code much cleaner. - """ - - latest_version: DistributionVersion - latest_filetype: str - - _ProcessedDists = Sequence[_DistWithLatestInfo] - - -from pip._vendor.packaging.version import parse - -logger = logging.getLogger(__name__) - - -class ListCommand(IndexGroupCommand): - """ - List installed packages, including editables. - - Packages are listed in a case-insensitive sorted order. - """ - - ignore_require_venv = True - usage = """ - %prog [options]""" - - def add_options(self) -> None: - self.cmd_opts.add_option( - "-o", - "--outdated", - action="store_true", - default=False, - help="List outdated packages", - ) - self.cmd_opts.add_option( - "-u", - "--uptodate", - action="store_true", - default=False, - help="List uptodate packages", - ) - self.cmd_opts.add_option( - "-e", - "--editable", - action="store_true", - default=False, - help="List editable projects.", - ) - self.cmd_opts.add_option( - "-l", - "--local", - action="store_true", - default=False, - help=( - "If in a virtualenv that has global access, do not list " - "globally-installed packages." - ), - ) - self.cmd_opts.add_option( - "--user", - dest="user", - action="store_true", - default=False, - help="Only output packages installed in user-site.", - ) - self.cmd_opts.add_option(cmdoptions.list_path()) - self.cmd_opts.add_option( - "--pre", - action="store_true", - default=False, - help=( - "Include pre-release and development versions. By default, " - "pip only finds stable versions." - ), - ) - - self.cmd_opts.add_option( - "--format", - action="store", - dest="list_format", - default="columns", - choices=("columns", "freeze", "json"), - help=( - "Select the output format among: columns (default), freeze, or json. " - "The 'freeze' format cannot be used with the --outdated option." - ), - ) - - self.cmd_opts.add_option( - "--not-required", - action="store_true", - dest="not_required", - help="List packages that are not dependencies of installed packages.", - ) - - self.cmd_opts.add_option( - "--exclude-editable", - action="store_false", - dest="include_editable", - help="Exclude editable package from output.", - ) - self.cmd_opts.add_option( - "--include-editable", - action="store_true", - dest="include_editable", - help="Include editable package from output.", - default=True, - ) - self.cmd_opts.add_option(cmdoptions.list_exclude()) - index_opts = cmdoptions.make_option_group(cmdoptions.index_group, self.parser) - - self.parser.insert_option_group(0, index_opts) - self.parser.insert_option_group(0, self.cmd_opts) - - def _build_package_finder( - self, options: Values, session: PipSession - ) -> PackageFinder: - """ - Create a package finder appropriate to this list command. - """ - link_collector = LinkCollector.create(session, options=options) - - # Pass allow_yanked=False to ignore yanked versions. - selection_prefs = SelectionPreferences( - allow_yanked=False, - allow_all_prereleases=options.pre, - ) - - return PackageFinder.create( - link_collector=link_collector, - selection_prefs=selection_prefs, - ) - - def run(self, options: Values, args: List[str]) -> int: - if options.outdated and options.uptodate: - raise CommandError("Options --outdated and --uptodate cannot be combined.") - - if options.outdated and options.list_format == "freeze": - raise CommandError( - "List format 'freeze' cannot be used with the --outdated option." - ) - - cmdoptions.check_list_path_option(options) - - skip = set(stdlib_pkgs) - if options.excludes: - skip.update(canonicalize_name(n) for n in options.excludes) - - packages: "_ProcessedDists" = [ - cast("_DistWithLatestInfo", d) - for d in get_environment(options.path).iter_installed_distributions( - local_only=options.local, - user_only=options.user, - editables_only=options.editable, - include_editables=options.include_editable, - skip=skip, - ) - ] - - # get_not_required must be called firstly in order to find and - # filter out all dependencies correctly. Otherwise a package - # can't be identified as requirement because some parent packages - # could be filtered out before. - if options.not_required: - packages = self.get_not_required(packages, options) - - if options.outdated: - packages = self.get_outdated(packages, options) - elif options.uptodate: - packages = self.get_uptodate(packages, options) - - self.output_package_listing(packages, options) - return SUCCESS - - def get_outdated( - self, packages: "_ProcessedDists", options: Values - ) -> "_ProcessedDists": - return [ - dist - for dist in self.iter_packages_latest_infos(packages, options) - if parse(str(dist.latest_version)) > parse(str(dist.version)) - ] - - def get_uptodate( - self, packages: "_ProcessedDists", options: Values - ) -> "_ProcessedDists": - return [ - dist - for dist in self.iter_packages_latest_infos(packages, options) - if parse(str(dist.latest_version)) == parse(str(dist.version)) - ] - - def get_not_required( - self, packages: "_ProcessedDists", options: Values - ) -> "_ProcessedDists": - dep_keys = { - canonicalize_name(dep.name) - for dist in packages - for dep in (dist.iter_dependencies() or ()) - } - - # Create a set to remove duplicate packages, and cast it to a list - # to keep the return type consistent with get_outdated and - # get_uptodate - return list({pkg for pkg in packages if pkg.canonical_name not in dep_keys}) - - def iter_packages_latest_infos( - self, packages: "_ProcessedDists", options: Values - ) -> Generator["_DistWithLatestInfo", None, None]: - with self._build_session(options) as session: - finder = self._build_package_finder(options, session) - - def latest_info( - dist: "_DistWithLatestInfo", - ) -> Optional["_DistWithLatestInfo"]: - all_candidates = finder.find_all_candidates(dist.canonical_name) - if not options.pre: - # Remove prereleases - all_candidates = [ - candidate - for candidate in all_candidates - if not candidate.version.is_prerelease - ] - - evaluator = finder.make_candidate_evaluator( - project_name=dist.canonical_name, - ) - best_candidate = evaluator.sort_best_candidate(all_candidates) - if best_candidate is None: - return None - - remote_version = best_candidate.version - if best_candidate.link.is_wheel: - typ = "wheel" - else: - typ = "sdist" - dist.latest_version = remote_version - dist.latest_filetype = typ - return dist - - for dist in map(latest_info, packages): - if dist is not None: - yield dist - - def output_package_listing( - self, packages: "_ProcessedDists", options: Values - ) -> None: - packages = sorted( - packages, - key=lambda dist: dist.canonical_name, - ) - if options.list_format == "columns" and packages: - data, header = format_for_columns(packages, options) - self.output_package_listing_columns(data, header) - elif options.list_format == "freeze": - for dist in packages: - if options.verbose >= 1: - write_output( - "%s==%s (%s)", dist.raw_name, dist.version, dist.location - ) - else: - write_output("%s==%s", dist.raw_name, dist.version) - elif options.list_format == "json": - write_output(format_for_json(packages, options)) - - def output_package_listing_columns( - self, data: List[List[str]], header: List[str] - ) -> None: - # insert the header first: we need to know the size of column names - if len(data) > 0: - data.insert(0, header) - - pkg_strings, sizes = tabulate(data) - - # Create and add a separator. - if len(data) > 0: - pkg_strings.insert(1, " ".join("-" * x for x in sizes)) - - for val in pkg_strings: - write_output(val) - - -def format_for_columns( - pkgs: "_ProcessedDists", options: Values -) -> Tuple[List[List[str]], List[str]]: - """ - Convert the package data into something usable - by output_package_listing_columns. - """ - header = ["Package", "Version"] - - running_outdated = options.outdated - if running_outdated: - header.extend(["Latest", "Type"]) - - has_editables = any(x.editable for x in pkgs) - if has_editables: - header.append("Editable project location") - - if options.verbose >= 1: - header.append("Location") - if options.verbose >= 1: - header.append("Installer") - - data = [] - for proj in pkgs: - # if we're working on the 'outdated' list, separate out the - # latest_version and type - row = [proj.raw_name, str(proj.version)] - - if running_outdated: - row.append(str(proj.latest_version)) - row.append(proj.latest_filetype) - - if has_editables: - row.append(proj.editable_project_location or "") - - if options.verbose >= 1: - row.append(proj.location or "") - if options.verbose >= 1: - row.append(proj.installer) - - data.append(row) - - return data, header - - -def format_for_json(packages: "_ProcessedDists", options: Values) -> str: - data = [] - for dist in packages: - info = { - "name": dist.raw_name, - "version": str(dist.version), - } - if options.verbose >= 1: - info["location"] = dist.location or "" - info["installer"] = dist.installer - if options.outdated: - info["latest_version"] = str(dist.latest_version) - info["latest_filetype"] = dist.latest_filetype - editable_project_location = dist.editable_project_location - if editable_project_location: - info["editable_project_location"] = editable_project_location - data.append(info) - return json.dumps(data) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/search.py b/venv/lib/python3.12/site-packages/pip/_internal/commands/search.py deleted file mode 100644 index 03ed925..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/commands/search.py +++ /dev/null @@ -1,174 +0,0 @@ -import logging -import shutil -import sys -import textwrap -import xmlrpc.client -from collections import OrderedDict -from optparse import Values -from typing import TYPE_CHECKING, Dict, List, Optional - -from pip._vendor.packaging.version import parse as parse_version - -from pip._internal.cli.base_command import Command -from pip._internal.cli.req_command import SessionCommandMixin -from pip._internal.cli.status_codes import NO_MATCHES_FOUND, SUCCESS -from pip._internal.exceptions import CommandError -from pip._internal.metadata import get_default_environment -from pip._internal.models.index import PyPI -from pip._internal.network.xmlrpc import PipXmlrpcTransport -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import write_output - -if TYPE_CHECKING: - from typing import TypedDict - - class TransformedHit(TypedDict): - name: str - summary: str - versions: List[str] - - -logger = logging.getLogger(__name__) - - -class SearchCommand(Command, SessionCommandMixin): - """Search for PyPI packages whose name or summary contains <query>.""" - - usage = """ - %prog [options] <query>""" - ignore_require_venv = True - - def add_options(self) -> None: - self.cmd_opts.add_option( - "-i", - "--index", - dest="index", - metavar="URL", - default=PyPI.pypi_url, - help="Base URL of Python Package Index (default %default)", - ) - - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options: Values, args: List[str]) -> int: - if not args: - raise CommandError("Missing required argument (search query).") - query = args - pypi_hits = self.search(query, options) - hits = transform_hits(pypi_hits) - - terminal_width = None - if sys.stdout.isatty(): - terminal_width = shutil.get_terminal_size()[0] - - print_results(hits, terminal_width=terminal_width) - if pypi_hits: - return SUCCESS - return NO_MATCHES_FOUND - - def search(self, query: List[str], options: Values) -> List[Dict[str, str]]: - index_url = options.index - - session = self.get_default_session(options) - - transport = PipXmlrpcTransport(index_url, session) - pypi = xmlrpc.client.ServerProxy(index_url, transport) - try: - hits = pypi.search({"name": query, "summary": query}, "or") - except xmlrpc.client.Fault as fault: - message = "XMLRPC request failed [code: {code}]\n{string}".format( - code=fault.faultCode, - string=fault.faultString, - ) - raise CommandError(message) - assert isinstance(hits, list) - return hits - - -def transform_hits(hits: List[Dict[str, str]]) -> List["TransformedHit"]: - """ - The list from pypi is really a list of versions. We want a list of - packages with the list of versions stored inline. This converts the - list from pypi into one we can use. - """ - packages: Dict[str, "TransformedHit"] = OrderedDict() - for hit in hits: - name = hit["name"] - summary = hit["summary"] - version = hit["version"] - - if name not in packages.keys(): - packages[name] = { - "name": name, - "summary": summary, - "versions": [version], - } - else: - packages[name]["versions"].append(version) - - # if this is the highest version, replace summary and score - if version == highest_version(packages[name]["versions"]): - packages[name]["summary"] = summary - - return list(packages.values()) - - -def print_dist_installation_info(name: str, latest: str) -> None: - env = get_default_environment() - dist = env.get_distribution(name) - if dist is not None: - with indent_log(): - if dist.version == latest: - write_output("INSTALLED: %s (latest)", dist.version) - else: - write_output("INSTALLED: %s", dist.version) - if parse_version(latest).pre: - write_output( - "LATEST: %s (pre-release; install" - " with `pip install --pre`)", - latest, - ) - else: - write_output("LATEST: %s", latest) - - -def print_results( - hits: List["TransformedHit"], - name_column_width: Optional[int] = None, - terminal_width: Optional[int] = None, -) -> None: - if not hits: - return - if name_column_width is None: - name_column_width = ( - max( - [ - len(hit["name"]) + len(highest_version(hit.get("versions", ["-"]))) - for hit in hits - ] - ) - + 4 - ) - - for hit in hits: - name = hit["name"] - summary = hit["summary"] or "" - latest = highest_version(hit.get("versions", ["-"])) - if terminal_width is not None: - target_width = terminal_width - name_column_width - 5 - if target_width > 10: - # wrap and indent summary to fit terminal - summary_lines = textwrap.wrap(summary, target_width) - summary = ("\n" + " " * (name_column_width + 3)).join(summary_lines) - - name_latest = f"{name} ({latest})" - line = f"{name_latest:{name_column_width}} - {summary}" - try: - write_output(line) - print_dist_installation_info(name, latest) - except UnicodeEncodeError: - pass - - -def highest_version(versions: List[str]) -> str: - return max(versions, key=parse_version) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/show.py b/venv/lib/python3.12/site-packages/pip/_internal/commands/show.py deleted file mode 100644 index 3f10701..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/commands/show.py +++ /dev/null @@ -1,189 +0,0 @@ -import logging -from optparse import Values -from typing import Generator, Iterable, Iterator, List, NamedTuple, Optional - -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import ERROR, SUCCESS -from pip._internal.metadata import BaseDistribution, get_default_environment -from pip._internal.utils.misc import write_output - -logger = logging.getLogger(__name__) - - -class ShowCommand(Command): - """ - Show information about one or more installed packages. - - The output is in RFC-compliant mail header format. - """ - - usage = """ - %prog [options] <package> ...""" - ignore_require_venv = True - - def add_options(self) -> None: - self.cmd_opts.add_option( - "-f", - "--files", - dest="files", - action="store_true", - default=False, - help="Show the full list of installed files for each package.", - ) - - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options: Values, args: List[str]) -> int: - if not args: - logger.warning("ERROR: Please provide a package name or names.") - return ERROR - query = args - - results = search_packages_info(query) - if not print_results( - results, list_files=options.files, verbose=options.verbose - ): - return ERROR - return SUCCESS - - -class _PackageInfo(NamedTuple): - name: str - version: str - location: str - editable_project_location: Optional[str] - requires: List[str] - required_by: List[str] - installer: str - metadata_version: str - classifiers: List[str] - summary: str - homepage: str - project_urls: List[str] - author: str - author_email: str - license: str - entry_points: List[str] - files: Optional[List[str]] - - -def search_packages_info(query: List[str]) -> Generator[_PackageInfo, None, None]: - """ - Gather details from installed distributions. Print distribution name, - version, location, and installed files. Installed files requires a - pip generated 'installed-files.txt' in the distributions '.egg-info' - directory. - """ - env = get_default_environment() - - installed = {dist.canonical_name: dist for dist in env.iter_all_distributions()} - query_names = [canonicalize_name(name) for name in query] - missing = sorted( - [name for name, pkg in zip(query, query_names) if pkg not in installed] - ) - if missing: - logger.warning("Package(s) not found: %s", ", ".join(missing)) - - def _get_requiring_packages(current_dist: BaseDistribution) -> Iterator[str]: - return ( - dist.metadata["Name"] or "UNKNOWN" - for dist in installed.values() - if current_dist.canonical_name - in {canonicalize_name(d.name) for d in dist.iter_dependencies()} - ) - - for query_name in query_names: - try: - dist = installed[query_name] - except KeyError: - continue - - requires = sorted((req.name for req in dist.iter_dependencies()), key=str.lower) - required_by = sorted(_get_requiring_packages(dist), key=str.lower) - - try: - entry_points_text = dist.read_text("entry_points.txt") - entry_points = entry_points_text.splitlines(keepends=False) - except FileNotFoundError: - entry_points = [] - - files_iter = dist.iter_declared_entries() - if files_iter is None: - files: Optional[List[str]] = None - else: - files = sorted(files_iter) - - metadata = dist.metadata - - yield _PackageInfo( - name=dist.raw_name, - version=str(dist.version), - location=dist.location or "", - editable_project_location=dist.editable_project_location, - requires=requires, - required_by=required_by, - installer=dist.installer, - metadata_version=dist.metadata_version or "", - classifiers=metadata.get_all("Classifier", []), - summary=metadata.get("Summary", ""), - homepage=metadata.get("Home-page", ""), - project_urls=metadata.get_all("Project-URL", []), - author=metadata.get("Author", ""), - author_email=metadata.get("Author-email", ""), - license=metadata.get("License", ""), - entry_points=entry_points, - files=files, - ) - - -def print_results( - distributions: Iterable[_PackageInfo], - list_files: bool, - verbose: bool, -) -> bool: - """ - Print the information from installed distributions found. - """ - results_printed = False - for i, dist in enumerate(distributions): - results_printed = True - if i > 0: - write_output("---") - - write_output("Name: %s", dist.name) - write_output("Version: %s", dist.version) - write_output("Summary: %s", dist.summary) - write_output("Home-page: %s", dist.homepage) - write_output("Author: %s", dist.author) - write_output("Author-email: %s", dist.author_email) - write_output("License: %s", dist.license) - write_output("Location: %s", dist.location) - if dist.editable_project_location is not None: - write_output( - "Editable project location: %s", dist.editable_project_location - ) - write_output("Requires: %s", ", ".join(dist.requires)) - write_output("Required-by: %s", ", ".join(dist.required_by)) - - if verbose: - write_output("Metadata-Version: %s", dist.metadata_version) - write_output("Installer: %s", dist.installer) - write_output("Classifiers:") - for classifier in dist.classifiers: - write_output(" %s", classifier) - write_output("Entry-points:") - for entry in dist.entry_points: - write_output(" %s", entry.strip()) - write_output("Project-URLs:") - for project_url in dist.project_urls: - write_output(" %s", project_url) - if list_files: - write_output("Files:") - if dist.files is None: - write_output("Cannot locate RECORD or installed-files.txt") - else: - for line in dist.files: - write_output(" %s", line.strip()) - return results_printed diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/uninstall.py b/venv/lib/python3.12/site-packages/pip/_internal/commands/uninstall.py deleted file mode 100644 index f198fc3..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/commands/uninstall.py +++ /dev/null @@ -1,113 +0,0 @@ -import logging -from optparse import Values -from typing import List - -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.cli import cmdoptions -from pip._internal.cli.base_command import Command -from pip._internal.cli.req_command import SessionCommandMixin, warn_if_run_as_root -from pip._internal.cli.status_codes import SUCCESS -from pip._internal.exceptions import InstallationError -from pip._internal.req import parse_requirements -from pip._internal.req.constructors import ( - install_req_from_line, - install_req_from_parsed_requirement, -) -from pip._internal.utils.misc import ( - check_externally_managed, - protect_pip_from_modification_on_windows, -) - -logger = logging.getLogger(__name__) - - -class UninstallCommand(Command, SessionCommandMixin): - """ - Uninstall packages. - - pip is able to uninstall most installed packages. Known exceptions are: - - - Pure distutils packages installed with ``python setup.py install``, which - leave behind no metadata to determine what files were installed. - - Script wrappers installed by ``python setup.py develop``. - """ - - usage = """ - %prog [options] <package> ... - %prog [options] -r <requirements file> ...""" - - def add_options(self) -> None: - self.cmd_opts.add_option( - "-r", - "--requirement", - dest="requirements", - action="append", - default=[], - metavar="file", - help=( - "Uninstall all the packages listed in the given requirements " - "file. This option can be used multiple times." - ), - ) - self.cmd_opts.add_option( - "-y", - "--yes", - dest="yes", - action="store_true", - help="Don't ask for confirmation of uninstall deletions.", - ) - self.cmd_opts.add_option(cmdoptions.root_user_action()) - self.cmd_opts.add_option(cmdoptions.override_externally_managed()) - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options: Values, args: List[str]) -> int: - session = self.get_default_session(options) - - reqs_to_uninstall = {} - for name in args: - req = install_req_from_line( - name, - isolated=options.isolated_mode, - ) - if req.name: - reqs_to_uninstall[canonicalize_name(req.name)] = req - else: - logger.warning( - "Invalid requirement: %r ignored -" - " the uninstall command expects named" - " requirements.", - name, - ) - for filename in options.requirements: - for parsed_req in parse_requirements( - filename, options=options, session=session - ): - req = install_req_from_parsed_requirement( - parsed_req, isolated=options.isolated_mode - ) - if req.name: - reqs_to_uninstall[canonicalize_name(req.name)] = req - if not reqs_to_uninstall: - raise InstallationError( - f"You must give at least one requirement to {self.name} (see " - f'"pip help {self.name}")' - ) - - if not options.override_externally_managed: - check_externally_managed() - - protect_pip_from_modification_on_windows( - modifying_pip="pip" in reqs_to_uninstall - ) - - for req in reqs_to_uninstall.values(): - uninstall_pathset = req.uninstall( - auto_confirm=options.yes, - verbose=self.verbosity > 0, - ) - if uninstall_pathset: - uninstall_pathset.commit() - if options.root_user_action == "warn": - warn_if_run_as_root() - return SUCCESS diff --git a/venv/lib/python3.12/site-packages/pip/_internal/commands/wheel.py b/venv/lib/python3.12/site-packages/pip/_internal/commands/wheel.py deleted file mode 100644 index ed578aa..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/commands/wheel.py +++ /dev/null @@ -1,183 +0,0 @@ -import logging -import os -import shutil -from optparse import Values -from typing import List - -from pip._internal.cache import WheelCache -from pip._internal.cli import cmdoptions -from pip._internal.cli.req_command import RequirementCommand, with_cleanup -from pip._internal.cli.status_codes import SUCCESS -from pip._internal.exceptions import CommandError -from pip._internal.operations.build.build_tracker import get_build_tracker -from pip._internal.req.req_install import ( - InstallRequirement, - check_legacy_setup_py_options, -) -from pip._internal.utils.misc import ensure_dir, normalize_path -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.wheel_builder import build, should_build_for_wheel_command - -logger = logging.getLogger(__name__) - - -class WheelCommand(RequirementCommand): - """ - Build Wheel archives for your requirements and dependencies. - - Wheel is a built-package format, and offers the advantage of not - recompiling your software during every install. For more details, see the - wheel docs: https://wheel.readthedocs.io/en/latest/ - - 'pip wheel' uses the build system interface as described here: - https://pip.pypa.io/en/stable/reference/build-system/ - - """ - - usage = """ - %prog [options] <requirement specifier> ... - %prog [options] -r <requirements file> ... - %prog [options] [-e] <vcs project url> ... - %prog [options] [-e] <local project path> ... - %prog [options] <archive url/path> ...""" - - def add_options(self) -> None: - self.cmd_opts.add_option( - "-w", - "--wheel-dir", - dest="wheel_dir", - metavar="dir", - default=os.curdir, - help=( - "Build wheels into <dir>, where the default is the " - "current working directory." - ), - ) - self.cmd_opts.add_option(cmdoptions.no_binary()) - self.cmd_opts.add_option(cmdoptions.only_binary()) - self.cmd_opts.add_option(cmdoptions.prefer_binary()) - self.cmd_opts.add_option(cmdoptions.no_build_isolation()) - self.cmd_opts.add_option(cmdoptions.use_pep517()) - self.cmd_opts.add_option(cmdoptions.no_use_pep517()) - self.cmd_opts.add_option(cmdoptions.check_build_deps()) - self.cmd_opts.add_option(cmdoptions.constraints()) - self.cmd_opts.add_option(cmdoptions.editable()) - self.cmd_opts.add_option(cmdoptions.requirements()) - self.cmd_opts.add_option(cmdoptions.src()) - self.cmd_opts.add_option(cmdoptions.ignore_requires_python()) - self.cmd_opts.add_option(cmdoptions.no_deps()) - self.cmd_opts.add_option(cmdoptions.progress_bar()) - - self.cmd_opts.add_option( - "--no-verify", - dest="no_verify", - action="store_true", - default=False, - help="Don't verify if built wheel is valid.", - ) - - self.cmd_opts.add_option(cmdoptions.config_settings()) - self.cmd_opts.add_option(cmdoptions.build_options()) - self.cmd_opts.add_option(cmdoptions.global_options()) - - self.cmd_opts.add_option( - "--pre", - action="store_true", - default=False, - help=( - "Include pre-release and development versions. By default, " - "pip only finds stable versions." - ), - ) - - self.cmd_opts.add_option(cmdoptions.require_hashes()) - - index_opts = cmdoptions.make_option_group( - cmdoptions.index_group, - self.parser, - ) - - self.parser.insert_option_group(0, index_opts) - self.parser.insert_option_group(0, self.cmd_opts) - - @with_cleanup - def run(self, options: Values, args: List[str]) -> int: - session = self.get_default_session(options) - - finder = self._build_package_finder(options, session) - - options.wheel_dir = normalize_path(options.wheel_dir) - ensure_dir(options.wheel_dir) - - build_tracker = self.enter_context(get_build_tracker()) - - directory = TempDirectory( - delete=not options.no_clean, - kind="wheel", - globally_managed=True, - ) - - reqs = self.get_requirements(args, options, finder, session) - check_legacy_setup_py_options(options, reqs) - - wheel_cache = WheelCache(options.cache_dir) - - preparer = self.make_requirement_preparer( - temp_build_dir=directory, - options=options, - build_tracker=build_tracker, - session=session, - finder=finder, - download_dir=options.wheel_dir, - use_user_site=False, - verbosity=self.verbosity, - ) - - resolver = self.make_resolver( - preparer=preparer, - finder=finder, - options=options, - wheel_cache=wheel_cache, - ignore_requires_python=options.ignore_requires_python, - use_pep517=options.use_pep517, - ) - - self.trace_basic_info(finder) - - requirement_set = resolver.resolve(reqs, check_supported_wheels=True) - - reqs_to_build: List[InstallRequirement] = [] - for req in requirement_set.requirements.values(): - if req.is_wheel: - preparer.save_linked_requirement(req) - elif should_build_for_wheel_command(req): - reqs_to_build.append(req) - - preparer.prepare_linked_requirements_more(requirement_set.requirements.values()) - requirement_set.warn_legacy_versions_and_specifiers() - - # build wheels - build_successes, build_failures = build( - reqs_to_build, - wheel_cache=wheel_cache, - verify=(not options.no_verify), - build_options=options.build_options or [], - global_options=options.global_options or [], - ) - for req in build_successes: - assert req.link and req.link.is_wheel - assert req.local_file_path - # copy from cache to target directory - try: - shutil.copy(req.local_file_path, options.wheel_dir) - except OSError as e: - logger.warning( - "Building wheel for %s failed: %s", - req.name, - e, - ) - build_failures.append(req) - if len(build_failures) != 0: - raise CommandError("Failed to build one or more wheels") - - return SUCCESS diff --git a/venv/lib/python3.12/site-packages/pip/_internal/configuration.py b/venv/lib/python3.12/site-packages/pip/_internal/configuration.py deleted file mode 100644 index c25273d..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/configuration.py +++ /dev/null @@ -1,383 +0,0 @@ -"""Configuration management setup - -Some terminology: -- name - As written in config files. -- value - Value associated with a name -- key - Name combined with it's section (section.name) -- variant - A single word describing where the configuration key-value pair came from -""" - -import configparser -import locale -import os -import sys -from typing import Any, Dict, Iterable, List, NewType, Optional, Tuple - -from pip._internal.exceptions import ( - ConfigurationError, - ConfigurationFileCouldNotBeLoaded, -) -from pip._internal.utils import appdirs -from pip._internal.utils.compat import WINDOWS -from pip._internal.utils.logging import getLogger -from pip._internal.utils.misc import ensure_dir, enum - -RawConfigParser = configparser.RawConfigParser # Shorthand -Kind = NewType("Kind", str) - -CONFIG_BASENAME = "pip.ini" if WINDOWS else "pip.conf" -ENV_NAMES_IGNORED = "version", "help" - -# The kinds of configurations there are. -kinds = enum( - USER="user", # User Specific - GLOBAL="global", # System Wide - SITE="site", # [Virtual] Environment Specific - ENV="env", # from PIP_CONFIG_FILE - ENV_VAR="env-var", # from Environment Variables -) -OVERRIDE_ORDER = kinds.GLOBAL, kinds.USER, kinds.SITE, kinds.ENV, kinds.ENV_VAR -VALID_LOAD_ONLY = kinds.USER, kinds.GLOBAL, kinds.SITE - -logger = getLogger(__name__) - - -# NOTE: Maybe use the optionx attribute to normalize keynames. -def _normalize_name(name: str) -> str: - """Make a name consistent regardless of source (environment or file)""" - name = name.lower().replace("_", "-") - if name.startswith("--"): - name = name[2:] # only prefer long opts - return name - - -def _disassemble_key(name: str) -> List[str]: - if "." not in name: - error_message = ( - "Key does not contain dot separated section and key. " - f"Perhaps you wanted to use 'global.{name}' instead?" - ) - raise ConfigurationError(error_message) - return name.split(".", 1) - - -def get_configuration_files() -> Dict[Kind, List[str]]: - global_config_files = [ - os.path.join(path, CONFIG_BASENAME) for path in appdirs.site_config_dirs("pip") - ] - - site_config_file = os.path.join(sys.prefix, CONFIG_BASENAME) - legacy_config_file = os.path.join( - os.path.expanduser("~"), - "pip" if WINDOWS else ".pip", - CONFIG_BASENAME, - ) - new_config_file = os.path.join(appdirs.user_config_dir("pip"), CONFIG_BASENAME) - return { - kinds.GLOBAL: global_config_files, - kinds.SITE: [site_config_file], - kinds.USER: [legacy_config_file, new_config_file], - } - - -class Configuration: - """Handles management of configuration. - - Provides an interface to accessing and managing configuration files. - - This class converts provides an API that takes "section.key-name" style - keys and stores the value associated with it as "key-name" under the - section "section". - - This allows for a clean interface wherein the both the section and the - key-name are preserved in an easy to manage form in the configuration files - and the data stored is also nice. - """ - - def __init__(self, isolated: bool, load_only: Optional[Kind] = None) -> None: - super().__init__() - - if load_only is not None and load_only not in VALID_LOAD_ONLY: - raise ConfigurationError( - "Got invalid value for load_only - should be one of {}".format( - ", ".join(map(repr, VALID_LOAD_ONLY)) - ) - ) - self.isolated = isolated - self.load_only = load_only - - # Because we keep track of where we got the data from - self._parsers: Dict[Kind, List[Tuple[str, RawConfigParser]]] = { - variant: [] for variant in OVERRIDE_ORDER - } - self._config: Dict[Kind, Dict[str, Any]] = { - variant: {} for variant in OVERRIDE_ORDER - } - self._modified_parsers: List[Tuple[str, RawConfigParser]] = [] - - def load(self) -> None: - """Loads configuration from configuration files and environment""" - self._load_config_files() - if not self.isolated: - self._load_environment_vars() - - def get_file_to_edit(self) -> Optional[str]: - """Returns the file with highest priority in configuration""" - assert self.load_only is not None, "Need to be specified a file to be editing" - - try: - return self._get_parser_to_modify()[0] - except IndexError: - return None - - def items(self) -> Iterable[Tuple[str, Any]]: - """Returns key-value pairs like dict.items() representing the loaded - configuration - """ - return self._dictionary.items() - - def get_value(self, key: str) -> Any: - """Get a value from the configuration.""" - orig_key = key - key = _normalize_name(key) - try: - return self._dictionary[key] - except KeyError: - # disassembling triggers a more useful error message than simply - # "No such key" in the case that the key isn't in the form command.option - _disassemble_key(key) - raise ConfigurationError(f"No such key - {orig_key}") - - def set_value(self, key: str, value: Any) -> None: - """Modify a value in the configuration.""" - key = _normalize_name(key) - self._ensure_have_load_only() - - assert self.load_only - fname, parser = self._get_parser_to_modify() - - if parser is not None: - section, name = _disassemble_key(key) - - # Modify the parser and the configuration - if not parser.has_section(section): - parser.add_section(section) - parser.set(section, name, value) - - self._config[self.load_only][key] = value - self._mark_as_modified(fname, parser) - - def unset_value(self, key: str) -> None: - """Unset a value in the configuration.""" - orig_key = key - key = _normalize_name(key) - self._ensure_have_load_only() - - assert self.load_only - if key not in self._config[self.load_only]: - raise ConfigurationError(f"No such key - {orig_key}") - - fname, parser = self._get_parser_to_modify() - - if parser is not None: - section, name = _disassemble_key(key) - if not ( - parser.has_section(section) and parser.remove_option(section, name) - ): - # The option was not removed. - raise ConfigurationError( - "Fatal Internal error [id=1]. Please report as a bug." - ) - - # The section may be empty after the option was removed. - if not parser.items(section): - parser.remove_section(section) - self._mark_as_modified(fname, parser) - - del self._config[self.load_only][key] - - def save(self) -> None: - """Save the current in-memory state.""" - self._ensure_have_load_only() - - for fname, parser in self._modified_parsers: - logger.info("Writing to %s", fname) - - # Ensure directory exists. - ensure_dir(os.path.dirname(fname)) - - # Ensure directory's permission(need to be writeable) - try: - with open(fname, "w") as f: - parser.write(f) - except OSError as error: - raise ConfigurationError( - f"An error occurred while writing to the configuration file " - f"{fname}: {error}" - ) - - # - # Private routines - # - - def _ensure_have_load_only(self) -> None: - if self.load_only is None: - raise ConfigurationError("Needed a specific file to be modifying.") - logger.debug("Will be working with %s variant only", self.load_only) - - @property - def _dictionary(self) -> Dict[str, Any]: - """A dictionary representing the loaded configuration.""" - # NOTE: Dictionaries are not populated if not loaded. So, conditionals - # are not needed here. - retval = {} - - for variant in OVERRIDE_ORDER: - retval.update(self._config[variant]) - - return retval - - def _load_config_files(self) -> None: - """Loads configuration from configuration files""" - config_files = dict(self.iter_config_files()) - if config_files[kinds.ENV][0:1] == [os.devnull]: - logger.debug( - "Skipping loading configuration files due to " - "environment's PIP_CONFIG_FILE being os.devnull" - ) - return - - for variant, files in config_files.items(): - for fname in files: - # If there's specific variant set in `load_only`, load only - # that variant, not the others. - if self.load_only is not None and variant != self.load_only: - logger.debug("Skipping file '%s' (variant: %s)", fname, variant) - continue - - parser = self._load_file(variant, fname) - - # Keeping track of the parsers used - self._parsers[variant].append((fname, parser)) - - def _load_file(self, variant: Kind, fname: str) -> RawConfigParser: - logger.verbose("For variant '%s', will try loading '%s'", variant, fname) - parser = self._construct_parser(fname) - - for section in parser.sections(): - items = parser.items(section) - self._config[variant].update(self._normalized_keys(section, items)) - - return parser - - def _construct_parser(self, fname: str) -> RawConfigParser: - parser = configparser.RawConfigParser() - # If there is no such file, don't bother reading it but create the - # parser anyway, to hold the data. - # Doing this is useful when modifying and saving files, where we don't - # need to construct a parser. - if os.path.exists(fname): - locale_encoding = locale.getpreferredencoding(False) - try: - parser.read(fname, encoding=locale_encoding) - except UnicodeDecodeError: - # See https://github.com/pypa/pip/issues/4963 - raise ConfigurationFileCouldNotBeLoaded( - reason=f"contains invalid {locale_encoding} characters", - fname=fname, - ) - except configparser.Error as error: - # See https://github.com/pypa/pip/issues/4893 - raise ConfigurationFileCouldNotBeLoaded(error=error) - return parser - - def _load_environment_vars(self) -> None: - """Loads configuration from environment variables""" - self._config[kinds.ENV_VAR].update( - self._normalized_keys(":env:", self.get_environ_vars()) - ) - - def _normalized_keys( - self, section: str, items: Iterable[Tuple[str, Any]] - ) -> Dict[str, Any]: - """Normalizes items to construct a dictionary with normalized keys. - - This routine is where the names become keys and are made the same - regardless of source - configuration files or environment. - """ - normalized = {} - for name, val in items: - key = section + "." + _normalize_name(name) - normalized[key] = val - return normalized - - def get_environ_vars(self) -> Iterable[Tuple[str, str]]: - """Returns a generator with all environmental vars with prefix PIP_""" - for key, val in os.environ.items(): - if key.startswith("PIP_"): - name = key[4:].lower() - if name not in ENV_NAMES_IGNORED: - yield name, val - - # XXX: This is patched in the tests. - def iter_config_files(self) -> Iterable[Tuple[Kind, List[str]]]: - """Yields variant and configuration files associated with it. - - This should be treated like items of a dictionary. The order - here doesn't affect what gets overridden. That is controlled - by OVERRIDE_ORDER. However this does control the order they are - displayed to the user. It's probably most ergononmic to display - things in the same order as OVERRIDE_ORDER - """ - # SMELL: Move the conditions out of this function - - env_config_file = os.environ.get("PIP_CONFIG_FILE", None) - config_files = get_configuration_files() - - yield kinds.GLOBAL, config_files[kinds.GLOBAL] - - # per-user config is not loaded when env_config_file exists - should_load_user_config = not self.isolated and not ( - env_config_file and os.path.exists(env_config_file) - ) - if should_load_user_config: - # The legacy config file is overridden by the new config file - yield kinds.USER, config_files[kinds.USER] - - # virtualenv config - yield kinds.SITE, config_files[kinds.SITE] - - if env_config_file is not None: - yield kinds.ENV, [env_config_file] - else: - yield kinds.ENV, [] - - def get_values_in_config(self, variant: Kind) -> Dict[str, Any]: - """Get values present in a config file""" - return self._config[variant] - - def _get_parser_to_modify(self) -> Tuple[str, RawConfigParser]: - # Determine which parser to modify - assert self.load_only - parsers = self._parsers[self.load_only] - if not parsers: - # This should not happen if everything works correctly. - raise ConfigurationError( - "Fatal Internal error [id=2]. Please report as a bug." - ) - - # Use the highest priority parser. - return parsers[-1] - - # XXX: This is patched in the tests. - def _mark_as_modified(self, fname: str, parser: RawConfigParser) -> None: - file_parser_tuple = (fname, parser) - if file_parser_tuple not in self._modified_parsers: - self._modified_parsers.append(file_parser_tuple) - - def __repr__(self) -> str: - return f"{self.__class__.__name__}({self._dictionary!r})" diff --git a/venv/lib/python3.12/site-packages/pip/_internal/distributions/__init__.py b/venv/lib/python3.12/site-packages/pip/_internal/distributions/__init__.py deleted file mode 100644 index 9a89a83..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/distributions/__init__.py +++ /dev/null @@ -1,21 +0,0 @@ -from pip._internal.distributions.base import AbstractDistribution -from pip._internal.distributions.sdist import SourceDistribution -from pip._internal.distributions.wheel import WheelDistribution -from pip._internal.req.req_install import InstallRequirement - - -def make_distribution_for_install_requirement( - install_req: InstallRequirement, -) -> AbstractDistribution: - """Returns a Distribution for the given InstallRequirement""" - # Editable requirements will always be source distributions. They use the - # legacy logic until we create a modern standard for them. - if install_req.editable: - return SourceDistribution(install_req) - - # If it's a wheel, it's a WheelDistribution - if install_req.is_wheel: - return WheelDistribution(install_req) - - # Otherwise, a SourceDistribution - return SourceDistribution(install_req) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 0146ab556bca4da12b46266d3c0da9ddaf2ddcdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 961 zcmaJ;F>ljA6uxU5+a*b>mM*9Qxk5s6tJo?G3{*g+E-Vb~fRx2@?APST*-q~+tx7vE z@E^*Ax*~oGOGE~cMI<C9wn**NiFYP}5KvFLd*6Ha?%nsj_pw&HL2yOyPTGwUA>Xw# zS;iP#>>xNJF^MTB32jiS@f@E^N{v#1OWa7xjdFnvZYEa4LR<zbHi7ONvGvAi*vGaz z|3jB_X}+@EluCq=+F@u}v!_^=Vtjco>xl?vqDwE@0DLC6{4A9!<a`$ndQ3n9smd$t zS1b^4kedQjPoxnY%g_cT7W+aWI3uUzrH;-lQBgXtSf}K}`2C*Fp0s3gjTW=5i94PB z{~9iR^>DY~C7sZjmgMYb!clE-TI>)~=U;WMk=qb66*f5tO(eIO432bbL>XO|3Qa_6 zzRuN&-_8>7lTgV+e<zE2x<S%cz@a6=q%IYUIw0zCc9ilgj6wML?V-<E)9)Uuc9uTy zHt+kADX4eDs1vq8`d!xb1C}ZfX~_L}YIf2O@Perz@Vdvjn}i(*rtbq(hY7{R^mHa8 z6E$R8(0+vAH5pZjee<)m`pH`Ty0~_}F<A8awl^}TqR#p1V6on}>z5{}-g(;@RMz{( z`UO5G&)xalL6Y8YlHN24=`}+MLJv1zyDm)@uZkXDoA;;r`R%{!p+pb&M6xjP&qC{a zA{I2R;&EkfC0X3#@K~&%s|P3V;V~*vN{3{7NS+SKlOfp}nG1B|%hKIZ3GKJ?t;;gn GqRvmCGz|Ix diff --git a/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/base.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/base.cpython-312.pyc deleted file mode 100644 index 3adb286529efc85591d5a58aef0e9118d669425e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2882 zcmb7G&2Jk;6rc51)=uKMAGA%<!q5g0Lt~eg1A+>XQb0Wr5ar|^HtU^nyv=%NJ2Ot| z&_jeO(H?q4y`fe}KvWL=0sIFXXaxeaPzeb*a5GIoRZqOP>villtzae3zL|Y*=6(F$ zZ~V>pc!9v<eDXo_+Z-Xk;UsyoJz=v6!d1cuGdxnmcgizbsancFIqjuenOY{2GhVip ztK}j&>y5O`nrV;}d5f^zMZ!inIlD92eCz$Cc_SUqYK4wb&i{#%g|ZQv?*!TvzU_fL z{;usT+e`dS*JoV9Lg|F9_(@l3>DJq*25UP{`AXZK_Z~mjb|r6dUprgp5R&grHopep zBM6C;n!!jd#f(~-rFe#=S*DS>L>dOmUL31sdG2g+aD!N8X>RiTBupA92rP4>r&23` z{+@01$3SyrKy&;NnkFx@JfC0%_@OT*8y&DJT_Wd=+K$ttJQnVruS4v%qX%<ff0iO- zp4K5X)bVVkXhTTaw0-8e{t|WL^w@QeQ(J1c0p_YwC{TFbZ*nTP@)ld#en&SSwghYZ z?s;NWy&Rj<Il9VetF1Jx!)H7}3(C0WvgP_P8Qz}yc8f>n!qKzfBN#ij|E#8tkdiyv z>%?xymcH=k+QE{v8LBB>?l}#oVt_%64MkU7-K2`^b}$sn;l6LSr$pjla{PmSx^l=k z+Elc4l08g^&6pcQGufo?!Yn$3(JF`#HnNrQF<r9l&uJHy7!NpL*mqp6%8yH)1I8M1 zNe3%TMg1(Khw}4*Q0NLAmH1%S#R}AbYn$2H-b#_%!1#U6SyU52SA|@La3VMBZP$Z! zK+-aoTZtMd;u80{j6G@l?zwjVJnTL6Ku{Or0XTIYD)V-SR3d-FG@vcaNhp@|7aYKC z|3Nmu-{uh*J~plr-T!nsb%9&~UP@ZdAQy}a#Ohmj$cC{{PKR054!8_W%W{2JTb9Ju zhxLr&UL%@>dCQ7g#Ih6~M(O(f)oN3;c(r9~wNgDPoHjCus%q|Wz+P)kX&19J$Hc1d z2>_$4u5f>)>bdo50G%TIW0e<<R+X#yTmpz{;09Ij0vZ9BtjY!$OI5K^D?vvh$*djN zuA?hS1p7fnJpseLb@GcjetG1Ux$k>(>Ze_ME@iHmoA7}+29CW4QxYW+2?<iz|CXfg zL!)f0{V-3HDmHCR<N8AH^$H3Qg_62}-YsUpdLzDvfRlg?y7^RtE(o6=MkRz8SYy!8 z&Widy>|x6RYPLlnkW~U`y0};gBoA!Kt--`u3C3s3i;K{oo(DTe#Nz<_b5_|f!d(kO zpK1kObPI6yhLl2X7;*x#p)eOz?tn2YMPXPy{97(tduH1*Jg7!-pK%!0$=xwBaqzq1 zp_}F*iPzizErT2bBe@#~tks}*lS^FpgB?o2T4h@|AE`f!JCDM!PJS;wJ>YGaYeZLS zI1z{FD&g74ZDGl2a%b6!mw~mElL7nW`49No3ap%o5-+E~T2A8-!5Q}h#PmvW;IXA% zJGyPakF_}r`zJ*z4i~As6UhN@A<GI2memrh?V&toS?Aie*ZVSJSxh*<AMoFZL~R<T z?Ya||?B4AgNC8BnI}&>>OhYrty(kqE1%PT(Fp2-AB>rWP7<8Da3*pHpQ5^5_ki$LC zvdV@m!D<A8*CL2Y6RmJS4pX1PaPK1dD^<#x-I-K&@6G*{E`j$~FaC|Mu1RwFAG4FU zvXk9ZHal}|_KRcJ=k5>?H`63H6)kp)k<#8<pr10bGdG`q<qm;2YV3<vy14<3Tz2Ny z(t&Ok-mpIPWOoE5lT1I=&7)Kxh2ou2kRtoLDUhO0h`fgXWqIt^h-}NF@(=_N=5!~3 zyCcrpL7>P=pCT&=$McmQe_Am*<E%{&D<&*ZK^l!R9PSv_0NRQw7mm!Ic>Qf~BJya1 z#NHtR+&7QMrGHi8ZG+69W?<;14a4}E6mFC0KgjXh<fYr>$lcs?#>}<TpP#vY<{tuL Gw9CK0y&@a{ diff --git a/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-312.pyc deleted file mode 100644 index 951cc52820d1236a839681b0b093a438ba72047b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1720 zcma)6&2Jl35P$pWwPVLdX##C&S)ov2q3nj{NQG2Xfyg0Lz-bR%t@l00+w520TZgRa zAwoI8iDPaEZdCnKxEOH&trV#e;=s+|a_NbgT|3xOK#b&hKhMnDdB2%??}t{aK|uU( zJ|FBVg#3zs=AzBObQi!Wp@d2yi6lpo5X+$)DUMQNB~&BL(Mqg_dQ@|25|POVglZ>* z>P&eG-$rqayw){-N7$7L<D)bSlGqCYU%A^88Tb6`UI1&*8=?p7t^1yT;O(>bgP1Z7 zhR%DQV2eRMer+zs3{39>I3<iY5+#mIB}ZW@m6^u$tKjL&R5?+f&Vrp9cnq+qC#qAY z8f(CrS7;4>GBx@Jt%JRp8{I~+{$VUKFAN!7Ji_S9k6Fr@U~wi)FE)dDkeODew;Bx- z<kLYQOqwuZ#z|(zj8TZrP1u@x+(X8uC(LZXOwJw+0}lQm?k7B|d;@TLA!i=V%g^-~ zi%ma?(qYD^RhkN&vuwy?Uz%~7FW7*o3hI>P<cYNR1XQ647WM^(nlB#PgCt@$q!Ner zy~H0z$i~iC$o9DxZHX-K4;bH~$!Bqxc+d>{ki~~~81(Ek&jv}nW4(Rb7D2|gW~_ys z2C3}^amF}w*`^Dv74~_NtTZn=y<rei7bgIcxB(sAy0p^P#ke*cUf`r2lV|O<DFCv> zT?RwReE{H;JSGn@<bpiJs0(sj+l7IjkH{C&|KIru>B@Vf4Qw&Y^AM&b|7Rk)a-l$T zi>82{ihjVT+sk<il2?7;NT|5F&oVb+nMb|Ma~JD2vM;a8ziwE=Pg|gl$uI4-uaCYu z`nkRNV|#Pl-X0sf<J-GGfo^Xv`;1Ng5}rfvm)EXnS7i@G5|*P_bo>GH58TR3St|B? z9Ii!KnmE1!F5U#yRrxC74OB0qdIglg-FQVR{x_;C!Ir3>7i6?^c@6$^6Q&Y1P{(A_ zB=uHFu-hsO*Nwf1xo**L-6)~M5OLFWA3^74o|@~@#0RsH@+4(E%Q><u6nLt52N2g$ zt)s$OEYx0-g!~%*N6uxgk{QPbs#FNX15hXA4_Va=IF!CRktOZQw{L#G^WD~;1mIMe z8z;J~y)l04ohgBJV(41yS?9(?gLR^lYd0q~L<YJ3+N6%CK^m*iR{&M1G1*?XUg%k# z2JwD%dJ}G^b$&ao#VHe34_;Z0O(|Yq4#R;svSv5jt>&X5y|ElPAK$7rCGX{0yfE%m r^?sM%f<*WXiJPD%iX=&A<oa*q?ismrMs}X->r!j{>h@m*){@ZQqg2mf diff --git a/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-312.pyc deleted file mode 100644 index e6b823a251833a6bcb96d8b2ba2618e8e44e943c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8508 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 P#)S)kk#7kW*be*;yb!ba diff --git a/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-312.pyc deleted file mode 100644 index 99671840aaaee973d14bcbb024fea3aa2ac7c134..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2268 zcmaJ?&2JM&6rWvt*J}sIPKgkZ0wbgfT!^ifOHdIK6{1qr22_eF`Oxj!GmaPb!_16B z>^2gra-h9%<W@m1Ey_PoPW%DAq)jEN6-Y=Ghu%y>RSBt5-<!3A9iV%deKY&!ef-|< zz5TgZED(5_-+kHsH%rJLxEVdxP}uq$gj<9WW&|WO>V|=`8JJ<Fp3!n9$c9$k(sDMi z!(2V5Wh-#Pd_5l)>V<HsK4lP-d_b7JMp%wp>zUMkeOJ$^<p0D?#Ymj<9p%T77l1s| z^rATOn_l4exf^*Qhr`)34XK3JRA+s7`;9KD!+G(7*Sz8_@pFE}xTs{3^823T<4Q^C zoF8!6lZuC*wK)%xJxg4<*HCoXn6+jaSh_mH&DI4FZV^uE1|xNo8TAa$GLu`}-UnY= zCd;g4*N4jW9DH%$EW4Ji=b6O|%;r;&^%OIi({flI&N1&oGNVHokF$UE6W$SA@<>VQ zQ5_#0kFQ!NP<TFV`;xMlOB%(BMw~P1MLh~vJD%_m7V63Lx}*RlZE!FncvA&E+KoDZ z7iU#%DzODuT@f{nVFIHU)@Tce0h#y6U1RYs)+j4^(2}T1pRd%~amZ_-r{r?&Y~1XI z7<NtZfG-IzoR`W6H)5W}*P<Zypft5*9xc}bzftS-R6CANRNr~GCVj={F(Rm-tabcO z&GjS21rVV&p1Q1QII5jqQf_qpfVs#8aNzo^fA}RRt2=dOA!v!jzD^#Oc5i_|CUUmn zK<8{jdbh||<T9%4crKee4qz*DA3}eO>i@Oznwtpajz`}#U))r=k-}?iyu$nXux_h{ z%5UE`)YP{8>O5W%&B)UF(91<q$@IVf2r4J3YI7QL<uOlrv?bzDpQQY3L2FScSqvIs zEP6miMpIG&i8aZPv*SF6+n%Cb2?X}laZO^ugPtEPQJ^k58#5h?Z5x7L?E;OFXeoQq zaR2R#Tp{0q`-;Y`i8f$efmTNx?C;e?fw%;RzFFo1+5yK4tJp~f%qOKFhN<IXQf|jn z?Ieqz1<nG201HH}Vu~`n5=)0E5im-{3?A*n!7_qsVz%^;Y2V{GR9~yS7i`G}EZ51P zK+3Z>SH4+!P&)E!>Bxq2X`^y!6V}p^-%Gpk!_C!iS2vu6je`rD&ccn=hvh@Jvp+a@ zoCkE_7rL-nK6%4>SbFO=|84&CPwM{4y_Nf`_f|LOKi(`YZa9l#H^yzZ^z=+hY2WxV z4)h>N%FQ-!UUAc7#yfJcxsyB-qe4uBIZ=Y8lGP}Q{dh2k%bT!Byp45B@j8$WEj|I& zHh}%w%b5M|g~R9p+X!&mMe;?RT&0*euKtU-Zc=dFFlJpSubb?0-K$+MzzV}I=ejIz zg5Y#S+~Gp?1ZI|G;BO<|07;->fiqv=v`DgzI1a=?++)7lm(EIH`{@P2kYB*EMxL4( z%YkCr(*x76W^W(;@x-0^zX*t1nbG0EcC7Qp#<BOd2nvH)+bTXT9~fBh9@u36!9fls zhs+%s<WVY+!t}E#kW%O9cM;OHRj&iQPvf71p;~oe_Oe)1(@6{8s_^>^q^5I1wZ>@d zRwu@8wE;g<frB$SJgJ6+Ss5DS&@uS;O@Y}nsW@tf6u%d(q*0ng?zwX+t<Gt23|!)H slSg40WDLW2MCP85lTXN*N95E$X4WvD5?G#1?>CAYdyoH3;H_c!4-SJ{Z~y=R diff --git a/venv/lib/python3.12/site-packages/pip/_internal/distributions/base.py b/venv/lib/python3.12/site-packages/pip/_internal/distributions/base.py deleted file mode 100644 index 6fb0d7b..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/distributions/base.py +++ /dev/null @@ -1,51 +0,0 @@ -import abc -from typing import Optional - -from pip._internal.index.package_finder import PackageFinder -from pip._internal.metadata.base import BaseDistribution -from pip._internal.req import InstallRequirement - - -class AbstractDistribution(metaclass=abc.ABCMeta): - """A base class for handling installable artifacts. - - The requirements for anything installable are as follows: - - - we must be able to determine the requirement name - (or we can't correctly handle the non-upgrade case). - - - for packages with setup requirements, we must also be able - to determine their requirements without installing additional - packages (for the same reason as run-time dependencies) - - - we must be able to create a Distribution object exposing the - above metadata. - - - if we need to do work in the build tracker, we must be able to generate a unique - string to identify the requirement in the build tracker. - """ - - def __init__(self, req: InstallRequirement) -> None: - super().__init__() - self.req = req - - @abc.abstractproperty - def build_tracker_id(self) -> Optional[str]: - """A string that uniquely identifies this requirement to the build tracker. - - If None, then this dist has no work to do in the build tracker, and - ``.prepare_distribution_metadata()`` will not be called.""" - raise NotImplementedError() - - @abc.abstractmethod - def get_metadata_distribution(self) -> BaseDistribution: - raise NotImplementedError() - - @abc.abstractmethod - def prepare_distribution_metadata( - self, - finder: PackageFinder, - build_isolation: bool, - check_build_deps: bool, - ) -> None: - raise NotImplementedError() diff --git a/venv/lib/python3.12/site-packages/pip/_internal/distributions/installed.py b/venv/lib/python3.12/site-packages/pip/_internal/distributions/installed.py deleted file mode 100644 index ab8d53b..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/distributions/installed.py +++ /dev/null @@ -1,29 +0,0 @@ -from typing import Optional - -from pip._internal.distributions.base import AbstractDistribution -from pip._internal.index.package_finder import PackageFinder -from pip._internal.metadata import BaseDistribution - - -class InstalledDistribution(AbstractDistribution): - """Represents an installed package. - - This does not need any preparation as the required information has already - been computed. - """ - - @property - def build_tracker_id(self) -> Optional[str]: - return None - - def get_metadata_distribution(self) -> BaseDistribution: - assert self.req.satisfied_by is not None, "not actually installed" - return self.req.satisfied_by - - def prepare_distribution_metadata( - self, - finder: PackageFinder, - build_isolation: bool, - check_build_deps: bool, - ) -> None: - pass diff --git a/venv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py b/venv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py deleted file mode 100644 index 15ff42b..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py +++ /dev/null @@ -1,156 +0,0 @@ -import logging -from typing import Iterable, Optional, Set, Tuple - -from pip._internal.build_env import BuildEnvironment -from pip._internal.distributions.base import AbstractDistribution -from pip._internal.exceptions import InstallationError -from pip._internal.index.package_finder import PackageFinder -from pip._internal.metadata import BaseDistribution -from pip._internal.utils.subprocess import runner_with_spinner_message - -logger = logging.getLogger(__name__) - - -class SourceDistribution(AbstractDistribution): - """Represents a source distribution. - - The preparation step for these needs metadata for the packages to be - generated, either using PEP 517 or using the legacy `setup.py egg_info`. - """ - - @property - def build_tracker_id(self) -> Optional[str]: - """Identify this requirement uniquely by its link.""" - assert self.req.link - return self.req.link.url_without_fragment - - def get_metadata_distribution(self) -> BaseDistribution: - return self.req.get_dist() - - def prepare_distribution_metadata( - self, - finder: PackageFinder, - build_isolation: bool, - check_build_deps: bool, - ) -> None: - # Load pyproject.toml, to determine whether PEP 517 is to be used - self.req.load_pyproject_toml() - - # Set up the build isolation, if this requirement should be isolated - should_isolate = self.req.use_pep517 and build_isolation - if should_isolate: - # Setup an isolated environment and install the build backend static - # requirements in it. - self._prepare_build_backend(finder) - # Check that if the requirement is editable, it either supports PEP 660 or - # has a setup.py or a setup.cfg. This cannot be done earlier because we need - # to setup the build backend to verify it supports build_editable, nor can - # it be done later, because we want to avoid installing build requirements - # needlessly. Doing it here also works around setuptools generating - # UNKNOWN.egg-info when running get_requires_for_build_wheel on a directory - # without setup.py nor setup.cfg. - self.req.isolated_editable_sanity_check() - # Install the dynamic build requirements. - self._install_build_reqs(finder) - # Check if the current environment provides build dependencies - should_check_deps = self.req.use_pep517 and check_build_deps - if should_check_deps: - pyproject_requires = self.req.pyproject_requires - assert pyproject_requires is not None - conflicting, missing = self.req.build_env.check_requirements( - pyproject_requires - ) - if conflicting: - self._raise_conflicts("the backend dependencies", conflicting) - if missing: - self._raise_missing_reqs(missing) - self.req.prepare_metadata() - - def _prepare_build_backend(self, finder: PackageFinder) -> None: - # Isolate in a BuildEnvironment and install the build-time - # requirements. - pyproject_requires = self.req.pyproject_requires - assert pyproject_requires is not None - - self.req.build_env = BuildEnvironment() - self.req.build_env.install_requirements( - finder, pyproject_requires, "overlay", kind="build dependencies" - ) - conflicting, missing = self.req.build_env.check_requirements( - self.req.requirements_to_check - ) - if conflicting: - self._raise_conflicts("PEP 517/518 supported requirements", conflicting) - if missing: - logger.warning( - "Missing build requirements in pyproject.toml for %s.", - self.req, - ) - logger.warning( - "The project does not specify a build backend, and " - "pip cannot fall back to setuptools without %s.", - " and ".join(map(repr, sorted(missing))), - ) - - def _get_build_requires_wheel(self) -> Iterable[str]: - with self.req.build_env: - runner = runner_with_spinner_message("Getting requirements to build wheel") - backend = self.req.pep517_backend - assert backend is not None - with backend.subprocess_runner(runner): - return backend.get_requires_for_build_wheel() - - def _get_build_requires_editable(self) -> Iterable[str]: - with self.req.build_env: - runner = runner_with_spinner_message( - "Getting requirements to build editable" - ) - backend = self.req.pep517_backend - assert backend is not None - with backend.subprocess_runner(runner): - return backend.get_requires_for_build_editable() - - def _install_build_reqs(self, finder: PackageFinder) -> None: - # Install any extra build dependencies that the backend requests. - # This must be done in a second pass, as the pyproject.toml - # dependencies must be installed before we can call the backend. - if ( - self.req.editable - and self.req.permit_editable_wheels - and self.req.supports_pyproject_editable() - ): - build_reqs = self._get_build_requires_editable() - else: - build_reqs = self._get_build_requires_wheel() - conflicting, missing = self.req.build_env.check_requirements(build_reqs) - if conflicting: - self._raise_conflicts("the backend dependencies", conflicting) - self.req.build_env.install_requirements( - finder, missing, "normal", kind="backend dependencies" - ) - - def _raise_conflicts( - self, conflicting_with: str, conflicting_reqs: Set[Tuple[str, str]] - ) -> None: - format_string = ( - "Some build dependencies for {requirement} " - "conflict with {conflicting_with}: {description}." - ) - error_message = format_string.format( - requirement=self.req, - conflicting_with=conflicting_with, - description=", ".join( - f"{installed} is incompatible with {wanted}" - for installed, wanted in sorted(conflicting_reqs) - ), - ) - raise InstallationError(error_message) - - def _raise_missing_reqs(self, missing: Set[str]) -> None: - format_string = ( - "Some build dependencies for {requirement} are missing: {missing}." - ) - error_message = format_string.format( - requirement=self.req, missing=", ".join(map(repr, sorted(missing))) - ) - raise InstallationError(error_message) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py b/venv/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py deleted file mode 100644 index eb16e25..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py +++ /dev/null @@ -1,40 +0,0 @@ -from typing import Optional - -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.distributions.base import AbstractDistribution -from pip._internal.index.package_finder import PackageFinder -from pip._internal.metadata import ( - BaseDistribution, - FilesystemWheel, - get_wheel_distribution, -) - - -class WheelDistribution(AbstractDistribution): - """Represents a wheel distribution. - - This does not need any preparation as wheels can be directly unpacked. - """ - - @property - def build_tracker_id(self) -> Optional[str]: - return None - - def get_metadata_distribution(self) -> BaseDistribution: - """Loads the metadata from the wheel file into memory and returns a - Distribution that uses it, not relying on the wheel file or - requirement. - """ - assert self.req.local_file_path, "Set as part of preparation during download" - assert self.req.name, "Wheels are never unnamed" - wheel = FilesystemWheel(self.req.local_file_path) - return get_wheel_distribution(wheel, canonicalize_name(self.req.name)) - - def prepare_distribution_metadata( - self, - finder: PackageFinder, - build_isolation: bool, - check_build_deps: bool, - ) -> None: - pass diff --git a/venv/lib/python3.12/site-packages/pip/_internal/exceptions.py b/venv/lib/python3.12/site-packages/pip/_internal/exceptions.py deleted file mode 100644 index 5007a62..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/exceptions.py +++ /dev/null @@ -1,728 +0,0 @@ -"""Exceptions used throughout package. - -This module MUST NOT try to import from anything within `pip._internal` to -operate. This is expected to be importable from any/all files within the -subpackage and, thus, should not depend on them. -""" - -import configparser -import contextlib -import locale -import logging -import pathlib -import re -import sys -from itertools import chain, groupby, repeat -from typing import TYPE_CHECKING, Dict, Iterator, List, Optional, Union - -from pip._vendor.requests.models import Request, Response -from pip._vendor.rich.console import Console, ConsoleOptions, RenderResult -from pip._vendor.rich.markup import escape -from pip._vendor.rich.text import Text - -if TYPE_CHECKING: - from hashlib import _Hash - from typing import Literal - - from pip._internal.metadata import BaseDistribution - from pip._internal.req.req_install import InstallRequirement - -logger = logging.getLogger(__name__) - - -# -# Scaffolding -# -def _is_kebab_case(s: str) -> bool: - return re.match(r"^[a-z]+(-[a-z]+)*$", s) is not None - - -def _prefix_with_indent( - s: Union[Text, str], - console: Console, - *, - prefix: str, - indent: str, -) -> Text: - if isinstance(s, Text): - text = s - else: - text = console.render_str(s) - - return console.render_str(prefix, overflow="ignore") + console.render_str( - f"\n{indent}", overflow="ignore" - ).join(text.split(allow_blank=True)) - - -class PipError(Exception): - """The base pip error.""" - - -class DiagnosticPipError(PipError): - """An error, that presents diagnostic information to the user. - - This contains a bunch of logic, to enable pretty presentation of our error - messages. Each error gets a unique reference. Each error can also include - additional context, a hint and/or a note -- which are presented with the - main error message in a consistent style. - - This is adapted from the error output styling in `sphinx-theme-builder`. - """ - - reference: str - - def __init__( - self, - *, - kind: 'Literal["error", "warning"]' = "error", - reference: Optional[str] = None, - message: Union[str, Text], - context: Optional[Union[str, Text]], - hint_stmt: Optional[Union[str, Text]], - note_stmt: Optional[Union[str, Text]] = None, - link: Optional[str] = None, - ) -> None: - # Ensure a proper reference is provided. - if reference is None: - assert hasattr(self, "reference"), "error reference not provided!" - reference = self.reference - assert _is_kebab_case(reference), "error reference must be kebab-case!" - - self.kind = kind - self.reference = reference - - self.message = message - self.context = context - - self.note_stmt = note_stmt - self.hint_stmt = hint_stmt - - self.link = link - - super().__init__(f"<{self.__class__.__name__}: {self.reference}>") - - def __repr__(self) -> str: - return ( - f"<{self.__class__.__name__}(" - f"reference={self.reference!r}, " - f"message={self.message!r}, " - f"context={self.context!r}, " - f"note_stmt={self.note_stmt!r}, " - f"hint_stmt={self.hint_stmt!r}" - ")>" - ) - - def __rich_console__( - self, - console: Console, - options: ConsoleOptions, - ) -> RenderResult: - colour = "red" if self.kind == "error" else "yellow" - - yield f"[{colour} bold]{self.kind}[/]: [bold]{self.reference}[/]" - yield "" - - if not options.ascii_only: - # Present the main message, with relevant context indented. - if self.context is not None: - yield _prefix_with_indent( - self.message, - console, - prefix=f"[{colour}]×[/] ", - indent=f"[{colour}]│[/] ", - ) - yield _prefix_with_indent( - self.context, - console, - prefix=f"[{colour}]╰─>[/] ", - indent=f"[{colour}] [/] ", - ) - else: - yield _prefix_with_indent( - self.message, - console, - prefix="[red]×[/] ", - indent=" ", - ) - else: - yield self.message - if self.context is not None: - yield "" - yield self.context - - if self.note_stmt is not None or self.hint_stmt is not None: - yield "" - - if self.note_stmt is not None: - yield _prefix_with_indent( - self.note_stmt, - console, - prefix="[magenta bold]note[/]: ", - indent=" ", - ) - if self.hint_stmt is not None: - yield _prefix_with_indent( - self.hint_stmt, - console, - prefix="[cyan bold]hint[/]: ", - indent=" ", - ) - - if self.link is not None: - yield "" - yield f"Link: {self.link}" - - -# -# Actual Errors -# -class ConfigurationError(PipError): - """General exception in configuration""" - - -class InstallationError(PipError): - """General exception during installation""" - - -class UninstallationError(PipError): - """General exception during uninstallation""" - - -class MissingPyProjectBuildRequires(DiagnosticPipError): - """Raised when pyproject.toml has `build-system`, but no `build-system.requires`.""" - - reference = "missing-pyproject-build-system-requires" - - def __init__(self, *, package: str) -> None: - super().__init__( - message=f"Can not process {escape(package)}", - context=Text( - "This package has an invalid pyproject.toml file.\n" - "The [build-system] table is missing the mandatory `requires` key." - ), - note_stmt="This is an issue with the package mentioned above, not pip.", - hint_stmt=Text("See PEP 518 for the detailed specification."), - ) - - -class InvalidPyProjectBuildRequires(DiagnosticPipError): - """Raised when pyproject.toml an invalid `build-system.requires`.""" - - reference = "invalid-pyproject-build-system-requires" - - def __init__(self, *, package: str, reason: str) -> None: - super().__init__( - message=f"Can not process {escape(package)}", - context=Text( - "This package has an invalid `build-system.requires` key in " - f"pyproject.toml.\n{reason}" - ), - note_stmt="This is an issue with the package mentioned above, not pip.", - hint_stmt=Text("See PEP 518 for the detailed specification."), - ) - - -class NoneMetadataError(PipError): - """Raised when accessing a Distribution's "METADATA" or "PKG-INFO". - - This signifies an inconsistency, when the Distribution claims to have - the metadata file (if not, raise ``FileNotFoundError`` instead), but is - not actually able to produce its content. This may be due to permission - errors. - """ - - def __init__( - self, - dist: "BaseDistribution", - metadata_name: str, - ) -> None: - """ - :param dist: A Distribution object. - :param metadata_name: The name of the metadata being accessed - (can be "METADATA" or "PKG-INFO"). - """ - self.dist = dist - self.metadata_name = metadata_name - - def __str__(self) -> str: - # Use `dist` in the error message because its stringification - # includes more information, like the version and location. - return f"None {self.metadata_name} metadata found for distribution: {self.dist}" - - -class UserInstallationInvalid(InstallationError): - """A --user install is requested on an environment without user site.""" - - def __str__(self) -> str: - return "User base directory is not specified" - - -class InvalidSchemeCombination(InstallationError): - def __str__(self) -> str: - before = ", ".join(str(a) for a in self.args[:-1]) - return f"Cannot set {before} and {self.args[-1]} together" - - -class DistributionNotFound(InstallationError): - """Raised when a distribution cannot be found to satisfy a requirement""" - - -class RequirementsFileParseError(InstallationError): - """Raised when a general error occurs parsing a requirements file line.""" - - -class BestVersionAlreadyInstalled(PipError): - """Raised when the most up-to-date version of a package is already - installed.""" - - -class BadCommand(PipError): - """Raised when virtualenv or a command is not found""" - - -class CommandError(PipError): - """Raised when there is an error in command-line arguments""" - - -class PreviousBuildDirError(PipError): - """Raised when there's a previous conflicting build directory""" - - -class NetworkConnectionError(PipError): - """HTTP connection error""" - - def __init__( - self, - error_msg: str, - response: Optional[Response] = None, - request: Optional[Request] = None, - ) -> None: - """ - Initialize NetworkConnectionError with `request` and `response` - objects. - """ - self.response = response - self.request = request - self.error_msg = error_msg - if ( - self.response is not None - and not self.request - and hasattr(response, "request") - ): - self.request = self.response.request - super().__init__(error_msg, response, request) - - def __str__(self) -> str: - return str(self.error_msg) - - -class InvalidWheelFilename(InstallationError): - """Invalid wheel filename.""" - - -class UnsupportedWheel(InstallationError): - """Unsupported wheel.""" - - -class InvalidWheel(InstallationError): - """Invalid (e.g. corrupt) wheel.""" - - def __init__(self, location: str, name: str): - self.location = location - self.name = name - - def __str__(self) -> str: - return f"Wheel '{self.name}' located at {self.location} is invalid." - - -class MetadataInconsistent(InstallationError): - """Built metadata contains inconsistent information. - - This is raised when the metadata contains values (e.g. name and version) - that do not match the information previously obtained from sdist filename, - user-supplied ``#egg=`` value, or an install requirement name. - """ - - def __init__( - self, ireq: "InstallRequirement", field: str, f_val: str, m_val: str - ) -> None: - self.ireq = ireq - self.field = field - self.f_val = f_val - self.m_val = m_val - - def __str__(self) -> str: - return ( - f"Requested {self.ireq} has inconsistent {self.field}: " - f"expected {self.f_val!r}, but metadata has {self.m_val!r}" - ) - - -class InstallationSubprocessError(DiagnosticPipError, InstallationError): - """A subprocess call failed.""" - - reference = "subprocess-exited-with-error" - - def __init__( - self, - *, - command_description: str, - exit_code: int, - output_lines: Optional[List[str]], - ) -> None: - if output_lines is None: - output_prompt = Text("See above for output.") - else: - output_prompt = ( - Text.from_markup(f"[red][{len(output_lines)} lines of output][/]\n") - + Text("".join(output_lines)) - + Text.from_markup(R"[red]\[end of output][/]") - ) - - super().__init__( - message=( - f"[green]{escape(command_description)}[/] did not run successfully.\n" - f"exit code: {exit_code}" - ), - context=output_prompt, - hint_stmt=None, - note_stmt=( - "This error originates from a subprocess, and is likely not a " - "problem with pip." - ), - ) - - self.command_description = command_description - self.exit_code = exit_code - - def __str__(self) -> str: - return f"{self.command_description} exited with {self.exit_code}" - - -class MetadataGenerationFailed(InstallationSubprocessError, InstallationError): - reference = "metadata-generation-failed" - - def __init__( - self, - *, - package_details: str, - ) -> None: - super(InstallationSubprocessError, self).__init__( - message="Encountered error while generating package metadata.", - context=escape(package_details), - hint_stmt="See above for details.", - note_stmt="This is an issue with the package mentioned above, not pip.", - ) - - def __str__(self) -> str: - return "metadata generation failed" - - -class HashErrors(InstallationError): - """Multiple HashError instances rolled into one for reporting""" - - def __init__(self) -> None: - self.errors: List["HashError"] = [] - - def append(self, error: "HashError") -> None: - self.errors.append(error) - - def __str__(self) -> str: - lines = [] - self.errors.sort(key=lambda e: e.order) - for cls, errors_of_cls in groupby(self.errors, lambda e: e.__class__): - lines.append(cls.head) - lines.extend(e.body() for e in errors_of_cls) - if lines: - return "\n".join(lines) - return "" - - def __bool__(self) -> bool: - return bool(self.errors) - - -class HashError(InstallationError): - """ - A failure to verify a package against known-good hashes - - :cvar order: An int sorting hash exception classes by difficulty of - recovery (lower being harder), so the user doesn't bother fretting - about unpinned packages when he has deeper issues, like VCS - dependencies, to deal with. Also keeps error reports in a - deterministic order. - :cvar head: A section heading for display above potentially many - exceptions of this kind - :ivar req: The InstallRequirement that triggered this error. This is - pasted on after the exception is instantiated, because it's not - typically available earlier. - - """ - - req: Optional["InstallRequirement"] = None - head = "" - order: int = -1 - - def body(self) -> str: - """Return a summary of me for display under the heading. - - This default implementation simply prints a description of the - triggering requirement. - - :param req: The InstallRequirement that provoked this error, with - its link already populated by the resolver's _populate_link(). - - """ - return f" {self._requirement_name()}" - - def __str__(self) -> str: - return f"{self.head}\n{self.body()}" - - def _requirement_name(self) -> str: - """Return a description of the requirement that triggered me. - - This default implementation returns long description of the req, with - line numbers - - """ - return str(self.req) if self.req else "unknown package" - - -class VcsHashUnsupported(HashError): - """A hash was provided for a version-control-system-based requirement, but - we don't have a method for hashing those.""" - - order = 0 - head = ( - "Can't verify hashes for these requirements because we don't " - "have a way to hash version control repositories:" - ) - - -class DirectoryUrlHashUnsupported(HashError): - """A hash was provided for a version-control-system-based requirement, but - we don't have a method for hashing those.""" - - order = 1 - head = ( - "Can't verify hashes for these file:// requirements because they " - "point to directories:" - ) - - -class HashMissing(HashError): - """A hash was needed for a requirement but is absent.""" - - order = 2 - head = ( - "Hashes are required in --require-hashes mode, but they are " - "missing from some requirements. Here is a list of those " - "requirements along with the hashes their downloaded archives " - "actually had. Add lines like these to your requirements files to " - "prevent tampering. (If you did not enable --require-hashes " - "manually, note that it turns on automatically when any package " - "has a hash.)" - ) - - def __init__(self, gotten_hash: str) -> None: - """ - :param gotten_hash: The hash of the (possibly malicious) archive we - just downloaded - """ - self.gotten_hash = gotten_hash - - def body(self) -> str: - # Dodge circular import. - from pip._internal.utils.hashes import FAVORITE_HASH - - package = None - if self.req: - # In the case of URL-based requirements, display the original URL - # seen in the requirements file rather than the package name, - # so the output can be directly copied into the requirements file. - package = ( - self.req.original_link - if self.req.is_direct - # In case someone feeds something downright stupid - # to InstallRequirement's constructor. - else getattr(self.req, "req", None) - ) - return " {} --hash={}:{}".format( - package or "unknown package", FAVORITE_HASH, self.gotten_hash - ) - - -class HashUnpinned(HashError): - """A requirement had a hash specified but was not pinned to a specific - version.""" - - order = 3 - head = ( - "In --require-hashes mode, all requirements must have their " - "versions pinned with ==. These do not:" - ) - - -class HashMismatch(HashError): - """ - Distribution file hash values don't match. - - :ivar package_name: The name of the package that triggered the hash - mismatch. Feel free to write to this after the exception is raise to - improve its error message. - - """ - - order = 4 - head = ( - "THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS " - "FILE. If you have updated the package versions, please update " - "the hashes. Otherwise, examine the package contents carefully; " - "someone may have tampered with them." - ) - - def __init__(self, allowed: Dict[str, List[str]], gots: Dict[str, "_Hash"]) -> None: - """ - :param allowed: A dict of algorithm names pointing to lists of allowed - hex digests - :param gots: A dict of algorithm names pointing to hashes we - actually got from the files under suspicion - """ - self.allowed = allowed - self.gots = gots - - def body(self) -> str: - return f" {self._requirement_name()}:\n{self._hash_comparison()}" - - def _hash_comparison(self) -> str: - """ - Return a comparison of actual and expected hash values. - - Example:: - - Expected sha256 abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde - or 123451234512345123451234512345123451234512345 - Got bcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdef - - """ - - def hash_then_or(hash_name: str) -> "chain[str]": - # For now, all the decent hashes have 6-char names, so we can get - # away with hard-coding space literals. - return chain([hash_name], repeat(" or")) - - lines: List[str] = [] - for hash_name, expecteds in self.allowed.items(): - prefix = hash_then_or(hash_name) - lines.extend((f" Expected {next(prefix)} {e}") for e in expecteds) - lines.append( - f" Got {self.gots[hash_name].hexdigest()}\n" - ) - return "\n".join(lines) - - -class UnsupportedPythonVersion(InstallationError): - """Unsupported python version according to Requires-Python package - metadata.""" - - -class ConfigurationFileCouldNotBeLoaded(ConfigurationError): - """When there are errors while loading a configuration file""" - - def __init__( - self, - reason: str = "could not be loaded", - fname: Optional[str] = None, - error: Optional[configparser.Error] = None, - ) -> None: - super().__init__(error) - self.reason = reason - self.fname = fname - self.error = error - - def __str__(self) -> str: - if self.fname is not None: - message_part = f" in {self.fname}." - else: - assert self.error is not None - message_part = f".\n{self.error}\n" - return f"Configuration file {self.reason}{message_part}" - - -_DEFAULT_EXTERNALLY_MANAGED_ERROR = f"""\ -The Python environment under {sys.prefix} is managed externally, and may not be -manipulated by the user. Please use specific tooling from the distributor of -the Python installation to interact with this environment instead. -""" - - -class ExternallyManagedEnvironment(DiagnosticPipError): - """The current environment is externally managed. - - This is raised when the current environment is externally managed, as - defined by `PEP 668`_. The ``EXTERNALLY-MANAGED`` configuration is checked - and displayed when the error is bubbled up to the user. - - :param error: The error message read from ``EXTERNALLY-MANAGED``. - """ - - reference = "externally-managed-environment" - - def __init__(self, error: Optional[str]) -> None: - if error is None: - context = Text(_DEFAULT_EXTERNALLY_MANAGED_ERROR) - else: - context = Text(error) - super().__init__( - message="This environment is externally managed", - context=context, - note_stmt=( - "If you believe this is a mistake, please contact your " - "Python installation or OS distribution provider. " - "You can override this, at the risk of breaking your Python " - "installation or OS, by passing --break-system-packages." - ), - hint_stmt=Text("See PEP 668 for the detailed specification."), - ) - - @staticmethod - def _iter_externally_managed_error_keys() -> Iterator[str]: - # LC_MESSAGES is in POSIX, but not the C standard. The most common - # platform that does not implement this category is Windows, where - # using other categories for console message localization is equally - # unreliable, so we fall back to the locale-less vendor message. This - # can always be re-evaluated when a vendor proposes a new alternative. - try: - category = locale.LC_MESSAGES - except AttributeError: - lang: Optional[str] = None - else: - lang, _ = locale.getlocale(category) - if lang is not None: - yield f"Error-{lang}" - for sep in ("-", "_"): - before, found, _ = lang.partition(sep) - if not found: - continue - yield f"Error-{before}" - yield "Error" - - @classmethod - def from_config( - cls, - config: Union[pathlib.Path, str], - ) -> "ExternallyManagedEnvironment": - parser = configparser.ConfigParser(interpolation=None) - try: - parser.read(config, encoding="utf-8") - section = parser["externally-managed"] - for key in cls._iter_externally_managed_error_keys(): - with contextlib.suppress(KeyError): - return cls(section[key]) - except KeyError: - pass - except (OSError, UnicodeDecodeError, configparser.ParsingError): - from pip._internal.utils._log import VERBOSE - - exc_info = logger.isEnabledFor(VERBOSE) - logger.warning("Failed to read %s", config, exc_info=exc_info) - return cls(None) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/index/__init__.py b/venv/lib/python3.12/site-packages/pip/_internal/index/__init__.py deleted file mode 100644 index 7a17b7b..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/index/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -"""Index interaction code -""" diff --git a/venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index c618a7f19bb7350fc0fef79a740b1a011d7cfe55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 252 zcmXv}J5EC}5VVtsM3GXbLupgItRO9-qM_jcG?uYfc~<<By?NxpLFni?3pb$U0*G{} zVn;B|&a5<=na|m5$_mu`YkOJlcNPEOf8;PJ<c(?e$a=mUyv*;t#{I&0!Xy=$;1?=r zoIWi1*H{Q0ln@{6P~FE2ZEy%qQtsd`sGUPk83-+Il5|ZbqqdkD9iF`nQe%P+eFxS& zLF}mwe!aT7hHMC%DAiVOFhevE#5vwe3#PUKQ67ebSjGN0xp6`7EZ(Mz(xJ}Cb>+{H NbN)Nve3V8-o&bP|Nwoj~ diff --git a/venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/collector.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/collector.cpython-312.pyc deleted file mode 100644 index 0df8600c2a6b9d2fa49addcba14aff15debc21a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21906 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 Yyp8Xl%g_@0Kk&qO-t#_3DFdee3!i(*KmY&$ diff --git a/venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-312.pyc deleted file mode 100644 index 5e7d4477da4438d43c11614101d96a34bea12dfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40755 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/sources.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/sources.cpython-312.pyc deleted file mode 100644 index 581aa36004a264285c1316f4dff417acc6fbb45a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12624 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 SZFto)oU@H=)gzN{<o^RarSW3` diff --git a/venv/lib/python3.12/site-packages/pip/_internal/index/collector.py b/venv/lib/python3.12/site-packages/pip/_internal/index/collector.py deleted file mode 100644 index 08c8bdd..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/index/collector.py +++ /dev/null @@ -1,507 +0,0 @@ -""" -The main purpose of this module is to expose LinkCollector.collect_sources(). -""" - -import collections -import email.message -import functools -import itertools -import json -import logging -import os -import urllib.parse -import urllib.request -from html.parser import HTMLParser -from optparse import Values -from typing import ( - TYPE_CHECKING, - Callable, - Dict, - Iterable, - List, - MutableMapping, - NamedTuple, - Optional, - Sequence, - Tuple, - Union, -) - -from pip._vendor import requests -from pip._vendor.requests import Response -from pip._vendor.requests.exceptions import RetryError, SSLError - -from pip._internal.exceptions import NetworkConnectionError -from pip._internal.models.link import Link -from pip._internal.models.search_scope import SearchScope -from pip._internal.network.session import PipSession -from pip._internal.network.utils import raise_for_status -from pip._internal.utils.filetypes import is_archive_file -from pip._internal.utils.misc import redact_auth_from_url -from pip._internal.vcs import vcs - -from .sources import CandidatesFromPage, LinkSource, build_source - -if TYPE_CHECKING: - from typing import Protocol -else: - Protocol = object - -logger = logging.getLogger(__name__) - -ResponseHeaders = MutableMapping[str, str] - - -def _match_vcs_scheme(url: str) -> Optional[str]: - """Look for VCS schemes in the URL. - - Returns the matched VCS scheme, or None if there's no match. - """ - for scheme in vcs.schemes: - if url.lower().startswith(scheme) and url[len(scheme)] in "+:": - return scheme - return None - - -class _NotAPIContent(Exception): - def __init__(self, content_type: str, request_desc: str) -> None: - super().__init__(content_type, request_desc) - self.content_type = content_type - self.request_desc = request_desc - - -def _ensure_api_header(response: Response) -> None: - """ - Check the Content-Type header to ensure the response contains a Simple - API Response. - - Raises `_NotAPIContent` if the content type is not a valid content-type. - """ - content_type = response.headers.get("Content-Type", "Unknown") - - content_type_l = content_type.lower() - if content_type_l.startswith( - ( - "text/html", - "application/vnd.pypi.simple.v1+html", - "application/vnd.pypi.simple.v1+json", - ) - ): - return - - raise _NotAPIContent(content_type, response.request.method) - - -class _NotHTTP(Exception): - pass - - -def _ensure_api_response(url: str, session: PipSession) -> None: - """ - Send a HEAD request to the URL, and ensure the response contains a simple - API Response. - - Raises `_NotHTTP` if the URL is not available for a HEAD request, or - `_NotAPIContent` if the content type is not a valid content type. - """ - scheme, netloc, path, query, fragment = urllib.parse.urlsplit(url) - if scheme not in {"http", "https"}: - raise _NotHTTP() - - resp = session.head(url, allow_redirects=True) - raise_for_status(resp) - - _ensure_api_header(resp) - - -def _get_simple_response(url: str, session: PipSession) -> Response: - """Access an Simple API response with GET, and return the response. - - This consists of three parts: - - 1. If the URL looks suspiciously like an archive, send a HEAD first to - check the Content-Type is HTML or Simple API, to avoid downloading a - large file. Raise `_NotHTTP` if the content type cannot be determined, or - `_NotAPIContent` if it is not HTML or a Simple API. - 2. Actually perform the request. Raise HTTP exceptions on network failures. - 3. Check the Content-Type header to make sure we got a Simple API response, - and raise `_NotAPIContent` otherwise. - """ - if is_archive_file(Link(url).filename): - _ensure_api_response(url, session=session) - - logger.debug("Getting page %s", redact_auth_from_url(url)) - - resp = session.get( - url, - headers={ - "Accept": ", ".join( - [ - "application/vnd.pypi.simple.v1+json", - "application/vnd.pypi.simple.v1+html; q=0.1", - "text/html; q=0.01", - ] - ), - # We don't want to blindly returned cached data for - # /simple/, because authors generally expecting that - # twine upload && pip install will function, but if - # they've done a pip install in the last ~10 minutes - # it won't. Thus by setting this to zero we will not - # blindly use any cached data, however the benefit of - # using max-age=0 instead of no-cache, is that we will - # still support conditional requests, so we will still - # minimize traffic sent in cases where the page hasn't - # changed at all, we will just always incur the round - # trip for the conditional GET now instead of only - # once per 10 minutes. - # For more information, please see pypa/pip#5670. - "Cache-Control": "max-age=0", - }, - ) - raise_for_status(resp) - - # The check for archives above only works if the url ends with - # something that looks like an archive. However that is not a - # requirement of an url. Unless we issue a HEAD request on every - # url we cannot know ahead of time for sure if something is a - # Simple API response or not. However we can check after we've - # downloaded it. - _ensure_api_header(resp) - - logger.debug( - "Fetched page %s as %s", - redact_auth_from_url(url), - resp.headers.get("Content-Type", "Unknown"), - ) - - return resp - - -def _get_encoding_from_headers(headers: ResponseHeaders) -> Optional[str]: - """Determine if we have any encoding information in our headers.""" - if headers and "Content-Type" in headers: - m = email.message.Message() - m["content-type"] = headers["Content-Type"] - charset = m.get_param("charset") - if charset: - return str(charset) - return None - - -class CacheablePageContent: - def __init__(self, page: "IndexContent") -> None: - assert page.cache_link_parsing - self.page = page - - def __eq__(self, other: object) -> bool: - return isinstance(other, type(self)) and self.page.url == other.page.url - - def __hash__(self) -> int: - return hash(self.page.url) - - -class ParseLinks(Protocol): - def __call__(self, page: "IndexContent") -> Iterable[Link]: - ... - - -def with_cached_index_content(fn: ParseLinks) -> ParseLinks: - """ - Given a function that parses an Iterable[Link] from an IndexContent, cache the - function's result (keyed by CacheablePageContent), unless the IndexContent - `page` has `page.cache_link_parsing == False`. - """ - - @functools.lru_cache(maxsize=None) - def wrapper(cacheable_page: CacheablePageContent) -> List[Link]: - return list(fn(cacheable_page.page)) - - @functools.wraps(fn) - def wrapper_wrapper(page: "IndexContent") -> List[Link]: - if page.cache_link_parsing: - return wrapper(CacheablePageContent(page)) - return list(fn(page)) - - return wrapper_wrapper - - -@with_cached_index_content -def parse_links(page: "IndexContent") -> Iterable[Link]: - """ - Parse a Simple API's Index Content, and yield its anchor elements as Link objects. - """ - - content_type_l = page.content_type.lower() - if content_type_l.startswith("application/vnd.pypi.simple.v1+json"): - data = json.loads(page.content) - for file in data.get("files", []): - link = Link.from_json(file, page.url) - if link is None: - continue - yield link - return - - parser = HTMLLinkParser(page.url) - encoding = page.encoding or "utf-8" - parser.feed(page.content.decode(encoding)) - - url = page.url - base_url = parser.base_url or url - for anchor in parser.anchors: - link = Link.from_element(anchor, page_url=url, base_url=base_url) - if link is None: - continue - yield link - - -class IndexContent: - """Represents one response (or page), along with its URL""" - - def __init__( - self, - content: bytes, - content_type: str, - encoding: Optional[str], - url: str, - cache_link_parsing: bool = True, - ) -> None: - """ - :param encoding: the encoding to decode the given content. - :param url: the URL from which the HTML was downloaded. - :param cache_link_parsing: whether links parsed from this page's url - should be cached. PyPI index urls should - have this set to False, for example. - """ - self.content = content - self.content_type = content_type - self.encoding = encoding - self.url = url - self.cache_link_parsing = cache_link_parsing - - def __str__(self) -> str: - return redact_auth_from_url(self.url) - - -class HTMLLinkParser(HTMLParser): - """ - HTMLParser that keeps the first base HREF and a list of all anchor - elements' attributes. - """ - - def __init__(self, url: str) -> None: - super().__init__(convert_charrefs=True) - - self.url: str = url - self.base_url: Optional[str] = None - self.anchors: List[Dict[str, Optional[str]]] = [] - - def handle_starttag(self, tag: str, attrs: List[Tuple[str, Optional[str]]]) -> None: - if tag == "base" and self.base_url is None: - href = self.get_href(attrs) - if href is not None: - self.base_url = href - elif tag == "a": - self.anchors.append(dict(attrs)) - - def get_href(self, attrs: List[Tuple[str, Optional[str]]]) -> Optional[str]: - for name, value in attrs: - if name == "href": - return value - return None - - -def _handle_get_simple_fail( - link: Link, - reason: Union[str, Exception], - meth: Optional[Callable[..., None]] = None, -) -> None: - if meth is None: - meth = logger.debug - meth("Could not fetch URL %s: %s - skipping", link, reason) - - -def _make_index_content( - response: Response, cache_link_parsing: bool = True -) -> IndexContent: - encoding = _get_encoding_from_headers(response.headers) - return IndexContent( - response.content, - response.headers["Content-Type"], - encoding=encoding, - url=response.url, - cache_link_parsing=cache_link_parsing, - ) - - -def _get_index_content(link: Link, *, session: PipSession) -> Optional["IndexContent"]: - url = link.url.split("#", 1)[0] - - # Check for VCS schemes that do not support lookup as web pages. - vcs_scheme = _match_vcs_scheme(url) - if vcs_scheme: - logger.warning( - "Cannot look at %s URL %s because it does not support lookup as web pages.", - vcs_scheme, - link, - ) - return None - - # Tack index.html onto file:// URLs that point to directories - scheme, _, path, _, _, _ = urllib.parse.urlparse(url) - if scheme == "file" and os.path.isdir(urllib.request.url2pathname(path)): - # add trailing slash if not present so urljoin doesn't trim - # final segment - if not url.endswith("/"): - url += "/" - # TODO: In the future, it would be nice if pip supported PEP 691 - # style responses in the file:// URLs, however there's no - # standard file extension for application/vnd.pypi.simple.v1+json - # so we'll need to come up with something on our own. - url = urllib.parse.urljoin(url, "index.html") - logger.debug(" file: URL is directory, getting %s", url) - - try: - resp = _get_simple_response(url, session=session) - except _NotHTTP: - logger.warning( - "Skipping page %s because it looks like an archive, and cannot " - "be checked by a HTTP HEAD request.", - link, - ) - except _NotAPIContent as exc: - logger.warning( - "Skipping page %s because the %s request got Content-Type: %s. " - "The only supported Content-Types are application/vnd.pypi.simple.v1+json, " - "application/vnd.pypi.simple.v1+html, and text/html", - link, - exc.request_desc, - exc.content_type, - ) - except NetworkConnectionError as exc: - _handle_get_simple_fail(link, exc) - except RetryError as exc: - _handle_get_simple_fail(link, exc) - except SSLError as exc: - reason = "There was a problem confirming the ssl certificate: " - reason += str(exc) - _handle_get_simple_fail(link, reason, meth=logger.info) - except requests.ConnectionError as exc: - _handle_get_simple_fail(link, f"connection error: {exc}") - except requests.Timeout: - _handle_get_simple_fail(link, "timed out") - else: - return _make_index_content(resp, cache_link_parsing=link.cache_link_parsing) - return None - - -class CollectedSources(NamedTuple): - find_links: Sequence[Optional[LinkSource]] - index_urls: Sequence[Optional[LinkSource]] - - -class LinkCollector: - - """ - Responsible for collecting Link objects from all configured locations, - making network requests as needed. - - The class's main method is its collect_sources() method. - """ - - def __init__( - self, - session: PipSession, - search_scope: SearchScope, - ) -> None: - self.search_scope = search_scope - self.session = session - - @classmethod - def create( - cls, - session: PipSession, - options: Values, - suppress_no_index: bool = False, - ) -> "LinkCollector": - """ - :param session: The Session to use to make requests. - :param suppress_no_index: Whether to ignore the --no-index option - when constructing the SearchScope object. - """ - index_urls = [options.index_url] + options.extra_index_urls - if options.no_index and not suppress_no_index: - logger.debug( - "Ignoring indexes: %s", - ",".join(redact_auth_from_url(url) for url in index_urls), - ) - index_urls = [] - - # Make sure find_links is a list before passing to create(). - find_links = options.find_links or [] - - search_scope = SearchScope.create( - find_links=find_links, - index_urls=index_urls, - no_index=options.no_index, - ) - link_collector = LinkCollector( - session=session, - search_scope=search_scope, - ) - return link_collector - - @property - def find_links(self) -> List[str]: - return self.search_scope.find_links - - def fetch_response(self, location: Link) -> Optional[IndexContent]: - """ - Fetch an HTML page containing package links. - """ - return _get_index_content(location, session=self.session) - - def collect_sources( - self, - project_name: str, - candidates_from_page: CandidatesFromPage, - ) -> CollectedSources: - # The OrderedDict calls deduplicate sources by URL. - index_url_sources = collections.OrderedDict( - build_source( - loc, - candidates_from_page=candidates_from_page, - page_validator=self.session.is_secure_origin, - expand_dir=False, - cache_link_parsing=False, - project_name=project_name, - ) - for loc in self.search_scope.get_index_urls_locations(project_name) - ).values() - find_links_sources = collections.OrderedDict( - build_source( - loc, - candidates_from_page=candidates_from_page, - page_validator=self.session.is_secure_origin, - expand_dir=True, - cache_link_parsing=True, - project_name=project_name, - ) - for loc in self.find_links - ).values() - - if logger.isEnabledFor(logging.DEBUG): - lines = [ - f"* {s.link}" - for s in itertools.chain(find_links_sources, index_url_sources) - if s is not None and s.link is not None - ] - lines = [ - f"{len(lines)} location(s) to search " - f"for versions of {project_name}:" - ] + lines - logger.debug("\n".join(lines)) - - return CollectedSources( - find_links=list(find_links_sources), - index_urls=list(index_url_sources), - ) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/index/package_finder.py b/venv/lib/python3.12/site-packages/pip/_internal/index/package_finder.py deleted file mode 100644 index ec9ebc3..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/index/package_finder.py +++ /dev/null @@ -1,1027 +0,0 @@ -"""Routines related to PyPI, indexes""" - -import enum -import functools -import itertools -import logging -import re -from typing import TYPE_CHECKING, FrozenSet, Iterable, List, Optional, Set, Tuple, Union - -from pip._vendor.packaging import specifiers -from pip._vendor.packaging.tags import Tag -from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.packaging.version import _BaseVersion -from pip._vendor.packaging.version import parse as parse_version - -from pip._internal.exceptions import ( - BestVersionAlreadyInstalled, - DistributionNotFound, - InvalidWheelFilename, - UnsupportedWheel, -) -from pip._internal.index.collector import LinkCollector, parse_links -from pip._internal.models.candidate import InstallationCandidate -from pip._internal.models.format_control import FormatControl -from pip._internal.models.link import Link -from pip._internal.models.search_scope import SearchScope -from pip._internal.models.selection_prefs import SelectionPreferences -from pip._internal.models.target_python import TargetPython -from pip._internal.models.wheel import Wheel -from pip._internal.req import InstallRequirement -from pip._internal.utils._log import getLogger -from pip._internal.utils.filetypes import WHEEL_EXTENSION -from pip._internal.utils.hashes import Hashes -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import build_netloc -from pip._internal.utils.packaging import check_requires_python -from pip._internal.utils.unpacking import SUPPORTED_EXTENSIONS - -if TYPE_CHECKING: - from pip._vendor.typing_extensions import TypeGuard - -__all__ = ["FormatControl", "BestCandidateResult", "PackageFinder"] - - -logger = getLogger(__name__) - -BuildTag = Union[Tuple[()], Tuple[int, str]] -CandidateSortingKey = Tuple[int, int, int, _BaseVersion, Optional[int], BuildTag] - - -def _check_link_requires_python( - link: Link, - version_info: Tuple[int, int, int], - ignore_requires_python: bool = False, -) -> bool: - """ - Return whether the given Python version is compatible with a link's - "Requires-Python" value. - - :param version_info: A 3-tuple of ints representing the Python - major-minor-micro version to check. - :param ignore_requires_python: Whether to ignore the "Requires-Python" - value if the given Python version isn't compatible. - """ - try: - is_compatible = check_requires_python( - link.requires_python, - version_info=version_info, - ) - except specifiers.InvalidSpecifier: - logger.debug( - "Ignoring invalid Requires-Python (%r) for link: %s", - link.requires_python, - link, - ) - else: - if not is_compatible: - version = ".".join(map(str, version_info)) - if not ignore_requires_python: - logger.verbose( - "Link requires a different Python (%s not in: %r): %s", - version, - link.requires_python, - link, - ) - return False - - logger.debug( - "Ignoring failed Requires-Python check (%s not in: %r) for link: %s", - version, - link.requires_python, - link, - ) - - return True - - -class LinkType(enum.Enum): - candidate = enum.auto() - different_project = enum.auto() - yanked = enum.auto() - format_unsupported = enum.auto() - format_invalid = enum.auto() - platform_mismatch = enum.auto() - requires_python_mismatch = enum.auto() - - -class LinkEvaluator: - - """ - Responsible for evaluating links for a particular project. - """ - - _py_version_re = re.compile(r"-py([123]\.?[0-9]?)$") - - # Don't include an allow_yanked default value to make sure each call - # site considers whether yanked releases are allowed. This also causes - # that decision to be made explicit in the calling code, which helps - # people when reading the code. - def __init__( - self, - project_name: str, - canonical_name: str, - formats: FrozenSet[str], - target_python: TargetPython, - allow_yanked: bool, - ignore_requires_python: Optional[bool] = None, - ) -> None: - """ - :param project_name: The user supplied package name. - :param canonical_name: The canonical package name. - :param formats: The formats allowed for this package. Should be a set - with 'binary' or 'source' or both in it. - :param target_python: The target Python interpreter to use when - evaluating link compatibility. This is used, for example, to - check wheel compatibility, as well as when checking the Python - version, e.g. the Python version embedded in a link filename - (or egg fragment) and against an HTML link's optional PEP 503 - "data-requires-python" attribute. - :param allow_yanked: Whether files marked as yanked (in the sense - of PEP 592) are permitted to be candidates for install. - :param ignore_requires_python: Whether to ignore incompatible - PEP 503 "data-requires-python" values in HTML links. Defaults - to False. - """ - if ignore_requires_python is None: - ignore_requires_python = False - - self._allow_yanked = allow_yanked - self._canonical_name = canonical_name - self._ignore_requires_python = ignore_requires_python - self._formats = formats - self._target_python = target_python - - self.project_name = project_name - - def evaluate_link(self, link: Link) -> Tuple[LinkType, str]: - """ - Determine whether a link is a candidate for installation. - - :return: A tuple (result, detail), where *result* is an enum - representing whether the evaluation found a candidate, or the reason - why one is not found. If a candidate is found, *detail* will be the - candidate's version string; if one is not found, it contains the - reason the link fails to qualify. - """ - version = None - if link.is_yanked and not self._allow_yanked: - reason = link.yanked_reason or "<none given>" - return (LinkType.yanked, f"yanked for reason: {reason}") - - if link.egg_fragment: - egg_info = link.egg_fragment - ext = link.ext - else: - egg_info, ext = link.splitext() - if not ext: - return (LinkType.format_unsupported, "not a file") - if ext not in SUPPORTED_EXTENSIONS: - return ( - LinkType.format_unsupported, - f"unsupported archive format: {ext}", - ) - if "binary" not in self._formats and ext == WHEEL_EXTENSION: - reason = f"No binaries permitted for {self.project_name}" - return (LinkType.format_unsupported, reason) - if "macosx10" in link.path and ext == ".zip": - return (LinkType.format_unsupported, "macosx10 one") - if ext == WHEEL_EXTENSION: - try: - wheel = Wheel(link.filename) - except InvalidWheelFilename: - return ( - LinkType.format_invalid, - "invalid wheel filename", - ) - if canonicalize_name(wheel.name) != self._canonical_name: - reason = f"wrong project name (not {self.project_name})" - return (LinkType.different_project, reason) - - supported_tags = self._target_python.get_unsorted_tags() - if not wheel.supported(supported_tags): - # Include the wheel's tags in the reason string to - # simplify troubleshooting compatibility issues. - file_tags = ", ".join(wheel.get_formatted_file_tags()) - reason = ( - f"none of the wheel's tags ({file_tags}) are compatible " - f"(run pip debug --verbose to show compatible tags)" - ) - return (LinkType.platform_mismatch, reason) - - version = wheel.version - - # This should be up by the self.ok_binary check, but see issue 2700. - if "source" not in self._formats and ext != WHEEL_EXTENSION: - reason = f"No sources permitted for {self.project_name}" - return (LinkType.format_unsupported, reason) - - if not version: - version = _extract_version_from_fragment( - egg_info, - self._canonical_name, - ) - if not version: - reason = f"Missing project version for {self.project_name}" - return (LinkType.format_invalid, reason) - - match = self._py_version_re.search(version) - if match: - version = version[: match.start()] - py_version = match.group(1) - if py_version != self._target_python.py_version: - return ( - LinkType.platform_mismatch, - "Python version is incorrect", - ) - - supports_python = _check_link_requires_python( - link, - version_info=self._target_python.py_version_info, - ignore_requires_python=self._ignore_requires_python, - ) - if not supports_python: - reason = f"{version} Requires-Python {link.requires_python}" - return (LinkType.requires_python_mismatch, reason) - - logger.debug("Found link %s, version: %s", link, version) - - return (LinkType.candidate, version) - - -def filter_unallowed_hashes( - candidates: List[InstallationCandidate], - hashes: Optional[Hashes], - project_name: str, -) -> List[InstallationCandidate]: - """ - Filter out candidates whose hashes aren't allowed, and return a new - list of candidates. - - If at least one candidate has an allowed hash, then all candidates with - either an allowed hash or no hash specified are returned. Otherwise, - the given candidates are returned. - - Including the candidates with no hash specified when there is a match - allows a warning to be logged if there is a more preferred candidate - with no hash specified. Returning all candidates in the case of no - matches lets pip report the hash of the candidate that would otherwise - have been installed (e.g. permitting the user to more easily update - their requirements file with the desired hash). - """ - if not hashes: - logger.debug( - "Given no hashes to check %s links for project %r: " - "discarding no candidates", - len(candidates), - project_name, - ) - # Make sure we're not returning back the given value. - return list(candidates) - - matches_or_no_digest = [] - # Collect the non-matches for logging purposes. - non_matches = [] - match_count = 0 - for candidate in candidates: - link = candidate.link - if not link.has_hash: - pass - elif link.is_hash_allowed(hashes=hashes): - match_count += 1 - else: - non_matches.append(candidate) - continue - - matches_or_no_digest.append(candidate) - - if match_count: - filtered = matches_or_no_digest - else: - # Make sure we're not returning back the given value. - filtered = list(candidates) - - if len(filtered) == len(candidates): - discard_message = "discarding no candidates" - else: - discard_message = "discarding {} non-matches:\n {}".format( - len(non_matches), - "\n ".join(str(candidate.link) for candidate in non_matches), - ) - - logger.debug( - "Checked %s links for project %r against %s hashes " - "(%s matches, %s no digest): %s", - len(candidates), - project_name, - hashes.digest_count, - match_count, - len(matches_or_no_digest) - match_count, - discard_message, - ) - - return filtered - - -class CandidatePreferences: - - """ - Encapsulates some of the preferences for filtering and sorting - InstallationCandidate objects. - """ - - def __init__( - self, - prefer_binary: bool = False, - allow_all_prereleases: bool = False, - ) -> None: - """ - :param allow_all_prereleases: Whether to allow all pre-releases. - """ - self.allow_all_prereleases = allow_all_prereleases - self.prefer_binary = prefer_binary - - -class BestCandidateResult: - """A collection of candidates, returned by `PackageFinder.find_best_candidate`. - - This class is only intended to be instantiated by CandidateEvaluator's - `compute_best_candidate()` method. - """ - - def __init__( - self, - candidates: List[InstallationCandidate], - applicable_candidates: List[InstallationCandidate], - best_candidate: Optional[InstallationCandidate], - ) -> None: - """ - :param candidates: A sequence of all available candidates found. - :param applicable_candidates: The applicable candidates. - :param best_candidate: The most preferred candidate found, or None - if no applicable candidates were found. - """ - assert set(applicable_candidates) <= set(candidates) - - if best_candidate is None: - assert not applicable_candidates - else: - assert best_candidate in applicable_candidates - - self._applicable_candidates = applicable_candidates - self._candidates = candidates - - self.best_candidate = best_candidate - - def iter_all(self) -> Iterable[InstallationCandidate]: - """Iterate through all candidates.""" - return iter(self._candidates) - - def iter_applicable(self) -> Iterable[InstallationCandidate]: - """Iterate through the applicable candidates.""" - return iter(self._applicable_candidates) - - -class CandidateEvaluator: - - """ - Responsible for filtering and sorting candidates for installation based - on what tags are valid. - """ - - @classmethod - def create( - cls, - project_name: str, - target_python: Optional[TargetPython] = None, - prefer_binary: bool = False, - allow_all_prereleases: bool = False, - specifier: Optional[specifiers.BaseSpecifier] = None, - hashes: Optional[Hashes] = None, - ) -> "CandidateEvaluator": - """Create a CandidateEvaluator object. - - :param target_python: The target Python interpreter to use when - checking compatibility. If None (the default), a TargetPython - object will be constructed from the running Python. - :param specifier: An optional object implementing `filter` - (e.g. `packaging.specifiers.SpecifierSet`) to filter applicable - versions. - :param hashes: An optional collection of allowed hashes. - """ - if target_python is None: - target_python = TargetPython() - if specifier is None: - specifier = specifiers.SpecifierSet() - - supported_tags = target_python.get_sorted_tags() - - return cls( - project_name=project_name, - supported_tags=supported_tags, - specifier=specifier, - prefer_binary=prefer_binary, - allow_all_prereleases=allow_all_prereleases, - hashes=hashes, - ) - - def __init__( - self, - project_name: str, - supported_tags: List[Tag], - specifier: specifiers.BaseSpecifier, - prefer_binary: bool = False, - allow_all_prereleases: bool = False, - hashes: Optional[Hashes] = None, - ) -> None: - """ - :param supported_tags: The PEP 425 tags supported by the target - Python in order of preference (most preferred first). - """ - self._allow_all_prereleases = allow_all_prereleases - self._hashes = hashes - self._prefer_binary = prefer_binary - self._project_name = project_name - self._specifier = specifier - self._supported_tags = supported_tags - # Since the index of the tag in the _supported_tags list is used - # as a priority, precompute a map from tag to index/priority to be - # used in wheel.find_most_preferred_tag. - self._wheel_tag_preferences = { - tag: idx for idx, tag in enumerate(supported_tags) - } - - def get_applicable_candidates( - self, - candidates: List[InstallationCandidate], - ) -> List[InstallationCandidate]: - """ - Return the applicable candidates from a list of candidates. - """ - # Using None infers from the specifier instead. - allow_prereleases = self._allow_all_prereleases or None - specifier = self._specifier - versions = { - str(v) - for v in specifier.filter( - # We turn the version object into a str here because otherwise - # when we're debundled but setuptools isn't, Python will see - # packaging.version.Version and - # pkg_resources._vendor.packaging.version.Version as different - # types. This way we'll use a str as a common data interchange - # format. If we stop using the pkg_resources provided specifier - # and start using our own, we can drop the cast to str(). - (str(c.version) for c in candidates), - prereleases=allow_prereleases, - ) - } - - # Again, converting version to str to deal with debundling. - applicable_candidates = [c for c in candidates if str(c.version) in versions] - - filtered_applicable_candidates = filter_unallowed_hashes( - candidates=applicable_candidates, - hashes=self._hashes, - project_name=self._project_name, - ) - - return sorted(filtered_applicable_candidates, key=self._sort_key) - - def _sort_key(self, candidate: InstallationCandidate) -> CandidateSortingKey: - """ - Function to pass as the `key` argument to a call to sorted() to sort - InstallationCandidates by preference. - - Returns a tuple such that tuples sorting as greater using Python's - default comparison operator are more preferred. - - The preference is as follows: - - First and foremost, candidates with allowed (matching) hashes are - always preferred over candidates without matching hashes. This is - because e.g. if the only candidate with an allowed hash is yanked, - we still want to use that candidate. - - Second, excepting hash considerations, candidates that have been - yanked (in the sense of PEP 592) are always less preferred than - candidates that haven't been yanked. Then: - - If not finding wheels, they are sorted by version only. - If finding wheels, then the sort order is by version, then: - 1. existing installs - 2. wheels ordered via Wheel.support_index_min(self._supported_tags) - 3. source archives - If prefer_binary was set, then all wheels are sorted above sources. - - Note: it was considered to embed this logic into the Link - comparison operators, but then different sdist links - with the same version, would have to be considered equal - """ - valid_tags = self._supported_tags - support_num = len(valid_tags) - build_tag: BuildTag = () - binary_preference = 0 - link = candidate.link - if link.is_wheel: - # can raise InvalidWheelFilename - wheel = Wheel(link.filename) - try: - pri = -( - wheel.find_most_preferred_tag( - valid_tags, self._wheel_tag_preferences - ) - ) - except ValueError: - raise UnsupportedWheel( - f"{wheel.filename} is not a supported wheel for this platform. It " - "can't be sorted." - ) - if self._prefer_binary: - binary_preference = 1 - if wheel.build_tag is not None: - match = re.match(r"^(\d+)(.*)$", wheel.build_tag) - assert match is not None, "guaranteed by filename validation" - build_tag_groups = match.groups() - build_tag = (int(build_tag_groups[0]), build_tag_groups[1]) - else: # sdist - pri = -(support_num) - has_allowed_hash = int(link.is_hash_allowed(self._hashes)) - yank_value = -1 * int(link.is_yanked) # -1 for yanked. - return ( - has_allowed_hash, - yank_value, - binary_preference, - candidate.version, - pri, - build_tag, - ) - - def sort_best_candidate( - self, - candidates: List[InstallationCandidate], - ) -> Optional[InstallationCandidate]: - """ - Return the best candidate per the instance's sort order, or None if - no candidate is acceptable. - """ - if not candidates: - return None - best_candidate = max(candidates, key=self._sort_key) - return best_candidate - - def compute_best_candidate( - self, - candidates: List[InstallationCandidate], - ) -> BestCandidateResult: - """ - Compute and return a `BestCandidateResult` instance. - """ - applicable_candidates = self.get_applicable_candidates(candidates) - - best_candidate = self.sort_best_candidate(applicable_candidates) - - return BestCandidateResult( - candidates, - applicable_candidates=applicable_candidates, - best_candidate=best_candidate, - ) - - -class PackageFinder: - """This finds packages. - - This is meant to match easy_install's technique for looking for - packages, by reading pages and looking for appropriate links. - """ - - def __init__( - self, - link_collector: LinkCollector, - target_python: TargetPython, - allow_yanked: bool, - format_control: Optional[FormatControl] = None, - candidate_prefs: Optional[CandidatePreferences] = None, - ignore_requires_python: Optional[bool] = None, - ) -> None: - """ - This constructor is primarily meant to be used by the create() class - method and from tests. - - :param format_control: A FormatControl object, used to control - the selection of source packages / binary packages when consulting - the index and links. - :param candidate_prefs: Options to use when creating a - CandidateEvaluator object. - """ - if candidate_prefs is None: - candidate_prefs = CandidatePreferences() - - format_control = format_control or FormatControl(set(), set()) - - self._allow_yanked = allow_yanked - self._candidate_prefs = candidate_prefs - self._ignore_requires_python = ignore_requires_python - self._link_collector = link_collector - self._target_python = target_python - - self.format_control = format_control - - # These are boring links that have already been logged somehow. - self._logged_links: Set[Tuple[Link, LinkType, str]] = set() - - # Don't include an allow_yanked default value to make sure each call - # site considers whether yanked releases are allowed. This also causes - # that decision to be made explicit in the calling code, which helps - # people when reading the code. - @classmethod - def create( - cls, - link_collector: LinkCollector, - selection_prefs: SelectionPreferences, - target_python: Optional[TargetPython] = None, - ) -> "PackageFinder": - """Create a PackageFinder. - - :param selection_prefs: The candidate selection preferences, as a - SelectionPreferences object. - :param target_python: The target Python interpreter to use when - checking compatibility. If None (the default), a TargetPython - object will be constructed from the running Python. - """ - if target_python is None: - target_python = TargetPython() - - candidate_prefs = CandidatePreferences( - prefer_binary=selection_prefs.prefer_binary, - allow_all_prereleases=selection_prefs.allow_all_prereleases, - ) - - return cls( - candidate_prefs=candidate_prefs, - link_collector=link_collector, - target_python=target_python, - allow_yanked=selection_prefs.allow_yanked, - format_control=selection_prefs.format_control, - ignore_requires_python=selection_prefs.ignore_requires_python, - ) - - @property - def target_python(self) -> TargetPython: - return self._target_python - - @property - def search_scope(self) -> SearchScope: - return self._link_collector.search_scope - - @search_scope.setter - def search_scope(self, search_scope: SearchScope) -> None: - self._link_collector.search_scope = search_scope - - @property - def find_links(self) -> List[str]: - return self._link_collector.find_links - - @property - def index_urls(self) -> List[str]: - return self.search_scope.index_urls - - @property - def trusted_hosts(self) -> Iterable[str]: - for host_port in self._link_collector.session.pip_trusted_origins: - yield build_netloc(*host_port) - - @property - def allow_all_prereleases(self) -> bool: - return self._candidate_prefs.allow_all_prereleases - - def set_allow_all_prereleases(self) -> None: - self._candidate_prefs.allow_all_prereleases = True - - @property - def prefer_binary(self) -> bool: - return self._candidate_prefs.prefer_binary - - def set_prefer_binary(self) -> None: - self._candidate_prefs.prefer_binary = True - - def requires_python_skipped_reasons(self) -> List[str]: - reasons = { - detail - for _, result, detail in self._logged_links - if result == LinkType.requires_python_mismatch - } - return sorted(reasons) - - def make_link_evaluator(self, project_name: str) -> LinkEvaluator: - canonical_name = canonicalize_name(project_name) - formats = self.format_control.get_allowed_formats(canonical_name) - - return LinkEvaluator( - project_name=project_name, - canonical_name=canonical_name, - formats=formats, - target_python=self._target_python, - allow_yanked=self._allow_yanked, - ignore_requires_python=self._ignore_requires_python, - ) - - def _sort_links(self, links: Iterable[Link]) -> List[Link]: - """ - Returns elements of links in order, non-egg links first, egg links - second, while eliminating duplicates - """ - eggs, no_eggs = [], [] - seen: Set[Link] = set() - for link in links: - if link not in seen: - seen.add(link) - if link.egg_fragment: - eggs.append(link) - else: - no_eggs.append(link) - return no_eggs + eggs - - def _log_skipped_link(self, link: Link, result: LinkType, detail: str) -> None: - entry = (link, result, detail) - if entry not in self._logged_links: - # Put the link at the end so the reason is more visible and because - # the link string is usually very long. - logger.debug("Skipping link: %s: %s", detail, link) - self._logged_links.add(entry) - - def get_install_candidate( - self, link_evaluator: LinkEvaluator, link: Link - ) -> Optional[InstallationCandidate]: - """ - If the link is a candidate for install, convert it to an - InstallationCandidate and return it. Otherwise, return None. - """ - result, detail = link_evaluator.evaluate_link(link) - if result != LinkType.candidate: - self._log_skipped_link(link, result, detail) - return None - - return InstallationCandidate( - name=link_evaluator.project_name, - link=link, - version=detail, - ) - - def evaluate_links( - self, link_evaluator: LinkEvaluator, links: Iterable[Link] - ) -> List[InstallationCandidate]: - """ - Convert links that are candidates to InstallationCandidate objects. - """ - candidates = [] - for link in self._sort_links(links): - candidate = self.get_install_candidate(link_evaluator, link) - if candidate is not None: - candidates.append(candidate) - - return candidates - - def process_project_url( - self, project_url: Link, link_evaluator: LinkEvaluator - ) -> List[InstallationCandidate]: - logger.debug( - "Fetching project page and analyzing links: %s", - project_url, - ) - index_response = self._link_collector.fetch_response(project_url) - if index_response is None: - return [] - - page_links = list(parse_links(index_response)) - - with indent_log(): - package_links = self.evaluate_links( - link_evaluator, - links=page_links, - ) - - return package_links - - @functools.lru_cache(maxsize=None) - def find_all_candidates(self, project_name: str) -> List[InstallationCandidate]: - """Find all available InstallationCandidate for project_name - - This checks index_urls and find_links. - All versions found are returned as an InstallationCandidate list. - - See LinkEvaluator.evaluate_link() for details on which files - are accepted. - """ - link_evaluator = self.make_link_evaluator(project_name) - - collected_sources = self._link_collector.collect_sources( - project_name=project_name, - candidates_from_page=functools.partial( - self.process_project_url, - link_evaluator=link_evaluator, - ), - ) - - page_candidates_it = itertools.chain.from_iterable( - source.page_candidates() - for sources in collected_sources - for source in sources - if source is not None - ) - page_candidates = list(page_candidates_it) - - file_links_it = itertools.chain.from_iterable( - source.file_links() - for sources in collected_sources - for source in sources - if source is not None - ) - file_candidates = self.evaluate_links( - link_evaluator, - sorted(file_links_it, reverse=True), - ) - - if logger.isEnabledFor(logging.DEBUG) and file_candidates: - paths = [] - for candidate in file_candidates: - assert candidate.link.url # we need to have a URL - try: - paths.append(candidate.link.file_path) - except Exception: - paths.append(candidate.link.url) # it's not a local file - - logger.debug("Local files found: %s", ", ".join(paths)) - - # This is an intentional priority ordering - return file_candidates + page_candidates - - def make_candidate_evaluator( - self, - project_name: str, - specifier: Optional[specifiers.BaseSpecifier] = None, - hashes: Optional[Hashes] = None, - ) -> CandidateEvaluator: - """Create a CandidateEvaluator object to use.""" - candidate_prefs = self._candidate_prefs - return CandidateEvaluator.create( - project_name=project_name, - target_python=self._target_python, - prefer_binary=candidate_prefs.prefer_binary, - allow_all_prereleases=candidate_prefs.allow_all_prereleases, - specifier=specifier, - hashes=hashes, - ) - - @functools.lru_cache(maxsize=None) - def find_best_candidate( - self, - project_name: str, - specifier: Optional[specifiers.BaseSpecifier] = None, - hashes: Optional[Hashes] = None, - ) -> BestCandidateResult: - """Find matches for the given project and specifier. - - :param specifier: An optional object implementing `filter` - (e.g. `packaging.specifiers.SpecifierSet`) to filter applicable - versions. - - :return: A `BestCandidateResult` instance. - """ - candidates = self.find_all_candidates(project_name) - candidate_evaluator = self.make_candidate_evaluator( - project_name=project_name, - specifier=specifier, - hashes=hashes, - ) - return candidate_evaluator.compute_best_candidate(candidates) - - def find_requirement( - self, req: InstallRequirement, upgrade: bool - ) -> Optional[InstallationCandidate]: - """Try to find a Link matching req - - Expects req, an InstallRequirement and upgrade, a boolean - Returns a InstallationCandidate if found, - Raises DistributionNotFound or BestVersionAlreadyInstalled otherwise - """ - hashes = req.hashes(trust_internet=False) - best_candidate_result = self.find_best_candidate( - req.name, - specifier=req.specifier, - hashes=hashes, - ) - best_candidate = best_candidate_result.best_candidate - - installed_version: Optional[_BaseVersion] = None - if req.satisfied_by is not None: - installed_version = req.satisfied_by.version - - def _format_versions(cand_iter: Iterable[InstallationCandidate]) -> str: - # This repeated parse_version and str() conversion is needed to - # handle different vendoring sources from pip and pkg_resources. - # If we stop using the pkg_resources provided specifier and start - # using our own, we can drop the cast to str(). - return ( - ", ".join( - sorted( - {str(c.version) for c in cand_iter}, - key=parse_version, - ) - ) - or "none" - ) - - if installed_version is None and best_candidate is None: - logger.critical( - "Could not find a version that satisfies the requirement %s " - "(from versions: %s)", - req, - _format_versions(best_candidate_result.iter_all()), - ) - - raise DistributionNotFound(f"No matching distribution found for {req}") - - def _should_install_candidate( - candidate: Optional[InstallationCandidate], - ) -> "TypeGuard[InstallationCandidate]": - if installed_version is None: - return True - if best_candidate is None: - return False - return best_candidate.version > installed_version - - if not upgrade and installed_version is not None: - if _should_install_candidate(best_candidate): - logger.debug( - "Existing installed version (%s) satisfies requirement " - "(most up-to-date version is %s)", - installed_version, - best_candidate.version, - ) - else: - logger.debug( - "Existing installed version (%s) is most up-to-date and " - "satisfies requirement", - installed_version, - ) - return None - - if _should_install_candidate(best_candidate): - logger.debug( - "Using version %s (newest of versions: %s)", - best_candidate.version, - _format_versions(best_candidate_result.iter_applicable()), - ) - return best_candidate - - # We have an existing version, and its the best version - logger.debug( - "Installed version (%s) is most up-to-date (past versions: %s)", - installed_version, - _format_versions(best_candidate_result.iter_applicable()), - ) - raise BestVersionAlreadyInstalled - - -def _find_name_version_sep(fragment: str, canonical_name: str) -> int: - """Find the separator's index based on the package's canonical name. - - :param fragment: A <package>+<version> filename "fragment" (stem) or - egg fragment. - :param canonical_name: The package's canonical name. - - This function is needed since the canonicalized name does not necessarily - have the same length as the egg info's name part. An example:: - - >>> fragment = 'foo__bar-1.0' - >>> canonical_name = 'foo-bar' - >>> _find_name_version_sep(fragment, canonical_name) - 8 - """ - # Project name and version must be separated by one single dash. Find all - # occurrences of dashes; if the string in front of it matches the canonical - # name, this is the one separating the name and version parts. - for i, c in enumerate(fragment): - if c != "-": - continue - if canonicalize_name(fragment[:i]) == canonical_name: - return i - raise ValueError(f"{fragment} does not match {canonical_name}") - - -def _extract_version_from_fragment(fragment: str, canonical_name: str) -> Optional[str]: - """Parse the version string from a <package>+<version> filename - "fragment" (stem) or egg fragment. - - :param fragment: The string to parse. E.g. foo-2.1 - :param canonical_name: The canonicalized name of the package this - belongs to. - """ - try: - version_start = _find_name_version_sep(fragment, canonical_name) + 1 - except ValueError: - return None - version = fragment[version_start:] - if not version: - return None - return version diff --git a/venv/lib/python3.12/site-packages/pip/_internal/index/sources.py b/venv/lib/python3.12/site-packages/pip/_internal/index/sources.py deleted file mode 100644 index f4626d7..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/index/sources.py +++ /dev/null @@ -1,285 +0,0 @@ -import logging -import mimetypes -import os -from collections import defaultdict -from typing import Callable, Dict, Iterable, List, Optional, Tuple - -from pip._vendor.packaging.utils import ( - InvalidSdistFilename, - InvalidVersion, - InvalidWheelFilename, - canonicalize_name, - parse_sdist_filename, - parse_wheel_filename, -) - -from pip._internal.models.candidate import InstallationCandidate -from pip._internal.models.link import Link -from pip._internal.utils.urls import path_to_url, url_to_path -from pip._internal.vcs import is_url - -logger = logging.getLogger(__name__) - -FoundCandidates = Iterable[InstallationCandidate] -FoundLinks = Iterable[Link] -CandidatesFromPage = Callable[[Link], Iterable[InstallationCandidate]] -PageValidator = Callable[[Link], bool] - - -class LinkSource: - @property - def link(self) -> Optional[Link]: - """Returns the underlying link, if there's one.""" - raise NotImplementedError() - - def page_candidates(self) -> FoundCandidates: - """Candidates found by parsing an archive listing HTML file.""" - raise NotImplementedError() - - def file_links(self) -> FoundLinks: - """Links found by specifying archives directly.""" - raise NotImplementedError() - - -def _is_html_file(file_url: str) -> bool: - return mimetypes.guess_type(file_url, strict=False)[0] == "text/html" - - -class _FlatDirectoryToUrls: - """Scans directory and caches results""" - - def __init__(self, path: str) -> None: - self._path = path - self._page_candidates: List[str] = [] - self._project_name_to_urls: Dict[str, List[str]] = defaultdict(list) - self._scanned_directory = False - - def _scan_directory(self) -> None: - """Scans directory once and populates both page_candidates - and project_name_to_urls at the same time - """ - for entry in os.scandir(self._path): - url = path_to_url(entry.path) - if _is_html_file(url): - self._page_candidates.append(url) - continue - - # File must have a valid wheel or sdist name, - # otherwise not worth considering as a package - try: - project_filename = parse_wheel_filename(entry.name)[0] - except (InvalidWheelFilename, InvalidVersion): - try: - project_filename = parse_sdist_filename(entry.name)[0] - except (InvalidSdistFilename, InvalidVersion): - continue - - self._project_name_to_urls[project_filename].append(url) - self._scanned_directory = True - - @property - def page_candidates(self) -> List[str]: - if not self._scanned_directory: - self._scan_directory() - - return self._page_candidates - - @property - def project_name_to_urls(self) -> Dict[str, List[str]]: - if not self._scanned_directory: - self._scan_directory() - - return self._project_name_to_urls - - -class _FlatDirectorySource(LinkSource): - """Link source specified by ``--find-links=<path-to-dir>``. - - This looks the content of the directory, and returns: - - * ``page_candidates``: Links listed on each HTML file in the directory. - * ``file_candidates``: Archives in the directory. - """ - - _paths_to_urls: Dict[str, _FlatDirectoryToUrls] = {} - - def __init__( - self, - candidates_from_page: CandidatesFromPage, - path: str, - project_name: str, - ) -> None: - self._candidates_from_page = candidates_from_page - self._project_name = canonicalize_name(project_name) - - # Get existing instance of _FlatDirectoryToUrls if it exists - if path in self._paths_to_urls: - self._path_to_urls = self._paths_to_urls[path] - else: - self._path_to_urls = _FlatDirectoryToUrls(path=path) - self._paths_to_urls[path] = self._path_to_urls - - @property - def link(self) -> Optional[Link]: - return None - - def page_candidates(self) -> FoundCandidates: - for url in self._path_to_urls.page_candidates: - yield from self._candidates_from_page(Link(url)) - - def file_links(self) -> FoundLinks: - for url in self._path_to_urls.project_name_to_urls[self._project_name]: - yield Link(url) - - -class _LocalFileSource(LinkSource): - """``--find-links=<path-or-url>`` or ``--[extra-]index-url=<path-or-url>``. - - If a URL is supplied, it must be a ``file:`` URL. If a path is supplied to - the option, it is converted to a URL first. This returns: - - * ``page_candidates``: Links listed on an HTML file. - * ``file_candidates``: The non-HTML file. - """ - - def __init__( - self, - candidates_from_page: CandidatesFromPage, - link: Link, - ) -> None: - self._candidates_from_page = candidates_from_page - self._link = link - - @property - def link(self) -> Optional[Link]: - return self._link - - def page_candidates(self) -> FoundCandidates: - if not _is_html_file(self._link.url): - return - yield from self._candidates_from_page(self._link) - - def file_links(self) -> FoundLinks: - if _is_html_file(self._link.url): - return - yield self._link - - -class _RemoteFileSource(LinkSource): - """``--find-links=<url>`` or ``--[extra-]index-url=<url>``. - - This returns: - - * ``page_candidates``: Links listed on an HTML file. - * ``file_candidates``: The non-HTML file. - """ - - def __init__( - self, - candidates_from_page: CandidatesFromPage, - page_validator: PageValidator, - link: Link, - ) -> None: - self._candidates_from_page = candidates_from_page - self._page_validator = page_validator - self._link = link - - @property - def link(self) -> Optional[Link]: - return self._link - - def page_candidates(self) -> FoundCandidates: - if not self._page_validator(self._link): - return - yield from self._candidates_from_page(self._link) - - def file_links(self) -> FoundLinks: - yield self._link - - -class _IndexDirectorySource(LinkSource): - """``--[extra-]index-url=<path-to-directory>``. - - This is treated like a remote URL; ``candidates_from_page`` contains logic - for this by appending ``index.html`` to the link. - """ - - def __init__( - self, - candidates_from_page: CandidatesFromPage, - link: Link, - ) -> None: - self._candidates_from_page = candidates_from_page - self._link = link - - @property - def link(self) -> Optional[Link]: - return self._link - - def page_candidates(self) -> FoundCandidates: - yield from self._candidates_from_page(self._link) - - def file_links(self) -> FoundLinks: - return () - - -def build_source( - location: str, - *, - candidates_from_page: CandidatesFromPage, - page_validator: PageValidator, - expand_dir: bool, - cache_link_parsing: bool, - project_name: str, -) -> Tuple[Optional[str], Optional[LinkSource]]: - path: Optional[str] = None - url: Optional[str] = None - if os.path.exists(location): # Is a local path. - url = path_to_url(location) - path = location - elif location.startswith("file:"): # A file: URL. - url = location - path = url_to_path(location) - elif is_url(location): - url = location - - if url is None: - msg = ( - "Location '%s' is ignored: " - "it is either a non-existing path or lacks a specific scheme." - ) - logger.warning(msg, location) - return (None, None) - - if path is None: - source: LinkSource = _RemoteFileSource( - candidates_from_page=candidates_from_page, - page_validator=page_validator, - link=Link(url, cache_link_parsing=cache_link_parsing), - ) - return (url, source) - - if os.path.isdir(path): - if expand_dir: - source = _FlatDirectorySource( - candidates_from_page=candidates_from_page, - path=path, - project_name=project_name, - ) - else: - source = _IndexDirectorySource( - candidates_from_page=candidates_from_page, - link=Link(url, cache_link_parsing=cache_link_parsing), - ) - return (url, source) - elif os.path.isfile(path): - source = _LocalFileSource( - candidates_from_page=candidates_from_page, - link=Link(url, cache_link_parsing=cache_link_parsing), - ) - return (url, source) - logger.warning( - "Location '%s' is ignored: it is neither a file nor a directory.", - location, - ) - return (url, None) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/locations/__init__.py b/venv/lib/python3.12/site-packages/pip/_internal/locations/__init__.py deleted file mode 100644 index d54bc63..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/locations/__init__.py +++ /dev/null @@ -1,467 +0,0 @@ -import functools -import logging -import os -import pathlib -import sys -import sysconfig -from typing import Any, Dict, Generator, Optional, Tuple - -from pip._internal.models.scheme import SCHEME_KEYS, Scheme -from pip._internal.utils.compat import WINDOWS -from pip._internal.utils.deprecation import deprecated -from pip._internal.utils.virtualenv import running_under_virtualenv - -from . import _sysconfig -from .base import ( - USER_CACHE_DIR, - get_major_minor_version, - get_src_prefix, - is_osx_framework, - site_packages, - user_site, -) - -__all__ = [ - "USER_CACHE_DIR", - "get_bin_prefix", - "get_bin_user", - "get_major_minor_version", - "get_platlib", - "get_purelib", - "get_scheme", - "get_src_prefix", - "site_packages", - "user_site", -] - - -logger = logging.getLogger(__name__) - - -_PLATLIBDIR: str = getattr(sys, "platlibdir", "lib") - -_USE_SYSCONFIG_DEFAULT = sys.version_info >= (3, 10) - - -def _should_use_sysconfig() -> bool: - """This function determines the value of _USE_SYSCONFIG. - - By default, pip uses sysconfig on Python 3.10+. - But Python distributors can override this decision by setting: - sysconfig._PIP_USE_SYSCONFIG = True / False - Rationale in https://github.com/pypa/pip/issues/10647 - - This is a function for testability, but should be constant during any one - run. - """ - return bool(getattr(sysconfig, "_PIP_USE_SYSCONFIG", _USE_SYSCONFIG_DEFAULT)) - - -_USE_SYSCONFIG = _should_use_sysconfig() - -if not _USE_SYSCONFIG: - # Import distutils lazily to avoid deprecation warnings, - # but import it soon enough that it is in memory and available during - # a pip reinstall. - from . import _distutils - -# Be noisy about incompatibilities if this platforms "should" be using -# sysconfig, but is explicitly opting out and using distutils instead. -if _USE_SYSCONFIG_DEFAULT and not _USE_SYSCONFIG: - _MISMATCH_LEVEL = logging.WARNING -else: - _MISMATCH_LEVEL = logging.DEBUG - - -def _looks_like_bpo_44860() -> bool: - """The resolution to bpo-44860 will change this incorrect platlib. - - See <https://bugs.python.org/issue44860>. - """ - from distutils.command.install import INSTALL_SCHEMES - - try: - unix_user_platlib = INSTALL_SCHEMES["unix_user"]["platlib"] - except KeyError: - return False - return unix_user_platlib == "$usersite" - - -def _looks_like_red_hat_patched_platlib_purelib(scheme: Dict[str, str]) -> bool: - platlib = scheme["platlib"] - if "/$platlibdir/" in platlib: - platlib = platlib.replace("/$platlibdir/", f"/{_PLATLIBDIR}/") - if "/lib64/" not in platlib: - return False - unpatched = platlib.replace("/lib64/", "/lib/") - return unpatched.replace("$platbase/", "$base/") == scheme["purelib"] - - -@functools.lru_cache(maxsize=None) -def _looks_like_red_hat_lib() -> bool: - """Red Hat patches platlib in unix_prefix and unix_home, but not purelib. - - This is the only way I can see to tell a Red Hat-patched Python. - """ - from distutils.command.install import INSTALL_SCHEMES - - return all( - k in INSTALL_SCHEMES - and _looks_like_red_hat_patched_platlib_purelib(INSTALL_SCHEMES[k]) - for k in ("unix_prefix", "unix_home") - ) - - -@functools.lru_cache(maxsize=None) -def _looks_like_debian_scheme() -> bool: - """Debian adds two additional schemes.""" - from distutils.command.install import INSTALL_SCHEMES - - return "deb_system" in INSTALL_SCHEMES and "unix_local" in INSTALL_SCHEMES - - -@functools.lru_cache(maxsize=None) -def _looks_like_red_hat_scheme() -> bool: - """Red Hat patches ``sys.prefix`` and ``sys.exec_prefix``. - - Red Hat's ``00251-change-user-install-location.patch`` changes the install - command's ``prefix`` and ``exec_prefix`` to append ``"/local"``. This is - (fortunately?) done quite unconditionally, so we create a default command - object without any configuration to detect this. - """ - from distutils.command.install import install - from distutils.dist import Distribution - - cmd: Any = install(Distribution()) - cmd.finalize_options() - return ( - cmd.exec_prefix == f"{os.path.normpath(sys.exec_prefix)}/local" - and cmd.prefix == f"{os.path.normpath(sys.prefix)}/local" - ) - - -@functools.lru_cache(maxsize=None) -def _looks_like_slackware_scheme() -> bool: - """Slackware patches sysconfig but fails to patch distutils and site. - - Slackware changes sysconfig's user scheme to use ``"lib64"`` for the lib - path, but does not do the same to the site module. - """ - if user_site is None: # User-site not available. - return False - try: - paths = sysconfig.get_paths(scheme="posix_user", expand=False) - except KeyError: # User-site not available. - return False - return "/lib64/" in paths["purelib"] and "/lib64/" not in user_site - - -@functools.lru_cache(maxsize=None) -def _looks_like_msys2_mingw_scheme() -> bool: - """MSYS2 patches distutils and sysconfig to use a UNIX-like scheme. - - However, MSYS2 incorrectly patches sysconfig ``nt`` scheme. The fix is - likely going to be included in their 3.10 release, so we ignore the warning. - See msys2/MINGW-packages#9319. - - MSYS2 MINGW's patch uses lowercase ``"lib"`` instead of the usual uppercase, - and is missing the final ``"site-packages"``. - """ - paths = sysconfig.get_paths("nt", expand=False) - return all( - "Lib" not in p and "lib" in p and not p.endswith("site-packages") - for p in (paths[key] for key in ("platlib", "purelib")) - ) - - -def _fix_abiflags(parts: Tuple[str]) -> Generator[str, None, None]: - ldversion = sysconfig.get_config_var("LDVERSION") - abiflags = getattr(sys, "abiflags", None) - - # LDVERSION does not end with sys.abiflags. Just return the path unchanged. - if not ldversion or not abiflags or not ldversion.endswith(abiflags): - yield from parts - return - - # Strip sys.abiflags from LDVERSION-based path components. - for part in parts: - if part.endswith(ldversion): - part = part[: (0 - len(abiflags))] - yield part - - -@functools.lru_cache(maxsize=None) -def _warn_mismatched(old: pathlib.Path, new: pathlib.Path, *, key: str) -> None: - issue_url = "https://github.com/pypa/pip/issues/10151" - message = ( - "Value for %s does not match. Please report this to <%s>" - "\ndistutils: %s" - "\nsysconfig: %s" - ) - logger.log(_MISMATCH_LEVEL, message, key, issue_url, old, new) - - -def _warn_if_mismatch(old: pathlib.Path, new: pathlib.Path, *, key: str) -> bool: - if old == new: - return False - _warn_mismatched(old, new, key=key) - return True - - -@functools.lru_cache(maxsize=None) -def _log_context( - *, - user: bool = False, - home: Optional[str] = None, - root: Optional[str] = None, - prefix: Optional[str] = None, -) -> None: - parts = [ - "Additional context:", - "user = %r", - "home = %r", - "root = %r", - "prefix = %r", - ] - - logger.log(_MISMATCH_LEVEL, "\n".join(parts), user, home, root, prefix) - - -def get_scheme( - dist_name: str, - user: bool = False, - home: Optional[str] = None, - root: Optional[str] = None, - isolated: bool = False, - prefix: Optional[str] = None, -) -> Scheme: - new = _sysconfig.get_scheme( - dist_name, - user=user, - home=home, - root=root, - isolated=isolated, - prefix=prefix, - ) - if _USE_SYSCONFIG: - return new - - old = _distutils.get_scheme( - dist_name, - user=user, - home=home, - root=root, - isolated=isolated, - prefix=prefix, - ) - - warning_contexts = [] - for k in SCHEME_KEYS: - old_v = pathlib.Path(getattr(old, k)) - new_v = pathlib.Path(getattr(new, k)) - - if old_v == new_v: - continue - - # distutils incorrectly put PyPy packages under ``site-packages/python`` - # in the ``posix_home`` scheme, but PyPy devs said they expect the - # directory name to be ``pypy`` instead. So we treat this as a bug fix - # and not warn about it. See bpo-43307 and python/cpython#24628. - skip_pypy_special_case = ( - sys.implementation.name == "pypy" - and home is not None - and k in ("platlib", "purelib") - and old_v.parent == new_v.parent - and old_v.name.startswith("python") - and new_v.name.startswith("pypy") - ) - if skip_pypy_special_case: - continue - - # sysconfig's ``osx_framework_user`` does not include ``pythonX.Y`` in - # the ``include`` value, but distutils's ``headers`` does. We'll let - # CPython decide whether this is a bug or feature. See bpo-43948. - skip_osx_framework_user_special_case = ( - user - and is_osx_framework() - and k == "headers" - and old_v.parent.parent == new_v.parent - and old_v.parent.name.startswith("python") - ) - if skip_osx_framework_user_special_case: - continue - - # On Red Hat and derived Linux distributions, distutils is patched to - # use "lib64" instead of "lib" for platlib. - if k == "platlib" and _looks_like_red_hat_lib(): - continue - - # On Python 3.9+, sysconfig's posix_user scheme sets platlib against - # sys.platlibdir, but distutils's unix_user incorrectly coninutes - # using the same $usersite for both platlib and purelib. This creates a - # mismatch when sys.platlibdir is not "lib". - skip_bpo_44860 = ( - user - and k == "platlib" - and not WINDOWS - and sys.version_info >= (3, 9) - and _PLATLIBDIR != "lib" - and _looks_like_bpo_44860() - ) - if skip_bpo_44860: - continue - - # Slackware incorrectly patches posix_user to use lib64 instead of lib, - # but not usersite to match the location. - skip_slackware_user_scheme = ( - user - and k in ("platlib", "purelib") - and not WINDOWS - and _looks_like_slackware_scheme() - ) - if skip_slackware_user_scheme: - continue - - # Both Debian and Red Hat patch Python to place the system site under - # /usr/local instead of /usr. Debian also places lib in dist-packages - # instead of site-packages, but the /usr/local check should cover it. - skip_linux_system_special_case = ( - not (user or home or prefix or running_under_virtualenv()) - and old_v.parts[1:3] == ("usr", "local") - and len(new_v.parts) > 1 - and new_v.parts[1] == "usr" - and (len(new_v.parts) < 3 or new_v.parts[2] != "local") - and (_looks_like_red_hat_scheme() or _looks_like_debian_scheme()) - ) - if skip_linux_system_special_case: - continue - - # On Python 3.7 and earlier, sysconfig does not include sys.abiflags in - # the "pythonX.Y" part of the path, but distutils does. - skip_sysconfig_abiflag_bug = ( - sys.version_info < (3, 8) - and not WINDOWS - and k in ("headers", "platlib", "purelib") - and tuple(_fix_abiflags(old_v.parts)) == new_v.parts - ) - if skip_sysconfig_abiflag_bug: - continue - - # MSYS2 MINGW's sysconfig patch does not include the "site-packages" - # part of the path. This is incorrect and will be fixed in MSYS. - skip_msys2_mingw_bug = ( - WINDOWS and k in ("platlib", "purelib") and _looks_like_msys2_mingw_scheme() - ) - if skip_msys2_mingw_bug: - continue - - # CPython's POSIX install script invokes pip (via ensurepip) against the - # interpreter located in the source tree, not the install site. This - # triggers special logic in sysconfig that's not present in distutils. - # https://github.com/python/cpython/blob/8c21941ddaf/Lib/sysconfig.py#L178-L194 - skip_cpython_build = ( - sysconfig.is_python_build(check_home=True) - and not WINDOWS - and k in ("headers", "include", "platinclude") - ) - if skip_cpython_build: - continue - - warning_contexts.append((old_v, new_v, f"scheme.{k}")) - - if not warning_contexts: - return old - - # Check if this path mismatch is caused by distutils config files. Those - # files will no longer work once we switch to sysconfig, so this raises a - # deprecation message for them. - default_old = _distutils.distutils_scheme( - dist_name, - user, - home, - root, - isolated, - prefix, - ignore_config_files=True, - ) - if any(default_old[k] != getattr(old, k) for k in SCHEME_KEYS): - deprecated( - reason=( - "Configuring installation scheme with distutils config files " - "is deprecated and will no longer work in the near future. If you " - "are using a Homebrew or Linuxbrew Python, please see discussion " - "at https://github.com/Homebrew/homebrew-core/issues/76621" - ), - replacement=None, - gone_in=None, - ) - return old - - # Post warnings about this mismatch so user can report them back. - for old_v, new_v, key in warning_contexts: - _warn_mismatched(old_v, new_v, key=key) - _log_context(user=user, home=home, root=root, prefix=prefix) - - return old - - -def get_bin_prefix() -> str: - new = _sysconfig.get_bin_prefix() - if _USE_SYSCONFIG: - return new - - old = _distutils.get_bin_prefix() - if _warn_if_mismatch(pathlib.Path(old), pathlib.Path(new), key="bin_prefix"): - _log_context() - return old - - -def get_bin_user() -> str: - return _sysconfig.get_scheme("", user=True).scripts - - -def _looks_like_deb_system_dist_packages(value: str) -> bool: - """Check if the value is Debian's APT-controlled dist-packages. - - Debian's ``distutils.sysconfig.get_python_lib()`` implementation returns the - default package path controlled by APT, but does not patch ``sysconfig`` to - do the same. This is similar to the bug worked around in ``get_scheme()``, - but here the default is ``deb_system`` instead of ``unix_local``. Ultimately - we can't do anything about this Debian bug, and this detection allows us to - skip the warning when needed. - """ - if not _looks_like_debian_scheme(): - return False - if value == "/usr/lib/python3/dist-packages": - return True - return False - - -def get_purelib() -> str: - """Return the default pure-Python lib location.""" - new = _sysconfig.get_purelib() - if _USE_SYSCONFIG: - return new - - old = _distutils.get_purelib() - if _looks_like_deb_system_dist_packages(old): - return old - if _warn_if_mismatch(pathlib.Path(old), pathlib.Path(new), key="purelib"): - _log_context() - return old - - -def get_platlib() -> str: - """Return the default platform-shared lib location.""" - new = _sysconfig.get_platlib() - if _USE_SYSCONFIG: - return new - - from . import _distutils - - old = _distutils.get_platlib() - if _looks_like_deb_system_dist_packages(old): - return old - if _warn_if_mismatch(pathlib.Path(old), pathlib.Path(new), key="platlib"): - _log_context() - return old diff --git a/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index b94c778e9a4017e958cdec19b208543a5c857a08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16796 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc deleted file mode 100644 index 66cfc305102f1ce8ccb75d13e715dec76a355f09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6876 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-312.pyc deleted file mode 100644 index 5a0358192e22a1a99cc269299dd74515dce7e189..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8031 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/base.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/base.cpython-312.pyc deleted file mode 100644 index 31561550a0a7e4d1452c93d0b5ee16eaeb835c45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3801 zcmbVPZ%iA>6`%F`|9>FFkmN4gaKe}v`$BRhO*y!PqzbJrTmxwuE0VkHj$w_x>&~t* zkf6}hsl}&LAyOrX`X`ARDOA@F`QA^B`mJA}j!LxQJ~gd${p23`aEkh&Z^mA52x_Do z;e9i2X5M@A=DpuM{u&5)5j5#{Hzxn<LFgZJU^QpGv;A`pp%rum$w=mMC{?3eieqD2 z%El<4;u*E4?2I~64xqN2Gw({dIJ$?=x$~ZshxP3_Z{C;kama?SC);MJ+@-SPbI?j# zDgbNj*(0@4<5za>tO?;TZjxR7FfF@rIAfDNpV(8)vKNPCAN(lKDf@xfQlAe%|A2?; zw`IE<rPlhN*IB89*pW@VK99rgzyzH^suQH3?5WpR$=n}9mW`nIFxVCT#J(f@$Sl`^ zaN9eGgg9zP@9Pp$2d|;e-YuaS{u(NAv8FHSl1nkpY#LT|L(JtwL($X=glGhqF0oLM z6{178jTBW?Q76(xRmLPetq`Lq=CC?#@&%<}x(Y>tbIQ0G&=mux3!*e7PGH@15^NNS zDm7Zd!+`#_=}}kUurilzoUiu{o5jr9t==yEB^pIB+Z^@^&@MA2f-#AOyqMKUPhL?q zB1~hV!)XL9!=|JnAy_qpk7kWY;EK8+3c5kyP;mh#CK624v6G3uV*+f3&WU%A)tGaR z8}o@9^D*9ZW;Bu)4U^Yrb<<y0kXF=;_6M|0t$V2_C$&6I!XkY-d0vx>dC;jR4V=Rh zM9lZ-h9XU2(j#jnHK&Q-%;Yq<F$vB~7MNwAxHn1N*kidd2`)~876TJi%q4T0#I8wC zj*B`@6lTrH1UAy_=xKKJblo!21SYk>Pd^Nw1yuDS|DnacrGfImZ%%F=KE84I__{B? zZjX}?%$sf%m(oPj4AWf@jY(C^V`=9WU;#~Gc60w`DQv*7*0PPO>O7g7>OzQ&H>}#{ z9<we>#xA|dSwXG~Z`chWv$x$uu)l84DEemmWt+?&Li<YD@1%Bi(vdgl^6j-0QA_Kv zbRFc*+vfS3yzHP*AUl~%2aK65^ZXm6@9zn|;S2#wzwBy|wa<Be4WRd1-m>gtF6I$` z2xiu^ENX>DR46INq!6`&CMpyNE?~e1IpJl=G@KC{Rx7#y7y*$xjpLAzFoZw+)1op> zfy59DP0;iNm7d6IirQt#jSH5>SS=k#Akj%l(Ls!2fJ_iUunws|1-aa)(NZUfs!Sn3 z6{ujk2nNhTqol=!(xf6yQeyxNq^Vf}z~TJJX!5F}LXrYXz~&D{Nf;TeA8V{``?v-; zS;DfAAzHo;D^VRV1$Kx;79gdGNM?a0E4ooMlpGkT$;BM5ox^k#G+mkbl7_$~)214P zUdBuA`dsrBbxH+*5DMTg3OQ$lx%a$7qAIAGAxM*=I)Me6sLVCg?-^x=+FjhUFA;N@ zHcdC}G?z^~b)@M~ba5P5)EA~#FXR+MCU7Z)rgqFunt>1s8m6Phr`Vy>+@)Ac!gR)0 zvw?vH5rD(i`~^A-=tVPfdw)^-S!p@?H&^>ssA;KGE-lTM=U0FHB-FXp(z?=jyKklc zcK<#1T34mz<huXl^H-UVPCV*ei&t9u*8P3YJ-($#IkJ5I)1zB$hwi%WxHj9mH`=<_ zPFLDal>>{d%l4<f&@xx<Tb4f^eA*IO<yLLWrx(v#if@*0u3o$+S3<|v-N#=zQAl_i z6dp7`jNFgh^HdSnJ;cE`FvM;1e8^ixyvNJXP=dqkG<tf5d_SonUp;FPvL0WO{QvLO zemG~iE%{kiHd&(@m3L5V9;qii=o`qV7PFT1TfJRsS>CAU4LWF0>}j`<g%hKw0~tYU z8j6rM4jDVBl%-*_r^z;JFNdHk8QdvL_)GA>5^3)JF?i84S`HpbVOA>&BEbTl!4jkr z<S;ynwak-PUI;l2vVsWXbPH4|iI|r-KqH}WN@#qNx9Equ!gSVB#&p8NDV1c?H8RSI z9@CCz6axyMah>K06h2-sBwbsr(_616K#;z;yHg|vQ+@E$i||=MTdt!|T;JMijjUX~ zeRbvf?duOZ9(LdFUc;5vQ)O?}Y4`ky+iE|2H*zO(_sE?i55^xV_m$sIJ$kRw{+-3| zzX&3KaH+4{w=`HDTs>3qb*|exzkU%w;mB9W23w!|LrWLS7uQ?I{_ek0bx_tzoxb&d z>OJR2kNt0->){{AIry5Mq7L;MEhlI}mltPrWe&d*+tf)cwg;fIf{dNmHg@BO#{ZrM zaZ_JuQCg8*GD9C-8@o7i>3f&Yet6;P$mJhE)np&nw4CXInn}{sj51*|@74P0X^{{b zHZ19C=n_`+w5HFbGf*($l18S;30N=!Kb>CY0($NX{mQc$?%D`<t;fz(!r!g<`q%CK zOhoK0(~~Kxk^wq(cKN2A9-m!2Ny2{9Y0MTNg3LAup~OyImB2F+F3|c{XHaOiygJPQ zoKR1gZ|^gc*sY0K+?he<c}bKeaT=;<Gk9h6!sYbP*`bRU(&vXSn{FCHG|C9Y0f=~m zn4xr9Q~~2_^<6s63OEL^EW*qd*h9tA16kD}q5p4~?h$6Xm@|WC4S2}Liw3TRw1?>( z9Ui-2dUB+gW)>0pPY84C9_PPw_t)O20dfwO&@0ye1)nO<aoiRPKSQ2p$oC9+pV5Bc zpXl3Ppy(H9sOm(`UCWWprszgfbj?v|N-P9{cd%>u+GcBXqcytbskHVk1QzuQ>a98* zT+h9hZ3LtmZs)wK9aRKmt%Z?CFax9N=>Qj9<+l-#s^H*`g1qS9J$bWpV54)O()q!{ z@Z$8+t@5o^eIwLSv3~&Nt*v#TeUm$|!5vr~d%_*7+Bok0)px!^K(={g>-Z04d|mY+ p_d&`$`ZRoCC3rjd@i0B#(U&@X{Qey8I2T8c<4r?|e>}*+_kYpZa3TNz diff --git a/venv/lib/python3.12/site-packages/pip/_internal/locations/_distutils.py b/venv/lib/python3.12/site-packages/pip/_internal/locations/_distutils.py deleted file mode 100644 index 0e18c6e..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/locations/_distutils.py +++ /dev/null @@ -1,172 +0,0 @@ -"""Locations where we look for configs, install stuff, etc""" - -# The following comment should be removed at some point in the future. -# mypy: strict-optional=False - -# If pip's going to use distutils, it should not be using the copy that setuptools -# might have injected into the environment. This is done by removing the injected -# shim, if it's injected. -# -# See https://github.com/pypa/pip/issues/8761 for the original discussion and -# rationale for why this is done within pip. -try: - __import__("_distutils_hack").remove_shim() -except (ImportError, AttributeError): - pass - -import logging -import os -import sys -from distutils.cmd import Command as DistutilsCommand -from distutils.command.install import SCHEME_KEYS -from distutils.command.install import install as distutils_install_command -from distutils.sysconfig import get_python_lib -from typing import Dict, List, Optional, Union, cast - -from pip._internal.models.scheme import Scheme -from pip._internal.utils.compat import WINDOWS -from pip._internal.utils.virtualenv import running_under_virtualenv - -from .base import get_major_minor_version - -logger = logging.getLogger(__name__) - - -def distutils_scheme( - dist_name: str, - user: bool = False, - home: Optional[str] = None, - root: Optional[str] = None, - isolated: bool = False, - prefix: Optional[str] = None, - *, - ignore_config_files: bool = False, -) -> Dict[str, str]: - """ - Return a distutils install scheme - """ - from distutils.dist import Distribution - - dist_args: Dict[str, Union[str, List[str]]] = {"name": dist_name} - if isolated: - dist_args["script_args"] = ["--no-user-cfg"] - - d = Distribution(dist_args) - if not ignore_config_files: - try: - d.parse_config_files() - except UnicodeDecodeError: - paths = d.find_config_files() - logger.warning( - "Ignore distutils configs in %s due to encoding errors.", - ", ".join(os.path.basename(p) for p in paths), - ) - obj: Optional[DistutilsCommand] = None - obj = d.get_command_obj("install", create=True) - assert obj is not None - i = cast(distutils_install_command, obj) - # NOTE: setting user or home has the side-effect of creating the home dir - # or user base for installations during finalize_options() - # ideally, we'd prefer a scheme class that has no side-effects. - assert not (user and prefix), f"user={user} prefix={prefix}" - assert not (home and prefix), f"home={home} prefix={prefix}" - i.user = user or i.user - if user or home: - i.prefix = "" - i.prefix = prefix or i.prefix - i.home = home or i.home - i.root = root or i.root - i.finalize_options() - - scheme = {} - for key in SCHEME_KEYS: - scheme[key] = getattr(i, "install_" + key) - - # install_lib specified in setup.cfg should install *everything* - # into there (i.e. it takes precedence over both purelib and - # platlib). Note, i.install_lib is *always* set after - # finalize_options(); we only want to override here if the user - # has explicitly requested it hence going back to the config - if "install_lib" in d.get_option_dict("install"): - scheme.update({"purelib": i.install_lib, "platlib": i.install_lib}) - - if running_under_virtualenv(): - if home: - prefix = home - elif user: - prefix = i.install_userbase - else: - prefix = i.prefix - scheme["headers"] = os.path.join( - prefix, - "include", - "site", - f"python{get_major_minor_version()}", - dist_name, - ) - - if root is not None: - path_no_drive = os.path.splitdrive(os.path.abspath(scheme["headers"]))[1] - scheme["headers"] = os.path.join(root, path_no_drive[1:]) - - return scheme - - -def get_scheme( - dist_name: str, - user: bool = False, - home: Optional[str] = None, - root: Optional[str] = None, - isolated: bool = False, - prefix: Optional[str] = None, -) -> Scheme: - """ - Get the "scheme" corresponding to the input parameters. The distutils - documentation provides the context for the available schemes: - https://docs.python.org/3/install/index.html#alternate-installation - - :param dist_name: the name of the package to retrieve the scheme for, used - in the headers scheme path - :param user: indicates to use the "user" scheme - :param home: indicates to use the "home" scheme and provides the base - directory for the same - :param root: root under which other directories are re-based - :param isolated: equivalent to --no-user-cfg, i.e. do not consider - ~/.pydistutils.cfg (posix) or ~/pydistutils.cfg (non-posix) for - scheme paths - :param prefix: indicates to use the "prefix" scheme and provides the - base directory for the same - """ - scheme = distutils_scheme(dist_name, user, home, root, isolated, prefix) - return Scheme( - platlib=scheme["platlib"], - purelib=scheme["purelib"], - headers=scheme["headers"], - scripts=scheme["scripts"], - data=scheme["data"], - ) - - -def get_bin_prefix() -> str: - # XXX: In old virtualenv versions, sys.prefix can contain '..' components, - # so we need to call normpath to eliminate them. - prefix = os.path.normpath(sys.prefix) - if WINDOWS: - bin_py = os.path.join(prefix, "Scripts") - # buildout uses 'bin' on Windows too? - if not os.path.exists(bin_py): - bin_py = os.path.join(prefix, "bin") - return bin_py - # Forcing to use /usr/local/bin for standard macOS framework installs - # Also log to ~/Library/Logs/ for use with the Console.app log viewer - if sys.platform[:6] == "darwin" and prefix[:16] == "/System/Library/": - return "/usr/local/bin" - return os.path.join(prefix, "bin") - - -def get_purelib() -> str: - return get_python_lib(plat_specific=False) - - -def get_platlib() -> str: - return get_python_lib(plat_specific=True) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/locations/_sysconfig.py b/venv/lib/python3.12/site-packages/pip/_internal/locations/_sysconfig.py deleted file mode 100644 index 97aef1f..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/locations/_sysconfig.py +++ /dev/null @@ -1,213 +0,0 @@ -import logging -import os -import sys -import sysconfig -import typing - -from pip._internal.exceptions import InvalidSchemeCombination, UserInstallationInvalid -from pip._internal.models.scheme import SCHEME_KEYS, Scheme -from pip._internal.utils.virtualenv import running_under_virtualenv - -from .base import change_root, get_major_minor_version, is_osx_framework - -logger = logging.getLogger(__name__) - - -# Notes on _infer_* functions. -# Unfortunately ``get_default_scheme()`` didn't exist before 3.10, so there's no -# way to ask things like "what is the '_prefix' scheme on this platform". These -# functions try to answer that with some heuristics while accounting for ad-hoc -# platforms not covered by CPython's default sysconfig implementation. If the -# ad-hoc implementation does not fully implement sysconfig, we'll fall back to -# a POSIX scheme. - -_AVAILABLE_SCHEMES = set(sysconfig.get_scheme_names()) - -_PREFERRED_SCHEME_API = getattr(sysconfig, "get_preferred_scheme", None) - - -def _should_use_osx_framework_prefix() -> bool: - """Check for Apple's ``osx_framework_library`` scheme. - - Python distributed by Apple's Command Line Tools has this special scheme - that's used when: - - * This is a framework build. - * We are installing into the system prefix. - - This does not account for ``pip install --prefix`` (also means we're not - installing to the system prefix), which should use ``posix_prefix``, but - logic here means ``_infer_prefix()`` outputs ``osx_framework_library``. But - since ``prefix`` is not available for ``sysconfig.get_default_scheme()``, - which is the stdlib replacement for ``_infer_prefix()``, presumably Apple - wouldn't be able to magically switch between ``osx_framework_library`` and - ``posix_prefix``. ``_infer_prefix()`` returning ``osx_framework_library`` - means its behavior is consistent whether we use the stdlib implementation - or our own, and we deal with this special case in ``get_scheme()`` instead. - """ - return ( - "osx_framework_library" in _AVAILABLE_SCHEMES - and not running_under_virtualenv() - and is_osx_framework() - ) - - -def _infer_prefix() -> str: - """Try to find a prefix scheme for the current platform. - - This tries: - - * A special ``osx_framework_library`` for Python distributed by Apple's - Command Line Tools, when not running in a virtual environment. - * Implementation + OS, used by PyPy on Windows (``pypy_nt``). - * Implementation without OS, used by PyPy on POSIX (``pypy``). - * OS + "prefix", used by CPython on POSIX (``posix_prefix``). - * Just the OS name, used by CPython on Windows (``nt``). - - If none of the above works, fall back to ``posix_prefix``. - """ - if _PREFERRED_SCHEME_API: - return _PREFERRED_SCHEME_API("prefix") - if _should_use_osx_framework_prefix(): - return "osx_framework_library" - implementation_suffixed = f"{sys.implementation.name}_{os.name}" - if implementation_suffixed in _AVAILABLE_SCHEMES: - return implementation_suffixed - if sys.implementation.name in _AVAILABLE_SCHEMES: - return sys.implementation.name - suffixed = f"{os.name}_prefix" - if suffixed in _AVAILABLE_SCHEMES: - return suffixed - if os.name in _AVAILABLE_SCHEMES: # On Windows, prefx is just called "nt". - return os.name - return "posix_prefix" - - -def _infer_user() -> str: - """Try to find a user scheme for the current platform.""" - if _PREFERRED_SCHEME_API: - return _PREFERRED_SCHEME_API("user") - if is_osx_framework() and not running_under_virtualenv(): - suffixed = "osx_framework_user" - else: - suffixed = f"{os.name}_user" - if suffixed in _AVAILABLE_SCHEMES: - return suffixed - if "posix_user" not in _AVAILABLE_SCHEMES: # User scheme unavailable. - raise UserInstallationInvalid() - return "posix_user" - - -def _infer_home() -> str: - """Try to find a home for the current platform.""" - if _PREFERRED_SCHEME_API: - return _PREFERRED_SCHEME_API("home") - suffixed = f"{os.name}_home" - if suffixed in _AVAILABLE_SCHEMES: - return suffixed - return "posix_home" - - -# Update these keys if the user sets a custom home. -_HOME_KEYS = [ - "installed_base", - "base", - "installed_platbase", - "platbase", - "prefix", - "exec_prefix", -] -if sysconfig.get_config_var("userbase") is not None: - _HOME_KEYS.append("userbase") - - -def get_scheme( - dist_name: str, - user: bool = False, - home: typing.Optional[str] = None, - root: typing.Optional[str] = None, - isolated: bool = False, - prefix: typing.Optional[str] = None, -) -> Scheme: - """ - Get the "scheme" corresponding to the input parameters. - - :param dist_name: the name of the package to retrieve the scheme for, used - in the headers scheme path - :param user: indicates to use the "user" scheme - :param home: indicates to use the "home" scheme - :param root: root under which other directories are re-based - :param isolated: ignored, but kept for distutils compatibility (where - this controls whether the user-site pydistutils.cfg is honored) - :param prefix: indicates to use the "prefix" scheme and provides the - base directory for the same - """ - if user and prefix: - raise InvalidSchemeCombination("--user", "--prefix") - if home and prefix: - raise InvalidSchemeCombination("--home", "--prefix") - - if home is not None: - scheme_name = _infer_home() - elif user: - scheme_name = _infer_user() - else: - scheme_name = _infer_prefix() - - # Special case: When installing into a custom prefix, use posix_prefix - # instead of osx_framework_library. See _should_use_osx_framework_prefix() - # docstring for details. - if prefix is not None and scheme_name == "osx_framework_library": - scheme_name = "posix_prefix" - - if home is not None: - variables = {k: home for k in _HOME_KEYS} - elif prefix is not None: - variables = {k: prefix for k in _HOME_KEYS} - else: - variables = {} - - paths = sysconfig.get_paths(scheme=scheme_name, vars=variables) - - # Logic here is very arbitrary, we're doing it for compatibility, don't ask. - # 1. Pip historically uses a special header path in virtual environments. - # 2. If the distribution name is not known, distutils uses 'UNKNOWN'. We - # only do the same when not running in a virtual environment because - # pip's historical header path logic (see point 1) did not do this. - if running_under_virtualenv(): - if user: - base = variables.get("userbase", sys.prefix) - else: - base = variables.get("base", sys.prefix) - python_xy = f"python{get_major_minor_version()}" - paths["include"] = os.path.join(base, "include", "site", python_xy) - elif not dist_name: - dist_name = "UNKNOWN" - - scheme = Scheme( - platlib=paths["platlib"], - purelib=paths["purelib"], - headers=os.path.join(paths["include"], dist_name), - scripts=paths["scripts"], - data=paths["data"], - ) - if root is not None: - for key in SCHEME_KEYS: - value = change_root(root, getattr(scheme, key)) - setattr(scheme, key, value) - return scheme - - -def get_bin_prefix() -> str: - # Forcing to use /usr/local/bin for standard macOS framework installs. - if sys.platform[:6] == "darwin" and sys.prefix[:16] == "/System/Library/": - return "/usr/local/bin" - return sysconfig.get_paths()["scripts"] - - -def get_purelib() -> str: - return sysconfig.get_paths()["purelib"] - - -def get_platlib() -> str: - return sysconfig.get_paths()["platlib"] diff --git a/venv/lib/python3.12/site-packages/pip/_internal/locations/base.py b/venv/lib/python3.12/site-packages/pip/_internal/locations/base.py deleted file mode 100644 index 3f9f896..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/locations/base.py +++ /dev/null @@ -1,81 +0,0 @@ -import functools -import os -import site -import sys -import sysconfig -import typing - -from pip._internal.exceptions import InstallationError -from pip._internal.utils import appdirs -from pip._internal.utils.virtualenv import running_under_virtualenv - -# Application Directories -USER_CACHE_DIR = appdirs.user_cache_dir("pip") - -# FIXME doesn't account for venv linked to global site-packages -site_packages: str = sysconfig.get_path("purelib") - - -def get_major_minor_version() -> str: - """ - Return the major-minor version of the current Python as a string, e.g. - "3.7" or "3.10". - """ - return "{}.{}".format(*sys.version_info) - - -def change_root(new_root: str, pathname: str) -> str: - """Return 'pathname' with 'new_root' prepended. - - If 'pathname' is relative, this is equivalent to os.path.join(new_root, pathname). - Otherwise, it requires making 'pathname' relative and then joining the - two, which is tricky on DOS/Windows and Mac OS. - - This is borrowed from Python's standard library's distutils module. - """ - if os.name == "posix": - if not os.path.isabs(pathname): - return os.path.join(new_root, pathname) - else: - return os.path.join(new_root, pathname[1:]) - - elif os.name == "nt": - (drive, path) = os.path.splitdrive(pathname) - if path[0] == "\\": - path = path[1:] - return os.path.join(new_root, path) - - else: - raise InstallationError( - f"Unknown platform: {os.name}\n" - "Can not change root path prefix on unknown platform." - ) - - -def get_src_prefix() -> str: - if running_under_virtualenv(): - src_prefix = os.path.join(sys.prefix, "src") - else: - # FIXME: keep src in cwd for now (it is not a temporary folder) - try: - src_prefix = os.path.join(os.getcwd(), "src") - except OSError: - # In case the current working directory has been renamed or deleted - sys.exit("The folder you are executing pip from can no longer be found.") - - # under macOS + virtualenv sys.prefix is not properly resolved - # it is something like /path/to/python/bin/.. - return os.path.abspath(src_prefix) - - -try: - # Use getusersitepackages if this is present, as it ensures that the - # value is initialised properly. - user_site: typing.Optional[str] = site.getusersitepackages() -except AttributeError: - user_site = site.USER_SITE - - -@functools.lru_cache(maxsize=None) -def is_osx_framework() -> bool: - return bool(sysconfig.get_config_var("PYTHONFRAMEWORK")) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/main.py b/venv/lib/python3.12/site-packages/pip/_internal/main.py deleted file mode 100644 index 33c6d24..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/main.py +++ /dev/null @@ -1,12 +0,0 @@ -from typing import List, Optional - - -def main(args: Optional[List[str]] = None) -> int: - """This is preserved for old console scripts that may still be referencing - it. - - For additional details, see https://github.com/pypa/pip/issues/7498. - """ - from pip._internal.utils.entrypoints import _wrapper - - return _wrapper(args) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/metadata/__init__.py b/venv/lib/python3.12/site-packages/pip/_internal/metadata/__init__.py deleted file mode 100644 index aa232b6..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/metadata/__init__.py +++ /dev/null @@ -1,128 +0,0 @@ -import contextlib -import functools -import os -import sys -from typing import TYPE_CHECKING, List, Optional, Type, cast - -from pip._internal.utils.misc import strtobool - -from .base import BaseDistribution, BaseEnvironment, FilesystemWheel, MemoryWheel, Wheel - -if TYPE_CHECKING: - from typing import Literal, Protocol -else: - Protocol = object - -__all__ = [ - "BaseDistribution", - "BaseEnvironment", - "FilesystemWheel", - "MemoryWheel", - "Wheel", - "get_default_environment", - "get_environment", - "get_wheel_distribution", - "select_backend", -] - - -def _should_use_importlib_metadata() -> bool: - """Whether to use the ``importlib.metadata`` or ``pkg_resources`` backend. - - By default, pip uses ``importlib.metadata`` on Python 3.11+, and - ``pkg_resourcess`` otherwise. This can be overridden by a couple of ways: - - * If environment variable ``_PIP_USE_IMPORTLIB_METADATA`` is set, it - dictates whether ``importlib.metadata`` is used, regardless of Python - version. - * On Python 3.11+, Python distributors can patch ``importlib.metadata`` - to add a global constant ``_PIP_USE_IMPORTLIB_METADATA = False``. This - makes pip use ``pkg_resources`` (unless the user set the aforementioned - environment variable to *True*). - """ - with contextlib.suppress(KeyError, ValueError): - return bool(strtobool(os.environ["_PIP_USE_IMPORTLIB_METADATA"])) - if sys.version_info < (3, 11): - return False - import importlib.metadata - - return bool(getattr(importlib.metadata, "_PIP_USE_IMPORTLIB_METADATA", True)) - - -class Backend(Protocol): - NAME: 'Literal["importlib", "pkg_resources"]' - Distribution: Type[BaseDistribution] - Environment: Type[BaseEnvironment] - - -@functools.lru_cache(maxsize=None) -def select_backend() -> Backend: - if _should_use_importlib_metadata(): - from . import importlib - - return cast(Backend, importlib) - from . import pkg_resources - - return cast(Backend, pkg_resources) - - -def get_default_environment() -> BaseEnvironment: - """Get the default representation for the current environment. - - This returns an Environment instance from the chosen backend. The default - Environment instance should be built from ``sys.path`` and may use caching - to share instance state accorss calls. - """ - return select_backend().Environment.default() - - -def get_environment(paths: Optional[List[str]]) -> BaseEnvironment: - """Get a representation of the environment specified by ``paths``. - - This returns an Environment instance from the chosen backend based on the - given import paths. The backend must build a fresh instance representing - the state of installed distributions when this function is called. - """ - return select_backend().Environment.from_paths(paths) - - -def get_directory_distribution(directory: str) -> BaseDistribution: - """Get the distribution metadata representation in the specified directory. - - This returns a Distribution instance from the chosen backend based on - the given on-disk ``.dist-info`` directory. - """ - return select_backend().Distribution.from_directory(directory) - - -def get_wheel_distribution(wheel: Wheel, canonical_name: str) -> BaseDistribution: - """Get the representation of the specified wheel's distribution metadata. - - This returns a Distribution instance from the chosen backend based on - the given wheel's ``.dist-info`` directory. - - :param canonical_name: Normalized project name of the given wheel. - """ - return select_backend().Distribution.from_wheel(wheel, canonical_name) - - -def get_metadata_distribution( - metadata_contents: bytes, - filename: str, - canonical_name: str, -) -> BaseDistribution: - """Get the dist representation of the specified METADATA file contents. - - This returns a Distribution instance from the chosen backend sourced from the data - in `metadata_contents`. - - :param metadata_contents: Contents of a METADATA file within a dist, or one served - via PEP 658. - :param filename: Filename for the dist this metadata represents. - :param canonical_name: Normalized project name of the given dist. - """ - return select_backend().Distribution.from_metadata_file_contents( - metadata_contents, - filename, - canonical_name, - ) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 16614536839ff932e2dbd5a92c2d5131ad458c34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5902 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 E1{TE~wEzGB diff --git a/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-312.pyc deleted file mode 100644 index 1e0be5775e91bbc9511603ca2d754aa344573b04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2895 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/base.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/base.cpython-312.pyc deleted file mode 100644 index d46cb2e2a8585f4fd5c3fd8d76a010e5f938500e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35732 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc deleted file mode 100644 index 6b1ba878ccf0278c0f13154f489280314b0795e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15810 zcmcILX>c3YdAk4>SR4dMfCqSkmqbV+DN3{@OSUXZlq^{m<3zIJAdw-6yAna;VBUg~ zi4e9%aa%fZ#!`Banl?3+q!m>6P&z%-cG}8ur{kG)S|Csd^qLvFZQ3OL(Sb#^Nt7S$ z_q{!^0AaUj)5qc4x8FPV9pC*ve5<a`!9be&_0LW3+{`flgfCj+)WZ4<%P>ofzzA%N z39<BPQlI9KnZ8>>7W(8u96U`iYupyH#rY5)w}<R;N5~O(hMaL%$Q7>()v-91Ip&Ug zLLOSS#OmV>p$1y!V&1qf<cl|k8tJ<=))a3Jwa~IH=8w0ATH|e@ws?D}ox=E7N4zuC zNz3+FSG+sa9S?*8^xYBbiT8$j<9(q%cy|h}SbuyVG!Wku+7#a$+8iGY4aS3^V0=qx z3(K5mgu1V?p{*uHG|xP%Z9@4e4!r^UfGIRAxI-f*<_SjdyvzvoqU#N_TC<%(8vyEk z!=%DSDa;43MsYxIxr0KR0NN~W)}cG+*<i~Lu;XOVCOZx$V=-|m6-_2&{%A@hk+U&T zEv1q~wmcP;QnKxMWOg>1I4?UUBXLnUIX8=qJ~oTpBC#MV*UdhEK1@U@IY*{M2>{Md zh@YK{5-~0&QbCjKo=lQ>Bo<AJ0*)XzOhppOM0ARR!U+IDA8s~6Br#}~T}Klapho!Q zv?#{phRI|?JT9gpLL?PAL<r2P{+Wa{H#?goDN$(zz1zj}=fkmR;`#7wBsCpAN0RYy zEIAdyIl>HFLR6ZKMdoR(>`rL&q3=-dq#qAoq@VN?F(N4Ca9sUz_*^t5{s7M>XqD>^ zL?m$nwuVH{&e6?tBjivbMdqJQMiVL7qr6{;l4JrmLG~G&pAw0rY<c2b@@bf_%+bZd z;w_Wo#}COaV{6%YD4`ETkesIQ{IsNE2D82mAWMu$DJW!m2Cz)D2<)Q(r6rSIGGl4p z669ouVagUf2bqJdpM%GFlAN2JgeH8L9#A+eJHp|3QkaX0P<DmGpPh@uunWAIVJBoy zI2=hNk}107QaF5*S;r|p_}s{JGA@q9BPr>^$V75#4);SENr^G>Jc-1Iq*Qe3d65hW z$%~0tG9rj%<bs&EFcOQN9hsd^O(zpOhevmeNYRuyG#i<EK5|}^MrNb4BVpKRkpKpc zXooaXfrrDh^Q0GMKr<{z4UqjDv+Ah({LxjX`}0pi_VSYi_l>rx*j6h*F|GePWaVuY zSYSvd(IRr9^_-~{>IAdM2^N7nXBDh3TS7L$hVLSO&LZ&eZdczqc(=p5Lw$FO9QFpN z1E4NLFDJa$sqb#Rl?$LAp$^6dnEE{r!0P9@V7**_G;v&vC&|1<Dd}H2suiCm$qP}~ z)<9}Hk_sShO95@i0*Ka90Ldi~2?$Zj3L<2F*x?93IyoJc0+E=M48$X|hF*d=l@x#@ z1jHAnM9K%GKq?sk`VVM_QmzW5=4ZuWI-bmHAC?`I)+lbtRwAb6NMdqI!)4eQ2Dux) zuLmGoViwp1CJZGdEtud<<(7cU%uRL@sMxNPtL#+imogV1D@lx<Bio@f8HG&3fnj}Q z2%d=I(L^*A4yRkIw{cjj8pd9TKbM%*)}BSntM1kIfkn&T^L_<?`k-n`Wynx8Ouq|W zl<CjVipuN)bAlmb01L9@A$Z(0kzMd0IG%*#X_ItKM<jiD>CO!kHCFGy&gx`6zALGv z7q7mU^9<zp0Xo@=c_Kfd+pOTZompUN&2xc8Y@NZDRp|}&{RGp;q%2xxKSTO6rj$*4 z7vT72c<rtH{8bR<3ns|T3oPW8uh=vpco`IdjOj(wMfM`|g85U-MK;JyraPzz2<Ql? z;ZxvTk_6JGJ%O|ZP%x0@C}syax~a02wijjZGaz-6f;fTrE7G9|?h|<!vY@%V^)f3~ z;)v_KnEI&gH&)|0N}q=85>ql+?e0}y%hJB9`&Rn%zRgA7aNaju@NLhzw*P3&({qop z*xldt_O5z|v#H|9<N1-tbHn@ZnC^_;>AQ3C?f$o$-=53WKeKK&`P?POROkLliGv;w zq(&J3az{7wx_#Vb&UTO6%x~H_C{`RUYFPAepM=5^lhP?>#)zs=hY1cy)5sKn0%f%W z(ViN@nyD<3o%2yKCZOyUC9)s-kUfx9;I7xWJ4(xR-v$ic*k~UPg!FTXS@U!hJ%f4A zV79Rs+>;OPxjj}0?k{-8bNu*5q=qiax)C3jn0fZ5Y4R}H3NITc=hjdt9F>G9Nq29U zSY?B87)8R30#4v*-1u$WW4h-kL6$)4Q}^pbK3}ho9s`8}C(!fZ6HuE>;1rOwa0(5J zb~*{!DNT{+Y)WCNc4T}K$V;(;sY0KMjZt_HotlRJN1+Kpe5oV=2boKRl`o{*H_WhH z`2_Y<w}*GpnFSljCL9#>e})V~CfmYcAvqNe6I=udB8WRXp8^Ehjb+Q(WHLtfV%>hs z@D#~G%noCQ8%vI0_7rCHSg8<4ZcawD48J7(E@Uq=ADGM>UvikZO)D)~UslYv<$K0} zoVZPQ`sm~B{&jpS@hmj)l^A$r8`tqsvf4N|g5Z($t>dHQWw`_FiiFJ$u-O-Gn{Q^Y z?E$uAWx1x6omkP79Ya_Xg1jpy5ai9Cyw!K}Qwa7VxNc<%!F9Kk$8F(0zR@kCtC)hh z>&dQ`)>i?+jQR)|6E*m%U=qxrTUbCt08K^UL>p)=sFQ$>qH*ky9cpZ%L*Sv-uD0M& zAJJPlp@ma)2`;tPD%2Tj>qIw<>Je>JlQ9WyLtTAU9q20hs0~$h^@chxt@E8T2@M8l zBZW2r)N6n?Q)ml7eFmr>%%E17mk(Ck1nX~ua=SjqW`K04Eo{)D1>QTMMVHvEuEGzH z06=<Xkj|>o3}Rqag73FNpMIfRXcGsNFVPV<sTyAU%UozPg=jm~0qqBcPP(f&&n|cm z&YOb)(hY;l7BE**1jYDd1wYqyA}>@`>qPUKA|Z2O?60X3ABVO^c1&q3-DET|bTtPF zN<vfv&eGJnX!(*u;VpJxOkgL1f>|*iUB0+rW;h?T<f~Ikmo+m;$W=*`DxfTs+aZNl zr5TL?4Dbb$*84NiH)GCNQckUU#-)|Y&jmB|P`{Gl7ECjqa-CKZba_X1rcgPeX{KH) zm7f{we=}oWxvf@OuxK+DsPT}oB|iBf^Dt{ICDW74W!5kk6#Z4{XEB#rJ1lINuZdZ( z!amv-xZmb9uR?|gD6_z8Gd=-E@?_dR3^w^t6ii%#d!BX-BUVzt19k|F@>!Cc0j#1D ziz??qC)fgLR?o_&qy%=QI4fJwpqDu?-=ir-<8YzLd|WlmWnN4O(#2?MS|J^tHWXh- z$&HBNN8$5EOb^;+^HfYC&%lgi9w!8}LS+6d*zdGdr@_jzQrkf{8R!6dpll_StPm-| zj!=?fO}MG=L8q5=yYchGm6acZ?$X~wc8Pi4*HQHK<$Zl$KXBvl^}_|<)<yolmFXL} zvHAMu8$;KJZt;cQNAi64B7bFQ%@-*8hVs6l?DTEE;2U4$OIF6!Saf#eogK@czUvIG zwe%NTM)NJBi$~V{ZLiy|*^2(bynis;S@7?=&F1}kUOD={uf6C4rL=$LGk1MEa;_aY z-wxXEk$lS|AKI_z-=FvIzvC<T58a96{YMs${)4Awna|GO*?rgZ)S~4bkN3*h7w2=T zWh6J~3eHp#40f>nWge|gx{2rpn=*0*R0yc{^c)nxC&(_aQ5NW0=PNZeS5r#YTo){5 z8ecH~wn@iPj^Ze1z)|z0%pX5=a(rU^<oHdq%xnH4#ZJVjflh=hfJ87u#Uf}WXR#c` zYz8xICfDg}L=##;4dh`)ylAIKuQ$Xk2x~i%9^8l|wOgW2AUzHl*cSCnT}#d%ESXKM zj>S4amio@3XEg5_U2W=IYZ_RI-+H#tv~RU_;J(dL?^v{a;9%-~6=%ayBb*wW6>1`) zH9duGK)Fi{7=<-CyC%>d0^Xa#_B0u}Eal4<;I-yjwuRPzf_cq4Wr~6UeHsk0jCH{} zgLqJt7A#;OvR~18J_$g(8d5=E1)a+aW)#6?sQ`1cY7*cVO|R~@Fd19MDxklZ(cmnT zYSBJD<JU^%C+r1^->Q^q*8nfsYPZnFUoaUsr=4P@y^NJpCKmP~W4#FG^e7{-7vcR= z3=4m+KBbt!U}o#GZN{yAwfqFryCcJ=(5|Ja_G}DP!e2Ilsm;I0Uu09dY=KdlV3a0( z6g1K;3;eG#U(qEKHPLB5-9)!eK43=(?%xmo6H>Y*0FH@3BmqV_b?OEv#%&9bI5Y{m zWe0dQ($QI@27=#`dE^Ud=g1Bz6(K2wwV#G6(v0;swYBUx5D`Mr*~8cq<v2-TMy>fO znsq2N`&q2-!!b<hb25*DiE?~4Og@8ENz9P66#B(M6#B(n;q4Ae!*mJhmW?D!D^k!; zY6gA<6l!tWkFcu^&BcbEd_zy60gMf6op*(-bp^A%S)tIi^Q!X-zuW`dyQlAl^SbkE zb^pOxdc5!ZJ62oTmtMO1Qg$%gc58Iy#k(yJmpG=Wb?M2gPcBO<<AugeD<t2z<?gnL zJD+&Fv9N72-#A$^L*FZPB?cZp<lsy9n+-gnZRxqI&nbN2nLmE+8_yM*CRSTJYw(62 z-|N%{p!5C7eK%9zQuOrX(O<#ZA6@fyEziCF;<XpEse*Uxc2CZ=_a|$fZmc`Pu6cV` zgq2gdtq0JDk?T8L@IH}qJ@J#08EYR%$6$Xh*B|7WFZUjJ)cgl~5A3qOIbwq1o1;8H zzqyNp@;4vl4sy1)SQ|jz;(Zf7^IPpL2X~m?+Tp_TzWNEb`LEm@l&5sb0OMkr@-1}N zfj(N(l~qfEXg&=SIRQN>D&1tMJ4nJYmE))2D#clo8LvRAbz}=5$vwW;(yye8p5DBt zH^=u<4Z32QI7K?mFGIoTmVpVY>M2y{Nn;Kf5Qd~~fi?Qo$|~>)T&_`+s{KhzZTN?c zqL~pEg3FP461k`-Je0nWKd7Dp(7e<;7rHT(?gDQ#0ptspOW+w&uVK>N6%@0v!Ixlc z=_q8EnD6?)9rk;fo0)>|u|@tJr*E~Td-2G95MW))(*@7w9KX3_XWZV`PJiJvQcC7( z2C6{<maEN7qvD&b*!rIlhA3;Ny6sCi>oStab(FE_i*Bo0G%y{lZW(%#OPHbeqGFnO zjub<Xo1g$LD?qhzq}IvL)G(toT%z7u-ERQQ-i%^qUiY<<L-1j6pQ46JX#$+<psv%4 z1j;UD_jpRV|5E*^)%(y~KH#(S)F6ecvY3?atJ)9^O^l6x4ZbRkK?Xe3VYauf`C67O zuRE?eivDeR|F)ukH18iRP@NT=sGZ1oTHo>ck;Sw=kWe~a9^A^jVc%u`BX(CMi_mFr zKeYPqX|LA4miJKc+?z=qjHPf6R0m1*R=D;1PD)8tCP8K8Z^8f)%1<ByPhh3-M%(qa zV$be;&+dZfksSZXMqK&-SP@+5;%#jBf^t)-V1P|~t6Cqq0@F=Xb4$Ar9afwEmT@&5 z%O_tCT?-XENAjH`1<&>zzn!jz;!|zE!jsVdL-{x^yeb*&0Nsw?cwCgnQ}<#J`Ull3 z7gPd_eiGRhmFTr^)zVbx?_zUQ`p^lha{Nts&!(?S*|D$97d)dmezf*s^+BigQ;;14 zf%Vg@uI!sQ1p4adVEw;hS~C4S$H6%B%r53t?sv>^O=6mqZHlK>g0<1bQg3P1vB~Xl zrAo?_sd{%Qib_=$$w##O2JQno>A%nX2(|+5I`&-Mqg-=j=L^0^iu@zr<{we1vOCCL zXE$5EY7Md#2d?wGKZSuRs8T=13|#rul8&_ui?URdoaH;HGW0UuM%9qCwakffuZ(%Y ze92`nCK#wwM}ZN|ni6599&Kgg5zFKTR8l9Csl&;+grM9y?FTqPr&7?O+&WPe6fr}# zX;vX_N?G@`)2M_LcsA0_6)aST{{gg@@VN21gc{+CmI~BdN!|5qTl4m<OccDqoGZBM zZC=`PbxYA3%zJ~`{(^U8(YEUJE<R4%P(aQ#vg&DGbZ^9Dw9qIfZwKM`(_*q_`PDi+ zt!{!jeV$>c1qmt-c*%4dAHJ+6LtBtkx))Hl9?Sl=T1Q)^r_TT_f&Y*LKblh;8*EnO z>s3knBG{fERm+w=55K}Lv0%M@+`_yXwE&$`8a0ER^cW~oxPzo0vjND0HigsH;awQG zO2~W|F5YDh$S*D__at^;%&8~_oseGW0gf?rmqAB*ZH$A+HtZRN%M^-EPGy`~j7uR4 z_$B-ty*@(Zf~43s4V1<Wjiq!~1)goF|8pGY^N=Z&-_`s2%(a<f*Tea)hYMZ1i(UKj zUHb}M`|mMk`ziL7$;CrgcC8L<yK(yZ>92+F!CmGlHecU!#d78OwVwW!PZxSdi#>bu zJ$r8-EcEQZ>V}HQa?@IKU`4nwbA9G(vD*WGx%E%B{@Kvmb9bAcDbzpn0f$3;V8+pZ zETOJ*`9R}=X0}3+LY#rKW!8Tmu(X1))MNnV3+$T8lS=HwEU+0iVG>LkmR^|G@IovY z7*`4{SDI@16J~VJf!2y)G%U+l7A!NJWw=%<GbNUR7Tp@W{M1IEiXPgsG=ZY`3FyJp z@{W_{6xz`=)o!6l(u_ILWbiN49If0orF%<ebZ>(89SomYFl$T{V(2Ux)2EnMuj&2- zF8w8kf~A4L9ukR45UsKyB5Y3}dJdvnL<nF(YEWXbAkqax#H7F(V`#)+@Qgklj(d{K zi2>*kIAgqihE~uWV^Wl_DbXv~p2T44Y5wVBPYfNMJp8eA%Ou3csIF*;K>+@a;Rgef z%s^C*BPvlPI58zE(g4pvaVB2F(h_FWtnxugw!n;uY>g$)pBIU2yBHw}jJo5*cqAH= ztyCi;vg5EQ3QwbU2Jw04pe%D!u_Q#!ag+rZe38_{x*bRMz{X(s8w{sJz&Wua6mb-K zTZ?N`8G&1ma|lP{v#}~|wX*Up7@gj+UShyFb2VQPmS(Qbe0`|cJCX05xa&N$+Og@C z<L`HDT0CAd@%A>f)gTyUC0=M51B0!eY3W#sU5yo+hw{xsh31h(=PK_j^8P&UU-sYS zdsjVeMNc5_2^6R){iFLnrXG9{Ru~C%uFMxQYrUGG*!$R3&v$z_t)y;bu4f9p4_)!B zxxBAUzA~9>AG?*j>pHyJ()xuXr8?;QKthy!qhWk6^XA@h|G{SSTTLwFvK6E&iAc3o z6Vzq#j*ILn8)E|dGC(GDdeyNWO!Zp9GC)@-)vHoXUV|njBry7G_xVVk12-_H$qGh@ zpWO-n>xUuJ#Pw<Lj%L{Ma%$;BWk#k7vUW{~Db|lkxs-88k#l00?jKz3n1;7gSDI0u zeqev}yqFMQm?ittqZ=iQAkM-~j+mGN$u;~a+Q>0!->}~0U6?jix2drCcGt1npZ&E= zv3pm(8?G~o-Fxy~$9^o~A}@FMK%|gt2UlHMOh{r%cF~wLNr`h+2=Vu!A-Fb_C{@&w zsq{psamKPD6OA*gB@>PH@8A#<kX>TlaW<?qb-}#u9KPFitk869@$hO>d$DOS-vm)C zzt?uNO^IYFH0^~N&4fUw(aOUG&z2m&WuwxCNI}Kf|IxvPE8SqGHc|<%TKR%<mQuQB z<55*Lc@Ni&6lJi4kY;myfUW>I7?M>5RpBD&LeO9~%H@wn!4IK@8jg-~V4X#|!}&w_ zQ2Fq+BmWD4Rvo#dtXy+<2-QbkUH^|b1nOdHl+xzBXLFV-c!qEF|M8Y@Y$@(InBQ?Q z=Q)_;57O;`NWZPnI=H1ODn^+migG0i#yJ&>ND>H_>7<}o6nGgyrZJnuY!)+A4oC(v znTKPU6-jEIAZt+M%F9^#1<a@;=ZjcE_Xt5>8$rc`8t<e7OJBwe6(;h_m{AdB!4hx@ zhI|#Xn~=#ih%AyI3>N~!l>$K<kl=9=CuV<!8ES{*4raJox^k*$(ra3p9Rs*@4^aAL zh?8Tvw&l~s&RzM=T^JP8c6$QjWZJ+pZfz);8n{-Bw}D4)<nep>TsLbKrA@Tt=33ux z50p4~LMLBy$%ZAKX=y9jvE*PJZTFl|QhOpSKzn+**5$bp1CQ)M`pAt<+{0J3C6r2o zjMa^k>{}jO*?DaUJWgC6Rx3c9C6st>aOFt$#P#F%7$~aMP%1TQ4VPcYny+PQ_qM_J zE%zY6h<+D_gHp+>_T01L#$J2$Z|+gQ$#SE))@@ifs@IKTbkUCGBe;<}lsKjx2-=f< z_SV$R)3~wF-Nv;nPh(tDOLiy5HMNwy7VZ?gvO7DO@7uf1;7iHX$n~voH|nm}6$20D z0}rh;0Qg{=h1;5S+}e5519uJF);s>Ux8}!BVVA8X7t8gmOlPI*ar_QkZLr*g8Z0%z zW>XmBG{Gw9fVe&d|9V2?!?do*S}m4cVE;!!PA1U?p*Wl&6o`lLC97x`9ikI)82=#* z2g81BhE^_sK`0Z}LVpa}_CPq46QFh#ssw4*Z-8Q`b_0a%xJUpx%chIc|2}BP9KNUv zqQ8dGj9f_x*=aQV4nU9C`5rb!f=Ay=6GZIrbZ;wUzs_tGsexCH=vP)!ErzS9F`7q1 zmGRDtN%B1EkRVloi=Bl5jGk|sAfAiN#ZqaXaiS{lU$HT&xtExK@OXdev7&EV-nXsb z8OrfPbjJ7tkkoXg?xkCAyP@L}goMMyRlNv;kxc-sN@Zo`Lzdw9q_Tt)umY2EFZeew zhH<lH<(7}mCf#gY3cdZK@PETT$d2{ZY|Z<&W)Fc+y5QNF<9BX61mvWB@V}0}I86bY zfpT>MzX#Z1pqAmW(NtcQs)99Ct6*<KJB6{Hgi^(7d|@iqji!;5?lvx~MuU4eN<U<Z zY2WByI&$?0Fd6&6;soCQ!M$I9!PWl(INS$RwJXre5?o(xF^>y1iuv-As9#TCDl}8m z8|o9b1I$MBz132k7fjC&!c^H;eG3r!%tEj&Yz??T)9)URf-Q!>X)u_C@FSF|Y5d&+ z8jEMnpn-Je3>s|sE|z~~qyGE>Z6f*;2uX~PscA4h5d#8S;9hG>#lUdGeF1DV{Pk3g z(YC>FBXpyaPJw>!tT-LH5QVVy<T;p2<xf}87&Xou4AL`YBXklRN9cT#o9WTQbSfH4 zRJv=9MLZKl+<zQOR7Eb^dW}HJxU`D?=|BZ`)M)V^IMP1I!0dA|ZCkTrh1Tth?$t(r zv2i5dI8taF1qYA4V{roXTIC{iB~kE<f%*4kXNiLvkY4pQf~S#45Es^OLq=WWI=KTt zO%=FfBH$W4fgvh28A2_mVYxqbg?!`}sQW}$FKb2G>UU?1=Cn}kB97dJ`4Xf|*``_= zim6m_Q=++r)k{@MLP`Jv?gN~Z;+?Cn#t8T&gaKcxYk?9N=?n}&ucNiddC*BAKFjF= zC;j5FQX^;g!!gt~ymsW3BSlw7-USylcU`^oXbfF){P2(Nb9x{FasmH4z81V}^FN?J zGg)dMH#2XVedDd>H~lQ+L2pgn_HSWARFsi7vDAjyw=km$EAFzQ=l&g*s3J-=-aNk2 z&0NJ&l{y(f7-s(h|I%+jrl^z6%a0Y?cjnt^G<NfC3u+_Hs5F5($#TQX9@LqJQD;&B zdes;xX_oAXoA!M74%DE=ZoPy}$MmLSC98=WSa~)#ye~iSI0lXnlz0c%nDvzyc-->m z_B@#%J+_W7C4VC~g5lrr$Ud8U_;7yciTn7XXh1mc;Fw%TT|C38Uae@^E(NA~eQf9z z0?tK3(1W}HnQVpMRUriNL<y0nTSm7L9pHq=47V13-WZ)7hReK!kR%EY_8K6=%FpUx ztYH;T=}+{iE-$y&Zb<KP6;pz8qR!gQv>QV=PUSV6ik~*rekC?s{sEa1#DiBNG>Av; zsBB0-h!LgqSDs32Le*GGlXw*FzEII1jrhIRTEi$|Z|IFwf{H8{{z)jZQCo*%Cbf>J zVT3jo{$>FgZCJJgu{}k7bPAH+z+vzLjGz&y{QiJiaRGd-#MTG=qsnh6_mS^IEwUa7 zjV&N1mVK9Le3$XP%edcV?2y05oGLP>^317!W(K~)?0Jtl`W<Hf_bB8$%*1=l_<PK; zA6jgz>4ywt_q>dA$0ghQ_O`{AqP;C|Z(H77u=iiGzHe*3WVvrOvz{w$_ZfKn&=p|o kK42ibf0%vN#7?j|U*CO(mhNA$Y-dNVjQl$T4~nAy1wDJleE<Le diff --git a/venv/lib/python3.12/site-packages/pip/_internal/metadata/_json.py b/venv/lib/python3.12/site-packages/pip/_internal/metadata/_json.py deleted file mode 100644 index 27362fc..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/metadata/_json.py +++ /dev/null @@ -1,84 +0,0 @@ -# Extracted from https://github.com/pfmoore/pkg_metadata - -from email.header import Header, decode_header, make_header -from email.message import Message -from typing import Any, Dict, List, Union - -METADATA_FIELDS = [ - # Name, Multiple-Use - ("Metadata-Version", False), - ("Name", False), - ("Version", False), - ("Dynamic", True), - ("Platform", True), - ("Supported-Platform", True), - ("Summary", False), - ("Description", False), - ("Description-Content-Type", False), - ("Keywords", False), - ("Home-page", False), - ("Download-URL", False), - ("Author", False), - ("Author-email", False), - ("Maintainer", False), - ("Maintainer-email", False), - ("License", False), - ("Classifier", True), - ("Requires-Dist", True), - ("Requires-Python", False), - ("Requires-External", True), - ("Project-URL", True), - ("Provides-Extra", True), - ("Provides-Dist", True), - ("Obsoletes-Dist", True), -] - - -def json_name(field: str) -> str: - return field.lower().replace("-", "_") - - -def msg_to_json(msg: Message) -> Dict[str, Any]: - """Convert a Message object into a JSON-compatible dictionary.""" - - def sanitise_header(h: Union[Header, str]) -> str: - if isinstance(h, Header): - chunks = [] - for bytes, encoding in decode_header(h): - if encoding == "unknown-8bit": - try: - # See if UTF-8 works - bytes.decode("utf-8") - encoding = "utf-8" - except UnicodeDecodeError: - # If not, latin1 at least won't fail - encoding = "latin1" - chunks.append((bytes, encoding)) - return str(make_header(chunks)) - return str(h) - - result = {} - for field, multi in METADATA_FIELDS: - if field not in msg: - continue - key = json_name(field) - if multi: - value: Union[str, List[str]] = [ - sanitise_header(v) for v in msg.get_all(field) # type: ignore - ] - else: - value = sanitise_header(msg.get(field)) # type: ignore - if key == "keywords": - # Accept both comma-separated and space-separated - # forms, for better compatibility with old data. - if "," in value: - value = [v.strip() for v in value.split(",")] - else: - value = value.split() - result[key] = value - - payload = msg.get_payload() - if payload: - result["description"] = payload - - return result diff --git a/venv/lib/python3.12/site-packages/pip/_internal/metadata/base.py b/venv/lib/python3.12/site-packages/pip/_internal/metadata/base.py deleted file mode 100644 index 9249124..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/metadata/base.py +++ /dev/null @@ -1,702 +0,0 @@ -import csv -import email.message -import functools -import json -import logging -import pathlib -import re -import zipfile -from typing import ( - IO, - TYPE_CHECKING, - Any, - Collection, - Container, - Dict, - Iterable, - Iterator, - List, - NamedTuple, - Optional, - Tuple, - Union, -) - -from pip._vendor.packaging.requirements import Requirement -from pip._vendor.packaging.specifiers import InvalidSpecifier, SpecifierSet -from pip._vendor.packaging.utils import NormalizedName, canonicalize_name -from pip._vendor.packaging.version import LegacyVersion, Version - -from pip._internal.exceptions import NoneMetadataError -from pip._internal.locations import site_packages, user_site -from pip._internal.models.direct_url import ( - DIRECT_URL_METADATA_NAME, - DirectUrl, - DirectUrlValidationError, -) -from pip._internal.utils.compat import stdlib_pkgs # TODO: Move definition here. -from pip._internal.utils.egg_link import egg_link_path_from_sys_path -from pip._internal.utils.misc import is_local, normalize_path -from pip._internal.utils.urls import url_to_path - -from ._json import msg_to_json - -if TYPE_CHECKING: - from typing import Protocol -else: - Protocol = object - -DistributionVersion = Union[LegacyVersion, Version] - -InfoPath = Union[str, pathlib.PurePath] - -logger = logging.getLogger(__name__) - - -class BaseEntryPoint(Protocol): - @property - def name(self) -> str: - raise NotImplementedError() - - @property - def value(self) -> str: - raise NotImplementedError() - - @property - def group(self) -> str: - raise NotImplementedError() - - -def _convert_installed_files_path( - entry: Tuple[str, ...], - info: Tuple[str, ...], -) -> str: - """Convert a legacy installed-files.txt path into modern RECORD path. - - The legacy format stores paths relative to the info directory, while the - modern format stores paths relative to the package root, e.g. the - site-packages directory. - - :param entry: Path parts of the installed-files.txt entry. - :param info: Path parts of the egg-info directory relative to package root. - :returns: The converted entry. - - For best compatibility with symlinks, this does not use ``abspath()`` or - ``Path.resolve()``, but tries to work with path parts: - - 1. While ``entry`` starts with ``..``, remove the equal amounts of parts - from ``info``; if ``info`` is empty, start appending ``..`` instead. - 2. Join the two directly. - """ - while entry and entry[0] == "..": - if not info or info[-1] == "..": - info += ("..",) - else: - info = info[:-1] - entry = entry[1:] - return str(pathlib.Path(*info, *entry)) - - -class RequiresEntry(NamedTuple): - requirement: str - extra: str - marker: str - - -class BaseDistribution(Protocol): - @classmethod - def from_directory(cls, directory: str) -> "BaseDistribution": - """Load the distribution from a metadata directory. - - :param directory: Path to a metadata directory, e.g. ``.dist-info``. - """ - raise NotImplementedError() - - @classmethod - def from_metadata_file_contents( - cls, - metadata_contents: bytes, - filename: str, - project_name: str, - ) -> "BaseDistribution": - """Load the distribution from the contents of a METADATA file. - - This is used to implement PEP 658 by generating a "shallow" dist object that can - be used for resolution without downloading or building the actual dist yet. - - :param metadata_contents: The contents of a METADATA file. - :param filename: File name for the dist with this metadata. - :param project_name: Name of the project this dist represents. - """ - raise NotImplementedError() - - @classmethod - def from_wheel(cls, wheel: "Wheel", name: str) -> "BaseDistribution": - """Load the distribution from a given wheel. - - :param wheel: A concrete wheel definition. - :param name: File name of the wheel. - - :raises InvalidWheel: Whenever loading of the wheel causes a - :py:exc:`zipfile.BadZipFile` exception to be thrown. - :raises UnsupportedWheel: If the wheel is a valid zip, but malformed - internally. - """ - raise NotImplementedError() - - def __repr__(self) -> str: - return f"{self.raw_name} {self.version} ({self.location})" - - def __str__(self) -> str: - return f"{self.raw_name} {self.version}" - - @property - def location(self) -> Optional[str]: - """Where the distribution is loaded from. - - A string value is not necessarily a filesystem path, since distributions - can be loaded from other sources, e.g. arbitrary zip archives. ``None`` - means the distribution is created in-memory. - - Do not canonicalize this value with e.g. ``pathlib.Path.resolve()``. If - this is a symbolic link, we want to preserve the relative path between - it and files in the distribution. - """ - raise NotImplementedError() - - @property - def editable_project_location(self) -> Optional[str]: - """The project location for editable distributions. - - This is the directory where pyproject.toml or setup.py is located. - None if the distribution is not installed in editable mode. - """ - # TODO: this property is relatively costly to compute, memoize it ? - direct_url = self.direct_url - if direct_url: - if direct_url.is_local_editable(): - return url_to_path(direct_url.url) - else: - # Search for an .egg-link file by walking sys.path, as it was - # done before by dist_is_editable(). - egg_link_path = egg_link_path_from_sys_path(self.raw_name) - if egg_link_path: - # TODO: get project location from second line of egg_link file - # (https://github.com/pypa/pip/issues/10243) - return self.location - return None - - @property - def installed_location(self) -> Optional[str]: - """The distribution's "installed" location. - - This should generally be a ``site-packages`` directory. This is - usually ``dist.location``, except for legacy develop-installed packages, - where ``dist.location`` is the source code location, and this is where - the ``.egg-link`` file is. - - The returned location is normalized (in particular, with symlinks removed). - """ - raise NotImplementedError() - - @property - def info_location(self) -> Optional[str]: - """Location of the .[egg|dist]-info directory or file. - - Similarly to ``location``, a string value is not necessarily a - filesystem path. ``None`` means the distribution is created in-memory. - - For a modern .dist-info installation on disk, this should be something - like ``{location}/{raw_name}-{version}.dist-info``. - - Do not canonicalize this value with e.g. ``pathlib.Path.resolve()``. If - this is a symbolic link, we want to preserve the relative path between - it and other files in the distribution. - """ - raise NotImplementedError() - - @property - def installed_by_distutils(self) -> bool: - """Whether this distribution is installed with legacy distutils format. - - A distribution installed with "raw" distutils not patched by setuptools - uses one single file at ``info_location`` to store metadata. We need to - treat this specially on uninstallation. - """ - info_location = self.info_location - if not info_location: - return False - return pathlib.Path(info_location).is_file() - - @property - def installed_as_egg(self) -> bool: - """Whether this distribution is installed as an egg. - - This usually indicates the distribution was installed by (older versions - of) easy_install. - """ - location = self.location - if not location: - return False - return location.endswith(".egg") - - @property - def installed_with_setuptools_egg_info(self) -> bool: - """Whether this distribution is installed with the ``.egg-info`` format. - - This usually indicates the distribution was installed with setuptools - with an old pip version or with ``single-version-externally-managed``. - - Note that this ensure the metadata store is a directory. distutils can - also installs an ``.egg-info``, but as a file, not a directory. This - property is *False* for that case. Also see ``installed_by_distutils``. - """ - info_location = self.info_location - if not info_location: - return False - if not info_location.endswith(".egg-info"): - return False - return pathlib.Path(info_location).is_dir() - - @property - def installed_with_dist_info(self) -> bool: - """Whether this distribution is installed with the "modern format". - - This indicates a "modern" installation, e.g. storing metadata in the - ``.dist-info`` directory. This applies to installations made by - setuptools (but through pip, not directly), or anything using the - standardized build backend interface (PEP 517). - """ - info_location = self.info_location - if not info_location: - return False - if not info_location.endswith(".dist-info"): - return False - return pathlib.Path(info_location).is_dir() - - @property - def canonical_name(self) -> NormalizedName: - raise NotImplementedError() - - @property - def version(self) -> DistributionVersion: - raise NotImplementedError() - - @property - def setuptools_filename(self) -> str: - """Convert a project name to its setuptools-compatible filename. - - This is a copy of ``pkg_resources.to_filename()`` for compatibility. - """ - return self.raw_name.replace("-", "_") - - @property - def direct_url(self) -> Optional[DirectUrl]: - """Obtain a DirectUrl from this distribution. - - Returns None if the distribution has no `direct_url.json` metadata, - or if `direct_url.json` is invalid. - """ - try: - content = self.read_text(DIRECT_URL_METADATA_NAME) - except FileNotFoundError: - return None - try: - return DirectUrl.from_json(content) - except ( - UnicodeDecodeError, - json.JSONDecodeError, - DirectUrlValidationError, - ) as e: - logger.warning( - "Error parsing %s for %s: %s", - DIRECT_URL_METADATA_NAME, - self.canonical_name, - e, - ) - return None - - @property - def installer(self) -> str: - try: - installer_text = self.read_text("INSTALLER") - except (OSError, ValueError, NoneMetadataError): - return "" # Fail silently if the installer file cannot be read. - for line in installer_text.splitlines(): - cleaned_line = line.strip() - if cleaned_line: - return cleaned_line - return "" - - @property - def requested(self) -> bool: - return self.is_file("REQUESTED") - - @property - def editable(self) -> bool: - return bool(self.editable_project_location) - - @property - def local(self) -> bool: - """If distribution is installed in the current virtual environment. - - Always True if we're not in a virtualenv. - """ - if self.installed_location is None: - return False - return is_local(self.installed_location) - - @property - def in_usersite(self) -> bool: - if self.installed_location is None or user_site is None: - return False - return self.installed_location.startswith(normalize_path(user_site)) - - @property - def in_site_packages(self) -> bool: - if self.installed_location is None or site_packages is None: - return False - return self.installed_location.startswith(normalize_path(site_packages)) - - def is_file(self, path: InfoPath) -> bool: - """Check whether an entry in the info directory is a file.""" - raise NotImplementedError() - - def iter_distutils_script_names(self) -> Iterator[str]: - """Find distutils 'scripts' entries metadata. - - If 'scripts' is supplied in ``setup.py``, distutils records those in the - installed distribution's ``scripts`` directory, a file for each script. - """ - raise NotImplementedError() - - def read_text(self, path: InfoPath) -> str: - """Read a file in the info directory. - - :raise FileNotFoundError: If ``path`` does not exist in the directory. - :raise NoneMetadataError: If ``path`` exists in the info directory, but - cannot be read. - """ - raise NotImplementedError() - - def iter_entry_points(self) -> Iterable[BaseEntryPoint]: - raise NotImplementedError() - - def _metadata_impl(self) -> email.message.Message: - raise NotImplementedError() - - @functools.lru_cache(maxsize=1) - def _metadata_cached(self) -> email.message.Message: - # When we drop python 3.7 support, move this to the metadata property and use - # functools.cached_property instead of lru_cache. - metadata = self._metadata_impl() - self._add_egg_info_requires(metadata) - return metadata - - @property - def metadata(self) -> email.message.Message: - """Metadata of distribution parsed from e.g. METADATA or PKG-INFO. - - This should return an empty message if the metadata file is unavailable. - - :raises NoneMetadataError: If the metadata file is available, but does - not contain valid metadata. - """ - return self._metadata_cached() - - @property - def metadata_dict(self) -> Dict[str, Any]: - """PEP 566 compliant JSON-serializable representation of METADATA or PKG-INFO. - - This should return an empty dict if the metadata file is unavailable. - - :raises NoneMetadataError: If the metadata file is available, but does - not contain valid metadata. - """ - return msg_to_json(self.metadata) - - @property - def metadata_version(self) -> Optional[str]: - """Value of "Metadata-Version:" in distribution metadata, if available.""" - return self.metadata.get("Metadata-Version") - - @property - def raw_name(self) -> str: - """Value of "Name:" in distribution metadata.""" - # The metadata should NEVER be missing the Name: key, but if it somehow - # does, fall back to the known canonical name. - return self.metadata.get("Name", self.canonical_name) - - @property - def requires_python(self) -> SpecifierSet: - """Value of "Requires-Python:" in distribution metadata. - - If the key does not exist or contains an invalid value, an empty - SpecifierSet should be returned. - """ - value = self.metadata.get("Requires-Python") - if value is None: - return SpecifierSet() - try: - # Convert to str to satisfy the type checker; this can be a Header object. - spec = SpecifierSet(str(value)) - except InvalidSpecifier as e: - message = "Package %r has an invalid Requires-Python: %s" - logger.warning(message, self.raw_name, e) - return SpecifierSet() - return spec - - def iter_dependencies(self, extras: Collection[str] = ()) -> Iterable[Requirement]: - """Dependencies of this distribution. - - For modern .dist-info distributions, this is the collection of - "Requires-Dist:" entries in distribution metadata. - """ - raise NotImplementedError() - - def iter_provided_extras(self) -> Iterable[str]: - """Extras provided by this distribution. - - For modern .dist-info distributions, this is the collection of - "Provides-Extra:" entries in distribution metadata. - - The return value of this function is not particularly useful other than - display purposes due to backward compatibility issues and the extra - names being poorly normalized prior to PEP 685. If you want to perform - logic operations on extras, use :func:`is_extra_provided` instead. - """ - raise NotImplementedError() - - def is_extra_provided(self, extra: str) -> bool: - """Check whether an extra is provided by this distribution. - - This is needed mostly for compatibility issues with pkg_resources not - following the extra normalization rules defined in PEP 685. - """ - raise NotImplementedError() - - def _iter_declared_entries_from_record(self) -> Optional[Iterator[str]]: - try: - text = self.read_text("RECORD") - except FileNotFoundError: - return None - # This extra Path-str cast normalizes entries. - return (str(pathlib.Path(row[0])) for row in csv.reader(text.splitlines())) - - def _iter_declared_entries_from_legacy(self) -> Optional[Iterator[str]]: - try: - text = self.read_text("installed-files.txt") - except FileNotFoundError: - return None - paths = (p for p in text.splitlines(keepends=False) if p) - root = self.location - info = self.info_location - if root is None or info is None: - return paths - try: - info_rel = pathlib.Path(info).relative_to(root) - except ValueError: # info is not relative to root. - return paths - if not info_rel.parts: # info *is* root. - return paths - return ( - _convert_installed_files_path(pathlib.Path(p).parts, info_rel.parts) - for p in paths - ) - - def iter_declared_entries(self) -> Optional[Iterator[str]]: - """Iterate through file entries declared in this distribution. - - For modern .dist-info distributions, this is the files listed in the - ``RECORD`` metadata file. For legacy setuptools distributions, this - comes from ``installed-files.txt``, with entries normalized to be - compatible with the format used by ``RECORD``. - - :return: An iterator for listed entries, or None if the distribution - contains neither ``RECORD`` nor ``installed-files.txt``. - """ - return ( - self._iter_declared_entries_from_record() - or self._iter_declared_entries_from_legacy() - ) - - def _iter_requires_txt_entries(self) -> Iterator[RequiresEntry]: - """Parse a ``requires.txt`` in an egg-info directory. - - This is an INI-ish format where an egg-info stores dependencies. A - section name describes extra other environment markers, while each entry - is an arbitrary string (not a key-value pair) representing a dependency - as a requirement string (no markers). - - There is a construct in ``importlib.metadata`` called ``Sectioned`` that - does mostly the same, but the format is currently considered private. - """ - try: - content = self.read_text("requires.txt") - except FileNotFoundError: - return - extra = marker = "" # Section-less entries don't have markers. - for line in content.splitlines(): - line = line.strip() - if not line or line.startswith("#"): # Comment; ignored. - continue - if line.startswith("[") and line.endswith("]"): # A section header. - extra, _, marker = line.strip("[]").partition(":") - continue - yield RequiresEntry(requirement=line, extra=extra, marker=marker) - - def _iter_egg_info_extras(self) -> Iterable[str]: - """Get extras from the egg-info directory.""" - known_extras = {""} - for entry in self._iter_requires_txt_entries(): - extra = canonicalize_name(entry.extra) - if extra in known_extras: - continue - known_extras.add(extra) - yield extra - - def _iter_egg_info_dependencies(self) -> Iterable[str]: - """Get distribution dependencies from the egg-info directory. - - To ease parsing, this converts a legacy dependency entry into a PEP 508 - requirement string. Like ``_iter_requires_txt_entries()``, there is code - in ``importlib.metadata`` that does mostly the same, but not do exactly - what we need. - - Namely, ``importlib.metadata`` does not normalize the extra name before - putting it into the requirement string, which causes marker comparison - to fail because the dist-info format do normalize. This is consistent in - all currently available PEP 517 backends, although not standardized. - """ - for entry in self._iter_requires_txt_entries(): - extra = canonicalize_name(entry.extra) - if extra and entry.marker: - marker = f'({entry.marker}) and extra == "{extra}"' - elif extra: - marker = f'extra == "{extra}"' - elif entry.marker: - marker = entry.marker - else: - marker = "" - if marker: - yield f"{entry.requirement} ; {marker}" - else: - yield entry.requirement - - def _add_egg_info_requires(self, metadata: email.message.Message) -> None: - """Add egg-info requires.txt information to the metadata.""" - if not metadata.get_all("Requires-Dist"): - for dep in self._iter_egg_info_dependencies(): - metadata["Requires-Dist"] = dep - if not metadata.get_all("Provides-Extra"): - for extra in self._iter_egg_info_extras(): - metadata["Provides-Extra"] = extra - - -class BaseEnvironment: - """An environment containing distributions to introspect.""" - - @classmethod - def default(cls) -> "BaseEnvironment": - raise NotImplementedError() - - @classmethod - def from_paths(cls, paths: Optional[List[str]]) -> "BaseEnvironment": - raise NotImplementedError() - - def get_distribution(self, name: str) -> Optional["BaseDistribution"]: - """Given a requirement name, return the installed distributions. - - The name may not be normalized. The implementation must canonicalize - it for lookup. - """ - raise NotImplementedError() - - def _iter_distributions(self) -> Iterator["BaseDistribution"]: - """Iterate through installed distributions. - - This function should be implemented by subclass, but never called - directly. Use the public ``iter_distribution()`` instead, which - implements additional logic to make sure the distributions are valid. - """ - raise NotImplementedError() - - def iter_all_distributions(self) -> Iterator[BaseDistribution]: - """Iterate through all installed distributions without any filtering.""" - for dist in self._iter_distributions(): - # Make sure the distribution actually comes from a valid Python - # packaging distribution. Pip's AdjacentTempDirectory leaves folders - # e.g. ``~atplotlib.dist-info`` if cleanup was interrupted. The - # valid project name pattern is taken from PEP 508. - project_name_valid = re.match( - r"^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$", - dist.canonical_name, - flags=re.IGNORECASE, - ) - if not project_name_valid: - logger.warning( - "Ignoring invalid distribution %s (%s)", - dist.canonical_name, - dist.location, - ) - continue - yield dist - - def iter_installed_distributions( - self, - local_only: bool = True, - skip: Container[str] = stdlib_pkgs, - include_editables: bool = True, - editables_only: bool = False, - user_only: bool = False, - ) -> Iterator[BaseDistribution]: - """Return a list of installed distributions. - - This is based on ``iter_all_distributions()`` with additional filtering - options. Note that ``iter_installed_distributions()`` without arguments - is *not* equal to ``iter_all_distributions()``, since some of the - configurations exclude packages by default. - - :param local_only: If True (default), only return installations - local to the current virtualenv, if in a virtualenv. - :param skip: An iterable of canonicalized project names to ignore; - defaults to ``stdlib_pkgs``. - :param include_editables: If False, don't report editables. - :param editables_only: If True, only report editables. - :param user_only: If True, only report installations in the user - site directory. - """ - it = self.iter_all_distributions() - if local_only: - it = (d for d in it if d.local) - if not include_editables: - it = (d for d in it if not d.editable) - if editables_only: - it = (d for d in it if d.editable) - if user_only: - it = (d for d in it if d.in_usersite) - return (d for d in it if d.canonical_name not in skip) - - -class Wheel(Protocol): - location: str - - def as_zipfile(self) -> zipfile.ZipFile: - raise NotImplementedError() - - -class FilesystemWheel(Wheel): - def __init__(self, location: str) -> None: - self.location = location - - def as_zipfile(self) -> zipfile.ZipFile: - return zipfile.ZipFile(self.location, allowZip64=True) - - -class MemoryWheel(Wheel): - def __init__(self, location: str, stream: IO[bytes]) -> None: - self.location = location - self.stream = stream - - def as_zipfile(self) -> zipfile.ZipFile: - return zipfile.ZipFile(self.stream, allowZip64=True) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__init__.py b/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__init__.py deleted file mode 100644 index a779138..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -from ._dists import Distribution -from ._envs import Environment - -__all__ = ["NAME", "Distribution", "Environment"] - -NAME = "importlib" diff --git a/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 586dcd014ca14e2c05f24a5bd4189219a5e4e365..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 378 zcmX|7yGjE=6rIWLW;HR5U@MkxkqpsR1R*KS2W&G;c7|lgJeHZsO0bEQpI~QU=ePI= z3jxu}PDq!^yS{F5?zx<EAKaH-uY(|p$J_Zm<oBldi`FmMo&tG59C56W#yQ3fZ>g4! z@(80D;?Wb%V;<+pD#_X(80;CY4@S}lC#TCGt%15bHkEYNXkkJY)$!!&dh8<bx)`9| zm%6krC^?;E?Yd1lbo+0;PN*=I|FNZ%GNmYW2{b*UEg;&h$=qr|Gz-2WBU>z+9i9ZC z#LO|>_dym5;riU(7-bn3j#My`z%o*<!rYqk!SIZD8AQKi#e&U*C#5V2l_m&hm?ByP z##vzG|4c$bm4VVhx!UbrXv>#MT)G|{)O^4n0enUn;|)65pyRjBaGk!Uhj+2-g7O6) Clx(>G diff --git a/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-312.pyc deleted file mode 100644 index 27749de8d3c8ad1c8dca790f35ce5b3e14df171f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3353 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 K*AHpXPyY{4U_bc) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-312.pyc deleted file mode 100644 index f2f900952aff3bfbd791502cff67e90b498edc7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13445 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-312.pyc deleted file mode 100644 index 6d909cdee750ed67ed3b6c3c67c91b358949bce0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11200 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 J!-)yo{{rj4ixU6< diff --git a/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_compat.py b/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_compat.py deleted file mode 100644 index 593bff2..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_compat.py +++ /dev/null @@ -1,55 +0,0 @@ -import importlib.metadata -from typing import Any, Optional, Protocol, cast - - -class BadMetadata(ValueError): - def __init__(self, dist: importlib.metadata.Distribution, *, reason: str) -> None: - self.dist = dist - self.reason = reason - - def __str__(self) -> str: - return f"Bad metadata in {self.dist} ({self.reason})" - - -class BasePath(Protocol): - """A protocol that various path objects conform. - - This exists because importlib.metadata uses both ``pathlib.Path`` and - ``zipfile.Path``, and we need a common base for type hints (Union does not - work well since ``zipfile.Path`` is too new for our linter setup). - - This does not mean to be exhaustive, but only contains things that present - in both classes *that we need*. - """ - - @property - def name(self) -> str: - raise NotImplementedError() - - @property - def parent(self) -> "BasePath": - raise NotImplementedError() - - -def get_info_location(d: importlib.metadata.Distribution) -> Optional[BasePath]: - """Find the path to the distribution's metadata directory. - - HACK: This relies on importlib.metadata's private ``_path`` attribute. Not - all distributions exist on disk, so importlib.metadata is correct to not - expose the attribute as public. But pip's code base is old and not as clean, - so we do this to avoid having to rewrite too many things. Hopefully we can - eliminate this some day. - """ - return getattr(d, "_path", None) - - -def get_dist_name(dist: importlib.metadata.Distribution) -> str: - """Get the distribution's project name. - - The ``name`` attribute is only available in Python 3.10 or later. We are - targeting exactly that, but Mypy does not know this. - """ - name = cast(Any, dist).name - if not isinstance(name, str): - raise BadMetadata(dist, reason="invalid metadata entry 'name'") - return name diff --git a/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_dists.py b/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_dists.py deleted file mode 100644 index 26370fa..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_dists.py +++ /dev/null @@ -1,227 +0,0 @@ -import email.message -import importlib.metadata -import os -import pathlib -import zipfile -from typing import ( - Collection, - Dict, - Iterable, - Iterator, - Mapping, - Optional, - Sequence, - cast, -) - -from pip._vendor.packaging.requirements import Requirement -from pip._vendor.packaging.utils import NormalizedName, canonicalize_name -from pip._vendor.packaging.version import parse as parse_version - -from pip._internal.exceptions import InvalidWheel, UnsupportedWheel -from pip._internal.metadata.base import ( - BaseDistribution, - BaseEntryPoint, - DistributionVersion, - InfoPath, - Wheel, -) -from pip._internal.utils.misc import normalize_path -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.utils.wheel import parse_wheel, read_wheel_metadata_file - -from ._compat import BasePath, get_dist_name - - -class WheelDistribution(importlib.metadata.Distribution): - """An ``importlib.metadata.Distribution`` read from a wheel. - - Although ``importlib.metadata.PathDistribution`` accepts ``zipfile.Path``, - its implementation is too "lazy" for pip's needs (we can't keep the ZipFile - handle open for the entire lifetime of the distribution object). - - This implementation eagerly reads the entire metadata directory into the - memory instead, and operates from that. - """ - - def __init__( - self, - files: Mapping[pathlib.PurePosixPath, bytes], - info_location: pathlib.PurePosixPath, - ) -> None: - self._files = files - self.info_location = info_location - - @classmethod - def from_zipfile( - cls, - zf: zipfile.ZipFile, - name: str, - location: str, - ) -> "WheelDistribution": - info_dir, _ = parse_wheel(zf, name) - paths = ( - (name, pathlib.PurePosixPath(name.split("/", 1)[-1])) - for name in zf.namelist() - if name.startswith(f"{info_dir}/") - ) - files = { - relpath: read_wheel_metadata_file(zf, fullpath) - for fullpath, relpath in paths - } - info_location = pathlib.PurePosixPath(location, info_dir) - return cls(files, info_location) - - def iterdir(self, path: InfoPath) -> Iterator[pathlib.PurePosixPath]: - # Only allow iterating through the metadata directory. - if pathlib.PurePosixPath(str(path)) in self._files: - return iter(self._files) - raise FileNotFoundError(path) - - def read_text(self, filename: str) -> Optional[str]: - try: - data = self._files[pathlib.PurePosixPath(filename)] - except KeyError: - return None - try: - text = data.decode("utf-8") - except UnicodeDecodeError as e: - wheel = self.info_location.parent - error = f"Error decoding metadata for {wheel}: {e} in {filename} file" - raise UnsupportedWheel(error) - return text - - -class Distribution(BaseDistribution): - def __init__( - self, - dist: importlib.metadata.Distribution, - info_location: Optional[BasePath], - installed_location: Optional[BasePath], - ) -> None: - self._dist = dist - self._info_location = info_location - self._installed_location = installed_location - - @classmethod - def from_directory(cls, directory: str) -> BaseDistribution: - info_location = pathlib.Path(directory) - dist = importlib.metadata.Distribution.at(info_location) - return cls(dist, info_location, info_location.parent) - - @classmethod - def from_metadata_file_contents( - cls, - metadata_contents: bytes, - filename: str, - project_name: str, - ) -> BaseDistribution: - # Generate temp dir to contain the metadata file, and write the file contents. - temp_dir = pathlib.Path( - TempDirectory(kind="metadata", globally_managed=True).path - ) - metadata_path = temp_dir / "METADATA" - metadata_path.write_bytes(metadata_contents) - # Construct dist pointing to the newly created directory. - dist = importlib.metadata.Distribution.at(metadata_path.parent) - return cls(dist, metadata_path.parent, None) - - @classmethod - def from_wheel(cls, wheel: Wheel, name: str) -> BaseDistribution: - try: - with wheel.as_zipfile() as zf: - dist = WheelDistribution.from_zipfile(zf, name, wheel.location) - except zipfile.BadZipFile as e: - raise InvalidWheel(wheel.location, name) from e - except UnsupportedWheel as e: - raise UnsupportedWheel(f"{name} has an invalid wheel, {e}") - return cls(dist, dist.info_location, pathlib.PurePosixPath(wheel.location)) - - @property - def location(self) -> Optional[str]: - if self._info_location is None: - return None - return str(self._info_location.parent) - - @property - def info_location(self) -> Optional[str]: - if self._info_location is None: - return None - return str(self._info_location) - - @property - def installed_location(self) -> Optional[str]: - if self._installed_location is None: - return None - return normalize_path(str(self._installed_location)) - - def _get_dist_name_from_location(self) -> Optional[str]: - """Try to get the name from the metadata directory name. - - This is much faster than reading metadata. - """ - if self._info_location is None: - return None - stem, suffix = os.path.splitext(self._info_location.name) - if suffix not in (".dist-info", ".egg-info"): - return None - return stem.split("-", 1)[0] - - @property - def canonical_name(self) -> NormalizedName: - name = self._get_dist_name_from_location() or get_dist_name(self._dist) - return canonicalize_name(name) - - @property - def version(self) -> DistributionVersion: - return parse_version(self._dist.version) - - def is_file(self, path: InfoPath) -> bool: - return self._dist.read_text(str(path)) is not None - - def iter_distutils_script_names(self) -> Iterator[str]: - # A distutils installation is always "flat" (not in e.g. egg form), so - # if this distribution's info location is NOT a pathlib.Path (but e.g. - # zipfile.Path), it can never contain any distutils scripts. - if not isinstance(self._info_location, pathlib.Path): - return - for child in self._info_location.joinpath("scripts").iterdir(): - yield child.name - - def read_text(self, path: InfoPath) -> str: - content = self._dist.read_text(str(path)) - if content is None: - raise FileNotFoundError(path) - return content - - def iter_entry_points(self) -> Iterable[BaseEntryPoint]: - # importlib.metadata's EntryPoint structure sasitfies BaseEntryPoint. - return self._dist.entry_points - - def _metadata_impl(self) -> email.message.Message: - # From Python 3.10+, importlib.metadata declares PackageMetadata as the - # return type. This protocol is unfortunately a disaster now and misses - # a ton of fields that we need, including get() and get_payload(). We - # rely on the implementation that the object is actually a Message now, - # until upstream can improve the protocol. (python/cpython#94952) - return cast(email.message.Message, self._dist.metadata) - - def iter_provided_extras(self) -> Iterable[str]: - return self.metadata.get_all("Provides-Extra", []) - - def is_extra_provided(self, extra: str) -> bool: - return any( - canonicalize_name(provided_extra) == canonicalize_name(extra) - for provided_extra in self.metadata.get_all("Provides-Extra", []) - ) - - def iter_dependencies(self, extras: Collection[str] = ()) -> Iterable[Requirement]: - contexts: Sequence[Dict[str, str]] = [{"extra": e} for e in extras] - for req_string in self.metadata.get_all("Requires-Dist", []): - req = Requirement(req_string) - if not req.marker: - yield req - elif not extras and req.marker.evaluate({"extra": ""}): - yield req - elif any(req.marker.evaluate(context) for context in contexts): - yield req diff --git a/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py b/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py deleted file mode 100644 index 048dc55..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py +++ /dev/null @@ -1,189 +0,0 @@ -import functools -import importlib.metadata -import logging -import os -import pathlib -import sys -import zipfile -import zipimport -from typing import Iterator, List, Optional, Sequence, Set, Tuple - -from pip._vendor.packaging.utils import NormalizedName, canonicalize_name - -from pip._internal.metadata.base import BaseDistribution, BaseEnvironment -from pip._internal.models.wheel import Wheel -from pip._internal.utils.deprecation import deprecated -from pip._internal.utils.filetypes import WHEEL_EXTENSION - -from ._compat import BadMetadata, BasePath, get_dist_name, get_info_location -from ._dists import Distribution - -logger = logging.getLogger(__name__) - - -def _looks_like_wheel(location: str) -> bool: - if not location.endswith(WHEEL_EXTENSION): - return False - if not os.path.isfile(location): - return False - if not Wheel.wheel_file_re.match(os.path.basename(location)): - return False - return zipfile.is_zipfile(location) - - -class _DistributionFinder: - """Finder to locate distributions. - - The main purpose of this class is to memoize found distributions' names, so - only one distribution is returned for each package name. At lot of pip code - assumes this (because it is setuptools's behavior), and not doing the same - can potentially cause a distribution in lower precedence path to override a - higher precedence one if the caller is not careful. - - Eventually we probably want to make it possible to see lower precedence - installations as well. It's useful feature, after all. - """ - - FoundResult = Tuple[importlib.metadata.Distribution, Optional[BasePath]] - - def __init__(self) -> None: - self._found_names: Set[NormalizedName] = set() - - def _find_impl(self, location: str) -> Iterator[FoundResult]: - """Find distributions in a location.""" - # Skip looking inside a wheel. Since a package inside a wheel is not - # always valid (due to .data directories etc.), its .dist-info entry - # should not be considered an installed distribution. - if _looks_like_wheel(location): - return - # To know exactly where we find a distribution, we have to feed in the - # paths one by one, instead of dumping the list to importlib.metadata. - for dist in importlib.metadata.distributions(path=[location]): - info_location = get_info_location(dist) - try: - raw_name = get_dist_name(dist) - except BadMetadata as e: - logger.warning("Skipping %s due to %s", info_location, e.reason) - continue - normalized_name = canonicalize_name(raw_name) - if normalized_name in self._found_names: - continue - self._found_names.add(normalized_name) - yield dist, info_location - - def find(self, location: str) -> Iterator[BaseDistribution]: - """Find distributions in a location. - - The path can be either a directory, or a ZIP archive. - """ - for dist, info_location in self._find_impl(location): - if info_location is None: - installed_location: Optional[BasePath] = None - else: - installed_location = info_location.parent - yield Distribution(dist, info_location, installed_location) - - def find_linked(self, location: str) -> Iterator[BaseDistribution]: - """Read location in egg-link files and return distributions in there. - - The path should be a directory; otherwise this returns nothing. This - follows how setuptools does this for compatibility. The first non-empty - line in the egg-link is read as a path (resolved against the egg-link's - containing directory if relative). Distributions found at that linked - location are returned. - """ - path = pathlib.Path(location) - if not path.is_dir(): - return - for child in path.iterdir(): - if child.suffix != ".egg-link": - continue - with child.open() as f: - lines = (line.strip() for line in f) - target_rel = next((line for line in lines if line), "") - if not target_rel: - continue - target_location = str(path.joinpath(target_rel)) - for dist, info_location in self._find_impl(target_location): - yield Distribution(dist, info_location, path) - - def _find_eggs_in_dir(self, location: str) -> Iterator[BaseDistribution]: - from pip._vendor.pkg_resources import find_distributions - - from pip._internal.metadata import pkg_resources as legacy - - with os.scandir(location) as it: - for entry in it: - if not entry.name.endswith(".egg"): - continue - for dist in find_distributions(entry.path): - yield legacy.Distribution(dist) - - def _find_eggs_in_zip(self, location: str) -> Iterator[BaseDistribution]: - from pip._vendor.pkg_resources import find_eggs_in_zip - - from pip._internal.metadata import pkg_resources as legacy - - try: - importer = zipimport.zipimporter(location) - except zipimport.ZipImportError: - return - for dist in find_eggs_in_zip(importer, location): - yield legacy.Distribution(dist) - - def find_eggs(self, location: str) -> Iterator[BaseDistribution]: - """Find eggs in a location. - - This actually uses the old *pkg_resources* backend. We likely want to - deprecate this so we can eventually remove the *pkg_resources* - dependency entirely. Before that, this should first emit a deprecation - warning for some versions when using the fallback since importing - *pkg_resources* is slow for those who don't need it. - """ - if os.path.isdir(location): - yield from self._find_eggs_in_dir(location) - if zipfile.is_zipfile(location): - yield from self._find_eggs_in_zip(location) - - -@functools.lru_cache(maxsize=None) # Warn a distribution exactly once. -def _emit_egg_deprecation(location: Optional[str]) -> None: - deprecated( - reason=f"Loading egg at {location} is deprecated.", - replacement="to use pip for package installation.", - gone_in="24.3", - issue=12330, - ) - - -class Environment(BaseEnvironment): - def __init__(self, paths: Sequence[str]) -> None: - self._paths = paths - - @classmethod - def default(cls) -> BaseEnvironment: - return cls(sys.path) - - @classmethod - def from_paths(cls, paths: Optional[List[str]]) -> BaseEnvironment: - if paths is None: - return cls(sys.path) - return cls(paths) - - def _iter_distributions(self) -> Iterator[BaseDistribution]: - finder = _DistributionFinder() - for location in self._paths: - yield from finder.find(location) - for dist in finder.find_eggs(location): - _emit_egg_deprecation(dist.location) - yield dist - # This must go last because that's how pkg_resources tie-breaks. - yield from finder.find_linked(location) - - def get_distribution(self, name: str) -> Optional[BaseDistribution]: - matches = ( - distribution - for distribution in self.iter_all_distributions() - if distribution.canonical_name == canonicalize_name(name) - ) - return next(matches, None) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py b/venv/lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py deleted file mode 100644 index bb11e5b..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py +++ /dev/null @@ -1,278 +0,0 @@ -import email.message -import email.parser -import logging -import os -import zipfile -from typing import Collection, Iterable, Iterator, List, Mapping, NamedTuple, Optional - -from pip._vendor import pkg_resources -from pip._vendor.packaging.requirements import Requirement -from pip._vendor.packaging.utils import NormalizedName, canonicalize_name -from pip._vendor.packaging.version import parse as parse_version - -from pip._internal.exceptions import InvalidWheel, NoneMetadataError, UnsupportedWheel -from pip._internal.utils.egg_link import egg_link_path_from_location -from pip._internal.utils.misc import display_path, normalize_path -from pip._internal.utils.wheel import parse_wheel, read_wheel_metadata_file - -from .base import ( - BaseDistribution, - BaseEntryPoint, - BaseEnvironment, - DistributionVersion, - InfoPath, - Wheel, -) - -__all__ = ["NAME", "Distribution", "Environment"] - -logger = logging.getLogger(__name__) - -NAME = "pkg_resources" - - -class EntryPoint(NamedTuple): - name: str - value: str - group: str - - -class InMemoryMetadata: - """IMetadataProvider that reads metadata files from a dictionary. - - This also maps metadata decoding exceptions to our internal exception type. - """ - - def __init__(self, metadata: Mapping[str, bytes], wheel_name: str) -> None: - self._metadata = metadata - self._wheel_name = wheel_name - - def has_metadata(self, name: str) -> bool: - return name in self._metadata - - def get_metadata(self, name: str) -> str: - try: - return self._metadata[name].decode() - except UnicodeDecodeError as e: - # Augment the default error with the origin of the file. - raise UnsupportedWheel( - f"Error decoding metadata for {self._wheel_name}: {e} in {name} file" - ) - - def get_metadata_lines(self, name: str) -> Iterable[str]: - return pkg_resources.yield_lines(self.get_metadata(name)) - - def metadata_isdir(self, name: str) -> bool: - return False - - def metadata_listdir(self, name: str) -> List[str]: - return [] - - def run_script(self, script_name: str, namespace: str) -> None: - pass - - -class Distribution(BaseDistribution): - def __init__(self, dist: pkg_resources.Distribution) -> None: - self._dist = dist - - @classmethod - def from_directory(cls, directory: str) -> BaseDistribution: - dist_dir = directory.rstrip(os.sep) - - # Build a PathMetadata object, from path to metadata. :wink: - base_dir, dist_dir_name = os.path.split(dist_dir) - metadata = pkg_resources.PathMetadata(base_dir, dist_dir) - - # Determine the correct Distribution object type. - if dist_dir.endswith(".egg-info"): - dist_cls = pkg_resources.Distribution - dist_name = os.path.splitext(dist_dir_name)[0] - else: - assert dist_dir.endswith(".dist-info") - dist_cls = pkg_resources.DistInfoDistribution - dist_name = os.path.splitext(dist_dir_name)[0].split("-")[0] - - dist = dist_cls(base_dir, project_name=dist_name, metadata=metadata) - return cls(dist) - - @classmethod - def from_metadata_file_contents( - cls, - metadata_contents: bytes, - filename: str, - project_name: str, - ) -> BaseDistribution: - metadata_dict = { - "METADATA": metadata_contents, - } - dist = pkg_resources.DistInfoDistribution( - location=filename, - metadata=InMemoryMetadata(metadata_dict, filename), - project_name=project_name, - ) - return cls(dist) - - @classmethod - def from_wheel(cls, wheel: Wheel, name: str) -> BaseDistribution: - try: - with wheel.as_zipfile() as zf: - info_dir, _ = parse_wheel(zf, name) - metadata_dict = { - path.split("/", 1)[-1]: read_wheel_metadata_file(zf, path) - for path in zf.namelist() - if path.startswith(f"{info_dir}/") - } - except zipfile.BadZipFile as e: - raise InvalidWheel(wheel.location, name) from e - except UnsupportedWheel as e: - raise UnsupportedWheel(f"{name} has an invalid wheel, {e}") - dist = pkg_resources.DistInfoDistribution( - location=wheel.location, - metadata=InMemoryMetadata(metadata_dict, wheel.location), - project_name=name, - ) - return cls(dist) - - @property - def location(self) -> Optional[str]: - return self._dist.location - - @property - def installed_location(self) -> Optional[str]: - egg_link = egg_link_path_from_location(self.raw_name) - if egg_link: - location = egg_link - elif self.location: - location = self.location - else: - return None - return normalize_path(location) - - @property - def info_location(self) -> Optional[str]: - return self._dist.egg_info - - @property - def installed_by_distutils(self) -> bool: - # A distutils-installed distribution is provided by FileMetadata. This - # provider has a "path" attribute not present anywhere else. Not the - # best introspection logic, but pip has been doing this for a long time. - try: - return bool(self._dist._provider.path) - except AttributeError: - return False - - @property - def canonical_name(self) -> NormalizedName: - return canonicalize_name(self._dist.project_name) - - @property - def version(self) -> DistributionVersion: - return parse_version(self._dist.version) - - def is_file(self, path: InfoPath) -> bool: - return self._dist.has_metadata(str(path)) - - def iter_distutils_script_names(self) -> Iterator[str]: - yield from self._dist.metadata_listdir("scripts") - - def read_text(self, path: InfoPath) -> str: - name = str(path) - if not self._dist.has_metadata(name): - raise FileNotFoundError(name) - content = self._dist.get_metadata(name) - if content is None: - raise NoneMetadataError(self, name) - return content - - def iter_entry_points(self) -> Iterable[BaseEntryPoint]: - for group, entries in self._dist.get_entry_map().items(): - for name, entry_point in entries.items(): - name, _, value = str(entry_point).partition("=") - yield EntryPoint(name=name.strip(), value=value.strip(), group=group) - - def _metadata_impl(self) -> email.message.Message: - """ - :raises NoneMetadataError: if the distribution reports `has_metadata()` - True but `get_metadata()` returns None. - """ - if isinstance(self._dist, pkg_resources.DistInfoDistribution): - metadata_name = "METADATA" - else: - metadata_name = "PKG-INFO" - try: - metadata = self.read_text(metadata_name) - except FileNotFoundError: - if self.location: - displaying_path = display_path(self.location) - else: - displaying_path = repr(self.location) - logger.warning("No metadata found in %s", displaying_path) - metadata = "" - feed_parser = email.parser.FeedParser() - feed_parser.feed(metadata) - return feed_parser.close() - - def iter_dependencies(self, extras: Collection[str] = ()) -> Iterable[Requirement]: - if extras: # pkg_resources raises on invalid extras, so we sanitize. - extras = frozenset(pkg_resources.safe_extra(e) for e in extras) - extras = extras.intersection(self._dist.extras) - return self._dist.requires(extras) - - def iter_provided_extras(self) -> Iterable[str]: - return self._dist.extras - - def is_extra_provided(self, extra: str) -> bool: - return pkg_resources.safe_extra(extra) in self._dist.extras - - -class Environment(BaseEnvironment): - def __init__(self, ws: pkg_resources.WorkingSet) -> None: - self._ws = ws - - @classmethod - def default(cls) -> BaseEnvironment: - return cls(pkg_resources.working_set) - - @classmethod - def from_paths(cls, paths: Optional[List[str]]) -> BaseEnvironment: - return cls(pkg_resources.WorkingSet(paths)) - - def _iter_distributions(self) -> Iterator[BaseDistribution]: - for dist in self._ws: - yield Distribution(dist) - - def _search_distribution(self, name: str) -> Optional[BaseDistribution]: - """Find a distribution matching the ``name`` in the environment. - - This searches from *all* distributions available in the environment, to - match the behavior of ``pkg_resources.get_distribution()``. - """ - canonical_name = canonicalize_name(name) - for dist in self.iter_all_distributions(): - if dist.canonical_name == canonical_name: - return dist - return None - - def get_distribution(self, name: str) -> Optional[BaseDistribution]: - # Search the distribution by looking through the working set. - dist = self._search_distribution(name) - if dist: - return dist - - # If distribution could not be found, call working_set.require to - # update the working set, and try to find the distribution again. - # This might happen for e.g. when you install a package twice, once - # using setup.py develop and again using setup.py install. Now when - # running pip uninstall twice, the package gets removed from the - # working set in the first uninstall, so we have to populate the - # working set again so that pip knows about it and the packages gets - # picked up and is successfully uninstalled the second time too. - try: - # We didn't pass in any version specifiers, so this can never - # raise pkg_resources.VersionConflict. - self._ws.require(name) - except pkg_resources.DistributionNotFound: - return None - return self._search_distribution(name) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/models/__init__.py b/venv/lib/python3.12/site-packages/pip/_internal/models/__init__.py deleted file mode 100644 index 7855226..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/models/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -"""A package that contains models that represent entities. -""" diff --git a/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 479a07a746cfa27c22eeffe878b626c57a43a94c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 286 zcmXv~J5B>J5VeyCqDZ-e+Z4Maph<y1NYosF#xnLOYsEj=lSK;$p`+(4+<=w~AkwA6 ztAr<w=DnxU=*@gCmkU;*-(S1i+P_Ef4}K#1c_nYmutzrV)#PP;Cz8@zwLw9hBB5g- zWkV4@8g%7oW=t6i1`@R_SuE}1Va31Br8H4X`N8(%`U621J%U$Mdbp2z=j(g{LWi5I zd{fBkE#}6==is6;n4!negR@VN2I^wCYA-IKSi<I%sz9;{qz!~QC<n(_Agg0Z$~Fy$ d`E@mS4sY^V4KW^C#y|W_Ip@C<&S!a6<sU~;R*nDw diff --git a/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/candidate.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/candidate.cpython-312.pyc deleted file mode 100644 index b839389bc6c073202ce5517defae8b63ef606d22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1925 zcmb7EO>Epm6rNezyWVZmgf?lKLMl^whznVlHYbRpmR3O2uu{`XsJ>XnGn=^a+S?g# z=%zu+ArgrMf*w$UDt-i)MnMoxa11AqxTNAhu-Xeh2W~4Z5mipS@!DZqEeA&OdvD%* z<9YMFpC7xs3ka6;@vWK9C4_zxn{+9O&>RP06%j<Rhbq|2U?FEbsUn+lEK8nJ$(mV= zGUydV<RwHDn%#i^iDl;MSv~is5Oo|WRhw}Nf;{Q^v%vc<(fUg^r{qFV0ULeIz3KXn z@J^SS2+gY?ybY01WMYEM48f)}4Uv3?O_@kkAu@b$Gs%)%SzShDOw^?=Ge@#iDQ8H2 zNjB9)E`Xe0MmMopxPtTpQU8R`L)-K0&<*?xwohDQhje~)idGrr)DO94Yt<kG$+bQ0 zgp<0Q(8>YR+_uxjbt#g4yF#Pf9AzB-7s(#HmE|FPCg5fVfJ9kF!y5BTjtskW3Csm< z%`bs`fLGB1UO-lAMPY&|LJOG<+){%*lR7L&u-o?uQ{>Q!ynx>Ahg0Z!>e|LZ+a5z= z0d2O;DG|$3*p+I(z#GZU7}b%UDe0L=nx*yVAfaW~cl~M0@odiZT>SQ^JI=k8pwb3~ z!fRE^BGt0sRA^Z&2UqAyBy;MOAIB|kwf<^ZT%e`FTHLD{GeLzK6+7f}#>K#?RYcB= zka~2Q*_9C<y3Q<RBP4j!_X3+xX3SB4&hXqfjA}ic3H-Cg=g%124e3bLc4qBq%8ja9 zH6WspGT-)$N<gT`js46Qt95n=0+>JEv382-V+36MRUi)+(N5pdW%-@_{ehF8zW&p| z2*_QD>UXt!C3jCfy7NT;>fr6cwTqujemHse<X8H-zTG=||H;!01?2~Kk(4hq;a|u} zvM*$`Uo`|a(5d)(yES%+bH86Fi3-^N$$i?<&@q|Pygt_P-NUz@W^X;G{Y&+6U5>KQ zC6JuQa=DJ#VTgf?Xf+1)i9`)B=sC;!Z&+LQBjVsGAb@Jm3qSXqzt?kqr>pn9iIoY# zCRZktT{9>578*#-7nnHn2ymjn<8~9H1)8m6d)$FR1C|cp-GSlL89=Z|A7ue3xisIW z?bnPpoD{z{FKc$F?O~mXCS`*_+F{5+b%z3lp^hL!amD5#acmd}fN<!@s(xF4e`x#o zna$B}#=aigEN;nLSHHjZ-L<VtKit^vxxB4jjv;_~2QZ5fWm!?dvY@hSo{+mN>qgD? z5(~sY0teL4aoh_+4x$9tGBGUT(r3qnB!Y;#ldg2A=UJAHSs!TQ7oCd}8@F^!L~rw# zfjnG7zsTdi_CC8f(U4W8uy&<^fZaVCvrQ7SZ^K=oZ1gGM@Jtf{YaGPN6ka?0HxfL4 zQT*eQu0})9vqhLNJ_%T{)yOc0is{G^xn{jUqQTfPZSG>Lxr_0f7SD^0J!-FouE!HE zCfY5&aUHd87nQrGj<s+cXF6;}NppcrL&6w8K<EBIryige|H=;FDZKsE>0Km*`1n8A CPRs8A diff --git a/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-312.pyc deleted file mode 100644 index 73df16d74489526dfa527776faaff46c4356006a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11219 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 F{|5!&1iJtL diff --git a/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/format_control.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/format_control.cpython-312.pyc deleted file mode 100644 index a3a1e2aab3d2eec62ee1d01be612bbcc6580b05b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4247 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/index.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/index.cpython-312.pyc deleted file mode 100644 index 1f0b2187a8d76d5202e2d7fade717e2128ef19f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1714 zcmZ`(L2nyH6rNr0+8f7_Tavhz323Dtkkcj$N!1_(2+>L;5(-g)3i&cxcE<6#>)q|l zIMl|6AVngPK!^hhCseo)6b>Bu4_soURnny=IB_!s)T$@m?Ane&>PY+Ey!YnKy!qZY z`^&^c7Qt}7`M8$W5c*vjg8_CtPFFzfA%ckFp^BoSw-8ac5lJ1W$%2ZiBB~ON=s%{1 zzEteX5M#urwUqMMA2MmpNm3J;?i=w*pTb!b&LOCx5~Y&bfYZKHDjG>qooMjsBwbDK zpsGSL+qp`b7}7`esz%1PwMu3O-Bv2byQrLva_hEp)83$~KB2eUZ(gS%qn!GJo3_~x znQ_dtePV_z*mMcyCbhXsnQ1!?<=hm3NqrIqF65Q<DAi<Ml=i9c0w>CHw-I_2OP>+8 zLN}gGR$cIM5imF#lb~U{KGWfjYz#z{W>hqpzviU+*Op4o<#+lQh_94ABtR!)H`PI( zL;6AAR!~RjAlwHZAu)gt)r~>UnXZqY%?GoNa-byhdT!u5)3En&#}2CJ&mw~v8Ro;< z;h9fZs}9bBwetS)=%`@D)RSfll~Zd`Isr4%B#`CtNaxLvvdF;L^<9B+3}KW8tUdR` zNDpnsX=H%OL(dgV)*Ma92H<MIaA=Df%Ycu`0%PRMTBLF6RY!U;hOy(>oMX%--A&Wn zdVI^O1r2I7Y{56JYk|{jNXl4(dUS)?jd?Cy=O$(IB>2ep0-I1~ZBl>Jf~u^rC2E1c zwD8iR#a%(?!-Rm`3f<6xdkD&W+p`)0p&qwf$;*YX#U#e<=~1>W3~ntU;~2!FE%d;c z*v)i};$5S3GFjNsJ~JK^X7;=<z2m~gZsFqo)uY0T$A#r?VHslMC#7ePOP9K(OZy)j zm9Bs%e^Q(|F3xp}bNg40ii_Zx=w;D!u=t)~p286bum{+jA+^9IVTp-(116)itdFjO zm>hM<^8XE>#gI;CA)sJCA6}}mR@T@#2(t4aq73w~4(~1QQ(0wGGExM=Wr}ICf^<xR zXqWzr*=X~pWx_Kc0Jr?~7oFYCaelU&pS^SK`;~83_Q_Fx>CjkW7hpwsOtQ?k8x-Rx zi!rpP2`?B&IgD>LZLc56V0g?9xPdj?3k0wxN^!yB_Qmx8{}Mhq)blVdD=e-;KDIZK zswJFE3i<JuK|I<<_qDfwJ9m9+wWnqE<*%>y5U8J=Sp7`?kyfv$=$G%z_7JH3*@sfa zmB(AP&)0+q`70LCFLW0Iwqdmk@*l*3Tau5pfD1}w04kD%Y8M6>f^q??25C=Ad;STz zdXxizf#wVG+e<no?-6P1t@YK&cn^~0><5$-C;Rl+cr}6Zb@n`%5(>TuqL)$><ySQM tF#VKr`A;Op95SX3r(QUG?ftu%8(Z4_@e3!~%;DlYf2Y)(`iT+m`7fq-oNWLA diff --git a/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-312.pyc deleted file mode 100644 index fefcf198f9c35109c4ecfe52038a8605202316a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2292 zcmZ`4O>7iZ_|4D$ciE*s&~4pjfl^#bcR;B8Sd9dt;Gr?p5VFKf#+lc4+S!@qz1iZ{ zqQr3M!9+b6+JKgL5yHX5i}l9Q#7mckEP2sLq8z*}Ez!uy@6GH$S?WvXoA2*^@B4e- z`z4u-BUt)3A5Dr0g#O?}u;eDP{w^R_k%0`sLM5Rnl*FP~l8TbRd7>qkLdB4WOIElP zDMmb8wxXq2F(x1py^V~}6=Z~Oi@wETyc)?z|KdbmV$yND%H)%#?y~3@zEHuoj`ITR zFz~omv0N3~GbVBD61H7nCscI?6KXoPssh=5+NQ2%S!ZCQNibK^{X={hX%g$_0J(}V zDhdWFiiUtCEN6f>E*jz$xfsG>12~3^BRGm<<Dw^%!EgC?(?l`eA{C7=>`d@jp8BD= z;Mo~mc8JS5P2V?_Jadlf%^Y|}IWEDs-VWd@niJ-b>IpcgqP#E)A$F;o*~yDcrq~)M zP&Gukp<M3CC(5K#!b(YV>5OvH(JMS3RB^F|Cx})WqOPe=V=`no7j4VY3`~?6NUvg< zA1LLjJL%X53kP0NsOjRNvZhaK6PPMxv#fv%E+)2SDJ93i7FC)qdEr8QJl;aN%AzW0 zny#wO_BIQ%At8l8$Xkwba2eg-eRN*F7u~rI6k;-z@B#}H>{f{VT&BVx_A+G)ex|1Q zhL%O+??8{v3D?lqVo<eDf!<7aid$=0!5-KV^!^47;Bqfo7TLBre=6Fd2&63-B53o- zTNZGWEi51df2Ov)C^Mw%p-cZ`jr4=P^ox5)x7!hLH`llg+2w0aG~^NQKZf$5(b=w1 zCl@pgRCwIUjXNawRzAd%&#_s|q^bc`gv-p)s%B4PgT?p_z|;jaTEeboXs*W6PnjzI z&?Oqp$4M8Q$s(=;HguP4<CJWf_B7ef(PV{UqS8vaY?<8D1a?7@x-1zO_4cu_Z;yp3 zv?Vt9jL|Jh_$6Z!!Ibja=W;oc;+)Qn_e*V_J-cVK{@rj914Ujox&+`ddXVa<r*_;; z?O2H(U)g<Z`Oxyf%C6(9K%{mw+ECxldRD1rm3sDYEqi!1d$bWnJ$*}ki+znSIxzfW z?1$Jw=Tc@dQ_t+Xo7uNq@#OW)U@bEU8ky`;axr-=Rqr0Ibq_z<)0v9TOO3s#EnQD! z?<TT0`oA0ecJR-EeK+6x{`{@;s{=>pPpqVO*4lR6Pqoj-$yV@DZ<ZHOgm{B`SL!k# zFx~|h{{EUnQya%rlY0_<F6iO}(#7|ojV{5knhFIwp8e;9pozW|KkJe~`;y=WWB6%H z8{&0&3}k{QzX<QZC=(9kWfo~pcb0&;6O4KmX=a`!HogWj;dTix0qN&}-_N{A_;vBB z-JFYFok=fnXL~j&YqR8gK~7HqfJ$!f`L%c8!N{BSk+Zdtvwurs_m=yIj(j24)A?FD zf3yEyT3O@F$L;7PWwm$zqf9a#Z=hr>{_k2C_>|9&uex80j^^9=P_(rYR#g^PRhXX@ zi{ovodZD6OzJ%~Z5?&F)?=4H{mPRRb^`v7EZi`9OC4`sDkCX><3wcHLqvJz`a1eu! zjsduW8ln(7cJtiItEXy1r`Hh>&`05|4Y4QGvGVe<27>>xd*{T@9d}Os^zj-e*QG$A zab!y<zR<a#-#EB1x!Cs@0qLK|PZ`Z8SlF$WO?$%kiaY5=!Lm@e0#wd698&OK5zs1> zGy+c#^=iZ<(D91b)DE7P0?Y*d1y|Bfi5J^`egJP`FWx875kHe}kYV8QzNUQu8j>Ig czoUT~8hD6ae~5a2LnHr$6(PQc0C@ZV1Gw=g-2eap diff --git a/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/link.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/link.cpython-312.pyc deleted file mode 100644 index 8b1da69b67f2846659295fc0f638e7b51c25ac87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26022 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/scheme.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/scheme.cpython-312.pyc deleted file mode 100644 index 14160d1c08857be4b72c7e34267a3d563b2f1c63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1189 zcmZ`%&2AJq5O();&rfHP2}xE75&}ygtw!2RYYC^-YNZt$es)EKloNAlIqjNh3r~C2 z_DnL_IpmN7huw2-d*BxF2D}0<fck{s1qOnI#EJ6!AS9q9fBwpL+2yM5#qx4Q(9-|^ z$zJ<}ym8LLf;qXkf#i&E(k5NPy{BH=^T}Pp{ZqnA&oIha+aCqZ@c4OjM`>zDeK3?6 zqf)^vaC#_gMn!Hclag7Xa%$2HdSF`7G=R}A<e-_PY6yBL;E<{gWkV(;JCLwAO<B&V z%|K|Hs@%en{fQcYD6_V2eu-nQQq$^>Y^L&-(%pC`p1+ARhoe?zd-6Jy7IcnjZGV|i zD>@I0N*}Y6;sD7&!<1yeIA~K;OsYlSnj+xLvUK+88P?~{#VsUf1W4P%TKU{-mmp|| z+=ntR;RtYqILbIGyxOVr+G)_PjH=D3DDO|}acqC5Ge$EdxuJb#GeZwEk!F->paX-| zWX2VN9xwxx3k|7NT42FDN=FopX)8J`wO_Y@(TCIO;JxW%)`iyeye?tl+O=DU4$2NH z2t`?g9q4>7bxR9#9d{8Ie<GZbu{S2kVvme{^t^>TE}=J92qEJDJr_B(afseRV`M~{ z-kx?xo8=-fAUog9%D80QKPmmF<4pA+?lEhI@gFK3^dPq;wjiOaS#R4|kv;~!&DCKp zm1|`@gnSrdZ{wLzc3MB*jEz7!%xhxezUaq^Kz*T1WZY96q={#OMRgU`1UH3ElH<m# zSFOduIwod*L^vUnRkC&MN$_v|<>u9IOdDHIg8yn4c$74&?#7(;AW4cSN$|aabiAG< ze-D_P?^Kcm<&Dcr`?v4yKG;qE+I_TN)RM$VWeu*EjMaJtFFYr@fs<Z#P+Ndgsd<2K zO5XZ@Se;bKr7I`*CqX^D{OZ!iB*b}ACTl-TDvnhht2q`qw&YlyG}b1|j;)Yr<$VL$ z>?QZeUbCd#|MiB0>9d=TeNN?L_1D?ge$!jH;WT2dAWTZ0=e_kqFL<{~8n?ZZr4QwG L@A5l>Fpd5M3^Y3# diff --git a/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-312.pyc deleted file mode 100644 index 351511ec549c528c4157423cccbf1d1a3f8a54e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5108 zcmb7IU2Gf25#Hk+e?^IuNQwIK&)KqL)0WB9QR6yMBm+|7x>Zy+GFp^KK%ehU;!#H) zb9<C5nyQS#K;^=P#iA{hJ~T#<2fI#@q$m*gE$vGl`XWV6MO+j#KoOvQV=NVI3>4_> z9*>l1rAQax?(FaF%+7o>!#}sS`VbWH*H=>g9SHr6bnL>_h^;q)C?g3;jEWLg%On`u zcO)FNWfLrIxr7s1hw93>6K;mAWmQkcoA6SaQ+=71L<^;zsz1}3Xr;7EZOa4_flM$F zWRL^NO!}aGiAF1T+-0m@BIH14k>tLHB+p$(Z7e*`M7{qYorx%8a^ng%pluh0td><o zK~)NJGAm?cGI@Uf{5fddDFG)96-OOrTUOIE)}owXq|C4`OM+-5g}jkUPU%`Enb%d( z`jl0BYn`ndK$MY;h(tgdOoE*T3B181IN2$&vP*XNzzT`0Q%>0<xg<2@0S>skwPO<A z|FPBsYrWUFginIgrW}$F=oYC(c0<2*{uC$qVbnkGiME<8ld_<TsYy}G$%PkuJe23N zqL9ORRWM}C8!4GrHBm4WElYZW!RM45uV7x(vQx@*9=PWXjmPwu7(L()Yx<^?tdvxh z><l)2K+2biRIusEYDwDF{lJahN~$)fOqVVjc|9xInnZYY!jFaD*010-%V-)ca7AVe zy>cF*1!vKjuDvl?Y8Q#IUtS+D$X;5CPJ490Wz@frcG>fdHf_IEV+a*p_HNx#bitRo zbjyzE8rk>;gKoUUA%pNni~Vl+q7ksi(m|VQv_(gevvm}>JWIGVz|yRe4%<|tO-CBE zO*QVZ;4Zq;-S&8+l^ioi5yH%klSZ#Sn%-+ujaFi9z8S=zEW?4l6;Y9cd$MnFcWcs} zL{VqqyFQ{gq>Sn^=nXIMJM@azE~RDB;Dsqe)_L1}l<YLsu8R#-xoGJRIp-nsL(`cu zj2tc~k1O1qVx*eYQkP%NE4s{I7@v$!PL2=oDQ!-kg%1)H##rSunv_>%Udi(3=Z%z> zB}$yt;99eSq6(K(Ii{0$jRs5~HU!<k<SV)xhD?WsO^#Z-OTG+nflZf?%gI?uCpu($ z6=2NJG*ED-m=ct%=>lz6l}n~GC+Ju<J<zo%7Zy`;MmAllHa#utrh87%vmlD7$7Dqn zH=9N9QeIJwWJ5$IM~n*WNS>qSWxD9O686AFh~P+hcsZWZGIBg47<e{5riuBCoHcOV zkX3nF7cwWXp@=iGenQgbvZ^LXvL2t6v$Juyay&<c^Hl6>C*v6SI*}8^8DUz+ad?I} z7%#Az71TILQ&w@@vil?^_z}y^n=X+mK%ryD`^T&?f^GOuP+djUedtJZ)ze)G?|Xop z-eXH+l|bm`;`PN9d_T~?*%!TiXuU7K?AZ);mQR&Vm4{2iw~pQq9k2BDFOOCHdp7+2 zYySRQV;}jW)fU*l-GPFU8}pmp2VM`n7P#$O9UNQle*OXSwDvA@n?3tq-}Bm@jh@(A zPwcj_-ZQxDs)TyV&y}9Lb#^^;d^6lzo+wRJ9gd#E+bq}F^|=pq_Ey_r^XFj{3{@gW zDv<+~&b`}iF6gTw&g<I(F3`jyU`3n@1*;ekWmIH}C`ne)0w#l!b+{_B(5pEkgyzv5 zX2Q}u&g8JHPBke3CWu9zRX+@b=}E#PC`K|_2=A1!Jvs_&FcCFK*^l}TFL5^lmEJ?N z>E@TXpSJ2pU{<W(20BD{=-tzBD+;s>fGylP4HL~p|6uoVqs~#f4zZ2B)6C2%!1_D8 z?*+J<0k~rgVr{e(>)^A%8RUMnq-h9Z_iAHxplyr;kk<I4j)HiYrh*TG1K9<Han}yW z?QGfvU5ROcG=qwcT_L#sb#Mh44s>C+Rgxo3o~fxwY`U*$2)adw%};X+cR=YqkMGdW ze92e2ul`lZdF@M1A49fNYrc=&hhWXMD<^da4UWS-QF!J8pfimKc)&>h;9-0aVhK5e zVQ?0rENOtxsj`4&KBsH5ibPzC1);G**SMz55H|vlPLGiBGyIi>f@6R$gm=u*FoeuJ zqVz;bpMu}kNvOUJ9uABay#gM3fiddFQLJD0mrR*~=WOS|V1LWbF?tlXMH!vwCPamf z*pntpLL6cRHB)`)9h#Q2^5vX9TzGn?txn4T=_HCY3>l&%JG_bw5mLp&vHCu+3WU3$ z`aAmfRrKNB$$O*s_nmy_sf~T7*7i<*L80MCoe}0C<BJBYaEe4t;K7s($c+SD^oBa| z^g7Wj>WgqrRScc@eAAVc4fw3Sk1W_vDiTzfF6(|Km)4Xl1*E7;KSpMpAWj*ZAuH^K z`!~WnJx&&MJU#=?lgNfROTaNG7L-N4L=c7kuOO`#;V}FksIH<)uw%(t*~hPX`YJ7f zn<GCNSutK;d~NafgYS*JJF<Fm^uzt5l}KNCv9$OAwYQEevzv!c-|JsLJiHn_xa~sS z`^v>qaU(LY78zJQF|r;xv&>c7Q1_nlm7iU?J^1#szj?OiBr4q(D&5Dnoor`U)rZ;- zZ3K_41&^&Bf9|8;aJ3(fu0DZUJ8q6&AFl+DZUp0N!T3Aed){}wtIxc+{^Z1Z@H^YA zqqVK-LH;1QXT{%cEq-Dncw#Mhq7v>dpDUe%w|#%`gONXu+}}I79-iD{9qk?9nqZ?3 z1;aPzug|Y^t_Sw7diGN=H~nB7B*da=i&zI@5DpPJg?1f?A2X1fF$PdpksJ+rid$l) z7>T{+r@+7SjN0lkbdwbw(@1o@0x-P5LNo}Gpl$Fa#|=LRa|`Sw)C{HOP?RhD?j;)8 zH>VO)T0SfBvkI6qxV%_HiF`gwMIe?;$>NN)544B!#zWXf;<*e2S^Uu{MaKrQeww9_ zG|s{SUdT%IQ}TcvMharR`WcX}fV`x<2w<YBjX1Kth3c_Rg7rrbgP3{<ep_!r^$U<? z11E^%Y%WFg|K}P8i9l(&{y5~<zOldnwD02d8o3X478!{tz&T_s0Ig%<Arp_fO>a)a z%4HJB>QBS$4peZyn%5w*BcNz{Ah4yuZ<Mtxnk4`+1XGx(63<_?%(pEwLu8tp&nX0G z3Pa6S+j!L7K<?4qbL4o)c?iyJcJ!5FrC22x`uX?DFPC24=sdF4dF1}l)At6}kDguc z{3aMgsBLMq8bskpd8jmWi@hH@RO#wj87(QxY$epS^et)_0L&~lbP9}7j^Y>PLmz_= zQQoZJ>Y|NE-2{<#yLREwS79zknE1NIM76EO8+nthB52-X|4Eu^FM4wD?ZrEbe+i7- zW=m}=_@iL|hk=n*&&U_h(7U`57~~)?hbWKy1(8gezGTwMT!8i`ldt9lwKn5UCM8XT zVQ(^tRn5Rawuq{LaYlv&N7Bh_>CZ!Da+e@G(Vrmw<D`0)R4+hv2T?)M2h~Y*MXPoo z@ExeGq0c#o)APWC+D~6S_o*{jbsTZ}J`H!Tgi7bCPN1tU)Y(IOZqoChP^9W5ln?nL z4_biQVv(zz?yJ7Uc$^37yMf-ZoAj*Rgo52|TP=hNA8_)wLt6-%>I+QRd4_psvWiH1 z@51~2fB3;Rr7bQ91JO>MB)z7aWLOX#=p=F0&yXQMXep#PF`6<_<u_dhXfG@xqB8p+ z#fc>$6OuF?7LmLM=3;q6fy|7WMlW4qCqXeQ39`UTr;fL20o@uCwG7ytl`D2XdV;ke zqhOI{n$%gFUeLmEnjh-KA}rrbA7_GeN&HS9?4f7KQjKB#`!GhL7CZ`7m1P*_V-)-t zwSA1dln8x-BA=ntpP}QQpx9s0xlg^lOOXw4@0z!F<s0kXLswn@a$$x!!#se02B4uI F`7a#@u}lB} diff --git a/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc deleted file mode 100644 index eb5d4fa06f0eae0c5365cc83bd222b067549bad3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1871 zcmZ`)&u<$=6rQ!cj_ufiqP9w!ADTK8vQ^@xK}8TXNT_WP7ZVjBBwtqJopHQmJ>$-d z6WkgphaCDJ<c5F~6@LnsB7tPBgj5M};N~`!kb2_Ht~ZWFn8<J6o0&KB_WQoK`K3}R zAsGI5kK1Ynp+8NKj@;NeeGi-yL=m+@)Ug_tW&BK->0}#O3uVx!h-Qxw&HbE7G8(zQ z?d1P9fn!C5&$~JhoP^+4c7*H@eOGWTMd&Bn6I&Svr*&{n5JL@%qDF>VjqD!W_M_Fv z6;bj>XK9Yv)P`T4<=M;vWY8Ii3J}?GRHWHfnU;?2Mxmc|%F*R7Sjc=+$F5{8CK>mc zdPGYY#(nOSuIhzEGlg}VVV`gsPzbR~vv7BkhFd~nDh_!l2o3mNd<dlAfGbVH5T<Y| z2$`zID^KmH471|U>l41uXmllsz<O}1ge!<*Dw>010UOUxz=<l!m0mO8ME0Yr!5$Zq zd6GTs1(GSR+t+Qu>#_iEFN?+)D&?#(WiU}*GToEh&qI(7!%!A}rw_oKpn-jqp_y;( zfi*y0x(5w15LszB$U-z`7NJ27B6C7K1~x>gPEg-+vg8o9-j&RtNAN|cW6}H?sHl}< zbPNGoT_Q;bp9g6Rf7NEdg-npd9U=ibOcYK)#A^YMxl)WPc6O3EO|<at{at+fqfG}B z$#9p+PM|epYk`~R*i|u+W6~0?&Q&wb#uokrPic4j78s;Z7o64bmnykoOy5*VMpP3i zL4iv2qz|PLf1m7u>Rg<#JefIcGmhab(4|f_W~wv892aoPzQIOyptt?8)Xd@-%qj6q z&;$sQ6-dP*r0clZ)A)ddfpKG{O;t_<rLi~w9th^_FfH6n{|B*)1v+(ivIUCwMW;)2 z&<v-!t3DX3dt*0Nch!{E1Au_-<UR2{)*^rjbgIBRBvfotM}0@aHw-!XC<kb_{<kxf z=?H@r#;+f{ZP8&aG@d$e?+L%xVO%R$Ls#yBC^wW2{Cy@j(tc;sJz)I64TGkebm057 zTbr&5G}}n&bh|;<^#ZP$gwLMa5tN0>JrjWG`j)D7`%%GzU4izzN6Qy=N-bTUhkDhA zV2;pe4VA0UW}V@Uo6pMC=Syo(a=#T8hBvm%vpQT^H_yf4@=f!+HhkyKlicrx)l<kt zPHv~ZQ+JByT24C5^P-aHL3O>*_+`&~*dyV1WybTU@L{^>c`6iIftzaz5lYki()7H% z1m-D{ZyEnhV+^jbF^-~Oj?s%u)-Jp(<uB!rJ{zr|ch`rT9}HJkhqrFOs4Uvs&#zt^ z+3+0Y5q^6#W4r=dxc>d}uk-GxXu=YjUmDFCuZ*rcKVAM|Ze$WibEq`;>J9Lc0?d_l z$By#4--U*W%ZyfmiP{+xwS<Y<bZaN?5|?iNbxdC8b>U6|&c|{I7R(1xT>&%7T9)+( STKo%b|C8UawqGJJaoWG6I20fN diff --git a/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/target_python.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/target_python.cpython-312.pyc deleted file mode 100644 index 2926bd55c8dae86192b10ae9e7abef1f52b045b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4974 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/wheel.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/wheel.cpython-312.pyc deleted file mode 100644 index 518f4c6935e5311870fb8ffd54845c12c5f1784c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5800 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/models/candidate.py b/venv/lib/python3.12/site-packages/pip/_internal/models/candidate.py deleted file mode 100644 index 9184a90..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/models/candidate.py +++ /dev/null @@ -1,30 +0,0 @@ -from pip._vendor.packaging.version import parse as parse_version - -from pip._internal.models.link import Link -from pip._internal.utils.models import KeyBasedCompareMixin - - -class InstallationCandidate(KeyBasedCompareMixin): - """Represents a potential "candidate" for installation.""" - - __slots__ = ["name", "version", "link"] - - def __init__(self, name: str, version: str, link: Link) -> None: - self.name = name - self.version = parse_version(version) - self.link = link - - super().__init__( - key=(self.name, self.version, self.link), - defining_class=InstallationCandidate, - ) - - def __repr__(self) -> str: - return "<InstallationCandidate({!r}, {!r}, {!r})>".format( - self.name, - self.version, - self.link, - ) - - def __str__(self) -> str: - return f"{self.name!r} candidate (version {self.version} at {self.link})" diff --git a/venv/lib/python3.12/site-packages/pip/_internal/models/direct_url.py b/venv/lib/python3.12/site-packages/pip/_internal/models/direct_url.py deleted file mode 100644 index 0af884b..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/models/direct_url.py +++ /dev/null @@ -1,235 +0,0 @@ -""" PEP 610 """ -import json -import re -import urllib.parse -from typing import Any, Dict, Iterable, Optional, Type, TypeVar, Union - -__all__ = [ - "DirectUrl", - "DirectUrlValidationError", - "DirInfo", - "ArchiveInfo", - "VcsInfo", -] - -T = TypeVar("T") - -DIRECT_URL_METADATA_NAME = "direct_url.json" -ENV_VAR_RE = re.compile(r"^\$\{[A-Za-z0-9-_]+\}(:\$\{[A-Za-z0-9-_]+\})?$") - - -class DirectUrlValidationError(Exception): - pass - - -def _get( - d: Dict[str, Any], expected_type: Type[T], key: str, default: Optional[T] = None -) -> Optional[T]: - """Get value from dictionary and verify expected type.""" - if key not in d: - return default - value = d[key] - if not isinstance(value, expected_type): - raise DirectUrlValidationError( - f"{value!r} has unexpected type for {key} (expected {expected_type})" - ) - return value - - -def _get_required( - d: Dict[str, Any], expected_type: Type[T], key: str, default: Optional[T] = None -) -> T: - value = _get(d, expected_type, key, default) - if value is None: - raise DirectUrlValidationError(f"{key} must have a value") - return value - - -def _exactly_one_of(infos: Iterable[Optional["InfoType"]]) -> "InfoType": - infos = [info for info in infos if info is not None] - if not infos: - raise DirectUrlValidationError( - "missing one of archive_info, dir_info, vcs_info" - ) - if len(infos) > 1: - raise DirectUrlValidationError( - "more than one of archive_info, dir_info, vcs_info" - ) - assert infos[0] is not None - return infos[0] - - -def _filter_none(**kwargs: Any) -> Dict[str, Any]: - """Make dict excluding None values.""" - return {k: v for k, v in kwargs.items() if v is not None} - - -class VcsInfo: - name = "vcs_info" - - def __init__( - self, - vcs: str, - commit_id: str, - requested_revision: Optional[str] = None, - ) -> None: - self.vcs = vcs - self.requested_revision = requested_revision - self.commit_id = commit_id - - @classmethod - def _from_dict(cls, d: Optional[Dict[str, Any]]) -> Optional["VcsInfo"]: - if d is None: - return None - return cls( - vcs=_get_required(d, str, "vcs"), - commit_id=_get_required(d, str, "commit_id"), - requested_revision=_get(d, str, "requested_revision"), - ) - - def _to_dict(self) -> Dict[str, Any]: - return _filter_none( - vcs=self.vcs, - requested_revision=self.requested_revision, - commit_id=self.commit_id, - ) - - -class ArchiveInfo: - name = "archive_info" - - def __init__( - self, - hash: Optional[str] = None, - hashes: Optional[Dict[str, str]] = None, - ) -> None: - # set hashes before hash, since the hash setter will further populate hashes - self.hashes = hashes - self.hash = hash - - @property - def hash(self) -> Optional[str]: - return self._hash - - @hash.setter - def hash(self, value: Optional[str]) -> None: - if value is not None: - # Auto-populate the hashes key to upgrade to the new format automatically. - # We don't back-populate the legacy hash key from hashes. - try: - hash_name, hash_value = value.split("=", 1) - except ValueError: - raise DirectUrlValidationError( - f"invalid archive_info.hash format: {value!r}" - ) - if self.hashes is None: - self.hashes = {hash_name: hash_value} - elif hash_name not in self.hashes: - self.hashes = self.hashes.copy() - self.hashes[hash_name] = hash_value - self._hash = value - - @classmethod - def _from_dict(cls, d: Optional[Dict[str, Any]]) -> Optional["ArchiveInfo"]: - if d is None: - return None - return cls(hash=_get(d, str, "hash"), hashes=_get(d, dict, "hashes")) - - def _to_dict(self) -> Dict[str, Any]: - return _filter_none(hash=self.hash, hashes=self.hashes) - - -class DirInfo: - name = "dir_info" - - def __init__( - self, - editable: bool = False, - ) -> None: - self.editable = editable - - @classmethod - def _from_dict(cls, d: Optional[Dict[str, Any]]) -> Optional["DirInfo"]: - if d is None: - return None - return cls(editable=_get_required(d, bool, "editable", default=False)) - - def _to_dict(self) -> Dict[str, Any]: - return _filter_none(editable=self.editable or None) - - -InfoType = Union[ArchiveInfo, DirInfo, VcsInfo] - - -class DirectUrl: - def __init__( - self, - url: str, - info: InfoType, - subdirectory: Optional[str] = None, - ) -> None: - self.url = url - self.info = info - self.subdirectory = subdirectory - - def _remove_auth_from_netloc(self, netloc: str) -> str: - if "@" not in netloc: - return netloc - user_pass, netloc_no_user_pass = netloc.split("@", 1) - if ( - isinstance(self.info, VcsInfo) - and self.info.vcs == "git" - and user_pass == "git" - ): - return netloc - if ENV_VAR_RE.match(user_pass): - return netloc - return netloc_no_user_pass - - @property - def redacted_url(self) -> str: - """url with user:password part removed unless it is formed with - environment variables as specified in PEP 610, or it is ``git`` - in the case of a git URL. - """ - purl = urllib.parse.urlsplit(self.url) - netloc = self._remove_auth_from_netloc(purl.netloc) - surl = urllib.parse.urlunsplit( - (purl.scheme, netloc, purl.path, purl.query, purl.fragment) - ) - return surl - - def validate(self) -> None: - self.from_dict(self.to_dict()) - - @classmethod - def from_dict(cls, d: Dict[str, Any]) -> "DirectUrl": - return DirectUrl( - url=_get_required(d, str, "url"), - subdirectory=_get(d, str, "subdirectory"), - info=_exactly_one_of( - [ - ArchiveInfo._from_dict(_get(d, dict, "archive_info")), - DirInfo._from_dict(_get(d, dict, "dir_info")), - VcsInfo._from_dict(_get(d, dict, "vcs_info")), - ] - ), - ) - - def to_dict(self) -> Dict[str, Any]: - res = _filter_none( - url=self.redacted_url, - subdirectory=self.subdirectory, - ) - res[self.info.name] = self.info._to_dict() - return res - - @classmethod - def from_json(cls, s: str) -> "DirectUrl": - return cls.from_dict(json.loads(s)) - - def to_json(self) -> str: - return json.dumps(self.to_dict(), sort_keys=True) - - def is_local_editable(self) -> bool: - return isinstance(self.info, DirInfo) and self.info.editable diff --git a/venv/lib/python3.12/site-packages/pip/_internal/models/format_control.py b/venv/lib/python3.12/site-packages/pip/_internal/models/format_control.py deleted file mode 100644 index ccd1127..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/models/format_control.py +++ /dev/null @@ -1,78 +0,0 @@ -from typing import FrozenSet, Optional, Set - -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.exceptions import CommandError - - -class FormatControl: - """Helper for managing formats from which a package can be installed.""" - - __slots__ = ["no_binary", "only_binary"] - - def __init__( - self, - no_binary: Optional[Set[str]] = None, - only_binary: Optional[Set[str]] = None, - ) -> None: - if no_binary is None: - no_binary = set() - if only_binary is None: - only_binary = set() - - self.no_binary = no_binary - self.only_binary = only_binary - - def __eq__(self, other: object) -> bool: - if not isinstance(other, self.__class__): - return NotImplemented - - if self.__slots__ != other.__slots__: - return False - - return all(getattr(self, k) == getattr(other, k) for k in self.__slots__) - - def __repr__(self) -> str: - return f"{self.__class__.__name__}({self.no_binary}, {self.only_binary})" - - @staticmethod - def handle_mutual_excludes(value: str, target: Set[str], other: Set[str]) -> None: - if value.startswith("-"): - raise CommandError( - "--no-binary / --only-binary option requires 1 argument." - ) - new = value.split(",") - while ":all:" in new: - other.clear() - target.clear() - target.add(":all:") - del new[: new.index(":all:") + 1] - # Without a none, we want to discard everything as :all: covers it - if ":none:" not in new: - return - for name in new: - if name == ":none:": - target.clear() - continue - name = canonicalize_name(name) - other.discard(name) - target.add(name) - - def get_allowed_formats(self, canonical_name: str) -> FrozenSet[str]: - result = {"binary", "source"} - if canonical_name in self.only_binary: - result.discard("source") - elif canonical_name in self.no_binary: - result.discard("binary") - elif ":all:" in self.only_binary: - result.discard("source") - elif ":all:" in self.no_binary: - result.discard("binary") - return frozenset(result) - - def disallow_binaries(self) -> None: - self.handle_mutual_excludes( - ":all:", - self.no_binary, - self.only_binary, - ) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/models/index.py b/venv/lib/python3.12/site-packages/pip/_internal/models/index.py deleted file mode 100644 index b94c325..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/models/index.py +++ /dev/null @@ -1,28 +0,0 @@ -import urllib.parse - - -class PackageIndex: - """Represents a Package Index and provides easier access to endpoints""" - - __slots__ = ["url", "netloc", "simple_url", "pypi_url", "file_storage_domain"] - - def __init__(self, url: str, file_storage_domain: str) -> None: - super().__init__() - self.url = url - self.netloc = urllib.parse.urlsplit(url).netloc - self.simple_url = self._url_for_path("simple") - self.pypi_url = self._url_for_path("pypi") - - # This is part of a temporary hack used to block installs of PyPI - # packages which depend on external urls only necessary until PyPI can - # block such packages themselves - self.file_storage_domain = file_storage_domain - - def _url_for_path(self, path: str) -> str: - return urllib.parse.urljoin(self.url, path) - - -PyPI = PackageIndex("https://pypi.org/", file_storage_domain="files.pythonhosted.org") -TestPyPI = PackageIndex( - "https://test.pypi.org/", file_storage_domain="test-files.pythonhosted.org" -) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/models/installation_report.py b/venv/lib/python3.12/site-packages/pip/_internal/models/installation_report.py deleted file mode 100644 index b9c6330..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/models/installation_report.py +++ /dev/null @@ -1,56 +0,0 @@ -from typing import Any, Dict, Sequence - -from pip._vendor.packaging.markers import default_environment - -from pip import __version__ -from pip._internal.req.req_install import InstallRequirement - - -class InstallationReport: - def __init__(self, install_requirements: Sequence[InstallRequirement]): - self._install_requirements = install_requirements - - @classmethod - def _install_req_to_dict(cls, ireq: InstallRequirement) -> Dict[str, Any]: - assert ireq.download_info, f"No download_info for {ireq}" - res = { - # PEP 610 json for the download URL. download_info.archive_info.hashes may - # be absent when the requirement was installed from the wheel cache - # and the cache entry was populated by an older pip version that did not - # record origin.json. - "download_info": ireq.download_info.to_dict(), - # is_direct is true if the requirement was a direct URL reference (which - # includes editable requirements), and false if the requirement was - # downloaded from a PEP 503 index or --find-links. - "is_direct": ireq.is_direct, - # is_yanked is true if the requirement was yanked from the index, but - # was still selected by pip to conform to PEP 592. - "is_yanked": ireq.link.is_yanked if ireq.link else False, - # requested is true if the requirement was specified by the user (aka - # top level requirement), and false if it was installed as a dependency of a - # requirement. https://peps.python.org/pep-0376/#requested - "requested": ireq.user_supplied, - # PEP 566 json encoding for metadata - # https://www.python.org/dev/peps/pep-0566/#json-compatible-metadata - "metadata": ireq.get_dist().metadata_dict, - } - if ireq.user_supplied and ireq.extras: - # For top level requirements, the list of requested extras, if any. - res["requested_extras"] = sorted(ireq.extras) - return res - - def to_dict(self) -> Dict[str, Any]: - return { - "version": "1", - "pip_version": __version__, - "install": [ - self._install_req_to_dict(ireq) for ireq in self._install_requirements - ], - # https://peps.python.org/pep-0508/#environment-markers - # TODO: currently, the resolver uses the default environment to evaluate - # environment markers, so that is what we report here. In the future, it - # should also take into account options such as --python-version or - # --platform, perhaps under the form of an environment_override field? - # https://github.com/pypa/pip/issues/11198 - "environment": default_environment(), - } diff --git a/venv/lib/python3.12/site-packages/pip/_internal/models/link.py b/venv/lib/python3.12/site-packages/pip/_internal/models/link.py deleted file mode 100644 index 73041b8..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/models/link.py +++ /dev/null @@ -1,579 +0,0 @@ -import functools -import itertools -import logging -import os -import posixpath -import re -import urllib.parse -from dataclasses import dataclass -from typing import ( - TYPE_CHECKING, - Any, - Dict, - List, - Mapping, - NamedTuple, - Optional, - Tuple, - Union, -) - -from pip._internal.utils.deprecation import deprecated -from pip._internal.utils.filetypes import WHEEL_EXTENSION -from pip._internal.utils.hashes import Hashes -from pip._internal.utils.misc import ( - pairwise, - redact_auth_from_url, - split_auth_from_netloc, - splitext, -) -from pip._internal.utils.models import KeyBasedCompareMixin -from pip._internal.utils.urls import path_to_url, url_to_path - -if TYPE_CHECKING: - from pip._internal.index.collector import IndexContent - -logger = logging.getLogger(__name__) - - -# Order matters, earlier hashes have a precedence over later hashes for what -# we will pick to use. -_SUPPORTED_HASHES = ("sha512", "sha384", "sha256", "sha224", "sha1", "md5") - - -@dataclass(frozen=True) -class LinkHash: - """Links to content may have embedded hash values. This class parses those. - - `name` must be any member of `_SUPPORTED_HASHES`. - - This class can be converted to and from `ArchiveInfo`. While ArchiveInfo intends to - be JSON-serializable to conform to PEP 610, this class contains the logic for - parsing a hash name and value for correctness, and then checking whether that hash - conforms to a schema with `.is_hash_allowed()`.""" - - name: str - value: str - - _hash_url_fragment_re = re.compile( - # NB: we do not validate that the second group (.*) is a valid hex - # digest. Instead, we simply keep that string in this class, and then check it - # against Hashes when hash-checking is needed. This is easier to debug than - # proactively discarding an invalid hex digest, as we handle incorrect hashes - # and malformed hashes in the same place. - r"[#&]({choices})=([^&]*)".format( - choices="|".join(re.escape(hash_name) for hash_name in _SUPPORTED_HASHES) - ), - ) - - def __post_init__(self) -> None: - assert self.name in _SUPPORTED_HASHES - - @classmethod - @functools.lru_cache(maxsize=None) - def find_hash_url_fragment(cls, url: str) -> Optional["LinkHash"]: - """Search a string for a checksum algorithm name and encoded output value.""" - match = cls._hash_url_fragment_re.search(url) - if match is None: - return None - name, value = match.groups() - return cls(name=name, value=value) - - def as_dict(self) -> Dict[str, str]: - return {self.name: self.value} - - def as_hashes(self) -> Hashes: - """Return a Hashes instance which checks only for the current hash.""" - return Hashes({self.name: [self.value]}) - - def is_hash_allowed(self, hashes: Optional[Hashes]) -> bool: - """ - Return True if the current hash is allowed by `hashes`. - """ - if hashes is None: - return False - return hashes.is_hash_allowed(self.name, hex_digest=self.value) - - -@dataclass(frozen=True) -class MetadataFile: - """Information about a core metadata file associated with a distribution.""" - - hashes: Optional[Dict[str, str]] - - def __post_init__(self) -> None: - if self.hashes is not None: - assert all(name in _SUPPORTED_HASHES for name in self.hashes) - - -def supported_hashes(hashes: Optional[Dict[str, str]]) -> Optional[Dict[str, str]]: - # Remove any unsupported hash types from the mapping. If this leaves no - # supported hashes, return None - if hashes is None: - return None - hashes = {n: v for n, v in hashes.items() if n in _SUPPORTED_HASHES} - if not hashes: - return None - return hashes - - -def _clean_url_path_part(part: str) -> str: - """ - Clean a "part" of a URL path (i.e. after splitting on "@" characters). - """ - # We unquote prior to quoting to make sure nothing is double quoted. - return urllib.parse.quote(urllib.parse.unquote(part)) - - -def _clean_file_url_path(part: str) -> str: - """ - Clean the first part of a URL path that corresponds to a local - filesystem path (i.e. the first part after splitting on "@" characters). - """ - # We unquote prior to quoting to make sure nothing is double quoted. - # Also, on Windows the path part might contain a drive letter which - # should not be quoted. On Linux where drive letters do not - # exist, the colon should be quoted. We rely on urllib.request - # to do the right thing here. - return urllib.request.pathname2url(urllib.request.url2pathname(part)) - - -# percent-encoded: / -_reserved_chars_re = re.compile("(@|%2F)", re.IGNORECASE) - - -def _clean_url_path(path: str, is_local_path: bool) -> str: - """ - Clean the path portion of a URL. - """ - if is_local_path: - clean_func = _clean_file_url_path - else: - clean_func = _clean_url_path_part - - # Split on the reserved characters prior to cleaning so that - # revision strings in VCS URLs are properly preserved. - parts = _reserved_chars_re.split(path) - - cleaned_parts = [] - for to_clean, reserved in pairwise(itertools.chain(parts, [""])): - cleaned_parts.append(clean_func(to_clean)) - # Normalize %xx escapes (e.g. %2f -> %2F) - cleaned_parts.append(reserved.upper()) - - return "".join(cleaned_parts) - - -def _ensure_quoted_url(url: str) -> str: - """ - Make sure a link is fully quoted. - For example, if ' ' occurs in the URL, it will be replaced with "%20", - and without double-quoting other characters. - """ - # Split the URL into parts according to the general structure - # `scheme://netloc/path;parameters?query#fragment`. - result = urllib.parse.urlparse(url) - # If the netloc is empty, then the URL refers to a local filesystem path. - is_local_path = not result.netloc - path = _clean_url_path(result.path, is_local_path=is_local_path) - return urllib.parse.urlunparse(result._replace(path=path)) - - -class Link(KeyBasedCompareMixin): - """Represents a parsed link from a Package Index's simple URL""" - - __slots__ = [ - "_parsed_url", - "_url", - "_hashes", - "comes_from", - "requires_python", - "yanked_reason", - "metadata_file_data", - "cache_link_parsing", - "egg_fragment", - ] - - def __init__( - self, - url: str, - comes_from: Optional[Union[str, "IndexContent"]] = None, - requires_python: Optional[str] = None, - yanked_reason: Optional[str] = None, - metadata_file_data: Optional[MetadataFile] = None, - cache_link_parsing: bool = True, - hashes: Optional[Mapping[str, str]] = None, - ) -> None: - """ - :param url: url of the resource pointed to (href of the link) - :param comes_from: instance of IndexContent where the link was found, - or string. - :param requires_python: String containing the `Requires-Python` - metadata field, specified in PEP 345. This may be specified by - a data-requires-python attribute in the HTML link tag, as - described in PEP 503. - :param yanked_reason: the reason the file has been yanked, if the - file has been yanked, or None if the file hasn't been yanked. - This is the value of the "data-yanked" attribute, if present, in - a simple repository HTML link. If the file has been yanked but - no reason was provided, this should be the empty string. See - PEP 592 for more information and the specification. - :param metadata_file_data: the metadata attached to the file, or None if - no such metadata is provided. This argument, if not None, indicates - that a separate metadata file exists, and also optionally supplies - hashes for that file. - :param cache_link_parsing: A flag that is used elsewhere to determine - whether resources retrieved from this link should be cached. PyPI - URLs should generally have this set to False, for example. - :param hashes: A mapping of hash names to digests to allow us to - determine the validity of a download. - """ - - # The comes_from, requires_python, and metadata_file_data arguments are - # only used by classmethods of this class, and are not used in client - # code directly. - - # url can be a UNC windows share - if url.startswith("\\\\"): - url = path_to_url(url) - - self._parsed_url = urllib.parse.urlsplit(url) - # Store the url as a private attribute to prevent accidentally - # trying to set a new value. - self._url = url - - link_hash = LinkHash.find_hash_url_fragment(url) - hashes_from_link = {} if link_hash is None else link_hash.as_dict() - if hashes is None: - self._hashes = hashes_from_link - else: - self._hashes = {**hashes, **hashes_from_link} - - self.comes_from = comes_from - self.requires_python = requires_python if requires_python else None - self.yanked_reason = yanked_reason - self.metadata_file_data = metadata_file_data - - super().__init__(key=url, defining_class=Link) - - self.cache_link_parsing = cache_link_parsing - self.egg_fragment = self._egg_fragment() - - @classmethod - def from_json( - cls, - file_data: Dict[str, Any], - page_url: str, - ) -> Optional["Link"]: - """ - Convert an pypi json document from a simple repository page into a Link. - """ - file_url = file_data.get("url") - if file_url is None: - return None - - url = _ensure_quoted_url(urllib.parse.urljoin(page_url, file_url)) - pyrequire = file_data.get("requires-python") - yanked_reason = file_data.get("yanked") - hashes = file_data.get("hashes", {}) - - # PEP 714: Indexes must use the name core-metadata, but - # clients should support the old name as a fallback for compatibility. - metadata_info = file_data.get("core-metadata") - if metadata_info is None: - metadata_info = file_data.get("dist-info-metadata") - - # The metadata info value may be a boolean, or a dict of hashes. - if isinstance(metadata_info, dict): - # The file exists, and hashes have been supplied - metadata_file_data = MetadataFile(supported_hashes(metadata_info)) - elif metadata_info: - # The file exists, but there are no hashes - metadata_file_data = MetadataFile(None) - else: - # False or not present: the file does not exist - metadata_file_data = None - - # The Link.yanked_reason expects an empty string instead of a boolean. - if yanked_reason and not isinstance(yanked_reason, str): - yanked_reason = "" - # The Link.yanked_reason expects None instead of False. - elif not yanked_reason: - yanked_reason = None - - return cls( - url, - comes_from=page_url, - requires_python=pyrequire, - yanked_reason=yanked_reason, - hashes=hashes, - metadata_file_data=metadata_file_data, - ) - - @classmethod - def from_element( - cls, - anchor_attribs: Dict[str, Optional[str]], - page_url: str, - base_url: str, - ) -> Optional["Link"]: - """ - Convert an anchor element's attributes in a simple repository page to a Link. - """ - href = anchor_attribs.get("href") - if not href: - return None - - url = _ensure_quoted_url(urllib.parse.urljoin(base_url, href)) - pyrequire = anchor_attribs.get("data-requires-python") - yanked_reason = anchor_attribs.get("data-yanked") - - # PEP 714: Indexes must use the name data-core-metadata, but - # clients should support the old name as a fallback for compatibility. - metadata_info = anchor_attribs.get("data-core-metadata") - if metadata_info is None: - metadata_info = anchor_attribs.get("data-dist-info-metadata") - # The metadata info value may be the string "true", or a string of - # the form "hashname=hashval" - if metadata_info == "true": - # The file exists, but there are no hashes - metadata_file_data = MetadataFile(None) - elif metadata_info is None: - # The file does not exist - metadata_file_data = None - else: - # The file exists, and hashes have been supplied - hashname, sep, hashval = metadata_info.partition("=") - if sep == "=": - metadata_file_data = MetadataFile(supported_hashes({hashname: hashval})) - else: - # Error - data is wrong. Treat as no hashes supplied. - logger.debug( - "Index returned invalid data-dist-info-metadata value: %s", - metadata_info, - ) - metadata_file_data = MetadataFile(None) - - return cls( - url, - comes_from=page_url, - requires_python=pyrequire, - yanked_reason=yanked_reason, - metadata_file_data=metadata_file_data, - ) - - def __str__(self) -> str: - if self.requires_python: - rp = f" (requires-python:{self.requires_python})" - else: - rp = "" - if self.comes_from: - return f"{redact_auth_from_url(self._url)} (from {self.comes_from}){rp}" - else: - return redact_auth_from_url(str(self._url)) - - def __repr__(self) -> str: - return f"<Link {self}>" - - @property - def url(self) -> str: - return self._url - - @property - def filename(self) -> str: - path = self.path.rstrip("/") - name = posixpath.basename(path) - if not name: - # Make sure we don't leak auth information if the netloc - # includes a username and password. - netloc, user_pass = split_auth_from_netloc(self.netloc) - return netloc - - name = urllib.parse.unquote(name) - assert name, f"URL {self._url!r} produced no filename" - return name - - @property - def file_path(self) -> str: - return url_to_path(self.url) - - @property - def scheme(self) -> str: - return self._parsed_url.scheme - - @property - def netloc(self) -> str: - """ - This can contain auth information. - """ - return self._parsed_url.netloc - - @property - def path(self) -> str: - return urllib.parse.unquote(self._parsed_url.path) - - def splitext(self) -> Tuple[str, str]: - return splitext(posixpath.basename(self.path.rstrip("/"))) - - @property - def ext(self) -> str: - return self.splitext()[1] - - @property - def url_without_fragment(self) -> str: - scheme, netloc, path, query, fragment = self._parsed_url - return urllib.parse.urlunsplit((scheme, netloc, path, query, "")) - - _egg_fragment_re = re.compile(r"[#&]egg=([^&]*)") - - # Per PEP 508. - _project_name_re = re.compile( - r"^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$", re.IGNORECASE - ) - - def _egg_fragment(self) -> Optional[str]: - match = self._egg_fragment_re.search(self._url) - if not match: - return None - - # An egg fragment looks like a PEP 508 project name, along with - # an optional extras specifier. Anything else is invalid. - project_name = match.group(1) - if not self._project_name_re.match(project_name): - deprecated( - reason=f"{self} contains an egg fragment with a non-PEP 508 name", - replacement="to use the req @ url syntax, and remove the egg fragment", - gone_in="25.0", - issue=11617, - ) - - return project_name - - _subdirectory_fragment_re = re.compile(r"[#&]subdirectory=([^&]*)") - - @property - def subdirectory_fragment(self) -> Optional[str]: - match = self._subdirectory_fragment_re.search(self._url) - if not match: - return None - return match.group(1) - - def metadata_link(self) -> Optional["Link"]: - """Return a link to the associated core metadata file (if any).""" - if self.metadata_file_data is None: - return None - metadata_url = f"{self.url_without_fragment}.metadata" - if self.metadata_file_data.hashes is None: - return Link(metadata_url) - return Link(metadata_url, hashes=self.metadata_file_data.hashes) - - def as_hashes(self) -> Hashes: - return Hashes({k: [v] for k, v in self._hashes.items()}) - - @property - def hash(self) -> Optional[str]: - return next(iter(self._hashes.values()), None) - - @property - def hash_name(self) -> Optional[str]: - return next(iter(self._hashes), None) - - @property - def show_url(self) -> str: - return posixpath.basename(self._url.split("#", 1)[0].split("?", 1)[0]) - - @property - def is_file(self) -> bool: - return self.scheme == "file" - - def is_existing_dir(self) -> bool: - return self.is_file and os.path.isdir(self.file_path) - - @property - def is_wheel(self) -> bool: - return self.ext == WHEEL_EXTENSION - - @property - def is_vcs(self) -> bool: - from pip._internal.vcs import vcs - - return self.scheme in vcs.all_schemes - - @property - def is_yanked(self) -> bool: - return self.yanked_reason is not None - - @property - def has_hash(self) -> bool: - return bool(self._hashes) - - def is_hash_allowed(self, hashes: Optional[Hashes]) -> bool: - """ - Return True if the link has a hash and it is allowed by `hashes`. - """ - if hashes is None: - return False - return any(hashes.is_hash_allowed(k, v) for k, v in self._hashes.items()) - - -class _CleanResult(NamedTuple): - """Convert link for equivalency check. - - This is used in the resolver to check whether two URL-specified requirements - likely point to the same distribution and can be considered equivalent. This - equivalency logic avoids comparing URLs literally, which can be too strict - (e.g. "a=1&b=2" vs "b=2&a=1") and produce conflicts unexpecting to users. - - Currently this does three things: - - 1. Drop the basic auth part. This is technically wrong since a server can - serve different content based on auth, but if it does that, it is even - impossible to guarantee two URLs without auth are equivalent, since - the user can input different auth information when prompted. So the - practical solution is to assume the auth doesn't affect the response. - 2. Parse the query to avoid the ordering issue. Note that ordering under the - same key in the query are NOT cleaned; i.e. "a=1&a=2" and "a=2&a=1" are - still considered different. - 3. Explicitly drop most of the fragment part, except ``subdirectory=`` and - hash values, since it should have no impact the downloaded content. Note - that this drops the "egg=" part historically used to denote the requested - project (and extras), which is wrong in the strictest sense, but too many - people are supplying it inconsistently to cause superfluous resolution - conflicts, so we choose to also ignore them. - """ - - parsed: urllib.parse.SplitResult - query: Dict[str, List[str]] - subdirectory: str - hashes: Dict[str, str] - - -def _clean_link(link: Link) -> _CleanResult: - parsed = link._parsed_url - netloc = parsed.netloc.rsplit("@", 1)[-1] - # According to RFC 8089, an empty host in file: means localhost. - if parsed.scheme == "file" and not netloc: - netloc = "localhost" - fragment = urllib.parse.parse_qs(parsed.fragment) - if "egg" in fragment: - logger.debug("Ignoring egg= fragment in %s", link) - try: - # If there are multiple subdirectory values, use the first one. - # This matches the behavior of Link.subdirectory_fragment. - subdirectory = fragment["subdirectory"][0] - except (IndexError, KeyError): - subdirectory = "" - # If there are multiple hash values under the same algorithm, use the - # first one. This matches the behavior of Link.hash_value. - hashes = {k: fragment[k][0] for k in _SUPPORTED_HASHES if k in fragment} - return _CleanResult( - parsed=parsed._replace(netloc=netloc, query="", fragment=""), - query=urllib.parse.parse_qs(parsed.query), - subdirectory=subdirectory, - hashes=hashes, - ) - - -@functools.lru_cache(maxsize=None) -def links_equivalent(link1: Link, link2: Link) -> bool: - return _clean_link(link1) == _clean_link(link2) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/models/scheme.py b/venv/lib/python3.12/site-packages/pip/_internal/models/scheme.py deleted file mode 100644 index f51190a..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/models/scheme.py +++ /dev/null @@ -1,31 +0,0 @@ -""" -For types associated with installation schemes. - -For a general overview of available schemes and their context, see -https://docs.python.org/3/install/index.html#alternate-installation. -""" - - -SCHEME_KEYS = ["platlib", "purelib", "headers", "scripts", "data"] - - -class Scheme: - """A Scheme holds paths which are used as the base directories for - artifacts associated with a Python package. - """ - - __slots__ = SCHEME_KEYS - - def __init__( - self, - platlib: str, - purelib: str, - headers: str, - scripts: str, - data: str, - ) -> None: - self.platlib = platlib - self.purelib = purelib - self.headers = headers - self.scripts = scripts - self.data = data diff --git a/venv/lib/python3.12/site-packages/pip/_internal/models/search_scope.py b/venv/lib/python3.12/site-packages/pip/_internal/models/search_scope.py deleted file mode 100644 index fe61e81..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/models/search_scope.py +++ /dev/null @@ -1,132 +0,0 @@ -import itertools -import logging -import os -import posixpath -import urllib.parse -from typing import List - -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.models.index import PyPI -from pip._internal.utils.compat import has_tls -from pip._internal.utils.misc import normalize_path, redact_auth_from_url - -logger = logging.getLogger(__name__) - - -class SearchScope: - - """ - Encapsulates the locations that pip is configured to search. - """ - - __slots__ = ["find_links", "index_urls", "no_index"] - - @classmethod - def create( - cls, - find_links: List[str], - index_urls: List[str], - no_index: bool, - ) -> "SearchScope": - """ - Create a SearchScope object after normalizing the `find_links`. - """ - # Build find_links. If an argument starts with ~, it may be - # a local file relative to a home directory. So try normalizing - # it and if it exists, use the normalized version. - # This is deliberately conservative - it might be fine just to - # blindly normalize anything starting with a ~... - built_find_links: List[str] = [] - for link in find_links: - if link.startswith("~"): - new_link = normalize_path(link) - if os.path.exists(new_link): - link = new_link - built_find_links.append(link) - - # If we don't have TLS enabled, then WARN if anyplace we're looking - # relies on TLS. - if not has_tls(): - for link in itertools.chain(index_urls, built_find_links): - parsed = urllib.parse.urlparse(link) - if parsed.scheme == "https": - logger.warning( - "pip is configured with locations that require " - "TLS/SSL, however the ssl module in Python is not " - "available." - ) - break - - return cls( - find_links=built_find_links, - index_urls=index_urls, - no_index=no_index, - ) - - def __init__( - self, - find_links: List[str], - index_urls: List[str], - no_index: bool, - ) -> None: - self.find_links = find_links - self.index_urls = index_urls - self.no_index = no_index - - def get_formatted_locations(self) -> str: - lines = [] - redacted_index_urls = [] - if self.index_urls and self.index_urls != [PyPI.simple_url]: - for url in self.index_urls: - redacted_index_url = redact_auth_from_url(url) - - # Parse the URL - purl = urllib.parse.urlsplit(redacted_index_url) - - # URL is generally invalid if scheme and netloc is missing - # there are issues with Python and URL parsing, so this test - # is a bit crude. See bpo-20271, bpo-23505. Python doesn't - # always parse invalid URLs correctly - it should raise - # exceptions for malformed URLs - if not purl.scheme and not purl.netloc: - logger.warning( - 'The index url "%s" seems invalid, please provide a scheme.', - redacted_index_url, - ) - - redacted_index_urls.append(redacted_index_url) - - lines.append( - "Looking in indexes: {}".format(", ".join(redacted_index_urls)) - ) - - if self.find_links: - lines.append( - "Looking in links: {}".format( - ", ".join(redact_auth_from_url(url) for url in self.find_links) - ) - ) - return "\n".join(lines) - - def get_index_urls_locations(self, project_name: str) -> List[str]: - """Returns the locations found via self.index_urls - - Checks the url_name on the main (first in the list) index and - use this url_name to produce all locations - """ - - def mkurl_pypi_url(url: str) -> str: - loc = posixpath.join( - url, urllib.parse.quote(canonicalize_name(project_name)) - ) - # For maximum compatibility with easy_install, ensure the path - # ends in a trailing slash. Although this isn't in the spec - # (and PyPI can handle it without the slash) some other index - # implementations might break if they relied on easy_install's - # behavior. - if not loc.endswith("/"): - loc = loc + "/" - return loc - - return [mkurl_pypi_url(url) for url in self.index_urls] diff --git a/venv/lib/python3.12/site-packages/pip/_internal/models/selection_prefs.py b/venv/lib/python3.12/site-packages/pip/_internal/models/selection_prefs.py deleted file mode 100644 index 977bc4c..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/models/selection_prefs.py +++ /dev/null @@ -1,51 +0,0 @@ -from typing import Optional - -from pip._internal.models.format_control import FormatControl - - -class SelectionPreferences: - """ - Encapsulates the candidate selection preferences for downloading - and installing files. - """ - - __slots__ = [ - "allow_yanked", - "allow_all_prereleases", - "format_control", - "prefer_binary", - "ignore_requires_python", - ] - - # Don't include an allow_yanked default value to make sure each call - # site considers whether yanked releases are allowed. This also causes - # that decision to be made explicit in the calling code, which helps - # people when reading the code. - def __init__( - self, - allow_yanked: bool, - allow_all_prereleases: bool = False, - format_control: Optional[FormatControl] = None, - prefer_binary: bool = False, - ignore_requires_python: Optional[bool] = None, - ) -> None: - """Create a SelectionPreferences object. - - :param allow_yanked: Whether files marked as yanked (in the sense - of PEP 592) are permitted to be candidates for install. - :param format_control: A FormatControl object or None. Used to control - the selection of source packages / binary packages when consulting - the index and links. - :param prefer_binary: Whether to prefer an old, but valid, binary - dist over a new source dist. - :param ignore_requires_python: Whether to ignore incompatible - "Requires-Python" values in links. Defaults to False. - """ - if ignore_requires_python is None: - ignore_requires_python = False - - self.allow_yanked = allow_yanked - self.allow_all_prereleases = allow_all_prereleases - self.format_control = format_control - self.prefer_binary = prefer_binary - self.ignore_requires_python = ignore_requires_python diff --git a/venv/lib/python3.12/site-packages/pip/_internal/models/target_python.py b/venv/lib/python3.12/site-packages/pip/_internal/models/target_python.py deleted file mode 100644 index 67ea5da..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/models/target_python.py +++ /dev/null @@ -1,122 +0,0 @@ -import sys -from typing import List, Optional, Set, Tuple - -from pip._vendor.packaging.tags import Tag - -from pip._internal.utils.compatibility_tags import get_supported, version_info_to_nodot -from pip._internal.utils.misc import normalize_version_info - - -class TargetPython: - - """ - Encapsulates the properties of a Python interpreter one is targeting - for a package install, download, etc. - """ - - __slots__ = [ - "_given_py_version_info", - "abis", - "implementation", - "platforms", - "py_version", - "py_version_info", - "_valid_tags", - "_valid_tags_set", - ] - - def __init__( - self, - platforms: Optional[List[str]] = None, - py_version_info: Optional[Tuple[int, ...]] = None, - abis: Optional[List[str]] = None, - implementation: Optional[str] = None, - ) -> None: - """ - :param platforms: A list of strings or None. If None, searches for - packages that are supported by the current system. Otherwise, will - find packages that can be built on the platforms passed in. These - packages will only be downloaded for distribution: they will - not be built locally. - :param py_version_info: An optional tuple of ints representing the - Python version information to use (e.g. `sys.version_info[:3]`). - This can have length 1, 2, or 3 when provided. - :param abis: A list of strings or None. This is passed to - compatibility_tags.py's get_supported() function as is. - :param implementation: A string or None. This is passed to - compatibility_tags.py's get_supported() function as is. - """ - # Store the given py_version_info for when we call get_supported(). - self._given_py_version_info = py_version_info - - if py_version_info is None: - py_version_info = sys.version_info[:3] - else: - py_version_info = normalize_version_info(py_version_info) - - py_version = ".".join(map(str, py_version_info[:2])) - - self.abis = abis - self.implementation = implementation - self.platforms = platforms - self.py_version = py_version - self.py_version_info = py_version_info - - # This is used to cache the return value of get_(un)sorted_tags. - self._valid_tags: Optional[List[Tag]] = None - self._valid_tags_set: Optional[Set[Tag]] = None - - def format_given(self) -> str: - """ - Format the given, non-None attributes for display. - """ - display_version = None - if self._given_py_version_info is not None: - display_version = ".".join( - str(part) for part in self._given_py_version_info - ) - - key_values = [ - ("platforms", self.platforms), - ("version_info", display_version), - ("abis", self.abis), - ("implementation", self.implementation), - ] - return " ".join( - f"{key}={value!r}" for key, value in key_values if value is not None - ) - - def get_sorted_tags(self) -> List[Tag]: - """ - Return the supported PEP 425 tags to check wheel candidates against. - - The tags are returned in order of preference (most preferred first). - """ - if self._valid_tags is None: - # Pass versions=None if no py_version_info was given since - # versions=None uses special default logic. - py_version_info = self._given_py_version_info - if py_version_info is None: - version = None - else: - version = version_info_to_nodot(py_version_info) - - tags = get_supported( - version=version, - platforms=self.platforms, - abis=self.abis, - impl=self.implementation, - ) - self._valid_tags = tags - - return self._valid_tags - - def get_unsorted_tags(self) -> Set[Tag]: - """Exactly the same as get_sorted_tags, but returns a set. - - This is important for performance. - """ - if self._valid_tags_set is None: - self._valid_tags_set = set(self.get_sorted_tags()) - - return self._valid_tags_set diff --git a/venv/lib/python3.12/site-packages/pip/_internal/models/wheel.py b/venv/lib/python3.12/site-packages/pip/_internal/models/wheel.py deleted file mode 100644 index a5dc12b..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/models/wheel.py +++ /dev/null @@ -1,92 +0,0 @@ -"""Represents a wheel file and provides access to the various parts of the -name that have meaning. -""" -import re -from typing import Dict, Iterable, List - -from pip._vendor.packaging.tags import Tag - -from pip._internal.exceptions import InvalidWheelFilename - - -class Wheel: - """A wheel file""" - - wheel_file_re = re.compile( - r"""^(?P<namever>(?P<name>[^\s-]+?)-(?P<ver>[^\s-]*?)) - ((-(?P<build>\d[^-]*?))?-(?P<pyver>[^\s-]+?)-(?P<abi>[^\s-]+?)-(?P<plat>[^\s-]+?) - \.whl|\.dist-info)$""", - re.VERBOSE, - ) - - def __init__(self, filename: str) -> None: - """ - :raises InvalidWheelFilename: when the filename is invalid for a wheel - """ - wheel_info = self.wheel_file_re.match(filename) - if not wheel_info: - raise InvalidWheelFilename(f"{filename} is not a valid wheel filename.") - self.filename = filename - self.name = wheel_info.group("name").replace("_", "-") - # we'll assume "_" means "-" due to wheel naming scheme - # (https://github.com/pypa/pip/issues/1150) - self.version = wheel_info.group("ver").replace("_", "-") - self.build_tag = wheel_info.group("build") - self.pyversions = wheel_info.group("pyver").split(".") - self.abis = wheel_info.group("abi").split(".") - self.plats = wheel_info.group("plat").split(".") - - # All the tag combinations from this file - self.file_tags = { - Tag(x, y, z) for x in self.pyversions for y in self.abis for z in self.plats - } - - def get_formatted_file_tags(self) -> List[str]: - """Return the wheel's tags as a sorted list of strings.""" - return sorted(str(tag) for tag in self.file_tags) - - def support_index_min(self, tags: List[Tag]) -> int: - """Return the lowest index that one of the wheel's file_tag combinations - achieves in the given list of supported tags. - - For example, if there are 8 supported tags and one of the file tags - is first in the list, then return 0. - - :param tags: the PEP 425 tags to check the wheel against, in order - with most preferred first. - - :raises ValueError: If none of the wheel's file tags match one of - the supported tags. - """ - try: - return next(i for i, t in enumerate(tags) if t in self.file_tags) - except StopIteration: - raise ValueError() - - def find_most_preferred_tag( - self, tags: List[Tag], tag_to_priority: Dict[Tag, int] - ) -> int: - """Return the priority of the most preferred tag that one of the wheel's file - tag combinations achieves in the given list of supported tags using the given - tag_to_priority mapping, where lower priorities are more-preferred. - - This is used in place of support_index_min in some cases in order to avoid - an expensive linear scan of a large list of tags. - - :param tags: the PEP 425 tags to check the wheel against. - :param tag_to_priority: a mapping from tag to priority of that tag, where - lower is more preferred. - - :raises ValueError: If none of the wheel's file tags match one of - the supported tags. - """ - return min( - tag_to_priority[tag] for tag in self.file_tags if tag in tag_to_priority - ) - - def supported(self, tags: Iterable[Tag]) -> bool: - """Return whether the wheel is compatible with one of the given tags. - - :param tags: the PEP 425 tags to check the wheel against. - """ - return not self.file_tags.isdisjoint(tags) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/network/__init__.py b/venv/lib/python3.12/site-packages/pip/_internal/network/__init__.py deleted file mode 100644 index b51bde9..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/network/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -"""Contains purely network-related utilities. -""" diff --git a/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 6eb62fde5a0e08474baf3aa7216aaaefdca870af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 274 zcmXw!Jx&8L5QXg!K@=%>*fv7DBSMR4pymK+EMt$d*7{HO>_!U*p`*`PxB)E}K%`5B zS4v(p?|a4Qy|2}3$%@qHd%G$3XM&6P*&G+ed@#+nY~<_N+wD{EB#qBi>=W9t@<{uT zy1IZQ)KyQ$8Zwxh<;$9X-w2_D65_y))5lW}ZEy%qQXb$rsNSKc41^YUNxC|dQ5~jQ zhrPE!YD_SoAHbSdh$FSZ-#2#~$cC_vQgw2N8KQ|Gj3-Q9S~xcXQ6fV^G;usF9$e79 Z#m97AT1?~ewEg#rbN)Bue4ge7{{e0FQosNJ diff --git a/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/auth.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/auth.cpython-312.pyc deleted file mode 100644 index 1440d71b5d7dd802f75919cecbfeacca9bf8f0cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22016 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/cache.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/cache.cpython-312.pyc deleted file mode 100644 index 972bce8212d4cd80368438d760cbdabadab6fd82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6538 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 XFY8J~elPo^B<ai9+}{W`#B%-tG2`GX diff --git a/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/download.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/download.cpython-312.pyc deleted file mode 100644 index af325bd25afcfadc66d0f76ecbfad939b6c197b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8573 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%0D!<#zoL7)M6v5# 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-312.pyc deleted file mode 100644 index 2fd69473ea7dae845fc55949b86e9ff7fa4e188a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11683 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/session.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/session.cpython-312.pyc deleted file mode 100644 index 0db8fb094d8c2a12ebbbbacf2e2421a858955b29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18794 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 ZQ%{~S^80RA&zCf2N*aH~QHo*3{|lF^mvR6A diff --git a/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/utils.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index e6d21762d57e6a3e89a863d119fb64dff66f3e55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2273 zcmb7FO-vg{6rS1j+G_(g0c`#fScv&?D7cg+f;6p!fFu=>E9FOOoV3=)JHUdy>&}h= zyGBA$4kXP1E+tah2&os^q*9JORf%%wp%)NDkX582RZ*Lp2^^xRhrV5Kh$5<}BkjC5 z?`PiZoA<r>y`;p0V8riyJ@VX#(4W?#Fl-Ghwywf7k1ikuDL8?WIEs^8l*87VOYliY z)R7dTg1zPw&ZH~q0^XqrDvpW-6E|@Wan-N~@hHv{Kou7e6j5;xITX(|N3@7IhOklu zvSL!Kh=e00iW{`N<ul||O0Ee}Z^j++K8H05ai*hRjWg4IifDw&Os60!>-#Knejsu_ z)_3|sWH5H_)98RHo+U;~*9;QEW*|b?gigo$bWJ01rs~=Nr8>>}dgF1DV(kN3Tvt?W z*c4TTXiQ}p({*~Fw}0U5InzO5AJa(*OH(Zp$JQx!hX9m^Z_5PfJfvp|v)B3@8s!Rx zdz3i}{M}tGJ>*9F+m5;lwtH0J?(RmI;<V!Z{iZm@0h+=E?m444H_46FAVdX47=!q< zQG<)r>i4(4jTC2&gV_c8;y1S0WpAVJg(<8ZQ-uBf--ssK(HiV%b^BXG9QV7U<uEN_ zP^vp4hjZwjr;y33ID-x&CKj|oMC<VX$t}N^+l%Pt4-;sTzlbJqs3>BhtdM3y?cG_A zYUu6V-A8-cJJngZ3UwQ%tWWAos8BhQU027YtVbHssg$OP<C6M0WEw2a5jsw2!2+sM zv?|N4P|<{KRn1_s7AID%$%d|(!j%johUruYR3|aZE@-O7^xI22kXZySEN#SW10KRr zt7bwxwJzWEjxd&r5v$Z=Nn@Cng3z!ER+6MwG(4gwNjNDpV?5li$J0qTzY%66L58WE zY&V!1A0xC~(I>QoE-QqF$B8x`PN-MHsSF#@wXTlN55k7ZNP9|-kIBQt2&dFkIHqch zP)$yRwH?%j(@aem9jT02N@dj`F-T2p=isyoPIJgQ)-#x<(Yn8KI`Y(YU^Y14HrMuD zdezmG_wepx>;CHbOLLdj{4LA=mPOZ!|NZMH^CBt>%-7D<&Nw$*o*8A$Tes}3TXh8& z${)Le8@}>2U;VPLe#t8>`0hIwC+}w;1b=IN*!rMmsrbw$kKC28gQsNHu~sTAmrASd z=7p}u?&fzm<}Jrf5s87P-r&NQzbLETz9q2_#A4v(c0DR>e1Y)W2QFUmAH8uh&x7KX zaRC1GPHi8L9`V7xBmAQfhM9UnYI@=$X>BZKs96$!vw2ue<1l<%zrr+#Ff<#xX~633 zF>2lKTO)@Re2*)@q#u3ZL}-f3ao=+D7^9n_17&ys&g<3$z-h++9buogl*4<_$#DjE z5q5mNf3N_gpLqb2BinUKg-ViSiIT6<#9)S0Xw~mYDXNb{50=;nkrbK9lARHw<0Rn4 zy8{F$b|^57MM4gfr}Bj9G#DTzX?lAZqw1A3BRk-L&Mhl|1uM1GdQD7WXSZDl&`L|@ zE1)p8qofTW?Sao=F#U~QPNTedSg6|YADX{BcX`d<y6kUVFAn58(7}d$CklkNP<6ob z0@b*yW(M*fqVlS51~-qw>gDz^R9y1{Il<Xmwq9{?{><E&wTh<Yil&9pm5R=pfhXlv zPfGpkWtBGu^KRrT&kJDtkI@8yuj1ZA_*!!t`pIJMw)EEU56d`UA67UmzJ>=r<TITt zlY*CvTK`0?8#HSHgdH)+u%gqBLW(<*&^ZzYwVo^r*N@C9+pK`q4l-%Igzz#Nb_=0y z%Z7){n!Z>})-)X&jirsnY|NTGcv7pB?R@=+wtz);Mqi01AXqv<KA}fIW<6Ji1{0J& z#($v3CDiyA>VJkl${#@o+ZRWdYI>$!GZi!O*{+$9>vb!rC-1Dr{rFaQ9$9qJ0SN}0 qKaScy-sD?w)w(y3w`s7&rW=BHCOxa%>R<9n%R<Ap05&uPA^!zw`z9#> diff --git a/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-312.pyc deleted file mode 100644 index 80c0f747958503bbbecaad8ba96e70236a194f6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2969 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 Y*e?Eh{Fmc<Bd2ypPJIn;g$Vcm0$|(Wvj6}9 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/network/auth.py b/venv/lib/python3.12/site-packages/pip/_internal/network/auth.py deleted file mode 100644 index 94a82fa..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/network/auth.py +++ /dev/null @@ -1,561 +0,0 @@ -"""Network Authentication Helpers - -Contains interface (MultiDomainBasicAuth) and associated glue code for -providing credentials in the context of network requests. -""" -import logging -import os -import shutil -import subprocess -import sysconfig -import typing -import urllib.parse -from abc import ABC, abstractmethod -from functools import lru_cache -from os.path import commonprefix -from pathlib import Path -from typing import Any, Dict, List, NamedTuple, Optional, Tuple - -from pip._vendor.requests.auth import AuthBase, HTTPBasicAuth -from pip._vendor.requests.models import Request, Response -from pip._vendor.requests.utils import get_netrc_auth - -from pip._internal.utils.logging import getLogger -from pip._internal.utils.misc import ( - ask, - ask_input, - ask_password, - remove_auth_from_url, - split_auth_netloc_from_url, -) -from pip._internal.vcs.versioncontrol import AuthInfo - -logger = getLogger(__name__) - -KEYRING_DISABLED = False - - -class Credentials(NamedTuple): - url: str - username: str - password: str - - -class KeyRingBaseProvider(ABC): - """Keyring base provider interface""" - - has_keyring: bool - - @abstractmethod - def get_auth_info(self, url: str, username: Optional[str]) -> Optional[AuthInfo]: - ... - - @abstractmethod - def save_auth_info(self, url: str, username: str, password: str) -> None: - ... - - -class KeyRingNullProvider(KeyRingBaseProvider): - """Keyring null provider""" - - has_keyring = False - - def get_auth_info(self, url: str, username: Optional[str]) -> Optional[AuthInfo]: - return None - - def save_auth_info(self, url: str, username: str, password: str) -> None: - return None - - -class KeyRingPythonProvider(KeyRingBaseProvider): - """Keyring interface which uses locally imported `keyring`""" - - has_keyring = True - - def __init__(self) -> None: - import keyring - - self.keyring = keyring - - def get_auth_info(self, url: str, username: Optional[str]) -> Optional[AuthInfo]: - # Support keyring's get_credential interface which supports getting - # credentials without a username. This is only available for - # keyring>=15.2.0. - if hasattr(self.keyring, "get_credential"): - logger.debug("Getting credentials from keyring for %s", url) - cred = self.keyring.get_credential(url, username) - if cred is not None: - return cred.username, cred.password - return None - - if username is not None: - logger.debug("Getting password from keyring for %s", url) - password = self.keyring.get_password(url, username) - if password: - return username, password - return None - - def save_auth_info(self, url: str, username: str, password: str) -> None: - self.keyring.set_password(url, username, password) - - -class KeyRingCliProvider(KeyRingBaseProvider): - """Provider which uses `keyring` cli - - Instead of calling the keyring package installed alongside pip - we call keyring on the command line which will enable pip to - use which ever installation of keyring is available first in - PATH. - """ - - has_keyring = True - - def __init__(self, cmd: str) -> None: - self.keyring = cmd - - def get_auth_info(self, url: str, username: Optional[str]) -> Optional[AuthInfo]: - # This is the default implementation of keyring.get_credential - # https://github.com/jaraco/keyring/blob/97689324abcf01bd1793d49063e7ca01e03d7d07/keyring/backend.py#L134-L139 - if username is not None: - password = self._get_password(url, username) - if password is not None: - return username, password - return None - - def save_auth_info(self, url: str, username: str, password: str) -> None: - return self._set_password(url, username, password) - - def _get_password(self, service_name: str, username: str) -> Optional[str]: - """Mirror the implementation of keyring.get_password using cli""" - if self.keyring is None: - return None - - cmd = [self.keyring, "get", service_name, username] - env = os.environ.copy() - env["PYTHONIOENCODING"] = "utf-8" - res = subprocess.run( - cmd, - stdin=subprocess.DEVNULL, - stdout=subprocess.PIPE, - env=env, - ) - if res.returncode: - return None - return res.stdout.decode("utf-8").strip(os.linesep) - - def _set_password(self, service_name: str, username: str, password: str) -> None: - """Mirror the implementation of keyring.set_password using cli""" - if self.keyring is None: - return None - env = os.environ.copy() - env["PYTHONIOENCODING"] = "utf-8" - subprocess.run( - [self.keyring, "set", service_name, username], - input=f"{password}{os.linesep}".encode("utf-8"), - env=env, - check=True, - ) - return None - - -@lru_cache(maxsize=None) -def get_keyring_provider(provider: str) -> KeyRingBaseProvider: - logger.verbose("Keyring provider requested: %s", provider) - - # keyring has previously failed and been disabled - if KEYRING_DISABLED: - provider = "disabled" - if provider in ["import", "auto"]: - try: - impl = KeyRingPythonProvider() - logger.verbose("Keyring provider set: import") - return impl - except ImportError: - pass - except Exception as exc: - # In the event of an unexpected exception - # we should warn the user - msg = "Installed copy of keyring fails with exception %s" - if provider == "auto": - msg = msg + ", trying to find a keyring executable as a fallback" - logger.warning(msg, exc, exc_info=logger.isEnabledFor(logging.DEBUG)) - if provider in ["subprocess", "auto"]: - cli = shutil.which("keyring") - if cli and cli.startswith(sysconfig.get_path("scripts")): - # all code within this function is stolen from shutil.which implementation - @typing.no_type_check - def PATH_as_shutil_which_determines_it() -> str: - path = os.environ.get("PATH", None) - if path is None: - try: - path = os.confstr("CS_PATH") - except (AttributeError, ValueError): - # os.confstr() or CS_PATH is not available - path = os.defpath - # bpo-35755: Don't use os.defpath if the PATH environment variable is - # set to an empty string - - return path - - scripts = Path(sysconfig.get_path("scripts")) - - paths = [] - for path in PATH_as_shutil_which_determines_it().split(os.pathsep): - p = Path(path) - try: - if not p.samefile(scripts): - paths.append(path) - except FileNotFoundError: - pass - - path = os.pathsep.join(paths) - - cli = shutil.which("keyring", path=path) - - if cli: - logger.verbose("Keyring provider set: subprocess with executable %s", cli) - return KeyRingCliProvider(cli) - - logger.verbose("Keyring provider set: disabled") - return KeyRingNullProvider() - - -class MultiDomainBasicAuth(AuthBase): - def __init__( - self, - prompting: bool = True, - index_urls: Optional[List[str]] = None, - keyring_provider: str = "auto", - ) -> None: - self.prompting = prompting - self.index_urls = index_urls - self.keyring_provider = keyring_provider # type: ignore[assignment] - self.passwords: Dict[str, AuthInfo] = {} - # When the user is prompted to enter credentials and keyring is - # available, we will offer to save them. If the user accepts, - # this value is set to the credentials they entered. After the - # request authenticates, the caller should call - # ``save_credentials`` to save these. - self._credentials_to_save: Optional[Credentials] = None - - @property - def keyring_provider(self) -> KeyRingBaseProvider: - return get_keyring_provider(self._keyring_provider) - - @keyring_provider.setter - def keyring_provider(self, provider: str) -> None: - # The free function get_keyring_provider has been decorated with - # functools.cache. If an exception occurs in get_keyring_auth that - # cache will be cleared and keyring disabled, take that into account - # if you want to remove this indirection. - self._keyring_provider = provider - - @property - def use_keyring(self) -> bool: - # We won't use keyring when --no-input is passed unless - # a specific provider is requested because it might require - # user interaction - return self.prompting or self._keyring_provider not in ["auto", "disabled"] - - def _get_keyring_auth( - self, - url: Optional[str], - username: Optional[str], - ) -> Optional[AuthInfo]: - """Return the tuple auth for a given url from keyring.""" - # Do nothing if no url was provided - if not url: - return None - - try: - return self.keyring_provider.get_auth_info(url, username) - except Exception as exc: - logger.warning( - "Keyring is skipped due to an exception: %s", - str(exc), - ) - global KEYRING_DISABLED - KEYRING_DISABLED = True - get_keyring_provider.cache_clear() - return None - - def _get_index_url(self, url: str) -> Optional[str]: - """Return the original index URL matching the requested URL. - - Cached or dynamically generated credentials may work against - the original index URL rather than just the netloc. - - The provided url should have had its username and password - removed already. If the original index url had credentials then - they will be included in the return value. - - Returns None if no matching index was found, or if --no-index - was specified by the user. - """ - if not url or not self.index_urls: - return None - - url = remove_auth_from_url(url).rstrip("/") + "/" - parsed_url = urllib.parse.urlsplit(url) - - candidates = [] - - for index in self.index_urls: - index = index.rstrip("/") + "/" - parsed_index = urllib.parse.urlsplit(remove_auth_from_url(index)) - if parsed_url == parsed_index: - return index - - if parsed_url.netloc != parsed_index.netloc: - continue - - candidate = urllib.parse.urlsplit(index) - candidates.append(candidate) - - if not candidates: - return None - - candidates.sort( - reverse=True, - key=lambda candidate: commonprefix( - [ - parsed_url.path, - candidate.path, - ] - ).rfind("/"), - ) - - return urllib.parse.urlunsplit(candidates[0]) - - def _get_new_credentials( - self, - original_url: str, - *, - allow_netrc: bool = True, - allow_keyring: bool = False, - ) -> AuthInfo: - """Find and return credentials for the specified URL.""" - # Split the credentials and netloc from the url. - url, netloc, url_user_password = split_auth_netloc_from_url( - original_url, - ) - - # Start with the credentials embedded in the url - username, password = url_user_password - if username is not None and password is not None: - logger.debug("Found credentials in url for %s", netloc) - return url_user_password - - # Find a matching index url for this request - index_url = self._get_index_url(url) - if index_url: - # Split the credentials from the url. - index_info = split_auth_netloc_from_url(index_url) - if index_info: - index_url, _, index_url_user_password = index_info - logger.debug("Found index url %s", index_url) - - # If an index URL was found, try its embedded credentials - if index_url and index_url_user_password[0] is not None: - username, password = index_url_user_password - if username is not None and password is not None: - logger.debug("Found credentials in index url for %s", netloc) - return index_url_user_password - - # Get creds from netrc if we still don't have them - if allow_netrc: - netrc_auth = get_netrc_auth(original_url) - if netrc_auth: - logger.debug("Found credentials in netrc for %s", netloc) - return netrc_auth - - # If we don't have a password and keyring is available, use it. - if allow_keyring: - # The index url is more specific than the netloc, so try it first - # fmt: off - kr_auth = ( - self._get_keyring_auth(index_url, username) or - self._get_keyring_auth(netloc, username) - ) - # fmt: on - if kr_auth: - logger.debug("Found credentials in keyring for %s", netloc) - return kr_auth - - return username, password - - def _get_url_and_credentials( - self, original_url: str - ) -> Tuple[str, Optional[str], Optional[str]]: - """Return the credentials to use for the provided URL. - - If allowed, netrc and keyring may be used to obtain the - correct credentials. - - Returns (url_without_credentials, username, password). Note - that even if the original URL contains credentials, this - function may return a different username and password. - """ - url, netloc, _ = split_auth_netloc_from_url(original_url) - - # Try to get credentials from original url - username, password = self._get_new_credentials(original_url) - - # If credentials not found, use any stored credentials for this netloc. - # Do this if either the username or the password is missing. - # This accounts for the situation in which the user has specified - # the username in the index url, but the password comes from keyring. - if (username is None or password is None) and netloc in self.passwords: - un, pw = self.passwords[netloc] - # It is possible that the cached credentials are for a different username, - # in which case the cache should be ignored. - if username is None or username == un: - username, password = un, pw - - if username is not None or password is not None: - # Convert the username and password if they're None, so that - # this netloc will show up as "cached" in the conditional above. - # Further, HTTPBasicAuth doesn't accept None, so it makes sense to - # cache the value that is going to be used. - username = username or "" - password = password or "" - - # Store any acquired credentials. - self.passwords[netloc] = (username, password) - - assert ( - # Credentials were found - (username is not None and password is not None) - # Credentials were not found - or (username is None and password is None) - ), f"Could not load credentials from url: {original_url}" - - return url, username, password - - def __call__(self, req: Request) -> Request: - # Get credentials for this request - url, username, password = self._get_url_and_credentials(req.url) - - # Set the url of the request to the url without any credentials - req.url = url - - if username is not None and password is not None: - # Send the basic auth with this request - req = HTTPBasicAuth(username, password)(req) - - # Attach a hook to handle 401 responses - req.register_hook("response", self.handle_401) - - return req - - # Factored out to allow for easy patching in tests - def _prompt_for_password( - self, netloc: str - ) -> Tuple[Optional[str], Optional[str], bool]: - username = ask_input(f"User for {netloc}: ") if self.prompting else None - if not username: - return None, None, False - if self.use_keyring: - auth = self._get_keyring_auth(netloc, username) - if auth and auth[0] is not None and auth[1] is not None: - return auth[0], auth[1], False - password = ask_password("Password: ") - return username, password, True - - # Factored out to allow for easy patching in tests - def _should_save_password_to_keyring(self) -> bool: - if ( - not self.prompting - or not self.use_keyring - or not self.keyring_provider.has_keyring - ): - return False - return ask("Save credentials to keyring [y/N]: ", ["y", "n"]) == "y" - - def handle_401(self, resp: Response, **kwargs: Any) -> Response: - # We only care about 401 responses, anything else we want to just - # pass through the actual response - if resp.status_code != 401: - return resp - - username, password = None, None - - # Query the keyring for credentials: - if self.use_keyring: - username, password = self._get_new_credentials( - resp.url, - allow_netrc=False, - allow_keyring=True, - ) - - # We are not able to prompt the user so simply return the response - if not self.prompting and not username and not password: - return resp - - parsed = urllib.parse.urlparse(resp.url) - - # Prompt the user for a new username and password - save = False - if not username and not password: - username, password, save = self._prompt_for_password(parsed.netloc) - - # Store the new username and password to use for future requests - self._credentials_to_save = None - if username is not None and password is not None: - self.passwords[parsed.netloc] = (username, password) - - # Prompt to save the password to keyring - if save and self._should_save_password_to_keyring(): - self._credentials_to_save = Credentials( - url=parsed.netloc, - username=username, - password=password, - ) - - # Consume content and release the original connection to allow our new - # request to reuse the same one. - # The result of the assignment isn't used, it's just needed to consume - # the content. - _ = resp.content - resp.raw.release_conn() - - # Add our new username and password to the request - req = HTTPBasicAuth(username or "", password or "")(resp.request) - req.register_hook("response", self.warn_on_401) - - # On successful request, save the credentials that were used to - # keyring. (Note that if the user responded "no" above, this member - # is not set and nothing will be saved.) - if self._credentials_to_save: - req.register_hook("response", self.save_credentials) - - # Send our new request - new_resp = resp.connection.send(req, **kwargs) - new_resp.history.append(resp) - - return new_resp - - def warn_on_401(self, resp: Response, **kwargs: Any) -> None: - """Response callback to warn about incorrect credentials.""" - if resp.status_code == 401: - logger.warning( - "401 Error, Credentials not correct for %s", - resp.request.url, - ) - - def save_credentials(self, resp: Response, **kwargs: Any) -> None: - """Response callback to save credentials on success.""" - assert ( - self.keyring_provider.has_keyring - ), "should never reach here without keyring" - - creds = self._credentials_to_save - self._credentials_to_save = None - if creds and resp.status_code < 400: - try: - logger.info("Saving credentials to keyring") - self.keyring_provider.save_auth_info( - creds.url, creds.username, creds.password - ) - except Exception: - logger.exception("Failed to save credentials") diff --git a/venv/lib/python3.12/site-packages/pip/_internal/network/cache.py b/venv/lib/python3.12/site-packages/pip/_internal/network/cache.py deleted file mode 100644 index 4d0fb54..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/network/cache.py +++ /dev/null @@ -1,106 +0,0 @@ -"""HTTP cache implementation. -""" - -import os -from contextlib import contextmanager -from datetime import datetime -from typing import BinaryIO, Generator, Optional, Union - -from pip._vendor.cachecontrol.cache import SeparateBodyBaseCache -from pip._vendor.cachecontrol.caches import SeparateBodyFileCache -from pip._vendor.requests.models import Response - -from pip._internal.utils.filesystem import adjacent_tmp_file, replace -from pip._internal.utils.misc import ensure_dir - - -def is_from_cache(response: Response) -> bool: - return getattr(response, "from_cache", False) - - -@contextmanager -def suppressed_cache_errors() -> Generator[None, None, None]: - """If we can't access the cache then we can just skip caching and process - requests as if caching wasn't enabled. - """ - try: - yield - except OSError: - pass - - -class SafeFileCache(SeparateBodyBaseCache): - """ - A file based cache which is safe to use even when the target directory may - not be accessible or writable. - - There is a race condition when two processes try to write and/or read the - same entry at the same time, since each entry consists of two separate - files (https://github.com/psf/cachecontrol/issues/324). We therefore have - additional logic that makes sure that both files to be present before - returning an entry; this fixes the read side of the race condition. - - For the write side, we assume that the server will only ever return the - same data for the same URL, which ought to be the case for files pip is - downloading. PyPI does not have a mechanism to swap out a wheel for - another wheel, for example. If this assumption is not true, the - CacheControl issue will need to be fixed. - """ - - def __init__(self, directory: str) -> None: - assert directory is not None, "Cache directory must not be None." - super().__init__() - self.directory = directory - - def _get_cache_path(self, name: str) -> str: - # From cachecontrol.caches.file_cache.FileCache._fn, brought into our - # class for backwards-compatibility and to avoid using a non-public - # method. - hashed = SeparateBodyFileCache.encode(name) - parts = list(hashed[:5]) + [hashed] - return os.path.join(self.directory, *parts) - - def get(self, key: str) -> Optional[bytes]: - # The cache entry is only valid if both metadata and body exist. - metadata_path = self._get_cache_path(key) - body_path = metadata_path + ".body" - if not (os.path.exists(metadata_path) and os.path.exists(body_path)): - return None - with suppressed_cache_errors(): - with open(metadata_path, "rb") as f: - return f.read() - - def _write(self, path: str, data: bytes) -> None: - with suppressed_cache_errors(): - ensure_dir(os.path.dirname(path)) - - with adjacent_tmp_file(path) as f: - f.write(data) - - replace(f.name, path) - - def set( - self, key: str, value: bytes, expires: Union[int, datetime, None] = None - ) -> None: - path = self._get_cache_path(key) - self._write(path, value) - - def delete(self, key: str) -> None: - path = self._get_cache_path(key) - with suppressed_cache_errors(): - os.remove(path) - with suppressed_cache_errors(): - os.remove(path + ".body") - - def get_body(self, key: str) -> Optional[BinaryIO]: - # The cache entry is only valid if both metadata and body exist. - metadata_path = self._get_cache_path(key) - body_path = metadata_path + ".body" - if not (os.path.exists(metadata_path) and os.path.exists(body_path)): - return None - with suppressed_cache_errors(): - return open(body_path, "rb") - - def set_body(self, key: str, body: bytes) -> None: - path = self._get_cache_path(key) + ".body" - self._write(path, body) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/network/download.py b/venv/lib/python3.12/site-packages/pip/_internal/network/download.py deleted file mode 100644 index d1d4354..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/network/download.py +++ /dev/null @@ -1,186 +0,0 @@ -"""Download files with progress indicators. -""" -import email.message -import logging -import mimetypes -import os -from typing import Iterable, Optional, Tuple - -from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response - -from pip._internal.cli.progress_bars import get_download_progress_renderer -from pip._internal.exceptions import NetworkConnectionError -from pip._internal.models.index import PyPI -from pip._internal.models.link import Link -from pip._internal.network.cache import is_from_cache -from pip._internal.network.session import PipSession -from pip._internal.network.utils import HEADERS, raise_for_status, response_chunks -from pip._internal.utils.misc import format_size, redact_auth_from_url, splitext - -logger = logging.getLogger(__name__) - - -def _get_http_response_size(resp: Response) -> Optional[int]: - try: - return int(resp.headers["content-length"]) - except (ValueError, KeyError, TypeError): - return None - - -def _prepare_download( - resp: Response, - link: Link, - progress_bar: str, -) -> Iterable[bytes]: - total_length = _get_http_response_size(resp) - - if link.netloc == PyPI.file_storage_domain: - url = link.show_url - else: - url = link.url_without_fragment - - logged_url = redact_auth_from_url(url) - - if total_length: - logged_url = f"{logged_url} ({format_size(total_length)})" - - if is_from_cache(resp): - logger.info("Using cached %s", logged_url) - else: - logger.info("Downloading %s", logged_url) - - if logger.getEffectiveLevel() > logging.INFO: - show_progress = False - elif is_from_cache(resp): - show_progress = False - elif not total_length: - show_progress = True - elif total_length > (40 * 1000): - show_progress = True - else: - show_progress = False - - chunks = response_chunks(resp, CONTENT_CHUNK_SIZE) - - if not show_progress: - return chunks - - renderer = get_download_progress_renderer(bar_type=progress_bar, size=total_length) - return renderer(chunks) - - -def sanitize_content_filename(filename: str) -> str: - """ - Sanitize the "filename" value from a Content-Disposition header. - """ - return os.path.basename(filename) - - -def parse_content_disposition(content_disposition: str, default_filename: str) -> str: - """ - Parse the "filename" value from a Content-Disposition header, and - return the default filename if the result is empty. - """ - m = email.message.Message() - m["content-type"] = content_disposition - filename = m.get_param("filename") - if filename: - # We need to sanitize the filename to prevent directory traversal - # in case the filename contains ".." path parts. - filename = sanitize_content_filename(str(filename)) - return filename or default_filename - - -def _get_http_response_filename(resp: Response, link: Link) -> str: - """Get an ideal filename from the given HTTP response, falling back to - the link filename if not provided. - """ - filename = link.filename # fallback - # Have a look at the Content-Disposition header for a better guess - content_disposition = resp.headers.get("content-disposition") - if content_disposition: - filename = parse_content_disposition(content_disposition, filename) - ext: Optional[str] = splitext(filename)[1] - if not ext: - ext = mimetypes.guess_extension(resp.headers.get("content-type", "")) - if ext: - filename += ext - if not ext and link.url != resp.url: - ext = os.path.splitext(resp.url)[1] - if ext: - filename += ext - return filename - - -def _http_get_download(session: PipSession, link: Link) -> Response: - target_url = link.url.split("#", 1)[0] - resp = session.get(target_url, headers=HEADERS, stream=True) - raise_for_status(resp) - return resp - - -class Downloader: - def __init__( - self, - session: PipSession, - progress_bar: str, - ) -> None: - self._session = session - self._progress_bar = progress_bar - - def __call__(self, link: Link, location: str) -> Tuple[str, str]: - """Download the file given by link into location.""" - try: - resp = _http_get_download(self._session, link) - except NetworkConnectionError as e: - assert e.response is not None - logger.critical( - "HTTP error %s while getting %s", e.response.status_code, link - ) - raise - - filename = _get_http_response_filename(resp, link) - filepath = os.path.join(location, filename) - - chunks = _prepare_download(resp, link, self._progress_bar) - with open(filepath, "wb") as content_file: - for chunk in chunks: - content_file.write(chunk) - content_type = resp.headers.get("Content-Type", "") - return filepath, content_type - - -class BatchDownloader: - def __init__( - self, - session: PipSession, - progress_bar: str, - ) -> None: - self._session = session - self._progress_bar = progress_bar - - def __call__( - self, links: Iterable[Link], location: str - ) -> Iterable[Tuple[Link, Tuple[str, str]]]: - """Download the files given by links into location.""" - for link in links: - try: - resp = _http_get_download(self._session, link) - except NetworkConnectionError as e: - assert e.response is not None - logger.critical( - "HTTP error %s while getting %s", - e.response.status_code, - link, - ) - raise - - filename = _get_http_response_filename(resp, link) - filepath = os.path.join(location, filename) - - chunks = _prepare_download(resp, link, self._progress_bar) - with open(filepath, "wb") as content_file: - for chunk in chunks: - content_file.write(chunk) - content_type = resp.headers.get("Content-Type", "") - yield link, (filepath, content_type) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/network/lazy_wheel.py b/venv/lib/python3.12/site-packages/pip/_internal/network/lazy_wheel.py deleted file mode 100644 index 82ec50d..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/network/lazy_wheel.py +++ /dev/null @@ -1,210 +0,0 @@ -"""Lazy ZIP over HTTP""" - -__all__ = ["HTTPRangeRequestUnsupported", "dist_from_wheel_url"] - -from bisect import bisect_left, bisect_right -from contextlib import contextmanager -from tempfile import NamedTemporaryFile -from typing import Any, Dict, Generator, List, Optional, Tuple -from zipfile import BadZipFile, ZipFile - -from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response - -from pip._internal.metadata import BaseDistribution, MemoryWheel, get_wheel_distribution -from pip._internal.network.session import PipSession -from pip._internal.network.utils import HEADERS, raise_for_status, response_chunks - - -class HTTPRangeRequestUnsupported(Exception): - pass - - -def dist_from_wheel_url(name: str, url: str, session: PipSession) -> BaseDistribution: - """Return a distribution object from the given wheel URL. - - This uses HTTP range requests to only fetch the portion of the wheel - containing metadata, just enough for the object to be constructed. - If such requests are not supported, HTTPRangeRequestUnsupported - is raised. - """ - with LazyZipOverHTTP(url, session) as zf: - # For read-only ZIP files, ZipFile only needs methods read, - # seek, seekable and tell, not the whole IO protocol. - wheel = MemoryWheel(zf.name, zf) # type: ignore - # After context manager exit, wheel.name - # is an invalid file by intention. - return get_wheel_distribution(wheel, canonicalize_name(name)) - - -class LazyZipOverHTTP: - """File-like object mapped to a ZIP file over HTTP. - - This uses HTTP range requests to lazily fetch the file's content, - which is supposed to be fed to ZipFile. If such requests are not - supported by the server, raise HTTPRangeRequestUnsupported - during initialization. - """ - - def __init__( - self, url: str, session: PipSession, chunk_size: int = CONTENT_CHUNK_SIZE - ) -> None: - head = session.head(url, headers=HEADERS) - raise_for_status(head) - assert head.status_code == 200 - self._session, self._url, self._chunk_size = session, url, chunk_size - self._length = int(head.headers["Content-Length"]) - self._file = NamedTemporaryFile() - self.truncate(self._length) - self._left: List[int] = [] - self._right: List[int] = [] - if "bytes" not in head.headers.get("Accept-Ranges", "none"): - raise HTTPRangeRequestUnsupported("range request is not supported") - self._check_zip() - - @property - def mode(self) -> str: - """Opening mode, which is always rb.""" - return "rb" - - @property - def name(self) -> str: - """Path to the underlying file.""" - return self._file.name - - def seekable(self) -> bool: - """Return whether random access is supported, which is True.""" - return True - - def close(self) -> None: - """Close the file.""" - self._file.close() - - @property - def closed(self) -> bool: - """Whether the file is closed.""" - return self._file.closed - - def read(self, size: int = -1) -> bytes: - """Read up to size bytes from the object and return them. - - As a convenience, if size is unspecified or -1, - all bytes until EOF are returned. Fewer than - size bytes may be returned if EOF is reached. - """ - download_size = max(size, self._chunk_size) - start, length = self.tell(), self._length - stop = length if size < 0 else min(start + download_size, length) - start = max(0, stop - download_size) - self._download(start, stop - 1) - return self._file.read(size) - - def readable(self) -> bool: - """Return whether the file is readable, which is True.""" - return True - - def seek(self, offset: int, whence: int = 0) -> int: - """Change stream position and return the new absolute position. - - Seek to offset relative position indicated by whence: - * 0: Start of stream (the default). pos should be >= 0; - * 1: Current position - pos may be negative; - * 2: End of stream - pos usually negative. - """ - return self._file.seek(offset, whence) - - def tell(self) -> int: - """Return the current position.""" - return self._file.tell() - - def truncate(self, size: Optional[int] = None) -> int: - """Resize the stream to the given size in bytes. - - If size is unspecified resize to the current position. - The current stream position isn't changed. - - Return the new file size. - """ - return self._file.truncate(size) - - def writable(self) -> bool: - """Return False.""" - return False - - def __enter__(self) -> "LazyZipOverHTTP": - self._file.__enter__() - return self - - def __exit__(self, *exc: Any) -> None: - self._file.__exit__(*exc) - - @contextmanager - def _stay(self) -> Generator[None, None, None]: - """Return a context manager keeping the position. - - At the end of the block, seek back to original position. - """ - pos = self.tell() - try: - yield - finally: - self.seek(pos) - - def _check_zip(self) -> None: - """Check and download until the file is a valid ZIP.""" - end = self._length - 1 - for start in reversed(range(0, end, self._chunk_size)): - self._download(start, end) - with self._stay(): - try: - # For read-only ZIP files, ZipFile only needs - # methods read, seek, seekable and tell. - ZipFile(self) # type: ignore - except BadZipFile: - pass - else: - break - - def _stream_response( - self, start: int, end: int, base_headers: Dict[str, str] = HEADERS - ) -> Response: - """Return HTTP response to a range request from start to end.""" - headers = base_headers.copy() - headers["Range"] = f"bytes={start}-{end}" - # TODO: Get range requests to be correctly cached - headers["Cache-Control"] = "no-cache" - return self._session.get(self._url, headers=headers, stream=True) - - def _merge( - self, start: int, end: int, left: int, right: int - ) -> Generator[Tuple[int, int], None, None]: - """Return a generator of intervals to be fetched. - - Args: - start (int): Start of needed interval - end (int): End of needed interval - left (int): Index of first overlapping downloaded data - right (int): Index after last overlapping downloaded data - """ - lslice, rslice = self._left[left:right], self._right[left:right] - i = start = min([start] + lslice[:1]) - end = max([end] + rslice[-1:]) - for j, k in zip(lslice, rslice): - if j > i: - yield i, j - 1 - i = k + 1 - if i <= end: - yield i, end - self._left[left:right], self._right[left:right] = [start], [end] - - def _download(self, start: int, end: int) -> None: - """Download bytes from start to end inclusively.""" - with self._stay(): - left = bisect_left(self._right, start) - right = bisect_right(self._left, end) - for start, end in self._merge(start, end, left, right): - response = self._stream_response(start, end) - response.raise_for_status() - self.seek(start) - for chunk in response_chunks(response, self._chunk_size): - self._file.write(chunk) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/network/session.py b/venv/lib/python3.12/site-packages/pip/_internal/network/session.py deleted file mode 100644 index f17efc5..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/network/session.py +++ /dev/null @@ -1,520 +0,0 @@ -"""PipSession and supporting code, containing all pip-specific -network request configuration and behavior. -""" - -import email.utils -import io -import ipaddress -import json -import logging -import mimetypes -import os -import platform -import shutil -import subprocess -import sys -import urllib.parse -import warnings -from typing import ( - TYPE_CHECKING, - Any, - Dict, - Generator, - List, - Mapping, - Optional, - Sequence, - Tuple, - Union, -) - -from pip._vendor import requests, urllib3 -from pip._vendor.cachecontrol import CacheControlAdapter as _BaseCacheControlAdapter -from pip._vendor.requests.adapters import DEFAULT_POOLBLOCK, BaseAdapter -from pip._vendor.requests.adapters import HTTPAdapter as _BaseHTTPAdapter -from pip._vendor.requests.models import PreparedRequest, Response -from pip._vendor.requests.structures import CaseInsensitiveDict -from pip._vendor.urllib3.connectionpool import ConnectionPool -from pip._vendor.urllib3.exceptions import InsecureRequestWarning - -from pip import __version__ -from pip._internal.metadata import get_default_environment -from pip._internal.models.link import Link -from pip._internal.network.auth import MultiDomainBasicAuth -from pip._internal.network.cache import SafeFileCache - -# Import ssl from compat so the initial import occurs in only one place. -from pip._internal.utils.compat import has_tls -from pip._internal.utils.glibc import libc_ver -from pip._internal.utils.misc import build_url_from_netloc, parse_netloc -from pip._internal.utils.urls import url_to_path - -if TYPE_CHECKING: - from ssl import SSLContext - - from pip._vendor.urllib3.poolmanager import PoolManager - - -logger = logging.getLogger(__name__) - -SecureOrigin = Tuple[str, str, Optional[Union[int, str]]] - - -# Ignore warning raised when using --trusted-host. -warnings.filterwarnings("ignore", category=InsecureRequestWarning) - - -SECURE_ORIGINS: List[SecureOrigin] = [ - # protocol, hostname, port - # Taken from Chrome's list of secure origins (See: http://bit.ly/1qrySKC) - ("https", "*", "*"), - ("*", "localhost", "*"), - ("*", "127.0.0.0/8", "*"), - ("*", "::1/128", "*"), - ("file", "*", None), - # ssh is always secure. - ("ssh", "*", "*"), -] - - -# These are environment variables present when running under various -# CI systems. For each variable, some CI systems that use the variable -# are indicated. The collection was chosen so that for each of a number -# of popular systems, at least one of the environment variables is used. -# This list is used to provide some indication of and lower bound for -# CI traffic to PyPI. Thus, it is okay if the list is not comprehensive. -# For more background, see: https://github.com/pypa/pip/issues/5499 -CI_ENVIRONMENT_VARIABLES = ( - # Azure Pipelines - "BUILD_BUILDID", - # Jenkins - "BUILD_ID", - # AppVeyor, CircleCI, Codeship, Gitlab CI, Shippable, Travis CI - "CI", - # Explicit environment variable. - "PIP_IS_CI", -) - - -def looks_like_ci() -> bool: - """ - Return whether it looks like pip is running under CI. - """ - # We don't use the method of checking for a tty (e.g. using isatty()) - # because some CI systems mimic a tty (e.g. Travis CI). Thus that - # method doesn't provide definitive information in either direction. - return any(name in os.environ for name in CI_ENVIRONMENT_VARIABLES) - - -def user_agent() -> str: - """ - Return a string representing the user agent. - """ - data: Dict[str, Any] = { - "installer": {"name": "pip", "version": __version__}, - "python": platform.python_version(), - "implementation": { - "name": platform.python_implementation(), - }, - } - - if data["implementation"]["name"] == "CPython": - data["implementation"]["version"] = platform.python_version() - elif data["implementation"]["name"] == "PyPy": - pypy_version_info = sys.pypy_version_info # type: ignore - if pypy_version_info.releaselevel == "final": - pypy_version_info = pypy_version_info[:3] - data["implementation"]["version"] = ".".join( - [str(x) for x in pypy_version_info] - ) - elif data["implementation"]["name"] == "Jython": - # Complete Guess - data["implementation"]["version"] = platform.python_version() - elif data["implementation"]["name"] == "IronPython": - # Complete Guess - data["implementation"]["version"] = platform.python_version() - - if sys.platform.startswith("linux"): - from pip._vendor import distro - - linux_distribution = distro.name(), distro.version(), distro.codename() - distro_infos: Dict[str, Any] = dict( - filter( - lambda x: x[1], - zip(["name", "version", "id"], linux_distribution), - ) - ) - libc = dict( - filter( - lambda x: x[1], - zip(["lib", "version"], libc_ver()), - ) - ) - if libc: - distro_infos["libc"] = libc - if distro_infos: - data["distro"] = distro_infos - - if sys.platform.startswith("darwin") and platform.mac_ver()[0]: - data["distro"] = {"name": "macOS", "version": platform.mac_ver()[0]} - - if platform.system(): - data.setdefault("system", {})["name"] = platform.system() - - if platform.release(): - data.setdefault("system", {})["release"] = platform.release() - - if platform.machine(): - data["cpu"] = platform.machine() - - if has_tls(): - import _ssl as ssl - - data["openssl_version"] = ssl.OPENSSL_VERSION - - setuptools_dist = get_default_environment().get_distribution("setuptools") - if setuptools_dist is not None: - data["setuptools_version"] = str(setuptools_dist.version) - - if shutil.which("rustc") is not None: - # If for any reason `rustc --version` fails, silently ignore it - try: - rustc_output = subprocess.check_output( - ["rustc", "--version"], stderr=subprocess.STDOUT, timeout=0.5 - ) - except Exception: - pass - else: - if rustc_output.startswith(b"rustc "): - # The format of `rustc --version` is: - # `b'rustc 1.52.1 (9bc8c42bb 2021-05-09)\n'` - # We extract just the middle (1.52.1) part - data["rustc_version"] = rustc_output.split(b" ")[1].decode() - - # Use None rather than False so as not to give the impression that - # pip knows it is not being run under CI. Rather, it is a null or - # inconclusive result. Also, we include some value rather than no - # value to make it easier to know that the check has been run. - data["ci"] = True if looks_like_ci() else None - - user_data = os.environ.get("PIP_USER_AGENT_USER_DATA") - if user_data is not None: - data["user_data"] = user_data - - return "{data[installer][name]}/{data[installer][version]} {json}".format( - data=data, - json=json.dumps(data, separators=(",", ":"), sort_keys=True), - ) - - -class LocalFSAdapter(BaseAdapter): - def send( - self, - request: PreparedRequest, - stream: bool = False, - timeout: Optional[Union[float, Tuple[float, float]]] = None, - verify: Union[bool, str] = True, - cert: Optional[Union[str, Tuple[str, str]]] = None, - proxies: Optional[Mapping[str, str]] = None, - ) -> Response: - pathname = url_to_path(request.url) - - resp = Response() - resp.status_code = 200 - resp.url = request.url - - try: - stats = os.stat(pathname) - except OSError as exc: - # format the exception raised as a io.BytesIO object, - # to return a better error message: - resp.status_code = 404 - resp.reason = type(exc).__name__ - resp.raw = io.BytesIO(f"{resp.reason}: {exc}".encode("utf8")) - else: - modified = email.utils.formatdate(stats.st_mtime, usegmt=True) - content_type = mimetypes.guess_type(pathname)[0] or "text/plain" - resp.headers = CaseInsensitiveDict( - { - "Content-Type": content_type, - "Content-Length": stats.st_size, - "Last-Modified": modified, - } - ) - - resp.raw = open(pathname, "rb") - resp.close = resp.raw.close - - return resp - - def close(self) -> None: - pass - - -class _SSLContextAdapterMixin: - """Mixin to add the ``ssl_context`` constructor argument to HTTP adapters. - - The additional argument is forwarded directly to the pool manager. This allows us - to dynamically decide what SSL store to use at runtime, which is used to implement - the optional ``truststore`` backend. - """ - - def __init__( - self, - *, - ssl_context: Optional["SSLContext"] = None, - **kwargs: Any, - ) -> None: - self._ssl_context = ssl_context - super().__init__(**kwargs) - - def init_poolmanager( - self, - connections: int, - maxsize: int, - block: bool = DEFAULT_POOLBLOCK, - **pool_kwargs: Any, - ) -> "PoolManager": - if self._ssl_context is not None: - pool_kwargs.setdefault("ssl_context", self._ssl_context) - return super().init_poolmanager( # type: ignore[misc] - connections=connections, - maxsize=maxsize, - block=block, - **pool_kwargs, - ) - - -class HTTPAdapter(_SSLContextAdapterMixin, _BaseHTTPAdapter): - pass - - -class CacheControlAdapter(_SSLContextAdapterMixin, _BaseCacheControlAdapter): - pass - - -class InsecureHTTPAdapter(HTTPAdapter): - def cert_verify( - self, - conn: ConnectionPool, - url: str, - verify: Union[bool, str], - cert: Optional[Union[str, Tuple[str, str]]], - ) -> None: - super().cert_verify(conn=conn, url=url, verify=False, cert=cert) - - -class InsecureCacheControlAdapter(CacheControlAdapter): - def cert_verify( - self, - conn: ConnectionPool, - url: str, - verify: Union[bool, str], - cert: Optional[Union[str, Tuple[str, str]]], - ) -> None: - super().cert_verify(conn=conn, url=url, verify=False, cert=cert) - - -class PipSession(requests.Session): - timeout: Optional[int] = None - - def __init__( - self, - *args: Any, - retries: int = 0, - cache: Optional[str] = None, - trusted_hosts: Sequence[str] = (), - index_urls: Optional[List[str]] = None, - ssl_context: Optional["SSLContext"] = None, - **kwargs: Any, - ) -> None: - """ - :param trusted_hosts: Domains not to emit warnings for when not using - HTTPS. - """ - super().__init__(*args, **kwargs) - - # Namespace the attribute with "pip_" just in case to prevent - # possible conflicts with the base class. - self.pip_trusted_origins: List[Tuple[str, Optional[int]]] = [] - - # Attach our User Agent to the request - self.headers["User-Agent"] = user_agent() - - # Attach our Authentication handler to the session - self.auth = MultiDomainBasicAuth(index_urls=index_urls) - - # Create our urllib3.Retry instance which will allow us to customize - # how we handle retries. - retries = urllib3.Retry( - # Set the total number of retries that a particular request can - # have. - total=retries, - # A 503 error from PyPI typically means that the Fastly -> Origin - # connection got interrupted in some way. A 503 error in general - # is typically considered a transient error so we'll go ahead and - # retry it. - # A 500 may indicate transient error in Amazon S3 - # A 502 may be a transient error from a CDN like CloudFlare or CloudFront - # A 520 or 527 - may indicate transient error in CloudFlare - status_forcelist=[500, 502, 503, 520, 527], - # Add a small amount of back off between failed requests in - # order to prevent hammering the service. - backoff_factor=0.25, - ) # type: ignore - - # Our Insecure HTTPAdapter disables HTTPS validation. It does not - # support caching so we'll use it for all http:// URLs. - # If caching is disabled, we will also use it for - # https:// hosts that we've marked as ignoring - # TLS errors for (trusted-hosts). - insecure_adapter = InsecureHTTPAdapter(max_retries=retries) - - # We want to _only_ cache responses on securely fetched origins or when - # the host is specified as trusted. We do this because - # we can't validate the response of an insecurely/untrusted fetched - # origin, and we don't want someone to be able to poison the cache and - # require manual eviction from the cache to fix it. - if cache: - secure_adapter = CacheControlAdapter( - cache=SafeFileCache(cache), - max_retries=retries, - ssl_context=ssl_context, - ) - self._trusted_host_adapter = InsecureCacheControlAdapter( - cache=SafeFileCache(cache), - max_retries=retries, - ) - else: - secure_adapter = HTTPAdapter(max_retries=retries, ssl_context=ssl_context) - self._trusted_host_adapter = insecure_adapter - - self.mount("https://", secure_adapter) - self.mount("http://", insecure_adapter) - - # Enable file:// urls - self.mount("file://", LocalFSAdapter()) - - for host in trusted_hosts: - self.add_trusted_host(host, suppress_logging=True) - - def update_index_urls(self, new_index_urls: List[str]) -> None: - """ - :param new_index_urls: New index urls to update the authentication - handler with. - """ - self.auth.index_urls = new_index_urls - - def add_trusted_host( - self, host: str, source: Optional[str] = None, suppress_logging: bool = False - ) -> None: - """ - :param host: It is okay to provide a host that has previously been - added. - :param source: An optional source string, for logging where the host - string came from. - """ - if not suppress_logging: - msg = f"adding trusted host: {host!r}" - if source is not None: - msg += f" (from {source})" - logger.info(msg) - - parsed_host, parsed_port = parse_netloc(host) - if parsed_host is None: - raise ValueError(f"Trusted host URL must include a host part: {host!r}") - if (parsed_host, parsed_port) not in self.pip_trusted_origins: - self.pip_trusted_origins.append((parsed_host, parsed_port)) - - self.mount( - build_url_from_netloc(host, scheme="http") + "/", self._trusted_host_adapter - ) - self.mount(build_url_from_netloc(host) + "/", self._trusted_host_adapter) - if not parsed_port: - self.mount( - build_url_from_netloc(host, scheme="http") + ":", - self._trusted_host_adapter, - ) - # Mount wildcard ports for the same host. - self.mount(build_url_from_netloc(host) + ":", self._trusted_host_adapter) - - def iter_secure_origins(self) -> Generator[SecureOrigin, None, None]: - yield from SECURE_ORIGINS - for host, port in self.pip_trusted_origins: - yield ("*", host, "*" if port is None else port) - - def is_secure_origin(self, location: Link) -> bool: - # Determine if this url used a secure transport mechanism - parsed = urllib.parse.urlparse(str(location)) - origin_protocol, origin_host, origin_port = ( - parsed.scheme, - parsed.hostname, - parsed.port, - ) - - # The protocol to use to see if the protocol matches. - # Don't count the repository type as part of the protocol: in - # cases such as "git+ssh", only use "ssh". (I.e., Only verify against - # the last scheme.) - origin_protocol = origin_protocol.rsplit("+", 1)[-1] - - # Determine if our origin is a secure origin by looking through our - # hardcoded list of secure origins, as well as any additional ones - # configured on this PackageFinder instance. - for secure_origin in self.iter_secure_origins(): - secure_protocol, secure_host, secure_port = secure_origin - if origin_protocol != secure_protocol and secure_protocol != "*": - continue - - try: - addr = ipaddress.ip_address(origin_host or "") - network = ipaddress.ip_network(secure_host) - except ValueError: - # We don't have both a valid address or a valid network, so - # we'll check this origin against hostnames. - if ( - origin_host - and origin_host.lower() != secure_host.lower() - and secure_host != "*" - ): - continue - else: - # We have a valid address and network, so see if the address - # is contained within the network. - if addr not in network: - continue - - # Check to see if the port matches. - if ( - origin_port != secure_port - and secure_port != "*" - and secure_port is not None - ): - continue - - # If we've gotten here, then this origin matches the current - # secure origin and we should return True - return True - - # If we've gotten to this point, then the origin isn't secure and we - # will not accept it as a valid location to search. We will however - # log a warning that we are ignoring it. - logger.warning( - "The repository located at %s is not a trusted or secure host and " - "is being ignored. If this repository is available via HTTPS we " - "recommend you use HTTPS instead, otherwise you may silence " - "this warning and allow it anyway with '--trusted-host %s'.", - origin_host, - origin_host, - ) - - return False - - def request(self, method: str, url: str, *args: Any, **kwargs: Any) -> Response: - # Allow setting a default timeout on a session - kwargs.setdefault("timeout", self.timeout) - # Allow setting a default proxies on a session - kwargs.setdefault("proxies", self.proxies) - - # Dispatch the actual request - return super().request(method, url, *args, **kwargs) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/network/utils.py b/venv/lib/python3.12/site-packages/pip/_internal/network/utils.py deleted file mode 100644 index 134848a..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/network/utils.py +++ /dev/null @@ -1,96 +0,0 @@ -from typing import Dict, Generator - -from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response - -from pip._internal.exceptions import NetworkConnectionError - -# The following comments and HTTP headers were originally added by -# Donald Stufft in git commit 22c562429a61bb77172039e480873fb239dd8c03. -# -# We use Accept-Encoding: identity here because requests defaults to -# accepting compressed responses. This breaks in a variety of ways -# depending on how the server is configured. -# - Some servers will notice that the file isn't a compressible file -# and will leave the file alone and with an empty Content-Encoding -# - Some servers will notice that the file is already compressed and -# will leave the file alone, adding a Content-Encoding: gzip header -# - Some servers won't notice anything at all and will take a file -# that's already been compressed and compress it again, and set -# the Content-Encoding: gzip header -# By setting this to request only the identity encoding we're hoping -# to eliminate the third case. Hopefully there does not exist a server -# which when given a file will notice it is already compressed and that -# you're not asking for a compressed file and will then decompress it -# before sending because if that's the case I don't think it'll ever be -# possible to make this work. -HEADERS: Dict[str, str] = {"Accept-Encoding": "identity"} - - -def raise_for_status(resp: Response) -> None: - http_error_msg = "" - if isinstance(resp.reason, bytes): - # We attempt to decode utf-8 first because some servers - # choose to localize their reason strings. If the string - # isn't utf-8, we fall back to iso-8859-1 for all other - # encodings. - try: - reason = resp.reason.decode("utf-8") - except UnicodeDecodeError: - reason = resp.reason.decode("iso-8859-1") - else: - reason = resp.reason - - if 400 <= resp.status_code < 500: - http_error_msg = ( - f"{resp.status_code} Client Error: {reason} for url: {resp.url}" - ) - - elif 500 <= resp.status_code < 600: - http_error_msg = ( - f"{resp.status_code} Server Error: {reason} for url: {resp.url}" - ) - - if http_error_msg: - raise NetworkConnectionError(http_error_msg, response=resp) - - -def response_chunks( - response: Response, chunk_size: int = CONTENT_CHUNK_SIZE -) -> Generator[bytes, None, None]: - """Given a requests Response, provide the data chunks.""" - try: - # Special case for urllib3. - for chunk in response.raw.stream( - chunk_size, - # We use decode_content=False here because we don't - # want urllib3 to mess with the raw bytes we get - # from the server. If we decompress inside of - # urllib3 then we cannot verify the checksum - # because the checksum will be of the compressed - # file. This breakage will only occur if the - # server adds a Content-Encoding header, which - # depends on how the server was configured: - # - Some servers will notice that the file isn't a - # compressible file and will leave the file alone - # and with an empty Content-Encoding - # - Some servers will notice that the file is - # already compressed and will leave the file - # alone and will add a Content-Encoding: gzip - # header - # - Some servers won't notice anything at all and - # will take a file that's already been compressed - # and compress it again and set the - # Content-Encoding: gzip header - # - # By setting this not to decode automatically we - # hope to eliminate problems with the second case. - decode_content=False, - ): - yield chunk - except AttributeError: - # Standard file-like object. - while True: - chunk = response.raw.read(chunk_size) - if not chunk: - break - yield chunk diff --git a/venv/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py b/venv/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py deleted file mode 100644 index 22ec8d2..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py +++ /dev/null @@ -1,62 +0,0 @@ -"""xmlrpclib.Transport implementation -""" - -import logging -import urllib.parse -import xmlrpc.client -from typing import TYPE_CHECKING, Tuple - -from pip._internal.exceptions import NetworkConnectionError -from pip._internal.network.session import PipSession -from pip._internal.network.utils import raise_for_status - -if TYPE_CHECKING: - from xmlrpc.client import _HostType, _Marshallable - - from _typeshed import SizedBuffer - -logger = logging.getLogger(__name__) - - -class PipXmlrpcTransport(xmlrpc.client.Transport): - """Provide a `xmlrpclib.Transport` implementation via a `PipSession` - object. - """ - - def __init__( - self, index_url: str, session: PipSession, use_datetime: bool = False - ) -> None: - super().__init__(use_datetime) - index_parts = urllib.parse.urlparse(index_url) - self._scheme = index_parts.scheme - self._session = session - - def request( - self, - host: "_HostType", - handler: str, - request_body: "SizedBuffer", - verbose: bool = False, - ) -> Tuple["_Marshallable", ...]: - assert isinstance(host, str) - parts = (self._scheme, host, handler, None, None, None) - url = urllib.parse.urlunparse(parts) - try: - headers = {"Content-Type": "text/xml"} - response = self._session.post( - url, - data=request_body, - headers=headers, - stream=True, - ) - raise_for_status(response) - self.verbose = verbose - return self.parse_response(response.raw) - except NetworkConnectionError as exc: - assert exc.response - logger.critical( - "HTTP error %s while getting %s", - exc.response.status_code, - url, - ) - raise diff --git a/venv/lib/python3.12/site-packages/pip/_internal/operations/__init__.py b/venv/lib/python3.12/site-packages/pip/_internal/operations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 2f51dfe7135d839cd02d315ccea116bb4b137688..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 217 zcmZ9GJqp4=5QVcwL4+K{A{o?HtgO94ST{qmxPR<UqQQgM*?Sg`;Rz&NDmSeU-n?%f zQ_MTdR!Nk2-kT{u)A-jgkIf_LlQlcN5<iREFx`wdXskxioI(djD_V_)0uU;!J=b|4 zDK6;q%3h7Kyh0BhnhumagX^iWW>;*s5F}ylxVZ2d132lRl!nk7uE09<oTN1Y%GgRO b%fj{Ja<6UGDm?f_e1t`Z3BD;~%%_olR_Z;h diff --git a/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/check.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/check.cpython-312.pyc deleted file mode 100644 index b72ca456e821b2e899271729e93bd389439348e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7599 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-312.pyc deleted file mode 100644 index 3e1d45c41929c5e28759653b0b878c8317eb6324..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10137 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 Q*#O;2^-+%yi4~>(A4nf9i~s-t diff --git a/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-312.pyc deleted file mode 100644 index c7b2ac6c3604c9aea143307b4d3da51e5c6d7f85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25767 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 GJpUI&HKYvy diff --git a/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__init__.py b/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 9093050dcbee1f7c6223c43eccd9d4c74dbbf216..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 223 zcmZ8bI|{-;5X~9|5pocVWKdhNvi1sLlMKm{{jocV1i@?A*?Sg`;Rz&NDmSeUX5M=< zuXyhy*+c>5^VZD#nb$wYWw<<|A=<LbD{_nA#yK<Hp)m?Uaq>N!P1z~b<bhCP?YK%k ziLynPR_3au;T1aQQTHH40d}Cq=tH*KgBOIU<z>rj^k9XBTxde4xdda;aS}#*C^{i4 g$iq)io@aKL)<<QkPU6X}LLC;y&*B?1##|iK5BhLF@c;k- diff --git a/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-312.pyc deleted file mode 100644 index f0b26ed07aa952f55e7cb4bd5d0ade263cdfdef3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7843 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 MOvh7#H6`8u06o0eP5=M^ diff --git a/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-312.pyc deleted file mode 100644 index 3d5869894d8f1fed6e0b3300ded314c15ab98e0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1900 zcmZ`)&2Jk;6rb4-ukCn~CaKa$DP%=Tf|25-w51Yi3z(J^0c{nxhx)SGcqZ|t`=yz6 z+ytjohy#@n6(=|#)GKQL06tF5DH4}Nsnlu(QYF*_x0D10g$r-iUWZ0yqRh;j_vX!S z-}}AiUvxc>VAQ_*xc;Sz(C<P>N4B%ss>9}ML{JqGOe7aqF|4vHd2&_8;!JTBPpzuS zUUf5`R@J<0HJiv8H|OQ6`DCxTJzk+&fPI##Bu8bEr#k7O`fQdIK2xf_i&9ZvI{p!j zY+^^YF-LvM?8pgx!wu$~nlT$Ng9i;(qXuz!#GILi(DG9L4*~W<5ywO2hU1d5UAsno zay|&Iy=%KJWuQ5bXwLZy4hwvb`cYAeN8a~&1O~|?mBviSf*R%g9Ag2Chf^R^T^#S( zj!OwR8(|F}z*$Wvs#`pC62XJ3_8bMZewljVS%=YD6tKlOHzPn<)L)3TnKraoBk-Ay z%i|2AQG@w4xf5@(Xz(xOtywH$AHm!nA_Mp2yHZ<PmRs_CXP;V#by;bl69}USa@rn5 zx!duvthVsH@V{@g)YL-U%ptJK?K1(fwdW_3LnI^qQZ$g)eR9;BdUzhn`TkV9x3-i| zy8bF?3`Ge)h5iU)1It>Zr?xHWUKepo`&1&CW$lL6#7%TvzKWW73>`%rHzka&!uMeG z#l`<Que8sL+LGHzG&Q`Gf(`EYb0F60w(oF{8-(&2@QxD0@r_I8E*U3|o-F0_28`(> zkKBmrG^H+>bzPB^4yD9;sm}`tW&UJpa2fchTyuO9ADDB48DQn2<=H+EiY$#?Vl=c_ z8%w7;UI`b0uJb^#QWSV@5op&J0=eLV)#28KVvdP2j+M}k>P%!k?&n>aTWu1@Mwob~ zRtm*}LbKYOZPqDuncxx2i0e|oV`V;Y{9={~elU?B)+1DX-RqGT!q>)y?tzdpo!1JY zbRB;-u*9iKMXhmxQp8Y<-5X{-@Tlq85nnLR2DOH$R&GYrrE|>oCgD1iH=86u({}?K zqG&EaZJDk!V}^@SJ@Ai}j=pYkC!&*`h;TD>Lep~m2tsbVW)OBd3pbPRG*hUha53)h zG@iYHu)}~)(3SrL(@nJ9iw+%GE55mU`N7ci&5Mr*UwSw=u|7C)^TWrvfu|^^R`7Nf z4NR_0PH*&AKF>VT4?fh#*Y)u`3mbarDN=G3yeY|g1wR@ce>gg|K038p*ciR?RbfXJ zx}BcH#Skj=-adKj<n2?pPJL6j<8JgETT_nxy{(~x=AQ_|^<RfdKQtc<O|4#8J23sv zrYz2OceKQR^2%=8)n<Zem%jz@zkQ)RA^(WWBkIrn@0?cd>sgTRpU#zswUvxs9@JI_ zRk0tI!DMAbEg#9P7#i5DOsM78v|?YZSr!Rumc<T&yLbdbTe2VnBw!G}4k@iVG+)j{ z7mE)i7HRNH-EPPfp&fo!ORv{xn6&l((C)=&ZJ_PDytK#UHnk5w&nSXUEST0V1Q~uc zl4O35w%~2VMqt{_o`PCzxbzGg2T?RiejX+WC&o`DjFqhn!ucoY%oB8cN0PDhR~F$Z l{2O{>Gc$ybKk6IZl*Rh$+wJv(3(5Le&2Fo3&Rzy*{{nS94U+%> diff --git a/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc deleted file mode 100644 index f711dce7cab66911a3e2ccfcb38a22641bfdbf43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1934 zcmZ`)-EUMy6rZ`DyW8CsS}YAkdn4Go#_k0{NJv3lK@b%P#YFby=I+k4d&~XG%-t@n zTP4OsNlb`O`d|#N2L1qzi3xoo@r4Ew$c-i>h6mq@t*NOmp1FJP@)4ZP&dm9kGiT2E zopXOJl?n((<NJ@B%PK;D2qGJ~bhFlk%{Pdk8X}lTF0Nr%Wmod#nv4ZcaTQOksmWe- zHBYbUUapo)XwA)gg<2um>u#S{tQBFOqbkW$nG|S=^wH8xjubyvYW)jRxwN?d0~*=H zj%;I=`jpv`6ZnQ3%sLHYCSV2+TC710;_!$$^_GzGO5so8?5Q%2hpR2eB~`m|f%@b` z5L|fMc3sLqvL%rm^XDBF_#XA6vJ{WL>+=W{l1rvr^^gS(%K0(I0v3;CjvVj#@s91d zlz_2O*7CtQtL;Qhi-%4^cyQF7r64Yyqh5H_VYCqiY$49qg;N&w=VQIzbuHEjJkxP` ztT7t3nBS1oc#B1czo6G<u!wyGb9aagT$is&U1~}0$aCpF(-7;D(m}5yj3UTscM#=T zYGX<5;5lLcsnJn04RJD$Kr8>03Xq*gcC<Vqn)qejKwh7sqyEgov%H+!nn@q69p%%W zy=k-yMF~EId^ci)OL|nwbUV`Zp2r>iGl^(R`X_oDx6wuUJZj@zXfNWpEn##X-h<Is zr~ijP-Q}0{MK?_}HM|UhE$;ZUKsK7T?{JSBgz^U9juON1jWfs27zYmQsT2wZjI&7| zxe+yK23=6=nIah+Dv9>ufEN(T{K-t=9N<y8;P@ooGV2C)K;?qv***Y@EWUb%(a>hX z7fPJSuDg%<_;R=axSa#6RieOi%YeUu5KsmutrTRZ%6TU0IaWeDYBG`jcq{MW-Rhz_ z-W4X-P%HDvf{L?J@TT`Nfhnd53sS&iWiD|1a*heCFp(_QCqx513y~MX%j05?At)`q zuqevd@n-@{a8)YmjtfUcJjK}j!fXZ}H9b4x^XAc@(Gr!*&4{{mmf7AU9EVb8lO$;S zZeT-1&3ULZ({<`*xDYi1e_v(qYbJLhI++HAo1qh$mg7ede%m#JFzqtjOrC1?T+L!# z2^ZoWX*Z%)#_dIk?F5ennE5X-T|(>qX#4J4<wG~m-5EZ6>Gb`f7w-;DtPD+DdjEcY z@FD6`r}26Y4Nl%G9$J&7!NQl?s)qWXyIUGxDUDy9zg?<4L`r@duS#-h8s8fmzdLqv zW$fh5soP^8eO=s8g=}LWF|z{|`>!0leDKQD<*9FrSKZrv`)(=w{#n=2HuEop;rMUE zl^@%8hL7L;@Ya^I|E|h{x4EGw_LEySyQWqXzc%?B@PzN4uTIE6;p(XR^VYWxD>q6x zpl=+`S4Z?^tyCS-mxolbACW<2c~q_L&MzA}=qyjD)jfK7Al5C51P#k#+rV5r3IVTJ zkQWj#h-Hdas|oFyGtuYb?TJQ~l1i^%GDS#7o|Mvy4H_nm|1mJW@T3lW7+hX?1o1BB zcRougf?h4~*R2p4zAH&We?V(+H)5kOZRVz+T3aqX!p4CVt(2dD3Brl-LkVMLO+&cw y03CUN_HRfsmj2Emd>sFd4y<Y;c>leDu~k{Due{k^-#eA8_to6G3Vikw82b-4r5U^c diff --git a/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-312.pyc deleted file mode 100644 index 18ca09cccd8e7e789f226fa8a34e13a98dd98176..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3085 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-312.pyc deleted file mode 100644 index 79007e8d38ab6f1fb1966de208b92577c1d338ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1704 zcmZuxUu+ab7@yfccenSC{-NNt1Q$yyhwZIMkV-0v6^If81byKWvf18F@AlY#&dl|= zawr;O+C<YwNQ{P8f)70S=nK61(gqUhq6vxe;M-}Nkl>5o>~U8#&Sq!6Z@zE7zrUHE za=A2uQTgsl?XZH-Z-VKK%yVM%6Ckc58`;=J<?f2h7<kE*Jh?1mu_wEVr<T>2R@{V_ zEGIFN5JB~Up26*vXt!~fE2nLhWb6b{?If%z_%$MvOaa6TX*>OeQqHz;G4qE|KU2g} z>TJlJz_(nWcg-~%*PgQ~mxyn_7X+8ywOp4_kc`oW?-Ob^9bPk8=){ai7_+J*QhduJ zQF6X}E*kO(w`_}BrtMHt;Q?($DkolOM+r)JgZdRHO@AbSlHuPx4=G$nZRwhH8hws6 z#QQ3BA^*>?rM7%q>TY7h)t=av+vpo)E8oh!l3Z2VxSs6Ex7W7P(>Q`K0v&Bz)}z{T zTl!w@`MIjvSbRMm{N{U_|JRoKa8J6uw&hRz_C7@8=n!JKDPeR0V!-ID;$`^)YT|Lk zV<3rh`w=aGr@o1Lu21#}JJCklQC&bS+(cbV#pKf0aa;AkC;Iz7<IvOd<l_eP#v?x0 z8_e;mI<FD^+{ttLkwZuId4U2wq(KE5TuP^P80X{0F+H?+P3M8$tP$es&VtSw6`{7! zaNSmXl9%+eV2w5%MyB*`!<l{tyq982XO;>l2;+`#3Eb&@j2zP^*wSzustBm-U?HIT z(x84IY(Y4608@zvo?9$pnu6Sy_MEaDm)PBi|9xtL71L3|4XRZ_Bh@DJjVcu&i3V9? z{&{X@7u8WF&e)7yM%u~C6%yZxNF|g8G?D@qDI)PmsRxc<Oi+PYDj*eyK?QIC+wm2N z(y<v++zBT1MD=w2*%hM}c*O85&K8XmL8T#z&kRmnQl*wR4HbcFN2l$e>AQht6KX6H zf6;KAc_VD`THqfp9eTrH4kyzg+%&j&%m|&(Fdd&03K!T2LPF!BG9ymNh$AV5t!U_l z1kI3y&}I4(#FmAh{Q%Q7)Y*x$d)G3>HKho1N6M)?e@W$6vn$!Pk=O4`JV?#_J~*|J z-*<EW&0TA+&a7qM+LWcC^m3w;K>3k}xykk1<juwVxze9V(efJw{b6Bhy)d;gFtRaz zq@$wI=}jb$=9f=Dl|jBWfU^13qbo;OXIEx#s5h4GXAZ6@2cHgttRoEky_H7Uk-w1i zLKuhdeDol7?B^ZB9Tm2pu>%nJmv7D~=*OM!%*b~KQb69FQRi^-?%PSA?<p_OP0IHs zFwDhVloVh9kkBDG7bSQLp0O$wPfIigg)Es+Z#$q+ujg1ZYw!dzDjut7Z>-TPb*aG} zmzB1W)P<H-CH#Xf;!<Xe0Mn$R#*xf8jVpc&Z32(zZkV2>X1%~}xa2r}1z7Qdvx_iw zWQ_46lz)V@U(whTbo>cA^;jES-u+M;UDrl$%-q-ZUxT_A@M|0CTt|lWac;b$!V1kO e?CB&0l|tDa9ZgVal*lhvKD)S;0gmni5B~r?F}aZd diff --git a/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc deleted file mode 100644 index e8f610ffc93d90d2e32026c8f661fd5d5675faf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2045 zcmZuyU2GFa5Z=4<oqhJ%kdOfR<wO#wY4AazA%(P3!;ktyfzrNUiCP!m#=daAb9dJ< zPMwybssgDM;t8ax6|WV2=wlzMs-%y72?B}qpb}DBRedug5>@)r*}GgqQ`WlKo!Qx) znVoOOKc~}41f%%X2j$B$Lceh)8mX1V;zd|oLl&|G2j#<A$P2)Wj#!cMlE7t>6RXI1 zxuWEifR8!xN+O>SkccpvYL6~mn{o1{5OVpHC1cG}ux!O)PQa&P32R-jJ(;wUpTzR% zhLBDD#nn$_1wV1J%52Xyovi3@9<SMsHEtHqVb^-i^UfVM9S0LX#n*4yl-h0yj`Wb4 z>ta%<+pJumRXboRm{PNZ{g`W3upgfYFY((en3<Nz%z|YTTx1?;_%g$ls^u#Lvl?-W zvC#8?#(_%kE&d4cTtiLqg7^lyD5!|7DoyeIb;A;y(oHcG3W&k$hr^PZ=nG`UzLcW( znT<7tDQ;!mXvQLq7m<Ke1X}7k6=0iEQ~XAbEX~R)<dOd(3E18koqATDraGhDwYe#M zw0h$^XaKPQMSOn{k?gGUROIQkQ_;#&ny9JVTzL}#odJ(#l@FEmel@^LF0Tu9bY41x z>cRlpi>Oc+`56IzpS>5!Sthz2Jm`X$A{I?O%Y%3mt;K%^HC8QT6EmL&h|)b5>#w_% z0h~_b_iKQJ3U--Z<ABmx8SAHxp3+A~_UIEFfO?g9MSxQ-nbcvN4q!s{s>#Ya^YnTd zV@J0qby_QOwaJ>}G=h^Xr=Nt|NZqD*SP$Vv^%Gz{7u<AWrt1i%%yvx<d3_a;2lXL3 z6M~;Rge{wy6AsoVJ)+OF>CaUg;L#MIH^;n+lg$c*V`Jv{VbgUzw&L{asUfOQ;G$Wh zI0!8aX{8=?%fnRXhsx%3xDV=OD6g4q$4uM7R(RY0+!&(Sl&?5msRZ>XTX>>YA__R+ zx6#_f%6k>Uy7V)F$wK51;pO1Vm=KTn>e2H>98|n7deo2cNA+V<p6zDigx3X0aKhsw z9Eeb*L9zSE;Mog7bqknsRh}Fe%byr!uY!$=$>_9k#4FZ#a;d?vgG<D$?1mSIjzV@@ zUfp#()564<#_qJ?*b_#z!OEVyFSqvvgW3%5u0r2{HbRZ6T{Q}}%P@i7WO!9ff}~L+ z2+jz-i9*a(8-7O^^?x@=H~6W+M;`&XfLa|$>z_|$=VMu*EpfBl@gR}8qFvVJJNJA$ zbT={jd)x3rX7I+lH;&EkIyA41ElOg0@{-b0P^R-<ddKbbjvLc=(z!<{t@gG=E#14& zH+Zja-|fDA3mshxJ6~$asDJ+=lKR`PCZEWlw6q;*nJWh_AGk7hdF;A;edbPT*L-Z( z-%DFi$F|2Pp6-3Haq~6ps@4*P&e4Y*TNgSymsGi}eNjVOd!O`hJKWemEe&*+pQKj> zOT9?ze2m1WVi@@@b~o|zFB>+sWDqaYw;}3JN5&7K?}c$g`eD<n2gO_M3E*!XRL6(q zIcdxIPI<072AgyJTt2r`=JH{QOAL8@G(NXK&gF-;9qyBU>J@-yGk%;S5kN{dfdOA( z4fq!*5#ELT9>`p-0137{0(n`foC3!<CA`;%c<c|<q6Ft^%ywvQ4a*_8)e>gML(C@% z0rm<7!h4V}QAUE~evKA^hdu>lIWbo8teS&gA%np3zeIW#NJ|m~;XcaTN9wPr=TG$J zAL!UawfoYRdusP>wfp+$9d+;mq<FjV{6aF_l3;$A9%#uhL*Bc3TXDWhAZ<fS<*Ou8 QGM9=UpIu4;M+U&cznzK^<^TWy diff --git a/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-312.pyc deleted file mode 100644 index 409ced7d450b7d7d9c912a7a1c351699c6a2adb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3949 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 I1CCqbKl7396aWAK diff --git a/venv/lib/python3.12/site-packages/pip/_internal/operations/build/build_tracker.py b/venv/lib/python3.12/site-packages/pip/_internal/operations/build/build_tracker.py deleted file mode 100644 index 3791932..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/operations/build/build_tracker.py +++ /dev/null @@ -1,139 +0,0 @@ -import contextlib -import hashlib -import logging -import os -from types import TracebackType -from typing import Dict, Generator, Optional, Set, Type, Union - -from pip._internal.models.link import Link -from pip._internal.req.req_install import InstallRequirement -from pip._internal.utils.temp_dir import TempDirectory - -logger = logging.getLogger(__name__) - - -@contextlib.contextmanager -def update_env_context_manager(**changes: str) -> Generator[None, None, None]: - target = os.environ - - # Save values from the target and change them. - non_existent_marker = object() - saved_values: Dict[str, Union[object, str]] = {} - for name, new_value in changes.items(): - try: - saved_values[name] = target[name] - except KeyError: - saved_values[name] = non_existent_marker - target[name] = new_value - - try: - yield - finally: - # Restore original values in the target. - for name, original_value in saved_values.items(): - if original_value is non_existent_marker: - del target[name] - else: - assert isinstance(original_value, str) # for mypy - target[name] = original_value - - -@contextlib.contextmanager -def get_build_tracker() -> Generator["BuildTracker", None, None]: - root = os.environ.get("PIP_BUILD_TRACKER") - with contextlib.ExitStack() as ctx: - if root is None: - root = ctx.enter_context(TempDirectory(kind="build-tracker")).path - ctx.enter_context(update_env_context_manager(PIP_BUILD_TRACKER=root)) - logger.debug("Initialized build tracking at %s", root) - - with BuildTracker(root) as tracker: - yield tracker - - -class TrackerId(str): - """Uniquely identifying string provided to the build tracker.""" - - -class BuildTracker: - """Ensure that an sdist cannot request itself as a setup requirement. - - When an sdist is prepared, it identifies its setup requirements in the - context of ``BuildTracker.track()``. If a requirement shows up recursively, this - raises an exception. - - This stops fork bombs embedded in malicious packages.""" - - def __init__(self, root: str) -> None: - self._root = root - self._entries: Dict[TrackerId, InstallRequirement] = {} - logger.debug("Created build tracker: %s", self._root) - - def __enter__(self) -> "BuildTracker": - logger.debug("Entered build tracker: %s", self._root) - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - self.cleanup() - - def _entry_path(self, key: TrackerId) -> str: - hashed = hashlib.sha224(key.encode()).hexdigest() - return os.path.join(self._root, hashed) - - def add(self, req: InstallRequirement, key: TrackerId) -> None: - """Add an InstallRequirement to build tracking.""" - - # Get the file to write information about this requirement. - entry_path = self._entry_path(key) - - # Try reading from the file. If it exists and can be read from, a build - # is already in progress, so a LookupError is raised. - try: - with open(entry_path) as fp: - contents = fp.read() - except FileNotFoundError: - pass - else: - message = "{} is already being built: {}".format(req.link, contents) - raise LookupError(message) - - # If we're here, req should really not be building already. - assert key not in self._entries - - # Start tracking this requirement. - with open(entry_path, "w", encoding="utf-8") as fp: - fp.write(str(req)) - self._entries[key] = req - - logger.debug("Added %s to build tracker %r", req, self._root) - - def remove(self, req: InstallRequirement, key: TrackerId) -> None: - """Remove an InstallRequirement from build tracking.""" - - # Delete the created file and the corresponding entry. - os.unlink(self._entry_path(key)) - del self._entries[key] - - logger.debug("Removed %s from build tracker %r", req, self._root) - - def cleanup(self) -> None: - for key, req in list(self._entries.items()): - self.remove(req, key) - - logger.debug("Removed build tracker: %r", self._root) - - @contextlib.contextmanager - def track(self, req: InstallRequirement, key: str) -> Generator[None, None, None]: - """Ensure that `key` cannot install itself as a setup requirement. - - :raises LookupError: If `key` was already provided in a parent invocation of - the context introduced by this method.""" - tracker_id = TrackerId(key) - self.add(req, tracker_id) - yield - self.remove(req, tracker_id) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata.py b/venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata.py deleted file mode 100644 index c66ac35..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata.py +++ /dev/null @@ -1,39 +0,0 @@ -"""Metadata generation logic for source distributions. -""" - -import os - -from pip._vendor.pyproject_hooks import BuildBackendHookCaller - -from pip._internal.build_env import BuildEnvironment -from pip._internal.exceptions import ( - InstallationSubprocessError, - MetadataGenerationFailed, -) -from pip._internal.utils.subprocess import runner_with_spinner_message -from pip._internal.utils.temp_dir import TempDirectory - - -def generate_metadata( - build_env: BuildEnvironment, backend: BuildBackendHookCaller, details: str -) -> str: - """Generate metadata using mechanisms described in PEP 517. - - Returns the generated metadata directory. - """ - metadata_tmpdir = TempDirectory(kind="modern-metadata", globally_managed=True) - - metadata_dir = metadata_tmpdir.path - - with build_env: - # Note that BuildBackendHookCaller implements a fallback for - # prepare_metadata_for_build_wheel, so we don't have to - # consider the possibility that this hook doesn't exist. - runner = runner_with_spinner_message("Preparing metadata (pyproject.toml)") - with backend.subprocess_runner(runner): - try: - distinfo_dir = backend.prepare_metadata_for_build_wheel(metadata_dir) - except InstallationSubprocessError as error: - raise MetadataGenerationFailed(package_details=details) from error - - return os.path.join(metadata_dir, distinfo_dir) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_editable.py b/venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_editable.py deleted file mode 100644 index 27c69f0..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_editable.py +++ /dev/null @@ -1,41 +0,0 @@ -"""Metadata generation logic for source distributions. -""" - -import os - -from pip._vendor.pyproject_hooks import BuildBackendHookCaller - -from pip._internal.build_env import BuildEnvironment -from pip._internal.exceptions import ( - InstallationSubprocessError, - MetadataGenerationFailed, -) -from pip._internal.utils.subprocess import runner_with_spinner_message -from pip._internal.utils.temp_dir import TempDirectory - - -def generate_editable_metadata( - build_env: BuildEnvironment, backend: BuildBackendHookCaller, details: str -) -> str: - """Generate metadata using mechanisms described in PEP 660. - - Returns the generated metadata directory. - """ - metadata_tmpdir = TempDirectory(kind="modern-metadata", globally_managed=True) - - metadata_dir = metadata_tmpdir.path - - with build_env: - # Note that BuildBackendHookCaller implements a fallback for - # prepare_metadata_for_build_wheel/editable, so we don't have to - # consider the possibility that this hook doesn't exist. - runner = runner_with_spinner_message( - "Preparing editable metadata (pyproject.toml)" - ) - with backend.subprocess_runner(runner): - try: - distinfo_dir = backend.prepare_metadata_for_build_editable(metadata_dir) - except InstallationSubprocessError as error: - raise MetadataGenerationFailed(package_details=details) from error - - return os.path.join(metadata_dir, distinfo_dir) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_legacy.py b/venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_legacy.py deleted file mode 100644 index e60988d..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_legacy.py +++ /dev/null @@ -1,74 +0,0 @@ -"""Metadata generation logic for legacy source distributions. -""" - -import logging -import os - -from pip._internal.build_env import BuildEnvironment -from pip._internal.cli.spinners import open_spinner -from pip._internal.exceptions import ( - InstallationError, - InstallationSubprocessError, - MetadataGenerationFailed, -) -from pip._internal.utils.setuptools_build import make_setuptools_egg_info_args -from pip._internal.utils.subprocess import call_subprocess -from pip._internal.utils.temp_dir import TempDirectory - -logger = logging.getLogger(__name__) - - -def _find_egg_info(directory: str) -> str: - """Find an .egg-info subdirectory in `directory`.""" - filenames = [f for f in os.listdir(directory) if f.endswith(".egg-info")] - - if not filenames: - raise InstallationError(f"No .egg-info directory found in {directory}") - - if len(filenames) > 1: - raise InstallationError( - "More than one .egg-info directory found in {}".format(directory) - ) - - return os.path.join(directory, filenames[0]) - - -def generate_metadata( - build_env: BuildEnvironment, - setup_py_path: str, - source_dir: str, - isolated: bool, - details: str, -) -> str: - """Generate metadata using setup.py-based defacto mechanisms. - - Returns the generated metadata directory. - """ - logger.debug( - "Running setup.py (path:%s) egg_info for package %s", - setup_py_path, - details, - ) - - egg_info_dir = TempDirectory(kind="pip-egg-info", globally_managed=True).path - - args = make_setuptools_egg_info_args( - setup_py_path, - egg_info_dir=egg_info_dir, - no_user_config=isolated, - ) - - with build_env: - with open_spinner("Preparing metadata (setup.py)") as spinner: - try: - call_subprocess( - args, - cwd=source_dir, - command_desc="python setup.py egg_info", - spinner=spinner, - ) - except InstallationSubprocessError as error: - raise MetadataGenerationFailed(package_details=details) from error - - # Return the .egg-info directory. - return _find_egg_info(egg_info_dir) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel.py b/venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel.py deleted file mode 100644 index 064811a..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel.py +++ /dev/null @@ -1,37 +0,0 @@ -import logging -import os -from typing import Optional - -from pip._vendor.pyproject_hooks import BuildBackendHookCaller - -from pip._internal.utils.subprocess import runner_with_spinner_message - -logger = logging.getLogger(__name__) - - -def build_wheel_pep517( - name: str, - backend: BuildBackendHookCaller, - metadata_directory: str, - tempd: str, -) -> Optional[str]: - """Build one InstallRequirement using the PEP 517 build process. - - Returns path to wheel if successfully built. Otherwise, returns None. - """ - assert metadata_directory is not None - try: - logger.debug("Destination directory: %s", tempd) - - runner = runner_with_spinner_message( - f"Building wheel for {name} (pyproject.toml)" - ) - with backend.subprocess_runner(runner): - wheel_name = backend.build_wheel( - tempd, - metadata_directory=metadata_directory, - ) - except Exception: - logger.error("Failed building wheel for %s", name) - return None - return os.path.join(tempd, wheel_name) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_editable.py b/venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_editable.py deleted file mode 100644 index 719d69d..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_editable.py +++ /dev/null @@ -1,46 +0,0 @@ -import logging -import os -from typing import Optional - -from pip._vendor.pyproject_hooks import BuildBackendHookCaller, HookMissing - -from pip._internal.utils.subprocess import runner_with_spinner_message - -logger = logging.getLogger(__name__) - - -def build_wheel_editable( - name: str, - backend: BuildBackendHookCaller, - metadata_directory: str, - tempd: str, -) -> Optional[str]: - """Build one InstallRequirement using the PEP 660 build process. - - Returns path to wheel if successfully built. Otherwise, returns None. - """ - assert metadata_directory is not None - try: - logger.debug("Destination directory: %s", tempd) - - runner = runner_with_spinner_message( - f"Building editable for {name} (pyproject.toml)" - ) - with backend.subprocess_runner(runner): - try: - wheel_name = backend.build_editable( - tempd, - metadata_directory=metadata_directory, - ) - except HookMissing as e: - logger.error( - "Cannot build editable %s because the build " - "backend does not have the %s hook", - name, - e, - ) - return None - except Exception: - logger.error("Failed building editable for %s", name) - return None - return os.path.join(tempd, wheel_name) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_legacy.py b/venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_legacy.py deleted file mode 100644 index c5f0492..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_legacy.py +++ /dev/null @@ -1,102 +0,0 @@ -import logging -import os.path -from typing import List, Optional - -from pip._internal.cli.spinners import open_spinner -from pip._internal.utils.setuptools_build import make_setuptools_bdist_wheel_args -from pip._internal.utils.subprocess import call_subprocess, format_command_args - -logger = logging.getLogger(__name__) - - -def format_command_result( - command_args: List[str], - command_output: str, -) -> str: - """Format command information for logging.""" - command_desc = format_command_args(command_args) - text = f"Command arguments: {command_desc}\n" - - if not command_output: - text += "Command output: None" - elif logger.getEffectiveLevel() > logging.DEBUG: - text += "Command output: [use --verbose to show]" - else: - if not command_output.endswith("\n"): - command_output += "\n" - text += f"Command output:\n{command_output}" - - return text - - -def get_legacy_build_wheel_path( - names: List[str], - temp_dir: str, - name: str, - command_args: List[str], - command_output: str, -) -> Optional[str]: - """Return the path to the wheel in the temporary build directory.""" - # Sort for determinism. - names = sorted(names) - if not names: - msg = ("Legacy build of wheel for {!r} created no files.\n").format(name) - msg += format_command_result(command_args, command_output) - logger.warning(msg) - return None - - if len(names) > 1: - msg = ( - "Legacy build of wheel for {!r} created more than one file.\n" - "Filenames (choosing first): {}\n" - ).format(name, names) - msg += format_command_result(command_args, command_output) - logger.warning(msg) - - return os.path.join(temp_dir, names[0]) - - -def build_wheel_legacy( - name: str, - setup_py_path: str, - source_dir: str, - global_options: List[str], - build_options: List[str], - tempd: str, -) -> Optional[str]: - """Build one unpacked package using the "legacy" build process. - - Returns path to wheel if successfully built. Otherwise, returns None. - """ - wheel_args = make_setuptools_bdist_wheel_args( - setup_py_path, - global_options=global_options, - build_options=build_options, - destination_dir=tempd, - ) - - spin_message = f"Building wheel for {name} (setup.py)" - with open_spinner(spin_message) as spinner: - logger.debug("Destination directory: %s", tempd) - - try: - output = call_subprocess( - wheel_args, - command_desc="python setup.py bdist_wheel", - cwd=source_dir, - spinner=spinner, - ) - except Exception: - spinner.finish("error") - logger.error("Failed building wheel for %s", name) - return None - - names = os.listdir(tempd) - wheel_path = get_legacy_build_wheel_path( - names=names, - temp_dir=tempd, - name=name, - command_args=wheel_args, - command_output=output, - ) - return wheel_path diff --git a/venv/lib/python3.12/site-packages/pip/_internal/operations/check.py b/venv/lib/python3.12/site-packages/pip/_internal/operations/check.py deleted file mode 100644 index 90c6a58..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/operations/check.py +++ /dev/null @@ -1,187 +0,0 @@ -"""Validation of dependencies of packages -""" - -import logging -from typing import Callable, Dict, List, NamedTuple, Optional, Set, Tuple - -from pip._vendor.packaging.requirements import Requirement -from pip._vendor.packaging.specifiers import LegacySpecifier -from pip._vendor.packaging.utils import NormalizedName, canonicalize_name -from pip._vendor.packaging.version import LegacyVersion - -from pip._internal.distributions import make_distribution_for_install_requirement -from pip._internal.metadata import get_default_environment -from pip._internal.metadata.base import DistributionVersion -from pip._internal.req.req_install import InstallRequirement -from pip._internal.utils.deprecation import deprecated - -logger = logging.getLogger(__name__) - - -class PackageDetails(NamedTuple): - version: DistributionVersion - dependencies: List[Requirement] - - -# Shorthands -PackageSet = Dict[NormalizedName, PackageDetails] -Missing = Tuple[NormalizedName, Requirement] -Conflicting = Tuple[NormalizedName, DistributionVersion, Requirement] - -MissingDict = Dict[NormalizedName, List[Missing]] -ConflictingDict = Dict[NormalizedName, List[Conflicting]] -CheckResult = Tuple[MissingDict, ConflictingDict] -ConflictDetails = Tuple[PackageSet, CheckResult] - - -def create_package_set_from_installed() -> Tuple[PackageSet, bool]: - """Converts a list of distributions into a PackageSet.""" - package_set = {} - problems = False - env = get_default_environment() - for dist in env.iter_installed_distributions(local_only=False, skip=()): - name = dist.canonical_name - try: - dependencies = list(dist.iter_dependencies()) - package_set[name] = PackageDetails(dist.version, dependencies) - except (OSError, ValueError) as e: - # Don't crash on unreadable or broken metadata. - logger.warning("Error parsing requirements for %s: %s", name, e) - problems = True - return package_set, problems - - -def check_package_set( - package_set: PackageSet, should_ignore: Optional[Callable[[str], bool]] = None -) -> CheckResult: - """Check if a package set is consistent - - If should_ignore is passed, it should be a callable that takes a - package name and returns a boolean. - """ - - warn_legacy_versions_and_specifiers(package_set) - - missing = {} - conflicting = {} - - for package_name, package_detail in package_set.items(): - # Info about dependencies of package_name - missing_deps: Set[Missing] = set() - conflicting_deps: Set[Conflicting] = set() - - if should_ignore and should_ignore(package_name): - continue - - for req in package_detail.dependencies: - name = canonicalize_name(req.name) - - # Check if it's missing - if name not in package_set: - missed = True - if req.marker is not None: - missed = req.marker.evaluate({"extra": ""}) - if missed: - missing_deps.add((name, req)) - continue - - # Check if there's a conflict - version = package_set[name].version - if not req.specifier.contains(version, prereleases=True): - conflicting_deps.add((name, version, req)) - - if missing_deps: - missing[package_name] = sorted(missing_deps, key=str) - if conflicting_deps: - conflicting[package_name] = sorted(conflicting_deps, key=str) - - return missing, conflicting - - -def check_install_conflicts(to_install: List[InstallRequirement]) -> ConflictDetails: - """For checking if the dependency graph would be consistent after \ - installing given requirements - """ - # Start from the current state - package_set, _ = create_package_set_from_installed() - # Install packages - would_be_installed = _simulate_installation_of(to_install, package_set) - - # Only warn about directly-dependent packages; create a whitelist of them - whitelist = _create_whitelist(would_be_installed, package_set) - - return ( - package_set, - check_package_set( - package_set, should_ignore=lambda name: name not in whitelist - ), - ) - - -def _simulate_installation_of( - to_install: List[InstallRequirement], package_set: PackageSet -) -> Set[NormalizedName]: - """Computes the version of packages after installing to_install.""" - # Keep track of packages that were installed - installed = set() - - # Modify it as installing requirement_set would (assuming no errors) - for inst_req in to_install: - abstract_dist = make_distribution_for_install_requirement(inst_req) - dist = abstract_dist.get_metadata_distribution() - name = dist.canonical_name - package_set[name] = PackageDetails(dist.version, list(dist.iter_dependencies())) - - installed.add(name) - - return installed - - -def _create_whitelist( - would_be_installed: Set[NormalizedName], package_set: PackageSet -) -> Set[NormalizedName]: - packages_affected = set(would_be_installed) - - for package_name in package_set: - if package_name in packages_affected: - continue - - for req in package_set[package_name].dependencies: - if canonicalize_name(req.name) in packages_affected: - packages_affected.add(package_name) - break - - return packages_affected - - -def warn_legacy_versions_and_specifiers(package_set: PackageSet) -> None: - for project_name, package_details in package_set.items(): - if isinstance(package_details.version, LegacyVersion): - deprecated( - reason=( - f"{project_name} {package_details.version} " - f"has a non-standard version number." - ), - replacement=( - f"to upgrade to a newer version of {project_name} " - f"or contact the author to suggest that they " - f"release a version with a conforming version number" - ), - issue=12063, - gone_in="24.1", - ) - for dep in package_details.dependencies: - if any(isinstance(spec, LegacySpecifier) for spec in dep.specifier): - deprecated( - reason=( - f"{project_name} {package_details.version} " - f"has a non-standard dependency specifier {dep}." - ), - replacement=( - f"to upgrade to a newer version of {project_name} " - f"or contact the author to suggest that they " - f"release a version with a conforming dependency specifiers" - ), - issue=12063, - gone_in="24.1", - ) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/operations/freeze.py b/venv/lib/python3.12/site-packages/pip/_internal/operations/freeze.py deleted file mode 100644 index 3544568..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/operations/freeze.py +++ /dev/null @@ -1,255 +0,0 @@ -import collections -import logging -import os -from typing import Container, Dict, Generator, Iterable, List, NamedTuple, Optional, Set - -from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.packaging.version import Version - -from pip._internal.exceptions import BadCommand, InstallationError -from pip._internal.metadata import BaseDistribution, get_environment -from pip._internal.req.constructors import ( - install_req_from_editable, - install_req_from_line, -) -from pip._internal.req.req_file import COMMENT_RE -from pip._internal.utils.direct_url_helpers import direct_url_as_pep440_direct_reference - -logger = logging.getLogger(__name__) - - -class _EditableInfo(NamedTuple): - requirement: str - comments: List[str] - - -def freeze( - requirement: Optional[List[str]] = None, - local_only: bool = False, - user_only: bool = False, - paths: Optional[List[str]] = None, - isolated: bool = False, - exclude_editable: bool = False, - skip: Container[str] = (), -) -> Generator[str, None, None]: - installations: Dict[str, FrozenRequirement] = {} - - dists = get_environment(paths).iter_installed_distributions( - local_only=local_only, - skip=(), - user_only=user_only, - ) - for dist in dists: - req = FrozenRequirement.from_dist(dist) - if exclude_editable and req.editable: - continue - installations[req.canonical_name] = req - - if requirement: - # the options that don't get turned into an InstallRequirement - # should only be emitted once, even if the same option is in multiple - # requirements files, so we need to keep track of what has been emitted - # so that we don't emit it again if it's seen again - emitted_options: Set[str] = set() - # keep track of which files a requirement is in so that we can - # give an accurate warning if a requirement appears multiple times. - req_files: Dict[str, List[str]] = collections.defaultdict(list) - for req_file_path in requirement: - with open(req_file_path) as req_file: - for line in req_file: - if ( - not line.strip() - or line.strip().startswith("#") - or line.startswith( - ( - "-r", - "--requirement", - "-f", - "--find-links", - "-i", - "--index-url", - "--pre", - "--trusted-host", - "--process-dependency-links", - "--extra-index-url", - "--use-feature", - ) - ) - ): - line = line.rstrip() - if line not in emitted_options: - emitted_options.add(line) - yield line - continue - - if line.startswith("-e") or line.startswith("--editable"): - if line.startswith("-e"): - line = line[2:].strip() - else: - line = line[len("--editable") :].strip().lstrip("=") - line_req = install_req_from_editable( - line, - isolated=isolated, - ) - else: - line_req = install_req_from_line( - COMMENT_RE.sub("", line).strip(), - isolated=isolated, - ) - - if not line_req.name: - logger.info( - "Skipping line in requirement file [%s] because " - "it's not clear what it would install: %s", - req_file_path, - line.strip(), - ) - logger.info( - " (add #egg=PackageName to the URL to avoid" - " this warning)" - ) - else: - line_req_canonical_name = canonicalize_name(line_req.name) - if line_req_canonical_name not in installations: - # either it's not installed, or it is installed - # but has been processed already - if not req_files[line_req.name]: - logger.warning( - "Requirement file [%s] contains %s, but " - "package %r is not installed", - req_file_path, - COMMENT_RE.sub("", line).strip(), - line_req.name, - ) - else: - req_files[line_req.name].append(req_file_path) - else: - yield str(installations[line_req_canonical_name]).rstrip() - del installations[line_req_canonical_name] - req_files[line_req.name].append(req_file_path) - - # Warn about requirements that were included multiple times (in a - # single requirements file or in different requirements files). - for name, files in req_files.items(): - if len(files) > 1: - logger.warning( - "Requirement %s included multiple times [%s]", - name, - ", ".join(sorted(set(files))), - ) - - yield ("## The following requirements were added by pip freeze:") - for installation in sorted(installations.values(), key=lambda x: x.name.lower()): - if installation.canonical_name not in skip: - yield str(installation).rstrip() - - -def _format_as_name_version(dist: BaseDistribution) -> str: - dist_version = dist.version - if isinstance(dist_version, Version): - return f"{dist.raw_name}=={dist_version}" - return f"{dist.raw_name}==={dist_version}" - - -def _get_editable_info(dist: BaseDistribution) -> _EditableInfo: - """ - Compute and return values (req, comments) for use in - FrozenRequirement.from_dist(). - """ - editable_project_location = dist.editable_project_location - assert editable_project_location - location = os.path.normcase(os.path.abspath(editable_project_location)) - - from pip._internal.vcs import RemoteNotFoundError, RemoteNotValidError, vcs - - vcs_backend = vcs.get_backend_for_dir(location) - - if vcs_backend is None: - display = _format_as_name_version(dist) - logger.debug( - 'No VCS found for editable requirement "%s" in: %r', - display, - location, - ) - return _EditableInfo( - requirement=location, - comments=[f"# Editable install with no version control ({display})"], - ) - - vcs_name = type(vcs_backend).__name__ - - try: - req = vcs_backend.get_src_requirement(location, dist.raw_name) - except RemoteNotFoundError: - display = _format_as_name_version(dist) - return _EditableInfo( - requirement=location, - comments=[f"# Editable {vcs_name} install with no remote ({display})"], - ) - except RemoteNotValidError as ex: - display = _format_as_name_version(dist) - return _EditableInfo( - requirement=location, - comments=[ - f"# Editable {vcs_name} install ({display}) with either a deleted " - f"local remote or invalid URI:", - f"# '{ex.url}'", - ], - ) - except BadCommand: - logger.warning( - "cannot determine version of editable source in %s " - "(%s command not found in path)", - location, - vcs_backend.name, - ) - return _EditableInfo(requirement=location, comments=[]) - except InstallationError as exc: - logger.warning("Error when trying to get requirement for VCS system %s", exc) - else: - return _EditableInfo(requirement=req, comments=[]) - - logger.warning("Could not determine repository location of %s", location) - - return _EditableInfo( - requirement=location, - comments=["## !! Could not determine repository location"], - ) - - -class FrozenRequirement: - def __init__( - self, - name: str, - req: str, - editable: bool, - comments: Iterable[str] = (), - ) -> None: - self.name = name - self.canonical_name = canonicalize_name(name) - self.req = req - self.editable = editable - self.comments = comments - - @classmethod - def from_dist(cls, dist: BaseDistribution) -> "FrozenRequirement": - editable = dist.editable - if editable: - req, comments = _get_editable_info(dist) - else: - comments = [] - direct_url = dist.direct_url - if direct_url: - # if PEP 610 metadata is present, use it - req = direct_url_as_pep440_direct_reference(direct_url, dist.raw_name) - else: - # name==version requirement - req = _format_as_name_version(dist) - - return cls(dist.raw_name, req, editable, comments=comments) - - def __str__(self) -> str: - req = self.req - if self.editable: - req = f"-e {req}" - return "\n".join(list(self.comments) + [str(req)]) + "\n" diff --git a/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__init__.py b/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__init__.py deleted file mode 100644 index 24d6a5d..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -"""For modules related to installing packages. -""" diff --git a/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 2adcef00e6b6fb20c4a7886887c29033ad78a71f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 286 zcmXw#F-`+95JlG^f+$k%ux%uEN01g#AxaKFW1016*NW}2?8%~qhFj33&sn$uEf+wf zONCcSel!1Tq?tGKwOGuHtY-V(t#bVt!&%~F_Oon03tc=HgIG@9t{*9uj`YT2DkECO zs7t2O_{7Ru<J&T*X02LG_55imzOSUz)JVB2_T$LI2Xy2RoZ{5O12r3mo)a)yY@>2j zV$-ZKR+?VDC8aS!kG=<MULXwIkzds}w~!2Db>0NQ1dzrvMz1VTz^K@ePjJElnY)Ii ftiy1a-5vSw<7EaK4^87AelLU&e-k05ahl^lShQC0 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc deleted file mode 100644 index cf2e54dd927261974dc36085b6bdbbdbeca39081..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1837 zcmZuxO>Epm6dwPsz5huzU7D8GrLABQS*t&w3L#KXIiNO0qNgqg*RdxXx3<U3c$02e zq#_}e3J&Geo{%`A^nj4y-ZK{vNUTOgR4N>}xoS|QoOokz5{UX%^ZdOxv-4)&``-Lm ztCbOm_ti%$vWCzjVeCk20-pQ;;4bn}5BZWWhf+_1uM*0U(o-U}r%J-FhFYZe^c-tp zDKdISj`h%t%Dr-qOJOCd_No$+5tgpa?F8EU;`)YESiOdCU==qHg6W%BnV|A6s^BTV zikp57Mjdbi>wXjPlrJy0{OM2C-t<uJ%&fn45%*nhXkkA{-K7v)LCjJ&4Ba#!v6WEb zVa8suf-de_R~b$RNjDi<K3>HkNv?Lwe~a^6>d4%9FA;xnLvCEg9}aNr;f}<cZx4dd ze<xlID2XE+r{F6Gu@A@zNgu4kk$W9G`OYaJA#)~sJ1*@rm~VJ+8ix&*CTHRGen^(w z&>?v|#`T2a<=_TaS4f0;ZNRVtgE}loF;`<(IP>kDWauPry26cs5x5}sxw#~c=iqpi z9~{Jq>s`mb!^nVo*zp63y_C=)*D2ha#$J(ngiHVi3<bs$4(cvSK^JmOc=w4fjnoaf za7rizCKWQ$Mrfpuq>(&Q?#ml`;r-Z5OFJtzCg4>hp;1ZbR7B5ZWctd;xUX(ZA_9jr z@!N~E-yUkm(J92FHCaMeU@r-MF?~b1g4U${{-IX*JNo(u?-q=(TuUU#?F)|V@g*WY zP-Bs>)Pjl)M2#6B42v0?Pgf`z^jFFjNJ^}|GIw*=`qB3XaU8_`V&*^8vX%+8PO^?h z#eI1_CPh^}5-$gRD%z4(gsOsCZzsca1^Bw3puo$jN217$ec%=IxZ<t(mpU5PfqZ>T zxf;X}NTi#J>{C(JPC1XcF9xlN`MOXIp_)QXf#RxQDibFXw=87)mM!RLM{dei?eoMd z5@V-0#C_^U^DGU3Y;@iyYjH?iA5(i3XlRGQl3iTpO!w4jTab8ul6Gb%L1H^WoMH-n zW|IWdyiJ)sX<B=yiyeppT@Cr<&B>gzGe-}>NyR<b5Y$bybp&aZTNggL@Kf{Dw`YG< z&;40>acs<v+b75EqvOWxxHdIDaD1y)s_Hk-Z%w0e>+{2pk*?LpwF8flX4ZeN9vU}W z<L6%+x90yTskQo31-wrcSdxi#Ph~JOv2uIQxy@dH=-(*|$CU3I3$xk-)d2WlR$Dk? zKA0;Bd`w$-xzw5ACCBlJ=QzA1iUwridOA$tO9k<%3W~QOHQn9Rba&gDieBS~{y#fN zgOGJ6o8@)qC!V!pkF8F=Va^kN<e5u%-=~~H-0b7@VnH#(al|9!IJ7O!qOcTbw**gJ zUWjkd6YwG`Ui)q14d|vph~K0gFvU~Pz6O;kk|aHrB}sjR>VKe<f1$IR==3I9+(fTG zH0M5R|7OnpY|h;~_ltSrrk?4RRDakyeDCs?i<t&E(@|~q&gI*SSxHz1s?6Lub9+8B zg;hqa=dy}GRaB{GHG%4=)y^6MHBn<Gn-XXmHLYw$pcb-@XR`twKzezr4T!!3r~DU5 Cd-qZR diff --git a/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-312.pyc deleted file mode 100644 index 4085f83f61a593f73145fa4790f55b6f06279e64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33879 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/operations/install/editable_legacy.py b/venv/lib/python3.12/site-packages/pip/_internal/operations/install/editable_legacy.py deleted file mode 100644 index bebe24e..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/operations/install/editable_legacy.py +++ /dev/null @@ -1,46 +0,0 @@ -"""Legacy editable installation process, i.e. `setup.py develop`. -""" -import logging -from typing import Optional, Sequence - -from pip._internal.build_env import BuildEnvironment -from pip._internal.utils.logging import indent_log -from pip._internal.utils.setuptools_build import make_setuptools_develop_args -from pip._internal.utils.subprocess import call_subprocess - -logger = logging.getLogger(__name__) - - -def install_editable( - *, - global_options: Sequence[str], - prefix: Optional[str], - home: Optional[str], - use_user_site: bool, - name: str, - setup_py_path: str, - isolated: bool, - build_env: BuildEnvironment, - unpacked_source_directory: str, -) -> None: - """Install a package in editable mode. Most arguments are pass-through - to setuptools. - """ - logger.info("Running setup.py develop for %s", name) - - args = make_setuptools_develop_args( - setup_py_path, - global_options=global_options, - no_user_config=isolated, - prefix=prefix, - home=home, - use_user_site=use_user_site, - ) - - with indent_log(): - with build_env: - call_subprocess( - args, - command_desc="python setup.py develop", - cwd=unpacked_source_directory, - ) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py b/venv/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py deleted file mode 100644 index f67180c..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py +++ /dev/null @@ -1,734 +0,0 @@ -"""Support for installing and building the "wheel" binary package format. -""" - -import collections -import compileall -import contextlib -import csv -import importlib -import logging -import os.path -import re -import shutil -import sys -import warnings -from base64 import urlsafe_b64encode -from email.message import Message -from itertools import chain, filterfalse, starmap -from typing import ( - IO, - TYPE_CHECKING, - Any, - BinaryIO, - Callable, - Dict, - Generator, - Iterable, - Iterator, - List, - NewType, - Optional, - Sequence, - Set, - Tuple, - Union, - cast, -) -from zipfile import ZipFile, ZipInfo - -from pip._vendor.distlib.scripts import ScriptMaker -from pip._vendor.distlib.util import get_export_entry -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.exceptions import InstallationError -from pip._internal.locations import get_major_minor_version -from pip._internal.metadata import ( - BaseDistribution, - FilesystemWheel, - get_wheel_distribution, -) -from pip._internal.models.direct_url import DIRECT_URL_METADATA_NAME, DirectUrl -from pip._internal.models.scheme import SCHEME_KEYS, Scheme -from pip._internal.utils.filesystem import adjacent_tmp_file, replace -from pip._internal.utils.misc import captured_stdout, ensure_dir, hash_file, partition -from pip._internal.utils.unpacking import ( - current_umask, - is_within_directory, - set_extracted_file_to_default_mode_plus_executable, - zip_item_is_executable, -) -from pip._internal.utils.wheel import parse_wheel - -if TYPE_CHECKING: - from typing import Protocol - - class File(Protocol): - src_record_path: "RecordPath" - dest_path: str - changed: bool - - def save(self) -> None: - pass - - -logger = logging.getLogger(__name__) - -RecordPath = NewType("RecordPath", str) -InstalledCSVRow = Tuple[RecordPath, str, Union[int, str]] - - -def rehash(path: str, blocksize: int = 1 << 20) -> Tuple[str, str]: - """Return (encoded_digest, length) for path using hashlib.sha256()""" - h, length = hash_file(path, blocksize) - digest = "sha256=" + urlsafe_b64encode(h.digest()).decode("latin1").rstrip("=") - return (digest, str(length)) - - -def csv_io_kwargs(mode: str) -> Dict[str, Any]: - """Return keyword arguments to properly open a CSV file - in the given mode. - """ - return {"mode": mode, "newline": "", "encoding": "utf-8"} - - -def fix_script(path: str) -> bool: - """Replace #!python with #!/path/to/python - Return True if file was changed. - """ - # XXX RECORD hashes will need to be updated - assert os.path.isfile(path) - - with open(path, "rb") as script: - firstline = script.readline() - if not firstline.startswith(b"#!python"): - return False - exename = sys.executable.encode(sys.getfilesystemencoding()) - firstline = b"#!" + exename + os.linesep.encode("ascii") - rest = script.read() - with open(path, "wb") as script: - script.write(firstline) - script.write(rest) - return True - - -def wheel_root_is_purelib(metadata: Message) -> bool: - return metadata.get("Root-Is-Purelib", "").lower() == "true" - - -def get_entrypoints(dist: BaseDistribution) -> Tuple[Dict[str, str], Dict[str, str]]: - console_scripts = {} - gui_scripts = {} - for entry_point in dist.iter_entry_points(): - if entry_point.group == "console_scripts": - console_scripts[entry_point.name] = entry_point.value - elif entry_point.group == "gui_scripts": - gui_scripts[entry_point.name] = entry_point.value - return console_scripts, gui_scripts - - -def message_about_scripts_not_on_PATH(scripts: Sequence[str]) -> Optional[str]: - """Determine if any scripts are not on PATH and format a warning. - Returns a warning message if one or more scripts are not on PATH, - otherwise None. - """ - if not scripts: - return None - - # Group scripts by the path they were installed in - grouped_by_dir: Dict[str, Set[str]] = collections.defaultdict(set) - for destfile in scripts: - parent_dir = os.path.dirname(destfile) - script_name = os.path.basename(destfile) - grouped_by_dir[parent_dir].add(script_name) - - # We don't want to warn for directories that are on PATH. - not_warn_dirs = [ - os.path.normcase(os.path.normpath(i)).rstrip(os.sep) - for i in os.environ.get("PATH", "").split(os.pathsep) - ] - # If an executable sits with sys.executable, we don't warn for it. - # This covers the case of venv invocations without activating the venv. - not_warn_dirs.append( - os.path.normcase(os.path.normpath(os.path.dirname(sys.executable))) - ) - warn_for: Dict[str, Set[str]] = { - parent_dir: scripts - for parent_dir, scripts in grouped_by_dir.items() - if os.path.normcase(os.path.normpath(parent_dir)) not in not_warn_dirs - } - if not warn_for: - return None - - # Format a message - msg_lines = [] - for parent_dir, dir_scripts in warn_for.items(): - sorted_scripts: List[str] = sorted(dir_scripts) - if len(sorted_scripts) == 1: - start_text = f"script {sorted_scripts[0]} is" - else: - start_text = "scripts {} are".format( - ", ".join(sorted_scripts[:-1]) + " and " + sorted_scripts[-1] - ) - - msg_lines.append( - f"The {start_text} installed in '{parent_dir}' which is not on PATH." - ) - - last_line_fmt = ( - "Consider adding {} to PATH or, if you prefer " - "to suppress this warning, use --no-warn-script-location." - ) - if len(msg_lines) == 1: - msg_lines.append(last_line_fmt.format("this directory")) - else: - msg_lines.append(last_line_fmt.format("these directories")) - - # Add a note if any directory starts with ~ - warn_for_tilde = any( - i[0] == "~" for i in os.environ.get("PATH", "").split(os.pathsep) if i - ) - if warn_for_tilde: - tilde_warning_msg = ( - "NOTE: The current PATH contains path(s) starting with `~`, " - "which may not be expanded by all applications." - ) - msg_lines.append(tilde_warning_msg) - - # Returns the formatted multiline message - return "\n".join(msg_lines) - - -def _normalized_outrows( - outrows: Iterable[InstalledCSVRow], -) -> List[Tuple[str, str, str]]: - """Normalize the given rows of a RECORD file. - - Items in each row are converted into str. Rows are then sorted to make - the value more predictable for tests. - - Each row is a 3-tuple (path, hash, size) and corresponds to a record of - a RECORD file (see PEP 376 and PEP 427 for details). For the rows - passed to this function, the size can be an integer as an int or string, - or the empty string. - """ - # Normally, there should only be one row per path, in which case the - # second and third elements don't come into play when sorting. - # However, in cases in the wild where a path might happen to occur twice, - # we don't want the sort operation to trigger an error (but still want - # determinism). Since the third element can be an int or string, we - # coerce each element to a string to avoid a TypeError in this case. - # For additional background, see-- - # https://github.com/pypa/pip/issues/5868 - return sorted( - (record_path, hash_, str(size)) for record_path, hash_, size in outrows - ) - - -def _record_to_fs_path(record_path: RecordPath, lib_dir: str) -> str: - return os.path.join(lib_dir, record_path) - - -def _fs_to_record_path(path: str, lib_dir: str) -> RecordPath: - # On Windows, do not handle relative paths if they belong to different - # logical disks - if os.path.splitdrive(path)[0].lower() == os.path.splitdrive(lib_dir)[0].lower(): - path = os.path.relpath(path, lib_dir) - - path = path.replace(os.path.sep, "/") - return cast("RecordPath", path) - - -def get_csv_rows_for_installed( - old_csv_rows: List[List[str]], - installed: Dict[RecordPath, RecordPath], - changed: Set[RecordPath], - generated: List[str], - lib_dir: str, -) -> List[InstalledCSVRow]: - """ - :param installed: A map from archive RECORD path to installation RECORD - path. - """ - installed_rows: List[InstalledCSVRow] = [] - for row in old_csv_rows: - if len(row) > 3: - logger.warning("RECORD line has more than three elements: %s", row) - old_record_path = cast("RecordPath", row[0]) - new_record_path = installed.pop(old_record_path, old_record_path) - if new_record_path in changed: - digest, length = rehash(_record_to_fs_path(new_record_path, lib_dir)) - else: - digest = row[1] if len(row) > 1 else "" - length = row[2] if len(row) > 2 else "" - installed_rows.append((new_record_path, digest, length)) - for f in generated: - path = _fs_to_record_path(f, lib_dir) - digest, length = rehash(f) - installed_rows.append((path, digest, length)) - return installed_rows + [ - (installed_record_path, "", "") for installed_record_path in installed.values() - ] - - -def get_console_script_specs(console: Dict[str, str]) -> List[str]: - """ - Given the mapping from entrypoint name to callable, return the relevant - console script specs. - """ - # Don't mutate caller's version - console = console.copy() - - scripts_to_generate = [] - - # Special case pip and setuptools to generate versioned wrappers - # - # The issue is that some projects (specifically, pip and setuptools) use - # code in setup.py to create "versioned" entry points - pip2.7 on Python - # 2.7, pip3.3 on Python 3.3, etc. But these entry points are baked into - # the wheel metadata at build time, and so if the wheel is installed with - # a *different* version of Python the entry points will be wrong. The - # correct fix for this is to enhance the metadata to be able to describe - # such versioned entry points, but that won't happen till Metadata 2.0 is - # available. - # In the meantime, projects using versioned entry points will either have - # incorrect versioned entry points, or they will not be able to distribute - # "universal" wheels (i.e., they will need a wheel per Python version). - # - # Because setuptools and pip are bundled with _ensurepip and virtualenv, - # we need to use universal wheels. So, as a stopgap until Metadata 2.0, we - # override the versioned entry points in the wheel and generate the - # correct ones. This code is purely a short-term measure until Metadata 2.0 - # is available. - # - # To add the level of hack in this section of code, in order to support - # ensurepip this code will look for an ``ENSUREPIP_OPTIONS`` environment - # variable which will control which version scripts get installed. - # - # ENSUREPIP_OPTIONS=altinstall - # - Only pipX.Y and easy_install-X.Y will be generated and installed - # ENSUREPIP_OPTIONS=install - # - pipX.Y, pipX, easy_install-X.Y will be generated and installed. Note - # that this option is technically if ENSUREPIP_OPTIONS is set and is - # not altinstall - # DEFAULT - # - The default behavior is to install pip, pipX, pipX.Y, easy_install - # and easy_install-X.Y. - pip_script = console.pop("pip", None) - if pip_script: - if "ENSUREPIP_OPTIONS" not in os.environ: - scripts_to_generate.append("pip = " + pip_script) - - if os.environ.get("ENSUREPIP_OPTIONS", "") != "altinstall": - scripts_to_generate.append(f"pip{sys.version_info[0]} = {pip_script}") - - scripts_to_generate.append(f"pip{get_major_minor_version()} = {pip_script}") - # Delete any other versioned pip entry points - pip_ep = [k for k in console if re.match(r"pip(\d+(\.\d+)?)?$", k)] - for k in pip_ep: - del console[k] - easy_install_script = console.pop("easy_install", None) - if easy_install_script: - if "ENSUREPIP_OPTIONS" not in os.environ: - scripts_to_generate.append("easy_install = " + easy_install_script) - - scripts_to_generate.append( - f"easy_install-{get_major_minor_version()} = {easy_install_script}" - ) - # Delete any other versioned easy_install entry points - easy_install_ep = [ - k for k in console if re.match(r"easy_install(-\d+\.\d+)?$", k) - ] - for k in easy_install_ep: - del console[k] - - # Generate the console entry points specified in the wheel - scripts_to_generate.extend(starmap("{} = {}".format, console.items())) - - return scripts_to_generate - - -class ZipBackedFile: - def __init__( - self, src_record_path: RecordPath, dest_path: str, zip_file: ZipFile - ) -> None: - self.src_record_path = src_record_path - self.dest_path = dest_path - self._zip_file = zip_file - self.changed = False - - def _getinfo(self) -> ZipInfo: - return self._zip_file.getinfo(self.src_record_path) - - def save(self) -> None: - # directory creation is lazy and after file filtering - # to ensure we don't install empty dirs; empty dirs can't be - # uninstalled. - parent_dir = os.path.dirname(self.dest_path) - ensure_dir(parent_dir) - - # When we open the output file below, any existing file is truncated - # before we start writing the new contents. This is fine in most - # cases, but can cause a segfault if pip has loaded a shared - # object (e.g. from pyopenssl through its vendored urllib3) - # Since the shared object is mmap'd an attempt to call a - # symbol in it will then cause a segfault. Unlinking the file - # allows writing of new contents while allowing the process to - # continue to use the old copy. - if os.path.exists(self.dest_path): - os.unlink(self.dest_path) - - zipinfo = self._getinfo() - - with self._zip_file.open(zipinfo) as f: - with open(self.dest_path, "wb") as dest: - shutil.copyfileobj(f, dest) - - if zip_item_is_executable(zipinfo): - set_extracted_file_to_default_mode_plus_executable(self.dest_path) - - -class ScriptFile: - def __init__(self, file: "File") -> None: - self._file = file - self.src_record_path = self._file.src_record_path - self.dest_path = self._file.dest_path - self.changed = False - - def save(self) -> None: - self._file.save() - self.changed = fix_script(self.dest_path) - - -class MissingCallableSuffix(InstallationError): - def __init__(self, entry_point: str) -> None: - super().__init__( - f"Invalid script entry point: {entry_point} - A callable " - "suffix is required. Cf https://packaging.python.org/" - "specifications/entry-points/#use-for-scripts for more " - "information." - ) - - -def _raise_for_invalid_entrypoint(specification: str) -> None: - entry = get_export_entry(specification) - if entry is not None and entry.suffix is None: - raise MissingCallableSuffix(str(entry)) - - -class PipScriptMaker(ScriptMaker): - def make( - self, specification: str, options: Optional[Dict[str, Any]] = None - ) -> List[str]: - _raise_for_invalid_entrypoint(specification) - return super().make(specification, options) - - -def _install_wheel( - name: str, - wheel_zip: ZipFile, - wheel_path: str, - scheme: Scheme, - pycompile: bool = True, - warn_script_location: bool = True, - direct_url: Optional[DirectUrl] = None, - requested: bool = False, -) -> None: - """Install a wheel. - - :param name: Name of the project to install - :param wheel_zip: open ZipFile for wheel being installed - :param scheme: Distutils scheme dictating the install directories - :param req_description: String used in place of the requirement, for - logging - :param pycompile: Whether to byte-compile installed Python files - :param warn_script_location: Whether to check that scripts are installed - into a directory on PATH - :raises UnsupportedWheel: - * when the directory holds an unpacked wheel with incompatible - Wheel-Version - * when the .dist-info dir does not match the wheel - """ - info_dir, metadata = parse_wheel(wheel_zip, name) - - if wheel_root_is_purelib(metadata): - lib_dir = scheme.purelib - else: - lib_dir = scheme.platlib - - # Record details of the files moved - # installed = files copied from the wheel to the destination - # changed = files changed while installing (scripts #! line typically) - # generated = files newly generated during the install (script wrappers) - installed: Dict[RecordPath, RecordPath] = {} - changed: Set[RecordPath] = set() - generated: List[str] = [] - - def record_installed( - srcfile: RecordPath, destfile: str, modified: bool = False - ) -> None: - """Map archive RECORD paths to installation RECORD paths.""" - newpath = _fs_to_record_path(destfile, lib_dir) - installed[srcfile] = newpath - if modified: - changed.add(newpath) - - def is_dir_path(path: RecordPath) -> bool: - return path.endswith("/") - - def assert_no_path_traversal(dest_dir_path: str, target_path: str) -> None: - if not is_within_directory(dest_dir_path, target_path): - message = ( - "The wheel {!r} has a file {!r} trying to install" - " outside the target directory {!r}" - ) - raise InstallationError( - message.format(wheel_path, target_path, dest_dir_path) - ) - - def root_scheme_file_maker( - zip_file: ZipFile, dest: str - ) -> Callable[[RecordPath], "File"]: - def make_root_scheme_file(record_path: RecordPath) -> "File": - normed_path = os.path.normpath(record_path) - dest_path = os.path.join(dest, normed_path) - assert_no_path_traversal(dest, dest_path) - return ZipBackedFile(record_path, dest_path, zip_file) - - return make_root_scheme_file - - def data_scheme_file_maker( - zip_file: ZipFile, scheme: Scheme - ) -> Callable[[RecordPath], "File"]: - scheme_paths = {key: getattr(scheme, key) for key in SCHEME_KEYS} - - def make_data_scheme_file(record_path: RecordPath) -> "File": - normed_path = os.path.normpath(record_path) - try: - _, scheme_key, dest_subpath = normed_path.split(os.path.sep, 2) - except ValueError: - message = ( - "Unexpected file in {}: {!r}. .data directory contents" - " should be named like: '<scheme key>/<path>'." - ).format(wheel_path, record_path) - raise InstallationError(message) - - try: - scheme_path = scheme_paths[scheme_key] - except KeyError: - valid_scheme_keys = ", ".join(sorted(scheme_paths)) - message = ( - "Unknown scheme key used in {}: {} (for file {!r}). .data" - " directory contents should be in subdirectories named" - " with a valid scheme key ({})" - ).format(wheel_path, scheme_key, record_path, valid_scheme_keys) - raise InstallationError(message) - - dest_path = os.path.join(scheme_path, dest_subpath) - assert_no_path_traversal(scheme_path, dest_path) - return ZipBackedFile(record_path, dest_path, zip_file) - - return make_data_scheme_file - - def is_data_scheme_path(path: RecordPath) -> bool: - return path.split("/", 1)[0].endswith(".data") - - paths = cast(List[RecordPath], wheel_zip.namelist()) - file_paths = filterfalse(is_dir_path, paths) - root_scheme_paths, data_scheme_paths = partition(is_data_scheme_path, file_paths) - - make_root_scheme_file = root_scheme_file_maker(wheel_zip, lib_dir) - files: Iterator[File] = map(make_root_scheme_file, root_scheme_paths) - - def is_script_scheme_path(path: RecordPath) -> bool: - parts = path.split("/", 2) - return len(parts) > 2 and parts[0].endswith(".data") and parts[1] == "scripts" - - other_scheme_paths, script_scheme_paths = partition( - is_script_scheme_path, data_scheme_paths - ) - - make_data_scheme_file = data_scheme_file_maker(wheel_zip, scheme) - other_scheme_files = map(make_data_scheme_file, other_scheme_paths) - files = chain(files, other_scheme_files) - - # Get the defined entry points - distribution = get_wheel_distribution( - FilesystemWheel(wheel_path), - canonicalize_name(name), - ) - console, gui = get_entrypoints(distribution) - - def is_entrypoint_wrapper(file: "File") -> bool: - # EP, EP.exe and EP-script.py are scripts generated for - # entry point EP by setuptools - path = file.dest_path - name = os.path.basename(path) - if name.lower().endswith(".exe"): - matchname = name[:-4] - elif name.lower().endswith("-script.py"): - matchname = name[:-10] - elif name.lower().endswith(".pya"): - matchname = name[:-4] - else: - matchname = name - # Ignore setuptools-generated scripts - return matchname in console or matchname in gui - - script_scheme_files: Iterator[File] = map( - make_data_scheme_file, script_scheme_paths - ) - script_scheme_files = filterfalse(is_entrypoint_wrapper, script_scheme_files) - script_scheme_files = map(ScriptFile, script_scheme_files) - files = chain(files, script_scheme_files) - - for file in files: - file.save() - record_installed(file.src_record_path, file.dest_path, file.changed) - - def pyc_source_file_paths() -> Generator[str, None, None]: - # We de-duplicate installation paths, since there can be overlap (e.g. - # file in .data maps to same location as file in wheel root). - # Sorting installation paths makes it easier to reproduce and debug - # issues related to permissions on existing files. - for installed_path in sorted(set(installed.values())): - full_installed_path = os.path.join(lib_dir, installed_path) - if not os.path.isfile(full_installed_path): - continue - if not full_installed_path.endswith(".py"): - continue - yield full_installed_path - - def pyc_output_path(path: str) -> str: - """Return the path the pyc file would have been written to.""" - return importlib.util.cache_from_source(path) - - # Compile all of the pyc files for the installed files - if pycompile: - with captured_stdout() as stdout: - with warnings.catch_warnings(): - warnings.filterwarnings("ignore") - for path in pyc_source_file_paths(): - success = compileall.compile_file(path, force=True, quiet=True) - if success: - pyc_path = pyc_output_path(path) - assert os.path.exists(pyc_path) - pyc_record_path = cast( - "RecordPath", pyc_path.replace(os.path.sep, "/") - ) - record_installed(pyc_record_path, pyc_path) - logger.debug(stdout.getvalue()) - - maker = PipScriptMaker(None, scheme.scripts) - - # Ensure old scripts are overwritten. - # See https://github.com/pypa/pip/issues/1800 - maker.clobber = True - - # Ensure we don't generate any variants for scripts because this is almost - # never what somebody wants. - # See https://bitbucket.org/pypa/distlib/issue/35/ - maker.variants = {""} - - # This is required because otherwise distlib creates scripts that are not - # executable. - # See https://bitbucket.org/pypa/distlib/issue/32/ - maker.set_mode = True - - # Generate the console and GUI entry points specified in the wheel - scripts_to_generate = get_console_script_specs(console) - - gui_scripts_to_generate = list(starmap("{} = {}".format, gui.items())) - - generated_console_scripts = maker.make_multiple(scripts_to_generate) - generated.extend(generated_console_scripts) - - generated.extend(maker.make_multiple(gui_scripts_to_generate, {"gui": True})) - - if warn_script_location: - msg = message_about_scripts_not_on_PATH(generated_console_scripts) - if msg is not None: - logger.warning(msg) - - generated_file_mode = 0o666 & ~current_umask() - - @contextlib.contextmanager - def _generate_file(path: str, **kwargs: Any) -> Generator[BinaryIO, None, None]: - with adjacent_tmp_file(path, **kwargs) as f: - yield f - os.chmod(f.name, generated_file_mode) - replace(f.name, path) - - dest_info_dir = os.path.join(lib_dir, info_dir) - - # Record pip as the installer - installer_path = os.path.join(dest_info_dir, "INSTALLER") - with _generate_file(installer_path) as installer_file: - installer_file.write(b"pip\n") - generated.append(installer_path) - - # Record the PEP 610 direct URL reference - if direct_url is not None: - direct_url_path = os.path.join(dest_info_dir, DIRECT_URL_METADATA_NAME) - with _generate_file(direct_url_path) as direct_url_file: - direct_url_file.write(direct_url.to_json().encode("utf-8")) - generated.append(direct_url_path) - - # Record the REQUESTED file - if requested: - requested_path = os.path.join(dest_info_dir, "REQUESTED") - with open(requested_path, "wb"): - pass - generated.append(requested_path) - - record_text = distribution.read_text("RECORD") - record_rows = list(csv.reader(record_text.splitlines())) - - rows = get_csv_rows_for_installed( - record_rows, - installed=installed, - changed=changed, - generated=generated, - lib_dir=lib_dir, - ) - - # Record details of all files installed - record_path = os.path.join(dest_info_dir, "RECORD") - - with _generate_file(record_path, **csv_io_kwargs("w")) as record_file: - # Explicitly cast to typing.IO[str] as a workaround for the mypy error: - # "writer" has incompatible type "BinaryIO"; expected "_Writer" - writer = csv.writer(cast("IO[str]", record_file)) - writer.writerows(_normalized_outrows(rows)) - - -@contextlib.contextmanager -def req_error_context(req_description: str) -> Generator[None, None, None]: - try: - yield - except InstallationError as e: - message = f"For req: {req_description}. {e.args[0]}" - raise InstallationError(message) from e - - -def install_wheel( - name: str, - wheel_path: str, - scheme: Scheme, - req_description: str, - pycompile: bool = True, - warn_script_location: bool = True, - direct_url: Optional[DirectUrl] = None, - requested: bool = False, -) -> None: - with ZipFile(wheel_path, allowZip64=True) as z: - with req_error_context(req_description): - _install_wheel( - name=name, - wheel_zip=z, - wheel_path=wheel_path, - scheme=scheme, - pycompile=pycompile, - warn_script_location=warn_script_location, - direct_url=direct_url, - requested=requested, - ) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py b/venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py deleted file mode 100644 index 956717d..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py +++ /dev/null @@ -1,730 +0,0 @@ -"""Prepares a distribution for installation -""" - -# The following comment should be removed at some point in the future. -# mypy: strict-optional=False - -import mimetypes -import os -import shutil -from pathlib import Path -from typing import Dict, Iterable, List, Optional - -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.distributions import make_distribution_for_install_requirement -from pip._internal.distributions.installed import InstalledDistribution -from pip._internal.exceptions import ( - DirectoryUrlHashUnsupported, - HashMismatch, - HashUnpinned, - InstallationError, - MetadataInconsistent, - NetworkConnectionError, - VcsHashUnsupported, -) -from pip._internal.index.package_finder import PackageFinder -from pip._internal.metadata import BaseDistribution, get_metadata_distribution -from pip._internal.models.direct_url import ArchiveInfo -from pip._internal.models.link import Link -from pip._internal.models.wheel import Wheel -from pip._internal.network.download import BatchDownloader, Downloader -from pip._internal.network.lazy_wheel import ( - HTTPRangeRequestUnsupported, - dist_from_wheel_url, -) -from pip._internal.network.session import PipSession -from pip._internal.operations.build.build_tracker import BuildTracker -from pip._internal.req.req_install import InstallRequirement -from pip._internal.utils._log import getLogger -from pip._internal.utils.direct_url_helpers import ( - direct_url_for_editable, - direct_url_from_link, -) -from pip._internal.utils.hashes import Hashes, MissingHashes -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import ( - display_path, - hash_file, - hide_url, - redact_auth_from_requirement, -) -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.utils.unpacking import unpack_file -from pip._internal.vcs import vcs - -logger = getLogger(__name__) - - -def _get_prepared_distribution( - req: InstallRequirement, - build_tracker: BuildTracker, - finder: PackageFinder, - build_isolation: bool, - check_build_deps: bool, -) -> BaseDistribution: - """Prepare a distribution for installation.""" - abstract_dist = make_distribution_for_install_requirement(req) - tracker_id = abstract_dist.build_tracker_id - if tracker_id is not None: - with build_tracker.track(req, tracker_id): - abstract_dist.prepare_distribution_metadata( - finder, build_isolation, check_build_deps - ) - return abstract_dist.get_metadata_distribution() - - -def unpack_vcs_link(link: Link, location: str, verbosity: int) -> None: - vcs_backend = vcs.get_backend_for_scheme(link.scheme) - assert vcs_backend is not None - vcs_backend.unpack(location, url=hide_url(link.url), verbosity=verbosity) - - -class File: - def __init__(self, path: str, content_type: Optional[str]) -> None: - self.path = path - if content_type is None: - self.content_type = mimetypes.guess_type(path)[0] - else: - self.content_type = content_type - - -def get_http_url( - link: Link, - download: Downloader, - download_dir: Optional[str] = None, - hashes: Optional[Hashes] = None, -) -> File: - temp_dir = TempDirectory(kind="unpack", globally_managed=True) - # If a download dir is specified, is the file already downloaded there? - already_downloaded_path = None - if download_dir: - already_downloaded_path = _check_download_dir(link, download_dir, hashes) - - if already_downloaded_path: - from_path = already_downloaded_path - content_type = None - else: - # let's download to a tmp dir - from_path, content_type = download(link, temp_dir.path) - if hashes: - hashes.check_against_path(from_path) - - return File(from_path, content_type) - - -def get_file_url( - link: Link, download_dir: Optional[str] = None, hashes: Optional[Hashes] = None -) -> File: - """Get file and optionally check its hash.""" - # If a download dir is specified, is the file already there and valid? - already_downloaded_path = None - if download_dir: - already_downloaded_path = _check_download_dir(link, download_dir, hashes) - - if already_downloaded_path: - from_path = already_downloaded_path - else: - from_path = link.file_path - - # If --require-hashes is off, `hashes` is either empty, the - # link's embedded hash, or MissingHashes; it is required to - # match. If --require-hashes is on, we are satisfied by any - # hash in `hashes` matching: a URL-based or an option-based - # one; no internet-sourced hash will be in `hashes`. - if hashes: - hashes.check_against_path(from_path) - return File(from_path, None) - - -def unpack_url( - link: Link, - location: str, - download: Downloader, - verbosity: int, - download_dir: Optional[str] = None, - hashes: Optional[Hashes] = None, -) -> Optional[File]: - """Unpack link into location, downloading if required. - - :param hashes: A Hashes object, one of whose embedded hashes must match, - or HashMismatch will be raised. If the Hashes is empty, no matches are - required, and unhashable types of requirements (like VCS ones, which - would ordinarily raise HashUnsupported) are allowed. - """ - # non-editable vcs urls - if link.is_vcs: - unpack_vcs_link(link, location, verbosity=verbosity) - return None - - assert not link.is_existing_dir() - - # file urls - if link.is_file: - file = get_file_url(link, download_dir, hashes=hashes) - - # http urls - else: - file = get_http_url( - link, - download, - download_dir, - hashes=hashes, - ) - - # unpack the archive to the build dir location. even when only downloading - # archives, they have to be unpacked to parse dependencies, except wheels - if not link.is_wheel: - unpack_file(file.path, location, file.content_type) - - return file - - -def _check_download_dir( - link: Link, - download_dir: str, - hashes: Optional[Hashes], - warn_on_hash_mismatch: bool = True, -) -> Optional[str]: - """Check download_dir for previously downloaded file with correct hash - If a correct file is found return its path else None - """ - download_path = os.path.join(download_dir, link.filename) - - if not os.path.exists(download_path): - return None - - # If already downloaded, does its hash match? - logger.info("File was already downloaded %s", download_path) - if hashes: - try: - hashes.check_against_path(download_path) - except HashMismatch: - if warn_on_hash_mismatch: - logger.warning( - "Previously-downloaded file %s has bad hash. Re-downloading.", - download_path, - ) - os.unlink(download_path) - return None - return download_path - - -class RequirementPreparer: - """Prepares a Requirement""" - - def __init__( - self, - build_dir: str, - download_dir: Optional[str], - src_dir: str, - build_isolation: bool, - check_build_deps: bool, - build_tracker: BuildTracker, - session: PipSession, - progress_bar: str, - finder: PackageFinder, - require_hashes: bool, - use_user_site: bool, - lazy_wheel: bool, - verbosity: int, - legacy_resolver: bool, - ) -> None: - super().__init__() - - self.src_dir = src_dir - self.build_dir = build_dir - self.build_tracker = build_tracker - self._session = session - self._download = Downloader(session, progress_bar) - self._batch_download = BatchDownloader(session, progress_bar) - self.finder = finder - - # Where still-packed archives should be written to. If None, they are - # not saved, and are deleted immediately after unpacking. - self.download_dir = download_dir - - # Is build isolation allowed? - self.build_isolation = build_isolation - - # Should check build dependencies? - self.check_build_deps = check_build_deps - - # Should hash-checking be required? - self.require_hashes = require_hashes - - # Should install in user site-packages? - self.use_user_site = use_user_site - - # Should wheels be downloaded lazily? - self.use_lazy_wheel = lazy_wheel - - # How verbose should underlying tooling be? - self.verbosity = verbosity - - # Are we using the legacy resolver? - self.legacy_resolver = legacy_resolver - - # Memoized downloaded files, as mapping of url: path. - self._downloaded: Dict[str, str] = {} - - # Previous "header" printed for a link-based InstallRequirement - self._previous_requirement_header = ("", "") - - def _log_preparing_link(self, req: InstallRequirement) -> None: - """Provide context for the requirement being prepared.""" - if req.link.is_file and not req.is_wheel_from_cache: - message = "Processing %s" - information = str(display_path(req.link.file_path)) - else: - message = "Collecting %s" - information = redact_auth_from_requirement(req.req) if req.req else str(req) - - # If we used req.req, inject requirement source if available (this - # would already be included if we used req directly) - if req.req and req.comes_from: - if isinstance(req.comes_from, str): - comes_from: Optional[str] = req.comes_from - else: - comes_from = req.comes_from.from_path() - if comes_from: - information += f" (from {comes_from})" - - if (message, information) != self._previous_requirement_header: - self._previous_requirement_header = (message, information) - logger.info(message, information) - - if req.is_wheel_from_cache: - with indent_log(): - logger.info("Using cached %s", req.link.filename) - - def _ensure_link_req_src_dir( - self, req: InstallRequirement, parallel_builds: bool - ) -> None: - """Ensure source_dir of a linked InstallRequirement.""" - # Since source_dir is only set for editable requirements. - if req.link.is_wheel: - # We don't need to unpack wheels, so no need for a source - # directory. - return - assert req.source_dir is None - if req.link.is_existing_dir(): - # build local directories in-tree - req.source_dir = req.link.file_path - return - - # We always delete unpacked sdists after pip runs. - req.ensure_has_source_dir( - self.build_dir, - autodelete=True, - parallel_builds=parallel_builds, - ) - req.ensure_pristine_source_checkout() - - def _get_linked_req_hashes(self, req: InstallRequirement) -> Hashes: - # By the time this is called, the requirement's link should have - # been checked so we can tell what kind of requirements req is - # and raise some more informative errors than otherwise. - # (For example, we can raise VcsHashUnsupported for a VCS URL - # rather than HashMissing.) - if not self.require_hashes: - return req.hashes(trust_internet=True) - - # We could check these first 2 conditions inside unpack_url - # and save repetition of conditions, but then we would - # report less-useful error messages for unhashable - # requirements, complaining that there's no hash provided. - if req.link.is_vcs: - raise VcsHashUnsupported() - if req.link.is_existing_dir(): - raise DirectoryUrlHashUnsupported() - - # Unpinned packages are asking for trouble when a new version - # is uploaded. This isn't a security check, but it saves users - # a surprising hash mismatch in the future. - # file:/// URLs aren't pinnable, so don't complain about them - # not being pinned. - if not req.is_direct and not req.is_pinned: - raise HashUnpinned() - - # If known-good hashes are missing for this requirement, - # shim it with a facade object that will provoke hash - # computation and then raise a HashMissing exception - # showing the user what the hash should be. - return req.hashes(trust_internet=False) or MissingHashes() - - def _fetch_metadata_only( - self, - req: InstallRequirement, - ) -> Optional[BaseDistribution]: - if self.legacy_resolver: - logger.debug( - "Metadata-only fetching is not used in the legacy resolver", - ) - return None - if self.require_hashes: - logger.debug( - "Metadata-only fetching is not used as hash checking is required", - ) - return None - # Try PEP 658 metadata first, then fall back to lazy wheel if unavailable. - return self._fetch_metadata_using_link_data_attr( - req - ) or self._fetch_metadata_using_lazy_wheel(req.link) - - def _fetch_metadata_using_link_data_attr( - self, - req: InstallRequirement, - ) -> Optional[BaseDistribution]: - """Fetch metadata from the data-dist-info-metadata attribute, if possible.""" - # (1) Get the link to the metadata file, if provided by the backend. - metadata_link = req.link.metadata_link() - if metadata_link is None: - return None - assert req.req is not None - logger.verbose( - "Obtaining dependency information for %s from %s", - req.req, - metadata_link, - ) - # (2) Download the contents of the METADATA file, separate from the dist itself. - metadata_file = get_http_url( - metadata_link, - self._download, - hashes=metadata_link.as_hashes(), - ) - with open(metadata_file.path, "rb") as f: - metadata_contents = f.read() - # (3) Generate a dist just from those file contents. - metadata_dist = get_metadata_distribution( - metadata_contents, - req.link.filename, - req.req.name, - ) - # (4) Ensure the Name: field from the METADATA file matches the name from the - # install requirement. - # - # NB: raw_name will fall back to the name from the install requirement if - # the Name: field is not present, but it's noted in the raw_name docstring - # that that should NEVER happen anyway. - if canonicalize_name(metadata_dist.raw_name) != canonicalize_name(req.req.name): - raise MetadataInconsistent( - req, "Name", req.req.name, metadata_dist.raw_name - ) - return metadata_dist - - def _fetch_metadata_using_lazy_wheel( - self, - link: Link, - ) -> Optional[BaseDistribution]: - """Fetch metadata using lazy wheel, if possible.""" - # --use-feature=fast-deps must be provided. - if not self.use_lazy_wheel: - return None - if link.is_file or not link.is_wheel: - logger.debug( - "Lazy wheel is not used as %r does not point to a remote wheel", - link, - ) - return None - - wheel = Wheel(link.filename) - name = canonicalize_name(wheel.name) - logger.info( - "Obtaining dependency information from %s %s", - name, - wheel.version, - ) - url = link.url.split("#", 1)[0] - try: - return dist_from_wheel_url(name, url, self._session) - except HTTPRangeRequestUnsupported: - logger.debug("%s does not support range requests", url) - return None - - def _complete_partial_requirements( - self, - partially_downloaded_reqs: Iterable[InstallRequirement], - parallel_builds: bool = False, - ) -> None: - """Download any requirements which were only fetched by metadata.""" - # Download to a temporary directory. These will be copied over as - # needed for downstream 'download', 'wheel', and 'install' commands. - temp_dir = TempDirectory(kind="unpack", globally_managed=True).path - - # Map each link to the requirement that owns it. This allows us to set - # `req.local_file_path` on the appropriate requirement after passing - # all the links at once into BatchDownloader. - links_to_fully_download: Dict[Link, InstallRequirement] = {} - for req in partially_downloaded_reqs: - assert req.link - links_to_fully_download[req.link] = req - - batch_download = self._batch_download( - links_to_fully_download.keys(), - temp_dir, - ) - for link, (filepath, _) in batch_download: - logger.debug("Downloading link %s to %s", link, filepath) - req = links_to_fully_download[link] - # Record the downloaded file path so wheel reqs can extract a Distribution - # in .get_dist(). - req.local_file_path = filepath - # Record that the file is downloaded so we don't do it again in - # _prepare_linked_requirement(). - self._downloaded[req.link.url] = filepath - - # If this is an sdist, we need to unpack it after downloading, but the - # .source_dir won't be set up until we are in _prepare_linked_requirement(). - # Add the downloaded archive to the install requirement to unpack after - # preparing the source dir. - if not req.is_wheel: - req.needs_unpacked_archive(Path(filepath)) - - # This step is necessary to ensure all lazy wheels are processed - # successfully by the 'download', 'wheel', and 'install' commands. - for req in partially_downloaded_reqs: - self._prepare_linked_requirement(req, parallel_builds) - - def prepare_linked_requirement( - self, req: InstallRequirement, parallel_builds: bool = False - ) -> BaseDistribution: - """Prepare a requirement to be obtained from req.link.""" - assert req.link - self._log_preparing_link(req) - with indent_log(): - # Check if the relevant file is already available - # in the download directory - file_path = None - if self.download_dir is not None and req.link.is_wheel: - hashes = self._get_linked_req_hashes(req) - file_path = _check_download_dir( - req.link, - self.download_dir, - hashes, - # When a locally built wheel has been found in cache, we don't warn - # about re-downloading when the already downloaded wheel hash does - # not match. This is because the hash must be checked against the - # original link, not the cached link. It that case the already - # downloaded file will be removed and re-fetched from cache (which - # implies a hash check against the cache entry's origin.json). - warn_on_hash_mismatch=not req.is_wheel_from_cache, - ) - - if file_path is not None: - # The file is already available, so mark it as downloaded - self._downloaded[req.link.url] = file_path - else: - # The file is not available, attempt to fetch only metadata - metadata_dist = self._fetch_metadata_only(req) - if metadata_dist is not None: - req.needs_more_preparation = True - return metadata_dist - - # None of the optimizations worked, fully prepare the requirement - return self._prepare_linked_requirement(req, parallel_builds) - - def prepare_linked_requirements_more( - self, reqs: Iterable[InstallRequirement], parallel_builds: bool = False - ) -> None: - """Prepare linked requirements more, if needed.""" - reqs = [req for req in reqs if req.needs_more_preparation] - for req in reqs: - # Determine if any of these requirements were already downloaded. - if self.download_dir is not None and req.link.is_wheel: - hashes = self._get_linked_req_hashes(req) - file_path = _check_download_dir(req.link, self.download_dir, hashes) - if file_path is not None: - self._downloaded[req.link.url] = file_path - req.needs_more_preparation = False - - # Prepare requirements we found were already downloaded for some - # reason. The other downloads will be completed separately. - partially_downloaded_reqs: List[InstallRequirement] = [] - for req in reqs: - if req.needs_more_preparation: - partially_downloaded_reqs.append(req) - else: - self._prepare_linked_requirement(req, parallel_builds) - - # TODO: separate this part out from RequirementPreparer when the v1 - # resolver can be removed! - self._complete_partial_requirements( - partially_downloaded_reqs, - parallel_builds=parallel_builds, - ) - - def _prepare_linked_requirement( - self, req: InstallRequirement, parallel_builds: bool - ) -> BaseDistribution: - assert req.link - link = req.link - - hashes = self._get_linked_req_hashes(req) - - if hashes and req.is_wheel_from_cache: - assert req.download_info is not None - assert link.is_wheel - assert link.is_file - # We need to verify hashes, and we have found the requirement in the cache - # of locally built wheels. - if ( - isinstance(req.download_info.info, ArchiveInfo) - and req.download_info.info.hashes - and hashes.has_one_of(req.download_info.info.hashes) - ): - # At this point we know the requirement was built from a hashable source - # artifact, and we verified that the cache entry's hash of the original - # artifact matches one of the hashes we expect. We don't verify hashes - # against the cached wheel, because the wheel is not the original. - hashes = None - else: - logger.warning( - "The hashes of the source archive found in cache entry " - "don't match, ignoring cached built wheel " - "and re-downloading source." - ) - req.link = req.cached_wheel_source_link - link = req.link - - self._ensure_link_req_src_dir(req, parallel_builds) - - if link.is_existing_dir(): - local_file = None - elif link.url not in self._downloaded: - try: - local_file = unpack_url( - link, - req.source_dir, - self._download, - self.verbosity, - self.download_dir, - hashes, - ) - except NetworkConnectionError as exc: - raise InstallationError( - f"Could not install requirement {req} because of HTTP " - f"error {exc} for URL {link}" - ) - else: - file_path = self._downloaded[link.url] - if hashes: - hashes.check_against_path(file_path) - local_file = File(file_path, content_type=None) - - # If download_info is set, we got it from the wheel cache. - if req.download_info is None: - # Editables don't go through this function (see - # prepare_editable_requirement). - assert not req.editable - req.download_info = direct_url_from_link(link, req.source_dir) - # Make sure we have a hash in download_info. If we got it as part of the - # URL, it will have been verified and we can rely on it. Otherwise we - # compute it from the downloaded file. - # FIXME: https://github.com/pypa/pip/issues/11943 - if ( - isinstance(req.download_info.info, ArchiveInfo) - and not req.download_info.info.hashes - and local_file - ): - hash = hash_file(local_file.path)[0].hexdigest() - # We populate info.hash for backward compatibility. - # This will automatically populate info.hashes. - req.download_info.info.hash = f"sha256={hash}" - - # For use in later processing, - # preserve the file path on the requirement. - if local_file: - req.local_file_path = local_file.path - - dist = _get_prepared_distribution( - req, - self.build_tracker, - self.finder, - self.build_isolation, - self.check_build_deps, - ) - return dist - - def save_linked_requirement(self, req: InstallRequirement) -> None: - assert self.download_dir is not None - assert req.link is not None - link = req.link - if link.is_vcs or (link.is_existing_dir() and req.editable): - # Make a .zip of the source_dir we already created. - req.archive(self.download_dir) - return - - if link.is_existing_dir(): - logger.debug( - "Not copying link to destination directory " - "since it is a directory: %s", - link, - ) - return - if req.local_file_path is None: - # No distribution was downloaded for this requirement. - return - - download_location = os.path.join(self.download_dir, link.filename) - if not os.path.exists(download_location): - shutil.copy(req.local_file_path, download_location) - download_path = display_path(download_location) - logger.info("Saved %s", download_path) - - def prepare_editable_requirement( - self, - req: InstallRequirement, - ) -> BaseDistribution: - """Prepare an editable requirement.""" - assert req.editable, "cannot prepare a non-editable req as editable" - - logger.info("Obtaining %s", req) - - with indent_log(): - if self.require_hashes: - raise InstallationError( - f"The editable requirement {req} cannot be installed when " - "requiring hashes, because there is no single file to " - "hash." - ) - req.ensure_has_source_dir(self.src_dir) - req.update_editable() - assert req.source_dir - req.download_info = direct_url_for_editable(req.unpacked_source_directory) - - dist = _get_prepared_distribution( - req, - self.build_tracker, - self.finder, - self.build_isolation, - self.check_build_deps, - ) - - req.check_if_exists(self.use_user_site) - - return dist - - def prepare_installed_requirement( - self, - req: InstallRequirement, - skip_reason: str, - ) -> BaseDistribution: - """Prepare an already-installed requirement.""" - assert req.satisfied_by, "req should have been satisfied but isn't" - assert skip_reason is not None, ( - "did not get skip reason skipped but req.satisfied_by " - f"is set to {req.satisfied_by}" - ) - logger.info( - "Requirement %s: %s (%s)", skip_reason, req, req.satisfied_by.version - ) - with indent_log(): - if self.require_hashes: - logger.debug( - "Since it is already installed, we are trusting this " - "package without checking its hash. To ensure a " - "completely repeatable environment, install into an " - "empty virtualenv." - ) - return InstalledDistribution(req).get_metadata_distribution() diff --git a/venv/lib/python3.12/site-packages/pip/_internal/pyproject.py b/venv/lib/python3.12/site-packages/pip/_internal/pyproject.py deleted file mode 100644 index 8de36b8..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/pyproject.py +++ /dev/null @@ -1,179 +0,0 @@ -import importlib.util -import os -from collections import namedtuple -from typing import Any, List, Optional - -from pip._vendor import tomli -from pip._vendor.packaging.requirements import InvalidRequirement, Requirement - -from pip._internal.exceptions import ( - InstallationError, - InvalidPyProjectBuildRequires, - MissingPyProjectBuildRequires, -) - - -def _is_list_of_str(obj: Any) -> bool: - return isinstance(obj, list) and all(isinstance(item, str) for item in obj) - - -def make_pyproject_path(unpacked_source_directory: str) -> str: - return os.path.join(unpacked_source_directory, "pyproject.toml") - - -BuildSystemDetails = namedtuple( - "BuildSystemDetails", ["requires", "backend", "check", "backend_path"] -) - - -def load_pyproject_toml( - use_pep517: Optional[bool], pyproject_toml: str, setup_py: str, req_name: str -) -> Optional[BuildSystemDetails]: - """Load the pyproject.toml file. - - Parameters: - use_pep517 - Has the user requested PEP 517 processing? None - means the user hasn't explicitly specified. - pyproject_toml - Location of the project's pyproject.toml file - setup_py - Location of the project's setup.py file - req_name - The name of the requirement we're processing (for - error reporting) - - Returns: - None if we should use the legacy code path, otherwise a tuple - ( - requirements from pyproject.toml, - name of PEP 517 backend, - requirements we should check are installed after setting - up the build environment - directory paths to import the backend from (backend-path), - relative to the project root. - ) - """ - has_pyproject = os.path.isfile(pyproject_toml) - has_setup = os.path.isfile(setup_py) - - if not has_pyproject and not has_setup: - raise InstallationError( - f"{req_name} does not appear to be a Python project: " - f"neither 'setup.py' nor 'pyproject.toml' found." - ) - - if has_pyproject: - with open(pyproject_toml, encoding="utf-8") as f: - pp_toml = tomli.loads(f.read()) - build_system = pp_toml.get("build-system") - else: - build_system = None - - # The following cases must use PEP 517 - # We check for use_pep517 being non-None and falsey because that means - # the user explicitly requested --no-use-pep517. The value 0 as - # opposed to False can occur when the value is provided via an - # environment variable or config file option (due to the quirk of - # strtobool() returning an integer in pip's configuration code). - if has_pyproject and not has_setup: - if use_pep517 is not None and not use_pep517: - raise InstallationError( - "Disabling PEP 517 processing is invalid: " - "project does not have a setup.py" - ) - use_pep517 = True - elif build_system and "build-backend" in build_system: - if use_pep517 is not None and not use_pep517: - raise InstallationError( - "Disabling PEP 517 processing is invalid: " - "project specifies a build backend of {} " - "in pyproject.toml".format(build_system["build-backend"]) - ) - use_pep517 = True - - # If we haven't worked out whether to use PEP 517 yet, - # and the user hasn't explicitly stated a preference, - # we do so if the project has a pyproject.toml file - # or if we cannot import setuptools or wheels. - - # We fallback to PEP 517 when without setuptools or without the wheel package, - # so setuptools can be installed as a default build backend. - # For more info see: - # https://discuss.python.org/t/pip-without-setuptools-could-the-experience-be-improved/11810/9 - # https://github.com/pypa/pip/issues/8559 - elif use_pep517 is None: - use_pep517 = ( - has_pyproject - or not importlib.util.find_spec("setuptools") - or not importlib.util.find_spec("wheel") - ) - - # At this point, we know whether we're going to use PEP 517. - assert use_pep517 is not None - - # If we're using the legacy code path, there is nothing further - # for us to do here. - if not use_pep517: - return None - - if build_system is None: - # Either the user has a pyproject.toml with no build-system - # section, or the user has no pyproject.toml, but has opted in - # explicitly via --use-pep517. - # In the absence of any explicit backend specification, we - # assume the setuptools backend that most closely emulates the - # traditional direct setup.py execution, and require wheel and - # a version of setuptools that supports that backend. - - build_system = { - "requires": ["setuptools>=40.8.0"], - "build-backend": "setuptools.build_meta:__legacy__", - } - - # If we're using PEP 517, we have build system information (either - # from pyproject.toml, or defaulted by the code above). - # Note that at this point, we do not know if the user has actually - # specified a backend, though. - assert build_system is not None - - # Ensure that the build-system section in pyproject.toml conforms - # to PEP 518. - - # Specifying the build-system table but not the requires key is invalid - if "requires" not in build_system: - raise MissingPyProjectBuildRequires(package=req_name) - - # Error out if requires is not a list of strings - requires = build_system["requires"] - if not _is_list_of_str(requires): - raise InvalidPyProjectBuildRequires( - package=req_name, - reason="It is not a list of strings.", - ) - - # Each requirement must be valid as per PEP 508 - for requirement in requires: - try: - Requirement(requirement) - except InvalidRequirement as error: - raise InvalidPyProjectBuildRequires( - package=req_name, - reason=f"It contains an invalid requirement: {requirement!r}", - ) from error - - backend = build_system.get("build-backend") - backend_path = build_system.get("backend-path", []) - check: List[str] = [] - if backend is None: - # If the user didn't specify a backend, we assume they want to use - # the setuptools backend. But we can't be sure they have included - # a version of setuptools which supplies the backend. So we - # make a note to check that this requirement is present once - # we have set up the environment. - # This is quite a lot of work to check for a very specific case. But - # the problem is, that case is potentially quite common - projects that - # adopted PEP 518 early for the ability to specify requirements to - # execute setup.py, but never considered needing to mention the build - # tools themselves. The original PEP 518 code had a similar check (but - # implemented in a different way). - backend = "setuptools.build_meta:__legacy__" - check = ["setuptools>=40.8.0"] - - return BuildSystemDetails(requires, backend, check, backend_path) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/req/__init__.py b/venv/lib/python3.12/site-packages/pip/_internal/req/__init__.py deleted file mode 100644 index 16de903..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/req/__init__.py +++ /dev/null @@ -1,92 +0,0 @@ -import collections -import logging -from typing import Generator, List, Optional, Sequence, Tuple - -from pip._internal.utils.logging import indent_log - -from .req_file import parse_requirements -from .req_install import InstallRequirement -from .req_set import RequirementSet - -__all__ = [ - "RequirementSet", - "InstallRequirement", - "parse_requirements", - "install_given_reqs", -] - -logger = logging.getLogger(__name__) - - -class InstallationResult: - def __init__(self, name: str) -> None: - self.name = name - - def __repr__(self) -> str: - return f"InstallationResult(name={self.name!r})" - - -def _validate_requirements( - requirements: List[InstallRequirement], -) -> Generator[Tuple[str, InstallRequirement], None, None]: - for req in requirements: - assert req.name, f"invalid to-be-installed requirement: {req}" - yield req.name, req - - -def install_given_reqs( - requirements: List[InstallRequirement], - global_options: Sequence[str], - root: Optional[str], - home: Optional[str], - prefix: Optional[str], - warn_script_location: bool, - use_user_site: bool, - pycompile: bool, -) -> List[InstallationResult]: - """ - Install everything in the given list. - - (to be called after having downloaded and unpacked the packages) - """ - to_install = collections.OrderedDict(_validate_requirements(requirements)) - - if to_install: - logger.info( - "Installing collected packages: %s", - ", ".join(to_install.keys()), - ) - - installed = [] - - with indent_log(): - for req_name, requirement in to_install.items(): - if requirement.should_reinstall: - logger.info("Attempting uninstall: %s", req_name) - with indent_log(): - uninstalled_pathset = requirement.uninstall(auto_confirm=True) - else: - uninstalled_pathset = None - - try: - requirement.install( - global_options, - root=root, - home=home, - prefix=prefix, - warn_script_location=warn_script_location, - use_user_site=use_user_site, - pycompile=pycompile, - ) - except Exception: - # if install did not succeed, rollback previous uninstall - if uninstalled_pathset and not requirement.install_succeeded: - uninstalled_pathset.rollback() - raise - else: - if uninstalled_pathset and requirement.install_succeeded: - uninstalled_pathset.commit() - - installed.append(InstallationResult(req_name)) - - return installed diff --git a/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index e1f4ee739b0fa3699ea31aa855da6324143a7841..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3763 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/constructors.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/constructors.cpython-312.pyc deleted file mode 100644 index 4bf4f3a7a3f7159f682adfb92497747e9c254460..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21602 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 T#h0_7u0Wftbz3&X7+3l~Co<GH diff --git a/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_file.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_file.cpython-312.pyc deleted file mode 100644 index 8546e4645adac3ee9a5e702667ca76347a253be1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21481 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 DOOkGx diff --git a/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_install.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_install.cpython-312.pyc deleted file mode 100644 index 472a41a72ead22b48ffeba717e0ffb96a3ea9788..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38434 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 DQHu@D diff --git a/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_set.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_set.cpython-312.pyc deleted file mode 100644 index 77bca4574fcfb51eb13bc464dc32298f7f5463f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7238 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-312.pyc deleted file mode 100644 index 7f452870d290a659bdcea3c13fc5f1b86c3ebc8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32997 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/req/constructors.py b/venv/lib/python3.12/site-packages/pip/_internal/req/constructors.py deleted file mode 100644 index 7e2d0e5..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/req/constructors.py +++ /dev/null @@ -1,576 +0,0 @@ -"""Backing implementation for InstallRequirement's various constructors - -The idea here is that these formed a major chunk of InstallRequirement's size -so, moving them and support code dedicated to them outside of that class -helps creates for better understandability for the rest of the code. - -These are meant to be used elsewhere within pip to create instances of -InstallRequirement. -""" - -import copy -import logging -import os -import re -from typing import Collection, Dict, List, Optional, Set, Tuple, Union - -from pip._vendor.packaging.markers import Marker -from pip._vendor.packaging.requirements import InvalidRequirement, Requirement -from pip._vendor.packaging.specifiers import Specifier - -from pip._internal.exceptions import InstallationError -from pip._internal.models.index import PyPI, TestPyPI -from pip._internal.models.link import Link -from pip._internal.models.wheel import Wheel -from pip._internal.req.req_file import ParsedRequirement -from pip._internal.req.req_install import InstallRequirement -from pip._internal.utils.filetypes import is_archive_file -from pip._internal.utils.misc import is_installable_dir -from pip._internal.utils.packaging import get_requirement -from pip._internal.utils.urls import path_to_url -from pip._internal.vcs import is_url, vcs - -__all__ = [ - "install_req_from_editable", - "install_req_from_line", - "parse_editable", -] - -logger = logging.getLogger(__name__) -operators = Specifier._operators.keys() - - -def _strip_extras(path: str) -> Tuple[str, Optional[str]]: - m = re.match(r"^(.+)(\[[^\]]+\])$", path) - extras = None - if m: - path_no_extras = m.group(1) - extras = m.group(2) - else: - path_no_extras = path - - return path_no_extras, extras - - -def convert_extras(extras: Optional[str]) -> Set[str]: - if not extras: - return set() - return get_requirement("placeholder" + extras.lower()).extras - - -def _set_requirement_extras(req: Requirement, new_extras: Set[str]) -> Requirement: - """ - Returns a new requirement based on the given one, with the supplied extras. If the - given requirement already has extras those are replaced (or dropped if no new extras - are given). - """ - match: Optional[re.Match[str]] = re.fullmatch( - # see https://peps.python.org/pep-0508/#complete-grammar - r"([\w\t .-]+)(\[[^\]]*\])?(.*)", - str(req), - flags=re.ASCII, - ) - # ireq.req is a valid requirement so the regex should always match - assert ( - match is not None - ), f"regex match on requirement {req} failed, this should never happen" - pre: Optional[str] = match.group(1) - post: Optional[str] = match.group(3) - assert ( - pre is not None and post is not None - ), f"regex group selection for requirement {req} failed, this should never happen" - extras: str = "[%s]" % ",".join(sorted(new_extras)) if new_extras else "" - return Requirement(f"{pre}{extras}{post}") - - -def parse_editable(editable_req: str) -> Tuple[Optional[str], str, Set[str]]: - """Parses an editable requirement into: - - a requirement name - - an URL - - extras - - editable options - Accepted requirements: - svn+http://blahblah@rev#egg=Foobar[baz]&subdirectory=version_subdir - .[some_extra] - """ - - url = editable_req - - # If a file path is specified with extras, strip off the extras. - url_no_extras, extras = _strip_extras(url) - - if os.path.isdir(url_no_extras): - # Treating it as code that has already been checked out - url_no_extras = path_to_url(url_no_extras) - - if url_no_extras.lower().startswith("file:"): - package_name = Link(url_no_extras).egg_fragment - if extras: - return ( - package_name, - url_no_extras, - get_requirement("placeholder" + extras.lower()).extras, - ) - else: - return package_name, url_no_extras, set() - - for version_control in vcs: - if url.lower().startswith(f"{version_control}:"): - url = f"{version_control}+{url}" - break - - link = Link(url) - - if not link.is_vcs: - backends = ", ".join(vcs.all_schemes) - raise InstallationError( - f"{editable_req} is not a valid editable requirement. " - f"It should either be a path to a local project or a VCS URL " - f"(beginning with {backends})." - ) - - package_name = link.egg_fragment - if not package_name: - raise InstallationError( - "Could not detect requirement name for '{}', please specify one " - "with #egg=your_package_name".format(editable_req) - ) - return package_name, url, set() - - -def check_first_requirement_in_file(filename: str) -> None: - """Check if file is parsable as a requirements file. - - This is heavily based on ``pkg_resources.parse_requirements``, but - simplified to just check the first meaningful line. - - :raises InvalidRequirement: If the first meaningful line cannot be parsed - as an requirement. - """ - with open(filename, encoding="utf-8", errors="ignore") as f: - # Create a steppable iterator, so we can handle \-continuations. - lines = ( - line - for line in (line.strip() for line in f) - if line and not line.startswith("#") # Skip blank lines/comments. - ) - - for line in lines: - # Drop comments -- a hash without a space may be in a URL. - if " #" in line: - line = line[: line.find(" #")] - # If there is a line continuation, drop it, and append the next line. - if line.endswith("\\"): - line = line[:-2].strip() + next(lines, "") - Requirement(line) - return - - -def deduce_helpful_msg(req: str) -> str: - """Returns helpful msg in case requirements file does not exist, - or cannot be parsed. - - :params req: Requirements file path - """ - if not os.path.exists(req): - return f" File '{req}' does not exist." - msg = " The path does exist. " - # Try to parse and check if it is a requirements file. - try: - check_first_requirement_in_file(req) - except InvalidRequirement: - logger.debug("Cannot parse '%s' as requirements file", req) - else: - msg += ( - f"The argument you provided " - f"({req}) appears to be a" - f" requirements file. If that is the" - f" case, use the '-r' flag to install" - f" the packages specified within it." - ) - return msg - - -class RequirementParts: - def __init__( - self, - requirement: Optional[Requirement], - link: Optional[Link], - markers: Optional[Marker], - extras: Set[str], - ): - self.requirement = requirement - self.link = link - self.markers = markers - self.extras = extras - - -def parse_req_from_editable(editable_req: str) -> RequirementParts: - name, url, extras_override = parse_editable(editable_req) - - if name is not None: - try: - req: Optional[Requirement] = Requirement(name) - except InvalidRequirement: - raise InstallationError(f"Invalid requirement: '{name}'") - else: - req = None - - link = Link(url) - - return RequirementParts(req, link, None, extras_override) - - -# ---- The actual constructors follow ---- - - -def install_req_from_editable( - editable_req: str, - comes_from: Optional[Union[InstallRequirement, str]] = None, - *, - use_pep517: Optional[bool] = None, - isolated: bool = False, - global_options: Optional[List[str]] = None, - hash_options: Optional[Dict[str, List[str]]] = None, - constraint: bool = False, - user_supplied: bool = False, - permit_editable_wheels: bool = False, - config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, -) -> InstallRequirement: - parts = parse_req_from_editable(editable_req) - - return InstallRequirement( - parts.requirement, - comes_from=comes_from, - user_supplied=user_supplied, - editable=True, - permit_editable_wheels=permit_editable_wheels, - link=parts.link, - constraint=constraint, - use_pep517=use_pep517, - isolated=isolated, - global_options=global_options, - hash_options=hash_options, - config_settings=config_settings, - extras=parts.extras, - ) - - -def _looks_like_path(name: str) -> bool: - """Checks whether the string "looks like" a path on the filesystem. - - This does not check whether the target actually exists, only judge from the - appearance. - - Returns true if any of the following conditions is true: - * a path separator is found (either os.path.sep or os.path.altsep); - * a dot is found (which represents the current directory). - """ - if os.path.sep in name: - return True - if os.path.altsep is not None and os.path.altsep in name: - return True - if name.startswith("."): - return True - return False - - -def _get_url_from_path(path: str, name: str) -> Optional[str]: - """ - First, it checks whether a provided path is an installable directory. If it - is, returns the path. - - If false, check if the path is an archive file (such as a .whl). - The function checks if the path is a file. If false, if the path has - an @, it will treat it as a PEP 440 URL requirement and return the path. - """ - if _looks_like_path(name) and os.path.isdir(path): - if is_installable_dir(path): - return path_to_url(path) - # TODO: The is_installable_dir test here might not be necessary - # now that it is done in load_pyproject_toml too. - raise InstallationError( - f"Directory {name!r} is not installable. Neither 'setup.py' " - "nor 'pyproject.toml' found." - ) - if not is_archive_file(path): - return None - if os.path.isfile(path): - return path_to_url(path) - urlreq_parts = name.split("@", 1) - if len(urlreq_parts) >= 2 and not _looks_like_path(urlreq_parts[0]): - # If the path contains '@' and the part before it does not look - # like a path, try to treat it as a PEP 440 URL req instead. - return None - logger.warning( - "Requirement %r looks like a filename, but the file does not exist", - name, - ) - return path_to_url(path) - - -def parse_req_from_line(name: str, line_source: Optional[str]) -> RequirementParts: - if is_url(name): - marker_sep = "; " - else: - marker_sep = ";" - if marker_sep in name: - name, markers_as_string = name.split(marker_sep, 1) - markers_as_string = markers_as_string.strip() - if not markers_as_string: - markers = None - else: - markers = Marker(markers_as_string) - else: - markers = None - name = name.strip() - req_as_string = None - path = os.path.normpath(os.path.abspath(name)) - link = None - extras_as_string = None - - if is_url(name): - link = Link(name) - else: - p, extras_as_string = _strip_extras(path) - url = _get_url_from_path(p, name) - if url is not None: - link = Link(url) - - # it's a local file, dir, or url - if link: - # Handle relative file URLs - if link.scheme == "file" and re.search(r"\.\./", link.url): - link = Link(path_to_url(os.path.normpath(os.path.abspath(link.path)))) - # wheel file - if link.is_wheel: - wheel = Wheel(link.filename) # can raise InvalidWheelFilename - req_as_string = f"{wheel.name}=={wheel.version}" - else: - # set the req to the egg fragment. when it's not there, this - # will become an 'unnamed' requirement - req_as_string = link.egg_fragment - - # a requirement specifier - else: - req_as_string = name - - extras = convert_extras(extras_as_string) - - def with_source(text: str) -> str: - if not line_source: - return text - return f"{text} (from {line_source})" - - def _parse_req_string(req_as_string: str) -> Requirement: - try: - req = get_requirement(req_as_string) - except InvalidRequirement: - if os.path.sep in req_as_string: - add_msg = "It looks like a path." - add_msg += deduce_helpful_msg(req_as_string) - elif "=" in req_as_string and not any( - op in req_as_string for op in operators - ): - add_msg = "= is not a valid operator. Did you mean == ?" - else: - add_msg = "" - msg = with_source(f"Invalid requirement: {req_as_string!r}") - if add_msg: - msg += f"\nHint: {add_msg}" - raise InstallationError(msg) - else: - # Deprecate extras after specifiers: "name>=1.0[extras]" - # This currently works by accident because _strip_extras() parses - # any extras in the end of the string and those are saved in - # RequirementParts - for spec in req.specifier: - spec_str = str(spec) - if spec_str.endswith("]"): - msg = f"Extras after version '{spec_str}'." - raise InstallationError(msg) - return req - - if req_as_string is not None: - req: Optional[Requirement] = _parse_req_string(req_as_string) - else: - req = None - - return RequirementParts(req, link, markers, extras) - - -def install_req_from_line( - name: str, - comes_from: Optional[Union[str, InstallRequirement]] = None, - *, - use_pep517: Optional[bool] = None, - isolated: bool = False, - global_options: Optional[List[str]] = None, - hash_options: Optional[Dict[str, List[str]]] = None, - constraint: bool = False, - line_source: Optional[str] = None, - user_supplied: bool = False, - config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, -) -> InstallRequirement: - """Creates an InstallRequirement from a name, which might be a - requirement, directory containing 'setup.py', filename, or URL. - - :param line_source: An optional string describing where the line is from, - for logging purposes in case of an error. - """ - parts = parse_req_from_line(name, line_source) - - return InstallRequirement( - parts.requirement, - comes_from, - link=parts.link, - markers=parts.markers, - use_pep517=use_pep517, - isolated=isolated, - global_options=global_options, - hash_options=hash_options, - config_settings=config_settings, - constraint=constraint, - extras=parts.extras, - user_supplied=user_supplied, - ) - - -def install_req_from_req_string( - req_string: str, - comes_from: Optional[InstallRequirement] = None, - isolated: bool = False, - use_pep517: Optional[bool] = None, - user_supplied: bool = False, -) -> InstallRequirement: - try: - req = get_requirement(req_string) - except InvalidRequirement: - raise InstallationError(f"Invalid requirement: '{req_string}'") - - domains_not_allowed = [ - PyPI.file_storage_domain, - TestPyPI.file_storage_domain, - ] - if ( - req.url - and comes_from - and comes_from.link - and comes_from.link.netloc in domains_not_allowed - ): - # Explicitly disallow pypi packages that depend on external urls - raise InstallationError( - "Packages installed from PyPI cannot depend on packages " - "which are not also hosted on PyPI.\n" - f"{comes_from.name} depends on {req} " - ) - - return InstallRequirement( - req, - comes_from, - isolated=isolated, - use_pep517=use_pep517, - user_supplied=user_supplied, - ) - - -def install_req_from_parsed_requirement( - parsed_req: ParsedRequirement, - isolated: bool = False, - use_pep517: Optional[bool] = None, - user_supplied: bool = False, - config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, -) -> InstallRequirement: - if parsed_req.is_editable: - req = install_req_from_editable( - parsed_req.requirement, - comes_from=parsed_req.comes_from, - use_pep517=use_pep517, - constraint=parsed_req.constraint, - isolated=isolated, - user_supplied=user_supplied, - config_settings=config_settings, - ) - - else: - req = install_req_from_line( - parsed_req.requirement, - comes_from=parsed_req.comes_from, - use_pep517=use_pep517, - isolated=isolated, - global_options=( - parsed_req.options.get("global_options", []) - if parsed_req.options - else [] - ), - hash_options=( - parsed_req.options.get("hashes", {}) if parsed_req.options else {} - ), - constraint=parsed_req.constraint, - line_source=parsed_req.line_source, - user_supplied=user_supplied, - config_settings=config_settings, - ) - return req - - -def install_req_from_link_and_ireq( - link: Link, ireq: InstallRequirement -) -> InstallRequirement: - return InstallRequirement( - req=ireq.req, - comes_from=ireq.comes_from, - editable=ireq.editable, - link=link, - markers=ireq.markers, - use_pep517=ireq.use_pep517, - isolated=ireq.isolated, - global_options=ireq.global_options, - hash_options=ireq.hash_options, - config_settings=ireq.config_settings, - user_supplied=ireq.user_supplied, - ) - - -def install_req_drop_extras(ireq: InstallRequirement) -> InstallRequirement: - """ - Creates a new InstallationRequirement using the given template but without - any extras. Sets the original requirement as the new one's parent - (comes_from). - """ - return InstallRequirement( - req=( - _set_requirement_extras(ireq.req, set()) if ireq.req is not None else None - ), - comes_from=ireq, - editable=ireq.editable, - link=ireq.link, - markers=ireq.markers, - use_pep517=ireq.use_pep517, - isolated=ireq.isolated, - global_options=ireq.global_options, - hash_options=ireq.hash_options, - constraint=ireq.constraint, - extras=[], - config_settings=ireq.config_settings, - user_supplied=ireq.user_supplied, - permit_editable_wheels=ireq.permit_editable_wheels, - ) - - -def install_req_extend_extras( - ireq: InstallRequirement, - extras: Collection[str], -) -> InstallRequirement: - """ - Returns a copy of an installation requirement with some additional extras. - Makes a shallow copy of the ireq object. - """ - result = copy.copy(ireq) - result.extras = {*ireq.extras, *extras} - result.req = ( - _set_requirement_extras(ireq.req, result.extras) - if ireq.req is not None - else None - ) - return result diff --git a/venv/lib/python3.12/site-packages/pip/_internal/req/req_file.py b/venv/lib/python3.12/site-packages/pip/_internal/req/req_file.py deleted file mode 100644 index 1ef3d5e..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/req/req_file.py +++ /dev/null @@ -1,554 +0,0 @@ -""" -Requirements file parsing -""" - -import logging -import optparse -import os -import re -import shlex -import urllib.parse -from optparse import Values -from typing import ( - TYPE_CHECKING, - Any, - Callable, - Dict, - Generator, - Iterable, - List, - Optional, - Tuple, -) - -from pip._internal.cli import cmdoptions -from pip._internal.exceptions import InstallationError, RequirementsFileParseError -from pip._internal.models.search_scope import SearchScope -from pip._internal.network.session import PipSession -from pip._internal.network.utils import raise_for_status -from pip._internal.utils.encoding import auto_decode -from pip._internal.utils.urls import get_url_scheme - -if TYPE_CHECKING: - # NoReturn introduced in 3.6.2; imported only for type checking to maintain - # pip compatibility with older patch versions of Python 3.6 - from typing import NoReturn - - from pip._internal.index.package_finder import PackageFinder - -__all__ = ["parse_requirements"] - -ReqFileLines = Iterable[Tuple[int, str]] - -LineParser = Callable[[str], Tuple[str, Values]] - -SCHEME_RE = re.compile(r"^(http|https|file):", re.I) -COMMENT_RE = re.compile(r"(^|\s+)#.*$") - -# Matches environment variable-style values in '${MY_VARIABLE_1}' with the -# variable name consisting of only uppercase letters, digits or the '_' -# (underscore). This follows the POSIX standard defined in IEEE Std 1003.1, -# 2013 Edition. -ENV_VAR_RE = re.compile(r"(?P<var>\$\{(?P<name>[A-Z0-9_]+)\})") - -SUPPORTED_OPTIONS: List[Callable[..., optparse.Option]] = [ - cmdoptions.index_url, - cmdoptions.extra_index_url, - cmdoptions.no_index, - cmdoptions.constraints, - cmdoptions.requirements, - cmdoptions.editable, - cmdoptions.find_links, - cmdoptions.no_binary, - cmdoptions.only_binary, - cmdoptions.prefer_binary, - cmdoptions.require_hashes, - cmdoptions.pre, - cmdoptions.trusted_host, - cmdoptions.use_new_feature, -] - -# options to be passed to requirements -SUPPORTED_OPTIONS_REQ: List[Callable[..., optparse.Option]] = [ - cmdoptions.global_options, - cmdoptions.hash, - cmdoptions.config_settings, -] - -SUPPORTED_OPTIONS_EDITABLE_REQ: List[Callable[..., optparse.Option]] = [ - cmdoptions.config_settings, -] - - -# the 'dest' string values -SUPPORTED_OPTIONS_REQ_DEST = [str(o().dest) for o in SUPPORTED_OPTIONS_REQ] -SUPPORTED_OPTIONS_EDITABLE_REQ_DEST = [ - str(o().dest) for o in SUPPORTED_OPTIONS_EDITABLE_REQ -] - -logger = logging.getLogger(__name__) - - -class ParsedRequirement: - def __init__( - self, - requirement: str, - is_editable: bool, - comes_from: str, - constraint: bool, - options: Optional[Dict[str, Any]] = None, - line_source: Optional[str] = None, - ) -> None: - self.requirement = requirement - self.is_editable = is_editable - self.comes_from = comes_from - self.options = options - self.constraint = constraint - self.line_source = line_source - - -class ParsedLine: - def __init__( - self, - filename: str, - lineno: int, - args: str, - opts: Values, - constraint: bool, - ) -> None: - self.filename = filename - self.lineno = lineno - self.opts = opts - self.constraint = constraint - - if args: - self.is_requirement = True - self.is_editable = False - self.requirement = args - elif opts.editables: - self.is_requirement = True - self.is_editable = True - # We don't support multiple -e on one line - self.requirement = opts.editables[0] - else: - self.is_requirement = False - - -def parse_requirements( - filename: str, - session: PipSession, - finder: Optional["PackageFinder"] = None, - options: Optional[optparse.Values] = None, - constraint: bool = False, -) -> Generator[ParsedRequirement, None, None]: - """Parse a requirements file and yield ParsedRequirement instances. - - :param filename: Path or url of requirements file. - :param session: PipSession instance. - :param finder: Instance of pip.index.PackageFinder. - :param options: cli options. - :param constraint: If true, parsing a constraint file rather than - requirements file. - """ - line_parser = get_line_parser(finder) - parser = RequirementsFileParser(session, line_parser) - - for parsed_line in parser.parse(filename, constraint): - parsed_req = handle_line( - parsed_line, options=options, finder=finder, session=session - ) - if parsed_req is not None: - yield parsed_req - - -def preprocess(content: str) -> ReqFileLines: - """Split, filter, and join lines, and return a line iterator - - :param content: the content of the requirements file - """ - lines_enum: ReqFileLines = enumerate(content.splitlines(), start=1) - lines_enum = join_lines(lines_enum) - lines_enum = ignore_comments(lines_enum) - lines_enum = expand_env_variables(lines_enum) - return lines_enum - - -def handle_requirement_line( - line: ParsedLine, - options: Optional[optparse.Values] = None, -) -> ParsedRequirement: - # preserve for the nested code path - line_comes_from = "{} {} (line {})".format( - "-c" if line.constraint else "-r", - line.filename, - line.lineno, - ) - - assert line.is_requirement - - # get the options that apply to requirements - if line.is_editable: - supported_dest = SUPPORTED_OPTIONS_EDITABLE_REQ_DEST - else: - supported_dest = SUPPORTED_OPTIONS_REQ_DEST - req_options = {} - for dest in supported_dest: - if dest in line.opts.__dict__ and line.opts.__dict__[dest]: - req_options[dest] = line.opts.__dict__[dest] - - line_source = f"line {line.lineno} of {line.filename}" - return ParsedRequirement( - requirement=line.requirement, - is_editable=line.is_editable, - comes_from=line_comes_from, - constraint=line.constraint, - options=req_options, - line_source=line_source, - ) - - -def handle_option_line( - opts: Values, - filename: str, - lineno: int, - finder: Optional["PackageFinder"] = None, - options: Optional[optparse.Values] = None, - session: Optional[PipSession] = None, -) -> None: - if opts.hashes: - logger.warning( - "%s line %s has --hash but no requirement, and will be ignored.", - filename, - lineno, - ) - - if options: - # percolate options upward - if opts.require_hashes: - options.require_hashes = opts.require_hashes - if opts.features_enabled: - options.features_enabled.extend( - f for f in opts.features_enabled if f not in options.features_enabled - ) - - # set finder options - if finder: - find_links = finder.find_links - index_urls = finder.index_urls - no_index = finder.search_scope.no_index - if opts.no_index is True: - no_index = True - index_urls = [] - if opts.index_url and not no_index: - index_urls = [opts.index_url] - if opts.extra_index_urls and not no_index: - index_urls.extend(opts.extra_index_urls) - if opts.find_links: - # FIXME: it would be nice to keep track of the source - # of the find_links: support a find-links local path - # relative to a requirements file. - value = opts.find_links[0] - req_dir = os.path.dirname(os.path.abspath(filename)) - relative_to_reqs_file = os.path.join(req_dir, value) - if os.path.exists(relative_to_reqs_file): - value = relative_to_reqs_file - find_links.append(value) - - if session: - # We need to update the auth urls in session - session.update_index_urls(index_urls) - - search_scope = SearchScope( - find_links=find_links, - index_urls=index_urls, - no_index=no_index, - ) - finder.search_scope = search_scope - - if opts.pre: - finder.set_allow_all_prereleases() - - if opts.prefer_binary: - finder.set_prefer_binary() - - if session: - for host in opts.trusted_hosts or []: - source = f"line {lineno} of {filename}" - session.add_trusted_host(host, source=source) - - -def handle_line( - line: ParsedLine, - options: Optional[optparse.Values] = None, - finder: Optional["PackageFinder"] = None, - session: Optional[PipSession] = None, -) -> Optional[ParsedRequirement]: - """Handle a single parsed requirements line; This can result in - creating/yielding requirements, or updating the finder. - - :param line: The parsed line to be processed. - :param options: CLI options. - :param finder: The finder - updated by non-requirement lines. - :param session: The session - updated by non-requirement lines. - - Returns a ParsedRequirement object if the line is a requirement line, - otherwise returns None. - - For lines that contain requirements, the only options that have an effect - are from SUPPORTED_OPTIONS_REQ, and they are scoped to the - requirement. Other options from SUPPORTED_OPTIONS may be present, but are - ignored. - - For lines that do not contain requirements, the only options that have an - effect are from SUPPORTED_OPTIONS. Options from SUPPORTED_OPTIONS_REQ may - be present, but are ignored. These lines may contain multiple options - (although our docs imply only one is supported), and all our parsed and - affect the finder. - """ - - if line.is_requirement: - parsed_req = handle_requirement_line(line, options) - return parsed_req - else: - handle_option_line( - line.opts, - line.filename, - line.lineno, - finder, - options, - session, - ) - return None - - -class RequirementsFileParser: - def __init__( - self, - session: PipSession, - line_parser: LineParser, - ) -> None: - self._session = session - self._line_parser = line_parser - - def parse( - self, filename: str, constraint: bool - ) -> Generator[ParsedLine, None, None]: - """Parse a given file, yielding parsed lines.""" - yield from self._parse_and_recurse(filename, constraint) - - def _parse_and_recurse( - self, filename: str, constraint: bool - ) -> Generator[ParsedLine, None, None]: - for line in self._parse_file(filename, constraint): - if not line.is_requirement and ( - line.opts.requirements or line.opts.constraints - ): - # parse a nested requirements file - if line.opts.requirements: - req_path = line.opts.requirements[0] - nested_constraint = False - else: - req_path = line.opts.constraints[0] - nested_constraint = True - - # original file is over http - if SCHEME_RE.search(filename): - # do a url join so relative paths work - req_path = urllib.parse.urljoin(filename, req_path) - # original file and nested file are paths - elif not SCHEME_RE.search(req_path): - # do a join so relative paths work - req_path = os.path.join( - os.path.dirname(filename), - req_path, - ) - - yield from self._parse_and_recurse(req_path, nested_constraint) - else: - yield line - - def _parse_file( - self, filename: str, constraint: bool - ) -> Generator[ParsedLine, None, None]: - _, content = get_file_content(filename, self._session) - - lines_enum = preprocess(content) - - for line_number, line in lines_enum: - try: - args_str, opts = self._line_parser(line) - except OptionParsingError as e: - # add offending line - msg = f"Invalid requirement: {line}\n{e.msg}" - raise RequirementsFileParseError(msg) - - yield ParsedLine( - filename, - line_number, - args_str, - opts, - constraint, - ) - - -def get_line_parser(finder: Optional["PackageFinder"]) -> LineParser: - def parse_line(line: str) -> Tuple[str, Values]: - # Build new parser for each line since it accumulates appendable - # options. - parser = build_parser() - defaults = parser.get_default_values() - defaults.index_url = None - if finder: - defaults.format_control = finder.format_control - - args_str, options_str = break_args_options(line) - - try: - options = shlex.split(options_str) - except ValueError as e: - raise OptionParsingError(f"Could not split options: {options_str}") from e - - opts, _ = parser.parse_args(options, defaults) - - return args_str, opts - - return parse_line - - -def break_args_options(line: str) -> Tuple[str, str]: - """Break up the line into an args and options string. We only want to shlex - (and then optparse) the options, not the args. args can contain markers - which are corrupted by shlex. - """ - tokens = line.split(" ") - args = [] - options = tokens[:] - for token in tokens: - if token.startswith("-") or token.startswith("--"): - break - else: - args.append(token) - options.pop(0) - return " ".join(args), " ".join(options) - - -class OptionParsingError(Exception): - def __init__(self, msg: str) -> None: - self.msg = msg - - -def build_parser() -> optparse.OptionParser: - """ - Return a parser for parsing requirement lines - """ - parser = optparse.OptionParser(add_help_option=False) - - option_factories = SUPPORTED_OPTIONS + SUPPORTED_OPTIONS_REQ - for option_factory in option_factories: - option = option_factory() - parser.add_option(option) - - # By default optparse sys.exits on parsing errors. We want to wrap - # that in our own exception. - def parser_exit(self: Any, msg: str) -> "NoReturn": - raise OptionParsingError(msg) - - # NOTE: mypy disallows assigning to a method - # https://github.com/python/mypy/issues/2427 - parser.exit = parser_exit # type: ignore - - return parser - - -def join_lines(lines_enum: ReqFileLines) -> ReqFileLines: - """Joins a line ending in '\' with the previous line (except when following - comments). The joined line takes on the index of the first line. - """ - primary_line_number = None - new_line: List[str] = [] - for line_number, line in lines_enum: - if not line.endswith("\\") or COMMENT_RE.match(line): - if COMMENT_RE.match(line): - # this ensures comments are always matched later - line = " " + line - if new_line: - new_line.append(line) - assert primary_line_number is not None - yield primary_line_number, "".join(new_line) - new_line = [] - else: - yield line_number, line - else: - if not new_line: - primary_line_number = line_number - new_line.append(line.strip("\\")) - - # last line contains \ - if new_line: - assert primary_line_number is not None - yield primary_line_number, "".join(new_line) - - # TODO: handle space after '\'. - - -def ignore_comments(lines_enum: ReqFileLines) -> ReqFileLines: - """ - Strips comments and filter empty lines. - """ - for line_number, line in lines_enum: - line = COMMENT_RE.sub("", line) - line = line.strip() - if line: - yield line_number, line - - -def expand_env_variables(lines_enum: ReqFileLines) -> ReqFileLines: - """Replace all environment variables that can be retrieved via `os.getenv`. - - The only allowed format for environment variables defined in the - requirement file is `${MY_VARIABLE_1}` to ensure two things: - - 1. Strings that contain a `$` aren't accidentally (partially) expanded. - 2. Ensure consistency across platforms for requirement files. - - These points are the result of a discussion on the `github pull - request #3514 <https://github.com/pypa/pip/pull/3514>`_. - - Valid characters in variable names follow the `POSIX standard - <http://pubs.opengroup.org/onlinepubs/9699919799/>`_ and are limited - to uppercase letter, digits and the `_` (underscore). - """ - for line_number, line in lines_enum: - for env_var, var_name in ENV_VAR_RE.findall(line): - value = os.getenv(var_name) - if not value: - continue - - line = line.replace(env_var, value) - - yield line_number, line - - -def get_file_content(url: str, session: PipSession) -> Tuple[str, str]: - """Gets the content of a file; it may be a filename, file: URL, or - http: URL. Returns (location, content). Content is unicode. - Respects # -*- coding: declarations on the retrieved files. - - :param url: File path or url. - :param session: PipSession instance. - """ - scheme = get_url_scheme(url) - - # Pip has special support for file:// URLs (LocalFSAdapter). - if scheme in ["http", "https", "file"]: - resp = session.get(url) - raise_for_status(resp) - return resp.url, resp.text - - # Assume this is a bare path. - try: - with open(url, "rb") as f: - content = auto_decode(f.read()) - except OSError as exc: - raise InstallationError(f"Could not open requirements file: {exc}") - return url, content diff --git a/venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py b/venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py deleted file mode 100644 index a65611c..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py +++ /dev/null @@ -1,923 +0,0 @@ -import functools -import logging -import os -import shutil -import sys -import uuid -import zipfile -from optparse import Values -from pathlib import Path -from typing import Any, Collection, Dict, Iterable, List, Optional, Sequence, Union - -from pip._vendor.packaging.markers import Marker -from pip._vendor.packaging.requirements import Requirement -from pip._vendor.packaging.specifiers import SpecifierSet -from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.packaging.version import Version -from pip._vendor.packaging.version import parse as parse_version -from pip._vendor.pyproject_hooks import BuildBackendHookCaller - -from pip._internal.build_env import BuildEnvironment, NoOpBuildEnvironment -from pip._internal.exceptions import InstallationError, PreviousBuildDirError -from pip._internal.locations import get_scheme -from pip._internal.metadata import ( - BaseDistribution, - get_default_environment, - get_directory_distribution, - get_wheel_distribution, -) -from pip._internal.metadata.base import FilesystemWheel -from pip._internal.models.direct_url import DirectUrl -from pip._internal.models.link import Link -from pip._internal.operations.build.metadata import generate_metadata -from pip._internal.operations.build.metadata_editable import generate_editable_metadata -from pip._internal.operations.build.metadata_legacy import ( - generate_metadata as generate_metadata_legacy, -) -from pip._internal.operations.install.editable_legacy import ( - install_editable as install_editable_legacy, -) -from pip._internal.operations.install.wheel import install_wheel -from pip._internal.pyproject import load_pyproject_toml, make_pyproject_path -from pip._internal.req.req_uninstall import UninstallPathSet -from pip._internal.utils.deprecation import deprecated -from pip._internal.utils.hashes import Hashes -from pip._internal.utils.misc import ( - ConfiguredBuildBackendHookCaller, - ask_path_exists, - backup_dir, - display_path, - hide_url, - is_installable_dir, - redact_auth_from_requirement, - redact_auth_from_url, -) -from pip._internal.utils.packaging import safe_extra -from pip._internal.utils.subprocess import runner_with_spinner_message -from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds -from pip._internal.utils.unpacking import unpack_file -from pip._internal.utils.virtualenv import running_under_virtualenv -from pip._internal.vcs import vcs - -logger = logging.getLogger(__name__) - - -class InstallRequirement: - """ - Represents something that may be installed later on, may have information - about where to fetch the relevant requirement and also contains logic for - installing the said requirement. - """ - - def __init__( - self, - req: Optional[Requirement], - comes_from: Optional[Union[str, "InstallRequirement"]], - editable: bool = False, - link: Optional[Link] = None, - markers: Optional[Marker] = None, - use_pep517: Optional[bool] = None, - isolated: bool = False, - *, - global_options: Optional[List[str]] = None, - hash_options: Optional[Dict[str, List[str]]] = None, - config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, - constraint: bool = False, - extras: Collection[str] = (), - user_supplied: bool = False, - permit_editable_wheels: bool = False, - ) -> None: - assert req is None or isinstance(req, Requirement), req - self.req = req - self.comes_from = comes_from - self.constraint = constraint - self.editable = editable - self.permit_editable_wheels = permit_editable_wheels - - # source_dir is the local directory where the linked requirement is - # located, or unpacked. In case unpacking is needed, creating and - # populating source_dir is done by the RequirementPreparer. Note this - # is not necessarily the directory where pyproject.toml or setup.py is - # located - that one is obtained via unpacked_source_directory. - self.source_dir: Optional[str] = None - if self.editable: - assert link - if link.is_file: - self.source_dir = os.path.normpath(os.path.abspath(link.file_path)) - - # original_link is the direct URL that was provided by the user for the - # requirement, either directly or via a constraints file. - if link is None and req and req.url: - # PEP 508 URL requirement - link = Link(req.url) - self.link = self.original_link = link - - # When this InstallRequirement is a wheel obtained from the cache of locally - # built wheels, this is the source link corresponding to the cache entry, which - # was used to download and build the cached wheel. - self.cached_wheel_source_link: Optional[Link] = None - - # Information about the location of the artifact that was downloaded . This - # property is guaranteed to be set in resolver results. - self.download_info: Optional[DirectUrl] = None - - # Path to any downloaded or already-existing package. - self.local_file_path: Optional[str] = None - if self.link and self.link.is_file: - self.local_file_path = self.link.file_path - - if extras: - self.extras = extras - elif req: - self.extras = req.extras - else: - self.extras = set() - if markers is None and req: - markers = req.marker - self.markers = markers - - # This holds the Distribution object if this requirement is already installed. - self.satisfied_by: Optional[BaseDistribution] = None - # Whether the installation process should try to uninstall an existing - # distribution before installing this requirement. - self.should_reinstall = False - # Temporary build location - self._temp_build_dir: Optional[TempDirectory] = None - # Set to True after successful installation - self.install_succeeded: Optional[bool] = None - # Supplied options - self.global_options = global_options if global_options else [] - self.hash_options = hash_options if hash_options else {} - self.config_settings = config_settings - # Set to True after successful preparation of this requirement - self.prepared = False - # User supplied requirement are explicitly requested for installation - # by the user via CLI arguments or requirements files, as opposed to, - # e.g. dependencies, extras or constraints. - self.user_supplied = user_supplied - - self.isolated = isolated - self.build_env: BuildEnvironment = NoOpBuildEnvironment() - - # For PEP 517, the directory where we request the project metadata - # gets stored. We need this to pass to build_wheel, so the backend - # can ensure that the wheel matches the metadata (see the PEP for - # details). - self.metadata_directory: Optional[str] = None - - # The static build requirements (from pyproject.toml) - self.pyproject_requires: Optional[List[str]] = None - - # Build requirements that we will check are available - self.requirements_to_check: List[str] = [] - - # The PEP 517 backend we should use to build the project - self.pep517_backend: Optional[BuildBackendHookCaller] = None - - # Are we using PEP 517 for this requirement? - # After pyproject.toml has been loaded, the only valid values are True - # and False. Before loading, None is valid (meaning "use the default"). - # Setting an explicit value before loading pyproject.toml is supported, - # but after loading this flag should be treated as read only. - self.use_pep517 = use_pep517 - - # If config settings are provided, enforce PEP 517. - if self.config_settings: - if self.use_pep517 is False: - logger.warning( - "--no-use-pep517 ignored for %s " - "because --config-settings are specified.", - self, - ) - self.use_pep517 = True - - # This requirement needs more preparation before it can be built - self.needs_more_preparation = False - - # This requirement needs to be unpacked before it can be installed. - self._archive_source: Optional[Path] = None - - def __str__(self) -> str: - if self.req: - s = redact_auth_from_requirement(self.req) - if self.link: - s += f" from {redact_auth_from_url(self.link.url)}" - elif self.link: - s = redact_auth_from_url(self.link.url) - else: - s = "<InstallRequirement>" - if self.satisfied_by is not None: - if self.satisfied_by.location is not None: - location = display_path(self.satisfied_by.location) - else: - location = "<memory>" - s += f" in {location}" - if self.comes_from: - if isinstance(self.comes_from, str): - comes_from: Optional[str] = self.comes_from - else: - comes_from = self.comes_from.from_path() - if comes_from: - s += f" (from {comes_from})" - return s - - def __repr__(self) -> str: - return "<{} object: {} editable={!r}>".format( - self.__class__.__name__, str(self), self.editable - ) - - def format_debug(self) -> str: - """An un-tested helper for getting state, for debugging.""" - attributes = vars(self) - names = sorted(attributes) - - state = (f"{attr}={attributes[attr]!r}" for attr in sorted(names)) - return "<{name} object: {{{state}}}>".format( - name=self.__class__.__name__, - state=", ".join(state), - ) - - # Things that are valid for all kinds of requirements? - @property - def name(self) -> Optional[str]: - if self.req is None: - return None - return self.req.name - - @functools.lru_cache() # use cached_property in python 3.8+ - def supports_pyproject_editable(self) -> bool: - if not self.use_pep517: - return False - assert self.pep517_backend - with self.build_env: - runner = runner_with_spinner_message( - "Checking if build backend supports build_editable" - ) - with self.pep517_backend.subprocess_runner(runner): - return "build_editable" in self.pep517_backend._supported_features() - - @property - def specifier(self) -> SpecifierSet: - assert self.req is not None - return self.req.specifier - - @property - def is_direct(self) -> bool: - """Whether this requirement was specified as a direct URL.""" - return self.original_link is not None - - @property - def is_pinned(self) -> bool: - """Return whether I am pinned to an exact version. - - For example, some-package==1.2 is pinned; some-package>1.2 is not. - """ - assert self.req is not None - specifiers = self.req.specifier - return len(specifiers) == 1 and next(iter(specifiers)).operator in {"==", "==="} - - def match_markers(self, extras_requested: Optional[Iterable[str]] = None) -> bool: - if not extras_requested: - # Provide an extra to safely evaluate the markers - # without matching any extra - extras_requested = ("",) - if self.markers is not None: - return any( - self.markers.evaluate({"extra": extra}) - # TODO: Remove these two variants when packaging is upgraded to - # support the marker comparison logic specified in PEP 685. - or self.markers.evaluate({"extra": safe_extra(extra)}) - or self.markers.evaluate({"extra": canonicalize_name(extra)}) - for extra in extras_requested - ) - else: - return True - - @property - def has_hash_options(self) -> bool: - """Return whether any known-good hashes are specified as options. - - These activate --require-hashes mode; hashes specified as part of a - URL do not. - - """ - return bool(self.hash_options) - - def hashes(self, trust_internet: bool = True) -> Hashes: - """Return a hash-comparer that considers my option- and URL-based - hashes to be known-good. - - Hashes in URLs--ones embedded in the requirements file, not ones - downloaded from an index server--are almost peers with ones from - flags. They satisfy --require-hashes (whether it was implicitly or - explicitly activated) but do not activate it. md5 and sha224 are not - allowed in flags, which should nudge people toward good algos. We - always OR all hashes together, even ones from URLs. - - :param trust_internet: Whether to trust URL-based (#md5=...) hashes - downloaded from the internet, as by populate_link() - - """ - good_hashes = self.hash_options.copy() - if trust_internet: - link = self.link - elif self.is_direct and self.user_supplied: - link = self.original_link - else: - link = None - if link and link.hash: - assert link.hash_name is not None - good_hashes.setdefault(link.hash_name, []).append(link.hash) - return Hashes(good_hashes) - - def from_path(self) -> Optional[str]: - """Format a nice indicator to show where this "comes from" """ - if self.req is None: - return None - s = str(self.req) - if self.comes_from: - comes_from: Optional[str] - if isinstance(self.comes_from, str): - comes_from = self.comes_from - else: - comes_from = self.comes_from.from_path() - if comes_from: - s += "->" + comes_from - return s - - def ensure_build_location( - self, build_dir: str, autodelete: bool, parallel_builds: bool - ) -> str: - assert build_dir is not None - if self._temp_build_dir is not None: - assert self._temp_build_dir.path - return self._temp_build_dir.path - if self.req is None: - # Some systems have /tmp as a symlink which confuses custom - # builds (such as numpy). Thus, we ensure that the real path - # is returned. - self._temp_build_dir = TempDirectory( - kind=tempdir_kinds.REQ_BUILD, globally_managed=True - ) - - return self._temp_build_dir.path - - # This is the only remaining place where we manually determine the path - # for the temporary directory. It is only needed for editables where - # it is the value of the --src option. - - # When parallel builds are enabled, add a UUID to the build directory - # name so multiple builds do not interfere with each other. - dir_name: str = canonicalize_name(self.req.name) - if parallel_builds: - dir_name = f"{dir_name}_{uuid.uuid4().hex}" - - # FIXME: Is there a better place to create the build_dir? (hg and bzr - # need this) - if not os.path.exists(build_dir): - logger.debug("Creating directory %s", build_dir) - os.makedirs(build_dir) - actual_build_dir = os.path.join(build_dir, dir_name) - # `None` indicates that we respect the globally-configured deletion - # settings, which is what we actually want when auto-deleting. - delete_arg = None if autodelete else False - return TempDirectory( - path=actual_build_dir, - delete=delete_arg, - kind=tempdir_kinds.REQ_BUILD, - globally_managed=True, - ).path - - def _set_requirement(self) -> None: - """Set requirement after generating metadata.""" - assert self.req is None - assert self.metadata is not None - assert self.source_dir is not None - - # Construct a Requirement object from the generated metadata - if isinstance(parse_version(self.metadata["Version"]), Version): - op = "==" - else: - op = "===" - - self.req = Requirement( - "".join( - [ - self.metadata["Name"], - op, - self.metadata["Version"], - ] - ) - ) - - def warn_on_mismatching_name(self) -> None: - assert self.req is not None - metadata_name = canonicalize_name(self.metadata["Name"]) - if canonicalize_name(self.req.name) == metadata_name: - # Everything is fine. - return - - # If we're here, there's a mismatch. Log a warning about it. - logger.warning( - "Generating metadata for package %s " - "produced metadata for project name %s. Fix your " - "#egg=%s fragments.", - self.name, - metadata_name, - self.name, - ) - self.req = Requirement(metadata_name) - - def check_if_exists(self, use_user_site: bool) -> None: - """Find an installed distribution that satisfies or conflicts - with this requirement, and set self.satisfied_by or - self.should_reinstall appropriately. - """ - if self.req is None: - return - existing_dist = get_default_environment().get_distribution(self.req.name) - if not existing_dist: - return - - version_compatible = self.req.specifier.contains( - existing_dist.version, - prereleases=True, - ) - if not version_compatible: - self.satisfied_by = None - if use_user_site: - if existing_dist.in_usersite: - self.should_reinstall = True - elif running_under_virtualenv() and existing_dist.in_site_packages: - raise InstallationError( - f"Will not install to the user site because it will " - f"lack sys.path precedence to {existing_dist.raw_name} " - f"in {existing_dist.location}" - ) - else: - self.should_reinstall = True - else: - if self.editable: - self.should_reinstall = True - # when installing editables, nothing pre-existing should ever - # satisfy - self.satisfied_by = None - else: - self.satisfied_by = existing_dist - - # Things valid for wheels - @property - def is_wheel(self) -> bool: - if not self.link: - return False - return self.link.is_wheel - - @property - def is_wheel_from_cache(self) -> bool: - # When True, it means that this InstallRequirement is a local wheel file in the - # cache of locally built wheels. - return self.cached_wheel_source_link is not None - - # Things valid for sdists - @property - def unpacked_source_directory(self) -> str: - assert self.source_dir, f"No source dir for {self}" - return os.path.join( - self.source_dir, self.link and self.link.subdirectory_fragment or "" - ) - - @property - def setup_py_path(self) -> str: - assert self.source_dir, f"No source dir for {self}" - setup_py = os.path.join(self.unpacked_source_directory, "setup.py") - - return setup_py - - @property - def setup_cfg_path(self) -> str: - assert self.source_dir, f"No source dir for {self}" - setup_cfg = os.path.join(self.unpacked_source_directory, "setup.cfg") - - return setup_cfg - - @property - def pyproject_toml_path(self) -> str: - assert self.source_dir, f"No source dir for {self}" - return make_pyproject_path(self.unpacked_source_directory) - - def load_pyproject_toml(self) -> None: - """Load the pyproject.toml file. - - After calling this routine, all of the attributes related to PEP 517 - processing for this requirement have been set. In particular, the - use_pep517 attribute can be used to determine whether we should - follow the PEP 517 or legacy (setup.py) code path. - """ - pyproject_toml_data = load_pyproject_toml( - self.use_pep517, self.pyproject_toml_path, self.setup_py_path, str(self) - ) - - if pyproject_toml_data is None: - assert not self.config_settings - self.use_pep517 = False - return - - self.use_pep517 = True - requires, backend, check, backend_path = pyproject_toml_data - self.requirements_to_check = check - self.pyproject_requires = requires - self.pep517_backend = ConfiguredBuildBackendHookCaller( - self, - self.unpacked_source_directory, - backend, - backend_path=backend_path, - ) - - def isolated_editable_sanity_check(self) -> None: - """Check that an editable requirement if valid for use with PEP 517/518. - - This verifies that an editable that has a pyproject.toml either supports PEP 660 - or as a setup.py or a setup.cfg - """ - if ( - self.editable - and self.use_pep517 - and not self.supports_pyproject_editable() - and not os.path.isfile(self.setup_py_path) - and not os.path.isfile(self.setup_cfg_path) - ): - raise InstallationError( - f"Project {self} has a 'pyproject.toml' and its build " - f"backend is missing the 'build_editable' hook. Since it does not " - f"have a 'setup.py' nor a 'setup.cfg', " - f"it cannot be installed in editable mode. " - f"Consider using a build backend that supports PEP 660." - ) - - def prepare_metadata(self) -> None: - """Ensure that project metadata is available. - - Under PEP 517 and PEP 660, call the backend hook to prepare the metadata. - Under legacy processing, call setup.py egg-info. - """ - assert self.source_dir, f"No source dir for {self}" - details = self.name or f"from {self.link}" - - if self.use_pep517: - assert self.pep517_backend is not None - if ( - self.editable - and self.permit_editable_wheels - and self.supports_pyproject_editable() - ): - self.metadata_directory = generate_editable_metadata( - build_env=self.build_env, - backend=self.pep517_backend, - details=details, - ) - else: - self.metadata_directory = generate_metadata( - build_env=self.build_env, - backend=self.pep517_backend, - details=details, - ) - else: - self.metadata_directory = generate_metadata_legacy( - build_env=self.build_env, - setup_py_path=self.setup_py_path, - source_dir=self.unpacked_source_directory, - isolated=self.isolated, - details=details, - ) - - # Act on the newly generated metadata, based on the name and version. - if not self.name: - self._set_requirement() - else: - self.warn_on_mismatching_name() - - self.assert_source_matches_version() - - @property - def metadata(self) -> Any: - if not hasattr(self, "_metadata"): - self._metadata = self.get_dist().metadata - - return self._metadata - - def get_dist(self) -> BaseDistribution: - if self.metadata_directory: - return get_directory_distribution(self.metadata_directory) - elif self.local_file_path and self.is_wheel: - assert self.req is not None - return get_wheel_distribution( - FilesystemWheel(self.local_file_path), - canonicalize_name(self.req.name), - ) - raise AssertionError( - f"InstallRequirement {self} has no metadata directory and no wheel: " - f"can't make a distribution." - ) - - def assert_source_matches_version(self) -> None: - assert self.source_dir, f"No source dir for {self}" - version = self.metadata["version"] - if self.req and self.req.specifier and version not in self.req.specifier: - logger.warning( - "Requested %s, but installing version %s", - self, - version, - ) - else: - logger.debug( - "Source in %s has version %s, which satisfies requirement %s", - display_path(self.source_dir), - version, - self, - ) - - # For both source distributions and editables - def ensure_has_source_dir( - self, - parent_dir: str, - autodelete: bool = False, - parallel_builds: bool = False, - ) -> None: - """Ensure that a source_dir is set. - - This will create a temporary build dir if the name of the requirement - isn't known yet. - - :param parent_dir: The ideal pip parent_dir for the source_dir. - Generally src_dir for editables and build_dir for sdists. - :return: self.source_dir - """ - if self.source_dir is None: - self.source_dir = self.ensure_build_location( - parent_dir, - autodelete=autodelete, - parallel_builds=parallel_builds, - ) - - def needs_unpacked_archive(self, archive_source: Path) -> None: - assert self._archive_source is None - self._archive_source = archive_source - - def ensure_pristine_source_checkout(self) -> None: - """Ensure the source directory has not yet been built in.""" - assert self.source_dir is not None - if self._archive_source is not None: - unpack_file(str(self._archive_source), self.source_dir) - elif is_installable_dir(self.source_dir): - # If a checkout exists, it's unwise to keep going. - # version inconsistencies are logged later, but do not fail - # the installation. - raise PreviousBuildDirError( - f"pip can't proceed with requirements '{self}' due to a " - f"pre-existing build directory ({self.source_dir}). This is likely " - "due to a previous installation that failed . pip is " - "being responsible and not assuming it can delete this. " - "Please delete it and try again." - ) - - # For editable installations - def update_editable(self) -> None: - if not self.link: - logger.debug( - "Cannot update repository at %s; repository location is unknown", - self.source_dir, - ) - return - assert self.editable - assert self.source_dir - if self.link.scheme == "file": - # Static paths don't get updated - return - vcs_backend = vcs.get_backend_for_scheme(self.link.scheme) - # Editable requirements are validated in Requirement constructors. - # So here, if it's neither a path nor a valid VCS URL, it's a bug. - assert vcs_backend, f"Unsupported VCS URL {self.link.url}" - hidden_url = hide_url(self.link.url) - vcs_backend.obtain(self.source_dir, url=hidden_url, verbosity=0) - - # Top-level Actions - def uninstall( - self, auto_confirm: bool = False, verbose: bool = False - ) -> Optional[UninstallPathSet]: - """ - Uninstall the distribution currently satisfying this requirement. - - Prompts before removing or modifying files unless - ``auto_confirm`` is True. - - Refuses to delete or modify files outside of ``sys.prefix`` - - thus uninstallation within a virtual environment can only - modify that virtual environment, even if the virtualenv is - linked to global site-packages. - - """ - assert self.req - dist = get_default_environment().get_distribution(self.req.name) - if not dist: - logger.warning("Skipping %s as it is not installed.", self.name) - return None - logger.info("Found existing installation: %s", dist) - - uninstalled_pathset = UninstallPathSet.from_dist(dist) - uninstalled_pathset.remove(auto_confirm, verbose) - return uninstalled_pathset - - def _get_archive_name(self, path: str, parentdir: str, rootdir: str) -> str: - def _clean_zip_name(name: str, prefix: str) -> str: - assert name.startswith( - prefix + os.path.sep - ), f"name {name!r} doesn't start with prefix {prefix!r}" - name = name[len(prefix) + 1 :] - name = name.replace(os.path.sep, "/") - return name - - assert self.req is not None - path = os.path.join(parentdir, path) - name = _clean_zip_name(path, rootdir) - return self.req.name + "/" + name - - def archive(self, build_dir: Optional[str]) -> None: - """Saves archive to provided build_dir. - - Used for saving downloaded VCS requirements as part of `pip download`. - """ - assert self.source_dir - if build_dir is None: - return - - create_archive = True - archive_name = "{}-{}.zip".format(self.name, self.metadata["version"]) - archive_path = os.path.join(build_dir, archive_name) - - if os.path.exists(archive_path): - response = ask_path_exists( - f"The file {display_path(archive_path)} exists. (i)gnore, (w)ipe, " - "(b)ackup, (a)bort ", - ("i", "w", "b", "a"), - ) - if response == "i": - create_archive = False - elif response == "w": - logger.warning("Deleting %s", display_path(archive_path)) - os.remove(archive_path) - elif response == "b": - dest_file = backup_dir(archive_path) - logger.warning( - "Backing up %s to %s", - display_path(archive_path), - display_path(dest_file), - ) - shutil.move(archive_path, dest_file) - elif response == "a": - sys.exit(-1) - - if not create_archive: - return - - zip_output = zipfile.ZipFile( - archive_path, - "w", - zipfile.ZIP_DEFLATED, - allowZip64=True, - ) - with zip_output: - dir = os.path.normcase(os.path.abspath(self.unpacked_source_directory)) - for dirpath, dirnames, filenames in os.walk(dir): - for dirname in dirnames: - dir_arcname = self._get_archive_name( - dirname, - parentdir=dirpath, - rootdir=dir, - ) - zipdir = zipfile.ZipInfo(dir_arcname + "/") - zipdir.external_attr = 0x1ED << 16 # 0o755 - zip_output.writestr(zipdir, "") - for filename in filenames: - file_arcname = self._get_archive_name( - filename, - parentdir=dirpath, - rootdir=dir, - ) - filename = os.path.join(dirpath, filename) - zip_output.write(filename, file_arcname) - - logger.info("Saved %s", display_path(archive_path)) - - def install( - self, - global_options: Optional[Sequence[str]] = None, - root: Optional[str] = None, - home: Optional[str] = None, - prefix: Optional[str] = None, - warn_script_location: bool = True, - use_user_site: bool = False, - pycompile: bool = True, - ) -> None: - assert self.req is not None - scheme = get_scheme( - self.req.name, - user=use_user_site, - home=home, - root=root, - isolated=self.isolated, - prefix=prefix, - ) - - if self.editable and not self.is_wheel: - if self.config_settings: - logger.warning( - "--config-settings ignored for legacy editable install of %s. " - "Consider upgrading to a version of setuptools " - "that supports PEP 660 (>= 64).", - self, - ) - install_editable_legacy( - global_options=global_options if global_options is not None else [], - prefix=prefix, - home=home, - use_user_site=use_user_site, - name=self.req.name, - setup_py_path=self.setup_py_path, - isolated=self.isolated, - build_env=self.build_env, - unpacked_source_directory=self.unpacked_source_directory, - ) - self.install_succeeded = True - return - - assert self.is_wheel - assert self.local_file_path - - install_wheel( - self.req.name, - self.local_file_path, - scheme=scheme, - req_description=str(self.req), - pycompile=pycompile, - warn_script_location=warn_script_location, - direct_url=self.download_info if self.is_direct else None, - requested=self.user_supplied, - ) - self.install_succeeded = True - - -def check_invalid_constraint_type(req: InstallRequirement) -> str: - # Check for unsupported forms - problem = "" - if not req.name: - problem = "Unnamed requirements are not allowed as constraints" - elif req.editable: - problem = "Editable requirements are not allowed as constraints" - elif req.extras: - problem = "Constraints cannot have extras" - - if problem: - deprecated( - reason=( - "Constraints are only allowed to take the form of a package " - "name and a version specifier. Other forms were originally " - "permitted as an accident of the implementation, but were " - "undocumented. The new implementation of the resolver no " - "longer supports these forms." - ), - replacement="replacing the constraint with a requirement", - # No plan yet for when the new resolver becomes default - gone_in=None, - issue=8210, - ) - - return problem - - -def _has_option(options: Values, reqs: List[InstallRequirement], option: str) -> bool: - if getattr(options, option, None): - return True - for req in reqs: - if getattr(req, option, None): - return True - return False - - -def check_legacy_setup_py_options( - options: Values, - reqs: List[InstallRequirement], -) -> None: - has_build_options = _has_option(options, reqs, "build_options") - has_global_options = _has_option(options, reqs, "global_options") - if has_build_options or has_global_options: - deprecated( - reason="--build-option and --global-option are deprecated.", - issue=11859, - replacement="to use --config-settings", - gone_in="24.2", - ) - logger.warning( - "Implying --no-binary=:all: due to the presence of " - "--build-option / --global-option. " - ) - options.format_control.disallow_binaries() diff --git a/venv/lib/python3.12/site-packages/pip/_internal/req/req_set.py b/venv/lib/python3.12/site-packages/pip/_internal/req/req_set.py deleted file mode 100644 index bf36114..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/req/req_set.py +++ /dev/null @@ -1,119 +0,0 @@ -import logging -from collections import OrderedDict -from typing import Dict, List - -from pip._vendor.packaging.specifiers import LegacySpecifier -from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.packaging.version import LegacyVersion - -from pip._internal.req.req_install import InstallRequirement -from pip._internal.utils.deprecation import deprecated - -logger = logging.getLogger(__name__) - - -class RequirementSet: - def __init__(self, check_supported_wheels: bool = True) -> None: - """Create a RequirementSet.""" - - self.requirements: Dict[str, InstallRequirement] = OrderedDict() - self.check_supported_wheels = check_supported_wheels - - self.unnamed_requirements: List[InstallRequirement] = [] - - def __str__(self) -> str: - requirements = sorted( - (req for req in self.requirements.values() if not req.comes_from), - key=lambda req: canonicalize_name(req.name or ""), - ) - return " ".join(str(req.req) for req in requirements) - - def __repr__(self) -> str: - requirements = sorted( - self.requirements.values(), - key=lambda req: canonicalize_name(req.name or ""), - ) - - format_string = "<{classname} object; {count} requirement(s): {reqs}>" - return format_string.format( - classname=self.__class__.__name__, - count=len(requirements), - reqs=", ".join(str(req.req) for req in requirements), - ) - - def add_unnamed_requirement(self, install_req: InstallRequirement) -> None: - assert not install_req.name - self.unnamed_requirements.append(install_req) - - def add_named_requirement(self, install_req: InstallRequirement) -> None: - assert install_req.name - - project_name = canonicalize_name(install_req.name) - self.requirements[project_name] = install_req - - def has_requirement(self, name: str) -> bool: - project_name = canonicalize_name(name) - - return ( - project_name in self.requirements - and not self.requirements[project_name].constraint - ) - - def get_requirement(self, name: str) -> InstallRequirement: - project_name = canonicalize_name(name) - - if project_name in self.requirements: - return self.requirements[project_name] - - raise KeyError(f"No project with the name {name!r}") - - @property - def all_requirements(self) -> List[InstallRequirement]: - return self.unnamed_requirements + list(self.requirements.values()) - - @property - def requirements_to_install(self) -> List[InstallRequirement]: - """Return the list of requirements that need to be installed. - - TODO remove this property together with the legacy resolver, since the new - resolver only returns requirements that need to be installed. - """ - return [ - install_req - for install_req in self.all_requirements - if not install_req.constraint and not install_req.satisfied_by - ] - - def warn_legacy_versions_and_specifiers(self) -> None: - for req in self.requirements_to_install: - version = req.get_dist().version - if isinstance(version, LegacyVersion): - deprecated( - reason=( - f"pip has selected the non standard version {version} " - f"of {req}. In the future this version will be " - f"ignored as it isn't standard compliant." - ), - replacement=( - "set or update constraints to select another version " - "or contact the package author to fix the version number" - ), - issue=12063, - gone_in="24.1", - ) - for dep in req.get_dist().iter_dependencies(): - if any(isinstance(spec, LegacySpecifier) for spec in dep.specifier): - deprecated( - reason=( - f"pip has selected {req} {version} which has non " - f"standard dependency specifier {dep}. " - f"In the future this version of {req} will be " - f"ignored as it isn't standard compliant." - ), - replacement=( - "set or update constraints to select another version " - "or contact the package author to fix the version number" - ), - issue=12063, - gone_in="24.1", - ) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py b/venv/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py deleted file mode 100644 index 707fde1..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py +++ /dev/null @@ -1,649 +0,0 @@ -import functools -import os -import sys -import sysconfig -from importlib.util import cache_from_source -from typing import Any, Callable, Dict, Generator, Iterable, List, Optional, Set, Tuple - -from pip._internal.exceptions import UninstallationError -from pip._internal.locations import get_bin_prefix, get_bin_user -from pip._internal.metadata import BaseDistribution -from pip._internal.utils.compat import WINDOWS -from pip._internal.utils.egg_link import egg_link_path_from_location -from pip._internal.utils.logging import getLogger, indent_log -from pip._internal.utils.misc import ask, normalize_path, renames, rmtree -from pip._internal.utils.temp_dir import AdjacentTempDirectory, TempDirectory -from pip._internal.utils.virtualenv import running_under_virtualenv - -logger = getLogger(__name__) - - -def _script_names( - bin_dir: str, script_name: str, is_gui: bool -) -> Generator[str, None, None]: - """Create the fully qualified name of the files created by - {console,gui}_scripts for the given ``dist``. - Returns the list of file names - """ - exe_name = os.path.join(bin_dir, script_name) - yield exe_name - if not WINDOWS: - return - yield f"{exe_name}.exe" - yield f"{exe_name}.exe.manifest" - if is_gui: - yield f"{exe_name}-script.pyw" - else: - yield f"{exe_name}-script.py" - - -def _unique( - fn: Callable[..., Generator[Any, None, None]] -) -> Callable[..., Generator[Any, None, None]]: - @functools.wraps(fn) - def unique(*args: Any, **kw: Any) -> Generator[Any, None, None]: - seen: Set[Any] = set() - for item in fn(*args, **kw): - if item not in seen: - seen.add(item) - yield item - - return unique - - -@_unique -def uninstallation_paths(dist: BaseDistribution) -> Generator[str, None, None]: - """ - Yield all the uninstallation paths for dist based on RECORD-without-.py[co] - - Yield paths to all the files in RECORD. For each .py file in RECORD, add - the .pyc and .pyo in the same directory. - - UninstallPathSet.add() takes care of the __pycache__ .py[co]. - - If RECORD is not found, raises UninstallationError, - with possible information from the INSTALLER file. - - https://packaging.python.org/specifications/recording-installed-packages/ - """ - location = dist.location - assert location is not None, "not installed" - - entries = dist.iter_declared_entries() - if entries is None: - msg = f"Cannot uninstall {dist}, RECORD file not found." - installer = dist.installer - if not installer or installer == "pip": - dep = f"{dist.raw_name}=={dist.version}" - msg += ( - " You might be able to recover from this via: " - f"'pip install --force-reinstall --no-deps {dep}'." - ) - else: - msg += f" Hint: The package was installed by {installer}." - raise UninstallationError(msg) - - for entry in entries: - path = os.path.join(location, entry) - yield path - if path.endswith(".py"): - dn, fn = os.path.split(path) - base = fn[:-3] - path = os.path.join(dn, base + ".pyc") - yield path - path = os.path.join(dn, base + ".pyo") - yield path - - -def compact(paths: Iterable[str]) -> Set[str]: - """Compact a path set to contain the minimal number of paths - necessary to contain all paths in the set. If /a/path/ and - /a/path/to/a/file.txt are both in the set, leave only the - shorter path.""" - - sep = os.path.sep - short_paths: Set[str] = set() - for path in sorted(paths, key=len): - should_skip = any( - path.startswith(shortpath.rstrip("*")) - and path[len(shortpath.rstrip("*").rstrip(sep))] == sep - for shortpath in short_paths - ) - if not should_skip: - short_paths.add(path) - return short_paths - - -def compress_for_rename(paths: Iterable[str]) -> Set[str]: - """Returns a set containing the paths that need to be renamed. - - This set may include directories when the original sequence of paths - included every file on disk. - """ - case_map = {os.path.normcase(p): p for p in paths} - remaining = set(case_map) - unchecked = sorted({os.path.split(p)[0] for p in case_map.values()}, key=len) - wildcards: Set[str] = set() - - def norm_join(*a: str) -> str: - return os.path.normcase(os.path.join(*a)) - - for root in unchecked: - if any(os.path.normcase(root).startswith(w) for w in wildcards): - # This directory has already been handled. - continue - - all_files: Set[str] = set() - all_subdirs: Set[str] = set() - for dirname, subdirs, files in os.walk(root): - all_subdirs.update(norm_join(root, dirname, d) for d in subdirs) - all_files.update(norm_join(root, dirname, f) for f in files) - # If all the files we found are in our remaining set of files to - # remove, then remove them from the latter set and add a wildcard - # for the directory. - if not (all_files - remaining): - remaining.difference_update(all_files) - wildcards.add(root + os.sep) - - return set(map(case_map.__getitem__, remaining)) | wildcards - - -def compress_for_output_listing(paths: Iterable[str]) -> Tuple[Set[str], Set[str]]: - """Returns a tuple of 2 sets of which paths to display to user - - The first set contains paths that would be deleted. Files of a package - are not added and the top-level directory of the package has a '*' added - at the end - to signify that all it's contents are removed. - - The second set contains files that would have been skipped in the above - folders. - """ - - will_remove = set(paths) - will_skip = set() - - # Determine folders and files - folders = set() - files = set() - for path in will_remove: - if path.endswith(".pyc"): - continue - if path.endswith("__init__.py") or ".dist-info" in path: - folders.add(os.path.dirname(path)) - files.add(path) - - _normcased_files = set(map(os.path.normcase, files)) - - folders = compact(folders) - - # This walks the tree using os.walk to not miss extra folders - # that might get added. - for folder in folders: - for dirpath, _, dirfiles in os.walk(folder): - for fname in dirfiles: - if fname.endswith(".pyc"): - continue - - file_ = os.path.join(dirpath, fname) - if ( - os.path.isfile(file_) - and os.path.normcase(file_) not in _normcased_files - ): - # We are skipping this file. Add it to the set. - will_skip.add(file_) - - will_remove = files | {os.path.join(folder, "*") for folder in folders} - - return will_remove, will_skip - - -class StashedUninstallPathSet: - """A set of file rename operations to stash files while - tentatively uninstalling them.""" - - def __init__(self) -> None: - # Mapping from source file root to [Adjacent]TempDirectory - # for files under that directory. - self._save_dirs: Dict[str, TempDirectory] = {} - # (old path, new path) tuples for each move that may need - # to be undone. - self._moves: List[Tuple[str, str]] = [] - - def _get_directory_stash(self, path: str) -> str: - """Stashes a directory. - - Directories are stashed adjacent to their original location if - possible, or else moved/copied into the user's temp dir.""" - - try: - save_dir: TempDirectory = AdjacentTempDirectory(path) - except OSError: - save_dir = TempDirectory(kind="uninstall") - self._save_dirs[os.path.normcase(path)] = save_dir - - return save_dir.path - - def _get_file_stash(self, path: str) -> str: - """Stashes a file. - - If no root has been provided, one will be created for the directory - in the user's temp directory.""" - path = os.path.normcase(path) - head, old_head = os.path.dirname(path), None - save_dir = None - - while head != old_head: - try: - save_dir = self._save_dirs[head] - break - except KeyError: - pass - head, old_head = os.path.dirname(head), head - else: - # Did not find any suitable root - head = os.path.dirname(path) - save_dir = TempDirectory(kind="uninstall") - self._save_dirs[head] = save_dir - - relpath = os.path.relpath(path, head) - if relpath and relpath != os.path.curdir: - return os.path.join(save_dir.path, relpath) - return save_dir.path - - def stash(self, path: str) -> str: - """Stashes the directory or file and returns its new location. - Handle symlinks as files to avoid modifying the symlink targets. - """ - path_is_dir = os.path.isdir(path) and not os.path.islink(path) - if path_is_dir: - new_path = self._get_directory_stash(path) - else: - new_path = self._get_file_stash(path) - - self._moves.append((path, new_path)) - if path_is_dir and os.path.isdir(new_path): - # If we're moving a directory, we need to - # remove the destination first or else it will be - # moved to inside the existing directory. - # We just created new_path ourselves, so it will - # be removable. - os.rmdir(new_path) - renames(path, new_path) - return new_path - - def commit(self) -> None: - """Commits the uninstall by removing stashed files.""" - for save_dir in self._save_dirs.values(): - save_dir.cleanup() - self._moves = [] - self._save_dirs = {} - - def rollback(self) -> None: - """Undoes the uninstall by moving stashed files back.""" - for p in self._moves: - logger.info("Moving to %s\n from %s", *p) - - for new_path, path in self._moves: - try: - logger.debug("Replacing %s from %s", new_path, path) - if os.path.isfile(new_path) or os.path.islink(new_path): - os.unlink(new_path) - elif os.path.isdir(new_path): - rmtree(new_path) - renames(path, new_path) - except OSError as ex: - logger.error("Failed to restore %s", new_path) - logger.debug("Exception: %s", ex) - - self.commit() - - @property - def can_rollback(self) -> bool: - return bool(self._moves) - - -class UninstallPathSet: - """A set of file paths to be removed in the uninstallation of a - requirement.""" - - def __init__(self, dist: BaseDistribution) -> None: - self._paths: Set[str] = set() - self._refuse: Set[str] = set() - self._pth: Dict[str, UninstallPthEntries] = {} - self._dist = dist - self._moved_paths = StashedUninstallPathSet() - # Create local cache of normalize_path results. Creating an UninstallPathSet - # can result in hundreds/thousands of redundant calls to normalize_path with - # the same args, which hurts performance. - self._normalize_path_cached = functools.lru_cache()(normalize_path) - - def _permitted(self, path: str) -> bool: - """ - Return True if the given path is one we are permitted to - remove/modify, False otherwise. - - """ - # aka is_local, but caching normalized sys.prefix - if not running_under_virtualenv(): - return True - return path.startswith(self._normalize_path_cached(sys.prefix)) - - def add(self, path: str) -> None: - head, tail = os.path.split(path) - - # we normalize the head to resolve parent directory symlinks, but not - # the tail, since we only want to uninstall symlinks, not their targets - path = os.path.join(self._normalize_path_cached(head), os.path.normcase(tail)) - - if not os.path.exists(path): - return - if self._permitted(path): - self._paths.add(path) - else: - self._refuse.add(path) - - # __pycache__ files can show up after 'installed-files.txt' is created, - # due to imports - if os.path.splitext(path)[1] == ".py": - self.add(cache_from_source(path)) - - def add_pth(self, pth_file: str, entry: str) -> None: - pth_file = self._normalize_path_cached(pth_file) - if self._permitted(pth_file): - if pth_file not in self._pth: - self._pth[pth_file] = UninstallPthEntries(pth_file) - self._pth[pth_file].add(entry) - else: - self._refuse.add(pth_file) - - def remove(self, auto_confirm: bool = False, verbose: bool = False) -> None: - """Remove paths in ``self._paths`` with confirmation (unless - ``auto_confirm`` is True).""" - - if not self._paths: - logger.info( - "Can't uninstall '%s'. No files were found to uninstall.", - self._dist.raw_name, - ) - return - - dist_name_version = f"{self._dist.raw_name}-{self._dist.version}" - logger.info("Uninstalling %s:", dist_name_version) - - with indent_log(): - if auto_confirm or self._allowed_to_proceed(verbose): - moved = self._moved_paths - - for_rename = compress_for_rename(self._paths) - - for path in sorted(compact(for_rename)): - moved.stash(path) - logger.verbose("Removing file or directory %s", path) - - for pth in self._pth.values(): - pth.remove() - - logger.info("Successfully uninstalled %s", dist_name_version) - - def _allowed_to_proceed(self, verbose: bool) -> bool: - """Display which files would be deleted and prompt for confirmation""" - - def _display(msg: str, paths: Iterable[str]) -> None: - if not paths: - return - - logger.info(msg) - with indent_log(): - for path in sorted(compact(paths)): - logger.info(path) - - if not verbose: - will_remove, will_skip = compress_for_output_listing(self._paths) - else: - # In verbose mode, display all the files that are going to be - # deleted. - will_remove = set(self._paths) - will_skip = set() - - _display("Would remove:", will_remove) - _display("Would not remove (might be manually added):", will_skip) - _display("Would not remove (outside of prefix):", self._refuse) - if verbose: - _display("Will actually move:", compress_for_rename(self._paths)) - - return ask("Proceed (Y/n)? ", ("y", "n", "")) != "n" - - def rollback(self) -> None: - """Rollback the changes previously made by remove().""" - if not self._moved_paths.can_rollback: - logger.error( - "Can't roll back %s; was not uninstalled", - self._dist.raw_name, - ) - return - logger.info("Rolling back uninstall of %s", self._dist.raw_name) - self._moved_paths.rollback() - for pth in self._pth.values(): - pth.rollback() - - def commit(self) -> None: - """Remove temporary save dir: rollback will no longer be possible.""" - self._moved_paths.commit() - - @classmethod - def from_dist(cls, dist: BaseDistribution) -> "UninstallPathSet": - dist_location = dist.location - info_location = dist.info_location - if dist_location is None: - logger.info( - "Not uninstalling %s since it is not installed", - dist.canonical_name, - ) - return cls(dist) - - normalized_dist_location = normalize_path(dist_location) - if not dist.local: - logger.info( - "Not uninstalling %s at %s, outside environment %s", - dist.canonical_name, - normalized_dist_location, - sys.prefix, - ) - return cls(dist) - - if normalized_dist_location in { - p - for p in {sysconfig.get_path("stdlib"), sysconfig.get_path("platstdlib")} - if p - }: - logger.info( - "Not uninstalling %s at %s, as it is in the standard library.", - dist.canonical_name, - normalized_dist_location, - ) - return cls(dist) - - paths_to_remove = cls(dist) - develop_egg_link = egg_link_path_from_location(dist.raw_name) - - # Distribution is installed with metadata in a "flat" .egg-info - # directory. This means it is not a modern .dist-info installation, an - # egg, or legacy editable. - setuptools_flat_installation = ( - dist.installed_with_setuptools_egg_info - and info_location is not None - and os.path.exists(info_location) - # If dist is editable and the location points to a ``.egg-info``, - # we are in fact in the legacy editable case. - and not info_location.endswith(f"{dist.setuptools_filename}.egg-info") - ) - - # Uninstall cases order do matter as in the case of 2 installs of the - # same package, pip needs to uninstall the currently detected version - if setuptools_flat_installation: - if info_location is not None: - paths_to_remove.add(info_location) - installed_files = dist.iter_declared_entries() - if installed_files is not None: - for installed_file in installed_files: - paths_to_remove.add(os.path.join(dist_location, installed_file)) - # FIXME: need a test for this elif block - # occurs with --single-version-externally-managed/--record outside - # of pip - elif dist.is_file("top_level.txt"): - try: - namespace_packages = dist.read_text("namespace_packages.txt") - except FileNotFoundError: - namespaces = [] - else: - namespaces = namespace_packages.splitlines(keepends=False) - for top_level_pkg in [ - p - for p in dist.read_text("top_level.txt").splitlines() - if p and p not in namespaces - ]: - path = os.path.join(dist_location, top_level_pkg) - paths_to_remove.add(path) - paths_to_remove.add(f"{path}.py") - paths_to_remove.add(f"{path}.pyc") - paths_to_remove.add(f"{path}.pyo") - - elif dist.installed_by_distutils: - raise UninstallationError( - "Cannot uninstall {!r}. It is a distutils installed project " - "and thus we cannot accurately determine which files belong " - "to it which would lead to only a partial uninstall.".format( - dist.raw_name, - ) - ) - - elif dist.installed_as_egg: - # package installed by easy_install - # We cannot match on dist.egg_name because it can slightly vary - # i.e. setuptools-0.6c11-py2.6.egg vs setuptools-0.6rc11-py2.6.egg - paths_to_remove.add(dist_location) - easy_install_egg = os.path.split(dist_location)[1] - easy_install_pth = os.path.join( - os.path.dirname(dist_location), - "easy-install.pth", - ) - paths_to_remove.add_pth(easy_install_pth, "./" + easy_install_egg) - - elif dist.installed_with_dist_info: - for path in uninstallation_paths(dist): - paths_to_remove.add(path) - - elif develop_egg_link: - # PEP 660 modern editable is handled in the ``.dist-info`` case - # above, so this only covers the setuptools-style editable. - with open(develop_egg_link) as fh: - link_pointer = os.path.normcase(fh.readline().strip()) - normalized_link_pointer = paths_to_remove._normalize_path_cached( - link_pointer - ) - assert os.path.samefile( - normalized_link_pointer, normalized_dist_location - ), ( - f"Egg-link {develop_egg_link} (to {link_pointer}) does not match " - f"installed location of {dist.raw_name} (at {dist_location})" - ) - paths_to_remove.add(develop_egg_link) - easy_install_pth = os.path.join( - os.path.dirname(develop_egg_link), "easy-install.pth" - ) - paths_to_remove.add_pth(easy_install_pth, dist_location) - - else: - logger.debug( - "Not sure how to uninstall: %s - Check: %s", - dist, - dist_location, - ) - - if dist.in_usersite: - bin_dir = get_bin_user() - else: - bin_dir = get_bin_prefix() - - # find distutils scripts= scripts - try: - for script in dist.iter_distutils_script_names(): - paths_to_remove.add(os.path.join(bin_dir, script)) - if WINDOWS: - paths_to_remove.add(os.path.join(bin_dir, f"{script}.bat")) - except (FileNotFoundError, NotADirectoryError): - pass - - # find console_scripts and gui_scripts - def iter_scripts_to_remove( - dist: BaseDistribution, - bin_dir: str, - ) -> Generator[str, None, None]: - for entry_point in dist.iter_entry_points(): - if entry_point.group == "console_scripts": - yield from _script_names(bin_dir, entry_point.name, False) - elif entry_point.group == "gui_scripts": - yield from _script_names(bin_dir, entry_point.name, True) - - for s in iter_scripts_to_remove(dist, bin_dir): - paths_to_remove.add(s) - - return paths_to_remove - - -class UninstallPthEntries: - def __init__(self, pth_file: str) -> None: - self.file = pth_file - self.entries: Set[str] = set() - self._saved_lines: Optional[List[bytes]] = None - - def add(self, entry: str) -> None: - entry = os.path.normcase(entry) - # On Windows, os.path.normcase converts the entry to use - # backslashes. This is correct for entries that describe absolute - # paths outside of site-packages, but all the others use forward - # slashes. - # os.path.splitdrive is used instead of os.path.isabs because isabs - # treats non-absolute paths with drive letter markings like c:foo\bar - # as absolute paths. It also does not recognize UNC paths if they don't - # have more than "\\sever\share". Valid examples: "\\server\share\" or - # "\\server\share\folder". - if WINDOWS and not os.path.splitdrive(entry)[0]: - entry = entry.replace("\\", "/") - self.entries.add(entry) - - def remove(self) -> None: - logger.verbose("Removing pth entries from %s:", self.file) - - # If the file doesn't exist, log a warning and return - if not os.path.isfile(self.file): - logger.warning("Cannot remove entries from nonexistent file %s", self.file) - return - with open(self.file, "rb") as fh: - # windows uses '\r\n' with py3k, but uses '\n' with py2.x - lines = fh.readlines() - self._saved_lines = lines - if any(b"\r\n" in line for line in lines): - endline = "\r\n" - else: - endline = "\n" - # handle missing trailing newline - if lines and not lines[-1].endswith(endline.encode("utf-8")): - lines[-1] = lines[-1] + endline.encode("utf-8") - for entry in self.entries: - try: - logger.verbose("Removing entry: %s", entry) - lines.remove((entry + endline).encode("utf-8")) - except ValueError: - pass - with open(self.file, "wb") as fh: - fh.writelines(lines) - - def rollback(self) -> bool: - if self._saved_lines is None: - logger.error("Cannot roll back changes to %s, none were made", self.file) - return False - logger.debug("Rolling %s back to previous state", self.file) - with open(self.file, "wb") as fh: - fh.writelines(self._saved_lines) - return True diff --git a/venv/lib/python3.12/site-packages/pip/_internal/resolution/__init__.py b/venv/lib/python3.12/site-packages/pip/_internal/resolution/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 26588012df9784a24eb029e52d9001ec951a5452..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 217 zcmZ9GJqp4=5QVcwL4+K{A{o?HtgO94ST{qmxPR<UqQQgM*?Sg`;Rz&NDmSeU-n?%f zQ_MTdR!Nk2-kT{u)A-jgkIf_LlQlcN5<iREFx`wdXskxioI(djD_V_)0uU;!J=b|4 zDK6;q%3h7Kyh0BhnhumagX^iWW>;*s5F}ylxVZ2d132lRl!nk7uE1lkswHU+l(Cgm cmWAub<zCyWRe11=_y~&*6MR#~m`@}909rmhyZ`_I diff --git a/venv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/base.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/base.cpython-312.pyc deleted file mode 100644 index 3d579cd288b58bb830c50d197e763c487ea4cc11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1205 zcma)5OKTiQ5bmDW&aNdHTech-WHymydoj}Zb&7=vd0<R}9Gu%=7)Cp#-9bImv)#RG z*1m+`ga3hUxeNc4TvqsE8bS;qhuoB`A>dQ0W>>)>KBQr)tG@23`Rc2hpB5Ke3|IHZ zXZ`yQW4}^xvb?!7eT>cl%UH$*D|pNcCw2-qb~#~=@CrZnYu^<?(TE$I0f!J=@K^E8 zo&)}#Ltfl;*nO6H&spZb#IMncTjQY9_?_I2Yr`*6A<|s|*83*c#)c0olgly{9d6G) zD7C@kM=%)X3JNF<qD$|E-+}2;qLUTOo#{3@2Mk!uGZs4;M`|7s%8**-La-MgDKBnh zJ_H!gPxrhmKr|dTI-y<oJk{_Bv=k#ywyC5viGqQ)E8RYH_Y*y=Dya-)$&)^S&^AzD zhN|qkCv0%1nkk;HpgCZM<5sVi^Zf^Y$afC8UEY!AK~agiO31!aN-C7c(;)T~bxfT? zqbXOr-F|1HzAPXrQlm%Fm$Ew~adc!rKu@K`rZ#zZAJk?hpOiwT8K`Ik<tP&QZd8p; zUzWGGZr+M?ZeX)YyZdPmbX4V4l;ouWh5AQ|N*_`)qFq#Cs~X!zjg8>xx%ai%nxhNI zZMul&d-gV9r$2eMv_1*frwA~5bC784)_e#E{6FHTCA_Cjqv<&64EZFarY!BYI*XfK z>48Dk^`xXkH<1eKeY*ZHjvu~MXFNw~&!gGtG;Nq9Wm-Uz*jADhG8+o=7m{Q!OvUU( z(Ql$?)U3BFrBDrum&tsD=5Us*Ca0Q&lBv7*89L9|vE%xeU$3rBF5Ng<y?N|X^!3Af zf784$^)Wtf5qM!^4lYiX+DFZg-_lXdv`)FxIb{PguJW>{Xf9^FeDv%ZwsPyAR$_w& z^qi<P<G%XgJJ_VUAnR(Q?8X27g5N4R%2D81ZEN&l60ffJUAR5d?4DXjjHX?Gissnm zod3eEAF=DdvF)GPoi}S6ul?}FwaN0vQR~XYyE^IIop^WuaGguegkAir)#R7|WN7N# Fe*<6%I>-P3 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/resolution/base.py b/venv/lib/python3.12/site-packages/pip/_internal/resolution/base.py deleted file mode 100644 index 42dade1..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/resolution/base.py +++ /dev/null @@ -1,20 +0,0 @@ -from typing import Callable, List, Optional - -from pip._internal.req.req_install import InstallRequirement -from pip._internal.req.req_set import RequirementSet - -InstallRequirementProvider = Callable[ - [str, Optional[InstallRequirement]], InstallRequirement -] - - -class BaseResolver: - def resolve( - self, root_reqs: List[InstallRequirement], check_supported_wheels: bool - ) -> RequirementSet: - raise NotImplementedError() - - def get_installation_order( - self, req_set: RequirementSet - ) -> List[InstallRequirement]: - raise NotImplementedError() diff --git a/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__init__.py b/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index a28c9fdf801a6d10883b7cc1638b213f73a03c0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224 zcmZ8bI|{-;5X~9|5pocVWKdhNvi1sL-3-a%{@9&Ff`!Mhv-d0>!xKolRBl=yyqP!i z9>ct|Y?VZa=dGFgXDa^~=5g~#`ee;cuf)&dG)$TC4vp0anp5cDXho~hPyj-OwdXny zB*g`NUfHWrmRIPZL(_qhXK+0=*6fPS7J?+q9Tyi~V*n=|l+qA-!xeZ8R<$Ipfq0aQ h9?ED+D$Bz4<8rTU)hayrMf`_FhDm%=#+Xl|`T<5_KxY5| diff --git a/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc deleted file mode 100644 index 17289bfb420ec84acb447924b4eafe23061d432f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22459 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py b/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py deleted file mode 100644 index 5ddb848..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py +++ /dev/null @@ -1,598 +0,0 @@ -"""Dependency Resolution - -The dependency resolution in pip is performed as follows: - -for top-level requirements: - a. only one spec allowed per project, regardless of conflicts or not. - otherwise a "double requirement" exception is raised - b. they override sub-dependency requirements. -for sub-dependencies - a. "first found, wins" (where the order is breadth first) -""" - -# The following comment should be removed at some point in the future. -# mypy: strict-optional=False - -import logging -import sys -from collections import defaultdict -from itertools import chain -from typing import DefaultDict, Iterable, List, Optional, Set, Tuple - -from pip._vendor.packaging import specifiers -from pip._vendor.packaging.requirements import Requirement - -from pip._internal.cache import WheelCache -from pip._internal.exceptions import ( - BestVersionAlreadyInstalled, - DistributionNotFound, - HashError, - HashErrors, - InstallationError, - NoneMetadataError, - UnsupportedPythonVersion, -) -from pip._internal.index.package_finder import PackageFinder -from pip._internal.metadata import BaseDistribution -from pip._internal.models.link import Link -from pip._internal.models.wheel import Wheel -from pip._internal.operations.prepare import RequirementPreparer -from pip._internal.req.req_install import ( - InstallRequirement, - check_invalid_constraint_type, -) -from pip._internal.req.req_set import RequirementSet -from pip._internal.resolution.base import BaseResolver, InstallRequirementProvider -from pip._internal.utils import compatibility_tags -from pip._internal.utils.compatibility_tags import get_supported -from pip._internal.utils.direct_url_helpers import direct_url_from_link -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import normalize_version_info -from pip._internal.utils.packaging import check_requires_python - -logger = logging.getLogger(__name__) - -DiscoveredDependencies = DefaultDict[str, List[InstallRequirement]] - - -def _check_dist_requires_python( - dist: BaseDistribution, - version_info: Tuple[int, int, int], - ignore_requires_python: bool = False, -) -> None: - """ - Check whether the given Python version is compatible with a distribution's - "Requires-Python" value. - - :param version_info: A 3-tuple of ints representing the Python - major-minor-micro version to check. - :param ignore_requires_python: Whether to ignore the "Requires-Python" - value if the given Python version isn't compatible. - - :raises UnsupportedPythonVersion: When the given Python version isn't - compatible. - """ - # This idiosyncratically converts the SpecifierSet to str and let - # check_requires_python then parse it again into SpecifierSet. But this - # is the legacy resolver so I'm just not going to bother refactoring. - try: - requires_python = str(dist.requires_python) - except FileNotFoundError as e: - raise NoneMetadataError(dist, str(e)) - try: - is_compatible = check_requires_python( - requires_python, - version_info=version_info, - ) - except specifiers.InvalidSpecifier as exc: - logger.warning( - "Package %r has an invalid Requires-Python: %s", dist.raw_name, exc - ) - return - - if is_compatible: - return - - version = ".".join(map(str, version_info)) - if ignore_requires_python: - logger.debug( - "Ignoring failed Requires-Python check for package %r: %s not in %r", - dist.raw_name, - version, - requires_python, - ) - return - - raise UnsupportedPythonVersion( - "Package {!r} requires a different Python: {} not in {!r}".format( - dist.raw_name, version, requires_python - ) - ) - - -class Resolver(BaseResolver): - """Resolves which packages need to be installed/uninstalled to perform \ - the requested operation without breaking the requirements of any package. - """ - - _allowed_strategies = {"eager", "only-if-needed", "to-satisfy-only"} - - def __init__( - self, - preparer: RequirementPreparer, - finder: PackageFinder, - wheel_cache: Optional[WheelCache], - make_install_req: InstallRequirementProvider, - use_user_site: bool, - ignore_dependencies: bool, - ignore_installed: bool, - ignore_requires_python: bool, - force_reinstall: bool, - upgrade_strategy: str, - py_version_info: Optional[Tuple[int, ...]] = None, - ) -> None: - super().__init__() - assert upgrade_strategy in self._allowed_strategies - - if py_version_info is None: - py_version_info = sys.version_info[:3] - else: - py_version_info = normalize_version_info(py_version_info) - - self._py_version_info = py_version_info - - self.preparer = preparer - self.finder = finder - self.wheel_cache = wheel_cache - - self.upgrade_strategy = upgrade_strategy - self.force_reinstall = force_reinstall - self.ignore_dependencies = ignore_dependencies - self.ignore_installed = ignore_installed - self.ignore_requires_python = ignore_requires_python - self.use_user_site = use_user_site - self._make_install_req = make_install_req - - self._discovered_dependencies: DiscoveredDependencies = defaultdict(list) - - def resolve( - self, root_reqs: List[InstallRequirement], check_supported_wheels: bool - ) -> RequirementSet: - """Resolve what operations need to be done - - As a side-effect of this method, the packages (and their dependencies) - are downloaded, unpacked and prepared for installation. This - preparation is done by ``pip.operations.prepare``. - - Once PyPI has static dependency metadata available, it would be - possible to move the preparation to become a step separated from - dependency resolution. - """ - requirement_set = RequirementSet(check_supported_wheels=check_supported_wheels) - for req in root_reqs: - if req.constraint: - check_invalid_constraint_type(req) - self._add_requirement_to_set(requirement_set, req) - - # Actually prepare the files, and collect any exceptions. Most hash - # exceptions cannot be checked ahead of time, because - # _populate_link() needs to be called before we can make decisions - # based on link type. - discovered_reqs: List[InstallRequirement] = [] - hash_errors = HashErrors() - for req in chain(requirement_set.all_requirements, discovered_reqs): - try: - discovered_reqs.extend(self._resolve_one(requirement_set, req)) - except HashError as exc: - exc.req = req - hash_errors.append(exc) - - if hash_errors: - raise hash_errors - - return requirement_set - - def _add_requirement_to_set( - self, - requirement_set: RequirementSet, - install_req: InstallRequirement, - parent_req_name: Optional[str] = None, - extras_requested: Optional[Iterable[str]] = None, - ) -> Tuple[List[InstallRequirement], Optional[InstallRequirement]]: - """Add install_req as a requirement to install. - - :param parent_req_name: The name of the requirement that needed this - added. The name is used because when multiple unnamed requirements - resolve to the same name, we could otherwise end up with dependency - links that point outside the Requirements set. parent_req must - already be added. Note that None implies that this is a user - supplied requirement, vs an inferred one. - :param extras_requested: an iterable of extras used to evaluate the - environment markers. - :return: Additional requirements to scan. That is either [] if - the requirement is not applicable, or [install_req] if the - requirement is applicable and has just been added. - """ - # If the markers do not match, ignore this requirement. - if not install_req.match_markers(extras_requested): - logger.info( - "Ignoring %s: markers '%s' don't match your environment", - install_req.name, - install_req.markers, - ) - return [], None - - # If the wheel is not supported, raise an error. - # Should check this after filtering out based on environment markers to - # allow specifying different wheels based on the environment/OS, in a - # single requirements file. - if install_req.link and install_req.link.is_wheel: - wheel = Wheel(install_req.link.filename) - tags = compatibility_tags.get_supported() - if requirement_set.check_supported_wheels and not wheel.supported(tags): - raise InstallationError( - f"{wheel.filename} is not a supported wheel on this platform." - ) - - # This next bit is really a sanity check. - assert ( - not install_req.user_supplied or parent_req_name is None - ), "a user supplied req shouldn't have a parent" - - # Unnamed requirements are scanned again and the requirement won't be - # added as a dependency until after scanning. - if not install_req.name: - requirement_set.add_unnamed_requirement(install_req) - return [install_req], None - - try: - existing_req: Optional[ - InstallRequirement - ] = requirement_set.get_requirement(install_req.name) - except KeyError: - existing_req = None - - has_conflicting_requirement = ( - parent_req_name is None - and existing_req - and not existing_req.constraint - and existing_req.extras == install_req.extras - and existing_req.req - and install_req.req - and existing_req.req.specifier != install_req.req.specifier - ) - if has_conflicting_requirement: - raise InstallationError( - "Double requirement given: {} (already in {}, name={!r})".format( - install_req, existing_req, install_req.name - ) - ) - - # When no existing requirement exists, add the requirement as a - # dependency and it will be scanned again after. - if not existing_req: - requirement_set.add_named_requirement(install_req) - # We'd want to rescan this requirement later - return [install_req], install_req - - # Assume there's no need to scan, and that we've already - # encountered this for scanning. - if install_req.constraint or not existing_req.constraint: - return [], existing_req - - does_not_satisfy_constraint = install_req.link and not ( - existing_req.link and install_req.link.path == existing_req.link.path - ) - if does_not_satisfy_constraint: - raise InstallationError( - f"Could not satisfy constraints for '{install_req.name}': " - "installation from path or url cannot be " - "constrained to a version" - ) - # If we're now installing a constraint, mark the existing - # object for real installation. - existing_req.constraint = False - # If we're now installing a user supplied requirement, - # mark the existing object as such. - if install_req.user_supplied: - existing_req.user_supplied = True - existing_req.extras = tuple( - sorted(set(existing_req.extras) | set(install_req.extras)) - ) - logger.debug( - "Setting %s extras to: %s", - existing_req, - existing_req.extras, - ) - # Return the existing requirement for addition to the parent and - # scanning again. - return [existing_req], existing_req - - def _is_upgrade_allowed(self, req: InstallRequirement) -> bool: - if self.upgrade_strategy == "to-satisfy-only": - return False - elif self.upgrade_strategy == "eager": - return True - else: - assert self.upgrade_strategy == "only-if-needed" - return req.user_supplied or req.constraint - - def _set_req_to_reinstall(self, req: InstallRequirement) -> None: - """ - Set a requirement to be installed. - """ - # Don't uninstall the conflict if doing a user install and the - # conflict is not a user install. - if not self.use_user_site or req.satisfied_by.in_usersite: - req.should_reinstall = True - req.satisfied_by = None - - def _check_skip_installed( - self, req_to_install: InstallRequirement - ) -> Optional[str]: - """Check if req_to_install should be skipped. - - This will check if the req is installed, and whether we should upgrade - or reinstall it, taking into account all the relevant user options. - - After calling this req_to_install will only have satisfied_by set to - None if the req_to_install is to be upgraded/reinstalled etc. Any - other value will be a dist recording the current thing installed that - satisfies the requirement. - - Note that for vcs urls and the like we can't assess skipping in this - routine - we simply identify that we need to pull the thing down, - then later on it is pulled down and introspected to assess upgrade/ - reinstalls etc. - - :return: A text reason for why it was skipped, or None. - """ - if self.ignore_installed: - return None - - req_to_install.check_if_exists(self.use_user_site) - if not req_to_install.satisfied_by: - return None - - if self.force_reinstall: - self._set_req_to_reinstall(req_to_install) - return None - - if not self._is_upgrade_allowed(req_to_install): - if self.upgrade_strategy == "only-if-needed": - return "already satisfied, skipping upgrade" - return "already satisfied" - - # Check for the possibility of an upgrade. For link-based - # requirements we have to pull the tree down and inspect to assess - # the version #, so it's handled way down. - if not req_to_install.link: - try: - self.finder.find_requirement(req_to_install, upgrade=True) - except BestVersionAlreadyInstalled: - # Then the best version is installed. - return "already up-to-date" - except DistributionNotFound: - # No distribution found, so we squash the error. It will - # be raised later when we re-try later to do the install. - # Why don't we just raise here? - pass - - self._set_req_to_reinstall(req_to_install) - return None - - def _find_requirement_link(self, req: InstallRequirement) -> Optional[Link]: - upgrade = self._is_upgrade_allowed(req) - best_candidate = self.finder.find_requirement(req, upgrade) - if not best_candidate: - return None - - # Log a warning per PEP 592 if necessary before returning. - link = best_candidate.link - if link.is_yanked: - reason = link.yanked_reason or "<none given>" - msg = ( - # Mark this as a unicode string to prevent - # "UnicodeEncodeError: 'ascii' codec can't encode character" - # in Python 2 when the reason contains non-ascii characters. - "The candidate selected for download or install is a " - f"yanked version: {best_candidate}\n" - f"Reason for being yanked: {reason}" - ) - logger.warning(msg) - - return link - - def _populate_link(self, req: InstallRequirement) -> None: - """Ensure that if a link can be found for this, that it is found. - - Note that req.link may still be None - if the requirement is already - installed and not needed to be upgraded based on the return value of - _is_upgrade_allowed(). - - If preparer.require_hashes is True, don't use the wheel cache, because - cached wheels, always built locally, have different hashes than the - files downloaded from the index server and thus throw false hash - mismatches. Furthermore, cached wheels at present have undeterministic - contents due to file modification times. - """ - if req.link is None: - req.link = self._find_requirement_link(req) - - if self.wheel_cache is None or self.preparer.require_hashes: - return - cache_entry = self.wheel_cache.get_cache_entry( - link=req.link, - package_name=req.name, - supported_tags=get_supported(), - ) - if cache_entry is not None: - logger.debug("Using cached wheel link: %s", cache_entry.link) - if req.link is req.original_link and cache_entry.persistent: - req.cached_wheel_source_link = req.link - if cache_entry.origin is not None: - req.download_info = cache_entry.origin - else: - # Legacy cache entry that does not have origin.json. - # download_info may miss the archive_info.hashes field. - req.download_info = direct_url_from_link( - req.link, link_is_in_wheel_cache=cache_entry.persistent - ) - req.link = cache_entry.link - - def _get_dist_for(self, req: InstallRequirement) -> BaseDistribution: - """Takes a InstallRequirement and returns a single AbstractDist \ - representing a prepared variant of the same. - """ - if req.editable: - return self.preparer.prepare_editable_requirement(req) - - # satisfied_by is only evaluated by calling _check_skip_installed, - # so it must be None here. - assert req.satisfied_by is None - skip_reason = self._check_skip_installed(req) - - if req.satisfied_by: - return self.preparer.prepare_installed_requirement(req, skip_reason) - - # We eagerly populate the link, since that's our "legacy" behavior. - self._populate_link(req) - dist = self.preparer.prepare_linked_requirement(req) - - # NOTE - # The following portion is for determining if a certain package is - # going to be re-installed/upgraded or not and reporting to the user. - # This should probably get cleaned up in a future refactor. - - # req.req is only avail after unpack for URL - # pkgs repeat check_if_exists to uninstall-on-upgrade - # (#14) - if not self.ignore_installed: - req.check_if_exists(self.use_user_site) - - if req.satisfied_by: - should_modify = ( - self.upgrade_strategy != "to-satisfy-only" - or self.force_reinstall - or self.ignore_installed - or req.link.scheme == "file" - ) - if should_modify: - self._set_req_to_reinstall(req) - else: - logger.info( - "Requirement already satisfied (use --upgrade to upgrade): %s", - req, - ) - return dist - - def _resolve_one( - self, - requirement_set: RequirementSet, - req_to_install: InstallRequirement, - ) -> List[InstallRequirement]: - """Prepare a single requirements file. - - :return: A list of additional InstallRequirements to also install. - """ - # Tell user what we are doing for this requirement: - # obtain (editable), skipping, processing (local url), collecting - # (remote url or package name) - if req_to_install.constraint or req_to_install.prepared: - return [] - - req_to_install.prepared = True - - # Parse and return dependencies - dist = self._get_dist_for(req_to_install) - # This will raise UnsupportedPythonVersion if the given Python - # version isn't compatible with the distribution's Requires-Python. - _check_dist_requires_python( - dist, - version_info=self._py_version_info, - ignore_requires_python=self.ignore_requires_python, - ) - - more_reqs: List[InstallRequirement] = [] - - def add_req(subreq: Requirement, extras_requested: Iterable[str]) -> None: - # This idiosyncratically converts the Requirement to str and let - # make_install_req then parse it again into Requirement. But this is - # the legacy resolver so I'm just not going to bother refactoring. - sub_install_req = self._make_install_req(str(subreq), req_to_install) - parent_req_name = req_to_install.name - to_scan_again, add_to_parent = self._add_requirement_to_set( - requirement_set, - sub_install_req, - parent_req_name=parent_req_name, - extras_requested=extras_requested, - ) - if parent_req_name and add_to_parent: - self._discovered_dependencies[parent_req_name].append(add_to_parent) - more_reqs.extend(to_scan_again) - - with indent_log(): - # We add req_to_install before its dependencies, so that we - # can refer to it when adding dependencies. - if not requirement_set.has_requirement(req_to_install.name): - # 'unnamed' requirements will get added here - # 'unnamed' requirements can only come from being directly - # provided by the user. - assert req_to_install.user_supplied - self._add_requirement_to_set( - requirement_set, req_to_install, parent_req_name=None - ) - - if not self.ignore_dependencies: - if req_to_install.extras: - logger.debug( - "Installing extra requirements: %r", - ",".join(req_to_install.extras), - ) - missing_requested = sorted( - set(req_to_install.extras) - set(dist.iter_provided_extras()) - ) - for missing in missing_requested: - logger.warning( - "%s %s does not provide the extra '%s'", - dist.raw_name, - dist.version, - missing, - ) - - available_requested = sorted( - set(dist.iter_provided_extras()) & set(req_to_install.extras) - ) - for subreq in dist.iter_dependencies(available_requested): - add_req(subreq, extras_requested=available_requested) - - return more_reqs - - def get_installation_order( - self, req_set: RequirementSet - ) -> List[InstallRequirement]: - """Create the installation order. - - The installation order is topological - requirements are installed - before the requiring thing. We break cycles at an arbitrary point, - and make no other guarantees. - """ - # The current implementation, which we may change at any point - # installs the user specified things in the order given, except when - # dependencies must come earlier to achieve topological order. - order = [] - ordered_reqs: Set[InstallRequirement] = set() - - def schedule(req: InstallRequirement) -> None: - if req.satisfied_by or req in ordered_reqs: - return - if req.constraint: - return - ordered_reqs.add(req) - for dep in self._discovered_dependencies[req.name]: - schedule(dep) - order.append(req) - - for install_req in req_set.requirements.values(): - schedule(install_req) - return order diff --git a/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__init__.py b/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 8d3f481a46002ef4ca4cd2494e6d3c7d2eb3d928..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 228 zcmZ9GJqp4=5QVcwK?DzCkql}pR@Po2tjS;&_mADlO0e`0cJ`jdV|W6wOXV(hKA3sm z3~ykb^Z6``s_&OJ`75=5ea3Nf%ld4=_K(bs;`B+G;R>x$2#S*rurqb1P?HBjiATp( z;YrjdbVXy%S{mM<gMd1K6bG<9wMMVY<qEtYEG(~2{D>Z`uuut2=rot$&>Pv2F#3l9 h({U98f~u;t{V?4q({vKIZW4cDv3!De&KPrfq%U=1LM;FQ diff --git a/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc deleted file mode 100644 index 27608368e7629ab3f4cc953978702aa700f5c633..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8357 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 ToYPkE?$gHYLhK3w!hQcg1IuG@ diff --git a/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc deleted file mode 100644 index d6a12deb2e6ea08c0cc17da754af4e17ddd822b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30418 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-312.pyc deleted file mode 100644 index e5365867f421e863e06074faa30049cbae2a840c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32134 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-312.pyc deleted file mode 100644 index 9d146a7c153e849999419a580033e99ec76903f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6228 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 M@AxNyC*Sjb02F|AjQ{`u diff --git a/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-312.pyc deleted file mode 100644 index 65dea03a550d8f4e84e2bc7ccc64e63ae98430c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10398 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 SqXVy6_~xa-Uvl(jWc?4tH-?%3 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-312.pyc deleted file mode 100644 index 5d8cf77670d970a2813dd33b9eb86cfad521f8d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4955 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 Mcj_M;G#<`>0-FH0ng9R* diff --git a/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-312.pyc deleted file mode 100644 index f68f0722a5a8cef7227bebe1615ba87ed98df3f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11449 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc deleted file mode 100644 index 821859f38885e3a6da9c4c36be1f22f4bfaaa9f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12371 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 Dj1Y}~ diff --git a/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/base.py b/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/base.py deleted file mode 100644 index 9c0ef5c..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/base.py +++ /dev/null @@ -1,141 +0,0 @@ -from typing import FrozenSet, Iterable, Optional, Tuple, Union - -from pip._vendor.packaging.specifiers import SpecifierSet -from pip._vendor.packaging.utils import NormalizedName -from pip._vendor.packaging.version import LegacyVersion, Version - -from pip._internal.models.link import Link, links_equivalent -from pip._internal.req.req_install import InstallRequirement -from pip._internal.utils.hashes import Hashes - -CandidateLookup = Tuple[Optional["Candidate"], Optional[InstallRequirement]] -CandidateVersion = Union[LegacyVersion, Version] - - -def format_name(project: NormalizedName, extras: FrozenSet[NormalizedName]) -> str: - if not extras: - return project - extras_expr = ",".join(sorted(extras)) - return f"{project}[{extras_expr}]" - - -class Constraint: - def __init__( - self, specifier: SpecifierSet, hashes: Hashes, links: FrozenSet[Link] - ) -> None: - self.specifier = specifier - self.hashes = hashes - self.links = links - - @classmethod - def empty(cls) -> "Constraint": - return Constraint(SpecifierSet(), Hashes(), frozenset()) - - @classmethod - def from_ireq(cls, ireq: InstallRequirement) -> "Constraint": - links = frozenset([ireq.link]) if ireq.link else frozenset() - return Constraint(ireq.specifier, ireq.hashes(trust_internet=False), links) - - def __bool__(self) -> bool: - return bool(self.specifier) or bool(self.hashes) or bool(self.links) - - def __and__(self, other: InstallRequirement) -> "Constraint": - if not isinstance(other, InstallRequirement): - return NotImplemented - specifier = self.specifier & other.specifier - hashes = self.hashes & other.hashes(trust_internet=False) - links = self.links - if other.link: - links = links.union([other.link]) - return Constraint(specifier, hashes, links) - - def is_satisfied_by(self, candidate: "Candidate") -> bool: - # Reject if there are any mismatched URL constraints on this package. - if self.links and not all(_match_link(link, candidate) for link in self.links): - return False - # We can safely always allow prereleases here since PackageFinder - # already implements the prerelease logic, and would have filtered out - # prerelease candidates if the user does not expect them. - return self.specifier.contains(candidate.version, prereleases=True) - - -class Requirement: - @property - def project_name(self) -> NormalizedName: - """The "project name" of a requirement. - - This is different from ``name`` if this requirement contains extras, - in which case ``name`` would contain the ``[...]`` part, while this - refers to the name of the project. - """ - raise NotImplementedError("Subclass should override") - - @property - def name(self) -> str: - """The name identifying this requirement in the resolver. - - This is different from ``project_name`` if this requirement contains - extras, where ``project_name`` would not contain the ``[...]`` part. - """ - raise NotImplementedError("Subclass should override") - - def is_satisfied_by(self, candidate: "Candidate") -> bool: - return False - - def get_candidate_lookup(self) -> CandidateLookup: - raise NotImplementedError("Subclass should override") - - def format_for_error(self) -> str: - raise NotImplementedError("Subclass should override") - - -def _match_link(link: Link, candidate: "Candidate") -> bool: - if candidate.source_link: - return links_equivalent(link, candidate.source_link) - return False - - -class Candidate: - @property - def project_name(self) -> NormalizedName: - """The "project name" of the candidate. - - This is different from ``name`` if this candidate contains extras, - in which case ``name`` would contain the ``[...]`` part, while this - refers to the name of the project. - """ - raise NotImplementedError("Override in subclass") - - @property - def name(self) -> str: - """The name identifying this candidate in the resolver. - - This is different from ``project_name`` if this candidate contains - extras, where ``project_name`` would not contain the ``[...]`` part. - """ - raise NotImplementedError("Override in subclass") - - @property - def version(self) -> CandidateVersion: - raise NotImplementedError("Override in subclass") - - @property - def is_installed(self) -> bool: - raise NotImplementedError("Override in subclass") - - @property - def is_editable(self) -> bool: - raise NotImplementedError("Override in subclass") - - @property - def source_link(self) -> Optional[Link]: - raise NotImplementedError("Override in subclass") - - def iter_dependencies(self, with_requires: bool) -> Iterable[Optional[Requirement]]: - raise NotImplementedError("Override in subclass") - - def get_install_requirement(self) -> Optional[InstallRequirement]: - raise NotImplementedError("Override in subclass") - - def format_for_error(self) -> str: - raise NotImplementedError("Subclass should override") diff --git a/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py b/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py deleted file mode 100644 index 4125cda..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py +++ /dev/null @@ -1,597 +0,0 @@ -import logging -import sys -from typing import TYPE_CHECKING, Any, FrozenSet, Iterable, Optional, Tuple, Union, cast - -from pip._vendor.packaging.utils import NormalizedName, canonicalize_name -from pip._vendor.packaging.version import Version - -from pip._internal.exceptions import ( - HashError, - InstallationSubprocessError, - MetadataInconsistent, -) -from pip._internal.metadata import BaseDistribution -from pip._internal.models.link import Link, links_equivalent -from pip._internal.models.wheel import Wheel -from pip._internal.req.constructors import ( - install_req_from_editable, - install_req_from_line, -) -from pip._internal.req.req_install import InstallRequirement -from pip._internal.utils.direct_url_helpers import direct_url_from_link -from pip._internal.utils.misc import normalize_version_info - -from .base import Candidate, CandidateVersion, Requirement, format_name - -if TYPE_CHECKING: - from .factory import Factory - -logger = logging.getLogger(__name__) - -BaseCandidate = Union[ - "AlreadyInstalledCandidate", - "EditableCandidate", - "LinkCandidate", -] - -# Avoid conflicting with the PyPI package "Python". -REQUIRES_PYTHON_IDENTIFIER = cast(NormalizedName, "<Python from Requires-Python>") - - -def as_base_candidate(candidate: Candidate) -> Optional[BaseCandidate]: - """The runtime version of BaseCandidate.""" - base_candidate_classes = ( - AlreadyInstalledCandidate, - EditableCandidate, - LinkCandidate, - ) - if isinstance(candidate, base_candidate_classes): - return candidate - return None - - -def make_install_req_from_link( - link: Link, template: InstallRequirement -) -> InstallRequirement: - assert not template.editable, "template is editable" - if template.req: - line = str(template.req) - else: - line = link.url - ireq = install_req_from_line( - line, - user_supplied=template.user_supplied, - comes_from=template.comes_from, - use_pep517=template.use_pep517, - isolated=template.isolated, - constraint=template.constraint, - global_options=template.global_options, - hash_options=template.hash_options, - config_settings=template.config_settings, - ) - ireq.original_link = template.original_link - ireq.link = link - ireq.extras = template.extras - return ireq - - -def make_install_req_from_editable( - link: Link, template: InstallRequirement -) -> InstallRequirement: - assert template.editable, "template not editable" - ireq = install_req_from_editable( - link.url, - user_supplied=template.user_supplied, - comes_from=template.comes_from, - use_pep517=template.use_pep517, - isolated=template.isolated, - constraint=template.constraint, - permit_editable_wheels=template.permit_editable_wheels, - global_options=template.global_options, - hash_options=template.hash_options, - config_settings=template.config_settings, - ) - ireq.extras = template.extras - return ireq - - -def _make_install_req_from_dist( - dist: BaseDistribution, template: InstallRequirement -) -> InstallRequirement: - if template.req: - line = str(template.req) - elif template.link: - line = f"{dist.canonical_name} @ {template.link.url}" - else: - line = f"{dist.canonical_name}=={dist.version}" - ireq = install_req_from_line( - line, - user_supplied=template.user_supplied, - comes_from=template.comes_from, - use_pep517=template.use_pep517, - isolated=template.isolated, - constraint=template.constraint, - global_options=template.global_options, - hash_options=template.hash_options, - config_settings=template.config_settings, - ) - ireq.satisfied_by = dist - return ireq - - -class _InstallRequirementBackedCandidate(Candidate): - """A candidate backed by an ``InstallRequirement``. - - This represents a package request with the target not being already - in the environment, and needs to be fetched and installed. The backing - ``InstallRequirement`` is responsible for most of the leg work; this - class exposes appropriate information to the resolver. - - :param link: The link passed to the ``InstallRequirement``. The backing - ``InstallRequirement`` will use this link to fetch the distribution. - :param source_link: The link this candidate "originates" from. This is - different from ``link`` when the link is found in the wheel cache. - ``link`` would point to the wheel cache, while this points to the - found remote link (e.g. from pypi.org). - """ - - dist: BaseDistribution - is_installed = False - - def __init__( - self, - link: Link, - source_link: Link, - ireq: InstallRequirement, - factory: "Factory", - name: Optional[NormalizedName] = None, - version: Optional[CandidateVersion] = None, - ) -> None: - self._link = link - self._source_link = source_link - self._factory = factory - self._ireq = ireq - self._name = name - self._version = version - self.dist = self._prepare() - - def __str__(self) -> str: - return f"{self.name} {self.version}" - - def __repr__(self) -> str: - return f"{self.__class__.__name__}({str(self._link)!r})" - - def __hash__(self) -> int: - return hash((self.__class__, self._link)) - - def __eq__(self, other: Any) -> bool: - if isinstance(other, self.__class__): - return links_equivalent(self._link, other._link) - return False - - @property - def source_link(self) -> Optional[Link]: - return self._source_link - - @property - def project_name(self) -> NormalizedName: - """The normalised name of the project the candidate refers to""" - if self._name is None: - self._name = self.dist.canonical_name - return self._name - - @property - def name(self) -> str: - return self.project_name - - @property - def version(self) -> CandidateVersion: - if self._version is None: - self._version = self.dist.version - return self._version - - def format_for_error(self) -> str: - return "{} {} (from {})".format( - self.name, - self.version, - self._link.file_path if self._link.is_file else self._link, - ) - - def _prepare_distribution(self) -> BaseDistribution: - raise NotImplementedError("Override in subclass") - - def _check_metadata_consistency(self, dist: BaseDistribution) -> None: - """Check for consistency of project name and version of dist.""" - if self._name is not None and self._name != dist.canonical_name: - raise MetadataInconsistent( - self._ireq, - "name", - self._name, - dist.canonical_name, - ) - if self._version is not None and self._version != dist.version: - raise MetadataInconsistent( - self._ireq, - "version", - str(self._version), - str(dist.version), - ) - - def _prepare(self) -> BaseDistribution: - try: - dist = self._prepare_distribution() - except HashError as e: - # Provide HashError the underlying ireq that caused it. This - # provides context for the resulting error message to show the - # offending line to the user. - e.req = self._ireq - raise - except InstallationSubprocessError as exc: - # The output has been presented already, so don't duplicate it. - exc.context = "See above for output." - raise - - self._check_metadata_consistency(dist) - return dist - - def iter_dependencies(self, with_requires: bool) -> Iterable[Optional[Requirement]]: - requires = self.dist.iter_dependencies() if with_requires else () - for r in requires: - yield from self._factory.make_requirements_from_spec(str(r), self._ireq) - yield self._factory.make_requires_python_requirement(self.dist.requires_python) - - def get_install_requirement(self) -> Optional[InstallRequirement]: - return self._ireq - - -class LinkCandidate(_InstallRequirementBackedCandidate): - is_editable = False - - def __init__( - self, - link: Link, - template: InstallRequirement, - factory: "Factory", - name: Optional[NormalizedName] = None, - version: Optional[CandidateVersion] = None, - ) -> None: - source_link = link - cache_entry = factory.get_wheel_cache_entry(source_link, name) - if cache_entry is not None: - logger.debug("Using cached wheel link: %s", cache_entry.link) - link = cache_entry.link - ireq = make_install_req_from_link(link, template) - assert ireq.link == link - if ireq.link.is_wheel and not ireq.link.is_file: - wheel = Wheel(ireq.link.filename) - wheel_name = canonicalize_name(wheel.name) - assert name == wheel_name, f"{name!r} != {wheel_name!r} for wheel" - # Version may not be present for PEP 508 direct URLs - if version is not None: - wheel_version = Version(wheel.version) - assert version == wheel_version, "{!r} != {!r} for wheel {}".format( - version, wheel_version, name - ) - - if cache_entry is not None: - assert ireq.link.is_wheel - assert ireq.link.is_file - if cache_entry.persistent and template.link is template.original_link: - ireq.cached_wheel_source_link = source_link - if cache_entry.origin is not None: - ireq.download_info = cache_entry.origin - else: - # Legacy cache entry that does not have origin.json. - # download_info may miss the archive_info.hashes field. - ireq.download_info = direct_url_from_link( - source_link, link_is_in_wheel_cache=cache_entry.persistent - ) - - super().__init__( - link=link, - source_link=source_link, - ireq=ireq, - factory=factory, - name=name, - version=version, - ) - - def _prepare_distribution(self) -> BaseDistribution: - preparer = self._factory.preparer - return preparer.prepare_linked_requirement(self._ireq, parallel_builds=True) - - -class EditableCandidate(_InstallRequirementBackedCandidate): - is_editable = True - - def __init__( - self, - link: Link, - template: InstallRequirement, - factory: "Factory", - name: Optional[NormalizedName] = None, - version: Optional[CandidateVersion] = None, - ) -> None: - super().__init__( - link=link, - source_link=link, - ireq=make_install_req_from_editable(link, template), - factory=factory, - name=name, - version=version, - ) - - def _prepare_distribution(self) -> BaseDistribution: - return self._factory.preparer.prepare_editable_requirement(self._ireq) - - -class AlreadyInstalledCandidate(Candidate): - is_installed = True - source_link = None - - def __init__( - self, - dist: BaseDistribution, - template: InstallRequirement, - factory: "Factory", - ) -> None: - self.dist = dist - self._ireq = _make_install_req_from_dist(dist, template) - self._factory = factory - self._version = None - - # This is just logging some messages, so we can do it eagerly. - # The returned dist would be exactly the same as self.dist because we - # set satisfied_by in _make_install_req_from_dist. - # TODO: Supply reason based on force_reinstall and upgrade_strategy. - skip_reason = "already satisfied" - factory.preparer.prepare_installed_requirement(self._ireq, skip_reason) - - def __str__(self) -> str: - return str(self.dist) - - def __repr__(self) -> str: - return f"{self.__class__.__name__}({self.dist!r})" - - def __hash__(self) -> int: - return hash((self.__class__, self.name, self.version)) - - def __eq__(self, other: Any) -> bool: - if isinstance(other, self.__class__): - return self.name == other.name and self.version == other.version - return False - - @property - def project_name(self) -> NormalizedName: - return self.dist.canonical_name - - @property - def name(self) -> str: - return self.project_name - - @property - def version(self) -> CandidateVersion: - if self._version is None: - self._version = self.dist.version - return self._version - - @property - def is_editable(self) -> bool: - return self.dist.editable - - def format_for_error(self) -> str: - return f"{self.name} {self.version} (Installed)" - - def iter_dependencies(self, with_requires: bool) -> Iterable[Optional[Requirement]]: - if not with_requires: - return - for r in self.dist.iter_dependencies(): - yield from self._factory.make_requirements_from_spec(str(r), self._ireq) - - def get_install_requirement(self) -> Optional[InstallRequirement]: - return None - - -class ExtrasCandidate(Candidate): - """A candidate that has 'extras', indicating additional dependencies. - - Requirements can be for a project with dependencies, something like - foo[extra]. The extras don't affect the project/version being installed - directly, but indicate that we need additional dependencies. We model that - by having an artificial ExtrasCandidate that wraps the "base" candidate. - - The ExtrasCandidate differs from the base in the following ways: - - 1. It has a unique name, of the form foo[extra]. This causes the resolver - to treat it as a separate node in the dependency graph. - 2. When we're getting the candidate's dependencies, - a) We specify that we want the extra dependencies as well. - b) We add a dependency on the base candidate. - See below for why this is needed. - 3. We return None for the underlying InstallRequirement, as the base - candidate will provide it, and we don't want to end up with duplicates. - - The dependency on the base candidate is needed so that the resolver can't - decide that it should recommend foo[extra1] version 1.0 and foo[extra2] - version 2.0. Having those candidates depend on foo=1.0 and foo=2.0 - respectively forces the resolver to recognise that this is a conflict. - """ - - def __init__( - self, - base: BaseCandidate, - extras: FrozenSet[str], - *, - comes_from: Optional[InstallRequirement] = None, - ) -> None: - """ - :param comes_from: the InstallRequirement that led to this candidate if it - differs from the base's InstallRequirement. This will often be the - case in the sense that this candidate's requirement has the extras - while the base's does not. Unlike the InstallRequirement backed - candidates, this requirement is used solely for reporting purposes, - it does not do any leg work. - """ - self.base = base - self.extras = frozenset(canonicalize_name(e) for e in extras) - # If any extras are requested in their non-normalized forms, keep track - # of their raw values. This is needed when we look up dependencies - # since PEP 685 has not been implemented for marker-matching, and using - # the non-normalized extra for lookup ensures the user can select a - # non-normalized extra in a package with its non-normalized form. - # TODO: Remove this attribute when packaging is upgraded to support the - # marker comparison logic specified in PEP 685. - self._unnormalized_extras = extras.difference(self.extras) - self._comes_from = comes_from if comes_from is not None else self.base._ireq - - def __str__(self) -> str: - name, rest = str(self.base).split(" ", 1) - return "{}[{}] {}".format(name, ",".join(self.extras), rest) - - def __repr__(self) -> str: - return f"{self.__class__.__name__}(base={self.base!r}, extras={self.extras!r})" - - def __hash__(self) -> int: - return hash((self.base, self.extras)) - - def __eq__(self, other: Any) -> bool: - if isinstance(other, self.__class__): - return self.base == other.base and self.extras == other.extras - return False - - @property - def project_name(self) -> NormalizedName: - return self.base.project_name - - @property - def name(self) -> str: - """The normalised name of the project the candidate refers to""" - return format_name(self.base.project_name, self.extras) - - @property - def version(self) -> CandidateVersion: - return self.base.version - - def format_for_error(self) -> str: - return "{} [{}]".format( - self.base.format_for_error(), ", ".join(sorted(self.extras)) - ) - - @property - def is_installed(self) -> bool: - return self.base.is_installed - - @property - def is_editable(self) -> bool: - return self.base.is_editable - - @property - def source_link(self) -> Optional[Link]: - return self.base.source_link - - def _warn_invalid_extras( - self, - requested: FrozenSet[str], - valid: FrozenSet[str], - ) -> None: - """Emit warnings for invalid extras being requested. - - This emits a warning for each requested extra that is not in the - candidate's ``Provides-Extra`` list. - """ - invalid_extras_to_warn = frozenset( - extra - for extra in requested - if extra not in valid - # If an extra is requested in an unnormalized form, skip warning - # about the normalized form being missing. - and extra in self.extras - ) - if not invalid_extras_to_warn: - return - for extra in sorted(invalid_extras_to_warn): - logger.warning( - "%s %s does not provide the extra '%s'", - self.base.name, - self.version, - extra, - ) - - def _calculate_valid_requested_extras(self) -> FrozenSet[str]: - """Get a list of valid extras requested by this candidate. - - The user (or upstream dependant) may have specified extras that the - candidate doesn't support. Any unsupported extras are dropped, and each - cause a warning to be logged here. - """ - requested_extras = self.extras.union(self._unnormalized_extras) - valid_extras = frozenset( - extra - for extra in requested_extras - if self.base.dist.is_extra_provided(extra) - ) - self._warn_invalid_extras(requested_extras, valid_extras) - return valid_extras - - def iter_dependencies(self, with_requires: bool) -> Iterable[Optional[Requirement]]: - factory = self.base._factory - - # Add a dependency on the exact base - # (See note 2b in the class docstring) - yield factory.make_requirement_from_candidate(self.base) - if not with_requires: - return - - valid_extras = self._calculate_valid_requested_extras() - for r in self.base.dist.iter_dependencies(valid_extras): - yield from factory.make_requirements_from_spec( - str(r), - self._comes_from, - valid_extras, - ) - - def get_install_requirement(self) -> Optional[InstallRequirement]: - # We don't return anything here, because we always - # depend on the base candidate, and we'll get the - # install requirement from that. - return None - - -class RequiresPythonCandidate(Candidate): - is_installed = False - source_link = None - - def __init__(self, py_version_info: Optional[Tuple[int, ...]]) -> None: - if py_version_info is not None: - version_info = normalize_version_info(py_version_info) - else: - version_info = sys.version_info[:3] - self._version = Version(".".join(str(c) for c in version_info)) - - # We don't need to implement __eq__() and __ne__() since there is always - # only one RequiresPythonCandidate in a resolution, i.e. the host Python. - # The built-in object.__eq__() and object.__ne__() do exactly what we want. - - def __str__(self) -> str: - return f"Python {self._version}" - - @property - def project_name(self) -> NormalizedName: - return REQUIRES_PYTHON_IDENTIFIER - - @property - def name(self) -> str: - return REQUIRES_PYTHON_IDENTIFIER - - @property - def version(self) -> CandidateVersion: - return self._version - - def format_for_error(self) -> str: - return f"Python {self.version}" - - def iter_dependencies(self, with_requires: bool) -> Iterable[Optional[Requirement]]: - return () - - def get_install_requirement(self) -> Optional[InstallRequirement]: - return None diff --git a/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py b/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py deleted file mode 100644 index 4adeb43..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py +++ /dev/null @@ -1,812 +0,0 @@ -import contextlib -import functools -import logging -from typing import ( - TYPE_CHECKING, - Dict, - FrozenSet, - Iterable, - Iterator, - List, - Mapping, - NamedTuple, - Optional, - Sequence, - Set, - Tuple, - TypeVar, - cast, -) - -from pip._vendor.packaging.requirements import InvalidRequirement -from pip._vendor.packaging.specifiers import SpecifierSet -from pip._vendor.packaging.utils import NormalizedName, canonicalize_name -from pip._vendor.resolvelib import ResolutionImpossible - -from pip._internal.cache import CacheEntry, WheelCache -from pip._internal.exceptions import ( - DistributionNotFound, - InstallationError, - MetadataInconsistent, - UnsupportedPythonVersion, - UnsupportedWheel, -) -from pip._internal.index.package_finder import PackageFinder -from pip._internal.metadata import BaseDistribution, get_default_environment -from pip._internal.models.link import Link -from pip._internal.models.wheel import Wheel -from pip._internal.operations.prepare import RequirementPreparer -from pip._internal.req.constructors import ( - install_req_drop_extras, - install_req_from_link_and_ireq, -) -from pip._internal.req.req_install import ( - InstallRequirement, - check_invalid_constraint_type, -) -from pip._internal.resolution.base import InstallRequirementProvider -from pip._internal.utils.compatibility_tags import get_supported -from pip._internal.utils.hashes import Hashes -from pip._internal.utils.packaging import get_requirement -from pip._internal.utils.virtualenv import running_under_virtualenv - -from .base import Candidate, CandidateVersion, Constraint, Requirement -from .candidates import ( - AlreadyInstalledCandidate, - BaseCandidate, - EditableCandidate, - ExtrasCandidate, - LinkCandidate, - RequiresPythonCandidate, - as_base_candidate, -) -from .found_candidates import FoundCandidates, IndexCandidateInfo -from .requirements import ( - ExplicitRequirement, - RequiresPythonRequirement, - SpecifierRequirement, - SpecifierWithoutExtrasRequirement, - UnsatisfiableRequirement, -) - -if TYPE_CHECKING: - from typing import Protocol - - class ConflictCause(Protocol): - requirement: RequiresPythonRequirement - parent: Candidate - - -logger = logging.getLogger(__name__) - -C = TypeVar("C") -Cache = Dict[Link, C] - - -class CollectedRootRequirements(NamedTuple): - requirements: List[Requirement] - constraints: Dict[str, Constraint] - user_requested: Dict[str, int] - - -class Factory: - def __init__( - self, - finder: PackageFinder, - preparer: RequirementPreparer, - make_install_req: InstallRequirementProvider, - wheel_cache: Optional[WheelCache], - use_user_site: bool, - force_reinstall: bool, - ignore_installed: bool, - ignore_requires_python: bool, - py_version_info: Optional[Tuple[int, ...]] = None, - ) -> None: - self._finder = finder - self.preparer = preparer - self._wheel_cache = wheel_cache - self._python_candidate = RequiresPythonCandidate(py_version_info) - self._make_install_req_from_spec = make_install_req - self._use_user_site = use_user_site - self._force_reinstall = force_reinstall - self._ignore_requires_python = ignore_requires_python - - self._build_failures: Cache[InstallationError] = {} - self._link_candidate_cache: Cache[LinkCandidate] = {} - self._editable_candidate_cache: Cache[EditableCandidate] = {} - self._installed_candidate_cache: Dict[str, AlreadyInstalledCandidate] = {} - self._extras_candidate_cache: Dict[ - Tuple[int, FrozenSet[NormalizedName]], ExtrasCandidate - ] = {} - - if not ignore_installed: - env = get_default_environment() - self._installed_dists = { - dist.canonical_name: dist - for dist in env.iter_installed_distributions(local_only=False) - } - else: - self._installed_dists = {} - - @property - def force_reinstall(self) -> bool: - return self._force_reinstall - - def _fail_if_link_is_unsupported_wheel(self, link: Link) -> None: - if not link.is_wheel: - return - wheel = Wheel(link.filename) - if wheel.supported(self._finder.target_python.get_unsorted_tags()): - return - msg = f"{link.filename} is not a supported wheel on this platform." - raise UnsupportedWheel(msg) - - def _make_extras_candidate( - self, - base: BaseCandidate, - extras: FrozenSet[str], - *, - comes_from: Optional[InstallRequirement] = None, - ) -> ExtrasCandidate: - cache_key = (id(base), frozenset(canonicalize_name(e) for e in extras)) - try: - candidate = self._extras_candidate_cache[cache_key] - except KeyError: - candidate = ExtrasCandidate(base, extras, comes_from=comes_from) - self._extras_candidate_cache[cache_key] = candidate - return candidate - - def _make_candidate_from_dist( - self, - dist: BaseDistribution, - extras: FrozenSet[str], - template: InstallRequirement, - ) -> Candidate: - try: - base = self._installed_candidate_cache[dist.canonical_name] - except KeyError: - base = AlreadyInstalledCandidate(dist, template, factory=self) - self._installed_candidate_cache[dist.canonical_name] = base - if not extras: - return base - return self._make_extras_candidate(base, extras, comes_from=template) - - def _make_candidate_from_link( - self, - link: Link, - extras: FrozenSet[str], - template: InstallRequirement, - name: Optional[NormalizedName], - version: Optional[CandidateVersion], - ) -> Optional[Candidate]: - base: Optional[BaseCandidate] = self._make_base_candidate_from_link( - link, template, name, version - ) - if not extras or base is None: - return base - return self._make_extras_candidate(base, extras, comes_from=template) - - def _make_base_candidate_from_link( - self, - link: Link, - template: InstallRequirement, - name: Optional[NormalizedName], - version: Optional[CandidateVersion], - ) -> Optional[BaseCandidate]: - # TODO: Check already installed candidate, and use it if the link and - # editable flag match. - - if link in self._build_failures: - # We already tried this candidate before, and it does not build. - # Don't bother trying again. - return None - - if template.editable: - if link not in self._editable_candidate_cache: - try: - self._editable_candidate_cache[link] = EditableCandidate( - link, - template, - factory=self, - name=name, - version=version, - ) - except MetadataInconsistent as e: - logger.info( - "Discarding [blue underline]%s[/]: [yellow]%s[reset]", - link, - e, - extra={"markup": True}, - ) - self._build_failures[link] = e - return None - - return self._editable_candidate_cache[link] - else: - if link not in self._link_candidate_cache: - try: - self._link_candidate_cache[link] = LinkCandidate( - link, - template, - factory=self, - name=name, - version=version, - ) - except MetadataInconsistent as e: - logger.info( - "Discarding [blue underline]%s[/]: [yellow]%s[reset]", - link, - e, - extra={"markup": True}, - ) - self._build_failures[link] = e - return None - return self._link_candidate_cache[link] - - def _iter_found_candidates( - self, - ireqs: Sequence[InstallRequirement], - specifier: SpecifierSet, - hashes: Hashes, - prefers_installed: bool, - incompatible_ids: Set[int], - ) -> Iterable[Candidate]: - if not ireqs: - return () - - # The InstallRequirement implementation requires us to give it a - # "template". Here we just choose the first requirement to represent - # all of them. - # Hopefully the Project model can correct this mismatch in the future. - template = ireqs[0] - assert template.req, "Candidates found on index must be PEP 508" - name = canonicalize_name(template.req.name) - - extras: FrozenSet[str] = frozenset() - for ireq in ireqs: - assert ireq.req, "Candidates found on index must be PEP 508" - specifier &= ireq.req.specifier - hashes &= ireq.hashes(trust_internet=False) - extras |= frozenset(ireq.extras) - - def _get_installed_candidate() -> Optional[Candidate]: - """Get the candidate for the currently-installed version.""" - # If --force-reinstall is set, we want the version from the index - # instead, so we "pretend" there is nothing installed. - if self._force_reinstall: - return None - try: - installed_dist = self._installed_dists[name] - except KeyError: - return None - # Don't use the installed distribution if its version does not fit - # the current dependency graph. - if not specifier.contains(installed_dist.version, prereleases=True): - return None - candidate = self._make_candidate_from_dist( - dist=installed_dist, - extras=extras, - template=template, - ) - # The candidate is a known incompatibility. Don't use it. - if id(candidate) in incompatible_ids: - return None - return candidate - - def iter_index_candidate_infos() -> Iterator[IndexCandidateInfo]: - result = self._finder.find_best_candidate( - project_name=name, - specifier=specifier, - hashes=hashes, - ) - icans = list(result.iter_applicable()) - - # PEP 592: Yanked releases are ignored unless the specifier - # explicitly pins a version (via '==' or '===') that can be - # solely satisfied by a yanked release. - all_yanked = all(ican.link.is_yanked for ican in icans) - - def is_pinned(specifier: SpecifierSet) -> bool: - for sp in specifier: - if sp.operator == "===": - return True - if sp.operator != "==": - continue - if sp.version.endswith(".*"): - continue - return True - return False - - pinned = is_pinned(specifier) - - # PackageFinder returns earlier versions first, so we reverse. - for ican in reversed(icans): - if not (all_yanked and pinned) and ican.link.is_yanked: - continue - func = functools.partial( - self._make_candidate_from_link, - link=ican.link, - extras=extras, - template=template, - name=name, - version=ican.version, - ) - yield ican.version, func - - return FoundCandidates( - iter_index_candidate_infos, - _get_installed_candidate(), - prefers_installed, - incompatible_ids, - ) - - def _iter_explicit_candidates_from_base( - self, - base_requirements: Iterable[Requirement], - extras: FrozenSet[str], - ) -> Iterator[Candidate]: - """Produce explicit candidates from the base given an extra-ed package. - - :param base_requirements: Requirements known to the resolver. The - requirements are guaranteed to not have extras. - :param extras: The extras to inject into the explicit requirements' - candidates. - """ - for req in base_requirements: - lookup_cand, _ = req.get_candidate_lookup() - if lookup_cand is None: # Not explicit. - continue - # We've stripped extras from the identifier, and should always - # get a BaseCandidate here, unless there's a bug elsewhere. - base_cand = as_base_candidate(lookup_cand) - assert base_cand is not None, "no extras here" - yield self._make_extras_candidate(base_cand, extras) - - def _iter_candidates_from_constraints( - self, - identifier: str, - constraint: Constraint, - template: InstallRequirement, - ) -> Iterator[Candidate]: - """Produce explicit candidates from constraints. - - This creates "fake" InstallRequirement objects that are basically clones - of what "should" be the template, but with original_link set to link. - """ - for link in constraint.links: - self._fail_if_link_is_unsupported_wheel(link) - candidate = self._make_base_candidate_from_link( - link, - template=install_req_from_link_and_ireq(link, template), - name=canonicalize_name(identifier), - version=None, - ) - if candidate: - yield candidate - - def find_candidates( - self, - identifier: str, - requirements: Mapping[str, Iterable[Requirement]], - incompatibilities: Mapping[str, Iterator[Candidate]], - constraint: Constraint, - prefers_installed: bool, - ) -> Iterable[Candidate]: - # Collect basic lookup information from the requirements. - explicit_candidates: Set[Candidate] = set() - ireqs: List[InstallRequirement] = [] - for req in requirements[identifier]: - cand, ireq = req.get_candidate_lookup() - if cand is not None: - explicit_candidates.add(cand) - if ireq is not None: - ireqs.append(ireq) - - # If the current identifier contains extras, add requires and explicit - # candidates from entries from extra-less identifier. - with contextlib.suppress(InvalidRequirement): - parsed_requirement = get_requirement(identifier) - if parsed_requirement.name != identifier: - explicit_candidates.update( - self._iter_explicit_candidates_from_base( - requirements.get(parsed_requirement.name, ()), - frozenset(parsed_requirement.extras), - ), - ) - for req in requirements.get(parsed_requirement.name, []): - _, ireq = req.get_candidate_lookup() - if ireq is not None: - ireqs.append(ireq) - - # Add explicit candidates from constraints. We only do this if there are - # known ireqs, which represent requirements not already explicit. If - # there are no ireqs, we're constraining already-explicit requirements, - # which is handled later when we return the explicit candidates. - if ireqs: - try: - explicit_candidates.update( - self._iter_candidates_from_constraints( - identifier, - constraint, - template=ireqs[0], - ), - ) - except UnsupportedWheel: - # If we're constrained to install a wheel incompatible with the - # target architecture, no candidates will ever be valid. - return () - - # Since we cache all the candidates, incompatibility identification - # can be made quicker by comparing only the id() values. - incompat_ids = {id(c) for c in incompatibilities.get(identifier, ())} - - # If none of the requirements want an explicit candidate, we can ask - # the finder for candidates. - if not explicit_candidates: - return self._iter_found_candidates( - ireqs, - constraint.specifier, - constraint.hashes, - prefers_installed, - incompat_ids, - ) - - return ( - c - for c in explicit_candidates - if id(c) not in incompat_ids - and constraint.is_satisfied_by(c) - and all(req.is_satisfied_by(c) for req in requirements[identifier]) - ) - - def _make_requirements_from_install_req( - self, ireq: InstallRequirement, requested_extras: Iterable[str] - ) -> Iterator[Requirement]: - """ - Returns requirement objects associated with the given InstallRequirement. In - most cases this will be a single object but the following special cases exist: - - the InstallRequirement has markers that do not apply -> result is empty - - the InstallRequirement has both a constraint (or link) and extras - -> result is split in two requirement objects: one with the constraint - (or link) and one with the extra. This allows centralized constraint - handling for the base, resulting in fewer candidate rejections. - """ - if not ireq.match_markers(requested_extras): - logger.info( - "Ignoring %s: markers '%s' don't match your environment", - ireq.name, - ireq.markers, - ) - elif not ireq.link: - if ireq.extras and ireq.req is not None and ireq.req.specifier: - yield SpecifierWithoutExtrasRequirement(ireq) - yield SpecifierRequirement(ireq) - else: - self._fail_if_link_is_unsupported_wheel(ireq.link) - # Always make the link candidate for the base requirement to make it - # available to `find_candidates` for explicit candidate lookup for any - # set of extras. - # The extras are required separately via a second requirement. - cand = self._make_base_candidate_from_link( - ireq.link, - template=install_req_drop_extras(ireq) if ireq.extras else ireq, - name=canonicalize_name(ireq.name) if ireq.name else None, - version=None, - ) - if cand is None: - # There's no way we can satisfy a URL requirement if the underlying - # candidate fails to build. An unnamed URL must be user-supplied, so - # we fail eagerly. If the URL is named, an unsatisfiable requirement - # can make the resolver do the right thing, either backtrack (and - # maybe find some other requirement that's buildable) or raise a - # ResolutionImpossible eventually. - if not ireq.name: - raise self._build_failures[ireq.link] - yield UnsatisfiableRequirement(canonicalize_name(ireq.name)) - else: - # require the base from the link - yield self.make_requirement_from_candidate(cand) - if ireq.extras: - # require the extras on top of the base candidate - yield self.make_requirement_from_candidate( - self._make_extras_candidate(cand, frozenset(ireq.extras)) - ) - - def collect_root_requirements( - self, root_ireqs: List[InstallRequirement] - ) -> CollectedRootRequirements: - collected = CollectedRootRequirements([], {}, {}) - for i, ireq in enumerate(root_ireqs): - if ireq.constraint: - # Ensure we only accept valid constraints - problem = check_invalid_constraint_type(ireq) - if problem: - raise InstallationError(problem) - if not ireq.match_markers(): - continue - assert ireq.name, "Constraint must be named" - name = canonicalize_name(ireq.name) - if name in collected.constraints: - collected.constraints[name] &= ireq - else: - collected.constraints[name] = Constraint.from_ireq(ireq) - else: - reqs = list( - self._make_requirements_from_install_req( - ireq, - requested_extras=(), - ) - ) - if not reqs: - continue - template = reqs[0] - if ireq.user_supplied and template.name not in collected.user_requested: - collected.user_requested[template.name] = i - collected.requirements.extend(reqs) - # Put requirements with extras at the end of the root requires. This does not - # affect resolvelib's picking preference but it does affect its initial criteria - # population: by putting extras at the end we enable the candidate finder to - # present resolvelib with a smaller set of candidates to resolvelib, already - # taking into account any non-transient constraints on the associated base. This - # means resolvelib will have fewer candidates to visit and reject. - # Python's list sort is stable, meaning relative order is kept for objects with - # the same key. - collected.requirements.sort(key=lambda r: r.name != r.project_name) - return collected - - def make_requirement_from_candidate( - self, candidate: Candidate - ) -> ExplicitRequirement: - return ExplicitRequirement(candidate) - - def make_requirements_from_spec( - self, - specifier: str, - comes_from: Optional[InstallRequirement], - requested_extras: Iterable[str] = (), - ) -> Iterator[Requirement]: - """ - Returns requirement objects associated with the given specifier. In most cases - this will be a single object but the following special cases exist: - - the specifier has markers that do not apply -> result is empty - - the specifier has both a constraint and extras -> result is split - in two requirement objects: one with the constraint and one with the - extra. This allows centralized constraint handling for the base, - resulting in fewer candidate rejections. - """ - ireq = self._make_install_req_from_spec(specifier, comes_from) - return self._make_requirements_from_install_req(ireq, requested_extras) - - def make_requires_python_requirement( - self, - specifier: SpecifierSet, - ) -> Optional[Requirement]: - if self._ignore_requires_python: - return None - # Don't bother creating a dependency for an empty Requires-Python. - if not str(specifier): - return None - return RequiresPythonRequirement(specifier, self._python_candidate) - - def get_wheel_cache_entry( - self, link: Link, name: Optional[str] - ) -> Optional[CacheEntry]: - """Look up the link in the wheel cache. - - If ``preparer.require_hashes`` is True, don't use the wheel cache, - because cached wheels, always built locally, have different hashes - than the files downloaded from the index server and thus throw false - hash mismatches. Furthermore, cached wheels at present have - nondeterministic contents due to file modification times. - """ - if self._wheel_cache is None: - return None - return self._wheel_cache.get_cache_entry( - link=link, - package_name=name, - supported_tags=get_supported(), - ) - - def get_dist_to_uninstall(self, candidate: Candidate) -> Optional[BaseDistribution]: - # TODO: Are there more cases this needs to return True? Editable? - dist = self._installed_dists.get(candidate.project_name) - if dist is None: # Not installed, no uninstallation required. - return None - - # We're installing into global site. The current installation must - # be uninstalled, no matter it's in global or user site, because the - # user site installation has precedence over global. - if not self._use_user_site: - return dist - - # We're installing into user site. Remove the user site installation. - if dist.in_usersite: - return dist - - # We're installing into user site, but the installed incompatible - # package is in global site. We can't uninstall that, and would let - # the new user installation to "shadow" it. But shadowing won't work - # in virtual environments, so we error out. - if running_under_virtualenv() and dist.in_site_packages: - message = ( - f"Will not install to the user site because it will lack " - f"sys.path precedence to {dist.raw_name} in {dist.location}" - ) - raise InstallationError(message) - return None - - def _report_requires_python_error( - self, causes: Sequence["ConflictCause"] - ) -> UnsupportedPythonVersion: - assert causes, "Requires-Python error reported with no cause" - - version = self._python_candidate.version - - if len(causes) == 1: - specifier = str(causes[0].requirement.specifier) - message = ( - f"Package {causes[0].parent.name!r} requires a different " - f"Python: {version} not in {specifier!r}" - ) - return UnsupportedPythonVersion(message) - - message = f"Packages require a different Python. {version} not in:" - for cause in causes: - package = cause.parent.format_for_error() - specifier = str(cause.requirement.specifier) - message += f"\n{specifier!r} (required by {package})" - return UnsupportedPythonVersion(message) - - def _report_single_requirement_conflict( - self, req: Requirement, parent: Optional[Candidate] - ) -> DistributionNotFound: - if parent is None: - req_disp = str(req) - else: - req_disp = f"{req} (from {parent.name})" - - cands = self._finder.find_all_candidates(req.project_name) - skipped_by_requires_python = self._finder.requires_python_skipped_reasons() - - versions_set: Set[CandidateVersion] = set() - yanked_versions_set: Set[CandidateVersion] = set() - for c in cands: - is_yanked = c.link.is_yanked if c.link else False - if is_yanked: - yanked_versions_set.add(c.version) - else: - versions_set.add(c.version) - - versions = [str(v) for v in sorted(versions_set)] - yanked_versions = [str(v) for v in sorted(yanked_versions_set)] - - if yanked_versions: - # Saying "version X is yanked" isn't entirely accurate. - # https://github.com/pypa/pip/issues/11745#issuecomment-1402805842 - logger.critical( - "Ignored the following yanked versions: %s", - ", ".join(yanked_versions) or "none", - ) - if skipped_by_requires_python: - logger.critical( - "Ignored the following versions that require a different python " - "version: %s", - "; ".join(skipped_by_requires_python) or "none", - ) - logger.critical( - "Could not find a version that satisfies the requirement %s " - "(from versions: %s)", - req_disp, - ", ".join(versions) or "none", - ) - if str(req) == "requirements.txt": - logger.info( - "HINT: You are attempting to install a package literally " - 'named "requirements.txt" (which cannot exist). Consider ' - "using the '-r' flag to install the packages listed in " - "requirements.txt" - ) - - return DistributionNotFound(f"No matching distribution found for {req}") - - def get_installation_error( - self, - e: "ResolutionImpossible[Requirement, Candidate]", - constraints: Dict[str, Constraint], - ) -> InstallationError: - assert e.causes, "Installation error reported with no cause" - - # If one of the things we can't solve is "we need Python X.Y", - # that is what we report. - requires_python_causes = [ - cause - for cause in e.causes - if isinstance(cause.requirement, RequiresPythonRequirement) - and not cause.requirement.is_satisfied_by(self._python_candidate) - ] - if requires_python_causes: - # The comprehension above makes sure all Requirement instances are - # RequiresPythonRequirement, so let's cast for convenience. - return self._report_requires_python_error( - cast("Sequence[ConflictCause]", requires_python_causes), - ) - - # Otherwise, we have a set of causes which can't all be satisfied - # at once. - - # The simplest case is when we have *one* cause that can't be - # satisfied. We just report that case. - if len(e.causes) == 1: - req, parent = e.causes[0] - if req.name not in constraints: - return self._report_single_requirement_conflict(req, parent) - - # OK, we now have a list of requirements that can't all be - # satisfied at once. - - # A couple of formatting helpers - def text_join(parts: List[str]) -> str: - if len(parts) == 1: - return parts[0] - - return ", ".join(parts[:-1]) + " and " + parts[-1] - - def describe_trigger(parent: Candidate) -> str: - ireq = parent.get_install_requirement() - if not ireq or not ireq.comes_from: - return f"{parent.name}=={parent.version}" - if isinstance(ireq.comes_from, InstallRequirement): - return str(ireq.comes_from.name) - return str(ireq.comes_from) - - triggers = set() - for req, parent in e.causes: - if parent is None: - # This is a root requirement, so we can report it directly - trigger = req.format_for_error() - else: - trigger = describe_trigger(parent) - triggers.add(trigger) - - if triggers: - info = text_join(sorted(triggers)) - else: - info = "the requested packages" - - msg = ( - f"Cannot install {info} because these package versions " - "have conflicting dependencies." - ) - logger.critical(msg) - msg = "\nThe conflict is caused by:" - - relevant_constraints = set() - for req, parent in e.causes: - if req.name in constraints: - relevant_constraints.add(req.name) - msg = msg + "\n " - if parent: - msg = msg + f"{parent.name} {parent.version} depends on " - else: - msg = msg + "The user requested " - msg = msg + req.format_for_error() - for key in relevant_constraints: - spec = constraints[key].specifier - msg += f"\n The user requested (constraint) {key}{spec}" - - msg = ( - msg - + "\n\n" - + "To fix this you could try to:\n" - + "1. loosen the range of package versions you've specified\n" - + "2. remove package versions to allow pip attempt to solve " - + "the dependency conflict\n" - ) - - logger.info(msg) - - return DistributionNotFound( - "ResolutionImpossible: for help visit " - "https://pip.pypa.io/en/latest/topics/dependency-resolution/" - "#dealing-with-dependency-conflicts" - ) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py b/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py deleted file mode 100644 index 8663097..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py +++ /dev/null @@ -1,155 +0,0 @@ -"""Utilities to lazily create and visit candidates found. - -Creating and visiting a candidate is a *very* costly operation. It involves -fetching, extracting, potentially building modules from source, and verifying -distribution metadata. It is therefore crucial for performance to keep -everything here lazy all the way down, so we only touch candidates that we -absolutely need, and not "download the world" when we only need one version of -something. -""" - -import functools -from collections.abc import Sequence -from typing import TYPE_CHECKING, Any, Callable, Iterator, Optional, Set, Tuple - -from pip._vendor.packaging.version import _BaseVersion - -from .base import Candidate - -IndexCandidateInfo = Tuple[_BaseVersion, Callable[[], Optional[Candidate]]] - -if TYPE_CHECKING: - SequenceCandidate = Sequence[Candidate] -else: - # For compatibility: Python before 3.9 does not support using [] on the - # Sequence class. - # - # >>> from collections.abc import Sequence - # >>> Sequence[str] - # Traceback (most recent call last): - # File "<stdin>", line 1, in <module> - # TypeError: 'ABCMeta' object is not subscriptable - # - # TODO: Remove this block after dropping Python 3.8 support. - SequenceCandidate = Sequence - - -def _iter_built(infos: Iterator[IndexCandidateInfo]) -> Iterator[Candidate]: - """Iterator for ``FoundCandidates``. - - This iterator is used when the package is not already installed. Candidates - from index come later in their normal ordering. - """ - versions_found: Set[_BaseVersion] = set() - for version, func in infos: - if version in versions_found: - continue - candidate = func() - if candidate is None: - continue - yield candidate - versions_found.add(version) - - -def _iter_built_with_prepended( - installed: Candidate, infos: Iterator[IndexCandidateInfo] -) -> Iterator[Candidate]: - """Iterator for ``FoundCandidates``. - - This iterator is used when the resolver prefers the already-installed - candidate and NOT to upgrade. The installed candidate is therefore - always yielded first, and candidates from index come later in their - normal ordering, except skipped when the version is already installed. - """ - yield installed - versions_found: Set[_BaseVersion] = {installed.version} - for version, func in infos: - if version in versions_found: - continue - candidate = func() - if candidate is None: - continue - yield candidate - versions_found.add(version) - - -def _iter_built_with_inserted( - installed: Candidate, infos: Iterator[IndexCandidateInfo] -) -> Iterator[Candidate]: - """Iterator for ``FoundCandidates``. - - This iterator is used when the resolver prefers to upgrade an - already-installed package. Candidates from index are returned in their - normal ordering, except replaced when the version is already installed. - - The implementation iterates through and yields other candidates, inserting - the installed candidate exactly once before we start yielding older or - equivalent candidates, or after all other candidates if they are all newer. - """ - versions_found: Set[_BaseVersion] = set() - for version, func in infos: - if version in versions_found: - continue - # If the installed candidate is better, yield it first. - if installed.version >= version: - yield installed - versions_found.add(installed.version) - candidate = func() - if candidate is None: - continue - yield candidate - versions_found.add(version) - - # If the installed candidate is older than all other candidates. - if installed.version not in versions_found: - yield installed - - -class FoundCandidates(SequenceCandidate): - """A lazy sequence to provide candidates to the resolver. - - The intended usage is to return this from `find_matches()` so the resolver - can iterate through the sequence multiple times, but only access the index - page when remote packages are actually needed. This improve performances - when suitable candidates are already installed on disk. - """ - - def __init__( - self, - get_infos: Callable[[], Iterator[IndexCandidateInfo]], - installed: Optional[Candidate], - prefers_installed: bool, - incompatible_ids: Set[int], - ): - self._get_infos = get_infos - self._installed = installed - self._prefers_installed = prefers_installed - self._incompatible_ids = incompatible_ids - - def __getitem__(self, index: Any) -> Any: - # Implemented to satisfy the ABC check. This is not needed by the - # resolver, and should not be used by the provider either (for - # performance reasons). - raise NotImplementedError("don't do this") - - def __iter__(self) -> Iterator[Candidate]: - infos = self._get_infos() - if not self._installed: - iterator = _iter_built(infos) - elif self._prefers_installed: - iterator = _iter_built_with_prepended(self._installed, infos) - else: - iterator = _iter_built_with_inserted(self._installed, infos) - return (c for c in iterator if id(c) not in self._incompatible_ids) - - def __len__(self) -> int: - # Implemented to satisfy the ABC check. This is not needed by the - # resolver, and should not be used by the provider either (for - # performance reasons). - raise NotImplementedError("don't do this") - - @functools.lru_cache(maxsize=1) - def __bool__(self) -> bool: - if self._prefers_installed and self._installed: - return True - return any(self) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/provider.py b/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/provider.py deleted file mode 100644 index 315fb9c..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/provider.py +++ /dev/null @@ -1,255 +0,0 @@ -import collections -import math -from typing import ( - TYPE_CHECKING, - Dict, - Iterable, - Iterator, - Mapping, - Sequence, - TypeVar, - Union, -) - -from pip._vendor.resolvelib.providers import AbstractProvider - -from .base import Candidate, Constraint, Requirement -from .candidates import REQUIRES_PYTHON_IDENTIFIER -from .factory import Factory - -if TYPE_CHECKING: - from pip._vendor.resolvelib.providers import Preference - from pip._vendor.resolvelib.resolvers import RequirementInformation - - PreferenceInformation = RequirementInformation[Requirement, Candidate] - - _ProviderBase = AbstractProvider[Requirement, Candidate, str] -else: - _ProviderBase = AbstractProvider - -# Notes on the relationship between the provider, the factory, and the -# candidate and requirement classes. -# -# The provider is a direct implementation of the resolvelib class. Its role -# is to deliver the API that resolvelib expects. -# -# Rather than work with completely abstract "requirement" and "candidate" -# concepts as resolvelib does, pip has concrete classes implementing these two -# ideas. The API of Requirement and Candidate objects are defined in the base -# classes, but essentially map fairly directly to the equivalent provider -# methods. In particular, `find_matches` and `is_satisfied_by` are -# requirement methods, and `get_dependencies` is a candidate method. -# -# The factory is the interface to pip's internal mechanisms. It is stateless, -# and is created by the resolver and held as a property of the provider. It is -# responsible for creating Requirement and Candidate objects, and provides -# services to those objects (access to pip's finder and preparer). - - -D = TypeVar("D") -V = TypeVar("V") - - -def _get_with_identifier( - mapping: Mapping[str, V], - identifier: str, - default: D, -) -> Union[D, V]: - """Get item from a package name lookup mapping with a resolver identifier. - - This extra logic is needed when the target mapping is keyed by package - name, which cannot be directly looked up with an identifier (which may - contain requested extras). Additional logic is added to also look up a value - by "cleaning up" the extras from the identifier. - """ - if identifier in mapping: - return mapping[identifier] - # HACK: Theoretically we should check whether this identifier is a valid - # "NAME[EXTRAS]" format, and parse out the name part with packaging or - # some regular expression. But since pip's resolver only spits out three - # kinds of identifiers: normalized PEP 503 names, normalized names plus - # extras, and Requires-Python, we can cheat a bit here. - name, open_bracket, _ = identifier.partition("[") - if open_bracket and name in mapping: - return mapping[name] - return default - - -class PipProvider(_ProviderBase): - """Pip's provider implementation for resolvelib. - - :params constraints: A mapping of constraints specified by the user. Keys - are canonicalized project names. - :params ignore_dependencies: Whether the user specified ``--no-deps``. - :params upgrade_strategy: The user-specified upgrade strategy. - :params user_requested: A set of canonicalized package names that the user - supplied for pip to install/upgrade. - """ - - def __init__( - self, - factory: Factory, - constraints: Dict[str, Constraint], - ignore_dependencies: bool, - upgrade_strategy: str, - user_requested: Dict[str, int], - ) -> None: - self._factory = factory - self._constraints = constraints - self._ignore_dependencies = ignore_dependencies - self._upgrade_strategy = upgrade_strategy - self._user_requested = user_requested - self._known_depths: Dict[str, float] = collections.defaultdict(lambda: math.inf) - - def identify(self, requirement_or_candidate: Union[Requirement, Candidate]) -> str: - return requirement_or_candidate.name - - def get_preference( - self, - identifier: str, - resolutions: Mapping[str, Candidate], - candidates: Mapping[str, Iterator[Candidate]], - information: Mapping[str, Iterable["PreferenceInformation"]], - backtrack_causes: Sequence["PreferenceInformation"], - ) -> "Preference": - """Produce a sort key for given requirement based on preference. - - The lower the return value is, the more preferred this group of - arguments is. - - Currently pip considers the following in order: - - * Prefer if any of the known requirements is "direct", e.g. points to an - explicit URL. - * If equal, prefer if any requirement is "pinned", i.e. contains - operator ``===`` or ``==``. - * If equal, calculate an approximate "depth" and resolve requirements - closer to the user-specified requirements first. If the depth cannot - by determined (eg: due to no matching parents), it is considered - infinite. - * Order user-specified requirements by the order they are specified. - * If equal, prefers "non-free" requirements, i.e. contains at least one - operator, such as ``>=`` or ``<``. - * If equal, order alphabetically for consistency (helps debuggability). - """ - try: - next(iter(information[identifier])) - except StopIteration: - # There is no information for this identifier, so there's no known - # candidates. - has_information = False - else: - has_information = True - - if has_information: - lookups = (r.get_candidate_lookup() for r, _ in information[identifier]) - candidate, ireqs = zip(*lookups) - else: - candidate, ireqs = None, () - - operators = [ - specifier.operator - for specifier_set in (ireq.specifier for ireq in ireqs if ireq) - for specifier in specifier_set - ] - - direct = candidate is not None - pinned = any(op[:2] == "==" for op in operators) - unfree = bool(operators) - - try: - requested_order: Union[int, float] = self._user_requested[identifier] - except KeyError: - requested_order = math.inf - if has_information: - parent_depths = ( - self._known_depths[parent.name] if parent is not None else 0.0 - for _, parent in information[identifier] - ) - inferred_depth = min(d for d in parent_depths) + 1.0 - else: - inferred_depth = math.inf - else: - inferred_depth = 1.0 - self._known_depths[identifier] = inferred_depth - - requested_order = self._user_requested.get(identifier, math.inf) - - # Requires-Python has only one candidate and the check is basically - # free, so we always do it first to avoid needless work if it fails. - requires_python = identifier == REQUIRES_PYTHON_IDENTIFIER - - # Prefer the causes of backtracking on the assumption that the problem - # resolving the dependency tree is related to the failures that caused - # the backtracking - backtrack_cause = self.is_backtrack_cause(identifier, backtrack_causes) - - return ( - not requires_python, - not direct, - not pinned, - not backtrack_cause, - inferred_depth, - requested_order, - not unfree, - identifier, - ) - - def find_matches( - self, - identifier: str, - requirements: Mapping[str, Iterator[Requirement]], - incompatibilities: Mapping[str, Iterator[Candidate]], - ) -> Iterable[Candidate]: - def _eligible_for_upgrade(identifier: str) -> bool: - """Are upgrades allowed for this project? - - This checks the upgrade strategy, and whether the project was one - that the user specified in the command line, in order to decide - whether we should upgrade if there's a newer version available. - - (Note that we don't need access to the `--upgrade` flag, because - an upgrade strategy of "to-satisfy-only" means that `--upgrade` - was not specified). - """ - if self._upgrade_strategy == "eager": - return True - elif self._upgrade_strategy == "only-if-needed": - user_order = _get_with_identifier( - self._user_requested, - identifier, - default=None, - ) - return user_order is not None - return False - - constraint = _get_with_identifier( - self._constraints, - identifier, - default=Constraint.empty(), - ) - return self._factory.find_candidates( - identifier=identifier, - requirements=requirements, - constraint=constraint, - prefers_installed=(not _eligible_for_upgrade(identifier)), - incompatibilities=incompatibilities, - ) - - def is_satisfied_by(self, requirement: Requirement, candidate: Candidate) -> bool: - return requirement.is_satisfied_by(candidate) - - def get_dependencies(self, candidate: Candidate) -> Sequence[Requirement]: - with_requires = not self._ignore_dependencies - return [r for r in candidate.iter_dependencies(with_requires) if r is not None] - - @staticmethod - def is_backtrack_cause( - identifier: str, backtrack_causes: Sequence["PreferenceInformation"] - ) -> bool: - for backtrack_cause in backtrack_causes: - if identifier == backtrack_cause.requirement.name: - return True - if backtrack_cause.parent and identifier == backtrack_cause.parent.name: - return True - return False diff --git a/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/reporter.py b/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/reporter.py deleted file mode 100644 index 12adeff..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/reporter.py +++ /dev/null @@ -1,80 +0,0 @@ -from collections import defaultdict -from logging import getLogger -from typing import Any, DefaultDict - -from pip._vendor.resolvelib.reporters import BaseReporter - -from .base import Candidate, Requirement - -logger = getLogger(__name__) - - -class PipReporter(BaseReporter): - def __init__(self) -> None: - self.reject_count_by_package: DefaultDict[str, int] = defaultdict(int) - - self._messages_at_reject_count = { - 1: ( - "pip is looking at multiple versions of {package_name} to " - "determine which version is compatible with other " - "requirements. This could take a while." - ), - 8: ( - "pip is still looking at multiple versions of {package_name} to " - "determine which version is compatible with other " - "requirements. This could take a while." - ), - 13: ( - "This is taking longer than usual. You might need to provide " - "the dependency resolver with stricter constraints to reduce " - "runtime. See https://pip.pypa.io/warnings/backtracking for " - "guidance. If you want to abort this run, press Ctrl + C." - ), - } - - def rejecting_candidate(self, criterion: Any, candidate: Candidate) -> None: - self.reject_count_by_package[candidate.name] += 1 - - count = self.reject_count_by_package[candidate.name] - if count not in self._messages_at_reject_count: - return - - message = self._messages_at_reject_count[count] - logger.info("INFO: %s", message.format(package_name=candidate.name)) - - msg = "Will try a different candidate, due to conflict:" - for req_info in criterion.information: - req, parent = req_info.requirement, req_info.parent - # Inspired by Factory.get_installation_error - msg += "\n " - if parent: - msg += f"{parent.name} {parent.version} depends on " - else: - msg += "The user requested " - msg += req.format_for_error() - logger.debug(msg) - - -class PipDebuggingReporter(BaseReporter): - """A reporter that does an info log for every event it sees.""" - - def starting(self) -> None: - logger.info("Reporter.starting()") - - def starting_round(self, index: int) -> None: - logger.info("Reporter.starting_round(%r)", index) - - def ending_round(self, index: int, state: Any) -> None: - logger.info("Reporter.ending_round(%r, state)", index) - - def ending(self, state: Any) -> None: - logger.info("Reporter.ending(%r)", state) - - def adding_requirement(self, requirement: Requirement, parent: Candidate) -> None: - logger.info("Reporter.adding_requirement(%r, %r)", requirement, parent) - - def rejecting_candidate(self, criterion: Any, candidate: Candidate) -> None: - logger.info("Reporter.rejecting_candidate(%r, %r)", criterion, candidate) - - def pinning(self, candidate: Candidate) -> None: - logger.info("Reporter.pinning(%r)", candidate) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py b/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py deleted file mode 100644 index 4af4a9f..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py +++ /dev/null @@ -1,166 +0,0 @@ -from pip._vendor.packaging.specifiers import SpecifierSet -from pip._vendor.packaging.utils import NormalizedName, canonicalize_name - -from pip._internal.req.constructors import install_req_drop_extras -from pip._internal.req.req_install import InstallRequirement - -from .base import Candidate, CandidateLookup, Requirement, format_name - - -class ExplicitRequirement(Requirement): - def __init__(self, candidate: Candidate) -> None: - self.candidate = candidate - - def __str__(self) -> str: - return str(self.candidate) - - def __repr__(self) -> str: - return f"{self.__class__.__name__}({self.candidate!r})" - - @property - def project_name(self) -> NormalizedName: - # No need to canonicalize - the candidate did this - return self.candidate.project_name - - @property - def name(self) -> str: - # No need to canonicalize - the candidate did this - return self.candidate.name - - def format_for_error(self) -> str: - return self.candidate.format_for_error() - - def get_candidate_lookup(self) -> CandidateLookup: - return self.candidate, None - - def is_satisfied_by(self, candidate: Candidate) -> bool: - return candidate == self.candidate - - -class SpecifierRequirement(Requirement): - def __init__(self, ireq: InstallRequirement) -> None: - assert ireq.link is None, "This is a link, not a specifier" - self._ireq = ireq - self._extras = frozenset(canonicalize_name(e) for e in self._ireq.extras) - - def __str__(self) -> str: - return str(self._ireq.req) - - def __repr__(self) -> str: - return f"{self.__class__.__name__}({str(self._ireq.req)!r})" - - @property - def project_name(self) -> NormalizedName: - assert self._ireq.req, "Specifier-backed ireq is always PEP 508" - return canonicalize_name(self._ireq.req.name) - - @property - def name(self) -> str: - return format_name(self.project_name, self._extras) - - def format_for_error(self) -> str: - # Convert comma-separated specifiers into "A, B, ..., F and G" - # This makes the specifier a bit more "human readable", without - # risking a change in meaning. (Hopefully! Not all edge cases have - # been checked) - parts = [s.strip() for s in str(self).split(",")] - if len(parts) == 0: - return "" - elif len(parts) == 1: - return parts[0] - - return ", ".join(parts[:-1]) + " and " + parts[-1] - - def get_candidate_lookup(self) -> CandidateLookup: - return None, self._ireq - - def is_satisfied_by(self, candidate: Candidate) -> bool: - assert candidate.name == self.name, ( - f"Internal issue: Candidate is not for this requirement " - f"{candidate.name} vs {self.name}" - ) - # We can safely always allow prereleases here since PackageFinder - # already implements the prerelease logic, and would have filtered out - # prerelease candidates if the user does not expect them. - assert self._ireq.req, "Specifier-backed ireq is always PEP 508" - spec = self._ireq.req.specifier - return spec.contains(candidate.version, prereleases=True) - - -class SpecifierWithoutExtrasRequirement(SpecifierRequirement): - """ - Requirement backed by an install requirement on a base package. - Trims extras from its install requirement if there are any. - """ - - def __init__(self, ireq: InstallRequirement) -> None: - assert ireq.link is None, "This is a link, not a specifier" - self._ireq = install_req_drop_extras(ireq) - self._extras = frozenset(canonicalize_name(e) for e in self._ireq.extras) - - -class RequiresPythonRequirement(Requirement): - """A requirement representing Requires-Python metadata.""" - - def __init__(self, specifier: SpecifierSet, match: Candidate) -> None: - self.specifier = specifier - self._candidate = match - - def __str__(self) -> str: - return f"Python {self.specifier}" - - def __repr__(self) -> str: - return f"{self.__class__.__name__}({str(self.specifier)!r})" - - @property - def project_name(self) -> NormalizedName: - return self._candidate.project_name - - @property - def name(self) -> str: - return self._candidate.name - - def format_for_error(self) -> str: - return str(self) - - def get_candidate_lookup(self) -> CandidateLookup: - if self.specifier.contains(self._candidate.version, prereleases=True): - return self._candidate, None - return None, None - - def is_satisfied_by(self, candidate: Candidate) -> bool: - assert candidate.name == self._candidate.name, "Not Python candidate" - # We can safely always allow prereleases here since PackageFinder - # already implements the prerelease logic, and would have filtered out - # prerelease candidates if the user does not expect them. - return self.specifier.contains(candidate.version, prereleases=True) - - -class UnsatisfiableRequirement(Requirement): - """A requirement that cannot be satisfied.""" - - def __init__(self, name: NormalizedName) -> None: - self._name = name - - def __str__(self) -> str: - return f"{self._name} (unavailable)" - - def __repr__(self) -> str: - return f"{self.__class__.__name__}({str(self._name)!r})" - - @property - def project_name(self) -> NormalizedName: - return self._name - - @property - def name(self) -> str: - return self._name - - def format_for_error(self) -> str: - return str(self) - - def get_candidate_lookup(self) -> CandidateLookup: - return None, None - - def is_satisfied_by(self, candidate: Candidate) -> bool: - return False diff --git a/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py b/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py deleted file mode 100644 index c12beef..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py +++ /dev/null @@ -1,317 +0,0 @@ -import contextlib -import functools -import logging -import os -from typing import TYPE_CHECKING, Dict, List, Optional, Set, Tuple, cast - -from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.resolvelib import BaseReporter, ResolutionImpossible -from pip._vendor.resolvelib import Resolver as RLResolver -from pip._vendor.resolvelib.structs import DirectedGraph - -from pip._internal.cache import WheelCache -from pip._internal.index.package_finder import PackageFinder -from pip._internal.operations.prepare import RequirementPreparer -from pip._internal.req.constructors import install_req_extend_extras -from pip._internal.req.req_install import InstallRequirement -from pip._internal.req.req_set import RequirementSet -from pip._internal.resolution.base import BaseResolver, InstallRequirementProvider -from pip._internal.resolution.resolvelib.provider import PipProvider -from pip._internal.resolution.resolvelib.reporter import ( - PipDebuggingReporter, - PipReporter, -) -from pip._internal.utils.packaging import get_requirement - -from .base import Candidate, Requirement -from .factory import Factory - -if TYPE_CHECKING: - from pip._vendor.resolvelib.resolvers import Result as RLResult - - Result = RLResult[Requirement, Candidate, str] - - -logger = logging.getLogger(__name__) - - -class Resolver(BaseResolver): - _allowed_strategies = {"eager", "only-if-needed", "to-satisfy-only"} - - def __init__( - self, - preparer: RequirementPreparer, - finder: PackageFinder, - wheel_cache: Optional[WheelCache], - make_install_req: InstallRequirementProvider, - use_user_site: bool, - ignore_dependencies: bool, - ignore_installed: bool, - ignore_requires_python: bool, - force_reinstall: bool, - upgrade_strategy: str, - py_version_info: Optional[Tuple[int, ...]] = None, - ): - super().__init__() - assert upgrade_strategy in self._allowed_strategies - - self.factory = Factory( - finder=finder, - preparer=preparer, - make_install_req=make_install_req, - wheel_cache=wheel_cache, - use_user_site=use_user_site, - force_reinstall=force_reinstall, - ignore_installed=ignore_installed, - ignore_requires_python=ignore_requires_python, - py_version_info=py_version_info, - ) - self.ignore_dependencies = ignore_dependencies - self.upgrade_strategy = upgrade_strategy - self._result: Optional[Result] = None - - def resolve( - self, root_reqs: List[InstallRequirement], check_supported_wheels: bool - ) -> RequirementSet: - collected = self.factory.collect_root_requirements(root_reqs) - provider = PipProvider( - factory=self.factory, - constraints=collected.constraints, - ignore_dependencies=self.ignore_dependencies, - upgrade_strategy=self.upgrade_strategy, - user_requested=collected.user_requested, - ) - if "PIP_RESOLVER_DEBUG" in os.environ: - reporter: BaseReporter = PipDebuggingReporter() - else: - reporter = PipReporter() - resolver: RLResolver[Requirement, Candidate, str] = RLResolver( - provider, - reporter, - ) - - try: - limit_how_complex_resolution_can_be = 200000 - result = self._result = resolver.resolve( - collected.requirements, max_rounds=limit_how_complex_resolution_can_be - ) - - except ResolutionImpossible as e: - error = self.factory.get_installation_error( - cast("ResolutionImpossible[Requirement, Candidate]", e), - collected.constraints, - ) - raise error from e - - req_set = RequirementSet(check_supported_wheels=check_supported_wheels) - # process candidates with extras last to ensure their base equivalent is - # already in the req_set if appropriate. - # Python's sort is stable so using a binary key function keeps relative order - # within both subsets. - for candidate in sorted( - result.mapping.values(), key=lambda c: c.name != c.project_name - ): - ireq = candidate.get_install_requirement() - if ireq is None: - if candidate.name != candidate.project_name: - # extend existing req's extras - with contextlib.suppress(KeyError): - req = req_set.get_requirement(candidate.project_name) - req_set.add_named_requirement( - install_req_extend_extras( - req, get_requirement(candidate.name).extras - ) - ) - continue - - # Check if there is already an installation under the same name, - # and set a flag for later stages to uninstall it, if needed. - installed_dist = self.factory.get_dist_to_uninstall(candidate) - if installed_dist is None: - # There is no existing installation -- nothing to uninstall. - ireq.should_reinstall = False - elif self.factory.force_reinstall: - # The --force-reinstall flag is set -- reinstall. - ireq.should_reinstall = True - elif installed_dist.version != candidate.version: - # The installation is different in version -- reinstall. - ireq.should_reinstall = True - elif candidate.is_editable or installed_dist.editable: - # The incoming distribution is editable, or different in - # editable-ness to installation -- reinstall. - ireq.should_reinstall = True - elif candidate.source_link and candidate.source_link.is_file: - # The incoming distribution is under file:// - if candidate.source_link.is_wheel: - # is a local wheel -- do nothing. - logger.info( - "%s is already installed with the same version as the " - "provided wheel. Use --force-reinstall to force an " - "installation of the wheel.", - ireq.name, - ) - continue - - # is a local sdist or path -- reinstall - ireq.should_reinstall = True - else: - continue - - link = candidate.source_link - if link and link.is_yanked: - # The reason can contain non-ASCII characters, Unicode - # is required for Python 2. - msg = ( - "The candidate selected for download or install is a " - "yanked version: {name!r} candidate (version {version} " - "at {link})\nReason for being yanked: {reason}" - ).format( - name=candidate.name, - version=candidate.version, - link=link, - reason=link.yanked_reason or "<none given>", - ) - logger.warning(msg) - - req_set.add_named_requirement(ireq) - - reqs = req_set.all_requirements - self.factory.preparer.prepare_linked_requirements_more(reqs) - for req in reqs: - req.prepared = True - req.needs_more_preparation = False - return req_set - - def get_installation_order( - self, req_set: RequirementSet - ) -> List[InstallRequirement]: - """Get order for installation of requirements in RequirementSet. - - The returned list contains a requirement before another that depends on - it. This helps ensure that the environment is kept consistent as they - get installed one-by-one. - - The current implementation creates a topological ordering of the - dependency graph, giving more weight to packages with less - or no dependencies, while breaking any cycles in the graph at - arbitrary points. We make no guarantees about where the cycle - would be broken, other than it *would* be broken. - """ - assert self._result is not None, "must call resolve() first" - - if not req_set.requirements: - # Nothing is left to install, so we do not need an order. - return [] - - graph = self._result.graph - weights = get_topological_weights(graph, set(req_set.requirements.keys())) - - sorted_items = sorted( - req_set.requirements.items(), - key=functools.partial(_req_set_item_sorter, weights=weights), - reverse=True, - ) - return [ireq for _, ireq in sorted_items] - - -def get_topological_weights( - graph: "DirectedGraph[Optional[str]]", requirement_keys: Set[str] -) -> Dict[Optional[str], int]: - """Assign weights to each node based on how "deep" they are. - - This implementation may change at any point in the future without prior - notice. - - We first simplify the dependency graph by pruning any leaves and giving them - the highest weight: a package without any dependencies should be installed - first. This is done again and again in the same way, giving ever less weight - to the newly found leaves. The loop stops when no leaves are left: all - remaining packages have at least one dependency left in the graph. - - Then we continue with the remaining graph, by taking the length for the - longest path to any node from root, ignoring any paths that contain a single - node twice (i.e. cycles). This is done through a depth-first search through - the graph, while keeping track of the path to the node. - - Cycles in the graph result would result in node being revisited while also - being on its own path. In this case, take no action. This helps ensure we - don't get stuck in a cycle. - - When assigning weight, the longer path (i.e. larger length) is preferred. - - We are only interested in the weights of packages that are in the - requirement_keys. - """ - path: Set[Optional[str]] = set() - weights: Dict[Optional[str], int] = {} - - def visit(node: Optional[str]) -> None: - if node in path: - # We hit a cycle, so we'll break it here. - return - - # Time to visit the children! - path.add(node) - for child in graph.iter_children(node): - visit(child) - path.remove(node) - - if node not in requirement_keys: - return - - last_known_parent_count = weights.get(node, 0) - weights[node] = max(last_known_parent_count, len(path)) - - # Simplify the graph, pruning leaves that have no dependencies. - # This is needed for large graphs (say over 200 packages) because the - # `visit` function is exponentially slower then, taking minutes. - # See https://github.com/pypa/pip/issues/10557 - # We will loop until we explicitly break the loop. - while True: - leaves = set() - for key in graph: - if key is None: - continue - for _child in graph.iter_children(key): - # This means we have at least one child - break - else: - # No child. - leaves.add(key) - if not leaves: - # We are done simplifying. - break - # Calculate the weight for the leaves. - weight = len(graph) - 1 - for leaf in leaves: - if leaf not in requirement_keys: - continue - weights[leaf] = weight - # Remove the leaves from the graph, making it simpler. - for leaf in leaves: - graph.remove(leaf) - - # Visit the remaining graph. - # `None` is guaranteed to be the root node by resolvelib. - visit(None) - - # Sanity check: all requirement keys should be in the weights, - # and no other keys should be in the weights. - difference = set(weights.keys()).difference(requirement_keys) - assert not difference, difference - - return weights - - -def _req_set_item_sorter( - item: Tuple[str, InstallRequirement], - weights: Dict[Optional[str], int], -) -> Tuple[int, str]: - """Key function used to sort install requirements for installation. - - Based on the "weight" mapping calculated in ``get_installation_order()``. - The canonical package name is returned as the second member as a tie- - breaker to ensure the result is predictable, which is useful in tests. - """ - name = canonicalize_name(item[0]) - return weights[name], name diff --git a/venv/lib/python3.12/site-packages/pip/_internal/self_outdated_check.py b/venv/lib/python3.12/site-packages/pip/_internal/self_outdated_check.py deleted file mode 100644 index 0f64ae0..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/self_outdated_check.py +++ /dev/null @@ -1,248 +0,0 @@ -import datetime -import functools -import hashlib -import json -import logging -import optparse -import os.path -import sys -from dataclasses import dataclass -from typing import Any, Callable, Dict, Optional - -from pip._vendor.packaging.version import parse as parse_version -from pip._vendor.rich.console import Group -from pip._vendor.rich.markup import escape -from pip._vendor.rich.text import Text - -from pip._internal.index.collector import LinkCollector -from pip._internal.index.package_finder import PackageFinder -from pip._internal.metadata import get_default_environment -from pip._internal.metadata.base import DistributionVersion -from pip._internal.models.selection_prefs import SelectionPreferences -from pip._internal.network.session import PipSession -from pip._internal.utils.compat import WINDOWS -from pip._internal.utils.entrypoints import ( - get_best_invocation_for_this_pip, - get_best_invocation_for_this_python, -) -from pip._internal.utils.filesystem import adjacent_tmp_file, check_path_owner, replace -from pip._internal.utils.misc import ensure_dir - -_WEEK = datetime.timedelta(days=7) - -logger = logging.getLogger(__name__) - - -def _get_statefile_name(key: str) -> str: - key_bytes = key.encode() - name = hashlib.sha224(key_bytes).hexdigest() - return name - - -def _convert_date(isodate: str) -> datetime.datetime: - """Convert an ISO format string to a date. - - Handles the format 2020-01-22T14:24:01Z (trailing Z) - which is not supported by older versions of fromisoformat. - """ - return datetime.datetime.fromisoformat(isodate.replace("Z", "+00:00")) - - -class SelfCheckState: - def __init__(self, cache_dir: str) -> None: - self._state: Dict[str, Any] = {} - self._statefile_path = None - - # Try to load the existing state - if cache_dir: - self._statefile_path = os.path.join( - cache_dir, "selfcheck", _get_statefile_name(self.key) - ) - try: - with open(self._statefile_path, encoding="utf-8") as statefile: - self._state = json.load(statefile) - except (OSError, ValueError, KeyError): - # Explicitly suppressing exceptions, since we don't want to - # error out if the cache file is invalid. - pass - - @property - def key(self) -> str: - return sys.prefix - - def get(self, current_time: datetime.datetime) -> Optional[str]: - """Check if we have a not-outdated version loaded already.""" - if not self._state: - return None - - if "last_check" not in self._state: - return None - - if "pypi_version" not in self._state: - return None - - # Determine if we need to refresh the state - last_check = _convert_date(self._state["last_check"]) - time_since_last_check = current_time - last_check - if time_since_last_check > _WEEK: - return None - - return self._state["pypi_version"] - - def set(self, pypi_version: str, current_time: datetime.datetime) -> None: - # If we do not have a path to cache in, don't bother saving. - if not self._statefile_path: - return - - # Check to make sure that we own the directory - if not check_path_owner(os.path.dirname(self._statefile_path)): - return - - # Now that we've ensured the directory is owned by this user, we'll go - # ahead and make sure that all our directories are created. - ensure_dir(os.path.dirname(self._statefile_path)) - - state = { - # Include the key so it's easy to tell which pip wrote the - # file. - "key": self.key, - "last_check": current_time.isoformat(), - "pypi_version": pypi_version, - } - - text = json.dumps(state, sort_keys=True, separators=(",", ":")) - - with adjacent_tmp_file(self._statefile_path) as f: - f.write(text.encode()) - - try: - # Since we have a prefix-specific state file, we can just - # overwrite whatever is there, no need to check. - replace(f.name, self._statefile_path) - except OSError: - # Best effort. - pass - - -@dataclass -class UpgradePrompt: - old: str - new: str - - def __rich__(self) -> Group: - if WINDOWS: - pip_cmd = f"{get_best_invocation_for_this_python()} -m pip" - else: - pip_cmd = get_best_invocation_for_this_pip() - - notice = "[bold][[reset][blue]notice[reset][bold]][reset]" - return Group( - Text(), - Text.from_markup( - f"{notice} A new release of pip is available: " - f"[red]{self.old}[reset] -> [green]{self.new}[reset]" - ), - Text.from_markup( - f"{notice} To update, run: " - f"[green]{escape(pip_cmd)} install --upgrade pip" - ), - ) - - -def was_installed_by_pip(pkg: str) -> bool: - """Checks whether pkg was installed by pip - - This is used not to display the upgrade message when pip is in fact - installed by system package manager, such as dnf on Fedora. - """ - dist = get_default_environment().get_distribution(pkg) - return dist is not None and "pip" == dist.installer - - -def _get_current_remote_pip_version( - session: PipSession, options: optparse.Values -) -> Optional[str]: - # Lets use PackageFinder to see what the latest pip version is - link_collector = LinkCollector.create( - session, - options=options, - suppress_no_index=True, - ) - - # Pass allow_yanked=False so we don't suggest upgrading to a - # yanked version. - selection_prefs = SelectionPreferences( - allow_yanked=False, - allow_all_prereleases=False, # Explicitly set to False - ) - - finder = PackageFinder.create( - link_collector=link_collector, - selection_prefs=selection_prefs, - ) - best_candidate = finder.find_best_candidate("pip").best_candidate - if best_candidate is None: - return None - - return str(best_candidate.version) - - -def _self_version_check_logic( - *, - state: SelfCheckState, - current_time: datetime.datetime, - local_version: DistributionVersion, - get_remote_version: Callable[[], Optional[str]], -) -> Optional[UpgradePrompt]: - remote_version_str = state.get(current_time) - if remote_version_str is None: - remote_version_str = get_remote_version() - if remote_version_str is None: - logger.debug("No remote pip version found") - return None - state.set(remote_version_str, current_time) - - remote_version = parse_version(remote_version_str) - logger.debug("Remote version of pip: %s", remote_version) - logger.debug("Local version of pip: %s", local_version) - - pip_installed_by_pip = was_installed_by_pip("pip") - logger.debug("Was pip installed by pip? %s", pip_installed_by_pip) - if not pip_installed_by_pip: - return None # Only suggest upgrade if pip is installed by pip. - - local_version_is_older = ( - local_version < remote_version - and local_version.base_version != remote_version.base_version - ) - if local_version_is_older: - return UpgradePrompt(old=str(local_version), new=remote_version_str) - - return None - - -def pip_self_version_check(session: PipSession, options: optparse.Values) -> None: - """Check for an update for pip. - - Limit the frequency of checks to once per week. State is stored either in - the active virtualenv or in the user's USER_CACHE_DIR keyed off the prefix - of the pip script path. - """ - installed_dist = get_default_environment().get_distribution("pip") - if not installed_dist: - return - - try: - upgrade_prompt = _self_version_check_logic( - state=SelfCheckState(cache_dir=options.cache_dir), - current_time=datetime.datetime.now(datetime.timezone.utc), - local_version=installed_dist.version, - get_remote_version=functools.partial( - _get_current_remote_pip_version, session, options - ), - ) - if upgrade_prompt is not None: - logger.warning("%s", upgrade_prompt, extra={"rich": True}) - except Exception: - logger.warning("There was an error checking the latest version of pip.") - logger.debug("See below for error", exc_info=True) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/__init__.py b/venv/lib/python3.12/site-packages/pip/_internal/utils/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index c7f948e3fe63bec8d46fbfc386619c6fb20b379e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212 zcmZ9GJqp4=5QVcwL4+K{A{o?HtgOAlvL-{aWdGQmM1lvgv-d0>!xKolRBl=yym{X| zrkHn@ZIY<+d2i<Y%;R6<GB%H7NVe?qO8g>j<9ss(Xskxif<g~xTXq@^1t3&dd!h3{ zvTV`kmAx5dMTH)EG(9MJ1vgM*&7s)sAxOg9iLw<n25`~=mxj<Ap`atF0`OQ!;=FLf Yv_5KEbqY^@6@OsSVTNzY81reQANtullmGw# diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc deleted file mode 100644 index b71e2a5eae0eb62eaa33fe6ec33da0179501f1a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4553 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_log.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_log.cpython-312.pyc deleted file mode 100644 index a5d3f30f6e73618eb4dbe4f7c1c9b2375c6e7779..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1883 zcmZux&2QX96rZuZ>y3BQ<)hG2DrE$hSW3KwN@)*()GrEB*-EXb&|X}}Gub%x+F@ok z>4qF~=m9QJB&75Zp$KsRDx@CyAGkCWRAeD>fJ<+wHWE@#yl1aBP1Psudv9l+-^}~X z@4a6qCmjM3e*4+te<mUS;Ga?|BWJh(&L-icLpbF|Ogj{;85=#bWA?0$MG3b$6@y$P zymE{1s-R1aGReNZ3;9txHn&BM*Mz-b@rhejXM)$c1J)TBZe#7IbA6@LUbH4yoOZiW z(si8kVj)U|Vqw0OuM5e-I8cf$q>|}H!LDPpklu=r^QjWkp69vOSx@N2lzWa7C6V?= z38!7wgG_8*urP>Y!NG$xf(6NdrI1XrUdsD1oTwKAod=bd@w!4^Do%19VL5Hr$jmdz zAhW_i=|@di3UR%Z+Q=DBgR@Bl0rW`6;Iw0MLs;At6>h<=!mA54ZUYY0LDj8glh=wu zio@1EDPUp6-x<ac5&(w<Y*aDca5fezB6b`Ga_z#EvzM=4V3C6I^r{dE`>_4~Whj!f z^B2y3e9_CpGP9?;nH9*c%BnY33oC{0%cLC|WffqN4p`mrG^kBtkae;I-m{{|->lQF zv2J`vf38Mk-Ta<@Nv{%@=6JzXGkbJF*UBs<;suFF$q7`*No9e;I-aDh#k40{y+Es# z*7-E-_e7#qON&@^Wzd^dItp(HIm^@4Bu)b^WNSqvE3G)1Z!Hht{gad4TW_~iq{ZxV z5Z(y7LbaBo<(3~MTF4}bTYVkHs)hXUmIs+VLUiqw18-1L>s7qn6sQgIXY<JC`m38? z+}yIaU%ua*+t$A|=YCk(Y0llR%?%-hxOP_a{UqoK-_IQ1FNg(x!}mY!2k~gf_I;j) zuxu(VC3cE@5!8=FzJ&e@sO(bVKZSI<MIIYwrMBzP%BedicL|tnm79BEZhql=xL72? z?=uSzlyz`J3aXSUIC$#t15lepkN5VUQ<w9AEMfFBvQF-fzPURh06zBGS%4IKc)x9C z*nD3zk*L0e{!06j9RPXM)j-;UgMz!3L@MOvXZ9#xHZkr)m&(^*U*YkrK<YTgqdJBg zs5Z#I_2xH|TdNPJPV7vbxOe!$)ZBymsry!e&4G@^({e13-cMt(G^RFej6`E}E@l1n zDfFI)lt!NC!fA;WB{2KUwcA%jH&VdK=iq{ETedWS!17Lq!G<kzbusP7IK`eb&v3%Q z981|4uxWQD|0?o?$D)KmD|q8p@O*G#RQh>{JOmeQyA}C5*zAxhXWuy-y~T?(0?set z)M+EJFkT)-HRf&BczX6q2AkMC>J3mEWUoOgjfd8;9qZWEyT4oRUsnC0b#%u%x^-mR z{ll8c^SDON*tT1j*nGups(P>t%qp4%Um-s{t6s{dbI~nFa5-lKL+{|lp48qcy74{v zChQ`A)EQ8_CZ+VTQK8oG5TVV#$?@G9sZVa$dsUmBx_xo8{dIeffV+Fxpr>!2+a+M` Od^AL}=h$>Mzw`g8&dXu| diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc deleted file mode 100644 index eef2b747d961abb7a7eb67ffd43d60607891cce0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2427 zcma)8O>7fK6y9C0z0PhNyHKE{&@O~Ptp+b8NV%j{B~ZAaP?YrIL#@s3#9n8;yP6rt zN$Rvog+w^PjUZLUy@BA6V~!k=dWlJ-&~17uJ@jUjUW$6?n^`-F(zNg-&zqk&@6CMQ zd$ay2l~M%|>xZvPiwQyajSV`Yv^(41LFb-e3wgm7ZOIk$BG*!00v&T>6*(`9Y)y9K zl|){FejFw31WHcIwsKR>ciG*1CW%x&o3OiX#`D_0W>uJtEE7mZ$>R_gJZRt{H7jLP zbAPGhC5PyiZzH{i&4B2%g!F0T**-?LZU%wvV4_!iyXqpH`a1Es1xB=rJ$>4AtBB|( zMylmk0+TuuU^eMvZe&$4Mjq7zCx{|Um;~ii2#IvZqp;-oo(|!`FGe-&P^5SEREb#x z&qZw7Rnv862lOd~0>>+I&lC|#^uQ!!Ks7yEM{r`w?Q|Ra0oZ_7bCM#g!)Cqh434Q= zCDSV+JE#7^xERffp?u9D6m)msniP&+VK)vHxVmRnP?(6WYKhFgEi&jB{I)MZb5Ec< zYh|fzu}9T`$0yR`_R5%$jg5{#xGo4_R%yw{St(2w+DL~zRf2HAGOZFSz(KMij)O14 zBIvKNQSvLusF;*Y8&`a*T7hd5gCZ9JP?ht9I@T1z=WV~{xxQ&5YydFRhU-ii!7Rk` z26LZWGzb8FJ}|8*2C)I`7zIWL_Dt8PQpY7m`!u;=7PD;TO@^K02s8`AmUehkJKfYy zH-=WwhBmw=4{yVQ5GvR=D?pO97YB9$j@E1FybW4)h8NobGA~hvHkUHg(|##;?Vk~Z zy7ais2$t&7m|(}|V|4*?^8Y<)2Y7;g9p>g^Z`hwYXn*G<z`Hy;@<_r-u)@rAPW{Hn zS-v;v6pgHc**(G(XWurd$;b~SpM)}0RVj=+giXk0-|<2f%><D3%r-0Y{NN7pA?70O zI$m|A;5t*Nz_t>0X&nT!`-Mjf71Q!bAxbkIorS{3VDVk}k*}ax5MDBdPc^kujdLqs zKE1l3U0b-arF7k@E!J+$FV5c`-%xsAqz^A?t%Pu_Z{hmSO3zmBi3jKIpL;NHf1vU0 zs<Phu`BM6&mbx=^duUTT+0;%h`|Db6P0rzN2yt+R1h4`b0&OG*)srnweFPA8Q<hg; z>Ox)Yurwyn&MPaF8P@v*s!@Xcigogf^AaX(6W1JX1gF6~8xLb-mW0X9gTTRw2ukn6 zEi3KfPgv5oamFX0&zsZGA?%%ivQgAq^~L(#ndi!fTj~Br@nLN}J+zh_;%N6ZwZ6vH zmFm;thBmq;k47-<JT2g1r;z@J!CS&~d>5vJ%7?*W$DYU?IEo?wxC88e0l0U^y!ZyX z;+(EnU1YxNV)=kFqbwu1lzTe8UEL`mJ5dzpU>Yb>Mlt)8jf?~SjO4JZQgx{ll?o6! zcyUfP5Vf*N+zZS2ebz)3#vZ@IPKBlUFsedca&Z#44#n><rwXqh6tqc(EO9V=@%Hi@ zX7)KCxF5ED3_s#Pvyb%5dz+cF&CJ<GZMFZ|rH#xNYv~(n$r~?IM>bRa%@m}>>XBz> zHd5CYMmot-d#-%&B6D<UW+@G|)_v&C@a^I6r3dPLbsh3$x>0KG7FAXp&-R2$p<w$~ zp};S}?;j@UEc<q1_Nay$y!g37^o_^tb%>CO5sLXkAIcNH??y?_)0o}p5mX#AW$e99 z4o80oKEnerWGPA*F|C*=im#-EC~s#3QT;_we-)1XE?j6OMDf$*%Pj#^<MK9BuacT* zG++wU${DVn_HDD#s}r(#U0fb(2~0n{6zSE$Z9Z-t>Jp7*t0jPH*bfJPbpB*rezt!A DV#+La diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compat.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compat.cpython-312.pyc deleted file mode 100644 index c31ef1cdc95d0e51d43fc1a33d9f739ff55c72ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2230 zcmaJCOKclObavOV*BhG@JCKl4v8AQ0X%mNren_JVs<a{y#UU;=u_~=L-m$&Tde_X1 z<EA7fR7g#vN=YeFg7^w9R7L8QBRz58k~EbfwmDS51x}_Z66%RJ>$pwRh>>>Q%=^## z?Jwc5f?#F7`XGNcfY9&!QeVFH!`fePm`4UmBSSDmOGpbI6w{&yrL>eohV-qF_K64! z1y5sLNeyEEb)j}j2MiyUv!c=Pu`eAo{8)i|W7cN`;2z2&L;g-khp|+6{&5ZbR(Rn_ zoDr;RJ||FBKwC>1%IH3X&IzOmIK+awg`P&vk$!qyjD^m>on+-~R%LmesfL-&VnS8Z zUO!@+se|Jz@7U@X5KPCWs%{%<$<kTYAw|V7DI?}cnQ>CbpWN0!Omagx%(Rlu@><z6 z+(ya_%N)^4qdDpZQhfuxiB!_{6U@rQ&TRCLr$K^mtp~Pw6y!-j7Meuk;x5F*I_qvk zBmoU0+gCy7q+wLyNs=tFC`}3inh=sG<{KcK{d7!lLw!kYa5yn|av+)PkNI4mMycgC z_7zJGVJ8W3h}&8+OC8!6whf1Ll!*o2c6Gp`EFy!Fm`H*EyffumRrSI9@w`*S@uJS? zSiINCl#3868fVzTIieTaDKj&pn6w*C#kL&Xz$6ap$Ks$lUh*Q^)$z)~I5in=FX@?4 zJ%?!=yohV2%`mZbE6(lHc*ZG0AUjIqZXmByjaih0!G)*bqc6iYg{ophL->vyz1tN1 zceU}^dq`*q|0;*762J%l_)){*yNxZ2z7`q+_KUs%x)h8`p9oRO_3;#C)~gkW2sOax zCE!!Q&Lj4a_9*y<aD6=yWR!7UZx!ktR7U`u*pRY<e*<Ct_(*4ghk4UF4?SA9G%0Mb zv_;QN2=&e=@JDW1li~(x9=J{Gku(&KnB3^~woR;XEkvKhO`y7cx^siA=Ktf|+EdSd zOI>aPeU1$AOR=u~q7akx7$ikeVGVf=r1B*0r7Cn<hvMOT9ZXf*VQSW~ET^K<@uFqg zqqN(ja>+bnCE6X2=S-F_k90tdK~a`;uK-JB%Zk6&b!Zp#cBV{u(`)2VSLcz=&aRsN zK}*kI14f2P)oj_$@aE?;qgJY_QN}8B9!`)9I0N)I`rhNC!*k&+uK^C!h7Qd;Wy?@8 zv<EBemNl;C996IA<Lj^KCb~&MM<VI<YPXuoW7~VQ3ikE->r{uR8QtE?)Df%_tV1yP zOI;<Q4J1w_`uh{9^YO<dj;Sfrvb;dmMiCDo#EjHc(pboAI-N1%iVk&sP6^wtoY01P z69fIjgja{#kfls#uAee**fnG<hhoCZ%=Md;2j2C09D(&0#H1Qk%o?toH7(5LDDNcj zm+<-}{Niof;XtpzHihoDBDv`@nd`Y7P*=lEv#FWX-03e4etqn-V?RW0?6|gLY5U>j z@R4b8HTul_(JMz6PF(F-iSAj7?wOWXWo1^Lk>?_pL)8chHBTk(htamkY-Of0dtv6n zf^oZP*B>p<%~!5e7TDFvm6rWWE&He6tjaZB2}Ro$PA{BVeDR&dwxQ)naxs)#1E<h& z?x^dp4Kz1Up*fS_tSjpzSJDZ^u2eB?SIStXE7~j;aRZuWI2lcI1D2D^nRbpuxCV)i z!=FLZApJlK!r!AG$e6gYrrCNC1Jch00OK2R9LpPlAO(4mU|!bZ#V3#}*MCi}0zoH? zR-nXPA6G*7aJz=c4gg-5AILpL$0%F)I5`M7KI`Zu*kE!B!r!7GMArOBXu5-fcaZX% z^6FHe>PO1<>6VpX+fuM?;plR3_msctSA^EN<~0PM+SV#G&(SIZut3*1xc9n%nmVT% zA(o9#%^sLJu%hf-Qg(jx(z3GemXi8DdE@N0vp>GO)PCYt`<b7}&y|~%#i27dKl~`* GIr<;shab8C diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc deleted file mode 100644 index f2a8a114da7280548168a9f3b99bc33903420bca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5578 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-312.pyc deleted file mode 100644 index 2df15ff183b16be9ddb1fd5098389599f675b3c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 701 zcmZuvzi$&U6t?etNmMSVQW;?CAsC2IV}6JYSV-C0g)Pg;J)7J$cjw4<5(QEz14}2^ z+6i?8bz$UxU;%YNvKWw<*aBhd#Pg8|3Gt-&zW3hwz4!U~J~W$a2qby^JpBpy%>^rI zES<#-aE=g1UBof>a@@t-7ak{|0ccJ5PaC}cf^^BmYc-y=A4?UDQ&C2PY!HoEX>?>{ zl%yi*M<x{!XGTPD#$<(PuYGr8b}g9*rfg8i(xlesY+`Fln4u~Yf62o^0P5n!2+R>O zVE@RzxAOktzB~PooG#-7-{94!|J6>>6i>a=<?I78^{1rYLFfr;;oX*R8}1VB0+u+> z21WwsR-jykBF?z!%B|N1y=){(?Gllbb4^oO2wE_sN3<i8VIg2k)QDX46f3s0$&$WM zTU?IITrw^cg$5&<XM1!oF{v!?wr}5|Ix}Kxz>+@e2~A<!G|oyRRLOEWG+D0cie-B+ zu^Sb|IMZ<sj8$w>R;ng&s)OoVU}oq`c<JTN;m+r9^HaEa7G9lgFEhv2Pl6MD7T%m~ zf4#8&>fYglkL2<KYEUb%^*H7-iDTt{8S4WFOZKG9tL|@+x(I0%f;n&8FC-u4;-T7r q(7ix4c<y72e|Q*^MGfKgd5z#J$H^Q4yt!7vyGIqg@BDJfs^f1R*{neT diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc deleted file mode 100644 index 5cf2c034f58b1edd36bfececc912d3565b51759f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4203 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-312.pyc deleted file mode 100644 index 53e0f71dd457f74dba535921579b365d038ef595..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3580 zcma)8O>7&-6`tiT$tAfINr~c*{>Vn66UwznMJ@saag#bu0V%D7)@~ax1r`){B(6*@ z+1aIBNn{`dK`UPxxjjfm&{_ckB!zWQPPz72pcgSxL3$wr0a~Ewje>O2sc)8Ck``#F z19IM*nfKnjnR)Mh`wzF<iJ)cvvXT9rfY86_z-*2dbM{AIc94W5CWrD&ieV^k$yxGj zip_H=E^kd)^R|@Dm}hhLJfGqXp36D%&Xm*OtvOd-ND08(FelluTjH^M$tF2I;Zl8) z(-?D0oaBPB$AKiT<i<SAGuR!5{iQza1r2VAmpq?XQ@%AJ?)xuwFwW@wLQ#_oN;((k zbk~naCM&PvS!Jo9JMPE?XS83CoNfo!n6v*fqf!R+xSz<%eW0#lTFZ)BK`fCR4B6F; zsyih^l}_oLlFnn@MzB^QO2$HWZ8aNE7XD{@FuQ}wXoWGCI`nCaWl))sm~|LcEX%0E zYE;u`pvRefhicTi(Vn*UB(r6UWLYsE##{#4+ro<RxLsmRNqFeX?Irqsm*o(8+VXnc zP0yihUwI0zX`_9L_sbU8uZI^+n=kRD-?Y=A<Y#4eWw0|gx&Pn7)7E=2NV$IHNdl&Q z^CYTe4t>mAd76-^*P&#rx91WIzW0!)QPc6Y%#t8P0w-BlhC4P*uFRT}RI7ETmb)l! zTTi}QP*yR~qUmTmHKJMphDEs;CHOZbi26KMw5X~PSy`T1XQS^#*ZGag^^M9q8<lmp zT3T#oMuDu|x?sjHm}~JqonKAoWGSs--6^ZGqH1X+gLO`ZJR^2+Lbm~vPiuq*q|VZ$ za%2kmysU|`L}={mTsEy{bz8bv#EL{{=<7oFW;(Z0kd-(`T(CrF@aV2ChjqsiNiS2^ zRh8O{Lc6FWvV}ZOz{cuo;!Yt`GS(9s&f#T}&ficqIddPA8&ctck}ISoOcJYDSxw~R z#YAyU%NCTGsp;1fs;uD~#dPL=dKs$;xT%CFD;g$HaS|m>&Z&t`u@JL3SHwh}Dz53V zuIaQY7IE?B&7|0xBzOrE4A(@)z+IZsDilq$iN53dYFx0&1&_IKy+5!!_~`qa@7KNk zo3kf&-}dBA;!)y@H;(Ps>-@m>dM)@`HTYUx2z<KmaG@qdszPLM=*zLs#}0<RiF_TY zP0v-Q=gwG5$a#t^4(CJHxeYn}+jBb$j~2f8@YpeJSlRjL(MMH2w&kk320wlK;oCJ= z<XcyyE)3R$k*YAVn|dNX7Hgx^)zRsH3a|g$6W*PCl6aihf8*FQbI8vedS)(}vHNQF zv2X2Tb>3IwLsdSs8~N(Z+V$I2_=RsD^Y1>hd#Q@Ld-ur)k3ZOxk4BT#V6w_5sSkle zE^r1Hf^?@^D3J`Ncb4g{tnIpc8>DuS)?Vw*VKWOfE44+N#Ozzl*?rc`V#o|`{vO2< zEXi7WF^A(8LaPcHfG*Aws!!+(8DSY`NECRL?inSc(CfjjhlW5GO*>?q%D`WZK(~ob zT>cXwxa&L;#!uY-UFq08er{z2TLZCH8=*4uI+p`b(gU;?WfcNVe2~RBCuY)_EY7rw zFGwQ9!=H}N?wH_1XD>DKht8Gs0vRYbZJ6n(nwL~z%WSL2u`hw09uQ+{{~Elja20FC zR<;m(+1j#Xt=N^pGSjvTKyta28Pi6^u6fMWGN<|4JiF2Z5X!L2K4U@@oXu~_cPNBF z>lW`)*bH`7OwI&sGTF5^>IJ46{WLL}sdM$75~}bZHDqdbXvI->5MSBx88TpCq_bjj zpP@gq75+-EXe1e}%<psNO<wI;+&T}@P9Ky|sMGsteZ{JVC6VA&DC`9V*4vpu=;1Gz zTaXa+660Ro1_28nPt7VHSjL*T2vrm6xk$4@g#f1CQ7!7H>wpB*wwMN)bV<wVeme6& zhT2=wM6;yp0+ls=Xyzk@l_m@fcEdzR#{<sb-^x(qm1SB$nwa9CFeB0rI>TuLd*V(q zL9In;7lTfB!6{7Nn+JZCPBWr$F-^^Bm{I9vQK)IQW;O74R|8VWi!_(XO^~EU)HoE5 zP1LX<UikgS#~UYsa4nFm29gK<Z-&1fJ__90ay|159r8n48}(SS7JIK6d#^5dYeK9l z#GsU4b5{9Rw%9{=WY2fXBjJ@(0r{^T3bDh1SUoiPaQ4)R{9}j0==PiS(0DDBtcH>Y zLr0;vwq{Q}p}KeA#22djBQ^g-)jv@m8n2K4;M~sj_cfeoXsi~VsfK6HJ-pZ1K)l1* z=ts`Jnq#!;7(I4G41Isi8?SofVC7HYdU&*@Vdtm@2O0wM`nR~cKeRLdXnxD_%;m2K zBHJJCF?$nV#y^km4Id8N*t+wgsgb>jW8bSitQkcyZkhjaykECzYejfVLbF$o01QvH zVR$NEkZ?|&>fF5Xu+2!J^{x3867H#FJP$3Vdg#S<1KXz{AXTIK>%JG4+mX(~$C82K zM!na$#X=!xy!T&`;lB|U7yMh`WGRP#NN&Mi6g^Z8x(3TI%yTsSA9U{s-FuEEpQGe+ z^u317&jb(T1_JUo)gXUY&*-Qz#WA+8Sh#G)cHlUpq~S$BXMV+;vPs5SclI?5Ix?|$ V_wi4g{M@`jzq9t8TS3O~>VKZC3mgCd diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc deleted file mode 100644 index b7611e81af94bf3cc76b4432bcc1a92b65c63b47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3243 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-312.pyc deleted file mode 100644 index ef0d1e9aea9c3d4c2ebfacd05418252bf5113473..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2175 zcma)7&2JM&6rcUf#&+U><2p$pY)C0_P;3$t1PukLB<Y7}s0v7x0a=@!iL=gn*WDQd zNgXw<D%Ghfk*J4QYE|XX0~I}R?Elb<jfD~|NImq#%_5vo51m<OZB*sJ$UE=%zUIAo z``-GmuC4%}OaJw&#Z3`_e;DI0WgqNa<N(+LHvj~XGeNpZxishTe46*DkQONAO))Q} zrM#S$Ie<W}+dr&Lp|HSHO;20mBPe>B!#>}pQ1UdrZHbSd>}lTe`8I_eo~ExY@ex!! z&4AChDePR}vmNPfBq14vQO^S3PnGOJhhX3Wr941<?wz)Wk6`d2trA=52n?Yx?4sTx z?EX$n_bzks@N=e`i}S8{#lXast``d?T9JxmVeH(B%*goJmChy|n@253jXZ5?qA5yE zw6qkO$Q3`h`sp>y?yuX>u(CJbd;j(=JUVi7?AG1H?Nf1Agc{LY*+Hb}So(gFEE^!v zN1)H%zupTbOy;d=aC;JfTRZ@(+$vuJIcD|0RpR^$WA4Yk5+Lj}Z?!d$8vwZuU*4uA z-uKmc4qO8wpfNhzdLO}-9ps=e0BBwo%}FQ;P=wL|fb!A^05pDxcx}x5a$UZ6o0bGW z9<@FGrnakMNnGPU0pD^ZF&A#1=A(!E0E(<Z4!S4o@Z)+_eA7xCU`G!5QF8~4hvLV% z$KhTMkZ8;LfWh$d_I<8_c<0Iwmlu(~q-yH?GC^3y#G$>UF4ztg(GF9It?IVpAf1@Y zDnx_=l`J9^S<SW!1XQ|aHPf8e=sDEfv~|ryi7X-o2Q47#3w`4eYKKu=HH{^t+682d z#8ul;KU*e?ww0ROV@(=(PTLPSY<tdlPdMyK8rBVCHXd?VzqtWSG>72323d3k6Ired z5lslW5-ykqaf35+m#<ELJojPd^BGshNOSZ>SI#<iv4CB<nWEc!P>!yEm$7@8svug> ziYD=sk4uisLJRYD-c@|5E1HId*qC8zi&=84AnGfeT(t8jnb!!ulbp8oVjfupCkZl9 z*3t4~m>BvJa>k&2*D`GlA}4tVS$C4AF`q0n3z8V0NMeJau>vivmPI&OFbc_xVG-n5 znwcyT!^BBHlSE<J4QfSVXPTvO25Bzr%ZVFwTLUi@FfjN6@Y3XZS6L{3u^SBEzqEd- zl6n$6wi}84B2+H_tW*Nk$nZ{Nv=$kCaIPLX^Eh;-AyJox0uDvD0-J%#WW8r-`}p>F zwdceOAW8AENDtcJHipXQD`Gu(<hQqXhElbm)T8MqL+77G)t%_cTJ+=tu^t^O&+bP0 ztC17c&<VQl#*S{SZm$0H_4b#wSbQgTx)wYAC{~Z1FMmYS*_zs%s@$tbMjnSo8bKPT z5dxu}`%~*v&y?;RWw@pcZ_m_~(Z|Z{ANo#Wx|W!(Cua8qJ|s8j9pycGXAqCNGV2N* zJ8Uvs-a$@`0hufpXrDXm`{vO9Kj12~*)un;&z^HT_tE%SH`Ice4`yEHuFSN|QWGsj zYT|V>%3YahcB|wK7ws(KxZzAjvn-ov#IP-#$+#W5oi7+Ba@c@-FYR~W9Ao$>-Cijd z@-{4*=%SOPESm`YC*2wX$8pa<*HiZEd<p`8gTaOj<k0t-Z!#O%syMhS1$U%qO^R;Z ztBR_}_0^=l%BiaO?g88zSvJDT5Wgm_!Sdurv?6Q_)PhH9^3gq@aD1Z|g!{|$_jBvH bYJaNUeP%7#kb5|J12q68+rmpmyqo<8s$lht diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-312.pyc deleted file mode 100644 index f8842515a39db4b6c093f39750bc4b1b92194b21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4010 zcmb7HUu+Y}8K1S+f8zXcoIg%34P{7x$Xv2+52y|fkRYIh2m)$oX<Z>};~mFq_Fre# z4yI0(N+%ttS3ypd0=ix=NGE~B3y-|Es?>+R*h<@QOR83FdFV@(gS2XS>NmUIIMB4T zBk#=Y?94a6`Mz&{-{)Vox5p5a+)uw(_(v;3f8sBG2{$?~J`@mIMha2{4Q0Gm$O!Ix zAQN!gU?vD{Koj*)CZvZmVS&#JY7sq}iMoAJYtdtw81zF*hy;sCf174o>~Hq{-pA;Z z!2dU23I7M_1HQ~=3)028V5Wn_=piMdL<@mTJb(x);^rK`M><ISVZeJkjc%b_U=E%u z-3TopB~l#r=QZ0ZdI*~1WhwAsuL!djP^LraP+CZsgh<z0@P$80jCAKkrS<(#rU&|6 z`GC^)zL@E4^xL7ItO&V);7XWBsrX;G(CJjb5znd2cA^(7TQv<?O9_ss%c=ow<nr0+ z(-$t!I6+IbUJ8<fu8R`6MjTP5bIb`-Vwb3qYXIc(P_Xg5_$G9gk<G{4QfwUCf9Gv6 zwEfNND}sMu0of7%ds7WFC>4;O!<OU3u&J!!c`92Lp*U|+ENdDzH3joe70Xl&n@O=4 zhB66fG^v_{85Int!3CMYqhLnLgp1j>1S=%38bp!sDUy>*j9@d5RmMt$xw2%cGS!&F zd1~tT;>k;sqnK5gWXX166ze6;RxOR-ixs<I8f+BX1)@?6SYV$V*D;LAhJtmI*{(d0 z4s&#XQ|4l27oTb{8^97}6axavFe~Nra7+%jf^AhNAY>bAJV$H~o^F-_yLaqMCf5lm ztFldC6O~~LOzZ7$QM0TnAO`CsSC9>r>8=vzWomF7-nM|$1*xc%0D2gAvDzTmz@T|* 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-312.pyc deleted file mode 100644 index ef5de02120bf533ffebaeba019756d8906383157..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7475 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-312.pyc deleted file mode 100644 index 41da543510969cc61fca245e6b0521f2882099d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1181 zcmZ8f&2JM&6rb5I+Z()2jDkR1mV^UaDZ6SwNQf^{YD6Rys>DFFmu0g%j<@WWX2uR) zzI^DRRWEKY<b*haxbSCGDhDhoVeJVCIOJwE?S)fkHim|bG{5)ez2BSp&Aj=uT2%oX z-jjRnR{{X<`Qr1CCeF@F<~#;BfDdfoLthACB-jGvz8H#;WJ}DKY}uD>1qrC+D=py& zt3hSIbdFiSY*+ThD@9yIa!at)eYvS3cfg+77q9X-QjwBzJ5^wXqkX{F*r_#CZAt$0 zPm-<mW{i4v=t>YG+Dnlh#H|EJE)9~{RJU0LFkmh>J86iRQzmH`P;{4OlDXLq4IwL= z)Wzm{w#XuMJu`FdJA2V-tTh|Ut4r6HR}DEU6_mRfXY68_O@hp+6xlF~+`PJG@2O<; zEJ$<BUix8A)DS178^wOR=;B;!URv2h%ca<jP_AG^J2>_rzsO{W%<{Rj%-}JgUvl@s zi;3?;-jg3WYu|V=SwDdHA^qHS&;=Owgq~<f*_oB%M7@bS>@i#VZLZ_C9uVEty(A`q zk1+Cem#t&n#a=t;BE7|4-`wVhH?J5X=KJPym~0}P*DtMHzPfa?vFC1vfGeCKvOW;@ z6M?ROqE<VJki{BDy4LrJ*NIR}iA7O}Hn1Bl5E^)Q5MJ<;%{WY4Cc^5XxNC*Mx|Q~5 zJBd%4-!58&HFqI(y*us(B32rtmJ`Gj;n)qW4h=$LajE>H5Hs!NwSYL2J2*UnXPBBp zY?2cU`rw0FADsHt+?pAxN8hT)hU&35>U{t5sHFa->BEvfsvR6nP46%+ST<^T$#ML| zbDUgZCj{{Z<_*XXGa2R=8D=5Fi~{2AzEkbi)kfpm|IdSEUL+EV^P1zhah%ZNHxtLf z3QOS<hcX9^Go|$;2@B!R0j~4#G=op&b5Y`VLUaKiWlP=~@;igE2qFAifKd8Z0r1F2 zu<)*axL+I1o$hM`dEjlG9JGI{y#c4kf-)!ct3P)Jt6TGfwO=0X00jzT4IKaG*~Qm$ zXTPSO9nGEpI&ywAJO4Bu&YpVta5&reqdJ_u@fy^}iVSDA=Es1Ur^o-{rqKK!^DaLM diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-312.pyc deleted file mode 100644 index 3879a9bf951e0c48b76184bd858bf2d3b6b36250..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2359 zcmb7_&2JM&6u@V9z4qFhkU;DN2sB&1k_BS(aj2m5BZZXmQBx5>C2DIe>v6n^y}Ozj zCzv`?T2(5QdZ4OQf>f0tA(aZLe?V_J_hK*-VX0KAa_P+_IiU2?H*0T-LoOX@-@bV> zZ)SGhZ{Pd1y*-AYnLm7**V_>KlXrp^YATB^DA!RIWrYG7ZM=n10s3M=EJ~wNF*F(y zP*%bcmN&uNoR|%L5gHA*SY)t7S}b9(C}0U;8Ou4b=@|iQv@Gb#Uwr$tE_%utmsyT& z6g>G{$t_?nOfV}E+vF31CW0ctvzP>N9WfyoxZ6}N3p6Gm#^?Agu#X^JxN_*MzarJf z3f3i4o5X~|jv8gevd8vn4$;z%jWsK$*$&f66s(P@NjTpY-zn2{$~2rZreo(o^?KJH zWn~xBpU@&d%d(rwJ4Ku-8jMb+jyYzjh;2qw3>WYiF^YqfS>^;LgIQ<FE;vROlhh=( zCsT0Plv`$b$3B?ce;`FIh6i24oG`{PO}Unv%2+nT1g<VsVpf5s{Iew8vKL?LR0Ie> zVR&d9#0+|>_SaPXzIyV(;Cr>flhx2k!f9!_cNq-+z5fCV+&jod8|M*O)w06G07674 zi&4b5r{Bi;maAG;y4#H4G^(H(@Tj2i=&DK34WjrF>^3b-ixqJMZAZ+9n$KqZll;ck z1zJwpfruoai>NG4q07=mG$rVvD{p^5tfE26npFhIcmxcNo#x~kp<Wf>CIt>nHY1(% z<SENOcp&X{9UaLWPoK}6KJm`c%!T2zBPY(Jb;XltnR<#_Fj&qZMNf377YQhlsavp^ zw{D05a+gXB4-?`LFLGw2p~Nm2g;K+)OJ3)gUCMA$gEM(T#)~uoq&ys&rV$n1BoYYT zqZq^tT53az`eo&_%C)KckyjQvy6U1L$A9bHdh_s&!_{4{*Lsgsm5mE(Z&lsC(AD!K zvGZYK&%MN+T4M04*j3@`Yjp*+b<L!oFGWy$@At=Vk5<)v&yXm`|A4h*crVj#*y+2T zAqoB51!7)`4{es_HwhqH@ZmYe$7dOo>nI922C@p`K_6cM1csU|E3RN6L{UXp3mt#} zjjsR@cp_90Gb^Bp&<oI+mRLtHt0J+^K)>4rn69r#<6VLEzxNA>N)^e+ZUy<50Rt$N z!1v`*!0(NBjY8oP{Jj5<KhsYnNy4{Id$K`I%hF?BxMBCy6Ghh{tN~Hz=&{qM;nxRv z#xQFEh$O(@Q_PH+H%P|yA_P;uvKO-;*->WLCI)~ZpM|s7bh20vk*(Ziy-OSuQ<|}j zBBqdhFwwYOeIXrE9%Uf1i6p-V!bKlE^lK0^s2-N&_+uqe??jvWZmKubxns4BdNq`& zi?SSF=-c<OZ}?u{a8=n-Ux#+={_(9_Z&gDZAB40=8+O$;49uK*swS>Y+&=g~?O*7A z^<nqGz3zcKJ+<!rSJfwKcQw@gd}$E1^*lp@9Df9mO7Q+?DURAUKSQwd-(l1luSY;z zrrY2^pNEF}&}`dK63zEThxSPGy9F+j(V@fA{2>8k3&s5MeTsL0vR3hFCNW^U0@V>p zj&$YQbC7D7qh&E<=%NMHh2?Q;{fWi+r3IzQ&={|NJRdbm4All82kZ^1m99<YEi(@b z=8RH-@wIW$W#wSDznEofra>Ef6&z=x<Z3wsDnrsAg<^(?4&UI(etpmdza;2_*WOYu zD9_D}XnIPJhsa(qrs1I)2tUgt^jduP%=-(Gcr~(Rp`+(XXV2``YDa%n>Gvy%9wQrI zF5&;27Y5#-t`dHcgcC#fZTbgjWHFx`z6s%lz+b@6am&h)qLVEZ@SB7ee||Q49s~qg z5FVrGV-))xZL5bx;gm3&pQAU5i-_y>*m|LBE`NvK0t2Y^fnK3!?!!Cgt&bNGsP#{T Wm@sf{=d3h4GOK)(T0+qExBVAU^h&z` diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-312.pyc deleted file mode 100644 index 38e9db28f311eb154d92cd9a2a9e23d6aa813f13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7571 zcmbVRYfv25mA?I&7t9PWyb)Flu*67WMhN*4^sr<B0x80=q<G5{$)nbE0|WE&?M4VP zRJ1PDF51Xt<l2o;ltd`&Dx-3?LViU*o&4IW{ll1eA-zr|sZG`H{u>Fo?5MW3_MF>2 z!wezu);7g`zwdXxbIzTA@p?T3zSxhxJ@!8VLjD~yg-@~*8$W`?9ikGIOOOc0e1c2z z5k4tIgrpb|lTt)VIwFpwGveg1UP!o-?ua|-iFlF~kqTBOCMuKOh?gT8Pb;B~lpsl8 z#K-C!FrGi+hqN<NHA+<1kGV)SPfiileS@f;k9cb(ks4N30cDk1%}0V=8kpvS-v7eP zaL{3TFTDAU{^-fU{*z~hhEJKUSK}##P7l3iihc2zVY-G4jVf0Xnkjxgu0#H{j1f<# zltfT4D+d*Q>}*_5Dn@L~tgv%>JT+=o52bWNNhB0(+)rtm2062WYKj_-jZLN|bjV6k z>;VbaaQd8POwyF;(8rX6FT5BOs2`TcvOO;!V(|;z2V>R-tk7v^HvStDcZfzJoJu0R z%0&dVSrs%<lQf6s)ErGvKf+^(|Ej3+BcdwZkRmR%MRnc~BW}&3idw}8uexrCA3+=Z zB9*FJbEqEp7d7vQL#=?8J~&6eR#h^N7fP#DAI_!vtyy4(Dwv@fYHHLPEnv?WfPAf5 zi{r5s)Iq)u)`_ch6ner;qFN6%^=wvNZGd!x>d+clUQ`<)-(;`03DV8ed~k>9z=PEE z8RdjLMU_lOqp~rk81j|LctX|X<YdB#XA+t`#+u1clTO7nSxKpKY)p$y=+InC%F3t` zhimi5@J*!BQ>m`ebXt|KDv3!=_pst&(_sx_Iw-rcn2j}dXd;A&vW*c4?vOZ{<+I#h z@6K}L9IG!23Mbu1E`cOngmGqtS<$djN=R1x$nKTpv%(SRd#g?)kS5XMoPcD0Ce2oc zi|)-RR7u*~?3GW*DnM9HkH|`5G)?2iSW-?YNllkC>3GTjoXSR8P5`WRt5G67rK!cy zaKtg~8VoY3L6c(nFhF058(LBaV5X^|sirFmSjWym$rN=hF+yu$y{6MHH3e9JDNbn9 zx{fS?Bg@a;4v(diS{S59zZ&jK$0n0n%Fx4xme59F8(q2)k4<Q_ONE<Aq!m@8;j3Ee zYB&+U63$E;W9d{+sQX}8hoy97l-Ps<%M54YnQ#;~r%{m6@T3t>=wa)|LYZk;C)CA_ zXmrMJK_*lv*a^$hk3n#q<UJ%%H|Jchs9vdPU2ko_fAQ|cdv84<ym$X?_q;HF;SW2X zUsUg9=ba0}`;~bK%JUA=B+rTOdN*JMVoGVi6D@-ViYtQ#Fc?6?C;}qO8O7@?5SQ*S z5K8PjPqLg2mku$3m^*L7YTQw1u^ErMH`9ew3CzB>3A3z_CEJZ~m80CPx~$ko-jibd zD2efx>H(NiR@%OORzNbiN_6Zc-R5sKiqHqz7a)6BBqfmM3y?k!tvJ?liag|o0XCjE z5GQaZ2qp!2Af|6PZ44zrY!MckN^v6E071|}n=!o$TL~#`itfOa!;({zyQ<^SFpSCc zIjnL<qaf>W>%QWxv;01&)Zd5TI{D1swD9}~^}q6WeiqoZQn~A~i&WLE2O8$i{MsK_ z4>Znw9q!m)JtwTU$oG%kJ+{^o&b5SBTe_bR!9Bp;JTrH4zJA?bv(RzB>uy)hzh}Lw zalJkGuMPbR%F^r09Y62-S=Yxx?qJ_1U47r@K56KO_QKx{=AGF4DNI&BAN%gNS6t11 zd?Jv>0Zy-kW&NVI{#D-bi+v)5u_9ui0)>d7=?zGfqDkd$08Yk>h=OYS8!xEmLIK2^ z*eIkn?<dF)mraR)?1BG{gAkk{988-fmq1O;a;0D{4Ddbf4#$yO)gqZD|0GOtv>m#E zt`ibkD#)9B=z!_8iABfN%GOmqa~~PiQrfi)JvOu3zAUR*G?t!B8KEPIbWBO;$3n$+ z$Dy~5bn~C&%j@Kmnt{brf8R4db>~Q~X5f!HF8iIj1`aq&&?l1?iuOR^Lyn<H$78i& zQdv6FOkkVoksx##g6rfD{u-EI$@uB)!`Zd)$z1s4YPkPbH3O^uffd&P#YU!k3=~cj zDcAG>lSZxaV?~OGHpQF7q2WkD(#IjS^&2nkV^?OmQBq)xtH2LIZYFHm5%ScSh75#i zO&*N{YnBkX9M?e~Ft!c_d3GSCFsd0~bTF~POQwe)&~Z)>BTI(-aXremWA~k@x6fxw z`K#CyrS3ZU9mv#$`<L!sT5ApET0=|IkJ?sSkFNNSuDFg`2jsAfp)#gK;l-IZmf&h^ zCHj9plLC%GskWd(brYkA`|bEHD--}*WUN+DvK;j9g#KcdA4f}U%U3c>z+%Vo>Mczm zyQ#oI5I}X`+KcLY9C~d1O2*q=<Y-6MF<!T|<)+MTkCPHU-p!F|9%dxtNSa%|Y>|nv zRXZ_Ug$4#Q@G&>ScMu9jw&5+*sa#gLM}AoB`wllnt_g3FDG;xjcTS=yB{P!=fdXcR zZBT)=1sOEP40(j6lQL**W>cfpVIcrg9)KGARK-w2mbr!bb4py-WCUBm)RyBTatg+j znc-d1bSCi46f@kI3B+ujUU@iJX-R!6Y{PWo(!heCaL~l`yn(hIv(HWUh3Slyq!my{ zkt9sVWCoU_F}(xgtX;E2*mOiGE-UD?WaedTD~_fOouc@d65Ew2;$$FPP>%Ya?XDnC zwaoI2+DBx21v4$UPfZVPS2+Mf=)Z*kOcWofs+kkln_BO;-fdlL+LvqEx7yV8goy4l z+}u!}7rbY<&)R|??t8FrDZbkF^1L|z=KKD<g!TDKQojSt8F%|!|9az&`xSR9?s=aO z&f7jOu2<FGskmLS(En*w+hYNW@&dHWyU5P=`{Q@V?<KHb!_DEjp?Mv&-Fve)XTSTM z#f}fV9&|0cb8Wq!_<Mg{RS!0iy8-m2+xuR{&5HTHPhCx4KCL5lJ3nx*1oq-ou)6v^ zD|?SVia+|+O6SmO{pppe(|MTi4EIdO<A2cjY7hU*p65<hOY}J8DT0vtASfdXq<2OZ zAxM-e!tIq{mMakEJGMsRDcVd7AP;%#GLJ(+sZOG=K*5aHz8UM{FJT*$WUw53%?pR_ zAH92Ysbkd_UU7w~4CSUc5>IGlYb{d!i%^f+b33n~#8~1A)KrKW#Vdba%oG{t>`KHZ zG&y}`T#Fh1FDU}0&<87|Xn{bQDTPyzE<F>orW~O-@l4aU;Ki!T*c}G~=vI=d+BJV? z&focymgNhp!QNH>;T6|m`_wXuF;;eJ4(P>hcnlI{H_WNU+k62%EwZhWERt1>hgSsn zD<FUamDx_Z!E~JhQ}j*3!QXU&&iG-Ir&qvG5z`qhMTcPSf_^*=Y0A!{Oh0Zp5ZuR~ zIS{PE&FI|_0DipH^BoJ~s<$;yICuAAEm)mvfxWrF-lapUfdgL%Q1}JbfZVvdpXtcd z?^bsTOH#M9?4*kLx(F=*Uti^Qf<eu^PJR}h0o=@%4^?8}w7|e`g7e|Pp5uY+d$t%F zN@^O(yu{vMJSHm?+-%#}xG(@{LR~~(f*>eb$U@7Fk)~yHh>%5|w2Tf95NH&bKAIkx zskYIzS(JdbI$A1VYCOO1!;23t{v*0+?j5<xT|iJX>;Ax+zdh$~UmRMR`4pI`p#_;~ z2QX7r9m89hg^MS^khUKZWk}oBpe~cj{aemsh&>>{3&V8jO9Ct%$sJ*JC7n)KY6($L zYK4N2ij`$Ps#Tz4OEfgl`V7qX-8p;v?5e+Q#nonQrqt@kb7Y&j42iPMe6_#1t!D^u zLQ&lEO>`0vBg?oKX$RCY=Z!v(DfHM11cJ_58G$&WQSEKmWRX`{b_$ze=Rftx;5Jd+ zEJ`2x9{6(p(26Vcr+0{C&bIwGkSN`@%58`6P2*7Ind7w07XPwST`=7WXxJJ9XA8s6 zxcy~F!&!RZe*@jOqAvwU#N?3!F5|%f1yPw5)NQpy77VeGBD2}PRuh<*?I52V`ddN% z8P_`u4wpC%Z#^JvT`-m9C|B5S4nF*t4lBd_q@vu>Ff^WNvjr|{+5ORNe6R07JN9bA zd@nFR8ft#u*tsAqd~3a}>xmPx_%gCHFOj;&JA=0e7h;PqE?iox-Io`jZoPKjV~lMt zZBLL3N)-JE8o{6ugQC|@w~-T+r!qOQ3bMGWqYxm70_&Cj_XckcepXfg7}xi^{Re(} z_TkyJ{jcQqzp}dj#8U|hH;7nWvmrRVz74@u<;fG5+rz+BKsLhHLN=P@EER0Q=OlFQ zqEXWmjV9CTWCGKb(dgTgO2V#zw+A&Hi$*E(HbssGN7SGc4MK{qPBe&Rt_%fDLyc)u zfY&REPBuM<0dgfpz?jmNX+zU3-Hav)MHy$Ri4J4x8yK92z;syJpMDcd&{TOytlgkr zW^E$?DLh-<1zy$-@|YJS*JF=Ik{7NmiA(2~JC^mI1()8+bsov>Jens^@z1pz7;Q9G zOD*}`#No^HoOFs?h=E>$cta=_<sH0qY$=c@5It&V(Z?Mdn9IBBq~@iUm-`>Sk|&US zWNcuR4{_3gg+q(N;$JOR=32Ty5lRP^_ikX6cQ~XYi`Vi5qUF8~jPg~y)V-+Vz}-tQ z0z`S2B-Jg}F2<I67RMeumnV?L))3`=ywtwH<_AMokirWCc>>WQ^n@tyaZ8?s_NN3Q z>yYqhV(?%5@SO46Kp*{YfmX^M+g)>Hgj0nZl@Sphrtu+MvY)eg)dA1h_{8p<BiFcy z3&_B2dclps-v}(}n)w*stkZNtVOHBnnleuZ+@(ofQ_+u4$y3@M(4tAJm#kR64YpKd zs=YlKr|gByGWCWGIhIalCIKi+87naZplEfm^>axd_5#iv8SvE#E*7rMgH)hhi)rk~ z4p|>dPvL8E+`tE8RPwMoYCB#OC8CVp@Vo>(FGTS_a6rQlTi;DCOWp+`*nHm{C2{U2 zMN=2OQ7|ud^`%pL@a1~Me#E$Z8AV&uFJG1?rW86F3Ucg;nY~5plOQ=vmQ3%!i8o$5 zH*}#tI(XvzpsjpNcQhJHD7qevS}N!|vo2VVnfkKpD82{J!+M#;3U5mAJm>b^bmm-* zAG9v>D{{|@tMOCUAqy?Xq2X6KC&+1~%Bb|s7lrUIz0DOAO2J_fC_3mAZ6AtwqyrF? zYF5i#sok<IcFW(xrtmI;#OP~U==i~GuDNTi`K4U*ORLRaTlMv>xO&;H;Nb99hl6hV z7Q{4)!DS2-3>a-8mC-90AQ_on`;22+0&Ew!o+OkqyXLrc+Hq`(!5mf~>3xa3BT25$ zeWLV2zLJv;Z{dK$%X`7{l`P+Y^$ph2Ug&8$jOh#@k|NA39%Rcwp0t=1+16}?UjstL zUjsr#K<k#%#|{#m&8-dD&juloxEOPSHm{c*yXifD;oNJ(rx?Wg&s%)Tb~lRC%NQWh zK64$hbiy%;0suTq^dShq&E>d%Bfj5~(`)4Pe~{O6<n`Z>1HTulej~Pi?jn*5zd%$s iUH3kLD16=f1^nE}c^(rCpS~sdxx@1VpA(4KRR0U{LY<@l diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/logging.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/logging.cpython-312.pyc deleted file mode 100644 index 4c92076a0b6b6eabbec19f8c0e5f4a3c413e06c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13574 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/misc.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/misc.cpython-312.pyc deleted file mode 100644 index 9d3eca13c77e4a45bc66f947b46536edea468d7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34138 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/models.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/models.cpython-312.pyc deleted file mode 100644 index e8f55d77016ec65702cfa2a56881c7bfac6ed900..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2729 zcmc&$O-x)>6u$45;dh|?D3+Fo6v#wjghFjnYSI>?RZERn7qfYJynA6Dym@c9_kj-5 zgawPbvO8FrnwVJ94NI3UT$s3-2{qK0CTd){L&wCVE6;gvW`qi?OnVpS-tU}y-kfvp zJ>Q)lnwuL44Eu{uv)d{mzagj&z|kmQglUsdk|9*0vMXgIm=#yfDH$cFX4IUP(Ig_1 zw+K}?2-P0Qv13Lr$SHmG?5)6YoxowjnDe<o*_`7!-n^0XDRV``@3?t7rG&~AuMj4# zS*~l%x-3*bEaaITe<_xF1(bJSu}K(#KuAWWQbwUNRp#Z4N>!#&jp>wh!yc;Bx;dRD zHq=ZV)mdUrruDF{rwy=6XAN^IZ3NtS05<_{I)Ix2Hy^+)fLjjWB;aI(TUjg9m^LrN zcjfrkVWrbH*wI#~OPvZk-erZWmSFUnpUYdE-Ecl}yw%s==l+UAp*nV?c7*R4ww1SL zt5plKR$w^7m_=U$td_CJ3SpBOJ1`Sb(ySKNv|USxP(f|WQ%aq)V3~W<wo<7jPIz31 z%La%|vL>w&6ISt9lL1LpR3O{ZbV}w4Q1E&XaBiw#?i|N^#2Y~f{FGrBPnObIKgZHJ zD-bK`Dc@esF)tA5fVpg*Te)EoIQAmr!_@!SbA5|4o?c<zO4@a1)A>S>^}X{Wqho2| z1Z+5O*^AaZ6Y0E@Pn(VxFz#7ydKqq(NXHjxBoDX81e+6>=IWWFYCTdlH)EWqK&+ET zJ-v6-hl%b-y~B6Z9}_)g&=R|rFaXRaD$lF1*d#&Cwni2zHysSM@t|U#A-n~YDLGWL zmdHjWOG!KlI)PgZ-U<>!M)L_F$L2QlYX`AT9w*!HPVIFJlsX1>lY_;?Ajecf%@4AS z+Xq9!7LG!{3JW+{vQP^i6qT_i1vQ_AYSUMZFjw2Tnveo9S8iUI@bipYfzLzTG+ikC zwj5>1yTDQ4XN@>d{t~QLPaktC=-B}q$}fO`GfB38e*3fATerS?`|F!u-rP-&7Zc-A zlFuMJ{vyP{v4NwUm}&CU01hQ{78J)P11^{c??Hh_^UR~3hkE`uY6C(!HfnUiGkTs; zA6e^{PmCH|&OG0!+0s$9K6g^o=wcj-I@EIv7>^#}<y!X!u=f!007D;1J(WHddQj`* z8K8IM@P+E@3E!%YHR&kr)BUc74UTX;5m=thBGM0Arv2c0F7Gm=bVg%tQ~vFIJ^(*a zeF!3+i@NGKR<5u~KRS(qK#J?$8o1Z7*Edn>n|PSK@VLFN*wpuHvhyz8>l!L`4c+hD zOI<3ZF6|~Ki;2mo%ix6tGWDz++=;NkG~roTc5&TgnoG-;Td~xcCiQJl*PEtr{XoF+ zAxClz1=4J&zyrfOaiz}sz8i5D$DZc~3cQgV513<>qs+GBMvqgiLoEt?CB=6jHpoxv zm0#L=i+y9o*7NJv_f=UN*}Aq*VA|;@UU;uGdLshG4?ZfRaz7zyLtFi20@J=OX%n~^ zrh8MUn)rWJs&;wH-X}2Kzqm8=P5;h2->Sv&snRQNM#}Hc{e`xu#!*_SI*w0ag(HJP z9{$b6C5-A3)iJ8UYq$#uFsjRw#AJLVZ}2hD;Y%cXLF_A%B>f>vl3Lb@)cP|SERn&# O^<L@np9Dnofqwuxh&hk| diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-312.pyc deleted file mode 100644 index f3f6d81e751967a3e5fe314a93a418d0abc26408..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2600 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 E2W6tf4*&oF diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-312.pyc deleted file mode 100644 index 7f45484e9e4f10652dc5f570ef84d1f13403b884..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4567 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 A`Tzg` diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc deleted file mode 100644 index c811819912310b239bf17cbbff478ac1e63a8368..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8735 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc deleted file mode 100644 index a3626700d4ef86592006d71d288d59a1e92a851b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12079 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 AUjP6A diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-312.pyc deleted file mode 100644 index d6cbda90c96ab3edb298818daa593e255e24edc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11125 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 F{{uDw#RdQX diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/urls.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/urls.cpython-312.pyc deleted file mode 100644 index 4469ba04620996d87111a0c912a6fa3d7f10d038..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2422 zcmah~O>7fK6rSC+*FU?q6T*K|Sj1mkNUVTbN>m|1(xOn52tq-PkfOyq#CF!ZW@hX( z!LHn@2htvJt4bKP6u5z?RE`|E_k!y~(haDo+8&}_EG3nyocd<%g(OwmQ8Mpm-n@DH z-uIq=h(y8&R`T2Hsh?$pe&vF<{4Hjg0CNi&$Pi34)}+Fi;L75d<WiqYMbn>^$7BH+ zlHoH0+2B|Zcs~vqGL~^@2l%<_GXkIb#==I>)rLS0fvmKwxEuyqofhKC5)WWFE;zxF z9824lZY~L+0Y%`_(D2~MrBO%96Vs6iW_e;I`JuObz)0}Fd>%FkUMQl1K!j;jM47dA zEqg;S#7AONFeDymhTq<>9<}6A6!#6U3jKt?Lin|~==f>QOf$!C+EbXs1p?_rls~1d z+KH5%#fhxWXdy9ZC-YfsF`8i5#1ll%_E45iPGZty*i)8i>jox?0=5bXGkqnIn`SB7 zI@;TJBtg>*_vG~Cq&|UZBA3o3#?uzV1QL_Tv$RPQkPX_Kn|7iTn2m!lPLnB|#Uuh@ z@Iuo=u$9q#AY9q|@kjHqj(H_|^Z4xX%4l^@UFoWxt0}wZl>Ieje_c8F%y)1Z%#q{E z=`6J_yZqbS?EVGJEyTE)yE3gDdNQXO4@hg2|8pa-#<ay2(W6$~JX%65=-Fjl7<*Ea zX82ccScb6XPISW|h?(|(>ejs6`nr-(6aWL_Oe(Cw8nCSbCQQ>co+ypkz+Fw7xL<q! z{MlYjyO6@olc}_6YFDt9g%WG}6>6J#28?BBDZPMQU)S<B!$#9QrxQkdUG=Kpbr=sh zqD@H*f^>qGO|tw!CjhQoMuw6DW*k4<q}U07n6cBA6Cn6n9#iJ1+|1Im_y`=uMb}Xi zsQk+`ji}tS!mY-c%@IU)f~F1r=?H9Pv=T;Y^yabIV{=MpP3ipR)ZNp!Pv0H6J@R0% z-qlxEj+6(Vhudx*o;^Gl-c<|ls!n|;e;<7qo$DT`bq_optalI9!)M9^0KD=U!Yi;2 zSR5)Yu)c(1-}={P^&mi%GsqB&=xfoC?nqvHej>1!FwF24-LNwM39ri#LrEx!B?)$+ zC=!2BG<=iY(CL!lFNxO9R}dnyAs59N@DKVZQ@n?a0FUX8=*77%BA(+7E5j?gVHL%q z#65dHO46Elj~7LHjJ*VFQSz*e;N)e9G+vYpcitLdH}X9oD}1c6P2Mw^%^vrP77$Uv zQZ*twkr4&S&+i$rov0)gC4hX}Om}!a<X-~4iF*#6CS(bZZl>=8JFg{mOS3I=TH|B7 z)f#{;s=@fOU72H&YTcI2v{fPQgiJfBn<*P0i)O^jmuKFxY^%pry5`VWLsZiV*7yyY z&*f~w+s3vumP%7CXX@-Kv`4?T#L?uA=v5)%&g&(PjU^5XXn+upQS46)#}y|`8E?3$ zG)s{!{MJ_3oFEUBPj<qw>4Y!pW*)yoh)u|Lu2A9ph}Tw*WMa#aDI;lX!infKnNE+J zn8A>yai801jxg@X7H04<Zu?Ol2~TOO_rM)*J?@blh9lm8^bgp|s1ZbJ?B<Et6Z65? ziX^IX1Bw1YVKLPI<mi)wPurgb2A2I?1A0|n38L5b-aUK!>|9r0t*h_x-g?)YHQ$c% z$#UTatDLI}zbNgMi`DBtZh3vNy<=8>5o%j(-&Q^F#qL@8x9Ily=(|tp(}`#5@UkSv z!r(F#2AAq49>AP(pr#zSS9t8ZU#cr_ln4J*QK;>wwyn?ASjG4GP__ND;d!;K(ms2- zLSM3973Q`bs==Rn$UUs|-59EN*3^BAv5v~g%BdS4-ta9dvGRNFT!=>q$0~uwYi1cH zTdzCV-0C<{$P`z3vrT5xImkNU1$X46&1Yk?W)jrH{Rwo3nVZ#z$bG}j`D*a(tZn2? ze1aT>yZl#%UVyD334*YILJKIefI1e?mKUh=chuRCC84`2H4u<{!3Q1pBg>p^r~x5X cNj4CWYI2#A#^!xOTV=F?fK*3UIB{S78wf5a@&Et; diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc deleted file mode 100644 index 01133757e5f898f02f3d4d68517a99764fc91828..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4497 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-312.pyc deleted file mode 100644 index 2b696aaacacd045d7ab593daa09dbc61e997df1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5943 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 O$kFVk>mjMp9r+I{PVJTe diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/_jaraco_text.py b/venv/lib/python3.12/site-packages/pip/_internal/utils/_jaraco_text.py deleted file mode 100644 index e06947c..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/utils/_jaraco_text.py +++ /dev/null @@ -1,109 +0,0 @@ -"""Functions brought over from jaraco.text. - -These functions are not supposed to be used within `pip._internal`. These are -helper functions brought over from `jaraco.text` to enable vendoring newer -copies of `pkg_resources` without having to vendor `jaraco.text` and its entire -dependency cone; something that our vendoring setup is not currently capable of -handling. - -License reproduced from original source below: - -Copyright Jason R. Coombs - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. -""" - -import functools -import itertools - - -def _nonblank(str): - return str and not str.startswith("#") - - -@functools.singledispatch -def yield_lines(iterable): - r""" - Yield valid lines of a string or iterable. - - >>> list(yield_lines('')) - [] - >>> list(yield_lines(['foo', 'bar'])) - ['foo', 'bar'] - >>> list(yield_lines('foo\nbar')) - ['foo', 'bar'] - >>> list(yield_lines('\nfoo\n#bar\nbaz #comment')) - ['foo', 'baz #comment'] - >>> list(yield_lines(['foo\nbar', 'baz', 'bing\n\n\n'])) - ['foo', 'bar', 'baz', 'bing'] - """ - return itertools.chain.from_iterable(map(yield_lines, iterable)) - - -@yield_lines.register(str) -def _(text): - return filter(_nonblank, map(str.strip, text.splitlines())) - - -def drop_comment(line): - """ - Drop comments. - - >>> drop_comment('foo # bar') - 'foo' - - A hash without a space may be in a URL. - - >>> drop_comment('http://example.com/foo#bar') - 'http://example.com/foo#bar' - """ - return line.partition(" #")[0] - - -def join_continuation(lines): - r""" - Join lines continued by a trailing backslash. - - >>> list(join_continuation(['foo \\', 'bar', 'baz'])) - ['foobar', 'baz'] - >>> list(join_continuation(['foo \\', 'bar', 'baz'])) - ['foobar', 'baz'] - >>> list(join_continuation(['foo \\', 'bar \\', 'baz'])) - ['foobarbaz'] - - Not sure why, but... - The character preceeding the backslash is also elided. - - >>> list(join_continuation(['goo\\', 'dly'])) - ['godly'] - - A terrible idea, but... - If no line is available to continue, suppress the lines. - - >>> list(join_continuation(['foo', 'bar\\', 'baz\\'])) - ['foo'] - """ - lines = iter(lines) - for item in lines: - while item.endswith("\\"): - try: - item = item[:-2].strip() + next(lines) - except StopIteration: - return - yield item diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/_log.py b/venv/lib/python3.12/site-packages/pip/_internal/utils/_log.py deleted file mode 100644 index 92c4c6a..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/utils/_log.py +++ /dev/null @@ -1,38 +0,0 @@ -"""Customize logging - -Defines custom logger class for the `logger.verbose(...)` method. - -init_logging() must be called before any other modules that call logging.getLogger. -""" - -import logging -from typing import Any, cast - -# custom log level for `--verbose` output -# between DEBUG and INFO -VERBOSE = 15 - - -class VerboseLogger(logging.Logger): - """Custom Logger, defining a verbose log-level - - VERBOSE is between INFO and DEBUG. - """ - - def verbose(self, msg: str, *args: Any, **kwargs: Any) -> None: - return self.log(VERBOSE, msg, *args, **kwargs) - - -def getLogger(name: str) -> VerboseLogger: - """logging.getLogger, but ensures our VerboseLogger class is returned""" - return cast(VerboseLogger, logging.getLogger(name)) - - -def init_logging() -> None: - """Register our VerboseLogger and VERBOSE log level. - - Should be called before any calls to getLogger(), - i.e. in pip._internal.__init__ - """ - logging.setLoggerClass(VerboseLogger) - logging.addLevelName(VERBOSE, "VERBOSE") diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/appdirs.py b/venv/lib/python3.12/site-packages/pip/_internal/utils/appdirs.py deleted file mode 100644 index 16933bf..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/utils/appdirs.py +++ /dev/null @@ -1,52 +0,0 @@ -""" -This code wraps the vendored appdirs module to so the return values are -compatible for the current pip code base. - -The intention is to rewrite current usages gradually, keeping the tests pass, -and eventually drop this after all usages are changed. -""" - -import os -import sys -from typing import List - -from pip._vendor import platformdirs as _appdirs - - -def user_cache_dir(appname: str) -> str: - return _appdirs.user_cache_dir(appname, appauthor=False) - - -def _macos_user_config_dir(appname: str, roaming: bool = True) -> str: - # Use ~/Application Support/pip, if the directory exists. - path = _appdirs.user_data_dir(appname, appauthor=False, roaming=roaming) - if os.path.isdir(path): - return path - - # Use a Linux-like ~/.config/pip, by default. - linux_like_path = "~/.config/" - if appname: - linux_like_path = os.path.join(linux_like_path, appname) - - return os.path.expanduser(linux_like_path) - - -def user_config_dir(appname: str, roaming: bool = True) -> str: - if sys.platform == "darwin": - return _macos_user_config_dir(appname, roaming) - - return _appdirs.user_config_dir(appname, appauthor=False, roaming=roaming) - - -# for the discussion regarding site_config_dir locations -# see <https://github.com/pypa/pip/issues/1733> -def site_config_dirs(appname: str) -> List[str]: - if sys.platform == "darwin": - return [_appdirs.site_data_dir(appname, appauthor=False, multipath=True)] - - dirval = _appdirs.site_config_dir(appname, appauthor=False, multipath=True) - if sys.platform == "win32": - return [dirval] - - # Unix-y system. Look in /etc as well. - return dirval.split(os.pathsep) + ["/etc"] diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/compat.py b/venv/lib/python3.12/site-packages/pip/_internal/utils/compat.py deleted file mode 100644 index 3f4d300..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/utils/compat.py +++ /dev/null @@ -1,63 +0,0 @@ -"""Stuff that differs in different Python versions and platform -distributions.""" - -import logging -import os -import sys - -__all__ = ["get_path_uid", "stdlib_pkgs", "WINDOWS"] - - -logger = logging.getLogger(__name__) - - -def has_tls() -> bool: - try: - import _ssl # noqa: F401 # ignore unused - - return True - except ImportError: - pass - - from pip._vendor.urllib3.util import IS_PYOPENSSL - - return IS_PYOPENSSL - - -def get_path_uid(path: str) -> int: - """ - Return path's uid. - - Does not follow symlinks: - https://github.com/pypa/pip/pull/935#discussion_r5307003 - - Placed this function in compat due to differences on AIX and - Jython, that should eventually go away. - - :raises OSError: When path is a symlink or can't be read. - """ - if hasattr(os, "O_NOFOLLOW"): - fd = os.open(path, os.O_RDONLY | os.O_NOFOLLOW) - file_uid = os.fstat(fd).st_uid - os.close(fd) - else: # AIX and Jython - # WARNING: time of check vulnerability, but best we can do w/o NOFOLLOW - if not os.path.islink(path): - # older versions of Jython don't have `os.fstat` - file_uid = os.stat(path).st_uid - else: - # raise OSError for parity with os.O_NOFOLLOW above - raise OSError(f"{path} is a symlink; Will not return uid for symlinks") - return file_uid - - -# packages in the stdlib that may have installation metadata, but should not be -# considered 'installed'. this theoretically could be determined based on -# dist.location (py27:`sysconfig.get_paths()['stdlib']`, -# py26:sysconfig.get_config_vars('LIBDEST')), but fear platform variation may -# make this ineffective, so hard-coding -stdlib_pkgs = {"python", "wsgiref", "argparse"} - - -# windows detection, covers cpython and ironpython -WINDOWS = sys.platform.startswith("win") or (sys.platform == "cli" and os.name == "nt") diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/compatibility_tags.py b/venv/lib/python3.12/site-packages/pip/_internal/utils/compatibility_tags.py deleted file mode 100644 index b6ed9a7..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/utils/compatibility_tags.py +++ /dev/null @@ -1,165 +0,0 @@ -"""Generate and work with PEP 425 Compatibility Tags. -""" - -import re -from typing import List, Optional, Tuple - -from pip._vendor.packaging.tags import ( - PythonVersion, - Tag, - compatible_tags, - cpython_tags, - generic_tags, - interpreter_name, - interpreter_version, - mac_platforms, -) - -_osx_arch_pat = re.compile(r"(.+)_(\d+)_(\d+)_(.+)") - - -def version_info_to_nodot(version_info: Tuple[int, ...]) -> str: - # Only use up to the first two numbers. - return "".join(map(str, version_info[:2])) - - -def _mac_platforms(arch: str) -> List[str]: - match = _osx_arch_pat.match(arch) - if match: - name, major, minor, actual_arch = match.groups() - mac_version = (int(major), int(minor)) - arches = [ - # Since we have always only checked that the platform starts - # with "macosx", for backwards-compatibility we extract the - # actual prefix provided by the user in case they provided - # something like "macosxcustom_". It may be good to remove - # this as undocumented or deprecate it in the future. - "{}_{}".format(name, arch[len("macosx_") :]) - for arch in mac_platforms(mac_version, actual_arch) - ] - else: - # arch pattern didn't match (?!) - arches = [arch] - return arches - - -def _custom_manylinux_platforms(arch: str) -> List[str]: - arches = [arch] - arch_prefix, arch_sep, arch_suffix = arch.partition("_") - if arch_prefix == "manylinux2014": - # manylinux1/manylinux2010 wheels run on most manylinux2014 systems - # with the exception of wheels depending on ncurses. PEP 599 states - # manylinux1/manylinux2010 wheels should be considered - # manylinux2014 wheels: - # https://www.python.org/dev/peps/pep-0599/#backwards-compatibility-with-manylinux2010-wheels - if arch_suffix in {"i686", "x86_64"}: - arches.append("manylinux2010" + arch_sep + arch_suffix) - arches.append("manylinux1" + arch_sep + arch_suffix) - elif arch_prefix == "manylinux2010": - # manylinux1 wheels run on most manylinux2010 systems with the - # exception of wheels depending on ncurses. PEP 571 states - # manylinux1 wheels should be considered manylinux2010 wheels: - # https://www.python.org/dev/peps/pep-0571/#backwards-compatibility-with-manylinux1-wheels - arches.append("manylinux1" + arch_sep + arch_suffix) - return arches - - -def _get_custom_platforms(arch: str) -> List[str]: - arch_prefix, arch_sep, arch_suffix = arch.partition("_") - if arch.startswith("macosx"): - arches = _mac_platforms(arch) - elif arch_prefix in ["manylinux2014", "manylinux2010"]: - arches = _custom_manylinux_platforms(arch) - else: - arches = [arch] - return arches - - -def _expand_allowed_platforms(platforms: Optional[List[str]]) -> Optional[List[str]]: - if not platforms: - return None - - seen = set() - result = [] - - for p in platforms: - if p in seen: - continue - additions = [c for c in _get_custom_platforms(p) if c not in seen] - seen.update(additions) - result.extend(additions) - - return result - - -def _get_python_version(version: str) -> PythonVersion: - if len(version) > 1: - return int(version[0]), int(version[1:]) - else: - return (int(version[0]),) - - -def _get_custom_interpreter( - implementation: Optional[str] = None, version: Optional[str] = None -) -> str: - if implementation is None: - implementation = interpreter_name() - if version is None: - version = interpreter_version() - return f"{implementation}{version}" - - -def get_supported( - version: Optional[str] = None, - platforms: Optional[List[str]] = None, - impl: Optional[str] = None, - abis: Optional[List[str]] = None, -) -> List[Tag]: - """Return a list of supported tags for each version specified in - `versions`. - - :param version: a string version, of the form "33" or "32", - or None. The version will be assumed to support our ABI. - :param platform: specify a list of platforms you want valid - tags for, or None. If None, use the local system platform. - :param impl: specify the exact implementation you want valid - tags for, or None. If None, use the local interpreter impl. - :param abis: specify a list of abis you want valid - tags for, or None. If None, use the local interpreter abi. - """ - supported: List[Tag] = [] - - python_version: Optional[PythonVersion] = None - if version is not None: - python_version = _get_python_version(version) - - interpreter = _get_custom_interpreter(impl, version) - - platforms = _expand_allowed_platforms(platforms) - - is_cpython = (impl or interpreter_name()) == "cp" - if is_cpython: - supported.extend( - cpython_tags( - python_version=python_version, - abis=abis, - platforms=platforms, - ) - ) - else: - supported.extend( - generic_tags( - interpreter=interpreter, - abis=abis, - platforms=platforms, - ) - ) - supported.extend( - compatible_tags( - python_version=python_version, - interpreter=interpreter, - platforms=platforms, - ) - ) - - return supported diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/datetime.py b/venv/lib/python3.12/site-packages/pip/_internal/utils/datetime.py deleted file mode 100644 index 8668b3b..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/utils/datetime.py +++ /dev/null @@ -1,11 +0,0 @@ -"""For when pip wants to check the date or time. -""" - -import datetime - - -def today_is_later_than(year: int, month: int, day: int) -> bool: - today = datetime.date.today() - given = datetime.date(year, month, day) - - return today > given diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/deprecation.py b/venv/lib/python3.12/site-packages/pip/_internal/utils/deprecation.py deleted file mode 100644 index 72bd6f2..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/utils/deprecation.py +++ /dev/null @@ -1,120 +0,0 @@ -""" -A module that implements tooling to enable easy warnings about deprecations. -""" - -import logging -import warnings -from typing import Any, Optional, TextIO, Type, Union - -from pip._vendor.packaging.version import parse - -from pip import __version__ as current_version # NOTE: tests patch this name. - -DEPRECATION_MSG_PREFIX = "DEPRECATION: " - - -class PipDeprecationWarning(Warning): - pass - - -_original_showwarning: Any = None - - -# Warnings <-> Logging Integration -def _showwarning( - message: Union[Warning, str], - category: Type[Warning], - filename: str, - lineno: int, - file: Optional[TextIO] = None, - line: Optional[str] = None, -) -> None: - if file is not None: - if _original_showwarning is not None: - _original_showwarning(message, category, filename, lineno, file, line) - elif issubclass(category, PipDeprecationWarning): - # We use a specially named logger which will handle all of the - # deprecation messages for pip. - logger = logging.getLogger("pip._internal.deprecations") - logger.warning(message) - else: - _original_showwarning(message, category, filename, lineno, file, line) - - -def install_warning_logger() -> None: - # Enable our Deprecation Warnings - warnings.simplefilter("default", PipDeprecationWarning, append=True) - - global _original_showwarning - - if _original_showwarning is None: - _original_showwarning = warnings.showwarning - warnings.showwarning = _showwarning - - -def deprecated( - *, - reason: str, - replacement: Optional[str], - gone_in: Optional[str], - feature_flag: Optional[str] = None, - issue: Optional[int] = None, -) -> None: - """Helper to deprecate existing functionality. - - reason: - Textual reason shown to the user about why this functionality has - been deprecated. Should be a complete sentence. - replacement: - Textual suggestion shown to the user about what alternative - functionality they can use. - gone_in: - The version of pip does this functionality should get removed in. - Raises an error if pip's current version is greater than or equal to - this. - feature_flag: - Command-line flag of the form --use-feature={feature_flag} for testing - upcoming functionality. - issue: - Issue number on the tracker that would serve as a useful place for - users to find related discussion and provide feedback. - """ - - # Determine whether or not the feature is already gone in this version. - is_gone = gone_in is not None and parse(current_version) >= parse(gone_in) - - message_parts = [ - (reason, f"{DEPRECATION_MSG_PREFIX}{{}}"), - ( - gone_in, - "pip {} will enforce this behaviour change." - if not is_gone - else "Since pip {}, this is no longer supported.", - ), - ( - replacement, - "A possible replacement is {}.", - ), - ( - feature_flag, - "You can use the flag --use-feature={} to test the upcoming behaviour." - if not is_gone - else None, - ), - ( - issue, - "Discussion can be found at https://github.com/pypa/pip/issues/{}", - ), - ] - - message = " ".join( - format_str.format(value) - for value, format_str in message_parts - if format_str is not None and value is not None - ) - - # Raise as an error if this behaviour is deprecated. - if is_gone: - raise PipDeprecationWarning(message) - - warnings.warn(message, category=PipDeprecationWarning, stacklevel=2) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py b/venv/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py deleted file mode 100644 index 0e8e5e1..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py +++ /dev/null @@ -1,87 +0,0 @@ -from typing import Optional - -from pip._internal.models.direct_url import ArchiveInfo, DirectUrl, DirInfo, VcsInfo -from pip._internal.models.link import Link -from pip._internal.utils.urls import path_to_url -from pip._internal.vcs import vcs - - -def direct_url_as_pep440_direct_reference(direct_url: DirectUrl, name: str) -> str: - """Convert a DirectUrl to a pip requirement string.""" - direct_url.validate() # if invalid, this is a pip bug - requirement = name + " @ " - fragments = [] - if isinstance(direct_url.info, VcsInfo): - requirement += "{}+{}@{}".format( - direct_url.info.vcs, direct_url.url, direct_url.info.commit_id - ) - elif isinstance(direct_url.info, ArchiveInfo): - requirement += direct_url.url - if direct_url.info.hash: - fragments.append(direct_url.info.hash) - else: - assert isinstance(direct_url.info, DirInfo) - requirement += direct_url.url - if direct_url.subdirectory: - fragments.append("subdirectory=" + direct_url.subdirectory) - if fragments: - requirement += "#" + "&".join(fragments) - return requirement - - -def direct_url_for_editable(source_dir: str) -> DirectUrl: - return DirectUrl( - url=path_to_url(source_dir), - info=DirInfo(editable=True), - ) - - -def direct_url_from_link( - link: Link, source_dir: Optional[str] = None, link_is_in_wheel_cache: bool = False -) -> DirectUrl: - if link.is_vcs: - vcs_backend = vcs.get_backend_for_scheme(link.scheme) - assert vcs_backend - url, requested_revision, _ = vcs_backend.get_url_rev_and_auth( - link.url_without_fragment - ) - # For VCS links, we need to find out and add commit_id. - if link_is_in_wheel_cache: - # If the requested VCS link corresponds to a cached - # wheel, it means the requested revision was an - # immutable commit hash, otherwise it would not have - # been cached. In that case we don't have a source_dir - # with the VCS checkout. - assert requested_revision - commit_id = requested_revision - else: - # If the wheel was not in cache, it means we have - # had to checkout from VCS to build and we have a source_dir - # which we can inspect to find out the commit id. - assert source_dir - commit_id = vcs_backend.get_revision(source_dir) - return DirectUrl( - url=url, - info=VcsInfo( - vcs=vcs_backend.name, - commit_id=commit_id, - requested_revision=requested_revision, - ), - subdirectory=link.subdirectory_fragment, - ) - elif link.is_existing_dir(): - return DirectUrl( - url=link.url_without_fragment, - info=DirInfo(), - subdirectory=link.subdirectory_fragment, - ) - else: - hash = None - hash_name = link.hash_name - if hash_name: - hash = f"{hash_name}={link.hash}" - return DirectUrl( - url=link.url_without_fragment, - info=ArchiveInfo(hash=hash), - subdirectory=link.subdirectory_fragment, - ) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/egg_link.py b/venv/lib/python3.12/site-packages/pip/_internal/utils/egg_link.py deleted file mode 100644 index 4a384a6..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/utils/egg_link.py +++ /dev/null @@ -1,80 +0,0 @@ -import os -import re -import sys -from typing import List, Optional - -from pip._internal.locations import site_packages, user_site -from pip._internal.utils.virtualenv import ( - running_under_virtualenv, - virtualenv_no_global, -) - -__all__ = [ - "egg_link_path_from_sys_path", - "egg_link_path_from_location", -] - - -def _egg_link_names(raw_name: str) -> List[str]: - """ - Convert a Name metadata value to a .egg-link name, by applying - the same substitution as pkg_resources's safe_name function. - Note: we cannot use canonicalize_name because it has a different logic. - - We also look for the raw name (without normalization) as setuptools 69 changed - the way it names .egg-link files (https://github.com/pypa/setuptools/issues/4167). - """ - return [ - re.sub("[^A-Za-z0-9.]+", "-", raw_name) + ".egg-link", - f"{raw_name}.egg-link", - ] - - -def egg_link_path_from_sys_path(raw_name: str) -> Optional[str]: - """ - Look for a .egg-link file for project name, by walking sys.path. - """ - egg_link_names = _egg_link_names(raw_name) - for path_item in sys.path: - for egg_link_name in egg_link_names: - egg_link = os.path.join(path_item, egg_link_name) - if os.path.isfile(egg_link): - return egg_link - return None - - -def egg_link_path_from_location(raw_name: str) -> Optional[str]: - """ - Return the path for the .egg-link file if it exists, otherwise, None. - - There's 3 scenarios: - 1) not in a virtualenv - try to find in site.USER_SITE, then site_packages - 2) in a no-global virtualenv - try to find in site_packages - 3) in a yes-global virtualenv - try to find in site_packages, then site.USER_SITE - (don't look in global location) - - For #1 and #3, there could be odd cases, where there's an egg-link in 2 - locations. - - This method will just return the first one found. - """ - sites: List[str] = [] - if running_under_virtualenv(): - sites.append(site_packages) - if not virtualenv_no_global() and user_site: - sites.append(user_site) - else: - if user_site: - sites.append(user_site) - sites.append(site_packages) - - egg_link_names = _egg_link_names(raw_name) - for site in sites: - for egg_link_name in egg_link_names: - egglink = os.path.join(site, egg_link_name) - if os.path.isfile(egglink): - return egglink - return None diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/encoding.py b/venv/lib/python3.12/site-packages/pip/_internal/utils/encoding.py deleted file mode 100644 index 008f06a..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/utils/encoding.py +++ /dev/null @@ -1,36 +0,0 @@ -import codecs -import locale -import re -import sys -from typing import List, Tuple - -BOMS: List[Tuple[bytes, str]] = [ - (codecs.BOM_UTF8, "utf-8"), - (codecs.BOM_UTF16, "utf-16"), - (codecs.BOM_UTF16_BE, "utf-16-be"), - (codecs.BOM_UTF16_LE, "utf-16-le"), - (codecs.BOM_UTF32, "utf-32"), - (codecs.BOM_UTF32_BE, "utf-32-be"), - (codecs.BOM_UTF32_LE, "utf-32-le"), -] - -ENCODING_RE = re.compile(rb"coding[:=]\s*([-\w.]+)") - - -def auto_decode(data: bytes) -> str: - """Check a bytes string for a BOM to correctly detect the encoding - - Fallback to locale.getpreferredencoding(False) like open() on Python3""" - for bom, encoding in BOMS: - if data.startswith(bom): - return data[len(bom) :].decode(encoding) - # Lets check the first two lines as in PEP263 - for line in data.split(b"\n")[:2]: - if line[0:1] == b"#" and ENCODING_RE.search(line): - result = ENCODING_RE.search(line) - assert result is not None - encoding = result.groups()[0].decode("ascii") - return data.decode(encoding) - return data.decode( - locale.getpreferredencoding(False) or sys.getdefaultencoding(), - ) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/entrypoints.py b/venv/lib/python3.12/site-packages/pip/_internal/utils/entrypoints.py deleted file mode 100644 index 1501369..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/utils/entrypoints.py +++ /dev/null @@ -1,84 +0,0 @@ -import itertools -import os -import shutil -import sys -from typing import List, Optional - -from pip._internal.cli.main import main -from pip._internal.utils.compat import WINDOWS - -_EXECUTABLE_NAMES = [ - "pip", - f"pip{sys.version_info.major}", - f"pip{sys.version_info.major}.{sys.version_info.minor}", -] -if WINDOWS: - _allowed_extensions = {"", ".exe"} - _EXECUTABLE_NAMES = [ - "".join(parts) - for parts in itertools.product(_EXECUTABLE_NAMES, _allowed_extensions) - ] - - -def _wrapper(args: Optional[List[str]] = None) -> int: - """Central wrapper for all old entrypoints. - - Historically pip has had several entrypoints defined. Because of issues - arising from PATH, sys.path, multiple Pythons, their interactions, and most - of them having a pip installed, users suffer every time an entrypoint gets - moved. - - To alleviate this pain, and provide a mechanism for warning users and - directing them to an appropriate place for help, we now define all of - our old entrypoints as wrappers for the current one. - """ - sys.stderr.write( - "WARNING: pip is being invoked by an old script wrapper. This will " - "fail in a future version of pip.\n" - "Please see https://github.com/pypa/pip/issues/5599 for advice on " - "fixing the underlying issue.\n" - "To avoid this problem you can invoke Python with '-m pip' instead of " - "running pip directly.\n" - ) - return main(args) - - -def get_best_invocation_for_this_pip() -> str: - """Try to figure out the best way to invoke pip in the current environment.""" - binary_directory = "Scripts" if WINDOWS else "bin" - binary_prefix = os.path.join(sys.prefix, binary_directory) - - # Try to use pip[X[.Y]] names, if those executables for this environment are - # the first on PATH with that name. - path_parts = os.path.normcase(os.environ.get("PATH", "")).split(os.pathsep) - exe_are_in_PATH = os.path.normcase(binary_prefix) in path_parts - if exe_are_in_PATH: - for exe_name in _EXECUTABLE_NAMES: - found_executable = shutil.which(exe_name) - binary_executable = os.path.join(binary_prefix, exe_name) - if ( - found_executable - and os.path.exists(binary_executable) - and os.path.samefile( - found_executable, - binary_executable, - ) - ): - return exe_name - - # Use the `-m` invocation, if there's no "nice" invocation. - return f"{get_best_invocation_for_this_python()} -m pip" - - -def get_best_invocation_for_this_python() -> str: - """Try to figure out the best way to invoke the current Python.""" - exe = sys.executable - exe_name = os.path.basename(exe) - - # Try to use the basename, if it's the first executable. - found_executable = shutil.which(exe_name) - if found_executable and os.path.samefile(found_executable, exe): - return exe_name - - # Use the full executable name, because we couldn't find something simpler. - return exe diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py b/venv/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py deleted file mode 100644 index 83c2df7..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py +++ /dev/null @@ -1,153 +0,0 @@ -import fnmatch -import os -import os.path -import random -import sys -from contextlib import contextmanager -from tempfile import NamedTemporaryFile -from typing import Any, BinaryIO, Generator, List, Union, cast - -from pip._vendor.tenacity import retry, stop_after_delay, wait_fixed - -from pip._internal.utils.compat import get_path_uid -from pip._internal.utils.misc import format_size - - -def check_path_owner(path: str) -> bool: - # If we don't have a way to check the effective uid of this process, then - # we'll just assume that we own the directory. - if sys.platform == "win32" or not hasattr(os, "geteuid"): - return True - - assert os.path.isabs(path) - - previous = None - while path != previous: - if os.path.lexists(path): - # Check if path is writable by current user. - if os.geteuid() == 0: - # Special handling for root user in order to handle properly - # cases where users use sudo without -H flag. - try: - path_uid = get_path_uid(path) - except OSError: - return False - return path_uid == 0 - else: - return os.access(path, os.W_OK) - else: - previous, path = path, os.path.dirname(path) - return False # assume we don't own the path - - -@contextmanager -def adjacent_tmp_file(path: str, **kwargs: Any) -> Generator[BinaryIO, None, None]: - """Return a file-like object pointing to a tmp file next to path. - - The file is created securely and is ensured to be written to disk - after the context reaches its end. - - kwargs will be passed to tempfile.NamedTemporaryFile to control - the way the temporary file will be opened. - """ - with NamedTemporaryFile( - delete=False, - dir=os.path.dirname(path), - prefix=os.path.basename(path), - suffix=".tmp", - **kwargs, - ) as f: - result = cast(BinaryIO, f) - try: - yield result - finally: - result.flush() - os.fsync(result.fileno()) - - -# Tenacity raises RetryError by default, explicitly raise the original exception -_replace_retry = retry(reraise=True, stop=stop_after_delay(1), wait=wait_fixed(0.25)) - -replace = _replace_retry(os.replace) - - -# test_writable_dir and _test_writable_dir_win are copied from Flit, -# with the author's agreement to also place them under pip's license. -def test_writable_dir(path: str) -> bool: - """Check if a directory is writable. - - Uses os.access() on POSIX, tries creating files on Windows. - """ - # If the directory doesn't exist, find the closest parent that does. - while not os.path.isdir(path): - parent = os.path.dirname(path) - if parent == path: - break # Should never get here, but infinite loops are bad - path = parent - - if os.name == "posix": - return os.access(path, os.W_OK) - - return _test_writable_dir_win(path) - - -def _test_writable_dir_win(path: str) -> bool: - # os.access doesn't work on Windows: http://bugs.python.org/issue2528 - # and we can't use tempfile: http://bugs.python.org/issue22107 - basename = "accesstest_deleteme_fishfingers_custard_" - alphabet = "abcdefghijklmnopqrstuvwxyz0123456789" - for _ in range(10): - name = basename + "".join(random.choice(alphabet) for _ in range(6)) - file = os.path.join(path, name) - try: - fd = os.open(file, os.O_RDWR | os.O_CREAT | os.O_EXCL) - except FileExistsError: - pass - except PermissionError: - # This could be because there's a directory with the same name. - # But it's highly unlikely there's a directory called that, - # so we'll assume it's because the parent dir is not writable. - # This could as well be because the parent dir is not readable, - # due to non-privileged user access. - return False - else: - os.close(fd) - os.unlink(file) - return True - - # This should never be reached - raise OSError("Unexpected condition testing for writable directory") - - -def find_files(path: str, pattern: str) -> List[str]: - """Returns a list of absolute paths of files beneath path, recursively, - with filenames which match the UNIX-style shell glob pattern.""" - result: List[str] = [] - for root, _, files in os.walk(path): - matches = fnmatch.filter(files, pattern) - result.extend(os.path.join(root, f) for f in matches) - return result - - -def file_size(path: str) -> Union[int, float]: - # If it's a symlink, return 0. - if os.path.islink(path): - return 0 - return os.path.getsize(path) - - -def format_file_size(path: str) -> str: - return format_size(file_size(path)) - - -def directory_size(path: str) -> Union[int, float]: - size = 0.0 - for root, _dirs, files in os.walk(path): - for filename in files: - file_path = os.path.join(root, filename) - size += file_size(file_path) - return size - - -def format_directory_size(path: str) -> str: - return format_size(directory_size(path)) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/filetypes.py b/venv/lib/python3.12/site-packages/pip/_internal/utils/filetypes.py deleted file mode 100644 index 5948570..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/utils/filetypes.py +++ /dev/null @@ -1,27 +0,0 @@ -"""Filetype information. -""" - -from typing import Tuple - -from pip._internal.utils.misc import splitext - -WHEEL_EXTENSION = ".whl" -BZ2_EXTENSIONS: Tuple[str, ...] = (".tar.bz2", ".tbz") -XZ_EXTENSIONS: Tuple[str, ...] = ( - ".tar.xz", - ".txz", - ".tlz", - ".tar.lz", - ".tar.lzma", -) -ZIP_EXTENSIONS: Tuple[str, ...] = (".zip", WHEEL_EXTENSION) -TAR_EXTENSIONS: Tuple[str, ...] = (".tar.gz", ".tgz", ".tar") -ARCHIVE_EXTENSIONS = ZIP_EXTENSIONS + BZ2_EXTENSIONS + TAR_EXTENSIONS + XZ_EXTENSIONS - - -def is_archive_file(name: str) -> bool: - """Return True if `name` is a considered as an archive file.""" - ext = splitext(name)[1].lower() - if ext in ARCHIVE_EXTENSIONS: - return True - return False diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/glibc.py b/venv/lib/python3.12/site-packages/pip/_internal/utils/glibc.py deleted file mode 100644 index 81342af..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/utils/glibc.py +++ /dev/null @@ -1,88 +0,0 @@ -import os -import sys -from typing import Optional, Tuple - - -def glibc_version_string() -> Optional[str]: - "Returns glibc version string, or None if not using glibc." - return glibc_version_string_confstr() or glibc_version_string_ctypes() - - -def glibc_version_string_confstr() -> Optional[str]: - "Primary implementation of glibc_version_string using os.confstr." - # os.confstr is quite a bit faster than ctypes.DLL. It's also less likely - # to be broken or missing. This strategy is used in the standard library - # platform module: - # https://github.com/python/cpython/blob/fcf1d003bf4f0100c9d0921ff3d70e1127ca1b71/Lib/platform.py#L175-L183 - if sys.platform == "win32": - return None - try: - gnu_libc_version = os.confstr("CS_GNU_LIBC_VERSION") - if gnu_libc_version is None: - return None - # os.confstr("CS_GNU_LIBC_VERSION") returns a string like "glibc 2.17": - _, version = gnu_libc_version.split() - except (AttributeError, OSError, ValueError): - # os.confstr() or CS_GNU_LIBC_VERSION not available (or a bad value)... - return None - return version - - -def glibc_version_string_ctypes() -> Optional[str]: - "Fallback implementation of glibc_version_string using ctypes." - - try: - import ctypes - except ImportError: - return None - - # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen - # manpage says, "If filename is NULL, then the returned handle is for the - # main program". This way we can let the linker do the work to figure out - # which libc our process is actually using. - process_namespace = ctypes.CDLL(None) - try: - gnu_get_libc_version = process_namespace.gnu_get_libc_version - except AttributeError: - # Symbol doesn't exist -> therefore, we are not linked to - # glibc. - return None - - # Call gnu_get_libc_version, which returns a string like "2.5" - gnu_get_libc_version.restype = ctypes.c_char_p - version_str = gnu_get_libc_version() - # py2 / py3 compatibility: - if not isinstance(version_str, str): - version_str = version_str.decode("ascii") - - return version_str - - -# platform.libc_ver regularly returns completely nonsensical glibc -# versions. E.g. on my computer, platform says: -# -# ~$ python2.7 -c 'import platform; print(platform.libc_ver())' -# ('glibc', '2.7') -# ~$ python3.5 -c 'import platform; print(platform.libc_ver())' -# ('glibc', '2.9') -# -# But the truth is: -# -# ~$ ldd --version -# ldd (Debian GLIBC 2.22-11) 2.22 -# -# This is unfortunate, because it means that the linehaul data on libc -# versions that was generated by pip 8.1.2 and earlier is useless and -# misleading. Solution: instead of using platform, use our code that actually -# works. -def libc_ver() -> Tuple[str, str]: - """Try to determine the glibc version - - Returns a tuple of strings (lib, version) which default to empty strings - in case the lookup fails. - """ - glibc_version = glibc_version_string() - if glibc_version is None: - return ("", "") - else: - return ("glibc", glibc_version) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/hashes.py b/venv/lib/python3.12/site-packages/pip/_internal/utils/hashes.py deleted file mode 100644 index 843cffc..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/utils/hashes.py +++ /dev/null @@ -1,151 +0,0 @@ -import hashlib -from typing import TYPE_CHECKING, BinaryIO, Dict, Iterable, List, Optional - -from pip._internal.exceptions import HashMismatch, HashMissing, InstallationError -from pip._internal.utils.misc import read_chunks - -if TYPE_CHECKING: - from hashlib import _Hash - - # NoReturn introduced in 3.6.2; imported only for type checking to maintain - # pip compatibility with older patch versions of Python 3.6 - from typing import NoReturn - - -# The recommended hash algo of the moment. Change this whenever the state of -# the art changes; it won't hurt backward compatibility. -FAVORITE_HASH = "sha256" - - -# Names of hashlib algorithms allowed by the --hash option and ``pip hash`` -# Currently, those are the ones at least as collision-resistant as sha256. -STRONG_HASHES = ["sha256", "sha384", "sha512"] - - -class Hashes: - """A wrapper that builds multiple hashes at once and checks them against - known-good values - - """ - - def __init__(self, hashes: Optional[Dict[str, List[str]]] = None) -> None: - """ - :param hashes: A dict of algorithm names pointing to lists of allowed - hex digests - """ - allowed = {} - if hashes is not None: - for alg, keys in hashes.items(): - # Make sure values are always sorted (to ease equality checks) - allowed[alg] = sorted(keys) - self._allowed = allowed - - def __and__(self, other: "Hashes") -> "Hashes": - if not isinstance(other, Hashes): - return NotImplemented - - # If either of the Hashes object is entirely empty (i.e. no hash - # specified at all), all hashes from the other object are allowed. - if not other: - return self - if not self: - return other - - # Otherwise only hashes that present in both objects are allowed. - new = {} - for alg, values in other._allowed.items(): - if alg not in self._allowed: - continue - new[alg] = [v for v in values if v in self._allowed[alg]] - return Hashes(new) - - @property - def digest_count(self) -> int: - return sum(len(digests) for digests in self._allowed.values()) - - def is_hash_allowed(self, hash_name: str, hex_digest: str) -> bool: - """Return whether the given hex digest is allowed.""" - return hex_digest in self._allowed.get(hash_name, []) - - def check_against_chunks(self, chunks: Iterable[bytes]) -> None: - """Check good hashes against ones built from iterable of chunks of - data. - - Raise HashMismatch if none match. - - """ - gots = {} - for hash_name in self._allowed.keys(): - try: - gots[hash_name] = hashlib.new(hash_name) - except (ValueError, TypeError): - raise InstallationError(f"Unknown hash name: {hash_name}") - - for chunk in chunks: - for hash in gots.values(): - hash.update(chunk) - - for hash_name, got in gots.items(): - if got.hexdigest() in self._allowed[hash_name]: - return - self._raise(gots) - - def _raise(self, gots: Dict[str, "_Hash"]) -> "NoReturn": - raise HashMismatch(self._allowed, gots) - - def check_against_file(self, file: BinaryIO) -> None: - """Check good hashes against a file-like object - - Raise HashMismatch if none match. - - """ - return self.check_against_chunks(read_chunks(file)) - - def check_against_path(self, path: str) -> None: - with open(path, "rb") as file: - return self.check_against_file(file) - - def has_one_of(self, hashes: Dict[str, str]) -> bool: - """Return whether any of the given hashes are allowed.""" - for hash_name, hex_digest in hashes.items(): - if self.is_hash_allowed(hash_name, hex_digest): - return True - return False - - def __bool__(self) -> bool: - """Return whether I know any known-good hashes.""" - return bool(self._allowed) - - def __eq__(self, other: object) -> bool: - if not isinstance(other, Hashes): - return NotImplemented - return self._allowed == other._allowed - - def __hash__(self) -> int: - return hash( - ",".join( - sorted( - ":".join((alg, digest)) - for alg, digest_list in self._allowed.items() - for digest in digest_list - ) - ) - ) - - -class MissingHashes(Hashes): - """A workalike for Hashes used when we're missing a hash for a requirement - - It computes the actual hash of the requirement and raises a HashMissing - exception showing it to the user. - - """ - - def __init__(self) -> None: - """Don't offer the ``hashes`` kwarg.""" - # Pass our favorite hash in to generate a "gotten hash". With the - # empty list, it will never match, so an error will always raise. - super().__init__(hashes={FAVORITE_HASH: []}) - - def _raise(self, gots: Dict[str, "_Hash"]) -> "NoReturn": - raise HashMissing(gots[FAVORITE_HASH].hexdigest()) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/logging.py b/venv/lib/python3.12/site-packages/pip/_internal/utils/logging.py deleted file mode 100644 index 95982df..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/utils/logging.py +++ /dev/null @@ -1,348 +0,0 @@ -import contextlib -import errno -import logging -import logging.handlers -import os -import sys -import threading -from dataclasses import dataclass -from io import TextIOWrapper -from logging import Filter -from typing import Any, ClassVar, Generator, List, Optional, TextIO, Type - -from pip._vendor.rich.console import ( - Console, - ConsoleOptions, - ConsoleRenderable, - RenderableType, - RenderResult, - RichCast, -) -from pip._vendor.rich.highlighter import NullHighlighter -from pip._vendor.rich.logging import RichHandler -from pip._vendor.rich.segment import Segment -from pip._vendor.rich.style import Style - -from pip._internal.utils._log import VERBOSE, getLogger -from pip._internal.utils.compat import WINDOWS -from pip._internal.utils.deprecation import DEPRECATION_MSG_PREFIX -from pip._internal.utils.misc import ensure_dir - -_log_state = threading.local() -subprocess_logger = getLogger("pip.subprocessor") - - -class BrokenStdoutLoggingError(Exception): - """ - Raised if BrokenPipeError occurs for the stdout stream while logging. - """ - - -def _is_broken_pipe_error(exc_class: Type[BaseException], exc: BaseException) -> bool: - if exc_class is BrokenPipeError: - return True - - # On Windows, a broken pipe can show up as EINVAL rather than EPIPE: - # https://bugs.python.org/issue19612 - # https://bugs.python.org/issue30418 - if not WINDOWS: - return False - - return isinstance(exc, OSError) and exc.errno in (errno.EINVAL, errno.EPIPE) - - -@contextlib.contextmanager -def indent_log(num: int = 2) -> Generator[None, None, None]: - """ - A context manager which will cause the log output to be indented for any - log messages emitted inside it. - """ - # For thread-safety - _log_state.indentation = get_indentation() - _log_state.indentation += num - try: - yield - finally: - _log_state.indentation -= num - - -def get_indentation() -> int: - return getattr(_log_state, "indentation", 0) - - -class IndentingFormatter(logging.Formatter): - default_time_format = "%Y-%m-%dT%H:%M:%S" - - def __init__( - self, - *args: Any, - add_timestamp: bool = False, - **kwargs: Any, - ) -> None: - """ - A logging.Formatter that obeys the indent_log() context manager. - - :param add_timestamp: A bool indicating output lines should be prefixed - with their record's timestamp. - """ - self.add_timestamp = add_timestamp - super().__init__(*args, **kwargs) - - def get_message_start(self, formatted: str, levelno: int) -> str: - """ - Return the start of the formatted log message (not counting the - prefix to add to each line). - """ - if levelno < logging.WARNING: - return "" - if formatted.startswith(DEPRECATION_MSG_PREFIX): - # Then the message already has a prefix. We don't want it to - # look like "WARNING: DEPRECATION: ...." - return "" - if levelno < logging.ERROR: - return "WARNING: " - - return "ERROR: " - - def format(self, record: logging.LogRecord) -> str: - """ - Calls the standard formatter, but will indent all of the log message - lines by our current indentation level. - """ - formatted = super().format(record) - message_start = self.get_message_start(formatted, record.levelno) - formatted = message_start + formatted - - prefix = "" - if self.add_timestamp: - prefix = f"{self.formatTime(record)} " - prefix += " " * get_indentation() - formatted = "".join([prefix + line for line in formatted.splitlines(True)]) - return formatted - - -@dataclass -class IndentedRenderable: - renderable: RenderableType - indent: int - - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - segments = console.render(self.renderable, options) - lines = Segment.split_lines(segments) - for line in lines: - yield Segment(" " * self.indent) - yield from line - yield Segment("\n") - - -class RichPipStreamHandler(RichHandler): - KEYWORDS: ClassVar[Optional[List[str]]] = [] - - def __init__(self, stream: Optional[TextIO], no_color: bool) -> None: - super().__init__( - console=Console(file=stream, no_color=no_color, soft_wrap=True), - show_time=False, - show_level=False, - show_path=False, - highlighter=NullHighlighter(), - ) - - # Our custom override on Rich's logger, to make things work as we need them to. - def emit(self, record: logging.LogRecord) -> None: - style: Optional[Style] = None - - # If we are given a diagnostic error to present, present it with indentation. - assert isinstance(record.args, tuple) - if getattr(record, "rich", False): - (rich_renderable,) = record.args - assert isinstance( - rich_renderable, (ConsoleRenderable, RichCast, str) - ), f"{rich_renderable} is not rich-console-renderable" - - renderable: RenderableType = IndentedRenderable( - rich_renderable, indent=get_indentation() - ) - else: - message = self.format(record) - renderable = self.render_message(record, message) - if record.levelno is not None: - if record.levelno >= logging.ERROR: - style = Style(color="red") - elif record.levelno >= logging.WARNING: - style = Style(color="yellow") - - try: - self.console.print(renderable, overflow="ignore", crop=False, style=style) - except Exception: - self.handleError(record) - - def handleError(self, record: logging.LogRecord) -> None: - """Called when logging is unable to log some output.""" - - exc_class, exc = sys.exc_info()[:2] - # If a broken pipe occurred while calling write() or flush() on the - # stdout stream in logging's Handler.emit(), then raise our special - # exception so we can handle it in main() instead of logging the - # broken pipe error and continuing. - if ( - exc_class - and exc - and self.console.file is sys.stdout - and _is_broken_pipe_error(exc_class, exc) - ): - raise BrokenStdoutLoggingError() - - return super().handleError(record) - - -class BetterRotatingFileHandler(logging.handlers.RotatingFileHandler): - def _open(self) -> TextIOWrapper: - ensure_dir(os.path.dirname(self.baseFilename)) - return super()._open() - - -class MaxLevelFilter(Filter): - def __init__(self, level: int) -> None: - self.level = level - - def filter(self, record: logging.LogRecord) -> bool: - return record.levelno < self.level - - -class ExcludeLoggerFilter(Filter): - - """ - A logging Filter that excludes records from a logger (or its children). - """ - - def filter(self, record: logging.LogRecord) -> bool: - # The base Filter class allows only records from a logger (or its - # children). - return not super().filter(record) - - -def setup_logging(verbosity: int, no_color: bool, user_log_file: Optional[str]) -> int: - """Configures and sets up all of the logging - - Returns the requested logging level, as its integer value. - """ - - # Determine the level to be logging at. - if verbosity >= 2: - level_number = logging.DEBUG - elif verbosity == 1: - level_number = VERBOSE - elif verbosity == -1: - level_number = logging.WARNING - elif verbosity == -2: - level_number = logging.ERROR - elif verbosity <= -3: - level_number = logging.CRITICAL - else: - level_number = logging.INFO - - level = logging.getLevelName(level_number) - - # The "root" logger should match the "console" level *unless* we also need - # to log to a user log file. - include_user_log = user_log_file is not None - if include_user_log: - additional_log_file = user_log_file - root_level = "DEBUG" - else: - additional_log_file = "/dev/null" - root_level = level - - # Disable any logging besides WARNING unless we have DEBUG level logging - # enabled for vendored libraries. - vendored_log_level = "WARNING" if level in ["INFO", "ERROR"] else "DEBUG" - - # Shorthands for clarity - log_streams = { - "stdout": "ext://sys.stdout", - "stderr": "ext://sys.stderr", - } - handler_classes = { - "stream": "pip._internal.utils.logging.RichPipStreamHandler", - "file": "pip._internal.utils.logging.BetterRotatingFileHandler", - } - handlers = ["console", "console_errors", "console_subprocess"] + ( - ["user_log"] if include_user_log else [] - ) - - logging.config.dictConfig( - { - "version": 1, - "disable_existing_loggers": False, - "filters": { - "exclude_warnings": { - "()": "pip._internal.utils.logging.MaxLevelFilter", - "level": logging.WARNING, - }, - "restrict_to_subprocess": { - "()": "logging.Filter", - "name": subprocess_logger.name, - }, - "exclude_subprocess": { - "()": "pip._internal.utils.logging.ExcludeLoggerFilter", - "name": subprocess_logger.name, - }, - }, - "formatters": { - "indent": { - "()": IndentingFormatter, - "format": "%(message)s", - }, - "indent_with_timestamp": { - "()": IndentingFormatter, - "format": "%(message)s", - "add_timestamp": True, - }, - }, - "handlers": { - "console": { - "level": level, - "class": handler_classes["stream"], - "no_color": no_color, - "stream": log_streams["stdout"], - "filters": ["exclude_subprocess", "exclude_warnings"], - "formatter": "indent", - }, - "console_errors": { - "level": "WARNING", - "class": handler_classes["stream"], - "no_color": no_color, - "stream": log_streams["stderr"], - "filters": ["exclude_subprocess"], - "formatter": "indent", - }, - # A handler responsible for logging to the console messages - # from the "subprocessor" logger. - "console_subprocess": { - "level": level, - "class": handler_classes["stream"], - "stream": log_streams["stderr"], - "no_color": no_color, - "filters": ["restrict_to_subprocess"], - "formatter": "indent", - }, - "user_log": { - "level": "DEBUG", - "class": handler_classes["file"], - "filename": additional_log_file, - "encoding": "utf-8", - "delay": True, - "formatter": "indent_with_timestamp", - }, - }, - "root": { - "level": root_level, - "handlers": handlers, - }, - "loggers": {"pip._vendor": {"level": vendored_log_level}}, - } - ) - - return level_number diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/misc.py b/venv/lib/python3.12/site-packages/pip/_internal/utils/misc.py deleted file mode 100644 index 1ad3f61..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/utils/misc.py +++ /dev/null @@ -1,783 +0,0 @@ -import contextlib -import errno -import getpass -import hashlib -import io -import logging -import os -import posixpath -import shutil -import stat -import sys -import sysconfig -import urllib.parse -from functools import partial -from io import StringIO -from itertools import filterfalse, tee, zip_longest -from pathlib import Path -from types import FunctionType, TracebackType -from typing import ( - Any, - BinaryIO, - Callable, - ContextManager, - Dict, - Generator, - Iterable, - Iterator, - List, - Optional, - TextIO, - Tuple, - Type, - TypeVar, - Union, - cast, -) - -from pip._vendor.packaging.requirements import Requirement -from pip._vendor.pyproject_hooks import BuildBackendHookCaller -from pip._vendor.tenacity import retry, stop_after_delay, wait_fixed - -from pip import __version__ -from pip._internal.exceptions import CommandError, ExternallyManagedEnvironment -from pip._internal.locations import get_major_minor_version -from pip._internal.utils.compat import WINDOWS -from pip._internal.utils.virtualenv import running_under_virtualenv - -__all__ = [ - "rmtree", - "display_path", - "backup_dir", - "ask", - "splitext", - "format_size", - "is_installable_dir", - "normalize_path", - "renames", - "get_prog", - "captured_stdout", - "ensure_dir", - "remove_auth_from_url", - "check_externally_managed", - "ConfiguredBuildBackendHookCaller", -] - -logger = logging.getLogger(__name__) - -T = TypeVar("T") -ExcInfo = Tuple[Type[BaseException], BaseException, TracebackType] -VersionInfo = Tuple[int, int, int] -NetlocTuple = Tuple[str, Tuple[Optional[str], Optional[str]]] -OnExc = Callable[[FunctionType, Path, BaseException], Any] -OnErr = Callable[[FunctionType, Path, ExcInfo], Any] - - -def get_pip_version() -> str: - pip_pkg_dir = os.path.join(os.path.dirname(__file__), "..", "..") - pip_pkg_dir = os.path.abspath(pip_pkg_dir) - - return f"pip {__version__} from {pip_pkg_dir} (python {get_major_minor_version()})" - - -def normalize_version_info(py_version_info: Tuple[int, ...]) -> Tuple[int, int, int]: - """ - Convert a tuple of ints representing a Python version to one of length - three. - - :param py_version_info: a tuple of ints representing a Python version, - or None to specify no version. The tuple can have any length. - - :return: a tuple of length three if `py_version_info` is non-None. - Otherwise, return `py_version_info` unchanged (i.e. None). - """ - if len(py_version_info) < 3: - py_version_info += (3 - len(py_version_info)) * (0,) - elif len(py_version_info) > 3: - py_version_info = py_version_info[:3] - - return cast("VersionInfo", py_version_info) - - -def ensure_dir(path: str) -> None: - """os.path.makedirs without EEXIST.""" - try: - os.makedirs(path) - except OSError as e: - # Windows can raise spurious ENOTEMPTY errors. See #6426. - if e.errno != errno.EEXIST and e.errno != errno.ENOTEMPTY: - raise - - -def get_prog() -> str: - try: - prog = os.path.basename(sys.argv[0]) - if prog in ("__main__.py", "-c"): - return f"{sys.executable} -m pip" - else: - return prog - except (AttributeError, TypeError, IndexError): - pass - return "pip" - - -# Retry every half second for up to 3 seconds -# Tenacity raises RetryError by default, explicitly raise the original exception -@retry(reraise=True, stop=stop_after_delay(3), wait=wait_fixed(0.5)) -def rmtree( - dir: str, - ignore_errors: bool = False, - onexc: Optional[OnExc] = None, -) -> None: - if ignore_errors: - onexc = _onerror_ignore - if onexc is None: - onexc = _onerror_reraise - handler: OnErr = partial( - # `[func, path, Union[ExcInfo, BaseException]] -> Any` is equivalent to - # `Union[([func, path, ExcInfo] -> Any), ([func, path, BaseException] -> Any)]`. - cast(Union[OnExc, OnErr], rmtree_errorhandler), - onexc=onexc, - ) - if sys.version_info >= (3, 12): - # See https://docs.python.org/3.12/whatsnew/3.12.html#shutil. - shutil.rmtree(dir, onexc=handler) # type: ignore - else: - shutil.rmtree(dir, onerror=handler) # type: ignore - - -def _onerror_ignore(*_args: Any) -> None: - pass - - -def _onerror_reraise(*_args: Any) -> None: - raise - - -def rmtree_errorhandler( - func: FunctionType, - path: Path, - exc_info: Union[ExcInfo, BaseException], - *, - onexc: OnExc = _onerror_reraise, -) -> None: - """ - `rmtree` error handler to 'force' a file remove (i.e. like `rm -f`). - - * If a file is readonly then it's write flag is set and operation is - retried. - - * `onerror` is the original callback from `rmtree(... onerror=onerror)` - that is chained at the end if the "rm -f" still fails. - """ - try: - st_mode = os.stat(path).st_mode - except OSError: - # it's equivalent to os.path.exists - return - - if not st_mode & stat.S_IWRITE: - # convert to read/write - try: - os.chmod(path, st_mode | stat.S_IWRITE) - except OSError: - pass - else: - # use the original function to repeat the operation - try: - func(path) - return - except OSError: - pass - - if not isinstance(exc_info, BaseException): - _, exc_info, _ = exc_info - onexc(func, path, exc_info) - - -def display_path(path: str) -> str: - """Gives the display value for a given path, making it relative to cwd - if possible.""" - path = os.path.normcase(os.path.abspath(path)) - if path.startswith(os.getcwd() + os.path.sep): - path = "." + path[len(os.getcwd()) :] - return path - - -def backup_dir(dir: str, ext: str = ".bak") -> str: - """Figure out the name of a directory to back up the given dir to - (adding .bak, .bak2, etc)""" - n = 1 - extension = ext - while os.path.exists(dir + extension): - n += 1 - extension = ext + str(n) - return dir + extension - - -def ask_path_exists(message: str, options: Iterable[str]) -> str: - for action in os.environ.get("PIP_EXISTS_ACTION", "").split(): - if action in options: - return action - return ask(message, options) - - -def _check_no_input(message: str) -> None: - """Raise an error if no input is allowed.""" - if os.environ.get("PIP_NO_INPUT"): - raise Exception( - f"No input was expected ($PIP_NO_INPUT set); question: {message}" - ) - - -def ask(message: str, options: Iterable[str]) -> str: - """Ask the message interactively, with the given possible responses""" - while 1: - _check_no_input(message) - response = input(message) - response = response.strip().lower() - if response not in options: - print( - "Your response ({!r}) was not one of the expected responses: " - "{}".format(response, ", ".join(options)) - ) - else: - return response - - -def ask_input(message: str) -> str: - """Ask for input interactively.""" - _check_no_input(message) - return input(message) - - -def ask_password(message: str) -> str: - """Ask for a password interactively.""" - _check_no_input(message) - return getpass.getpass(message) - - -def strtobool(val: str) -> int: - """Convert a string representation of truth to true (1) or false (0). - - True values are 'y', 'yes', 't', 'true', 'on', and '1'; false values - are 'n', 'no', 'f', 'false', 'off', and '0'. Raises ValueError if - 'val' is anything else. - """ - val = val.lower() - if val in ("y", "yes", "t", "true", "on", "1"): - return 1 - elif val in ("n", "no", "f", "false", "off", "0"): - return 0 - else: - raise ValueError(f"invalid truth value {val!r}") - - -def format_size(bytes: float) -> str: - if bytes > 1000 * 1000: - return f"{bytes / 1000.0 / 1000:.1f} MB" - elif bytes > 10 * 1000: - return f"{int(bytes / 1000)} kB" - elif bytes > 1000: - return f"{bytes / 1000.0:.1f} kB" - else: - return f"{int(bytes)} bytes" - - -def tabulate(rows: Iterable[Iterable[Any]]) -> Tuple[List[str], List[int]]: - """Return a list of formatted rows and a list of column sizes. - - For example:: - - >>> tabulate([['foobar', 2000], [0xdeadbeef]]) - (['foobar 2000', '3735928559'], [10, 4]) - """ - rows = [tuple(map(str, row)) for row in rows] - sizes = [max(map(len, col)) for col in zip_longest(*rows, fillvalue="")] - table = [" ".join(map(str.ljust, row, sizes)).rstrip() for row in rows] - return table, sizes - - -def is_installable_dir(path: str) -> bool: - """Is path is a directory containing pyproject.toml or setup.py? - - If pyproject.toml exists, this is a PEP 517 project. Otherwise we look for - a legacy setuptools layout by identifying setup.py. We don't check for the - setup.cfg because using it without setup.py is only available for PEP 517 - projects, which are already covered by the pyproject.toml check. - """ - if not os.path.isdir(path): - return False - if os.path.isfile(os.path.join(path, "pyproject.toml")): - return True - if os.path.isfile(os.path.join(path, "setup.py")): - return True - return False - - -def read_chunks( - file: BinaryIO, size: int = io.DEFAULT_BUFFER_SIZE -) -> Generator[bytes, None, None]: - """Yield pieces of data from a file-like object until EOF.""" - while True: - chunk = file.read(size) - if not chunk: - break - yield chunk - - -def normalize_path(path: str, resolve_symlinks: bool = True) -> str: - """ - Convert a path to its canonical, case-normalized, absolute version. - - """ - path = os.path.expanduser(path) - if resolve_symlinks: - path = os.path.realpath(path) - else: - path = os.path.abspath(path) - return os.path.normcase(path) - - -def splitext(path: str) -> Tuple[str, str]: - """Like os.path.splitext, but take off .tar too""" - base, ext = posixpath.splitext(path) - if base.lower().endswith(".tar"): - ext = base[-4:] + ext - base = base[:-4] - return base, ext - - -def renames(old: str, new: str) -> None: - """Like os.renames(), but handles renaming across devices.""" - # Implementation borrowed from os.renames(). - head, tail = os.path.split(new) - if head and tail and not os.path.exists(head): - os.makedirs(head) - - shutil.move(old, new) - - head, tail = os.path.split(old) - if head and tail: - try: - os.removedirs(head) - except OSError: - pass - - -def is_local(path: str) -> bool: - """ - Return True if path is within sys.prefix, if we're running in a virtualenv. - - If we're not in a virtualenv, all paths are considered "local." - - Caution: this function assumes the head of path has been normalized - with normalize_path. - """ - if not running_under_virtualenv(): - return True - return path.startswith(normalize_path(sys.prefix)) - - -def write_output(msg: Any, *args: Any) -> None: - logger.info(msg, *args) - - -class StreamWrapper(StringIO): - orig_stream: TextIO - - @classmethod - def from_stream(cls, orig_stream: TextIO) -> "StreamWrapper": - ret = cls() - ret.orig_stream = orig_stream - return ret - - # compileall.compile_dir() needs stdout.encoding to print to stdout - # type ignore is because TextIOBase.encoding is writeable - @property - def encoding(self) -> str: # type: ignore - return self.orig_stream.encoding - - -@contextlib.contextmanager -def captured_output(stream_name: str) -> Generator[StreamWrapper, None, None]: - """Return a context manager used by captured_stdout/stdin/stderr - that temporarily replaces the sys stream *stream_name* with a StringIO. - - Taken from Lib/support/__init__.py in the CPython repo. - """ - orig_stdout = getattr(sys, stream_name) - setattr(sys, stream_name, StreamWrapper.from_stream(orig_stdout)) - try: - yield getattr(sys, stream_name) - finally: - setattr(sys, stream_name, orig_stdout) - - -def captured_stdout() -> ContextManager[StreamWrapper]: - """Capture the output of sys.stdout: - - with captured_stdout() as stdout: - print('hello') - self.assertEqual(stdout.getvalue(), 'hello\n') - - Taken from Lib/support/__init__.py in the CPython repo. - """ - return captured_output("stdout") - - -def captured_stderr() -> ContextManager[StreamWrapper]: - """ - See captured_stdout(). - """ - return captured_output("stderr") - - -# Simulates an enum -def enum(*sequential: Any, **named: Any) -> Type[Any]: - enums = dict(zip(sequential, range(len(sequential))), **named) - reverse = {value: key for key, value in enums.items()} - enums["reverse_mapping"] = reverse - return type("Enum", (), enums) - - -def build_netloc(host: str, port: Optional[int]) -> str: - """ - Build a netloc from a host-port pair - """ - if port is None: - return host - if ":" in host: - # Only wrap host with square brackets when it is IPv6 - host = f"[{host}]" - return f"{host}:{port}" - - -def build_url_from_netloc(netloc: str, scheme: str = "https") -> str: - """ - Build a full URL from a netloc. - """ - if netloc.count(":") >= 2 and "@" not in netloc and "[" not in netloc: - # It must be a bare IPv6 address, so wrap it with brackets. - netloc = f"[{netloc}]" - return f"{scheme}://{netloc}" - - -def parse_netloc(netloc: str) -> Tuple[Optional[str], Optional[int]]: - """ - Return the host-port pair from a netloc. - """ - url = build_url_from_netloc(netloc) - parsed = urllib.parse.urlparse(url) - return parsed.hostname, parsed.port - - -def split_auth_from_netloc(netloc: str) -> NetlocTuple: - """ - Parse out and remove the auth information from a netloc. - - Returns: (netloc, (username, password)). - """ - if "@" not in netloc: - return netloc, (None, None) - - # Split from the right because that's how urllib.parse.urlsplit() - # behaves if more than one @ is present (which can be checked using - # the password attribute of urlsplit()'s return value). - auth, netloc = netloc.rsplit("@", 1) - pw: Optional[str] = None - if ":" in auth: - # Split from the left because that's how urllib.parse.urlsplit() - # behaves if more than one : is present (which again can be checked - # using the password attribute of the return value) - user, pw = auth.split(":", 1) - else: - user, pw = auth, None - - user = urllib.parse.unquote(user) - if pw is not None: - pw = urllib.parse.unquote(pw) - - return netloc, (user, pw) - - -def redact_netloc(netloc: str) -> str: - """ - Replace the sensitive data in a netloc with "****", if it exists. - - For example: - - "user:pass@example.com" returns "user:****@example.com" - - "accesstoken@example.com" returns "****@example.com" - """ - netloc, (user, password) = split_auth_from_netloc(netloc) - if user is None: - return netloc - if password is None: - user = "****" - password = "" - else: - user = urllib.parse.quote(user) - password = ":****" - return f"{user}{password}@{netloc}" - - -def _transform_url( - url: str, transform_netloc: Callable[[str], Tuple[Any, ...]] -) -> Tuple[str, NetlocTuple]: - """Transform and replace netloc in a url. - - transform_netloc is a function taking the netloc and returning a - tuple. The first element of this tuple is the new netloc. The - entire tuple is returned. - - Returns a tuple containing the transformed url as item 0 and the - original tuple returned by transform_netloc as item 1. - """ - purl = urllib.parse.urlsplit(url) - netloc_tuple = transform_netloc(purl.netloc) - # stripped url - url_pieces = (purl.scheme, netloc_tuple[0], purl.path, purl.query, purl.fragment) - surl = urllib.parse.urlunsplit(url_pieces) - return surl, cast("NetlocTuple", netloc_tuple) - - -def _get_netloc(netloc: str) -> NetlocTuple: - return split_auth_from_netloc(netloc) - - -def _redact_netloc(netloc: str) -> Tuple[str]: - return (redact_netloc(netloc),) - - -def split_auth_netloc_from_url( - url: str, -) -> Tuple[str, str, Tuple[Optional[str], Optional[str]]]: - """ - Parse a url into separate netloc, auth, and url with no auth. - - Returns: (url_without_auth, netloc, (username, password)) - """ - url_without_auth, (netloc, auth) = _transform_url(url, _get_netloc) - return url_without_auth, netloc, auth - - -def remove_auth_from_url(url: str) -> str: - """Return a copy of url with 'username:password@' removed.""" - # username/pass params are passed to subversion through flags - # and are not recognized in the url. - return _transform_url(url, _get_netloc)[0] - - -def redact_auth_from_url(url: str) -> str: - """Replace the password in a given url with ****.""" - return _transform_url(url, _redact_netloc)[0] - - -def redact_auth_from_requirement(req: Requirement) -> str: - """Replace the password in a given requirement url with ****.""" - if not req.url: - return str(req) - return str(req).replace(req.url, redact_auth_from_url(req.url)) - - -class HiddenText: - def __init__(self, secret: str, redacted: str) -> None: - self.secret = secret - self.redacted = redacted - - def __repr__(self) -> str: - return f"<HiddenText {str(self)!r}>" - - def __str__(self) -> str: - return self.redacted - - # This is useful for testing. - def __eq__(self, other: Any) -> bool: - if type(self) != type(other): - return False - - # The string being used for redaction doesn't also have to match, - # just the raw, original string. - return self.secret == other.secret - - -def hide_value(value: str) -> HiddenText: - return HiddenText(value, redacted="****") - - -def hide_url(url: str) -> HiddenText: - redacted = redact_auth_from_url(url) - return HiddenText(url, redacted=redacted) - - -def protect_pip_from_modification_on_windows(modifying_pip: bool) -> None: - """Protection of pip.exe from modification on Windows - - On Windows, any operation modifying pip should be run as: - python -m pip ... - """ - pip_names = [ - "pip", - f"pip{sys.version_info.major}", - f"pip{sys.version_info.major}.{sys.version_info.minor}", - ] - - # See https://github.com/pypa/pip/issues/1299 for more discussion - should_show_use_python_msg = ( - modifying_pip and WINDOWS and os.path.basename(sys.argv[0]) in pip_names - ) - - if should_show_use_python_msg: - new_command = [sys.executable, "-m", "pip"] + sys.argv[1:] - raise CommandError( - "To modify pip, please run the following command:\n{}".format( - " ".join(new_command) - ) - ) - - -def check_externally_managed() -> None: - """Check whether the current environment is externally managed. - - If the ``EXTERNALLY-MANAGED`` config file is found, the current environment - is considered externally managed, and an ExternallyManagedEnvironment is - raised. - """ - if running_under_virtualenv(): - return - marker = os.path.join(sysconfig.get_path("stdlib"), "EXTERNALLY-MANAGED") - if not os.path.isfile(marker): - return - raise ExternallyManagedEnvironment.from_config(marker) - - -def is_console_interactive() -> bool: - """Is this console interactive?""" - return sys.stdin is not None and sys.stdin.isatty() - - -def hash_file(path: str, blocksize: int = 1 << 20) -> Tuple[Any, int]: - """Return (hash, length) for path using hashlib.sha256()""" - - h = hashlib.sha256() - length = 0 - with open(path, "rb") as f: - for block in read_chunks(f, size=blocksize): - length += len(block) - h.update(block) - return h, length - - -def pairwise(iterable: Iterable[Any]) -> Iterator[Tuple[Any, Any]]: - """ - Return paired elements. - - For example: - s -> (s0, s1), (s2, s3), (s4, s5), ... - """ - iterable = iter(iterable) - return zip_longest(iterable, iterable) - - -def partition( - pred: Callable[[T], bool], - iterable: Iterable[T], -) -> Tuple[Iterable[T], Iterable[T]]: - """ - Use a predicate to partition entries into false entries and true entries, - like - - partition(is_odd, range(10)) --> 0 2 4 6 8 and 1 3 5 7 9 - """ - t1, t2 = tee(iterable) - return filterfalse(pred, t1), filter(pred, t2) - - -class ConfiguredBuildBackendHookCaller(BuildBackendHookCaller): - def __init__( - self, - config_holder: Any, - source_dir: str, - build_backend: str, - backend_path: Optional[str] = None, - runner: Optional[Callable[..., None]] = None, - python_executable: Optional[str] = None, - ): - super().__init__( - source_dir, build_backend, backend_path, runner, python_executable - ) - self.config_holder = config_holder - - def build_wheel( - self, - wheel_directory: str, - config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, - metadata_directory: Optional[str] = None, - ) -> str: - cs = self.config_holder.config_settings - return super().build_wheel( - wheel_directory, config_settings=cs, metadata_directory=metadata_directory - ) - - def build_sdist( - self, - sdist_directory: str, - config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, - ) -> str: - cs = self.config_holder.config_settings - return super().build_sdist(sdist_directory, config_settings=cs) - - def build_editable( - self, - wheel_directory: str, - config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, - metadata_directory: Optional[str] = None, - ) -> str: - cs = self.config_holder.config_settings - return super().build_editable( - wheel_directory, config_settings=cs, metadata_directory=metadata_directory - ) - - def get_requires_for_build_wheel( - self, config_settings: Optional[Dict[str, Union[str, List[str]]]] = None - ) -> List[str]: - cs = self.config_holder.config_settings - return super().get_requires_for_build_wheel(config_settings=cs) - - def get_requires_for_build_sdist( - self, config_settings: Optional[Dict[str, Union[str, List[str]]]] = None - ) -> List[str]: - cs = self.config_holder.config_settings - return super().get_requires_for_build_sdist(config_settings=cs) - - def get_requires_for_build_editable( - self, config_settings: Optional[Dict[str, Union[str, List[str]]]] = None - ) -> List[str]: - cs = self.config_holder.config_settings - return super().get_requires_for_build_editable(config_settings=cs) - - def prepare_metadata_for_build_wheel( - self, - metadata_directory: str, - config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, - _allow_fallback: bool = True, - ) -> str: - cs = self.config_holder.config_settings - return super().prepare_metadata_for_build_wheel( - metadata_directory=metadata_directory, - config_settings=cs, - _allow_fallback=_allow_fallback, - ) - - def prepare_metadata_for_build_editable( - self, - metadata_directory: str, - config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, - _allow_fallback: bool = True, - ) -> str: - cs = self.config_holder.config_settings - return super().prepare_metadata_for_build_editable( - metadata_directory=metadata_directory, - config_settings=cs, - _allow_fallback=_allow_fallback, - ) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/models.py b/venv/lib/python3.12/site-packages/pip/_internal/utils/models.py deleted file mode 100644 index b6bb21a..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/utils/models.py +++ /dev/null @@ -1,39 +0,0 @@ -"""Utilities for defining models -""" - -import operator -from typing import Any, Callable, Type - - -class KeyBasedCompareMixin: - """Provides comparison capabilities that is based on a key""" - - __slots__ = ["_compare_key", "_defining_class"] - - def __init__(self, key: Any, defining_class: Type["KeyBasedCompareMixin"]) -> None: - self._compare_key = key - self._defining_class = defining_class - - def __hash__(self) -> int: - return hash(self._compare_key) - - def __lt__(self, other: Any) -> bool: - return self._compare(other, operator.__lt__) - - def __le__(self, other: Any) -> bool: - return self._compare(other, operator.__le__) - - def __gt__(self, other: Any) -> bool: - return self._compare(other, operator.__gt__) - - def __ge__(self, other: Any) -> bool: - return self._compare(other, operator.__ge__) - - def __eq__(self, other: Any) -> bool: - return self._compare(other, operator.__eq__) - - def _compare(self, other: Any, method: Callable[[Any, Any], bool]) -> bool: - if not isinstance(other, self._defining_class): - return NotImplemented - - return method(self._compare_key, other._compare_key) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/packaging.py b/venv/lib/python3.12/site-packages/pip/_internal/utils/packaging.py deleted file mode 100644 index b9f6af4..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/utils/packaging.py +++ /dev/null @@ -1,57 +0,0 @@ -import functools -import logging -import re -from typing import NewType, Optional, Tuple, cast - -from pip._vendor.packaging import specifiers, version -from pip._vendor.packaging.requirements import Requirement - -NormalizedExtra = NewType("NormalizedExtra", str) - -logger = logging.getLogger(__name__) - - -def check_requires_python( - requires_python: Optional[str], version_info: Tuple[int, ...] -) -> bool: - """ - Check if the given Python version matches a "Requires-Python" specifier. - - :param version_info: A 3-tuple of ints representing a Python - major-minor-micro version to check (e.g. `sys.version_info[:3]`). - - :return: `True` if the given Python version satisfies the requirement. - Otherwise, return `False`. - - :raises InvalidSpecifier: If `requires_python` has an invalid format. - """ - if requires_python is None: - # The package provides no information - return True - requires_python_specifier = specifiers.SpecifierSet(requires_python) - - python_version = version.parse(".".join(map(str, version_info))) - return python_version in requires_python_specifier - - -@functools.lru_cache(maxsize=512) -def get_requirement(req_string: str) -> Requirement: - """Construct a packaging.Requirement object with caching""" - # Parsing requirement strings is expensive, and is also expected to happen - # with a low diversity of different arguments (at least relative the number - # constructed). This method adds a cache to requirement object creation to - # minimize repeated parsing of the same string to construct equivalent - # Requirement objects. - return Requirement(req_string) - - -def safe_extra(extra: str) -> NormalizedExtra: - """Convert an arbitrary string to a standard 'extra' name - - Any runs of non-alphanumeric characters are replaced with a single '_', - and the result is always lowercased. - - This function is duplicated from ``pkg_resources``. Note that this is not - the same to either ``canonicalize_name`` or ``_egg_link_name``. - """ - return cast(NormalizedExtra, re.sub("[^A-Za-z0-9.-]+", "_", extra).lower()) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/setuptools_build.py b/venv/lib/python3.12/site-packages/pip/_internal/utils/setuptools_build.py deleted file mode 100644 index 96d1b24..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/utils/setuptools_build.py +++ /dev/null @@ -1,146 +0,0 @@ -import sys -import textwrap -from typing import List, Optional, Sequence - -# Shim to wrap setup.py invocation with setuptools -# Note that __file__ is handled via two {!r} *and* %r, to ensure that paths on -# Windows are correctly handled (it should be "C:\\Users" not "C:\Users"). -_SETUPTOOLS_SHIM = textwrap.dedent( - """ - exec(compile(''' - # This is <pip-setuptools-caller> -- a caller that pip uses to run setup.py - # - # - It imports setuptools before invoking setup.py, to enable projects that directly - # import from `distutils.core` to work with newer packaging standards. - # - It provides a clear error message when setuptools is not installed. - # - It sets `sys.argv[0]` to the underlying `setup.py`, when invoking `setup.py` so - # setuptools doesn't think the script is `-c`. This avoids the following warning: - # manifest_maker: standard file '-c' not found". - # - It generates a shim setup.py, for handling setup.cfg-only projects. - import os, sys, tokenize - - try: - import setuptools - except ImportError as error: - print( - "ERROR: Can not execute `setup.py` since setuptools is not available in " - "the build environment.", - file=sys.stderr, - ) - sys.exit(1) - - __file__ = %r - sys.argv[0] = __file__ - - if os.path.exists(__file__): - filename = __file__ - with tokenize.open(__file__) as f: - setup_py_code = f.read() - else: - filename = "<auto-generated setuptools caller>" - setup_py_code = "from setuptools import setup; setup()" - - exec(compile(setup_py_code, filename, "exec")) - ''' % ({!r},), "<pip-setuptools-caller>", "exec")) - """ -).rstrip() - - -def make_setuptools_shim_args( - setup_py_path: str, - global_options: Optional[Sequence[str]] = None, - no_user_config: bool = False, - unbuffered_output: bool = False, -) -> List[str]: - """ - Get setuptools command arguments with shim wrapped setup file invocation. - - :param setup_py_path: The path to setup.py to be wrapped. - :param global_options: Additional global options. - :param no_user_config: If True, disables personal user configuration. - :param unbuffered_output: If True, adds the unbuffered switch to the - argument list. - """ - args = [sys.executable] - if unbuffered_output: - args += ["-u"] - args += ["-c", _SETUPTOOLS_SHIM.format(setup_py_path)] - if global_options: - args += global_options - if no_user_config: - args += ["--no-user-cfg"] - return args - - -def make_setuptools_bdist_wheel_args( - setup_py_path: str, - global_options: Sequence[str], - build_options: Sequence[str], - destination_dir: str, -) -> List[str]: - # NOTE: Eventually, we'd want to also -S to the flags here, when we're - # isolating. Currently, it breaks Python in virtualenvs, because it - # relies on site.py to find parts of the standard library outside the - # virtualenv. - args = make_setuptools_shim_args( - setup_py_path, global_options=global_options, unbuffered_output=True - ) - args += ["bdist_wheel", "-d", destination_dir] - args += build_options - return args - - -def make_setuptools_clean_args( - setup_py_path: str, - global_options: Sequence[str], -) -> List[str]: - args = make_setuptools_shim_args( - setup_py_path, global_options=global_options, unbuffered_output=True - ) - args += ["clean", "--all"] - return args - - -def make_setuptools_develop_args( - setup_py_path: str, - *, - global_options: Sequence[str], - no_user_config: bool, - prefix: Optional[str], - home: Optional[str], - use_user_site: bool, -) -> List[str]: - assert not (use_user_site and prefix) - - args = make_setuptools_shim_args( - setup_py_path, - global_options=global_options, - no_user_config=no_user_config, - ) - - args += ["develop", "--no-deps"] - - if prefix: - args += ["--prefix", prefix] - if home is not None: - args += ["--install-dir", home] - - if use_user_site: - args += ["--user", "--prefix="] - - return args - - -def make_setuptools_egg_info_args( - setup_py_path: str, - egg_info_dir: Optional[str], - no_user_config: bool, -) -> List[str]: - args = make_setuptools_shim_args(setup_py_path, no_user_config=no_user_config) - - args += ["egg_info"] - - if egg_info_dir: - args += ["--egg-base", egg_info_dir] - - return args diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py b/venv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py deleted file mode 100644 index 79580b0..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py +++ /dev/null @@ -1,260 +0,0 @@ -import logging -import os -import shlex -import subprocess -from typing import ( - TYPE_CHECKING, - Any, - Callable, - Iterable, - List, - Mapping, - Optional, - Union, -) - -from pip._vendor.rich.markup import escape - -from pip._internal.cli.spinners import SpinnerInterface, open_spinner -from pip._internal.exceptions import InstallationSubprocessError -from pip._internal.utils.logging import VERBOSE, subprocess_logger -from pip._internal.utils.misc import HiddenText - -if TYPE_CHECKING: - # Literal was introduced in Python 3.8. - # - # TODO: Remove `if TYPE_CHECKING` when dropping support for Python 3.7. - from typing import Literal - -CommandArgs = List[Union[str, HiddenText]] - - -def make_command(*args: Union[str, HiddenText, CommandArgs]) -> CommandArgs: - """ - Create a CommandArgs object. - """ - command_args: CommandArgs = [] - for arg in args: - # Check for list instead of CommandArgs since CommandArgs is - # only known during type-checking. - if isinstance(arg, list): - command_args.extend(arg) - else: - # Otherwise, arg is str or HiddenText. - command_args.append(arg) - - return command_args - - -def format_command_args(args: Union[List[str], CommandArgs]) -> str: - """ - Format command arguments for display. - """ - # For HiddenText arguments, display the redacted form by calling str(). - # Also, we don't apply str() to arguments that aren't HiddenText since - # this can trigger a UnicodeDecodeError in Python 2 if the argument - # has type unicode and includes a non-ascii character. (The type - # checker doesn't ensure the annotations are correct in all cases.) - return " ".join( - shlex.quote(str(arg)) if isinstance(arg, HiddenText) else shlex.quote(arg) - for arg in args - ) - - -def reveal_command_args(args: Union[List[str], CommandArgs]) -> List[str]: - """ - Return the arguments in their raw, unredacted form. - """ - return [arg.secret if isinstance(arg, HiddenText) else arg for arg in args] - - -def call_subprocess( - cmd: Union[List[str], CommandArgs], - show_stdout: bool = False, - cwd: Optional[str] = None, - on_returncode: 'Literal["raise", "warn", "ignore"]' = "raise", - extra_ok_returncodes: Optional[Iterable[int]] = None, - extra_environ: Optional[Mapping[str, Any]] = None, - unset_environ: Optional[Iterable[str]] = None, - spinner: Optional[SpinnerInterface] = None, - log_failed_cmd: Optional[bool] = True, - stdout_only: Optional[bool] = False, - *, - command_desc: str, -) -> str: - """ - Args: - show_stdout: if true, use INFO to log the subprocess's stderr and - stdout streams. Otherwise, use DEBUG. Defaults to False. - extra_ok_returncodes: an iterable of integer return codes that are - acceptable, in addition to 0. Defaults to None, which means []. - unset_environ: an iterable of environment variable names to unset - prior to calling subprocess.Popen(). - log_failed_cmd: if false, failed commands are not logged, only raised. - stdout_only: if true, return only stdout, else return both. When true, - logging of both stdout and stderr occurs when the subprocess has - terminated, else logging occurs as subprocess output is produced. - """ - if extra_ok_returncodes is None: - extra_ok_returncodes = [] - if unset_environ is None: - unset_environ = [] - # Most places in pip use show_stdout=False. What this means is-- - # - # - We connect the child's output (combined stderr and stdout) to a - # single pipe, which we read. - # - We log this output to stderr at DEBUG level as it is received. - # - If DEBUG logging isn't enabled (e.g. if --verbose logging wasn't - # requested), then we show a spinner so the user can still see the - # subprocess is in progress. - # - If the subprocess exits with an error, we log the output to stderr - # at ERROR level if it hasn't already been displayed to the console - # (e.g. if --verbose logging wasn't enabled). This way we don't log - # the output to the console twice. - # - # If show_stdout=True, then the above is still done, but with DEBUG - # replaced by INFO. - if show_stdout: - # Then log the subprocess output at INFO level. - log_subprocess: Callable[..., None] = subprocess_logger.info - used_level = logging.INFO - else: - # Then log the subprocess output using VERBOSE. This also ensures - # it will be logged to the log file (aka user_log), if enabled. - log_subprocess = subprocess_logger.verbose - used_level = VERBOSE - - # Whether the subprocess will be visible in the console. - showing_subprocess = subprocess_logger.getEffectiveLevel() <= used_level - - # Only use the spinner if we're not showing the subprocess output - # and we have a spinner. - use_spinner = not showing_subprocess and spinner is not None - - log_subprocess("Running command %s", command_desc) - env = os.environ.copy() - if extra_environ: - env.update(extra_environ) - for name in unset_environ: - env.pop(name, None) - try: - proc = subprocess.Popen( - # Convert HiddenText objects to the underlying str. - reveal_command_args(cmd), - stdin=subprocess.PIPE, - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT if not stdout_only else subprocess.PIPE, - cwd=cwd, - env=env, - errors="backslashreplace", - ) - except Exception as exc: - if log_failed_cmd: - subprocess_logger.critical( - "Error %s while executing command %s", - exc, - command_desc, - ) - raise - all_output = [] - if not stdout_only: - assert proc.stdout - assert proc.stdin - proc.stdin.close() - # In this mode, stdout and stderr are in the same pipe. - while True: - line: str = proc.stdout.readline() - if not line: - break - line = line.rstrip() - all_output.append(line + "\n") - - # Show the line immediately. - log_subprocess(line) - # Update the spinner. - if use_spinner: - assert spinner - spinner.spin() - try: - proc.wait() - finally: - if proc.stdout: - proc.stdout.close() - output = "".join(all_output) - else: - # In this mode, stdout and stderr are in different pipes. - # We must use communicate() which is the only safe way to read both. - out, err = proc.communicate() - # log line by line to preserve pip log indenting - for out_line in out.splitlines(): - log_subprocess(out_line) - all_output.append(out) - for err_line in err.splitlines(): - log_subprocess(err_line) - all_output.append(err) - output = out - - proc_had_error = proc.returncode and proc.returncode not in extra_ok_returncodes - if use_spinner: - assert spinner - if proc_had_error: - spinner.finish("error") - else: - spinner.finish("done") - if proc_had_error: - if on_returncode == "raise": - error = InstallationSubprocessError( - command_description=command_desc, - exit_code=proc.returncode, - output_lines=all_output if not showing_subprocess else None, - ) - if log_failed_cmd: - subprocess_logger.error("%s", error, extra={"rich": True}) - subprocess_logger.verbose( - "[bold magenta]full command[/]: [blue]%s[/]", - escape(format_command_args(cmd)), - extra={"markup": True}, - ) - subprocess_logger.verbose( - "[bold magenta]cwd[/]: %s", - escape(cwd or "[inherit]"), - extra={"markup": True}, - ) - - raise error - elif on_returncode == "warn": - subprocess_logger.warning( - 'Command "%s" had error code %s in %s', - command_desc, - proc.returncode, - cwd, - ) - elif on_returncode == "ignore": - pass - else: - raise ValueError(f"Invalid value: on_returncode={on_returncode!r}") - return output - - -def runner_with_spinner_message(message: str) -> Callable[..., None]: - """Provide a subprocess_runner that shows a spinner message. - - Intended for use with for BuildBackendHookCaller. Thus, the runner has - an API that matches what's expected by BuildBackendHookCaller.subprocess_runner. - """ - - def runner( - cmd: List[str], - cwd: Optional[str] = None, - extra_environ: Optional[Mapping[str, Any]] = None, - ) -> None: - with open_spinner(message) as spinner: - call_subprocess( - cmd, - command_desc=message, - cwd=cwd, - extra_environ=extra_environ, - spinner=spinner, - ) - - return runner diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py b/venv/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py deleted file mode 100644 index 4eec5f3..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py +++ /dev/null @@ -1,296 +0,0 @@ -import errno -import itertools -import logging -import os.path -import tempfile -import traceback -from contextlib import ExitStack, contextmanager -from pathlib import Path -from typing import ( - Any, - Callable, - Dict, - Generator, - List, - Optional, - TypeVar, - Union, -) - -from pip._internal.utils.misc import enum, rmtree - -logger = logging.getLogger(__name__) - -_T = TypeVar("_T", bound="TempDirectory") - - -# Kinds of temporary directories. Only needed for ones that are -# globally-managed. -tempdir_kinds = enum( - BUILD_ENV="build-env", - EPHEM_WHEEL_CACHE="ephem-wheel-cache", - REQ_BUILD="req-build", -) - - -_tempdir_manager: Optional[ExitStack] = None - - -@contextmanager -def global_tempdir_manager() -> Generator[None, None, None]: - global _tempdir_manager - with ExitStack() as stack: - old_tempdir_manager, _tempdir_manager = _tempdir_manager, stack - try: - yield - finally: - _tempdir_manager = old_tempdir_manager - - -class TempDirectoryTypeRegistry: - """Manages temp directory behavior""" - - def __init__(self) -> None: - self._should_delete: Dict[str, bool] = {} - - def set_delete(self, kind: str, value: bool) -> None: - """Indicate whether a TempDirectory of the given kind should be - auto-deleted. - """ - self._should_delete[kind] = value - - def get_delete(self, kind: str) -> bool: - """Get configured auto-delete flag for a given TempDirectory type, - default True. - """ - return self._should_delete.get(kind, True) - - -_tempdir_registry: Optional[TempDirectoryTypeRegistry] = None - - -@contextmanager -def tempdir_registry() -> Generator[TempDirectoryTypeRegistry, None, None]: - """Provides a scoped global tempdir registry that can be used to dictate - whether directories should be deleted. - """ - global _tempdir_registry - old_tempdir_registry = _tempdir_registry - _tempdir_registry = TempDirectoryTypeRegistry() - try: - yield _tempdir_registry - finally: - _tempdir_registry = old_tempdir_registry - - -class _Default: - pass - - -_default = _Default() - - -class TempDirectory: - """Helper class that owns and cleans up a temporary directory. - - This class can be used as a context manager or as an OO representation of a - temporary directory. - - Attributes: - path - Location to the created temporary directory - delete - Whether the directory should be deleted when exiting - (when used as a contextmanager) - - Methods: - cleanup() - Deletes the temporary directory - - When used as a context manager, if the delete attribute is True, on - exiting the context the temporary directory is deleted. - """ - - def __init__( - self, - path: Optional[str] = None, - delete: Union[bool, None, _Default] = _default, - kind: str = "temp", - globally_managed: bool = False, - ignore_cleanup_errors: bool = True, - ): - super().__init__() - - if delete is _default: - if path is not None: - # If we were given an explicit directory, resolve delete option - # now. - delete = False - else: - # Otherwise, we wait until cleanup and see what - # tempdir_registry says. - delete = None - - # The only time we specify path is in for editables where it - # is the value of the --src option. - if path is None: - path = self._create(kind) - - self._path = path - self._deleted = False - self.delete = delete - self.kind = kind - self.ignore_cleanup_errors = ignore_cleanup_errors - - if globally_managed: - assert _tempdir_manager is not None - _tempdir_manager.enter_context(self) - - @property - def path(self) -> str: - assert not self._deleted, f"Attempted to access deleted path: {self._path}" - return self._path - - def __repr__(self) -> str: - return f"<{self.__class__.__name__} {self.path!r}>" - - def __enter__(self: _T) -> _T: - return self - - def __exit__(self, exc: Any, value: Any, tb: Any) -> None: - if self.delete is not None: - delete = self.delete - elif _tempdir_registry: - delete = _tempdir_registry.get_delete(self.kind) - else: - delete = True - - if delete: - self.cleanup() - - def _create(self, kind: str) -> str: - """Create a temporary directory and store its path in self.path""" - # We realpath here because some systems have their default tmpdir - # symlinked to another directory. This tends to confuse build - # scripts, so we canonicalize the path by traversing potential - # symlinks here. - path = os.path.realpath(tempfile.mkdtemp(prefix=f"pip-{kind}-")) - logger.debug("Created temporary directory: %s", path) - return path - - def cleanup(self) -> None: - """Remove the temporary directory created and reset state""" - self._deleted = True - if not os.path.exists(self._path): - return - - errors: List[BaseException] = [] - - def onerror( - func: Callable[..., Any], - path: Path, - exc_val: BaseException, - ) -> None: - """Log a warning for a `rmtree` error and continue""" - formatted_exc = "\n".join( - traceback.format_exception_only(type(exc_val), exc_val) - ) - formatted_exc = formatted_exc.rstrip() # remove trailing new line - if func in (os.unlink, os.remove, os.rmdir): - logger.debug( - "Failed to remove a temporary file '%s' due to %s.\n", - path, - formatted_exc, - ) - else: - logger.debug("%s failed with %s.", func.__qualname__, formatted_exc) - errors.append(exc_val) - - if self.ignore_cleanup_errors: - try: - # first try with tenacity; retrying to handle ephemeral errors - rmtree(self._path, ignore_errors=False) - except OSError: - # last pass ignore/log all errors - rmtree(self._path, onexc=onerror) - if errors: - logger.warning( - "Failed to remove contents in a temporary directory '%s'.\n" - "You can safely remove it manually.", - self._path, - ) - else: - rmtree(self._path) - - -class AdjacentTempDirectory(TempDirectory): - """Helper class that creates a temporary directory adjacent to a real one. - - Attributes: - original - The original directory to create a temp directory for. - path - After calling create() or entering, contains the full - path to the temporary directory. - delete - Whether the directory should be deleted when exiting - (when used as a contextmanager) - - """ - - # The characters that may be used to name the temp directory - # We always prepend a ~ and then rotate through these until - # a usable name is found. - # pkg_resources raises a different error for .dist-info folder - # with leading '-' and invalid metadata - LEADING_CHARS = "-~.=%0123456789" - - def __init__(self, original: str, delete: Optional[bool] = None) -> None: - self.original = original.rstrip("/\\") - super().__init__(delete=delete) - - @classmethod - def _generate_names(cls, name: str) -> Generator[str, None, None]: - """Generates a series of temporary names. - - The algorithm replaces the leading characters in the name - with ones that are valid filesystem characters, but are not - valid package names (for both Python and pip definitions of - package). - """ - for i in range(1, len(name)): - for candidate in itertools.combinations_with_replacement( - cls.LEADING_CHARS, i - 1 - ): - new_name = "~" + "".join(candidate) + name[i:] - if new_name != name: - yield new_name - - # If we make it this far, we will have to make a longer name - for i in range(len(cls.LEADING_CHARS)): - for candidate in itertools.combinations_with_replacement( - cls.LEADING_CHARS, i - ): - new_name = "~" + "".join(candidate) + name - if new_name != name: - yield new_name - - def _create(self, kind: str) -> str: - root, name = os.path.split(self.original) - for candidate in self._generate_names(name): - path = os.path.join(root, candidate) - try: - os.mkdir(path) - except OSError as ex: - # Continue if the name exists already - if ex.errno != errno.EEXIST: - raise - else: - path = os.path.realpath(path) - break - else: - # Final fallback on the default behavior. - path = os.path.realpath(tempfile.mkdtemp(prefix=f"pip-{kind}-")) - - logger.debug("Created temporary directory: %s", path) - return path diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py b/venv/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py deleted file mode 100644 index 78b5c13..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py +++ /dev/null @@ -1,257 +0,0 @@ -"""Utilities related archives. -""" - -import logging -import os -import shutil -import stat -import tarfile -import zipfile -from typing import Iterable, List, Optional -from zipfile import ZipInfo - -from pip._internal.exceptions import InstallationError -from pip._internal.utils.filetypes import ( - BZ2_EXTENSIONS, - TAR_EXTENSIONS, - XZ_EXTENSIONS, - ZIP_EXTENSIONS, -) -from pip._internal.utils.misc import ensure_dir - -logger = logging.getLogger(__name__) - - -SUPPORTED_EXTENSIONS = ZIP_EXTENSIONS + TAR_EXTENSIONS - -try: - import bz2 # noqa - - SUPPORTED_EXTENSIONS += BZ2_EXTENSIONS -except ImportError: - logger.debug("bz2 module is not available") - -try: - # Only for Python 3.3+ - import lzma # noqa - - SUPPORTED_EXTENSIONS += XZ_EXTENSIONS -except ImportError: - logger.debug("lzma module is not available") - - -def current_umask() -> int: - """Get the current umask which involves having to set it temporarily.""" - mask = os.umask(0) - os.umask(mask) - return mask - - -def split_leading_dir(path: str) -> List[str]: - path = path.lstrip("/").lstrip("\\") - if "/" in path and ( - ("\\" in path and path.find("/") < path.find("\\")) or "\\" not in path - ): - return path.split("/", 1) - elif "\\" in path: - return path.split("\\", 1) - else: - return [path, ""] - - -def has_leading_dir(paths: Iterable[str]) -> bool: - """Returns true if all the paths have the same leading path name - (i.e., everything is in one subdirectory in an archive)""" - common_prefix = None - for path in paths: - prefix, rest = split_leading_dir(path) - if not prefix: - return False - elif common_prefix is None: - common_prefix = prefix - elif prefix != common_prefix: - return False - return True - - -def is_within_directory(directory: str, target: str) -> bool: - """ - Return true if the absolute path of target is within the directory - """ - abs_directory = os.path.abspath(directory) - abs_target = os.path.abspath(target) - - prefix = os.path.commonprefix([abs_directory, abs_target]) - return prefix == abs_directory - - -def set_extracted_file_to_default_mode_plus_executable(path: str) -> None: - """ - Make file present at path have execute for user/group/world - (chmod +x) is no-op on windows per python docs - """ - os.chmod(path, (0o777 & ~current_umask() | 0o111)) - - -def zip_item_is_executable(info: ZipInfo) -> bool: - mode = info.external_attr >> 16 - # if mode and regular file and any execute permissions for - # user/group/world? - return bool(mode and stat.S_ISREG(mode) and mode & 0o111) - - -def unzip_file(filename: str, location: str, flatten: bool = True) -> None: - """ - Unzip the file (with path `filename`) to the destination `location`. All - files are written based on system defaults and umask (i.e. permissions are - not preserved), except that regular file members with any execute - permissions (user, group, or world) have "chmod +x" applied after being - written. Note that for windows, any execute changes using os.chmod are - no-ops per the python docs. - """ - ensure_dir(location) - zipfp = open(filename, "rb") - try: - zip = zipfile.ZipFile(zipfp, allowZip64=True) - leading = has_leading_dir(zip.namelist()) and flatten - for info in zip.infolist(): - name = info.filename - fn = name - if leading: - fn = split_leading_dir(name)[1] - fn = os.path.join(location, fn) - dir = os.path.dirname(fn) - if not is_within_directory(location, fn): - message = ( - "The zip file ({}) has a file ({}) trying to install " - "outside target directory ({})" - ) - raise InstallationError(message.format(filename, fn, location)) - if fn.endswith("/") or fn.endswith("\\"): - # A directory - ensure_dir(fn) - else: - ensure_dir(dir) - # Don't use read() to avoid allocating an arbitrarily large - # chunk of memory for the file's content - fp = zip.open(name) - try: - with open(fn, "wb") as destfp: - shutil.copyfileobj(fp, destfp) - finally: - fp.close() - if zip_item_is_executable(info): - set_extracted_file_to_default_mode_plus_executable(fn) - finally: - zipfp.close() - - -def untar_file(filename: str, location: str) -> None: - """ - Untar the file (with path `filename`) to the destination `location`. - All files are written based on system defaults and umask (i.e. permissions - are not preserved), except that regular file members with any execute - permissions (user, group, or world) have "chmod +x" applied after being - written. Note that for windows, any execute changes using os.chmod are - no-ops per the python docs. - """ - ensure_dir(location) - if filename.lower().endswith(".gz") or filename.lower().endswith(".tgz"): - mode = "r:gz" - elif filename.lower().endswith(BZ2_EXTENSIONS): - mode = "r:bz2" - elif filename.lower().endswith(XZ_EXTENSIONS): - mode = "r:xz" - elif filename.lower().endswith(".tar"): - mode = "r" - else: - logger.warning( - "Cannot determine compression type for file %s", - filename, - ) - mode = "r:*" - tar = tarfile.open(filename, mode, encoding="utf-8") - try: - leading = has_leading_dir([member.name for member in tar.getmembers()]) - for member in tar.getmembers(): - fn = member.name - if leading: - fn = split_leading_dir(fn)[1] - path = os.path.join(location, fn) - if not is_within_directory(location, path): - message = ( - "The tar file ({}) has a file ({}) trying to install " - "outside target directory ({})" - ) - raise InstallationError(message.format(filename, path, location)) - if member.isdir(): - ensure_dir(path) - elif member.issym(): - try: - tar._extract_member(member, path) - except Exception as exc: - # Some corrupt tar files seem to produce this - # (specifically bad symlinks) - logger.warning( - "In the tar file %s the member %s is invalid: %s", - filename, - member.name, - exc, - ) - continue - else: - try: - fp = tar.extractfile(member) - except (KeyError, AttributeError) as exc: - # Some corrupt tar files seem to produce this - # (specifically bad symlinks) - logger.warning( - "In the tar file %s the member %s is invalid: %s", - filename, - member.name, - exc, - ) - continue - ensure_dir(os.path.dirname(path)) - assert fp is not None - with open(path, "wb") as destfp: - shutil.copyfileobj(fp, destfp) - fp.close() - # Update the timestamp (useful for cython compiled files) - tar.utime(member, path) - # member have any execute permissions for user/group/world? - if member.mode & 0o111: - set_extracted_file_to_default_mode_plus_executable(path) - finally: - tar.close() - - -def unpack_file( - filename: str, - location: str, - content_type: Optional[str] = None, -) -> None: - filename = os.path.realpath(filename) - if ( - content_type == "application/zip" - or filename.lower().endswith(ZIP_EXTENSIONS) - or zipfile.is_zipfile(filename) - ): - unzip_file(filename, location, flatten=not filename.endswith(".whl")) - elif ( - content_type == "application/x-gzip" - or tarfile.is_tarfile(filename) - or filename.lower().endswith(TAR_EXTENSIONS + BZ2_EXTENSIONS + XZ_EXTENSIONS) - ): - untar_file(filename, location) - else: - # FIXME: handle? - # FIXME: magic signatures? - logger.critical( - "Cannot unpack file %s (downloaded from %s, content-type: %s); " - "cannot detect archive format", - filename, - location, - content_type, - ) - raise InstallationError(f"Cannot determine archive format of {location}") diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/urls.py b/venv/lib/python3.12/site-packages/pip/_internal/utils/urls.py deleted file mode 100644 index 6ba2e04..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/utils/urls.py +++ /dev/null @@ -1,62 +0,0 @@ -import os -import string -import urllib.parse -import urllib.request -from typing import Optional - -from .compat import WINDOWS - - -def get_url_scheme(url: str) -> Optional[str]: - if ":" not in url: - return None - return url.split(":", 1)[0].lower() - - -def path_to_url(path: str) -> str: - """ - Convert a path to a file: URL. The path will be made absolute and have - quoted path parts. - """ - path = os.path.normpath(os.path.abspath(path)) - url = urllib.parse.urljoin("file:", urllib.request.pathname2url(path)) - return url - - -def url_to_path(url: str) -> str: - """ - Convert a file: URL to a path. - """ - assert url.startswith( - "file:" - ), f"You can only turn file: urls into filenames (not {url!r})" - - _, netloc, path, _, _ = urllib.parse.urlsplit(url) - - if not netloc or netloc == "localhost": - # According to RFC 8089, same as empty authority. - netloc = "" - elif WINDOWS: - # If we have a UNC path, prepend UNC share notation. - netloc = "\\\\" + netloc - else: - raise ValueError( - f"non-local file URIs are not supported on this platform: {url!r}" - ) - - path = urllib.request.url2pathname(netloc + path) - - # On Windows, urlsplit parses the path as something like "/C:/Users/foo". - # This creates issues for path-related functions like io.open(), so we try - # to detect and strip the leading slash. - if ( - WINDOWS - and not netloc # Not UNC. - and len(path) >= 3 - and path[0] == "/" # Leading slash to strip. - and path[1] in string.ascii_letters # Drive letter. - and path[2:4] in (":", ":/") # Colon + end of string, or colon + absolute path. - ): - path = path[1:] - - return path diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/virtualenv.py b/venv/lib/python3.12/site-packages/pip/_internal/utils/virtualenv.py deleted file mode 100644 index 882e36f..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/utils/virtualenv.py +++ /dev/null @@ -1,104 +0,0 @@ -import logging -import os -import re -import site -import sys -from typing import List, Optional - -logger = logging.getLogger(__name__) -_INCLUDE_SYSTEM_SITE_PACKAGES_REGEX = re.compile( - r"include-system-site-packages\s*=\s*(?P<value>true|false)" -) - - -def _running_under_venv() -> bool: - """Checks if sys.base_prefix and sys.prefix match. - - This handles PEP 405 compliant virtual environments. - """ - return sys.prefix != getattr(sys, "base_prefix", sys.prefix) - - -def _running_under_legacy_virtualenv() -> bool: - """Checks if sys.real_prefix is set. - - This handles virtual environments created with pypa's virtualenv. - """ - # pypa/virtualenv case - return hasattr(sys, "real_prefix") - - -def running_under_virtualenv() -> bool: - """True if we're running inside a virtual environment, False otherwise.""" - return _running_under_venv() or _running_under_legacy_virtualenv() - - -def _get_pyvenv_cfg_lines() -> Optional[List[str]]: - """Reads {sys.prefix}/pyvenv.cfg and returns its contents as list of lines - - Returns None, if it could not read/access the file. - """ - pyvenv_cfg_file = os.path.join(sys.prefix, "pyvenv.cfg") - try: - # Although PEP 405 does not specify, the built-in venv module always - # writes with UTF-8. (pypa/pip#8717) - with open(pyvenv_cfg_file, encoding="utf-8") as f: - return f.read().splitlines() # avoids trailing newlines - except OSError: - return None - - -def _no_global_under_venv() -> bool: - """Check `{sys.prefix}/pyvenv.cfg` for system site-packages inclusion - - PEP 405 specifies that when system site-packages are not supposed to be - visible from a virtual environment, `pyvenv.cfg` must contain the following - line: - - include-system-site-packages = false - - Additionally, log a warning if accessing the file fails. - """ - cfg_lines = _get_pyvenv_cfg_lines() - if cfg_lines is None: - # We're not in a "sane" venv, so assume there is no system - # site-packages access (since that's PEP 405's default state). - logger.warning( - "Could not access 'pyvenv.cfg' despite a virtual environment " - "being active. Assuming global site-packages is not accessible " - "in this environment." - ) - return True - - for line in cfg_lines: - match = _INCLUDE_SYSTEM_SITE_PACKAGES_REGEX.match(line) - if match is not None and match.group("value") == "false": - return True - return False - - -def _no_global_under_legacy_virtualenv() -> bool: - """Check if "no-global-site-packages.txt" exists beside site.py - - This mirrors logic in pypa/virtualenv for determining whether system - site-packages are visible in the virtual environment. - """ - site_mod_dir = os.path.dirname(os.path.abspath(site.__file__)) - no_global_site_packages_file = os.path.join( - site_mod_dir, - "no-global-site-packages.txt", - ) - return os.path.exists(no_global_site_packages_file) - - -def virtualenv_no_global() -> bool: - """Returns a boolean, whether running in venv with no system site-packages.""" - # PEP 405 compliance needs to be checked first since virtualenv >=20 would - # return True for both checks, but is only able to use the PEP 405 config. - if _running_under_venv(): - return _no_global_under_venv() - - if _running_under_legacy_virtualenv(): - return _no_global_under_legacy_virtualenv() - - return False diff --git a/venv/lib/python3.12/site-packages/pip/_internal/utils/wheel.py b/venv/lib/python3.12/site-packages/pip/_internal/utils/wheel.py deleted file mode 100644 index 3551f8f..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/utils/wheel.py +++ /dev/null @@ -1,134 +0,0 @@ -"""Support functions for working with wheel files. -""" - -import logging -from email.message import Message -from email.parser import Parser -from typing import Tuple -from zipfile import BadZipFile, ZipFile - -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.exceptions import UnsupportedWheel - -VERSION_COMPATIBLE = (1, 0) - - -logger = logging.getLogger(__name__) - - -def parse_wheel(wheel_zip: ZipFile, name: str) -> Tuple[str, Message]: - """Extract information from the provided wheel, ensuring it meets basic - standards. - - Returns the name of the .dist-info directory and the parsed WHEEL metadata. - """ - try: - info_dir = wheel_dist_info_dir(wheel_zip, name) - metadata = wheel_metadata(wheel_zip, info_dir) - version = wheel_version(metadata) - except UnsupportedWheel as e: - raise UnsupportedWheel(f"{name} has an invalid wheel, {str(e)}") - - check_compatibility(version, name) - - return info_dir, metadata - - -def wheel_dist_info_dir(source: ZipFile, name: str) -> str: - """Returns the name of the contained .dist-info directory. - - Raises AssertionError or UnsupportedWheel if not found, >1 found, or - it doesn't match the provided name. - """ - # Zip file path separators must be / - subdirs = {p.split("/", 1)[0] for p in source.namelist()} - - info_dirs = [s for s in subdirs if s.endswith(".dist-info")] - - if not info_dirs: - raise UnsupportedWheel(".dist-info directory not found") - - if len(info_dirs) > 1: - raise UnsupportedWheel( - "multiple .dist-info directories found: {}".format(", ".join(info_dirs)) - ) - - info_dir = info_dirs[0] - - info_dir_name = canonicalize_name(info_dir) - canonical_name = canonicalize_name(name) - if not info_dir_name.startswith(canonical_name): - raise UnsupportedWheel( - f".dist-info directory {info_dir!r} does not start with {canonical_name!r}" - ) - - return info_dir - - -def read_wheel_metadata_file(source: ZipFile, path: str) -> bytes: - try: - return source.read(path) - # BadZipFile for general corruption, KeyError for missing entry, - # and RuntimeError for password-protected files - except (BadZipFile, KeyError, RuntimeError) as e: - raise UnsupportedWheel(f"could not read {path!r} file: {e!r}") - - -def wheel_metadata(source: ZipFile, dist_info_dir: str) -> Message: - """Return the WHEEL metadata of an extracted wheel, if possible. - Otherwise, raise UnsupportedWheel. - """ - path = f"{dist_info_dir}/WHEEL" - # Zip file path separators must be / - wheel_contents = read_wheel_metadata_file(source, path) - - try: - wheel_text = wheel_contents.decode() - except UnicodeDecodeError as e: - raise UnsupportedWheel(f"error decoding {path!r}: {e!r}") - - # FeedParser (used by Parser) does not raise any exceptions. The returned - # message may have .defects populated, but for backwards-compatibility we - # currently ignore them. - return Parser().parsestr(wheel_text) - - -def wheel_version(wheel_data: Message) -> Tuple[int, ...]: - """Given WHEEL metadata, return the parsed Wheel-Version. - Otherwise, raise UnsupportedWheel. - """ - version_text = wheel_data["Wheel-Version"] - if version_text is None: - raise UnsupportedWheel("WHEEL is missing Wheel-Version") - - version = version_text.strip() - - try: - return tuple(map(int, version.split("."))) - except ValueError: - raise UnsupportedWheel(f"invalid Wheel-Version: {version!r}") - - -def check_compatibility(version: Tuple[int, ...], name: str) -> None: - """Raises errors or warns if called with an incompatible Wheel-Version. - - pip should refuse to install a Wheel-Version that's a major series - ahead of what it's compatible with (e.g 2.0 > 1.1); and warn when - installing a version only minor version ahead (e.g 1.2 > 1.1). - - version: a 2-tuple representing a Wheel-Version (Major, Minor) - name: name of wheel or package to raise exception about - - :raises UnsupportedWheel: when an incompatible Wheel-Version is given - """ - if version[0] > VERSION_COMPATIBLE[0]: - raise UnsupportedWheel( - "{}'s Wheel-Version ({}) is not compatible with this version " - "of pip".format(name, ".".join(map(str, version))) - ) - elif version > VERSION_COMPATIBLE: - logger.warning( - "Installing from a newer Wheel-Version (%s)", - ".".join(map(str, version)), - ) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/vcs/__init__.py b/venv/lib/python3.12/site-packages/pip/_internal/vcs/__init__.py deleted file mode 100644 index b6beddb..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/vcs/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# Expose a limited set of classes and functions so callers outside of -# the vcs package don't need to import deeper than `pip._internal.vcs`. -# (The test directory may still need to import from a vcs sub-package.) -# Import all vcs modules to register each VCS in the VcsSupport object. -import pip._internal.vcs.bazaar -import pip._internal.vcs.git -import pip._internal.vcs.mercurial -import pip._internal.vcs.subversion # noqa: F401 -from pip._internal.vcs.versioncontrol import ( # noqa: F401 - RemoteNotFoundError, - RemoteNotValidError, - is_url, - make_vcs_requirement_url, - vcs, -) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 6aa33c460612676042d30dca1a80b9d637906c98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 551 zcmZXQziJyn5XN`!tdp!@j0pyV9WZvKLbt?jLvZ1wbP<e;YmU|3AT8QI=h?k8N**Mg z`#ekD;8dnc7Z4=i%5y?C0S)Z$W4>=$X7=aa-jGohkKbmu5o5o)=B21#*XoMoJ1beq zHOu%~qm9NJ-C1j-dnU;e)6e>5kPXakwrhsjkh29J#lO49ZbrTK?H4dEz>N!^U2V%x zhz|cV@1#~6Gf_UTQMX4%&LM9KpCjDY3c-L4>m(*~^rk(kRF&q+20$xyN@hBdU!}x0 zrldXGj;AWL$J@36ENWCzw<p`7uO|(lSI)Ml+vz4MoDJwS#<VT&bm(<RI`j!Y*ow%W z?#0X*5Jm>yh-+8W-A-Nv&@e@5#y+TG4md8|gVj!!fT9802(2cfT7;Rim+AWp;Z=Zf zC5yS7f)_NEc>M-J-ym{oRmk(ST09Lt7+2OBKH>pQ!0GsRgg-Iod^KeJbjePZ>}<)- O|3wLp{xSmY(~W1ef2|P! diff --git a/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc deleted file mode 100644 index fe07d4c0787bf9e54a50ac922119c0665c23919d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5043 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 FzW}6NvGo7| diff --git a/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/git.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/git.cpython-312.pyc deleted file mode 100644 index c84cc03025aa1a97343a975c71fc42a2a3c8a1b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19012 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 Yl}R6GYFM;<&-)#3{>(>QBU_6953_+_<p2Nx diff --git a/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-312.pyc deleted file mode 100644 index 82af0a2212e534143dc5228ea88d982894db115f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7632 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc deleted file mode 100644 index cd5d8401c2874efdd6867ed2c2a18a0cf4949f6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12504 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-312.pyc deleted file mode 100644 index 1d2b7dcdd505b85f30eeacde6b96f7996128bac7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29030 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 diff --git a/venv/lib/python3.12/site-packages/pip/_internal/vcs/bazaar.py b/venv/lib/python3.12/site-packages/pip/_internal/vcs/bazaar.py deleted file mode 100644 index 20a17ed..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/vcs/bazaar.py +++ /dev/null @@ -1,112 +0,0 @@ -import logging -from typing import List, Optional, Tuple - -from pip._internal.utils.misc import HiddenText, display_path -from pip._internal.utils.subprocess import make_command -from pip._internal.utils.urls import path_to_url -from pip._internal.vcs.versioncontrol import ( - AuthInfo, - RemoteNotFoundError, - RevOptions, - VersionControl, - vcs, -) - -logger = logging.getLogger(__name__) - - -class Bazaar(VersionControl): - name = "bzr" - dirname = ".bzr" - repo_name = "branch" - schemes = ( - "bzr+http", - "bzr+https", - "bzr+ssh", - "bzr+sftp", - "bzr+ftp", - "bzr+lp", - "bzr+file", - ) - - @staticmethod - def get_base_rev_args(rev: str) -> List[str]: - return ["-r", rev] - - def fetch_new( - self, dest: str, url: HiddenText, rev_options: RevOptions, verbosity: int - ) -> None: - rev_display = rev_options.to_display() - logger.info( - "Checking out %s%s to %s", - url, - rev_display, - display_path(dest), - ) - if verbosity <= 0: - flag = "--quiet" - elif verbosity == 1: - flag = "" - else: - flag = f"-{'v'*verbosity}" - cmd_args = make_command( - "checkout", "--lightweight", flag, rev_options.to_args(), url, dest - ) - self.run_command(cmd_args) - - def switch(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: - self.run_command(make_command("switch", url), cwd=dest) - - def update(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: - output = self.run_command( - make_command("info"), show_stdout=False, stdout_only=True, cwd=dest - ) - if output.startswith("Standalone "): - # Older versions of pip used to create standalone branches. - # Convert the standalone branch to a checkout by calling "bzr bind". - cmd_args = make_command("bind", "-q", url) - self.run_command(cmd_args, cwd=dest) - - cmd_args = make_command("update", "-q", rev_options.to_args()) - self.run_command(cmd_args, cwd=dest) - - @classmethod - def get_url_rev_and_auth(cls, url: str) -> Tuple[str, Optional[str], AuthInfo]: - # hotfix the URL scheme after removing bzr+ from bzr+ssh:// re-add it - url, rev, user_pass = super().get_url_rev_and_auth(url) - if url.startswith("ssh://"): - url = "bzr+" + url - return url, rev, user_pass - - @classmethod - def get_remote_url(cls, location: str) -> str: - urls = cls.run_command( - ["info"], show_stdout=False, stdout_only=True, cwd=location - ) - for line in urls.splitlines(): - line = line.strip() - for x in ("checkout of branch: ", "parent branch: "): - if line.startswith(x): - repo = line.split(x)[1] - if cls._is_local_repository(repo): - return path_to_url(repo) - return repo - raise RemoteNotFoundError - - @classmethod - def get_revision(cls, location: str) -> str: - revision = cls.run_command( - ["revno"], - show_stdout=False, - stdout_only=True, - cwd=location, - ) - return revision.splitlines()[-1] - - @classmethod - def is_commit_id_equal(cls, dest: str, name: Optional[str]) -> bool: - """Always assume the versions don't match""" - return False - - -vcs.register(Bazaar) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/vcs/git.py b/venv/lib/python3.12/site-packages/pip/_internal/vcs/git.py deleted file mode 100644 index 8c242cf..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/vcs/git.py +++ /dev/null @@ -1,526 +0,0 @@ -import logging -import os.path -import pathlib -import re -import urllib.parse -import urllib.request -from typing import List, Optional, Tuple - -from pip._internal.exceptions import BadCommand, InstallationError -from pip._internal.utils.misc import HiddenText, display_path, hide_url -from pip._internal.utils.subprocess import make_command -from pip._internal.vcs.versioncontrol import ( - AuthInfo, - RemoteNotFoundError, - RemoteNotValidError, - RevOptions, - VersionControl, - find_path_to_project_root_from_repo_root, - vcs, -) - -urlsplit = urllib.parse.urlsplit -urlunsplit = urllib.parse.urlunsplit - - -logger = logging.getLogger(__name__) - - -GIT_VERSION_REGEX = re.compile( - r"^git version " # Prefix. - r"(\d+)" # Major. - r"\.(\d+)" # Dot, minor. - r"(?:\.(\d+))?" # Optional dot, patch. - r".*$" # Suffix, including any pre- and post-release segments we don't care about. -) - -HASH_REGEX = re.compile("^[a-fA-F0-9]{40}$") - -# SCP (Secure copy protocol) shorthand. e.g. 'git@example.com:foo/bar.git' -SCP_REGEX = re.compile( - r"""^ - # Optional user, e.g. 'git@' - (\w+@)? - # Server, e.g. 'github.com'. - ([^/:]+): - # The server-side path. e.g. 'user/project.git'. Must start with an - # alphanumeric character so as not to be confusable with a Windows paths - # like 'C:/foo/bar' or 'C:\foo\bar'. - (\w[^:]*) - $""", - re.VERBOSE, -) - - -def looks_like_hash(sha: str) -> bool: - return bool(HASH_REGEX.match(sha)) - - -class Git(VersionControl): - name = "git" - dirname = ".git" - repo_name = "clone" - schemes = ( - "git+http", - "git+https", - "git+ssh", - "git+git", - "git+file", - ) - # Prevent the user's environment variables from interfering with pip: - # https://github.com/pypa/pip/issues/1130 - unset_environ = ("GIT_DIR", "GIT_WORK_TREE") - default_arg_rev = "HEAD" - - @staticmethod - def get_base_rev_args(rev: str) -> List[str]: - return [rev] - - def is_immutable_rev_checkout(self, url: str, dest: str) -> bool: - _, rev_options = self.get_url_rev_options(hide_url(url)) - if not rev_options.rev: - return False - if not self.is_commit_id_equal(dest, rev_options.rev): - # the current commit is different from rev, - # which means rev was something else than a commit hash - return False - # return False in the rare case rev is both a commit hash - # and a tag or a branch; we don't want to cache in that case - # because that branch/tag could point to something else in the future - is_tag_or_branch = bool(self.get_revision_sha(dest, rev_options.rev)[0]) - return not is_tag_or_branch - - def get_git_version(self) -> Tuple[int, ...]: - version = self.run_command( - ["version"], - command_desc="git version", - show_stdout=False, - stdout_only=True, - ) - match = GIT_VERSION_REGEX.match(version) - if not match: - logger.warning("Can't parse git version: %s", version) - return () - return (int(match.group(1)), int(match.group(2))) - - @classmethod - def get_current_branch(cls, location: str) -> Optional[str]: - """ - Return the current branch, or None if HEAD isn't at a branch - (e.g. detached HEAD). - """ - # git-symbolic-ref exits with empty stdout if "HEAD" is a detached - # HEAD rather than a symbolic ref. In addition, the -q causes the - # command to exit with status code 1 instead of 128 in this case - # and to suppress the message to stderr. - args = ["symbolic-ref", "-q", "HEAD"] - output = cls.run_command( - args, - extra_ok_returncodes=(1,), - show_stdout=False, - stdout_only=True, - cwd=location, - ) - ref = output.strip() - - if ref.startswith("refs/heads/"): - return ref[len("refs/heads/") :] - - return None - - @classmethod - def get_revision_sha(cls, dest: str, rev: str) -> Tuple[Optional[str], bool]: - """ - Return (sha_or_none, is_branch), where sha_or_none is a commit hash - if the revision names a remote branch or tag, otherwise None. - - Args: - dest: the repository directory. - rev: the revision name. - """ - # Pass rev to pre-filter the list. - output = cls.run_command( - ["show-ref", rev], - cwd=dest, - show_stdout=False, - stdout_only=True, - on_returncode="ignore", - ) - refs = {} - # NOTE: We do not use splitlines here since that would split on other - # unicode separators, which can be maliciously used to install a - # different revision. - for line in output.strip().split("\n"): - line = line.rstrip("\r") - if not line: - continue - try: - ref_sha, ref_name = line.split(" ", maxsplit=2) - except ValueError: - # Include the offending line to simplify troubleshooting if - # this error ever occurs. - raise ValueError(f"unexpected show-ref line: {line!r}") - - refs[ref_name] = ref_sha - - branch_ref = f"refs/remotes/origin/{rev}" - tag_ref = f"refs/tags/{rev}" - - sha = refs.get(branch_ref) - if sha is not None: - return (sha, True) - - sha = refs.get(tag_ref) - - return (sha, False) - - @classmethod - def _should_fetch(cls, dest: str, rev: str) -> bool: - """ - Return true if rev is a ref or is a commit that we don't have locally. - - Branches and tags are not considered in this method because they are - assumed to be always available locally (which is a normal outcome of - ``git clone`` and ``git fetch --tags``). - """ - if rev.startswith("refs/"): - # Always fetch remote refs. - return True - - if not looks_like_hash(rev): - # Git fetch would fail with abbreviated commits. - return False - - if cls.has_commit(dest, rev): - # Don't fetch if we have the commit locally. - return False - - return True - - @classmethod - def resolve_revision( - cls, dest: str, url: HiddenText, rev_options: RevOptions - ) -> RevOptions: - """ - Resolve a revision to a new RevOptions object with the SHA1 of the - branch, tag, or ref if found. - - Args: - rev_options: a RevOptions object. - """ - rev = rev_options.arg_rev - # The arg_rev property's implementation for Git ensures that the - # rev return value is always non-None. - assert rev is not None - - sha, is_branch = cls.get_revision_sha(dest, rev) - - if sha is not None: - rev_options = rev_options.make_new(sha) - rev_options.branch_name = rev if is_branch else None - - return rev_options - - # Do not show a warning for the common case of something that has - # the form of a Git commit hash. - if not looks_like_hash(rev): - logger.warning( - "Did not find branch or tag '%s', assuming revision or ref.", - rev, - ) - - if not cls._should_fetch(dest, rev): - return rev_options - - # fetch the requested revision - cls.run_command( - make_command("fetch", "-q", url, rev_options.to_args()), - cwd=dest, - ) - # Change the revision to the SHA of the ref we fetched - sha = cls.get_revision(dest, rev="FETCH_HEAD") - rev_options = rev_options.make_new(sha) - - return rev_options - - @classmethod - def is_commit_id_equal(cls, dest: str, name: Optional[str]) -> bool: - """ - Return whether the current commit hash equals the given name. - - Args: - dest: the repository directory. - name: a string name. - """ - if not name: - # Then avoid an unnecessary subprocess call. - return False - - return cls.get_revision(dest) == name - - def fetch_new( - self, dest: str, url: HiddenText, rev_options: RevOptions, verbosity: int - ) -> None: - rev_display = rev_options.to_display() - logger.info("Cloning %s%s to %s", url, rev_display, display_path(dest)) - if verbosity <= 0: - flags: Tuple[str, ...] = ("--quiet",) - elif verbosity == 1: - flags = () - else: - flags = ("--verbose", "--progress") - if self.get_git_version() >= (2, 17): - # Git added support for partial clone in 2.17 - # https://git-scm.com/docs/partial-clone - # Speeds up cloning by functioning without a complete copy of repository - self.run_command( - make_command( - "clone", - "--filter=blob:none", - *flags, - url, - dest, - ) - ) - else: - self.run_command(make_command("clone", *flags, url, dest)) - - if rev_options.rev: - # Then a specific revision was requested. - rev_options = self.resolve_revision(dest, url, rev_options) - branch_name = getattr(rev_options, "branch_name", None) - logger.debug("Rev options %s, branch_name %s", rev_options, branch_name) - if branch_name is None: - # Only do a checkout if the current commit id doesn't match - # the requested revision. - if not self.is_commit_id_equal(dest, rev_options.rev): - cmd_args = make_command( - "checkout", - "-q", - rev_options.to_args(), - ) - self.run_command(cmd_args, cwd=dest) - elif self.get_current_branch(dest) != branch_name: - # Then a specific branch was requested, and that branch - # is not yet checked out. - track_branch = f"origin/{branch_name}" - cmd_args = [ - "checkout", - "-b", - branch_name, - "--track", - track_branch, - ] - self.run_command(cmd_args, cwd=dest) - else: - sha = self.get_revision(dest) - rev_options = rev_options.make_new(sha) - - logger.info("Resolved %s to commit %s", url, rev_options.rev) - - #: repo may contain submodules - self.update_submodules(dest) - - def switch(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: - self.run_command( - make_command("config", "remote.origin.url", url), - cwd=dest, - ) - cmd_args = make_command("checkout", "-q", rev_options.to_args()) - self.run_command(cmd_args, cwd=dest) - - self.update_submodules(dest) - - def update(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: - # First fetch changes from the default remote - if self.get_git_version() >= (1, 9): - # fetch tags in addition to everything else - self.run_command(["fetch", "-q", "--tags"], cwd=dest) - else: - self.run_command(["fetch", "-q"], cwd=dest) - # Then reset to wanted revision (maybe even origin/master) - rev_options = self.resolve_revision(dest, url, rev_options) - cmd_args = make_command("reset", "--hard", "-q", rev_options.to_args()) - self.run_command(cmd_args, cwd=dest) - #: update submodules - self.update_submodules(dest) - - @classmethod - def get_remote_url(cls, location: str) -> str: - """ - Return URL of the first remote encountered. - - Raises RemoteNotFoundError if the repository does not have a remote - url configured. - """ - # We need to pass 1 for extra_ok_returncodes since the command - # exits with return code 1 if there are no matching lines. - stdout = cls.run_command( - ["config", "--get-regexp", r"remote\..*\.url"], - extra_ok_returncodes=(1,), - show_stdout=False, - stdout_only=True, - cwd=location, - ) - remotes = stdout.splitlines() - try: - found_remote = remotes[0] - except IndexError: - raise RemoteNotFoundError - - for remote in remotes: - if remote.startswith("remote.origin.url "): - found_remote = remote - break - url = found_remote.split(" ")[1] - return cls._git_remote_to_pip_url(url.strip()) - - @staticmethod - def _git_remote_to_pip_url(url: str) -> str: - """ - Convert a remote url from what git uses to what pip accepts. - - There are 3 legal forms **url** may take: - - 1. A fully qualified url: ssh://git@example.com/foo/bar.git - 2. A local project.git folder: /path/to/bare/repository.git - 3. SCP shorthand for form 1: git@example.com:foo/bar.git - - Form 1 is output as-is. Form 2 must be converted to URI and form 3 must - be converted to form 1. - - See the corresponding test test_git_remote_url_to_pip() for examples of - sample inputs/outputs. - """ - if re.match(r"\w+://", url): - # This is already valid. Pass it though as-is. - return url - if os.path.exists(url): - # A local bare remote (git clone --mirror). - # Needs a file:// prefix. - return pathlib.PurePath(url).as_uri() - scp_match = SCP_REGEX.match(url) - if scp_match: - # Add an ssh:// prefix and replace the ':' with a '/'. - return scp_match.expand(r"ssh://\1\2/\3") - # Otherwise, bail out. - raise RemoteNotValidError(url) - - @classmethod - def has_commit(cls, location: str, rev: str) -> bool: - """ - Check if rev is a commit that is available in the local repository. - """ - try: - cls.run_command( - ["rev-parse", "-q", "--verify", "sha^" + rev], - cwd=location, - log_failed_cmd=False, - ) - except InstallationError: - return False - else: - return True - - @classmethod - def get_revision(cls, location: str, rev: Optional[str] = None) -> str: - if rev is None: - rev = "HEAD" - current_rev = cls.run_command( - ["rev-parse", rev], - show_stdout=False, - stdout_only=True, - cwd=location, - ) - return current_rev.strip() - - @classmethod - def get_subdirectory(cls, location: str) -> Optional[str]: - """ - Return the path to Python project root, relative to the repo root. - Return None if the project root is in the repo root. - """ - # find the repo root - git_dir = cls.run_command( - ["rev-parse", "--git-dir"], - show_stdout=False, - stdout_only=True, - cwd=location, - ).strip() - if not os.path.isabs(git_dir): - git_dir = os.path.join(location, git_dir) - repo_root = os.path.abspath(os.path.join(git_dir, "..")) - return find_path_to_project_root_from_repo_root(location, repo_root) - - @classmethod - def get_url_rev_and_auth(cls, url: str) -> Tuple[str, Optional[str], AuthInfo]: - """ - Prefixes stub URLs like 'user@hostname:user/repo.git' with 'ssh://'. - That's required because although they use SSH they sometimes don't - work with a ssh:// scheme (e.g. GitHub). But we need a scheme for - parsing. Hence we remove it again afterwards and return it as a stub. - """ - # Works around an apparent Git bug - # (see https://article.gmane.org/gmane.comp.version-control.git/146500) - scheme, netloc, path, query, fragment = urlsplit(url) - if scheme.endswith("file"): - initial_slashes = path[: -len(path.lstrip("/"))] - newpath = initial_slashes + urllib.request.url2pathname(path).replace( - "\\", "/" - ).lstrip("/") - after_plus = scheme.find("+") + 1 - url = scheme[:after_plus] + urlunsplit( - (scheme[after_plus:], netloc, newpath, query, fragment), - ) - - if "://" not in url: - assert "file:" not in url - url = url.replace("git+", "git+ssh://") - url, rev, user_pass = super().get_url_rev_and_auth(url) - url = url.replace("ssh://", "") - else: - url, rev, user_pass = super().get_url_rev_and_auth(url) - - return url, rev, user_pass - - @classmethod - def update_submodules(cls, location: str) -> None: - if not os.path.exists(os.path.join(location, ".gitmodules")): - return - cls.run_command( - ["submodule", "update", "--init", "--recursive", "-q"], - cwd=location, - ) - - @classmethod - def get_repository_root(cls, location: str) -> Optional[str]: - loc = super().get_repository_root(location) - if loc: - return loc - try: - r = cls.run_command( - ["rev-parse", "--show-toplevel"], - cwd=location, - show_stdout=False, - stdout_only=True, - on_returncode="raise", - log_failed_cmd=False, - ) - except BadCommand: - logger.debug( - "could not determine if %s is under git control " - "because git is not available", - location, - ) - return None - except InstallationError: - return None - return os.path.normpath(r.rstrip("\r\n")) - - @staticmethod - def should_add_vcs_url_prefix(repo_url: str) -> bool: - """In either https or ssh form, requirements must be prefixed with git+.""" - return True - - -vcs.register(Git) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/vcs/mercurial.py b/venv/lib/python3.12/site-packages/pip/_internal/vcs/mercurial.py deleted file mode 100644 index c183d41..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/vcs/mercurial.py +++ /dev/null @@ -1,163 +0,0 @@ -import configparser -import logging -import os -from typing import List, Optional, Tuple - -from pip._internal.exceptions import BadCommand, InstallationError -from pip._internal.utils.misc import HiddenText, display_path -from pip._internal.utils.subprocess import make_command -from pip._internal.utils.urls import path_to_url -from pip._internal.vcs.versioncontrol import ( - RevOptions, - VersionControl, - find_path_to_project_root_from_repo_root, - vcs, -) - -logger = logging.getLogger(__name__) - - -class Mercurial(VersionControl): - name = "hg" - dirname = ".hg" - repo_name = "clone" - schemes = ( - "hg+file", - "hg+http", - "hg+https", - "hg+ssh", - "hg+static-http", - ) - - @staticmethod - def get_base_rev_args(rev: str) -> List[str]: - return [f"--rev={rev}"] - - def fetch_new( - self, dest: str, url: HiddenText, rev_options: RevOptions, verbosity: int - ) -> None: - rev_display = rev_options.to_display() - logger.info( - "Cloning hg %s%s to %s", - url, - rev_display, - display_path(dest), - ) - if verbosity <= 0: - flags: Tuple[str, ...] = ("--quiet",) - elif verbosity == 1: - flags = () - elif verbosity == 2: - flags = ("--verbose",) - else: - flags = ("--verbose", "--debug") - self.run_command(make_command("clone", "--noupdate", *flags, url, dest)) - self.run_command( - make_command("update", *flags, rev_options.to_args()), - cwd=dest, - ) - - def switch(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: - repo_config = os.path.join(dest, self.dirname, "hgrc") - config = configparser.RawConfigParser() - try: - config.read(repo_config) - config.set("paths", "default", url.secret) - with open(repo_config, "w") as config_file: - config.write(config_file) - except (OSError, configparser.NoSectionError) as exc: - logger.warning("Could not switch Mercurial repository to %s: %s", url, exc) - else: - cmd_args = make_command("update", "-q", rev_options.to_args()) - self.run_command(cmd_args, cwd=dest) - - def update(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: - self.run_command(["pull", "-q"], cwd=dest) - cmd_args = make_command("update", "-q", rev_options.to_args()) - self.run_command(cmd_args, cwd=dest) - - @classmethod - def get_remote_url(cls, location: str) -> str: - url = cls.run_command( - ["showconfig", "paths.default"], - show_stdout=False, - stdout_only=True, - cwd=location, - ).strip() - if cls._is_local_repository(url): - url = path_to_url(url) - return url.strip() - - @classmethod - def get_revision(cls, location: str) -> str: - """ - Return the repository-local changeset revision number, as an integer. - """ - current_revision = cls.run_command( - ["parents", "--template={rev}"], - show_stdout=False, - stdout_only=True, - cwd=location, - ).strip() - return current_revision - - @classmethod - def get_requirement_revision(cls, location: str) -> str: - """ - Return the changeset identification hash, as a 40-character - hexadecimal string - """ - current_rev_hash = cls.run_command( - ["parents", "--template={node}"], - show_stdout=False, - stdout_only=True, - cwd=location, - ).strip() - return current_rev_hash - - @classmethod - def is_commit_id_equal(cls, dest: str, name: Optional[str]) -> bool: - """Always assume the versions don't match""" - return False - - @classmethod - def get_subdirectory(cls, location: str) -> Optional[str]: - """ - Return the path to Python project root, relative to the repo root. - Return None if the project root is in the repo root. - """ - # find the repo root - repo_root = cls.run_command( - ["root"], show_stdout=False, stdout_only=True, cwd=location - ).strip() - if not os.path.isabs(repo_root): - repo_root = os.path.abspath(os.path.join(location, repo_root)) - return find_path_to_project_root_from_repo_root(location, repo_root) - - @classmethod - def get_repository_root(cls, location: str) -> Optional[str]: - loc = super().get_repository_root(location) - if loc: - return loc - try: - r = cls.run_command( - ["root"], - cwd=location, - show_stdout=False, - stdout_only=True, - on_returncode="raise", - log_failed_cmd=False, - ) - except BadCommand: - logger.debug( - "could not determine if %s is under hg control " - "because hg is not available", - location, - ) - return None - except InstallationError: - return None - return os.path.normpath(r.rstrip("\r\n")) - - -vcs.register(Mercurial) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/vcs/subversion.py b/venv/lib/python3.12/site-packages/pip/_internal/vcs/subversion.py deleted file mode 100644 index 16d93a6..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/vcs/subversion.py +++ /dev/null @@ -1,324 +0,0 @@ -import logging -import os -import re -from typing import List, Optional, Tuple - -from pip._internal.utils.misc import ( - HiddenText, - display_path, - is_console_interactive, - is_installable_dir, - split_auth_from_netloc, -) -from pip._internal.utils.subprocess import CommandArgs, make_command -from pip._internal.vcs.versioncontrol import ( - AuthInfo, - RemoteNotFoundError, - RevOptions, - VersionControl, - vcs, -) - -logger = logging.getLogger(__name__) - -_svn_xml_url_re = re.compile('url="([^"]+)"') -_svn_rev_re = re.compile(r'committed-rev="(\d+)"') -_svn_info_xml_rev_re = re.compile(r'\s*revision="(\d+)"') -_svn_info_xml_url_re = re.compile(r"<url>(.*)</url>") - - -class Subversion(VersionControl): - name = "svn" - dirname = ".svn" - repo_name = "checkout" - schemes = ("svn+ssh", "svn+http", "svn+https", "svn+svn", "svn+file") - - @classmethod - def should_add_vcs_url_prefix(cls, remote_url: str) -> bool: - return True - - @staticmethod - def get_base_rev_args(rev: str) -> List[str]: - return ["-r", rev] - - @classmethod - def get_revision(cls, location: str) -> str: - """ - Return the maximum revision for all files under a given location - """ - # Note: taken from setuptools.command.egg_info - revision = 0 - - for base, dirs, _ in os.walk(location): - if cls.dirname not in dirs: - dirs[:] = [] - continue # no sense walking uncontrolled subdirs - dirs.remove(cls.dirname) - entries_fn = os.path.join(base, cls.dirname, "entries") - if not os.path.exists(entries_fn): - # FIXME: should we warn? - continue - - dirurl, localrev = cls._get_svn_url_rev(base) - - if base == location: - assert dirurl is not None - base = dirurl + "/" # save the root url - elif not dirurl or not dirurl.startswith(base): - dirs[:] = [] - continue # not part of the same svn tree, skip it - revision = max(revision, localrev) - return str(revision) - - @classmethod - def get_netloc_and_auth( - cls, netloc: str, scheme: str - ) -> Tuple[str, Tuple[Optional[str], Optional[str]]]: - """ - This override allows the auth information to be passed to svn via the - --username and --password options instead of via the URL. - """ - if scheme == "ssh": - # The --username and --password options can't be used for - # svn+ssh URLs, so keep the auth information in the URL. - return super().get_netloc_and_auth(netloc, scheme) - - return split_auth_from_netloc(netloc) - - @classmethod - def get_url_rev_and_auth(cls, url: str) -> Tuple[str, Optional[str], AuthInfo]: - # hotfix the URL scheme after removing svn+ from svn+ssh:// re-add it - url, rev, user_pass = super().get_url_rev_and_auth(url) - if url.startswith("ssh://"): - url = "svn+" + url - return url, rev, user_pass - - @staticmethod - def make_rev_args( - username: Optional[str], password: Optional[HiddenText] - ) -> CommandArgs: - extra_args: CommandArgs = [] - if username: - extra_args += ["--username", username] - if password: - extra_args += ["--password", password] - - return extra_args - - @classmethod - def get_remote_url(cls, location: str) -> str: - # In cases where the source is in a subdirectory, we have to look up in - # the location until we find a valid project root. - orig_location = location - while not is_installable_dir(location): - last_location = location - location = os.path.dirname(location) - if location == last_location: - # We've traversed up to the root of the filesystem without - # finding a Python project. - logger.warning( - "Could not find Python project for directory %s (tried all " - "parent directories)", - orig_location, - ) - raise RemoteNotFoundError - - url, _rev = cls._get_svn_url_rev(location) - if url is None: - raise RemoteNotFoundError - - return url - - @classmethod - def _get_svn_url_rev(cls, location: str) -> Tuple[Optional[str], int]: - from pip._internal.exceptions import InstallationError - - entries_path = os.path.join(location, cls.dirname, "entries") - if os.path.exists(entries_path): - with open(entries_path) as f: - data = f.read() - else: # subversion >= 1.7 does not have the 'entries' file - data = "" - - url = None - if data.startswith("8") or data.startswith("9") or data.startswith("10"): - entries = list(map(str.splitlines, data.split("\n\x0c\n"))) - del entries[0][0] # get rid of the '8' - url = entries[0][3] - revs = [int(d[9]) for d in entries if len(d) > 9 and d[9]] + [0] - elif data.startswith("<?xml"): - match = _svn_xml_url_re.search(data) - if not match: - raise ValueError(f"Badly formatted data: {data!r}") - url = match.group(1) # get repository URL - revs = [int(m.group(1)) for m in _svn_rev_re.finditer(data)] + [0] - else: - try: - # subversion >= 1.7 - # Note that using get_remote_call_options is not necessary here - # because `svn info` is being run against a local directory. - # We don't need to worry about making sure interactive mode - # is being used to prompt for passwords, because passwords - # are only potentially needed for remote server requests. - xml = cls.run_command( - ["info", "--xml", location], - show_stdout=False, - stdout_only=True, - ) - match = _svn_info_xml_url_re.search(xml) - assert match is not None - url = match.group(1) - revs = [int(m.group(1)) for m in _svn_info_xml_rev_re.finditer(xml)] - except InstallationError: - url, revs = None, [] - - if revs: - rev = max(revs) - else: - rev = 0 - - return url, rev - - @classmethod - def is_commit_id_equal(cls, dest: str, name: Optional[str]) -> bool: - """Always assume the versions don't match""" - return False - - def __init__(self, use_interactive: Optional[bool] = None) -> None: - if use_interactive is None: - use_interactive = is_console_interactive() - self.use_interactive = use_interactive - - # This member is used to cache the fetched version of the current - # ``svn`` client. - # Special value definitions: - # None: Not evaluated yet. - # Empty tuple: Could not parse version. - self._vcs_version: Optional[Tuple[int, ...]] = None - - super().__init__() - - def call_vcs_version(self) -> Tuple[int, ...]: - """Query the version of the currently installed Subversion client. - - :return: A tuple containing the parts of the version information or - ``()`` if the version returned from ``svn`` could not be parsed. - :raises: BadCommand: If ``svn`` is not installed. - """ - # Example versions: - # svn, version 1.10.3 (r1842928) - # compiled Feb 25 2019, 14:20:39 on x86_64-apple-darwin17.0.0 - # svn, version 1.7.14 (r1542130) - # compiled Mar 28 2018, 08:49:13 on x86_64-pc-linux-gnu - # svn, version 1.12.0-SlikSvn (SlikSvn/1.12.0) - # compiled May 28 2019, 13:44:56 on x86_64-microsoft-windows6.2 - version_prefix = "svn, version " - version = self.run_command(["--version"], show_stdout=False, stdout_only=True) - if not version.startswith(version_prefix): - return () - - version = version[len(version_prefix) :].split()[0] - version_list = version.partition("-")[0].split(".") - try: - parsed_version = tuple(map(int, version_list)) - except ValueError: - return () - - return parsed_version - - def get_vcs_version(self) -> Tuple[int, ...]: - """Return the version of the currently installed Subversion client. - - If the version of the Subversion client has already been queried, - a cached value will be used. - - :return: A tuple containing the parts of the version information or - ``()`` if the version returned from ``svn`` could not be parsed. - :raises: BadCommand: If ``svn`` is not installed. - """ - if self._vcs_version is not None: - # Use cached version, if available. - # If parsing the version failed previously (empty tuple), - # do not attempt to parse it again. - return self._vcs_version - - vcs_version = self.call_vcs_version() - self._vcs_version = vcs_version - return vcs_version - - def get_remote_call_options(self) -> CommandArgs: - """Return options to be used on calls to Subversion that contact the server. - - These options are applicable for the following ``svn`` subcommands used - in this class. - - - checkout - - switch - - update - - :return: A list of command line arguments to pass to ``svn``. - """ - if not self.use_interactive: - # --non-interactive switch is available since Subversion 0.14.4. - # Subversion < 1.8 runs in interactive mode by default. - return ["--non-interactive"] - - svn_version = self.get_vcs_version() - # By default, Subversion >= 1.8 runs in non-interactive mode if - # stdin is not a TTY. Since that is how pip invokes SVN, in - # call_subprocess(), pip must pass --force-interactive to ensure - # the user can be prompted for a password, if required. - # SVN added the --force-interactive option in SVN 1.8. Since - # e.g. RHEL/CentOS 7, which is supported until 2024, ships with - # SVN 1.7, pip should continue to support SVN 1.7. Therefore, pip - # can't safely add the option if the SVN version is < 1.8 (or unknown). - if svn_version >= (1, 8): - return ["--force-interactive"] - - return [] - - def fetch_new( - self, dest: str, url: HiddenText, rev_options: RevOptions, verbosity: int - ) -> None: - rev_display = rev_options.to_display() - logger.info( - "Checking out %s%s to %s", - url, - rev_display, - display_path(dest), - ) - if verbosity <= 0: - flag = "--quiet" - else: - flag = "" - cmd_args = make_command( - "checkout", - flag, - self.get_remote_call_options(), - rev_options.to_args(), - url, - dest, - ) - self.run_command(cmd_args) - - def switch(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: - cmd_args = make_command( - "switch", - self.get_remote_call_options(), - rev_options.to_args(), - url, - dest, - ) - self.run_command(cmd_args) - - def update(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: - cmd_args = make_command( - "update", - self.get_remote_call_options(), - rev_options.to_args(), - dest, - ) - self.run_command(cmd_args) - - -vcs.register(Subversion) diff --git a/venv/lib/python3.12/site-packages/pip/_internal/vcs/versioncontrol.py b/venv/lib/python3.12/site-packages/pip/_internal/vcs/versioncontrol.py deleted file mode 100644 index 46ca279..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/vcs/versioncontrol.py +++ /dev/null @@ -1,705 +0,0 @@ -"""Handles all VCS (version control) support""" - -import logging -import os -import shutil -import sys -import urllib.parse -from typing import ( - TYPE_CHECKING, - Any, - Dict, - Iterable, - Iterator, - List, - Mapping, - Optional, - Tuple, - Type, - Union, -) - -from pip._internal.cli.spinners import SpinnerInterface -from pip._internal.exceptions import BadCommand, InstallationError -from pip._internal.utils.misc import ( - HiddenText, - ask_path_exists, - backup_dir, - display_path, - hide_url, - hide_value, - is_installable_dir, - rmtree, -) -from pip._internal.utils.subprocess import ( - CommandArgs, - call_subprocess, - format_command_args, - make_command, -) -from pip._internal.utils.urls import get_url_scheme - -if TYPE_CHECKING: - # Literal was introduced in Python 3.8. - # - # TODO: Remove `if TYPE_CHECKING` when dropping support for Python 3.7. - from typing import Literal - - -__all__ = ["vcs"] - - -logger = logging.getLogger(__name__) - -AuthInfo = Tuple[Optional[str], Optional[str]] - - -def is_url(name: str) -> bool: - """ - Return true if the name looks like a URL. - """ - scheme = get_url_scheme(name) - if scheme is None: - return False - return scheme in ["http", "https", "file", "ftp"] + vcs.all_schemes - - -def make_vcs_requirement_url( - repo_url: str, rev: str, project_name: str, subdir: Optional[str] = None -) -> str: - """ - Return the URL for a VCS requirement. - - Args: - repo_url: the remote VCS url, with any needed VCS prefix (e.g. "git+"). - project_name: the (unescaped) project name. - """ - egg_project_name = project_name.replace("-", "_") - req = f"{repo_url}@{rev}#egg={egg_project_name}" - if subdir: - req += f"&subdirectory={subdir}" - - return req - - -def find_path_to_project_root_from_repo_root( - location: str, repo_root: str -) -> Optional[str]: - """ - Find the the Python project's root by searching up the filesystem from - `location`. Return the path to project root relative to `repo_root`. - Return None if the project root is `repo_root`, or cannot be found. - """ - # find project root. - orig_location = location - while not is_installable_dir(location): - last_location = location - location = os.path.dirname(location) - if location == last_location: - # We've traversed up to the root of the filesystem without - # finding a Python project. - logger.warning( - "Could not find a Python project for directory %s (tried all " - "parent directories)", - orig_location, - ) - return None - - if os.path.samefile(repo_root, location): - return None - - return os.path.relpath(location, repo_root) - - -class RemoteNotFoundError(Exception): - pass - - -class RemoteNotValidError(Exception): - def __init__(self, url: str): - super().__init__(url) - self.url = url - - -class RevOptions: - - """ - Encapsulates a VCS-specific revision to install, along with any VCS - install options. - - Instances of this class should be treated as if immutable. - """ - - def __init__( - self, - vc_class: Type["VersionControl"], - rev: Optional[str] = None, - extra_args: Optional[CommandArgs] = None, - ) -> None: - """ - Args: - vc_class: a VersionControl subclass. - rev: the name of the revision to install. - extra_args: a list of extra options. - """ - if extra_args is None: - extra_args = [] - - self.extra_args = extra_args - self.rev = rev - self.vc_class = vc_class - self.branch_name: Optional[str] = None - - def __repr__(self) -> str: - return f"<RevOptions {self.vc_class.name}: rev={self.rev!r}>" - - @property - def arg_rev(self) -> Optional[str]: - if self.rev is None: - return self.vc_class.default_arg_rev - - return self.rev - - def to_args(self) -> CommandArgs: - """ - Return the VCS-specific command arguments. - """ - args: CommandArgs = [] - rev = self.arg_rev - if rev is not None: - args += self.vc_class.get_base_rev_args(rev) - args += self.extra_args - - return args - - def to_display(self) -> str: - if not self.rev: - return "" - - return f" (to revision {self.rev})" - - def make_new(self, rev: str) -> "RevOptions": - """ - Make a copy of the current instance, but with a new rev. - - Args: - rev: the name of the revision for the new object. - """ - return self.vc_class.make_rev_options(rev, extra_args=self.extra_args) - - -class VcsSupport: - _registry: Dict[str, "VersionControl"] = {} - schemes = ["ssh", "git", "hg", "bzr", "sftp", "svn"] - - def __init__(self) -> None: - # Register more schemes with urlparse for various version control - # systems - urllib.parse.uses_netloc.extend(self.schemes) - super().__init__() - - def __iter__(self) -> Iterator[str]: - return self._registry.__iter__() - - @property - def backends(self) -> List["VersionControl"]: - return list(self._registry.values()) - - @property - def dirnames(self) -> List[str]: - return [backend.dirname for backend in self.backends] - - @property - def all_schemes(self) -> List[str]: - schemes: List[str] = [] - for backend in self.backends: - schemes.extend(backend.schemes) - return schemes - - def register(self, cls: Type["VersionControl"]) -> None: - if not hasattr(cls, "name"): - logger.warning("Cannot register VCS %s", cls.__name__) - return - if cls.name not in self._registry: - self._registry[cls.name] = cls() - logger.debug("Registered VCS backend: %s", cls.name) - - def unregister(self, name: str) -> None: - if name in self._registry: - del self._registry[name] - - def get_backend_for_dir(self, location: str) -> Optional["VersionControl"]: - """ - Return a VersionControl object if a repository of that type is found - at the given directory. - """ - vcs_backends = {} - for vcs_backend in self._registry.values(): - repo_path = vcs_backend.get_repository_root(location) - if not repo_path: - continue - logger.debug("Determine that %s uses VCS: %s", location, vcs_backend.name) - vcs_backends[repo_path] = vcs_backend - - if not vcs_backends: - return None - - # Choose the VCS in the inner-most directory. Since all repository - # roots found here would be either `location` or one of its - # parents, the longest path should have the most path components, - # i.e. the backend representing the inner-most repository. - inner_most_repo_path = max(vcs_backends, key=len) - return vcs_backends[inner_most_repo_path] - - def get_backend_for_scheme(self, scheme: str) -> Optional["VersionControl"]: - """ - Return a VersionControl object or None. - """ - for vcs_backend in self._registry.values(): - if scheme in vcs_backend.schemes: - return vcs_backend - return None - - def get_backend(self, name: str) -> Optional["VersionControl"]: - """ - Return a VersionControl object or None. - """ - name = name.lower() - return self._registry.get(name) - - -vcs = VcsSupport() - - -class VersionControl: - name = "" - dirname = "" - repo_name = "" - # List of supported schemes for this Version Control - schemes: Tuple[str, ...] = () - # Iterable of environment variable names to pass to call_subprocess(). - unset_environ: Tuple[str, ...] = () - default_arg_rev: Optional[str] = None - - @classmethod - def should_add_vcs_url_prefix(cls, remote_url: str) -> bool: - """ - Return whether the vcs prefix (e.g. "git+") should be added to a - repository's remote url when used in a requirement. - """ - return not remote_url.lower().startswith(f"{cls.name}:") - - @classmethod - def get_subdirectory(cls, location: str) -> Optional[str]: - """ - Return the path to Python project root, relative to the repo root. - Return None if the project root is in the repo root. - """ - return None - - @classmethod - def get_requirement_revision(cls, repo_dir: str) -> str: - """ - Return the revision string that should be used in a requirement. - """ - return cls.get_revision(repo_dir) - - @classmethod - def get_src_requirement(cls, repo_dir: str, project_name: str) -> str: - """ - Return the requirement string to use to redownload the files - currently at the given repository directory. - - Args: - project_name: the (unescaped) project name. - - The return value has a form similar to the following: - - {repository_url}@{revision}#egg={project_name} - """ - repo_url = cls.get_remote_url(repo_dir) - - if cls.should_add_vcs_url_prefix(repo_url): - repo_url = f"{cls.name}+{repo_url}" - - revision = cls.get_requirement_revision(repo_dir) - subdir = cls.get_subdirectory(repo_dir) - req = make_vcs_requirement_url(repo_url, revision, project_name, subdir=subdir) - - return req - - @staticmethod - def get_base_rev_args(rev: str) -> List[str]: - """ - Return the base revision arguments for a vcs command. - - Args: - rev: the name of a revision to install. Cannot be None. - """ - raise NotImplementedError - - def is_immutable_rev_checkout(self, url: str, dest: str) -> bool: - """ - Return true if the commit hash checked out at dest matches - the revision in url. - - Always return False, if the VCS does not support immutable commit - hashes. - - This method does not check if there are local uncommitted changes - in dest after checkout, as pip currently has no use case for that. - """ - return False - - @classmethod - def make_rev_options( - cls, rev: Optional[str] = None, extra_args: Optional[CommandArgs] = None - ) -> RevOptions: - """ - Return a RevOptions object. - - Args: - rev: the name of a revision to install. - extra_args: a list of extra options. - """ - return RevOptions(cls, rev, extra_args=extra_args) - - @classmethod - def _is_local_repository(cls, repo: str) -> bool: - """ - posix absolute paths start with os.path.sep, - win32 ones start with drive (like c:\\folder) - """ - drive, tail = os.path.splitdrive(repo) - return repo.startswith(os.path.sep) or bool(drive) - - @classmethod - def get_netloc_and_auth( - cls, netloc: str, scheme: str - ) -> Tuple[str, Tuple[Optional[str], Optional[str]]]: - """ - Parse the repository URL's netloc, and return the new netloc to use - along with auth information. - - Args: - netloc: the original repository URL netloc. - scheme: the repository URL's scheme without the vcs prefix. - - This is mainly for the Subversion class to override, so that auth - information can be provided via the --username and --password options - instead of through the URL. For other subclasses like Git without - such an option, auth information must stay in the URL. - - Returns: (netloc, (username, password)). - """ - return netloc, (None, None) - - @classmethod - def get_url_rev_and_auth(cls, url: str) -> Tuple[str, Optional[str], AuthInfo]: - """ - Parse the repository URL to use, and return the URL, revision, - and auth info to use. - - Returns: (url, rev, (username, password)). - """ - scheme, netloc, path, query, frag = urllib.parse.urlsplit(url) - if "+" not in scheme: - raise ValueError( - f"Sorry, {url!r} is a malformed VCS url. " - "The format is <vcs>+<protocol>://<url>, " - "e.g. svn+http://myrepo/svn/MyApp#egg=MyApp" - ) - # Remove the vcs prefix. - scheme = scheme.split("+", 1)[1] - netloc, user_pass = cls.get_netloc_and_auth(netloc, scheme) - rev = None - if "@" in path: - path, rev = path.rsplit("@", 1) - if not rev: - raise InstallationError( - f"The URL {url!r} has an empty revision (after @) " - "which is not supported. Include a revision after @ " - "or remove @ from the URL." - ) - url = urllib.parse.urlunsplit((scheme, netloc, path, query, "")) - return url, rev, user_pass - - @staticmethod - def make_rev_args( - username: Optional[str], password: Optional[HiddenText] - ) -> CommandArgs: - """ - Return the RevOptions "extra arguments" to use in obtain(). - """ - return [] - - def get_url_rev_options(self, url: HiddenText) -> Tuple[HiddenText, RevOptions]: - """ - Return the URL and RevOptions object to use in obtain(), - as a tuple (url, rev_options). - """ - secret_url, rev, user_pass = self.get_url_rev_and_auth(url.secret) - username, secret_password = user_pass - password: Optional[HiddenText] = None - if secret_password is not None: - password = hide_value(secret_password) - extra_args = self.make_rev_args(username, password) - rev_options = self.make_rev_options(rev, extra_args=extra_args) - - return hide_url(secret_url), rev_options - - @staticmethod - def normalize_url(url: str) -> str: - """ - Normalize a URL for comparison by unquoting it and removing any - trailing slash. - """ - return urllib.parse.unquote(url).rstrip("/") - - @classmethod - def compare_urls(cls, url1: str, url2: str) -> bool: - """ - Compare two repo URLs for identity, ignoring incidental differences. - """ - return cls.normalize_url(url1) == cls.normalize_url(url2) - - def fetch_new( - self, dest: str, url: HiddenText, rev_options: RevOptions, verbosity: int - ) -> None: - """ - Fetch a revision from a repository, in the case that this is the - first fetch from the repository. - - Args: - dest: the directory to fetch the repository to. - rev_options: a RevOptions object. - verbosity: verbosity level. - """ - raise NotImplementedError - - def switch(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: - """ - Switch the repo at ``dest`` to point to ``URL``. - - Args: - rev_options: a RevOptions object. - """ - raise NotImplementedError - - def update(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: - """ - Update an already-existing repo to the given ``rev_options``. - - Args: - rev_options: a RevOptions object. - """ - raise NotImplementedError - - @classmethod - def is_commit_id_equal(cls, dest: str, name: Optional[str]) -> bool: - """ - Return whether the id of the current commit equals the given name. - - Args: - dest: the repository directory. - name: a string name. - """ - raise NotImplementedError - - def obtain(self, dest: str, url: HiddenText, verbosity: int) -> None: - """ - Install or update in editable mode the package represented by this - VersionControl object. - - :param dest: the repository directory in which to install or update. - :param url: the repository URL starting with a vcs prefix. - :param verbosity: verbosity level. - """ - url, rev_options = self.get_url_rev_options(url) - - if not os.path.exists(dest): - self.fetch_new(dest, url, rev_options, verbosity=verbosity) - return - - rev_display = rev_options.to_display() - if self.is_repository_directory(dest): - existing_url = self.get_remote_url(dest) - if self.compare_urls(existing_url, url.secret): - logger.debug( - "%s in %s exists, and has correct URL (%s)", - self.repo_name.title(), - display_path(dest), - url, - ) - if not self.is_commit_id_equal(dest, rev_options.rev): - logger.info( - "Updating %s %s%s", - display_path(dest), - self.repo_name, - rev_display, - ) - self.update(dest, url, rev_options) - else: - logger.info("Skipping because already up-to-date.") - return - - logger.warning( - "%s %s in %s exists with URL %s", - self.name, - self.repo_name, - display_path(dest), - existing_url, - ) - prompt = ("(s)witch, (i)gnore, (w)ipe, (b)ackup ", ("s", "i", "w", "b")) - else: - logger.warning( - "Directory %s already exists, and is not a %s %s.", - dest, - self.name, - self.repo_name, - ) - # https://github.com/python/mypy/issues/1174 - prompt = ("(i)gnore, (w)ipe, (b)ackup ", ("i", "w", "b")) # type: ignore - - logger.warning( - "The plan is to install the %s repository %s", - self.name, - url, - ) - response = ask_path_exists(f"What to do? {prompt[0]}", prompt[1]) - - if response == "a": - sys.exit(-1) - - if response == "w": - logger.warning("Deleting %s", display_path(dest)) - rmtree(dest) - self.fetch_new(dest, url, rev_options, verbosity=verbosity) - return - - if response == "b": - dest_dir = backup_dir(dest) - logger.warning("Backing up %s to %s", display_path(dest), dest_dir) - shutil.move(dest, dest_dir) - self.fetch_new(dest, url, rev_options, verbosity=verbosity) - return - - # Do nothing if the response is "i". - if response == "s": - logger.info( - "Switching %s %s to %s%s", - self.repo_name, - display_path(dest), - url, - rev_display, - ) - self.switch(dest, url, rev_options) - - def unpack(self, location: str, url: HiddenText, verbosity: int) -> None: - """ - Clean up current location and download the url repository - (and vcs infos) into location - - :param url: the repository URL starting with a vcs prefix. - :param verbosity: verbosity level. - """ - if os.path.exists(location): - rmtree(location) - self.obtain(location, url=url, verbosity=verbosity) - - @classmethod - def get_remote_url(cls, location: str) -> str: - """ - Return the url used at location - - Raises RemoteNotFoundError if the repository does not have a remote - url configured. - """ - raise NotImplementedError - - @classmethod - def get_revision(cls, location: str) -> str: - """ - Return the current commit id of the files at the given location. - """ - raise NotImplementedError - - @classmethod - def run_command( - cls, - cmd: Union[List[str], CommandArgs], - show_stdout: bool = True, - cwd: Optional[str] = None, - on_returncode: 'Literal["raise", "warn", "ignore"]' = "raise", - extra_ok_returncodes: Optional[Iterable[int]] = None, - command_desc: Optional[str] = None, - extra_environ: Optional[Mapping[str, Any]] = None, - spinner: Optional[SpinnerInterface] = None, - log_failed_cmd: bool = True, - stdout_only: bool = False, - ) -> str: - """ - Run a VCS subcommand - This is simply a wrapper around call_subprocess that adds the VCS - command name, and checks that the VCS is available - """ - cmd = make_command(cls.name, *cmd) - if command_desc is None: - command_desc = format_command_args(cmd) - try: - return call_subprocess( - cmd, - show_stdout, - cwd, - on_returncode=on_returncode, - extra_ok_returncodes=extra_ok_returncodes, - command_desc=command_desc, - extra_environ=extra_environ, - unset_environ=cls.unset_environ, - spinner=spinner, - log_failed_cmd=log_failed_cmd, - stdout_only=stdout_only, - ) - except FileNotFoundError: - # errno.ENOENT = no such file or directory - # In other words, the VCS executable isn't available - raise BadCommand( - f"Cannot find command {cls.name!r} - do you have " - f"{cls.name!r} installed and in your PATH?" - ) - except PermissionError: - # errno.EACCES = Permission denied - # This error occurs, for instance, when the command is installed - # only for another user. So, the current user don't have - # permission to call the other user command. - raise BadCommand( - f"No permission to execute {cls.name!r} - install it " - f"locally, globally (ask admin), or check your PATH. " - f"See possible solutions at " - f"https://pip.pypa.io/en/latest/reference/pip_freeze/" - f"#fixing-permission-denied." - ) - - @classmethod - def is_repository_directory(cls, path: str) -> bool: - """ - Return whether a directory path is a repository directory. - """ - logger.debug("Checking in %s for %s (%s)...", path, cls.dirname, cls.name) - return os.path.exists(os.path.join(path, cls.dirname)) - - @classmethod - def get_repository_root(cls, location: str) -> Optional[str]: - """ - Return the "root" (top-level) directory controlled by the vcs, - or `None` if the directory is not in any. - - It is meant to be overridden to implement smarter detection - mechanisms for specific vcs. - - This can do more than is_repository_directory() alone. For - example, the Git override checks that Git is actually available. - """ - if cls.is_repository_directory(location): - return location - return None diff --git a/venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py b/venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py deleted file mode 100644 index b1debe3..0000000 --- a/venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py +++ /dev/null @@ -1,354 +0,0 @@ -"""Orchestrator for building wheels from InstallRequirements. -""" - -import logging -import os.path -import re -import shutil -from typing import Iterable, List, Optional, Tuple - -from pip._vendor.packaging.utils import canonicalize_name, canonicalize_version -from pip._vendor.packaging.version import InvalidVersion, Version - -from pip._internal.cache import WheelCache -from pip._internal.exceptions import InvalidWheelFilename, UnsupportedWheel -from pip._internal.metadata import FilesystemWheel, get_wheel_distribution -from pip._internal.models.link import Link -from pip._internal.models.wheel import Wheel -from pip._internal.operations.build.wheel import build_wheel_pep517 -from pip._internal.operations.build.wheel_editable import build_wheel_editable -from pip._internal.operations.build.wheel_legacy import build_wheel_legacy -from pip._internal.req.req_install import InstallRequirement -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import ensure_dir, hash_file -from pip._internal.utils.setuptools_build import make_setuptools_clean_args -from pip._internal.utils.subprocess import call_subprocess -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.utils.urls import path_to_url -from pip._internal.vcs import vcs - -logger = logging.getLogger(__name__) - -_egg_info_re = re.compile(r"([a-z0-9_.]+)-([a-z0-9_.!+-]+)", re.IGNORECASE) - -BuildResult = Tuple[List[InstallRequirement], List[InstallRequirement]] - - -def _contains_egg_info(s: str) -> bool: - """Determine whether the string looks like an egg_info. - - :param s: The string to parse. E.g. foo-2.1 - """ - return bool(_egg_info_re.search(s)) - - -def _should_build( - req: InstallRequirement, - need_wheel: bool, -) -> bool: - """Return whether an InstallRequirement should be built into a wheel.""" - if req.constraint: - # never build requirements that are merely constraints - return False - if req.is_wheel: - if need_wheel: - logger.info( - "Skipping %s, due to already being wheel.", - req.name, - ) - return False - - if need_wheel: - # i.e. pip wheel, not pip install - return True - - # From this point, this concerns the pip install command only - # (need_wheel=False). - - if not req.source_dir: - return False - - if req.editable: - # we only build PEP 660 editable requirements - return req.supports_pyproject_editable() - - return True - - -def should_build_for_wheel_command( - req: InstallRequirement, -) -> bool: - return _should_build(req, need_wheel=True) - - -def should_build_for_install_command( - req: InstallRequirement, -) -> bool: - return _should_build(req, need_wheel=False) - - -def _should_cache( - req: InstallRequirement, -) -> Optional[bool]: - """ - Return whether a built InstallRequirement can be stored in the persistent - wheel cache, assuming the wheel cache is available, and _should_build() - has determined a wheel needs to be built. - """ - if req.editable or not req.source_dir: - # never cache editable requirements - return False - - if req.link and req.link.is_vcs: - # VCS checkout. Do not cache - # unless it points to an immutable commit hash. - assert not req.editable - assert req.source_dir - vcs_backend = vcs.get_backend_for_scheme(req.link.scheme) - assert vcs_backend - if vcs_backend.is_immutable_rev_checkout(req.link.url, req.source_dir): - return True - return False - - assert req.link - base, ext = req.link.splitext() - if _contains_egg_info(base): - return True - - # Otherwise, do not cache. - return False - - -def _get_cache_dir( - req: InstallRequirement, - wheel_cache: WheelCache, -) -> str: - """Return the persistent or temporary cache directory where the built - wheel need to be stored. - """ - cache_available = bool(wheel_cache.cache_dir) - assert req.link - if cache_available and _should_cache(req): - cache_dir = wheel_cache.get_path_for_link(req.link) - else: - cache_dir = wheel_cache.get_ephem_path_for_link(req.link) - return cache_dir - - -def _verify_one(req: InstallRequirement, wheel_path: str) -> None: - canonical_name = canonicalize_name(req.name or "") - w = Wheel(os.path.basename(wheel_path)) - if canonicalize_name(w.name) != canonical_name: - raise InvalidWheelFilename( - f"Wheel has unexpected file name: expected {canonical_name!r}, " - f"got {w.name!r}", - ) - dist = get_wheel_distribution(FilesystemWheel(wheel_path), canonical_name) - dist_verstr = str(dist.version) - if canonicalize_version(dist_verstr) != canonicalize_version(w.version): - raise InvalidWheelFilename( - f"Wheel has unexpected file name: expected {dist_verstr!r}, " - f"got {w.version!r}", - ) - metadata_version_value = dist.metadata_version - if metadata_version_value is None: - raise UnsupportedWheel("Missing Metadata-Version") - try: - metadata_version = Version(metadata_version_value) - except InvalidVersion: - msg = f"Invalid Metadata-Version: {metadata_version_value}" - raise UnsupportedWheel(msg) - if metadata_version >= Version("1.2") and not isinstance(dist.version, Version): - raise UnsupportedWheel( - f"Metadata 1.2 mandates PEP 440 version, but {dist_verstr!r} is not" - ) - - -def _build_one( - req: InstallRequirement, - output_dir: str, - verify: bool, - build_options: List[str], - global_options: List[str], - editable: bool, -) -> Optional[str]: - """Build one wheel. - - :return: The filename of the built wheel, or None if the build failed. - """ - artifact = "editable" if editable else "wheel" - try: - ensure_dir(output_dir) - except OSError as e: - logger.warning( - "Building %s for %s failed: %s", - artifact, - req.name, - e, - ) - return None - - # Install build deps into temporary directory (PEP 518) - with req.build_env: - wheel_path = _build_one_inside_env( - req, output_dir, build_options, global_options, editable - ) - if wheel_path and verify: - try: - _verify_one(req, wheel_path) - except (InvalidWheelFilename, UnsupportedWheel) as e: - logger.warning("Built %s for %s is invalid: %s", artifact, req.name, e) - return None - return wheel_path - - -def _build_one_inside_env( - req: InstallRequirement, - output_dir: str, - build_options: List[str], - global_options: List[str], - editable: bool, -) -> Optional[str]: - with TempDirectory(kind="wheel") as temp_dir: - assert req.name - if req.use_pep517: - assert req.metadata_directory - assert req.pep517_backend - if global_options: - logger.warning( - "Ignoring --global-option when building %s using PEP 517", req.name - ) - if build_options: - logger.warning( - "Ignoring --build-option when building %s using PEP 517", req.name - ) - if editable: - wheel_path = build_wheel_editable( - name=req.name, - backend=req.pep517_backend, - metadata_directory=req.metadata_directory, - tempd=temp_dir.path, - ) - else: - wheel_path = build_wheel_pep517( - name=req.name, - backend=req.pep517_backend, - metadata_directory=req.metadata_directory, - tempd=temp_dir.path, - ) - else: - wheel_path = build_wheel_legacy( - name=req.name, - setup_py_path=req.setup_py_path, - source_dir=req.unpacked_source_directory, - global_options=global_options, - build_options=build_options, - tempd=temp_dir.path, - ) - - if wheel_path is not None: - wheel_name = os.path.basename(wheel_path) - dest_path = os.path.join(output_dir, wheel_name) - try: - wheel_hash, length = hash_file(wheel_path) - shutil.move(wheel_path, dest_path) - logger.info( - "Created wheel for %s: filename=%s size=%d sha256=%s", - req.name, - wheel_name, - length, - wheel_hash.hexdigest(), - ) - logger.info("Stored in directory: %s", output_dir) - return dest_path - except Exception as e: - logger.warning( - "Building wheel for %s failed: %s", - req.name, - e, - ) - # Ignore return, we can't do anything else useful. - if not req.use_pep517: - _clean_one_legacy(req, global_options) - return None - - -def _clean_one_legacy(req: InstallRequirement, global_options: List[str]) -> bool: - clean_args = make_setuptools_clean_args( - req.setup_py_path, - global_options=global_options, - ) - - logger.info("Running setup.py clean for %s", req.name) - try: - call_subprocess( - clean_args, command_desc="python setup.py clean", cwd=req.source_dir - ) - return True - except Exception: - logger.error("Failed cleaning build dir for %s", req.name) - return False - - -def build( - requirements: Iterable[InstallRequirement], - wheel_cache: WheelCache, - verify: bool, - build_options: List[str], - global_options: List[str], -) -> BuildResult: - """Build wheels. - - :return: The list of InstallRequirement that succeeded to build and - the list of InstallRequirement that failed to build. - """ - if not requirements: - return [], [] - - # Build the wheels. - logger.info( - "Building wheels for collected packages: %s", - ", ".join(req.name for req in requirements), # type: ignore - ) - - with indent_log(): - build_successes, build_failures = [], [] - for req in requirements: - assert req.name - cache_dir = _get_cache_dir(req, wheel_cache) - wheel_file = _build_one( - req, - cache_dir, - verify, - build_options, - global_options, - req.editable and req.permit_editable_wheels, - ) - if wheel_file: - # Record the download origin in the cache - if req.download_info is not None: - # download_info is guaranteed to be set because when we build an - # InstallRequirement it has been through the preparer before, but - # let's be cautious. - wheel_cache.record_download_origin(cache_dir, req.download_info) - # Update the link for this. - req.link = Link(path_to_url(wheel_file)) - req.local_file_path = req.link.file_path - assert req.link.is_wheel - build_successes.append(req) - else: - build_failures.append(req) - - # notify success/failure - if build_successes: - logger.info( - "Successfully built %s", - " ".join([req.name for req in build_successes]), # type: ignore - ) - if build_failures: - logger.info( - "Failed to build %s", - " ".join([req.name for req in build_failures]), # type: ignore - ) - # Return a list of requirements that failed to build - return build_successes, build_failures diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/__init__.py deleted file mode 100644 index c1884ba..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/__init__.py +++ /dev/null @@ -1,121 +0,0 @@ -""" -pip._vendor is for vendoring dependencies of pip to prevent needing pip to -depend on something external. - -Files inside of pip._vendor should be considered immutable and should only be -updated to versions from upstream. -""" -from __future__ import absolute_import - -import glob -import os.path -import sys - -# Downstream redistributors which have debundled our dependencies should also -# patch this value to be true. This will trigger the additional patching -# to cause things like "six" to be available as pip. -DEBUNDLED = False - -# By default, look in this directory for a bunch of .whl files which we will -# add to the beginning of sys.path before attempting to import anything. This -# is done to support downstream re-distributors like Debian and Fedora who -# wish to create their own Wheels for our dependencies to aid in debundling. -WHEEL_DIR = os.path.abspath(os.path.dirname(__file__)) - - -# Define a small helper function to alias our vendored modules to the real ones -# if the vendored ones do not exist. This idea of this was taken from -# https://github.com/kennethreitz/requests/pull/2567. -def vendored(modulename): - vendored_name = "{0}.{1}".format(__name__, modulename) - - try: - __import__(modulename, globals(), locals(), level=0) - except ImportError: - # We can just silently allow import failures to pass here. If we - # got to this point it means that ``import pip._vendor.whatever`` - # failed and so did ``import whatever``. Since we're importing this - # upfront in an attempt to alias imports, not erroring here will - # just mean we get a regular import error whenever pip *actually* - # tries to import one of these modules to use it, which actually - # gives us a better error message than we would have otherwise - # gotten. - pass - else: - sys.modules[vendored_name] = sys.modules[modulename] - base, head = vendored_name.rsplit(".", 1) - setattr(sys.modules[base], head, sys.modules[modulename]) - - -# If we're operating in a debundled setup, then we want to go ahead and trigger -# the aliasing of our vendored libraries as well as looking for wheels to add -# to our sys.path. This will cause all of this code to be a no-op typically -# however downstream redistributors can enable it in a consistent way across -# all platforms. -if DEBUNDLED: - # Actually look inside of WHEEL_DIR to find .whl files and add them to the - # front of our sys.path. - sys.path[:] = glob.glob(os.path.join(WHEEL_DIR, "*.whl")) + sys.path - - # Actually alias all of our vendored dependencies. - vendored("cachecontrol") - vendored("certifi") - vendored("colorama") - vendored("distlib") - vendored("distro") - vendored("six") - vendored("six.moves") - vendored("six.moves.urllib") - vendored("six.moves.urllib.parse") - vendored("packaging") - vendored("packaging.version") - vendored("packaging.specifiers") - vendored("pep517") - vendored("pkg_resources") - vendored("platformdirs") - vendored("progress") - vendored("requests") - vendored("requests.exceptions") - vendored("requests.packages") - vendored("requests.packages.urllib3") - vendored("requests.packages.urllib3._collections") - vendored("requests.packages.urllib3.connection") - vendored("requests.packages.urllib3.connectionpool") - vendored("requests.packages.urllib3.contrib") - vendored("requests.packages.urllib3.contrib.ntlmpool") - vendored("requests.packages.urllib3.contrib.pyopenssl") - vendored("requests.packages.urllib3.exceptions") - vendored("requests.packages.urllib3.fields") - vendored("requests.packages.urllib3.filepost") - vendored("requests.packages.urllib3.packages") - vendored("requests.packages.urllib3.packages.ordered_dict") - vendored("requests.packages.urllib3.packages.six") - vendored("requests.packages.urllib3.packages.ssl_match_hostname") - vendored("requests.packages.urllib3.packages.ssl_match_hostname." - "_implementation") - vendored("requests.packages.urllib3.poolmanager") - vendored("requests.packages.urllib3.request") - vendored("requests.packages.urllib3.response") - vendored("requests.packages.urllib3.util") - vendored("requests.packages.urllib3.util.connection") - vendored("requests.packages.urllib3.util.request") - vendored("requests.packages.urllib3.util.response") - vendored("requests.packages.urllib3.util.retry") - vendored("requests.packages.urllib3.util.ssl_") - vendored("requests.packages.urllib3.util.timeout") - vendored("requests.packages.urllib3.util.url") - vendored("resolvelib") - vendored("rich") - vendored("rich.console") - vendored("rich.highlighter") - vendored("rich.logging") - vendored("rich.markup") - vendored("rich.progress") - vendored("rich.segment") - vendored("rich.style") - vendored("rich.text") - vendored("rich.traceback") - vendored("tenacity") - vendored("tomli") - vendored("truststore") - vendored("urllib3") diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 7003cd354c7be6beb51a0a859c3a2bd691386254..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4713 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 K`q1N$lm7+$k@e32 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/six.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/six.cpython-312.pyc deleted file mode 100644 index b5c93ad4853aaeff7c480064764d74429f7efb7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41290 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 QCUPqr7wavb)S2M^e>Ci6-v9sr diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-312.pyc deleted file mode 100644 index 6c3984dd9a8d2bd4a99ddd3986100f51b5e671b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 122070 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%0D9Yz^=rp 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 Xi0|%c>vwZBKF<5@d9D8)qT%>Ie79e? diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__init__.py deleted file mode 100644 index 4d20bc9..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__init__.py +++ /dev/null @@ -1,28 +0,0 @@ -# SPDX-FileCopyrightText: 2015 Eric Larson -# -# SPDX-License-Identifier: Apache-2.0 - -"""CacheControl import Interface. - -Make it easy to import from cachecontrol without long namespaces. -""" -__author__ = "Eric Larson" -__email__ = "eric@ionrock.org" -__version__ = "0.13.1" - -from pip._vendor.cachecontrol.adapter import CacheControlAdapter -from pip._vendor.cachecontrol.controller import CacheController -from pip._vendor.cachecontrol.wrapper import CacheControl - -__all__ = [ - "__author__", - "__email__", - "__version__", - "CacheControlAdapter", - "CacheController", - "CacheControl", -] - -import logging - -logging.getLogger(__name__).addHandler(logging.NullHandler()) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index a7560e00d2f995b3a8efad16d022c0b3c63d5480..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 923 zcmaJ<&1=*^6rb6zY?9WtDn%%kfY5ahO{|_QRV!6csJ#lg4Aaaso9-kNCbM04z3iXh z&6|jLQ2M8Mu@q?u6a?|$t=d~pzHE2tUUUv`e(%lu_`Ub$%k;E`-~{hpw?38-`cWw3 zQyGD?PXOK`hJ3`Zk6Fntv9e!g6;>6MxawCi0$dZd*zk=ZHbgx(eG{V)vHAz>TkviQ z+qX-I+q*Z$1ukzsy^k-n-J6%zF&aiKj<w5se+0*|81>Ai)!*KrL5pw5L@OzrC{Cr) z&htcbwL=5$TGk8N=1!y?PP3k)<=ACM$=C^s*kBafjdV+Pv?F8^Ith(=mO_Tiwfgo` z6$Q>FRhdlsvmBK5NG3`KZC9$WU%TV3+;dlc6$G0&zc$I}F{3GP0rSkHSqx26lcr`Z zw+NvfAfX7!O+t7~BLUDRWRI&1N)n>VP(&5WQdJOJ&Dq=_gvkJ&YK7G(L>)x#q*3ZZ zWWuC!Cp&fN1*u`K{MJ9+MuP#a!-D@w*i|%5!L6WF@S&pMZ3r2LQ4;26$n_>*uJSq| z#c1KxqKrMG34`>xz10z7q<ltakOiH;@>(+HUQBhi=RJ`@C+3OHJk13U6^)lO9R+Q! zmYM7(LQ=++2fgljBHH%S9!xQTo!s@ZNb_Y_WSfRO^PpF6G!k!eBpxAA5@|x*w0B-# zizVv_{!q;Wk>aanFF~A^F~+~GGOnD~(UpaPbv(5=Fpsay5A2_4{RBNaLHGYu47)Ti x&aNUn^Bv6%j3YF6fac!ZK12&gXz2hgeQm71?;bT)4;rh7jkRy+fw~U4{{qC<4Q2oU diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-312.pyc deleted file mode 100644 index 2f92e2780c3e3b774ef0af1a70300aa9a75d7341..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2667 zcmaJ@O>7fK6rS~t?Ty!V9FjmNNiaBt_z+tZ)FRrZr7<Ms$Djh0YE@coy;J|N>vd;0 zL3R_#NK{a9C`gsUp{n47Dmc(fd+n)G)eCNdoURh773I)dq|ghez8UYvhK7#3GjHC! zdHeQ#@5jGJA|V7L|Ly0+Ujhg{W*cw#+Jvz20}zWyLz<u?L&ymNqkXzB=Yv($MFZzB z=V9G%1abjR`}Lq9<s?oA^d2LW3voKA%SJdC=Cq_ojA$+@AQGTq(A5LFdUL(}ECgq< zTny-#CSSq1KCMp+!@5n|rbS@w2YwXR0WzrdUK~e=N<Kse?zz?rsOGErlKp?PeNu2_ zwNf!{)h?M8D+~MRQCgTaNX0&@Qj1XFM9zP7_Lwp?b8PD5``Kw=NR)gwODx+0x_?T| z7s-@av8kya)zqrZ@APC!d7B@BOh7jag*H2@8pNuqc>?U-?yEYXdDlX|h%mz=Y<vU6 zBC-YVu<Ux@+q2ci-mVN-y*Tc<cLikoy|c39QJvNE&_egycocMG7&VVN8f)OfY%)N5 zfbU2au}_gXqB}wM#idHY@n?>`cVXIzoU<uWjTyC~!G}5_RnuG={17a**%q@i{>)An zO@pKj)wbr+88gqpu+lcsNr9@ygk_iV7YUuv%u5yBR5e1=bEGnt)=QtHt2Mi5Rt}~P zyq2~~HkklVUsMakN>@wOv;tz9Nz-|TSiX%|TFDz)s#<d*VEb%UaqXr9V9IuQtQ1TQ zw2DJl&s;w9_4MNDo2QrY-qq+}E1GCV6HC!o8`E&w!h=mbc%$$Lk8Z#X^c<E96OQH2 zKy+hiGnD!8e6I-*?dZPmo{K18(ZOshY~A|{!n{ysAiOX%5zzAT6}?0TKPQ9ATVXCJ zn{S^N&Y`3~dp;>TGWVrIY_(uHAxM{!s+a13a8HrU(h`HJ9xU2+^+-Bhml$CIl?>7# z*hyIoQl{1ko+Fk88R+;8bGBkTAr~GNEV1@GI-I1>399W(bFc*$E%t%&IPGVu<N~o3 z#szgW4xC|ltPf!V7^8burM~O(?SThlKaD*VeZ7Ik^wR(e547Z6O?lUnJkrRlVCm|K z%O|eYZtVx8y<Pp*8_PKH$8e%GoN5lI8kuFhb4BiLoTP)G`Z>56bR6!Ff#`<Y19<^b zsJsb12)P5m_uUt};6mk1@I4uXJS_kM&N|{O)$2p&izI&GgHv(ajN7yphkS~2uR(U< zBGIc!kus~CFeIL$x&_V&RauE+dsfK;d`H_^*!HEwe94aKez*;#6j>86fg>ZkmLemK z<0~xkcQo;iTmFY*lMnHZW&F;H+}DzaoAU6IJo*ri{*QkqA>p_7&wmqx2ly7=08efP zCYa_9uRtyM?9HU`{3ft8*doLi#CfqC@icVSd0#o&*?AOjV;<dEyRZ|>EF51LTkG<y zrD2-|6Cax3aiL+MF21jupA@t8;1sK8+MaqOYuattwfK?oq|8C%Dd30zB;5;&d10d? zKsnKNUQy^r(E5lIbi0}(QuUI1swp1RU!|prox~32@vxg|!0awpX0hms!)V71Hq=su z9snLIpH>Yfh#9&6`jJLvRo;I6?M7xDvM%=3;V%#0$Sls>oZ*=Vndskk<;=Q-dLk`p zq$!Q8i^x9+qW-}aPBd}icINJ>JEtCu{W$*p_%ePIPNbn$a9=aH@3wt+{?7bz@X)Fh zxmJ244gCeH`ABNVpCc&>vq@2)cmybvdRlRC)~t}Ej~)c`>M^gUr`%HH9#9r3$?Z-^ zQ9hl8YeZ2fOI^xh!jZrk?X=<P6|ien=z5gJsUt(rNx40zUFG6koD}!IThvl+Ipbx~ z8GWf3zr)L>lX$sMyR$**<XxG60F{}^tf}#MXh#OahdHJK|49_(JH#`U1NcmO%P_TB zolMe65Mq7VIt$afC<wwo5)u-RQFIL@)=>Nj`@Oq{4y~cr{}f|uc<&QDwGj}7-5cQ^ gA+|BZsR3d4dJ5t2wfb-3&fl^0#c@Cuzrx@6FBpnaZvX%Q diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc deleted file mode 100644 index a4e547962d468b48e867caa71fa83df9d16a5ade..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6485 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 P2+xJ@y#A74&8GQ3r*Z*v diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-312.pyc deleted file mode 100644 index 14d38126c15c9fff766fbccfef576e591f25760a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3830 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 C&Mo`^ diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-312.pyc deleted file mode 100644 index 47d1fcf35673f9263d2fc2dd84c0064c3bbfcd69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16188 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-312.pyc deleted file mode 100644 index a68a049fa9b126e374d82834ad45dafc3ce7213e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4368 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-312.pyc deleted file mode 100644 index ca1d35091470583eb57075d02269e9573979a79f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6715 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-312.pyc deleted file mode 100644 index 136ca7f8b006ca594eb6112ff1fc1cf74eb8b525..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6426 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 J;l<YC{{V}dfnERr diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-312.pyc deleted file mode 100644 index dafa09189e5f1104b999a1c476c2f38f8345d7f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1695 zcmaJ>&2QsG6rYJ5$8qZBqoLbv%Wk(VECw0_TcE61#FDM{qas4;UT}pX*B+X%{s=RZ zmIhY}5)vToy%h(}pmO5h;D&lImMSe;tybJDb-DD!jFYq}P$tUw_ul)>^PBhKUsY8B zY*{~i+4wFEz+)~9me2$6=obcdfemcv02dk%a-4Efu3!kRXo!g{IB8chqy&pj#+3~j z0wmx|jGK0{u3{*OO=7m3kxOvK8F5uZO|a~Yx_Kj?;H*<{i$)QG?3tfEa#sE?$yV*$ z*J-1)t!Sfv@(XA%%9)<$Q<FA*k7%h#z5nq?%k}D=<?71a+U-cG`i_GvZe`rDs%bS) z)%Pg&otw7Vq6jl}_EyuPiHQj^MxVD4p@bVgFbNtM^23Ln<e<v!cTgKQ32j>JfU=5k z({!30glm@EOL4Mu%u)`IzGq+;1hA`6II!>cfd>P)0|V&`NLZ?AYGB`yQXr557^DIr z5QB7(`5Ep@J?oAffX`TQ|GDf`An*4*KyVI6ILlcDnpo4)QO@FNsv~M{kVqjXSBkQY z!Cj+*)ypDFMBQ>sLZV`F%3OC)-9@zF+oY3eP};h#>m8W`!jLB53=0+W=%cjjw>_$5 zBatBHAe}hCquie7TY+yy&Q#4_v3jq<C9cc#btKEAnZY{V(i^^ubl0S0Q@`a~Z5Mfz z=oC3<1DoywuhavC7i@pab9~cASl>k6rtUP?_0~3v+q+hI{SBQoDOzZm)&p|`5xv!H z>2*f4eXJ)@_HVCmVYAgjxYF8=Myf;2g)g$8%Ir_p*wzJc8BAZ<yYcYu!<8RVcR4Iy z`K`Qk@WN8}!{0}zLRk&Vm&38=!_riEQ41$ud8TIaQulUT0O{;E_rALK?e^Z)193JK z<wWZ2y?r3gJ<8>~D@V*d&@#3AHNLbG<}W=i44SyI$}-EEA3w*`ox({!&jd3y-$O~V zBXQmLoh0R*;%Ng9D7*@t@|jK_n0ReE({#Iq)`l<7dg7A-Wt>xH{zd5z-wBOZv@?D> ztZRgx_=qHoXd8QYijlOjNU7I9Z8HU`*D?Q$MG|x0^fs`_1k7h4nqdX2^b1xQE?A}C zG`$AAbS^D9leB7-8zNyo$Cx)<G&iI^`-;=a!2J9BKg^SHA~?sHv*-Fe9l{YF0q?G# z0G{M{f^En0yRL7y9rPZ)%0&KUA-img1qk6^GJtbW!K+We`-foh520`<&OZ^C4#n!B zc=J%a5i8*GTsScu&c77C_;UE>JK<Z`!`Bw$;ssa;mC0CO&qukbIL)511WMy^h9emi rXX7kK3MkCSIgUoag=?|O(I_Y{#(9nkV4{-vic3Hme>TQ+N#K72ZpYT* diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/_cmd.py b/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/_cmd.py deleted file mode 100644 index 2c84208..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/_cmd.py +++ /dev/null @@ -1,70 +0,0 @@ -# SPDX-FileCopyrightText: 2015 Eric Larson -# -# SPDX-License-Identifier: Apache-2.0 -from __future__ import annotations - -import logging -from argparse import ArgumentParser -from typing import TYPE_CHECKING - -from pip._vendor import requests - -from pip._vendor.cachecontrol.adapter import CacheControlAdapter -from pip._vendor.cachecontrol.cache import DictCache -from pip._vendor.cachecontrol.controller import logger - -if TYPE_CHECKING: - from argparse import Namespace - - from pip._vendor.cachecontrol.controller import CacheController - - -def setup_logging() -> None: - logger.setLevel(logging.DEBUG) - handler = logging.StreamHandler() - logger.addHandler(handler) - - -def get_session() -> requests.Session: - adapter = CacheControlAdapter( - DictCache(), cache_etags=True, serializer=None, heuristic=None - ) - sess = requests.Session() - sess.mount("http://", adapter) - sess.mount("https://", adapter) - - sess.cache_controller = adapter.controller # type: ignore[attr-defined] - return sess - - -def get_args() -> Namespace: - parser = ArgumentParser() - parser.add_argument("url", help="The URL to try and cache") - return parser.parse_args() - - -def main() -> None: - args = get_args() - sess = get_session() - - # Make a request to get a response - resp = sess.get(args.url) - - # Turn on logging - setup_logging() - - # try setting the cache - cache_controller: CacheController = ( - sess.cache_controller # type: ignore[attr-defined] - ) - cache_controller.cache_response(resp.request, resp.raw) - - # Now try to get it - if cache_controller.cached_request(resp.request): - print("Cached!") - else: - print("Not cached :(") - - -if __name__ == "__main__": - main() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py b/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py deleted file mode 100644 index 3e83e30..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py +++ /dev/null @@ -1,161 +0,0 @@ -# SPDX-FileCopyrightText: 2015 Eric Larson -# -# SPDX-License-Identifier: Apache-2.0 -from __future__ import annotations - -import functools -import types -import zlib -from typing import TYPE_CHECKING, Any, Collection, Mapping - -from pip._vendor.requests.adapters import HTTPAdapter - -from pip._vendor.cachecontrol.cache import DictCache -from pip._vendor.cachecontrol.controller import PERMANENT_REDIRECT_STATUSES, CacheController -from pip._vendor.cachecontrol.filewrapper import CallbackFileWrapper - -if TYPE_CHECKING: - from pip._vendor.requests import PreparedRequest, Response - from pip._vendor.urllib3 import HTTPResponse - - from pip._vendor.cachecontrol.cache import BaseCache - from pip._vendor.cachecontrol.heuristics import BaseHeuristic - from pip._vendor.cachecontrol.serialize import Serializer - - -class CacheControlAdapter(HTTPAdapter): - invalidating_methods = {"PUT", "PATCH", "DELETE"} - - def __init__( - self, - cache: BaseCache | None = None, - cache_etags: bool = True, - controller_class: type[CacheController] | None = None, - serializer: Serializer | None = None, - heuristic: BaseHeuristic | None = None, - cacheable_methods: Collection[str] | None = None, - *args: Any, - **kw: Any, - ) -> None: - super().__init__(*args, **kw) - self.cache = DictCache() if cache is None else cache - self.heuristic = heuristic - self.cacheable_methods = cacheable_methods or ("GET",) - - controller_factory = controller_class or CacheController - self.controller = controller_factory( - self.cache, cache_etags=cache_etags, serializer=serializer - ) - - def send( - self, - request: PreparedRequest, - stream: bool = False, - timeout: None | float | tuple[float, float] | tuple[float, None] = None, - verify: bool | str = True, - cert: (None | bytes | str | tuple[bytes | str, bytes | str]) = None, - proxies: Mapping[str, str] | None = None, - cacheable_methods: Collection[str] | None = None, - ) -> Response: - """ - Send a request. Use the request information to see if it - exists in the cache and cache the response if we need to and can. - """ - cacheable = cacheable_methods or self.cacheable_methods - if request.method in cacheable: - try: - cached_response = self.controller.cached_request(request) - except zlib.error: - cached_response = None - if cached_response: - return self.build_response(request, cached_response, from_cache=True) - - # check for etags and add headers if appropriate - request.headers.update(self.controller.conditional_headers(request)) - - resp = super().send(request, stream, timeout, verify, cert, proxies) - - return resp - - def build_response( - self, - request: PreparedRequest, - response: HTTPResponse, - from_cache: bool = False, - cacheable_methods: Collection[str] | None = None, - ) -> Response: - """ - Build a response by making a request or using the cache. - - This will end up calling send and returning a potentially - cached response - """ - cacheable = cacheable_methods or self.cacheable_methods - if not from_cache and request.method in cacheable: - # Check for any heuristics that might update headers - # before trying to cache. - if self.heuristic: - response = self.heuristic.apply(response) - - # apply any expiration heuristics - if response.status == 304: - # We must have sent an ETag request. This could mean - # that we've been expired already or that we simply - # have an etag. In either case, we want to try and - # update the cache if that is the case. - cached_response = self.controller.update_cached_response( - request, response - ) - - if cached_response is not response: - from_cache = True - - # We are done with the server response, read a - # possible response body (compliant servers will - # not return one, but we cannot be 100% sure) and - # release the connection back to the pool. - response.read(decode_content=False) - response.release_conn() - - response = cached_response - - # We always cache the 301 responses - elif int(response.status) in PERMANENT_REDIRECT_STATUSES: - self.controller.cache_response(request, response) - else: - # Wrap the response file with a wrapper that will cache the - # response when the stream has been consumed. - response._fp = CallbackFileWrapper( # type: ignore[attr-defined] - response._fp, # type: ignore[attr-defined] - functools.partial( - self.controller.cache_response, request, response - ), - ) - if response.chunked: - super_update_chunk_length = response._update_chunk_length # type: ignore[attr-defined] - - def _update_chunk_length(self: HTTPResponse) -> None: - super_update_chunk_length() - if self.chunk_left == 0: - self._fp._close() # type: ignore[attr-defined] - - response._update_chunk_length = types.MethodType( # type: ignore[attr-defined] - _update_chunk_length, response - ) - - resp: Response = super().build_response(request, response) # type: ignore[no-untyped-call] - - # See if we should invalidate the cache. - if request.method in self.invalidating_methods and resp.ok: - assert request.url is not None - cache_url = self.controller.cache_url(request.url) - self.cache.delete(cache_url) - - # Give the request a from_cache attr to let people use it - resp.from_cache = from_cache # type: ignore[attr-defined] - - return resp - - def close(self) -> None: - self.cache.close() - super().close() # type: ignore[no-untyped-call] diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/cache.py b/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/cache.py deleted file mode 100644 index 3293b00..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/cache.py +++ /dev/null @@ -1,74 +0,0 @@ -# SPDX-FileCopyrightText: 2015 Eric Larson -# -# SPDX-License-Identifier: Apache-2.0 - -""" -The cache object API for implementing caches. The default is a thread -safe in-memory dictionary. -""" -from __future__ import annotations - -from threading import Lock -from typing import IO, TYPE_CHECKING, MutableMapping - -if TYPE_CHECKING: - from datetime import datetime - - -class BaseCache: - def get(self, key: str) -> bytes | None: - raise NotImplementedError() - - def set( - self, key: str, value: bytes, expires: int | datetime | None = None - ) -> None: - raise NotImplementedError() - - def delete(self, key: str) -> None: - raise NotImplementedError() - - def close(self) -> None: - pass - - -class DictCache(BaseCache): - def __init__(self, init_dict: MutableMapping[str, bytes] | None = None) -> None: - self.lock = Lock() - self.data = init_dict or {} - - def get(self, key: str) -> bytes | None: - return self.data.get(key, None) - - def set( - self, key: str, value: bytes, expires: int | datetime | None = None - ) -> None: - with self.lock: - self.data.update({key: value}) - - def delete(self, key: str) -> None: - with self.lock: - if key in self.data: - self.data.pop(key) - - -class SeparateBodyBaseCache(BaseCache): - """ - In this variant, the body is not stored mixed in with the metadata, but is - passed in (as a bytes-like object) in a separate call to ``set_body()``. - - That is, the expected interaction pattern is:: - - cache.set(key, serialized_metadata) - cache.set_body(key) - - Similarly, the body should be loaded separately via ``get_body()``. - """ - - def set_body(self, key: str, body: bytes) -> None: - raise NotImplementedError() - - def get_body(self, key: str) -> IO[bytes] | None: - """ - Return the body as file-like object. - """ - raise NotImplementedError() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__init__.py deleted file mode 100644 index 24ff469..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -# SPDX-FileCopyrightText: 2015 Eric Larson -# -# SPDX-License-Identifier: Apache-2.0 - -from pip._vendor.cachecontrol.caches.file_cache import FileCache, SeparateBodyFileCache -from pip._vendor.cachecontrol.caches.redis_cache import RedisCache - -__all__ = ["FileCache", "SeparateBodyFileCache", "RedisCache"] diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 153a9eae33bb27aa77b8e28eaac88b4c1ab1f311..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 456 zcmah`yH3L}6t$C-LPRITKM+u30W0cI5F-ODD2rum(^$3R$aae&2E<peF|hG1{6QoZ znAngyAa%l~<*{*xqkC*0pL2Dedc73*qW9M&f&jb*@?FugnQi&z4lux=1PT^VMMVSy zk7TTpB7tB8So{EsPLpJvw;;=+cI{Y5en@D^+s!jx6GI#yYS#Q5XRu9AITQBlQ5Kun z3r!NB<KZM*X}4=p=XlC1rcF-6UsPAlXt^LZzw{pX>*814?);}R!F4GMR&5t!A|=L; zVCE^9-=I<}judfrijFj$C|)^>9G84#i0WG>=$M;6(^r+$gmHs>$SIQI0@aNxb+w=G z?jb82@7IKm$%tFzQ=#Q7=<h5GViCro5)R|MZsw~8O0$XN1GDb)_{{*j;o&`o5PqZp Qp2KG_d`SnlT@x1g2`YPs*Z=?k diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-312.pyc deleted file mode 100644 index 58b12856df345a6eb2668ed36ba983d8d4e73a71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7731 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-312.pyc deleted file mode 100644 index c6b174fad1ef7197599d2ae14a4c864b98d49e7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2759 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py b/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py deleted file mode 100644 index 1fd2801..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py +++ /dev/null @@ -1,181 +0,0 @@ -# SPDX-FileCopyrightText: 2015 Eric Larson -# -# SPDX-License-Identifier: Apache-2.0 -from __future__ import annotations - -import hashlib -import os -from textwrap import dedent -from typing import IO, TYPE_CHECKING - -from pip._vendor.cachecontrol.cache import BaseCache, SeparateBodyBaseCache -from pip._vendor.cachecontrol.controller import CacheController - -if TYPE_CHECKING: - from datetime import datetime - - from filelock import BaseFileLock - - -def _secure_open_write(filename: str, fmode: int) -> IO[bytes]: - # We only want to write to this file, so open it in write only mode - flags = os.O_WRONLY - - # os.O_CREAT | os.O_EXCL will fail if the file already exists, so we only - # will open *new* files. - # We specify this because we want to ensure that the mode we pass is the - # mode of the file. - flags |= os.O_CREAT | os.O_EXCL - - # Do not follow symlinks to prevent someone from making a symlink that - # we follow and insecurely open a cache file. - if hasattr(os, "O_NOFOLLOW"): - flags |= os.O_NOFOLLOW - - # On Windows we'll mark this file as binary - if hasattr(os, "O_BINARY"): - flags |= os.O_BINARY - - # Before we open our file, we want to delete any existing file that is - # there - try: - os.remove(filename) - except OSError: - # The file must not exist already, so we can just skip ahead to opening - pass - - # Open our file, the use of os.O_CREAT | os.O_EXCL will ensure that if a - # race condition happens between the os.remove and this line, that an - # error will be raised. Because we utilize a lockfile this should only - # happen if someone is attempting to attack us. - fd = os.open(filename, flags, fmode) - try: - return os.fdopen(fd, "wb") - - except: - # An error occurred wrapping our FD in a file object - os.close(fd) - raise - - -class _FileCacheMixin: - """Shared implementation for both FileCache variants.""" - - def __init__( - self, - directory: str, - forever: bool = False, - filemode: int = 0o0600, - dirmode: int = 0o0700, - lock_class: type[BaseFileLock] | None = None, - ) -> None: - try: - if lock_class is None: - from filelock import FileLock - - lock_class = FileLock - except ImportError: - notice = dedent( - """ - NOTE: In order to use the FileCache you must have - filelock installed. You can install it via pip: - pip install filelock - """ - ) - raise ImportError(notice) - - self.directory = directory - self.forever = forever - self.filemode = filemode - self.dirmode = dirmode - self.lock_class = lock_class - - @staticmethod - def encode(x: str) -> str: - return hashlib.sha224(x.encode()).hexdigest() - - def _fn(self, name: str) -> str: - # NOTE: This method should not change as some may depend on it. - # See: https://github.com/ionrock/cachecontrol/issues/63 - hashed = self.encode(name) - parts = list(hashed[:5]) + [hashed] - return os.path.join(self.directory, *parts) - - def get(self, key: str) -> bytes | None: - name = self._fn(key) - try: - with open(name, "rb") as fh: - return fh.read() - - except FileNotFoundError: - return None - - def set( - self, key: str, value: bytes, expires: int | datetime | None = None - ) -> None: - name = self._fn(key) - self._write(name, value) - - def _write(self, path: str, data: bytes) -> None: - """ - Safely write the data to the given path. - """ - # Make sure the directory exists - try: - os.makedirs(os.path.dirname(path), self.dirmode) - except OSError: - pass - - with self.lock_class(path + ".lock"): - # Write our actual file - with _secure_open_write(path, self.filemode) as fh: - fh.write(data) - - def _delete(self, key: str, suffix: str) -> None: - name = self._fn(key) + suffix - if not self.forever: - try: - os.remove(name) - except FileNotFoundError: - pass - - -class FileCache(_FileCacheMixin, BaseCache): - """ - Traditional FileCache: body is stored in memory, so not suitable for large - downloads. - """ - - def delete(self, key: str) -> None: - self._delete(key, "") - - -class SeparateBodyFileCache(_FileCacheMixin, SeparateBodyBaseCache): - """ - Memory-efficient FileCache: body is stored in a separate file, reducing - peak memory usage. - """ - - def get_body(self, key: str) -> IO[bytes] | None: - name = self._fn(key) + ".body" - try: - return open(name, "rb") - except FileNotFoundError: - return None - - def set_body(self, key: str, body: bytes) -> None: - name = self._fn(key) + ".body" - self._write(name, body) - - def delete(self, key: str) -> None: - self._delete(key, "") - self._delete(key, ".body") - - -def url_to_file_path(url: str, filecache: FileCache) -> str: - """Return the file cache path based on the URL. - - This does not ensure the file exists! - """ - key = CacheController.cache_url(url) - return filecache._fn(key) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py b/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py deleted file mode 100644 index f4f68c4..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py +++ /dev/null @@ -1,48 +0,0 @@ -# SPDX-FileCopyrightText: 2015 Eric Larson -# -# SPDX-License-Identifier: Apache-2.0 -from __future__ import annotations - - -from datetime import datetime, timezone -from typing import TYPE_CHECKING - -from pip._vendor.cachecontrol.cache import BaseCache - -if TYPE_CHECKING: - from redis import Redis - - -class RedisCache(BaseCache): - def __init__(self, conn: Redis[bytes]) -> None: - self.conn = conn - - def get(self, key: str) -> bytes | None: - return self.conn.get(key) - - def set( - self, key: str, value: bytes, expires: int | datetime | None = None - ) -> None: - if not expires: - self.conn.set(key, value) - elif isinstance(expires, datetime): - now_utc = datetime.now(timezone.utc) - if expires.tzinfo is None: - now_utc = now_utc.replace(tzinfo=None) - delta = expires - now_utc - self.conn.setex(key, int(delta.total_seconds()), value) - else: - self.conn.setex(key, expires, value) - - def delete(self, key: str) -> None: - self.conn.delete(key) - - def clear(self) -> None: - """Helper for clearing all the keys in a database. Use with - caution!""" - for key in self.conn.keys(): - self.conn.delete(key) - - def close(self) -> None: - """Redis uses connection pooling, no need to close the connection.""" - pass diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py b/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py deleted file mode 100644 index 586b9f9..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py +++ /dev/null @@ -1,494 +0,0 @@ -# SPDX-FileCopyrightText: 2015 Eric Larson -# -# SPDX-License-Identifier: Apache-2.0 - -""" -The httplib2 algorithms ported for use with requests. -""" -from __future__ import annotations - -import calendar -import logging -import re -import time -from email.utils import parsedate_tz -from typing import TYPE_CHECKING, Collection, Mapping - -from pip._vendor.requests.structures import CaseInsensitiveDict - -from pip._vendor.cachecontrol.cache import DictCache, SeparateBodyBaseCache -from pip._vendor.cachecontrol.serialize import Serializer - -if TYPE_CHECKING: - from typing import Literal - - from pip._vendor.requests import PreparedRequest - from pip._vendor.urllib3 import HTTPResponse - - from pip._vendor.cachecontrol.cache import BaseCache - -logger = logging.getLogger(__name__) - -URI = re.compile(r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?") - -PERMANENT_REDIRECT_STATUSES = (301, 308) - - -def parse_uri(uri: str) -> tuple[str, str, str, str, str]: - """Parses a URI using the regex given in Appendix B of RFC 3986. - - (scheme, authority, path, query, fragment) = parse_uri(uri) - """ - match = URI.match(uri) - assert match is not None - groups = match.groups() - return (groups[1], groups[3], groups[4], groups[6], groups[8]) - - -class CacheController: - """An interface to see if request should cached or not.""" - - def __init__( - self, - cache: BaseCache | None = None, - cache_etags: bool = True, - serializer: Serializer | None = None, - status_codes: Collection[int] | None = None, - ): - self.cache = DictCache() if cache is None else cache - self.cache_etags = cache_etags - self.serializer = serializer or Serializer() - self.cacheable_status_codes = status_codes or (200, 203, 300, 301, 308) - - @classmethod - def _urlnorm(cls, uri: str) -> str: - """Normalize the URL to create a safe key for the cache""" - (scheme, authority, path, query, fragment) = parse_uri(uri) - if not scheme or not authority: - raise Exception("Only absolute URIs are allowed. uri = %s" % uri) - - scheme = scheme.lower() - authority = authority.lower() - - if not path: - path = "/" - - # Could do syntax based normalization of the URI before - # computing the digest. See Section 6.2.2 of Std 66. - request_uri = query and "?".join([path, query]) or path - defrag_uri = scheme + "://" + authority + request_uri - - return defrag_uri - - @classmethod - def cache_url(cls, uri: str) -> str: - return cls._urlnorm(uri) - - def parse_cache_control(self, headers: Mapping[str, str]) -> dict[str, int | None]: - known_directives = { - # https://tools.ietf.org/html/rfc7234#section-5.2 - "max-age": (int, True), - "max-stale": (int, False), - "min-fresh": (int, True), - "no-cache": (None, False), - "no-store": (None, False), - "no-transform": (None, False), - "only-if-cached": (None, False), - "must-revalidate": (None, False), - "public": (None, False), - "private": (None, False), - "proxy-revalidate": (None, False), - "s-maxage": (int, True), - } - - cc_headers = headers.get("cache-control", headers.get("Cache-Control", "")) - - retval: dict[str, int | None] = {} - - for cc_directive in cc_headers.split(","): - if not cc_directive.strip(): - continue - - parts = cc_directive.split("=", 1) - directive = parts[0].strip() - - try: - typ, required = known_directives[directive] - except KeyError: - logger.debug("Ignoring unknown cache-control directive: %s", directive) - continue - - if not typ or not required: - retval[directive] = None - if typ: - try: - retval[directive] = typ(parts[1].strip()) - except IndexError: - if required: - logger.debug( - "Missing value for cache-control " "directive: %s", - directive, - ) - except ValueError: - logger.debug( - "Invalid value for cache-control directive " "%s, must be %s", - directive, - typ.__name__, - ) - - return retval - - def _load_from_cache(self, request: PreparedRequest) -> HTTPResponse | None: - """ - Load a cached response, or return None if it's not available. - """ - cache_url = request.url - assert cache_url is not None - cache_data = self.cache.get(cache_url) - if cache_data is None: - logger.debug("No cache entry available") - return None - - if isinstance(self.cache, SeparateBodyBaseCache): - body_file = self.cache.get_body(cache_url) - else: - body_file = None - - result = self.serializer.loads(request, cache_data, body_file) - if result is None: - logger.warning("Cache entry deserialization failed, entry ignored") - return result - - def cached_request(self, request: PreparedRequest) -> HTTPResponse | Literal[False]: - """ - Return a cached response if it exists in the cache, otherwise - return False. - """ - assert request.url is not None - cache_url = self.cache_url(request.url) - logger.debug('Looking up "%s" in the cache', cache_url) - cc = self.parse_cache_control(request.headers) - - # Bail out if the request insists on fresh data - if "no-cache" in cc: - logger.debug('Request header has "no-cache", cache bypassed') - return False - - if "max-age" in cc and cc["max-age"] == 0: - logger.debug('Request header has "max_age" as 0, cache bypassed') - return False - - # Check whether we can load the response from the cache: - resp = self._load_from_cache(request) - if not resp: - return False - - # If we have a cached permanent redirect, return it immediately. We - # don't need to test our response for other headers b/c it is - # intrinsically "cacheable" as it is Permanent. - # - # See: - # https://tools.ietf.org/html/rfc7231#section-6.4.2 - # - # Client can try to refresh the value by repeating the request - # with cache busting headers as usual (ie no-cache). - if int(resp.status) in PERMANENT_REDIRECT_STATUSES: - msg = ( - "Returning cached permanent redirect response " - "(ignoring date and etag information)" - ) - logger.debug(msg) - return resp - - headers: CaseInsensitiveDict[str] = CaseInsensitiveDict(resp.headers) - if not headers or "date" not in headers: - if "etag" not in headers: - # Without date or etag, the cached response can never be used - # and should be deleted. - logger.debug("Purging cached response: no date or etag") - self.cache.delete(cache_url) - logger.debug("Ignoring cached response: no date") - return False - - now = time.time() - time_tuple = parsedate_tz(headers["date"]) - assert time_tuple is not None - date = calendar.timegm(time_tuple[:6]) - current_age = max(0, now - date) - logger.debug("Current age based on date: %i", current_age) - - # TODO: There is an assumption that the result will be a - # urllib3 response object. This may not be best since we - # could probably avoid instantiating or constructing the - # response until we know we need it. - resp_cc = self.parse_cache_control(headers) - - # determine freshness - freshness_lifetime = 0 - - # Check the max-age pragma in the cache control header - max_age = resp_cc.get("max-age") - if max_age is not None: - freshness_lifetime = max_age - logger.debug("Freshness lifetime from max-age: %i", freshness_lifetime) - - # If there isn't a max-age, check for an expires header - elif "expires" in headers: - expires = parsedate_tz(headers["expires"]) - if expires is not None: - expire_time = calendar.timegm(expires[:6]) - date - freshness_lifetime = max(0, expire_time) - logger.debug("Freshness lifetime from expires: %i", freshness_lifetime) - - # Determine if we are setting freshness limit in the - # request. Note, this overrides what was in the response. - max_age = cc.get("max-age") - if max_age is not None: - freshness_lifetime = max_age - logger.debug( - "Freshness lifetime from request max-age: %i", freshness_lifetime - ) - - min_fresh = cc.get("min-fresh") - if min_fresh is not None: - # adjust our current age by our min fresh - current_age += min_fresh - logger.debug("Adjusted current age from min-fresh: %i", current_age) - - # Return entry if it is fresh enough - if freshness_lifetime > current_age: - logger.debug('The response is "fresh", returning cached response') - logger.debug("%i > %i", freshness_lifetime, current_age) - return resp - - # we're not fresh. If we don't have an Etag, clear it out - if "etag" not in headers: - logger.debug('The cached response is "stale" with no etag, purging') - self.cache.delete(cache_url) - - # return the original handler - return False - - def conditional_headers(self, request: PreparedRequest) -> dict[str, str]: - resp = self._load_from_cache(request) - new_headers = {} - - if resp: - headers: CaseInsensitiveDict[str] = CaseInsensitiveDict(resp.headers) - - if "etag" in headers: - new_headers["If-None-Match"] = headers["ETag"] - - if "last-modified" in headers: - new_headers["If-Modified-Since"] = headers["Last-Modified"] - - return new_headers - - def _cache_set( - self, - cache_url: str, - request: PreparedRequest, - response: HTTPResponse, - body: bytes | None = None, - expires_time: int | None = None, - ) -> None: - """ - Store the data in the cache. - """ - if isinstance(self.cache, SeparateBodyBaseCache): - # We pass in the body separately; just put a placeholder empty - # string in the metadata. - self.cache.set( - cache_url, - self.serializer.dumps(request, response, b""), - expires=expires_time, - ) - # body is None can happen when, for example, we're only updating - # headers, as is the case in update_cached_response(). - if body is not None: - self.cache.set_body(cache_url, body) - else: - self.cache.set( - cache_url, - self.serializer.dumps(request, response, body), - expires=expires_time, - ) - - def cache_response( - self, - request: PreparedRequest, - response: HTTPResponse, - body: bytes | None = None, - status_codes: Collection[int] | None = None, - ) -> None: - """ - Algorithm for caching requests. - - This assumes a requests Response object. - """ - # From httplib2: Don't cache 206's since we aren't going to - # handle byte range requests - cacheable_status_codes = status_codes or self.cacheable_status_codes - if response.status not in cacheable_status_codes: - logger.debug( - "Status code %s not in %s", response.status, cacheable_status_codes - ) - return - - response_headers: CaseInsensitiveDict[str] = CaseInsensitiveDict( - response.headers - ) - - if "date" in response_headers: - time_tuple = parsedate_tz(response_headers["date"]) - assert time_tuple is not None - date = calendar.timegm(time_tuple[:6]) - else: - date = 0 - - # If we've been given a body, our response has a Content-Length, that - # Content-Length is valid then we can check to see if the body we've - # been given matches the expected size, and if it doesn't we'll just - # skip trying to cache it. - if ( - body is not None - and "content-length" in response_headers - and response_headers["content-length"].isdigit() - and int(response_headers["content-length"]) != len(body) - ): - return - - cc_req = self.parse_cache_control(request.headers) - cc = self.parse_cache_control(response_headers) - - assert request.url is not None - cache_url = self.cache_url(request.url) - logger.debug('Updating cache with response from "%s"', cache_url) - - # Delete it from the cache if we happen to have it stored there - no_store = False - if "no-store" in cc: - no_store = True - logger.debug('Response header has "no-store"') - if "no-store" in cc_req: - no_store = True - logger.debug('Request header has "no-store"') - if no_store and self.cache.get(cache_url): - logger.debug('Purging existing cache entry to honor "no-store"') - self.cache.delete(cache_url) - if no_store: - return - - # https://tools.ietf.org/html/rfc7234#section-4.1: - # A Vary header field-value of "*" always fails to match. - # Storing such a response leads to a deserialization warning - # during cache lookup and is not allowed to ever be served, - # so storing it can be avoided. - if "*" in response_headers.get("vary", ""): - logger.debug('Response header has "Vary: *"') - return - - # If we've been given an etag, then keep the response - if self.cache_etags and "etag" in response_headers: - expires_time = 0 - if response_headers.get("expires"): - expires = parsedate_tz(response_headers["expires"]) - if expires is not None: - expires_time = calendar.timegm(expires[:6]) - date - - expires_time = max(expires_time, 14 * 86400) - - logger.debug(f"etag object cached for {expires_time} seconds") - logger.debug("Caching due to etag") - self._cache_set(cache_url, request, response, body, expires_time) - - # Add to the cache any permanent redirects. We do this before looking - # that the Date headers. - elif int(response.status) in PERMANENT_REDIRECT_STATUSES: - logger.debug("Caching permanent redirect") - self._cache_set(cache_url, request, response, b"") - - # Add to the cache if the response headers demand it. If there - # is no date header then we can't do anything about expiring - # the cache. - elif "date" in response_headers: - time_tuple = parsedate_tz(response_headers["date"]) - assert time_tuple is not None - date = calendar.timegm(time_tuple[:6]) - # cache when there is a max-age > 0 - max_age = cc.get("max-age") - if max_age is not None and max_age > 0: - logger.debug("Caching b/c date exists and max-age > 0") - expires_time = max_age - self._cache_set( - cache_url, - request, - response, - body, - expires_time, - ) - - # If the request can expire, it means we should cache it - # in the meantime. - elif "expires" in response_headers: - if response_headers["expires"]: - expires = parsedate_tz(response_headers["expires"]) - if expires is not None: - expires_time = calendar.timegm(expires[:6]) - date - else: - expires_time = None - - logger.debug( - "Caching b/c of expires header. expires in {} seconds".format( - expires_time - ) - ) - self._cache_set( - cache_url, - request, - response, - body, - expires_time, - ) - - def update_cached_response( - self, request: PreparedRequest, response: HTTPResponse - ) -> HTTPResponse: - """On a 304 we will get a new set of headers that we want to - update our cached value with, assuming we have one. - - This should only ever be called when we've sent an ETag and - gotten a 304 as the response. - """ - assert request.url is not None - cache_url = self.cache_url(request.url) - cached_response = self._load_from_cache(request) - - if not cached_response: - # we didn't have a cached response - return response - - # Lets update our headers with the headers from the new request: - # http://tools.ietf.org/html/draft-ietf-httpbis-p4-conditional-26#section-4.1 - # - # The server isn't supposed to send headers that would make - # the cached body invalid. But... just in case, we'll be sure - # to strip out ones we know that might be problmatic due to - # typical assumptions. - excluded_headers = ["content-length"] - - cached_response.headers.update( - { - k: v - for k, v in response.headers.items() # type: ignore[no-untyped-call] - if k.lower() not in excluded_headers - } - ) - - # we want a 200 b/c we have content via the cache - cached_response.status = 200 - - # update our cache - self._cache_set(cache_url, request, cached_response) - - return cached_response diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/filewrapper.py b/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/filewrapper.py deleted file mode 100644 index 2514390..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/filewrapper.py +++ /dev/null @@ -1,119 +0,0 @@ -# SPDX-FileCopyrightText: 2015 Eric Larson -# -# SPDX-License-Identifier: Apache-2.0 -from __future__ import annotations - -import mmap -from tempfile import NamedTemporaryFile -from typing import TYPE_CHECKING, Any, Callable - -if TYPE_CHECKING: - from http.client import HTTPResponse - - -class CallbackFileWrapper: - """ - Small wrapper around a fp object which will tee everything read into a - buffer, and when that file is closed it will execute a callback with the - contents of that buffer. - - All attributes are proxied to the underlying file object. - - This class uses members with a double underscore (__) leading prefix so as - not to accidentally shadow an attribute. - - The data is stored in a temporary file until it is all available. As long - as the temporary files directory is disk-based (sometimes it's a - memory-backed-``tmpfs`` on Linux), data will be unloaded to disk if memory - pressure is high. For small files the disk usually won't be used at all, - it'll all be in the filesystem memory cache, so there should be no - performance impact. - """ - - def __init__( - self, fp: HTTPResponse, callback: Callable[[bytes], None] | None - ) -> None: - self.__buf = NamedTemporaryFile("rb+", delete=True) - self.__fp = fp - self.__callback = callback - - def __getattr__(self, name: str) -> Any: - # The vaguaries of garbage collection means that self.__fp is - # not always set. By using __getattribute__ and the private - # name[0] allows looking up the attribute value and raising an - # AttributeError when it doesn't exist. This stop thigns from - # infinitely recursing calls to getattr in the case where - # self.__fp hasn't been set. - # - # [0] https://docs.python.org/2/reference/expressions.html#atom-identifiers - fp = self.__getattribute__("_CallbackFileWrapper__fp") - return getattr(fp, name) - - def __is_fp_closed(self) -> bool: - try: - return self.__fp.fp is None - - except AttributeError: - pass - - try: - closed: bool = self.__fp.closed - return closed - - except AttributeError: - pass - - # We just don't cache it then. - # TODO: Add some logging here... - return False - - def _close(self) -> None: - if self.__callback: - if self.__buf.tell() == 0: - # Empty file: - result = b"" - else: - # Return the data without actually loading it into memory, - # relying on Python's buffer API and mmap(). mmap() just gives - # a view directly into the filesystem's memory cache, so it - # doesn't result in duplicate memory use. - self.__buf.seek(0, 0) - result = memoryview( - mmap.mmap(self.__buf.fileno(), 0, access=mmap.ACCESS_READ) - ) - self.__callback(result) - - # We assign this to None here, because otherwise we can get into - # really tricky problems where the CPython interpreter dead locks - # because the callback is holding a reference to something which - # has a __del__ method. Setting this to None breaks the cycle - # and allows the garbage collector to do it's thing normally. - self.__callback = None - - # Closing the temporary file releases memory and frees disk space. - # Important when caching big files. - self.__buf.close() - - def read(self, amt: int | None = None) -> bytes: - data: bytes = self.__fp.read(amt) - if data: - # We may be dealing with b'', a sign that things are over: - # it's passed e.g. after we've already closed self.__buf. - self.__buf.write(data) - if self.__is_fp_closed(): - self._close() - - return data - - def _safe_read(self, amt: int) -> bytes: - data: bytes = self.__fp._safe_read(amt) # type: ignore[attr-defined] - if amt == 2 and data == b"\r\n": - # urllib executes this read to toss the CRLF at the end - # of the chunk. - return data - - self.__buf.write(data) - if self.__is_fp_closed(): - self._close() - - return data diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py b/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py deleted file mode 100644 index b9d72ca..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py +++ /dev/null @@ -1,154 +0,0 @@ -# SPDX-FileCopyrightText: 2015 Eric Larson -# -# SPDX-License-Identifier: Apache-2.0 -from __future__ import annotations - -import calendar -import time -from datetime import datetime, timedelta, timezone -from email.utils import formatdate, parsedate, parsedate_tz -from typing import TYPE_CHECKING, Any, Mapping - -if TYPE_CHECKING: - from pip._vendor.urllib3 import HTTPResponse - -TIME_FMT = "%a, %d %b %Y %H:%M:%S GMT" - - -def expire_after(delta: timedelta, date: datetime | None = None) -> datetime: - date = date or datetime.now(timezone.utc) - return date + delta - - -def datetime_to_header(dt: datetime) -> str: - return formatdate(calendar.timegm(dt.timetuple())) - - -class BaseHeuristic: - def warning(self, response: HTTPResponse) -> str | None: - """ - Return a valid 1xx warning header value describing the cache - adjustments. - - The response is provided too allow warnings like 113 - http://tools.ietf.org/html/rfc7234#section-5.5.4 where we need - to explicitly say response is over 24 hours old. - """ - return '110 - "Response is Stale"' - - def update_headers(self, response: HTTPResponse) -> dict[str, str]: - """Update the response headers with any new headers. - - NOTE: This SHOULD always include some Warning header to - signify that the response was cached by the client, not - by way of the provided headers. - """ - return {} - - def apply(self, response: HTTPResponse) -> HTTPResponse: - updated_headers = self.update_headers(response) - - if updated_headers: - response.headers.update(updated_headers) - warning_header_value = self.warning(response) - if warning_header_value is not None: - response.headers.update({"Warning": warning_header_value}) - - return response - - -class OneDayCache(BaseHeuristic): - """ - Cache the response by providing an expires 1 day in the - future. - """ - - def update_headers(self, response: HTTPResponse) -> dict[str, str]: - headers = {} - - if "expires" not in response.headers: - date = parsedate(response.headers["date"]) - expires = expire_after(timedelta(days=1), date=datetime(*date[:6], tzinfo=timezone.utc)) # type: ignore[misc] - headers["expires"] = datetime_to_header(expires) - headers["cache-control"] = "public" - return headers - - -class ExpiresAfter(BaseHeuristic): - """ - Cache **all** requests for a defined time period. - """ - - def __init__(self, **kw: Any) -> None: - self.delta = timedelta(**kw) - - def update_headers(self, response: HTTPResponse) -> dict[str, str]: - expires = expire_after(self.delta) - return {"expires": datetime_to_header(expires), "cache-control": "public"} - - def warning(self, response: HTTPResponse) -> str | None: - tmpl = "110 - Automatically cached for %s. Response might be stale" - return tmpl % self.delta - - -class LastModified(BaseHeuristic): - """ - If there is no Expires header already, fall back on Last-Modified - using the heuristic from - http://tools.ietf.org/html/rfc7234#section-4.2.2 - to calculate a reasonable value. - - Firefox also does something like this per - https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching_FAQ - http://lxr.mozilla.org/mozilla-release/source/netwerk/protocol/http/nsHttpResponseHead.cpp#397 - Unlike mozilla we limit this to 24-hr. - """ - - cacheable_by_default_statuses = { - 200, - 203, - 204, - 206, - 300, - 301, - 404, - 405, - 410, - 414, - 501, - } - - def update_headers(self, resp: HTTPResponse) -> dict[str, str]: - headers: Mapping[str, str] = resp.headers - - if "expires" in headers: - return {} - - if "cache-control" in headers and headers["cache-control"] != "public": - return {} - - if resp.status not in self.cacheable_by_default_statuses: - return {} - - if "date" not in headers or "last-modified" not in headers: - return {} - - time_tuple = parsedate_tz(headers["date"]) - assert time_tuple is not None - date = calendar.timegm(time_tuple[:6]) - last_modified = parsedate(headers["last-modified"]) - if last_modified is None: - return {} - - now = time.time() - current_age = max(0, now - date) - delta = date - calendar.timegm(last_modified) - freshness_lifetime = max(0, min(delta / 10, 24 * 3600)) - if freshness_lifetime <= current_age: - return {} - - expires = date + freshness_lifetime - return {"expires": time.strftime(TIME_FMT, time.gmtime(expires))} - - def warning(self, resp: HTTPResponse) -> str | None: - return None diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/serialize.py b/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/serialize.py deleted file mode 100644 index f9e967c..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/serialize.py +++ /dev/null @@ -1,206 +0,0 @@ -# SPDX-FileCopyrightText: 2015 Eric Larson -# -# SPDX-License-Identifier: Apache-2.0 -from __future__ import annotations - -import io -from typing import IO, TYPE_CHECKING, Any, Mapping, cast - -from pip._vendor import msgpack -from pip._vendor.requests.structures import CaseInsensitiveDict -from pip._vendor.urllib3 import HTTPResponse - -if TYPE_CHECKING: - from pip._vendor.requests import PreparedRequest - - -class Serializer: - serde_version = "4" - - def dumps( - self, - request: PreparedRequest, - response: HTTPResponse, - body: bytes | None = None, - ) -> bytes: - response_headers: CaseInsensitiveDict[str] = CaseInsensitiveDict( - response.headers - ) - - if body is None: - # When a body isn't passed in, we'll read the response. We - # also update the response with a new file handler to be - # sure it acts as though it was never read. - body = response.read(decode_content=False) - response._fp = io.BytesIO(body) # type: ignore[attr-defined] - response.length_remaining = len(body) - - data = { - "response": { - "body": body, # Empty bytestring if body is stored separately - "headers": {str(k): str(v) for k, v in response.headers.items()}, # type: ignore[no-untyped-call] - "status": response.status, - "version": response.version, - "reason": str(response.reason), - "decode_content": response.decode_content, - } - } - - # Construct our vary headers - data["vary"] = {} - if "vary" in response_headers: - varied_headers = response_headers["vary"].split(",") - for header in varied_headers: - header = str(header).strip() - header_value = request.headers.get(header, None) - if header_value is not None: - header_value = str(header_value) - data["vary"][header] = header_value - - return b",".join([f"cc={self.serde_version}".encode(), self.serialize(data)]) - - def serialize(self, data: dict[str, Any]) -> bytes: - return cast(bytes, msgpack.dumps(data, use_bin_type=True)) - - def loads( - self, - request: PreparedRequest, - data: bytes, - body_file: IO[bytes] | None = None, - ) -> HTTPResponse | None: - # Short circuit if we've been given an empty set of data - if not data: - return None - - # Determine what version of the serializer the data was serialized - # with - try: - ver, data = data.split(b",", 1) - except ValueError: - ver = b"cc=0" - - # Make sure that our "ver" is actually a version and isn't a false - # positive from a , being in the data stream. - if ver[:3] != b"cc=": - data = ver + data - ver = b"cc=0" - - # Get the version number out of the cc=N - verstr = ver.split(b"=", 1)[-1].decode("ascii") - - # Dispatch to the actual load method for the given version - try: - return getattr(self, f"_loads_v{verstr}")(request, data, body_file) # type: ignore[no-any-return] - - except AttributeError: - # This is a version we don't have a loads function for, so we'll - # just treat it as a miss and return None - return None - - def prepare_response( - self, - request: PreparedRequest, - cached: Mapping[str, Any], - body_file: IO[bytes] | None = None, - ) -> HTTPResponse | None: - """Verify our vary headers match and construct a real urllib3 - HTTPResponse object. - """ - # Special case the '*' Vary value as it means we cannot actually - # determine if the cached response is suitable for this request. - # This case is also handled in the controller code when creating - # a cache entry, but is left here for backwards compatibility. - if "*" in cached.get("vary", {}): - return None - - # Ensure that the Vary headers for the cached response match our - # request - for header, value in cached.get("vary", {}).items(): - if request.headers.get(header, None) != value: - return None - - body_raw = cached["response"].pop("body") - - headers: CaseInsensitiveDict[str] = CaseInsensitiveDict( - data=cached["response"]["headers"] - ) - if headers.get("transfer-encoding", "") == "chunked": - headers.pop("transfer-encoding") - - cached["response"]["headers"] = headers - - try: - body: IO[bytes] - if body_file is None: - body = io.BytesIO(body_raw) - else: - body = body_file - except TypeError: - # This can happen if cachecontrol serialized to v1 format (pickle) - # using Python 2. A Python 2 str(byte string) will be unpickled as - # a Python 3 str (unicode string), which will cause the above to - # fail with: - # - # TypeError: 'str' does not support the buffer interface - body = io.BytesIO(body_raw.encode("utf8")) - - # Discard any `strict` parameter serialized by older version of cachecontrol. - cached["response"].pop("strict", None) - - return HTTPResponse(body=body, preload_content=False, **cached["response"]) - - def _loads_v0( - self, - request: PreparedRequest, - data: bytes, - body_file: IO[bytes] | None = None, - ) -> None: - # The original legacy cache data. This doesn't contain enough - # information to construct everything we need, so we'll treat this as - # a miss. - return None - - def _loads_v1( - self, - request: PreparedRequest, - data: bytes, - body_file: IO[bytes] | None = None, - ) -> HTTPResponse | None: - # The "v1" pickled cache format. This is no longer supported - # for security reasons, so we treat it as a miss. - return None - - def _loads_v2( - self, - request: PreparedRequest, - data: bytes, - body_file: IO[bytes] | None = None, - ) -> HTTPResponse | None: - # The "v2" compressed base64 cache format. - # This has been removed due to age and poor size/performance - # characteristics, so we treat it as a miss. - return None - - def _loads_v3( - self, - request: PreparedRequest, - data: bytes, - body_file: IO[bytes] | None = None, - ) -> None: - # Due to Python 2 encoding issues, it's impossible to know for sure - # exactly how to load v3 entries, thus we'll treat these as a miss so - # that they get rewritten out as v4 entries. - return None - - def _loads_v4( - self, - request: PreparedRequest, - data: bytes, - body_file: IO[bytes] | None = None, - ) -> HTTPResponse | None: - try: - cached = msgpack.loads(data, raw=False) - except ValueError: - return None - - return self.prepare_response(request, cached, body_file) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/wrapper.py b/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/wrapper.py deleted file mode 100644 index f618bc3..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/wrapper.py +++ /dev/null @@ -1,43 +0,0 @@ -# SPDX-FileCopyrightText: 2015 Eric Larson -# -# SPDX-License-Identifier: Apache-2.0 -from __future__ import annotations - -from typing import TYPE_CHECKING, Collection - -from pip._vendor.cachecontrol.adapter import CacheControlAdapter -from pip._vendor.cachecontrol.cache import DictCache - -if TYPE_CHECKING: - from pip._vendor import requests - - from pip._vendor.cachecontrol.cache import BaseCache - from pip._vendor.cachecontrol.controller import CacheController - from pip._vendor.cachecontrol.heuristics import BaseHeuristic - from pip._vendor.cachecontrol.serialize import Serializer - - -def CacheControl( - sess: requests.Session, - cache: BaseCache | None = None, - cache_etags: bool = True, - serializer: Serializer | None = None, - heuristic: BaseHeuristic | None = None, - controller_class: type[CacheController] | None = None, - adapter_class: type[CacheControlAdapter] | None = None, - cacheable_methods: Collection[str] | None = None, -) -> requests.Session: - cache = DictCache() if cache is None else cache - adapter_class = adapter_class or CacheControlAdapter - adapter = adapter_class( - cache, - cache_etags=cache_etags, - serializer=serializer, - heuristic=heuristic, - controller_class=controller_class, - cacheable_methods=cacheable_methods, - ) - sess.mount("http://", adapter) - sess.mount("https://", adapter) - - return sess diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__init__.py deleted file mode 100644 index 8ce89ce..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .core import contents, where - -__all__ = ["contents", "where"] -__version__ = "2023.07.22" diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__main__.py b/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__main__.py deleted file mode 100644 index 0037634..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__main__.py +++ /dev/null @@ -1,12 +0,0 @@ -import argparse - -from pip._vendor.certifi import contents, where - -parser = argparse.ArgumentParser() -parser.add_argument("-c", "--contents", action="store_true") -args = parser.parse_args() - -if args.contents: - print(contents()) -else: - print(where()) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 72a556d036672ff2f74222aef496e4eb0f68c6de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 339 zcmYjMJx{|h5Vez(mPTbmNG!nEp>atE7R1EN56FNO?4z;jkH~gY6&CmhY;5fO78XX7 z1tcamq;8#XC6IW-yN`FLclR<F^icqNx~(ol{M;0Oh<=mRVMrbkM;uF}aDi1+L>Tdi z$J3~Yc~T_H&T#7shp}PQ_L$Kgw0CW1QGo>;hrUe$-SqQuKFP)>S)N}EJ8i<uf4S{a zT1rW2n^M|<b;4*$pV2C;qO~KHQ9xAbT|>?do2!in@gQMpOEq#{uo>79Hw!II$-$Ba zbVH=LBK6W&Mo+TioH*fORF`a4PQj5{)FfDGZY*J7y|@;HQlW*XG^>~E-l;NtF5%3k j;fBqFZZFVxj4^&kM<40#!{W7naMyj?*}qTicF=wRuVr62 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc deleted file mode 100644 index 62510325f7bcd11ab794b4258062390d5153e80e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 666 zcmZutzi$&U6t?g8MWjWIkRqlC2|*ASt8{IVkUCe4D9g#5O>*ho`D8n(QWz>E1gHxe zOw6G0pRf?MD8(#A42TV>TNm(M@0tZm_WR!Vz4!dtpPS7F&?|cXbof`tpG8tHy8>s& z8oUJr5SV~|5sd_<M&C%yz6pT=C>VKl(=yH~*te-YYA*R25tCTN{^ZQe3kCvRw_2;q zcsa+T-pE?=HR3DUfv>kwSI*#t2Ei0on)yGi>;5hZce;l1B9=*-Nulh$A?0-62%`N) z5M0s?AsMHk<YU@}%E6J0S=MbR5A#8exuB|*$9XTD(2OwNizt`zlb9E8<ArIp@_-M< zslMW2QO%W8c5!tD6B6nnrKTDsTjWAn<!R?U&g4gMR#-h3Xvk8EQY^&;ZL_HC5=hd7 z4meH&A>(M5@_?|tEMb^Xj<ll*O5(>TpUNT2HhSy#kccG>avbgA0ToCaN0o6@8AoB5 z;y4S#UOqkdHd98%3BAwPw1?tz#Up+EF(HKC!Rjx7PW{fS_QLPX{mzkp<G?uq&H}XN zp!H_^-Q5q*zJS&-*gSEY3%5OY+ehy81MAduUv53$`eymBZy(<IYF+!G(apnKFLwA< GJ^UY~)Tveg diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-312.pyc deleted file mode 100644 index 25acad41341f42158b4682cbca6986931261d56a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3348 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 Hd13G$1dpcL diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/certifi/cacert.pem b/venv/lib/python3.12/site-packages/pip/_vendor/certifi/cacert.pem deleted file mode 100644 index 0212369..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/certifi/cacert.pem +++ /dev/null @@ -1,4635 +0,0 @@ - -# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA -# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA -# Label: "GlobalSign Root CA" -# Serial: 4835703278459707669005204 -# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a -# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c -# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG -A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv -b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw -MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i -YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT -aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ -jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp -xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp -1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG -snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ -U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 -9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E -BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B -AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz -yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE -38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP -AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad -DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME -HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== ------END CERTIFICATE----- - -# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Label: "Entrust.net Premium 2048 Secure Server CA" -# Serial: 946069240 -# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 -# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 -# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML -RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 -IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 -MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 -LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp -YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG -A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq -K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe -sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX -MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT -XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ -HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH -4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub -j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo -U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf -zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b -u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ -bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er -fF6adulZkMV8gzURZVE= ------END CERTIFICATE----- - -# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Label: "Baltimore CyberTrust Root" -# Serial: 33554617 -# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 -# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 -# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ -RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD -VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX -DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y -ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy -VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr -mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr -IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK -mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu -XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy -dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye -jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 -BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 -DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 -9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 -Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz -ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS -R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Label: "Entrust Root Certification Authority" -# Serial: 1164660820 -# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 -# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 -# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 -Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW -KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw -NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw -NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy -ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV -BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo -Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 -4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 -KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI -rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi -94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB -sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi -gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo -kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE -vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t -O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua -AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP -9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ -eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m -0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- - -# Issuer: CN=AAA Certificate Services O=Comodo CA Limited -# Subject: CN=AAA Certificate Services O=Comodo CA Limited -# Label: "Comodo AAA Services root" -# Serial: 1 -# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 -# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 -# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj -YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM -GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua -BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe -3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 -YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR -rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm -ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU -oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v -QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t -b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF -AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q -GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 -G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi -l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 -smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2" -# Serial: 1289 -# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b -# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 -# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 ------BEGIN CERTIFICATE----- -MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa -GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg -Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J -WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB -rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp -+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 -ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i -Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz -PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og -/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH -oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI -yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud -EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 -A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL -MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT -ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f -BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn -g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl -fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K -WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha -B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc -hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR -TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD -mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z -ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y -4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza -8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3" -# Serial: 1478 -# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf -# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 -# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 ------BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM -V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB -4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr -H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd -8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv -vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT -mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe -btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc -T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt -WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ -c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A -4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD -VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG -CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 -aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 -aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu -dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw -czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G -A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg -Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 -7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem -d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd -+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B -4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN -t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x -DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 -k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s -zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j -Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT -mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK -4SVhM7JZG+Ju1zdXtg2pEto= ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 -# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 -# Label: "Security Communication Root CA" -# Serial: 0 -# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a -# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 -# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY -MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t -dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 -WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD -VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 -9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ -DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 -Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N -QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ -xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G -A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG -kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr -Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 -Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU -JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot -RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== ------END CERTIFICATE----- - -# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com -# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com -# Label: "XRamp Global CA Root" -# Serial: 107108908803651509692980124233745014957 -# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 -# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 -# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB -gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk -MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY -UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx -NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 -dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy -dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 -38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP -KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q -DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 -qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa -JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi -PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P -BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs -jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 -eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR -vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa -IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy -i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ -O+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- - -# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Label: "Go Daddy Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 -# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 -# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh -MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE -YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 -MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo -ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg -MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN -ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA -PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w -wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi -EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY -avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ -YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE -sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h -/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 -IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD -ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy -OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P -TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER -dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf -ReYNnyicsbkqWletNw+vHX/bvZ8= ------END CERTIFICATE----- - -# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority -# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority -# Label: "Starfield Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 -# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a -# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl -MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp -U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw -NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE -ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp -ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 -DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf -8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN -+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 -X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa -K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA -1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G -A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR -zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 -YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD -bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w -DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 -L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D -eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp -VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY -WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root CA" -# Serial: 17154717934120587862167794914071425081 -# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 -# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 -# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c -JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP -mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ -wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 -VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ -AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB -AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun -pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC -dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf -fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm -NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx -H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root CA" -# Serial: 10944719598952040374951832963794454346 -# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e -# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 -# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert High Assurance EV Root CA" -# Serial: 3553400076410547919724730734378100087 -# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a -# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 -# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j -ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 -LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug -RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm -+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW -PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM -xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB -Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 -hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg -EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA -FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec -nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z -eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF -hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 -Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep -+OkuE6N36B9K ------END CERTIFICATE----- - -# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG -# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG -# Label: "SwissSign Gold CA - G2" -# Serial: 13492815561806991280 -# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 -# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 -# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG -# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG -# Label: "SwissSign Silver CA - G2" -# Serial: 5700383053117599563 -# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 -# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb -# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=SecureTrust CA O=SecureTrust Corporation -# Subject: CN=SecureTrust CA O=SecureTrust Corporation -# Label: "SecureTrust CA" -# Serial: 17199774589125277788362757014266862032 -# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 -# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 -# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz -MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv -cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz -Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO -0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao -wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj -7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS -8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT -BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg -JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 -6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ -3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm -D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS -CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- - -# Issuer: CN=Secure Global CA O=SecureTrust Corporation -# Subject: CN=Secure Global CA O=SecureTrust Corporation -# Label: "Secure Global CA" -# Serial: 9751836167731051554232119481456978597 -# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de -# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b -# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx -MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg -Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ -iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa -/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ -jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI -HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 -sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w -gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw -KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG -AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L -URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO -H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm -I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY -iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- - -# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO Certification Authority O=COMODO CA Limited -# Label: "COMODO Certification Authority" -# Serial: 104350513648249232941998508985834464573 -# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 -# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b -# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB -gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV -BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw -MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl -YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P -RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 -UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI -2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 -Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp -+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ -DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O -nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW -/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g -PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u -QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY -SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv -IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 -zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd -BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB -ZQ== ------END CERTIFICATE----- - -# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Label: "COMODO ECC Certification Authority" -# Serial: 41578283867086692638256921589707938090 -# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 -# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 -# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT -IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw -MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy -ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N -T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR -FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J -cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW -BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm -fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv -GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- - -# Issuer: CN=Certigna O=Dhimyotis -# Subject: CN=Certigna O=Dhimyotis -# Label: "Certigna" -# Serial: 18364802974209362175 -# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff -# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 -# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d ------BEGIN CERTIFICATE----- -MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV -BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X -DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ -BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 -QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny -gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw -zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q -130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 -JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw -ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT -AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj -AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG -9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h -bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc -fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu -HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w -t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw -WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== ------END CERTIFICATE----- - -# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority -# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority -# Label: "ePKI Root Certification Authority" -# Serial: 28956088682735189655030529057352760477 -# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 -# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 -# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 ------BEGIN CERTIFICATE----- -MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe -MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 -ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw -IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL -SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH -SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh -ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X -DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 -TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ -fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA -sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU -WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS -nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH -dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip -NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC -AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF -MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH -ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB -uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl -PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP -JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ -gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 -j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 -5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB -o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS -/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z -Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE -W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D -hNQ+IIX3Sj0rnP0qCglN6oH4EZw= ------END CERTIFICATE----- - -# Issuer: O=certSIGN OU=certSIGN ROOT CA -# Subject: O=certSIGN OU=certSIGN ROOT CA -# Label: "certSIGN ROOT CA" -# Serial: 35210227249154 -# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 -# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b -# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb ------BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT -AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD -QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP -MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do -0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ -UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d -RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ -OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv -JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C -AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O -BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ -LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY -MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ -44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I -Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw -i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN -9u6wWk5JRFRYX0KD ------END CERTIFICATE----- - -# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) -# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) -# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" -# Serial: 80544274841616 -# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 -# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 -# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG -EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 -MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl -cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR -dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB -pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM -b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz -IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT -lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz -AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 -VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG -ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 -BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG -AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M -U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh -bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C -+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F -uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 -XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= ------END CERTIFICATE----- - -# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. -# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. -# Label: "SecureSign RootCA11" -# Serial: 1 -# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 -# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 -# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 ------BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr -MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG -A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 -MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp -Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD -QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz -i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 -h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV -MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 -UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni -8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC -h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD -VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB -AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm -KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ -X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr -QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 -pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN -QSdJQO7e5iNEOdyhIta6A/I= ------END CERTIFICATE----- - -# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Label: "Microsec e-Szigno Root CA 2009" -# Serial: 14014712776195784473 -# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 -# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e -# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 ------BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD -VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 -ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G -CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y -OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx -FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp -Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP -kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc -cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U -fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 -N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC -xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 -+rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM -Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG -SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h -mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk -ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c -2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t -HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Label: "GlobalSign Root CA - R3" -# Serial: 4835703278459759426209954 -# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 -# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad -# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 -MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 -RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT -gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm -KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd -QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ -XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o -LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU -RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp -jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK -6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX -mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs -Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH -WD9f ------END CERTIFICATE----- - -# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" -# Serial: 6047274297262753887 -# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 -# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa -# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE -BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h -cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy -MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg -Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 -thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM -cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG -L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i -NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h -X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b -m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy -Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja -EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T -KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF -6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh -OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD -VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD -VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp -cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv -ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl -AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF -661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 -am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 -ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 -PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS -3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k -SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF -3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM -ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g -StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz -Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB -jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V ------END CERTIFICATE----- - -# Issuer: CN=Izenpe.com O=IZENPE S.A. -# Subject: CN=Izenpe.com O=IZENPE S.A. -# Label: "Izenpe.com" -# Serial: 917563065490389241595536686991402621 -# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 -# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 -# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Label: "Go Daddy Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 -# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b -# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT -EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp -ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz -NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH -EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE -AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD -E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH -/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy -DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh -GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR -tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA -AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX -WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu -9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr -gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo -2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI -4uJEvlz36hz1 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 -# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e -# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs -ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw -MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj -aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp -Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg -nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 -HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N -Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN -dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 -HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G -CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU -sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 -4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg -8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 -mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Services Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 -# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f -# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs -ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 -MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD -VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy -ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy -dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p -OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 -8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K -Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe -hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk -6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q -AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI -bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB -ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z -qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd -iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn -0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN -sSi6 ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Commercial O=AffirmTrust -# Subject: CN=AffirmTrust Commercial O=AffirmTrust -# Label: "AffirmTrust Commercial" -# Serial: 8608355977964138876 -# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 -# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 -# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP -Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr -ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL -MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 -yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr -VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ -nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG -XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj -vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt -Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g -N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC -nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Networking O=AffirmTrust -# Subject: CN=AffirmTrust Networking O=AffirmTrust -# Label: "AffirmTrust Networking" -# Serial: 8957382827206547757 -# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f -# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f -# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y -YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua -kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL -QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp -6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG -yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i -QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO -tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu -QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ -Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u -olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 -x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Premium O=AffirmTrust -# Subject: CN=AffirmTrust Premium O=AffirmTrust -# Label: "AffirmTrust Premium" -# Serial: 7893706540734352110 -# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 -# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 -# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz -dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG -A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U -cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf -qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ -JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ -+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS -s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 -HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 -70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG -V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S -qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S -5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia -C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX -OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE -FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 -KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg -Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B -8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ -MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc -0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ -u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF -u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH -YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 -GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO -RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e -KeC2uAloGRwYQw== ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust -# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust -# Label: "AffirmTrust Premium ECC" -# Serial: 8401224907861490260 -# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d -# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb -# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 ------BEGIN CERTIFICATE----- -MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC -VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ -cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ -BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt -VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D -0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 -ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G -A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs -aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I -flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA" -# Serial: 279744 -# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 -# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e -# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM -MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D -ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU -cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 -WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg -Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw -IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH -UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM -TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU -BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM -kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x -AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV -HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y -sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL -I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 -J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY -VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- - -# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Label: "TWCA Root Certification Authority" -# Serial: 1 -# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 -# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 -# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 ------BEGIN CERTIFICATE----- -MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES -MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU -V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz -WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO -LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE -AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH -K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX -RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z -rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx -3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq -hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC -MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls -XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D -lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn -aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ -YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Label: "Security Communication RootCA2" -# Serial: 0 -# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 -# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 -# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl -MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe -U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX -DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy -dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj -YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV -OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr -zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM -VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ -hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO -ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw -awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs -OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 -DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF -coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc -okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 -t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy -1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ -SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 ------END CERTIFICATE----- - -# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Label: "Actalis Authentication Root CA" -# Serial: 6271844772424770508 -# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 -# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac -# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 ------BEGIN CERTIFICATE----- -MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE -BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w -MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 -IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC -SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 -ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv -UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX -4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 -KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ -gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb -rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ -51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F -be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe -KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F -v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn -fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 -jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz -ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt -ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL -e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 -jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz -WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V -SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j -pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX -X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok -fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R -K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU -ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU -LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT -LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 2 Root CA" -# Serial: 2 -# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 -# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 -# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr -6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV -L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 -1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx -MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ -QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB -arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr -Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi -FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS -P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN -9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz -uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h -9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s -A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t -OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo -+fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 -KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 -DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us -H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ -I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 -5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h -3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz -Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 3 Root CA" -# Serial: 2 -# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec -# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 -# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y -ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E -N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 -tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX -0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c -/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X -KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY -zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS -O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D -34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP -K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv -Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj -QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV -cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS -IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 -HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa -O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv -033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u -dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE -kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 -3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD -u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq -4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 3" -# Serial: 1 -# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef -# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 -# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN -8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ -RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 -hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 -ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM -EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 -A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy -WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ -1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 -6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT -91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml -e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p -TpPDpFQUWw== ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 2009" -# Serial: 623603 -# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f -# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 -# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 ------BEGIN CERTIFICATE----- -MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha -ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM -HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 -UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 -tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R -ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM -lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp -/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G -A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G -A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj -dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy -MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl -cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js -L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL -BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni -acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 -o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K -zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 -PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y -Johw1+qRzT65ysCQblrGXnRl11z+o+I= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 EV 2009" -# Serial: 623604 -# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 -# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 -# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw -NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV -BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn -ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 -3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z -qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR -p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 -HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw -ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea -HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw -Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh -c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E -RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt -dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku -Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp -3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 -nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF -CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na -xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX -KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 ------END CERTIFICATE----- - -# Issuer: CN=CA Disig Root R2 O=Disig a.s. -# Subject: CN=CA Disig Root R2 O=Disig a.s. -# Label: "CA Disig Root R2" -# Serial: 10572350602393338211 -# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 -# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 -# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV -BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu -MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy -MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx -EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw -ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe -NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH -PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I -x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe -QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR -yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO -QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 -H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ -QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD -i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs -nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 -rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI -hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM -tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf -GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb -lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka -+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal -TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i -nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 -gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr -G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os -zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x -L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL ------END CERTIFICATE----- - -# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Label: "ACCVRAIZ1" -# Serial: 6828503384748696800 -# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 -# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 -# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 ------BEGIN CERTIFICATE----- -MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE -AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw -CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ -BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND -VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb -qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY -HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo -G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA -lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr -IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ -0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH -k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 -4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO -m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa -cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl -uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI -KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls -ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG -AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 -VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT -VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG -CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA -cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA -QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA -7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA -cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA -QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA -czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu -aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt -aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud -DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF -BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp -D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU -JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m -AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD -vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms -tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH -7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h -I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA -h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF -d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H -pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 ------END CERTIFICATE----- - -# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Label: "TWCA Global Root CA" -# Serial: 3262 -# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 -# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 -# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx -EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT -VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 -NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT -B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF -10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz -0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh -MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH -zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc -46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 -yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi -laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP -oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA -BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE -qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm -4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL -1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn -LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF -H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo -RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ -nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh -15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW -6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW -nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j -wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz -aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy -KwbQBM0= ------END CERTIFICATE----- - -# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera -# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera -# Label: "TeliaSonera Root CA v1" -# Serial: 199041966741090107964904287217786801558 -# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c -# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 -# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 ------BEGIN CERTIFICATE----- -MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw -NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv -b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD -VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F -VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 -7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X -Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ -/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs -81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm -dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe -Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu -sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 -pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs -slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ -arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD -VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG -9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl -dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx -0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj -TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed -Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 -Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI -OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 -vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW -t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn -HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx -SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 2" -# Serial: 1 -# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a -# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 -# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd -AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC -FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi -1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq -jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ -wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ -WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy -NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC -uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw -IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 -g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN -9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP -BSeOE6Fuwg== ------END CERTIFICATE----- - -# Issuer: CN=Atos TrustedRoot 2011 O=Atos -# Subject: CN=Atos TrustedRoot 2011 O=Atos -# Label: "Atos TrustedRoot 2011" -# Serial: 6643877497813316402 -# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 -# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 -# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE -AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG -EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM -FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC -REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp -Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM -VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ -SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ -4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L -cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi -eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG -A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 -DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j -vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP -DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc -maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D -lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv -KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 1 G3" -# Serial: 687049649626669250736271037606554624078720034195 -# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab -# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 -# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 -MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV -wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe -rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 -68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh -4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp -UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o -abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc -3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G -KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt -hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO -Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt -zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD -ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC -MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 -cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN -qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 -YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv -b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 -8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k -NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj -ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp -q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt -nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2 G3" -# Serial: 390156079458959257446133169266079962026824725800 -# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 -# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 -# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 -MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf -qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW -n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym -c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ -O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 -o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j -IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq -IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz -8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh -vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l -7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG -cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD -ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 -AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC -roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga -W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n -lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE -+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV -csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd -dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg -KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM -HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 -WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3 G3" -# Serial: 268090761170461462463995952157327242137089239581 -# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 -# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d -# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 -MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR -/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu -FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR -U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c -ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR -FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k -A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw -eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl -sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp -VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q -A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ -ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD -ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px -KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI -FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv -oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg -u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP -0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf -3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl -8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ -DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN -PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ -ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G2" -# Serial: 15385348160840213938643033620894905419 -# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d -# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f -# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 ------BEGIN CERTIFICATE----- -MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA -n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc -biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp -EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA -bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu -YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB -AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW -BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI -QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I -0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni -lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 -B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv -ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo -IhNzbM8m9Yop5w== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G3" -# Serial: 15459312981008553731928384953135426796 -# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb -# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 -# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 ------BEGIN CERTIFICATE----- -MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg -RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq -hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf -Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q -RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD -AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY -JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv -6pZjamVFkpUBtA== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G2" -# Serial: 4293743540046975378534879503202253541 -# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 -# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 -# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f ------BEGIN CERTIFICATE----- -MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH -MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI -2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx -1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ -q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz -tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ -vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP -BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV -5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY -1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 -NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG -Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 -8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe -pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl -MrY= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G3" -# Serial: 7089244469030293291760083333884364146 -# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca -# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e -# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 ------BEGIN CERTIFICATE----- -MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe -Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw -EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x -IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF -K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG -fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO -Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd -BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx -AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ -oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 -sycX ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Trusted Root G4" -# Serial: 7451500558977370777930084869016614236 -# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 -# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 -# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 ------BEGIN CERTIFICATE----- -MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg -RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y -ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If -xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV -ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO -DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ -jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ -CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi -EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM -fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY -uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK -chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t -9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD -ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 -SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd -+SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc -fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa -sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N -cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N -0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie -4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI -r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 -/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm -gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ ------END CERTIFICATE----- - -# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Label: "COMODO RSA Certification Authority" -# Serial: 101909084537582093308941363524873193117 -# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 -# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 -# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 ------BEGIN CERTIFICATE----- -MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB -hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV -BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT -EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR -6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X -pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC -9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV -/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf -Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z -+pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w -qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah -SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC -u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf -Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq -crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E -FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB -/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl -wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM -4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV -2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna -FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ -CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK -boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke -jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL -S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb -QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl -0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB -NVOFBkpdn627G190 ------END CERTIFICATE----- - -# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Label: "USERTrust RSA Certification Authority" -# Serial: 2645093764781058787591871645665788717 -# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 -# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e -# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 ------BEGIN CERTIFICATE----- -MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB -iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl -cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV -BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw -MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV -BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU -aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B -3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY -tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ -Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 -VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT -79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 -c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT -Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l -c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee -UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE -Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd -BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF -Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO -VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 -ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs -8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR -iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze -Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ -XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ -qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB -VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB -L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG -jjxDah2nGN59PRbxYvnKkKj9 ------END CERTIFICATE----- - -# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Label: "USERTrust ECC Certification Authority" -# Serial: 123013823720199481456569720443997572134 -# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 -# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 -# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a ------BEGIN CERTIFICATE----- -MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL -MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl -eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT -JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT -Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg -VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo -I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng -o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G -A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB -zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW -RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 -# Label: "GlobalSign ECC Root CA - R5" -# Serial: 32785792099990507226680698011560947931244 -# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 -# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa -# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 ------BEGIN CERTIFICATE----- -MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc -8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke -hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI -KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg -515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO -xwy8p2Fp8fc74SrL+SvzZpA3 ------END CERTIFICATE----- - -# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust -# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust -# Label: "IdenTrust Commercial Root CA 1" -# Serial: 13298821034946342390520003877796839426 -# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 -# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 -# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu -VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw -MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw -JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT -3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU -+ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp -S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 -bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi -T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL -vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK -Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK -dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT -c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv -l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N -iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD -ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH -6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt -LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 -nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 -+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK -W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT -AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq -l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG -4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ -mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A -7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H ------END CERTIFICATE----- - -# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust -# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust -# Label: "IdenTrust Public Sector Root CA 1" -# Serial: 13298821034946342390521976156843933698 -# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba -# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd -# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f ------BEGIN CERTIFICATE----- -MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu -VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN -MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 -MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 -ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy -RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS -bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF -/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R -3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw -EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy -9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V -GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ -2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV -WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD -W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN -AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj -t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV -DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 -TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G -lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW -mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df -WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 -+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ -tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA -GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv -8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - G2" -# Serial: 1246989352 -# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 -# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 -# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 ------BEGIN CERTIFICATE----- -MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 -cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs -IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz -dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy -NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu -dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt -dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 -aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T -RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN -cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW -wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 -U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 -jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN -BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ -jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ -Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v -1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R -nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH -VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - EC1" -# Serial: 51543124481930649114116133369 -# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc -# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 -# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 ------BEGIN CERTIFICATE----- -MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG -A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 -d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu -dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq -RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy -MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD -VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 -L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g -Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi -A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt -ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH -Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O -BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC -R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX -hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G ------END CERTIFICATE----- - -# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority -# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority -# Label: "CFCA EV ROOT" -# Serial: 407555286 -# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 -# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 -# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd ------BEGIN CERTIFICATE----- -MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD -TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx -MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j -aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP -T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 -sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL -TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 -/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp -7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz -EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt -hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP -a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot -aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg -TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV -PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv -cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL -tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd -BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB -ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT -ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL -jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS -ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy -P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 -xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d -Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN -5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe -/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z -AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ -5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GB CA" -# Serial: 157768595616588414422159278966750757568 -# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d -# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed -# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 ------BEGIN CERTIFICATE----- -MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt -MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg -Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i -YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x -CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG -b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh -bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 -HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx -WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX -1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk -u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P -99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r -M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB -BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh -cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 -gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO -ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf -aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic -Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= ------END CERTIFICATE----- - -# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. -# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. -# Label: "SZAFIR ROOT CA2" -# Serial: 357043034767186914217277344587386743377558296292 -# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 -# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de -# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe ------BEGIN CERTIFICATE----- -MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL -BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 -ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw -NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L -cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg -Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN -QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT -3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw -3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 -3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 -BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN -XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF -AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw -8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG -nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP -oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy -d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg -LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA 2" -# Serial: 44979900017204383099463764357512596969 -# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 -# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 -# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 ------BEGIN CERTIFICATE----- -MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB -gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu -QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG -A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz -OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ -VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 -b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA -DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn -0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB -OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE -fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E -Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m -o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i -sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW -OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez -Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS -adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n -3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ -F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf -CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 -XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm -djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ -WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb -AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq -P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko -b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj -XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P -5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi -DrW5viSP ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions RootCA 2015" -# Serial: 0 -# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce -# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 -# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 ------BEGIN CERTIFICATE----- -MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix -DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k -IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT -N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v -dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG -A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh -ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx -QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA -4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 -AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 -4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C -ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV -9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD -gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 -Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq -NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko -LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc -Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd -ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I -XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI -M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot -9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V -Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea -j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh -X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ -l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf -bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 -pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK -e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 -vm9qp/UsQu0yrbYhnr68 ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" -# Serial: 0 -# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef -# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 -# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 ------BEGIN CERTIFICATE----- -MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN -BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl -bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv -b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ -BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj -YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 -MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 -dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg -QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa -jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi -C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep -lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof -TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR ------END CERTIFICATE----- - -# Issuer: CN=ISRG Root X1 O=Internet Security Research Group -# Subject: CN=ISRG Root X1 O=Internet Security Research Group -# Label: "ISRG Root X1" -# Serial: 172886928669790476064670243504169061120 -# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e -# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 -# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw -TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh -cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 -WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu -ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc -h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ -0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U -A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW -T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH -B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC -B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv -KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn -OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn -jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw -qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI -rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq -hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL -ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ -3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK -NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 -ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur -TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC -jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc -oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq -4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA -mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d -emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= ------END CERTIFICATE----- - -# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM -# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM -# Label: "AC RAIZ FNMT-RCM" -# Serial: 485876308206448804701554682760554759 -# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d -# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 -# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx -CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ -WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ -BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG -Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ -yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf -BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz -WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF -tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z -374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC -IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL -mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 -wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS -MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 -ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet -UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H -YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 -LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD -nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 -RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM -LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf -77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N -JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm -fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp -6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp -1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B -9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok -RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv -uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 1 O=Amazon -# Subject: CN=Amazon Root CA 1 O=Amazon -# Label: "Amazon Root CA 1" -# Serial: 143266978916655856878034712317230054538369994 -# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 -# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 -# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e ------BEGIN CERTIFICATE----- -MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF -ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 -b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv -b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj -ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM -9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw -IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 -VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L -93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm -jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA -A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI -U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs -N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv -o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU -5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy -rqXRfboQnoZsG4q5WTP468SQvvG5 ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 2 O=Amazon -# Subject: CN=Amazon Root CA 2 O=Amazon -# Label: "Amazon Root CA 2" -# Serial: 143266982885963551818349160658925006970653239 -# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 -# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a -# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF -ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 -b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv -b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK -gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ -W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg -1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K -8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r -2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me -z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR -8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj -mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz -7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 -+XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI -0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB -Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm -UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 -LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY -+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS -k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl -7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm -btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl -urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ -fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 -n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE -76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H -9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT -4PsJYGw= ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 3 O=Amazon -# Subject: CN=Amazon Root CA 3 O=Amazon -# Label: "Amazon Root CA 3" -# Serial: 143266986699090766294700635381230934788665930 -# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 -# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e -# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 ------BEGIN CERTIFICATE----- -MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 -MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g -Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG -A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg -Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl -ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr -ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr -BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM -YyRIHN8wfdVoOw== ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 4 O=Amazon -# Subject: CN=Amazon Root CA 4 O=Amazon -# Label: "Amazon Root CA 4" -# Serial: 143266989758080763974105200630763877849284878 -# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd -# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be -# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 ------BEGIN CERTIFICATE----- -MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 -MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g -Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG -A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg -Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi -9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk -M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB -MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw -CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW -1KyLa2tJElMzrdfkviT8tQp21KW8EA== ------END CERTIFICATE----- - -# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM -# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM -# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" -# Serial: 1 -# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 -# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca -# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 ------BEGIN CERTIFICATE----- -MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx -GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp -bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w -KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 -BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy -dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG -EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll -IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU -QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT -TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg -LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 -a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr -LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr -N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X -YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ -iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f -AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH -V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL -BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh -AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf -IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 -lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c -8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf -lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= ------END CERTIFICATE----- - -# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. -# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. -# Label: "GDCA TrustAUTH R5 ROOT" -# Serial: 9009899650740120186 -# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 -# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 -# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 ------BEGIN CERTIFICATE----- -MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE -BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ -IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 -MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV -BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w -HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj -Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj -TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u -KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj -qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm -MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 -ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP -zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk -L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC -jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA -HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC -AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg -p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm -DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 -COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry -L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf -JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg -IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io -2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV -09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ -XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq -T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe -MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== ------END CERTIFICATE----- - -# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation -# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation -# Label: "SSL.com Root Certification Authority RSA" -# Serial: 8875640296558310041 -# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 -# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb -# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 ------BEGIN CERTIFICATE----- -MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE -BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK -DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz -OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv -dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv -bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN -AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R -xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX -qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC -C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 -6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh -/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF -YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E -JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc -US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 -ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm -+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi -M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G -A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV -cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc -Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs -PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ -q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 -cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr -a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I -H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y -K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu -nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf -oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY -Ic2wBlX7Jz9TkHCpBB5XJ7k= ------END CERTIFICATE----- - -# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation -# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation -# Label: "SSL.com Root Certification Authority ECC" -# Serial: 8495723813297216424 -# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e -# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a -# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 ------BEGIN CERTIFICATE----- -MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC -VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T -U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz -WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 -b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS -b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB -BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI -7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg -CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud -EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD -VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T -kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ -gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl ------END CERTIFICATE----- - -# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation -# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation -# Label: "SSL.com EV Root Certification Authority RSA R2" -# Serial: 6248227494352943350 -# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 -# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a -# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c ------BEGIN CERTIFICATE----- -MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV -BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE -CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy -MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G -A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD -DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq -M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf -OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa -4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 -HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR -aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA -b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ -Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV -PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO -pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu -UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY -MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV -HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 -9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW -s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 -Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg -cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM -79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz -/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt -ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm -Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK -QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ -w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi -S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 -mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== ------END CERTIFICATE----- - -# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation -# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation -# Label: "SSL.com EV Root Certification Authority ECC" -# Serial: 3182246526754555285 -# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 -# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d -# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 ------BEGIN CERTIFICATE----- -MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC -VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T -U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx -NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv -dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv -bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 -AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA -VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku -WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP -MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX -5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ -ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg -h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 -# Label: "GlobalSign Root CA - R6" -# Serial: 1417766617973444989252670301619537 -# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae -# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1 -# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69 ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg -MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh -bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx -MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET -MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ -KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI -xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k -ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD -aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw -LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw -1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX -k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 -SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h -bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n -WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY -rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce -MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu -bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN -nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt -Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 -55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj -vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf -cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz -oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp -nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs -pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v -JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R -8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 -5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GC CA" -# Serial: 44084345621038548146064804565436152554 -# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23 -# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31 -# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d ------BEGIN CERTIFICATE----- -MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw -CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91 -bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg -Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ -BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu -ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS -b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni -eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W -p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T -rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV -57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg -Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 ------END CERTIFICATE----- - -# Issuer: CN=UCA Global G2 Root O=UniTrust -# Subject: CN=UCA Global G2 Root O=UniTrust -# Label: "UCA Global G2 Root" -# Serial: 124779693093741543919145257850076631279 -# MD5 Fingerprint: 80:fe:f0:c4:4a:f0:5c:62:32:9f:1c:ba:78:a9:50:f8 -# SHA1 Fingerprint: 28:f9:78:16:19:7a:ff:18:25:18:aa:44:fe:c1:a0:ce:5c:b6:4c:8a -# SHA256 Fingerprint: 9b:ea:11:c9:76:fe:01:47:64:c1:be:56:a6:f9:14:b5:a5:60:31:7a:bd:99:88:39:33:82:e5:16:1a:a0:49:3c ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9 -MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH -bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x -CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds -b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr -b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9 -kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm -VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R -VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc -C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj -tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY -D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv -j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl -NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6 -iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP -O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV -ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj -L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 -1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl -1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU -b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV -PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj -y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb -EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg -DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI -+Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy -YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX -UB+K+wb1whnw0A== ------END CERTIFICATE----- - -# Issuer: CN=UCA Extended Validation Root O=UniTrust -# Subject: CN=UCA Extended Validation Root O=UniTrust -# Label: "UCA Extended Validation Root" -# Serial: 106100277556486529736699587978573607008 -# MD5 Fingerprint: a1:f3:5f:43:c6:34:9b:da:bf:8c:7e:05:53:ad:96:e2 -# SHA1 Fingerprint: a3:a1:b0:6f:24:61:23:4a:e3:36:a5:c2:37:fc:a6:ff:dd:f0:d7:3a -# SHA256 Fingerprint: d4:3a:f9:b3:54:73:75:5c:96:84:fc:06:d7:d8:cb:70:ee:5c:28:e7:73:fb:29:4e:b4:1e:e7:17:22:92:4d:24 ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH -MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF -eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx -MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV -BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog -D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS -sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop -O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk -sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi -c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj -VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz -KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/ -TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G -sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs -1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD -fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN -l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR -ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ -VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5 -c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp -4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s -t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj -2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO -vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C -xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx -cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM -fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax ------END CERTIFICATE----- - -# Issuer: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 -# Subject: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 -# Label: "Certigna Root CA" -# Serial: 269714418870597844693661054334862075617 -# MD5 Fingerprint: 0e:5c:30:62:27:eb:5b:bc:d7:ae:62:ba:e9:d5:df:77 -# SHA1 Fingerprint: 2d:0d:52:14:ff:9e:ad:99:24:01:74:20:47:6e:6c:85:27:27:f5:43 -# SHA256 Fingerprint: d4:8d:3d:23:ee:db:50:a4:59:e5:51:97:60:1c:27:77:4b:9d:7b:18:c9:4d:5a:05:95:11:a1:02:50:b9:31:68 ------BEGIN CERTIFICATE----- -MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw -WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw -MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x -MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD -VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX -BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw -ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO -ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M -CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu -I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm -TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh -C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf -ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz -IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT -Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k -JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5 -hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB -GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of -1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov -L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo -dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr -aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq -hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L -6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG -HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6 -0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB -lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi -o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1 -gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v -faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63 -Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh -jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw -3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= ------END CERTIFICATE----- - -# Issuer: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI -# Subject: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI -# Label: "emSign Root CA - G1" -# Serial: 235931866688319308814040 -# MD5 Fingerprint: 9c:42:84:57:dd:cb:0b:a7:2e:95:ad:b6:f3:da:bc:ac -# SHA1 Fingerprint: 8a:c7:ad:8f:73:ac:4e:c1:b5:75:4d:a5:40:f4:fc:cf:7c:b5:8e:8c -# SHA256 Fingerprint: 40:f6:af:03:46:a9:9a:a1:cd:1d:55:5a:4e:9c:ce:62:c7:f9:63:46:03:ee:40:66:15:83:3d:c8:c8:d0:03:67 ------BEGIN CERTIFICATE----- -MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD -VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU -ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH -MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO -MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv -Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz -f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO -8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq -d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM -tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt -Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB -o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD -AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x -PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM -wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d -GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH -6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby -RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx -iN66zB+Afko= ------END CERTIFICATE----- - -# Issuer: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI -# Subject: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI -# Label: "emSign ECC Root CA - G3" -# Serial: 287880440101571086945156 -# MD5 Fingerprint: ce:0b:72:d1:9f:88:8e:d0:50:03:e8:e3:b8:8b:67:40 -# SHA1 Fingerprint: 30:43:fa:4f:f2:57:dc:a0:c3:80:ee:2e:58:ea:78:b2:3f:e6:bb:c1 -# SHA256 Fingerprint: 86:a1:ec:ba:08:9c:4a:8d:3b:be:27:34:c6:12:ba:34:1d:81:3e:04:3c:f9:e8:a8:62:cd:5c:57:a3:6b:be:6b ------BEGIN CERTIFICATE----- -MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG -EwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo -bm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g -RzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ -TjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s -b2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw -djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0 -WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS -fvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB -zhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq -hkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB -CUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD -+JbNR6iC8hZVdyR+EhCVBCyj ------END CERTIFICATE----- - -# Issuer: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI -# Subject: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI -# Label: "emSign Root CA - C1" -# Serial: 825510296613316004955058 -# MD5 Fingerprint: d8:e3:5d:01:21:fa:78:5a:b0:df:ba:d2:ee:2a:5f:68 -# SHA1 Fingerprint: e7:2e:f1:df:fc:b2:09:28:cf:5d:d4:d5:67:37:b1:51:cb:86:4f:01 -# SHA256 Fingerprint: 12:56:09:aa:30:1d:a0:a2:49:b9:7a:82:39:cb:6a:34:21:6f:44:dc:ac:9f:39:54:b1:42:92:f2:e8:c8:60:8f ------BEGIN CERTIFICATE----- -MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG -A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg -SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw -MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln -biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v -dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ -BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ -HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH -3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH -GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c -xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1 -aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq -TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL -BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87 -/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4 -kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG -YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT -+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo -WXzhriKi4gp6D/piq1JM4fHfyr6DDUI= ------END CERTIFICATE----- - -# Issuer: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI -# Subject: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI -# Label: "emSign ECC Root CA - C3" -# Serial: 582948710642506000014504 -# MD5 Fingerprint: 3e:53:b3:a3:81:ee:d7:10:f8:d3:b0:1d:17:92:f5:d5 -# SHA1 Fingerprint: b6:af:43:c2:9b:81:53:7d:f6:ef:6b:c3:1f:1f:60:15:0c:ee:48:66 -# SHA256 Fingerprint: bc:4d:80:9b:15:18:9d:78:db:3e:1d:8c:f4:f9:72:6a:79:5d:a1:64:3c:a5:f1:35:8e:1d:db:0e:dc:0d:7e:b3 ------BEGIN CERTIFICATE----- -MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG -EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx -IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw -MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln -biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND -IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci -MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti -sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O -BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB -Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c -3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J -0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== ------END CERTIFICATE----- - -# Issuer: CN=Hongkong Post Root CA 3 O=Hongkong Post -# Subject: CN=Hongkong Post Root CA 3 O=Hongkong Post -# Label: "Hongkong Post Root CA 3" -# Serial: 46170865288971385588281144162979347873371282084 -# MD5 Fingerprint: 11:fc:9f:bd:73:30:02:8a:fd:3f:f3:58:b9:cb:20:f0 -# SHA1 Fingerprint: 58:a2:d0:ec:20:52:81:5b:c1:f3:f8:64:02:24:4e:c2:8e:02:4b:02 -# SHA256 Fingerprint: 5a:2f:c0:3f:0c:83:b0:90:bb:fa:40:60:4b:09:88:44:6c:76:36:18:3d:f9:84:6e:17:10:1a:44:7f:b8:ef:d6 ------BEGIN CERTIFICATE----- -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 -mpv0 ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - G4" -# Serial: 289383649854506086828220374796556676440 -# MD5 Fingerprint: 89:53:f1:83:23:b7:7c:8e:05:f1:8c:71:38:4e:1f:88 -# SHA1 Fingerprint: 14:88:4e:86:26:37:b0:26:af:59:62:5c:40:77:ec:35:29:ba:96:01 -# SHA256 Fingerprint: db:35:17:d1:f6:73:2a:2d:5a:b9:7c:53:3e:c7:07:79:ee:32:70:a6:2f:b4:ac:42:38:37:24:60:e6:f0:1e:88 ------BEGIN CERTIFICATE----- -MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAw -gb4xCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQL -Ex9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykg -MjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAw -BgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0 -MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYTAlVT -MRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1 -c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJ -bmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3Qg -Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0MIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3DumSXbcr3DbVZwbPLqGgZ -2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV3imz/f3E -T+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j -5pds8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAM -C1rlLAHGVK/XqsEQe9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73T -DtTUXm6Hnmo9RR3RXRv06QqsYJn7ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNX -wbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5XxNMhIWNlUpEbsZmOeX7m640A -2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV7rtNOzK+mndm -nqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8 -dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwl -N4y6mACXi0mWHv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNj -c0kCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD -VR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9nMA0GCSqGSIb3DQEBCwUAA4ICAQAS -5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4QjbRaZIxowLByQzTS -Gwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht7LGr -hFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/ -B7NTeLUKYvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uI -AeV8KEsD+UmDfLJ/fOPtjqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbw -H5Lk6rWS02FREAutp9lfx1/cH6NcjKF+m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+ -b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKWRGhXxNUzzxkvFMSUHHuk -2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjAJOgc47Ol -IQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk -5F6G+TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuY -n/PIjhs4ViFqUZPTkcpG2om3PVODLAgfi49T3f+sHw== ------END CERTIFICATE----- - -# Issuer: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation -# Subject: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation -# Label: "Microsoft ECC Root Certificate Authority 2017" -# Serial: 136839042543790627607696632466672567020 -# MD5 Fingerprint: dd:a1:03:e6:4a:93:10:d1:bf:f0:19:42:cb:fe:ed:67 -# SHA1 Fingerprint: 99:9a:64:c3:7f:f4:7d:9f:ab:95:f1:47:69:89:14:60:ee:c4:c3:c5 -# SHA256 Fingerprint: 35:8d:f3:9d:76:4a:f9:e1:b7:66:e9:c9:72:df:35:2e:e1:5c:fa:c2:27:af:6a:d1:d7:0e:8e:4a:6e:dc:ba:02 ------BEGIN CERTIFICATE----- -MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQsw -CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYD -VQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIw -MTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4MjMxNjA0WjBlMQswCQYDVQQGEwJV -UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNy -b3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQBgcq -hkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZR -ogPZnZH6thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYb -hGBKia/teQ87zvH2RPUBeMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8E -BTADAQH/MB0GA1UdDgQWBBTIy5lycFIM+Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3 -FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlfXu5gKcs68tvWMoQZP3zV -L8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaReNtUjGUB -iudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= ------END CERTIFICATE----- - -# Issuer: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation -# Subject: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation -# Label: "Microsoft RSA Root Certificate Authority 2017" -# Serial: 40975477897264996090493496164228220339 -# MD5 Fingerprint: 10:ff:00:ff:cf:c9:f8:c7:7a:c0:ee:35:8e:c9:0f:47 -# SHA1 Fingerprint: 73:a5:e6:4a:3b:ff:83:16:ff:0e:dc:cc:61:8a:90:6e:4e:ae:4d:74 -# SHA256 Fingerprint: c7:41:f7:0f:4b:2a:8d:88:bf:2e:71:c1:41:22:ef:53:ef:10:eb:a0:cf:a5:e6:4c:fa:20:f4:18:85:30:73:e0 ------BEGIN CERTIFICATE----- -MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBl -MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw -NAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 -IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIwNzE4MjMwMDIzWjBlMQswCQYDVQQG -EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1N -aWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZ -Nt9GkMml7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0 -ZdDMbRnMlfl7rEqUrQ7eS0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1 -HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw71VdyvD/IybLeS2v4I2wDwAW9lcfNcztm -gGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+dkC0zVJhUXAoP8XFWvLJ -jEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49FyGcohJUc -aDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaG -YaRSMLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6 -W6IYZVcSn2i51BVrlMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4K -UGsTuqwPN1q3ErWQgR5WrlcihtnJ0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH -+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJClTUFLkqqNfs+avNJVgyeY+Q -W5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZC -LgLNFgVZJ8og6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OC -gMNPOsduET/m4xaRhPtthH80dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6 -tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk+ONVFT24bcMKpBLBaYVu32TxU5nh -SnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex/2kskZGT4d9Mozd2 -TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDyAmH3 -pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGR -xpl/j8nWZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiApp -GWSZI1b7rCoucL5mxAyE7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9 -dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKTc0QWbej09+CVgI+WXTik9KveCjCHk9hN -AHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D5KbvtwEwXlGjefVwaaZB -RA+GsCyRxj3qrg+E ------END CERTIFICATE----- - -# Issuer: CN=e-Szigno Root CA 2017 O=Microsec Ltd. -# Subject: CN=e-Szigno Root CA 2017 O=Microsec Ltd. -# Label: "e-Szigno Root CA 2017" -# Serial: 411379200276854331539784714 -# MD5 Fingerprint: de:1f:f6:9e:84:ae:a7:b4:21:ce:1e:58:7d:d1:84:98 -# SHA1 Fingerprint: 89:d4:83:03:4f:9e:9a:48:80:5f:72:37:d4:a9:a6:ef:cb:7c:1f:d1 -# SHA256 Fingerprint: be:b0:0b:30:83:9b:9b:c3:2c:32:e4:44:79:05:95:06:41:f2:64:21:b1:5e:d0:89:19:8b:51:8a:e2:ea:1b:99 ------BEGIN CERTIFICATE----- -MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNV -BAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRk -LjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJv -b3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZaFw00MjA4MjIxMjA3MDZaMHExCzAJ -BgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMg -THRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25v -IFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtv -xie+RJCxs1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+H -Wyx7xf58etqjYzBhMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBSHERUI0arBeAyxr87GyZDvvzAEwDAfBgNVHSMEGDAWgBSHERUI0arB -eAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEAtVfd14pVCzbhhkT61Nlo -jbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxOsvxyqltZ -+efcMQ== ------END CERTIFICATE----- - -# Issuer: O=CERTSIGN SA OU=certSIGN ROOT CA G2 -# Subject: O=CERTSIGN SA OU=certSIGN ROOT CA G2 -# Label: "certSIGN Root CA G2" -# Serial: 313609486401300475190 -# MD5 Fingerprint: 8c:f1:75:8a:c6:19:cf:94:b7:f7:65:20:87:c3:97:c7 -# SHA1 Fingerprint: 26:f9:93:b4:ed:3d:28:27:b0:b9:4b:a7:e9:15:1d:a3:8d:92:e5:32 -# SHA256 Fingerprint: 65:7c:fe:2f:a7:3f:aa:38:46:25:71:f3:32:a2:36:3a:46:fc:e7:02:09:51:71:07:02:cd:fb:b6:ee:da:33:05 ------BEGIN CERTIFICATE----- -MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNV -BAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04g -Uk9PVCBDQSBHMjAeFw0xNzAyMDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJ -BgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJ -R04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDF -dRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05N0Iw -vlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZ -uIt4ImfkabBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhp -n+Sc8CnTXPnGFiWeI8MgwT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKs -cpc/I1mbySKEwQdPzH/iV8oScLumZfNpdWO9lfsbl83kqK/20U6o2YpxJM02PbyW -xPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91QqhngLjYl/rNUssuHLoPj1P -rCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732jcZZroiF -DsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fx -DTvf95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgy -LcsUDFDYg2WD7rlcz8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6C -eWRgKRM+o/1Pcmqr4tTluCRVLERLiohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSCIS1mxteg4BXrzkwJ -d8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOBywaK8SJJ6ejq -kX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC -b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQl -qiCA2ClV9+BB/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0 -OJD7uNGzcgbJceaBxXntC6Z58hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+c -NywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5BiKDUyUM/FHE5r7iOZULJK2v0ZXk -ltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklWatKcsWMy5WHgUyIO -pwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tUSxfj -03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZk -PuXaTH4MNMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE -1LlSVHJ7liXMvGnjSG4N0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MX -QRBdJ3NghVdJIgc= ------END CERTIFICATE----- - -# Issuer: CN=Trustwave Global Certification Authority O=Trustwave Holdings, Inc. -# Subject: CN=Trustwave Global Certification Authority O=Trustwave Holdings, Inc. -# Label: "Trustwave Global Certification Authority" -# Serial: 1846098327275375458322922162 -# MD5 Fingerprint: f8:1c:18:2d:2f:ba:5f:6d:a1:6c:bc:c7:ab:91:c7:0e -# SHA1 Fingerprint: 2f:8f:36:4f:e1:58:97:44:21:59:87:a5:2a:9a:d0:69:95:26:7f:b5 -# SHA256 Fingerprint: 97:55:20:15:f5:dd:fc:3c:87:88:c0:06:94:45:55:40:88:94:45:00:84:f1:00:86:70:86:bc:1a:2b:b5:8d:c8 ------BEGIN CERTIFICATE----- -MIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQsw -CQYDVQQGEwJVUzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28x -ITAfBgNVBAoMGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1 -c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMx -OTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJVUzERMA8GA1UECAwI -SWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2ZSBI -b2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB -ALldUShLPDeS0YLOvR29zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0Xzn -swuvCAAJWX/NKSqIk4cXGIDtiLK0thAfLdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu -7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4BqstTnoApTAbqOl5F2brz8 -1Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9oWN0EACyW -80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotP -JqX+OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1l -RtzuzWniTY+HKE40Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfw -hI0Vcnyh78zyiGG69Gm7DIwLdVcEuE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10 -coos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm+9jaJXLE9gCxInm943xZYkqc -BW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqjifLJS3tBEW1n -twiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1Ud -DwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W -0OhUKDtkLSGm+J1WE2pIPU/HPinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfe -uyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0HZJDmHvUqoai7PF35owgLEQzxPy0Q -lG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla4gt5kNdXElE1GYhB -aCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5RvbbE -sLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPT -MaCm/zjdzyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qe -qu5AvzSxnI9O4fKSTx+O856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxh -VicGaeVyQYHTtgGJoC86cnn+OjC/QezHYj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8 -h6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu3R3y4G5OBVixwJAWKqQ9 -EEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP29FpHOTK -yeC2nOnOcXHebD8WpHk= ------END CERTIFICATE----- - -# Issuer: CN=Trustwave Global ECC P256 Certification Authority O=Trustwave Holdings, Inc. -# Subject: CN=Trustwave Global ECC P256 Certification Authority O=Trustwave Holdings, Inc. -# Label: "Trustwave Global ECC P256 Certification Authority" -# Serial: 4151900041497450638097112925 -# MD5 Fingerprint: 5b:44:e3:8d:5d:36:86:26:e8:0d:05:d2:59:a7:83:54 -# SHA1 Fingerprint: b4:90:82:dd:45:0c:be:8b:5b:b1:66:d3:e2:a4:08:26:cd:ed:42:cf -# SHA256 Fingerprint: 94:5b:bc:82:5e:a5:54:f4:89:d1:fd:51:a7:3d:df:2e:a6:24:ac:70:19:a0:52:05:22:5c:22:a7:8c:cf:a8:b4 ------BEGIN CERTIFICATE----- -MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYD -VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf -BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3 -YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x -NzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYDVQQGEwJVUzERMA8G -A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0 -d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF -Q0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqG -SM49AwEHA0IABH77bOYj43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoN -FWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqmP62jQzBBMA8GA1UdEwEB/wQFMAMBAf8w -DwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt0UrrdaVKEJmzsaGLSvcw -CgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjzRM4q3wgh -DDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7 ------END CERTIFICATE----- - -# Issuer: CN=Trustwave Global ECC P384 Certification Authority O=Trustwave Holdings, Inc. -# Subject: CN=Trustwave Global ECC P384 Certification Authority O=Trustwave Holdings, Inc. -# Label: "Trustwave Global ECC P384 Certification Authority" -# Serial: 2704997926503831671788816187 -# MD5 Fingerprint: ea:cf:60:c4:3b:b9:15:29:40:a1:97:ed:78:27:93:d6 -# SHA1 Fingerprint: e7:f3:a3:c8:cf:6f:c3:04:2e:6d:0e:67:32:c5:9e:68:95:0d:5e:d2 -# SHA256 Fingerprint: 55:90:38:59:c8:c0:c3:eb:b8:75:9e:ce:4e:25:57:22:5f:f5:75:8b:bd:38:eb:d4:82:76:60:1e:1b:d5:80:97 ------BEGIN CERTIFICATE----- -MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYD -VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf -BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3 -YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x -NzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYDVQQGEwJVUzERMA8G -A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0 -d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF -Q0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuB -BAAiA2IABGvaDXU1CDFHBa5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJ -j9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr/TklZvFe/oyujUF5nQlgziip04pt89ZF -1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNVHQ8BAf8EBQMDBwYAMB0G -A1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNnADBkAjA3 -AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsC -MGclCrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVu -Sw== ------END CERTIFICATE----- - -# Issuer: CN=NAVER Global Root Certification Authority O=NAVER BUSINESS PLATFORM Corp. -# Subject: CN=NAVER Global Root Certification Authority O=NAVER BUSINESS PLATFORM Corp. -# Label: "NAVER Global Root Certification Authority" -# Serial: 9013692873798656336226253319739695165984492813 -# MD5 Fingerprint: c8:7e:41:f6:25:3b:f5:09:b3:17:e8:46:3d:bf:d0:9b -# SHA1 Fingerprint: 8f:6b:f2:a9:27:4a:da:14:a0:c4:f4:8e:61:27:f9:c0:1e:78:5d:d1 -# SHA256 Fingerprint: 88:f4:38:dc:f8:ff:d1:fa:8f:42:91:15:ff:e5:f8:2a:e1:e0:6e:0c:70:c3:75:fa:ad:71:7b:34:a4:9e:72:65 ------BEGIN CERTIFICATE----- -MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEM -BQAwaTELMAkGA1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRG -T1JNIENvcnAuMTIwMAYDVQQDDClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4NDJaFw0zNzA4MTgyMzU5NTlaMGkx -CzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVTUyBQTEFURk9STSBD -b3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVA -iQqrDZBbUGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH -38dq6SZeWYp34+hInDEW+j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lE -HoSTGEq0n+USZGnQJoViAbbJAh2+g1G7XNr4rRVqmfeSVPc0W+m/6imBEtRTkZaz -kVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2aacp+yPOiNgSnABIqKYP -szuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4Yb8Obtoq -vC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHf -nZ3zVHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaG -YQ5fG8Ir4ozVu53BA0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo -0es+nPxdGoMuK8u180SdOqcXYZaicdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3a -CJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejyYhbLgGvtPe31HzClrkvJE+2K -AQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNVHQ4EFgQU0p+I -36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB -Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoN -qo0hV4/GPnrK21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatj -cu3cvuzHV+YwIHHW1xDBE1UBjCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm -+LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bxhYTeodoS76TiEJd6eN4MUZeoIUCL -hr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTgE34h5prCy8VCZLQe -lHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTHD8z7 -p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8 -piKCk5XQA76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLR -LBT/DShycpWbXgnbiUSYqqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX -5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oGI/hGoiLtk/bdmuYqh7GYVPEi92tF4+KO -dh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmgkpzNNIaRkPpkUZ3+/uul -9XXeifdy ------END CERTIFICATE----- - -# Issuer: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS O=FNMT-RCM OU=Ceres -# Subject: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS O=FNMT-RCM OU=Ceres -# Label: "AC RAIZ FNMT-RCM SERVIDORES SEGUROS" -# Serial: 131542671362353147877283741781055151509 -# MD5 Fingerprint: 19:36:9c:52:03:2f:d2:d1:bb:23:cc:dd:1e:12:55:bb -# SHA1 Fingerprint: 62:ff:d9:9e:c0:65:0d:03:ce:75:93:d2:ed:3f:2d:32:c9:e3:e5:4a -# SHA256 Fingerprint: 55:41:53:b1:3d:2c:f9:dd:b7:53:bf:be:1a:4e:0a:e0:8d:0a:a4:18:70:58:fe:60:a2:b8:62:b2:e4:b8:7b:cb ------BEGIN CERTIFICATE----- -MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQsw -CQYDVQQGEwJFUzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgw -FgYDVQRhDA9WQVRFUy1RMjgyNjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1S -Q00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4MTIyMDA5MzczM1oXDTQzMTIyMDA5 -MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQtUkNNMQ4wDAYDVQQL -DAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNBQyBS -QUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuB -BAAiA2IABPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LH -sbI6GA60XYyzZl2hNPk2LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oK -Um8BA06Oi6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD -VR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqGSM49BAMDA2kAMGYCMQCu -SuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoDzBOQn5IC -MQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJy -v+c= ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign Root R46 O=GlobalSign nv-sa -# Subject: CN=GlobalSign Root R46 O=GlobalSign nv-sa -# Label: "GlobalSign Root R46" -# Serial: 1552617688466950547958867513931858518042577 -# MD5 Fingerprint: c4:14:30:e4:fa:66:43:94:2a:6a:1b:24:5f:19:d0:ef -# SHA1 Fingerprint: 53:a2:b0:4b:ca:6b:d6:45:e6:39:8a:8e:c4:0d:d2:bf:77:c3:a2:90 -# SHA256 Fingerprint: 4f:a3:12:6d:8d:3a:11:d1:c4:85:5a:4f:80:7c:ba:d6:cf:91:9d:3a:5a:88:b0:3b:ea:2c:63:72:d9:3c:40:c9 ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUA -MEYxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYD -VQQDExNHbG9iYWxTaWduIFJvb3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMy -MDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYt -c2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08EsCVeJ -OaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQG -vGIFAha/r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud -316HCkD7rRlr+/fKYIje2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo -0q3v84RLHIf8E6M6cqJaESvWJ3En7YEtbWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSE -y132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvjK8Cd+RTyG/FWaha/LIWF -zXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD412lPFzYE -+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCN -I/onccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzs -x2sZy/N78CsHpdlseVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqa -ByFrgY/bxFn63iLABJzjqls2k+g9vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC -4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEMBQADggIBAHx4 -7PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg -JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti -2kM3S+LGteWygxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIk -pnnpHs6i58FZFZ8d4kuaPp92CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRF -FRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZmOUdkLG5NrmJ7v2B0GbhWrJKsFjLt -rWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qqJZ4d16GLuc1CLgSk -ZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwyeqiv5 -u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP -4vkYxboznxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6 -N3ec592kD3ZDZopD8p/7DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3 -vouXsXgxT7PntgMTzlSdriVZzH81Xwj3QEUxeCp6 ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign Root E46 O=GlobalSign nv-sa -# Subject: CN=GlobalSign Root E46 O=GlobalSign nv-sa -# Label: "GlobalSign Root E46" -# Serial: 1552617690338932563915843282459653771421763 -# MD5 Fingerprint: b5:b8:66:ed:de:08:83:e3:c9:e2:01:34:06:ac:51:6f -# SHA1 Fingerprint: 39:b4:6c:d5:fe:80:06:eb:e2:2f:4a:bb:08:33:a0:af:db:b9:dd:84 -# SHA256 Fingerprint: cb:b9:c4:4d:84:b8:04:3e:10:50:ea:31:a6:9f:51:49:55:d7:bf:d2:e2:c6:b4:93:01:01:9a:d6:1d:9f:50:58 ------BEGIN CERTIFICATE----- -MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYx -CzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQD -ExNHbG9iYWxTaWduIFJvb3QgRTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAw -MDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2Ex -HDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkBjtjq -R+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGdd -yXqBPCCjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud -DgQWBBQxCpCPtsad0kRLgLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ -7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZkvLtoURMMA/cVi4RguYv/Uo7njLwcAjA8 -+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+CAezNIm8BZ/3Hobui3A= ------END CERTIFICATE----- - -# Issuer: CN=GLOBALTRUST 2020 O=e-commerce monitoring GmbH -# Subject: CN=GLOBALTRUST 2020 O=e-commerce monitoring GmbH -# Label: "GLOBALTRUST 2020" -# Serial: 109160994242082918454945253 -# MD5 Fingerprint: 8a:c7:6f:cb:6d:e3:cc:a2:f1:7c:83:fa:0e:78:d7:e8 -# SHA1 Fingerprint: d0:67:c1:13:51:01:0c:aa:d0:c7:6a:65:37:31:16:26:4f:53:71:a2 -# SHA256 Fingerprint: 9a:29:6a:51:82:d1:d4:51:a2:e3:7f:43:9b:74:da:af:a2:67:52:33:29:f9:0f:9a:0d:20:07:c3:34:e2:3c:9a ------BEGIN CERTIFICATE----- -MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkG -A1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkw -FwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYx -MDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9u -aXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMIICIjANBgkq -hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWiD59b -RatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9Z -YybNpyrOVPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3 -QWPKzv9pj2gOlTblzLmMCcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPw -yJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCmfecqQjuCgGOlYx8ZzHyyZqjC0203b+J+ -BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKAA1GqtH6qRNdDYfOiaxaJ -SaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9ORJitHHmkH -r96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj0 -4KlGDfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9Me -dKZssCz3AwyIDMvUclOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIw -q7ejMZdnrY8XD2zHc+0klGvIg5rQmjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2 -nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1UdIwQYMBaAFNwu -H9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA -VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJC -XtzoRlgHNQIw4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd -6IwPS3BD0IL/qMy/pJTAvoe9iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf -+I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS8cE54+X1+NZK3TTN+2/BT+MAi1bi -kvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2HcqtbepBEX4tdJP7 -wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxSvTOB -TI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6C -MUO+1918oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn -4rnvyOL2NSl6dPrFf4IFYqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+I -aFvowdlxfv1k7/9nR4hYJS8+hge9+6jlgqispdNpQ80xiEmEU5LAsTkbOYMBMMTy -qfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg== ------END CERTIFICATE----- - -# Issuer: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz -# Subject: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz -# Label: "ANF Secure Server Root CA" -# Serial: 996390341000653745 -# MD5 Fingerprint: 26:a6:44:5a:d9:af:4e:2f:b2:1d:b6:65:b0:4e:e8:96 -# SHA1 Fingerprint: 5b:6e:68:d0:cc:15:b6:a0:5f:1e:c1:5f:ae:02:fc:6b:2f:5d:6f:74 -# SHA256 Fingerprint: fb:8f:ec:75:91:69:b9:10:6b:1e:51:16:44:c6:18:c5:13:04:37:3f:6c:06:43:08:8d:8b:ef:fd:1b:99:75:99 ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=Certum EC-384 CA O=Asseco Data Systems S.A. OU=Certum Certification Authority -# Subject: CN=Certum EC-384 CA O=Asseco Data Systems S.A. OU=Certum Certification Authority -# Label: "Certum EC-384 CA" -# Serial: 160250656287871593594747141429395092468 -# MD5 Fingerprint: b6:65:b3:96:60:97:12:a1:ec:4e:e1:3d:a3:c6:c9:f1 -# SHA1 Fingerprint: f3:3e:78:3c:ac:df:f4:a2:cc:ac:67:55:69:56:d7:e5:16:3c:e1:ed -# SHA256 Fingerprint: 6b:32:80:85:62:53:18:aa:50:d1:73:c9:8d:8b:da:09:d5:7e:27:41:3d:11:4c:f7:87:a0:f5:d0:6c:03:0c:f6 ------BEGIN CERTIFICATE----- -MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQsw -CQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScw -JQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMT -EENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2MDcyNDU0WhcNNDMwMzI2MDcyNDU0 -WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBT -LkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAX -BgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATE -KI6rGFtqvm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7Tm -Fy8as10CW4kjPMIRBSqniBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68Kj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI0GZnQkdjrzife81r1HfS+8 -EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNoADBlAjADVS2m5hjEfO/J -UG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0QoSZ/6vn -nvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k= ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Root CA O=Asseco Data Systems S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Root CA O=Asseco Data Systems S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Root CA" -# Serial: 40870380103424195783807378461123655149 -# MD5 Fingerprint: 51:e1:c2:e7:fe:4c:84:af:59:0e:2f:f4:54:6f:ea:29 -# SHA1 Fingerprint: c8:83:44:c0:18:ae:9f:cc:f1:87:b7:8f:22:d1:c5:d7:45:84:ba:e5 -# SHA256 Fingerprint: fe:76:96:57:38:55:77:3e:37:a9:5e:7a:d4:d9:cc:96:c3:01:57:c1:5d:31:76:5b:a9:b1:57:04:e1:ae:78:fd ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=TunTrust Root CA O=Agence Nationale de Certification Electronique -# Subject: CN=TunTrust Root CA O=Agence Nationale de Certification Electronique -# Label: "TunTrust Root CA" -# Serial: 108534058042236574382096126452369648152337120275 -# MD5 Fingerprint: 85:13:b9:90:5b:36:5c:b6:5e:b8:5a:f8:e0:31:57:b4 -# SHA1 Fingerprint: cf:e9:70:84:0f:e0:73:0f:9d:f6:0c:7f:2c:4b:ee:20:46:34:9c:bb -# SHA256 Fingerprint: 2e:44:10:2a:b5:8c:b8:54:19:45:1c:8e:19:d9:ac:f3:66:2c:af:bc:61:4b:6a:53:96:0a:30:f7:d0:e2:eb:41 ------BEGIN CERTIFICATE----- -MIIFszCCA5ugAwIBAgIUEwLV4kBMkkaGFmddtLu7sms+/BMwDQYJKoZIhvcNAQEL -BQAwYTELMAkGA1UEBhMCVE4xNzA1BgNVBAoMLkFnZW5jZSBOYXRpb25hbGUgZGUg -Q2VydGlmaWNhdGlvbiBFbGVjdHJvbmlxdWUxGTAXBgNVBAMMEFR1blRydXN0IFJv -b3QgQ0EwHhcNMTkwNDI2MDg1NzU2WhcNNDQwNDI2MDg1NzU2WjBhMQswCQYDVQQG -EwJUTjE3MDUGA1UECgwuQWdlbmNlIE5hdGlvbmFsZSBkZSBDZXJ0aWZpY2F0aW9u -IEVsZWN0cm9uaXF1ZTEZMBcGA1UEAwwQVHVuVHJ1c3QgUm9vdCBDQTCCAiIwDQYJ -KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMPN0/y9BFPdDCA61YguBUtB9YOCfvdZ -n56eY+hz2vYGqU8ftPkLHzmMmiDQfgbU7DTZhrx1W4eI8NLZ1KMKsmwb60ksPqxd -2JQDoOw05TDENX37Jk0bbjBU2PWARZw5rZzJJQRNmpA+TkBuimvNKWfGzC3gdOgF -VwpIUPp6Q9p+7FuaDmJ2/uqdHYVy7BG7NegfJ7/Boce7SBbdVtfMTqDhuazb1YMZ -GoXRlJfXyqNlC/M4+QKu3fZnz8k/9YosRxqZbwUN/dAdgjH8KcwAWJeRTIAAHDOF -li/LQcKLEITDCSSJH7UP2dl3RxiSlGBcx5kDPP73lad9UKGAwqmDrViWVSHbhlnU -r8a83YFuB9tgYv7sEG7aaAH0gxupPqJbI9dkxt/con3YS7qC0lH4Zr8GRuR5KiY2 -eY8fTpkdso8MDhz/yV3A/ZAQprE38806JG60hZC/gLkMjNWb1sjxVj8agIl6qeIb -MlEsPvLfe/ZdeikZjuXIvTZxi11Mwh0/rViizz1wTaZQmCXcI/m4WEEIcb9PuISg -jwBUFfyRbVinljvrS5YnzWuioYasDXxU5mZMZl+QviGaAkYt5IPCgLnPSz7ofzwB -7I9ezX/SKEIBlYrilz0QIX32nRzFNKHsLA4KUiwSVXAkPcvCFDVDXSdOvsC9qnyW -5/yeYa1E0wCXAgMBAAGjYzBhMB0GA1UdDgQWBBQGmpsfU33x9aTI04Y+oXNZtPdE -ITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFAaamx9TffH1pMjThj6hc1m0 -90QhMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAqgVutt0Vyb+z -xiD2BkewhpMl0425yAA/l/VSJ4hxyXT968pk21vvHl26v9Hr7lxpuhbI87mP0zYu -QEkHDVneixCwSQXi/5E/S7fdAo74gShczNxtr18UnH1YeA32gAm56Q6XKRm4t+v4 -FstVEuTGfbvE7Pi1HE4+Z7/FXxttbUcoqgRYYdZ2vyJ/0Adqp2RT8JeNnYA/u8EH -22Wv5psymsNUk8QcCMNE+3tjEUPRahphanltkE8pjkcFwRJpadbGNjHh/PqAulxP -xOu3Mqz4dWEX1xAZufHSCe96Qp1bWgvUxpVOKs7/B9dPfhgGiPEZtdmYu65xxBzn -dFlY7wyJz4sfdZMaBBSSSFCp61cpABbjNhzI+L/wM9VBD8TMPN3pM0MBkRArHtG5 -Xc0yGYuPjCB31yLEQtyEFpslbei0VXF/sHyz03FJuc9SpAQ/3D2gu68zngowYI7b -nV2UqL1g52KAdoGDDIzMMEZJ4gzSqK/rYXHv5yJiqfdcZGyfFoxnNidF9Ql7v/YQ -CvGwjVRDjAS6oz/v4jXH+XTgbzRB0L9zZVcg+ZtnemZoJE6AZb0QmQZZ8mWvuMZH -u/2QeItBcy6vVR/cO5JyboTT0GFMDcx2V+IthSIVNg3rAZ3r2OvEhJn7wAzMMujj -d9qDRIueVSjAi1jTkD5OGwDxFa2DK5o= ------END CERTIFICATE----- - -# Issuer: CN=HARICA TLS RSA Root CA 2021 O=Hellenic Academic and Research Institutions CA -# Subject: CN=HARICA TLS RSA Root CA 2021 O=Hellenic Academic and Research Institutions CA -# Label: "HARICA TLS RSA Root CA 2021" -# Serial: 76817823531813593706434026085292783742 -# MD5 Fingerprint: 65:47:9b:58:86:dd:2c:f0:fc:a2:84:1f:1e:96:c4:91 -# SHA1 Fingerprint: 02:2d:05:82:fa:88:ce:14:0c:06:79:de:7f:14:10:e9:45:d7:a5:6d -# SHA256 Fingerprint: d9:5d:0e:8e:da:79:52:5b:f9:be:b1:1b:14:d2:10:0d:32:94:98:5f:0c:62:d9:fa:bd:9c:d9:99:ec:cb:7b:1d ------BEGIN CERTIFICATE----- -MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBs -MQswCQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0Eg -Um9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUzOFoXDTQ1MDIxMzEwNTUzN1owbDEL -MAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl -YXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNBIFJv -b3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569l -mwVnlskNJLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE -4VGC/6zStGndLuwRo0Xua2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uv -a9of08WRiFukiZLRgeaMOVig1mlDqa2YUlhu2wr7a89o+uOkXjpFc5gH6l8Cct4M -pbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K5FrZx40d/JiZ+yykgmvw -Kh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEvdmn8kN3b -LW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcY -AuUR0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqB -AGMUuTNe3QvboEUHGjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYq -E613TBoYm5EPWNgGVMWX+Ko/IIqmhaZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHr -W2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQCPxrvrNQKlr9qEgYRtaQQJKQ -CoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE -AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAU -X15QvWiWkKQUEapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3 -f5Z2EMVGpdAgS1D0NTsY9FVqQRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxaja -H6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxDQpSbIPDRzbLrLFPCU3hKTwSUQZqP -JzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcRj88YxeMn/ibvBZ3P -zzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5vZSt -jBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0 -/L5H9MG0qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pT -BGIBnfHAT+7hOtSLIBD6Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79 -aPib8qXPMThcFarmlwDB31qlpzmq6YR/PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YW -xw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnnkf3/W9b3raYvAwtt41dU -63ZTGI0RmLo= ------END CERTIFICATE----- - -# Issuer: CN=HARICA TLS ECC Root CA 2021 O=Hellenic Academic and Research Institutions CA -# Subject: CN=HARICA TLS ECC Root CA 2021 O=Hellenic Academic and Research Institutions CA -# Label: "HARICA TLS ECC Root CA 2021" -# Serial: 137515985548005187474074462014555733966 -# MD5 Fingerprint: ae:f7:4c:e5:66:35:d1:b7:9b:8c:22:93:74:d3:4b:b0 -# SHA1 Fingerprint: bc:b0:c1:9d:e9:98:92:70:19:38:57:e9:8d:a7:b4:5d:6e:ee:01:48 -# SHA256 Fingerprint: 3f:99:cc:47:4a:cf:ce:4d:fe:d5:87:94:66:5e:47:8d:15:47:73:9f:2e:78:0f:1b:b4:ca:9b:13:30:97:d4:01 ------BEGIN CERTIFICATE----- -MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQsw -CQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2Vh -cmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9v -dCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoXDTQ1MDIxMzExMDEwOVowbDELMAkG -A1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj -aCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJvb3Qg -Q0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7 -KKrxcm1lAEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9Y -STHMmE5gEYd103KUkE+bECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQD -AgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAircJRQO9gcS3ujwLEXQNw -SaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/QwCZ61IygN -nxS2PFOiTAZpffpskcYqSUXm7LcT4Tps ------END CERTIFICATE----- - -# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" -# Serial: 1977337328857672817 -# MD5 Fingerprint: 4e:6e:9b:54:4c:ca:b7:fa:48:e4:90:b1:15:4b:1c:a3 -# SHA1 Fingerprint: 0b:be:c2:27:22:49:cb:39:aa:db:35:5c:53:e3:8c:ae:78:ff:b6:fe -# SHA256 Fingerprint: 57:de:05:83:ef:d2:b2:6e:03:61:da:99:da:9d:f4:64:8d:ef:7e:e8:44:1c:3b:72:8a:fa:9b:cd:e0:f9:b2:6a ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UE -BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h -cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1 -MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg -Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 -thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM -cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG -L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i -NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h -X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b -m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy -Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja -EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T -KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF -6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh -OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1UdDgQWBBRlzeurNR4APn7VdMAc -tHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4wgZswgZgGBFUd -IAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j -b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABC -AG8AbgBhAG4AbwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAw -ADEANzAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9m -iWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL4QjbEwj4KKE1soCzC1HA01aajTNF -Sa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDbLIpgD7dvlAceHabJ -hfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1ilI45P -Vf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZE -EAEeiGaPcjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV -1aUsIC+nmCjuRfzxuIgALI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2t -CsvMo2ebKHTEm9caPARYpoKdrcd7b/+Alun4jWq9GJAd/0kakFI3ky88Al2CdgtR -5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH9IBk9W6VULgRfhVwOEqw -f9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpfNIbnYrX9 -ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNK -GbqEZycPvEJdvSRUDewdcAZfpLz6IHxV ------END CERTIFICATE----- - -# Issuer: CN=vTrus ECC Root CA O=iTrusChina Co.,Ltd. -# Subject: CN=vTrus ECC Root CA O=iTrusChina Co.,Ltd. -# Label: "vTrus ECC Root CA" -# Serial: 630369271402956006249506845124680065938238527194 -# MD5 Fingerprint: de:4b:c1:f5:52:8c:9b:43:e1:3e:8f:55:54:17:8d:85 -# SHA1 Fingerprint: f6:9c:db:b0:fc:f6:02:13:b6:52:32:a6:a3:91:3f:16:70:da:c3:e1 -# SHA256 Fingerprint: 30:fb:ba:2c:32:23:8e:2a:98:54:7a:f9:79:31:e5:50:42:8b:9b:3f:1c:8e:eb:66:33:dc:fa:86:c5:b2:7d:d3 ------BEGIN CERTIFICATE----- -MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMw -RzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAY -BgNVBAMTEXZUcnVzIEVDQyBSb290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDcz -MTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28u -LEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYwEAYHKoZIzj0CAQYF -K4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+cToL0 -v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUd -e4BdS49nTPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIw -V53dVvHH4+m4SVBrm2nDb+zDfSXkV5UTQJtS0zvzQBm8JsctBp61ezaf9SXUY2sA -AjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQLYgmRWAD5Tfs0aNoJrSEG -GJTO ------END CERTIFICATE----- - -# Issuer: CN=vTrus Root CA O=iTrusChina Co.,Ltd. -# Subject: CN=vTrus Root CA O=iTrusChina Co.,Ltd. -# Label: "vTrus Root CA" -# Serial: 387574501246983434957692974888460947164905180485 -# MD5 Fingerprint: b8:c9:37:df:fa:6b:31:84:64:c5:ea:11:6a:1b:75:fc -# SHA1 Fingerprint: 84:1a:69:fb:f5:cd:1a:25:34:13:3d:e3:f8:fc:b8:99:d0:c9:14:b7 -# SHA256 Fingerprint: 8a:71:de:65:59:33:6f:42:6c:26:e5:38:80:d0:0d:88:a1:8d:a4:c6:a9:1f:0d:cb:61:94:e2:06:c5:c9:63:87 ------BEGIN CERTIFICATE----- -MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQEL -BQAwQzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4x -FjAUBgNVBAMTDXZUcnVzIFJvb3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMx -MDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoGA1UEChMTaVRydXNDaGluYSBDby4s -THRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZotsSKYc -IrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykU -AyyNJJrIZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+ -GrPSbcKvdmaVayqwlHeFXgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z9 -8Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KAYPxMvDVTAWqXcoKv8R1w6Jz1717CbMdH -flqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70kLJrxLT5ZOrpGgrIDajt -J8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2AXPKBlim -0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZN -pGvu/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQ -UqqzApVg+QxMaPnu1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHW -OXSuTEGC2/KmSNGzm/MzqvOmwMVO9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMB -AAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYgscasGrz2iTAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAKbqSSaet -8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd -nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1j -bhd47F18iMjrjld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvM -Kar5CKXiNxTKsbhm7xqC5PD48acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIiv -TDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJnxDHO2zTlJQNgJXtxmOTAGytfdELS -S8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554WgicEFOwE30z9J4nfr -I8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4sEb9 -b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNB -UvupLnKWnyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1P -Ti07NEPhmg4NpGaXutIcSkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929ven -sBxXVsFy6K2ir40zSbofitzmdHxghm+Hl3s= ------END CERTIFICATE----- - -# Issuer: CN=ISRG Root X2 O=Internet Security Research Group -# Subject: CN=ISRG Root X2 O=Internet Security Research Group -# Label: "ISRG Root X2" -# Serial: 87493402998870891108772069816698636114 -# MD5 Fingerprint: d3:9e:c4:1e:23:3c:a6:df:cf:a3:7e:6d:e0:14:e6:e5 -# SHA1 Fingerprint: bd:b1:b9:3c:d5:97:8d:45:c6:26:14:55:f8:db:95:c7:5a:d1:53:af -# SHA256 Fingerprint: 69:72:9b:8e:15:a8:6e:fc:17:7a:57:af:b7:17:1d:fc:64:ad:d2:8c:2f:ca:8c:f1:50:7e:34:45:3c:cb:14:70 ------BEGIN CERTIFICATE----- -MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQsw -CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg -R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00 -MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5ldCBT -ZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNSRyBSb290IFgyMHYw -EAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0HttwW -+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9 -ItgKbppbd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zAdBgNVHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZI -zj0EAwMDaAAwZQIwe3lORlCEwkSHRhtFcP9Ymd70/aTSVaYgLXTWNLxBo1BfASdW -tL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1 -/q4AaOeMSQ+2b1tbFfLn ------END CERTIFICATE----- - -# Issuer: CN=HiPKI Root CA - G1 O=Chunghwa Telecom Co., Ltd. -# Subject: CN=HiPKI Root CA - G1 O=Chunghwa Telecom Co., Ltd. -# Label: "HiPKI Root CA - G1" -# Serial: 60966262342023497858655262305426234976 -# MD5 Fingerprint: 69:45:df:16:65:4b:e8:68:9a:8f:76:5f:ff:80:9e:d3 -# SHA1 Fingerprint: 6a:92:e4:a8:ee:1b:ec:96:45:37:e3:29:57:49:cd:96:e3:e5:d2:60 -# SHA256 Fingerprint: f0:15:ce:3c:c2:39:bf:ef:06:4b:e9:f1:d2:c4:17:e1:a0:26:4a:0a:94:be:1f:0c:8d:12:18:64:eb:69:49:cc ------BEGIN CERTIFICATE----- -MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBP -MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 -ZC4xGzAZBgNVBAMMEkhpUEtJIFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRa -Fw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3 -YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kgUm9vdCBDQSAtIEcx -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0o9Qw -qNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twv -Vcg3Px+kwJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6 -lZgRZq2XNdZ1AYDgr/SEYYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnz -Qs7ZngyzsHeXZJzA9KMuH5UHsBffMNsAGJZMoYFL3QRtU6M9/Aes1MU3guvklQgZ -KILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfdhSi8MEyr48KxRURHH+CK -FgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj1jOXTyFj -HluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDr -y+K49a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ -/W3c1pzAtH2lsN0/Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgM -a/aOEmem8rJY5AIJEzypuxC00jBF8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6 -fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQDAgGGMA0GCSqG -SIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi -7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqc -SE5XCV0vrPSltJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6Fza -ZsT0pPBWGTMpWmWSBUdGSquEwx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9Tc -XzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07QJNBAsNB1CI69aO4I1258EHBGG3zg -iLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv5wiZqAxeJoBF1Pho -L5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+GpzjLrF -Ne85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wr -kkVbbiVghUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+ -vhV4nYWBSipX3tUZQ9rbyltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQU -YDksswBVLuT1sw5XxJFBAJw/6KXf6vb/yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ== ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Label: "GlobalSign ECC Root CA - R4" -# Serial: 159662223612894884239637590694 -# MD5 Fingerprint: 26:29:f8:6d:e1:88:bf:a2:65:7f:aa:c4:cd:0f:7f:fc -# SHA1 Fingerprint: 6b:a0:b0:98:e1:71:ef:5a:ad:fe:48:15:80:77:10:f4:bd:6f:0b:28 -# SHA256 Fingerprint: b0:85:d7:0b:96:4f:19:1a:73:e4:af:0d:54:ae:7a:0e:07:aa:fd:af:9b:71:dd:08:62:13:8a:b7:32:5a:24:a2 ------BEGIN CERTIFICATE----- -MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYD -VQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2Jh -bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgw -MTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0g -UjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wWTAT -BgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkWymOx -uYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNV -HQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/ -+wpu+74zyTyjhNUwCgYIKoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147 -bmF0774BxL4YSFlhgjICICadVGNA3jdgUM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R1 O=Google Trust Services LLC -# Subject: CN=GTS Root R1 O=Google Trust Services LLC -# Label: "GTS Root R1" -# Serial: 159662320309726417404178440727 -# MD5 Fingerprint: 05:fe:d0:bf:71:a8:a3:76:63:da:01:e0:d8:52:dc:40 -# SHA1 Fingerprint: e5:8c:1c:c4:91:3b:38:63:4b:e9:10:6e:e3:ad:8e:6b:9d:d9:81:4a -# SHA256 Fingerprint: d9:47:43:2a:bd:e7:b7:fa:90:fc:2e:6b:59:10:1b:12:80:e0:e1:c7:e4:e4:0f:a3:c6:88:7f:ff:57:a7:f4:cf ------BEGIN CERTIFICATE----- -MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw -MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaMf/vo -27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7w -Cl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjw -TcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0Pfybl -qAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaH -szVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4Zor8 -Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUspzBmk -MiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92 -wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70p -aDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrN -VjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQID -AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBAJ+qQibb -C5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe -QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuy -h6f88/qBVRRiClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM4 -7HLwEXWdyzRSjeZ2axfG34arJ45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8J -ZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYciNuaCp+0KueIHoI17eko8cdLiA6Ef -MgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5meLMFrUKTX5hgUvYU/ -Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJFfbdT -6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ -0E6yove+7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm -2tIMPNuzjsmhDYAPexZ3FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bb -bP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3gm3c ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R2 O=Google Trust Services LLC -# Subject: CN=GTS Root R2 O=Google Trust Services LLC -# Label: "GTS Root R2" -# Serial: 159662449406622349769042896298 -# MD5 Fingerprint: 1e:39:c0:53:e6:1e:29:82:0b:ca:52:55:36:5d:57:dc -# SHA1 Fingerprint: 9a:44:49:76:32:db:de:fa:d0:bc:fb:5a:7b:17:bd:9e:56:09:24:94 -# SHA256 Fingerprint: 8d:25:cd:97:22:9d:bf:70:35:6b:da:4e:b3:cc:73:40:31:e2:4c:f0:0f:af:cf:d3:2d:c7:6e:b5:84:1c:7e:a8 ------BEGIN CERTIFICATE----- -MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw -MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3LvCvpt -nfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY -6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAu -MC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7k -RXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXuPuWg -f9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1mKPV -+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K8Yzo -dDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RW -Ir9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKa -G73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCq -gc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwID -AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBAB/Kzt3H -vqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8 -0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyC -B19m3H0Q/gxhswWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2u -NmSRXbBoGOqKYcl3qJfEycel/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMg -yALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVnjWQye+mew4K6Ki3pHrTgSAai/Gev -HyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y59PYjJbigapordwj6 -xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M7YNR -TOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924Sg -JPFI/2R80L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV -7LXTWtiBmelDGDfrs7vRWGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl -6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjWHYbL ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R3 O=Google Trust Services LLC -# Subject: CN=GTS Root R3 O=Google Trust Services LLC -# Label: "GTS Root R3" -# Serial: 159662495401136852707857743206 -# MD5 Fingerprint: 3e:e7:9d:58:02:94:46:51:94:e5:e0:22:4a:8b:e7:73 -# SHA1 Fingerprint: ed:e5:71:80:2b:c8:92:b9:5b:83:3c:d2:32:68:3f:09:cd:a0:1e:46 -# SHA256 Fingerprint: 34:d8:a7:3e:e2:08:d9:bc:db:0d:95:65:20:93:4b:4e:40:e6:94:82:59:6e:8b:6f:73:c8:42:6b:01:0a:6f:48 ------BEGIN CERTIFICATE----- -MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYD -VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG -A1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw -WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz -IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQAIgNi -AAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout736G -jOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL2 -4CejQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7 -VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azTL818+FsuVbu/3ZL3pAzcMeGiAjEA/Jdm -ZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV11RZt+cRLInUue4X ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R4 O=Google Trust Services LLC -# Subject: CN=GTS Root R4 O=Google Trust Services LLC -# Label: "GTS Root R4" -# Serial: 159662532700760215368942768210 -# MD5 Fingerprint: 43:96:83:77:19:4d:76:b3:9d:65:52:e4:1d:22:a5:e8 -# SHA1 Fingerprint: 77:d3:03:67:b5:e0:0c:15:f6:0c:38:61:df:7c:e1:3b:92:46:4d:47 -# SHA256 Fingerprint: 34:9d:fa:40:58:c5:e2:63:12:3b:39:8a:e7:95:57:3c:4e:13:13:c8:3f:e6:8f:93:55:6c:d5:e8:03:1b:3c:7d ------BEGIN CERTIFICATE----- -MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYD -VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG -A1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw -WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz -IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi -AATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzuhXyi -QHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvR -HYqjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D -9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/Cr8deVl5c1RxYIigL9zC2L7F8AjEA8GE8 -p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh4rsUecrNIdSUtUlD ------END CERTIFICATE----- - -# Issuer: CN=Telia Root CA v2 O=Telia Finland Oyj -# Subject: CN=Telia Root CA v2 O=Telia Finland Oyj -# Label: "Telia Root CA v2" -# Serial: 7288924052977061235122729490515358 -# MD5 Fingerprint: 0e:8f:ac:aa:82:df:85:b1:f4:dc:10:1c:fc:99:d9:48 -# SHA1 Fingerprint: b9:99:cd:d1:73:50:8a:c4:47:05:08:9c:8c:88:fb:be:a0:2b:40:cd -# SHA256 Fingerprint: 24:2b:69:74:2f:cb:1e:5b:2a:bf:98:89:8b:94:57:21:87:54:4e:5b:4d:99:11:78:65:73:62:1f:6a:74:b8:2c ------BEGIN CERTIFICATE----- -MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQx -CzAJBgNVBAYTAkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UE -AwwQVGVsaWEgUm9vdCBDQSB2MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1 -NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZ -MBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ76zBq -AMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9 -vVYiQJ3q9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9 -lRdU2HhE8Qx3FZLgmEKnpNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTOD -n3WhUidhOPFZPY5Q4L15POdslv5e2QJltI5c0BE0312/UqeBAMN/mUWZFdUXyApT -7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW5olWK8jjfN7j/4nlNW4o -6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNrRBH0pUPC -TEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6 -WT0EBXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63R -DolUK5X6wK0dmBR4M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZI -pEYslOqodmJHixBTB0hXbOKSTbauBcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGj -YzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7Wxy+G2CQ5MB0GA1UdDgQWBBRy -rOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw -AwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ -8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi -0f6X+J8wfBj5tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMM -A8iZGok1GTzTyVR8qPAs5m4HeW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBS -SRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+Cy748fdHif64W1lZYudogsYMVoe+K -TTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygCQMez2P2ccGrGKMOF -6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15h2Er -3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMt -Ty3EHD70sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pT -VmBds9hCG1xLEooc6+t9xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAW -ysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQraVplI/owd8k+BsHMYeB2F326CjYSlKA -rBPuUBQemMc= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST BR Root CA 1 2020 O=D-Trust GmbH -# Subject: CN=D-TRUST BR Root CA 1 2020 O=D-Trust GmbH -# Label: "D-TRUST BR Root CA 1 2020" -# Serial: 165870826978392376648679885835942448534 -# MD5 Fingerprint: b5:aa:4b:d5:ed:f7:e3:55:2e:8f:72:0a:f3:75:b8:ed -# SHA1 Fingerprint: 1f:5b:98:f0:e3:b5:f7:74:3c:ed:e6:b0:36:7d:32:cd:f4:09:41:67 -# SHA256 Fingerprint: e5:9a:aa:81:60:09:c2:2b:ff:5b:25:ba:d3:7d:f3:06:f0:49:79:7c:1f:81:d8:5a:b0:89:e6:57:bd:8f:00:44 ------BEGIN CERTIFICATE----- -MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQsw -CQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRS -VVNUIEJSIFJvb3QgQ0EgMSAyMDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5 -NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAG -A1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAGByqGSM49AgEGBSuB -BAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7dPYS -zuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0 -QVK5buXuQqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/ -VbNafAkl1bK6CKBrqx9tMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6g -PKA6hjhodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X2JyX3Jvb3Rf -Y2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5l -dC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxPPUQtVHJ1 -c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjO -PQQDAwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFW -wKrY7RjEsK70PvomAjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHV -dWNbFJWcHwHP2NVypw87 ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST EV Root CA 1 2020 O=D-Trust GmbH -# Subject: CN=D-TRUST EV Root CA 1 2020 O=D-Trust GmbH -# Label: "D-TRUST EV Root CA 1 2020" -# Serial: 126288379621884218666039612629459926992 -# MD5 Fingerprint: 8c:2d:9d:70:9f:48:99:11:06:11:fb:e9:cb:30:c0:6e -# SHA1 Fingerprint: 61:db:8c:21:59:69:03:90:d8:7c:9c:12:86:54:cf:9d:3d:f4:dd:07 -# SHA256 Fingerprint: 08:17:0d:1a:a3:64:53:90:1a:2f:95:92:45:e3:47:db:0c:8d:37:ab:aa:bc:56:b8:1a:a1:00:dc:95:89:70:db ------BEGIN CERTIFICATE----- -MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQsw -CQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRS -VVNUIEVWIFJvb3QgQ0EgMSAyMDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5 -NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAG -A1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAGByqGSM49AgEGBSuB -BAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8ZRCC -/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rD -wpdhQntJraOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3 -OqQo5FD4pPfsazK2/umLMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6g -PKA6hjhodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X2V2X3Jvb3Rf -Y2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5l -dC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxPPUQtVHJ1 -c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjO -PQQDAwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CA -y/m0sRtW9XLS/BnRAjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJb -gfM0agPnIjhQW+0ZT0MW ------END CERTIFICATE----- - -# Issuer: CN=DigiCert TLS ECC P384 Root G5 O=DigiCert, Inc. -# Subject: CN=DigiCert TLS ECC P384 Root G5 O=DigiCert, Inc. -# Label: "DigiCert TLS ECC P384 Root G5" -# Serial: 13129116028163249804115411775095713523 -# MD5 Fingerprint: d3:71:04:6a:43:1c:db:a6:59:e1:a8:a3:aa:c5:71:ed -# SHA1 Fingerprint: 17:f3:de:5e:9f:0f:19:e9:8e:f6:1f:32:26:6e:20:c4:07:ae:30:ee -# SHA256 Fingerprint: 01:8e:13:f0:77:25:32:cf:80:9b:d1:b1:72:81:86:72:83:fc:48:c6:e1:3b:e9:c6:98:12:85:4a:49:0c:1b:05 ------BEGIN CERTIFICATE----- -MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURp -Z2lDZXJ0IFRMUyBFQ0MgUDM4NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2 -MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJ -bmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQgUm9vdCBHNTB2MBAG -ByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1TzvdlHJS -7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp -0zVozptjn4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICIS -B4CIfBFqMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49 -BAMDA2gAMGUCMQCJao1H5+z8blUD2WdsJk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQ -LgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIxAJSdYsiJvRmEFOml+wG4 -DXZDjC5Ty3zfDBeWUA== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert TLS RSA4096 Root G5 O=DigiCert, Inc. -# Subject: CN=DigiCert TLS RSA4096 Root G5 O=DigiCert, Inc. -# Label: "DigiCert TLS RSA4096 Root G5" -# Serial: 11930366277458970227240571539258396554 -# MD5 Fingerprint: ac:fe:f7:34:96:a9:f2:b3:b4:12:4b:e4:27:41:6f:e1 -# SHA1 Fingerprint: a7:88:49:dc:5d:7c:75:8c:8c:de:39:98:56:b3:aa:d0:b2:a5:71:35 -# SHA256 Fingerprint: 37:1a:00:dc:05:33:b3:72:1a:7e:eb:40:e8:41:9e:70:79:9d:2b:0a:0f:2c:1d:80:69:31:65:f7:ce:c4:ad:75 ------BEGIN CERTIFICATE----- -MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBN -MQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMT -HERpZ2lDZXJ0IFRMUyBSU0E0MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcN -NDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQs -IEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2IFJvb3QgRzUwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS87IE+ -ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG0 -2C+JFvuUAT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgp -wgscONyfMXdcvyej/Cestyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZM -pG2T6T867jp8nVid9E6P/DsjyG244gXazOvswzH016cpVIDPRFtMbzCe88zdH5RD -nU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnVDdXifBBiqmvwPXbzP6Po -sMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9qTXeXAaDx -Zre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cd -Lvvyz6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvX -KyY//SovcfXWJL5/MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNe -XoVPzthwiHvOAbWWl9fNff2C+MIkwcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPL -tgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4EFgQUUTMc7TZArxfTJc1paPKv -TiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcN -AQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw -GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7H -PNtQOa27PShNlnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLF -O4uJ+DQtpBflF+aZfTCIITfNMBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQ -REtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/u4cnYiWB39yhL/btp/96j1EuMPik -AdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9GOUrYU9DzLjtxpdRv -/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh47a+ -p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilw -MUc/dNAUFvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WF -qUITVuwhd4GTWgzqltlJyqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCK -ovfepEWFJqgejF0pW8hL2JpqA15w8oVPbEtoL8pU9ozaMv7Da4M/OMZ+ ------END CERTIFICATE----- - -# Issuer: CN=Certainly Root R1 O=Certainly -# Subject: CN=Certainly Root R1 O=Certainly -# Label: "Certainly Root R1" -# Serial: 188833316161142517227353805653483829216 -# MD5 Fingerprint: 07:70:d4:3e:82:87:a0:fa:33:36:13:f4:fa:33:e7:12 -# SHA1 Fingerprint: a0:50:ee:0f:28:71:f4:27:b2:12:6d:6f:50:96:25:ba:cc:86:42:af -# SHA256 Fingerprint: 77:b8:2c:d8:64:4c:43:05:f7:ac:c5:cb:15:6b:45:67:50:04:03:3d:51:c6:0c:62:02:a8:e0:c3:34:67:d3:a0 ------BEGIN CERTIFICATE----- -MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAw -PTELMAkGA1UEBhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2Vy -dGFpbmx5IFJvb3QgUjEwHhcNMjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9 -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0 -YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANA2 -1B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O5MQT -vqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbed -aFySpvXl8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b0 -1C7jcvk2xusVtyWMOvwlDbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5 -r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGIXsXwClTNSaa/ApzSRKft43jvRl5tcdF5 -cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkNKPl6I7ENPT2a/Z2B7yyQ -wHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQAjeZjOVJ -6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA -2CnbrlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyH -Wyf5QBGenDPBt+U1VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMR -eiFPCyEQtkA6qyI6BJyLm4SGcprSp6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB -/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTgqj8ljZ9EXME66C6u -d0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAszHQNTVfSVcOQr -PbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d -8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi -1wrykXprOQ4vMMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrd -rRT90+7iIgXr0PK3aBLXWopBGsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9di -taY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+gjwN/KUD+nsa2UUeYNrEjvn8K8l7 -lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgHJBu6haEaBQmAupVj -yTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7fpYn -Kx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLy -yCwzk5Iwx06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5n -wXARPbv0+Em34yaXOp/SX3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6 -OV+KmalBWQewLK8= ------END CERTIFICATE----- - -# Issuer: CN=Certainly Root E1 O=Certainly -# Subject: CN=Certainly Root E1 O=Certainly -# Label: "Certainly Root E1" -# Serial: 8168531406727139161245376702891150584 -# MD5 Fingerprint: 0a:9e:ca:cd:3e:52:50:c6:36:f3:4b:a3:ed:a7:53:e9 -# SHA1 Fingerprint: f9:e1:6d:dc:01:89:cf:d5:82:45:63:3e:c5:37:7d:c2:eb:93:6f:2b -# SHA256 Fingerprint: b4:58:5f:22:e4:ac:75:6a:4e:86:12:a1:36:1c:5d:9d:03:1a:93:fd:84:fe:bb:77:8f:a3:06:8b:0f:c4:2d:c2 ------BEGIN CERTIFICATE----- -MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQsw -CQYDVQQGEwJVUzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlu -bHkgUm9vdCBFMTAeFw0yMTA0MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJ -BgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlubHkxGjAYBgNVBAMTEUNlcnRhaW5s -eSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4fxzf7flHh4axpMCK -+IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9YBk2 -QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4 -hevIIgcwCgYIKoZIzj0EAwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozm -ut6Dacpps6kFtZaSF4fC0urQe87YQVt8rgIwRt7qy12a7DLCZRawTDBcMPPaTnOG -BtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR ------END CERTIFICATE----- - -# Issuer: CN=Security Communication RootCA3 O=SECOM Trust Systems CO.,LTD. -# Subject: CN=Security Communication RootCA3 O=SECOM Trust Systems CO.,LTD. -# Label: "Security Communication RootCA3" -# Serial: 16247922307909811815 -# MD5 Fingerprint: 1c:9a:16:ff:9e:5c:e0:4d:8a:14:01:f4:35:5d:29:26 -# SHA1 Fingerprint: c3:03:c8:22:74:92:e5:61:a2:9c:5f:79:91:2b:1e:44:13:91:30:3a -# SHA256 Fingerprint: 24:a5:5c:2a:b0:51:44:2d:06:17:76:65:41:23:9a:4a:d0:32:d7:c5:51:75:aa:34:ff:de:2f:bc:4f:5c:52:94 ------BEGIN CERTIFICATE----- -MIIFfzCCA2egAwIBAgIJAOF8N0D9G/5nMA0GCSqGSIb3DQEBDAUAMF0xCzAJBgNV -BAYTAkpQMSUwIwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMScw -JQYDVQQDEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTMwHhcNMTYwNjE2 -MDYxNzE2WhcNMzgwMTE4MDYxNzE2WjBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc -U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UEAxMeU2VjdXJpdHkg -Q29tbXVuaWNhdGlvbiBSb290Q0EzMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEA48lySfcw3gl8qUCBWNO0Ot26YQ+TUG5pPDXC7ltzkBtnTCHsXzW7OT4r -CmDvu20rhvtxosis5FaU+cmvsXLUIKx00rgVrVH+hXShuRD+BYD5UpOzQD11EKzA -lrenfna84xtSGc4RHwsENPXY9Wk8d/Nk9A2qhd7gCVAEF5aEt8iKvE1y/By7z/MG -TfmfZPd+pmaGNXHIEYBMwXFAWB6+oHP2/D5Q4eAvJj1+XCO1eXDe+uDRpdYMQXF7 -9+qMHIjH7Iv10S9VlkZ8WjtYO/u62C21Jdp6Ts9EriGmnpjKIG58u4iFW/vAEGK7 -8vknR+/RiTlDxN/e4UG/VHMgly1s2vPUB6PmudhvrvyMGS7TZ2crldtYXLVqAvO4 -g160a75BflcJdURQVc1aEWEhCmHCqYj9E7wtiS/NYeCVvsq1e+F7NGcLH7YMx3we -GVPKp7FKFSBWFHA9K4IsD50VHUeAR/94mQ4xr28+j+2GaR57GIgUssL8gjMunEst -+3A7caoreyYn8xrC3PsXuKHqy6C0rtOUfnrQq8PsOC0RLoi/1D+tEjtCrI8Cbn3M -0V9hvqG8OmpI6iZVIhZdXw3/JzOfGAN0iltSIEdrRU0id4xVJ/CvHozJgyJUt5rQ -T9nO/NkuHJYosQLTA70lUhw0Zk8jq/R3gpYd0VcwCBEF/VfR2ccCAwEAAaNCMEAw -HQYDVR0OBBYEFGQUfPxYchamCik0FW8qy7z8r6irMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBDAUAA4ICAQDcAiMI4u8hOscNtybS -YpOnpSNyByCCYN8Y11StaSWSntkUz5m5UoHPrmyKO1o5yGwBQ8IibQLwYs1OY0PA -FNr0Y/Dq9HHuTofjcan0yVflLl8cebsjqodEV+m9NU1Bu0soo5iyG9kLFwfl9+qd -9XbXv8S2gVj/yP9kaWJ5rW4OH3/uHWnlt3Jxs/6lATWUVCvAUm2PVcTJ0rjLyjQI -UYWg9by0F1jqClx6vWPGOi//lkkZhOpn2ASxYfQAW0q3nHE3GYV5v4GwxxMOdnE+ -OoAGrgYWp421wsTL/0ClXI2lyTrtcoHKXJg80jQDdwj98ClZXSEIx2C/pHF7uNke -gr4Jr2VvKKu/S7XuPghHJ6APbw+LP6yVGPO5DtxnVW5inkYO0QR4ynKudtml+LLf -iAlhi+8kTtFZP1rUPcmTPCtk9YENFpb3ksP+MW/oKjJ0DvRMmEoYDjBU1cXrvMUV -nuiZIesnKwkK2/HmcBhWuwzkvvnoEKQTkrgc4NtnHVMDpCKn3F2SEDzq//wbEBrD -2NCcnWXL0CsnMQMeNuE9dnUM/0Umud1RvCPHX9jYhxBAEg09ODfnRDwYwFMJZI// -1ZqmfHAuc1Uh6N//g7kdPjIe1qZ9LPFm6Vwdp6POXiUyK+OVrCoHzrQoeIY8Laad -TdJ0MN1kURXbg4NR16/9M51NZg== ------END CERTIFICATE----- - -# Issuer: CN=Security Communication ECC RootCA1 O=SECOM Trust Systems CO.,LTD. -# Subject: CN=Security Communication ECC RootCA1 O=SECOM Trust Systems CO.,LTD. -# Label: "Security Communication ECC RootCA1" -# Serial: 15446673492073852651 -# MD5 Fingerprint: 7e:43:b0:92:68:ec:05:43:4c:98:ab:5d:35:2e:7e:86 -# SHA1 Fingerprint: b8:0e:26:a9:bf:d2:b2:3b:c0:ef:46:c9:ba:c7:bb:f6:1d:0d:41:41 -# SHA256 Fingerprint: e7:4f:bd:a5:5b:d5:64:c4:73:a3:6b:44:1a:a7:99:c8:a6:8e:07:74:40:e8:28:8b:9f:a1:e5:0e:4b:ba:ca:11 ------BEGIN CERTIFICATE----- -MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYT -AkpQMSUwIwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYD -VQQDEyJTZWN1cml0eSBDb21tdW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYx -NjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTELMAkGA1UEBhMCSlAxJTAjBgNVBAoT -HFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNVBAMTIlNlY3VyaXR5 -IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQAIgNi -AASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+Cnnfdl -dB9sELLo5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpK -ULGjQjBAMB0GA1UdDgQWBBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu -9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3LsnNdo4gIxwwCMQDAqy0O -be0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70eN9k= ------END CERTIFICATE----- - -# Issuer: CN=BJCA Global Root CA1 O=BEIJING CERTIFICATE AUTHORITY -# Subject: CN=BJCA Global Root CA1 O=BEIJING CERTIFICATE AUTHORITY -# Label: "BJCA Global Root CA1" -# Serial: 113562791157148395269083148143378328608 -# MD5 Fingerprint: 42:32:99:76:43:33:36:24:35:07:82:9b:28:f9:d0:90 -# SHA1 Fingerprint: d5:ec:8d:7b:4c:ba:79:f4:e7:e8:cb:9d:6b:ae:77:83:10:03:21:6a -# SHA256 Fingerprint: f3:89:6f:88:fe:7c:0a:88:27:66:a7:fa:6a:d2:74:9f:b5:7a:7f:3e:98:fb:76:9c:1f:a7:b0:9c:2c:44:d5:ae ------BEGIN CERTIFICATE----- -MIIFdDCCA1ygAwIBAgIQVW9l47TZkGobCdFsPsBsIDANBgkqhkiG9w0BAQsFADBU -MQswCQYDVQQGEwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRI -T1JJVFkxHTAbBgNVBAMMFEJKQ0EgR2xvYmFsIFJvb3QgQ0ExMB4XDTE5MTIxOTAz -MTYxN1oXDTQ0MTIxMjAzMTYxN1owVDELMAkGA1UEBhMCQ04xJjAkBgNVBAoMHUJF -SUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRCSkNBIEdsb2Jh -bCBSb290IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFmCL3Z -xRVhy4QEQaVpN3cdwbB7+sN3SJATcmTRuHyQNZ0YeYjjlwE8R4HyDqKYDZ4/N+AZ -spDyRhySsTphzvq3Rp4Dhtczbu33RYx2N95ulpH3134rhxfVizXuhJFyV9xgw8O5 -58dnJCNPYwpj9mZ9S1WnP3hkSWkSl+BMDdMJoDIwOvqfwPKcxRIqLhy1BDPapDgR -at7GGPZHOiJBhyL8xIkoVNiMpTAK+BcWyqw3/XmnkRd4OJmtWO2y3syJfQOcs4ll -5+M7sSKGjwZteAf9kRJ/sGsciQ35uMt0WwfCyPQ10WRjeulumijWML3mG90Vr4Tq -nMfK9Q7q8l0ph49pczm+LiRvRSGsxdRpJQaDrXpIhRMsDQa4bHlW/KNnMoH1V6XK -V0Jp6VwkYe/iMBhORJhVb3rCk9gZtt58R4oRTklH2yiUAguUSiz5EtBP6DF+bHq/ -pj+bOT0CFqMYs2esWz8sgytnOYFcuX6U1WTdno9uruh8W7TXakdI136z1C2OVnZO -z2nxbkRs1CTqjSShGL+9V/6pmTW12xB3uD1IutbB5/EjPtffhZ0nPNRAvQoMvfXn -jSXWgXSHRtQpdaJCbPdzied9v3pKH9MiyRVVz99vfFXQpIsHETdfg6YmV6YBW37+ -WGgHqel62bno/1Afq8K0wM7o6v0PvY1NuLxxAgMBAAGjQjBAMB0GA1UdDgQWBBTF -7+3M2I0hxkjk49cULqcWk+WYATAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE -AwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAUoKsITQfI/Ki2Pm4rzc2IInRNwPWaZ+4 -YRC6ojGYWUfo0Q0lHhVBDOAqVdVXUsv45Mdpox1NcQJeXyFFYEhcCY5JEMEE3Kli -awLwQ8hOnThJdMkycFRtwUf8jrQ2ntScvd0g1lPJGKm1Vrl2i5VnZu69mP6u775u -+2D2/VnGKhs/I0qUJDAnyIm860Qkmss9vk/Ves6OF8tiwdneHg56/0OGNFK8YT88 -X7vZdrRTvJez/opMEi4r89fO4aL/3Xtw+zuhTaRjAv04l5U/BXCga99igUOLtFkN -SoxUnMW7gZ/NfaXvCyUeOiDbHPwfmGcCCtRzRBPbUYQaVQNW4AB+dAb/OMRyHdOo -P2gxXdMJxy6MW2Pg6Nwe0uxhHvLe5e/2mXZgLR6UcnHGCyoyx5JO1UbXHfmpGQrI -+pXObSOYqgs4rZpWDW+N8TEAiMEXnM0ZNjX+VVOg4DwzX5Ze4jLp3zO7Bkqp2IRz -znfSxqxx4VyjHQy7Ct9f4qNx2No3WqB4K/TUfet27fJhcKVlmtOJNBir+3I+17Q9 -eVzYH6Eze9mCUAyTF6ps3MKCuwJXNq+YJyo5UOGwifUll35HaBC07HPKs5fRJNz2 -YqAo07WjuGS3iGJCz51TzZm+ZGiPTx4SSPfSKcOYKMryMguTjClPPGAyzQWWYezy -r/6zcCwupvI= ------END CERTIFICATE----- - -# Issuer: CN=BJCA Global Root CA2 O=BEIJING CERTIFICATE AUTHORITY -# Subject: CN=BJCA Global Root CA2 O=BEIJING CERTIFICATE AUTHORITY -# Label: "BJCA Global Root CA2" -# Serial: 58605626836079930195615843123109055211 -# MD5 Fingerprint: 5e:0a:f6:47:5f:a6:14:e8:11:01:95:3f:4d:01:eb:3c -# SHA1 Fingerprint: f4:27:86:eb:6e:b8:6d:88:31:67:02:fb:ba:66:a4:53:00:aa:7a:a6 -# SHA256 Fingerprint: 57:4d:f6:93:1e:27:80:39:66:7b:72:0a:fd:c1:60:0f:c2:7e:b6:6d:d3:09:29:79:fb:73:85:64:87:21:28:82 ------BEGIN CERTIFICATE----- -MIICJTCCAaugAwIBAgIQLBcIfWQqwP6FGFkGz7RK6zAKBggqhkjOPQQDAzBUMQsw -CQYDVQQGEwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJ -VFkxHTAbBgNVBAMMFEJKQ0EgR2xvYmFsIFJvb3QgQ0EyMB4XDTE5MTIxOTAzMTgy -MVoXDTQ0MTIxMjAzMTgyMVowVDELMAkGA1UEBhMCQ04xJjAkBgNVBAoMHUJFSUpJ -TkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRCSkNBIEdsb2JhbCBS -b290IENBMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABJ3LgJGNU2e1uVCxA/jlSR9B -IgmwUVJY1is0j8USRhTFiy8shP8sbqjV8QnjAyEUxEM9fMEsxEtqSs3ph+B99iK+ -+kpRuDCK/eHeGBIK9ke35xe/J4rUQUyWPGCWwf0VHKNCMEAwHQYDVR0OBBYEFNJK -sVF/BvDRgh9Obl+rg/xI1LCRMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8W9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA -94M04TVOSG0ED1cxMDAtsaqdAzjbBgIxAMvMh1PLet8gUXOQwKhbYdDFUDn9hf7B -43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w== ------END CERTIFICATE----- - -# Issuer: CN=Sectigo Public Server Authentication Root E46 O=Sectigo Limited -# Subject: CN=Sectigo Public Server Authentication Root E46 O=Sectigo Limited -# Label: "Sectigo Public Server Authentication Root E46" -# Serial: 88989738453351742415770396670917916916 -# MD5 Fingerprint: 28:23:f8:b2:98:5c:37:16:3b:3e:46:13:4e:b0:b3:01 -# SHA1 Fingerprint: ec:8a:39:6c:40:f0:2e:bc:42:75:d4:9f:ab:1c:1a:5b:67:be:d2:9a -# SHA256 Fingerprint: c9:0f:26:f0:fb:1b:40:18:b2:22:27:51:9b:5c:a2:b5:3e:2c:a5:b3:be:5c:f1:8e:fe:1b:ef:47:38:0c:53:83 ------BEGIN CERTIFICATE----- -MIICOjCCAcGgAwIBAgIQQvLM2htpN0RfFf51KBC49DAKBggqhkjOPQQDAzBfMQsw -CQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1T -ZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwHhcN -MjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5WjBfMQswCQYDVQQGEwJHQjEYMBYG -A1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBT -ZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAAR2+pmpbiDt+dd34wc7qNs9Xzjoq1WmVk/WSOrsfy2qw7LFeeyZYX8QeccC -WvkEN/U0NSt3zn8gj1KjAIns1aeibVvjS5KToID1AZTc8GgHHs3u/iVStSBDHBv+ -6xnOQ6OjQjBAMB0GA1UdDgQWBBTRItpMWfFLXyY4qp3W7usNw/upYTAOBgNVHQ8B -Af8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNnADBkAjAn7qRa -qCG76UeXlImldCBteU/IvZNeWBj7LRoAasm4PdCkT0RHlAFWovgzJQxC36oCMB3q -4S6ILuH5px0CMk7yn2xVdOOurvulGu7t0vzCAxHrRVxgED1cf5kDW21USAGKcw== ------END CERTIFICATE----- - -# Issuer: CN=Sectigo Public Server Authentication Root R46 O=Sectigo Limited -# Subject: CN=Sectigo Public Server Authentication Root R46 O=Sectigo Limited -# Label: "Sectigo Public Server Authentication Root R46" -# Serial: 156256931880233212765902055439220583700 -# MD5 Fingerprint: 32:10:09:52:00:d5:7e:6c:43:df:15:c0:b1:16:93:e5 -# SHA1 Fingerprint: ad:98:f9:f3:e4:7d:75:3b:65:d4:82:b3:a4:52:17:bb:6e:f5:e4:38 -# SHA256 Fingerprint: 7b:b6:47:a6:2a:ee:ac:88:bf:25:7a:a5:22:d0:1f:fe:a3:95:e0:ab:45:c7:3f:93:f6:56:54:ec:38:f2:5a:06 ------BEGIN CERTIFICATE----- -MIIFijCCA3KgAwIBAgIQdY39i658BwD6qSWn4cetFDANBgkqhkiG9w0BAQwFADBf -MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQD -Ey1TZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYw -HhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5WjBfMQswCQYDVQQGEwJHQjEY -MBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1Ymxp -YyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCTvtU2UnXYASOgHEdCSe5jtrch/cSV1UgrJnwUUxDa -ef0rty2k1Cz66jLdScK5vQ9IPXtamFSvnl0xdE8H/FAh3aTPaE8bEmNtJZlMKpnz -SDBh+oF8HqcIStw+KxwfGExxqjWMrfhu6DtK2eWUAtaJhBOqbchPM8xQljeSM9xf -iOefVNlI8JhD1mb9nxc4Q8UBUQvX4yMPFF1bFOdLvt30yNoDN9HWOaEhUTCDsG3X -ME6WW5HwcCSrv0WBZEMNvSE6Lzzpng3LILVCJ8zab5vuZDCQOc2TZYEhMbUjUDM3 -IuM47fgxMMxF/mL50V0yeUKH32rMVhlATc6qu/m1dkmU8Sf4kaWD5QazYw6A3OAS -VYCmO2a0OYctyPDQ0RTp5A1NDvZdV3LFOxxHVp3i1fuBYYzMTYCQNFu31xR13NgE -SJ/AwSiItOkcyqex8Va3e0lMWeUgFaiEAin6OJRpmkkGj80feRQXEgyDet4fsZfu -+Zd4KKTIRJLpfSYFplhym3kT2BFfrsU4YjRosoYwjviQYZ4ybPUHNs2iTG7sijbt -8uaZFURww3y8nDnAtOFr94MlI1fZEoDlSfB1D++N6xybVCi0ITz8fAr/73trdf+L -HaAZBav6+CuBQug4urv7qv094PPK306Xlynt8xhW6aWWrL3DkJiy4Pmi1KZHQ3xt -zwIDAQABo0IwQDAdBgNVHQ4EFgQUVnNYZJX5khqwEioEYnmhQBWIIUkwDgYDVR0P -AQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAC9c -mTz8Bl6MlC5w6tIyMY208FHVvArzZJ8HXtXBc2hkeqK5Duj5XYUtqDdFqij0lgVQ -YKlJfp/imTYpE0RHap1VIDzYm/EDMrraQKFz6oOht0SmDpkBm+S8f74TlH7Kph52 -gDY9hAaLMyZlbcp+nv4fjFg4exqDsQ+8FxG75gbMY/qB8oFM2gsQa6H61SilzwZA -Fv97fRheORKkU55+MkIQpiGRqRxOF3yEvJ+M0ejf5lG5Nkc/kLnHvALcWxxPDkjB -JYOcCj+esQMzEhonrPcibCTRAUH4WAP+JWgiH5paPHxsnnVI84HxZmduTILA7rpX -DhjvLpr3Etiga+kFpaHpaPi8TD8SHkXoUsCjvxInebnMMTzD9joiFgOgyY9mpFui -TdaBJQbpdqQACj7LzTWb4OE4y2BThihCQRxEV+ioratF4yUQvNs+ZUH7G6aXD+u5 -dHn5HrwdVw1Hr8Mvn4dGp+smWg9WY7ViYG4A++MnESLn/pmPNPW56MORcr3Ywx65 -LvKRRFHQV80MNNVIIb/bE/FmJUNS0nAiNs2fxBx1IK1jcmMGDw4nztJqDby1ORrp -0XZ60Vzk50lJLVU3aPAaOpg+VBeHVOmmJ1CJeyAvP/+/oYtKR5j/K3tJPsMpRmAY -QqszKbrAKbkTidOIijlBO8n9pu0f9GBj39ItVQGL ------END CERTIFICATE----- - -# Issuer: CN=SSL.com TLS RSA Root CA 2022 O=SSL Corporation -# Subject: CN=SSL.com TLS RSA Root CA 2022 O=SSL Corporation -# Label: "SSL.com TLS RSA Root CA 2022" -# Serial: 148535279242832292258835760425842727825 -# MD5 Fingerprint: d8:4e:c6:59:30:d8:fe:a0:d6:7a:5a:2c:2c:69:78:da -# SHA1 Fingerprint: ec:2c:83:40:72:af:26:95:10:ff:0e:f2:03:ee:31:70:f6:78:9d:ca -# SHA256 Fingerprint: 8f:af:7d:2e:2c:b4:70:9b:b8:e0:b3:36:66:bf:75:a5:dd:45:b5:de:48:0f:8e:a8:d4:bf:e6:be:bc:17:f2:ed ------BEGIN CERTIFICATE----- -MIIFiTCCA3GgAwIBAgIQb77arXO9CEDii02+1PdbkTANBgkqhkiG9w0BAQsFADBO -MQswCQYDVQQGEwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQD -DBxTU0wuY29tIFRMUyBSU0EgUm9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzQyMloX -DTQ2MDgxOTE2MzQyMVowTjELMAkGA1UEBhMCVVMxGDAWBgNVBAoMD1NTTCBDb3Jw -b3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgUlNBIFJvb3QgQ0EgMjAyMjCC -AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANCkCXJPQIgSYT41I57u9nTP -L3tYPc48DRAokC+X94xI2KDYJbFMsBFMF3NQ0CJKY7uB0ylu1bUJPiYYf7ISf5OY -t6/wNr/y7hienDtSxUcZXXTzZGbVXcdotL8bHAajvI9AI7YexoS9UcQbOcGV0ins -S657Lb85/bRi3pZ7QcacoOAGcvvwB5cJOYF0r/c0WRFXCsJbwST0MXMwgsadugL3 -PnxEX4MN8/HdIGkWCVDi1FW24IBydm5MR7d1VVm0U3TZlMZBrViKMWYPHqIbKUBO -L9975hYsLfy/7PO0+r4Y9ptJ1O4Fbtk085zx7AGL0SDGD6C1vBdOSHtRwvzpXGk3 -R2azaPgVKPC506QVzFpPulJwoxJF3ca6TvvC0PeoUidtbnm1jPx7jMEWTO6Af77w -dr5BUxIzrlo4QqvXDz5BjXYHMtWrifZOZ9mxQnUjbvPNQrL8VfVThxc7wDNY8VLS -+YCk8OjwO4s4zKTGkH8PnP2L0aPP2oOnaclQNtVcBdIKQXTbYxE3waWglksejBYS -d66UNHsef8JmAOSqg+qKkK3ONkRN0VHpvB/zagX9wHQfJRlAUW7qglFA35u5CCoG -AtUjHBPW6dvbxrB6y3snm/vg1UYk7RBLY0ulBY+6uB0rpvqR4pJSvezrZ5dtmi2f -gTIFZzL7SAg/2SW4BCUvAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j -BBgwFoAU+y437uOEeicuzRk1sTN8/9REQrkwHQYDVR0OBBYEFPsuN+7jhHonLs0Z -NbEzfP/UREK5MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAjYlt -hEUY8U+zoO9opMAdrDC8Z2awms22qyIZZtM7QbUQnRC6cm4pJCAcAZli05bg4vsM -QtfhWsSWTVTNj8pDU/0quOr4ZcoBwq1gaAafORpR2eCNJvkLTqVTJXojpBzOCBvf -R4iyrT7gJ4eLSYwfqUdYe5byiB0YrrPRpgqU+tvT5TgKa3kSM/tKWTcWQA673vWJ -DPFs0/dRa1419dvAJuoSc06pkZCmF8NsLzjUo3KUQyxi4U5cMj29TH0ZR6LDSeeW -P4+a0zvkEdiLA9z2tmBVGKaBUfPhqBVq6+AL8BQx1rmMRTqoENjwuSfr98t67wVy -lrXEj5ZzxOhWc5y8aVFjvO9nHEMaX3cZHxj4HCUp+UmZKbaSPaKDN7EgkaibMOlq -bLQjk2UEqxHzDh1TJElTHaE/nUiSEeJ9DU/1172iWD54nR4fK/4huxoTtrEoZP2w -AgDHbICivRZQIA9ygV/MlP+7mea6kMvq+cYMwq7FGc4zoWtcu358NFcXrfA/rs3q -r5nsLFR+jM4uElZI7xc7P0peYNLcdDa8pUNjyw9bowJWCZ4kLOGGgYz+qxcs+sji -Mho6/4UIyYOf8kpIEFR3N+2ivEC+5BB09+Rbu7nzifmPQdjH5FCQNYA+HLhNkNPU -98OwoX6EyneSMSy4kLGCenROmxMmtNVQZlR4rmA= ------END CERTIFICATE----- - -# Issuer: CN=SSL.com TLS ECC Root CA 2022 O=SSL Corporation -# Subject: CN=SSL.com TLS ECC Root CA 2022 O=SSL Corporation -# Label: "SSL.com TLS ECC Root CA 2022" -# Serial: 26605119622390491762507526719404364228 -# MD5 Fingerprint: 99:d7:5c:f1:51:36:cc:e9:ce:d9:19:2e:77:71:56:c5 -# SHA1 Fingerprint: 9f:5f:d9:1a:54:6d:f5:0c:71:f0:ee:7a:bd:17:49:98:84:73:e2:39 -# SHA256 Fingerprint: c3:2f:fd:9f:46:f9:36:d1:6c:36:73:99:09:59:43:4b:9a:d6:0a:af:bb:9e:7c:f3:36:54:f1:44:cc:1b:a1:43 ------BEGIN CERTIFICATE----- -MIICOjCCAcCgAwIBAgIQFAP1q/s3ixdAW+JDsqXRxDAKBggqhkjOPQQDAzBOMQsw -CQYDVQQGEwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxT -U0wuY29tIFRMUyBFQ0MgUm9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzM0OFoXDTQ2 -MDgxOTE2MzM0N1owTjELMAkGA1UEBhMCVVMxGDAWBgNVBAoMD1NTTCBDb3Jwb3Jh -dGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgRUNDIFJvb3QgQ0EgMjAyMjB2MBAG -ByqGSM49AgEGBSuBBAAiA2IABEUpNXP6wrgjzhR9qLFNoFs27iosU8NgCTWyJGYm -acCzldZdkkAZDsalE3D07xJRKF3nzL35PIXBz5SQySvOkkJYWWf9lCcQZIxPBLFN -SeR7T5v15wj4A4j3p8OSSxlUgaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSME -GDAWgBSJjy+j6CugFFR781a4Jl9nOAuc0DAdBgNVHQ4EFgQUiY8vo+groBRUe/NW -uCZfZzgLnNAwDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2gAMGUCMFXjIlbp -15IkWE8elDIPDAI2wv2sdDJO4fscgIijzPvX6yv/N33w7deedWo1dlJF4AIxAMeN -b0Igj762TVntd00pxCAgRWSGOlDGxK0tk/UYfXLtqc/ErFc2KAhl3zx5Zn6g6g== ------END CERTIFICATE----- - -# Issuer: CN=Atos TrustedRoot Root CA ECC TLS 2021 O=Atos -# Subject: CN=Atos TrustedRoot Root CA ECC TLS 2021 O=Atos -# Label: "Atos TrustedRoot Root CA ECC TLS 2021" -# Serial: 81873346711060652204712539181482831616 -# MD5 Fingerprint: 16:9f:ad:f1:70:ad:79:d6:ed:29:b4:d1:c5:79:70:a8 -# SHA1 Fingerprint: 9e:bc:75:10:42:b3:02:f3:81:f4:f7:30:62:d4:8f:c3:a7:51:b2:dd -# SHA256 Fingerprint: b2:fa:e5:3e:14:cc:d7:ab:92:12:06:47:01:ae:27:9c:1d:89:88:fa:cb:77:5f:a8:a0:08:91:4e:66:39:88:a8 ------BEGIN CERTIFICATE----- -MIICFTCCAZugAwIBAgIQPZg7pmY9kGP3fiZXOATvADAKBggqhkjOPQQDAzBMMS4w -LAYDVQQDDCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgRUNDIFRMUyAyMDIxMQ0w -CwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0yMTA0MjIwOTI2MjNaFw00MTA0 -MTcwOTI2MjJaMEwxLjAsBgNVBAMMJUF0b3MgVHJ1c3RlZFJvb3QgUm9vdCBDQSBF -Q0MgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYTAkRFMHYwEAYHKoZI -zj0CAQYFK4EEACIDYgAEloZYKDcKZ9Cg3iQZGeHkBQcfl+3oZIK59sRxUM6KDP/X -tXa7oWyTbIOiaG6l2b4siJVBzV3dscqDY4PMwL502eCdpO5KTlbgmClBk1IQ1SQ4 -AjJn8ZQSb+/Xxd4u/RmAo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR2 -KCXWfeBmmnoJsmo7jjPXNtNPojAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMD -aAAwZQIwW5kp85wxtolrbNa9d+F851F+uDrNozZffPc8dz7kUK2o59JZDCaOMDtu -CCrCp1rIAjEAmeMM56PDr9NJLkaCI2ZdyQAUEv049OGYa3cpetskz2VAv9LcjBHo -9H1/IISpQuQo ------END CERTIFICATE----- - -# Issuer: CN=Atos TrustedRoot Root CA RSA TLS 2021 O=Atos -# Subject: CN=Atos TrustedRoot Root CA RSA TLS 2021 O=Atos -# Label: "Atos TrustedRoot Root CA RSA TLS 2021" -# Serial: 111436099570196163832749341232207667876 -# MD5 Fingerprint: d4:d3:46:b8:9a:c0:9c:76:5d:9e:3a:c3:b9:99:31:d2 -# SHA1 Fingerprint: 18:52:3b:0d:06:37:e4:d6:3a:df:23:e4:98:fb:5b:16:fb:86:74:48 -# SHA256 Fingerprint: 81:a9:08:8e:a5:9f:b3:64:c5:48:a6:f8:55:59:09:9b:6f:04:05:ef:bf:18:e5:32:4e:c9:f4:57:ba:00:11:2f ------BEGIN CERTIFICATE----- -MIIFZDCCA0ygAwIBAgIQU9XP5hmTC/srBRLYwiqipDANBgkqhkiG9w0BAQwFADBM -MS4wLAYDVQQDDCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgUlNBIFRMUyAyMDIx -MQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0yMTA0MjIwOTIxMTBaFw00 -MTA0MTcwOTIxMDlaMEwxLjAsBgNVBAMMJUF0b3MgVHJ1c3RlZFJvb3QgUm9vdCBD -QSBSU0EgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYTAkRFMIICIjAN -BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtoAOxHm9BYx9sKOdTSJNy/BBl01Z -4NH+VoyX8te9j2y3I49f1cTYQcvyAh5x5en2XssIKl4w8i1mx4QbZFc4nXUtVsYv -Ye+W/CBGvevUez8/fEc4BKkbqlLfEzfTFRVOvV98r61jx3ncCHvVoOX3W3WsgFWZ -kmGbzSoXfduP9LVq6hdKZChmFSlsAvFr1bqjM9xaZ6cF4r9lthawEO3NUDPJcFDs -GY6wx/J0W2tExn2WuZgIWWbeKQGb9Cpt0xU6kGpn8bRrZtkh68rZYnxGEFzedUln -nkL5/nWpo63/dgpnQOPF943HhZpZnmKaau1Fh5hnstVKPNe0OwANwI8f4UDErmwh -3El+fsqyjW22v5MvoVw+j8rtgI5Y4dtXz4U2OLJxpAmMkokIiEjxQGMYsluMWuPD -0xeqqxmjLBvk1cbiZnrXghmmOxYsL3GHX0WelXOTwkKBIROW1527k2gV+p2kHYzy -geBYBr3JtuP2iV2J+axEoctr+hbxx1A9JNr3w+SH1VbxT5Aw+kUJWdo0zuATHAR8 -ANSbhqRAvNncTFd+rrcztl524WWLZt+NyteYr842mIycg5kDcPOvdO3GDjbnvezB -c6eUWsuSZIKmAMFwoW4sKeFYV+xafJlrJaSQOoD0IJ2azsct+bJLKZWD6TWNp0lI -pw9MGZHQ9b8Q4HECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU -dEmZ0f+0emhFdcN+tNzMzjkz2ggwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB -DAUAA4ICAQAjQ1MkYlxt/T7Cz1UAbMVWiLkO3TriJQ2VSpfKgInuKs1l+NsW4AmS -4BjHeJi78+xCUvuppILXTdiK/ORO/auQxDh1MoSf/7OwKwIzNsAQkG8dnK/haZPs -o0UvFJ/1TCplQ3IM98P4lYsU84UgYt1UU90s3BiVaU+DR3BAM1h3Egyi61IxHkzJ -qM7F78PRreBrAwA0JrRUITWXAdxfG/F851X6LWh3e9NpzNMOa7pNdkTWwhWaJuyw -xfW70Xp0wmzNxbVe9kzmWy2B27O3Opee7c9GslA9hGCZcbUztVdF5kJHdWoOsAgM -rr3e97sPWD2PAzHoPYJQyi9eDF20l74gNAf0xBLh7tew2VktafcxBPTy+av5EzH4 -AXcOPUIjJsyacmdRIXrMPIWo6iFqO9taPKU0nprALN+AnCng33eU0aKAQv9qTFsR -0PXNor6uzFFcw9VUewyu1rkGd4Di7wcaaMxZUa1+XGdrudviB0JbuAEFWDlN5LuY -o7Ey7Nmj1m+UI/87tyll5gfp77YZ6ufCOB0yiJA8EytuzO+rdwY0d4RPcuSBhPm5 -dDTedk+SKlOxJTnbPP/lPqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcE -oji2jbDwN/zIIX8/syQbPYtuzE2wFg2WHYMfRsCbvUOZ58SWLs5fyQ== ------END CERTIFICATE----- diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/certifi/core.py b/venv/lib/python3.12/site-packages/pip/_vendor/certifi/core.py deleted file mode 100644 index 5c67600..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/certifi/core.py +++ /dev/null @@ -1,119 +0,0 @@ -""" -certifi.py -~~~~~~~~~~ - -This module returns the installation location of cacert.pem or its contents. -""" -import sys - -DEBIAN_CA_CERTS_PATH = '/etc/ssl/certs/ca-certificates.crt' - -if sys.version_info >= (3, 11): - - from importlib.resources import as_file, files - - _CACERT_CTX = None - _CACERT_PATH = None - - def where() -> str: - # This is slightly terrible, but we want to delay extracting the file - # in cases where we're inside of a zipimport situation until someone - # actually calls where(), but we don't want to re-extract the file - # on every call of where(), so we'll do it once then store it in a - # global variable. - global _CACERT_CTX - global _CACERT_PATH - if _CACERT_PATH is None: - # This is slightly janky, the importlib.resources API wants you to - # manage the cleanup of this file, so it doesn't actually return a - # path, it returns a context manager that will give you the path - # when you enter it and will do any cleanup when you leave it. In - # the common case of not needing a temporary file, it will just - # return the file system location and the __exit__() is a no-op. - # - # We also have to hold onto the actual context manager, because - # it will do the cleanup whenever it gets garbage collected, so - # we will also store that at the global level as well. - _CACERT_CTX = as_file(files("pip._vendor.certifi").joinpath("cacert.pem")) - _CACERT_PATH = str(_CACERT_CTX.__enter__()) - - return _CACERT_PATH - - def contents() -> str: - return files("pip._vendor.certifi").joinpath("cacert.pem").read_text(encoding="ascii") - -elif sys.version_info >= (3, 7): - - from importlib.resources import path as get_path, read_text - - _CACERT_CTX = None - _CACERT_PATH = None - - def where() -> str: - # This is slightly terrible, but we want to delay extracting the - # file in cases where we're inside of a zipimport situation until - # someone actually calls where(), but we don't want to re-extract - # the file on every call of where(), so we'll do it once then store - # it in a global variable. - global _CACERT_CTX - global _CACERT_PATH - if _CACERT_PATH is None: - # This is slightly janky, the importlib.resources API wants you - # to manage the cleanup of this file, so it doesn't actually - # return a path, it returns a context manager that will give - # you the path when you enter it and will do any cleanup when - # you leave it. In the common case of not needing a temporary - # file, it will just return the file system location and the - # __exit__() is a no-op. - # - # We also have to hold onto the actual context manager, because - # it will do the cleanup whenever it gets garbage collected, so - # we will also store that at the global level as well. - _CACERT_CTX = get_path("pip._vendor.certifi", "cacert.pem") - _CACERT_PATH = str(_CACERT_CTX.__enter__()) - - return _CACERT_PATH - - def contents() -> str: - return read_text("pip._vendor.certifi", "cacert.pem", encoding="ascii") - -else: - import os - import types - from typing import Union - - Package = Union[types.ModuleType, str] - Resource = Union[str, "os.PathLike"] - - # This fallback will work for Python versions prior to 3.7 that lack the - # importlib.resources module but relies on the existing `where` function - # so won't address issues with environments like PyOxidizer that don't set - # __file__ on modules. - def read_text( - package: Package, - resource: Resource, - encoding: str = 'utf-8', - errors: str = 'strict' - ) -> str: - with open(where(), encoding=encoding) as data: - return data.read() - - # If we don't have importlib.resources, then we will just do the old logic - # of assuming we're on the filesystem and munge the path directly. - def where() -> str: - f = os.path.dirname(__file__) - - return os.path.join(f, "cacert.pem") - - def contents() -> str: - return read_text("pip._vendor.certifi", "cacert.pem", encoding="ascii") - - -# Debian: Use system CA certs: -def where() -> str: - return DEBIAN_CA_CERTS_PATH - - -def contents() -> str: - with open(where(), "r", encoding="ascii") as data: - return data.read() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__init__.py deleted file mode 100644 index fe58162..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__init__.py +++ /dev/null @@ -1,115 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from typing import List, Union - -from .charsetgroupprober import CharSetGroupProber -from .charsetprober import CharSetProber -from .enums import InputState -from .resultdict import ResultDict -from .universaldetector import UniversalDetector -from .version import VERSION, __version__ - -__all__ = ["UniversalDetector", "detect", "detect_all", "__version__", "VERSION"] - - -def detect( - byte_str: Union[bytes, bytearray], should_rename_legacy: bool = False -) -> ResultDict: - """ - Detect the encoding of the given byte string. - - :param byte_str: The byte sequence to examine. - :type byte_str: ``bytes`` or ``bytearray`` - :param should_rename_legacy: Should we rename legacy encodings - to their more modern equivalents? - :type should_rename_legacy: ``bool`` - """ - if not isinstance(byte_str, bytearray): - if not isinstance(byte_str, bytes): - raise TypeError( - f"Expected object of type bytes or bytearray, got: {type(byte_str)}" - ) - byte_str = bytearray(byte_str) - detector = UniversalDetector(should_rename_legacy=should_rename_legacy) - detector.feed(byte_str) - return detector.close() - - -def detect_all( - byte_str: Union[bytes, bytearray], - ignore_threshold: bool = False, - should_rename_legacy: bool = False, -) -> List[ResultDict]: - """ - Detect all the possible encodings of the given byte string. - - :param byte_str: The byte sequence to examine. - :type byte_str: ``bytes`` or ``bytearray`` - :param ignore_threshold: Include encodings that are below - ``UniversalDetector.MINIMUM_THRESHOLD`` - in results. - :type ignore_threshold: ``bool`` - :param should_rename_legacy: Should we rename legacy encodings - to their more modern equivalents? - :type should_rename_legacy: ``bool`` - """ - if not isinstance(byte_str, bytearray): - if not isinstance(byte_str, bytes): - raise TypeError( - f"Expected object of type bytes or bytearray, got: {type(byte_str)}" - ) - byte_str = bytearray(byte_str) - - detector = UniversalDetector(should_rename_legacy=should_rename_legacy) - detector.feed(byte_str) - detector.close() - - if detector.input_state == InputState.HIGH_BYTE: - results: List[ResultDict] = [] - probers: List[CharSetProber] = [] - for prober in detector.charset_probers: - if isinstance(prober, CharSetGroupProber): - probers.extend(p for p in prober.probers) - else: - probers.append(prober) - for prober in probers: - if ignore_threshold or prober.get_confidence() > detector.MINIMUM_THRESHOLD: - charset_name = prober.charset_name or "" - lower_charset_name = charset_name.lower() - # Use Windows encoding name instead of ISO-8859 if we saw any - # extra Windows-specific bytes - if lower_charset_name.startswith("iso-8859") and detector.has_win_bytes: - charset_name = detector.ISO_WIN_MAP.get( - lower_charset_name, charset_name - ) - # Rename legacy encodings with superset encodings if asked - if should_rename_legacy: - charset_name = detector.LEGACY_MAP.get( - charset_name.lower(), charset_name - ) - results.append( - { - "encoding": charset_name, - "confidence": prober.get_confidence(), - "language": prober.language, - } - ) - if len(results) > 0: - return sorted(results, key=lambda result: -result["confidence"]) - - return [detector.result] diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 960460c958a96409094a3dc1da339c6439f9936c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4589 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 Ov}ElEp1NVEEBs&M>{ROj diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-312.pyc deleted file mode 100644 index 9a5d6d3cd06422fb58e905b832b2fd1cfc5b52cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27220 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-312.pyc deleted file mode 100644 index 936ffd11af037bb1d18596b906217a495aa1edc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1408 zcmah}&2Jk;6o0c{-Wa=SQzebz5?U3sLdl9&RS{|nBtaFZ4wZ7-%V@njv6t?LnHi@z z<d8!o9Epk(N>ALY@Sku2wFk6HB&43WMYxfwo_MqCZQT<i?VC66&HMVjH~V|DSqEIf zuRrvjTL911p<3pI8Gnt;A%qZ;7!u+UqIfOV65Z1aUXP8$^vr@cVk@b6H3Aykh0xrG z&|>D1Ui$LvVa>7sA$W2~zPK87Z>&c`@~AVAQI>v@`teXi0(En1Ss10=P3cS4_JdxO zGL$Z~2eFJ+hmx)Je7?!#eV%m~M@@6}tGhSoW}CLZS^x50FiE}GCb40B505`$B@8?g zf~SS%2)0P5?KeD~86jcjmKN&!#?i#uvtCP$DQRs4-xJT?1jowjs)RC$+~Q0Qcp9kc zs-<G9Z#+Ws3poT?Y2bkD!Xw1Eibg<Ih=asll<R2XZ5OCf$>ci~SJ|TWwZ$%cJ6q}B z?A1*ILxg_Av2#-l`i$o`rBND5O1bjSm79DfD8Q#8;VSujKAdV2^;MU4(A4BiFzINy zAy~YX&rlk~z7UiO4Xu{;UJcw{mM}N*rPy}YvtW?0R0>zJn02|IEDIS04;Wt#vxjM% z`61)(HcPkNIO@3lq3mVp^_7pWxgwHmx$g%L{4Nu2KkB;_uZ0<R1Dt}8Nw<St=oh1~ z(jW2$M&G&krZX#5iC0h|R*<~hgJZjSQ2Wzfd}hCU-1_LZ_S4p<BjcxY$5(GZz53b6 zcxGSz%WnK!Kd3)yjL`z#YO4|yZB>{Z!jL%HMsBExPv8mR=TRzD<Cgdw(!8PaM5t)$ zCv4}^RA$o(M_H*6*n_`k=lMnC{y%7KO+5|4_yS(%mz0aCz;^7X-2uY(795puS>3Jz zE*1eDjnANT!<kWoq0*%^uTz?2;UHFggVOH?eq3q_q;ngQ$4QdIT*s%(7gZwfA<3JQ zfe2U}Q|b_YK?PLleO}<gZFN<V%Sv$v$;*8>(+qR|v;o$+Q;nDlkAr^!x3OLcPOS;o zdVEExT7~Kb-fa~n6b@AZ=Zoo>n%r`j=gQ$0>d%stf0knO^Vy^`X-7FqTtSmtC>8h+ z)WawfE|6B;DT;Vy-zvem!#_Zos!l8+In@avXP*GMc>>o?;Q9%?|H5jL)*lx>JOkW| GT>k^Z?Nf;W diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-312.pyc deleted file mode 100644 index 1d798769b7958657a0bc4b28f3042e5dbbeb3474..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9659 zcmdT~OKclSdafqBDZV6<BB{4zT94SY$CjnBvzBbnShh5_Y>&Jv$=MlBk_OFgNtF1I zt6MV`Eg@dOi^!8KRz4(BfIK)r4iXG(1mqAOf?y9h<Z)4JJrU7x0td-Or`153I9MP^ z{=b@RQd-jEivg!){#EtYqwDd1e|=T$f3B`}5_n>N{$T3NF+%<W6NN{}NA`L-LRN@G zBrZXcT!c$nA{LHF7Rj2hCiw`T6e2>>7O^oMpQuXOBle^t;z&9pPNowQuB1ESPF6>% zlQoeVrn4nHNpHlP^hJEh+DI+aRVDn%KqQb1MuN$@NFCGJ6ZOf4NCQVK<QkD2kBH=a zYB72iX=FMV=-hJSQ)^z^#I)6*ttrtqGpz@--V$vK)A~SLTcT}cT0dw5CE7No4T83= zM0<p3>p|O4q7BVAhMRV<Lt%?9jL*#`WL>zEil<XMFqtH5)$6YeUppsWy*@B1j^7qP z8Xfw9czbkkXjJ#GjPZdhw}!;A;mDAF#87<t{o$(vx5UBWvGLL2D|g0+Z;yzh0}w!C z4MTUX-W)C0n%BrFX)cu4d{=wpKdjUq<Q!@bHLq*0@!FN%_j`KFHR#J{m9%)Ypn6@C zbvK5`%C%R6`jW=lSh{jcoZfWf_Vs})xC+M1uw^ish#4kjNLxO!w*Zk9B9jOwk%&d& zB38)~;U#NCkobsA@=8^Y_(&Cmb_nf~Lw3kc*)?HlgnE)wc1wa}o3KeP$gP$Hxn{y5 zxgqX>xEJEp5ch%Ymevwv_XIC_Ag6ZT7WU~4SEr(MFs`UHes@j<vl>W66Z1-3i4&fX z$)8>O_e|htzx;6WK>(wVKHNcY=r$^=b2K#)LmMnS2qw(kTLQ5{R5R~szQh6%O`XI+ zDi1#xj0IA8*g?t)DR{f_u#yEA0<Ht{3KK{c$h4<Wt{4{H$B}sw=0_;LX0nj|QP{2v zD#MXqjKSbVH7!n1`JR}jl1z1%s7CK5WKoG{WW7n9pN+?&2~jGUA(2L5qI5x&(kWSY zLwyxWU{eazW=$Chfy#=ku5&uC$cYIB#~%9CgYKzxQtnPhRps;U!E|gcDW_DWTa^>? zB#kCdDQY}6Bhyn-`ioQ|9fdA+e=es!?@q+;cF)eMQ|Z+Er+a$4mAEROnvKS0qLZ@H zJsY3x7NMAwrrr2%Nmh-pq}!)w=XJX%##3=s6f;M!R#^Abg(8=sy9$bjWZy>4_5by? zCH}cRlxuFmuwmCpPM*ftv0SieiT^`quB8=|jfDa^yZfik$IhR)_n-|@-cn9O4r~ax zrdWtQ%od7vf|g<0$-FhpXO6IG4Mmxu%JjWZEFniJq~}A58dc?w*n*FQt@H>qNJA)& zqUZo&tOD)AbUTPlTg8cBueptNnn64yyLM97TsqR1I2B*p8z^jeMCWnhbvsHiA*W)d zIYTDK@wfK^#0psetj`>W9@K&Xn?r@H{IkG4&1)B}DT`!Tv@TdB>&$OMjgbX%pPM!( zq)-Du!)K~tnk_|$EdY$BO&AqR&OmJ%mITN(fmF<0u%dUF8H6%*>|OR^ULj__%WQq# zX8eV#GVK$xEQO*WoQP;lm1*dUxH=V@Nr6F!U}7fKsU7V9&i}&0mWm>}<FGH2k+7gU zCS}#YqOo+XkV#um;39^3+KKTniW4Aof#Fucu7u!WORMwPiA-z7wZ-gDpoTIB;vsqI z@-N@}^3uyd!^+5$k?h%D1dcx*dKsu&8p^r6%L8Bb=iJ_Hck7nBHS5#d?O(fFUwQ(| z>URAxt^U}S=UC2Pw;I@P?9m!~HoCON^IQJ&xj@5qpmQtGxyEUM@V^8)cdaDQ2f}-N zw~Dyyn9&?Sg=r)gVe!F8$Talr@B@a^1l?|g+%iT`VZosWb(df6u?p`g-~P<^pryg` zd7wSqSxA>Jn*p*2Ib}>M1GbQH5wgfFfLEA?a)%#gzLo`!^}I~}7%-*GabtrD#nP#X zxCCgFLwBPJ*kw8ulJA38jHf0;QdEsH0}R`WUP7<?cz9&^<2xUVg9GCO;`sH^p|R_? zZw=~IV|PY}#F5*y4SJ;8S?bfFv9N_1q|Q+V7o=c-HE6}fw`Y!3G{u7jC!h`G2?*wI z!0KErnyV$tZMlwS$G5xAX<g@@1-ARfwZ8GKuJN3|e&ynmi<|BvFI}E|QGPpgMhl(U za-GR}1KZw^<_+b1!EIl==4&rBq4`)VpJ;ubXx>l0v08jJO9Q($;`J?`UAgq+(v~Nb zt8ZAgqbl&z#m9@A_Lg5aSR60&YG)x*$zaPH0Q#3Pvd)db^o5|d9vm9EedpTsLz8~k zW$T{Fv?|J}^xWi>h|8BbUU^;*miz+VQgGxrs%=k5^MtZzw>vIr@XvE;(|*Zt<eV5g z3@tWF^e`)Ao(o$>=qZS=gP|GD=mNG~vicPFwM={Et`$5S5<sO21gy4`cxzb))-4oW z@JQH?`*kXsltoc@iefS?%>gkHfpUoV=AsEBhxS2PiYq|hN70MoH&C>rz)tJJ-Fa13 zbO#1eN~80-HJ(!G8J0HzEJLNgiE;jJI-Q{XSPw@)FQLHA&DbyNF@^$5C=Wn9BDt2( zCf}Iz_#a-+)zm(`mTPU><eT>RY9YASRwcCV*1ClgtHIT|Y<%-bx7K)Omw@8gRTlhw za1T?vEgqpYE9?;ncH6DO2id?Lfne7u2(_!{vcWaS=FuLlxp$X<Vnf--z~~qDCI&zA z!SUj=hkg8gSTB=Z3rl2zlPr(iz_P6}FAK6Q&!joI3OF$joY=kuyKBS&F2trc0*N30 zVL58dmZ!Yymf)>_!~yxmKCtI8xUrvrQ!A2Ewa`a!fko1*n$8fkxFNDfbr)iwMMGiF zJfY_yf=pJKo0X}t-dNPwD1itN%J$6~jG@B<qw0h}cZgyv5mgjXGz|8kv9xF~nf8h! zHc8=+q1+x8{_lt6g}wT5m1b{vZf|<gae<M;7tJRbIec;A1~Q{#Y>{+3+MNhTj03nb zw>w-Z@E)ARq1i85fE`&F*YUwY0OGh=;I;rIcr1~DpCq7mjKCSD${_eVe-G-N-vz<w z#Lib3LzprvUbh-Z9RY>zoQP8eyfY9K1$$9o4F+sGD$jz+O#T3B?IC0sZtL1sqfb6t za^_sY)xegkHRlhmHf1HP@r33-xi+<NZ+%Ad_dOfb{FgV~mvbJUVY?qd{dFh(5CVD` z#Q+KhU9=E-1;teqgD4P@dUbyJVsauOit8M`1zN^wFB=Pa9gCuP1V3Y?9+7V?yl|7- zb=!s7Y}cBwHotlNyw={gOF;1~_6h@|OIYzO!s+Jdy9}pwJH3Ik$5z0BF~&NPVi;fo zT4I2S-h^0r{FEP}iJuj0;$sxdt)e-;RZwi;tA2n2T?!pVVS<8=L9zk@DvZNKz@K4D zcTli_pe@tiLcv%y5Ll8o$j?xT;*T-%DGF8tRd37G*ged<Y-;p(a2_gHQN`YyR<w?_ zUt>k+KG3o4B|wzARybQ*VwU?BJVQ_cj+8)JXlDv8Vdrh&YWcjI6$);4(OSI4DSO_q zO17s+eBe3YjF&*M^Be^MTQH0d?G6}I5CYu_hEzDpAqeO=YWY}Nk`?Sdxa5%G(9rE= zIx5eJX_0>g1r>B)4@oZATJXr8<^Jcc&MXfC$!zVeKmu)9tLE>>POaVh3LJCK(%=jK zscnA`L^nF0S$^Tau<5>Vz)P36>?pj8qFBQ>vrVz+YJs5~bhV&BS8FmCtoWAfzsb1v ze3t<bF7>r|g=hF$FUA;g@nH;!O9hm4R34)VlV?!fSeHX&<zk+!yq6~{H;ZJ2R(8o~ zTSYJd8)5gbi&n;1jN2JM+|%%kyVSt_3Vhcvxr>#t7XC16F_3|mUxsgHuG)0a>-o!$ zB0^k>42Md|;4Wo=()pTcF_H3jI4=Vr7<=hBxz_X5$+i2>xb+9iH-W{t>sC9r+-=#< zHU_u4&L1Q*6^TrFh)m<aQ2Y(PvIHWx-h_={#kT~JhAZ*ObN_DuV#8@<WCV`@20-i> zdksL2RvMuRkAH#|%EF^R504XhcnrT0JaDzX10J0wJbabmA=wZrV?goC0H`VtAbZ$h z(0+sL|0PZalA9gmB|Au|cP@h{;W|l3mfKp|E6$UNmrbmS{<=I~3asDLv?^_R+H>_y ztJ7;|wYF}p{>;V&t^R|b2ekU3f3RrvH#WUD@T%}cR@ItLYX0}u9%%mlXXBcGVADPD z23yW7jtRv-VwXzrbOZ3@JiO(A0=FCp49bNS-xi+6;Op4CjHd(Sz80sE;mMCNw&4UY z_BuRO8lj1&e}fkG*qR*LZu;_g3g_{3{f+SSr_fw^JmImpgvIfU&AE}qr5p!Qv&g5K zC17?XrK?zJ5954BX&YinvLot{|3MvY-m$<h7+aPTa~B~cx!6Ymi{yY54_74aQUv}8 zYVZ67ioZqi62&i3906g#@N-Q59wsk=2n)p%Ib(k`g<0Jo6g;aS11zP0?G@+W#OZ%x z-9-=;aLTw~S2pmqt1B0%U+rJxwdVJ<z^TVWxoY2X<azb6>{$@N69aX?6N3%;B5PD@ z?$H9h@JYZQ%z1;WF3sBk=X>voB_Zd6n}0m>vyTOyz>@pB4n+5%gA~QTVs}e0JPa82 z2*HE25fq4F2#j{I;#<NnUU=R3{<{ofiZ)t-5aQ)k`QDoVeTB90+R~WH%1o~x$`qmZ zYd2Di#T`B>!Qlyja^Mh@#aA&#$IjjC1a5LW_&nK(`Hb7)*Q^Q$@d{%yjsAbI>RAxX z=)DcA+~WsJe9q-rKKtcGByWK%|0m6wziZ9D;ahiU{`WT|*mO4C{co_}{1|(P;=k}M zhivsbZ<Da%NcgC3!>{P6NovK`co1+S2=oiTlv5k(7^^`-qdVle*bHSk>;?v=lu*2P zVL9p-EQeimR%1>L<~S$s;{OR@S?nm`#VkBP=vC8kh3T2cXU-n|yzZDzPet#t96XM) zOKo;*#%?Oup^nj3w%0PSvROEEA^t1-MdMEX1G)^YaPU*`XufOZIPTSX!i8S(JZJfa zfOzG6v)H#z!u7tgUE{dgZwSi$af^qm-3*=IClKy;9!R+JIS}r*Vb0OMd@&y+j(l&Q XK)8RrjtjB`g!{cl1K(n63<v)Q-Vqf~ diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-312.pyc deleted file mode 100644 index 1d3c738ef1df0c8ea9f2696e00f36196aceb35f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4143 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-312.pyc deleted file mode 100644 index c4a26ea7cce0e0b002e9a536581cfbf203ed99d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5039 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-312.pyc deleted file mode 100644 index 7544fdebabc68d54dc66a863ab23ee0d50c9daa6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3899 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-312.pyc deleted file mode 100644 index 83d34fb93a18a4b785252913e943fc8654529586..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 810 zcmZuvzi-n(6u$GXxM|Zu)kY)|l|azSLu)}7hKeOA1tBUV%0QOW)pw1p+GlgV6h%x( zFu}squ%N662L2BwlqI?aAtts;0ftW8*(nl;ll=U>@4a_^@ALaqt5tzI!P}?diUGhk z?VKHF3MOp@jsXD##vp+mm>3-c0t)$(;ta)^9TNfr>;Pgu2gIT#u|GKPt+Kvj^()lY z)^opW$}?nb@6r8j)VjUhx_f7LN7{S6ET$fmGkg7vl6Dk`pe!z}IdvwX0>^-Y4kVys zJOtFF7J&ywL-Eum#+H6t3Yi7^J8J!hvkT5q70w@2(WviwGqT=FNyNGj1Qzrj4#J30 z-P?wo4Pu<<NZ|dL%DK`xz=24)oXvIiG&CQCn4_4osc$iyQ0c~)b$hr=cfE>q5z-_= zvWifWl3uLw972zKI4&bxD=E#03Aum}W-L{oh*FlTL^Bus9hj&DaQe&-(}em77Wt9i zPJ>=TnaF)XW7_37S<gij98$hc(kCoVF`?W)qU^|zqkTW?i!f!I8`rM;c_iq1hJ!=Z zVeV&9<|CCxQts<%2o-)%$WjcNl(G;lOV;NV)kk6UTIE{E7ht^H9BdBF!Hw5w<X#!q z8zZ;z4|n0>AQ)~A!Z!;ecWpd>{^iVgarsq^FP~j^OD%^j)ZFo|=SWBNGxcA%-ityU zZl5JeOSi(8v|m)$6*_gdN@Z{IrgEWr@>OL{ObFo@u=dqF_p=J@OFt~ft`8d@ul@oG OoGgNs%b%@ganEmEY}}v# diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-312.pyc deleted file mode 100644 index 30f03a6ae91e2fc0ab085edb48a3afaf07d4b6f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1417 zcmah}OK%)S5U!rrj-B-*hS+PkSdNGoMfO0#ArUA9><Ed(Cc@$}m)3Zu?Hw|YrMuU# z#s?oPv6hH9A?L(BGXI1NC^?`}EFp2?X0f&u<wSMQPS~8%(o|R1qpRwx>iKPAVjOTq zzkJ_bZ2<hO4)wB!%;0lmjv$7Zq>zz-5XBp*k(q(1c{8;#JFqoxrB2oe8UzgZ3}X8L zVu#tsW_4HK_8Ol155bd1%K1BAt=#=`H4&00n_Za{`6qdp_Cz93IkQs4Nxr=yL&?^{ zsGZ~trL$|@R3@MHBwJ~Re1pmRyx3$MHIpm%Z+>u-ZmiL@FIMl|i-yVTZ5SN}_we`w z*1{klF$6|z_hE~~#z8YMnH3XeZyB+9U>y&=1LvjG8j&{o@Er-<4e*@uf{t6IQ97K- zF3%%XV7*ju^$q$+ekMmCYYiNdJ$Q&P*Wn1r8g!6OZFW4oZ4anb%jAWct9?=X(qj+4 zo~rf#@3kd?9-_bQxuq?-9mY$S(j-qLrCi<5)ivc<q~WI`<0|>`QasWo8md0+qN~lB zVA3;6OR#jS9HTT!Lm?;?26`>*zu58HMaKLrlw!wUEuwD5aw&YtQnt;*Y)Qx@dcgQn zTzs3SMHn;g@34HwPm@i*)06EYzrOtbHD4r>Ep@`^LAcF?-$^<?MYFizeuQ%nGwDYi zY=1{j!*Zv`n;3rg&5_<L*F|1Njd%~q^L=>cP8>G=a9dB^x1P;k{dN7x{D*z($H_AX zu6+FDo!fousk`{6+x%(#aQtC&fIjd_Yn4E^R^fI8J>nVbrLBWLhR1|Yqgbf!E$|tn zWm6@Kc+ot}*lueyyHU+m<)#K<AO4z}<!>PO`moO3g0nE^vuMrd)D0tn-89U%yNKPZ zkknFNnb!g5bU@GGV<=ts#?*MId?_u*Db0$wn<~CZ={Maltuz|$(na`jo@B2y@k#TR z%H(Y%<-~9-B9^9<dW2t80abptH89*&riv^o#VsVy58&Kz>`SN9;7pzx#GZQ;{R_Aa z%vx~j47t{$%SzSKsx!20=@RsXs(@)dBO~)$jr2@4;zIplvg!|`A3!;kZ4TQ}%@bG9 zlnzP-J_q$Ys)RMvsyn)f7w$(DIJfu}l&R{(0+Lgc5ORJ4$c+=Yb^_N=VDZeEBCX$N L-aQB0b*}#brx#NC diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-312.pyc deleted file mode 100644 index 07807b7729fe6a88f04b32a156ba3219131bbf01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3017 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-312.pyc deleted file mode 100644 index 3b44d053eb0ba35274b90b083796559f90055c82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4587 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 Fe*l7($ISo$ diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-312.pyc deleted file mode 100644 index 3d87cfeae93d7b821f061ca4f5493217292b020d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15331 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-312.pyc deleted file mode 100644 index 54bbbd41ef28d054dd08f0e152fc818953962db8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4404 zcmbUkTWk~A^^Wav#<7!ef?4MQi6Mky*u>2P=<?1cSso=0B+j<7b~~DQCW(zbcJGWS zaSe-BshUWv2vw`F(rTNp3Ph!Dzsi18%KjnsCqrnRj)EGg+YkPt2GrI5wCCRO7{@?q zxw7w^$35qsd+)jDocpJmnrZ|s_W4hze#9g6cY;`rEdrYufCVHWiAkaq6J;1A*(7_? zma<3f6m}#XDK^Sdm`yrURne*x7v(7KOuACl(P|1;CEY1c)I(t|S(B=b)-uS3P9w=R zgQRNNbI)$h8Re(lLC+I{1Q~-JQ{rjm31ec7gJb>YE)2v~4adi`8gTj)F*&WqRTx^| zpO)gv<ftZU@{kytiYs!^W_XGqB^#a#I6ZC+0vR7w*q>H3`HEJi>#d<|Qj5Pkt;zjU zA|91BA}3>zsHGCZ=#VfpJTQ1ZW*Tkwjv}&o4S=7+zR4)cNGNKPT(f9`k!&-bsJ#f= z0d~l&#K_JGo8*{r+$#!4t4dV1jLJz)*(F!Y?g?8Xj08E)ghQ&DaYSnXt_2+&!2B$_ z!bH8JC|GT{simgjh7-$L7ArBbkyaxcPX3#}f$mq#0@5rFnq%_l6L12{C<bYkOCZf@ z4ZBy=mPdlMbfmdU+#&$nl7t41W;RPRa5;;XM~Q6~{QPT;WY9Fa%Y<QNteVZp*x&>q zuEaG#z(hYL6C17=bpk<6VPdecT`F@HK_uRilQDJ?o;PNmdx>nYSXO22uFY_$a&p3O z2|_F>s;VHUHV_D0|MqfdDxH!;DN$1|hX&HIY)V!%HKfT&c@m4M4pocCF3Gq<O8-Pj zrbS7{q06#zIh2f#hceUJR9flj?CK7waZT>Xh_OrJq^yQA@k~g7VNx20V&HC)tcB!k zERo4jr|Zm2<9e7rXF98Spq<v*zXKfg9q7Kfj@G!ExhkD&c*HfWH6HkFc%|{^tm8)Q zTKkEW_EWQtN8IkUK<`T65CM0ta-N&jbJd@CHbEG@+%et<&g&cl4y|<fM3dPP#oKJ* z<Xe7_*b9W99oNAJzeT$3r1L{p+-uxqv2t}~p4>@~sFRFqfzDd>T+Iz0R#f12>fFu( z*QRrAf9Be8GYr|XG{8-tCpIsjX(nh3=bWIw<J^V2;9j@^=qmB+05!nykP`u?5EL;b z=Nif_Dd%((G2(I8(K_${-{v*Ab7DqRz~wMm3T`Dj%BJR$qB5BU7ukC97WGj1l#O&s zgBypCB|vzL5r?%}6#(?2lapFNaAFpx?0emI4t)&QK2a`N<eR+bAt29KSAPJ_Gar78 z&<7xO)pphXa@`4HK}E~kEge@Kd52aC0tuRxwhq3u54PtV==N--6D&~*DbINlSqJg3 ziUw42lPX%?cCYBc5axUqGeNwvqCv1KS-`-`m8vb46OXNE)N+5B)*TfC0NtupdAvm@ z@r;T_bgImaKfYqGcU24r)Vg_B*}P4%QJX%@le60W;#kRk42Zzn^CB-nqD@76xt2V8 zujoe%(N%=YMc+)<Jagln|HC#0)@#p!N6{}#--O=Kve#$=yME?Cc}8-O?ELaQk!;1C zh4ZUyWgfD>l7|pIvGcE3cgKt4t@Fm+AQO5uAGqIrk$Y)?gyS-cUgNW%<s~bE8iWn! zcD1Vk_?ek3FcsGVkbToQAZh^;s(^=yZ(wo(pZptIuo06Q0F!%YxMT$~EQW&4s8*mt zgUALjCeg%T2S-MRM+|2&Jvj-*04vGk*-0EAvTdZ}$RKBUI3f%U8ctKvaGs5f5}bQ) zcq}|1oQ)XlXryl>Vr-j)5Fg884EbCjfjucJMzsLh-$ZG8G8_}KEJ67}tT0>ygOS1h z$l35|gP%-mf~=&olT(5uYNAm~)uok*xFjnv*{B~qGdvRMABzZ)Gb4k5oF51}X|BQK zni)*oaFG3gbW^Nf=oB2WL;zD%QsD$>GxK5(;5l!3HX^1S0jjD)3b~F}`E56^&0SmO zgUehHdcX^OPzRJhxXc}d{%e0=v0=r(e-rs#KVarg&-Tq~>&>mdKJn>^LUXU)-1|jj zrTNJ0`BlF8vwWeoOK<IZ$ak%JeGBee?t*uh?%lQOJG|;^DEQiSUpoK`L$`)jecPY9 z*t+_s9@KiE(9)&1bj>?{={CIEi+Z~C*6xRV_gc&TLQ9X{(nGj^Epf>#D=>>?$8o*+ z_)7E1d2V%^?>6&`L#x4#`GJMuTf>Wex^FL?JgEDE1z)G`>%61=?xVXOEpd;0XDNr! z3ceoQ*Ym}|ABKNFy!6Ar_`>VN;4+yj_nG^BU$RTgQr}nXa_GGWAbzn@{LKA}OLbq4 zEnR$2_tn^P@An^oruR2OWaBovQOn-N@lQXPb=>6V_}h%mHLbh(n@8r3e72*|7}6U< z58WZU{d;tNPl4~%`QAtTA=t=*w@vr9t$5q-I12kt>ibSU^q%~>d|%e#5OZ_6WzJ0R zTPhiHV`x(U9Dp}T>WNZC4+@IS3LIBS0=0-`-~TFO(@JSR58={E0Heq(_8jz1n|0n{ z&}rCH;uR<XNySC{p1#2Z_)Zv}V%1JDm8=q6-*kK;nQJO{{H<3_1ipF}I(h{vTz=i( zT=2iG``<43kLv!TEB@oNo>fBY(*0cp|0&&nYQ_KVtY?j{pFg&^V}<Wr<~nI*6|~`6 zP#O-_k!J^~1qA`(gOEx~*(8BIg7D+4m^3-GUZ-WP!9nPQ$BH&>*r6;di%(=#21_oz zYPiTp#8{lBVGEPnZLkyYg3vJCs+!_UBqk@5f)Hdd$uhK7JY{Z64d9q`dkG^2-8VDn znT=()KdZH|dp9`btlh9NY{Tu?KM{O3?G|CfS%jKyw-HuTiPf~>Y-gKpk1Za&6I^cV z(RcQ4ARye|u}MA~VTNTxi|oG;eCQt0`NKi4;nb!x@W{q=iCz-J%3opT!>ry6bTpKv z%-1@7#u+S$`6`X^#TcH*#1!p{`DWu&<HfSuOevUDi-r@ZDm?kzfKV&Uf|^wSbbG$# zj+qB_0$&6gsj<}q&~4ZmhI#fq#5Dc`9e#|u|AsmqqkWH2&ttUvsq+-WgqG{~JwpVb GEBp^{vYzk& diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-312.pyc deleted file mode 100644 index cb4a81d7cf2b46bec4d99a0aefa8cdfd62ea491e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12103 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-312.pyc deleted file mode 100644 index 9d150cabf449b47308353f84ff5d64377340df57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1411 zcmah}&2QX96o2Edb<*9Wgr?oVB}!F<g*F!LrBYE;NGc@K1k{L&FC)jEWKI0B%#71+ z$RUSFY$Pg9C_Qnn!hgaA)E>Y}BqUDUBDRsLo_J%g+wF;w{N~O3p5J@pUt6t7z!m)b zUH4B5;BR%PmpNjFUm$Y~A%rA`gm{D~UW>Iv_w<t2V<Ry=v*eA~N*Z2+fCisKXdXgn zG4n*PVtIDI;n@EWJUOJ8yZ80->VuU?NFHtGGRo3VQ$OyDNT70NISZq7dqet?t@%MW zN*PM8uH~_eKI==i-1YeelV9;{lX28cmBHx78eRKx<=*{ZRD8LOvcvE`9>2%CFz`qS zo)($|*dn2J*z|N}goK$}TBsiyCnImqdM!1^q>TYQBA&egj#XSL^HyaP7H2Z&X`n7x zFO^(<!vT_?$T7%T14m>Z9wW?kIs&o=9VE7+S|_7u`#_CaCNI@o?Tgyi9{cdkbgh50 z*OmnOi2k}`7pBO2j2AYgQ5s1~xr)zKm|`L*;in?us`z3y9BUKxRiF0I)#OYt>1c%^ zSiDtCP#VO(5R?iHz2*;I?YiA8VQ%6}vFom6L7uQw3Rkk2ZF4{A2pI)CjCaE9VH#(C z$hf=9(p@)>Hr-xdcC+->;>R~#5lPnR`N59A&4k;FdM-t?Fyn53a}YA=vOL(~y>c2B zdwt%-^m|vvdb3zx@;Yk7B9fN}aB8=X8o%4^=k|N2b07V({%r2f!1!V6^v2S&8+QlB zb9><ryZPhf(d6Ui5Ix|n#wtPCScTd#^ogUb?^&3#v-;pEJSF@x%7tp)JfA^YG*zt# z7ft<y?X|~?8`n5!J5+OU0Dnzi<L@H(zj+I5HRH@r`7B!Vt4PKZ+p(W+=Lp@~h}6=K z@@Xrgayc5Gz-`@`P=ldLrL>r&G|9p|R(zAvZ*xDcG$qi5jlkn1$$p{ZW9HXXtoM-= zt<gXPERHF42!98qWodUyOt`H~6<JV<B_uBo;X*Ua+4Ck?Q|B5n+fRaj0k@%E3(l>Y zdvg7a>V>i`uTTb57r0zb$Jpdn!#q<Bw^09<r24m%qhCxXo1;!tlf+dU3JawIAA))q zRlz073as)Huk24MaF+N7C{rC5^GMEhLdeB!Ah*xp<{8{NgM}AXi?n~6`S1d8FKhh| DgBes` diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-312.pyc deleted file mode 100644 index 8090bc5e9b0e0651520371de7c46d5146428cb1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27225 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 MC0d$+aYN+)0PZ8=0RR91 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-312.pyc deleted file mode 100644 index 1e8b074846c1fc6c17ebd5ed696b1863697d6a5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1411 zcmah}&1>976n~?ym7QHXaqDE=UW`LZMOlj`mq3e2YllLK-GW^Lx(u>3_A1fGc4lOE zT_1cfbPWwX73b7@aQ~BDT9QL6Y$){9o9V_7a>^TNm26HO(3>~!dw%bYervTR0ax(L z_uaoNfPd7XUgn4yeu>O6gb<P#65<h}crDfv-P226kB!9i%#t@^D`|KQ0vdb)p?L_Q z#mp1Eisjk;hGYLr@Z^wU?(R3s8~0ZtA$hc!%P31fOZ~VnB7w@8<t&WS?RDu(w(1An zC}k+Ux|+u_`n)gMa@XhUOn%L?O~z3(RR*K$t913NmAm(XQSs$A$_~SOc>DqH!oVXT zcv@%<V2gy>Vbjx@5fWx@X`y~-oQ%9Z>$TJvlQstM9r5gSaIE4|nYSvVusD-BPXl$q zda2~<8xD~COpZa;8aN{R@Cae9(-Dw0=peBj)jAnP+XrgYGI^=yYG2g8_SlC9)3yH1 zURx6ABl>HOU6>;8F<#h|MrkA|<tjc`VTy^MgrACptKy5<aI8(#SAE(;SCccrq@xvv zVDVNlL1_^CLQpC+^qN0-x#M=Tgt>_?#g4m@1$n|!DO|~7w$1&dBV-gjWV{n*yJ?*H zA>-~2OLyEj+H`w;+0D{hiyz-~MI>3L=LZk{Z6@4a)N?7Cg&B7PoP&@_m*s)n?UmE8 z*z5Bqrr&#atT&7GC9k7KEFyVv0H=2AsPTv0erCUSI``49YftAs85loKo!(e_dgIQ( zcxEsBX*YkGJeqve9HIxj)mSAc8>>(|hCXq$wLJ?{b~f%mfhUAtM!8VUo98n~i>9g- z;i9RZu)X$papM{XZHH<O4&d+UYy2JL{x@%7ZTQiypYmC>=2wx7C$?ih-OdrZw-KqO z9p%$jMCEccK7resGoc1Ul}c$bNokUWd93&*rQha$Txm+63mbvQNs|3S$H&aCsaWqL zDO#g}2v{6b>JWYfrDbV%N=&$|OchyBiX|j34&g#G%-QoMSX1X3G24%W{{Xk4UJK5x zntOcxjq16wEw4}pR2R5hPRH2fR>M3~4YyGLmZbW(l%rovC!3>ARFlM28wv}h0w02U z7*)X~$_lLV5-;sfD{z+h2Pjh=7xPHYbwbF+Z6LSL;N}_JI)jDhR*STMpZV|ta4&0p E1?Tis(*OVf diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-312.pyc deleted file mode 100644 index c6a12938ab1182cce5b2f71a2786041a3d1b4731..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19147 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 I{;uc$0B&fMQUCw| diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-312.pyc deleted file mode 100644 index 9bfe030c9177bdcffbb3780c589f92779e18dae7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1424 zcmah}&2Q936o2Edb<$lzg92H4iHJb5s>C9>v=ZVgsgNoXD&^+O$ZJn_UHq|~nGM~L zLk^MHNFYvCIQ5Rgf5HU>hssLSN<H-!b%}&H^^LuTg-b{Bn>X*x`~HnzHX4(FEBO6k z=T8gZZ*{1aIbw!CB69#Cgd~Q9c!Vfki?u}e^n%x8BQZU*;EmWyYF>?i26rGd_aL;G zd8n7ZJiA|W?0*QJ9FkwWb9-s|>e6Z?B#&A>8D;6M)Q|fj5~!VC$-*dYZ%ALVH9zP? zDMRV`wO%Zv+kMGaIzHcE@+Y3P7)Q-i>5Xoz(Y1T4KimyQ=@;85J`C^T@ex+Tz#}1e zT4)YnlZ4t{-P4&75@v2{p}uDvj;uZFqtqCa)&}q^@$3z7th`<ZE)&Tu&Sa0LfvT}u zD!TfH10=tZ1CW&l_Q?)B!A@842*|4MAaNq)Ivjc10cun-`BlYLwy6DRu>(I(Rr*hR zb(26J2e9tgxhZ;G#&es}D2*hgT>0n9O+FD61E3<|D*1dS92*q%)ugu3)Z|Ps>1eqj zSiG4}P#VO(5R?iHt>$(=Ja9W%!ra7{V#{64f?mQ>DO|~7*5-b)AY>HWXM7>d9;9*R zhm5;hEZuVBsO5J1vXiCDi&vLi5lObt^@IC<n+dlYbzO?r!i>8CA|YhbZMPJhx&<H> zyM12A_}eq%(^;&_oJW;dMDl(Yj_k&M?X^Ao*1mYu{PxAYH_dAU<MElJ%QxO!zBMr3 z+L!*Y>rW^5C!f@ZXaS#%RtbvHs=ggSpE%ljZj~{g!*jyVqFku)&GBiZd0l0T4Wp@_ zu<hn&*^R3lWv8I93x7>r;OCJ0|G>2s^-Kig=kYqfpj?cFwqrkS_pp6mG^G+RsQXpO z*&?K)@d=c!I}-{bDrHLZNlKF}?8S<&Q~FEKk4sI_@!ZA<Af{wL*YRQVS(VB+Nb<%A z8Uc%AN*%(#RsmIlH;dkITU}M;l2Tkp@_r9aHN%`ase^UqL?h<xv*2IAZKzj*6KljZ zpUo>(vrxUmyUn76!l5eQY=M(8441H;E@3Xze<msaGsPpwr;^raASI-@YE5pTRN#|P zPozw^=(U<pQN#!PTG^cI{0hocbz%<5iB1SP{SL_Y$FOt^%f~SP&T5e6t8>mN;9lhV EA5Gm<T>t<8 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-312.pyc deleted file mode 100644 index 2b1d4ec75e1bcae511d7e33d1f9bebaf042194d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5843 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-312.pyc deleted file mode 100644 index c986b7dd532025b957d6184740633959a79ecf82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22176 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 Km42WP^#1@ssp&fa diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-312.pyc deleted file mode 100644 index 6c0b968b42fee5300e44691af848977acde97091..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83024 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 Mt0zyt^_E-yKZ9x8_W%F@ diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-312.pyc deleted file mode 100644 index 90d1a407f5c8d80658937316dfcec98fead94ec4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1415 zcmah}&1>976n~?Yw6e2nCvIY|+lz5XsR*`catWlEe7Ll@u~YC(mq9Cyy-M`4otbsB zjt@Q<x`u|HigW5cxc^BnEy*DW8wx%3X1Xziocd<8N;jtt=*^q==6(I%8~xU7P6Dp* zm#3ZAHo#x%P%Uf34A+o3f(Rm#KuUZ<6mKL(TJvj~uO((``IhF*#7^seoqz#fL1Z03 zWHalyR{HXte%*EcCU|m5F~9ck>$~?>V<CCm?#VdM?q)&K7qLL)%>6uyv+Ye8NVXn? zoj7ACon7xGGQQWB?0zTUn@oPo^ETtCnbOYa<~m(}xccRTaFo2>M$uvT0FOUlEew1T zfp0|C0JcbE95nnIGb6&REhDNOn8zb)-+nJO$E5WEJR!cb39emS&~eK&3Y#<8<5{Q* ztd<I{zTp7L&*TVXrGZ1T2hR}ZDjWe>fesSeQLf{Ww>_X{C6gB_uChh#dy74IG+pWc z+pC)d`iTC9>lBvgbr~-lO5-e+lyc>tD>ubNsNts~<tq8&N;K9c8mK<)qN&B1VA3@T zQ?O*Kn4mOF0wE|B23jrbzuWOTdCI&rkYdMM&BI>GGATUC61L5QbV<lKe9ZV#lz*Qk zc@Qz~?XYaeOX9ZI?aNM{-CX|sh9_dlmbyXsIM`;w>&9J=;<YH}UWjuLG3h<ZJ3+gv zr(wC<=M4<MdwHxk%T<wAQ6rX-yxoTrr+HZa!)d*8K0cYh{_Doe`P&2Y$ElNRD=)9z z8JMq}#n(>br^&;~XN@6Rzz2<00^L}J+7a}LYitzOn#$t^ydeA{iiPUk0-r%zG*qgH z7R`c`?Y72q8`rqXOpU=l{5d_#KSJ*R!`k2EoCO)5#oK&Nc^C`qBtf>_L*zaLq>?VF z>s7!x9ndxS1WGsD2{jxlUrLKfO4B^*C5mrQ`du$bN{t4)a1eZ)CfP4)_@H@9W%3D< zqB$ChkR=JFF5#C{K$YJe4GeeGRYew+Vg<?D12{KK>&jUJ?5Q(@SaZ+Ae*m{(trDEs zBd+!Qs#3MI>J8p)=@PU<Rlr3(A!E~94)jbp;6nXh((?bJ$G@0P+oN`r)5H}tg^f~y zk3l_-GGPt1>W(hro%2Nr&I<n&WvV){faI)32syt6<kl(NIE9<1u=vJqlGg7tpPd8l HI@f;z22E8| diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-312.pyc deleted file mode 100644 index 4f43ba8c9e6d5018b94d3036968ecb6d75890906..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39570 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-312.pyc deleted file mode 100644 index 199136c16335264fb903a95cfc902bc47a3450d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83143 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%0A~Sgs+&>BacuF~9LK6JN4Cj3CKQRSA@geR% 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 Ce9d|Q diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-312.pyc deleted file mode 100644 index 6e4cf8d6a2a2ae047bb018dacfc4d1860748f94b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77009 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 A>i_@% diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-312.pyc deleted file mode 100644 index 44c2c15bdd462e2d0a1b845d3849b8f2f4b77547..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77520 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-312.pyc deleted file mode 100644 index 81109d4db8262ecebdf12fe7bd91fb0ea4181d84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83097 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-312.pyc deleted file mode 100644 index 7ed3f2e862bd8edf4dad17a437d3b2c51c841ba3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105272 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-312.pyc deleted file mode 100644 index 9cd8efad681fde43b403f9f9c5db392a0b6dab9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77698 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-312.pyc deleted file mode 100644 index 1c0c4fc20c88f55a20efd47ec727fd632dd0de29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77537 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-312.pyc deleted file mode 100644 index 1ccc7fa295306f8ad3500cfa27e3a9a54c983262..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7023 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 A<p2Nx diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/macromanprober.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/macromanprober.cpython-312.pyc deleted file mode 100644 index 8c79ae357ebf6e800de48e894438d3fe0a199716..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7203 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 NedFyX0-5~P`Cqaph_e6y diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-312.pyc deleted file mode 100644 index f947e1115d776f7579b14b4d7ab29788e4cff472..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3924 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 DGbc?# diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-312.pyc deleted file mode 100644 index 7dfcab8d8b7895d10bcfda5ba46386b5c0d97906..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1609 zcmZWp&u`pB6rNeH_lJLEo1~jAoJy%GR*+apS*evORI;=Qq1{GoDkO8Ty!Py_H{<m( zwo_7a=phn`Ld6O7R`rU)AA-cCm5@NA<OCOPL7}DUiJ7r?6S5=g&G)`}Gk){EXaAz> z3Sh%|`c1c40N@Yq42PV8<EIQf0WNSM20k<)<T!&fzGO-QOE~MxrYvw4=lr~x7g)vx zzi1W(&SAw@O;zAL)_mR61uozTzhssKF5+|kq&X?Df~Wjxb6Q{(pZCjV8G;O00<N|V zTpdaKQj(uJvpG>M{RNp<g;ZJeI<-|2v=Cw5RK07HCW@9w5D!MIT3@~X;q{R_amVg= zV!MNGdpHu?)LZxKE32ab?tb?9|J=1NMy|HBxNvoTVdSeT_m)3i9Jxw!<<sVgcYp2n zwZwB$dBrr+`X+O~Wojc}LKm1BB=uNb&W<*8A(GsTE48ybfO*+%-IRC0*U-#0K~<)u zyNmVasasPOvrAfSaYLFTD2hqH;bcx7%o~AAdi;u+AK()ZjTUz^Ti`KEaSQ$g_qot) zKoAX+2KxyGqI?QYnBo|tjxqWeQyOC?$C&9crhJy^6t{pidfyi4y)}$DnTNSUunDS} zMir8CY_Y0SIgAI0(1K-oeJ`>s!qX%gH~gA}>qU5N2-ksd=?K3q;V-25f#|`I$^?Zd zs!B8)BHR{-)1qZL*bYO>3i-B+7azTOXmkS~8NMBb8^$Mr6Z@zig+_!h>JZzX4I|H4 zM`YFw9`tcwyNDPYsJ~%guVoB2qi)c@Iyb*ygkFSZ2ez}$+Bq}^-oUU}m>UqoVPAra zBExSvVTXSXNrH2OO>&;)@UU{GW9EkU{(!B9Ys|cU1P%)NZvI7~^6bm!h03pm`9HOp zy*meqxv+QlK&$LE4m5#;5vxP@Xj-W#JK68FqZv@tzgKpZ$J#MF7gY0H<-YAB%c6>9 z`GFf_jy22rDz<U5LUJsWW*he!w?xKNPgQgf#+JnjS78AmZ_k^A7n<-c66SrraG9Cc z+u-+F{kPiki`w$vK$pwU8b^HkdF@|535vWu+}5aGph}DVPZFs_iRly<l2!DSh9t{& zP}Lc*ze*a)TY}1{ANygFw~At?mufEhhjM0}r189u1QR_-8Qw}%>$Ld4C8c=BQMDIz z?N-W&R#U>B7p4SnPpZUG`&vqfrsYEX2$G9&W!@BSBpQE2cy+mCVU3w12}1bt27vD# jf`vnH`4GG#ECcMhBJ8C@aOt1i1S~(FdG94)vpDuY-`Im; diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-312.pyc deleted file mode 100644 index 0059b123b080e2f1848f2ca81ba94a91eb1c746d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38666 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 a<lprXU%G_v`q1^@|G<|n=Lh*0S^pm{b9O!e diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/resultdict.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/resultdict.cpython-312.pyc deleted file mode 100644 index 608572d0ae59de5a70be909ec8e286a51f083072..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 653 zcmYLH&ubJh6n>c>+i~flu2NVLs(2b<8?+Y>MTEB0AFztlL+29WB;6f4lZ=_n%HT=R zyLzc7@8X~0u^vh;BA&bz)?RutncZRzU%v0<y)X0L<a@8z1-sHOZzi7*z;7qcSGXXv z2bLTH1BP-aP=X3C@epvN`Zng-n4kCvJlFx|zXKL<|C>LrO@b!mp~JZI$Ax0g^mg~2 zZIjK1+nY}wjdo1*wA7gtG>?(Fu-lZJZDpxW=k;@3n8ECx)rY_#K@1Y_1#q7S0~_NZ zLmO`ISmw3t|B3H(6U3qEKIc`PYv*qwE>g)dF*e;)iv5gP%}tb3F|O&DkK!d05h7^8 z2{Bzl3d!o+@nu3@)ij@<sK9y~ztYNFB!mhfHFe!oHZk1KCDmVHW>es-#uHg^Tu@z2 z@s>>Mf(u<?&2v6hv=~-8OAojjGWlBAI>r^Aaxuku_7azko=CC2cIPgxGR=o2O%Loh zR=CVcOl%sH3a1mQ7}r>}Ju=(lTG^;2dv^=&H&@p!yocldwa@Dxhey%s@zudmG+5{# z(W>g7r;p-}>FB1k15$4MZKKM)h}O*n?gDk$>9*#IWoOaGd`kD#ik0>`L3PW*iH{Ka g3AcawmrlD7-uxT*;f)V_r(m~}W$3TGecYP-1BfB3uK)l5 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-312.pyc deleted file mode 100644 index fe661339659a275eef09a8961b06eeb71424e7bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6408 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-312.pyc deleted file mode 100644 index f00986b7f3c34e829513e06403f0c3a7121eb8ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2378 zcmaJ>%}*Og6rWjtur|9Gs38WW6=_I_D+L#b2}$z>gn|_Ul}(g(rE0WzC-#P2+nrsL zk~&fjkxHaSJykhW>LIr(J@ik=y%!=QH5w7+&{J<z5GBf~Gqe7JM4rRUoA-P3=FNM* zH-D*W7_gE3?T3848-RcKral5SVebhO9s>gy&;mBpAmp-SNw!b(3E5})?SK}rgIZAR z{Z@x9YqA~ELSi4V!gi<DDdeD~*s7-5U0RnN(IR%Y)@}D_J$A3wEAS5MBRi@^g)Ccr zcE8py<dAj5j%hInBrp$*@B?6UV))eO#i$KzC~@^)$aZl^duQ`H$zXS$6w9TrNO2Vt zrd1a3D#3SZdx;LFGRtUcDtQhi(aep-`RR0OdI?=$zB;!^kKRlzU0uGJL1W{|vBPLw zqWz7tXVH9mZthy`T&(5XL@UDXA85gnXkl(9J$KVP77x;BYUcV>GKtbRGMQ!=LOVHm zNE>Th{+|7{<<t~PAF>~~K0Q18O**x>n3_EV4YtHIb`axvTuEin<oM@kWnns13l-Al z_2<yajr6rtW}$%{$(V(lg=aQgT&sbX?re=pVyV>(><zK)kBnIuXwU$fWJsIf7Bt`k zMe}Wf@1f?;fVhuFGBdN8mRe?cnd>9M1nzL}qy)e(@G)@f2zcnPfJcnPPiq<o+&ZNj zx_i*=s2_0Ux@5o#{6ngf>z?#M8{YvNw!7U~Ki^y{QpNX_MaBoazj>G9=~#5N*R)_= zZ7|lP-uS?|-ZogY4c6ZVi?zW9+h9lAV4t+XhT34C9>yw==QkIr0MvMU1>7E~+cnoF z2R1<5zw{;R;ZD;*1g~S_V1srRbQ`0R_$yZ8Q5tZ{B}}M{kXbNYgovN{BK#5(ViWCg zu#4=Xfvwshhj1nml~263gcp%;MiBnP5?*=22}U>vNsv#xmZXPGw8OjEp#g%K=Xikn z9c<mAYF_+VwL55^Rm_=L-9iV|(RI@)zo!i$l(lrnLCE1(4zY3n-Q7gKXyb&fyUu#z zYB5{3alv&GF1B!v==N#HHM47&oHmMg3RY1!FiEWA!g|6oR}-ZTH(xAFjE;>b9Mi?8 zOL}%q&tWG~GD``>%#0#QWZBniU^n5cW}O`Wf4!HDmNv)$i{ftVP&1F#Gd#giXNOI1 z?}Hs#ec16_j%~|>JF($kyEfIGp|d;6i9eIi?0uhfEW9OuydMUh?##1qnQn;bj_w9Q zsQ+(y<heYub?V~Q<;=FcvabMjczgI#Rk^&Q9N!+Esw(G%aG|PP6vD--a_Jz{usL5< zzBp*y@N=cAOtToc@5!pdqGP_f%NNSP3+31gWoUOK8Vhgwe^Pco10nV2@Wb#UWskiN zFzy8jcFUx&#0t$QCb)-a7;#3GEsPLV5c-al)I&t(s9LLM7F!lVaY&BwjPc*&3gMkW zc#Df^oCBPRZy$g+(uqLde}GNocpYDg57J&<C`PrG8WH}FQpMwzS2jU=+H2{B+-lj% z>BQ6vg7r-n(=LwY2*zt3(qKA`aKv-xL85iKxt5e2r{PO9h-ekjIiiO|`|y^cDz|s@ zy6O4gO+$qbmccdC$$M(iMiIt3?^(6*MZ@yE{0_Y5^F+OqFR(K#&zA@%9nYXM#im^! zgz)uw04H98ldr(nufXC<F!@IAfYKYlrq|s7jxx<laArSv683HNpLz}0Dm?!W%55{y diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-312.pyc deleted file mode 100644 index de5ee4301bc7ffd9d8e14d329f81b004da395eeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4516 zcmbUlZA=^4@vZGOYcQ+<6Z4UP2_cD-1J``yuDK*62Q(iI(15vC)>SLxUBJX%)3@t1 zP$!B`kqT0-Ayq39>2yc`v_$ET+^?oTDy9EU>K`_wwYwr}q+WmU50ykc-Jf=5*XtN3 z^x7MlxAWf2n>TOXyqS6Ysj{-10K`7|$@Fh{LjH~&3)noeO#xXZA`zJcNiq?JA)-yR zCu~W3#BSh@gd@pDSOaGh&SY7nEXhSUqwh?(lI4+d120QdB;66Wfpdw<WL2b!AvSWB zh_0JNESKC5?B<#gey$?m-o#FT(b;i1o{~2ivsXWM;r!S@Tv2I!BCP`9j2unODRBij zYx+}ST%H<JqpCC%jZMd8DPYsxdDIxz-QT0B35yBl)S|rpl&nfu)gn=QhSCW&{@$D_ z^-o9Xn55z~iNb_RoFI%12}2_TgBN3_#%Altcebws@>4LHL?VnxA~w;rKqeW{cGDfP z=W#pW4v7^R$vJ5g9XA~h@{=QFg;BO>loOqjODdNtCT$JC3G>{O4zcW}BT@-?70BQK z=NHITCgK?*fpWbZ6*bk?om5iORF0t$EkI-A-}bMe`6aVVREt6unGE>|9Kh0vA*$sL zM0Hwh5AxD7M6h;F)QSQ%j{vnWLj@-@!IBJA&Kk>*nOX~f^|d$|GDq$+!>}<{NzY1D z=L8`x$5la~D4*iOx+`XQfS@EPDy-LuMV=x=(N*RpN?l0v#LQDK4C^eF6iK~r(;bSG znABZ@5KBZAMGzDlOz_|MDjl3oC8c08sw!841F2X#Daoo5RHcM8MWe|MMUBTUOSD5w z{a8+<qM}5DS0wpLFcF^!&d#aRDY?5d)D=|Xs?;$Xja`mTNlI`wJ{uH(O-#{X44h4r z)SxmGS7r^5>ztjVHL&`;;i%?uc3L|>1O(;V(0qA=Y;cu}Wg1uilxy5*IQrY6^@igM zj$2h5?I+jU`xYEex&0gd?sb1JqWf~3`*!(a`A6<;m`vX67ViV)>)Zm4tZ?)w$%L8w zJ+}JzEj~u-fq{UXR>Ozx!KMxyA2fMO(?*Ll?|J3MoyPfeB3m;w)}|LLZ}G69EVobN z_GP&?jcfZe*G`*&Wyj9YT@8mv3Cjd@hi@s&;8B;r7%?@r8G7n&JSA`xL5?P+`wXoI zb_Ip|O|?<Cd0&y*#r$2!?1knAdCu2n`2!k%Aj^j|KD5S#Ue_5IO`Xxq%VdrT*oJlP zLUcANgRkBvv<1eC7T38%RGvzMW9@JlYw#Fy<ITX;8;s?2ZUUm500A{ty!A3*GK}>h zth}4CZrCo64<S~($!I3+RouuhR=gM>OUw^{M#u-S-Zk4b`z{B88k9iBZppaj$T-wO z<d`wi*iPolhry*TfNb~9aqP_$;?OIai2FdtECCqB`&R-P+XFli0EmrvoCeIGGnW8F zxPk@@>|Czhp*cEw2^gCDilpu>VSw&Vsq*FyndpEefHD>4)*p7Ub!!Pbbgc_}jm_9Z zo1s%IgJ-q>bzaea0tSJ0;C0#z2B{L*MT#TC&cjKHq>*IU2YGK~P;Rkj=4Jiwa*Jgx zF}M2u4?P*!yL}#3G&O@B`>OYiwKS!|PA%y>C4r8293;btPR#VX*vgi-IGk%K6nV~( zQW_z~NnYH=1|6^STYf;hU`}v%I#9p$I`#4ZM)x9(zQ&h9${ThB^-S6Dd~3Vnho6}j z{nK&P52-vw{ZZAAAq;2~{e<Gh+(c{>1K8%j0RjyaOACrORd-1;ByI{tqFydT*$1%? zaEkFpX9q_|M@DsLA~iJyH3ln66X_|67mBuF!y%J%cqA+g4eCyFrtUl+9>YHOosse3 z0pWaDXUD>4M#FmT6l955no=ke1k3^nN!H5+C@RdZnNJ*(k|aV^gIegWfx+-#fB5|H zS)HFsse&Y@(o@rd7*(Tsl_4%APsT+_j!AmW*twC>aQ}E%2%j4rgwDl*fYV4v6fdIA z#B~Q+1~OK@EHakhP!j=EQLu3G8(?OxUg*#BMVSjVI}U@&7UZ`ZB*)j@zP@;UjSsAG z0cfG0<pUaY`QA0I7uqj;{+0T5-;r(7==wghcy{5;f|_e;`SjGiQ`x2-t*Pf>c)jWP z!o?il^l>KJ64F{iPxw&I<6W+}Q<3$wYM$1d_wAgwKI?7QyzPK258WBcdFx)d*y@@W zZqjlz+Z@uGLracdROp_%yqqqrrRxdbwb6Ve+uW@+cO&($1uCwx4y#ytoYb05t~d29 zak*OWUFPS<a)FMef#s1qBP(Y#??GenfaVQky`7r3GgrU&Q~n;m%B-Hd?_RB1tAG1Z z{R_LTZqJsJ)HRqqS#P)I?S44$yOGaE9{=Dk-r?uCfnpi{mFksCzp7iU*IGjl&pcv2 z8+>$5>ls+9AAEdu7is4nU3y&o`|-z@KCk}c_*&0*KL^3@Z}p;Gx85Pm2UjNUeX!uT z%`ftI8I5avUcui!zIgoOz1fDK))0JB5j0N6tS@>rzUL`_4D6isv}vBUbx-@MBYU_{ zJKXog)AvQO*`O-9J-;}=#+l{8jtUBImQfUZ0?0Qh3T6t=2oR75E5KaC1Z)i!egEqm zn_4InG7wg+q+wNT4&%m~<t5h1x;+`a3Y908Y<Me-XP*GyN!^`)Di}QlcL^86ycRff zzM<$^?7W8}kd^b$7#F1ELOl01WqogHzPGZzcQxO;>%Nl<?i`MVG+!v|JFWRnulwFx zaBuK6OD9(LuJfI1T&Gc(1#GkmgboL)@u`EgrXWD@5Rxe|oj}|z2tP_k6DGxYBpAiC z&OwBP2a-Cc+o7r}3SPJ=oyCZt=q~(3DUHq<F^%HY*V##UwW!pvRAv746O$4NK?pDu zlaWzro;Iyg34MyqK_n!h`SK=tX=B;CmsK|Q;1)-mRa-WO?YbNLCxOql-5P+KW0D&0 zwjrspKx*7_9%dWwj<58t2G-iTwS7HX1O^`M-Nw&Wm|@xA3i~etAHzn*`ojT_?o{Vy z;Z;wKEqXA(6~Fw<$6$>a1&uhHH2*zdJRNlw6M|wSfP8?TnT^TnRr8(5Cnxd+yqS3@ zByPw7Fsi^avjRGX7IZ&i_~<aq^A&f(Jg8H2494(zpd5u}%g!*&%XbLV@DFnA8R_~P c>3BvCJtN)ENb3t{Kf?sqst>&+h#12D0}FMp>;M1& diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-312.pyc deleted file mode 100644 index 9a0bd415a80332271d8c29c7dee4a3e28067ed96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12290 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-312.pyc deleted file mode 100644 index 033c0454da5994f37ad7493dd1501b0ceb37cd12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10000 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 Q=a`*#uV4L&!YAqf-!?B8p8x;= diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-312.pyc deleted file mode 100644 index 25010d7a7da7893131fcd7549a13d99b7a941974..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3196 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 Y(b#ur_**peFZT!+x!3;^!NjioUofYm^Z)<= diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-312.pyc deleted file mode 100644 index b81be8e112e25ecce8cab53ce078a3e429735551..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 509 zcmYLGJ#Q015WS6UIoc>tL6c_aaN%77qKOcSAQWkW1c<`TX?;8PE!mIL?%st9P4X*9 zMIWW+S5P4ekX!yhP^et7c5E@l%skCo?Rzudwzp}PqWJQu{G00U1z1OC)!eYue9mMx z$|M;PBp-Tf%Ks`iuE;GKb=uCLd-|2WD^&pFWUUeKqY5#Av$}=oAShF5HEF?P^a>kg zrw~ho27OS@g00OMJ-7)JrSK9Xop@*9M8#5B2pH=sI;R5&D`7cW@gUUWN)*Rpih)tO zC+b)_zXu1x!V4|zk_Hc@uxz}B`%@#7W`#2YdfI!+cG;sjVMl}Rte@x76?s0}%JY@9 z1bQK9kF);!S8v`PzCOClZWhMpo|n!bHzJ0HAGo46Xk*|JHBP-S!w^+*jD9HHiPcU> z^t?gaaIMC?YLiU+gzY}&K}8&{E$~WJJbi7Y^L%A7y;?4bRqcH9+3kLx`^6a-2M7;R my6zA{{%rI}_xetD_x{<|FM97M-T6*;E?)kiaNhTuiS-Yv_MF%N diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/big5freq.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/big5freq.py deleted file mode 100644 index 87d9f97..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/big5freq.py +++ /dev/null @@ -1,386 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# Big5 frequency table -# by Taiwan's Mandarin Promotion Council -# <http://www.edu.tw:81/mandr/> -# -# 128 --> 0.42261 -# 256 --> 0.57851 -# 512 --> 0.74851 -# 1024 --> 0.89384 -# 2048 --> 0.97583 -# -# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 -# Random Distribution Ration = 512/(5401-512)=0.105 -# -# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR - -BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75 - -# Char to FreqOrder table -BIG5_TABLE_SIZE = 5376 -# fmt: off -BIG5_CHAR_TO_FREQ_ORDER = ( - 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16 -3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32 -1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48 - 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64 -3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80 -4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96 -5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112 - 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128 - 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144 - 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160 -2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176 -1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192 -3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208 - 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224 -1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240 -3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256 -2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272 - 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288 -3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304 -1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320 -5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336 - 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352 -5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368 -1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384 - 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400 - 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416 -3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432 -3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448 - 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464 -2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480 -2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496 - 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512 - 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528 -3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544 -1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560 -1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576 -1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592 -2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608 - 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624 -4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640 -1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656 -5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672 -2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688 - 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704 - 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720 - 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736 - 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752 -5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768 - 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784 -1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800 - 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816 - 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832 -5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848 -1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864 - 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880 -3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896 -4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912 -3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928 - 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944 - 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960 -1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976 -4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992 -3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008 -3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024 -2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040 -5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056 -3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072 -5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088 -1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104 -2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120 -1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136 - 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152 -1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168 -4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184 -3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200 - 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216 - 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232 - 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248 -2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264 -5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280 -1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296 -2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312 -1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328 -1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344 -5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360 -5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376 -5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392 -3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408 -4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424 -4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440 -2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456 -5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472 -3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488 - 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504 -5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520 -5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536 -1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552 -2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568 -3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584 -4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600 -5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616 -3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632 -4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648 -1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664 -1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680 -4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696 -1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712 - 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728 -1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744 -1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760 -3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776 - 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792 -5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808 -2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824 -1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840 -1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856 -5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872 - 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888 -4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904 - 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920 -2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936 - 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952 -1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968 -1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984 - 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000 -4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016 -4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032 -1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048 -3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064 -5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080 -5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096 -1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112 -2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128 -1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144 -3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160 -2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176 -3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192 -2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208 -4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224 -4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240 -3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256 - 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272 -3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288 - 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304 -3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320 -4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336 -3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352 -1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368 -5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384 - 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400 -5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416 -1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432 - 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448 -4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464 -4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480 - 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496 -2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512 -2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528 -3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544 -1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560 -4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576 -2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592 -1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608 -1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624 -2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640 -3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656 -1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672 -5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688 -1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704 -4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720 -1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736 - 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752 -1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768 -4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784 -4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800 -2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816 -1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832 -4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848 - 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864 -5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880 -2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896 -3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912 -4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928 - 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944 -5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960 -5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976 -1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992 -4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008 -4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024 -2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040 -3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056 -3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072 -2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088 -1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104 -4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120 -3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136 -3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152 -2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168 -4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184 -5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200 -3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216 -2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232 -3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248 -1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264 -2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280 -3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296 -4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312 -2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328 -2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344 -5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360 -1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376 -2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392 -1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408 -3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424 -4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440 -2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456 -3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472 -3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488 -2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504 -4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520 -2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536 -3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552 -4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568 -5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584 -3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600 - 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616 -1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632 -4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648 -1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664 -4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680 -5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696 - 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712 -5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728 -5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744 -2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760 -3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776 -2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792 -2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808 - 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824 -1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840 -4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856 -3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872 -3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888 - 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904 -2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920 - 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936 -2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952 -4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968 -1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984 -4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000 -1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016 -3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032 - 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048 -3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064 -5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080 -5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096 -3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112 -3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128 -1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144 -2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160 -5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176 -1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192 -1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208 -3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224 - 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240 -1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256 -4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272 -5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288 -2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304 -3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320 - 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336 -1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352 -2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368 -2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384 -5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400 -5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416 -5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432 -2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448 -2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464 -1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480 -4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496 -3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512 -3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528 -4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544 -4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560 -2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576 -2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592 -5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608 -4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624 -5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640 -4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656 - 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672 - 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688 -1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704 -3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720 -4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736 -1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752 -5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768 -2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784 -2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800 -3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816 -5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832 -1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848 -3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864 -5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880 -1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896 -5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912 -2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928 -3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944 -2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960 -3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976 -3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992 -3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008 -4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024 - 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040 -2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056 -4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072 -3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088 -5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104 -1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120 -5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136 - 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152 -1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168 - 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184 -4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200 -1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216 -4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232 -1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248 - 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264 -3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280 -4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296 -5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312 - 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328 -3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344 - 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360 -2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 -) -# fmt: on diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/big5prober.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/big5prober.py deleted file mode 100644 index ef09c60..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/big5prober.py +++ /dev/null @@ -1,47 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .chardistribution import Big5DistributionAnalysis -from .codingstatemachine import CodingStateMachine -from .mbcharsetprober import MultiByteCharSetProber -from .mbcssm import BIG5_SM_MODEL - - -class Big5Prober(MultiByteCharSetProber): - def __init__(self) -> None: - super().__init__() - self.coding_sm = CodingStateMachine(BIG5_SM_MODEL) - self.distribution_analyzer = Big5DistributionAnalysis() - self.reset() - - @property - def charset_name(self) -> str: - return "Big5" - - @property - def language(self) -> str: - return "Chinese" diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/chardistribution.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/chardistribution.py deleted file mode 100644 index 176cb99..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/chardistribution.py +++ /dev/null @@ -1,261 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from typing import Tuple, Union - -from .big5freq import ( - BIG5_CHAR_TO_FREQ_ORDER, - BIG5_TABLE_SIZE, - BIG5_TYPICAL_DISTRIBUTION_RATIO, -) -from .euckrfreq import ( - EUCKR_CHAR_TO_FREQ_ORDER, - EUCKR_TABLE_SIZE, - EUCKR_TYPICAL_DISTRIBUTION_RATIO, -) -from .euctwfreq import ( - EUCTW_CHAR_TO_FREQ_ORDER, - EUCTW_TABLE_SIZE, - EUCTW_TYPICAL_DISTRIBUTION_RATIO, -) -from .gb2312freq import ( - GB2312_CHAR_TO_FREQ_ORDER, - GB2312_TABLE_SIZE, - GB2312_TYPICAL_DISTRIBUTION_RATIO, -) -from .jisfreq import ( - JIS_CHAR_TO_FREQ_ORDER, - JIS_TABLE_SIZE, - JIS_TYPICAL_DISTRIBUTION_RATIO, -) -from .johabfreq import JOHAB_TO_EUCKR_ORDER_TABLE - - -class CharDistributionAnalysis: - ENOUGH_DATA_THRESHOLD = 1024 - SURE_YES = 0.99 - SURE_NO = 0.01 - MINIMUM_DATA_THRESHOLD = 3 - - def __init__(self) -> None: - # Mapping table to get frequency order from char order (get from - # GetOrder()) - self._char_to_freq_order: Tuple[int, ...] = tuple() - self._table_size = 0 # Size of above table - # This is a constant value which varies from language to language, - # used in calculating confidence. See - # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html - # for further detail. - self.typical_distribution_ratio = 0.0 - self._done = False - self._total_chars = 0 - self._freq_chars = 0 - self.reset() - - def reset(self) -> None: - """reset analyser, clear any state""" - # If this flag is set to True, detection is done and conclusion has - # been made - self._done = False - self._total_chars = 0 # Total characters encountered - # The number of characters whose frequency order is less than 512 - self._freq_chars = 0 - - def feed(self, char: Union[bytes, bytearray], char_len: int) -> None: - """feed a character with known length""" - if char_len == 2: - # we only care about 2-bytes character in our distribution analysis - order = self.get_order(char) - else: - order = -1 - if order >= 0: - self._total_chars += 1 - # order is valid - if order < self._table_size: - if 512 > self._char_to_freq_order[order]: - self._freq_chars += 1 - - def get_confidence(self) -> float: - """return confidence based on existing data""" - # if we didn't receive any character in our consideration range, - # return negative answer - if self._total_chars <= 0 or self._freq_chars <= self.MINIMUM_DATA_THRESHOLD: - return self.SURE_NO - - if self._total_chars != self._freq_chars: - r = self._freq_chars / ( - (self._total_chars - self._freq_chars) * self.typical_distribution_ratio - ) - if r < self.SURE_YES: - return r - - # normalize confidence (we don't want to be 100% sure) - return self.SURE_YES - - def got_enough_data(self) -> bool: - # It is not necessary to receive all data to draw conclusion. - # For charset detection, certain amount of data is enough - return self._total_chars > self.ENOUGH_DATA_THRESHOLD - - def get_order(self, _: Union[bytes, bytearray]) -> int: - # We do not handle characters based on the original encoding string, - # but convert this encoding string to a number, here called order. - # This allows multiple encodings of a language to share one frequency - # table. - return -1 - - -class EUCTWDistributionAnalysis(CharDistributionAnalysis): - def __init__(self) -> None: - super().__init__() - self._char_to_freq_order = EUCTW_CHAR_TO_FREQ_ORDER - self._table_size = EUCTW_TABLE_SIZE - self.typical_distribution_ratio = EUCTW_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, byte_str: Union[bytes, bytearray]) -> int: - # for euc-TW encoding, we are interested - # first byte range: 0xc4 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char = byte_str[0] - if first_char >= 0xC4: - return 94 * (first_char - 0xC4) + byte_str[1] - 0xA1 - return -1 - - -class EUCKRDistributionAnalysis(CharDistributionAnalysis): - def __init__(self) -> None: - super().__init__() - self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER - self._table_size = EUCKR_TABLE_SIZE - self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, byte_str: Union[bytes, bytearray]) -> int: - # for euc-KR encoding, we are interested - # first byte range: 0xb0 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char = byte_str[0] - if first_char >= 0xB0: - return 94 * (first_char - 0xB0) + byte_str[1] - 0xA1 - return -1 - - -class JOHABDistributionAnalysis(CharDistributionAnalysis): - def __init__(self) -> None: - super().__init__() - self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER - self._table_size = EUCKR_TABLE_SIZE - self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, byte_str: Union[bytes, bytearray]) -> int: - first_char = byte_str[0] - if 0x88 <= first_char < 0xD4: - code = first_char * 256 + byte_str[1] - return JOHAB_TO_EUCKR_ORDER_TABLE.get(code, -1) - return -1 - - -class GB2312DistributionAnalysis(CharDistributionAnalysis): - def __init__(self) -> None: - super().__init__() - self._char_to_freq_order = GB2312_CHAR_TO_FREQ_ORDER - self._table_size = GB2312_TABLE_SIZE - self.typical_distribution_ratio = GB2312_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, byte_str: Union[bytes, bytearray]) -> int: - # for GB2312 encoding, we are interested - # first byte range: 0xb0 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char, second_char = byte_str[0], byte_str[1] - if (first_char >= 0xB0) and (second_char >= 0xA1): - return 94 * (first_char - 0xB0) + second_char - 0xA1 - return -1 - - -class Big5DistributionAnalysis(CharDistributionAnalysis): - def __init__(self) -> None: - super().__init__() - self._char_to_freq_order = BIG5_CHAR_TO_FREQ_ORDER - self._table_size = BIG5_TABLE_SIZE - self.typical_distribution_ratio = BIG5_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, byte_str: Union[bytes, bytearray]) -> int: - # for big5 encoding, we are interested - # first byte range: 0xa4 -- 0xfe - # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char, second_char = byte_str[0], byte_str[1] - if first_char >= 0xA4: - if second_char >= 0xA1: - return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 - return 157 * (first_char - 0xA4) + second_char - 0x40 - return -1 - - -class SJISDistributionAnalysis(CharDistributionAnalysis): - def __init__(self) -> None: - super().__init__() - self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER - self._table_size = JIS_TABLE_SIZE - self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, byte_str: Union[bytes, bytearray]) -> int: - # for sjis encoding, we are interested - # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe - # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe - # no validation needed here. State machine has done that - first_char, second_char = byte_str[0], byte_str[1] - if 0x81 <= first_char <= 0x9F: - order = 188 * (first_char - 0x81) - elif 0xE0 <= first_char <= 0xEF: - order = 188 * (first_char - 0xE0 + 31) - else: - return -1 - order = order + second_char - 0x40 - if second_char > 0x7F: - order = -1 - return order - - -class EUCJPDistributionAnalysis(CharDistributionAnalysis): - def __init__(self) -> None: - super().__init__() - self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER - self._table_size = JIS_TABLE_SIZE - self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, byte_str: Union[bytes, bytearray]) -> int: - # for euc-JP encoding, we are interested - # first byte range: 0xa0 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - char = byte_str[0] - if char >= 0xA0: - return 94 * (char - 0xA1) + byte_str[1] - 0xA1 - return -1 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetgroupprober.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetgroupprober.py deleted file mode 100644 index 6def56b..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetgroupprober.py +++ /dev/null @@ -1,106 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from typing import List, Optional, Union - -from .charsetprober import CharSetProber -from .enums import LanguageFilter, ProbingState - - -class CharSetGroupProber(CharSetProber): - def __init__(self, lang_filter: LanguageFilter = LanguageFilter.NONE) -> None: - super().__init__(lang_filter=lang_filter) - self._active_num = 0 - self.probers: List[CharSetProber] = [] - self._best_guess_prober: Optional[CharSetProber] = None - - def reset(self) -> None: - super().reset() - self._active_num = 0 - for prober in self.probers: - prober.reset() - prober.active = True - self._active_num += 1 - self._best_guess_prober = None - - @property - def charset_name(self) -> Optional[str]: - if not self._best_guess_prober: - self.get_confidence() - if not self._best_guess_prober: - return None - return self._best_guess_prober.charset_name - - @property - def language(self) -> Optional[str]: - if not self._best_guess_prober: - self.get_confidence() - if not self._best_guess_prober: - return None - return self._best_guess_prober.language - - def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: - for prober in self.probers: - if not prober.active: - continue - state = prober.feed(byte_str) - if not state: - continue - if state == ProbingState.FOUND_IT: - self._best_guess_prober = prober - self._state = ProbingState.FOUND_IT - return self.state - if state == ProbingState.NOT_ME: - prober.active = False - self._active_num -= 1 - if self._active_num <= 0: - self._state = ProbingState.NOT_ME - return self.state - return self.state - - def get_confidence(self) -> float: - state = self.state - if state == ProbingState.FOUND_IT: - return 0.99 - if state == ProbingState.NOT_ME: - return 0.01 - best_conf = 0.0 - self._best_guess_prober = None - for prober in self.probers: - if not prober.active: - self.logger.debug("%s not active", prober.charset_name) - continue - conf = prober.get_confidence() - self.logger.debug( - "%s %s confidence = %s", prober.charset_name, prober.language, conf - ) - if best_conf < conf: - best_conf = conf - self._best_guess_prober = prober - if not self._best_guess_prober: - return 0.0 - return best_conf diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetprober.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetprober.py deleted file mode 100644 index a103ca1..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetprober.py +++ /dev/null @@ -1,147 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import logging -import re -from typing import Optional, Union - -from .enums import LanguageFilter, ProbingState - -INTERNATIONAL_WORDS_PATTERN = re.compile( - b"[a-zA-Z]*[\x80-\xFF]+[a-zA-Z]*[^a-zA-Z\x80-\xFF]?" -) - - -class CharSetProber: - - SHORTCUT_THRESHOLD = 0.95 - - def __init__(self, lang_filter: LanguageFilter = LanguageFilter.NONE) -> None: - self._state = ProbingState.DETECTING - self.active = True - self.lang_filter = lang_filter - self.logger = logging.getLogger(__name__) - - def reset(self) -> None: - self._state = ProbingState.DETECTING - - @property - def charset_name(self) -> Optional[str]: - return None - - @property - def language(self) -> Optional[str]: - raise NotImplementedError - - def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: - raise NotImplementedError - - @property - def state(self) -> ProbingState: - return self._state - - def get_confidence(self) -> float: - return 0.0 - - @staticmethod - def filter_high_byte_only(buf: Union[bytes, bytearray]) -> bytes: - buf = re.sub(b"([\x00-\x7F])+", b" ", buf) - return buf - - @staticmethod - def filter_international_words(buf: Union[bytes, bytearray]) -> bytearray: - """ - We define three types of bytes: - alphabet: english alphabets [a-zA-Z] - international: international characters [\x80-\xFF] - marker: everything else [^a-zA-Z\x80-\xFF] - The input buffer can be thought to contain a series of words delimited - by markers. This function works to filter all words that contain at - least one international character. All contiguous sequences of markers - are replaced by a single space ascii character. - This filter applies to all scripts which do not use English characters. - """ - filtered = bytearray() - - # This regex expression filters out only words that have at-least one - # international character. The word may include one marker character at - # the end. - words = INTERNATIONAL_WORDS_PATTERN.findall(buf) - - for word in words: - filtered.extend(word[:-1]) - - # If the last character in the word is a marker, replace it with a - # space as markers shouldn't affect our analysis (they are used - # similarly across all languages and may thus have similar - # frequencies). - last_char = word[-1:] - if not last_char.isalpha() and last_char < b"\x80": - last_char = b" " - filtered.extend(last_char) - - return filtered - - @staticmethod - def remove_xml_tags(buf: Union[bytes, bytearray]) -> bytes: - """ - Returns a copy of ``buf`` that retains only the sequences of English - alphabet and high byte characters that are not between <> characters. - This filter can be applied to all scripts which contain both English - characters and extended ASCII characters, but is currently only used by - ``Latin1Prober``. - """ - filtered = bytearray() - in_tag = False - prev = 0 - buf = memoryview(buf).cast("c") - - for curr, buf_char in enumerate(buf): - # Check if we're coming out of or entering an XML tag - - # https://github.com/python/typeshed/issues/8182 - if buf_char == b">": # type: ignore[comparison-overlap] - prev = curr + 1 - in_tag = False - # https://github.com/python/typeshed/issues/8182 - elif buf_char == b"<": # type: ignore[comparison-overlap] - if curr > prev and not in_tag: - # Keep everything after last non-extended-ASCII, - # non-alphabetic character - filtered.extend(buf[prev:curr]) - # Output a space to delimit stretch we kept - filtered.extend(b" ") - in_tag = True - - # If we're not in a tag... - if not in_tag: - # Keep everything after last non-extended-ASCII, non-alphabetic - # character - filtered.extend(buf[prev:]) - - return filtered diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 1c95accc36d2aba193e47defa275fdb0fa96fb86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 216 zcmZ9GO$x#=5QQ77AVLq~q8-$&xN_|kLQIA>m_L%VrFal`?mdgg@C4FbSEgGZym{XY zZ!zzp*knokd2i<Y%;R6<GF=|okZsB3mH9>5#<?@~&{&P2SqvSVEpIiN7$Bm;+B02- zDESS2DQs_)Wdc2PXgW~x3T}vvHHT`qhae-Cj`16-F@Tc}XsQY8fj7(xjKGxyN~MvJ b(#j3f`lzjF6`uSm{Xvq$4Bwm(;`2m5`>{OQ diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-312.pyc deleted file mode 100644 index fc16a27cd785fb9a9eda568d98ac814b443c1eea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4033 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/chardetect.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/chardetect.py deleted file mode 100644 index 43f6e14..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/chardetect.py +++ /dev/null @@ -1,112 +0,0 @@ -""" -Script which takes one or more file paths and reports on their detected -encodings - -Example:: - - % chardetect somefile someotherfile - somefile: windows-1252 with confidence 0.5 - someotherfile: ascii with confidence 1.0 - -If no paths are provided, it takes its input from stdin. - -""" - - -import argparse -import sys -from typing import Iterable, List, Optional - -from .. import __version__ -from ..universaldetector import UniversalDetector - - -def description_of( - lines: Iterable[bytes], - name: str = "stdin", - minimal: bool = False, - should_rename_legacy: bool = False, -) -> Optional[str]: - """ - Return a string describing the probable encoding of a file or - list of strings. - - :param lines: The lines to get the encoding of. - :type lines: Iterable of bytes - :param name: Name of file or collection of lines - :type name: str - :param should_rename_legacy: Should we rename legacy encodings to - their more modern equivalents? - :type should_rename_legacy: ``bool`` - """ - u = UniversalDetector(should_rename_legacy=should_rename_legacy) - for line in lines: - line = bytearray(line) - u.feed(line) - # shortcut out of the loop to save reading further - particularly useful if we read a BOM. - if u.done: - break - u.close() - result = u.result - if minimal: - return result["encoding"] - if result["encoding"]: - return f'{name}: {result["encoding"]} with confidence {result["confidence"]}' - return f"{name}: no result" - - -def main(argv: Optional[List[str]] = None) -> None: - """ - Handles command line arguments and gets things started. - - :param argv: List of arguments, as if specified on the command-line. - If None, ``sys.argv[1:]`` is used instead. - :type argv: list of str - """ - # Get command line arguments - parser = argparse.ArgumentParser( - description=( - "Takes one or more file paths and reports their detected encodings" - ) - ) - parser.add_argument( - "input", - help="File whose encoding we would like to determine. (default: stdin)", - type=argparse.FileType("rb"), - nargs="*", - default=[sys.stdin.buffer], - ) - parser.add_argument( - "--minimal", - help="Print only the encoding to standard output", - action="store_true", - ) - parser.add_argument( - "-l", - "--legacy", - help="Rename legacy encodings to more modern ones.", - action="store_true", - ) - parser.add_argument( - "--version", action="version", version=f"%(prog)s {__version__}" - ) - args = parser.parse_args(argv) - - for f in args.input: - if f.isatty(): - print( - "You are running chardetect interactively. Press " - "CTRL-D twice at the start of a blank line to signal the " - "end of your input. If you want help, run chardetect " - "--help\n", - file=sys.stderr, - ) - print( - description_of( - f, f.name, minimal=args.minimal, should_rename_legacy=args.legacy - ) - ) - - -if __name__ == "__main__": - main() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachine.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachine.py deleted file mode 100644 index 8ed4a87..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachine.py +++ /dev/null @@ -1,90 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import logging - -from .codingstatemachinedict import CodingStateMachineDict -from .enums import MachineState - - -class CodingStateMachine: - """ - A state machine to verify a byte sequence for a particular encoding. For - each byte the detector receives, it will feed that byte to every active - state machine available, one byte at a time. The state machine changes its - state based on its previous state and the byte it receives. There are 3 - states in a state machine that are of interest to an auto-detector: - - START state: This is the state to start with, or a legal byte sequence - (i.e. a valid code point) for character has been identified. - - ME state: This indicates that the state machine identified a byte sequence - that is specific to the charset it is designed for and that - there is no other possible encoding which can contain this byte - sequence. This will to lead to an immediate positive answer for - the detector. - - ERROR state: This indicates the state machine identified an illegal byte - sequence for that encoding. This will lead to an immediate - negative answer for this encoding. Detector will exclude this - encoding from consideration from here on. - """ - - def __init__(self, sm: CodingStateMachineDict) -> None: - self._model = sm - self._curr_byte_pos = 0 - self._curr_char_len = 0 - self._curr_state = MachineState.START - self.active = True - self.logger = logging.getLogger(__name__) - self.reset() - - def reset(self) -> None: - self._curr_state = MachineState.START - - def next_state(self, c: int) -> int: - # for each byte we get its class - # if it is first byte, we also get byte length - byte_class = self._model["class_table"][c] - if self._curr_state == MachineState.START: - self._curr_byte_pos = 0 - self._curr_char_len = self._model["char_len_table"][byte_class] - # from byte's class and state_table, we get its next state - curr_state = self._curr_state * self._model["class_factor"] + byte_class - self._curr_state = self._model["state_table"][curr_state] - self._curr_byte_pos += 1 - return self._curr_state - - def get_current_charlen(self) -> int: - return self._curr_char_len - - def get_coding_state_machine(self) -> str: - return self._model["name"] - - @property - def language(self) -> str: - return self._model["language"] diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachinedict.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachinedict.py deleted file mode 100644 index 7a3c4c7..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachinedict.py +++ /dev/null @@ -1,19 +0,0 @@ -from typing import TYPE_CHECKING, Tuple - -if TYPE_CHECKING: - # TypedDict was introduced in Python 3.8. - # - # TODO: Remove the else block and TYPE_CHECKING check when dropping support - # for Python 3.7. - from typing import TypedDict - - class CodingStateMachineDict(TypedDict, total=False): - class_table: Tuple[int, ...] - class_factor: int - state_table: Tuple[int, ...] - char_len_table: Tuple[int, ...] - name: str - language: str # Optional key - -else: - CodingStateMachineDict = dict diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cp949prober.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cp949prober.py deleted file mode 100644 index fa7307e..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cp949prober.py +++ /dev/null @@ -1,49 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .chardistribution import EUCKRDistributionAnalysis -from .codingstatemachine import CodingStateMachine -from .mbcharsetprober import MultiByteCharSetProber -from .mbcssm import CP949_SM_MODEL - - -class CP949Prober(MultiByteCharSetProber): - def __init__(self) -> None: - super().__init__() - self.coding_sm = CodingStateMachine(CP949_SM_MODEL) - # NOTE: CP949 is a superset of EUC-KR, so the distribution should be - # not different. - self.distribution_analyzer = EUCKRDistributionAnalysis() - self.reset() - - @property - def charset_name(self) -> str: - return "CP949" - - @property - def language(self) -> str: - return "Korean" diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/enums.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/enums.py deleted file mode 100644 index 5e3e198..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/enums.py +++ /dev/null @@ -1,85 +0,0 @@ -""" -All of the Enums that are used throughout the chardet package. - -:author: Dan Blanchard (dan.blanchard@gmail.com) -""" - -from enum import Enum, Flag - - -class InputState: - """ - This enum represents the different states a universal detector can be in. - """ - - PURE_ASCII = 0 - ESC_ASCII = 1 - HIGH_BYTE = 2 - - -class LanguageFilter(Flag): - """ - This enum represents the different language filters we can apply to a - ``UniversalDetector``. - """ - - NONE = 0x00 - CHINESE_SIMPLIFIED = 0x01 - CHINESE_TRADITIONAL = 0x02 - JAPANESE = 0x04 - KOREAN = 0x08 - NON_CJK = 0x10 - ALL = 0x1F - CHINESE = CHINESE_SIMPLIFIED | CHINESE_TRADITIONAL - CJK = CHINESE | JAPANESE | KOREAN - - -class ProbingState(Enum): - """ - This enum represents the different states a prober can be in. - """ - - DETECTING = 0 - FOUND_IT = 1 - NOT_ME = 2 - - -class MachineState: - """ - This enum represents the different states a state machine can be in. - """ - - START = 0 - ERROR = 1 - ITS_ME = 2 - - -class SequenceLikelihood: - """ - This enum represents the likelihood of a character following the previous one. - """ - - NEGATIVE = 0 - UNLIKELY = 1 - LIKELY = 2 - POSITIVE = 3 - - @classmethod - def get_num_categories(cls) -> int: - """:returns: The number of likelihood categories in the enum.""" - return 4 - - -class CharacterCategory: - """ - This enum represents the different categories language models for - ``SingleByteCharsetProber`` put characters into. - - Anything less than CONTROL is considered a letter. - """ - - UNDEFINED = 255 - LINE_BREAK = 254 - SYMBOL = 253 - DIGIT = 252 - CONTROL = 251 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/escprober.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/escprober.py deleted file mode 100644 index fd71383..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/escprober.py +++ /dev/null @@ -1,102 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from typing import Optional, Union - -from .charsetprober import CharSetProber -from .codingstatemachine import CodingStateMachine -from .enums import LanguageFilter, MachineState, ProbingState -from .escsm import ( - HZ_SM_MODEL, - ISO2022CN_SM_MODEL, - ISO2022JP_SM_MODEL, - ISO2022KR_SM_MODEL, -) - - -class EscCharSetProber(CharSetProber): - """ - This CharSetProber uses a "code scheme" approach for detecting encodings, - whereby easily recognizable escape or shift sequences are relied on to - identify these encodings. - """ - - def __init__(self, lang_filter: LanguageFilter = LanguageFilter.NONE) -> None: - super().__init__(lang_filter=lang_filter) - self.coding_sm = [] - if self.lang_filter & LanguageFilter.CHINESE_SIMPLIFIED: - self.coding_sm.append(CodingStateMachine(HZ_SM_MODEL)) - self.coding_sm.append(CodingStateMachine(ISO2022CN_SM_MODEL)) - if self.lang_filter & LanguageFilter.JAPANESE: - self.coding_sm.append(CodingStateMachine(ISO2022JP_SM_MODEL)) - if self.lang_filter & LanguageFilter.KOREAN: - self.coding_sm.append(CodingStateMachine(ISO2022KR_SM_MODEL)) - self.active_sm_count = 0 - self._detected_charset: Optional[str] = None - self._detected_language: Optional[str] = None - self._state = ProbingState.DETECTING - self.reset() - - def reset(self) -> None: - super().reset() - for coding_sm in self.coding_sm: - coding_sm.active = True - coding_sm.reset() - self.active_sm_count = len(self.coding_sm) - self._detected_charset = None - self._detected_language = None - - @property - def charset_name(self) -> Optional[str]: - return self._detected_charset - - @property - def language(self) -> Optional[str]: - return self._detected_language - - def get_confidence(self) -> float: - return 0.99 if self._detected_charset else 0.00 - - def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: - for c in byte_str: - for coding_sm in self.coding_sm: - if not coding_sm.active: - continue - coding_state = coding_sm.next_state(c) - if coding_state == MachineState.ERROR: - coding_sm.active = False - self.active_sm_count -= 1 - if self.active_sm_count <= 0: - self._state = ProbingState.NOT_ME - return self.state - elif coding_state == MachineState.ITS_ME: - self._state = ProbingState.FOUND_IT - self._detected_charset = coding_sm.get_coding_state_machine() - self._detected_language = coding_sm.language - return self.state - - return self.state diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/escsm.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/escsm.py deleted file mode 100644 index 11d4adf..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/escsm.py +++ /dev/null @@ -1,261 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .codingstatemachinedict import CodingStateMachineDict -from .enums import MachineState - -# fmt: off -HZ_CLS = ( - 1, 0, 0, 0, 0, 0, 0, 0, # 00 - 07 - 0, 0, 0, 0, 0, 0, 0, 0, # 08 - 0f - 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17 - 0, 0, 0, 1, 0, 0, 0, 0, # 18 - 1f - 0, 0, 0, 0, 0, 0, 0, 0, # 20 - 27 - 0, 0, 0, 0, 0, 0, 0, 0, # 28 - 2f - 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37 - 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f - 0, 0, 0, 0, 0, 0, 0, 0, # 40 - 47 - 0, 0, 0, 0, 0, 0, 0, 0, # 48 - 4f - 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57 - 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f - 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67 - 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f - 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77 - 0, 0, 0, 4, 0, 5, 2, 0, # 78 - 7f - 1, 1, 1, 1, 1, 1, 1, 1, # 80 - 87 - 1, 1, 1, 1, 1, 1, 1, 1, # 88 - 8f - 1, 1, 1, 1, 1, 1, 1, 1, # 90 - 97 - 1, 1, 1, 1, 1, 1, 1, 1, # 98 - 9f - 1, 1, 1, 1, 1, 1, 1, 1, # a0 - a7 - 1, 1, 1, 1, 1, 1, 1, 1, # a8 - af - 1, 1, 1, 1, 1, 1, 1, 1, # b0 - b7 - 1, 1, 1, 1, 1, 1, 1, 1, # b8 - bf - 1, 1, 1, 1, 1, 1, 1, 1, # c0 - c7 - 1, 1, 1, 1, 1, 1, 1, 1, # c8 - cf - 1, 1, 1, 1, 1, 1, 1, 1, # d0 - d7 - 1, 1, 1, 1, 1, 1, 1, 1, # d8 - df - 1, 1, 1, 1, 1, 1, 1, 1, # e0 - e7 - 1, 1, 1, 1, 1, 1, 1, 1, # e8 - ef - 1, 1, 1, 1, 1, 1, 1, 1, # f0 - f7 - 1, 1, 1, 1, 1, 1, 1, 1, # f8 - ff -) - -HZ_ST = ( -MachineState.START, MachineState.ERROR, 3, MachineState.START, MachineState.START, MachineState.START, MachineState.ERROR, MachineState.ERROR, # 00-07 -MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, # 08-0f -MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.START, MachineState.START, 4, MachineState.ERROR, # 10-17 - 5, MachineState.ERROR, 6, MachineState.ERROR, 5, 5, 4, MachineState.ERROR, # 18-1f - 4, MachineState.ERROR, 4, 4, 4, MachineState.ERROR, 4, MachineState.ERROR, # 20-27 - 4, MachineState.ITS_ME, MachineState.START, MachineState.START, MachineState.START, MachineState.START, MachineState.START, MachineState.START, # 28-2f -) -# fmt: on - -HZ_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) - -HZ_SM_MODEL: CodingStateMachineDict = { - "class_table": HZ_CLS, - "class_factor": 6, - "state_table": HZ_ST, - "char_len_table": HZ_CHAR_LEN_TABLE, - "name": "HZ-GB-2312", - "language": "Chinese", -} - -# fmt: off -ISO2022CN_CLS = ( - 2, 0, 0, 0, 0, 0, 0, 0, # 00 - 07 - 0, 0, 0, 0, 0, 0, 0, 0, # 08 - 0f - 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17 - 0, 0, 0, 1, 0, 0, 0, 0, # 18 - 1f - 0, 0, 0, 0, 0, 0, 0, 0, # 20 - 27 - 0, 3, 0, 0, 0, 0, 0, 0, # 28 - 2f - 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37 - 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f - 0, 0, 0, 4, 0, 0, 0, 0, # 40 - 47 - 0, 0, 0, 0, 0, 0, 0, 0, # 48 - 4f - 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57 - 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f - 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67 - 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f - 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77 - 0, 0, 0, 0, 0, 0, 0, 0, # 78 - 7f - 2, 2, 2, 2, 2, 2, 2, 2, # 80 - 87 - 2, 2, 2, 2, 2, 2, 2, 2, # 88 - 8f - 2, 2, 2, 2, 2, 2, 2, 2, # 90 - 97 - 2, 2, 2, 2, 2, 2, 2, 2, # 98 - 9f - 2, 2, 2, 2, 2, 2, 2, 2, # a0 - a7 - 2, 2, 2, 2, 2, 2, 2, 2, # a8 - af - 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7 - 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf - 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7 - 2, 2, 2, 2, 2, 2, 2, 2, # c8 - cf - 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7 - 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df - 2, 2, 2, 2, 2, 2, 2, 2, # e0 - e7 - 2, 2, 2, 2, 2, 2, 2, 2, # e8 - ef - 2, 2, 2, 2, 2, 2, 2, 2, # f0 - f7 - 2, 2, 2, 2, 2, 2, 2, 2, # f8 - ff -) - -ISO2022CN_ST = ( - MachineState.START, 3, MachineState.ERROR, MachineState.START, MachineState.START, MachineState.START, MachineState.START, MachineState.START, # 00-07 - MachineState.START, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 08-0f - MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, # 10-17 - MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, 4, MachineState.ERROR, # 18-1f - MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 20-27 - 5, 6, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 28-2f - MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 30-37 - MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, MachineState.START, # 38-3f -) -# fmt: on - -ISO2022CN_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0) - -ISO2022CN_SM_MODEL: CodingStateMachineDict = { - "class_table": ISO2022CN_CLS, - "class_factor": 9, - "state_table": ISO2022CN_ST, - "char_len_table": ISO2022CN_CHAR_LEN_TABLE, - "name": "ISO-2022-CN", - "language": "Chinese", -} - -# fmt: off -ISO2022JP_CLS = ( - 2, 0, 0, 0, 0, 0, 0, 0, # 00 - 07 - 0, 0, 0, 0, 0, 0, 2, 2, # 08 - 0f - 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17 - 0, 0, 0, 1, 0, 0, 0, 0, # 18 - 1f - 0, 0, 0, 0, 7, 0, 0, 0, # 20 - 27 - 3, 0, 0, 0, 0, 0, 0, 0, # 28 - 2f - 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37 - 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f - 6, 0, 4, 0, 8, 0, 0, 0, # 40 - 47 - 0, 9, 5, 0, 0, 0, 0, 0, # 48 - 4f - 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57 - 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f - 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67 - 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f - 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77 - 0, 0, 0, 0, 0, 0, 0, 0, # 78 - 7f - 2, 2, 2, 2, 2, 2, 2, 2, # 80 - 87 - 2, 2, 2, 2, 2, 2, 2, 2, # 88 - 8f - 2, 2, 2, 2, 2, 2, 2, 2, # 90 - 97 - 2, 2, 2, 2, 2, 2, 2, 2, # 98 - 9f - 2, 2, 2, 2, 2, 2, 2, 2, # a0 - a7 - 2, 2, 2, 2, 2, 2, 2, 2, # a8 - af - 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7 - 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf - 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7 - 2, 2, 2, 2, 2, 2, 2, 2, # c8 - cf - 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7 - 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df - 2, 2, 2, 2, 2, 2, 2, 2, # e0 - e7 - 2, 2, 2, 2, 2, 2, 2, 2, # e8 - ef - 2, 2, 2, 2, 2, 2, 2, 2, # f0 - f7 - 2, 2, 2, 2, 2, 2, 2, 2, # f8 - ff -) - -ISO2022JP_ST = ( - MachineState.START, 3, MachineState.ERROR, MachineState.START, MachineState.START, MachineState.START, MachineState.START, MachineState.START, # 00-07 - MachineState.START, MachineState.START, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 08-0f - MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, # 10-17 - MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, # 18-1f - MachineState.ERROR, 5, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, 4, MachineState.ERROR, MachineState.ERROR, # 20-27 - MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, 6, MachineState.ITS_ME, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, # 28-2f - MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ITS_ME, # 30-37 - MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 38-3f - MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, MachineState.START, MachineState.START, # 40-47 -) -# fmt: on - -ISO2022JP_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) - -ISO2022JP_SM_MODEL: CodingStateMachineDict = { - "class_table": ISO2022JP_CLS, - "class_factor": 10, - "state_table": ISO2022JP_ST, - "char_len_table": ISO2022JP_CHAR_LEN_TABLE, - "name": "ISO-2022-JP", - "language": "Japanese", -} - -# fmt: off -ISO2022KR_CLS = ( - 2, 0, 0, 0, 0, 0, 0, 0, # 00 - 07 - 0, 0, 0, 0, 0, 0, 0, 0, # 08 - 0f - 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17 - 0, 0, 0, 1, 0, 0, 0, 0, # 18 - 1f - 0, 0, 0, 0, 3, 0, 0, 0, # 20 - 27 - 0, 4, 0, 0, 0, 0, 0, 0, # 28 - 2f - 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37 - 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f - 0, 0, 0, 5, 0, 0, 0, 0, # 40 - 47 - 0, 0, 0, 0, 0, 0, 0, 0, # 48 - 4f - 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57 - 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f - 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67 - 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f - 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77 - 0, 0, 0, 0, 0, 0, 0, 0, # 78 - 7f - 2, 2, 2, 2, 2, 2, 2, 2, # 80 - 87 - 2, 2, 2, 2, 2, 2, 2, 2, # 88 - 8f - 2, 2, 2, 2, 2, 2, 2, 2, # 90 - 97 - 2, 2, 2, 2, 2, 2, 2, 2, # 98 - 9f - 2, 2, 2, 2, 2, 2, 2, 2, # a0 - a7 - 2, 2, 2, 2, 2, 2, 2, 2, # a8 - af - 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7 - 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf - 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7 - 2, 2, 2, 2, 2, 2, 2, 2, # c8 - cf - 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7 - 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df - 2, 2, 2, 2, 2, 2, 2, 2, # e0 - e7 - 2, 2, 2, 2, 2, 2, 2, 2, # e8 - ef - 2, 2, 2, 2, 2, 2, 2, 2, # f0 - f7 - 2, 2, 2, 2, 2, 2, 2, 2, # f8 - ff -) - -ISO2022KR_ST = ( - MachineState.START, 3, MachineState.ERROR, MachineState.START, MachineState.START, MachineState.START, MachineState.ERROR, MachineState.ERROR, # 00-07 - MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, # 08-0f - MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, 4, MachineState.ERROR, MachineState.ERROR, # 10-17 - MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, 5, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 18-1f - MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.START, MachineState.START, MachineState.START, MachineState.START, # 20-27 -) -# fmt: on - -ISO2022KR_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) - -ISO2022KR_SM_MODEL: CodingStateMachineDict = { - "class_table": ISO2022KR_CLS, - "class_factor": 6, - "state_table": ISO2022KR_ST, - "char_len_table": ISO2022KR_CHAR_LEN_TABLE, - "name": "ISO-2022-KR", - "language": "Korean", -} diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/eucjpprober.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/eucjpprober.py deleted file mode 100644 index 39487f4..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/eucjpprober.py +++ /dev/null @@ -1,102 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from typing import Union - -from .chardistribution import EUCJPDistributionAnalysis -from .codingstatemachine import CodingStateMachine -from .enums import MachineState, ProbingState -from .jpcntx import EUCJPContextAnalysis -from .mbcharsetprober import MultiByteCharSetProber -from .mbcssm import EUCJP_SM_MODEL - - -class EUCJPProber(MultiByteCharSetProber): - def __init__(self) -> None: - super().__init__() - self.coding_sm = CodingStateMachine(EUCJP_SM_MODEL) - self.distribution_analyzer = EUCJPDistributionAnalysis() - self.context_analyzer = EUCJPContextAnalysis() - self.reset() - - def reset(self) -> None: - super().reset() - self.context_analyzer.reset() - - @property - def charset_name(self) -> str: - return "EUC-JP" - - @property - def language(self) -> str: - return "Japanese" - - def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: - assert self.coding_sm is not None - assert self.distribution_analyzer is not None - - for i, byte in enumerate(byte_str): - # PY3K: byte_str is a byte array, so byte is an int, not a byte - coding_state = self.coding_sm.next_state(byte) - if coding_state == MachineState.ERROR: - self.logger.debug( - "%s %s prober hit error at byte %s", - self.charset_name, - self.language, - i, - ) - self._state = ProbingState.NOT_ME - break - if coding_state == MachineState.ITS_ME: - self._state = ProbingState.FOUND_IT - break - if coding_state == MachineState.START: - char_len = self.coding_sm.get_current_charlen() - if i == 0: - self._last_char[1] = byte - self.context_analyzer.feed(self._last_char, char_len) - self.distribution_analyzer.feed(self._last_char, char_len) - else: - self.context_analyzer.feed(byte_str[i - 1 : i + 1], char_len) - self.distribution_analyzer.feed(byte_str[i - 1 : i + 1], char_len) - - self._last_char[0] = byte_str[-1] - - if self.state == ProbingState.DETECTING: - if self.context_analyzer.got_enough_data() and ( - self.get_confidence() > self.SHORTCUT_THRESHOLD - ): - self._state = ProbingState.FOUND_IT - - return self.state - - def get_confidence(self) -> float: - assert self.distribution_analyzer is not None - - context_conf = self.context_analyzer.get_confidence() - distrib_conf = self.distribution_analyzer.get_confidence() - return max(context_conf, distrib_conf) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrfreq.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrfreq.py deleted file mode 100644 index 7dc3b10..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrfreq.py +++ /dev/null @@ -1,196 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# Sampling from about 20M text materials include literature and computer technology - -# 128 --> 0.79 -# 256 --> 0.92 -# 512 --> 0.986 -# 1024 --> 0.99944 -# 2048 --> 0.99999 -# -# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 -# Random Distribution Ration = 512 / (2350-512) = 0.279. -# -# Typical Distribution Ratio - -EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 - -EUCKR_TABLE_SIZE = 2352 - -# Char to FreqOrder table , -# fmt: off -EUCKR_CHAR_TO_FREQ_ORDER = ( - 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, -1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, -1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, - 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, - 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, - 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, -1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, - 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, - 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, -1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, -1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, -1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, -1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, -1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, - 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, -1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, -1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, -1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, -1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, - 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, -1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, - 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, - 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, -1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, - 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, -1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, - 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, - 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, -1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, -1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, -1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, -1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, - 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, -1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, - 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, - 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, -1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, -1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, -1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, -1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, -1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, -1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, - 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, - 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, - 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, -1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, - 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, -1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, - 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, - 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, -2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, - 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, - 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, -2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, -2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, -2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, - 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, - 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, -2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, - 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, -1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, -2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, -1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, -2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, -2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, -1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, - 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, -2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, -2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, - 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, - 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, -2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, -1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, -2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, -2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, -2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, -2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, -2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, -2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, -1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, -2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, -2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, -2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, -2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, -2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, -1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, -1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, -2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, -1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, -2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, -1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, - 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, -2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, - 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, -2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, - 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, -2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, -2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, - 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, -2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, -1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, - 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, -1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, -2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, -1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, -2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, - 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, -2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, -1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, -2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, -1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, -2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, -1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, - 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, -2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, -2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, - 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, - 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, -1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, -1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, - 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, -2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, -2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, - 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, - 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, - 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, -2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, - 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, - 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, -2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, -2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, - 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, -2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, -1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, - 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, -2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, -2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, -2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, - 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, - 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, - 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, -2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, -2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, -2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, -1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, -2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, - 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256 -) -# fmt: on diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrprober.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrprober.py deleted file mode 100644 index 1fc5de0..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrprober.py +++ /dev/null @@ -1,47 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .chardistribution import EUCKRDistributionAnalysis -from .codingstatemachine import CodingStateMachine -from .mbcharsetprober import MultiByteCharSetProber -from .mbcssm import EUCKR_SM_MODEL - - -class EUCKRProber(MultiByteCharSetProber): - def __init__(self) -> None: - super().__init__() - self.coding_sm = CodingStateMachine(EUCKR_SM_MODEL) - self.distribution_analyzer = EUCKRDistributionAnalysis() - self.reset() - - @property - def charset_name(self) -> str: - return "EUC-KR" - - @property - def language(self) -> str: - return "Korean" diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwfreq.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwfreq.py deleted file mode 100644 index 4900ccc..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwfreq.py +++ /dev/null @@ -1,388 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# EUCTW frequency table -# Converted from big5 work -# by Taiwan's Mandarin Promotion Council -# <http:#www.edu.tw:81/mandr/> - -# 128 --> 0.42261 -# 256 --> 0.57851 -# 512 --> 0.74851 -# 1024 --> 0.89384 -# 2048 --> 0.97583 -# -# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 -# Random Distribution Ration = 512/(5401-512)=0.105 -# -# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR - -EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 - -# Char to FreqOrder table -EUCTW_TABLE_SIZE = 5376 - -# fmt: off -EUCTW_CHAR_TO_FREQ_ORDER = ( - 1, 1800, 1506, 255, 1431, 198, 9, 82, 6, 7310, 177, 202, 3615, 1256, 2808, 110, # 2742 - 3735, 33, 3241, 261, 76, 44, 2113, 16, 2931, 2184, 1176, 659, 3868, 26, 3404, 2643, # 2758 - 1198, 3869, 3313, 4060, 410, 2211, 302, 590, 361, 1963, 8, 204, 58, 4296, 7311, 1931, # 2774 - 63, 7312, 7313, 317, 1614, 75, 222, 159, 4061, 2412, 1480, 7314, 3500, 3068, 224, 2809, # 2790 - 3616, 3, 10, 3870, 1471, 29, 2774, 1135, 2852, 1939, 873, 130, 3242, 1123, 312, 7315, # 2806 - 4297, 2051, 507, 252, 682, 7316, 142, 1914, 124, 206, 2932, 34, 3501, 3173, 64, 604, # 2822 - 7317, 2494, 1976, 1977, 155, 1990, 645, 641, 1606, 7318, 3405, 337, 72, 406, 7319, 80, # 2838 - 630, 238, 3174, 1509, 263, 939, 1092, 2644, 756, 1440, 1094, 3406, 449, 69, 2969, 591, # 2854 - 179, 2095, 471, 115, 2034, 1843, 60, 50, 2970, 134, 806, 1868, 734, 2035, 3407, 180, # 2870 - 995, 1607, 156, 537, 2893, 688, 7320, 319, 1305, 779, 2144, 514, 2374, 298, 4298, 359, # 2886 - 2495, 90, 2707, 1338, 663, 11, 906, 1099, 2545, 20, 2436, 182, 532, 1716, 7321, 732, # 2902 - 1376, 4062, 1311, 1420, 3175, 25, 2312, 1056, 113, 399, 382, 1949, 242, 3408, 2467, 529, # 2918 - 3243, 475, 1447, 3617, 7322, 117, 21, 656, 810, 1297, 2295, 2329, 3502, 7323, 126, 4063, # 2934 - 706, 456, 150, 613, 4299, 71, 1118, 2036, 4064, 145, 3069, 85, 835, 486, 2114, 1246, # 2950 - 1426, 428, 727, 1285, 1015, 800, 106, 623, 303, 1281, 7324, 2127, 2354, 347, 3736, 221, # 2966 - 3503, 3110, 7325, 1955, 1153, 4065, 83, 296, 1199, 3070, 192, 624, 93, 7326, 822, 1897, # 2982 - 2810, 3111, 795, 2064, 991, 1554, 1542, 1592, 27, 43, 2853, 859, 139, 1456, 860, 4300, # 2998 - 437, 712, 3871, 164, 2392, 3112, 695, 211, 3017, 2096, 195, 3872, 1608, 3504, 3505, 3618, # 3014 - 3873, 234, 811, 2971, 2097, 3874, 2229, 1441, 3506, 1615, 2375, 668, 2076, 1638, 305, 228, # 3030 - 1664, 4301, 467, 415, 7327, 262, 2098, 1593, 239, 108, 300, 200, 1033, 512, 1247, 2077, # 3046 - 7328, 7329, 2173, 3176, 3619, 2673, 593, 845, 1062, 3244, 88, 1723, 2037, 3875, 1950, 212, # 3062 - 266, 152, 149, 468, 1898, 4066, 4302, 77, 187, 7330, 3018, 37, 5, 2972, 7331, 3876, # 3078 - 7332, 7333, 39, 2517, 4303, 2894, 3177, 2078, 55, 148, 74, 4304, 545, 483, 1474, 1029, # 3094 - 1665, 217, 1869, 1531, 3113, 1104, 2645, 4067, 24, 172, 3507, 900, 3877, 3508, 3509, 4305, # 3110 - 32, 1408, 2811, 1312, 329, 487, 2355, 2247, 2708, 784, 2674, 4, 3019, 3314, 1427, 1788, # 3126 - 188, 109, 499, 7334, 3620, 1717, 1789, 888, 1217, 3020, 4306, 7335, 3510, 7336, 3315, 1520, # 3142 - 3621, 3878, 196, 1034, 775, 7337, 7338, 929, 1815, 249, 439, 38, 7339, 1063, 7340, 794, # 3158 - 3879, 1435, 2296, 46, 178, 3245, 2065, 7341, 2376, 7342, 214, 1709, 4307, 804, 35, 707, # 3174 - 324, 3622, 1601, 2546, 140, 459, 4068, 7343, 7344, 1365, 839, 272, 978, 2257, 2572, 3409, # 3190 - 2128, 1363, 3623, 1423, 697, 100, 3071, 48, 70, 1231, 495, 3114, 2193, 7345, 1294, 7346, # 3206 - 2079, 462, 586, 1042, 3246, 853, 256, 988, 185, 2377, 3410, 1698, 434, 1084, 7347, 3411, # 3222 - 314, 2615, 2775, 4308, 2330, 2331, 569, 2280, 637, 1816, 2518, 757, 1162, 1878, 1616, 3412, # 3238 - 287, 1577, 2115, 768, 4309, 1671, 2854, 3511, 2519, 1321, 3737, 909, 2413, 7348, 4069, 933, # 3254 - 3738, 7349, 2052, 2356, 1222, 4310, 765, 2414, 1322, 786, 4311, 7350, 1919, 1462, 1677, 2895, # 3270 - 1699, 7351, 4312, 1424, 2437, 3115, 3624, 2590, 3316, 1774, 1940, 3413, 3880, 4070, 309, 1369, # 3286 - 1130, 2812, 364, 2230, 1653, 1299, 3881, 3512, 3882, 3883, 2646, 525, 1085, 3021, 902, 2000, # 3302 - 1475, 964, 4313, 421, 1844, 1415, 1057, 2281, 940, 1364, 3116, 376, 4314, 4315, 1381, 7, # 3318 - 2520, 983, 2378, 336, 1710, 2675, 1845, 321, 3414, 559, 1131, 3022, 2742, 1808, 1132, 1313, # 3334 - 265, 1481, 1857, 7352, 352, 1203, 2813, 3247, 167, 1089, 420, 2814, 776, 792, 1724, 3513, # 3350 - 4071, 2438, 3248, 7353, 4072, 7354, 446, 229, 333, 2743, 901, 3739, 1200, 1557, 4316, 2647, # 3366 - 1920, 395, 2744, 2676, 3740, 4073, 1835, 125, 916, 3178, 2616, 4317, 7355, 7356, 3741, 7357, # 3382 - 7358, 7359, 4318, 3117, 3625, 1133, 2547, 1757, 3415, 1510, 2313, 1409, 3514, 7360, 2145, 438, # 3398 - 2591, 2896, 2379, 3317, 1068, 958, 3023, 461, 311, 2855, 2677, 4074, 1915, 3179, 4075, 1978, # 3414 - 383, 750, 2745, 2617, 4076, 274, 539, 385, 1278, 1442, 7361, 1154, 1964, 384, 561, 210, # 3430 - 98, 1295, 2548, 3515, 7362, 1711, 2415, 1482, 3416, 3884, 2897, 1257, 129, 7363, 3742, 642, # 3446 - 523, 2776, 2777, 2648, 7364, 141, 2231, 1333, 68, 176, 441, 876, 907, 4077, 603, 2592, # 3462 - 710, 171, 3417, 404, 549, 18, 3118, 2393, 1410, 3626, 1666, 7365, 3516, 4319, 2898, 4320, # 3478 - 7366, 2973, 368, 7367, 146, 366, 99, 871, 3627, 1543, 748, 807, 1586, 1185, 22, 2258, # 3494 - 379, 3743, 3180, 7368, 3181, 505, 1941, 2618, 1991, 1382, 2314, 7369, 380, 2357, 218, 702, # 3510 - 1817, 1248, 3418, 3024, 3517, 3318, 3249, 7370, 2974, 3628, 930, 3250, 3744, 7371, 59, 7372, # 3526 - 585, 601, 4078, 497, 3419, 1112, 1314, 4321, 1801, 7373, 1223, 1472, 2174, 7374, 749, 1836, # 3542 - 690, 1899, 3745, 1772, 3885, 1476, 429, 1043, 1790, 2232, 2116, 917, 4079, 447, 1086, 1629, # 3558 - 7375, 556, 7376, 7377, 2020, 1654, 844, 1090, 105, 550, 966, 1758, 2815, 1008, 1782, 686, # 3574 - 1095, 7378, 2282, 793, 1602, 7379, 3518, 2593, 4322, 4080, 2933, 2297, 4323, 3746, 980, 2496, # 3590 - 544, 353, 527, 4324, 908, 2678, 2899, 7380, 381, 2619, 1942, 1348, 7381, 1341, 1252, 560, # 3606 - 3072, 7382, 3420, 2856, 7383, 2053, 973, 886, 2080, 143, 4325, 7384, 7385, 157, 3886, 496, # 3622 - 4081, 57, 840, 540, 2038, 4326, 4327, 3421, 2117, 1445, 970, 2259, 1748, 1965, 2081, 4082, # 3638 - 3119, 1234, 1775, 3251, 2816, 3629, 773, 1206, 2129, 1066, 2039, 1326, 3887, 1738, 1725, 4083, # 3654 - 279, 3120, 51, 1544, 2594, 423, 1578, 2130, 2066, 173, 4328, 1879, 7386, 7387, 1583, 264, # 3670 - 610, 3630, 4329, 2439, 280, 154, 7388, 7389, 7390, 1739, 338, 1282, 3073, 693, 2857, 1411, # 3686 - 1074, 3747, 2440, 7391, 4330, 7392, 7393, 1240, 952, 2394, 7394, 2900, 1538, 2679, 685, 1483, # 3702 - 4084, 2468, 1436, 953, 4085, 2054, 4331, 671, 2395, 79, 4086, 2441, 3252, 608, 567, 2680, # 3718 - 3422, 4087, 4088, 1691, 393, 1261, 1791, 2396, 7395, 4332, 7396, 7397, 7398, 7399, 1383, 1672, # 3734 - 3748, 3182, 1464, 522, 1119, 661, 1150, 216, 675, 4333, 3888, 1432, 3519, 609, 4334, 2681, # 3750 - 2397, 7400, 7401, 7402, 4089, 3025, 0, 7403, 2469, 315, 231, 2442, 301, 3319, 4335, 2380, # 3766 - 7404, 233, 4090, 3631, 1818, 4336, 4337, 7405, 96, 1776, 1315, 2082, 7406, 257, 7407, 1809, # 3782 - 3632, 2709, 1139, 1819, 4091, 2021, 1124, 2163, 2778, 1777, 2649, 7408, 3074, 363, 1655, 3183, # 3798 - 7409, 2975, 7410, 7411, 7412, 3889, 1567, 3890, 718, 103, 3184, 849, 1443, 341, 3320, 2934, # 3814 - 1484, 7413, 1712, 127, 67, 339, 4092, 2398, 679, 1412, 821, 7414, 7415, 834, 738, 351, # 3830 - 2976, 2146, 846, 235, 1497, 1880, 418, 1992, 3749, 2710, 186, 1100, 2147, 2746, 3520, 1545, # 3846 - 1355, 2935, 2858, 1377, 583, 3891, 4093, 2573, 2977, 7416, 1298, 3633, 1078, 2549, 3634, 2358, # 3862 - 78, 3750, 3751, 267, 1289, 2099, 2001, 1594, 4094, 348, 369, 1274, 2194, 2175, 1837, 4338, # 3878 - 1820, 2817, 3635, 2747, 2283, 2002, 4339, 2936, 2748, 144, 3321, 882, 4340, 3892, 2749, 3423, # 3894 - 4341, 2901, 7417, 4095, 1726, 320, 7418, 3893, 3026, 788, 2978, 7419, 2818, 1773, 1327, 2859, # 3910 - 3894, 2819, 7420, 1306, 4342, 2003, 1700, 3752, 3521, 2359, 2650, 787, 2022, 506, 824, 3636, # 3926 - 534, 323, 4343, 1044, 3322, 2023, 1900, 946, 3424, 7421, 1778, 1500, 1678, 7422, 1881, 4344, # 3942 - 165, 243, 4345, 3637, 2521, 123, 683, 4096, 764, 4346, 36, 3895, 1792, 589, 2902, 816, # 3958 - 626, 1667, 3027, 2233, 1639, 1555, 1622, 3753, 3896, 7423, 3897, 2860, 1370, 1228, 1932, 891, # 3974 - 2083, 2903, 304, 4097, 7424, 292, 2979, 2711, 3522, 691, 2100, 4098, 1115, 4347, 118, 662, # 3990 - 7425, 611, 1156, 854, 2381, 1316, 2861, 2, 386, 515, 2904, 7426, 7427, 3253, 868, 2234, # 4006 - 1486, 855, 2651, 785, 2212, 3028, 7428, 1040, 3185, 3523, 7429, 3121, 448, 7430, 1525, 7431, # 4022 - 2164, 4348, 7432, 3754, 7433, 4099, 2820, 3524, 3122, 503, 818, 3898, 3123, 1568, 814, 676, # 4038 - 1444, 306, 1749, 7434, 3755, 1416, 1030, 197, 1428, 805, 2821, 1501, 4349, 7435, 7436, 7437, # 4054 - 1993, 7438, 4350, 7439, 7440, 2195, 13, 2779, 3638, 2980, 3124, 1229, 1916, 7441, 3756, 2131, # 4070 - 7442, 4100, 4351, 2399, 3525, 7443, 2213, 1511, 1727, 1120, 7444, 7445, 646, 3757, 2443, 307, # 4086 - 7446, 7447, 1595, 3186, 7448, 7449, 7450, 3639, 1113, 1356, 3899, 1465, 2522, 2523, 7451, 519, # 4102 - 7452, 128, 2132, 92, 2284, 1979, 7453, 3900, 1512, 342, 3125, 2196, 7454, 2780, 2214, 1980, # 4118 - 3323, 7455, 290, 1656, 1317, 789, 827, 2360, 7456, 3758, 4352, 562, 581, 3901, 7457, 401, # 4134 - 4353, 2248, 94, 4354, 1399, 2781, 7458, 1463, 2024, 4355, 3187, 1943, 7459, 828, 1105, 4101, # 4150 - 1262, 1394, 7460, 4102, 605, 4356, 7461, 1783, 2862, 7462, 2822, 819, 2101, 578, 2197, 2937, # 4166 - 7463, 1502, 436, 3254, 4103, 3255, 2823, 3902, 2905, 3425, 3426, 7464, 2712, 2315, 7465, 7466, # 4182 - 2332, 2067, 23, 4357, 193, 826, 3759, 2102, 699, 1630, 4104, 3075, 390, 1793, 1064, 3526, # 4198 - 7467, 1579, 3076, 3077, 1400, 7468, 4105, 1838, 1640, 2863, 7469, 4358, 4359, 137, 4106, 598, # 4214 - 3078, 1966, 780, 104, 974, 2938, 7470, 278, 899, 253, 402, 572, 504, 493, 1339, 7471, # 4230 - 3903, 1275, 4360, 2574, 2550, 7472, 3640, 3029, 3079, 2249, 565, 1334, 2713, 863, 41, 7473, # 4246 - 7474, 4361, 7475, 1657, 2333, 19, 463, 2750, 4107, 606, 7476, 2981, 3256, 1087, 2084, 1323, # 4262 - 2652, 2982, 7477, 1631, 1623, 1750, 4108, 2682, 7478, 2864, 791, 2714, 2653, 2334, 232, 2416, # 4278 - 7479, 2983, 1498, 7480, 2654, 2620, 755, 1366, 3641, 3257, 3126, 2025, 1609, 119, 1917, 3427, # 4294 - 862, 1026, 4109, 7481, 3904, 3760, 4362, 3905, 4363, 2260, 1951, 2470, 7482, 1125, 817, 4110, # 4310 - 4111, 3906, 1513, 1766, 2040, 1487, 4112, 3030, 3258, 2824, 3761, 3127, 7483, 7484, 1507, 7485, # 4326 - 2683, 733, 40, 1632, 1106, 2865, 345, 4113, 841, 2524, 230, 4364, 2984, 1846, 3259, 3428, # 4342 - 7486, 1263, 986, 3429, 7487, 735, 879, 254, 1137, 857, 622, 1300, 1180, 1388, 1562, 3907, # 4358 - 3908, 2939, 967, 2751, 2655, 1349, 592, 2133, 1692, 3324, 2985, 1994, 4114, 1679, 3909, 1901, # 4374 - 2185, 7488, 739, 3642, 2715, 1296, 1290, 7489, 4115, 2198, 2199, 1921, 1563, 2595, 2551, 1870, # 4390 - 2752, 2986, 7490, 435, 7491, 343, 1108, 596, 17, 1751, 4365, 2235, 3430, 3643, 7492, 4366, # 4406 - 294, 3527, 2940, 1693, 477, 979, 281, 2041, 3528, 643, 2042, 3644, 2621, 2782, 2261, 1031, # 4422 - 2335, 2134, 2298, 3529, 4367, 367, 1249, 2552, 7493, 3530, 7494, 4368, 1283, 3325, 2004, 240, # 4438 - 1762, 3326, 4369, 4370, 836, 1069, 3128, 474, 7495, 2148, 2525, 268, 3531, 7496, 3188, 1521, # 4454 - 1284, 7497, 1658, 1546, 4116, 7498, 3532, 3533, 7499, 4117, 3327, 2684, 1685, 4118, 961, 1673, # 4470 - 2622, 190, 2005, 2200, 3762, 4371, 4372, 7500, 570, 2497, 3645, 1490, 7501, 4373, 2623, 3260, # 4486 - 1956, 4374, 584, 1514, 396, 1045, 1944, 7502, 4375, 1967, 2444, 7503, 7504, 4376, 3910, 619, # 4502 - 7505, 3129, 3261, 215, 2006, 2783, 2553, 3189, 4377, 3190, 4378, 763, 4119, 3763, 4379, 7506, # 4518 - 7507, 1957, 1767, 2941, 3328, 3646, 1174, 452, 1477, 4380, 3329, 3130, 7508, 2825, 1253, 2382, # 4534 - 2186, 1091, 2285, 4120, 492, 7509, 638, 1169, 1824, 2135, 1752, 3911, 648, 926, 1021, 1324, # 4550 - 4381, 520, 4382, 997, 847, 1007, 892, 4383, 3764, 2262, 1871, 3647, 7510, 2400, 1784, 4384, # 4566 - 1952, 2942, 3080, 3191, 1728, 4121, 2043, 3648, 4385, 2007, 1701, 3131, 1551, 30, 2263, 4122, # 4582 - 7511, 2026, 4386, 3534, 7512, 501, 7513, 4123, 594, 3431, 2165, 1821, 3535, 3432, 3536, 3192, # 4598 - 829, 2826, 4124, 7514, 1680, 3132, 1225, 4125, 7515, 3262, 4387, 4126, 3133, 2336, 7516, 4388, # 4614 - 4127, 7517, 3912, 3913, 7518, 1847, 2383, 2596, 3330, 7519, 4389, 374, 3914, 652, 4128, 4129, # 4630 - 375, 1140, 798, 7520, 7521, 7522, 2361, 4390, 2264, 546, 1659, 138, 3031, 2445, 4391, 7523, # 4646 - 2250, 612, 1848, 910, 796, 3765, 1740, 1371, 825, 3766, 3767, 7524, 2906, 2554, 7525, 692, # 4662 - 444, 3032, 2624, 801, 4392, 4130, 7526, 1491, 244, 1053, 3033, 4131, 4132, 340, 7527, 3915, # 4678 - 1041, 2987, 293, 1168, 87, 1357, 7528, 1539, 959, 7529, 2236, 721, 694, 4133, 3768, 219, # 4694 - 1478, 644, 1417, 3331, 2656, 1413, 1401, 1335, 1389, 3916, 7530, 7531, 2988, 2362, 3134, 1825, # 4710 - 730, 1515, 184, 2827, 66, 4393, 7532, 1660, 2943, 246, 3332, 378, 1457, 226, 3433, 975, # 4726 - 3917, 2944, 1264, 3537, 674, 696, 7533, 163, 7534, 1141, 2417, 2166, 713, 3538, 3333, 4394, # 4742 - 3918, 7535, 7536, 1186, 15, 7537, 1079, 1070, 7538, 1522, 3193, 3539, 276, 1050, 2716, 758, # 4758 - 1126, 653, 2945, 3263, 7539, 2337, 889, 3540, 3919, 3081, 2989, 903, 1250, 4395, 3920, 3434, # 4774 - 3541, 1342, 1681, 1718, 766, 3264, 286, 89, 2946, 3649, 7540, 1713, 7541, 2597, 3334, 2990, # 4790 - 7542, 2947, 2215, 3194, 2866, 7543, 4396, 2498, 2526, 181, 387, 1075, 3921, 731, 2187, 3335, # 4806 - 7544, 3265, 310, 313, 3435, 2299, 770, 4134, 54, 3034, 189, 4397, 3082, 3769, 3922, 7545, # 4822 - 1230, 1617, 1849, 355, 3542, 4135, 4398, 3336, 111, 4136, 3650, 1350, 3135, 3436, 3035, 4137, # 4838 - 2149, 3266, 3543, 7546, 2784, 3923, 3924, 2991, 722, 2008, 7547, 1071, 247, 1207, 2338, 2471, # 4854 - 1378, 4399, 2009, 864, 1437, 1214, 4400, 373, 3770, 1142, 2216, 667, 4401, 442, 2753, 2555, # 4870 - 3771, 3925, 1968, 4138, 3267, 1839, 837, 170, 1107, 934, 1336, 1882, 7548, 7549, 2118, 4139, # 4886 - 2828, 743, 1569, 7550, 4402, 4140, 582, 2384, 1418, 3437, 7551, 1802, 7552, 357, 1395, 1729, # 4902 - 3651, 3268, 2418, 1564, 2237, 7553, 3083, 3772, 1633, 4403, 1114, 2085, 4141, 1532, 7554, 482, # 4918 - 2446, 4404, 7555, 7556, 1492, 833, 1466, 7557, 2717, 3544, 1641, 2829, 7558, 1526, 1272, 3652, # 4934 - 4142, 1686, 1794, 416, 2556, 1902, 1953, 1803, 7559, 3773, 2785, 3774, 1159, 2316, 7560, 2867, # 4950 - 4405, 1610, 1584, 3036, 2419, 2754, 443, 3269, 1163, 3136, 7561, 7562, 3926, 7563, 4143, 2499, # 4966 - 3037, 4406, 3927, 3137, 2103, 1647, 3545, 2010, 1872, 4144, 7564, 4145, 431, 3438, 7565, 250, # 4982 - 97, 81, 4146, 7566, 1648, 1850, 1558, 160, 848, 7567, 866, 740, 1694, 7568, 2201, 2830, # 4998 - 3195, 4147, 4407, 3653, 1687, 950, 2472, 426, 469, 3196, 3654, 3655, 3928, 7569, 7570, 1188, # 5014 - 424, 1995, 861, 3546, 4148, 3775, 2202, 2685, 168, 1235, 3547, 4149, 7571, 2086, 1674, 4408, # 5030 - 3337, 3270, 220, 2557, 1009, 7572, 3776, 670, 2992, 332, 1208, 717, 7573, 7574, 3548, 2447, # 5046 - 3929, 3338, 7575, 513, 7576, 1209, 2868, 3339, 3138, 4409, 1080, 7577, 7578, 7579, 7580, 2527, # 5062 - 3656, 3549, 815, 1587, 3930, 3931, 7581, 3550, 3439, 3777, 1254, 4410, 1328, 3038, 1390, 3932, # 5078 - 1741, 3933, 3778, 3934, 7582, 236, 3779, 2448, 3271, 7583, 7584, 3657, 3780, 1273, 3781, 4411, # 5094 - 7585, 308, 7586, 4412, 245, 4413, 1851, 2473, 1307, 2575, 430, 715, 2136, 2449, 7587, 270, # 5110 - 199, 2869, 3935, 7588, 3551, 2718, 1753, 761, 1754, 725, 1661, 1840, 4414, 3440, 3658, 7589, # 5126 - 7590, 587, 14, 3272, 227, 2598, 326, 480, 2265, 943, 2755, 3552, 291, 650, 1883, 7591, # 5142 - 1702, 1226, 102, 1547, 62, 3441, 904, 4415, 3442, 1164, 4150, 7592, 7593, 1224, 1548, 2756, # 5158 - 391, 498, 1493, 7594, 1386, 1419, 7595, 2055, 1177, 4416, 813, 880, 1081, 2363, 566, 1145, # 5174 - 4417, 2286, 1001, 1035, 2558, 2599, 2238, 394, 1286, 7596, 7597, 2068, 7598, 86, 1494, 1730, # 5190 - 3936, 491, 1588, 745, 897, 2948, 843, 3340, 3937, 2757, 2870, 3273, 1768, 998, 2217, 2069, # 5206 - 397, 1826, 1195, 1969, 3659, 2993, 3341, 284, 7599, 3782, 2500, 2137, 2119, 1903, 7600, 3938, # 5222 - 2150, 3939, 4151, 1036, 3443, 1904, 114, 2559, 4152, 209, 1527, 7601, 7602, 2949, 2831, 2625, # 5238 - 2385, 2719, 3139, 812, 2560, 7603, 3274, 7604, 1559, 737, 1884, 3660, 1210, 885, 28, 2686, # 5254 - 3553, 3783, 7605, 4153, 1004, 1779, 4418, 7606, 346, 1981, 2218, 2687, 4419, 3784, 1742, 797, # 5270 - 1642, 3940, 1933, 1072, 1384, 2151, 896, 3941, 3275, 3661, 3197, 2871, 3554, 7607, 2561, 1958, # 5286 - 4420, 2450, 1785, 7608, 7609, 7610, 3942, 4154, 1005, 1308, 3662, 4155, 2720, 4421, 4422, 1528, # 5302 - 2600, 161, 1178, 4156, 1982, 987, 4423, 1101, 4157, 631, 3943, 1157, 3198, 2420, 1343, 1241, # 5318 - 1016, 2239, 2562, 372, 877, 2339, 2501, 1160, 555, 1934, 911, 3944, 7611, 466, 1170, 169, # 5334 - 1051, 2907, 2688, 3663, 2474, 2994, 1182, 2011, 2563, 1251, 2626, 7612, 992, 2340, 3444, 1540, # 5350 - 2721, 1201, 2070, 2401, 1996, 2475, 7613, 4424, 528, 1922, 2188, 1503, 1873, 1570, 2364, 3342, # 5366 - 3276, 7614, 557, 1073, 7615, 1827, 3445, 2087, 2266, 3140, 3039, 3084, 767, 3085, 2786, 4425, # 5382 - 1006, 4158, 4426, 2341, 1267, 2176, 3664, 3199, 778, 3945, 3200, 2722, 1597, 2657, 7616, 4427, # 5398 - 7617, 3446, 7618, 7619, 7620, 3277, 2689, 1433, 3278, 131, 95, 1504, 3946, 723, 4159, 3141, # 5414 - 1841, 3555, 2758, 2189, 3947, 2027, 2104, 3665, 7621, 2995, 3948, 1218, 7622, 3343, 3201, 3949, # 5430 - 4160, 2576, 248, 1634, 3785, 912, 7623, 2832, 3666, 3040, 3786, 654, 53, 7624, 2996, 7625, # 5446 - 1688, 4428, 777, 3447, 1032, 3950, 1425, 7626, 191, 820, 2120, 2833, 971, 4429, 931, 3202, # 5462 - 135, 664, 783, 3787, 1997, 772, 2908, 1935, 3951, 3788, 4430, 2909, 3203, 282, 2723, 640, # 5478 - 1372, 3448, 1127, 922, 325, 3344, 7627, 7628, 711, 2044, 7629, 7630, 3952, 2219, 2787, 1936, # 5494 - 3953, 3345, 2220, 2251, 3789, 2300, 7631, 4431, 3790, 1258, 3279, 3954, 3204, 2138, 2950, 3955, # 5510 - 3956, 7632, 2221, 258, 3205, 4432, 101, 1227, 7633, 3280, 1755, 7634, 1391, 3281, 7635, 2910, # 5526 - 2056, 893, 7636, 7637, 7638, 1402, 4161, 2342, 7639, 7640, 3206, 3556, 7641, 7642, 878, 1325, # 5542 - 1780, 2788, 4433, 259, 1385, 2577, 744, 1183, 2267, 4434, 7643, 3957, 2502, 7644, 684, 1024, # 5558 - 4162, 7645, 472, 3557, 3449, 1165, 3282, 3958, 3959, 322, 2152, 881, 455, 1695, 1152, 1340, # 5574 - 660, 554, 2153, 4435, 1058, 4436, 4163, 830, 1065, 3346, 3960, 4437, 1923, 7646, 1703, 1918, # 5590 - 7647, 932, 2268, 122, 7648, 4438, 947, 677, 7649, 3791, 2627, 297, 1905, 1924, 2269, 4439, # 5606 - 2317, 3283, 7650, 7651, 4164, 7652, 4165, 84, 4166, 112, 989, 7653, 547, 1059, 3961, 701, # 5622 - 3558, 1019, 7654, 4167, 7655, 3450, 942, 639, 457, 2301, 2451, 993, 2951, 407, 851, 494, # 5638 - 4440, 3347, 927, 7656, 1237, 7657, 2421, 3348, 573, 4168, 680, 921, 2911, 1279, 1874, 285, # 5654 - 790, 1448, 1983, 719, 2167, 7658, 7659, 4441, 3962, 3963, 1649, 7660, 1541, 563, 7661, 1077, # 5670 - 7662, 3349, 3041, 3451, 511, 2997, 3964, 3965, 3667, 3966, 1268, 2564, 3350, 3207, 4442, 4443, # 5686 - 7663, 535, 1048, 1276, 1189, 2912, 2028, 3142, 1438, 1373, 2834, 2952, 1134, 2012, 7664, 4169, # 5702 - 1238, 2578, 3086, 1259, 7665, 700, 7666, 2953, 3143, 3668, 4170, 7667, 4171, 1146, 1875, 1906, # 5718 - 4444, 2601, 3967, 781, 2422, 132, 1589, 203, 147, 273, 2789, 2402, 898, 1786, 2154, 3968, # 5734 - 3969, 7668, 3792, 2790, 7669, 7670, 4445, 4446, 7671, 3208, 7672, 1635, 3793, 965, 7673, 1804, # 5750 - 2690, 1516, 3559, 1121, 1082, 1329, 3284, 3970, 1449, 3794, 65, 1128, 2835, 2913, 2759, 1590, # 5766 - 3795, 7674, 7675, 12, 2658, 45, 976, 2579, 3144, 4447, 517, 2528, 1013, 1037, 3209, 7676, # 5782 - 3796, 2836, 7677, 3797, 7678, 3452, 7679, 2602, 614, 1998, 2318, 3798, 3087, 2724, 2628, 7680, # 5798 - 2580, 4172, 599, 1269, 7681, 1810, 3669, 7682, 2691, 3088, 759, 1060, 489, 1805, 3351, 3285, # 5814 - 1358, 7683, 7684, 2386, 1387, 1215, 2629, 2252, 490, 7685, 7686, 4173, 1759, 2387, 2343, 7687, # 5830 - 4448, 3799, 1907, 3971, 2630, 1806, 3210, 4449, 3453, 3286, 2760, 2344, 874, 7688, 7689, 3454, # 5846 - 3670, 1858, 91, 2914, 3671, 3042, 3800, 4450, 7690, 3145, 3972, 2659, 7691, 3455, 1202, 1403, # 5862 - 3801, 2954, 2529, 1517, 2503, 4451, 3456, 2504, 7692, 4452, 7693, 2692, 1885, 1495, 1731, 3973, # 5878 - 2365, 4453, 7694, 2029, 7695, 7696, 3974, 2693, 1216, 237, 2581, 4174, 2319, 3975, 3802, 4454, # 5894 - 4455, 2694, 3560, 3457, 445, 4456, 7697, 7698, 7699, 7700, 2761, 61, 3976, 3672, 1822, 3977, # 5910 - 7701, 687, 2045, 935, 925, 405, 2660, 703, 1096, 1859, 2725, 4457, 3978, 1876, 1367, 2695, # 5926 - 3352, 918, 2105, 1781, 2476, 334, 3287, 1611, 1093, 4458, 564, 3146, 3458, 3673, 3353, 945, # 5942 - 2631, 2057, 4459, 7702, 1925, 872, 4175, 7703, 3459, 2696, 3089, 349, 4176, 3674, 3979, 4460, # 5958 - 3803, 4177, 3675, 2155, 3980, 4461, 4462, 4178, 4463, 2403, 2046, 782, 3981, 400, 251, 4179, # 5974 - 1624, 7704, 7705, 277, 3676, 299, 1265, 476, 1191, 3804, 2121, 4180, 4181, 1109, 205, 7706, # 5990 - 2582, 1000, 2156, 3561, 1860, 7707, 7708, 7709, 4464, 7710, 4465, 2565, 107, 2477, 2157, 3982, # 6006 - 3460, 3147, 7711, 1533, 541, 1301, 158, 753, 4182, 2872, 3562, 7712, 1696, 370, 1088, 4183, # 6022 - 4466, 3563, 579, 327, 440, 162, 2240, 269, 1937, 1374, 3461, 968, 3043, 56, 1396, 3090, # 6038 - 2106, 3288, 3354, 7713, 1926, 2158, 4467, 2998, 7714, 3564, 7715, 7716, 3677, 4468, 2478, 7717, # 6054 - 2791, 7718, 1650, 4469, 7719, 2603, 7720, 7721, 3983, 2661, 3355, 1149, 3356, 3984, 3805, 3985, # 6070 - 7722, 1076, 49, 7723, 951, 3211, 3289, 3290, 450, 2837, 920, 7724, 1811, 2792, 2366, 4184, # 6086 - 1908, 1138, 2367, 3806, 3462, 7725, 3212, 4470, 1909, 1147, 1518, 2423, 4471, 3807, 7726, 4472, # 6102 - 2388, 2604, 260, 1795, 3213, 7727, 7728, 3808, 3291, 708, 7729, 3565, 1704, 7730, 3566, 1351, # 6118 - 1618, 3357, 2999, 1886, 944, 4185, 3358, 4186, 3044, 3359, 4187, 7731, 3678, 422, 413, 1714, # 6134 - 3292, 500, 2058, 2345, 4188, 2479, 7732, 1344, 1910, 954, 7733, 1668, 7734, 7735, 3986, 2404, # 6150 - 4189, 3567, 3809, 4190, 7736, 2302, 1318, 2505, 3091, 133, 3092, 2873, 4473, 629, 31, 2838, # 6166 - 2697, 3810, 4474, 850, 949, 4475, 3987, 2955, 1732, 2088, 4191, 1496, 1852, 7737, 3988, 620, # 6182 - 3214, 981, 1242, 3679, 3360, 1619, 3680, 1643, 3293, 2139, 2452, 1970, 1719, 3463, 2168, 7738, # 6198 - 3215, 7739, 7740, 3361, 1828, 7741, 1277, 4476, 1565, 2047, 7742, 1636, 3568, 3093, 7743, 869, # 6214 - 2839, 655, 3811, 3812, 3094, 3989, 3000, 3813, 1310, 3569, 4477, 7744, 7745, 7746, 1733, 558, # 6230 - 4478, 3681, 335, 1549, 3045, 1756, 4192, 3682, 1945, 3464, 1829, 1291, 1192, 470, 2726, 2107, # 6246 - 2793, 913, 1054, 3990, 7747, 1027, 7748, 3046, 3991, 4479, 982, 2662, 3362, 3148, 3465, 3216, # 6262 - 3217, 1946, 2794, 7749, 571, 4480, 7750, 1830, 7751, 3570, 2583, 1523, 2424, 7752, 2089, 984, # 6278 - 4481, 3683, 1959, 7753, 3684, 852, 923, 2795, 3466, 3685, 969, 1519, 999, 2048, 2320, 1705, # 6294 - 7754, 3095, 615, 1662, 151, 597, 3992, 2405, 2321, 1049, 275, 4482, 3686, 4193, 568, 3687, # 6310 - 3571, 2480, 4194, 3688, 7755, 2425, 2270, 409, 3218, 7756, 1566, 2874, 3467, 1002, 769, 2840, # 6326 - 194, 2090, 3149, 3689, 2222, 3294, 4195, 628, 1505, 7757, 7758, 1763, 2177, 3001, 3993, 521, # 6342 - 1161, 2584, 1787, 2203, 2406, 4483, 3994, 1625, 4196, 4197, 412, 42, 3096, 464, 7759, 2632, # 6358 - 4484, 3363, 1760, 1571, 2875, 3468, 2530, 1219, 2204, 3814, 2633, 2140, 2368, 4485, 4486, 3295, # 6374 - 1651, 3364, 3572, 7760, 7761, 3573, 2481, 3469, 7762, 3690, 7763, 7764, 2271, 2091, 460, 7765, # 6390 - 4487, 7766, 3002, 962, 588, 3574, 289, 3219, 2634, 1116, 52, 7767, 3047, 1796, 7768, 7769, # 6406 - 7770, 1467, 7771, 1598, 1143, 3691, 4198, 1984, 1734, 1067, 4488, 1280, 3365, 465, 4489, 1572, # 6422 - 510, 7772, 1927, 2241, 1812, 1644, 3575, 7773, 4490, 3692, 7774, 7775, 2663, 1573, 1534, 7776, # 6438 - 7777, 4199, 536, 1807, 1761, 3470, 3815, 3150, 2635, 7778, 7779, 7780, 4491, 3471, 2915, 1911, # 6454 - 2796, 7781, 3296, 1122, 377, 3220, 7782, 360, 7783, 7784, 4200, 1529, 551, 7785, 2059, 3693, # 6470 - 1769, 2426, 7786, 2916, 4201, 3297, 3097, 2322, 2108, 2030, 4492, 1404, 136, 1468, 1479, 672, # 6486 - 1171, 3221, 2303, 271, 3151, 7787, 2762, 7788, 2049, 678, 2727, 865, 1947, 4493, 7789, 2013, # 6502 - 3995, 2956, 7790, 2728, 2223, 1397, 3048, 3694, 4494, 4495, 1735, 2917, 3366, 3576, 7791, 3816, # 6518 - 509, 2841, 2453, 2876, 3817, 7792, 7793, 3152, 3153, 4496, 4202, 2531, 4497, 2304, 1166, 1010, # 6534 - 552, 681, 1887, 7794, 7795, 2957, 2958, 3996, 1287, 1596, 1861, 3154, 358, 453, 736, 175, # 6550 - 478, 1117, 905, 1167, 1097, 7796, 1853, 1530, 7797, 1706, 7798, 2178, 3472, 2287, 3695, 3473, # 6566 - 3577, 4203, 2092, 4204, 7799, 3367, 1193, 2482, 4205, 1458, 2190, 2205, 1862, 1888, 1421, 3298, # 6582 - 2918, 3049, 2179, 3474, 595, 2122, 7800, 3997, 7801, 7802, 4206, 1707, 2636, 223, 3696, 1359, # 6598 - 751, 3098, 183, 3475, 7803, 2797, 3003, 419, 2369, 633, 704, 3818, 2389, 241, 7804, 7805, # 6614 - 7806, 838, 3004, 3697, 2272, 2763, 2454, 3819, 1938, 2050, 3998, 1309, 3099, 2242, 1181, 7807, # 6630 - 1136, 2206, 3820, 2370, 1446, 4207, 2305, 4498, 7808, 7809, 4208, 1055, 2605, 484, 3698, 7810, # 6646 - 3999, 625, 4209, 2273, 3368, 1499, 4210, 4000, 7811, 4001, 4211, 3222, 2274, 2275, 3476, 7812, # 6662 - 7813, 2764, 808, 2606, 3699, 3369, 4002, 4212, 3100, 2532, 526, 3370, 3821, 4213, 955, 7814, # 6678 - 1620, 4214, 2637, 2427, 7815, 1429, 3700, 1669, 1831, 994, 928, 7816, 3578, 1260, 7817, 7818, # 6694 - 7819, 1948, 2288, 741, 2919, 1626, 4215, 2729, 2455, 867, 1184, 362, 3371, 1392, 7820, 7821, # 6710 - 4003, 4216, 1770, 1736, 3223, 2920, 4499, 4500, 1928, 2698, 1459, 1158, 7822, 3050, 3372, 2877, # 6726 - 1292, 1929, 2506, 2842, 3701, 1985, 1187, 2071, 2014, 2607, 4217, 7823, 2566, 2507, 2169, 3702, # 6742 - 2483, 3299, 7824, 3703, 4501, 7825, 7826, 666, 1003, 3005, 1022, 3579, 4218, 7827, 4502, 1813, # 6758 - 2253, 574, 3822, 1603, 295, 1535, 705, 3823, 4219, 283, 858, 417, 7828, 7829, 3224, 4503, # 6774 - 4504, 3051, 1220, 1889, 1046, 2276, 2456, 4004, 1393, 1599, 689, 2567, 388, 4220, 7830, 2484, # 6790 - 802, 7831, 2798, 3824, 2060, 1405, 2254, 7832, 4505, 3825, 2109, 1052, 1345, 3225, 1585, 7833, # 6806 - 809, 7834, 7835, 7836, 575, 2730, 3477, 956, 1552, 1469, 1144, 2323, 7837, 2324, 1560, 2457, # 6822 - 3580, 3226, 4005, 616, 2207, 3155, 2180, 2289, 7838, 1832, 7839, 3478, 4506, 7840, 1319, 3704, # 6838 - 3705, 1211, 3581, 1023, 3227, 1293, 2799, 7841, 7842, 7843, 3826, 607, 2306, 3827, 762, 2878, # 6854 - 1439, 4221, 1360, 7844, 1485, 3052, 7845, 4507, 1038, 4222, 1450, 2061, 2638, 4223, 1379, 4508, # 6870 - 2585, 7846, 7847, 4224, 1352, 1414, 2325, 2921, 1172, 7848, 7849, 3828, 3829, 7850, 1797, 1451, # 6886 - 7851, 7852, 7853, 7854, 2922, 4006, 4007, 2485, 2346, 411, 4008, 4009, 3582, 3300, 3101, 4509, # 6902 - 1561, 2664, 1452, 4010, 1375, 7855, 7856, 47, 2959, 316, 7857, 1406, 1591, 2923, 3156, 7858, # 6918 - 1025, 2141, 3102, 3157, 354, 2731, 884, 2224, 4225, 2407, 508, 3706, 726, 3583, 996, 2428, # 6934 - 3584, 729, 7859, 392, 2191, 1453, 4011, 4510, 3707, 7860, 7861, 2458, 3585, 2608, 1675, 2800, # 6950 - 919, 2347, 2960, 2348, 1270, 4511, 4012, 73, 7862, 7863, 647, 7864, 3228, 2843, 2255, 1550, # 6966 - 1346, 3006, 7865, 1332, 883, 3479, 7866, 7867, 7868, 7869, 3301, 2765, 7870, 1212, 831, 1347, # 6982 - 4226, 4512, 2326, 3830, 1863, 3053, 720, 3831, 4513, 4514, 3832, 7871, 4227, 7872, 7873, 4515, # 6998 - 7874, 7875, 1798, 4516, 3708, 2609, 4517, 3586, 1645, 2371, 7876, 7877, 2924, 669, 2208, 2665, # 7014 - 2429, 7878, 2879, 7879, 7880, 1028, 3229, 7881, 4228, 2408, 7882, 2256, 1353, 7883, 7884, 4518, # 7030 - 3158, 518, 7885, 4013, 7886, 4229, 1960, 7887, 2142, 4230, 7888, 7889, 3007, 2349, 2350, 3833, # 7046 - 516, 1833, 1454, 4014, 2699, 4231, 4519, 2225, 2610, 1971, 1129, 3587, 7890, 2766, 7891, 2961, # 7062 - 1422, 577, 1470, 3008, 1524, 3373, 7892, 7893, 432, 4232, 3054, 3480, 7894, 2586, 1455, 2508, # 7078 - 2226, 1972, 1175, 7895, 1020, 2732, 4015, 3481, 4520, 7896, 2733, 7897, 1743, 1361, 3055, 3482, # 7094 - 2639, 4016, 4233, 4521, 2290, 895, 924, 4234, 2170, 331, 2243, 3056, 166, 1627, 3057, 1098, # 7110 - 7898, 1232, 2880, 2227, 3374, 4522, 657, 403, 1196, 2372, 542, 3709, 3375, 1600, 4235, 3483, # 7126 - 7899, 4523, 2767, 3230, 576, 530, 1362, 7900, 4524, 2533, 2666, 3710, 4017, 7901, 842, 3834, # 7142 - 7902, 2801, 2031, 1014, 4018, 213, 2700, 3376, 665, 621, 4236, 7903, 3711, 2925, 2430, 7904, # 7158 - 2431, 3302, 3588, 3377, 7905, 4237, 2534, 4238, 4525, 3589, 1682, 4239, 3484, 1380, 7906, 724, # 7174 - 2277, 600, 1670, 7907, 1337, 1233, 4526, 3103, 2244, 7908, 1621, 4527, 7909, 651, 4240, 7910, # 7190 - 1612, 4241, 2611, 7911, 2844, 7912, 2734, 2307, 3058, 7913, 716, 2459, 3059, 174, 1255, 2701, # 7206 - 4019, 3590, 548, 1320, 1398, 728, 4020, 1574, 7914, 1890, 1197, 3060, 4021, 7915, 3061, 3062, # 7222 - 3712, 3591, 3713, 747, 7916, 635, 4242, 4528, 7917, 7918, 7919, 4243, 7920, 7921, 4529, 7922, # 7238 - 3378, 4530, 2432, 451, 7923, 3714, 2535, 2072, 4244, 2735, 4245, 4022, 7924, 1764, 4531, 7925, # 7254 - 4246, 350, 7926, 2278, 2390, 2486, 7927, 4247, 4023, 2245, 1434, 4024, 488, 4532, 458, 4248, # 7270 - 4025, 3715, 771, 1330, 2391, 3835, 2568, 3159, 2159, 2409, 1553, 2667, 3160, 4249, 7928, 2487, # 7286 - 2881, 2612, 1720, 2702, 4250, 3379, 4533, 7929, 2536, 4251, 7930, 3231, 4252, 2768, 7931, 2015, # 7302 - 2736, 7932, 1155, 1017, 3716, 3836, 7933, 3303, 2308, 201, 1864, 4253, 1430, 7934, 4026, 7935, # 7318 - 7936, 7937, 7938, 7939, 4254, 1604, 7940, 414, 1865, 371, 2587, 4534, 4535, 3485, 2016, 3104, # 7334 - 4536, 1708, 960, 4255, 887, 389, 2171, 1536, 1663, 1721, 7941, 2228, 4027, 2351, 2926, 1580, # 7350 - 7942, 7943, 7944, 1744, 7945, 2537, 4537, 4538, 7946, 4539, 7947, 2073, 7948, 7949, 3592, 3380, # 7366 - 2882, 4256, 7950, 4257, 2640, 3381, 2802, 673, 2703, 2460, 709, 3486, 4028, 3593, 4258, 7951, # 7382 - 1148, 502, 634, 7952, 7953, 1204, 4540, 3594, 1575, 4541, 2613, 3717, 7954, 3718, 3105, 948, # 7398 - 3232, 121, 1745, 3837, 1110, 7955, 4259, 3063, 2509, 3009, 4029, 3719, 1151, 1771, 3838, 1488, # 7414 - 4030, 1986, 7956, 2433, 3487, 7957, 7958, 2093, 7959, 4260, 3839, 1213, 1407, 2803, 531, 2737, # 7430 - 2538, 3233, 1011, 1537, 7960, 2769, 4261, 3106, 1061, 7961, 3720, 3721, 1866, 2883, 7962, 2017, # 7446 - 120, 4262, 4263, 2062, 3595, 3234, 2309, 3840, 2668, 3382, 1954, 4542, 7963, 7964, 3488, 1047, # 7462 - 2704, 1266, 7965, 1368, 4543, 2845, 649, 3383, 3841, 2539, 2738, 1102, 2846, 2669, 7966, 7967, # 7478 - 1999, 7968, 1111, 3596, 2962, 7969, 2488, 3842, 3597, 2804, 1854, 3384, 3722, 7970, 7971, 3385, # 7494 - 2410, 2884, 3304, 3235, 3598, 7972, 2569, 7973, 3599, 2805, 4031, 1460, 856, 7974, 3600, 7975, # 7510 - 2885, 2963, 7976, 2886, 3843, 7977, 4264, 632, 2510, 875, 3844, 1697, 3845, 2291, 7978, 7979, # 7526 - 4544, 3010, 1239, 580, 4545, 4265, 7980, 914, 936, 2074, 1190, 4032, 1039, 2123, 7981, 7982, # 7542 - 7983, 3386, 1473, 7984, 1354, 4266, 3846, 7985, 2172, 3064, 4033, 915, 3305, 4267, 4268, 3306, # 7558 - 1605, 1834, 7986, 2739, 398, 3601, 4269, 3847, 4034, 328, 1912, 2847, 4035, 3848, 1331, 4270, # 7574 - 3011, 937, 4271, 7987, 3602, 4036, 4037, 3387, 2160, 4546, 3388, 524, 742, 538, 3065, 1012, # 7590 - 7988, 7989, 3849, 2461, 7990, 658, 1103, 225, 3850, 7991, 7992, 4547, 7993, 4548, 7994, 3236, # 7606 - 1243, 7995, 4038, 963, 2246, 4549, 7996, 2705, 3603, 3161, 7997, 7998, 2588, 2327, 7999, 4550, # 7622 - 8000, 8001, 8002, 3489, 3307, 957, 3389, 2540, 2032, 1930, 2927, 2462, 870, 2018, 3604, 1746, # 7638 - 2770, 2771, 2434, 2463, 8003, 3851, 8004, 3723, 3107, 3724, 3490, 3390, 3725, 8005, 1179, 3066, # 7654 - 8006, 3162, 2373, 4272, 3726, 2541, 3163, 3108, 2740, 4039, 8007, 3391, 1556, 2542, 2292, 977, # 7670 - 2887, 2033, 4040, 1205, 3392, 8008, 1765, 3393, 3164, 2124, 1271, 1689, 714, 4551, 3491, 8009, # 7686 - 2328, 3852, 533, 4273, 3605, 2181, 617, 8010, 2464, 3308, 3492, 2310, 8011, 8012, 3165, 8013, # 7702 - 8014, 3853, 1987, 618, 427, 2641, 3493, 3394, 8015, 8016, 1244, 1690, 8017, 2806, 4274, 4552, # 7718 - 8018, 3494, 8019, 8020, 2279, 1576, 473, 3606, 4275, 3395, 972, 8021, 3607, 8022, 3067, 8023, # 7734 - 8024, 4553, 4554, 8025, 3727, 4041, 4042, 8026, 153, 4555, 356, 8027, 1891, 2888, 4276, 2143, # 7750 - 408, 803, 2352, 8028, 3854, 8029, 4277, 1646, 2570, 2511, 4556, 4557, 3855, 8030, 3856, 4278, # 7766 - 8031, 2411, 3396, 752, 8032, 8033, 1961, 2964, 8034, 746, 3012, 2465, 8035, 4279, 3728, 698, # 7782 - 4558, 1892, 4280, 3608, 2543, 4559, 3609, 3857, 8036, 3166, 3397, 8037, 1823, 1302, 4043, 2706, # 7798 - 3858, 1973, 4281, 8038, 4282, 3167, 823, 1303, 1288, 1236, 2848, 3495, 4044, 3398, 774, 3859, # 7814 - 8039, 1581, 4560, 1304, 2849, 3860, 4561, 8040, 2435, 2161, 1083, 3237, 4283, 4045, 4284, 344, # 7830 - 1173, 288, 2311, 454, 1683, 8041, 8042, 1461, 4562, 4046, 2589, 8043, 8044, 4563, 985, 894, # 7846 - 8045, 3399, 3168, 8046, 1913, 2928, 3729, 1988, 8047, 2110, 1974, 8048, 4047, 8049, 2571, 1194, # 7862 - 425, 8050, 4564, 3169, 1245, 3730, 4285, 8051, 8052, 2850, 8053, 636, 4565, 1855, 3861, 760, # 7878 - 1799, 8054, 4286, 2209, 1508, 4566, 4048, 1893, 1684, 2293, 8055, 8056, 8057, 4287, 4288, 2210, # 7894 - 479, 8058, 8059, 832, 8060, 4049, 2489, 8061, 2965, 2490, 3731, 990, 3109, 627, 1814, 2642, # 7910 - 4289, 1582, 4290, 2125, 2111, 3496, 4567, 8062, 799, 4291, 3170, 8063, 4568, 2112, 1737, 3013, # 7926 - 1018, 543, 754, 4292, 3309, 1676, 4569, 4570, 4050, 8064, 1489, 8065, 3497, 8066, 2614, 2889, # 7942 - 4051, 8067, 8068, 2966, 8069, 8070, 8071, 8072, 3171, 4571, 4572, 2182, 1722, 8073, 3238, 3239, # 7958 - 1842, 3610, 1715, 481, 365, 1975, 1856, 8074, 8075, 1962, 2491, 4573, 8076, 2126, 3611, 3240, # 7974 - 433, 1894, 2063, 2075, 8077, 602, 2741, 8078, 8079, 8080, 8081, 8082, 3014, 1628, 3400, 8083, # 7990 - 3172, 4574, 4052, 2890, 4575, 2512, 8084, 2544, 2772, 8085, 8086, 8087, 3310, 4576, 2891, 8088, # 8006 - 4577, 8089, 2851, 4578, 4579, 1221, 2967, 4053, 2513, 8090, 8091, 8092, 1867, 1989, 8093, 8094, # 8022 - 8095, 1895, 8096, 8097, 4580, 1896, 4054, 318, 8098, 2094, 4055, 4293, 8099, 8100, 485, 8101, # 8038 - 938, 3862, 553, 2670, 116, 8102, 3863, 3612, 8103, 3498, 2671, 2773, 3401, 3311, 2807, 8104, # 8054 - 3613, 2929, 4056, 1747, 2930, 2968, 8105, 8106, 207, 8107, 8108, 2672, 4581, 2514, 8109, 3015, # 8070 - 890, 3614, 3864, 8110, 1877, 3732, 3402, 8111, 2183, 2353, 3403, 1652, 8112, 8113, 8114, 941, # 8086 - 2294, 208, 3499, 4057, 2019, 330, 4294, 3865, 2892, 2492, 3733, 4295, 8115, 8116, 8117, 8118, # 8102 -) -# fmt: on diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwprober.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwprober.py deleted file mode 100644 index a37ab18..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwprober.py +++ /dev/null @@ -1,47 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .chardistribution import EUCTWDistributionAnalysis -from .codingstatemachine import CodingStateMachine -from .mbcharsetprober import MultiByteCharSetProber -from .mbcssm import EUCTW_SM_MODEL - - -class EUCTWProber(MultiByteCharSetProber): - def __init__(self) -> None: - super().__init__() - self.coding_sm = CodingStateMachine(EUCTW_SM_MODEL) - self.distribution_analyzer = EUCTWDistributionAnalysis() - self.reset() - - @property - def charset_name(self) -> str: - return "EUC-TW" - - @property - def language(self) -> str: - return "Taiwan" diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312freq.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312freq.py deleted file mode 100644 index b32bfc7..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312freq.py +++ /dev/null @@ -1,284 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# GB2312 most frequently used character table -# -# Char to FreqOrder table , from hz6763 - -# 512 --> 0.79 -- 0.79 -# 1024 --> 0.92 -- 0.13 -# 2048 --> 0.98 -- 0.06 -# 6768 --> 1.00 -- 0.02 -# -# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79 -# Random Distribution Ration = 512 / (3755 - 512) = 0.157 -# -# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR - -GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9 - -GB2312_TABLE_SIZE = 3760 - -# fmt: off -GB2312_CHAR_TO_FREQ_ORDER = ( -1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, -2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, -2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, - 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, -1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, -1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, - 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, -1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, -2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, -3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, - 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, -1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, - 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, -2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, - 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, -2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, -1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, -3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, - 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, -1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, - 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, -2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, -1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, -3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, -1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, -2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, -1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, - 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, -3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, -3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, - 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, -3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, - 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, -1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, -3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, -2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, -1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, - 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, -1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, -4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, - 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, -3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, -3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, - 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, -1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, -2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, -1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, -1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, - 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, -3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, -3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, -4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, - 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, -3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, -1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, -1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, -4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, - 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, - 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, -3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, -1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, - 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, -1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, -2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, - 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, - 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, - 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, -3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, -4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, -3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, - 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, -2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, -2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, -2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, - 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, -2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, - 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, - 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, - 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, -3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, -2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, -2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, -1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, - 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, -2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, - 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, - 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, -1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, -1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, - 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, - 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, -1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, -2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, -3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, -2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, -2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, -2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, -3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, -1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, -1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, -2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, -1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, -3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, -1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, -1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, -3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, - 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, -2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, -1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, -4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, -1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, -1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, -3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, -1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, - 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, - 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, -1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, - 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, -1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, -1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, - 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, -3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, -4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, -3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, -2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, -2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, -1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, -3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, -2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, -1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, -1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, - 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, -2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, -2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, -3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, -4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, -3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, - 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, -3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, -2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, -1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, - 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, - 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, -3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, -4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, -2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, -1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, -1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, - 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, -1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, -3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, - 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, - 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, -1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, - 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, -1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, - 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, -2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, - 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, -2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, -2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, -1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, -1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, -2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, - 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, -1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, -1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, -2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, -2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, -3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, -1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, -4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, - 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, - 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, -3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, -1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, - 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, -3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, -1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, -4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, -1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, -2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, -1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, - 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, -1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, -3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, - 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, -2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, - 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, -1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, -1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, -1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, -3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, -2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, -3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, -3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, -3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, - 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, -2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, - 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, -2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, - 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, -1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, - 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, - 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, -1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, -3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, -3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, -1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, -1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, -3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, -2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, -2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, -1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, -3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, - 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, -4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, -1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, -2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, -3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, -3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, -1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, - 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, - 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, -2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, - 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, -1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, - 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, -1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, -1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, -1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, -1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, -1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, - 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, - 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, #last 512 -) -# fmt: on diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312prober.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312prober.py deleted file mode 100644 index d423e73..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312prober.py +++ /dev/null @@ -1,47 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .chardistribution import GB2312DistributionAnalysis -from .codingstatemachine import CodingStateMachine -from .mbcharsetprober import MultiByteCharSetProber -from .mbcssm import GB2312_SM_MODEL - - -class GB2312Prober(MultiByteCharSetProber): - def __init__(self) -> None: - super().__init__() - self.coding_sm = CodingStateMachine(GB2312_SM_MODEL) - self.distribution_analyzer = GB2312DistributionAnalysis() - self.reset() - - @property - def charset_name(self) -> str: - return "GB2312" - - @property - def language(self) -> str: - return "Chinese" diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/hebrewprober.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/hebrewprober.py deleted file mode 100644 index 785d005..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/hebrewprober.py +++ /dev/null @@ -1,316 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Shy Shalom -# Portions created by the Initial Developer are Copyright (C) 2005 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from typing import Optional, Union - -from .charsetprober import CharSetProber -from .enums import ProbingState -from .sbcharsetprober import SingleByteCharSetProber - -# This prober doesn't actually recognize a language or a charset. -# It is a helper prober for the use of the Hebrew model probers - -### General ideas of the Hebrew charset recognition ### -# -# Four main charsets exist in Hebrew: -# "ISO-8859-8" - Visual Hebrew -# "windows-1255" - Logical Hebrew -# "ISO-8859-8-I" - Logical Hebrew -# "x-mac-hebrew" - ?? Logical Hebrew ?? -# -# Both "ISO" charsets use a completely identical set of code points, whereas -# "windows-1255" and "x-mac-hebrew" are two different proper supersets of -# these code points. windows-1255 defines additional characters in the range -# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific -# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. -# x-mac-hebrew defines similar additional code points but with a different -# mapping. -# -# As far as an average Hebrew text with no diacritics is concerned, all four -# charsets are identical with respect to code points. Meaning that for the -# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters -# (including final letters). -# -# The dominant difference between these charsets is their directionality. -# "Visual" directionality means that the text is ordered as if the renderer is -# not aware of a BIDI rendering algorithm. The renderer sees the text and -# draws it from left to right. The text itself when ordered naturally is read -# backwards. A buffer of Visual Hebrew generally looks like so: -# "[last word of first line spelled backwards] [whole line ordered backwards -# and spelled backwards] [first word of first line spelled backwards] -# [end of line] [last word of second line] ... etc' " -# adding punctuation marks, numbers and English text to visual text is -# naturally also "visual" and from left to right. -# -# "Logical" directionality means the text is ordered "naturally" according to -# the order it is read. It is the responsibility of the renderer to display -# the text from right to left. A BIDI algorithm is used to place general -# punctuation marks, numbers and English text in the text. -# -# Texts in x-mac-hebrew are almost impossible to find on the Internet. From -# what little evidence I could find, it seems that its general directionality -# is Logical. -# -# To sum up all of the above, the Hebrew probing mechanism knows about two -# charsets: -# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are -# backwards while line order is natural. For charset recognition purposes -# the line order is unimportant (In fact, for this implementation, even -# word order is unimportant). -# Logical Hebrew - "windows-1255" - normal, naturally ordered text. -# -# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be -# specifically identified. -# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew -# that contain special punctuation marks or diacritics is displayed with -# some unconverted characters showing as question marks. This problem might -# be corrected using another model prober for x-mac-hebrew. Due to the fact -# that x-mac-hebrew texts are so rare, writing another model prober isn't -# worth the effort and performance hit. -# -#### The Prober #### -# -# The prober is divided between two SBCharSetProbers and a HebrewProber, -# all of which are managed, created, fed data, inquired and deleted by the -# SBCSGroupProber. The two SBCharSetProbers identify that the text is in -# fact some kind of Hebrew, Logical or Visual. The final decision about which -# one is it is made by the HebrewProber by combining final-letter scores -# with the scores of the two SBCharSetProbers to produce a final answer. -# -# The SBCSGroupProber is responsible for stripping the original text of HTML -# tags, English characters, numbers, low-ASCII punctuation characters, spaces -# and new lines. It reduces any sequence of such characters to a single space. -# The buffer fed to each prober in the SBCS group prober is pure text in -# high-ASCII. -# The two SBCharSetProbers (model probers) share the same language model: -# Win1255Model. -# The first SBCharSetProber uses the model normally as any other -# SBCharSetProber does, to recognize windows-1255, upon which this model was -# built. The second SBCharSetProber is told to make the pair-of-letter -# lookup in the language model backwards. This in practice exactly simulates -# a visual Hebrew model using the windows-1255 logical Hebrew model. -# -# The HebrewProber is not using any language model. All it does is look for -# final-letter evidence suggesting the text is either logical Hebrew or visual -# Hebrew. Disjointed from the model probers, the results of the HebrewProber -# alone are meaningless. HebrewProber always returns 0.00 as confidence -# since it never identifies a charset by itself. Instead, the pointer to the -# HebrewProber is passed to the model probers as a helper "Name Prober". -# When the Group prober receives a positive identification from any prober, -# it asks for the name of the charset identified. If the prober queried is a -# Hebrew model prober, the model prober forwards the call to the -# HebrewProber to make the final decision. In the HebrewProber, the -# decision is made according to the final-letters scores maintained and Both -# model probers scores. The answer is returned in the form of the name of the -# charset identified, either "windows-1255" or "ISO-8859-8". - - -class HebrewProber(CharSetProber): - SPACE = 0x20 - # windows-1255 / ISO-8859-8 code points of interest - FINAL_KAF = 0xEA - NORMAL_KAF = 0xEB - FINAL_MEM = 0xED - NORMAL_MEM = 0xEE - FINAL_NUN = 0xEF - NORMAL_NUN = 0xF0 - FINAL_PE = 0xF3 - NORMAL_PE = 0xF4 - FINAL_TSADI = 0xF5 - NORMAL_TSADI = 0xF6 - - # Minimum Visual vs Logical final letter score difference. - # If the difference is below this, don't rely solely on the final letter score - # distance. - MIN_FINAL_CHAR_DISTANCE = 5 - - # Minimum Visual vs Logical model score difference. - # If the difference is below this, don't rely at all on the model score - # distance. - MIN_MODEL_DISTANCE = 0.01 - - VISUAL_HEBREW_NAME = "ISO-8859-8" - LOGICAL_HEBREW_NAME = "windows-1255" - - def __init__(self) -> None: - super().__init__() - self._final_char_logical_score = 0 - self._final_char_visual_score = 0 - self._prev = self.SPACE - self._before_prev = self.SPACE - self._logical_prober: Optional[SingleByteCharSetProber] = None - self._visual_prober: Optional[SingleByteCharSetProber] = None - self.reset() - - def reset(self) -> None: - self._final_char_logical_score = 0 - self._final_char_visual_score = 0 - # The two last characters seen in the previous buffer, - # mPrev and mBeforePrev are initialized to space in order to simulate - # a word delimiter at the beginning of the data - self._prev = self.SPACE - self._before_prev = self.SPACE - # These probers are owned by the group prober. - - def set_model_probers( - self, - logical_prober: SingleByteCharSetProber, - visual_prober: SingleByteCharSetProber, - ) -> None: - self._logical_prober = logical_prober - self._visual_prober = visual_prober - - def is_final(self, c: int) -> bool: - return c in [ - self.FINAL_KAF, - self.FINAL_MEM, - self.FINAL_NUN, - self.FINAL_PE, - self.FINAL_TSADI, - ] - - def is_non_final(self, c: int) -> bool: - # The normal Tsadi is not a good Non-Final letter due to words like - # 'lechotet' (to chat) containing an apostrophe after the tsadi. This - # apostrophe is converted to a space in FilterWithoutEnglishLetters - # causing the Non-Final tsadi to appear at an end of a word even - # though this is not the case in the original text. - # The letters Pe and Kaf rarely display a related behavior of not being - # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' - # for example legally end with a Non-Final Pe or Kaf. However, the - # benefit of these letters as Non-Final letters outweighs the damage - # since these words are quite rare. - return c in [self.NORMAL_KAF, self.NORMAL_MEM, self.NORMAL_NUN, self.NORMAL_PE] - - def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: - # Final letter analysis for logical-visual decision. - # Look for evidence that the received buffer is either logical Hebrew - # or visual Hebrew. - # The following cases are checked: - # 1) A word longer than 1 letter, ending with a final letter. This is - # an indication that the text is laid out "naturally" since the - # final letter really appears at the end. +1 for logical score. - # 2) A word longer than 1 letter, ending with a Non-Final letter. In - # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, - # should not end with the Non-Final form of that letter. Exceptions - # to this rule are mentioned above in isNonFinal(). This is an - # indication that the text is laid out backwards. +1 for visual - # score - # 3) A word longer than 1 letter, starting with a final letter. Final - # letters should not appear at the beginning of a word. This is an - # indication that the text is laid out backwards. +1 for visual - # score. - # - # The visual score and logical score are accumulated throughout the - # text and are finally checked against each other in GetCharSetName(). - # No checking for final letters in the middle of words is done since - # that case is not an indication for either Logical or Visual text. - # - # We automatically filter out all 7-bit characters (replace them with - # spaces) so the word boundary detection works properly. [MAP] - - if self.state == ProbingState.NOT_ME: - # Both model probers say it's not them. No reason to continue. - return ProbingState.NOT_ME - - byte_str = self.filter_high_byte_only(byte_str) - - for cur in byte_str: - if cur == self.SPACE: - # We stand on a space - a word just ended - if self._before_prev != self.SPACE: - # next-to-last char was not a space so self._prev is not a - # 1 letter word - if self.is_final(self._prev): - # case (1) [-2:not space][-1:final letter][cur:space] - self._final_char_logical_score += 1 - elif self.is_non_final(self._prev): - # case (2) [-2:not space][-1:Non-Final letter][ - # cur:space] - self._final_char_visual_score += 1 - else: - # Not standing on a space - if ( - (self._before_prev == self.SPACE) - and (self.is_final(self._prev)) - and (cur != self.SPACE) - ): - # case (3) [-2:space][-1:final letter][cur:not space] - self._final_char_visual_score += 1 - self._before_prev = self._prev - self._prev = cur - - # Forever detecting, till the end or until both model probers return - # ProbingState.NOT_ME (handled above) - return ProbingState.DETECTING - - @property - def charset_name(self) -> str: - assert self._logical_prober is not None - assert self._visual_prober is not None - - # Make the decision: is it Logical or Visual? - # If the final letter score distance is dominant enough, rely on it. - finalsub = self._final_char_logical_score - self._final_char_visual_score - if finalsub >= self.MIN_FINAL_CHAR_DISTANCE: - return self.LOGICAL_HEBREW_NAME - if finalsub <= -self.MIN_FINAL_CHAR_DISTANCE: - return self.VISUAL_HEBREW_NAME - - # It's not dominant enough, try to rely on the model scores instead. - modelsub = ( - self._logical_prober.get_confidence() - self._visual_prober.get_confidence() - ) - if modelsub > self.MIN_MODEL_DISTANCE: - return self.LOGICAL_HEBREW_NAME - if modelsub < -self.MIN_MODEL_DISTANCE: - return self.VISUAL_HEBREW_NAME - - # Still no good, back to final letter distance, maybe it'll save the - # day. - if finalsub < 0.0: - return self.VISUAL_HEBREW_NAME - - # (finalsub > 0 - Logical) or (don't know what to do) default to - # Logical. - return self.LOGICAL_HEBREW_NAME - - @property - def language(self) -> str: - return "Hebrew" - - @property - def state(self) -> ProbingState: - assert self._logical_prober is not None - assert self._visual_prober is not None - - # Remain active as long as any of the model probers are active. - if (self._logical_prober.state == ProbingState.NOT_ME) and ( - self._visual_prober.state == ProbingState.NOT_ME - ): - return ProbingState.NOT_ME - return ProbingState.DETECTING diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/jisfreq.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/jisfreq.py deleted file mode 100644 index 3293576..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/jisfreq.py +++ /dev/null @@ -1,325 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# Sampling from about 20M text materials include literature and computer technology -# -# Japanese frequency table, applied to both S-JIS and EUC-JP -# They are sorted in order. - -# 128 --> 0.77094 -# 256 --> 0.85710 -# 512 --> 0.92635 -# 1024 --> 0.97130 -# 2048 --> 0.99431 -# -# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 -# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 -# -# Typical Distribution Ratio, 25% of IDR - -JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0 - -# Char to FreqOrder table , -JIS_TABLE_SIZE = 4368 - -# fmt: off -JIS_CHAR_TO_FREQ_ORDER = ( - 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16 -3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32 -1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48 -2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64 -2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80 -5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96 -1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112 -5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128 -5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144 -5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160 -5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176 -5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192 -5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208 -1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224 -1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240 -1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256 -2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272 -3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288 -3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304 - 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320 - 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336 -1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352 - 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368 -5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384 - 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400 - 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416 - 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432 - 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448 - 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464 -5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480 -5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496 -5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512 -4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528 -5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544 -5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560 -5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576 -5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592 -5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608 -5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624 -5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640 -5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656 -5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672 -3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688 -5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704 -5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720 -5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736 -5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752 -5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768 -5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784 -5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800 -5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816 -5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832 -5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848 -5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864 -5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880 -5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896 -5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912 -5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928 -5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944 -5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960 -5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976 -5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992 -5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008 -5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024 -5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040 -5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056 -5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072 -5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088 -5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104 -5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120 -5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136 -5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152 -5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168 -5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184 -5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200 -5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216 -5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232 -5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248 -5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264 -5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280 -5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296 -6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312 -6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328 -6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344 -6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360 -6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376 -6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392 -6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408 -6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424 -4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440 - 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456 - 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472 -1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488 -1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504 - 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520 -3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536 -3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552 - 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568 -3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584 -3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600 - 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616 -2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632 - 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648 -3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664 -1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680 - 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696 -1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712 - 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728 -2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744 -2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760 -2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776 -2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792 -1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808 -1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824 -1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840 -1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856 -2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872 -1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888 -2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904 -1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920 -1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936 -1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952 -1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968 -1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984 -1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000 - 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016 - 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032 -1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048 -2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064 -2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080 -2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096 -3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112 -3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128 - 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144 -3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160 -1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176 - 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192 -2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208 -1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224 - 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240 -3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256 -4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272 -2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288 -1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304 -2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320 -1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336 - 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352 - 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368 -1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384 -2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400 -2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416 -2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432 -3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448 -1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464 -2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480 - 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496 - 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512 - 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528 -1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544 -2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560 - 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576 -1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592 -1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608 - 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624 -1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640 -1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656 -1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672 - 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688 -2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704 - 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720 -2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736 -3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752 -2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768 -1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784 -6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800 -1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816 -2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832 -1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848 - 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864 - 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880 -3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896 -3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912 -1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928 -1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944 -1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960 -1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976 - 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992 - 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008 -2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024 - 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040 -3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056 -2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072 - 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088 -1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104 -2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120 - 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136 -1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152 - 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168 -4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184 -2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200 -1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216 - 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232 -1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248 -2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264 - 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280 -6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296 -1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312 -1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328 -2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344 -3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360 - 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376 -3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392 -1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408 - 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424 -1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440 - 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456 -3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472 - 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488 -2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504 - 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520 -4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536 -2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552 -1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568 -1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584 -1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600 - 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616 -1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632 -3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648 -1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664 -3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680 - 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696 - 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712 - 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728 -2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744 -1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760 - 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776 -1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792 - 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808 -1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824 - 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840 - 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856 - 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872 -1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888 -1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904 -2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920 -4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936 - 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952 -1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968 - 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984 -1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000 -3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016 -1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032 -2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048 -2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064 -1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080 -1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096 -2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112 - 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128 -2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144 -1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160 -1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176 -1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192 -1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208 -3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224 -2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240 -2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256 - 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272 -3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288 -3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304 -1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320 -2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336 -1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352 -2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512 -) -# fmt: on diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/johabfreq.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/johabfreq.py deleted file mode 100644 index c129699..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/johabfreq.py +++ /dev/null @@ -1,2382 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# The frequency data itself is the same as euc-kr. -# This is just a mapping table to euc-kr. - -JOHAB_TO_EUCKR_ORDER_TABLE = { - 0x8861: 0, - 0x8862: 1, - 0x8865: 2, - 0x8868: 3, - 0x8869: 4, - 0x886A: 5, - 0x886B: 6, - 0x8871: 7, - 0x8873: 8, - 0x8874: 9, - 0x8875: 10, - 0x8876: 11, - 0x8877: 12, - 0x8878: 13, - 0x8879: 14, - 0x887B: 15, - 0x887C: 16, - 0x887D: 17, - 0x8881: 18, - 0x8882: 19, - 0x8885: 20, - 0x8889: 21, - 0x8891: 22, - 0x8893: 23, - 0x8895: 24, - 0x8896: 25, - 0x8897: 26, - 0x88A1: 27, - 0x88A2: 28, - 0x88A5: 29, - 0x88A9: 30, - 0x88B5: 31, - 0x88B7: 32, - 0x88C1: 33, - 0x88C5: 34, - 0x88C9: 35, - 0x88E1: 36, - 0x88E2: 37, - 0x88E5: 38, - 0x88E8: 39, - 0x88E9: 40, - 0x88EB: 41, - 0x88F1: 42, - 0x88F3: 43, - 0x88F5: 44, - 0x88F6: 45, - 0x88F7: 46, - 0x88F8: 47, - 0x88FB: 48, - 0x88FC: 49, - 0x88FD: 50, - 0x8941: 51, - 0x8945: 52, - 0x8949: 53, - 0x8951: 54, - 0x8953: 55, - 0x8955: 56, - 0x8956: 57, - 0x8957: 58, - 0x8961: 59, - 0x8962: 60, - 0x8963: 61, - 0x8965: 62, - 0x8968: 63, - 0x8969: 64, - 0x8971: 65, - 0x8973: 66, - 0x8975: 67, - 0x8976: 68, - 0x8977: 69, - 0x897B: 70, - 0x8981: 71, - 0x8985: 72, - 0x8989: 73, - 0x8993: 74, - 0x8995: 75, - 0x89A1: 76, - 0x89A2: 77, - 0x89A5: 78, - 0x89A8: 79, - 0x89A9: 80, - 0x89AB: 81, - 0x89AD: 82, - 0x89B0: 83, - 0x89B1: 84, - 0x89B3: 85, - 0x89B5: 86, - 0x89B7: 87, - 0x89B8: 88, - 0x89C1: 89, - 0x89C2: 90, - 0x89C5: 91, - 0x89C9: 92, - 0x89CB: 93, - 0x89D1: 94, - 0x89D3: 95, - 0x89D5: 96, - 0x89D7: 97, - 0x89E1: 98, - 0x89E5: 99, - 0x89E9: 100, - 0x89F3: 101, - 0x89F6: 102, - 0x89F7: 103, - 0x8A41: 104, - 0x8A42: 105, - 0x8A45: 106, - 0x8A49: 107, - 0x8A51: 108, - 0x8A53: 109, - 0x8A55: 110, - 0x8A57: 111, - 0x8A61: 112, - 0x8A65: 113, - 0x8A69: 114, - 0x8A73: 115, - 0x8A75: 116, - 0x8A81: 117, - 0x8A82: 118, - 0x8A85: 119, - 0x8A88: 120, - 0x8A89: 121, - 0x8A8A: 122, - 0x8A8B: 123, - 0x8A90: 124, - 0x8A91: 125, - 0x8A93: 126, - 0x8A95: 127, - 0x8A97: 128, - 0x8A98: 129, - 0x8AA1: 130, - 0x8AA2: 131, - 0x8AA5: 132, - 0x8AA9: 133, - 0x8AB6: 134, - 0x8AB7: 135, - 0x8AC1: 136, - 0x8AD5: 137, - 0x8AE1: 138, - 0x8AE2: 139, - 0x8AE5: 140, - 0x8AE9: 141, - 0x8AF1: 142, - 0x8AF3: 143, - 0x8AF5: 144, - 0x8B41: 145, - 0x8B45: 146, - 0x8B49: 147, - 0x8B61: 148, - 0x8B62: 149, - 0x8B65: 150, - 0x8B68: 151, - 0x8B69: 152, - 0x8B6A: 153, - 0x8B71: 154, - 0x8B73: 155, - 0x8B75: 156, - 0x8B77: 157, - 0x8B81: 158, - 0x8BA1: 159, - 0x8BA2: 160, - 0x8BA5: 161, - 0x8BA8: 162, - 0x8BA9: 163, - 0x8BAB: 164, - 0x8BB1: 165, - 0x8BB3: 166, - 0x8BB5: 167, - 0x8BB7: 168, - 0x8BB8: 169, - 0x8BBC: 170, - 0x8C61: 171, - 0x8C62: 172, - 0x8C63: 173, - 0x8C65: 174, - 0x8C69: 175, - 0x8C6B: 176, - 0x8C71: 177, - 0x8C73: 178, - 0x8C75: 179, - 0x8C76: 180, - 0x8C77: 181, - 0x8C7B: 182, - 0x8C81: 183, - 0x8C82: 184, - 0x8C85: 185, - 0x8C89: 186, - 0x8C91: 187, - 0x8C93: 188, - 0x8C95: 189, - 0x8C96: 190, - 0x8C97: 191, - 0x8CA1: 192, - 0x8CA2: 193, - 0x8CA9: 194, - 0x8CE1: 195, - 0x8CE2: 196, - 0x8CE3: 197, - 0x8CE5: 198, - 0x8CE9: 199, - 0x8CF1: 200, - 0x8CF3: 201, - 0x8CF5: 202, - 0x8CF6: 203, - 0x8CF7: 204, - 0x8D41: 205, - 0x8D42: 206, - 0x8D45: 207, - 0x8D51: 208, - 0x8D55: 209, - 0x8D57: 210, - 0x8D61: 211, - 0x8D65: 212, - 0x8D69: 213, - 0x8D75: 214, - 0x8D76: 215, - 0x8D7B: 216, - 0x8D81: 217, - 0x8DA1: 218, - 0x8DA2: 219, - 0x8DA5: 220, - 0x8DA7: 221, - 0x8DA9: 222, - 0x8DB1: 223, - 0x8DB3: 224, - 0x8DB5: 225, - 0x8DB7: 226, - 0x8DB8: 227, - 0x8DB9: 228, - 0x8DC1: 229, - 0x8DC2: 230, - 0x8DC9: 231, - 0x8DD6: 232, - 0x8DD7: 233, - 0x8DE1: 234, - 0x8DE2: 235, - 0x8DF7: 236, - 0x8E41: 237, - 0x8E45: 238, - 0x8E49: 239, - 0x8E51: 240, - 0x8E53: 241, - 0x8E57: 242, - 0x8E61: 243, - 0x8E81: 244, - 0x8E82: 245, - 0x8E85: 246, - 0x8E89: 247, - 0x8E90: 248, - 0x8E91: 249, - 0x8E93: 250, - 0x8E95: 251, - 0x8E97: 252, - 0x8E98: 253, - 0x8EA1: 254, - 0x8EA9: 255, - 0x8EB6: 256, - 0x8EB7: 257, - 0x8EC1: 258, - 0x8EC2: 259, - 0x8EC5: 260, - 0x8EC9: 261, - 0x8ED1: 262, - 0x8ED3: 263, - 0x8ED6: 264, - 0x8EE1: 265, - 0x8EE5: 266, - 0x8EE9: 267, - 0x8EF1: 268, - 0x8EF3: 269, - 0x8F41: 270, - 0x8F61: 271, - 0x8F62: 272, - 0x8F65: 273, - 0x8F67: 274, - 0x8F69: 275, - 0x8F6B: 276, - 0x8F70: 277, - 0x8F71: 278, - 0x8F73: 279, - 0x8F75: 280, - 0x8F77: 281, - 0x8F7B: 282, - 0x8FA1: 283, - 0x8FA2: 284, - 0x8FA5: 285, - 0x8FA9: 286, - 0x8FB1: 287, - 0x8FB3: 288, - 0x8FB5: 289, - 0x8FB7: 290, - 0x9061: 291, - 0x9062: 292, - 0x9063: 293, - 0x9065: 294, - 0x9068: 295, - 0x9069: 296, - 0x906A: 297, - 0x906B: 298, - 0x9071: 299, - 0x9073: 300, - 0x9075: 301, - 0x9076: 302, - 0x9077: 303, - 0x9078: 304, - 0x9079: 305, - 0x907B: 306, - 0x907D: 307, - 0x9081: 308, - 0x9082: 309, - 0x9085: 310, - 0x9089: 311, - 0x9091: 312, - 0x9093: 313, - 0x9095: 314, - 0x9096: 315, - 0x9097: 316, - 0x90A1: 317, - 0x90A2: 318, - 0x90A5: 319, - 0x90A9: 320, - 0x90B1: 321, - 0x90B7: 322, - 0x90E1: 323, - 0x90E2: 324, - 0x90E4: 325, - 0x90E5: 326, - 0x90E9: 327, - 0x90EB: 328, - 0x90EC: 329, - 0x90F1: 330, - 0x90F3: 331, - 0x90F5: 332, - 0x90F6: 333, - 0x90F7: 334, - 0x90FD: 335, - 0x9141: 336, - 0x9142: 337, - 0x9145: 338, - 0x9149: 339, - 0x9151: 340, - 0x9153: 341, - 0x9155: 342, - 0x9156: 343, - 0x9157: 344, - 0x9161: 345, - 0x9162: 346, - 0x9165: 347, - 0x9169: 348, - 0x9171: 349, - 0x9173: 350, - 0x9176: 351, - 0x9177: 352, - 0x917A: 353, - 0x9181: 354, - 0x9185: 355, - 0x91A1: 356, - 0x91A2: 357, - 0x91A5: 358, - 0x91A9: 359, - 0x91AB: 360, - 0x91B1: 361, - 0x91B3: 362, - 0x91B5: 363, - 0x91B7: 364, - 0x91BC: 365, - 0x91BD: 366, - 0x91C1: 367, - 0x91C5: 368, - 0x91C9: 369, - 0x91D6: 370, - 0x9241: 371, - 0x9245: 372, - 0x9249: 373, - 0x9251: 374, - 0x9253: 375, - 0x9255: 376, - 0x9261: 377, - 0x9262: 378, - 0x9265: 379, - 0x9269: 380, - 0x9273: 381, - 0x9275: 382, - 0x9277: 383, - 0x9281: 384, - 0x9282: 385, - 0x9285: 386, - 0x9288: 387, - 0x9289: 388, - 0x9291: 389, - 0x9293: 390, - 0x9295: 391, - 0x9297: 392, - 0x92A1: 393, - 0x92B6: 394, - 0x92C1: 395, - 0x92E1: 396, - 0x92E5: 397, - 0x92E9: 398, - 0x92F1: 399, - 0x92F3: 400, - 0x9341: 401, - 0x9342: 402, - 0x9349: 403, - 0x9351: 404, - 0x9353: 405, - 0x9357: 406, - 0x9361: 407, - 0x9362: 408, - 0x9365: 409, - 0x9369: 410, - 0x936A: 411, - 0x936B: 412, - 0x9371: 413, - 0x9373: 414, - 0x9375: 415, - 0x9377: 416, - 0x9378: 417, - 0x937C: 418, - 0x9381: 419, - 0x9385: 420, - 0x9389: 421, - 0x93A1: 422, - 0x93A2: 423, - 0x93A5: 424, - 0x93A9: 425, - 0x93AB: 426, - 0x93B1: 427, - 0x93B3: 428, - 0x93B5: 429, - 0x93B7: 430, - 0x93BC: 431, - 0x9461: 432, - 0x9462: 433, - 0x9463: 434, - 0x9465: 435, - 0x9468: 436, - 0x9469: 437, - 0x946A: 438, - 0x946B: 439, - 0x946C: 440, - 0x9470: 441, - 0x9471: 442, - 0x9473: 443, - 0x9475: 444, - 0x9476: 445, - 0x9477: 446, - 0x9478: 447, - 0x9479: 448, - 0x947D: 449, - 0x9481: 450, - 0x9482: 451, - 0x9485: 452, - 0x9489: 453, - 0x9491: 454, - 0x9493: 455, - 0x9495: 456, - 0x9496: 457, - 0x9497: 458, - 0x94A1: 459, - 0x94E1: 460, - 0x94E2: 461, - 0x94E3: 462, - 0x94E5: 463, - 0x94E8: 464, - 0x94E9: 465, - 0x94EB: 466, - 0x94EC: 467, - 0x94F1: 468, - 0x94F3: 469, - 0x94F5: 470, - 0x94F7: 471, - 0x94F9: 472, - 0x94FC: 473, - 0x9541: 474, - 0x9542: 475, - 0x9545: 476, - 0x9549: 477, - 0x9551: 478, - 0x9553: 479, - 0x9555: 480, - 0x9556: 481, - 0x9557: 482, - 0x9561: 483, - 0x9565: 484, - 0x9569: 485, - 0x9576: 486, - 0x9577: 487, - 0x9581: 488, - 0x9585: 489, - 0x95A1: 490, - 0x95A2: 491, - 0x95A5: 492, - 0x95A8: 493, - 0x95A9: 494, - 0x95AB: 495, - 0x95AD: 496, - 0x95B1: 497, - 0x95B3: 498, - 0x95B5: 499, - 0x95B7: 500, - 0x95B9: 501, - 0x95BB: 502, - 0x95C1: 503, - 0x95C5: 504, - 0x95C9: 505, - 0x95E1: 506, - 0x95F6: 507, - 0x9641: 508, - 0x9645: 509, - 0x9649: 510, - 0x9651: 511, - 0x9653: 512, - 0x9655: 513, - 0x9661: 514, - 0x9681: 515, - 0x9682: 516, - 0x9685: 517, - 0x9689: 518, - 0x9691: 519, - 0x9693: 520, - 0x9695: 521, - 0x9697: 522, - 0x96A1: 523, - 0x96B6: 524, - 0x96C1: 525, - 0x96D7: 526, - 0x96E1: 527, - 0x96E5: 528, - 0x96E9: 529, - 0x96F3: 530, - 0x96F5: 531, - 0x96F7: 532, - 0x9741: 533, - 0x9745: 534, - 0x9749: 535, - 0x9751: 536, - 0x9757: 537, - 0x9761: 538, - 0x9762: 539, - 0x9765: 540, - 0x9768: 541, - 0x9769: 542, - 0x976B: 543, - 0x9771: 544, - 0x9773: 545, - 0x9775: 546, - 0x9777: 547, - 0x9781: 548, - 0x97A1: 549, - 0x97A2: 550, - 0x97A5: 551, - 0x97A8: 552, - 0x97A9: 553, - 0x97B1: 554, - 0x97B3: 555, - 0x97B5: 556, - 0x97B6: 557, - 0x97B7: 558, - 0x97B8: 559, - 0x9861: 560, - 0x9862: 561, - 0x9865: 562, - 0x9869: 563, - 0x9871: 564, - 0x9873: 565, - 0x9875: 566, - 0x9876: 567, - 0x9877: 568, - 0x987D: 569, - 0x9881: 570, - 0x9882: 571, - 0x9885: 572, - 0x9889: 573, - 0x9891: 574, - 0x9893: 575, - 0x9895: 576, - 0x9896: 577, - 0x9897: 578, - 0x98E1: 579, - 0x98E2: 580, - 0x98E5: 581, - 0x98E9: 582, - 0x98EB: 583, - 0x98EC: 584, - 0x98F1: 585, - 0x98F3: 586, - 0x98F5: 587, - 0x98F6: 588, - 0x98F7: 589, - 0x98FD: 590, - 0x9941: 591, - 0x9942: 592, - 0x9945: 593, - 0x9949: 594, - 0x9951: 595, - 0x9953: 596, - 0x9955: 597, - 0x9956: 598, - 0x9957: 599, - 0x9961: 600, - 0x9976: 601, - 0x99A1: 602, - 0x99A2: 603, - 0x99A5: 604, - 0x99A9: 605, - 0x99B7: 606, - 0x99C1: 607, - 0x99C9: 608, - 0x99E1: 609, - 0x9A41: 610, - 0x9A45: 611, - 0x9A81: 612, - 0x9A82: 613, - 0x9A85: 614, - 0x9A89: 615, - 0x9A90: 616, - 0x9A91: 617, - 0x9A97: 618, - 0x9AC1: 619, - 0x9AE1: 620, - 0x9AE5: 621, - 0x9AE9: 622, - 0x9AF1: 623, - 0x9AF3: 624, - 0x9AF7: 625, - 0x9B61: 626, - 0x9B62: 627, - 0x9B65: 628, - 0x9B68: 629, - 0x9B69: 630, - 0x9B71: 631, - 0x9B73: 632, - 0x9B75: 633, - 0x9B81: 634, - 0x9B85: 635, - 0x9B89: 636, - 0x9B91: 637, - 0x9B93: 638, - 0x9BA1: 639, - 0x9BA5: 640, - 0x9BA9: 641, - 0x9BB1: 642, - 0x9BB3: 643, - 0x9BB5: 644, - 0x9BB7: 645, - 0x9C61: 646, - 0x9C62: 647, - 0x9C65: 648, - 0x9C69: 649, - 0x9C71: 650, - 0x9C73: 651, - 0x9C75: 652, - 0x9C76: 653, - 0x9C77: 654, - 0x9C78: 655, - 0x9C7C: 656, - 0x9C7D: 657, - 0x9C81: 658, - 0x9C82: 659, - 0x9C85: 660, - 0x9C89: 661, - 0x9C91: 662, - 0x9C93: 663, - 0x9C95: 664, - 0x9C96: 665, - 0x9C97: 666, - 0x9CA1: 667, - 0x9CA2: 668, - 0x9CA5: 669, - 0x9CB5: 670, - 0x9CB7: 671, - 0x9CE1: 672, - 0x9CE2: 673, - 0x9CE5: 674, - 0x9CE9: 675, - 0x9CF1: 676, - 0x9CF3: 677, - 0x9CF5: 678, - 0x9CF6: 679, - 0x9CF7: 680, - 0x9CFD: 681, - 0x9D41: 682, - 0x9D42: 683, - 0x9D45: 684, - 0x9D49: 685, - 0x9D51: 686, - 0x9D53: 687, - 0x9D55: 688, - 0x9D57: 689, - 0x9D61: 690, - 0x9D62: 691, - 0x9D65: 692, - 0x9D69: 693, - 0x9D71: 694, - 0x9D73: 695, - 0x9D75: 696, - 0x9D76: 697, - 0x9D77: 698, - 0x9D81: 699, - 0x9D85: 700, - 0x9D93: 701, - 0x9D95: 702, - 0x9DA1: 703, - 0x9DA2: 704, - 0x9DA5: 705, - 0x9DA9: 706, - 0x9DB1: 707, - 0x9DB3: 708, - 0x9DB5: 709, - 0x9DB7: 710, - 0x9DC1: 711, - 0x9DC5: 712, - 0x9DD7: 713, - 0x9DF6: 714, - 0x9E41: 715, - 0x9E45: 716, - 0x9E49: 717, - 0x9E51: 718, - 0x9E53: 719, - 0x9E55: 720, - 0x9E57: 721, - 0x9E61: 722, - 0x9E65: 723, - 0x9E69: 724, - 0x9E73: 725, - 0x9E75: 726, - 0x9E77: 727, - 0x9E81: 728, - 0x9E82: 729, - 0x9E85: 730, - 0x9E89: 731, - 0x9E91: 732, - 0x9E93: 733, - 0x9E95: 734, - 0x9E97: 735, - 0x9EA1: 736, - 0x9EB6: 737, - 0x9EC1: 738, - 0x9EE1: 739, - 0x9EE2: 740, - 0x9EE5: 741, - 0x9EE9: 742, - 0x9EF1: 743, - 0x9EF5: 744, - 0x9EF7: 745, - 0x9F41: 746, - 0x9F42: 747, - 0x9F45: 748, - 0x9F49: 749, - 0x9F51: 750, - 0x9F53: 751, - 0x9F55: 752, - 0x9F57: 753, - 0x9F61: 754, - 0x9F62: 755, - 0x9F65: 756, - 0x9F69: 757, - 0x9F71: 758, - 0x9F73: 759, - 0x9F75: 760, - 0x9F77: 761, - 0x9F78: 762, - 0x9F7B: 763, - 0x9F7C: 764, - 0x9FA1: 765, - 0x9FA2: 766, - 0x9FA5: 767, - 0x9FA9: 768, - 0x9FB1: 769, - 0x9FB3: 770, - 0x9FB5: 771, - 0x9FB7: 772, - 0xA061: 773, - 0xA062: 774, - 0xA065: 775, - 0xA067: 776, - 0xA068: 777, - 0xA069: 778, - 0xA06A: 779, - 0xA06B: 780, - 0xA071: 781, - 0xA073: 782, - 0xA075: 783, - 0xA077: 784, - 0xA078: 785, - 0xA07B: 786, - 0xA07D: 787, - 0xA081: 788, - 0xA082: 789, - 0xA085: 790, - 0xA089: 791, - 0xA091: 792, - 0xA093: 793, - 0xA095: 794, - 0xA096: 795, - 0xA097: 796, - 0xA098: 797, - 0xA0A1: 798, - 0xA0A2: 799, - 0xA0A9: 800, - 0xA0B7: 801, - 0xA0E1: 802, - 0xA0E2: 803, - 0xA0E5: 804, - 0xA0E9: 805, - 0xA0EB: 806, - 0xA0F1: 807, - 0xA0F3: 808, - 0xA0F5: 809, - 0xA0F7: 810, - 0xA0F8: 811, - 0xA0FD: 812, - 0xA141: 813, - 0xA142: 814, - 0xA145: 815, - 0xA149: 816, - 0xA151: 817, - 0xA153: 818, - 0xA155: 819, - 0xA156: 820, - 0xA157: 821, - 0xA161: 822, - 0xA162: 823, - 0xA165: 824, - 0xA169: 825, - 0xA175: 826, - 0xA176: 827, - 0xA177: 828, - 0xA179: 829, - 0xA181: 830, - 0xA1A1: 831, - 0xA1A2: 832, - 0xA1A4: 833, - 0xA1A5: 834, - 0xA1A9: 835, - 0xA1AB: 836, - 0xA1B1: 837, - 0xA1B3: 838, - 0xA1B5: 839, - 0xA1B7: 840, - 0xA1C1: 841, - 0xA1C5: 842, - 0xA1D6: 843, - 0xA1D7: 844, - 0xA241: 845, - 0xA245: 846, - 0xA249: 847, - 0xA253: 848, - 0xA255: 849, - 0xA257: 850, - 0xA261: 851, - 0xA265: 852, - 0xA269: 853, - 0xA273: 854, - 0xA275: 855, - 0xA281: 856, - 0xA282: 857, - 0xA283: 858, - 0xA285: 859, - 0xA288: 860, - 0xA289: 861, - 0xA28A: 862, - 0xA28B: 863, - 0xA291: 864, - 0xA293: 865, - 0xA295: 866, - 0xA297: 867, - 0xA29B: 868, - 0xA29D: 869, - 0xA2A1: 870, - 0xA2A5: 871, - 0xA2A9: 872, - 0xA2B3: 873, - 0xA2B5: 874, - 0xA2C1: 875, - 0xA2E1: 876, - 0xA2E5: 877, - 0xA2E9: 878, - 0xA341: 879, - 0xA345: 880, - 0xA349: 881, - 0xA351: 882, - 0xA355: 883, - 0xA361: 884, - 0xA365: 885, - 0xA369: 886, - 0xA371: 887, - 0xA375: 888, - 0xA3A1: 889, - 0xA3A2: 890, - 0xA3A5: 891, - 0xA3A8: 892, - 0xA3A9: 893, - 0xA3AB: 894, - 0xA3B1: 895, - 0xA3B3: 896, - 0xA3B5: 897, - 0xA3B6: 898, - 0xA3B7: 899, - 0xA3B9: 900, - 0xA3BB: 901, - 0xA461: 902, - 0xA462: 903, - 0xA463: 904, - 0xA464: 905, - 0xA465: 906, - 0xA468: 907, - 0xA469: 908, - 0xA46A: 909, - 0xA46B: 910, - 0xA46C: 911, - 0xA471: 912, - 0xA473: 913, - 0xA475: 914, - 0xA477: 915, - 0xA47B: 916, - 0xA481: 917, - 0xA482: 918, - 0xA485: 919, - 0xA489: 920, - 0xA491: 921, - 0xA493: 922, - 0xA495: 923, - 0xA496: 924, - 0xA497: 925, - 0xA49B: 926, - 0xA4A1: 927, - 0xA4A2: 928, - 0xA4A5: 929, - 0xA4B3: 930, - 0xA4E1: 931, - 0xA4E2: 932, - 0xA4E5: 933, - 0xA4E8: 934, - 0xA4E9: 935, - 0xA4EB: 936, - 0xA4F1: 937, - 0xA4F3: 938, - 0xA4F5: 939, - 0xA4F7: 940, - 0xA4F8: 941, - 0xA541: 942, - 0xA542: 943, - 0xA545: 944, - 0xA548: 945, - 0xA549: 946, - 0xA551: 947, - 0xA553: 948, - 0xA555: 949, - 0xA556: 950, - 0xA557: 951, - 0xA561: 952, - 0xA562: 953, - 0xA565: 954, - 0xA569: 955, - 0xA573: 956, - 0xA575: 957, - 0xA576: 958, - 0xA577: 959, - 0xA57B: 960, - 0xA581: 961, - 0xA585: 962, - 0xA5A1: 963, - 0xA5A2: 964, - 0xA5A3: 965, - 0xA5A5: 966, - 0xA5A9: 967, - 0xA5B1: 968, - 0xA5B3: 969, - 0xA5B5: 970, - 0xA5B7: 971, - 0xA5C1: 972, - 0xA5C5: 973, - 0xA5D6: 974, - 0xA5E1: 975, - 0xA5F6: 976, - 0xA641: 977, - 0xA642: 978, - 0xA645: 979, - 0xA649: 980, - 0xA651: 981, - 0xA653: 982, - 0xA661: 983, - 0xA665: 984, - 0xA681: 985, - 0xA682: 986, - 0xA685: 987, - 0xA688: 988, - 0xA689: 989, - 0xA68A: 990, - 0xA68B: 991, - 0xA691: 992, - 0xA693: 993, - 0xA695: 994, - 0xA697: 995, - 0xA69B: 996, - 0xA69C: 997, - 0xA6A1: 998, - 0xA6A9: 999, - 0xA6B6: 1000, - 0xA6C1: 1001, - 0xA6E1: 1002, - 0xA6E2: 1003, - 0xA6E5: 1004, - 0xA6E9: 1005, - 0xA6F7: 1006, - 0xA741: 1007, - 0xA745: 1008, - 0xA749: 1009, - 0xA751: 1010, - 0xA755: 1011, - 0xA757: 1012, - 0xA761: 1013, - 0xA762: 1014, - 0xA765: 1015, - 0xA769: 1016, - 0xA771: 1017, - 0xA773: 1018, - 0xA775: 1019, - 0xA7A1: 1020, - 0xA7A2: 1021, - 0xA7A5: 1022, - 0xA7A9: 1023, - 0xA7AB: 1024, - 0xA7B1: 1025, - 0xA7B3: 1026, - 0xA7B5: 1027, - 0xA7B7: 1028, - 0xA7B8: 1029, - 0xA7B9: 1030, - 0xA861: 1031, - 0xA862: 1032, - 0xA865: 1033, - 0xA869: 1034, - 0xA86B: 1035, - 0xA871: 1036, - 0xA873: 1037, - 0xA875: 1038, - 0xA876: 1039, - 0xA877: 1040, - 0xA87D: 1041, - 0xA881: 1042, - 0xA882: 1043, - 0xA885: 1044, - 0xA889: 1045, - 0xA891: 1046, - 0xA893: 1047, - 0xA895: 1048, - 0xA896: 1049, - 0xA897: 1050, - 0xA8A1: 1051, - 0xA8A2: 1052, - 0xA8B1: 1053, - 0xA8E1: 1054, - 0xA8E2: 1055, - 0xA8E5: 1056, - 0xA8E8: 1057, - 0xA8E9: 1058, - 0xA8F1: 1059, - 0xA8F5: 1060, - 0xA8F6: 1061, - 0xA8F7: 1062, - 0xA941: 1063, - 0xA957: 1064, - 0xA961: 1065, - 0xA962: 1066, - 0xA971: 1067, - 0xA973: 1068, - 0xA975: 1069, - 0xA976: 1070, - 0xA977: 1071, - 0xA9A1: 1072, - 0xA9A2: 1073, - 0xA9A5: 1074, - 0xA9A9: 1075, - 0xA9B1: 1076, - 0xA9B3: 1077, - 0xA9B7: 1078, - 0xAA41: 1079, - 0xAA61: 1080, - 0xAA77: 1081, - 0xAA81: 1082, - 0xAA82: 1083, - 0xAA85: 1084, - 0xAA89: 1085, - 0xAA91: 1086, - 0xAA95: 1087, - 0xAA97: 1088, - 0xAB41: 1089, - 0xAB57: 1090, - 0xAB61: 1091, - 0xAB65: 1092, - 0xAB69: 1093, - 0xAB71: 1094, - 0xAB73: 1095, - 0xABA1: 1096, - 0xABA2: 1097, - 0xABA5: 1098, - 0xABA9: 1099, - 0xABB1: 1100, - 0xABB3: 1101, - 0xABB5: 1102, - 0xABB7: 1103, - 0xAC61: 1104, - 0xAC62: 1105, - 0xAC64: 1106, - 0xAC65: 1107, - 0xAC68: 1108, - 0xAC69: 1109, - 0xAC6A: 1110, - 0xAC6B: 1111, - 0xAC71: 1112, - 0xAC73: 1113, - 0xAC75: 1114, - 0xAC76: 1115, - 0xAC77: 1116, - 0xAC7B: 1117, - 0xAC81: 1118, - 0xAC82: 1119, - 0xAC85: 1120, - 0xAC89: 1121, - 0xAC91: 1122, - 0xAC93: 1123, - 0xAC95: 1124, - 0xAC96: 1125, - 0xAC97: 1126, - 0xACA1: 1127, - 0xACA2: 1128, - 0xACA5: 1129, - 0xACA9: 1130, - 0xACB1: 1131, - 0xACB3: 1132, - 0xACB5: 1133, - 0xACB7: 1134, - 0xACC1: 1135, - 0xACC5: 1136, - 0xACC9: 1137, - 0xACD1: 1138, - 0xACD7: 1139, - 0xACE1: 1140, - 0xACE2: 1141, - 0xACE3: 1142, - 0xACE4: 1143, - 0xACE5: 1144, - 0xACE8: 1145, - 0xACE9: 1146, - 0xACEB: 1147, - 0xACEC: 1148, - 0xACF1: 1149, - 0xACF3: 1150, - 0xACF5: 1151, - 0xACF6: 1152, - 0xACF7: 1153, - 0xACFC: 1154, - 0xAD41: 1155, - 0xAD42: 1156, - 0xAD45: 1157, - 0xAD49: 1158, - 0xAD51: 1159, - 0xAD53: 1160, - 0xAD55: 1161, - 0xAD56: 1162, - 0xAD57: 1163, - 0xAD61: 1164, - 0xAD62: 1165, - 0xAD65: 1166, - 0xAD69: 1167, - 0xAD71: 1168, - 0xAD73: 1169, - 0xAD75: 1170, - 0xAD76: 1171, - 0xAD77: 1172, - 0xAD81: 1173, - 0xAD85: 1174, - 0xAD89: 1175, - 0xAD97: 1176, - 0xADA1: 1177, - 0xADA2: 1178, - 0xADA3: 1179, - 0xADA5: 1180, - 0xADA9: 1181, - 0xADAB: 1182, - 0xADB1: 1183, - 0xADB3: 1184, - 0xADB5: 1185, - 0xADB7: 1186, - 0xADBB: 1187, - 0xADC1: 1188, - 0xADC2: 1189, - 0xADC5: 1190, - 0xADC9: 1191, - 0xADD7: 1192, - 0xADE1: 1193, - 0xADE5: 1194, - 0xADE9: 1195, - 0xADF1: 1196, - 0xADF5: 1197, - 0xADF6: 1198, - 0xAE41: 1199, - 0xAE45: 1200, - 0xAE49: 1201, - 0xAE51: 1202, - 0xAE53: 1203, - 0xAE55: 1204, - 0xAE61: 1205, - 0xAE62: 1206, - 0xAE65: 1207, - 0xAE69: 1208, - 0xAE71: 1209, - 0xAE73: 1210, - 0xAE75: 1211, - 0xAE77: 1212, - 0xAE81: 1213, - 0xAE82: 1214, - 0xAE85: 1215, - 0xAE88: 1216, - 0xAE89: 1217, - 0xAE91: 1218, - 0xAE93: 1219, - 0xAE95: 1220, - 0xAE97: 1221, - 0xAE99: 1222, - 0xAE9B: 1223, - 0xAE9C: 1224, - 0xAEA1: 1225, - 0xAEB6: 1226, - 0xAEC1: 1227, - 0xAEC2: 1228, - 0xAEC5: 1229, - 0xAEC9: 1230, - 0xAED1: 1231, - 0xAED7: 1232, - 0xAEE1: 1233, - 0xAEE2: 1234, - 0xAEE5: 1235, - 0xAEE9: 1236, - 0xAEF1: 1237, - 0xAEF3: 1238, - 0xAEF5: 1239, - 0xAEF7: 1240, - 0xAF41: 1241, - 0xAF42: 1242, - 0xAF49: 1243, - 0xAF51: 1244, - 0xAF55: 1245, - 0xAF57: 1246, - 0xAF61: 1247, - 0xAF62: 1248, - 0xAF65: 1249, - 0xAF69: 1250, - 0xAF6A: 1251, - 0xAF71: 1252, - 0xAF73: 1253, - 0xAF75: 1254, - 0xAF77: 1255, - 0xAFA1: 1256, - 0xAFA2: 1257, - 0xAFA5: 1258, - 0xAFA8: 1259, - 0xAFA9: 1260, - 0xAFB0: 1261, - 0xAFB1: 1262, - 0xAFB3: 1263, - 0xAFB5: 1264, - 0xAFB7: 1265, - 0xAFBC: 1266, - 0xB061: 1267, - 0xB062: 1268, - 0xB064: 1269, - 0xB065: 1270, - 0xB069: 1271, - 0xB071: 1272, - 0xB073: 1273, - 0xB076: 1274, - 0xB077: 1275, - 0xB07D: 1276, - 0xB081: 1277, - 0xB082: 1278, - 0xB085: 1279, - 0xB089: 1280, - 0xB091: 1281, - 0xB093: 1282, - 0xB096: 1283, - 0xB097: 1284, - 0xB0B7: 1285, - 0xB0E1: 1286, - 0xB0E2: 1287, - 0xB0E5: 1288, - 0xB0E9: 1289, - 0xB0EB: 1290, - 0xB0F1: 1291, - 0xB0F3: 1292, - 0xB0F6: 1293, - 0xB0F7: 1294, - 0xB141: 1295, - 0xB145: 1296, - 0xB149: 1297, - 0xB185: 1298, - 0xB1A1: 1299, - 0xB1A2: 1300, - 0xB1A5: 1301, - 0xB1A8: 1302, - 0xB1A9: 1303, - 0xB1AB: 1304, - 0xB1B1: 1305, - 0xB1B3: 1306, - 0xB1B7: 1307, - 0xB1C1: 1308, - 0xB1C2: 1309, - 0xB1C5: 1310, - 0xB1D6: 1311, - 0xB1E1: 1312, - 0xB1F6: 1313, - 0xB241: 1314, - 0xB245: 1315, - 0xB249: 1316, - 0xB251: 1317, - 0xB253: 1318, - 0xB261: 1319, - 0xB281: 1320, - 0xB282: 1321, - 0xB285: 1322, - 0xB289: 1323, - 0xB291: 1324, - 0xB293: 1325, - 0xB297: 1326, - 0xB2A1: 1327, - 0xB2B6: 1328, - 0xB2C1: 1329, - 0xB2E1: 1330, - 0xB2E5: 1331, - 0xB357: 1332, - 0xB361: 1333, - 0xB362: 1334, - 0xB365: 1335, - 0xB369: 1336, - 0xB36B: 1337, - 0xB370: 1338, - 0xB371: 1339, - 0xB373: 1340, - 0xB381: 1341, - 0xB385: 1342, - 0xB389: 1343, - 0xB391: 1344, - 0xB3A1: 1345, - 0xB3A2: 1346, - 0xB3A5: 1347, - 0xB3A9: 1348, - 0xB3B1: 1349, - 0xB3B3: 1350, - 0xB3B5: 1351, - 0xB3B7: 1352, - 0xB461: 1353, - 0xB462: 1354, - 0xB465: 1355, - 0xB466: 1356, - 0xB467: 1357, - 0xB469: 1358, - 0xB46A: 1359, - 0xB46B: 1360, - 0xB470: 1361, - 0xB471: 1362, - 0xB473: 1363, - 0xB475: 1364, - 0xB476: 1365, - 0xB477: 1366, - 0xB47B: 1367, - 0xB47C: 1368, - 0xB481: 1369, - 0xB482: 1370, - 0xB485: 1371, - 0xB489: 1372, - 0xB491: 1373, - 0xB493: 1374, - 0xB495: 1375, - 0xB496: 1376, - 0xB497: 1377, - 0xB4A1: 1378, - 0xB4A2: 1379, - 0xB4A5: 1380, - 0xB4A9: 1381, - 0xB4AC: 1382, - 0xB4B1: 1383, - 0xB4B3: 1384, - 0xB4B5: 1385, - 0xB4B7: 1386, - 0xB4BB: 1387, - 0xB4BD: 1388, - 0xB4C1: 1389, - 0xB4C5: 1390, - 0xB4C9: 1391, - 0xB4D3: 1392, - 0xB4E1: 1393, - 0xB4E2: 1394, - 0xB4E5: 1395, - 0xB4E6: 1396, - 0xB4E8: 1397, - 0xB4E9: 1398, - 0xB4EA: 1399, - 0xB4EB: 1400, - 0xB4F1: 1401, - 0xB4F3: 1402, - 0xB4F4: 1403, - 0xB4F5: 1404, - 0xB4F6: 1405, - 0xB4F7: 1406, - 0xB4F8: 1407, - 0xB4FA: 1408, - 0xB4FC: 1409, - 0xB541: 1410, - 0xB542: 1411, - 0xB545: 1412, - 0xB549: 1413, - 0xB551: 1414, - 0xB553: 1415, - 0xB555: 1416, - 0xB557: 1417, - 0xB561: 1418, - 0xB562: 1419, - 0xB563: 1420, - 0xB565: 1421, - 0xB569: 1422, - 0xB56B: 1423, - 0xB56C: 1424, - 0xB571: 1425, - 0xB573: 1426, - 0xB574: 1427, - 0xB575: 1428, - 0xB576: 1429, - 0xB577: 1430, - 0xB57B: 1431, - 0xB57C: 1432, - 0xB57D: 1433, - 0xB581: 1434, - 0xB585: 1435, - 0xB589: 1436, - 0xB591: 1437, - 0xB593: 1438, - 0xB595: 1439, - 0xB596: 1440, - 0xB5A1: 1441, - 0xB5A2: 1442, - 0xB5A5: 1443, - 0xB5A9: 1444, - 0xB5AA: 1445, - 0xB5AB: 1446, - 0xB5AD: 1447, - 0xB5B0: 1448, - 0xB5B1: 1449, - 0xB5B3: 1450, - 0xB5B5: 1451, - 0xB5B7: 1452, - 0xB5B9: 1453, - 0xB5C1: 1454, - 0xB5C2: 1455, - 0xB5C5: 1456, - 0xB5C9: 1457, - 0xB5D1: 1458, - 0xB5D3: 1459, - 0xB5D5: 1460, - 0xB5D6: 1461, - 0xB5D7: 1462, - 0xB5E1: 1463, - 0xB5E2: 1464, - 0xB5E5: 1465, - 0xB5F1: 1466, - 0xB5F5: 1467, - 0xB5F7: 1468, - 0xB641: 1469, - 0xB642: 1470, - 0xB645: 1471, - 0xB649: 1472, - 0xB651: 1473, - 0xB653: 1474, - 0xB655: 1475, - 0xB657: 1476, - 0xB661: 1477, - 0xB662: 1478, - 0xB665: 1479, - 0xB669: 1480, - 0xB671: 1481, - 0xB673: 1482, - 0xB675: 1483, - 0xB677: 1484, - 0xB681: 1485, - 0xB682: 1486, - 0xB685: 1487, - 0xB689: 1488, - 0xB68A: 1489, - 0xB68B: 1490, - 0xB691: 1491, - 0xB693: 1492, - 0xB695: 1493, - 0xB697: 1494, - 0xB6A1: 1495, - 0xB6A2: 1496, - 0xB6A5: 1497, - 0xB6A9: 1498, - 0xB6B1: 1499, - 0xB6B3: 1500, - 0xB6B6: 1501, - 0xB6B7: 1502, - 0xB6C1: 1503, - 0xB6C2: 1504, - 0xB6C5: 1505, - 0xB6C9: 1506, - 0xB6D1: 1507, - 0xB6D3: 1508, - 0xB6D7: 1509, - 0xB6E1: 1510, - 0xB6E2: 1511, - 0xB6E5: 1512, - 0xB6E9: 1513, - 0xB6F1: 1514, - 0xB6F3: 1515, - 0xB6F5: 1516, - 0xB6F7: 1517, - 0xB741: 1518, - 0xB742: 1519, - 0xB745: 1520, - 0xB749: 1521, - 0xB751: 1522, - 0xB753: 1523, - 0xB755: 1524, - 0xB757: 1525, - 0xB759: 1526, - 0xB761: 1527, - 0xB762: 1528, - 0xB765: 1529, - 0xB769: 1530, - 0xB76F: 1531, - 0xB771: 1532, - 0xB773: 1533, - 0xB775: 1534, - 0xB777: 1535, - 0xB778: 1536, - 0xB779: 1537, - 0xB77A: 1538, - 0xB77B: 1539, - 0xB77C: 1540, - 0xB77D: 1541, - 0xB781: 1542, - 0xB785: 1543, - 0xB789: 1544, - 0xB791: 1545, - 0xB795: 1546, - 0xB7A1: 1547, - 0xB7A2: 1548, - 0xB7A5: 1549, - 0xB7A9: 1550, - 0xB7AA: 1551, - 0xB7AB: 1552, - 0xB7B0: 1553, - 0xB7B1: 1554, - 0xB7B3: 1555, - 0xB7B5: 1556, - 0xB7B6: 1557, - 0xB7B7: 1558, - 0xB7B8: 1559, - 0xB7BC: 1560, - 0xB861: 1561, - 0xB862: 1562, - 0xB865: 1563, - 0xB867: 1564, - 0xB868: 1565, - 0xB869: 1566, - 0xB86B: 1567, - 0xB871: 1568, - 0xB873: 1569, - 0xB875: 1570, - 0xB876: 1571, - 0xB877: 1572, - 0xB878: 1573, - 0xB881: 1574, - 0xB882: 1575, - 0xB885: 1576, - 0xB889: 1577, - 0xB891: 1578, - 0xB893: 1579, - 0xB895: 1580, - 0xB896: 1581, - 0xB897: 1582, - 0xB8A1: 1583, - 0xB8A2: 1584, - 0xB8A5: 1585, - 0xB8A7: 1586, - 0xB8A9: 1587, - 0xB8B1: 1588, - 0xB8B7: 1589, - 0xB8C1: 1590, - 0xB8C5: 1591, - 0xB8C9: 1592, - 0xB8E1: 1593, - 0xB8E2: 1594, - 0xB8E5: 1595, - 0xB8E9: 1596, - 0xB8EB: 1597, - 0xB8F1: 1598, - 0xB8F3: 1599, - 0xB8F5: 1600, - 0xB8F7: 1601, - 0xB8F8: 1602, - 0xB941: 1603, - 0xB942: 1604, - 0xB945: 1605, - 0xB949: 1606, - 0xB951: 1607, - 0xB953: 1608, - 0xB955: 1609, - 0xB957: 1610, - 0xB961: 1611, - 0xB965: 1612, - 0xB969: 1613, - 0xB971: 1614, - 0xB973: 1615, - 0xB976: 1616, - 0xB977: 1617, - 0xB981: 1618, - 0xB9A1: 1619, - 0xB9A2: 1620, - 0xB9A5: 1621, - 0xB9A9: 1622, - 0xB9AB: 1623, - 0xB9B1: 1624, - 0xB9B3: 1625, - 0xB9B5: 1626, - 0xB9B7: 1627, - 0xB9B8: 1628, - 0xB9B9: 1629, - 0xB9BD: 1630, - 0xB9C1: 1631, - 0xB9C2: 1632, - 0xB9C9: 1633, - 0xB9D3: 1634, - 0xB9D5: 1635, - 0xB9D7: 1636, - 0xB9E1: 1637, - 0xB9F6: 1638, - 0xB9F7: 1639, - 0xBA41: 1640, - 0xBA45: 1641, - 0xBA49: 1642, - 0xBA51: 1643, - 0xBA53: 1644, - 0xBA55: 1645, - 0xBA57: 1646, - 0xBA61: 1647, - 0xBA62: 1648, - 0xBA65: 1649, - 0xBA77: 1650, - 0xBA81: 1651, - 0xBA82: 1652, - 0xBA85: 1653, - 0xBA89: 1654, - 0xBA8A: 1655, - 0xBA8B: 1656, - 0xBA91: 1657, - 0xBA93: 1658, - 0xBA95: 1659, - 0xBA97: 1660, - 0xBAA1: 1661, - 0xBAB6: 1662, - 0xBAC1: 1663, - 0xBAE1: 1664, - 0xBAE2: 1665, - 0xBAE5: 1666, - 0xBAE9: 1667, - 0xBAF1: 1668, - 0xBAF3: 1669, - 0xBAF5: 1670, - 0xBB41: 1671, - 0xBB45: 1672, - 0xBB49: 1673, - 0xBB51: 1674, - 0xBB61: 1675, - 0xBB62: 1676, - 0xBB65: 1677, - 0xBB69: 1678, - 0xBB71: 1679, - 0xBB73: 1680, - 0xBB75: 1681, - 0xBB77: 1682, - 0xBBA1: 1683, - 0xBBA2: 1684, - 0xBBA5: 1685, - 0xBBA8: 1686, - 0xBBA9: 1687, - 0xBBAB: 1688, - 0xBBB1: 1689, - 0xBBB3: 1690, - 0xBBB5: 1691, - 0xBBB7: 1692, - 0xBBB8: 1693, - 0xBBBB: 1694, - 0xBBBC: 1695, - 0xBC61: 1696, - 0xBC62: 1697, - 0xBC65: 1698, - 0xBC67: 1699, - 0xBC69: 1700, - 0xBC6C: 1701, - 0xBC71: 1702, - 0xBC73: 1703, - 0xBC75: 1704, - 0xBC76: 1705, - 0xBC77: 1706, - 0xBC81: 1707, - 0xBC82: 1708, - 0xBC85: 1709, - 0xBC89: 1710, - 0xBC91: 1711, - 0xBC93: 1712, - 0xBC95: 1713, - 0xBC96: 1714, - 0xBC97: 1715, - 0xBCA1: 1716, - 0xBCA5: 1717, - 0xBCB7: 1718, - 0xBCE1: 1719, - 0xBCE2: 1720, - 0xBCE5: 1721, - 0xBCE9: 1722, - 0xBCF1: 1723, - 0xBCF3: 1724, - 0xBCF5: 1725, - 0xBCF6: 1726, - 0xBCF7: 1727, - 0xBD41: 1728, - 0xBD57: 1729, - 0xBD61: 1730, - 0xBD76: 1731, - 0xBDA1: 1732, - 0xBDA2: 1733, - 0xBDA5: 1734, - 0xBDA9: 1735, - 0xBDB1: 1736, - 0xBDB3: 1737, - 0xBDB5: 1738, - 0xBDB7: 1739, - 0xBDB9: 1740, - 0xBDC1: 1741, - 0xBDC2: 1742, - 0xBDC9: 1743, - 0xBDD6: 1744, - 0xBDE1: 1745, - 0xBDF6: 1746, - 0xBE41: 1747, - 0xBE45: 1748, - 0xBE49: 1749, - 0xBE51: 1750, - 0xBE53: 1751, - 0xBE77: 1752, - 0xBE81: 1753, - 0xBE82: 1754, - 0xBE85: 1755, - 0xBE89: 1756, - 0xBE91: 1757, - 0xBE93: 1758, - 0xBE97: 1759, - 0xBEA1: 1760, - 0xBEB6: 1761, - 0xBEB7: 1762, - 0xBEE1: 1763, - 0xBF41: 1764, - 0xBF61: 1765, - 0xBF71: 1766, - 0xBF75: 1767, - 0xBF77: 1768, - 0xBFA1: 1769, - 0xBFA2: 1770, - 0xBFA5: 1771, - 0xBFA9: 1772, - 0xBFB1: 1773, - 0xBFB3: 1774, - 0xBFB7: 1775, - 0xBFB8: 1776, - 0xBFBD: 1777, - 0xC061: 1778, - 0xC062: 1779, - 0xC065: 1780, - 0xC067: 1781, - 0xC069: 1782, - 0xC071: 1783, - 0xC073: 1784, - 0xC075: 1785, - 0xC076: 1786, - 0xC077: 1787, - 0xC078: 1788, - 0xC081: 1789, - 0xC082: 1790, - 0xC085: 1791, - 0xC089: 1792, - 0xC091: 1793, - 0xC093: 1794, - 0xC095: 1795, - 0xC096: 1796, - 0xC097: 1797, - 0xC0A1: 1798, - 0xC0A5: 1799, - 0xC0A7: 1800, - 0xC0A9: 1801, - 0xC0B1: 1802, - 0xC0B7: 1803, - 0xC0E1: 1804, - 0xC0E2: 1805, - 0xC0E5: 1806, - 0xC0E9: 1807, - 0xC0F1: 1808, - 0xC0F3: 1809, - 0xC0F5: 1810, - 0xC0F6: 1811, - 0xC0F7: 1812, - 0xC141: 1813, - 0xC142: 1814, - 0xC145: 1815, - 0xC149: 1816, - 0xC151: 1817, - 0xC153: 1818, - 0xC155: 1819, - 0xC157: 1820, - 0xC161: 1821, - 0xC165: 1822, - 0xC176: 1823, - 0xC181: 1824, - 0xC185: 1825, - 0xC197: 1826, - 0xC1A1: 1827, - 0xC1A2: 1828, - 0xC1A5: 1829, - 0xC1A9: 1830, - 0xC1B1: 1831, - 0xC1B3: 1832, - 0xC1B5: 1833, - 0xC1B7: 1834, - 0xC1C1: 1835, - 0xC1C5: 1836, - 0xC1C9: 1837, - 0xC1D7: 1838, - 0xC241: 1839, - 0xC245: 1840, - 0xC249: 1841, - 0xC251: 1842, - 0xC253: 1843, - 0xC255: 1844, - 0xC257: 1845, - 0xC261: 1846, - 0xC271: 1847, - 0xC281: 1848, - 0xC282: 1849, - 0xC285: 1850, - 0xC289: 1851, - 0xC291: 1852, - 0xC293: 1853, - 0xC295: 1854, - 0xC297: 1855, - 0xC2A1: 1856, - 0xC2B6: 1857, - 0xC2C1: 1858, - 0xC2C5: 1859, - 0xC2E1: 1860, - 0xC2E5: 1861, - 0xC2E9: 1862, - 0xC2F1: 1863, - 0xC2F3: 1864, - 0xC2F5: 1865, - 0xC2F7: 1866, - 0xC341: 1867, - 0xC345: 1868, - 0xC349: 1869, - 0xC351: 1870, - 0xC357: 1871, - 0xC361: 1872, - 0xC362: 1873, - 0xC365: 1874, - 0xC369: 1875, - 0xC371: 1876, - 0xC373: 1877, - 0xC375: 1878, - 0xC377: 1879, - 0xC3A1: 1880, - 0xC3A2: 1881, - 0xC3A5: 1882, - 0xC3A8: 1883, - 0xC3A9: 1884, - 0xC3AA: 1885, - 0xC3B1: 1886, - 0xC3B3: 1887, - 0xC3B5: 1888, - 0xC3B7: 1889, - 0xC461: 1890, - 0xC462: 1891, - 0xC465: 1892, - 0xC469: 1893, - 0xC471: 1894, - 0xC473: 1895, - 0xC475: 1896, - 0xC477: 1897, - 0xC481: 1898, - 0xC482: 1899, - 0xC485: 1900, - 0xC489: 1901, - 0xC491: 1902, - 0xC493: 1903, - 0xC495: 1904, - 0xC496: 1905, - 0xC497: 1906, - 0xC4A1: 1907, - 0xC4A2: 1908, - 0xC4B7: 1909, - 0xC4E1: 1910, - 0xC4E2: 1911, - 0xC4E5: 1912, - 0xC4E8: 1913, - 0xC4E9: 1914, - 0xC4F1: 1915, - 0xC4F3: 1916, - 0xC4F5: 1917, - 0xC4F6: 1918, - 0xC4F7: 1919, - 0xC541: 1920, - 0xC542: 1921, - 0xC545: 1922, - 0xC549: 1923, - 0xC551: 1924, - 0xC553: 1925, - 0xC555: 1926, - 0xC557: 1927, - 0xC561: 1928, - 0xC565: 1929, - 0xC569: 1930, - 0xC571: 1931, - 0xC573: 1932, - 0xC575: 1933, - 0xC576: 1934, - 0xC577: 1935, - 0xC581: 1936, - 0xC5A1: 1937, - 0xC5A2: 1938, - 0xC5A5: 1939, - 0xC5A9: 1940, - 0xC5B1: 1941, - 0xC5B3: 1942, - 0xC5B5: 1943, - 0xC5B7: 1944, - 0xC5C1: 1945, - 0xC5C2: 1946, - 0xC5C5: 1947, - 0xC5C9: 1948, - 0xC5D1: 1949, - 0xC5D7: 1950, - 0xC5E1: 1951, - 0xC5F7: 1952, - 0xC641: 1953, - 0xC649: 1954, - 0xC661: 1955, - 0xC681: 1956, - 0xC682: 1957, - 0xC685: 1958, - 0xC689: 1959, - 0xC691: 1960, - 0xC693: 1961, - 0xC695: 1962, - 0xC697: 1963, - 0xC6A1: 1964, - 0xC6A5: 1965, - 0xC6A9: 1966, - 0xC6B7: 1967, - 0xC6C1: 1968, - 0xC6D7: 1969, - 0xC6E1: 1970, - 0xC6E2: 1971, - 0xC6E5: 1972, - 0xC6E9: 1973, - 0xC6F1: 1974, - 0xC6F3: 1975, - 0xC6F5: 1976, - 0xC6F7: 1977, - 0xC741: 1978, - 0xC745: 1979, - 0xC749: 1980, - 0xC751: 1981, - 0xC761: 1982, - 0xC762: 1983, - 0xC765: 1984, - 0xC769: 1985, - 0xC771: 1986, - 0xC773: 1987, - 0xC777: 1988, - 0xC7A1: 1989, - 0xC7A2: 1990, - 0xC7A5: 1991, - 0xC7A9: 1992, - 0xC7B1: 1993, - 0xC7B3: 1994, - 0xC7B5: 1995, - 0xC7B7: 1996, - 0xC861: 1997, - 0xC862: 1998, - 0xC865: 1999, - 0xC869: 2000, - 0xC86A: 2001, - 0xC871: 2002, - 0xC873: 2003, - 0xC875: 2004, - 0xC876: 2005, - 0xC877: 2006, - 0xC881: 2007, - 0xC882: 2008, - 0xC885: 2009, - 0xC889: 2010, - 0xC891: 2011, - 0xC893: 2012, - 0xC895: 2013, - 0xC896: 2014, - 0xC897: 2015, - 0xC8A1: 2016, - 0xC8B7: 2017, - 0xC8E1: 2018, - 0xC8E2: 2019, - 0xC8E5: 2020, - 0xC8E9: 2021, - 0xC8EB: 2022, - 0xC8F1: 2023, - 0xC8F3: 2024, - 0xC8F5: 2025, - 0xC8F6: 2026, - 0xC8F7: 2027, - 0xC941: 2028, - 0xC942: 2029, - 0xC945: 2030, - 0xC949: 2031, - 0xC951: 2032, - 0xC953: 2033, - 0xC955: 2034, - 0xC957: 2035, - 0xC961: 2036, - 0xC965: 2037, - 0xC976: 2038, - 0xC981: 2039, - 0xC985: 2040, - 0xC9A1: 2041, - 0xC9A2: 2042, - 0xC9A5: 2043, - 0xC9A9: 2044, - 0xC9B1: 2045, - 0xC9B3: 2046, - 0xC9B5: 2047, - 0xC9B7: 2048, - 0xC9BC: 2049, - 0xC9C1: 2050, - 0xC9C5: 2051, - 0xC9E1: 2052, - 0xCA41: 2053, - 0xCA45: 2054, - 0xCA55: 2055, - 0xCA57: 2056, - 0xCA61: 2057, - 0xCA81: 2058, - 0xCA82: 2059, - 0xCA85: 2060, - 0xCA89: 2061, - 0xCA91: 2062, - 0xCA93: 2063, - 0xCA95: 2064, - 0xCA97: 2065, - 0xCAA1: 2066, - 0xCAB6: 2067, - 0xCAC1: 2068, - 0xCAE1: 2069, - 0xCAE2: 2070, - 0xCAE5: 2071, - 0xCAE9: 2072, - 0xCAF1: 2073, - 0xCAF3: 2074, - 0xCAF7: 2075, - 0xCB41: 2076, - 0xCB45: 2077, - 0xCB49: 2078, - 0xCB51: 2079, - 0xCB57: 2080, - 0xCB61: 2081, - 0xCB62: 2082, - 0xCB65: 2083, - 0xCB68: 2084, - 0xCB69: 2085, - 0xCB6B: 2086, - 0xCB71: 2087, - 0xCB73: 2088, - 0xCB75: 2089, - 0xCB81: 2090, - 0xCB85: 2091, - 0xCB89: 2092, - 0xCB91: 2093, - 0xCB93: 2094, - 0xCBA1: 2095, - 0xCBA2: 2096, - 0xCBA5: 2097, - 0xCBA9: 2098, - 0xCBB1: 2099, - 0xCBB3: 2100, - 0xCBB5: 2101, - 0xCBB7: 2102, - 0xCC61: 2103, - 0xCC62: 2104, - 0xCC63: 2105, - 0xCC65: 2106, - 0xCC69: 2107, - 0xCC6B: 2108, - 0xCC71: 2109, - 0xCC73: 2110, - 0xCC75: 2111, - 0xCC76: 2112, - 0xCC77: 2113, - 0xCC7B: 2114, - 0xCC81: 2115, - 0xCC82: 2116, - 0xCC85: 2117, - 0xCC89: 2118, - 0xCC91: 2119, - 0xCC93: 2120, - 0xCC95: 2121, - 0xCC96: 2122, - 0xCC97: 2123, - 0xCCA1: 2124, - 0xCCA2: 2125, - 0xCCE1: 2126, - 0xCCE2: 2127, - 0xCCE5: 2128, - 0xCCE9: 2129, - 0xCCF1: 2130, - 0xCCF3: 2131, - 0xCCF5: 2132, - 0xCCF6: 2133, - 0xCCF7: 2134, - 0xCD41: 2135, - 0xCD42: 2136, - 0xCD45: 2137, - 0xCD49: 2138, - 0xCD51: 2139, - 0xCD53: 2140, - 0xCD55: 2141, - 0xCD57: 2142, - 0xCD61: 2143, - 0xCD65: 2144, - 0xCD69: 2145, - 0xCD71: 2146, - 0xCD73: 2147, - 0xCD76: 2148, - 0xCD77: 2149, - 0xCD81: 2150, - 0xCD89: 2151, - 0xCD93: 2152, - 0xCD95: 2153, - 0xCDA1: 2154, - 0xCDA2: 2155, - 0xCDA5: 2156, - 0xCDA9: 2157, - 0xCDB1: 2158, - 0xCDB3: 2159, - 0xCDB5: 2160, - 0xCDB7: 2161, - 0xCDC1: 2162, - 0xCDD7: 2163, - 0xCE41: 2164, - 0xCE45: 2165, - 0xCE61: 2166, - 0xCE65: 2167, - 0xCE69: 2168, - 0xCE73: 2169, - 0xCE75: 2170, - 0xCE81: 2171, - 0xCE82: 2172, - 0xCE85: 2173, - 0xCE88: 2174, - 0xCE89: 2175, - 0xCE8B: 2176, - 0xCE91: 2177, - 0xCE93: 2178, - 0xCE95: 2179, - 0xCE97: 2180, - 0xCEA1: 2181, - 0xCEB7: 2182, - 0xCEE1: 2183, - 0xCEE5: 2184, - 0xCEE9: 2185, - 0xCEF1: 2186, - 0xCEF5: 2187, - 0xCF41: 2188, - 0xCF45: 2189, - 0xCF49: 2190, - 0xCF51: 2191, - 0xCF55: 2192, - 0xCF57: 2193, - 0xCF61: 2194, - 0xCF65: 2195, - 0xCF69: 2196, - 0xCF71: 2197, - 0xCF73: 2198, - 0xCF75: 2199, - 0xCFA1: 2200, - 0xCFA2: 2201, - 0xCFA5: 2202, - 0xCFA9: 2203, - 0xCFB1: 2204, - 0xCFB3: 2205, - 0xCFB5: 2206, - 0xCFB7: 2207, - 0xD061: 2208, - 0xD062: 2209, - 0xD065: 2210, - 0xD069: 2211, - 0xD06E: 2212, - 0xD071: 2213, - 0xD073: 2214, - 0xD075: 2215, - 0xD077: 2216, - 0xD081: 2217, - 0xD082: 2218, - 0xD085: 2219, - 0xD089: 2220, - 0xD091: 2221, - 0xD093: 2222, - 0xD095: 2223, - 0xD096: 2224, - 0xD097: 2225, - 0xD0A1: 2226, - 0xD0B7: 2227, - 0xD0E1: 2228, - 0xD0E2: 2229, - 0xD0E5: 2230, - 0xD0E9: 2231, - 0xD0EB: 2232, - 0xD0F1: 2233, - 0xD0F3: 2234, - 0xD0F5: 2235, - 0xD0F7: 2236, - 0xD141: 2237, - 0xD142: 2238, - 0xD145: 2239, - 0xD149: 2240, - 0xD151: 2241, - 0xD153: 2242, - 0xD155: 2243, - 0xD157: 2244, - 0xD161: 2245, - 0xD162: 2246, - 0xD165: 2247, - 0xD169: 2248, - 0xD171: 2249, - 0xD173: 2250, - 0xD175: 2251, - 0xD176: 2252, - 0xD177: 2253, - 0xD181: 2254, - 0xD185: 2255, - 0xD189: 2256, - 0xD193: 2257, - 0xD1A1: 2258, - 0xD1A2: 2259, - 0xD1A5: 2260, - 0xD1A9: 2261, - 0xD1AE: 2262, - 0xD1B1: 2263, - 0xD1B3: 2264, - 0xD1B5: 2265, - 0xD1B7: 2266, - 0xD1BB: 2267, - 0xD1C1: 2268, - 0xD1C2: 2269, - 0xD1C5: 2270, - 0xD1C9: 2271, - 0xD1D5: 2272, - 0xD1D7: 2273, - 0xD1E1: 2274, - 0xD1E2: 2275, - 0xD1E5: 2276, - 0xD1F5: 2277, - 0xD1F7: 2278, - 0xD241: 2279, - 0xD242: 2280, - 0xD245: 2281, - 0xD249: 2282, - 0xD253: 2283, - 0xD255: 2284, - 0xD257: 2285, - 0xD261: 2286, - 0xD265: 2287, - 0xD269: 2288, - 0xD273: 2289, - 0xD275: 2290, - 0xD281: 2291, - 0xD282: 2292, - 0xD285: 2293, - 0xD289: 2294, - 0xD28E: 2295, - 0xD291: 2296, - 0xD295: 2297, - 0xD297: 2298, - 0xD2A1: 2299, - 0xD2A5: 2300, - 0xD2A9: 2301, - 0xD2B1: 2302, - 0xD2B7: 2303, - 0xD2C1: 2304, - 0xD2C2: 2305, - 0xD2C5: 2306, - 0xD2C9: 2307, - 0xD2D7: 2308, - 0xD2E1: 2309, - 0xD2E2: 2310, - 0xD2E5: 2311, - 0xD2E9: 2312, - 0xD2F1: 2313, - 0xD2F3: 2314, - 0xD2F5: 2315, - 0xD2F7: 2316, - 0xD341: 2317, - 0xD342: 2318, - 0xD345: 2319, - 0xD349: 2320, - 0xD351: 2321, - 0xD355: 2322, - 0xD357: 2323, - 0xD361: 2324, - 0xD362: 2325, - 0xD365: 2326, - 0xD367: 2327, - 0xD368: 2328, - 0xD369: 2329, - 0xD36A: 2330, - 0xD371: 2331, - 0xD373: 2332, - 0xD375: 2333, - 0xD377: 2334, - 0xD37B: 2335, - 0xD381: 2336, - 0xD385: 2337, - 0xD389: 2338, - 0xD391: 2339, - 0xD393: 2340, - 0xD397: 2341, - 0xD3A1: 2342, - 0xD3A2: 2343, - 0xD3A5: 2344, - 0xD3A9: 2345, - 0xD3B1: 2346, - 0xD3B3: 2347, - 0xD3B5: 2348, - 0xD3B7: 2349, -} diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/johabprober.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/johabprober.py deleted file mode 100644 index d7364ba..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/johabprober.py +++ /dev/null @@ -1,47 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .chardistribution import JOHABDistributionAnalysis -from .codingstatemachine import CodingStateMachine -from .mbcharsetprober import MultiByteCharSetProber -from .mbcssm import JOHAB_SM_MODEL - - -class JOHABProber(MultiByteCharSetProber): - def __init__(self) -> None: - super().__init__() - self.coding_sm = CodingStateMachine(JOHAB_SM_MODEL) - self.distribution_analyzer = JOHABDistributionAnalysis() - self.reset() - - @property - def charset_name(self) -> str: - return "Johab" - - @property - def language(self) -> str: - return "Korean" diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/jpcntx.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/jpcntx.py deleted file mode 100644 index 2f53bdd..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/jpcntx.py +++ /dev/null @@ -1,238 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from typing import List, Tuple, Union - -# This is hiragana 2-char sequence table, the number in each cell represents its frequency category -# fmt: off -jp2_char_context = ( - (0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1), - (2, 4, 0, 4, 0, 3, 0, 4, 0, 3, 4, 4, 4, 2, 4, 3, 3, 4, 3, 2, 3, 3, 4, 2, 3, 3, 3, 2, 4, 1, 4, 3, 3, 1, 5, 4, 3, 4, 3, 4, 3, 5, 3, 0, 3, 5, 4, 2, 0, 3, 1, 0, 3, 3, 0, 3, 3, 0, 1, 1, 0, 4, 3, 0, 3, 3, 0, 4, 0, 2, 0, 3, 5, 5, 5, 5, 4, 0, 4, 1, 0, 3, 4), - (0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2), - (0, 4, 0, 5, 0, 5, 0, 4, 0, 4, 5, 4, 4, 3, 5, 3, 5, 1, 5, 3, 4, 3, 4, 4, 3, 4, 3, 3, 4, 3, 5, 4, 4, 3, 5, 5, 3, 5, 5, 5, 3, 5, 5, 3, 4, 5, 5, 3, 1, 3, 2, 0, 3, 4, 0, 4, 2, 0, 4, 2, 1, 5, 3, 2, 3, 5, 0, 4, 0, 2, 0, 5, 4, 4, 5, 4, 5, 0, 4, 0, 0, 4, 4), - (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), - (0, 3, 0, 4, 0, 3, 0, 3, 0, 4, 5, 4, 3, 3, 3, 3, 4, 3, 5, 4, 4, 3, 5, 4, 4, 3, 4, 3, 4, 4, 4, 4, 5, 3, 4, 4, 3, 4, 5, 5, 4, 5, 5, 1, 4, 5, 4, 3, 0, 3, 3, 1, 3, 3, 0, 4, 4, 0, 3, 3, 1, 5, 3, 3, 3, 5, 0, 4, 0, 3, 0, 4, 4, 3, 4, 3, 3, 0, 4, 1, 1, 3, 4), - (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), - (0, 4, 0, 3, 0, 3, 0, 4, 0, 3, 4, 4, 3, 2, 2, 1, 2, 1, 3, 1, 3, 3, 3, 3, 3, 4, 3, 1, 3, 3, 5, 3, 3, 0, 4, 3, 0, 5, 4, 3, 3, 5, 4, 4, 3, 4, 4, 5, 0, 1, 2, 0, 1, 2, 0, 2, 2, 0, 1, 0, 0, 5, 2, 2, 1, 4, 0, 3, 0, 1, 0, 4, 4, 3, 5, 4, 3, 0, 2, 1, 0, 4, 3), - (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), - (0, 3, 0, 5, 0, 4, 0, 2, 1, 4, 4, 2, 4, 1, 4, 2, 4, 2, 4, 3, 3, 3, 4, 3, 3, 3, 3, 1, 4, 2, 3, 3, 3, 1, 4, 4, 1, 1, 1, 4, 3, 3, 2, 0, 2, 4, 3, 2, 0, 3, 3, 0, 3, 1, 1, 0, 0, 0, 3, 3, 0, 4, 2, 2, 3, 4, 0, 4, 0, 3, 0, 4, 4, 5, 3, 4, 4, 0, 3, 0, 0, 1, 4), - (1, 4, 0, 4, 0, 4, 0, 4, 0, 3, 5, 4, 4, 3, 4, 3, 5, 4, 3, 3, 4, 3, 5, 4, 4, 4, 4, 3, 4, 2, 4, 3, 3, 1, 5, 4, 3, 2, 4, 5, 4, 5, 5, 4, 4, 5, 4, 4, 0, 3, 2, 2, 3, 3, 0, 4, 3, 1, 3, 2, 1, 4, 3, 3, 4, 5, 0, 3, 0, 2, 0, 4, 5, 5, 4, 5, 4, 0, 4, 0, 0, 5, 4), - (0, 5, 0, 5, 0, 4, 0, 3, 0, 4, 4, 3, 4, 3, 3, 3, 4, 0, 4, 4, 4, 3, 4, 3, 4, 3, 3, 1, 4, 2, 4, 3, 4, 0, 5, 4, 1, 4, 5, 4, 4, 5, 3, 2, 4, 3, 4, 3, 2, 4, 1, 3, 3, 3, 2, 3, 2, 0, 4, 3, 3, 4, 3, 3, 3, 4, 0, 4, 0, 3, 0, 4, 5, 4, 4, 4, 3, 0, 4, 1, 0, 1, 3), - (0, 3, 1, 4, 0, 3, 0, 2, 0, 3, 4, 4, 3, 1, 4, 2, 3, 3, 4, 3, 4, 3, 4, 3, 4, 4, 3, 2, 3, 1, 5, 4, 4, 1, 4, 4, 3, 5, 4, 4, 3, 5, 5, 4, 3, 4, 4, 3, 1, 2, 3, 1, 2, 2, 0, 3, 2, 0, 3, 1, 0, 5, 3, 3, 3, 4, 3, 3, 3, 3, 4, 4, 4, 4, 5, 4, 2, 0, 3, 3, 2, 4, 3), - (0, 2, 0, 3, 0, 1, 0, 1, 0, 0, 3, 2, 0, 0, 2, 0, 1, 0, 2, 1, 3, 3, 3, 1, 2, 3, 1, 0, 1, 0, 4, 2, 1, 1, 3, 3, 0, 4, 3, 3, 1, 4, 3, 3, 0, 3, 3, 2, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 4, 1, 0, 2, 3, 2, 2, 2, 1, 3, 3, 3, 4, 4, 3, 2, 0, 3, 1, 0, 3, 3), - (0, 4, 0, 4, 0, 3, 0, 3, 0, 4, 4, 4, 3, 3, 3, 3, 3, 3, 4, 3, 4, 2, 4, 3, 4, 3, 3, 2, 4, 3, 4, 5, 4, 1, 4, 5, 3, 5, 4, 5, 3, 5, 4, 0, 3, 5, 5, 3, 1, 3, 3, 2, 2, 3, 0, 3, 4, 1, 3, 3, 2, 4, 3, 3, 3, 4, 0, 4, 0, 3, 0, 4, 5, 4, 4, 5, 3, 0, 4, 1, 0, 3, 4), - (0, 2, 0, 3, 0, 3, 0, 0, 0, 2, 2, 2, 1, 0, 1, 0, 0, 0, 3, 0, 3, 0, 3, 0, 1, 3, 1, 0, 3, 1, 3, 3, 3, 1, 3, 3, 3, 0, 1, 3, 1, 3, 4, 0, 0, 3, 1, 1, 0, 3, 2, 0, 0, 0, 0, 1, 3, 0, 1, 0, 0, 3, 3, 2, 0, 3, 0, 0, 0, 0, 0, 3, 4, 3, 4, 3, 3, 0, 3, 0, 0, 2, 3), - (2, 3, 0, 3, 0, 2, 0, 1, 0, 3, 3, 4, 3, 1, 3, 1, 1, 1, 3, 1, 4, 3, 4, 3, 3, 3, 0, 0, 3, 1, 5, 4, 3, 1, 4, 3, 2, 5, 5, 4, 4, 4, 4, 3, 3, 4, 4, 4, 0, 2, 1, 1, 3, 2, 0, 1, 2, 0, 0, 1, 0, 4, 1, 3, 3, 3, 0, 3, 0, 1, 0, 4, 4, 4, 5, 5, 3, 0, 2, 0, 0, 4, 4), - (0, 2, 0, 1, 0, 3, 1, 3, 0, 2, 3, 3, 3, 0, 3, 1, 0, 0, 3, 0, 3, 2, 3, 1, 3, 2, 1, 1, 0, 0, 4, 2, 1, 0, 2, 3, 1, 4, 3, 2, 0, 4, 4, 3, 1, 3, 1, 3, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4, 1, 1, 1, 2, 0, 3, 0, 0, 0, 3, 4, 2, 4, 3, 2, 0, 1, 0, 0, 3, 3), - (0, 1, 0, 4, 0, 5, 0, 4, 0, 2, 4, 4, 2, 3, 3, 2, 3, 3, 5, 3, 3, 3, 4, 3, 4, 2, 3, 0, 4, 3, 3, 3, 4, 1, 4, 3, 2, 1, 5, 5, 3, 4, 5, 1, 3, 5, 4, 2, 0, 3, 3, 0, 1, 3, 0, 4, 2, 0, 1, 3, 1, 4, 3, 3, 3, 3, 0, 3, 0, 1, 0, 3, 4, 4, 4, 5, 5, 0, 3, 0, 1, 4, 5), - (0, 2, 0, 3, 0, 3, 0, 0, 0, 2, 3, 1, 3, 0, 4, 0, 1, 1, 3, 0, 3, 4, 3, 2, 3, 1, 0, 3, 3, 2, 3, 1, 3, 0, 2, 3, 0, 2, 1, 4, 1, 2, 2, 0, 0, 3, 3, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 2, 2, 0, 3, 2, 1, 3, 3, 0, 2, 0, 2, 0, 0, 3, 3, 1, 2, 4, 0, 3, 0, 2, 2, 3), - (2, 4, 0, 5, 0, 4, 0, 4, 0, 2, 4, 4, 4, 3, 4, 3, 3, 3, 1, 2, 4, 3, 4, 3, 4, 4, 5, 0, 3, 3, 3, 3, 2, 0, 4, 3, 1, 4, 3, 4, 1, 4, 4, 3, 3, 4, 4, 3, 1, 2, 3, 0, 4, 2, 0, 4, 1, 0, 3, 3, 0, 4, 3, 3, 3, 4, 0, 4, 0, 2, 0, 3, 5, 3, 4, 5, 2, 0, 3, 0, 0, 4, 5), - (0, 3, 0, 4, 0, 1, 0, 1, 0, 1, 3, 2, 2, 1, 3, 0, 3, 0, 2, 0, 2, 0, 3, 0, 2, 0, 0, 0, 1, 0, 1, 1, 0, 0, 3, 1, 0, 0, 0, 4, 0, 3, 1, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 3, 1, 0, 3, 0, 0, 0, 1, 4, 4, 4, 3, 0, 0, 4, 0, 0, 1, 4), - (1, 4, 1, 5, 0, 3, 0, 3, 0, 4, 5, 4, 4, 3, 5, 3, 3, 4, 4, 3, 4, 1, 3, 3, 3, 3, 2, 1, 4, 1, 5, 4, 3, 1, 4, 4, 3, 5, 4, 4, 3, 5, 4, 3, 3, 4, 4, 4, 0, 3, 3, 1, 2, 3, 0, 3, 1, 0, 3, 3, 0, 5, 4, 4, 4, 4, 4, 4, 3, 3, 5, 4, 4, 3, 3, 5, 4, 0, 3, 2, 0, 4, 4), - (0, 2, 0, 3, 0, 1, 0, 0, 0, 1, 3, 3, 3, 2, 4, 1, 3, 0, 3, 1, 3, 0, 2, 2, 1, 1, 0, 0, 2, 0, 4, 3, 1, 0, 4, 3, 0, 4, 4, 4, 1, 4, 3, 1, 1, 3, 3, 1, 0, 2, 0, 0, 1, 3, 0, 0, 0, 0, 2, 0, 0, 4, 3, 2, 4, 3, 5, 4, 3, 3, 3, 4, 3, 3, 4, 3, 3, 0, 2, 1, 0, 3, 3), - (0, 2, 0, 4, 0, 3, 0, 2, 0, 2, 5, 5, 3, 4, 4, 4, 4, 1, 4, 3, 3, 0, 4, 3, 4, 3, 1, 3, 3, 2, 4, 3, 0, 3, 4, 3, 0, 3, 4, 4, 2, 4, 4, 0, 4, 5, 3, 3, 2, 2, 1, 1, 1, 2, 0, 1, 5, 0, 3, 3, 2, 4, 3, 3, 3, 4, 0, 3, 0, 2, 0, 4, 4, 3, 5, 5, 0, 0, 3, 0, 2, 3, 3), - (0, 3, 0, 4, 0, 3, 0, 1, 0, 3, 4, 3, 3, 1, 3, 3, 3, 0, 3, 1, 3, 0, 4, 3, 3, 1, 1, 0, 3, 0, 3, 3, 0, 0, 4, 4, 0, 1, 5, 4, 3, 3, 5, 0, 3, 3, 4, 3, 0, 2, 0, 1, 1, 1, 0, 1, 3, 0, 1, 2, 1, 3, 3, 2, 3, 3, 0, 3, 0, 1, 0, 1, 3, 3, 4, 4, 1, 0, 1, 2, 2, 1, 3), - (0, 1, 0, 4, 0, 4, 0, 3, 0, 1, 3, 3, 3, 2, 3, 1, 1, 0, 3, 0, 3, 3, 4, 3, 2, 4, 2, 0, 1, 0, 4, 3, 2, 0, 4, 3, 0, 5, 3, 3, 2, 4, 4, 4, 3, 3, 3, 4, 0, 1, 3, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 4, 2, 3, 3, 3, 0, 3, 0, 0, 0, 4, 4, 4, 5, 3, 2, 0, 3, 3, 0, 3, 5), - (0, 2, 0, 3, 0, 0, 0, 3, 0, 1, 3, 0, 2, 0, 0, 0, 1, 0, 3, 1, 1, 3, 3, 0, 0, 3, 0, 0, 3, 0, 2, 3, 1, 0, 3, 1, 0, 3, 3, 2, 0, 4, 2, 2, 0, 2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 2, 0, 1, 0, 1, 0, 0, 0, 1, 3, 1, 2, 0, 0, 0, 1, 0, 0, 1, 4), - (0, 3, 0, 3, 0, 5, 0, 1, 0, 2, 4, 3, 1, 3, 3, 2, 1, 1, 5, 2, 1, 0, 5, 1, 2, 0, 0, 0, 3, 3, 2, 2, 3, 2, 4, 3, 0, 0, 3, 3, 1, 3, 3, 0, 2, 5, 3, 4, 0, 3, 3, 0, 1, 2, 0, 2, 2, 0, 3, 2, 0, 2, 2, 3, 3, 3, 0, 2, 0, 1, 0, 3, 4, 4, 2, 5, 4, 0, 3, 0, 0, 3, 5), - (0, 3, 0, 3, 0, 3, 0, 1, 0, 3, 3, 3, 3, 0, 3, 0, 2, 0, 2, 1, 1, 0, 2, 0, 1, 0, 0, 0, 2, 1, 0, 0, 1, 0, 3, 2, 0, 0, 3, 3, 1, 2, 3, 1, 0, 3, 3, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 3, 1, 2, 3, 0, 3, 0, 1, 0, 3, 2, 1, 0, 4, 3, 0, 1, 1, 0, 3, 3), - (0, 4, 0, 5, 0, 3, 0, 3, 0, 4, 5, 5, 4, 3, 5, 3, 4, 3, 5, 3, 3, 2, 5, 3, 4, 4, 4, 3, 4, 3, 4, 5, 5, 3, 4, 4, 3, 4, 4, 5, 4, 4, 4, 3, 4, 5, 5, 4, 2, 3, 4, 2, 3, 4, 0, 3, 3, 1, 4, 3, 2, 4, 3, 3, 5, 5, 0, 3, 0, 3, 0, 5, 5, 5, 5, 4, 4, 0, 4, 0, 1, 4, 4), - (0, 4, 0, 4, 0, 3, 0, 3, 0, 3, 5, 4, 4, 2, 3, 2, 5, 1, 3, 2, 5, 1, 4, 2, 3, 2, 3, 3, 4, 3, 3, 3, 3, 2, 5, 4, 1, 3, 3, 5, 3, 4, 4, 0, 4, 4, 3, 1, 1, 3, 1, 0, 2, 3, 0, 2, 3, 0, 3, 0, 0, 4, 3, 1, 3, 4, 0, 3, 0, 2, 0, 4, 4, 4, 3, 4, 5, 0, 4, 0, 0, 3, 4), - (0, 3, 0, 3, 0, 3, 1, 2, 0, 3, 4, 4, 3, 3, 3, 0, 2, 2, 4, 3, 3, 1, 3, 3, 3, 1, 1, 0, 3, 1, 4, 3, 2, 3, 4, 4, 2, 4, 4, 4, 3, 4, 4, 3, 2, 4, 4, 3, 1, 3, 3, 1, 3, 3, 0, 4, 1, 0, 2, 2, 1, 4, 3, 2, 3, 3, 5, 4, 3, 3, 5, 4, 4, 3, 3, 0, 4, 0, 3, 2, 2, 4, 4), - (0, 2, 0, 1, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 2, 0, 1, 2, 1, 0, 0, 1, 0, 0, 0, 0, 3, 0, 0, 1, 0, 1, 1, 3, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 0, 3, 4, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1), - (0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4, 0, 4, 1, 4, 0, 3, 0, 4, 0, 3, 0, 4, 0, 3, 0, 3, 0, 4, 1, 5, 1, 4, 0, 0, 3, 0, 5, 0, 5, 2, 0, 1, 0, 0, 0, 2, 1, 4, 0, 1, 3, 0, 0, 3, 0, 0, 3, 1, 1, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0), - (1, 4, 0, 5, 0, 3, 0, 2, 0, 3, 5, 4, 4, 3, 4, 3, 5, 3, 4, 3, 3, 0, 4, 3, 3, 3, 3, 3, 3, 2, 4, 4, 3, 1, 3, 4, 4, 5, 4, 4, 3, 4, 4, 1, 3, 5, 4, 3, 3, 3, 1, 2, 2, 3, 3, 1, 3, 1, 3, 3, 3, 5, 3, 3, 4, 5, 0, 3, 0, 3, 0, 3, 4, 3, 4, 4, 3, 0, 3, 0, 2, 4, 3), - (0, 1, 0, 4, 0, 0, 0, 0, 0, 1, 4, 0, 4, 1, 4, 2, 4, 0, 3, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2, 0, 3, 1, 1, 1, 0, 3, 0, 0, 0, 1, 2, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 3, 2, 0, 2, 2, 0, 1, 0, 0, 0, 2, 3, 2, 3, 3, 0, 0, 0, 0, 2, 1, 0), - (0, 5, 1, 5, 0, 3, 0, 3, 0, 5, 4, 4, 5, 1, 5, 3, 3, 0, 4, 3, 4, 3, 5, 3, 4, 3, 3, 2, 4, 3, 4, 3, 3, 0, 3, 3, 1, 4, 4, 3, 4, 4, 4, 3, 4, 5, 5, 3, 2, 3, 1, 1, 3, 3, 1, 3, 1, 1, 3, 3, 2, 4, 5, 3, 3, 5, 0, 4, 0, 3, 0, 4, 4, 3, 5, 3, 3, 0, 3, 4, 0, 4, 3), - (0, 5, 0, 5, 0, 3, 0, 2, 0, 4, 4, 3, 5, 2, 4, 3, 3, 3, 4, 4, 4, 3, 5, 3, 5, 3, 3, 1, 4, 0, 4, 3, 3, 0, 3, 3, 0, 4, 4, 4, 4, 5, 4, 3, 3, 5, 5, 3, 2, 3, 1, 2, 3, 2, 0, 1, 0, 0, 3, 2, 2, 4, 4, 3, 1, 5, 0, 4, 0, 3, 0, 4, 3, 1, 3, 2, 1, 0, 3, 3, 0, 3, 3), - (0, 4, 0, 5, 0, 5, 0, 4, 0, 4, 5, 5, 5, 3, 4, 3, 3, 2, 5, 4, 4, 3, 5, 3, 5, 3, 4, 0, 4, 3, 4, 4, 3, 2, 4, 4, 3, 4, 5, 4, 4, 5, 5, 0, 3, 5, 5, 4, 1, 3, 3, 2, 3, 3, 1, 3, 1, 0, 4, 3, 1, 4, 4, 3, 4, 5, 0, 4, 0, 2, 0, 4, 3, 4, 4, 3, 3, 0, 4, 0, 0, 5, 5), - (0, 4, 0, 4, 0, 5, 0, 1, 1, 3, 3, 4, 4, 3, 4, 1, 3, 0, 5, 1, 3, 0, 3, 1, 3, 1, 1, 0, 3, 0, 3, 3, 4, 0, 4, 3, 0, 4, 4, 4, 3, 4, 4, 0, 3, 5, 4, 1, 0, 3, 0, 0, 2, 3, 0, 3, 1, 0, 3, 1, 0, 3, 2, 1, 3, 5, 0, 3, 0, 1, 0, 3, 2, 3, 3, 4, 4, 0, 2, 2, 0, 4, 4), - (2, 4, 0, 5, 0, 4, 0, 3, 0, 4, 5, 5, 4, 3, 5, 3, 5, 3, 5, 3, 5, 2, 5, 3, 4, 3, 3, 4, 3, 4, 5, 3, 2, 1, 5, 4, 3, 2, 3, 4, 5, 3, 4, 1, 2, 5, 4, 3, 0, 3, 3, 0, 3, 2, 0, 2, 3, 0, 4, 1, 0, 3, 4, 3, 3, 5, 0, 3, 0, 1, 0, 4, 5, 5, 5, 4, 3, 0, 4, 2, 0, 3, 5), - (0, 5, 0, 4, 0, 4, 0, 2, 0, 5, 4, 3, 4, 3, 4, 3, 3, 3, 4, 3, 4, 2, 5, 3, 5, 3, 4, 1, 4, 3, 4, 4, 4, 0, 3, 5, 0, 4, 4, 4, 4, 5, 3, 1, 3, 4, 5, 3, 3, 3, 3, 3, 3, 3, 0, 2, 2, 0, 3, 3, 2, 4, 3, 3, 3, 5, 3, 4, 1, 3, 3, 5, 3, 2, 0, 0, 0, 0, 4, 3, 1, 3, 3), - (0, 1, 0, 3, 0, 3, 0, 1, 0, 1, 3, 3, 3, 2, 3, 3, 3, 0, 3, 0, 0, 0, 3, 1, 3, 0, 0, 0, 2, 2, 2, 3, 0, 0, 3, 2, 0, 1, 2, 4, 1, 3, 3, 0, 0, 3, 3, 3, 0, 1, 0, 0, 2, 1, 0, 0, 3, 0, 3, 1, 0, 3, 0, 0, 1, 3, 0, 2, 0, 1, 0, 3, 3, 1, 3, 3, 0, 0, 1, 1, 0, 3, 3), - (0, 2, 0, 3, 0, 2, 1, 4, 0, 2, 2, 3, 1, 1, 3, 1, 1, 0, 2, 0, 3, 1, 2, 3, 1, 3, 0, 0, 1, 0, 4, 3, 2, 3, 3, 3, 1, 4, 2, 3, 3, 3, 3, 1, 0, 3, 1, 4, 0, 1, 1, 0, 1, 2, 0, 1, 1, 0, 1, 1, 0, 3, 1, 3, 2, 2, 0, 1, 0, 0, 0, 2, 3, 3, 3, 1, 0, 0, 0, 0, 0, 2, 3), - (0, 5, 0, 4, 0, 5, 0, 2, 0, 4, 5, 5, 3, 3, 4, 3, 3, 1, 5, 4, 4, 2, 4, 4, 4, 3, 4, 2, 4, 3, 5, 5, 4, 3, 3, 4, 3, 3, 5, 5, 4, 5, 5, 1, 3, 4, 5, 3, 1, 4, 3, 1, 3, 3, 0, 3, 3, 1, 4, 3, 1, 4, 5, 3, 3, 5, 0, 4, 0, 3, 0, 5, 3, 3, 1, 4, 3, 0, 4, 0, 1, 5, 3), - (0, 5, 0, 5, 0, 4, 0, 2, 0, 4, 4, 3, 4, 3, 3, 3, 3, 3, 5, 4, 4, 4, 4, 4, 4, 5, 3, 3, 5, 2, 4, 4, 4, 3, 4, 4, 3, 3, 4, 4, 5, 5, 3, 3, 4, 3, 4, 3, 3, 4, 3, 3, 3, 3, 1, 2, 2, 1, 4, 3, 3, 5, 4, 4, 3, 4, 0, 4, 0, 3, 0, 4, 4, 4, 4, 4, 1, 0, 4, 2, 0, 2, 4), - (0, 4, 0, 4, 0, 3, 0, 1, 0, 3, 5, 2, 3, 0, 3, 0, 2, 1, 4, 2, 3, 3, 4, 1, 4, 3, 3, 2, 4, 1, 3, 3, 3, 0, 3, 3, 0, 0, 3, 3, 3, 5, 3, 3, 3, 3, 3, 2, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 1, 0, 0, 3, 1, 2, 2, 3, 0, 3, 0, 2, 0, 4, 4, 3, 3, 4, 1, 0, 3, 0, 0, 2, 4), - (0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 2, 0, 0, 0, 0, 0, 1, 0, 2, 0, 1, 0, 0, 0, 0, 0, 3, 1, 3, 0, 3, 2, 0, 0, 0, 1, 0, 3, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 2, 0, 0, 0, 0, 0, 0, 2), - (0, 2, 1, 3, 0, 2, 0, 2, 0, 3, 3, 3, 3, 1, 3, 1, 3, 3, 3, 3, 3, 3, 4, 2, 2, 1, 2, 1, 4, 0, 4, 3, 1, 3, 3, 3, 2, 4, 3, 5, 4, 3, 3, 3, 3, 3, 3, 3, 0, 1, 3, 0, 2, 0, 0, 1, 0, 0, 1, 0, 0, 4, 2, 0, 2, 3, 0, 3, 3, 0, 3, 3, 4, 2, 3, 1, 4, 0, 1, 2, 0, 2, 3), - (0, 3, 0, 3, 0, 1, 0, 3, 0, 2, 3, 3, 3, 0, 3, 1, 2, 0, 3, 3, 2, 3, 3, 2, 3, 2, 3, 1, 3, 0, 4, 3, 2, 0, 3, 3, 1, 4, 3, 3, 2, 3, 4, 3, 1, 3, 3, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 4, 1, 1, 0, 3, 0, 3, 1, 0, 2, 3, 3, 3, 3, 3, 1, 0, 0, 2, 0, 3, 3), - (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 3, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 2, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3), - (0, 2, 0, 3, 1, 3, 0, 3, 0, 2, 3, 3, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 1, 3, 0, 2, 3, 1, 1, 4, 3, 3, 2, 3, 3, 1, 2, 2, 4, 1, 3, 3, 0, 1, 4, 2, 3, 0, 1, 3, 0, 3, 0, 0, 1, 3, 0, 2, 0, 0, 3, 3, 2, 1, 3, 0, 3, 0, 2, 0, 3, 4, 4, 4, 3, 1, 0, 3, 0, 0, 3, 3), - (0, 2, 0, 1, 0, 2, 0, 0, 0, 1, 3, 2, 2, 1, 3, 0, 1, 1, 3, 0, 3, 2, 3, 1, 2, 0, 2, 0, 1, 1, 3, 3, 3, 0, 3, 3, 1, 1, 2, 3, 2, 3, 3, 1, 2, 3, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 2, 1, 2, 1, 3, 0, 3, 0, 0, 0, 3, 4, 4, 4, 3, 2, 0, 2, 0, 0, 2, 4), - (0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 3, 1, 0, 0, 0, 0, 0, 0, 0, 3), - (0, 3, 0, 3, 0, 2, 0, 3, 0, 3, 3, 3, 2, 3, 2, 2, 2, 0, 3, 1, 3, 3, 3, 2, 3, 3, 0, 0, 3, 0, 3, 2, 2, 0, 2, 3, 1, 4, 3, 4, 3, 3, 2, 3, 1, 5, 4, 4, 0, 3, 1, 2, 1, 3, 0, 3, 1, 1, 2, 0, 2, 3, 1, 3, 1, 3, 0, 3, 0, 1, 0, 3, 3, 4, 4, 2, 1, 0, 2, 1, 0, 2, 4), - (0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 4, 2, 5, 1, 4, 0, 2, 0, 2, 1, 3, 1, 4, 0, 2, 1, 0, 0, 2, 1, 4, 1, 1, 0, 3, 3, 0, 5, 1, 3, 2, 3, 3, 1, 0, 3, 2, 3, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 4, 0, 1, 0, 3, 0, 2, 0, 1, 0, 3, 3, 3, 4, 3, 3, 0, 0, 0, 0, 2, 3), - (0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 1, 0, 0, 0, 0, 0, 3), - (0, 1, 0, 3, 0, 4, 0, 3, 0, 2, 4, 3, 1, 0, 3, 2, 2, 1, 3, 1, 2, 2, 3, 1, 1, 1, 2, 1, 3, 0, 1, 2, 0, 1, 3, 2, 1, 3, 0, 5, 5, 1, 0, 0, 1, 3, 2, 1, 0, 3, 0, 0, 1, 0, 0, 0, 0, 0, 3, 4, 0, 1, 1, 1, 3, 2, 0, 2, 0, 1, 0, 2, 3, 3, 1, 2, 3, 0, 1, 0, 1, 0, 4), - (0, 0, 0, 1, 0, 3, 0, 3, 0, 2, 2, 1, 0, 0, 4, 0, 3, 0, 3, 1, 3, 0, 3, 0, 3, 0, 1, 0, 3, 0, 3, 1, 3, 0, 3, 3, 0, 0, 1, 2, 1, 1, 1, 0, 1, 2, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 1, 2, 0, 0, 2, 0, 0, 0, 0, 2, 3, 3, 3, 3, 0, 0, 0, 0, 1, 4), - (0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 3, 1, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 2, 0, 2, 3, 0, 0, 2, 2, 3, 1, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 0, 0, 0, 0, 2, 3), - (2, 4, 0, 5, 0, 5, 0, 4, 0, 3, 4, 3, 3, 3, 4, 3, 3, 3, 4, 3, 4, 4, 5, 4, 5, 5, 5, 2, 3, 0, 5, 5, 4, 1, 5, 4, 3, 1, 5, 4, 3, 4, 4, 3, 3, 4, 3, 3, 0, 3, 2, 0, 2, 3, 0, 3, 0, 0, 3, 3, 0, 5, 3, 2, 3, 3, 0, 3, 0, 3, 0, 3, 4, 5, 4, 5, 3, 0, 4, 3, 0, 3, 4), - (0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 3, 4, 3, 2, 3, 2, 3, 0, 4, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 2, 4, 3, 3, 1, 3, 4, 3, 4, 4, 4, 3, 4, 4, 3, 2, 4, 4, 1, 0, 2, 0, 0, 1, 1, 0, 2, 0, 0, 3, 1, 0, 5, 3, 2, 1, 3, 0, 3, 0, 1, 2, 4, 3, 2, 4, 3, 3, 0, 3, 2, 0, 4, 4), - (0, 3, 0, 3, 0, 1, 0, 0, 0, 1, 4, 3, 3, 2, 3, 1, 3, 1, 4, 2, 3, 2, 4, 2, 3, 4, 3, 0, 2, 2, 3, 3, 3, 0, 3, 3, 3, 0, 3, 4, 1, 3, 3, 0, 3, 4, 3, 3, 0, 1, 1, 0, 1, 0, 0, 0, 4, 0, 3, 0, 0, 3, 1, 2, 1, 3, 0, 4, 0, 1, 0, 4, 3, 3, 4, 3, 3, 0, 2, 0, 0, 3, 3), - (0, 3, 0, 4, 0, 1, 0, 3, 0, 3, 4, 3, 3, 0, 3, 3, 3, 1, 3, 1, 3, 3, 4, 3, 3, 3, 0, 0, 3, 1, 5, 3, 3, 1, 3, 3, 2, 5, 4, 3, 3, 4, 5, 3, 2, 5, 3, 4, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 1, 1, 0, 4, 2, 2, 1, 3, 0, 3, 0, 2, 0, 4, 4, 3, 5, 3, 2, 0, 1, 1, 0, 3, 4), - (0, 5, 0, 4, 0, 5, 0, 2, 0, 4, 4, 3, 3, 2, 3, 3, 3, 1, 4, 3, 4, 1, 5, 3, 4, 3, 4, 0, 4, 2, 4, 3, 4, 1, 5, 4, 0, 4, 4, 4, 4, 5, 4, 1, 3, 5, 4, 2, 1, 4, 1, 1, 3, 2, 0, 3, 1, 0, 3, 2, 1, 4, 3, 3, 3, 4, 0, 4, 0, 3, 0, 4, 4, 4, 3, 3, 3, 0, 4, 2, 0, 3, 4), - (1, 4, 0, 4, 0, 3, 0, 1, 0, 3, 3, 3, 1, 1, 3, 3, 2, 2, 3, 3, 1, 0, 3, 2, 2, 1, 2, 0, 3, 1, 2, 1, 2, 0, 3, 2, 0, 2, 2, 3, 3, 4, 3, 0, 3, 3, 1, 2, 0, 1, 1, 3, 1, 2, 0, 0, 3, 0, 1, 1, 0, 3, 2, 2, 3, 3, 0, 3, 0, 0, 0, 2, 3, 3, 4, 3, 3, 0, 1, 0, 0, 1, 4), - (0, 4, 0, 4, 0, 4, 0, 0, 0, 3, 4, 4, 3, 1, 4, 2, 3, 2, 3, 3, 3, 1, 4, 3, 4, 0, 3, 0, 4, 2, 3, 3, 2, 2, 5, 4, 2, 1, 3, 4, 3, 4, 3, 1, 3, 3, 4, 2, 0, 2, 1, 0, 3, 3, 0, 0, 2, 0, 3, 1, 0, 4, 4, 3, 4, 3, 0, 4, 0, 1, 0, 2, 4, 4, 4, 4, 4, 0, 3, 2, 0, 3, 3), - (0, 0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 2, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2), - (0, 2, 0, 3, 0, 4, 0, 4, 0, 1, 3, 3, 3, 0, 4, 0, 2, 1, 2, 1, 1, 1, 2, 0, 3, 1, 1, 0, 1, 0, 3, 1, 0, 0, 3, 3, 2, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 2, 0, 2, 2, 0, 3, 1, 0, 0, 1, 0, 1, 1, 0, 1, 2, 0, 3, 0, 0, 0, 0, 1, 0, 0, 3, 3, 4, 3, 1, 0, 1, 0, 3, 0, 2), - (0, 0, 0, 3, 0, 5, 0, 0, 0, 0, 1, 0, 2, 0, 3, 1, 0, 1, 3, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 4, 0, 0, 0, 2, 3, 0, 1, 4, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 3, 0, 0, 0, 0, 0, 3), - (0, 2, 0, 5, 0, 5, 0, 1, 0, 2, 4, 3, 3, 2, 5, 1, 3, 2, 3, 3, 3, 0, 4, 1, 2, 0, 3, 0, 4, 0, 2, 2, 1, 1, 5, 3, 0, 0, 1, 4, 2, 3, 2, 0, 3, 3, 3, 2, 0, 2, 4, 1, 1, 2, 0, 1, 1, 0, 3, 1, 0, 1, 3, 1, 2, 3, 0, 2, 0, 0, 0, 1, 3, 5, 4, 4, 4, 0, 3, 0, 0, 1, 3), - (0, 4, 0, 5, 0, 4, 0, 4, 0, 4, 5, 4, 3, 3, 4, 3, 3, 3, 4, 3, 4, 4, 5, 3, 4, 5, 4, 2, 4, 2, 3, 4, 3, 1, 4, 4, 1, 3, 5, 4, 4, 5, 5, 4, 4, 5, 5, 5, 2, 3, 3, 1, 4, 3, 1, 3, 3, 0, 3, 3, 1, 4, 3, 4, 4, 4, 0, 3, 0, 4, 0, 3, 3, 4, 4, 5, 0, 0, 4, 3, 0, 4, 5), - (0, 4, 0, 4, 0, 3, 0, 3, 0, 3, 4, 4, 4, 3, 3, 2, 4, 3, 4, 3, 4, 3, 5, 3, 4, 3, 2, 1, 4, 2, 4, 4, 3, 1, 3, 4, 2, 4, 5, 5, 3, 4, 5, 4, 1, 5, 4, 3, 0, 3, 2, 2, 3, 2, 1, 3, 1, 0, 3, 3, 3, 5, 3, 3, 3, 5, 4, 4, 2, 3, 3, 4, 3, 3, 3, 2, 1, 0, 3, 2, 1, 4, 3), - (0, 4, 0, 5, 0, 4, 0, 3, 0, 3, 5, 5, 3, 2, 4, 3, 4, 0, 5, 4, 4, 1, 4, 4, 4, 3, 3, 3, 4, 3, 5, 5, 2, 3, 3, 4, 1, 2, 5, 5, 3, 5, 5, 2, 3, 5, 5, 4, 0, 3, 2, 0, 3, 3, 1, 1, 5, 1, 4, 1, 0, 4, 3, 2, 3, 5, 0, 4, 0, 3, 0, 5, 4, 3, 4, 3, 0, 0, 4, 1, 0, 4, 4), - (1, 3, 0, 4, 0, 2, 0, 2, 0, 2, 5, 5, 3, 3, 3, 3, 3, 0, 4, 2, 3, 4, 4, 4, 3, 4, 0, 0, 3, 4, 5, 4, 3, 3, 3, 3, 2, 5, 5, 4, 5, 5, 5, 4, 3, 5, 5, 5, 1, 3, 1, 0, 1, 0, 0, 3, 2, 0, 4, 2, 0, 5, 2, 3, 2, 4, 1, 3, 0, 3, 0, 4, 5, 4, 5, 4, 3, 0, 4, 2, 0, 5, 4), - (0, 3, 0, 4, 0, 5, 0, 3, 0, 3, 4, 4, 3, 2, 3, 2, 3, 3, 3, 3, 3, 2, 4, 3, 3, 2, 2, 0, 3, 3, 3, 3, 3, 1, 3, 3, 3, 0, 4, 4, 3, 4, 4, 1, 1, 4, 4, 2, 0, 3, 1, 0, 1, 1, 0, 4, 1, 0, 2, 3, 1, 3, 3, 1, 3, 4, 0, 3, 0, 1, 0, 3, 1, 3, 0, 0, 1, 0, 2, 0, 0, 4, 4), - (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), - (0, 3, 0, 3, 0, 2, 0, 3, 0, 1, 5, 4, 3, 3, 3, 1, 4, 2, 1, 2, 3, 4, 4, 2, 4, 4, 5, 0, 3, 1, 4, 3, 4, 0, 4, 3, 3, 3, 2, 3, 2, 5, 3, 4, 3, 2, 2, 3, 0, 0, 3, 0, 2, 1, 0, 1, 2, 0, 0, 0, 0, 2, 1, 1, 3, 1, 0, 2, 0, 4, 0, 3, 4, 4, 4, 5, 2, 0, 2, 0, 0, 1, 3), - (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 4, 2, 1, 1, 0, 1, 0, 3, 2, 0, 0, 3, 1, 1, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 4, 0, 4, 2, 1, 0, 0, 0, 0, 0, 1), - (0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 2, 0, 2, 1, 0, 0, 1, 2, 1, 0, 1, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 1, 0, 0, 0, 0, 0, 1, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2), - (0, 4, 0, 4, 0, 4, 0, 3, 0, 4, 4, 3, 4, 2, 4, 3, 2, 0, 4, 4, 4, 3, 5, 3, 5, 3, 3, 2, 4, 2, 4, 3, 4, 3, 1, 4, 0, 2, 3, 4, 4, 4, 3, 3, 3, 4, 4, 4, 3, 4, 1, 3, 4, 3, 2, 1, 2, 1, 3, 3, 3, 4, 4, 3, 3, 5, 0, 4, 0, 3, 0, 4, 3, 3, 3, 2, 1, 0, 3, 0, 0, 3, 3), - (0, 4, 0, 3, 0, 3, 0, 3, 0, 3, 5, 5, 3, 3, 3, 3, 4, 3, 4, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 4, 3, 5, 3, 3, 1, 3, 2, 4, 5, 5, 5, 5, 4, 3, 4, 5, 5, 3, 2, 2, 3, 3, 3, 3, 2, 3, 3, 1, 2, 3, 2, 4, 3, 3, 3, 4, 0, 4, 0, 2, 0, 4, 3, 2, 2, 1, 2, 0, 3, 0, 0, 4, 1), -) -# fmt: on - - -class JapaneseContextAnalysis: - NUM_OF_CATEGORY = 6 - DONT_KNOW = -1 - ENOUGH_REL_THRESHOLD = 100 - MAX_REL_THRESHOLD = 1000 - MINIMUM_DATA_THRESHOLD = 4 - - def __init__(self) -> None: - self._total_rel = 0 - self._rel_sample: List[int] = [] - self._need_to_skip_char_num = 0 - self._last_char_order = -1 - self._done = False - self.reset() - - def reset(self) -> None: - self._total_rel = 0 # total sequence received - # category counters, each integer counts sequence in its category - self._rel_sample = [0] * self.NUM_OF_CATEGORY - # if last byte in current buffer is not the last byte of a character, - # we need to know how many bytes to skip in next buffer - self._need_to_skip_char_num = 0 - self._last_char_order = -1 # The order of previous char - # If this flag is set to True, detection is done and conclusion has - # been made - self._done = False - - def feed(self, byte_str: Union[bytes, bytearray], num_bytes: int) -> None: - if self._done: - return - - # The buffer we got is byte oriented, and a character may span in more than one - # buffers. In case the last one or two byte in last buffer is not - # complete, we record how many byte needed to complete that character - # and skip these bytes here. We can choose to record those bytes as - # well and analyse the character once it is complete, but since a - # character will not make much difference, by simply skipping - # this character will simply our logic and improve performance. - i = self._need_to_skip_char_num - while i < num_bytes: - order, char_len = self.get_order(byte_str[i : i + 2]) - i += char_len - if i > num_bytes: - self._need_to_skip_char_num = i - num_bytes - self._last_char_order = -1 - else: - if (order != -1) and (self._last_char_order != -1): - self._total_rel += 1 - if self._total_rel > self.MAX_REL_THRESHOLD: - self._done = True - break - self._rel_sample[ - jp2_char_context[self._last_char_order][order] - ] += 1 - self._last_char_order = order - - def got_enough_data(self) -> bool: - return self._total_rel > self.ENOUGH_REL_THRESHOLD - - def get_confidence(self) -> float: - # This is just one way to calculate confidence. It works well for me. - if self._total_rel > self.MINIMUM_DATA_THRESHOLD: - return (self._total_rel - self._rel_sample[0]) / self._total_rel - return self.DONT_KNOW - - def get_order(self, _: Union[bytes, bytearray]) -> Tuple[int, int]: - return -1, 1 - - -class SJISContextAnalysis(JapaneseContextAnalysis): - def __init__(self) -> None: - super().__init__() - self._charset_name = "SHIFT_JIS" - - @property - def charset_name(self) -> str: - return self._charset_name - - def get_order(self, byte_str: Union[bytes, bytearray]) -> Tuple[int, int]: - if not byte_str: - return -1, 1 - # find out current char's byte length - first_char = byte_str[0] - if (0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC): - char_len = 2 - if (first_char == 0x87) or (0xFA <= first_char <= 0xFC): - self._charset_name = "CP932" - else: - char_len = 1 - - # return its order if it is hiragana - if len(byte_str) > 1: - second_char = byte_str[1] - if (first_char == 202) and (0x9F <= second_char <= 0xF1): - return second_char - 0x9F, char_len - - return -1, char_len - - -class EUCJPContextAnalysis(JapaneseContextAnalysis): - def get_order(self, byte_str: Union[bytes, bytearray]) -> Tuple[int, int]: - if not byte_str: - return -1, 1 - # find out current char's byte length - first_char = byte_str[0] - if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE): - char_len = 2 - elif first_char == 0x8F: - char_len = 3 - else: - char_len = 1 - - # return its order if it is hiragana - if len(byte_str) > 1: - second_char = byte_str[1] - if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3): - return second_char - 0xA1, char_len - - return -1, char_len diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langbulgarianmodel.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langbulgarianmodel.py deleted file mode 100644 index 9946682..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langbulgarianmodel.py +++ /dev/null @@ -1,4649 +0,0 @@ -from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel - -# 3: Positive -# 2: Likely -# 1: Unlikely -# 0: Negative - -BULGARIAN_LANG_MODEL = { - 63: { # 'e' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 0, # 'а' - 18: 1, # 'б' - 9: 1, # 'в' - 20: 1, # 'г' - 11: 1, # 'д' - 3: 1, # 'е' - 23: 1, # 'ж' - 15: 1, # 'з' - 2: 0, # 'и' - 26: 1, # 'й' - 12: 1, # 'к' - 10: 1, # 'л' - 14: 1, # 'м' - 6: 1, # 'н' - 4: 1, # 'о' - 13: 1, # 'п' - 7: 1, # 'р' - 8: 1, # 'с' - 5: 1, # 'т' - 19: 0, # 'у' - 29: 1, # 'ф' - 25: 1, # 'х' - 22: 0, # 'ц' - 21: 1, # 'ч' - 27: 1, # 'ш' - 24: 1, # 'щ' - 17: 0, # 'ъ' - 52: 0, # 'ь' - 42: 0, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 45: { # '\xad' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 1, # 'Б' - 35: 1, # 'В' - 43: 0, # 'Г' - 37: 1, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 1, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 0, # 'Л' - 38: 1, # 'М' - 36: 0, # 'Н' - 41: 1, # 'О' - 30: 1, # 'П' - 39: 1, # 'Р' - 28: 1, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 1, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 0, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 0, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 0, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 0, # 'о' - 13: 0, # 'п' - 7: 0, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 0, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 0, # 'ъ' - 52: 0, # 'ь' - 42: 0, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 31: { # 'А' - 63: 0, # 'e' - 45: 1, # '\xad' - 31: 1, # 'А' - 32: 1, # 'Б' - 35: 2, # 'В' - 43: 1, # 'Г' - 37: 2, # 'Д' - 44: 2, # 'Е' - 55: 1, # 'Ж' - 47: 2, # 'З' - 40: 1, # 'И' - 59: 1, # 'Й' - 33: 1, # 'К' - 46: 2, # 'Л' - 38: 1, # 'М' - 36: 2, # 'Н' - 41: 1, # 'О' - 30: 2, # 'П' - 39: 2, # 'Р' - 28: 2, # 'С' - 34: 2, # 'Т' - 51: 1, # 'У' - 48: 2, # 'Ф' - 49: 1, # 'Х' - 53: 1, # 'Ц' - 50: 1, # 'Ч' - 54: 1, # 'Ш' - 57: 2, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 1, # 'Я' - 1: 1, # 'а' - 18: 2, # 'б' - 9: 2, # 'в' - 20: 2, # 'г' - 11: 2, # 'д' - 3: 1, # 'е' - 23: 1, # 'ж' - 15: 2, # 'з' - 2: 0, # 'и' - 26: 2, # 'й' - 12: 2, # 'к' - 10: 3, # 'л' - 14: 2, # 'м' - 6: 3, # 'н' - 4: 0, # 'о' - 13: 2, # 'п' - 7: 2, # 'р' - 8: 2, # 'с' - 5: 2, # 'т' - 19: 1, # 'у' - 29: 2, # 'ф' - 25: 1, # 'х' - 22: 1, # 'ц' - 21: 1, # 'ч' - 27: 1, # 'ш' - 24: 0, # 'щ' - 17: 0, # 'ъ' - 52: 0, # 'ь' - 42: 0, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 32: { # 'Б' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 2, # 'А' - 32: 2, # 'Б' - 35: 1, # 'В' - 43: 1, # 'Г' - 37: 2, # 'Д' - 44: 1, # 'Е' - 55: 1, # 'Ж' - 47: 2, # 'З' - 40: 1, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 2, # 'Н' - 41: 2, # 'О' - 30: 1, # 'П' - 39: 1, # 'Р' - 28: 2, # 'С' - 34: 2, # 'Т' - 51: 1, # 'У' - 48: 2, # 'Ф' - 49: 1, # 'Х' - 53: 1, # 'Ц' - 50: 1, # 'Ч' - 54: 0, # 'Ш' - 57: 1, # 'Щ' - 61: 2, # 'Ъ' - 60: 1, # 'Ю' - 56: 1, # 'Я' - 1: 3, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 1, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 2, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 2, # 'р' - 8: 1, # 'с' - 5: 0, # 'т' - 19: 2, # 'у' - 29: 0, # 'ф' - 25: 1, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 3, # 'ъ' - 52: 1, # 'ь' - 42: 1, # 'ю' - 16: 2, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 35: { # 'В' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 2, # 'А' - 32: 1, # 'Б' - 35: 1, # 'В' - 43: 0, # 'Г' - 37: 1, # 'Д' - 44: 2, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 2, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Н' - 41: 1, # 'О' - 30: 1, # 'П' - 39: 2, # 'Р' - 28: 2, # 'С' - 34: 1, # 'Т' - 51: 1, # 'У' - 48: 2, # 'Ф' - 49: 0, # 'Х' - 53: 1, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 1, # 'Ъ' - 60: 1, # 'Ю' - 56: 2, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 1, # 'д' - 3: 3, # 'е' - 23: 1, # 'ж' - 15: 2, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 2, # 'л' - 14: 1, # 'м' - 6: 2, # 'н' - 4: 2, # 'о' - 13: 1, # 'п' - 7: 2, # 'р' - 8: 2, # 'с' - 5: 2, # 'т' - 19: 1, # 'у' - 29: 0, # 'ф' - 25: 1, # 'х' - 22: 0, # 'ц' - 21: 2, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ъ' - 52: 1, # 'ь' - 42: 1, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 43: { # 'Г' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 2, # 'А' - 32: 1, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 1, # 'Д' - 44: 2, # 'Е' - 55: 0, # 'Ж' - 47: 1, # 'З' - 40: 1, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 0, # 'М' - 36: 1, # 'Н' - 41: 1, # 'О' - 30: 0, # 'П' - 39: 1, # 'Р' - 28: 1, # 'С' - 34: 0, # 'Т' - 51: 1, # 'У' - 48: 1, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 1, # 'Щ' - 61: 1, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 2, # 'а' - 18: 1, # 'б' - 9: 1, # 'в' - 20: 0, # 'г' - 11: 1, # 'д' - 3: 3, # 'е' - 23: 1, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 2, # 'л' - 14: 1, # 'м' - 6: 1, # 'н' - 4: 2, # 'о' - 13: 0, # 'п' - 7: 2, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 2, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 1, # 'щ' - 17: 2, # 'ъ' - 52: 1, # 'ь' - 42: 1, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 37: { # 'Д' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 2, # 'А' - 32: 1, # 'Б' - 35: 2, # 'В' - 43: 1, # 'Г' - 37: 2, # 'Д' - 44: 2, # 'Е' - 55: 2, # 'Ж' - 47: 1, # 'З' - 40: 2, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Н' - 41: 2, # 'О' - 30: 2, # 'П' - 39: 1, # 'Р' - 28: 2, # 'С' - 34: 1, # 'Т' - 51: 1, # 'У' - 48: 1, # 'Ф' - 49: 0, # 'Х' - 53: 1, # 'Ц' - 50: 1, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 1, # 'Ъ' - 60: 1, # 'Ю' - 56: 1, # 'Я' - 1: 3, # 'а' - 18: 0, # 'б' - 9: 2, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 3, # 'е' - 23: 3, # 'ж' - 15: 1, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 1, # 'л' - 14: 1, # 'м' - 6: 2, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 2, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 2, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ъ' - 52: 1, # 'ь' - 42: 2, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 44: { # 'Е' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 1, # 'А' - 32: 1, # 'Б' - 35: 2, # 'В' - 43: 1, # 'Г' - 37: 1, # 'Д' - 44: 1, # 'Е' - 55: 1, # 'Ж' - 47: 1, # 'З' - 40: 1, # 'И' - 59: 1, # 'Й' - 33: 2, # 'К' - 46: 2, # 'Л' - 38: 1, # 'М' - 36: 2, # 'Н' - 41: 2, # 'О' - 30: 1, # 'П' - 39: 2, # 'Р' - 28: 2, # 'С' - 34: 2, # 'Т' - 51: 1, # 'У' - 48: 2, # 'Ф' - 49: 1, # 'Х' - 53: 2, # 'Ц' - 50: 1, # 'Ч' - 54: 1, # 'Ш' - 57: 1, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 1, # 'Я' - 1: 0, # 'а' - 18: 1, # 'б' - 9: 2, # 'в' - 20: 1, # 'г' - 11: 2, # 'д' - 3: 0, # 'е' - 23: 1, # 'ж' - 15: 1, # 'з' - 2: 0, # 'и' - 26: 1, # 'й' - 12: 2, # 'к' - 10: 2, # 'л' - 14: 2, # 'м' - 6: 2, # 'н' - 4: 0, # 'о' - 13: 1, # 'п' - 7: 2, # 'р' - 8: 2, # 'с' - 5: 1, # 'т' - 19: 1, # 'у' - 29: 1, # 'ф' - 25: 1, # 'х' - 22: 0, # 'ц' - 21: 1, # 'ч' - 27: 1, # 'ш' - 24: 1, # 'щ' - 17: 1, # 'ъ' - 52: 0, # 'ь' - 42: 1, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 55: { # 'Ж' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 1, # 'А' - 32: 0, # 'Б' - 35: 1, # 'В' - 43: 0, # 'Г' - 37: 1, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 1, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 1, # 'Н' - 41: 1, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 1, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 2, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 1, # 'д' - 3: 2, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 2, # 'о' - 13: 1, # 'п' - 7: 1, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 1, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ъ' - 52: 1, # 'ь' - 42: 1, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 47: { # 'З' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 2, # 'А' - 32: 1, # 'Б' - 35: 1, # 'В' - 43: 1, # 'Г' - 37: 1, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 1, # 'З' - 40: 1, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 2, # 'Н' - 41: 1, # 'О' - 30: 1, # 'П' - 39: 1, # 'Р' - 28: 1, # 'С' - 34: 1, # 'Т' - 51: 1, # 'У' - 48: 0, # 'Ф' - 49: 1, # 'Х' - 53: 1, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 1, # 'Ъ' - 60: 0, # 'Ю' - 56: 1, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 2, # 'в' - 20: 1, # 'г' - 11: 2, # 'д' - 3: 2, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 1, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 2, # 'л' - 14: 1, # 'м' - 6: 1, # 'н' - 4: 1, # 'о' - 13: 0, # 'п' - 7: 1, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 1, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ъ' - 52: 0, # 'ь' - 42: 1, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 40: { # 'И' - 63: 0, # 'e' - 45: 1, # '\xad' - 31: 1, # 'А' - 32: 1, # 'Б' - 35: 1, # 'В' - 43: 1, # 'Г' - 37: 1, # 'Д' - 44: 2, # 'Е' - 55: 1, # 'Ж' - 47: 2, # 'З' - 40: 1, # 'И' - 59: 1, # 'Й' - 33: 2, # 'К' - 46: 2, # 'Л' - 38: 2, # 'М' - 36: 2, # 'Н' - 41: 1, # 'О' - 30: 1, # 'П' - 39: 2, # 'Р' - 28: 2, # 'С' - 34: 2, # 'Т' - 51: 0, # 'У' - 48: 1, # 'Ф' - 49: 1, # 'Х' - 53: 1, # 'Ц' - 50: 1, # 'Ч' - 54: 1, # 'Ш' - 57: 1, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 2, # 'Я' - 1: 1, # 'а' - 18: 1, # 'б' - 9: 3, # 'в' - 20: 2, # 'г' - 11: 1, # 'д' - 3: 1, # 'е' - 23: 0, # 'ж' - 15: 3, # 'з' - 2: 0, # 'и' - 26: 1, # 'й' - 12: 1, # 'к' - 10: 2, # 'л' - 14: 2, # 'м' - 6: 2, # 'н' - 4: 0, # 'о' - 13: 1, # 'п' - 7: 2, # 'р' - 8: 2, # 'с' - 5: 2, # 'т' - 19: 0, # 'у' - 29: 1, # 'ф' - 25: 1, # 'х' - 22: 1, # 'ц' - 21: 1, # 'ч' - 27: 1, # 'ш' - 24: 1, # 'щ' - 17: 0, # 'ъ' - 52: 0, # 'ь' - 42: 0, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 59: { # 'Й' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 1, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Н' - 41: 1, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 1, # 'С' - 34: 1, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 1, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 1, # 'Я' - 1: 0, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 1, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 0, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 2, # 'о' - 13: 0, # 'п' - 7: 0, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 0, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ъ' - 52: 0, # 'ь' - 42: 0, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 33: { # 'К' - 63: 0, # 'e' - 45: 1, # '\xad' - 31: 2, # 'А' - 32: 1, # 'Б' - 35: 1, # 'В' - 43: 1, # 'Г' - 37: 1, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 1, # 'З' - 40: 2, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 0, # 'М' - 36: 2, # 'Н' - 41: 2, # 'О' - 30: 2, # 'П' - 39: 1, # 'Р' - 28: 2, # 'С' - 34: 1, # 'Т' - 51: 1, # 'У' - 48: 1, # 'Ф' - 49: 1, # 'Х' - 53: 1, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 1, # 'Ъ' - 60: 1, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 0, # 'б' - 9: 1, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 2, # 'е' - 23: 1, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 2, # 'л' - 14: 1, # 'м' - 6: 2, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 3, # 'р' - 8: 1, # 'с' - 5: 0, # 'т' - 19: 2, # 'у' - 29: 0, # 'ф' - 25: 1, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 1, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ъ' - 52: 1, # 'ь' - 42: 2, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 46: { # 'Л' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 2, # 'А' - 32: 1, # 'Б' - 35: 1, # 'В' - 43: 2, # 'Г' - 37: 1, # 'Д' - 44: 2, # 'Е' - 55: 0, # 'Ж' - 47: 1, # 'З' - 40: 2, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 0, # 'М' - 36: 1, # 'Н' - 41: 2, # 'О' - 30: 1, # 'П' - 39: 0, # 'Р' - 28: 1, # 'С' - 34: 1, # 'Т' - 51: 1, # 'У' - 48: 0, # 'Ф' - 49: 1, # 'Х' - 53: 1, # 'Ц' - 50: 1, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 1, # 'Ъ' - 60: 1, # 'Ю' - 56: 1, # 'Я' - 1: 2, # 'а' - 18: 0, # 'б' - 9: 1, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 2, # 'о' - 13: 0, # 'п' - 7: 0, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 2, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ъ' - 52: 1, # 'ь' - 42: 2, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 38: { # 'М' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 2, # 'А' - 32: 1, # 'Б' - 35: 2, # 'В' - 43: 0, # 'Г' - 37: 1, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 1, # 'З' - 40: 2, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Н' - 41: 2, # 'О' - 30: 1, # 'П' - 39: 1, # 'Р' - 28: 2, # 'С' - 34: 1, # 'Т' - 51: 1, # 'У' - 48: 1, # 'Ф' - 49: 0, # 'Х' - 53: 1, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 1, # 'Ъ' - 60: 0, # 'Ю' - 56: 1, # 'Я' - 1: 3, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 2, # 'л' - 14: 0, # 'м' - 6: 2, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 1, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 2, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ъ' - 52: 1, # 'ь' - 42: 2, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 36: { # 'Н' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 2, # 'А' - 32: 2, # 'Б' - 35: 1, # 'В' - 43: 1, # 'Г' - 37: 2, # 'Д' - 44: 2, # 'Е' - 55: 1, # 'Ж' - 47: 1, # 'З' - 40: 2, # 'И' - 59: 1, # 'Й' - 33: 2, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Н' - 41: 2, # 'О' - 30: 1, # 'П' - 39: 1, # 'Р' - 28: 2, # 'С' - 34: 2, # 'Т' - 51: 1, # 'У' - 48: 1, # 'Ф' - 49: 1, # 'Х' - 53: 1, # 'Ц' - 50: 1, # 'Ч' - 54: 1, # 'Ш' - 57: 0, # 'Щ' - 61: 1, # 'Ъ' - 60: 1, # 'Ю' - 56: 1, # 'Я' - 1: 3, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 1, # 'г' - 11: 0, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 0, # 'р' - 8: 0, # 'с' - 5: 1, # 'т' - 19: 1, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 1, # 'ш' - 24: 0, # 'щ' - 17: 0, # 'ъ' - 52: 0, # 'ь' - 42: 2, # 'ю' - 16: 2, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 41: { # 'О' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 1, # 'А' - 32: 1, # 'Б' - 35: 2, # 'В' - 43: 1, # 'Г' - 37: 2, # 'Д' - 44: 1, # 'Е' - 55: 1, # 'Ж' - 47: 1, # 'З' - 40: 1, # 'И' - 59: 1, # 'Й' - 33: 2, # 'К' - 46: 2, # 'Л' - 38: 2, # 'М' - 36: 2, # 'Н' - 41: 2, # 'О' - 30: 1, # 'П' - 39: 2, # 'Р' - 28: 2, # 'С' - 34: 2, # 'Т' - 51: 1, # 'У' - 48: 1, # 'Ф' - 49: 1, # 'Х' - 53: 0, # 'Ц' - 50: 1, # 'Ч' - 54: 1, # 'Ш' - 57: 1, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 1, # 'Я' - 1: 1, # 'а' - 18: 2, # 'б' - 9: 2, # 'в' - 20: 2, # 'г' - 11: 1, # 'д' - 3: 1, # 'е' - 23: 1, # 'ж' - 15: 1, # 'з' - 2: 0, # 'и' - 26: 1, # 'й' - 12: 2, # 'к' - 10: 2, # 'л' - 14: 1, # 'м' - 6: 1, # 'н' - 4: 0, # 'о' - 13: 2, # 'п' - 7: 2, # 'р' - 8: 2, # 'с' - 5: 3, # 'т' - 19: 1, # 'у' - 29: 1, # 'ф' - 25: 1, # 'х' - 22: 1, # 'ц' - 21: 2, # 'ч' - 27: 0, # 'ш' - 24: 2, # 'щ' - 17: 0, # 'ъ' - 52: 0, # 'ь' - 42: 0, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 30: { # 'П' - 63: 0, # 'e' - 45: 1, # '\xad' - 31: 2, # 'А' - 32: 1, # 'Б' - 35: 1, # 'В' - 43: 1, # 'Г' - 37: 1, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 1, # 'З' - 40: 2, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Н' - 41: 2, # 'О' - 30: 2, # 'П' - 39: 2, # 'Р' - 28: 2, # 'С' - 34: 1, # 'Т' - 51: 2, # 'У' - 48: 1, # 'Ф' - 49: 0, # 'Х' - 53: 1, # 'Ц' - 50: 1, # 'Ч' - 54: 1, # 'Ш' - 57: 0, # 'Щ' - 61: 1, # 'Ъ' - 60: 1, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 2, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 3, # 'л' - 14: 0, # 'м' - 6: 1, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 3, # 'р' - 8: 1, # 'с' - 5: 1, # 'т' - 19: 2, # 'у' - 29: 1, # 'ф' - 25: 1, # 'х' - 22: 0, # 'ц' - 21: 1, # 'ч' - 27: 1, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ъ' - 52: 1, # 'ь' - 42: 1, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 39: { # 'Р' - 63: 0, # 'e' - 45: 1, # '\xad' - 31: 2, # 'А' - 32: 1, # 'Б' - 35: 1, # 'В' - 43: 2, # 'Г' - 37: 2, # 'Д' - 44: 2, # 'Е' - 55: 0, # 'Ж' - 47: 1, # 'З' - 40: 2, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 0, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Н' - 41: 2, # 'О' - 30: 2, # 'П' - 39: 1, # 'Р' - 28: 1, # 'С' - 34: 1, # 'Т' - 51: 1, # 'У' - 48: 1, # 'Ф' - 49: 1, # 'Х' - 53: 1, # 'Ц' - 50: 1, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 1, # 'Ъ' - 60: 1, # 'Ю' - 56: 1, # 'Я' - 1: 3, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 2, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 1, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 0, # 'р' - 8: 1, # 'с' - 5: 0, # 'т' - 19: 3, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ъ' - 52: 0, # 'ь' - 42: 1, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 28: { # 'С' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 3, # 'А' - 32: 2, # 'Б' - 35: 2, # 'В' - 43: 1, # 'Г' - 37: 2, # 'Д' - 44: 2, # 'Е' - 55: 1, # 'Ж' - 47: 1, # 'З' - 40: 2, # 'И' - 59: 0, # 'Й' - 33: 2, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Н' - 41: 2, # 'О' - 30: 2, # 'П' - 39: 1, # 'Р' - 28: 2, # 'С' - 34: 2, # 'Т' - 51: 1, # 'У' - 48: 1, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 1, # 'Ъ' - 60: 1, # 'Ю' - 56: 1, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 2, # 'в' - 20: 1, # 'г' - 11: 1, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 2, # 'к' - 10: 3, # 'л' - 14: 2, # 'м' - 6: 1, # 'н' - 4: 3, # 'о' - 13: 3, # 'п' - 7: 2, # 'р' - 8: 0, # 'с' - 5: 3, # 'т' - 19: 2, # 'у' - 29: 2, # 'ф' - 25: 1, # 'х' - 22: 1, # 'ц' - 21: 1, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 3, # 'ъ' - 52: 1, # 'ь' - 42: 1, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 34: { # 'Т' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 2, # 'А' - 32: 2, # 'Б' - 35: 1, # 'В' - 43: 0, # 'Г' - 37: 1, # 'Д' - 44: 2, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 2, # 'И' - 59: 0, # 'Й' - 33: 2, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Н' - 41: 2, # 'О' - 30: 1, # 'П' - 39: 2, # 'Р' - 28: 2, # 'С' - 34: 1, # 'Т' - 51: 1, # 'У' - 48: 1, # 'Ф' - 49: 0, # 'Х' - 53: 1, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 1, # 'Ъ' - 60: 0, # 'Ю' - 56: 1, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 1, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 1, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 3, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 2, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ъ' - 52: 0, # 'ь' - 42: 1, # 'ю' - 16: 2, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 51: { # 'У' - 63: 0, # 'e' - 45: 1, # '\xad' - 31: 1, # 'А' - 32: 1, # 'Б' - 35: 1, # 'В' - 43: 1, # 'Г' - 37: 1, # 'Д' - 44: 2, # 'Е' - 55: 1, # 'Ж' - 47: 1, # 'З' - 40: 1, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Н' - 41: 0, # 'О' - 30: 1, # 'П' - 39: 1, # 'Р' - 28: 1, # 'С' - 34: 2, # 'Т' - 51: 0, # 'У' - 48: 1, # 'Ф' - 49: 1, # 'Х' - 53: 1, # 'Ц' - 50: 1, # 'Ч' - 54: 1, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 1, # 'а' - 18: 1, # 'б' - 9: 2, # 'в' - 20: 1, # 'г' - 11: 1, # 'д' - 3: 2, # 'е' - 23: 1, # 'ж' - 15: 1, # 'з' - 2: 2, # 'и' - 26: 1, # 'й' - 12: 2, # 'к' - 10: 1, # 'л' - 14: 1, # 'м' - 6: 2, # 'н' - 4: 2, # 'о' - 13: 1, # 'п' - 7: 1, # 'р' - 8: 2, # 'с' - 5: 1, # 'т' - 19: 1, # 'у' - 29: 0, # 'ф' - 25: 1, # 'х' - 22: 0, # 'ц' - 21: 2, # 'ч' - 27: 1, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ъ' - 52: 0, # 'ь' - 42: 0, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 48: { # 'Ф' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 2, # 'А' - 32: 1, # 'Б' - 35: 1, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 2, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 0, # 'М' - 36: 1, # 'Н' - 41: 1, # 'О' - 30: 2, # 'П' - 39: 1, # 'Р' - 28: 2, # 'С' - 34: 1, # 'Т' - 51: 1, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 2, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 2, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 2, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 2, # 'о' - 13: 0, # 'п' - 7: 2, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 1, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ъ' - 52: 1, # 'ь' - 42: 1, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 49: { # 'Х' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 1, # 'А' - 32: 0, # 'Б' - 35: 1, # 'В' - 43: 1, # 'Г' - 37: 1, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 1, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Н' - 41: 1, # 'О' - 30: 1, # 'П' - 39: 1, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 1, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 2, # 'а' - 18: 0, # 'б' - 9: 1, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 2, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 1, # 'л' - 14: 1, # 'м' - 6: 0, # 'н' - 4: 2, # 'о' - 13: 0, # 'п' - 7: 2, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 2, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ъ' - 52: 1, # 'ь' - 42: 1, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 53: { # 'Ц' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 1, # 'А' - 32: 0, # 'Б' - 35: 1, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 2, # 'И' - 59: 0, # 'Й' - 33: 2, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 1, # 'Р' - 28: 2, # 'С' - 34: 0, # 'Т' - 51: 1, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 2, # 'а' - 18: 0, # 'б' - 9: 2, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 2, # 'е' - 23: 0, # 'ж' - 15: 1, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 1, # 'о' - 13: 0, # 'п' - 7: 1, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 1, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ъ' - 52: 0, # 'ь' - 42: 1, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 50: { # 'Ч' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 2, # 'А' - 32: 1, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 1, # 'З' - 40: 1, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 0, # 'М' - 36: 1, # 'Н' - 41: 1, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 1, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 2, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 3, # 'е' - 23: 1, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 1, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 2, # 'о' - 13: 0, # 'п' - 7: 1, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 2, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ъ' - 52: 1, # 'ь' - 42: 0, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 54: { # 'Ш' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 1, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 1, # 'З' - 40: 1, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 1, # 'Н' - 41: 1, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 1, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 2, # 'а' - 18: 0, # 'б' - 9: 2, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 2, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 1, # 'л' - 14: 1, # 'м' - 6: 1, # 'н' - 4: 2, # 'о' - 13: 1, # 'п' - 7: 1, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 2, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 1, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ъ' - 52: 1, # 'ь' - 42: 0, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 57: { # 'Щ' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 1, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 1, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 1, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 2, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 2, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 1, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 1, # 'о' - 13: 0, # 'п' - 7: 1, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 1, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ъ' - 52: 0, # 'ь' - 42: 0, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 61: { # 'Ъ' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 1, # 'Б' - 35: 1, # 'В' - 43: 0, # 'Г' - 37: 1, # 'Д' - 44: 0, # 'Е' - 55: 1, # 'Ж' - 47: 1, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 2, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Н' - 41: 0, # 'О' - 30: 1, # 'П' - 39: 2, # 'Р' - 28: 1, # 'С' - 34: 1, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 1, # 'Х' - 53: 1, # 'Ц' - 50: 1, # 'Ч' - 54: 1, # 'Ш' - 57: 1, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 0, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 0, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 0, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 1, # 'л' - 14: 0, # 'м' - 6: 1, # 'н' - 4: 0, # 'о' - 13: 0, # 'п' - 7: 1, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 0, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 0, # 'ъ' - 52: 0, # 'ь' - 42: 0, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 60: { # 'Ю' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 1, # 'А' - 32: 1, # 'Б' - 35: 0, # 'В' - 43: 1, # 'Г' - 37: 1, # 'Д' - 44: 0, # 'Е' - 55: 1, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 0, # 'М' - 36: 1, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 1, # 'Р' - 28: 1, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 0, # 'а' - 18: 1, # 'б' - 9: 1, # 'в' - 20: 2, # 'г' - 11: 1, # 'д' - 3: 0, # 'е' - 23: 2, # 'ж' - 15: 1, # 'з' - 2: 1, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 1, # 'л' - 14: 1, # 'м' - 6: 1, # 'н' - 4: 0, # 'о' - 13: 1, # 'п' - 7: 1, # 'р' - 8: 1, # 'с' - 5: 1, # 'т' - 19: 0, # 'у' - 29: 0, # 'ф' - 25: 1, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 0, # 'ъ' - 52: 0, # 'ь' - 42: 0, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 56: { # 'Я' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 1, # 'Б' - 35: 1, # 'В' - 43: 1, # 'Г' - 37: 1, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 1, # 'С' - 34: 2, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 0, # 'а' - 18: 1, # 'б' - 9: 1, # 'в' - 20: 1, # 'г' - 11: 1, # 'д' - 3: 0, # 'е' - 23: 0, # 'ж' - 15: 1, # 'з' - 2: 1, # 'и' - 26: 1, # 'й' - 12: 1, # 'к' - 10: 1, # 'л' - 14: 2, # 'м' - 6: 2, # 'н' - 4: 0, # 'о' - 13: 2, # 'п' - 7: 1, # 'р' - 8: 1, # 'с' - 5: 1, # 'т' - 19: 0, # 'у' - 29: 0, # 'ф' - 25: 1, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 1, # 'ш' - 24: 0, # 'щ' - 17: 0, # 'ъ' - 52: 0, # 'ь' - 42: 1, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 1: { # 'а' - 63: 1, # 'e' - 45: 1, # '\xad' - 31: 1, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 1, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 3, # 'г' - 11: 3, # 'д' - 3: 3, # 'е' - 23: 3, # 'ж' - 15: 3, # 'з' - 2: 3, # 'и' - 26: 3, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 3, # 'м' - 6: 3, # 'н' - 4: 2, # 'о' - 13: 3, # 'п' - 7: 3, # 'р' - 8: 3, # 'с' - 5: 3, # 'т' - 19: 3, # 'у' - 29: 3, # 'ф' - 25: 3, # 'х' - 22: 3, # 'ц' - 21: 3, # 'ч' - 27: 3, # 'ш' - 24: 3, # 'щ' - 17: 0, # 'ъ' - 52: 0, # 'ь' - 42: 1, # 'ю' - 16: 3, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 18: { # 'б' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 0, # 'б' - 9: 3, # 'в' - 20: 1, # 'г' - 11: 2, # 'д' - 3: 3, # 'е' - 23: 1, # 'ж' - 15: 1, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 3, # 'л' - 14: 2, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 1, # 'п' - 7: 3, # 'р' - 8: 3, # 'с' - 5: 0, # 'т' - 19: 3, # 'у' - 29: 0, # 'ф' - 25: 2, # 'х' - 22: 1, # 'ц' - 21: 1, # 'ч' - 27: 1, # 'ш' - 24: 3, # 'щ' - 17: 3, # 'ъ' - 52: 1, # 'ь' - 42: 2, # 'ю' - 16: 3, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 9: { # 'в' - 63: 1, # 'e' - 45: 1, # '\xad' - 31: 0, # 'А' - 32: 1, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 1, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 0, # 'в' - 20: 2, # 'г' - 11: 3, # 'д' - 3: 3, # 'е' - 23: 1, # 'ж' - 15: 3, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 2, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 2, # 'п' - 7: 3, # 'р' - 8: 3, # 'с' - 5: 3, # 'т' - 19: 2, # 'у' - 29: 0, # 'ф' - 25: 2, # 'х' - 22: 2, # 'ц' - 21: 3, # 'ч' - 27: 2, # 'ш' - 24: 1, # 'щ' - 17: 3, # 'ъ' - 52: 1, # 'ь' - 42: 2, # 'ю' - 16: 3, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 20: { # 'г' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 2, # 'в' - 20: 1, # 'г' - 11: 2, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 1, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 3, # 'л' - 14: 1, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 1, # 'п' - 7: 3, # 'р' - 8: 2, # 'с' - 5: 2, # 'т' - 19: 3, # 'у' - 29: 1, # 'ф' - 25: 1, # 'х' - 22: 0, # 'ц' - 21: 1, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 3, # 'ъ' - 52: 1, # 'ь' - 42: 1, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 11: { # 'д' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 2, # 'б' - 9: 3, # 'в' - 20: 2, # 'г' - 11: 2, # 'д' - 3: 3, # 'е' - 23: 3, # 'ж' - 15: 2, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 3, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 3, # 'п' - 7: 3, # 'р' - 8: 3, # 'с' - 5: 1, # 'т' - 19: 3, # 'у' - 29: 1, # 'ф' - 25: 2, # 'х' - 22: 2, # 'ц' - 21: 2, # 'ч' - 27: 1, # 'ш' - 24: 1, # 'щ' - 17: 3, # 'ъ' - 52: 1, # 'ь' - 42: 1, # 'ю' - 16: 3, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 3: { # 'е' - 63: 0, # 'e' - 45: 1, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 2, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 3, # 'г' - 11: 3, # 'д' - 3: 2, # 'е' - 23: 3, # 'ж' - 15: 3, # 'з' - 2: 2, # 'и' - 26: 3, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 3, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 3, # 'п' - 7: 3, # 'р' - 8: 3, # 'с' - 5: 3, # 'т' - 19: 2, # 'у' - 29: 3, # 'ф' - 25: 3, # 'х' - 22: 3, # 'ц' - 21: 3, # 'ч' - 27: 3, # 'ш' - 24: 3, # 'щ' - 17: 1, # 'ъ' - 52: 0, # 'ь' - 42: 1, # 'ю' - 16: 3, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 23: { # 'ж' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 3, # 'б' - 9: 2, # 'в' - 20: 1, # 'г' - 11: 3, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 2, # 'к' - 10: 1, # 'л' - 14: 1, # 'м' - 6: 3, # 'н' - 4: 2, # 'о' - 13: 1, # 'п' - 7: 1, # 'р' - 8: 1, # 'с' - 5: 1, # 'т' - 19: 2, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 1, # 'ц' - 21: 1, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ъ' - 52: 0, # 'ь' - 42: 0, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 15: { # 'з' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 3, # 'г' - 11: 3, # 'д' - 3: 3, # 'е' - 23: 1, # 'ж' - 15: 1, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 3, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 3, # 'п' - 7: 3, # 'р' - 8: 3, # 'с' - 5: 3, # 'т' - 19: 3, # 'у' - 29: 1, # 'ф' - 25: 2, # 'х' - 22: 2, # 'ц' - 21: 2, # 'ч' - 27: 2, # 'ш' - 24: 1, # 'щ' - 17: 2, # 'ъ' - 52: 1, # 'ь' - 42: 1, # 'ю' - 16: 2, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 2: { # 'и' - 63: 1, # 'e' - 45: 1, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 1, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 1, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 1, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 3, # 'г' - 11: 3, # 'д' - 3: 3, # 'е' - 23: 3, # 'ж' - 15: 3, # 'з' - 2: 3, # 'и' - 26: 3, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 3, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 3, # 'п' - 7: 3, # 'р' - 8: 3, # 'с' - 5: 3, # 'т' - 19: 2, # 'у' - 29: 3, # 'ф' - 25: 3, # 'х' - 22: 3, # 'ц' - 21: 3, # 'ч' - 27: 3, # 'ш' - 24: 3, # 'щ' - 17: 2, # 'ъ' - 52: 0, # 'ь' - 42: 1, # 'ю' - 16: 3, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 26: { # 'й' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 1, # 'а' - 18: 2, # 'б' - 9: 2, # 'в' - 20: 1, # 'г' - 11: 2, # 'д' - 3: 2, # 'е' - 23: 0, # 'ж' - 15: 2, # 'з' - 2: 1, # 'и' - 26: 0, # 'й' - 12: 3, # 'к' - 10: 2, # 'л' - 14: 2, # 'м' - 6: 3, # 'н' - 4: 2, # 'о' - 13: 1, # 'п' - 7: 2, # 'р' - 8: 3, # 'с' - 5: 3, # 'т' - 19: 1, # 'у' - 29: 2, # 'ф' - 25: 1, # 'х' - 22: 2, # 'ц' - 21: 2, # 'ч' - 27: 1, # 'ш' - 24: 1, # 'щ' - 17: 1, # 'ъ' - 52: 0, # 'ь' - 42: 0, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 12: { # 'к' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 1, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 1, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 3, # 'в' - 20: 2, # 'г' - 11: 1, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 2, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 3, # 'л' - 14: 2, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 1, # 'п' - 7: 3, # 'р' - 8: 3, # 'с' - 5: 3, # 'т' - 19: 3, # 'у' - 29: 1, # 'ф' - 25: 1, # 'х' - 22: 3, # 'ц' - 21: 2, # 'ч' - 27: 1, # 'ш' - 24: 0, # 'щ' - 17: 3, # 'ъ' - 52: 1, # 'ь' - 42: 2, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 10: { # 'л' - 63: 1, # 'e' - 45: 1, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 1, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 3, # 'г' - 11: 2, # 'д' - 3: 3, # 'е' - 23: 3, # 'ж' - 15: 2, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 3, # 'к' - 10: 1, # 'л' - 14: 2, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 2, # 'п' - 7: 2, # 'р' - 8: 3, # 'с' - 5: 3, # 'т' - 19: 3, # 'у' - 29: 2, # 'ф' - 25: 2, # 'х' - 22: 2, # 'ц' - 21: 2, # 'ч' - 27: 2, # 'ш' - 24: 1, # 'щ' - 17: 3, # 'ъ' - 52: 2, # 'ь' - 42: 3, # 'ю' - 16: 3, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 14: { # 'м' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 1, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 1, # 'г' - 11: 1, # 'д' - 3: 3, # 'е' - 23: 1, # 'ж' - 15: 1, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 2, # 'к' - 10: 3, # 'л' - 14: 1, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 3, # 'п' - 7: 2, # 'р' - 8: 2, # 'с' - 5: 1, # 'т' - 19: 3, # 'у' - 29: 2, # 'ф' - 25: 1, # 'х' - 22: 2, # 'ц' - 21: 2, # 'ч' - 27: 2, # 'ш' - 24: 1, # 'щ' - 17: 3, # 'ъ' - 52: 1, # 'ь' - 42: 2, # 'ю' - 16: 3, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 6: { # 'н' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 1, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 2, # 'б' - 9: 2, # 'в' - 20: 3, # 'г' - 11: 3, # 'д' - 3: 3, # 'е' - 23: 2, # 'ж' - 15: 2, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 3, # 'к' - 10: 2, # 'л' - 14: 1, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 1, # 'п' - 7: 2, # 'р' - 8: 3, # 'с' - 5: 3, # 'т' - 19: 3, # 'у' - 29: 3, # 'ф' - 25: 2, # 'х' - 22: 3, # 'ц' - 21: 3, # 'ч' - 27: 2, # 'ш' - 24: 1, # 'щ' - 17: 3, # 'ъ' - 52: 2, # 'ь' - 42: 2, # 'ю' - 16: 3, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 4: { # 'о' - 63: 0, # 'e' - 45: 1, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 2, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 3, # 'г' - 11: 3, # 'д' - 3: 3, # 'е' - 23: 3, # 'ж' - 15: 3, # 'з' - 2: 3, # 'и' - 26: 3, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 3, # 'м' - 6: 3, # 'н' - 4: 2, # 'о' - 13: 3, # 'п' - 7: 3, # 'р' - 8: 3, # 'с' - 5: 3, # 'т' - 19: 2, # 'у' - 29: 3, # 'ф' - 25: 3, # 'х' - 22: 3, # 'ц' - 21: 3, # 'ч' - 27: 3, # 'ш' - 24: 3, # 'щ' - 17: 1, # 'ъ' - 52: 0, # 'ь' - 42: 1, # 'ю' - 16: 3, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 13: { # 'п' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 2, # 'в' - 20: 1, # 'г' - 11: 1, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 1, # 'з' - 2: 3, # 'и' - 26: 1, # 'й' - 12: 2, # 'к' - 10: 3, # 'л' - 14: 1, # 'м' - 6: 2, # 'н' - 4: 3, # 'о' - 13: 1, # 'п' - 7: 3, # 'р' - 8: 2, # 'с' - 5: 2, # 'т' - 19: 3, # 'у' - 29: 1, # 'ф' - 25: 1, # 'х' - 22: 2, # 'ц' - 21: 2, # 'ч' - 27: 1, # 'ш' - 24: 1, # 'щ' - 17: 3, # 'ъ' - 52: 1, # 'ь' - 42: 2, # 'ю' - 16: 2, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 7: { # 'р' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 3, # 'г' - 11: 3, # 'д' - 3: 3, # 'е' - 23: 3, # 'ж' - 15: 2, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 3, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 2, # 'п' - 7: 1, # 'р' - 8: 3, # 'с' - 5: 3, # 'т' - 19: 3, # 'у' - 29: 2, # 'ф' - 25: 3, # 'х' - 22: 3, # 'ц' - 21: 2, # 'ч' - 27: 3, # 'ш' - 24: 1, # 'щ' - 17: 3, # 'ъ' - 52: 1, # 'ь' - 42: 2, # 'ю' - 16: 3, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 8: { # 'с' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 2, # 'б' - 9: 3, # 'в' - 20: 2, # 'г' - 11: 2, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 1, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 3, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 3, # 'п' - 7: 3, # 'р' - 8: 1, # 'с' - 5: 3, # 'т' - 19: 3, # 'у' - 29: 2, # 'ф' - 25: 2, # 'х' - 22: 2, # 'ц' - 21: 2, # 'ч' - 27: 2, # 'ш' - 24: 0, # 'щ' - 17: 3, # 'ъ' - 52: 2, # 'ь' - 42: 2, # 'ю' - 16: 3, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 5: { # 'т' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 2, # 'г' - 11: 2, # 'д' - 3: 3, # 'е' - 23: 1, # 'ж' - 15: 1, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 2, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 2, # 'п' - 7: 3, # 'р' - 8: 3, # 'с' - 5: 3, # 'т' - 19: 3, # 'у' - 29: 1, # 'ф' - 25: 2, # 'х' - 22: 2, # 'ц' - 21: 2, # 'ч' - 27: 1, # 'ш' - 24: 1, # 'щ' - 17: 3, # 'ъ' - 52: 2, # 'ь' - 42: 2, # 'ю' - 16: 3, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 19: { # 'у' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 3, # 'г' - 11: 3, # 'д' - 3: 2, # 'е' - 23: 3, # 'ж' - 15: 3, # 'з' - 2: 2, # 'и' - 26: 2, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 3, # 'м' - 6: 3, # 'н' - 4: 2, # 'о' - 13: 3, # 'п' - 7: 3, # 'р' - 8: 3, # 'с' - 5: 3, # 'т' - 19: 1, # 'у' - 29: 2, # 'ф' - 25: 2, # 'х' - 22: 2, # 'ц' - 21: 3, # 'ч' - 27: 3, # 'ш' - 24: 2, # 'щ' - 17: 1, # 'ъ' - 52: 0, # 'ь' - 42: 1, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 29: { # 'ф' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 1, # 'в' - 20: 1, # 'г' - 11: 0, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 2, # 'к' - 10: 2, # 'л' - 14: 1, # 'м' - 6: 1, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 2, # 'р' - 8: 2, # 'с' - 5: 2, # 'т' - 19: 2, # 'у' - 29: 0, # 'ф' - 25: 1, # 'х' - 22: 0, # 'ц' - 21: 1, # 'ч' - 27: 1, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ъ' - 52: 2, # 'ь' - 42: 1, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 25: { # 'х' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 3, # 'в' - 20: 0, # 'г' - 11: 1, # 'д' - 3: 2, # 'е' - 23: 0, # 'ж' - 15: 1, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 2, # 'л' - 14: 2, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 1, # 'п' - 7: 3, # 'р' - 8: 1, # 'с' - 5: 2, # 'т' - 19: 3, # 'у' - 29: 0, # 'ф' - 25: 1, # 'х' - 22: 0, # 'ц' - 21: 1, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ъ' - 52: 0, # 'ь' - 42: 1, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 22: { # 'ц' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 2, # 'в' - 20: 1, # 'г' - 11: 1, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 1, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 2, # 'к' - 10: 1, # 'л' - 14: 1, # 'м' - 6: 1, # 'н' - 4: 2, # 'о' - 13: 1, # 'п' - 7: 1, # 'р' - 8: 1, # 'с' - 5: 1, # 'т' - 19: 2, # 'у' - 29: 1, # 'ф' - 25: 1, # 'х' - 22: 1, # 'ц' - 21: 1, # 'ч' - 27: 1, # 'ш' - 24: 1, # 'щ' - 17: 2, # 'ъ' - 52: 1, # 'ь' - 42: 0, # 'ю' - 16: 2, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 21: { # 'ч' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 3, # 'в' - 20: 1, # 'г' - 11: 0, # 'д' - 3: 3, # 'е' - 23: 1, # 'ж' - 15: 0, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 3, # 'к' - 10: 2, # 'л' - 14: 2, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 2, # 'р' - 8: 0, # 'с' - 5: 2, # 'т' - 19: 3, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 1, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ъ' - 52: 0, # 'ь' - 42: 1, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 27: { # 'ш' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 0, # 'б' - 9: 2, # 'в' - 20: 0, # 'г' - 11: 1, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 3, # 'к' - 10: 2, # 'л' - 14: 1, # 'м' - 6: 3, # 'н' - 4: 2, # 'о' - 13: 2, # 'п' - 7: 1, # 'р' - 8: 0, # 'с' - 5: 1, # 'т' - 19: 2, # 'у' - 29: 1, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 1, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ъ' - 52: 1, # 'ь' - 42: 1, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 24: { # 'щ' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 0, # 'б' - 9: 1, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 2, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 1, # 'р' - 8: 0, # 'с' - 5: 2, # 'т' - 19: 3, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 1, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ъ' - 52: 0, # 'ь' - 42: 0, # 'ю' - 16: 2, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 17: { # 'ъ' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 1, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 3, # 'г' - 11: 3, # 'д' - 3: 2, # 'е' - 23: 3, # 'ж' - 15: 3, # 'з' - 2: 1, # 'и' - 26: 2, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 3, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 3, # 'п' - 7: 3, # 'р' - 8: 3, # 'с' - 5: 3, # 'т' - 19: 1, # 'у' - 29: 1, # 'ф' - 25: 2, # 'х' - 22: 2, # 'ц' - 21: 3, # 'ч' - 27: 2, # 'ш' - 24: 3, # 'щ' - 17: 0, # 'ъ' - 52: 0, # 'ь' - 42: 2, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 52: { # 'ь' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 0, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 1, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 0, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 1, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 0, # 'р' - 8: 0, # 'с' - 5: 1, # 'т' - 19: 0, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 1, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 0, # 'ъ' - 52: 0, # 'ь' - 42: 1, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 42: { # 'ю' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 1, # 'а' - 18: 2, # 'б' - 9: 1, # 'в' - 20: 2, # 'г' - 11: 2, # 'д' - 3: 1, # 'е' - 23: 2, # 'ж' - 15: 2, # 'з' - 2: 1, # 'и' - 26: 1, # 'й' - 12: 2, # 'к' - 10: 2, # 'л' - 14: 2, # 'м' - 6: 2, # 'н' - 4: 1, # 'о' - 13: 1, # 'п' - 7: 2, # 'р' - 8: 2, # 'с' - 5: 2, # 'т' - 19: 1, # 'у' - 29: 1, # 'ф' - 25: 1, # 'х' - 22: 2, # 'ц' - 21: 3, # 'ч' - 27: 1, # 'ш' - 24: 1, # 'щ' - 17: 1, # 'ъ' - 52: 0, # 'ь' - 42: 0, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 16: { # 'я' - 63: 0, # 'e' - 45: 1, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 0, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 2, # 'г' - 11: 3, # 'д' - 3: 2, # 'е' - 23: 1, # 'ж' - 15: 2, # 'з' - 2: 1, # 'и' - 26: 2, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 3, # 'м' - 6: 3, # 'н' - 4: 1, # 'о' - 13: 2, # 'п' - 7: 2, # 'р' - 8: 3, # 'с' - 5: 3, # 'т' - 19: 1, # 'у' - 29: 1, # 'ф' - 25: 3, # 'х' - 22: 2, # 'ц' - 21: 1, # 'ч' - 27: 1, # 'ш' - 24: 2, # 'щ' - 17: 0, # 'ъ' - 52: 0, # 'ь' - 42: 0, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 58: { # 'є' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 0, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 0, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 0, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 0, # 'о' - 13: 0, # 'п' - 7: 0, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 0, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 0, # 'ъ' - 52: 0, # 'ь' - 42: 0, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 62: { # '№' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 0, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 0, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 0, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 0, # 'о' - 13: 0, # 'п' - 7: 0, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 0, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 0, # 'ъ' - 52: 0, # 'ь' - 42: 0, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, -} - -# 255: Undefined characters that did not exist in training text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 -# 251: Control characters - -# Character Mapping Table(s): -ISO_8859_5_BULGARIAN_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 77, # 'A' - 66: 90, # 'B' - 67: 99, # 'C' - 68: 100, # 'D' - 69: 72, # 'E' - 70: 109, # 'F' - 71: 107, # 'G' - 72: 101, # 'H' - 73: 79, # 'I' - 74: 185, # 'J' - 75: 81, # 'K' - 76: 102, # 'L' - 77: 76, # 'M' - 78: 94, # 'N' - 79: 82, # 'O' - 80: 110, # 'P' - 81: 186, # 'Q' - 82: 108, # 'R' - 83: 91, # 'S' - 84: 74, # 'T' - 85: 119, # 'U' - 86: 84, # 'V' - 87: 96, # 'W' - 88: 111, # 'X' - 89: 187, # 'Y' - 90: 115, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 65, # 'a' - 98: 69, # 'b' - 99: 70, # 'c' - 100: 66, # 'd' - 101: 63, # 'e' - 102: 68, # 'f' - 103: 112, # 'g' - 104: 103, # 'h' - 105: 92, # 'i' - 106: 194, # 'j' - 107: 104, # 'k' - 108: 95, # 'l' - 109: 86, # 'm' - 110: 87, # 'n' - 111: 71, # 'o' - 112: 116, # 'p' - 113: 195, # 'q' - 114: 85, # 'r' - 115: 93, # 's' - 116: 97, # 't' - 117: 113, # 'u' - 118: 196, # 'v' - 119: 197, # 'w' - 120: 198, # 'x' - 121: 199, # 'y' - 122: 200, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 194, # '\x80' - 129: 195, # '\x81' - 130: 196, # '\x82' - 131: 197, # '\x83' - 132: 198, # '\x84' - 133: 199, # '\x85' - 134: 200, # '\x86' - 135: 201, # '\x87' - 136: 202, # '\x88' - 137: 203, # '\x89' - 138: 204, # '\x8a' - 139: 205, # '\x8b' - 140: 206, # '\x8c' - 141: 207, # '\x8d' - 142: 208, # '\x8e' - 143: 209, # '\x8f' - 144: 210, # '\x90' - 145: 211, # '\x91' - 146: 212, # '\x92' - 147: 213, # '\x93' - 148: 214, # '\x94' - 149: 215, # '\x95' - 150: 216, # '\x96' - 151: 217, # '\x97' - 152: 218, # '\x98' - 153: 219, # '\x99' - 154: 220, # '\x9a' - 155: 221, # '\x9b' - 156: 222, # '\x9c' - 157: 223, # '\x9d' - 158: 224, # '\x9e' - 159: 225, # '\x9f' - 160: 81, # '\xa0' - 161: 226, # 'Ё' - 162: 227, # 'Ђ' - 163: 228, # 'Ѓ' - 164: 229, # 'Є' - 165: 230, # 'Ѕ' - 166: 105, # 'І' - 167: 231, # 'Ї' - 168: 232, # 'Ј' - 169: 233, # 'Љ' - 170: 234, # 'Њ' - 171: 235, # 'Ћ' - 172: 236, # 'Ќ' - 173: 45, # '\xad' - 174: 237, # 'Ў' - 175: 238, # 'Џ' - 176: 31, # 'А' - 177: 32, # 'Б' - 178: 35, # 'В' - 179: 43, # 'Г' - 180: 37, # 'Д' - 181: 44, # 'Е' - 182: 55, # 'Ж' - 183: 47, # 'З' - 184: 40, # 'И' - 185: 59, # 'Й' - 186: 33, # 'К' - 187: 46, # 'Л' - 188: 38, # 'М' - 189: 36, # 'Н' - 190: 41, # 'О' - 191: 30, # 'П' - 192: 39, # 'Р' - 193: 28, # 'С' - 194: 34, # 'Т' - 195: 51, # 'У' - 196: 48, # 'Ф' - 197: 49, # 'Х' - 198: 53, # 'Ц' - 199: 50, # 'Ч' - 200: 54, # 'Ш' - 201: 57, # 'Щ' - 202: 61, # 'Ъ' - 203: 239, # 'Ы' - 204: 67, # 'Ь' - 205: 240, # 'Э' - 206: 60, # 'Ю' - 207: 56, # 'Я' - 208: 1, # 'а' - 209: 18, # 'б' - 210: 9, # 'в' - 211: 20, # 'г' - 212: 11, # 'д' - 213: 3, # 'е' - 214: 23, # 'ж' - 215: 15, # 'з' - 216: 2, # 'и' - 217: 26, # 'й' - 218: 12, # 'к' - 219: 10, # 'л' - 220: 14, # 'м' - 221: 6, # 'н' - 222: 4, # 'о' - 223: 13, # 'п' - 224: 7, # 'р' - 225: 8, # 'с' - 226: 5, # 'т' - 227: 19, # 'у' - 228: 29, # 'ф' - 229: 25, # 'х' - 230: 22, # 'ц' - 231: 21, # 'ч' - 232: 27, # 'ш' - 233: 24, # 'щ' - 234: 17, # 'ъ' - 235: 75, # 'ы' - 236: 52, # 'ь' - 237: 241, # 'э' - 238: 42, # 'ю' - 239: 16, # 'я' - 240: 62, # '№' - 241: 242, # 'ё' - 242: 243, # 'ђ' - 243: 244, # 'ѓ' - 244: 58, # 'є' - 245: 245, # 'ѕ' - 246: 98, # 'і' - 247: 246, # 'ї' - 248: 247, # 'ј' - 249: 248, # 'љ' - 250: 249, # 'њ' - 251: 250, # 'ћ' - 252: 251, # 'ќ' - 253: 91, # '§' - 254: 252, # 'ў' - 255: 253, # 'џ' -} - -ISO_8859_5_BULGARIAN_MODEL = SingleByteCharSetModel( - charset_name="ISO-8859-5", - language="Bulgarian", - char_to_order_map=ISO_8859_5_BULGARIAN_CHAR_TO_ORDER, - language_model=BULGARIAN_LANG_MODEL, - typical_positive_ratio=0.969392, - keep_ascii_letters=False, - alphabet="АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЬЮЯабвгдежзийклмнопрстуфхцчшщъьюя", -) - -WINDOWS_1251_BULGARIAN_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 77, # 'A' - 66: 90, # 'B' - 67: 99, # 'C' - 68: 100, # 'D' - 69: 72, # 'E' - 70: 109, # 'F' - 71: 107, # 'G' - 72: 101, # 'H' - 73: 79, # 'I' - 74: 185, # 'J' - 75: 81, # 'K' - 76: 102, # 'L' - 77: 76, # 'M' - 78: 94, # 'N' - 79: 82, # 'O' - 80: 110, # 'P' - 81: 186, # 'Q' - 82: 108, # 'R' - 83: 91, # 'S' - 84: 74, # 'T' - 85: 119, # 'U' - 86: 84, # 'V' - 87: 96, # 'W' - 88: 111, # 'X' - 89: 187, # 'Y' - 90: 115, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 65, # 'a' - 98: 69, # 'b' - 99: 70, # 'c' - 100: 66, # 'd' - 101: 63, # 'e' - 102: 68, # 'f' - 103: 112, # 'g' - 104: 103, # 'h' - 105: 92, # 'i' - 106: 194, # 'j' - 107: 104, # 'k' - 108: 95, # 'l' - 109: 86, # 'm' - 110: 87, # 'n' - 111: 71, # 'o' - 112: 116, # 'p' - 113: 195, # 'q' - 114: 85, # 'r' - 115: 93, # 's' - 116: 97, # 't' - 117: 113, # 'u' - 118: 196, # 'v' - 119: 197, # 'w' - 120: 198, # 'x' - 121: 199, # 'y' - 122: 200, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 206, # 'Ђ' - 129: 207, # 'Ѓ' - 130: 208, # '‚' - 131: 209, # 'ѓ' - 132: 210, # '„' - 133: 211, # '…' - 134: 212, # '†' - 135: 213, # '‡' - 136: 120, # '€' - 137: 214, # '‰' - 138: 215, # 'Љ' - 139: 216, # '‹' - 140: 217, # 'Њ' - 141: 218, # 'Ќ' - 142: 219, # 'Ћ' - 143: 220, # 'Џ' - 144: 221, # 'ђ' - 145: 78, # '‘' - 146: 64, # '’' - 147: 83, # '“' - 148: 121, # '”' - 149: 98, # '•' - 150: 117, # '–' - 151: 105, # '—' - 152: 222, # None - 153: 223, # '™' - 154: 224, # 'љ' - 155: 225, # '›' - 156: 226, # 'њ' - 157: 227, # 'ќ' - 158: 228, # 'ћ' - 159: 229, # 'џ' - 160: 88, # '\xa0' - 161: 230, # 'Ў' - 162: 231, # 'ў' - 163: 232, # 'Ј' - 164: 233, # '¤' - 165: 122, # 'Ґ' - 166: 89, # '¦' - 167: 106, # '§' - 168: 234, # 'Ё' - 169: 235, # '©' - 170: 236, # 'Є' - 171: 237, # '«' - 172: 238, # '¬' - 173: 45, # '\xad' - 174: 239, # '®' - 175: 240, # 'Ї' - 176: 73, # '°' - 177: 80, # '±' - 178: 118, # 'І' - 179: 114, # 'і' - 180: 241, # 'ґ' - 181: 242, # 'µ' - 182: 243, # '¶' - 183: 244, # '·' - 184: 245, # 'ё' - 185: 62, # '№' - 186: 58, # 'є' - 187: 246, # '»' - 188: 247, # 'ј' - 189: 248, # 'Ѕ' - 190: 249, # 'ѕ' - 191: 250, # 'ї' - 192: 31, # 'А' - 193: 32, # 'Б' - 194: 35, # 'В' - 195: 43, # 'Г' - 196: 37, # 'Д' - 197: 44, # 'Е' - 198: 55, # 'Ж' - 199: 47, # 'З' - 200: 40, # 'И' - 201: 59, # 'Й' - 202: 33, # 'К' - 203: 46, # 'Л' - 204: 38, # 'М' - 205: 36, # 'Н' - 206: 41, # 'О' - 207: 30, # 'П' - 208: 39, # 'Р' - 209: 28, # 'С' - 210: 34, # 'Т' - 211: 51, # 'У' - 212: 48, # 'Ф' - 213: 49, # 'Х' - 214: 53, # 'Ц' - 215: 50, # 'Ч' - 216: 54, # 'Ш' - 217: 57, # 'Щ' - 218: 61, # 'Ъ' - 219: 251, # 'Ы' - 220: 67, # 'Ь' - 221: 252, # 'Э' - 222: 60, # 'Ю' - 223: 56, # 'Я' - 224: 1, # 'а' - 225: 18, # 'б' - 226: 9, # 'в' - 227: 20, # 'г' - 228: 11, # 'д' - 229: 3, # 'е' - 230: 23, # 'ж' - 231: 15, # 'з' - 232: 2, # 'и' - 233: 26, # 'й' - 234: 12, # 'к' - 235: 10, # 'л' - 236: 14, # 'м' - 237: 6, # 'н' - 238: 4, # 'о' - 239: 13, # 'п' - 240: 7, # 'р' - 241: 8, # 'с' - 242: 5, # 'т' - 243: 19, # 'у' - 244: 29, # 'ф' - 245: 25, # 'х' - 246: 22, # 'ц' - 247: 21, # 'ч' - 248: 27, # 'ш' - 249: 24, # 'щ' - 250: 17, # 'ъ' - 251: 75, # 'ы' - 252: 52, # 'ь' - 253: 253, # 'э' - 254: 42, # 'ю' - 255: 16, # 'я' -} - -WINDOWS_1251_BULGARIAN_MODEL = SingleByteCharSetModel( - charset_name="windows-1251", - language="Bulgarian", - char_to_order_map=WINDOWS_1251_BULGARIAN_CHAR_TO_ORDER, - language_model=BULGARIAN_LANG_MODEL, - typical_positive_ratio=0.969392, - keep_ascii_letters=False, - alphabet="АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЬЮЯабвгдежзийклмнопрстуфхцчшщъьюя", -) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langgreekmodel.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langgreekmodel.py deleted file mode 100644 index cfb8639..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langgreekmodel.py +++ /dev/null @@ -1,4397 +0,0 @@ -from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel - -# 3: Positive -# 2: Likely -# 1: Unlikely -# 0: Negative - -GREEK_LANG_MODEL = { - 60: { # 'e' - 60: 2, # 'e' - 55: 1, # 'o' - 58: 2, # 't' - 36: 1, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 1, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 0, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 0, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 55: { # 'o' - 60: 0, # 'e' - 55: 2, # 'o' - 58: 2, # 't' - 36: 1, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 1, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 0, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 1, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 58: { # 't' - 60: 2, # 'e' - 55: 1, # 'o' - 58: 1, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 2, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 1, # 'ο' - 9: 0, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 0, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 36: { # '·' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 0, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 0, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 61: { # 'Ά' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 1, # 'γ' - 21: 2, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 1, # 'π' - 8: 2, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 0, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 46: { # 'Έ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 2, # 'β' - 20: 2, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 2, # 'κ' - 16: 2, # 'λ' - 10: 0, # 'μ' - 6: 3, # 'ν' - 30: 2, # 'ξ' - 4: 0, # 'ο' - 9: 2, # 'π' - 8: 2, # 'ρ' - 14: 0, # 'ς' - 7: 1, # 'σ' - 2: 2, # 'τ' - 12: 0, # 'υ' - 28: 2, # 'φ' - 23: 3, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 54: { # 'Ό' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 2, # 'μ' - 6: 2, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 2, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 2, # 'σ' - 2: 3, # 'τ' - 12: 0, # 'υ' - 28: 0, # 'φ' - 23: 2, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 31: { # 'Α' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 2, # 'Β' - 43: 2, # 'Γ' - 41: 1, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 2, # 'Θ' - 47: 2, # 'Ι' - 44: 2, # 'Κ' - 53: 2, # 'Λ' - 38: 2, # 'Μ' - 49: 2, # 'Ν' - 59: 1, # 'Ξ' - 39: 0, # 'Ο' - 35: 2, # 'Π' - 48: 2, # 'Ρ' - 37: 2, # 'Σ' - 33: 2, # 'Τ' - 45: 2, # 'Υ' - 56: 2, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 2, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 1, # 'θ' - 5: 0, # 'ι' - 11: 2, # 'κ' - 16: 3, # 'λ' - 10: 2, # 'μ' - 6: 3, # 'ν' - 30: 2, # 'ξ' - 4: 0, # 'ο' - 9: 3, # 'π' - 8: 3, # 'ρ' - 14: 2, # 'ς' - 7: 2, # 'σ' - 2: 0, # 'τ' - 12: 3, # 'υ' - 28: 2, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 2, # 'ύ' - 27: 0, # 'ώ' - }, - 51: { # 'Β' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 2, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 1, # 'Ε' - 40: 1, # 'Η' - 52: 0, # 'Θ' - 47: 1, # 'Ι' - 44: 0, # 'Κ' - 53: 1, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 2, # 'ά' - 18: 2, # 'έ' - 22: 2, # 'ή' - 15: 0, # 'ί' - 1: 2, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 2, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 2, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 2, # 'ο' - 9: 0, # 'π' - 8: 2, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 0, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 43: { # 'Γ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 1, # 'Α' - 51: 0, # 'Β' - 43: 2, # 'Γ' - 41: 0, # 'Δ' - 34: 2, # 'Ε' - 40: 1, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 1, # 'Κ' - 53: 1, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 1, # 'Ο' - 35: 0, # 'Π' - 48: 2, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 2, # 'Υ' - 56: 0, # 'Φ' - 50: 1, # 'Χ' - 57: 2, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 2, # 'ί' - 1: 2, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 2, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 3, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 0, # 'μ' - 6: 2, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 0, # 'π' - 8: 2, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 0, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 41: { # 'Δ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 2, # 'Ε' - 40: 2, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 2, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 2, # 'ή' - 15: 2, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 2, # 'η' - 25: 0, # 'θ' - 5: 3, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 2, # 'ο' - 9: 0, # 'π' - 8: 2, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 2, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 2, # 'ω' - 19: 1, # 'ό' - 26: 2, # 'ύ' - 27: 2, # 'ώ' - }, - 34: { # 'Ε' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 2, # 'Α' - 51: 0, # 'Β' - 43: 2, # 'Γ' - 41: 2, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 2, # 'Κ' - 53: 2, # 'Λ' - 38: 2, # 'Μ' - 49: 2, # 'Ν' - 59: 1, # 'Ξ' - 39: 0, # 'Ο' - 35: 2, # 'Π' - 48: 2, # 'Ρ' - 37: 2, # 'Σ' - 33: 2, # 'Τ' - 45: 2, # 'Υ' - 56: 0, # 'Φ' - 50: 2, # 'Χ' - 57: 2, # 'Ω' - 17: 3, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 3, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 3, # 'γ' - 21: 2, # 'δ' - 3: 1, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 1, # 'θ' - 5: 2, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 2, # 'μ' - 6: 3, # 'ν' - 30: 2, # 'ξ' - 4: 0, # 'ο' - 9: 3, # 'π' - 8: 2, # 'ρ' - 14: 0, # 'ς' - 7: 2, # 'σ' - 2: 2, # 'τ' - 12: 2, # 'υ' - 28: 2, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 1, # 'ύ' - 27: 0, # 'ώ' - }, - 40: { # 'Η' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 1, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 2, # 'Θ' - 47: 0, # 'Ι' - 44: 2, # 'Κ' - 53: 0, # 'Λ' - 38: 2, # 'Μ' - 49: 2, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 2, # 'Π' - 48: 2, # 'Ρ' - 37: 2, # 'Σ' - 33: 2, # 'Τ' - 45: 1, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 0, # 'μ' - 6: 1, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 0, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 0, # 'υ' - 28: 0, # 'φ' - 23: 1, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 52: { # 'Θ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 2, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 2, # 'Ε' - 40: 2, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 1, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 1, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 2, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 2, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 0, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 2, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 2, # 'ύ' - 27: 0, # 'ώ' - }, - 47: { # 'Ι' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 2, # 'Α' - 51: 1, # 'Β' - 43: 1, # 'Γ' - 41: 2, # 'Δ' - 34: 2, # 'Ε' - 40: 2, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 2, # 'Κ' - 53: 2, # 'Λ' - 38: 2, # 'Μ' - 49: 2, # 'Ν' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 2, # 'Ρ' - 37: 2, # 'Σ' - 33: 2, # 'Τ' - 45: 0, # 'Υ' - 56: 2, # 'Φ' - 50: 0, # 'Χ' - 57: 2, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 2, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 2, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 1, # 'ν' - 30: 0, # 'ξ' - 4: 2, # 'ο' - 9: 0, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 2, # 'σ' - 2: 1, # 'τ' - 12: 0, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 1, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 44: { # 'Κ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 2, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 1, # 'Δ' - 34: 2, # 'Ε' - 40: 2, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 1, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 2, # 'Ρ' - 37: 0, # 'Σ' - 33: 1, # 'Τ' - 45: 2, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 1, # 'Ω' - 17: 3, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 2, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 2, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 2, # 'ο' - 9: 0, # 'π' - 8: 2, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 2, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 2, # 'ό' - 26: 2, # 'ύ' - 27: 2, # 'ώ' - }, - 53: { # 'Λ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 2, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 2, # 'Ε' - 40: 2, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 0, # 'Κ' - 53: 2, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 2, # 'Σ' - 33: 0, # 'Τ' - 45: 2, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 2, # 'Ω' - 17: 2, # 'ά' - 18: 2, # 'έ' - 22: 0, # 'ή' - 15: 2, # 'ί' - 1: 2, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 2, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 1, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 2, # 'ο' - 9: 0, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 2, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 2, # 'ό' - 26: 2, # 'ύ' - 27: 0, # 'ώ' - }, - 38: { # 'Μ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 2, # 'Α' - 51: 2, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 2, # 'Ε' - 40: 2, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 2, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 2, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 2, # 'ά' - 18: 2, # 'έ' - 22: 2, # 'ή' - 15: 2, # 'ί' - 1: 2, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 2, # 'η' - 25: 0, # 'θ' - 5: 3, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 2, # 'ο' - 9: 3, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 2, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 2, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 49: { # 'Ν' - 60: 2, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 2, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 2, # 'Ε' - 40: 2, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 2, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 2, # 'Ω' - 17: 0, # 'ά' - 18: 2, # 'έ' - 22: 0, # 'ή' - 15: 2, # 'ί' - 1: 2, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 1, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 2, # 'ο' - 9: 0, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 0, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 1, # 'ω' - 19: 2, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 59: { # 'Ξ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 1, # 'Ε' - 40: 1, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 1, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 2, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 2, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 2, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 0, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 0, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 39: { # 'Ο' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 1, # 'Β' - 43: 2, # 'Γ' - 41: 2, # 'Δ' - 34: 2, # 'Ε' - 40: 1, # 'Η' - 52: 2, # 'Θ' - 47: 2, # 'Ι' - 44: 2, # 'Κ' - 53: 2, # 'Λ' - 38: 2, # 'Μ' - 49: 2, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 2, # 'Π' - 48: 2, # 'Ρ' - 37: 2, # 'Σ' - 33: 2, # 'Τ' - 45: 2, # 'Υ' - 56: 2, # 'Φ' - 50: 2, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 2, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 3, # 'ι' - 11: 2, # 'κ' - 16: 2, # 'λ' - 10: 2, # 'μ' - 6: 2, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 2, # 'π' - 8: 2, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 2, # 'τ' - 12: 2, # 'υ' - 28: 1, # 'φ' - 23: 1, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 2, # 'ύ' - 27: 0, # 'ώ' - }, - 35: { # 'Π' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 2, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 2, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 0, # 'Κ' - 53: 2, # 'Λ' - 38: 1, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 2, # 'Ρ' - 37: 0, # 'Σ' - 33: 1, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 1, # 'Χ' - 57: 2, # 'Ω' - 17: 2, # 'ά' - 18: 1, # 'έ' - 22: 1, # 'ή' - 15: 2, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 2, # 'η' - 25: 0, # 'θ' - 5: 2, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 0, # 'μ' - 6: 2, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'π' - 8: 3, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 2, # 'υ' - 28: 0, # 'φ' - 23: 2, # 'χ' - 42: 0, # 'ψ' - 24: 2, # 'ω' - 19: 2, # 'ό' - 26: 0, # 'ύ' - 27: 3, # 'ώ' - }, - 48: { # 'Ρ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 2, # 'Α' - 51: 0, # 'Β' - 43: 1, # 'Γ' - 41: 1, # 'Δ' - 34: 2, # 'Ε' - 40: 2, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 2, # 'Ν' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 2, # 'Ρ' - 37: 0, # 'Σ' - 33: 1, # 'Τ' - 45: 1, # 'Υ' - 56: 0, # 'Φ' - 50: 1, # 'Χ' - 57: 1, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 2, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 1, # 'ο' - 9: 0, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 3, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 2, # 'ω' - 19: 0, # 'ό' - 26: 2, # 'ύ' - 27: 0, # 'ώ' - }, - 37: { # 'Σ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 2, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 1, # 'Δ' - 34: 2, # 'Ε' - 40: 2, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 2, # 'Κ' - 53: 0, # 'Λ' - 38: 2, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 2, # 'Σ' - 33: 2, # 'Τ' - 45: 2, # 'Υ' - 56: 0, # 'Φ' - 50: 2, # 'Χ' - 57: 2, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 2, # 'ή' - 15: 2, # 'ί' - 1: 2, # 'α' - 29: 2, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 0, # 'θ' - 5: 2, # 'ι' - 11: 2, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 2, # 'ο' - 9: 2, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 3, # 'τ' - 12: 3, # 'υ' - 28: 0, # 'φ' - 23: 2, # 'χ' - 42: 0, # 'ψ' - 24: 2, # 'ω' - 19: 0, # 'ό' - 26: 2, # 'ύ' - 27: 2, # 'ώ' - }, - 33: { # 'Τ' - 60: 0, # 'e' - 55: 1, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 2, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 2, # 'Ε' - 40: 2, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 2, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 2, # 'Ρ' - 37: 0, # 'Σ' - 33: 1, # 'Τ' - 45: 1, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 2, # 'Ω' - 17: 2, # 'ά' - 18: 2, # 'έ' - 22: 0, # 'ή' - 15: 2, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 2, # 'ε' - 32: 0, # 'ζ' - 13: 2, # 'η' - 25: 0, # 'θ' - 5: 2, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 2, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'π' - 8: 2, # 'ρ' - 14: 0, # 'ς' - 7: 2, # 'σ' - 2: 0, # 'τ' - 12: 2, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 2, # 'ό' - 26: 2, # 'ύ' - 27: 3, # 'ώ' - }, - 45: { # 'Υ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 2, # 'Γ' - 41: 0, # 'Δ' - 34: 1, # 'Ε' - 40: 2, # 'Η' - 52: 2, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 1, # 'Λ' - 38: 2, # 'Μ' - 49: 2, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 2, # 'Π' - 48: 1, # 'Ρ' - 37: 2, # 'Σ' - 33: 2, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 1, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 3, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 0, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 56: { # 'Φ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 1, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 1, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 2, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 2, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 2, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 2, # 'ο' - 9: 0, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 2, # 'τ' - 12: 2, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 1, # 'ύ' - 27: 1, # 'ώ' - }, - 50: { # 'Χ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 1, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 2, # 'Ε' - 40: 2, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 1, # 'Ν' - 59: 0, # 'Ξ' - 39: 1, # 'Ο' - 35: 0, # 'Π' - 48: 2, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 1, # 'Χ' - 57: 1, # 'Ω' - 17: 2, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 2, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 2, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 2, # 'ο' - 9: 0, # 'π' - 8: 3, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 2, # 'τ' - 12: 0, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 2, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 57: { # 'Ω' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 1, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 1, # 'Λ' - 38: 0, # 'Μ' - 49: 2, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 2, # 'Ρ' - 37: 2, # 'Σ' - 33: 2, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 0, # 'π' - 8: 2, # 'ρ' - 14: 2, # 'ς' - 7: 2, # 'σ' - 2: 0, # 'τ' - 12: 0, # 'υ' - 28: 0, # 'φ' - 23: 1, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 17: { # 'ά' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 2, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 3, # 'β' - 20: 3, # 'γ' - 21: 3, # 'δ' - 3: 3, # 'ε' - 32: 3, # 'ζ' - 13: 0, # 'η' - 25: 3, # 'θ' - 5: 2, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 3, # 'ξ' - 4: 0, # 'ο' - 9: 3, # 'π' - 8: 3, # 'ρ' - 14: 3, # 'ς' - 7: 3, # 'σ' - 2: 3, # 'τ' - 12: 0, # 'υ' - 28: 3, # 'φ' - 23: 3, # 'χ' - 42: 3, # 'ψ' - 24: 2, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 18: { # 'έ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 3, # 'α' - 29: 2, # 'β' - 20: 3, # 'γ' - 21: 2, # 'δ' - 3: 3, # 'ε' - 32: 2, # 'ζ' - 13: 0, # 'η' - 25: 3, # 'θ' - 5: 0, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 3, # 'ξ' - 4: 3, # 'ο' - 9: 3, # 'π' - 8: 3, # 'ρ' - 14: 3, # 'ς' - 7: 3, # 'σ' - 2: 3, # 'τ' - 12: 0, # 'υ' - 28: 3, # 'φ' - 23: 3, # 'χ' - 42: 3, # 'ψ' - 24: 2, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 22: { # 'ή' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 1, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 3, # 'γ' - 21: 3, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 3, # 'θ' - 5: 0, # 'ι' - 11: 3, # 'κ' - 16: 2, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 2, # 'ξ' - 4: 0, # 'ο' - 9: 3, # 'π' - 8: 3, # 'ρ' - 14: 3, # 'ς' - 7: 3, # 'σ' - 2: 3, # 'τ' - 12: 0, # 'υ' - 28: 2, # 'φ' - 23: 3, # 'χ' - 42: 2, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 15: { # 'ί' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 3, # 'α' - 29: 2, # 'β' - 20: 3, # 'γ' - 21: 3, # 'δ' - 3: 3, # 'ε' - 32: 3, # 'ζ' - 13: 3, # 'η' - 25: 3, # 'θ' - 5: 0, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 3, # 'ξ' - 4: 3, # 'ο' - 9: 3, # 'π' - 8: 3, # 'ρ' - 14: 3, # 'ς' - 7: 3, # 'σ' - 2: 3, # 'τ' - 12: 0, # 'υ' - 28: 1, # 'φ' - 23: 3, # 'χ' - 42: 2, # 'ψ' - 24: 3, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 1: { # 'α' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 2, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 2, # 'έ' - 22: 0, # 'ή' - 15: 3, # 'ί' - 1: 0, # 'α' - 29: 3, # 'β' - 20: 3, # 'γ' - 21: 3, # 'δ' - 3: 2, # 'ε' - 32: 3, # 'ζ' - 13: 1, # 'η' - 25: 3, # 'θ' - 5: 3, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 3, # 'ξ' - 4: 2, # 'ο' - 9: 3, # 'π' - 8: 3, # 'ρ' - 14: 3, # 'ς' - 7: 3, # 'σ' - 2: 3, # 'τ' - 12: 3, # 'υ' - 28: 3, # 'φ' - 23: 3, # 'χ' - 42: 2, # 'ψ' - 24: 0, # 'ω' - 19: 2, # 'ό' - 26: 2, # 'ύ' - 27: 0, # 'ώ' - }, - 29: { # 'β' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 2, # 'έ' - 22: 3, # 'ή' - 15: 2, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 2, # 'γ' - 21: 2, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 2, # 'η' - 25: 0, # 'θ' - 5: 3, # 'ι' - 11: 0, # 'κ' - 16: 3, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'π' - 8: 3, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 0, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 2, # 'ω' - 19: 2, # 'ό' - 26: 2, # 'ύ' - 27: 2, # 'ώ' - }, - 20: { # 'γ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 3, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 0, # 'θ' - 5: 3, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 3, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'π' - 8: 3, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 2, # 'υ' - 28: 0, # 'φ' - 23: 3, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ό' - 26: 2, # 'ύ' - 27: 3, # 'ώ' - }, - 21: { # 'δ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 2, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 0, # 'θ' - 5: 3, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'π' - 8: 3, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 3, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ό' - 26: 3, # 'ύ' - 27: 3, # 'ώ' - }, - 3: { # 'ε' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 2, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 3, # 'ί' - 1: 2, # 'α' - 29: 3, # 'β' - 20: 3, # 'γ' - 21: 3, # 'δ' - 3: 2, # 'ε' - 32: 2, # 'ζ' - 13: 0, # 'η' - 25: 3, # 'θ' - 5: 3, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 3, # 'ξ' - 4: 2, # 'ο' - 9: 3, # 'π' - 8: 3, # 'ρ' - 14: 3, # 'ς' - 7: 3, # 'σ' - 2: 3, # 'τ' - 12: 3, # 'υ' - 28: 3, # 'φ' - 23: 3, # 'χ' - 42: 2, # 'ψ' - 24: 3, # 'ω' - 19: 2, # 'ό' - 26: 3, # 'ύ' - 27: 2, # 'ώ' - }, - 32: { # 'ζ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 2, # 'ά' - 18: 2, # 'έ' - 22: 2, # 'ή' - 15: 2, # 'ί' - 1: 2, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 0, # 'θ' - 5: 2, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 1, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 2, # 'ό' - 26: 0, # 'ύ' - 27: 2, # 'ώ' - }, - 13: { # 'η' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 2, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 3, # 'γ' - 21: 2, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 3, # 'θ' - 5: 0, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 2, # 'ξ' - 4: 0, # 'ο' - 9: 2, # 'π' - 8: 3, # 'ρ' - 14: 3, # 'ς' - 7: 3, # 'σ' - 2: 3, # 'τ' - 12: 0, # 'υ' - 28: 2, # 'φ' - 23: 3, # 'χ' - 42: 2, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 25: { # 'θ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 2, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 2, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 0, # 'θ' - 5: 3, # 'ι' - 11: 0, # 'κ' - 16: 1, # 'λ' - 10: 3, # 'μ' - 6: 2, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'π' - 8: 3, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 3, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ό' - 26: 3, # 'ύ' - 27: 3, # 'ώ' - }, - 5: { # 'ι' - 60: 0, # 'e' - 55: 1, # 'o' - 58: 0, # 't' - 36: 2, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 1, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 0, # 'ί' - 1: 3, # 'α' - 29: 3, # 'β' - 20: 3, # 'γ' - 21: 3, # 'δ' - 3: 3, # 'ε' - 32: 2, # 'ζ' - 13: 3, # 'η' - 25: 3, # 'θ' - 5: 0, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 3, # 'ξ' - 4: 3, # 'ο' - 9: 3, # 'π' - 8: 3, # 'ρ' - 14: 3, # 'ς' - 7: 3, # 'σ' - 2: 3, # 'τ' - 12: 0, # 'υ' - 28: 2, # 'φ' - 23: 3, # 'χ' - 42: 2, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ό' - 26: 0, # 'ύ' - 27: 3, # 'ώ' - }, - 11: { # 'κ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 3, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 2, # 'θ' - 5: 3, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 2, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 2, # 'π' - 8: 3, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 3, # 'τ' - 12: 3, # 'υ' - 28: 2, # 'φ' - 23: 2, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ό' - 26: 3, # 'ύ' - 27: 3, # 'ώ' - }, - 16: { # 'λ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 1, # 'β' - 20: 2, # 'γ' - 21: 1, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 2, # 'θ' - 5: 3, # 'ι' - 11: 2, # 'κ' - 16: 3, # 'λ' - 10: 2, # 'μ' - 6: 2, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 3, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 3, # 'τ' - 12: 3, # 'υ' - 28: 2, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ό' - 26: 3, # 'ύ' - 27: 3, # 'ώ' - }, - 10: { # 'μ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 1, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 3, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 0, # 'θ' - 5: 3, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 3, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 2, # 'υ' - 28: 3, # 'φ' - 23: 0, # 'χ' - 42: 2, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ό' - 26: 2, # 'ύ' - 27: 2, # 'ώ' - }, - 6: { # 'ν' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 2, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 3, # 'δ' - 3: 3, # 'ε' - 32: 2, # 'ζ' - 13: 3, # 'η' - 25: 3, # 'θ' - 5: 3, # 'ι' - 11: 0, # 'κ' - 16: 1, # 'λ' - 10: 0, # 'μ' - 6: 2, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 3, # 'σ' - 2: 3, # 'τ' - 12: 3, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ό' - 26: 3, # 'ύ' - 27: 3, # 'ώ' - }, - 30: { # 'ξ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 2, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 2, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 0, # 'θ' - 5: 2, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 3, # 'τ' - 12: 2, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 2, # 'ό' - 26: 3, # 'ύ' - 27: 1, # 'ώ' - }, - 4: { # 'ο' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 2, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 2, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 2, # 'α' - 29: 3, # 'β' - 20: 3, # 'γ' - 21: 3, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 3, # 'θ' - 5: 3, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 2, # 'ξ' - 4: 2, # 'ο' - 9: 3, # 'π' - 8: 3, # 'ρ' - 14: 3, # 'ς' - 7: 3, # 'σ' - 2: 3, # 'τ' - 12: 3, # 'υ' - 28: 3, # 'φ' - 23: 3, # 'χ' - 42: 2, # 'ψ' - 24: 2, # 'ω' - 19: 1, # 'ό' - 26: 3, # 'ύ' - 27: 2, # 'ώ' - }, - 9: { # 'π' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 0, # 'θ' - 5: 3, # 'ι' - 11: 0, # 'κ' - 16: 3, # 'λ' - 10: 0, # 'μ' - 6: 2, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'π' - 8: 3, # 'ρ' - 14: 2, # 'ς' - 7: 0, # 'σ' - 2: 3, # 'τ' - 12: 3, # 'υ' - 28: 0, # 'φ' - 23: 2, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ό' - 26: 2, # 'ύ' - 27: 3, # 'ώ' - }, - 8: { # 'ρ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 2, # 'β' - 20: 3, # 'γ' - 21: 2, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 3, # 'θ' - 5: 3, # 'ι' - 11: 3, # 'κ' - 16: 1, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 2, # 'ξ' - 4: 3, # 'ο' - 9: 2, # 'π' - 8: 2, # 'ρ' - 14: 0, # 'ς' - 7: 2, # 'σ' - 2: 3, # 'τ' - 12: 3, # 'υ' - 28: 3, # 'φ' - 23: 3, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ό' - 26: 3, # 'ύ' - 27: 3, # 'ώ' - }, - 14: { # 'ς' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 2, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 0, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 0, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 7: { # 'σ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 2, # 'ά' - 18: 2, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 3, # 'β' - 20: 0, # 'γ' - 21: 2, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 3, # 'θ' - 5: 3, # 'ι' - 11: 3, # 'κ' - 16: 2, # 'λ' - 10: 3, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 3, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 3, # 'σ' - 2: 3, # 'τ' - 12: 3, # 'υ' - 28: 3, # 'φ' - 23: 3, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ό' - 26: 3, # 'ύ' - 27: 2, # 'ώ' - }, - 2: { # 'τ' - 60: 0, # 'e' - 55: 2, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 2, # 'ζ' - 13: 3, # 'η' - 25: 0, # 'θ' - 5: 3, # 'ι' - 11: 2, # 'κ' - 16: 2, # 'λ' - 10: 3, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'π' - 8: 3, # 'ρ' - 14: 0, # 'ς' - 7: 3, # 'σ' - 2: 3, # 'τ' - 12: 3, # 'υ' - 28: 2, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ό' - 26: 3, # 'ύ' - 27: 3, # 'ώ' - }, - 12: { # 'υ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 2, # 'ά' - 18: 2, # 'έ' - 22: 3, # 'ή' - 15: 2, # 'ί' - 1: 3, # 'α' - 29: 2, # 'β' - 20: 3, # 'γ' - 21: 2, # 'δ' - 3: 2, # 'ε' - 32: 2, # 'ζ' - 13: 2, # 'η' - 25: 3, # 'θ' - 5: 2, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 3, # 'ξ' - 4: 3, # 'ο' - 9: 3, # 'π' - 8: 3, # 'ρ' - 14: 3, # 'ς' - 7: 3, # 'σ' - 2: 3, # 'τ' - 12: 0, # 'υ' - 28: 2, # 'φ' - 23: 3, # 'χ' - 42: 2, # 'ψ' - 24: 2, # 'ω' - 19: 2, # 'ό' - 26: 0, # 'ύ' - 27: 2, # 'ώ' - }, - 28: { # 'φ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 2, # 'η' - 25: 2, # 'θ' - 5: 3, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 0, # 'μ' - 6: 1, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'π' - 8: 3, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 3, # 'τ' - 12: 3, # 'υ' - 28: 1, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ό' - 26: 2, # 'ύ' - 27: 2, # 'ώ' - }, - 23: { # 'χ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 2, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 2, # 'η' - 25: 2, # 'θ' - 5: 3, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 2, # 'μ' - 6: 3, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'π' - 8: 3, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 3, # 'τ' - 12: 3, # 'υ' - 28: 0, # 'φ' - 23: 2, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ό' - 26: 3, # 'ύ' - 27: 3, # 'ώ' - }, - 42: { # 'ψ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 2, # 'ά' - 18: 2, # 'έ' - 22: 1, # 'ή' - 15: 2, # 'ί' - 1: 2, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 0, # 'θ' - 5: 2, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 2, # 'ο' - 9: 0, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 2, # 'τ' - 12: 1, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 2, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 24: { # 'ω' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 1, # 'ά' - 18: 0, # 'έ' - 22: 2, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 2, # 'β' - 20: 3, # 'γ' - 21: 2, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 3, # 'θ' - 5: 2, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 3, # 'π' - 8: 3, # 'ρ' - 14: 3, # 'ς' - 7: 3, # 'σ' - 2: 3, # 'τ' - 12: 0, # 'υ' - 28: 2, # 'φ' - 23: 2, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 19: { # 'ό' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 3, # 'β' - 20: 3, # 'γ' - 21: 3, # 'δ' - 3: 1, # 'ε' - 32: 2, # 'ζ' - 13: 2, # 'η' - 25: 2, # 'θ' - 5: 2, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 1, # 'ξ' - 4: 2, # 'ο' - 9: 3, # 'π' - 8: 3, # 'ρ' - 14: 3, # 'ς' - 7: 3, # 'σ' - 2: 3, # 'τ' - 12: 0, # 'υ' - 28: 2, # 'φ' - 23: 3, # 'χ' - 42: 2, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 26: { # 'ύ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 2, # 'α' - 29: 2, # 'β' - 20: 2, # 'γ' - 21: 1, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 2, # 'η' - 25: 3, # 'θ' - 5: 0, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 2, # 'ξ' - 4: 3, # 'ο' - 9: 3, # 'π' - 8: 3, # 'ρ' - 14: 3, # 'ς' - 7: 3, # 'σ' - 2: 3, # 'τ' - 12: 0, # 'υ' - 28: 2, # 'φ' - 23: 2, # 'χ' - 42: 2, # 'ψ' - 24: 2, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 27: { # 'ώ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 1, # 'β' - 20: 0, # 'γ' - 21: 3, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 1, # 'η' - 25: 2, # 'θ' - 5: 2, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 1, # 'ξ' - 4: 0, # 'ο' - 9: 2, # 'π' - 8: 3, # 'ρ' - 14: 3, # 'ς' - 7: 3, # 'σ' - 2: 3, # 'τ' - 12: 0, # 'υ' - 28: 1, # 'φ' - 23: 1, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, -} - -# 255: Undefined characters that did not exist in training text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 -# 251: Control characters - -# Character Mapping Table(s): -WINDOWS_1253_GREEK_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 82, # 'A' - 66: 100, # 'B' - 67: 104, # 'C' - 68: 94, # 'D' - 69: 98, # 'E' - 70: 101, # 'F' - 71: 116, # 'G' - 72: 102, # 'H' - 73: 111, # 'I' - 74: 187, # 'J' - 75: 117, # 'K' - 76: 92, # 'L' - 77: 88, # 'M' - 78: 113, # 'N' - 79: 85, # 'O' - 80: 79, # 'P' - 81: 118, # 'Q' - 82: 105, # 'R' - 83: 83, # 'S' - 84: 67, # 'T' - 85: 114, # 'U' - 86: 119, # 'V' - 87: 95, # 'W' - 88: 99, # 'X' - 89: 109, # 'Y' - 90: 188, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 72, # 'a' - 98: 70, # 'b' - 99: 80, # 'c' - 100: 81, # 'd' - 101: 60, # 'e' - 102: 96, # 'f' - 103: 93, # 'g' - 104: 89, # 'h' - 105: 68, # 'i' - 106: 120, # 'j' - 107: 97, # 'k' - 108: 77, # 'l' - 109: 86, # 'm' - 110: 69, # 'n' - 111: 55, # 'o' - 112: 78, # 'p' - 113: 115, # 'q' - 114: 65, # 'r' - 115: 66, # 's' - 116: 58, # 't' - 117: 76, # 'u' - 118: 106, # 'v' - 119: 103, # 'w' - 120: 87, # 'x' - 121: 107, # 'y' - 122: 112, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 255, # '€' - 129: 255, # None - 130: 255, # '‚' - 131: 255, # 'ƒ' - 132: 255, # '„' - 133: 255, # '…' - 134: 255, # '†' - 135: 255, # '‡' - 136: 255, # None - 137: 255, # '‰' - 138: 255, # None - 139: 255, # '‹' - 140: 255, # None - 141: 255, # None - 142: 255, # None - 143: 255, # None - 144: 255, # None - 145: 255, # '‘' - 146: 255, # '’' - 147: 255, # '“' - 148: 255, # '”' - 149: 255, # '•' - 150: 255, # '–' - 151: 255, # '—' - 152: 255, # None - 153: 255, # '™' - 154: 255, # None - 155: 255, # '›' - 156: 255, # None - 157: 255, # None - 158: 255, # None - 159: 255, # None - 160: 253, # '\xa0' - 161: 233, # '΅' - 162: 61, # 'Ά' - 163: 253, # '£' - 164: 253, # '¤' - 165: 253, # '¥' - 166: 253, # '¦' - 167: 253, # '§' - 168: 253, # '¨' - 169: 253, # '©' - 170: 253, # None - 171: 253, # '«' - 172: 253, # '¬' - 173: 74, # '\xad' - 174: 253, # '®' - 175: 253, # '―' - 176: 253, # '°' - 177: 253, # '±' - 178: 253, # '²' - 179: 253, # '³' - 180: 247, # '΄' - 181: 253, # 'µ' - 182: 253, # '¶' - 183: 36, # '·' - 184: 46, # 'Έ' - 185: 71, # 'Ή' - 186: 73, # 'Ί' - 187: 253, # '»' - 188: 54, # 'Ό' - 189: 253, # '½' - 190: 108, # 'Ύ' - 191: 123, # 'Ώ' - 192: 110, # 'ΐ' - 193: 31, # 'Α' - 194: 51, # 'Β' - 195: 43, # 'Γ' - 196: 41, # 'Δ' - 197: 34, # 'Ε' - 198: 91, # 'Ζ' - 199: 40, # 'Η' - 200: 52, # 'Θ' - 201: 47, # 'Ι' - 202: 44, # 'Κ' - 203: 53, # 'Λ' - 204: 38, # 'Μ' - 205: 49, # 'Ν' - 206: 59, # 'Ξ' - 207: 39, # 'Ο' - 208: 35, # 'Π' - 209: 48, # 'Ρ' - 210: 250, # None - 211: 37, # 'Σ' - 212: 33, # 'Τ' - 213: 45, # 'Υ' - 214: 56, # 'Φ' - 215: 50, # 'Χ' - 216: 84, # 'Ψ' - 217: 57, # 'Ω' - 218: 120, # 'Ϊ' - 219: 121, # 'Ϋ' - 220: 17, # 'ά' - 221: 18, # 'έ' - 222: 22, # 'ή' - 223: 15, # 'ί' - 224: 124, # 'ΰ' - 225: 1, # 'α' - 226: 29, # 'β' - 227: 20, # 'γ' - 228: 21, # 'δ' - 229: 3, # 'ε' - 230: 32, # 'ζ' - 231: 13, # 'η' - 232: 25, # 'θ' - 233: 5, # 'ι' - 234: 11, # 'κ' - 235: 16, # 'λ' - 236: 10, # 'μ' - 237: 6, # 'ν' - 238: 30, # 'ξ' - 239: 4, # 'ο' - 240: 9, # 'π' - 241: 8, # 'ρ' - 242: 14, # 'ς' - 243: 7, # 'σ' - 244: 2, # 'τ' - 245: 12, # 'υ' - 246: 28, # 'φ' - 247: 23, # 'χ' - 248: 42, # 'ψ' - 249: 24, # 'ω' - 250: 64, # 'ϊ' - 251: 75, # 'ϋ' - 252: 19, # 'ό' - 253: 26, # 'ύ' - 254: 27, # 'ώ' - 255: 253, # None -} - -WINDOWS_1253_GREEK_MODEL = SingleByteCharSetModel( - charset_name="windows-1253", - language="Greek", - char_to_order_map=WINDOWS_1253_GREEK_CHAR_TO_ORDER, - language_model=GREEK_LANG_MODEL, - typical_positive_ratio=0.982851, - keep_ascii_letters=False, - alphabet="ΆΈΉΊΌΎΏΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩάέήίαβγδεζηθικλμνξοπρςστυφχψωόύώ", -) - -ISO_8859_7_GREEK_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 82, # 'A' - 66: 100, # 'B' - 67: 104, # 'C' - 68: 94, # 'D' - 69: 98, # 'E' - 70: 101, # 'F' - 71: 116, # 'G' - 72: 102, # 'H' - 73: 111, # 'I' - 74: 187, # 'J' - 75: 117, # 'K' - 76: 92, # 'L' - 77: 88, # 'M' - 78: 113, # 'N' - 79: 85, # 'O' - 80: 79, # 'P' - 81: 118, # 'Q' - 82: 105, # 'R' - 83: 83, # 'S' - 84: 67, # 'T' - 85: 114, # 'U' - 86: 119, # 'V' - 87: 95, # 'W' - 88: 99, # 'X' - 89: 109, # 'Y' - 90: 188, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 72, # 'a' - 98: 70, # 'b' - 99: 80, # 'c' - 100: 81, # 'd' - 101: 60, # 'e' - 102: 96, # 'f' - 103: 93, # 'g' - 104: 89, # 'h' - 105: 68, # 'i' - 106: 120, # 'j' - 107: 97, # 'k' - 108: 77, # 'l' - 109: 86, # 'm' - 110: 69, # 'n' - 111: 55, # 'o' - 112: 78, # 'p' - 113: 115, # 'q' - 114: 65, # 'r' - 115: 66, # 's' - 116: 58, # 't' - 117: 76, # 'u' - 118: 106, # 'v' - 119: 103, # 'w' - 120: 87, # 'x' - 121: 107, # 'y' - 122: 112, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 255, # '\x80' - 129: 255, # '\x81' - 130: 255, # '\x82' - 131: 255, # '\x83' - 132: 255, # '\x84' - 133: 255, # '\x85' - 134: 255, # '\x86' - 135: 255, # '\x87' - 136: 255, # '\x88' - 137: 255, # '\x89' - 138: 255, # '\x8a' - 139: 255, # '\x8b' - 140: 255, # '\x8c' - 141: 255, # '\x8d' - 142: 255, # '\x8e' - 143: 255, # '\x8f' - 144: 255, # '\x90' - 145: 255, # '\x91' - 146: 255, # '\x92' - 147: 255, # '\x93' - 148: 255, # '\x94' - 149: 255, # '\x95' - 150: 255, # '\x96' - 151: 255, # '\x97' - 152: 255, # '\x98' - 153: 255, # '\x99' - 154: 255, # '\x9a' - 155: 255, # '\x9b' - 156: 255, # '\x9c' - 157: 255, # '\x9d' - 158: 255, # '\x9e' - 159: 255, # '\x9f' - 160: 253, # '\xa0' - 161: 233, # '‘' - 162: 90, # '’' - 163: 253, # '£' - 164: 253, # '€' - 165: 253, # '₯' - 166: 253, # '¦' - 167: 253, # '§' - 168: 253, # '¨' - 169: 253, # '©' - 170: 253, # 'ͺ' - 171: 253, # '«' - 172: 253, # '¬' - 173: 74, # '\xad' - 174: 253, # None - 175: 253, # '―' - 176: 253, # '°' - 177: 253, # '±' - 178: 253, # '²' - 179: 253, # '³' - 180: 247, # '΄' - 181: 248, # '΅' - 182: 61, # 'Ά' - 183: 36, # '·' - 184: 46, # 'Έ' - 185: 71, # 'Ή' - 186: 73, # 'Ί' - 187: 253, # '»' - 188: 54, # 'Ό' - 189: 253, # '½' - 190: 108, # 'Ύ' - 191: 123, # 'Ώ' - 192: 110, # 'ΐ' - 193: 31, # 'Α' - 194: 51, # 'Β' - 195: 43, # 'Γ' - 196: 41, # 'Δ' - 197: 34, # 'Ε' - 198: 91, # 'Ζ' - 199: 40, # 'Η' - 200: 52, # 'Θ' - 201: 47, # 'Ι' - 202: 44, # 'Κ' - 203: 53, # 'Λ' - 204: 38, # 'Μ' - 205: 49, # 'Ν' - 206: 59, # 'Ξ' - 207: 39, # 'Ο' - 208: 35, # 'Π' - 209: 48, # 'Ρ' - 210: 250, # None - 211: 37, # 'Σ' - 212: 33, # 'Τ' - 213: 45, # 'Υ' - 214: 56, # 'Φ' - 215: 50, # 'Χ' - 216: 84, # 'Ψ' - 217: 57, # 'Ω' - 218: 120, # 'Ϊ' - 219: 121, # 'Ϋ' - 220: 17, # 'ά' - 221: 18, # 'έ' - 222: 22, # 'ή' - 223: 15, # 'ί' - 224: 124, # 'ΰ' - 225: 1, # 'α' - 226: 29, # 'β' - 227: 20, # 'γ' - 228: 21, # 'δ' - 229: 3, # 'ε' - 230: 32, # 'ζ' - 231: 13, # 'η' - 232: 25, # 'θ' - 233: 5, # 'ι' - 234: 11, # 'κ' - 235: 16, # 'λ' - 236: 10, # 'μ' - 237: 6, # 'ν' - 238: 30, # 'ξ' - 239: 4, # 'ο' - 240: 9, # 'π' - 241: 8, # 'ρ' - 242: 14, # 'ς' - 243: 7, # 'σ' - 244: 2, # 'τ' - 245: 12, # 'υ' - 246: 28, # 'φ' - 247: 23, # 'χ' - 248: 42, # 'ψ' - 249: 24, # 'ω' - 250: 64, # 'ϊ' - 251: 75, # 'ϋ' - 252: 19, # 'ό' - 253: 26, # 'ύ' - 254: 27, # 'ώ' - 255: 253, # None -} - -ISO_8859_7_GREEK_MODEL = SingleByteCharSetModel( - charset_name="ISO-8859-7", - language="Greek", - char_to_order_map=ISO_8859_7_GREEK_CHAR_TO_ORDER, - language_model=GREEK_LANG_MODEL, - typical_positive_ratio=0.982851, - keep_ascii_letters=False, - alphabet="ΆΈΉΊΌΎΏΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩάέήίαβγδεζηθικλμνξοπρςστυφχψωόύώ", -) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langhebrewmodel.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langhebrewmodel.py deleted file mode 100644 index 56d2975..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langhebrewmodel.py +++ /dev/null @@ -1,4380 +0,0 @@ -from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel - -# 3: Positive -# 2: Likely -# 1: Unlikely -# 0: Negative - -HEBREW_LANG_MODEL = { - 50: { # 'a' - 50: 0, # 'a' - 60: 1, # 'c' - 61: 1, # 'd' - 42: 1, # 'e' - 53: 1, # 'i' - 56: 2, # 'l' - 54: 2, # 'n' - 49: 0, # 'o' - 51: 2, # 'r' - 43: 1, # 's' - 44: 2, # 't' - 63: 1, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 1, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 0, # 'ל' - 11: 0, # 'ם' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 1, # 'ק' - 7: 0, # 'ר' - 10: 1, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 60: { # 'c' - 50: 1, # 'a' - 60: 1, # 'c' - 61: 0, # 'd' - 42: 1, # 'e' - 53: 1, # 'i' - 56: 1, # 'l' - 54: 0, # 'n' - 49: 1, # 'o' - 51: 1, # 'r' - 43: 1, # 's' - 44: 2, # 't' - 63: 1, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 1, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 1, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 0, # 'ל' - 11: 0, # 'ם' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 1, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 61: { # 'd' - 50: 1, # 'a' - 60: 0, # 'c' - 61: 1, # 'd' - 42: 1, # 'e' - 53: 1, # 'i' - 56: 1, # 'l' - 54: 1, # 'n' - 49: 2, # 'o' - 51: 1, # 'r' - 43: 1, # 's' - 44: 0, # 't' - 63: 1, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 1, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 0, # 'ל' - 11: 0, # 'ם' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 1, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 42: { # 'e' - 50: 1, # 'a' - 60: 1, # 'c' - 61: 2, # 'd' - 42: 1, # 'e' - 53: 1, # 'i' - 56: 2, # 'l' - 54: 2, # 'n' - 49: 1, # 'o' - 51: 2, # 'r' - 43: 2, # 's' - 44: 2, # 't' - 63: 1, # 'u' - 34: 1, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 0, # 'ל' - 11: 0, # 'ם' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 1, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 1, # '–' - 52: 2, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 53: { # 'i' - 50: 1, # 'a' - 60: 2, # 'c' - 61: 1, # 'd' - 42: 1, # 'e' - 53: 0, # 'i' - 56: 1, # 'l' - 54: 2, # 'n' - 49: 2, # 'o' - 51: 1, # 'r' - 43: 2, # 's' - 44: 2, # 't' - 63: 1, # 'u' - 34: 0, # '\xa0' - 55: 1, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 0, # 'ל' - 11: 0, # 'ם' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 56: { # 'l' - 50: 1, # 'a' - 60: 1, # 'c' - 61: 1, # 'd' - 42: 2, # 'e' - 53: 2, # 'i' - 56: 2, # 'l' - 54: 1, # 'n' - 49: 1, # 'o' - 51: 0, # 'r' - 43: 1, # 's' - 44: 1, # 't' - 63: 1, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 0, # 'ל' - 11: 0, # 'ם' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 54: { # 'n' - 50: 1, # 'a' - 60: 1, # 'c' - 61: 1, # 'd' - 42: 1, # 'e' - 53: 1, # 'i' - 56: 1, # 'l' - 54: 1, # 'n' - 49: 1, # 'o' - 51: 0, # 'r' - 43: 1, # 's' - 44: 2, # 't' - 63: 1, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 1, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 0, # 'ל' - 11: 0, # 'ם' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 2, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 49: { # 'o' - 50: 1, # 'a' - 60: 1, # 'c' - 61: 1, # 'd' - 42: 1, # 'e' - 53: 1, # 'i' - 56: 1, # 'l' - 54: 2, # 'n' - 49: 1, # 'o' - 51: 2, # 'r' - 43: 1, # 's' - 44: 1, # 't' - 63: 1, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 0, # 'ל' - 11: 0, # 'ם' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 51: { # 'r' - 50: 2, # 'a' - 60: 1, # 'c' - 61: 1, # 'd' - 42: 2, # 'e' - 53: 1, # 'i' - 56: 1, # 'l' - 54: 1, # 'n' - 49: 2, # 'o' - 51: 1, # 'r' - 43: 1, # 's' - 44: 1, # 't' - 63: 1, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 0, # 'ל' - 11: 0, # 'ם' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 2, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 43: { # 's' - 50: 1, # 'a' - 60: 1, # 'c' - 61: 0, # 'd' - 42: 2, # 'e' - 53: 1, # 'i' - 56: 1, # 'l' - 54: 1, # 'n' - 49: 1, # 'o' - 51: 1, # 'r' - 43: 1, # 's' - 44: 2, # 't' - 63: 1, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 0, # 'ל' - 11: 0, # 'ם' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 2, # '”' - 58: 0, # '†' - 40: 2, # '…' - }, - 44: { # 't' - 50: 1, # 'a' - 60: 1, # 'c' - 61: 0, # 'd' - 42: 2, # 'e' - 53: 2, # 'i' - 56: 1, # 'l' - 54: 0, # 'n' - 49: 1, # 'o' - 51: 1, # 'r' - 43: 1, # 's' - 44: 1, # 't' - 63: 1, # 'u' - 34: 1, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 0, # 'ל' - 11: 0, # 'ם' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 2, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 63: { # 'u' - 50: 1, # 'a' - 60: 1, # 'c' - 61: 1, # 'd' - 42: 1, # 'e' - 53: 1, # 'i' - 56: 1, # 'l' - 54: 1, # 'n' - 49: 0, # 'o' - 51: 1, # 'r' - 43: 2, # 's' - 44: 1, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 0, # 'ל' - 11: 0, # 'ם' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 34: { # '\xa0' - 50: 1, # 'a' - 60: 0, # 'c' - 61: 1, # 'd' - 42: 0, # 'e' - 53: 1, # 'i' - 56: 0, # 'l' - 54: 1, # 'n' - 49: 1, # 'o' - 51: 0, # 'r' - 43: 1, # 's' - 44: 1, # 't' - 63: 0, # 'u' - 34: 2, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 2, # 'א' - 8: 1, # 'ב' - 20: 1, # 'ג' - 16: 1, # 'ד' - 3: 1, # 'ה' - 2: 1, # 'ו' - 24: 1, # 'ז' - 14: 1, # 'ח' - 22: 1, # 'ט' - 1: 2, # 'י' - 25: 0, # 'ך' - 15: 1, # 'כ' - 4: 1, # 'ל' - 11: 0, # 'ם' - 6: 2, # 'מ' - 23: 0, # 'ן' - 12: 1, # 'נ' - 19: 1, # 'ס' - 13: 1, # 'ע' - 26: 0, # 'ף' - 18: 1, # 'פ' - 27: 0, # 'ץ' - 21: 1, # 'צ' - 17: 1, # 'ק' - 7: 1, # 'ר' - 10: 1, # 'ש' - 5: 1, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 55: { # '´' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 1, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 1, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 1, # 'ה' - 2: 1, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 2, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 1, # 'ל' - 11: 0, # 'ם' - 6: 1, # 'מ' - 23: 1, # 'ן' - 12: 1, # 'נ' - 19: 1, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 1, # 'ר' - 10: 1, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 48: { # '¼' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 1, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 1, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 1, # 'כ' - 4: 1, # 'ל' - 11: 0, # 'ם' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 39: { # '½' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 1, # 'כ' - 4: 1, # 'ל' - 11: 0, # 'ם' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 1, # 'צ' - 17: 1, # 'ק' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 57: { # '¾' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 0, # 'ל' - 11: 0, # 'ם' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 30: { # 'ְ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 1, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 1, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 2, # 'א' - 8: 2, # 'ב' - 20: 2, # 'ג' - 16: 2, # 'ד' - 3: 2, # 'ה' - 2: 2, # 'ו' - 24: 2, # 'ז' - 14: 2, # 'ח' - 22: 2, # 'ט' - 1: 2, # 'י' - 25: 2, # 'ך' - 15: 2, # 'כ' - 4: 2, # 'ל' - 11: 1, # 'ם' - 6: 2, # 'מ' - 23: 0, # 'ן' - 12: 2, # 'נ' - 19: 2, # 'ס' - 13: 2, # 'ע' - 26: 0, # 'ף' - 18: 2, # 'פ' - 27: 0, # 'ץ' - 21: 2, # 'צ' - 17: 2, # 'ק' - 7: 2, # 'ר' - 10: 2, # 'ש' - 5: 2, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 59: { # 'ֱ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 1, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 1, # 'ב' - 20: 1, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 0, # 'ו' - 24: 1, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 1, # 'י' - 25: 0, # 'ך' - 15: 1, # 'כ' - 4: 2, # 'ל' - 11: 0, # 'ם' - 6: 2, # 'מ' - 23: 0, # 'ן' - 12: 1, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 1, # 'ר' - 10: 1, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 41: { # 'ֲ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 2, # 'ב' - 20: 1, # 'ג' - 16: 2, # 'ד' - 3: 1, # 'ה' - 2: 1, # 'ו' - 24: 1, # 'ז' - 14: 1, # 'ח' - 22: 1, # 'ט' - 1: 1, # 'י' - 25: 1, # 'ך' - 15: 1, # 'כ' - 4: 2, # 'ל' - 11: 0, # 'ם' - 6: 2, # 'מ' - 23: 0, # 'ן' - 12: 2, # 'נ' - 19: 1, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 1, # 'פ' - 27: 0, # 'ץ' - 21: 2, # 'צ' - 17: 1, # 'ק' - 7: 2, # 'ר' - 10: 2, # 'ש' - 5: 1, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 33: { # 'ִ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 1, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 1, # 'ִ' - 37: 0, # 'ֵ' - 36: 1, # 'ֶ' - 31: 0, # 'ַ' - 29: 1, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 1, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 1, # 'א' - 8: 2, # 'ב' - 20: 2, # 'ג' - 16: 2, # 'ד' - 3: 1, # 'ה' - 2: 1, # 'ו' - 24: 2, # 'ז' - 14: 1, # 'ח' - 22: 1, # 'ט' - 1: 3, # 'י' - 25: 1, # 'ך' - 15: 2, # 'כ' - 4: 2, # 'ל' - 11: 2, # 'ם' - 6: 2, # 'מ' - 23: 2, # 'ן' - 12: 2, # 'נ' - 19: 2, # 'ס' - 13: 1, # 'ע' - 26: 0, # 'ף' - 18: 2, # 'פ' - 27: 1, # 'ץ' - 21: 2, # 'צ' - 17: 2, # 'ק' - 7: 2, # 'ר' - 10: 2, # 'ש' - 5: 2, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 37: { # 'ֵ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 1, # 'ֶ' - 31: 1, # 'ַ' - 29: 1, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 2, # 'א' - 8: 2, # 'ב' - 20: 1, # 'ג' - 16: 2, # 'ד' - 3: 2, # 'ה' - 2: 1, # 'ו' - 24: 1, # 'ז' - 14: 2, # 'ח' - 22: 1, # 'ט' - 1: 3, # 'י' - 25: 2, # 'ך' - 15: 1, # 'כ' - 4: 2, # 'ל' - 11: 2, # 'ם' - 6: 1, # 'מ' - 23: 2, # 'ן' - 12: 2, # 'נ' - 19: 1, # 'ס' - 13: 2, # 'ע' - 26: 1, # 'ף' - 18: 1, # 'פ' - 27: 1, # 'ץ' - 21: 1, # 'צ' - 17: 1, # 'ק' - 7: 2, # 'ר' - 10: 2, # 'ש' - 5: 2, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 36: { # 'ֶ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 1, # 'ֶ' - 31: 1, # 'ַ' - 29: 1, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 2, # 'א' - 8: 2, # 'ב' - 20: 1, # 'ג' - 16: 2, # 'ד' - 3: 2, # 'ה' - 2: 1, # 'ו' - 24: 1, # 'ז' - 14: 2, # 'ח' - 22: 1, # 'ט' - 1: 2, # 'י' - 25: 2, # 'ך' - 15: 1, # 'כ' - 4: 2, # 'ל' - 11: 2, # 'ם' - 6: 2, # 'מ' - 23: 2, # 'ן' - 12: 2, # 'נ' - 19: 2, # 'ס' - 13: 1, # 'ע' - 26: 1, # 'ף' - 18: 1, # 'פ' - 27: 2, # 'ץ' - 21: 1, # 'צ' - 17: 1, # 'ק' - 7: 2, # 'ר' - 10: 2, # 'ש' - 5: 2, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 31: { # 'ַ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 1, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 1, # 'ֶ' - 31: 0, # 'ַ' - 29: 2, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 2, # 'א' - 8: 2, # 'ב' - 20: 2, # 'ג' - 16: 2, # 'ד' - 3: 2, # 'ה' - 2: 1, # 'ו' - 24: 2, # 'ז' - 14: 2, # 'ח' - 22: 2, # 'ט' - 1: 3, # 'י' - 25: 1, # 'ך' - 15: 2, # 'כ' - 4: 2, # 'ל' - 11: 2, # 'ם' - 6: 2, # 'מ' - 23: 2, # 'ן' - 12: 2, # 'נ' - 19: 2, # 'ס' - 13: 2, # 'ע' - 26: 2, # 'ף' - 18: 2, # 'פ' - 27: 1, # 'ץ' - 21: 2, # 'צ' - 17: 2, # 'ק' - 7: 2, # 'ר' - 10: 2, # 'ש' - 5: 2, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 29: { # 'ָ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 1, # 'ַ' - 29: 2, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 1, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 2, # 'א' - 8: 2, # 'ב' - 20: 2, # 'ג' - 16: 2, # 'ד' - 3: 3, # 'ה' - 2: 2, # 'ו' - 24: 2, # 'ז' - 14: 2, # 'ח' - 22: 1, # 'ט' - 1: 2, # 'י' - 25: 2, # 'ך' - 15: 2, # 'כ' - 4: 2, # 'ל' - 11: 2, # 'ם' - 6: 2, # 'מ' - 23: 2, # 'ן' - 12: 2, # 'נ' - 19: 1, # 'ס' - 13: 2, # 'ע' - 26: 1, # 'ף' - 18: 2, # 'פ' - 27: 1, # 'ץ' - 21: 2, # 'צ' - 17: 2, # 'ק' - 7: 2, # 'ר' - 10: 2, # 'ש' - 5: 2, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 35: { # 'ֹ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 1, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 2, # 'א' - 8: 2, # 'ב' - 20: 1, # 'ג' - 16: 2, # 'ד' - 3: 2, # 'ה' - 2: 1, # 'ו' - 24: 1, # 'ז' - 14: 1, # 'ח' - 22: 1, # 'ט' - 1: 1, # 'י' - 25: 1, # 'ך' - 15: 2, # 'כ' - 4: 2, # 'ל' - 11: 2, # 'ם' - 6: 2, # 'מ' - 23: 2, # 'ן' - 12: 2, # 'נ' - 19: 2, # 'ס' - 13: 2, # 'ע' - 26: 1, # 'ף' - 18: 2, # 'פ' - 27: 1, # 'ץ' - 21: 2, # 'צ' - 17: 2, # 'ק' - 7: 2, # 'ר' - 10: 2, # 'ש' - 5: 2, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 62: { # 'ֻ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 1, # 'ב' - 20: 1, # 'ג' - 16: 1, # 'ד' - 3: 1, # 'ה' - 2: 1, # 'ו' - 24: 1, # 'ז' - 14: 1, # 'ח' - 22: 0, # 'ט' - 1: 1, # 'י' - 25: 0, # 'ך' - 15: 1, # 'כ' - 4: 2, # 'ל' - 11: 1, # 'ם' - 6: 1, # 'מ' - 23: 1, # 'ן' - 12: 1, # 'נ' - 19: 1, # 'ס' - 13: 1, # 'ע' - 26: 0, # 'ף' - 18: 1, # 'פ' - 27: 0, # 'ץ' - 21: 1, # 'צ' - 17: 1, # 'ק' - 7: 1, # 'ר' - 10: 1, # 'ש' - 5: 1, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 28: { # 'ּ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 3, # 'ְ' - 59: 0, # 'ֱ' - 41: 1, # 'ֲ' - 33: 3, # 'ִ' - 37: 2, # 'ֵ' - 36: 2, # 'ֶ' - 31: 3, # 'ַ' - 29: 3, # 'ָ' - 35: 2, # 'ֹ' - 62: 1, # 'ֻ' - 28: 0, # 'ּ' - 38: 2, # 'ׁ' - 45: 1, # 'ׂ' - 9: 2, # 'א' - 8: 2, # 'ב' - 20: 1, # 'ג' - 16: 2, # 'ד' - 3: 1, # 'ה' - 2: 2, # 'ו' - 24: 1, # 'ז' - 14: 1, # 'ח' - 22: 1, # 'ט' - 1: 2, # 'י' - 25: 2, # 'ך' - 15: 2, # 'כ' - 4: 2, # 'ל' - 11: 1, # 'ם' - 6: 2, # 'מ' - 23: 1, # 'ן' - 12: 2, # 'נ' - 19: 1, # 'ס' - 13: 2, # 'ע' - 26: 1, # 'ף' - 18: 1, # 'פ' - 27: 1, # 'ץ' - 21: 1, # 'צ' - 17: 1, # 'ק' - 7: 2, # 'ר' - 10: 2, # 'ש' - 5: 2, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 38: { # 'ׁ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 2, # 'ִ' - 37: 2, # 'ֵ' - 36: 2, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 1, # 'ֹ' - 62: 1, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 2, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 1, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 0, # 'ל' - 11: 0, # 'ם' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 1, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 45: { # 'ׂ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 2, # 'ִ' - 37: 1, # 'ֵ' - 36: 2, # 'ֶ' - 31: 1, # 'ַ' - 29: 2, # 'ָ' - 35: 1, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 1, # 'א' - 8: 0, # 'ב' - 20: 1, # 'ג' - 16: 0, # 'ד' - 3: 1, # 'ה' - 2: 2, # 'ו' - 24: 0, # 'ז' - 14: 1, # 'ח' - 22: 0, # 'ט' - 1: 1, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 0, # 'ל' - 11: 1, # 'ם' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 1, # 'נ' - 19: 0, # 'ס' - 13: 1, # 'ע' - 26: 0, # 'ף' - 18: 1, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 1, # 'ר' - 10: 0, # 'ש' - 5: 1, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 9: { # 'א' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 1, # '´' - 48: 1, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 2, # 'ֱ' - 41: 2, # 'ֲ' - 33: 2, # 'ִ' - 37: 2, # 'ֵ' - 36: 2, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 2, # 'ֹ' - 62: 1, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 2, # 'א' - 8: 3, # 'ב' - 20: 3, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 3, # 'ז' - 14: 3, # 'ח' - 22: 3, # 'ט' - 1: 3, # 'י' - 25: 3, # 'ך' - 15: 3, # 'כ' - 4: 3, # 'ל' - 11: 3, # 'ם' - 6: 3, # 'מ' - 23: 3, # 'ן' - 12: 3, # 'נ' - 19: 3, # 'ס' - 13: 2, # 'ע' - 26: 3, # 'ף' - 18: 3, # 'פ' - 27: 1, # 'ץ' - 21: 3, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 8: { # 'ב' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 1, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 1, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 2, # 'ִ' - 37: 2, # 'ֵ' - 36: 2, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 2, # 'ֹ' - 62: 1, # 'ֻ' - 28: 3, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 3, # 'א' - 8: 3, # 'ב' - 20: 3, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 3, # 'ז' - 14: 3, # 'ח' - 22: 3, # 'ט' - 1: 3, # 'י' - 25: 2, # 'ך' - 15: 3, # 'כ' - 4: 3, # 'ל' - 11: 2, # 'ם' - 6: 3, # 'מ' - 23: 3, # 'ן' - 12: 3, # 'נ' - 19: 3, # 'ס' - 13: 3, # 'ע' - 26: 1, # 'ף' - 18: 3, # 'פ' - 27: 2, # 'ץ' - 21: 3, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 1, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 20: { # 'ג' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 2, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 1, # 'ִ' - 37: 1, # 'ֵ' - 36: 1, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 1, # 'ֹ' - 62: 0, # 'ֻ' - 28: 2, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 2, # 'א' - 8: 3, # 'ב' - 20: 2, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 3, # 'ז' - 14: 2, # 'ח' - 22: 2, # 'ט' - 1: 3, # 'י' - 25: 1, # 'ך' - 15: 1, # 'כ' - 4: 3, # 'ל' - 11: 3, # 'ם' - 6: 3, # 'מ' - 23: 3, # 'ן' - 12: 3, # 'נ' - 19: 2, # 'ס' - 13: 3, # 'ע' - 26: 2, # 'ף' - 18: 2, # 'פ' - 27: 1, # 'ץ' - 21: 1, # 'צ' - 17: 1, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 16: { # 'ד' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 2, # 'ִ' - 37: 2, # 'ֵ' - 36: 2, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 2, # 'ֹ' - 62: 1, # 'ֻ' - 28: 2, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 3, # 'א' - 8: 3, # 'ב' - 20: 3, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 1, # 'ז' - 14: 2, # 'ח' - 22: 2, # 'ט' - 1: 3, # 'י' - 25: 2, # 'ך' - 15: 2, # 'כ' - 4: 3, # 'ל' - 11: 3, # 'ם' - 6: 3, # 'מ' - 23: 2, # 'ן' - 12: 3, # 'נ' - 19: 2, # 'ס' - 13: 3, # 'ע' - 26: 2, # 'ף' - 18: 3, # 'פ' - 27: 0, # 'ץ' - 21: 2, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 3: { # 'ה' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 1, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 0, # '´' - 48: 1, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 1, # 'ְ' - 59: 1, # 'ֱ' - 41: 2, # 'ֲ' - 33: 2, # 'ִ' - 37: 2, # 'ֵ' - 36: 2, # 'ֶ' - 31: 3, # 'ַ' - 29: 2, # 'ָ' - 35: 1, # 'ֹ' - 62: 1, # 'ֻ' - 28: 2, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 3, # 'א' - 8: 3, # 'ב' - 20: 3, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 3, # 'ז' - 14: 3, # 'ח' - 22: 3, # 'ט' - 1: 3, # 'י' - 25: 1, # 'ך' - 15: 3, # 'כ' - 4: 3, # 'ל' - 11: 3, # 'ם' - 6: 3, # 'מ' - 23: 3, # 'ן' - 12: 3, # 'נ' - 19: 3, # 'ס' - 13: 3, # 'ע' - 26: 0, # 'ף' - 18: 3, # 'פ' - 27: 1, # 'ץ' - 21: 3, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 1, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 2, # '…' - }, - 2: { # 'ו' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 1, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 1, # '´' - 48: 1, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 2, # 'ִ' - 37: 1, # 'ֵ' - 36: 1, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 3, # 'ֹ' - 62: 0, # 'ֻ' - 28: 3, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 3, # 'א' - 8: 3, # 'ב' - 20: 3, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 3, # 'ז' - 14: 3, # 'ח' - 22: 3, # 'ט' - 1: 3, # 'י' - 25: 3, # 'ך' - 15: 3, # 'כ' - 4: 3, # 'ל' - 11: 3, # 'ם' - 6: 3, # 'מ' - 23: 3, # 'ן' - 12: 3, # 'נ' - 19: 3, # 'ס' - 13: 3, # 'ע' - 26: 3, # 'ף' - 18: 3, # 'פ' - 27: 3, # 'ץ' - 21: 3, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 1, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 2, # '…' - }, - 24: { # 'ז' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 1, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 1, # 'ֲ' - 33: 1, # 'ִ' - 37: 2, # 'ֵ' - 36: 2, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 1, # 'ֹ' - 62: 1, # 'ֻ' - 28: 2, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 3, # 'א' - 8: 2, # 'ב' - 20: 2, # 'ג' - 16: 2, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 2, # 'ז' - 14: 2, # 'ח' - 22: 1, # 'ט' - 1: 3, # 'י' - 25: 1, # 'ך' - 15: 3, # 'כ' - 4: 3, # 'ל' - 11: 2, # 'ם' - 6: 3, # 'מ' - 23: 2, # 'ן' - 12: 2, # 'נ' - 19: 1, # 'ס' - 13: 2, # 'ע' - 26: 1, # 'ף' - 18: 1, # 'פ' - 27: 0, # 'ץ' - 21: 2, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 1, # 'ש' - 5: 2, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 14: { # 'ח' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 1, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 1, # 'ֱ' - 41: 2, # 'ֲ' - 33: 2, # 'ִ' - 37: 2, # 'ֵ' - 36: 2, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 2, # 'ֹ' - 62: 1, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 2, # 'א' - 8: 3, # 'ב' - 20: 2, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 3, # 'ז' - 14: 2, # 'ח' - 22: 2, # 'ט' - 1: 3, # 'י' - 25: 1, # 'ך' - 15: 2, # 'כ' - 4: 3, # 'ל' - 11: 3, # 'ם' - 6: 3, # 'מ' - 23: 2, # 'ן' - 12: 3, # 'נ' - 19: 3, # 'ס' - 13: 1, # 'ע' - 26: 2, # 'ף' - 18: 2, # 'פ' - 27: 2, # 'ץ' - 21: 3, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 22: { # 'ט' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 2, # 'ִ' - 37: 1, # 'ֵ' - 36: 1, # 'ֶ' - 31: 2, # 'ַ' - 29: 1, # 'ָ' - 35: 1, # 'ֹ' - 62: 1, # 'ֻ' - 28: 1, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 3, # 'א' - 8: 3, # 'ב' - 20: 3, # 'ג' - 16: 1, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 2, # 'ז' - 14: 3, # 'ח' - 22: 2, # 'ט' - 1: 3, # 'י' - 25: 1, # 'ך' - 15: 2, # 'כ' - 4: 3, # 'ל' - 11: 2, # 'ם' - 6: 2, # 'מ' - 23: 2, # 'ן' - 12: 3, # 'נ' - 19: 2, # 'ס' - 13: 3, # 'ע' - 26: 2, # 'ף' - 18: 3, # 'פ' - 27: 1, # 'ץ' - 21: 2, # 'צ' - 17: 2, # 'ק' - 7: 3, # 'ר' - 10: 2, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 1: { # 'י' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 1, # '´' - 48: 1, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 2, # 'ִ' - 37: 2, # 'ֵ' - 36: 1, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 2, # 'ֹ' - 62: 1, # 'ֻ' - 28: 2, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 3, # 'א' - 8: 3, # 'ב' - 20: 3, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 3, # 'ז' - 14: 3, # 'ח' - 22: 3, # 'ט' - 1: 3, # 'י' - 25: 3, # 'ך' - 15: 3, # 'כ' - 4: 3, # 'ל' - 11: 3, # 'ם' - 6: 3, # 'מ' - 23: 3, # 'ן' - 12: 3, # 'נ' - 19: 3, # 'ס' - 13: 3, # 'ע' - 26: 3, # 'ף' - 18: 3, # 'פ' - 27: 3, # 'ץ' - 21: 3, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 1, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 2, # '…' - }, - 25: { # 'ך' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 2, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 1, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 1, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 1, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 1, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 1, # 'ל' - 11: 0, # 'ם' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 0, # 'ר' - 10: 1, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 15: { # 'כ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 2, # 'ִ' - 37: 2, # 'ֵ' - 36: 2, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 1, # 'ֹ' - 62: 1, # 'ֻ' - 28: 3, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 3, # 'א' - 8: 3, # 'ב' - 20: 2, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 3, # 'ז' - 14: 3, # 'ח' - 22: 2, # 'ט' - 1: 3, # 'י' - 25: 3, # 'ך' - 15: 3, # 'כ' - 4: 3, # 'ל' - 11: 3, # 'ם' - 6: 3, # 'מ' - 23: 3, # 'ן' - 12: 3, # 'נ' - 19: 3, # 'ס' - 13: 2, # 'ע' - 26: 3, # 'ף' - 18: 3, # 'פ' - 27: 1, # 'ץ' - 21: 2, # 'צ' - 17: 2, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 4: { # 'ל' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 1, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 3, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 2, # 'ִ' - 37: 2, # 'ֵ' - 36: 2, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 2, # 'ֹ' - 62: 1, # 'ֻ' - 28: 2, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 3, # 'א' - 8: 3, # 'ב' - 20: 3, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 3, # 'ז' - 14: 3, # 'ח' - 22: 3, # 'ט' - 1: 3, # 'י' - 25: 3, # 'ך' - 15: 3, # 'כ' - 4: 3, # 'ל' - 11: 3, # 'ם' - 6: 3, # 'מ' - 23: 2, # 'ן' - 12: 3, # 'נ' - 19: 3, # 'ס' - 13: 3, # 'ע' - 26: 2, # 'ף' - 18: 3, # 'פ' - 27: 2, # 'ץ' - 21: 3, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 1, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 11: { # 'ם' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 1, # 'א' - 8: 1, # 'ב' - 20: 1, # 'ג' - 16: 0, # 'ד' - 3: 1, # 'ה' - 2: 1, # 'ו' - 24: 1, # 'ז' - 14: 1, # 'ח' - 22: 0, # 'ט' - 1: 1, # 'י' - 25: 0, # 'ך' - 15: 1, # 'כ' - 4: 1, # 'ל' - 11: 1, # 'ם' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 1, # 'נ' - 19: 0, # 'ס' - 13: 1, # 'ע' - 26: 0, # 'ף' - 18: 1, # 'פ' - 27: 1, # 'ץ' - 21: 1, # 'צ' - 17: 1, # 'ק' - 7: 1, # 'ר' - 10: 1, # 'ש' - 5: 1, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 2, # '…' - }, - 6: { # 'מ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 1, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 2, # 'ִ' - 37: 2, # 'ֵ' - 36: 2, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 2, # 'ֹ' - 62: 1, # 'ֻ' - 28: 2, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 3, # 'א' - 8: 3, # 'ב' - 20: 3, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 3, # 'ז' - 14: 3, # 'ח' - 22: 3, # 'ט' - 1: 3, # 'י' - 25: 2, # 'ך' - 15: 3, # 'כ' - 4: 3, # 'ל' - 11: 3, # 'ם' - 6: 3, # 'מ' - 23: 3, # 'ן' - 12: 3, # 'נ' - 19: 3, # 'ס' - 13: 3, # 'ע' - 26: 0, # 'ף' - 18: 3, # 'פ' - 27: 2, # 'ץ' - 21: 3, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 23: { # 'ן' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 0, # '´' - 48: 1, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 1, # 'א' - 8: 1, # 'ב' - 20: 1, # 'ג' - 16: 1, # 'ד' - 3: 1, # 'ה' - 2: 1, # 'ו' - 24: 0, # 'ז' - 14: 1, # 'ח' - 22: 1, # 'ט' - 1: 1, # 'י' - 25: 0, # 'ך' - 15: 1, # 'כ' - 4: 1, # 'ל' - 11: 1, # 'ם' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 1, # 'נ' - 19: 1, # 'ס' - 13: 1, # 'ע' - 26: 1, # 'ף' - 18: 1, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 1, # 'ק' - 7: 1, # 'ר' - 10: 1, # 'ש' - 5: 1, # 'ת' - 32: 1, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 2, # '…' - }, - 12: { # 'נ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 2, # 'ִ' - 37: 2, # 'ֵ' - 36: 2, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 1, # 'ֹ' - 62: 1, # 'ֻ' - 28: 2, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 3, # 'א' - 8: 3, # 'ב' - 20: 3, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 3, # 'ז' - 14: 3, # 'ח' - 22: 3, # 'ט' - 1: 3, # 'י' - 25: 2, # 'ך' - 15: 3, # 'כ' - 4: 3, # 'ל' - 11: 3, # 'ם' - 6: 3, # 'מ' - 23: 3, # 'ן' - 12: 3, # 'נ' - 19: 3, # 'ס' - 13: 3, # 'ע' - 26: 2, # 'ף' - 18: 3, # 'פ' - 27: 2, # 'ץ' - 21: 3, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 19: { # 'ס' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 1, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 2, # 'ִ' - 37: 1, # 'ֵ' - 36: 2, # 'ֶ' - 31: 2, # 'ַ' - 29: 1, # 'ָ' - 35: 1, # 'ֹ' - 62: 2, # 'ֻ' - 28: 2, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 2, # 'א' - 8: 3, # 'ב' - 20: 3, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 1, # 'ז' - 14: 3, # 'ח' - 22: 3, # 'ט' - 1: 3, # 'י' - 25: 2, # 'ך' - 15: 3, # 'כ' - 4: 3, # 'ל' - 11: 2, # 'ם' - 6: 3, # 'מ' - 23: 2, # 'ן' - 12: 3, # 'נ' - 19: 2, # 'ס' - 13: 3, # 'ע' - 26: 3, # 'ף' - 18: 3, # 'פ' - 27: 0, # 'ץ' - 21: 2, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 1, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 13: { # 'ע' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 1, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 1, # 'ְ' - 59: 1, # 'ֱ' - 41: 2, # 'ֲ' - 33: 2, # 'ִ' - 37: 2, # 'ֵ' - 36: 2, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 2, # 'ֹ' - 62: 1, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 2, # 'א' - 8: 3, # 'ב' - 20: 3, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 3, # 'ז' - 14: 1, # 'ח' - 22: 3, # 'ט' - 1: 3, # 'י' - 25: 2, # 'ך' - 15: 2, # 'כ' - 4: 3, # 'ל' - 11: 3, # 'ם' - 6: 3, # 'מ' - 23: 2, # 'ן' - 12: 3, # 'נ' - 19: 3, # 'ס' - 13: 2, # 'ע' - 26: 1, # 'ף' - 18: 2, # 'פ' - 27: 2, # 'ץ' - 21: 3, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 26: { # 'ף' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 1, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 1, # 'ו' - 24: 0, # 'ז' - 14: 1, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 1, # 'כ' - 4: 1, # 'ל' - 11: 0, # 'ם' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 1, # 'ס' - 13: 0, # 'ע' - 26: 1, # 'ף' - 18: 1, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 1, # 'ק' - 7: 1, # 'ר' - 10: 1, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 18: { # 'פ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 1, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 2, # 'ִ' - 37: 1, # 'ֵ' - 36: 2, # 'ֶ' - 31: 1, # 'ַ' - 29: 2, # 'ָ' - 35: 1, # 'ֹ' - 62: 1, # 'ֻ' - 28: 2, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 3, # 'א' - 8: 2, # 'ב' - 20: 3, # 'ג' - 16: 2, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 2, # 'ז' - 14: 3, # 'ח' - 22: 3, # 'ט' - 1: 3, # 'י' - 25: 2, # 'ך' - 15: 3, # 'כ' - 4: 3, # 'ל' - 11: 2, # 'ם' - 6: 2, # 'מ' - 23: 3, # 'ן' - 12: 3, # 'נ' - 19: 3, # 'ס' - 13: 3, # 'ע' - 26: 2, # 'ף' - 18: 2, # 'פ' - 27: 2, # 'ץ' - 21: 3, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 27: { # 'ץ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 1, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 1, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 1, # 'ל' - 11: 0, # 'ם' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 1, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 1, # 'ר' - 10: 0, # 'ש' - 5: 1, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 21: { # 'צ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 1, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 2, # 'ִ' - 37: 2, # 'ֵ' - 36: 1, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 1, # 'ֹ' - 62: 1, # 'ֻ' - 28: 2, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 3, # 'א' - 8: 3, # 'ב' - 20: 2, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 1, # 'ז' - 14: 3, # 'ח' - 22: 2, # 'ט' - 1: 3, # 'י' - 25: 1, # 'ך' - 15: 1, # 'כ' - 4: 3, # 'ל' - 11: 2, # 'ם' - 6: 3, # 'מ' - 23: 2, # 'ן' - 12: 3, # 'נ' - 19: 1, # 'ס' - 13: 3, # 'ע' - 26: 2, # 'ף' - 18: 3, # 'פ' - 27: 2, # 'ץ' - 21: 2, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 0, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 17: { # 'ק' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 1, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 2, # 'ִ' - 37: 2, # 'ֵ' - 36: 1, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 2, # 'ֹ' - 62: 1, # 'ֻ' - 28: 2, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 3, # 'א' - 8: 3, # 'ב' - 20: 2, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 2, # 'ז' - 14: 3, # 'ח' - 22: 3, # 'ט' - 1: 3, # 'י' - 25: 1, # 'ך' - 15: 1, # 'כ' - 4: 3, # 'ל' - 11: 2, # 'ם' - 6: 3, # 'מ' - 23: 2, # 'ן' - 12: 3, # 'נ' - 19: 3, # 'ס' - 13: 3, # 'ע' - 26: 2, # 'ף' - 18: 3, # 'פ' - 27: 2, # 'ץ' - 21: 3, # 'צ' - 17: 2, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 7: { # 'ר' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 2, # '´' - 48: 1, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 1, # 'ֲ' - 33: 2, # 'ִ' - 37: 2, # 'ֵ' - 36: 2, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 2, # 'ֹ' - 62: 1, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 3, # 'א' - 8: 3, # 'ב' - 20: 3, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 3, # 'ז' - 14: 3, # 'ח' - 22: 3, # 'ט' - 1: 3, # 'י' - 25: 3, # 'ך' - 15: 3, # 'כ' - 4: 3, # 'ל' - 11: 3, # 'ם' - 6: 3, # 'מ' - 23: 3, # 'ן' - 12: 3, # 'נ' - 19: 3, # 'ס' - 13: 3, # 'ע' - 26: 2, # 'ף' - 18: 3, # 'פ' - 27: 3, # 'ץ' - 21: 3, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 2, # '…' - }, - 10: { # 'ש' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 1, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 1, # 'ִ' - 37: 1, # 'ֵ' - 36: 1, # 'ֶ' - 31: 1, # 'ַ' - 29: 1, # 'ָ' - 35: 1, # 'ֹ' - 62: 1, # 'ֻ' - 28: 2, # 'ּ' - 38: 3, # 'ׁ' - 45: 2, # 'ׂ' - 9: 3, # 'א' - 8: 3, # 'ב' - 20: 3, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 2, # 'ז' - 14: 3, # 'ח' - 22: 3, # 'ט' - 1: 3, # 'י' - 25: 3, # 'ך' - 15: 3, # 'כ' - 4: 3, # 'ל' - 11: 3, # 'ם' - 6: 3, # 'מ' - 23: 2, # 'ן' - 12: 3, # 'נ' - 19: 2, # 'ס' - 13: 3, # 'ע' - 26: 2, # 'ף' - 18: 3, # 'פ' - 27: 1, # 'ץ' - 21: 2, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 5: { # 'ת' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 0, # '´' - 48: 1, # '¼' - 39: 1, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 2, # 'ִ' - 37: 2, # 'ֵ' - 36: 2, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 1, # 'ֹ' - 62: 1, # 'ֻ' - 28: 2, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 3, # 'א' - 8: 3, # 'ב' - 20: 3, # 'ג' - 16: 2, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 2, # 'ז' - 14: 3, # 'ח' - 22: 2, # 'ט' - 1: 3, # 'י' - 25: 2, # 'ך' - 15: 3, # 'כ' - 4: 3, # 'ל' - 11: 3, # 'ם' - 6: 3, # 'מ' - 23: 3, # 'ן' - 12: 3, # 'נ' - 19: 2, # 'ס' - 13: 3, # 'ע' - 26: 2, # 'ף' - 18: 3, # 'פ' - 27: 1, # 'ץ' - 21: 2, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 1, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 2, # '…' - }, - 32: { # '–' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 1, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 1, # 'א' - 8: 1, # 'ב' - 20: 1, # 'ג' - 16: 1, # 'ד' - 3: 1, # 'ה' - 2: 1, # 'ו' - 24: 0, # 'ז' - 14: 1, # 'ח' - 22: 0, # 'ט' - 1: 1, # 'י' - 25: 0, # 'ך' - 15: 1, # 'כ' - 4: 1, # 'ל' - 11: 0, # 'ם' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 1, # 'ס' - 13: 1, # 'ע' - 26: 0, # 'ף' - 18: 1, # 'פ' - 27: 0, # 'ץ' - 21: 1, # 'צ' - 17: 0, # 'ק' - 7: 1, # 'ר' - 10: 1, # 'ש' - 5: 1, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 52: { # '’' - 50: 1, # 'a' - 60: 0, # 'c' - 61: 1, # 'd' - 42: 1, # 'e' - 53: 1, # 'i' - 56: 1, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 1, # 'r' - 43: 2, # 's' - 44: 2, # 't' - 63: 1, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 1, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 0, # 'ל' - 11: 0, # 'ם' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 1, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 47: { # '“' - 50: 1, # 'a' - 60: 1, # 'c' - 61: 1, # 'd' - 42: 1, # 'e' - 53: 1, # 'i' - 56: 1, # 'l' - 54: 1, # 'n' - 49: 1, # 'o' - 51: 1, # 'r' - 43: 1, # 's' - 44: 1, # 't' - 63: 1, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 2, # 'א' - 8: 1, # 'ב' - 20: 1, # 'ג' - 16: 1, # 'ד' - 3: 1, # 'ה' - 2: 1, # 'ו' - 24: 1, # 'ז' - 14: 1, # 'ח' - 22: 1, # 'ט' - 1: 1, # 'י' - 25: 0, # 'ך' - 15: 1, # 'כ' - 4: 1, # 'ל' - 11: 0, # 'ם' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 1, # 'נ' - 19: 1, # 'ס' - 13: 1, # 'ע' - 26: 0, # 'ף' - 18: 1, # 'פ' - 27: 0, # 'ץ' - 21: 1, # 'צ' - 17: 1, # 'ק' - 7: 1, # 'ר' - 10: 1, # 'ש' - 5: 1, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 46: { # '”' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 1, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 1, # 'א' - 8: 1, # 'ב' - 20: 1, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 1, # 'י' - 25: 0, # 'ך' - 15: 1, # 'כ' - 4: 1, # 'ל' - 11: 0, # 'ם' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 1, # 'צ' - 17: 0, # 'ק' - 7: 1, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 58: { # '†' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 0, # 'ל' - 11: 0, # 'ם' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 2, # '†' - 40: 0, # '…' - }, - 40: { # '…' - 50: 1, # 'a' - 60: 1, # 'c' - 61: 1, # 'd' - 42: 1, # 'e' - 53: 1, # 'i' - 56: 0, # 'l' - 54: 1, # 'n' - 49: 0, # 'o' - 51: 1, # 'r' - 43: 1, # 's' - 44: 1, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 1, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 1, # 'ה' - 2: 1, # 'ו' - 24: 1, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 1, # 'י' - 25: 0, # 'ך' - 15: 1, # 'כ' - 4: 1, # 'ל' - 11: 0, # 'ם' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 1, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 1, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 1, # 'ר' - 10: 1, # 'ש' - 5: 1, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 2, # '…' - }, -} - -# 255: Undefined characters that did not exist in training text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 -# 251: Control characters - -# Character Mapping Table(s): -WINDOWS_1255_HEBREW_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 69, # 'A' - 66: 91, # 'B' - 67: 79, # 'C' - 68: 80, # 'D' - 69: 92, # 'E' - 70: 89, # 'F' - 71: 97, # 'G' - 72: 90, # 'H' - 73: 68, # 'I' - 74: 111, # 'J' - 75: 112, # 'K' - 76: 82, # 'L' - 77: 73, # 'M' - 78: 95, # 'N' - 79: 85, # 'O' - 80: 78, # 'P' - 81: 121, # 'Q' - 82: 86, # 'R' - 83: 71, # 'S' - 84: 67, # 'T' - 85: 102, # 'U' - 86: 107, # 'V' - 87: 84, # 'W' - 88: 114, # 'X' - 89: 103, # 'Y' - 90: 115, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 50, # 'a' - 98: 74, # 'b' - 99: 60, # 'c' - 100: 61, # 'd' - 101: 42, # 'e' - 102: 76, # 'f' - 103: 70, # 'g' - 104: 64, # 'h' - 105: 53, # 'i' - 106: 105, # 'j' - 107: 93, # 'k' - 108: 56, # 'l' - 109: 65, # 'm' - 110: 54, # 'n' - 111: 49, # 'o' - 112: 66, # 'p' - 113: 110, # 'q' - 114: 51, # 'r' - 115: 43, # 's' - 116: 44, # 't' - 117: 63, # 'u' - 118: 81, # 'v' - 119: 77, # 'w' - 120: 98, # 'x' - 121: 75, # 'y' - 122: 108, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 124, # '€' - 129: 202, # None - 130: 203, # '‚' - 131: 204, # 'ƒ' - 132: 205, # '„' - 133: 40, # '…' - 134: 58, # '†' - 135: 206, # '‡' - 136: 207, # 'ˆ' - 137: 208, # '‰' - 138: 209, # None - 139: 210, # '‹' - 140: 211, # None - 141: 212, # None - 142: 213, # None - 143: 214, # None - 144: 215, # None - 145: 83, # '‘' - 146: 52, # '’' - 147: 47, # '“' - 148: 46, # '”' - 149: 72, # '•' - 150: 32, # '–' - 151: 94, # '—' - 152: 216, # '˜' - 153: 113, # '™' - 154: 217, # None - 155: 109, # '›' - 156: 218, # None - 157: 219, # None - 158: 220, # None - 159: 221, # None - 160: 34, # '\xa0' - 161: 116, # '¡' - 162: 222, # '¢' - 163: 118, # '£' - 164: 100, # '₪' - 165: 223, # '¥' - 166: 224, # '¦' - 167: 117, # '§' - 168: 119, # '¨' - 169: 104, # '©' - 170: 125, # '×' - 171: 225, # '«' - 172: 226, # '¬' - 173: 87, # '\xad' - 174: 99, # '®' - 175: 227, # '¯' - 176: 106, # '°' - 177: 122, # '±' - 178: 123, # '²' - 179: 228, # '³' - 180: 55, # '´' - 181: 229, # 'µ' - 182: 230, # '¶' - 183: 101, # '·' - 184: 231, # '¸' - 185: 232, # '¹' - 186: 120, # '÷' - 187: 233, # '»' - 188: 48, # '¼' - 189: 39, # '½' - 190: 57, # '¾' - 191: 234, # '¿' - 192: 30, # 'ְ' - 193: 59, # 'ֱ' - 194: 41, # 'ֲ' - 195: 88, # 'ֳ' - 196: 33, # 'ִ' - 197: 37, # 'ֵ' - 198: 36, # 'ֶ' - 199: 31, # 'ַ' - 200: 29, # 'ָ' - 201: 35, # 'ֹ' - 202: 235, # None - 203: 62, # 'ֻ' - 204: 28, # 'ּ' - 205: 236, # 'ֽ' - 206: 126, # '־' - 207: 237, # 'ֿ' - 208: 238, # '׀' - 209: 38, # 'ׁ' - 210: 45, # 'ׂ' - 211: 239, # '׃' - 212: 240, # 'װ' - 213: 241, # 'ױ' - 214: 242, # 'ײ' - 215: 243, # '׳' - 216: 127, # '״' - 217: 244, # None - 218: 245, # None - 219: 246, # None - 220: 247, # None - 221: 248, # None - 222: 249, # None - 223: 250, # None - 224: 9, # 'א' - 225: 8, # 'ב' - 226: 20, # 'ג' - 227: 16, # 'ד' - 228: 3, # 'ה' - 229: 2, # 'ו' - 230: 24, # 'ז' - 231: 14, # 'ח' - 232: 22, # 'ט' - 233: 1, # 'י' - 234: 25, # 'ך' - 235: 15, # 'כ' - 236: 4, # 'ל' - 237: 11, # 'ם' - 238: 6, # 'מ' - 239: 23, # 'ן' - 240: 12, # 'נ' - 241: 19, # 'ס' - 242: 13, # 'ע' - 243: 26, # 'ף' - 244: 18, # 'פ' - 245: 27, # 'ץ' - 246: 21, # 'צ' - 247: 17, # 'ק' - 248: 7, # 'ר' - 249: 10, # 'ש' - 250: 5, # 'ת' - 251: 251, # None - 252: 252, # None - 253: 128, # '\u200e' - 254: 96, # '\u200f' - 255: 253, # None -} - -WINDOWS_1255_HEBREW_MODEL = SingleByteCharSetModel( - charset_name="windows-1255", - language="Hebrew", - char_to_order_map=WINDOWS_1255_HEBREW_CHAR_TO_ORDER, - language_model=HEBREW_LANG_MODEL, - typical_positive_ratio=0.984004, - keep_ascii_letters=False, - alphabet="אבגדהוזחטיךכלםמןנסעףפץצקרשתװױײ", -) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langhungarianmodel.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langhungarianmodel.py deleted file mode 100644 index 09a0d32..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langhungarianmodel.py +++ /dev/null @@ -1,4649 +0,0 @@ -from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel - -# 3: Positive -# 2: Likely -# 1: Unlikely -# 0: Negative - -HUNGARIAN_LANG_MODEL = { - 28: { # 'A' - 28: 0, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 2, # 'D' - 32: 1, # 'E' - 50: 1, # 'F' - 49: 2, # 'G' - 38: 1, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 2, # 'K' - 41: 2, # 'L' - 34: 1, # 'M' - 35: 2, # 'N' - 47: 1, # 'O' - 46: 2, # 'P' - 43: 2, # 'R' - 33: 2, # 'S' - 37: 2, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 2, # 'Z' - 2: 0, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 2, # 'd' - 1: 1, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 1, # 'h' - 9: 1, # 'i' - 22: 1, # 'j' - 7: 2, # 'k' - 6: 2, # 'l' - 13: 2, # 'm' - 4: 2, # 'n' - 8: 0, # 'o' - 23: 2, # 'p' - 10: 2, # 'r' - 5: 1, # 's' - 3: 1, # 't' - 21: 1, # 'u' - 19: 1, # 'v' - 62: 1, # 'x' - 16: 0, # 'y' - 11: 3, # 'z' - 51: 1, # 'Á' - 44: 0, # 'É' - 61: 1, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 40: { # 'B' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 0, # 'M' - 35: 1, # 'N' - 47: 2, # 'O' - 46: 0, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 3, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 2, # 'i' - 22: 1, # 'j' - 7: 0, # 'k' - 6: 1, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 8: 2, # 'o' - 23: 1, # 'p' - 10: 2, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 3, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 0, # 'z' - 51: 1, # 'Á' - 44: 1, # 'É' - 61: 1, # 'Í' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 2, # 'á' - 15: 2, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 1, # 'ő' - 56: 1, # 'ű' - }, - 54: { # 'C' - 28: 1, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 1, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 1, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 0, # 'N' - 47: 1, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 2, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 0, # 'V' - 55: 1, # 'Y' - 52: 1, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 1, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 1, # 'h' - 9: 1, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 1, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 8: 2, # 'o' - 23: 0, # 'p' - 10: 1, # 'r' - 5: 3, # 's' - 3: 0, # 't' - 21: 1, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 1, # 'z' - 51: 1, # 'Á' - 44: 1, # 'É' - 61: 1, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 1, # 'á' - 15: 1, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 45: { # 'D' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 0, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 0, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 2, # 'O' - 46: 0, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 1, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 3, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 1, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 0, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 8: 1, # 'o' - 23: 0, # 'p' - 10: 2, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 2, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 1, # 'z' - 51: 1, # 'Á' - 44: 1, # 'É' - 61: 1, # 'Í' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 1, # 'á' - 15: 1, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 1, # 'ő' - 56: 0, # 'ű' - }, - 32: { # 'E' - 28: 1, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 1, # 'E' - 50: 1, # 'F' - 49: 2, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 2, # 'K' - 41: 2, # 'L' - 34: 2, # 'M' - 35: 2, # 'N' - 47: 1, # 'O' - 46: 1, # 'P' - 43: 2, # 'R' - 33: 2, # 'S' - 37: 2, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 1, # 'Z' - 2: 1, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 2, # 'd' - 1: 1, # 'e' - 27: 1, # 'f' - 12: 3, # 'g' - 20: 1, # 'h' - 9: 1, # 'i' - 22: 1, # 'j' - 7: 1, # 'k' - 6: 2, # 'l' - 13: 2, # 'm' - 4: 2, # 'n' - 8: 0, # 'o' - 23: 1, # 'p' - 10: 2, # 'r' - 5: 2, # 's' - 3: 1, # 't' - 21: 2, # 'u' - 19: 1, # 'v' - 62: 1, # 'x' - 16: 0, # 'y' - 11: 3, # 'z' - 51: 1, # 'Á' - 44: 1, # 'É' - 61: 0, # 'Í' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 0, # 'Ú' - 63: 1, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 1, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 50: { # 'F' - 28: 1, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 1, # 'E' - 50: 1, # 'F' - 49: 0, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 1, # 'O' - 46: 0, # 'P' - 43: 1, # 'R' - 33: 0, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 0, # 'V' - 55: 1, # 'Y' - 52: 0, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 2, # 'e' - 27: 1, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 2, # 'i' - 22: 1, # 'j' - 7: 0, # 'k' - 6: 1, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 8: 2, # 'o' - 23: 0, # 'p' - 10: 2, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 1, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 0, # 'z' - 51: 1, # 'Á' - 44: 1, # 'É' - 61: 0, # 'Í' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 0, # 'Ú' - 63: 1, # 'Ü' - 14: 1, # 'á' - 15: 1, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 2, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 1, # 'ő' - 56: 1, # 'ű' - }, - 49: { # 'G' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 1, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 2, # 'Y' - 52: 1, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 2, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 1, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 1, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 8: 2, # 'o' - 23: 0, # 'p' - 10: 2, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 1, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 2, # 'y' - 11: 0, # 'z' - 51: 1, # 'Á' - 44: 1, # 'É' - 61: 1, # 'Í' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 1, # 'á' - 15: 1, # 'é' - 30: 0, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 1, # 'ő' - 56: 0, # 'ű' - }, - 38: { # 'H' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 0, # 'D' - 32: 1, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 1, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 1, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 1, # 'O' - 46: 0, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 0, # 'V' - 55: 1, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 2, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 2, # 'i' - 22: 1, # 'j' - 7: 0, # 'k' - 6: 1, # 'l' - 13: 1, # 'm' - 4: 0, # 'n' - 8: 3, # 'o' - 23: 0, # 'p' - 10: 1, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 2, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 0, # 'z' - 51: 2, # 'Á' - 44: 2, # 'É' - 61: 1, # 'Í' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 2, # 'á' - 15: 1, # 'é' - 30: 2, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 1, # 'ő' - 56: 1, # 'ű' - }, - 39: { # 'I' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 1, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 2, # 'K' - 41: 2, # 'L' - 34: 1, # 'M' - 35: 2, # 'N' - 47: 1, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 2, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 2, # 'Z' - 2: 0, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 2, # 'd' - 1: 0, # 'e' - 27: 1, # 'f' - 12: 2, # 'g' - 20: 1, # 'h' - 9: 0, # 'i' - 22: 1, # 'j' - 7: 1, # 'k' - 6: 2, # 'l' - 13: 2, # 'm' - 4: 1, # 'n' - 8: 0, # 'o' - 23: 1, # 'p' - 10: 2, # 'r' - 5: 2, # 's' - 3: 2, # 't' - 21: 0, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 1, # 'z' - 51: 1, # 'Á' - 44: 1, # 'É' - 61: 0, # 'Í' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 53: { # 'J' - 28: 2, # 'A' - 40: 0, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 1, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 1, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 2, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 1, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 0, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 8: 1, # 'o' - 23: 0, # 'p' - 10: 0, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 2, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 0, # 'z' - 51: 1, # 'Á' - 44: 1, # 'É' - 61: 0, # 'Í' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 2, # 'á' - 15: 1, # 'é' - 30: 0, # 'í' - 25: 2, # 'ó' - 24: 2, # 'ö' - 31: 1, # 'ú' - 29: 0, # 'ü' - 42: 1, # 'ő' - 56: 0, # 'ű' - }, - 36: { # 'K' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 0, # 'G' - 38: 1, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 2, # 'O' - 46: 0, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 0, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 2, # 'e' - 27: 1, # 'f' - 12: 0, # 'g' - 20: 1, # 'h' - 9: 3, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 1, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 8: 2, # 'o' - 23: 0, # 'p' - 10: 2, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 1, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 0, # 'z' - 51: 1, # 'Á' - 44: 1, # 'É' - 61: 1, # 'Í' - 58: 1, # 'Ó' - 59: 2, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 2, # 'á' - 15: 2, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 2, # 'ö' - 31: 1, # 'ú' - 29: 2, # 'ü' - 42: 1, # 'ő' - 56: 0, # 'ű' - }, - 41: { # 'L' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 2, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 2, # 'O' - 46: 0, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 2, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 1, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 3, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 2, # 'i' - 22: 1, # 'j' - 7: 0, # 'k' - 6: 1, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 8: 2, # 'o' - 23: 0, # 'p' - 10: 0, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 2, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 0, # 'z' - 51: 2, # 'Á' - 44: 1, # 'É' - 61: 1, # 'Í' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 2, # 'á' - 15: 1, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 0, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 34: { # 'M' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 0, # 'G' - 38: 1, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 1, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 1, # 'Z' - 2: 3, # 'a' - 18: 0, # 'b' - 26: 1, # 'c' - 17: 0, # 'd' - 1: 3, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 3, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 0, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 8: 3, # 'o' - 23: 0, # 'p' - 10: 1, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 2, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 0, # 'z' - 51: 2, # 'Á' - 44: 1, # 'É' - 61: 1, # 'Í' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 2, # 'á' - 15: 2, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'ő' - 56: 1, # 'ű' - }, - 35: { # 'N' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 2, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 1, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 2, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 2, # 'Y' - 52: 1, # 'Z' - 2: 3, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 3, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 2, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 0, # 'l' - 13: 0, # 'm' - 4: 1, # 'n' - 8: 2, # 'o' - 23: 0, # 'p' - 10: 0, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 1, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 2, # 'y' - 11: 0, # 'z' - 51: 1, # 'Á' - 44: 1, # 'É' - 61: 1, # 'Í' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 1, # 'á' - 15: 2, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 1, # 'ő' - 56: 0, # 'ű' - }, - 47: { # 'O' - 28: 1, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 1, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 2, # 'K' - 41: 2, # 'L' - 34: 2, # 'M' - 35: 2, # 'N' - 47: 1, # 'O' - 46: 1, # 'P' - 43: 2, # 'R' - 33: 2, # 'S' - 37: 2, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 1, # 'Z' - 2: 0, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 1, # 'd' - 1: 1, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 1, # 'h' - 9: 1, # 'i' - 22: 1, # 'j' - 7: 2, # 'k' - 6: 2, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 8: 1, # 'o' - 23: 1, # 'p' - 10: 2, # 'r' - 5: 1, # 's' - 3: 2, # 't' - 21: 1, # 'u' - 19: 0, # 'v' - 62: 1, # 'x' - 16: 0, # 'y' - 11: 1, # 'z' - 51: 1, # 'Á' - 44: 1, # 'É' - 61: 0, # 'Í' - 58: 1, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 46: { # 'P' - 28: 1, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 1, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 0, # 'M' - 35: 1, # 'N' - 47: 1, # 'O' - 46: 1, # 'P' - 43: 2, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 1, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 2, # 'e' - 27: 1, # 'f' - 12: 0, # 'g' - 20: 1, # 'h' - 9: 2, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 1, # 'l' - 13: 0, # 'm' - 4: 1, # 'n' - 8: 2, # 'o' - 23: 0, # 'p' - 10: 2, # 'r' - 5: 1, # 's' - 3: 0, # 't' - 21: 1, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 0, # 'z' - 51: 2, # 'Á' - 44: 1, # 'É' - 61: 1, # 'Í' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 0, # 'Ú' - 63: 1, # 'Ü' - 14: 3, # 'á' - 15: 2, # 'é' - 30: 0, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 0, # 'ú' - 29: 1, # 'ü' - 42: 1, # 'ő' - 56: 0, # 'ű' - }, - 43: { # 'R' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 2, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 2, # 'S' - 37: 2, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 1, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 2, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 1, # 'h' - 9: 2, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 0, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 8: 2, # 'o' - 23: 0, # 'p' - 10: 0, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 1, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 0, # 'z' - 51: 2, # 'Á' - 44: 1, # 'É' - 61: 1, # 'Í' - 58: 2, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 2, # 'á' - 15: 2, # 'é' - 30: 1, # 'í' - 25: 2, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 33: { # 'S' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 2, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 2, # 'S' - 37: 2, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 3, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 1, # 'c' - 17: 0, # 'd' - 1: 2, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 1, # 'h' - 9: 2, # 'i' - 22: 0, # 'j' - 7: 1, # 'k' - 6: 1, # 'l' - 13: 1, # 'm' - 4: 0, # 'n' - 8: 2, # 'o' - 23: 1, # 'p' - 10: 0, # 'r' - 5: 0, # 's' - 3: 1, # 't' - 21: 1, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 3, # 'z' - 51: 2, # 'Á' - 44: 1, # 'É' - 61: 1, # 'Í' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 2, # 'á' - 15: 1, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 1, # 'ő' - 56: 1, # 'ű' - }, - 37: { # 'T' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 2, # 'O' - 46: 1, # 'P' - 43: 2, # 'R' - 33: 1, # 'S' - 37: 2, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 1, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 2, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 1, # 'h' - 9: 2, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 0, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 8: 2, # 'o' - 23: 0, # 'p' - 10: 1, # 'r' - 5: 1, # 's' - 3: 0, # 't' - 21: 2, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 1, # 'z' - 51: 2, # 'Á' - 44: 2, # 'É' - 61: 1, # 'Í' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 2, # 'á' - 15: 1, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 2, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 1, # 'ő' - 56: 1, # 'ű' - }, - 57: { # 'U' - 28: 1, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 1, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 1, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 2, # 'S' - 37: 1, # 'T' - 57: 0, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 1, # 'Z' - 2: 0, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 1, # 'd' - 1: 1, # 'e' - 27: 0, # 'f' - 12: 2, # 'g' - 20: 0, # 'h' - 9: 0, # 'i' - 22: 1, # 'j' - 7: 1, # 'k' - 6: 1, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 8: 0, # 'o' - 23: 1, # 'p' - 10: 1, # 'r' - 5: 1, # 's' - 3: 1, # 't' - 21: 0, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 1, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 1, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 48: { # 'V' - 28: 2, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 0, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 1, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 2, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 2, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 1, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 8: 2, # 'o' - 23: 0, # 'p' - 10: 0, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 1, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 0, # 'z' - 51: 2, # 'Á' - 44: 2, # 'É' - 61: 1, # 'Í' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 0, # 'Ú' - 63: 1, # 'Ü' - 14: 2, # 'á' - 15: 2, # 'é' - 30: 1, # 'í' - 25: 0, # 'ó' - 24: 1, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 55: { # 'Y' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 1, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 2, # 'Z' - 2: 1, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 1, # 'd' - 1: 1, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 0, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 0, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 8: 1, # 'o' - 23: 1, # 'p' - 10: 0, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 0, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 0, # 'z' - 51: 1, # 'Á' - 44: 1, # 'É' - 61: 1, # 'Í' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 52: { # 'Z' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 0, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 2, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 2, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 1, # 'Z' - 2: 1, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 1, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 1, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 0, # 'l' - 13: 0, # 'm' - 4: 1, # 'n' - 8: 1, # 'o' - 23: 0, # 'p' - 10: 1, # 'r' - 5: 2, # 's' - 3: 0, # 't' - 21: 1, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 0, # 'z' - 51: 2, # 'Á' - 44: 1, # 'É' - 61: 1, # 'Í' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 1, # 'á' - 15: 1, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 2: { # 'a' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 1, # 'a' - 18: 3, # 'b' - 26: 3, # 'c' - 17: 3, # 'd' - 1: 2, # 'e' - 27: 2, # 'f' - 12: 3, # 'g' - 20: 3, # 'h' - 9: 3, # 'i' - 22: 3, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 2, # 'o' - 23: 3, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 3, # 'v' - 62: 1, # 'x' - 16: 2, # 'y' - 11: 3, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 1, # 'á' - 15: 1, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 18: { # 'b' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 3, # 'b' - 26: 1, # 'c' - 17: 1, # 'd' - 1: 3, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 1, # 'h' - 9: 3, # 'i' - 22: 2, # 'j' - 7: 2, # 'k' - 6: 2, # 'l' - 13: 1, # 'm' - 4: 2, # 'n' - 8: 3, # 'o' - 23: 1, # 'p' - 10: 3, # 'r' - 5: 2, # 's' - 3: 1, # 't' - 21: 3, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 1, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 2, # 'í' - 25: 3, # 'ó' - 24: 2, # 'ö' - 31: 2, # 'ú' - 29: 2, # 'ü' - 42: 2, # 'ő' - 56: 1, # 'ű' - }, - 26: { # 'c' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 1, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 1, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 2, # 'a' - 18: 1, # 'b' - 26: 2, # 'c' - 17: 1, # 'd' - 1: 3, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 3, # 'h' - 9: 3, # 'i' - 22: 1, # 'j' - 7: 2, # 'k' - 6: 1, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 8: 3, # 'o' - 23: 1, # 'p' - 10: 2, # 'r' - 5: 3, # 's' - 3: 2, # 't' - 21: 2, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 2, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 2, # 'á' - 15: 2, # 'é' - 30: 2, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 17: { # 'd' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 2, # 'b' - 26: 1, # 'c' - 17: 2, # 'd' - 1: 3, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 2, # 'h' - 9: 3, # 'i' - 22: 3, # 'j' - 7: 2, # 'k' - 6: 1, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 8: 3, # 'o' - 23: 1, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 3, # 'v' - 62: 0, # 'x' - 16: 2, # 'y' - 11: 2, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 3, # 'í' - 25: 3, # 'ó' - 24: 3, # 'ö' - 31: 2, # 'ú' - 29: 2, # 'ü' - 42: 2, # 'ő' - 56: 1, # 'ű' - }, - 1: { # 'e' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 2, # 'a' - 18: 3, # 'b' - 26: 3, # 'c' - 17: 3, # 'd' - 1: 2, # 'e' - 27: 3, # 'f' - 12: 3, # 'g' - 20: 3, # 'h' - 9: 3, # 'i' - 22: 3, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 2, # 'o' - 23: 3, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 2, # 'u' - 19: 3, # 'v' - 62: 2, # 'x' - 16: 2, # 'y' - 11: 3, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 1, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 27: { # 'f' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 1, # 'd' - 1: 3, # 'e' - 27: 2, # 'f' - 12: 1, # 'g' - 20: 1, # 'h' - 9: 3, # 'i' - 22: 2, # 'j' - 7: 1, # 'k' - 6: 1, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 8: 3, # 'o' - 23: 0, # 'p' - 10: 3, # 'r' - 5: 1, # 's' - 3: 1, # 't' - 21: 2, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 0, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 3, # 'ö' - 31: 1, # 'ú' - 29: 2, # 'ü' - 42: 1, # 'ő' - 56: 1, # 'ű' - }, - 12: { # 'g' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 3, # 'b' - 26: 2, # 'c' - 17: 2, # 'd' - 1: 3, # 'e' - 27: 2, # 'f' - 12: 3, # 'g' - 20: 3, # 'h' - 9: 3, # 'i' - 22: 3, # 'j' - 7: 2, # 'k' - 6: 3, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 8: 3, # 'o' - 23: 1, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 3, # 'v' - 62: 0, # 'x' - 16: 3, # 'y' - 11: 2, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 2, # 'í' - 25: 3, # 'ó' - 24: 2, # 'ö' - 31: 2, # 'ú' - 29: 2, # 'ü' - 42: 2, # 'ő' - 56: 1, # 'ű' - }, - 20: { # 'h' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 0, # 'd' - 1: 3, # 'e' - 27: 0, # 'f' - 12: 1, # 'g' - 20: 2, # 'h' - 9: 3, # 'i' - 22: 1, # 'j' - 7: 1, # 'k' - 6: 1, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 8: 3, # 'o' - 23: 0, # 'p' - 10: 1, # 'r' - 5: 2, # 's' - 3: 1, # 't' - 21: 3, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 2, # 'y' - 11: 0, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 3, # 'í' - 25: 2, # 'ó' - 24: 2, # 'ö' - 31: 2, # 'ú' - 29: 1, # 'ü' - 42: 1, # 'ő' - 56: 1, # 'ű' - }, - 9: { # 'i' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 3, # 'b' - 26: 3, # 'c' - 17: 3, # 'd' - 1: 3, # 'e' - 27: 3, # 'f' - 12: 3, # 'g' - 20: 3, # 'h' - 9: 2, # 'i' - 22: 2, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 2, # 'o' - 23: 2, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 3, # 'v' - 62: 1, # 'x' - 16: 1, # 'y' - 11: 3, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 2, # 'é' - 30: 1, # 'í' - 25: 3, # 'ó' - 24: 1, # 'ö' - 31: 2, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'ő' - 56: 1, # 'ű' - }, - 22: { # 'j' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 2, # 'b' - 26: 1, # 'c' - 17: 3, # 'd' - 1: 3, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 2, # 'h' - 9: 1, # 'i' - 22: 2, # 'j' - 7: 2, # 'k' - 6: 2, # 'l' - 13: 1, # 'm' - 4: 2, # 'n' - 8: 3, # 'o' - 23: 1, # 'p' - 10: 2, # 'r' - 5: 2, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 2, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 1, # 'í' - 25: 3, # 'ó' - 24: 3, # 'ö' - 31: 3, # 'ú' - 29: 2, # 'ü' - 42: 1, # 'ő' - 56: 1, # 'ű' - }, - 7: { # 'k' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 3, # 'b' - 26: 2, # 'c' - 17: 1, # 'd' - 1: 3, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 2, # 'h' - 9: 3, # 'i' - 22: 2, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 1, # 'm' - 4: 3, # 'n' - 8: 3, # 'o' - 23: 1, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 2, # 'v' - 62: 0, # 'x' - 16: 2, # 'y' - 11: 1, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 3, # 'í' - 25: 2, # 'ó' - 24: 3, # 'ö' - 31: 1, # 'ú' - 29: 3, # 'ü' - 42: 1, # 'ő' - 56: 1, # 'ű' - }, - 6: { # 'l' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 1, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 1, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 2, # 'b' - 26: 3, # 'c' - 17: 3, # 'd' - 1: 3, # 'e' - 27: 3, # 'f' - 12: 3, # 'g' - 20: 3, # 'h' - 9: 3, # 'i' - 22: 3, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 3, # 'o' - 23: 2, # 'p' - 10: 2, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 3, # 'v' - 62: 0, # 'x' - 16: 3, # 'y' - 11: 2, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 3, # 'í' - 25: 3, # 'ó' - 24: 3, # 'ö' - 31: 2, # 'ú' - 29: 2, # 'ü' - 42: 3, # 'ő' - 56: 1, # 'ű' - }, - 13: { # 'm' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 3, # 'b' - 26: 2, # 'c' - 17: 1, # 'd' - 1: 3, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 2, # 'h' - 9: 3, # 'i' - 22: 2, # 'j' - 7: 1, # 'k' - 6: 3, # 'l' - 13: 3, # 'm' - 4: 2, # 'n' - 8: 3, # 'o' - 23: 3, # 'p' - 10: 2, # 'r' - 5: 2, # 's' - 3: 2, # 't' - 21: 3, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 2, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 2, # 'í' - 25: 2, # 'ó' - 24: 2, # 'ö' - 31: 2, # 'ú' - 29: 2, # 'ü' - 42: 1, # 'ő' - 56: 2, # 'ű' - }, - 4: { # 'n' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 3, # 'b' - 26: 3, # 'c' - 17: 3, # 'd' - 1: 3, # 'e' - 27: 2, # 'f' - 12: 3, # 'g' - 20: 3, # 'h' - 9: 3, # 'i' - 22: 2, # 'j' - 7: 3, # 'k' - 6: 2, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 8: 3, # 'o' - 23: 2, # 'p' - 10: 2, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 2, # 'v' - 62: 1, # 'x' - 16: 3, # 'y' - 11: 3, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 2, # 'í' - 25: 2, # 'ó' - 24: 3, # 'ö' - 31: 2, # 'ú' - 29: 3, # 'ü' - 42: 2, # 'ő' - 56: 1, # 'ű' - }, - 8: { # 'o' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 1, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 2, # 'a' - 18: 3, # 'b' - 26: 3, # 'c' - 17: 3, # 'd' - 1: 2, # 'e' - 27: 2, # 'f' - 12: 3, # 'g' - 20: 3, # 'h' - 9: 2, # 'i' - 22: 2, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 1, # 'o' - 23: 3, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 2, # 'u' - 19: 3, # 'v' - 62: 1, # 'x' - 16: 1, # 'y' - 11: 3, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 1, # 'á' - 15: 2, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 23: { # 'p' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 1, # 'b' - 26: 2, # 'c' - 17: 1, # 'd' - 1: 3, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 2, # 'h' - 9: 3, # 'i' - 22: 2, # 'j' - 7: 2, # 'k' - 6: 3, # 'l' - 13: 1, # 'm' - 4: 2, # 'n' - 8: 3, # 'o' - 23: 3, # 'p' - 10: 3, # 'r' - 5: 2, # 's' - 3: 2, # 't' - 21: 3, # 'u' - 19: 2, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 2, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 2, # 'í' - 25: 2, # 'ó' - 24: 2, # 'ö' - 31: 1, # 'ú' - 29: 2, # 'ü' - 42: 1, # 'ő' - 56: 1, # 'ű' - }, - 10: { # 'r' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 3, # 'b' - 26: 3, # 'c' - 17: 3, # 'd' - 1: 3, # 'e' - 27: 2, # 'f' - 12: 3, # 'g' - 20: 2, # 'h' - 9: 3, # 'i' - 22: 3, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 3, # 'o' - 23: 2, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 3, # 'v' - 62: 1, # 'x' - 16: 2, # 'y' - 11: 3, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 2, # 'í' - 25: 3, # 'ó' - 24: 3, # 'ö' - 31: 3, # 'ú' - 29: 3, # 'ü' - 42: 2, # 'ő' - 56: 2, # 'ű' - }, - 5: { # 's' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 3, # 'b' - 26: 2, # 'c' - 17: 2, # 'd' - 1: 3, # 'e' - 27: 2, # 'f' - 12: 2, # 'g' - 20: 2, # 'h' - 9: 3, # 'i' - 22: 1, # 'j' - 7: 3, # 'k' - 6: 2, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 3, # 'o' - 23: 2, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 2, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 3, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 3, # 'í' - 25: 3, # 'ó' - 24: 3, # 'ö' - 31: 3, # 'ú' - 29: 3, # 'ü' - 42: 2, # 'ő' - 56: 1, # 'ű' - }, - 3: { # 't' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 3, # 'b' - 26: 2, # 'c' - 17: 1, # 'd' - 1: 3, # 'e' - 27: 2, # 'f' - 12: 1, # 'g' - 20: 3, # 'h' - 9: 3, # 'i' - 22: 3, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 8: 3, # 'o' - 23: 1, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 3, # 'v' - 62: 0, # 'x' - 16: 3, # 'y' - 11: 1, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 2, # 'í' - 25: 3, # 'ó' - 24: 3, # 'ö' - 31: 3, # 'ú' - 29: 3, # 'ü' - 42: 3, # 'ő' - 56: 2, # 'ű' - }, - 21: { # 'u' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 1, # 'a' - 18: 2, # 'b' - 26: 2, # 'c' - 17: 3, # 'd' - 1: 2, # 'e' - 27: 1, # 'f' - 12: 3, # 'g' - 20: 2, # 'h' - 9: 2, # 'i' - 22: 2, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 1, # 'o' - 23: 2, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 1, # 'u' - 19: 3, # 'v' - 62: 1, # 'x' - 16: 1, # 'y' - 11: 2, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 2, # 'á' - 15: 1, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 0, # 'ö' - 31: 1, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 19: { # 'v' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 2, # 'b' - 26: 1, # 'c' - 17: 1, # 'd' - 1: 3, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 1, # 'h' - 9: 3, # 'i' - 22: 1, # 'j' - 7: 1, # 'k' - 6: 1, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 8: 3, # 'o' - 23: 1, # 'p' - 10: 1, # 'r' - 5: 2, # 's' - 3: 2, # 't' - 21: 2, # 'u' - 19: 2, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 1, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 2, # 'í' - 25: 2, # 'ó' - 24: 2, # 'ö' - 31: 1, # 'ú' - 29: 2, # 'ü' - 42: 1, # 'ő' - 56: 1, # 'ű' - }, - 62: { # 'x' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 1, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 0, # 'd' - 1: 1, # 'e' - 27: 1, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 1, # 'i' - 22: 0, # 'j' - 7: 1, # 'k' - 6: 1, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 8: 1, # 'o' - 23: 1, # 'p' - 10: 1, # 'r' - 5: 1, # 's' - 3: 1, # 't' - 21: 1, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 0, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 1, # 'á' - 15: 1, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 16: { # 'y' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 2, # 'b' - 26: 1, # 'c' - 17: 1, # 'd' - 1: 3, # 'e' - 27: 2, # 'f' - 12: 2, # 'g' - 20: 2, # 'h' - 9: 3, # 'i' - 22: 2, # 'j' - 7: 2, # 'k' - 6: 2, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 8: 3, # 'o' - 23: 2, # 'p' - 10: 2, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 3, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 2, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 2, # 'í' - 25: 2, # 'ó' - 24: 3, # 'ö' - 31: 2, # 'ú' - 29: 2, # 'ü' - 42: 1, # 'ő' - 56: 2, # 'ű' - }, - 11: { # 'z' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 2, # 'b' - 26: 1, # 'c' - 17: 3, # 'd' - 1: 3, # 'e' - 27: 1, # 'f' - 12: 2, # 'g' - 20: 2, # 'h' - 9: 3, # 'i' - 22: 1, # 'j' - 7: 3, # 'k' - 6: 2, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 3, # 'o' - 23: 1, # 'p' - 10: 2, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 2, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 3, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 3, # 'í' - 25: 3, # 'ó' - 24: 3, # 'ö' - 31: 2, # 'ú' - 29: 3, # 'ü' - 42: 2, # 'ő' - 56: 1, # 'ű' - }, - 51: { # 'Á' - 28: 0, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 0, # 'E' - 50: 1, # 'F' - 49: 2, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 2, # 'L' - 34: 1, # 'M' - 35: 2, # 'N' - 47: 0, # 'O' - 46: 1, # 'P' - 43: 2, # 'R' - 33: 2, # 'S' - 37: 1, # 'T' - 57: 0, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 1, # 'Z' - 2: 0, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 1, # 'd' - 1: 0, # 'e' - 27: 0, # 'f' - 12: 1, # 'g' - 20: 1, # 'h' - 9: 0, # 'i' - 22: 1, # 'j' - 7: 1, # 'k' - 6: 2, # 'l' - 13: 2, # 'm' - 4: 0, # 'n' - 8: 0, # 'o' - 23: 1, # 'p' - 10: 1, # 'r' - 5: 1, # 's' - 3: 1, # 't' - 21: 0, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 1, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 1, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 44: { # 'É' - 28: 0, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 1, # 'E' - 50: 0, # 'F' - 49: 2, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 2, # 'L' - 34: 1, # 'M' - 35: 2, # 'N' - 47: 0, # 'O' - 46: 1, # 'P' - 43: 2, # 'R' - 33: 2, # 'S' - 37: 2, # 'T' - 57: 0, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 1, # 'Z' - 2: 0, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 1, # 'd' - 1: 0, # 'e' - 27: 0, # 'f' - 12: 1, # 'g' - 20: 1, # 'h' - 9: 0, # 'i' - 22: 1, # 'j' - 7: 1, # 'k' - 6: 2, # 'l' - 13: 1, # 'm' - 4: 2, # 'n' - 8: 0, # 'o' - 23: 1, # 'p' - 10: 2, # 'r' - 5: 3, # 's' - 3: 1, # 't' - 21: 0, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 0, # 'z' - 51: 0, # 'Á' - 44: 1, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 61: { # 'Í' - 28: 0, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 0, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 1, # 'J' - 36: 0, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 0, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 0, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 1, # 'Z' - 2: 0, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 0, # 'e' - 27: 0, # 'f' - 12: 2, # 'g' - 20: 0, # 'h' - 9: 0, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 0, # 'l' - 13: 1, # 'm' - 4: 0, # 'n' - 8: 0, # 'o' - 23: 0, # 'p' - 10: 1, # 'r' - 5: 0, # 's' - 3: 1, # 't' - 21: 0, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 1, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 58: { # 'Ó' - 28: 1, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 0, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 2, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 0, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 0, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 1, # 'Z' - 2: 0, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 1, # 'd' - 1: 0, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 2, # 'h' - 9: 0, # 'i' - 22: 0, # 'j' - 7: 1, # 'k' - 6: 1, # 'l' - 13: 0, # 'm' - 4: 1, # 'n' - 8: 0, # 'o' - 23: 1, # 'p' - 10: 1, # 'r' - 5: 1, # 's' - 3: 0, # 't' - 21: 0, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 1, # 'z' - 51: 0, # 'Á' - 44: 1, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 59: { # 'Ö' - 28: 0, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 0, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 0, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 0, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 1, # 'Z' - 2: 0, # 'a' - 18: 0, # 'b' - 26: 1, # 'c' - 17: 1, # 'd' - 1: 0, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 0, # 'i' - 22: 0, # 'j' - 7: 1, # 'k' - 6: 1, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 8: 0, # 'o' - 23: 0, # 'p' - 10: 2, # 'r' - 5: 1, # 's' - 3: 1, # 't' - 21: 0, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 1, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 60: { # 'Ú' - 28: 0, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 0, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 0, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 1, # 'Z' - 2: 0, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 0, # 'e' - 27: 0, # 'f' - 12: 2, # 'g' - 20: 0, # 'h' - 9: 0, # 'i' - 22: 2, # 'j' - 7: 0, # 'k' - 6: 0, # 'l' - 13: 0, # 'm' - 4: 1, # 'n' - 8: 0, # 'o' - 23: 0, # 'p' - 10: 1, # 'r' - 5: 1, # 's' - 3: 1, # 't' - 21: 0, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 0, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 63: { # 'Ü' - 28: 0, # 'A' - 40: 1, # 'B' - 54: 0, # 'C' - 45: 1, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 0, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 0, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 1, # 'Z' - 2: 0, # 'a' - 18: 1, # 'b' - 26: 0, # 'c' - 17: 1, # 'd' - 1: 0, # 'e' - 27: 0, # 'f' - 12: 1, # 'g' - 20: 0, # 'h' - 9: 0, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 1, # 'l' - 13: 0, # 'm' - 4: 1, # 'n' - 8: 0, # 'o' - 23: 0, # 'p' - 10: 1, # 'r' - 5: 1, # 's' - 3: 1, # 't' - 21: 0, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 1, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 14: { # 'á' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 1, # 'a' - 18: 3, # 'b' - 26: 3, # 'c' - 17: 3, # 'd' - 1: 1, # 'e' - 27: 2, # 'f' - 12: 3, # 'g' - 20: 2, # 'h' - 9: 2, # 'i' - 22: 3, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 1, # 'o' - 23: 2, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 2, # 'u' - 19: 3, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 3, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 1, # 'á' - 15: 2, # 'é' - 30: 1, # 'í' - 25: 0, # 'ó' - 24: 1, # 'ö' - 31: 0, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 15: { # 'é' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 1, # 'a' - 18: 3, # 'b' - 26: 2, # 'c' - 17: 3, # 'd' - 1: 1, # 'e' - 27: 1, # 'f' - 12: 3, # 'g' - 20: 3, # 'h' - 9: 2, # 'i' - 22: 2, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 1, # 'o' - 23: 3, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 0, # 'u' - 19: 3, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 3, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 1, # 'á' - 15: 1, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 30: { # 'í' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 0, # 'a' - 18: 1, # 'b' - 26: 2, # 'c' - 17: 1, # 'd' - 1: 0, # 'e' - 27: 1, # 'f' - 12: 3, # 'g' - 20: 0, # 'h' - 9: 0, # 'i' - 22: 1, # 'j' - 7: 1, # 'k' - 6: 2, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 8: 0, # 'o' - 23: 1, # 'p' - 10: 3, # 'r' - 5: 2, # 's' - 3: 3, # 't' - 21: 0, # 'u' - 19: 3, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 2, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 25: { # 'ó' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 2, # 'a' - 18: 3, # 'b' - 26: 2, # 'c' - 17: 3, # 'd' - 1: 1, # 'e' - 27: 2, # 'f' - 12: 2, # 'g' - 20: 2, # 'h' - 9: 2, # 'i' - 22: 2, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 8: 1, # 'o' - 23: 2, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 1, # 'u' - 19: 2, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 3, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 1, # 'á' - 15: 1, # 'é' - 30: 1, # 'í' - 25: 0, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 24: { # 'ö' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 0, # 'a' - 18: 3, # 'b' - 26: 1, # 'c' - 17: 2, # 'd' - 1: 0, # 'e' - 27: 1, # 'f' - 12: 2, # 'g' - 20: 1, # 'h' - 9: 0, # 'i' - 22: 1, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 0, # 'o' - 23: 2, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 0, # 'u' - 19: 3, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 3, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 31: { # 'ú' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 1, # 'a' - 18: 1, # 'b' - 26: 2, # 'c' - 17: 1, # 'd' - 1: 1, # 'e' - 27: 2, # 'f' - 12: 3, # 'g' - 20: 1, # 'h' - 9: 1, # 'i' - 22: 3, # 'j' - 7: 1, # 'k' - 6: 3, # 'l' - 13: 1, # 'm' - 4: 2, # 'n' - 8: 0, # 'o' - 23: 1, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 2, # 't' - 21: 1, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 2, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 1, # 'á' - 15: 1, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 29: { # 'ü' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 1, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 2, # 'd' - 1: 1, # 'e' - 27: 1, # 'f' - 12: 3, # 'g' - 20: 2, # 'h' - 9: 1, # 'i' - 22: 1, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 1, # 'm' - 4: 3, # 'n' - 8: 0, # 'o' - 23: 1, # 'p' - 10: 2, # 'r' - 5: 2, # 's' - 3: 2, # 't' - 21: 0, # 'u' - 19: 2, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 2, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 1, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 42: { # 'ő' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 1, # 'a' - 18: 2, # 'b' - 26: 1, # 'c' - 17: 2, # 'd' - 1: 1, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 1, # 'h' - 9: 1, # 'i' - 22: 1, # 'j' - 7: 2, # 'k' - 6: 3, # 'l' - 13: 1, # 'm' - 4: 2, # 'n' - 8: 1, # 'o' - 23: 1, # 'p' - 10: 2, # 'r' - 5: 2, # 's' - 3: 2, # 't' - 21: 1, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 2, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 1, # 'é' - 30: 1, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 56: { # 'ű' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 1, # 'a' - 18: 1, # 'b' - 26: 0, # 'c' - 17: 1, # 'd' - 1: 1, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 1, # 'h' - 9: 1, # 'i' - 22: 1, # 'j' - 7: 1, # 'k' - 6: 1, # 'l' - 13: 0, # 'm' - 4: 2, # 'n' - 8: 0, # 'o' - 23: 0, # 'p' - 10: 1, # 'r' - 5: 1, # 's' - 3: 1, # 't' - 21: 0, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 2, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, -} - -# 255: Undefined characters that did not exist in training text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 -# 251: Control characters - -# Character Mapping Table(s): -WINDOWS_1250_HUNGARIAN_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 28, # 'A' - 66: 40, # 'B' - 67: 54, # 'C' - 68: 45, # 'D' - 69: 32, # 'E' - 70: 50, # 'F' - 71: 49, # 'G' - 72: 38, # 'H' - 73: 39, # 'I' - 74: 53, # 'J' - 75: 36, # 'K' - 76: 41, # 'L' - 77: 34, # 'M' - 78: 35, # 'N' - 79: 47, # 'O' - 80: 46, # 'P' - 81: 72, # 'Q' - 82: 43, # 'R' - 83: 33, # 'S' - 84: 37, # 'T' - 85: 57, # 'U' - 86: 48, # 'V' - 87: 64, # 'W' - 88: 68, # 'X' - 89: 55, # 'Y' - 90: 52, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 2, # 'a' - 98: 18, # 'b' - 99: 26, # 'c' - 100: 17, # 'd' - 101: 1, # 'e' - 102: 27, # 'f' - 103: 12, # 'g' - 104: 20, # 'h' - 105: 9, # 'i' - 106: 22, # 'j' - 107: 7, # 'k' - 108: 6, # 'l' - 109: 13, # 'm' - 110: 4, # 'n' - 111: 8, # 'o' - 112: 23, # 'p' - 113: 67, # 'q' - 114: 10, # 'r' - 115: 5, # 's' - 116: 3, # 't' - 117: 21, # 'u' - 118: 19, # 'v' - 119: 65, # 'w' - 120: 62, # 'x' - 121: 16, # 'y' - 122: 11, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 161, # '€' - 129: 162, # None - 130: 163, # '‚' - 131: 164, # None - 132: 165, # '„' - 133: 166, # '…' - 134: 167, # '†' - 135: 168, # '‡' - 136: 169, # None - 137: 170, # '‰' - 138: 171, # 'Š' - 139: 172, # '‹' - 140: 173, # 'Ś' - 141: 174, # 'Ť' - 142: 175, # 'Ž' - 143: 176, # 'Ź' - 144: 177, # None - 145: 178, # '‘' - 146: 179, # '’' - 147: 180, # '“' - 148: 78, # '”' - 149: 181, # '•' - 150: 69, # '–' - 151: 182, # '—' - 152: 183, # None - 153: 184, # '™' - 154: 185, # 'š' - 155: 186, # '›' - 156: 187, # 'ś' - 157: 188, # 'ť' - 158: 189, # 'ž' - 159: 190, # 'ź' - 160: 191, # '\xa0' - 161: 192, # 'ˇ' - 162: 193, # '˘' - 163: 194, # 'Ł' - 164: 195, # '¤' - 165: 196, # 'Ą' - 166: 197, # '¦' - 167: 76, # '§' - 168: 198, # '¨' - 169: 199, # '©' - 170: 200, # 'Ş' - 171: 201, # '«' - 172: 202, # '¬' - 173: 203, # '\xad' - 174: 204, # '®' - 175: 205, # 'Ż' - 176: 81, # '°' - 177: 206, # '±' - 178: 207, # '˛' - 179: 208, # 'ł' - 180: 209, # '´' - 181: 210, # 'µ' - 182: 211, # '¶' - 183: 212, # '·' - 184: 213, # '¸' - 185: 214, # 'ą' - 186: 215, # 'ş' - 187: 216, # '»' - 188: 217, # 'Ľ' - 189: 218, # '˝' - 190: 219, # 'ľ' - 191: 220, # 'ż' - 192: 221, # 'Ŕ' - 193: 51, # 'Á' - 194: 83, # 'Â' - 195: 222, # 'Ă' - 196: 80, # 'Ä' - 197: 223, # 'Ĺ' - 198: 224, # 'Ć' - 199: 225, # 'Ç' - 200: 226, # 'Č' - 201: 44, # 'É' - 202: 227, # 'Ę' - 203: 228, # 'Ë' - 204: 229, # 'Ě' - 205: 61, # 'Í' - 206: 230, # 'Î' - 207: 231, # 'Ď' - 208: 232, # 'Đ' - 209: 233, # 'Ń' - 210: 234, # 'Ň' - 211: 58, # 'Ó' - 212: 235, # 'Ô' - 213: 66, # 'Ő' - 214: 59, # 'Ö' - 215: 236, # '×' - 216: 237, # 'Ř' - 217: 238, # 'Ů' - 218: 60, # 'Ú' - 219: 70, # 'Ű' - 220: 63, # 'Ü' - 221: 239, # 'Ý' - 222: 240, # 'Ţ' - 223: 241, # 'ß' - 224: 84, # 'ŕ' - 225: 14, # 'á' - 226: 75, # 'â' - 227: 242, # 'ă' - 228: 71, # 'ä' - 229: 82, # 'ĺ' - 230: 243, # 'ć' - 231: 73, # 'ç' - 232: 244, # 'č' - 233: 15, # 'é' - 234: 85, # 'ę' - 235: 79, # 'ë' - 236: 86, # 'ě' - 237: 30, # 'í' - 238: 77, # 'î' - 239: 87, # 'ď' - 240: 245, # 'đ' - 241: 246, # 'ń' - 242: 247, # 'ň' - 243: 25, # 'ó' - 244: 74, # 'ô' - 245: 42, # 'ő' - 246: 24, # 'ö' - 247: 248, # '÷' - 248: 249, # 'ř' - 249: 250, # 'ů' - 250: 31, # 'ú' - 251: 56, # 'ű' - 252: 29, # 'ü' - 253: 251, # 'ý' - 254: 252, # 'ţ' - 255: 253, # '˙' -} - -WINDOWS_1250_HUNGARIAN_MODEL = SingleByteCharSetModel( - charset_name="windows-1250", - language="Hungarian", - char_to_order_map=WINDOWS_1250_HUNGARIAN_CHAR_TO_ORDER, - language_model=HUNGARIAN_LANG_MODEL, - typical_positive_ratio=0.947368, - keep_ascii_letters=True, - alphabet="ABCDEFGHIJKLMNOPRSTUVZabcdefghijklmnoprstuvzÁÉÍÓÖÚÜáéíóöúüŐőŰű", -) - -ISO_8859_2_HUNGARIAN_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 28, # 'A' - 66: 40, # 'B' - 67: 54, # 'C' - 68: 45, # 'D' - 69: 32, # 'E' - 70: 50, # 'F' - 71: 49, # 'G' - 72: 38, # 'H' - 73: 39, # 'I' - 74: 53, # 'J' - 75: 36, # 'K' - 76: 41, # 'L' - 77: 34, # 'M' - 78: 35, # 'N' - 79: 47, # 'O' - 80: 46, # 'P' - 81: 71, # 'Q' - 82: 43, # 'R' - 83: 33, # 'S' - 84: 37, # 'T' - 85: 57, # 'U' - 86: 48, # 'V' - 87: 64, # 'W' - 88: 68, # 'X' - 89: 55, # 'Y' - 90: 52, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 2, # 'a' - 98: 18, # 'b' - 99: 26, # 'c' - 100: 17, # 'd' - 101: 1, # 'e' - 102: 27, # 'f' - 103: 12, # 'g' - 104: 20, # 'h' - 105: 9, # 'i' - 106: 22, # 'j' - 107: 7, # 'k' - 108: 6, # 'l' - 109: 13, # 'm' - 110: 4, # 'n' - 111: 8, # 'o' - 112: 23, # 'p' - 113: 67, # 'q' - 114: 10, # 'r' - 115: 5, # 's' - 116: 3, # 't' - 117: 21, # 'u' - 118: 19, # 'v' - 119: 65, # 'w' - 120: 62, # 'x' - 121: 16, # 'y' - 122: 11, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 159, # '\x80' - 129: 160, # '\x81' - 130: 161, # '\x82' - 131: 162, # '\x83' - 132: 163, # '\x84' - 133: 164, # '\x85' - 134: 165, # '\x86' - 135: 166, # '\x87' - 136: 167, # '\x88' - 137: 168, # '\x89' - 138: 169, # '\x8a' - 139: 170, # '\x8b' - 140: 171, # '\x8c' - 141: 172, # '\x8d' - 142: 173, # '\x8e' - 143: 174, # '\x8f' - 144: 175, # '\x90' - 145: 176, # '\x91' - 146: 177, # '\x92' - 147: 178, # '\x93' - 148: 179, # '\x94' - 149: 180, # '\x95' - 150: 181, # '\x96' - 151: 182, # '\x97' - 152: 183, # '\x98' - 153: 184, # '\x99' - 154: 185, # '\x9a' - 155: 186, # '\x9b' - 156: 187, # '\x9c' - 157: 188, # '\x9d' - 158: 189, # '\x9e' - 159: 190, # '\x9f' - 160: 191, # '\xa0' - 161: 192, # 'Ą' - 162: 193, # '˘' - 163: 194, # 'Ł' - 164: 195, # '¤' - 165: 196, # 'Ľ' - 166: 197, # 'Ś' - 167: 75, # '§' - 168: 198, # '¨' - 169: 199, # 'Š' - 170: 200, # 'Ş' - 171: 201, # 'Ť' - 172: 202, # 'Ź' - 173: 203, # '\xad' - 174: 204, # 'Ž' - 175: 205, # 'Ż' - 176: 79, # '°' - 177: 206, # 'ą' - 178: 207, # '˛' - 179: 208, # 'ł' - 180: 209, # '´' - 181: 210, # 'ľ' - 182: 211, # 'ś' - 183: 212, # 'ˇ' - 184: 213, # '¸' - 185: 214, # 'š' - 186: 215, # 'ş' - 187: 216, # 'ť' - 188: 217, # 'ź' - 189: 218, # '˝' - 190: 219, # 'ž' - 191: 220, # 'ż' - 192: 221, # 'Ŕ' - 193: 51, # 'Á' - 194: 81, # 'Â' - 195: 222, # 'Ă' - 196: 78, # 'Ä' - 197: 223, # 'Ĺ' - 198: 224, # 'Ć' - 199: 225, # 'Ç' - 200: 226, # 'Č' - 201: 44, # 'É' - 202: 227, # 'Ę' - 203: 228, # 'Ë' - 204: 229, # 'Ě' - 205: 61, # 'Í' - 206: 230, # 'Î' - 207: 231, # 'Ď' - 208: 232, # 'Đ' - 209: 233, # 'Ń' - 210: 234, # 'Ň' - 211: 58, # 'Ó' - 212: 235, # 'Ô' - 213: 66, # 'Ő' - 214: 59, # 'Ö' - 215: 236, # '×' - 216: 237, # 'Ř' - 217: 238, # 'Ů' - 218: 60, # 'Ú' - 219: 69, # 'Ű' - 220: 63, # 'Ü' - 221: 239, # 'Ý' - 222: 240, # 'Ţ' - 223: 241, # 'ß' - 224: 82, # 'ŕ' - 225: 14, # 'á' - 226: 74, # 'â' - 227: 242, # 'ă' - 228: 70, # 'ä' - 229: 80, # 'ĺ' - 230: 243, # 'ć' - 231: 72, # 'ç' - 232: 244, # 'č' - 233: 15, # 'é' - 234: 83, # 'ę' - 235: 77, # 'ë' - 236: 84, # 'ě' - 237: 30, # 'í' - 238: 76, # 'î' - 239: 85, # 'ď' - 240: 245, # 'đ' - 241: 246, # 'ń' - 242: 247, # 'ň' - 243: 25, # 'ó' - 244: 73, # 'ô' - 245: 42, # 'ő' - 246: 24, # 'ö' - 247: 248, # '÷' - 248: 249, # 'ř' - 249: 250, # 'ů' - 250: 31, # 'ú' - 251: 56, # 'ű' - 252: 29, # 'ü' - 253: 251, # 'ý' - 254: 252, # 'ţ' - 255: 253, # '˙' -} - -ISO_8859_2_HUNGARIAN_MODEL = SingleByteCharSetModel( - charset_name="ISO-8859-2", - language="Hungarian", - char_to_order_map=ISO_8859_2_HUNGARIAN_CHAR_TO_ORDER, - language_model=HUNGARIAN_LANG_MODEL, - typical_positive_ratio=0.947368, - keep_ascii_letters=True, - alphabet="ABCDEFGHIJKLMNOPRSTUVZabcdefghijklmnoprstuvzÁÉÍÓÖÚÜáéíóöúüŐőŰű", -) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langrussianmodel.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langrussianmodel.py deleted file mode 100644 index 39a5388..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langrussianmodel.py +++ /dev/null @@ -1,5725 +0,0 @@ -from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel - -# 3: Positive -# 2: Likely -# 1: Unlikely -# 0: Negative - -RUSSIAN_LANG_MODEL = { - 37: { # 'А' - 37: 0, # 'А' - 44: 1, # 'Б' - 33: 1, # 'В' - 46: 1, # 'Г' - 41: 1, # 'Д' - 48: 1, # 'Е' - 56: 1, # 'Ж' - 51: 1, # 'З' - 42: 1, # 'И' - 60: 1, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 2, # 'Н' - 34: 1, # 'О' - 35: 1, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 1, # 'У' - 53: 1, # 'Ф' - 55: 1, # 'Х' - 58: 1, # 'Ц' - 50: 1, # 'Ч' - 57: 1, # 'Ш' - 63: 1, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 1, # 'Ю' - 43: 1, # 'Я' - 3: 1, # 'а' - 21: 2, # 'б' - 10: 2, # 'в' - 19: 2, # 'г' - 13: 2, # 'д' - 2: 0, # 'е' - 24: 1, # 'ж' - 20: 1, # 'з' - 4: 0, # 'и' - 23: 1, # 'й' - 11: 2, # 'к' - 8: 3, # 'л' - 12: 2, # 'м' - 5: 2, # 'н' - 1: 0, # 'о' - 15: 2, # 'п' - 9: 2, # 'р' - 7: 2, # 'с' - 6: 2, # 'т' - 14: 2, # 'у' - 39: 2, # 'ф' - 26: 2, # 'х' - 28: 0, # 'ц' - 22: 1, # 'ч' - 25: 2, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 1, # 'э' - 27: 0, # 'ю' - 16: 0, # 'я' - }, - 44: { # 'Б' - 37: 1, # 'А' - 44: 0, # 'Б' - 33: 1, # 'В' - 46: 1, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Н' - 34: 1, # 'О' - 35: 0, # 'П' - 45: 1, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 1, # 'Я' - 3: 2, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 0, # 'г' - 13: 1, # 'д' - 2: 3, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 2, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 2, # 'р' - 7: 0, # 'с' - 6: 0, # 'т' - 14: 2, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 2, # 'ы' - 17: 1, # 'ь' - 30: 2, # 'э' - 27: 1, # 'ю' - 16: 1, # 'я' - }, - 33: { # 'В' - 37: 2, # 'А' - 44: 0, # 'Б' - 33: 1, # 'В' - 46: 0, # 'Г' - 41: 1, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Н' - 34: 1, # 'О' - 35: 1, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 1, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 1, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 1, # 'Я' - 3: 2, # 'а' - 21: 1, # 'б' - 10: 1, # 'в' - 19: 1, # 'г' - 13: 2, # 'д' - 2: 3, # 'е' - 24: 0, # 'ж' - 20: 2, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 1, # 'к' - 8: 2, # 'л' - 12: 2, # 'м' - 5: 2, # 'н' - 1: 3, # 'о' - 15: 2, # 'п' - 9: 2, # 'р' - 7: 3, # 'с' - 6: 2, # 'т' - 14: 2, # 'у' - 39: 0, # 'ф' - 26: 1, # 'х' - 28: 1, # 'ц' - 22: 2, # 'ч' - 25: 1, # 'ш' - 29: 0, # 'щ' - 54: 1, # 'ъ' - 18: 3, # 'ы' - 17: 1, # 'ь' - 30: 2, # 'э' - 27: 0, # 'ю' - 16: 1, # 'я' - }, - 46: { # 'Г' - 37: 1, # 'А' - 44: 1, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 1, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Н' - 34: 1, # 'О' - 35: 1, # 'П' - 45: 1, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 2, # 'а' - 21: 0, # 'б' - 10: 1, # 'в' - 19: 0, # 'г' - 13: 2, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 2, # 'л' - 12: 1, # 'м' - 5: 1, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 2, # 'р' - 7: 0, # 'с' - 6: 0, # 'т' - 14: 2, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 1, # 'ь' - 30: 1, # 'э' - 27: 1, # 'ю' - 16: 0, # 'я' - }, - 41: { # 'Д' - 37: 1, # 'А' - 44: 0, # 'Б' - 33: 1, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 2, # 'Е' - 56: 1, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Н' - 34: 1, # 'О' - 35: 0, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 0, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 1, # 'Ц' - 50: 1, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 1, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 1, # 'Я' - 3: 3, # 'а' - 21: 0, # 'б' - 10: 2, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 3, # 'ж' - 20: 1, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 2, # 'л' - 12: 1, # 'м' - 5: 1, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 2, # 'р' - 7: 0, # 'с' - 6: 0, # 'т' - 14: 2, # 'у' - 39: 0, # 'ф' - 26: 1, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 1, # 'ы' - 17: 1, # 'ь' - 30: 2, # 'э' - 27: 1, # 'ю' - 16: 1, # 'я' - }, - 48: { # 'Е' - 37: 1, # 'А' - 44: 1, # 'Б' - 33: 1, # 'В' - 46: 1, # 'Г' - 41: 1, # 'Д' - 48: 1, # 'Е' - 56: 1, # 'Ж' - 51: 1, # 'З' - 42: 1, # 'И' - 60: 1, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 2, # 'Н' - 34: 1, # 'О' - 35: 1, # 'П' - 45: 2, # 'Р' - 32: 2, # 'С' - 40: 1, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 1, # 'Х' - 58: 1, # 'Ц' - 50: 1, # 'Ч' - 57: 1, # 'Ш' - 63: 1, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 1, # 'Я' - 3: 0, # 'а' - 21: 0, # 'б' - 10: 2, # 'в' - 19: 2, # 'г' - 13: 2, # 'д' - 2: 2, # 'е' - 24: 1, # 'ж' - 20: 1, # 'з' - 4: 0, # 'и' - 23: 2, # 'й' - 11: 1, # 'к' - 8: 2, # 'л' - 12: 2, # 'м' - 5: 1, # 'н' - 1: 0, # 'о' - 15: 1, # 'п' - 9: 1, # 'р' - 7: 3, # 'с' - 6: 0, # 'т' - 14: 0, # 'у' - 39: 1, # 'ф' - 26: 1, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 1, # 'ш' - 29: 2, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 0, # 'э' - 27: 1, # 'ю' - 16: 0, # 'я' - }, - 56: { # 'Ж' - 37: 1, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 1, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 1, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Н' - 34: 1, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 2, # 'а' - 21: 1, # 'б' - 10: 0, # 'в' - 19: 1, # 'г' - 13: 1, # 'д' - 2: 2, # 'е' - 24: 1, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 0, # 'л' - 12: 1, # 'м' - 5: 0, # 'н' - 1: 2, # 'о' - 15: 0, # 'п' - 9: 1, # 'р' - 7: 0, # 'с' - 6: 0, # 'т' - 14: 2, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 0, # 'э' - 27: 2, # 'ю' - 16: 0, # 'я' - }, - 51: { # 'З' - 37: 1, # 'А' - 44: 0, # 'Б' - 33: 1, # 'В' - 46: 1, # 'Г' - 41: 1, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Н' - 34: 1, # 'О' - 35: 0, # 'П' - 45: 1, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 1, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 1, # 'б' - 10: 2, # 'в' - 19: 0, # 'г' - 13: 2, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 1, # 'л' - 12: 1, # 'м' - 5: 2, # 'н' - 1: 2, # 'о' - 15: 0, # 'п' - 9: 1, # 'р' - 7: 0, # 'с' - 6: 0, # 'т' - 14: 1, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 1, # 'ы' - 17: 0, # 'ь' - 30: 0, # 'э' - 27: 0, # 'ю' - 16: 1, # 'я' - }, - 42: { # 'И' - 37: 1, # 'А' - 44: 1, # 'Б' - 33: 1, # 'В' - 46: 1, # 'Г' - 41: 1, # 'Д' - 48: 2, # 'Е' - 56: 1, # 'Ж' - 51: 1, # 'З' - 42: 1, # 'И' - 60: 1, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Н' - 34: 1, # 'О' - 35: 1, # 'П' - 45: 1, # 'Р' - 32: 2, # 'С' - 40: 1, # 'Т' - 52: 0, # 'У' - 53: 1, # 'Ф' - 55: 1, # 'Х' - 58: 1, # 'Ц' - 50: 1, # 'Ч' - 57: 0, # 'Ш' - 63: 1, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 1, # 'Ю' - 43: 1, # 'Я' - 3: 1, # 'а' - 21: 2, # 'б' - 10: 2, # 'в' - 19: 2, # 'г' - 13: 2, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 2, # 'з' - 4: 1, # 'и' - 23: 0, # 'й' - 11: 1, # 'к' - 8: 2, # 'л' - 12: 2, # 'м' - 5: 2, # 'н' - 1: 1, # 'о' - 15: 1, # 'п' - 9: 2, # 'р' - 7: 2, # 'с' - 6: 2, # 'т' - 14: 1, # 'у' - 39: 1, # 'ф' - 26: 2, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 1, # 'ш' - 29: 1, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 0, # 'э' - 27: 1, # 'ю' - 16: 0, # 'я' - }, - 60: { # 'Й' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 1, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 1, # 'Х' - 58: 1, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 0, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 1, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 0, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 0, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 2, # 'о' - 15: 0, # 'п' - 9: 0, # 'р' - 7: 0, # 'с' - 6: 0, # 'т' - 14: 0, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 0, # 'э' - 27: 0, # 'ю' - 16: 0, # 'я' - }, - 36: { # 'К' - 37: 2, # 'А' - 44: 0, # 'Б' - 33: 1, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 1, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 1, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Н' - 34: 2, # 'О' - 35: 1, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 1, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 0, # 'б' - 10: 1, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 2, # 'л' - 12: 0, # 'м' - 5: 1, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 2, # 'р' - 7: 2, # 'с' - 6: 2, # 'т' - 14: 2, # 'у' - 39: 0, # 'ф' - 26: 1, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 1, # 'ы' - 17: 1, # 'ь' - 30: 2, # 'э' - 27: 1, # 'ю' - 16: 0, # 'я' - }, - 49: { # 'Л' - 37: 2, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 1, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 1, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 0, # 'Н' - 34: 1, # 'О' - 35: 1, # 'П' - 45: 0, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 1, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 1, # 'Ь' - 47: 0, # 'Э' - 59: 1, # 'Ю' - 43: 1, # 'Я' - 3: 2, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 1, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 1, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 1, # 'л' - 12: 0, # 'м' - 5: 1, # 'н' - 1: 2, # 'о' - 15: 0, # 'п' - 9: 0, # 'р' - 7: 0, # 'с' - 6: 0, # 'т' - 14: 2, # 'у' - 39: 0, # 'ф' - 26: 1, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 1, # 'ы' - 17: 1, # 'ь' - 30: 2, # 'э' - 27: 2, # 'ю' - 16: 1, # 'я' - }, - 38: { # 'М' - 37: 1, # 'А' - 44: 1, # 'Б' - 33: 1, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Н' - 34: 1, # 'О' - 35: 1, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 1, # 'У' - 53: 1, # 'Ф' - 55: 1, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 0, # 'Ь' - 47: 1, # 'Э' - 59: 0, # 'Ю' - 43: 1, # 'Я' - 3: 3, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 1, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 1, # 'л' - 12: 1, # 'м' - 5: 2, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 1, # 'р' - 7: 1, # 'с' - 6: 0, # 'т' - 14: 2, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 3, # 'ы' - 17: 1, # 'ь' - 30: 2, # 'э' - 27: 1, # 'ю' - 16: 1, # 'я' - }, - 31: { # 'Н' - 37: 2, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 1, # 'Г' - 41: 1, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 1, # 'З' - 42: 2, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Н' - 34: 1, # 'О' - 35: 0, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 1, # 'У' - 53: 1, # 'Ф' - 55: 1, # 'Х' - 58: 1, # 'Ц' - 50: 1, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 1, # 'Ь' - 47: 1, # 'Э' - 59: 0, # 'Ю' - 43: 1, # 'Я' - 3: 3, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 3, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 0, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 1, # 'р' - 7: 0, # 'с' - 6: 0, # 'т' - 14: 3, # 'у' - 39: 0, # 'ф' - 26: 1, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 1, # 'ы' - 17: 2, # 'ь' - 30: 1, # 'э' - 27: 1, # 'ю' - 16: 1, # 'я' - }, - 34: { # 'О' - 37: 0, # 'А' - 44: 1, # 'Б' - 33: 1, # 'В' - 46: 1, # 'Г' - 41: 2, # 'Д' - 48: 1, # 'Е' - 56: 1, # 'Ж' - 51: 1, # 'З' - 42: 1, # 'И' - 60: 1, # 'Й' - 36: 1, # 'К' - 49: 2, # 'Л' - 38: 1, # 'М' - 31: 2, # 'Н' - 34: 1, # 'О' - 35: 1, # 'П' - 45: 2, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 1, # 'У' - 53: 1, # 'Ф' - 55: 1, # 'Х' - 58: 0, # 'Ц' - 50: 1, # 'Ч' - 57: 1, # 'Ш' - 63: 1, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 1, # 'Я' - 3: 1, # 'а' - 21: 2, # 'б' - 10: 1, # 'в' - 19: 2, # 'г' - 13: 2, # 'д' - 2: 0, # 'е' - 24: 1, # 'ж' - 20: 1, # 'з' - 4: 0, # 'и' - 23: 1, # 'й' - 11: 2, # 'к' - 8: 2, # 'л' - 12: 1, # 'м' - 5: 3, # 'н' - 1: 0, # 'о' - 15: 2, # 'п' - 9: 2, # 'р' - 7: 2, # 'с' - 6: 2, # 'т' - 14: 1, # 'у' - 39: 1, # 'ф' - 26: 2, # 'х' - 28: 1, # 'ц' - 22: 2, # 'ч' - 25: 2, # 'ш' - 29: 1, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 0, # 'э' - 27: 0, # 'ю' - 16: 0, # 'я' - }, - 35: { # 'П' - 37: 1, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 1, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Н' - 34: 1, # 'О' - 35: 1, # 'П' - 45: 2, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 1, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 1, # 'Я' - 3: 2, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 2, # 'л' - 12: 0, # 'м' - 5: 1, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 3, # 'р' - 7: 1, # 'с' - 6: 1, # 'т' - 14: 2, # 'у' - 39: 1, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 1, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 1, # 'ы' - 17: 2, # 'ь' - 30: 1, # 'э' - 27: 0, # 'ю' - 16: 2, # 'я' - }, - 45: { # 'Р' - 37: 2, # 'А' - 44: 1, # 'Б' - 33: 1, # 'В' - 46: 1, # 'Г' - 41: 1, # 'Д' - 48: 2, # 'Е' - 56: 1, # 'Ж' - 51: 0, # 'З' - 42: 2, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Н' - 34: 2, # 'О' - 35: 0, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 1, # 'Х' - 58: 1, # 'Ц' - 50: 1, # 'Ч' - 57: 1, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 1, # 'Ь' - 47: 1, # 'Э' - 59: 1, # 'Ю' - 43: 1, # 'Я' - 3: 3, # 'а' - 21: 0, # 'б' - 10: 1, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 1, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 0, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 1, # 'р' - 7: 0, # 'с' - 6: 0, # 'т' - 14: 2, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 2, # 'ы' - 17: 0, # 'ь' - 30: 1, # 'э' - 27: 1, # 'ю' - 16: 2, # 'я' - }, - 32: { # 'С' - 37: 1, # 'А' - 44: 1, # 'Б' - 33: 1, # 'В' - 46: 1, # 'Г' - 41: 1, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Н' - 34: 1, # 'О' - 35: 1, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 2, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 1, # 'Х' - 58: 1, # 'Ц' - 50: 1, # 'Ч' - 57: 1, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 1, # 'Ь' - 47: 1, # 'Э' - 59: 1, # 'Ю' - 43: 1, # 'Я' - 3: 2, # 'а' - 21: 1, # 'б' - 10: 2, # 'в' - 19: 1, # 'г' - 13: 2, # 'д' - 2: 3, # 'е' - 24: 1, # 'ж' - 20: 1, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 2, # 'к' - 8: 2, # 'л' - 12: 2, # 'м' - 5: 2, # 'н' - 1: 2, # 'о' - 15: 2, # 'п' - 9: 2, # 'р' - 7: 1, # 'с' - 6: 3, # 'т' - 14: 2, # 'у' - 39: 1, # 'ф' - 26: 1, # 'х' - 28: 1, # 'ц' - 22: 1, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 1, # 'ъ' - 18: 1, # 'ы' - 17: 1, # 'ь' - 30: 2, # 'э' - 27: 1, # 'ю' - 16: 1, # 'я' - }, - 40: { # 'Т' - 37: 1, # 'А' - 44: 0, # 'Б' - 33: 1, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Н' - 34: 2, # 'О' - 35: 0, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 1, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 1, # 'Ь' - 47: 1, # 'Э' - 59: 1, # 'Ю' - 43: 1, # 'Я' - 3: 3, # 'а' - 21: 1, # 'б' - 10: 2, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 3, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 1, # 'к' - 8: 1, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 2, # 'р' - 7: 1, # 'с' - 6: 0, # 'т' - 14: 2, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 1, # 'щ' - 54: 0, # 'ъ' - 18: 3, # 'ы' - 17: 1, # 'ь' - 30: 2, # 'э' - 27: 1, # 'ю' - 16: 1, # 'я' - }, - 52: { # 'У' - 37: 1, # 'А' - 44: 1, # 'Б' - 33: 1, # 'В' - 46: 1, # 'Г' - 41: 1, # 'Д' - 48: 1, # 'Е' - 56: 1, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 1, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Н' - 34: 1, # 'О' - 35: 1, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 1, # 'Х' - 58: 0, # 'Ц' - 50: 1, # 'Ч' - 57: 1, # 'Ш' - 63: 1, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 1, # 'Ю' - 43: 0, # 'Я' - 3: 1, # 'а' - 21: 2, # 'б' - 10: 2, # 'в' - 19: 1, # 'г' - 13: 2, # 'д' - 2: 1, # 'е' - 24: 2, # 'ж' - 20: 2, # 'з' - 4: 2, # 'и' - 23: 1, # 'й' - 11: 1, # 'к' - 8: 2, # 'л' - 12: 2, # 'м' - 5: 1, # 'н' - 1: 2, # 'о' - 15: 1, # 'п' - 9: 2, # 'р' - 7: 2, # 'с' - 6: 2, # 'т' - 14: 0, # 'у' - 39: 1, # 'ф' - 26: 1, # 'х' - 28: 1, # 'ц' - 22: 2, # 'ч' - 25: 1, # 'ш' - 29: 1, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 2, # 'э' - 27: 1, # 'ю' - 16: 0, # 'я' - }, - 53: { # 'Ф' - 37: 1, # 'А' - 44: 1, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 1, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 1, # 'О' - 35: 0, # 'П' - 45: 1, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 2, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 2, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 2, # 'о' - 15: 0, # 'п' - 9: 2, # 'р' - 7: 0, # 'с' - 6: 1, # 'т' - 14: 2, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 1, # 'ь' - 30: 2, # 'э' - 27: 0, # 'ю' - 16: 0, # 'я' - }, - 55: { # 'Х' - 37: 1, # 'А' - 44: 0, # 'Б' - 33: 1, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Н' - 34: 1, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 2, # 'а' - 21: 0, # 'б' - 10: 2, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 2, # 'л' - 12: 1, # 'м' - 5: 0, # 'н' - 1: 2, # 'о' - 15: 0, # 'п' - 9: 2, # 'р' - 7: 0, # 'с' - 6: 0, # 'т' - 14: 1, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 1, # 'ь' - 30: 1, # 'э' - 27: 0, # 'ю' - 16: 0, # 'я' - }, - 58: { # 'Ц' - 37: 1, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 1, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 1, # 'а' - 21: 0, # 'б' - 10: 1, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 0, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 0, # 'о' - 15: 0, # 'п' - 9: 0, # 'р' - 7: 0, # 'с' - 6: 0, # 'т' - 14: 1, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 1, # 'ы' - 17: 0, # 'ь' - 30: 0, # 'э' - 27: 1, # 'ю' - 16: 0, # 'я' - }, - 50: { # 'Ч' - 37: 1, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Н' - 34: 0, # 'О' - 35: 1, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 1, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 1, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 2, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 1, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 1, # 'о' - 15: 0, # 'п' - 9: 1, # 'р' - 7: 0, # 'с' - 6: 3, # 'т' - 14: 2, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 1, # 'ь' - 30: 0, # 'э' - 27: 0, # 'ю' - 16: 0, # 'я' - }, - 57: { # 'Ш' - 37: 1, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Н' - 34: 1, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 2, # 'а' - 21: 0, # 'б' - 10: 1, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 1, # 'и' - 23: 0, # 'й' - 11: 1, # 'к' - 8: 2, # 'л' - 12: 1, # 'м' - 5: 1, # 'н' - 1: 2, # 'о' - 15: 2, # 'п' - 9: 1, # 'р' - 7: 0, # 'с' - 6: 2, # 'т' - 14: 2, # 'у' - 39: 0, # 'ф' - 26: 1, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 1, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 1, # 'э' - 27: 0, # 'ю' - 16: 0, # 'я' - }, - 63: { # 'Щ' - 37: 1, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 1, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 1, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 1, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 1, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 0, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 1, # 'о' - 15: 0, # 'п' - 9: 0, # 'р' - 7: 0, # 'с' - 6: 0, # 'т' - 14: 1, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 0, # 'э' - 27: 0, # 'ю' - 16: 0, # 'я' - }, - 62: { # 'Ы' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 1, # 'В' - 46: 1, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 1, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Н' - 34: 0, # 'О' - 35: 1, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 1, # 'Х' - 58: 1, # 'Ц' - 50: 0, # 'Ч' - 57: 1, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 0, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 0, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 0, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 0, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 0, # 'о' - 15: 0, # 'п' - 9: 0, # 'р' - 7: 0, # 'с' - 6: 0, # 'т' - 14: 0, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 0, # 'э' - 27: 0, # 'ю' - 16: 0, # 'я' - }, - 61: { # 'Ь' - 37: 0, # 'А' - 44: 1, # 'Б' - 33: 1, # 'В' - 46: 0, # 'Г' - 41: 1, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 0, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Н' - 34: 1, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 1, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 1, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 1, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 1, # 'Ю' - 43: 1, # 'Я' - 3: 0, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 0, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 0, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 0, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 0, # 'о' - 15: 0, # 'п' - 9: 0, # 'р' - 7: 0, # 'с' - 6: 0, # 'т' - 14: 0, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 0, # 'э' - 27: 0, # 'ю' - 16: 0, # 'я' - }, - 47: { # 'Э' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 1, # 'В' - 46: 0, # 'Г' - 41: 1, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 1, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Н' - 34: 0, # 'О' - 35: 1, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 1, # 'а' - 21: 1, # 'б' - 10: 2, # 'в' - 19: 1, # 'г' - 13: 2, # 'д' - 2: 0, # 'е' - 24: 1, # 'ж' - 20: 0, # 'з' - 4: 0, # 'и' - 23: 2, # 'й' - 11: 2, # 'к' - 8: 2, # 'л' - 12: 2, # 'м' - 5: 2, # 'н' - 1: 0, # 'о' - 15: 1, # 'п' - 9: 2, # 'р' - 7: 1, # 'с' - 6: 3, # 'т' - 14: 1, # 'у' - 39: 1, # 'ф' - 26: 1, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 1, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 0, # 'э' - 27: 0, # 'ю' - 16: 0, # 'я' - }, - 59: { # 'Ю' - 37: 1, # 'А' - 44: 1, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 1, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 1, # 'Р' - 32: 0, # 'С' - 40: 1, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 1, # 'Ч' - 57: 0, # 'Ш' - 63: 1, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 0, # 'а' - 21: 1, # 'б' - 10: 0, # 'в' - 19: 1, # 'г' - 13: 1, # 'д' - 2: 0, # 'е' - 24: 1, # 'ж' - 20: 0, # 'з' - 4: 0, # 'и' - 23: 0, # 'й' - 11: 1, # 'к' - 8: 2, # 'л' - 12: 1, # 'м' - 5: 2, # 'н' - 1: 0, # 'о' - 15: 1, # 'п' - 9: 1, # 'р' - 7: 1, # 'с' - 6: 0, # 'т' - 14: 0, # 'у' - 39: 0, # 'ф' - 26: 1, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 0, # 'э' - 27: 0, # 'ю' - 16: 0, # 'я' - }, - 43: { # 'Я' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 1, # 'В' - 46: 1, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 1, # 'Х' - 58: 0, # 'Ц' - 50: 1, # 'Ч' - 57: 0, # 'Ш' - 63: 1, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 1, # 'Ю' - 43: 1, # 'Я' - 3: 0, # 'а' - 21: 1, # 'б' - 10: 1, # 'в' - 19: 1, # 'г' - 13: 1, # 'д' - 2: 0, # 'е' - 24: 0, # 'ж' - 20: 1, # 'з' - 4: 0, # 'и' - 23: 1, # 'й' - 11: 1, # 'к' - 8: 1, # 'л' - 12: 1, # 'м' - 5: 2, # 'н' - 1: 0, # 'о' - 15: 1, # 'п' - 9: 1, # 'р' - 7: 1, # 'с' - 6: 0, # 'т' - 14: 0, # 'у' - 39: 0, # 'ф' - 26: 1, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 1, # 'ш' - 29: 1, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 0, # 'э' - 27: 0, # 'ю' - 16: 0, # 'я' - }, - 3: { # 'а' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 2, # 'а' - 21: 3, # 'б' - 10: 3, # 'в' - 19: 3, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 3, # 'ж' - 20: 3, # 'з' - 4: 3, # 'и' - 23: 3, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 3, # 'м' - 5: 3, # 'н' - 1: 2, # 'о' - 15: 3, # 'п' - 9: 3, # 'р' - 7: 3, # 'с' - 6: 3, # 'т' - 14: 3, # 'у' - 39: 2, # 'ф' - 26: 3, # 'х' - 28: 3, # 'ц' - 22: 3, # 'ч' - 25: 3, # 'ш' - 29: 3, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 2, # 'э' - 27: 3, # 'ю' - 16: 3, # 'я' - }, - 21: { # 'б' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 2, # 'б' - 10: 2, # 'в' - 19: 1, # 'г' - 13: 2, # 'д' - 2: 3, # 'е' - 24: 2, # 'ж' - 20: 1, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 2, # 'к' - 8: 3, # 'л' - 12: 2, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 1, # 'п' - 9: 3, # 'р' - 7: 3, # 'с' - 6: 2, # 'т' - 14: 3, # 'у' - 39: 0, # 'ф' - 26: 2, # 'х' - 28: 1, # 'ц' - 22: 1, # 'ч' - 25: 2, # 'ш' - 29: 3, # 'щ' - 54: 2, # 'ъ' - 18: 3, # 'ы' - 17: 2, # 'ь' - 30: 1, # 'э' - 27: 2, # 'ю' - 16: 3, # 'я' - }, - 10: { # 'в' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 2, # 'б' - 10: 2, # 'в' - 19: 2, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 1, # 'ж' - 20: 3, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 2, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 3, # 'п' - 9: 3, # 'р' - 7: 3, # 'с' - 6: 3, # 'т' - 14: 3, # 'у' - 39: 1, # 'ф' - 26: 2, # 'х' - 28: 2, # 'ц' - 22: 2, # 'ч' - 25: 3, # 'ш' - 29: 2, # 'щ' - 54: 2, # 'ъ' - 18: 3, # 'ы' - 17: 3, # 'ь' - 30: 1, # 'э' - 27: 1, # 'ю' - 16: 3, # 'я' - }, - 19: { # 'г' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 1, # 'б' - 10: 2, # 'в' - 19: 1, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 0, # 'ж' - 20: 1, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 2, # 'к' - 8: 3, # 'л' - 12: 2, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 3, # 'р' - 7: 2, # 'с' - 6: 2, # 'т' - 14: 3, # 'у' - 39: 1, # 'ф' - 26: 1, # 'х' - 28: 1, # 'ц' - 22: 2, # 'ч' - 25: 1, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 1, # 'ы' - 17: 1, # 'ь' - 30: 1, # 'э' - 27: 1, # 'ю' - 16: 0, # 'я' - }, - 13: { # 'д' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 2, # 'б' - 10: 3, # 'в' - 19: 2, # 'г' - 13: 2, # 'д' - 2: 3, # 'е' - 24: 2, # 'ж' - 20: 2, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 2, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 2, # 'п' - 9: 3, # 'р' - 7: 3, # 'с' - 6: 3, # 'т' - 14: 3, # 'у' - 39: 1, # 'ф' - 26: 2, # 'х' - 28: 3, # 'ц' - 22: 2, # 'ч' - 25: 2, # 'ш' - 29: 1, # 'щ' - 54: 2, # 'ъ' - 18: 3, # 'ы' - 17: 3, # 'ь' - 30: 1, # 'э' - 27: 2, # 'ю' - 16: 3, # 'я' - }, - 2: { # 'е' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 2, # 'а' - 21: 3, # 'б' - 10: 3, # 'в' - 19: 3, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 3, # 'ж' - 20: 3, # 'з' - 4: 2, # 'и' - 23: 3, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 3, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 3, # 'п' - 9: 3, # 'р' - 7: 3, # 'с' - 6: 3, # 'т' - 14: 2, # 'у' - 39: 2, # 'ф' - 26: 3, # 'х' - 28: 3, # 'ц' - 22: 3, # 'ч' - 25: 3, # 'ш' - 29: 3, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 1, # 'э' - 27: 2, # 'ю' - 16: 3, # 'я' - }, - 24: { # 'ж' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 2, # 'б' - 10: 1, # 'в' - 19: 2, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 2, # 'ж' - 20: 1, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 2, # 'к' - 8: 2, # 'л' - 12: 1, # 'м' - 5: 3, # 'н' - 1: 2, # 'о' - 15: 1, # 'п' - 9: 2, # 'р' - 7: 2, # 'с' - 6: 1, # 'т' - 14: 3, # 'у' - 39: 1, # 'ф' - 26: 0, # 'х' - 28: 1, # 'ц' - 22: 2, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 1, # 'ы' - 17: 2, # 'ь' - 30: 1, # 'э' - 27: 1, # 'ю' - 16: 1, # 'я' - }, - 20: { # 'з' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 3, # 'б' - 10: 3, # 'в' - 19: 3, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 2, # 'ж' - 20: 2, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 3, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 3, # 'р' - 7: 2, # 'с' - 6: 2, # 'т' - 14: 3, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 1, # 'ц' - 22: 2, # 'ч' - 25: 1, # 'ш' - 29: 0, # 'щ' - 54: 2, # 'ъ' - 18: 3, # 'ы' - 17: 2, # 'ь' - 30: 1, # 'э' - 27: 1, # 'ю' - 16: 3, # 'я' - }, - 4: { # 'и' - 37: 1, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 3, # 'б' - 10: 3, # 'в' - 19: 3, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 3, # 'ж' - 20: 3, # 'з' - 4: 3, # 'и' - 23: 3, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 3, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 3, # 'п' - 9: 3, # 'р' - 7: 3, # 'с' - 6: 3, # 'т' - 14: 2, # 'у' - 39: 2, # 'ф' - 26: 3, # 'х' - 28: 3, # 'ц' - 22: 3, # 'ч' - 25: 3, # 'ш' - 29: 3, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 2, # 'э' - 27: 3, # 'ю' - 16: 3, # 'я' - }, - 23: { # 'й' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 1, # 'а' - 21: 1, # 'б' - 10: 1, # 'в' - 19: 2, # 'г' - 13: 3, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 2, # 'з' - 4: 1, # 'и' - 23: 0, # 'й' - 11: 2, # 'к' - 8: 2, # 'л' - 12: 2, # 'м' - 5: 3, # 'н' - 1: 2, # 'о' - 15: 1, # 'п' - 9: 2, # 'р' - 7: 3, # 'с' - 6: 3, # 'т' - 14: 1, # 'у' - 39: 2, # 'ф' - 26: 1, # 'х' - 28: 2, # 'ц' - 22: 3, # 'ч' - 25: 2, # 'ш' - 29: 1, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 1, # 'э' - 27: 1, # 'ю' - 16: 2, # 'я' - }, - 11: { # 'к' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 1, # 'б' - 10: 3, # 'в' - 19: 1, # 'г' - 13: 1, # 'д' - 2: 3, # 'е' - 24: 2, # 'ж' - 20: 2, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 2, # 'к' - 8: 3, # 'л' - 12: 1, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 3, # 'р' - 7: 3, # 'с' - 6: 3, # 'т' - 14: 3, # 'у' - 39: 1, # 'ф' - 26: 2, # 'х' - 28: 2, # 'ц' - 22: 1, # 'ч' - 25: 2, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 1, # 'ы' - 17: 1, # 'ь' - 30: 1, # 'э' - 27: 1, # 'ю' - 16: 1, # 'я' - }, - 8: { # 'л' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 2, # 'б' - 10: 2, # 'в' - 19: 3, # 'г' - 13: 2, # 'д' - 2: 3, # 'е' - 24: 3, # 'ж' - 20: 2, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 2, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 2, # 'п' - 9: 1, # 'р' - 7: 3, # 'с' - 6: 2, # 'т' - 14: 3, # 'у' - 39: 2, # 'ф' - 26: 2, # 'х' - 28: 1, # 'ц' - 22: 3, # 'ч' - 25: 2, # 'ш' - 29: 1, # 'щ' - 54: 0, # 'ъ' - 18: 3, # 'ы' - 17: 3, # 'ь' - 30: 1, # 'э' - 27: 3, # 'ю' - 16: 3, # 'я' - }, - 12: { # 'м' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 2, # 'б' - 10: 2, # 'в' - 19: 2, # 'г' - 13: 1, # 'д' - 2: 3, # 'е' - 24: 1, # 'ж' - 20: 1, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 2, # 'к' - 8: 3, # 'л' - 12: 2, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 2, # 'п' - 9: 2, # 'р' - 7: 3, # 'с' - 6: 2, # 'т' - 14: 3, # 'у' - 39: 2, # 'ф' - 26: 2, # 'х' - 28: 2, # 'ц' - 22: 2, # 'ч' - 25: 1, # 'ш' - 29: 1, # 'щ' - 54: 0, # 'ъ' - 18: 3, # 'ы' - 17: 2, # 'ь' - 30: 2, # 'э' - 27: 1, # 'ю' - 16: 3, # 'я' - }, - 5: { # 'н' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 2, # 'б' - 10: 2, # 'в' - 19: 3, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 2, # 'ж' - 20: 2, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 3, # 'к' - 8: 2, # 'л' - 12: 1, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 1, # 'п' - 9: 2, # 'р' - 7: 3, # 'с' - 6: 3, # 'т' - 14: 3, # 'у' - 39: 2, # 'ф' - 26: 2, # 'х' - 28: 3, # 'ц' - 22: 3, # 'ч' - 25: 2, # 'ш' - 29: 2, # 'щ' - 54: 1, # 'ъ' - 18: 3, # 'ы' - 17: 3, # 'ь' - 30: 1, # 'э' - 27: 3, # 'ю' - 16: 3, # 'я' - }, - 1: { # 'о' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 2, # 'а' - 21: 3, # 'б' - 10: 3, # 'в' - 19: 3, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 3, # 'ж' - 20: 3, # 'з' - 4: 3, # 'и' - 23: 3, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 3, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 3, # 'п' - 9: 3, # 'р' - 7: 3, # 'с' - 6: 3, # 'т' - 14: 2, # 'у' - 39: 2, # 'ф' - 26: 3, # 'х' - 28: 2, # 'ц' - 22: 3, # 'ч' - 25: 3, # 'ш' - 29: 3, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 2, # 'э' - 27: 3, # 'ю' - 16: 3, # 'я' - }, - 15: { # 'п' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 1, # 'б' - 10: 0, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 3, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 2, # 'к' - 8: 3, # 'л' - 12: 1, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 2, # 'п' - 9: 3, # 'р' - 7: 2, # 'с' - 6: 2, # 'т' - 14: 3, # 'у' - 39: 1, # 'ф' - 26: 0, # 'х' - 28: 2, # 'ц' - 22: 2, # 'ч' - 25: 1, # 'ш' - 29: 1, # 'щ' - 54: 0, # 'ъ' - 18: 3, # 'ы' - 17: 2, # 'ь' - 30: 1, # 'э' - 27: 1, # 'ю' - 16: 3, # 'я' - }, - 9: { # 'р' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 2, # 'б' - 10: 3, # 'в' - 19: 3, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 3, # 'ж' - 20: 2, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 3, # 'к' - 8: 2, # 'л' - 12: 3, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 2, # 'п' - 9: 2, # 'р' - 7: 3, # 'с' - 6: 3, # 'т' - 14: 3, # 'у' - 39: 2, # 'ф' - 26: 3, # 'х' - 28: 2, # 'ц' - 22: 2, # 'ч' - 25: 3, # 'ш' - 29: 2, # 'щ' - 54: 0, # 'ъ' - 18: 3, # 'ы' - 17: 3, # 'ь' - 30: 2, # 'э' - 27: 2, # 'ю' - 16: 3, # 'я' - }, - 7: { # 'с' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 1, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 2, # 'б' - 10: 3, # 'в' - 19: 2, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 2, # 'ж' - 20: 2, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 3, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 3, # 'п' - 9: 3, # 'р' - 7: 3, # 'с' - 6: 3, # 'т' - 14: 3, # 'у' - 39: 2, # 'ф' - 26: 3, # 'х' - 28: 2, # 'ц' - 22: 3, # 'ч' - 25: 2, # 'ш' - 29: 1, # 'щ' - 54: 2, # 'ъ' - 18: 3, # 'ы' - 17: 3, # 'ь' - 30: 2, # 'э' - 27: 3, # 'ю' - 16: 3, # 'я' - }, - 6: { # 'т' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 2, # 'б' - 10: 3, # 'в' - 19: 2, # 'г' - 13: 2, # 'д' - 2: 3, # 'е' - 24: 1, # 'ж' - 20: 1, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 2, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 2, # 'п' - 9: 3, # 'р' - 7: 3, # 'с' - 6: 2, # 'т' - 14: 3, # 'у' - 39: 2, # 'ф' - 26: 2, # 'х' - 28: 2, # 'ц' - 22: 2, # 'ч' - 25: 2, # 'ш' - 29: 2, # 'щ' - 54: 2, # 'ъ' - 18: 3, # 'ы' - 17: 3, # 'ь' - 30: 2, # 'э' - 27: 2, # 'ю' - 16: 3, # 'я' - }, - 14: { # 'у' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 2, # 'а' - 21: 3, # 'б' - 10: 3, # 'в' - 19: 3, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 3, # 'ж' - 20: 3, # 'з' - 4: 2, # 'и' - 23: 2, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 3, # 'м' - 5: 3, # 'н' - 1: 2, # 'о' - 15: 3, # 'п' - 9: 3, # 'р' - 7: 3, # 'с' - 6: 3, # 'т' - 14: 1, # 'у' - 39: 2, # 'ф' - 26: 3, # 'х' - 28: 2, # 'ц' - 22: 3, # 'ч' - 25: 3, # 'ш' - 29: 3, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 2, # 'э' - 27: 3, # 'ю' - 16: 2, # 'я' - }, - 39: { # 'ф' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 1, # 'б' - 10: 0, # 'в' - 19: 1, # 'г' - 13: 0, # 'д' - 2: 3, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 1, # 'к' - 8: 2, # 'л' - 12: 1, # 'м' - 5: 1, # 'н' - 1: 3, # 'о' - 15: 1, # 'п' - 9: 2, # 'р' - 7: 2, # 'с' - 6: 2, # 'т' - 14: 2, # 'у' - 39: 2, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 1, # 'ч' - 25: 1, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 2, # 'ы' - 17: 1, # 'ь' - 30: 2, # 'э' - 27: 1, # 'ю' - 16: 1, # 'я' - }, - 26: { # 'х' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 0, # 'б' - 10: 3, # 'в' - 19: 1, # 'г' - 13: 1, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 1, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 1, # 'к' - 8: 2, # 'л' - 12: 2, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 1, # 'п' - 9: 3, # 'р' - 7: 2, # 'с' - 6: 2, # 'т' - 14: 2, # 'у' - 39: 1, # 'ф' - 26: 1, # 'х' - 28: 1, # 'ц' - 22: 1, # 'ч' - 25: 2, # 'ш' - 29: 0, # 'щ' - 54: 1, # 'ъ' - 18: 0, # 'ы' - 17: 1, # 'ь' - 30: 1, # 'э' - 27: 1, # 'ю' - 16: 0, # 'я' - }, - 28: { # 'ц' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 1, # 'б' - 10: 2, # 'в' - 19: 1, # 'г' - 13: 1, # 'д' - 2: 3, # 'е' - 24: 0, # 'ж' - 20: 1, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 2, # 'к' - 8: 1, # 'л' - 12: 1, # 'м' - 5: 1, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 1, # 'р' - 7: 0, # 'с' - 6: 1, # 'т' - 14: 3, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 1, # 'ц' - 22: 0, # 'ч' - 25: 1, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 3, # 'ы' - 17: 1, # 'ь' - 30: 0, # 'э' - 27: 1, # 'ю' - 16: 0, # 'я' - }, - 22: { # 'ч' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 1, # 'б' - 10: 1, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 3, # 'е' - 24: 1, # 'ж' - 20: 0, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 3, # 'к' - 8: 2, # 'л' - 12: 1, # 'м' - 5: 3, # 'н' - 1: 2, # 'о' - 15: 0, # 'п' - 9: 2, # 'р' - 7: 1, # 'с' - 6: 3, # 'т' - 14: 3, # 'у' - 39: 1, # 'ф' - 26: 1, # 'х' - 28: 0, # 'ц' - 22: 1, # 'ч' - 25: 2, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 3, # 'ь' - 30: 0, # 'э' - 27: 0, # 'ю' - 16: 0, # 'я' - }, - 25: { # 'ш' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 1, # 'б' - 10: 2, # 'в' - 19: 1, # 'г' - 13: 0, # 'д' - 2: 3, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 2, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 2, # 'п' - 9: 2, # 'р' - 7: 1, # 'с' - 6: 2, # 'т' - 14: 3, # 'у' - 39: 2, # 'ф' - 26: 1, # 'х' - 28: 1, # 'ц' - 22: 1, # 'ч' - 25: 1, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 3, # 'ь' - 30: 1, # 'э' - 27: 1, # 'ю' - 16: 0, # 'я' - }, - 29: { # 'щ' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 0, # 'б' - 10: 1, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 3, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 0, # 'л' - 12: 1, # 'м' - 5: 2, # 'н' - 1: 1, # 'о' - 15: 0, # 'п' - 9: 2, # 'р' - 7: 0, # 'с' - 6: 0, # 'т' - 14: 2, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 2, # 'ь' - 30: 0, # 'э' - 27: 0, # 'ю' - 16: 0, # 'я' - }, - 54: { # 'ъ' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 0, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 0, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 0, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 0, # 'о' - 15: 0, # 'п' - 9: 0, # 'р' - 7: 0, # 'с' - 6: 0, # 'т' - 14: 0, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 0, # 'э' - 27: 1, # 'ю' - 16: 2, # 'я' - }, - 18: { # 'ы' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 0, # 'а' - 21: 3, # 'б' - 10: 3, # 'в' - 19: 2, # 'г' - 13: 2, # 'д' - 2: 3, # 'е' - 24: 2, # 'ж' - 20: 2, # 'з' - 4: 2, # 'и' - 23: 3, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 3, # 'м' - 5: 3, # 'н' - 1: 1, # 'о' - 15: 3, # 'п' - 9: 3, # 'р' - 7: 3, # 'с' - 6: 3, # 'т' - 14: 1, # 'у' - 39: 0, # 'ф' - 26: 3, # 'х' - 28: 2, # 'ц' - 22: 3, # 'ч' - 25: 3, # 'ш' - 29: 2, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 0, # 'э' - 27: 0, # 'ю' - 16: 2, # 'я' - }, - 17: { # 'ь' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 0, # 'а' - 21: 2, # 'б' - 10: 2, # 'в' - 19: 2, # 'г' - 13: 2, # 'д' - 2: 3, # 'е' - 24: 1, # 'ж' - 20: 3, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 3, # 'к' - 8: 0, # 'л' - 12: 3, # 'м' - 5: 3, # 'н' - 1: 2, # 'о' - 15: 2, # 'п' - 9: 1, # 'р' - 7: 3, # 'с' - 6: 2, # 'т' - 14: 0, # 'у' - 39: 2, # 'ф' - 26: 1, # 'х' - 28: 2, # 'ц' - 22: 2, # 'ч' - 25: 3, # 'ш' - 29: 2, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 1, # 'э' - 27: 3, # 'ю' - 16: 3, # 'я' - }, - 30: { # 'э' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 1, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 0, # 'а' - 21: 1, # 'б' - 10: 1, # 'в' - 19: 1, # 'г' - 13: 2, # 'д' - 2: 1, # 'е' - 24: 0, # 'ж' - 20: 1, # 'з' - 4: 0, # 'и' - 23: 2, # 'й' - 11: 2, # 'к' - 8: 2, # 'л' - 12: 2, # 'м' - 5: 2, # 'н' - 1: 0, # 'о' - 15: 2, # 'п' - 9: 2, # 'р' - 7: 2, # 'с' - 6: 3, # 'т' - 14: 1, # 'у' - 39: 2, # 'ф' - 26: 1, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 1, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 1, # 'э' - 27: 1, # 'ю' - 16: 1, # 'я' - }, - 27: { # 'ю' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 2, # 'а' - 21: 3, # 'б' - 10: 1, # 'в' - 19: 2, # 'г' - 13: 3, # 'д' - 2: 1, # 'е' - 24: 2, # 'ж' - 20: 2, # 'з' - 4: 1, # 'и' - 23: 1, # 'й' - 11: 2, # 'к' - 8: 2, # 'л' - 12: 2, # 'м' - 5: 2, # 'н' - 1: 1, # 'о' - 15: 2, # 'п' - 9: 2, # 'р' - 7: 3, # 'с' - 6: 3, # 'т' - 14: 0, # 'у' - 39: 1, # 'ф' - 26: 2, # 'х' - 28: 2, # 'ц' - 22: 2, # 'ч' - 25: 2, # 'ш' - 29: 3, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 1, # 'э' - 27: 2, # 'ю' - 16: 1, # 'я' - }, - 16: { # 'я' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 0, # 'а' - 21: 2, # 'б' - 10: 3, # 'в' - 19: 2, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 3, # 'ж' - 20: 3, # 'з' - 4: 2, # 'и' - 23: 2, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 3, # 'м' - 5: 3, # 'н' - 1: 0, # 'о' - 15: 2, # 'п' - 9: 2, # 'р' - 7: 3, # 'с' - 6: 3, # 'т' - 14: 1, # 'у' - 39: 1, # 'ф' - 26: 3, # 'х' - 28: 2, # 'ц' - 22: 2, # 'ч' - 25: 2, # 'ш' - 29: 3, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 0, # 'э' - 27: 2, # 'ю' - 16: 2, # 'я' - }, -} - -# 255: Undefined characters that did not exist in training text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 -# 251: Control characters - -# Character Mapping Table(s): -IBM866_RUSSIAN_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 142, # 'A' - 66: 143, # 'B' - 67: 144, # 'C' - 68: 145, # 'D' - 69: 146, # 'E' - 70: 147, # 'F' - 71: 148, # 'G' - 72: 149, # 'H' - 73: 150, # 'I' - 74: 151, # 'J' - 75: 152, # 'K' - 76: 74, # 'L' - 77: 153, # 'M' - 78: 75, # 'N' - 79: 154, # 'O' - 80: 155, # 'P' - 81: 156, # 'Q' - 82: 157, # 'R' - 83: 158, # 'S' - 84: 159, # 'T' - 85: 160, # 'U' - 86: 161, # 'V' - 87: 162, # 'W' - 88: 163, # 'X' - 89: 164, # 'Y' - 90: 165, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 71, # 'a' - 98: 172, # 'b' - 99: 66, # 'c' - 100: 173, # 'd' - 101: 65, # 'e' - 102: 174, # 'f' - 103: 76, # 'g' - 104: 175, # 'h' - 105: 64, # 'i' - 106: 176, # 'j' - 107: 177, # 'k' - 108: 77, # 'l' - 109: 72, # 'm' - 110: 178, # 'n' - 111: 69, # 'o' - 112: 67, # 'p' - 113: 179, # 'q' - 114: 78, # 'r' - 115: 73, # 's' - 116: 180, # 't' - 117: 181, # 'u' - 118: 79, # 'v' - 119: 182, # 'w' - 120: 183, # 'x' - 121: 184, # 'y' - 122: 185, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 37, # 'А' - 129: 44, # 'Б' - 130: 33, # 'В' - 131: 46, # 'Г' - 132: 41, # 'Д' - 133: 48, # 'Е' - 134: 56, # 'Ж' - 135: 51, # 'З' - 136: 42, # 'И' - 137: 60, # 'Й' - 138: 36, # 'К' - 139: 49, # 'Л' - 140: 38, # 'М' - 141: 31, # 'Н' - 142: 34, # 'О' - 143: 35, # 'П' - 144: 45, # 'Р' - 145: 32, # 'С' - 146: 40, # 'Т' - 147: 52, # 'У' - 148: 53, # 'Ф' - 149: 55, # 'Х' - 150: 58, # 'Ц' - 151: 50, # 'Ч' - 152: 57, # 'Ш' - 153: 63, # 'Щ' - 154: 70, # 'Ъ' - 155: 62, # 'Ы' - 156: 61, # 'Ь' - 157: 47, # 'Э' - 158: 59, # 'Ю' - 159: 43, # 'Я' - 160: 3, # 'а' - 161: 21, # 'б' - 162: 10, # 'в' - 163: 19, # 'г' - 164: 13, # 'д' - 165: 2, # 'е' - 166: 24, # 'ж' - 167: 20, # 'з' - 168: 4, # 'и' - 169: 23, # 'й' - 170: 11, # 'к' - 171: 8, # 'л' - 172: 12, # 'м' - 173: 5, # 'н' - 174: 1, # 'о' - 175: 15, # 'п' - 176: 191, # '░' - 177: 192, # '▒' - 178: 193, # '▓' - 179: 194, # '│' - 180: 195, # '┤' - 181: 196, # '╡' - 182: 197, # '╢' - 183: 198, # '╖' - 184: 199, # '╕' - 185: 200, # '╣' - 186: 201, # '║' - 187: 202, # '╗' - 188: 203, # '╝' - 189: 204, # '╜' - 190: 205, # '╛' - 191: 206, # '┐' - 192: 207, # '└' - 193: 208, # '┴' - 194: 209, # '┬' - 195: 210, # '├' - 196: 211, # '─' - 197: 212, # '┼' - 198: 213, # '╞' - 199: 214, # '╟' - 200: 215, # '╚' - 201: 216, # '╔' - 202: 217, # '╩' - 203: 218, # '╦' - 204: 219, # '╠' - 205: 220, # '═' - 206: 221, # '╬' - 207: 222, # '╧' - 208: 223, # '╨' - 209: 224, # '╤' - 210: 225, # '╥' - 211: 226, # '╙' - 212: 227, # '╘' - 213: 228, # '╒' - 214: 229, # '╓' - 215: 230, # '╫' - 216: 231, # '╪' - 217: 232, # '┘' - 218: 233, # '┌' - 219: 234, # '█' - 220: 235, # '▄' - 221: 236, # '▌' - 222: 237, # '▐' - 223: 238, # '▀' - 224: 9, # 'р' - 225: 7, # 'с' - 226: 6, # 'т' - 227: 14, # 'у' - 228: 39, # 'ф' - 229: 26, # 'х' - 230: 28, # 'ц' - 231: 22, # 'ч' - 232: 25, # 'ш' - 233: 29, # 'щ' - 234: 54, # 'ъ' - 235: 18, # 'ы' - 236: 17, # 'ь' - 237: 30, # 'э' - 238: 27, # 'ю' - 239: 16, # 'я' - 240: 239, # 'Ё' - 241: 68, # 'ё' - 242: 240, # 'Є' - 243: 241, # 'є' - 244: 242, # 'Ї' - 245: 243, # 'ї' - 246: 244, # 'Ў' - 247: 245, # 'ў' - 248: 246, # '°' - 249: 247, # '∙' - 250: 248, # '·' - 251: 249, # '√' - 252: 250, # '№' - 253: 251, # '¤' - 254: 252, # '■' - 255: 255, # '\xa0' -} - -IBM866_RUSSIAN_MODEL = SingleByteCharSetModel( - charset_name="IBM866", - language="Russian", - char_to_order_map=IBM866_RUSSIAN_CHAR_TO_ORDER, - language_model=RUSSIAN_LANG_MODEL, - typical_positive_ratio=0.976601, - keep_ascii_letters=False, - alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё", -) - -WINDOWS_1251_RUSSIAN_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 142, # 'A' - 66: 143, # 'B' - 67: 144, # 'C' - 68: 145, # 'D' - 69: 146, # 'E' - 70: 147, # 'F' - 71: 148, # 'G' - 72: 149, # 'H' - 73: 150, # 'I' - 74: 151, # 'J' - 75: 152, # 'K' - 76: 74, # 'L' - 77: 153, # 'M' - 78: 75, # 'N' - 79: 154, # 'O' - 80: 155, # 'P' - 81: 156, # 'Q' - 82: 157, # 'R' - 83: 158, # 'S' - 84: 159, # 'T' - 85: 160, # 'U' - 86: 161, # 'V' - 87: 162, # 'W' - 88: 163, # 'X' - 89: 164, # 'Y' - 90: 165, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 71, # 'a' - 98: 172, # 'b' - 99: 66, # 'c' - 100: 173, # 'd' - 101: 65, # 'e' - 102: 174, # 'f' - 103: 76, # 'g' - 104: 175, # 'h' - 105: 64, # 'i' - 106: 176, # 'j' - 107: 177, # 'k' - 108: 77, # 'l' - 109: 72, # 'm' - 110: 178, # 'n' - 111: 69, # 'o' - 112: 67, # 'p' - 113: 179, # 'q' - 114: 78, # 'r' - 115: 73, # 's' - 116: 180, # 't' - 117: 181, # 'u' - 118: 79, # 'v' - 119: 182, # 'w' - 120: 183, # 'x' - 121: 184, # 'y' - 122: 185, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 191, # 'Ђ' - 129: 192, # 'Ѓ' - 130: 193, # '‚' - 131: 194, # 'ѓ' - 132: 195, # '„' - 133: 196, # '…' - 134: 197, # '†' - 135: 198, # '‡' - 136: 199, # '€' - 137: 200, # '‰' - 138: 201, # 'Љ' - 139: 202, # '‹' - 140: 203, # 'Њ' - 141: 204, # 'Ќ' - 142: 205, # 'Ћ' - 143: 206, # 'Џ' - 144: 207, # 'ђ' - 145: 208, # '‘' - 146: 209, # '’' - 147: 210, # '“' - 148: 211, # '”' - 149: 212, # '•' - 150: 213, # '–' - 151: 214, # '—' - 152: 215, # None - 153: 216, # '™' - 154: 217, # 'љ' - 155: 218, # '›' - 156: 219, # 'њ' - 157: 220, # 'ќ' - 158: 221, # 'ћ' - 159: 222, # 'џ' - 160: 223, # '\xa0' - 161: 224, # 'Ў' - 162: 225, # 'ў' - 163: 226, # 'Ј' - 164: 227, # '¤' - 165: 228, # 'Ґ' - 166: 229, # '¦' - 167: 230, # '§' - 168: 231, # 'Ё' - 169: 232, # '©' - 170: 233, # 'Є' - 171: 234, # '«' - 172: 235, # '¬' - 173: 236, # '\xad' - 174: 237, # '®' - 175: 238, # 'Ї' - 176: 239, # '°' - 177: 240, # '±' - 178: 241, # 'І' - 179: 242, # 'і' - 180: 243, # 'ґ' - 181: 244, # 'µ' - 182: 245, # '¶' - 183: 246, # '·' - 184: 68, # 'ё' - 185: 247, # '№' - 186: 248, # 'є' - 187: 249, # '»' - 188: 250, # 'ј' - 189: 251, # 'Ѕ' - 190: 252, # 'ѕ' - 191: 253, # 'ї' - 192: 37, # 'А' - 193: 44, # 'Б' - 194: 33, # 'В' - 195: 46, # 'Г' - 196: 41, # 'Д' - 197: 48, # 'Е' - 198: 56, # 'Ж' - 199: 51, # 'З' - 200: 42, # 'И' - 201: 60, # 'Й' - 202: 36, # 'К' - 203: 49, # 'Л' - 204: 38, # 'М' - 205: 31, # 'Н' - 206: 34, # 'О' - 207: 35, # 'П' - 208: 45, # 'Р' - 209: 32, # 'С' - 210: 40, # 'Т' - 211: 52, # 'У' - 212: 53, # 'Ф' - 213: 55, # 'Х' - 214: 58, # 'Ц' - 215: 50, # 'Ч' - 216: 57, # 'Ш' - 217: 63, # 'Щ' - 218: 70, # 'Ъ' - 219: 62, # 'Ы' - 220: 61, # 'Ь' - 221: 47, # 'Э' - 222: 59, # 'Ю' - 223: 43, # 'Я' - 224: 3, # 'а' - 225: 21, # 'б' - 226: 10, # 'в' - 227: 19, # 'г' - 228: 13, # 'д' - 229: 2, # 'е' - 230: 24, # 'ж' - 231: 20, # 'з' - 232: 4, # 'и' - 233: 23, # 'й' - 234: 11, # 'к' - 235: 8, # 'л' - 236: 12, # 'м' - 237: 5, # 'н' - 238: 1, # 'о' - 239: 15, # 'п' - 240: 9, # 'р' - 241: 7, # 'с' - 242: 6, # 'т' - 243: 14, # 'у' - 244: 39, # 'ф' - 245: 26, # 'х' - 246: 28, # 'ц' - 247: 22, # 'ч' - 248: 25, # 'ш' - 249: 29, # 'щ' - 250: 54, # 'ъ' - 251: 18, # 'ы' - 252: 17, # 'ь' - 253: 30, # 'э' - 254: 27, # 'ю' - 255: 16, # 'я' -} - -WINDOWS_1251_RUSSIAN_MODEL = SingleByteCharSetModel( - charset_name="windows-1251", - language="Russian", - char_to_order_map=WINDOWS_1251_RUSSIAN_CHAR_TO_ORDER, - language_model=RUSSIAN_LANG_MODEL, - typical_positive_ratio=0.976601, - keep_ascii_letters=False, - alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё", -) - -IBM855_RUSSIAN_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 142, # 'A' - 66: 143, # 'B' - 67: 144, # 'C' - 68: 145, # 'D' - 69: 146, # 'E' - 70: 147, # 'F' - 71: 148, # 'G' - 72: 149, # 'H' - 73: 150, # 'I' - 74: 151, # 'J' - 75: 152, # 'K' - 76: 74, # 'L' - 77: 153, # 'M' - 78: 75, # 'N' - 79: 154, # 'O' - 80: 155, # 'P' - 81: 156, # 'Q' - 82: 157, # 'R' - 83: 158, # 'S' - 84: 159, # 'T' - 85: 160, # 'U' - 86: 161, # 'V' - 87: 162, # 'W' - 88: 163, # 'X' - 89: 164, # 'Y' - 90: 165, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 71, # 'a' - 98: 172, # 'b' - 99: 66, # 'c' - 100: 173, # 'd' - 101: 65, # 'e' - 102: 174, # 'f' - 103: 76, # 'g' - 104: 175, # 'h' - 105: 64, # 'i' - 106: 176, # 'j' - 107: 177, # 'k' - 108: 77, # 'l' - 109: 72, # 'm' - 110: 178, # 'n' - 111: 69, # 'o' - 112: 67, # 'p' - 113: 179, # 'q' - 114: 78, # 'r' - 115: 73, # 's' - 116: 180, # 't' - 117: 181, # 'u' - 118: 79, # 'v' - 119: 182, # 'w' - 120: 183, # 'x' - 121: 184, # 'y' - 122: 185, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 191, # 'ђ' - 129: 192, # 'Ђ' - 130: 193, # 'ѓ' - 131: 194, # 'Ѓ' - 132: 68, # 'ё' - 133: 195, # 'Ё' - 134: 196, # 'є' - 135: 197, # 'Є' - 136: 198, # 'ѕ' - 137: 199, # 'Ѕ' - 138: 200, # 'і' - 139: 201, # 'І' - 140: 202, # 'ї' - 141: 203, # 'Ї' - 142: 204, # 'ј' - 143: 205, # 'Ј' - 144: 206, # 'љ' - 145: 207, # 'Љ' - 146: 208, # 'њ' - 147: 209, # 'Њ' - 148: 210, # 'ћ' - 149: 211, # 'Ћ' - 150: 212, # 'ќ' - 151: 213, # 'Ќ' - 152: 214, # 'ў' - 153: 215, # 'Ў' - 154: 216, # 'џ' - 155: 217, # 'Џ' - 156: 27, # 'ю' - 157: 59, # 'Ю' - 158: 54, # 'ъ' - 159: 70, # 'Ъ' - 160: 3, # 'а' - 161: 37, # 'А' - 162: 21, # 'б' - 163: 44, # 'Б' - 164: 28, # 'ц' - 165: 58, # 'Ц' - 166: 13, # 'д' - 167: 41, # 'Д' - 168: 2, # 'е' - 169: 48, # 'Е' - 170: 39, # 'ф' - 171: 53, # 'Ф' - 172: 19, # 'г' - 173: 46, # 'Г' - 174: 218, # '«' - 175: 219, # '»' - 176: 220, # '░' - 177: 221, # '▒' - 178: 222, # '▓' - 179: 223, # '│' - 180: 224, # '┤' - 181: 26, # 'х' - 182: 55, # 'Х' - 183: 4, # 'и' - 184: 42, # 'И' - 185: 225, # '╣' - 186: 226, # '║' - 187: 227, # '╗' - 188: 228, # '╝' - 189: 23, # 'й' - 190: 60, # 'Й' - 191: 229, # '┐' - 192: 230, # '└' - 193: 231, # '┴' - 194: 232, # '┬' - 195: 233, # '├' - 196: 234, # '─' - 197: 235, # '┼' - 198: 11, # 'к' - 199: 36, # 'К' - 200: 236, # '╚' - 201: 237, # '╔' - 202: 238, # '╩' - 203: 239, # '╦' - 204: 240, # '╠' - 205: 241, # '═' - 206: 242, # '╬' - 207: 243, # '¤' - 208: 8, # 'л' - 209: 49, # 'Л' - 210: 12, # 'м' - 211: 38, # 'М' - 212: 5, # 'н' - 213: 31, # 'Н' - 214: 1, # 'о' - 215: 34, # 'О' - 216: 15, # 'п' - 217: 244, # '┘' - 218: 245, # '┌' - 219: 246, # '█' - 220: 247, # '▄' - 221: 35, # 'П' - 222: 16, # 'я' - 223: 248, # '▀' - 224: 43, # 'Я' - 225: 9, # 'р' - 226: 45, # 'Р' - 227: 7, # 'с' - 228: 32, # 'С' - 229: 6, # 'т' - 230: 40, # 'Т' - 231: 14, # 'у' - 232: 52, # 'У' - 233: 24, # 'ж' - 234: 56, # 'Ж' - 235: 10, # 'в' - 236: 33, # 'В' - 237: 17, # 'ь' - 238: 61, # 'Ь' - 239: 249, # '№' - 240: 250, # '\xad' - 241: 18, # 'ы' - 242: 62, # 'Ы' - 243: 20, # 'з' - 244: 51, # 'З' - 245: 25, # 'ш' - 246: 57, # 'Ш' - 247: 30, # 'э' - 248: 47, # 'Э' - 249: 29, # 'щ' - 250: 63, # 'Щ' - 251: 22, # 'ч' - 252: 50, # 'Ч' - 253: 251, # '§' - 254: 252, # '■' - 255: 255, # '\xa0' -} - -IBM855_RUSSIAN_MODEL = SingleByteCharSetModel( - charset_name="IBM855", - language="Russian", - char_to_order_map=IBM855_RUSSIAN_CHAR_TO_ORDER, - language_model=RUSSIAN_LANG_MODEL, - typical_positive_ratio=0.976601, - keep_ascii_letters=False, - alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё", -) - -KOI8_R_RUSSIAN_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 142, # 'A' - 66: 143, # 'B' - 67: 144, # 'C' - 68: 145, # 'D' - 69: 146, # 'E' - 70: 147, # 'F' - 71: 148, # 'G' - 72: 149, # 'H' - 73: 150, # 'I' - 74: 151, # 'J' - 75: 152, # 'K' - 76: 74, # 'L' - 77: 153, # 'M' - 78: 75, # 'N' - 79: 154, # 'O' - 80: 155, # 'P' - 81: 156, # 'Q' - 82: 157, # 'R' - 83: 158, # 'S' - 84: 159, # 'T' - 85: 160, # 'U' - 86: 161, # 'V' - 87: 162, # 'W' - 88: 163, # 'X' - 89: 164, # 'Y' - 90: 165, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 71, # 'a' - 98: 172, # 'b' - 99: 66, # 'c' - 100: 173, # 'd' - 101: 65, # 'e' - 102: 174, # 'f' - 103: 76, # 'g' - 104: 175, # 'h' - 105: 64, # 'i' - 106: 176, # 'j' - 107: 177, # 'k' - 108: 77, # 'l' - 109: 72, # 'm' - 110: 178, # 'n' - 111: 69, # 'o' - 112: 67, # 'p' - 113: 179, # 'q' - 114: 78, # 'r' - 115: 73, # 's' - 116: 180, # 't' - 117: 181, # 'u' - 118: 79, # 'v' - 119: 182, # 'w' - 120: 183, # 'x' - 121: 184, # 'y' - 122: 185, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 191, # '─' - 129: 192, # '│' - 130: 193, # '┌' - 131: 194, # '┐' - 132: 195, # '└' - 133: 196, # '┘' - 134: 197, # '├' - 135: 198, # '┤' - 136: 199, # '┬' - 137: 200, # '┴' - 138: 201, # '┼' - 139: 202, # '▀' - 140: 203, # '▄' - 141: 204, # '█' - 142: 205, # '▌' - 143: 206, # '▐' - 144: 207, # '░' - 145: 208, # '▒' - 146: 209, # '▓' - 147: 210, # '⌠' - 148: 211, # '■' - 149: 212, # '∙' - 150: 213, # '√' - 151: 214, # '≈' - 152: 215, # '≤' - 153: 216, # '≥' - 154: 217, # '\xa0' - 155: 218, # '⌡' - 156: 219, # '°' - 157: 220, # '²' - 158: 221, # '·' - 159: 222, # '÷' - 160: 223, # '═' - 161: 224, # '║' - 162: 225, # '╒' - 163: 68, # 'ё' - 164: 226, # '╓' - 165: 227, # '╔' - 166: 228, # '╕' - 167: 229, # '╖' - 168: 230, # '╗' - 169: 231, # '╘' - 170: 232, # '╙' - 171: 233, # '╚' - 172: 234, # '╛' - 173: 235, # '╜' - 174: 236, # '╝' - 175: 237, # '╞' - 176: 238, # '╟' - 177: 239, # '╠' - 178: 240, # '╡' - 179: 241, # 'Ё' - 180: 242, # '╢' - 181: 243, # '╣' - 182: 244, # '╤' - 183: 245, # '╥' - 184: 246, # '╦' - 185: 247, # '╧' - 186: 248, # '╨' - 187: 249, # '╩' - 188: 250, # '╪' - 189: 251, # '╫' - 190: 252, # '╬' - 191: 253, # '©' - 192: 27, # 'ю' - 193: 3, # 'а' - 194: 21, # 'б' - 195: 28, # 'ц' - 196: 13, # 'д' - 197: 2, # 'е' - 198: 39, # 'ф' - 199: 19, # 'г' - 200: 26, # 'х' - 201: 4, # 'и' - 202: 23, # 'й' - 203: 11, # 'к' - 204: 8, # 'л' - 205: 12, # 'м' - 206: 5, # 'н' - 207: 1, # 'о' - 208: 15, # 'п' - 209: 16, # 'я' - 210: 9, # 'р' - 211: 7, # 'с' - 212: 6, # 'т' - 213: 14, # 'у' - 214: 24, # 'ж' - 215: 10, # 'в' - 216: 17, # 'ь' - 217: 18, # 'ы' - 218: 20, # 'з' - 219: 25, # 'ш' - 220: 30, # 'э' - 221: 29, # 'щ' - 222: 22, # 'ч' - 223: 54, # 'ъ' - 224: 59, # 'Ю' - 225: 37, # 'А' - 226: 44, # 'Б' - 227: 58, # 'Ц' - 228: 41, # 'Д' - 229: 48, # 'Е' - 230: 53, # 'Ф' - 231: 46, # 'Г' - 232: 55, # 'Х' - 233: 42, # 'И' - 234: 60, # 'Й' - 235: 36, # 'К' - 236: 49, # 'Л' - 237: 38, # 'М' - 238: 31, # 'Н' - 239: 34, # 'О' - 240: 35, # 'П' - 241: 43, # 'Я' - 242: 45, # 'Р' - 243: 32, # 'С' - 244: 40, # 'Т' - 245: 52, # 'У' - 246: 56, # 'Ж' - 247: 33, # 'В' - 248: 61, # 'Ь' - 249: 62, # 'Ы' - 250: 51, # 'З' - 251: 57, # 'Ш' - 252: 47, # 'Э' - 253: 63, # 'Щ' - 254: 50, # 'Ч' - 255: 70, # 'Ъ' -} - -KOI8_R_RUSSIAN_MODEL = SingleByteCharSetModel( - charset_name="KOI8-R", - language="Russian", - char_to_order_map=KOI8_R_RUSSIAN_CHAR_TO_ORDER, - language_model=RUSSIAN_LANG_MODEL, - typical_positive_ratio=0.976601, - keep_ascii_letters=False, - alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё", -) - -MACCYRILLIC_RUSSIAN_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 142, # 'A' - 66: 143, # 'B' - 67: 144, # 'C' - 68: 145, # 'D' - 69: 146, # 'E' - 70: 147, # 'F' - 71: 148, # 'G' - 72: 149, # 'H' - 73: 150, # 'I' - 74: 151, # 'J' - 75: 152, # 'K' - 76: 74, # 'L' - 77: 153, # 'M' - 78: 75, # 'N' - 79: 154, # 'O' - 80: 155, # 'P' - 81: 156, # 'Q' - 82: 157, # 'R' - 83: 158, # 'S' - 84: 159, # 'T' - 85: 160, # 'U' - 86: 161, # 'V' - 87: 162, # 'W' - 88: 163, # 'X' - 89: 164, # 'Y' - 90: 165, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 71, # 'a' - 98: 172, # 'b' - 99: 66, # 'c' - 100: 173, # 'd' - 101: 65, # 'e' - 102: 174, # 'f' - 103: 76, # 'g' - 104: 175, # 'h' - 105: 64, # 'i' - 106: 176, # 'j' - 107: 177, # 'k' - 108: 77, # 'l' - 109: 72, # 'm' - 110: 178, # 'n' - 111: 69, # 'o' - 112: 67, # 'p' - 113: 179, # 'q' - 114: 78, # 'r' - 115: 73, # 's' - 116: 180, # 't' - 117: 181, # 'u' - 118: 79, # 'v' - 119: 182, # 'w' - 120: 183, # 'x' - 121: 184, # 'y' - 122: 185, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 37, # 'А' - 129: 44, # 'Б' - 130: 33, # 'В' - 131: 46, # 'Г' - 132: 41, # 'Д' - 133: 48, # 'Е' - 134: 56, # 'Ж' - 135: 51, # 'З' - 136: 42, # 'И' - 137: 60, # 'Й' - 138: 36, # 'К' - 139: 49, # 'Л' - 140: 38, # 'М' - 141: 31, # 'Н' - 142: 34, # 'О' - 143: 35, # 'П' - 144: 45, # 'Р' - 145: 32, # 'С' - 146: 40, # 'Т' - 147: 52, # 'У' - 148: 53, # 'Ф' - 149: 55, # 'Х' - 150: 58, # 'Ц' - 151: 50, # 'Ч' - 152: 57, # 'Ш' - 153: 63, # 'Щ' - 154: 70, # 'Ъ' - 155: 62, # 'Ы' - 156: 61, # 'Ь' - 157: 47, # 'Э' - 158: 59, # 'Ю' - 159: 43, # 'Я' - 160: 191, # '†' - 161: 192, # '°' - 162: 193, # 'Ґ' - 163: 194, # '£' - 164: 195, # '§' - 165: 196, # '•' - 166: 197, # '¶' - 167: 198, # 'І' - 168: 199, # '®' - 169: 200, # '©' - 170: 201, # '™' - 171: 202, # 'Ђ' - 172: 203, # 'ђ' - 173: 204, # '≠' - 174: 205, # 'Ѓ' - 175: 206, # 'ѓ' - 176: 207, # '∞' - 177: 208, # '±' - 178: 209, # '≤' - 179: 210, # '≥' - 180: 211, # 'і' - 181: 212, # 'µ' - 182: 213, # 'ґ' - 183: 214, # 'Ј' - 184: 215, # 'Є' - 185: 216, # 'є' - 186: 217, # 'Ї' - 187: 218, # 'ї' - 188: 219, # 'Љ' - 189: 220, # 'љ' - 190: 221, # 'Њ' - 191: 222, # 'њ' - 192: 223, # 'ј' - 193: 224, # 'Ѕ' - 194: 225, # '¬' - 195: 226, # '√' - 196: 227, # 'ƒ' - 197: 228, # '≈' - 198: 229, # '∆' - 199: 230, # '«' - 200: 231, # '»' - 201: 232, # '…' - 202: 233, # '\xa0' - 203: 234, # 'Ћ' - 204: 235, # 'ћ' - 205: 236, # 'Ќ' - 206: 237, # 'ќ' - 207: 238, # 'ѕ' - 208: 239, # '–' - 209: 240, # '—' - 210: 241, # '“' - 211: 242, # '”' - 212: 243, # '‘' - 213: 244, # '’' - 214: 245, # '÷' - 215: 246, # '„' - 216: 247, # 'Ў' - 217: 248, # 'ў' - 218: 249, # 'Џ' - 219: 250, # 'џ' - 220: 251, # '№' - 221: 252, # 'Ё' - 222: 68, # 'ё' - 223: 16, # 'я' - 224: 3, # 'а' - 225: 21, # 'б' - 226: 10, # 'в' - 227: 19, # 'г' - 228: 13, # 'д' - 229: 2, # 'е' - 230: 24, # 'ж' - 231: 20, # 'з' - 232: 4, # 'и' - 233: 23, # 'й' - 234: 11, # 'к' - 235: 8, # 'л' - 236: 12, # 'м' - 237: 5, # 'н' - 238: 1, # 'о' - 239: 15, # 'п' - 240: 9, # 'р' - 241: 7, # 'с' - 242: 6, # 'т' - 243: 14, # 'у' - 244: 39, # 'ф' - 245: 26, # 'х' - 246: 28, # 'ц' - 247: 22, # 'ч' - 248: 25, # 'ш' - 249: 29, # 'щ' - 250: 54, # 'ъ' - 251: 18, # 'ы' - 252: 17, # 'ь' - 253: 30, # 'э' - 254: 27, # 'ю' - 255: 255, # '€' -} - -MACCYRILLIC_RUSSIAN_MODEL = SingleByteCharSetModel( - charset_name="MacCyrillic", - language="Russian", - char_to_order_map=MACCYRILLIC_RUSSIAN_CHAR_TO_ORDER, - language_model=RUSSIAN_LANG_MODEL, - typical_positive_ratio=0.976601, - keep_ascii_letters=False, - alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё", -) - -ISO_8859_5_RUSSIAN_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 142, # 'A' - 66: 143, # 'B' - 67: 144, # 'C' - 68: 145, # 'D' - 69: 146, # 'E' - 70: 147, # 'F' - 71: 148, # 'G' - 72: 149, # 'H' - 73: 150, # 'I' - 74: 151, # 'J' - 75: 152, # 'K' - 76: 74, # 'L' - 77: 153, # 'M' - 78: 75, # 'N' - 79: 154, # 'O' - 80: 155, # 'P' - 81: 156, # 'Q' - 82: 157, # 'R' - 83: 158, # 'S' - 84: 159, # 'T' - 85: 160, # 'U' - 86: 161, # 'V' - 87: 162, # 'W' - 88: 163, # 'X' - 89: 164, # 'Y' - 90: 165, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 71, # 'a' - 98: 172, # 'b' - 99: 66, # 'c' - 100: 173, # 'd' - 101: 65, # 'e' - 102: 174, # 'f' - 103: 76, # 'g' - 104: 175, # 'h' - 105: 64, # 'i' - 106: 176, # 'j' - 107: 177, # 'k' - 108: 77, # 'l' - 109: 72, # 'm' - 110: 178, # 'n' - 111: 69, # 'o' - 112: 67, # 'p' - 113: 179, # 'q' - 114: 78, # 'r' - 115: 73, # 's' - 116: 180, # 't' - 117: 181, # 'u' - 118: 79, # 'v' - 119: 182, # 'w' - 120: 183, # 'x' - 121: 184, # 'y' - 122: 185, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 191, # '\x80' - 129: 192, # '\x81' - 130: 193, # '\x82' - 131: 194, # '\x83' - 132: 195, # '\x84' - 133: 196, # '\x85' - 134: 197, # '\x86' - 135: 198, # '\x87' - 136: 199, # '\x88' - 137: 200, # '\x89' - 138: 201, # '\x8a' - 139: 202, # '\x8b' - 140: 203, # '\x8c' - 141: 204, # '\x8d' - 142: 205, # '\x8e' - 143: 206, # '\x8f' - 144: 207, # '\x90' - 145: 208, # '\x91' - 146: 209, # '\x92' - 147: 210, # '\x93' - 148: 211, # '\x94' - 149: 212, # '\x95' - 150: 213, # '\x96' - 151: 214, # '\x97' - 152: 215, # '\x98' - 153: 216, # '\x99' - 154: 217, # '\x9a' - 155: 218, # '\x9b' - 156: 219, # '\x9c' - 157: 220, # '\x9d' - 158: 221, # '\x9e' - 159: 222, # '\x9f' - 160: 223, # '\xa0' - 161: 224, # 'Ё' - 162: 225, # 'Ђ' - 163: 226, # 'Ѓ' - 164: 227, # 'Є' - 165: 228, # 'Ѕ' - 166: 229, # 'І' - 167: 230, # 'Ї' - 168: 231, # 'Ј' - 169: 232, # 'Љ' - 170: 233, # 'Њ' - 171: 234, # 'Ћ' - 172: 235, # 'Ќ' - 173: 236, # '\xad' - 174: 237, # 'Ў' - 175: 238, # 'Џ' - 176: 37, # 'А' - 177: 44, # 'Б' - 178: 33, # 'В' - 179: 46, # 'Г' - 180: 41, # 'Д' - 181: 48, # 'Е' - 182: 56, # 'Ж' - 183: 51, # 'З' - 184: 42, # 'И' - 185: 60, # 'Й' - 186: 36, # 'К' - 187: 49, # 'Л' - 188: 38, # 'М' - 189: 31, # 'Н' - 190: 34, # 'О' - 191: 35, # 'П' - 192: 45, # 'Р' - 193: 32, # 'С' - 194: 40, # 'Т' - 195: 52, # 'У' - 196: 53, # 'Ф' - 197: 55, # 'Х' - 198: 58, # 'Ц' - 199: 50, # 'Ч' - 200: 57, # 'Ш' - 201: 63, # 'Щ' - 202: 70, # 'Ъ' - 203: 62, # 'Ы' - 204: 61, # 'Ь' - 205: 47, # 'Э' - 206: 59, # 'Ю' - 207: 43, # 'Я' - 208: 3, # 'а' - 209: 21, # 'б' - 210: 10, # 'в' - 211: 19, # 'г' - 212: 13, # 'д' - 213: 2, # 'е' - 214: 24, # 'ж' - 215: 20, # 'з' - 216: 4, # 'и' - 217: 23, # 'й' - 218: 11, # 'к' - 219: 8, # 'л' - 220: 12, # 'м' - 221: 5, # 'н' - 222: 1, # 'о' - 223: 15, # 'п' - 224: 9, # 'р' - 225: 7, # 'с' - 226: 6, # 'т' - 227: 14, # 'у' - 228: 39, # 'ф' - 229: 26, # 'х' - 230: 28, # 'ц' - 231: 22, # 'ч' - 232: 25, # 'ш' - 233: 29, # 'щ' - 234: 54, # 'ъ' - 235: 18, # 'ы' - 236: 17, # 'ь' - 237: 30, # 'э' - 238: 27, # 'ю' - 239: 16, # 'я' - 240: 239, # '№' - 241: 68, # 'ё' - 242: 240, # 'ђ' - 243: 241, # 'ѓ' - 244: 242, # 'є' - 245: 243, # 'ѕ' - 246: 244, # 'і' - 247: 245, # 'ї' - 248: 246, # 'ј' - 249: 247, # 'љ' - 250: 248, # 'њ' - 251: 249, # 'ћ' - 252: 250, # 'ќ' - 253: 251, # '§' - 254: 252, # 'ў' - 255: 255, # 'џ' -} - -ISO_8859_5_RUSSIAN_MODEL = SingleByteCharSetModel( - charset_name="ISO-8859-5", - language="Russian", - char_to_order_map=ISO_8859_5_RUSSIAN_CHAR_TO_ORDER, - language_model=RUSSIAN_LANG_MODEL, - typical_positive_ratio=0.976601, - keep_ascii_letters=False, - alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё", -) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langthaimodel.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langthaimodel.py deleted file mode 100644 index 489cad9..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langthaimodel.py +++ /dev/null @@ -1,4380 +0,0 @@ -from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel - -# 3: Positive -# 2: Likely -# 1: Unlikely -# 0: Negative - -THAI_LANG_MODEL = { - 5: { # 'ก' - 5: 2, # 'ก' - 30: 2, # 'ข' - 24: 2, # 'ค' - 8: 2, # 'ง' - 26: 2, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'ญ' - 58: 3, # 'ฎ' - 57: 2, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 2, # 'ณ' - 20: 2, # 'ด' - 19: 3, # 'ต' - 44: 0, # 'ถ' - 14: 2, # 'ท' - 48: 0, # 'ธ' - 3: 2, # 'น' - 17: 1, # 'บ' - 25: 2, # 'ป' - 39: 1, # 'ผ' - 62: 1, # 'ฝ' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 1, # 'ภ' - 9: 2, # 'ม' - 16: 1, # 'ย' - 2: 3, # 'ร' - 61: 2, # 'ฤ' - 15: 3, # 'ล' - 12: 3, # 'ว' - 42: 2, # 'ศ' - 46: 3, # 'ษ' - 18: 2, # 'ส' - 21: 2, # 'ห' - 4: 3, # 'อ' - 63: 1, # 'ฯ' - 22: 2, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 3, # 'ำ' - 23: 3, # 'ิ' - 13: 3, # 'ี' - 40: 0, # 'ึ' - 27: 2, # 'ื' - 32: 2, # 'ุ' - 35: 1, # 'ู' - 11: 2, # 'เ' - 28: 2, # 'แ' - 41: 1, # 'โ' - 29: 1, # 'ใ' - 33: 2, # 'ไ' - 50: 1, # 'ๆ' - 37: 3, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 2, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 30: { # 'ข' - 5: 1, # 'ก' - 30: 0, # 'ข' - 24: 1, # 'ค' - 8: 1, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 2, # 'ณ' - 20: 0, # 'ด' - 19: 2, # 'ต' - 44: 0, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 2, # 'น' - 17: 1, # 'บ' - 25: 1, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 2, # 'ย' - 2: 1, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 2, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 1, # 'ห' - 4: 3, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 2, # 'ี' - 40: 3, # 'ึ' - 27: 1, # 'ื' - 32: 1, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 1, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 1, # '็' - 6: 2, # '่' - 7: 3, # '้' - 38: 1, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 24: { # 'ค' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 2, # 'ค' - 8: 2, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 2, # 'ณ' - 20: 2, # 'ด' - 19: 2, # 'ต' - 44: 0, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 0, # 'บ' - 25: 1, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 2, # 'ม' - 16: 2, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 3, # 'ล' - 12: 3, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 0, # 'ห' - 4: 2, # 'อ' - 63: 0, # 'ฯ' - 22: 2, # 'ะ' - 10: 3, # 'ั' - 1: 2, # 'า' - 36: 3, # 'ำ' - 23: 3, # 'ิ' - 13: 2, # 'ี' - 40: 0, # 'ึ' - 27: 3, # 'ื' - 32: 3, # 'ุ' - 35: 2, # 'ู' - 11: 1, # 'เ' - 28: 0, # 'แ' - 41: 3, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 1, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 3, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 8: { # 'ง' - 5: 3, # 'ก' - 30: 2, # 'ข' - 24: 3, # 'ค' - 8: 2, # 'ง' - 26: 2, # 'จ' - 52: 1, # 'ฉ' - 34: 2, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 2, # 'ด' - 19: 2, # 'ต' - 44: 1, # 'ถ' - 14: 3, # 'ท' - 48: 1, # 'ธ' - 3: 3, # 'น' - 17: 2, # 'บ' - 25: 2, # 'ป' - 39: 2, # 'ผ' - 62: 1, # 'ฝ' - 31: 2, # 'พ' - 54: 0, # 'ฟ' - 45: 1, # 'ภ' - 9: 2, # 'ม' - 16: 1, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 2, # 'ว' - 42: 2, # 'ศ' - 46: 1, # 'ษ' - 18: 3, # 'ส' - 21: 3, # 'ห' - 4: 2, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 1, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 2, # 'ิ' - 13: 1, # 'ี' - 40: 0, # 'ึ' - 27: 1, # 'ื' - 32: 1, # 'ุ' - 35: 0, # 'ู' - 11: 3, # 'เ' - 28: 2, # 'แ' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 2, # 'ไ' - 50: 3, # 'ๆ' - 37: 0, # '็' - 6: 2, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 26: { # 'จ' - 5: 2, # 'ก' - 30: 1, # 'ข' - 24: 0, # 'ค' - 8: 2, # 'ง' - 26: 3, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 2, # 'ด' - 19: 1, # 'ต' - 44: 1, # 'ถ' - 14: 2, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 1, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 1, # 'ม' - 16: 1, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 1, # 'ห' - 4: 2, # 'อ' - 63: 0, # 'ฯ' - 22: 3, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 3, # 'ำ' - 23: 2, # 'ิ' - 13: 1, # 'ี' - 40: 3, # 'ึ' - 27: 1, # 'ื' - 32: 3, # 'ุ' - 35: 2, # 'ู' - 11: 1, # 'เ' - 28: 1, # 'แ' - 41: 0, # 'โ' - 29: 1, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 2, # '่' - 7: 2, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 52: { # 'ฉ' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 3, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 3, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 1, # 'ม' - 16: 1, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 1, # 'ะ' - 10: 1, # 'ั' - 1: 1, # 'า' - 36: 0, # 'ำ' - 23: 1, # 'ิ' - 13: 1, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 1, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 34: { # 'ช' - 5: 1, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 1, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 1, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 2, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 2, # 'ม' - 16: 1, # 'ย' - 2: 1, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 2, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 2, # 'ั' - 1: 3, # 'า' - 36: 1, # 'ำ' - 23: 3, # 'ิ' - 13: 2, # 'ี' - 40: 0, # 'ึ' - 27: 3, # 'ื' - 32: 3, # 'ุ' - 35: 1, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 1, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 51: { # 'ซ' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 1, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 1, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 0, # 'ห' - 4: 2, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 1, # 'ั' - 1: 1, # 'า' - 36: 0, # 'ำ' - 23: 1, # 'ิ' - 13: 2, # 'ี' - 40: 3, # 'ึ' - 27: 2, # 'ื' - 32: 1, # 'ุ' - 35: 1, # 'ู' - 11: 1, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 1, # '็' - 6: 1, # '่' - 7: 2, # '้' - 38: 1, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 47: { # 'ญ' - 5: 1, # 'ก' - 30: 1, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 0, # 'ซ' - 47: 3, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 1, # 'บ' - 25: 1, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 1, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 1, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 2, # 'ห' - 4: 1, # 'อ' - 63: 0, # 'ฯ' - 22: 1, # 'ะ' - 10: 2, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 1, # 'ิ' - 13: 1, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 1, # 'เ' - 28: 1, # 'แ' - 41: 0, # 'โ' - 29: 1, # 'ใ' - 33: 0, # 'ไ' - 50: 1, # 'ๆ' - 37: 0, # '็' - 6: 2, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 58: { # 'ฎ' - 5: 2, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 1, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 1, # 'ิ' - 13: 2, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 57: { # 'ฏ' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 3, # 'ิ' - 13: 1, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 49: { # 'ฐ' - 5: 1, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 2, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 2, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 1, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 1, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 1, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 53: { # 'ฑ' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 2, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 3, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 55: { # 'ฒ' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 1, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 43: { # 'ณ' - 5: 1, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 3, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 3, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 1, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 1, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 3, # 'ะ' - 10: 0, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 1, # 'ิ' - 13: 2, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 1, # 'เ' - 28: 1, # 'แ' - 41: 0, # 'โ' - 29: 1, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 3, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 20: { # 'ด' - 5: 2, # 'ก' - 30: 2, # 'ข' - 24: 2, # 'ค' - 8: 3, # 'ง' - 26: 2, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 1, # 'ด' - 19: 2, # 'ต' - 44: 1, # 'ถ' - 14: 2, # 'ท' - 48: 0, # 'ธ' - 3: 1, # 'น' - 17: 1, # 'บ' - 25: 1, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'ฝ' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 1, # 'ภ' - 9: 2, # 'ม' - 16: 3, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 2, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 2, # 'ห' - 4: 1, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 3, # 'ั' - 1: 2, # 'า' - 36: 2, # 'ำ' - 23: 3, # 'ิ' - 13: 3, # 'ี' - 40: 1, # 'ึ' - 27: 2, # 'ื' - 32: 3, # 'ุ' - 35: 2, # 'ู' - 11: 2, # 'เ' - 28: 2, # 'แ' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 2, # 'ไ' - 50: 2, # 'ๆ' - 37: 2, # '็' - 6: 1, # '่' - 7: 3, # '้' - 38: 1, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 19: { # 'ต' - 5: 2, # 'ก' - 30: 1, # 'ข' - 24: 1, # 'ค' - 8: 0, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 1, # 'ด' - 19: 1, # 'ต' - 44: 2, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 2, # 'น' - 17: 1, # 'บ' - 25: 1, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'ฝ' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 2, # 'ภ' - 9: 1, # 'ม' - 16: 1, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 3, # 'ส' - 21: 0, # 'ห' - 4: 3, # 'อ' - 63: 1, # 'ฯ' - 22: 2, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 2, # 'ำ' - 23: 3, # 'ิ' - 13: 2, # 'ี' - 40: 1, # 'ึ' - 27: 1, # 'ื' - 32: 3, # 'ุ' - 35: 2, # 'ู' - 11: 1, # 'เ' - 28: 1, # 'แ' - 41: 1, # 'โ' - 29: 1, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 2, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 2, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 44: { # 'ถ' - 5: 1, # 'ก' - 30: 0, # 'ข' - 24: 1, # 'ค' - 8: 0, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 1, # 'ต' - 44: 0, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 1, # 'น' - 17: 2, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 1, # 'ร' - 61: 0, # 'ฤ' - 15: 1, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 0, # 'ห' - 4: 1, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 2, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 2, # 'ิ' - 13: 1, # 'ี' - 40: 3, # 'ึ' - 27: 2, # 'ื' - 32: 2, # 'ุ' - 35: 3, # 'ู' - 11: 1, # 'เ' - 28: 1, # 'แ' - 41: 0, # 'โ' - 29: 1, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 2, # '่' - 7: 3, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 14: { # 'ท' - 5: 1, # 'ก' - 30: 1, # 'ข' - 24: 3, # 'ค' - 8: 1, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 2, # 'ด' - 19: 1, # 'ต' - 44: 0, # 'ถ' - 14: 1, # 'ท' - 48: 3, # 'ธ' - 3: 3, # 'น' - 17: 2, # 'บ' - 25: 2, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'ฝ' - 31: 2, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 1, # 'ม' - 16: 3, # 'ย' - 2: 3, # 'ร' - 61: 1, # 'ฤ' - 15: 1, # 'ล' - 12: 2, # 'ว' - 42: 3, # 'ศ' - 46: 1, # 'ษ' - 18: 1, # 'ส' - 21: 0, # 'ห' - 4: 2, # 'อ' - 63: 0, # 'ฯ' - 22: 2, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 3, # 'ำ' - 23: 2, # 'ิ' - 13: 3, # 'ี' - 40: 2, # 'ึ' - 27: 1, # 'ื' - 32: 3, # 'ุ' - 35: 1, # 'ู' - 11: 0, # 'เ' - 28: 1, # 'แ' - 41: 0, # 'โ' - 29: 1, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 1, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 2, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 48: { # 'ธ' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 1, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 1, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 2, # 'า' - 36: 0, # 'ำ' - 23: 3, # 'ิ' - 13: 3, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 2, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 3, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 3: { # 'น' - 5: 3, # 'ก' - 30: 2, # 'ข' - 24: 3, # 'ค' - 8: 1, # 'ง' - 26: 2, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 1, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 3, # 'ด' - 19: 3, # 'ต' - 44: 2, # 'ถ' - 14: 3, # 'ท' - 48: 3, # 'ธ' - 3: 2, # 'น' - 17: 2, # 'บ' - 25: 2, # 'ป' - 39: 2, # 'ผ' - 62: 0, # 'ฝ' - 31: 2, # 'พ' - 54: 1, # 'ฟ' - 45: 1, # 'ภ' - 9: 2, # 'ม' - 16: 2, # 'ย' - 2: 2, # 'ร' - 61: 1, # 'ฤ' - 15: 2, # 'ล' - 12: 3, # 'ว' - 42: 1, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 2, # 'ห' - 4: 3, # 'อ' - 63: 1, # 'ฯ' - 22: 2, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 3, # 'ำ' - 23: 3, # 'ิ' - 13: 3, # 'ี' - 40: 3, # 'ึ' - 27: 3, # 'ื' - 32: 3, # 'ุ' - 35: 2, # 'ู' - 11: 3, # 'เ' - 28: 2, # 'แ' - 41: 3, # 'โ' - 29: 3, # 'ใ' - 33: 3, # 'ไ' - 50: 2, # 'ๆ' - 37: 1, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 2, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 17: { # 'บ' - 5: 3, # 'ก' - 30: 2, # 'ข' - 24: 2, # 'ค' - 8: 1, # 'ง' - 26: 1, # 'จ' - 52: 1, # 'ฉ' - 34: 1, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 1, # 'ด' - 19: 2, # 'ต' - 44: 1, # 'ถ' - 14: 3, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 3, # 'บ' - 25: 2, # 'ป' - 39: 2, # 'ผ' - 62: 0, # 'ฝ' - 31: 1, # 'พ' - 54: 1, # 'ฟ' - 45: 1, # 'ภ' - 9: 1, # 'ม' - 16: 0, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 3, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 2, # 'ห' - 4: 2, # 'อ' - 63: 1, # 'ฯ' - 22: 0, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 2, # 'ำ' - 23: 2, # 'ิ' - 13: 2, # 'ี' - 40: 0, # 'ึ' - 27: 2, # 'ื' - 32: 3, # 'ุ' - 35: 2, # 'ู' - 11: 2, # 'เ' - 28: 2, # 'แ' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 2, # 'ไ' - 50: 0, # 'ๆ' - 37: 1, # '็' - 6: 2, # '่' - 7: 2, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 25: { # 'ป' - 5: 2, # 'ก' - 30: 0, # 'ข' - 24: 1, # 'ค' - 8: 0, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'ญ' - 58: 1, # 'ฎ' - 57: 3, # 'ฏ' - 49: 1, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 1, # 'ด' - 19: 1, # 'ต' - 44: 1, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 2, # 'น' - 17: 0, # 'บ' - 25: 1, # 'ป' - 39: 1, # 'ผ' - 62: 1, # 'ฝ' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 1, # 'ม' - 16: 0, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 3, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 1, # 'ษ' - 18: 2, # 'ส' - 21: 1, # 'ห' - 4: 2, # 'อ' - 63: 0, # 'ฯ' - 22: 1, # 'ะ' - 10: 3, # 'ั' - 1: 1, # 'า' - 36: 0, # 'ำ' - 23: 2, # 'ิ' - 13: 3, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 1, # 'ุ' - 35: 0, # 'ู' - 11: 1, # 'เ' - 28: 2, # 'แ' - 41: 0, # 'โ' - 29: 1, # 'ใ' - 33: 2, # 'ไ' - 50: 0, # 'ๆ' - 37: 3, # '็' - 6: 1, # '่' - 7: 2, # '้' - 38: 1, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 39: { # 'ผ' - 5: 1, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 1, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 2, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 1, # 'ม' - 16: 2, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 3, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 1, # 'ะ' - 10: 1, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 2, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 1, # 'ื' - 32: 0, # 'ุ' - 35: 3, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 3, # '่' - 7: 1, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 62: { # 'ฝ' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 1, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 1, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 1, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 1, # 'ี' - 40: 2, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 2, # '่' - 7: 1, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 31: { # 'พ' - 5: 1, # 'ก' - 30: 1, # 'ข' - 24: 1, # 'ค' - 8: 1, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 1, # 'ณ' - 20: 1, # 'ด' - 19: 1, # 'ต' - 44: 0, # 'ถ' - 14: 2, # 'ท' - 48: 1, # 'ธ' - 3: 3, # 'น' - 17: 2, # 'บ' - 25: 0, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'ฝ' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 1, # 'ม' - 16: 2, # 'ย' - 2: 3, # 'ร' - 61: 2, # 'ฤ' - 15: 2, # 'ล' - 12: 2, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 1, # 'ห' - 4: 2, # 'อ' - 63: 1, # 'ฯ' - 22: 0, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 3, # 'ิ' - 13: 2, # 'ี' - 40: 1, # 'ึ' - 27: 3, # 'ื' - 32: 1, # 'ุ' - 35: 2, # 'ู' - 11: 1, # 'เ' - 28: 1, # 'แ' - 41: 0, # 'โ' - 29: 1, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 1, # '็' - 6: 0, # '่' - 7: 1, # '้' - 38: 3, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 54: { # 'ฟ' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 1, # 'ต' - 44: 0, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 2, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 1, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 0, # 'ห' - 4: 1, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 2, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 1, # 'ิ' - 13: 1, # 'ี' - 40: 0, # 'ึ' - 27: 1, # 'ื' - 32: 1, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 1, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 2, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 45: { # 'ภ' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 1, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 3, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 1, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 1, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 2, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 1, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 9: { # 'ม' - 5: 2, # 'ก' - 30: 2, # 'ข' - 24: 2, # 'ค' - 8: 2, # 'ง' - 26: 2, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 1, # 'ณ' - 20: 2, # 'ด' - 19: 2, # 'ต' - 44: 1, # 'ถ' - 14: 2, # 'ท' - 48: 1, # 'ธ' - 3: 3, # 'น' - 17: 2, # 'บ' - 25: 2, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'ฝ' - 31: 3, # 'พ' - 54: 0, # 'ฟ' - 45: 1, # 'ภ' - 9: 2, # 'ม' - 16: 1, # 'ย' - 2: 2, # 'ร' - 61: 2, # 'ฤ' - 15: 2, # 'ล' - 12: 2, # 'ว' - 42: 1, # 'ศ' - 46: 1, # 'ษ' - 18: 3, # 'ส' - 21: 3, # 'ห' - 4: 3, # 'อ' - 63: 0, # 'ฯ' - 22: 1, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 3, # 'ิ' - 13: 3, # 'ี' - 40: 0, # 'ึ' - 27: 3, # 'ื' - 32: 3, # 'ุ' - 35: 3, # 'ู' - 11: 2, # 'เ' - 28: 2, # 'แ' - 41: 2, # 'โ' - 29: 2, # 'ใ' - 33: 2, # 'ไ' - 50: 1, # 'ๆ' - 37: 1, # '็' - 6: 3, # '่' - 7: 2, # '้' - 38: 1, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 16: { # 'ย' - 5: 3, # 'ก' - 30: 1, # 'ข' - 24: 2, # 'ค' - 8: 3, # 'ง' - 26: 2, # 'จ' - 52: 0, # 'ฉ' - 34: 2, # 'ช' - 51: 0, # 'ซ' - 47: 2, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 2, # 'ด' - 19: 2, # 'ต' - 44: 1, # 'ถ' - 14: 2, # 'ท' - 48: 1, # 'ธ' - 3: 3, # 'น' - 17: 3, # 'บ' - 25: 1, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'ฝ' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 1, # 'ภ' - 9: 2, # 'ม' - 16: 0, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 1, # 'ล' - 12: 3, # 'ว' - 42: 1, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 1, # 'ห' - 4: 2, # 'อ' - 63: 0, # 'ฯ' - 22: 2, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 2, # 'ิ' - 13: 3, # 'ี' - 40: 1, # 'ึ' - 27: 2, # 'ื' - 32: 2, # 'ุ' - 35: 3, # 'ู' - 11: 2, # 'เ' - 28: 1, # 'แ' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 2, # 'ไ' - 50: 2, # 'ๆ' - 37: 1, # '็' - 6: 3, # '่' - 7: 2, # '้' - 38: 3, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 2: { # 'ร' - 5: 3, # 'ก' - 30: 2, # 'ข' - 24: 2, # 'ค' - 8: 3, # 'ง' - 26: 2, # 'จ' - 52: 0, # 'ฉ' - 34: 2, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 3, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 3, # 'ณ' - 20: 2, # 'ด' - 19: 2, # 'ต' - 44: 3, # 'ถ' - 14: 3, # 'ท' - 48: 1, # 'ธ' - 3: 2, # 'น' - 17: 2, # 'บ' - 25: 3, # 'ป' - 39: 2, # 'ผ' - 62: 1, # 'ฝ' - 31: 2, # 'พ' - 54: 1, # 'ฟ' - 45: 1, # 'ภ' - 9: 3, # 'ม' - 16: 2, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 3, # 'ว' - 42: 2, # 'ศ' - 46: 2, # 'ษ' - 18: 2, # 'ส' - 21: 2, # 'ห' - 4: 3, # 'อ' - 63: 1, # 'ฯ' - 22: 3, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 3, # 'ิ' - 13: 3, # 'ี' - 40: 2, # 'ึ' - 27: 3, # 'ื' - 32: 3, # 'ุ' - 35: 3, # 'ู' - 11: 3, # 'เ' - 28: 3, # 'แ' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 3, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 3, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 61: { # 'ฤ' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 2, # 'ต' - 44: 0, # 'ถ' - 14: 2, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 1, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 2, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 15: { # 'ล' - 5: 2, # 'ก' - 30: 3, # 'ข' - 24: 1, # 'ค' - 8: 3, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 2, # 'ด' - 19: 2, # 'ต' - 44: 1, # 'ถ' - 14: 2, # 'ท' - 48: 0, # 'ธ' - 3: 1, # 'น' - 17: 2, # 'บ' - 25: 2, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 1, # 'ภ' - 9: 1, # 'ม' - 16: 3, # 'ย' - 2: 1, # 'ร' - 61: 0, # 'ฤ' - 15: 1, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 1, # 'ห' - 4: 3, # 'อ' - 63: 2, # 'ฯ' - 22: 3, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 2, # 'ำ' - 23: 3, # 'ิ' - 13: 3, # 'ี' - 40: 2, # 'ึ' - 27: 3, # 'ื' - 32: 2, # 'ุ' - 35: 3, # 'ู' - 11: 2, # 'เ' - 28: 1, # 'แ' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 2, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 2, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 12: { # 'ว' - 5: 3, # 'ก' - 30: 2, # 'ข' - 24: 1, # 'ค' - 8: 3, # 'ง' - 26: 2, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 1, # 'ณ' - 20: 2, # 'ด' - 19: 1, # 'ต' - 44: 1, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 2, # 'บ' - 25: 1, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'ฝ' - 31: 1, # 'พ' - 54: 1, # 'ฟ' - 45: 0, # 'ภ' - 9: 3, # 'ม' - 16: 3, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 3, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 2, # 'ห' - 4: 2, # 'อ' - 63: 0, # 'ฯ' - 22: 2, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 3, # 'ิ' - 13: 2, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 2, # 'ุ' - 35: 0, # 'ู' - 11: 3, # 'เ' - 28: 2, # 'แ' - 41: 1, # 'โ' - 29: 1, # 'ใ' - 33: 2, # 'ไ' - 50: 1, # 'ๆ' - 37: 0, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 1, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 42: { # 'ศ' - 5: 1, # 'ก' - 30: 0, # 'ข' - 24: 1, # 'ค' - 8: 0, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 1, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 1, # 'ต' - 44: 0, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 2, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 2, # 'ว' - 42: 1, # 'ศ' - 46: 2, # 'ษ' - 18: 1, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 2, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 2, # 'ิ' - 13: 0, # 'ี' - 40: 3, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 2, # 'ู' - 11: 0, # 'เ' - 28: 1, # 'แ' - 41: 0, # 'โ' - 29: 1, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 1, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 46: { # 'ษ' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 2, # 'ฎ' - 57: 1, # 'ฏ' - 49: 2, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 3, # 'ณ' - 20: 0, # 'ด' - 19: 1, # 'ต' - 44: 0, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 1, # 'ภ' - 9: 1, # 'ม' - 16: 2, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 1, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 2, # 'ะ' - 10: 2, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 1, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 1, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 2, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 18: { # 'ส' - 5: 2, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 2, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 3, # 'ด' - 19: 3, # 'ต' - 44: 3, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 2, # 'บ' - 25: 1, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 2, # 'ภ' - 9: 3, # 'ม' - 16: 1, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 1, # 'ล' - 12: 2, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 2, # 'ห' - 4: 3, # 'อ' - 63: 0, # 'ฯ' - 22: 2, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 3, # 'ำ' - 23: 3, # 'ิ' - 13: 3, # 'ี' - 40: 2, # 'ึ' - 27: 3, # 'ื' - 32: 3, # 'ุ' - 35: 3, # 'ู' - 11: 2, # 'เ' - 28: 0, # 'แ' - 41: 1, # 'โ' - 29: 0, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 3, # '่' - 7: 1, # '้' - 38: 2, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 21: { # 'ห' - 5: 3, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 1, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 2, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 1, # 'ด' - 19: 3, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 0, # 'บ' - 25: 1, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 3, # 'ม' - 16: 2, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 3, # 'ล' - 12: 2, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 3, # 'อ' - 63: 0, # 'ฯ' - 22: 1, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 1, # 'ิ' - 13: 1, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 1, # 'ุ' - 35: 1, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 3, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 2, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 4: { # 'อ' - 5: 3, # 'ก' - 30: 1, # 'ข' - 24: 2, # 'ค' - 8: 3, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 3, # 'ด' - 19: 2, # 'ต' - 44: 1, # 'ถ' - 14: 2, # 'ท' - 48: 1, # 'ธ' - 3: 3, # 'น' - 17: 3, # 'บ' - 25: 1, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'ฝ' - 31: 1, # 'พ' - 54: 1, # 'ฟ' - 45: 1, # 'ภ' - 9: 3, # 'ม' - 16: 3, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 2, # 'ว' - 42: 1, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 2, # 'ห' - 4: 3, # 'อ' - 63: 0, # 'ฯ' - 22: 2, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 2, # 'ำ' - 23: 2, # 'ิ' - 13: 3, # 'ี' - 40: 0, # 'ึ' - 27: 3, # 'ื' - 32: 3, # 'ุ' - 35: 0, # 'ู' - 11: 3, # 'เ' - 28: 1, # 'แ' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 2, # 'ไ' - 50: 1, # 'ๆ' - 37: 1, # '็' - 6: 2, # '่' - 7: 2, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 63: { # 'ฯ' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 22: { # 'ะ' - 5: 3, # 'ก' - 30: 1, # 'ข' - 24: 2, # 'ค' - 8: 1, # 'ง' - 26: 2, # 'จ' - 52: 0, # 'ฉ' - 34: 3, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 3, # 'ด' - 19: 3, # 'ต' - 44: 1, # 'ถ' - 14: 3, # 'ท' - 48: 1, # 'ธ' - 3: 2, # 'น' - 17: 3, # 'บ' - 25: 2, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'ฝ' - 31: 2, # 'พ' - 54: 0, # 'ฟ' - 45: 1, # 'ภ' - 9: 3, # 'ม' - 16: 2, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 2, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 3, # 'ส' - 21: 3, # 'ห' - 4: 2, # 'อ' - 63: 1, # 'ฯ' - 22: 1, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 3, # 'เ' - 28: 2, # 'แ' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 2, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 10: { # 'ั' - 5: 3, # 'ก' - 30: 0, # 'ข' - 24: 1, # 'ค' - 8: 3, # 'ง' - 26: 3, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 0, # 'ซ' - 47: 3, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 2, # 'ฐ' - 53: 0, # 'ฑ' - 55: 3, # 'ฒ' - 43: 3, # 'ณ' - 20: 3, # 'ด' - 19: 3, # 'ต' - 44: 0, # 'ถ' - 14: 2, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 3, # 'บ' - 25: 1, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 2, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 3, # 'ม' - 16: 3, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 3, # 'ว' - 42: 2, # 'ศ' - 46: 0, # 'ษ' - 18: 3, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 1: { # 'า' - 5: 3, # 'ก' - 30: 2, # 'ข' - 24: 3, # 'ค' - 8: 3, # 'ง' - 26: 3, # 'จ' - 52: 0, # 'ฉ' - 34: 3, # 'ช' - 51: 1, # 'ซ' - 47: 2, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 3, # 'ณ' - 20: 3, # 'ด' - 19: 3, # 'ต' - 44: 1, # 'ถ' - 14: 3, # 'ท' - 48: 2, # 'ธ' - 3: 3, # 'น' - 17: 3, # 'บ' - 25: 2, # 'ป' - 39: 1, # 'ผ' - 62: 1, # 'ฝ' - 31: 3, # 'พ' - 54: 1, # 'ฟ' - 45: 1, # 'ภ' - 9: 3, # 'ม' - 16: 3, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 3, # 'ล' - 12: 3, # 'ว' - 42: 2, # 'ศ' - 46: 3, # 'ษ' - 18: 3, # 'ส' - 21: 3, # 'ห' - 4: 2, # 'อ' - 63: 1, # 'ฯ' - 22: 3, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 3, # 'เ' - 28: 2, # 'แ' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 2, # 'ไ' - 50: 1, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 36: { # 'ำ' - 5: 2, # 'ก' - 30: 1, # 'ข' - 24: 3, # 'ค' - 8: 2, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 1, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 1, # 'ด' - 19: 1, # 'ต' - 44: 1, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 1, # 'บ' - 25: 1, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'ฝ' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 1, # 'ภ' - 9: 1, # 'ม' - 16: 0, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 3, # 'ห' - 4: 1, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 3, # 'เ' - 28: 2, # 'แ' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 2, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 23: { # 'ิ' - 5: 3, # 'ก' - 30: 1, # 'ข' - 24: 2, # 'ค' - 8: 3, # 'ง' - 26: 3, # 'จ' - 52: 0, # 'ฉ' - 34: 3, # 'ช' - 51: 0, # 'ซ' - 47: 2, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 3, # 'ด' - 19: 3, # 'ต' - 44: 1, # 'ถ' - 14: 3, # 'ท' - 48: 3, # 'ธ' - 3: 3, # 'น' - 17: 3, # 'บ' - 25: 2, # 'ป' - 39: 2, # 'ผ' - 62: 0, # 'ฝ' - 31: 3, # 'พ' - 54: 1, # 'ฟ' - 45: 2, # 'ภ' - 9: 3, # 'ม' - 16: 2, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 3, # 'ว' - 42: 3, # 'ศ' - 46: 2, # 'ษ' - 18: 2, # 'ส' - 21: 3, # 'ห' - 4: 1, # 'อ' - 63: 1, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 3, # 'เ' - 28: 1, # 'แ' - 41: 1, # 'โ' - 29: 1, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 3, # '่' - 7: 2, # '้' - 38: 2, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 13: { # 'ี' - 5: 3, # 'ก' - 30: 2, # 'ข' - 24: 2, # 'ค' - 8: 0, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 2, # 'ด' - 19: 1, # 'ต' - 44: 0, # 'ถ' - 14: 2, # 'ท' - 48: 0, # 'ธ' - 3: 1, # 'น' - 17: 2, # 'บ' - 25: 2, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'ฝ' - 31: 2, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 2, # 'ม' - 16: 3, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 1, # 'ล' - 12: 2, # 'ว' - 42: 1, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 1, # 'ห' - 4: 2, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 2, # 'เ' - 28: 2, # 'แ' - 41: 1, # 'โ' - 29: 1, # 'ใ' - 33: 1, # 'ไ' - 50: 1, # 'ๆ' - 37: 0, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 40: { # 'ึ' - 5: 3, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 3, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 1, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 1, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 27: { # 'ื' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 1, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 2, # 'น' - 17: 3, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 2, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 3, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 32: { # 'ุ' - 5: 3, # 'ก' - 30: 2, # 'ข' - 24: 3, # 'ค' - 8: 3, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 2, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 1, # 'ฒ' - 43: 3, # 'ณ' - 20: 3, # 'ด' - 19: 3, # 'ต' - 44: 1, # 'ถ' - 14: 2, # 'ท' - 48: 1, # 'ธ' - 3: 2, # 'น' - 17: 2, # 'บ' - 25: 2, # 'ป' - 39: 2, # 'ผ' - 62: 0, # 'ฝ' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 1, # 'ภ' - 9: 3, # 'ม' - 16: 1, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 1, # 'ว' - 42: 1, # 'ศ' - 46: 2, # 'ษ' - 18: 1, # 'ส' - 21: 1, # 'ห' - 4: 1, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 1, # 'เ' - 28: 0, # 'แ' - 41: 1, # 'โ' - 29: 0, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 3, # '่' - 7: 2, # '้' - 38: 1, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 35: { # 'ู' - 5: 3, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 2, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 2, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 1, # 'ณ' - 20: 2, # 'ด' - 19: 2, # 'ต' - 44: 0, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 2, # 'น' - 17: 0, # 'บ' - 25: 3, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 2, # 'ม' - 16: 0, # 'ย' - 2: 1, # 'ร' - 61: 0, # 'ฤ' - 15: 3, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 1, # 'เ' - 28: 1, # 'แ' - 41: 1, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 11: { # 'เ' - 5: 3, # 'ก' - 30: 3, # 'ข' - 24: 3, # 'ค' - 8: 2, # 'ง' - 26: 3, # 'จ' - 52: 3, # 'ฉ' - 34: 3, # 'ช' - 51: 2, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 1, # 'ณ' - 20: 3, # 'ด' - 19: 3, # 'ต' - 44: 1, # 'ถ' - 14: 3, # 'ท' - 48: 1, # 'ธ' - 3: 3, # 'น' - 17: 3, # 'บ' - 25: 3, # 'ป' - 39: 2, # 'ผ' - 62: 1, # 'ฝ' - 31: 3, # 'พ' - 54: 1, # 'ฟ' - 45: 3, # 'ภ' - 9: 3, # 'ม' - 16: 2, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 3, # 'ล' - 12: 3, # 'ว' - 42: 2, # 'ศ' - 46: 0, # 'ษ' - 18: 3, # 'ส' - 21: 3, # 'ห' - 4: 3, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 28: { # 'แ' - 5: 3, # 'ก' - 30: 2, # 'ข' - 24: 2, # 'ค' - 8: 1, # 'ง' - 26: 2, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 2, # 'ด' - 19: 3, # 'ต' - 44: 2, # 'ถ' - 14: 3, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 3, # 'บ' - 25: 2, # 'ป' - 39: 3, # 'ผ' - 62: 0, # 'ฝ' - 31: 2, # 'พ' - 54: 2, # 'ฟ' - 45: 0, # 'ภ' - 9: 2, # 'ม' - 16: 2, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 3, # 'ล' - 12: 2, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 3, # 'ส' - 21: 3, # 'ห' - 4: 1, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 41: { # 'โ' - 5: 2, # 'ก' - 30: 1, # 'ข' - 24: 2, # 'ค' - 8: 0, # 'ง' - 26: 1, # 'จ' - 52: 1, # 'ฉ' - 34: 1, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 3, # 'ด' - 19: 2, # 'ต' - 44: 0, # 'ถ' - 14: 2, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 1, # 'บ' - 25: 3, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 1, # 'พ' - 54: 1, # 'ฟ' - 45: 1, # 'ภ' - 9: 1, # 'ม' - 16: 2, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 3, # 'ล' - 12: 0, # 'ว' - 42: 1, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 0, # 'ห' - 4: 2, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 29: { # 'ใ' - 5: 2, # 'ก' - 30: 0, # 'ข' - 24: 1, # 'ค' - 8: 0, # 'ง' - 26: 3, # 'จ' - 52: 0, # 'ฉ' - 34: 3, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 3, # 'ด' - 19: 1, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 2, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 1, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 3, # 'ส' - 21: 3, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 33: { # 'ไ' - 5: 1, # 'ก' - 30: 2, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 3, # 'ด' - 19: 1, # 'ต' - 44: 0, # 'ถ' - 14: 3, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 1, # 'บ' - 25: 3, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 2, # 'ฟ' - 45: 0, # 'ภ' - 9: 3, # 'ม' - 16: 0, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 1, # 'ล' - 12: 3, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 2, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 50: { # 'ๆ' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 37: { # '็' - 5: 2, # 'ก' - 30: 1, # 'ข' - 24: 2, # 'ค' - 8: 2, # 'ง' - 26: 3, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 1, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 1, # 'ด' - 19: 2, # 'ต' - 44: 0, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 3, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 2, # 'ม' - 16: 1, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 2, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 0, # 'ห' - 4: 1, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 1, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 6: { # '่' - 5: 2, # 'ก' - 30: 1, # 'ข' - 24: 2, # 'ค' - 8: 3, # 'ง' - 26: 2, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 1, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 1, # 'ด' - 19: 2, # 'ต' - 44: 1, # 'ถ' - 14: 2, # 'ท' - 48: 1, # 'ธ' - 3: 3, # 'น' - 17: 1, # 'บ' - 25: 2, # 'ป' - 39: 2, # 'ผ' - 62: 1, # 'ฝ' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 3, # 'ม' - 16: 3, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 3, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 1, # 'ห' - 4: 3, # 'อ' - 63: 0, # 'ฯ' - 22: 1, # 'ะ' - 10: 0, # 'ั' - 1: 3, # 'า' - 36: 2, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 3, # 'เ' - 28: 2, # 'แ' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 2, # 'ไ' - 50: 1, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 7: { # '้' - 5: 2, # 'ก' - 30: 1, # 'ข' - 24: 2, # 'ค' - 8: 3, # 'ง' - 26: 2, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 1, # 'ด' - 19: 2, # 'ต' - 44: 1, # 'ถ' - 14: 2, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 2, # 'บ' - 25: 2, # 'ป' - 39: 2, # 'ผ' - 62: 0, # 'ฝ' - 31: 1, # 'พ' - 54: 1, # 'ฟ' - 45: 0, # 'ภ' - 9: 3, # 'ม' - 16: 2, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 1, # 'ล' - 12: 3, # 'ว' - 42: 1, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 2, # 'ห' - 4: 3, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 3, # 'า' - 36: 2, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 2, # 'เ' - 28: 2, # 'แ' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 2, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 38: { # '์' - 5: 2, # 'ก' - 30: 1, # 'ข' - 24: 1, # 'ค' - 8: 0, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 2, # 'ด' - 19: 1, # 'ต' - 44: 1, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 1, # 'น' - 17: 1, # 'บ' - 25: 1, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 1, # 'พ' - 54: 1, # 'ฟ' - 45: 0, # 'ภ' - 9: 2, # 'ม' - 16: 0, # 'ย' - 2: 1, # 'ร' - 61: 1, # 'ฤ' - 15: 1, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 1, # 'ห' - 4: 2, # 'อ' - 63: 1, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 2, # 'เ' - 28: 2, # 'แ' - 41: 1, # 'โ' - 29: 1, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 56: { # '๑' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 2, # '๑' - 59: 1, # '๒' - 60: 1, # '๕' - }, - 59: { # '๒' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 1, # '๑' - 59: 1, # '๒' - 60: 3, # '๕' - }, - 60: { # '๕' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 2, # '๑' - 59: 1, # '๒' - 60: 0, # '๕' - }, -} - -# 255: Undefined characters that did not exist in training text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 -# 251: Control characters - -# Character Mapping Table(s): -TIS_620_THAI_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 182, # 'A' - 66: 106, # 'B' - 67: 107, # 'C' - 68: 100, # 'D' - 69: 183, # 'E' - 70: 184, # 'F' - 71: 185, # 'G' - 72: 101, # 'H' - 73: 94, # 'I' - 74: 186, # 'J' - 75: 187, # 'K' - 76: 108, # 'L' - 77: 109, # 'M' - 78: 110, # 'N' - 79: 111, # 'O' - 80: 188, # 'P' - 81: 189, # 'Q' - 82: 190, # 'R' - 83: 89, # 'S' - 84: 95, # 'T' - 85: 112, # 'U' - 86: 113, # 'V' - 87: 191, # 'W' - 88: 192, # 'X' - 89: 193, # 'Y' - 90: 194, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 64, # 'a' - 98: 72, # 'b' - 99: 73, # 'c' - 100: 114, # 'd' - 101: 74, # 'e' - 102: 115, # 'f' - 103: 116, # 'g' - 104: 102, # 'h' - 105: 81, # 'i' - 106: 201, # 'j' - 107: 117, # 'k' - 108: 90, # 'l' - 109: 103, # 'm' - 110: 78, # 'n' - 111: 82, # 'o' - 112: 96, # 'p' - 113: 202, # 'q' - 114: 91, # 'r' - 115: 79, # 's' - 116: 84, # 't' - 117: 104, # 'u' - 118: 105, # 'v' - 119: 97, # 'w' - 120: 98, # 'x' - 121: 92, # 'y' - 122: 203, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 209, # '\x80' - 129: 210, # '\x81' - 130: 211, # '\x82' - 131: 212, # '\x83' - 132: 213, # '\x84' - 133: 88, # '\x85' - 134: 214, # '\x86' - 135: 215, # '\x87' - 136: 216, # '\x88' - 137: 217, # '\x89' - 138: 218, # '\x8a' - 139: 219, # '\x8b' - 140: 220, # '\x8c' - 141: 118, # '\x8d' - 142: 221, # '\x8e' - 143: 222, # '\x8f' - 144: 223, # '\x90' - 145: 224, # '\x91' - 146: 99, # '\x92' - 147: 85, # '\x93' - 148: 83, # '\x94' - 149: 225, # '\x95' - 150: 226, # '\x96' - 151: 227, # '\x97' - 152: 228, # '\x98' - 153: 229, # '\x99' - 154: 230, # '\x9a' - 155: 231, # '\x9b' - 156: 232, # '\x9c' - 157: 233, # '\x9d' - 158: 234, # '\x9e' - 159: 235, # '\x9f' - 160: 236, # None - 161: 5, # 'ก' - 162: 30, # 'ข' - 163: 237, # 'ฃ' - 164: 24, # 'ค' - 165: 238, # 'ฅ' - 166: 75, # 'ฆ' - 167: 8, # 'ง' - 168: 26, # 'จ' - 169: 52, # 'ฉ' - 170: 34, # 'ช' - 171: 51, # 'ซ' - 172: 119, # 'ฌ' - 173: 47, # 'ญ' - 174: 58, # 'ฎ' - 175: 57, # 'ฏ' - 176: 49, # 'ฐ' - 177: 53, # 'ฑ' - 178: 55, # 'ฒ' - 179: 43, # 'ณ' - 180: 20, # 'ด' - 181: 19, # 'ต' - 182: 44, # 'ถ' - 183: 14, # 'ท' - 184: 48, # 'ธ' - 185: 3, # 'น' - 186: 17, # 'บ' - 187: 25, # 'ป' - 188: 39, # 'ผ' - 189: 62, # 'ฝ' - 190: 31, # 'พ' - 191: 54, # 'ฟ' - 192: 45, # 'ภ' - 193: 9, # 'ม' - 194: 16, # 'ย' - 195: 2, # 'ร' - 196: 61, # 'ฤ' - 197: 15, # 'ล' - 198: 239, # 'ฦ' - 199: 12, # 'ว' - 200: 42, # 'ศ' - 201: 46, # 'ษ' - 202: 18, # 'ส' - 203: 21, # 'ห' - 204: 76, # 'ฬ' - 205: 4, # 'อ' - 206: 66, # 'ฮ' - 207: 63, # 'ฯ' - 208: 22, # 'ะ' - 209: 10, # 'ั' - 210: 1, # 'า' - 211: 36, # 'ำ' - 212: 23, # 'ิ' - 213: 13, # 'ี' - 214: 40, # 'ึ' - 215: 27, # 'ื' - 216: 32, # 'ุ' - 217: 35, # 'ู' - 218: 86, # 'ฺ' - 219: 240, # None - 220: 241, # None - 221: 242, # None - 222: 243, # None - 223: 244, # '฿' - 224: 11, # 'เ' - 225: 28, # 'แ' - 226: 41, # 'โ' - 227: 29, # 'ใ' - 228: 33, # 'ไ' - 229: 245, # 'ๅ' - 230: 50, # 'ๆ' - 231: 37, # '็' - 232: 6, # '่' - 233: 7, # '้' - 234: 67, # '๊' - 235: 77, # '๋' - 236: 38, # '์' - 237: 93, # 'ํ' - 238: 246, # '๎' - 239: 247, # '๏' - 240: 68, # '๐' - 241: 56, # '๑' - 242: 59, # '๒' - 243: 65, # '๓' - 244: 69, # '๔' - 245: 60, # '๕' - 246: 70, # '๖' - 247: 80, # '๗' - 248: 71, # '๘' - 249: 87, # '๙' - 250: 248, # '๚' - 251: 249, # '๛' - 252: 250, # None - 253: 251, # None - 254: 252, # None - 255: 253, # None -} - -TIS_620_THAI_MODEL = SingleByteCharSetModel( - charset_name="TIS-620", - language="Thai", - char_to_order_map=TIS_620_THAI_CHAR_TO_ORDER, - language_model=THAI_LANG_MODEL, - typical_positive_ratio=0.926386, - keep_ascii_letters=False, - alphabet="กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛", -) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langturkishmodel.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langturkishmodel.py deleted file mode 100644 index 291857c..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langturkishmodel.py +++ /dev/null @@ -1,4380 +0,0 @@ -from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel - -# 3: Positive -# 2: Likely -# 1: Unlikely -# 0: Negative - -TURKISH_LANG_MODEL = { - 23: { # 'A' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 0, # 'c' - 12: 2, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 1, # 'g' - 25: 1, # 'h' - 3: 1, # 'i' - 24: 0, # 'j' - 10: 2, # 'k' - 5: 1, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 1, # 'r' - 8: 1, # 's' - 9: 1, # 't' - 14: 1, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 3, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 0, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 37: { # 'B' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 2, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 2, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 1, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 1, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 0, # 'Z' - 1: 2, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 0, # 'k' - 5: 0, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 2, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 1, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 1, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 0, # 'ı' - 40: 1, # 'Ş' - 19: 1, # 'ş' - }, - 47: { # 'C' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 1, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 1, # 'L' - 20: 0, # 'M' - 46: 1, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 1, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 2, # 'j' - 10: 1, # 'k' - 5: 2, # 'l' - 13: 2, # 'm' - 4: 2, # 'n' - 15: 1, # 'o' - 26: 0, # 'p' - 7: 2, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 1, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ğ' - 41: 1, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 39: { # 'D' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 1, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 1, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 2, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 2, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 0, # 'k' - 5: 1, # 'l' - 13: 3, # 'm' - 4: 0, # 'n' - 15: 1, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 1, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 1, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ğ' - 41: 0, # 'İ' - 6: 1, # 'ı' - 40: 1, # 'Ş' - 19: 0, # 'ş' - }, - 29: { # 'E' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 1, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 0, # 'c' - 12: 2, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 1, # 'g' - 25: 0, # 'h' - 3: 1, # 'i' - 24: 1, # 'j' - 10: 0, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 1, # 's' - 9: 1, # 't' - 14: 1, # 'u' - 32: 1, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 2, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 52: { # 'F' - 23: 0, # 'A' - 37: 1, # 'B' - 47: 1, # 'C' - 39: 1, # 'D' - 29: 1, # 'E' - 52: 2, # 'F' - 36: 0, # 'G' - 45: 2, # 'H' - 53: 1, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 1, # 'N' - 42: 1, # 'O' - 48: 2, # 'P' - 44: 1, # 'R' - 35: 1, # 'S' - 31: 1, # 'T' - 51: 1, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 2, # 'Y' - 56: 0, # 'Z' - 1: 0, # 'a' - 21: 1, # 'b' - 28: 1, # 'c' - 12: 1, # 'd' - 2: 0, # 'e' - 18: 1, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 2, # 'i' - 24: 1, # 'j' - 10: 0, # 'k' - 5: 0, # 'l' - 13: 1, # 'm' - 4: 2, # 'n' - 15: 1, # 'o' - 26: 0, # 'p' - 7: 2, # 'r' - 8: 1, # 's' - 9: 1, # 't' - 14: 1, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 1, # 'y' - 22: 1, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 1, # 'Ö' - 55: 2, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 2, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ğ' - 41: 1, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Ş' - 19: 2, # 'ş' - }, - 36: { # 'G' - 23: 1, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 1, # 'F' - 36: 2, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 2, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 2, # 'N' - 42: 1, # 'O' - 48: 1, # 'P' - 44: 1, # 'R' - 35: 1, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 2, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 1, # 'c' - 12: 0, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 1, # 'j' - 10: 1, # 'k' - 5: 0, # 'l' - 13: 3, # 'm' - 4: 2, # 'n' - 15: 0, # 'o' - 26: 1, # 'p' - 7: 0, # 'r' - 8: 1, # 's' - 9: 1, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 1, # 'x' - 11: 0, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 2, # 'Ö' - 55: 0, # 'Ü' - 59: 1, # 'â' - 33: 2, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ğ' - 41: 1, # 'İ' - 6: 2, # 'ı' - 40: 2, # 'Ş' - 19: 1, # 'ş' - }, - 45: { # 'H' - 23: 0, # 'A' - 37: 1, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 2, # 'F' - 36: 2, # 'G' - 45: 1, # 'H' - 53: 1, # 'I' - 60: 0, # 'J' - 16: 2, # 'K' - 49: 1, # 'L' - 20: 0, # 'M' - 46: 1, # 'N' - 42: 1, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 2, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 2, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 2, # 'i' - 24: 0, # 'j' - 10: 1, # 'k' - 5: 0, # 'l' - 13: 2, # 'm' - 4: 0, # 'n' - 15: 1, # 'o' - 26: 1, # 'p' - 7: 1, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 1, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 2, # 'ğ' - 41: 1, # 'İ' - 6: 0, # 'ı' - 40: 2, # 'Ş' - 19: 1, # 'ş' - }, - 53: { # 'I' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 1, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 2, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 2, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 2, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 0, # 'k' - 5: 2, # 'l' - 13: 2, # 'm' - 4: 0, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 2, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 2, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 0, # 'ı' - 40: 1, # 'Ş' - 19: 1, # 'ş' - }, - 60: { # 'J' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 0, # 'a' - 21: 1, # 'b' - 28: 0, # 'c' - 12: 1, # 'd' - 2: 0, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 1, # 'i' - 24: 0, # 'j' - 10: 0, # 'k' - 5: 0, # 'l' - 13: 0, # 'm' - 4: 1, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 1, # 's' - 9: 0, # 't' - 14: 0, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 0, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 16: { # 'K' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 3, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 2, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 2, # 'a' - 21: 3, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 1, # 'e' - 18: 3, # 'f' - 27: 3, # 'g' - 25: 3, # 'h' - 3: 3, # 'i' - 24: 2, # 'j' - 10: 3, # 'k' - 5: 0, # 'l' - 13: 0, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 1, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 0, # 'u' - 32: 3, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 2, # 'y' - 22: 1, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 2, # 'ü' - 30: 0, # 'ğ' - 41: 1, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 49: { # 'L' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 2, # 'E' - 52: 0, # 'F' - 36: 1, # 'G' - 45: 1, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 0, # 'N' - 42: 2, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 0, # 'Z' - 1: 0, # 'a' - 21: 3, # 'b' - 28: 0, # 'c' - 12: 2, # 'd' - 2: 0, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 2, # 'i' - 24: 0, # 'j' - 10: 1, # 'k' - 5: 0, # 'l' - 13: 0, # 'm' - 4: 2, # 'n' - 15: 1, # 'o' - 26: 1, # 'p' - 7: 1, # 'r' - 8: 1, # 's' - 9: 1, # 't' - 14: 0, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 2, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 2, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 1, # 'ü' - 30: 1, # 'ğ' - 41: 0, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 20: { # 'M' - 23: 1, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 1, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 1, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 2, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 1, # 'g' - 25: 1, # 'h' - 3: 2, # 'i' - 24: 2, # 'j' - 10: 2, # 'k' - 5: 2, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 1, # 'p' - 7: 3, # 'r' - 8: 0, # 's' - 9: 2, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 2, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 3, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 46: { # 'N' - 23: 0, # 'A' - 37: 1, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 1, # 'F' - 36: 1, # 'G' - 45: 1, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 2, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 1, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 1, # 'R' - 35: 1, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 2, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 1, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 2, # 'j' - 10: 1, # 'k' - 5: 1, # 'l' - 13: 3, # 'm' - 4: 2, # 'n' - 15: 1, # 'o' - 26: 1, # 'p' - 7: 1, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 1, # 'x' - 11: 1, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 1, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ğ' - 41: 1, # 'İ' - 6: 2, # 'ı' - 40: 1, # 'Ş' - 19: 1, # 'ş' - }, - 42: { # 'O' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 1, # 'F' - 36: 0, # 'G' - 45: 1, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 2, # 'K' - 49: 1, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 2, # 'P' - 44: 1, # 'R' - 35: 1, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 2, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 0, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 0, # 'n' - 15: 1, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 2, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 2, # 'Ç' - 50: 1, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 2, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ğ' - 41: 2, # 'İ' - 6: 1, # 'ı' - 40: 1, # 'Ş' - 19: 1, # 'ş' - }, - 48: { # 'P' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 2, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 2, # 'F' - 36: 1, # 'G' - 45: 1, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 2, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 1, # 'N' - 42: 1, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 1, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 2, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 1, # 'k' - 5: 0, # 'l' - 13: 2, # 'm' - 4: 0, # 'n' - 15: 2, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 2, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 2, # 'x' - 11: 0, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 2, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 2, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ğ' - 41: 1, # 'İ' - 6: 0, # 'ı' - 40: 2, # 'Ş' - 19: 1, # 'ş' - }, - 44: { # 'R' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 1, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 1, # 'b' - 28: 1, # 'c' - 12: 0, # 'd' - 2: 2, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 1, # 'k' - 5: 2, # 'l' - 13: 2, # 'm' - 4: 0, # 'n' - 15: 1, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 2, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 1, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 1, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 1, # 'ü' - 30: 1, # 'ğ' - 41: 0, # 'İ' - 6: 2, # 'ı' - 40: 1, # 'Ş' - 19: 1, # 'ş' - }, - 35: { # 'S' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 1, # 'F' - 36: 1, # 'G' - 45: 1, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 1, # 'L' - 20: 1, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 1, # 'k' - 5: 1, # 'l' - 13: 2, # 'm' - 4: 1, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 1, # 't' - 14: 2, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 1, # 'z' - 63: 0, # '·' - 54: 2, # 'Ç' - 50: 2, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 3, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 2, # 'Ş' - 19: 1, # 'ş' - }, - 31: { # 'T' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 1, # 'J' - 16: 2, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 2, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 2, # 'b' - 28: 0, # 'c' - 12: 1, # 'd' - 2: 3, # 'e' - 18: 2, # 'f' - 27: 2, # 'g' - 25: 0, # 'h' - 3: 1, # 'i' - 24: 1, # 'j' - 10: 2, # 'k' - 5: 2, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 2, # 'p' - 7: 2, # 'r' - 8: 0, # 's' - 9: 2, # 't' - 14: 2, # 'u' - 32: 1, # 'v' - 57: 1, # 'w' - 58: 1, # 'x' - 11: 2, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 1, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 51: { # 'U' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 1, # 'F' - 36: 1, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 1, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 1, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 1, # 'c' - 12: 0, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 2, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 1, # 'k' - 5: 1, # 'l' - 13: 3, # 'm' - 4: 2, # 'n' - 15: 0, # 'o' - 26: 1, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 2, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 1, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ğ' - 41: 1, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Ş' - 19: 1, # 'ş' - }, - 38: { # 'V' - 23: 1, # 'A' - 37: 1, # 'B' - 47: 1, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 2, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 3, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 1, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 0, # 'k' - 5: 2, # 'l' - 13: 2, # 'm' - 4: 0, # 'n' - 15: 2, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 1, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 1, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 1, # 'Ö' - 55: 0, # 'Ü' - 59: 1, # 'â' - 33: 2, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ğ' - 41: 1, # 'İ' - 6: 3, # 'ı' - 40: 2, # 'Ş' - 19: 1, # 'ş' - }, - 62: { # 'W' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 0, # 'a' - 21: 0, # 'b' - 28: 0, # 'c' - 12: 0, # 'd' - 2: 0, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 0, # 'k' - 5: 0, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 0, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 0, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 43: { # 'Y' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 2, # 'F' - 36: 0, # 'G' - 45: 1, # 'H' - 53: 1, # 'I' - 60: 0, # 'J' - 16: 2, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 2, # 'N' - 42: 0, # 'O' - 48: 2, # 'P' - 44: 1, # 'R' - 35: 1, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 2, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 2, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 1, # 'j' - 10: 1, # 'k' - 5: 1, # 'l' - 13: 3, # 'm' - 4: 0, # 'n' - 15: 2, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 1, # 'x' - 11: 0, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 2, # 'Ö' - 55: 1, # 'Ü' - 59: 1, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ğ' - 41: 1, # 'İ' - 6: 0, # 'ı' - 40: 2, # 'Ş' - 19: 1, # 'ş' - }, - 56: { # 'Z' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 2, # 'Z' - 1: 2, # 'a' - 21: 1, # 'b' - 28: 0, # 'c' - 12: 0, # 'd' - 2: 2, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 2, # 'i' - 24: 1, # 'j' - 10: 0, # 'k' - 5: 0, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 1, # 'r' - 8: 1, # 's' - 9: 0, # 't' - 14: 2, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 1, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 1, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 1: { # 'a' - 23: 3, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 0, # 'D' - 29: 3, # 'E' - 52: 0, # 'F' - 36: 1, # 'G' - 45: 1, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 3, # 'M' - 46: 1, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 3, # 'T' - 51: 0, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 2, # 'Z' - 1: 2, # 'a' - 21: 3, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 2, # 'e' - 18: 3, # 'f' - 27: 3, # 'g' - 25: 3, # 'h' - 3: 3, # 'i' - 24: 3, # 'j' - 10: 3, # 'k' - 5: 0, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 15: 1, # 'o' - 26: 3, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 3, # 'u' - 32: 3, # 'v' - 57: 2, # 'w' - 58: 0, # 'x' - 11: 3, # 'y' - 22: 0, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 1, # 'î' - 34: 1, # 'ö' - 17: 3, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 1, # 'ş' - }, - 21: { # 'b' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 1, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 1, # 'J' - 16: 2, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 1, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 2, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 3, # 'g' - 25: 1, # 'h' - 3: 3, # 'i' - 24: 2, # 'j' - 10: 3, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 3, # 'p' - 7: 1, # 'r' - 8: 2, # 's' - 9: 2, # 't' - 14: 2, # 'u' - 32: 1, # 'v' - 57: 0, # 'w' - 58: 1, # 'x' - 11: 3, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ğ' - 41: 0, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 28: { # 'c' - 23: 0, # 'A' - 37: 1, # 'B' - 47: 1, # 'C' - 39: 1, # 'D' - 29: 2, # 'E' - 52: 0, # 'F' - 36: 2, # 'G' - 45: 2, # 'H' - 53: 1, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 1, # 'N' - 42: 1, # 'O' - 48: 2, # 'P' - 44: 1, # 'R' - 35: 1, # 'S' - 31: 2, # 'T' - 51: 2, # 'U' - 38: 2, # 'V' - 62: 0, # 'W' - 43: 3, # 'Y' - 56: 0, # 'Z' - 1: 1, # 'a' - 21: 1, # 'b' - 28: 2, # 'c' - 12: 2, # 'd' - 2: 1, # 'e' - 18: 1, # 'f' - 27: 2, # 'g' - 25: 2, # 'h' - 3: 3, # 'i' - 24: 1, # 'j' - 10: 3, # 'k' - 5: 0, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 15: 2, # 'o' - 26: 2, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 1, # 'u' - 32: 0, # 'v' - 57: 1, # 'w' - 58: 0, # 'x' - 11: 2, # 'y' - 22: 1, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 1, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 1, # 'î' - 34: 2, # 'ö' - 17: 2, # 'ü' - 30: 2, # 'ğ' - 41: 1, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 2, # 'ş' - }, - 12: { # 'd' - 23: 1, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 2, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 3, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 1, # 'S' - 31: 1, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 2, # 'b' - 28: 1, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 1, # 'f' - 27: 3, # 'g' - 25: 3, # 'h' - 3: 2, # 'i' - 24: 3, # 'j' - 10: 2, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 1, # 'o' - 26: 2, # 'p' - 7: 3, # 'r' - 8: 2, # 's' - 9: 2, # 't' - 14: 3, # 'u' - 32: 1, # 'v' - 57: 0, # 'w' - 58: 1, # 'x' - 11: 3, # 'y' - 22: 1, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 1, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 2: { # 'e' - 23: 2, # 'A' - 37: 0, # 'B' - 47: 2, # 'C' - 39: 0, # 'D' - 29: 3, # 'E' - 52: 1, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 1, # 'K' - 49: 0, # 'L' - 20: 3, # 'M' - 46: 1, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 1, # 'R' - 35: 0, # 'S' - 31: 3, # 'T' - 51: 0, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 3, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 2, # 'e' - 18: 3, # 'f' - 27: 3, # 'g' - 25: 3, # 'h' - 3: 3, # 'i' - 24: 3, # 'j' - 10: 3, # 'k' - 5: 0, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 15: 1, # 'o' - 26: 3, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 3, # 'u' - 32: 3, # 'v' - 57: 2, # 'w' - 58: 0, # 'x' - 11: 3, # 'y' - 22: 1, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 3, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 18: { # 'f' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 2, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 2, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 1, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 2, # 'f' - 27: 1, # 'g' - 25: 1, # 'h' - 3: 1, # 'i' - 24: 1, # 'j' - 10: 1, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 2, # 'p' - 7: 1, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 1, # 'u' - 32: 2, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 1, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 1, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 1, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 27: { # 'g' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 1, # 'S' - 31: 1, # 'T' - 51: 0, # 'U' - 38: 2, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 1, # 'b' - 28: 0, # 'c' - 12: 1, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 2, # 'g' - 25: 1, # 'h' - 3: 2, # 'i' - 24: 3, # 'j' - 10: 2, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 2, # 'n' - 15: 0, # 'o' - 26: 1, # 'p' - 7: 2, # 'r' - 8: 2, # 's' - 9: 3, # 't' - 14: 3, # 'u' - 32: 1, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 1, # 'y' - 22: 0, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 25: { # 'h' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 2, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 0, # 'c' - 12: 2, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 1, # 'g' - 25: 2, # 'h' - 3: 2, # 'i' - 24: 3, # 'j' - 10: 3, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 1, # 'o' - 26: 1, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 2, # 't' - 14: 3, # 'u' - 32: 2, # 'v' - 57: 1, # 'w' - 58: 0, # 'x' - 11: 1, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 3: { # 'i' - 23: 2, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 1, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 3, # 'M' - 46: 0, # 'N' - 42: 1, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 1, # 'S' - 31: 2, # 'T' - 51: 0, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 2, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 2, # 'f' - 27: 3, # 'g' - 25: 1, # 'h' - 3: 3, # 'i' - 24: 2, # 'j' - 10: 3, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 1, # 'o' - 26: 3, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 3, # 'u' - 32: 2, # 'v' - 57: 1, # 'w' - 58: 1, # 'x' - 11: 3, # 'y' - 22: 1, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 1, # 'Ü' - 59: 0, # 'â' - 33: 2, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 3, # 'ü' - 30: 0, # 'ğ' - 41: 1, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 24: { # 'j' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 1, # 'J' - 16: 2, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 1, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 1, # 'Z' - 1: 3, # 'a' - 21: 1, # 'b' - 28: 1, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 2, # 'f' - 27: 1, # 'g' - 25: 1, # 'h' - 3: 2, # 'i' - 24: 1, # 'j' - 10: 2, # 'k' - 5: 2, # 'l' - 13: 3, # 'm' - 4: 2, # 'n' - 15: 0, # 'o' - 26: 1, # 'p' - 7: 2, # 'r' - 8: 3, # 's' - 9: 2, # 't' - 14: 3, # 'u' - 32: 2, # 'v' - 57: 0, # 'w' - 58: 2, # 'x' - 11: 1, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 1, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 10: { # 'k' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 3, # 'T' - 51: 0, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 1, # 'Z' - 1: 3, # 'a' - 21: 2, # 'b' - 28: 0, # 'c' - 12: 2, # 'd' - 2: 3, # 'e' - 18: 1, # 'f' - 27: 2, # 'g' - 25: 2, # 'h' - 3: 3, # 'i' - 24: 2, # 'j' - 10: 2, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 3, # 'p' - 7: 2, # 'r' - 8: 2, # 's' - 9: 2, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 1, # 'x' - 11: 3, # 'y' - 22: 0, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 3, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 3, # 'ü' - 30: 1, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 1, # 'ş' - }, - 5: { # 'l' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 3, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 1, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 0, # 'a' - 21: 3, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 1, # 'e' - 18: 3, # 'f' - 27: 3, # 'g' - 25: 2, # 'h' - 3: 3, # 'i' - 24: 2, # 'j' - 10: 3, # 'k' - 5: 1, # 'l' - 13: 1, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 2, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 2, # 'u' - 32: 2, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 3, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 2, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 13: { # 'm' - 23: 1, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 3, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 3, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 3, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 0, # 'Z' - 1: 2, # 'a' - 21: 3, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 2, # 'e' - 18: 3, # 'f' - 27: 3, # 'g' - 25: 3, # 'h' - 3: 3, # 'i' - 24: 3, # 'j' - 10: 3, # 'k' - 5: 0, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 15: 1, # 'o' - 26: 2, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 2, # 'u' - 32: 2, # 'v' - 57: 1, # 'w' - 58: 0, # 'x' - 11: 3, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 3, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 1, # 'ş' - }, - 4: { # 'n' - 23: 1, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 1, # 'H' - 53: 0, # 'I' - 60: 2, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 3, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 2, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 2, # 'b' - 28: 1, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 1, # 'f' - 27: 2, # 'g' - 25: 3, # 'h' - 3: 2, # 'i' - 24: 2, # 'j' - 10: 3, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 1, # 'o' - 26: 3, # 'p' - 7: 2, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 3, # 'u' - 32: 2, # 'v' - 57: 0, # 'w' - 58: 2, # 'x' - 11: 3, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 2, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 1, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 15: { # 'o' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 2, # 'F' - 36: 1, # 'G' - 45: 1, # 'H' - 53: 1, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 2, # 'L' - 20: 0, # 'M' - 46: 2, # 'N' - 42: 1, # 'O' - 48: 2, # 'P' - 44: 1, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 1, # 'i' - 24: 2, # 'j' - 10: 1, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 2, # 'n' - 15: 2, # 'o' - 26: 0, # 'p' - 7: 1, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 2, # 'x' - 11: 0, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 2, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 3, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 2, # 'ğ' - 41: 2, # 'İ' - 6: 3, # 'ı' - 40: 2, # 'Ş' - 19: 2, # 'ş' - }, - 26: { # 'p' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 1, # 'b' - 28: 0, # 'c' - 12: 1, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 1, # 'g' - 25: 1, # 'h' - 3: 2, # 'i' - 24: 3, # 'j' - 10: 1, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 2, # 'n' - 15: 0, # 'o' - 26: 2, # 'p' - 7: 2, # 'r' - 8: 1, # 's' - 9: 1, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 1, # 'x' - 11: 1, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 3, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 1, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 7: { # 'r' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 1, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 2, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 2, # 'T' - 51: 1, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 1, # 'Z' - 1: 3, # 'a' - 21: 1, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 2, # 'g' - 25: 3, # 'h' - 3: 2, # 'i' - 24: 2, # 'j' - 10: 3, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 2, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 3, # 'u' - 32: 2, # 'v' - 57: 0, # 'w' - 58: 1, # 'x' - 11: 2, # 'y' - 22: 0, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 2, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 3, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 8: { # 's' - 23: 1, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 1, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 3, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 2, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 1, # 'Z' - 1: 3, # 'a' - 21: 2, # 'b' - 28: 1, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 2, # 'g' - 25: 2, # 'h' - 3: 2, # 'i' - 24: 3, # 'j' - 10: 3, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 3, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 3, # 'u' - 32: 2, # 'v' - 57: 0, # 'w' - 58: 1, # 'x' - 11: 2, # 'y' - 22: 1, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 2, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 2, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 1, # 'ş' - }, - 9: { # 't' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 1, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 2, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 1, # 'Z' - 1: 3, # 'a' - 21: 3, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 2, # 'f' - 27: 2, # 'g' - 25: 2, # 'h' - 3: 2, # 'i' - 24: 2, # 'j' - 10: 3, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 2, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 3, # 'u' - 32: 3, # 'v' - 57: 0, # 'w' - 58: 2, # 'x' - 11: 2, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 3, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 2, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 14: { # 'u' - 23: 3, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 3, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 1, # 'H' - 53: 0, # 'I' - 60: 1, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 3, # 'M' - 46: 2, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 3, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 2, # 'Z' - 1: 2, # 'a' - 21: 3, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 2, # 'e' - 18: 2, # 'f' - 27: 3, # 'g' - 25: 3, # 'h' - 3: 3, # 'i' - 24: 2, # 'j' - 10: 3, # 'k' - 5: 0, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 3, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 3, # 'u' - 32: 2, # 'v' - 57: 2, # 'w' - 58: 0, # 'x' - 11: 3, # 'y' - 22: 0, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 3, # 'ü' - 30: 1, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 32: { # 'v' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 1, # 'j' - 10: 1, # 'k' - 5: 3, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 1, # 'p' - 7: 1, # 'r' - 8: 2, # 's' - 9: 3, # 't' - 14: 3, # 'u' - 32: 1, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 2, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 1, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 57: { # 'w' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 1, # 'a' - 21: 0, # 'b' - 28: 0, # 'c' - 12: 0, # 'd' - 2: 2, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 1, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 1, # 'k' - 5: 0, # 'l' - 13: 0, # 'm' - 4: 1, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 1, # 's' - 9: 0, # 't' - 14: 1, # 'u' - 32: 0, # 'v' - 57: 2, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 0, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 1, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 0, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 58: { # 'x' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 1, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 1, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 0, # 'a' - 21: 1, # 'b' - 28: 0, # 'c' - 12: 2, # 'd' - 2: 1, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 2, # 'i' - 24: 2, # 'j' - 10: 1, # 'k' - 5: 0, # 'l' - 13: 0, # 'm' - 4: 2, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 1, # 'r' - 8: 2, # 's' - 9: 1, # 't' - 14: 0, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 2, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 1, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 11: { # 'y' - 23: 1, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 1, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 1, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 1, # 'Z' - 1: 3, # 'a' - 21: 1, # 'b' - 28: 0, # 'c' - 12: 2, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 2, # 'g' - 25: 2, # 'h' - 3: 2, # 'i' - 24: 1, # 'j' - 10: 2, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 1, # 'p' - 7: 2, # 'r' - 8: 1, # 's' - 9: 2, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 1, # 'x' - 11: 3, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 3, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 2, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 22: { # 'z' - 23: 2, # 'A' - 37: 2, # 'B' - 47: 1, # 'C' - 39: 2, # 'D' - 29: 3, # 'E' - 52: 1, # 'F' - 36: 2, # 'G' - 45: 2, # 'H' - 53: 1, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 3, # 'M' - 46: 2, # 'N' - 42: 2, # 'O' - 48: 2, # 'P' - 44: 1, # 'R' - 35: 1, # 'S' - 31: 3, # 'T' - 51: 2, # 'U' - 38: 2, # 'V' - 62: 0, # 'W' - 43: 2, # 'Y' - 56: 1, # 'Z' - 1: 1, # 'a' - 21: 2, # 'b' - 28: 1, # 'c' - 12: 2, # 'd' - 2: 2, # 'e' - 18: 3, # 'f' - 27: 2, # 'g' - 25: 2, # 'h' - 3: 3, # 'i' - 24: 2, # 'j' - 10: 3, # 'k' - 5: 0, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 15: 2, # 'o' - 26: 2, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 0, # 'u' - 32: 2, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 3, # 'y' - 22: 2, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 2, # 'Ü' - 59: 1, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 2, # 'ö' - 17: 2, # 'ü' - 30: 2, # 'ğ' - 41: 1, # 'İ' - 6: 3, # 'ı' - 40: 1, # 'Ş' - 19: 2, # 'ş' - }, - 63: { # '·' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 0, # 'a' - 21: 0, # 'b' - 28: 0, # 'c' - 12: 0, # 'd' - 2: 1, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 0, # 'k' - 5: 0, # 'l' - 13: 2, # 'm' - 4: 0, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 2, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 0, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 54: { # 'Ç' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 1, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 1, # 'G' - 45: 1, # 'H' - 53: 1, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 1, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 2, # 'Y' - 56: 0, # 'Z' - 1: 0, # 'a' - 21: 1, # 'b' - 28: 0, # 'c' - 12: 1, # 'd' - 2: 0, # 'e' - 18: 0, # 'f' - 27: 1, # 'g' - 25: 0, # 'h' - 3: 3, # 'i' - 24: 0, # 'j' - 10: 1, # 'k' - 5: 0, # 'l' - 13: 0, # 'm' - 4: 2, # 'n' - 15: 1, # 'o' - 26: 0, # 'p' - 7: 2, # 'r' - 8: 0, # 's' - 9: 1, # 't' - 14: 0, # 'u' - 32: 2, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 2, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Ş' - 19: 1, # 'ş' - }, - 50: { # 'Ö' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 1, # 'D' - 29: 2, # 'E' - 52: 0, # 'F' - 36: 1, # 'G' - 45: 2, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 1, # 'N' - 42: 2, # 'O' - 48: 2, # 'P' - 44: 1, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 2, # 'Y' - 56: 0, # 'Z' - 1: 0, # 'a' - 21: 2, # 'b' - 28: 1, # 'c' - 12: 2, # 'd' - 2: 0, # 'e' - 18: 1, # 'f' - 27: 1, # 'g' - 25: 1, # 'h' - 3: 2, # 'i' - 24: 0, # 'j' - 10: 2, # 'k' - 5: 0, # 'l' - 13: 0, # 'm' - 4: 3, # 'n' - 15: 2, # 'o' - 26: 2, # 'p' - 7: 3, # 'r' - 8: 1, # 's' - 9: 2, # 't' - 14: 0, # 'u' - 32: 1, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 1, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 2, # 'ö' - 17: 2, # 'ü' - 30: 1, # 'ğ' - 41: 0, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Ş' - 19: 1, # 'ş' - }, - 55: { # 'Ü' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 2, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 1, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 2, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 2, # 'e' - 18: 0, # 'f' - 27: 1, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 0, # 'k' - 5: 1, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 1, # 't' - 14: 2, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 1, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 1, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ğ' - 41: 1, # 'İ' - 6: 0, # 'ı' - 40: 0, # 'Ş' - 19: 1, # 'ş' - }, - 59: { # 'â' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 1, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 1, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 2, # 'a' - 21: 0, # 'b' - 28: 0, # 'c' - 12: 0, # 'd' - 2: 2, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 0, # 'k' - 5: 0, # 'l' - 13: 2, # 'm' - 4: 0, # 'n' - 15: 1, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 2, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 1, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 1, # 'ı' - 40: 1, # 'Ş' - 19: 0, # 'ş' - }, - 33: { # 'ç' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 3, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 2, # 'T' - 51: 0, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 0, # 'a' - 21: 3, # 'b' - 28: 0, # 'c' - 12: 2, # 'd' - 2: 0, # 'e' - 18: 2, # 'f' - 27: 1, # 'g' - 25: 3, # 'h' - 3: 3, # 'i' - 24: 0, # 'j' - 10: 3, # 'k' - 5: 0, # 'l' - 13: 0, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 1, # 'p' - 7: 3, # 'r' - 8: 2, # 's' - 9: 3, # 't' - 14: 0, # 'u' - 32: 2, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 2, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 1, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 61: { # 'î' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 1, # 'Z' - 1: 2, # 'a' - 21: 0, # 'b' - 28: 0, # 'c' - 12: 0, # 'd' - 2: 2, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 1, # 'j' - 10: 0, # 'k' - 5: 0, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 1, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 1, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 1, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 1, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 34: { # 'ö' - 23: 0, # 'A' - 37: 1, # 'B' - 47: 1, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 2, # 'F' - 36: 1, # 'G' - 45: 1, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 1, # 'L' - 20: 0, # 'M' - 46: 1, # 'N' - 42: 1, # 'O' - 48: 2, # 'P' - 44: 1, # 'R' - 35: 1, # 'S' - 31: 1, # 'T' - 51: 1, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 1, # 'Z' - 1: 3, # 'a' - 21: 1, # 'b' - 28: 2, # 'c' - 12: 1, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 2, # 'g' - 25: 2, # 'h' - 3: 1, # 'i' - 24: 2, # 'j' - 10: 1, # 'k' - 5: 2, # 'l' - 13: 3, # 'm' - 4: 2, # 'n' - 15: 2, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 3, # 's' - 9: 1, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 1, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 2, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 2, # 'ç' - 61: 0, # 'î' - 34: 2, # 'ö' - 17: 0, # 'ü' - 30: 2, # 'ğ' - 41: 1, # 'İ' - 6: 1, # 'ı' - 40: 2, # 'Ş' - 19: 1, # 'ş' - }, - 17: { # 'ü' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 1, # 'J' - 16: 1, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 1, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 1, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 0, # 'c' - 12: 1, # 'd' - 2: 3, # 'e' - 18: 1, # 'f' - 27: 2, # 'g' - 25: 0, # 'h' - 3: 1, # 'i' - 24: 1, # 'j' - 10: 2, # 'k' - 5: 3, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 2, # 'p' - 7: 2, # 'r' - 8: 3, # 's' - 9: 2, # 't' - 14: 3, # 'u' - 32: 1, # 'v' - 57: 1, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 2, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 30: { # 'ğ' - 23: 0, # 'A' - 37: 2, # 'B' - 47: 1, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 2, # 'F' - 36: 1, # 'G' - 45: 0, # 'H' - 53: 1, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 2, # 'N' - 42: 2, # 'O' - 48: 1, # 'P' - 44: 1, # 'R' - 35: 0, # 'S' - 31: 1, # 'T' - 51: 0, # 'U' - 38: 2, # 'V' - 62: 0, # 'W' - 43: 2, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 2, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 3, # 'j' - 10: 1, # 'k' - 5: 2, # 'l' - 13: 3, # 'm' - 4: 0, # 'n' - 15: 1, # 'o' - 26: 0, # 'p' - 7: 1, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 2, # 'Ç' - 50: 2, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 2, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ğ' - 41: 2, # 'İ' - 6: 2, # 'ı' - 40: 2, # 'Ş' - 19: 1, # 'ş' - }, - 41: { # 'İ' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 1, # 'D' - 29: 1, # 'E' - 52: 0, # 'F' - 36: 2, # 'G' - 45: 2, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 1, # 'N' - 42: 1, # 'O' - 48: 2, # 'P' - 44: 0, # 'R' - 35: 1, # 'S' - 31: 1, # 'T' - 51: 1, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 2, # 'Y' - 56: 0, # 'Z' - 1: 1, # 'a' - 21: 2, # 'b' - 28: 1, # 'c' - 12: 2, # 'd' - 2: 1, # 'e' - 18: 0, # 'f' - 27: 3, # 'g' - 25: 2, # 'h' - 3: 2, # 'i' - 24: 2, # 'j' - 10: 2, # 'k' - 5: 0, # 'l' - 13: 1, # 'm' - 4: 3, # 'n' - 15: 1, # 'o' - 26: 1, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 2, # 't' - 14: 0, # 'u' - 32: 0, # 'v' - 57: 1, # 'w' - 58: 0, # 'x' - 11: 2, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 1, # 'Ü' - 59: 1, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 1, # 'ü' - 30: 2, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 1, # 'ş' - }, - 6: { # 'ı' - 23: 2, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 1, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 2, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 3, # 'M' - 46: 1, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 2, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 2, # 'Y' - 56: 1, # 'Z' - 1: 3, # 'a' - 21: 2, # 'b' - 28: 1, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 3, # 'f' - 27: 3, # 'g' - 25: 2, # 'h' - 3: 3, # 'i' - 24: 3, # 'j' - 10: 3, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 3, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 3, # 'u' - 32: 3, # 'v' - 57: 1, # 'w' - 58: 1, # 'x' - 11: 3, # 'y' - 22: 0, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 2, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 3, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 40: { # 'Ş' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 1, # 'D' - 29: 1, # 'E' - 52: 0, # 'F' - 36: 1, # 'G' - 45: 2, # 'H' - 53: 1, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 1, # 'N' - 42: 1, # 'O' - 48: 2, # 'P' - 44: 2, # 'R' - 35: 1, # 'S' - 31: 1, # 'T' - 51: 0, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 2, # 'Y' - 56: 1, # 'Z' - 1: 0, # 'a' - 21: 2, # 'b' - 28: 0, # 'c' - 12: 2, # 'd' - 2: 0, # 'e' - 18: 3, # 'f' - 27: 0, # 'g' - 25: 2, # 'h' - 3: 3, # 'i' - 24: 2, # 'j' - 10: 1, # 'k' - 5: 0, # 'l' - 13: 1, # 'm' - 4: 3, # 'n' - 15: 2, # 'o' - 26: 0, # 'p' - 7: 3, # 'r' - 8: 2, # 's' - 9: 2, # 't' - 14: 1, # 'u' - 32: 3, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 2, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 1, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 2, # 'ö' - 17: 1, # 'ü' - 30: 2, # 'ğ' - 41: 0, # 'İ' - 6: 2, # 'ı' - 40: 1, # 'Ş' - 19: 2, # 'ş' - }, - 19: { # 'ş' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 2, # 'F' - 36: 1, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 2, # 'L' - 20: 0, # 'M' - 46: 1, # 'N' - 42: 1, # 'O' - 48: 1, # 'P' - 44: 1, # 'R' - 35: 1, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 1, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 2, # 'g' - 25: 1, # 'h' - 3: 1, # 'i' - 24: 0, # 'j' - 10: 2, # 'k' - 5: 2, # 'l' - 13: 3, # 'm' - 4: 0, # 'n' - 15: 0, # 'o' - 26: 1, # 'p' - 7: 3, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 2, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 1, # 'î' - 34: 2, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ğ' - 41: 1, # 'İ' - 6: 1, # 'ı' - 40: 1, # 'Ş' - 19: 1, # 'ş' - }, -} - -# 255: Undefined characters that did not exist in training text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 -# 251: Control characters - -# Character Mapping Table(s): -ISO_8859_9_TURKISH_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 255, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 255, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 255, # ' ' - 33: 255, # '!' - 34: 255, # '"' - 35: 255, # '#' - 36: 255, # '$' - 37: 255, # '%' - 38: 255, # '&' - 39: 255, # "'" - 40: 255, # '(' - 41: 255, # ')' - 42: 255, # '*' - 43: 255, # '+' - 44: 255, # ',' - 45: 255, # '-' - 46: 255, # '.' - 47: 255, # '/' - 48: 255, # '0' - 49: 255, # '1' - 50: 255, # '2' - 51: 255, # '3' - 52: 255, # '4' - 53: 255, # '5' - 54: 255, # '6' - 55: 255, # '7' - 56: 255, # '8' - 57: 255, # '9' - 58: 255, # ':' - 59: 255, # ';' - 60: 255, # '<' - 61: 255, # '=' - 62: 255, # '>' - 63: 255, # '?' - 64: 255, # '@' - 65: 23, # 'A' - 66: 37, # 'B' - 67: 47, # 'C' - 68: 39, # 'D' - 69: 29, # 'E' - 70: 52, # 'F' - 71: 36, # 'G' - 72: 45, # 'H' - 73: 53, # 'I' - 74: 60, # 'J' - 75: 16, # 'K' - 76: 49, # 'L' - 77: 20, # 'M' - 78: 46, # 'N' - 79: 42, # 'O' - 80: 48, # 'P' - 81: 69, # 'Q' - 82: 44, # 'R' - 83: 35, # 'S' - 84: 31, # 'T' - 85: 51, # 'U' - 86: 38, # 'V' - 87: 62, # 'W' - 88: 65, # 'X' - 89: 43, # 'Y' - 90: 56, # 'Z' - 91: 255, # '[' - 92: 255, # '\\' - 93: 255, # ']' - 94: 255, # '^' - 95: 255, # '_' - 96: 255, # '`' - 97: 1, # 'a' - 98: 21, # 'b' - 99: 28, # 'c' - 100: 12, # 'd' - 101: 2, # 'e' - 102: 18, # 'f' - 103: 27, # 'g' - 104: 25, # 'h' - 105: 3, # 'i' - 106: 24, # 'j' - 107: 10, # 'k' - 108: 5, # 'l' - 109: 13, # 'm' - 110: 4, # 'n' - 111: 15, # 'o' - 112: 26, # 'p' - 113: 64, # 'q' - 114: 7, # 'r' - 115: 8, # 's' - 116: 9, # 't' - 117: 14, # 'u' - 118: 32, # 'v' - 119: 57, # 'w' - 120: 58, # 'x' - 121: 11, # 'y' - 122: 22, # 'z' - 123: 255, # '{' - 124: 255, # '|' - 125: 255, # '}' - 126: 255, # '~' - 127: 255, # '\x7f' - 128: 180, # '\x80' - 129: 179, # '\x81' - 130: 178, # '\x82' - 131: 177, # '\x83' - 132: 176, # '\x84' - 133: 175, # '\x85' - 134: 174, # '\x86' - 135: 173, # '\x87' - 136: 172, # '\x88' - 137: 171, # '\x89' - 138: 170, # '\x8a' - 139: 169, # '\x8b' - 140: 168, # '\x8c' - 141: 167, # '\x8d' - 142: 166, # '\x8e' - 143: 165, # '\x8f' - 144: 164, # '\x90' - 145: 163, # '\x91' - 146: 162, # '\x92' - 147: 161, # '\x93' - 148: 160, # '\x94' - 149: 159, # '\x95' - 150: 101, # '\x96' - 151: 158, # '\x97' - 152: 157, # '\x98' - 153: 156, # '\x99' - 154: 155, # '\x9a' - 155: 154, # '\x9b' - 156: 153, # '\x9c' - 157: 152, # '\x9d' - 158: 151, # '\x9e' - 159: 106, # '\x9f' - 160: 150, # '\xa0' - 161: 149, # '¡' - 162: 148, # '¢' - 163: 147, # '£' - 164: 146, # '¤' - 165: 145, # '¥' - 166: 144, # '¦' - 167: 100, # '§' - 168: 143, # '¨' - 169: 142, # '©' - 170: 141, # 'ª' - 171: 140, # '«' - 172: 139, # '¬' - 173: 138, # '\xad' - 174: 137, # '®' - 175: 136, # '¯' - 176: 94, # '°' - 177: 80, # '±' - 178: 93, # '²' - 179: 135, # '³' - 180: 105, # '´' - 181: 134, # 'µ' - 182: 133, # '¶' - 183: 63, # '·' - 184: 132, # '¸' - 185: 131, # '¹' - 186: 130, # 'º' - 187: 129, # '»' - 188: 128, # '¼' - 189: 127, # '½' - 190: 126, # '¾' - 191: 125, # '¿' - 192: 124, # 'À' - 193: 104, # 'Á' - 194: 73, # 'Â' - 195: 99, # 'Ã' - 196: 79, # 'Ä' - 197: 85, # 'Å' - 198: 123, # 'Æ' - 199: 54, # 'Ç' - 200: 122, # 'È' - 201: 98, # 'É' - 202: 92, # 'Ê' - 203: 121, # 'Ë' - 204: 120, # 'Ì' - 205: 91, # 'Í' - 206: 103, # 'Î' - 207: 119, # 'Ï' - 208: 68, # 'Ğ' - 209: 118, # 'Ñ' - 210: 117, # 'Ò' - 211: 97, # 'Ó' - 212: 116, # 'Ô' - 213: 115, # 'Õ' - 214: 50, # 'Ö' - 215: 90, # '×' - 216: 114, # 'Ø' - 217: 113, # 'Ù' - 218: 112, # 'Ú' - 219: 111, # 'Û' - 220: 55, # 'Ü' - 221: 41, # 'İ' - 222: 40, # 'Ş' - 223: 86, # 'ß' - 224: 89, # 'à' - 225: 70, # 'á' - 226: 59, # 'â' - 227: 78, # 'ã' - 228: 71, # 'ä' - 229: 82, # 'å' - 230: 88, # 'æ' - 231: 33, # 'ç' - 232: 77, # 'è' - 233: 66, # 'é' - 234: 84, # 'ê' - 235: 83, # 'ë' - 236: 110, # 'ì' - 237: 75, # 'í' - 238: 61, # 'î' - 239: 96, # 'ï' - 240: 30, # 'ğ' - 241: 67, # 'ñ' - 242: 109, # 'ò' - 243: 74, # 'ó' - 244: 87, # 'ô' - 245: 102, # 'õ' - 246: 34, # 'ö' - 247: 95, # '÷' - 248: 81, # 'ø' - 249: 108, # 'ù' - 250: 76, # 'ú' - 251: 72, # 'û' - 252: 17, # 'ü' - 253: 6, # 'ı' - 254: 19, # 'ş' - 255: 107, # 'ÿ' -} - -ISO_8859_9_TURKISH_MODEL = SingleByteCharSetModel( - charset_name="ISO-8859-9", - language="Turkish", - char_to_order_map=ISO_8859_9_TURKISH_CHAR_TO_ORDER, - language_model=TURKISH_LANG_MODEL, - typical_positive_ratio=0.97029, - keep_ascii_letters=True, - alphabet="ABCDEFGHIJKLMNOPRSTUVYZabcdefghijklmnoprstuvyzÂÇÎÖÛÜâçîöûüĞğİıŞş", -) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/latin1prober.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/latin1prober.py deleted file mode 100644 index 59a01d9..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/latin1prober.py +++ /dev/null @@ -1,147 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from typing import List, Union - -from .charsetprober import CharSetProber -from .enums import ProbingState - -FREQ_CAT_NUM = 4 - -UDF = 0 # undefined -OTH = 1 # other -ASC = 2 # ascii capital letter -ASS = 3 # ascii small letter -ACV = 4 # accent capital vowel -ACO = 5 # accent capital other -ASV = 6 # accent small vowel -ASO = 7 # accent small other -CLASS_NUM = 8 # total classes - -# fmt: off -Latin1_CharToClass = ( - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F - OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 - ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F - ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 - ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F - OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 - ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F - ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 - ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F - OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87 - OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F - UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97 - OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF - ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7 - ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF - ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7 - ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF - ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7 - ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF - ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7 - ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF -) - -# 0 : illegal -# 1 : very unlikely -# 2 : normal -# 3 : very likely -Latin1ClassModel = ( -# UDF OTH ASC ASS ACV ACO ASV ASO - 0, 0, 0, 0, 0, 0, 0, 0, # UDF - 0, 3, 3, 3, 3, 3, 3, 3, # OTH - 0, 3, 3, 3, 3, 3, 3, 3, # ASC - 0, 3, 3, 3, 1, 1, 3, 3, # ASS - 0, 3, 3, 3, 1, 2, 1, 2, # ACV - 0, 3, 3, 3, 3, 3, 3, 3, # ACO - 0, 3, 1, 3, 1, 1, 1, 3, # ASV - 0, 3, 1, 3, 1, 1, 3, 3, # ASO -) -# fmt: on - - -class Latin1Prober(CharSetProber): - def __init__(self) -> None: - super().__init__() - self._last_char_class = OTH - self._freq_counter: List[int] = [] - self.reset() - - def reset(self) -> None: - self._last_char_class = OTH - self._freq_counter = [0] * FREQ_CAT_NUM - super().reset() - - @property - def charset_name(self) -> str: - return "ISO-8859-1" - - @property - def language(self) -> str: - return "" - - def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: - byte_str = self.remove_xml_tags(byte_str) - for c in byte_str: - char_class = Latin1_CharToClass[c] - freq = Latin1ClassModel[(self._last_char_class * CLASS_NUM) + char_class] - if freq == 0: - self._state = ProbingState.NOT_ME - break - self._freq_counter[freq] += 1 - self._last_char_class = char_class - - return self.state - - def get_confidence(self) -> float: - if self.state == ProbingState.NOT_ME: - return 0.01 - - total = sum(self._freq_counter) - confidence = ( - 0.0 - if total < 0.01 - else (self._freq_counter[3] - self._freq_counter[1] * 20.0) / total - ) - confidence = max(confidence, 0.0) - # lower the confidence of latin1 so that other more accurate - # detector can take priority. - confidence *= 0.73 - return confidence diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/macromanprober.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/macromanprober.py deleted file mode 100644 index 1425d10..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/macromanprober.py +++ /dev/null @@ -1,162 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# This code was modified from latin1prober.py by Rob Speer <rob@lumino.so>. -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Rob Speer - adapt to MacRoman encoding -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from typing import List, Union - -from .charsetprober import CharSetProber -from .enums import ProbingState - -FREQ_CAT_NUM = 4 - -UDF = 0 # undefined -OTH = 1 # other -ASC = 2 # ascii capital letter -ASS = 3 # ascii small letter -ACV = 4 # accent capital vowel -ACO = 5 # accent capital other -ASV = 6 # accent small vowel -ASO = 7 # accent small other -ODD = 8 # character that is unlikely to appear -CLASS_NUM = 9 # total classes - -# The change from Latin1 is that we explicitly look for extended characters -# that are infrequently-occurring symbols, and consider them to always be -# improbable. This should let MacRoman get out of the way of more likely -# encodings in most situations. - -# fmt: off -MacRoman_CharToClass = ( - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F - OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 - ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F - ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 - ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F - OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 - ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F - ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 - ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F - ACV, ACV, ACO, ACV, ACO, ACV, ACV, ASV, # 80 - 87 - ASV, ASV, ASV, ASV, ASV, ASO, ASV, ASV, # 88 - 8F - ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASV, # 90 - 97 - ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # 98 - 9F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, ASO, # A0 - A7 - OTH, OTH, ODD, ODD, OTH, OTH, ACV, ACV, # A8 - AF - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 - OTH, OTH, OTH, OTH, OTH, OTH, ASV, ASV, # B8 - BF - OTH, OTH, ODD, OTH, ODD, OTH, OTH, OTH, # C0 - C7 - OTH, OTH, OTH, ACV, ACV, ACV, ACV, ASV, # C8 - CF - OTH, OTH, OTH, OTH, OTH, OTH, OTH, ODD, # D0 - D7 - ASV, ACV, ODD, OTH, OTH, OTH, OTH, OTH, # D8 - DF - OTH, OTH, OTH, OTH, OTH, ACV, ACV, ACV, # E0 - E7 - ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # E8 - EF - ODD, ACV, ACV, ACV, ACV, ASV, ODD, ODD, # F0 - F7 - ODD, ODD, ODD, ODD, ODD, ODD, ODD, ODD, # F8 - FF -) - -# 0 : illegal -# 1 : very unlikely -# 2 : normal -# 3 : very likely -MacRomanClassModel = ( -# UDF OTH ASC ASS ACV ACO ASV ASO ODD - 0, 0, 0, 0, 0, 0, 0, 0, 0, # UDF - 0, 3, 3, 3, 3, 3, 3, 3, 1, # OTH - 0, 3, 3, 3, 3, 3, 3, 3, 1, # ASC - 0, 3, 3, 3, 1, 1, 3, 3, 1, # ASS - 0, 3, 3, 3, 1, 2, 1, 2, 1, # ACV - 0, 3, 3, 3, 3, 3, 3, 3, 1, # ACO - 0, 3, 1, 3, 1, 1, 1, 3, 1, # ASV - 0, 3, 1, 3, 1, 1, 3, 3, 1, # ASO - 0, 1, 1, 1, 1, 1, 1, 1, 1, # ODD -) -# fmt: on - - -class MacRomanProber(CharSetProber): - def __init__(self) -> None: - super().__init__() - self._last_char_class = OTH - self._freq_counter: List[int] = [] - self.reset() - - def reset(self) -> None: - self._last_char_class = OTH - self._freq_counter = [0] * FREQ_CAT_NUM - - # express the prior that MacRoman is a somewhat rare encoding; - # this can be done by starting out in a slightly improbable state - # that must be overcome - self._freq_counter[2] = 10 - - super().reset() - - @property - def charset_name(self) -> str: - return "MacRoman" - - @property - def language(self) -> str: - return "" - - def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: - byte_str = self.remove_xml_tags(byte_str) - for c in byte_str: - char_class = MacRoman_CharToClass[c] - freq = MacRomanClassModel[(self._last_char_class * CLASS_NUM) + char_class] - if freq == 0: - self._state = ProbingState.NOT_ME - break - self._freq_counter[freq] += 1 - self._last_char_class = char_class - - return self.state - - def get_confidence(self) -> float: - if self.state == ProbingState.NOT_ME: - return 0.01 - - total = sum(self._freq_counter) - confidence = ( - 0.0 - if total < 0.01 - else (self._freq_counter[3] - self._freq_counter[1] * 20.0) / total - ) - confidence = max(confidence, 0.0) - # lower the confidence of MacRoman so that other more accurate - # detector can take priority. - confidence *= 0.73 - return confidence diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcharsetprober.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcharsetprober.py deleted file mode 100644 index 666307e..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcharsetprober.py +++ /dev/null @@ -1,95 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# Proofpoint, Inc. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from typing import Optional, Union - -from .chardistribution import CharDistributionAnalysis -from .charsetprober import CharSetProber -from .codingstatemachine import CodingStateMachine -from .enums import LanguageFilter, MachineState, ProbingState - - -class MultiByteCharSetProber(CharSetProber): - """ - MultiByteCharSetProber - """ - - def __init__(self, lang_filter: LanguageFilter = LanguageFilter.NONE) -> None: - super().__init__(lang_filter=lang_filter) - self.distribution_analyzer: Optional[CharDistributionAnalysis] = None - self.coding_sm: Optional[CodingStateMachine] = None - self._last_char = bytearray(b"\0\0") - - def reset(self) -> None: - super().reset() - if self.coding_sm: - self.coding_sm.reset() - if self.distribution_analyzer: - self.distribution_analyzer.reset() - self._last_char = bytearray(b"\0\0") - - def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: - assert self.coding_sm is not None - assert self.distribution_analyzer is not None - - for i, byte in enumerate(byte_str): - coding_state = self.coding_sm.next_state(byte) - if coding_state == MachineState.ERROR: - self.logger.debug( - "%s %s prober hit error at byte %s", - self.charset_name, - self.language, - i, - ) - self._state = ProbingState.NOT_ME - break - if coding_state == MachineState.ITS_ME: - self._state = ProbingState.FOUND_IT - break - if coding_state == MachineState.START: - char_len = self.coding_sm.get_current_charlen() - if i == 0: - self._last_char[1] = byte - self.distribution_analyzer.feed(self._last_char, char_len) - else: - self.distribution_analyzer.feed(byte_str[i - 1 : i + 1], char_len) - - self._last_char[0] = byte_str[-1] - - if self.state == ProbingState.DETECTING: - if self.distribution_analyzer.got_enough_data() and ( - self.get_confidence() > self.SHORTCUT_THRESHOLD - ): - self._state = ProbingState.FOUND_IT - - return self.state - - def get_confidence(self) -> float: - assert self.distribution_analyzer is not None - return self.distribution_analyzer.get_confidence() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcsgroupprober.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcsgroupprober.py deleted file mode 100644 index 6cb9cc7..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcsgroupprober.py +++ /dev/null @@ -1,57 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# Proofpoint, Inc. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .big5prober import Big5Prober -from .charsetgroupprober import CharSetGroupProber -from .cp949prober import CP949Prober -from .enums import LanguageFilter -from .eucjpprober import EUCJPProber -from .euckrprober import EUCKRProber -from .euctwprober import EUCTWProber -from .gb2312prober import GB2312Prober -from .johabprober import JOHABProber -from .sjisprober import SJISProber -from .utf8prober import UTF8Prober - - -class MBCSGroupProber(CharSetGroupProber): - def __init__(self, lang_filter: LanguageFilter = LanguageFilter.NONE) -> None: - super().__init__(lang_filter=lang_filter) - self.probers = [ - UTF8Prober(), - SJISProber(), - EUCJPProber(), - GB2312Prober(), - EUCKRProber(), - CP949Prober(), - Big5Prober(), - EUCTWProber(), - JOHABProber(), - ] - self.reset() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcssm.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcssm.py deleted file mode 100644 index 7bbe97e..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcssm.py +++ /dev/null @@ -1,661 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .codingstatemachinedict import CodingStateMachineDict -from .enums import MachineState - -# BIG5 - -# fmt: off -BIG5_CLS = ( - 1, 1, 1, 1, 1, 1, 1, 1, # 00 - 07 #allow 0x00 as legal value - 1, 1, 1, 1, 1, 1, 0, 0, # 08 - 0f - 1, 1, 1, 1, 1, 1, 1, 1, # 10 - 17 - 1, 1, 1, 0, 1, 1, 1, 1, # 18 - 1f - 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 27 - 1, 1, 1, 1, 1, 1, 1, 1, # 28 - 2f - 1, 1, 1, 1, 1, 1, 1, 1, # 30 - 37 - 1, 1, 1, 1, 1, 1, 1, 1, # 38 - 3f - 2, 2, 2, 2, 2, 2, 2, 2, # 40 - 47 - 2, 2, 2, 2, 2, 2, 2, 2, # 48 - 4f - 2, 2, 2, 2, 2, 2, 2, 2, # 50 - 57 - 2, 2, 2, 2, 2, 2, 2, 2, # 58 - 5f - 2, 2, 2, 2, 2, 2, 2, 2, # 60 - 67 - 2, 2, 2, 2, 2, 2, 2, 2, # 68 - 6f - 2, 2, 2, 2, 2, 2, 2, 2, # 70 - 77 - 2, 2, 2, 2, 2, 2, 2, 1, # 78 - 7f - 4, 4, 4, 4, 4, 4, 4, 4, # 80 - 87 - 4, 4, 4, 4, 4, 4, 4, 4, # 88 - 8f - 4, 4, 4, 4, 4, 4, 4, 4, # 90 - 97 - 4, 4, 4, 4, 4, 4, 4, 4, # 98 - 9f - 4, 3, 3, 3, 3, 3, 3, 3, # a0 - a7 - 3, 3, 3, 3, 3, 3, 3, 3, # a8 - af - 3, 3, 3, 3, 3, 3, 3, 3, # b0 - b7 - 3, 3, 3, 3, 3, 3, 3, 3, # b8 - bf - 3, 3, 3, 3, 3, 3, 3, 3, # c0 - c7 - 3, 3, 3, 3, 3, 3, 3, 3, # c8 - cf - 3, 3, 3, 3, 3, 3, 3, 3, # d0 - d7 - 3, 3, 3, 3, 3, 3, 3, 3, # d8 - df - 3, 3, 3, 3, 3, 3, 3, 3, # e0 - e7 - 3, 3, 3, 3, 3, 3, 3, 3, # e8 - ef - 3, 3, 3, 3, 3, 3, 3, 3, # f0 - f7 - 3, 3, 3, 3, 3, 3, 3, 0 # f8 - ff -) - -BIG5_ST = ( - MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,#08-0f - MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START#10-17 -) -# fmt: on - -BIG5_CHAR_LEN_TABLE = (0, 1, 1, 2, 0) - -BIG5_SM_MODEL: CodingStateMachineDict = { - "class_table": BIG5_CLS, - "class_factor": 5, - "state_table": BIG5_ST, - "char_len_table": BIG5_CHAR_LEN_TABLE, - "name": "Big5", -} - -# CP949 -# fmt: off -CP949_CLS = ( - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, # 00 - 0f - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, # 10 - 1f - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 2f - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, # 30 - 3f - 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, # 40 - 4f - 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, # 50 - 5f - 1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, # 60 - 6f - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, # 70 - 7f - 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, # 80 - 8f - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, # 90 - 9f - 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, # a0 - af - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, # b0 - bf - 7, 7, 7, 7, 7, 7, 9, 2, 2, 3, 2, 2, 2, 2, 2, 2, # c0 - cf - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, # d0 - df - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, # e0 - ef - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, # f0 - ff -) - -CP949_ST = ( -#cls= 0 1 2 3 4 5 6 7 8 9 # previous state = - MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START, 4, 5,MachineState.ERROR, 6, # MachineState.START - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, # MachineState.ERROR - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME, # MachineState.ITS_ME - MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 3 - MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 4 - MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 5 - MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 6 -) -# fmt: on - -CP949_CHAR_LEN_TABLE = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2) - -CP949_SM_MODEL: CodingStateMachineDict = { - "class_table": CP949_CLS, - "class_factor": 10, - "state_table": CP949_ST, - "char_len_table": CP949_CHAR_LEN_TABLE, - "name": "CP949", -} - -# EUC-JP -# fmt: off -EUCJP_CLS = ( - 4, 4, 4, 4, 4, 4, 4, 4, # 00 - 07 - 4, 4, 4, 4, 4, 4, 5, 5, # 08 - 0f - 4, 4, 4, 4, 4, 4, 4, 4, # 10 - 17 - 4, 4, 4, 5, 4, 4, 4, 4, # 18 - 1f - 4, 4, 4, 4, 4, 4, 4, 4, # 20 - 27 - 4, 4, 4, 4, 4, 4, 4, 4, # 28 - 2f - 4, 4, 4, 4, 4, 4, 4, 4, # 30 - 37 - 4, 4, 4, 4, 4, 4, 4, 4, # 38 - 3f - 4, 4, 4, 4, 4, 4, 4, 4, # 40 - 47 - 4, 4, 4, 4, 4, 4, 4, 4, # 48 - 4f - 4, 4, 4, 4, 4, 4, 4, 4, # 50 - 57 - 4, 4, 4, 4, 4, 4, 4, 4, # 58 - 5f - 4, 4, 4, 4, 4, 4, 4, 4, # 60 - 67 - 4, 4, 4, 4, 4, 4, 4, 4, # 68 - 6f - 4, 4, 4, 4, 4, 4, 4, 4, # 70 - 77 - 4, 4, 4, 4, 4, 4, 4, 4, # 78 - 7f - 5, 5, 5, 5, 5, 5, 5, 5, # 80 - 87 - 5, 5, 5, 5, 5, 5, 1, 3, # 88 - 8f - 5, 5, 5, 5, 5, 5, 5, 5, # 90 - 97 - 5, 5, 5, 5, 5, 5, 5, 5, # 98 - 9f - 5, 2, 2, 2, 2, 2, 2, 2, # a0 - a7 - 2, 2, 2, 2, 2, 2, 2, 2, # a8 - af - 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7 - 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf - 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7 - 2, 2, 2, 2, 2, 2, 2, 2, # c8 - cf - 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7 - 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df - 0, 0, 0, 0, 0, 0, 0, 0, # e0 - e7 - 0, 0, 0, 0, 0, 0, 0, 0, # e8 - ef - 0, 0, 0, 0, 0, 0, 0, 0, # f0 - f7 - 0, 0, 0, 0, 0, 0, 0, 5 # f8 - ff -) - -EUCJP_ST = ( - 3, 4, 3, 5,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 - MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 3,MachineState.ERROR,#18-1f - 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START#20-27 -) -# fmt: on - -EUCJP_CHAR_LEN_TABLE = (2, 2, 2, 3, 1, 0) - -EUCJP_SM_MODEL: CodingStateMachineDict = { - "class_table": EUCJP_CLS, - "class_factor": 6, - "state_table": EUCJP_ST, - "char_len_table": EUCJP_CHAR_LEN_TABLE, - "name": "EUC-JP", -} - -# EUC-KR -# fmt: off -EUCKR_CLS = ( - 1, 1, 1, 1, 1, 1, 1, 1, # 00 - 07 - 1, 1, 1, 1, 1, 1, 0, 0, # 08 - 0f - 1, 1, 1, 1, 1, 1, 1, 1, # 10 - 17 - 1, 1, 1, 0, 1, 1, 1, 1, # 18 - 1f - 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 27 - 1, 1, 1, 1, 1, 1, 1, 1, # 28 - 2f - 1, 1, 1, 1, 1, 1, 1, 1, # 30 - 37 - 1, 1, 1, 1, 1, 1, 1, 1, # 38 - 3f - 1, 1, 1, 1, 1, 1, 1, 1, # 40 - 47 - 1, 1, 1, 1, 1, 1, 1, 1, # 48 - 4f - 1, 1, 1, 1, 1, 1, 1, 1, # 50 - 57 - 1, 1, 1, 1, 1, 1, 1, 1, # 58 - 5f - 1, 1, 1, 1, 1, 1, 1, 1, # 60 - 67 - 1, 1, 1, 1, 1, 1, 1, 1, # 68 - 6f - 1, 1, 1, 1, 1, 1, 1, 1, # 70 - 77 - 1, 1, 1, 1, 1, 1, 1, 1, # 78 - 7f - 0, 0, 0, 0, 0, 0, 0, 0, # 80 - 87 - 0, 0, 0, 0, 0, 0, 0, 0, # 88 - 8f - 0, 0, 0, 0, 0, 0, 0, 0, # 90 - 97 - 0, 0, 0, 0, 0, 0, 0, 0, # 98 - 9f - 0, 2, 2, 2, 2, 2, 2, 2, # a0 - a7 - 2, 2, 2, 2, 2, 3, 3, 3, # a8 - af - 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7 - 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf - 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7 - 2, 3, 2, 2, 2, 2, 2, 2, # c8 - cf - 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7 - 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df - 2, 2, 2, 2, 2, 2, 2, 2, # e0 - e7 - 2, 2, 2, 2, 2, 2, 2, 2, # e8 - ef - 2, 2, 2, 2, 2, 2, 2, 2, # f0 - f7 - 2, 2, 2, 2, 2, 2, 2, 0 # f8 - ff -) - -EUCKR_ST = ( - MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #08-0f -) -# fmt: on - -EUCKR_CHAR_LEN_TABLE = (0, 1, 2, 0) - -EUCKR_SM_MODEL: CodingStateMachineDict = { - "class_table": EUCKR_CLS, - "class_factor": 4, - "state_table": EUCKR_ST, - "char_len_table": EUCKR_CHAR_LEN_TABLE, - "name": "EUC-KR", -} - -# JOHAB -# fmt: off -JOHAB_CLS = ( - 4,4,4,4,4,4,4,4, # 00 - 07 - 4,4,4,4,4,4,0,0, # 08 - 0f - 4,4,4,4,4,4,4,4, # 10 - 17 - 4,4,4,0,4,4,4,4, # 18 - 1f - 4,4,4,4,4,4,4,4, # 20 - 27 - 4,4,4,4,4,4,4,4, # 28 - 2f - 4,3,3,3,3,3,3,3, # 30 - 37 - 3,3,3,3,3,3,3,3, # 38 - 3f - 3,1,1,1,1,1,1,1, # 40 - 47 - 1,1,1,1,1,1,1,1, # 48 - 4f - 1,1,1,1,1,1,1,1, # 50 - 57 - 1,1,1,1,1,1,1,1, # 58 - 5f - 1,1,1,1,1,1,1,1, # 60 - 67 - 1,1,1,1,1,1,1,1, # 68 - 6f - 1,1,1,1,1,1,1,1, # 70 - 77 - 1,1,1,1,1,1,1,2, # 78 - 7f - 6,6,6,6,8,8,8,8, # 80 - 87 - 8,8,8,8,8,8,8,8, # 88 - 8f - 8,7,7,7,7,7,7,7, # 90 - 97 - 7,7,7,7,7,7,7,7, # 98 - 9f - 7,7,7,7,7,7,7,7, # a0 - a7 - 7,7,7,7,7,7,7,7, # a8 - af - 7,7,7,7,7,7,7,7, # b0 - b7 - 7,7,7,7,7,7,7,7, # b8 - bf - 7,7,7,7,7,7,7,7, # c0 - c7 - 7,7,7,7,7,7,7,7, # c8 - cf - 7,7,7,7,5,5,5,5, # d0 - d7 - 5,9,9,9,9,9,9,5, # d8 - df - 9,9,9,9,9,9,9,9, # e0 - e7 - 9,9,9,9,9,9,9,9, # e8 - ef - 9,9,9,9,9,9,9,9, # f0 - f7 - 9,9,5,5,5,5,5,0 # f8 - ff -) - -JOHAB_ST = ( -# cls = 0 1 2 3 4 5 6 7 8 9 - MachineState.ERROR ,MachineState.START ,MachineState.START ,MachineState.START ,MachineState.START ,MachineState.ERROR ,MachineState.ERROR ,3 ,3 ,4 , # MachineState.START - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME, # MachineState.ITS_ME - MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR , # MachineState.ERROR - MachineState.ERROR ,MachineState.START ,MachineState.START ,MachineState.ERROR ,MachineState.ERROR ,MachineState.START ,MachineState.START ,MachineState.START ,MachineState.START ,MachineState.START , # 3 - MachineState.ERROR ,MachineState.START ,MachineState.ERROR ,MachineState.START ,MachineState.ERROR ,MachineState.START ,MachineState.ERROR ,MachineState.START ,MachineState.ERROR ,MachineState.START , # 4 -) -# fmt: on - -JOHAB_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 0, 0, 2, 2, 2) - -JOHAB_SM_MODEL: CodingStateMachineDict = { - "class_table": JOHAB_CLS, - "class_factor": 10, - "state_table": JOHAB_ST, - "char_len_table": JOHAB_CHAR_LEN_TABLE, - "name": "Johab", -} - -# EUC-TW -# fmt: off -EUCTW_CLS = ( - 2, 2, 2, 2, 2, 2, 2, 2, # 00 - 07 - 2, 2, 2, 2, 2, 2, 0, 0, # 08 - 0f - 2, 2, 2, 2, 2, 2, 2, 2, # 10 - 17 - 2, 2, 2, 0, 2, 2, 2, 2, # 18 - 1f - 2, 2, 2, 2, 2, 2, 2, 2, # 20 - 27 - 2, 2, 2, 2, 2, 2, 2, 2, # 28 - 2f - 2, 2, 2, 2, 2, 2, 2, 2, # 30 - 37 - 2, 2, 2, 2, 2, 2, 2, 2, # 38 - 3f - 2, 2, 2, 2, 2, 2, 2, 2, # 40 - 47 - 2, 2, 2, 2, 2, 2, 2, 2, # 48 - 4f - 2, 2, 2, 2, 2, 2, 2, 2, # 50 - 57 - 2, 2, 2, 2, 2, 2, 2, 2, # 58 - 5f - 2, 2, 2, 2, 2, 2, 2, 2, # 60 - 67 - 2, 2, 2, 2, 2, 2, 2, 2, # 68 - 6f - 2, 2, 2, 2, 2, 2, 2, 2, # 70 - 77 - 2, 2, 2, 2, 2, 2, 2, 2, # 78 - 7f - 0, 0, 0, 0, 0, 0, 0, 0, # 80 - 87 - 0, 0, 0, 0, 0, 0, 6, 0, # 88 - 8f - 0, 0, 0, 0, 0, 0, 0, 0, # 90 - 97 - 0, 0, 0, 0, 0, 0, 0, 0, # 98 - 9f - 0, 3, 4, 4, 4, 4, 4, 4, # a0 - a7 - 5, 5, 1, 1, 1, 1, 1, 1, # a8 - af - 1, 1, 1, 1, 1, 1, 1, 1, # b0 - b7 - 1, 1, 1, 1, 1, 1, 1, 1, # b8 - bf - 1, 1, 3, 1, 3, 3, 3, 3, # c0 - c7 - 3, 3, 3, 3, 3, 3, 3, 3, # c8 - cf - 3, 3, 3, 3, 3, 3, 3, 3, # d0 - d7 - 3, 3, 3, 3, 3, 3, 3, 3, # d8 - df - 3, 3, 3, 3, 3, 3, 3, 3, # e0 - e7 - 3, 3, 3, 3, 3, 3, 3, 3, # e8 - ef - 3, 3, 3, 3, 3, 3, 3, 3, # f0 - f7 - 3, 3, 3, 3, 3, 3, 3, 0 # f8 - ff -) - -EUCTW_ST = ( - MachineState.ERROR,MachineState.ERROR,MachineState.START, 3, 3, 3, 4,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.ERROR,#10-17 - MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f - 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,#20-27 - MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f -) -# fmt: on - -EUCTW_CHAR_LEN_TABLE = (0, 0, 1, 2, 2, 2, 3) - -EUCTW_SM_MODEL: CodingStateMachineDict = { - "class_table": EUCTW_CLS, - "class_factor": 7, - "state_table": EUCTW_ST, - "char_len_table": EUCTW_CHAR_LEN_TABLE, - "name": "x-euc-tw", -} - -# GB2312 -# fmt: off -GB2312_CLS = ( - 1, 1, 1, 1, 1, 1, 1, 1, # 00 - 07 - 1, 1, 1, 1, 1, 1, 0, 0, # 08 - 0f - 1, 1, 1, 1, 1, 1, 1, 1, # 10 - 17 - 1, 1, 1, 0, 1, 1, 1, 1, # 18 - 1f - 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 27 - 1, 1, 1, 1, 1, 1, 1, 1, # 28 - 2f - 3, 3, 3, 3, 3, 3, 3, 3, # 30 - 37 - 3, 3, 1, 1, 1, 1, 1, 1, # 38 - 3f - 2, 2, 2, 2, 2, 2, 2, 2, # 40 - 47 - 2, 2, 2, 2, 2, 2, 2, 2, # 48 - 4f - 2, 2, 2, 2, 2, 2, 2, 2, # 50 - 57 - 2, 2, 2, 2, 2, 2, 2, 2, # 58 - 5f - 2, 2, 2, 2, 2, 2, 2, 2, # 60 - 67 - 2, 2, 2, 2, 2, 2, 2, 2, # 68 - 6f - 2, 2, 2, 2, 2, 2, 2, 2, # 70 - 77 - 2, 2, 2, 2, 2, 2, 2, 4, # 78 - 7f - 5, 6, 6, 6, 6, 6, 6, 6, # 80 - 87 - 6, 6, 6, 6, 6, 6, 6, 6, # 88 - 8f - 6, 6, 6, 6, 6, 6, 6, 6, # 90 - 97 - 6, 6, 6, 6, 6, 6, 6, 6, # 98 - 9f - 6, 6, 6, 6, 6, 6, 6, 6, # a0 - a7 - 6, 6, 6, 6, 6, 6, 6, 6, # a8 - af - 6, 6, 6, 6, 6, 6, 6, 6, # b0 - b7 - 6, 6, 6, 6, 6, 6, 6, 6, # b8 - bf - 6, 6, 6, 6, 6, 6, 6, 6, # c0 - c7 - 6, 6, 6, 6, 6, 6, 6, 6, # c8 - cf - 6, 6, 6, 6, 6, 6, 6, 6, # d0 - d7 - 6, 6, 6, 6, 6, 6, 6, 6, # d8 - df - 6, 6, 6, 6, 6, 6, 6, 6, # e0 - e7 - 6, 6, 6, 6, 6, 6, 6, 6, # e8 - ef - 6, 6, 6, 6, 6, 6, 6, 6, # f0 - f7 - 6, 6, 6, 6, 6, 6, 6, 0 # f8 - ff -) - -GB2312_ST = ( - MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, 3,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,#10-17 - 4,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f - MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#20-27 - MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f -) -# fmt: on - -# To be accurate, the length of class 6 can be either 2 or 4. -# But it is not necessary to discriminate between the two since -# it is used for frequency analysis only, and we are validating -# each code range there as well. So it is safe to set it to be -# 2 here. -GB2312_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 1, 2) - -GB2312_SM_MODEL: CodingStateMachineDict = { - "class_table": GB2312_CLS, - "class_factor": 7, - "state_table": GB2312_ST, - "char_len_table": GB2312_CHAR_LEN_TABLE, - "name": "GB2312", -} - -# Shift_JIS -# fmt: off -SJIS_CLS = ( - 1, 1, 1, 1, 1, 1, 1, 1, # 00 - 07 - 1, 1, 1, 1, 1, 1, 0, 0, # 08 - 0f - 1, 1, 1, 1, 1, 1, 1, 1, # 10 - 17 - 1, 1, 1, 0, 1, 1, 1, 1, # 18 - 1f - 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 27 - 1, 1, 1, 1, 1, 1, 1, 1, # 28 - 2f - 1, 1, 1, 1, 1, 1, 1, 1, # 30 - 37 - 1, 1, 1, 1, 1, 1, 1, 1, # 38 - 3f - 2, 2, 2, 2, 2, 2, 2, 2, # 40 - 47 - 2, 2, 2, 2, 2, 2, 2, 2, # 48 - 4f - 2, 2, 2, 2, 2, 2, 2, 2, # 50 - 57 - 2, 2, 2, 2, 2, 2, 2, 2, # 58 - 5f - 2, 2, 2, 2, 2, 2, 2, 2, # 60 - 67 - 2, 2, 2, 2, 2, 2, 2, 2, # 68 - 6f - 2, 2, 2, 2, 2, 2, 2, 2, # 70 - 77 - 2, 2, 2, 2, 2, 2, 2, 1, # 78 - 7f - 3, 3, 3, 3, 3, 2, 2, 3, # 80 - 87 - 3, 3, 3, 3, 3, 3, 3, 3, # 88 - 8f - 3, 3, 3, 3, 3, 3, 3, 3, # 90 - 97 - 3, 3, 3, 3, 3, 3, 3, 3, # 98 - 9f - #0xa0 is illegal in sjis encoding, but some pages does - #contain such byte. We need to be more error forgiven. - 2, 2, 2, 2, 2, 2, 2, 2, # a0 - a7 - 2, 2, 2, 2, 2, 2, 2, 2, # a8 - af - 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7 - 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf - 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7 - 2, 2, 2, 2, 2, 2, 2, 2, # c8 - cf - 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7 - 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df - 3, 3, 3, 3, 3, 3, 3, 3, # e0 - e7 - 3, 3, 3, 3, 3, 4, 4, 4, # e8 - ef - 3, 3, 3, 3, 3, 3, 3, 3, # f0 - f7 - 3, 3, 3, 3, 3, 0, 0, 0, # f8 - ff -) - -SJIS_ST = ( - MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START #10-17 -) -# fmt: on - -SJIS_CHAR_LEN_TABLE = (0, 1, 1, 2, 0, 0) - -SJIS_SM_MODEL: CodingStateMachineDict = { - "class_table": SJIS_CLS, - "class_factor": 6, - "state_table": SJIS_ST, - "char_len_table": SJIS_CHAR_LEN_TABLE, - "name": "Shift_JIS", -} - -# UCS2-BE -# fmt: off -UCS2BE_CLS = ( - 0, 0, 0, 0, 0, 0, 0, 0, # 00 - 07 - 0, 0, 1, 0, 0, 2, 0, 0, # 08 - 0f - 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17 - 0, 0, 0, 3, 0, 0, 0, 0, # 18 - 1f - 0, 0, 0, 0, 0, 0, 0, 0, # 20 - 27 - 0, 3, 3, 3, 3, 3, 0, 0, # 28 - 2f - 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37 - 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f - 0, 0, 0, 0, 0, 0, 0, 0, # 40 - 47 - 0, 0, 0, 0, 0, 0, 0, 0, # 48 - 4f - 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57 - 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f - 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67 - 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f - 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77 - 0, 0, 0, 0, 0, 0, 0, 0, # 78 - 7f - 0, 0, 0, 0, 0, 0, 0, 0, # 80 - 87 - 0, 0, 0, 0, 0, 0, 0, 0, # 88 - 8f - 0, 0, 0, 0, 0, 0, 0, 0, # 90 - 97 - 0, 0, 0, 0, 0, 0, 0, 0, # 98 - 9f - 0, 0, 0, 0, 0, 0, 0, 0, # a0 - a7 - 0, 0, 0, 0, 0, 0, 0, 0, # a8 - af - 0, 0, 0, 0, 0, 0, 0, 0, # b0 - b7 - 0, 0, 0, 0, 0, 0, 0, 0, # b8 - bf - 0, 0, 0, 0, 0, 0, 0, 0, # c0 - c7 - 0, 0, 0, 0, 0, 0, 0, 0, # c8 - cf - 0, 0, 0, 0, 0, 0, 0, 0, # d0 - d7 - 0, 0, 0, 0, 0, 0, 0, 0, # d8 - df - 0, 0, 0, 0, 0, 0, 0, 0, # e0 - e7 - 0, 0, 0, 0, 0, 0, 0, 0, # e8 - ef - 0, 0, 0, 0, 0, 0, 0, 0, # f0 - f7 - 0, 0, 0, 0, 0, 0, 4, 5 # f8 - ff -) - -UCS2BE_ST = ( - 5, 7, 7,MachineState.ERROR, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f - MachineState.ITS_ME,MachineState.ITS_ME, 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,#10-17 - 6, 6, 6, 6, 6,MachineState.ITS_ME, 6, 6,#18-1f - 6, 6, 6, 6, 5, 7, 7,MachineState.ERROR,#20-27 - 5, 8, 6, 6,MachineState.ERROR, 6, 6, 6,#28-2f - 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #30-37 -) -# fmt: on - -UCS2BE_CHAR_LEN_TABLE = (2, 2, 2, 0, 2, 2) - -UCS2BE_SM_MODEL: CodingStateMachineDict = { - "class_table": UCS2BE_CLS, - "class_factor": 6, - "state_table": UCS2BE_ST, - "char_len_table": UCS2BE_CHAR_LEN_TABLE, - "name": "UTF-16BE", -} - -# UCS2-LE -# fmt: off -UCS2LE_CLS = ( - 0, 0, 0, 0, 0, 0, 0, 0, # 00 - 07 - 0, 0, 1, 0, 0, 2, 0, 0, # 08 - 0f - 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17 - 0, 0, 0, 3, 0, 0, 0, 0, # 18 - 1f - 0, 0, 0, 0, 0, 0, 0, 0, # 20 - 27 - 0, 3, 3, 3, 3, 3, 0, 0, # 28 - 2f - 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37 - 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f - 0, 0, 0, 0, 0, 0, 0, 0, # 40 - 47 - 0, 0, 0, 0, 0, 0, 0, 0, # 48 - 4f - 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57 - 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f - 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67 - 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f - 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77 - 0, 0, 0, 0, 0, 0, 0, 0, # 78 - 7f - 0, 0, 0, 0, 0, 0, 0, 0, # 80 - 87 - 0, 0, 0, 0, 0, 0, 0, 0, # 88 - 8f - 0, 0, 0, 0, 0, 0, 0, 0, # 90 - 97 - 0, 0, 0, 0, 0, 0, 0, 0, # 98 - 9f - 0, 0, 0, 0, 0, 0, 0, 0, # a0 - a7 - 0, 0, 0, 0, 0, 0, 0, 0, # a8 - af - 0, 0, 0, 0, 0, 0, 0, 0, # b0 - b7 - 0, 0, 0, 0, 0, 0, 0, 0, # b8 - bf - 0, 0, 0, 0, 0, 0, 0, 0, # c0 - c7 - 0, 0, 0, 0, 0, 0, 0, 0, # c8 - cf - 0, 0, 0, 0, 0, 0, 0, 0, # d0 - d7 - 0, 0, 0, 0, 0, 0, 0, 0, # d8 - df - 0, 0, 0, 0, 0, 0, 0, 0, # e0 - e7 - 0, 0, 0, 0, 0, 0, 0, 0, # e8 - ef - 0, 0, 0, 0, 0, 0, 0, 0, # f0 - f7 - 0, 0, 0, 0, 0, 0, 4, 5 # f8 - ff -) - -UCS2LE_ST = ( - 6, 6, 7, 6, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f - MachineState.ITS_ME,MachineState.ITS_ME, 5, 5, 5,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#10-17 - 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR, 6, 6,#18-1f - 7, 6, 8, 8, 5, 5, 5,MachineState.ERROR,#20-27 - 5, 5, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5,#28-2f - 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR,MachineState.START,MachineState.START #30-37 -) -# fmt: on - -UCS2LE_CHAR_LEN_TABLE = (2, 2, 2, 2, 2, 2) - -UCS2LE_SM_MODEL: CodingStateMachineDict = { - "class_table": UCS2LE_CLS, - "class_factor": 6, - "state_table": UCS2LE_ST, - "char_len_table": UCS2LE_CHAR_LEN_TABLE, - "name": "UTF-16LE", -} - -# UTF-8 -# fmt: off -UTF8_CLS = ( - 1, 1, 1, 1, 1, 1, 1, 1, # 00 - 07 #allow 0x00 as a legal value - 1, 1, 1, 1, 1, 1, 0, 0, # 08 - 0f - 1, 1, 1, 1, 1, 1, 1, 1, # 10 - 17 - 1, 1, 1, 0, 1, 1, 1, 1, # 18 - 1f - 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 27 - 1, 1, 1, 1, 1, 1, 1, 1, # 28 - 2f - 1, 1, 1, 1, 1, 1, 1, 1, # 30 - 37 - 1, 1, 1, 1, 1, 1, 1, 1, # 38 - 3f - 1, 1, 1, 1, 1, 1, 1, 1, # 40 - 47 - 1, 1, 1, 1, 1, 1, 1, 1, # 48 - 4f - 1, 1, 1, 1, 1, 1, 1, 1, # 50 - 57 - 1, 1, 1, 1, 1, 1, 1, 1, # 58 - 5f - 1, 1, 1, 1, 1, 1, 1, 1, # 60 - 67 - 1, 1, 1, 1, 1, 1, 1, 1, # 68 - 6f - 1, 1, 1, 1, 1, 1, 1, 1, # 70 - 77 - 1, 1, 1, 1, 1, 1, 1, 1, # 78 - 7f - 2, 2, 2, 2, 3, 3, 3, 3, # 80 - 87 - 4, 4, 4, 4, 4, 4, 4, 4, # 88 - 8f - 4, 4, 4, 4, 4, 4, 4, 4, # 90 - 97 - 4, 4, 4, 4, 4, 4, 4, 4, # 98 - 9f - 5, 5, 5, 5, 5, 5, 5, 5, # a0 - a7 - 5, 5, 5, 5, 5, 5, 5, 5, # a8 - af - 5, 5, 5, 5, 5, 5, 5, 5, # b0 - b7 - 5, 5, 5, 5, 5, 5, 5, 5, # b8 - bf - 0, 0, 6, 6, 6, 6, 6, 6, # c0 - c7 - 6, 6, 6, 6, 6, 6, 6, 6, # c8 - cf - 6, 6, 6, 6, 6, 6, 6, 6, # d0 - d7 - 6, 6, 6, 6, 6, 6, 6, 6, # d8 - df - 7, 8, 8, 8, 8, 8, 8, 8, # e0 - e7 - 8, 8, 8, 8, 8, 9, 8, 8, # e8 - ef - 10, 11, 11, 11, 11, 11, 11, 11, # f0 - f7 - 12, 13, 13, 13, 14, 15, 0, 0 # f8 - ff -) - -UTF8_ST = ( - MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12, 10,#00-07 - 9, 11, 8, 7, 6, 5, 4, 3,#08-0f - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#20-27 - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#28-2f - MachineState.ERROR,MachineState.ERROR, 5, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#30-37 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#38-3f - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#40-47 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#48-4f - MachineState.ERROR,MachineState.ERROR, 7, 7, 7, 7,MachineState.ERROR,MachineState.ERROR,#50-57 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#58-5f - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 7, 7,MachineState.ERROR,MachineState.ERROR,#60-67 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#68-6f - MachineState.ERROR,MachineState.ERROR, 9, 9, 9, 9,MachineState.ERROR,MachineState.ERROR,#70-77 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#78-7f - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 9,MachineState.ERROR,MachineState.ERROR,#80-87 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#88-8f - MachineState.ERROR,MachineState.ERROR, 12, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,#90-97 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#98-9f - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12,MachineState.ERROR,MachineState.ERROR,#a0-a7 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#a8-af - MachineState.ERROR,MachineState.ERROR, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b0-b7 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b8-bf - MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,#c0-c7 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR #c8-cf -) -# fmt: on - -UTF8_CHAR_LEN_TABLE = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) - -UTF8_SM_MODEL: CodingStateMachineDict = { - "class_table": UTF8_CLS, - "class_factor": 16, - "state_table": UTF8_ST, - "char_len_table": UTF8_CHAR_LEN_TABLE, - "name": "UTF-8", -} diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 21d1756ddd15c071014715208a7ad3668ac161da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 221 zcmZ9GJqiLb5QR6cf(RbOVja|0tgO947?Z&bZhlC{l|}DiXYW}&h9?j^E3>T+-n?&y zSIl!dofKK>eyRI>_2XZkVZPjou9%74qlkmNefrM#3bnTc7CE)B_3C8FaRR1>4iRmY z*r+4LO8c{GJZg&2l53$cdk7uZ-mT_~B_zXC1yn~oP=a6r$XwGtf~qlUVz9)hkrAXc e&ajm8(0#{i>-DLjO&sNCM0V=oT?!#$ndt{y=sxHG diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-312.pyc deleted file mode 100644 index 86916ffd8c1142c6afab91a1b2fc5cad1a7c1f13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9776 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 N&W-`lltOCW{{e`r9J&Ai diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/languages.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/languages.py deleted file mode 100644 index eb40c5f..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/languages.py +++ /dev/null @@ -1,352 +0,0 @@ -""" -Metadata about languages used by our model training code for our -SingleByteCharSetProbers. Could be used for other things in the future. - -This code is based on the language metadata from the uchardet project. -""" - -from string import ascii_letters -from typing import List, Optional - -# TODO: Add Ukrainian (KOI8-U) - - -class Language: - """Metadata about a language useful for training models - - :ivar name: The human name for the language, in English. - :type name: str - :ivar iso_code: 2-letter ISO 639-1 if possible, 3-letter ISO code otherwise, - or use another catalog as a last resort. - :type iso_code: str - :ivar use_ascii: Whether or not ASCII letters should be included in trained - models. - :type use_ascii: bool - :ivar charsets: The charsets we want to support and create data for. - :type charsets: list of str - :ivar alphabet: The characters in the language's alphabet. If `use_ascii` is - `True`, you only need to add those not in the ASCII set. - :type alphabet: str - :ivar wiki_start_pages: The Wikipedia pages to start from if we're crawling - Wikipedia for training data. - :type wiki_start_pages: list of str - """ - - def __init__( - self, - name: Optional[str] = None, - iso_code: Optional[str] = None, - use_ascii: bool = True, - charsets: Optional[List[str]] = None, - alphabet: Optional[str] = None, - wiki_start_pages: Optional[List[str]] = None, - ) -> None: - super().__init__() - self.name = name - self.iso_code = iso_code - self.use_ascii = use_ascii - self.charsets = charsets - if self.use_ascii: - if alphabet: - alphabet += ascii_letters - else: - alphabet = ascii_letters - elif not alphabet: - raise ValueError("Must supply alphabet if use_ascii is False") - self.alphabet = "".join(sorted(set(alphabet))) if alphabet else None - self.wiki_start_pages = wiki_start_pages - - def __repr__(self) -> str: - param_str = ", ".join( - f"{k}={v!r}" for k, v in self.__dict__.items() if not k.startswith("_") - ) - return f"{self.__class__.__name__}({param_str})" - - -LANGUAGES = { - "Arabic": Language( - name="Arabic", - iso_code="ar", - use_ascii=False, - # We only support encodings that use isolated - # forms, because the current recommendation is - # that the rendering system handles presentation - # forms. This means we purposefully skip IBM864. - charsets=["ISO-8859-6", "WINDOWS-1256", "CP720", "CP864"], - alphabet="ءآأؤإئابةتثجحخدذرزسشصضطظعغػؼؽؾؿـفقكلمنهوىيًٌٍَُِّ", - wiki_start_pages=["الصفحة_الرئيسية"], - ), - "Belarusian": Language( - name="Belarusian", - iso_code="be", - use_ascii=False, - charsets=["ISO-8859-5", "WINDOWS-1251", "IBM866", "MacCyrillic"], - alphabet="АБВГДЕЁЖЗІЙКЛМНОПРСТУЎФХЦЧШЫЬЭЮЯабвгдеёжзійклмнопрстуўфхцчшыьэюяʼ", - wiki_start_pages=["Галоўная_старонка"], - ), - "Bulgarian": Language( - name="Bulgarian", - iso_code="bg", - use_ascii=False, - charsets=["ISO-8859-5", "WINDOWS-1251", "IBM855"], - alphabet="АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЬЮЯабвгдежзийклмнопрстуфхцчшщъьюя", - wiki_start_pages=["Начална_страница"], - ), - "Czech": Language( - name="Czech", - iso_code="cz", - use_ascii=True, - charsets=["ISO-8859-2", "WINDOWS-1250"], - alphabet="áčďéěíňóřšťúůýžÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ", - wiki_start_pages=["Hlavní_strana"], - ), - "Danish": Language( - name="Danish", - iso_code="da", - use_ascii=True, - charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"], - alphabet="æøåÆØÅ", - wiki_start_pages=["Forside"], - ), - "German": Language( - name="German", - iso_code="de", - use_ascii=True, - charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"], - alphabet="äöüßẞÄÖÜ", - wiki_start_pages=["Wikipedia:Hauptseite"], - ), - "Greek": Language( - name="Greek", - iso_code="el", - use_ascii=False, - charsets=["ISO-8859-7", "WINDOWS-1253"], - alphabet="αβγδεζηθικλμνξοπρσςτυφχψωάέήίόύώΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΣΤΥΦΧΨΩΆΈΉΊΌΎΏ", - wiki_start_pages=["Πύλη:Κύρια"], - ), - "English": Language( - name="English", - iso_code="en", - use_ascii=True, - charsets=["ISO-8859-1", "WINDOWS-1252", "MacRoman"], - wiki_start_pages=["Main_Page"], - ), - "Esperanto": Language( - name="Esperanto", - iso_code="eo", - # Q, W, X, and Y not used at all - use_ascii=False, - charsets=["ISO-8859-3"], - alphabet="abcĉdefgĝhĥijĵklmnoprsŝtuŭvzABCĈDEFGĜHĤIJĴKLMNOPRSŜTUŬVZ", - wiki_start_pages=["Vikipedio:Ĉefpaĝo"], - ), - "Spanish": Language( - name="Spanish", - iso_code="es", - use_ascii=True, - charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"], - alphabet="ñáéíóúüÑÁÉÍÓÚÜ", - wiki_start_pages=["Wikipedia:Portada"], - ), - "Estonian": Language( - name="Estonian", - iso_code="et", - use_ascii=False, - charsets=["ISO-8859-4", "ISO-8859-13", "WINDOWS-1257"], - # C, F, Š, Q, W, X, Y, Z, Ž are only for - # loanwords - alphabet="ABDEGHIJKLMNOPRSTUVÕÄÖÜabdeghijklmnoprstuvõäöü", - wiki_start_pages=["Esileht"], - ), - "Finnish": Language( - name="Finnish", - iso_code="fi", - use_ascii=True, - charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"], - alphabet="ÅÄÖŠŽåäöšž", - wiki_start_pages=["Wikipedia:Etusivu"], - ), - "French": Language( - name="French", - iso_code="fr", - use_ascii=True, - charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"], - alphabet="œàâçèéîïùûêŒÀÂÇÈÉÎÏÙÛÊ", - wiki_start_pages=["Wikipédia:Accueil_principal", "Bœuf (animal)"], - ), - "Hebrew": Language( - name="Hebrew", - iso_code="he", - use_ascii=False, - charsets=["ISO-8859-8", "WINDOWS-1255"], - alphabet="אבגדהוזחטיךכלםמןנסעףפץצקרשתװױײ", - wiki_start_pages=["עמוד_ראשי"], - ), - "Croatian": Language( - name="Croatian", - iso_code="hr", - # Q, W, X, Y are only used for foreign words. - use_ascii=False, - charsets=["ISO-8859-2", "WINDOWS-1250"], - alphabet="abcčćdđefghijklmnoprsštuvzžABCČĆDĐEFGHIJKLMNOPRSŠTUVZŽ", - wiki_start_pages=["Glavna_stranica"], - ), - "Hungarian": Language( - name="Hungarian", - iso_code="hu", - # Q, W, X, Y are only used for foreign words. - use_ascii=False, - charsets=["ISO-8859-2", "WINDOWS-1250"], - alphabet="abcdefghijklmnoprstuvzáéíóöőúüűABCDEFGHIJKLMNOPRSTUVZÁÉÍÓÖŐÚÜŰ", - wiki_start_pages=["Kezdőlap"], - ), - "Italian": Language( - name="Italian", - iso_code="it", - use_ascii=True, - charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"], - alphabet="ÀÈÉÌÒÓÙàèéìòóù", - wiki_start_pages=["Pagina_principale"], - ), - "Lithuanian": Language( - name="Lithuanian", - iso_code="lt", - use_ascii=False, - charsets=["ISO-8859-13", "WINDOWS-1257", "ISO-8859-4"], - # Q, W, and X not used at all - alphabet="AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽaąbcčdeęėfghiįyjklmnoprsštuųūvzž", - wiki_start_pages=["Pagrindinis_puslapis"], - ), - "Latvian": Language( - name="Latvian", - iso_code="lv", - use_ascii=False, - charsets=["ISO-8859-13", "WINDOWS-1257", "ISO-8859-4"], - # Q, W, X, Y are only for loanwords - alphabet="AĀBCČDEĒFGĢHIĪJKĶLĻMNŅOPRSŠTUŪVZŽaābcčdeēfgģhiījkķlļmnņoprsštuūvzž", - wiki_start_pages=["Sākumlapa"], - ), - "Macedonian": Language( - name="Macedonian", - iso_code="mk", - use_ascii=False, - charsets=["ISO-8859-5", "WINDOWS-1251", "MacCyrillic", "IBM855"], - alphabet="АБВГДЃЕЖЗЅИЈКЛЉМНЊОПРСТЌУФХЦЧЏШабвгдѓежзѕијклљмнњопрстќуфхцчџш", - wiki_start_pages=["Главна_страница"], - ), - "Dutch": Language( - name="Dutch", - iso_code="nl", - use_ascii=True, - charsets=["ISO-8859-1", "WINDOWS-1252", "MacRoman"], - wiki_start_pages=["Hoofdpagina"], - ), - "Polish": Language( - name="Polish", - iso_code="pl", - # Q and X are only used for foreign words. - use_ascii=False, - charsets=["ISO-8859-2", "WINDOWS-1250"], - alphabet="AĄBCĆDEĘFGHIJKLŁMNŃOÓPRSŚTUWYZŹŻaąbcćdeęfghijklłmnńoóprsśtuwyzźż", - wiki_start_pages=["Wikipedia:Strona_główna"], - ), - "Portuguese": Language( - name="Portuguese", - iso_code="pt", - use_ascii=True, - charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"], - alphabet="ÁÂÃÀÇÉÊÍÓÔÕÚáâãàçéêíóôõú", - wiki_start_pages=["Wikipédia:Página_principal"], - ), - "Romanian": Language( - name="Romanian", - iso_code="ro", - use_ascii=True, - charsets=["ISO-8859-2", "WINDOWS-1250"], - alphabet="ăâîșțĂÂÎȘȚ", - wiki_start_pages=["Pagina_principală"], - ), - "Russian": Language( - name="Russian", - iso_code="ru", - use_ascii=False, - charsets=[ - "ISO-8859-5", - "WINDOWS-1251", - "KOI8-R", - "MacCyrillic", - "IBM866", - "IBM855", - ], - alphabet="абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ", - wiki_start_pages=["Заглавная_страница"], - ), - "Slovak": Language( - name="Slovak", - iso_code="sk", - use_ascii=True, - charsets=["ISO-8859-2", "WINDOWS-1250"], - alphabet="áäčďéíĺľňóôŕšťúýžÁÄČĎÉÍĹĽŇÓÔŔŠŤÚÝŽ", - wiki_start_pages=["Hlavná_stránka"], - ), - "Slovene": Language( - name="Slovene", - iso_code="sl", - # Q, W, X, Y are only used for foreign words. - use_ascii=False, - charsets=["ISO-8859-2", "WINDOWS-1250"], - alphabet="abcčdefghijklmnoprsštuvzžABCČDEFGHIJKLMNOPRSŠTUVZŽ", - wiki_start_pages=["Glavna_stran"], - ), - # Serbian can be written in both Latin and Cyrillic, but there's no - # simple way to get the Latin alphabet pages from Wikipedia through - # the API, so for now we just support Cyrillic. - "Serbian": Language( - name="Serbian", - iso_code="sr", - alphabet="АБВГДЂЕЖЗИЈКЛЉМНЊОПРСТЋУФХЦЧЏШабвгдђежзијклљмнњопрстћуфхцчџш", - charsets=["ISO-8859-5", "WINDOWS-1251", "MacCyrillic", "IBM855"], - wiki_start_pages=["Главна_страна"], - ), - "Thai": Language( - name="Thai", - iso_code="th", - use_ascii=False, - charsets=["ISO-8859-11", "TIS-620", "CP874"], - alphabet="กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛", - wiki_start_pages=["หน้าหลัก"], - ), - "Turkish": Language( - name="Turkish", - iso_code="tr", - # Q, W, and X are not used by Turkish - use_ascii=False, - charsets=["ISO-8859-3", "ISO-8859-9", "WINDOWS-1254"], - alphabet="abcçdefgğhıijklmnoöprsştuüvyzâîûABCÇDEFGĞHIİJKLMNOÖPRSŞTUÜVYZÂÎÛ", - wiki_start_pages=["Ana_Sayfa"], - ), - "Vietnamese": Language( - name="Vietnamese", - iso_code="vi", - use_ascii=False, - # Windows-1258 is the only common 8-bit - # Vietnamese encoding supported by Python. - # From Wikipedia: - # For systems that lack support for Unicode, - # dozens of 8-bit Vietnamese code pages are - # available.[1] The most common are VISCII - # (TCVN 5712:1993), VPS, and Windows-1258.[3] - # Where ASCII is required, such as when - # ensuring readability in plain text e-mail, - # Vietnamese letters are often encoded - # according to Vietnamese Quoted-Readable - # (VIQR) or VSCII Mnemonic (VSCII-MNEM),[4] - # though usage of either variable-width - # scheme has declined dramatically following - # the adoption of Unicode on the World Wide - # Web. - charsets=["WINDOWS-1258"], - alphabet="aăâbcdđeêghiklmnoôơpqrstuưvxyAĂÂBCDĐEÊGHIKLMNOÔƠPQRSTUƯVXY", - wiki_start_pages=["Chữ_Quốc_ngữ"], - ), -} diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/resultdict.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/resultdict.py deleted file mode 100644 index 7d36e64..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/resultdict.py +++ /dev/null @@ -1,16 +0,0 @@ -from typing import TYPE_CHECKING, Optional - -if TYPE_CHECKING: - # TypedDict was introduced in Python 3.8. - # - # TODO: Remove the else block and TYPE_CHECKING check when dropping support - # for Python 3.7. - from typing import TypedDict - - class ResultDict(TypedDict): - encoding: Optional[str] - confidence: float - language: Optional[str] - -else: - ResultDict = dict diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcharsetprober.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcharsetprober.py deleted file mode 100644 index 0ffbcdd..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcharsetprober.py +++ /dev/null @@ -1,162 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from typing import Dict, List, NamedTuple, Optional, Union - -from .charsetprober import CharSetProber -from .enums import CharacterCategory, ProbingState, SequenceLikelihood - - -class SingleByteCharSetModel(NamedTuple): - charset_name: str - language: str - char_to_order_map: Dict[int, int] - language_model: Dict[int, Dict[int, int]] - typical_positive_ratio: float - keep_ascii_letters: bool - alphabet: str - - -class SingleByteCharSetProber(CharSetProber): - SAMPLE_SIZE = 64 - SB_ENOUGH_REL_THRESHOLD = 1024 # 0.25 * SAMPLE_SIZE^2 - POSITIVE_SHORTCUT_THRESHOLD = 0.95 - NEGATIVE_SHORTCUT_THRESHOLD = 0.05 - - def __init__( - self, - model: SingleByteCharSetModel, - is_reversed: bool = False, - name_prober: Optional[CharSetProber] = None, - ) -> None: - super().__init__() - self._model = model - # TRUE if we need to reverse every pair in the model lookup - self._reversed = is_reversed - # Optional auxiliary prober for name decision - self._name_prober = name_prober - self._last_order = 255 - self._seq_counters: List[int] = [] - self._total_seqs = 0 - self._total_char = 0 - self._control_char = 0 - self._freq_char = 0 - self.reset() - - def reset(self) -> None: - super().reset() - # char order of last character - self._last_order = 255 - self._seq_counters = [0] * SequenceLikelihood.get_num_categories() - self._total_seqs = 0 - self._total_char = 0 - self._control_char = 0 - # characters that fall in our sampling range - self._freq_char = 0 - - @property - def charset_name(self) -> Optional[str]: - if self._name_prober: - return self._name_prober.charset_name - return self._model.charset_name - - @property - def language(self) -> Optional[str]: - if self._name_prober: - return self._name_prober.language - return self._model.language - - def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: - # TODO: Make filter_international_words keep things in self.alphabet - if not self._model.keep_ascii_letters: - byte_str = self.filter_international_words(byte_str) - else: - byte_str = self.remove_xml_tags(byte_str) - if not byte_str: - return self.state - char_to_order_map = self._model.char_to_order_map - language_model = self._model.language_model - for char in byte_str: - order = char_to_order_map.get(char, CharacterCategory.UNDEFINED) - # XXX: This was SYMBOL_CAT_ORDER before, with a value of 250, but - # CharacterCategory.SYMBOL is actually 253, so we use CONTROL - # to make it closer to the original intent. The only difference - # is whether or not we count digits and control characters for - # _total_char purposes. - if order < CharacterCategory.CONTROL: - self._total_char += 1 - if order < self.SAMPLE_SIZE: - self._freq_char += 1 - if self._last_order < self.SAMPLE_SIZE: - self._total_seqs += 1 - if not self._reversed: - lm_cat = language_model[self._last_order][order] - else: - lm_cat = language_model[order][self._last_order] - self._seq_counters[lm_cat] += 1 - self._last_order = order - - charset_name = self._model.charset_name - if self.state == ProbingState.DETECTING: - if self._total_seqs > self.SB_ENOUGH_REL_THRESHOLD: - confidence = self.get_confidence() - if confidence > self.POSITIVE_SHORTCUT_THRESHOLD: - self.logger.debug( - "%s confidence = %s, we have a winner", charset_name, confidence - ) - self._state = ProbingState.FOUND_IT - elif confidence < self.NEGATIVE_SHORTCUT_THRESHOLD: - self.logger.debug( - "%s confidence = %s, below negative shortcut threshold %s", - charset_name, - confidence, - self.NEGATIVE_SHORTCUT_THRESHOLD, - ) - self._state = ProbingState.NOT_ME - - return self.state - - def get_confidence(self) -> float: - r = 0.01 - if self._total_seqs > 0: - r = ( - ( - self._seq_counters[SequenceLikelihood.POSITIVE] - + 0.25 * self._seq_counters[SequenceLikelihood.LIKELY] - ) - / self._total_seqs - / self._model.typical_positive_ratio - ) - # The more control characters (proportionnaly to the size - # of the text), the less confident we become in the current - # charset. - r = r * (self._total_char - self._control_char) / self._total_char - r = r * self._freq_char / self._total_char - if r >= 1.0: - r = 0.99 - return r diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcsgroupprober.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcsgroupprober.py deleted file mode 100644 index 890ae84..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcsgroupprober.py +++ /dev/null @@ -1,88 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetgroupprober import CharSetGroupProber -from .hebrewprober import HebrewProber -from .langbulgarianmodel import ISO_8859_5_BULGARIAN_MODEL, WINDOWS_1251_BULGARIAN_MODEL -from .langgreekmodel import ISO_8859_7_GREEK_MODEL, WINDOWS_1253_GREEK_MODEL -from .langhebrewmodel import WINDOWS_1255_HEBREW_MODEL - -# from .langhungarianmodel import (ISO_8859_2_HUNGARIAN_MODEL, -# WINDOWS_1250_HUNGARIAN_MODEL) -from .langrussianmodel import ( - IBM855_RUSSIAN_MODEL, - IBM866_RUSSIAN_MODEL, - ISO_8859_5_RUSSIAN_MODEL, - KOI8_R_RUSSIAN_MODEL, - MACCYRILLIC_RUSSIAN_MODEL, - WINDOWS_1251_RUSSIAN_MODEL, -) -from .langthaimodel import TIS_620_THAI_MODEL -from .langturkishmodel import ISO_8859_9_TURKISH_MODEL -from .sbcharsetprober import SingleByteCharSetProber - - -class SBCSGroupProber(CharSetGroupProber): - def __init__(self) -> None: - super().__init__() - hebrew_prober = HebrewProber() - logical_hebrew_prober = SingleByteCharSetProber( - WINDOWS_1255_HEBREW_MODEL, is_reversed=False, name_prober=hebrew_prober - ) - # TODO: See if using ISO-8859-8 Hebrew model works better here, since - # it's actually the visual one - visual_hebrew_prober = SingleByteCharSetProber( - WINDOWS_1255_HEBREW_MODEL, is_reversed=True, name_prober=hebrew_prober - ) - hebrew_prober.set_model_probers(logical_hebrew_prober, visual_hebrew_prober) - # TODO: ORDER MATTERS HERE. I changed the order vs what was in master - # and several tests failed that did not before. Some thought - # should be put into the ordering, and we should consider making - # order not matter here, because that is very counter-intuitive. - self.probers = [ - SingleByteCharSetProber(WINDOWS_1251_RUSSIAN_MODEL), - SingleByteCharSetProber(KOI8_R_RUSSIAN_MODEL), - SingleByteCharSetProber(ISO_8859_5_RUSSIAN_MODEL), - SingleByteCharSetProber(MACCYRILLIC_RUSSIAN_MODEL), - SingleByteCharSetProber(IBM866_RUSSIAN_MODEL), - SingleByteCharSetProber(IBM855_RUSSIAN_MODEL), - SingleByteCharSetProber(ISO_8859_7_GREEK_MODEL), - SingleByteCharSetProber(WINDOWS_1253_GREEK_MODEL), - SingleByteCharSetProber(ISO_8859_5_BULGARIAN_MODEL), - SingleByteCharSetProber(WINDOWS_1251_BULGARIAN_MODEL), - # TODO: Restore Hungarian encodings (iso-8859-2 and windows-1250) - # after we retrain model. - # SingleByteCharSetProber(ISO_8859_2_HUNGARIAN_MODEL), - # SingleByteCharSetProber(WINDOWS_1250_HUNGARIAN_MODEL), - SingleByteCharSetProber(TIS_620_THAI_MODEL), - SingleByteCharSetProber(ISO_8859_9_TURKISH_MODEL), - hebrew_prober, - logical_hebrew_prober, - visual_hebrew_prober, - ] - self.reset() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/sjisprober.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/sjisprober.py deleted file mode 100644 index 91df077..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/sjisprober.py +++ /dev/null @@ -1,105 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from typing import Union - -from .chardistribution import SJISDistributionAnalysis -from .codingstatemachine import CodingStateMachine -from .enums import MachineState, ProbingState -from .jpcntx import SJISContextAnalysis -from .mbcharsetprober import MultiByteCharSetProber -from .mbcssm import SJIS_SM_MODEL - - -class SJISProber(MultiByteCharSetProber): - def __init__(self) -> None: - super().__init__() - self.coding_sm = CodingStateMachine(SJIS_SM_MODEL) - self.distribution_analyzer = SJISDistributionAnalysis() - self.context_analyzer = SJISContextAnalysis() - self.reset() - - def reset(self) -> None: - super().reset() - self.context_analyzer.reset() - - @property - def charset_name(self) -> str: - return self.context_analyzer.charset_name - - @property - def language(self) -> str: - return "Japanese" - - def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: - assert self.coding_sm is not None - assert self.distribution_analyzer is not None - - for i, byte in enumerate(byte_str): - coding_state = self.coding_sm.next_state(byte) - if coding_state == MachineState.ERROR: - self.logger.debug( - "%s %s prober hit error at byte %s", - self.charset_name, - self.language, - i, - ) - self._state = ProbingState.NOT_ME - break - if coding_state == MachineState.ITS_ME: - self._state = ProbingState.FOUND_IT - break - if coding_state == MachineState.START: - char_len = self.coding_sm.get_current_charlen() - if i == 0: - self._last_char[1] = byte - self.context_analyzer.feed( - self._last_char[2 - char_len :], char_len - ) - self.distribution_analyzer.feed(self._last_char, char_len) - else: - self.context_analyzer.feed( - byte_str[i + 1 - char_len : i + 3 - char_len], char_len - ) - self.distribution_analyzer.feed(byte_str[i - 1 : i + 1], char_len) - - self._last_char[0] = byte_str[-1] - - if self.state == ProbingState.DETECTING: - if self.context_analyzer.got_enough_data() and ( - self.get_confidence() > self.SHORTCUT_THRESHOLD - ): - self._state = ProbingState.FOUND_IT - - return self.state - - def get_confidence(self) -> float: - assert self.distribution_analyzer is not None - - context_conf = self.context_analyzer.get_confidence() - distrib_conf = self.distribution_analyzer.get_confidence() - return max(context_conf, distrib_conf) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/universaldetector.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/universaldetector.py deleted file mode 100644 index 30c441d..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/universaldetector.py +++ /dev/null @@ -1,362 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### -""" -Module containing the UniversalDetector detector class, which is the primary -class a user of ``chardet`` should use. - -:author: Mark Pilgrim (initial port to Python) -:author: Shy Shalom (original C code) -:author: Dan Blanchard (major refactoring for 3.0) -:author: Ian Cordasco -""" - - -import codecs -import logging -import re -from typing import List, Optional, Union - -from .charsetgroupprober import CharSetGroupProber -from .charsetprober import CharSetProber -from .enums import InputState, LanguageFilter, ProbingState -from .escprober import EscCharSetProber -from .latin1prober import Latin1Prober -from .macromanprober import MacRomanProber -from .mbcsgroupprober import MBCSGroupProber -from .resultdict import ResultDict -from .sbcsgroupprober import SBCSGroupProber -from .utf1632prober import UTF1632Prober - - -class UniversalDetector: - """ - The ``UniversalDetector`` class underlies the ``chardet.detect`` function - and coordinates all of the different charset probers. - - To get a ``dict`` containing an encoding and its confidence, you can simply - run: - - .. code:: - - u = UniversalDetector() - u.feed(some_bytes) - u.close() - detected = u.result - - """ - - MINIMUM_THRESHOLD = 0.20 - HIGH_BYTE_DETECTOR = re.compile(b"[\x80-\xFF]") - ESC_DETECTOR = re.compile(b"(\033|~{)") - WIN_BYTE_DETECTOR = re.compile(b"[\x80-\x9F]") - ISO_WIN_MAP = { - "iso-8859-1": "Windows-1252", - "iso-8859-2": "Windows-1250", - "iso-8859-5": "Windows-1251", - "iso-8859-6": "Windows-1256", - "iso-8859-7": "Windows-1253", - "iso-8859-8": "Windows-1255", - "iso-8859-9": "Windows-1254", - "iso-8859-13": "Windows-1257", - } - # Based on https://encoding.spec.whatwg.org/#names-and-labels - # but altered to match Python names for encodings and remove mappings - # that break tests. - LEGACY_MAP = { - "ascii": "Windows-1252", - "iso-8859-1": "Windows-1252", - "tis-620": "ISO-8859-11", - "iso-8859-9": "Windows-1254", - "gb2312": "GB18030", - "euc-kr": "CP949", - "utf-16le": "UTF-16", - } - - def __init__( - self, - lang_filter: LanguageFilter = LanguageFilter.ALL, - should_rename_legacy: bool = False, - ) -> None: - self._esc_charset_prober: Optional[EscCharSetProber] = None - self._utf1632_prober: Optional[UTF1632Prober] = None - self._charset_probers: List[CharSetProber] = [] - self.result: ResultDict = { - "encoding": None, - "confidence": 0.0, - "language": None, - } - self.done = False - self._got_data = False - self._input_state = InputState.PURE_ASCII - self._last_char = b"" - self.lang_filter = lang_filter - self.logger = logging.getLogger(__name__) - self._has_win_bytes = False - self.should_rename_legacy = should_rename_legacy - self.reset() - - @property - def input_state(self) -> int: - return self._input_state - - @property - def has_win_bytes(self) -> bool: - return self._has_win_bytes - - @property - def charset_probers(self) -> List[CharSetProber]: - return self._charset_probers - - def reset(self) -> None: - """ - Reset the UniversalDetector and all of its probers back to their - initial states. This is called by ``__init__``, so you only need to - call this directly in between analyses of different documents. - """ - self.result = {"encoding": None, "confidence": 0.0, "language": None} - self.done = False - self._got_data = False - self._has_win_bytes = False - self._input_state = InputState.PURE_ASCII - self._last_char = b"" - if self._esc_charset_prober: - self._esc_charset_prober.reset() - if self._utf1632_prober: - self._utf1632_prober.reset() - for prober in self._charset_probers: - prober.reset() - - def feed(self, byte_str: Union[bytes, bytearray]) -> None: - """ - Takes a chunk of a document and feeds it through all of the relevant - charset probers. - - After calling ``feed``, you can check the value of the ``done`` - attribute to see if you need to continue feeding the - ``UniversalDetector`` more data, or if it has made a prediction - (in the ``result`` attribute). - - .. note:: - You should always call ``close`` when you're done feeding in your - document if ``done`` is not already ``True``. - """ - if self.done: - return - - if not byte_str: - return - - if not isinstance(byte_str, bytearray): - byte_str = bytearray(byte_str) - - # First check for known BOMs, since these are guaranteed to be correct - if not self._got_data: - # If the data starts with BOM, we know it is UTF - if byte_str.startswith(codecs.BOM_UTF8): - # EF BB BF UTF-8 with BOM - self.result = { - "encoding": "UTF-8-SIG", - "confidence": 1.0, - "language": "", - } - elif byte_str.startswith((codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE)): - # FF FE 00 00 UTF-32, little-endian BOM - # 00 00 FE FF UTF-32, big-endian BOM - self.result = {"encoding": "UTF-32", "confidence": 1.0, "language": ""} - elif byte_str.startswith(b"\xFE\xFF\x00\x00"): - # FE FF 00 00 UCS-4, unusual octet order BOM (3412) - self.result = { - # TODO: This encoding is not supported by Python. Should remove? - "encoding": "X-ISO-10646-UCS-4-3412", - "confidence": 1.0, - "language": "", - } - elif byte_str.startswith(b"\x00\x00\xFF\xFE"): - # 00 00 FF FE UCS-4, unusual octet order BOM (2143) - self.result = { - # TODO: This encoding is not supported by Python. Should remove? - "encoding": "X-ISO-10646-UCS-4-2143", - "confidence": 1.0, - "language": "", - } - elif byte_str.startswith((codecs.BOM_LE, codecs.BOM_BE)): - # FF FE UTF-16, little endian BOM - # FE FF UTF-16, big endian BOM - self.result = {"encoding": "UTF-16", "confidence": 1.0, "language": ""} - - self._got_data = True - if self.result["encoding"] is not None: - self.done = True - return - - # If none of those matched and we've only see ASCII so far, check - # for high bytes and escape sequences - if self._input_state == InputState.PURE_ASCII: - if self.HIGH_BYTE_DETECTOR.search(byte_str): - self._input_state = InputState.HIGH_BYTE - elif ( - self._input_state == InputState.PURE_ASCII - and self.ESC_DETECTOR.search(self._last_char + byte_str) - ): - self._input_state = InputState.ESC_ASCII - - self._last_char = byte_str[-1:] - - # next we will look to see if it is appears to be either a UTF-16 or - # UTF-32 encoding - if not self._utf1632_prober: - self._utf1632_prober = UTF1632Prober() - - if self._utf1632_prober.state == ProbingState.DETECTING: - if self._utf1632_prober.feed(byte_str) == ProbingState.FOUND_IT: - self.result = { - "encoding": self._utf1632_prober.charset_name, - "confidence": self._utf1632_prober.get_confidence(), - "language": "", - } - self.done = True - return - - # If we've seen escape sequences, use the EscCharSetProber, which - # uses a simple state machine to check for known escape sequences in - # HZ and ISO-2022 encodings, since those are the only encodings that - # use such sequences. - if self._input_state == InputState.ESC_ASCII: - if not self._esc_charset_prober: - self._esc_charset_prober = EscCharSetProber(self.lang_filter) - if self._esc_charset_prober.feed(byte_str) == ProbingState.FOUND_IT: - self.result = { - "encoding": self._esc_charset_prober.charset_name, - "confidence": self._esc_charset_prober.get_confidence(), - "language": self._esc_charset_prober.language, - } - self.done = True - # If we've seen high bytes (i.e., those with values greater than 127), - # we need to do more complicated checks using all our multi-byte and - # single-byte probers that are left. The single-byte probers - # use character bigram distributions to determine the encoding, whereas - # the multi-byte probers use a combination of character unigram and - # bigram distributions. - elif self._input_state == InputState.HIGH_BYTE: - if not self._charset_probers: - self._charset_probers = [MBCSGroupProber(self.lang_filter)] - # If we're checking non-CJK encodings, use single-byte prober - if self.lang_filter & LanguageFilter.NON_CJK: - self._charset_probers.append(SBCSGroupProber()) - self._charset_probers.append(Latin1Prober()) - self._charset_probers.append(MacRomanProber()) - for prober in self._charset_probers: - if prober.feed(byte_str) == ProbingState.FOUND_IT: - self.result = { - "encoding": prober.charset_name, - "confidence": prober.get_confidence(), - "language": prober.language, - } - self.done = True - break - if self.WIN_BYTE_DETECTOR.search(byte_str): - self._has_win_bytes = True - - def close(self) -> ResultDict: - """ - Stop analyzing the current document and come up with a final - prediction. - - :returns: The ``result`` attribute, a ``dict`` with the keys - `encoding`, `confidence`, and `language`. - """ - # Don't bother with checks if we're already done - if self.done: - return self.result - self.done = True - - if not self._got_data: - self.logger.debug("no data received!") - - # Default to ASCII if it is all we've seen so far - elif self._input_state == InputState.PURE_ASCII: - self.result = {"encoding": "ascii", "confidence": 1.0, "language": ""} - - # If we have seen non-ASCII, return the best that met MINIMUM_THRESHOLD - elif self._input_state == InputState.HIGH_BYTE: - prober_confidence = None - max_prober_confidence = 0.0 - max_prober = None - for prober in self._charset_probers: - if not prober: - continue - prober_confidence = prober.get_confidence() - if prober_confidence > max_prober_confidence: - max_prober_confidence = prober_confidence - max_prober = prober - if max_prober and (max_prober_confidence > self.MINIMUM_THRESHOLD): - charset_name = max_prober.charset_name - assert charset_name is not None - lower_charset_name = charset_name.lower() - confidence = max_prober.get_confidence() - # Use Windows encoding name instead of ISO-8859 if we saw any - # extra Windows-specific bytes - if lower_charset_name.startswith("iso-8859"): - if self._has_win_bytes: - charset_name = self.ISO_WIN_MAP.get( - lower_charset_name, charset_name - ) - # Rename legacy encodings with superset encodings if asked - if self.should_rename_legacy: - charset_name = self.LEGACY_MAP.get( - (charset_name or "").lower(), charset_name - ) - self.result = { - "encoding": charset_name, - "confidence": confidence, - "language": max_prober.language, - } - - # Log all prober confidences if none met MINIMUM_THRESHOLD - if self.logger.getEffectiveLevel() <= logging.DEBUG: - if self.result["encoding"] is None: - self.logger.debug("no probers hit minimum threshold") - for group_prober in self._charset_probers: - if not group_prober: - continue - if isinstance(group_prober, CharSetGroupProber): - for prober in group_prober.probers: - self.logger.debug( - "%s %s confidence = %s", - prober.charset_name, - prober.language, - prober.get_confidence(), - ) - else: - self.logger.debug( - "%s %s confidence = %s", - group_prober.charset_name, - group_prober.language, - group_prober.get_confidence(), - ) - return self.result diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/utf1632prober.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/utf1632prober.py deleted file mode 100644 index 6bdec63..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/utf1632prober.py +++ /dev/null @@ -1,225 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# -# Contributor(s): -# Jason Zavaglia -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### -from typing import List, Union - -from .charsetprober import CharSetProber -from .enums import ProbingState - - -class UTF1632Prober(CharSetProber): - """ - This class simply looks for occurrences of zero bytes, and infers - whether the file is UTF16 or UTF32 (low-endian or big-endian) - For instance, files looking like ( \0 \0 \0 [nonzero] )+ - have a good probability to be UTF32BE. Files looking like ( \0 [nonzero] )+ - may be guessed to be UTF16BE, and inversely for little-endian varieties. - """ - - # how many logical characters to scan before feeling confident of prediction - MIN_CHARS_FOR_DETECTION = 20 - # a fixed constant ratio of expected zeros or non-zeros in modulo-position. - EXPECTED_RATIO = 0.94 - - def __init__(self) -> None: - super().__init__() - self.position = 0 - self.zeros_at_mod = [0] * 4 - self.nonzeros_at_mod = [0] * 4 - self._state = ProbingState.DETECTING - self.quad = [0, 0, 0, 0] - self.invalid_utf16be = False - self.invalid_utf16le = False - self.invalid_utf32be = False - self.invalid_utf32le = False - self.first_half_surrogate_pair_detected_16be = False - self.first_half_surrogate_pair_detected_16le = False - self.reset() - - def reset(self) -> None: - super().reset() - self.position = 0 - self.zeros_at_mod = [0] * 4 - self.nonzeros_at_mod = [0] * 4 - self._state = ProbingState.DETECTING - self.invalid_utf16be = False - self.invalid_utf16le = False - self.invalid_utf32be = False - self.invalid_utf32le = False - self.first_half_surrogate_pair_detected_16be = False - self.first_half_surrogate_pair_detected_16le = False - self.quad = [0, 0, 0, 0] - - @property - def charset_name(self) -> str: - if self.is_likely_utf32be(): - return "utf-32be" - if self.is_likely_utf32le(): - return "utf-32le" - if self.is_likely_utf16be(): - return "utf-16be" - if self.is_likely_utf16le(): - return "utf-16le" - # default to something valid - return "utf-16" - - @property - def language(self) -> str: - return "" - - def approx_32bit_chars(self) -> float: - return max(1.0, self.position / 4.0) - - def approx_16bit_chars(self) -> float: - return max(1.0, self.position / 2.0) - - def is_likely_utf32be(self) -> bool: - approx_chars = self.approx_32bit_chars() - return approx_chars >= self.MIN_CHARS_FOR_DETECTION and ( - self.zeros_at_mod[0] / approx_chars > self.EXPECTED_RATIO - and self.zeros_at_mod[1] / approx_chars > self.EXPECTED_RATIO - and self.zeros_at_mod[2] / approx_chars > self.EXPECTED_RATIO - and self.nonzeros_at_mod[3] / approx_chars > self.EXPECTED_RATIO - and not self.invalid_utf32be - ) - - def is_likely_utf32le(self) -> bool: - approx_chars = self.approx_32bit_chars() - return approx_chars >= self.MIN_CHARS_FOR_DETECTION and ( - self.nonzeros_at_mod[0] / approx_chars > self.EXPECTED_RATIO - and self.zeros_at_mod[1] / approx_chars > self.EXPECTED_RATIO - and self.zeros_at_mod[2] / approx_chars > self.EXPECTED_RATIO - and self.zeros_at_mod[3] / approx_chars > self.EXPECTED_RATIO - and not self.invalid_utf32le - ) - - def is_likely_utf16be(self) -> bool: - approx_chars = self.approx_16bit_chars() - return approx_chars >= self.MIN_CHARS_FOR_DETECTION and ( - (self.nonzeros_at_mod[1] + self.nonzeros_at_mod[3]) / approx_chars - > self.EXPECTED_RATIO - and (self.zeros_at_mod[0] + self.zeros_at_mod[2]) / approx_chars - > self.EXPECTED_RATIO - and not self.invalid_utf16be - ) - - def is_likely_utf16le(self) -> bool: - approx_chars = self.approx_16bit_chars() - return approx_chars >= self.MIN_CHARS_FOR_DETECTION and ( - (self.nonzeros_at_mod[0] + self.nonzeros_at_mod[2]) / approx_chars - > self.EXPECTED_RATIO - and (self.zeros_at_mod[1] + self.zeros_at_mod[3]) / approx_chars - > self.EXPECTED_RATIO - and not self.invalid_utf16le - ) - - def validate_utf32_characters(self, quad: List[int]) -> None: - """ - Validate if the quad of bytes is valid UTF-32. - - UTF-32 is valid in the range 0x00000000 - 0x0010FFFF - excluding 0x0000D800 - 0x0000DFFF - - https://en.wikipedia.org/wiki/UTF-32 - """ - if ( - quad[0] != 0 - or quad[1] > 0x10 - or (quad[0] == 0 and quad[1] == 0 and 0xD8 <= quad[2] <= 0xDF) - ): - self.invalid_utf32be = True - if ( - quad[3] != 0 - or quad[2] > 0x10 - or (quad[3] == 0 and quad[2] == 0 and 0xD8 <= quad[1] <= 0xDF) - ): - self.invalid_utf32le = True - - def validate_utf16_characters(self, pair: List[int]) -> None: - """ - Validate if the pair of bytes is valid UTF-16. - - UTF-16 is valid in the range 0x0000 - 0xFFFF excluding 0xD800 - 0xFFFF - with an exception for surrogate pairs, which must be in the range - 0xD800-0xDBFF followed by 0xDC00-0xDFFF - - https://en.wikipedia.org/wiki/UTF-16 - """ - if not self.first_half_surrogate_pair_detected_16be: - if 0xD8 <= pair[0] <= 0xDB: - self.first_half_surrogate_pair_detected_16be = True - elif 0xDC <= pair[0] <= 0xDF: - self.invalid_utf16be = True - else: - if 0xDC <= pair[0] <= 0xDF: - self.first_half_surrogate_pair_detected_16be = False - else: - self.invalid_utf16be = True - - if not self.first_half_surrogate_pair_detected_16le: - if 0xD8 <= pair[1] <= 0xDB: - self.first_half_surrogate_pair_detected_16le = True - elif 0xDC <= pair[1] <= 0xDF: - self.invalid_utf16le = True - else: - if 0xDC <= pair[1] <= 0xDF: - self.first_half_surrogate_pair_detected_16le = False - else: - self.invalid_utf16le = True - - def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: - for c in byte_str: - mod4 = self.position % 4 - self.quad[mod4] = c - if mod4 == 3: - self.validate_utf32_characters(self.quad) - self.validate_utf16_characters(self.quad[0:2]) - self.validate_utf16_characters(self.quad[2:4]) - if c == 0: - self.zeros_at_mod[mod4] += 1 - else: - self.nonzeros_at_mod[mod4] += 1 - self.position += 1 - return self.state - - @property - def state(self) -> ProbingState: - if self._state in {ProbingState.NOT_ME, ProbingState.FOUND_IT}: - # terminal, decided states - return self._state - if self.get_confidence() > 0.80: - self._state = ProbingState.FOUND_IT - elif self.position > 4 * 1024: - # if we get to 4kb into the file, and we can't conclude it's UTF, - # let's give up - self._state = ProbingState.NOT_ME - return self._state - - def get_confidence(self) -> float: - return ( - 0.85 - if ( - self.is_likely_utf16le() - or self.is_likely_utf16be() - or self.is_likely_utf32le() - or self.is_likely_utf32be() - ) - else 0.00 - ) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/utf8prober.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/utf8prober.py deleted file mode 100644 index d96354d..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/utf8prober.py +++ /dev/null @@ -1,82 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from typing import Union - -from .charsetprober import CharSetProber -from .codingstatemachine import CodingStateMachine -from .enums import MachineState, ProbingState -from .mbcssm import UTF8_SM_MODEL - - -class UTF8Prober(CharSetProber): - ONE_CHAR_PROB = 0.5 - - def __init__(self) -> None: - super().__init__() - self.coding_sm = CodingStateMachine(UTF8_SM_MODEL) - self._num_mb_chars = 0 - self.reset() - - def reset(self) -> None: - super().reset() - self.coding_sm.reset() - self._num_mb_chars = 0 - - @property - def charset_name(self) -> str: - return "utf-8" - - @property - def language(self) -> str: - return "" - - def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: - for c in byte_str: - coding_state = self.coding_sm.next_state(c) - if coding_state == MachineState.ERROR: - self._state = ProbingState.NOT_ME - break - if coding_state == MachineState.ITS_ME: - self._state = ProbingState.FOUND_IT - break - if coding_state == MachineState.START: - if self.coding_sm.get_current_charlen() >= 2: - self._num_mb_chars += 1 - - if self.state == ProbingState.DETECTING: - if self.get_confidence() > self.SHORTCUT_THRESHOLD: - self._state = ProbingState.FOUND_IT - - return self.state - - def get_confidence(self) -> float: - unlike = 0.99 - if self._num_mb_chars < 6: - unlike *= self.ONE_CHAR_PROB**self._num_mb_chars - return 1.0 - unlike - return unlike diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/version.py b/venv/lib/python3.12/site-packages/pip/_vendor/chardet/version.py deleted file mode 100644 index c5e9d85..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/chardet/version.py +++ /dev/null @@ -1,9 +0,0 @@ -""" -This module exists only to simplify retrieving the version number of chardet -from within setuptools and from chardet subpackages. - -:author: Dan Blanchard (dan.blanchard@gmail.com) -""" - -__version__ = "5.1.0" -VERSION = __version__.split(".") diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__init__.py deleted file mode 100644 index 383101c..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -from .initialise import init, deinit, reinit, colorama_text, just_fix_windows_console -from .ansi import Fore, Back, Style, Cursor -from .ansitowin32 import AnsiToWin32 - -__version__ = '0.4.6' - diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 23ae2f9aff8e3d2b8f0ba7b955ab1a971f50ca5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 513 zcmXv~yKWRQ6t#Cevya(Lfk1*j%_!P6>>?_J#6yURCPYYXtYOAvP5c<y-c2^C_zF6D zzJ(IeSc-x~5z$3Tmx}8=ZgKA8$UgU;pOeW5K{Ve_mLrVN-_+bi@3y#n2gNtkq82Np zF~hpYdOBm7CXDEu<v4LYRp>tJ>j4|+AsgxugAZYzsZx*G7;3^Mo4hLifexzjNTiV= z7Ol9+?j}zftE{Va&4V}!@!^-15B#${;)l|-_R#aj8gG@TNF;Bq6Op{Cn}e9|hK&-j zc)fDox(dhgrSbBE{V2_1ew;s^J)J#!Uv0%v5|g!(UbqbQa3n#Vph(aMh@^(MZjkz6 zf@F~^6H_K8SlDGTcjM~`=WF4-w1)E^=n_WgD$u3Xg6cZ>HGN~7l@=y=8iW%2aN5)d z*&GNrg?o&$bt@cQ3$vz5exltbEUj70p3EsIiD?Jd)%(KJPIeTezywF{JffVZdpMtU vo2$WdZQGR+FWh}tBAM(T0bFDl<8!q48||H;onL6@6m9?6dhoS$_kjHmJmZvC diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-312.pyc deleted file mode 100644 index d08db34470d29ac36bf135da6b57110105f32cbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3971 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 M$y=}8@CmN|39r^c3IG5A diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-312.pyc deleted file mode 100644 index a028bd4b1ee31babfad5520fb3cd2790d43a0cab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16442 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 E2Fu!A?EnA( diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-312.pyc deleted file mode 100644 index 0bfb997a7379ae84123756b8d0baf1479f397fe2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3571 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 Gm;M{1(Ye9^ diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-312.pyc deleted file mode 100644 index 9a83a78187fb4d2a056a5dd376cf8d2e3a207378..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8147 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-312.pyc deleted file mode 100644 index f8fbcac7c866a17f7e18e0c67d6ba5303e42150a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9109 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/ansi.py b/venv/lib/python3.12/site-packages/pip/_vendor/colorama/ansi.py deleted file mode 100644 index 11ec695..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/ansi.py +++ /dev/null @@ -1,102 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -''' -This module generates ANSI character codes to printing colors to terminals. -See: http://en.wikipedia.org/wiki/ANSI_escape_code -''' - -CSI = '\033[' -OSC = '\033]' -BEL = '\a' - - -def code_to_chars(code): - return CSI + str(code) + 'm' - -def set_title(title): - return OSC + '2;' + title + BEL - -def clear_screen(mode=2): - return CSI + str(mode) + 'J' - -def clear_line(mode=2): - return CSI + str(mode) + 'K' - - -class AnsiCodes(object): - def __init__(self): - # the subclasses declare class attributes which are numbers. - # Upon instantiation we define instance attributes, which are the same - # as the class attributes but wrapped with the ANSI escape sequence - for name in dir(self): - if not name.startswith('_'): - value = getattr(self, name) - setattr(self, name, code_to_chars(value)) - - -class AnsiCursor(object): - def UP(self, n=1): - return CSI + str(n) + 'A' - def DOWN(self, n=1): - return CSI + str(n) + 'B' - def FORWARD(self, n=1): - return CSI + str(n) + 'C' - def BACK(self, n=1): - return CSI + str(n) + 'D' - def POS(self, x=1, y=1): - return CSI + str(y) + ';' + str(x) + 'H' - - -class AnsiFore(AnsiCodes): - BLACK = 30 - RED = 31 - GREEN = 32 - YELLOW = 33 - BLUE = 34 - MAGENTA = 35 - CYAN = 36 - WHITE = 37 - RESET = 39 - - # These are fairly well supported, but not part of the standard. - LIGHTBLACK_EX = 90 - LIGHTRED_EX = 91 - LIGHTGREEN_EX = 92 - LIGHTYELLOW_EX = 93 - LIGHTBLUE_EX = 94 - LIGHTMAGENTA_EX = 95 - LIGHTCYAN_EX = 96 - LIGHTWHITE_EX = 97 - - -class AnsiBack(AnsiCodes): - BLACK = 40 - RED = 41 - GREEN = 42 - YELLOW = 43 - BLUE = 44 - MAGENTA = 45 - CYAN = 46 - WHITE = 47 - RESET = 49 - - # These are fairly well supported, but not part of the standard. - LIGHTBLACK_EX = 100 - LIGHTRED_EX = 101 - LIGHTGREEN_EX = 102 - LIGHTYELLOW_EX = 103 - LIGHTBLUE_EX = 104 - LIGHTMAGENTA_EX = 105 - LIGHTCYAN_EX = 106 - LIGHTWHITE_EX = 107 - - -class AnsiStyle(AnsiCodes): - BRIGHT = 1 - DIM = 2 - NORMAL = 22 - RESET_ALL = 0 - -Fore = AnsiFore() -Back = AnsiBack() -Style = AnsiStyle() -Cursor = AnsiCursor() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/ansitowin32.py b/venv/lib/python3.12/site-packages/pip/_vendor/colorama/ansitowin32.py deleted file mode 100644 index abf209e..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/ansitowin32.py +++ /dev/null @@ -1,277 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -import re -import sys -import os - -from .ansi import AnsiFore, AnsiBack, AnsiStyle, Style, BEL -from .winterm import enable_vt_processing, WinTerm, WinColor, WinStyle -from .win32 import windll, winapi_test - - -winterm = None -if windll is not None: - winterm = WinTerm() - - -class StreamWrapper(object): - ''' - Wraps a stream (such as stdout), acting as a transparent proxy for all - attribute access apart from method 'write()', which is delegated to our - Converter instance. - ''' - def __init__(self, wrapped, converter): - # double-underscore everything to prevent clashes with names of - # attributes on the wrapped stream object. - self.__wrapped = wrapped - self.__convertor = converter - - def __getattr__(self, name): - return getattr(self.__wrapped, name) - - def __enter__(self, *args, **kwargs): - # special method lookup bypasses __getattr__/__getattribute__, see - # https://stackoverflow.com/questions/12632894/why-doesnt-getattr-work-with-exit - # thus, contextlib magic methods are not proxied via __getattr__ - return self.__wrapped.__enter__(*args, **kwargs) - - def __exit__(self, *args, **kwargs): - return self.__wrapped.__exit__(*args, **kwargs) - - def __setstate__(self, state): - self.__dict__ = state - - def __getstate__(self): - return self.__dict__ - - def write(self, text): - self.__convertor.write(text) - - def isatty(self): - stream = self.__wrapped - if 'PYCHARM_HOSTED' in os.environ: - if stream is not None and (stream is sys.__stdout__ or stream is sys.__stderr__): - return True - try: - stream_isatty = stream.isatty - except AttributeError: - return False - else: - return stream_isatty() - - @property - def closed(self): - stream = self.__wrapped - try: - return stream.closed - # AttributeError in the case that the stream doesn't support being closed - # ValueError for the case that the stream has already been detached when atexit runs - except (AttributeError, ValueError): - return True - - -class AnsiToWin32(object): - ''' - Implements a 'write()' method which, on Windows, will strip ANSI character - sequences from the text, and if outputting to a tty, will convert them into - win32 function calls. - ''' - ANSI_CSI_RE = re.compile('\001?\033\\[((?:\\d|;)*)([a-zA-Z])\002?') # Control Sequence Introducer - ANSI_OSC_RE = re.compile('\001?\033\\]([^\a]*)(\a)\002?') # Operating System Command - - def __init__(self, wrapped, convert=None, strip=None, autoreset=False): - # The wrapped stream (normally sys.stdout or sys.stderr) - self.wrapped = wrapped - - # should we reset colors to defaults after every .write() - self.autoreset = autoreset - - # create the proxy wrapping our output stream - self.stream = StreamWrapper(wrapped, self) - - on_windows = os.name == 'nt' - # We test if the WinAPI works, because even if we are on Windows - # we may be using a terminal that doesn't support the WinAPI - # (e.g. Cygwin Terminal). In this case it's up to the terminal - # to support the ANSI codes. - conversion_supported = on_windows and winapi_test() - try: - fd = wrapped.fileno() - except Exception: - fd = -1 - system_has_native_ansi = not on_windows or enable_vt_processing(fd) - have_tty = not self.stream.closed and self.stream.isatty() - need_conversion = conversion_supported and not system_has_native_ansi - - # should we strip ANSI sequences from our output? - if strip is None: - strip = need_conversion or not have_tty - self.strip = strip - - # should we should convert ANSI sequences into win32 calls? - if convert is None: - convert = need_conversion and have_tty - self.convert = convert - - # dict of ansi codes to win32 functions and parameters - self.win32_calls = self.get_win32_calls() - - # are we wrapping stderr? - self.on_stderr = self.wrapped is sys.stderr - - def should_wrap(self): - ''' - True if this class is actually needed. If false, then the output - stream will not be affected, nor will win32 calls be issued, so - wrapping stdout is not actually required. This will generally be - False on non-Windows platforms, unless optional functionality like - autoreset has been requested using kwargs to init() - ''' - return self.convert or self.strip or self.autoreset - - def get_win32_calls(self): - if self.convert and winterm: - return { - AnsiStyle.RESET_ALL: (winterm.reset_all, ), - AnsiStyle.BRIGHT: (winterm.style, WinStyle.BRIGHT), - AnsiStyle.DIM: (winterm.style, WinStyle.NORMAL), - AnsiStyle.NORMAL: (winterm.style, WinStyle.NORMAL), - AnsiFore.BLACK: (winterm.fore, WinColor.BLACK), - AnsiFore.RED: (winterm.fore, WinColor.RED), - AnsiFore.GREEN: (winterm.fore, WinColor.GREEN), - AnsiFore.YELLOW: (winterm.fore, WinColor.YELLOW), - AnsiFore.BLUE: (winterm.fore, WinColor.BLUE), - AnsiFore.MAGENTA: (winterm.fore, WinColor.MAGENTA), - AnsiFore.CYAN: (winterm.fore, WinColor.CYAN), - AnsiFore.WHITE: (winterm.fore, WinColor.GREY), - AnsiFore.RESET: (winterm.fore, ), - AnsiFore.LIGHTBLACK_EX: (winterm.fore, WinColor.BLACK, True), - AnsiFore.LIGHTRED_EX: (winterm.fore, WinColor.RED, True), - AnsiFore.LIGHTGREEN_EX: (winterm.fore, WinColor.GREEN, True), - AnsiFore.LIGHTYELLOW_EX: (winterm.fore, WinColor.YELLOW, True), - AnsiFore.LIGHTBLUE_EX: (winterm.fore, WinColor.BLUE, True), - AnsiFore.LIGHTMAGENTA_EX: (winterm.fore, WinColor.MAGENTA, True), - AnsiFore.LIGHTCYAN_EX: (winterm.fore, WinColor.CYAN, True), - AnsiFore.LIGHTWHITE_EX: (winterm.fore, WinColor.GREY, True), - AnsiBack.BLACK: (winterm.back, WinColor.BLACK), - AnsiBack.RED: (winterm.back, WinColor.RED), - AnsiBack.GREEN: (winterm.back, WinColor.GREEN), - AnsiBack.YELLOW: (winterm.back, WinColor.YELLOW), - AnsiBack.BLUE: (winterm.back, WinColor.BLUE), - AnsiBack.MAGENTA: (winterm.back, WinColor.MAGENTA), - AnsiBack.CYAN: (winterm.back, WinColor.CYAN), - AnsiBack.WHITE: (winterm.back, WinColor.GREY), - AnsiBack.RESET: (winterm.back, ), - AnsiBack.LIGHTBLACK_EX: (winterm.back, WinColor.BLACK, True), - AnsiBack.LIGHTRED_EX: (winterm.back, WinColor.RED, True), - AnsiBack.LIGHTGREEN_EX: (winterm.back, WinColor.GREEN, True), - AnsiBack.LIGHTYELLOW_EX: (winterm.back, WinColor.YELLOW, True), - AnsiBack.LIGHTBLUE_EX: (winterm.back, WinColor.BLUE, True), - AnsiBack.LIGHTMAGENTA_EX: (winterm.back, WinColor.MAGENTA, True), - AnsiBack.LIGHTCYAN_EX: (winterm.back, WinColor.CYAN, True), - AnsiBack.LIGHTWHITE_EX: (winterm.back, WinColor.GREY, True), - } - return dict() - - def write(self, text): - if self.strip or self.convert: - self.write_and_convert(text) - else: - self.wrapped.write(text) - self.wrapped.flush() - if self.autoreset: - self.reset_all() - - - def reset_all(self): - if self.convert: - self.call_win32('m', (0,)) - elif not self.strip and not self.stream.closed: - self.wrapped.write(Style.RESET_ALL) - - - def write_and_convert(self, text): - ''' - Write the given text to our wrapped stream, stripping any ANSI - sequences from the text, and optionally converting them into win32 - calls. - ''' - cursor = 0 - text = self.convert_osc(text) - for match in self.ANSI_CSI_RE.finditer(text): - start, end = match.span() - self.write_plain_text(text, cursor, start) - self.convert_ansi(*match.groups()) - cursor = end - self.write_plain_text(text, cursor, len(text)) - - - def write_plain_text(self, text, start, end): - if start < end: - self.wrapped.write(text[start:end]) - self.wrapped.flush() - - - def convert_ansi(self, paramstring, command): - if self.convert: - params = self.extract_params(command, paramstring) - self.call_win32(command, params) - - - def extract_params(self, command, paramstring): - if command in 'Hf': - params = tuple(int(p) if len(p) != 0 else 1 for p in paramstring.split(';')) - while len(params) < 2: - # defaults: - params = params + (1,) - else: - params = tuple(int(p) for p in paramstring.split(';') if len(p) != 0) - if len(params) == 0: - # defaults: - if command in 'JKm': - params = (0,) - elif command in 'ABCD': - params = (1,) - - return params - - - def call_win32(self, command, params): - if command == 'm': - for param in params: - if param in self.win32_calls: - func_args = self.win32_calls[param] - func = func_args[0] - args = func_args[1:] - kwargs = dict(on_stderr=self.on_stderr) - func(*args, **kwargs) - elif command in 'J': - winterm.erase_screen(params[0], on_stderr=self.on_stderr) - elif command in 'K': - winterm.erase_line(params[0], on_stderr=self.on_stderr) - elif command in 'Hf': # cursor position - absolute - winterm.set_cursor_position(params, on_stderr=self.on_stderr) - elif command in 'ABCD': # cursor position - relative - n = params[0] - # A - up, B - down, C - forward, D - back - x, y = {'A': (0, -n), 'B': (0, n), 'C': (n, 0), 'D': (-n, 0)}[command] - winterm.cursor_adjust(x, y, on_stderr=self.on_stderr) - - - def convert_osc(self, text): - for match in self.ANSI_OSC_RE.finditer(text): - start, end = match.span() - text = text[:start] + text[end:] - paramstring, command = match.groups() - if command == BEL: - if paramstring.count(";") == 1: - params = paramstring.split(";") - # 0 - change title and icon (we will only change title) - # 1 - change icon (we don't support this) - # 2 - change title - if params[0] in '02': - winterm.set_title(params[1]) - return text - - - def flush(self): - self.wrapped.flush() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/initialise.py b/venv/lib/python3.12/site-packages/pip/_vendor/colorama/initialise.py deleted file mode 100644 index d5fd4b7..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/initialise.py +++ /dev/null @@ -1,121 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -import atexit -import contextlib -import sys - -from .ansitowin32 import AnsiToWin32 - - -def _wipe_internal_state_for_tests(): - global orig_stdout, orig_stderr - orig_stdout = None - orig_stderr = None - - global wrapped_stdout, wrapped_stderr - wrapped_stdout = None - wrapped_stderr = None - - global atexit_done - atexit_done = False - - global fixed_windows_console - fixed_windows_console = False - - try: - # no-op if it wasn't registered - atexit.unregister(reset_all) - except AttributeError: - # python 2: no atexit.unregister. Oh well, we did our best. - pass - - -def reset_all(): - if AnsiToWin32 is not None: # Issue #74: objects might become None at exit - AnsiToWin32(orig_stdout).reset_all() - - -def init(autoreset=False, convert=None, strip=None, wrap=True): - - if not wrap and any([autoreset, convert, strip]): - raise ValueError('wrap=False conflicts with any other arg=True') - - global wrapped_stdout, wrapped_stderr - global orig_stdout, orig_stderr - - orig_stdout = sys.stdout - orig_stderr = sys.stderr - - if sys.stdout is None: - wrapped_stdout = None - else: - sys.stdout = wrapped_stdout = \ - wrap_stream(orig_stdout, convert, strip, autoreset, wrap) - if sys.stderr is None: - wrapped_stderr = None - else: - sys.stderr = wrapped_stderr = \ - wrap_stream(orig_stderr, convert, strip, autoreset, wrap) - - global atexit_done - if not atexit_done: - atexit.register(reset_all) - atexit_done = True - - -def deinit(): - if orig_stdout is not None: - sys.stdout = orig_stdout - if orig_stderr is not None: - sys.stderr = orig_stderr - - -def just_fix_windows_console(): - global fixed_windows_console - - if sys.platform != "win32": - return - if fixed_windows_console: - return - if wrapped_stdout is not None or wrapped_stderr is not None: - # Someone already ran init() and it did stuff, so we won't second-guess them - return - - # On newer versions of Windows, AnsiToWin32.__init__ will implicitly enable the - # native ANSI support in the console as a side-effect. We only need to actually - # replace sys.stdout/stderr if we're in the old-style conversion mode. - new_stdout = AnsiToWin32(sys.stdout, convert=None, strip=None, autoreset=False) - if new_stdout.convert: - sys.stdout = new_stdout - new_stderr = AnsiToWin32(sys.stderr, convert=None, strip=None, autoreset=False) - if new_stderr.convert: - sys.stderr = new_stderr - - fixed_windows_console = True - -@contextlib.contextmanager -def colorama_text(*args, **kwargs): - init(*args, **kwargs) - try: - yield - finally: - deinit() - - -def reinit(): - if wrapped_stdout is not None: - sys.stdout = wrapped_stdout - if wrapped_stderr is not None: - sys.stderr = wrapped_stderr - - -def wrap_stream(stream, convert, strip, autoreset, wrap): - if wrap: - wrapper = AnsiToWin32(stream, - convert=convert, strip=strip, autoreset=autoreset) - if wrapper.should_wrap(): - stream = wrapper.stream - return stream - - -# Use this for initial setup as well, to reduce code duplication -_wipe_internal_state_for_tests() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__init__.py deleted file mode 100644 index 8c5661e..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index b4906864d7ebdd940066a3625aede1d0228f46e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 219 zcmZ9GJqiLb5QR7XfCwJMVja|0tn37@5Mp+4gGnYNab@)&cJ`jdV|W6wvvRie!7%R) zkB@myCgXyo@7H?E`_+YieFl8F6>TvUyGIdwoIYLWdx4r9f>Sv)upxbN=yQUM77tOm zGG(KW7|V*z-jb>?LW8~mYxWS@T$5kU<_kzBV;Ph_ssknnCV=ExMG-VvVvu5FVz89P en=IulwBOOnQFXGojzfM$@TAVX`$CA=XZHgZ0X~)h diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-312.pyc deleted file mode 100644 index 7098fc56287dca4fc839dbd8b3e75397b2a1deae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5488 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 KB9YqJK>q+Rca4Go diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-312.pyc deleted file mode 100644 index cef4f0d6757010f666e688ac8f355a73e3fd2ff1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18124 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 P!gUq?E$qZ*8sPr|V9C9g diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-312.pyc deleted file mode 100644 index 024d9ef9b1e8434daa981519d63c16dbfdff89a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11769 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-312.pyc deleted file mode 100644 index 323f56cae130b70c8cf42d45c827999d6fdd06f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4925 zcmd^D-ESMm5#QtS$Rl~QXvuIT>!`@_he9h7X(_f_$7n!VQsWk}i&{Wp_JO$Yt`=<` z$?l!3QniCVxPSu(NQ)wH01JhJ7-$6<N&bMMfQ3A@FJZ`n?!iES=ArPLECnE-r_Sv0 zjvuCEx9L;6fM#cBmvejjoB8eN{u&Mk3AD`be>wj{KOtY^z-dB5*?I?*J47Wamm?|c zJvmPIq&zyG;yI%7syFA=g_NNCQa%_9sxRl)#gwQAQUN`f3hJR$NS9I)%=vGURM<m) zKveN2Q3IN1jklkY+N1TT!K*J3LPZbJ__fBvIa1<ETrBh$$LC`nOPtdT^Q>ZMmRDD@ z`NtlxgE@TBq?)3?NtI$zqgE)HH?nhuH?#T4iN_o+5iEbPl$lqkZUw1U%qbZy{dURf zbMykuUe4x~92x_*v$?rTmSn5v3wao2(38`=py1}WPJ*~YOn2@&9MKwX3)+>&>)9h) zI<Iz-ta9*1)CXqEmo*gAEX6p>XRtRh(BJU(jre>)*W$Wj8rR~}h0KDk<xL}QYB}vP zRrE2#%x11?bWANQ=5qx_)oA>hmcJIyW#5h$OXhqbKRJGUB5q_&ZLFwdt}2%`BVNoF z<7rr?7HB+E$Q8hm0xk`3Y;PltgYja?60=5HNyElyA8aQ8e?~uuUy(<l{tx%B?5l*1 z)<R?D&{!oD|H2#Jf;o~w;WXz|8mFX@6sMAuN97<8c+~^atMVWP)eF+63LyQe52VO~ zB~TJ$0V{Zpoeo0Zh5;TO!{E=Lv|`|#@eS^JR}4%ixXE>Ht+7X^=ZFcZU^mCl3Br;8 z#1kY-OEf?*lSAY<F}Ot!M=pU+wETj<L>4*P15b>3sRW%BR18C-<{Vwn*uhgg`BjhQ zHMHE%EFSPMFu;a~X)i7p5w0`@=u%(vpvE2J9#~?W1p%n-`OfXDxA=#m^nTB~J<H-s z-`#LkJo+fS@Ajo9gbR#5lp^n6c=y8c>nj)UzEPEq)p;=1afVHAZ-v0mr-R8p{z0FR zl>PtfXoT^2LpB<-N)AB5JZQi{58$jnU&v#Iv>_5=hYvFd%KlDJZ2La=wQ&vv;L<zv zyYX9oz@;Ykm&N|&{*{r+z_F@0>OzwMXljyNmgMEPRxVef<5ek+=p+!G1frAJrcv<L z9g=^*Ot%Dip1?LS%~-o4I$E=L(#GkZohU8-*zMEwg_`5X>EYJ+H<QT6@S#Xl3@(c| zN(S;Oup?!CVZmJG7<@L(+G!MFpe<(2`5)Ui#nNCWaxIexzA*~|;Is3`6PR%G=ibFX zq&`Yj<V00E-qlzaV0oQ@c!FZvz{J0u+?zbYKR6;J$J<j235gNiUqI=G;|<QldDdD< zs~gcZFn3AL`5hr9@(gR;Xt5KA&hgXa_Fk_|Zo8A7z(~&q4FjTy936mRTVf4%Vgw0x z;TqtYRkfv~yTH}5?geyu9)wGXZkCNM2UjNV_B?|NTL_V<8%U7bTL;1A2U2o?|7b87 z7XBoH_8=@I_Xi&I`cWSck}v*W!HVqJ0xO=o&7Z@dwZS^n39DUjxyZ(LLAHJAVRZcy z5H72_;3fdvQ<Z*pmF-TaEu6|!1Q_Ub6x_DaE2axe%XgrL=$4k4YR$xiy0B4eFuPlW zwA-Q1*flkqs~vBQa(DfWiT5^Z4mmi#b$aFl0qbZ@N-(iPVQpt0os{sbaTm%s(48{g z8|rRvub;%0aKl%o&6s1s$nFGWS~>!vmHg!{5vaNGH?n*DxeH_H^#c&@rQi*mdbD@& z!|BT2gHH$_K2<$*@-wq?=nNY?jO?pLhRc!Rd;Nbr{P9pVl4!Bqe|c@Za`1cA$Z0U% z>G^HXJ@Nj)+F)h)L^X1<?gw9WbXe!%5gP<V-2=l7v~9DQhU(658>eAsx235`{*E*? zB7B^DVQSF7?h!#>4~k%39~7nzht`MvXc-Zv5`p!X{b-*Qrq1j@UB{pj-6`~+RWd(a zXglH9t<t#S1~I%wqjiSjj$!O3+s<M9t)A)LzRu3zHf=sL;#jX>!QRpSEARZg&&R5> zqka45cc%H%Y2BWtp_U2_dCM*U_M(O-WoIo*Sfq1$6vYt~omm_0%-Yt^0P509yQFQ~ z$^<w!J^|5^w=<kmxc%sUU@cUUU#ZEjmgQG#@>E%#s>st-X{K3}|Mb4RHdKjzw-$Y^ z9DS`8oh?UaE78}h(z&J={?p)Uup&>^<kMyObWKi{<zz)ZTa~7tXH7le4a{(L$n+WR z36qVY@$8A|0RMSFnC|tTj|D9;oz5$|mQGv2bXqT{3pv!Kbo%EDO3t34G9KoODBz0= zp~p~+p@^e64q}y13>8)x)BUKSK<YFQj+<oD>lH>fC9ja!lz3rcGswdbL}D{22&cC8 z2*M0!yTBjfuJC(JIvtBp1l1B3@>vt%qZqo>i?)ygpKZ*-B7U}E-$f`!hb1hS*__cy z?Tp4*kg)&B*d8a))d>{t=C{Q&_91+qBK_e7Y@7kH!E+q<H3@!24*iq7@)eo;8=2em oaa`gXUyPgKe$)RA!G7Z{j(DY8OJDK>fA@;Np55Sy_W<+$FQDs{ZvX%Q diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index 192e599442a7fc97383250bc59ea2a1a698299d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2509 zcmds3O>7%Q6rS1j+H1#2(>Nw5gw#=5f&;OYRuF^=lG{Q`DqKW!i7(66yCiPcyJlvS z)FqKZ<Oo$DHN6l{+@pZRjSH8YxwI;WXcHtPiUc=DjuaAc;Jw}TPtpjLD`V}OH{ZPZ zdEdO5=bzf!BLqtRn@?xP0)+gAje3!MrS>%_YeXX&HAs=>C`DZ`grb-eU0pN+xd33I zA>|~2j1w(TA)2I%8=^NyF6g2`KtnBPNT-@yAshZeIT_mFmUbB0k(PD@+HEcEwz8Ov z{)wZL)al4urmf$xi>j$k>kJV2hRq7*^n2H{d4C1BqJE>+1<D%HNsekHCup=na$;FX zicS~?>S}Rvaw=apu1|mt)qp7&Sf)uKJGoBQsT1J3@i9l+#Nm8;#wzORqH6QG^c5>V zThvXPr)}NPr<qzD;dUW^TW2GhHE$Z0s_85}r<-$Wqi{1_D%&%bc_B4=KFtfZK2lQi zx4{{nE)_~?1<W*yrSq0y!9*%d$zkGIyI}BCsq6#`T(#};-Ok4DQyvnAeQ`X^C9-uY zRs)4(*8`5MD5hG}6~&1tO3~704b-EG^2w}fcs(o%woFFRj-m}kur3hiArKW(6R6bf z*<km7<U8u^IBS{DLixMihFq^)%DrvjR`14IXY$?0oj2U~HkoA|03LTNh8PN*s>QLm z=NR@Ji3b6ILHKGPfw)E}#Doo+S8ieNv9d@PS}c@CY-!{xx(3&3fi}lCd&}fIah|Tz zY*KIpi#q{4o20;=huNKg#R}6L*GeQ@9-N@X(SY>=)(Ia^fcS&_wM3q@wcj7RH@0+T ztD~!OsWQGD2)o+K_yNa|UVb%2Pj>KI=zTT^n-1K<DUX#!;ba1ipbg^wot6cmxt7ux z<B`RlgN5NDi@eO8Ah$JZ)^=;1v2_tOyx&e6lBf9HjRx3oyyl5IqY<W;3^lJSH_Hsq zy9Yi#2Et>tE50`TV0h`;PF>kL-BY<-neZ!Q`E;KLK(#V)P{S*-oaxGR|G(&Fec%^9 zCLW{S!vZ=GswnIXvUY^mSe;iqhJvXYNbt*GHh`u_2u?jnc?7%4R{RCvGwWAKa6I7w zP_1MS*jbn$4_~9;D}_f_tAg+%S!=m$CtX%exCpj(JqtFn)FQEQHn%L04gV6q2G`%l zC+P$n;#kD%4H*)C8-A=l-EPM7$@_VWl);Hn!s)y~$rP+e$(Mt7#3?dQpTdVc9G{M) zn04r=)A7O7<*S(w-&d|)zcKmFm88Tlkev`Dp8~T?_vLfr+dTuwpCQvS704)FV)I^? zP^p}sQCX3tVC*aKaUFzv5q=$fsdDM_iO(h;o;vd=kl5+y{lZ)t-wDT7#~+9Lb_ta_ ze(oRre&})kn{H!UZr>LH+{d0La^!yGUgTkH@R59WUjn3x@S)r3s(<tIu+nle^E%y# zW`@Ndq)fl`qYT<+pclZ+ekn5)-W&`eGAv~-gf`P5z>`rY;{P>(6w5FI9id<`e4gBh zb!qUjnwtUe;cW8YI(jTq9Lg8HeEBvT1!D{WUItMWDW$)YbH9+DZ4%ig;k}?hyI18s z0@a=@(D>>bsK=`^5juB;0FBi|(5k3aqb?SrFZvj0)h-_!XkY_ACed>)wkv?<Ca8Y^ DM-}6- diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-312.pyc deleted file mode 100644 index d496042537fb7cbca1ee6bd341be20cc210209f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6633 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansi_test.py b/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansi_test.py deleted file mode 100644 index 0a20c80..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansi_test.py +++ /dev/null @@ -1,76 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -import sys -from unittest import TestCase, main - -from ..ansi import Back, Fore, Style -from ..ansitowin32 import AnsiToWin32 - -stdout_orig = sys.stdout -stderr_orig = sys.stderr - - -class AnsiTest(TestCase): - - def setUp(self): - # sanity check: stdout should be a file or StringIO object. - # It will only be AnsiToWin32 if init() has previously wrapped it - self.assertNotEqual(type(sys.stdout), AnsiToWin32) - self.assertNotEqual(type(sys.stderr), AnsiToWin32) - - def tearDown(self): - sys.stdout = stdout_orig - sys.stderr = stderr_orig - - - def testForeAttributes(self): - self.assertEqual(Fore.BLACK, '\033[30m') - self.assertEqual(Fore.RED, '\033[31m') - self.assertEqual(Fore.GREEN, '\033[32m') - self.assertEqual(Fore.YELLOW, '\033[33m') - self.assertEqual(Fore.BLUE, '\033[34m') - self.assertEqual(Fore.MAGENTA, '\033[35m') - self.assertEqual(Fore.CYAN, '\033[36m') - self.assertEqual(Fore.WHITE, '\033[37m') - self.assertEqual(Fore.RESET, '\033[39m') - - # Check the light, extended versions. - self.assertEqual(Fore.LIGHTBLACK_EX, '\033[90m') - self.assertEqual(Fore.LIGHTRED_EX, '\033[91m') - self.assertEqual(Fore.LIGHTGREEN_EX, '\033[92m') - self.assertEqual(Fore.LIGHTYELLOW_EX, '\033[93m') - self.assertEqual(Fore.LIGHTBLUE_EX, '\033[94m') - self.assertEqual(Fore.LIGHTMAGENTA_EX, '\033[95m') - self.assertEqual(Fore.LIGHTCYAN_EX, '\033[96m') - self.assertEqual(Fore.LIGHTWHITE_EX, '\033[97m') - - - def testBackAttributes(self): - self.assertEqual(Back.BLACK, '\033[40m') - self.assertEqual(Back.RED, '\033[41m') - self.assertEqual(Back.GREEN, '\033[42m') - self.assertEqual(Back.YELLOW, '\033[43m') - self.assertEqual(Back.BLUE, '\033[44m') - self.assertEqual(Back.MAGENTA, '\033[45m') - self.assertEqual(Back.CYAN, '\033[46m') - self.assertEqual(Back.WHITE, '\033[47m') - self.assertEqual(Back.RESET, '\033[49m') - - # Check the light, extended versions. - self.assertEqual(Back.LIGHTBLACK_EX, '\033[100m') - self.assertEqual(Back.LIGHTRED_EX, '\033[101m') - self.assertEqual(Back.LIGHTGREEN_EX, '\033[102m') - self.assertEqual(Back.LIGHTYELLOW_EX, '\033[103m') - self.assertEqual(Back.LIGHTBLUE_EX, '\033[104m') - self.assertEqual(Back.LIGHTMAGENTA_EX, '\033[105m') - self.assertEqual(Back.LIGHTCYAN_EX, '\033[106m') - self.assertEqual(Back.LIGHTWHITE_EX, '\033[107m') - - - def testStyleAttributes(self): - self.assertEqual(Style.DIM, '\033[2m') - self.assertEqual(Style.NORMAL, '\033[22m') - self.assertEqual(Style.BRIGHT, '\033[1m') - - -if __name__ == '__main__': - main() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py b/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py deleted file mode 100644 index 91ca551..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py +++ /dev/null @@ -1,294 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -from io import StringIO, TextIOWrapper -from unittest import TestCase, main -try: - from contextlib import ExitStack -except ImportError: - # python 2 - from contextlib2 import ExitStack - -try: - from unittest.mock import MagicMock, Mock, patch -except ImportError: - from mock import MagicMock, Mock, patch - -from ..ansitowin32 import AnsiToWin32, StreamWrapper -from ..win32 import ENABLE_VIRTUAL_TERMINAL_PROCESSING -from .utils import osname - - -class StreamWrapperTest(TestCase): - - def testIsAProxy(self): - mockStream = Mock() - wrapper = StreamWrapper(mockStream, None) - self.assertTrue( wrapper.random_attr is mockStream.random_attr ) - - def testDelegatesWrite(self): - mockStream = Mock() - mockConverter = Mock() - wrapper = StreamWrapper(mockStream, mockConverter) - wrapper.write('hello') - self.assertTrue(mockConverter.write.call_args, (('hello',), {})) - - def testDelegatesContext(self): - mockConverter = Mock() - s = StringIO() - with StreamWrapper(s, mockConverter) as fp: - fp.write(u'hello') - self.assertTrue(s.closed) - - def testProxyNoContextManager(self): - mockStream = MagicMock() - mockStream.__enter__.side_effect = AttributeError() - mockConverter = Mock() - with self.assertRaises(AttributeError) as excinfo: - with StreamWrapper(mockStream, mockConverter) as wrapper: - wrapper.write('hello') - - def test_closed_shouldnt_raise_on_closed_stream(self): - stream = StringIO() - stream.close() - wrapper = StreamWrapper(stream, None) - self.assertEqual(wrapper.closed, True) - - def test_closed_shouldnt_raise_on_detached_stream(self): - stream = TextIOWrapper(StringIO()) - stream.detach() - wrapper = StreamWrapper(stream, None) - self.assertEqual(wrapper.closed, True) - -class AnsiToWin32Test(TestCase): - - def testInit(self): - mockStdout = Mock() - auto = Mock() - stream = AnsiToWin32(mockStdout, autoreset=auto) - self.assertEqual(stream.wrapped, mockStdout) - self.assertEqual(stream.autoreset, auto) - - @patch('colorama.ansitowin32.winterm', None) - @patch('colorama.ansitowin32.winapi_test', lambda *_: True) - def testStripIsTrueOnWindows(self): - with osname('nt'): - mockStdout = Mock() - stream = AnsiToWin32(mockStdout) - self.assertTrue(stream.strip) - - def testStripIsFalseOffWindows(self): - with osname('posix'): - mockStdout = Mock(closed=False) - stream = AnsiToWin32(mockStdout) - self.assertFalse(stream.strip) - - def testWriteStripsAnsi(self): - mockStdout = Mock() - stream = AnsiToWin32(mockStdout) - stream.wrapped = Mock() - stream.write_and_convert = Mock() - stream.strip = True - - stream.write('abc') - - self.assertFalse(stream.wrapped.write.called) - self.assertEqual(stream.write_and_convert.call_args, (('abc',), {})) - - def testWriteDoesNotStripAnsi(self): - mockStdout = Mock() - stream = AnsiToWin32(mockStdout) - stream.wrapped = Mock() - stream.write_and_convert = Mock() - stream.strip = False - stream.convert = False - - stream.write('abc') - - self.assertFalse(stream.write_and_convert.called) - self.assertEqual(stream.wrapped.write.call_args, (('abc',), {})) - - def assert_autoresets(self, convert, autoreset=True): - stream = AnsiToWin32(Mock()) - stream.convert = convert - stream.reset_all = Mock() - stream.autoreset = autoreset - stream.winterm = Mock() - - stream.write('abc') - - self.assertEqual(stream.reset_all.called, autoreset) - - def testWriteAutoresets(self): - self.assert_autoresets(convert=True) - self.assert_autoresets(convert=False) - self.assert_autoresets(convert=True, autoreset=False) - self.assert_autoresets(convert=False, autoreset=False) - - def testWriteAndConvertWritesPlainText(self): - stream = AnsiToWin32(Mock()) - stream.write_and_convert( 'abc' ) - self.assertEqual( stream.wrapped.write.call_args, (('abc',), {}) ) - - def testWriteAndConvertStripsAllValidAnsi(self): - stream = AnsiToWin32(Mock()) - stream.call_win32 = Mock() - data = [ - 'abc\033[mdef', - 'abc\033[0mdef', - 'abc\033[2mdef', - 'abc\033[02mdef', - 'abc\033[002mdef', - 'abc\033[40mdef', - 'abc\033[040mdef', - 'abc\033[0;1mdef', - 'abc\033[40;50mdef', - 'abc\033[50;30;40mdef', - 'abc\033[Adef', - 'abc\033[0Gdef', - 'abc\033[1;20;128Hdef', - ] - for datum in data: - stream.wrapped.write.reset_mock() - stream.write_and_convert( datum ) - self.assertEqual( - [args[0] for args in stream.wrapped.write.call_args_list], - [ ('abc',), ('def',) ] - ) - - def testWriteAndConvertSkipsEmptySnippets(self): - stream = AnsiToWin32(Mock()) - stream.call_win32 = Mock() - stream.write_and_convert( '\033[40m\033[41m' ) - self.assertFalse( stream.wrapped.write.called ) - - def testWriteAndConvertCallsWin32WithParamsAndCommand(self): - stream = AnsiToWin32(Mock()) - stream.convert = True - stream.call_win32 = Mock() - stream.extract_params = Mock(return_value='params') - data = { - 'abc\033[adef': ('a', 'params'), - 'abc\033[;;bdef': ('b', 'params'), - 'abc\033[0cdef': ('c', 'params'), - 'abc\033[;;0;;Gdef': ('G', 'params'), - 'abc\033[1;20;128Hdef': ('H', 'params'), - } - for datum, expected in data.items(): - stream.call_win32.reset_mock() - stream.write_and_convert( datum ) - self.assertEqual( stream.call_win32.call_args[0], expected ) - - def test_reset_all_shouldnt_raise_on_closed_orig_stdout(self): - stream = StringIO() - converter = AnsiToWin32(stream) - stream.close() - - converter.reset_all() - - def test_wrap_shouldnt_raise_on_closed_orig_stdout(self): - stream = StringIO() - stream.close() - with \ - patch("colorama.ansitowin32.os.name", "nt"), \ - patch("colorama.ansitowin32.winapi_test", lambda: True): - converter = AnsiToWin32(stream) - self.assertTrue(converter.strip) - self.assertFalse(converter.convert) - - def test_wrap_shouldnt_raise_on_missing_closed_attr(self): - with \ - patch("colorama.ansitowin32.os.name", "nt"), \ - patch("colorama.ansitowin32.winapi_test", lambda: True): - converter = AnsiToWin32(object()) - self.assertTrue(converter.strip) - self.assertFalse(converter.convert) - - def testExtractParams(self): - stream = AnsiToWin32(Mock()) - data = { - '': (0,), - ';;': (0,), - '2': (2,), - ';;002;;': (2,), - '0;1': (0, 1), - ';;003;;456;;': (3, 456), - '11;22;33;44;55': (11, 22, 33, 44, 55), - } - for datum, expected in data.items(): - self.assertEqual(stream.extract_params('m', datum), expected) - - def testCallWin32UsesLookup(self): - listener = Mock() - stream = AnsiToWin32(listener) - stream.win32_calls = { - 1: (lambda *_, **__: listener(11),), - 2: (lambda *_, **__: listener(22),), - 3: (lambda *_, **__: listener(33),), - } - stream.call_win32('m', (3, 1, 99, 2)) - self.assertEqual( - [a[0][0] for a in listener.call_args_list], - [33, 11, 22] ) - - def test_osc_codes(self): - mockStdout = Mock() - stream = AnsiToWin32(mockStdout, convert=True) - with patch('colorama.ansitowin32.winterm') as winterm: - data = [ - '\033]0\x07', # missing arguments - '\033]0;foo\x08', # wrong OSC command - '\033]0;colorama_test_title\x07', # should work - '\033]1;colorama_test_title\x07', # wrong set command - '\033]2;colorama_test_title\x07', # should work - '\033]' + ';' * 64 + '\x08', # see issue #247 - ] - for code in data: - stream.write(code) - self.assertEqual(winterm.set_title.call_count, 2) - - def test_native_windows_ansi(self): - with ExitStack() as stack: - def p(a, b): - stack.enter_context(patch(a, b, create=True)) - # Pretend to be on Windows - p("colorama.ansitowin32.os.name", "nt") - p("colorama.ansitowin32.winapi_test", lambda: True) - p("colorama.win32.winapi_test", lambda: True) - p("colorama.winterm.win32.windll", "non-None") - p("colorama.winterm.get_osfhandle", lambda _: 1234) - - # Pretend that our mock stream has native ANSI support - p( - "colorama.winterm.win32.GetConsoleMode", - lambda _: ENABLE_VIRTUAL_TERMINAL_PROCESSING, - ) - SetConsoleMode = Mock() - p("colorama.winterm.win32.SetConsoleMode", SetConsoleMode) - - stdout = Mock() - stdout.closed = False - stdout.isatty.return_value = True - stdout.fileno.return_value = 1 - - # Our fake console says it has native vt support, so AnsiToWin32 should - # enable that support and do nothing else. - stream = AnsiToWin32(stdout) - SetConsoleMode.assert_called_with(1234, ENABLE_VIRTUAL_TERMINAL_PROCESSING) - self.assertFalse(stream.strip) - self.assertFalse(stream.convert) - self.assertFalse(stream.should_wrap()) - - # Now let's pretend we're on an old Windows console, that doesn't have - # native ANSI support. - p("colorama.winterm.win32.GetConsoleMode", lambda _: 0) - SetConsoleMode = Mock() - p("colorama.winterm.win32.SetConsoleMode", SetConsoleMode) - - stream = AnsiToWin32(stdout) - SetConsoleMode.assert_called_with(1234, ENABLE_VIRTUAL_TERMINAL_PROCESSING) - self.assertTrue(stream.strip) - self.assertTrue(stream.convert) - self.assertTrue(stream.should_wrap()) - - -if __name__ == '__main__': - main() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/initialise_test.py b/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/initialise_test.py deleted file mode 100644 index 89f9b07..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/initialise_test.py +++ /dev/null @@ -1,189 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -import sys -from unittest import TestCase, main, skipUnless - -try: - from unittest.mock import patch, Mock -except ImportError: - from mock import patch, Mock - -from ..ansitowin32 import StreamWrapper -from ..initialise import init, just_fix_windows_console, _wipe_internal_state_for_tests -from .utils import osname, replace_by - -orig_stdout = sys.stdout -orig_stderr = sys.stderr - - -class InitTest(TestCase): - - @skipUnless(sys.stdout.isatty(), "sys.stdout is not a tty") - def setUp(self): - # sanity check - self.assertNotWrapped() - - def tearDown(self): - _wipe_internal_state_for_tests() - sys.stdout = orig_stdout - sys.stderr = orig_stderr - - def assertWrapped(self): - self.assertIsNot(sys.stdout, orig_stdout, 'stdout should be wrapped') - self.assertIsNot(sys.stderr, orig_stderr, 'stderr should be wrapped') - self.assertTrue(isinstance(sys.stdout, StreamWrapper), - 'bad stdout wrapper') - self.assertTrue(isinstance(sys.stderr, StreamWrapper), - 'bad stderr wrapper') - - def assertNotWrapped(self): - self.assertIs(sys.stdout, orig_stdout, 'stdout should not be wrapped') - self.assertIs(sys.stderr, orig_stderr, 'stderr should not be wrapped') - - @patch('colorama.initialise.reset_all') - @patch('colorama.ansitowin32.winapi_test', lambda *_: True) - @patch('colorama.ansitowin32.enable_vt_processing', lambda *_: False) - def testInitWrapsOnWindows(self, _): - with osname("nt"): - init() - self.assertWrapped() - - @patch('colorama.initialise.reset_all') - @patch('colorama.ansitowin32.winapi_test', lambda *_: False) - def testInitDoesntWrapOnEmulatedWindows(self, _): - with osname("nt"): - init() - self.assertNotWrapped() - - def testInitDoesntWrapOnNonWindows(self): - with osname("posix"): - init() - self.assertNotWrapped() - - def testInitDoesntWrapIfNone(self): - with replace_by(None): - init() - # We can't use assertNotWrapped here because replace_by(None) - # changes stdout/stderr already. - self.assertIsNone(sys.stdout) - self.assertIsNone(sys.stderr) - - def testInitAutoresetOnWrapsOnAllPlatforms(self): - with osname("posix"): - init(autoreset=True) - self.assertWrapped() - - def testInitWrapOffDoesntWrapOnWindows(self): - with osname("nt"): - init(wrap=False) - self.assertNotWrapped() - - def testInitWrapOffIncompatibleWithAutoresetOn(self): - self.assertRaises(ValueError, lambda: init(autoreset=True, wrap=False)) - - @patch('colorama.win32.SetConsoleTextAttribute') - @patch('colorama.initialise.AnsiToWin32') - def testAutoResetPassedOn(self, mockATW32, _): - with osname("nt"): - init(autoreset=True) - self.assertEqual(len(mockATW32.call_args_list), 2) - self.assertEqual(mockATW32.call_args_list[1][1]['autoreset'], True) - self.assertEqual(mockATW32.call_args_list[0][1]['autoreset'], True) - - @patch('colorama.initialise.AnsiToWin32') - def testAutoResetChangeable(self, mockATW32): - with osname("nt"): - init() - - init(autoreset=True) - self.assertEqual(len(mockATW32.call_args_list), 4) - self.assertEqual(mockATW32.call_args_list[2][1]['autoreset'], True) - self.assertEqual(mockATW32.call_args_list[3][1]['autoreset'], True) - - init() - self.assertEqual(len(mockATW32.call_args_list), 6) - self.assertEqual( - mockATW32.call_args_list[4][1]['autoreset'], False) - self.assertEqual( - mockATW32.call_args_list[5][1]['autoreset'], False) - - - @patch('colorama.initialise.atexit.register') - def testAtexitRegisteredOnlyOnce(self, mockRegister): - init() - self.assertTrue(mockRegister.called) - mockRegister.reset_mock() - init() - self.assertFalse(mockRegister.called) - - -class JustFixWindowsConsoleTest(TestCase): - def _reset(self): - _wipe_internal_state_for_tests() - sys.stdout = orig_stdout - sys.stderr = orig_stderr - - def tearDown(self): - self._reset() - - @patch("colorama.ansitowin32.winapi_test", lambda: True) - def testJustFixWindowsConsole(self): - if sys.platform != "win32": - # just_fix_windows_console should be a no-op - just_fix_windows_console() - self.assertIs(sys.stdout, orig_stdout) - self.assertIs(sys.stderr, orig_stderr) - else: - def fake_std(): - # Emulate stdout=not a tty, stderr=tty - # to check that we handle both cases correctly - stdout = Mock() - stdout.closed = False - stdout.isatty.return_value = False - stdout.fileno.return_value = 1 - sys.stdout = stdout - - stderr = Mock() - stderr.closed = False - stderr.isatty.return_value = True - stderr.fileno.return_value = 2 - sys.stderr = stderr - - for native_ansi in [False, True]: - with patch( - 'colorama.ansitowin32.enable_vt_processing', - lambda *_: native_ansi - ): - self._reset() - fake_std() - - # Regular single-call test - prev_stdout = sys.stdout - prev_stderr = sys.stderr - just_fix_windows_console() - self.assertIs(sys.stdout, prev_stdout) - if native_ansi: - self.assertIs(sys.stderr, prev_stderr) - else: - self.assertIsNot(sys.stderr, prev_stderr) - - # second call without resetting is always a no-op - prev_stdout = sys.stdout - prev_stderr = sys.stderr - just_fix_windows_console() - self.assertIs(sys.stdout, prev_stdout) - self.assertIs(sys.stderr, prev_stderr) - - self._reset() - fake_std() - - # If init() runs first, just_fix_windows_console should be a no-op - init() - prev_stdout = sys.stdout - prev_stderr = sys.stderr - just_fix_windows_console() - self.assertIs(prev_stdout, sys.stdout) - self.assertIs(prev_stderr, sys.stderr) - - -if __name__ == '__main__': - main() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/isatty_test.py b/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/isatty_test.py deleted file mode 100644 index 0f84e4b..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/isatty_test.py +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -import sys -from unittest import TestCase, main - -from ..ansitowin32 import StreamWrapper, AnsiToWin32 -from .utils import pycharm, replace_by, replace_original_by, StreamTTY, StreamNonTTY - - -def is_a_tty(stream): - return StreamWrapper(stream, None).isatty() - -class IsattyTest(TestCase): - - def test_TTY(self): - tty = StreamTTY() - self.assertTrue(is_a_tty(tty)) - with pycharm(): - self.assertTrue(is_a_tty(tty)) - - def test_nonTTY(self): - non_tty = StreamNonTTY() - self.assertFalse(is_a_tty(non_tty)) - with pycharm(): - self.assertFalse(is_a_tty(non_tty)) - - def test_withPycharm(self): - with pycharm(): - self.assertTrue(is_a_tty(sys.stderr)) - self.assertTrue(is_a_tty(sys.stdout)) - - def test_withPycharmTTYOverride(self): - tty = StreamTTY() - with pycharm(), replace_by(tty): - self.assertTrue(is_a_tty(tty)) - - def test_withPycharmNonTTYOverride(self): - non_tty = StreamNonTTY() - with pycharm(), replace_by(non_tty): - self.assertFalse(is_a_tty(non_tty)) - - def test_withPycharmNoneOverride(self): - with pycharm(): - with replace_by(None), replace_original_by(None): - self.assertFalse(is_a_tty(None)) - self.assertFalse(is_a_tty(StreamNonTTY())) - self.assertTrue(is_a_tty(StreamTTY())) - - def test_withPycharmStreamWrapped(self): - with pycharm(): - self.assertTrue(AnsiToWin32(StreamTTY()).stream.isatty()) - self.assertFalse(AnsiToWin32(StreamNonTTY()).stream.isatty()) - self.assertTrue(AnsiToWin32(sys.stdout).stream.isatty()) - self.assertTrue(AnsiToWin32(sys.stderr).stream.isatty()) - - -if __name__ == '__main__': - main() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/utils.py b/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/utils.py deleted file mode 100644 index 472fafb..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/utils.py +++ /dev/null @@ -1,49 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -from contextlib import contextmanager -from io import StringIO -import sys -import os - - -class StreamTTY(StringIO): - def isatty(self): - return True - -class StreamNonTTY(StringIO): - def isatty(self): - return False - -@contextmanager -def osname(name): - orig = os.name - os.name = name - yield - os.name = orig - -@contextmanager -def replace_by(stream): - orig_stdout = sys.stdout - orig_stderr = sys.stderr - sys.stdout = stream - sys.stderr = stream - yield - sys.stdout = orig_stdout - sys.stderr = orig_stderr - -@contextmanager -def replace_original_by(stream): - orig_stdout = sys.__stdout__ - orig_stderr = sys.__stderr__ - sys.__stdout__ = stream - sys.__stderr__ = stream - yield - sys.__stdout__ = orig_stdout - sys.__stderr__ = orig_stderr - -@contextmanager -def pycharm(): - os.environ["PYCHARM_HOSTED"] = "1" - non_tty = StreamNonTTY() - with replace_by(non_tty), replace_original_by(non_tty): - yield - del os.environ["PYCHARM_HOSTED"] diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/winterm_test.py b/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/winterm_test.py deleted file mode 100644 index d0955f9..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/winterm_test.py +++ /dev/null @@ -1,131 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -import sys -from unittest import TestCase, main, skipUnless - -try: - from unittest.mock import Mock, patch -except ImportError: - from mock import Mock, patch - -from ..winterm import WinColor, WinStyle, WinTerm - - -class WinTermTest(TestCase): - - @patch('colorama.winterm.win32') - def testInit(self, mockWin32): - mockAttr = Mock() - mockAttr.wAttributes = 7 + 6 * 16 + 8 - mockWin32.GetConsoleScreenBufferInfo.return_value = mockAttr - term = WinTerm() - self.assertEqual(term._fore, 7) - self.assertEqual(term._back, 6) - self.assertEqual(term._style, 8) - - @skipUnless(sys.platform.startswith("win"), "requires Windows") - def testGetAttrs(self): - term = WinTerm() - - term._fore = 0 - term._back = 0 - term._style = 0 - self.assertEqual(term.get_attrs(), 0) - - term._fore = WinColor.YELLOW - self.assertEqual(term.get_attrs(), WinColor.YELLOW) - - term._back = WinColor.MAGENTA - self.assertEqual( - term.get_attrs(), - WinColor.YELLOW + WinColor.MAGENTA * 16) - - term._style = WinStyle.BRIGHT - self.assertEqual( - term.get_attrs(), - WinColor.YELLOW + WinColor.MAGENTA * 16 + WinStyle.BRIGHT) - - @patch('colorama.winterm.win32') - def testResetAll(self, mockWin32): - mockAttr = Mock() - mockAttr.wAttributes = 1 + 2 * 16 + 8 - mockWin32.GetConsoleScreenBufferInfo.return_value = mockAttr - term = WinTerm() - - term.set_console = Mock() - term._fore = -1 - term._back = -1 - term._style = -1 - - term.reset_all() - - self.assertEqual(term._fore, 1) - self.assertEqual(term._back, 2) - self.assertEqual(term._style, 8) - self.assertEqual(term.set_console.called, True) - - @skipUnless(sys.platform.startswith("win"), "requires Windows") - def testFore(self): - term = WinTerm() - term.set_console = Mock() - term._fore = 0 - - term.fore(5) - - self.assertEqual(term._fore, 5) - self.assertEqual(term.set_console.called, True) - - @skipUnless(sys.platform.startswith("win"), "requires Windows") - def testBack(self): - term = WinTerm() - term.set_console = Mock() - term._back = 0 - - term.back(5) - - self.assertEqual(term._back, 5) - self.assertEqual(term.set_console.called, True) - - @skipUnless(sys.platform.startswith("win"), "requires Windows") - def testStyle(self): - term = WinTerm() - term.set_console = Mock() - term._style = 0 - - term.style(22) - - self.assertEqual(term._style, 22) - self.assertEqual(term.set_console.called, True) - - @patch('colorama.winterm.win32') - def testSetConsole(self, mockWin32): - mockAttr = Mock() - mockAttr.wAttributes = 0 - mockWin32.GetConsoleScreenBufferInfo.return_value = mockAttr - term = WinTerm() - term.windll = Mock() - - term.set_console() - - self.assertEqual( - mockWin32.SetConsoleTextAttribute.call_args, - ((mockWin32.STDOUT, term.get_attrs()), {}) - ) - - @patch('colorama.winterm.win32') - def testSetConsoleOnStderr(self, mockWin32): - mockAttr = Mock() - mockAttr.wAttributes = 0 - mockWin32.GetConsoleScreenBufferInfo.return_value = mockAttr - term = WinTerm() - term.windll = Mock() - - term.set_console(on_stderr=True) - - self.assertEqual( - mockWin32.SetConsoleTextAttribute.call_args, - ((mockWin32.STDERR, term.get_attrs()), {}) - ) - - -if __name__ == '__main__': - main() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/win32.py b/venv/lib/python3.12/site-packages/pip/_vendor/colorama/win32.py deleted file mode 100644 index 841b0e2..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/win32.py +++ /dev/null @@ -1,180 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. - -# from winbase.h -STDOUT = -11 -STDERR = -12 - -ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004 - -try: - import ctypes - from ctypes import LibraryLoader - windll = LibraryLoader(ctypes.WinDLL) - from ctypes import wintypes -except (AttributeError, ImportError): - windll = None - SetConsoleTextAttribute = lambda *_: None - winapi_test = lambda *_: None -else: - from ctypes import byref, Structure, c_char, POINTER - - COORD = wintypes._COORD - - class CONSOLE_SCREEN_BUFFER_INFO(Structure): - """struct in wincon.h.""" - _fields_ = [ - ("dwSize", COORD), - ("dwCursorPosition", COORD), - ("wAttributes", wintypes.WORD), - ("srWindow", wintypes.SMALL_RECT), - ("dwMaximumWindowSize", COORD), - ] - def __str__(self): - return '(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)' % ( - self.dwSize.Y, self.dwSize.X - , self.dwCursorPosition.Y, self.dwCursorPosition.X - , self.wAttributes - , self.srWindow.Top, self.srWindow.Left, self.srWindow.Bottom, self.srWindow.Right - , self.dwMaximumWindowSize.Y, self.dwMaximumWindowSize.X - ) - - _GetStdHandle = windll.kernel32.GetStdHandle - _GetStdHandle.argtypes = [ - wintypes.DWORD, - ] - _GetStdHandle.restype = wintypes.HANDLE - - _GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo - _GetConsoleScreenBufferInfo.argtypes = [ - wintypes.HANDLE, - POINTER(CONSOLE_SCREEN_BUFFER_INFO), - ] - _GetConsoleScreenBufferInfo.restype = wintypes.BOOL - - _SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute - _SetConsoleTextAttribute.argtypes = [ - wintypes.HANDLE, - wintypes.WORD, - ] - _SetConsoleTextAttribute.restype = wintypes.BOOL - - _SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition - _SetConsoleCursorPosition.argtypes = [ - wintypes.HANDLE, - COORD, - ] - _SetConsoleCursorPosition.restype = wintypes.BOOL - - _FillConsoleOutputCharacterA = windll.kernel32.FillConsoleOutputCharacterA - _FillConsoleOutputCharacterA.argtypes = [ - wintypes.HANDLE, - c_char, - wintypes.DWORD, - COORD, - POINTER(wintypes.DWORD), - ] - _FillConsoleOutputCharacterA.restype = wintypes.BOOL - - _FillConsoleOutputAttribute = windll.kernel32.FillConsoleOutputAttribute - _FillConsoleOutputAttribute.argtypes = [ - wintypes.HANDLE, - wintypes.WORD, - wintypes.DWORD, - COORD, - POINTER(wintypes.DWORD), - ] - _FillConsoleOutputAttribute.restype = wintypes.BOOL - - _SetConsoleTitleW = windll.kernel32.SetConsoleTitleW - _SetConsoleTitleW.argtypes = [ - wintypes.LPCWSTR - ] - _SetConsoleTitleW.restype = wintypes.BOOL - - _GetConsoleMode = windll.kernel32.GetConsoleMode - _GetConsoleMode.argtypes = [ - wintypes.HANDLE, - POINTER(wintypes.DWORD) - ] - _GetConsoleMode.restype = wintypes.BOOL - - _SetConsoleMode = windll.kernel32.SetConsoleMode - _SetConsoleMode.argtypes = [ - wintypes.HANDLE, - wintypes.DWORD - ] - _SetConsoleMode.restype = wintypes.BOOL - - def _winapi_test(handle): - csbi = CONSOLE_SCREEN_BUFFER_INFO() - success = _GetConsoleScreenBufferInfo( - handle, byref(csbi)) - return bool(success) - - def winapi_test(): - return any(_winapi_test(h) for h in - (_GetStdHandle(STDOUT), _GetStdHandle(STDERR))) - - def GetConsoleScreenBufferInfo(stream_id=STDOUT): - handle = _GetStdHandle(stream_id) - csbi = CONSOLE_SCREEN_BUFFER_INFO() - success = _GetConsoleScreenBufferInfo( - handle, byref(csbi)) - return csbi - - def SetConsoleTextAttribute(stream_id, attrs): - handle = _GetStdHandle(stream_id) - return _SetConsoleTextAttribute(handle, attrs) - - def SetConsoleCursorPosition(stream_id, position, adjust=True): - position = COORD(*position) - # If the position is out of range, do nothing. - if position.Y <= 0 or position.X <= 0: - return - # Adjust for Windows' SetConsoleCursorPosition: - # 1. being 0-based, while ANSI is 1-based. - # 2. expecting (x,y), while ANSI uses (y,x). - adjusted_position = COORD(position.Y - 1, position.X - 1) - if adjust: - # Adjust for viewport's scroll position - sr = GetConsoleScreenBufferInfo(STDOUT).srWindow - adjusted_position.Y += sr.Top - adjusted_position.X += sr.Left - # Resume normal processing - handle = _GetStdHandle(stream_id) - return _SetConsoleCursorPosition(handle, adjusted_position) - - def FillConsoleOutputCharacter(stream_id, char, length, start): - handle = _GetStdHandle(stream_id) - char = c_char(char.encode()) - length = wintypes.DWORD(length) - num_written = wintypes.DWORD(0) - # Note that this is hard-coded for ANSI (vs wide) bytes. - success = _FillConsoleOutputCharacterA( - handle, char, length, start, byref(num_written)) - return num_written.value - - def FillConsoleOutputAttribute(stream_id, attr, length, start): - ''' FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten )''' - handle = _GetStdHandle(stream_id) - attribute = wintypes.WORD(attr) - length = wintypes.DWORD(length) - num_written = wintypes.DWORD(0) - # Note that this is hard-coded for ANSI (vs wide) bytes. - return _FillConsoleOutputAttribute( - handle, attribute, length, start, byref(num_written)) - - def SetConsoleTitle(title): - return _SetConsoleTitleW(title) - - def GetConsoleMode(handle): - mode = wintypes.DWORD() - success = _GetConsoleMode(handle, byref(mode)) - if not success: - raise ctypes.WinError() - return mode.value - - def SetConsoleMode(handle, mode): - success = _SetConsoleMode(handle, mode) - if not success: - raise ctypes.WinError() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/winterm.py b/venv/lib/python3.12/site-packages/pip/_vendor/colorama/winterm.py deleted file mode 100644 index aad867e..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/colorama/winterm.py +++ /dev/null @@ -1,195 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -try: - from msvcrt import get_osfhandle -except ImportError: - def get_osfhandle(_): - raise OSError("This isn't windows!") - - -from . import win32 - -# from wincon.h -class WinColor(object): - BLACK = 0 - BLUE = 1 - GREEN = 2 - CYAN = 3 - RED = 4 - MAGENTA = 5 - YELLOW = 6 - GREY = 7 - -# from wincon.h -class WinStyle(object): - NORMAL = 0x00 # dim text, dim background - BRIGHT = 0x08 # bright text, dim background - BRIGHT_BACKGROUND = 0x80 # dim text, bright background - -class WinTerm(object): - - def __init__(self): - self._default = win32.GetConsoleScreenBufferInfo(win32.STDOUT).wAttributes - self.set_attrs(self._default) - self._default_fore = self._fore - self._default_back = self._back - self._default_style = self._style - # In order to emulate LIGHT_EX in windows, we borrow the BRIGHT style. - # So that LIGHT_EX colors and BRIGHT style do not clobber each other, - # we track them separately, since LIGHT_EX is overwritten by Fore/Back - # and BRIGHT is overwritten by Style codes. - self._light = 0 - - def get_attrs(self): - return self._fore + self._back * 16 + (self._style | self._light) - - def set_attrs(self, value): - self._fore = value & 7 - self._back = (value >> 4) & 7 - self._style = value & (WinStyle.BRIGHT | WinStyle.BRIGHT_BACKGROUND) - - def reset_all(self, on_stderr=None): - self.set_attrs(self._default) - self.set_console(attrs=self._default) - self._light = 0 - - def fore(self, fore=None, light=False, on_stderr=False): - if fore is None: - fore = self._default_fore - self._fore = fore - # Emulate LIGHT_EX with BRIGHT Style - if light: - self._light |= WinStyle.BRIGHT - else: - self._light &= ~WinStyle.BRIGHT - self.set_console(on_stderr=on_stderr) - - def back(self, back=None, light=False, on_stderr=False): - if back is None: - back = self._default_back - self._back = back - # Emulate LIGHT_EX with BRIGHT_BACKGROUND Style - if light: - self._light |= WinStyle.BRIGHT_BACKGROUND - else: - self._light &= ~WinStyle.BRIGHT_BACKGROUND - self.set_console(on_stderr=on_stderr) - - def style(self, style=None, on_stderr=False): - if style is None: - style = self._default_style - self._style = style - self.set_console(on_stderr=on_stderr) - - def set_console(self, attrs=None, on_stderr=False): - if attrs is None: - attrs = self.get_attrs() - handle = win32.STDOUT - if on_stderr: - handle = win32.STDERR - win32.SetConsoleTextAttribute(handle, attrs) - - def get_position(self, handle): - position = win32.GetConsoleScreenBufferInfo(handle).dwCursorPosition - # Because Windows coordinates are 0-based, - # and win32.SetConsoleCursorPosition expects 1-based. - position.X += 1 - position.Y += 1 - return position - - def set_cursor_position(self, position=None, on_stderr=False): - if position is None: - # I'm not currently tracking the position, so there is no default. - # position = self.get_position() - return - handle = win32.STDOUT - if on_stderr: - handle = win32.STDERR - win32.SetConsoleCursorPosition(handle, position) - - def cursor_adjust(self, x, y, on_stderr=False): - handle = win32.STDOUT - if on_stderr: - handle = win32.STDERR - position = self.get_position(handle) - adjusted_position = (position.Y + y, position.X + x) - win32.SetConsoleCursorPosition(handle, adjusted_position, adjust=False) - - def erase_screen(self, mode=0, on_stderr=False): - # 0 should clear from the cursor to the end of the screen. - # 1 should clear from the cursor to the beginning of the screen. - # 2 should clear the entire screen, and move cursor to (1,1) - handle = win32.STDOUT - if on_stderr: - handle = win32.STDERR - csbi = win32.GetConsoleScreenBufferInfo(handle) - # get the number of character cells in the current buffer - cells_in_screen = csbi.dwSize.X * csbi.dwSize.Y - # get number of character cells before current cursor position - cells_before_cursor = csbi.dwSize.X * csbi.dwCursorPosition.Y + csbi.dwCursorPosition.X - if mode == 0: - from_coord = csbi.dwCursorPosition - cells_to_erase = cells_in_screen - cells_before_cursor - elif mode == 1: - from_coord = win32.COORD(0, 0) - cells_to_erase = cells_before_cursor - elif mode == 2: - from_coord = win32.COORD(0, 0) - cells_to_erase = cells_in_screen - else: - # invalid mode - return - # fill the entire screen with blanks - win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) - # now set the buffer's attributes accordingly - win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) - if mode == 2: - # put the cursor where needed - win32.SetConsoleCursorPosition(handle, (1, 1)) - - def erase_line(self, mode=0, on_stderr=False): - # 0 should clear from the cursor to the end of the line. - # 1 should clear from the cursor to the beginning of the line. - # 2 should clear the entire line. - handle = win32.STDOUT - if on_stderr: - handle = win32.STDERR - csbi = win32.GetConsoleScreenBufferInfo(handle) - if mode == 0: - from_coord = csbi.dwCursorPosition - cells_to_erase = csbi.dwSize.X - csbi.dwCursorPosition.X - elif mode == 1: - from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) - cells_to_erase = csbi.dwCursorPosition.X - elif mode == 2: - from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) - cells_to_erase = csbi.dwSize.X - else: - # invalid mode - return - # fill the entire screen with blanks - win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) - # now set the buffer's attributes accordingly - win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) - - def set_title(self, title): - win32.SetConsoleTitle(title) - - -def enable_vt_processing(fd): - if win32.windll is None or not win32.winapi_test(): - return False - - try: - handle = get_osfhandle(fd) - mode = win32.GetConsoleMode(handle) - win32.SetConsoleMode( - handle, - mode | win32.ENABLE_VIRTUAL_TERMINAL_PROCESSING, - ) - - mode = win32.GetConsoleMode(handle) - if mode & win32.ENABLE_VIRTUAL_TERMINAL_PROCESSING: - return True - # Can get TypeError in testsuite where 'fd' is a Mock() - except (OSError, TypeError): - return False diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__init__.py deleted file mode 100644 index e999438..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__init__.py +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012-2023 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -import logging - -__version__ = '0.3.8' - - -class DistlibException(Exception): - pass - - -try: - from logging import NullHandler -except ImportError: # pragma: no cover - - class NullHandler(logging.Handler): - - def handle(self, record): - pass - - def emit(self, record): - pass - - def createLock(self): - self.lock = None - - -logger = logging.getLogger(__name__) -logger.addHandler(NullHandler()) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index e5db635d3dbac8a98d38e7f6cf4bfc2a509ccc01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1290 zcmaJ=%}*0i5TCc*F5MQ84?#pgj9wZ;SLMRNn2<n}g!E1?n|0r_UD=QNcKIlJ;J|@{ zCJ+vI@=o|GNW6I>#y~bPG4bTBp~M(Y&TLx?#`q5N=FOX#-^{$<`_$8u1zh%r*OgZa zz;`;dm)24mA5qx{4xG7A0<M&p0#AXbwt%ZbIZQSEN-3Ru(k^&vNoAmbfS0}PWSw1P z4p}Qg7y8Sg&P`jxNcFIFX!|m#vAZDB_dt$NZp7CRzY8(C+i{)!Pfh9)yq#Zz_0$rq zv3%wSxfD0j4+_(T8N1^T&?*TUlx-hNFEI`!rN;6~+&AZhk?TC4U$;dyast1YPsJJ2 z^es=AW}G!mFW@UK>D{LJYQ=J!HwVxlh>Osu1fDQFD+*VQxxilWgdc@QBwSIJmNykf zj=e186c5&XH?X*n#;WjF4TLnRwWt#K(}jnRjL?b1RMoPVt+EJ>s#7&gbmM_Ec(Xpk zG#%fGOtVm}NfnV3K@Ejz6kBkrW~AP>=UJR9uDI?q%jd3;|DMJKdUvM5*%p*iTtTVQ z^Ow>!HJ_F_bh42>R~E6NK}GCC4GvgQW>7y+Vl@=*i&&Gw4kQmLYI0H%31h92RI)K} zsj5QLHjMWT>R}U3yZe$J{tqaLcnPGuhT0VzRd`Oc(RUezEH^1)kOYm$ZW97^q#Hoe z&j2d)6W)MH_GHx{0mE^sZeTCxne0P*Nb#-4vbGdfBo^^@WB4*`$38|Ogo_Q1jBU@o zTS%%X<~2!eOZtnliv*P*>C?y&5;WE3o6-!Er%1$gJca!zw%|-<djFY*qJd((=}m8z z&&6GCP%b-uInJ3#CK)2Rk;VESrZ;Is&T($Rs|GTfmokuXSBo{VUKY_J<`6O|G}b7g zka5=Hyyf#(jTf26&F}I=-od;yr?7&eo??tOdVyX0);qMBJJ%S~cWUQ=TRqdm#=oj} z>l2W@wSD76A3fGb-_Ly3?`>+Qpq)VfG4$`=-<$dZlfUY>Av1UeIW~T->gn;F@_w)z b`~+0%X*6CWQ`ysI6*y8xXK$yDCK$@!sFD^@ diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-312.pyc deleted file mode 100644 index 32247f8d243c489d35c70aeb45a94d59ef5120a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45626 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 G>Hh=HsV$uV diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-312.pyc deleted file mode 100644 index 6d0c4b89bfadf7eac70bd0826fc44bcd6284d37f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66048 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-312.pyc deleted file mode 100644 index 57db32005a9042b84faac1e1436ac4ff6ae6d111..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24387 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 Z+8?r5)o*(ai`);yz~OG^54w1y{~JQ00H^=} diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-312.pyc deleted file mode 100644 index 276974f82a16c9cd9061abc9c0c01d35cbeec382..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60179 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-312.pyc deleted file mode 100644 index 8cbfe84b2c1147382be4a87a6dff94681bc132cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15146 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-312.pyc deleted file mode 100644 index c21f6f261be5d912cfbbe42233b7102e6c52edae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7703 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-312.pyc deleted file mode 100644 index c125c8d51d68cc5ea7ca955faed0aa2fb4898d2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41820 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-312.pyc deleted file mode 100644 index ccc598667eded68999e88587893b69fb2b44b7af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17346 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 Bycz%i diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc deleted file mode 100644 index 75778cc8d2ee774196afaffe995a9b15a6a03f6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19601 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-312.pyc deleted file mode 100644 index 69c3a49f1f39207f2bbf4942f9b507ce98916edb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88277 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 XT^ilr?cfmpz0T5=qWgOXhw%RcJ%$&I diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-312.pyc deleted file mode 100644 index 94f300750b6220c2b5549b7f487a6295bac0b2da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30387 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 G!2bhzo}qF8 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-312.pyc deleted file mode 100644 index 77c7ed2a7cce62601e77c88f60e3099de4d83a51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51882 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 QEkM;O>yldJQ`so|4;y&)g#Z8m diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/compat.py b/venv/lib/python3.12/site-packages/pip/_vendor/distlib/compat.py deleted file mode 100644 index e93dc27..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/compat.py +++ /dev/null @@ -1,1138 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2013-2017 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -from __future__ import absolute_import - -import os -import re -import shutil -import sys - -try: - import ssl -except ImportError: # pragma: no cover - ssl = None - -if sys.version_info[0] < 3: # pragma: no cover - from StringIO import StringIO - string_types = basestring, - text_type = unicode - from types import FileType as file_type - import __builtin__ as builtins - import ConfigParser as configparser - from urlparse import urlparse, urlunparse, urljoin, urlsplit, urlunsplit - from urllib import (urlretrieve, quote as _quote, unquote, url2pathname, - pathname2url, ContentTooShortError, splittype) - - def quote(s): - if isinstance(s, unicode): - s = s.encode('utf-8') - return _quote(s) - - import urllib2 - from urllib2 import (Request, urlopen, URLError, HTTPError, - HTTPBasicAuthHandler, HTTPPasswordMgr, HTTPHandler, - HTTPRedirectHandler, build_opener) - if ssl: - from urllib2 import HTTPSHandler - import httplib - import xmlrpclib - import Queue as queue - from HTMLParser import HTMLParser - import htmlentitydefs - raw_input = raw_input - from itertools import ifilter as filter - from itertools import ifilterfalse as filterfalse - - # Leaving this around for now, in case it needs resurrecting in some way - # _userprog = None - # def splituser(host): - # """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.""" - # global _userprog - # if _userprog is None: - # import re - # _userprog = re.compile('^(.*)@(.*)$') - - # match = _userprog.match(host) - # if match: return match.group(1, 2) - # return None, host - -else: # pragma: no cover - from io import StringIO - string_types = str, - text_type = str - from io import TextIOWrapper as file_type - import builtins - import configparser - from urllib.parse import (urlparse, urlunparse, urljoin, quote, unquote, - urlsplit, urlunsplit, splittype) - from urllib.request import (urlopen, urlretrieve, Request, url2pathname, - pathname2url, HTTPBasicAuthHandler, - HTTPPasswordMgr, HTTPHandler, - HTTPRedirectHandler, build_opener) - if ssl: - from urllib.request import HTTPSHandler - from urllib.error import HTTPError, URLError, ContentTooShortError - import http.client as httplib - import urllib.request as urllib2 - import xmlrpc.client as xmlrpclib - import queue - from html.parser import HTMLParser - import html.entities as htmlentitydefs - raw_input = input - from itertools import filterfalse - filter = filter - -try: - from ssl import match_hostname, CertificateError -except ImportError: # pragma: no cover - - class CertificateError(ValueError): - pass - - def _dnsname_match(dn, hostname, max_wildcards=1): - """Matching according to RFC 6125, section 6.4.3 - - http://tools.ietf.org/html/rfc6125#section-6.4.3 - """ - pats = [] - if not dn: - return False - - parts = dn.split('.') - leftmost, remainder = parts[0], parts[1:] - - wildcards = leftmost.count('*') - if wildcards > max_wildcards: - # Issue #17980: avoid denials of service by refusing more - # than one wildcard per fragment. A survey of established - # policy among SSL implementations showed it to be a - # reasonable choice. - raise CertificateError( - "too many wildcards in certificate DNS name: " + repr(dn)) - - # speed up common case w/o wildcards - if not wildcards: - return dn.lower() == hostname.lower() - - # RFC 6125, section 6.4.3, subitem 1. - # The client SHOULD NOT attempt to match a presented identifier in which - # the wildcard character comprises a label other than the left-most label. - if leftmost == '*': - # When '*' is a fragment by itself, it matches a non-empty dotless - # fragment. - pats.append('[^.]+') - elif leftmost.startswith('xn--') or hostname.startswith('xn--'): - # RFC 6125, section 6.4.3, subitem 3. - # The client SHOULD NOT attempt to match a presented identifier - # where the wildcard character is embedded within an A-label or - # U-label of an internationalized domain name. - pats.append(re.escape(leftmost)) - else: - # Otherwise, '*' matches any dotless string, e.g. www* - pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) - - # add the remaining fragments, ignore any wildcards - for frag in remainder: - pats.append(re.escape(frag)) - - pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) - return pat.match(hostname) - - def match_hostname(cert, hostname): - """Verify that *cert* (in decoded format as returned by - SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 - rules are followed, but IP addresses are not accepted for *hostname*. - - CertificateError is raised on failure. On success, the function - returns nothing. - """ - if not cert: - raise ValueError("empty or no certificate, match_hostname needs a " - "SSL socket or SSL context with either " - "CERT_OPTIONAL or CERT_REQUIRED") - dnsnames = [] - san = cert.get('subjectAltName', ()) - for key, value in san: - if key == 'DNS': - if _dnsname_match(value, hostname): - return - dnsnames.append(value) - if not dnsnames: - # The subject is only checked when there is no dNSName entry - # in subjectAltName - for sub in cert.get('subject', ()): - for key, value in sub: - # XXX according to RFC 2818, the most specific Common Name - # must be used. - if key == 'commonName': - if _dnsname_match(value, hostname): - return - dnsnames.append(value) - if len(dnsnames) > 1: - raise CertificateError("hostname %r " - "doesn't match either of %s" % - (hostname, ', '.join(map(repr, dnsnames)))) - elif len(dnsnames) == 1: - raise CertificateError("hostname %r " - "doesn't match %r" % - (hostname, dnsnames[0])) - else: - raise CertificateError("no appropriate commonName or " - "subjectAltName fields were found") - - -try: - from types import SimpleNamespace as Container -except ImportError: # pragma: no cover - - class Container(object): - """ - A generic container for when multiple values need to be returned - """ - - def __init__(self, **kwargs): - self.__dict__.update(kwargs) - - -try: - from shutil import which -except ImportError: # pragma: no cover - # Implementation from Python 3.3 - def which(cmd, mode=os.F_OK | os.X_OK, path=None): - """Given a command, mode, and a PATH string, return the path which - conforms to the given mode on the PATH, or None if there is no such - file. - - `mode` defaults to os.F_OK | os.X_OK. `path` defaults to the result - of os.environ.get("PATH"), or can be overridden with a custom search - path. - - """ - - # Check that a given file can be accessed with the correct mode. - # Additionally check that `file` is not a directory, as on Windows - # directories pass the os.access check. - def _access_check(fn, mode): - return (os.path.exists(fn) and os.access(fn, mode) - and not os.path.isdir(fn)) - - # If we're given a path with a directory part, look it up directly rather - # than referring to PATH directories. This includes checking relative to the - # current directory, e.g. ./script - if os.path.dirname(cmd): - if _access_check(cmd, mode): - return cmd - return None - - if path is None: - path = os.environ.get("PATH", os.defpath) - if not path: - return None - path = path.split(os.pathsep) - - if sys.platform == "win32": - # The current directory takes precedence on Windows. - if os.curdir not in path: - path.insert(0, os.curdir) - - # PATHEXT is necessary to check on Windows. - pathext = os.environ.get("PATHEXT", "").split(os.pathsep) - # See if the given file matches any of the expected path extensions. - # This will allow us to short circuit when given "python.exe". - # If it does match, only test that one, otherwise we have to try - # others. - if any(cmd.lower().endswith(ext.lower()) for ext in pathext): - files = [cmd] - else: - files = [cmd + ext for ext in pathext] - else: - # On other platforms you don't have things like PATHEXT to tell you - # what file suffixes are executable, so just pass on cmd as-is. - files = [cmd] - - seen = set() - for dir in path: - normdir = os.path.normcase(dir) - if normdir not in seen: - seen.add(normdir) - for thefile in files: - name = os.path.join(dir, thefile) - if _access_check(name, mode): - return name - return None - - -# ZipFile is a context manager in 2.7, but not in 2.6 - -from zipfile import ZipFile as BaseZipFile - -if hasattr(BaseZipFile, '__enter__'): # pragma: no cover - ZipFile = BaseZipFile -else: # pragma: no cover - from zipfile import ZipExtFile as BaseZipExtFile - - class ZipExtFile(BaseZipExtFile): - - def __init__(self, base): - self.__dict__.update(base.__dict__) - - def __enter__(self): - return self - - def __exit__(self, *exc_info): - self.close() - # return None, so if an exception occurred, it will propagate - - class ZipFile(BaseZipFile): - - def __enter__(self): - return self - - def __exit__(self, *exc_info): - self.close() - # return None, so if an exception occurred, it will propagate - - def open(self, *args, **kwargs): - base = BaseZipFile.open(self, *args, **kwargs) - return ZipExtFile(base) - - -try: - from platform import python_implementation -except ImportError: # pragma: no cover - - def python_implementation(): - """Return a string identifying the Python implementation.""" - if 'PyPy' in sys.version: - return 'PyPy' - if os.name == 'java': - return 'Jython' - if sys.version.startswith('IronPython'): - return 'IronPython' - return 'CPython' - - -import sysconfig - -try: - callable = callable -except NameError: # pragma: no cover - from collections.abc import Callable - - def callable(obj): - return isinstance(obj, Callable) - - -try: - fsencode = os.fsencode - fsdecode = os.fsdecode -except AttributeError: # pragma: no cover - # Issue #99: on some systems (e.g. containerised), - # sys.getfilesystemencoding() returns None, and we need a real value, - # so fall back to utf-8. From the CPython 2.7 docs relating to Unix and - # sys.getfilesystemencoding(): the return value is "the user’s preference - # according to the result of nl_langinfo(CODESET), or None if the - # nl_langinfo(CODESET) failed." - _fsencoding = sys.getfilesystemencoding() or 'utf-8' - if _fsencoding == 'mbcs': - _fserrors = 'strict' - else: - _fserrors = 'surrogateescape' - - def fsencode(filename): - if isinstance(filename, bytes): - return filename - elif isinstance(filename, text_type): - return filename.encode(_fsencoding, _fserrors) - else: - raise TypeError("expect bytes or str, not %s" % - type(filename).__name__) - - def fsdecode(filename): - if isinstance(filename, text_type): - return filename - elif isinstance(filename, bytes): - return filename.decode(_fsencoding, _fserrors) - else: - raise TypeError("expect bytes or str, not %s" % - type(filename).__name__) - - -try: - from tokenize import detect_encoding -except ImportError: # pragma: no cover - from codecs import BOM_UTF8, lookup - - cookie_re = re.compile(r"coding[:=]\s*([-\w.]+)") - - def _get_normal_name(orig_enc): - """Imitates get_normal_name in tokenizer.c.""" - # Only care about the first 12 characters. - enc = orig_enc[:12].lower().replace("_", "-") - if enc == "utf-8" or enc.startswith("utf-8-"): - return "utf-8" - if enc in ("latin-1", "iso-8859-1", "iso-latin-1") or \ - enc.startswith(("latin-1-", "iso-8859-1-", "iso-latin-1-")): - return "iso-8859-1" - return orig_enc - - def detect_encoding(readline): - """ - The detect_encoding() function is used to detect the encoding that should - be used to decode a Python source file. It requires one argument, readline, - in the same way as the tokenize() generator. - - It will call readline a maximum of twice, and return the encoding used - (as a string) and a list of any lines (left as bytes) it has read in. - - It detects the encoding from the presence of a utf-8 bom or an encoding - cookie as specified in pep-0263. If both a bom and a cookie are present, - but disagree, a SyntaxError will be raised. If the encoding cookie is an - invalid charset, raise a SyntaxError. Note that if a utf-8 bom is found, - 'utf-8-sig' is returned. - - If no encoding is specified, then the default of 'utf-8' will be returned. - """ - try: - filename = readline.__self__.name - except AttributeError: - filename = None - bom_found = False - encoding = None - default = 'utf-8' - - def read_or_stop(): - try: - return readline() - except StopIteration: - return b'' - - def find_cookie(line): - try: - # Decode as UTF-8. Either the line is an encoding declaration, - # in which case it should be pure ASCII, or it must be UTF-8 - # per default encoding. - line_string = line.decode('utf-8') - except UnicodeDecodeError: - msg = "invalid or missing encoding declaration" - if filename is not None: - msg = '{} for {!r}'.format(msg, filename) - raise SyntaxError(msg) - - matches = cookie_re.findall(line_string) - if not matches: - return None - encoding = _get_normal_name(matches[0]) - try: - codec = lookup(encoding) - except LookupError: - # This behaviour mimics the Python interpreter - if filename is None: - msg = "unknown encoding: " + encoding - else: - msg = "unknown encoding for {!r}: {}".format( - filename, encoding) - raise SyntaxError(msg) - - if bom_found: - if codec.name != 'utf-8': - # This behaviour mimics the Python interpreter - if filename is None: - msg = 'encoding problem: utf-8' - else: - msg = 'encoding problem for {!r}: utf-8'.format( - filename) - raise SyntaxError(msg) - encoding += '-sig' - return encoding - - first = read_or_stop() - if first.startswith(BOM_UTF8): - bom_found = True - first = first[3:] - default = 'utf-8-sig' - if not first: - return default, [] - - encoding = find_cookie(first) - if encoding: - return encoding, [first] - - second = read_or_stop() - if not second: - return default, [first] - - encoding = find_cookie(second) - if encoding: - return encoding, [first, second] - - return default, [first, second] - - -# For converting & <-> &amp; etc. -try: - from html import escape -except ImportError: - from cgi import escape -if sys.version_info[:2] < (3, 4): - unescape = HTMLParser().unescape -else: - from html import unescape - -try: - from collections import ChainMap -except ImportError: # pragma: no cover - from collections import MutableMapping - - try: - from reprlib import recursive_repr as _recursive_repr - except ImportError: - - def _recursive_repr(fillvalue='...'): - ''' - Decorator to make a repr function return fillvalue for a recursive - call - ''' - - def decorating_function(user_function): - repr_running = set() - - def wrapper(self): - key = id(self), get_ident() - if key in repr_running: - return fillvalue - repr_running.add(key) - try: - result = user_function(self) - finally: - repr_running.discard(key) - return result - - # Can't use functools.wraps() here because of bootstrap issues - wrapper.__module__ = getattr(user_function, '__module__') - wrapper.__doc__ = getattr(user_function, '__doc__') - wrapper.__name__ = getattr(user_function, '__name__') - wrapper.__annotations__ = getattr(user_function, - '__annotations__', {}) - return wrapper - - return decorating_function - - class ChainMap(MutableMapping): - ''' - A ChainMap groups multiple dicts (or other mappings) together - to create a single, updateable view. - - The underlying mappings are stored in a list. That list is public and can - accessed or updated using the *maps* attribute. There is no other state. - - Lookups search the underlying mappings successively until a key is found. - In contrast, writes, updates, and deletions only operate on the first - mapping. - ''' - - def __init__(self, *maps): - '''Initialize a ChainMap by setting *maps* to the given mappings. - If no mappings are provided, a single empty dictionary is used. - - ''' - self.maps = list(maps) or [{}] # always at least one map - - def __missing__(self, key): - raise KeyError(key) - - def __getitem__(self, key): - for mapping in self.maps: - try: - return mapping[ - key] # can't use 'key in mapping' with defaultdict - except KeyError: - pass - return self.__missing__( - key) # support subclasses that define __missing__ - - def get(self, key, default=None): - return self[key] if key in self else default - - def __len__(self): - return len(set().union( - *self.maps)) # reuses stored hash values if possible - - def __iter__(self): - return iter(set().union(*self.maps)) - - def __contains__(self, key): - return any(key in m for m in self.maps) - - def __bool__(self): - return any(self.maps) - - @_recursive_repr() - def __repr__(self): - return '{0.__class__.__name__}({1})'.format( - self, ', '.join(map(repr, self.maps))) - - @classmethod - def fromkeys(cls, iterable, *args): - 'Create a ChainMap with a single dict created from the iterable.' - return cls(dict.fromkeys(iterable, *args)) - - def copy(self): - 'New ChainMap or subclass with a new copy of maps[0] and refs to maps[1:]' - return self.__class__(self.maps[0].copy(), *self.maps[1:]) - - __copy__ = copy - - def new_child(self): # like Django's Context.push() - 'New ChainMap with a new dict followed by all previous maps.' - return self.__class__({}, *self.maps) - - @property - def parents(self): # like Django's Context.pop() - 'New ChainMap from maps[1:].' - return self.__class__(*self.maps[1:]) - - def __setitem__(self, key, value): - self.maps[0][key] = value - - def __delitem__(self, key): - try: - del self.maps[0][key] - except KeyError: - raise KeyError( - 'Key not found in the first mapping: {!r}'.format(key)) - - def popitem(self): - 'Remove and return an item pair from maps[0]. Raise KeyError is maps[0] is empty.' - try: - return self.maps[0].popitem() - except KeyError: - raise KeyError('No keys found in the first mapping.') - - def pop(self, key, *args): - 'Remove *key* from maps[0] and return its value. Raise KeyError if *key* not in maps[0].' - try: - return self.maps[0].pop(key, *args) - except KeyError: - raise KeyError( - 'Key not found in the first mapping: {!r}'.format(key)) - - def clear(self): - 'Clear maps[0], leaving maps[1:] intact.' - self.maps[0].clear() - - -try: - from importlib.util import cache_from_source # Python >= 3.4 -except ImportError: # pragma: no cover - - def cache_from_source(path, debug_override=None): - assert path.endswith('.py') - if debug_override is None: - debug_override = __debug__ - if debug_override: - suffix = 'c' - else: - suffix = 'o' - return path + suffix - - -try: - from collections import OrderedDict -except ImportError: # pragma: no cover - # {{{ http://code.activestate.com/recipes/576693/ (r9) - # Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy. - # Passes Python2.7's test suite and incorporates all the latest updates. - try: - from thread import get_ident as _get_ident - except ImportError: - from dummy_thread import get_ident as _get_ident - - try: - from _abcoll import KeysView, ValuesView, ItemsView - except ImportError: - pass - - class OrderedDict(dict): - 'Dictionary that remembers insertion order' - - # An inherited dict maps keys to values. - # The inherited dict provides __getitem__, __len__, __contains__, and get. - # The remaining methods are order-aware. - # Big-O running times for all methods are the same as for regular dictionaries. - - # The internal self.__map dictionary maps keys to links in a doubly linked list. - # The circular doubly linked list starts and ends with a sentinel element. - # The sentinel element never gets deleted (this simplifies the algorithm). - # Each link is stored as a list of length three: [PREV, NEXT, KEY]. - - def __init__(self, *args, **kwds): - '''Initialize an ordered dictionary. Signature is the same as for - regular dictionaries, but keyword arguments are not recommended - because their insertion order is arbitrary. - - ''' - if len(args) > 1: - raise TypeError('expected at most 1 arguments, got %d' % - len(args)) - try: - self.__root - except AttributeError: - self.__root = root = [] # sentinel node - root[:] = [root, root, None] - self.__map = {} - self.__update(*args, **kwds) - - def __setitem__(self, key, value, dict_setitem=dict.__setitem__): - 'od.__setitem__(i, y) <==> od[i]=y' - # Setting a new item creates a new link which goes at the end of the linked - # list, and the inherited dictionary is updated with the new key/value pair. - if key not in self: - root = self.__root - last = root[0] - last[1] = root[0] = self.__map[key] = [last, root, key] - dict_setitem(self, key, value) - - def __delitem__(self, key, dict_delitem=dict.__delitem__): - 'od.__delitem__(y) <==> del od[y]' - # Deleting an existing item uses self.__map to find the link which is - # then removed by updating the links in the predecessor and successor nodes. - dict_delitem(self, key) - link_prev, link_next, key = self.__map.pop(key) - link_prev[1] = link_next - link_next[0] = link_prev - - def __iter__(self): - 'od.__iter__() <==> iter(od)' - root = self.__root - curr = root[1] - while curr is not root: - yield curr[2] - curr = curr[1] - - def __reversed__(self): - 'od.__reversed__() <==> reversed(od)' - root = self.__root - curr = root[0] - while curr is not root: - yield curr[2] - curr = curr[0] - - def clear(self): - 'od.clear() -> None. Remove all items from od.' - try: - for node in self.__map.itervalues(): - del node[:] - root = self.__root - root[:] = [root, root, None] - self.__map.clear() - except AttributeError: - pass - dict.clear(self) - - def popitem(self, last=True): - '''od.popitem() -> (k, v), return and remove a (key, value) pair. - Pairs are returned in LIFO order if last is true or FIFO order if false. - - ''' - if not self: - raise KeyError('dictionary is empty') - root = self.__root - if last: - link = root[0] - link_prev = link[0] - link_prev[1] = root - root[0] = link_prev - else: - link = root[1] - link_next = link[1] - root[1] = link_next - link_next[0] = root - key = link[2] - del self.__map[key] - value = dict.pop(self, key) - return key, value - - # -- the following methods do not depend on the internal structure -- - - def keys(self): - 'od.keys() -> list of keys in od' - return list(self) - - def values(self): - 'od.values() -> list of values in od' - return [self[key] for key in self] - - def items(self): - 'od.items() -> list of (key, value) pairs in od' - return [(key, self[key]) for key in self] - - def iterkeys(self): - 'od.iterkeys() -> an iterator over the keys in od' - return iter(self) - - def itervalues(self): - 'od.itervalues -> an iterator over the values in od' - for k in self: - yield self[k] - - def iteritems(self): - 'od.iteritems -> an iterator over the (key, value) items in od' - for k in self: - yield (k, self[k]) - - def update(*args, **kwds): - '''od.update(E, **F) -> None. Update od from dict/iterable E and F. - - If E is a dict instance, does: for k in E: od[k] = E[k] - If E has a .keys() method, does: for k in E.keys(): od[k] = E[k] - Or if E is an iterable of items, does: for k, v in E: od[k] = v - In either case, this is followed by: for k, v in F.items(): od[k] = v - - ''' - if len(args) > 2: - raise TypeError('update() takes at most 2 positional ' - 'arguments (%d given)' % (len(args), )) - elif not args: - raise TypeError('update() takes at least 1 argument (0 given)') - self = args[0] - # Make progressively weaker assumptions about "other" - other = () - if len(args) == 2: - other = args[1] - if isinstance(other, dict): - for key in other: - self[key] = other[key] - elif hasattr(other, 'keys'): - for key in other.keys(): - self[key] = other[key] - else: - for key, value in other: - self[key] = value - for key, value in kwds.items(): - self[key] = value - - __update = update # let subclasses override update without breaking __init__ - - __marker = object() - - def pop(self, key, default=__marker): - '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value. - If key is not found, d is returned if given, otherwise KeyError is raised. - - ''' - if key in self: - result = self[key] - del self[key] - return result - if default is self.__marker: - raise KeyError(key) - return default - - def setdefault(self, key, default=None): - 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od' - if key in self: - return self[key] - self[key] = default - return default - - def __repr__(self, _repr_running=None): - 'od.__repr__() <==> repr(od)' - if not _repr_running: - _repr_running = {} - call_key = id(self), _get_ident() - if call_key in _repr_running: - return '...' - _repr_running[call_key] = 1 - try: - if not self: - return '%s()' % (self.__class__.__name__, ) - return '%s(%r)' % (self.__class__.__name__, self.items()) - finally: - del _repr_running[call_key] - - def __reduce__(self): - 'Return state information for pickling' - items = [[k, self[k]] for k in self] - inst_dict = vars(self).copy() - for k in vars(OrderedDict()): - inst_dict.pop(k, None) - if inst_dict: - return (self.__class__, (items, ), inst_dict) - return self.__class__, (items, ) - - def copy(self): - 'od.copy() -> a shallow copy of od' - return self.__class__(self) - - @classmethod - def fromkeys(cls, iterable, value=None): - '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S - and values equal to v (which defaults to None). - - ''' - d = cls() - for key in iterable: - d[key] = value - return d - - def __eq__(self, other): - '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive - while comparison to a regular mapping is order-insensitive. - - ''' - if isinstance(other, OrderedDict): - return len(self) == len( - other) and self.items() == other.items() - return dict.__eq__(self, other) - - def __ne__(self, other): - return not self == other - - # -- the following methods are only used in Python 2.7 -- - - def viewkeys(self): - "od.viewkeys() -> a set-like object providing a view on od's keys" - return KeysView(self) - - def viewvalues(self): - "od.viewvalues() -> an object providing a view on od's values" - return ValuesView(self) - - def viewitems(self): - "od.viewitems() -> a set-like object providing a view on od's items" - return ItemsView(self) - - -try: - from logging.config import BaseConfigurator, valid_ident -except ImportError: # pragma: no cover - IDENTIFIER = re.compile('^[a-z_][a-z0-9_]*$', re.I) - - def valid_ident(s): - m = IDENTIFIER.match(s) - if not m: - raise ValueError('Not a valid Python identifier: %r' % s) - return True - - # The ConvertingXXX classes are wrappers around standard Python containers, - # and they serve to convert any suitable values in the container. The - # conversion converts base dicts, lists and tuples to their wrapped - # equivalents, whereas strings which match a conversion format are converted - # appropriately. - # - # Each wrapper should have a configurator attribute holding the actual - # configurator to use for conversion. - - class ConvertingDict(dict): - """A converting dictionary wrapper.""" - - def __getitem__(self, key): - value = dict.__getitem__(self, key) - result = self.configurator.convert(value) - # If the converted value is different, save for next time - if value is not result: - self[key] = result - if type(result) in (ConvertingDict, ConvertingList, - ConvertingTuple): - result.parent = self - result.key = key - return result - - def get(self, key, default=None): - value = dict.get(self, key, default) - result = self.configurator.convert(value) - # If the converted value is different, save for next time - if value is not result: - self[key] = result - if type(result) in (ConvertingDict, ConvertingList, - ConvertingTuple): - result.parent = self - result.key = key - return result - - def pop(self, key, default=None): - value = dict.pop(self, key, default) - result = self.configurator.convert(value) - if value is not result: - if type(result) in (ConvertingDict, ConvertingList, - ConvertingTuple): - result.parent = self - result.key = key - return result - - class ConvertingList(list): - """A converting list wrapper.""" - - def __getitem__(self, key): - value = list.__getitem__(self, key) - result = self.configurator.convert(value) - # If the converted value is different, save for next time - if value is not result: - self[key] = result - if type(result) in (ConvertingDict, ConvertingList, - ConvertingTuple): - result.parent = self - result.key = key - return result - - def pop(self, idx=-1): - value = list.pop(self, idx) - result = self.configurator.convert(value) - if value is not result: - if type(result) in (ConvertingDict, ConvertingList, - ConvertingTuple): - result.parent = self - return result - - class ConvertingTuple(tuple): - """A converting tuple wrapper.""" - - def __getitem__(self, key): - value = tuple.__getitem__(self, key) - result = self.configurator.convert(value) - if value is not result: - if type(result) in (ConvertingDict, ConvertingList, - ConvertingTuple): - result.parent = self - result.key = key - return result - - class BaseConfigurator(object): - """ - The configurator base class which defines some useful defaults. - """ - - CONVERT_PATTERN = re.compile(r'^(?P<prefix>[a-z]+)://(?P<suffix>.*)$') - - WORD_PATTERN = re.compile(r'^\s*(\w+)\s*') - DOT_PATTERN = re.compile(r'^\.\s*(\w+)\s*') - INDEX_PATTERN = re.compile(r'^\[\s*(\w+)\s*\]\s*') - DIGIT_PATTERN = re.compile(r'^\d+$') - - value_converters = { - 'ext': 'ext_convert', - 'cfg': 'cfg_convert', - } - - # We might want to use a different one, e.g. importlib - importer = staticmethod(__import__) - - def __init__(self, config): - self.config = ConvertingDict(config) - self.config.configurator = self - - def resolve(self, s): - """ - Resolve strings to objects using standard import and attribute - syntax. - """ - name = s.split('.') - used = name.pop(0) - try: - found = self.importer(used) - for frag in name: - used += '.' + frag - try: - found = getattr(found, frag) - except AttributeError: - self.importer(used) - found = getattr(found, frag) - return found - except ImportError: - e, tb = sys.exc_info()[1:] - v = ValueError('Cannot resolve %r: %s' % (s, e)) - v.__cause__, v.__traceback__ = e, tb - raise v - - def ext_convert(self, value): - """Default converter for the ext:// protocol.""" - return self.resolve(value) - - def cfg_convert(self, value): - """Default converter for the cfg:// protocol.""" - rest = value - m = self.WORD_PATTERN.match(rest) - if m is None: - raise ValueError("Unable to convert %r" % value) - else: - rest = rest[m.end():] - d = self.config[m.groups()[0]] - while rest: - m = self.DOT_PATTERN.match(rest) - if m: - d = d[m.groups()[0]] - else: - m = self.INDEX_PATTERN.match(rest) - if m: - idx = m.groups()[0] - if not self.DIGIT_PATTERN.match(idx): - d = d[idx] - else: - try: - n = int( - idx - ) # try as number first (most likely) - d = d[n] - except TypeError: - d = d[idx] - if m: - rest = rest[m.end():] - else: - raise ValueError('Unable to convert ' - '%r at %r' % (value, rest)) - # rest should be empty - return d - - def convert(self, value): - """ - Convert values to an appropriate type. dicts, lists and tuples are - replaced by their converting alternatives. Strings are checked to - see if they have a conversion format and are converted if they do. - """ - if not isinstance(value, ConvertingDict) and isinstance( - value, dict): - value = ConvertingDict(value) - value.configurator = self - elif not isinstance(value, ConvertingList) and isinstance( - value, list): - value = ConvertingList(value) - value.configurator = self - elif not isinstance(value, ConvertingTuple) and isinstance(value, tuple): - value = ConvertingTuple(value) - value.configurator = self - elif isinstance(value, string_types): - m = self.CONVERT_PATTERN.match(value) - if m: - d = m.groupdict() - prefix = d['prefix'] - converter = self.value_converters.get(prefix, None) - if converter: - suffix = d['suffix'] - converter = getattr(self, converter) - value = converter(suffix) - return value - - def configure_custom(self, config): - """Configure an object with a user-supplied factory.""" - c = config.pop('()') - if not callable(c): - c = self.resolve(c) - props = config.pop('.', None) - # Check for valid identifiers - kwargs = dict([(k, config[k]) for k in config if valid_ident(k)]) - result = c(**kwargs) - if props: - for name, value in props.items(): - setattr(result, name, value) - return result - - def as_tuple(self, value): - """Utility function which converts lists to tuples.""" - if isinstance(value, list): - value = tuple(value) - return value diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/database.py b/venv/lib/python3.12/site-packages/pip/_vendor/distlib/database.py deleted file mode 100644 index eb3765f..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/database.py +++ /dev/null @@ -1,1359 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012-2023 The Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -"""PEP 376 implementation.""" - -from __future__ import unicode_literals - -import base64 -import codecs -import contextlib -import hashlib -import logging -import os -import posixpath -import sys -import zipimport - -from . import DistlibException, resources -from .compat import StringIO -from .version import get_scheme, UnsupportedVersionError -from .metadata import (Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME, - LEGACY_METADATA_FILENAME) -from .util import (parse_requirement, cached_property, parse_name_and_version, - read_exports, write_exports, CSVReader, CSVWriter) - -__all__ = [ - 'Distribution', 'BaseInstalledDistribution', 'InstalledDistribution', - 'EggInfoDistribution', 'DistributionPath' -] - -logger = logging.getLogger(__name__) - -EXPORTS_FILENAME = 'pydist-exports.json' -COMMANDS_FILENAME = 'pydist-commands.json' - -DIST_FILES = ('INSTALLER', METADATA_FILENAME, 'RECORD', 'REQUESTED', - 'RESOURCES', EXPORTS_FILENAME, 'SHARED') - -DISTINFO_EXT = '.dist-info' - - -class _Cache(object): - """ - A simple cache mapping names and .dist-info paths to distributions - """ - - def __init__(self): - """ - Initialise an instance. There is normally one for each DistributionPath. - """ - self.name = {} - self.path = {} - self.generated = False - - def clear(self): - """ - Clear the cache, setting it to its initial state. - """ - self.name.clear() - self.path.clear() - self.generated = False - - def add(self, dist): - """ - Add a distribution to the cache. - :param dist: The distribution to add. - """ - if dist.path not in self.path: - self.path[dist.path] = dist - self.name.setdefault(dist.key, []).append(dist) - - -class DistributionPath(object): - """ - Represents a set of distributions installed on a path (typically sys.path). - """ - - def __init__(self, path=None, include_egg=False): - """ - Create an instance from a path, optionally including legacy (distutils/ - setuptools/distribute) distributions. - :param path: The path to use, as a list of directories. If not specified, - sys.path is used. - :param include_egg: If True, this instance will look for and return legacy - distributions as well as those based on PEP 376. - """ - if path is None: - path = sys.path - self.path = path - self._include_dist = True - self._include_egg = include_egg - - self._cache = _Cache() - self._cache_egg = _Cache() - self._cache_enabled = True - self._scheme = get_scheme('default') - - def _get_cache_enabled(self): - return self._cache_enabled - - def _set_cache_enabled(self, value): - self._cache_enabled = value - - cache_enabled = property(_get_cache_enabled, _set_cache_enabled) - - def clear_cache(self): - """ - Clears the internal cache. - """ - self._cache.clear() - self._cache_egg.clear() - - def _yield_distributions(self): - """ - Yield .dist-info and/or .egg(-info) distributions. - """ - # We need to check if we've seen some resources already, because on - # some Linux systems (e.g. some Debian/Ubuntu variants) there are - # symlinks which alias other files in the environment. - seen = set() - for path in self.path: - finder = resources.finder_for_path(path) - if finder is None: - continue - r = finder.find('') - if not r or not r.is_container: - continue - rset = sorted(r.resources) - for entry in rset: - r = finder.find(entry) - if not r or r.path in seen: - continue - try: - if self._include_dist and entry.endswith(DISTINFO_EXT): - possible_filenames = [ - METADATA_FILENAME, WHEEL_METADATA_FILENAME, - LEGACY_METADATA_FILENAME - ] - for metadata_filename in possible_filenames: - metadata_path = posixpath.join( - entry, metadata_filename) - pydist = finder.find(metadata_path) - if pydist: - break - else: - continue - - with contextlib.closing(pydist.as_stream()) as stream: - metadata = Metadata(fileobj=stream, - scheme='legacy') - logger.debug('Found %s', r.path) - seen.add(r.path) - yield new_dist_class(r.path, - metadata=metadata, - env=self) - elif self._include_egg and entry.endswith( - ('.egg-info', '.egg')): - logger.debug('Found %s', r.path) - seen.add(r.path) - yield old_dist_class(r.path, self) - except Exception as e: - msg = 'Unable to read distribution at %s, perhaps due to bad metadata: %s' - logger.warning(msg, r.path, e) - import warnings - warnings.warn(msg % (r.path, e), stacklevel=2) - - def _generate_cache(self): - """ - Scan the path for distributions and populate the cache with - those that are found. - """ - gen_dist = not self._cache.generated - gen_egg = self._include_egg and not self._cache_egg.generated - if gen_dist or gen_egg: - for dist in self._yield_distributions(): - if isinstance(dist, InstalledDistribution): - self._cache.add(dist) - else: - self._cache_egg.add(dist) - - if gen_dist: - self._cache.generated = True - if gen_egg: - self._cache_egg.generated = True - - @classmethod - def distinfo_dirname(cls, name, version): - """ - The *name* and *version* parameters are converted into their - filename-escaped form, i.e. any ``'-'`` characters are replaced - with ``'_'`` other than the one in ``'dist-info'`` and the one - separating the name from the version number. - - :parameter name: is converted to a standard distribution name by replacing - any runs of non- alphanumeric characters with a single - ``'-'``. - :type name: string - :parameter version: is converted to a standard version string. Spaces - become dots, and all other non-alphanumeric characters - (except dots) become dashes, with runs of multiple - dashes condensed to a single dash. - :type version: string - :returns: directory name - :rtype: string""" - name = name.replace('-', '_') - return '-'.join([name, version]) + DISTINFO_EXT - - def get_distributions(self): - """ - Provides an iterator that looks for distributions and returns - :class:`InstalledDistribution` or - :class:`EggInfoDistribution` instances for each one of them. - - :rtype: iterator of :class:`InstalledDistribution` and - :class:`EggInfoDistribution` instances - """ - if not self._cache_enabled: - for dist in self._yield_distributions(): - yield dist - else: - self._generate_cache() - - for dist in self._cache.path.values(): - yield dist - - if self._include_egg: - for dist in self._cache_egg.path.values(): - yield dist - - def get_distribution(self, name): - """ - Looks for a named distribution on the path. - - This function only returns the first result found, as no more than one - value is expected. If nothing is found, ``None`` is returned. - - :rtype: :class:`InstalledDistribution`, :class:`EggInfoDistribution` - or ``None`` - """ - result = None - name = name.lower() - if not self._cache_enabled: - for dist in self._yield_distributions(): - if dist.key == name: - result = dist - break - else: - self._generate_cache() - - if name in self._cache.name: - result = self._cache.name[name][0] - elif self._include_egg and name in self._cache_egg.name: - result = self._cache_egg.name[name][0] - return result - - def provides_distribution(self, name, version=None): - """ - Iterates over all distributions to find which distributions provide *name*. - If a *version* is provided, it will be used to filter the results. - - This function only returns the first result found, since no more than - one values are expected. If the directory is not found, returns ``None``. - - :parameter version: a version specifier that indicates the version - required, conforming to the format in ``PEP-345`` - - :type name: string - :type version: string - """ - matcher = None - if version is not None: - try: - matcher = self._scheme.matcher('%s (%s)' % (name, version)) - except ValueError: - raise DistlibException('invalid name or version: %r, %r' % - (name, version)) - - for dist in self.get_distributions(): - # We hit a problem on Travis where enum34 was installed and doesn't - # have a provides attribute ... - if not hasattr(dist, 'provides'): - logger.debug('No "provides": %s', dist) - else: - provided = dist.provides - - for p in provided: - p_name, p_ver = parse_name_and_version(p) - if matcher is None: - if p_name == name: - yield dist - break - else: - if p_name == name and matcher.match(p_ver): - yield dist - break - - def get_file_path(self, name, relative_path): - """ - Return the path to a resource file. - """ - dist = self.get_distribution(name) - if dist is None: - raise LookupError('no distribution named %r found' % name) - return dist.get_resource_path(relative_path) - - def get_exported_entries(self, category, name=None): - """ - Return all of the exported entries in a particular category. - - :param category: The category to search for entries. - :param name: If specified, only entries with that name are returned. - """ - for dist in self.get_distributions(): - r = dist.exports - if category in r: - d = r[category] - if name is not None: - if name in d: - yield d[name] - else: - for v in d.values(): - yield v - - -class Distribution(object): - """ - A base class for distributions, whether installed or from indexes. - Either way, it must have some metadata, so that's all that's needed - for construction. - """ - - build_time_dependency = False - """ - Set to True if it's known to be only a build-time dependency (i.e. - not needed after installation). - """ - - requested = False - """A boolean that indicates whether the ``REQUESTED`` metadata file is - present (in other words, whether the package was installed by user - request or it was installed as a dependency).""" - - def __init__(self, metadata): - """ - Initialise an instance. - :param metadata: The instance of :class:`Metadata` describing this - distribution. - """ - self.metadata = metadata - self.name = metadata.name - self.key = self.name.lower() # for case-insensitive comparisons - self.version = metadata.version - self.locator = None - self.digest = None - self.extras = None # additional features requested - self.context = None # environment marker overrides - self.download_urls = set() - self.digests = {} - - @property - def source_url(self): - """ - The source archive download URL for this distribution. - """ - return self.metadata.source_url - - download_url = source_url # Backward compatibility - - @property - def name_and_version(self): - """ - A utility property which displays the name and version in parentheses. - """ - return '%s (%s)' % (self.name, self.version) - - @property - def provides(self): - """ - A set of distribution names and versions provided by this distribution. - :return: A set of "name (version)" strings. - """ - plist = self.metadata.provides - s = '%s (%s)' % (self.name, self.version) - if s not in plist: - plist.append(s) - return plist - - def _get_requirements(self, req_attr): - md = self.metadata - reqts = getattr(md, req_attr) - logger.debug('%s: got requirements %r from metadata: %r', self.name, - req_attr, reqts) - return set( - md.get_requirements(reqts, extras=self.extras, env=self.context)) - - @property - def run_requires(self): - return self._get_requirements('run_requires') - - @property - def meta_requires(self): - return self._get_requirements('meta_requires') - - @property - def build_requires(self): - return self._get_requirements('build_requires') - - @property - def test_requires(self): - return self._get_requirements('test_requires') - - @property - def dev_requires(self): - return self._get_requirements('dev_requires') - - def matches_requirement(self, req): - """ - Say if this instance matches (fulfills) a requirement. - :param req: The requirement to match. - :rtype req: str - :return: True if it matches, else False. - """ - # Requirement may contain extras - parse to lose those - # from what's passed to the matcher - r = parse_requirement(req) - scheme = get_scheme(self.metadata.scheme) - try: - matcher = scheme.matcher(r.requirement) - except UnsupportedVersionError: - # XXX compat-mode if cannot read the version - logger.warning('could not read version %r - using name only', req) - name = req.split()[0] - matcher = scheme.matcher(name) - - name = matcher.key # case-insensitive - - result = False - for p in self.provides: - p_name, p_ver = parse_name_and_version(p) - if p_name != name: - continue - try: - result = matcher.match(p_ver) - break - except UnsupportedVersionError: - pass - return result - - def __repr__(self): - """ - Return a textual representation of this instance, - """ - if self.source_url: - suffix = ' [%s]' % self.source_url - else: - suffix = '' - return '<Distribution %s (%s)%s>' % (self.name, self.version, suffix) - - def __eq__(self, other): - """ - See if this distribution is the same as another. - :param other: The distribution to compare with. To be equal to one - another. distributions must have the same type, name, - version and source_url. - :return: True if it is the same, else False. - """ - if type(other) is not type(self): - result = False - else: - result = (self.name == other.name and self.version == other.version - and self.source_url == other.source_url) - return result - - def __hash__(self): - """ - Compute hash in a way which matches the equality test. - """ - return hash(self.name) + hash(self.version) + hash(self.source_url) - - -class BaseInstalledDistribution(Distribution): - """ - This is the base class for installed distributions (whether PEP 376 or - legacy). - """ - - hasher = None - - def __init__(self, metadata, path, env=None): - """ - Initialise an instance. - :param metadata: An instance of :class:`Metadata` which describes the - distribution. This will normally have been initialised - from a metadata file in the ``path``. - :param path: The path of the ``.dist-info`` or ``.egg-info`` - directory for the distribution. - :param env: This is normally the :class:`DistributionPath` - instance where this distribution was found. - """ - super(BaseInstalledDistribution, self).__init__(metadata) - self.path = path - self.dist_path = env - - def get_hash(self, data, hasher=None): - """ - Get the hash of some data, using a particular hash algorithm, if - specified. - - :param data: The data to be hashed. - :type data: bytes - :param hasher: The name of a hash implementation, supported by hashlib, - or ``None``. Examples of valid values are ``'sha1'``, - ``'sha224'``, ``'sha384'``, '``sha256'``, ``'md5'`` and - ``'sha512'``. If no hasher is specified, the ``hasher`` - attribute of the :class:`InstalledDistribution` instance - is used. If the hasher is determined to be ``None``, MD5 - is used as the hashing algorithm. - :returns: The hash of the data. If a hasher was explicitly specified, - the returned hash will be prefixed with the specified hasher - followed by '='. - :rtype: str - """ - if hasher is None: - hasher = self.hasher - if hasher is None: - hasher = hashlib.md5 - prefix = '' - else: - hasher = getattr(hashlib, hasher) - prefix = '%s=' % self.hasher - digest = hasher(data).digest() - digest = base64.urlsafe_b64encode(digest).rstrip(b'=').decode('ascii') - return '%s%s' % (prefix, digest) - - -class InstalledDistribution(BaseInstalledDistribution): - """ - Created with the *path* of the ``.dist-info`` directory provided to the - constructor. It reads the metadata contained in ``pydist.json`` when it is - instantiated., or uses a passed in Metadata instance (useful for when - dry-run mode is being used). - """ - - hasher = 'sha256' - - def __init__(self, path, metadata=None, env=None): - self.modules = [] - self.finder = finder = resources.finder_for_path(path) - if finder is None: - raise ValueError('finder unavailable for %s' % path) - if env and env._cache_enabled and path in env._cache.path: - metadata = env._cache.path[path].metadata - elif metadata is None: - r = finder.find(METADATA_FILENAME) - # Temporary - for Wheel 0.23 support - if r is None: - r = finder.find(WHEEL_METADATA_FILENAME) - # Temporary - for legacy support - if r is None: - r = finder.find(LEGACY_METADATA_FILENAME) - if r is None: - raise ValueError('no %s found in %s' % - (METADATA_FILENAME, path)) - with contextlib.closing(r.as_stream()) as stream: - metadata = Metadata(fileobj=stream, scheme='legacy') - - super(InstalledDistribution, self).__init__(metadata, path, env) - - if env and env._cache_enabled: - env._cache.add(self) - - r = finder.find('REQUESTED') - self.requested = r is not None - p = os.path.join(path, 'top_level.txt') - if os.path.exists(p): - with open(p, 'rb') as f: - data = f.read().decode('utf-8') - self.modules = data.splitlines() - - def __repr__(self): - return '<InstalledDistribution %r %s at %r>' % ( - self.name, self.version, self.path) - - def __str__(self): - return "%s %s" % (self.name, self.version) - - def _get_records(self): - """ - Get the list of installed files for the distribution - :return: A list of tuples of path, hash and size. Note that hash and - size might be ``None`` for some entries. The path is exactly - as stored in the file (which is as in PEP 376). - """ - results = [] - r = self.get_distinfo_resource('RECORD') - with contextlib.closing(r.as_stream()) as stream: - with CSVReader(stream=stream) as record_reader: - # Base location is parent dir of .dist-info dir - # base_location = os.path.dirname(self.path) - # base_location = os.path.abspath(base_location) - for row in record_reader: - missing = [None for i in range(len(row), 3)] - path, checksum, size = row + missing - # if not os.path.isabs(path): - # path = path.replace('/', os.sep) - # path = os.path.join(base_location, path) - results.append((path, checksum, size)) - return results - - @cached_property - def exports(self): - """ - Return the information exported by this distribution. - :return: A dictionary of exports, mapping an export category to a dict - of :class:`ExportEntry` instances describing the individual - export entries, and keyed by name. - """ - result = {} - r = self.get_distinfo_resource(EXPORTS_FILENAME) - if r: - result = self.read_exports() - return result - - def read_exports(self): - """ - Read exports data from a file in .ini format. - - :return: A dictionary of exports, mapping an export category to a list - of :class:`ExportEntry` instances describing the individual - export entries. - """ - result = {} - r = self.get_distinfo_resource(EXPORTS_FILENAME) - if r: - with contextlib.closing(r.as_stream()) as stream: - result = read_exports(stream) - return result - - def write_exports(self, exports): - """ - Write a dictionary of exports to a file in .ini format. - :param exports: A dictionary of exports, mapping an export category to - a list of :class:`ExportEntry` instances describing the - individual export entries. - """ - rf = self.get_distinfo_file(EXPORTS_FILENAME) - with open(rf, 'w') as f: - write_exports(exports, f) - - def get_resource_path(self, relative_path): - """ - NOTE: This API may change in the future. - - Return the absolute path to a resource file with the given relative - path. - - :param relative_path: The path, relative to .dist-info, of the resource - of interest. - :return: The absolute path where the resource is to be found. - """ - r = self.get_distinfo_resource('RESOURCES') - with contextlib.closing(r.as_stream()) as stream: - with CSVReader(stream=stream) as resources_reader: - for relative, destination in resources_reader: - if relative == relative_path: - return destination - raise KeyError('no resource file with relative path %r ' - 'is installed' % relative_path) - - def list_installed_files(self): - """ - Iterates over the ``RECORD`` entries and returns a tuple - ``(path, hash, size)`` for each line. - - :returns: iterator of (path, hash, size) - """ - for result in self._get_records(): - yield result - - def write_installed_files(self, paths, prefix, dry_run=False): - """ - Writes the ``RECORD`` file, using the ``paths`` iterable passed in. Any - existing ``RECORD`` file is silently overwritten. - - prefix is used to determine when to write absolute paths. - """ - prefix = os.path.join(prefix, '') - base = os.path.dirname(self.path) - base_under_prefix = base.startswith(prefix) - base = os.path.join(base, '') - record_path = self.get_distinfo_file('RECORD') - logger.info('creating %s', record_path) - if dry_run: - return None - with CSVWriter(record_path) as writer: - for path in paths: - if os.path.isdir(path) or path.endswith(('.pyc', '.pyo')): - # do not put size and hash, as in PEP-376 - hash_value = size = '' - else: - size = '%d' % os.path.getsize(path) - with open(path, 'rb') as fp: - hash_value = self.get_hash(fp.read()) - if path.startswith(base) or (base_under_prefix - and path.startswith(prefix)): - path = os.path.relpath(path, base) - writer.writerow((path, hash_value, size)) - - # add the RECORD file itself - if record_path.startswith(base): - record_path = os.path.relpath(record_path, base) - writer.writerow((record_path, '', '')) - return record_path - - def check_installed_files(self): - """ - Checks that the hashes and sizes of the files in ``RECORD`` are - matched by the files themselves. Returns a (possibly empty) list of - mismatches. Each entry in the mismatch list will be a tuple consisting - of the path, 'exists', 'size' or 'hash' according to what didn't match - (existence is checked first, then size, then hash), the expected - value and the actual value. - """ - mismatches = [] - base = os.path.dirname(self.path) - record_path = self.get_distinfo_file('RECORD') - for path, hash_value, size in self.list_installed_files(): - if not os.path.isabs(path): - path = os.path.join(base, path) - if path == record_path: - continue - if not os.path.exists(path): - mismatches.append((path, 'exists', True, False)) - elif os.path.isfile(path): - actual_size = str(os.path.getsize(path)) - if size and actual_size != size: - mismatches.append((path, 'size', size, actual_size)) - elif hash_value: - if '=' in hash_value: - hasher = hash_value.split('=', 1)[0] - else: - hasher = None - - with open(path, 'rb') as f: - actual_hash = self.get_hash(f.read(), hasher) - if actual_hash != hash_value: - mismatches.append( - (path, 'hash', hash_value, actual_hash)) - return mismatches - - @cached_property - def shared_locations(self): - """ - A dictionary of shared locations whose keys are in the set 'prefix', - 'purelib', 'platlib', 'scripts', 'headers', 'data' and 'namespace'. - The corresponding value is the absolute path of that category for - this distribution, and takes into account any paths selected by the - user at installation time (e.g. via command-line arguments). In the - case of the 'namespace' key, this would be a list of absolute paths - for the roots of namespace packages in this distribution. - - The first time this property is accessed, the relevant information is - read from the SHARED file in the .dist-info directory. - """ - result = {} - shared_path = os.path.join(self.path, 'SHARED') - if os.path.isfile(shared_path): - with codecs.open(shared_path, 'r', encoding='utf-8') as f: - lines = f.read().splitlines() - for line in lines: - key, value = line.split('=', 1) - if key == 'namespace': - result.setdefault(key, []).append(value) - else: - result[key] = value - return result - - def write_shared_locations(self, paths, dry_run=False): - """ - Write shared location information to the SHARED file in .dist-info. - :param paths: A dictionary as described in the documentation for - :meth:`shared_locations`. - :param dry_run: If True, the action is logged but no file is actually - written. - :return: The path of the file written to. - """ - shared_path = os.path.join(self.path, 'SHARED') - logger.info('creating %s', shared_path) - if dry_run: - return None - lines = [] - for key in ('prefix', 'lib', 'headers', 'scripts', 'data'): - path = paths[key] - if os.path.isdir(paths[key]): - lines.append('%s=%s' % (key, path)) - for ns in paths.get('namespace', ()): - lines.append('namespace=%s' % ns) - - with codecs.open(shared_path, 'w', encoding='utf-8') as f: - f.write('\n'.join(lines)) - return shared_path - - def get_distinfo_resource(self, path): - if path not in DIST_FILES: - raise DistlibException('invalid path for a dist-info file: ' - '%r at %r' % (path, self.path)) - finder = resources.finder_for_path(self.path) - if finder is None: - raise DistlibException('Unable to get a finder for %s' % self.path) - return finder.find(path) - - def get_distinfo_file(self, path): - """ - Returns a path located under the ``.dist-info`` directory. Returns a - string representing the path. - - :parameter path: a ``'/'``-separated path relative to the - ``.dist-info`` directory or an absolute path; - If *path* is an absolute path and doesn't start - with the ``.dist-info`` directory path, - a :class:`DistlibException` is raised - :type path: str - :rtype: str - """ - # Check if it is an absolute path # XXX use relpath, add tests - if path.find(os.sep) >= 0: - # it's an absolute path? - distinfo_dirname, path = path.split(os.sep)[-2:] - if distinfo_dirname != self.path.split(os.sep)[-1]: - raise DistlibException( - 'dist-info file %r does not belong to the %r %s ' - 'distribution' % (path, self.name, self.version)) - - # The file must be relative - if path not in DIST_FILES: - raise DistlibException('invalid path for a dist-info file: ' - '%r at %r' % (path, self.path)) - - return os.path.join(self.path, path) - - def list_distinfo_files(self): - """ - Iterates over the ``RECORD`` entries and returns paths for each line if - the path is pointing to a file located in the ``.dist-info`` directory - or one of its subdirectories. - - :returns: iterator of paths - """ - base = os.path.dirname(self.path) - for path, checksum, size in self._get_records(): - # XXX add separator or use real relpath algo - if not os.path.isabs(path): - path = os.path.join(base, path) - if path.startswith(self.path): - yield path - - def __eq__(self, other): - return (isinstance(other, InstalledDistribution) - and self.path == other.path) - - # See http://docs.python.org/reference/datamodel#object.__hash__ - __hash__ = object.__hash__ - - -class EggInfoDistribution(BaseInstalledDistribution): - """Created with the *path* of the ``.egg-info`` directory or file provided - to the constructor. It reads the metadata contained in the file itself, or - if the given path happens to be a directory, the metadata is read from the - file ``PKG-INFO`` under that directory.""" - - requested = True # as we have no way of knowing, assume it was - shared_locations = {} - - def __init__(self, path, env=None): - - def set_name_and_version(s, n, v): - s.name = n - s.key = n.lower() # for case-insensitive comparisons - s.version = v - - self.path = path - self.dist_path = env - if env and env._cache_enabled and path in env._cache_egg.path: - metadata = env._cache_egg.path[path].metadata - set_name_and_version(self, metadata.name, metadata.version) - else: - metadata = self._get_metadata(path) - - # Need to be set before caching - set_name_and_version(self, metadata.name, metadata.version) - - if env and env._cache_enabled: - env._cache_egg.add(self) - super(EggInfoDistribution, self).__init__(metadata, path, env) - - def _get_metadata(self, path): - requires = None - - def parse_requires_data(data): - """Create a list of dependencies from a requires.txt file. - - *data*: the contents of a setuptools-produced requires.txt file. - """ - reqs = [] - lines = data.splitlines() - for line in lines: - line = line.strip() - # sectioned files have bare newlines (separating sections) - if not line: # pragma: no cover - continue - if line.startswith('['): # pragma: no cover - logger.warning( - 'Unexpected line: quitting requirement scan: %r', line) - break - r = parse_requirement(line) - if not r: # pragma: no cover - logger.warning('Not recognised as a requirement: %r', line) - continue - if r.extras: # pragma: no cover - logger.warning('extra requirements in requires.txt are ' - 'not supported') - if not r.constraints: - reqs.append(r.name) - else: - cons = ', '.join('%s%s' % c for c in r.constraints) - reqs.append('%s (%s)' % (r.name, cons)) - return reqs - - def parse_requires_path(req_path): - """Create a list of dependencies from a requires.txt file. - - *req_path*: the path to a setuptools-produced requires.txt file. - """ - - reqs = [] - try: - with codecs.open(req_path, 'r', 'utf-8') as fp: - reqs = parse_requires_data(fp.read()) - except IOError: - pass - return reqs - - tl_path = tl_data = None - if path.endswith('.egg'): - if os.path.isdir(path): - p = os.path.join(path, 'EGG-INFO') - meta_path = os.path.join(p, 'PKG-INFO') - metadata = Metadata(path=meta_path, scheme='legacy') - req_path = os.path.join(p, 'requires.txt') - tl_path = os.path.join(p, 'top_level.txt') - requires = parse_requires_path(req_path) - else: - # FIXME handle the case where zipfile is not available - zipf = zipimport.zipimporter(path) - fileobj = StringIO( - zipf.get_data('EGG-INFO/PKG-INFO').decode('utf8')) - metadata = Metadata(fileobj=fileobj, scheme='legacy') - try: - data = zipf.get_data('EGG-INFO/requires.txt') - tl_data = zipf.get_data('EGG-INFO/top_level.txt').decode( - 'utf-8') - requires = parse_requires_data(data.decode('utf-8')) - except IOError: - requires = None - elif path.endswith('.egg-info'): - if os.path.isdir(path): - req_path = os.path.join(path, 'requires.txt') - requires = parse_requires_path(req_path) - path = os.path.join(path, 'PKG-INFO') - tl_path = os.path.join(path, 'top_level.txt') - metadata = Metadata(path=path, scheme='legacy') - else: - raise DistlibException('path must end with .egg-info or .egg, ' - 'got %r' % path) - - if requires: - metadata.add_requirements(requires) - # look for top-level modules in top_level.txt, if present - if tl_data is None: - if tl_path is not None and os.path.exists(tl_path): - with open(tl_path, 'rb') as f: - tl_data = f.read().decode('utf-8') - if not tl_data: - tl_data = [] - else: - tl_data = tl_data.splitlines() - self.modules = tl_data - return metadata - - def __repr__(self): - return '<EggInfoDistribution %r %s at %r>' % (self.name, self.version, - self.path) - - def __str__(self): - return "%s %s" % (self.name, self.version) - - def check_installed_files(self): - """ - Checks that the hashes and sizes of the files in ``RECORD`` are - matched by the files themselves. Returns a (possibly empty) list of - mismatches. Each entry in the mismatch list will be a tuple consisting - of the path, 'exists', 'size' or 'hash' according to what didn't match - (existence is checked first, then size, then hash), the expected - value and the actual value. - """ - mismatches = [] - record_path = os.path.join(self.path, 'installed-files.txt') - if os.path.exists(record_path): - for path, _, _ in self.list_installed_files(): - if path == record_path: - continue - if not os.path.exists(path): - mismatches.append((path, 'exists', True, False)) - return mismatches - - def list_installed_files(self): - """ - Iterates over the ``installed-files.txt`` entries and returns a tuple - ``(path, hash, size)`` for each line. - - :returns: a list of (path, hash, size) - """ - - def _md5(path): - f = open(path, 'rb') - try: - content = f.read() - finally: - f.close() - return hashlib.md5(content).hexdigest() - - def _size(path): - return os.stat(path).st_size - - record_path = os.path.join(self.path, 'installed-files.txt') - result = [] - if os.path.exists(record_path): - with codecs.open(record_path, 'r', encoding='utf-8') as f: - for line in f: - line = line.strip() - p = os.path.normpath(os.path.join(self.path, line)) - # "./" is present as a marker between installed files - # and installation metadata files - if not os.path.exists(p): - logger.warning('Non-existent file: %s', p) - if p.endswith(('.pyc', '.pyo')): - continue - # otherwise fall through and fail - if not os.path.isdir(p): - result.append((p, _md5(p), _size(p))) - result.append((record_path, None, None)) - return result - - def list_distinfo_files(self, absolute=False): - """ - Iterates over the ``installed-files.txt`` entries and returns paths for - each line if the path is pointing to a file located in the - ``.egg-info`` directory or one of its subdirectories. - - :parameter absolute: If *absolute* is ``True``, each returned path is - transformed into a local absolute path. Otherwise the - raw value from ``installed-files.txt`` is returned. - :type absolute: boolean - :returns: iterator of paths - """ - record_path = os.path.join(self.path, 'installed-files.txt') - if os.path.exists(record_path): - skip = True - with codecs.open(record_path, 'r', encoding='utf-8') as f: - for line in f: - line = line.strip() - if line == './': - skip = False - continue - if not skip: - p = os.path.normpath(os.path.join(self.path, line)) - if p.startswith(self.path): - if absolute: - yield p - else: - yield line - - def __eq__(self, other): - return (isinstance(other, EggInfoDistribution) - and self.path == other.path) - - # See http://docs.python.org/reference/datamodel#object.__hash__ - __hash__ = object.__hash__ - - -new_dist_class = InstalledDistribution -old_dist_class = EggInfoDistribution - - -class DependencyGraph(object): - """ - Represents a dependency graph between distributions. - - The dependency relationships are stored in an ``adjacency_list`` that maps - distributions to a list of ``(other, label)`` tuples where ``other`` - is a distribution and the edge is labeled with ``label`` (i.e. the version - specifier, if such was provided). Also, for more efficient traversal, for - every distribution ``x``, a list of predecessors is kept in - ``reverse_list[x]``. An edge from distribution ``a`` to - distribution ``b`` means that ``a`` depends on ``b``. If any missing - dependencies are found, they are stored in ``missing``, which is a - dictionary that maps distributions to a list of requirements that were not - provided by any other distributions. - """ - - def __init__(self): - self.adjacency_list = {} - self.reverse_list = {} - self.missing = {} - - def add_distribution(self, distribution): - """Add the *distribution* to the graph. - - :type distribution: :class:`distutils2.database.InstalledDistribution` - or :class:`distutils2.database.EggInfoDistribution` - """ - self.adjacency_list[distribution] = [] - self.reverse_list[distribution] = [] - # self.missing[distribution] = [] - - def add_edge(self, x, y, label=None): - """Add an edge from distribution *x* to distribution *y* with the given - *label*. - - :type x: :class:`distutils2.database.InstalledDistribution` or - :class:`distutils2.database.EggInfoDistribution` - :type y: :class:`distutils2.database.InstalledDistribution` or - :class:`distutils2.database.EggInfoDistribution` - :type label: ``str`` or ``None`` - """ - self.adjacency_list[x].append((y, label)) - # multiple edges are allowed, so be careful - if x not in self.reverse_list[y]: - self.reverse_list[y].append(x) - - def add_missing(self, distribution, requirement): - """ - Add a missing *requirement* for the given *distribution*. - - :type distribution: :class:`distutils2.database.InstalledDistribution` - or :class:`distutils2.database.EggInfoDistribution` - :type requirement: ``str`` - """ - logger.debug('%s missing %r', distribution, requirement) - self.missing.setdefault(distribution, []).append(requirement) - - def _repr_dist(self, dist): - return '%s %s' % (dist.name, dist.version) - - def repr_node(self, dist, level=1): - """Prints only a subgraph""" - output = [self._repr_dist(dist)] - for other, label in self.adjacency_list[dist]: - dist = self._repr_dist(other) - if label is not None: - dist = '%s [%s]' % (dist, label) - output.append(' ' * level + str(dist)) - suboutput = self.repr_node(other, level + 1) - subs = suboutput.split('\n') - output.extend(subs[1:]) - return '\n'.join(output) - - def to_dot(self, f, skip_disconnected=True): - """Writes a DOT output for the graph to the provided file *f*. - - If *skip_disconnected* is set to ``True``, then all distributions - that are not dependent on any other distribution are skipped. - - :type f: has to support ``file``-like operations - :type skip_disconnected: ``bool`` - """ - disconnected = [] - - f.write("digraph dependencies {\n") - for dist, adjs in self.adjacency_list.items(): - if len(adjs) == 0 and not skip_disconnected: - disconnected.append(dist) - for other, label in adjs: - if label is not None: - f.write('"%s" -> "%s" [label="%s"]\n' % - (dist.name, other.name, label)) - else: - f.write('"%s" -> "%s"\n' % (dist.name, other.name)) - if not skip_disconnected and len(disconnected) > 0: - f.write('subgraph disconnected {\n') - f.write('label = "Disconnected"\n') - f.write('bgcolor = red\n') - - for dist in disconnected: - f.write('"%s"' % dist.name) - f.write('\n') - f.write('}\n') - f.write('}\n') - - def topological_sort(self): - """ - Perform a topological sort of the graph. - :return: A tuple, the first element of which is a topologically sorted - list of distributions, and the second element of which is a - list of distributions that cannot be sorted because they have - circular dependencies and so form a cycle. - """ - result = [] - # Make a shallow copy of the adjacency list - alist = {} - for k, v in self.adjacency_list.items(): - alist[k] = v[:] - while True: - # See what we can remove in this run - to_remove = [] - for k, v in list(alist.items())[:]: - if not v: - to_remove.append(k) - del alist[k] - if not to_remove: - # What's left in alist (if anything) is a cycle. - break - # Remove from the adjacency list of others - for k, v in alist.items(): - alist[k] = [(d, r) for d, r in v if d not in to_remove] - logger.debug('Moving to result: %s', - ['%s (%s)' % (d.name, d.version) for d in to_remove]) - result.extend(to_remove) - return result, list(alist.keys()) - - def __repr__(self): - """Representation of the graph""" - output = [] - for dist, adjs in self.adjacency_list.items(): - output.append(self.repr_node(dist)) - return '\n'.join(output) - - -def make_graph(dists, scheme='default'): - """Makes a dependency graph from the given distributions. - - :parameter dists: a list of distributions - :type dists: list of :class:`distutils2.database.InstalledDistribution` and - :class:`distutils2.database.EggInfoDistribution` instances - :rtype: a :class:`DependencyGraph` instance - """ - scheme = get_scheme(scheme) - graph = DependencyGraph() - provided = {} # maps names to lists of (version, dist) tuples - - # first, build the graph and find out what's provided - for dist in dists: - graph.add_distribution(dist) - - for p in dist.provides: - name, version = parse_name_and_version(p) - logger.debug('Add to provided: %s, %s, %s', name, version, dist) - provided.setdefault(name, []).append((version, dist)) - - # now make the edges - for dist in dists: - requires = (dist.run_requires | dist.meta_requires - | dist.build_requires | dist.dev_requires) - for req in requires: - try: - matcher = scheme.matcher(req) - except UnsupportedVersionError: - # XXX compat-mode if cannot read the version - logger.warning('could not read version %r - using name only', - req) - name = req.split()[0] - matcher = scheme.matcher(name) - - name = matcher.key # case-insensitive - - matched = False - if name in provided: - for version, provider in provided[name]: - try: - match = matcher.match(version) - except UnsupportedVersionError: - match = False - - if match: - graph.add_edge(dist, provider, req) - matched = True - break - if not matched: - graph.add_missing(dist, req) - return graph - - -def get_dependent_dists(dists, dist): - """Recursively generate a list of distributions from *dists* that are - dependent on *dist*. - - :param dists: a list of distributions - :param dist: a distribution, member of *dists* for which we are interested - """ - if dist not in dists: - raise DistlibException('given distribution %r is not a member ' - 'of the list' % dist.name) - graph = make_graph(dists) - - dep = [dist] # dependent distributions - todo = graph.reverse_list[dist] # list of nodes we should inspect - - while todo: - d = todo.pop() - dep.append(d) - for succ in graph.reverse_list[d]: - if succ not in dep: - todo.append(succ) - - dep.pop(0) # remove dist from dep, was there to prevent infinite loops - return dep - - -def get_required_dists(dists, dist): - """Recursively generate a list of distributions from *dists* that are - required by *dist*. - - :param dists: a list of distributions - :param dist: a distribution, member of *dists* for which we are interested - in finding the dependencies. - """ - if dist not in dists: - raise DistlibException('given distribution %r is not a member ' - 'of the list' % dist.name) - graph = make_graph(dists) - - req = set() # required distributions - todo = graph.adjacency_list[dist] # list of nodes we should inspect - seen = set(t[0] for t in todo) # already added to todo - - while todo: - d = todo.pop()[0] - req.add(d) - pred_list = graph.adjacency_list[d] - for pred in pred_list: - d = pred[0] - if d not in req and d not in seen: - seen.add(d) - todo.append(pred) - return req - - -def make_dist(name, version, **kwargs): - """ - A convenience method for making a dist given just a name and version. - """ - summary = kwargs.pop('summary', 'Placeholder for summary') - md = Metadata(**kwargs) - md.name = name - md.version = version - md.summary = summary or 'Placeholder for summary' - return Distribution(md) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/index.py b/venv/lib/python3.12/site-packages/pip/_vendor/distlib/index.py deleted file mode 100644 index 56cd286..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/index.py +++ /dev/null @@ -1,508 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2013-2023 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -import hashlib -import logging -import os -import shutil -import subprocess -import tempfile -try: - from threading import Thread -except ImportError: # pragma: no cover - from dummy_threading import Thread - -from . import DistlibException -from .compat import (HTTPBasicAuthHandler, Request, HTTPPasswordMgr, - urlparse, build_opener, string_types) -from .util import zip_dir, ServerProxy - -logger = logging.getLogger(__name__) - -DEFAULT_INDEX = 'https://pypi.org/pypi' -DEFAULT_REALM = 'pypi' - - -class PackageIndex(object): - """ - This class represents a package index compatible with PyPI, the Python - Package Index. - """ - - boundary = b'----------ThIs_Is_tHe_distlib_index_bouNdaRY_$' - - def __init__(self, url=None): - """ - Initialise an instance. - - :param url: The URL of the index. If not specified, the URL for PyPI is - used. - """ - self.url = url or DEFAULT_INDEX - self.read_configuration() - scheme, netloc, path, params, query, frag = urlparse(self.url) - if params or query or frag or scheme not in ('http', 'https'): - raise DistlibException('invalid repository: %s' % self.url) - self.password_handler = None - self.ssl_verifier = None - self.gpg = None - self.gpg_home = None - with open(os.devnull, 'w') as sink: - # Use gpg by default rather than gpg2, as gpg2 insists on - # prompting for passwords - for s in ('gpg', 'gpg2'): - try: - rc = subprocess.check_call([s, '--version'], stdout=sink, - stderr=sink) - if rc == 0: - self.gpg = s - break - except OSError: - pass - - def _get_pypirc_command(self): - """ - Get the distutils command for interacting with PyPI configurations. - :return: the command. - """ - from .util import _get_pypirc_command as cmd - return cmd() - - def read_configuration(self): - """ - Read the PyPI access configuration as supported by distutils. This populates - ``username``, ``password``, ``realm`` and ``url`` attributes from the - configuration. - """ - from .util import _load_pypirc - cfg = _load_pypirc(self) - self.username = cfg.get('username') - self.password = cfg.get('password') - self.realm = cfg.get('realm', 'pypi') - self.url = cfg.get('repository', self.url) - - def save_configuration(self): - """ - Save the PyPI access configuration. You must have set ``username`` and - ``password`` attributes before calling this method. - """ - self.check_credentials() - from .util import _store_pypirc - _store_pypirc(self) - - def check_credentials(self): - """ - Check that ``username`` and ``password`` have been set, and raise an - exception if not. - """ - if self.username is None or self.password is None: - raise DistlibException('username and password must be set') - pm = HTTPPasswordMgr() - _, netloc, _, _, _, _ = urlparse(self.url) - pm.add_password(self.realm, netloc, self.username, self.password) - self.password_handler = HTTPBasicAuthHandler(pm) - - def register(self, metadata): # pragma: no cover - """ - Register a distribution on PyPI, using the provided metadata. - - :param metadata: A :class:`Metadata` instance defining at least a name - and version number for the distribution to be - registered. - :return: The HTTP response received from PyPI upon submission of the - request. - """ - self.check_credentials() - metadata.validate() - d = metadata.todict() - d[':action'] = 'verify' - request = self.encode_request(d.items(), []) - self.send_request(request) - d[':action'] = 'submit' - request = self.encode_request(d.items(), []) - return self.send_request(request) - - def _reader(self, name, stream, outbuf): - """ - Thread runner for reading lines of from a subprocess into a buffer. - - :param name: The logical name of the stream (used for logging only). - :param stream: The stream to read from. This will typically a pipe - connected to the output stream of a subprocess. - :param outbuf: The list to append the read lines to. - """ - while True: - s = stream.readline() - if not s: - break - s = s.decode('utf-8').rstrip() - outbuf.append(s) - logger.debug('%s: %s' % (name, s)) - stream.close() - - def get_sign_command(self, filename, signer, sign_password, keystore=None): # pragma: no cover - """ - Return a suitable command for signing a file. - - :param filename: The pathname to the file to be signed. - :param signer: The identifier of the signer of the file. - :param sign_password: The passphrase for the signer's - private key used for signing. - :param keystore: The path to a directory which contains the keys - used in verification. If not specified, the - instance's ``gpg_home`` attribute is used instead. - :return: The signing command as a list suitable to be - passed to :class:`subprocess.Popen`. - """ - cmd = [self.gpg, '--status-fd', '2', '--no-tty'] - if keystore is None: - keystore = self.gpg_home - if keystore: - cmd.extend(['--homedir', keystore]) - if sign_password is not None: - cmd.extend(['--batch', '--passphrase-fd', '0']) - td = tempfile.mkdtemp() - sf = os.path.join(td, os.path.basename(filename) + '.asc') - cmd.extend(['--detach-sign', '--armor', '--local-user', - signer, '--output', sf, filename]) - logger.debug('invoking: %s', ' '.join(cmd)) - return cmd, sf - - def run_command(self, cmd, input_data=None): - """ - Run a command in a child process , passing it any input data specified. - - :param cmd: The command to run. - :param input_data: If specified, this must be a byte string containing - data to be sent to the child process. - :return: A tuple consisting of the subprocess' exit code, a list of - lines read from the subprocess' ``stdout``, and a list of - lines read from the subprocess' ``stderr``. - """ - kwargs = { - 'stdout': subprocess.PIPE, - 'stderr': subprocess.PIPE, - } - if input_data is not None: - kwargs['stdin'] = subprocess.PIPE - stdout = [] - stderr = [] - p = subprocess.Popen(cmd, **kwargs) - # We don't use communicate() here because we may need to - # get clever with interacting with the command - t1 = Thread(target=self._reader, args=('stdout', p.stdout, stdout)) - t1.start() - t2 = Thread(target=self._reader, args=('stderr', p.stderr, stderr)) - t2.start() - if input_data is not None: - p.stdin.write(input_data) - p.stdin.close() - - p.wait() - t1.join() - t2.join() - return p.returncode, stdout, stderr - - def sign_file(self, filename, signer, sign_password, keystore=None): # pragma: no cover - """ - Sign a file. - - :param filename: The pathname to the file to be signed. - :param signer: The identifier of the signer of the file. - :param sign_password: The passphrase for the signer's - private key used for signing. - :param keystore: The path to a directory which contains the keys - used in signing. If not specified, the instance's - ``gpg_home`` attribute is used instead. - :return: The absolute pathname of the file where the signature is - stored. - """ - cmd, sig_file = self.get_sign_command(filename, signer, sign_password, - keystore) - rc, stdout, stderr = self.run_command(cmd, - sign_password.encode('utf-8')) - if rc != 0: - raise DistlibException('sign command failed with error ' - 'code %s' % rc) - return sig_file - - def upload_file(self, metadata, filename, signer=None, sign_password=None, - filetype='sdist', pyversion='source', keystore=None): - """ - Upload a release file to the index. - - :param metadata: A :class:`Metadata` instance defining at least a name - and version number for the file to be uploaded. - :param filename: The pathname of the file to be uploaded. - :param signer: The identifier of the signer of the file. - :param sign_password: The passphrase for the signer's - private key used for signing. - :param filetype: The type of the file being uploaded. This is the - distutils command which produced that file, e.g. - ``sdist`` or ``bdist_wheel``. - :param pyversion: The version of Python which the release relates - to. For code compatible with any Python, this would - be ``source``, otherwise it would be e.g. ``3.2``. - :param keystore: The path to a directory which contains the keys - used in signing. If not specified, the instance's - ``gpg_home`` attribute is used instead. - :return: The HTTP response received from PyPI upon submission of the - request. - """ - self.check_credentials() - if not os.path.exists(filename): - raise DistlibException('not found: %s' % filename) - metadata.validate() - d = metadata.todict() - sig_file = None - if signer: - if not self.gpg: - logger.warning('no signing program available - not signed') - else: - sig_file = self.sign_file(filename, signer, sign_password, - keystore) - with open(filename, 'rb') as f: - file_data = f.read() - md5_digest = hashlib.md5(file_data).hexdigest() - sha256_digest = hashlib.sha256(file_data).hexdigest() - d.update({ - ':action': 'file_upload', - 'protocol_version': '1', - 'filetype': filetype, - 'pyversion': pyversion, - 'md5_digest': md5_digest, - 'sha256_digest': sha256_digest, - }) - files = [('content', os.path.basename(filename), file_data)] - if sig_file: - with open(sig_file, 'rb') as f: - sig_data = f.read() - files.append(('gpg_signature', os.path.basename(sig_file), - sig_data)) - shutil.rmtree(os.path.dirname(sig_file)) - request = self.encode_request(d.items(), files) - return self.send_request(request) - - def upload_documentation(self, metadata, doc_dir): # pragma: no cover - """ - Upload documentation to the index. - - :param metadata: A :class:`Metadata` instance defining at least a name - and version number for the documentation to be - uploaded. - :param doc_dir: The pathname of the directory which contains the - documentation. This should be the directory that - contains the ``index.html`` for the documentation. - :return: The HTTP response received from PyPI upon submission of the - request. - """ - self.check_credentials() - if not os.path.isdir(doc_dir): - raise DistlibException('not a directory: %r' % doc_dir) - fn = os.path.join(doc_dir, 'index.html') - if not os.path.exists(fn): - raise DistlibException('not found: %r' % fn) - metadata.validate() - name, version = metadata.name, metadata.version - zip_data = zip_dir(doc_dir).getvalue() - fields = [(':action', 'doc_upload'), - ('name', name), ('version', version)] - files = [('content', name, zip_data)] - request = self.encode_request(fields, files) - return self.send_request(request) - - def get_verify_command(self, signature_filename, data_filename, - keystore=None): - """ - Return a suitable command for verifying a file. - - :param signature_filename: The pathname to the file containing the - signature. - :param data_filename: The pathname to the file containing the - signed data. - :param keystore: The path to a directory which contains the keys - used in verification. If not specified, the - instance's ``gpg_home`` attribute is used instead. - :return: The verifying command as a list suitable to be - passed to :class:`subprocess.Popen`. - """ - cmd = [self.gpg, '--status-fd', '2', '--no-tty'] - if keystore is None: - keystore = self.gpg_home - if keystore: - cmd.extend(['--homedir', keystore]) - cmd.extend(['--verify', signature_filename, data_filename]) - logger.debug('invoking: %s', ' '.join(cmd)) - return cmd - - def verify_signature(self, signature_filename, data_filename, - keystore=None): - """ - Verify a signature for a file. - - :param signature_filename: The pathname to the file containing the - signature. - :param data_filename: The pathname to the file containing the - signed data. - :param keystore: The path to a directory which contains the keys - used in verification. If not specified, the - instance's ``gpg_home`` attribute is used instead. - :return: True if the signature was verified, else False. - """ - if not self.gpg: - raise DistlibException('verification unavailable because gpg ' - 'unavailable') - cmd = self.get_verify_command(signature_filename, data_filename, - keystore) - rc, stdout, stderr = self.run_command(cmd) - if rc not in (0, 1): - raise DistlibException('verify command failed with error code %s' % rc) - return rc == 0 - - def download_file(self, url, destfile, digest=None, reporthook=None): - """ - This is a convenience method for downloading a file from an URL. - Normally, this will be a file from the index, though currently - no check is made for this (i.e. a file can be downloaded from - anywhere). - - The method is just like the :func:`urlretrieve` function in the - standard library, except that it allows digest computation to be - done during download and checking that the downloaded data - matched any expected value. - - :param url: The URL of the file to be downloaded (assumed to be - available via an HTTP GET request). - :param destfile: The pathname where the downloaded file is to be - saved. - :param digest: If specified, this must be a (hasher, value) - tuple, where hasher is the algorithm used (e.g. - ``'md5'``) and ``value`` is the expected value. - :param reporthook: The same as for :func:`urlretrieve` in the - standard library. - """ - if digest is None: - digester = None - logger.debug('No digest specified') - else: - if isinstance(digest, (list, tuple)): - hasher, digest = digest - else: - hasher = 'md5' - digester = getattr(hashlib, hasher)() - logger.debug('Digest specified: %s' % digest) - # The following code is equivalent to urlretrieve. - # We need to do it this way so that we can compute the - # digest of the file as we go. - with open(destfile, 'wb') as dfp: - # addinfourl is not a context manager on 2.x - # so we have to use try/finally - sfp = self.send_request(Request(url)) - try: - headers = sfp.info() - blocksize = 8192 - size = -1 - read = 0 - blocknum = 0 - if "content-length" in headers: - size = int(headers["Content-Length"]) - if reporthook: - reporthook(blocknum, blocksize, size) - while True: - block = sfp.read(blocksize) - if not block: - break - read += len(block) - dfp.write(block) - if digester: - digester.update(block) - blocknum += 1 - if reporthook: - reporthook(blocknum, blocksize, size) - finally: - sfp.close() - - # check that we got the whole file, if we can - if size >= 0 and read < size: - raise DistlibException( - 'retrieval incomplete: got only %d out of %d bytes' - % (read, size)) - # if we have a digest, it must match. - if digester: - actual = digester.hexdigest() - if digest != actual: - raise DistlibException('%s digest mismatch for %s: expected ' - '%s, got %s' % (hasher, destfile, - digest, actual)) - logger.debug('Digest verified: %s', digest) - - def send_request(self, req): - """ - Send a standard library :class:`Request` to PyPI and return its - response. - - :param req: The request to send. - :return: The HTTP response from PyPI (a standard library HTTPResponse). - """ - handlers = [] - if self.password_handler: - handlers.append(self.password_handler) - if self.ssl_verifier: - handlers.append(self.ssl_verifier) - opener = build_opener(*handlers) - return opener.open(req) - - def encode_request(self, fields, files): - """ - Encode fields and files for posting to an HTTP server. - - :param fields: The fields to send as a list of (fieldname, value) - tuples. - :param files: The files to send as a list of (fieldname, filename, - file_bytes) tuple. - """ - # Adapted from packaging, which in turn was adapted from - # http://code.activestate.com/recipes/146306 - - parts = [] - boundary = self.boundary - for k, values in fields: - if not isinstance(values, (list, tuple)): - values = [values] - - for v in values: - parts.extend(( - b'--' + boundary, - ('Content-Disposition: form-data; name="%s"' % - k).encode('utf-8'), - b'', - v.encode('utf-8'))) - for key, filename, value in files: - parts.extend(( - b'--' + boundary, - ('Content-Disposition: form-data; name="%s"; filename="%s"' % - (key, filename)).encode('utf-8'), - b'', - value)) - - parts.extend((b'--' + boundary + b'--', b'')) - - body = b'\r\n'.join(parts) - ct = b'multipart/form-data; boundary=' + boundary - headers = { - 'Content-type': ct, - 'Content-length': str(len(body)) - } - return Request(self.url, body, headers) - - def search(self, terms, operator=None): # pragma: no cover - if isinstance(terms, string_types): - terms = {'name': terms} - rpc_proxy = ServerProxy(self.url, timeout=3.0) - try: - return rpc_proxy.search(terms, operator or 'and') - finally: - rpc_proxy('close')() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/locators.py b/venv/lib/python3.12/site-packages/pip/_vendor/distlib/locators.py deleted file mode 100644 index f9f0788..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/locators.py +++ /dev/null @@ -1,1303 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012-2023 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# - -import gzip -from io import BytesIO -import json -import logging -import os -import posixpath -import re -try: - import threading -except ImportError: # pragma: no cover - import dummy_threading as threading -import zlib - -from . import DistlibException -from .compat import (urljoin, urlparse, urlunparse, url2pathname, pathname2url, - queue, quote, unescape, build_opener, - HTTPRedirectHandler as BaseRedirectHandler, text_type, - Request, HTTPError, URLError) -from .database import Distribution, DistributionPath, make_dist -from .metadata import Metadata, MetadataInvalidError -from .util import (cached_property, ensure_slash, split_filename, get_project_data, - parse_requirement, parse_name_and_version, ServerProxy, - normalize_name) -from .version import get_scheme, UnsupportedVersionError -from .wheel import Wheel, is_compatible - -logger = logging.getLogger(__name__) - -HASHER_HASH = re.compile(r'^(\w+)=([a-f0-9]+)') -CHARSET = re.compile(r';\s*charset\s*=\s*(.*)\s*$', re.I) -HTML_CONTENT_TYPE = re.compile('text/html|application/x(ht)?ml') -DEFAULT_INDEX = 'https://pypi.org/pypi' - - -def get_all_distribution_names(url=None): - """ - Return all distribution names known by an index. - :param url: The URL of the index. - :return: A list of all known distribution names. - """ - if url is None: - url = DEFAULT_INDEX - client = ServerProxy(url, timeout=3.0) - try: - return client.list_packages() - finally: - client('close')() - - -class RedirectHandler(BaseRedirectHandler): - """ - A class to work around a bug in some Python 3.2.x releases. - """ - # There's a bug in the base version for some 3.2.x - # (e.g. 3.2.2 on Ubuntu Oneiric). If a Location header - # returns e.g. /abc, it bails because it says the scheme '' - # is bogus, when actually it should use the request's - # URL for the scheme. See Python issue #13696. - def http_error_302(self, req, fp, code, msg, headers): - # Some servers (incorrectly) return multiple Location headers - # (so probably same goes for URI). Use first header. - newurl = None - for key in ('location', 'uri'): - if key in headers: - newurl = headers[key] - break - if newurl is None: # pragma: no cover - return - urlparts = urlparse(newurl) - if urlparts.scheme == '': - newurl = urljoin(req.get_full_url(), newurl) - if hasattr(headers, 'replace_header'): - headers.replace_header(key, newurl) - else: - headers[key] = newurl - return BaseRedirectHandler.http_error_302(self, req, fp, code, msg, - headers) - - http_error_301 = http_error_303 = http_error_307 = http_error_302 - - -class Locator(object): - """ - A base class for locators - things that locate distributions. - """ - source_extensions = ('.tar.gz', '.tar.bz2', '.tar', '.zip', '.tgz', '.tbz') - binary_extensions = ('.egg', '.exe', '.whl') - excluded_extensions = ('.pdf',) - - # A list of tags indicating which wheels you want to match. The default - # value of None matches against the tags compatible with the running - # Python. If you want to match other values, set wheel_tags on a locator - # instance to a list of tuples (pyver, abi, arch) which you want to match. - wheel_tags = None - - downloadable_extensions = source_extensions + ('.whl',) - - def __init__(self, scheme='default'): - """ - Initialise an instance. - :param scheme: Because locators look for most recent versions, they - need to know the version scheme to use. This specifies - the current PEP-recommended scheme - use ``'legacy'`` - if you need to support existing distributions on PyPI. - """ - self._cache = {} - self.scheme = scheme - # Because of bugs in some of the handlers on some of the platforms, - # we use our own opener rather than just using urlopen. - self.opener = build_opener(RedirectHandler()) - # If get_project() is called from locate(), the matcher instance - # is set from the requirement passed to locate(). See issue #18 for - # why this can be useful to know. - self.matcher = None - self.errors = queue.Queue() - - def get_errors(self): - """ - Return any errors which have occurred. - """ - result = [] - while not self.errors.empty(): # pragma: no cover - try: - e = self.errors.get(False) - result.append(e) - except self.errors.Empty: - continue - self.errors.task_done() - return result - - def clear_errors(self): - """ - Clear any errors which may have been logged. - """ - # Just get the errors and throw them away - self.get_errors() - - def clear_cache(self): - self._cache.clear() - - def _get_scheme(self): - return self._scheme - - def _set_scheme(self, value): - self._scheme = value - - scheme = property(_get_scheme, _set_scheme) - - def _get_project(self, name): - """ - For a given project, get a dictionary mapping available versions to Distribution - instances. - - This should be implemented in subclasses. - - If called from a locate() request, self.matcher will be set to a - matcher for the requirement to satisfy, otherwise it will be None. - """ - raise NotImplementedError('Please implement in the subclass') - - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - raise NotImplementedError('Please implement in the subclass') - - def get_project(self, name): - """ - For a given project, get a dictionary mapping available versions to Distribution - instances. - - This calls _get_project to do all the work, and just implements a caching layer on top. - """ - if self._cache is None: # pragma: no cover - result = self._get_project(name) - elif name in self._cache: - result = self._cache[name] - else: - self.clear_errors() - result = self._get_project(name) - self._cache[name] = result - return result - - def score_url(self, url): - """ - Give an url a score which can be used to choose preferred URLs - for a given project release. - """ - t = urlparse(url) - basename = posixpath.basename(t.path) - compatible = True - is_wheel = basename.endswith('.whl') - is_downloadable = basename.endswith(self.downloadable_extensions) - if is_wheel: - compatible = is_compatible(Wheel(basename), self.wheel_tags) - return (t.scheme == 'https', 'pypi.org' in t.netloc, - is_downloadable, is_wheel, compatible, basename) - - def prefer_url(self, url1, url2): - """ - Choose one of two URLs where both are candidates for distribution - archives for the same version of a distribution (for example, - .tar.gz vs. zip). - - The current implementation favours https:// URLs over http://, archives - from PyPI over those from other locations, wheel compatibility (if a - wheel) and then the archive name. - """ - result = url2 - if url1: - s1 = self.score_url(url1) - s2 = self.score_url(url2) - if s1 > s2: - result = url1 - if result != url2: - logger.debug('Not replacing %r with %r', url1, url2) - else: - logger.debug('Replacing %r with %r', url1, url2) - return result - - def split_filename(self, filename, project_name): - """ - Attempt to split a filename in project name, version and Python version. - """ - return split_filename(filename, project_name) - - def convert_url_to_download_info(self, url, project_name): - """ - See if a URL is a candidate for a download URL for a project (the URL - has typically been scraped from an HTML page). - - If it is, a dictionary is returned with keys "name", "version", - "filename" and "url"; otherwise, None is returned. - """ - def same_project(name1, name2): - return normalize_name(name1) == normalize_name(name2) - - result = None - scheme, netloc, path, params, query, frag = urlparse(url) - if frag.lower().startswith('egg='): # pragma: no cover - logger.debug('%s: version hint in fragment: %r', - project_name, frag) - m = HASHER_HASH.match(frag) - if m: - algo, digest = m.groups() - else: - algo, digest = None, None - origpath = path - if path and path[-1] == '/': # pragma: no cover - path = path[:-1] - if path.endswith('.whl'): - try: - wheel = Wheel(path) - if not is_compatible(wheel, self.wheel_tags): - logger.debug('Wheel not compatible: %s', path) - else: - if project_name is None: - include = True - else: - include = same_project(wheel.name, project_name) - if include: - result = { - 'name': wheel.name, - 'version': wheel.version, - 'filename': wheel.filename, - 'url': urlunparse((scheme, netloc, origpath, - params, query, '')), - 'python-version': ', '.join( - ['.'.join(list(v[2:])) for v in wheel.pyver]), - } - except Exception: # pragma: no cover - logger.warning('invalid path for wheel: %s', path) - elif not path.endswith(self.downloadable_extensions): # pragma: no cover - logger.debug('Not downloadable: %s', path) - else: # downloadable extension - path = filename = posixpath.basename(path) - for ext in self.downloadable_extensions: - if path.endswith(ext): - path = path[:-len(ext)] - t = self.split_filename(path, project_name) - if not t: # pragma: no cover - logger.debug('No match for project/version: %s', path) - else: - name, version, pyver = t - if not project_name or same_project(project_name, name): - result = { - 'name': name, - 'version': version, - 'filename': filename, - 'url': urlunparse((scheme, netloc, origpath, - params, query, '')), - } - if pyver: # pragma: no cover - result['python-version'] = pyver - break - if result and algo: - result['%s_digest' % algo] = digest - return result - - def _get_digest(self, info): - """ - Get a digest from a dictionary by looking at a "digests" dictionary - or keys of the form 'algo_digest'. - - Returns a 2-tuple (algo, digest) if found, else None. Currently - looks only for SHA256, then MD5. - """ - result = None - if 'digests' in info: - digests = info['digests'] - for algo in ('sha256', 'md5'): - if algo in digests: - result = (algo, digests[algo]) - break - if not result: - for algo in ('sha256', 'md5'): - key = '%s_digest' % algo - if key in info: - result = (algo, info[key]) - break - return result - - def _update_version_data(self, result, info): - """ - Update a result dictionary (the final result from _get_project) with a - dictionary for a specific version, which typically holds information - gleaned from a filename or URL for an archive for the distribution. - """ - name = info.pop('name') - version = info.pop('version') - if version in result: - dist = result[version] - md = dist.metadata - else: - dist = make_dist(name, version, scheme=self.scheme) - md = dist.metadata - dist.digest = digest = self._get_digest(info) - url = info['url'] - result['digests'][url] = digest - if md.source_url != info['url']: - md.source_url = self.prefer_url(md.source_url, url) - result['urls'].setdefault(version, set()).add(url) - dist.locator = self - result[version] = dist - - def locate(self, requirement, prereleases=False): - """ - Find the most recent distribution which matches the given - requirement. - - :param requirement: A requirement of the form 'foo (1.0)' or perhaps - 'foo (>= 1.0, < 2.0, != 1.3)' - :param prereleases: If ``True``, allow pre-release versions - to be located. Otherwise, pre-release versions - are not returned. - :return: A :class:`Distribution` instance, or ``None`` if no such - distribution could be located. - """ - result = None - r = parse_requirement(requirement) - if r is None: # pragma: no cover - raise DistlibException('Not a valid requirement: %r' % requirement) - scheme = get_scheme(self.scheme) - self.matcher = matcher = scheme.matcher(r.requirement) - logger.debug('matcher: %s (%s)', matcher, type(matcher).__name__) - versions = self.get_project(r.name) - if len(versions) > 2: # urls and digests keys are present - # sometimes, versions are invalid - slist = [] - vcls = matcher.version_class - for k in versions: - if k in ('urls', 'digests'): - continue - try: - if not matcher.match(k): - pass # logger.debug('%s did not match %r', matcher, k) - else: - if prereleases or not vcls(k).is_prerelease: - slist.append(k) - except Exception: # pragma: no cover - logger.warning('error matching %s with %r', matcher, k) - pass # slist.append(k) - if len(slist) > 1: - slist = sorted(slist, key=scheme.key) - if slist: - logger.debug('sorted list: %s', slist) - version = slist[-1] - result = versions[version] - if result: - if r.extras: - result.extras = r.extras - result.download_urls = versions.get('urls', {}).get(version, set()) - d = {} - sd = versions.get('digests', {}) - for url in result.download_urls: - if url in sd: # pragma: no cover - d[url] = sd[url] - result.digests = d - self.matcher = None - return result - - -class PyPIRPCLocator(Locator): - """ - This locator uses XML-RPC to locate distributions. It therefore - cannot be used with simple mirrors (that only mirror file content). - """ - def __init__(self, url, **kwargs): - """ - Initialise an instance. - - :param url: The URL to use for XML-RPC. - :param kwargs: Passed to the superclass constructor. - """ - super(PyPIRPCLocator, self).__init__(**kwargs) - self.base_url = url - self.client = ServerProxy(url, timeout=3.0) - - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - return set(self.client.list_packages()) - - def _get_project(self, name): - result = {'urls': {}, 'digests': {}} - versions = self.client.package_releases(name, True) - for v in versions: - urls = self.client.release_urls(name, v) - data = self.client.release_data(name, v) - metadata = Metadata(scheme=self.scheme) - metadata.name = data['name'] - metadata.version = data['version'] - metadata.license = data.get('license') - metadata.keywords = data.get('keywords', []) - metadata.summary = data.get('summary') - dist = Distribution(metadata) - if urls: - info = urls[0] - metadata.source_url = info['url'] - dist.digest = self._get_digest(info) - dist.locator = self - result[v] = dist - for info in urls: - url = info['url'] - digest = self._get_digest(info) - result['urls'].setdefault(v, set()).add(url) - result['digests'][url] = digest - return result - - -class PyPIJSONLocator(Locator): - """ - This locator uses PyPI's JSON interface. It's very limited in functionality - and probably not worth using. - """ - def __init__(self, url, **kwargs): - super(PyPIJSONLocator, self).__init__(**kwargs) - self.base_url = ensure_slash(url) - - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - raise NotImplementedError('Not available from this locator') - - def _get_project(self, name): - result = {'urls': {}, 'digests': {}} - url = urljoin(self.base_url, '%s/json' % quote(name)) - try: - resp = self.opener.open(url) - data = resp.read().decode() # for now - d = json.loads(data) - md = Metadata(scheme=self.scheme) - data = d['info'] - md.name = data['name'] - md.version = data['version'] - md.license = data.get('license') - md.keywords = data.get('keywords', []) - md.summary = data.get('summary') - dist = Distribution(md) - dist.locator = self - # urls = d['urls'] - result[md.version] = dist - for info in d['urls']: - url = info['url'] - dist.download_urls.add(url) - dist.digests[url] = self._get_digest(info) - result['urls'].setdefault(md.version, set()).add(url) - result['digests'][url] = self._get_digest(info) - # Now get other releases - for version, infos in d['releases'].items(): - if version == md.version: - continue # already done - omd = Metadata(scheme=self.scheme) - omd.name = md.name - omd.version = version - odist = Distribution(omd) - odist.locator = self - result[version] = odist - for info in infos: - url = info['url'] - odist.download_urls.add(url) - odist.digests[url] = self._get_digest(info) - result['urls'].setdefault(version, set()).add(url) - result['digests'][url] = self._get_digest(info) -# for info in urls: -# md.source_url = info['url'] -# dist.digest = self._get_digest(info) -# dist.locator = self -# for info in urls: -# url = info['url'] -# result['urls'].setdefault(md.version, set()).add(url) -# result['digests'][url] = self._get_digest(info) - except Exception as e: - self.errors.put(text_type(e)) - logger.exception('JSON fetch failed: %s', e) - return result - - -class Page(object): - """ - This class represents a scraped HTML page. - """ - # The following slightly hairy-looking regex just looks for the contents of - # an anchor link, which has an attribute "href" either immediately preceded - # or immediately followed by a "rel" attribute. The attribute values can be - # declared with double quotes, single quotes or no quotes - which leads to - # the length of the expression. - _href = re.compile(""" -(rel\\s*=\\s*(?:"(?P<rel1>[^"]*)"|'(?P<rel2>[^']*)'|(?P<rel3>[^>\\s\n]*))\\s+)? -href\\s*=\\s*(?:"(?P<url1>[^"]*)"|'(?P<url2>[^']*)'|(?P<url3>[^>\\s\n]*)) -(\\s+rel\\s*=\\s*(?:"(?P<rel4>[^"]*)"|'(?P<rel5>[^']*)'|(?P<rel6>[^>\\s\n]*)))? -""", re.I | re.S | re.X) - _base = re.compile(r"""<base\s+href\s*=\s*['"]?([^'">]+)""", re.I | re.S) - - def __init__(self, data, url): - """ - Initialise an instance with the Unicode page contents and the URL they - came from. - """ - self.data = data - self.base_url = self.url = url - m = self._base.search(self.data) - if m: - self.base_url = m.group(1) - - _clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I) - - @cached_property - def links(self): - """ - Return the URLs of all the links on a page together with information - about their "rel" attribute, for determining which ones to treat as - downloads and which ones to queue for further scraping. - """ - def clean(url): - "Tidy up an URL." - scheme, netloc, path, params, query, frag = urlparse(url) - return urlunparse((scheme, netloc, quote(path), - params, query, frag)) - - result = set() - for match in self._href.finditer(self.data): - d = match.groupdict('') - rel = (d['rel1'] or d['rel2'] or d['rel3'] or - d['rel4'] or d['rel5'] or d['rel6']) - url = d['url1'] or d['url2'] or d['url3'] - url = urljoin(self.base_url, url) - url = unescape(url) - url = self._clean_re.sub(lambda m: '%%%2x' % ord(m.group(0)), url) - result.add((url, rel)) - # We sort the result, hoping to bring the most recent versions - # to the front - result = sorted(result, key=lambda t: t[0], reverse=True) - return result - - -class SimpleScrapingLocator(Locator): - """ - A locator which scrapes HTML pages to locate downloads for a distribution. - This runs multiple threads to do the I/O; performance is at least as good - as pip's PackageFinder, which works in an analogous fashion. - """ - - # These are used to deal with various Content-Encoding schemes. - decoders = { - 'deflate': zlib.decompress, - 'gzip': lambda b: gzip.GzipFile(fileobj=BytesIO(b)).read(), - 'none': lambda b: b, - } - - def __init__(self, url, timeout=None, num_workers=10, **kwargs): - """ - Initialise an instance. - :param url: The root URL to use for scraping. - :param timeout: The timeout, in seconds, to be applied to requests. - This defaults to ``None`` (no timeout specified). - :param num_workers: The number of worker threads you want to do I/O, - This defaults to 10. - :param kwargs: Passed to the superclass. - """ - super(SimpleScrapingLocator, self).__init__(**kwargs) - self.base_url = ensure_slash(url) - self.timeout = timeout - self._page_cache = {} - self._seen = set() - self._to_fetch = queue.Queue() - self._bad_hosts = set() - self.skip_externals = False - self.num_workers = num_workers - self._lock = threading.RLock() - # See issue #45: we need to be resilient when the locator is used - # in a thread, e.g. with concurrent.futures. We can't use self._lock - # as it is for coordinating our internal threads - the ones created - # in _prepare_threads. - self._gplock = threading.RLock() - self.platform_check = False # See issue #112 - - def _prepare_threads(self): - """ - Threads are created only when get_project is called, and terminate - before it returns. They are there primarily to parallelise I/O (i.e. - fetching web pages). - """ - self._threads = [] - for i in range(self.num_workers): - t = threading.Thread(target=self._fetch) - t.daemon = True - t.start() - self._threads.append(t) - - def _wait_threads(self): - """ - Tell all the threads to terminate (by sending a sentinel value) and - wait for them to do so. - """ - # Note that you need two loops, since you can't say which - # thread will get each sentinel - for t in self._threads: - self._to_fetch.put(None) # sentinel - for t in self._threads: - t.join() - self._threads = [] - - def _get_project(self, name): - result = {'urls': {}, 'digests': {}} - with self._gplock: - self.result = result - self.project_name = name - url = urljoin(self.base_url, '%s/' % quote(name)) - self._seen.clear() - self._page_cache.clear() - self._prepare_threads() - try: - logger.debug('Queueing %s', url) - self._to_fetch.put(url) - self._to_fetch.join() - finally: - self._wait_threads() - del self.result - return result - - platform_dependent = re.compile(r'\b(linux_(i\d86|x86_64|arm\w+)|' - r'win(32|_amd64)|macosx_?\d+)\b', re.I) - - def _is_platform_dependent(self, url): - """ - Does an URL refer to a platform-specific download? - """ - return self.platform_dependent.search(url) - - def _process_download(self, url): - """ - See if an URL is a suitable download for a project. - - If it is, register information in the result dictionary (for - _get_project) about the specific version it's for. - - Note that the return value isn't actually used other than as a boolean - value. - """ - if self.platform_check and self._is_platform_dependent(url): - info = None - else: - info = self.convert_url_to_download_info(url, self.project_name) - logger.debug('process_download: %s -> %s', url, info) - if info: - with self._lock: # needed because self.result is shared - self._update_version_data(self.result, info) - return info - - def _should_queue(self, link, referrer, rel): - """ - Determine whether a link URL from a referring page and with a - particular "rel" attribute should be queued for scraping. - """ - scheme, netloc, path, _, _, _ = urlparse(link) - if path.endswith(self.source_extensions + self.binary_extensions + - self.excluded_extensions): - result = False - elif self.skip_externals and not link.startswith(self.base_url): - result = False - elif not referrer.startswith(self.base_url): - result = False - elif rel not in ('homepage', 'download'): - result = False - elif scheme not in ('http', 'https', 'ftp'): - result = False - elif self._is_platform_dependent(link): - result = False - else: - host = netloc.split(':', 1)[0] - if host.lower() == 'localhost': - result = False - else: - result = True - logger.debug('should_queue: %s (%s) from %s -> %s', link, rel, - referrer, result) - return result - - def _fetch(self): - """ - Get a URL to fetch from the work queue, get the HTML page, examine its - links for download candidates and candidates for further scraping. - - This is a handy method to run in a thread. - """ - while True: - url = self._to_fetch.get() - try: - if url: - page = self.get_page(url) - if page is None: # e.g. after an error - continue - for link, rel in page.links: - if link not in self._seen: - try: - self._seen.add(link) - if (not self._process_download(link) and - self._should_queue(link, url, rel)): - logger.debug('Queueing %s from %s', link, url) - self._to_fetch.put(link) - except MetadataInvalidError: # e.g. invalid versions - pass - except Exception as e: # pragma: no cover - self.errors.put(text_type(e)) - finally: - # always do this, to avoid hangs :-) - self._to_fetch.task_done() - if not url: - # logger.debug('Sentinel seen, quitting.') - break - - def get_page(self, url): - """ - Get the HTML for an URL, possibly from an in-memory cache. - - XXX TODO Note: this cache is never actually cleared. It's assumed that - the data won't get stale over the lifetime of a locator instance (not - necessarily true for the default_locator). - """ - # http://peak.telecommunity.com/DevCenter/EasyInstall#package-index-api - scheme, netloc, path, _, _, _ = urlparse(url) - if scheme == 'file' and os.path.isdir(url2pathname(path)): - url = urljoin(ensure_slash(url), 'index.html') - - if url in self._page_cache: - result = self._page_cache[url] - logger.debug('Returning %s from cache: %s', url, result) - else: - host = netloc.split(':', 1)[0] - result = None - if host in self._bad_hosts: - logger.debug('Skipping %s due to bad host %s', url, host) - else: - req = Request(url, headers={'Accept-encoding': 'identity'}) - try: - logger.debug('Fetching %s', url) - resp = self.opener.open(req, timeout=self.timeout) - logger.debug('Fetched %s', url) - headers = resp.info() - content_type = headers.get('Content-Type', '') - if HTML_CONTENT_TYPE.match(content_type): - final_url = resp.geturl() - data = resp.read() - encoding = headers.get('Content-Encoding') - if encoding: - decoder = self.decoders[encoding] # fail if not found - data = decoder(data) - encoding = 'utf-8' - m = CHARSET.search(content_type) - if m: - encoding = m.group(1) - try: - data = data.decode(encoding) - except UnicodeError: # pragma: no cover - data = data.decode('latin-1') # fallback - result = Page(data, final_url) - self._page_cache[final_url] = result - except HTTPError as e: - if e.code != 404: - logger.exception('Fetch failed: %s: %s', url, e) - except URLError as e: # pragma: no cover - logger.exception('Fetch failed: %s: %s', url, e) - with self._lock: - self._bad_hosts.add(host) - except Exception as e: # pragma: no cover - logger.exception('Fetch failed: %s: %s', url, e) - finally: - self._page_cache[url] = result # even if None (failure) - return result - - _distname_re = re.compile('<a href=[^>]*>([^<]+)<') - - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - result = set() - page = self.get_page(self.base_url) - if not page: - raise DistlibException('Unable to get %s' % self.base_url) - for match in self._distname_re.finditer(page.data): - result.add(match.group(1)) - return result - - -class DirectoryLocator(Locator): - """ - This class locates distributions in a directory tree. - """ - - def __init__(self, path, **kwargs): - """ - Initialise an instance. - :param path: The root of the directory tree to search. - :param kwargs: Passed to the superclass constructor, - except for: - * recursive - if True (the default), subdirectories are - recursed into. If False, only the top-level directory - is searched, - """ - self.recursive = kwargs.pop('recursive', True) - super(DirectoryLocator, self).__init__(**kwargs) - path = os.path.abspath(path) - if not os.path.isdir(path): # pragma: no cover - raise DistlibException('Not a directory: %r' % path) - self.base_dir = path - - def should_include(self, filename, parent): - """ - Should a filename be considered as a candidate for a distribution - archive? As well as the filename, the directory which contains it - is provided, though not used by the current implementation. - """ - return filename.endswith(self.downloadable_extensions) - - def _get_project(self, name): - result = {'urls': {}, 'digests': {}} - for root, dirs, files in os.walk(self.base_dir): - for fn in files: - if self.should_include(fn, root): - fn = os.path.join(root, fn) - url = urlunparse(('file', '', - pathname2url(os.path.abspath(fn)), - '', '', '')) - info = self.convert_url_to_download_info(url, name) - if info: - self._update_version_data(result, info) - if not self.recursive: - break - return result - - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - result = set() - for root, dirs, files in os.walk(self.base_dir): - for fn in files: - if self.should_include(fn, root): - fn = os.path.join(root, fn) - url = urlunparse(('file', '', - pathname2url(os.path.abspath(fn)), - '', '', '')) - info = self.convert_url_to_download_info(url, None) - if info: - result.add(info['name']) - if not self.recursive: - break - return result - - -class JSONLocator(Locator): - """ - This locator uses special extended metadata (not available on PyPI) and is - the basis of performant dependency resolution in distlib. Other locators - require archive downloads before dependencies can be determined! As you - might imagine, that can be slow. - """ - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - raise NotImplementedError('Not available from this locator') - - def _get_project(self, name): - result = {'urls': {}, 'digests': {}} - data = get_project_data(name) - if data: - for info in data.get('files', []): - if info['ptype'] != 'sdist' or info['pyversion'] != 'source': - continue - # We don't store summary in project metadata as it makes - # the data bigger for no benefit during dependency - # resolution - dist = make_dist(data['name'], info['version'], - summary=data.get('summary', - 'Placeholder for summary'), - scheme=self.scheme) - md = dist.metadata - md.source_url = info['url'] - # TODO SHA256 digest - if 'digest' in info and info['digest']: - dist.digest = ('md5', info['digest']) - md.dependencies = info.get('requirements', {}) - dist.exports = info.get('exports', {}) - result[dist.version] = dist - result['urls'].setdefault(dist.version, set()).add(info['url']) - return result - - -class DistPathLocator(Locator): - """ - This locator finds installed distributions in a path. It can be useful for - adding to an :class:`AggregatingLocator`. - """ - def __init__(self, distpath, **kwargs): - """ - Initialise an instance. - - :param distpath: A :class:`DistributionPath` instance to search. - """ - super(DistPathLocator, self).__init__(**kwargs) - assert isinstance(distpath, DistributionPath) - self.distpath = distpath - - def _get_project(self, name): - dist = self.distpath.get_distribution(name) - if dist is None: - result = {'urls': {}, 'digests': {}} - else: - result = { - dist.version: dist, - 'urls': {dist.version: set([dist.source_url])}, - 'digests': {dist.version: set([None])} - } - return result - - -class AggregatingLocator(Locator): - """ - This class allows you to chain and/or merge a list of locators. - """ - def __init__(self, *locators, **kwargs): - """ - Initialise an instance. - - :param locators: The list of locators to search. - :param kwargs: Passed to the superclass constructor, - except for: - * merge - if False (the default), the first successful - search from any of the locators is returned. If True, - the results from all locators are merged (this can be - slow). - """ - self.merge = kwargs.pop('merge', False) - self.locators = locators - super(AggregatingLocator, self).__init__(**kwargs) - - def clear_cache(self): - super(AggregatingLocator, self).clear_cache() - for locator in self.locators: - locator.clear_cache() - - def _set_scheme(self, value): - self._scheme = value - for locator in self.locators: - locator.scheme = value - - scheme = property(Locator.scheme.fget, _set_scheme) - - def _get_project(self, name): - result = {} - for locator in self.locators: - d = locator.get_project(name) - if d: - if self.merge: - files = result.get('urls', {}) - digests = result.get('digests', {}) - # next line could overwrite result['urls'], result['digests'] - result.update(d) - df = result.get('urls') - if files and df: - for k, v in files.items(): - if k in df: - df[k] |= v - else: - df[k] = v - dd = result.get('digests') - if digests and dd: - dd.update(digests) - else: - # See issue #18. If any dists are found and we're looking - # for specific constraints, we only return something if - # a match is found. For example, if a DirectoryLocator - # returns just foo (1.0) while we're looking for - # foo (>= 2.0), we'll pretend there was nothing there so - # that subsequent locators can be queried. Otherwise we - # would just return foo (1.0) which would then lead to a - # failure to find foo (>= 2.0), because other locators - # weren't searched. Note that this only matters when - # merge=False. - if self.matcher is None: - found = True - else: - found = False - for k in d: - if self.matcher.match(k): - found = True - break - if found: - result = d - break - return result - - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - result = set() - for locator in self.locators: - try: - result |= locator.get_distribution_names() - except NotImplementedError: - pass - return result - - -# We use a legacy scheme simply because most of the dists on PyPI use legacy -# versions which don't conform to PEP 440. -default_locator = AggregatingLocator( - # JSONLocator(), # don't use as PEP 426 is withdrawn - SimpleScrapingLocator('https://pypi.org/simple/', - timeout=3.0), - scheme='legacy') - -locate = default_locator.locate - - -class DependencyFinder(object): - """ - Locate dependencies for distributions. - """ - - def __init__(self, locator=None): - """ - Initialise an instance, using the specified locator - to locate distributions. - """ - self.locator = locator or default_locator - self.scheme = get_scheme(self.locator.scheme) - - def add_distribution(self, dist): - """ - Add a distribution to the finder. This will update internal information - about who provides what. - :param dist: The distribution to add. - """ - logger.debug('adding distribution %s', dist) - name = dist.key - self.dists_by_name[name] = dist - self.dists[(name, dist.version)] = dist - for p in dist.provides: - name, version = parse_name_and_version(p) - logger.debug('Add to provided: %s, %s, %s', name, version, dist) - self.provided.setdefault(name, set()).add((version, dist)) - - def remove_distribution(self, dist): - """ - Remove a distribution from the finder. This will update internal - information about who provides what. - :param dist: The distribution to remove. - """ - logger.debug('removing distribution %s', dist) - name = dist.key - del self.dists_by_name[name] - del self.dists[(name, dist.version)] - for p in dist.provides: - name, version = parse_name_and_version(p) - logger.debug('Remove from provided: %s, %s, %s', name, version, dist) - s = self.provided[name] - s.remove((version, dist)) - if not s: - del self.provided[name] - - def get_matcher(self, reqt): - """ - Get a version matcher for a requirement. - :param reqt: The requirement - :type reqt: str - :return: A version matcher (an instance of - :class:`distlib.version.Matcher`). - """ - try: - matcher = self.scheme.matcher(reqt) - except UnsupportedVersionError: # pragma: no cover - # XXX compat-mode if cannot read the version - name = reqt.split()[0] - matcher = self.scheme.matcher(name) - return matcher - - def find_providers(self, reqt): - """ - Find the distributions which can fulfill a requirement. - - :param reqt: The requirement. - :type reqt: str - :return: A set of distribution which can fulfill the requirement. - """ - matcher = self.get_matcher(reqt) - name = matcher.key # case-insensitive - result = set() - provided = self.provided - if name in provided: - for version, provider in provided[name]: - try: - match = matcher.match(version) - except UnsupportedVersionError: - match = False - - if match: - result.add(provider) - break - return result - - def try_to_replace(self, provider, other, problems): - """ - Attempt to replace one provider with another. This is typically used - when resolving dependencies from multiple sources, e.g. A requires - (B >= 1.0) while C requires (B >= 1.1). - - For successful replacement, ``provider`` must meet all the requirements - which ``other`` fulfills. - - :param provider: The provider we are trying to replace with. - :param other: The provider we're trying to replace. - :param problems: If False is returned, this will contain what - problems prevented replacement. This is currently - a tuple of the literal string 'cantreplace', - ``provider``, ``other`` and the set of requirements - that ``provider`` couldn't fulfill. - :return: True if we can replace ``other`` with ``provider``, else - False. - """ - rlist = self.reqts[other] - unmatched = set() - for s in rlist: - matcher = self.get_matcher(s) - if not matcher.match(provider.version): - unmatched.add(s) - if unmatched: - # can't replace other with provider - problems.add(('cantreplace', provider, other, - frozenset(unmatched))) - result = False - else: - # can replace other with provider - self.remove_distribution(other) - del self.reqts[other] - for s in rlist: - self.reqts.setdefault(provider, set()).add(s) - self.add_distribution(provider) - result = True - return result - - def find(self, requirement, meta_extras=None, prereleases=False): - """ - Find a distribution and all distributions it depends on. - - :param requirement: The requirement specifying the distribution to - find, or a Distribution instance. - :param meta_extras: A list of meta extras such as :test:, :build: and - so on. - :param prereleases: If ``True``, allow pre-release versions to be - returned - otherwise, don't return prereleases - unless they're all that's available. - - Return a set of :class:`Distribution` instances and a set of - problems. - - The distributions returned should be such that they have the - :attr:`required` attribute set to ``True`` if they were - from the ``requirement`` passed to ``find()``, and they have the - :attr:`build_time_dependency` attribute set to ``True`` unless they - are post-installation dependencies of the ``requirement``. - - The problems should be a tuple consisting of the string - ``'unsatisfied'`` and the requirement which couldn't be satisfied - by any distribution known to the locator. - """ - - self.provided = {} - self.dists = {} - self.dists_by_name = {} - self.reqts = {} - - meta_extras = set(meta_extras or []) - if ':*:' in meta_extras: - meta_extras.remove(':*:') - # :meta: and :run: are implicitly included - meta_extras |= set([':test:', ':build:', ':dev:']) - - if isinstance(requirement, Distribution): - dist = odist = requirement - logger.debug('passed %s as requirement', odist) - else: - dist = odist = self.locator.locate(requirement, - prereleases=prereleases) - if dist is None: - raise DistlibException('Unable to locate %r' % requirement) - logger.debug('located %s', odist) - dist.requested = True - problems = set() - todo = set([dist]) - install_dists = set([odist]) - while todo: - dist = todo.pop() - name = dist.key # case-insensitive - if name not in self.dists_by_name: - self.add_distribution(dist) - else: - # import pdb; pdb.set_trace() - other = self.dists_by_name[name] - if other != dist: - self.try_to_replace(dist, other, problems) - - ireqts = dist.run_requires | dist.meta_requires - sreqts = dist.build_requires - ereqts = set() - if meta_extras and dist in install_dists: - for key in ('test', 'build', 'dev'): - e = ':%s:' % key - if e in meta_extras: - ereqts |= getattr(dist, '%s_requires' % key) - all_reqts = ireqts | sreqts | ereqts - for r in all_reqts: - providers = self.find_providers(r) - if not providers: - logger.debug('No providers found for %r', r) - provider = self.locator.locate(r, prereleases=prereleases) - # If no provider is found and we didn't consider - # prereleases, consider them now. - if provider is None and not prereleases: - provider = self.locator.locate(r, prereleases=True) - if provider is None: - logger.debug('Cannot satisfy %r', r) - problems.add(('unsatisfied', r)) - else: - n, v = provider.key, provider.version - if (n, v) not in self.dists: - todo.add(provider) - providers.add(provider) - if r in ireqts and dist in install_dists: - install_dists.add(provider) - logger.debug('Adding %s to install_dists', - provider.name_and_version) - for p in providers: - name = p.key - if name not in self.dists_by_name: - self.reqts.setdefault(p, set()).add(r) - else: - other = self.dists_by_name[name] - if other != p: - # see if other can be replaced by p - self.try_to_replace(p, other, problems) - - dists = set(self.dists.values()) - for dist in dists: - dist.build_time_dependency = dist not in install_dists - if dist.build_time_dependency: - logger.debug('%s is a build-time dependency only.', - dist.name_and_version) - logger.debug('find done for %s', odist) - return dists, problems diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/manifest.py b/venv/lib/python3.12/site-packages/pip/_vendor/distlib/manifest.py deleted file mode 100644 index 420dcf1..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/manifest.py +++ /dev/null @@ -1,384 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012-2023 Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -""" -Class representing the list of files in a distribution. - -Equivalent to distutils.filelist, but fixes some problems. -""" -import fnmatch -import logging -import os -import re -import sys - -from . import DistlibException -from .compat import fsdecode -from .util import convert_path - - -__all__ = ['Manifest'] - -logger = logging.getLogger(__name__) - -# a \ followed by some spaces + EOL -_COLLAPSE_PATTERN = re.compile('\\\\w*\n', re.M) -_COMMENTED_LINE = re.compile('#.*?(?=\n)|\n(?=$)', re.M | re.S) - -# -# Due to the different results returned by fnmatch.translate, we need -# to do slightly different processing for Python 2.7 and 3.2 ... this needed -# to be brought in for Python 3.6 onwards. -# -_PYTHON_VERSION = sys.version_info[:2] - - -class Manifest(object): - """ - A list of files built by exploring the filesystem and filtered by applying various - patterns to what we find there. - """ - - def __init__(self, base=None): - """ - Initialise an instance. - - :param base: The base directory to explore under. - """ - self.base = os.path.abspath(os.path.normpath(base or os.getcwd())) - self.prefix = self.base + os.sep - self.allfiles = None - self.files = set() - - # - # Public API - # - - def findall(self): - """Find all files under the base and set ``allfiles`` to the absolute - pathnames of files found. - """ - from stat import S_ISREG, S_ISDIR, S_ISLNK - - self.allfiles = allfiles = [] - root = self.base - stack = [root] - pop = stack.pop - push = stack.append - - while stack: - root = pop() - names = os.listdir(root) - - for name in names: - fullname = os.path.join(root, name) - - # Avoid excess stat calls -- just one will do, thank you! - stat = os.stat(fullname) - mode = stat.st_mode - if S_ISREG(mode): - allfiles.append(fsdecode(fullname)) - elif S_ISDIR(mode) and not S_ISLNK(mode): - push(fullname) - - def add(self, item): - """ - Add a file to the manifest. - - :param item: The pathname to add. This can be relative to the base. - """ - if not item.startswith(self.prefix): - item = os.path.join(self.base, item) - self.files.add(os.path.normpath(item)) - - def add_many(self, items): - """ - Add a list of files to the manifest. - - :param items: The pathnames to add. These can be relative to the base. - """ - for item in items: - self.add(item) - - def sorted(self, wantdirs=False): - """ - Return sorted files in directory order - """ - - def add_dir(dirs, d): - dirs.add(d) - logger.debug('add_dir added %s', d) - if d != self.base: - parent, _ = os.path.split(d) - assert parent not in ('', '/') - add_dir(dirs, parent) - - result = set(self.files) # make a copy! - if wantdirs: - dirs = set() - for f in result: - add_dir(dirs, os.path.dirname(f)) - result |= dirs - return [os.path.join(*path_tuple) for path_tuple in - sorted(os.path.split(path) for path in result)] - - def clear(self): - """Clear all collected files.""" - self.files = set() - self.allfiles = [] - - def process_directive(self, directive): - """ - Process a directive which either adds some files from ``allfiles`` to - ``files``, or removes some files from ``files``. - - :param directive: The directive to process. This should be in a format - compatible with distutils ``MANIFEST.in`` files: - - http://docs.python.org/distutils/sourcedist.html#commands - """ - # Parse the line: split it up, make sure the right number of words - # is there, and return the relevant words. 'action' is always - # defined: it's the first word of the line. Which of the other - # three are defined depends on the action; it'll be either - # patterns, (dir and patterns), or (dirpattern). - action, patterns, thedir, dirpattern = self._parse_directive(directive) - - # OK, now we know that the action is valid and we have the - # right number of words on the line for that action -- so we - # can proceed with minimal error-checking. - if action == 'include': - for pattern in patterns: - if not self._include_pattern(pattern, anchor=True): - logger.warning('no files found matching %r', pattern) - - elif action == 'exclude': - for pattern in patterns: - self._exclude_pattern(pattern, anchor=True) - - elif action == 'global-include': - for pattern in patterns: - if not self._include_pattern(pattern, anchor=False): - logger.warning('no files found matching %r ' - 'anywhere in distribution', pattern) - - elif action == 'global-exclude': - for pattern in patterns: - self._exclude_pattern(pattern, anchor=False) - - elif action == 'recursive-include': - for pattern in patterns: - if not self._include_pattern(pattern, prefix=thedir): - logger.warning('no files found matching %r ' - 'under directory %r', pattern, thedir) - - elif action == 'recursive-exclude': - for pattern in patterns: - self._exclude_pattern(pattern, prefix=thedir) - - elif action == 'graft': - if not self._include_pattern(None, prefix=dirpattern): - logger.warning('no directories found matching %r', - dirpattern) - - elif action == 'prune': - if not self._exclude_pattern(None, prefix=dirpattern): - logger.warning('no previously-included directories found ' - 'matching %r', dirpattern) - else: # pragma: no cover - # This should never happen, as it should be caught in - # _parse_template_line - raise DistlibException( - 'invalid action %r' % action) - - # - # Private API - # - - def _parse_directive(self, directive): - """ - Validate a directive. - :param directive: The directive to validate. - :return: A tuple of action, patterns, thedir, dir_patterns - """ - words = directive.split() - if len(words) == 1 and words[0] not in ('include', 'exclude', - 'global-include', - 'global-exclude', - 'recursive-include', - 'recursive-exclude', - 'graft', 'prune'): - # no action given, let's use the default 'include' - words.insert(0, 'include') - - action = words[0] - patterns = thedir = dir_pattern = None - - if action in ('include', 'exclude', - 'global-include', 'global-exclude'): - if len(words) < 2: - raise DistlibException( - '%r expects <pattern1> <pattern2> ...' % action) - - patterns = [convert_path(word) for word in words[1:]] - - elif action in ('recursive-include', 'recursive-exclude'): - if len(words) < 3: - raise DistlibException( - '%r expects <dir> <pattern1> <pattern2> ...' % action) - - thedir = convert_path(words[1]) - patterns = [convert_path(word) for word in words[2:]] - - elif action in ('graft', 'prune'): - if len(words) != 2: - raise DistlibException( - '%r expects a single <dir_pattern>' % action) - - dir_pattern = convert_path(words[1]) - - else: - raise DistlibException('unknown action %r' % action) - - return action, patterns, thedir, dir_pattern - - def _include_pattern(self, pattern, anchor=True, prefix=None, - is_regex=False): - """Select strings (presumably filenames) from 'self.files' that - match 'pattern', a Unix-style wildcard (glob) pattern. - - Patterns are not quite the same as implemented by the 'fnmatch' - module: '*' and '?' match non-special characters, where "special" - is platform-dependent: slash on Unix; colon, slash, and backslash on - DOS/Windows; and colon on Mac OS. - - If 'anchor' is true (the default), then the pattern match is more - stringent: "*.py" will match "foo.py" but not "foo/bar.py". If - 'anchor' is false, both of these will match. - - If 'prefix' is supplied, then only filenames starting with 'prefix' - (itself a pattern) and ending with 'pattern', with anything in between - them, will match. 'anchor' is ignored in this case. - - If 'is_regex' is true, 'anchor' and 'prefix' are ignored, and - 'pattern' is assumed to be either a string containing a regex or a - regex object -- no translation is done, the regex is just compiled - and used as-is. - - Selected strings will be added to self.files. - - Return True if files are found. - """ - # XXX docstring lying about what the special chars are? - found = False - pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) - - # delayed loading of allfiles list - if self.allfiles is None: - self.findall() - - for name in self.allfiles: - if pattern_re.search(name): - self.files.add(name) - found = True - return found - - def _exclude_pattern(self, pattern, anchor=True, prefix=None, - is_regex=False): - """Remove strings (presumably filenames) from 'files' that match - 'pattern'. - - Other parameters are the same as for 'include_pattern()', above. - The list 'self.files' is modified in place. Return True if files are - found. - - This API is public to allow e.g. exclusion of SCM subdirs, e.g. when - packaging source distributions - """ - found = False - pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) - for f in list(self.files): - if pattern_re.search(f): - self.files.remove(f) - found = True - return found - - def _translate_pattern(self, pattern, anchor=True, prefix=None, - is_regex=False): - """Translate a shell-like wildcard pattern to a compiled regular - expression. - - Return the compiled regex. If 'is_regex' true, - then 'pattern' is directly compiled to a regex (if it's a string) - or just returned as-is (assumes it's a regex object). - """ - if is_regex: - if isinstance(pattern, str): - return re.compile(pattern) - else: - return pattern - - if _PYTHON_VERSION > (3, 2): - # ditch start and end characters - start, _, end = self._glob_to_re('_').partition('_') - - if pattern: - pattern_re = self._glob_to_re(pattern) - if _PYTHON_VERSION > (3, 2): - assert pattern_re.startswith(start) and pattern_re.endswith(end) - else: - pattern_re = '' - - base = re.escape(os.path.join(self.base, '')) - if prefix is not None: - # ditch end of pattern character - if _PYTHON_VERSION <= (3, 2): - empty_pattern = self._glob_to_re('') - prefix_re = self._glob_to_re(prefix)[:-len(empty_pattern)] - else: - prefix_re = self._glob_to_re(prefix) - assert prefix_re.startswith(start) and prefix_re.endswith(end) - prefix_re = prefix_re[len(start): len(prefix_re) - len(end)] - sep = os.sep - if os.sep == '\\': - sep = r'\\' - if _PYTHON_VERSION <= (3, 2): - pattern_re = '^' + base + sep.join((prefix_re, - '.*' + pattern_re)) - else: - pattern_re = pattern_re[len(start): len(pattern_re) - len(end)] - pattern_re = r'%s%s%s%s.*%s%s' % (start, base, prefix_re, sep, - pattern_re, end) - else: # no prefix -- respect anchor flag - if anchor: - if _PYTHON_VERSION <= (3, 2): - pattern_re = '^' + base + pattern_re - else: - pattern_re = r'%s%s%s' % (start, base, pattern_re[len(start):]) - - return re.compile(pattern_re) - - def _glob_to_re(self, pattern): - """Translate a shell-like glob pattern to a regular expression. - - Return a string containing the regex. Differs from - 'fnmatch.translate()' in that '*' does not match "special characters" - (which are platform-specific). - """ - pattern_re = fnmatch.translate(pattern) - - # '?' and '*' in the glob pattern become '.' and '.*' in the RE, which - # IMHO is wrong -- '?' and '*' aren't supposed to match slash in Unix, - # and by extension they shouldn't match such "special characters" under - # any OS. So change all non-escaped dots in the RE to match any - # character except the special characters (currently: just os.sep). - sep = os.sep - if os.sep == '\\': - # we're using a regex to manipulate a regex, so we need - # to escape the backslash twice - sep = r'\\\\' - escaped = r'\1[^%s]' % sep - pattern_re = re.sub(r'((?<!\\)(\\\\)*)\.', escaped, pattern_re) - return pattern_re diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/markers.py b/venv/lib/python3.12/site-packages/pip/_vendor/distlib/markers.py deleted file mode 100644 index 1514d46..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/markers.py +++ /dev/null @@ -1,167 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012-2023 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -""" -Parser for the environment markers micro-language defined in PEP 508. -""" - -# Note: In PEP 345, the micro-language was Python compatible, so the ast -# module could be used to parse it. However, PEP 508 introduced operators such -# as ~= and === which aren't in Python, necessitating a different approach. - -import os -import re -import sys -import platform - -from .compat import string_types -from .util import in_venv, parse_marker -from .version import LegacyVersion as LV - -__all__ = ['interpret'] - -_VERSION_PATTERN = re.compile( - r'((\d+(\.\d+)*\w*)|\'(\d+(\.\d+)*\w*)\'|\"(\d+(\.\d+)*\w*)\")') -_VERSION_MARKERS = {'python_version', 'python_full_version'} - - -def _is_version_marker(s): - return isinstance(s, string_types) and s in _VERSION_MARKERS - - -def _is_literal(o): - if not isinstance(o, string_types) or not o: - return False - return o[0] in '\'"' - - -def _get_versions(s): - return {LV(m.groups()[0]) for m in _VERSION_PATTERN.finditer(s)} - - -class Evaluator(object): - """ - This class is used to evaluate marker expressions. - """ - - operations = { - '==': lambda x, y: x == y, - '===': lambda x, y: x == y, - '~=': lambda x, y: x == y or x > y, - '!=': lambda x, y: x != y, - '<': lambda x, y: x < y, - '<=': lambda x, y: x == y or x < y, - '>': lambda x, y: x > y, - '>=': lambda x, y: x == y or x > y, - 'and': lambda x, y: x and y, - 'or': lambda x, y: x or y, - 'in': lambda x, y: x in y, - 'not in': lambda x, y: x not in y, - } - - def evaluate(self, expr, context): - """ - Evaluate a marker expression returned by the :func:`parse_requirement` - function in the specified context. - """ - if isinstance(expr, string_types): - if expr[0] in '\'"': - result = expr[1:-1] - else: - if expr not in context: - raise SyntaxError('unknown variable: %s' % expr) - result = context[expr] - else: - assert isinstance(expr, dict) - op = expr['op'] - if op not in self.operations: - raise NotImplementedError('op not implemented: %s' % op) - elhs = expr['lhs'] - erhs = expr['rhs'] - if _is_literal(expr['lhs']) and _is_literal(expr['rhs']): - raise SyntaxError('invalid comparison: %s %s %s' % - (elhs, op, erhs)) - - lhs = self.evaluate(elhs, context) - rhs = self.evaluate(erhs, context) - if ((_is_version_marker(elhs) or _is_version_marker(erhs)) - and op in ('<', '<=', '>', '>=', '===', '==', '!=', '~=')): - lhs = LV(lhs) - rhs = LV(rhs) - elif _is_version_marker(elhs) and op in ('in', 'not in'): - lhs = LV(lhs) - rhs = _get_versions(rhs) - result = self.operations[op](lhs, rhs) - return result - - -_DIGITS = re.compile(r'\d+\.\d+') - - -def default_context(): - - def format_full_version(info): - version = '%s.%s.%s' % (info.major, info.minor, info.micro) - kind = info.releaselevel - if kind != 'final': - version += kind[0] + str(info.serial) - return version - - if hasattr(sys, 'implementation'): - implementation_version = format_full_version( - sys.implementation.version) - implementation_name = sys.implementation.name - else: - implementation_version = '0' - implementation_name = '' - - ppv = platform.python_version() - m = _DIGITS.match(ppv) - pv = m.group(0) - result = { - 'implementation_name': implementation_name, - 'implementation_version': implementation_version, - 'os_name': os.name, - 'platform_machine': platform.machine(), - 'platform_python_implementation': platform.python_implementation(), - 'platform_release': platform.release(), - 'platform_system': platform.system(), - 'platform_version': platform.version(), - 'platform_in_venv': str(in_venv()), - 'python_full_version': ppv, - 'python_version': pv, - 'sys_platform': sys.platform, - } - return result - - -DEFAULT_CONTEXT = default_context() -del default_context - -evaluator = Evaluator() - - -def interpret(marker, execution_context=None): - """ - Interpret a marker and return a result depending on environment. - - :param marker: The marker to interpret. - :type marker: str - :param execution_context: The context used for name lookup. - :type execution_context: mapping - """ - try: - expr, rest = parse_marker(marker) - except Exception as e: - raise SyntaxError('Unable to interpret marker syntax: %s: %s' % - (marker, e)) - if rest and rest[0] != '#': - raise SyntaxError('unexpected trailing data in marker: %s: %s' % - (marker, rest)) - context = dict(DEFAULT_CONTEXT) - if execution_context: - context.update(execution_context) - return evaluator.evaluate(expr, context) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/metadata.py b/venv/lib/python3.12/site-packages/pip/_vendor/distlib/metadata.py deleted file mode 100644 index 7189aee..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/metadata.py +++ /dev/null @@ -1,1068 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012 The Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -"""Implementation of the Metadata for Python packages PEPs. - -Supports all metadata formats (1.0, 1.1, 1.2, 1.3/2.1 and 2.2). -""" -from __future__ import unicode_literals - -import codecs -from email import message_from_file -import json -import logging -import re - - -from . import DistlibException, __version__ -from .compat import StringIO, string_types, text_type -from .markers import interpret -from .util import extract_by_key, get_extras -from .version import get_scheme, PEP440_VERSION_RE - -logger = logging.getLogger(__name__) - - -class MetadataMissingError(DistlibException): - """A required metadata is missing""" - - -class MetadataConflictError(DistlibException): - """Attempt to read or write metadata fields that are conflictual.""" - - -class MetadataUnrecognizedVersionError(DistlibException): - """Unknown metadata version number.""" - - -class MetadataInvalidError(DistlibException): - """A metadata value is invalid""" - -# public API of this module -__all__ = ['Metadata', 'PKG_INFO_ENCODING', 'PKG_INFO_PREFERRED_VERSION'] - -# Encoding used for the PKG-INFO files -PKG_INFO_ENCODING = 'utf-8' - -# preferred version. Hopefully will be changed -# to 1.2 once PEP 345 is supported everywhere -PKG_INFO_PREFERRED_VERSION = '1.1' - -_LINE_PREFIX_1_2 = re.compile('\n \\|') -_LINE_PREFIX_PRE_1_2 = re.compile('\n ') -_241_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', - 'Summary', 'Description', - 'Keywords', 'Home-page', 'Author', 'Author-email', - 'License') - -_314_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', - 'Supported-Platform', 'Summary', 'Description', - 'Keywords', 'Home-page', 'Author', 'Author-email', - 'License', 'Classifier', 'Download-URL', 'Obsoletes', - 'Provides', 'Requires') - -_314_MARKERS = ('Obsoletes', 'Provides', 'Requires', 'Classifier', - 'Download-URL') - -_345_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', - 'Supported-Platform', 'Summary', 'Description', - 'Keywords', 'Home-page', 'Author', 'Author-email', - 'Maintainer', 'Maintainer-email', 'License', - 'Classifier', 'Download-URL', 'Obsoletes-Dist', - 'Project-URL', 'Provides-Dist', 'Requires-Dist', - 'Requires-Python', 'Requires-External') - -_345_MARKERS = ('Provides-Dist', 'Requires-Dist', 'Requires-Python', - 'Obsoletes-Dist', 'Requires-External', 'Maintainer', - 'Maintainer-email', 'Project-URL') - -_426_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', - 'Supported-Platform', 'Summary', 'Description', - 'Keywords', 'Home-page', 'Author', 'Author-email', - 'Maintainer', 'Maintainer-email', 'License', - 'Classifier', 'Download-URL', 'Obsoletes-Dist', - 'Project-URL', 'Provides-Dist', 'Requires-Dist', - 'Requires-Python', 'Requires-External', 'Private-Version', - 'Obsoleted-By', 'Setup-Requires-Dist', 'Extension', - 'Provides-Extra') - -_426_MARKERS = ('Private-Version', 'Provides-Extra', 'Obsoleted-By', - 'Setup-Requires-Dist', 'Extension') - -# See issue #106: Sometimes 'Requires' and 'Provides' occur wrongly in -# the metadata. Include them in the tuple literal below to allow them -# (for now). -# Ditto for Obsoletes - see issue #140. -_566_FIELDS = _426_FIELDS + ('Description-Content-Type', - 'Requires', 'Provides', 'Obsoletes') - -_566_MARKERS = ('Description-Content-Type',) - -_643_MARKERS = ('Dynamic', 'License-File') - -_643_FIELDS = _566_FIELDS + _643_MARKERS - -_ALL_FIELDS = set() -_ALL_FIELDS.update(_241_FIELDS) -_ALL_FIELDS.update(_314_FIELDS) -_ALL_FIELDS.update(_345_FIELDS) -_ALL_FIELDS.update(_426_FIELDS) -_ALL_FIELDS.update(_566_FIELDS) -_ALL_FIELDS.update(_643_FIELDS) - -EXTRA_RE = re.compile(r'''extra\s*==\s*("([^"]+)"|'([^']+)')''') - - -def _version2fieldlist(version): - if version == '1.0': - return _241_FIELDS - elif version == '1.1': - return _314_FIELDS - elif version == '1.2': - return _345_FIELDS - elif version in ('1.3', '2.1'): - # avoid adding field names if already there - return _345_FIELDS + tuple(f for f in _566_FIELDS if f not in _345_FIELDS) - elif version == '2.0': - raise ValueError('Metadata 2.0 is withdrawn and not supported') - # return _426_FIELDS - elif version == '2.2': - return _643_FIELDS - raise MetadataUnrecognizedVersionError(version) - - -def _best_version(fields): - """Detect the best version depending on the fields used.""" - def _has_marker(keys, markers): - return any(marker in keys for marker in markers) - - keys = [key for key, value in fields.items() if value not in ([], 'UNKNOWN', None)] - possible_versions = ['1.0', '1.1', '1.2', '1.3', '2.1', '2.2'] # 2.0 removed - - # first let's try to see if a field is not part of one of the version - for key in keys: - if key not in _241_FIELDS and '1.0' in possible_versions: - possible_versions.remove('1.0') - logger.debug('Removed 1.0 due to %s', key) - if key not in _314_FIELDS and '1.1' in possible_versions: - possible_versions.remove('1.1') - logger.debug('Removed 1.1 due to %s', key) - if key not in _345_FIELDS and '1.2' in possible_versions: - possible_versions.remove('1.2') - logger.debug('Removed 1.2 due to %s', key) - if key not in _566_FIELDS and '1.3' in possible_versions: - possible_versions.remove('1.3') - logger.debug('Removed 1.3 due to %s', key) - if key not in _566_FIELDS and '2.1' in possible_versions: - if key != 'Description': # In 2.1, description allowed after headers - possible_versions.remove('2.1') - logger.debug('Removed 2.1 due to %s', key) - if key not in _643_FIELDS and '2.2' in possible_versions: - possible_versions.remove('2.2') - logger.debug('Removed 2.2 due to %s', key) - # if key not in _426_FIELDS and '2.0' in possible_versions: - # possible_versions.remove('2.0') - # logger.debug('Removed 2.0 due to %s', key) - - # possible_version contains qualified versions - if len(possible_versions) == 1: - return possible_versions[0] # found ! - elif len(possible_versions) == 0: - logger.debug('Out of options - unknown metadata set: %s', fields) - raise MetadataConflictError('Unknown metadata set') - - # let's see if one unique marker is found - is_1_1 = '1.1' in possible_versions and _has_marker(keys, _314_MARKERS) - is_1_2 = '1.2' in possible_versions and _has_marker(keys, _345_MARKERS) - is_2_1 = '2.1' in possible_versions and _has_marker(keys, _566_MARKERS) - # is_2_0 = '2.0' in possible_versions and _has_marker(keys, _426_MARKERS) - is_2_2 = '2.2' in possible_versions and _has_marker(keys, _643_MARKERS) - if int(is_1_1) + int(is_1_2) + int(is_2_1) + int(is_2_2) > 1: - raise MetadataConflictError('You used incompatible 1.1/1.2/2.1/2.2 fields') - - # we have the choice, 1.0, or 1.2, 2.1 or 2.2 - # - 1.0 has a broken Summary field but works with all tools - # - 1.1 is to avoid - # - 1.2 fixes Summary but has little adoption - # - 2.1 adds more features - # - 2.2 is the latest - if not is_1_1 and not is_1_2 and not is_2_1 and not is_2_2: - # we couldn't find any specific marker - if PKG_INFO_PREFERRED_VERSION in possible_versions: - return PKG_INFO_PREFERRED_VERSION - if is_1_1: - return '1.1' - if is_1_2: - return '1.2' - if is_2_1: - return '2.1' - # if is_2_2: - # return '2.2' - - return '2.2' - -# This follows the rules about transforming keys as described in -# https://www.python.org/dev/peps/pep-0566/#id17 -_ATTR2FIELD = { - name.lower().replace("-", "_"): name for name in _ALL_FIELDS -} -_FIELD2ATTR = {field: attr for attr, field in _ATTR2FIELD.items()} - -_PREDICATE_FIELDS = ('Requires-Dist', 'Obsoletes-Dist', 'Provides-Dist') -_VERSIONS_FIELDS = ('Requires-Python',) -_VERSION_FIELDS = ('Version',) -_LISTFIELDS = ('Platform', 'Classifier', 'Obsoletes', - 'Requires', 'Provides', 'Obsoletes-Dist', - 'Provides-Dist', 'Requires-Dist', 'Requires-External', - 'Project-URL', 'Supported-Platform', 'Setup-Requires-Dist', - 'Provides-Extra', 'Extension', 'License-File') -_LISTTUPLEFIELDS = ('Project-URL',) - -_ELEMENTSFIELD = ('Keywords',) - -_UNICODEFIELDS = ('Author', 'Maintainer', 'Summary', 'Description') - -_MISSING = object() - -_FILESAFE = re.compile('[^A-Za-z0-9.]+') - - -def _get_name_and_version(name, version, for_filename=False): - """Return the distribution name with version. - - If for_filename is true, return a filename-escaped form.""" - if for_filename: - # For both name and version any runs of non-alphanumeric or '.' - # characters are replaced with a single '-'. Additionally any - # spaces in the version string become '.' - name = _FILESAFE.sub('-', name) - version = _FILESAFE.sub('-', version.replace(' ', '.')) - return '%s-%s' % (name, version) - - -class LegacyMetadata(object): - """The legacy metadata of a release. - - Supports versions 1.0, 1.1, 1.2, 2.0 and 1.3/2.1 (auto-detected). You can - instantiate the class with one of these arguments (or none): - - *path*, the path to a metadata file - - *fileobj* give a file-like object with metadata as content - - *mapping* is a dict-like object - - *scheme* is a version scheme name - """ - # TODO document the mapping API and UNKNOWN default key - - def __init__(self, path=None, fileobj=None, mapping=None, - scheme='default'): - if [path, fileobj, mapping].count(None) < 2: - raise TypeError('path, fileobj and mapping are exclusive') - self._fields = {} - self.requires_files = [] - self._dependencies = None - self.scheme = scheme - if path is not None: - self.read(path) - elif fileobj is not None: - self.read_file(fileobj) - elif mapping is not None: - self.update(mapping) - self.set_metadata_version() - - def set_metadata_version(self): - self._fields['Metadata-Version'] = _best_version(self._fields) - - def _write_field(self, fileobj, name, value): - fileobj.write('%s: %s\n' % (name, value)) - - def __getitem__(self, name): - return self.get(name) - - def __setitem__(self, name, value): - return self.set(name, value) - - def __delitem__(self, name): - field_name = self._convert_name(name) - try: - del self._fields[field_name] - except KeyError: - raise KeyError(name) - - def __contains__(self, name): - return (name in self._fields or - self._convert_name(name) in self._fields) - - def _convert_name(self, name): - if name in _ALL_FIELDS: - return name - name = name.replace('-', '_').lower() - return _ATTR2FIELD.get(name, name) - - def _default_value(self, name): - if name in _LISTFIELDS or name in _ELEMENTSFIELD: - return [] - return 'UNKNOWN' - - def _remove_line_prefix(self, value): - if self.metadata_version in ('1.0', '1.1'): - return _LINE_PREFIX_PRE_1_2.sub('\n', value) - else: - return _LINE_PREFIX_1_2.sub('\n', value) - - def __getattr__(self, name): - if name in _ATTR2FIELD: - return self[name] - raise AttributeError(name) - - # - # Public API - # - -# dependencies = property(_get_dependencies, _set_dependencies) - - def get_fullname(self, filesafe=False): - """Return the distribution name with version. - - If filesafe is true, return a filename-escaped form.""" - return _get_name_and_version(self['Name'], self['Version'], filesafe) - - def is_field(self, name): - """return True if name is a valid metadata key""" - name = self._convert_name(name) - return name in _ALL_FIELDS - - def is_multi_field(self, name): - name = self._convert_name(name) - return name in _LISTFIELDS - - def read(self, filepath): - """Read the metadata values from a file path.""" - fp = codecs.open(filepath, 'r', encoding='utf-8') - try: - self.read_file(fp) - finally: - fp.close() - - def read_file(self, fileob): - """Read the metadata values from a file object.""" - msg = message_from_file(fileob) - self._fields['Metadata-Version'] = msg['metadata-version'] - - # When reading, get all the fields we can - for field in _ALL_FIELDS: - if field not in msg: - continue - if field in _LISTFIELDS: - # we can have multiple lines - values = msg.get_all(field) - if field in _LISTTUPLEFIELDS and values is not None: - values = [tuple(value.split(',')) for value in values] - self.set(field, values) - else: - # single line - value = msg[field] - if value is not None and value != 'UNKNOWN': - self.set(field, value) - - # PEP 566 specifies that the body be used for the description, if - # available - body = msg.get_payload() - self["Description"] = body if body else self["Description"] - # logger.debug('Attempting to set metadata for %s', self) - # self.set_metadata_version() - - def write(self, filepath, skip_unknown=False): - """Write the metadata fields to filepath.""" - fp = codecs.open(filepath, 'w', encoding='utf-8') - try: - self.write_file(fp, skip_unknown) - finally: - fp.close() - - def write_file(self, fileobject, skip_unknown=False): - """Write the PKG-INFO format data to a file object.""" - self.set_metadata_version() - - for field in _version2fieldlist(self['Metadata-Version']): - values = self.get(field) - if skip_unknown and values in ('UNKNOWN', [], ['UNKNOWN']): - continue - if field in _ELEMENTSFIELD: - self._write_field(fileobject, field, ','.join(values)) - continue - if field not in _LISTFIELDS: - if field == 'Description': - if self.metadata_version in ('1.0', '1.1'): - values = values.replace('\n', '\n ') - else: - values = values.replace('\n', '\n |') - values = [values] - - if field in _LISTTUPLEFIELDS: - values = [','.join(value) for value in values] - - for value in values: - self._write_field(fileobject, field, value) - - def update(self, other=None, **kwargs): - """Set metadata values from the given iterable `other` and kwargs. - - Behavior is like `dict.update`: If `other` has a ``keys`` method, - they are looped over and ``self[key]`` is assigned ``other[key]``. - Else, ``other`` is an iterable of ``(key, value)`` iterables. - - Keys that don't match a metadata field or that have an empty value are - dropped. - """ - def _set(key, value): - if key in _ATTR2FIELD and value: - self.set(self._convert_name(key), value) - - if not other: - # other is None or empty container - pass - elif hasattr(other, 'keys'): - for k in other.keys(): - _set(k, other[k]) - else: - for k, v in other: - _set(k, v) - - if kwargs: - for k, v in kwargs.items(): - _set(k, v) - - def set(self, name, value): - """Control then set a metadata field.""" - name = self._convert_name(name) - - if ((name in _ELEMENTSFIELD or name == 'Platform') and - not isinstance(value, (list, tuple))): - if isinstance(value, string_types): - value = [v.strip() for v in value.split(',')] - else: - value = [] - elif (name in _LISTFIELDS and - not isinstance(value, (list, tuple))): - if isinstance(value, string_types): - value = [value] - else: - value = [] - - if logger.isEnabledFor(logging.WARNING): - project_name = self['Name'] - - scheme = get_scheme(self.scheme) - if name in _PREDICATE_FIELDS and value is not None: - for v in value: - # check that the values are valid - if not scheme.is_valid_matcher(v.split(';')[0]): - logger.warning( - "'%s': '%s' is not valid (field '%s')", - project_name, v, name) - # FIXME this rejects UNKNOWN, is that right? - elif name in _VERSIONS_FIELDS and value is not None: - if not scheme.is_valid_constraint_list(value): - logger.warning("'%s': '%s' is not a valid version (field '%s')", - project_name, value, name) - elif name in _VERSION_FIELDS and value is not None: - if not scheme.is_valid_version(value): - logger.warning("'%s': '%s' is not a valid version (field '%s')", - project_name, value, name) - - if name in _UNICODEFIELDS: - if name == 'Description': - value = self._remove_line_prefix(value) - - self._fields[name] = value - - def get(self, name, default=_MISSING): - """Get a metadata field.""" - name = self._convert_name(name) - if name not in self._fields: - if default is _MISSING: - default = self._default_value(name) - return default - if name in _UNICODEFIELDS: - value = self._fields[name] - return value - elif name in _LISTFIELDS: - value = self._fields[name] - if value is None: - return [] - res = [] - for val in value: - if name not in _LISTTUPLEFIELDS: - res.append(val) - else: - # That's for Project-URL - res.append((val[0], val[1])) - return res - - elif name in _ELEMENTSFIELD: - value = self._fields[name] - if isinstance(value, string_types): - return value.split(',') - return self._fields[name] - - def check(self, strict=False): - """Check if the metadata is compliant. If strict is True then raise if - no Name or Version are provided""" - self.set_metadata_version() - - # XXX should check the versions (if the file was loaded) - missing, warnings = [], [] - - for attr in ('Name', 'Version'): # required by PEP 345 - if attr not in self: - missing.append(attr) - - if strict and missing != []: - msg = 'missing required metadata: %s' % ', '.join(missing) - raise MetadataMissingError(msg) - - for attr in ('Home-page', 'Author'): - if attr not in self: - missing.append(attr) - - # checking metadata 1.2 (XXX needs to check 1.1, 1.0) - if self['Metadata-Version'] != '1.2': - return missing, warnings - - scheme = get_scheme(self.scheme) - - def are_valid_constraints(value): - for v in value: - if not scheme.is_valid_matcher(v.split(';')[0]): - return False - return True - - for fields, controller in ((_PREDICATE_FIELDS, are_valid_constraints), - (_VERSIONS_FIELDS, - scheme.is_valid_constraint_list), - (_VERSION_FIELDS, - scheme.is_valid_version)): - for field in fields: - value = self.get(field, None) - if value is not None and not controller(value): - warnings.append("Wrong value for '%s': %s" % (field, value)) - - return missing, warnings - - def todict(self, skip_missing=False): - """Return fields as a dict. - - Field names will be converted to use the underscore-lowercase style - instead of hyphen-mixed case (i.e. home_page instead of Home-page). - This is as per https://www.python.org/dev/peps/pep-0566/#id17. - """ - self.set_metadata_version() - - fields = _version2fieldlist(self['Metadata-Version']) - - data = {} - - for field_name in fields: - if not skip_missing or field_name in self._fields: - key = _FIELD2ATTR[field_name] - if key != 'project_url': - data[key] = self[field_name] - else: - data[key] = [','.join(u) for u in self[field_name]] - - return data - - def add_requirements(self, requirements): - if self['Metadata-Version'] == '1.1': - # we can't have 1.1 metadata *and* Setuptools requires - for field in ('Obsoletes', 'Requires', 'Provides'): - if field in self: - del self[field] - self['Requires-Dist'] += requirements - - # Mapping API - # TODO could add iter* variants - - def keys(self): - return list(_version2fieldlist(self['Metadata-Version'])) - - def __iter__(self): - for key in self.keys(): - yield key - - def values(self): - return [self[key] for key in self.keys()] - - def items(self): - return [(key, self[key]) for key in self.keys()] - - def __repr__(self): - return '<%s %s %s>' % (self.__class__.__name__, self.name, - self.version) - - -METADATA_FILENAME = 'pydist.json' -WHEEL_METADATA_FILENAME = 'metadata.json' -LEGACY_METADATA_FILENAME = 'METADATA' - - -class Metadata(object): - """ - The metadata of a release. This implementation uses 2.1 - metadata where possible. If not possible, it wraps a LegacyMetadata - instance which handles the key-value metadata format. - """ - - METADATA_VERSION_MATCHER = re.compile(r'^\d+(\.\d+)*$') - - NAME_MATCHER = re.compile('^[0-9A-Z]([0-9A-Z_.-]*[0-9A-Z])?$', re.I) - - FIELDNAME_MATCHER = re.compile('^[A-Z]([0-9A-Z-]*[0-9A-Z])?$', re.I) - - VERSION_MATCHER = PEP440_VERSION_RE - - SUMMARY_MATCHER = re.compile('.{1,2047}') - - METADATA_VERSION = '2.0' - - GENERATOR = 'distlib (%s)' % __version__ - - MANDATORY_KEYS = { - 'name': (), - 'version': (), - 'summary': ('legacy',), - } - - INDEX_KEYS = ('name version license summary description author ' - 'author_email keywords platform home_page classifiers ' - 'download_url') - - DEPENDENCY_KEYS = ('extras run_requires test_requires build_requires ' - 'dev_requires provides meta_requires obsoleted_by ' - 'supports_environments') - - SYNTAX_VALIDATORS = { - 'metadata_version': (METADATA_VERSION_MATCHER, ()), - 'name': (NAME_MATCHER, ('legacy',)), - 'version': (VERSION_MATCHER, ('legacy',)), - 'summary': (SUMMARY_MATCHER, ('legacy',)), - 'dynamic': (FIELDNAME_MATCHER, ('legacy',)), - } - - __slots__ = ('_legacy', '_data', 'scheme') - - def __init__(self, path=None, fileobj=None, mapping=None, - scheme='default'): - if [path, fileobj, mapping].count(None) < 2: - raise TypeError('path, fileobj and mapping are exclusive') - self._legacy = None - self._data = None - self.scheme = scheme - #import pdb; pdb.set_trace() - if mapping is not None: - try: - self._validate_mapping(mapping, scheme) - self._data = mapping - except MetadataUnrecognizedVersionError: - self._legacy = LegacyMetadata(mapping=mapping, scheme=scheme) - self.validate() - else: - data = None - if path: - with open(path, 'rb') as f: - data = f.read() - elif fileobj: - data = fileobj.read() - if data is None: - # Initialised with no args - to be added - self._data = { - 'metadata_version': self.METADATA_VERSION, - 'generator': self.GENERATOR, - } - else: - if not isinstance(data, text_type): - data = data.decode('utf-8') - try: - self._data = json.loads(data) - self._validate_mapping(self._data, scheme) - except ValueError: - # Note: MetadataUnrecognizedVersionError does not - # inherit from ValueError (it's a DistlibException, - # which should not inherit from ValueError). - # The ValueError comes from the json.load - if that - # succeeds and we get a validation error, we want - # that to propagate - self._legacy = LegacyMetadata(fileobj=StringIO(data), - scheme=scheme) - self.validate() - - common_keys = set(('name', 'version', 'license', 'keywords', 'summary')) - - none_list = (None, list) - none_dict = (None, dict) - - mapped_keys = { - 'run_requires': ('Requires-Dist', list), - 'build_requires': ('Setup-Requires-Dist', list), - 'dev_requires': none_list, - 'test_requires': none_list, - 'meta_requires': none_list, - 'extras': ('Provides-Extra', list), - 'modules': none_list, - 'namespaces': none_list, - 'exports': none_dict, - 'commands': none_dict, - 'classifiers': ('Classifier', list), - 'source_url': ('Download-URL', None), - 'metadata_version': ('Metadata-Version', None), - } - - del none_list, none_dict - - def __getattribute__(self, key): - common = object.__getattribute__(self, 'common_keys') - mapped = object.__getattribute__(self, 'mapped_keys') - if key in mapped: - lk, maker = mapped[key] - if self._legacy: - if lk is None: - result = None if maker is None else maker() - else: - result = self._legacy.get(lk) - else: - value = None if maker is None else maker() - if key not in ('commands', 'exports', 'modules', 'namespaces', - 'classifiers'): - result = self._data.get(key, value) - else: - # special cases for PEP 459 - sentinel = object() - result = sentinel - d = self._data.get('extensions') - if d: - if key == 'commands': - result = d.get('python.commands', value) - elif key == 'classifiers': - d = d.get('python.details') - if d: - result = d.get(key, value) - else: - d = d.get('python.exports') - if not d: - d = self._data.get('python.exports') - if d: - result = d.get(key, value) - if result is sentinel: - result = value - elif key not in common: - result = object.__getattribute__(self, key) - elif self._legacy: - result = self._legacy.get(key) - else: - result = self._data.get(key) - return result - - def _validate_value(self, key, value, scheme=None): - if key in self.SYNTAX_VALIDATORS: - pattern, exclusions = self.SYNTAX_VALIDATORS[key] - if (scheme or self.scheme) not in exclusions: - m = pattern.match(value) - if not m: - raise MetadataInvalidError("'%s' is an invalid value for " - "the '%s' property" % (value, - key)) - - def __setattr__(self, key, value): - self._validate_value(key, value) - common = object.__getattribute__(self, 'common_keys') - mapped = object.__getattribute__(self, 'mapped_keys') - if key in mapped: - lk, _ = mapped[key] - if self._legacy: - if lk is None: - raise NotImplementedError - self._legacy[lk] = value - elif key not in ('commands', 'exports', 'modules', 'namespaces', - 'classifiers'): - self._data[key] = value - else: - # special cases for PEP 459 - d = self._data.setdefault('extensions', {}) - if key == 'commands': - d['python.commands'] = value - elif key == 'classifiers': - d = d.setdefault('python.details', {}) - d[key] = value - else: - d = d.setdefault('python.exports', {}) - d[key] = value - elif key not in common: - object.__setattr__(self, key, value) - else: - if key == 'keywords': - if isinstance(value, string_types): - value = value.strip() - if value: - value = value.split() - else: - value = [] - if self._legacy: - self._legacy[key] = value - else: - self._data[key] = value - - @property - def name_and_version(self): - return _get_name_and_version(self.name, self.version, True) - - @property - def provides(self): - if self._legacy: - result = self._legacy['Provides-Dist'] - else: - result = self._data.setdefault('provides', []) - s = '%s (%s)' % (self.name, self.version) - if s not in result: - result.append(s) - return result - - @provides.setter - def provides(self, value): - if self._legacy: - self._legacy['Provides-Dist'] = value - else: - self._data['provides'] = value - - def get_requirements(self, reqts, extras=None, env=None): - """ - Base method to get dependencies, given a set of extras - to satisfy and an optional environment context. - :param reqts: A list of sometimes-wanted dependencies, - perhaps dependent on extras and environment. - :param extras: A list of optional components being requested. - :param env: An optional environment for marker evaluation. - """ - if self._legacy: - result = reqts - else: - result = [] - extras = get_extras(extras or [], self.extras) - for d in reqts: - if 'extra' not in d and 'environment' not in d: - # unconditional - include = True - else: - if 'extra' not in d: - # Not extra-dependent - only environment-dependent - include = True - else: - include = d.get('extra') in extras - if include: - # Not excluded because of extras, check environment - marker = d.get('environment') - if marker: - include = interpret(marker, env) - if include: - result.extend(d['requires']) - for key in ('build', 'dev', 'test'): - e = ':%s:' % key - if e in extras: - extras.remove(e) - # A recursive call, but it should terminate since 'test' - # has been removed from the extras - reqts = self._data.get('%s_requires' % key, []) - result.extend(self.get_requirements(reqts, extras=extras, - env=env)) - return result - - @property - def dictionary(self): - if self._legacy: - return self._from_legacy() - return self._data - - @property - def dependencies(self): - if self._legacy: - raise NotImplementedError - else: - return extract_by_key(self._data, self.DEPENDENCY_KEYS) - - @dependencies.setter - def dependencies(self, value): - if self._legacy: - raise NotImplementedError - else: - self._data.update(value) - - def _validate_mapping(self, mapping, scheme): - if mapping.get('metadata_version') != self.METADATA_VERSION: - raise MetadataUnrecognizedVersionError() - missing = [] - for key, exclusions in self.MANDATORY_KEYS.items(): - if key not in mapping: - if scheme not in exclusions: - missing.append(key) - if missing: - msg = 'Missing metadata items: %s' % ', '.join(missing) - raise MetadataMissingError(msg) - for k, v in mapping.items(): - self._validate_value(k, v, scheme) - - def validate(self): - if self._legacy: - missing, warnings = self._legacy.check(True) - if missing or warnings: - logger.warning('Metadata: missing: %s, warnings: %s', - missing, warnings) - else: - self._validate_mapping(self._data, self.scheme) - - def todict(self): - if self._legacy: - return self._legacy.todict(True) - else: - result = extract_by_key(self._data, self.INDEX_KEYS) - return result - - def _from_legacy(self): - assert self._legacy and not self._data - result = { - 'metadata_version': self.METADATA_VERSION, - 'generator': self.GENERATOR, - } - lmd = self._legacy.todict(True) # skip missing ones - for k in ('name', 'version', 'license', 'summary', 'description', - 'classifier'): - if k in lmd: - if k == 'classifier': - nk = 'classifiers' - else: - nk = k - result[nk] = lmd[k] - kw = lmd.get('Keywords', []) - if kw == ['']: - kw = [] - result['keywords'] = kw - keys = (('requires_dist', 'run_requires'), - ('setup_requires_dist', 'build_requires')) - for ok, nk in keys: - if ok in lmd and lmd[ok]: - result[nk] = [{'requires': lmd[ok]}] - result['provides'] = self.provides - author = {} - maintainer = {} - return result - - LEGACY_MAPPING = { - 'name': 'Name', - 'version': 'Version', - ('extensions', 'python.details', 'license'): 'License', - 'summary': 'Summary', - 'description': 'Description', - ('extensions', 'python.project', 'project_urls', 'Home'): 'Home-page', - ('extensions', 'python.project', 'contacts', 0, 'name'): 'Author', - ('extensions', 'python.project', 'contacts', 0, 'email'): 'Author-email', - 'source_url': 'Download-URL', - ('extensions', 'python.details', 'classifiers'): 'Classifier', - } - - def _to_legacy(self): - def process_entries(entries): - reqts = set() - for e in entries: - extra = e.get('extra') - env = e.get('environment') - rlist = e['requires'] - for r in rlist: - if not env and not extra: - reqts.add(r) - else: - marker = '' - if extra: - marker = 'extra == "%s"' % extra - if env: - if marker: - marker = '(%s) and %s' % (env, marker) - else: - marker = env - reqts.add(';'.join((r, marker))) - return reqts - - assert self._data and not self._legacy - result = LegacyMetadata() - nmd = self._data - # import pdb; pdb.set_trace() - for nk, ok in self.LEGACY_MAPPING.items(): - if not isinstance(nk, tuple): - if nk in nmd: - result[ok] = nmd[nk] - else: - d = nmd - found = True - for k in nk: - try: - d = d[k] - except (KeyError, IndexError): - found = False - break - if found: - result[ok] = d - r1 = process_entries(self.run_requires + self.meta_requires) - r2 = process_entries(self.build_requires + self.dev_requires) - if self.extras: - result['Provides-Extra'] = sorted(self.extras) - result['Requires-Dist'] = sorted(r1) - result['Setup-Requires-Dist'] = sorted(r2) - # TODO: any other fields wanted - return result - - def write(self, path=None, fileobj=None, legacy=False, skip_unknown=True): - if [path, fileobj].count(None) != 1: - raise ValueError('Exactly one of path and fileobj is needed') - self.validate() - if legacy: - if self._legacy: - legacy_md = self._legacy - else: - legacy_md = self._to_legacy() - if path: - legacy_md.write(path, skip_unknown=skip_unknown) - else: - legacy_md.write_file(fileobj, skip_unknown=skip_unknown) - else: - if self._legacy: - d = self._from_legacy() - else: - d = self._data - if fileobj: - json.dump(d, fileobj, ensure_ascii=True, indent=2, - sort_keys=True) - else: - with codecs.open(path, 'w', 'utf-8') as f: - json.dump(d, f, ensure_ascii=True, indent=2, - sort_keys=True) - - def add_requirements(self, requirements): - if self._legacy: - self._legacy.add_requirements(requirements) - else: - run_requires = self._data.setdefault('run_requires', []) - always = None - for entry in run_requires: - if 'environment' not in entry and 'extra' not in entry: - always = entry - break - if always is None: - always = { 'requires': requirements } - run_requires.insert(0, always) - else: - rset = set(always['requires']) | set(requirements) - always['requires'] = sorted(rset) - - def __repr__(self): - name = self.name or '(no name)' - version = self.version or 'no version' - return '<%s %s %s (%s)>' % (self.__class__.__name__, - self.metadata_version, name, version) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/resources.py b/venv/lib/python3.12/site-packages/pip/_vendor/distlib/resources.py deleted file mode 100644 index fef52aa..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/resources.py +++ /dev/null @@ -1,358 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2013-2017 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -from __future__ import unicode_literals - -import bisect -import io -import logging -import os -import pkgutil -import sys -import types -import zipimport - -from . import DistlibException -from .util import cached_property, get_cache_base, Cache - -logger = logging.getLogger(__name__) - - -cache = None # created when needed - - -class ResourceCache(Cache): - def __init__(self, base=None): - if base is None: - # Use native string to avoid issues on 2.x: see Python #20140. - base = os.path.join(get_cache_base(), str('resource-cache')) - super(ResourceCache, self).__init__(base) - - def is_stale(self, resource, path): - """ - Is the cache stale for the given resource? - - :param resource: The :class:`Resource` being cached. - :param path: The path of the resource in the cache. - :return: True if the cache is stale. - """ - # Cache invalidation is a hard problem :-) - return True - - def get(self, resource): - """ - Get a resource into the cache, - - :param resource: A :class:`Resource` instance. - :return: The pathname of the resource in the cache. - """ - prefix, path = resource.finder.get_cache_info(resource) - if prefix is None: - result = path - else: - result = os.path.join(self.base, self.prefix_to_dir(prefix), path) - dirname = os.path.dirname(result) - if not os.path.isdir(dirname): - os.makedirs(dirname) - if not os.path.exists(result): - stale = True - else: - stale = self.is_stale(resource, path) - if stale: - # write the bytes of the resource to the cache location - with open(result, 'wb') as f: - f.write(resource.bytes) - return result - - -class ResourceBase(object): - def __init__(self, finder, name): - self.finder = finder - self.name = name - - -class Resource(ResourceBase): - """ - A class representing an in-package resource, such as a data file. This is - not normally instantiated by user code, but rather by a - :class:`ResourceFinder` which manages the resource. - """ - is_container = False # Backwards compatibility - - def as_stream(self): - """ - Get the resource as a stream. - - This is not a property to make it obvious that it returns a new stream - each time. - """ - return self.finder.get_stream(self) - - @cached_property - def file_path(self): - global cache - if cache is None: - cache = ResourceCache() - return cache.get(self) - - @cached_property - def bytes(self): - return self.finder.get_bytes(self) - - @cached_property - def size(self): - return self.finder.get_size(self) - - -class ResourceContainer(ResourceBase): - is_container = True # Backwards compatibility - - @cached_property - def resources(self): - return self.finder.get_resources(self) - - -class ResourceFinder(object): - """ - Resource finder for file system resources. - """ - - if sys.platform.startswith('java'): - skipped_extensions = ('.pyc', '.pyo', '.class') - else: - skipped_extensions = ('.pyc', '.pyo') - - def __init__(self, module): - self.module = module - self.loader = getattr(module, '__loader__', None) - self.base = os.path.dirname(getattr(module, '__file__', '')) - - def _adjust_path(self, path): - return os.path.realpath(path) - - def _make_path(self, resource_name): - # Issue #50: need to preserve type of path on Python 2.x - # like os.path._get_sep - if isinstance(resource_name, bytes): # should only happen on 2.x - sep = b'/' - else: - sep = '/' - parts = resource_name.split(sep) - parts.insert(0, self.base) - result = os.path.join(*parts) - return self._adjust_path(result) - - def _find(self, path): - return os.path.exists(path) - - def get_cache_info(self, resource): - return None, resource.path - - def find(self, resource_name): - path = self._make_path(resource_name) - if not self._find(path): - result = None - else: - if self._is_directory(path): - result = ResourceContainer(self, resource_name) - else: - result = Resource(self, resource_name) - result.path = path - return result - - def get_stream(self, resource): - return open(resource.path, 'rb') - - def get_bytes(self, resource): - with open(resource.path, 'rb') as f: - return f.read() - - def get_size(self, resource): - return os.path.getsize(resource.path) - - def get_resources(self, resource): - def allowed(f): - return (f != '__pycache__' and not - f.endswith(self.skipped_extensions)) - return set([f for f in os.listdir(resource.path) if allowed(f)]) - - def is_container(self, resource): - return self._is_directory(resource.path) - - _is_directory = staticmethod(os.path.isdir) - - def iterator(self, resource_name): - resource = self.find(resource_name) - if resource is not None: - todo = [resource] - while todo: - resource = todo.pop(0) - yield resource - if resource.is_container: - rname = resource.name - for name in resource.resources: - if not rname: - new_name = name - else: - new_name = '/'.join([rname, name]) - child = self.find(new_name) - if child.is_container: - todo.append(child) - else: - yield child - - -class ZipResourceFinder(ResourceFinder): - """ - Resource finder for resources in .zip files. - """ - def __init__(self, module): - super(ZipResourceFinder, self).__init__(module) - archive = self.loader.archive - self.prefix_len = 1 + len(archive) - # PyPy doesn't have a _files attr on zipimporter, and you can't set one - if hasattr(self.loader, '_files'): - self._files = self.loader._files - else: - self._files = zipimport._zip_directory_cache[archive] - self.index = sorted(self._files) - - def _adjust_path(self, path): - return path - - def _find(self, path): - path = path[self.prefix_len:] - if path in self._files: - result = True - else: - if path and path[-1] != os.sep: - path = path + os.sep - i = bisect.bisect(self.index, path) - try: - result = self.index[i].startswith(path) - except IndexError: - result = False - if not result: - logger.debug('_find failed: %r %r', path, self.loader.prefix) - else: - logger.debug('_find worked: %r %r', path, self.loader.prefix) - return result - - def get_cache_info(self, resource): - prefix = self.loader.archive - path = resource.path[1 + len(prefix):] - return prefix, path - - def get_bytes(self, resource): - return self.loader.get_data(resource.path) - - def get_stream(self, resource): - return io.BytesIO(self.get_bytes(resource)) - - def get_size(self, resource): - path = resource.path[self.prefix_len:] - return self._files[path][3] - - def get_resources(self, resource): - path = resource.path[self.prefix_len:] - if path and path[-1] != os.sep: - path += os.sep - plen = len(path) - result = set() - i = bisect.bisect(self.index, path) - while i < len(self.index): - if not self.index[i].startswith(path): - break - s = self.index[i][plen:] - result.add(s.split(os.sep, 1)[0]) # only immediate children - i += 1 - return result - - def _is_directory(self, path): - path = path[self.prefix_len:] - if path and path[-1] != os.sep: - path += os.sep - i = bisect.bisect(self.index, path) - try: - result = self.index[i].startswith(path) - except IndexError: - result = False - return result - - -_finder_registry = { - type(None): ResourceFinder, - zipimport.zipimporter: ZipResourceFinder -} - -try: - # In Python 3.6, _frozen_importlib -> _frozen_importlib_external - try: - import _frozen_importlib_external as _fi - except ImportError: - import _frozen_importlib as _fi - _finder_registry[_fi.SourceFileLoader] = ResourceFinder - _finder_registry[_fi.FileFinder] = ResourceFinder - # See issue #146 - _finder_registry[_fi.SourcelessFileLoader] = ResourceFinder - del _fi -except (ImportError, AttributeError): - pass - - -def register_finder(loader, finder_maker): - _finder_registry[type(loader)] = finder_maker - - -_finder_cache = {} - - -def finder(package): - """ - Return a resource finder for a package. - :param package: The name of the package. - :return: A :class:`ResourceFinder` instance for the package. - """ - if package in _finder_cache: - result = _finder_cache[package] - else: - if package not in sys.modules: - __import__(package) - module = sys.modules[package] - path = getattr(module, '__path__', None) - if path is None: - raise DistlibException('You cannot get a finder for a module, ' - 'only for a package') - loader = getattr(module, '__loader__', None) - finder_maker = _finder_registry.get(type(loader)) - if finder_maker is None: - raise DistlibException('Unable to locate finder for %r' % package) - result = finder_maker(module) - _finder_cache[package] = result - return result - - -_dummy_module = types.ModuleType(str('__dummy__')) - - -def finder_for_path(path): - """ - Return a resource finder for a path, which should represent a container. - - :param path: The path. - :return: A :class:`ResourceFinder` instance for the path. - """ - result = None - # calls any path hooks, gets importer into cache - pkgutil.get_importer(path) - loader = sys.path_importer_cache.get(path) - finder = _finder_registry.get(type(loader)) - if finder: - module = _dummy_module - module.__file__ = os.path.join(path, '') - module.__loader__ = loader - result = finder(module) - return result diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py b/venv/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py deleted file mode 100644 index cfa45d2..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py +++ /dev/null @@ -1,452 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2013-2023 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -from io import BytesIO -import logging -import os -import re -import struct -import sys -import time -from zipfile import ZipInfo - -from .compat import sysconfig, detect_encoding, ZipFile -from .resources import finder -from .util import (FileOperator, get_export_entry, convert_path, - get_executable, get_platform, in_venv) - -logger = logging.getLogger(__name__) - -_DEFAULT_MANIFEST = ''' -<?xml version="1.0" encoding="UTF-8" standalone="yes"?> -<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> - <assemblyIdentity version="1.0.0.0" - processorArchitecture="X86" - name="%s" - type="win32"/> - - <!-- Identify the application security requirements. --> - <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> - <security> - <requestedPrivileges> - <requestedExecutionLevel level="asInvoker" uiAccess="false"/> - </requestedPrivileges> - </security> - </trustInfo> -</assembly>'''.strip() - -# check if Python is called on the first line with this expression -FIRST_LINE_RE = re.compile(b'^#!.*pythonw?[0-9.]*([ \t].*)?$') -SCRIPT_TEMPLATE = r'''# -*- coding: utf-8 -*- -import re -import sys -from %(module)s import %(import_name)s -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(%(func)s()) -''' - - -def enquote_executable(executable): - if ' ' in executable: - # make sure we quote only the executable in case of env - # for example /usr/bin/env "/dir with spaces/bin/jython" - # instead of "/usr/bin/env /dir with spaces/bin/jython" - # otherwise whole - if executable.startswith('/usr/bin/env '): - env, _executable = executable.split(' ', 1) - if ' ' in _executable and not _executable.startswith('"'): - executable = '%s "%s"' % (env, _executable) - else: - if not executable.startswith('"'): - executable = '"%s"' % executable - return executable - - -# Keep the old name around (for now), as there is at least one project using it! -_enquote_executable = enquote_executable - - -class ScriptMaker(object): - """ - A class to copy or create scripts from source scripts or callable - specifications. - """ - script_template = SCRIPT_TEMPLATE - - executable = None # for shebangs - - def __init__(self, - source_dir, - target_dir, - add_launchers=True, - dry_run=False, - fileop=None): - self.source_dir = source_dir - self.target_dir = target_dir - self.add_launchers = add_launchers - self.force = False - self.clobber = False - # It only makes sense to set mode bits on POSIX. - self.set_mode = (os.name == 'posix') or (os.name == 'java' - and os._name == 'posix') - self.variants = set(('', 'X.Y')) - self._fileop = fileop or FileOperator(dry_run) - - self._is_nt = os.name == 'nt' or (os.name == 'java' - and os._name == 'nt') - self.version_info = sys.version_info - - def _get_alternate_executable(self, executable, options): - if options.get('gui', False) and self._is_nt: # pragma: no cover - dn, fn = os.path.split(executable) - fn = fn.replace('python', 'pythonw') - executable = os.path.join(dn, fn) - return executable - - if sys.platform.startswith('java'): # pragma: no cover - - def _is_shell(self, executable): - """ - Determine if the specified executable is a script - (contains a #! line) - """ - try: - with open(executable) as fp: - return fp.read(2) == '#!' - except (OSError, IOError): - logger.warning('Failed to open %s', executable) - return False - - def _fix_jython_executable(self, executable): - if self._is_shell(executable): - # Workaround for Jython is not needed on Linux systems. - import java - - if java.lang.System.getProperty('os.name') == 'Linux': - return executable - elif executable.lower().endswith('jython.exe'): - # Use wrapper exe for Jython on Windows - return executable - return '/usr/bin/env %s' % executable - - def _build_shebang(self, executable, post_interp): - """ - Build a shebang line. In the simple case (on Windows, or a shebang line - which is not too long or contains spaces) use a simple formulation for - the shebang. Otherwise, use /bin/sh as the executable, with a contrived - shebang which allows the script to run either under Python or sh, using - suitable quoting. Thanks to Harald Nordgren for his input. - - See also: http://www.in-ulm.de/~mascheck/various/shebang/#length - https://hg.mozilla.org/mozilla-central/file/tip/mach - """ - if os.name != 'posix': - simple_shebang = True - else: - # Add 3 for '#!' prefix and newline suffix. - shebang_length = len(executable) + len(post_interp) + 3 - if sys.platform == 'darwin': - max_shebang_length = 512 - else: - max_shebang_length = 127 - simple_shebang = ((b' ' not in executable) - and (shebang_length <= max_shebang_length)) - - if simple_shebang: - result = b'#!' + executable + post_interp + b'\n' - else: - result = b'#!/bin/sh\n' - result += b"'''exec' " + executable + post_interp + b' "$0" "$@"\n' - result += b"' '''" - return result - - def _get_shebang(self, encoding, post_interp=b'', options=None): - enquote = True - if self.executable: - executable = self.executable - enquote = False # assume this will be taken care of - elif not sysconfig.is_python_build(): - executable = get_executable() - elif in_venv(): # pragma: no cover - executable = os.path.join( - sysconfig.get_path('scripts'), - 'python%s' % sysconfig.get_config_var('EXE')) - else: # pragma: no cover - if os.name == 'nt': - # for Python builds from source on Windows, no Python executables with - # a version suffix are created, so we use python.exe - executable = os.path.join( - sysconfig.get_config_var('BINDIR'), - 'python%s' % (sysconfig.get_config_var('EXE'))) - else: - executable = os.path.join( - sysconfig.get_config_var('BINDIR'), - 'python%s%s' % (sysconfig.get_config_var('VERSION'), - sysconfig.get_config_var('EXE'))) - if options: - executable = self._get_alternate_executable(executable, options) - - if sys.platform.startswith('java'): # pragma: no cover - executable = self._fix_jython_executable(executable) - - # Normalise case for Windows - COMMENTED OUT - # executable = os.path.normcase(executable) - # N.B. The normalising operation above has been commented out: See - # issue #124. Although paths in Windows are generally case-insensitive, - # they aren't always. For example, a path containing a ẞ (which is a - # LATIN CAPITAL LETTER SHARP S - U+1E9E) is normcased to ß (which is a - # LATIN SMALL LETTER SHARP S' - U+00DF). The two are not considered by - # Windows as equivalent in path names. - - # If the user didn't specify an executable, it may be necessary to - # cater for executable paths with spaces (not uncommon on Windows) - if enquote: - executable = enquote_executable(executable) - # Issue #51: don't use fsencode, since we later try to - # check that the shebang is decodable using utf-8. - executable = executable.encode('utf-8') - # in case of IronPython, play safe and enable frames support - if (sys.platform == 'cli' and '-X:Frames' not in post_interp - and '-X:FullFrames' not in post_interp): # pragma: no cover - post_interp += b' -X:Frames' - shebang = self._build_shebang(executable, post_interp) - # Python parser starts to read a script using UTF-8 until - # it gets a #coding:xxx cookie. The shebang has to be the - # first line of a file, the #coding:xxx cookie cannot be - # written before. So the shebang has to be decodable from - # UTF-8. - try: - shebang.decode('utf-8') - except UnicodeDecodeError: # pragma: no cover - raise ValueError('The shebang (%r) is not decodable from utf-8' % - shebang) - # If the script is encoded to a custom encoding (use a - # #coding:xxx cookie), the shebang has to be decodable from - # the script encoding too. - if encoding != 'utf-8': - try: - shebang.decode(encoding) - except UnicodeDecodeError: # pragma: no cover - raise ValueError('The shebang (%r) is not decodable ' - 'from the script encoding (%r)' % - (shebang, encoding)) - return shebang - - def _get_script_text(self, entry): - return self.script_template % dict( - module=entry.prefix, - import_name=entry.suffix.split('.')[0], - func=entry.suffix) - - manifest = _DEFAULT_MANIFEST - - def get_manifest(self, exename): - base = os.path.basename(exename) - return self.manifest % base - - def _write_script(self, names, shebang, script_bytes, filenames, ext): - use_launcher = self.add_launchers and self._is_nt - linesep = os.linesep.encode('utf-8') - if not shebang.endswith(linesep): - shebang += linesep - if not use_launcher: - script_bytes = shebang + script_bytes - else: # pragma: no cover - if ext == 'py': - launcher = self._get_launcher('t') - else: - launcher = self._get_launcher('w') - stream = BytesIO() - with ZipFile(stream, 'w') as zf: - source_date_epoch = os.environ.get('SOURCE_DATE_EPOCH') - if source_date_epoch: - date_time = time.gmtime(int(source_date_epoch))[:6] - zinfo = ZipInfo(filename='__main__.py', - date_time=date_time) - zf.writestr(zinfo, script_bytes) - else: - zf.writestr('__main__.py', script_bytes) - zip_data = stream.getvalue() - script_bytes = launcher + shebang + zip_data - for name in names: - outname = os.path.join(self.target_dir, name) - if use_launcher: # pragma: no cover - n, e = os.path.splitext(outname) - if e.startswith('.py'): - outname = n - outname = '%s.exe' % outname - try: - self._fileop.write_binary_file(outname, script_bytes) - except Exception: - # Failed writing an executable - it might be in use. - logger.warning('Failed to write executable - trying to ' - 'use .deleteme logic') - dfname = '%s.deleteme' % outname - if os.path.exists(dfname): - os.remove(dfname) # Not allowed to fail here - os.rename(outname, dfname) # nor here - self._fileop.write_binary_file(outname, script_bytes) - logger.debug('Able to replace executable using ' - '.deleteme logic') - try: - os.remove(dfname) - except Exception: - pass # still in use - ignore error - else: - if self._is_nt and not outname.endswith( - '.' + ext): # pragma: no cover - outname = '%s.%s' % (outname, ext) - if os.path.exists(outname) and not self.clobber: - logger.warning('Skipping existing file %s', outname) - continue - self._fileop.write_binary_file(outname, script_bytes) - if self.set_mode: - self._fileop.set_executable_mode([outname]) - filenames.append(outname) - - variant_separator = '-' - - def get_script_filenames(self, name): - result = set() - if '' in self.variants: - result.add(name) - if 'X' in self.variants: - result.add('%s%s' % (name, self.version_info[0])) - if 'X.Y' in self.variants: - result.add('%s%s%s.%s' % - (name, self.variant_separator, self.version_info[0], - self.version_info[1])) - return result - - def _make_script(self, entry, filenames, options=None): - post_interp = b'' - if options: - args = options.get('interpreter_args', []) - if args: - args = ' %s' % ' '.join(args) - post_interp = args.encode('utf-8') - shebang = self._get_shebang('utf-8', post_interp, options=options) - script = self._get_script_text(entry).encode('utf-8') - scriptnames = self.get_script_filenames(entry.name) - if options and options.get('gui', False): - ext = 'pyw' - else: - ext = 'py' - self._write_script(scriptnames, shebang, script, filenames, ext) - - def _copy_script(self, script, filenames): - adjust = False - script = os.path.join(self.source_dir, convert_path(script)) - outname = os.path.join(self.target_dir, os.path.basename(script)) - if not self.force and not self._fileop.newer(script, outname): - logger.debug('not copying %s (up-to-date)', script) - return - - # Always open the file, but ignore failures in dry-run mode -- - # that way, we'll get accurate feedback if we can read the - # script. - try: - f = open(script, 'rb') - except IOError: # pragma: no cover - if not self.dry_run: - raise - f = None - else: - first_line = f.readline() - if not first_line: # pragma: no cover - logger.warning('%s is an empty file (skipping)', script) - return - - match = FIRST_LINE_RE.match(first_line.replace(b'\r\n', b'\n')) - if match: - adjust = True - post_interp = match.group(1) or b'' - - if not adjust: - if f: - f.close() - self._fileop.copy_file(script, outname) - if self.set_mode: - self._fileop.set_executable_mode([outname]) - filenames.append(outname) - else: - logger.info('copying and adjusting %s -> %s', script, - self.target_dir) - if not self._fileop.dry_run: - encoding, lines = detect_encoding(f.readline) - f.seek(0) - shebang = self._get_shebang(encoding, post_interp) - if b'pythonw' in first_line: # pragma: no cover - ext = 'pyw' - else: - ext = 'py' - n = os.path.basename(outname) - self._write_script([n], shebang, f.read(), filenames, ext) - if f: - f.close() - - @property - def dry_run(self): - return self._fileop.dry_run - - @dry_run.setter - def dry_run(self, value): - self._fileop.dry_run = value - - if os.name == 'nt' or (os.name == 'java' - and os._name == 'nt'): # pragma: no cover - # Executable launcher support. - # Launchers are from https://bitbucket.org/vinay.sajip/simple_launcher/ - - def _get_launcher(self, kind): - if struct.calcsize('P') == 8: # 64-bit - bits = '64' - else: - bits = '32' - platform_suffix = '-arm' if get_platform() == 'win-arm64' else '' - name = '%s%s%s.exe' % (kind, bits, platform_suffix) - # Issue 31: don't hardcode an absolute package name, but - # determine it relative to the current package - distlib_package = __name__.rsplit('.', 1)[0] - resource = finder(distlib_package).find(name) - if not resource: - msg = ('Unable to find resource %s in package %s' % - (name, distlib_package)) - raise ValueError(msg) - return resource.bytes - - # Public API follows - - def make(self, specification, options=None): - """ - Make a script. - - :param specification: The specification, which is either a valid export - entry specification (to make a script from a - callable) or a filename (to make a script by - copying from a source location). - :param options: A dictionary of options controlling script generation. - :return: A list of all absolute pathnames written to. - """ - filenames = [] - entry = get_export_entry(specification) - if entry is None: - self._copy_script(specification, filenames) - else: - self._make_script(entry, filenames, options=options) - return filenames - - def make_multiple(self, specifications, options=None): - """ - Take a list of specifications and make scripts from them, - :param specifications: A list of specifications. - :return: A list of all absolute pathnames written to, - """ - filenames = [] - for specification in specifications: - filenames.extend(self.make(specification, options)) - return filenames diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py b/venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py deleted file mode 100644 index ba58858..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py +++ /dev/null @@ -1,2025 +0,0 @@ -# -# Copyright (C) 2012-2023 The Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -import codecs -from collections import deque -import contextlib -import csv -from glob import iglob as std_iglob -import io -import json -import logging -import os -import py_compile -import re -import socket -try: - import ssl -except ImportError: # pragma: no cover - ssl = None -import subprocess -import sys -import tarfile -import tempfile -import textwrap - -try: - import threading -except ImportError: # pragma: no cover - import dummy_threading as threading -import time - -from . import DistlibException -from .compat import (string_types, text_type, shutil, raw_input, StringIO, - cache_from_source, urlopen, urljoin, httplib, xmlrpclib, - HTTPHandler, BaseConfigurator, valid_ident, - Container, configparser, URLError, ZipFile, fsdecode, - unquote, urlparse) - -logger = logging.getLogger(__name__) - -# -# Requirement parsing code as per PEP 508 -# - -IDENTIFIER = re.compile(r'^([\w\.-]+)\s*') -VERSION_IDENTIFIER = re.compile(r'^([\w\.*+-]+)\s*') -COMPARE_OP = re.compile(r'^(<=?|>=?|={2,3}|[~!]=)\s*') -MARKER_OP = re.compile(r'^((<=?)|(>=?)|={2,3}|[~!]=|in|not\s+in)\s*') -OR = re.compile(r'^or\b\s*') -AND = re.compile(r'^and\b\s*') -NON_SPACE = re.compile(r'(\S+)\s*') -STRING_CHUNK = re.compile(r'([\s\w\.{}()*+#:;,/?!~`@$%^&=|<>\[\]-]+)') - - -def parse_marker(marker_string): - """ - Parse a marker string and return a dictionary containing a marker expression. - - The dictionary will contain keys "op", "lhs" and "rhs" for non-terminals in - the expression grammar, or strings. A string contained in quotes is to be - interpreted as a literal string, and a string not contained in quotes is a - variable (such as os_name). - """ - - def marker_var(remaining): - # either identifier, or literal string - m = IDENTIFIER.match(remaining) - if m: - result = m.groups()[0] - remaining = remaining[m.end():] - elif not remaining: - raise SyntaxError('unexpected end of input') - else: - q = remaining[0] - if q not in '\'"': - raise SyntaxError('invalid expression: %s' % remaining) - oq = '\'"'.replace(q, '') - remaining = remaining[1:] - parts = [q] - while remaining: - # either a string chunk, or oq, or q to terminate - if remaining[0] == q: - break - elif remaining[0] == oq: - parts.append(oq) - remaining = remaining[1:] - else: - m = STRING_CHUNK.match(remaining) - if not m: - raise SyntaxError('error in string literal: %s' % - remaining) - parts.append(m.groups()[0]) - remaining = remaining[m.end():] - else: - s = ''.join(parts) - raise SyntaxError('unterminated string: %s' % s) - parts.append(q) - result = ''.join(parts) - remaining = remaining[1:].lstrip() # skip past closing quote - return result, remaining - - def marker_expr(remaining): - if remaining and remaining[0] == '(': - result, remaining = marker(remaining[1:].lstrip()) - if remaining[0] != ')': - raise SyntaxError('unterminated parenthesis: %s' % remaining) - remaining = remaining[1:].lstrip() - else: - lhs, remaining = marker_var(remaining) - while remaining: - m = MARKER_OP.match(remaining) - if not m: - break - op = m.groups()[0] - remaining = remaining[m.end():] - rhs, remaining = marker_var(remaining) - lhs = {'op': op, 'lhs': lhs, 'rhs': rhs} - result = lhs - return result, remaining - - def marker_and(remaining): - lhs, remaining = marker_expr(remaining) - while remaining: - m = AND.match(remaining) - if not m: - break - remaining = remaining[m.end():] - rhs, remaining = marker_expr(remaining) - lhs = {'op': 'and', 'lhs': lhs, 'rhs': rhs} - return lhs, remaining - - def marker(remaining): - lhs, remaining = marker_and(remaining) - while remaining: - m = OR.match(remaining) - if not m: - break - remaining = remaining[m.end():] - rhs, remaining = marker_and(remaining) - lhs = {'op': 'or', 'lhs': lhs, 'rhs': rhs} - return lhs, remaining - - return marker(marker_string) - - -def parse_requirement(req): - """ - Parse a requirement passed in as a string. Return a Container - whose attributes contain the various parts of the requirement. - """ - remaining = req.strip() - if not remaining or remaining.startswith('#'): - return None - m = IDENTIFIER.match(remaining) - if not m: - raise SyntaxError('name expected: %s' % remaining) - distname = m.groups()[0] - remaining = remaining[m.end():] - extras = mark_expr = versions = uri = None - if remaining and remaining[0] == '[': - i = remaining.find(']', 1) - if i < 0: - raise SyntaxError('unterminated extra: %s' % remaining) - s = remaining[1:i] - remaining = remaining[i + 1:].lstrip() - extras = [] - while s: - m = IDENTIFIER.match(s) - if not m: - raise SyntaxError('malformed extra: %s' % s) - extras.append(m.groups()[0]) - s = s[m.end():] - if not s: - break - if s[0] != ',': - raise SyntaxError('comma expected in extras: %s' % s) - s = s[1:].lstrip() - if not extras: - extras = None - if remaining: - if remaining[0] == '@': - # it's a URI - remaining = remaining[1:].lstrip() - m = NON_SPACE.match(remaining) - if not m: - raise SyntaxError('invalid URI: %s' % remaining) - uri = m.groups()[0] - t = urlparse(uri) - # there are issues with Python and URL parsing, so this test - # is a bit crude. See bpo-20271, bpo-23505. Python doesn't - # always parse invalid URLs correctly - it should raise - # exceptions for malformed URLs - if not (t.scheme and t.netloc): - raise SyntaxError('Invalid URL: %s' % uri) - remaining = remaining[m.end():].lstrip() - else: - - def get_versions(ver_remaining): - """ - Return a list of operator, version tuples if any are - specified, else None. - """ - m = COMPARE_OP.match(ver_remaining) - versions = None - if m: - versions = [] - while True: - op = m.groups()[0] - ver_remaining = ver_remaining[m.end():] - m = VERSION_IDENTIFIER.match(ver_remaining) - if not m: - raise SyntaxError('invalid version: %s' % - ver_remaining) - v = m.groups()[0] - versions.append((op, v)) - ver_remaining = ver_remaining[m.end():] - if not ver_remaining or ver_remaining[0] != ',': - break - ver_remaining = ver_remaining[1:].lstrip() - # Some packages have a trailing comma which would break things - # See issue #148 - if not ver_remaining: - break - m = COMPARE_OP.match(ver_remaining) - if not m: - raise SyntaxError('invalid constraint: %s' % - ver_remaining) - if not versions: - versions = None - return versions, ver_remaining - - if remaining[0] != '(': - versions, remaining = get_versions(remaining) - else: - i = remaining.find(')', 1) - if i < 0: - raise SyntaxError('unterminated parenthesis: %s' % - remaining) - s = remaining[1:i] - remaining = remaining[i + 1:].lstrip() - # As a special diversion from PEP 508, allow a version number - # a.b.c in parentheses as a synonym for ~= a.b.c (because this - # is allowed in earlier PEPs) - if COMPARE_OP.match(s): - versions, _ = get_versions(s) - else: - m = VERSION_IDENTIFIER.match(s) - if not m: - raise SyntaxError('invalid constraint: %s' % s) - v = m.groups()[0] - s = s[m.end():].lstrip() - if s: - raise SyntaxError('invalid constraint: %s' % s) - versions = [('~=', v)] - - if remaining: - if remaining[0] != ';': - raise SyntaxError('invalid requirement: %s' % remaining) - remaining = remaining[1:].lstrip() - - mark_expr, remaining = parse_marker(remaining) - - if remaining and remaining[0] != '#': - raise SyntaxError('unexpected trailing data: %s' % remaining) - - if not versions: - rs = distname - else: - rs = '%s %s' % (distname, ', '.join( - ['%s %s' % con for con in versions])) - return Container(name=distname, - extras=extras, - constraints=versions, - marker=mark_expr, - url=uri, - requirement=rs) - - -def get_resources_dests(resources_root, rules): - """Find destinations for resources files""" - - def get_rel_path(root, path): - # normalizes and returns a lstripped-/-separated path - root = root.replace(os.path.sep, '/') - path = path.replace(os.path.sep, '/') - assert path.startswith(root) - return path[len(root):].lstrip('/') - - destinations = {} - for base, suffix, dest in rules: - prefix = os.path.join(resources_root, base) - for abs_base in iglob(prefix): - abs_glob = os.path.join(abs_base, suffix) - for abs_path in iglob(abs_glob): - resource_file = get_rel_path(resources_root, abs_path) - if dest is None: # remove the entry if it was here - destinations.pop(resource_file, None) - else: - rel_path = get_rel_path(abs_base, abs_path) - rel_dest = dest.replace(os.path.sep, '/').rstrip('/') - destinations[resource_file] = rel_dest + '/' + rel_path - return destinations - - -def in_venv(): - if hasattr(sys, 'real_prefix'): - # virtualenv venvs - result = True - else: - # PEP 405 venvs - result = sys.prefix != getattr(sys, 'base_prefix', sys.prefix) - return result - - -def get_executable(): - # The __PYVENV_LAUNCHER__ dance is apparently no longer needed, as - # changes to the stub launcher mean that sys.executable always points - # to the stub on OS X - # if sys.platform == 'darwin' and ('__PYVENV_LAUNCHER__' - # in os.environ): - # result = os.environ['__PYVENV_LAUNCHER__'] - # else: - # result = sys.executable - # return result - # Avoid normcasing: see issue #143 - # result = os.path.normcase(sys.executable) - result = sys.executable - if not isinstance(result, text_type): - result = fsdecode(result) - return result - - -def proceed(prompt, allowed_chars, error_prompt=None, default=None): - p = prompt - while True: - s = raw_input(p) - p = prompt - if not s and default: - s = default - if s: - c = s[0].lower() - if c in allowed_chars: - break - if error_prompt: - p = '%c: %s\n%s' % (c, error_prompt, prompt) - return c - - -def extract_by_key(d, keys): - if isinstance(keys, string_types): - keys = keys.split() - result = {} - for key in keys: - if key in d: - result[key] = d[key] - return result - - -def read_exports(stream): - if sys.version_info[0] >= 3: - # needs to be a text stream - stream = codecs.getreader('utf-8')(stream) - # Try to load as JSON, falling back on legacy format - data = stream.read() - stream = StringIO(data) - try: - jdata = json.load(stream) - result = jdata['extensions']['python.exports']['exports'] - for group, entries in result.items(): - for k, v in entries.items(): - s = '%s = %s' % (k, v) - entry = get_export_entry(s) - assert entry is not None - entries[k] = entry - return result - except Exception: - stream.seek(0, 0) - - def read_stream(cp, stream): - if hasattr(cp, 'read_file'): - cp.read_file(stream) - else: - cp.readfp(stream) - - cp = configparser.ConfigParser() - try: - read_stream(cp, stream) - except configparser.MissingSectionHeaderError: - stream.close() - data = textwrap.dedent(data) - stream = StringIO(data) - read_stream(cp, stream) - - result = {} - for key in cp.sections(): - result[key] = entries = {} - for name, value in cp.items(key): - s = '%s = %s' % (name, value) - entry = get_export_entry(s) - assert entry is not None - # entry.dist = self - entries[name] = entry - return result - - -def write_exports(exports, stream): - if sys.version_info[0] >= 3: - # needs to be a text stream - stream = codecs.getwriter('utf-8')(stream) - cp = configparser.ConfigParser() - for k, v in exports.items(): - # TODO check k, v for valid values - cp.add_section(k) - for entry in v.values(): - if entry.suffix is None: - s = entry.prefix - else: - s = '%s:%s' % (entry.prefix, entry.suffix) - if entry.flags: - s = '%s [%s]' % (s, ', '.join(entry.flags)) - cp.set(k, entry.name, s) - cp.write(stream) - - -@contextlib.contextmanager -def tempdir(): - td = tempfile.mkdtemp() - try: - yield td - finally: - shutil.rmtree(td) - - -@contextlib.contextmanager -def chdir(d): - cwd = os.getcwd() - try: - os.chdir(d) - yield - finally: - os.chdir(cwd) - - -@contextlib.contextmanager -def socket_timeout(seconds=15): - cto = socket.getdefaulttimeout() - try: - socket.setdefaulttimeout(seconds) - yield - finally: - socket.setdefaulttimeout(cto) - - -class cached_property(object): - - def __init__(self, func): - self.func = func - # for attr in ('__name__', '__module__', '__doc__'): - # setattr(self, attr, getattr(func, attr, None)) - - def __get__(self, obj, cls=None): - if obj is None: - return self - value = self.func(obj) - object.__setattr__(obj, self.func.__name__, value) - # obj.__dict__[self.func.__name__] = value = self.func(obj) - return value - - -def convert_path(pathname): - """Return 'pathname' as a name that will work on the native filesystem. - - The path is split on '/' and put back together again using the current - directory separator. Needed because filenames in the setup script are - always supplied in Unix style, and have to be converted to the local - convention before we can actually use them in the filesystem. Raises - ValueError on non-Unix-ish systems if 'pathname' either starts or - ends with a slash. - """ - if os.sep == '/': - return pathname - if not pathname: - return pathname - if pathname[0] == '/': - raise ValueError("path '%s' cannot be absolute" % pathname) - if pathname[-1] == '/': - raise ValueError("path '%s' cannot end with '/'" % pathname) - - paths = pathname.split('/') - while os.curdir in paths: - paths.remove(os.curdir) - if not paths: - return os.curdir - return os.path.join(*paths) - - -class FileOperator(object): - - def __init__(self, dry_run=False): - self.dry_run = dry_run - self.ensured = set() - self._init_record() - - def _init_record(self): - self.record = False - self.files_written = set() - self.dirs_created = set() - - def record_as_written(self, path): - if self.record: - self.files_written.add(path) - - def newer(self, source, target): - """Tell if the target is newer than the source. - - Returns true if 'source' exists and is more recently modified than - 'target', or if 'source' exists and 'target' doesn't. - - Returns false if both exist and 'target' is the same age or younger - than 'source'. Raise PackagingFileError if 'source' does not exist. - - Note that this test is not very accurate: files created in the same - second will have the same "age". - """ - if not os.path.exists(source): - raise DistlibException("file '%r' does not exist" % - os.path.abspath(source)) - if not os.path.exists(target): - return True - - return os.stat(source).st_mtime > os.stat(target).st_mtime - - def copy_file(self, infile, outfile, check=True): - """Copy a file respecting dry-run and force flags. - """ - self.ensure_dir(os.path.dirname(outfile)) - logger.info('Copying %s to %s', infile, outfile) - if not self.dry_run: - msg = None - if check: - if os.path.islink(outfile): - msg = '%s is a symlink' % outfile - elif os.path.exists(outfile) and not os.path.isfile(outfile): - msg = '%s is a non-regular file' % outfile - if msg: - raise ValueError(msg + ' which would be overwritten') - shutil.copyfile(infile, outfile) - self.record_as_written(outfile) - - def copy_stream(self, instream, outfile, encoding=None): - assert not os.path.isdir(outfile) - self.ensure_dir(os.path.dirname(outfile)) - logger.info('Copying stream %s to %s', instream, outfile) - if not self.dry_run: - if encoding is None: - outstream = open(outfile, 'wb') - else: - outstream = codecs.open(outfile, 'w', encoding=encoding) - try: - shutil.copyfileobj(instream, outstream) - finally: - outstream.close() - self.record_as_written(outfile) - - def write_binary_file(self, path, data): - self.ensure_dir(os.path.dirname(path)) - if not self.dry_run: - if os.path.exists(path): - os.remove(path) - with open(path, 'wb') as f: - f.write(data) - self.record_as_written(path) - - def write_text_file(self, path, data, encoding): - self.write_binary_file(path, data.encode(encoding)) - - def set_mode(self, bits, mask, files): - if os.name == 'posix' or (os.name == 'java' and os._name == 'posix'): - # Set the executable bits (owner, group, and world) on - # all the files specified. - for f in files: - if self.dry_run: - logger.info("changing mode of %s", f) - else: - mode = (os.stat(f).st_mode | bits) & mask - logger.info("changing mode of %s to %o", f, mode) - os.chmod(f, mode) - - set_executable_mode = lambda s, f: s.set_mode(0o555, 0o7777, f) - - def ensure_dir(self, path): - path = os.path.abspath(path) - if path not in self.ensured and not os.path.exists(path): - self.ensured.add(path) - d, f = os.path.split(path) - self.ensure_dir(d) - logger.info('Creating %s' % path) - if not self.dry_run: - os.mkdir(path) - if self.record: - self.dirs_created.add(path) - - def byte_compile(self, - path, - optimize=False, - force=False, - prefix=None, - hashed_invalidation=False): - dpath = cache_from_source(path, not optimize) - logger.info('Byte-compiling %s to %s', path, dpath) - if not self.dry_run: - if force or self.newer(path, dpath): - if not prefix: - diagpath = None - else: - assert path.startswith(prefix) - diagpath = path[len(prefix):] - compile_kwargs = {} - if hashed_invalidation and hasattr(py_compile, - 'PycInvalidationMode'): - compile_kwargs[ - 'invalidation_mode'] = py_compile.PycInvalidationMode.CHECKED_HASH - py_compile.compile(path, dpath, diagpath, True, - **compile_kwargs) # raise error - self.record_as_written(dpath) - return dpath - - def ensure_removed(self, path): - if os.path.exists(path): - if os.path.isdir(path) and not os.path.islink(path): - logger.debug('Removing directory tree at %s', path) - if not self.dry_run: - shutil.rmtree(path) - if self.record: - if path in self.dirs_created: - self.dirs_created.remove(path) - else: - if os.path.islink(path): - s = 'link' - else: - s = 'file' - logger.debug('Removing %s %s', s, path) - if not self.dry_run: - os.remove(path) - if self.record: - if path in self.files_written: - self.files_written.remove(path) - - def is_writable(self, path): - result = False - while not result: - if os.path.exists(path): - result = os.access(path, os.W_OK) - break - parent = os.path.dirname(path) - if parent == path: - break - path = parent - return result - - def commit(self): - """ - Commit recorded changes, turn off recording, return - changes. - """ - assert self.record - result = self.files_written, self.dirs_created - self._init_record() - return result - - def rollback(self): - if not self.dry_run: - for f in list(self.files_written): - if os.path.exists(f): - os.remove(f) - # dirs should all be empty now, except perhaps for - # __pycache__ subdirs - # reverse so that subdirs appear before their parents - dirs = sorted(self.dirs_created, reverse=True) - for d in dirs: - flist = os.listdir(d) - if flist: - assert flist == ['__pycache__'] - sd = os.path.join(d, flist[0]) - os.rmdir(sd) - os.rmdir(d) # should fail if non-empty - self._init_record() - - -def resolve(module_name, dotted_path): - if module_name in sys.modules: - mod = sys.modules[module_name] - else: - mod = __import__(module_name) - if dotted_path is None: - result = mod - else: - parts = dotted_path.split('.') - result = getattr(mod, parts.pop(0)) - for p in parts: - result = getattr(result, p) - return result - - -class ExportEntry(object): - - def __init__(self, name, prefix, suffix, flags): - self.name = name - self.prefix = prefix - self.suffix = suffix - self.flags = flags - - @cached_property - def value(self): - return resolve(self.prefix, self.suffix) - - def __repr__(self): # pragma: no cover - return '<ExportEntry %s = %s:%s %s>' % (self.name, self.prefix, - self.suffix, self.flags) - - def __eq__(self, other): - if not isinstance(other, ExportEntry): - result = False - else: - result = (self.name == other.name and self.prefix == other.prefix - and self.suffix == other.suffix - and self.flags == other.flags) - return result - - __hash__ = object.__hash__ - - -ENTRY_RE = re.compile( - r'''(?P<name>([^\[]\S*)) - \s*=\s*(?P<callable>(\w+)([:\.]\w+)*) - \s*(\[\s*(?P<flags>[\w-]+(=\w+)?(,\s*\w+(=\w+)?)*)\s*\])? - ''', re.VERBOSE) - - -def get_export_entry(specification): - m = ENTRY_RE.search(specification) - if not m: - result = None - if '[' in specification or ']' in specification: - raise DistlibException("Invalid specification " - "'%s'" % specification) - else: - d = m.groupdict() - name = d['name'] - path = d['callable'] - colons = path.count(':') - if colons == 0: - prefix, suffix = path, None - else: - if colons != 1: - raise DistlibException("Invalid specification " - "'%s'" % specification) - prefix, suffix = path.split(':') - flags = d['flags'] - if flags is None: - if '[' in specification or ']' in specification: - raise DistlibException("Invalid specification " - "'%s'" % specification) - flags = [] - else: - flags = [f.strip() for f in flags.split(',')] - result = ExportEntry(name, prefix, suffix, flags) - return result - - -def get_cache_base(suffix=None): - """ - Return the default base location for distlib caches. If the directory does - not exist, it is created. Use the suffix provided for the base directory, - and default to '.distlib' if it isn't provided. - - On Windows, if LOCALAPPDATA is defined in the environment, then it is - assumed to be a directory, and will be the parent directory of the result. - On POSIX, and on Windows if LOCALAPPDATA is not defined, the user's home - directory - using os.expanduser('~') - will be the parent directory of - the result. - - The result is just the directory '.distlib' in the parent directory as - determined above, or with the name specified with ``suffix``. - """ - if suffix is None: - suffix = '.distlib' - if os.name == 'nt' and 'LOCALAPPDATA' in os.environ: - result = os.path.expandvars('$localappdata') - else: - # Assume posix, or old Windows - result = os.path.expanduser('~') - # we use 'isdir' instead of 'exists', because we want to - # fail if there's a file with that name - if os.path.isdir(result): - usable = os.access(result, os.W_OK) - if not usable: - logger.warning('Directory exists but is not writable: %s', result) - else: - try: - os.makedirs(result) - usable = True - except OSError: - logger.warning('Unable to create %s', result, exc_info=True) - usable = False - if not usable: - result = tempfile.mkdtemp() - logger.warning('Default location unusable, using %s', result) - return os.path.join(result, suffix) - - -def path_to_cache_dir(path): - """ - Convert an absolute path to a directory name for use in a cache. - - The algorithm used is: - - #. On Windows, any ``':'`` in the drive is replaced with ``'---'``. - #. Any occurrence of ``os.sep`` is replaced with ``'--'``. - #. ``'.cache'`` is appended. - """ - d, p = os.path.splitdrive(os.path.abspath(path)) - if d: - d = d.replace(':', '---') - p = p.replace(os.sep, '--') - return d + p + '.cache' - - -def ensure_slash(s): - if not s.endswith('/'): - return s + '/' - return s - - -def parse_credentials(netloc): - username = password = None - if '@' in netloc: - prefix, netloc = netloc.rsplit('@', 1) - if ':' not in prefix: - username = prefix - else: - username, password = prefix.split(':', 1) - if username: - username = unquote(username) - if password: - password = unquote(password) - return username, password, netloc - - -def get_process_umask(): - result = os.umask(0o22) - os.umask(result) - return result - - -def is_string_sequence(seq): - result = True - i = None - for i, s in enumerate(seq): - if not isinstance(s, string_types): - result = False - break - assert i is not None - return result - - -PROJECT_NAME_AND_VERSION = re.compile( - '([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-' - '([a-z0-9_.+-]+)', re.I) -PYTHON_VERSION = re.compile(r'-py(\d\.?\d?)') - - -def split_filename(filename, project_name=None): - """ - Extract name, version, python version from a filename (no extension) - - Return name, version, pyver or None - """ - result = None - pyver = None - filename = unquote(filename).replace(' ', '-') - m = PYTHON_VERSION.search(filename) - if m: - pyver = m.group(1) - filename = filename[:m.start()] - if project_name and len(filename) > len(project_name) + 1: - m = re.match(re.escape(project_name) + r'\b', filename) - if m: - n = m.end() - result = filename[:n], filename[n + 1:], pyver - if result is None: - m = PROJECT_NAME_AND_VERSION.match(filename) - if m: - result = m.group(1), m.group(3), pyver - return result - - -# Allow spaces in name because of legacy dists like "Twisted Core" -NAME_VERSION_RE = re.compile(r'(?P<name>[\w .-]+)\s*' - r'\(\s*(?P<ver>[^\s)]+)\)$') - - -def parse_name_and_version(p): - """ - A utility method used to get name and version from a string. - - From e.g. a Provides-Dist value. - - :param p: A value in a form 'foo (1.0)' - :return: The name and version as a tuple. - """ - m = NAME_VERSION_RE.match(p) - if not m: - raise DistlibException('Ill-formed name/version string: \'%s\'' % p) - d = m.groupdict() - return d['name'].strip().lower(), d['ver'] - - -def get_extras(requested, available): - result = set() - requested = set(requested or []) - available = set(available or []) - if '*' in requested: - requested.remove('*') - result |= available - for r in requested: - if r == '-': - result.add(r) - elif r.startswith('-'): - unwanted = r[1:] - if unwanted not in available: - logger.warning('undeclared extra: %s' % unwanted) - if unwanted in result: - result.remove(unwanted) - else: - if r not in available: - logger.warning('undeclared extra: %s' % r) - result.add(r) - return result - - -# -# Extended metadata functionality -# - - -def _get_external_data(url): - result = {} - try: - # urlopen might fail if it runs into redirections, - # because of Python issue #13696. Fixed in locators - # using a custom redirect handler. - resp = urlopen(url) - headers = resp.info() - ct = headers.get('Content-Type') - if not ct.startswith('application/json'): - logger.debug('Unexpected response for JSON request: %s', ct) - else: - reader = codecs.getreader('utf-8')(resp) - # data = reader.read().decode('utf-8') - # result = json.loads(data) - result = json.load(reader) - except Exception as e: - logger.exception('Failed to get external data for %s: %s', url, e) - return result - - -_external_data_base_url = 'https://www.red-dove.com/pypi/projects/' - - -def get_project_data(name): - url = '%s/%s/project.json' % (name[0].upper(), name) - url = urljoin(_external_data_base_url, url) - result = _get_external_data(url) - return result - - -def get_package_data(name, version): - url = '%s/%s/package-%s.json' % (name[0].upper(), name, version) - url = urljoin(_external_data_base_url, url) - return _get_external_data(url) - - -class Cache(object): - """ - A class implementing a cache for resources that need to live in the file system - e.g. shared libraries. This class was moved from resources to here because it - could be used by other modules, e.g. the wheel module. - """ - - def __init__(self, base): - """ - Initialise an instance. - - :param base: The base directory where the cache should be located. - """ - # we use 'isdir' instead of 'exists', because we want to - # fail if there's a file with that name - if not os.path.isdir(base): # pragma: no cover - os.makedirs(base) - if (os.stat(base).st_mode & 0o77) != 0: - logger.warning('Directory \'%s\' is not private', base) - self.base = os.path.abspath(os.path.normpath(base)) - - def prefix_to_dir(self, prefix): - """ - Converts a resource prefix to a directory name in the cache. - """ - return path_to_cache_dir(prefix) - - def clear(self): - """ - Clear the cache. - """ - not_removed = [] - for fn in os.listdir(self.base): - fn = os.path.join(self.base, fn) - try: - if os.path.islink(fn) or os.path.isfile(fn): - os.remove(fn) - elif os.path.isdir(fn): - shutil.rmtree(fn) - except Exception: - not_removed.append(fn) - return not_removed - - -class EventMixin(object): - """ - A very simple publish/subscribe system. - """ - - def __init__(self): - self._subscribers = {} - - def add(self, event, subscriber, append=True): - """ - Add a subscriber for an event. - - :param event: The name of an event. - :param subscriber: The subscriber to be added (and called when the - event is published). - :param append: Whether to append or prepend the subscriber to an - existing subscriber list for the event. - """ - subs = self._subscribers - if event not in subs: - subs[event] = deque([subscriber]) - else: - sq = subs[event] - if append: - sq.append(subscriber) - else: - sq.appendleft(subscriber) - - def remove(self, event, subscriber): - """ - Remove a subscriber for an event. - - :param event: The name of an event. - :param subscriber: The subscriber to be removed. - """ - subs = self._subscribers - if event not in subs: - raise ValueError('No subscribers: %r' % event) - subs[event].remove(subscriber) - - def get_subscribers(self, event): - """ - Return an iterator for the subscribers for an event. - :param event: The event to return subscribers for. - """ - return iter(self._subscribers.get(event, ())) - - def publish(self, event, *args, **kwargs): - """ - Publish a event and return a list of values returned by its - subscribers. - - :param event: The event to publish. - :param args: The positional arguments to pass to the event's - subscribers. - :param kwargs: The keyword arguments to pass to the event's - subscribers. - """ - result = [] - for subscriber in self.get_subscribers(event): - try: - value = subscriber(event, *args, **kwargs) - except Exception: - logger.exception('Exception during event publication') - value = None - result.append(value) - logger.debug('publish %s: args = %s, kwargs = %s, result = %s', event, - args, kwargs, result) - return result - - -# -# Simple sequencing -# -class Sequencer(object): - - def __init__(self): - self._preds = {} - self._succs = {} - self._nodes = set() # nodes with no preds/succs - - def add_node(self, node): - self._nodes.add(node) - - def remove_node(self, node, edges=False): - if node in self._nodes: - self._nodes.remove(node) - if edges: - for p in set(self._preds.get(node, ())): - self.remove(p, node) - for s in set(self._succs.get(node, ())): - self.remove(node, s) - # Remove empties - for k, v in list(self._preds.items()): - if not v: - del self._preds[k] - for k, v in list(self._succs.items()): - if not v: - del self._succs[k] - - def add(self, pred, succ): - assert pred != succ - self._preds.setdefault(succ, set()).add(pred) - self._succs.setdefault(pred, set()).add(succ) - - def remove(self, pred, succ): - assert pred != succ - try: - preds = self._preds[succ] - succs = self._succs[pred] - except KeyError: # pragma: no cover - raise ValueError('%r not a successor of anything' % succ) - try: - preds.remove(pred) - succs.remove(succ) - except KeyError: # pragma: no cover - raise ValueError('%r not a successor of %r' % (succ, pred)) - - def is_step(self, step): - return (step in self._preds or step in self._succs - or step in self._nodes) - - def get_steps(self, final): - if not self.is_step(final): - raise ValueError('Unknown: %r' % final) - result = [] - todo = [] - seen = set() - todo.append(final) - while todo: - step = todo.pop(0) - if step in seen: - # if a step was already seen, - # move it to the end (so it will appear earlier - # when reversed on return) ... but not for the - # final step, as that would be confusing for - # users - if step != final: - result.remove(step) - result.append(step) - else: - seen.add(step) - result.append(step) - preds = self._preds.get(step, ()) - todo.extend(preds) - return reversed(result) - - @property - def strong_connections(self): - # http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm - index_counter = [0] - stack = [] - lowlinks = {} - index = {} - result = [] - - graph = self._succs - - def strongconnect(node): - # set the depth index for this node to the smallest unused index - index[node] = index_counter[0] - lowlinks[node] = index_counter[0] - index_counter[0] += 1 - stack.append(node) - - # Consider successors - try: - successors = graph[node] - except Exception: - successors = [] - for successor in successors: - if successor not in lowlinks: - # Successor has not yet been visited - strongconnect(successor) - lowlinks[node] = min(lowlinks[node], lowlinks[successor]) - elif successor in stack: - # the successor is in the stack and hence in the current - # strongly connected component (SCC) - lowlinks[node] = min(lowlinks[node], index[successor]) - - # If `node` is a root node, pop the stack and generate an SCC - if lowlinks[node] == index[node]: - connected_component = [] - - while True: - successor = stack.pop() - connected_component.append(successor) - if successor == node: - break - component = tuple(connected_component) - # storing the result - result.append(component) - - for node in graph: - if node not in lowlinks: - strongconnect(node) - - return result - - @property - def dot(self): - result = ['digraph G {'] - for succ in self._preds: - preds = self._preds[succ] - for pred in preds: - result.append(' %s -> %s;' % (pred, succ)) - for node in self._nodes: - result.append(' %s;' % node) - result.append('}') - return '\n'.join(result) - - -# -# Unarchiving functionality for zip, tar, tgz, tbz, whl -# - -ARCHIVE_EXTENSIONS = ('.tar.gz', '.tar.bz2', '.tar', '.zip', '.tgz', '.tbz', - '.whl') - - -def unarchive(archive_filename, dest_dir, format=None, check=True): - - def check_path(path): - if not isinstance(path, text_type): - path = path.decode('utf-8') - p = os.path.abspath(os.path.join(dest_dir, path)) - if not p.startswith(dest_dir) or p[plen] != os.sep: - raise ValueError('path outside destination: %r' % p) - - dest_dir = os.path.abspath(dest_dir) - plen = len(dest_dir) - archive = None - if format is None: - if archive_filename.endswith(('.zip', '.whl')): - format = 'zip' - elif archive_filename.endswith(('.tar.gz', '.tgz')): - format = 'tgz' - mode = 'r:gz' - elif archive_filename.endswith(('.tar.bz2', '.tbz')): - format = 'tbz' - mode = 'r:bz2' - elif archive_filename.endswith('.tar'): - format = 'tar' - mode = 'r' - else: # pragma: no cover - raise ValueError('Unknown format for %r' % archive_filename) - try: - if format == 'zip': - archive = ZipFile(archive_filename, 'r') - if check: - names = archive.namelist() - for name in names: - check_path(name) - else: - archive = tarfile.open(archive_filename, mode) - if check: - names = archive.getnames() - for name in names: - check_path(name) - if format != 'zip' and sys.version_info[0] < 3: - # See Python issue 17153. If the dest path contains Unicode, - # tarfile extraction fails on Python 2.x if a member path name - # contains non-ASCII characters - it leads to an implicit - # bytes -> unicode conversion using ASCII to decode. - for tarinfo in archive.getmembers(): - if not isinstance(tarinfo.name, text_type): - tarinfo.name = tarinfo.name.decode('utf-8') - - # Limit extraction of dangerous items, if this Python - # allows it easily. If not, just trust the input. - # See: https://docs.python.org/3/library/tarfile.html#extraction-filters - def extraction_filter(member, path): - """Run tarfile.tar_filter, but raise the expected ValueError""" - # This is only called if the current Python has tarfile filters - try: - return tarfile.tar_filter(member, path) - except tarfile.FilterError as exc: - raise ValueError(str(exc)) - - archive.extraction_filter = extraction_filter - - archive.extractall(dest_dir) - - finally: - if archive: - archive.close() - - -def zip_dir(directory): - """zip a directory tree into a BytesIO object""" - result = io.BytesIO() - dlen = len(directory) - with ZipFile(result, "w") as zf: - for root, dirs, files in os.walk(directory): - for name in files: - full = os.path.join(root, name) - rel = root[dlen:] - dest = os.path.join(rel, name) - zf.write(full, dest) - return result - - -# -# Simple progress bar -# - -UNITS = ('', 'K', 'M', 'G', 'T', 'P') - - -class Progress(object): - unknown = 'UNKNOWN' - - def __init__(self, minval=0, maxval=100): - assert maxval is None or maxval >= minval - self.min = self.cur = minval - self.max = maxval - self.started = None - self.elapsed = 0 - self.done = False - - def update(self, curval): - assert self.min <= curval - assert self.max is None or curval <= self.max - self.cur = curval - now = time.time() - if self.started is None: - self.started = now - else: - self.elapsed = now - self.started - - def increment(self, incr): - assert incr >= 0 - self.update(self.cur + incr) - - def start(self): - self.update(self.min) - return self - - def stop(self): - if self.max is not None: - self.update(self.max) - self.done = True - - @property - def maximum(self): - return self.unknown if self.max is None else self.max - - @property - def percentage(self): - if self.done: - result = '100 %' - elif self.max is None: - result = ' ?? %' - else: - v = 100.0 * (self.cur - self.min) / (self.max - self.min) - result = '%3d %%' % v - return result - - def format_duration(self, duration): - if (duration <= 0) and self.max is None or self.cur == self.min: - result = '??:??:??' - # elif duration < 1: - # result = '--:--:--' - else: - result = time.strftime('%H:%M:%S', time.gmtime(duration)) - return result - - @property - def ETA(self): - if self.done: - prefix = 'Done' - t = self.elapsed - # import pdb; pdb.set_trace() - else: - prefix = 'ETA ' - if self.max is None: - t = -1 - elif self.elapsed == 0 or (self.cur == self.min): - t = 0 - else: - # import pdb; pdb.set_trace() - t = float(self.max - self.min) - t /= self.cur - self.min - t = (t - 1) * self.elapsed - return '%s: %s' % (prefix, self.format_duration(t)) - - @property - def speed(self): - if self.elapsed == 0: - result = 0.0 - else: - result = (self.cur - self.min) / self.elapsed - for unit in UNITS: - if result < 1000: - break - result /= 1000.0 - return '%d %sB/s' % (result, unit) - - -# -# Glob functionality -# - -RICH_GLOB = re.compile(r'\{([^}]*)\}') -_CHECK_RECURSIVE_GLOB = re.compile(r'[^/\\,{]\*\*|\*\*[^/\\,}]') -_CHECK_MISMATCH_SET = re.compile(r'^[^{]*\}|\{[^}]*$') - - -def iglob(path_glob): - """Extended globbing function that supports ** and {opt1,opt2,opt3}.""" - if _CHECK_RECURSIVE_GLOB.search(path_glob): - msg = """invalid glob %r: recursive glob "**" must be used alone""" - raise ValueError(msg % path_glob) - if _CHECK_MISMATCH_SET.search(path_glob): - msg = """invalid glob %r: mismatching set marker '{' or '}'""" - raise ValueError(msg % path_glob) - return _iglob(path_glob) - - -def _iglob(path_glob): - rich_path_glob = RICH_GLOB.split(path_glob, 1) - if len(rich_path_glob) > 1: - assert len(rich_path_glob) == 3, rich_path_glob - prefix, set, suffix = rich_path_glob - for item in set.split(','): - for path in _iglob(''.join((prefix, item, suffix))): - yield path - else: - if '**' not in path_glob: - for item in std_iglob(path_glob): - yield item - else: - prefix, radical = path_glob.split('**', 1) - if prefix == '': - prefix = '.' - if radical == '': - radical = '*' - else: - # we support both - radical = radical.lstrip('/') - radical = radical.lstrip('\\') - for path, dir, files in os.walk(prefix): - path = os.path.normpath(path) - for fn in _iglob(os.path.join(path, radical)): - yield fn - - -if ssl: - from .compat import (HTTPSHandler as BaseHTTPSHandler, match_hostname, - CertificateError) - - # - # HTTPSConnection which verifies certificates/matches domains - # - - class HTTPSConnection(httplib.HTTPSConnection): - ca_certs = None # set this to the path to the certs file (.pem) - check_domain = True # only used if ca_certs is not None - - # noinspection PyPropertyAccess - def connect(self): - sock = socket.create_connection((self.host, self.port), - self.timeout) - if getattr(self, '_tunnel_host', False): - self.sock = sock - self._tunnel() - - context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) - if hasattr(ssl, 'OP_NO_SSLv2'): - context.options |= ssl.OP_NO_SSLv2 - if getattr(self, 'cert_file', None): - context.load_cert_chain(self.cert_file, self.key_file) - kwargs = {} - if self.ca_certs: - context.verify_mode = ssl.CERT_REQUIRED - context.load_verify_locations(cafile=self.ca_certs) - if getattr(ssl, 'HAS_SNI', False): - kwargs['server_hostname'] = self.host - - self.sock = context.wrap_socket(sock, **kwargs) - if self.ca_certs and self.check_domain: - try: - match_hostname(self.sock.getpeercert(), self.host) - logger.debug('Host verified: %s', self.host) - except CertificateError: # pragma: no cover - self.sock.shutdown(socket.SHUT_RDWR) - self.sock.close() - raise - - class HTTPSHandler(BaseHTTPSHandler): - - def __init__(self, ca_certs, check_domain=True): - BaseHTTPSHandler.__init__(self) - self.ca_certs = ca_certs - self.check_domain = check_domain - - def _conn_maker(self, *args, **kwargs): - """ - This is called to create a connection instance. Normally you'd - pass a connection class to do_open, but it doesn't actually check for - a class, and just expects a callable. As long as we behave just as a - constructor would have, we should be OK. If it ever changes so that - we *must* pass a class, we'll create an UnsafeHTTPSConnection class - which just sets check_domain to False in the class definition, and - choose which one to pass to do_open. - """ - result = HTTPSConnection(*args, **kwargs) - if self.ca_certs: - result.ca_certs = self.ca_certs - result.check_domain = self.check_domain - return result - - def https_open(self, req): - try: - return self.do_open(self._conn_maker, req) - except URLError as e: - if 'certificate verify failed' in str(e.reason): - raise CertificateError( - 'Unable to verify server certificate ' - 'for %s' % req.host) - else: - raise - - # - # To prevent against mixing HTTP traffic with HTTPS (examples: A Man-In-The- - # Middle proxy using HTTP listens on port 443, or an index mistakenly serves - # HTML containing a http://xyz link when it should be https://xyz), - # you can use the following handler class, which does not allow HTTP traffic. - # - # It works by inheriting from HTTPHandler - so build_opener won't add a - # handler for HTTP itself. - # - class HTTPSOnlyHandler(HTTPSHandler, HTTPHandler): - - def http_open(self, req): - raise URLError( - 'Unexpected HTTP request on what should be a secure ' - 'connection: %s' % req) - - -# -# XML-RPC with timeouts -# -class Transport(xmlrpclib.Transport): - - def __init__(self, timeout, use_datetime=0): - self.timeout = timeout - xmlrpclib.Transport.__init__(self, use_datetime) - - def make_connection(self, host): - h, eh, x509 = self.get_host_info(host) - if not self._connection or host != self._connection[0]: - self._extra_headers = eh - self._connection = host, httplib.HTTPConnection(h) - return self._connection[1] - - -if ssl: - - class SafeTransport(xmlrpclib.SafeTransport): - - def __init__(self, timeout, use_datetime=0): - self.timeout = timeout - xmlrpclib.SafeTransport.__init__(self, use_datetime) - - def make_connection(self, host): - h, eh, kwargs = self.get_host_info(host) - if not kwargs: - kwargs = {} - kwargs['timeout'] = self.timeout - if not self._connection or host != self._connection[0]: - self._extra_headers = eh - self._connection = host, httplib.HTTPSConnection( - h, None, **kwargs) - return self._connection[1] - - -class ServerProxy(xmlrpclib.ServerProxy): - - def __init__(self, uri, **kwargs): - self.timeout = timeout = kwargs.pop('timeout', None) - # The above classes only come into play if a timeout - # is specified - if timeout is not None: - # scheme = splittype(uri) # deprecated as of Python 3.8 - scheme = urlparse(uri)[0] - use_datetime = kwargs.get('use_datetime', 0) - if scheme == 'https': - tcls = SafeTransport - else: - tcls = Transport - kwargs['transport'] = t = tcls(timeout, use_datetime=use_datetime) - self.transport = t - xmlrpclib.ServerProxy.__init__(self, uri, **kwargs) - - -# -# CSV functionality. This is provided because on 2.x, the csv module can't -# handle Unicode. However, we need to deal with Unicode in e.g. RECORD files. -# - - -def _csv_open(fn, mode, **kwargs): - if sys.version_info[0] < 3: - mode += 'b' - else: - kwargs['newline'] = '' - # Python 3 determines encoding from locale. Force 'utf-8' - # file encoding to match other forced utf-8 encoding - kwargs['encoding'] = 'utf-8' - return open(fn, mode, **kwargs) - - -class CSVBase(object): - defaults = { - 'delimiter': str(','), # The strs are used because we need native - 'quotechar': str('"'), # str in the csv API (2.x won't take - 'lineterminator': str('\n') # Unicode) - } - - def __enter__(self): - return self - - def __exit__(self, *exc_info): - self.stream.close() - - -class CSVReader(CSVBase): - - def __init__(self, **kwargs): - if 'stream' in kwargs: - stream = kwargs['stream'] - if sys.version_info[0] >= 3: - # needs to be a text stream - stream = codecs.getreader('utf-8')(stream) - self.stream = stream - else: - self.stream = _csv_open(kwargs['path'], 'r') - self.reader = csv.reader(self.stream, **self.defaults) - - def __iter__(self): - return self - - def next(self): - result = next(self.reader) - if sys.version_info[0] < 3: - for i, item in enumerate(result): - if not isinstance(item, text_type): - result[i] = item.decode('utf-8') - return result - - __next__ = next - - -class CSVWriter(CSVBase): - - def __init__(self, fn, **kwargs): - self.stream = _csv_open(fn, 'w') - self.writer = csv.writer(self.stream, **self.defaults) - - def writerow(self, row): - if sys.version_info[0] < 3: - r = [] - for item in row: - if isinstance(item, text_type): - item = item.encode('utf-8') - r.append(item) - row = r - self.writer.writerow(row) - - -# -# Configurator functionality -# - - -class Configurator(BaseConfigurator): - - value_converters = dict(BaseConfigurator.value_converters) - value_converters['inc'] = 'inc_convert' - - def __init__(self, config, base=None): - super(Configurator, self).__init__(config) - self.base = base or os.getcwd() - - def configure_custom(self, config): - - def convert(o): - if isinstance(o, (list, tuple)): - result = type(o)([convert(i) for i in o]) - elif isinstance(o, dict): - if '()' in o: - result = self.configure_custom(o) - else: - result = {} - for k in o: - result[k] = convert(o[k]) - else: - result = self.convert(o) - return result - - c = config.pop('()') - if not callable(c): - c = self.resolve(c) - props = config.pop('.', None) - # Check for valid identifiers - args = config.pop('[]', ()) - if args: - args = tuple([convert(o) for o in args]) - items = [(k, convert(config[k])) for k in config if valid_ident(k)] - kwargs = dict(items) - result = c(*args, **kwargs) - if props: - for n, v in props.items(): - setattr(result, n, convert(v)) - return result - - def __getitem__(self, key): - result = self.config[key] - if isinstance(result, dict) and '()' in result: - self.config[key] = result = self.configure_custom(result) - return result - - def inc_convert(self, value): - """Default converter for the inc:// protocol.""" - if not os.path.isabs(value): - value = os.path.join(self.base, value) - with codecs.open(value, 'r', encoding='utf-8') as f: - result = json.load(f) - return result - - -class SubprocessMixin(object): - """ - Mixin for running subprocesses and capturing their output - """ - - def __init__(self, verbose=False, progress=None): - self.verbose = verbose - self.progress = progress - - def reader(self, stream, context): - """ - Read lines from a subprocess' output stream and either pass to a progress - callable (if specified) or write progress information to sys.stderr. - """ - progress = self.progress - verbose = self.verbose - while True: - s = stream.readline() - if not s: - break - if progress is not None: - progress(s, context) - else: - if not verbose: - sys.stderr.write('.') - else: - sys.stderr.write(s.decode('utf-8')) - sys.stderr.flush() - stream.close() - - def run_command(self, cmd, **kwargs): - p = subprocess.Popen(cmd, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - **kwargs) - t1 = threading.Thread(target=self.reader, args=(p.stdout, 'stdout')) - t1.start() - t2 = threading.Thread(target=self.reader, args=(p.stderr, 'stderr')) - t2.start() - p.wait() - t1.join() - t2.join() - if self.progress is not None: - self.progress('done.', 'main') - elif self.verbose: - sys.stderr.write('done.\n') - return p - - -def normalize_name(name): - """Normalize a python package name a la PEP 503""" - # https://www.python.org/dev/peps/pep-0503/#normalized-names - return re.sub('[-_.]+', '-', name).lower() - - -# def _get_pypirc_command(): -# """ -# Get the distutils command for interacting with PyPI configurations. -# :return: the command. -# """ -# from distutils.core import Distribution -# from distutils.config import PyPIRCCommand -# d = Distribution() -# return PyPIRCCommand(d) - - -class PyPIRCFile(object): - - DEFAULT_REPOSITORY = 'https://upload.pypi.org/legacy/' - DEFAULT_REALM = 'pypi' - - def __init__(self, fn=None, url=None): - if fn is None: - fn = os.path.join(os.path.expanduser('~'), '.pypirc') - self.filename = fn - self.url = url - - def read(self): - result = {} - - if os.path.exists(self.filename): - repository = self.url or self.DEFAULT_REPOSITORY - - config = configparser.RawConfigParser() - config.read(self.filename) - sections = config.sections() - if 'distutils' in sections: - # let's get the list of servers - index_servers = config.get('distutils', 'index-servers') - _servers = [ - server.strip() for server in index_servers.split('\n') - if server.strip() != '' - ] - if _servers == []: - # nothing set, let's try to get the default pypi - if 'pypi' in sections: - _servers = ['pypi'] - else: - for server in _servers: - result = {'server': server} - result['username'] = config.get(server, 'username') - - # optional params - for key, default in (('repository', - self.DEFAULT_REPOSITORY), - ('realm', self.DEFAULT_REALM), - ('password', None)): - if config.has_option(server, key): - result[key] = config.get(server, key) - else: - result[key] = default - - # work around people having "repository" for the "pypi" - # section of their config set to the HTTP (rather than - # HTTPS) URL - if (server == 'pypi' and repository - in (self.DEFAULT_REPOSITORY, 'pypi')): - result['repository'] = self.DEFAULT_REPOSITORY - elif (result['server'] != repository - and result['repository'] != repository): - result = {} - elif 'server-login' in sections: - # old format - server = 'server-login' - if config.has_option(server, 'repository'): - repository = config.get(server, 'repository') - else: - repository = self.DEFAULT_REPOSITORY - result = { - 'username': config.get(server, 'username'), - 'password': config.get(server, 'password'), - 'repository': repository, - 'server': server, - 'realm': self.DEFAULT_REALM - } - return result - - def update(self, username, password): - # import pdb; pdb.set_trace() - config = configparser.RawConfigParser() - fn = self.filename - config.read(fn) - if not config.has_section('pypi'): - config.add_section('pypi') - config.set('pypi', 'username', username) - config.set('pypi', 'password', password) - with open(fn, 'w') as f: - config.write(f) - - -def _load_pypirc(index): - """ - Read the PyPI access configuration as supported by distutils. - """ - return PyPIRCFile(url=index.url).read() - - -def _store_pypirc(index): - PyPIRCFile().update(index.username, index.password) - - -# -# get_platform()/get_host_platform() copied from Python 3.10.a0 source, with some minor -# tweaks -# - - -def get_host_platform(): - """Return a string that identifies the current platform. This is used mainly to - distinguish platform-specific build directories and platform-specific built - distributions. Typically includes the OS name and version and the - architecture (as supplied by 'os.uname()'), although the exact information - included depends on the OS; eg. on Linux, the kernel version isn't - particularly important. - - Examples of returned values: - linux-i586 - linux-alpha (?) - solaris-2.6-sun4u - - Windows will return one of: - win-amd64 (64bit Windows on AMD64 (aka x86_64, Intel64, EM64T, etc) - win32 (all others - specifically, sys.platform is returned) - - For other non-POSIX platforms, currently just returns 'sys.platform'. - - """ - if os.name == 'nt': - if 'amd64' in sys.version.lower(): - return 'win-amd64' - if '(arm)' in sys.version.lower(): - return 'win-arm32' - if '(arm64)' in sys.version.lower(): - return 'win-arm64' - return sys.platform - - # Set for cross builds explicitly - if "_PYTHON_HOST_PLATFORM" in os.environ: - return os.environ["_PYTHON_HOST_PLATFORM"] - - if os.name != 'posix' or not hasattr(os, 'uname'): - # XXX what about the architecture? NT is Intel or Alpha, - # Mac OS is M68k or PPC, etc. - return sys.platform - - # Try to distinguish various flavours of Unix - - (osname, host, release, version, machine) = os.uname() - - # Convert the OS name to lowercase, remove '/' characters, and translate - # spaces (for "Power Macintosh") - osname = osname.lower().replace('/', '') - machine = machine.replace(' ', '_').replace('/', '-') - - if osname[:5] == 'linux': - # At least on Linux/Intel, 'machine' is the processor -- - # i386, etc. - # XXX what about Alpha, SPARC, etc? - return "%s-%s" % (osname, machine) - - elif osname[:5] == 'sunos': - if release[0] >= '5': # SunOS 5 == Solaris 2 - osname = 'solaris' - release = '%d.%s' % (int(release[0]) - 3, release[2:]) - # We can't use 'platform.architecture()[0]' because a - # bootstrap problem. We use a dict to get an error - # if some suspicious happens. - bitness = {2147483647: '32bit', 9223372036854775807: '64bit'} - machine += '.%s' % bitness[sys.maxsize] - # fall through to standard osname-release-machine representation - elif osname[:3] == 'aix': - from _aix_support import aix_platform - return aix_platform() - elif osname[:6] == 'cygwin': - osname = 'cygwin' - rel_re = re.compile(r'[\d.]+', re.ASCII) - m = rel_re.match(release) - if m: - release = m.group() - elif osname[:6] == 'darwin': - import _osx_support - try: - from distutils import sysconfig - except ImportError: - import sysconfig - osname, release, machine = _osx_support.get_platform_osx( - sysconfig.get_config_vars(), osname, release, machine) - - return '%s-%s-%s' % (osname, release, machine) - - -_TARGET_TO_PLAT = { - 'x86': 'win32', - 'x64': 'win-amd64', - 'arm': 'win-arm32', -} - - -def get_platform(): - if os.name != 'nt': - return get_host_platform() - cross_compilation_target = os.environ.get('VSCMD_ARG_TGT_ARCH') - if cross_compilation_target not in _TARGET_TO_PLAT: - return get_host_platform() - return _TARGET_TO_PLAT[cross_compilation_target] diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/version.py b/venv/lib/python3.12/site-packages/pip/_vendor/distlib/version.py deleted file mode 100644 index 14171ac..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/version.py +++ /dev/null @@ -1,751 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012-2023 The Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -""" -Implementation of a flexible versioning scheme providing support for PEP-440, -setuptools-compatible and semantic versioning. -""" - -import logging -import re - -from .compat import string_types -from .util import parse_requirement - -__all__ = ['NormalizedVersion', 'NormalizedMatcher', - 'LegacyVersion', 'LegacyMatcher', - 'SemanticVersion', 'SemanticMatcher', - 'UnsupportedVersionError', 'get_scheme'] - -logger = logging.getLogger(__name__) - - -class UnsupportedVersionError(ValueError): - """This is an unsupported version.""" - pass - - -class Version(object): - def __init__(self, s): - self._string = s = s.strip() - self._parts = parts = self.parse(s) - assert isinstance(parts, tuple) - assert len(parts) > 0 - - def parse(self, s): - raise NotImplementedError('please implement in a subclass') - - def _check_compatible(self, other): - if type(self) != type(other): - raise TypeError('cannot compare %r and %r' % (self, other)) - - def __eq__(self, other): - self._check_compatible(other) - return self._parts == other._parts - - def __ne__(self, other): - return not self.__eq__(other) - - def __lt__(self, other): - self._check_compatible(other) - return self._parts < other._parts - - def __gt__(self, other): - return not (self.__lt__(other) or self.__eq__(other)) - - def __le__(self, other): - return self.__lt__(other) or self.__eq__(other) - - def __ge__(self, other): - return self.__gt__(other) or self.__eq__(other) - - # See http://docs.python.org/reference/datamodel#object.__hash__ - def __hash__(self): - return hash(self._parts) - - def __repr__(self): - return "%s('%s')" % (self.__class__.__name__, self._string) - - def __str__(self): - return self._string - - @property - def is_prerelease(self): - raise NotImplementedError('Please implement in subclasses.') - - -class Matcher(object): - version_class = None - - # value is either a callable or the name of a method - _operators = { - '<': lambda v, c, p: v < c, - '>': lambda v, c, p: v > c, - '<=': lambda v, c, p: v == c or v < c, - '>=': lambda v, c, p: v == c or v > c, - '==': lambda v, c, p: v == c, - '===': lambda v, c, p: v == c, - # by default, compatible => >=. - '~=': lambda v, c, p: v == c or v > c, - '!=': lambda v, c, p: v != c, - } - - # this is a method only to support alternative implementations - # via overriding - def parse_requirement(self, s): - return parse_requirement(s) - - def __init__(self, s): - if self.version_class is None: - raise ValueError('Please specify a version class') - self._string = s = s.strip() - r = self.parse_requirement(s) - if not r: - raise ValueError('Not valid: %r' % s) - self.name = r.name - self.key = self.name.lower() # for case-insensitive comparisons - clist = [] - if r.constraints: - # import pdb; pdb.set_trace() - for op, s in r.constraints: - if s.endswith('.*'): - if op not in ('==', '!='): - raise ValueError('\'.*\' not allowed for ' - '%r constraints' % op) - # Could be a partial version (e.g. for '2.*') which - # won't parse as a version, so keep it as a string - vn, prefix = s[:-2], True - # Just to check that vn is a valid version - self.version_class(vn) - else: - # Should parse as a version, so we can create an - # instance for the comparison - vn, prefix = self.version_class(s), False - clist.append((op, vn, prefix)) - self._parts = tuple(clist) - - def match(self, version): - """ - Check if the provided version matches the constraints. - - :param version: The version to match against this instance. - :type version: String or :class:`Version` instance. - """ - if isinstance(version, string_types): - version = self.version_class(version) - for operator, constraint, prefix in self._parts: - f = self._operators.get(operator) - if isinstance(f, string_types): - f = getattr(self, f) - if not f: - msg = ('%r not implemented ' - 'for %s' % (operator, self.__class__.__name__)) - raise NotImplementedError(msg) - if not f(version, constraint, prefix): - return False - return True - - @property - def exact_version(self): - result = None - if len(self._parts) == 1 and self._parts[0][0] in ('==', '==='): - result = self._parts[0][1] - return result - - def _check_compatible(self, other): - if type(self) != type(other) or self.name != other.name: - raise TypeError('cannot compare %s and %s' % (self, other)) - - def __eq__(self, other): - self._check_compatible(other) - return self.key == other.key and self._parts == other._parts - - def __ne__(self, other): - return not self.__eq__(other) - - # See http://docs.python.org/reference/datamodel#object.__hash__ - def __hash__(self): - return hash(self.key) + hash(self._parts) - - def __repr__(self): - return "%s(%r)" % (self.__class__.__name__, self._string) - - def __str__(self): - return self._string - - -PEP440_VERSION_RE = re.compile(r'^v?(\d+!)?(\d+(\.\d+)*)((a|alpha|b|beta|c|rc|pre|preview)(\d+)?)?' - r'(\.(post|r|rev)(\d+)?)?([._-]?(dev)(\d+)?)?' - r'(\+([a-zA-Z\d]+(\.[a-zA-Z\d]+)?))?$', re.I) - - -def _pep_440_key(s): - s = s.strip() - m = PEP440_VERSION_RE.match(s) - if not m: - raise UnsupportedVersionError('Not a valid version: %s' % s) - groups = m.groups() - nums = tuple(int(v) for v in groups[1].split('.')) - while len(nums) > 1 and nums[-1] == 0: - nums = nums[:-1] - - if not groups[0]: - epoch = 0 - else: - epoch = int(groups[0][:-1]) - pre = groups[4:6] - post = groups[7:9] - dev = groups[10:12] - local = groups[13] - if pre == (None, None): - pre = () - else: - if pre[1] is None: - pre = pre[0], 0 - else: - pre = pre[0], int(pre[1]) - if post == (None, None): - post = () - else: - if post[1] is None: - post = post[0], 0 - else: - post = post[0], int(post[1]) - if dev == (None, None): - dev = () - else: - if dev[1] is None: - dev = dev[0], 0 - else: - dev = dev[0], int(dev[1]) - if local is None: - local = () - else: - parts = [] - for part in local.split('.'): - # to ensure that numeric compares as > lexicographic, avoid - # comparing them directly, but encode a tuple which ensures - # correct sorting - if part.isdigit(): - part = (1, int(part)) - else: - part = (0, part) - parts.append(part) - local = tuple(parts) - if not pre: - # either before pre-release, or final release and after - if not post and dev: - # before pre-release - pre = ('a', -1) # to sort before a0 - else: - pre = ('z',) # to sort after all pre-releases - # now look at the state of post and dev. - if not post: - post = ('_',) # sort before 'a' - if not dev: - dev = ('final',) - - return epoch, nums, pre, post, dev, local - - -_normalized_key = _pep_440_key - - -class NormalizedVersion(Version): - """A rational version. - - Good: - 1.2 # equivalent to "1.2.0" - 1.2.0 - 1.2a1 - 1.2.3a2 - 1.2.3b1 - 1.2.3c1 - 1.2.3.4 - TODO: fill this out - - Bad: - 1 # minimum two numbers - 1.2a # release level must have a release serial - 1.2.3b - """ - def parse(self, s): - result = _normalized_key(s) - # _normalized_key loses trailing zeroes in the release - # clause, since that's needed to ensure that X.Y == X.Y.0 == X.Y.0.0 - # However, PEP 440 prefix matching needs it: for example, - # (~= 1.4.5.0) matches differently to (~= 1.4.5.0.0). - m = PEP440_VERSION_RE.match(s) # must succeed - groups = m.groups() - self._release_clause = tuple(int(v) for v in groups[1].split('.')) - return result - - PREREL_TAGS = set(['a', 'b', 'c', 'rc', 'dev']) - - @property - def is_prerelease(self): - return any(t[0] in self.PREREL_TAGS for t in self._parts if t) - - -def _match_prefix(x, y): - x = str(x) - y = str(y) - if x == y: - return True - if not x.startswith(y): - return False - n = len(y) - return x[n] == '.' - - -class NormalizedMatcher(Matcher): - version_class = NormalizedVersion - - # value is either a callable or the name of a method - _operators = { - '~=': '_match_compatible', - '<': '_match_lt', - '>': '_match_gt', - '<=': '_match_le', - '>=': '_match_ge', - '==': '_match_eq', - '===': '_match_arbitrary', - '!=': '_match_ne', - } - - def _adjust_local(self, version, constraint, prefix): - if prefix: - strip_local = '+' not in constraint and version._parts[-1] - else: - # both constraint and version are - # NormalizedVersion instances. - # If constraint does not have a local component, - # ensure the version doesn't, either. - strip_local = not constraint._parts[-1] and version._parts[-1] - if strip_local: - s = version._string.split('+', 1)[0] - version = self.version_class(s) - return version, constraint - - def _match_lt(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - if version >= constraint: - return False - release_clause = constraint._release_clause - pfx = '.'.join([str(i) for i in release_clause]) - return not _match_prefix(version, pfx) - - def _match_gt(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - if version <= constraint: - return False - release_clause = constraint._release_clause - pfx = '.'.join([str(i) for i in release_clause]) - return not _match_prefix(version, pfx) - - def _match_le(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - return version <= constraint - - def _match_ge(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - return version >= constraint - - def _match_eq(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - if not prefix: - result = (version == constraint) - else: - result = _match_prefix(version, constraint) - return result - - def _match_arbitrary(self, version, constraint, prefix): - return str(version) == str(constraint) - - def _match_ne(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - if not prefix: - result = (version != constraint) - else: - result = not _match_prefix(version, constraint) - return result - - def _match_compatible(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - if version == constraint: - return True - if version < constraint: - return False -# if not prefix: -# return True - release_clause = constraint._release_clause - if len(release_clause) > 1: - release_clause = release_clause[:-1] - pfx = '.'.join([str(i) for i in release_clause]) - return _match_prefix(version, pfx) - - -_REPLACEMENTS = ( - (re.compile('[.+-]$'), ''), # remove trailing puncts - (re.compile(r'^[.](\d)'), r'0.\1'), # .N -> 0.N at start - (re.compile('^[.-]'), ''), # remove leading puncts - (re.compile(r'^\((.*)\)$'), r'\1'), # remove parentheses - (re.compile(r'^v(ersion)?\s*(\d+)'), r'\2'), # remove leading v(ersion) - (re.compile(r'^r(ev)?\s*(\d+)'), r'\2'), # remove leading v(ersion) - (re.compile('[.]{2,}'), '.'), # multiple runs of '.' - (re.compile(r'\b(alfa|apha)\b'), 'alpha'), # misspelt alpha - (re.compile(r'\b(pre-alpha|prealpha)\b'), - 'pre.alpha'), # standardise - (re.compile(r'\(beta\)$'), 'beta'), # remove parentheses -) - -_SUFFIX_REPLACEMENTS = ( - (re.compile('^[:~._+-]+'), ''), # remove leading puncts - (re.compile('[,*")([\\]]'), ''), # remove unwanted chars - (re.compile('[~:+_ -]'), '.'), # replace illegal chars - (re.compile('[.]{2,}'), '.'), # multiple runs of '.' - (re.compile(r'\.$'), ''), # trailing '.' -) - -_NUMERIC_PREFIX = re.compile(r'(\d+(\.\d+)*)') - - -def _suggest_semantic_version(s): - """ - Try to suggest a semantic form for a version for which - _suggest_normalized_version couldn't come up with anything. - """ - result = s.strip().lower() - for pat, repl in _REPLACEMENTS: - result = pat.sub(repl, result) - if not result: - result = '0.0.0' - - # Now look for numeric prefix, and separate it out from - # the rest. - # import pdb; pdb.set_trace() - m = _NUMERIC_PREFIX.match(result) - if not m: - prefix = '0.0.0' - suffix = result - else: - prefix = m.groups()[0].split('.') - prefix = [int(i) for i in prefix] - while len(prefix) < 3: - prefix.append(0) - if len(prefix) == 3: - suffix = result[m.end():] - else: - suffix = '.'.join([str(i) for i in prefix[3:]]) + result[m.end():] - prefix = prefix[:3] - prefix = '.'.join([str(i) for i in prefix]) - suffix = suffix.strip() - if suffix: - # import pdb; pdb.set_trace() - # massage the suffix. - for pat, repl in _SUFFIX_REPLACEMENTS: - suffix = pat.sub(repl, suffix) - - if not suffix: - result = prefix - else: - sep = '-' if 'dev' in suffix else '+' - result = prefix + sep + suffix - if not is_semver(result): - result = None - return result - - -def _suggest_normalized_version(s): - """Suggest a normalized version close to the given version string. - - If you have a version string that isn't rational (i.e. NormalizedVersion - doesn't like it) then you might be able to get an equivalent (or close) - rational version from this function. - - This does a number of simple normalizations to the given string, based - on observation of versions currently in use on PyPI. Given a dump of - those version during PyCon 2009, 4287 of them: - - 2312 (53.93%) match NormalizedVersion without change - with the automatic suggestion - - 3474 (81.04%) match when using this suggestion method - - @param s {str} An irrational version string. - @returns A rational version string, or None, if couldn't determine one. - """ - try: - _normalized_key(s) - return s # already rational - except UnsupportedVersionError: - pass - - rs = s.lower() - - # part of this could use maketrans - for orig, repl in (('-alpha', 'a'), ('-beta', 'b'), ('alpha', 'a'), - ('beta', 'b'), ('rc', 'c'), ('-final', ''), - ('-pre', 'c'), - ('-release', ''), ('.release', ''), ('-stable', ''), - ('+', '.'), ('_', '.'), (' ', ''), ('.final', ''), - ('final', '')): - rs = rs.replace(orig, repl) - - # if something ends with dev or pre, we add a 0 - rs = re.sub(r"pre$", r"pre0", rs) - rs = re.sub(r"dev$", r"dev0", rs) - - # if we have something like "b-2" or "a.2" at the end of the - # version, that is probably beta, alpha, etc - # let's remove the dash or dot - rs = re.sub(r"([abc]|rc)[\-\.](\d+)$", r"\1\2", rs) - - # 1.0-dev-r371 -> 1.0.dev371 - # 0.1-dev-r79 -> 0.1.dev79 - rs = re.sub(r"[\-\.](dev)[\-\.]?r?(\d+)$", r".\1\2", rs) - - # Clean: 2.0.a.3, 2.0.b1, 0.9.0~c1 - rs = re.sub(r"[.~]?([abc])\.?", r"\1", rs) - - # Clean: v0.3, v1.0 - if rs.startswith('v'): - rs = rs[1:] - - # Clean leading '0's on numbers. - # TODO: unintended side-effect on, e.g., "2003.05.09" - # PyPI stats: 77 (~2%) better - rs = re.sub(r"\b0+(\d+)(?!\d)", r"\1", rs) - - # Clean a/b/c with no version. E.g. "1.0a" -> "1.0a0". Setuptools infers - # zero. - # PyPI stats: 245 (7.56%) better - rs = re.sub(r"(\d+[abc])$", r"\g<1>0", rs) - - # the 'dev-rNNN' tag is a dev tag - rs = re.sub(r"\.?(dev-r|dev\.r)\.?(\d+)$", r".dev\2", rs) - - # clean the - when used as a pre delimiter - rs = re.sub(r"-(a|b|c)(\d+)$", r"\1\2", rs) - - # a terminal "dev" or "devel" can be changed into ".dev0" - rs = re.sub(r"[\.\-](dev|devel)$", r".dev0", rs) - - # a terminal "dev" can be changed into ".dev0" - rs = re.sub(r"(?![\.\-])dev$", r".dev0", rs) - - # a terminal "final" or "stable" can be removed - rs = re.sub(r"(final|stable)$", "", rs) - - # The 'r' and the '-' tags are post release tags - # 0.4a1.r10 -> 0.4a1.post10 - # 0.9.33-17222 -> 0.9.33.post17222 - # 0.9.33-r17222 -> 0.9.33.post17222 - rs = re.sub(r"\.?(r|-|-r)\.?(\d+)$", r".post\2", rs) - - # Clean 'r' instead of 'dev' usage: - # 0.9.33+r17222 -> 0.9.33.dev17222 - # 1.0dev123 -> 1.0.dev123 - # 1.0.git123 -> 1.0.dev123 - # 1.0.bzr123 -> 1.0.dev123 - # 0.1a0dev.123 -> 0.1a0.dev123 - # PyPI stats: ~150 (~4%) better - rs = re.sub(r"\.?(dev|git|bzr)\.?(\d+)$", r".dev\2", rs) - - # Clean '.pre' (normalized from '-pre' above) instead of 'c' usage: - # 0.2.pre1 -> 0.2c1 - # 0.2-c1 -> 0.2c1 - # 1.0preview123 -> 1.0c123 - # PyPI stats: ~21 (0.62%) better - rs = re.sub(r"\.?(pre|preview|-c)(\d+)$", r"c\g<2>", rs) - - # Tcl/Tk uses "px" for their post release markers - rs = re.sub(r"p(\d+)$", r".post\1", rs) - - try: - _normalized_key(rs) - except UnsupportedVersionError: - rs = None - return rs - -# -# Legacy version processing (distribute-compatible) -# - - -_VERSION_PART = re.compile(r'([a-z]+|\d+|[\.-])', re.I) -_VERSION_REPLACE = { - 'pre': 'c', - 'preview': 'c', - '-': 'final-', - 'rc': 'c', - 'dev': '@', - '': None, - '.': None, -} - - -def _legacy_key(s): - def get_parts(s): - result = [] - for p in _VERSION_PART.split(s.lower()): - p = _VERSION_REPLACE.get(p, p) - if p: - if '0' <= p[:1] <= '9': - p = p.zfill(8) - else: - p = '*' + p - result.append(p) - result.append('*final') - return result - - result = [] - for p in get_parts(s): - if p.startswith('*'): - if p < '*final': - while result and result[-1] == '*final-': - result.pop() - while result and result[-1] == '00000000': - result.pop() - result.append(p) - return tuple(result) - - -class LegacyVersion(Version): - def parse(self, s): - return _legacy_key(s) - - @property - def is_prerelease(self): - result = False - for x in self._parts: - if (isinstance(x, string_types) and x.startswith('*') and - x < '*final'): - result = True - break - return result - - -class LegacyMatcher(Matcher): - version_class = LegacyVersion - - _operators = dict(Matcher._operators) - _operators['~='] = '_match_compatible' - - numeric_re = re.compile(r'^(\d+(\.\d+)*)') - - def _match_compatible(self, version, constraint, prefix): - if version < constraint: - return False - m = self.numeric_re.match(str(constraint)) - if not m: - logger.warning('Cannot compute compatible match for version %s ' - ' and constraint %s', version, constraint) - return True - s = m.groups()[0] - if '.' in s: - s = s.rsplit('.', 1)[0] - return _match_prefix(version, s) - -# -# Semantic versioning -# - - -_SEMVER_RE = re.compile(r'^(\d+)\.(\d+)\.(\d+)' - r'(-[a-z0-9]+(\.[a-z0-9-]+)*)?' - r'(\+[a-z0-9]+(\.[a-z0-9-]+)*)?$', re.I) - - -def is_semver(s): - return _SEMVER_RE.match(s) - - -def _semantic_key(s): - def make_tuple(s, absent): - if s is None: - result = (absent,) - else: - parts = s[1:].split('.') - # We can't compare ints and strings on Python 3, so fudge it - # by zero-filling numeric values so simulate a numeric comparison - result = tuple([p.zfill(8) if p.isdigit() else p for p in parts]) - return result - - m = is_semver(s) - if not m: - raise UnsupportedVersionError(s) - groups = m.groups() - major, minor, patch = [int(i) for i in groups[:3]] - # choose the '|' and '*' so that versions sort correctly - pre, build = make_tuple(groups[3], '|'), make_tuple(groups[5], '*') - return (major, minor, patch), pre, build - - -class SemanticVersion(Version): - def parse(self, s): - return _semantic_key(s) - - @property - def is_prerelease(self): - return self._parts[1][0] != '|' - - -class SemanticMatcher(Matcher): - version_class = SemanticVersion - - -class VersionScheme(object): - def __init__(self, key, matcher, suggester=None): - self.key = key - self.matcher = matcher - self.suggester = suggester - - def is_valid_version(self, s): - try: - self.matcher.version_class(s) - result = True - except UnsupportedVersionError: - result = False - return result - - def is_valid_matcher(self, s): - try: - self.matcher(s) - result = True - except UnsupportedVersionError: - result = False - return result - - def is_valid_constraint_list(self, s): - """ - Used for processing some metadata fields - """ - # See issue #140. Be tolerant of a single trailing comma. - if s.endswith(','): - s = s[:-1] - return self.is_valid_matcher('dummy_name (%s)' % s) - - def suggest(self, s): - if self.suggester is None: - result = None - else: - result = self.suggester(s) - return result - - -_SCHEMES = { - 'normalized': VersionScheme(_normalized_key, NormalizedMatcher, - _suggest_normalized_version), - 'legacy': VersionScheme(_legacy_key, LegacyMatcher, lambda self, s: s), - 'semantic': VersionScheme(_semantic_key, SemanticMatcher, - _suggest_semantic_version), -} - -_SCHEMES['default'] = _SCHEMES['normalized'] - - -def get_scheme(name): - if name not in _SCHEMES: - raise ValueError('unknown scheme name: %r' % name) - return _SCHEMES[name] diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/wheel.py b/venv/lib/python3.12/site-packages/pip/_vendor/distlib/wheel.py deleted file mode 100644 index 4a5a30e..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/distlib/wheel.py +++ /dev/null @@ -1,1099 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2013-2023 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -from __future__ import unicode_literals - -import base64 -import codecs -import datetime -from email import message_from_file -import hashlib -import json -import logging -import os -import posixpath -import re -import shutil -import sys -import tempfile -import zipfile - -from . import __version__, DistlibException -from .compat import sysconfig, ZipFile, fsdecode, text_type, filter -from .database import InstalledDistribution -from .metadata import Metadata, WHEEL_METADATA_FILENAME, LEGACY_METADATA_FILENAME -from .util import (FileOperator, convert_path, CSVReader, CSVWriter, Cache, - cached_property, get_cache_base, read_exports, tempdir, - get_platform) -from .version import NormalizedVersion, UnsupportedVersionError - -logger = logging.getLogger(__name__) - -cache = None # created when needed - -if hasattr(sys, 'pypy_version_info'): # pragma: no cover - IMP_PREFIX = 'pp' -elif sys.platform.startswith('java'): # pragma: no cover - IMP_PREFIX = 'jy' -elif sys.platform == 'cli': # pragma: no cover - IMP_PREFIX = 'ip' -else: - IMP_PREFIX = 'cp' - -VER_SUFFIX = sysconfig.get_config_var('py_version_nodot') -if not VER_SUFFIX: # pragma: no cover - VER_SUFFIX = '%s%s' % sys.version_info[:2] -PYVER = 'py' + VER_SUFFIX -IMPVER = IMP_PREFIX + VER_SUFFIX - -ARCH = get_platform().replace('-', '_').replace('.', '_') - -ABI = sysconfig.get_config_var('SOABI') -if ABI and ABI.startswith('cpython-'): - ABI = ABI.replace('cpython-', 'cp').split('-')[0] -else: - - def _derive_abi(): - parts = ['cp', VER_SUFFIX] - if sysconfig.get_config_var('Py_DEBUG'): - parts.append('d') - if IMP_PREFIX == 'cp': - vi = sys.version_info[:2] - if vi < (3, 8): - wpm = sysconfig.get_config_var('WITH_PYMALLOC') - if wpm is None: - wpm = True - if wpm: - parts.append('m') - if vi < (3, 3): - us = sysconfig.get_config_var('Py_UNICODE_SIZE') - if us == 4 or (us is None and sys.maxunicode == 0x10FFFF): - parts.append('u') - return ''.join(parts) - - ABI = _derive_abi() - del _derive_abi - -FILENAME_RE = re.compile( - r''' -(?P<nm>[^-]+) --(?P<vn>\d+[^-]*) -(-(?P<bn>\d+[^-]*))? --(?P<py>\w+\d+(\.\w+\d+)*) --(?P<bi>\w+) --(?P<ar>\w+(\.\w+)*) -\.whl$ -''', re.IGNORECASE | re.VERBOSE) - -NAME_VERSION_RE = re.compile( - r''' -(?P<nm>[^-]+) --(?P<vn>\d+[^-]*) -(-(?P<bn>\d+[^-]*))?$ -''', re.IGNORECASE | re.VERBOSE) - -SHEBANG_RE = re.compile(br'\s*#![^\r\n]*') -SHEBANG_DETAIL_RE = re.compile(br'^(\s*#!("[^"]+"|\S+))\s+(.*)$') -SHEBANG_PYTHON = b'#!python' -SHEBANG_PYTHONW = b'#!pythonw' - -if os.sep == '/': - to_posix = lambda o: o -else: - to_posix = lambda o: o.replace(os.sep, '/') - -if sys.version_info[0] < 3: - import imp -else: - imp = None - import importlib.machinery - import importlib.util - - -def _get_suffixes(): - if imp: - return [s[0] for s in imp.get_suffixes()] - else: - return importlib.machinery.EXTENSION_SUFFIXES - - -def _load_dynamic(name, path): - # https://docs.python.org/3/library/importlib.html#importing-a-source-file-directly - if imp: - return imp.load_dynamic(name, path) - else: - spec = importlib.util.spec_from_file_location(name, path) - module = importlib.util.module_from_spec(spec) - sys.modules[name] = module - spec.loader.exec_module(module) - return module - - -class Mounter(object): - - def __init__(self): - self.impure_wheels = {} - self.libs = {} - - def add(self, pathname, extensions): - self.impure_wheels[pathname] = extensions - self.libs.update(extensions) - - def remove(self, pathname): - extensions = self.impure_wheels.pop(pathname) - for k, v in extensions: - if k in self.libs: - del self.libs[k] - - def find_module(self, fullname, path=None): - if fullname in self.libs: - result = self - else: - result = None - return result - - def load_module(self, fullname): - if fullname in sys.modules: - result = sys.modules[fullname] - else: - if fullname not in self.libs: - raise ImportError('unable to find extension for %s' % fullname) - result = _load_dynamic(fullname, self.libs[fullname]) - result.__loader__ = self - parts = fullname.rsplit('.', 1) - if len(parts) > 1: - result.__package__ = parts[0] - return result - - -_hook = Mounter() - - -class Wheel(object): - """ - Class to build and install from Wheel files (PEP 427). - """ - - wheel_version = (1, 1) - hash_kind = 'sha256' - - def __init__(self, filename=None, sign=False, verify=False): - """ - Initialise an instance using a (valid) filename. - """ - self.sign = sign - self.should_verify = verify - self.buildver = '' - self.pyver = [PYVER] - self.abi = ['none'] - self.arch = ['any'] - self.dirname = os.getcwd() - if filename is None: - self.name = 'dummy' - self.version = '0.1' - self._filename = self.filename - else: - m = NAME_VERSION_RE.match(filename) - if m: - info = m.groupdict('') - self.name = info['nm'] - # Reinstate the local version separator - self.version = info['vn'].replace('_', '-') - self.buildver = info['bn'] - self._filename = self.filename - else: - dirname, filename = os.path.split(filename) - m = FILENAME_RE.match(filename) - if not m: - raise DistlibException('Invalid name or ' - 'filename: %r' % filename) - if dirname: - self.dirname = os.path.abspath(dirname) - self._filename = filename - info = m.groupdict('') - self.name = info['nm'] - self.version = info['vn'] - self.buildver = info['bn'] - self.pyver = info['py'].split('.') - self.abi = info['bi'].split('.') - self.arch = info['ar'].split('.') - - @property - def filename(self): - """ - Build and return a filename from the various components. - """ - if self.buildver: - buildver = '-' + self.buildver - else: - buildver = '' - pyver = '.'.join(self.pyver) - abi = '.'.join(self.abi) - arch = '.'.join(self.arch) - # replace - with _ as a local version separator - version = self.version.replace('-', '_') - return '%s-%s%s-%s-%s-%s.whl' % (self.name, version, buildver, pyver, - abi, arch) - - @property - def exists(self): - path = os.path.join(self.dirname, self.filename) - return os.path.isfile(path) - - @property - def tags(self): - for pyver in self.pyver: - for abi in self.abi: - for arch in self.arch: - yield pyver, abi, arch - - @cached_property - def metadata(self): - pathname = os.path.join(self.dirname, self.filename) - name_ver = '%s-%s' % (self.name, self.version) - info_dir = '%s.dist-info' % name_ver - wrapper = codecs.getreader('utf-8') - with ZipFile(pathname, 'r') as zf: - self.get_wheel_metadata(zf) - # wv = wheel_metadata['Wheel-Version'].split('.', 1) - # file_version = tuple([int(i) for i in wv]) - # if file_version < (1, 1): - # fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME, - # LEGACY_METADATA_FILENAME] - # else: - # fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME] - fns = [WHEEL_METADATA_FILENAME, LEGACY_METADATA_FILENAME] - result = None - for fn in fns: - try: - metadata_filename = posixpath.join(info_dir, fn) - with zf.open(metadata_filename) as bf: - wf = wrapper(bf) - result = Metadata(fileobj=wf) - if result: - break - except KeyError: - pass - if not result: - raise ValueError('Invalid wheel, because metadata is ' - 'missing: looked in %s' % ', '.join(fns)) - return result - - def get_wheel_metadata(self, zf): - name_ver = '%s-%s' % (self.name, self.version) - info_dir = '%s.dist-info' % name_ver - metadata_filename = posixpath.join(info_dir, 'WHEEL') - with zf.open(metadata_filename) as bf: - wf = codecs.getreader('utf-8')(bf) - message = message_from_file(wf) - return dict(message) - - @cached_property - def info(self): - pathname = os.path.join(self.dirname, self.filename) - with ZipFile(pathname, 'r') as zf: - result = self.get_wheel_metadata(zf) - return result - - def process_shebang(self, data): - m = SHEBANG_RE.match(data) - if m: - end = m.end() - shebang, data_after_shebang = data[:end], data[end:] - # Preserve any arguments after the interpreter - if b'pythonw' in shebang.lower(): - shebang_python = SHEBANG_PYTHONW - else: - shebang_python = SHEBANG_PYTHON - m = SHEBANG_DETAIL_RE.match(shebang) - if m: - args = b' ' + m.groups()[-1] - else: - args = b'' - shebang = shebang_python + args - data = shebang + data_after_shebang - else: - cr = data.find(b'\r') - lf = data.find(b'\n') - if cr < 0 or cr > lf: - term = b'\n' - else: - if data[cr:cr + 2] == b'\r\n': - term = b'\r\n' - else: - term = b'\r' - data = SHEBANG_PYTHON + term + data - return data - - def get_hash(self, data, hash_kind=None): - if hash_kind is None: - hash_kind = self.hash_kind - try: - hasher = getattr(hashlib, hash_kind) - except AttributeError: - raise DistlibException('Unsupported hash algorithm: %r' % - hash_kind) - result = hasher(data).digest() - result = base64.urlsafe_b64encode(result).rstrip(b'=').decode('ascii') - return hash_kind, result - - def write_record(self, records, record_path, archive_record_path): - records = list(records) # make a copy, as mutated - records.append((archive_record_path, '', '')) - with CSVWriter(record_path) as writer: - for row in records: - writer.writerow(row) - - def write_records(self, info, libdir, archive_paths): - records = [] - distinfo, info_dir = info - # hasher = getattr(hashlib, self.hash_kind) - for ap, p in archive_paths: - with open(p, 'rb') as f: - data = f.read() - digest = '%s=%s' % self.get_hash(data) - size = os.path.getsize(p) - records.append((ap, digest, size)) - - p = os.path.join(distinfo, 'RECORD') - ap = to_posix(os.path.join(info_dir, 'RECORD')) - self.write_record(records, p, ap) - archive_paths.append((ap, p)) - - def build_zip(self, pathname, archive_paths): - with ZipFile(pathname, 'w', zipfile.ZIP_DEFLATED) as zf: - for ap, p in archive_paths: - logger.debug('Wrote %s to %s in wheel', p, ap) - zf.write(p, ap) - - def build(self, paths, tags=None, wheel_version=None): - """ - Build a wheel from files in specified paths, and use any specified tags - when determining the name of the wheel. - """ - if tags is None: - tags = {} - - libkey = list(filter(lambda o: o in paths, ('purelib', 'platlib')))[0] - if libkey == 'platlib': - is_pure = 'false' - default_pyver = [IMPVER] - default_abi = [ABI] - default_arch = [ARCH] - else: - is_pure = 'true' - default_pyver = [PYVER] - default_abi = ['none'] - default_arch = ['any'] - - self.pyver = tags.get('pyver', default_pyver) - self.abi = tags.get('abi', default_abi) - self.arch = tags.get('arch', default_arch) - - libdir = paths[libkey] - - name_ver = '%s-%s' % (self.name, self.version) - data_dir = '%s.data' % name_ver - info_dir = '%s.dist-info' % name_ver - - archive_paths = [] - - # First, stuff which is not in site-packages - for key in ('data', 'headers', 'scripts'): - if key not in paths: - continue - path = paths[key] - if os.path.isdir(path): - for root, dirs, files in os.walk(path): - for fn in files: - p = fsdecode(os.path.join(root, fn)) - rp = os.path.relpath(p, path) - ap = to_posix(os.path.join(data_dir, key, rp)) - archive_paths.append((ap, p)) - if key == 'scripts' and not p.endswith('.exe'): - with open(p, 'rb') as f: - data = f.read() - data = self.process_shebang(data) - with open(p, 'wb') as f: - f.write(data) - - # Now, stuff which is in site-packages, other than the - # distinfo stuff. - path = libdir - distinfo = None - for root, dirs, files in os.walk(path): - if root == path: - # At the top level only, save distinfo for later - # and skip it for now - for i, dn in enumerate(dirs): - dn = fsdecode(dn) - if dn.endswith('.dist-info'): - distinfo = os.path.join(root, dn) - del dirs[i] - break - assert distinfo, '.dist-info directory expected, not found' - - for fn in files: - # comment out next suite to leave .pyc files in - if fsdecode(fn).endswith(('.pyc', '.pyo')): - continue - p = os.path.join(root, fn) - rp = to_posix(os.path.relpath(p, path)) - archive_paths.append((rp, p)) - - # Now distinfo. Assumed to be flat, i.e. os.listdir is enough. - files = os.listdir(distinfo) - for fn in files: - if fn not in ('RECORD', 'INSTALLER', 'SHARED', 'WHEEL'): - p = fsdecode(os.path.join(distinfo, fn)) - ap = to_posix(os.path.join(info_dir, fn)) - archive_paths.append((ap, p)) - - wheel_metadata = [ - 'Wheel-Version: %d.%d' % (wheel_version or self.wheel_version), - 'Generator: distlib %s' % __version__, - 'Root-Is-Purelib: %s' % is_pure, - ] - for pyver, abi, arch in self.tags: - wheel_metadata.append('Tag: %s-%s-%s' % (pyver, abi, arch)) - p = os.path.join(distinfo, 'WHEEL') - with open(p, 'w') as f: - f.write('\n'.join(wheel_metadata)) - ap = to_posix(os.path.join(info_dir, 'WHEEL')) - archive_paths.append((ap, p)) - - # sort the entries by archive path. Not needed by any spec, but it - # keeps the archive listing and RECORD tidier than they would otherwise - # be. Use the number of path segments to keep directory entries together, - # and keep the dist-info stuff at the end. - def sorter(t): - ap = t[0] - n = ap.count('/') - if '.dist-info' in ap: - n += 10000 - return (n, ap) - - archive_paths = sorted(archive_paths, key=sorter) - - # Now, at last, RECORD. - # Paths in here are archive paths - nothing else makes sense. - self.write_records((distinfo, info_dir), libdir, archive_paths) - # Now, ready to build the zip file - pathname = os.path.join(self.dirname, self.filename) - self.build_zip(pathname, archive_paths) - return pathname - - def skip_entry(self, arcname): - """ - Determine whether an archive entry should be skipped when verifying - or installing. - """ - # The signature file won't be in RECORD, - # and we don't currently don't do anything with it - # We also skip directories, as they won't be in RECORD - # either. See: - # - # https://github.com/pypa/wheel/issues/294 - # https://github.com/pypa/wheel/issues/287 - # https://github.com/pypa/wheel/pull/289 - # - return arcname.endswith(('/', '/RECORD.jws')) - - def install(self, paths, maker, **kwargs): - """ - Install a wheel to the specified paths. If kwarg ``warner`` is - specified, it should be a callable, which will be called with two - tuples indicating the wheel version of this software and the wheel - version in the file, if there is a discrepancy in the versions. - This can be used to issue any warnings to raise any exceptions. - If kwarg ``lib_only`` is True, only the purelib/platlib files are - installed, and the headers, scripts, data and dist-info metadata are - not written. If kwarg ``bytecode_hashed_invalidation`` is True, written - bytecode will try to use file-hash based invalidation (PEP-552) on - supported interpreter versions (CPython 2.7+). - - The return value is a :class:`InstalledDistribution` instance unless - ``options.lib_only`` is True, in which case the return value is ``None``. - """ - - dry_run = maker.dry_run - warner = kwargs.get('warner') - lib_only = kwargs.get('lib_only', False) - bc_hashed_invalidation = kwargs.get('bytecode_hashed_invalidation', - False) - - pathname = os.path.join(self.dirname, self.filename) - name_ver = '%s-%s' % (self.name, self.version) - data_dir = '%s.data' % name_ver - info_dir = '%s.dist-info' % name_ver - - metadata_name = posixpath.join(info_dir, LEGACY_METADATA_FILENAME) - wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') - record_name = posixpath.join(info_dir, 'RECORD') - - wrapper = codecs.getreader('utf-8') - - with ZipFile(pathname, 'r') as zf: - with zf.open(wheel_metadata_name) as bwf: - wf = wrapper(bwf) - message = message_from_file(wf) - wv = message['Wheel-Version'].split('.', 1) - file_version = tuple([int(i) for i in wv]) - if (file_version != self.wheel_version) and warner: - warner(self.wheel_version, file_version) - - if message['Root-Is-Purelib'] == 'true': - libdir = paths['purelib'] - else: - libdir = paths['platlib'] - - records = {} - with zf.open(record_name) as bf: - with CSVReader(stream=bf) as reader: - for row in reader: - p = row[0] - records[p] = row - - data_pfx = posixpath.join(data_dir, '') - info_pfx = posixpath.join(info_dir, '') - script_pfx = posixpath.join(data_dir, 'scripts', '') - - # make a new instance rather than a copy of maker's, - # as we mutate it - fileop = FileOperator(dry_run=dry_run) - fileop.record = True # so we can rollback if needed - - bc = not sys.dont_write_bytecode # Double negatives. Lovely! - - outfiles = [] # for RECORD writing - - # for script copying/shebang processing - workdir = tempfile.mkdtemp() - # set target dir later - # we default add_launchers to False, as the - # Python Launcher should be used instead - maker.source_dir = workdir - maker.target_dir = None - try: - for zinfo in zf.infolist(): - arcname = zinfo.filename - if isinstance(arcname, text_type): - u_arcname = arcname - else: - u_arcname = arcname.decode('utf-8') - if self.skip_entry(u_arcname): - continue - row = records[u_arcname] - if row[2] and str(zinfo.file_size) != row[2]: - raise DistlibException('size mismatch for ' - '%s' % u_arcname) - if row[1]: - kind, value = row[1].split('=', 1) - with zf.open(arcname) as bf: - data = bf.read() - _, digest = self.get_hash(data, kind) - if digest != value: - raise DistlibException('digest mismatch for ' - '%s' % arcname) - - if lib_only and u_arcname.startswith((info_pfx, data_pfx)): - logger.debug('lib_only: skipping %s', u_arcname) - continue - is_script = (u_arcname.startswith(script_pfx) - and not u_arcname.endswith('.exe')) - - if u_arcname.startswith(data_pfx): - _, where, rp = u_arcname.split('/', 2) - outfile = os.path.join(paths[where], convert_path(rp)) - else: - # meant for site-packages. - if u_arcname in (wheel_metadata_name, record_name): - continue - outfile = os.path.join(libdir, convert_path(u_arcname)) - if not is_script: - with zf.open(arcname) as bf: - fileop.copy_stream(bf, outfile) - # Issue #147: permission bits aren't preserved. Using - # zf.extract(zinfo, libdir) should have worked, but didn't, - # see https://www.thetopsites.net/article/53834422.shtml - # So ... manually preserve permission bits as given in zinfo - if os.name == 'posix': - # just set the normal permission bits - os.chmod(outfile, - (zinfo.external_attr >> 16) & 0x1FF) - outfiles.append(outfile) - # Double check the digest of the written file - if not dry_run and row[1]: - with open(outfile, 'rb') as bf: - data = bf.read() - _, newdigest = self.get_hash(data, kind) - if newdigest != digest: - raise DistlibException('digest mismatch ' - 'on write for ' - '%s' % outfile) - if bc and outfile.endswith('.py'): - try: - pyc = fileop.byte_compile( - outfile, - hashed_invalidation=bc_hashed_invalidation) - outfiles.append(pyc) - except Exception: - # Don't give up if byte-compilation fails, - # but log it and perhaps warn the user - logger.warning('Byte-compilation failed', - exc_info=True) - else: - fn = os.path.basename(convert_path(arcname)) - workname = os.path.join(workdir, fn) - with zf.open(arcname) as bf: - fileop.copy_stream(bf, workname) - - dn, fn = os.path.split(outfile) - maker.target_dir = dn - filenames = maker.make(fn) - fileop.set_executable_mode(filenames) - outfiles.extend(filenames) - - if lib_only: - logger.debug('lib_only: returning None') - dist = None - else: - # Generate scripts - - # Try to get pydist.json so we can see if there are - # any commands to generate. If this fails (e.g. because - # of a legacy wheel), log a warning but don't give up. - commands = None - file_version = self.info['Wheel-Version'] - if file_version == '1.0': - # Use legacy info - ep = posixpath.join(info_dir, 'entry_points.txt') - try: - with zf.open(ep) as bwf: - epdata = read_exports(bwf) - commands = {} - for key in ('console', 'gui'): - k = '%s_scripts' % key - if k in epdata: - commands['wrap_%s' % key] = d = {} - for v in epdata[k].values(): - s = '%s:%s' % (v.prefix, v.suffix) - if v.flags: - s += ' [%s]' % ','.join(v.flags) - d[v.name] = s - except Exception: - logger.warning('Unable to read legacy script ' - 'metadata, so cannot generate ' - 'scripts') - else: - try: - with zf.open(metadata_name) as bwf: - wf = wrapper(bwf) - commands = json.load(wf).get('extensions') - if commands: - commands = commands.get('python.commands') - except Exception: - logger.warning('Unable to read JSON metadata, so ' - 'cannot generate scripts') - if commands: - console_scripts = commands.get('wrap_console', {}) - gui_scripts = commands.get('wrap_gui', {}) - if console_scripts or gui_scripts: - script_dir = paths.get('scripts', '') - if not os.path.isdir(script_dir): - raise ValueError('Valid script path not ' - 'specified') - maker.target_dir = script_dir - for k, v in console_scripts.items(): - script = '%s = %s' % (k, v) - filenames = maker.make(script) - fileop.set_executable_mode(filenames) - - if gui_scripts: - options = {'gui': True} - for k, v in gui_scripts.items(): - script = '%s = %s' % (k, v) - filenames = maker.make(script, options) - fileop.set_executable_mode(filenames) - - p = os.path.join(libdir, info_dir) - dist = InstalledDistribution(p) - - # Write SHARED - paths = dict(paths) # don't change passed in dict - del paths['purelib'] - del paths['platlib'] - paths['lib'] = libdir - p = dist.write_shared_locations(paths, dry_run) - if p: - outfiles.append(p) - - # Write RECORD - dist.write_installed_files(outfiles, paths['prefix'], - dry_run) - return dist - except Exception: # pragma: no cover - logger.exception('installation failed.') - fileop.rollback() - raise - finally: - shutil.rmtree(workdir) - - def _get_dylib_cache(self): - global cache - if cache is None: - # Use native string to avoid issues on 2.x: see Python #20140. - base = os.path.join(get_cache_base(), str('dylib-cache'), - '%s.%s' % sys.version_info[:2]) - cache = Cache(base) - return cache - - def _get_extensions(self): - pathname = os.path.join(self.dirname, self.filename) - name_ver = '%s-%s' % (self.name, self.version) - info_dir = '%s.dist-info' % name_ver - arcname = posixpath.join(info_dir, 'EXTENSIONS') - wrapper = codecs.getreader('utf-8') - result = [] - with ZipFile(pathname, 'r') as zf: - try: - with zf.open(arcname) as bf: - wf = wrapper(bf) - extensions = json.load(wf) - cache = self._get_dylib_cache() - prefix = cache.prefix_to_dir(pathname) - cache_base = os.path.join(cache.base, prefix) - if not os.path.isdir(cache_base): - os.makedirs(cache_base) - for name, relpath in extensions.items(): - dest = os.path.join(cache_base, convert_path(relpath)) - if not os.path.exists(dest): - extract = True - else: - file_time = os.stat(dest).st_mtime - file_time = datetime.datetime.fromtimestamp( - file_time) - info = zf.getinfo(relpath) - wheel_time = datetime.datetime(*info.date_time) - extract = wheel_time > file_time - if extract: - zf.extract(relpath, cache_base) - result.append((name, dest)) - except KeyError: - pass - return result - - def is_compatible(self): - """ - Determine if a wheel is compatible with the running system. - """ - return is_compatible(self) - - def is_mountable(self): - """ - Determine if a wheel is asserted as mountable by its metadata. - """ - return True # for now - metadata details TBD - - def mount(self, append=False): - pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) - if not self.is_compatible(): - msg = 'Wheel %s not compatible with this Python.' % pathname - raise DistlibException(msg) - if not self.is_mountable(): - msg = 'Wheel %s is marked as not mountable.' % pathname - raise DistlibException(msg) - if pathname in sys.path: - logger.debug('%s already in path', pathname) - else: - if append: - sys.path.append(pathname) - else: - sys.path.insert(0, pathname) - extensions = self._get_extensions() - if extensions: - if _hook not in sys.meta_path: - sys.meta_path.append(_hook) - _hook.add(pathname, extensions) - - def unmount(self): - pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) - if pathname not in sys.path: - logger.debug('%s not in path', pathname) - else: - sys.path.remove(pathname) - if pathname in _hook.impure_wheels: - _hook.remove(pathname) - if not _hook.impure_wheels: - if _hook in sys.meta_path: - sys.meta_path.remove(_hook) - - def verify(self): - pathname = os.path.join(self.dirname, self.filename) - name_ver = '%s-%s' % (self.name, self.version) - # data_dir = '%s.data' % name_ver - info_dir = '%s.dist-info' % name_ver - - # metadata_name = posixpath.join(info_dir, LEGACY_METADATA_FILENAME) - wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') - record_name = posixpath.join(info_dir, 'RECORD') - - wrapper = codecs.getreader('utf-8') - - with ZipFile(pathname, 'r') as zf: - with zf.open(wheel_metadata_name) as bwf: - wf = wrapper(bwf) - message_from_file(wf) - # wv = message['Wheel-Version'].split('.', 1) - # file_version = tuple([int(i) for i in wv]) - # TODO version verification - - records = {} - with zf.open(record_name) as bf: - with CSVReader(stream=bf) as reader: - for row in reader: - p = row[0] - records[p] = row - - for zinfo in zf.infolist(): - arcname = zinfo.filename - if isinstance(arcname, text_type): - u_arcname = arcname - else: - u_arcname = arcname.decode('utf-8') - # See issue #115: some wheels have .. in their entries, but - # in the filename ... e.g. __main__..py ! So the check is - # updated to look for .. in the directory portions - p = u_arcname.split('/') - if '..' in p: - raise DistlibException('invalid entry in ' - 'wheel: %r' % u_arcname) - - if self.skip_entry(u_arcname): - continue - row = records[u_arcname] - if row[2] and str(zinfo.file_size) != row[2]: - raise DistlibException('size mismatch for ' - '%s' % u_arcname) - if row[1]: - kind, value = row[1].split('=', 1) - with zf.open(arcname) as bf: - data = bf.read() - _, digest = self.get_hash(data, kind) - if digest != value: - raise DistlibException('digest mismatch for ' - '%s' % arcname) - - def update(self, modifier, dest_dir=None, **kwargs): - """ - Update the contents of a wheel in a generic way. The modifier should - be a callable which expects a dictionary argument: its keys are - archive-entry paths, and its values are absolute filesystem paths - where the contents the corresponding archive entries can be found. The - modifier is free to change the contents of the files pointed to, add - new entries and remove entries, before returning. This method will - extract the entire contents of the wheel to a temporary location, call - the modifier, and then use the passed (and possibly updated) - dictionary to write a new wheel. If ``dest_dir`` is specified, the new - wheel is written there -- otherwise, the original wheel is overwritten. - - The modifier should return True if it updated the wheel, else False. - This method returns the same value the modifier returns. - """ - - def get_version(path_map, info_dir): - version = path = None - key = '%s/%s' % (info_dir, LEGACY_METADATA_FILENAME) - if key not in path_map: - key = '%s/PKG-INFO' % info_dir - if key in path_map: - path = path_map[key] - version = Metadata(path=path).version - return version, path - - def update_version(version, path): - updated = None - try: - NormalizedVersion(version) - i = version.find('-') - if i < 0: - updated = '%s+1' % version - else: - parts = [int(s) for s in version[i + 1:].split('.')] - parts[-1] += 1 - updated = '%s+%s' % (version[:i], '.'.join( - str(i) for i in parts)) - except UnsupportedVersionError: - logger.debug( - 'Cannot update non-compliant (PEP-440) ' - 'version %r', version) - if updated: - md = Metadata(path=path) - md.version = updated - legacy = path.endswith(LEGACY_METADATA_FILENAME) - md.write(path=path, legacy=legacy) - logger.debug('Version updated from %r to %r', version, updated) - - pathname = os.path.join(self.dirname, self.filename) - name_ver = '%s-%s' % (self.name, self.version) - info_dir = '%s.dist-info' % name_ver - record_name = posixpath.join(info_dir, 'RECORD') - with tempdir() as workdir: - with ZipFile(pathname, 'r') as zf: - path_map = {} - for zinfo in zf.infolist(): - arcname = zinfo.filename - if isinstance(arcname, text_type): - u_arcname = arcname - else: - u_arcname = arcname.decode('utf-8') - if u_arcname == record_name: - continue - if '..' in u_arcname: - raise DistlibException('invalid entry in ' - 'wheel: %r' % u_arcname) - zf.extract(zinfo, workdir) - path = os.path.join(workdir, convert_path(u_arcname)) - path_map[u_arcname] = path - - # Remember the version. - original_version, _ = get_version(path_map, info_dir) - # Files extracted. Call the modifier. - modified = modifier(path_map, **kwargs) - if modified: - # Something changed - need to build a new wheel. - current_version, path = get_version(path_map, info_dir) - if current_version and (current_version == original_version): - # Add or update local version to signify changes. - update_version(current_version, path) - # Decide where the new wheel goes. - if dest_dir is None: - fd, newpath = tempfile.mkstemp(suffix='.whl', - prefix='wheel-update-', - dir=workdir) - os.close(fd) - else: - if not os.path.isdir(dest_dir): - raise DistlibException('Not a directory: %r' % - dest_dir) - newpath = os.path.join(dest_dir, self.filename) - archive_paths = list(path_map.items()) - distinfo = os.path.join(workdir, info_dir) - info = distinfo, info_dir - self.write_records(info, workdir, archive_paths) - self.build_zip(newpath, archive_paths) - if dest_dir is None: - shutil.copyfile(newpath, pathname) - return modified - - -def _get_glibc_version(): - import platform - ver = platform.libc_ver() - result = [] - if ver[0] == 'glibc': - for s in ver[1].split('.'): - result.append(int(s) if s.isdigit() else 0) - result = tuple(result) - return result - - -def compatible_tags(): - """ - Return (pyver, abi, arch) tuples compatible with this Python. - """ - versions = [VER_SUFFIX] - major = VER_SUFFIX[0] - for minor in range(sys.version_info[1] - 1, -1, -1): - versions.append(''.join([major, str(minor)])) - - abis = [] - for suffix in _get_suffixes(): - if suffix.startswith('.abi'): - abis.append(suffix.split('.', 2)[1]) - abis.sort() - if ABI != 'none': - abis.insert(0, ABI) - abis.append('none') - result = [] - - arches = [ARCH] - if sys.platform == 'darwin': - m = re.match(r'(\w+)_(\d+)_(\d+)_(\w+)$', ARCH) - if m: - name, major, minor, arch = m.groups() - minor = int(minor) - matches = [arch] - if arch in ('i386', 'ppc'): - matches.append('fat') - if arch in ('i386', 'ppc', 'x86_64'): - matches.append('fat3') - if arch in ('ppc64', 'x86_64'): - matches.append('fat64') - if arch in ('i386', 'x86_64'): - matches.append('intel') - if arch in ('i386', 'x86_64', 'intel', 'ppc', 'ppc64'): - matches.append('universal') - while minor >= 0: - for match in matches: - s = '%s_%s_%s_%s' % (name, major, minor, match) - if s != ARCH: # already there - arches.append(s) - minor -= 1 - - # Most specific - our Python version, ABI and arch - for abi in abis: - for arch in arches: - result.append((''.join((IMP_PREFIX, versions[0])), abi, arch)) - # manylinux - if abi != 'none' and sys.platform.startswith('linux'): - arch = arch.replace('linux_', '') - parts = _get_glibc_version() - if len(parts) == 2: - if parts >= (2, 5): - result.append((''.join((IMP_PREFIX, versions[0])), abi, - 'manylinux1_%s' % arch)) - if parts >= (2, 12): - result.append((''.join((IMP_PREFIX, versions[0])), abi, - 'manylinux2010_%s' % arch)) - if parts >= (2, 17): - result.append((''.join((IMP_PREFIX, versions[0])), abi, - 'manylinux2014_%s' % arch)) - result.append( - (''.join((IMP_PREFIX, versions[0])), abi, - 'manylinux_%s_%s_%s' % (parts[0], parts[1], arch))) - - # where no ABI / arch dependency, but IMP_PREFIX dependency - for i, version in enumerate(versions): - result.append((''.join((IMP_PREFIX, version)), 'none', 'any')) - if i == 0: - result.append((''.join((IMP_PREFIX, version[0])), 'none', 'any')) - - # no IMP_PREFIX, ABI or arch dependency - for i, version in enumerate(versions): - result.append((''.join(('py', version)), 'none', 'any')) - if i == 0: - result.append((''.join(('py', version[0])), 'none', 'any')) - - return set(result) - - -COMPATIBLE_TAGS = compatible_tags() - -del compatible_tags - - -def is_compatible(wheel, tags=None): - if not isinstance(wheel, Wheel): - wheel = Wheel(wheel) # assume it's a filename - result = False - if tags is None: - tags = COMPATIBLE_TAGS - for ver, abi, arch in tags: - if ver in wheel.pyver and abi in wheel.abi and arch in wheel.arch: - result = True - break - return result diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/distro/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/distro/__init__.py deleted file mode 100644 index 7686fe8..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/distro/__init__.py +++ /dev/null @@ -1,54 +0,0 @@ -from .distro import ( - NORMALIZED_DISTRO_ID, - NORMALIZED_LSB_ID, - NORMALIZED_OS_ID, - LinuxDistribution, - __version__, - build_number, - codename, - distro_release_attr, - distro_release_info, - id, - info, - like, - linux_distribution, - lsb_release_attr, - lsb_release_info, - major_version, - minor_version, - name, - os_release_attr, - os_release_info, - uname_attr, - uname_info, - version, - version_parts, -) - -__all__ = [ - "NORMALIZED_DISTRO_ID", - "NORMALIZED_LSB_ID", - "NORMALIZED_OS_ID", - "LinuxDistribution", - "build_number", - "codename", - "distro_release_attr", - "distro_release_info", - "id", - "info", - "like", - "linux_distribution", - "lsb_release_attr", - "lsb_release_info", - "major_version", - "minor_version", - "name", - "os_release_attr", - "os_release_info", - "uname_attr", - "uname_info", - "version", - "version_parts", -] - -__version__ = __version__ diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/distro/__main__.py b/venv/lib/python3.12/site-packages/pip/_vendor/distro/__main__.py deleted file mode 100644 index 0c01d5b..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/distro/__main__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .distro import main - -if __name__ == "__main__": - main() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index dbe569bb3f6cc322e03d735b4bf9b684a8973271..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 981 zcmcJNzi-n(6vxkwo1{tH{A`nUK&%;Biy!KQkU(LmR9dNJddta)kM<frUv#!ZD;D@G z*cjOOTbNmHWn!!7P^lC5+(t?TjNI_iyRY9*zx(F<HD=G`^ZV29CB}ZxWpUg)<LcZR zpIF2qCuZn?gD$vOf)aY*;R>u^8Om6J3Ra<ttFVeSs9_!I*nkH5;Nu#sVH29zf)=)+ zjUDJ<7rNMk9<IYWZomfip^pO?IP8Q)?iU9(h0T0X8hSq+TYfk&y@SJ}*Dv<>;MIta z_Kx2i9rC@AX)me!$1h20ElG#Rh10%F^7D~QGcCt?CRJkUoX>?$t;xA*jB^=BJjrn^ zw5d*1B$5z?=|&WyxE8SpQ^CV5(|?FEd8>>oBjXj87t5(IotP@}B7RY_6{q9-sqQI7 zw2$GL(u>xNk1|=hdPP@FmEKRYEEHL4IXT|8duJDV<!)r-FJ_;GI!lLrZFkSKM_3`0 z301->f!>I&6B-1cutsPST7)*CL+BEEgmuCOp-&hPHVIo62g5B>zWu*{tzIF=|J#D8 za301n=U>^Ct;TM2aH>!Q7-s1_7^z8)BFWMqv+F<6A#SIcoJ@t@j?}v(R$(M`Fc--@ zh~+q#U1X;!d9w59agfSPY|p~UG&~V$Fq5;uE;Nah4sPcSIG2gcINzCF+*F^Tit<=I s*AHzA^w!f|i_4PZIM?o`<6g6W;EF!{+8xy050%TOthx2Et{>RY->*gu8vp<R diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-312.pyc deleted file mode 100644 index c4faf8f9399fffec86a24148abbbaf926f3021e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 313 zcmXv~u}TCn5KT6VEXwtIU*HORgW8H%h@~H36XIsL4ZBH}B)76!3;uzfz4$41b}k5l zmEFO0SDD4TSIoSbdCWZKeKOf45#`H6brJK=SZtAO$m%GPXCjHD4bk+5Qi6$0>O(?Y zmJp<G8zCh<>sg-u(%8u9kZPgKka0d{&aZPe>`3K<vyMf@I59#a=dWZnu2?&$tVYlx z_zo^@xzK2Whky;vozR63s;to!(%zZI3W*LnG#xbR7TP{k)|}3cPr$2yMJvi$%+W)u zTHsM8t%LvTuyr(R`*n7vtz0yC?#54y&iyooC8Lynk^OJB_jLck4nEWD@oLFPI(1nb F{{gQ_R^0#q diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-312.pyc deleted file mode 100644 index c74f8ce10fe3e1254b06cb7e652969cead658913..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53775 zcmeIb4OAT0oiAAZNkca@-yo1s2@uc-8tYra`Y-}X#*&aDWP40(qo%7tEdfoc8cAT3 zI3Kfv63-EuWS`I^c}APrH5z+g@XVYSd6J#TGjlT8%$_~8TUpv2zq5Mp<?L>D&%SMa z%sS7r=gj{8_f}O`HwBV4^1Ru1wj`>n?!9&Ee*EwM`~K^1^Yilr9KnD2`sqKpB?$kX zZnVRtUfloJHbJ;5NJ5_=StRSQrO(2Ct$kMZYwNSIUwfaO{W|&_?AO`nWWPCmIqcWf z=VHIPeYyCx4d;!x``ja*KF>&gU;aozU%`mC&pT4sS2$ACS2R-GS3FYES7H%z>8*B@ zF6}F|2$G|(!YUjVB<D8-DJN9=4%$XXUnNU*AvM>Kx+Y{lvyGQ9p3m$w-tlWGPjbIw z<=1^{Kf`k#DPMnXom9|QBYCAlspxywzV*2BO2zD7$@d(6qEspshb?^@tU}0frpu%a zW$#$j7Syd+rd%&mKO{&M|COb0qf{xak*Y#9Qnj>JS~r-}*C6ecYC?_D`cQGGiT(}R z)}Z1+yCi<Y(dR>Y)1Xz_@C|!kv$RjDWhI-CTZi0D(tegwuckVsjYw@lIi8YTV*_$q z^<1i@5h?zRlqRIKWu*9!@|4<+X0&6odc6tPTQXX(X3#0Mp!8Oh$Y*`Avc6cQR+Qbg zEY*+H?aNZzkh)`8>QhMFDQyllA%|MN1^2rQ_gitl+i<@P_w9!J?YMuMLFkU*JtKSj z_F4o6hr0oX?K)KK!(8rrN1g7z{n9hi(|GQgP=~bVY?C0!F62L><y(Xa>x8vV2$j_f zveP1j%KJ)R7G^AOe)+s`!S=Fn-lFE^tMA&0ckR;OwfAM=%>!CVUq|5Y0n&LVPlv=) zr=+kFl_RH4iDQA_*}zapY%-)N(ZHyrh=UPXJQ^MyzaVx|>F~gKG#nZAiDPo)Tv!Sz zdErqM83|CT7#N6*N5v>A=Z~-#sE>%@s3?z*Dq>``MO4Ovr^SFG21GeD91aW&hw?@O z!PDW<P^%mYNR%M*)`{I+Eh5@*E+i}T3d8ICd3oJYF|4o`%AsInWF#~yg(TEDHXI0s za2I9me|{o*Ix^abSIgm{@MvH-uYGKyeQ<m<*nSEnqtpTaFm<xu*y2+n6`_u`i0C$T zK<l+QLLC^1$e}!~Okg-1o$!kt7=__zNFK$AoC}HJk+EUc5I#Typ<rMnB#wrHAw>zu z6Cx#yD<P3LF>kAXyC{Xm(3wCK9f_Vs@3a@Rh?o$ypt#k)3*8)voI@$J3$Kg}g)s24 zU+j)5d8k2R@4(1u&x<CVrtY2+&(ll{)4)#{->!s5gP}a$GI5K42YbK%(osWG{9<o3 zJUrY&Ga-k>0RBb-qZ48<poA1mnRxzmICwfQ5TtI4(TI4wmrt(_8wMakmq$ZrzJyvs z08_OAVMQ4aiJP}>*^;;CbTm4qw70blj1MXPF*dvYh&<HB%21Jgr~28<(+p*T%x`Gb z_4sm=wvN$>q^mP9JWSA*w0DJr(WI*zQ^)RI$H!>q1H(yIZ|F<oAq+**c`|e%+I>9f zI6014P1;XRjD>ubWG?+m^!%h_vwxTWsi3;D*^f$(g!?VHy()wRP)niD`hpO$g+L$o zAeCKN^(z})P1t>or29n<^{j1<k-(XVoOFzYNAcqs7!MCi{iEX}10lHwWnKOKqkygc z{$yT%|42j{AEs+hfB%=p1H)>L4J$b5?e7najz*#kB9;FB8^V2R=%-_Crz0bwHY{c3 zTw7NpI8N(FX^V!2Lql?4q*aNAgJ(l>s}wmuIvfc|A-U~bX!Km$aCo4N&%svz<}GbX zI2vkI5sK0_79MNsM=>cPxA6t7{$SeV0=$-;_ToY*#_4y3guCGD&+$`n*=>87T&Wc@ zAJu1&{m@Z$V5HfovXQpyBkf=#?eyhf;sJqdn5|(cnWJKxWWIXQKNgUqO42?YJ{wB9 zf)Oc1BiiG0%G7GPgifV&Dx*_5oml58=!*4#D3n~SojP%$ti=f(cDcWPIFVoY^`nWB znz+3tk(dAV?nFV+H;(ZK>6xVag`V!;={(+ZsH^+Lq`fT^4JPv`>4n}CN4pPDqN{CO zk!da_^CAk6=x_*YFX@cPfgnKD6&VYSDnK+oYtkASp3K+oTTyN-X_rrjh5<w6nDLN2 zCWn<!`YNC#tI~JrD<vdjbduFTHK&2C^e4|p<g*|iw0e@|*_kUn1mrz7j!H1HNhg13 zvZHB#`xjsHz1sYWugTx+d!@;@Uu;HN@5!U0Z-3JlUy=NqUTF=qPNIb5V_6|3fS$`@ zGxGhLe3R8pubkiH`(kVVt4->VOsO;KtM?U7dV0ru4{C!o=?Tce)9Jeb44{5j5JU&l z13OtT7y?KK()mM_A4%VjfS!ia`GvrTk{mdju92sN&!x+hu`)<uq)4yIi{vu_*-$s1 zRJ}j}A20nrUycONPUyFJ%CLT2q<}D<Jr4xks)2Zc6dDKzMzKg4ft_>@D+79YcO*2T z-xMelO4M+l4<x9Z)w2u3Xvat(tiLT;J~%!+oIz3<ilPaQj?1G#m9+(c3xWfGgevb# zI9(N@dfpk81xK=eNS3HwyOFH#+BBx$B1D~9`k7qqD*ZbpXsmLt;Ijw5kC*0&IQ)JC z-D__bH~V+^pUPudl&!J~9DkWG3QfLK#D=5^HxXe`IUN}vmcZ@|6Ped5!y=S8>q9V) zWik*Z&H=^4BjWjR^t4J>8x{Q#6T-cmTR|iI;`40Ti^Nf6HaaYwYDw2eEJ3@<{`u93 zKgGy<=2L{^(6v!adq4uaMT2pI&7F~`8rZ(zxGZBKETiv?)r%6<WObZ6)f5KpLhUUY zW7i^TSk(uHl#K%j$p{z|;z5UpBj=TN-hgIsuIkgLPPL0-_n_Ep4rt9ZD}#Yy1+O8d zR1PWQ!%;CZsE$NtXE8*6@i=iX=YjvSp2!+bHZbadP<ym7r1qRNzA5WDt(@Uet=p_G z^elJ`IRK_EG$J;QD<Iy0AFxoMKp5H6A#hYaF)#=`O?^^(lEzHhc#51eV7xQRrTd=M zBK`Ghlc)t@!sUbDpfOaLJSYvQ2DV_)*)&n@I%Cb2%V%Y-mGQB$h#U=%4v7JX1_Me+ zpQLb9p`HU$&?LpsMkx@bK|;R>l_=mhCqytc7`;F+%2phka)rT|#$}^CmIewFTSzsq z;Zq{xG8j{o4~(*hwBG2fGiSY#A7$^sA_H$80Sh}g2!0pv&RfIbipFCZe+!-#jSEIb z6>!}2L?9?fzzdH6Aj4P|yauf$;V5gEE^RcSPL;0?L&5<9VFHv<SW$q){62MnI`A?) zfx!tVkeNt^)7nZM#UxTAF~cORp;L6XY%#DVVBAkfBs3l(-f(!5jgmn$6G<e*v|%s; zcpDexFh*IT97x(Y2UTiHK!r_$uCd72_;5hZ9x%)_LDJ+eR>8RsMY%NBkBDl;Rm8w1 zUj|-PTNIX>d@WpviD)Ra2@4Y<np%Qz1X48Y`5U5RkQVa58wJk}ht4sM%LQ6IiV*~F zNmt3@E>-#i_w*9aO6G798c7x}$ND~t>_@!{kxNl#OeU$aWIBDHGPdIMhVbBkMR4T* z-m$M9OIfYCot6hqA-6hFQu=ppr^ET6K=70-xi`k#8y6e)#NB%r?Ry#T8N{>tLCv?} z?|w5*Akcco8A{DMG~ETrtR?X0Zk5ccq=TT1j}e4>j$%ThMmbo9Di&hd0snJ2%myhA zcq+Uf%7Ut_<)>)KoKOWoBK>j(m;fa9j%E#jn_CFsQZp5B%^|)<fIEoBt8x(m7N(l5 z9^^<7tPHlofkTEksH-bn<vXE#AY7{UT<xHa&rq|bg8>IM8pWTwMj7d&C8jklyY(7b z+?#QTV#e)iH>~enOcg})!4Gz?wvrXdtl_g(Upqc9J{ldbRcjYtV7IK|TF!s!SzU}B z<yj<_=o!R%NY4UW9n?h)@hB;6cv;S%>!mw^WRLgqEY7RzS%(<w&a)J-uzH3l_P)@2 zkXLGaOD~gj_yd~Yq&`Hq^bpSsj7*LiYU>yYOalEH8c7m{u>fw3*-WOFBatXCbAUvA zy5+S8ha=+>Ljf$ilWtkvz@EHB=mN0*Kty}PL4Ip|0~b@Y0^;G&=*dXLSRgzw(mxhC zACk|W8$q$|1INVY>GsHr$M`#tjxu@;NN4ng3Qmf>OhVwxsg^Yr+6uKdys5`<&nw~* zl3vj<CNODP5SAbashP(}cEYW(ox~Ij4~K@;*?V5Q<rR#DNjlT(exBX(EIFWzk-(#7 zo=|UjCYP-A=Z-V!nZH(Sq6M#}WP_lOKduDB0K4#DILNB#)o+b0*F`Y?nqEyJ<5gTB zj6;Go&;1>MR~GaQD3aE|<AA;cy<Pmt(NNToCH91(de)#E3K{Ya;a1NZ2}`5lq0`#4 z$JARrp9z!N3$X@CwlsDp5WbMk6~&J3-{H*}8qdf$j9V2vSpMVV6ZSZm{)x!Acsc+b zEBFawiNJ$E1*)P)uDI55W_K3|iA1_#fL{c77zh_!CKri7Ji@%XL2y?br<-y_IzOm$ zodLW~<pEi<(v*c5oye%lL5IX)V*51819}9O59$Rm2o5cZ9zd_n)SH~_u&Pd}b@2>{ z1f+aB)vuC_=H{c3$l38R@pKppOQ4YnPLJfksDf8>eZ11%+{|UBLt$Boaw-TEkIqL1 zh{m8rgK}hq(IqZq5v5VN&@>So3k3nwA&IpsB17}%XHw1})hY(gLFQ)~ds-l)k<r%B z$QT4#jkYp2OqbngV0n&84{N)-YQ;d5n-=u(G6*z-;o(q=Ci*RZT&GkR@XV^XXn;Nr zOt2n8vC*$mW7ZRqL>bb#WYo?(1@uBP2p<_VKqPKXOHgM<txGgC@FejJ5DZ9K0p`QI zG2FbnXgLXS3dtYTi}ZM7ZjF=1fpQ>(X@n@oxQ@)8VEQ;)t`90N#p;1M18)V4Lt=&m zKpJ?xdjrFP(X)!!#I*66euB7`0pf9(gfTjCJ}?0`7O&2%ZX9xltOU^}MXwJFPn8R} zbweF54q;;uA(0!BU_3!1ByoH!GOCXIsm$l11U(91n?cpsxI7lY+F-SzubE|$fX<OJ z6Sf!5PUs>Ge=&GQecj_4btz%g-y(wLhH-|=T`+B^+84}ikTGqXYKa=_m(4@Mw8P*9 z1l=H3(aK$3mBvwuY^H&D!puB|9-(|TXp?n|0K!;|?pFp^E_Z8?Mc@Rkh$AAtp3hSP zS#@9sIv0+ND-ej&FsTlkzVc1LnSnc(!F*PE2e^BgwAFH!KAWY{>F4-Uig1FcamosD z;&S_?_HXT3v{x`eBI!g!qS1+<uGK?P5*wI6!3`s;3ltfeJ4@g!)PJlS29d(JLN#e3 zYZAFYA)X$`s)yc^8yZ<X8R7(Klz4-)HAw6o06~30k_Loqo~mMp=2FwB@ZoC;`G@>s zEoVnL-K_O-Y?k$!s64J}owUjbpK7(SB^ek4!6(ZYYqLq!;!gi&|K{yaZ55k3u~dE9 ztCo`soiv;TsA=7LEUJJ$6GdQ6qRJkJDr5}>)7h!mO%z+%^2j6_JsrmmJ~G)bui_s= zII>BH`5X4oxbCaPh=fQHY>@vVgrXP+K*U3%=}eVr06c<-RY&3Z69-S8e7XNg3`R%^ z%3)^mG!Cl{=PQ!XCp!{Ypel$na3cJ!>liZtfRB>C?3!x#sEejQEMdfH<<#!c*3Q0K zy*4%#P@t|n8DM*WrZt`>0|zGUG@&;v@@_(R29?XxxR>cvjYNeEfxv^$S_lvBxwL22 z8F#N=w6Eu=&^{1SqCulk1GtPMLek_sOtUg2Oj$JF4yIk{$ytsHH3Xve^7F!m+H1@Z zqBiy-!%}SgYj^ses?}7KSt~w`{PYKnI&ZuI|25cPQv?#pYE73XRzYJvRosX-icQA? z;jsu%p}Nd^Vddshf~wyjGRd4-ba3LjbA`j6&fya^4Ti}Jg?t*=%ZW~>^ELG?hMmz= zwSE-VS#rO4@InBbAyb+fA7<5Q6`<<@V2umlnqZ8DIvVUW!?I~bQ(zd3nj%gx)I!Y| ziGUa9E#w2E%?=+5v_Ryl6>*n;3o{F-GzlalV`#YQ*w}%zc3m4NCP1AfX$gJJ=w3Hd zoGI$ufboN{1Ez<I1gf_9JTr`e>D15*F@Biefe_?5bQfIfDDk8bSOOplbGd`z0U7Er zRT)Ou6Z$yPTj}%2yV{{^RkVH)S!$+r*9;C^H6~~;VM=1Kl+ew?8ETlbVq@qiG>%NO zL4&I`l+BVluqtLIK;~7W2L@vkCxdB-)TV>O76vVQYE`ooy$(hUE<NY~k!CqmD9(6o zdi5BgAPbyD;!`kPP@Cv4$b`COFIk0cz&uk$%)^HZmf0PABq5XI*No2SV~FwOKo5T| zh#k<ZaLFliN$5fl4O|9|sD1I^iQewxJ^h(tp^6l<*>E-#%_gkI2~Md$8(GvPOCn)v zt=zz_89xAsBo*mgcoqfA;2Ah90rEAGN9_ZH{!CtiOOKEC##Pw|HXh<~X(fyWPi}S0 zB+G`2BezvZs%p)7v_^G3loL@~M)Pfuk(h8s!aULM&(K1(HsZt7c4`vOI*{WVRz~b) z=AlGHTU4zqlqu5*mK8xEj~|fyK1TBQU)n#rV{TjA-Lz<L;)awbCHKssBG%v&+zQWN zUWF?aCRQN!+~pv{1ke1*T0~%)h)f=iX@9auF~PH^b)&UzTF<g0vQnCF$tj)DJ#~t` z_2G|G+sqy}w)Ua5WE580a0p}u+PgHcY4Dp(C*Z6KFGL#XObe-s?oP4k;QE*hW>KyI zOn_HpkVEsY0uCj!JedH8{KWt`YncU3jJd_R(zv@}(cbW6;byxD+_0(9X~gQ#qYBQP zesdIqRi<(SsyLeEI*~!~fyy-!%9T8sFGn^FFhg@}JdNr%DH3f}LPWPov!zj)41xV~ zpUh-_1|Z8Fm^PyT&`Fa@r>|q6@2itq`Z-VP4zo$61)~qrKlP+$yj-1B1&-OHoQ3;m zIIBkdvTRll(X7&G1|uzZ(H;46J~1uUR+9;2xJu&@{)y)=<K61?fzy{Eg+Lw77N**w ze-3L>CVk_wIb(@*`aT9%L$7=#u8+Cb&)MVfa<FgY6NzH_@%a7?UOZ|f$^lV<F+XHL zT4enp`l9k{WR249blHU|aiMo-HNn)YgrKyAmPpg*6M|fcwnLbZLqh=>`!yiRa8Ck= zNvtYTg#b~L3pZ%)5Cjj^xeJ0B356tUFbAXzNy_jxR*O;2Vxl-mCz)i~CI{kSHPXJ! zE@e<O0;CMGBA7I|xFL;sNNTi1GuC9W=bW?>o`)VA_9ir5Bg-Z<95$u?quoa`G=vx< zbc%K6l%aBHf-zvK%Ldz6fPDq$&!6{`%@kFijYh`&w6{Qs3`WUuwvBtiN^q1PZA(|= zKOG$z#<qh@9$-DdD_d#K(&+TZ1fhkvP#FNy6@6>pqJ7Pi1kV2^3pm-ts{ZQ+@s=wi zAA)Z<JV6hmx_zZZQK~fqM0AH3)k3RjX_hMk0025`!1dxi5tu}EqmGuD)`a5;GFqt` z5UBCVLo%S}`$d2WYpM#`P<E(Z8tR)AvG&5Q9sN7D)vAgIeT$5t*`pFHL*!=1s?v9| z(6$zZ45EQySXj8#^~^YyH*Y6rWK=x|Ng>dY09L^);lYQm5iTNWgT?eu9BxHTm^F%_ z>U5=n5U(RcS6Fj!)fSa*v7>p)l#x4CSTNSB5BZ8(UtPRqgQE&|<m9Ju(MIJfTJ<pf zH%ZBw*d>~*8J0$;AJdwl?G{)w&5XaQj=8Jj?sbdyb$r<n9@h>#E^PR_|5%#U+jyMy z?*tdNf+3lV=F8n1vymEBh`tdnjj~x)8H)sUkpltSVusCNjLC-A_<6D^a)wy<{!&3% zRd&E%ooj{&QsA%7x8Ly9LqqvGdly~N(HNE*+r>t5rfTH8J5NWB%1u)?RHZBA^35+O zlUXgRnz6;~@vMh=F0ogXn_V@_HHu|as4=6}7qgm5TW_cocjn4^TcfsQs07pZrYpP1 z$K@nLQQBA&1{)8;ACR0cB=Kwrx>PcHt4M{`33nalbQQV*MzZ-nHfp`eoYUi)-9Vc` zW;P$5Ai~RhgjIze7lPPI<Ys50#C&l=-#e}t8f5PN{!p1W3~zSc@qeU$x(Xs32*lQX z0Do*ld+7T!<Rz1)80sS+d3b$BPJPw-j9|6AS{24JW%-Op48uk+x4eohMF1;gct``q zhd!tmR39ep##|-AtzFFwRI~LHX-<fBEwf{ql0tPD$zV>Bb_T=yfgcq@nwn<o2(D#1 z#R=D{nynLQW7g-uLQnoX)^-)o8gU|1%LD1s0>UC~<-}_&0M8?xds(&=S!KFnHH$nN z*P%wO(nvaki&5u=?Ly6}McrSjGNWmH55JXV&B+{fZ$#0&kosBCET4*FH2ie>2Lq|& z9@@1rcWvBVzi6+2f*j)H-+hi_Z=#=l%<(s?2?h;p8ho^=V4Y+;iZZ98&``1Id>p6w zpi?duiN<;qGS;Im=B|6<;^gH2{yENvDu6<))SV9=b3ROJdbEjPVqd1FJz2tQTXkK0 zf#!iurG|On>!Km%ZZK-wQAj@svoRL%vu<0MeCwa_JP-$>^2^D*aq>zqh236sUZzux zVa)Ov?5>Ns*BRXsa&;HXC#K%|HV|0m7$Ty;km^fGp15Fo)W8u;74Rq+o7K0vn5ts! z=QTsGwn2jUAia~PPKixiO7pdgM?x^KbMKt&MyZu?%9O4t{p^cIsVDns%~64?Izktq zVo@QVZxb}?$TQ38f+&0Fb0<VJF0fUc1gIF*+Ak9P(5ZpoM^$T!41S0f&Fzl6TNmxE zoEl-a^@CO%TXm1&+xOo-F4!0_xn>L`n>R=VgBk<>t<Co8bpJnB2wHiZ9u0%D(R>&w zC5Vz=0vH(K>1Eu@blPozr&^ts&UMG#{zbe0$->ij9~YiXNZkJqNJdm-GC+?8L65=% zm;%rj34rKy%m6?fArTWWHxYMlUbJt1vH%3D{^QXxlkxe_6M%>v;Rk719-XSuGg)km z>9oH}(@rP&mg{tg+suiNnGGAbKWwq}2I0FElKP?k#4ZH5o#RRU&;mr<C&OMka*Sj_ z)H-X(9&!v>LXJTeQB1N)cEkX4AU2m%a)um;FP9T?&?Z~ShB8jcg&Y?m_2kO0A#w6= zI*gXrXSCPz=tppsLZi5Tm`SmIQ9Mrj5hx}Sh(C6RLy^t$8IaJ}7_>*aikj3_*t%q> zh;&V-`msqk813&rMf*<%$GK*U)r}ZkR2LoR5u}Of&Jq8E-o{i;S~Iy^M8%SpLAebb z>dA0Z#n5w_z6}>w;f8t!zuCu>(693WQx@FOQ|y?4GenQi#scOfo&AHvv?i_ngNR6D zhplT+K80dNMFd4Og5ZxnO;%=2s9(!@o#27{+a{{2-)g?rJl*x?kwkgLbl2}6W>_F; ziwvAeI-pby$w6XCv_sboPa}o8^G4Zoh%7iIn04#Bf@J-^P21J{H7aGSORW>0xoYPx zST5QyK=h8R!@T}IC^cn+Kd-H4(!pkC(hIv7c}~*)@c^PvVdw~sWeF!58a~}VyBwm_ zAv&F=EE}}<3cZ+SlI;k`2J(LFjKerqEFVXf@f8}z19;{QAyHC3vwzX^>|AKR>xV~f z9GTyH)4N#zY~1tg%>IOb%MXWc3@rrT8D8|XPj}ALU2VD2G8=vC^=q%kiZ|iW>F3y> zV?kubMWQBP>vVs=Of8dX?Bqc@VQaV`57Q}24MGcwt*UWqTPN<mA>6gvay_X$Yi{N2 z>3Q4S_<V3~GFG!CB_L%XdY^t$E?aKJtdbJ&Grw)Yc4IfYyjk*qQdr|ytu&PS;Z?8h zzk-HkqJ&%_{ZHD4We)_w5P&`8lpOeT>M1$6a<V*^o|Y?F2MeS;1S`xz7)mEXEV>D0 zAVA=D$peIv8$v4m)59_5qimj9wg6?_(hkYXN;-jx3X$uPcCwTrHPtB<BQ+o8cuIDS zCCDw%bE%e6q<Aw@%8*i+ky4J7BDEbAXh*SnU5V?Gj24sv5w1b$GL$H1ebK@(R-tUg zveas%RxV3ji_|sCQr9813aK=5HMp)uSVkwir@)o=zO{yX3SPO+a9@l28pC}Z?$^Ui zncd3zZ`iek-M1lBD{TzbWtFi@4TduHCUrC#@;9<N8dO-we4AZrGL&pIsmW)^Z({k> zcLc=L+vw9%5gJoZZDw!Xw8C3k3?*AovNhDIjv|6%>UH={+Ji8edVZVq6dQfxEZe2c z7}uvz=N6MZgv->Q-aKLT?MfE0ZQxx7XM=zTtB#SV=hc{!8L9zpN(*F12vPY^<~Oc| zPT;#~$vzDiVfZGHQ#{4NYaJSn48UHip;9jX!HgUn#(qp@Wo7S|LW2Pc5JXf5_TBI# z-_{tAhj=VJ@^i+<Iy}gn#<_KrJ$Z^EyF`Y=kTKz-#%VgV`5Mv2-bSXoKcy-_xE08> z9H+tuCh!VoG<viqnfH@54dj3Y$YJ8InO!nN<t;Xa{UJZ&3smlvT>V)^+9<0*JT>3? z9<~K^7}iU$Fsf-j9p921>(xEZ>MlsbJTQ|Q)z2q_cl}xHTZP#I)s2dXB{<IJ0F%V_ zr)p06^d550!2Sc2WzB_!6ya<PLOyS`=2pX|j4I{SH0#ycW&qw+iEsP}a6><K^K<AR zn9Xvwru}~DV#}SSk*)0z43D0RV8;Yv<)~gLCSo`rfu5urdrF7LrBFZ0B#j0GvhOd` zma@cr?GdI8Ou8s+1b765d(<)_h;@OWGmNtfV$+a*5J|=o6z=~uNG&)a2iP_}bIO6? zMLIvsIGQuYy3}%0i1@7SQW|wcUE1@gnF77B<FRYD8fy0FwF&)tJEp9%Ys!ju>F*uA z@fdv&&g5yer+=fw*sw!u#l@V*s+;0NW*sJVyB<<E>EyDGshoFIE>v0n7*D(Or(IJy z8Dp3;<ucw+*)CWVD<W{)km}YNftk0DTQ25K<;q1<7R5egSFBS`*&QX$h#itcdjt4r z%U7*amQm|eu17#E`C6GNJJRiXx;|D@&ab+roG7WWY>1PpK5IzvIRmHh2wSzp1(Q&k zh11ozR!r-w;U94*fVBz3qEU^jDW&zw(k6Z*t|7lB$YoL5AFomgw!w!{Ar0xI!yM>Z zV1%5ZcxMz~mSTdDEJ!YVXh%jXn6`~j7!&(oWYh?pR&~00S|kOs3sXfPSX7&_vCPwf zwm);%y9lHUm7LOOEmM0^A`7~gMoOeUABaSTp*-*8`=%I%rs1Qv>8%mPQzmFm)yje> zV(3-$qz39TG}F)|7UYk5VOAN@0&)k-cD;aHOHPk)a0~@m&}u`g5O?u3-?e0Tp>9w% zdkYhtu_uiwHw;aqfiYNg2^VMB7EYqo^fqGv2}47Su88c}em-UB6u<!QOUE!XwAAo^ zL|n<*T}Q#<;3dge86Ow<d5md8x}izYh@m;!3!BKf(xh$VrlQ)sHTqA`q0bNVjDx!u zAd3pJHqeb8k(PO=rFSth>js+$Ln90w)u$x8hSjEnGcLL@@iR|}iP{dJs<D1gd|Jrm zgY%tAh$6Yb2Wg15e4ZXLjEUi`d~VDe`RMaw^8B)C!5qSIag^ejum&31WA?bZYjZFH zwbjati$7_oD#IAP+PrFv4C8QC!$7P+mI(-`#_-OSkq+&_r-hPPhY5}`)JEl(VH>{0 z*qWnIl`6|m6STZ~>b0T170`^v(k;U;fdR-Kh@Pyzl9LZA4b~o8mO+#d04GAI#PAX% zuy99wJ}8PWlU*`sAKMcrru}gdcvYnV&8JQo>caK_X!9sSCjwf+7nblbbz+nPyO5=q zCSw4R_gNSewv+eNsdRS?=*&oGREBl6nQlV3DQxEFoUJzFhK6zT-|A#WoAIn#R9VJQ z*~2M}`JAgTZKx@mh&(?&FdPnIoVaje;1l%l51a&lK9mN66Av?MPHc#O%5J<C_*2CX z%S9s^KJ)6*ZmKld9Q-~nWc{DAXWCK$H(>x_j3r#f)i}fq6{HsxFR3r4v_hU(Sd6DC z{bsOQ#1a8;(ykO524x}owV=&JqK!){8-=dcDz&Tu0@5v9rCl6>X1B~x3lPMrZCt+m zS8JtS+VF;lwlfobWVaP4%utzWThlnq;7(%JOhdtRs|>Z%GmnnO37eZBZ$o{?z7PWh zfkV$d5kP!v&6kBk21OVTT|i85=FW0Zmf?}xE_P??!Ssf+7|=R8=d@9;9TlqaoGDI` zp4`knKf>N|yjObx3&qjhb{xopKJLK?156&-%pUQQ48!QP!Lng+VKaZt3!`E3u+`qx zVHAN7I1uP*G;{$wIY?uN2w(`X#|W6ZcZ9|T1~`(q&>}-od<i5XL64JOok<(M$1s_r zet#h;^h^f38JQ$)55if4HDGd`fv<)0D#hJX+2x?9fd^qtbQPvKXu((*H@N;HY#BC^ zP#AOLLiZKQQHaa<oC9J9lZ279pNWJ=@x>3rw<3}`Xc|)k6|iLedl5-Dn%j@hMNp>v zC90^j|9EfziGxQEcJv<XKY$a36-qk83c-&oQ<1zhc*tW&kQF+O<K)ZZb|{ug)v*V7 zJ~fjSN>-??>Cd8L$qKDC*%>8ac+0A)tbVYe6jM(jwG5jccH&Ww$(l4-wM@CJTMDm| z8L113kvD|Y1*@=T!?gX){Ev1$^Bwu>`77tIPF<Ordv-o_yJFj44<pC(Z#VCL^T6f9 zmkwV(dg<tF<=pPup4OjyIb{=a^KZK<@45s}b)s&|bk{FE;;$Q;-X6L>^!D)e;e~BK z+VkF?+Z`{&8(v)W)P0=JNfeeY6^gM!@pkQw`!;K10kR)>gu>#>=P#YV{N+nuUaZ-E z+q>f@13w*lf9R*9?~f)58z0!L`wLP|p=tk&{g;LHcN+K2*l**vZpVjpdv4ZF+i$zX zJ2egS(qhe)MOXDl?wadI-rM`Z@sEqwrmU8tr|#QqB?T~l<rk##gtd)})mttdS=@7c zao2IJA1RkmvuSbNj!VZDpXpuP)2pUeAzf@+T;D#;Oa9WeHqrIc;xjL?eB7<#U(tYh zz_;NnXLK_#64YZ#c-Q)lnohRP$qMdQhs8XGXqh}T31O~445gOMWm6V#?0uc=#{R6- z4e~`TE_Vi3p_Vq`H`o&fYOR(uq-2y}ge|KKOUo#w(xa?$YAP$KfwfvhyJdOC1wsR& zmdQ@$Wew^I<^`%1&Q9m0vj)IeyGa&*hIKEa?sSUQUZz~mD5G|krJ<A$4u)i_hJ%Ka zvn%rN;nv_EMrLgS1z4(0S2E9A3thERg(tC+o$mZ?pOg#RpMLMqE&IZu__l+oHTk)D z+|EmzzA`)*NcGGV-G6}#GWpAeFvpt!s%Enq^_m;{wS462>TFc09)?_}mX`iC`z{HT z<!URSQZ2MV6?#TjsHUIP>K!CU0qf*%b!w=tA|uUD8+x)rAnJMyNM!8mBkCtP2$eGW z%Rje;kEN+QNmhxBe~Lcjw(Qdldb6;gO+Vj2uR6r^Lx!Eanfq1{>L&YRYzBH;s1pBv zZ3hj$!^A?cv3QgelqFf1y;PDmcsj@;^5AepV94X<lVwBO__7n%ll9Bcj>!jKS_uT7 zL-99+yXC@K(1FX{m%86PvJm~z`S;HM=|sX)NOa>{J-Ar%Y>0U_EO|D@JP5D9EAH9- zq37t$lRtg+{a1h7pUSZp=A{I?3bH{XEE4Q6XnhW;gi?u)@<Xzw75nMb^p)nmWJqyJ z_HWoPlH-aA#HLm97p*X!<Xf>ermX32>1d{oUV==M@9IcS4SqA8*Ucvx&+AHltv7I| z(oF&x&+BUcjOUBe&uLeW{`^Fa&ovoQ7fcjPH^+GtrdRa<&sr}TkxvYa=0gBDOxy1W z(CJ9#s+bj@7IUy*x7-M)o7K<{GQySM?>;dyz)h>-B{SzE`jo0RP8Z2L%VeGrJW$Ze zFlVDrEpYbg_t}yT7A`oM0~AZ2PLzKit-wOLj30RhrwqreTx{6mp97g}T)tewl7G)| z1WruKKEGbDlU58lgTuq9a>HBRYu<RJZ>e%~ta9^0-GUOYe0sV&QBrwz_m$nVFVE-3 zOSUX}ws15~i#l1rMv#IfARbUyk}n_;UPfg8lBuK2OFdcGbNs}yj-%au2fK)w?e1dE z#>pZ>^3mP{lukaR$x=glS9kBp6UQlw{0!l2#c;&GpsHyQ6k3UxO3rLjlO{{ey1tkC z`7W|SoIKXtt$$QP-bq{EJ^5#Kf2J%n-FS`N{<V#qm9~P-DqFKu+7v5onlFu)`loY0 za+iKovUc|6+fBRTCA$|ryYG}%E|vOXrM|`H_IT;j#uB^ZCGBv-VkKH)r7iO(<E2}S z1@^>C_AYw%qQKSTSB}qh#Y=r=+1?^P&b!g-401_broa1R3;~&gWCrQl$w(JHlXU<z z(*&-bl`;X(jJk?gDcz=<t}tB+$O0_I3hlBP-pK1RYnNRsMTke)kGh^ryUfv~<J~l( zv`yLMoGB|j3v;Gy-xa=ZqZX(ZRTma#?&P?RKn(bb+$Ntas-hYV$cj_as~GR3o9{d2 zA8m6R;%uCh$zf6c13Iyl=wR!Qtv0r_*dk)#(KH7|f-YV)(dSGDMV3BUzI;7V(_Y53 zDSwM+u%Zft{Gug~81sm8<#A8bJ;*kV32(`gw?5{rU);Do?%i?EhO|4B))@0P&O77Y zwtEgFL5?acz5JC+Uzt4@_co;9)t7(QBY27vB^660jj@u(`TTgvj(dW&wBTm_Qv2~( z`|(8KI*4jd7fg5Ebqb}GiHho_indrq+k!J*vGc=<6F0a0bpQMNf4(FB^obdJqN?Vt zmTN8Z(rin-YU@nSM<rE>n%dbH=Qhv1G}paY?VssFOTRfeBQLsmfDaZKEW;(0C@WiV zhj3nr2Bg6sz-k84`ciusFeBe&c_G!vg`i1vNcwWp7K|w$fDdzP^kv1`&DyNf|Ibjn z35T3UGeb@|;F@yLX<p@w87HDUPskglY-e<*0zL|CB;W*b#)JpaxO1)l7GbmpC5fhI z9a>2#mp=9kg-<TZnK*K2<<5|6Y}TRWox?{((N5jDB3%r1l8}^jXyXgF4f{nqc)hJt zwl3k-RzbMvm~xz<wV8EDdD=5m_SN&xcA+=UDZ6B6{j$8-GUd2vf3wXlj25!DxcOU< z4^~^TyqQb+7$=LJWU;0xyWD_QQ)ry5L+h<vK4k~Obgy0tB|P7!-r0dh^C#0$D-38< z-5CF5F{!rO-oW|gscGO@h`D0hZsqTxdkk;N-={0a;MnjT6`2^qq?3OT=~Ih;(keE6 zYVkqS$2Q`<OobWavW}uBC?V+X$R$lzbC7)ix<bahF$~N;Hii$^l3)i-9(`FRn)Ddu zavs*7hCJy|#_%D^q?1Qk#%F?gJGAJFNk<TdT~&l~a`uQJ^}Y14OYNt^kbcr~P9gCH z3=<B{GZAP_u33)b)d$Cb7L;!Q^JJp=wQ-MM7oz5TaZd}otB-l==U$0>wy-;Y%;TSr zF12;W+B$C?i?^MKdwQ2VFU34BB?{Nh4giTm1?FV5gNia;+{Rep#<`Jr;Wn20zZMi- z3eL35S>pwDsPgjhOUGxs<DQ08nY%P^+LfvlkVtVo5!F*%a&L;cH_acs?cQ?7Q_9MA z%tn{iKNVa5RDAuGUwXDC@{2CNbm^sUy*%6WVSer0>4o|q`QG#W>87PEov|&Q@ht~q z4F|PHyO!2I6<hn%ZO`UJap`o<M{X~)b>%gnMET;31>b19y7S7;*{$E+GuQZb>-E+J zTfBDLhb7x?=G@xy<NQR;`YVU;I#3k6Bt2xyuVN3)TED#$nKOq!DqWMxK`N;%i?0mL z)l(&Z)RtHy&gRY)&vm_h?E0}E9AB*4w$QOyzGM1u!dpIF!1a6C;t3({`>N{1lt@fj z-qjTuOpxo2>d4;Ab1;prfvjz&#7HM*w48yG?Pg?0Ll5M>f6;N#c`*k*j85G<El0Z| z#R+{^d-A(^95VH<nUW-^0^;f@fdx>dB5G;9A~j_Aqf3Zt1w0Olk^kzTg;LS<inPi1 zihn=*-LGG8cFV@G2eDon|3%9y3C%__hZH-|*yBUtfoKrRen^gtk10MEU$Shqy0w=B zeWbr}jZinC3&|YzSV)nH_Q@2Uj0M_L$d^(ZHNK*2kTSV`#TCta_J_2tNtR;kx}y5( z@Ri|t`^<2>ymi|Bk-PlkwKZ=&ckQ{w#*X;f1JlP6<#kKtzF4_$ep8&l@gr|}qIKI3 zU%T;IymfD^uzAKYGd??<s8~B2`optx^8B6;H|@Q-WwB!KV&UF|SB;!z1Y80@`cpq! z2+Co?-K00}NERZcOuzPD=yPkJ8!W7iHu)=rY1BnkM2dfOc*qWzqmMQ92C7pU?Hj7< ziYC!0k;|P(Fq?{uO8*$+a9>rN!t_wO<lPYSZkVf&gHN`^yv>WQ=H(0jNsk|e@%enl zFDpQhHh#aM`Ic|e>HX|sJG9cU8SDBJ41xUT^n4{w<`Qx<a#mv4O@Zs88E~;ML{Ai` zvH}}vV<K;+?wF4Wv9^;n%U89rsz1*h661=};f0hvD-B6nhEY+om9$ZlUpE_+RfA>X zyJ}~7aONzv-J`ENHGGpcG|3!%Tbj~1VzqGAE6Y$J6T@UCu+oEni6PMJ6MUJ~#k_Uc z+wS#$=-swZyXe}+A;~ywc2r11cb}APSFz~~hzeKPhlZZ&gtP*<UXV9El18QM;Tjcf zI)c`hfdtPB7i=#J=Pj6;F|(=B)bA^h%txOCts)~C6w!A+2X^^QTqj)!)4`1S1~o(W zywF2twj=EYzo5B!357^KmzzsmArx#SO|g=u`KnmSwnfjj-+t_^xF<Mr3+|A~ma&Ov z;)R>Rj}?_OWx=Lc$)@?|;w3xp*^qRnr0iaf9sH#Yk9?{S(fnFLk#J>mhr{-P-GXz5 zhz}8n&$A1&Z~V+X=9}g}>(DqG<eKQENJ+1Wn^7H_P}WSW*EuQVo2c+nlUf7vsg+qr zIv+fq+ESD>5upujHW8n-Tv&qD9<il=IUBwnDcGXX%B5HEc;uIiX9n<t0yvZZ@j1At zM0^$x-%dDy8<bp0JMG3b6zHTpqAom0ak{9gSJnlmOuh0EJYj}bsBym{&>ckqM7}Hl z^@cWyd<VWYk$`^p=#`^$<xGeCaaB#CylSbuDOOHO<#K=4-MS4+>-@2GkeA}?wmrzP zSCex<arxCXSJr&HI#IUf>Z?~?{dWI@l033Y<(b)~2uuh77%RarJZ`cNOsZw_BYjR( z4hpW$dbCUC&GzV#-Sn#XRtRld#xh?agOkla8Z8+-3$nq(!f;Zy0h`5bo7}LRcxKh~ zA80O#wPs8)abiq?=~Cmm=}Q?U9(}a`7k!96ztJ|h6lmVI8E#d&4NY&$<E=)+dzkxx zab;SPMYJzY*LpCscQzq7j-i{ZT|N=n4}M~pi9*H`Z;W|2F1pkJ;g2^HztMaD`OO4Z z{baboeJ(S>-;*)enUhhPt%Wk3k1x=CY+ODcCe=e5s4osaB~3AJ)1u4dQ!0<XI6nL* zm=fj_v-+~&=4LhK`=j$mX>Xg%v3K{UbC%(vUK;YX%ZEJuh}$sIL{gT#>to*ai!T19 zx(sK8M<40!*&_`X{l;t;eRT&|T2Tt8pnSM&q@9SCb!VQsV<MLrA1XC;$i+HD67HgF z17o;Zc(V-o4aGSrYsbY(q|A&jo3cQJQPm7gS@5ImUI(yw`LToD>6NLwMs&3LnDApD zKNMfb07RU_wsLAlMt@Dka1z%UDh5(PKZLYV-BmON#3W^qwk0pE;rTTS2jbqHi>{r^ zMd>Fu6@R6Vo{oJVaViYNL0iUpUFuGfC&^wIUe~|EwEPSM$<_J)WA=Q!O!M&&3P-ip zEt?Rca7$ia%<G%?Eu4sZcP+YheV!BYQ+*IW>x7sPIlZnYITKk_Xobo6`O1?)R+&d2 zZ&Y#1viYE;vE*%ud0XaRzG;nnpI&r5{dvyE<KwCf3a8J+=dd(5jap$IezEdAyh`)1 zBF&@vwl5ogqIpYRuA`Zk<6ihubI+p;0!Zd8CiVPJxXAcOt5MsGJUUE;b>R%vk#)SI za+va#s4kR4tTrhrSs*g2@7gXfPd+m-T{pl4tq5O+f7&w^D0IU3s}nZE_Ie&0_g{u^ zVPR>in#Vr*J$+IShxop6#?2X`w5mH7$Y5gF?3=m2*TC5D6_3p(ntqLbu@%Eq45Wx; z%ifpf5k7T{M+aMX-LNEG+9r%1cz#Y`Naaa7eU(mM!YOH|FMcG~sAf_F`BP1#st;(= zqj{3DJu)=9nz@oxPG;ye+plyV!4rWU#BxN1F1Wn&($35KF72DGU#jxQs{FUzZ66nv z%}7h-&9U<4g_mv@?M(@m{4UF_walSpd#qyn!f?Ez^Aj7T-eq}ryhYQwpExLiU4E)~ z@P-d8MIAM^4{978O*wGb!&V3-14K!m!a(#70902ou@^0At&o{EaSBeQX`s4jMf5Xk zI(%DH*EpqhKV+wayFeT4Y<9$bu%9C{z6(}46O9vqPj?1+1w%`gImB+Tz|BAhb+lML zG`$cx7QMOI4wuj=3!EFeqdJhEp)trhB-AIdfLt1w!}gaW`=@eDT{m=ZFX%bRC(OK* z?gDbrHRZa17!{I>T7}<S`jzrn%W#(R*6?&Szn5GSsMRjyxwG?po&fDX(O1IrWWr}V z0NGTMwqp6-C&N-gd3BR*#->pAF!pL;^Ahd0MTM~U4V^YrjP19yT(fpnrPr0dG!N1z zZ>c`Mi+2E9(y;T1?V{55d%}1V5MMZXsC5^1_mWms!Uvn8#(i>XZ9KTLq4`e|6P$#& z;24W2;R~Ny_R2rOBrvyw$&y!^nqKLG-PAYL@`}>TuDPv4q%z;aDOsr5J~f?i(mOr? z$A<B=H@OSG5T}P>3oXR=KB6J^HLrf|9bu<WdC51Zw(rnsfvR-!jr&OlGqu7k^&?7k zVBgo6f`y6z6mrrTjhqdQ;+Fj;EobF_MbG~Uov2+3tqFZ5xPf&ENt2t7k}rH0y;hSO zS43+^2pRoHJO$=^tx!}l?fAH`?5g{Ud-mXb>Fq-Qv?H-$<Fw<ptLE3hNuh67PdgK3 z)%T$1+c<qN1!22nCiKlISXZyUe&zMKt@D<6Me`N=jAdqXqOKmM*TB`GD?{H7e^@A{ z%J2-iMU>4t5P|d8rR7(<uXHcgY+DH3?2hd?6fZqIeeff1X`-&_?WeClJ^!U2?EA2; zbK!*_eeu07-YWXj*A@%K#52z?7Cw(!&%_Eh%pF{8-V>|ed&j+Qt_+b}p_JUv0C)MA zxO@8GOmob$4k?9Y(;j&46|A4z7|U<GBf_74XH49s7P#Xro%V3PNhPWn2<}+Tup;(V ztSI9tRw9iE%Vz=3q|)p#^I4d(q%ALIWZH;N&GqAHY-)z1G(5=M*T@!^bxi4wctpz6 zk(CUs%FB8Lw}Vz#i5x`imsxhcuOp;KAo&K7MU#+pQC_d-Nv?E62Xz}>I%#bUfc`s` zC_X<YW2KFubMSJ~H(4e<2(lVH+s}E@WKP$?7kgefdNi4%ZaPgCcY@0ZNzd~=narMq z;FQrwKe<BWu|>`>YO+dQWrnu{Lof%c8$9S{(iR+%SX=Nm^1EP}S+1=l!A;hgtYKrl z#PnRGwfhy6#@gj-uk{~#*C$HKrn^&CM{aqdxN*Ak<FfTjWi7F?migYFR4wg365D;` zcG=PCL-777sbIl4&&7)ymWnsWiZ{oLw@&9U?^u7#>z_Z*CGX!p$PtPvzgM-iW=Cwz zjz#azdx8a(my~_8J7vSwrwRexOk+o*@Ihns0f+4`?G~If7!4x!Y)OHAR2hva0c^oJ z5P3K;n|WBIExu;z6bZblPQYyj#zO~o?lUM`-h{s*V<znISG1V19p)}Vk^_F9D)($= z-qMyGm=h!NKu77&a>F`zZ4utQKwgVb{^SIX;SnAB(_~$hi&W)}VZODcW1x<YP25dt z=kNXhGJXHllJ}{lofG!W7=P|*{%u_OoS@C1gky{bCvC%E^PS^kPzHqL|B^})RfbSN z6j=T>PDxPgQ3M)3drtn}D2=G@GT+1pNStgjS)^mk&C)P+8VZ=9)%s;Trc>HP>6&|j zGq=++-IXXRyIOUnYPKt0v|*{JF;>(#Z=3%@yr^yZz{lR=nJwQsKfB?ZQ+En0vFt8& zO?OOxDd8z%8;v)-<-6va>zpr%SG6uxZH-lJjaO}7_!8e$wz#I_m!1Que0m97;fWfq zLhe#%+)66V&yC!<@zSirK<-vC7Bg~ZVlG~Z+^s~;dO$E7OnWeCYn2uG|3GWt`ljGV z{y*vTAL#Ud(TN5~zDK9~IAQxcpKPvrP?5R(cgV`Z=%jv_TxS9-{7J&)^8_8VWBv_+ zZAIAdp?8Cd$?b&6YgfVK&ebqE)1p?yy_*+Zn+cN_!c}2q^zH80Zu?-H1?LR(jmB~G z{cBvT2qKmVORlgwFJ#<?XvzzvkveTWG@1UiZ`5kM&}Zg!Y^2<nu;~6P_8z9^PUfh_ z0u3z2F#x7uahEa}Z2UjCQndy0C%DegiT@8sFmt=huw?uh0fU5+DlpW2=&b`Vq!7%y zJWbDE{>kLh{x8J#f8lo73D9%4TV?9f)a;?Sw~i}o<K9h+u1&vv;4q=zAECZ9^}f8Z zqeS?iWKBn#?E}9B=ZxvsHCcr9$kiyVBrq_MXms{rN^ONR<QSTDq>Uqz^<5nZnAXa& z8uc{;5smgjpC!;gjf#^#D_fT}p*k#qF)q-W1Wduf!LEaYqepH<cG3}0g5j`y8`s<p z;*v?bXV56UPPZ4SEZk=U5+fx}nGv95(II%*A~x0`ig(5sNlmL{9URL56Y7GQ=_Jd; z{x1knLMRKGVs`>KipoANEWVm^CFiQ=if8uZTd!PuWpUHf@xnc~&LcKNF^lcszf)9_ zs8~Y++qW++Rcwk?Y>HR3egc<o|0nPU_mfMw|L-5b8n%I<iZrD7@ushB@7N^#sHS7R z?SryhTz;^gluIAf+vvK9oj2un?6iHb!-8`L80p%k4^a<c5l&RHv`#9^g(CVvG4>@E zBHT<(s!g{x&CHK{CzwhT4U<-uF@!dFh(p~;TTf&r&B3F56+II)G<K%dL7aZc!LIDM za<VJN*7Z!5z1H-_*IrRxg+f8u)bzzyq*wg7=DRc;i~w+#pQq6`c@8Hy36VlT{&#dD z%pw0NofuEzNb@9I>Ss@prA(orWTHP8`vI=PWP=HTF(FVtCz#=s=HEivCTSs2SWI$% z@zvZbxr<d>77pIr@ZPgO>UpmxzO5@>cyQYBk-IRlcEejouO0nv&!uD2T{Dd&TbIt9 z|K?W!Ni(^$l?`7~_-+dX>-tMa5^F_VG+a8CSl@sPU(B;Mp^MtdJW~JAf*2jj01uK6 zn2c}~7e+_7GbSLRP2@`Z)6-<4SC9u#A$Ba=@Ez`C88-DZ)$N3WkBMtqVcJ4N+8wON z0*s~nOFWUWAPKXZ?L|@Lz+cgzZa|qggkP7GFO{^!N?PJ2{%IFH%$K}k%qz}S#tr_` zc!z!v$gzHtoU;;fmHR*rsZ`d1)T|V`eMhYystGiVA7<p%4BQ`5qcy543(RnDns>Ws z8~r;_3SA|9M#ryOi=ZGC&J?Eav@5OkUBYE+&^iPK#H+nrPE3b8K4*cVclExNY4xRl zAM!*+x}<hx-a_<Jg-NZgGNjlm);C|UL(L5YWH;Mir@<`L$acuSfXa)XVKk>~Z&==} ze)2tlRBR4e`VPyBa9x0s+5%bni<zOmu@lc`XZD~e+gD40KFMt{>qu|e0kX6avXp=} z&(LDYIuMV*p^fXAx~xpxYU2lWIYLHjwUI;}gl#Hly=Xm83NG5Ozz)#yT#FE0tKDC; zzbw4@7dlOMPR`|N>eEM1WTkCaCN^e+T>d0=S$zBRPtXBIHj;V4;mA1g6yp~-`%%oJ zY-yUOEUPpN!!<!qld&u58VD!|u!)c8i2Z8tg6!a3{m*xtJbCa$52H8998z6Vv@gcb zEPJT?Frp!(1Ap~$YZ@^?_&!fWjxu=(Cbbpb)hqvdYTED9iP1a0MKI}Bd%^5_<-laT zF}Ygnm86S0Mgh#0iREN)HzkBwBSUrHA)Ngt>SyXRgk5phedw+OA6>nEscLtuYB%lb zJ`rm_5wGf<KJqa*CWQT3s%VT=G|t<Xnx2U@Jrl3!n11#_o=~=ZskA*-+J19aytM1m z!IZr)f5!u-u(9#&=dM3DAN}Ffjj4G3p8wn7SXX?fQcP5=zukB^R&n^_%Br_=uI0Q{ zaIN5v<hRdXKmYdB^{IufA02(~=&h!B<B{8yNAKkbW$WN6zOHyCHznXFRV)-$T`jm$ za2qQ10%2XlJ;8$=e6EixcP&-!i&gHsc_Ci;?2H4UF=qBAO4oi|z3#1@*LJ?O=h~im z`wu-gJPW7e)%#~$*lNC1vo}_=_vYz%&EXmMosu<k)u38<B(Z5Lg$--^sIV+mhRUI| zudJHMz2h!ibgxZ_8{c+cch7hHpkVsQtew>CPQg<-`}AA;ukD}Tv9Kjxy<@3*Ppo=R zyn0{Ey)PlQsO9c>s}@~V|MA`t3%c>!2c<$O><A7FRGzSI#~<XT+_?T!*@zkZplQP) zQTWT;j><#T_P^RtjGLcTJLoKW4{fpiY_kPtxdv00;hUw4DSwPQGQ|`i3xnMfVg+LT zo03!OsvIWXNQarBe3@Wj<0f(-B;7Q>f(pVu`L{YEf>sYEKJt17hm`s02m_8mDKo>K zwk+Bakv%hh_(SS@qBtv#5n>Wj4<b1*>FB?v6xzPPFoG5-h2~Fo<CN*qjy)%<Y1Xn9 zGIhBcJcjZz-hqW&p39`5nbY$Xw~IDYD7$XU!U=$A<=Ul+-LZ<@H*0^o>HSSVZjDzw zOCnFVg=C&?3kf~l7AEyTK?0Qv^y8)F&~WGC`ctJDwSO(Y!!BH2zsvToa&d9f(P7E? z?`*jGz{1XUcSo`9gCYyg@;{(>25+l_<|ulX;R|BU)9G9jDpC)P`hiL!ZqM)9)*$^I z)JDfe3xp^NZ6cd%xYMy1j89KlRe{D-E1r&!Bv-9atIi>0)vAg_W&)U`o61+LRWFfM zD>s>A-`A8Nmtgs>GDdpOXqQ-Spc2EhY=x0z&SPqRmer;)49y}v-!4MtQfo1UhEiQb zSmb)Yc#Ps(4=lHg>n+miT)|SV8qy8R|4A;_p5Ocfj^7X%a&CiZ&)=e3#&?Lg^4XJ3 z*;Ksqc+bg$Jtq<V^TmTFdJ#Rz$T@IHmdHC6J1qwJU(;zV<{@*j6K0rf!yua5tFson zs$$(t>;1=g5)L$#Ldnxh#m~fwpSe}~H&q{0{ngt4URr$q#LuNzM{m6NB+Oamm9%TP z_)e{lZHBkRYqz|&ZQ;biwpi^hP$p;0vmQIxFJHWLarO(hVLofw`om*4j@{f4Z`t$y z$(!=cld+ZqGw#`=u|i))x#rD3Y`xKX(-LoPe}CIegm#HFKZA15#R^&Em}=0vyAGkC zI8od1cJuY-9}pSjFC#L@)bKth*D^9*uBWHxhUMf9%b^?ALx+4@vOb3=kI(>;Mk8sb z&uH*CR)dsyiB2Sx$vf#p>~1=24&QjxNoj}ZM5a2n7f}}Js+vwm=tQfDZAM{Vu4kW3 zXWs#r=PBbwIuVLB#OisCZr{Wy=|K?kXgJ8fkRp>jD=*RMXLKUeCzIk({so;#0V)$N zlSvCmiZ*D~m_~qWPl<z*i3Z378`<CZi%=S!ei!nW@(VyMedEvTaHSfA#!ZR!8xnOJ z6HP4`^F*`%uD8?b$h%XvZdSVTTFOB;AOuzGQaS7rkxVzFa@l2`P$|yYuY5V>X15-p zq<VJimDW@~yDbo^YUk>&)udQ`Ftz3t+%IA|&)L0>yxF?@0)A5Uf`7|hTY)1l(a@Zt z-#fVl)5=WeY{~S+Snj&}4kV?-Do625=Y0V`cXyRJs%E#P1pLe+2|suJO^%9LDJ9@% zp`QKR+IpYv?w+(1II8B5hM$G)H%o2?Z*9G~F1GdXeM-42IvtxR7e5Pl0zY>PS4b-5 zrO;{=NTJmBnIK(nPZfF{1-v%}cWaB#Gc*oA^HKJ5%XOdbQVltdjdP`Q!TGIor?1!C z7jT;@b~zg6>gSaC&bbTM{r3gjrb=B7-`vUhx_M>3>H2Gw=1Z04IK<hmxstiyT;;VM zdR9yo+a0yDXaRmwo*c)nc?3Yi&q4`h?@ATtICjt1QPS=Ov>88?v}eATlJ+e0Qqmqu z+B(-sNn2?w@dHNL36*)Cqd46#_^mjK@7uHtFt*O(l(o%KHea3+@UzfG1ADXby`Fn? zOC@=JYQVxCDs=3c+XmBI@4V~!zIy_0)!J|c0HD%ksI6&X>y1{L*s_~lw@PjWZ&kjJ z8gZ-Eh^v&JRhaA8GJA5aZcdqNy7t;V0k>*}xJs3?A~}whS>+zO)S_nLO6^>ZqkOJ} zvdZ<Wa>_z83LRw#PuzR`SPHEyTaa#Uy=A+(>%CEGwAKt<sg1TeHq9PHpg90h5c^gg zo79Hl3XBkq<1R<_oHW06!8X6^Ix4}f`bu1-qLxxe`NGzefS;S&ZrN`2-g3Ra?>^n8 zT3B<+9o6%g9{d=`7`N<2cdfW$D3LAhAQrfO5YEFo7w-FUewbP?tsc=?BT_O^9a%?I zzc({SXiu~K&u+b_evvkSnE4o{O$n>1x6<#3mS`29Db=phzf5ugLZk!gPK#M^C-R&m zhlO`@-m&wNXt{Ywmy{c&umtRo@+9}W9&KMOdxl6t)}gVUq**_st5ed2<f^Ey_>uDI zpLw}=3$)fjIp~avS`9GeTF=yKcj;ew2j*^L`d+(=)@fH~8nmnQFVs*b&uD#+yi(!2 zMcRJk^c+kOoR~Z(6{9|1x_0dfwUlU2Yf3AOpY6;htwj3QSQa)1^Y@fa>AtV59<n!O z9a<ll%Fe8<WmCEW%_2+)zVe>Q5-rR@ggHv%I{^3wmxYCqnsm0do>3yBaFIGQx#9SD zbZnfyWGRlosgu}RvR^R=Q677lLPOzWW&Kfk9D4Gk{d8z}46&br^o5qmyw+9<N8Ji- z5vr3}p!vz|Obo@B2Z%SOY{n5o3lGgZBvS1|GfnEpg4hSF+I-N|+oKa>A#9N*GeHYL z{}3d}F$_jJdOUl<ZwS^;qAdtiB_WJeGMCg&{bxfH%A~6Y5^}q^QDK1xC*3dNQ!{8N zrA&G{q3S0^7~T0Qpy!GV4Z$3d%!P5_D6ZitR*b5XE_^ooD18Dk>F7Fm;Dy7<ynrM< zi|@7}ynQmiH;NG&QEz2(7G(C`qzj+_WQLbyL5KPwP$t&PNe>?H*FFx)Sh!>!D@ln8 z>k~tO@(y~tohFBIXGw=NJ~E~l*g6pf;MwA&mXoh2t3^)QsUF%}u0)fijC)o+K=qhh zWf`fOM{BksEomRYMr-*X`qbk9r`3szH-wM#OPBI%V)-@SyAaQBdgD;Sp7(plzk2*T zhp!&Ha_qLf7WYf`vY5T>J3~w5n_}gg-tGM1b2pxgm+!o7-}USKvZeg`SbqKD=0msh z53{G2>=iM4MZ#4$Q@^<GnV+vkw0KA51JEBQsE)&}WtS#go{#ej6ZsX1{H~Onm2sjB zyyuIT+-qa*wQ+aN8(nvD+`o76YZpKEiiyf~iK_K5S*hF8ALKd;^DfzG7ktIEoytvo zZ6e_+xa_{<{!Z7`=dL`5Pf|}@oA~bQ3!87*Z<ikYrR&fgo;~y2oc-<G>$wZ1bGdPG z$8Fcn#QM6ormjsbY@3~mug6ZPwQ5B(#}?~$-gfOui1lyhU(f%6chR*@%j#LI-~CHh zJ0o!vvz$g3k;@U+RFF5)sR1V#pV~03J-!2++uuzYd+D^5PE3)@jD`O*N^vIy26S6- z3vc0xF@P}tP&Ta#&e1dOo5&w$w;6BFWCb^+dFV-Z_sAHQ4YNnff5lSzHE=;2$!x>q z1bi7{^jug5NHUe}6s40tll%sqX6bZ|PJc+J_vlnd&90zRHJ#SbsgX`(nt2Rq<p@1? zj84bt^aVQg(#b?TN#?Ro=>pp+?DO5}b;Y2Xi&tdu;cN$KQ$BU=;a|nwCm%&C@gI&n zU^?I@VX@p5^DXxKHG-w^SAzRjLcy<uT=w7dE1~FDLf)?g?<dwgi}e!$r@y09s?u&L z`!{wGmQru|8}0{Ao27ilhmVR|${%<fmg4D&2LgV`bF=vJ<fTdaq{HmU{EKn#wl_S9 zq7w24yIOOlX3o1%6))QJMnR&YZc!*rl?v{XMA`bg4qK^pQ7BAR3F{jZwatk-U!tZS z=eura88V7eB9yDsgDIP}61SyjM$3-*EkA6((VnnBix74#NNqxDy?<`Y+wIre7yU=$ zb;lM3@t(729rD(sngvH$!d}GwS0?PG342MxUY_#0>X9wpEpM{yBhdgqH^*=F{=Dwz z%B@#p`@xVSCH11^d5fiT8oW6D-i14{MVx`?fuA|B@%XvhV`;VcX1Y=We&+4$=O&nb z+}%B8DX=uoA`L(DW%J5H=gpG&i!t9`NIRCsyR~^d7eDiO0zY@FOp_XB(7-%P!@P}3 zHKeKvELGD%s-!AaTV|=5K~wN^_bH#Hfm(;3xs&W?;q-mFOZ|=|$Fgy@bT&A*b@uc% z5_c>cA=+3PX6t8_xz5=O*GSw!!SWo7FU`tRIfy$Bbh>M{WHvZkc?IGQZc~MY7C(J% z9zS!+efmi?6j|ElY!I?6ZPZZwq?!sXTjsz}<7a*=mD-YOD8LKqXh?iCg7`_*7FjC( zjotT2L#NwPeOF-TqvZndVcxnoa_&1fTAoflZxQUC>B$dmYd*5Oe)kYiti9^Dsg7pB z1<Ao`DZ5ix`t|OV16O~ank-_eUQ5L%_IyXheF3MG1Gk?l#B%+G^UyBgXI|%Fr|`2~ XIfrewzp+~A?DQV4wEazm1?T@439BAg diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/distro/distro.py b/venv/lib/python3.12/site-packages/pip/_vendor/distro/distro.py deleted file mode 100644 index 89e1868..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/distro/distro.py +++ /dev/null @@ -1,1399 +0,0 @@ -#!/usr/bin/env python -# Copyright 2015,2016,2017 Nir Cohen -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -""" -The ``distro`` package (``distro`` stands for Linux Distribution) provides -information about the Linux distribution it runs on, such as a reliable -machine-readable distro ID, or version information. - -It is the recommended replacement for Python's original -:py:func:`platform.linux_distribution` function, but it provides much more -functionality. An alternative implementation became necessary because Python -3.5 deprecated this function, and Python 3.8 removed it altogether. Its -predecessor function :py:func:`platform.dist` was already deprecated since -Python 2.6 and removed in Python 3.8. Still, there are many cases in which -access to OS distribution information is needed. See `Python issue 1322 -<https://bugs.python.org/issue1322>`_ for more information. -""" - -import argparse -import json -import logging -import os -import re -import shlex -import subprocess -import sys -import warnings -from typing import ( - Any, - Callable, - Dict, - Iterable, - Optional, - Sequence, - TextIO, - Tuple, - Type, -) - -try: - from typing import TypedDict -except ImportError: - # Python 3.7 - TypedDict = dict - -__version__ = "1.8.0" - - -class VersionDict(TypedDict): - major: str - minor: str - build_number: str - - -class InfoDict(TypedDict): - id: str - version: str - version_parts: VersionDict - like: str - codename: str - - -_UNIXCONFDIR = os.environ.get("UNIXCONFDIR", "/etc") -_UNIXUSRLIBDIR = os.environ.get("UNIXUSRLIBDIR", "/usr/lib") -_OS_RELEASE_BASENAME = "os-release" - -#: Translation table for normalizing the "ID" attribute defined in os-release -#: files, for use by the :func:`distro.id` method. -#: -#: * Key: Value as defined in the os-release file, translated to lower case, -#: with blanks translated to underscores. -#: -#: * Value: Normalized value. -NORMALIZED_OS_ID = { - "ol": "oracle", # Oracle Linux - "opensuse-leap": "opensuse", # Newer versions of OpenSuSE report as opensuse-leap -} - -#: Translation table for normalizing the "Distributor ID" attribute returned by -#: the lsb_release command, for use by the :func:`distro.id` method. -#: -#: * Key: Value as returned by the lsb_release command, translated to lower -#: case, with blanks translated to underscores. -#: -#: * Value: Normalized value. -NORMALIZED_LSB_ID = { - "enterpriseenterpriseas": "oracle", # Oracle Enterprise Linux 4 - "enterpriseenterpriseserver": "oracle", # Oracle Linux 5 - "redhatenterpriseworkstation": "rhel", # RHEL 6, 7 Workstation - "redhatenterpriseserver": "rhel", # RHEL 6, 7 Server - "redhatenterprisecomputenode": "rhel", # RHEL 6 ComputeNode -} - -#: Translation table for normalizing the distro ID derived from the file name -#: of distro release files, for use by the :func:`distro.id` method. -#: -#: * Key: Value as derived from the file name of a distro release file, -#: translated to lower case, with blanks translated to underscores. -#: -#: * Value: Normalized value. -NORMALIZED_DISTRO_ID = { - "redhat": "rhel", # RHEL 6.x, 7.x -} - -# Pattern for content of distro release file (reversed) -_DISTRO_RELEASE_CONTENT_REVERSED_PATTERN = re.compile( - r"(?:[^)]*\)(.*)\()? *(?:STL )?([\d.+\-a-z]*\d) *(?:esaeler *)?(.+)" -) - -# Pattern for base file name of distro release file -_DISTRO_RELEASE_BASENAME_PATTERN = re.compile(r"(\w+)[-_](release|version)$") - -# Base file names to be looked up for if _UNIXCONFDIR is not readable. -_DISTRO_RELEASE_BASENAMES = [ - "SuSE-release", - "arch-release", - "base-release", - "centos-release", - "fedora-release", - "gentoo-release", - "mageia-release", - "mandrake-release", - "mandriva-release", - "mandrivalinux-release", - "manjaro-release", - "oracle-release", - "redhat-release", - "rocky-release", - "sl-release", - "slackware-version", -] - -# Base file names to be ignored when searching for distro release file -_DISTRO_RELEASE_IGNORE_BASENAMES = ( - "debian_version", - "lsb-release", - "oem-release", - _OS_RELEASE_BASENAME, - "system-release", - "plesk-release", - "iredmail-release", -) - - -def linux_distribution(full_distribution_name: bool = True) -> Tuple[str, str, str]: - """ - .. deprecated:: 1.6.0 - - :func:`distro.linux_distribution()` is deprecated. It should only be - used as a compatibility shim with Python's - :py:func:`platform.linux_distribution()`. Please use :func:`distro.id`, - :func:`distro.version` and :func:`distro.name` instead. - - Return information about the current OS distribution as a tuple - ``(id_name, version, codename)`` with items as follows: - - * ``id_name``: If *full_distribution_name* is false, the result of - :func:`distro.id`. Otherwise, the result of :func:`distro.name`. - - * ``version``: The result of :func:`distro.version`. - - * ``codename``: The extra item (usually in parentheses) after the - os-release version number, or the result of :func:`distro.codename`. - - The interface of this function is compatible with the original - :py:func:`platform.linux_distribution` function, supporting a subset of - its parameters. - - The data it returns may not exactly be the same, because it uses more data - sources than the original function, and that may lead to different data if - the OS distribution is not consistent across multiple data sources it - provides (there are indeed such distributions ...). - - Another reason for differences is the fact that the :func:`distro.id` - method normalizes the distro ID string to a reliable machine-readable value - for a number of popular OS distributions. - """ - warnings.warn( - "distro.linux_distribution() is deprecated. It should only be used as a " - "compatibility shim with Python's platform.linux_distribution(). Please use " - "distro.id(), distro.version() and distro.name() instead.", - DeprecationWarning, - stacklevel=2, - ) - return _distro.linux_distribution(full_distribution_name) - - -def id() -> str: - """ - Return the distro ID of the current distribution, as a - machine-readable string. - - For a number of OS distributions, the returned distro ID value is - *reliable*, in the sense that it is documented and that it does not change - across releases of the distribution. - - This package maintains the following reliable distro ID values: - - ============== ========================================= - Distro ID Distribution - ============== ========================================= - "ubuntu" Ubuntu - "debian" Debian - "rhel" RedHat Enterprise Linux - "centos" CentOS - "fedora" Fedora - "sles" SUSE Linux Enterprise Server - "opensuse" openSUSE - "amzn" Amazon Linux - "arch" Arch Linux - "buildroot" Buildroot - "cloudlinux" CloudLinux OS - "exherbo" Exherbo Linux - "gentoo" GenToo Linux - "ibm_powerkvm" IBM PowerKVM - "kvmibm" KVM for IBM z Systems - "linuxmint" Linux Mint - "mageia" Mageia - "mandriva" Mandriva Linux - "parallels" Parallels - "pidora" Pidora - "raspbian" Raspbian - "oracle" Oracle Linux (and Oracle Enterprise Linux) - "scientific" Scientific Linux - "slackware" Slackware - "xenserver" XenServer - "openbsd" OpenBSD - "netbsd" NetBSD - "freebsd" FreeBSD - "midnightbsd" MidnightBSD - "rocky" Rocky Linux - "aix" AIX - "guix" Guix System - ============== ========================================= - - If you have a need to get distros for reliable IDs added into this set, - or if you find that the :func:`distro.id` function returns a different - distro ID for one of the listed distros, please create an issue in the - `distro issue tracker`_. - - **Lookup hierarchy and transformations:** - - First, the ID is obtained from the following sources, in the specified - order. The first available and non-empty value is used: - - * the value of the "ID" attribute of the os-release file, - - * the value of the "Distributor ID" attribute returned by the lsb_release - command, - - * the first part of the file name of the distro release file, - - The so determined ID value then passes the following transformations, - before it is returned by this method: - - * it is translated to lower case, - - * blanks (which should not be there anyway) are translated to underscores, - - * a normalization of the ID is performed, based upon - `normalization tables`_. The purpose of this normalization is to ensure - that the ID is as reliable as possible, even across incompatible changes - in the OS distributions. A common reason for an incompatible change is - the addition of an os-release file, or the addition of the lsb_release - command, with ID values that differ from what was previously determined - from the distro release file name. - """ - return _distro.id() - - -def name(pretty: bool = False) -> str: - """ - Return the name of the current OS distribution, as a human-readable - string. - - If *pretty* is false, the name is returned without version or codename. - (e.g. "CentOS Linux") - - If *pretty* is true, the version and codename are appended. - (e.g. "CentOS Linux 7.1.1503 (Core)") - - **Lookup hierarchy:** - - The name is obtained from the following sources, in the specified order. - The first available and non-empty value is used: - - * If *pretty* is false: - - - the value of the "NAME" attribute of the os-release file, - - - the value of the "Distributor ID" attribute returned by the lsb_release - command, - - - the value of the "<name>" field of the distro release file. - - * If *pretty* is true: - - - the value of the "PRETTY_NAME" attribute of the os-release file, - - - the value of the "Description" attribute returned by the lsb_release - command, - - - the value of the "<name>" field of the distro release file, appended - with the value of the pretty version ("<version_id>" and "<codename>" - fields) of the distro release file, if available. - """ - return _distro.name(pretty) - - -def version(pretty: bool = False, best: bool = False) -> str: - """ - Return the version of the current OS distribution, as a human-readable - string. - - If *pretty* is false, the version is returned without codename (e.g. - "7.0"). - - If *pretty* is true, the codename in parenthesis is appended, if the - codename is non-empty (e.g. "7.0 (Maipo)"). - - Some distributions provide version numbers with different precisions in - the different sources of distribution information. Examining the different - sources in a fixed priority order does not always yield the most precise - version (e.g. for Debian 8.2, or CentOS 7.1). - - Some other distributions may not provide this kind of information. In these - cases, an empty string would be returned. This behavior can be observed - with rolling releases distributions (e.g. Arch Linux). - - The *best* parameter can be used to control the approach for the returned - version: - - If *best* is false, the first non-empty version number in priority order of - the examined sources is returned. - - If *best* is true, the most precise version number out of all examined - sources is returned. - - **Lookup hierarchy:** - - In all cases, the version number is obtained from the following sources. - If *best* is false, this order represents the priority order: - - * the value of the "VERSION_ID" attribute of the os-release file, - * the value of the "Release" attribute returned by the lsb_release - command, - * the version number parsed from the "<version_id>" field of the first line - of the distro release file, - * the version number parsed from the "PRETTY_NAME" attribute of the - os-release file, if it follows the format of the distro release files. - * the version number parsed from the "Description" attribute returned by - the lsb_release command, if it follows the format of the distro release - files. - """ - return _distro.version(pretty, best) - - -def version_parts(best: bool = False) -> Tuple[str, str, str]: - """ - Return the version of the current OS distribution as a tuple - ``(major, minor, build_number)`` with items as follows: - - * ``major``: The result of :func:`distro.major_version`. - - * ``minor``: The result of :func:`distro.minor_version`. - - * ``build_number``: The result of :func:`distro.build_number`. - - For a description of the *best* parameter, see the :func:`distro.version` - method. - """ - return _distro.version_parts(best) - - -def major_version(best: bool = False) -> str: - """ - Return the major version of the current OS distribution, as a string, - if provided. - Otherwise, the empty string is returned. The major version is the first - part of the dot-separated version string. - - For a description of the *best* parameter, see the :func:`distro.version` - method. - """ - return _distro.major_version(best) - - -def minor_version(best: bool = False) -> str: - """ - Return the minor version of the current OS distribution, as a string, - if provided. - Otherwise, the empty string is returned. The minor version is the second - part of the dot-separated version string. - - For a description of the *best* parameter, see the :func:`distro.version` - method. - """ - return _distro.minor_version(best) - - -def build_number(best: bool = False) -> str: - """ - Return the build number of the current OS distribution, as a string, - if provided. - Otherwise, the empty string is returned. The build number is the third part - of the dot-separated version string. - - For a description of the *best* parameter, see the :func:`distro.version` - method. - """ - return _distro.build_number(best) - - -def like() -> str: - """ - Return a space-separated list of distro IDs of distributions that are - closely related to the current OS distribution in regards to packaging - and programming interfaces, for example distributions the current - distribution is a derivative from. - - **Lookup hierarchy:** - - This information item is only provided by the os-release file. - For details, see the description of the "ID_LIKE" attribute in the - `os-release man page - <http://www.freedesktop.org/software/systemd/man/os-release.html>`_. - """ - return _distro.like() - - -def codename() -> str: - """ - Return the codename for the release of the current OS distribution, - as a string. - - If the distribution does not have a codename, an empty string is returned. - - Note that the returned codename is not always really a codename. For - example, openSUSE returns "x86_64". This function does not handle such - cases in any special way and just returns the string it finds, if any. - - **Lookup hierarchy:** - - * the codename within the "VERSION" attribute of the os-release file, if - provided, - - * the value of the "Codename" attribute returned by the lsb_release - command, - - * the value of the "<codename>" field of the distro release file. - """ - return _distro.codename() - - -def info(pretty: bool = False, best: bool = False) -> InfoDict: - """ - Return certain machine-readable information items about the current OS - distribution in a dictionary, as shown in the following example: - - .. sourcecode:: python - - { - 'id': 'rhel', - 'version': '7.0', - 'version_parts': { - 'major': '7', - 'minor': '0', - 'build_number': '' - }, - 'like': 'fedora', - 'codename': 'Maipo' - } - - The dictionary structure and keys are always the same, regardless of which - information items are available in the underlying data sources. The values - for the various keys are as follows: - - * ``id``: The result of :func:`distro.id`. - - * ``version``: The result of :func:`distro.version`. - - * ``version_parts -> major``: The result of :func:`distro.major_version`. - - * ``version_parts -> minor``: The result of :func:`distro.minor_version`. - - * ``version_parts -> build_number``: The result of - :func:`distro.build_number`. - - * ``like``: The result of :func:`distro.like`. - - * ``codename``: The result of :func:`distro.codename`. - - For a description of the *pretty* and *best* parameters, see the - :func:`distro.version` method. - """ - return _distro.info(pretty, best) - - -def os_release_info() -> Dict[str, str]: - """ - Return a dictionary containing key-value pairs for the information items - from the os-release file data source of the current OS distribution. - - See `os-release file`_ for details about these information items. - """ - return _distro.os_release_info() - - -def lsb_release_info() -> Dict[str, str]: - """ - Return a dictionary containing key-value pairs for the information items - from the lsb_release command data source of the current OS distribution. - - See `lsb_release command output`_ for details about these information - items. - """ - return _distro.lsb_release_info() - - -def distro_release_info() -> Dict[str, str]: - """ - Return a dictionary containing key-value pairs for the information items - from the distro release file data source of the current OS distribution. - - See `distro release file`_ for details about these information items. - """ - return _distro.distro_release_info() - - -def uname_info() -> Dict[str, str]: - """ - Return a dictionary containing key-value pairs for the information items - from the distro release file data source of the current OS distribution. - """ - return _distro.uname_info() - - -def os_release_attr(attribute: str) -> str: - """ - Return a single named information item from the os-release file data source - of the current OS distribution. - - Parameters: - - * ``attribute`` (string): Key of the information item. - - Returns: - - * (string): Value of the information item, if the item exists. - The empty string, if the item does not exist. - - See `os-release file`_ for details about these information items. - """ - return _distro.os_release_attr(attribute) - - -def lsb_release_attr(attribute: str) -> str: - """ - Return a single named information item from the lsb_release command output - data source of the current OS distribution. - - Parameters: - - * ``attribute`` (string): Key of the information item. - - Returns: - - * (string): Value of the information item, if the item exists. - The empty string, if the item does not exist. - - See `lsb_release command output`_ for details about these information - items. - """ - return _distro.lsb_release_attr(attribute) - - -def distro_release_attr(attribute: str) -> str: - """ - Return a single named information item from the distro release file - data source of the current OS distribution. - - Parameters: - - * ``attribute`` (string): Key of the information item. - - Returns: - - * (string): Value of the information item, if the item exists. - The empty string, if the item does not exist. - - See `distro release file`_ for details about these information items. - """ - return _distro.distro_release_attr(attribute) - - -def uname_attr(attribute: str) -> str: - """ - Return a single named information item from the distro release file - data source of the current OS distribution. - - Parameters: - - * ``attribute`` (string): Key of the information item. - - Returns: - - * (string): Value of the information item, if the item exists. - The empty string, if the item does not exist. - """ - return _distro.uname_attr(attribute) - - -try: - from functools import cached_property -except ImportError: - # Python < 3.8 - class cached_property: # type: ignore - """A version of @property which caches the value. On access, it calls the - underlying function and sets the value in `__dict__` so future accesses - will not re-call the property. - """ - - def __init__(self, f: Callable[[Any], Any]) -> None: - self._fname = f.__name__ - self._f = f - - def __get__(self, obj: Any, owner: Type[Any]) -> Any: - assert obj is not None, f"call {self._fname} on an instance" - ret = obj.__dict__[self._fname] = self._f(obj) - return ret - - -class LinuxDistribution: - """ - Provides information about a OS distribution. - - This package creates a private module-global instance of this class with - default initialization arguments, that is used by the - `consolidated accessor functions`_ and `single source accessor functions`_. - By using default initialization arguments, that module-global instance - returns data about the current OS distribution (i.e. the distro this - package runs on). - - Normally, it is not necessary to create additional instances of this class. - However, in situations where control is needed over the exact data sources - that are used, instances of this class can be created with a specific - distro release file, or a specific os-release file, or without invoking the - lsb_release command. - """ - - def __init__( - self, - include_lsb: Optional[bool] = None, - os_release_file: str = "", - distro_release_file: str = "", - include_uname: Optional[bool] = None, - root_dir: Optional[str] = None, - include_oslevel: Optional[bool] = None, - ) -> None: - """ - The initialization method of this class gathers information from the - available data sources, and stores that in private instance attributes. - Subsequent access to the information items uses these private instance - attributes, so that the data sources are read only once. - - Parameters: - - * ``include_lsb`` (bool): Controls whether the - `lsb_release command output`_ is included as a data source. - - If the lsb_release command is not available in the program execution - path, the data source for the lsb_release command will be empty. - - * ``os_release_file`` (string): The path name of the - `os-release file`_ that is to be used as a data source. - - An empty string (the default) will cause the default path name to - be used (see `os-release file`_ for details). - - If the specified or defaulted os-release file does not exist, the - data source for the os-release file will be empty. - - * ``distro_release_file`` (string): The path name of the - `distro release file`_ that is to be used as a data source. - - An empty string (the default) will cause a default search algorithm - to be used (see `distro release file`_ for details). - - If the specified distro release file does not exist, or if no default - distro release file can be found, the data source for the distro - release file will be empty. - - * ``include_uname`` (bool): Controls whether uname command output is - included as a data source. If the uname command is not available in - the program execution path the data source for the uname command will - be empty. - - * ``root_dir`` (string): The absolute path to the root directory to use - to find distro-related information files. Note that ``include_*`` - parameters must not be enabled in combination with ``root_dir``. - - * ``include_oslevel`` (bool): Controls whether (AIX) oslevel command - output is included as a data source. If the oslevel command is not - available in the program execution path the data source will be - empty. - - Public instance attributes: - - * ``os_release_file`` (string): The path name of the - `os-release file`_ that is actually used as a data source. The - empty string if no distro release file is used as a data source. - - * ``distro_release_file`` (string): The path name of the - `distro release file`_ that is actually used as a data source. The - empty string if no distro release file is used as a data source. - - * ``include_lsb`` (bool): The result of the ``include_lsb`` parameter. - This controls whether the lsb information will be loaded. - - * ``include_uname`` (bool): The result of the ``include_uname`` - parameter. This controls whether the uname information will - be loaded. - - * ``include_oslevel`` (bool): The result of the ``include_oslevel`` - parameter. This controls whether (AIX) oslevel information will be - loaded. - - * ``root_dir`` (string): The result of the ``root_dir`` parameter. - The absolute path to the root directory to use to find distro-related - information files. - - Raises: - - * :py:exc:`ValueError`: Initialization parameters combination is not - supported. - - * :py:exc:`OSError`: Some I/O issue with an os-release file or distro - release file. - - * :py:exc:`UnicodeError`: A data source has unexpected characters or - uses an unexpected encoding. - """ - self.root_dir = root_dir - self.etc_dir = os.path.join(root_dir, "etc") if root_dir else _UNIXCONFDIR - self.usr_lib_dir = ( - os.path.join(root_dir, "usr/lib") if root_dir else _UNIXUSRLIBDIR - ) - - if os_release_file: - self.os_release_file = os_release_file - else: - etc_dir_os_release_file = os.path.join(self.etc_dir, _OS_RELEASE_BASENAME) - usr_lib_os_release_file = os.path.join( - self.usr_lib_dir, _OS_RELEASE_BASENAME - ) - - # NOTE: The idea is to respect order **and** have it set - # at all times for API backwards compatibility. - if os.path.isfile(etc_dir_os_release_file) or not os.path.isfile( - usr_lib_os_release_file - ): - self.os_release_file = etc_dir_os_release_file - else: - self.os_release_file = usr_lib_os_release_file - - self.distro_release_file = distro_release_file or "" # updated later - - is_root_dir_defined = root_dir is not None - if is_root_dir_defined and (include_lsb or include_uname or include_oslevel): - raise ValueError( - "Including subprocess data sources from specific root_dir is disallowed" - " to prevent false information" - ) - self.include_lsb = ( - include_lsb if include_lsb is not None else not is_root_dir_defined - ) - self.include_uname = ( - include_uname if include_uname is not None else not is_root_dir_defined - ) - self.include_oslevel = ( - include_oslevel if include_oslevel is not None else not is_root_dir_defined - ) - - def __repr__(self) -> str: - """Return repr of all info""" - return ( - "LinuxDistribution(" - "os_release_file={self.os_release_file!r}, " - "distro_release_file={self.distro_release_file!r}, " - "include_lsb={self.include_lsb!r}, " - "include_uname={self.include_uname!r}, " - "include_oslevel={self.include_oslevel!r}, " - "root_dir={self.root_dir!r}, " - "_os_release_info={self._os_release_info!r}, " - "_lsb_release_info={self._lsb_release_info!r}, " - "_distro_release_info={self._distro_release_info!r}, " - "_uname_info={self._uname_info!r}, " - "_oslevel_info={self._oslevel_info!r})".format(self=self) - ) - - def linux_distribution( - self, full_distribution_name: bool = True - ) -> Tuple[str, str, str]: - """ - Return information about the OS distribution that is compatible - with Python's :func:`platform.linux_distribution`, supporting a subset - of its parameters. - - For details, see :func:`distro.linux_distribution`. - """ - return ( - self.name() if full_distribution_name else self.id(), - self.version(), - self._os_release_info.get("release_codename") or self.codename(), - ) - - def id(self) -> str: - """Return the distro ID of the OS distribution, as a string. - - For details, see :func:`distro.id`. - """ - - def normalize(distro_id: str, table: Dict[str, str]) -> str: - distro_id = distro_id.lower().replace(" ", "_") - return table.get(distro_id, distro_id) - - distro_id = self.os_release_attr("id") - if distro_id: - return normalize(distro_id, NORMALIZED_OS_ID) - - distro_id = self.lsb_release_attr("distributor_id") - if distro_id: - return normalize(distro_id, NORMALIZED_LSB_ID) - - distro_id = self.distro_release_attr("id") - if distro_id: - return normalize(distro_id, NORMALIZED_DISTRO_ID) - - distro_id = self.uname_attr("id") - if distro_id: - return normalize(distro_id, NORMALIZED_DISTRO_ID) - - return "" - - def name(self, pretty: bool = False) -> str: - """ - Return the name of the OS distribution, as a string. - - For details, see :func:`distro.name`. - """ - name = ( - self.os_release_attr("name") - or self.lsb_release_attr("distributor_id") - or self.distro_release_attr("name") - or self.uname_attr("name") - ) - if pretty: - name = self.os_release_attr("pretty_name") or self.lsb_release_attr( - "description" - ) - if not name: - name = self.distro_release_attr("name") or self.uname_attr("name") - version = self.version(pretty=True) - if version: - name = f"{name} {version}" - return name or "" - - def version(self, pretty: bool = False, best: bool = False) -> str: - """ - Return the version of the OS distribution, as a string. - - For details, see :func:`distro.version`. - """ - versions = [ - self.os_release_attr("version_id"), - self.lsb_release_attr("release"), - self.distro_release_attr("version_id"), - self._parse_distro_release_content(self.os_release_attr("pretty_name")).get( - "version_id", "" - ), - self._parse_distro_release_content( - self.lsb_release_attr("description") - ).get("version_id", ""), - self.uname_attr("release"), - ] - if self.uname_attr("id").startswith("aix"): - # On AIX platforms, prefer oslevel command output. - versions.insert(0, self.oslevel_info()) - elif self.id() == "debian" or "debian" in self.like().split(): - # On Debian-like, add debian_version file content to candidates list. - versions.append(self._debian_version) - version = "" - if best: - # This algorithm uses the last version in priority order that has - # the best precision. If the versions are not in conflict, that - # does not matter; otherwise, using the last one instead of the - # first one might be considered a surprise. - for v in versions: - if v.count(".") > version.count(".") or version == "": - version = v - else: - for v in versions: - if v != "": - version = v - break - if pretty and version and self.codename(): - version = f"{version} ({self.codename()})" - return version - - def version_parts(self, best: bool = False) -> Tuple[str, str, str]: - """ - Return the version of the OS distribution, as a tuple of version - numbers. - - For details, see :func:`distro.version_parts`. - """ - version_str = self.version(best=best) - if version_str: - version_regex = re.compile(r"(\d+)\.?(\d+)?\.?(\d+)?") - matches = version_regex.match(version_str) - if matches: - major, minor, build_number = matches.groups() - return major, minor or "", build_number or "" - return "", "", "" - - def major_version(self, best: bool = False) -> str: - """ - Return the major version number of the current distribution. - - For details, see :func:`distro.major_version`. - """ - return self.version_parts(best)[0] - - def minor_version(self, best: bool = False) -> str: - """ - Return the minor version number of the current distribution. - - For details, see :func:`distro.minor_version`. - """ - return self.version_parts(best)[1] - - def build_number(self, best: bool = False) -> str: - """ - Return the build number of the current distribution. - - For details, see :func:`distro.build_number`. - """ - return self.version_parts(best)[2] - - def like(self) -> str: - """ - Return the IDs of distributions that are like the OS distribution. - - For details, see :func:`distro.like`. - """ - return self.os_release_attr("id_like") or "" - - def codename(self) -> str: - """ - Return the codename of the OS distribution. - - For details, see :func:`distro.codename`. - """ - try: - # Handle os_release specially since distros might purposefully set - # this to empty string to have no codename - return self._os_release_info["codename"] - except KeyError: - return ( - self.lsb_release_attr("codename") - or self.distro_release_attr("codename") - or "" - ) - - def info(self, pretty: bool = False, best: bool = False) -> InfoDict: - """ - Return certain machine-readable information about the OS - distribution. - - For details, see :func:`distro.info`. - """ - return dict( - id=self.id(), - version=self.version(pretty, best), - version_parts=dict( - major=self.major_version(best), - minor=self.minor_version(best), - build_number=self.build_number(best), - ), - like=self.like(), - codename=self.codename(), - ) - - def os_release_info(self) -> Dict[str, str]: - """ - Return a dictionary containing key-value pairs for the information - items from the os-release file data source of the OS distribution. - - For details, see :func:`distro.os_release_info`. - """ - return self._os_release_info - - def lsb_release_info(self) -> Dict[str, str]: - """ - Return a dictionary containing key-value pairs for the information - items from the lsb_release command data source of the OS - distribution. - - For details, see :func:`distro.lsb_release_info`. - """ - return self._lsb_release_info - - def distro_release_info(self) -> Dict[str, str]: - """ - Return a dictionary containing key-value pairs for the information - items from the distro release file data source of the OS - distribution. - - For details, see :func:`distro.distro_release_info`. - """ - return self._distro_release_info - - def uname_info(self) -> Dict[str, str]: - """ - Return a dictionary containing key-value pairs for the information - items from the uname command data source of the OS distribution. - - For details, see :func:`distro.uname_info`. - """ - return self._uname_info - - def oslevel_info(self) -> str: - """ - Return AIX' oslevel command output. - """ - return self._oslevel_info - - def os_release_attr(self, attribute: str) -> str: - """ - Return a single named information item from the os-release file data - source of the OS distribution. - - For details, see :func:`distro.os_release_attr`. - """ - return self._os_release_info.get(attribute, "") - - def lsb_release_attr(self, attribute: str) -> str: - """ - Return a single named information item from the lsb_release command - output data source of the OS distribution. - - For details, see :func:`distro.lsb_release_attr`. - """ - return self._lsb_release_info.get(attribute, "") - - def distro_release_attr(self, attribute: str) -> str: - """ - Return a single named information item from the distro release file - data source of the OS distribution. - - For details, see :func:`distro.distro_release_attr`. - """ - return self._distro_release_info.get(attribute, "") - - def uname_attr(self, attribute: str) -> str: - """ - Return a single named information item from the uname command - output data source of the OS distribution. - - For details, see :func:`distro.uname_attr`. - """ - return self._uname_info.get(attribute, "") - - @cached_property - def _os_release_info(self) -> Dict[str, str]: - """ - Get the information items from the specified os-release file. - - Returns: - A dictionary containing all information items. - """ - if os.path.isfile(self.os_release_file): - with open(self.os_release_file, encoding="utf-8") as release_file: - return self._parse_os_release_content(release_file) - return {} - - @staticmethod - def _parse_os_release_content(lines: TextIO) -> Dict[str, str]: - """ - Parse the lines of an os-release file. - - Parameters: - - * lines: Iterable through the lines in the os-release file. - Each line must be a unicode string or a UTF-8 encoded byte - string. - - Returns: - A dictionary containing all information items. - """ - props = {} - lexer = shlex.shlex(lines, posix=True) - lexer.whitespace_split = True - - tokens = list(lexer) - for token in tokens: - # At this point, all shell-like parsing has been done (i.e. - # comments processed, quotes and backslash escape sequences - # processed, multi-line values assembled, trailing newlines - # stripped, etc.), so the tokens are now either: - # * variable assignments: var=value - # * commands or their arguments (not allowed in os-release) - # Ignore any tokens that are not variable assignments - if "=" in token: - k, v = token.split("=", 1) - props[k.lower()] = v - - if "version" in props: - # extract release codename (if any) from version attribute - match = re.search(r"\((\D+)\)|,\s*(\D+)", props["version"]) - if match: - release_codename = match.group(1) or match.group(2) - props["codename"] = props["release_codename"] = release_codename - - if "version_codename" in props: - # os-release added a version_codename field. Use that in - # preference to anything else Note that some distros purposefully - # do not have code names. They should be setting - # version_codename="" - props["codename"] = props["version_codename"] - elif "ubuntu_codename" in props: - # Same as above but a non-standard field name used on older Ubuntus - props["codename"] = props["ubuntu_codename"] - - return props - - @cached_property - def _lsb_release_info(self) -> Dict[str, str]: - """ - Get the information items from the lsb_release command output. - - Returns: - A dictionary containing all information items. - """ - if not self.include_lsb: - return {} - try: - cmd = ("lsb_release", "-a") - stdout = subprocess.check_output(cmd, stderr=subprocess.DEVNULL) - # Command not found or lsb_release returned error - except (OSError, subprocess.CalledProcessError): - return {} - content = self._to_str(stdout).splitlines() - return self._parse_lsb_release_content(content) - - @staticmethod - def _parse_lsb_release_content(lines: Iterable[str]) -> Dict[str, str]: - """ - Parse the output of the lsb_release command. - - Parameters: - - * lines: Iterable through the lines of the lsb_release output. - Each line must be a unicode string or a UTF-8 encoded byte - string. - - Returns: - A dictionary containing all information items. - """ - props = {} - for line in lines: - kv = line.strip("\n").split(":", 1) - if len(kv) != 2: - # Ignore lines without colon. - continue - k, v = kv - props.update({k.replace(" ", "_").lower(): v.strip()}) - return props - - @cached_property - def _uname_info(self) -> Dict[str, str]: - if not self.include_uname: - return {} - try: - cmd = ("uname", "-rs") - stdout = subprocess.check_output(cmd, stderr=subprocess.DEVNULL) - except OSError: - return {} - content = self._to_str(stdout).splitlines() - return self._parse_uname_content(content) - - @cached_property - def _oslevel_info(self) -> str: - if not self.include_oslevel: - return "" - try: - stdout = subprocess.check_output("oslevel", stderr=subprocess.DEVNULL) - except (OSError, subprocess.CalledProcessError): - return "" - return self._to_str(stdout).strip() - - @cached_property - def _debian_version(self) -> str: - try: - with open( - os.path.join(self.etc_dir, "debian_version"), encoding="ascii" - ) as fp: - return fp.readline().rstrip() - except FileNotFoundError: - return "" - - @staticmethod - def _parse_uname_content(lines: Sequence[str]) -> Dict[str, str]: - if not lines: - return {} - props = {} - match = re.search(r"^([^\s]+)\s+([\d\.]+)", lines[0].strip()) - if match: - name, version = match.groups() - - # This is to prevent the Linux kernel version from - # appearing as the 'best' version on otherwise - # identifiable distributions. - if name == "Linux": - return {} - props["id"] = name.lower() - props["name"] = name - props["release"] = version - return props - - @staticmethod - def _to_str(bytestring: bytes) -> str: - encoding = sys.getfilesystemencoding() - return bytestring.decode(encoding) - - @cached_property - def _distro_release_info(self) -> Dict[str, str]: - """ - Get the information items from the specified distro release file. - - Returns: - A dictionary containing all information items. - """ - if self.distro_release_file: - # If it was specified, we use it and parse what we can, even if - # its file name or content does not match the expected pattern. - distro_info = self._parse_distro_release_file(self.distro_release_file) - basename = os.path.basename(self.distro_release_file) - # The file name pattern for user-specified distro release files - # is somewhat more tolerant (compared to when searching for the - # file), because we want to use what was specified as best as - # possible. - match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) - else: - try: - basenames = [ - basename - for basename in os.listdir(self.etc_dir) - if basename not in _DISTRO_RELEASE_IGNORE_BASENAMES - and os.path.isfile(os.path.join(self.etc_dir, basename)) - ] - # We sort for repeatability in cases where there are multiple - # distro specific files; e.g. CentOS, Oracle, Enterprise all - # containing `redhat-release` on top of their own. - basenames.sort() - except OSError: - # This may occur when /etc is not readable but we can't be - # sure about the *-release files. Check common entries of - # /etc for information. If they turn out to not be there the - # error is handled in `_parse_distro_release_file()`. - basenames = _DISTRO_RELEASE_BASENAMES - for basename in basenames: - match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) - if match is None: - continue - filepath = os.path.join(self.etc_dir, basename) - distro_info = self._parse_distro_release_file(filepath) - # The name is always present if the pattern matches. - if "name" not in distro_info: - continue - self.distro_release_file = filepath - break - else: # the loop didn't "break": no candidate. - return {} - - if match is not None: - distro_info["id"] = match.group(1) - - # CloudLinux < 7: manually enrich info with proper id. - if "cloudlinux" in distro_info.get("name", "").lower(): - distro_info["id"] = "cloudlinux" - - return distro_info - - def _parse_distro_release_file(self, filepath: str) -> Dict[str, str]: - """ - Parse a distro release file. - - Parameters: - - * filepath: Path name of the distro release file. - - Returns: - A dictionary containing all information items. - """ - try: - with open(filepath, encoding="utf-8") as fp: - # Only parse the first line. For instance, on SLES there - # are multiple lines. We don't want them... - return self._parse_distro_release_content(fp.readline()) - except OSError: - # Ignore not being able to read a specific, seemingly version - # related file. - # See https://github.com/python-distro/distro/issues/162 - return {} - - @staticmethod - def _parse_distro_release_content(line: str) -> Dict[str, str]: - """ - Parse a line from a distro release file. - - Parameters: - * line: Line from the distro release file. Must be a unicode string - or a UTF-8 encoded byte string. - - Returns: - A dictionary containing all information items. - """ - matches = _DISTRO_RELEASE_CONTENT_REVERSED_PATTERN.match(line.strip()[::-1]) - distro_info = {} - if matches: - # regexp ensures non-None - distro_info["name"] = matches.group(3)[::-1] - if matches.group(2): - distro_info["version_id"] = matches.group(2)[::-1] - if matches.group(1): - distro_info["codename"] = matches.group(1)[::-1] - elif line: - distro_info["name"] = line.strip() - return distro_info - - -_distro = LinuxDistribution() - - -def main() -> None: - logger = logging.getLogger(__name__) - logger.setLevel(logging.DEBUG) - logger.addHandler(logging.StreamHandler(sys.stdout)) - - parser = argparse.ArgumentParser(description="OS distro info tool") - parser.add_argument( - "--json", "-j", help="Output in machine readable format", action="store_true" - ) - - parser.add_argument( - "--root-dir", - "-r", - type=str, - dest="root_dir", - help="Path to the root filesystem directory (defaults to /)", - ) - - args = parser.parse_args() - - if args.root_dir: - dist = LinuxDistribution( - include_lsb=False, - include_uname=False, - include_oslevel=False, - root_dir=args.root_dir, - ) - else: - dist = _distro - - if args.json: - logger.info(json.dumps(dist.info(), indent=4, sort_keys=True)) - else: - logger.info("Name: %s", dist.name(pretty=True)) - distribution_version = dist.version(pretty=True) - logger.info("Version: %s", distribution_version) - distribution_codename = dist.codename() - logger.info("Codename: %s", distribution_codename) - - -if __name__ == "__main__": - main() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/idna/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/idna/__init__.py deleted file mode 100644 index a40eeaf..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/idna/__init__.py +++ /dev/null @@ -1,44 +0,0 @@ -from .package_data import __version__ -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 - -__all__ = [ - "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.12/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 889746b2f94d946bb265a5c34254d72466c7bd4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 902 zcmbu7yN(kv6ox&yOfHjqvRMj5heV3(XaP|nB-o|cW+hrTmNR2ACO-Da;{+lqo`Q~o zj%VQwEKyO>Ay#Omt*~bnibbNq#W(*sW1owCKKJ`w<W}<GZT6y$&{uE#UbSm+VVro6 zQj`V)L4bq6>zb%R9oM0O8_>i}2yqB4+=4c4LkD-Di@Olv2zs~&ecXou9>5R}VT4C8 z#$%Y^2~6=6W_VV{tBV7e<9UGAC~bTU@Zr9>2)_j`^&+qlAv>lEt|TFgiS3`Ao<DuY zQ~q3QrESNXl^mVP9Thx1Q7Ow6m&P96^qeSZ*c)R*D(H#{+f6c-Y{<%mv%^Yf`#fWk zsEwUh4lcRjRFFi$ic6+#RQan2oyw3e6C0*1aj9*{WcA%vTcWKg9zG(P0nP28EYSrk z3wd?JR(4YTFHaJ|<l1C*TKNj2xm;g6-NlSui<-(cE6Q+`%f(bT+@<NJN9fV=XnS-# z{DbSrqvz507<ddl<{l%DvB$(?>M`>;a5!Jwvb~%p8@gsBrG{!ZILI~<rP+U_{%2O( z`O|4xqiqpFg&^b;x^U^yRUT&wSPaw@yZBTkTVT=@v0;L(HHBqic(P%7nX1=PD4H@I z@0i@hg0JFyZ!#qx939_}3vSr*y1OFIc^<pTlc~}%PbG~B@uNV<QNF)wKL(X<1$(0J pxB~p77E6ck^&kkopu3l~X;8aFf8*yp6fAx;W>M{3OW$@UegWE%`L_T7 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-312.pyc deleted file mode 100644 index 10481b0a07ab71b0e6a3ece9d750e935b0087628..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4654 zcmeHKO>7&-6`uX&Qld<e5*>?@^_N&O+e$>NxHaS?Z4=q44TWy&x^-EkEX7^Ql$T3( zc4<Qj6&QgIGE&rZ8&m`m6mCxz+(VBEkO0cfKrdv~R`kX|T*McjqEtNj(!Mv#CH3PP z4$vY!bU?nDdGqa?-}lX%KXr7p5lE@uzJ6i6gOE?L;wHIK*ot$6tPqu`oKCV_oXhfY zJ}bn9tQZ%wQe5JQ%BzAd$7Pm#;vUFFUCDam-fUaEjUznKJahY9!>wGEZh>t~aUV}! zA*#GYRF5Xlg&pm7c}s9=@eYPm0O<u}-*${sZX*2**#^jVKn^|z8DK~sAUm`Uz&`T` ztmx?CL5AH2SU<y#JO<mPc7nCTdl6|~4J?WA(7X@{KEO4INVcpQshq0WvZ^_GQcuok zx-A!++<R&&_U#jt=I8@77>n?>^n*fP*KFlX-pb^Rq+akr!%xOPz4GQ~AN=yO4}bSs z3XyK|HVRwQP*@=viE}E6^QuSXG(qLzFKD7BX>ywH0Yq9>#U%-L6WgU`yRfZYf_7zI zjwrVDG7LRsi)zwJ!c1_KrY%#=Do`WU*gDp|1QP386vPTC@+x=n8-&oX)i??Sj?>)s zFW6@UknUk|^EbI7XL9p`g*I6#a&DXD*{e(QXGuhi*|KTTOv-vVaLzCb`FxIAnmWja zJa{2#sCvej9UOjraX7+np%JQph=>#|+HyKavq_8M0Bu3nj8(xFO-)Zz@E=0=fiSUc zaB%QpHhLkK)uI45FGZ(vsX|sWEHi3px;9Ib*)h|~q%LZ7OwC<3^juQaX!Me1T#D+M znP`6Ax{xy_#-BYBH8YkrmQSWGCTBG>n$P5;34p0N8qKIiGKyy<HJ+bmLt5~$eHeF+ z5<0gz3E~Q=wFgS)|J;7?Zm_q~_sxyIlhwYHYnRshV(Y;(72lb^`@3pgJ@@^glKNKh z-Lp5k-}!OHKT=UfXcv6`KemB10Ar#-5UaesV|!>fwxFld5DMfRcRT0-x6NH7$Iozr zUtp0A{JTYpML0IFh}TvU2_u=+5(&F4k;vxMf{tZhBJuM=Qg5^fa0n@Sq%F<NTbgML z8N)eNZ2YT)t-Ld6^lFL%Pont>h$Zs5=#fUt6PpCGn*z(;JGvISEv$vB$EUYY{do`} zM;*x14&>b01VE0xpQt0k=>sjN;NMK_Qh?glIEZaTv5h8FB#IUlD5?Z><^d}3*uhgq zifVY)lllopX|&}Wwv^5QQBglwPBkc%^^4aHI?mS5*md(C;f1FCxh5O1zL;on#iFQ+ zi&9af-9=HAkortnl~JQgFA&396ikm(1`Llavt&_LJ&T~7BCkD5$f8n|=UjSibwR9l zw^CGGW^!|m6g^ZbdQ@crr~_<yETj;YT4<;37ZV~}j&rzZyHZhh?G>d3Xj}B|u+zL? z8+|}4vf!#W)^Z|>w=L}j@!+439&+Q1@hA_Ph{9-(`IX(7C>R-}n}nLP%mmeJ$;|5+ z%a)V*JTMYP9%hbbi*vb*vD!wTLQRty=^?1vGP}-9+h@^a2FVu9;ay=CbPLEdvjB#j zE3eH_CcsxrJe0tyjl>+o-j|puq|+KrIDEG-wD;(Z?}Qu#E9T!oJQ*b(xE~nW2#i(( zqc_F%z}T`}d#Y#Icc(o7Y*`-u)nsj8xa6yKhs#H<pS}|c-@{Vr^qsDr+S4PY>3e}L z_`=`0EY?E3{~)4wVEIJN7rgfB)mPsgxe<D2>@U8<cYt|2yUW~lZ%M5AI^TY|EdBa) z)z^P@YSRlJZ0;lbdsfb0KVMF-hYsEJRYT7$x78Hi+d^r2y>qCl41sZfPx-luf1sia zFo%x8u3=n6ak8`@#Q+FfoXO>M#yNBdl}Awwqd*RHsOA|gp+E!X*FY?hO}<|mya7}L z*&l&wAbW3$WozedPgK5p_V%%lfKNc}7{bs0OMEiLLZfYb!j9Dc*@S$VY(ht2!?!a9 z{R$}PS5e>zqR8#eg*=8Oyj33W&d$xe!<`#D-*jgO@*<jga(51Y>F(@%0(b5Vm!~TJ zp^7r}ICrLB$F;;u$MI&2^LBglG1Q@W0sc*IJ}3>NH$#Tr3>kVeWIMbW>W(+#=R3UF zjnlU<ZfHdZ^Bg=#d}l4HC9^-G5VO+Qs<4}fcCpR#V1c6eDg3wa`dA`0QE@s({TJ={ z`x=JPF^couy%^s@9f}z&;K_0NL6yTGP-rGxSQd}`9tta@^*Wj3o0w)n<yvo$TMg}; z`+#nu2zdkwL%Lnba^o*z;S#fC;mg7)b-JZL@V6Rq4ZLfFm@VRa00J-(LrnG@V4<WP z%(MbB=c1%LbdD=g+XvSyY~E$Id2S6fu%Zyu%Iu+G+Ftg;IAy>?2uIiIhg}=&w6QH^ zOTB9k?Dkm=`j~~-kj~T7@Oc{kCZ6Og<bHc#qrJD<-dpSFy6f+L>+-cXuD;PK^p4$y zUuXz^b-&`1H;E$2YzHIzZ84Rj+otS9B8+x$h3I!c*gOO*vNfNFh{JIkTxQ#o%4PEz zU2`}KXJm(8VnKzb?u{nc93Kg2@YC-3pTh2OqPte&q4K=*FnE!E4_eWu%-?|66gZCi zgdG1XIsP%}_?UP<A;b5&4wjCrOkSU?^iQsL9j}nix)|g}mrq`szB*keP^=#w;0DY4 zH+m+kJ(G0;mHJCuKR4V`K?PJC=PeyAk8Fg;s^PIZfofgZtJ_rCIJxx0jnJWL=un+N Ig)Q^H0QnTzLI3~& diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-312.pyc deleted file mode 100644 index 4d652288faae980c2d3dc9d788d8cee7a01198f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 908 zcmb7Cy-yTD6rZ{MxG(V|hY@1XZ7ddnMF@$7nq0)<64?f5Xw2Tu12*i=Y-Z;$s}{!C z*<8m}#+Dcp{|}opb{i54E4oY0ipn<&M=W)c_vZKJH~T(*v)`ts8U$DP@%4V267ow2 zlVx6jaTmc6VT93`e5ufLL`zg*MqEjZ9V0P!Ok_;3m<9H($?W&$P8DMlY^d#4W-$jc z7BW?2>Z}F^vsfMD2F8uN?lw=c1LD$x&Y$YiZly5VJTI(m9tmDpanOahuqCLT<e|Ph zSq1`a;~8{EL|t-k$ma{ZNsg(HxozN~U~o)j74K%6b<ViAFB0&QKxK#Cx(Is-aFuxq zV%U>GvY4qTJOH`K#7iEFfPwT5fggHt)b-L_?F+uT^kBuyA_a?S5FP}3ka=m8dN1%A z6Vi(q54=z$X`q(Uyr^!8_U6-0M_$G97TWj<y0_${d82>t!{ebjGsc+w|BO<<rk;|4 zo>J<x=QGMFghhQzpqM4q!nlSeuW5H(vo!Pntt6upS>I8&;=fwxtov<eWqJ9b!vtgw z7s~0WD2_64c#uFUA$3wIln6zP?X`TNI!PLX)*09{DTQ>YoW>^p?zT4hR^CFUsaY); z>eQGU-g*9`u`x6^%GTXxVTM9NVd>ez!d7`2@ja=vl{UJ<$doLsZmu9JRWIrq2T}&P z)KZisj?aZCwK}UkN(Af0@I>B4UjHcB7P^r^DLo;r6Egji%#BP+XZx!og4<withbS^ ikG2PEpWNZ?``>Ral;qdeCF#??q0f9eFn^bOIl~_~@zdJ? diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/core.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/core.cpython-312.pyc deleted file mode 100644 index 76c0807d9bf613ba40a437ac2aa0553a9383a895..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16303 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 D7eFym diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc deleted file mode 100644 index 017e6e50601f134e8bf4f136dbd6eadaa38f0d0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38403 zcmaLgeSDR5{RjTT7&pSW(}}24r=kLm8x;|8>Va*rjj@d}#u$U$aK<*+9lK+|2Gj7i zX=r3*WMpV)WNKt)WJ^&|Da}ZU$jGR$$i^Zw<D0+N`~7--`u+2J{Q7=<y<gAky3Td3 zox^s{&fVS|F=AK*|6BRU#+oJHiA4Tj2>%<Y@{gy-MIv90#3Ch;*nn7EY+x)tHYhfD z$Don{wUOA6*w8Nyh@Is*%yYPBg69a&k)ESGN5{rs`?I~D6H7!t*K@4rd7k5ZoAbS2 zU>)akp)1MPT;zGN=Ov!Wo|pPImw8_9Io|UMUwftJRh|<(CwfluyxQ_HJEs))WX~y{ zQ$447UgLRf>^dCzbnn-D&hWg!bEfBwp0hk}^5aPLezT>Y(=F~>J)^$GY|lBKX?_`{ zd(ZHk>p9Q2&-Bdl%=Vn`nd7;@GuP73DbJnnxzMw~bCGAE=VH$y&n13N#hyz&OFWl( zmU=GtT;W+}>E~4LuJEk%T<IC}tnystS?yWlS?lMz+H;L(ooBsggJ+{>lck^2T6eQ& zi)X86n`gV{I?oQz^`09%H+pt@c6n~{-0a!yd7Gu5)9vohd2aE%!}CthyFBmqyvOri z&(C}Ic;4rEzvmbHE8gn;0nZ0*iJ#LKecd+CFL^%X`DM@To?r2N*z>D?`W@cC=KT@x zU-!P#^Bcb8QO|E$`Z?|Le_fCH(#Ji&<y-Iee8Tfd&u_=};NSXpe4D3y$#*@U_I$>d zKkNBD&%K`CxAb#*&bRx4=kuOF^nAg$`;qs3o<H_{(eo#sy`Deye97}=&;5SdSG>Ra zzjJ!ceZbef?)?qVH+{)L&!72{pL@RL`L^dTJm2yBrRO2fUwOXk`JSbJO^1D7zxF)h z`5WKjsON7z-}n5T=P}RUdw$^g2hZc4fAsv5=bt@KSo%4A=>ChJ$6q~9`jWqSe&qRg z&puy!%6q@}e|VnuCI9sN*z;e${1eZA+Y&#gPkr5gJkNOkpXYx)KeOCAAQsUapc$t* zP%~b0kmg{`A(}%q&(a)b)6O6J9<F5xnj<tvYL3zztvN>XY|V2t6E)A(9IJVrrr*Bc z{LYvCHU_@XtYb;ix{EX~*1SYB*=_-F8o$lKyiCh4*Bq~Tg{I&7V7sgAQpcR2IZ^8; z$yduMHgznMwQP#!RLyCc*Jxg=d7b8T&Fi)A8S)MCOwAiL{k96nc9Z>Vz)aQlH`~;) z+@fW-YDTrK-*VwJbF@57`}Er{EcaV5Our4ooTv4fnpv9Jn)5YtG#6;*+SIY+X<5GJ zLd^orMVf`0i#3Zh{Z<agQmpH8sb-1hGJP$j`WlyOuF&!_n>v<qEvwM1)bv|FoJUNj zt<qej_0^g+nzfp%HT~8Qr>~RiH5)V=HJj{f(y^@7*VnAsqVsH({T34YY}aYmX?cgH z-%?_|-&SI7)OMYkU7DLTH|uoW@@+PCEVpaf=QREH6Z^bFzEkrq&AT=4(Y#mFZ%uK! z9{E1a`!&CyuW_s916ux|U6(qRFKXR3t^1PZLz-XK+^+c*&4)F=s<}h+YnqQ}eqD2? z<~KAS)%>PS9m_5)drb3j&2MS$)_g+qNzHF-?$P{?=2M#A)%06uTwc$}&uV^8bFWPu z%lEbHIZeN<#%cZ58uN!*{(|O@H1}!#So1~ApJ?`K{#5fN&6hRzYrbMr$MUL{y{36U z^L5QPG~d)bsQEL^pKHFQ>9_9q8h#=BEj;YE@tB9S{8yUq+SIZ5?LD?RtaZQEJfis< z&7+#X)qG#`cbdmEf3Nw0<{vbVYyMI5Pnv(Wsbe{zWglw(Mf0zkCpG`3f8!r%{#~<A z^OR=4-K)db_7Ba|I{iO2Ki2%0<|j6FEdSQBPc{Fec}Da9H2<slna?=gcZkDpk=WPP zIQ%ZjIZ!iRbCBj>%^{jYHP5o?#}XGCre(u56EsI?j?^5b$@>mCXPNgM;$pn-5Eo0- z@^dxEYM$qpTU>0M-!{bIzJuLH#>FnMsbjfN%aSxN(!5yvxI{Bq^HR;rG%wd2uX%;$ zm6}&+PSBjFIZ5+sn>v;hEt{-4MRTeq?>ofBu911)Auh)I4srb57GK}>T0cYc2F;n8 zH)_t(yh$_FrjF%iExSeYR?Vp9Y|S~EX`1Pp8Jcr7=V@kYW@%<?&ezP*TwqhjlB;ET zn)&z|7y30>plfT9))Z<k)-2LoqFL;>dU3I(I-UQ9jJ++B{kLS;e^16-q2*;Zbu{Jw zJ9qz$8S>wmF?qis4)+`E{$gCre{;rMrE{;=tkJC1T#aq`^{mm7I?Z~`2F*sz|M#9l zTx_kDHEXtL@}5IntW94-yC&~B#Kk(a-FnRpnj1Ac^;LAqo8--Mw|tvTT{gFC+2^#) z7R@^}@6`Ic<hwQR(eiuc&&xfU_i6e4vj0AgOKq$CfaZfXbu3@hX|`#8Nnig%|GTum ztTo#;zoPlD=2ta$Xnsxe5zVh_?$rE-=A)Y5w5g-nrDcz4KCbyK&E1+$Xg;a=ZOuKJ z-_d+Z^She7?+~Z^4so$(wfuXUdu{4izOQA^Y5qX-d0mP>lwZ*Nk>)<lA8Wf8<)3Kw zYW`I7CC!&L_iMglQ^)eEmc6EVK=XCYH#FbWJgE6I&7W(&rE8b>9pZG~Aujfg*8ft+ zd`SM4=DRj^EbnRAVQuS=72sdX5iS3X=26YxYQC@eJI!O7zt{Xg^ADQGHUFsjC(S?G z*PvrLp=BRx`lAUr7Jobe^Q4ZE_Z{M5A8EV4Yk8mMDJ}2U^v4%)`qT11H9ywn_b>Sq zJH3wO-`dxwTK6Aqdq(sBH2<slnQuQ(_Z<et>}TOZ{6rjxdk=OCJP?mZbH@7~2ja15 zTnkt}SaXQxP|dS!`q2#3y@!E%<Y8beLEDVb9H}`<llLA5>fXaZJdVxtI!7~6^IXlb zn&)Yb(>!1E0-HLP3$-js^CHcQH80Uj*1S~nGR@01$7^1pd8Ou6niDi9YEII;+NO>r zMaw2@PSKpI$$Jk2b?;$d>{>0qPIJ2E^_nv@Z_wnuhk>yh<yo3HX{OqIY=B+P{~!Oi z2iNY+I}#onP!flB3;w$m|3&fN>>UG325ud=e$Irnfsx3D!Pi_rW!jW!6UWy<kyb?S z2(KNehgdhEo?z`pJ;Qnj>gbWa?OmwjSU-=N%z7W{G}cE^XR>~P+QS-&$GMI2JzRZJ zB(lBLYb9!Ho7XkAl(iT2OuH`~dkK!T)9b~k<*aj2yIFHlle<phj3ULT(JtS%1U1H5 zidx6I0=1QO6KW^x_faF8{A9179%em+I&QNsJ&Ib)+K1Z8`cKpYte>GC-du;TFmlzU z_$uNDL>#NG9uV0!c@Xi10dbMYprOP!fbPM<+yWeZ=E%szbNy5gPr-g>X&0w~x`215 zVoj>n44xK=Bu0gyKvKXYU`s$Ma11zUN7uUmk+0K4k_X_5isJz_Yye_Ih$BF6t#G_C zE^_y+!?}Zgpf}*ym4mRm(Ofg@1|aEN;^LXWa^cb3L6Poq;rD9>MS5qA<@sE^0h^Vd z$J5L|XE63Qj(Ga=!I9{Kagm8<`899=+og{^X;<=JQKRSi(to1vJI^n(8#WGzwASf} zZw8J9+zNaWFb9a#YqJa>As`<Z2TUC77u1(=sm0IM1+^1sog*Y)GcXb#9l^uA4mgl5 zECQk#Blx8aXtwKgRAk~v-`{`iDha!YToZ|$PSaHqxfWN;Jnj55AUa<tz7Ah*j?lDu zKxBKDj{Ff|Kj6DQJ#`?i5*@=C;84J4z-hoQp#jryKsav4<v7&taNI>eA&%SkRs(DW zCJs6>XkK$w)tVy%Gb<X749={oY_3{&WN2n>b47JUL&cGy^D9~_)}Yl!aJ_xF7{^*W z0IfF8VxUF5#UP8J7Q-!)5g(@8#+Mo|GZq+eg-2?~TU=prrNvbi6D%fLOtQGzBE@2| z#T1LF7Sk-QvAEXaI*aKR*IUf6xWQtk#f=uTEN-$$wYb^h7K>XgqKFUE?9gT#=UAj! zq+4WI%(a+jk!g`-k!{gn(P**OqS>OwqSd0!qTOPhMTf<DiwzbVEjlf_EH+tew&=FF z&Ej^8&sl7-xWnR3i@PlDwz$XQUW?CL^jO?yalgeEEVf!aVDX^E7cI6~e97V=i!WPj zxA=<1!xmq)*kSQCi$^TJZn4wi8y1gReA8l=#bXwaTYSr6x5X0{Pg;E2VvoglES|FX zuEo<9&saQb@jZ*Z7T>pc&f*6a&s+S^;suKzS?sg;vBirPKe6bw_^HK97B5@uw|K?k zRg2dw4p_Wy@rK2l76&bUX7O{2w=CYa_=Uwg7QeLkmBnu@KC<|`#ithku{dM#nZ>9f z_{UXf|F}k@)t+r}jzyxyxfWwB&a)V2alXX`78hD1SzKgsvBf18$rhJdTxM~(#dwP= zEUvV;%3^}WM2krlS6if5OtzR}G1X#$MXp7jMZU#Civo*97KIjzEs89bSQJ|<wJ5Pz zW>IRf++u}AnMJupg+-;sN(<ZqMQW=oR#{YA)L7uwC{nxHVvPlUphs%);~L*;7L687 z7Hch<Em|yEE!r&FE!J6dSgg0$V6oAn(*i$H@%?78+2Re0H!TiY{LJF#7H?U+ZSf0> zcPxHsameCV7VlcTXK~o#*A_=Ceq(Xe;<py>Tl~)An8oicKCt+M#c_*2TKvi4&lV>v zKD79Y#ith0p@`WQb1c#<(k(J9=330N$h63^$hMeokz=vIBG)3%BHv=6MS;a4i$aUV z7DX0IEQ&44Eh;Q3Emm5@EUGM4SyWrpSkzjqwrH|gYtd}cV$o{RX3=i3&Z5I&y~PHL zjTW62T^5@xHd}OC+-7mR#pf)xSlnT8r^Q_scU#<Jaj(VaEqW~Ov$)@4tHlErJ1xFp z@u<Z&Ep}NvX7RYiw=8yBJYn&q#kVc?SbWFgDU0t~JZ<re#j_UQv)F6#eT(NTeqiyu z#SblBu=tV1K8qh)ylC+gi(ZSLTD)ZOvc-OjS1ew&c+KK~#RnFH@#3Z0Ar`|dMp`6W zTxxNd#pM>`Ev~S*(&8$M2^JGACRto<kzz5~Vv5C7i)j|uSX^syoyByE>n&zj++Z=& z;zo;E7B^X>THI`Li^Z)LQH$9Yb1c#<(k(J9=330N$h63^$hMeokz;{7lKAIsk!O)_ zvCyKxVv$9m#bS#hizODt7E3KkES6c6S}eC%VNqsLZc$-TX|d8GW>ICa%A(q$#-i3@ zwZ$5XI*WRX28%|ECX2Ne%@!>dtrl$-?H21SIxM;^ZnL=E;&T>TEbg$l)8a0RyDjdq zxYy$I7CjdCS=?{&1&gf~4_G{C@kNVm7GJV>$l}Wu+bzCg@vy~LEp}LZ&EgS@uUqW2 z_=d%!7T>hkW$~EB;}+kt*lqEoMM5%SgvC^gRTkA2H5RoN(cOsI7IQ4pEYdA9EaqCw zv&gi_vdFfWZ;@lMz#`Wo&m!Mqp+$kkB8x(c#TG>tODu{lmRgipEVC%JSZ=YxqRgV) zqQaumVx>jQqRL{GMYTnZMXkkZi!~N?7WEbl7L6877Hch<5g+D6&{~YW!v^37fW=D| zFI()lc*WvXi`Og;SiElWhQ*r}2Q7YP@pFr}EZ(;Gg~dA-zqB}H@hgjWE#9*@Z1HQ0 zBNo50IBM}*i}x*lXK~Ep_ZA;m{K4Y5#a}H>TKvu8Ba6RVbPq?|W^ud4=Pb5Z++lI2 z#a$M6Tij!Duf^vrdMxg<xZmOn7F#VIuz14aNsDh=?6LTc#ZwmFwTO&B46ul^7-$i1 zG00-D#Sn|37H3%uvlwoXU@^jCq{S$U(H3JY&bBzmBGKYpi?J5xS&Xwd-{Jy`3oVi? zF0#1T;u4Ewi%Tsov$))1+9<>|7S~!_XEEL4dW#trH(1QHxY1&k#Z4Be7B^emVsWcQ z)MB>99E&uIbc+m&g%$-Ci!2H)nk?2@G+VS-v|6-Tv|FsR=&)FCvB6@aMW;oV#U_i* z7Tp%NSv+m=jK#AS-?P|j@qLTuEPi0|yu}YKUa<I)#XgH4TfAuT6N_GppIW?R@v_B! zi&rdOwRp|qfW_+;Z&<u(@#E2mpIJmcL=3QqvlwU*Z!ySXu*DFIp%!OZ46_(+kzg^x zVx+|=i_sQiEY7w#$0E_<T#K<5=UI%iIN#y|iwiB1EH1LR*y0k4WQ$8JF0;7YV!Xu_ z7FSwaWii2GqQxYOt1VJ2CR<Fgm})W2;u?!<Ev~beZgIWE42v5qW+Emg)ZS=)mc>mL zsTMa|++uO7Mbu)p#T<(?i}{EN-^Zg={@9K^2DX=V7HTi+M$|0>e1m_Xb`JC!!Gk)- zSmRLR<9#U}go`Aw4n|F69g3R7ik~)-@vI4`DXb$=r?cX^j-;}ljhfDyh?>JX7PXLd z9BL`+1*kFBB-A?Ai&0xy?QyqG*2_@0u#QLVVZ9P{8|wtr9jud3cd@3R?qQvRx|ekt z>OR(MQTMaXKt05IBkEDsn@~@%-i+GEdMoNDtayAXGIWq%k{PI@S@A$sWE^W2YBDPx zq>7}l=Auq#%|}gTEkI3YEkw;>EkZ41Ek-S6EkTX3mZH|Nu0U;NEl2HStwi0z8bj@2 zU4^=hwFY$u>uS_ptaYe+SQ}9HvNoaaV{Jy=&)SN5khLB45NikOQC53M@dRrZY9A{e zp^JRNdK+qFuwRl}P!m}1L``J92Q``Xe$;8KUqsDheF(LXbq8vU_3Nk|tdF8@Vcmt= z!}>VtHr6Llce3t5-Oc(G>R#4oP<vUwkNP(24^R)Y?n6D!x*zp4>szQZhxpg_3)Cp< zFHtjDe}$UQ`W|XA>#tGES$~6C!}>mI6YDY5PSy`lx3C^Z?P2{B>NeIBs5@Byg1U?K zB<dd4k5Koro<iNn`Z4Mu)=yE7vz|dc$@*W^)2tCZbbp354mEx#f5M<9untB|WF3l{ z#5xRhJZl1K3hPMJ>8ztsQ(4bOO=nF+&0!sjTF5#MwUqS&)EH|LY8~svsI9EYsGY2r zp>AOvkJ`g}CF(ZT38*_*C!y|QO+nqmIt6tv>onATtk<IMXPt$5ko9KNKGxZ&XIRrv zhw_p9Ow=USY}E0rIjAYDxv0}wpGHk(eF^pWFu&B_K^-^T>)%kHX8k+r^Q=*Onjpb9 zuxGu7@)@i=)N!m$s8LpXlzu;}JsozC)t(MJ%4$!Con(CgHOeQm-a>tv^)PBFpVvBq z8e=_*TF3f6YAfq8)J|4=W^4=Vanv5xKcQ}8J%PG|^)INqSWlwvVf_eoFKZv_KGxHy z2U-7(dW`k|P*1X!;}*7ev|l=vs9VN(jiL6iu0q|$T7$ZSbv5cPR(l3v4{HPJUe+em zeXPx>`&nC253;tS9%Ai4J<7TP^*C!M>Pgm3sHa)GQO~g6jv9ZqAMf3$39LP+DXjOS zPG{YUn#%ehYC7vS)Ew4_PzzbNqn5Hhj2dIzfm+A<2x=?qPSj4;M^U%1?n3QheH?Wg z>u%H?tWTouV%>wfhxIAcy{u28?qhuxbwBG~)Pt<gp&nv=9`z{e3#i9g_o1F-eG&CE zYcJ{<)|XL-p5qtaE2yJcUqc<o`Z{Vd>zk+(Sbv5(jrDERnXK=irn4SG&0&2PwUG5N zYANdx)EMhg)H>GpQCnG$p?0!<fVzeCIBE~;pHR24o<QBf`WMt)toGd19@dXg_p<h( z?qlso-OqX&^&soVsE1fTK|RX)De7_7GpHw7|BHH>HG(G|&#=a!#wYrP8jqU5Iv6#P zbtq~Q>oC;utO=+otRqpUvyMhhWjz};oi!0PhjlD!A?rBQQq~JlW2{N2b*vYowz4Lp zcCucEx`lN-Y7eVDk-Lp`0_qOdNvOM6Q&9J?PC?zvIt_InYYA%XT)!OdLhWX~2Q_)D zFMSa;owXPB4C~9N@q9M-Rn*a}_H=L3dCdv<Iqs+Z2aG3r@k1<fA)Y;nj`JEt?Pe`U zjX&R)+LLR~vmQb{&T3D|6kg~Xe2Ch~+K0NEHG;>{Pq5BMjVAfF&!SGh$m_?bkxRV( z7xgsjl%ZIf>`P0nUg~uXYB%fMsJ*OTKplUXZ(t9_ma`V0g=^t*Um8R0zQSu0>UP#G zsQX#(LruKWH+TRwmGueK9M)%0ce8#E^#JP&sE1i!LG5FG9X07H-`QKJDXfQ4OIeSj zcC+@QZfE^J)IQeFP(NXf$NOgEC-}~Wqb9PBK}}_yh?>KC4eD;z>rfA{&OklHIt%p} z>&>WrtZAs9ux6nqP4siiMNMHXKuu>|j@rc9j=G(73u^o%KiU1LiL4Kzrm{YPn#1}G z>TcG(s0UbIKt06zDrz6=8>mTF`+k3pn!@@E)F|t5)Na;3)a|U1;rQpt8jl*E;(Hi@ zn#ei^HI;QDY7Xl)sJmIGqaI+Lg?flJ1GSGe3pHsnFDTR$)?(B`));ChYZK~r)@IcG ztXoirPVqf_9yO8m0o0kS520qVeib#w`Zd%h)}5#wtdF7guznkLC+iES&$GUa`U&gn zsN<&cLPedx`U})3>tWPV);`qjtRw7)#xy_K7}S}p6Hzl+XQA$9%|PvA%|ab_4KFCv z39L&{3t5+;mb0!vZDoz2cC$92ZfD(s8oAbYb{}dY>jS7WS)V}7WZjFpoAm|ML#(f$ z_OZT>I_^4N4yY4Y-$N~A{T*s6>v7a>);`qjtfx`;vyK>nBb&}k2X!VZUhWaeWX(by zcfD_rhdP0^7&V_YhT6&6gu0!z8}$V17S#9|zK1WPCbB+@TEn^z^&snusHa(9Lyg?v zCwmih0_(3(Q(50bEoME2TF%;sx}Ehj>H*g4M&cM|`p#}beVa88HFBdbEkTX4e$KX? z<xB5C9nJcA)N!o4P^Ymzj=GKYd#F2DUqpSI^%c~}O}?|&P{*;pg__KI1U1Tf47G!G zz$lz7)lZgyn!<VkYB}p9)Na-psE1f*q8??Pg?gMd4fPXNy#6RM`extn0@U%W1*kJw zm!RgbmZFxk)}pqu)}!ubZ9(17+J^cz>usnfSnog`dW)ai7g5KtZb!{${TgbF^-<Ig z)^DNqu<k+K$@)Xoy{tb*J;C}K>bP6|EV4)AGK+eB1T{L_>wm1Kd5w(0KQ7j+v$1Wa zFU>`rkmYp=YLs;;YB}o))Ed@%P`g?0N1c%ECwm4p%K9AY0oI?O9%KC}YGl4|`zq>C z*7s18S;w4%b7LKgnwjI<F0-Yq<*2O-eCbxyNUqn9QM*~|$KoGtzAx=Y-M7^1S8ZvD z*T156v;G@(|1w`X_B`yY)a&)Aoveknbh$6BN9|@^i~2lkE9wE(y|(QN-}VsdVb;T_ zrDeYKebgq_zo2%rUV!KIqUFB9dem;#Z=*&ked))jy{wm<kEJnRnu6NRnu^-X+JHK) z$~S1UrL22UBddJr8@8172x_$2mnL0+4QjlWp?0%&S*`V@_oAL*eHb;m+L!J|-NE`I zYA@?swk_*|3$foi-?jubTJN<Lbr0)l+n~Xh&P+mW@|taRt=CPc(^-Fs8g22V|3S@X zO~LD7@$yEy|2qwJA8RV=N!C2nnQgv72kIWyuc97jja-b=uJaAzP~$ti#-k>%4n|F6 z9g3R7It+C@YXWKt>qyk;tfNs=S<gmIXH7)SVI7NF$T|+Sl=TAC7;6%09qYxYt*ptY zovfFkZebmd+QWJ!>NeI1s5@9Eq3&W$LEXbT1$8g$G}L{p*P`xcosN2tbq4Ao)|seB zS!bahXH7*t$$AUwY1Sy}8P++d@$3EaO-D^&or{{tnu(gknvFW1H3v0?H5YX{Yd&f! zYXNFHYawb5YY}Q8YcXmmYYA$MwG_3Ebp>iGYdLBsYbELy));CJ>nhZ3tTm`RSXZO& zVy#2n!`gtlm$eCXA8Rw}e%4mhgRJeShgdsMkFst+J<i&RdXjY$>S@+))HAHNqsDLW z%XbTE0_&ZqiL7^{Cb8a&I-a!$HHGzl)ak5SQBzqTL``SihML3rFlr&|BdATRJ5f7X zA4T25x(l_3^>Nf~th-Tnus(^pi**m`9@eK&_p&~Xx{vi))cve`Q4g{{hkA(hdDNq< zFQ6W0-G_RT^+nXvti7mbSYJYo-{=?Le$)ikS5XsL51=NozJWTP^&n~r>(5cAv%Za* z%K8p!I_n|S9M*SH3t11Nma-l}jj<j@tz&&3wUzZ4YA5Rls9RW%qxP`=33VIm3Dg~| ze?i^FdJ=UH>qn@2S^H4;vG$|xXFZL2ko9BKL#&^m9%cO$^*HMp)RV0LMLo?r6mI}H z!)k9>h<5trI{{ViQkaR_%cb_-g-BO39<Pr0RyDR&m)Etn6>AIX0oFFuw^`Sr9%fyS zdW>}=>Iv2^)IQc{QF}M}et&?fw>7+ms<$=#5;eNnH#m%{cR2h3wVO*%pl)UT7pmUj zkasC=YX<3M>30C52MgsXI7d7QX%7%bDuFH62-U#0fLdT@z#3q8Kt1quKr^sEpba<} z&<Pw4xE+Yc)17{%TY!XsJAuT2yMd&Ddx7x*JwQsp{lN5qtw3tPgFt$~HXtY9A)qi| zJ5U<%Fc1sa0n`ON0<;F~1UdsA1-1n20(t@-2et+526hBI3G52k1MCTS3fLR)G_Wt= zSzv#_Uf^KBbHJg1=YgXEF962__5mjYUIb1D^a5uBUIOB;)Ah3-NC<cpNDMdtBn7+y zj1M>nqy+pNm>%#pkQ(p~kREUd$O(8CC=56Zlm;9DVgW~ix`6kA)_`L`XTS%*mViG3 zJpq3Mo(|{-o)0(;91OT}GQK;e>jIeo><E|w><y>^dIP=;oVi}7`4-SUL-;PRGvEhy znt-1G#{ymhA~)zXZvn{x?*Y+(-vQ+TktsNzfN8+Knc9K9+vtC9J(>dSj%v-#Kp)UN z!hXEj&w;OENo<Z*e;u%Q(ln0_t3R_7;I#(6?KHeGCNW*;1-j>ATl^juvFGWy&3)tX zv}}0S(tm;IIeLTDh%2!M50?9`Qh+EPBX`UJ;?Eb-frNm$Kw>~9kQ9&&j1R~GQUY>; z=>hpbYCr*y9#9D61QY><0mVRRKnV~FC<W>QRsgL5<v?dZC9owR2J{510=5Oz06PL! z1G@t1fIR_Cz}|pOz}o@cz?p#Cfp|RC;FstYAR*vRATi)>ASvKpV0=IikP>h|Fg;)^ zkQ(qHkRGrN$O(7|C=A#Rlm<Ku!~%8zbpd|@Is*EE-V605BwvLc;Q12&dd34i0apUs z0ww@E0ww{w0#blI0aJjz0oMZi0;U5817-k+0%ih717-oo15$yL0k;6B1ERp0fH^?? zMd9BykPt8zNDRmXk^-`U@c}tNN<c0!Js=-Q4JZK80}6qhfFhtUpcp6(C;?&tr9fT4 z3ZONh9Ow+F1hxdkfS!O=z_x%IU`N1eU{^pLuqU7a*c;FU><d^A><`!ooCxRw`U1Lv zGXb{)@pw*+|NMc3fIET2fO~+Xfct=H0b7BY0S^M{0S^H=0o#GnfQNxtzz(1;;1QrT zU?<QS@F=h)U>DF6@Hnt7U^lQM;7MRtz|+9Kfaici0nY<R16}}*2kZk*2D}KI4(J8W z1iS>qU!n_fKaddcI*=UjCNLr39Uwj65Ren_E>IY77$^-m0>lFT2^<Lc1UMWp0k5t* z5il8eI$6io3PdgyUNzu}Q@`qu0MW~ZPk`=#Gr-A!DHCxS1QY_jc)Hbh@KYdyCtSHV zAoVKYGoU-*279?5o{aU)at#xO5+E9|4(JYe88{K}K2UeHPSa<b1^f#*5HRFwTqSsV z*Ux7ZFh1ZsAU)tJpgUkHurpv8&>K)|n}v5g{}qT#)viARo(}lbP7|<e2{yx1$$kW* z@z&#+c*mFHY#=@0Tp%YP8R!hS4A>HI1<(^P3D^;E30|q!5#9+rZ4(X@?*#MnX$21A z9bt}yi2Z7&w`N}jOb@sT*cosO&=-&koC#O~L<eXG{{bR#!hZ+E;T2`V*X)&K!-QV| z-2uNh4A+|Ef!HiTm<{X=$OeXv(3*`vG~f|C%}A};4|E5-4J41!nn&XC^^6vt1iH@_ z&H&}-2onZjZ;3(-=nZ%jC>^Uc&jLLGF8~Jvehi!pxM2wPHcqE0GF&9o0Nnw1+M0{C z<{2O<;77oLfWh`^yJT&47LXh;1DFtSBXBg}W}q*i2sjh44(PsAd;2;NxlH(nt+`zI z7<fBi>{-}syw=PDx&xlKHCJj)FYrk~yuC1Rg4PTH5(5%}X#wMa!hjh-EZ`>KSU?mw z6VL^8Pt>lz21F(a2MkvWe+I?}%ovU}DOyuxm@Kpa-2o5U8oc1aze}?01&z~$e;BS4 zCX4{43$uXUfG6#hkF&JqJHVcRXMx^;i$>wQ<fgDUU`ML35a<oK({QuaykfXT_!rQ9 zt1!=AV;L3Nf$g(}9|30qUIvDyY0ZZ~G~iR9H{kj)*ju_bivouOGJ(+<TGI+d1J>DQ z0j~g&x!UY!!1#H>Z-AKrzXh5C&bHTvW@@vUKu*9M;FEy6Y_n`_b`Ovoa6d31;1M7- z;0d5J;IBY$z^8`!+FSfN*maID0!R!P1EdB_1abnd0d@yW2Mz?x0uBXa04D>ofTRUF zpIjg%U?C6<C<aOcVnAy^J+M8X4d@M+Z?CG&*RD%|=t7|q=m>b#HY?DY13=Ou;fS3k z;JI_LS&`QK6gU>}K2W|yYi8T)cZ-D#VDwU<1c(Ow&^9a4nl}u~gbU9D@X8|po=X8* z17-oe0rPCL<=X5fd!=x>@E5~MVaWOT7auST7$4J`L||ILc|c*n44^#VM&M{bI&d<e z1c+8?Z@Yo+Rl;FlcfbcgO|{ni5$FlH)n3$Gqcxd8QmybX5Dj<)XkD!}{|0&k&a#(6 zH)+icz=VL=z_EZ5Ai7qYZ3PYl>;^KMwdM!Fu7DvIVb`r%GYm)$xB*BBxCuBBa0}2E zkO`a#C;_5)m$P4|tAOr+T3|=O7l7RX587$kb(*gLIRQ@s-2wl?YrwlVYO^ty;HW!= zn}E!KG~knf5+K^8&7J{zHwh14jvYkK;(?}L0h}$Inu^ohB21f(HBq6+uuzyc7Z^Q^ zJGgN*kUX3yGvGx{ei^I=x&wX!^ai|Pn_aEVJ_4cv|Fq2lZdilOQnXpRVX{yHL<2g2 zo`9{u>45GA9Knq`&HP5}AXT^<NWEFuX}CrB0O-a?;rN&EN1z92wuiiY$tOebkX2Nx z-%S9L6S(HA5y13>NVC08pxK_^Z%z!SvJYmlPibk!i$fyKc(p^M`CJP;htCtAxprWr zH+;y<npA9!m*Mysb^*O>g?nrb9)$BX4+GJFuLG?CQ|wjosUx}BJfJt=h7zo)(VBYT zWI#J`s8(z407kDCb^>()PXk*5E-Ay_I<?u=z_x%P<yaFL#UnT$NDjCRs0+9P=n1$Q z*dEXT^agANQscC@$radjyl@N98<1^l25C(mFf-u0mAI&eY0alVWOzUfYt9k=T#e7q zxkNY#><sujus7f{pf})^8tg4ur+E*EUM}R+4vgGAUMK;gSB#1@<2A1l`{0;}eVRoC zKZ+1|!DXZwuON)rEA%202l&-HG8y;8B6#cFV1F*>d8|1a=d~T@sE_rs&q_LYo-bXE zopzt^)jpb}_d?&x89Wes5)Z^q9C&1Ke$niltn?#8)ADi)Gl~nd|JU+zC&nKcURKs# z)!b6s*icq>WJt@(=Gvy#mLnrpH`X@PHdL3ju5YSpIWlHtW2~wPi(1Q8)>X8$RJA-2 z`3H_H@@do5n#TI7sr41DE$vg&8&|f~S2eV@Ol_^ItEz6UsGr=@TDx*hRrBOn<GO~r z#)?=~^VIgLhW4p-wUtww*0<I)He5I5nro-F)V5YlZmL+hrlPv4WolDx(^MQ)L#(lR zYHh5c!Xt)HD4No={?nnU^^LK%x~f~6@i;s#s7Rz`v_0%RaKL~8cnR>R^SX!k#a}UU za9_@Vu?d6wrVJZ3xNq!`F@yU?j~X-h)XKPu0mI|EhxDZn>`E9DcR2p6yRYr@dd%w} zTZ-Kb8iwUV97Bn-9K(p=js#+aV<a)kF`5|TIGZ@fkw~2D7)zYz7)PA%xPZ9OkwjeN zxR|)akxX3bxXf|ta>sbCxx#TJag}2NG0`!JxZ06IOm<8mraGn(*Ep^vu5(N$u6N8J zZg9*bZgk8dZgQj&H#=@2ZgoTlP_qX(=ZI+}o=mXor9Xq5tF`mUOfieh7Uz?ASEFC2 z3&>nCkHotheeFWBKwLx?ii^o2aS4fcJNjvtk|p9Y67PESwadvBVi{R3R*;qAN-`!^ zk*mo5YO+RaYsuB(8WQh{^z*GJ8^lHu?~e4fYsqG@g=`hu$aZlZiFZr-Y1fl@P{z5D z>=e65JQm|?H<Qsga&{cAUonkL7c)rQ-|*AUBQweVEHYbb=aYETnQy#+%oX#<d~qRJ zATA;c#l>WixP&Ygmy#voGO|=$POcEk$a1lQtQ1$0F|mqVC03I)Vl9cgNcIKxuOaKS zww}aY9{=(i$tH0v*(|n@tzsM5F0Lax#P#F`aU<C&c9EOJ&17^S4`a6fNbQ>=rjhAl z202%pM`nsyWVSe;%pv<1khxl$N9KzQ$pUc^Stu?hi^L^lvAC4PJsrO!myxC7a&m=O zM&cfdZ(Kp*E{1a@i8~q2Dsq)rP2x_2udO9li)%>SqWju<vVrVxB=M$4U%QsX6ROS@ z5^sKVwvo8w;9N)I{gBS}<OXpg*(r9Bc*mq~yqS!~le6Rb{VS%C>0$;sSDZ&?idkf~ zIG@ZB7m&GP9+^+}FC+`Jb`e=9E+&h_C1kO<lq?aKk)`5ta)nq%mWvf+rMQyB`z-y! zsUq=SOJ_A%Bi535&!w+jL*j0lvz}}a8_6bdEs0-5Y~%hGvQ=x_$aZlZ*&(hcH;5a_ zPO*#JByJ|7gLqW4c|T~5m`0|H8RT4X9+@d-k=f#WGDloM;!{NZ%g-b8#f4;nxQHwy z`xlc%TDycS7MGGG;xe*STu!bK%gA!Ef~*u*k}<K0TqRbMHDWEfT3kcciS=ZI*hn^s zYf1ci;Fm@V*($b??PUKtvO{avlN-d1WT)6gZW1?>QQfnhJ(%CWVj79h!t}$)An}2i z&Uqw071NnTW{dO59B~1eE9Q~;;zF`OTtpU%i^(E!30X|`FC|N~b{SbJE+<!rWn{Tn zK~{<@$(UG0t`e)s8nKqdFIxWPuOaKida^-mB%8#wB!2Vr)3%VUVjGDM5B0U{NPL2* zb3M6%?B7UsYHb&Z4;1x{H<QsJ<ZS-xGDl1!)5Q#Ot~ig(6tl=|aXy(NE+Fwil77B< zBtA{jxsWUn7m@f}Nng8|#D_~dmyq~`N#{}$A2aD(M&h$3js43>eBh+7EhEdt3bImM zN#gS-ed8(;A42J@Ch<(7v(|ZPwYY}FQ;WW~p2P=JIvYuRI;C?hiC^lSEhIjt(%DAh z!z!KYNIXyJTu<U-E1erje0HU?i^K<58v8esc<RH~&K_#tzo+JiX=J*XLE?!C-*_I0 zXBM1UB%T^@&L{Dpy>kJXE9Q}SsNL5tB=L~Ca}il6E++BdxvyP9;t_M_QWB4hJC~7o z(A&A3Tp^Z`c;MUC_E(UVTDy|O!_|J;DiRM%JF7`N{OqhH@yN1s4Ou7FlMP}ciN}|H z<FzCnuW`1Jc<k5NM&j{W=Q^@OTu*KgH<Eau);I1V@#w5`Gl>UYowNPXhEsFM{xmXO zYct5X;yf}_%p$YJ`DBi`fXo&1$b4}jSs*SV3&q7`k+_7!d!GH6my#voGO|=$POcEk z$a1lQtQ1$0cnh`dxxb2BrM1;$jaW;r7T1t<Vm;X)Hj;Qpwjc9a5)Z{WTgX<ijcga! zksacCa)Y>$>=e7mP2y%Us>hFJ599Z*m`0|H8RT5De;%2swOM4gIG@ZB7m#=-wSPr< zWWKnN#G9*q?IN;JTuc^;OUPnzDOn;eBTL2Q<O;EjEEg-tN^vC_6RXHoVl`Pq_ScfD zwRR0zC)Se<Vk6lkt|jp(E3aR&Rcs^irgC4qj_eTElN-d1WT)6gZW1?>c#6PxHQOH` zJT*s5Bh$qUa;`X!%oMZ8Y_fkonWMD}$Xqdx%oi7u1>z#IP+UwFiAzYlf!vRIDOn;e zBTL2Q<O;EjEEg-tN^vEL_oMrstH@PiHCZFplB>lvWF6UGPc~?6BZ;@S`<~a5cmUnm zLbi%+WV^VI>=4(J8^n!dr`Sbq5;v1kJ>)w(f#1Jk8ksI;kaNX(WTu!!W`o1;p3^s< z%n=umxnzGHnXk1A$pUc^Stu?hi^L^lvAC2h5tosr;&Kvihxel@Bg@4KvQk`0#>6Ue zl~_&Ih_&QuaSd4~){_llBZ>Fl+hO#tCGp`QepD@FtJp@ii|fb^aXq;~+(>qcUF0Tl zGl?hb{ETM%WBRA&h-oDL#)7ZSAm@tn$V@Sd%ogX9IpP8`SIi^x#f4-6*}sS^)Y`>l zk+_7!`}zH-mXamnGO|=$POcEk$a1lQtQ1$0_;>){a}~KttR`#3T5`3xhO86o$p*2J z#M7L<=d~oB!F0Betz>^2*{-$g$PRHmxk21Wc8Xo(CUG+v#j`Z_O*eZazkkIvGF{9d z=Zf=4{7n}>Z5Ej=&L?xk1!S(6N9KzQ$pUc^Stu?hi^%>ZWU<yRCGlwoei+NhQgJ!C zLM$W8#R{@gTuH{nDsq)rP2wqHKciX_&;B~skac1`*&sHOP2yS-Pk{SrTgX<ijcga! zksW0JdUAu-ZY1$kv+t^l+$3%$qocTXwm%JbYL1vjri&TmTyY+W&sXq0XOY?Bd@@H| zK<0{hWWKnN#D_BYt`?Dn;$pH$TtXI$OUV+le;J8Sa`0U(Cs&ANWVu*DR*Eahm{>)w z606A?v6fsdt|9Bhda^-mB%8#wBwpL#2iZclifv@OxQ^@)*OME>jbta;-$icH+RbDX zPpta)?`VGiifLrJm_g1J=aHFW7Kx9X@LkO(bHoK?u9!#WiwnsDaS>T4E+&h_C1kO< zlq?aKk)`5tas}C6MwV-B1z9PsBx7O~xk{`iYs6Y|wYY|?6YI$av5{;N*OGXL7q4Hk zRcs^M#dTzdxSre~ZX`R!E^?E&nT(F{GwPr1&zzr{L-wVS>0$;sSDZ&?idkf~IG@ZB z7m&GP9+@vLBn!kvWTCj2EE1QH#o|)3L|jIeip$9rVi{R3R*;os|4K5ZwN>OQv6`$A zYsuB(8nRBTCmX~@vPoP^;$3;Xe#us`jcga!ksacCa)Y>$>=e7mP2y%Uiq}H;_wU*K z{uR^6bh1B#oU66-$V@Sd%r@SG`_E*K)-E9N$uNTw?k?!dBlE?DWP!MdEEE@$MdA{& zSX@e$h|9=QaXE<(obmH5Bg@4KvQk`0#>6Ue71>`+))?<8=&L1HYvVO!omfvch>c{E zxR%6=)BLDf$X2n9Y!}y&9pZX&gSe6GG~%eb$W2<inT(#pGn(x$b~!aiOe539405hG zkIW?dv&d|%oloY73&>nCkIWYrk_F--vQS)17Kuy9VsR;1A}%9K#pUD*v5drL`}hT0 zK~{<@$(UG0t`e)s8nKpKP4=%L>$J9>Y!DmCCUGr^*B$cuC0oTdvRzz9c8KfA4dO<! zQ|ux)iJQqNUcO}CR<jfN{VS%C>0$;sSDZ&?idkf~IG@ZR`xlV8TAN4aiwnsDaS>T) z#J|bKWRcb`A&bSOWQn+pEESiNE5tIgT&y4~#g$}CtRh#5)ntuWORg5zkac1`*+BL; zl1*B>mc&a+dHs^DVjI~mt|L3d_2dR|BiSi-k(<QLWb|BJzyA8PQ**>LGF{9d=Zf>l zOfieh7Uz>W;sP>P%p>#3{)J?L)-ECo#l>WixP&Ygmy#voGO|=$POcEkNc<s7e*cn{ z;z}|mR*|d3YO+SGC0C1U$U3o}Y!DmCCUGr^mj&Bl^tX_$TH8jpi|fb^aXq;~+(>qc zUF0TlGa1Dz4*mOgEWdxnG%{VxAm@tn$V@Sd%ogX9IpP8`SIi^x#f4;nxQHwy`xlc% zTDycS7MGGG;xe*STu!bK%gA!Ef~*u*k}<K0TqRbMHDWEfT3kcciS=ZI*hn^sYe~G~ zo8P}=tJp@ill|++4y|2JZV)$;onjZcN!(0E&(rnmFDX4WM@%Er#SC(;IFHN}v&d|5 zKA9sfAalh$GGAOs7Kn>Td?uZL`HRUSaS2&W_Aez%w00R;DlR8ih-D=H+^p}pf~*u* zk}<K0TqRbMHDWEf+K3yGHDsOE){_llBiSUbC7Z<-5+AYWN7Y8Qi|fb^aXq<#?B7Us zYHb&}N!(20kEi*bXOH9eub4)riy0*TmYQ!okHjBTb7qnFt7^{qB>uFTa{-CJujb4n z@kiF23rYN?HRmD{e{RjWn8e>)b1otAhu54-N&NLS=Q0w1g3Z{!oW$Q@^R;Cp{urCH zg2Z2BbFL&~Vik$M&E{*XN&JB}XDx}p(&k)4;!m|X>q-2*HfJM=KicM8OX4rLIa^5l z`8H=8iNE3ITu0&$xjEO98^n!dr`SbqBKtR!(eruQ+5Rf<Q**>LGF{9d=Zf>lOfieh z7Uz>W;sP>P%p>!~g=B%ah%6KrlSSeZvRGV7mWa#9QgJ!CLM$W8$x{{1zRL3>BS#+| zG3x*S|NpVxx9%QsYSa1cXO9|us^N+_ytIEXUgY1u?uxW?&W(E~GNySF-Wl-!0Q%KQ AUjP6A diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-312.pyc deleted file mode 100644 index 83d9ad90c78fee1f785ed939dd0b7f40ef819896..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2659 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 Lr&nLFRUYa8S3#?P diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-312.pyc deleted file mode 100644 index 74bbd7209a1704f463726dab005324fb16934a8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 237 zcmXv}yQ%^)6iie^6m7(hu-HBLD8<U!54cT;n}ZwNJV@foYUNkl?)LXv`~k7`2LwAS zv!K(=40GVjT>AYkiOBv=`6%+eHeb+>cy^-rC4&5rijEt{<}97B$Mn`?tVHLf(Tx3* zXMOz&kQ;@dc<?2xOtx33gNJ|xZXH*N4>H@KON2S-!f=5OO4KD3as##sxzV$9G6gRK zCYEPAzC{mKT8OW-Fb<^996kvXJn+<3ug*dlu`h7x+Ob64+t;%mO-ku?Fg*8ME7~`( Cr$kx+ diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc deleted file mode 100644 index 7f4f200a5ba76ba9697dc57df41db16c87403308..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158891 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 MDwXb8%swOjf0oo;9{>OV diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/idna/codec.py b/venv/lib/python3.12/site-packages/pip/_vendor/idna/codec.py deleted file mode 100644 index 1ca9ba6..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/idna/codec.py +++ /dev/null @@ -1,112 +0,0 @@ -from .core import encode, decode, alabel, ulabel, IDNAError -import codecs -import re -from typing import Tuple, Optional - -_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[str, int]: # type: ignore - if errors != 'strict': - raise IDNAError('Unsupported error handling \"{}\"'.format(errors)) - - if not data: - return "", 0 - - 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(alabel(label)) - if size: - size += 1 - size += len(label) - - # Join with U+002E - result_str = '.'.join(result) + trailing_dot # type: ignore - size += len(trailing_dot) - return result_str, size - -class IncrementalDecoder(codecs.BufferedIncrementalDecoder): - def _buffer_decode(self, data: str, errors: str, final: bool) -> Tuple[str, int]: # type: ignore - if errors != 'strict': - raise IDNAError('Unsupported error handling \"{}\"'.format(errors)) - - if not data: - return ('', 0) - - 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 getregentry() -> codecs.CodecInfo: - # Compatibility as a search_function for codecs.register() - return codecs.CodecInfo( - name='idna', - encode=Codec().encode, # type: ignore - decode=Codec().decode, # type: ignore - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamwriter=StreamWriter, - streamreader=StreamReader, - ) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/idna/compat.py b/venv/lib/python3.12/site-packages/pip/_vendor/idna/compat.py deleted file mode 100644 index 786e6bd..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/idna/compat.py +++ /dev/null @@ -1,13 +0,0 @@ -from .core import * -from .codec import * -from typing import Any, Union - -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.12/site-packages/pip/_vendor/idna/core.py b/venv/lib/python3.12/site-packages/pip/_vendor/idna/core.py deleted file mode 100644 index 4f30037..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/idna/core.py +++ /dev/null @@ -1,400 +0,0 @@ -from . import idnadata -import bisect -import unicodedata -import re -from typing import Union, Optional -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 = None # type: Optional[str] - for (idx, cp) in enumerate(label, 1): - direction = unicodedata.bidirectional(cp) - - if rtl: - # Bidi rule 2 - if not direction 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 not direction 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 - if joining_type in [ord('L'), ord('D')]: - ok = True - 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 - if joining_type in [ord('R'), ord('D')]: - ok = True - 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 - - if not label: - raise IDNAError('No Input') - - label = str(label) - check_label(label) - label_bytes = _punycode(label) - label_bytes = _alabel_prefix + label_bytes - - 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 = 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 = None # type: Optional[str] - if len(uts46row) == 3: - replacement = uts46row[2] # type: ignore - 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 isinstance(s, (bytes, bytearray)): - try: - s = s.decode('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 isinstance(s, (bytes, bytearray)): - s = s.decode('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.12/site-packages/pip/_vendor/idna/idnadata.py b/venv/lib/python3.12/site-packages/pip/_vendor/idna/idnadata.py deleted file mode 100644 index 67db462..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/idna/idnadata.py +++ /dev/null @@ -1,2151 +0,0 @@ -# This file is automatically generated by tools/idna-data - -__version__ = '15.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, - 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 = { - 0x600: 85, - 0x601: 85, - 0x602: 85, - 0x603: 85, - 0x604: 85, - 0x605: 85, - 0x608: 85, - 0x60b: 85, - 0x620: 68, - 0x621: 85, - 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, - 0x66e: 68, - 0x66f: 68, - 0x671: 82, - 0x672: 82, - 0x673: 82, - 0x674: 85, - 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, - 0x6dd: 85, - 0x6ee: 82, - 0x6ef: 82, - 0x6fa: 68, - 0x6fb: 68, - 0x6fc: 68, - 0x6ff: 68, - 0x70f: 84, - 0x710: 82, - 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, - 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, - 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, - 0x7fa: 67, - 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, - 0x860: 68, - 0x861: 85, - 0x862: 68, - 0x863: 68, - 0x864: 68, - 0x865: 68, - 0x866: 85, - 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, - 0x887: 85, - 0x888: 85, - 0x889: 68, - 0x88a: 68, - 0x88b: 68, - 0x88c: 68, - 0x88d: 68, - 0x88e: 82, - 0x890: 85, - 0x891: 85, - 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, - 0x8ad: 85, - 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, - 0x8e2: 85, - 0x1806: 85, - 0x1807: 68, - 0x180a: 67, - 0x180e: 85, - 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, - 0x1880: 85, - 0x1881: 85, - 0x1882: 85, - 0x1883: 85, - 0x1884: 85, - 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, - 0x18aa: 68, - 0x200c: 85, - 0x200d: 67, - 0x202f: 85, - 0x2066: 85, - 0x2067: 85, - 0x2068: 85, - 0x2069: 85, - 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, - 0xa873: 85, - 0x10ac0: 68, - 0x10ac1: 68, - 0x10ac2: 68, - 0x10ac3: 68, - 0x10ac4: 68, - 0x10ac5: 82, - 0x10ac6: 85, - 0x10ac7: 82, - 0x10ac8: 85, - 0x10ac9: 82, - 0x10aca: 82, - 0x10acb: 85, - 0x10acc: 85, - 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, - 0x10ae2: 85, - 0x10ae3: 85, - 0x10ae4: 82, - 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, - 0x10baf: 85, - 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, - 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, - 0x10f45: 85, - 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, - 0x10fb0: 68, - 0x10fb1: 85, - 0x10fb2: 68, - 0x10fb3: 68, - 0x10fb4: 82, - 0x10fb5: 82, - 0x10fb6: 82, - 0x10fb7: 85, - 0x10fb8: 68, - 0x10fb9: 82, - 0x10fba: 82, - 0x10fbb: 68, - 0x10fbc: 68, - 0x10fbd: 82, - 0x10fbe: 68, - 0x10fbf: 68, - 0x10fc0: 85, - 0x10fc1: 68, - 0x10fc2: 82, - 0x10fc3: 82, - 0x10fc4: 68, - 0x10fc5: 85, - 0x10fc6: 85, - 0x10fc7: 85, - 0x10fc8: 85, - 0x10fc9: 82, - 0x10fca: 68, - 0x10fcb: 76, - 0x110bd: 85, - 0x110cd: 85, - 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, - 0x1e94b: 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, - 0x898000008e2, - 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, - 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, - 0xa7d10000a7d2, - 0xa7d30000a7d4, - 0xa7d50000a7d6, - 0xa7d70000a7d8, - 0xa7d90000a7da, - 0xa7f20000a7f5, - 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, - 0x1060000010737, - 0x1074000010756, - 0x1076000010768, - 0x1078000010786, - 0x10787000107b1, - 0x107b2000107bb, - 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, - 0x10e8000010eaa, - 0x10eab00010ead, - 0x10eb000010eb2, - 0x10efd00010f1d, - 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, - 0x114000001144b, - 0x114500001145a, - 0x1145e00011462, - 0x11480000114c6, - 0x114c7000114c8, - 0x114d0000114da, - 0x11580000115b6, - 0x115b8000115c1, - 0x115d8000115de, - 0x1160000011641, - 0x1164400011645, - 0x116500001165a, - 0x11680000116b9, - 0x116c0000116ca, - 0x117000001171b, - 0x1171d0001172c, - 0x117300001173a, - 0x1174000011747, - 0x118000001183b, - 0x118c0000118ea, - 0x118ff00011907, - 0x119090001190a, - 0x1190c00011914, - 0x1191500011917, - 0x1191800011936, - 0x1193700011939, - 0x1193b00011944, - 0x119500001195a, - 0x119a0000119a8, - 0x119aa000119d8, - 0x119da000119e2, - 0x119e3000119e5, - 0x11a0000011a3f, - 0x11a4700011a48, - 0x11a5000011a9a, - 0x11a9d00011a9e, - 0x11ab000011af9, - 0x11c0000011c09, - 0x11c0a00011c37, - 0x11c3800011c41, - 0x11c5000011c5a, - 0x11c7200011c90, - 0x11c9200011ca8, - 0x11ca900011cb7, - 0x11d0000011d07, - 0x11d0800011d0a, - 0x11d0b00011d37, - 0x11d3a00011d3b, - 0x11d3c00011d3e, - 0x11d3f00011d48, - 0x11d5000011d5a, - 0x11d6000011d66, - 0x11d6700011d69, - 0x11d6a00011d8f, - 0x11d9000011d92, - 0x11d9300011d99, - 0x11da000011daa, - 0x11ee000011ef7, - 0x11f0000011f11, - 0x11f1200011f3b, - 0x11f3e00011f43, - 0x11f5000011f5a, - 0x11fb000011fb1, - 0x120000001239a, - 0x1248000012544, - 0x12f9000012ff1, - 0x1300000013430, - 0x1344000013456, - 0x1440000014647, - 0x1680000016a39, - 0x16a4000016a5f, - 0x16a6000016a6a, - 0x16a7000016abf, - 0x16ac000016aca, - 0x16ad000016aee, - 0x16af000016af5, - 0x16b0000016b37, - 0x16b4000016b44, - 0x16b5000016b5a, - 0x16b6300016b78, - 0x16b7d00016b90, - 0x16e6000016e80, - 0x16f0000016f4b, - 0x16f4f00016f88, - 0x16f8f00016fa0, - 0x16fe000016fe2, - 0x16fe300016fe5, - 0x16ff000016ff2, - 0x17000000187f8, - 0x1880000018cd6, - 0x18d0000018d09, - 0x1aff00001aff4, - 0x1aff50001affc, - 0x1affd0001afff, - 0x1b0000001b123, - 0x1b1320001b133, - 0x1b1500001b153, - 0x1b1550001b156, - 0x1b1640001b168, - 0x1b1700001b2fc, - 0x1bc000001bc6b, - 0x1bc700001bc7d, - 0x1bc800001bc89, - 0x1bc900001bc9a, - 0x1bc9d0001bc9f, - 0x1cf000001cf2e, - 0x1cf300001cf47, - 0x1da000001da37, - 0x1da3b0001da6d, - 0x1da750001da76, - 0x1da840001da85, - 0x1da9b0001daa0, - 0x1daa10001dab0, - 0x1df000001df1f, - 0x1df250001df2b, - 0x1e0000001e007, - 0x1e0080001e019, - 0x1e01b0001e022, - 0x1e0230001e025, - 0x1e0260001e02b, - 0x1e0300001e06e, - 0x1e08f0001e090, - 0x1e1000001e12d, - 0x1e1300001e13e, - 0x1e1400001e14a, - 0x1e14e0001e14f, - 0x1e2900001e2af, - 0x1e2c00001e2fa, - 0x1e4d00001e4fa, - 0x1e7e00001e7e7, - 0x1e7e80001e7ec, - 0x1e7ed0001e7ef, - 0x1e7f00001e7ff, - 0x1e8000001e8c5, - 0x1e8d00001e8d7, - 0x1e9220001e94c, - 0x1e9500001e95a, - 0x200000002a6e0, - 0x2a7000002b73a, - 0x2b7400002b81e, - 0x2b8200002cea2, - 0x2ceb00002ebe1, - 0x300000003134b, - 0x31350000323b0, - ), - 'CONTEXTJ': ( - 0x200c0000200e, - ), - 'CONTEXTO': ( - 0xb7000000b8, - 0x37500000376, - 0x5f3000005f5, - 0x6600000066a, - 0x6f0000006fa, - 0x30fb000030fc, - ), -} diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/idna/intranges.py b/venv/lib/python3.12/site-packages/pip/_vendor/idna/intranges.py deleted file mode 100644 index 6a43b04..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/idna/intranges.py +++ /dev/null @@ -1,54 +0,0 @@ -""" -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.12/site-packages/pip/_vendor/idna/package_data.py b/venv/lib/python3.12/site-packages/pip/_vendor/idna/package_data.py deleted file mode 100644 index 8501893..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/idna/package_data.py +++ /dev/null @@ -1,2 +0,0 @@ -__version__ = '3.4' - diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/idna/uts46data.py b/venv/lib/python3.12/site-packages/pip/_vendor/idna/uts46data.py deleted file mode 100644 index 186796c..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/idna/uts46data.py +++ /dev/null @@ -1,8600 +0,0 @@ -# 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__ = '15.0.0' -def _seg_0() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x0, '3'), - (0x1, '3'), - (0x2, '3'), - (0x3, '3'), - (0x4, '3'), - (0x5, '3'), - (0x6, '3'), - (0x7, '3'), - (0x8, '3'), - (0x9, '3'), - (0xA, '3'), - (0xB, '3'), - (0xC, '3'), - (0xD, '3'), - (0xE, '3'), - (0xF, '3'), - (0x10, '3'), - (0x11, '3'), - (0x12, '3'), - (0x13, '3'), - (0x14, '3'), - (0x15, '3'), - (0x16, '3'), - (0x17, '3'), - (0x18, '3'), - (0x19, '3'), - (0x1A, '3'), - (0x1B, '3'), - (0x1C, '3'), - (0x1D, '3'), - (0x1E, '3'), - (0x1F, '3'), - (0x20, '3'), - (0x21, '3'), - (0x22, '3'), - (0x23, '3'), - (0x24, '3'), - (0x25, '3'), - (0x26, '3'), - (0x27, '3'), - (0x28, '3'), - (0x29, '3'), - (0x2A, '3'), - (0x2B, '3'), - (0x2C, '3'), - (0x2D, 'V'), - (0x2E, 'V'), - (0x2F, '3'), - (0x30, 'V'), - (0x31, 'V'), - (0x32, 'V'), - (0x33, 'V'), - (0x34, 'V'), - (0x35, 'V'), - (0x36, 'V'), - (0x37, 'V'), - (0x38, 'V'), - (0x39, 'V'), - (0x3A, '3'), - (0x3B, '3'), - (0x3C, '3'), - (0x3D, '3'), - (0x3E, '3'), - (0x3F, '3'), - (0x40, '3'), - (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, '3'), - (0x5C, '3'), - (0x5D, '3'), - (0x5E, '3'), - (0x5F, '3'), - (0x60, '3'), - (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, '3'), - (0x7C, '3'), - (0x7D, '3'), - (0x7E, '3'), - (0x7F, '3'), - (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, '3', ' '), - (0xA1, 'V'), - (0xA2, 'V'), - (0xA3, 'V'), - (0xA4, 'V'), - (0xA5, 'V'), - (0xA6, 'V'), - (0xA7, 'V'), - (0xA8, '3', ' ̈'), - (0xA9, 'V'), - (0xAA, 'M', 'a'), - (0xAB, 'V'), - (0xAC, 'V'), - (0xAD, 'I'), - (0xAE, 'V'), - (0xAF, '3', ' ̄'), - (0xB0, 'V'), - (0xB1, 'V'), - (0xB2, 'M', '2'), - (0xB3, 'M', '3'), - (0xB4, '3', ' ́'), - (0xB5, 'M', 'μ'), - (0xB6, 'V'), - (0xB7, 'V'), - (0xB8, '3', ' ̧'), - (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, '3', ' ̆'), - (0x2D9, '3', ' ̇'), - (0x2DA, '3', ' ̊'), - (0x2DB, '3', ' ̨'), - (0x2DC, '3', ' ̃'), - (0x2DD, '3', ' ̋'), - (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, '3', ' ι'), - (0x37B, 'V'), - (0x37E, '3', ';'), - (0x37F, 'M', 'ϳ'), - (0x380, 'X'), - (0x384, '3', ' ́'), - (0x385, '3', ' ̈́'), - (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, 'X'), - (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'), - (0x898, '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, 'X'), - (0x10C7, 'M', 'ⴧ'), - (0x10C8, 'X'), - (0x10CD, 'M', 'ⴭ'), - (0x10CE, 'X'), - (0x10D0, 'V'), - (0x10FC, 'M', 'ნ'), - (0x10FD, 'V'), - (0x115F, 'X'), - (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'), - ] - -def _seg_14() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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, 'X'), - (0x17B6, 'V'), - (0x17DE, 'X'), - (0x17E0, 'V'), - (0x17EA, 'X'), - (0x17F0, 'V'), - (0x17FA, 'X'), - (0x1800, 'V'), - (0x1806, 'X'), - (0x1807, 'V'), - (0x180B, 'I'), - (0x180E, 'X'), - (0x180F, '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'), - (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'), - (0x1B50, 'V'), - (0x1B7F, 'X'), - (0x1B80, 'V'), - (0x1BF4, 'X'), - (0x1BFC, 'V'), - (0x1C38, 'X'), - (0x1C3B, 'V'), - (0x1C4A, 'X'), - (0x1C4D, 'V'), - (0x1C80, 'M', 'в'), - ] - -def _seg_15() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1C81, 'M', 'д'), - (0x1C82, 'M', 'о'), - (0x1C83, 'M', 'с'), - (0x1C84, 'M', 'т'), - (0x1C86, 'M', 'ъ'), - (0x1C87, 'M', 'ѣ'), - (0x1C88, 'M', 'ꙋ'), - (0x1C89, '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'), - (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', 'ɔ'), - ] - -def _seg_16() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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'), - (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'), - ] - -def _seg_17() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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'), - (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'), - ] - -def _seg_18() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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', 'ss'), - (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', 'ỏ'), - (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', 'ự'), - ] - -def _seg_19() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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', 'ὕ'), - (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', 'ἇι'), - ] - -def _seg_20() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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, '3', ' ̓'), - (0x1FBE, 'M', 'ι'), - (0x1FBF, '3', ' ̓'), - (0x1FC0, '3', ' ͂'), - (0x1FC1, '3', ' ̈͂'), - (0x1FC2, 'M', 'ὴι'), - (0x1FC3, 'M', 'ηι'), - (0x1FC4, 'M', 'ήι'), - (0x1FC5, 'X'), - (0x1FC6, 'V'), - (0x1FC7, 'M', 'ῆι'), - (0x1FC8, 'M', 'ὲ'), - (0x1FC9, 'M', 'έ'), - (0x1FCA, 'M', 'ὴ'), - (0x1FCB, 'M', 'ή'), - (0x1FCC, 'M', 'ηι'), - (0x1FCD, '3', ' ̓̀'), - (0x1FCE, '3', ' ̓́'), - (0x1FCF, '3', ' ̓͂'), - (0x1FD0, 'V'), - (0x1FD3, 'M', 'ΐ'), - (0x1FD4, 'X'), - (0x1FD6, 'V'), - (0x1FD8, 'M', 'ῐ'), - (0x1FD9, 'M', 'ῑ'), - (0x1FDA, 'M', 'ὶ'), - (0x1FDB, 'M', 'ί'), - (0x1FDC, 'X'), - (0x1FDD, '3', ' ̔̀'), - (0x1FDE, '3', ' ̔́'), - (0x1FDF, '3', ' ̔͂'), - (0x1FE0, 'V'), - (0x1FE3, 'M', 'ΰ'), - (0x1FE4, 'V'), - (0x1FE8, 'M', 'ῠ'), - (0x1FE9, 'M', 'ῡ'), - (0x1FEA, 'M', 'ὺ'), - (0x1FEB, 'M', 'ύ'), - (0x1FEC, 'M', 'ῥ'), - (0x1FED, '3', ' ̈̀'), - (0x1FEE, '3', ' ̈́'), - (0x1FEF, '3', '`'), - (0x1FF0, 'X'), - (0x1FF2, 'M', 'ὼι'), - (0x1FF3, 'M', 'ωι'), - (0x1FF4, 'M', 'ώι'), - (0x1FF5, 'X'), - (0x1FF6, 'V'), - ] - -def _seg_21() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1FF7, 'M', 'ῶι'), - (0x1FF8, 'M', 'ὸ'), - (0x1FF9, 'M', 'ό'), - (0x1FFA, 'M', 'ὼ'), - (0x1FFB, 'M', 'ώ'), - (0x1FFC, 'M', 'ωι'), - (0x1FFD, '3', ' ́'), - (0x1FFE, '3', ' ̔'), - (0x1FFF, 'X'), - (0x2000, '3', ' '), - (0x200B, 'I'), - (0x200C, 'D', ''), - (0x200E, 'X'), - (0x2010, 'V'), - (0x2011, 'M', '‐'), - (0x2012, 'V'), - (0x2017, '3', ' ̳'), - (0x2018, 'V'), - (0x2024, 'X'), - (0x2027, 'V'), - (0x2028, 'X'), - (0x202F, '3', ' '), - (0x2030, 'V'), - (0x2033, 'M', '′′'), - (0x2034, 'M', '′′′'), - (0x2035, 'V'), - (0x2036, 'M', '‵‵'), - (0x2037, 'M', '‵‵‵'), - (0x2038, 'V'), - (0x203C, '3', '!!'), - (0x203D, 'V'), - (0x203E, '3', ' ̅'), - (0x203F, 'V'), - (0x2047, '3', '??'), - (0x2048, '3', '?!'), - (0x2049, '3', '!?'), - (0x204A, 'V'), - (0x2057, 'M', '′′′′'), - (0x2058, 'V'), - (0x205F, '3', ' '), - (0x2060, 'I'), - (0x2061, 'X'), - (0x2064, 'I'), - (0x2065, 'X'), - (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, '3', '+'), - (0x207B, 'M', '−'), - (0x207C, '3', '='), - (0x207D, '3', '('), - (0x207E, '3', ')'), - (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'), - (0x2088, 'M', '8'), - (0x2089, 'M', '9'), - (0x208A, '3', '+'), - (0x208B, 'M', '−'), - (0x208C, '3', '='), - (0x208D, '3', '('), - (0x208E, '3', ')'), - (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, '3', 'a/c'), - (0x2101, '3', 'a/s'), - (0x2102, 'M', 'c'), - (0x2103, 'M', '°c'), - (0x2104, 'V'), - ] - -def _seg_22() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2105, '3', 'c/o'), - (0x2106, '3', '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, 'X'), - (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'), - (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'), - ] - -def _seg_23() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x217D, 'M', 'c'), - (0x217E, 'M', 'd'), - (0x217F, 'M', 'm'), - (0x2180, 'V'), - (0x2183, 'X'), - (0x2184, 'V'), - (0x2189, 'M', '0⁄3'), - (0x218A, 'V'), - (0x218C, 'X'), - (0x2190, 'V'), - (0x222C, 'M', '∫∫'), - (0x222D, 'M', '∫∫∫'), - (0x222E, 'V'), - (0x222F, 'M', '∮∮'), - (0x2230, 'M', '∮∮∮'), - (0x2231, 'V'), - (0x2260, '3'), - (0x2261, 'V'), - (0x226E, '3'), - (0x2270, 'V'), - (0x2329, 'M', '〈'), - (0x232A, 'M', '〉'), - (0x232B, 'V'), - (0x2427, '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, '3', '(1)'), - (0x2475, '3', '(2)'), - (0x2476, '3', '(3)'), - (0x2477, '3', '(4)'), - (0x2478, '3', '(5)'), - (0x2479, '3', '(6)'), - (0x247A, '3', '(7)'), - (0x247B, '3', '(8)'), - (0x247C, '3', '(9)'), - (0x247D, '3', '(10)'), - (0x247E, '3', '(11)'), - (0x247F, '3', '(12)'), - (0x2480, '3', '(13)'), - (0x2481, '3', '(14)'), - (0x2482, '3', '(15)'), - (0x2483, '3', '(16)'), - (0x2484, '3', '(17)'), - (0x2485, '3', '(18)'), - (0x2486, '3', '(19)'), - (0x2487, '3', '(20)'), - (0x2488, 'X'), - (0x249C, '3', '(a)'), - (0x249D, '3', '(b)'), - (0x249E, '3', '(c)'), - (0x249F, '3', '(d)'), - (0x24A0, '3', '(e)'), - (0x24A1, '3', '(f)'), - (0x24A2, '3', '(g)'), - (0x24A3, '3', '(h)'), - (0x24A4, '3', '(i)'), - (0x24A5, '3', '(j)'), - (0x24A6, '3', '(k)'), - (0x24A7, '3', '(l)'), - (0x24A8, '3', '(m)'), - (0x24A9, '3', '(n)'), - (0x24AA, '3', '(o)'), - (0x24AB, '3', '(p)'), - (0x24AC, '3', '(q)'), - (0x24AD, '3', '(r)'), - (0x24AE, '3', '(s)'), - (0x24AF, '3', '(t)'), - (0x24B0, '3', '(u)'), - (0x24B1, '3', '(v)'), - (0x24B2, '3', '(w)'), - (0x24B3, '3', '(x)'), - (0x24B4, '3', '(y)'), - (0x24B5, '3', '(z)'), - (0x24B6, 'M', 'a'), - (0x24B7, 'M', 'b'), - (0x24B8, 'M', 'c'), - (0x24B9, 'M', 'd'), - (0x24BA, 'M', 'e'), - (0x24BB, 'M', 'f'), - (0x24BC, 'M', 'g'), - ] - -def _seg_24() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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, '3', '::='), - (0x2A75, '3', '=='), - (0x2A76, '3', '==='), - (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', 'ⰻ'), - (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', 'ⱘ'), - ] - -def _seg_25() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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'), - (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', 'ⳃ'), - ] - -def _seg_26() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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'), - (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', '匚'), - ] - -def _seg_27() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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', '牛'), - (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', '网'), - ] - -def _seg_28() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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', '鬲'), - (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, '3', ' '), - (0x3001, 'V'), - (0x3002, 'M', '.'), - (0x3003, 'V'), - (0x3036, 'M', '〒'), - (0x3037, 'V'), - (0x3038, 'M', '十'), - ] - -def _seg_29() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x3039, 'M', '卄'), - (0x303A, 'M', '卅'), - (0x303B, 'V'), - (0x3040, 'X'), - (0x3041, 'V'), - (0x3097, 'X'), - (0x3099, 'V'), - (0x309B, '3', ' ゙'), - (0x309C, '3', ' ゚'), - (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, 'X'), - (0x3165, 'M', 'ᄔ'), - (0x3166, 'M', 'ᄕ'), - (0x3167, 'M', 'ᇇ'), - (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', 'ᅗ'), - ] - -def _seg_30() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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'), - (0x31E4, 'X'), - (0x31F0, 'V'), - (0x3200, '3', '(ᄀ)'), - (0x3201, '3', '(ᄂ)'), - (0x3202, '3', '(ᄃ)'), - (0x3203, '3', '(ᄅ)'), - (0x3204, '3', '(ᄆ)'), - (0x3205, '3', '(ᄇ)'), - (0x3206, '3', '(ᄉ)'), - (0x3207, '3', '(ᄋ)'), - (0x3208, '3', '(ᄌ)'), - (0x3209, '3', '(ᄎ)'), - (0x320A, '3', '(ᄏ)'), - (0x320B, '3', '(ᄐ)'), - (0x320C, '3', '(ᄑ)'), - (0x320D, '3', '(ᄒ)'), - (0x320E, '3', '(가)'), - (0x320F, '3', '(나)'), - (0x3210, '3', '(다)'), - (0x3211, '3', '(라)'), - (0x3212, '3', '(마)'), - (0x3213, '3', '(바)'), - (0x3214, '3', '(사)'), - (0x3215, '3', '(아)'), - (0x3216, '3', '(자)'), - (0x3217, '3', '(차)'), - (0x3218, '3', '(카)'), - (0x3219, '3', '(타)'), - (0x321A, '3', '(파)'), - (0x321B, '3', '(하)'), - (0x321C, '3', '(주)'), - (0x321D, '3', '(오전)'), - (0x321E, '3', '(오후)'), - (0x321F, 'X'), - (0x3220, '3', '(一)'), - (0x3221, '3', '(二)'), - (0x3222, '3', '(三)'), - (0x3223, '3', '(四)'), - (0x3224, '3', '(五)'), - (0x3225, '3', '(六)'), - (0x3226, '3', '(七)'), - (0x3227, '3', '(八)'), - (0x3228, '3', '(九)'), - (0x3229, '3', '(十)'), - (0x322A, '3', '(月)'), - (0x322B, '3', '(火)'), - (0x322C, '3', '(水)'), - (0x322D, '3', '(木)'), - (0x322E, '3', '(金)'), - (0x322F, '3', '(土)'), - (0x3230, '3', '(日)'), - (0x3231, '3', '(株)'), - (0x3232, '3', '(有)'), - (0x3233, '3', '(社)'), - (0x3234, '3', '(名)'), - (0x3235, '3', '(特)'), - (0x3236, '3', '(財)'), - (0x3237, '3', '(祝)'), - (0x3238, '3', '(労)'), - (0x3239, '3', '(代)'), - (0x323A, '3', '(呼)'), - (0x323B, '3', '(学)'), - (0x323C, '3', '(監)'), - (0x323D, '3', '(企)'), - (0x323E, '3', '(資)'), - (0x323F, '3', '(協)'), - (0x3240, '3', '(祭)'), - (0x3241, '3', '(休)'), - (0x3242, '3', '(自)'), - (0x3243, '3', '(至)'), - (0x3244, 'M', '問'), - (0x3245, 'M', '幼'), - (0x3246, 'M', '文'), - ] - -def _seg_31() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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', '名'), - (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'), - ] - -def _seg_32() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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', 'ル'), - (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', 'キログラム'), - ] - -def _seg_33() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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点'), - (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'), - ] - -def _seg_34() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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ω'), - (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'), - ] - -def _seg_35() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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', 'ꙟ'), - (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'), - ] - -def _seg_36() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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'), - (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', 'ꝼ'), - ] - -def _seg_37() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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'), - (0xA7C9, 'M', 'ꟊ'), - (0xA7CA, 'V'), - (0xA7CB, 'X'), - (0xA7D0, 'M', 'ꟑ'), - (0xA7D1, 'V'), - (0xA7D2, 'X'), - (0xA7D3, 'V'), - (0xA7D4, 'X'), - (0xA7D5, 'V'), - (0xA7D6, 'M', 'ꟗ'), - (0xA7D7, 'V'), - (0xA7D8, 'M', 'ꟙ'), - (0xA7D9, 'V'), - (0xA7DA, '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'), - ] - -def _seg_38() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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', 'Ꮇ'), - (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', 'Ꮪ'), - ] - -def _seg_39() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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', '濫'), - (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', '聾'), - ] - -def _seg_40() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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', '閭'), - (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', '囹'), - ] - -def _seg_41() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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', '離'), - (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', '嗀'), - ] - -def _seg_42() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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', '禎'), - (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', '喝'), - ] - -def _seg_43() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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', '調'), - (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'), - ] - -def _seg_44() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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, '3', '+'), - (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', 'پ'), - (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', 'ۋ'), - ] - -def _seg_45() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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', 'قح'), - (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', 'يح'), - ] - -def _seg_46() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFC57, 'M', 'يخ'), - (0xFC58, 'M', 'يم'), - (0xFC59, 'M', 'يى'), - (0xFC5A, 'M', 'يي'), - (0xFC5B, 'M', 'ذٰ'), - (0xFC5C, 'M', 'رٰ'), - (0xFC5D, 'M', 'ىٰ'), - (0xFC5E, '3', ' ٌّ'), - (0xFC5F, '3', ' ٍّ'), - (0xFC60, '3', ' َّ'), - (0xFC61, '3', ' ُّ'), - (0xFC62, '3', ' ِّ'), - (0xFC63, '3', ' ّٰ'), - (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', 'ئج'), - (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', 'عج'), - ] - -def _seg_47() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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', 'سى'), - (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', 'جي'), - ] - -def _seg_48() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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', 'فخم'), - (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', 'جحى'), - ] - -def _seg_49() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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, '3', 'صلى الله عليه وسلم'), - (0xFDFB, '3', 'جل جلاله'), - (0xFDFC, 'M', 'ریال'), - (0xFDFD, 'V'), - (0xFE00, 'I'), - (0xFE10, '3', ','), - (0xFE11, 'M', '、'), - (0xFE12, 'X'), - (0xFE13, '3', ':'), - (0xFE14, '3', ';'), - (0xFE15, '3', '!'), - (0xFE16, '3', '?'), - (0xFE17, 'M', '〖'), - (0xFE18, 'M', '〗'), - (0xFE19, 'X'), - (0xFE20, 'V'), - (0xFE30, 'X'), - (0xFE31, 'M', '—'), - (0xFE32, 'M', '–'), - (0xFE33, '3', '_'), - (0xFE35, '3', '('), - (0xFE36, '3', ')'), - (0xFE37, '3', '{'), - (0xFE38, '3', '}'), - (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, '3', '['), - (0xFE48, '3', ']'), - (0xFE49, '3', ' ̅'), - (0xFE4D, '3', '_'), - (0xFE50, '3', ','), - (0xFE51, 'M', '、'), - (0xFE52, 'X'), - (0xFE54, '3', ';'), - (0xFE55, '3', ':'), - (0xFE56, '3', '?'), - (0xFE57, '3', '!'), - (0xFE58, 'M', '—'), - (0xFE59, '3', '('), - (0xFE5A, '3', ')'), - (0xFE5B, '3', '{'), - (0xFE5C, '3', '}'), - (0xFE5D, 'M', '〔'), - ] - -def _seg_50() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFE5E, 'M', '〕'), - (0xFE5F, '3', '#'), - (0xFE60, '3', '&'), - (0xFE61, '3', '*'), - (0xFE62, '3', '+'), - (0xFE63, 'M', '-'), - (0xFE64, '3', '<'), - (0xFE65, '3', '>'), - (0xFE66, '3', '='), - (0xFE67, 'X'), - (0xFE68, '3', '\\'), - (0xFE69, '3', '$'), - (0xFE6A, '3', '%'), - (0xFE6B, '3', '@'), - (0xFE6C, 'X'), - (0xFE70, '3', ' ً'), - (0xFE71, 'M', 'ـً'), - (0xFE72, '3', ' ٌ'), - (0xFE73, 'V'), - (0xFE74, '3', ' ٍ'), - (0xFE75, 'X'), - (0xFE76, '3', ' َ'), - (0xFE77, 'M', 'ـَ'), - (0xFE78, '3', ' ُ'), - (0xFE79, 'M', 'ـُ'), - (0xFE7A, '3', ' ِ'), - (0xFE7B, 'M', 'ـِ'), - (0xFE7C, '3', ' ّ'), - (0xFE7D, 'M', 'ـّ'), - (0xFE7E, '3', ' ْ'), - (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', 'و'), - (0xFEEF, 'M', 'ى'), - (0xFEF1, 'M', 'ي'), - (0xFEF5, 'M', 'لآ'), - (0xFEF7, 'M', 'لأ'), - (0xFEF9, 'M', 'لإ'), - (0xFEFB, 'M', 'لا'), - (0xFEFD, 'X'), - (0xFEFF, 'I'), - (0xFF00, 'X'), - (0xFF01, '3', '!'), - (0xFF02, '3', '"'), - (0xFF03, '3', '#'), - (0xFF04, '3', '$'), - (0xFF05, '3', '%'), - (0xFF06, '3', '&'), - (0xFF07, '3', '\''), - (0xFF08, '3', '('), - (0xFF09, '3', ')'), - (0xFF0A, '3', '*'), - (0xFF0B, '3', '+'), - (0xFF0C, '3', ','), - (0xFF0D, 'M', '-'), - (0xFF0E, 'M', '.'), - (0xFF0F, '3', '/'), - (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, '3', ':'), - ] - -def _seg_51() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFF1B, '3', ';'), - (0xFF1C, '3', '<'), - (0xFF1D, '3', '='), - (0xFF1E, '3', '>'), - (0xFF1F, '3', '?'), - (0xFF20, '3', '@'), - (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, '3', '['), - (0xFF3C, '3', '\\'), - (0xFF3D, '3', ']'), - (0xFF3E, '3', '^'), - (0xFF3F, '3', '_'), - (0xFF40, '3', '`'), - (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, '3', '{'), - (0xFF5C, '3', '|'), - (0xFF5D, '3', '}'), - (0xFF5E, '3', '~'), - (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', 'セ'), - ] - -def _seg_52() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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, 'X'), - (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'), - (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, '3', ' ̄'), - (0xFFE4, 'M', '¦'), - (0xFFE5, 'M', '¥'), - (0xFFE6, 'M', '₩'), - (0xFFE7, 'X'), - (0xFFE8, 'M', '│'), - (0xFFE9, 'M', '←'), - ] - -def _seg_53() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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', '𐐶'), - (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', '𐓝'), - ] - -def _seg_54() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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', '𐖱'), - (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'), - (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', 'ꭦ'), - ] - -def _seg_55() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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'), - (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'), - ] - -def _seg_56() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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', '𐳭'), - (0x10CAE, 'M', '𐳮'), - (0x10CAF, 'M', '𐳯'), - (0x10CB0, 'M', '𐳰'), - (0x10CB1, 'M', '𐳱'), - (0x10CB2, 'M', '𐳲'), - (0x10CB3, 'X'), - (0x10CC0, 'V'), - (0x10CF3, 'X'), - (0x10CFA, 'V'), - (0x10D28, 'X'), - (0x10D30, 'V'), - (0x10D3A, 'X'), - (0x10E60, 'V'), - (0x10E7F, 'X'), - (0x10E80, 'V'), - (0x10EAA, 'X'), - (0x10EAB, 'V'), - (0x10EAE, 'X'), - (0x10EB0, 'V'), - (0x10EB2, 'X'), - (0x10EFD, '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'), - ] - -def _seg_57() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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'), - (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'), - (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'), - (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', '𑣆'), - ] - -def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x118A7, 'M', '𑣇'), - (0x118A8, 'M', '𑣈'), - (0x118A9, 'M', '𑣉'), - (0x118AA, 'M', '𑣊'), - (0x118AB, 'M', '𑣋'), - (0x118AC, 'M', '𑣌'), - (0x118AD, 'M', '𑣍'), - (0x118AE, 'M', '𑣎'), - (0x118AF, 'M', '𑣏'), - (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'), - (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'), - ] - -def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x11F11, 'X'), - (0x11F12, 'V'), - (0x11F3B, 'X'), - (0x11F3E, 'V'), - (0x11F5A, 'X'), - (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'), - (0x14400, 'V'), - (0x14647, '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'), - (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'), - (0x18D00, 'V'), - (0x18D09, 'X'), - (0x1AFF0, 'V'), - ] - -def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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'), - (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, 'X'), - (0x1D17B, 'V'), - (0x1D1BB, 'M', '𝆹𝅥'), - (0x1D1BC, 'M', '𝆺𝅥'), - (0x1D1BD, 'M', '𝆹𝅥𝅮'), - (0x1D1BE, 'M', '𝆺𝅥𝅮'), - (0x1D1BF, 'M', '𝆹𝅥𝅯'), - (0x1D1C0, 'M', '𝆺𝅥𝅯'), - (0x1D1C1, 'V'), - (0x1D1EB, 'X'), - (0x1D200, 'V'), - (0x1D246, 'X'), - (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'), - ] - -def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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'), - (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'), - ] - -def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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'), - (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'), - ] - -def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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'), - (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'), - ] - -def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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'), - (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'), - ] - -def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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'), - (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'), - ] - -def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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'), - (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'), - ] - -def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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', 'σ'), - (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', 'γ'), - ] - -def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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', 'ε'), - (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', 'υ'), - ] - -def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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', 'χ'), - (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', 'ζ'), - ] - -def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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'), - (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', 'в'), - ] - -def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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', 'ұ'), - (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'), - (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', '𞤫'), - ] - -def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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', 'ش'), - (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'), - ] - -def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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', 'د'), - (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', 'ش'), - ] - -def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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, '3', '0,'), - (0x1F102, '3', '1,'), - (0x1F103, '3', '2,'), - (0x1F104, '3', '3,'), - (0x1F105, '3', '4,'), - (0x1F106, '3', '5,'), - (0x1F107, '3', '6,'), - (0x1F108, '3', '7,'), - (0x1F109, '3', '8,'), - (0x1F10A, '3', '9,'), - (0x1F10B, 'V'), - (0x1F110, '3', '(a)'), - (0x1F111, '3', '(b)'), - (0x1F112, '3', '(c)'), - (0x1F113, '3', '(d)'), - (0x1F114, '3', '(e)'), - (0x1F115, '3', '(f)'), - (0x1F116, '3', '(g)'), - (0x1F117, '3', '(h)'), - (0x1F118, '3', '(i)'), - (0x1F119, '3', '(j)'), - (0x1F11A, '3', '(k)'), - (0x1F11B, '3', '(l)'), - (0x1F11C, '3', '(m)'), - (0x1F11D, '3', '(n)'), - (0x1F11E, '3', '(o)'), - (0x1F11F, '3', '(p)'), - (0x1F120, '3', '(q)'), - (0x1F121, '3', '(r)'), - (0x1F122, '3', '(s)'), - (0x1F123, '3', '(t)'), - (0x1F124, '3', '(u)'), - (0x1F125, '3', '(v)'), - (0x1F126, '3', '(w)'), - (0x1F127, '3', '(x)'), - (0x1F128, '3', '(y)'), - (0x1F129, '3', '(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'), - ] - -def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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'), - (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'), - (0x1F8B2, 'X'), - (0x1F900, 'V'), - (0x1FA54, 'X'), - (0x1FA60, 'V'), - (0x1FA6E, 'X'), - ] - -def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1FA70, 'V'), - (0x1FA7D, 'X'), - (0x1FA80, 'V'), - (0x1FA89, 'X'), - (0x1FA90, 'V'), - (0x1FABE, 'X'), - (0x1FABF, 'V'), - (0x1FAC6, 'X'), - (0x1FACE, 'V'), - (0x1FADC, 'X'), - (0x1FAE0, 'V'), - (0x1FAE9, 'X'), - (0x1FAF0, 'V'), - (0x1FAF9, 'X'), - (0x1FB00, 'V'), - (0x1FB93, 'X'), - (0x1FB94, 'V'), - (0x1FBCB, 'X'), - (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'), - (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', '免'), - (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', '呈'), - ] - -def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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, 'X'), - (0x2F869, 'M', '嬈'), - (0x2F86A, 'M', '嬾'), - (0x2F86C, 'M', '𡧈'), - (0x2F86D, 'M', '寃'), - (0x2F86E, 'M', '寘'), - (0x2F86F, 'M', '寧'), - (0x2F870, 'M', '寳'), - (0x2F871, 'M', '𡬘'), - (0x2F872, 'M', '寿'), - (0x2F873, 'M', '将'), - (0x2F874, 'X'), - (0x2F875, 'M', '尢'), - (0x2F876, 'M', '㞁'), - (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', '慈'), - ] - -def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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', '杓'), - (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', '㴳'), - ] - -def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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, 'X'), - (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', '𥃳'), - (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, 'X'), - (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', '䌴'), - ] - -def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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', '䔫'), - (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, 'X'), - (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', '賁'), - ] - -def _seg_81() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (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', '鳽'), - (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() -) # type: Tuple[Union[Tuple[int, str], Tuple[int, str, str]], ...] diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__init__.py deleted file mode 100644 index 1300b86..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__init__.py +++ /dev/null @@ -1,57 +0,0 @@ -# coding: utf-8 -from .exceptions import * -from .ext import ExtType, Timestamp - -import os -import sys - - -version = (1, 0, 5) -__version__ = "1.0.5" - - -if os.environ.get("MSGPACK_PUREPYTHON") or sys.version_info[0] == 2: - from .fallback import Packer, unpackb, Unpacker -else: - try: - from ._cmsgpack import Packer, unpackb, Unpacker - except ImportError: - from .fallback import Packer, unpackb, Unpacker - - -def pack(o, stream, **kwargs): - """ - Pack object `o` and write it to `stream` - - See :class:`Packer` for options. - """ - packer = Packer(**kwargs) - stream.write(packer.pack(o)) - - -def packb(o, **kwargs): - """ - Pack object `o` and return packed bytes - - See :class:`Packer` for options. - """ - return Packer(**kwargs).pack(o) - - -def unpack(stream, **kwargs): - """ - Unpack an object from `stream`. - - Raises `ExtraData` when `stream` contains extra bytes. - See :class:`Unpacker` for options. - """ - data = stream.read() - return unpackb(data, **kwargs) - - -# alias for compatibility to simplejson/marshal/pickle. -load = unpack -loads = unpackb - -dump = pack -dumps = packb diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 670563d4de97d852c1666b7f207a744d818c00a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1852 zcmb7EO>7%Q6rR~1+ws~?<D_Y;QrI@-$3)3e0&SE)q|l^*C~0U~LHA;Bypv>|{jp{? zNgYzjk&q%p1wkCr6XL)DRB`7>xpIkHP^$r{Nad1SlyE>j@n*MnQYZ(WwBLI(`)2n2 zd~bisX443y{N;ypu7c15v1kgcBiT)1gf@_kZ0w@%BrGh+#hzqJo@~mnmTkpVOeNB) zsoJWUuoGsID3t@v%l34obI)#CcJd~CLkP<gwbB*a`_Yz<z|v05zkm?cAc8hm^D<_} z%bHm)XXY^SwKfr1o7?{QzMcLEnH{zUn71>4out$3B3bhw=`g!V-aJ%OdJs8q647jw z+rMtUg0A;0p{w#0w1f-UEfHw}bNpgK;>q!=;iX!Y@U}~iM_6ci)h!YBL_ww!Xqo`n zQUR9LQ~fXXzsmFPPQ5ufdiI^-<mHRwlUFXibzx#lcot-yn6%3Cg!1HqUj=KLr!GeZ zp=IIG6mgpd&#noufx<_XgX%~QT9LlSpW<us3a-e_1ABT!u87nBkQLOdep6#q!v%Ty zgR~AJqSAxu3Mq$rDJbcdZ|h6c35o86dKl;>7E)q)rF7&yMTkCBb}hz+N^w3VeI}rK zPz{~HXZ?}W#J7+y71ZNubQM=b#s!7rfG6Vncw&CZqO*)A#4AFX;G>A=Av5Lzj~Jd6 zvPEMoC@*-#51A1Xm&{Vj>tmrK4)oc<lJ5qVO{lR*{6)icrj2SXoD2Mc{!=d-3{vP5 zcU!ZB8C9oh6v537sNu0$v2PTMj_-uUVt=(p1(PG_27^5dP)C1eP_C<yJ+?jrP(OE1 zNw1w>J-^<)arE<}H{Sc=>0cCm7aUQ!)goB5+IJcjkF^g&`><%=6I<76(iAF4%kTeZ zYbXg9sINywv-Rm(NZ9}A49!7Q1u5!HlrGpEutmkxGC@OKrw2iCReWKZ9u`~huwwvG zNiz9{c69w5z+FvmX!=(jceI{OrH6{jJ-HM^@MZ(8pvwM2!Jd$tu|n6Ru*K*VX{J>y zC<k7?9+e{=7a(Ypt}`_7TKw#f%W%<h7-4z|CYM@cR%n&<r8(la-1KtbhnC|rod}P( zf-!CPbGtd3PhdCv7ZjKXn~Es~p65YD_2Y^S-(w;T;Bj2WL_F;DDd7tbdj_D6wsR<x z|7`f<;ZI(#kNu|Q*I#L9CvKbu*i=qLl`I_QX>zqp;<@6oh*pdU6$Il_z_`q6j3*ai zbYSwhRs?!SX0gbVFb@ueU3r#-JkxyP_%i`d%~-BG4b6>7Ad;XNac5hx{Ae<`_O@3I zXgE%3K;zL6JcyFuikLaB3S^M+f>-6LKo)T;iakpGVd^z6uoql1Li^ybXgym8*p@NI zf1o4xQO^U^_A5$nCy>@vPu|NNtZQH^iM65Cp|z3Kk<I*bKg-X5GjO+exY0ZO{b-|i z<cH(8d(Yli25u_@+ls6X-cJoSQiD6`BtE{=mB1%=@+sW2eHf*3b>&{Fy{`VA)P$8? qRsY()fKleq4#MKtnLDX75Q#eYkcs}?>P(Ls=$6s`29|$B81Qe5n7~H> diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc deleted file mode 100644 index a16373d187f4d052dc53562ca177dc638fcd5efe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2046 zcmb7FPjBNy6dyZw;<`!Oly-p@mFWSrMl@dF1VS8E+eLdxktiH;v8MK<vDUG}jGb;u z50&U)4<Pl{Js|ECA7wAgt@4#GP&PU3iTB1ynnqm-M#}S>-}^f=@4dXN)ocRG|KsP* zmj)q!<7TqTV`lg}Fc(B8-;#iwkwD|*&r%_4X$sW=Epcs%>IyXgHD}P0Ld$?wxB)oC z!__hsZUMe<3omn{RZ%h<WQ)8q^>1;~0^OF)7hBaq)v5V~tAc9d&2R;n3j(@YKw5gB zwMqlsDdo#Q#69Le-F@csUK%Fx@ymxya_UD+O4?2Yl}VRVJ`qbQSSWcwk2+z*X{L<B z_^@Hy6jpO@fA^~~O1o@OXy2IAB<*lP(+-QN%nphuNn6>@CDNeuNt+Imj2^K#rD;Na zmiisaqKI-K67gvPDBEfJG>m1+S<oobxioUi^J3QJo|oI6*G+;fLcZ#GKV>W$ODdih zB);cek|AE#o6PONsogG1W#4_2_*s|7sdQ5w@k7D7J2DOZr(Em=$x$37Ea1ZJ^SJLu z;ep#5q@5)GqVd`1t_)MYgSX2LxpaGB&-FkpNQB#!hlsm3_uA+U1lExv_-L{M<cz%5 zP16!smr8Q?+g3q*^R@%c(R2G@)^2n0IE$j@Wl5Om0BcyFTd{ydIbB4qHX#TNQTL2o z8RM`h{Lf(*_Of)Z{fMQkDVEUdT%<Z;NR)6HcPb5p?hf*nx?Oyn2zZ}etc2rxPvSm{ z!hnwN6$=-HO@UoCpTawcAz6i=EDoC+w8#VT|CNXReTwa)(y;fFgvJ~SFt|JPI)+Aa zZ#MK=5gPHkLw^90o9D&W4PeN$jGzS692kz7FYG=`1;cwk{$<M2aHd^(3~k2+M-WuQ z2)dRAU@&go{SFAG^?1t^J3Wb`0T8|;J4s6K$3SE%IO~ENM>Sh93yQ|`OOWzp>A>KA zNP%3C6YYd}z!mF6huvgIkpXeECRDFgIO9QXay%FeDns(9E#3z!u>nM)N0>MQ3mBU` zjKkFPj#sCrZ%nX{P#w$Ylw7?>pBul{uGTl68^77=-u-EC(7>fq#lpED*h$Ufts<HG z2M!h7=V2elpUSGZK2=|iCN{xDqO);MFjU}%Af@_jN(ypN6)O)iT6R?$O{YBHq!uU$ ze0#BlWUiCmMGOfFCHBu5`A0WQ>vdH(H;0yHJ}Bx6b(&5MOJqFbi$SBB9_@1bM;2vV z)v#&|RigPyF_33u=qay#H~V*yFX8q^C$H`GxoAhpk#d*UQG5%UJI5RA>tZN>BR&TA zYVt+ET$eOW8|h`uIuAz#KBHAlTR8u4MBp>BkYAqi+vlIWNN~4}lJ)bA7as1`uWhon l^@^;F%2n;bs}(vT@V%y_zHwT+s&AeyU9D~ZMe6FF{spa3+Q$F@ diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-312.pyc deleted file mode 100644 index 4ef7701e1920446b8b25f55fbb06c86c4bd2ea37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8689 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-312.pyc deleted file mode 100644 index 7bf2f08e0469569e78ad5425f71ced137d790066..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43597 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 P>b30OX86;sI@td|8q?YL diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/exceptions.py b/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/exceptions.py deleted file mode 100644 index d6d2615..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/exceptions.py +++ /dev/null @@ -1,48 +0,0 @@ -class UnpackException(Exception): - """Base class for some exceptions raised while unpacking. - - NOTE: unpack may raise exception other than subclass of - UnpackException. If you want to catch all error, catch - Exception instead. - """ - - -class BufferFull(UnpackException): - pass - - -class OutOfData(UnpackException): - pass - - -class FormatError(ValueError, UnpackException): - """Invalid msgpack format""" - - -class StackError(ValueError, UnpackException): - """Too nested""" - - -# Deprecated. Use ValueError instead -UnpackValueError = ValueError - - -class ExtraData(UnpackValueError): - """ExtraData is raised when there is trailing data. - - This exception is raised while only one-shot (not streaming) - unpack. - """ - - def __init__(self, unpacked, extra): - self.unpacked = unpacked - self.extra = extra - - def __str__(self): - return "unpack(b) received extra data." - - -# Deprecated. Use Exception instead to catch all exception during packing. -PackException = Exception -PackValueError = ValueError -PackOverflowError = OverflowError diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/ext.py b/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/ext.py deleted file mode 100644 index 23e0d6b..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/ext.py +++ /dev/null @@ -1,193 +0,0 @@ -# coding: utf-8 -from collections import namedtuple -import datetime -import sys -import struct - - -PY2 = sys.version_info[0] == 2 - -if PY2: - int_types = (int, long) - _utc = None -else: - int_types = int - try: - _utc = datetime.timezone.utc - except AttributeError: - _utc = datetime.timezone(datetime.timedelta(0)) - - -class ExtType(namedtuple("ExtType", "code data")): - """ExtType represents ext type in msgpack.""" - - def __new__(cls, code, data): - if not isinstance(code, int): - raise TypeError("code must be int") - if not isinstance(data, bytes): - raise TypeError("data must be bytes") - if not 0 <= code <= 127: - raise ValueError("code must be 0~127") - return super(ExtType, cls).__new__(cls, code, data) - - -class Timestamp(object): - """Timestamp represents the Timestamp extension type in msgpack. - - When built with Cython, msgpack uses C methods to pack and unpack `Timestamp`. When using pure-Python - msgpack, :func:`to_bytes` and :func:`from_bytes` are used to pack and unpack `Timestamp`. - - This class is immutable: Do not override seconds and nanoseconds. - """ - - __slots__ = ["seconds", "nanoseconds"] - - def __init__(self, seconds, nanoseconds=0): - """Initialize a Timestamp object. - - :param int seconds: - Number of seconds since the UNIX epoch (00:00:00 UTC Jan 1 1970, minus leap seconds). - May be negative. - - :param int nanoseconds: - Number of nanoseconds to add to `seconds` to get fractional time. - Maximum is 999_999_999. Default is 0. - - Note: Negative times (before the UNIX epoch) are represented as negative seconds + positive ns. - """ - if not isinstance(seconds, int_types): - raise TypeError("seconds must be an integer") - if not isinstance(nanoseconds, int_types): - raise TypeError("nanoseconds must be an integer") - if not (0 <= nanoseconds < 10**9): - raise ValueError( - "nanoseconds must be a non-negative integer less than 999999999." - ) - self.seconds = seconds - self.nanoseconds = nanoseconds - - def __repr__(self): - """String representation of Timestamp.""" - return "Timestamp(seconds={0}, nanoseconds={1})".format( - self.seconds, self.nanoseconds - ) - - def __eq__(self, other): - """Check for equality with another Timestamp object""" - if type(other) is self.__class__: - return ( - self.seconds == other.seconds and self.nanoseconds == other.nanoseconds - ) - return False - - def __ne__(self, other): - """not-equals method (see :func:`__eq__()`)""" - return not self.__eq__(other) - - def __hash__(self): - return hash((self.seconds, self.nanoseconds)) - - @staticmethod - def from_bytes(b): - """Unpack bytes into a `Timestamp` object. - - Used for pure-Python msgpack unpacking. - - :param b: Payload from msgpack ext message with code -1 - :type b: bytes - - :returns: Timestamp object unpacked from msgpack ext payload - :rtype: Timestamp - """ - if len(b) == 4: - seconds = struct.unpack("!L", b)[0] - nanoseconds = 0 - elif len(b) == 8: - data64 = struct.unpack("!Q", b)[0] - seconds = data64 & 0x00000003FFFFFFFF - nanoseconds = data64 >> 34 - elif len(b) == 12: - nanoseconds, seconds = struct.unpack("!Iq", b) - else: - raise ValueError( - "Timestamp type can only be created from 32, 64, or 96-bit byte objects" - ) - return Timestamp(seconds, nanoseconds) - - def to_bytes(self): - """Pack this Timestamp object into bytes. - - Used for pure-Python msgpack packing. - - :returns data: Payload for EXT message with code -1 (timestamp type) - :rtype: bytes - """ - if (self.seconds >> 34) == 0: # seconds is non-negative and fits in 34 bits - data64 = self.nanoseconds << 34 | self.seconds - if data64 & 0xFFFFFFFF00000000 == 0: - # nanoseconds is zero and seconds < 2**32, so timestamp 32 - data = struct.pack("!L", data64) - else: - # timestamp 64 - data = struct.pack("!Q", data64) - else: - # timestamp 96 - data = struct.pack("!Iq", self.nanoseconds, self.seconds) - return data - - @staticmethod - def from_unix(unix_sec): - """Create a Timestamp from posix timestamp in seconds. - - :param unix_float: Posix timestamp in seconds. - :type unix_float: int or float. - """ - seconds = int(unix_sec // 1) - nanoseconds = int((unix_sec % 1) * 10**9) - return Timestamp(seconds, nanoseconds) - - def to_unix(self): - """Get the timestamp as a floating-point value. - - :returns: posix timestamp - :rtype: float - """ - return self.seconds + self.nanoseconds / 1e9 - - @staticmethod - def from_unix_nano(unix_ns): - """Create a Timestamp from posix timestamp in nanoseconds. - - :param int unix_ns: Posix timestamp in nanoseconds. - :rtype: Timestamp - """ - return Timestamp(*divmod(unix_ns, 10**9)) - - def to_unix_nano(self): - """Get the timestamp as a unixtime in nanoseconds. - - :returns: posix timestamp in nanoseconds - :rtype: int - """ - return self.seconds * 10**9 + self.nanoseconds - - def to_datetime(self): - """Get the timestamp as a UTC datetime. - - Python 2 is not supported. - - :rtype: datetime. - """ - return datetime.datetime.fromtimestamp(0, _utc) + datetime.timedelta( - seconds=self.to_unix() - ) - - @staticmethod - def from_datetime(dt): - """Create a Timestamp from datetime with tzinfo. - - Python 2 is not supported. - - :rtype: Timestamp - """ - return Timestamp.from_unix(dt.timestamp()) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py b/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py deleted file mode 100644 index e8cebc1..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py +++ /dev/null @@ -1,1010 +0,0 @@ -"""Fallback pure Python implementation of msgpack""" -from datetime import datetime as _DateTime -import sys -import struct - - -PY2 = sys.version_info[0] == 2 -if PY2: - int_types = (int, long) - - def dict_iteritems(d): - return d.iteritems() - -else: - int_types = int - unicode = str - xrange = range - - def dict_iteritems(d): - return d.items() - - -if sys.version_info < (3, 5): - # Ugly hack... - RecursionError = RuntimeError - - def _is_recursionerror(e): - return ( - len(e.args) == 1 - and isinstance(e.args[0], str) - and e.args[0].startswith("maximum recursion depth exceeded") - ) - -else: - - def _is_recursionerror(e): - return True - - -if hasattr(sys, "pypy_version_info"): - # StringIO is slow on PyPy, StringIO is faster. However: PyPy's own - # StringBuilder is fastest. - from __pypy__ import newlist_hint - - try: - from __pypy__.builders import BytesBuilder as StringBuilder - except ImportError: - from __pypy__.builders import StringBuilder - USING_STRINGBUILDER = True - - class StringIO(object): - def __init__(self, s=b""): - if s: - self.builder = StringBuilder(len(s)) - self.builder.append(s) - else: - self.builder = StringBuilder() - - def write(self, s): - if isinstance(s, memoryview): - s = s.tobytes() - elif isinstance(s, bytearray): - s = bytes(s) - self.builder.append(s) - - def getvalue(self): - return self.builder.build() - -else: - USING_STRINGBUILDER = False - from io import BytesIO as StringIO - - newlist_hint = lambda size: [] - - -from .exceptions import BufferFull, OutOfData, ExtraData, FormatError, StackError - -from .ext import ExtType, Timestamp - - -EX_SKIP = 0 -EX_CONSTRUCT = 1 -EX_READ_ARRAY_HEADER = 2 -EX_READ_MAP_HEADER = 3 - -TYPE_IMMEDIATE = 0 -TYPE_ARRAY = 1 -TYPE_MAP = 2 -TYPE_RAW = 3 -TYPE_BIN = 4 -TYPE_EXT = 5 - -DEFAULT_RECURSE_LIMIT = 511 - - -def _check_type_strict(obj, t, type=type, tuple=tuple): - if type(t) is tuple: - return type(obj) in t - else: - return type(obj) is t - - -def _get_data_from_buffer(obj): - view = memoryview(obj) - if view.itemsize != 1: - raise ValueError("cannot unpack from multi-byte object") - return view - - -def unpackb(packed, **kwargs): - """ - Unpack an object from `packed`. - - Raises ``ExtraData`` when *packed* contains extra bytes. - Raises ``ValueError`` when *packed* is incomplete. - Raises ``FormatError`` when *packed* is not valid msgpack. - Raises ``StackError`` when *packed* contains too nested. - Other exceptions can be raised during unpacking. - - See :class:`Unpacker` for options. - """ - unpacker = Unpacker(None, max_buffer_size=len(packed), **kwargs) - unpacker.feed(packed) - try: - ret = unpacker._unpack() - except OutOfData: - raise ValueError("Unpack failed: incomplete input") - except RecursionError as e: - if _is_recursionerror(e): - raise StackError - raise - if unpacker._got_extradata(): - raise ExtraData(ret, unpacker._get_extradata()) - return ret - - -if sys.version_info < (2, 7, 6): - - def _unpack_from(f, b, o=0): - """Explicit type cast for legacy struct.unpack_from""" - return struct.unpack_from(f, bytes(b), o) - -else: - _unpack_from = struct.unpack_from - -_NO_FORMAT_USED = "" -_MSGPACK_HEADERS = { - 0xC4: (1, _NO_FORMAT_USED, TYPE_BIN), - 0xC5: (2, ">H", TYPE_BIN), - 0xC6: (4, ">I", TYPE_BIN), - 0xC7: (2, "Bb", TYPE_EXT), - 0xC8: (3, ">Hb", TYPE_EXT), - 0xC9: (5, ">Ib", TYPE_EXT), - 0xCA: (4, ">f"), - 0xCB: (8, ">d"), - 0xCC: (1, _NO_FORMAT_USED), - 0xCD: (2, ">H"), - 0xCE: (4, ">I"), - 0xCF: (8, ">Q"), - 0xD0: (1, "b"), - 0xD1: (2, ">h"), - 0xD2: (4, ">i"), - 0xD3: (8, ">q"), - 0xD4: (1, "b1s", TYPE_EXT), - 0xD5: (2, "b2s", TYPE_EXT), - 0xD6: (4, "b4s", TYPE_EXT), - 0xD7: (8, "b8s", TYPE_EXT), - 0xD8: (16, "b16s", TYPE_EXT), - 0xD9: (1, _NO_FORMAT_USED, TYPE_RAW), - 0xDA: (2, ">H", TYPE_RAW), - 0xDB: (4, ">I", TYPE_RAW), - 0xDC: (2, ">H", TYPE_ARRAY), - 0xDD: (4, ">I", TYPE_ARRAY), - 0xDE: (2, ">H", TYPE_MAP), - 0xDF: (4, ">I", TYPE_MAP), -} - - -class Unpacker(object): - """Streaming unpacker. - - Arguments: - - :param file_like: - File-like object having `.read(n)` method. - If specified, unpacker reads serialized data from it and :meth:`feed()` is not usable. - - :param int read_size: - Used as `file_like.read(read_size)`. (default: `min(16*1024, max_buffer_size)`) - - :param bool use_list: - If true, unpack msgpack array to Python list. - Otherwise, unpack to Python tuple. (default: True) - - :param bool raw: - If true, unpack msgpack raw to Python bytes. - Otherwise, unpack to Python str by decoding with UTF-8 encoding (default). - - :param int timestamp: - Control how timestamp type is unpacked: - - 0 - Timestamp - 1 - float (Seconds from the EPOCH) - 2 - int (Nanoseconds from the EPOCH) - 3 - datetime.datetime (UTC). Python 2 is not supported. - - :param bool strict_map_key: - If true (default), only str or bytes are accepted for map (dict) keys. - - :param callable object_hook: - When specified, it should be callable. - Unpacker calls it with a dict argument after unpacking msgpack map. - (See also simplejson) - - :param callable object_pairs_hook: - When specified, it should be callable. - Unpacker calls it with a list of key-value pairs after unpacking msgpack map. - (See also simplejson) - - :param str unicode_errors: - The error handler for decoding unicode. (default: 'strict') - This option should be used only when you have msgpack data which - contains invalid UTF-8 string. - - :param int max_buffer_size: - Limits size of data waiting unpacked. 0 means 2**32-1. - The default value is 100*1024*1024 (100MiB). - Raises `BufferFull` exception when it is insufficient. - You should set this parameter when unpacking data from untrusted source. - - :param int max_str_len: - Deprecated, use *max_buffer_size* instead. - Limits max length of str. (default: max_buffer_size) - - :param int max_bin_len: - Deprecated, use *max_buffer_size* instead. - Limits max length of bin. (default: max_buffer_size) - - :param int max_array_len: - Limits max length of array. - (default: max_buffer_size) - - :param int max_map_len: - Limits max length of map. - (default: max_buffer_size//2) - - :param int max_ext_len: - Deprecated, use *max_buffer_size* instead. - Limits max size of ext type. (default: max_buffer_size) - - Example of streaming deserialize from file-like object:: - - unpacker = Unpacker(file_like) - for o in unpacker: - process(o) - - Example of streaming deserialize from socket:: - - unpacker = Unpacker() - while True: - buf = sock.recv(1024**2) - if not buf: - break - unpacker.feed(buf) - for o in unpacker: - process(o) - - Raises ``ExtraData`` when *packed* contains extra bytes. - Raises ``OutOfData`` when *packed* is incomplete. - Raises ``FormatError`` when *packed* is not valid msgpack. - Raises ``StackError`` when *packed* contains too nested. - Other exceptions can be raised during unpacking. - """ - - def __init__( - self, - file_like=None, - read_size=0, - use_list=True, - raw=False, - timestamp=0, - strict_map_key=True, - object_hook=None, - object_pairs_hook=None, - list_hook=None, - unicode_errors=None, - max_buffer_size=100 * 1024 * 1024, - ext_hook=ExtType, - max_str_len=-1, - max_bin_len=-1, - max_array_len=-1, - max_map_len=-1, - max_ext_len=-1, - ): - if unicode_errors is None: - unicode_errors = "strict" - - if file_like is None: - self._feeding = True - else: - if not callable(file_like.read): - raise TypeError("`file_like.read` must be callable") - self.file_like = file_like - self._feeding = False - - #: array of bytes fed. - self._buffer = bytearray() - #: Which position we currently reads - self._buff_i = 0 - - # When Unpacker is used as an iterable, between the calls to next(), - # the buffer is not "consumed" completely, for efficiency sake. - # Instead, it is done sloppily. To make sure we raise BufferFull at - # the correct moments, we have to keep track of how sloppy we were. - # Furthermore, when the buffer is incomplete (that is: in the case - # we raise an OutOfData) we need to rollback the buffer to the correct - # state, which _buf_checkpoint records. - self._buf_checkpoint = 0 - - if not max_buffer_size: - max_buffer_size = 2**31 - 1 - if max_str_len == -1: - max_str_len = max_buffer_size - if max_bin_len == -1: - max_bin_len = max_buffer_size - if max_array_len == -1: - max_array_len = max_buffer_size - if max_map_len == -1: - max_map_len = max_buffer_size // 2 - if max_ext_len == -1: - max_ext_len = max_buffer_size - - self._max_buffer_size = max_buffer_size - if read_size > self._max_buffer_size: - raise ValueError("read_size must be smaller than max_buffer_size") - self._read_size = read_size or min(self._max_buffer_size, 16 * 1024) - self._raw = bool(raw) - self._strict_map_key = bool(strict_map_key) - self._unicode_errors = unicode_errors - self._use_list = use_list - if not (0 <= timestamp <= 3): - raise ValueError("timestamp must be 0..3") - self._timestamp = timestamp - self._list_hook = list_hook - self._object_hook = object_hook - self._object_pairs_hook = object_pairs_hook - self._ext_hook = ext_hook - self._max_str_len = max_str_len - self._max_bin_len = max_bin_len - self._max_array_len = max_array_len - self._max_map_len = max_map_len - self._max_ext_len = max_ext_len - self._stream_offset = 0 - - if list_hook is not None and not callable(list_hook): - raise TypeError("`list_hook` is not callable") - if object_hook is not None and not callable(object_hook): - raise TypeError("`object_hook` is not callable") - if object_pairs_hook is not None and not callable(object_pairs_hook): - raise TypeError("`object_pairs_hook` is not callable") - if object_hook is not None and object_pairs_hook is not None: - raise TypeError( - "object_pairs_hook and object_hook are mutually " "exclusive" - ) - if not callable(ext_hook): - raise TypeError("`ext_hook` is not callable") - - def feed(self, next_bytes): - assert self._feeding - view = _get_data_from_buffer(next_bytes) - if len(self._buffer) - self._buff_i + len(view) > self._max_buffer_size: - raise BufferFull - - # Strip buffer before checkpoint before reading file. - if self._buf_checkpoint > 0: - del self._buffer[: self._buf_checkpoint] - self._buff_i -= self._buf_checkpoint - self._buf_checkpoint = 0 - - # Use extend here: INPLACE_ADD += doesn't reliably typecast memoryview in jython - self._buffer.extend(view) - - def _consume(self): - """Gets rid of the used parts of the buffer.""" - self._stream_offset += self._buff_i - self._buf_checkpoint - self._buf_checkpoint = self._buff_i - - def _got_extradata(self): - return self._buff_i < len(self._buffer) - - def _get_extradata(self): - return self._buffer[self._buff_i :] - - def read_bytes(self, n): - ret = self._read(n, raise_outofdata=False) - self._consume() - return ret - - def _read(self, n, raise_outofdata=True): - # (int) -> bytearray - self._reserve(n, raise_outofdata=raise_outofdata) - i = self._buff_i - ret = self._buffer[i : i + n] - self._buff_i = i + len(ret) - return ret - - def _reserve(self, n, raise_outofdata=True): - remain_bytes = len(self._buffer) - self._buff_i - n - - # Fast path: buffer has n bytes already - if remain_bytes >= 0: - return - - if self._feeding: - self._buff_i = self._buf_checkpoint - raise OutOfData - - # Strip buffer before checkpoint before reading file. - if self._buf_checkpoint > 0: - del self._buffer[: self._buf_checkpoint] - self._buff_i -= self._buf_checkpoint - self._buf_checkpoint = 0 - - # Read from file - remain_bytes = -remain_bytes - if remain_bytes + len(self._buffer) > self._max_buffer_size: - raise BufferFull - while remain_bytes > 0: - to_read_bytes = max(self._read_size, remain_bytes) - read_data = self.file_like.read(to_read_bytes) - if not read_data: - break - assert isinstance(read_data, bytes) - self._buffer += read_data - remain_bytes -= len(read_data) - - if len(self._buffer) < n + self._buff_i and raise_outofdata: - self._buff_i = 0 # rollback - raise OutOfData - - def _read_header(self): - typ = TYPE_IMMEDIATE - n = 0 - obj = None - self._reserve(1) - b = self._buffer[self._buff_i] - self._buff_i += 1 - if b & 0b10000000 == 0: - obj = b - elif b & 0b11100000 == 0b11100000: - obj = -1 - (b ^ 0xFF) - elif b & 0b11100000 == 0b10100000: - n = b & 0b00011111 - typ = TYPE_RAW - if n > self._max_str_len: - raise ValueError("%s exceeds max_str_len(%s)" % (n, self._max_str_len)) - obj = self._read(n) - elif b & 0b11110000 == 0b10010000: - n = b & 0b00001111 - typ = TYPE_ARRAY - if n > self._max_array_len: - raise ValueError( - "%s exceeds max_array_len(%s)" % (n, self._max_array_len) - ) - elif b & 0b11110000 == 0b10000000: - n = b & 0b00001111 - typ = TYPE_MAP - if n > self._max_map_len: - raise ValueError("%s exceeds max_map_len(%s)" % (n, self._max_map_len)) - elif b == 0xC0: - obj = None - elif b == 0xC2: - obj = False - elif b == 0xC3: - obj = True - elif 0xC4 <= b <= 0xC6: - size, fmt, typ = _MSGPACK_HEADERS[b] - self._reserve(size) - if len(fmt) > 0: - n = _unpack_from(fmt, self._buffer, self._buff_i)[0] - else: - n = self._buffer[self._buff_i] - self._buff_i += size - if n > self._max_bin_len: - raise ValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len)) - obj = self._read(n) - elif 0xC7 <= b <= 0xC9: - size, fmt, typ = _MSGPACK_HEADERS[b] - self._reserve(size) - L, n = _unpack_from(fmt, self._buffer, self._buff_i) - self._buff_i += size - if L > self._max_ext_len: - raise ValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len)) - obj = self._read(L) - elif 0xCA <= b <= 0xD3: - size, fmt = _MSGPACK_HEADERS[b] - self._reserve(size) - if len(fmt) > 0: - obj = _unpack_from(fmt, self._buffer, self._buff_i)[0] - else: - obj = self._buffer[self._buff_i] - self._buff_i += size - elif 0xD4 <= b <= 0xD8: - size, fmt, typ = _MSGPACK_HEADERS[b] - if self._max_ext_len < size: - raise ValueError( - "%s exceeds max_ext_len(%s)" % (size, self._max_ext_len) - ) - self._reserve(size + 1) - n, obj = _unpack_from(fmt, self._buffer, self._buff_i) - self._buff_i += size + 1 - elif 0xD9 <= b <= 0xDB: - size, fmt, typ = _MSGPACK_HEADERS[b] - self._reserve(size) - if len(fmt) > 0: - (n,) = _unpack_from(fmt, self._buffer, self._buff_i) - else: - n = self._buffer[self._buff_i] - self._buff_i += size - if n > self._max_str_len: - raise ValueError("%s exceeds max_str_len(%s)" % (n, self._max_str_len)) - obj = self._read(n) - elif 0xDC <= b <= 0xDD: - size, fmt, typ = _MSGPACK_HEADERS[b] - self._reserve(size) - (n,) = _unpack_from(fmt, self._buffer, self._buff_i) - self._buff_i += size - if n > self._max_array_len: - raise ValueError( - "%s exceeds max_array_len(%s)" % (n, self._max_array_len) - ) - elif 0xDE <= b <= 0xDF: - size, fmt, typ = _MSGPACK_HEADERS[b] - self._reserve(size) - (n,) = _unpack_from(fmt, self._buffer, self._buff_i) - self._buff_i += size - if n > self._max_map_len: - raise ValueError("%s exceeds max_map_len(%s)" % (n, self._max_map_len)) - else: - raise FormatError("Unknown header: 0x%x" % b) - return typ, n, obj - - def _unpack(self, execute=EX_CONSTRUCT): - typ, n, obj = self._read_header() - - if execute == EX_READ_ARRAY_HEADER: - if typ != TYPE_ARRAY: - raise ValueError("Expected array") - return n - if execute == EX_READ_MAP_HEADER: - if typ != TYPE_MAP: - raise ValueError("Expected map") - return n - # TODO should we eliminate the recursion? - if typ == TYPE_ARRAY: - if execute == EX_SKIP: - for i in xrange(n): - # TODO check whether we need to call `list_hook` - self._unpack(EX_SKIP) - return - ret = newlist_hint(n) - for i in xrange(n): - ret.append(self._unpack(EX_CONSTRUCT)) - if self._list_hook is not None: - ret = self._list_hook(ret) - # TODO is the interaction between `list_hook` and `use_list` ok? - return ret if self._use_list else tuple(ret) - if typ == TYPE_MAP: - if execute == EX_SKIP: - for i in xrange(n): - # TODO check whether we need to call hooks - self._unpack(EX_SKIP) - self._unpack(EX_SKIP) - return - if self._object_pairs_hook is not None: - ret = self._object_pairs_hook( - (self._unpack(EX_CONSTRUCT), self._unpack(EX_CONSTRUCT)) - for _ in xrange(n) - ) - else: - ret = {} - for _ in xrange(n): - key = self._unpack(EX_CONSTRUCT) - if self._strict_map_key and type(key) not in (unicode, bytes): - raise ValueError( - "%s is not allowed for map key" % str(type(key)) - ) - if not PY2 and type(key) is str: - key = sys.intern(key) - ret[key] = self._unpack(EX_CONSTRUCT) - if self._object_hook is not None: - ret = self._object_hook(ret) - return ret - if execute == EX_SKIP: - return - if typ == TYPE_RAW: - if self._raw: - obj = bytes(obj) - else: - obj = obj.decode("utf_8", self._unicode_errors) - return obj - if typ == TYPE_BIN: - return bytes(obj) - if typ == TYPE_EXT: - if n == -1: # timestamp - ts = Timestamp.from_bytes(bytes(obj)) - if self._timestamp == 1: - return ts.to_unix() - elif self._timestamp == 2: - return ts.to_unix_nano() - elif self._timestamp == 3: - return ts.to_datetime() - else: - return ts - else: - return self._ext_hook(n, bytes(obj)) - assert typ == TYPE_IMMEDIATE - return obj - - def __iter__(self): - return self - - def __next__(self): - try: - ret = self._unpack(EX_CONSTRUCT) - self._consume() - return ret - except OutOfData: - self._consume() - raise StopIteration - except RecursionError: - raise StackError - - next = __next__ - - def skip(self): - self._unpack(EX_SKIP) - self._consume() - - def unpack(self): - try: - ret = self._unpack(EX_CONSTRUCT) - except RecursionError: - raise StackError - self._consume() - return ret - - def read_array_header(self): - ret = self._unpack(EX_READ_ARRAY_HEADER) - self._consume() - return ret - - def read_map_header(self): - ret = self._unpack(EX_READ_MAP_HEADER) - self._consume() - return ret - - def tell(self): - return self._stream_offset - - -class Packer(object): - """ - MessagePack Packer - - Usage:: - - packer = Packer() - astream.write(packer.pack(a)) - astream.write(packer.pack(b)) - - Packer's constructor has some keyword arguments: - - :param callable default: - Convert user type to builtin type that Packer supports. - See also simplejson's document. - - :param bool use_single_float: - Use single precision float type for float. (default: False) - - :param bool autoreset: - Reset buffer after each pack and return its content as `bytes`. (default: True). - If set this to false, use `bytes()` to get content and `.reset()` to clear buffer. - - :param bool use_bin_type: - Use bin type introduced in msgpack spec 2.0 for bytes. - It also enables str8 type for unicode. (default: True) - - :param bool strict_types: - If set to true, types will be checked to be exact. Derived classes - from serializable types will not be serialized and will be - treated as unsupported type and forwarded to default. - Additionally tuples will not be serialized as lists. - This is useful when trying to implement accurate serialization - for python types. - - :param bool datetime: - If set to true, datetime with tzinfo is packed into Timestamp type. - Note that the tzinfo is stripped in the timestamp. - You can get UTC datetime with `timestamp=3` option of the Unpacker. - (Python 2 is not supported). - - :param str unicode_errors: - The error handler for encoding unicode. (default: 'strict') - DO NOT USE THIS!! This option is kept for very specific usage. - - Example of streaming deserialize from file-like object:: - - unpacker = Unpacker(file_like) - for o in unpacker: - process(o) - - Example of streaming deserialize from socket:: - - unpacker = Unpacker() - while True: - buf = sock.recv(1024**2) - if not buf: - break - unpacker.feed(buf) - for o in unpacker: - process(o) - - Raises ``ExtraData`` when *packed* contains extra bytes. - Raises ``OutOfData`` when *packed* is incomplete. - Raises ``FormatError`` when *packed* is not valid msgpack. - Raises ``StackError`` when *packed* contains too nested. - Other exceptions can be raised during unpacking. - """ - - def __init__( - self, - default=None, - use_single_float=False, - autoreset=True, - use_bin_type=True, - strict_types=False, - datetime=False, - unicode_errors=None, - ): - self._strict_types = strict_types - self._use_float = use_single_float - self._autoreset = autoreset - self._use_bin_type = use_bin_type - self._buffer = StringIO() - if PY2 and datetime: - raise ValueError("datetime is not supported in Python 2") - self._datetime = bool(datetime) - self._unicode_errors = unicode_errors or "strict" - if default is not None: - if not callable(default): - raise TypeError("default must be callable") - self._default = default - - def _pack( - self, - obj, - nest_limit=DEFAULT_RECURSE_LIMIT, - check=isinstance, - check_type_strict=_check_type_strict, - ): - default_used = False - if self._strict_types: - check = check_type_strict - list_types = list - else: - list_types = (list, tuple) - while True: - if nest_limit < 0: - raise ValueError("recursion limit exceeded") - if obj is None: - return self._buffer.write(b"\xc0") - if check(obj, bool): - if obj: - return self._buffer.write(b"\xc3") - return self._buffer.write(b"\xc2") - if check(obj, int_types): - if 0 <= obj < 0x80: - return self._buffer.write(struct.pack("B", obj)) - if -0x20 <= obj < 0: - return self._buffer.write(struct.pack("b", obj)) - if 0x80 <= obj <= 0xFF: - return self._buffer.write(struct.pack("BB", 0xCC, obj)) - if -0x80 <= obj < 0: - return self._buffer.write(struct.pack(">Bb", 0xD0, obj)) - if 0xFF < obj <= 0xFFFF: - return self._buffer.write(struct.pack(">BH", 0xCD, obj)) - if -0x8000 <= obj < -0x80: - return self._buffer.write(struct.pack(">Bh", 0xD1, obj)) - if 0xFFFF < obj <= 0xFFFFFFFF: - return self._buffer.write(struct.pack(">BI", 0xCE, obj)) - if -0x80000000 <= obj < -0x8000: - return self._buffer.write(struct.pack(">Bi", 0xD2, obj)) - if 0xFFFFFFFF < obj <= 0xFFFFFFFFFFFFFFFF: - return self._buffer.write(struct.pack(">BQ", 0xCF, obj)) - if -0x8000000000000000 <= obj < -0x80000000: - return self._buffer.write(struct.pack(">Bq", 0xD3, obj)) - if not default_used and self._default is not None: - obj = self._default(obj) - default_used = True - continue - raise OverflowError("Integer value out of range") - if check(obj, (bytes, bytearray)): - n = len(obj) - if n >= 2**32: - raise ValueError("%s is too large" % type(obj).__name__) - self._pack_bin_header(n) - return self._buffer.write(obj) - if check(obj, unicode): - obj = obj.encode("utf-8", self._unicode_errors) - n = len(obj) - if n >= 2**32: - raise ValueError("String is too large") - self._pack_raw_header(n) - return self._buffer.write(obj) - if check(obj, memoryview): - n = obj.nbytes - if n >= 2**32: - raise ValueError("Memoryview is too large") - self._pack_bin_header(n) - return self._buffer.write(obj) - if check(obj, float): - if self._use_float: - return self._buffer.write(struct.pack(">Bf", 0xCA, obj)) - return self._buffer.write(struct.pack(">Bd", 0xCB, obj)) - if check(obj, (ExtType, Timestamp)): - if check(obj, Timestamp): - code = -1 - data = obj.to_bytes() - else: - code = obj.code - data = obj.data - assert isinstance(code, int) - assert isinstance(data, bytes) - L = len(data) - if L == 1: - self._buffer.write(b"\xd4") - elif L == 2: - self._buffer.write(b"\xd5") - elif L == 4: - self._buffer.write(b"\xd6") - elif L == 8: - self._buffer.write(b"\xd7") - elif L == 16: - self._buffer.write(b"\xd8") - elif L <= 0xFF: - self._buffer.write(struct.pack(">BB", 0xC7, L)) - elif L <= 0xFFFF: - self._buffer.write(struct.pack(">BH", 0xC8, L)) - else: - self._buffer.write(struct.pack(">BI", 0xC9, L)) - self._buffer.write(struct.pack("b", code)) - self._buffer.write(data) - return - if check(obj, list_types): - n = len(obj) - self._pack_array_header(n) - for i in xrange(n): - self._pack(obj[i], nest_limit - 1) - return - if check(obj, dict): - return self._pack_map_pairs( - len(obj), dict_iteritems(obj), nest_limit - 1 - ) - - if self._datetime and check(obj, _DateTime) and obj.tzinfo is not None: - obj = Timestamp.from_datetime(obj) - default_used = 1 - continue - - if not default_used and self._default is not None: - obj = self._default(obj) - default_used = 1 - continue - - if self._datetime and check(obj, _DateTime): - raise ValueError("Cannot serialize %r where tzinfo=None" % (obj,)) - - raise TypeError("Cannot serialize %r" % (obj,)) - - def pack(self, obj): - try: - self._pack(obj) - except: - self._buffer = StringIO() # force reset - raise - if self._autoreset: - ret = self._buffer.getvalue() - self._buffer = StringIO() - return ret - - def pack_map_pairs(self, pairs): - self._pack_map_pairs(len(pairs), pairs) - if self._autoreset: - ret = self._buffer.getvalue() - self._buffer = StringIO() - return ret - - def pack_array_header(self, n): - if n >= 2**32: - raise ValueError - self._pack_array_header(n) - if self._autoreset: - ret = self._buffer.getvalue() - self._buffer = StringIO() - return ret - - def pack_map_header(self, n): - if n >= 2**32: - raise ValueError - self._pack_map_header(n) - if self._autoreset: - ret = self._buffer.getvalue() - self._buffer = StringIO() - return ret - - def pack_ext_type(self, typecode, data): - if not isinstance(typecode, int): - raise TypeError("typecode must have int type.") - if not 0 <= typecode <= 127: - raise ValueError("typecode should be 0-127") - if not isinstance(data, bytes): - raise TypeError("data must have bytes type") - L = len(data) - if L > 0xFFFFFFFF: - raise ValueError("Too large data") - if L == 1: - self._buffer.write(b"\xd4") - elif L == 2: - self._buffer.write(b"\xd5") - elif L == 4: - self._buffer.write(b"\xd6") - elif L == 8: - self._buffer.write(b"\xd7") - elif L == 16: - self._buffer.write(b"\xd8") - elif L <= 0xFF: - self._buffer.write(b"\xc7" + struct.pack("B", L)) - elif L <= 0xFFFF: - self._buffer.write(b"\xc8" + struct.pack(">H", L)) - else: - self._buffer.write(b"\xc9" + struct.pack(">I", L)) - self._buffer.write(struct.pack("B", typecode)) - self._buffer.write(data) - - def _pack_array_header(self, n): - if n <= 0x0F: - return self._buffer.write(struct.pack("B", 0x90 + n)) - if n <= 0xFFFF: - return self._buffer.write(struct.pack(">BH", 0xDC, n)) - if n <= 0xFFFFFFFF: - return self._buffer.write(struct.pack(">BI", 0xDD, n)) - raise ValueError("Array is too large") - - def _pack_map_header(self, n): - if n <= 0x0F: - return self._buffer.write(struct.pack("B", 0x80 + n)) - if n <= 0xFFFF: - return self._buffer.write(struct.pack(">BH", 0xDE, n)) - if n <= 0xFFFFFFFF: - return self._buffer.write(struct.pack(">BI", 0xDF, n)) - raise ValueError("Dict is too large") - - def _pack_map_pairs(self, n, pairs, nest_limit=DEFAULT_RECURSE_LIMIT): - self._pack_map_header(n) - for (k, v) in pairs: - self._pack(k, nest_limit - 1) - self._pack(v, nest_limit - 1) - - def _pack_raw_header(self, n): - if n <= 0x1F: - self._buffer.write(struct.pack("B", 0xA0 + n)) - elif self._use_bin_type and n <= 0xFF: - self._buffer.write(struct.pack(">BB", 0xD9, n)) - elif n <= 0xFFFF: - self._buffer.write(struct.pack(">BH", 0xDA, n)) - elif n <= 0xFFFFFFFF: - self._buffer.write(struct.pack(">BI", 0xDB, n)) - else: - raise ValueError("Raw is too large") - - def _pack_bin_header(self, n): - if not self._use_bin_type: - return self._pack_raw_header(n) - elif n <= 0xFF: - return self._buffer.write(struct.pack(">BB", 0xC4, n)) - elif n <= 0xFFFF: - return self._buffer.write(struct.pack(">BH", 0xC5, n)) - elif n <= 0xFFFFFFFF: - return self._buffer.write(struct.pack(">BI", 0xC6, n)) - else: - raise ValueError("Bin is too large") - - def bytes(self): - """Return internal buffer contents as bytes object""" - return self._buffer.getvalue() - - def reset(self): - """Reset internal buffer. - - This method is useful only when autoreset=False. - """ - self._buffer = StringIO() - - def getbuffer(self): - """Return view of internal buffer.""" - if USING_STRINGBUILDER or PY2: - return memoryview(self.bytes()) - else: - return self._buffer.getbuffer() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__about__.py b/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__about__.py deleted file mode 100644 index 3551bc2..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__about__.py +++ /dev/null @@ -1,26 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. - -__all__ = [ - "__title__", - "__summary__", - "__uri__", - "__version__", - "__author__", - "__email__", - "__license__", - "__copyright__", -] - -__title__ = "packaging" -__summary__ = "Core utilities for Python packages" -__uri__ = "https://github.com/pypa/packaging" - -__version__ = "21.3" - -__author__ = "Donald Stufft and individual contributors" -__email__ = "donald@stufft.io" - -__license__ = "BSD-2-Clause or Apache-2.0" -__copyright__ = "2014-2019 %s" % __author__ diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__init__.py deleted file mode 100644 index 3c50c5d..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. - -from .__about__ import ( - __author__, - __copyright__, - __email__, - __license__, - __summary__, - __title__, - __uri__, - __version__, -) - -__all__ = [ - "__title__", - "__summary__", - "__uri__", - "__version__", - "__author__", - "__email__", - "__license__", - "__copyright__", -] diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-312.pyc deleted file mode 100644 index c077f4533e94a24f99cf9c0bda39246a50aa7ea1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 651 zcmYL_J#W-77{{G^%O%%bZ$Jojr~(qhffDyp2Hu2#-i(mCWwCs*FR_}$k?jN}Ea5{S zHiX#tEKF>tPABmND!O&Txl`3g^3Q(k|MTea|F`4VKu7fbbMmzZz~3&p4V~}eI?&rU z5CZ~!8X+J?XpmmmBmJ;X2H}7V!yy@kBVvXo8Pj1i0w5gM*4&<tFD--=Qz=F0a)OX7 zvkZ$`CniFrVEfyO3dwk`6B{91s)P%D)|E8FEZu8T7SUXGZ5)ImUetociRxqpjxKP_ z^0;|)#szgt#ZsmimF}7g_hYTw<?dcYW%Dpms*o=sjG0Qxl^^j87IlH)U7JC$@K2lh zlIJ)j?zt-0YvtmcxGX2EVx+{W8}VETwkj1DvYC;c^sU@Uea4%k_vcG5@Xk_PO6uw{ z-s$!U^#cE-IS5V`&peG6?qm63Zgp1RRDV-+ev5vGL5E=n?IjRqhj9l>;}^Kr1UD5- zct&A{m8{^BM`cEHC844zjRnp;saSMDg-7_OJmr{B0V|qUFl8(K<<6E<e-S{*6!mWX zfdwld(lWxuoh49DxZ<U@+b`;y@#~C}GNo_Cp&rA~OTN;$>Klgf&$cGL*1Wn8oCmG7 qnFj4-V|%T+o!)CFTjzOeZw`)IYdd|SA7;ltj{eM^esP4O>;D6^aLG#m diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 3af0a7c6597565ee79d937b4ff8c454b22ef3ebf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 487 zcmYk2zfQw25XSAKZIYrQCKjHcLu>J8L`=*)fR~d=tkkL<N48TGG4T{^3~W3LZ@|jL z26RAT;!FT>!%uhTPv4#IaW<P0jPmY!^+pMKj>T^zKgsq4lUq`eifUpgrzYWvNqK5U zd}PLaY$kkSGM<^7=akf>O71By`gA^eK~FNzpQZq!3oGjYo@M~0ZF{HcRlu?UkVYtt z=?;KarEI($3f~zcTtA3{3Oe>PfX=Bwu#wIy+W^dSm*XUtMHCV7TP}?lM@%9{h>Q6& zjue-+!|8(}_W#MgO}_2^oZ?iWamNR;MKSs8*vcBoj0k?i&TZKl*#ysm)UtNMEPPPq zTDnDLuNrMdB^}$yX2Z0)WNnX^XpWbMN6f1r7p*AQqL!Yus%3z($~rbQRZ}wn)hOI` r+4i6Lsj*e3<(b>VE#h(g0pc~KlzvPLntTw%HsXE1*hy|Ow~OyzaIl0= diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc deleted file mode 100644 index 3724d77d79de5b50339815477b5833c48553f863..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12097 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 DHD_@W diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc deleted file mode 100644 index c30b3957ee85889c6e4dbe271faef210ade66e99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6931 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-312.pyc deleted file mode 100644 index 4c4b9a91a4ff8e3c3703bfac9d393e0c632c42d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3262 zcmc&#%}*Og6rWvxV8F(-m|_A+9MPz8TUbb{R+XZhqV(h7OLF3}T6PE9iM{L0F0`f` zIB=-cR;tuWaH{C3Li{PcP;seNz4afUa-~Q)_5EgS%WJ%pa_LI@_Pw`n=Dm3zzxg$n zn_%?VKYdj@NHO*&gx-_vGM!I}Ibb^bggI=VIogS?{;ZRZvy-mbx+X1jvPkqTbh6O< z7KwJUoU*(2^3(URPvQaXwyrsBU3WB|*wh_;Ke?VHK1F<j__UMcV<cxblTM1{@c}ta z^2C5VM)Kr<oFO?oAdi!rb0)B#GfDepNuFxw%2Q$XGk3G@)`Rx5c8iB;!GkT~+S*{) z#3$(OAp8T?*2;P%%=DHWvtunx`n<8}V^Qh#mqyKNa-(Sl{<iVhv$vYu4SXZu4PF&i zbJ-8-_6shS9q$Xb;aLtB#x{4ijYfULXtjfy=RR0jyKngQfG@W!`-N5IzR{|;43o?p zPZ&yBcdLf!2V%>nfVscYYKIxq6uc!&b7!^}9S*h9Q;$)6KGmJ=vETFa9b#DIp!g*Z z`YtgCEa)d8fL1=c?4+yheV@|#E5~}6tXY07Od<f0AzPIVfrdk1_&XvnrG`=G4I+E& zkNnJ!j}Hq!e14X{eVVx~vRI$;f*Kcgw-HIBo=8!S^~w{06CUegoIavJ#K)3SNkx%1 z%|<{m%nT(5${g8sdZ{T$ua~<MZ@~xri8&${9Pv?(NI8ua^B_1`#0T0-9%+S`!SwHH zyX^V!;mM{qcTbs^B9V$PQTOYvA6Tx<!*SEJ8<y`=^+!d>Uyg_n${E_K1A=1AAKpDG z{BrB(TW9&z)6D9{pvf*e98`yA@p-9^Dgcy7XTJb5SMVd2XvHOtMirn+N}2n+Sc?M4 zRtXCgUbTYyHXrPa$Y`MHWo?jXstr-~baP+U!s+2nE{wsLX}Y{hX)g@=q4AX3McUBE z<RI_;-mjGN7$4VaQtaV`X*NA)s{uZ1nlHDkM)yyGpg>I0>M&7v1Mw!fw72n`+d-Jz z@Vtg7l1eOqltA7Fc?aY@5ZTExBN#@3vr3XC#{Z7UK0DX7)Q!WX4x`U`T1%A_UjjdS z_~e}Qvqu4b&&H_Ml+~KDT7y+VsR~L}h*6ck-^BK%(>ovijjyU5g0$)FKbRmqoqZzz z*Zsn$=zf```z7DbmUH4Bg(47Gq@PHRjt$)@JLAi}zEI^Df>BxCotwjL7J+zFwGZ(( z)EM<)oc>)C;w8R_JZ&)C)UwlJgHrG=y9|h;$_8ML03XTGWLz@avW<5ZVv+zT$K@sZ z1Acu+7?pTOG=a<Uj!<t27uSSxaT9wF!?qmU*pPtTt5|ji<ihPj%Aq93-(V6PVjTgl zAHc`xYwSNcLTki3q9lJ9aU|h7GD!ap%mNU0p=|+rJBu-GB=PuTvhV?mz~i~E^D?EC z^0as#`^n;?y21bf@(P)KAg@>hxepSHx)NbWL9YZ1kR^KkZ;2@AT~Khl0Eirf-m4+# z2<W{UW)~Io7LOKzyhSy_2(MC3s%t{#S4J&IFM5-_&OB5%)+6zd7NJ}|a(AB4H0@P( jPAmPzKt5pE;x~`>GOyBeS`n%usS5YbX3D>@Y3cMIU`mbB diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-312.pyc deleted file mode 100644 index 02f8bbb91836a11e865684d926d99a0575512ac5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14079 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc deleted file mode 100644 index 97261225f90cceebbe098e34d29727d6f7934dab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6967 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-312.pyc deleted file mode 100644 index 191b48172fd1ede5653eb510ed7c7e7a5e1533a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31268 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 Ioej?a1~kDLzW@LL diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc deleted file mode 100644 index ebcc4a9426e0510ae8d02700826f99c712c2db9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18977 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 F{{y!XF{c0k diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index 4238a18377fccf042d92455f7c547168c81bf248..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5889 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-312.pyc deleted file mode 100644 index 1284483fb34472d6362775a8b48d168cabd8f208..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19960 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_manylinux.py b/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_manylinux.py deleted file mode 100644 index 4c379aa..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_manylinux.py +++ /dev/null @@ -1,301 +0,0 @@ -import collections -import functools -import os -import re -import struct -import sys -import warnings -from typing import IO, Dict, Iterator, NamedTuple, Optional, Tuple - - -# Python does not provide platform information at sufficient granularity to -# identify the architecture of the running executable in some cases, so we -# determine it dynamically by reading the information from the running -# process. This only applies on Linux, which uses the ELF format. -class _ELFFileHeader: - # https://en.wikipedia.org/wiki/Executable_and_Linkable_Format#File_header - class _InvalidELFFileHeader(ValueError): - """ - An invalid ELF file header was found. - """ - - ELF_MAGIC_NUMBER = 0x7F454C46 - ELFCLASS32 = 1 - ELFCLASS64 = 2 - ELFDATA2LSB = 1 - ELFDATA2MSB = 2 - EM_386 = 3 - EM_S390 = 22 - EM_ARM = 40 - EM_X86_64 = 62 - EF_ARM_ABIMASK = 0xFF000000 - EF_ARM_ABI_VER5 = 0x05000000 - EF_ARM_ABI_FLOAT_HARD = 0x00000400 - - def __init__(self, file: IO[bytes]) -> None: - def unpack(fmt: str) -> int: - try: - data = file.read(struct.calcsize(fmt)) - result: Tuple[int, ...] = struct.unpack(fmt, data) - except struct.error: - raise _ELFFileHeader._InvalidELFFileHeader() - return result[0] - - self.e_ident_magic = unpack(">I") - if self.e_ident_magic != self.ELF_MAGIC_NUMBER: - raise _ELFFileHeader._InvalidELFFileHeader() - self.e_ident_class = unpack("B") - if self.e_ident_class not in {self.ELFCLASS32, self.ELFCLASS64}: - raise _ELFFileHeader._InvalidELFFileHeader() - self.e_ident_data = unpack("B") - if self.e_ident_data not in {self.ELFDATA2LSB, self.ELFDATA2MSB}: - raise _ELFFileHeader._InvalidELFFileHeader() - self.e_ident_version = unpack("B") - self.e_ident_osabi = unpack("B") - self.e_ident_abiversion = unpack("B") - self.e_ident_pad = file.read(7) - format_h = "<H" if self.e_ident_data == self.ELFDATA2LSB else ">H" - format_i = "<I" if self.e_ident_data == self.ELFDATA2LSB else ">I" - format_q = "<Q" if self.e_ident_data == self.ELFDATA2LSB else ">Q" - format_p = format_i if self.e_ident_class == self.ELFCLASS32 else format_q - self.e_type = unpack(format_h) - self.e_machine = unpack(format_h) - self.e_version = unpack(format_i) - self.e_entry = unpack(format_p) - self.e_phoff = unpack(format_p) - self.e_shoff = unpack(format_p) - self.e_flags = unpack(format_i) - self.e_ehsize = unpack(format_h) - self.e_phentsize = unpack(format_h) - self.e_phnum = unpack(format_h) - self.e_shentsize = unpack(format_h) - self.e_shnum = unpack(format_h) - self.e_shstrndx = unpack(format_h) - - -def _get_elf_header() -> Optional[_ELFFileHeader]: - try: - with open(sys.executable, "rb") as f: - elf_header = _ELFFileHeader(f) - except (OSError, TypeError, _ELFFileHeader._InvalidELFFileHeader): - return None - return elf_header - - -def _is_linux_armhf() -> bool: - # hard-float ABI can be detected from the ELF header of the running - # process - # https://static.docs.arm.com/ihi0044/g/aaelf32.pdf - elf_header = _get_elf_header() - if elf_header is None: - return False - result = elf_header.e_ident_class == elf_header.ELFCLASS32 - result &= elf_header.e_ident_data == elf_header.ELFDATA2LSB - result &= elf_header.e_machine == elf_header.EM_ARM - result &= ( - elf_header.e_flags & elf_header.EF_ARM_ABIMASK - ) == elf_header.EF_ARM_ABI_VER5 - result &= ( - elf_header.e_flags & elf_header.EF_ARM_ABI_FLOAT_HARD - ) == elf_header.EF_ARM_ABI_FLOAT_HARD - return result - - -def _is_linux_i686() -> bool: - elf_header = _get_elf_header() - if elf_header is None: - return False - result = elf_header.e_ident_class == elf_header.ELFCLASS32 - result &= elf_header.e_ident_data == elf_header.ELFDATA2LSB - result &= elf_header.e_machine == elf_header.EM_386 - return result - - -def _have_compatible_abi(arch: str) -> bool: - if arch == "armv7l": - return _is_linux_armhf() - if arch == "i686": - return _is_linux_i686() - return arch in {"x86_64", "aarch64", "ppc64", "ppc64le", "s390x"} - - -# If glibc ever changes its major version, we need to know what the last -# minor version was, so we can build the complete list of all versions. -# For now, guess what the highest minor version might be, assume it will -# be 50 for testing. Once this actually happens, update the dictionary -# with the actual value. -_LAST_GLIBC_MINOR: Dict[int, int] = collections.defaultdict(lambda: 50) - - -class _GLibCVersion(NamedTuple): - major: int - minor: int - - -def _glibc_version_string_confstr() -> Optional[str]: - """ - Primary implementation of glibc_version_string using os.confstr. - """ - # os.confstr is quite a bit faster than ctypes.DLL. It's also less likely - # to be broken or missing. This strategy is used in the standard library - # platform module. - # https://github.com/python/cpython/blob/fcf1d003bf4f0100c/Lib/platform.py#L175-L183 - try: - # os.confstr("CS_GNU_LIBC_VERSION") returns a string like "glibc 2.17". - version_string = os.confstr("CS_GNU_LIBC_VERSION") - assert version_string is not None - _, version = version_string.split() - except (AssertionError, AttributeError, OSError, ValueError): - # os.confstr() or CS_GNU_LIBC_VERSION not available (or a bad value)... - return None - return version - - -def _glibc_version_string_ctypes() -> Optional[str]: - """ - Fallback implementation of glibc_version_string using ctypes. - """ - try: - import ctypes - except ImportError: - return None - - # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen - # manpage says, "If filename is NULL, then the returned handle is for the - # main program". This way we can let the linker do the work to figure out - # which libc our process is actually using. - # - # We must also handle the special case where the executable is not a - # dynamically linked executable. This can occur when using musl libc, - # for example. In this situation, dlopen() will error, leading to an - # OSError. Interestingly, at least in the case of musl, there is no - # errno set on the OSError. The single string argument used to construct - # OSError comes from libc itself and is therefore not portable to - # hard code here. In any case, failure to call dlopen() means we - # can proceed, so we bail on our attempt. - try: - process_namespace = ctypes.CDLL(None) - except OSError: - return None - - try: - gnu_get_libc_version = process_namespace.gnu_get_libc_version - except AttributeError: - # Symbol doesn't exist -> therefore, we are not linked to - # glibc. - return None - - # Call gnu_get_libc_version, which returns a string like "2.5" - gnu_get_libc_version.restype = ctypes.c_char_p - version_str: str = gnu_get_libc_version() - # py2 / py3 compatibility: - if not isinstance(version_str, str): - version_str = version_str.decode("ascii") - - return version_str - - -def _glibc_version_string() -> Optional[str]: - """Returns glibc version string, or None if not using glibc.""" - return _glibc_version_string_confstr() or _glibc_version_string_ctypes() - - -def _parse_glibc_version(version_str: str) -> Tuple[int, int]: - """Parse glibc version. - - We use a regexp instead of str.split because we want to discard any - random junk that might come after the minor version -- this might happen - in patched/forked versions of glibc (e.g. Linaro's version of glibc - uses version strings like "2.20-2014.11"). See gh-3588. - """ - m = re.match(r"(?P<major>[0-9]+)\.(?P<minor>[0-9]+)", version_str) - if not m: - warnings.warn( - "Expected glibc version with 2 components major.minor," - " got: %s" % version_str, - RuntimeWarning, - ) - return -1, -1 - return int(m.group("major")), int(m.group("minor")) - - -@functools.lru_cache() -def _get_glibc_version() -> Tuple[int, int]: - version_str = _glibc_version_string() - if version_str is None: - return (-1, -1) - return _parse_glibc_version(version_str) - - -# From PEP 513, PEP 600 -def _is_compatible(name: str, arch: str, version: _GLibCVersion) -> bool: - sys_glibc = _get_glibc_version() - if sys_glibc < version: - return False - # Check for presence of _manylinux module. - try: - import _manylinux # noqa - except ImportError: - return True - if hasattr(_manylinux, "manylinux_compatible"): - result = _manylinux.manylinux_compatible(version[0], version[1], arch) - if result is not None: - return bool(result) - return True - if version == _GLibCVersion(2, 5): - if hasattr(_manylinux, "manylinux1_compatible"): - return bool(_manylinux.manylinux1_compatible) - if version == _GLibCVersion(2, 12): - if hasattr(_manylinux, "manylinux2010_compatible"): - return bool(_manylinux.manylinux2010_compatible) - if version == _GLibCVersion(2, 17): - if hasattr(_manylinux, "manylinux2014_compatible"): - return bool(_manylinux.manylinux2014_compatible) - return True - - -_LEGACY_MANYLINUX_MAP = { - # CentOS 7 w/ glibc 2.17 (PEP 599) - (2, 17): "manylinux2014", - # CentOS 6 w/ glibc 2.12 (PEP 571) - (2, 12): "manylinux2010", - # CentOS 5 w/ glibc 2.5 (PEP 513) - (2, 5): "manylinux1", -} - - -def platform_tags(linux: str, arch: str) -> Iterator[str]: - if not _have_compatible_abi(arch): - return - # Oldest glibc to be supported regardless of architecture is (2, 17). - too_old_glibc2 = _GLibCVersion(2, 16) - if arch in {"x86_64", "i686"}: - # On x86/i686 also oldest glibc to be supported is (2, 5). - too_old_glibc2 = _GLibCVersion(2, 4) - current_glibc = _GLibCVersion(*_get_glibc_version()) - glibc_max_list = [current_glibc] - # We can assume compatibility across glibc major versions. - # https://sourceware.org/bugzilla/show_bug.cgi?id=24636 - # - # Build a list of maximum glibc versions so that we can - # output the canonical list of all glibc from current_glibc - # down to too_old_glibc2, including all intermediary versions. - for glibc_major in range(current_glibc.major - 1, 1, -1): - glibc_minor = _LAST_GLIBC_MINOR[glibc_major] - glibc_max_list.append(_GLibCVersion(glibc_major, glibc_minor)) - for glibc_max in glibc_max_list: - if glibc_max.major == too_old_glibc2.major: - min_minor = too_old_glibc2.minor - else: - # For other glibc major versions oldest supported is (x, 0). - min_minor = -1 - for glibc_minor in range(glibc_max.minor, min_minor, -1): - glibc_version = _GLibCVersion(glibc_max.major, glibc_minor) - tag = "manylinux_{}_{}".format(*glibc_version) - if _is_compatible(tag, arch, glibc_version): - yield linux.replace("linux", tag) - # Handle the legacy manylinux1, manylinux2010, manylinux2014 tags. - if glibc_version in _LEGACY_MANYLINUX_MAP: - legacy_tag = _LEGACY_MANYLINUX_MAP[glibc_version] - if _is_compatible(legacy_tag, arch, glibc_version): - yield linux.replace("linux", legacy_tag) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py b/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py deleted file mode 100644 index 8ac3059..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py +++ /dev/null @@ -1,136 +0,0 @@ -"""PEP 656 support. - -This module implements logic to detect if the currently running Python is -linked against musl, and what musl version is used. -""" - -import contextlib -import functools -import operator -import os -import re -import struct -import subprocess -import sys -from typing import IO, Iterator, NamedTuple, Optional, Tuple - - -def _read_unpacked(f: IO[bytes], fmt: str) -> Tuple[int, ...]: - return struct.unpack(fmt, f.read(struct.calcsize(fmt))) - - -def _parse_ld_musl_from_elf(f: IO[bytes]) -> Optional[str]: - """Detect musl libc location by parsing the Python executable. - - Based on: https://gist.github.com/lyssdod/f51579ae8d93c8657a5564aefc2ffbca - ELF header: https://refspecs.linuxfoundation.org/elf/gabi4+/ch4.eheader.html - """ - f.seek(0) - try: - ident = _read_unpacked(f, "16B") - except struct.error: - return None - if ident[:4] != tuple(b"\x7fELF"): # Invalid magic, not ELF. - return None - f.seek(struct.calcsize("HHI"), 1) # Skip file type, machine, and version. - - try: - # e_fmt: Format for program header. - # p_fmt: Format for section header. - # p_idx: Indexes to find p_type, p_offset, and p_filesz. - e_fmt, p_fmt, p_idx = { - 1: ("IIIIHHH", "IIIIIIII", (0, 1, 4)), # 32-bit. - 2: ("QQQIHHH", "IIQQQQQQ", (0, 2, 5)), # 64-bit. - }[ident[4]] - except KeyError: - return None - else: - p_get = operator.itemgetter(*p_idx) - - # Find the interpreter section and return its content. - try: - _, e_phoff, _, _, _, e_phentsize, e_phnum = _read_unpacked(f, e_fmt) - except struct.error: - return None - for i in range(e_phnum + 1): - f.seek(e_phoff + e_phentsize * i) - try: - p_type, p_offset, p_filesz = p_get(_read_unpacked(f, p_fmt)) - except struct.error: - return None - if p_type != 3: # Not PT_INTERP. - continue - f.seek(p_offset) - interpreter = os.fsdecode(f.read(p_filesz)).strip("\0") - if "musl" not in interpreter: - return None - return interpreter - return None - - -class _MuslVersion(NamedTuple): - major: int - minor: int - - -def _parse_musl_version(output: str) -> Optional[_MuslVersion]: - lines = [n for n in (n.strip() for n in output.splitlines()) if n] - if len(lines) < 2 or lines[0][:4] != "musl": - return None - m = re.match(r"Version (\d+)\.(\d+)", lines[1]) - if not m: - return None - return _MuslVersion(major=int(m.group(1)), minor=int(m.group(2))) - - -@functools.lru_cache() -def _get_musl_version(executable: str) -> Optional[_MuslVersion]: - """Detect currently-running musl runtime version. - - This is done by checking the specified executable's dynamic linking - information, and invoking the loader to parse its output for a version - string. If the loader is musl, the output would be something like:: - - musl libc (x86_64) - Version 1.2.2 - Dynamic Program Loader - """ - with contextlib.ExitStack() as stack: - try: - f = stack.enter_context(open(executable, "rb")) - except OSError: - return None - ld = _parse_ld_musl_from_elf(f) - if not ld: - return None - proc = subprocess.run([ld], stderr=subprocess.PIPE, universal_newlines=True) - return _parse_musl_version(proc.stderr) - - -def platform_tags(arch: str) -> Iterator[str]: - """Generate musllinux tags compatible to the current platform. - - :param arch: Should be the part of platform tag after the ``linux_`` - prefix, e.g. ``x86_64``. The ``linux_`` prefix is assumed as a - prerequisite for the current platform to be musllinux-compatible. - - :returns: An iterator of compatible musllinux tags. - """ - sys_musl = _get_musl_version(sys.executable) - if sys_musl is None: # Python not dynamically linked against musl. - return - for minor in range(sys_musl.minor, -1, -1): - yield f"musllinux_{sys_musl.major}_{minor}_{arch}" - - -if __name__ == "__main__": # pragma: no cover - import sysconfig - - plat = sysconfig.get_platform() - assert plat.startswith("linux-"), "not linux" - - print("plat:", plat) - print("musl:", _get_musl_version(sys.executable)) - print("tags:", end=" ") - for t in platform_tags(re.sub(r"[.-]", "_", plat.split("-", 1)[-1])): - print(t, end="\n ") diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_structures.py b/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_structures.py deleted file mode 100644 index 90a6465..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_structures.py +++ /dev/null @@ -1,61 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. - - -class InfinityType: - def __repr__(self) -> str: - return "Infinity" - - def __hash__(self) -> int: - return hash(repr(self)) - - def __lt__(self, other: object) -> bool: - return False - - def __le__(self, other: object) -> bool: - return False - - def __eq__(self, other: object) -> bool: - return isinstance(other, self.__class__) - - def __gt__(self, other: object) -> bool: - return True - - def __ge__(self, other: object) -> bool: - return True - - def __neg__(self: object) -> "NegativeInfinityType": - return NegativeInfinity - - -Infinity = InfinityType() - - -class NegativeInfinityType: - def __repr__(self) -> str: - return "-Infinity" - - def __hash__(self) -> int: - return hash(repr(self)) - - def __lt__(self, other: object) -> bool: - return True - - def __le__(self, other: object) -> bool: - return True - - def __eq__(self, other: object) -> bool: - return isinstance(other, self.__class__) - - def __gt__(self, other: object) -> bool: - return False - - def __ge__(self, other: object) -> bool: - return False - - def __neg__(self: object) -> InfinityType: - return Infinity - - -NegativeInfinity = NegativeInfinityType() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py b/venv/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py deleted file mode 100644 index 540e7a4..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py +++ /dev/null @@ -1,304 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. - -import operator -import os -import platform -import sys -from typing import Any, Callable, Dict, List, Optional, Tuple, Union - -from pip._vendor.pyparsing import ( # noqa: N817 - Forward, - Group, - Literal as L, - ParseException, - ParseResults, - QuotedString, - ZeroOrMore, - stringEnd, - stringStart, -) - -from .specifiers import InvalidSpecifier, Specifier - -__all__ = [ - "InvalidMarker", - "UndefinedComparison", - "UndefinedEnvironmentName", - "Marker", - "default_environment", -] - -Operator = Callable[[str, str], bool] - - -class InvalidMarker(ValueError): - """ - An invalid marker was found, users should refer to PEP 508. - """ - - -class UndefinedComparison(ValueError): - """ - An invalid operation was attempted on a value that doesn't support it. - """ - - -class UndefinedEnvironmentName(ValueError): - """ - A name was attempted to be used that does not exist inside of the - environment. - """ - - -class Node: - def __init__(self, value: Any) -> None: - self.value = value - - def __str__(self) -> str: - return str(self.value) - - def __repr__(self) -> str: - return f"<{self.__class__.__name__}('{self}')>" - - def serialize(self) -> str: - raise NotImplementedError - - -class Variable(Node): - def serialize(self) -> str: - return str(self) - - -class Value(Node): - def serialize(self) -> str: - return f'"{self}"' - - -class Op(Node): - def serialize(self) -> str: - return str(self) - - -VARIABLE = ( - L("implementation_version") - | L("platform_python_implementation") - | L("implementation_name") - | L("python_full_version") - | L("platform_release") - | L("platform_version") - | L("platform_machine") - | L("platform_system") - | L("python_version") - | L("sys_platform") - | L("os_name") - | L("os.name") # PEP-345 - | L("sys.platform") # PEP-345 - | L("platform.version") # PEP-345 - | L("platform.machine") # PEP-345 - | L("platform.python_implementation") # PEP-345 - | L("python_implementation") # undocumented setuptools legacy - | L("extra") # PEP-508 -) -ALIASES = { - "os.name": "os_name", - "sys.platform": "sys_platform", - "platform.version": "platform_version", - "platform.machine": "platform_machine", - "platform.python_implementation": "platform_python_implementation", - "python_implementation": "platform_python_implementation", -} -VARIABLE.setParseAction(lambda s, l, t: Variable(ALIASES.get(t[0], t[0]))) - -VERSION_CMP = ( - L("===") | L("==") | L(">=") | L("<=") | L("!=") | L("~=") | L(">") | L("<") -) - -MARKER_OP = VERSION_CMP | L("not in") | L("in") -MARKER_OP.setParseAction(lambda s, l, t: Op(t[0])) - -MARKER_VALUE = QuotedString("'") | QuotedString('"') -MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0])) - -BOOLOP = L("and") | L("or") - -MARKER_VAR = VARIABLE | MARKER_VALUE - -MARKER_ITEM = Group(MARKER_VAR + MARKER_OP + MARKER_VAR) -MARKER_ITEM.setParseAction(lambda s, l, t: tuple(t[0])) - -LPAREN = L("(").suppress() -RPAREN = L(")").suppress() - -MARKER_EXPR = Forward() -MARKER_ATOM = MARKER_ITEM | Group(LPAREN + MARKER_EXPR + RPAREN) -MARKER_EXPR << MARKER_ATOM + ZeroOrMore(BOOLOP + MARKER_EXPR) - -MARKER = stringStart + MARKER_EXPR + stringEnd - - -def _coerce_parse_result(results: Union[ParseResults, List[Any]]) -> List[Any]: - if isinstance(results, ParseResults): - return [_coerce_parse_result(i) for i in results] - else: - return results - - -def _format_marker( - marker: Union[List[str], Tuple[Node, ...], str], first: Optional[bool] = True -) -> str: - - assert isinstance(marker, (list, tuple, str)) - - # Sometimes we have a structure like [[...]] which is a single item list - # where the single item is itself it's own list. In that case we want skip - # the rest of this function so that we don't get extraneous () on the - # outside. - if ( - isinstance(marker, list) - and len(marker) == 1 - and isinstance(marker[0], (list, tuple)) - ): - return _format_marker(marker[0]) - - if isinstance(marker, list): - inner = (_format_marker(m, first=False) for m in marker) - if first: - return " ".join(inner) - else: - return "(" + " ".join(inner) + ")" - elif isinstance(marker, tuple): - return " ".join([m.serialize() for m in marker]) - else: - return marker - - -_operators: Dict[str, Operator] = { - "in": lambda lhs, rhs: lhs in rhs, - "not in": lambda lhs, rhs: lhs not in rhs, - "<": operator.lt, - "<=": operator.le, - "==": operator.eq, - "!=": operator.ne, - ">=": operator.ge, - ">": operator.gt, -} - - -def _eval_op(lhs: str, op: Op, rhs: str) -> bool: - try: - spec = Specifier("".join([op.serialize(), rhs])) - except InvalidSpecifier: - pass - else: - return spec.contains(lhs) - - oper: Optional[Operator] = _operators.get(op.serialize()) - if oper is None: - raise UndefinedComparison(f"Undefined {op!r} on {lhs!r} and {rhs!r}.") - - return oper(lhs, rhs) - - -class Undefined: - pass - - -_undefined = Undefined() - - -def _get_env(environment: Dict[str, str], name: str) -> str: - value: Union[str, Undefined] = environment.get(name, _undefined) - - if isinstance(value, Undefined): - raise UndefinedEnvironmentName( - f"{name!r} does not exist in evaluation environment." - ) - - return value - - -def _evaluate_markers(markers: List[Any], environment: Dict[str, str]) -> bool: - groups: List[List[bool]] = [[]] - - for marker in markers: - assert isinstance(marker, (list, tuple, str)) - - if isinstance(marker, list): - groups[-1].append(_evaluate_markers(marker, environment)) - elif isinstance(marker, tuple): - lhs, op, rhs = marker - - if isinstance(lhs, Variable): - lhs_value = _get_env(environment, lhs.value) - rhs_value = rhs.value - else: - lhs_value = lhs.value - rhs_value = _get_env(environment, rhs.value) - - groups[-1].append(_eval_op(lhs_value, op, rhs_value)) - else: - assert marker in ["and", "or"] - if marker == "or": - groups.append([]) - - return any(all(item) for item in groups) - - -def format_full_version(info: "sys._version_info") -> str: - version = "{0.major}.{0.minor}.{0.micro}".format(info) - kind = info.releaselevel - if kind != "final": - version += kind[0] + str(info.serial) - return version - - -def default_environment() -> Dict[str, str]: - iver = format_full_version(sys.implementation.version) - implementation_name = sys.implementation.name - return { - "implementation_name": implementation_name, - "implementation_version": iver, - "os_name": os.name, - "platform_machine": platform.machine(), - "platform_release": platform.release(), - "platform_system": platform.system(), - "platform_version": platform.version(), - "python_full_version": platform.python_version(), - "platform_python_implementation": platform.python_implementation(), - "python_version": ".".join(platform.python_version_tuple()[:2]), - "sys_platform": sys.platform, - } - - -class Marker: - def __init__(self, marker: str) -> None: - try: - self._markers = _coerce_parse_result(MARKER.parseString(marker)) - except ParseException as e: - raise InvalidMarker( - f"Invalid marker: {marker!r}, parse error at " - f"{marker[e.loc : e.loc + 8]!r}" - ) - - def __str__(self) -> str: - return _format_marker(self._markers) - - def __repr__(self) -> str: - return f"<Marker('{self}')>" - - def evaluate(self, environment: Optional[Dict[str, str]] = None) -> bool: - """Evaluate a marker. - - Return the boolean from evaluating the given marker against the - environment. environment is an optional argument to override all or - part of the determined environment. - - The environment is determined from the current Python process. - """ - current_environment = default_environment() - if environment is not None: - current_environment.update(environment) - - return _evaluate_markers(self._markers, current_environment) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/packaging/requirements.py b/venv/lib/python3.12/site-packages/pip/_vendor/packaging/requirements.py deleted file mode 100644 index 1eab7dd..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/packaging/requirements.py +++ /dev/null @@ -1,146 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. - -import re -import string -import urllib.parse -from typing import List, Optional as TOptional, Set - -from pip._vendor.pyparsing import ( # noqa - Combine, - Literal as L, - Optional, - ParseException, - Regex, - Word, - ZeroOrMore, - originalTextFor, - stringEnd, - stringStart, -) - -from .markers import MARKER_EXPR, Marker -from .specifiers import LegacySpecifier, Specifier, SpecifierSet - - -class InvalidRequirement(ValueError): - """ - An invalid requirement was found, users should refer to PEP 508. - """ - - -ALPHANUM = Word(string.ascii_letters + string.digits) - -LBRACKET = L("[").suppress() -RBRACKET = L("]").suppress() -LPAREN = L("(").suppress() -RPAREN = L(")").suppress() -COMMA = L(",").suppress() -SEMICOLON = L(";").suppress() -AT = L("@").suppress() - -PUNCTUATION = Word("-_.") -IDENTIFIER_END = ALPHANUM | (ZeroOrMore(PUNCTUATION) + ALPHANUM) -IDENTIFIER = Combine(ALPHANUM + ZeroOrMore(IDENTIFIER_END)) - -NAME = IDENTIFIER("name") -EXTRA = IDENTIFIER - -URI = Regex(r"[^ ]+")("url") -URL = AT + URI - -EXTRAS_LIST = EXTRA + ZeroOrMore(COMMA + EXTRA) -EXTRAS = (LBRACKET + Optional(EXTRAS_LIST) + RBRACKET)("extras") - -VERSION_PEP440 = Regex(Specifier._regex_str, re.VERBOSE | re.IGNORECASE) -VERSION_LEGACY = Regex(LegacySpecifier._regex_str, re.VERBOSE | re.IGNORECASE) - -VERSION_ONE = VERSION_PEP440 ^ VERSION_LEGACY -VERSION_MANY = Combine( - VERSION_ONE + ZeroOrMore(COMMA + VERSION_ONE), joinString=",", adjacent=False -)("_raw_spec") -_VERSION_SPEC = Optional((LPAREN + VERSION_MANY + RPAREN) | VERSION_MANY) -_VERSION_SPEC.setParseAction(lambda s, l, t: t._raw_spec or "") - -VERSION_SPEC = originalTextFor(_VERSION_SPEC)("specifier") -VERSION_SPEC.setParseAction(lambda s, l, t: t[1]) - -MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker") -MARKER_EXPR.setParseAction( - lambda s, l, t: Marker(s[t._original_start : t._original_end]) -) -MARKER_SEPARATOR = SEMICOLON -MARKER = MARKER_SEPARATOR + MARKER_EXPR - -VERSION_AND_MARKER = VERSION_SPEC + Optional(MARKER) -URL_AND_MARKER = URL + Optional(MARKER) - -NAMED_REQUIREMENT = NAME + Optional(EXTRAS) + (URL_AND_MARKER | VERSION_AND_MARKER) - -REQUIREMENT = stringStart + NAMED_REQUIREMENT + stringEnd -# pyparsing isn't thread safe during initialization, so we do it eagerly, see -# issue #104 -REQUIREMENT.parseString("x[]") - - -class Requirement: - """Parse a requirement. - - Parse a given requirement string into its parts, such as name, specifier, - URL, and extras. Raises InvalidRequirement on a badly-formed requirement - string. - """ - - # TODO: Can we test whether something is contained within a requirement? - # If so how do we do that? Do we need to test against the _name_ of - # the thing as well as the version? What about the markers? - # TODO: Can we normalize the name and extra name? - - def __init__(self, requirement_string: str) -> None: - try: - req = REQUIREMENT.parseString(requirement_string) - except ParseException as e: - raise InvalidRequirement( - f'Parse error at "{ requirement_string[e.loc : e.loc + 8]!r}": {e.msg}' - ) - - self.name: str = req.name - if req.url: - parsed_url = urllib.parse.urlparse(req.url) - if parsed_url.scheme == "file": - if urllib.parse.urlunparse(parsed_url) != req.url: - raise InvalidRequirement("Invalid URL given") - elif not (parsed_url.scheme and parsed_url.netloc) or ( - not parsed_url.scheme and not parsed_url.netloc - ): - raise InvalidRequirement(f"Invalid URL: {req.url}") - self.url: TOptional[str] = req.url - else: - self.url = None - self.extras: Set[str] = set(req.extras.asList() if req.extras else []) - self.specifier: SpecifierSet = SpecifierSet(req.specifier) - self.marker: TOptional[Marker] = req.marker if req.marker else None - - def __str__(self) -> str: - parts: List[str] = [self.name] - - if self.extras: - formatted_extras = ",".join(sorted(self.extras)) - parts.append(f"[{formatted_extras}]") - - if self.specifier: - parts.append(str(self.specifier)) - - if self.url: - parts.append(f"@ {self.url}") - if self.marker: - parts.append(" ") - - if self.marker: - parts.append(f"; {self.marker}") - - return "".join(parts) - - def __repr__(self) -> str: - return f"<Requirement('{self}')>" diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/packaging/specifiers.py b/venv/lib/python3.12/site-packages/pip/_vendor/packaging/specifiers.py deleted file mode 100644 index 0e218a6..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/packaging/specifiers.py +++ /dev/null @@ -1,802 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. - -import abc -import functools -import itertools -import re -import warnings -from typing import ( - Callable, - Dict, - Iterable, - Iterator, - List, - Optional, - Pattern, - Set, - Tuple, - TypeVar, - Union, -) - -from .utils import canonicalize_version -from .version import LegacyVersion, Version, parse - -ParsedVersion = Union[Version, LegacyVersion] -UnparsedVersion = Union[Version, LegacyVersion, str] -VersionTypeVar = TypeVar("VersionTypeVar", bound=UnparsedVersion) -CallableOperator = Callable[[ParsedVersion, str], bool] - - -class InvalidSpecifier(ValueError): - """ - An invalid specifier was found, users should refer to PEP 440. - """ - - -class BaseSpecifier(metaclass=abc.ABCMeta): - @abc.abstractmethod - def __str__(self) -> str: - """ - Returns the str representation of this Specifier like object. This - should be representative of the Specifier itself. - """ - - @abc.abstractmethod - def __hash__(self) -> int: - """ - Returns a hash value for this Specifier like object. - """ - - @abc.abstractmethod - def __eq__(self, other: object) -> bool: - """ - Returns a boolean representing whether or not the two Specifier like - objects are equal. - """ - - @abc.abstractproperty - def prereleases(self) -> Optional[bool]: - """ - Returns whether or not pre-releases as a whole are allowed by this - specifier. - """ - - @prereleases.setter - def prereleases(self, value: bool) -> None: - """ - Sets whether or not pre-releases as a whole are allowed by this - specifier. - """ - - @abc.abstractmethod - def contains(self, item: str, prereleases: Optional[bool] = None) -> bool: - """ - Determines if the given item is contained within this specifier. - """ - - @abc.abstractmethod - def filter( - self, iterable: Iterable[VersionTypeVar], prereleases: Optional[bool] = None - ) -> Iterable[VersionTypeVar]: - """ - Takes an iterable of items and filters them so that only items which - are contained within this specifier are allowed in it. - """ - - -class _IndividualSpecifier(BaseSpecifier): - - _operators: Dict[str, str] = {} - _regex: Pattern[str] - - def __init__(self, spec: str = "", prereleases: Optional[bool] = None) -> None: - match = self._regex.search(spec) - if not match: - raise InvalidSpecifier(f"Invalid specifier: '{spec}'") - - self._spec: Tuple[str, str] = ( - match.group("operator").strip(), - match.group("version").strip(), - ) - - # Store whether or not this Specifier should accept prereleases - self._prereleases = prereleases - - def __repr__(self) -> str: - pre = ( - f", prereleases={self.prereleases!r}" - if self._prereleases is not None - else "" - ) - - return f"<{self.__class__.__name__}({str(self)!r}{pre})>" - - def __str__(self) -> str: - return "{}{}".format(*self._spec) - - @property - def _canonical_spec(self) -> Tuple[str, str]: - return self._spec[0], canonicalize_version(self._spec[1]) - - def __hash__(self) -> int: - return hash(self._canonical_spec) - - def __eq__(self, other: object) -> bool: - if isinstance(other, str): - try: - other = self.__class__(str(other)) - except InvalidSpecifier: - return NotImplemented - elif not isinstance(other, self.__class__): - return NotImplemented - - return self._canonical_spec == other._canonical_spec - - def _get_operator(self, op: str) -> CallableOperator: - operator_callable: CallableOperator = getattr( - self, f"_compare_{self._operators[op]}" - ) - return operator_callable - - def _coerce_version(self, version: UnparsedVersion) -> ParsedVersion: - if not isinstance(version, (LegacyVersion, Version)): - version = parse(version) - return version - - @property - def operator(self) -> str: - return self._spec[0] - - @property - def version(self) -> str: - return self._spec[1] - - @property - def prereleases(self) -> Optional[bool]: - return self._prereleases - - @prereleases.setter - def prereleases(self, value: bool) -> None: - self._prereleases = value - - def __contains__(self, item: str) -> bool: - return self.contains(item) - - def contains( - self, item: UnparsedVersion, prereleases: Optional[bool] = None - ) -> bool: - - # Determine if prereleases are to be allowed or not. - if prereleases is None: - prereleases = self.prereleases - - # Normalize item to a Version or LegacyVersion, this allows us to have - # a shortcut for ``"2.0" in Specifier(">=2") - normalized_item = self._coerce_version(item) - - # Determine if we should be supporting prereleases in this specifier - # or not, if we do not support prereleases than we can short circuit - # logic if this version is a prereleases. - if normalized_item.is_prerelease and not prereleases: - return False - - # Actually do the comparison to determine if this item is contained - # within this Specifier or not. - operator_callable: CallableOperator = self._get_operator(self.operator) - return operator_callable(normalized_item, self.version) - - def filter( - self, iterable: Iterable[VersionTypeVar], prereleases: Optional[bool] = None - ) -> Iterable[VersionTypeVar]: - - yielded = False - found_prereleases = [] - - kw = {"prereleases": prereleases if prereleases is not None else True} - - # Attempt to iterate over all the values in the iterable and if any of - # them match, yield them. - for version in iterable: - parsed_version = self._coerce_version(version) - - if self.contains(parsed_version, **kw): - # If our version is a prerelease, and we were not set to allow - # prereleases, then we'll store it for later in case nothing - # else matches this specifier. - if parsed_version.is_prerelease and not ( - prereleases or self.prereleases - ): - found_prereleases.append(version) - # Either this is not a prerelease, or we should have been - # accepting prereleases from the beginning. - else: - yielded = True - yield version - - # Now that we've iterated over everything, determine if we've yielded - # any values, and if we have not and we have any prereleases stored up - # then we will go ahead and yield the prereleases. - if not yielded and found_prereleases: - for version in found_prereleases: - yield version - - -class LegacySpecifier(_IndividualSpecifier): - - _regex_str = r""" - (?P<operator>(==|!=|<=|>=|<|>)) - \s* - (?P<version> - [^,;\s)]* # Since this is a "legacy" specifier, and the version - # string can be just about anything, we match everything - # except for whitespace, a semi-colon for marker support, - # a closing paren since versions can be enclosed in - # them, and a comma since it's a version separator. - ) - """ - - _regex = re.compile(r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) - - _operators = { - "==": "equal", - "!=": "not_equal", - "<=": "less_than_equal", - ">=": "greater_than_equal", - "<": "less_than", - ">": "greater_than", - } - - def __init__(self, spec: str = "", prereleases: Optional[bool] = None) -> None: - super().__init__(spec, prereleases) - - warnings.warn( - "Creating a LegacyVersion has been deprecated and will be " - "removed in the next major release", - DeprecationWarning, - ) - - def _coerce_version(self, version: UnparsedVersion) -> LegacyVersion: - if not isinstance(version, LegacyVersion): - version = LegacyVersion(str(version)) - return version - - def _compare_equal(self, prospective: LegacyVersion, spec: str) -> bool: - return prospective == self._coerce_version(spec) - - def _compare_not_equal(self, prospective: LegacyVersion, spec: str) -> bool: - return prospective != self._coerce_version(spec) - - def _compare_less_than_equal(self, prospective: LegacyVersion, spec: str) -> bool: - return prospective <= self._coerce_version(spec) - - def _compare_greater_than_equal( - self, prospective: LegacyVersion, spec: str - ) -> bool: - return prospective >= self._coerce_version(spec) - - def _compare_less_than(self, prospective: LegacyVersion, spec: str) -> bool: - return prospective < self._coerce_version(spec) - - def _compare_greater_than(self, prospective: LegacyVersion, spec: str) -> bool: - return prospective > self._coerce_version(spec) - - -def _require_version_compare( - fn: Callable[["Specifier", ParsedVersion, str], bool] -) -> Callable[["Specifier", ParsedVersion, str], bool]: - @functools.wraps(fn) - def wrapped(self: "Specifier", prospective: ParsedVersion, spec: str) -> bool: - if not isinstance(prospective, Version): - return False - return fn(self, prospective, spec) - - return wrapped - - -class Specifier(_IndividualSpecifier): - - _regex_str = r""" - (?P<operator>(~=|==|!=|<=|>=|<|>|===)) - (?P<version> - (?: - # The identity operators allow for an escape hatch that will - # do an exact string match of the version you wish to install. - # This will not be parsed by PEP 440 and we cannot determine - # any semantic meaning from it. This operator is discouraged - # but included entirely as an escape hatch. - (?<====) # Only match for the identity operator - \s* - [^\s]* # We just match everything, except for whitespace - # since we are only testing for strict identity. - ) - | - (?: - # The (non)equality operators allow for wild card and local - # versions to be specified so we have to define these two - # operators separately to enable that. - (?<===|!=) # Only match for equals and not equals - - \s* - v? - (?:[0-9]+!)? # epoch - [0-9]+(?:\.[0-9]+)* # release - (?: # pre release - [-_\.]? - (a|b|c|rc|alpha|beta|pre|preview) - [-_\.]? - [0-9]* - )? - (?: # post release - (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) - )? - - # You cannot use a wild card and a dev or local version - # together so group them with a | and make them optional. - (?: - (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release - (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local - | - \.\* # Wild card syntax of .* - )? - ) - | - (?: - # The compatible operator requires at least two digits in the - # release segment. - (?<=~=) # Only match for the compatible operator - - \s* - v? - (?:[0-9]+!)? # epoch - [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) - (?: # pre release - [-_\.]? - (a|b|c|rc|alpha|beta|pre|preview) - [-_\.]? - [0-9]* - )? - (?: # post release - (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) - )? - (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release - ) - | - (?: - # All other operators only allow a sub set of what the - # (non)equality operators do. Specifically they do not allow - # local versions to be specified nor do they allow the prefix - # matching wild cards. - (?<!==|!=|~=) # We have special cases for these - # operators so we want to make sure they - # don't match here. - - \s* - v? - (?:[0-9]+!)? # epoch - [0-9]+(?:\.[0-9]+)* # release - (?: # pre release - [-_\.]? - (a|b|c|rc|alpha|beta|pre|preview) - [-_\.]? - [0-9]* - )? - (?: # post release - (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) - )? - (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release - ) - ) - """ - - _regex = re.compile(r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) - - _operators = { - "~=": "compatible", - "==": "equal", - "!=": "not_equal", - "<=": "less_than_equal", - ">=": "greater_than_equal", - "<": "less_than", - ">": "greater_than", - "===": "arbitrary", - } - - @_require_version_compare - def _compare_compatible(self, prospective: ParsedVersion, spec: str) -> bool: - - # Compatible releases have an equivalent combination of >= and ==. That - # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to - # implement this in terms of the other specifiers instead of - # implementing it ourselves. The only thing we need to do is construct - # the other specifiers. - - # We want everything but the last item in the version, but we want to - # ignore suffix segments. - prefix = ".".join( - list(itertools.takewhile(_is_not_suffix, _version_split(spec)))[:-1] - ) - - # Add the prefix notation to the end of our string - prefix += ".*" - - return self._get_operator(">=")(prospective, spec) and self._get_operator("==")( - prospective, prefix - ) - - @_require_version_compare - def _compare_equal(self, prospective: ParsedVersion, spec: str) -> bool: - - # We need special logic to handle prefix matching - if spec.endswith(".*"): - # In the case of prefix matching we want to ignore local segment. - prospective = Version(prospective.public) - # Split the spec out by dots, and pretend that there is an implicit - # dot in between a release segment and a pre-release segment. - split_spec = _version_split(spec[:-2]) # Remove the trailing .* - - # Split the prospective version out by dots, and pretend that there - # is an implicit dot in between a release segment and a pre-release - # segment. - split_prospective = _version_split(str(prospective)) - - # Shorten the prospective version to be the same length as the spec - # so that we can determine if the specifier is a prefix of the - # prospective version or not. - shortened_prospective = split_prospective[: len(split_spec)] - - # Pad out our two sides with zeros so that they both equal the same - # length. - padded_spec, padded_prospective = _pad_version( - split_spec, shortened_prospective - ) - - return padded_prospective == padded_spec - else: - # Convert our spec string into a Version - spec_version = Version(spec) - - # If the specifier does not have a local segment, then we want to - # act as if the prospective version also does not have a local - # segment. - if not spec_version.local: - prospective = Version(prospective.public) - - return prospective == spec_version - - @_require_version_compare - def _compare_not_equal(self, prospective: ParsedVersion, spec: str) -> bool: - return not self._compare_equal(prospective, spec) - - @_require_version_compare - def _compare_less_than_equal(self, prospective: ParsedVersion, spec: str) -> bool: - - # NB: Local version identifiers are NOT permitted in the version - # specifier, so local version labels can be universally removed from - # the prospective version. - return Version(prospective.public) <= Version(spec) - - @_require_version_compare - def _compare_greater_than_equal( - self, prospective: ParsedVersion, spec: str - ) -> bool: - - # NB: Local version identifiers are NOT permitted in the version - # specifier, so local version labels can be universally removed from - # the prospective version. - return Version(prospective.public) >= Version(spec) - - @_require_version_compare - def _compare_less_than(self, prospective: ParsedVersion, spec_str: str) -> bool: - - # Convert our spec to a Version instance, since we'll want to work with - # it as a version. - spec = Version(spec_str) - - # Check to see if the prospective version is less than the spec - # version. If it's not we can short circuit and just return False now - # instead of doing extra unneeded work. - if not prospective < spec: - return False - - # This special case is here so that, unless the specifier itself - # includes is a pre-release version, that we do not accept pre-release - # versions for the version mentioned in the specifier (e.g. <3.1 should - # not match 3.1.dev0, but should match 3.0.dev0). - if not spec.is_prerelease and prospective.is_prerelease: - if Version(prospective.base_version) == Version(spec.base_version): - return False - - # If we've gotten to here, it means that prospective version is both - # less than the spec version *and* it's not a pre-release of the same - # version in the spec. - return True - - @_require_version_compare - def _compare_greater_than(self, prospective: ParsedVersion, spec_str: str) -> bool: - - # Convert our spec to a Version instance, since we'll want to work with - # it as a version. - spec = Version(spec_str) - - # Check to see if the prospective version is greater than the spec - # version. If it's not we can short circuit and just return False now - # instead of doing extra unneeded work. - if not prospective > spec: - return False - - # This special case is here so that, unless the specifier itself - # includes is a post-release version, that we do not accept - # post-release versions for the version mentioned in the specifier - # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0). - if not spec.is_postrelease and prospective.is_postrelease: - if Version(prospective.base_version) == Version(spec.base_version): - return False - - # Ensure that we do not allow a local version of the version mentioned - # in the specifier, which is technically greater than, to match. - if prospective.local is not None: - if Version(prospective.base_version) == Version(spec.base_version): - return False - - # If we've gotten to here, it means that prospective version is both - # greater than the spec version *and* it's not a pre-release of the - # same version in the spec. - return True - - def _compare_arbitrary(self, prospective: Version, spec: str) -> bool: - return str(prospective).lower() == str(spec).lower() - - @property - def prereleases(self) -> bool: - - # If there is an explicit prereleases set for this, then we'll just - # blindly use that. - if self._prereleases is not None: - return self._prereleases - - # Look at all of our specifiers and determine if they are inclusive - # operators, and if they are if they are including an explicit - # prerelease. - operator, version = self._spec - if operator in ["==", ">=", "<=", "~=", "==="]: - # The == specifier can include a trailing .*, if it does we - # want to remove before parsing. - if operator == "==" and version.endswith(".*"): - version = version[:-2] - - # Parse the version, and if it is a pre-release than this - # specifier allows pre-releases. - if parse(version).is_prerelease: - return True - - return False - - @prereleases.setter - def prereleases(self, value: bool) -> None: - self._prereleases = value - - -_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$") - - -def _version_split(version: str) -> List[str]: - result: List[str] = [] - for item in version.split("."): - match = _prefix_regex.search(item) - if match: - result.extend(match.groups()) - else: - result.append(item) - return result - - -def _is_not_suffix(segment: str) -> bool: - return not any( - segment.startswith(prefix) for prefix in ("dev", "a", "b", "rc", "post") - ) - - -def _pad_version(left: List[str], right: List[str]) -> Tuple[List[str], List[str]]: - left_split, right_split = [], [] - - # Get the release segment of our versions - left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left))) - right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right))) - - # Get the rest of our versions - left_split.append(left[len(left_split[0]) :]) - right_split.append(right[len(right_split[0]) :]) - - # Insert our padding - left_split.insert(1, ["0"] * max(0, len(right_split[0]) - len(left_split[0]))) - right_split.insert(1, ["0"] * max(0, len(left_split[0]) - len(right_split[0]))) - - return (list(itertools.chain(*left_split)), list(itertools.chain(*right_split))) - - -class SpecifierSet(BaseSpecifier): - def __init__( - self, specifiers: str = "", prereleases: Optional[bool] = None - ) -> None: - - # Split on , to break each individual specifier into it's own item, and - # strip each item to remove leading/trailing whitespace. - split_specifiers = [s.strip() for s in specifiers.split(",") if s.strip()] - - # Parsed each individual specifier, attempting first to make it a - # Specifier and falling back to a LegacySpecifier. - parsed: Set[_IndividualSpecifier] = set() - for specifier in split_specifiers: - try: - parsed.add(Specifier(specifier)) - except InvalidSpecifier: - parsed.add(LegacySpecifier(specifier)) - - # Turn our parsed specifiers into a frozen set and save them for later. - self._specs = frozenset(parsed) - - # Store our prereleases value so we can use it later to determine if - # we accept prereleases or not. - self._prereleases = prereleases - - def __repr__(self) -> str: - pre = ( - f", prereleases={self.prereleases!r}" - if self._prereleases is not None - else "" - ) - - return f"<SpecifierSet({str(self)!r}{pre})>" - - def __str__(self) -> str: - return ",".join(sorted(str(s) for s in self._specs)) - - def __hash__(self) -> int: - return hash(self._specs) - - def __and__(self, other: Union["SpecifierSet", str]) -> "SpecifierSet": - if isinstance(other, str): - other = SpecifierSet(other) - elif not isinstance(other, SpecifierSet): - return NotImplemented - - specifier = SpecifierSet() - specifier._specs = frozenset(self._specs | other._specs) - - if self._prereleases is None and other._prereleases is not None: - specifier._prereleases = other._prereleases - elif self._prereleases is not None and other._prereleases is None: - specifier._prereleases = self._prereleases - elif self._prereleases == other._prereleases: - specifier._prereleases = self._prereleases - else: - raise ValueError( - "Cannot combine SpecifierSets with True and False prerelease " - "overrides." - ) - - return specifier - - def __eq__(self, other: object) -> bool: - if isinstance(other, (str, _IndividualSpecifier)): - other = SpecifierSet(str(other)) - elif not isinstance(other, SpecifierSet): - return NotImplemented - - return self._specs == other._specs - - def __len__(self) -> int: - return len(self._specs) - - def __iter__(self) -> Iterator[_IndividualSpecifier]: - return iter(self._specs) - - @property - def prereleases(self) -> Optional[bool]: - - # If we have been given an explicit prerelease modifier, then we'll - # pass that through here. - if self._prereleases is not None: - return self._prereleases - - # If we don't have any specifiers, and we don't have a forced value, - # then we'll just return None since we don't know if this should have - # pre-releases or not. - if not self._specs: - return None - - # Otherwise we'll see if any of the given specifiers accept - # prereleases, if any of them do we'll return True, otherwise False. - return any(s.prereleases for s in self._specs) - - @prereleases.setter - def prereleases(self, value: bool) -> None: - self._prereleases = value - - def __contains__(self, item: UnparsedVersion) -> bool: - return self.contains(item) - - def contains( - self, item: UnparsedVersion, prereleases: Optional[bool] = None - ) -> bool: - - # Ensure that our item is a Version or LegacyVersion instance. - if not isinstance(item, (LegacyVersion, Version)): - item = parse(item) - - # Determine if we're forcing a prerelease or not, if we're not forcing - # one for this particular filter call, then we'll use whatever the - # SpecifierSet thinks for whether or not we should support prereleases. - if prereleases is None: - prereleases = self.prereleases - - # We can determine if we're going to allow pre-releases by looking to - # see if any of the underlying items supports them. If none of them do - # and this item is a pre-release then we do not allow it and we can - # short circuit that here. - # Note: This means that 1.0.dev1 would not be contained in something - # like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0 - if not prereleases and item.is_prerelease: - return False - - # We simply dispatch to the underlying specs here to make sure that the - # given version is contained within all of them. - # Note: This use of all() here means that an empty set of specifiers - # will always return True, this is an explicit design decision. - return all(s.contains(item, prereleases=prereleases) for s in self._specs) - - def filter( - self, iterable: Iterable[VersionTypeVar], prereleases: Optional[bool] = None - ) -> Iterable[VersionTypeVar]: - - # Determine if we're forcing a prerelease or not, if we're not forcing - # one for this particular filter call, then we'll use whatever the - # SpecifierSet thinks for whether or not we should support prereleases. - if prereleases is None: - prereleases = self.prereleases - - # If we have any specifiers, then we want to wrap our iterable in the - # filter method for each one, this will act as a logical AND amongst - # each specifier. - if self._specs: - for spec in self._specs: - iterable = spec.filter(iterable, prereleases=bool(prereleases)) - return iterable - # If we do not have any specifiers, then we need to have a rough filter - # which will filter out any pre-releases, unless there are no final - # releases, and which will filter out LegacyVersion in general. - else: - filtered: List[VersionTypeVar] = [] - found_prereleases: List[VersionTypeVar] = [] - - item: UnparsedVersion - parsed_version: Union[Version, LegacyVersion] - - for item in iterable: - # Ensure that we some kind of Version class for this item. - if not isinstance(item, (LegacyVersion, Version)): - parsed_version = parse(item) - else: - parsed_version = item - - # Filter out any item which is parsed as a LegacyVersion - if isinstance(parsed_version, LegacyVersion): - continue - - # Store any item which is a pre-release for later unless we've - # already found a final version or we are accepting prereleases - if parsed_version.is_prerelease and not prereleases: - if not filtered: - found_prereleases.append(item) - else: - filtered.append(item) - - # If we've found no items except for pre-releases, then we'll go - # ahead and use the pre-releases - if not filtered and found_prereleases and prereleases is None: - return found_prereleases - - return filtered diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/packaging/tags.py b/venv/lib/python3.12/site-packages/pip/_vendor/packaging/tags.py deleted file mode 100644 index 9a3d25a..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/packaging/tags.py +++ /dev/null @@ -1,487 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. - -import logging -import platform -import sys -import sysconfig -from importlib.machinery import EXTENSION_SUFFIXES -from typing import ( - Dict, - FrozenSet, - Iterable, - Iterator, - List, - Optional, - Sequence, - Tuple, - Union, - cast, -) - -from . import _manylinux, _musllinux - -logger = logging.getLogger(__name__) - -PythonVersion = Sequence[int] -MacVersion = Tuple[int, int] - -INTERPRETER_SHORT_NAMES: Dict[str, str] = { - "python": "py", # Generic. - "cpython": "cp", - "pypy": "pp", - "ironpython": "ip", - "jython": "jy", -} - - -_32_BIT_INTERPRETER = sys.maxsize <= 2 ** 32 - - -class Tag: - """ - A representation of the tag triple for a wheel. - - Instances are considered immutable and thus are hashable. Equality checking - is also supported. - """ - - __slots__ = ["_interpreter", "_abi", "_platform", "_hash"] - - def __init__(self, interpreter: str, abi: str, platform: str) -> None: - self._interpreter = interpreter.lower() - self._abi = abi.lower() - self._platform = platform.lower() - # The __hash__ of every single element in a Set[Tag] will be evaluated each time - # that a set calls its `.disjoint()` method, which may be called hundreds of - # times when scanning a page of links for packages with tags matching that - # Set[Tag]. Pre-computing the value here produces significant speedups for - # downstream consumers. - self._hash = hash((self._interpreter, self._abi, self._platform)) - - @property - def interpreter(self) -> str: - return self._interpreter - - @property - def abi(self) -> str: - return self._abi - - @property - def platform(self) -> str: - return self._platform - - def __eq__(self, other: object) -> bool: - if not isinstance(other, Tag): - return NotImplemented - - return ( - (self._hash == other._hash) # Short-circuit ASAP for perf reasons. - and (self._platform == other._platform) - and (self._abi == other._abi) - and (self._interpreter == other._interpreter) - ) - - def __hash__(self) -> int: - return self._hash - - def __str__(self) -> str: - return f"{self._interpreter}-{self._abi}-{self._platform}" - - def __repr__(self) -> str: - return f"<{self} @ {id(self)}>" - - -def parse_tag(tag: str) -> FrozenSet[Tag]: - """ - Parses the provided tag (e.g. `py3-none-any`) into a frozenset of Tag instances. - - Returning a set is required due to the possibility that the tag is a - compressed tag set. - """ - tags = set() - interpreters, abis, platforms = tag.split("-") - for interpreter in interpreters.split("."): - for abi in abis.split("."): - for platform_ in platforms.split("."): - tags.add(Tag(interpreter, abi, platform_)) - return frozenset(tags) - - -def _get_config_var(name: str, warn: bool = False) -> Union[int, str, None]: - value = sysconfig.get_config_var(name) - if value is None and warn: - logger.debug( - "Config variable '%s' is unset, Python ABI tag may be incorrect", name - ) - return value - - -def _normalize_string(string: str) -> str: - return string.replace(".", "_").replace("-", "_") - - -def _abi3_applies(python_version: PythonVersion) -> bool: - """ - Determine if the Python version supports abi3. - - PEP 384 was first implemented in Python 3.2. - """ - return len(python_version) > 1 and tuple(python_version) >= (3, 2) - - -def _cpython_abis(py_version: PythonVersion, warn: bool = False) -> List[str]: - py_version = tuple(py_version) # To allow for version comparison. - abis = [] - version = _version_nodot(py_version[:2]) - debug = pymalloc = ucs4 = "" - with_debug = _get_config_var("Py_DEBUG", warn) - has_refcount = hasattr(sys, "gettotalrefcount") - # Windows doesn't set Py_DEBUG, so checking for support of debug-compiled - # extension modules is the best option. - # https://github.com/pypa/pip/issues/3383#issuecomment-173267692 - has_ext = "_d.pyd" in EXTENSION_SUFFIXES - if with_debug or (with_debug is None and (has_refcount or has_ext)): - debug = "d" - if py_version < (3, 8): - with_pymalloc = _get_config_var("WITH_PYMALLOC", warn) - if with_pymalloc or with_pymalloc is None: - pymalloc = "m" - if py_version < (3, 3): - unicode_size = _get_config_var("Py_UNICODE_SIZE", warn) - if unicode_size == 4 or ( - unicode_size is None and sys.maxunicode == 0x10FFFF - ): - ucs4 = "u" - elif debug: - # Debug builds can also load "normal" extension modules. - # We can also assume no UCS-4 or pymalloc requirement. - abis.append(f"cp{version}") - abis.insert( - 0, - "cp{version}{debug}{pymalloc}{ucs4}".format( - version=version, debug=debug, pymalloc=pymalloc, ucs4=ucs4 - ), - ) - return abis - - -def cpython_tags( - python_version: Optional[PythonVersion] = None, - abis: Optional[Iterable[str]] = None, - platforms: Optional[Iterable[str]] = None, - *, - warn: bool = False, -) -> Iterator[Tag]: - """ - Yields the tags for a CPython interpreter. - - The tags consist of: - - cp<python_version>-<abi>-<platform> - - cp<python_version>-abi3-<platform> - - cp<python_version>-none-<platform> - - cp<less than python_version>-abi3-<platform> # Older Python versions down to 3.2. - - If python_version only specifies a major version then user-provided ABIs and - the 'none' ABItag will be used. - - If 'abi3' or 'none' are specified in 'abis' then they will be yielded at - their normal position and not at the beginning. - """ - if not python_version: - python_version = sys.version_info[:2] - - interpreter = f"cp{_version_nodot(python_version[:2])}" - - if abis is None: - if len(python_version) > 1: - abis = _cpython_abis(python_version, warn) - else: - abis = [] - abis = list(abis) - # 'abi3' and 'none' are explicitly handled later. - for explicit_abi in ("abi3", "none"): - try: - abis.remove(explicit_abi) - except ValueError: - pass - - platforms = list(platforms or platform_tags()) - for abi in abis: - for platform_ in platforms: - yield Tag(interpreter, abi, platform_) - if _abi3_applies(python_version): - yield from (Tag(interpreter, "abi3", platform_) for platform_ in platforms) - yield from (Tag(interpreter, "none", platform_) for platform_ in platforms) - - if _abi3_applies(python_version): - for minor_version in range(python_version[1] - 1, 1, -1): - for platform_ in platforms: - interpreter = "cp{version}".format( - version=_version_nodot((python_version[0], minor_version)) - ) - yield Tag(interpreter, "abi3", platform_) - - -def _generic_abi() -> Iterator[str]: - abi = sysconfig.get_config_var("SOABI") - if abi: - yield _normalize_string(abi) - - -def generic_tags( - interpreter: Optional[str] = None, - abis: Optional[Iterable[str]] = None, - platforms: Optional[Iterable[str]] = None, - *, - warn: bool = False, -) -> Iterator[Tag]: - """ - Yields the tags for a generic interpreter. - - The tags consist of: - - <interpreter>-<abi>-<platform> - - The "none" ABI will be added if it was not explicitly provided. - """ - if not interpreter: - interp_name = interpreter_name() - interp_version = interpreter_version(warn=warn) - interpreter = "".join([interp_name, interp_version]) - if abis is None: - abis = _generic_abi() - platforms = list(platforms or platform_tags()) - abis = list(abis) - if "none" not in abis: - abis.append("none") - for abi in abis: - for platform_ in platforms: - yield Tag(interpreter, abi, platform_) - - -def _py_interpreter_range(py_version: PythonVersion) -> Iterator[str]: - """ - Yields Python versions in descending order. - - After the latest version, the major-only version will be yielded, and then - all previous versions of that major version. - """ - if len(py_version) > 1: - yield f"py{_version_nodot(py_version[:2])}" - yield f"py{py_version[0]}" - if len(py_version) > 1: - for minor in range(py_version[1] - 1, -1, -1): - yield f"py{_version_nodot((py_version[0], minor))}" - - -def compatible_tags( - python_version: Optional[PythonVersion] = None, - interpreter: Optional[str] = None, - platforms: Optional[Iterable[str]] = None, -) -> Iterator[Tag]: - """ - Yields the sequence of tags that are compatible with a specific version of Python. - - The tags consist of: - - py*-none-<platform> - - <interpreter>-none-any # ... if `interpreter` is provided. - - py*-none-any - """ - if not python_version: - python_version = sys.version_info[:2] - platforms = list(platforms or platform_tags()) - for version in _py_interpreter_range(python_version): - for platform_ in platforms: - yield Tag(version, "none", platform_) - if interpreter: - yield Tag(interpreter, "none", "any") - for version in _py_interpreter_range(python_version): - yield Tag(version, "none", "any") - - -def _mac_arch(arch: str, is_32bit: bool = _32_BIT_INTERPRETER) -> str: - if not is_32bit: - return arch - - if arch.startswith("ppc"): - return "ppc" - - return "i386" - - -def _mac_binary_formats(version: MacVersion, cpu_arch: str) -> List[str]: - formats = [cpu_arch] - if cpu_arch == "x86_64": - if version < (10, 4): - return [] - formats.extend(["intel", "fat64", "fat32"]) - - elif cpu_arch == "i386": - if version < (10, 4): - return [] - formats.extend(["intel", "fat32", "fat"]) - - elif cpu_arch == "ppc64": - # TODO: Need to care about 32-bit PPC for ppc64 through 10.2? - if version > (10, 5) or version < (10, 4): - return [] - formats.append("fat64") - - elif cpu_arch == "ppc": - if version > (10, 6): - return [] - formats.extend(["fat32", "fat"]) - - if cpu_arch in {"arm64", "x86_64"}: - formats.append("universal2") - - if cpu_arch in {"x86_64", "i386", "ppc64", "ppc", "intel"}: - formats.append("universal") - - return formats - - -def mac_platforms( - version: Optional[MacVersion] = None, arch: Optional[str] = None -) -> Iterator[str]: - """ - Yields the platform tags for a macOS system. - - The `version` parameter is a two-item tuple specifying the macOS version to - generate platform tags for. The `arch` parameter is the CPU architecture to - generate platform tags for. Both parameters default to the appropriate value - for the current system. - """ - version_str, _, cpu_arch = platform.mac_ver() - if version is None: - version = cast("MacVersion", tuple(map(int, version_str.split(".")[:2]))) - else: - version = version - if arch is None: - arch = _mac_arch(cpu_arch) - else: - arch = arch - - if (10, 0) <= version and version < (11, 0): - # Prior to Mac OS 11, each yearly release of Mac OS bumped the - # "minor" version number. The major version was always 10. - for minor_version in range(version[1], -1, -1): - compat_version = 10, minor_version - binary_formats = _mac_binary_formats(compat_version, arch) - for binary_format in binary_formats: - yield "macosx_{major}_{minor}_{binary_format}".format( - major=10, minor=minor_version, binary_format=binary_format - ) - - if version >= (11, 0): - # Starting with Mac OS 11, each yearly release bumps the major version - # number. The minor versions are now the midyear updates. - for major_version in range(version[0], 10, -1): - compat_version = major_version, 0 - binary_formats = _mac_binary_formats(compat_version, arch) - for binary_format in binary_formats: - yield "macosx_{major}_{minor}_{binary_format}".format( - major=major_version, minor=0, binary_format=binary_format - ) - - if version >= (11, 0): - # Mac OS 11 on x86_64 is compatible with binaries from previous releases. - # Arm64 support was introduced in 11.0, so no Arm binaries from previous - # releases exist. - # - # However, the "universal2" binary format can have a - # macOS version earlier than 11.0 when the x86_64 part of the binary supports - # that version of macOS. - if arch == "x86_64": - for minor_version in range(16, 3, -1): - compat_version = 10, minor_version - binary_formats = _mac_binary_formats(compat_version, arch) - for binary_format in binary_formats: - yield "macosx_{major}_{minor}_{binary_format}".format( - major=compat_version[0], - minor=compat_version[1], - binary_format=binary_format, - ) - else: - for minor_version in range(16, 3, -1): - compat_version = 10, minor_version - binary_format = "universal2" - yield "macosx_{major}_{minor}_{binary_format}".format( - major=compat_version[0], - minor=compat_version[1], - binary_format=binary_format, - ) - - -def _linux_platforms(is_32bit: bool = _32_BIT_INTERPRETER) -> Iterator[str]: - linux = _normalize_string(sysconfig.get_platform()) - if is_32bit: - if linux == "linux_x86_64": - linux = "linux_i686" - elif linux == "linux_aarch64": - linux = "linux_armv7l" - _, arch = linux.split("_", 1) - yield from _manylinux.platform_tags(linux, arch) - yield from _musllinux.platform_tags(arch) - yield linux - - -def _generic_platforms() -> Iterator[str]: - yield _normalize_string(sysconfig.get_platform()) - - -def platform_tags() -> Iterator[str]: - """ - Provides the platform tags for this installation. - """ - if platform.system() == "Darwin": - return mac_platforms() - elif platform.system() == "Linux": - return _linux_platforms() - else: - return _generic_platforms() - - -def interpreter_name() -> str: - """ - Returns the name of the running interpreter. - """ - name = sys.implementation.name - return INTERPRETER_SHORT_NAMES.get(name) or name - - -def interpreter_version(*, warn: bool = False) -> str: - """ - Returns the version of the running interpreter. - """ - version = _get_config_var("py_version_nodot", warn=warn) - if version: - version = str(version) - else: - version = _version_nodot(sys.version_info[:2]) - return version - - -def _version_nodot(version: PythonVersion) -> str: - return "".join(map(str, version)) - - -def sys_tags(*, warn: bool = False) -> Iterator[Tag]: - """ - Returns the sequence of tag triples for the running interpreter. - - The order of the sequence corresponds to priority order for the - interpreter, from most to least important. - """ - - interp_name = interpreter_name() - if interp_name == "cp": - yield from cpython_tags(warn=warn) - else: - yield from generic_tags() - - if interp_name == "pp": - yield from compatible_tags(interpreter="pp3") - else: - yield from compatible_tags() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/packaging/utils.py b/venv/lib/python3.12/site-packages/pip/_vendor/packaging/utils.py deleted file mode 100644 index bab11b8..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/packaging/utils.py +++ /dev/null @@ -1,136 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. - -import re -from typing import FrozenSet, NewType, Tuple, Union, cast - -from .tags import Tag, parse_tag -from .version import InvalidVersion, Version - -BuildTag = Union[Tuple[()], Tuple[int, str]] -NormalizedName = NewType("NormalizedName", str) - - -class InvalidWheelFilename(ValueError): - """ - An invalid wheel filename was found, users should refer to PEP 427. - """ - - -class InvalidSdistFilename(ValueError): - """ - An invalid sdist filename was found, users should refer to the packaging user guide. - """ - - -_canonicalize_regex = re.compile(r"[-_.]+") -# PEP 427: The build number must start with a digit. -_build_tag_regex = re.compile(r"(\d+)(.*)") - - -def canonicalize_name(name: str) -> NormalizedName: - # This is taken from PEP 503. - value = _canonicalize_regex.sub("-", name).lower() - return cast(NormalizedName, value) - - -def canonicalize_version(version: Union[Version, str]) -> str: - """ - This is very similar to Version.__str__, but has one subtle difference - with the way it handles the release segment. - """ - if isinstance(version, str): - try: - parsed = Version(version) - except InvalidVersion: - # Legacy versions cannot be normalized - return version - else: - parsed = version - - parts = [] - - # Epoch - if parsed.epoch != 0: - parts.append(f"{parsed.epoch}!") - - # Release segment - # NB: This strips trailing '.0's to normalize - parts.append(re.sub(r"(\.0)+$", "", ".".join(str(x) for x in parsed.release))) - - # Pre-release - if parsed.pre is not None: - parts.append("".join(str(x) for x in parsed.pre)) - - # Post-release - if parsed.post is not None: - parts.append(f".post{parsed.post}") - - # Development release - if parsed.dev is not None: - parts.append(f".dev{parsed.dev}") - - # Local version segment - if parsed.local is not None: - parts.append(f"+{parsed.local}") - - return "".join(parts) - - -def parse_wheel_filename( - filename: str, -) -> Tuple[NormalizedName, Version, BuildTag, FrozenSet[Tag]]: - if not filename.endswith(".whl"): - raise InvalidWheelFilename( - f"Invalid wheel filename (extension must be '.whl'): {filename}" - ) - - filename = filename[:-4] - dashes = filename.count("-") - if dashes not in (4, 5): - raise InvalidWheelFilename( - f"Invalid wheel filename (wrong number of parts): {filename}" - ) - - parts = filename.split("-", dashes - 2) - name_part = parts[0] - # See PEP 427 for the rules on escaping the project name - if "__" in name_part or re.match(r"^[\w\d._]*$", name_part, re.UNICODE) is None: - raise InvalidWheelFilename(f"Invalid project name: {filename}") - name = canonicalize_name(name_part) - version = Version(parts[1]) - if dashes == 5: - build_part = parts[2] - build_match = _build_tag_regex.match(build_part) - if build_match is None: - raise InvalidWheelFilename( - f"Invalid build number: {build_part} in '{filename}'" - ) - build = cast(BuildTag, (int(build_match.group(1)), build_match.group(2))) - else: - build = () - tags = parse_tag(parts[-1]) - return (name, version, build, tags) - - -def parse_sdist_filename(filename: str) -> Tuple[NormalizedName, Version]: - if filename.endswith(".tar.gz"): - file_stem = filename[: -len(".tar.gz")] - elif filename.endswith(".zip"): - file_stem = filename[: -len(".zip")] - else: - raise InvalidSdistFilename( - f"Invalid sdist filename (extension must be '.tar.gz' or '.zip'):" - f" {filename}" - ) - - # We are requiring a PEP 440 version, which cannot contain dashes, - # so we split on the last dash. - name_part, sep, version_part = file_stem.rpartition("-") - if not sep: - raise InvalidSdistFilename(f"Invalid sdist filename: {filename}") - - name = canonicalize_name(name_part) - version = Version(version_part) - return (name, version) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/packaging/version.py b/venv/lib/python3.12/site-packages/pip/_vendor/packaging/version.py deleted file mode 100644 index de9a09a..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/packaging/version.py +++ /dev/null @@ -1,504 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. - -import collections -import itertools -import re -import warnings -from typing import Callable, Iterator, List, Optional, SupportsInt, Tuple, Union - -from ._structures import Infinity, InfinityType, NegativeInfinity, NegativeInfinityType - -__all__ = ["parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN"] - -InfiniteTypes = Union[InfinityType, NegativeInfinityType] -PrePostDevType = Union[InfiniteTypes, Tuple[str, int]] -SubLocalType = Union[InfiniteTypes, int, str] -LocalType = Union[ - NegativeInfinityType, - Tuple[ - Union[ - SubLocalType, - Tuple[SubLocalType, str], - Tuple[NegativeInfinityType, SubLocalType], - ], - ..., - ], -] -CmpKey = Tuple[ - int, Tuple[int, ...], PrePostDevType, PrePostDevType, PrePostDevType, LocalType -] -LegacyCmpKey = Tuple[int, Tuple[str, ...]] -VersionComparisonMethod = Callable[ - [Union[CmpKey, LegacyCmpKey], Union[CmpKey, LegacyCmpKey]], bool -] - -_Version = collections.namedtuple( - "_Version", ["epoch", "release", "dev", "pre", "post", "local"] -) - - -def parse(version: str) -> Union["LegacyVersion", "Version"]: - """ - Parse the given version string and return either a :class:`Version` object - or a :class:`LegacyVersion` object depending on if the given version is - a valid PEP 440 version or a legacy version. - """ - try: - return Version(version) - except InvalidVersion: - return LegacyVersion(version) - - -class InvalidVersion(ValueError): - """ - An invalid version was found, users should refer to PEP 440. - """ - - -class _BaseVersion: - _key: Union[CmpKey, LegacyCmpKey] - - def __hash__(self) -> int: - return hash(self._key) - - # Please keep the duplicated `isinstance` check - # in the six comparisons hereunder - # unless you find a way to avoid adding overhead function calls. - def __lt__(self, other: "_BaseVersion") -> bool: - if not isinstance(other, _BaseVersion): - return NotImplemented - - return self._key < other._key - - def __le__(self, other: "_BaseVersion") -> bool: - if not isinstance(other, _BaseVersion): - return NotImplemented - - return self._key <= other._key - - def __eq__(self, other: object) -> bool: - if not isinstance(other, _BaseVersion): - return NotImplemented - - return self._key == other._key - - def __ge__(self, other: "_BaseVersion") -> bool: - if not isinstance(other, _BaseVersion): - return NotImplemented - - return self._key >= other._key - - def __gt__(self, other: "_BaseVersion") -> bool: - if not isinstance(other, _BaseVersion): - return NotImplemented - - return self._key > other._key - - def __ne__(self, other: object) -> bool: - if not isinstance(other, _BaseVersion): - return NotImplemented - - return self._key != other._key - - -class LegacyVersion(_BaseVersion): - def __init__(self, version: str) -> None: - self._version = str(version) - self._key = _legacy_cmpkey(self._version) - - warnings.warn( - "Creating a LegacyVersion has been deprecated and will be " - "removed in the next major release", - DeprecationWarning, - ) - - def __str__(self) -> str: - return self._version - - def __repr__(self) -> str: - return f"<LegacyVersion('{self}')>" - - @property - def public(self) -> str: - return self._version - - @property - def base_version(self) -> str: - return self._version - - @property - def epoch(self) -> int: - return -1 - - @property - def release(self) -> None: - return None - - @property - def pre(self) -> None: - return None - - @property - def post(self) -> None: - return None - - @property - def dev(self) -> None: - return None - - @property - def local(self) -> None: - return None - - @property - def is_prerelease(self) -> bool: - return False - - @property - def is_postrelease(self) -> bool: - return False - - @property - def is_devrelease(self) -> bool: - return False - - -_legacy_version_component_re = re.compile(r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE) - -_legacy_version_replacement_map = { - "pre": "c", - "preview": "c", - "-": "final-", - "rc": "c", - "dev": "@", -} - - -def _parse_version_parts(s: str) -> Iterator[str]: - for part in _legacy_version_component_re.split(s): - part = _legacy_version_replacement_map.get(part, part) - - if not part or part == ".": - continue - - if part[:1] in "0123456789": - # pad for numeric comparison - yield part.zfill(8) - else: - yield "*" + part - - # ensure that alpha/beta/candidate are before final - yield "*final" - - -def _legacy_cmpkey(version: str) -> LegacyCmpKey: - - # We hardcode an epoch of -1 here. A PEP 440 version can only have a epoch - # greater than or equal to 0. This will effectively put the LegacyVersion, - # which uses the defacto standard originally implemented by setuptools, - # as before all PEP 440 versions. - epoch = -1 - - # This scheme is taken from pkg_resources.parse_version setuptools prior to - # it's adoption of the packaging library. - parts: List[str] = [] - for part in _parse_version_parts(version.lower()): - if part.startswith("*"): - # remove "-" before a prerelease tag - if part < "*final": - while parts and parts[-1] == "*final-": - parts.pop() - - # remove trailing zeros from each series of numeric parts - while parts and parts[-1] == "00000000": - parts.pop() - - parts.append(part) - - return epoch, tuple(parts) - - -# Deliberately not anchored to the start and end of the string, to make it -# easier for 3rd party code to reuse -VERSION_PATTERN = r""" - v? - (?: - (?:(?P<epoch>[0-9]+)!)? # epoch - (?P<release>[0-9]+(?:\.[0-9]+)*) # release segment - (?P<pre> # pre-release - [-_\.]? - (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview)) - [-_\.]? - (?P<pre_n>[0-9]+)? - )? - (?P<post> # post release - (?:-(?P<post_n1>[0-9]+)) - | - (?: - [-_\.]? - (?P<post_l>post|rev|r) - [-_\.]? - (?P<post_n2>[0-9]+)? - ) - )? - (?P<dev> # dev release - [-_\.]? - (?P<dev_l>dev) - [-_\.]? - (?P<dev_n>[0-9]+)? - )? - ) - (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))? # local version -""" - - -class Version(_BaseVersion): - - _regex = re.compile(r"^\s*" + VERSION_PATTERN + r"\s*$", re.VERBOSE | re.IGNORECASE) - - def __init__(self, version: str) -> None: - - # Validate the version and parse it into pieces - match = self._regex.search(version) - if not match: - raise InvalidVersion(f"Invalid version: '{version}'") - - # Store the parsed out pieces of the version - self._version = _Version( - epoch=int(match.group("epoch")) if match.group("epoch") else 0, - release=tuple(int(i) for i in match.group("release").split(".")), - pre=_parse_letter_version(match.group("pre_l"), match.group("pre_n")), - post=_parse_letter_version( - match.group("post_l"), match.group("post_n1") or match.group("post_n2") - ), - dev=_parse_letter_version(match.group("dev_l"), match.group("dev_n")), - local=_parse_local_version(match.group("local")), - ) - - # Generate a key which will be used for sorting - self._key = _cmpkey( - self._version.epoch, - self._version.release, - self._version.pre, - self._version.post, - self._version.dev, - self._version.local, - ) - - def __repr__(self) -> str: - return f"<Version('{self}')>" - - def __str__(self) -> str: - parts = [] - - # Epoch - if self.epoch != 0: - parts.append(f"{self.epoch}!") - - # Release segment - parts.append(".".join(str(x) for x in self.release)) - - # Pre-release - if self.pre is not None: - parts.append("".join(str(x) for x in self.pre)) - - # Post-release - if self.post is not None: - parts.append(f".post{self.post}") - - # Development release - if self.dev is not None: - parts.append(f".dev{self.dev}") - - # Local version segment - if self.local is not None: - parts.append(f"+{self.local}") - - return "".join(parts) - - @property - def epoch(self) -> int: - _epoch: int = self._version.epoch - return _epoch - - @property - def release(self) -> Tuple[int, ...]: - _release: Tuple[int, ...] = self._version.release - return _release - - @property - def pre(self) -> Optional[Tuple[str, int]]: - _pre: Optional[Tuple[str, int]] = self._version.pre - return _pre - - @property - def post(self) -> Optional[int]: - return self._version.post[1] if self._version.post else None - - @property - def dev(self) -> Optional[int]: - return self._version.dev[1] if self._version.dev else None - - @property - def local(self) -> Optional[str]: - if self._version.local: - return ".".join(str(x) for x in self._version.local) - else: - return None - - @property - def public(self) -> str: - return str(self).split("+", 1)[0] - - @property - def base_version(self) -> str: - parts = [] - - # Epoch - if self.epoch != 0: - parts.append(f"{self.epoch}!") - - # Release segment - parts.append(".".join(str(x) for x in self.release)) - - return "".join(parts) - - @property - def is_prerelease(self) -> bool: - return self.dev is not None or self.pre is not None - - @property - def is_postrelease(self) -> bool: - return self.post is not None - - @property - def is_devrelease(self) -> bool: - return self.dev is not None - - @property - def major(self) -> int: - return self.release[0] if len(self.release) >= 1 else 0 - - @property - def minor(self) -> int: - return self.release[1] if len(self.release) >= 2 else 0 - - @property - def micro(self) -> int: - return self.release[2] if len(self.release) >= 3 else 0 - - -def _parse_letter_version( - letter: str, number: Union[str, bytes, SupportsInt] -) -> Optional[Tuple[str, int]]: - - if letter: - # We consider there to be an implicit 0 in a pre-release if there is - # not a numeral associated with it. - if number is None: - number = 0 - - # We normalize any letters to their lower case form - letter = letter.lower() - - # We consider some words to be alternate spellings of other words and - # in those cases we want to normalize the spellings to our preferred - # spelling. - if letter == "alpha": - letter = "a" - elif letter == "beta": - letter = "b" - elif letter in ["c", "pre", "preview"]: - letter = "rc" - elif letter in ["rev", "r"]: - letter = "post" - - return letter, int(number) - if not letter and number: - # We assume if we are given a number, but we are not given a letter - # then this is using the implicit post release syntax (e.g. 1.0-1) - letter = "post" - - return letter, int(number) - - return None - - -_local_version_separators = re.compile(r"[\._-]") - - -def _parse_local_version(local: str) -> Optional[LocalType]: - """ - Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve"). - """ - if local is not None: - return tuple( - part.lower() if not part.isdigit() else int(part) - for part in _local_version_separators.split(local) - ) - return None - - -def _cmpkey( - epoch: int, - release: Tuple[int, ...], - pre: Optional[Tuple[str, int]], - post: Optional[Tuple[str, int]], - dev: Optional[Tuple[str, int]], - local: Optional[Tuple[SubLocalType]], -) -> CmpKey: - - # When we compare a release version, we want to compare it with all of the - # trailing zeros removed. So we'll use a reverse the list, drop all the now - # leading zeros until we come to something non zero, then take the rest - # re-reverse it back into the correct order and make it a tuple and use - # that for our sorting key. - _release = tuple( - reversed(list(itertools.dropwhile(lambda x: x == 0, reversed(release)))) - ) - - # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0. - # We'll do this by abusing the pre segment, but we _only_ want to do this - # if there is not a pre or a post segment. If we have one of those then - # the normal sorting rules will handle this case correctly. - if pre is None and post is None and dev is not None: - _pre: PrePostDevType = NegativeInfinity - # Versions without a pre-release (except as noted above) should sort after - # those with one. - elif pre is None: - _pre = Infinity - else: - _pre = pre - - # Versions without a post segment should sort before those with one. - if post is None: - _post: PrePostDevType = NegativeInfinity - - else: - _post = post - - # Versions without a development segment should sort after those with one. - if dev is None: - _dev: PrePostDevType = Infinity - - else: - _dev = dev - - if local is None: - # Versions without a local segment should sort before those with one. - _local: LocalType = NegativeInfinity - else: - # Versions with a local segment need that segment parsed to implement - # the sorting rules in PEP440. - # - Alpha numeric segments sort before numeric segments - # - Alpha numeric segments sort lexicographically - # - Numeric segments sort numerically - # - Shorter versions sort before longer versions when the prefixes - # match exactly - _local = tuple( - (i, "") if isinstance(i, int) else (NegativeInfinity, i) for i in local - ) - - return epoch, _release, _pre, _post, _dev, _local diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py deleted file mode 100644 index ad27940..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py +++ /dev/null @@ -1,3361 +0,0 @@ -""" -Package resource API --------------------- - -A resource is a logical file contained within a package, or a logical -subdirectory thereof. The package resource API expects resource names -to have their path parts separated with ``/``, *not* whatever the local -path separator is. Do not use os.path operations to manipulate resource -names being passed into the API. - -The package resource API is designed to work with normal filesystem packages, -.egg files, and unpacked .egg files. It can also work in a limited way with -.zip files and with custom PEP 302 loaders that support the ``get_data()`` -method. - -This module is deprecated. Users are directed to :mod:`importlib.resources`, -:mod:`importlib.metadata` and :pypi:`packaging` instead. -""" - -import sys -import os -import io -import time -import re -import types -import zipfile -import zipimport -import warnings -import stat -import functools -import pkgutil -import operator -import platform -import collections -import plistlib -import email.parser -import errno -import tempfile -import textwrap -import inspect -import ntpath -import posixpath -import importlib -from pkgutil import get_importer - -try: - import _imp -except ImportError: - # Python 3.2 compatibility - import imp as _imp - -try: - FileExistsError -except NameError: - FileExistsError = OSError - -# capture these to bypass sandboxing -from os import utime - -try: - from os import mkdir, rename, unlink - - WRITE_SUPPORT = True -except ImportError: - # no write support, probably under GAE - WRITE_SUPPORT = False - -from os import open as os_open -from os.path import isdir, split - -try: - import importlib.machinery as importlib_machinery - - # access attribute to force import under delayed import mechanisms. - importlib_machinery.__name__ -except ImportError: - importlib_machinery = None - -from pip._internal.utils._jaraco_text import ( - yield_lines, - drop_comment, - join_continuation, -) - -from pip._vendor import platformdirs -from pip._vendor import packaging - -__import__('pip._vendor.packaging.version') -__import__('pip._vendor.packaging.specifiers') -__import__('pip._vendor.packaging.requirements') -__import__('pip._vendor.packaging.markers') -__import__('pip._vendor.packaging.utils') - -if sys.version_info < (3, 5): - raise RuntimeError("Python 3.5 or later is required") - -# declare some globals that will be defined later to -# satisfy the linters. -require = None -working_set = None -add_activation_listener = None -resources_stream = None -cleanup_resources = None -resource_dir = None -resource_stream = None -set_extraction_path = None -resource_isdir = None -resource_string = None -iter_entry_points = None -resource_listdir = None -resource_filename = None -resource_exists = None -_distribution_finders = None -_namespace_handlers = None -_namespace_packages = None - - -warnings.warn( - "pkg_resources is deprecated as an API. " - "See https://setuptools.pypa.io/en/latest/pkg_resources.html", - DeprecationWarning, - stacklevel=2 -) - - -_PEP440_FALLBACK = re.compile(r"^v?(?P<safe>(?:[0-9]+!)?[0-9]+(?:\.[0-9]+)*)", re.I) - - -class PEP440Warning(RuntimeWarning): - """ - Used when there is an issue with a version or specifier not complying with - PEP 440. - """ - - -parse_version = packaging.version.Version - - -_state_vars = {} - - -def _declare_state(vartype, **kw): - globals().update(kw) - _state_vars.update(dict.fromkeys(kw, vartype)) - - -def __getstate__(): - state = {} - g = globals() - for k, v in _state_vars.items(): - state[k] = g['_sget_' + v](g[k]) - return state - - -def __setstate__(state): - g = globals() - for k, v in state.items(): - g['_sset_' + _state_vars[k]](k, g[k], v) - return state - - -def _sget_dict(val): - return val.copy() - - -def _sset_dict(key, ob, state): - ob.clear() - ob.update(state) - - -def _sget_object(val): - return val.__getstate__() - - -def _sset_object(key, ob, state): - ob.__setstate__(state) - - -_sget_none = _sset_none = lambda *args: None - - -def get_supported_platform(): - """Return this platform's maximum compatible version. - - distutils.util.get_platform() normally reports the minimum version - of macOS that would be required to *use* extensions produced by - distutils. But what we want when checking compatibility is to know the - version of macOS that we are *running*. To allow usage of packages that - explicitly require a newer version of macOS, we must also know the - current version of the OS. - - If this condition occurs for any other platform with a version in its - platform strings, this function should be extended accordingly. - """ - plat = get_build_platform() - m = macosVersionString.match(plat) - if m is not None and sys.platform == "darwin": - try: - plat = 'macosx-%s-%s' % ('.'.join(_macos_vers()[:2]), m.group(3)) - except ValueError: - # not macOS - pass - return plat - - -__all__ = [ - # Basic resource access and distribution/entry point discovery - 'require', - 'run_script', - 'get_provider', - 'get_distribution', - 'load_entry_point', - 'get_entry_map', - 'get_entry_info', - 'iter_entry_points', - 'resource_string', - 'resource_stream', - 'resource_filename', - 'resource_listdir', - 'resource_exists', - 'resource_isdir', - # Environmental control - 'declare_namespace', - 'working_set', - 'add_activation_listener', - 'find_distributions', - 'set_extraction_path', - 'cleanup_resources', - 'get_default_cache', - # Primary implementation classes - 'Environment', - 'WorkingSet', - 'ResourceManager', - 'Distribution', - 'Requirement', - 'EntryPoint', - # Exceptions - 'ResolutionError', - 'VersionConflict', - 'DistributionNotFound', - 'UnknownExtra', - 'ExtractionError', - # Warnings - 'PEP440Warning', - # Parsing functions and string utilities - 'parse_requirements', - 'parse_version', - 'safe_name', - 'safe_version', - 'get_platform', - 'compatible_platforms', - 'yield_lines', - 'split_sections', - 'safe_extra', - 'to_filename', - 'invalid_marker', - 'evaluate_marker', - # filesystem utilities - 'ensure_directory', - 'normalize_path', - # Distribution "precedence" constants - 'EGG_DIST', - 'BINARY_DIST', - 'SOURCE_DIST', - 'CHECKOUT_DIST', - 'DEVELOP_DIST', - # "Provider" interfaces, implementations, and registration/lookup APIs - 'IMetadataProvider', - 'IResourceProvider', - 'FileMetadata', - 'PathMetadata', - 'EggMetadata', - 'EmptyProvider', - 'empty_provider', - 'NullProvider', - 'EggProvider', - 'DefaultProvider', - 'ZipProvider', - 'register_finder', - 'register_namespace_handler', - 'register_loader_type', - 'fixup_namespace_packages', - 'get_importer', - # Warnings - 'PkgResourcesDeprecationWarning', - # Deprecated/backward compatibility only - 'run_main', - 'AvailableDistributions', -] - - -class ResolutionError(Exception): - """Abstract base for dependency resolution errors""" - - def __repr__(self): - return self.__class__.__name__ + repr(self.args) - - -class VersionConflict(ResolutionError): - """ - An already-installed version conflicts with the requested version. - - Should be initialized with the installed Distribution and the requested - Requirement. - """ - - _template = "{self.dist} is installed but {self.req} is required" - - @property - def dist(self): - return self.args[0] - - @property - def req(self): - return self.args[1] - - def report(self): - return self._template.format(**locals()) - - def with_context(self, required_by): - """ - If required_by is non-empty, return a version of self that is a - ContextualVersionConflict. - """ - if not required_by: - return self - args = self.args + (required_by,) - return ContextualVersionConflict(*args) - - -class ContextualVersionConflict(VersionConflict): - """ - A VersionConflict that accepts a third parameter, the set of the - requirements that required the installed Distribution. - """ - - _template = VersionConflict._template + ' by {self.required_by}' - - @property - def required_by(self): - return self.args[2] - - -class DistributionNotFound(ResolutionError): - """A requested distribution was not found""" - - _template = ( - "The '{self.req}' distribution was not found " - "and is required by {self.requirers_str}" - ) - - @property - def req(self): - return self.args[0] - - @property - def requirers(self): - return self.args[1] - - @property - def requirers_str(self): - if not self.requirers: - return 'the application' - return ', '.join(self.requirers) - - def report(self): - return self._template.format(**locals()) - - def __str__(self): - return self.report() - - -class UnknownExtra(ResolutionError): - """Distribution doesn't have an "extra feature" of the given name""" - - -_provider_factories = {} - -PY_MAJOR = '{}.{}'.format(*sys.version_info) -EGG_DIST = 3 -BINARY_DIST = 2 -SOURCE_DIST = 1 -CHECKOUT_DIST = 0 -DEVELOP_DIST = -1 - - -def register_loader_type(loader_type, provider_factory): - """Register `provider_factory` to make providers for `loader_type` - - `loader_type` is the type or class of a PEP 302 ``module.__loader__``, - and `provider_factory` is a function that, passed a *module* object, - returns an ``IResourceProvider`` for that module. - """ - _provider_factories[loader_type] = provider_factory - - -def get_provider(moduleOrReq): - """Return an IResourceProvider for the named module or requirement""" - if isinstance(moduleOrReq, Requirement): - return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0] - try: - module = sys.modules[moduleOrReq] - except KeyError: - __import__(moduleOrReq) - module = sys.modules[moduleOrReq] - loader = getattr(module, '__loader__', None) - return _find_adapter(_provider_factories, loader)(module) - - -def _macos_vers(_cache=[]): - if not _cache: - version = platform.mac_ver()[0] - # fallback for MacPorts - if version == '': - plist = '/System/Library/CoreServices/SystemVersion.plist' - if os.path.exists(plist): - if hasattr(plistlib, 'readPlist'): - plist_content = plistlib.readPlist(plist) - if 'ProductVersion' in plist_content: - version = plist_content['ProductVersion'] - - _cache.append(version.split('.')) - return _cache[0] - - -def _macos_arch(machine): - return {'PowerPC': 'ppc', 'Power_Macintosh': 'ppc'}.get(machine, machine) - - -def get_build_platform(): - """Return this platform's string for platform-specific distributions - - XXX Currently this is the same as ``distutils.util.get_platform()``, but it - needs some hacks for Linux and macOS. - """ - from sysconfig import get_platform - - plat = get_platform() - if sys.platform == "darwin" and not plat.startswith('macosx-'): - try: - version = _macos_vers() - machine = os.uname()[4].replace(" ", "_") - return "macosx-%d.%d-%s" % ( - int(version[0]), - int(version[1]), - _macos_arch(machine), - ) - except ValueError: - # if someone is running a non-Mac darwin system, this will fall - # through to the default implementation - pass - return plat - - -macosVersionString = re.compile(r"macosx-(\d+)\.(\d+)-(.*)") -darwinVersionString = re.compile(r"darwin-(\d+)\.(\d+)\.(\d+)-(.*)") -# XXX backward compat -get_platform = get_build_platform - - -def compatible_platforms(provided, required): - """Can code for the `provided` platform run on the `required` platform? - - Returns true if either platform is ``None``, or the platforms are equal. - - XXX Needs compatibility checks for Linux and other unixy OSes. - """ - if provided is None or required is None or provided == required: - # easy case - return True - - # macOS special cases - reqMac = macosVersionString.match(required) - if reqMac: - provMac = macosVersionString.match(provided) - - # is this a Mac package? - if not provMac: - # this is backwards compatibility for packages built before - # setuptools 0.6. All packages built after this point will - # use the new macOS designation. - provDarwin = darwinVersionString.match(provided) - if provDarwin: - dversion = int(provDarwin.group(1)) - macosversion = "%s.%s" % (reqMac.group(1), reqMac.group(2)) - if ( - dversion == 7 - and macosversion >= "10.3" - or dversion == 8 - and macosversion >= "10.4" - ): - return True - # egg isn't macOS or legacy darwin - return False - - # are they the same major version and machine type? - if provMac.group(1) != reqMac.group(1) or provMac.group(3) != reqMac.group(3): - return False - - # is the required OS major update >= the provided one? - if int(provMac.group(2)) > int(reqMac.group(2)): - return False - - return True - - # XXX Linux and other platforms' special cases should go here - return False - - -def run_script(dist_spec, script_name): - """Locate distribution `dist_spec` and run its `script_name` script""" - ns = sys._getframe(1).f_globals - name = ns['__name__'] - ns.clear() - ns['__name__'] = name - require(dist_spec)[0].run_script(script_name, ns) - - -# backward compatibility -run_main = run_script - - -def get_distribution(dist): - """Return a current distribution object for a Requirement or string""" - if isinstance(dist, str): - dist = Requirement.parse(dist) - if isinstance(dist, Requirement): - dist = get_provider(dist) - if not isinstance(dist, Distribution): - raise TypeError("Expected string, Requirement, or Distribution", dist) - return dist - - -def load_entry_point(dist, group, name): - """Return `name` entry point of `group` for `dist` or raise ImportError""" - return get_distribution(dist).load_entry_point(group, name) - - -def get_entry_map(dist, group=None): - """Return the entry point map for `group`, or the full entry map""" - return get_distribution(dist).get_entry_map(group) - - -def get_entry_info(dist, group, name): - """Return the EntryPoint object for `group`+`name`, or ``None``""" - return get_distribution(dist).get_entry_info(group, name) - - -class IMetadataProvider: - def has_metadata(name): - """Does the package's distribution contain the named metadata?""" - - def get_metadata(name): - """The named metadata resource as a string""" - - def get_metadata_lines(name): - """Yield named metadata resource as list of non-blank non-comment lines - - Leading and trailing whitespace is stripped from each line, and lines - with ``#`` as the first non-blank character are omitted.""" - - def metadata_isdir(name): - """Is the named metadata a directory? (like ``os.path.isdir()``)""" - - def metadata_listdir(name): - """List of metadata names in the directory (like ``os.listdir()``)""" - - def run_script(script_name, namespace): - """Execute the named script in the supplied namespace dictionary""" - - -class IResourceProvider(IMetadataProvider): - """An object that provides access to package resources""" - - def get_resource_filename(manager, resource_name): - """Return a true filesystem path for `resource_name` - - `manager` must be an ``IResourceManager``""" - - def get_resource_stream(manager, resource_name): - """Return a readable file-like object for `resource_name` - - `manager` must be an ``IResourceManager``""" - - def get_resource_string(manager, resource_name): - """Return a string containing the contents of `resource_name` - - `manager` must be an ``IResourceManager``""" - - def has_resource(resource_name): - """Does the package contain the named resource?""" - - def resource_isdir(resource_name): - """Is the named resource a directory? (like ``os.path.isdir()``)""" - - def resource_listdir(resource_name): - """List of resource names in the directory (like ``os.listdir()``)""" - - -class WorkingSet: - """A collection of active distributions on sys.path (or a similar list)""" - - def __init__(self, entries=None): - """Create working set from list of path entries (default=sys.path)""" - self.entries = [] - self.entry_keys = {} - self.by_key = {} - self.normalized_to_canonical_keys = {} - self.callbacks = [] - - if entries is None: - entries = sys.path - - for entry in entries: - self.add_entry(entry) - - @classmethod - def _build_master(cls): - """ - Prepare the master working set. - """ - ws = cls() - try: - from __main__ import __requires__ - except ImportError: - # The main program does not list any requirements - return ws - - # ensure the requirements are met - try: - ws.require(__requires__) - except VersionConflict: - return cls._build_from_requirements(__requires__) - - return ws - - @classmethod - def _build_from_requirements(cls, req_spec): - """ - Build a working set from a requirement spec. Rewrites sys.path. - """ - # try it without defaults already on sys.path - # by starting with an empty path - ws = cls([]) - reqs = parse_requirements(req_spec) - dists = ws.resolve(reqs, Environment()) - for dist in dists: - ws.add(dist) - - # add any missing entries from sys.path - for entry in sys.path: - if entry not in ws.entries: - ws.add_entry(entry) - - # then copy back to sys.path - sys.path[:] = ws.entries - return ws - - def add_entry(self, entry): - """Add a path item to ``.entries``, finding any distributions on it - - ``find_distributions(entry, True)`` is used to find distributions - corresponding to the path entry, and they are added. `entry` is - always appended to ``.entries``, even if it is already present. - (This is because ``sys.path`` can contain the same value more than - once, and the ``.entries`` of the ``sys.path`` WorkingSet should always - equal ``sys.path``.) - """ - self.entry_keys.setdefault(entry, []) - self.entries.append(entry) - for dist in find_distributions(entry, True): - self.add(dist, entry, False) - - def __contains__(self, dist): - """True if `dist` is the active distribution for its project""" - return self.by_key.get(dist.key) == dist - - def find(self, req): - """Find a distribution matching requirement `req` - - If there is an active distribution for the requested project, this - returns it as long as it meets the version requirement specified by - `req`. But, if there is an active distribution for the project and it - does *not* meet the `req` requirement, ``VersionConflict`` is raised. - If there is no active distribution for the requested project, ``None`` - is returned. - """ - dist = self.by_key.get(req.key) - - if dist is None: - canonical_key = self.normalized_to_canonical_keys.get(req.key) - - if canonical_key is not None: - req.key = canonical_key - dist = self.by_key.get(canonical_key) - - if dist is not None and dist not in req: - # XXX add more info - raise VersionConflict(dist, req) - return dist - - def iter_entry_points(self, group, name=None): - """Yield entry point objects from `group` matching `name` - - If `name` is None, yields all entry points in `group` from all - distributions in the working set, otherwise only ones matching - both `group` and `name` are yielded (in distribution order). - """ - return ( - entry - for dist in self - for entry in dist.get_entry_map(group).values() - if name is None or name == entry.name - ) - - def run_script(self, requires, script_name): - """Locate distribution for `requires` and run `script_name` script""" - ns = sys._getframe(1).f_globals - name = ns['__name__'] - ns.clear() - ns['__name__'] = name - self.require(requires)[0].run_script(script_name, ns) - - def __iter__(self): - """Yield distributions for non-duplicate projects in the working set - - The yield order is the order in which the items' path entries were - added to the working set. - """ - seen = {} - for item in self.entries: - if item not in self.entry_keys: - # workaround a cache issue - continue - - for key in self.entry_keys[item]: - if key not in seen: - seen[key] = 1 - yield self.by_key[key] - - def add(self, dist, entry=None, insert=True, replace=False): - """Add `dist` to working set, associated with `entry` - - If `entry` is unspecified, it defaults to the ``.location`` of `dist`. - On exit from this routine, `entry` is added to the end of the working - set's ``.entries`` (if it wasn't already present). - - `dist` is only added to the working set if it's for a project that - doesn't already have a distribution in the set, unless `replace=True`. - If it's added, any callbacks registered with the ``subscribe()`` method - will be called. - """ - if insert: - dist.insert_on(self.entries, entry, replace=replace) - - if entry is None: - entry = dist.location - keys = self.entry_keys.setdefault(entry, []) - keys2 = self.entry_keys.setdefault(dist.location, []) - if not replace and dist.key in self.by_key: - # ignore hidden distros - return - - self.by_key[dist.key] = dist - normalized_name = packaging.utils.canonicalize_name(dist.key) - self.normalized_to_canonical_keys[normalized_name] = dist.key - if dist.key not in keys: - keys.append(dist.key) - if dist.key not in keys2: - keys2.append(dist.key) - self._added_new(dist) - - def resolve( - self, - requirements, - env=None, - installer=None, - replace_conflicting=False, - extras=None, - ): - """List all distributions needed to (recursively) meet `requirements` - - `requirements` must be a sequence of ``Requirement`` objects. `env`, - if supplied, should be an ``Environment`` instance. If - not supplied, it defaults to all distributions available within any - entry or distribution in the working set. `installer`, if supplied, - will be invoked with each requirement that cannot be met by an - already-installed distribution; it should return a ``Distribution`` or - ``None``. - - Unless `replace_conflicting=True`, raises a VersionConflict exception - if - any requirements are found on the path that have the correct name but - the wrong version. Otherwise, if an `installer` is supplied it will be - invoked to obtain the correct version of the requirement and activate - it. - - `extras` is a list of the extras to be used with these requirements. - This is important because extra requirements may look like `my_req; - extra = "my_extra"`, which would otherwise be interpreted as a purely - optional requirement. Instead, we want to be able to assert that these - requirements are truly required. - """ - - # set up the stack - requirements = list(requirements)[::-1] - # set of processed requirements - processed = {} - # key -> dist - best = {} - to_activate = [] - - req_extras = _ReqExtras() - - # Mapping of requirement to set of distributions that required it; - # useful for reporting info about conflicts. - required_by = collections.defaultdict(set) - - while requirements: - # process dependencies breadth-first - req = requirements.pop(0) - if req in processed: - # Ignore cyclic or redundant dependencies - continue - - if not req_extras.markers_pass(req, extras): - continue - - dist = self._resolve_dist( - req, best, replace_conflicting, env, installer, required_by, to_activate - ) - - # push the new requirements onto the stack - new_requirements = dist.requires(req.extras)[::-1] - requirements.extend(new_requirements) - - # Register the new requirements needed by req - for new_requirement in new_requirements: - required_by[new_requirement].add(req.project_name) - req_extras[new_requirement] = req.extras - - processed[req] = True - - # return list of distros to activate - return to_activate - - def _resolve_dist( - self, req, best, replace_conflicting, env, installer, required_by, to_activate - ): - dist = best.get(req.key) - if dist is None: - # Find the best distribution and add it to the map - dist = self.by_key.get(req.key) - if dist is None or (dist not in req and replace_conflicting): - ws = self - if env is None: - if dist is None: - env = Environment(self.entries) - else: - # Use an empty environment and workingset to avoid - # any further conflicts with the conflicting - # distribution - env = Environment([]) - ws = WorkingSet([]) - dist = best[req.key] = env.best_match( - req, ws, installer, replace_conflicting=replace_conflicting - ) - if dist is None: - requirers = required_by.get(req, None) - raise DistributionNotFound(req, requirers) - to_activate.append(dist) - if dist not in req: - # Oops, the "best" so far conflicts with a dependency - dependent_req = required_by[req] - raise VersionConflict(dist, req).with_context(dependent_req) - return dist - - def find_plugins(self, plugin_env, full_env=None, installer=None, fallback=True): - """Find all activatable distributions in `plugin_env` - - Example usage:: - - distributions, errors = working_set.find_plugins( - Environment(plugin_dirlist) - ) - # add plugins+libs to sys.path - map(working_set.add, distributions) - # display errors - print('Could not load', errors) - - The `plugin_env` should be an ``Environment`` instance that contains - only distributions that are in the project's "plugin directory" or - directories. The `full_env`, if supplied, should be an ``Environment`` - contains all currently-available distributions. If `full_env` is not - supplied, one is created automatically from the ``WorkingSet`` this - method is called on, which will typically mean that every directory on - ``sys.path`` will be scanned for distributions. - - `installer` is a standard installer callback as used by the - ``resolve()`` method. The `fallback` flag indicates whether we should - attempt to resolve older versions of a plugin if the newest version - cannot be resolved. - - This method returns a 2-tuple: (`distributions`, `error_info`), where - `distributions` is a list of the distributions found in `plugin_env` - that were loadable, along with any other distributions that are needed - to resolve their dependencies. `error_info` is a dictionary mapping - unloadable plugin distributions to an exception instance describing the - error that occurred. Usually this will be a ``DistributionNotFound`` or - ``VersionConflict`` instance. - """ - - plugin_projects = list(plugin_env) - # scan project names in alphabetic order - plugin_projects.sort() - - error_info = {} - distributions = {} - - if full_env is None: - env = Environment(self.entries) - env += plugin_env - else: - env = full_env + plugin_env - - shadow_set = self.__class__([]) - # put all our entries in shadow_set - list(map(shadow_set.add, self)) - - for project_name in plugin_projects: - for dist in plugin_env[project_name]: - req = [dist.as_requirement()] - - try: - resolvees = shadow_set.resolve(req, env, installer) - - except ResolutionError as v: - # save error info - error_info[dist] = v - if fallback: - # try the next older version of project - continue - else: - # give up on this project, keep going - break - - else: - list(map(shadow_set.add, resolvees)) - distributions.update(dict.fromkeys(resolvees)) - - # success, no need to try any more versions of this project - break - - distributions = list(distributions) - distributions.sort() - - return distributions, error_info - - def require(self, *requirements): - """Ensure that distributions matching `requirements` are activated - - `requirements` must be a string or a (possibly-nested) sequence - thereof, specifying the distributions and versions required. The - return value is a sequence of the distributions that needed to be - activated to fulfill the requirements; all relevant distributions are - included, even if they were already activated in this working set. - """ - needed = self.resolve(parse_requirements(requirements)) - - for dist in needed: - self.add(dist) - - return needed - - def subscribe(self, callback, existing=True): - """Invoke `callback` for all distributions - - If `existing=True` (default), - call on all existing ones, as well. - """ - if callback in self.callbacks: - return - self.callbacks.append(callback) - if not existing: - return - for dist in self: - callback(dist) - - def _added_new(self, dist): - for callback in self.callbacks: - callback(dist) - - def __getstate__(self): - return ( - self.entries[:], - self.entry_keys.copy(), - self.by_key.copy(), - self.normalized_to_canonical_keys.copy(), - self.callbacks[:], - ) - - def __setstate__(self, e_k_b_n_c): - entries, keys, by_key, normalized_to_canonical_keys, callbacks = e_k_b_n_c - self.entries = entries[:] - self.entry_keys = keys.copy() - self.by_key = by_key.copy() - self.normalized_to_canonical_keys = normalized_to_canonical_keys.copy() - self.callbacks = callbacks[:] - - -class _ReqExtras(dict): - """ - Map each requirement to the extras that demanded it. - """ - - def markers_pass(self, req, extras=None): - """ - Evaluate markers for req against each extra that - demanded it. - - Return False if the req has a marker and fails - evaluation. Otherwise, return True. - """ - extra_evals = ( - req.marker.evaluate({'extra': extra}) - for extra in self.get(req, ()) + (extras or (None,)) - ) - return not req.marker or any(extra_evals) - - -class Environment: - """Searchable snapshot of distributions on a search path""" - - def __init__( - self, search_path=None, platform=get_supported_platform(), python=PY_MAJOR - ): - """Snapshot distributions available on a search path - - Any distributions found on `search_path` are added to the environment. - `search_path` should be a sequence of ``sys.path`` items. If not - supplied, ``sys.path`` is used. - - `platform` is an optional string specifying the name of the platform - that platform-specific distributions must be compatible with. If - unspecified, it defaults to the current platform. `python` is an - optional string naming the desired version of Python (e.g. ``'3.6'``); - it defaults to the current version. - - You may explicitly set `platform` (and/or `python`) to ``None`` if you - wish to map *all* distributions, not just those compatible with the - running platform or Python version. - """ - self._distmap = {} - self.platform = platform - self.python = python - self.scan(search_path) - - def can_add(self, dist): - """Is distribution `dist` acceptable for this environment? - - The distribution must match the platform and python version - requirements specified when this environment was created, or False - is returned. - """ - py_compat = ( - self.python is None - or dist.py_version is None - or dist.py_version == self.python - ) - return py_compat and compatible_platforms(dist.platform, self.platform) - - def remove(self, dist): - """Remove `dist` from the environment""" - self._distmap[dist.key].remove(dist) - - def scan(self, search_path=None): - """Scan `search_path` for distributions usable in this environment - - Any distributions found are added to the environment. - `search_path` should be a sequence of ``sys.path`` items. If not - supplied, ``sys.path`` is used. Only distributions conforming to - the platform/python version defined at initialization are added. - """ - if search_path is None: - search_path = sys.path - - for item in search_path: - for dist in find_distributions(item): - self.add(dist) - - def __getitem__(self, project_name): - """Return a newest-to-oldest list of distributions for `project_name` - - Uses case-insensitive `project_name` comparison, assuming all the - project's distributions use their project's name converted to all - lowercase as their key. - - """ - distribution_key = project_name.lower() - return self._distmap.get(distribution_key, []) - - def add(self, dist): - """Add `dist` if we ``can_add()`` it and it has not already been added""" - if self.can_add(dist) and dist.has_version(): - dists = self._distmap.setdefault(dist.key, []) - if dist not in dists: - dists.append(dist) - dists.sort(key=operator.attrgetter('hashcmp'), reverse=True) - - def best_match(self, req, working_set, installer=None, replace_conflicting=False): - """Find distribution best matching `req` and usable on `working_set` - - This calls the ``find(req)`` method of the `working_set` to see if a - suitable distribution is already active. (This may raise - ``VersionConflict`` if an unsuitable version of the project is already - active in the specified `working_set`.) If a suitable distribution - isn't active, this method returns the newest distribution in the - environment that meets the ``Requirement`` in `req`. If no suitable - distribution is found, and `installer` is supplied, then the result of - calling the environment's ``obtain(req, installer)`` method will be - returned. - """ - try: - dist = working_set.find(req) - except VersionConflict: - if not replace_conflicting: - raise - dist = None - if dist is not None: - return dist - for dist in self[req.key]: - if dist in req: - return dist - # try to download/install - return self.obtain(req, installer) - - def obtain(self, requirement, installer=None): - """Obtain a distribution matching `requirement` (e.g. via download) - - Obtain a distro that matches requirement (e.g. via download). In the - base ``Environment`` class, this routine just returns - ``installer(requirement)``, unless `installer` is None, in which case - None is returned instead. This method is a hook that allows subclasses - to attempt other ways of obtaining a distribution before falling back - to the `installer` argument.""" - if installer is not None: - return installer(requirement) - - def __iter__(self): - """Yield the unique project names of the available distributions""" - for key in self._distmap.keys(): - if self[key]: - yield key - - def __iadd__(self, other): - """In-place addition of a distribution or environment""" - if isinstance(other, Distribution): - self.add(other) - elif isinstance(other, Environment): - for project in other: - for dist in other[project]: - self.add(dist) - else: - raise TypeError("Can't add %r to environment" % (other,)) - return self - - def __add__(self, other): - """Add an environment or distribution to an environment""" - new = self.__class__([], platform=None, python=None) - for env in self, other: - new += env - return new - - -# XXX backward compatibility -AvailableDistributions = Environment - - -class ExtractionError(RuntimeError): - """An error occurred extracting a resource - - The following attributes are available from instances of this exception: - - manager - The resource manager that raised this exception - - cache_path - The base directory for resource extraction - - original_error - The exception instance that caused extraction to fail - """ - - -class ResourceManager: - """Manage resource extraction and packages""" - - extraction_path = None - - def __init__(self): - self.cached_files = {} - - def resource_exists(self, package_or_requirement, resource_name): - """Does the named resource exist?""" - return get_provider(package_or_requirement).has_resource(resource_name) - - def resource_isdir(self, package_or_requirement, resource_name): - """Is the named resource an existing directory?""" - return get_provider(package_or_requirement).resource_isdir(resource_name) - - def resource_filename(self, package_or_requirement, resource_name): - """Return a true filesystem path for specified resource""" - return get_provider(package_or_requirement).get_resource_filename( - self, resource_name - ) - - def resource_stream(self, package_or_requirement, resource_name): - """Return a readable file-like object for specified resource""" - return get_provider(package_or_requirement).get_resource_stream( - self, resource_name - ) - - def resource_string(self, package_or_requirement, resource_name): - """Return specified resource as a string""" - return get_provider(package_or_requirement).get_resource_string( - self, resource_name - ) - - def resource_listdir(self, package_or_requirement, resource_name): - """List the contents of the named resource directory""" - return get_provider(package_or_requirement).resource_listdir(resource_name) - - def extraction_error(self): - """Give an error message for problems extracting file(s)""" - - old_exc = sys.exc_info()[1] - cache_path = self.extraction_path or get_default_cache() - - tmpl = textwrap.dedent( - """ - Can't extract file(s) to egg cache - - The following error occurred while trying to extract file(s) - to the Python egg cache: - - {old_exc} - - The Python egg cache directory is currently set to: - - {cache_path} - - Perhaps your account does not have write access to this directory? - You can change the cache directory by setting the PYTHON_EGG_CACHE - environment variable to point to an accessible directory. - """ - ).lstrip() - err = ExtractionError(tmpl.format(**locals())) - err.manager = self - err.cache_path = cache_path - err.original_error = old_exc - raise err - - def get_cache_path(self, archive_name, names=()): - """Return absolute location in cache for `archive_name` and `names` - - The parent directory of the resulting path will be created if it does - not already exist. `archive_name` should be the base filename of the - enclosing egg (which may not be the name of the enclosing zipfile!), - including its ".egg" extension. `names`, if provided, should be a - sequence of path name parts "under" the egg's extraction location. - - This method should only be called by resource providers that need to - obtain an extraction location, and only for names they intend to - extract, as it tracks the generated names for possible cleanup later. - """ - extract_path = self.extraction_path or get_default_cache() - target_path = os.path.join(extract_path, archive_name + '-tmp', *names) - try: - _bypass_ensure_directory(target_path) - except Exception: - self.extraction_error() - - self._warn_unsafe_extraction_path(extract_path) - - self.cached_files[target_path] = 1 - return target_path - - @staticmethod - def _warn_unsafe_extraction_path(path): - """ - If the default extraction path is overridden and set to an insecure - location, such as /tmp, it opens up an opportunity for an attacker to - replace an extracted file with an unauthorized payload. Warn the user - if a known insecure location is used. - - See Distribute #375 for more details. - """ - if os.name == 'nt' and not path.startswith(os.environ['windir']): - # On Windows, permissions are generally restrictive by default - # and temp directories are not writable by other users, so - # bypass the warning. - return - mode = os.stat(path).st_mode - if mode & stat.S_IWOTH or mode & stat.S_IWGRP: - msg = ( - "Extraction path is writable by group/others " - "and vulnerable to attack when " - "used with get_resource_filename ({path}). " - "Consider a more secure " - "location (set with .set_extraction_path or the " - "PYTHON_EGG_CACHE environment variable)." - ).format(**locals()) - warnings.warn(msg, UserWarning) - - def postprocess(self, tempname, filename): - """Perform any platform-specific postprocessing of `tempname` - - This is where Mac header rewrites should be done; other platforms don't - have anything special they should do. - - Resource providers should call this method ONLY after successfully - extracting a compressed resource. They must NOT call it on resources - that are already in the filesystem. - - `tempname` is the current (temporary) name of the file, and `filename` - is the name it will be renamed to by the caller after this routine - returns. - """ - - if os.name == 'posix': - # Make the resource executable - mode = ((os.stat(tempname).st_mode) | 0o555) & 0o7777 - os.chmod(tempname, mode) - - def set_extraction_path(self, path): - """Set the base path where resources will be extracted to, if needed. - - If you do not call this routine before any extractions take place, the - path defaults to the return value of ``get_default_cache()``. (Which - is based on the ``PYTHON_EGG_CACHE`` environment variable, with various - platform-specific fallbacks. See that routine's documentation for more - details.) - - Resources are extracted to subdirectories of this path based upon - information given by the ``IResourceProvider``. You may set this to a - temporary directory, but then you must call ``cleanup_resources()`` to - delete the extracted files when done. There is no guarantee that - ``cleanup_resources()`` will be able to remove all extracted files. - - (Note: you may not change the extraction path for a given resource - manager once resources have been extracted, unless you first call - ``cleanup_resources()``.) - """ - if self.cached_files: - raise ValueError("Can't change extraction path, files already extracted") - - self.extraction_path = path - - def cleanup_resources(self, force=False): - """ - Delete all extracted resource files and directories, returning a list - of the file and directory names that could not be successfully removed. - This function does not have any concurrency protection, so it should - generally only be called when the extraction path is a temporary - directory exclusive to a single process. This method is not - automatically called; you must call it explicitly or register it as an - ``atexit`` function if you wish to ensure cleanup of a temporary - directory used for extractions. - """ - # XXX - - -def get_default_cache(): - """ - Return the ``PYTHON_EGG_CACHE`` environment variable - or a platform-relevant user cache dir for an app - named "Python-Eggs". - """ - return os.environ.get('PYTHON_EGG_CACHE') or platformdirs.user_cache_dir( - appname='Python-Eggs' - ) - - -def safe_name(name): - """Convert an arbitrary string to a standard distribution name - - Any runs of non-alphanumeric/. characters are replaced with a single '-'. - """ - return re.sub('[^A-Za-z0-9.]+', '-', name) - - -def safe_version(version): - """ - Convert an arbitrary string to a standard version string - """ - try: - # normalize the version - return str(packaging.version.Version(version)) - except packaging.version.InvalidVersion: - version = version.replace(' ', '.') - return re.sub('[^A-Za-z0-9.]+', '-', version) - - -def _forgiving_version(version): - """Fallback when ``safe_version`` is not safe enough - >>> parse_version(_forgiving_version('0.23ubuntu1')) - <Version('0.23.dev0+sanitized.ubuntu1')> - >>> parse_version(_forgiving_version('0.23-')) - <Version('0.23.dev0+sanitized')> - >>> parse_version(_forgiving_version('0.-_')) - <Version('0.dev0+sanitized')> - >>> parse_version(_forgiving_version('42.+?1')) - <Version('42.dev0+sanitized.1')> - >>> parse_version(_forgiving_version('hello world')) - <Version('0.dev0+sanitized.hello.world')> - """ - version = version.replace(' ', '.') - match = _PEP440_FALLBACK.search(version) - if match: - safe = match["safe"] - rest = version[len(safe):] - else: - safe = "0" - rest = version - local = f"sanitized.{_safe_segment(rest)}".strip(".") - return f"{safe}.dev0+{local}" - - -def _safe_segment(segment): - """Convert an arbitrary string into a safe segment""" - segment = re.sub('[^A-Za-z0-9.]+', '-', segment) - segment = re.sub('-[^A-Za-z0-9]+', '-', segment) - return re.sub(r'\.[^A-Za-z0-9]+', '.', segment).strip(".-") - - -def safe_extra(extra): - """Convert an arbitrary string to a standard 'extra' name - - Any runs of non-alphanumeric characters are replaced with a single '_', - and the result is always lowercased. - """ - return re.sub('[^A-Za-z0-9.-]+', '_', extra).lower() - - -def to_filename(name): - """Convert a project or version name to its filename-escaped form - - Any '-' characters are currently replaced with '_'. - """ - return name.replace('-', '_') - - -def invalid_marker(text): - """ - Validate text as a PEP 508 environment marker; return an exception - if invalid or False otherwise. - """ - try: - evaluate_marker(text) - except SyntaxError as e: - e.filename = None - e.lineno = None - return e - return False - - -def evaluate_marker(text, extra=None): - """ - Evaluate a PEP 508 environment marker. - Return a boolean indicating the marker result in this environment. - Raise SyntaxError if marker is invalid. - - This implementation uses the 'pyparsing' module. - """ - try: - marker = packaging.markers.Marker(text) - return marker.evaluate() - except packaging.markers.InvalidMarker as e: - raise SyntaxError(e) from e - - -class NullProvider: - """Try to implement resources and metadata for arbitrary PEP 302 loaders""" - - egg_name = None - egg_info = None - loader = None - - def __init__(self, module): - self.loader = getattr(module, '__loader__', None) - self.module_path = os.path.dirname(getattr(module, '__file__', '')) - - def get_resource_filename(self, manager, resource_name): - return self._fn(self.module_path, resource_name) - - def get_resource_stream(self, manager, resource_name): - return io.BytesIO(self.get_resource_string(manager, resource_name)) - - def get_resource_string(self, manager, resource_name): - return self._get(self._fn(self.module_path, resource_name)) - - def has_resource(self, resource_name): - return self._has(self._fn(self.module_path, resource_name)) - - def _get_metadata_path(self, name): - return self._fn(self.egg_info, name) - - def has_metadata(self, name): - if not self.egg_info: - return self.egg_info - - path = self._get_metadata_path(name) - return self._has(path) - - def get_metadata(self, name): - if not self.egg_info: - return "" - path = self._get_metadata_path(name) - value = self._get(path) - try: - return value.decode('utf-8') - except UnicodeDecodeError as exc: - # Include the path in the error message to simplify - # troubleshooting, and without changing the exception type. - exc.reason += ' in {} file at path: {}'.format(name, path) - raise - - def get_metadata_lines(self, name): - return yield_lines(self.get_metadata(name)) - - def resource_isdir(self, resource_name): - return self._isdir(self._fn(self.module_path, resource_name)) - - def metadata_isdir(self, name): - return self.egg_info and self._isdir(self._fn(self.egg_info, name)) - - def resource_listdir(self, resource_name): - return self._listdir(self._fn(self.module_path, resource_name)) - - def metadata_listdir(self, name): - if self.egg_info: - return self._listdir(self._fn(self.egg_info, name)) - return [] - - def run_script(self, script_name, namespace): - script = 'scripts/' + script_name - if not self.has_metadata(script): - raise ResolutionError( - "Script {script!r} not found in metadata at {self.egg_info!r}".format( - **locals() - ), - ) - script_text = self.get_metadata(script).replace('\r\n', '\n') - script_text = script_text.replace('\r', '\n') - script_filename = self._fn(self.egg_info, script) - namespace['__file__'] = script_filename - if os.path.exists(script_filename): - with open(script_filename) as fid: - source = fid.read() - code = compile(source, script_filename, 'exec') - exec(code, namespace, namespace) - else: - from linecache import cache - - cache[script_filename] = ( - len(script_text), - 0, - script_text.split('\n'), - script_filename, - ) - script_code = compile(script_text, script_filename, 'exec') - exec(script_code, namespace, namespace) - - def _has(self, path): - raise NotImplementedError( - "Can't perform this operation for unregistered loader type" - ) - - def _isdir(self, path): - raise NotImplementedError( - "Can't perform this operation for unregistered loader type" - ) - - def _listdir(self, path): - raise NotImplementedError( - "Can't perform this operation for unregistered loader type" - ) - - def _fn(self, base, resource_name): - self._validate_resource_path(resource_name) - if resource_name: - return os.path.join(base, *resource_name.split('/')) - return base - - @staticmethod - def _validate_resource_path(path): - """ - Validate the resource paths according to the docs. - https://setuptools.pypa.io/en/latest/pkg_resources.html#basic-resource-access - - >>> warned = getfixture('recwarn') - >>> warnings.simplefilter('always') - >>> vrp = NullProvider._validate_resource_path - >>> vrp('foo/bar.txt') - >>> bool(warned) - False - >>> vrp('../foo/bar.txt') - >>> bool(warned) - True - >>> warned.clear() - >>> vrp('/foo/bar.txt') - >>> bool(warned) - True - >>> vrp('foo/../../bar.txt') - >>> bool(warned) - True - >>> warned.clear() - >>> vrp('foo/f../bar.txt') - >>> bool(warned) - False - - Windows path separators are straight-up disallowed. - >>> vrp(r'\\foo/bar.txt') - Traceback (most recent call last): - ... - ValueError: Use of .. or absolute path in a resource path \ -is not allowed. - - >>> vrp(r'C:\\foo/bar.txt') - Traceback (most recent call last): - ... - ValueError: Use of .. or absolute path in a resource path \ -is not allowed. - - Blank values are allowed - - >>> vrp('') - >>> bool(warned) - False - - Non-string values are not. - - >>> vrp(None) - Traceback (most recent call last): - ... - AttributeError: ... - """ - invalid = ( - os.path.pardir in path.split(posixpath.sep) - or posixpath.isabs(path) - or ntpath.isabs(path) - ) - if not invalid: - return - - msg = "Use of .. or absolute path in a resource path is not allowed." - - # Aggressively disallow Windows absolute paths - if ntpath.isabs(path) and not posixpath.isabs(path): - raise ValueError(msg) - - # for compatibility, warn; in future - # raise ValueError(msg) - issue_warning( - msg[:-1] + " and will raise exceptions in a future release.", - DeprecationWarning, - ) - - def _get(self, path): - if hasattr(self.loader, 'get_data'): - return self.loader.get_data(path) - raise NotImplementedError( - "Can't perform this operation for loaders without 'get_data()'" - ) - - -register_loader_type(object, NullProvider) - - -def _parents(path): - """ - yield all parents of path including path - """ - last = None - while path != last: - yield path - last = path - path, _ = os.path.split(path) - - -class EggProvider(NullProvider): - """Provider based on a virtual filesystem""" - - def __init__(self, module): - super().__init__(module) - self._setup_prefix() - - def _setup_prefix(self): - # Assume that metadata may be nested inside a "basket" - # of multiple eggs and use module_path instead of .archive. - eggs = filter(_is_egg_path, _parents(self.module_path)) - egg = next(eggs, None) - egg and self._set_egg(egg) - - def _set_egg(self, path): - self.egg_name = os.path.basename(path) - self.egg_info = os.path.join(path, 'EGG-INFO') - self.egg_root = path - - -class DefaultProvider(EggProvider): - """Provides access to package resources in the filesystem""" - - def _has(self, path): - return os.path.exists(path) - - def _isdir(self, path): - return os.path.isdir(path) - - def _listdir(self, path): - return os.listdir(path) - - def get_resource_stream(self, manager, resource_name): - return open(self._fn(self.module_path, resource_name), 'rb') - - def _get(self, path): - with open(path, 'rb') as stream: - return stream.read() - - @classmethod - def _register(cls): - loader_names = ( - 'SourceFileLoader', - 'SourcelessFileLoader', - ) - for name in loader_names: - loader_cls = getattr(importlib_machinery, name, type(None)) - register_loader_type(loader_cls, cls) - - -DefaultProvider._register() - - -class EmptyProvider(NullProvider): - """Provider that returns nothing for all requests""" - - module_path = None - - _isdir = _has = lambda self, path: False - - def _get(self, path): - return '' - - def _listdir(self, path): - return [] - - def __init__(self): - pass - - -empty_provider = EmptyProvider() - - -class ZipManifests(dict): - """ - zip manifest builder - """ - - @classmethod - def build(cls, path): - """ - Build a dictionary similar to the zipimport directory - caches, except instead of tuples, store ZipInfo objects. - - Use a platform-specific path separator (os.sep) for the path keys - for compatibility with pypy on Windows. - """ - with zipfile.ZipFile(path) as zfile: - items = ( - ( - name.replace('/', os.sep), - zfile.getinfo(name), - ) - for name in zfile.namelist() - ) - return dict(items) - - load = build - - -class MemoizedZipManifests(ZipManifests): - """ - Memoized zipfile manifests. - """ - - manifest_mod = collections.namedtuple('manifest_mod', 'manifest mtime') - - def load(self, path): - """ - Load a manifest at path or return a suitable manifest already loaded. - """ - path = os.path.normpath(path) - mtime = os.stat(path).st_mtime - - if path not in self or self[path].mtime != mtime: - manifest = self.build(path) - self[path] = self.manifest_mod(manifest, mtime) - - return self[path].manifest - - -class ZipProvider(EggProvider): - """Resource support for zips and eggs""" - - eagers = None - _zip_manifests = MemoizedZipManifests() - - def __init__(self, module): - super().__init__(module) - self.zip_pre = self.loader.archive + os.sep - - def _zipinfo_name(self, fspath): - # Convert a virtual filename (full path to file) into a zipfile subpath - # usable with the zipimport directory cache for our target archive - fspath = fspath.rstrip(os.sep) - if fspath == self.loader.archive: - return '' - if fspath.startswith(self.zip_pre): - return fspath[len(self.zip_pre) :] - raise AssertionError("%s is not a subpath of %s" % (fspath, self.zip_pre)) - - def _parts(self, zip_path): - # Convert a zipfile subpath into an egg-relative path part list. - # pseudo-fs path - fspath = self.zip_pre + zip_path - if fspath.startswith(self.egg_root + os.sep): - return fspath[len(self.egg_root) + 1 :].split(os.sep) - raise AssertionError("%s is not a subpath of %s" % (fspath, self.egg_root)) - - @property - def zipinfo(self): - return self._zip_manifests.load(self.loader.archive) - - def get_resource_filename(self, manager, resource_name): - if not self.egg_name: - raise NotImplementedError( - "resource_filename() only supported for .egg, not .zip" - ) - # no need to lock for extraction, since we use temp names - zip_path = self._resource_to_zip(resource_name) - eagers = self._get_eager_resources() - if '/'.join(self._parts(zip_path)) in eagers: - for name in eagers: - self._extract_resource(manager, self._eager_to_zip(name)) - return self._extract_resource(manager, zip_path) - - @staticmethod - def _get_date_and_size(zip_stat): - size = zip_stat.file_size - # ymdhms+wday, yday, dst - date_time = zip_stat.date_time + (0, 0, -1) - # 1980 offset already done - timestamp = time.mktime(date_time) - return timestamp, size - - # FIXME: 'ZipProvider._extract_resource' is too complex (12) - def _extract_resource(self, manager, zip_path): # noqa: C901 - if zip_path in self._index(): - for name in self._index()[zip_path]: - last = self._extract_resource(manager, os.path.join(zip_path, name)) - # return the extracted directory name - return os.path.dirname(last) - - timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) - - if not WRITE_SUPPORT: - raise IOError( - '"os.rename" and "os.unlink" are not supported ' 'on this platform' - ) - try: - real_path = manager.get_cache_path(self.egg_name, self._parts(zip_path)) - - if self._is_current(real_path, zip_path): - return real_path - - outf, tmpnam = _mkstemp( - ".$extract", - dir=os.path.dirname(real_path), - ) - os.write(outf, self.loader.get_data(zip_path)) - os.close(outf) - utime(tmpnam, (timestamp, timestamp)) - manager.postprocess(tmpnam, real_path) - - try: - rename(tmpnam, real_path) - - except os.error: - if os.path.isfile(real_path): - if self._is_current(real_path, zip_path): - # the file became current since it was checked above, - # so proceed. - return real_path - # Windows, del old file and retry - elif os.name == 'nt': - unlink(real_path) - rename(tmpnam, real_path) - return real_path - raise - - except os.error: - # report a user-friendly error - manager.extraction_error() - - return real_path - - def _is_current(self, file_path, zip_path): - """ - Return True if the file_path is current for this zip_path - """ - timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) - if not os.path.isfile(file_path): - return False - stat = os.stat(file_path) - if stat.st_size != size or stat.st_mtime != timestamp: - return False - # check that the contents match - zip_contents = self.loader.get_data(zip_path) - with open(file_path, 'rb') as f: - file_contents = f.read() - return zip_contents == file_contents - - def _get_eager_resources(self): - if self.eagers is None: - eagers = [] - for name in ('native_libs.txt', 'eager_resources.txt'): - if self.has_metadata(name): - eagers.extend(self.get_metadata_lines(name)) - self.eagers = eagers - return self.eagers - - def _index(self): - try: - return self._dirindex - except AttributeError: - ind = {} - for path in self.zipinfo: - parts = path.split(os.sep) - while parts: - parent = os.sep.join(parts[:-1]) - if parent in ind: - ind[parent].append(parts[-1]) - break - else: - ind[parent] = [parts.pop()] - self._dirindex = ind - return ind - - def _has(self, fspath): - zip_path = self._zipinfo_name(fspath) - return zip_path in self.zipinfo or zip_path in self._index() - - def _isdir(self, fspath): - return self._zipinfo_name(fspath) in self._index() - - def _listdir(self, fspath): - return list(self._index().get(self._zipinfo_name(fspath), ())) - - def _eager_to_zip(self, resource_name): - return self._zipinfo_name(self._fn(self.egg_root, resource_name)) - - def _resource_to_zip(self, resource_name): - return self._zipinfo_name(self._fn(self.module_path, resource_name)) - - -register_loader_type(zipimport.zipimporter, ZipProvider) - - -class FileMetadata(EmptyProvider): - """Metadata handler for standalone PKG-INFO files - - Usage:: - - metadata = FileMetadata("/path/to/PKG-INFO") - - This provider rejects all data and metadata requests except for PKG-INFO, - which is treated as existing, and will be the contents of the file at - the provided location. - """ - - def __init__(self, path): - self.path = path - - def _get_metadata_path(self, name): - return self.path - - def has_metadata(self, name): - return name == 'PKG-INFO' and os.path.isfile(self.path) - - def get_metadata(self, name): - if name != 'PKG-INFO': - raise KeyError("No metadata except PKG-INFO is available") - - with io.open(self.path, encoding='utf-8', errors="replace") as f: - metadata = f.read() - self._warn_on_replacement(metadata) - return metadata - - def _warn_on_replacement(self, metadata): - replacement_char = '�' - if replacement_char in metadata: - tmpl = "{self.path} could not be properly decoded in UTF-8" - msg = tmpl.format(**locals()) - warnings.warn(msg) - - def get_metadata_lines(self, name): - return yield_lines(self.get_metadata(name)) - - -class PathMetadata(DefaultProvider): - """Metadata provider for egg directories - - Usage:: - - # Development eggs: - - egg_info = "/path/to/PackageName.egg-info" - base_dir = os.path.dirname(egg_info) - metadata = PathMetadata(base_dir, egg_info) - dist_name = os.path.splitext(os.path.basename(egg_info))[0] - dist = Distribution(basedir, project_name=dist_name, metadata=metadata) - - # Unpacked egg directories: - - egg_path = "/path/to/PackageName-ver-pyver-etc.egg" - metadata = PathMetadata(egg_path, os.path.join(egg_path,'EGG-INFO')) - dist = Distribution.from_filename(egg_path, metadata=metadata) - """ - - def __init__(self, path, egg_info): - self.module_path = path - self.egg_info = egg_info - - -class EggMetadata(ZipProvider): - """Metadata provider for .egg files""" - - def __init__(self, importer): - """Create a metadata provider from a zipimporter""" - - self.zip_pre = importer.archive + os.sep - self.loader = importer - if importer.prefix: - self.module_path = os.path.join(importer.archive, importer.prefix) - else: - self.module_path = importer.archive - self._setup_prefix() - - -_declare_state('dict', _distribution_finders={}) - - -def register_finder(importer_type, distribution_finder): - """Register `distribution_finder` to find distributions in sys.path items - - `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item - handler), and `distribution_finder` is a callable that, passed a path - item and the importer instance, yields ``Distribution`` instances found on - that path item. See ``pkg_resources.find_on_path`` for an example.""" - _distribution_finders[importer_type] = distribution_finder - - -def find_distributions(path_item, only=False): - """Yield distributions accessible via `path_item`""" - importer = get_importer(path_item) - finder = _find_adapter(_distribution_finders, importer) - return finder(importer, path_item, only) - - -def find_eggs_in_zip(importer, path_item, only=False): - """ - Find eggs in zip files; possibly multiple nested eggs. - """ - if importer.archive.endswith('.whl'): - # wheels are not supported with this finder - # they don't have PKG-INFO metadata, and won't ever contain eggs - return - metadata = EggMetadata(importer) - if metadata.has_metadata('PKG-INFO'): - yield Distribution.from_filename(path_item, metadata=metadata) - if only: - # don't yield nested distros - return - for subitem in metadata.resource_listdir(''): - if _is_egg_path(subitem): - subpath = os.path.join(path_item, subitem) - dists = find_eggs_in_zip(zipimport.zipimporter(subpath), subpath) - for dist in dists: - yield dist - elif subitem.lower().endswith(('.dist-info', '.egg-info')): - subpath = os.path.join(path_item, subitem) - submeta = EggMetadata(zipimport.zipimporter(subpath)) - submeta.egg_info = subpath - yield Distribution.from_location(path_item, subitem, submeta) - - -register_finder(zipimport.zipimporter, find_eggs_in_zip) - - -def find_nothing(importer, path_item, only=False): - return () - - -register_finder(object, find_nothing) - - -def find_on_path(importer, path_item, only=False): - """Yield distributions accessible on a sys.path directory""" - path_item = _normalize_cached(path_item) - - if _is_unpacked_egg(path_item): - yield Distribution.from_filename( - path_item, - metadata=PathMetadata(path_item, os.path.join(path_item, 'EGG-INFO')), - ) - return - - entries = (os.path.join(path_item, child) for child in safe_listdir(path_item)) - - # scan for .egg and .egg-info in directory - for entry in sorted(entries): - fullpath = os.path.join(path_item, entry) - factory = dist_factory(path_item, entry, only) - for dist in factory(fullpath): - yield dist - - -def dist_factory(path_item, entry, only): - """Return a dist_factory for the given entry.""" - lower = entry.lower() - is_egg_info = lower.endswith('.egg-info') - is_dist_info = lower.endswith('.dist-info') and os.path.isdir( - os.path.join(path_item, entry) - ) - is_meta = is_egg_info or is_dist_info - return ( - distributions_from_metadata - if is_meta - else find_distributions - if not only and _is_egg_path(entry) - else resolve_egg_link - if not only and lower.endswith('.egg-link') - else NoDists() - ) - - -class NoDists: - """ - >>> bool(NoDists()) - False - - >>> list(NoDists()('anything')) - [] - """ - - def __bool__(self): - return False - - def __call__(self, fullpath): - return iter(()) - - -def safe_listdir(path): - """ - Attempt to list contents of path, but suppress some exceptions. - """ - try: - return os.listdir(path) - except (PermissionError, NotADirectoryError): - pass - except OSError as e: - # Ignore the directory if does not exist, not a directory or - # permission denied - if e.errno not in (errno.ENOTDIR, errno.EACCES, errno.ENOENT): - raise - return () - - -def distributions_from_metadata(path): - root = os.path.dirname(path) - if os.path.isdir(path): - if len(os.listdir(path)) == 0: - # empty metadata dir; skip - return - metadata = PathMetadata(root, path) - else: - metadata = FileMetadata(path) - entry = os.path.basename(path) - yield Distribution.from_location( - root, - entry, - metadata, - precedence=DEVELOP_DIST, - ) - - -def non_empty_lines(path): - """ - Yield non-empty lines from file at path - """ - with open(path) as f: - for line in f: - line = line.strip() - if line: - yield line - - -def resolve_egg_link(path): - """ - Given a path to an .egg-link, resolve distributions - present in the referenced path. - """ - referenced_paths = non_empty_lines(path) - resolved_paths = ( - os.path.join(os.path.dirname(path), ref) for ref in referenced_paths - ) - dist_groups = map(find_distributions, resolved_paths) - return next(dist_groups, ()) - - -if hasattr(pkgutil, 'ImpImporter'): - register_finder(pkgutil.ImpImporter, find_on_path) - -register_finder(importlib_machinery.FileFinder, find_on_path) - -_declare_state('dict', _namespace_handlers={}) -_declare_state('dict', _namespace_packages={}) - - -def register_namespace_handler(importer_type, namespace_handler): - """Register `namespace_handler` to declare namespace packages - - `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item - handler), and `namespace_handler` is a callable like this:: - - def namespace_handler(importer, path_entry, moduleName, module): - # return a path_entry to use for child packages - - Namespace handlers are only called if the importer object has already - agreed that it can handle the relevant path item, and they should only - return a subpath if the module __path__ does not already contain an - equivalent subpath. For an example namespace handler, see - ``pkg_resources.file_ns_handler``. - """ - _namespace_handlers[importer_type] = namespace_handler - - -def _handle_ns(packageName, path_item): - """Ensure that named package includes a subpath of path_item (if needed)""" - - importer = get_importer(path_item) - if importer is None: - return None - - # use find_spec (PEP 451) and fall-back to find_module (PEP 302) - try: - spec = importer.find_spec(packageName) - except AttributeError: - # capture warnings due to #1111 - with warnings.catch_warnings(): - warnings.simplefilter("ignore") - loader = importer.find_module(packageName) - else: - loader = spec.loader if spec else None - - if loader is None: - return None - module = sys.modules.get(packageName) - if module is None: - module = sys.modules[packageName] = types.ModuleType(packageName) - module.__path__ = [] - _set_parent_ns(packageName) - elif not hasattr(module, '__path__'): - raise TypeError("Not a package:", packageName) - handler = _find_adapter(_namespace_handlers, importer) - subpath = handler(importer, path_item, packageName, module) - if subpath is not None: - path = module.__path__ - path.append(subpath) - importlib.import_module(packageName) - _rebuild_mod_path(path, packageName, module) - return subpath - - -def _rebuild_mod_path(orig_path, package_name, module): - """ - Rebuild module.__path__ ensuring that all entries are ordered - corresponding to their sys.path order - """ - sys_path = [_normalize_cached(p) for p in sys.path] - - def safe_sys_path_index(entry): - """ - Workaround for #520 and #513. - """ - try: - return sys_path.index(entry) - except ValueError: - return float('inf') - - def position_in_sys_path(path): - """ - Return the ordinal of the path based on its position in sys.path - """ - path_parts = path.split(os.sep) - module_parts = package_name.count('.') + 1 - parts = path_parts[:-module_parts] - return safe_sys_path_index(_normalize_cached(os.sep.join(parts))) - - new_path = sorted(orig_path, key=position_in_sys_path) - new_path = [_normalize_cached(p) for p in new_path] - - if isinstance(module.__path__, list): - module.__path__[:] = new_path - else: - module.__path__ = new_path - - -def declare_namespace(packageName): - """Declare that package 'packageName' is a namespace package""" - - msg = ( - f"Deprecated call to `pkg_resources.declare_namespace({packageName!r})`.\n" - "Implementing implicit namespace packages (as specified in PEP 420) " - "is preferred to `pkg_resources.declare_namespace`. " - "See https://setuptools.pypa.io/en/latest/references/" - "keywords.html#keyword-namespace-packages" - ) - warnings.warn(msg, DeprecationWarning, stacklevel=2) - - _imp.acquire_lock() - try: - if packageName in _namespace_packages: - return - - path = sys.path - parent, _, _ = packageName.rpartition('.') - - if parent: - declare_namespace(parent) - if parent not in _namespace_packages: - __import__(parent) - try: - path = sys.modules[parent].__path__ - except AttributeError as e: - raise TypeError("Not a package:", parent) from e - - # Track what packages are namespaces, so when new path items are added, - # they can be updated - _namespace_packages.setdefault(parent or None, []).append(packageName) - _namespace_packages.setdefault(packageName, []) - - for path_item in path: - # Ensure all the parent's path items are reflected in the child, - # if they apply - _handle_ns(packageName, path_item) - - finally: - _imp.release_lock() - - -def fixup_namespace_packages(path_item, parent=None): - """Ensure that previously-declared namespace packages include path_item""" - _imp.acquire_lock() - try: - for package in _namespace_packages.get(parent, ()): - subpath = _handle_ns(package, path_item) - if subpath: - fixup_namespace_packages(subpath, package) - finally: - _imp.release_lock() - - -def file_ns_handler(importer, path_item, packageName, module): - """Compute an ns-package subpath for a filesystem or zipfile importer""" - - subpath = os.path.join(path_item, packageName.split('.')[-1]) - normalized = _normalize_cached(subpath) - for item in module.__path__: - if _normalize_cached(item) == normalized: - break - else: - # Only return the path if it's not already there - return subpath - - -if hasattr(pkgutil, 'ImpImporter'): - register_namespace_handler(pkgutil.ImpImporter, file_ns_handler) - -register_namespace_handler(zipimport.zipimporter, file_ns_handler) -register_namespace_handler(importlib_machinery.FileFinder, file_ns_handler) - - -def null_ns_handler(importer, path_item, packageName, module): - return None - - -register_namespace_handler(object, null_ns_handler) - - -def normalize_path(filename): - """Normalize a file/dir name for comparison purposes""" - return os.path.normcase(os.path.realpath(os.path.normpath(_cygwin_patch(filename)))) - - -def _cygwin_patch(filename): # pragma: nocover - """ - Contrary to POSIX 2008, on Cygwin, getcwd (3) contains - symlink components. Using - os.path.abspath() works around this limitation. A fix in os.getcwd() - would probably better, in Cygwin even more so, except - that this seems to be by design... - """ - return os.path.abspath(filename) if sys.platform == 'cygwin' else filename - - -def _normalize_cached(filename, _cache={}): - try: - return _cache[filename] - except KeyError: - _cache[filename] = result = normalize_path(filename) - return result - - -def _is_egg_path(path): - """ - Determine if given path appears to be an egg. - """ - return _is_zip_egg(path) or _is_unpacked_egg(path) - - -def _is_zip_egg(path): - return ( - path.lower().endswith('.egg') - and os.path.isfile(path) - and zipfile.is_zipfile(path) - ) - - -def _is_unpacked_egg(path): - """ - Determine if given path appears to be an unpacked egg. - """ - return path.lower().endswith('.egg') and os.path.isfile( - os.path.join(path, 'EGG-INFO', 'PKG-INFO') - ) - - -def _set_parent_ns(packageName): - parts = packageName.split('.') - name = parts.pop() - if parts: - parent = '.'.join(parts) - setattr(sys.modules[parent], name, sys.modules[packageName]) - - -MODULE = re.compile(r"\w+(\.\w+)*$").match -EGG_NAME = re.compile( - r""" - (?P<name>[^-]+) ( - -(?P<ver>[^-]+) ( - -py(?P<pyver>[^-]+) ( - -(?P<plat>.+) - )? - )? - )? - """, - re.VERBOSE | re.IGNORECASE, -).match - - -class EntryPoint: - """Object representing an advertised importable object""" - - def __init__(self, name, module_name, attrs=(), extras=(), dist=None): - if not MODULE(module_name): - raise ValueError("Invalid module name", module_name) - self.name = name - self.module_name = module_name - self.attrs = tuple(attrs) - self.extras = tuple(extras) - self.dist = dist - - def __str__(self): - s = "%s = %s" % (self.name, self.module_name) - if self.attrs: - s += ':' + '.'.join(self.attrs) - if self.extras: - s += ' [%s]' % ','.join(self.extras) - return s - - def __repr__(self): - return "EntryPoint.parse(%r)" % str(self) - - def load(self, require=True, *args, **kwargs): - """ - Require packages for this EntryPoint, then resolve it. - """ - if not require or args or kwargs: - warnings.warn( - "Parameters to load are deprecated. Call .resolve and " - ".require separately.", - PkgResourcesDeprecationWarning, - stacklevel=2, - ) - if require: - self.require(*args, **kwargs) - return self.resolve() - - def resolve(self): - """ - Resolve the entry point from its module and attrs. - """ - module = __import__(self.module_name, fromlist=['__name__'], level=0) - try: - return functools.reduce(getattr, self.attrs, module) - except AttributeError as exc: - raise ImportError(str(exc)) from exc - - def require(self, env=None, installer=None): - if self.extras and not self.dist: - raise UnknownExtra("Can't require() without a distribution", self) - - # Get the requirements for this entry point with all its extras and - # then resolve them. We have to pass `extras` along when resolving so - # that the working set knows what extras we want. Otherwise, for - # dist-info distributions, the working set will assume that the - # requirements for that extra are purely optional and skip over them. - reqs = self.dist.requires(self.extras) - items = working_set.resolve(reqs, env, installer, extras=self.extras) - list(map(working_set.add, items)) - - pattern = re.compile( - r'\s*' - r'(?P<name>.+?)\s*' - r'=\s*' - r'(?P<module>[\w.]+)\s*' - r'(:\s*(?P<attr>[\w.]+))?\s*' - r'(?P<extras>\[.*\])?\s*$' - ) - - @classmethod - def parse(cls, src, dist=None): - """Parse a single entry point from string `src` - - Entry point syntax follows the form:: - - name = some.module:some.attr [extra1, extra2] - - The entry name and module name are required, but the ``:attrs`` and - ``[extras]`` parts are optional - """ - m = cls.pattern.match(src) - if not m: - msg = "EntryPoint must be in 'name=module:attrs [extras]' format" - raise ValueError(msg, src) - res = m.groupdict() - extras = cls._parse_extras(res['extras']) - attrs = res['attr'].split('.') if res['attr'] else () - return cls(res['name'], res['module'], attrs, extras, dist) - - @classmethod - def _parse_extras(cls, extras_spec): - if not extras_spec: - return () - req = Requirement.parse('x' + extras_spec) - if req.specs: - raise ValueError() - return req.extras - - @classmethod - def parse_group(cls, group, lines, dist=None): - """Parse an entry point group""" - if not MODULE(group): - raise ValueError("Invalid group name", group) - this = {} - for line in yield_lines(lines): - ep = cls.parse(line, dist) - if ep.name in this: - raise ValueError("Duplicate entry point", group, ep.name) - this[ep.name] = ep - return this - - @classmethod - def parse_map(cls, data, dist=None): - """Parse a map of entry point groups""" - if isinstance(data, dict): - data = data.items() - else: - data = split_sections(data) - maps = {} - for group, lines in data: - if group is None: - if not lines: - continue - raise ValueError("Entry points must be listed in groups") - group = group.strip() - if group in maps: - raise ValueError("Duplicate group name", group) - maps[group] = cls.parse_group(group, lines, dist) - return maps - - -def _version_from_file(lines): - """ - Given an iterable of lines from a Metadata file, return - the value of the Version field, if present, or None otherwise. - """ - - def is_version_line(line): - return line.lower().startswith('version:') - - version_lines = filter(is_version_line, lines) - line = next(iter(version_lines), '') - _, _, value = line.partition(':') - return safe_version(value.strip()) or None - - -class Distribution: - """Wrap an actual or potential sys.path entry w/metadata""" - - PKG_INFO = 'PKG-INFO' - - def __init__( - self, - location=None, - metadata=None, - project_name=None, - version=None, - py_version=PY_MAJOR, - platform=None, - precedence=EGG_DIST, - ): - self.project_name = safe_name(project_name or 'Unknown') - if version is not None: - self._version = safe_version(version) - self.py_version = py_version - self.platform = platform - self.location = location - self.precedence = precedence - self._provider = metadata or empty_provider - - @classmethod - def from_location(cls, location, basename, metadata=None, **kw): - project_name, version, py_version, platform = [None] * 4 - basename, ext = os.path.splitext(basename) - if ext.lower() in _distributionImpl: - cls = _distributionImpl[ext.lower()] - - match = EGG_NAME(basename) - if match: - project_name, version, py_version, platform = match.group( - 'name', 'ver', 'pyver', 'plat' - ) - return cls( - location, - metadata, - project_name=project_name, - version=version, - py_version=py_version, - platform=platform, - **kw, - )._reload_version() - - def _reload_version(self): - return self - - @property - def hashcmp(self): - return ( - self._forgiving_parsed_version, - self.precedence, - self.key, - self.location, - self.py_version or '', - self.platform or '', - ) - - def __hash__(self): - return hash(self.hashcmp) - - def __lt__(self, other): - return self.hashcmp < other.hashcmp - - def __le__(self, other): - return self.hashcmp <= other.hashcmp - - def __gt__(self, other): - return self.hashcmp > other.hashcmp - - def __ge__(self, other): - return self.hashcmp >= other.hashcmp - - def __eq__(self, other): - if not isinstance(other, self.__class__): - # It's not a Distribution, so they are not equal - return False - return self.hashcmp == other.hashcmp - - def __ne__(self, other): - return not self == other - - # These properties have to be lazy so that we don't have to load any - # metadata until/unless it's actually needed. (i.e., some distributions - # may not know their name or version without loading PKG-INFO) - - @property - def key(self): - try: - return self._key - except AttributeError: - self._key = key = self.project_name.lower() - return key - - @property - def parsed_version(self): - if not hasattr(self, "_parsed_version"): - try: - self._parsed_version = parse_version(self.version) - except packaging.version.InvalidVersion as ex: - info = f"(package: {self.project_name})" - if hasattr(ex, "add_note"): - ex.add_note(info) # PEP 678 - raise - raise packaging.version.InvalidVersion(f"{str(ex)} {info}") from None - - return self._parsed_version - - @property - def _forgiving_parsed_version(self): - try: - return self.parsed_version - except packaging.version.InvalidVersion as ex: - self._parsed_version = parse_version(_forgiving_version(self.version)) - - notes = "\n".join(getattr(ex, "__notes__", [])) # PEP 678 - msg = f"""!!\n\n - ************************************************************************* - {str(ex)}\n{notes} - - This is a long overdue deprecation. - For the time being, `pkg_resources` will use `{self._parsed_version}` - as a replacement to avoid breaking existing environments, - but no future compatibility is guaranteed. - - If you maintain package {self.project_name} you should implement - the relevant changes to adequate the project to PEP 440 immediately. - ************************************************************************* - \n\n!! - """ - warnings.warn(msg, DeprecationWarning) - - return self._parsed_version - - @property - def version(self): - try: - return self._version - except AttributeError as e: - version = self._get_version() - if version is None: - path = self._get_metadata_path_for_display(self.PKG_INFO) - msg = ("Missing 'Version:' header and/or {} file at path: {}").format( - self.PKG_INFO, path - ) - raise ValueError(msg, self) from e - - return version - - @property - def _dep_map(self): - """ - A map of extra to its list of (direct) requirements - for this distribution, including the null extra. - """ - try: - return self.__dep_map - except AttributeError: - self.__dep_map = self._filter_extras(self._build_dep_map()) - return self.__dep_map - - @staticmethod - def _filter_extras(dm): - """ - Given a mapping of extras to dependencies, strip off - environment markers and filter out any dependencies - not matching the markers. - """ - for extra in list(filter(None, dm)): - new_extra = extra - reqs = dm.pop(extra) - new_extra, _, marker = extra.partition(':') - fails_marker = marker and ( - invalid_marker(marker) or not evaluate_marker(marker) - ) - if fails_marker: - reqs = [] - new_extra = safe_extra(new_extra) or None - - dm.setdefault(new_extra, []).extend(reqs) - return dm - - def _build_dep_map(self): - dm = {} - for name in 'requires.txt', 'depends.txt': - for extra, reqs in split_sections(self._get_metadata(name)): - dm.setdefault(extra, []).extend(parse_requirements(reqs)) - return dm - - def requires(self, extras=()): - """List of Requirements needed for this distro if `extras` are used""" - dm = self._dep_map - deps = [] - deps.extend(dm.get(None, ())) - for ext in extras: - try: - deps.extend(dm[safe_extra(ext)]) - except KeyError as e: - raise UnknownExtra( - "%s has no such extra feature %r" % (self, ext) - ) from e - return deps - - def _get_metadata_path_for_display(self, name): - """ - Return the path to the given metadata file, if available. - """ - try: - # We need to access _get_metadata_path() on the provider object - # directly rather than through this class's __getattr__() - # since _get_metadata_path() is marked private. - path = self._provider._get_metadata_path(name) - - # Handle exceptions e.g. in case the distribution's metadata - # provider doesn't support _get_metadata_path(). - except Exception: - return '[could not detect]' - - return path - - def _get_metadata(self, name): - if self.has_metadata(name): - for line in self.get_metadata_lines(name): - yield line - - def _get_version(self): - lines = self._get_metadata(self.PKG_INFO) - version = _version_from_file(lines) - - return version - - def activate(self, path=None, replace=False): - """Ensure distribution is importable on `path` (default=sys.path)""" - if path is None: - path = sys.path - self.insert_on(path, replace=replace) - if path is sys.path: - fixup_namespace_packages(self.location) - for pkg in self._get_metadata('namespace_packages.txt'): - if pkg in sys.modules: - declare_namespace(pkg) - - def egg_name(self): - """Return what this distribution's standard .egg filename should be""" - filename = "%s-%s-py%s" % ( - to_filename(self.project_name), - to_filename(self.version), - self.py_version or PY_MAJOR, - ) - - if self.platform: - filename += '-' + self.platform - return filename - - def __repr__(self): - if self.location: - return "%s (%s)" % (self, self.location) - else: - return str(self) - - def __str__(self): - try: - version = getattr(self, 'version', None) - except ValueError: - version = None - version = version or "[unknown version]" - return "%s %s" % (self.project_name, version) - - def __getattr__(self, attr): - """Delegate all unrecognized public attributes to .metadata provider""" - if attr.startswith('_'): - raise AttributeError(attr) - return getattr(self._provider, attr) - - def __dir__(self): - return list( - set(super(Distribution, self).__dir__()) - | set(attr for attr in self._provider.__dir__() if not attr.startswith('_')) - ) - - @classmethod - def from_filename(cls, filename, metadata=None, **kw): - return cls.from_location( - _normalize_cached(filename), os.path.basename(filename), metadata, **kw - ) - - def as_requirement(self): - """Return a ``Requirement`` that matches this distribution exactly""" - if isinstance(self.parsed_version, packaging.version.Version): - spec = "%s==%s" % (self.project_name, self.parsed_version) - else: - spec = "%s===%s" % (self.project_name, self.parsed_version) - - return Requirement.parse(spec) - - def load_entry_point(self, group, name): - """Return the `name` entry point of `group` or raise ImportError""" - ep = self.get_entry_info(group, name) - if ep is None: - raise ImportError("Entry point %r not found" % ((group, name),)) - return ep.load() - - def get_entry_map(self, group=None): - """Return the entry point map for `group`, or the full entry map""" - try: - ep_map = self._ep_map - except AttributeError: - ep_map = self._ep_map = EntryPoint.parse_map( - self._get_metadata('entry_points.txt'), self - ) - if group is not None: - return ep_map.get(group, {}) - return ep_map - - def get_entry_info(self, group, name): - """Return the EntryPoint object for `group`+`name`, or ``None``""" - return self.get_entry_map(group).get(name) - - # FIXME: 'Distribution.insert_on' is too complex (13) - def insert_on(self, path, loc=None, replace=False): # noqa: C901 - """Ensure self.location is on path - - If replace=False (default): - - If location is already in path anywhere, do nothing. - - Else: - - If it's an egg and its parent directory is on path, - insert just ahead of the parent. - - Else: add to the end of path. - If replace=True: - - If location is already on path anywhere (not eggs) - or higher priority than its parent (eggs) - do nothing. - - Else: - - If it's an egg and its parent directory is on path, - insert just ahead of the parent, - removing any lower-priority entries. - - Else: add it to the front of path. - """ - - loc = loc or self.location - if not loc: - return - - nloc = _normalize_cached(loc) - bdir = os.path.dirname(nloc) - npath = [(p and _normalize_cached(p) or p) for p in path] - - for p, item in enumerate(npath): - if item == nloc: - if replace: - break - else: - # don't modify path (even removing duplicates) if - # found and not replace - return - elif item == bdir and self.precedence == EGG_DIST: - # if it's an .egg, give it precedence over its directory - # UNLESS it's already been added to sys.path and replace=False - if (not replace) and nloc in npath[p:]: - return - if path is sys.path: - self.check_version_conflict() - path.insert(p, loc) - npath.insert(p, nloc) - break - else: - if path is sys.path: - self.check_version_conflict() - if replace: - path.insert(0, loc) - else: - path.append(loc) - return - - # p is the spot where we found or inserted loc; now remove duplicates - while True: - try: - np = npath.index(nloc, p + 1) - except ValueError: - break - else: - del npath[np], path[np] - # ha! - p = np - - return - - def check_version_conflict(self): - if self.key == 'setuptools': - # ignore the inevitable setuptools self-conflicts :( - return - - nsp = dict.fromkeys(self._get_metadata('namespace_packages.txt')) - loc = normalize_path(self.location) - for modname in self._get_metadata('top_level.txt'): - if ( - modname not in sys.modules - or modname in nsp - or modname in _namespace_packages - ): - continue - if modname in ('pkg_resources', 'setuptools', 'site'): - continue - fn = getattr(sys.modules[modname], '__file__', None) - if fn and ( - normalize_path(fn).startswith(loc) or fn.startswith(self.location) - ): - continue - issue_warning( - "Module %s was already imported from %s, but %s is being added" - " to sys.path" % (modname, fn, self.location), - ) - - def has_version(self): - try: - self.version - except ValueError: - issue_warning("Unbuilt egg for " + repr(self)) - return False - except SystemError: - # TODO: remove this except clause when python/cpython#103632 is fixed. - return False - return True - - def clone(self, **kw): - """Copy this distribution, substituting in any changed keyword args""" - names = 'project_name version py_version platform location precedence' - for attr in names.split(): - kw.setdefault(attr, getattr(self, attr, None)) - kw.setdefault('metadata', self._provider) - return self.__class__(**kw) - - @property - def extras(self): - return [dep for dep in self._dep_map if dep] - - -class EggInfoDistribution(Distribution): - def _reload_version(self): - """ - Packages installed by distutils (e.g. numpy or scipy), - which uses an old safe_version, and so - their version numbers can get mangled when - converted to filenames (e.g., 1.11.0.dev0+2329eae to - 1.11.0.dev0_2329eae). These distributions will not be - parsed properly - downstream by Distribution and safe_version, so - take an extra step and try to get the version number from - the metadata file itself instead of the filename. - """ - md_version = self._get_version() - if md_version: - self._version = md_version - return self - - -class DistInfoDistribution(Distribution): - """ - Wrap an actual or potential sys.path entry - w/metadata, .dist-info style. - """ - - PKG_INFO = 'METADATA' - EQEQ = re.compile(r"([\(,])\s*(\d.*?)\s*([,\)])") - - @property - def _parsed_pkg_info(self): - """Parse and cache metadata""" - try: - return self._pkg_info - except AttributeError: - metadata = self.get_metadata(self.PKG_INFO) - self._pkg_info = email.parser.Parser().parsestr(metadata) - return self._pkg_info - - @property - def _dep_map(self): - try: - return self.__dep_map - except AttributeError: - self.__dep_map = self._compute_dependencies() - return self.__dep_map - - def _compute_dependencies(self): - """Recompute this distribution's dependencies.""" - dm = self.__dep_map = {None: []} - - reqs = [] - # Including any condition expressions - for req in self._parsed_pkg_info.get_all('Requires-Dist') or []: - reqs.extend(parse_requirements(req)) - - def reqs_for_extra(extra): - for req in reqs: - if not req.marker or req.marker.evaluate({'extra': extra}): - yield req - - common = types.MappingProxyType(dict.fromkeys(reqs_for_extra(None))) - dm[None].extend(common) - - for extra in self._parsed_pkg_info.get_all('Provides-Extra') or []: - s_extra = safe_extra(extra.strip()) - dm[s_extra] = [r for r in reqs_for_extra(extra) if r not in common] - - return dm - - -_distributionImpl = { - '.egg': Distribution, - '.egg-info': EggInfoDistribution, - '.dist-info': DistInfoDistribution, -} - - -def issue_warning(*args, **kw): - level = 1 - g = globals() - try: - # find the first stack frame that is *not* code in - # the pkg_resources module, to use for the warning - while sys._getframe(level).f_globals is g: - level += 1 - except ValueError: - pass - warnings.warn(stacklevel=level + 1, *args, **kw) - - -def parse_requirements(strs): - """ - Yield ``Requirement`` objects for each specification in `strs`. - - `strs` must be a string, or a (possibly-nested) iterable thereof. - """ - return map(Requirement, join_continuation(map(drop_comment, yield_lines(strs)))) - - -class RequirementParseError(packaging.requirements.InvalidRequirement): - "Compatibility wrapper for InvalidRequirement" - - -class Requirement(packaging.requirements.Requirement): - def __init__(self, requirement_string): - """DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!""" - super(Requirement, self).__init__(requirement_string) - self.unsafe_name = self.name - project_name = safe_name(self.name) - self.project_name, self.key = project_name, project_name.lower() - self.specs = [(spec.operator, spec.version) for spec in self.specifier] - self.extras = tuple(map(safe_extra, self.extras)) - self.hashCmp = ( - self.key, - self.url, - self.specifier, - frozenset(self.extras), - str(self.marker) if self.marker else None, - ) - self.__hash = hash(self.hashCmp) - - def __eq__(self, other): - return isinstance(other, Requirement) and self.hashCmp == other.hashCmp - - def __ne__(self, other): - return not self == other - - def __contains__(self, item): - if isinstance(item, Distribution): - if item.key != self.key: - return False - - item = item.version - - # Allow prereleases always in order to match the previous behavior of - # this method. In the future this should be smarter and follow PEP 440 - # more accurately. - return self.specifier.contains(item, prereleases=True) - - def __hash__(self): - return self.__hash - - def __repr__(self): - return "Requirement.parse(%r)" % str(self) - - @staticmethod - def parse(s): - (req,) = parse_requirements(s) - return req - - -def _always_object(classes): - """ - Ensure object appears in the mro even - for old-style classes. - """ - if object not in classes: - return classes + (object,) - return classes - - -def _find_adapter(registry, ob): - """Return an adapter factory for `ob` from `registry`""" - types = _always_object(inspect.getmro(getattr(ob, '__class__', type(ob)))) - for t in types: - if t in registry: - return registry[t] - - -def ensure_directory(path): - """Ensure that the parent directory of `path` exists""" - dirname = os.path.dirname(path) - os.makedirs(dirname, exist_ok=True) - - -def _bypass_ensure_directory(path): - """Sandbox-bypassing version of ensure_directory()""" - if not WRITE_SUPPORT: - raise IOError('"os.mkdir" not supported on this platform.') - dirname, filename = split(path) - if dirname and filename and not isdir(dirname): - _bypass_ensure_directory(dirname) - try: - mkdir(dirname, 0o755) - except FileExistsError: - pass - - -def split_sections(s): - """Split a string or iterable thereof into (section, content) pairs - - Each ``section`` is a stripped version of the section header ("[section]") - and each ``content`` is a list of stripped lines excluding blank lines and - comment-only lines. If there are any such lines before the first section - header, they're returned in a first ``section`` of ``None``. - """ - section = None - content = [] - for line in yield_lines(s): - if line.startswith("["): - if line.endswith("]"): - if section or content: - yield section, content - section = line[1:-1].strip() - content = [] - else: - raise ValueError("Invalid section heading", line) - else: - content.append(line) - - # wrap up last segment - yield section, content - - -def _mkstemp(*args, **kw): - old_open = os.open - try: - # temporarily bypass sandboxing - os.open = os_open - return tempfile.mkstemp(*args, **kw) - finally: - # and then put it back - os.open = old_open - - -# Silence the PEP440Warning by default, so that end users don't get hit by it -# randomly just because they use pkg_resources. We want to append the rule -# because we want earlier uses of filterwarnings to take precedence over this -# one. -warnings.filterwarnings("ignore", category=PEP440Warning, append=True) - - -# from jaraco.functools 1.3 -def _call_aside(f, *args, **kwargs): - f(*args, **kwargs) - return f - - -@_call_aside -def _initialize(g=globals()): - "Set up global resource manager (deliberately not state-saved)" - manager = ResourceManager() - g['_manager'] = manager - g.update( - (name, getattr(manager, name)) - for name in dir(manager) - if not name.startswith('_') - ) - - -class PkgResourcesDeprecationWarning(Warning): - """ - Base class for warning about deprecations in ``pkg_resources`` - - This class is not derived from ``DeprecationWarning``, and as such is - visible by default. - """ - - -@_call_aside -def _initialize_master_working_set(): - """ - Prepare the master working set and make the ``require()`` - API available. - - This function has explicit effects on the global state - of pkg_resources. It is intended to be invoked once at - the initialization of this module. - - Invocation by other packages is unsupported and done - at their own risk. - """ - working_set = WorkingSet._build_master() - _declare_state('object', working_set=working_set) - - require = working_set.require - iter_entry_points = working_set.iter_entry_points - add_activation_listener = working_set.subscribe - run_script = working_set.run_script - # backward compatibility - run_main = run_script - # Activate all distributions already on sys.path with replace=False and - # ensure that all distributions added to the working set in the future - # (e.g. by calling ``require()``) will get activated as well, - # with higher priority (replace=True). - tuple(dist.activate(replace=False) for dist in working_set) - add_activation_listener( - lambda dist: dist.activate(replace=True), - existing=False, - ) - working_set.entries = [] - # match order - list(map(working_set.add_entry, sys.path)) - globals().update(locals()) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index e38207d254369a4237e19755d1a4c0a463168998..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146495 zcmd443v?XUc_vu>0vhNB8t*s3CJ2%MhzFk%MUkSwHzg9JN$S;-4Kz^&ut}gBs&0@( z3y>*Wi2;i?LCX%oSTUhTEHIL7#&#xjl9NbIGWP6D5;U6{z&%Wc**JUFduDejLfJT) zJv;mT|E*Uy8kFVD&Y2=nU3Kf$t^4@zfB*OW_XP#{5{}+)y>N2VJ2vSb=te(W+QmYT zN0Kf}vJ{YHn`|Gj1#J9l57_zF5peLYGvMT3SHQ);Ie{Gh%?;%8uRGx8-@HH`|K<ns z`PUQh@UJ)E<==up0sj^T3i;O;@bPa^poo8q110=h8Yt!8vOpRCmIuoDw<1u%zm<VX z{;djB@o#mY8o!PK?_f=!#wO*7*3<@S^CYF-Mt9Bu`{0Ve3hkK-cMXAt!IgoPgN=bk z<j4uELM}JbR|nSc8+ijwgUx~F!InUaQR3Rc)<Bz0Qrb>Er+20K%WvfmbPTQwtQ%Y( zSU<QSuz}M&0~-f71vc@u7uTBun{AR^QXY^CFfe>*_k|hvzKr{#jQe8qUa_4Dn|0Bz z<dV~NNmAYT+7`J~&;13Ab>JcVZN=Zi_}hlR?f82He>?E^DE>O}w-bN6@V6U(d+@gx zfBW#aAAbi>X5Oi<>t8Z|<uc`Qx%}OVcN`*(+vYkoW#-VY<VwYL>bLbf^Y<OpnT|l0 zUD_wfRWD0&wQ^W5FK|TJeCiF6!+JjTmi10t2abiLz;U_eWhwB4T#NIQavjc3$;)tl zTCT_W8F@L*0ojl9v+|0UrE|8xbAivw4Y>bYza+1G!xre~dNiUQtCSw29zjlBjnp+t z&`3SOsZB_2R!$hHy`0*D)U}qpGN-m8wat>Mpw4}ENp3&&*Na<}eVo541y0HxfskAt zI3=$OoR)2Y0eO93P~L!6gyoGmNBX5co4n~|TVP1ujQi*12XIy~irL5JK^<BG(IxY2 zG4jL|H83ncgc8rlTX8<CoDH0lAI8;)ybb5Ld`;etZ@(Zvg1b>}_YSoCQDdyfIIR<D zJC!k`-(KX@T}a(+<orCR?LpdJ<-C#eB~IOk)cr=zFDPFKe38=+ApJ3Ai;??fPJJAy z2aVjnAs<5BepBwk`AhO)oX6!OI8Vr*!THPbQJi0qkKuelK92KO(55HQrmu2YPok`+ zjIu7G&%(;2a#2sg?0*{XT;jaXAa4NAv>6ik8mB&s)aR718L6)-uTI)dH7|yNceEs$ zS(qQ6#e1K#l=cmL`x|<mz;AJ$Zsh5)^wwog4I=e~a@qLe6sPtgRkqaQ3b)0Lx@=lp z7v+lCLVjDp+kN=H-nMUYYClp>Dz6%;uW@P!si#nap7(d~r6=UmA?e)#vs8Hy{q`;S z_vA48`YL`S_?<@1Zz)UFY1;Dk@5w{R|2pTNR9;Ve@;sirA*(3=O|DNA^@-^@0&mH~ zc=EgQ8Jxc@pT+rY`5ewODC?Tyl}GfPY8jXAMGqa%(nD|P`4|&^OKC&CCqFTt=!baP zyCUrcGff^vecqMFaQ=?`BF^8HKacbG0Ga2}w(IgsxcmLA^?g@as=mK(mX9~zU9y)m z^DWgbOFsDvsL%Jg)Jf(0=6B>TBK-&Q%Q*iqM0n~qQ2RfSe-rorM*b4ce<+XRd_$hV z`A2v^JI?yDj*rm8vBf<c_~Rwtd_{5LopX!d;q>_8^mwi$>GfaYYk$fxbpbH-6+LI* z&*ZP71@G~bi+D0=Jb9nfE+Oq}%KOHQ_%Wxxiqx-LQvY0eU-_}}=khmRa|HfE{w<XF zm-1zt|1Ia9LhdWdX4LAdi|dWl$;GM0_x>H1@Y^WioA)Up%c^gb@IT3~p(g)c{vDkE zgZwR=|4P1!^Iyx;IRB0OI?l5ghdk6I%PKCvp&XHO-hERq4|ww}ym3>xiFcAZRs)3m z?#nj)E^v!${cY6xZRG>~&A@+DZpt$+OGd7_5&KF>scQs1#I%@wU|FE{8EMjWq3o=5 z&hd<N)`sWH@jM4Ko<C5}&z4)B(Ytsi=LS~svzjc=?146Zma9K&ekb_%AZYTB1ba^h z`xU>cL?gp$uj21Kav;Ag%aNboX=VyV{Xzdgq(9Uf9Psyr1{8m9BpeHd!iwxa8;YF_ zh4Fky6y55NsAlf`=<o?Sq$<6!h&tkrom5mM(%0_yA3v$+FPNV}UHr<qA!Lr4iQ(X& z63vfA{3nBF6e=O4;?3AeoK)nCD)<e?w2Jt9dOCV~TKz5INUX(w_9PyhQB-;h)ko#? z`AzK|)H4)CU3N$O$nGDGD*i~copVHn6cieYgrk0Zc`z6b4Gj;VFr!-eTrK|zB^2&Q zO`=g$AQVPk`V`vHo}a&D6VaQp5)JiJ@8ONJ5%o0pB5I)yY8@OMiN=&cy^Er)`Rz)7 zKX-k!)gKJY{^2n7H%c%cpeYAp{@x%4V<4)P%Of)o8Vqp{1xNTp`R(!0kSL7Hq9OG6 z4o72=LI06GNBkStZ9sPgWkp5v(TD!%@X%01jdA08dis@Ew;YTGo0@xi@&}dJ$%xF& zMY{$g@-U!-TR4PKr-5nrKM|#pf~w*dpdi}46`8m8ga)bPfzXL|9VDYYt@)YH@RcBa zvWM%tb!cQLw6#Y790s5VU61Yxq8h&-w9?gVOL?i5qHsmUy=yoY8dRDcDc9g>)FPFm zDl~+toZ;|5D17?(UgU9N*u%~Clq(daEUxI#Kq!V+JR>1xK<-99C7SZeYGkOpH!?V= zgk!1VQ;|>@ci~tlJj@V7-yQ<2^kFbjN)-2bMor_(hC)N_-Di}r98m#kG#Sx=b^vJ< z&=&V+e;mb}2=#@KDc+DhhpIe3jA=%7iZ1n$!JvAYim1(A1UhIS+HC&?(Lui;<~+Xq z$Or~E?BCeFnI<(&0GcwG1pF~Meq!i!f44Di>BH_1V#vch7yQQ*#eXsu8;Wl2=!hz@ z;h|V0GJvTzG8AkNMLLvl2bCR-b)=Qoelj*V@C#zYuGv!g(HMGb0MmIO-uk&SJDPSJ z*%l4<DUUSm*!t|cwue5uc180Jae<WQ+QnsaOLH&YHx7-{l@^MSbXig)$QmS)GXxwX zc8qiZz<<-Gbx#G=Foq=_%=hB}_yWzHRKf)R0Aln28WxI1hZQkzgMMxNsF#efVx$5% z85$TNBtesmi=!EaZ?yAG*EMI#-Q7)~*xjAV@9q{e2-n{3?&pVt1KN|^?ru5K+ueOl zTA;>!JkoJ8GN^P624m4P9lImF!#wgGF=asMSA&CX(O3xBL2Z*GXTxGDcL3<lbYP-& z4DqOLY+t{jBMQ9GCcsdMb^tCqG}ufZiH`2>P&gFp?#7U*75F}%UcyBb6o~Y)bkFW^ zxz%O*lU}`_ks#&Z&x5~(ahxtoG2@xOCY~aQ%Q!}DIu&J;Vov>Gwwy64pN~^{`jz=R zY8y2uB(ua3KvY+=E0x<n5IF&42`n%K^rECZ-2k(g(tReVMpI5X)Ei5=`_#zbX=Mac zBbAHv*vOEQvY$Q+hE$ULezhJyslskq=^X%u6Yr}{NF=%^x)!JN(ru^biwEYMWeI25 z<k4Hss@qQAoU<a~toVBD^4O)Z>7z51$;$N~I5%(?ra>%CMCzY~7je2Qg`}}8Jve5I zQEm7*rOVay1pMkfy<7ThwIn@<ykqt;hg}+lq;1qege8)3H)^L}y`M&<QTsOBU#N9T zqtY>{+1{1P>5dX&ZFZ<D@I+mS6VN4=swe>2#hsV3^`~s7Q?@fv8aJ9iqK^R3cvbXo zx4ItBUd3PZah%Re^WMVqdv3dZujHNYyj@f~SF|Egv?5uw@}6XKHBUIlZR6|bOB*KF zPd+_uyY$?p9n<TlKlA#gWNFj5YdrX6_gx3F-SHHiKPY<8fH4$K@L}n}#qc)<7|8}% zmR?()*=r_Dias;?(60C5s6(d#ZPJAmX*~!OX!IZf2zR5}imSz4hP-;05##$!%CrwB z0F~&i`J(d6o=cur3#hBsYhC4TM2|In{n_c_OP@>RuS~cbr#~}en^|$qITQTAy^gwT z{Sw_pfW+O^fQ!o*_*2%-L>e7>*Bp~nKW=I5?2QbK08cy4U_Q|s+NkFXfT5|RK7`~q z@E0w_31jXlytrjz%PU)Fo#kTK=)3ws*IbXixIjH@_p67Eo?GA6N*T55z-*I7w7Oz_ z?;TKrs!9#K=14g(xl{JY3AGLPQ7Xg$SyZ0JiYvbZ557$~Dse*PojG6H|I+@KAES!{ zFC7?HK5&*T2EJdfH+gob57O5xUFj8F898wZ6tdchr!)-FVo@JY;hd*7;i*k}md!es z-KRfSBmYwUnXSKUDgmBKm>|7(P#@|Ytv<W({Cku~8(ehD;g=3i?)ku3BPxSuX$P$w z3r?Ia>qDc~;SMn5466N6OUplYZyN{>o{)o&s08{ypckoQUy>G=Y|QqLkRjV@1N=$v z@{tW!V!hA+9(cj_(q7B@;@00Ye`Wh=;CgkV?2w(OJZ8Fn6)VuM^eF=gzpKXh#y4$p z4nWtZ=Q4lgT)iIOwEd2Aj4?1_;gwR1h!;M<2|8`kGyKfp^xVPEpn*q0W~oH6fLhVX z(KR5@gXcnn!-L@82EpirPJmd~Xcv(1gsbIHG{%%*JDuAJ+3T-2HESHozz9e{BHM{Q zQ2c|S4X8}5ATB1-hfnn$K86h7AI?UG2V^iy2IWY6PYW2X7Vvv9B}}w0s;Po|=mo8H zVkDy~e*ey4l)^=U<_d=C2J~3(Nu~ER5m$P1LLk^jh(JU6r^Au6R6j1uAkfn5r7&00 zq7H|N-fJPoGy?8v0B;UQiBCp5bn=Ls!i9lH9SHS?V%!f*3j2fpuyPjEapreg{b$iZ zV66mCmR6_UVHHeB%=!*>=iy`8P#oyPC(#yg7jlT0QGcWt??nAzEkJ>e_#;G*8l#&@ zi-PqF#iCqceFXi{n2L6Sh2(<!hQqyFZuF!+Ks+2W#vs_+8&PFs9vIOm)l`lgRL_RO zALn9ZBhhnhAKTj162Rfdwl<YOvN<nRLhy28I0SA<|7NO$vp*>~oMT)8Fk!)1@5z({ zY;MYJ<a81<1saTB03iw*%+;?(hKEx5PX-5ul|8B&Q9*_|>5Y_aFpUJOpigUzs$za# zeFioAH~5Q=;B;R4s7CVECq2v0@4oG>nRELSZvS*y(!Kh8=X|dF{Mc)ySL?3S%~aj2 zUVqo_%qyN>)%5n$uRs0n>30Ti?7Z=r+4dbDta|jl6+c<?{+gez_=}d=(nI6B@46*# z(fP;6H=Td{mmlRyMK$*%dtUJ!Z_&KRcmDCaxw!e5vGgCT?`)CYZ^`R?(DD8QHk_OH zrE)c9DwPi)?2h)Tp`n;yUNIfcgusKRil}8YFV)ZqOv*?&RYW9xH(*B{=^jF##Zm>7 zM<fgehf;;+Z7AFqNfm=cQ>`yVQ$C$<1IbE2k)EIg2UEpH4ifn=w_Ic-4WK^6B%8%3 z=a3Xl6&hIt7hSAV##BHQlL=Hdi9GPhZY&?E%AhQF2LXp?n0*G94OTvkW|#DZ!g5-> zqp4C_Z~&t!y$}g^ldvXLOv`zAc*x{LQ^nk6N?&kzAlBU*1fEEF_Jq%b)JT}w_WY+r z4UVA#zN4Bf>`*X_DX*ryyRCigIcl=jsr)_E=SR59`Mm)i5C+VYPlNGYk#HaILo8Kh zEvPFJ+Z!1U%PH>@VL}7pJ=BbpkAJu|TnckmsS*gaq6!*ha`mYKk)~moR334^%s8gJ ze5pTR$%iqg%5>B?pcqp!s?ti8DrETv27$jG1&d83a_^=*u}HTu>V=^&sJf7hiAfTK zluyAeq#cT$Py`e{4CV&_AtZgNLLtiv#qm`dBln(t`?_}@ICebc*?FL=^XN0$&9TEz z9No1?+!XBEzh~Fuho3kuZoRwrJh|uK;UnU%_`o4e26RN97sUtkku#FKdjY9>#+3I6 zK5g82_Vo7~HwAkJhhihfdxZ+!b{kX9+ci8eU_7NajT_%?0aiwWClDGkZZIAC34m4f zUYI6tjger$fA>iU@CNX#%y=eP^ls)YtNKFc0L*4~eF0L5HcizZIo+?fJGxsDQZ~#5 zO=gjD6CN3aY&KQVc_tVd2x5)5!eO)*r5J}s>PQR3)u#(YWIIIO&JjnmQys>`czfpw zU<yn;|A`<(rL+ji3It}d67D5}AQ};q!LJaSj;6@~h|HtfF9i5AU@GvNd7LunGV@8y z;AZg-(RLZfJ6Z#X|I(QeXDY9|8{Bv_+TE>I;X%p?az$15;*zM#s4~!Jp)N`OLeIOq z<5kqLmMPt?KY=xd6a^DVguk!!;)@e6&iPg+e5>Crn~}d4x)yq8dBV44*1d)4QAif} zvnnyuY7L!g>GT$zh{WYw%oKCa@(K1IQk0BkUY365+_K=bxgHYPsPEH;Oz)+INAV<c z$O2BqB|9woh8)~GE%&*y3&ZM`b8yZZ$!&J4XHZQ1_n1!TB+;=7LFz~wNmM}yffCU0 z3Xvg<)}n&YAX0_!6U26ACXI4AX3!HPHVOfE#F2-^%=DUBwiPg0w3}8c*U5r@1tAjO z_yUb!yNr1@Mzo$;9F|AFc!-+uGYx~vY0yYL$k6EL9?TAnvW<rCm~_qF1^WaH+8#Q+ zfs++>AR~&#;$<0_pX&zu8X;#qFWmvmj7*G76;F)Lx@!f~q5&?-lb}KWbQSsqy_~&5 z4zxI4npqztK7@DFYxEw8>C*bc;F%u7lgp@0_8!SLKV@4;GUuqy<Gf}2s!jA9b94?& zNQj7NO@hFk1mhsza#$e~UDTrx%oA%7uUOm$O5aYsN-{T^iH+kiF&7&XKKx(z)|ofY z;b+#pPBfDGRX=FJdC<4wg81L4o!F`DO&zuM*$AbK*<<t$AEWlKB7d_j9%Hy9W(gF! z4q)9UnC}Qj!fm{kwBiYKU>4zUAGB2iMAU;N0^ADeGL-|0A%=Aq;@-?g8=q>nGyY0d zFPRrIxi?YKl*dvfekX%#r)kI<3w$wNm-#{K(?`+Q(KRUZy!2tdR8%`(S~>nW;Xi`q z$EO}i_?pL^w|z}BjkCUvS$79_dRKFPR_yotR5$k!lqU*gsOk)E)$h>hhjjW8oicDE zAtuI7YpEV2e|cH@(C%`%?-okMdu`_r+;J6rXt%lQ793Je;a$4An}e&2w0k)ab}i(% zT>>b$#9kC;96FRNJc6WjgsM1C5l+rHWIMq|z@_A*q1xOLCoumX;!*rJc-%Vu8NDlp z9;}rz1l~DFT$n0@!Gy$K0nI>cnF1Jz5!;DNE<_tmmhX%A_3`E0Ci1i5QVmm9fR#28 zA}NSu!0A}p<o{H-2O?l*`Lg03^#(P4)sg@T4WG~(p$^B=uu&J5AzG+2S4@Tg0vz>^ z=tSjb0tt0D_xa-lBqT#6Ab~dGZoX9PpDSuk6gAJb?oJf#&VUz&5{6iQJv&4kL3!yA z0i(lDTw<~0Vv*I6p}yG4xma@ZN8HVM>RA*UU)^b0KWQ1!**ge0qO3gXBYq)%>^Oj8 zjk&C?VHr*K%)EvIwdg&)X#CYEv3vg?AV7VaIy~E2$g??KWd%c>=b@4BNgMHB9|TqE z*Q^yt<!Q}^j<bHLYS1K5qw>;~aiDnmTR4gn%fIoPc|>g^Fkj6oan4HGzJu@4f%U`D z75C9J4-SzKiFw|*z10u={vI-@$LRD1PF5<Tz-SnaUcBM{jiWp#X*LLgm57fQzx?8S zX`_z1%dXa6sZaWvX5CHy-G~8|WW(z9EUn`OAYQvfn`q4s(`fwxy}F2WF|bzy9`k5v zJ&jxA&}X8~AlSs3liADAv7+a|2GnJ(i}v(+>RC<3jh=mB;)PenX5Dq#+ULoN$4nH) zE8csknfhZo@!I#7bd|C85r$wi@icwz3EUB1u<mY-EpNkJhvX^*dRw&8Wn2BUG>5BM zTP1OIFP~RLn@gw(_&aI%Pw&Ge)a2?p)F=LkwU_*IM2Uvi#DtX&)Z+~-NAUM4K~O<T zgSMji`$JGe`-!*hQY*8xn@Z;5hpFAf{JjkJZNI?N{8`rvW9=`DvA|J%7teq3-*CXP z**uIHEO^>cTg-SiDs98{h^^Tk^x*?XHD=x41G<ETZQXrfaAB&{BkX=o!%9heBE+se z7EZlKNX*lcSoVzBO`JSg127v(jSm`@H9b8-#}DRGE36wPOT5;TVNaH-5UuDpgtbII zwt{G2o1>t=MU>X!7kU^`kf1%;PNAn~k(i{Xhq-sAL$$i_=gDrS)DVJbT@g}9^X;*; zJ5{9jiQZdQL9BWOJ<O*s(h!nn<Gcilt!c|GXXTXVrn7PJET(a$QCrxHSFB2#QH!!h zH&RsFP37w;QX*v>rUK`jEm{fl0mCdH=Fzj7d34OIvwL|`%&X@*MbkXv7-dyC6z=8v z11Qn$vZ3r9v)iQ@K{g+;D*XzYH4R2h(}qRLoE4~Tsqu!PBtq)1RHtX83kMA~kTbqR z(*a>NE&>4!02H2zvTnBpfYnwSA~%`sC7To-OuL#3Qu(1MlbqpRETgEZ8p0{%Bx#o# zpi2jEsQMYY$`!B$3IF5Dh!ByYFkzDg1D9OLXoInsnkryfSvL&4hCl?X{|@hx(Uo}n zuzFN^K9wVGh-qZAGy)dzO+tq99Bx!PeT4vS5*O#CpXU}&u6^x=Te)j*`)cNV5YH^1 z_9T6+H+=_xnENM=8;>Wq>`$&c@Y5BEbq8nN2O;ZswcIW)yIgyzcIw$gar1c2M{cRG zeDcYu=Vmq~3)Y?AJMY<iVf(G>)|tMfXY+NOw$D1Z|MH_e$y)|_Ki+niOg?<ez1&*L zmvipA@aW?xsY%|KN;@Br-hW`tPQT;F%WXKP5kbZrSj}@_REoZ0nkr;tz4cX1KrSgO zHD%;s*#W-QiBIy8O>CCcRL0PiV}=<s#e_WBsY9?@Z>lx3&Jm-eF^B9Lb)1n@oMjgY zRM^;}SgV@l2TD)_^37y9N1vbiFEssdr4pi<=3F6~NlEc_9mm*Wvg2Urgc?*wI(9`= z<(Q(L3H8FTNj%e-v3Ag1(HIenLHP(@79L^EV@%7S9z+Ge#S#GsAP)ADDhd_?un1yV zc8;d$$UPa1G5|w^g%V*}rT!;+B?qJ(#G)#3j?GS(%m@WUE=nOqXUZiiP{2Qe6Nl9v zjTb;#gX!bAQ|a{E1k>knabEhFr}%bB&0I-CqNE{N0*j7B$(r%pJD!rs6JOpwU$%FA z&uw4v#j_J<NhUI--10TvF0FZO%k;CiO4r|RY@KU-Akp~1_2FdW_Q^x@m1}0UCn~qh zH+0Oddo<C|IhA|IU3jrzqF}QB^5CVx>0QZ+rd#gjc~9}=iiwA2v)MLKjTvjV;sOqQ z?6&usJ)4~dOo<FLET(}|j-jDmvZy)|f!g%Qu9S~2x(@|=$&5C75=)T-2m(Je0<bVv ztOT*HBMhp&C)NK0pZ`7TrW)?1`O3QM<q6M&bDoD2o`-Mjd+({F=g_S4kXUw*#W)PP z*CRaT&;a{@G-w->$VUPd)-nRw-*+;}4z>Xp00<jPjqwc$(*~u}5q%bmi!rf`((U)3 zOnN>seNJVWI&uzd1+>Kl6V7c}LSWfQQ$?>q+LOGrC+2eI&~x`W;^-lW$RNvu)d5jc zd>B>-NH><7{P_Dzm>gg|fUb`h99=8brWr~0rm?b7K~FvX^wa)bLNyKrJ1eR|0I_5Q zWFwiC_Vmb@Z%bM!kO4SJf<r=37giJ*cH%IX1aaDXTF`L^VXk|Qxn)2XY2110Q71Or zR5G<wNfxR;j?*t_@ISWsQ?~B754lP8y-IFhCAY1LG6mY~g)(j=O7ihgzj&F}KY>5U zZWV?SBv#}3to|Jy!5W!JU{d~~OL~=*13=GktUigy(713Fo}yCzkxu_RP8k@Yi_+=z zT>|~9xHvEUlUH)B`Fl_0D~~|Eotyuq(U(Ri&)v*jKI8nJ@0#yM-mRvcckQ0M;@cG~ zUL73Yce|qM^2tjlUp)mgvB9~DwTX(gGrO*rCM!0N?*qGdyQp+>-&E(N$6ocNUDi(R zOBOZW&2=^vekeK13hzqJg2KBctOTb8krd#Lykc-31;s)Io`+kp2>zh6dZ$nNu`h3D zo#V%~Hk{*CTAwyOC$DXOuAP6{n%Y~M<I9D?L7Vl7HA5QJZ%pRLFp9(pzLX2|9TzZ< zji)C#c9Rdt%DEdRr(^a}`=m|%r2NLT8gq;~q5~ErL0B>4Fe%P4=crRX9y2J{QD;`P zVXUG0bR2Vy+V7te#zc-K@)$@6#zc;>oKZ-qxK~`GIdaZv5Kqy3q~&s24$|C|rlQYA z@<tu^|LPK7H0po)L6p97iBj_Q)-6$r@tjIQeex{*mc3p^OZAd1Z)ESkMQ@zmExtvq zZ}!Ch(=JfZy%AaHJP8r$Jeu5NTHiqJ>W7IAKh}t7%i|paw+R#pY^K6?Jk;k`fEKJK zJV10kJzbHoLO2Z6IF+U&O>lECK8FZ3IH0N72vc@3cGH#o!v2ZPqB8NEFcumPht7?_ z#7Kz>ly{sl7*jkf*!=~8W!$-bUHisgkhvRQZrUsCdtB;aB&j46O_hqdsgX>_7{{ys zOpi%e(VWYoeqyO*Xrwi{FF9R2e<;|S$|VMpF7oMOH=7lu+_Fv}c^M;UcWhx!*cpeQ z_dicxq0?Ux<}1O88BBN4Y;NV$mf701Gv{t>x!JJ`g0GKqq(c8(!Ky^Ts_B!-f{ych zQ@I7VOB&}&S`sBKGh31+o5piL%#n&JLGIVI%~fwmRByPxC0V^~{IQ?;s&CiUPsQh! zcO;f~T(>2cZ%Ec|oOI8(tovT;wbtv;f2ZTd1An&dN85gC`;#5B%O9Wg-YKh_wtel; zd{yI2&dsX!`O4+f>%TUp-`=TRey6kwSkYU0ar?yfsp6!kcIwR4(JP}fo!|WYO;7vv zHGkOl`)%*pk{fou*Y}fw_XlQ=9sl#l%?(e?msX)6Uf=lHi(?aGQ=dutmM1;_w>D0n zd3*Hr(d(UWem=SK!JD23kq>RAFBA)6M<WW*Rgy%j7*lKC$Ay*0&c<8F1};2B?`0f> zA7wTb2j;V9<H2>J1=Kon$o6e0!Q{hDTqrw;2s!1+_yBInj9MpZV7m*=O8n7-aN&Xv z7A^jU_?t<AZlWiIZxBsGn7#RXgeeu9QS|u5jevDx$(gn7x|Smt)jTpx?;|BlDzC3w z^9fKNrhLTGs?XvCLOzc^%%4hmETyOHVQ>a)u0efe!YRGR@BTjor$kDCFU|8_TsE<6 z^7&+5^<3V{MBd8tJLf$G<EJLDWScg{<<;kRo{zuO1;>H$14(Da<nsw<^_;UY;cT3K z_Ikqy&drO3D8>N)DZXSK;H*NFa?5gMEJb)xJIo=n`Wv7m103|hQ9aoPHsdWriKf35 z^_o;Kd=L!g;0w4WPlNcQy6^&yX~Il0ZP<mdi;2ph9})uH`H4Mn7#YRe_OL4<3=aea z+G@?m*mbuBkeYMVzed~DSvrwm18f@EV6k99RVg9wID~pE$GB!={iTH?Q9n!X(aD2J z7d?avA%tjr&2cNYj)f5ZgpX_ueXF4~g?OUzHP5Zw#@oKysohE63Z!|;C*{`;-tsix zF07ob+V|74WMS8=yNgLEG2B+V!Wix?_*VLG>nmS&D#x5xtj*r7b#xCwaF3sD2>onS zNMg$#w!akeLY`_p)Wd2p1Ph=8?7GJt0__ENz~@kxYYw5@rFB5fC(x&A8`zt&sC25J zjuI@}&w&YdCp|0XJR1_84c9l{XiR!`%sO{0#$r?yW3dNt@o8GE_X)N6<Lw5kf(4Z< z`m_eabdo_zYqhZi_rV%W%ZMy`W4loWT(c&d8k;5srH3k=YN?roa{v!UGdmKVj_a<Z z=Yd)01OGn_?KN9`o28ki;i4uewl;LF7<_K8PJigF?4gDfEgD8nrjtM0Fs@5@)?F{Z z;S^Fb(L&@k4iv}7!aDp|6|7K^I)vdFsn!wc$BA<e+brd>&61mKmM-A6H0c?Y#&AK? z0uBX`@W&tC4V{D_q1e$<f&F_L5&_3XPRyKzpdWHj&Bky?7b|2i&l!NJx|%<W7eb$I zJzKnfkyT>5_4#V_jk+H%iyqKhjRZb2E4=17$i4K6Kpv|(YLh#qhRH<bRLHi|w1jN< zdB3WWQLO&F`O{VH)-&V+d%wz&2#hcWS-_ka2!>Dd6$n!jCHvWTR?xt-Kpuqbjf4WE z@PJJr$X48(Jqasiwh$&Q3L$OC(PTgQ-}x2DfVdFh{Va;3lIUQ=vYwum&}*QVh-U7C z<891RmEM!EvFL?#nQ7<<+@Z-ad5L~xBX+%?gx7Dpaq&P~dsF0U{d9f$$N^E=j1dn4 zNHsIs9e#h)KnO~xo*vCJy`7D!$@98-iP{$$HRr5x|Kggb=h*P+YQ5v2Hqd%03>0LA z$31V<-CA>k4LrDCwTtxP*Z>@v;|=$zxK`li^s3`7?Z}*8+xMJPdWS(l5{QUi7j&Fn zd2$~Z2m$8kp@2m4{esXIB4yFvK#K_60Aj$%l7{w)=8M-YuDNO4za_2CU9bjWf|TfB zVJljN;#C9?gHD)E2ptB;H99dpSx5Ou4K8>gLWC-vR-xGFDqN5=uFdtBjm(}NxR>K} z?Y7<X+FXY?q06>_<byU*0%K9UVjTDi9}AoCV@1oKgp}E~C68@ezJgcd8#}=av!5FJ z8rE)_!VoA7wog%jeFO^3^hgxZG-(c1BXjs<gCu13natB6b`xO|5Ws*8l6!P?Dd>I^ z;q)Me0~z=C2xlC)B7vv3s75v0e=L3i@k27Ly^(_Pg+Rf=B%6Rt<3v;CgaeGny1jgS z%_4Oh`%x{*xFZb|KC%5Fqy411AiHjk;n2ny!a@-LYjuLU3h-cs?o?@7dx4?hCK6xu z39S{`c7M9I4jOG0#5-9Z(^^gI1kGN$#kvw@8rA4nnv<GVp4Np=Iq1Jad-3^SrM<{@ zAicf%%p$m^BNMh;GiepQ!4_PlH`63e*esojwh||LHV`LAHOPg2i>(`&IMJUYuHC00 zPSRH^y%5kO2FCwYR;zXbDYM3EKPrzUYEeb?^1FEvBZtOMK}Q)&lwQiOw?t*uRiU~z z+^4SEs&qW9woBQ=HlY{P7CN=kse?|`8!CM!(;SG9s!FGAC|g7GKXY!s=XAI>-^({o zHrK<1_YX0e@6ymbz1NFB<3JgFEWCxE3^ZR3y4%Jkj-b4CF;0NI2&^WJ8Z9o+zU(H$ zM!8(h!<!yCA9r5agL8pgA$yTln1^VX^iQso3vlm~3-Po_u9AJYE0&9JS0Y!-#keb# zOK?{vm*QM5m*HH2$Q(855ULvA-HB-drvzS-*{TLthzew->VXo%eyj^3kWUj9g`hu* z062)w00J@^Ywk)zv<4gfE$)kcC=Q5g6Gw>dFff)oz3&i-0nca}^TF>?S$vGz&KJcD zna3%wo^Jk<x*pLOpz?+=P0Hr~YjwrGQ0^2g&5m6_xgcOP2RgPDX8M>~Mjb*5YUWg7 zw&QP-g{#tby*rv=Xq(C<ju($p`E)VTO|dOfIVbocRcH8Z$=z@PLolI8n4&(3TzR+} zI6+D@7M!X784XJ1kpmwWrCFe>h%yTC2`8oT{^V&R;)ujcO$R*KL5aj?3ARbX42Oxz z>T%}<?|e-ieth#4RrvADx3-TvNhe)hi`zmdzQ=dmuBavz*7&|V<#h;vkk>H2XWm<M zv1_7hYV!x)6(2f~w3zua2Az0!;qah?`j|}%+$up4Y^R{BQ0rzBkQw?7iao#zQe*g` zAazk{ul*Savvd_HRH!6T=L0#)$dVze<kKiQ{rzS~e0@GGYjhle=8)6@v=$Bq$>Gcj z6GFC6`B=~iB|3s{Xi|7MMK$NpNRW>hQpuqr<*~?egv|2{>Y1w2e0d4P^!M2i9rihn zUc^nYpN(<>>BC&0y(TIaud<G{a1ItvLNwqf@FDguC@g;EiE%r5-B$dqx9zUik@pCq zf?RxT;<3rmTi!-^*%p<I=l$}da(E(;hi%23((*4KfPqb3#ee;%P%2tZ<NwHfX~kS= zN20Xjx;I(6{ib(2VqN4t@^Q2lpP9&6DNPn{lHT;JcU-rvcl@xXv)J)|kqzfGoZv!U zn%N5k$O1h2O=X|mG|MqfxmXZxU<16X9ixuL-Z8oiloWv)4j|QDHXw89Vk^WD0S+($ zD4SaX%4z^Uf%*=mWx+XTY*E{V5<DZDyo_ViFtov!8WF7|YYF%NJ{f@2;!T#{e#QXR zo#YM<B)kY`1tHup1-B%^Z-<EXtV&V<1B08OOiluERGYNs@X~{NC_;A*pdS+(G44^x z*9ijMP6BN=KEgtKbtm1z74UhumD7q56{5SXNM5XDdK9Vgm5U*F(NsXlSSdP=ngECk zrNZLLl2@J@x8L@ym~Kk?){Z;pi%Kr%U&^1_^j7Vg%aTPM<F5I#Y68{j@!bU9dnfiz zZu-hW0@G?Jp@7exzVtM~cOy`luWV}P)yJ+pcGI_-%JE+EPCfBK(MkgPMpyt>R$o4K z>C^?sMfZgJQt`NF-d8-HC(s>gWgLcT{Ev{dlu3JbVKLxdD~ZvSf#Qs^rL1sksE@4X zmlSPCFAcB?ixXb^vMGNMMMt(<;^$Oi{evTF@NY3HoiafaFLV@mh<M4Ko_1|fBfTlv zA`+iKArcl*1~3XSAhV}uv5R>VFI%nt<IvDT%0iMT#HrvweUv%9K%*qYN&rv}QJ@B5 zP(&C&V=W#LLM!0v5tcszVks=1zlXm?-!KXa4x9~+fK6r#GV$5;#vuS26kL7KaZ%MY zZ%y#mN)&~elcni6MUKG#69~eG2B3>{A^?q|7=c#dXB2#spM1Kpn80oht4c6zR4D>e zPon{8T}=cBEkJ2yn^VTGg_RI(GRk8OcG^4b&Bnvyd%K!*RC1k!JGv6n2pBP|{{cX! zo~9F-3G2iLO<$hKX=@OpfOwf%nRbIpd6gzC>9C<SE|c;KF8U^XbMA(OyJ33sOv5dA z+q~O*(L3RtbJr%^wNra;xf^bmt)3p9k&|T`Y2r51#4WnGe`5dS@u|(zt3L2H5uMSz zc;eB5K!5l3CCNVVvguvlK~w1v7A>s3d5GYY;Gu^goxznxgu)|a(8VktA<ZacF%&=u z{r3QM-G4!W>UNy2+1Y<k^d(JtUCII4K?4@h4)ID$pIRThLET!9*Mz$({30%Xe&X{} zv8(5<oP)2)%<iQeGYO|~Cy}WA(_yFkbrLD5&mRDZMc6On`1D;)CO$7UK$&er7<TQ* z?mC*aY{RCGYV}glDDc}Eo9eY_PLZPHM(99k4YdVl(II;Y=@64mau5;z0|Xy}rx2pC zuAh+lJa3VG9N?*GL@QhhAP88f6ye3KfrbbVW6VjF9a(`*5X2^mz@UU$`EF1_a5BaK znyp4!h4es(Mm!&)N4b_jeLIKY!vL_w_kX22YBghpfo9i7#gW&E7VMQOBd`&5gtaEE zKsHYb+uL2554%9@tj0vpP%4QIYoCP?2WW{&v_zjlcF2Z1MsdKtqU(U{jYN2ercXQd zL7Ig`Zo};FP5cP2SmI1l1?l`3%@nGq5dHoQ?&3bnY^3$++cXQQFh*`gW#pg4^Duh# z?3J@g-<omf9glB(+kBmWu5NpxZu?waXQHn2y_FQvCRz8`_@O(#x>;Y-e9f9k$JcY` zD{C*maOs81pTG3^>9J(x=1F>c)>Av}oZ0od@8=~erW<D*$&%JtZ!4V3#ytWB(rnfb znk_uL2{nAl_9gpe38CrieXvY@**z-lHe?J$H3m!37edp-OQWubW=S#(nn)9*Yov`y z(32tc!zhX*TK;HATKycql~zk#i_7|L)>-JqaoNaV43u@oaZVccvm$H^@!e3C67ZfS zO?V^>OI3V{;%kYiX%uq;xr{oqe-Bre=>V=47WpRVPOP7UiXEXtnoXeTMYk9SLBU4+ zEs*&B8}`Q~8)MDSKFr4TS;OQ_82Bd}cG6j2&}5ZFlTA2Z@=Z9w0nnE+4mJ?Pv){5^ zwt-Wqc1jnvgEo`C<2Y+m{m6`Eh2$rx9405CtUpDhO?&$~liFqzF`-!{Rtpe){yf9< z$9dcO5&P%dkorix!vfihq8GJq6VU@6X*XW@OM-kd+5hGLD*f`jbWd^><=-hPo3CCr zSG_h-y>@0#vU<Z@^+Sp3hmzF~-^;~gSV|RF5ZsPV#iobfj=vtixqLk$I2DxKb>Q*5 zxA;T){g)^$Az$pYbvkWAJ0LvmEzKYZ2bK{NGl-jb-TkVMpzKl<^sn?U2uM{(6|JiK z$VD}hTzUD6ClL(<Poh7?h1Kfe*Rb8fLZ;bnIboBTh3VA60R%sC2-__zby-Z?P4@Rb zc3gG@!XzYsL$l-Bk<E@v)7~&Y7&T3~eibt=ih(BqufB;-7{-QCR@13@c$5ZdI`(8m zUAbkDOby+CpwSU>sGk=UUHt6CXQ$RD3zp3ltVtBC8MlMUnrxYP5uBYnpBS$T`GB!; z`}o$0LXC2qd^+i_pL#ywUNPrxO}JZUp1slVfqT0cSL;+J=wFGyh411dCNcuNQaDoF zXC9cIk21?d0z<7wt$9FD5PP5XnFvyf5}-LGQijM62m`QT671|8WSxiivP}0;w$IZh z`*KY7otW%)n(UB9-4K}Cin)Z*DVYGs!_cI%xt_LkXTzZ;D|Q^nmC>QVeT2FR-!dX3 z?JR5qdQWl^@qE!W>4HwUkSGSmW$sGn!7K>dM5k;A*ab{Q@*QS2cum&UUkVVUgi}uX z5EI7fhW9MQguD%;aE1_*6K@gl^r1r;3*GgS(8@VqR(1K{rGxh*civhs55Cf=O;>kZ z*^%(I+$pNMgEf}c*I1&m6^8Q#YbPBLVok|k+cEE7F}ZuH^wNR(n)<72udJQ!P1Lj` z%UV9nMXnD$DC}Q2WY8BL>@2taQ7ulr1X227h_SHy3M~;1wH~reEBt9Wmx7s5=estO z2?sgt#rs*HgxUCPWOg>3VK+qzuxQUto@aY6>z6HM<%~L`)u^8#cGtUsVLO{RjO@uN zT(6W(SeCscwqq^SOFmVkUzxwzyx6jr^^P_YWAIa0qSj?*x%$;;F3;BNZ@7R1YDZnC zu#9IO*}tLJfuz-0>yX1G=KNYEN~g%EA>%OD46FtSxgM+paFR$zV_+dWvCLV>9iq`l zZwNXMEq;_HGchp-k$Z+51=}JRYzO#@7$TH$3_!LxAcO*83Q-PZ(g7ZT3>*o4^_aNf za2O#;@gmcM?0kd(lnCw*D$??qG#mq8KV1@{Ro%cvpc7$qW|iQ8*kj=hVtkOhe1-rA zG@tRV)*--zOkSpa($Yo5MTO`qw1Pq|Cb)Z`%Ajz60(E6L=j&hNtu!*2N+4P4Af{}w zCjwb%fLUYrr0pbRu=EkSoWICbBGJ$YBubiM2rQ2XfTs_b=yhxZLZ&t+6tV##GdpY= zVYKvY2!uIIGN=$MuLSeE{|n$lZpV3WI!4@}?nqc@m)!a&3iSOrA#xI82<D0e+`Quh zR20Pq4@JQUiTD;A*FR96{BCYTH-fi9x=aLwNu{Q8#5cJPDJQGRTy)-$@>#TGRAQ7A zJJiv12qKU~RPn;6j4+cVfBHvS8}1=1M8#E-w?x-eZMwSc%C?#E8@c0Mx4e%cF84Ux zIjb%ox^##{z@@~$&H0)UZE0rJ^^&A-6A6{eF8eO|=89SpMJ+R%zPJ6__8Se!qV40Z zpZO}VxNNzyWjglu3$MSBsNHbKTXM(WIPSdYnea^RzP$g^{)Btk?V6QWJFaxh)jXW2 zdHBZeKimJK{mGg=<G%UroqzW9kDeZP&bgZt?&g_}gnKItkSR|0)TV@IIaT@biN~j$ zSKU|Kx4bL#XPXlqKj`I)2PY0rm0hj6QgzGQK-3UqYg5h-+*&+p>l#5g-hsb`6ne@^ z)0!AUc$EGI(;#CAG&YulzubOl%xy;H(y7(4JX6t<P2^*$F5c1cZvLoE{VwpH2ersJ z;Loq;@{D>$bKt>jyHGWncd8&GBX05BrBk?|sn%jWA^6KUkSiDTG^pXx{89Hi8r?nS z9rb2&=^XW(D#<7Sw|bq@`lSFZAXXyd7`1HcI9dS8uLG1{A--M69v9hG2+t|9M9Vnz zZ(@bWTBp&x(L!30F06OL)fK8Ik6543U*8>dgQ<4~{~9F2L10<tztgEj^34=d?k1Q# zBDOK4mIEWrKoAh-0R0&1p{PZ)m7Z=IbOCokkOgTq<Mp1S=G%nog$zMR-Op(8HfXv6 zed=a^t-8coHxILfj71T8+yj(xpf8`^rGvH(G7HF9a!BHk-r}GhlasAhfpmdAjk1K$ z19;r}j&7W2!THn*t_|>|3XO-g4Mt%)Rz>jE2yGO^R<dkIYw1^BCrBSa%|Nq(nJH$J zMf|@wAf&Z&57Q#6$@zt_3u{nM&u)vjk~&{CYNbobEDPNe>8lM1n>o-VB%EU9K`cFT zIDi0WQ9w229K}+@YHoZWWDX52OqRCdeaIR)s216X(89zj8n#f>cb9@*1gabaIVHSK zZp22xl>aOO2>0s|F)<2<k;oz-9s@EdG>3(F7#%REm$dOP%G1XM6i?)YVTZ1NUYDq9 zDi%vKFgO&Rn*%1BTu%tfAEW3V4!#368dbo?T{QQ!a>N7TjxgA)*kZ6iGa$yYd_;2( zBmmbnNg{9u#a`ESN+QIM^)1N1Mj#=MoW@7VY<X~m%myAdDkk38?r*>YzHR{Y3f@k{ zh&N?ws2`l76&0#2BL3L?eF&k12F&Ra;gQFVS(Yl$<P@7hap-l96)#%L29vm?z&R?3 zieZ<^?KWy>DMr8w>`cuV?-n6$m--W+JhrVk4&uZ~Jq%jnsPg<C3hEq9c}z1U+-O87 zZztmbfra1)k)ag49C<$`1W1lX5d=lkYKw^16!s~FKoeXV{Zc>)qA9Ssl%VjKlxg+} zsfX8E^^^lU{V>JE5nR<&sYb_HXO>EFtgthc8X<#RcxgIMKnK8apLN(mNOGvoMIA)! zz3)(~Su$M&iYd(^1T;}b3N3;JKbAv~Mtkt(c!`BH(pv5UIS?(xLkPv7tFNk?I+(0% zzScOibEYv-*)b0P%8K#4JJ4}E$s)+}^YZ1dJ~y5ZrFmt;Tt!==qV3(@WW|PY&)*l; z+$pISfikAoCreh1@0$0OOok8yhWPE$Wpkx1iPDytjn{K-l|DF6NtJV@s}iNF=Hc>w ze73gzy5ssY?|FXu?1IByR)`4i`I5i!>e!XBnPcAzTni+ZZ~0N#jSV--63ZW%_14XM ztLD7R6W-;s{&ly!>mgNa+yn)F!9$b2`J&pX!-=BSxuSK6qIK6x=hk;7)_2}2+Bx68 z{(Gmcotn&_+HtdJE%f;X55d5tzG3{pWbZ`Ry$;D&dv_BIU1r_d?ioa3>Iacg=qqXA zE;<X0efE$WwroP8ckl)sWA0J+`5%H*$->TO6%l-5X)ooBx>>7r4uXa=qtaO3sPlX~ zzEWXvz?M!~+aaoAkTqk@uqCg>;>Kx4&9J1R{H)}d4I~M|%|LXawe6e@tp%f>tv{Gp zai6ar&B@+s*|2{Y%a0jk9fSt?I>`rZU2awq&aL+~NGH)Vevn5Tk7LYZiNt|tdRbWs zIgefrzC;9-9bvlEvlz!_kEy&Bd`|>DDuh~OE}6=wDGfU>s3bVXoB9v*oU}t6Z?)NL z(Kn5tKrU6K$ZP5uI^Ce0ak`>8&-OFwd$>v!=z+h<`u+JR30Ew$T;qU-@M5~{mleYu zrpf+)<3%W{;D23q@!Z6@DaX~^E4fLZ9}}FERG5~RAHMYP<sI1XY2(`uzW!jcREW>U zM}-0^v1#9YdG(|n^0LW?p{tr4y<Oit(@5^w$@&McI6lgkmbc6_d^0lTxV>!6jQyLR zo3hWZX?gp_*I%43tDGvCdS-UpVT99bdSF4aH<jF#?8POM&dJ!+uB-d5?7K9Enw3>e zZkzY7ecSiC4@lv7(!X``!0np$ndtQc$(l!I%V48cIp?iUc<ZNPuu?<4C!-TP?$oWB zaU|+m#}C~$bYycS4<$+-y3v*_*+1*uZ&8<7Wp*?@cxuxoUD>%JNX=aLQ{&iZlQ8C# zAhD}8xuWc{HXXPKA&lDM;BUs<VVI-g8dX7RR>{A08k**C<}?MTlttoZy7}r~#nf<t zHyOs4z>SUO6K{h1)3^uUm5q<m`MrMIm>0I0d0D5P7i}>kvK4%a8W!kN(Ne?QY%;x= zA)Cu88#A~svmB_)h9N;e3o|~<3~`JaoBTiun0x<G1^<}S2g3l^ks5p&>_{uY)fF0i zms52;gGfwcg)bIfcuT*+m%lI4&f0WqR47|XttHG0z@=!5J`+h+0$(UehX#hRPbI8; z&sg}dJ?Dam=}lxLJZrXYHOWuH1!-lpYI_3sx9h?^+WMoN6xP_3f{Knd<y$cbU0ay1 zChhxhH6T*UG#8?L>31vr5VRm>1{b;(F}Yaur`tZIeFUz&O&U|h)xnFc>GjSm8jXTL zY(#5KT46&7aujP?vx_&<A!dpq)veJR-fVWxaj+3Rmj2Yar~C7qf?U<jaEvdrWH7C( zMMh$DG=ZK*E<!-qAijzwYVL)I%4srYdMYf#+d=cAlH~QwL!QoH-nYU=&Gf1=)33Sk z4~(>#>~C7FnWeUTkr)?rqEVX8M?vWxM$51#65GLpEf~h8wGii$=x{_A+LD;pBrm~# zk{s74O9&si5SBNhNP`C<K_o(VYQ+s=TN%-xw2Lqq6KWlYSB&D)jNf#gJ4zfixE7Mh zrZ?0CgbY?O2#;5Ac0mLLH+V=xtV-+;b8Fzu!LwLCuC1vSv8q0LXdId9!*_om*pD*7 zen5<l-5X9q`bzfV5ccvu4Mu4QW=FB>i96Ja^+yI^iJ&vQ>}>@RGfyrOI-nfh_X_-_ z#;+P>nIZ+PD6mh)LuM(panP-cg8mI{*co;}+3IiVN$WGPh&_l48ByUU&==`xrqQx0 z{4#PcW_r^~(*yvR9oAWBRE^m}(kJo+CUgh^H`_chqf8<N=26p!RX_>NIw8?Ai!-|t zofWcdnZoldtzn|#ro$<i>7gMAL5#v6mIqQ{6m3jp(=3b;9RSu4i3m6%c^I~vCgD5V zrdptfJ5^MjcNRl<c-pKP0fsP_SofjBbEZtEOWVvSQ?`@E%!>9AK^;sD3&i<q2rD4; ztcdN*M%;pCoyMA&a-h+I(Jh3dy@jn+iEUIHkVkE#(<(ZFaFBE!INwC7*tAu{T};U0 zR+|hdpO#6(isS@iKo-bai`Xj4gfOg7PX@7xE-er$Ij#v(m>6M-Ajx*<N>p8kdk%F= z3zFqvhBxK4E_7)Il-37fqKL^h4D2sB{o3VI@nlWQxbKd;a?V|saM#^(*WW3x9M7Mx zsu?f1<0*w5*6osIQ}We;D+9@rwP13+zR9f#@3M(qcS>re0u&x{*PZg}%b&aSx#^wB z@-^f6KX-dC9Gk4UTz{z^kw^+w-*T_HQ@8e>RFPLResI33VR~DlYTZ4lyr5>%33__2 zvL#X3lB{f<t!SHc+;x@|*UbA{=KLEH{teeR-f-M_Ch6Zdc>sH=l~=!3Iu*G3xhtQW zc_vx?;H|PP^JOdM%9;{oP4AX{Z`rkF*GH1gowv$%BG^)S&4+98g}V-X^`muC^|GnY zCaczt7tFiM=iD_3cg-z#9jwr%PQeZhA<BRGQL|LF2D<a&`a5fyCLf!MCCVCqR=ND= zRsMg<k*e$e>)m2J`j}&E{J6Mux5xPxp1j>_bN`|&clYYtzgX?UbuYTrIEdaR`TGJ{ zS+K#W^{JN4)G(O(h<CJnWW)(7m7KR6ppUKeyY@DyPc1KKFF0;!2AzM3#67%KmY8*E z@MhSKWeC27$+#x(lT9SrW0@Qf_3<WyL_}yoBCxjOx@jm9jbfX}kv3STL5|jJ2+0ks zLW_YC>4Wf_cNyo+stK{DSB`{^8jd%&7r?T8+=5Ru0kAM6XVIfoBEPsy#<ivj;DouZ z=^`j$cRxG;*J>=xsFbzM4>N56i6FKkgH$r3z7~s+P`Gzs7<vX!W196miW<QJ2z;%p zM9nWU-Gtg(<?Tji!Dxi>5HUx>3|%wYB$_^zBO1dvBHe0)ovJc~UaZ{sGn(}ep)~Np zB~nSn<+@9Cx9ZnjuS?cHk}Tdao^z)R;S_CowHBlEuXK^ONG<Wr72^f>F&7&}xd8Ab z42nppHL}FBY^;bm5x}<DX$u6h-~22LF2r8aX+ZCVp%4XO`QiaqKlpoe4Y7zN1bm!6 zU?yBcyA1g?FtH*3Hyjz8MRapQuv8pL@##m;O~fJgwgjzoRvAE$JRK2tA!x%Ej1S8{ zbSodXUZIp*e?QB(A+o2gxlZ#YFjD`9#;;S1pBJ&9Cu5giy!2wivuYmtT_`{cCkp4> z%b;<cItgU^GhZd8msM#)`ZK(6{3~7LKA>$21-9QfoVY^q(!v8cF`_aanHSm!AnZ6X z?H05{BY?;e$O(B7H6O71Cho)vb_ogT9utHk<5r6}Q#by%)W|x#i%plR>aG@EDHQeJ zzqtM=#5f4aa{X`NVyXJek}TDb`I)ulS`pb$t1bY@F3$LbH?l|{KjDom=0u{#eJ*`F zi5#mP8EP(MactJjQ1=GXtUmASai2y7ST{!hd+O>ZkOOWM(6vLKex-Q)Fsa=SPaK}} z`V(G%5~_8fhM)7+CA@V>Z$0kkyln|@+njep!n+~q-9$Oy1$$-vtasU6PY#)u=IExS z)}E%ti^oXw4YNIm6xtnr%sJ+QFQHu@AJZ!uW~1~*#$k?&#Y4jR2|0~&?l01Ur!~z5 zJ`kK#gP3k(;nm?>8wr{&rdgjb_uvVTE3_qfO84pR6W!tNUNLeCfHq^$7CQuPLZKO> z2AUAWEw;hz{@-ZSjw1&q$bq8?_ulc`$+F2av&$d8@yvW>{gvk@<HDc0{%Z4;=5N9+ zki44fE}y=18i9D(w|W0u>!C#Jp=9e}&B?jp_4QM5fBs4#BY4fYy6gDfW@lFyyrdjm zUB|E4jyG3k#*ZOSSM^~u30f%H1X1u=>Mm;Jqjch(;JWDQZzyY!PGk<NK1XS!WD;u} z32;@4sV_W&U!^NT5@L69>W|DY1tfK5PyMF>VjPK|b}i{zaC%)0ck85_;t%b`u95|8 z*HwI%uI{epv{EAtSNB>9utQ0`-L?LnyTVnru+HnszgL&zdgNY_&$V`;q25)07j;Bv z;gX8^x)qS4E)?vyxoYnnw=YBXM-JQY`U!iXt75_LMRJ`TCwHzZf1xDDwOaHg)w36W z#-Y!M1(K{~L_~0khzKxNbE%{xh(E#$%OS*yTdYkNo_|7TrqOr`0?Ck(18Hb!Me6D` zpdKGH<{z!qU$T*RL?8Sl$u}aKMq+~eBDLC%+Ofd}T-0R;Q6r`&#h7CvtFFT<A-@M6 znZ~>^S8V7Nobf;A`cWPCXdAqOCS@HZ3o<}^`GfuN8V9@2E$3!(D~%UrYio_vqhc$( zy}<!!nKiiqm4;Yp{-E{^R%`bm6qqTg(YBd|cE8=KY1hb1GD<Vo_(c@{M)b+T(>Q&@ zX1GYK0BW;M*op4XJhCAw8KhIlSW-1B=#@m+um!XoF%C#U+jY&34JyRexNd!GTr9T7 zX|DVZorqo37F*%ypguu>)M9Fk+pWsrEZz+g@L#kI#pvD*j!JkpltXs`3w5~23kBqK z<;*H5A?Lj7KXf3&zc3B@#WgL$Z9zjJLTPjr6@c$_cqGm1h?T+~ZdEt6Br2%b9^I-f zLe;KZqT0VCB)Eg>cpe*HQU$A*ktx{p%4s!O-7?d6vwg>n+(h-GAGz>w+yjMYS>@%e zm$r_-c+<E3t<vddlPlKGy4PFqUG|MssTP^2hb9Y8Phb~`HBz(>oZaRA$nAA)5Jgg+ zUhBXkD<2vss7L{uECt}2MDecdlH$}CHO1BEU^I}!0SWa@R0|Q3&=$y(a}lN_pTnSd zWFLn?@ydk=gknPo6bgh=h%hJ;!k!f1Tm(c?#8Qv==3@$NV88;MXgD|oaU2_Jq;oPv z<brFXoNTYs)oZMUs5~`+{uYklbXi0t!Id~b5nAGx!1PSAtj(Y3xy{=otw7<&^tz>2 z%#`J3R?#HpI~Vz28}>InqD{O%G#oyN7bCxD-Etqg27SA3bC##SquCt^rZ>&@OPBZe zzyyZ;1%!M#yF@unfD68l<g6B1C8UJG805Hv!kPwg&2+01EizRG+st-DnzfDos(}cZ z<JD7_*agAh<n^H5P_dBgk=tOD^ht)!demI~V|cq~Xar`rVXYlTNtx|I12jP)$qga$ zHW+_0B09ol_?wjW{&tAj*KBNmU`<a?vuWa!VF5=>yIvPfeqia`XClKu|4^u$BX5yV z401;hRV10!`@9K@X9q+XdgYr5K6E28T1!SE!$wo!j0Y!?2#Or?w}3NjN#`+J*;wz? zFxD@01eT(V9!9Duf`C5|M;p_tLh=-?@kTpnsidO|(V^XJxI@xQazabxh|Y$P6OwS9 z=k!=Wp0lan21?416cFhaFSBUBi~u?Lv<R$1>5vtymN*Jd!F(08<rfM-Ofne>jx%o} zZ*uJi?s~>~X>m;mZ!oU-6I?9GkJ*NaPG|;?pOuP`#q;W=o`Y^d>6r)l4U*XG9J~b6 zC=gpVW8Lh$olf_V4MhAO4`c*$?IGj@Ji?o+GD;=o3rn#rs6>myPlI+mL&hcM9a~Ef zAoz`eC()M}O<e+J0Gw4ErOD4Id?fS}q&NaHv3#1h_0;rM9BG%yA)_c{7KDw}0v>?H zAc8>oBeV+<?H|OU?-_cm3_VP_MquAH2#ZFI(hz1Csa(Jxaq{s}D@bXH4Fpj{Bmts| zKvT1A_oi7dV(Him+BMtrX>9Mi`kn&`w3Q@`(We{VUi<pmgs<&xu9Q~-<EWzQo4&)h zmaV_u$Pw(zezNTSWyxiSXWfSv1EH~C5xcY$5M~EGwp=!dR};jnVh<KNH5^q2BZz;X z!Gz|^L9w2VHHF;2ewSzl@*1Fx3Frm&5KTuSuXTdwyEGX~tUV`kuA`2FGaWka4(1%~ zn<P^ps)T#_oO^Y`y?Q$KfxC5a>kV@M9NtCiDNq=$#F0$|q6G?DNz=zdxEnE|EOKbg zrd%(LeoX>j$e}N+5@NX^ZGd_VK;TbbQ5WeeNx4sfCUv2xr3XKGk^diTO^3NI`Dv#U zF=T9v#hq8Yh%p(h^S>i~?vqOq+<~BaMg$gpcYAgyGHDo-V4(@jn*sf2jD{t6i6%9k zAqaeyPGn(~u@JmXuvcV-Jz7gP5#)6uH&0n_<*cXvcFnS@O;?)6AHP#Z6E|=9`0m?P za0^M2F2`1|9J(C%i?}bjr^>!j2w7vn@(&%zwHP{4v{)blxFG1v#)9fJF?;>#j5G4< zM>c`lsKx6K=-U>wp=}yh7}QkAZLvrjshhDn>lVxDLq)*Zqbcq(<GVgV=Hb1;sL}@Z zR0&5z9RDOew^;7gP?Qw@5R44-sFMKMy6&6y66s$DSxEVy!ZmX+tp^AK<{%qoGA_16 z5E!7X&8SW!kruDQeaJ%nAc~rcGYL%eU(ka(N+)??s>oUcj=)FA6HAv+D|%RNNc1g* zWwFAE<-sljm$i6}!KJQguC^^v+m@`we(hC+-?5>{oR4-Um|d~{`i7+Mfmyc}k={DA z2HGO?Tt?dX%{)vrti}L3RM(6{2OYH+D?9;P#&Iee3bSRi8HE9wRzH9t;-$b%aSQBV zJsAb!)~pq2EwWjRns%Mp96HUdP-OeNX|C)ePWp$9Np^Lb{)?bUVOY@vbqBAyY?lF& zm}m(6kiY|6h@o{l0Z(JW_M~$0>}2oY&~Yd$cuhi>Gg|Q#3K9J-frAG*3?hKnuE&uq z+}{2HEmgljx!jQ<MGayP+f+VnPKb!TFrwGNim;4&0NK)L1eIidai0}}KrnO><d8)v zmN<BTZJXFO<-FxtHr+Vaup!Z~;a0;Y%}H&ptTj>AI&=JcPhWfbx|%H8%3f<zn*mhw zMdci{?D(ys2D(NdwAaqfE#Ht>zTx^q$>rPMi%sT#P;~IFODbA{)5^`W9?ezEy37-# z5Hu}(AE(O{l5q)(=XcN!I><!wCHp8O^tAm~Hb~P94M}%}ys%q_g#Lni)YS`l+A#?V z+a<VTET|gXu_2x@M_`EO27EcAwl9$R9gOfU?6jEL-9W~@6v@Xrqv1yZT&G72VXdzS ze4wql;HrBp_GuQ&JGP%8{T1UCKpWW+z=P`fW-z>(U5&<qrj<Y#3eN4sHU*8fE;<~F z@fx32H;|)gs!;_DqzEcT{2Ke?7$sy4uY*s7$sJcOU87!gM-&Z-vdzl?#j`fuI#?B} zksPp5Vy!e$)oD#>Z{~PCLAcmtslHLQknpnQNIoL0k={Ro*cKfK*997i^bTMTA)_D* z;R9TbwciYW)YEe`&DD%di!c^Fy3oO>qET4-hsbqzI1KGHA&DNt_>1{;)9?)oi11m0 z)yePx$%%~O2oiLb-BM5XJQl7+1RJp8BU>DD8MA;%rdLvS9)uMIY&b5+Wl<_3wY`bi z#^O!h2UwVmlWn@7XUI_j%M}jc`SE$eGZj`mV_K*`N$7??frYBZl~*-iT0d91GEuq` zTalJFu@8o~2qrJ{rIq841M^IkUah=RdFc=lJarsYVKVyV7htsVH4lYHtfP3L9R6r( z<8)rq*D~vF;n<;|kQ{kcKPyE*#d4JO<=uC4asP3YHrD(?ai>dq-&NRI;dsB?hI6lV z5u<BHLqbV_Kwj>2rRy<Pc?bUvtvoC|x-xvM)8@LqWl@hNOgR%m?#NlT@v_*9rk6ze z1p+>@=?BGwVbzPtRtiC2IvAfIa-^rnG6cXFtR~WChvx0>XDNv`M+`vgF`<(nO8+## zsTEUQ_>3Ds#_%iRFJVRqCoiIgjMC^C&3_%_7(RgsP-{kTrlDrgf0BI4xak1k$XW8N zJHgdfOmzW~Uz!D@Fwx^siok;cT4{!4jK>KDG$mXDwfRHll1A-N8m3&@d<?4n!xa8j z+c-p9R8t;HSMUr-UtIr~fIf|d6!m$Y0KP^5JT}iPpY`~ER$4dpY_ha@*4qrpzITP7 z(DA-;5d5vg-@@l`()AkI1TOa@zrZuXI-laq2zL}LeR-ocO}|lS>Nn!sMT8gX2W%V& z=USciW$#Ef2c>7GAlQo7qGWc#WD4n5_2`0xKhijCQaUaYcX23{G3uap<mXT-<P5U? z(stpel`Mrpm>ouIaO^6b-1W-Hd`0!Ec^_il*Zd1R<9}ggo9)}VZ3w}P_w~b|Vri$Z zbmxkgkxyUW)l$#^Rw_g*C5@g0tza?cx5W$xccYX>j`IykfuK`0x}y~LzoO~b1%%z9 zJ<-fqffTgoo7hzEcMK!5FHkt14F|$)kXiMz93A`*$OpiF2E>DfvaAsC{9QqgLIL_U z?j!2J@(}7y>L=d&j44E6s#$>X(&d>ho@czBBZZXA!o+g491xS>P%=fDoccu?<1ju$ zyJMA4Dz80v%hN)(3lv@Ri3^ACBCvDWxaXq+sjzCwg$>;c*3Q@ZNjkN1G8gLK=`~ln zz~dILoZL;+D1sYI9sdT|(-g0~3yIZA5>Da$e{x8rb$|54Y~Ai;$(~v7p2e)M0UM7o zY+&rI(@q=ve%|EzT_Z9rvB0CYK0789I2Vj4-22&u#(p7BGx~GHHxYM0cDbhTiDb#v zsluFNS`L~!Bu8fHAL3w4<67%=^?lSV<p9mX7OLq&gH&!e3HvBGkp;&?g3O5*ska|Q zQ6T9HOD={d!c#|Q8n4I3!^y&J;|M!cIaNOSFxmE03Tx7h6OT>oB4e}4JHC=}5t)qD zh}Z00dz*{1njSoZ@>A|3&vYN^eC+U1wnSk5MI~99N<t0w2XtaX1EL62!jQuF;Lqvm zCv+lfBOWC|Ik0CNopPxOkK=+Y3wFQ+u6B8%c?WDuf7-O*sBkU62YZ1dHq!dHEw~GC zU!UiC@Loj@?TJuS4FiG)@?9<Ws+_Kxd)|E53skvWrQ$nOdN2Nr1J&STp$I?eMgbJL zMjb(Nkd(Zg7&@{d_Ul&E&}Tp|45E{l95NFgR(lm8Fgp%}*@sOGB4_z2STqXjiM5=i zWkz%WmRa&z3gc-F(_*bOjJq{=8*P&sW7VS4_3wd7;5~1|x+#KP;@Vn@s1ol_&w9AD za+p>yeI7{sVic`65RMT1PDBmCiwFAza7UySV^mqtpJb2D3pvLnmW{3gx&r<o0|0)z zOQjGMnP5O&&i(#P0t1p3&~`^&ms<=WJx&`!9jh;p#Yg%O%Ju+Rc4XaSjupCj+P)Tf z$fNISQ3Q1^l)4HlbaiQluGr;WEsEu0-qoT6AX1_}kI%-}9O7}v)_F|wYdaxDyLxqq z!&}&aUZXZC5J;wCS2uV<V1FJwxtn)GQr|#ctEn05lB$ks04VCA8v3N`)QMn$fez;D z>c<hMrCK0H2h#L|uIW!RLbNV-?`ZYSMr)YcSCG6fUT^GgLozej+80pU>;SfV4&P8a zP~tUVrkJYG`lTC=A65#BH@%@68Ei!#ZsN-`TdBh;JlOGx=ntr|)yRpJ##cLA2U*v~ zIp3oR-=ps>OZrS*#lL>rTMuYlW_rtMNzlw(u^4EcMMh8bQ+NCgx+9&Kq~v)0l1=5^ za{e%DOLr!GJKx)$^nGU5{h7t1j90`cZ^1=6X>{LFhA2iSb$FaN9TlcNL9xYkwmrH` zhF%{bee|2q+$?RDsm&{vY_q=Y)*n-|{m7d(zy}h(1E41++u+JiMv!*h2+}&v|5~ko z$Y?!DG=vfoyOb^3p=;?bXvy9Mz0?IuLpUrEuoKt&XvV^#4%nCQ?fdW60jsnQSlmF8 zfd@6$1bw`D<D<nee&Q1wi<R>yXsmjRdJD9*l$}o(X4AhW##(<6Sc6$Wa%BY9XRtdN z7|fWvdb1Q%C<_=<a@@Zp7?aKeMg0}pwHQqyc>3=5KAZF%n{^)(4Mxk2gRGhfoEK`4 zYMs2<6pH$)C5uP|WdBd#pK-tfARl^qT4DLn-+~g-2+o)-U?8j$wVGv<v>T;3Oqn}G zD2}XhcSlGvqa^5WzGeHWVUUOYQy_8erUi@-P~XmOk8x+io#BK&>I9GEjBnmYVetv` zGQEb#ZRESm){PKILeV)$B$h$D5o&3QHgmktU=CJfCQY#J@F937Ejw?;hrG;0_4h*; z1p$qqjr9EKlwStL2>A%qtk{o<s6t}IL@o4U(>|<;CNyglMgLlc2e#k;0@P_({d&h1 z*CX>?a|I%ajNz}#);O`q;*w30F{AJ!ih2^3Y-E-L|D)bsNH!r@r7-QJ_uwc?yu%9{ zYDBRxl9&abG-lC`w5F1Q5L79CSjmMkP$X^OPn-EETor7FnAWDpN1i#p|8Q6Lo_+he zcXjUCzbCCYD-U)isD>CtqY7fbYh2({Vv9=nOey9^Ooc8DCR3&GVkE^bd5`q6V`|E$ zLrx^j#I#C$ZOR=(@>w-Fl*)m18}LXfXMilnhM103zmGiX59qWS6DO5#c5JFJov79$ z9Or7Is?ugCDQ65m_=xzUs!?KL8P<e)u*gy!2DZh>Co@Nakk5-K1}=y>QfbBI)=RCg zwoex)N>+~NBGSfOd2^z?`DXc}x7r>_wmk}eLSH2rgxt0J3W^pS#YOr5+#q?1Csx1G zbay4T*7&GV^3_kBhKu6qE2k6no8R60&VKwP3m*WpSy40Yz@}c+EAdk}zpQcGam!sZ zUuf)LV_l#P?!1gK9B>vYnR#e9%Xm-68Do|`n6g<LWz#QGh-8^VVD!Uk=?&X=a=t2! zIrAh-hzsXC8m5EZN6H$8!jR9vMw@~*6D6N<j5@a=Wz@;qBm-MPn^elB`ZBWPR&SL} zf{tmsp<{9czYF}N(;p|`m`WSn>QOSmdTH~9mFQ$k3PdQB=*)v~#C&UzJwjHr!x%f( z8E)^w<r{PxG!TTSIDVS$B&_@7L%T#qfSB{f+_UODndpU#w<o<8rZFeYV&*+{%1+Z6 z8Koh{-#{cv-zVJHBt*-kmZHzV8k7oP)x4$yGxNtoLsaMrizAtE4y3|pbCia56xl%7 zmy8I=@LX&r5EW7Out?BGn$Xpl)wO8SEH<dzGh7MuA{7h`kD@kk-S7$MX3WWF43ot+ zz$yXPzQw^F&^%K2fQ16y(+Ox2%kl=F#ArZ0KyHY@tVV|kfitgr+TsRoTZavycjCec zIH=CduZ#d_DD0TEAg#`1K0#wl3*~9S+)&(psGad$Q2-UC`JST21Bj$BJmiN}r=ps; zH12Ez_TtsGIbZ!5rW2z~_3r@Yytklw3|F)Z-3Y}<LoA9Y0>Ht}QiI1--X1;tpZY%& zGOX)98&t#H&^iYD6cM=$LKqz#{}r<6NYrZuzLbmWobqbTW9*GkXpr|~e_tBOOx#*X z4@^|Om?KMn{(ll){Y|umbXy2)HdnbeQMvYJ<<46jk0v{Ij(cxcR9)`B)PH&4(!lh# z>viwtB-ZbptvLMC@|zWhVJL5R<Tc**HcmfF;l<oQtXg!|)?4le?=-hiwASi`yLxIZ z4A16$H3%B^OGr$Mc$=|C5dU-D6$$T(|LBEG)RxyMbX|Yy>0B$lzqWd3uH(l!Hk{L> z4<yKDl9CL?KvLpX9N9=p*+%A_>PnzELev?D<y}KOZe|gC5$LECPNfc$UeAh{jc{Sv z$WOACGb6obi$O%;tfHl9xeCqN=vN%{3cHKT&a9-VYbnwc<gpQp^;Cskn)y3wH)Hqc zd^6%;JFvM~POuAAGp6hTfoiqTfmUR}m<1FQ*(<6cn9PG@!7L@aX+gk1YDlqEO+}kI z)1$+1BEa13z`TP#7+T~ZOe#O7CJ3L%&=3MLK+zLJBo$0wqJ?5H%y2{iu^<yIn4krl zVA2y-6%j`9)^HeMSx$m_iQ~yoaD<{(wELgJ)MWGrODZ$$44ESMPluuRB=I2E+rUgj zie^~jAA|M6Zg5IMXzE|N@xjepSKhWvRuD#Wz!JJLWhZhAf>xl6uK3^YF_E9%iA0Ms z5eRJB58dZb2dgx|tD;NK3=a@eBTA5Zmit23_EN1xb7`XMXqbg?jPsjbpbv~SxBGWR zu#Qj+75F)kt}(NTO*C#CTBIFUnK+9S1=)z&G-ZNL$Tqj@gefCX@Nbg(5nzvYd}X^= z7^A~oF_lX};Ucn<%01S7;HksM_lt{tM~|4)Xv$5P6sux1<)o{W=Lw7&4I$DX`zCY7 zl#@$w3`YCYg;f6wz8r7O<aF<co87=0(N|C=2+uMJyCOa~@!+KV<sH+T-rn*0jvsFL z!>zx+^~TA>#(lR|?gs)aD820~zIb-x>}2c}n6EV^e28z2&}(0BB#QN>r+&H-Q77uI z)!l5^eAk{^T7K8=D&G3fUddNJ(f6S*w{!(I46Ukv^&DT1@A?R~&*c{nO&pq9`PvH~ zc-P)7l~!t2a0WGr$^nZDq)1}cUlA#8v!FA2KjSd9iP<Pq*&YW64*x!MD5zMR#gP>; zVj~X=N@2^i;3m+7;K(qW2LaI|hE2QadV)1N2I_%=fD#P^im8W!01*^t8XRFZa^M~R zp<u87Bm`W5YSq}UlS2s+^(8~C|F9M$N4KE|e;0wG(ZFsZ0DTy~B=k|179or)ARWA% zC`gW2h#?)6EOd^Rjc6gfhpK7T0*AW}KI0GefzE)50DJ+WQ3?fP8W-tQ7d{(ggHTLf zn#}qf2Elins=?tjx(**_YKt*t*vMnjwZb9+(^|Kc0-a6smCzx4kkFHsR+t@2h>f!8 zjxkNt<q<WgBJ?%m4~=l8Vl=ZLx)g)LEFMl;8Jr)OT&Kc8va_5S7)u0;67(Vv5O)gq zm1g8&42LRqcrz)plnZbXIu{xQ$c6qJxR5RoP9|2NxTETaIHg>@CxHZXeK2@k0Xm4d zqt#daXJpIJQF<&u7q8U^SJzHh9<C&`&<U6aTBz62LjO(AvY(e%UViG*Q&UeT%U92p zw<pTmudhm!J$U1RL}@3CpMgL~fBf`R>;r5ZoGW>=IK$AyroV+paazg`LG_q%U`#_$ z1mc9)%ygwAZD8;w3Ohz?u+F{k5+f#z4qTW(+Exb|7y|HO5e}~=B8OO@1q1+OD3~|Q z)tGRu8|Y}ZD>SQhn8s4$j|CBTnau#mpvR;ExHg%)VTf_pcK)QP-$TopmP^pLWWb6! z(exB;z+(UmV2?O7?0X^Ly{9Kr>;ki*Y{C}A?t&{DzNm&G!{$8F@q~$&^oUL5x<`vX z&or&=V4mbiFPq{B!+WAuXmvH}r&9tJJ1QN_gre2j|71&~^AxmgI!`{dkh@GYa~NB@ z8ii97G8GnBWMR<{Hae_Nw4R;=`d5x<3>kMG39*PhWfF~W6;TsLamL&?#Z9dgc$|hW z%rL;Xh#>%W#e$VGXpSgb7+c6Q8S!wy`4bqLjbwZzNEbrS0?7ewp)T0yuzxtHB7%<A z%SOeP`j`&GI$<O{V#xG8^NSX6Zt9A}5ZaAETIbX)GCdQ5MXxjYsdcVCd5n7LYHiw> z*2Kv|w#Ww6M!OBGH2Q2`NQFS3y3r_Ui56P+qm6GCQeLgD8TF*ShJok}>~DOSyo-q4 zRG$QLVb1oNw!113PX8}+Zvq|Hb)E^<UIkPE1r+v;DC_{SabLhqAi+%}A%%+;QZxvn zKoTSf(62y>C;>7odm=!hO(1eiFj6-mThjs~C882%#B|)Tq}Z`KlkTZvfkCMnGl!mL z&Y3x#KA{LEQs_x~zW={(tHR@AyHB5f5+7c@ci(+?`R{-K{ZFue>cx#vg#tGU5;UL% zR}(TULuoLP)g~}??&2Hn;yGV&xMY9ScOdLJaI3U}l(@x0Lx8P6;b3G(B*-OUrnnge z)RAZtP?I=^%E&9d1WBx0Cy2_=+Xn66BFMa2n{NAJLRxtX5*k^$03iiL!^jIRi){3J zHR>g2EM2^H7KR)<+sDj2*1levOb8Gf8nKmjfy9vjXj~9Nnts~31*xDmPDm;!#9fj= zMfTcL*A1<2#sOF*&}S-Jv|5qYD~N!5&r<FRUfF)4q`))CWEC$qRH2zOqR(n2i2*DL zI=chwl2$$XpmUG~u2XXCQ13{urs1X|M<8NB{vx1Xb-ci05&SF8u|kTX%49HC5APiF zI<z1);McKO?SkhJ&>gp<9B3{AJ;mntG_DtFZx^7krvTm34wPl!g~byY09`e2tIIMp zGGbv7SvN?e{Fhi;9-yl(Ivu4`H=Rf<B>fkh;vV9Cdb-3cNW`K@|3W8Pe-bs4zsO$~ zCP!qu!3G@fVbKH+;}@A6ExnanIP%n8n;E7>4hxwYxh(d*INK1W#G{=o_Wih7jL0VI z^Xx@;mYE#BFD&`?hIs@(@!g@TyDNP5s=Kwh_R4!pQtck`W%?*}K|QRvqJOdli%yu5 zyuMM$Nc^IaEs&4r>UDZXTm<{LU|8sYLf;m;z>q4-m1$FX?5&<(1lUl(P~pwpsK#mo zOi4h+P>~TvQKb!M&hSfufGrm~s>ZFyj|a;IX&TQ+CNn~AU8y>A+=-Bx^twW>{yk0c z-=Q-SNqOSw^kG?WhYu%DIVo&d1bLWnZ8Ls>@I+Lv^ouQHEf+VAZ44JSMBR-rKlC_$ zR6M(McVy}ASVqY`t7Vx3rUiC~z`XMK;dNbnmnHb|DBUa)`#?{iq};>!TSFJO2=_89 za#)BR?SaS@k!a=614KvQ8nOxs8=GKJNP{5MeiVWM&g@LrP-e!?-ZN09fqIg9x|*9v zvqq+B@HAozG+DYMOE*xvz-2X!HDU_xryu%SYvaMr#?X?+wM~cXr9J3Zoh5FOy5m+5 zQc@mzuQx#&!gGmECumH`bRJ`xN@KceY*pA-KDA{!JL+x<+nN>*o+^c;86?LajRn>W zc8%26CsoBYUX%|EtUNKw-$WN4!+J=yo^(Jt1H%Q#I#pG(R)8i@VZw(^18K^WlLj)z zfED?Y)XDC$JdXvZs&nk2&Ab#IfA$ss8UY&ovh)SMFYTt28`wfjl}ifK4bm)0e~VMx z`Hb)@kEbJ4UuSPmK>p2n&m<4Mn1&OA$Wd|q)DBY}bUH&*dlVNSO<Z>Ss@q=Q_tws4 zRYtNZXR{h2Sq;<AMzdB5=fbb%+}R*qBJSc@cYVZ-;G-7%s+h0fQu9PJBE<wLlBtu# zJLksEg>$Q?t$5eF@`h_AygKZw?gz;j^Oc&#rr&RMv@W-PvdoNgg6JC9T42n-#>Int z6_X|k{S$`~2GszE#LH4PG=m}~8P=+1A)y((1#E?o*7Vr|cCrs1wgw!U&4lKV{if+( z8Tu<~78I~=u)JvsAZ-}RT7eB*op3lYA#4B#b{6D3qL+}aL!NzX`%Kb<=)qlZVEt#0 z3$AVB#*H9m;7+I%t?j^G4fX}=TfJ4Yq-ojmvqzz_KfAQ1PDDRnFM~rZKWqwgpIcHN z>?Fr$NOzmm!XhZv<A0^`vFfj>`_<}g>@cb}vCY3)ohz0#)o(Hw4BStwwh4uPmByYx zh)T|N*&BFto13_F6TAVbwD^p+x*^xaY`4eFOG2sI)Px+Oh49k)M*w#`qvPqVPp??9 zq+?s_?%kVPx9o~LL^zVT6{001AYwoYb{{7fm$;p66tIobqL-eglMlcbw}C0ZQ&K7P zCTqof3qeXM!b?Mh9w^`etG~Rt7yHNhC%dMWN7HLYw$FKrXFU}WPsP;ssHb6M>*r2S z%$q&_%-AqQy58LH1t(X$F*qIyd&|dcWQ0yPaZ1mBt7K{*TF?;AZwz~yW<4t+o)y>j zMLlarw#L$ZqtA@5nyi|HcYImcX5dGI76~Nr`?&bkwq@XTb%Qt5h9P#8hSwii8fZc* zZG?UT4sE}xbB3B9wk1Gg%On9Uet9M})E`Q3)a~7e>qFibni6jCRuQr^HG+Fp@xGLg z86?U|u1~)KQ0`WVPQObtyq#zGc6!FeV`Im{IaO1^>Fv?<6_{d!TkbTm|5r|RO|Oo+ zm(RM_M%-(!S4Q2N!nREdNda}jXgmAWCd_D16)Os+u|9m*kS5YtHOvInFdzG9^6GJk ztBx8G*p`$|L}O!(k&7qsoxSYDriK!bnc|RFH*rmkAj9rrSQ4h~LjWoEY>GdppR#YF zoJ6O$Xv)fPp^&&tj#W(Uo34twm(03XMck{R?locCnuU|0Zn4#P|8cfh9_Ar+n29we zhapmL$vc;jdt<Q43PTYdHzIC*=NX6@u~nVch8x6a^2llyYl#GGO@~akGV#NsBz+A- zvVcr|g~o+W|0|6PDRF_UK&ED}<GXcoU-SW(L>-G0JQjKyRU;fI*KvhOqgg>i77oL} zXvnNdk@**~dVCDQb&d14m|r&UBbRdg)n#w7hJ<y;Geod~<%f9UypRR>f#v-xm#j$; zzl!LB>i}2-XQ71!F9DH-E^#761V~3nb<vb?U?QQxfzUt>vIu`4oAhn8E$-eo*f-F5 zek++!O8<<(ghd-7qV)BH4X{x=;^ssVz_;+0M5jNXv0aM`8e6+PbIz5Am;$a68tBZg z?xmPKdGOA)XTsEM)O;b8Tz%n{AM<8>$Ms9N>Dn{z2ea|^EADjDcT<*HFL@iR|Hi!3 z`o4XsHNnwOos*xUH1iGkD-I)!ZG<4SxdRbrG2$mQ6oQ#msy7Z}Y|KSuLZzqj5E@}P zWPJq@2#2jNTXpko34P8ay&9Oa^C9yrI5nAP@AMz-?<b)#W|&ieki3qNjDQIh*N`9| z2uCNhm#d-Fn||GtQ}h7&U6hx>Mwaxlpbm*5VMq%iLWs!0atm!&%^8^SAcR%l@ft|$ z17~{`$O45z>`2@x2f>Ux_HZ;!X^Ma=O=e5vdu7;e0Erd&BZ6yEBul9hKNGb~46A(l zGlIIk_yC|T!)C9X%PgGDERSTC&t}#|GLbJVn%O++h<S6!lo8p-!Y;p_Nm(3mFNRAT z-b*i-EPK6gsx0iP_$4f9?69OEMDa?~QqzYet)<pa(mkz()=vuUxb9LR0vBi;AM^hj ze+=A^EC=myM{=+`l9MA$x&n5%9i;>uIH$5ZlAGO;Jcur7LR86AoYOhBq?cn$W^ioD zOm;!?!2!v1Fe{LOb9NvT=bV5K=iERR&Ut}sob$U20y*DSjR_AH26Az?2%4-s=?ye8 zv~@qk41|uA$s|BwH#U+t21uF-4~KzHA-hop6NG%0FIff?4pI-prAg^J^`Dq>LU8lH zjgx*4CtFKo+M{PU^f4<3Xeskyq#r-2+M+9^OgiEWwOWwKS*}$fqEI{FK^%jCq;}~) z;0O7s(yr6dA;s|%5IKWCQjAWjIa=HanGp$A;%))IY#Ro%{~uDZS)39ipX_{<(+>5s zq770#uObAJBoP`h&E=L%9-HdD))viOOCkK`ib}4mzP$R%rpue&Uwv)W^_GvNX#JDX zqFp4~&lh{K+$FrPGfHT|j|c6=kXGm?f?vcytFj6ul({8t?KsvaHKOoUIa)lKB})r^ zuE<v>RG!c|LsOWW)KlShMd5}h%b#sFzc!LzJKY%dt_izj@<QJwRqXRPw4Sli8N~!r z1To6YE1k5)Ej|5l=jK6pUG98}ggGW@33{Ap#6q4pA^(Fr2>u8@H!<qoB8(>{5;BX> zSZK0xws2XbaM`uh*Y`vVpNx8Ug<ZQAPMg}t=N>+7`f*XF&Cp}xVg0prU~Z&l^pU65 zptm##kLWG%_J2Ze=gYabG?{~AgCg0x5)<g!o@l}5sCP@)wMFz8UsR9({ykRnW-gpz zTL*$AX+2i7Zw$xOC`CKbO#LoMm}QExq~N;$3mukL(YUdfk-j^Gm}qk5e~opgHe3No z3pW+M1jmoFFM-ltvf<L>l(>&(vO__>jDJF<3C&+v;1>j=<V_1VPh|;SNxPf|_SxGI zHi}Y6{o=lz!^MMaBZ3|*Jv>i7DCm-*N2unw1OC{M=2D%9lyR|2>uB&d&}j`$3Q}U* zHddulGhqxPR5tm>v#AW%Z5oKBctH%r@N2`MFe#`+*yBfN%UN%A#9PgyLQ)19zF+@F z*eI5&x|b2-^}rz#`BkWmNrz_lMKZ#N55}++5wEO9B&a4UWKp(CW`ez_hxE{P-fUzf z8?YMrX6Z2|#W3iyX!|5$TEY9_Wt)y5#lA@!<$e3vfn$wpLU|wr{VxqO=LSnjh#Ch@ zwBSaaQ#XS!s0FVO=<XupL*IeE9=d4bpUg~97|u>a=VLQO*-~3lr#fy2gK`#H2Cyzk zk|&8A-;$QGex3Xmns`#~=q5e~Gn_c%h>@5wkuq8NhIiC{$Kpuw#j^4*t)Eyw<wO9Y zu&4H`Id9orlMNA19UOK2wI{=c%V!H)B84s2SA3iuE!-CIZ2QiWF;C_%@1&sEeO`1Q zX0%#NpIA~_S6M%CSGO*;ezMe#>jc6G%@gZw6)qA8qerZyB*X`_K@0^ChqNA}t;Zcw zF%428vd|Aw2QhKMuh16Gf<PNu;pB?hqJ~Hjg1beF$YDC{TD}ky{trd$jt=&5)=;~& zHo2e2F$AHa1f;0obMf*o2^`8%N`S*lV=qmvxU%N*nyI$g$`z5y71vHji`t^ztznlz zpb)jU#PdC9;Umm(J?n^!mcH?FH^ikt6X+csNiz*m4`aq%cr3<Z!E`U8=}sI51rds2 z_!k<6I@B$%im~Av-d$7K?-spXBnR^ge02K5(;x4THa;0G)5sXPMcgcPH2%AhF%RxB zXmr_0_F=Q%jdq1fjAvhd-HcZ2<{u$2C-+}@?(%a}f!XR+k?K{~)1oEYqTcOc*Y<}% z`@`m6s(-*9_#4jsap(v+{)#gH?GK)RKh1yQK&bOC4}^^dqCr3aLOgDGZG*fa0t)iq z&POKg#;c9jv!i7jqgk86o=q{Yp?4nbJ4`N+fa?;3RdVuZig1KRBp;fnBUquCSHjuC zVx)o%q{7*Pc3VCap^M%R80MIUNvgH)7^-TaepMD1?UjaQ><MK|hWn<;NV$t|%gco0 zOIiXB^79)Y<s}~{4SWGls;(nSDN>y%3t!qaKr|d5+TE2%^^M&1#9$>I%18}61K7Q_ zJoc~vp$tKMe8V|p4>%PLdDt~TR4yM#pbfE?@&w{bQ@|BS>Ght@7*0VA6>2%v3o_us z7*;9wwZ9la83u;z$819>Lv|hswGBhIgf^t=+K`&uh6>YC2(w>AjLzpxX8d>I*m>*o zrWeh1?)H$2Qk<R{2sVe-@8c`~OX5zMG|X0JBJl*s6lE0<o$^w!yZ0FR{4v>$q9IFK z>U}f*Pm}5~gK=B;`R*=><`Oy(JDaQsiznD6p<kSVRCAjUJ1?o*1d3uDt;!FiTl9cd z3#rjM1BlIzfbEbvNc-qhDYOBLFYL!}DVI*<-CpMw5(Y#VHA&?-L377ljJw6(4wkxl z<sXXlJZ?SK6F^ax+Qe-{Y)MqH`WD>@62SlhS~&zEP3fRQd5K8$Y+r}?Knh`vCNu;4 zMrP6EDag=Bd<JTY;s{UW&UkC*d}XnW1L2JJ*^C2`j00boESbK!+~PM*An<f15<uCq z((jmTY3UIBBFkuQO(eHw+7Zodp3Pky$z6Tj@v$wMyLHqZ%PpJDt&8MBMt2Q&R^m?K zA_{d4zmN@YZ@5++EnGY5jrp5LQ^pq~$KD*YO7I*ZOP$GP1QMIe%o*>GW>()p6zt0B zidaE0<)eACaNO}FqF`6v&MKT-HMQy5wrJKmvKr4o&aT0!x|^PczxC9>0Xj2#d{;CB zL2NT)8AY=hWs!`ssmf?ZO)R7IPKv!ceRS)1bHq~)3!$R&sru<}eC&u8ZXex66%|eP zOc&hrEdR0u-{H^S=cF{BuE}g`vi`Km-nQDAKmro}WE`503q1*_*>AmKM%1m)T49ii zAity(5kgxL@|WxtaS!fSihUq7CqfWMNv*rDn&Vlp!riGz^tuB=giqqh1VWKGtx#sd z>=Qd(jd`CZyam!Qy)5S0j*u!|eMl9&rXG*gAL$5Qkvi$Lpb<pbgt8JF!K7b3njz8H zE!>-b<B!sI8cGt`$$RCJ#Lv>Flmk!1+`Wd22a4cS<`#q@_<e2XGurixq@6?N<B)0@ z$via}5uWN`!J#y&v$WqgH`m$Yc^$0UftpAaY_Q}&lWel1t-v*M^d%b^z8lE>NQe~5 zNSu~qeJe2p!FA|8P=d=d>#B^nDyI(5xR!tJ&Y#Q5xwLv>HFHw7aMlx3!?QIlk(!q4 z%cC`$Ze%?X_B;XPG3pl63ACafpijlPO1O(Pp*}DYW*Utm=mM2;P+vCb97GAbCLPLd zb&j&2KrE)&?ijg~YHA{s&OvEXWbpCu(qu_Q8B_xnxQssLJ8%V5<=qdjJ?I|DRN8@E zTprU`%vwAZ<aLA<Qz0B&Lnt_qt&~=%7VP-uI(z31OhKx$HE6m<p`zw}g*knw1Q6*% z3b1NP#7%{RhR#a(#K6FrU`ul|%-YYM8Gt@2*hI>prk?)h?!IPn3l9!7pE-40h0kEq ziGkC-6#&AXE|`sqJ*-iL<`9ZtY89Cqk#{2S+y*~**<(HDq2KJTt$~9$-LDZQO!}f| zVz4R5S`F-zFng@65jysyvgf2Ts524HjaQL6KGYh#R$FtdzrXotr_?lXejuq<QpMGZ z7Hdsob?d@fnwpw_#fm5+UP3+MOHE{KE!AotR2%vme?aXn8jJsbg--v<ZKbg|_N#qE z46HgL&q4u8p@Z3`KiCajB!$Tb?7|TS()`Yz<0l3h;R+2qTA0`&d4tXaK^Zcs<^|(P z*$*SyZVDjmuRRTyN@&ZvD0T)J^dsy+aG<V5ZAVj+(5w<zVojax=54see*k(`SmQS} zkq*973E?3;5TLVH6>y>h(7lrHgxXTIdabEjTK=bR?B?FizEi>hO-zK`pTsrJVD|V+ zNgWDAm~IsIu=-D6*mRCb%5YIMYHf-9n$y{;g!7cAR6o`2p$)&$3`;);k`6Vq_LW_* zIHIR!$U(YzK*_PQgaQF9SoE;n0PmpkA4p0DJ8_u3)3%3%QRL!D;043&?lW;a!2W0u zIm`#>9(yju(|V95rJFssfjHy7w(c_kY}V^Po9GMflnnu-udv%BYSK;+$x!(?sB|5X z5x<MZ!6vB}IbOXNw~uY7G{%S^bn^1a_X|EKxmprkv^wlrO(B5G=e+r(v!8?_qmmL- zmEVREe`suI64JXeN=}vW1>*lw%I#a}dq%Aw={-I*k;OYb@Akjle=RUmy$()Pll$Ii z4tvV(A-YCx%;O!mj{8P;g!6VpJUiw*i~hlGRpJJsGwNZ(6%m5-w2A78b`T!=a`Fox z)8xBSk#Pw_MS!X|K@ez_oY6%86#Th8?jlhxDda;N9?2lc%6WFh?1!Uajq+}7T@6et zeu3r+%{R$&q@#3NK%SE<Kbc2BHUA6E;7U{g9>MJ!UvX*O#JZ`}8FxJimT*0rRTIgo znYKl<V71xEY{af4HlnWB$m2)o#z^@t1fMZ#Bs&0c)X2qvI-$uWjh;{#F@H{)0hW9V zA0ZNo3eO-CkBPL$#O_GMZb+Im%}zfFa3$(!vY!Z9NU)j2Ux7XfPT&{020aBG(#Q_b zvN)w>j%>SYv)FgT3CL_;d)Hy6OPt$u=f=AZJKTuU-N<@eXtuAQ=iB(XD7ypKRy<2B z!m}1D9E?)6lg*xe$HQJl+s#OBEZmCta<9d1mqRsELlcbS30f=gZ~i<^B7QvCmQfh% zQ>)Rb<{^`a0}sP>^CJjuBF~c!jU0Xf!!}Go&y||Z7n%k^@QTd2p=FGt2Yb5V0!UjV z5EHgb_EC{HJb2VGJxM>gF!@xfs7&EiL>vm*VA-}W0r5ayELSU?M{C9jG&i8Z98Mll zBs>`-ZL!q!@ygd4U@`n!DsdsUIbZgrnu(fAjT4Piwy3Xa%sFZs?F24yd&euk(;!Ee zU)f^5ZfP-h>AR0l@G;+nKd%BE=+nuLnvQ|i|F$bJ=I|(ZjDt>aYIf;+cqvq^7>a1# z)t!EX?ie_W=m;d%5itdf1qW@Y;dhZhTAQ^ojQ)2pOPaEgbrJ^irU(m3&?n26VF7*? zLI#mZ9LC{9xpx5jgT_|0uw?NfP2nUD`-l)8vE55H+_se7sAez!nx>!_FMI{`;7S{F zMqK%mxic<5GmV82SE1^?iq)wecuSz!aa`!pEa4|{=u+dEjCkkw<oXl@4B%FIDcA|= zvq@2o%B%-D_-Nb|4V5-rj<`dx6LAleD;*?I<Xw~ik8LjEwm!0qbkRW4V*v9H(R9cc z;ob(FCeE}rK@y5V9KwsCg01>N)K9?=Xe0&0ja@Ax_j|qX?3ms^+qfapxFK4(G3wm} zP)-K|p3IJ>FG93Em-~jReB5>^Z6a;5>t;rI#8tjfexmMY@1QAqNHW^Z9==z>%!>NM zhX#>`^{5k}lqZPQ_Da3M7ROy6aNq;xTM%)$5bCjUXZyCNplep~L)=C33*Iiy(iH5& z3%qfNeMIW-A6U4jy+UK22)OcWU8Uicx3&DjE6&SK*@h`Qn%_kESLejtE1t`qsr}O} z(fn0(H<pjAtlvrFfv$5IZEIo+qsf-&>+r(p;It-P@D713+Rp&CY`y)2fC|DAj4Ixw z2Ib(_SG4mixreQ$<StyVD*iFuY8NTAxSTPD+K3ku@e^>9DG@iZ0iu%)5MAAz;#xrx z2U7=K$Vo<YT4<HL##sV@NGfD9D97zq`4uKi$>Q`;80-md)+3<B0DEcpP1BC4kRaVc ztqbRxWt`b<-N!m%X|EwFh&lgA8CueSbCjWrFOR)E8Hjo-VEDOk(GZx^zxgL{`pp)N zQS)haENniJE1}#4&1V7WpDgSEt2m?H^03jWS35wOKs|ajTCEGm+QO?Y?o@QM3rIy4 zs^%|ft6cs%wU(q+Vz}9YF6u1}yX5?o)H>xrQ8Co*xX`y0)U>{wTpo7`qa_`hp`3<e z_8~t_JA7D=0xgq%MyFtYfMsAsa({@1Rs>ZY!Z`5HsB3;yM_tPrZxiWBW=k3)C5_X= z(d-S^!ML=AU2O}2O6}<}yq?fg9cF~`k8INodaf+hE=#iVj|_zpm1u(|p+u9$0aJAr z(f<Q<En9#xjpYzsO5CKF30Sy@Fcg1IT^E|=xwOpj%1K)^tps|Il(MPZSXKeC0&i@9 z5+<eWOS(xZN6PMV=AQ3l)L7rOFL5T2t*VCkC=UmdtmZb;;aU)x7R?<?qX!UZPel~i z-Id*69x52#tBe#Py{fxEG>VIn{)n~}_%dYdV+rRr&|SOPoH?E??ogsD?JhW`8MG>% z1)(D1=k@j+?Kln3cIfh?LHI*J@giNua};YuGvXe>eR1s7AX_)ZQ{`J-y}?8q_IL_F z>NvvPbxWawWPnp2eM(~u;vHai$7an>9rb{?&B2&jQkFrjRp6f~TX8M$<F=2p|Ln<V z!S>N7=RE$Y!s&fCJxeKL(lUm=b_fbc^(2uhSt_Ixsc6~iPRATEpT#WEWpqY*6JV0e z9MQhOo5KgxuI2beThtR2GNF<<oC-Sm>9iI6jm2Ju);co3usH3@=E22?D{d3l(uE4t z1E1q#o@}R+cQCPkfugp<l-`E@%*lJ0i}$b;n6^75V%0)T3c82#3@TvZ6T{Lpjz&f* zG-638=LE#kNjB{Cd4i&O!YmX?Mf!{ef{5CMSb96|BH!KVGXsOlH=EY?cAh>O=-hY{ zqa*F0*A|$T;%4GEfSlOc?g5|SW#~)%44Hw>(ge^lAOoMwh2No7!F@qF^hGr;dBA5F zk0<p;vB-(jr)W*_r$$r6$LIt4LqBkW&k&#b0Sf7z)R==v{t`6wJp&yb|EI1~E)g{Y z!DEd;m#o+Y=rV`TP|F-Xiw$_jXy^rHMUcVZ5vKYp@Qa{!%`IQ<$gW>xH-v2sBilyz z6A=3dbba$U3Br!w>cR`^p+adTZY4r#w~Z(*1w9|McLP=t{L>cq9PBxR;6FXb2;@SG znBzsXVtCq!dx!|tgXG8}aApDnNR!6{OQZOzRliw0d;?!;dd)g&1z&3Zwrk94M9wSi zY*SkdY^z~TRkMU`hW}HzD>KZL7Hl&X*;d2aX$4$x2f^+5H&eg-l%|Y>_HcBIp3^<O zofLGG9hEQ)0<}`C5O@vtOIkQTHkSxC$Wl;9K!Gbe;lzgMsb}GZgeO6i@AhMKcOq;T zQUQ|RAv9C!_emzJ3sE9xuIK_4i#TPfmcU=z54BPEnL5_66EVxrk<VERVn&FA3_2hl zJ=)VtQB*nB85CU<YRE6EA2iv2!VX8vlyK$z2u{CiR#N*NUWpwJx<Vs6s({X+(1_4c zW@F6IeN7|ej#=c?f2+0Bf6{RPF(of&TNWm!PvcJ93A94-&p;dOC%l)6Q`{b6%ASDG z@0W!D2k;<Nr3dOJhG5`7b{*f?w4MSnoj)UOoTn8>yzEyjnYn9n<d9)VP64DYIR%$? zPwbw`dgti7$KE~`&2Efk7hKviv1h6>nq70xZq4+4VMXzO;(ha5>o%Iv=C~6OLoJFs z@qOB;<1XR^iQtrINy=NX2r*rc8`8Vzo3ix^Rx57j=7xL=yYT-~dv{WMA*S}3(sM3$ zjCD-zkEWI1F}YGor@H4Yq6a1ASK2SPM~fToxp8B3D}s(9Z>jx_bzf$p+?Q1NE}ibP z5zeK`R=f2RyS+8t*^aHs2&3_yOVb*+5y>Esr-s9Rh$j-AZc_`((ZX+=zOY#AE_sK| zu$S@<d&h#SJC*Rc{H7p1`K2zDR}Y(fHNPGgi73os>b4o0m6Nj-K2C?S0T0^i9P#Wu zi04JoBJ@KUs^S%>Jo3v^rs6wUc^vmB2#`Y7hSHT^{?h|Jr@IsIAT^mla6TKL2P{bK z;KK+D8euzaML;@)I^?$rza|}8NuwA_Aj%<7J!cO3Ncc(gl+kbvSy<p&4JJhm6Qg}b z`vT{QR4oK_C6H}U8E*OxO_cgQ)y_~W4=JNL^sI{Zh@u7FQ^!-b*(cSb;v}r*E!LG1 zshWjVkxo4dae&HjW3j<7iKSl@Cp7M&aKkiPaXbH!sMXR3IK^Gc=dmJxh^C4a`N#D9 zM>r`f(l55?_i-y!pg@csn3`xcIIuCvQ6`|p$?#Ep;8|~J#9InMuD1&EungZN=Y(_8 z_D0%lMs*~kden}@=HmkqchTg)RNLjyY-w|(wE5b~8>MTINBB}`A_O#(S2MaJR!}lq zusBk%czVsX1JME)i;ZWGJqdCDc-vTL)>|IYIP3NY$azlDP^1zX3h>Uv10YeCl2`E` z(mgu;H(JFN7#3|6XD=Ry3Z*WRRX5!fZh11AwQFSeyv=PFVhMh$OPg|?<LO(tn=F&2 z40u?~c4e18=wK<e6;kR1C)Dm#qM+4MZgxlYbf=L+s(Lq_9aFvRm`YjlOb0XBG1bS8 zsafopn$3=>IqaC4%Z{meECJ64Z2F|{qluyNy|S$bfRDqG^L`8D009%cPDxCf=u>LN zTl8;!2&cyqe=DdB<(0!oV*GF`AyW83Fsb4OMQrYrUZUw^3NwZ>2uLP!ZHV<D_E2<( zB<a#HipmVNylV>4IY3)w7dm9Jw~(NFF>3rOS#%CaeQDyQ*}TP(yv6VD{ot9a&qVT; zL+mJM;{+5*L<SF5I-^KqvO;5`4T%aFF%nS%)TIspYL*Wplz0k^x<t-UW+O9e)Z<a! z*8aXHe@V(mw0;!<KD=zeR0z^jXZ&P-6KWUZciuE7CeW1~nsSr~N}UuJmZ>~YlXWR@ zP6GLWv^^>@By^<LX}<5F+0viV6&dZu(_0Z!TA~24YzF|hoFAe9R0Kh)Pj71pfiIwe zC@K~RgbEVoUjJwj0l*1V11{fT^5tJDnJ9Tnx^nLFIT*OY{??s2zW>spi9@qFwUM0K z8}8azRt|28P+RbCc;Paq*3Bw-s{-2e-pjqw!uoJwV>qh`;dAEFi~sGmkK2B}`_tXw zlHZD^?+v^5F60+g@F7p42f4n;w*L<hOkpYv*57~%Mn=FxYfS})HIVGMaf1)z+LW>Z z&fh~IVYI_O{F_Q0045FeEHW?|^k5+{y^j`3e+Fp4hQN@)FfvLoqCt>q;w}9<Dk<xP zT$p#EKKcpnCWzeP4$^6YLnOLXLlS(imLQ}TpA`_2d#QM$c*+&YtYzp>0palF!!nvE zSw7=l0cjjV#OceYqlFFAUyl?n2^TI4XDy%2S{un)`{VMTRR3vpG^;i2X;q+P&!>CB zC3~ak#@XmpjC=%5c@UHs2`!Ch(+I_Avm=z1ws<-%Bgoxk23l;agn%VppFhBrPQbt% z0xh~wmVOvf1>Iai<5+<=kR_R{+G%^A_0~kZuv_@Rebqf%yDn0@F6vz$cC8nSgu1L8 zcv;|B5|uru`!LW{-_eYB*^z}7S<;~?9hn%UFC-nxHaraRf{}qRhE`oP+N+v_j544@ zwsR(_cE|?NDh2?qD~3ylF~7PjboHsuDhgo=foc_{FE?6%s72)$Kmb_VLn~GJIdN}9 zE7jJCAiXj%AR+<z$zP*^t>2n3Wz4E#k)5TbMaC+Kbf#7`&`*F7&t|XaZshu-T(ZKN zG$@pUe?f0#Dv3ALr$Ef2xTpaEA%2LCa*{T-ik3d5_Z(bCh;f62#7Lr{sBk$%LYW@G z5_AMgA6F2#{SMwG(OK3-cqPyIs$v;rT~A&T7I;axz&Flj)kd;vr%R$)t4Ce2%$(WG z#gWX#(aZ)~-RT$CjIDu!Vb{d2DOWVRF6v%9eJp~-oxcd8^|U9=<F;5vwxD{aUc6?T zU9vf{Wb?->qDyw%%-D%oCMd$NUKR0HO&y;;uMf>2@54OL1hw>U{v=Khf^M=WF=Dy| zLWT%Qg>j?BodE4f!*<L9=zu`p%3e6)^mBY2jD8A@VMh?WWjuwVAayXCVdJyo^eOs_ zQjAVH^NEd$O8*DVTnatJ&C_QRxeVFEo@)ce$(4r|=_ipvDdBl5%^(Cdj4<+My=4(^ z*{JPScJXX>btJobx-gQxd^F`Y^3&7&q(rk9kEX=D`ID8Snr}G`s&cq+!GnC%#)C`* zjD8a2a>}B|l0E+L5<?c^Lb0fqVNsJ;p8jicZ6LDnHE|eCiy>M;zI$b<D}RS=7gpFz zkEqK48GS?b6XO5^Mm({xryciAL11ilWFK~Do_0XBSxUe3s1`o;W<!rVlVRc}laY^| z2C8cBofutGoFpAXPK{faEJLvQ(fr&3mS26ehMY=|-&bdV`|cV}(Jik<NzK4dc=nl2 z`WN0mS+Vfm!v4X-L0i0)25-2OcA;dA@|?W>;Qgn{D_~t?K3S(c)&8QKQyED!h5M~n zo+Un^@k7up4PHspm~<cpLO0r=l~HL-t>DRK?OM6gMpkNjjJdQ8!H<hV_v*ex%BiFy zU}F}jXn<tAd}!Z6D<9ZTQTHoqVBp8-HN;;ST|!4m$9wW`@}B$#Mo<ej+#cFk4*9l7 z9aGMnHvK-^2am*4_zeL%*_vy+FvQs$Eli2*9ZG4c<j9C!18|eHl8y0y1;(l?0=){W z`|k77UjgZAG9t0{HqgDBboxs|$!X8--MN2j$G!tkKmF9+{c-2cr<i-<@a<xE=e^oZ z23B&sKiE^9K1FGEV7|<0Wi`81IBOzFWVb{BAR@gJ0L1MuY3rBbj-DXx9U{5}(6@*b z4@J@s>6&96(FQM`zerazbc#|tQ{cPV%k+8N2J_itaR;)gfm#WYSvBwfd=f${>UXFl zVgHZ^N+mUR(f08-7%mV1?yT_vV&~r&j<_pfK6J%>+5KkP)QL!bGi~GtXd{QmWL{$= zuW|bLkED-Y{P4w(hCUqnc*kdf=<0pZy!{h4+RhJ{VHTF1%Z^u@CXh!<gs`|(xM;R; zX{2!JwaSkgK5V#tKC)~_v~cH`7Y>vw{??0Z5(Tl0eLBj+QI=8@%P*bHZ;IqMO%Hr9 ze0BJG;3ud4^wejy(T)3}`TIwAGTp#pwv_2LGu{=kJbyUDf4isxPLp$J!uE;nm!6t< zYHDXRy9pBe;`FiIke^jUMhE+DO4G9+(HGWTUN>9R94TtP=86`ro$<6NIehkCXrJ?B zj#p2vo$3h}E<pmsm?vx2QyTG<PC2GiW<1O8*wWK-=Q47~&rJ@_WYi%yMn*x{mH*Yf z3L1bl6Kn38+$bP>p>3SlI8`^3)xe`z6UnQYPPw*bCT~4>YJc60{My?EMOX4J=S{W! zUg=!^BGi~)M}N;v;c98Dv=&8T898_IP~|W06_S_{A+1Q&UUQ4uRT=SA-t<)8^5&xn zcT#Zsey|N-@oD469Zu6<G;GeqpPy~?Z1b4@($nhLVYB|+XU46cXE)&bGZS5ZX0gz< z%}UqKiXBbX&l=4*cj<R+0%rO>|9t=s6JiDw0`M2WFZmGEfP$xa*RT%Tbok2%QyLoS zDRq!1n{HpAb&z!E<k{E>jKn=dHj;-2y?C0Q^fG=9Sy@_6A|#VhO2(7w9<RNt?Ovb< za+LcN6;9b>U_j#>a-Pgno@sv-TsiDQn0EZ9yaC+m7;+IVU#Q_6a(qL6B5OKrp<Ss8 zK9Hj^lG_snP*lv}7>$s`Nl67pN<>DjU|aa1TEjMJ0+ZQZ=h0B64x!${Gl}Kxl-`f& z+&`jQ%mb51PiNPYBE(UGdS*dA<2n_?iF!QLg06nb0Xq<kn~%lQnA%qE1PLOP-pLaB z|Ag;^@)D4phO37O&HVvhf_TDZDk^<2BGQ}P^}w4Pad_lg<AZSQKyW4mt5`p_esaYP zcd6_OzVk)}f>-3<Qlz1jV0C&&G;bx6tHJ=OPS($vQ>vyqW5p#`wq4%#=8n-lWP((6 z%Ud)#9N}14U)mFY%U;_hnVZ*HKV4_v;!3njQdi;shJHPW9U9qu96H<p*(<FednG`y zekIF5r$KAbd?5!rxJqZq1@H%N(q5HxXm2X(5p4G=u-#ZI9co#;t6pmtg0-@QynWDG zBO^4dmxAQC7|Kdwmgy$6G=EKy#Euo@lgo}3ikTQcB7Jazz)Je}1QVox*Q8a%1}9bj z9RiMnXcz5)-izzT)`i`RVmW!E+hX~ffnL*EY3Iwz6G;W8_TS7}9Lp{gn&8>;wUKfP z9bLZZX7&?E6M(`%=S5|sZ5MVCON{_ONQt}9B!$M3ap)1oq2LG}Fh-!d&<k;Zt^~^M zA+5ZjEEBUl$g^yyb$_^4L76}BXjVW$)x%303RSEy_%j!(@=}UyGGqpa2qF5AjdhVm zf*Wgq^_0r@0Y6=cI7U{PNr!?L;fap=Sm$V!%oh$^cxeH=aR6f-l?fZBpQAQN(o-mf zGn0jolqY!1F(Jsl9XcWDKD;IUXFBy^p5(Y-aVshiX-MrX{bc7hLRGYG7%vF|EJpB` zC@tkrf1e=kD#`*KS<+MT$UzCj0erv^=d0wd$%9+I?9nYmgu$vCiu$w_073jpy`1{a zvUgX#y(*f&c-$V(Et)GSz4FZEXRaK&d}umnI(W@8T^KD{F}^L9S2C3~F&xV;n%s8T zJ)6HclD~L*<u%{cwKMrEWBDbwY8u`he0%VRFHN1Ev{I4zG*e#j9Xq~s$7fnZ@Y^2C z%6;w0I|XRXefFH-*vIQOH(EbQZOz7?PfOi&ZZPAVpz9&PX5c=7iw6=2s&5%tk^-Pr zFvm;s!H)1gY<%?G04XUTaSmIe<i|@u2p^*!F_$#_3WgwQHp|TtF~l0&4rL@@2$*5N zOY^f7)d3^Wy0404RZSg(-x#D{-aL?u>o2blduwiZ+n|&k_~@k%U;5+WaJ{iLtvVKM zsPEBZfqv2(Nyox|T0}poi_)Ltq*v^);aM`=1p)W(QNM^UXK|kp7EM)0y>*DWb?EA$ z_YQ}>En!#7LhTFQ6B8=oLT}~u@a7s#8Q!4Uk`9eV(+r~(jDV^A0L8Hb^bp?XF8>{F zh!I%Oc{UZyPMA{J-1`ry`}KHJv5AIA?2SFM*+}16Me(=RM5@<Z&y7|;@o{-Hdu!CY zE$rI1a4gh)_c_$`zzH>+M)ci=my!<j9TP~0uE&1-RDhX-r?U2DLA<&Do!~c7ai<p@ ze@HzpM^*X>uY9-m?b_)TA8fd~;d*1Vd`Hx~Gwj;=KTSv3baFvQKckKoC(NoMOz#k4 z@*h!OD~<a)TfZ(+zwY|sX!)+FcX!yen|oVVU})*Y!~|PH{0tuz`gBGrBm$8BExsVo z3p;<ZvnI<CSjs?DD3cumObNZ{ESPDwB<hJYMyF&C8?r)RQ-o~l%D3=~J!~3okw@p} zId##T`jK{Ww^?!5<+ATH-_3R))7za4lOz2Li`l+m9wyA`cj)S_!);%Cr;uGV9m4Vo ziQjN_*SEx8a5rF1w>RGPJMBexeO`Os-Es@rL&I5g9od&|XE)F%&Hsq&J!T#$ZdDf= zq#js_e9VKa#46DH8$R5hhb=f#*o)`8c(s#MReO|x-bfA>fMkRXFGOy!Ubx2lpWY?B ztb`Yju%A2-ghr*MMKh*ULu+mDZ-aP6sk64cnb?fxf&ONtnsPZcD@Tk!BWFv6=@FY} zvi&tVGbe@`S1hs>Yfs{pl=?&hjTb3PEwNJ+oOuB1B4kHII>aDs7NIdB3lb%HDKTIQ zD<d+#3jZVo1xqFBflWL`vnYs?@Oc-un+e-2U`SwPAJ0J|%`IDnAe$liP%N|$XLFAn z{Ya^<l0PT#BNhu-BRe1F9I{C@eNQ=P{%NC{FU09V+=sj=OJ5PRug582m!inJq0+<_ z5P7alB(tD@MQ!om8;rpy>@$QL3vm@Sg`0C!GzTmXG0JeKtb>RX_rzgDV?1D!LgSJT z4Lw6Abl;^+KhQL5)p?wm7hcd+;#xul30(!5q4xAYP$w(!Iqu|m2s)e_-c7JOJ^uFb zcl+M%ySD$M=RbTtTD>XklGD@ZTc>VFe}ft@71Vc#Gmt-8S)>SWsI(n{cxasXFx-p` z?P?%~u)S|rLh{MJKL%nMg-$`@v82F%*!tYcceTIYuqy2WjfXU2$%fk(ie+(zqh0zX zfeTXkYBBUg9uajJa?YA_oiN`%3LJvSw<fkAhBu9?yASc^D2jxGMX*7rRBxaa(lRRK zqAQ-f1NaGjErqV>=<kD&l#^LgItj%{ka$e#|Dj?o1xyolcyc)4gsIj8b(p4_IAcsT z3;<h@P<+l;7%tix^=%7#w%vwY^4YOxVNUb>#Pid6*9&ISwvg+R|KqR6^71d8n>hEz z`OzIDIq=`2U{_@kSJ_nUjH@1W>8SThC+>4`Vb=S{nUoo#)ZSW~81PMn7+M(=G?OWC zV%3%*D3sMgA)oOi`3P7M4pW65Wv(e4CPa8Db#A1<8&VZ)<hIPI56)6WfB%zz7g{Fb zAQF-u23pi5<^^ho0~3<vim=TA3NmtF|F*_8Y_^Cg`6E;z{V|>H(Y*WvPD<!z!UpjS z-3)e6vPtO{mE$lWNvzs`!<>f75~j@v4nC*p6TZ)}B4q2xkHLWRe8gQ7%i2EL7W0*i zS6-^0sE_#S-f{fUg+HTP<~-RK_l)hCthnh}1gmmS?LzEDZK2_qUxm}7$!m>RR#uOK zXm=1iFTg$`_;Nzu^dKpMFW*AXq@DCW8FjZmz^{dk3ppgZ7U6=1PK3EA#+!m(ASOei z{hd#LMx$1ZUt~?1Vt3umHG>KPdBLYAKyNth`FDK?NHL#|SQMfPdb<n%)B{t;$9yjS z7?B+0%pzUH!%o^~6as(}KAr1<`wCMPFyByJIgoJu0klMgzpeXRcW?h0TKjDIsUtK{ z1xM`kZ}97A3xr<+LDCMx5i${JBx9cPRF(zcL=NF3c)%;rZ4sz9;TKz(D79(ve-y-m z!cU{5(vMoD5_p`*EzsVf{Htumr~5+i3>-nA@FDjR{v=h9_|3XQOAf1zq&o0=8@Vd< zAPGE72>F|6X#))+kw^TE4eHk#RAjtCX|*oxeTDx(A30=$7D9{l!=5yn)H;0Ga5Ni{ zq^t4FAf3Ahx@c^*VO74FJW@11RA+-a+9&&a`fAnNHHzE5lKqh8$)Nj9$E5z#oSQ`* zHc_qeVO_7OiUchQKu|1dKZ9!`bw&b>4h5ir5QXr<B2r|m!>fwig7+o5ktnwi)Z5cK z@KC9@uV}H6_zXKtQRyghT;<2|{c0?L_N#V7u7_84(gLQn#0%;+)k#zsE#OSMYrfiI z7nu$D@vpH=DV#>gzegeb6V@nAvLN*n$Xy#=VJumRfg?J{Xpho_rAE{ZnR8;`sTMwX zQm9_}myxrC)S|1C#vti9X(ZG%Y#Ul^pq^5gf3%Az5kC4djeDmr1Bxn3DX;xic4h3d z<~mELaSJmeet26f9BKeJ9)uJZw{D5B{&m2bP5{d0qol}zjFSVf2uf)m?g(HVB4Cw` zj9tQ44#}5r)1=s<F|1N(3uU%dP&J{$!7dbKtI>S_Y#wPv-!K25`f7C~ZwbO!cw)JW z@W&11^u<lDZJH}ByYk}Y7q1Lm9-7`U+ps>;u>SgqpY;D}f3&oHwC$#+_*Q9+@T3@R zoADGc2<_4?IWYIhUJnF|5}p2;z?`Ot{4W>J+ftNp7F?nd4-m&T2Z&t5kiZVGF_3}@ zkcw{zNEJI3%$smS9784&T+`fio(CB3m0hg;M+_=GLSBeeKjS6^Cv!*(1mj_xj+BMn zQ2sLxKcb9&2RVLoHeTW+=?A&iaBL4^H%0n3%9K^UlikL<rE-65LXBLX%#7Cw=GC}? zV0Sw?&>+#=U|c%~uvK)z0-YRu2v>4V)JW!lsXa<7*<rG?udBPk&#{<-{v$`)bR&BN zJ%CFkl|WX;{<9c{{ywgbU8kvX?tPQrzptBe!zae@q;Vr6p30#r_N=DVgRr_o^0#)$ zjY$G)kft<;2Q8juFbxU7d<nBB(aB4&OG_WHn{H~@G-E56Y`kH67<IQBr4y;U_v9@A zc8O??I5cHAlxwt(a0r^5HVx2za!IJq%%P^|IgFLQ)k-*&9-5JJJ)Qm|Gz1+q2S>20 z(A&~YI(cXWV92OGhDk|Z@1T^5`xH`$;hK;mZEZrKaf;rfQvvn978fI?+t6U{jC!j_ zcFd&}&J-=VRvS%Q2YD5o0%|9BBBhO+JeUR1D>ohQnM}llRN&wIC_1V5oEo8YBZ0VP zO$XNwol&P21dQ}pMv`Xe)8#>z3UoRyH#I5oz~*3mUyai*hbFVo_fWHejbK1EL53a< zyf~O5b!*TVAZeFoA9#`kH%W(~T_E&bDk#{sSo{N|RO90$iD8lsEmA+O6hK16ezXo_ zPu2&r@2$&by6`+A=o8_ebST@2;T)*RfuS!P{Ed61GLVnkD`g&sU9j+Tb*N*lo7J+U z?%*e8)i&f(7LhyxF?b(aI6Ry)^aSIWZG?6~hcLFq7AfeFb$$e{3}R&s`cETvPY+Ou zABk&7+DB!Dj4otrdhtZB5LiI`MmvE>>}R>33bH>qz|6t@6qQe?%j8{`#1w%b`EB!N zB&)j7WLQ7w=}-|va0D}|lRMFd9M52+M=b$^!p7$*>h2zQtCx_0P=;O+lS<UBNEzWw zNy}f#q?3<M)O;jhK6{i92wxDskaki9)AUh#M#P1YQAQ!vKqo)p3q&?k1K_zbW}SHv zXWp#SA8}IPerGN8<|$rE{IdojH4(?q>78{JN1Vlz2k~$&y>K?YHj-XDU2y%maC&Vt zecKJ!w$GjJTdwq2R?%!$LnNzVdT%sq$z4;b{YmqvbIzSN>6~%<=W_Ee9iKRUsdu7x zYVGv#Xzr@f?Q_|c?>s+S)e@;{xxPADwdLbyquF~#w?Z#UmTpDRwdNMSk@^LU*@|wZ zWnVlzcKG#<*|e%iT2;8Z^=8^;!#Z=z-l>}{UmYo5ecc%?e<GUOI=VepT0OcQl*pWK z(X6i_;%k_G{<`zyyr^$y)U)%89BS!51qqkDvSra$i}^3gTFdY!fsepLK}--T=BOVZ z;6jK%tVy$#z$C;y3=XiKq}U=-Ii_JFO#>}7l0JzL5((cT+NT2l=3l{7y(&in(8P#i zs>=2?ofuKOD{a;`FC*MLri*-sYx)`=MmAYSWc3(Cn+hgV{=Tnnl430nT1U-@D`ES# zOLN83TBwUAVbyH2HD?sy#wQqa{~B#ez|pGB*BId&HJiz>1Hv_jhM5g<@n&EnD`O*j zXw@S&cv!=B`c>KuthxwNA^kR?ha60KyK$(8uVLVIp&lyHX&sgNxN>qtc~mDvMy1sh z#E2R%SX#YooNyE<ko|xySje70><z{<GSJFys2seZlp$B9-VDMvJWX)yM|C1>!;SQP z*Qzc^<aNy<cy~^no%J?G()Y=+85TDpO$!`t$T=K|rbFEw9J?a`Zynf(ot1?Y6dF;I zP^naaabw0d8Nqsj$ZoI2oe3i5Qg<NkA*9}Mtdqloz#AwDgRUS{*+QLm9YaD^LZ5M` zT$)iR$DZ;ZAu>xQwB)5L4}jE&_H3mtf2el(c1GD$T{NR%Wan*X-ek&*vs}fHF;C81 z4xYl(?%Au)e(=K87p~WRd@$PhbTsF;?$}M<x_Oh;n~G%DDXB1qOY#2a^nE{G|5-|O z-QJn>eIwgpyz9%KbiRT35H@?>s9mvMrEGL5(<`G{OGjNmXOn}|RoAkkzEz{n&$Ejr zcSN(RD3VqlNkMa8e-gMeCGQI-YWOF1PWsm7^_w>(A~sbDjd06?pU2<iLm@zzoWn3A z9~vPDb0e!EnWE}GpbgppZ4lv6K8z&QMy@80c*BTvBsyItxl}U6PDv4iNFX!>Cy^nC z<QPz;32-~H1T%HyqKaryDnn^6m&$uUFEz5(F`$x_a1Brqkus9t8*HJ)YKCq->@t@` zJlb*C<AGV~8;}N@q&!*;xj4bn9!sQ=4D%7Oi%E!ldZuZ=NF~Jf_3@$vmZXCT7)1mj zG3{~+Wl2IG?C*u~A1Wp}^r^VBy}u31DTpv6OoY(F5tImhFz%KkoRWMs?!gakKmT&# z7ZW1j;!V7k6t-nCwUSN;X%YP!JcfIvC-dU2v0bn48QB{1<y~r;XqqaD`Wi=eQRYRm z)NY7o!S3CX?fB8=kG6lf{i8h}?wNC?UUZH*FM7s2<IhjoqpoV0tFLs7>;~!LExeIl zH~GTI_Ae0WJL{g+lu~)e>ash&Ks<=-w>(n^X7cNCH{E~7Nq0TCJ88d?emQ;WrJ4NY z^kmT;H=ZC+OM1@h&)@OlS};v$u6igdWS%5-Mlx{D<82?bK@YN&rfeTmvlM8a^FPRg zTU#eY$GR*9RD|qgpkd?judPFNioQXn9TYL?At5YI*iooy_>f^xvLE2S-t`rUuBjCr z9mwJ$z5-E@xN}ZNnRv5B$K?e?U*J#hXY%nw&qQkoK(P}t$8DfhC0QsX)#Eii3lF~y zpnnQ+s&9q3Gf1tV^(-ueHoty;)XQyYhsKb;oE)NVH7b`{=#(TnrNQSJI89ZOIF>}G z4(L8I%=R3L;3c%!Tqa>aRb|j!?kPNxlu0)<k<&QdM871>$NZQDcB5AEyaA_-)`$c5 zwsCYPmC{k3ASa7@&xkV9Jx$l%QLc1PRm7z{GntNA&zU9jD`-mqp}$`SFD?G+vb$PC zI~itSoeAHX0g{0cTqamd&>q@=uw=q72sk9@5B8t#mW?x@xR6<~c0ne~5n{dzfQoyc z?v_p?wSW>JA?|DMA82h;2q$*?i94U#Coafkrw<9cx3)jEzisE<xMOSUmMvTN;cxp> zTif>o##lgKiJJ8=Ce_mP(`lHdpHLlHp1bTmHB+~UGy2t>r)Z|6IqU}8f}m~?SR$~x zC;grqIE40J%J=Hw#A0u)yt3i)hWD#JXt>(&WBX4$f9eSrZjHFNBIWD6)#TY`zU5B) z<sCO(xz9PzU&+ohUGgH^>$D4}YwNY_uPQj9RjLq%gpooBqsb~CmkQKC@R2kmq2{DR zdmD+VRGR`F(5t|xy{NsT?5@Jz1Hu{8fGV0H>AtcH4_o@&y8Tr(wS(kMt=6!=v~-gW z?du5UsqVE85ZoYC(g2Bp`2e#bQy((3!jv-n&)KyY?rW(KvUha{V6V^(XA5m(Wp_2+ zT{&z6L9!rFS;zV+{bb6ugy8OVd<&XTf=nd)<8ae-n|9J9V})kAPp9t?m|nyS90pCv zWw&W;)8vY%+dtAa=S+F^#c#g&>hL#*$M?@T3+LSFptqHPxhOK#dc$3H%j28NLdc`3 zKs2j<%ypZtqghp;7d`2ePGi<n9Pt#x9l}#SvUM&scQ&;$l3EF%kGTN)8F=?jipgCy zZ?d}`IN2S7c6?>?n#~A!ZwR-qq0KVfs?W9gfu#zJ#ld7jP)0TmM)cu(sDTc84nbD# zkmdW9OJ<m%7unzj8UV|wF`cAUNw!fLGz%LQX4ovDrHs4;*Vcy|FoeSffx#dq@)H%r zf+QtPHJ3%aS7C#ak7)#d#2AHbOl<rbriaKGmcYinsI!CX6l!~E2OeLc+1rj{JbU+C zrquM&!0Uxbb7(Ib|9UJthlu?mQ0A~RZ<%O$WBq7b+?yq298Ns>(u#s#Qt2<~^#2KK zZ%?b${N4Q3)^{DNt$&z;A0OFUP0k-Xag{I^1ku#S`4c!%peJqZj%n-6%mJPd?vdt0 z8}moWy$4i`F=W-8r$ED6L!CT&+nH1q$_CmiI{P?A15>FDFzRFSGEsrT?_r@q8$Lib zB}DN;x77_FRIEK#TgcXSDoCMcgesR)Hz#q@vCgf(9_#!Fw4-(#ACr$Um66ey3z_NO zlE`%1beMyfZi&!`!g*WKRfaJGzPlos95>*-uMw~<L#;~4L`$wCwsOq{i$WTIZ||jN zC!W33G0`!#Kbo_6ddsY9336}d%B%TXt<Kg|v)Gtz48GF0FwU%2kiJO`l~EUX17%KF zixZ5e%gqbOzuipyAD8;io)OWDk0|RzS^|jV)9+JrIl?0%CZ?M5YoL+HgGM5I-a-vu zzxy6F4R*B-Q&#RwZtZka)VFqI*Bp$q+>?8O*}^tIlYntIv}KCI40^yU5k?sX4&BI5 z$#$zjU~v6yIU4=1qa6G_41}f}B=ZBrZ_>WRszI1VAyg?O(8^PQE?c4ek5LG!pH;fg zDo33<u(#(F=>&U%dNbWX_c5)(%A2){7LK%sP*ySL3FDIfz}a55sZp+Vsmw6d{tB#H zq?{rdnD!oFfwPFL$}v$%%9J!L?dotT)5c!rr2Ar3CQv|+@RC$oC5LYH!)6oa!IVB% zM1k!*E_I_c>mz$8;aVSx5G2SbrMLTBCr}JEja8LGlL~Y*=ntM?OE>x`qa(E+O5iWK z31SHR9Srdu9sWQ+_7QT3m)pT)aVL;ir_hZeaC8rH1rlbHYl41s8`QsOo2>lQhF@+i z%zJ{}-Q0|YT2ur%=?g0JbmWLYjP26XSYOz;((xyrxd0LpXko&a5}iJ#rATTT(87yM zi`UKA@+Q-6*s2$DdxZT^vuU1e@%0-DFrSQ*X}cbQPcA&?47YWS2q4js<bl{kCcRLv zdh}s)AGUqNMm1@ImdDo1Y1<n-i$~UJnz@t2EG8XVi_V*e?GOK&FcUZqQBj9V&T3IR zw3^JOzWjkw<wMA3t$GUwJp*OR{eTT`U?k~)0dR%50-sl@T<KKJLPE`PL?Ne^$BeXv z-`oWMXahYX^lz?{HA+p|--IX=b;|vdi<K+wuf9J6jmmwB7J?QK9N>W1Ohn$GeV7k$ zu=^p-Q&|Q>;~Kf_O1!TtsS4iY$M~a}NaITuBkhCMN`$&fA`AOG$z)-lRgi_xo5sx- zmTK`XLR+`?1u07&V+~q4Dt-bjLYb$qz&n-2OZFO!+1P}l7D%BF7^gc>*N!j}$05%~ zd|?GQ+)oE5i&y1MprtO4mHiZ{h=K{7K`!waIx78FKmr@g#?#?i&~-vdu@{Vc^vOx% zZhlW7AnCX0%?O?T4yU-CtV)9M)IE%$_fw*QXE9NTg+^IxMCvQx4e1y3MjCDJY;y2h zD8ufQ@f3ku;q$AQU{H`<V0(z^rEZRYOg9+q!EMtmcZzVgkPD{L=WJT9W~o_D8KX<3 z^dTao4YZQ+R2iL71COEL4Z=&?&`3}SNN7|nn=?QG8FuEuiT94fWp9Rowd^ogAN3;d z&KK#Xva0dyOGUp^G+jCBxaCY6c^PHr(lRa{8au>cnGZ$N>PEK3=*e8eQrTSTP_%*E ztwtT+%equFQ8al7Da>Pq#iNc3-Z@w9_)9lk6?19X<Ih0rnFg(AUO2yYx;~n|D(qS{ zmtHhe+<YxRn%*+9{qyvk@e>fpue<Jurf(YA9&@ILorN(ZAw*U}xT(857u{p-@$ECN z;yG95tgAHQDxGrAxEkhM1(TIi?&)V{Tq|O3-$?sc_m-MGg(PiQeLF2@Hmx#}RvAsJ zM&k68)i7S3^^`?CWMuBCkL8ri=F~-U>d>N`RioR!L<)!1Us5?P{LgpnsN;T+*7|s6 zo5S=|N6FR->rX3cwr1IXmYRa=pJmy%7N`6y-$~cyW}FlBkF>TiA*Ojs@&2m$RmZDN zV1L{YhY^F`X1WOH)8nQt%VA(jFyyKofu_})uw3xkP-58nnsd}CqRzkO7&VVNjv;pZ zw_UK*Q0Z;p9Ge!`2w~{#kN<^XJHD^tBVZ8&(S;`TS1_`a0s95RvH@GbR%9Bq(en<q zUxT(TC=sYPFXF6R)!9Q|=Pi7%SUocF1OY4Kj}A!lfp(w>7Kn$kOc0d?8)!lONU&n- z4sZ=frwl^-On;v)sWNPrRV^d3Ei1_YFiq+~TSXTB&A)&Xg~LrTjTr`y*AOX-Eai>K zWCB7*a9C{uHPNmJMWiB8OQ@L}N+jU3{nDvUZ~!pZAcC)A<+3GgYF4pw>2g7=P$_cR zK2~Q%qEU_r^bA@Uw;x03<^d2fLN|x*@lXlcMQ9`AS*-9=9*KBDp{4~GN@J4@%Kr<Y zmnHb(S0n?prubp6z#4`s5f}$P-vy*P^Ur1FPv*R_{)VR%VRTabBL2g-GO|tI%dWTn zzPa9-z;+YF@^Igv;kG=;6IExtD(~eet{y5iWgfE`Y3#Kr2w2E?7E~8<cMn<Ih-^wm zX=8Q`-XH!YBljO|g(~e({<4y4uR6)Hwu%^aPW6qHgp_6hKbf{B!*;R`1d)vt%SbIt zw(G>%D<G>@B#{lC^gd1`(Wm7pSY-~5Y=`#=mP9q}9mF=H1Z^P@$`MZ@JpDalmlD6E zzX$BbJ@Vef{GfCiZ>!-LM`SR{RvJZiISMp|njZp3MlU#lT7u7^MGQ!$+`>x-Cl0=2 zdDro_Bbrk)ni|Win9Zw;<kd}AMDv=iWk&Lrje24kg_9d6Uzpqz&R9HZ|J++XQ?cSl zdp~;S!)HD^^x>h8bD}G^M=SI`z;)1);v19)fH!>_0x>3aG%){>e$rmg-q>}ncuK$2 zBWD~WdPCxk*nCDJ@dDzpcfZK1ipNFj#XX(2`-vxnS>aK7k4|6GQuzkHaG#m==4Bt8 zxO(DmysM`(XQ1ycyO~jW!@GK9$32_V?*9j$6V@~Le8@mJ-V?4`JL7GE(NNQ>gyLZ; zj?--?;y7Juo@jn&1&oPeB~_!2i{3HsWi#?V-YP5~b$rMBPj^?EGS>Xl-NiVw4(R*7 z&1tqzoW9LITf)Lq6*Si{`{X?}WO@_Z$iK2Cgzi_d8hRri`Y?w9GA%@p=>X1Cx1W<3 zf#gGxmQh%`A)Rst{#v<E4{7fjkhR*ogZ2ScU1Jo+2us`0qCB9Q`MrSl4kKI>Y1*ar znr2yB#vq-ongR%_9=FC4=}V#2T3d`*B`b#uF=93>TKy->l1GYyH3=Piz<yk1c}`Xs zlv7zZjJ~=}8`g;AM9Nl8tO2CSXgk6>RVlTCWN>IDE@Y70`0-~20bWRV$Om>nA6Uau z<#)h|QIjEQ$o`5YU>~->Y}b@!c=s`9U)?)hp|x$Y+(@>gW|5J<Mn_@Suq&lbP9Q%E ztx%G11Ko0Zd5Bt)?5<^@lqMXj4gF0W#0HR@^>&jx6_Fqy{(F16ATm)U2MX5`^w&bj zB4@(ESAfKy-ukqE#j+)J)F?=8Arl0lLPDNLefdZeTZW$)7&sGbX>R5mrUTGF!*qV| zOlMP1e{*+Vb1!_gg9FW~tTEV(#5ylxmkBnV7&zTqA^&PrTiPfOMo=Qvk3?H=yVzEq z!}_Sp(tHu6uhaHm>p*Ygp3W{vW+WI7^>>|;_M&9mBj-sMw^UpkPnBq^;XO<`L7#}y ziFq%^yUf2aPqho=7qe5$#sFaxG0pCcym3i)@O{orERljz7+Vp%5JiMTAYc9joeF4s zfq@LzAlL=DH(h_}dOuVM?dIh;r!2o?HQ8OTPOzuFy62mF#w%v>>aKO(w5_>qbIsav zBDNfebM9D*?8Py6?o450#NCM8=l7PGQqpE!1rb-lO;^#qW>ZEM1+4>rl2<NA66}iR zEgSQUI>yc8OMl_cob!}S9-Hx0fs>gjSrYLsnZpLQY9^!nj>U@LN^^OI6r*rz6*3OY z<}F9MfpObCk13^i)>R#GRZpG!!OPdOuSro?%dD$4;%fc4e#X^4=PHsPzjST$jBE9+ z0@!(4Q<_J2g5OKa8-HnP=S@%37f^*XQ(anvzq(gq$}T6HP<%PJH0)n;tvZ^!_WIYu z8BhF@VjZ@ce|fK1|HggJhIif7w#oEKZmS)CJ}oY3D>Hq%w$+CpKP^jXTW|g8;<UEa z)}OAn)Af2Q-QSeEH77BMj=IhKBj!dg12f`+G&B#?qtbas6dk#TD<}o13^w0Tf$De` zO;RLBg7WEN-s|$dKtWc@h)!hzjBEw8b`4s9tRAzhima@mHode2tN&b2|Jh*gV55v? z0!A1_7Ncl_6IM15L35tg#~__(1+plEmyYy%w8TQV2jv5s9nsQ>JLRR$;)EpCDZfFd zHd;1axPU7}!cuV9i{}VPn<9Bl)8_z_c`XEW>tKGI>z~S-u8Zcb7~LNCB7kJ=bl$a^ zn;9(xg6p8A(1YLwo4S7P2g#)3`!%iQraw=|>67x@)-~2Hb-wXX<)A;sk4N#&hM^D4 z;6>F<1(nE$o)e(WS%D$&&KmTnZr<RVtw!80AP!g)o2T}UN?r`vDP#jwun71xXhlpf z8*>4hw;-?C*#Trq>+|;o73`}D$cX9d6xR8J6pfW!onYyH3?V>NS0jO*e~wlY)vsyQ ziO3gB0Mq=0T>&H{SrS0N=#=PL1^}ecQS3(p(jkB{Cmj^1RN&IMmp-eLmrEn4>uCZI z;)z+jgtWfL$Btj@9qUC{(NnY4t0UE`uUn(l>#y&PR6h|-Zynh_msviwI+|HO@?<O{ z_mX$Qdl$O!JR}ivlkVJIK6NtcUh=so^Nt<2k*zEvZ!}%V(Djgj4+>cd-Gtq^F6kkF z+@O<*01izvj8*l0c?Eq5P+tf$argr9QFT${Hccyvndbizr(XyB9xm)L0?bFep#mBj zBp*72rc#0L$-PMa3lKDimbNPs?-!uf3`1+iJVMDtiT9+QAb8F*XC-iM-4tL#1v8P9 zstY`7+y&hc8vsim5`IbR=o&o!B3ME&m|Z8}EAr0-Rn!uBZ~kpuN_09!<KBV`AQ?B? z1I@aNkUZ+G%~!Tx-acF05GigD_P!zy`;Sk5wj;XnK(z6hXz{aA_j6&}a|<VnCW<HP zBrYB`S+apmscv^6T$6Mdna}FQJwpi82G>Uy`j|>9XA5F{N|bjI<lNIw?c4dBf7y~H zYv8xt=ikCZ)8I#_g02?>{@UerimofjuLcKClffu%!iljDgk`YFe;^3zlAkI*@0~|E z?+ubUfTlY|vMv@Ckya8$8K-*&5PPz}ugTvE6mp)ZO}r?+SSw5<Ut~QU{F9Hu#c|Mo zv>Rq=P?({lXrLc~0{S3qgG4{ruOx%yCNO!;AA)x6G^Zy&+U-9|;VgoX-8VG}@l@O) zfB+VoOat!4km`WPDfd8n6;qV}8~82#Hcn><Hfrz|@JoiNuHggERnK+TjoK$JEW5aR zZ1qL5;#m`QSB7ovAD_T!p}I{aHJ(N-B)22WDMIorpTl2qfIG<nw?rVrhc>b2IV010 z+$FVKqO?x(<2IyhB&K3mh9LsMxpW&hklCm^2u~{67C{Dk#>RAdNdx;k7Mnd6MB(@e zWK~0k?yu(Du#mIZbLT3TU0V~aq>Lz|j?wcGSN`NGlzS}=(Kzk7LWuT?&1rhIsLJ|| zxhheJMtz}w^UHA36IuGc1>MHIX56rv=en&MP;nYYKBPJp*3&GR>O6C%yHir;o^-Is zkBe!C?<q$U$6m#b2Q_F02TIb<F&j$L>02}qg=iz@*k$tMjl-?7_=bDc3@Fm<sDD-1 zw(244`x<u+>^-5Dq(h<5j7+1nJs+m?t1t*Q<>kjUo!1W|1CLv+!9ZA{l_o6Fe&0s+ z=Gc*qOwDg$RHSLbqN%X^mUsLG1NdDURXV*!1Gohrhvhd^BdKGluOoa;NyG(iBkF?d zf+eL&wo<#;KGqJiH;@0W6*q5FXzfK2&!WkJsHgG{JQ`%PZ2edgy@ZdL=0C>iL6X?V z9_fw0&PYFEZq#u{1Lb1~I#1|}sogl<lly~_x5++`j}6p{2aN{Z(m1LWPDm8D3ESZV z=a7joiV&s;d|nN7`W>3Lt!N)JrJjt7En_XOub*}MBd|Hljk;?wa~_B6>hiU#U(=iD z@1Ja$3PoK=?QLmtAe)WR%+VgkGxyiHc+kvg>wqn$<q^XR>Y>an$;YMEfN=z6&2~YT z175SpHlmk@SP%viQkU{6!%~c_m6?=7EFtFYZoGt{XE8U$uNAHtP6$Fe5&Bls>4F|) zQkTTpBJBXNKZ*39L{T&N^d?OS?G&H^J$bX9k_cG#F1G26xic=V9b5bQx{<ceot{`` z_NDxZ{K={}N=F@YF7NlOm)sNX$!(F0imCnYFaKcO)pgfiiqvnp>1u;tl1um_hCDC4 zSYP`>6V7#uD?{IB^jf>=>GdRl*?8z{jfd;&{Iz_S2#7{{gy1j>pYYQ&gY=xk#~7DT z>!5TJ8=LC2kUI3FZj<^U`BMJVrA!C?Rp4R%9sEdg%1DPph8fx6ZOBS#=bZ44fH&a4 zJts#(bOkby%hG%>1=%oDjk3Q4Qk0c>kn&z;BFm*&fwqI`xZ~Dk!t`<pkFG=p-$~Qm z$wW4KpF~u1X!%o|k{U)-vNa^h=CDb11~8%nJ)~3-YI=_DAo5qYcj?JKo80~Rx47#X zgRcb!harkGKqM<y-8GSM3{*x308Jbm5=SkmV-Qu(CX^;hg%90xmFdKDwQW$DnmSZA z77@oR?V+rleK3vc3COBZCg7pKaO`=i?ZED>5-9~mQfarW<ROrQsRL#6j@xO;1f{Rj zGMYw7tg9a?FG!PUxAc2-QlG0jAVto`VNkNRl26ssh(<J^MnU-#T2F1Li=0k!#!t<7 z%jbN>;gV(7c13+pggsAi5XK8Bv7%~@<};U5IJxqT7Z4UDbuJg-o!>ak5mNM#8ufdV zO5EMSCm6%wZ}Nfcf|v{=$r5E3d{De`sSMI2>>);M8EPZoNIDc)4&i=?^!4;r6}M@H zxn^6y{(zbd-cV}>2*@>?v6ng8LstI=|9x`{W5bZ$f2b;W_`bOT<TeNM)25C$BAP!C zt2DK7b1=b<?Pt_xU%~_;4opYKpVRzx;vw*1LCKYZHw&iPW-C|Rs9X{DtQ<8{O!=1A zT4J8G@vQOSrSlW#r)=-0zMUG)tB+*XM?CeTtsHj#wRKb^Z*uvSHJ8^+wY|IR?OoBL zC6UY}5zi77@n(#=7Ls^0!~i?f{34u47o}T)>XshDkT5|N%GR|WENig4wo0l4-x<c+ z(hqRb@4@fjcPJ5H2~l)({3Ufb6Hn1$Z`J$O>9+S$BHpE8*HUBFf=vGAzl#%~&n&?k zI*14wQnA)lBe+9XsB?S-EU?I+ZsLFn#w_{ZMQs?Ua>&vH6%d6aL^+cYH>%)HrgL_v z=zT94PJ)M1g!{59B)CLv$QnrF+y`taY|48EH2Z?klTUX_z!u;FnAoSJ&}>%`Ak+#o ztL^~oFt?D^1yUV}_bDVSeu(b|yD=Xq)(eMANXUd<0Wf-x@XbHa=}o$OkWO0(M&+#4 zd}AB##vP{+xAM5KgQmSpNcZ0dehqoGK5)9~e@_!gFO8VUJu&Zc<=fSAm_mdP&aAne z(G)8x{)ZHMS~?sRJy|hN{%G69-DA5aE5n|;sp=b^I?8P@G&c15%VAf^La+qD>8UDh zrZFcf!bchT2$+upk7#o|469Df48(}n(C8u5sH*Rj`Y6hW0x!(Ms=NkR*h0v=2_pH> zVgzU#mV!x!EKs=FhAl5!G=&?iY}#}%BPNpU5V{Gk!}b7(UATFWDT3HW*c^p-4-H;~ zGa(HHg(oGy5b|-0+hH->-P?{R98o;tZ3X6gXZzq;4z(3A%Yn09-O>y_<n4xaL7NCX zXbFR}Cd9=mcxfAIPh_hJZW0if42dxUhv)GkGnc;N$u=QSx}JJ%=(D9WnR`YZP`;!r zoy#ho&8moGRlKtu0pkx|J&0iGS+qfktOaJ2@RhvPHC6HEiKwq;dSBSHgp?#HOYaBs zQ2U#ettQharj*tS>nABWt&6OmEVAR8C{OiJ0jC^oeb8owgc62e1WH4t4`@46MAV$y z)Bx-ru(_y>(JmB_fO(g?^%xtpfTkfmy7sDirTKnAWUd+YYM`jqoT0v?UTDE3l(rC= zPnk=rw{-T^3;-)JA|XK+BFG>&n7=c@>jh>Vytk!jB#Lw%)l1J2^z_gb!H0;k&kh-6 z5eW>$5OtOwouktZI@P0ia<U7;L`l%aE&9I+x{l)^i;OR>du`q1z?H$@8$=9&aOw8X z5JI3m>}f{~t&D66?<^ZxR=!*RwlK7u%P5-7s34x9ZMtH5@Z;>C7kyF`&ZvlH>_Kn> zm*>L1?-gAtohY5Eil)`xbk#973LSnSxLD;Hn(8;z;r9mlo>-O}554eW6PO9Q*&;uo zRjS;t+a%xQoN2+0FC1!G{K8?rTbTf}D)WCIoqQ0?8i`kQ#_W`IC7n#sH3+8UDLM!? zB(jvvjI-rpoRbe2gj-lygGr+UaR*=`PIshi<;n<-11e1o19|(fleSxwchH;o>*T*q z1TwL_C$Bhcr>@Ryd<Od<d@nlvB#DIzW&vKL(0Sl8js&HyBO-1cZC1QN$>=jU*f-F5 z9vg6PZ~u$fO@UpZ<T<T(BB57^I0t1%e!op(MqBur=FoqLCv7RoV<BH&c3At;eid1B z1+)pvXj=RR4InS2fbcM;?;knR!U+7x5kltb25{tv_)hRJ9$^0l$|rxE{xc*~?(9{| zh1O~tFak%xnHhp$NRVsjlN;p5^9SUH2M^b9pF0P5wZ?7qP-wBpRzy&)q?oF6kdl%_ z(tXm?^n@)NQ`jXc(9<;l6$9FZ;IjgVSrmW>C9RmKxD`{ttc*l9Wo$MOhjW<B<IwgZ zOtomRaR_?CgEvDNT6YkI5Y>N0Yy4ZN1yY(^6HK5HSwSZl7&U+H&4~H-AQ&=smwi(e zQD1e~Qyok9UOY8+>h;s3R)`8_Gs`1Td@Y|k|MrGx=2D~<Ufei+?Dy-(t>fD!+_M>F zk&LpbikXb+>&wWF%{RV${M^L4DeKgZx6`K2UORR@5cO^eyS6N(L2YOldSjX&!ii{5 z&KZYmaTqPl0OU9!JXVk`iM5UR87WmWz)=<>wi}BPPlF`_M_-!1xcNK~YY<lwjc43W z_AWuefHIP{iWzc?SrfMVe}LkN`}rTBQ=xp_TqMl32V_xj6<!)K{lZ%q%gUKcFPKd) zjii@i%uYr8OQY$_F!0FVy!N%Vn3p#i!k$GjuaCTX!>$4`j5Ku0q3+GMaVJ4mt_rr2 zczqrILeeTdZc|+up%C5yyhPc)Rc>ARAmJL#{)u9y7!51u4bRib7|3<Su%to~VuBpN zu7+jS<Kq{el$FocP@#;@<X|W=hT`QF@+sm3{>k_#l+y-bK@ZXUdd!E(zJ$3F6YRzp zc-natL%Q7x5ReYwF33M}6XrD;w~^*Z+K$)amhLkPRn72-pmi;plB)v(-TfQ_fwQQY zHP5h<?7n~m-w-V<y|xlwj$zN*m^Tx8<?PZado;TmE&wT|@DhgDu3(~Ia>Z13G_!hi zGs;k8rOC>%Z@_RNT(;(V)yKY{=Y5hF&D|N!*cmHcgq)hbOL-G{ukE>$f+|QQojvLn z5JU@4IaCOO)p`;HX~x6Ko+nWZT$P?vs=$(zFNe+W=vQGzx0jj$YslRV$l7Hxy#Tro z7K@0zGm<`JhjD>hlN@PcT|k7*XdhI+MXAiJu($N+-nM8o8B>@lO{cXLZ^3k5fx98A zNLzMc58w;g4&cLFCc~Hibmti|Y3|ms5j?fQP!-RufIP4i^6o+Gf-sMhi)Cw&r@<qj z>p!A3QYD@0=`=zomUNM~xpW=V14$NvVBAJoPh{XjbAk+$(x0G2vMh^Yh7$0h)IyO0 z-7P1;yNFLQ;CXV#18=p>xXV=k^Rc$uS!Gj|(X1MP8-ZY~*pDn{DI1ZWb?f-bm^XWL z`18EtSavZ(+zuJivI{7S`5P3e&zn7I8yn`QtFPxob2o)EHpL1{t~6h6MqH|#>$Yg& z27qPGYrF1bqF&@QQ$Z435+Pw>6eLZe>ktmMOMcvgV3e#;lcT(FY-|$$Nbk^zcxpi` zGxzPGpU=>VCR(~o%bC!+MEIFUSo$$t@kc4frr1eI0?T69Kcda^0)A1{;SKY!Z7#U$ zbJ#N}Qp~b>N1A=n-9;|@()nz+eKB(Scne04UOYK=^8at{+vD51?)&b=8z2aP00_QG z@cj@;i4^q~B~c<}NtP&EmgJ{GQUWRKMaq|yCBaleKNdrd5>s(nQH?#*iCZ(Zw<t~4 zsE^NTrR|dLvvvSM85F{-%Hr(P&(^IJN!O0EZu|buxeoxma^0<e>`FX1_kHd;zw<l4 z_ix@{wpT71t!~TM1Nb~k&VnJw+$k<12~f^FtIpS;N<n7|<%6hEwjf;TF#F|WsLkiI zV;=d~Jp*cN^0MaX+dltmw3p;fFHzh$d@SEcqN~i`w3xQ)Jl5E3&6}Ua_EKlE@+=se zsFGi1c?`Q_*v6_<E}Rjwv}=``GGmp6Teb!!QzCQtB}S3S5d+9upkLyW?Sa$)4Sm6V zP>`?`KxEECK?KOhnB7anAY{l$q$>L#9EQM$oDBvj4lm3C;I0P}3ey-i3{tS0vKJx# zV!w1A(sa)Lr}Zb`f;(|+Lxu4UYF{c}q+vW=LPcGB@r96a+aS5825p28^Lqq@OLz`= zKUzpqgnLOhl&12fERaNag}SQ-8`Zp8GA`as)0=nz5&-&$VED>t!d(+{*FfLqZjIVn zIrt=TiS#<&OlDVKq8UQ|{n7>;VJJj4a=k>CvEUaLhHj)kp$oE8o5xo|Zp+$*XDq`= z-sR1geuT%YrKS>PJSHqSMe}MHeC8HSY@O<g`&-BM!OQ;}rtu?jFqd%kuN$M-bu1K^ zFYc{={=u=1v1cOH6iC#}lVQiRYNoTAr(jCa%vU!&Sltu|UVI7tPH`~OlVU*$#M1eO zjQ!xj`Yi)iD21Q~>bHd&pcvAWI(DdsgeM&RS)?FR;Q0wB)I`D)*&#bh7nDH46K+!d zJmCpBQRalQQF=ozls??)PPx;MeNW1MF7|U$_5;}WrtIfo-<PtV-(L{&r|cJoa`Bd; z(27t1?Jo}HVXq{VkFqpWfU+#q7%Ie>V5kUt<)LDf6`>N8m7!9URV)%n*-N%3s@b;( zQ@*_>RE{fZLlr3N&@YvEPJO5fdkuJMHTG77YOvQBszuopszcd~_SUDgZ)F5|pPpES z`Ow6I;)K^cDq(dcz1FdjbL2WCVKt@H!Y8n!xCqHh@A;K#lsZyecOO%wG8ktQ{s2?L z;_skHqkt8!19dh+`=rj~QPcCDRK8xpO}K`h#x|y}qUZBH3(jdc6IeAxvt`Ae0&DO` z0EV-`U_g}_;jD@yncgdDJv4Y~aOnIXqWh2H@e<(yi6$L<hvi8o{VpA2rboS0>qNt( zuhS*=9wj#e_{MM3?d$^T2mYX6(lPCJx>JX5WZJJ>iY%wZu~+q9d$cLK<QGb6CQnb- zY`t+JUc8OeT?Oz_MLyoSV%W&Wi(8PFbl+@Y6*OLMmet})w(=t%EGVBYSpD`Fkncjr zCXxn|7LCQt_(&{Y0_4tO7#;l-x*pz}mP^)4Hd>hZrYEb`BT2PIjggy%OZHK_9y_B< zW=)6)lCoXf`|P_2;a(C_j2BfV>XKvBAr*`|bfc0(KL<Zj)ssK<OPN>)QO*Yp06)v9 zb<`HJybe;A^d~1(!KBg~+Cqe>W$l*caf0hhjew%0nQ7UjM{yL&2?k^7paJ+vv58c& z)38+vPTv&DMF9=+6-nBVq@}03V_z5NjofgSBdv-8v4}v)7$*jeEC3b*$y#cZ&dZZV z;-zUJV7^_DXDAz|#wc)BxG)Vq**d5M#y&zo`un&Y_CxD7LE7-l_fE!at0T_w;}hYj z^>g`!Z(6Tg6Zv&9_-p6K^II=xM{MJjjJ+m<h?&9_v8)wy-pa`x@9chS_qQL6c~?bt zeCRKpcnq9Zr0b5`Kf7hepPc%GQ^+kn(KWelYA4KAwt8cpP2<jq<CEbV>+iug9jX{V z{v%JX$AQprg*CJOqS?H1IA-6=rb8~lopaBP+Q%LttMKy5xTA>Z-(tR60qE6@>iA}1 zk(e@~Jd_+#j7<F&4yKR`(qB>c6sL7h#&`@<2N7CgG=akXrM{6)vN!&g{Kk{`&D``Q z`#7rNM(qw9rN(D$IGT#H<+Cy!Na|)ZG;>qV4p`6&ZvyW_u2#?ksUuAJAg$zb6&3V2 zc5KH(I4;zXUuL)c8+?D*pVn=NA@lUHGiRTr?&`!NATfgvN>0Mr5OX%n!oX?&<^A-t z>+&x8LFO>|;Iy-RLXr=`MR?-Ce6|%ME?Di3<)cge%=)?!m9&*gS97AQNHPpSCuO2` zO4R;Ly)Xrwpp%H7nTgN&;pgeoxO#Zb?HljBw)g7ZxVt=R;~9g}GNquac{|%!J25)= z&D`{J;he&~a(kh{rj~w(>+PjmsHbY~la`*I(<5lFFKs0F!I#k5#az6S)3VTMPV~Qd z=K7hKdqvc?g7+-7QrZ4rT3o2MSV~}Yq*)Zp8rrYdP#k=Dc|*^=dFlG4n7c7*lk;o* zb2Suzsi1@VHuSh&kJ7<c&`>E!-$%^uKihCW^?BN)*LlZr@T=6OpXs*Aght|ouy_<j z+EgKAk=mm;Pn*Kvk`x(N(ES-309NPdsXF!rKLK<?1i|Dolem#jGCfe}e?|us=-@cM zhUL>Ei=l#v>Pi1QrEitaxL4iv<;#lsiO&ZcE;N9U|0qkB>QqOaEdqLN8r17yI{2Fe zo<uWX9{KVn)?96mx{)A}$4*P*dDRXdV=pJ4=98#pZp&gr)G(6{osRu1QVW*pLXY}r zGT+p*PB+0z6ONudG!CO481MWi8Hj{A#)my=SOmAdLBp{PF99w$ne2Ha=Gt%-;?-iV z7&qWhX+@%RWvp~%qI6BHbWOZ;UDUY_wCwH)<E$_6${yIN+w){w^(>e0wZ?YiAB*kj zw(6?%^aV644NxJ6QGv1+rV|9tY|{r%1>2)%Qm@omOA&Egca3FZqpq@gz^=E-!uX=^ z5)3`?Ow}MmX(`MDAn$>xnITo01U;lY0VOXcl@3X&k=~;4f}oMox@{uTKVwTV08x22 zv;<PyZwhay@~4mhQxHhHz9^=cf>^qf?hMKx?5L9sh&ICHtUhV$3x$w%0CJ{#crVO4 zevTjMIVu=!{9g$p(N{?xd?%+{|CWwL>2hw(0rCF@M6^b{^EB;G(#2%3Dp3+HN(0OE zlfO+6`U5<Z(lrIfN1`RoGwzl125a_Vajv!v`GueQ-c#|~?c=5yPZdOj9)H4J8FN=g zZIzJ`wff1DTkw}8d{r@DRl>JA=35QNG(2Ip0J`}^)tXq<nrP+P8-3Bd_2Z^FU*SaS zM0m#6FzXMH*mlx1<FB6e7r>7;5vYv?Y7>FAvB26tuDp5lk7{ogykGu)=lg4;>-NM0 z4@Mt86!jcJG-G=Dr^6(Y{aRrM8IP1~-(tK~(owv9gYicj%-Bi8Eci-}%D>KL$mhc> zx{#tX7XZEAgsfBLty35=-9<o|Wy&vRoBC83i0i;|DlCQ&(n!%8C{MTqRxTxJNh-WT z<p`)nn78}PEYh#}(K{I%?y<aKhgA#N=devTaGh}klndXK`N(jw&MYSE%4f<W@^8wF z0n_*};2bgqHYtX&yd5tucWBCa;>jBRxi*Kw;n8pSboyHkk^>n2_aVVL%n^pb!G<8! zRm}CsCoJv$oe&z4@OR_{tPYO$gDGgth(FNF^Se{z$=>kWy=iw-+(?L#)pXM2?$-D0 z5KNJe!Xxk$8AK?l;vt86_JlMvNTCvjd1iU#J1E}yATk1;gE+dM`Mtq;?dS<)dA&%V za{L@D2nR<HAFet5TXzoxFAkl9iV4PP6e?0iQNeJM9hXB<QcMOGpdqd0^vx8ffCaKd z3gyA$2pC1J55eAu)SPsIoE(-p@lmjbwpFkjM_{`X+@LY-f&W~i+mQBDhXZh=^b`Ho zyQIHUkt@Ts48t<iTST~)p<ZV4I|In(7O-sPUjpvn7MB#hL9w&^?|4|!OsIUA=Z_{j zgkHqO2h%tmu1Ukd_hlcyPssR3xShy_fV~dnLc&)Q^N~pe2!{NGI~a2Z6YiBUHxf|z z?R9gNt7ckuyx;lby|?zpTON*A9-!=&!MpzaYrC)Re*O65(Ww=1FE8B~_iu`H%^M7P z*&k+m#=T#8G_rgAz=V1H{JdZ++XOyy^ENTDX@6|f{^-Vs5Y*veu^N#cY8n#NYh%@G zqgCs0Y<>2;FWcvd>_A+D>|CC?dZw&p#@Tw8+F2X()!ug2{(8P14f}Ms2%qr+5iBJ; zEXH@Ydv=J%A8is*|5MS7G7URJ%*L_vC#Wzl!_P<e9c4!1ba%$4h||b8W2_SxPL+yk z7viW&r)Wpt#Te6uJoVy99jZY8t`u8@6bnA+cvY5QRD419f4naagpQ_dALSpwoUc7B zD{E?lPxoU+QIyuuN?@AjE~SMD--rWH<^DSYXtMZBI(sOAw=BC&ma;uXZVi$I(W)T3 zAdwm{&c&qdp$8x6+1<T!zw~?fW~TjB?D|+-5H>wnn5R$BFPV0IbT&hVA;0)936Rg@ zGy!s!y@=@EcF_IKAg6onI20)4i+wy$k8Eh}K;%oac}0o5jj_CqH{1TC{SVsXdApHr zEpJ~Ua3~fy1XqV^`>yVrY=iJC&pU2}x+brD(uaWZffYA$q8<QY;a9tVJ@3P_Q=re@ zvB7w)Bd?>)c&k}N{Z^Y9r9SjcpuztH=xb#woeuQr!<zz=3WTL{ACKRc(@_Inh~Y1) zXskmu3LqOcLat;}%yMBs`B=wuebp=0YHYnw@5S%~Gh<Nz45(sN@>-?<qXc?{w#mVt z8^~#E9TI{DdQ$ONPY>2a(&=-^b5S~M(6h2Z83KOtSe?p6-$L)E2o51ElFwuci{!&| z1Vg(x3^|SVT_OPy((go_<%(4?j+K-r5DTURzOIRu&R9!lyk%#+<bg=%SG$Sb{o-Y^ zLZ3H_xcyTWV3?t#rVhLDmQ6&N1_&w})yRlMjor}Lrc~o$WguZrg2jUvNT3@*R|}vL zWMqD#hm5osvrM6FV1_AX_|_Icfuj<ZT6Q>yC1FUALTIWPMxA8JX^}uAf_PI6Pc&vo z5oofu>X4eFL|y`u&~}n!br~B_os1$8=j9U2RUjFFxysurfGJ`30T^cqp2&8Ez?2aO z7+a*WL^ORwmqcu703aE+45&A!kT`&G=@hUaGm__^6=cTCgXAZ#Jx0BkVqc%3a0v<& z%MZ{%xSOe*!EBwtCvdehbAEiE(C3TzQ0XNqo~PnLx<o=zZ%rCPXQVe!P1-4F9s3$? z?Yux&zDZ}C1AQk>Bg+(TGc7kn0$}4*z^{l3Naw@Sr_0|Ew7-ShU>D;;0KeC3CjFCA zys#mjyJA7evae-1C?mUJt#@th)wS@Pgb~YZW!*bl-`aX(b-Z$2%o)U*{>((pY*9Hp zUyEIHp3;eD<DQynPuF`xHwWU)UD1XvglftzAaz0UY+eCavHXh34e|V@>HIY}{E^*v zk&FXk<%xReyq$Fk=gOFK<qgwq=bHIEv;f8+9&g0HT%@du?{A>}*8~_@L3f5((T!P= z%Crl5W(pc)zKedO4R@}T&9e|v4)aA1#TrwfRA+HdnKP=vvhsYuZ42_+J_Oh$KQIHb zY=jYUi<zVkH;-Hx31@NmVmnw5$IvL4%hJNCETtNFNMW2+7R`SkKw{2g1TG9lG8fHH zbs!-PQT_u#!ZAD);<9Xa#4zh`As=)kF72EvYnlornzzN8x4rL=H}8y>JwOqt_J~)r z#?9j+vmWoY?5o)m{TMz^UBa_6=2<zjYWw?b@m0HSdv;UO(mmolT-Q+o1k|yVXFFag z2<li8Xfv}Db~wGb#ITEgx;a?5>WmknVyo_*+Bh&%yda>&1cqEUMIZc|)zO7foeUwQ z?^Nm-%?fTbhbU4iK?jyR0Fxk<fI}cgicV_!CW0|4ce1c~h_{{^Hjg~q_hMlrtaX5c z1Y17k;M$t+7h65C?hXWdId+5nH&`$5cp+}d8!kc&eG15rctppZ<|r^Y(BH>6G#I`7 znm~o{3y(GRJU)pB!nlB%;zCL$zY+lzOz>dpDg8&fiKUdHwTj^v8NraRM#e&_fV2s{ zFig*ff-*aYQq}^fm}#9H33~gromY3lsM8zwSIyX}XMG4dYq1wZcEFG<yI|JiXU^H% zUk^`Je)CJQ;+3~OtLDwPfO%#_vOZa|3;tpRu*!x6ry{wb{SStt{vC`=yPKB}`DIQ4 zoPBVXJNx{8Nk^XHR-V0Mt@&0kr=!JutHq3Znl`|M*5Xrnz~K9nWV-l7TWdjZGjSw6 zjctGmBg=Lss$`WR{GfyPV-N$*GDa}I6_hg3RaECeJCvEv$ZuxO)%Pq=K3R!r3ryJi zBqGHkuLP|{A^7|q8#w}D-H&P5+A+<fU($eXMJ-KYCw+tq!YfjVtL8Lxvy5{0(wMHt zM}fe$+3j^;)<7SFI!gH3Vm^rN;=YZMPIZ8+f`<hXuDj!_CBG~1XC$F{p{PuF(=JC4 zPQ?P$_m%it453gnu%qpnn`T@q6@m7l`!Y7|3gC4>EwN;BZW?44zleWYN>~HWY+Z~O z$s$gUOqq!qJsTs%*HaN=nxT|W>#$0te^}llc+n=ZienTcYbL8=HorKLzcQAOr7fPn zh7f34T4yYg&Ptvh_J!tE=?RUf4fMBo0LA@`^3V^deTge+Q?L#Mg(`m3`i6Q%QL!2& z`a0?F@gioZrgR0_+cM#BI_xaraJXPO?8vNG9rZ*t8i3^l!dp*8%u_Mh_D(xoDLgH3 zlk!$g9*TQcM67qgg2{$4^oh!brtnXODG`0LIOZ8q&gp*W{djWnf74PjgLnEzvI?IQ zq&+Ff|1-ID#);uWGdImn6u=h*@WGoZrS&>e%4fl&TnT7yplReT7MhDt?O~DFA_pI2 z%fJbU-^kLF<c5eiC5>>?(Lsm-fkt}4ko6DrA(T<OVo_G#EqwvK`DuW>e0cUA#k-j3 z517L|j4$DlI>}g!2O;dG8Uu|OoqZaGB7<Tq`rqR~(s=gN@$~Q<P&FJILFSi{{*3iO zIowPTavC>deaLc0HqZG2*VbQM5AqW0gX^+ud}Q*`h-=2yglY7R)pQEs#paw<lLy~9 z^45_V=W52cQ*`NQ!}fUI4p1xE@Xdkt>h;PuS6p8)?W>;iS5F?h?Qghe#wkSfaO#+y zsNC1TLsQa~Sf4eYC_aJ4sbTIBz-Da9+{3lRq0yT%HgH8`DyPy9h;3kIfDB?Rb0dWl zi;19fj)=jO7z4)eHhEDw|8yS`R%Y_uwFqcC0?AIF1cz@#G-8Vj^EQ)3uSff(ee_6U z)7gt43SK}x(}w9U2rLL6$-xPDs5rtv3bH(hos6-^yI36F4K()TVZzMuv-2lRiTwIl ze*JA{!<;j3!t|!|y7M+du5#;>X=m;07oyHu#5(djBDQ&WfO}qTf2AFEM-#@05HpU* zXMqcLAt{EOAT^D}R<X%Jyz_qKB|4bMHBzDDs?3cB@eNpQYfO1sa47h_8iIAwe*+Ff zhp;(ADzi*m6=tuW(J4JJT%srjUDPQRxCtl|AsX<3$zauF=$$j)J`?pJbVJ*RK4{8b zBQ@@FW{8kG;m^fE6hykD0w>5|Rd+)I1DP2&Fi_J0Tzo481{7#xna<lRGA+vE!j&qO zm_Y=$U*fIdoF~t5yUw7z2pr*BMkDtRXHFg@icuhjZc4Q_k^Y>Xl5U;U(*th3r{_WH zo834K!ULY)MRS3YiO}TksSy^k6l{gBaN4^nTCyr)oh>X)6t0LDuK3QQQTLjtZOtc3 zphJ*OL}b#xR~{fr1hP6tiDcIZzmwHw{Jz+h9_v;Gm;t<#mY<Vocjl(K>maPSx_D`; zD>56=u&_;k{^MGjG1!PB40m)wv2mP~7!;S`+#muq3>_atdU#~yId>FpTu9T%g=bvn z(X3L3ib*UpNC$de!Xvryzzo%h5>$HqcTrF6bwqt58it+>^;drSimsh`ghrqN4`b+> z#qe7_lT|k74Z<snc~8!fBKO)CuYM5;?NUsDQag?i9fQ(up+XrsG$_?NPz$p$qN2=E z;j2E)+*3iU+CAj=fiBiTjh_{Aqf@nJSDqLK+o#kSlfDd%tVYWhJ5ea~>5+Ua@R(G( z5TZUz60hWriZTUSNDDgApWiXC0qcf81dSMm=pdoh%psBv;b^!vV`w06?dj26A~qlI zAMC$yR@(9ujTG6-Fd}q1=dp>l_uGEF_14ztBZqJAc=Q`pv7E<##Vn#<2n5CJ)}RO! z&qPya=;hA=BAJ<b(h5;4y(0~LCh=enK4Y9F_F=9po3!k{$EhJZaQ!DNd-a^t{SEUs zPEU5mJS}n0>bSFQ&Xt3<fGphd)|N!&hFIl>c;%*<oX6s>$4F}MIDChUWKn2TED8yB zl#O5mFAx@qbG;_804&P6lwS=-w27%fnBJnS2Qk{cqlN+F2|1*TLOPqJ610rxq);u2 zC9(m=RP3NmW$`5m^rc#~EuB)53UEAwt598DXjSf^e%y%rF!kKQ$S~K(QC#w;<IdXm zyx-0HPF|vZL#%$o&ANE~j`z`d29IO*;YZjn;>;=ChnA=tMvYHJqTf;{BBqgylhkWb z`A51;rC_vs6wD?S>rYI1snvNGkMJ}|oSn{uriEC)jr=|>pOKzPgEo*%e!NwtlltIM zpCWka?FG>U%8AK!3D;&)P!Ozujy-)bY-n!}8{6C4K|C`9x(pq!n<f*};tr!{m=~Uc zheH_kR6Hz^mrjPTwr?1;0h17tIH;fC;7L4(V(#XShZ2GMSfKvB4T%+-V=Fc%R&>Tz zz^SoowyZKywklq>>PA(fwQIVyE9%>Mx$|zYDghVkV9SlR#Oj^Xt9M3y&{uruF67Vz zB<`+>+T_%SXqvjw5=Q%rM62JI`2?4x3^;K+V>#Nq14V_i0|uUxM8U4`P&Mj_?B11M z%!a2uMK;n)Q=vD_Ar;cHUglfcOD;50A6(jkFx3Yu#FC|lon0y3t6>Kdj|@<_UGTQO zc#pJ|<|cVhDjW^bq@4NxAq@{rk{~vY>Arxya7h{#W)1)t8tGyW3$-&yL$nUpF`-u? zI~dCjPUcRT;@M4*er07xHvY_8a`VvpoqxD5T8e0Dd!x?1vODuvE=Fzn%Pmw1&9UzP zx2W7-CIwDjeBKKwC>oHtjluz085|hUap{yg?;xF82_A$#m2G-@BFr~c8>CzZcSu#{ zr74_|NfNVDGjIf<xKAY%4U(5&+>_E_T-c4E5j`nNJ?7@geN-9a`L}qdB95RDN?Q2E z=@JQgX$Bf4**Sk1)I#TIY);@J(hi&LuG!pzYfoK$DzX#q;m(|BRxu=yl#QARvVC<? zXC0#UMzTLy$`(AO6e!;{SJj-TS|6)guZlFHm22XjwKq)=J65}ZX|r9Co#O|8^C<`( z?JimM=d2RmUei%*yj3KkOpDY)1Iq??J1X~|Tgsf#6?CaiH&~7Q=w9F#>Ip92J&XhC zz0`|y8CXW^B{J%Jp1P?NSJ7(YlcV2M$K7=acOy)@rw*n#R31~I2G^^Q`tJc-_!x2o zgSHT`gOiyXNuF5L3;KMvX&M;>W>BB|xff_vN)Ok1Xn|g}$T|3OL7hP}37uvZpj>;K z8s(oeL!%bt<jXS&@VBz0$nUL6*F%sqDr<)<lwWkzMAp-i1##mLJ7Dk+C=ol3Dj5Uv z@YTd%WNag3-pn?-8zP?-2(x2{!3ILtgv3Gt-dA`Uo|KyVRV9Lzdj$bPDi7WOk~njF zS3W?3u9Nuo%#DS}k>@_HvEJtz)y!2C@O67gXQesx>5a+fYLQX$>9-0iy1IPu??0&; z0BT>LK?q%Ar?BAGlcbc%*wCMrkdb5}3f6=Fn|0LQj;~;){gUNMnVhN6avmaQ&74q2 zR&VP25FI8<-iG^64<KY60&2*jH;S<jahqn~wtGM^tZU!dcN!~_B8SUJ72OoXm8nls z5-2l+IOqZT1}~n6qc;4#LqoK5k%C#1`O~u06zswaHae)TZS27(Mj+(j;k}tAn<b)y zstD2GxShrjqQgOQC^tXdu8*E|VsIECSA!=hyh9%u11S#XFyzHk(i@^S1!j0G6A~#f zpmC>rsCTrhQ+ns1bS|Uq_w5q7m1>s+>qyf9Y0_|dc-$b-0Z*Sej&6eu;0YvxgC!y; zIXMv@|Nc6?`~E-d;^ku^^`99c_b=)PfX?}TsY(4xTIOKgp!GBd2pL4!xFEfitXl$m z0YF$bINcIq29}Kw=88;+#UkHpJWV4mNZR`c&mrqA<P_ZT>}9%%M90a%v8Vfwol@+; zdX5bZ4nS%#B87;~`UPD^OBgr!a&YHek|8IJm<JLQB%20NO`47ZNTqYQ7AB4aKrFpU z(lB_Iy!r(GX;gB;jD*$UKpJ7j!MA5<@XNHEg>eB^{W`(zopx1>AG~(t>XC>MF`JMP z>O*&M(ieAEBkT;1D?|Be5nJ62pWfNc+dlAg+<0cZeA?SMlV3ko9?x%__O{#*W8Rji zrz2uU@nIfFym(&i0uomFE<X_Ih>XApXnf?A(L27vJN^Phw9GA<&B>kczg9e1_0Gz- zR{r3zcttzRAqs+%2d56*Xt~ik^*HPu@AwfFDerX_ZxuleVS1MEuZ;Ou&iGptZD_~D z@QkN&){}e9dDS`bFihAz)ptC(^Obn@d=1Rxzrg~!A|nAKQC7q}D`q@Rcie&W2at!K z4;rVOT&82)G2;oMCvX(Gg<*rAH=A2{?a8Z8!WQJ2sg}3S#dDj+4bb%=&Tqx|?un7f z?GqR7`UB(Qd=BpT)k3?Fvt9gTX}c)+K`4pYcv~){w08Hr8#~-y{+6MzE64O_t8=>o z!k-81T@}VZFBeg!30P=wX^CE3!hkV)2s@dZocKe$C}=Ty^f(DDkg5`2dxmE6q%7^J zHuShhhvihSB*s(knW}OhWWqOPeUG~QpHvrptrgFLG(z+p5qcjRbVDBH3<v=6O2sG~ zq*<+2v#w8JYjvK-!?K6WDRN%8O-pO_3{rHLe3gnEE<)rXJ;LELdj_q(q}l9;Ko)^b zx5Ds23?XT{UZ3KO{SB48f;q(-q?WCBbSE8JUOWl9S|~O~hR*h|K%`7fWlUy6+XTjV zc<7vT4Cc>OxCoiIDSFBZ;HR*4A4}XFge}B*GIT!;llBl+JH{D8mP*2vVA#T=>ER+Q zgUo=QkR(n6N2(e#C-bn9sxUrMH5H5>`7+fQdSnVSrWa%RyO^+*$zIQ*A+mW+(l|JL zRw|`NS`k{0*x00DU@+4{r-VMWG7X98W7B_680|Ki!1V;{FRvdTozAMf3smOvzIx{J z848!$94l^)u6!U~yesb79Wl<ipoD(&$n_&}*9yc~Ba2s-mvtq}0hVKTMIN~8$$NeH z&F8K^7xOgC!dK?l)h+m$DQ$`QTJCz_#utbdcEsErv!499ocz~)Zx&rIntU`?&@>gk z*%r^)7TJEsokP}NQruIK@HE9dO;g8aJgqm5{_xEA&cIlF->rQ!YY*U2KXVrR=ZgB@ zZJiqV?xlAxK^&j6<s%qsxbBspA<I=8G~pOh_#!Iz=YT;I8bQg?3dS~2a)qGyRS7)w zb?VgBR5y%D1hS!x*=VF>Hc)9ngUZ30y2GABgJd|x$PZ?iv-2PZ`j@z$hq0oOm)^o| zGV2kR0F22ZmMMaMh?iza+hMq)ES(?H7<b|!r0=lW3rG{T_m#cOvVt+B&}SIz1#`}V zXkp`fBR4wV4aW*M%s4mR@#W9C`N^OA$O^^|`xinlFF4)8tHI62@7XpR|47`Nj(3T< z#~YO_Ss`NL4SE9YcX1JIz;k5`&xyJ`X=>7Q$V!28X#lY)1Ucq=IWZM_cSHB2t1Q*- zWwKr!kz>dN$*f4hA|O37hqvt*I!ol=GOOd^b4P~}>Idp`&{80`iJaoDB%z?3UK3_j z$A`n4Wk(XGv{bZO!Lt{YVG2@`2ADRV(Fl2puH8?jrv2R#fh~)&1puLCg`4lG8X0L4 z#}vs^EuH@x00o!+0~s(fhY>hQ^D#ID^@qLb*ny7y9RbSYxES2Jr#oVXKN}B8M*6Nz zP^Qbal~r$Br%Y3!8=djshTG1KqyyV@*XDRN`*Qa9Nl+!tZ#B=@T4voPkr6UqhO6DA zf&1GnpODlxHX(PSa=%p?EI2${kHg*i2&Nq=NWkt|Mn$mMb`vFw#~8^h7|f!iARYxR z2$`qJ0@9?BY|m&qD`Xy-rDeFxb0fHqsS`-!fler^Bp>t-+-(!a-!p#QIPGqW+S-1F zAExnm)mm!0W-2wY_esbXE=bJ%xkWe38ncCAitd;3aEV1-W6{)@xSv8$NPkEtSX6@B zw0nn&IV%2|il0;Q3o3p|1&h$YB*f&N!*K>P$TL$z$XHh*J53$|`6H^a<z|U$4)nT2 zDs`qpW~x%jO~*+8!c+)MfGmB18pH%Zy{twMMN5lB2uEt78Z+;^Opp3=9An1u+c+UD z(JfST0bGYK;Or+918(bGcfr^$5P;qQ=vc_jKuscNJk@<gi#a*wHqf3F#m#3fUgY84 zP+Mpa5z5UXSX}oEHnW3HxaO(0;1|sm3l`DbNJUd>&4gV<#VQA)quY>9P`-^43-V)G z<|_FZY6w3^*X5b(<YTDKx3XhSbCG-uwfSOp%x*4~kD)dn5G>w%2Cvym$Gr1YTc|T* z*X1<(7mD2|Dvai$1&0aEaN5l)76J}){zAUVT(aP_nAa|N(A*`b$?O2JOP_D#Ux{dU zs4Y0G=Gq0X*<7&ba+m`P`3CdqMaOp0>|WSq$Tzzd+U$5iz=DrJ2t0g*XkNn_w?s8I z>)22n!*Hk@MucsPUi_p6^g`GvBl4&ilfJIw$9F@Fmx?OVXl#r-pS@(qcR!h<g6C=8 zN>+-ZM?4nanCZRPcMk_t$-_f^ENL?=kp^K|a{4sLD9S4blU5+v)5xLR-+a6o{vBt4 zkinu4A3FiV5{<z<|MUqMtHO$v$t;Fo$vE6M(63<GMkc`+9#Y>1=>pOn%0>qCRM@Kw zBmeUt<>rIZh5|i@f)Jhzs<(g@#q|`S66764(IYZUZdYTlrMac0c~x_$|JhY5T35Gj z=<kCcq4vI%(>?O(`sU!lrx8~#&7WnMdt8!i;%LA6YVP?=K8a`hrPCMH;~_-Af^kEC z-x=zw)bZlqo7MxVU*C6%<sN0Y4~9Jb6iN)=#gi6N50LaFy>}SRtG=1etEL0g8RW<V z!4@066j6`TPnu8xxS3%i^88ZpwBwBG^PPsSS%{uW9dK;Uh}82BgucrGTp)Jx;e?RL zt%>E<#B=K+jyqYov&A(m#+KVB$MEUKk_nxAYEVpuifIAh(}twi5{&J6@jvPDMEboX zEE+JW`89MpZEE3**tSR*G<9k{0s7?$6Vf4>^+dXwtsje=XG)3tW=AwRbIQJh#nH>U zXhn`6X62GOPs4}V5PkmWaO`p|LR@38nWkJ5iSYp#7Zn@fq-|f<!H&+3gB{_bx+kBi zYdpe&%s&-sZeVff>z-_Us{TlQ8k#`&a5O>6m-|!Q%M65`ViJFq>SkTaiu(|CGFkx> zt`c;5?4n*IF$GC|ww^at8-+G#4N`0A0XUFeHUA-sCd+2ku|6<i>SV#dA^aSePwHWA zUjrV48_g!o{cvbLowTs|E+sAOAyU%D_A$}r`NF8e)QOVxC_x*PCx@#E8)QO9bLM6F z5HSoN!DnFJSj_f{Oiwi<4iTqU7t5=g@_)DFJ0<bFb&*|jB^7Tzb^R&sz!ooQO_Xek zm2A4XD_+utiPkMY1<{@6k^H$r<{rqUwxgnBweeP~h*BR^pdtCEfJ)W<Kt&nYf9lY2 zD$)r5Q@#Gna2(8qc#`FDCWk=PJ8T)BM)Vn1`Ys<2+{l6p(>QSZ3<|fhY#a<YL=J=N zVkPV1B^xq287vw)nWRO`Nw8s)@ejpK=^aeSi_p{J-vZcPwo#bd<H8A;@sR-^(RzG4 zF1$j*7FyslHa+o}CJ5siu;awk0f$~PT(;>6xl%+)s<7x?dG>;xgM1@m8-U^9OE!1_ z0_E~e4`pgvFg;H{Fn4f*R-T;sOP*OFk(54qZPa{q7-)Uoo=|m%DLt_PJz>_wZwT(I zBNS5rRcYlV3$<SJmjn}Jm6;&0*q5x(LYW}?6R+4ttzd+*7$ZdFm1Q%&=*lKyiB-19 zdY+ir6$fAh$n%Xa<7A=YNrm0!?r^qj#4_AOGazl25=vf;KV~oW8zMJfyKKOquj2ff z9%__I!K34*%uSbX2QZ#c2M!<Eq#C@nl5CF*-r)AeTpFc+3CMv;pZTj%A_4BSMnE16 za>KHu3#Ko_%x|1gI^pelle$@V7Hd{<>CaeAGnMGxPq>3dUJ+T1m%?g1ukc#<>*2{q z-g)A!Clb}`W7X?#*1o?cx?%V2>OBbK{n~D_Aur`-b1$ykD1P6%Q4G5tlAw=4_T;86 zay3N+$gM<lw4+E`NvjS@m^)jMm`OT<&r5ptaR*i0dg0>1iy#TB=v*}w&r`wT4%@kM zgnY0h);&AunHE68nV~`M6lxvjE}=<L;+;oAoS?kP{M<I&6>j+a{nkMJ^EY_TCybMx zJTP%GYO9MFA_uR0;V$`Zv5*UOF<)K6w<_jab)ziq>zMXE@csc3H?%}{kemvsHfHi0 zrdG%ESKfB6B1uEblEr8*U2+KCyhKiIET{H8(|5DKll{HH_YcO`?upku7|+>@^cprt zr0ufpRrh80gk{E7b~m>mk=qc<ZAj#{#&TPut9Qh6JEwE^{KP=AuZP4)7ox3C=Dt(( zR?)Xh;(?Ws2kz9g-8dAl+4Mo-{>hx1&-}#lhhO@wmg&O%k?oQ5h`SC<`;Z7OmRt~j zwO|&C9)c7eAN!{T_8l#jKdm&O?5=la5|>3ZDohlh23Aj+x*qO&m^1%0+T5*<dOI_y z`WiY$g`2u|4<7ZBa1ZREjdBtcj_sPw%8j&A4%uj+EuOVztn;op`<}sSu8{du)F_rZ z<As%DW}J29n!TKmrH5lCjT5NkQ4v6K3@=hQG9VzA>qP;Rjuwwp_gDpmT{5P|>C$s& z(A4jG1^}Z*m;ls{8W6q~?%#L=TEVyf%V&vKYCn4!p>)CQeR$0Y@Tok>-bGU9tE8kN z!o5<Xig1zg<UQOW`B5N-MLE@(7$2tXFzBFyS*nu?iiKSPyFr33X1OW-HuZ2bb~9|l znADew-89Z5sfKjknLXBpG_zl^k9Eu=>U}nXM<AUEN$9)cu8M@KG3IK7D$&(4>&zK{ z`0}1e7nm!ZE2dp7OEyHddU@aT`=<O+Q`^L$$%n5$j>-*h+|>5T5?osXn1SZ(J2odK zoH_f`VG<C0t;5>UBHU`RceERCZ5C0ctq8P8(<m(-MUiR(stM6G@%ae4gKwHub_z+L z8agXdT4hO8_92lK!{ZLZPmfb*`e3HPCC}zM%tY$_pt^&UgXY8l<t|~S7Vv8V5k1^1 z#}eW@YWj&j@H>>piAA~Z3)Y<-LPV3Jr!O`ke+jt$dM&m-m|v-XXn^yy5X`<v<2;N{ zlK{6c(WHWUre1_j2`^;wF<H^f&^Q%`X_PBbfddQNQQTLan<;L3@7NC-|19e#o$+lC z$D0qtiyw(+9gLa|vT1q@*Q%S+m5U^pPiHlm3@2A!#mVTCaS_~{v2h0o0WHGPc?1#1 z^1(Vx&is;cU$;aSG@0nA8^}VUqK7_!NP?H3I+LU0)A6)+D)iIhUR;<OK%NCm7ZETW ztT7}{2qcfv%yJ4_h~-5tVGBxIzdbEvyn_Wo&jKjeSdXVU->O9J0A9;{1MpJ5Y48X? z0E~@h#LLJ$!fzQH$YOj9-!v@pkFcP?CeV5i6l81)jyy)Djnq!Ip|0W?Jeek3#s=~a zZY4|xUI?5ByI8%LXE++jxDmSp1`vqFj6j4wgocZ6BeWc`ZG@tk@)`*|*oJll<!Z{0 zG6$78iRY;rXWXIIwOeqsLfcbn`d>Lhv<utr^L82BakfUeQu~#1N9vV5{VSAKBlDX$ zKv|SkLVTnt<<17BuKg-^;vUtU>>{)hBIzHDAg>MKEuH&=-TMy)cXaIC8$7sc_anhW z-JSb)9NO2_eXy%D2)W6w{hgagG#N~pTs+BGU440XeLi=XU<iaM2q+FiGV9zRlVFmR zk;l0I9z!!!kQN|mm$6&FB;BNgzr;c5_kfM1>r^nL^gJCSVSUngPCAXeo6=CYA7)u2 zEcOSB5SFx3h~ph+&Pp@5E$Qt^X(W$|tSF(ql4eLwK2^Y#+%TQ&(3vJmRY-ICo2fg( z{*(u*0rEqHJQ8Rf$ixqA*;h_Yw8d<2!`wV$Yo9GDdvn9}4LmV4EMxrd6ueb{)WQ+x zY)$Kpy@|G+v9_J@wp|p-k)r8Ow7tH5c3bC<UAJ5x<nF&|f(y~5tCuE2@0@<?^mJhL zbnbpRuk`CX-gZoNe)qxeJQy!t9}nOSSF-Mc+?3-|%Rk+hyXTy+jlXv4>M3M^pAA;M zll85vD?7$bWa%>FEWY8N&$8q@aJLf?Px6W;+TPrJeRDiehXDOqzgqAK0Z@g6QEt_g zbvB#QP!ypQ^p>#r7>d*d6V{Omu2fZ=Jc<rLT17;-N#4Lz=^T~g@dj}b2)e(*4_}uK z;o4=PnVDKC>`fmYip6`52B#c1%dvRhE{eOGrrrB*RQ<5=dyVf`|G4Q^Q>=A=)V7~5 zOlre%3)R^Nl8FiF20m99UZ&j2Yzl?oy?~}j|ApX-P?dgHPO&#>)P-JGN;Uc&rr)`z z*5QQ|3R%>nQ%Pi^7lBRRaGoUrmU{@xmZ=-celeK^C9ecmy*?-`;5)@einL~2!N;cZ z0gPGF2CV}HI2=|)e@|jEr;7fhZX5{brw^iXQ%}!xG?blqFou#GK3?BDlf@DpU$}e$ zaEr9u)9%XIykc-=*EV0>jK~X==#2EYa`KyzoBpV~Chp!6wQb>JfcL2z)!Arcablyb z$LT9RPNH-epR`OoMq1BIB*CMuzf6tC9~w_Fv7Wp9T+~*$yb*XPZv?Gj#GIsnf=X0s z3ByxKBN+=LW4JU)K=v&>A(dKt8~d4U<F2-^P}_2Fn%Y+Lo^R^ly9F^VPf!|_Og+SU zDTqqiq*t2<nK#pLYkfsDA_o0mQnUUQ>S==xqj)&WrVct25r35$<-^55syUUD9msWe z*%I*~17d^+)L+h;vIXZC^b)3DCTNnF9-2N~Vp?T-nWU@iWlI(n$LPgtQGv2|2^y06 zg$mL9kVtyj@&${-ymcX8gc=mPt4W;;ovFd>V>;6%s<AQU^c>!$ZYnOJg&F;(o){IL z6(z@L%8>z<+LB^BGcI8d;}T?pYt9w~iPVKqo~$*P_DUKGA~QAD?@??y=nR{f#v^#_ zbl))MrA*(8Neh1hrma;zl>#FO7uR?CeBZ_49)6WX9u2Qie-Jo=xOWIP*Z89`YccGf zUay$|lvG4*6-WUy*1a655!=8(<qH2~wL3nW8BVcF0*RBtRH?!=)qF;NqC(h^nGOVa zAX$mHM8^XDAzOqDk|d-==sY4o^aj0fxK;6VgSktn?<{QPf&*}2BQtR7zuuvvz1%Ra zSL#0w*`ai?mr(`XARwqyl2+g`aAYG%3nW`-q#^FqJ%M3Hh(4Qgle7gd=8`UPB!fpL zn>C4wH>iWRqXI~G7QVjj%`MlryjOdp;>M{zYx{}ePuIsA_Qs3$#hu+_U9;I<NPEm> z5pg!lIc|f~zprSb<LahqXDK9d=CaQ~C};74RJi-Rf^p3_3`!|=2=&$y5=E!R7P)9d zjE)u=aG3)k!73(qy4gLst&vePoY^j*r-x}tv9W5;&?(Yx{wL}vGK`j(y|wKOG`=v1 zre#DunubyS1zk(UZ&S}!pn{%td0st!`S`0tmxm@oaaZNo19K+J%MU*P;J9_N>H|~l zXY||;@PO2w8%}X=*F^K_?(GUlvV=oqKPF0bqXwxu6}Xjah70t7T!ceM3a^$Dx{FNv z_&>;Y@P&L+WIGo@$zL!&E<n0$3a@+wy6~ez7n+V<JPSNP240FL9NiA;8Ig*~s~La{ z(66fxH&hG_H=j9$Llw+FaQNI=av+4E0Gtk(#9guRYCiGb0S(=d8QlTUOGzpmXo^IF zSLs8Xlgy|k-8-RC?_wj%_;%28>ZtK38H6Js2jMn1>_#fyrLp@0PK^n_%*vm0<wgVB z<1We|JeQAX2j9$!nR3S-h&*=3>bkoA?XIcXx4Y+T!O6TCTRp`@$eDu>sdi$`ZBpC` z)vL$XkDdPnVk1u($!2rzI6Wka&H0qAdw=BY$P#X4**o%#w*n%{v?Y%|qY{6M{|g0I z6hLSQol~mdP@5*eKz%ZMOJA0;X?iB9UEk$XQ=v;in27<W!LN$BjB<Z@GKUVC3w1R< z3Tw_=ccn`MEHXk?7+*M>>U&12hTG6!0n4Snm3!#dTl;9acmzpwDS<s_oXCVl&DAK& zldv+uvZQVpfCX_?Bcfr$VRvw(9@8H)m%9gbkyxv@SH7mVmn@I@GqJjbQUR6lhJ2Y4 ziMOueN%_c;3hwnnRv%1K*4rz;O?jjela-pw9?kOj0^KOlR*#<U8$2cFn8afofJTbn zO#-K;p~2JeE}_J~%|Y@}VjsxD%#ocW3oFMTceEcX2M@SCfNva8TFjot;|Dj=-4|<d zmBgZ);Va4B5*9dgeQH+_QtYMll)aGfQFFRK6`%Z6Ji>*wKL${R^OXF?sXc=k4icPJ zULN!!A0WtdC|rvB3!DH(B|<D|mG1)~zz2sXp~T`Q&<pu=9HS>uag(OwS5aZABG_oT zePa*Ix;((69xOqxxfTS6xg0(sh}E+7^41B8hCzhxrOTHl9+`2M!};U-@!7)i$#v1f zhG~BT;*v}}GwGdZNE9~25MZ;gaU8KqimzHfq#VW@Z+6B59q=Z(>-4<}CU&Cjwlg@N zi#Nc;Ez3K;F6t<Zn+ku$Sko6eHg&X%$Iv!)qbbW|{NF+)6?f~cdY25qwDj3*(<n2| z#!JK6db|?!e3&XEZ%3d+<uNH1Vq_Gee@4O7QV_R+vS2G6NzszlA<$sZ!zXPc{b$aS z<q@pqPeFEj<}47XDu7SgK<TjyhcToyZhYA02pdx|O~bYcr-=P!d7@#t2;qCthu(rK zhAY-NcV5C>1_zl*uttqjUbwV^sPz?HF?`kf$#@<8e9AJieZ8_n6mE&x9WJAE81F(3 zDjQ_c{l~FxNWZ`fmZ416|0K%e(J096dep$R5=7auZ|3H}M(J;;z3i*Lg=eRI3j(qn zgW|BKZy2gYDU5OYC4G~hebXJ2d2A$V3PhfrHU&TujqO^#j+69)I%kpixtG(TtSIR6 z74b6o;E+gaXYj*xb;cGEq0BeDWYaVNmsN6fdE69Qp|Se5KLYEsb7zCcPY)eMDoe#h zgG}=Jj)UTaE9B`DFxEpi0>_Y@9IORL`kRLPo`sAav6<xy)4G;EXEpv7pF*K1u1AF< zm7M9)GgF5f43IW$!yX6})X%#NvP4-E29$V!)k-uL$&0=QjkSdP7<CK4JBa7-fB-e9 z$>Sso$XHaCQrH5Wpv0XB)1#@K)nF`tM?=?w2Xc)wGMZ;wAhjYyL2hQlGww<RCUdy1 zoF6|wX@VQtjIHLL5f|}LfG^fJirr|&Gt{ICDiQ!3w2@R$5^ECnh2S<e3jjG<W27(Q zYyK;}o;nYbI?_Is#$9E=V*Vmzl0EtSzFCv`<z3J3TBKHe=+B$5zP5MCjQU4{$!y_( zg?rUa?o;7DdJ74zPeS-zhP}5#Ho{pk#$KH7lLm<v>pM!Zlwq_00*vW(7)RIJo958d z+sl{BgJikScs5!n30g28P5@G5My0n?d(NZ$1--r8SQKtQY@s?a%v$s82~q|jPX@(s zW<l}fHAYuSLZ89D<?pHYNZ$XFumD?R8|x8v=9t<isHpSpYv`af+^YhfcDXVGkvNlZ zHrpuXSSlZZ8A;E~*zPB}0<Ep<VFi{@*9jdaG?cfRuoc@#c{2**AEjl=)DbDB4oI(; zkbUSqi!yCQ;W)0=G#{FY%!n$N$9r`&8Y5)1$+nXuaLU+}=WB1*^czacPL^fdgx!&H z<(P7n_5`xD?CZjyFd%pcvLCQwTz=4pl|>4kACg$E6Ufw=wI4BB?0he{U>0|!t{%{c zRVLW+&~9W%QA4k?V+=qC&J8k>kHy_Z046xRf>i7u7yu>6{HuwUlMy1rcI;O2y-jsu zYYy%nAt(nGNw#RrO!+A6atEIs0`CW2<QVJ`N7$|OJaw9L<tU!USQWUJog<@9b{(iC z#ZMh@&ys$F7**`FhY?>)<8_FX41xG!H?oj{WMK^h<)Cz8_!OTkQXip5Q96MRPeaf+ z%n|f9RMfCofB>={*GJFqscVTG5-Xp?6wE@%xRXVx>_!en2gk<@2a}vQjpt?9w<QJP zVez0r?U4ty2ZO4EkP9FzVOc_WbS(SUskTVft4)`iCe4wigrg>A-zrC8EiPRih1G{v zEY_g7pW!?c2*`L6!YpI=LH0G$3-}btg%c^lC+Pt^D7@-(f5Pd$Ge<*xTZ-rlxbTvD zGEcQ3V|ebWF)n7`i6QzrUesNmBasM1+JPOZj%rU((MQE=bnHp0F?CZL?XnPHFH&s- z6%W%{#<-SKjV(UkM~#Ao(E;sYL}u`Zy^b2AP-(`<q#3L+RcP(k86)W>bj|-JO#3a| zjb*A(@RcOI4KZ&++}k+z;GD@jzJ99cwrR~>S3$y69&?pr1<S8Y<gbb4uZfy+XG`l7 zrK@A5tD`2kq!e=tqp>~AX9e;*vjanVW7CX%>x^mZ9aGUA+p5`|z(;1I*#cXjqLQ%( zXH0n?nrv5mktY+`6|wA!w|Bg=>#bdJd((`mdCrve;_igWA2a#Carm{zZktN^A`ql+ zhEcdsKPwecopl!@XIpVpic-Psg~;klnxfqzsx499&QtL_*iBl21;|B$YXJ|?lTOje z|BPDF$t;Swm|K!I5D0ChXPl#2k}m6~+7LbbG!?yc7Jq_tfoc@qC~1V>t8@m}CGFkN zMsjb&Ep!^kxX41H)kdO)j*B*kAeV?iAgUa%hyOj3agekl>EnL1pyQg)fS(1QC|yk2 z)v9!j8bYW(89aO9Y%>NQlX9@{bTjh=Y3@0Rq)^9(dPc~oFN<D;q35<2(5ui55bK79 zB#Bf|JQZD>9_EzAIC$Q`P||te9I~Y=U&BC=0VRQA(xcFw!=&hhe}#00JwZ84@*n9K zJ^nNm$Ei3<MIROYRD`G)pu$N#^)M9&sQ8F_o$@eAhfyTO-IAYvU2=P5GDM=~kLz?< z1hD65w~`7r4_m0#Mg^=)F-%l+P_Y9=($O<awu6H}$5aOzV|D3qI*FKk#2fVRklyF$ zre~@6Ar<GTxIo2UQ1N@LMh$+MY7r_fQ}GHFU!meU6+~A{2dVfURCH6ZpNd~o@kJ`W zL<PeaG{q${I?wbpyF$l^U*=e+ifV-Xr6H=lLB&NXo}prpicu;qQNa>m<x#IbPrENr z@gfy3QSllTwD?FD=#p>H?r%`>P1?OmwXak0ZQA|URQx9G7SnirjcTt_F;2xbDo#;R zNM|dkXriKliWVyBs8~tGE-F@0@pHOkKWa$_3HNrMz!EJ<6LfTd&L5@XY1;iQD#mE{ z1uDKwyI-bS4HaY5xUW&ImI}&tDLq7&Tth8sJ=}F*`~F9|l8)UEbnidVwWH&aF6l4n zni0C@M^s~K#un-evip<%105r?GnNlR8bN<2y~~Y(n8^=UCX+0m3E`Q%n2RmP=<&on zCtYB?F<oVHeVB2dQaPO_ZX#(_;QO0&h!A&%fzhY7&720=BE5mLXpS)a5wHtHkD_?b zkRzI~dWu;;73}OkuQ-1yxPB^lek!<sD&Pnz*hL-xy{z>8RKPX-2u@|QYdk*_f-tui z^L}b_&pV7_=^c~rBZna7&YLV^;a{8TVx~G|BpcgD2h0ANF1CneKQpZXyKl}<n1a)$ z;Kw$TXt*b!_{b@U)jt!;e=azpSq(G7iaS(knh}~=W#x>pidEE8bu&W!U85yo^u>(6 z@quY$@f}A1i6-NY4N=nutSnjXG3%_$JC+5(PgI~BtWm*(m>y9f2i)J7bJiOeb0Zy9 zRPe!(a?Hi|`T5jq*=6~~Q6X2pnB9Vp5M5)om$RSGo`=8ScJVI60dCJncC%=Jtjb?H z-b%5|qNV$OBK^mazZi-84&wDo7L#Zj?_R<e+u%-_Q<(6S$2{c;Pkqc&KbDP$x^u>| z7AyvF^@77J<}7$jC|sf#Sg;wy+y#dymM+*tu?R6uikhNA<Cr7z#DXPP^en7;M9eab zS(i>5OyY*|6ZDD=ORf@e)%ehofS;vpqC+g6bT0|`St=|POD4813HVvsD2ltqaqQ49 zIxepOU2-?8AhPb&Etj`UtWFfIh!w4fW;Kr4NZ?_cb-B^0tnlQFWg~pvm~+8m71uBL z9pV;<%km2sg>1AoD2m<Uf-N9==39k8aQwivC$2sb4Q`6(ZjK7xSsXcf?c~*y(efSf zKqtM^T~1GG#wQ;YE#lgFKg=q}Yzr0}zAs=9w~31mgSc)1#g>m9esQmOPoQ$Cxd1PU z=GQL?RQY)QV-~UIo<QZ&v(6l`b=<!s;OFDIeFo8YPoQ%Cs7WZSjtYS#OE!k&^b%TZ z`#3mg5S{k~Di=a#n`l`Gn8lR~9=o`9AwM8iEVP=?iUpTN+yKu~?0d4roW)|NSoLw~ zHlygcC$MrSfFpPO@WfLyLIbtFW+{*(mW(%2D@vB?iqN7{O9Fo8Hw&UCArwpt1v5g? zlEo!vkMCU)@N=(1@Rq$+Hs)Hg<cm4uZA$`vmezX3%8AWO0)Cbn`V8VeaeT#+z$*84 zndzmE!(@9pw_)nR8DagBrABNUZ(kDdvvfcVh~+fO_*rUoqB*z|Kle%n(H(hq>cDMb z6^-K7MZZaGT6E=$d&GNd(Y$ec!c#r%sgBmJ!!s8xqUZwj;kaeOIU`grTD)T3LW4)N zd|Z<)=HEj<<}U=ZMb|>mjsB~$iA8YR70d4x3Z|^cy77H8#tLAH@dpzA+G&67RPl^y z?au{w)Ki)8G*5e)Z{VTrKNnnRQtNG+{Yq`Y;ube8R8@$+g*{@KSh>(C)``W7hef+s zypZn@^U~i?I&nTx);e9*dSm~Lsq^PT;lzeS(W>d9RX2c3w%-v7qeab$q7BnU8*Xl$ z5gvqgUG&g*6-}(2#DUc`2_F|195!*k2v6m@hDE`QX^08AZoy^7mw7BG00dnk=DWim z@xEGkxo~`c++LNiH%!|b#w@CBIeA^%U`B4XzP#s!J>%YMC0{RznMxOPvz&&H1A@`^ zLiK!}Alg4J?l6e{djgdUyG%}T<;SHX7IDozfy$-9Y>()l02JY8sb-bvB~ZZ6{L>=R zJI&@)&3bF@SxvbHptuE>LtL{^Xb}&IOI}f2J+V7c+&W#{nkep?F7BeazIw^lB>Kkd z6W+RMZ(YLMHthwJ;m|^_XhrEai)9NQqgc1#bYMmn=3yY)Fq-oKnEWwYLdcsI@+NFk z?eF_<3p)uvWyAc%kbTEn@LK(XfXTCH#4f&Fv@8WIqHXfgB>_L^2Lnv(%f&Kwp4C2? z?;8*Wn-8jHG4H>a0&o=&^L`DlZd(qNXJYAWpyb8<w1$=b8c2a(S9sT7@ZvtYvhde% zTcv}dSO#PtH|5c#WuFf3!t!^k!E|V?aBHREutm7F-g($B{K)4$Tp`?EYd>r>eqa!( gv{(=47(eicRQj!l%ZwkCid0ru4>uV<XcSTYA0o-XNdN!< diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__init__.py deleted file mode 100644 index 5ebf595..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__init__.py +++ /dev/null @@ -1,566 +0,0 @@ -""" -Utilities for determining application-specific dirs. See <https://github.com/platformdirs/platformdirs> for details and -usage. -""" -from __future__ import annotations - -import os -import sys -from typing import TYPE_CHECKING - -from .api import PlatformDirsABC -from .version import __version__ -from .version import __version_tuple__ as __version_info__ - -if TYPE_CHECKING: - from pathlib import Path - - if sys.version_info >= (3, 8): # pragma: no cover (py38+) - from typing import Literal - else: # pragma: no cover (py38+) - from pip._vendor.typing_extensions import Literal - - -def _set_platform_dir_class() -> type[PlatformDirsABC]: - if sys.platform == "win32": - from pip._vendor.platformdirs.windows import Windows as Result - elif sys.platform == "darwin": - from pip._vendor.platformdirs.macos import MacOS as Result - else: - from pip._vendor.platformdirs.unix import Unix as Result - - if os.getenv("ANDROID_DATA") == "/data" and os.getenv("ANDROID_ROOT") == "/system": - if os.getenv("SHELL") or os.getenv("PREFIX"): - return Result - - from pip._vendor.platformdirs.android import _android_folder - - if _android_folder() is not None: - from pip._vendor.platformdirs.android import Android - - return Android # return to avoid redefinition of result - - return Result - - -PlatformDirs = _set_platform_dir_class() #: Currently active platform -AppDirs = PlatformDirs #: Backwards compatibility with appdirs - - -def user_data_dir( - appname: str | None = None, - appauthor: str | None | Literal[False] = None, - version: str | None = None, - roaming: bool = False, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 -) -> str: - """ - :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`. - :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`. - :param version: See `version <platformdirs.api.PlatformDirsABC.version>`. - :param roaming: See `roaming <platformdirs.api.PlatformDirsABC.roaming>`. - :param ensure_exists: See `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`. - :returns: data directory tied to the user - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - roaming=roaming, - ensure_exists=ensure_exists, - ).user_data_dir - - -def site_data_dir( - appname: str | None = None, - appauthor: str | None | Literal[False] = None, - version: str | None = None, - multipath: bool = False, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 -) -> str: - """ - :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`. - :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`. - :param version: See `version <platformdirs.api.PlatformDirsABC.version>`. - :param multipath: See `roaming <platformdirs.api.PlatformDirsABC.multipath>`. - :param ensure_exists: See `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`. - :returns: data directory shared by users - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - multipath=multipath, - ensure_exists=ensure_exists, - ).site_data_dir - - -def user_config_dir( - appname: str | None = None, - appauthor: str | None | Literal[False] = None, - version: str | None = None, - roaming: bool = False, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 -) -> str: - """ - :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`. - :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`. - :param version: See `version <platformdirs.api.PlatformDirsABC.version>`. - :param roaming: See `roaming <platformdirs.api.PlatformDirsABC.roaming>`. - :param ensure_exists: See `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`. - :returns: config directory tied to the user - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - roaming=roaming, - ensure_exists=ensure_exists, - ).user_config_dir - - -def site_config_dir( - appname: str | None = None, - appauthor: str | None | Literal[False] = None, - version: str | None = None, - multipath: bool = False, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 -) -> str: - """ - :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`. - :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`. - :param version: See `version <platformdirs.api.PlatformDirsABC.version>`. - :param multipath: See `roaming <platformdirs.api.PlatformDirsABC.multipath>`. - :param ensure_exists: See `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`. - :returns: config directory shared by the users - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - multipath=multipath, - ensure_exists=ensure_exists, - ).site_config_dir - - -def user_cache_dir( - appname: str | None = None, - appauthor: str | None | Literal[False] = None, - version: str | None = None, - opinion: bool = True, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 -) -> str: - """ - :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`. - :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`. - :param version: See `version <platformdirs.api.PlatformDirsABC.version>`. - :param opinion: See `roaming <platformdirs.api.PlatformDirsABC.opinion>`. - :param ensure_exists: See `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`. - :returns: cache directory tied to the user - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - opinion=opinion, - ensure_exists=ensure_exists, - ).user_cache_dir - - -def site_cache_dir( - appname: str | None = None, - appauthor: str | None | Literal[False] = None, - version: str | None = None, - opinion: bool = True, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 -) -> str: - """ - :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`. - :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`. - :param version: See `version <platformdirs.api.PlatformDirsABC.version>`. - :param opinion: See `opinion <platformdirs.api.PlatformDirsABC.opinion>`. - :param ensure_exists: See `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`. - :returns: cache directory tied to the user - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - opinion=opinion, - ensure_exists=ensure_exists, - ).site_cache_dir - - -def user_state_dir( - appname: str | None = None, - appauthor: str | None | Literal[False] = None, - version: str | None = None, - roaming: bool = False, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 -) -> str: - """ - :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`. - :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`. - :param version: See `version <platformdirs.api.PlatformDirsABC.version>`. - :param roaming: See `roaming <platformdirs.api.PlatformDirsABC.roaming>`. - :param ensure_exists: See `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`. - :returns: state directory tied to the user - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - roaming=roaming, - ensure_exists=ensure_exists, - ).user_state_dir - - -def user_log_dir( - appname: str | None = None, - appauthor: str | None | Literal[False] = None, - version: str | None = None, - opinion: bool = True, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 -) -> str: - """ - :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`. - :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`. - :param version: See `version <platformdirs.api.PlatformDirsABC.version>`. - :param opinion: See `roaming <platformdirs.api.PlatformDirsABC.opinion>`. - :param ensure_exists: See `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`. - :returns: log directory tied to the user - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - opinion=opinion, - ensure_exists=ensure_exists, - ).user_log_dir - - -def user_documents_dir() -> str: - """:returns: documents directory tied to the user""" - return PlatformDirs().user_documents_dir - - -def user_downloads_dir() -> str: - """:returns: downloads directory tied to the user""" - return PlatformDirs().user_downloads_dir - - -def user_pictures_dir() -> str: - """:returns: pictures directory tied to the user""" - return PlatformDirs().user_pictures_dir - - -def user_videos_dir() -> str: - """:returns: videos directory tied to the user""" - return PlatformDirs().user_videos_dir - - -def user_music_dir() -> str: - """:returns: music directory tied to the user""" - return PlatformDirs().user_music_dir - - -def user_runtime_dir( - appname: str | None = None, - appauthor: str | None | Literal[False] = None, - version: str | None = None, - opinion: bool = True, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 -) -> str: - """ - :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`. - :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`. - :param version: See `version <platformdirs.api.PlatformDirsABC.version>`. - :param opinion: See `opinion <platformdirs.api.PlatformDirsABC.opinion>`. - :param ensure_exists: See `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`. - :returns: runtime directory tied to the user - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - opinion=opinion, - ensure_exists=ensure_exists, - ).user_runtime_dir - - -def user_data_path( - appname: str | None = None, - appauthor: str | None | Literal[False] = None, - version: str | None = None, - roaming: bool = False, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 -) -> Path: - """ - :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`. - :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`. - :param version: See `version <platformdirs.api.PlatformDirsABC.version>`. - :param roaming: See `roaming <platformdirs.api.PlatformDirsABC.roaming>`. - :param ensure_exists: See `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`. - :returns: data path tied to the user - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - roaming=roaming, - ensure_exists=ensure_exists, - ).user_data_path - - -def site_data_path( - appname: str | None = None, - appauthor: str | None | Literal[False] = None, - version: str | None = None, - multipath: bool = False, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 -) -> Path: - """ - :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`. - :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`. - :param version: See `version <platformdirs.api.PlatformDirsABC.version>`. - :param multipath: See `multipath <platformdirs.api.PlatformDirsABC.multipath>`. - :param ensure_exists: See `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`. - :returns: data path shared by users - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - multipath=multipath, - ensure_exists=ensure_exists, - ).site_data_path - - -def user_config_path( - appname: str | None = None, - appauthor: str | None | Literal[False] = None, - version: str | None = None, - roaming: bool = False, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 -) -> Path: - """ - :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`. - :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`. - :param version: See `version <platformdirs.api.PlatformDirsABC.version>`. - :param roaming: See `roaming <platformdirs.api.PlatformDirsABC.roaming>`. - :param ensure_exists: See `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`. - :returns: config path tied to the user - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - roaming=roaming, - ensure_exists=ensure_exists, - ).user_config_path - - -def site_config_path( - appname: str | None = None, - appauthor: str | None | Literal[False] = None, - version: str | None = None, - multipath: bool = False, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 -) -> Path: - """ - :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`. - :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`. - :param version: See `version <platformdirs.api.PlatformDirsABC.version>`. - :param multipath: See `roaming <platformdirs.api.PlatformDirsABC.multipath>`. - :param ensure_exists: See `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`. - :returns: config path shared by the users - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - multipath=multipath, - ensure_exists=ensure_exists, - ).site_config_path - - -def site_cache_path( - appname: str | None = None, - appauthor: str | None | Literal[False] = None, - version: str | None = None, - opinion: bool = True, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 -) -> Path: - """ - :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`. - :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`. - :param version: See `version <platformdirs.api.PlatformDirsABC.version>`. - :param opinion: See `opinion <platformdirs.api.PlatformDirsABC.opinion>`. - :param ensure_exists: See `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`. - :returns: cache directory tied to the user - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - opinion=opinion, - ensure_exists=ensure_exists, - ).site_cache_path - - -def user_cache_path( - appname: str | None = None, - appauthor: str | None | Literal[False] = None, - version: str | None = None, - opinion: bool = True, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 -) -> Path: - """ - :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`. - :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`. - :param version: See `version <platformdirs.api.PlatformDirsABC.version>`. - :param opinion: See `roaming <platformdirs.api.PlatformDirsABC.opinion>`. - :param ensure_exists: See `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`. - :returns: cache path tied to the user - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - opinion=opinion, - ensure_exists=ensure_exists, - ).user_cache_path - - -def user_state_path( - appname: str | None = None, - appauthor: str | None | Literal[False] = None, - version: str | None = None, - roaming: bool = False, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 -) -> Path: - """ - :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`. - :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`. - :param version: See `version <platformdirs.api.PlatformDirsABC.version>`. - :param roaming: See `roaming <platformdirs.api.PlatformDirsABC.roaming>`. - :param ensure_exists: See `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`. - :returns: state path tied to the user - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - roaming=roaming, - ensure_exists=ensure_exists, - ).user_state_path - - -def user_log_path( - appname: str | None = None, - appauthor: str | None | Literal[False] = None, - version: str | None = None, - opinion: bool = True, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 -) -> Path: - """ - :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`. - :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`. - :param version: See `version <platformdirs.api.PlatformDirsABC.version>`. - :param opinion: See `roaming <platformdirs.api.PlatformDirsABC.opinion>`. - :param ensure_exists: See `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`. - :returns: log path tied to the user - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - opinion=opinion, - ensure_exists=ensure_exists, - ).user_log_path - - -def user_documents_path() -> Path: - """:returns: documents path tied to the user""" - return PlatformDirs().user_documents_path - - -def user_downloads_path() -> Path: - """:returns: downloads path tied to the user""" - return PlatformDirs().user_downloads_path - - -def user_pictures_path() -> Path: - """:returns: pictures path tied to the user""" - return PlatformDirs().user_pictures_path - - -def user_videos_path() -> Path: - """:returns: videos path tied to the user""" - return PlatformDirs().user_videos_path - - -def user_music_path() -> Path: - """:returns: music path tied to the user""" - return PlatformDirs().user_music_path - - -def user_runtime_path( - appname: str | None = None, - appauthor: str | None | Literal[False] = None, - version: str | None = None, - opinion: bool = True, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 -) -> Path: - """ - :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`. - :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`. - :param version: See `version <platformdirs.api.PlatformDirsABC.version>`. - :param opinion: See `opinion <platformdirs.api.PlatformDirsABC.opinion>`. - :param ensure_exists: See `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`. - :returns: runtime path tied to the user - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - opinion=opinion, - ensure_exists=ensure_exists, - ).user_runtime_path - - -__all__ = [ - "__version__", - "__version_info__", - "PlatformDirs", - "AppDirs", - "PlatformDirsABC", - "user_data_dir", - "user_config_dir", - "user_cache_dir", - "user_state_dir", - "user_log_dir", - "user_documents_dir", - "user_downloads_dir", - "user_pictures_dir", - "user_videos_dir", - "user_music_dir", - "user_runtime_dir", - "site_data_dir", - "site_config_dir", - "site_cache_dir", - "user_data_path", - "user_config_path", - "user_cache_path", - "user_state_path", - "user_log_path", - "user_documents_path", - "user_downloads_path", - "user_pictures_path", - "user_videos_path", - "user_music_path", - "user_runtime_path", - "site_data_path", - "site_config_path", - "site_cache_path", -] diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__main__.py b/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__main__.py deleted file mode 100644 index 6a0d6dd..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__main__.py +++ /dev/null @@ -1,53 +0,0 @@ -"""Main entry point.""" -from __future__ import annotations - -from pip._vendor.platformdirs import PlatformDirs, __version__ - -PROPS = ( - "user_data_dir", - "user_config_dir", - "user_cache_dir", - "user_state_dir", - "user_log_dir", - "user_documents_dir", - "user_downloads_dir", - "user_pictures_dir", - "user_videos_dir", - "user_music_dir", - "user_runtime_dir", - "site_data_dir", - "site_config_dir", - "site_cache_dir", -) - - -def main() -> None: - """Run main entry point.""" - app_name = "MyApp" - app_author = "MyCompany" - - print(f"-- platformdirs {__version__} --") # noqa: T201 - - print("-- app dirs (with optional 'version')") # noqa: T201 - dirs = PlatformDirs(app_name, app_author, version="1.0") - for prop in PROPS: - print(f"{prop}: {getattr(dirs, prop)}") # noqa: T201 - - print("\n-- app dirs (without optional 'version')") # noqa: T201 - dirs = PlatformDirs(app_name, app_author) - for prop in PROPS: - print(f"{prop}: {getattr(dirs, prop)}") # noqa: T201 - - print("\n-- app dirs (without optional 'appauthor')") # noqa: T201 - dirs = PlatformDirs(app_name) - for prop in PROPS: - print(f"{prop}: {getattr(dirs, prop)}") # noqa: T201 - - print("\n-- app dirs (with disabled 'appauthor')") # noqa: T201 - dirs = PlatformDirs(app_name, appauthor=False) - for prop in PROPS: - print(f"{prop}: {getattr(dirs, prop)}") # noqa: T201 - - -if __name__ == "__main__": - main() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 0d6ac29fa7482a01fd083fc79017f7c8c586e769..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18050 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-312.pyc deleted file mode 100644 index f96d66923f501991416559fdfa139b47699ffc8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1967 zcmcIl-D@0G6u&cbXLt51AKEra2{J88vewy2BGxLUAjTqv#8BT><TBa0$qtz>?#yi6 zbp!jL&<7v#W}#K`SV<rJBYg8^F)P?1f}kM2MdMSSJa=Zc4z{8ca$)b>^P6+d@7#0d zoc*>|D<fE~FF$U7BO~-P7sg9W55ma}IDC#w)I_FWinid0O;O-y$(9`4#E#sQLB`F3 zshIL7xLKr%S=d=bh$$kX#e>YFfV#zQv0my;uNjuBQa5B>)%PqnZ2ZPm>Ox#GT-OVY z(DK}%F2>aj+X%Nj=B!#Qh%1D2C=1{nA@zy476p_M(+CY>S}dMS#Fpo7S=$LPkpf1m zO>=Sp-cz}nytlnn`?=Jc*NPknEJ!TI*e%!g3^T>16FuK*g%P7ElrncLlX@wTGCNUV zwGuy5i4BX~&~j4lT43=g9><=D`Pfrn9D6IvVDc!zE+HhGoP!EMU4&g^in~H6jFn6& z%xZ_wU8u_!(n0o4KshZrheGYs)kl57EIcS400UpUVpvE|2(6+I=K+!a_R*KXzY_9@ zlGPXc(m}?37v*_BdjaRUOaI0_wmv1^^3!?8=qa&Q#{MDyxlEhY2es3<Z+D_T**kkP za#iP_eHP1W-M4%{F0FOn_8i}EyS*t*Q~j*XppOEzC#jm&dkJ8}_tgYiyk&)L)$@5@ z8n(KSwc$d&CoMOYpl^#A(i7iQd-d`Ywq6uI)%?<bsX_=w6t+DET#HXCLwJF)X;V{O z$Z1}Oh)R#;^|~C(K7%pCc=8#BEtWTKzPIsyT->HG4?<SQu>uCfH5?k3`6*?MF~5I| zedhTAH&kIg`bckk4%Hna3_AMicx31ywdpo994!c~)(&Nw>7|o{GQC6Hj&56<y5EJ{ zxUV*rS9IRvns2mrjBOg|zUAvM-(1sUdcGbyA-s%)H2iLi`H@|KKxW|=sL<B~^wZ?I z!Mi_9&kt_=f=k2d{JjtEtlfWpSk^|k!IARv2(KJfX6`8aFMmx(m8*l*qp7ohAVFTb zjgOSt-kH6^-sZiT{WJUF;oK|3S#3Dc_+HVECD8b@faLP9e0hXl&s-c<v}bT|WrW{I z92{0IJcIdbBYZhAzyHptvhqJ2{LU|M0*OMgGS1>U{H+uih3W0ac-?bpy%ZM-F})Tc zahZ^<h!1u`7$1P~EL5eDRi%-yO7az@-_v<eOiIE@_y<JDSBPEYs0!O7<*MVEkxj3$ zOCa(|95i5q><Yp|H1i|6_$#`0j3-OtKt6eKPFOm=f^hYA?>lMkAyz)Uek>t;KJoV# Dmr4wV diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-312.pyc deleted file mode 100644 index 9c84ba02718a87732bba317fb5f3f96e5dfbd661..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9465 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-312.pyc deleted file mode 100644 index 9627be67bd51e8dc61d8230bcdbad0156eeae0ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9693 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 Vn?3Y#<YbVUyq^Cr!8^?q{{!ka$>jh5 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-312.pyc deleted file mode 100644 index 6efbf89d89aa6834b41653695b92a633bfb75012..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5658 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 Z{^`auflm(Z7KHNLL9sAf_+ypp`!^=fbF}~f diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-312.pyc deleted file mode 100644 index 028fa3fe66f8bdcee88e7a27912cdddbd488ce30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12462 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 T8<#s6Z|ySA)pGCp>9GF;GdO}+ diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-312.pyc deleted file mode 100644 index 3a869964194c7e0ba782a502542df422232680ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 332 zcmYLFyH3L}6tx>36(vI@79=DXSTZD5>B4}RSm6V*L?$+gRVTJ=Cnc~jvNEwDR=$O$ zBg)Futx~s6+*GZ&vd%g8Ve9yQ`~CrfNI#zQPvGA!*+y?8mPa7o5krqSMlog>xEFg( zFYumr$I)dp3cR@oGxL527~n40X$MJCb7O@nlce3>$aeT&b(NMJdj587UHC#vcmS=Y zBv%C|1$DM2H!7_PUOG!0mpn7H2(1(8gqx75X(<(D+>n}=HId?;=*H!$97m%IVuj<O zrs;%c+!8G`0aqnchG<FMgE9pZ#=_OL(?~a~{#Bt^CHb{E1RvdR><Pfa!x%62(DB&} UoxTiSv!C;DhTsg}ZcVquKd@_L;s5{u diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc deleted file mode 100644 index b36e85300039b047bcfe974f02a8899d1fbc214e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13020 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 OU9?)tE!UlNLjMcVM1-*b diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/android.py b/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/android.py deleted file mode 100644 index 76527dd..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/android.py +++ /dev/null @@ -1,210 +0,0 @@ -"""Android.""" -from __future__ import annotations - -import os -import re -import sys -from functools import lru_cache -from typing import cast - -from .api import PlatformDirsABC - - -class Android(PlatformDirsABC): - """ - Follows the guidance `from here <https://android.stackexchange.com/a/216132>`_. Makes use of the - `appname <platformdirs.api.PlatformDirsABC.appname>`, - `version <platformdirs.api.PlatformDirsABC.version>`, - `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`. - """ - - @property - def user_data_dir(self) -> str: - """:return: data directory tied to the user, e.g. ``/data/user/<userid>/<packagename>/files/<AppName>``""" - return self._append_app_name_and_version(cast(str, _android_folder()), "files") - - @property - def site_data_dir(self) -> str: - """:return: data directory shared by users, same as `user_data_dir`""" - return self.user_data_dir - - @property - def user_config_dir(self) -> str: - """ - :return: config directory tied to the user, e.g. \ - ``/data/user/<userid>/<packagename>/shared_prefs/<AppName>`` - """ - return self._append_app_name_and_version(cast(str, _android_folder()), "shared_prefs") - - @property - def site_config_dir(self) -> str: - """:return: config directory shared by the users, same as `user_config_dir`""" - return self.user_config_dir - - @property - def user_cache_dir(self) -> str: - """:return: cache directory tied to the user, e.g. e.g. ``/data/user/<userid>/<packagename>/cache/<AppName>``""" - return self._append_app_name_and_version(cast(str, _android_folder()), "cache") - - @property - def site_cache_dir(self) -> str: - """:return: cache directory shared by users, same as `user_cache_dir`""" - return self.user_cache_dir - - @property - def user_state_dir(self) -> str: - """:return: state directory tied to the user, same as `user_data_dir`""" - return self.user_data_dir - - @property - def user_log_dir(self) -> str: - """ - :return: log directory tied to the user, same as `user_cache_dir` if not opinionated else ``log`` in it, - e.g. ``/data/user/<userid>/<packagename>/cache/<AppName>/log`` - """ - path = self.user_cache_dir - if self.opinion: - path = os.path.join(path, "log") # noqa: PTH118 - return path - - @property - def user_documents_dir(self) -> str: - """:return: documents directory tied to the user e.g. ``/storage/emulated/0/Documents``""" - return _android_documents_folder() - - @property - def user_downloads_dir(self) -> str: - """:return: downloads directory tied to the user e.g. ``/storage/emulated/0/Downloads``""" - return _android_downloads_folder() - - @property - def user_pictures_dir(self) -> str: - """:return: pictures directory tied to the user e.g. ``/storage/emulated/0/Pictures``""" - return _android_pictures_folder() - - @property - def user_videos_dir(self) -> str: - """:return: videos directory tied to the user e.g. ``/storage/emulated/0/DCIM/Camera``""" - return _android_videos_folder() - - @property - def user_music_dir(self) -> str: - """:return: music directory tied to the user e.g. ``/storage/emulated/0/Music``""" - return _android_music_folder() - - @property - def user_runtime_dir(self) -> str: - """ - :return: runtime directory tied to the user, same as `user_cache_dir` if not opinionated else ``tmp`` in it, - e.g. ``/data/user/<userid>/<packagename>/cache/<AppName>/tmp`` - """ - path = self.user_cache_dir - if self.opinion: - path = os.path.join(path, "tmp") # noqa: PTH118 - return path - - -@lru_cache(maxsize=1) -def _android_folder() -> str | None: - """:return: base folder for the Android OS or None if it cannot be found""" - try: - # First try to get path to android app via pyjnius - from jnius import autoclass - - context = autoclass("android.content.Context") - result: str | None = context.getFilesDir().getParentFile().getAbsolutePath() - except Exception: # noqa: BLE001 - # if fails find an android folder looking path on the sys.path - pattern = re.compile(r"/data/(data|user/\d+)/(.+)/files") - for path in sys.path: - if pattern.match(path): - result = path.split("/files")[0] - break - else: - result = None - return result - - -@lru_cache(maxsize=1) -def _android_documents_folder() -> str: - """:return: documents folder for the Android OS""" - # Get directories with pyjnius - try: - from jnius import autoclass - - context = autoclass("android.content.Context") - environment = autoclass("android.os.Environment") - documents_dir: str = context.getExternalFilesDir(environment.DIRECTORY_DOCUMENTS).getAbsolutePath() - except Exception: # noqa: BLE001 - documents_dir = "/storage/emulated/0/Documents" - - return documents_dir - - -@lru_cache(maxsize=1) -def _android_downloads_folder() -> str: - """:return: downloads folder for the Android OS""" - # Get directories with pyjnius - try: - from jnius import autoclass - - context = autoclass("android.content.Context") - environment = autoclass("android.os.Environment") - downloads_dir: str = context.getExternalFilesDir(environment.DIRECTORY_DOWNLOADS).getAbsolutePath() - except Exception: # noqa: BLE001 - downloads_dir = "/storage/emulated/0/Downloads" - - return downloads_dir - - -@lru_cache(maxsize=1) -def _android_pictures_folder() -> str: - """:return: pictures folder for the Android OS""" - # Get directories with pyjnius - try: - from jnius import autoclass - - context = autoclass("android.content.Context") - environment = autoclass("android.os.Environment") - pictures_dir: str = context.getExternalFilesDir(environment.DIRECTORY_PICTURES).getAbsolutePath() - except Exception: # noqa: BLE001 - pictures_dir = "/storage/emulated/0/Pictures" - - return pictures_dir - - -@lru_cache(maxsize=1) -def _android_videos_folder() -> str: - """:return: videos folder for the Android OS""" - # Get directories with pyjnius - try: - from jnius import autoclass - - context = autoclass("android.content.Context") - environment = autoclass("android.os.Environment") - videos_dir: str = context.getExternalFilesDir(environment.DIRECTORY_DCIM).getAbsolutePath() - except Exception: # noqa: BLE001 - videos_dir = "/storage/emulated/0/DCIM/Camera" - - return videos_dir - - -@lru_cache(maxsize=1) -def _android_music_folder() -> str: - """:return: music folder for the Android OS""" - # Get directories with pyjnius - try: - from jnius import autoclass - - context = autoclass("android.content.Context") - environment = autoclass("android.os.Environment") - music_dir: str = context.getExternalFilesDir(environment.DIRECTORY_MUSIC).getAbsolutePath() - except Exception: # noqa: BLE001 - music_dir = "/storage/emulated/0/Music" - - return music_dir - - -__all__ = [ - "Android", -] diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/api.py b/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/api.py deleted file mode 100644 index d64ebb9..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/api.py +++ /dev/null @@ -1,223 +0,0 @@ -"""Base API.""" -from __future__ import annotations - -import os -from abc import ABC, abstractmethod -from pathlib import Path -from typing import TYPE_CHECKING - -if TYPE_CHECKING: - import sys - - if sys.version_info >= (3, 8): # pragma: no cover (py38+) - from typing import Literal - else: # pragma: no cover (py38+) - from pip._vendor.typing_extensions import Literal - - -class PlatformDirsABC(ABC): - """Abstract base class for platform directories.""" - - def __init__( # noqa: PLR0913 - self, - appname: str | None = None, - appauthor: str | None | Literal[False] = None, - version: str | None = None, - roaming: bool = False, # noqa: FBT001, FBT002 - multipath: bool = False, # noqa: FBT001, FBT002 - opinion: bool = True, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 - ) -> None: - """ - Create a new platform directory. - - :param appname: See `appname`. - :param appauthor: See `appauthor`. - :param version: See `version`. - :param roaming: See `roaming`. - :param multipath: See `multipath`. - :param opinion: See `opinion`. - :param ensure_exists: See `ensure_exists`. - """ - self.appname = appname #: The name of application. - self.appauthor = appauthor - """ - The name of the app author or distributing body for this application. Typically, it is the owning company name. - Defaults to `appname`. You may pass ``False`` to disable it. - """ - self.version = version - """ - An optional version path element to append to the path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this would typically be ``<major>.<minor>``. - """ - self.roaming = roaming - """ - Whether to use the roaming appdata directory on Windows. That means that for users on a Windows network setup - for roaming profiles, this user data will be synced on login (see - `here <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx>`_). - """ - self.multipath = multipath - """ - An optional parameter only applicable to Unix/Linux which indicates that the entire list of data dirs should be - returned. By default, the first item would only be returned. - """ - self.opinion = opinion #: A flag to indicating to use opinionated values. - self.ensure_exists = ensure_exists - """ - Optionally create the directory (and any missing parents) upon access if it does not exist. - By default, no directories are created. - """ - - def _append_app_name_and_version(self, *base: str) -> str: - params = list(base[1:]) - if self.appname: - params.append(self.appname) - if self.version: - params.append(self.version) - path = os.path.join(base[0], *params) # noqa: PTH118 - self._optionally_create_directory(path) - return path - - def _optionally_create_directory(self, path: str) -> None: - if self.ensure_exists: - Path(path).mkdir(parents=True, exist_ok=True) - - @property - @abstractmethod - def user_data_dir(self) -> str: - """:return: data directory tied to the user""" - - @property - @abstractmethod - def site_data_dir(self) -> str: - """:return: data directory shared by users""" - - @property - @abstractmethod - def user_config_dir(self) -> str: - """:return: config directory tied to the user""" - - @property - @abstractmethod - def site_config_dir(self) -> str: - """:return: config directory shared by the users""" - - @property - @abstractmethod - def user_cache_dir(self) -> str: - """:return: cache directory tied to the user""" - - @property - @abstractmethod - def site_cache_dir(self) -> str: - """:return: cache directory shared by users""" - - @property - @abstractmethod - def user_state_dir(self) -> str: - """:return: state directory tied to the user""" - - @property - @abstractmethod - def user_log_dir(self) -> str: - """:return: log directory tied to the user""" - - @property - @abstractmethod - def user_documents_dir(self) -> str: - """:return: documents directory tied to the user""" - - @property - @abstractmethod - def user_downloads_dir(self) -> str: - """:return: downloads directory tied to the user""" - - @property - @abstractmethod - def user_pictures_dir(self) -> str: - """:return: pictures directory tied to the user""" - - @property - @abstractmethod - def user_videos_dir(self) -> str: - """:return: videos directory tied to the user""" - - @property - @abstractmethod - def user_music_dir(self) -> str: - """:return: music directory tied to the user""" - - @property - @abstractmethod - def user_runtime_dir(self) -> str: - """:return: runtime directory tied to the user""" - - @property - def user_data_path(self) -> Path: - """:return: data path tied to the user""" - return Path(self.user_data_dir) - - @property - def site_data_path(self) -> Path: - """:return: data path shared by users""" - return Path(self.site_data_dir) - - @property - def user_config_path(self) -> Path: - """:return: config path tied to the user""" - return Path(self.user_config_dir) - - @property - def site_config_path(self) -> Path: - """:return: config path shared by the users""" - return Path(self.site_config_dir) - - @property - def user_cache_path(self) -> Path: - """:return: cache path tied to the user""" - return Path(self.user_cache_dir) - - @property - def site_cache_path(self) -> Path: - """:return: cache path shared by users""" - return Path(self.site_cache_dir) - - @property - def user_state_path(self) -> Path: - """:return: state path tied to the user""" - return Path(self.user_state_dir) - - @property - def user_log_path(self) -> Path: - """:return: log path tied to the user""" - return Path(self.user_log_dir) - - @property - def user_documents_path(self) -> Path: - """:return: documents path tied to the user""" - return Path(self.user_documents_dir) - - @property - def user_downloads_path(self) -> Path: - """:return: downloads path tied to the user""" - return Path(self.user_downloads_dir) - - @property - def user_pictures_path(self) -> Path: - """:return: pictures path tied to the user""" - return Path(self.user_pictures_dir) - - @property - def user_videos_path(self) -> Path: - """:return: videos path tied to the user""" - return Path(self.user_videos_dir) - - @property - def user_music_path(self) -> Path: - """:return: music path tied to the user""" - return Path(self.user_music_dir) - - @property - def user_runtime_path(self) -> Path: - """:return: runtime path tied to the user""" - return Path(self.user_runtime_dir) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/macos.py b/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/macos.py deleted file mode 100644 index a753e2a..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/macos.py +++ /dev/null @@ -1,91 +0,0 @@ -"""macOS.""" -from __future__ import annotations - -import os.path - -from .api import PlatformDirsABC - - -class MacOS(PlatformDirsABC): - """ - Platform directories for the macOS operating system. Follows the guidance from `Apple documentation - <https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/MacOSXDirectories/MacOSXDirectories.html>`_. - Makes use of the `appname <platformdirs.api.PlatformDirsABC.appname>`, - `version <platformdirs.api.PlatformDirsABC.version>`, - `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`. - """ - - @property - def user_data_dir(self) -> str: - """:return: data directory tied to the user, e.g. ``~/Library/Application Support/$appname/$version``""" - return self._append_app_name_and_version(os.path.expanduser("~/Library/Application Support")) # noqa: PTH111 - - @property - def site_data_dir(self) -> str: - """:return: data directory shared by users, e.g. ``/Library/Application Support/$appname/$version``""" - return self._append_app_name_and_version("/Library/Application Support") - - @property - def user_config_dir(self) -> str: - """:return: config directory tied to the user, same as `user_data_dir`""" - return self.user_data_dir - - @property - def site_config_dir(self) -> str: - """:return: config directory shared by the users, same as `site_data_dir`""" - return self.site_data_dir - - @property - def user_cache_dir(self) -> str: - """:return: cache directory tied to the user, e.g. ``~/Library/Caches/$appname/$version``""" - return self._append_app_name_and_version(os.path.expanduser("~/Library/Caches")) # noqa: PTH111 - - @property - def site_cache_dir(self) -> str: - """:return: cache directory shared by users, e.g. ``/Library/Caches/$appname/$version``""" - return self._append_app_name_and_version("/Library/Caches") - - @property - def user_state_dir(self) -> str: - """:return: state directory tied to the user, same as `user_data_dir`""" - return self.user_data_dir - - @property - def user_log_dir(self) -> str: - """:return: log directory tied to the user, e.g. ``~/Library/Logs/$appname/$version``""" - return self._append_app_name_and_version(os.path.expanduser("~/Library/Logs")) # noqa: PTH111 - - @property - def user_documents_dir(self) -> str: - """:return: documents directory tied to the user, e.g. ``~/Documents``""" - return os.path.expanduser("~/Documents") # noqa: PTH111 - - @property - def user_downloads_dir(self) -> str: - """:return: downloads directory tied to the user, e.g. ``~/Downloads``""" - return os.path.expanduser("~/Downloads") # noqa: PTH111 - - @property - def user_pictures_dir(self) -> str: - """:return: pictures directory tied to the user, e.g. ``~/Pictures``""" - return os.path.expanduser("~/Pictures") # noqa: PTH111 - - @property - def user_videos_dir(self) -> str: - """:return: videos directory tied to the user, e.g. ``~/Movies``""" - return os.path.expanduser("~/Movies") # noqa: PTH111 - - @property - def user_music_dir(self) -> str: - """:return: music directory tied to the user, e.g. ``~/Music``""" - return os.path.expanduser("~/Music") # noqa: PTH111 - - @property - def user_runtime_dir(self) -> str: - """:return: runtime directory tied to the user, e.g. ``~/Library/Caches/TemporaryItems/$appname/$version``""" - return self._append_app_name_and_version(os.path.expanduser("~/Library/Caches/TemporaryItems")) # noqa: PTH111 - - -__all__ = [ - "MacOS", -] diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py b/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py deleted file mode 100644 index 468b0ab..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py +++ /dev/null @@ -1,223 +0,0 @@ -"""Unix.""" -from __future__ import annotations - -import os -import sys -from configparser import ConfigParser -from pathlib import Path - -from .api import PlatformDirsABC - -if sys.platform == "win32": - - def getuid() -> int: - msg = "should only be used on Unix" - raise RuntimeError(msg) - -else: - from os import getuid - - -class Unix(PlatformDirsABC): - """ - On Unix/Linux, we follow the - `XDG Basedir Spec <https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html>`_. The spec allows - overriding directories with environment variables. The examples show are the default values, alongside the name of - the environment variable that overrides them. Makes use of the - `appname <platformdirs.api.PlatformDirsABC.appname>`, - `version <platformdirs.api.PlatformDirsABC.version>`, - `multipath <platformdirs.api.PlatformDirsABC.multipath>`, - `opinion <platformdirs.api.PlatformDirsABC.opinion>`, - `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`. - """ - - @property - def user_data_dir(self) -> str: - """ - :return: data directory tied to the user, e.g. ``~/.local/share/$appname/$version`` or - ``$XDG_DATA_HOME/$appname/$version`` - """ - path = os.environ.get("XDG_DATA_HOME", "") - if not path.strip(): - path = os.path.expanduser("~/.local/share") # noqa: PTH111 - return self._append_app_name_and_version(path) - - @property - def site_data_dir(self) -> str: - """ - :return: data directories shared by users (if `multipath <platformdirs.api.PlatformDirsABC.multipath>` is - enabled and ``XDG_DATA_DIR`` is set and a multi path the response is also a multi path separated by the OS - path separator), e.g. ``/usr/local/share/$appname/$version`` or ``/usr/share/$appname/$version`` - """ - # XDG default for $XDG_DATA_DIRS; only first, if multipath is False - path = os.environ.get("XDG_DATA_DIRS", "") - if not path.strip(): - path = f"/usr/local/share{os.pathsep}/usr/share" - return self._with_multi_path(path) - - def _with_multi_path(self, path: str) -> str: - path_list = path.split(os.pathsep) - if not self.multipath: - path_list = path_list[0:1] - path_list = [self._append_app_name_and_version(os.path.expanduser(p)) for p in path_list] # noqa: PTH111 - return os.pathsep.join(path_list) - - @property - def user_config_dir(self) -> str: - """ - :return: config directory tied to the user, e.g. ``~/.config/$appname/$version`` or - ``$XDG_CONFIG_HOME/$appname/$version`` - """ - path = os.environ.get("XDG_CONFIG_HOME", "") - if not path.strip(): - path = os.path.expanduser("~/.config") # noqa: PTH111 - return self._append_app_name_and_version(path) - - @property - def site_config_dir(self) -> str: - """ - :return: config directories shared by users (if `multipath <platformdirs.api.PlatformDirsABC.multipath>` - is enabled and ``XDG_DATA_DIR`` is set and a multi path the response is also a multi path separated by the OS - path separator), e.g. ``/etc/xdg/$appname/$version`` - """ - # XDG default for $XDG_CONFIG_DIRS only first, if multipath is False - path = os.environ.get("XDG_CONFIG_DIRS", "") - if not path.strip(): - path = "/etc/xdg" - return self._with_multi_path(path) - - @property - def user_cache_dir(self) -> str: - """ - :return: cache directory tied to the user, e.g. ``~/.cache/$appname/$version`` or - ``~/$XDG_CACHE_HOME/$appname/$version`` - """ - path = os.environ.get("XDG_CACHE_HOME", "") - if not path.strip(): - path = os.path.expanduser("~/.cache") # noqa: PTH111 - return self._append_app_name_and_version(path) - - @property - def site_cache_dir(self) -> str: - """:return: cache directory shared by users, e.g. ``/var/tmp/$appname/$version``""" - return self._append_app_name_and_version("/var/tmp") # noqa: S108 - - @property - def user_state_dir(self) -> str: - """ - :return: state directory tied to the user, e.g. ``~/.local/state/$appname/$version`` or - ``$XDG_STATE_HOME/$appname/$version`` - """ - path = os.environ.get("XDG_STATE_HOME", "") - if not path.strip(): - path = os.path.expanduser("~/.local/state") # noqa: PTH111 - return self._append_app_name_and_version(path) - - @property - def user_log_dir(self) -> str: - """:return: log directory tied to the user, same as `user_state_dir` if not opinionated else ``log`` in it""" - path = self.user_state_dir - if self.opinion: - path = os.path.join(path, "log") # noqa: PTH118 - return path - - @property - def user_documents_dir(self) -> str: - """:return: documents directory tied to the user, e.g. ``~/Documents``""" - return _get_user_media_dir("XDG_DOCUMENTS_DIR", "~/Documents") - - @property - def user_downloads_dir(self) -> str: - """:return: downloads directory tied to the user, e.g. ``~/Downloads``""" - return _get_user_media_dir("XDG_DOWNLOAD_DIR", "~/Downloads") - - @property - def user_pictures_dir(self) -> str: - """:return: pictures directory tied to the user, e.g. ``~/Pictures``""" - return _get_user_media_dir("XDG_PICTURES_DIR", "~/Pictures") - - @property - def user_videos_dir(self) -> str: - """:return: videos directory tied to the user, e.g. ``~/Videos``""" - return _get_user_media_dir("XDG_VIDEOS_DIR", "~/Videos") - - @property - def user_music_dir(self) -> str: - """:return: music directory tied to the user, e.g. ``~/Music``""" - return _get_user_media_dir("XDG_MUSIC_DIR", "~/Music") - - @property - def user_runtime_dir(self) -> str: - """ - :return: runtime directory tied to the user, e.g. ``/run/user/$(id -u)/$appname/$version`` or - ``$XDG_RUNTIME_DIR/$appname/$version``. - - For FreeBSD/OpenBSD/NetBSD, it would return ``/var/run/user/$(id -u)/$appname/$version`` if - exists, otherwise ``/tmp/runtime-$(id -u)/$appname/$version``, if``$XDG_RUNTIME_DIR`` - is not set. - """ - path = os.environ.get("XDG_RUNTIME_DIR", "") - if not path.strip(): - if sys.platform.startswith(("freebsd", "openbsd", "netbsd")): - path = f"/var/run/user/{getuid()}" - if not Path(path).exists(): - path = f"/tmp/runtime-{getuid()}" # noqa: S108 - else: - path = f"/run/user/{getuid()}" - return self._append_app_name_and_version(path) - - @property - def site_data_path(self) -> Path: - """:return: data path shared by users. Only return first item, even if ``multipath`` is set to ``True``""" - return self._first_item_as_path_if_multipath(self.site_data_dir) - - @property - def site_config_path(self) -> Path: - """:return: config path shared by the users. Only return first item, even if ``multipath`` is set to ``True``""" - return self._first_item_as_path_if_multipath(self.site_config_dir) - - @property - def site_cache_path(self) -> Path: - """:return: cache path shared by users. Only return first item, even if ``multipath`` is set to ``True``""" - return self._first_item_as_path_if_multipath(self.site_cache_dir) - - def _first_item_as_path_if_multipath(self, directory: str) -> Path: - if self.multipath: - # If multipath is True, the first path is returned. - directory = directory.split(os.pathsep)[0] - return Path(directory) - - -def _get_user_media_dir(env_var: str, fallback_tilde_path: str) -> str: - media_dir = _get_user_dirs_folder(env_var) - if media_dir is None: - media_dir = os.environ.get(env_var, "").strip() - if not media_dir: - media_dir = os.path.expanduser(fallback_tilde_path) # noqa: PTH111 - - return media_dir - - -def _get_user_dirs_folder(key: str) -> str | None: - """Return directory from user-dirs.dirs config file. See https://freedesktop.org/wiki/Software/xdg-user-dirs/.""" - user_dirs_config_path = Path(Unix().user_config_dir) / "user-dirs.dirs" - if user_dirs_config_path.exists(): - parser = ConfigParser() - - with user_dirs_config_path.open() as stream: - # Add fake section header, so ConfigParser doesn't complain - parser.read_string(f"[top]\n{stream.read()}") - - if key not in parser["top"]: - return None - - path = parser["top"][key].strip('"') - # Handle relative home paths - return path.replace("$HOME", os.path.expanduser("~")) # noqa: PTH111 - - return None - - -__all__ = [ - "Unix", -] diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/version.py b/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/version.py deleted file mode 100644 index dc8c44c..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/version.py +++ /dev/null @@ -1,4 +0,0 @@ -# file generated by setuptools_scm -# don't change, don't track in version control -__version__ = version = '3.8.1' -__version_tuple__ = version_tuple = (3, 8, 1) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/windows.py b/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/windows.py deleted file mode 100644 index b52c9c6..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/windows.py +++ /dev/null @@ -1,255 +0,0 @@ -"""Windows.""" -from __future__ import annotations - -import ctypes -import os -import sys -from functools import lru_cache -from typing import TYPE_CHECKING - -from .api import PlatformDirsABC - -if TYPE_CHECKING: - from collections.abc import Callable - - -class Windows(PlatformDirsABC): - """ - `MSDN on where to store app data files - <http://support.microsoft.com/default.aspx?scid=kb;en-us;310294#XSLTH3194121123120121120120>`_. - Makes use of the - `appname <platformdirs.api.PlatformDirsABC.appname>`, - `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`, - `version <platformdirs.api.PlatformDirsABC.version>`, - `roaming <platformdirs.api.PlatformDirsABC.roaming>`, - `opinion <platformdirs.api.PlatformDirsABC.opinion>`, - `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`. - """ - - @property - def user_data_dir(self) -> str: - """ - :return: data directory tied to the user, e.g. - ``%USERPROFILE%\\AppData\\Local\\$appauthor\\$appname`` (not roaming) or - ``%USERPROFILE%\\AppData\\Roaming\\$appauthor\\$appname`` (roaming) - """ - const = "CSIDL_APPDATA" if self.roaming else "CSIDL_LOCAL_APPDATA" - path = os.path.normpath(get_win_folder(const)) - return self._append_parts(path) - - def _append_parts(self, path: str, *, opinion_value: str | None = None) -> str: - params = [] - if self.appname: - if self.appauthor is not False: - author = self.appauthor or self.appname - params.append(author) - params.append(self.appname) - if opinion_value is not None and self.opinion: - params.append(opinion_value) - if self.version: - params.append(self.version) - path = os.path.join(path, *params) # noqa: PTH118 - self._optionally_create_directory(path) - return path - - @property - def site_data_dir(self) -> str: - """:return: data directory shared by users, e.g. ``C:\\ProgramData\\$appauthor\\$appname``""" - path = os.path.normpath(get_win_folder("CSIDL_COMMON_APPDATA")) - return self._append_parts(path) - - @property - def user_config_dir(self) -> str: - """:return: config directory tied to the user, same as `user_data_dir`""" - return self.user_data_dir - - @property - def site_config_dir(self) -> str: - """:return: config directory shared by the users, same as `site_data_dir`""" - return self.site_data_dir - - @property - def user_cache_dir(self) -> str: - """ - :return: cache directory tied to the user (if opinionated with ``Cache`` folder within ``$appname``) e.g. - ``%USERPROFILE%\\AppData\\Local\\$appauthor\\$appname\\Cache\\$version`` - """ - path = os.path.normpath(get_win_folder("CSIDL_LOCAL_APPDATA")) - return self._append_parts(path, opinion_value="Cache") - - @property - def site_cache_dir(self) -> str: - """:return: cache directory shared by users, e.g. ``C:\\ProgramData\\$appauthor\\$appname\\Cache\\$version``""" - path = os.path.normpath(get_win_folder("CSIDL_COMMON_APPDATA")) - return self._append_parts(path, opinion_value="Cache") - - @property - def user_state_dir(self) -> str: - """:return: state directory tied to the user, same as `user_data_dir`""" - return self.user_data_dir - - @property - def user_log_dir(self) -> str: - """:return: log directory tied to the user, same as `user_data_dir` if not opinionated else ``Logs`` in it""" - path = self.user_data_dir - if self.opinion: - path = os.path.join(path, "Logs") # noqa: PTH118 - self._optionally_create_directory(path) - return path - - @property - def user_documents_dir(self) -> str: - """:return: documents directory tied to the user e.g. ``%USERPROFILE%\\Documents``""" - return os.path.normpath(get_win_folder("CSIDL_PERSONAL")) - - @property - def user_downloads_dir(self) -> str: - """:return: downloads directory tied to the user e.g. ``%USERPROFILE%\\Downloads``""" - return os.path.normpath(get_win_folder("CSIDL_DOWNLOADS")) - - @property - def user_pictures_dir(self) -> str: - """:return: pictures directory tied to the user e.g. ``%USERPROFILE%\\Pictures``""" - return os.path.normpath(get_win_folder("CSIDL_MYPICTURES")) - - @property - def user_videos_dir(self) -> str: - """:return: videos directory tied to the user e.g. ``%USERPROFILE%\\Videos``""" - return os.path.normpath(get_win_folder("CSIDL_MYVIDEO")) - - @property - def user_music_dir(self) -> str: - """:return: music directory tied to the user e.g. ``%USERPROFILE%\\Music``""" - return os.path.normpath(get_win_folder("CSIDL_MYMUSIC")) - - @property - def user_runtime_dir(self) -> str: - """ - :return: runtime directory tied to the user, e.g. - ``%USERPROFILE%\\AppData\\Local\\Temp\\$appauthor\\$appname`` - """ - path = os.path.normpath(os.path.join(get_win_folder("CSIDL_LOCAL_APPDATA"), "Temp")) # noqa: PTH118 - return self._append_parts(path) - - -def get_win_folder_from_env_vars(csidl_name: str) -> str: - """Get folder from environment variables.""" - result = get_win_folder_if_csidl_name_not_env_var(csidl_name) - if result is not None: - return result - - env_var_name = { - "CSIDL_APPDATA": "APPDATA", - "CSIDL_COMMON_APPDATA": "ALLUSERSPROFILE", - "CSIDL_LOCAL_APPDATA": "LOCALAPPDATA", - }.get(csidl_name) - if env_var_name is None: - msg = f"Unknown CSIDL name: {csidl_name}" - raise ValueError(msg) - result = os.environ.get(env_var_name) - if result is None: - msg = f"Unset environment variable: {env_var_name}" - raise ValueError(msg) - return result - - -def get_win_folder_if_csidl_name_not_env_var(csidl_name: str) -> str | None: - """Get folder for a CSIDL name that does not exist as an environment variable.""" - if csidl_name == "CSIDL_PERSONAL": - return os.path.join(os.path.normpath(os.environ["USERPROFILE"]), "Documents") # noqa: PTH118 - - if csidl_name == "CSIDL_DOWNLOADS": - return os.path.join(os.path.normpath(os.environ["USERPROFILE"]), "Downloads") # noqa: PTH118 - - if csidl_name == "CSIDL_MYPICTURES": - return os.path.join(os.path.normpath(os.environ["USERPROFILE"]), "Pictures") # noqa: PTH118 - - if csidl_name == "CSIDL_MYVIDEO": - return os.path.join(os.path.normpath(os.environ["USERPROFILE"]), "Videos") # noqa: PTH118 - - if csidl_name == "CSIDL_MYMUSIC": - return os.path.join(os.path.normpath(os.environ["USERPROFILE"]), "Music") # noqa: PTH118 - return None - - -def get_win_folder_from_registry(csidl_name: str) -> str: - """ - Get folder from the registry. - - This is a fallback technique at best. I'm not sure if using the registry for these guarantees us the correct answer - for all CSIDL_* names. - """ - shell_folder_name = { - "CSIDL_APPDATA": "AppData", - "CSIDL_COMMON_APPDATA": "Common AppData", - "CSIDL_LOCAL_APPDATA": "Local AppData", - "CSIDL_PERSONAL": "Personal", - "CSIDL_DOWNLOADS": "{374DE290-123F-4565-9164-39C4925E467B}", - "CSIDL_MYPICTURES": "My Pictures", - "CSIDL_MYVIDEO": "My Video", - "CSIDL_MYMUSIC": "My Music", - }.get(csidl_name) - if shell_folder_name is None: - msg = f"Unknown CSIDL name: {csidl_name}" - raise ValueError(msg) - if sys.platform != "win32": # only needed for mypy type checker to know that this code runs only on Windows - raise NotImplementedError - import winreg - - key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders") - directory, _ = winreg.QueryValueEx(key, shell_folder_name) - return str(directory) - - -def get_win_folder_via_ctypes(csidl_name: str) -> str: - """Get folder with ctypes.""" - # There is no 'CSIDL_DOWNLOADS'. - # Use 'CSIDL_PROFILE' (40) and append the default folder 'Downloads' instead. - # https://learn.microsoft.com/en-us/windows/win32/shell/knownfolderid - - csidl_const = { - "CSIDL_APPDATA": 26, - "CSIDL_COMMON_APPDATA": 35, - "CSIDL_LOCAL_APPDATA": 28, - "CSIDL_PERSONAL": 5, - "CSIDL_MYPICTURES": 39, - "CSIDL_MYVIDEO": 14, - "CSIDL_MYMUSIC": 13, - "CSIDL_DOWNLOADS": 40, - }.get(csidl_name) - if csidl_const is None: - msg = f"Unknown CSIDL name: {csidl_name}" - raise ValueError(msg) - - buf = ctypes.create_unicode_buffer(1024) - windll = getattr(ctypes, "windll") # noqa: B009 # using getattr to avoid false positive with mypy type checker - windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf) - - # Downgrade to short path name if it has highbit chars. - if any(ord(c) > 255 for c in buf): # noqa: PLR2004 - buf2 = ctypes.create_unicode_buffer(1024) - if windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024): - buf = buf2 - - if csidl_name == "CSIDL_DOWNLOADS": - return os.path.join(buf.value, "Downloads") # noqa: PTH118 - - return buf.value - - -def _pick_get_win_folder() -> Callable[[str], str]: - if hasattr(ctypes, "windll"): - return get_win_folder_via_ctypes - try: - import winreg # noqa: F401 - except ImportError: - return get_win_folder_from_env_vars - else: - return get_win_folder_from_registry - - -get_win_folder = lru_cache(maxsize=None)(_pick_get_win_folder()) - -__all__ = [ - "Windows", -] diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__init__.py deleted file mode 100644 index 39c84aa..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__init__.py +++ /dev/null @@ -1,82 +0,0 @@ -""" - Pygments - ~~~~~~~~ - - Pygments is a syntax highlighting package written in Python. - - It is a generic syntax highlighter for general use in all kinds of software - such as forum systems, wikis or other applications that need to prettify - source code. Highlights are: - - * a wide range of common languages and markup formats is supported - * special attention is paid to details, increasing quality by a fair amount - * support for new languages and formats are added easily - * a number of output formats, presently HTML, LaTeX, RTF, SVG, all image - formats that PIL supports, and ANSI sequences - * it is usable as a command-line tool and as a library - * ... and it highlights even Brainfuck! - - The `Pygments master branch`_ is installable with ``easy_install Pygments==dev``. - - .. _Pygments master branch: - https://github.com/pygments/pygments/archive/master.zip#egg=Pygments-dev - - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" -from io import StringIO, BytesIO - -__version__ = '2.15.1' -__docformat__ = 'restructuredtext' - -__all__ = ['lex', 'format', 'highlight'] - - -def lex(code, lexer): - """ - Lex `code` with the `lexer` (must be a `Lexer` instance) - and return an iterable of tokens. Currently, this only calls - `lexer.get_tokens()`. - """ - try: - return lexer.get_tokens(code) - except TypeError: - # Heuristic to catch a common mistake. - from pip._vendor.pygments.lexer import RegexLexer - if isinstance(lexer, type) and issubclass(lexer, RegexLexer): - raise TypeError('lex() argument must be a lexer instance, ' - 'not a class') - raise - - -def format(tokens, formatter, outfile=None): # pylint: disable=redefined-builtin - """ - Format ``tokens`` (an iterable of tokens) with the formatter ``formatter`` - (a `Formatter` instance). - - If ``outfile`` is given and a valid file object (an object with a - ``write`` method), the result will be written to it, otherwise it - is returned as a string. - """ - try: - if not outfile: - realoutfile = getattr(formatter, 'encoding', None) and BytesIO() or StringIO() - formatter.format(tokens, realoutfile) - return realoutfile.getvalue() - else: - formatter.format(tokens, outfile) - except TypeError: - # Heuristic to catch a common mistake. - from pip._vendor.pygments.formatter import Formatter - if isinstance(formatter, type) and issubclass(formatter, Formatter): - raise TypeError('format() argument must be a formatter instance, ' - 'not a class') - raise - - -def highlight(code, lexer, formatter, outfile=None): - """ - This is the most high-level highlighting function. It combines `lex` and - `format` in one function. - """ - return format(lex(code, lexer), formatter, outfile) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__main__.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__main__.py deleted file mode 100644 index 2f7f8cb..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__main__.py +++ /dev/null @@ -1,17 +0,0 @@ -""" - pygments.__main__ - ~~~~~~~~~~~~~~~~~ - - Main entry point for ``python -m pygments``. - - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -import sys -from pip._vendor.pygments.cmdline import main - -try: - sys.exit(main(sys.argv)) -except KeyboardInterrupt: - sys.exit(1) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 5a6b50484a01b2090923e15d3a3c1f6e65981b4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3510 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-312.pyc deleted file mode 100644 index 48d14978e09fdc5d259f9f196a53055042318d79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 756 zcmZ`$J8u&~5Z?7&uyF_k2?Rxo6`_bF?#^)}3JW0xCz7o|csLYs!TEf<*h}tiPrGY7 z2NHsYhma6dX%Ic4;wMm3BBbafDynn=H^>!xXFG`^F~!X6%zQK7%zm4h$pa<s$0r>J z0`Mz&Ok`^83_d7l2Vl?u7~+fv8&Fxz%lKMDgWx2{00JN7Ca^=R;+o2&6Aq(^_gT$4 zY9WX+^MIVV4ETBY-+ox1;2_vkh(6fXHbEa2rXGLKBPC(f_DLXxY1_U-1KUocPmfDJ z4c}4~NLBL)g^UIgJ!Bj;n_(n7EI@{T(5=}tM~Je^!idv$N0w1#;-XTqc-1HsOG~H~ zA=x45&X@&~#PP2nK?qvDzfrw?uWqJ;%N}(}AV?YAsIQFjH*1yE_4;Z`0Tby^Pnh|= z<U;EO80*P0d&$WP**I(4n7OtcYa$ZyTu4LH?vVg9ZXT@f`q-lZ;hKWPI@zW&)*asN z#b?(@)M5_DwLlWiyP^C92FaMAv^vZumhVW>vsRefO%G{F;*mCYd_zd;ZV_%^)(<@9 zV8SgmwP$&>WsOd@WG<F0K_xLl$K7(;L|BTPH72KuMt@^X{zlOq=C1h+cRg~QpH?K2 z4Mk0<eGNkRJClR@;2eO{KY_8YYjAc~KlQBgviiLGdgI;v&cgeJHxGX3bANZU7ykfw eB>n2{i?yW1>`<Ih-QHeW1Ya&JPitTEQ0afGvdxA7 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-312.pyc deleted file mode 100644 index 9186f50dae275d13ca77defa53d4bf24cab45c09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26627 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-312.pyc deleted file mode 100644 index 0fca347ec33b8a6ff26e8d33874c4a338f0711c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2648 zcmbVN&2Jk;6rcUFH(onmO_L^}ux(?glg3Vy^ee53(x#!PG*ChhI0bj@oj9AUcir7} z61yqb5)z3(sx4Kjxu6ztpz5E&1&K>6f@D@4B5}$sB)4AR&F&@&fl|syJ2SucIq%Jz zw?BqL0R$uU_1&4rK7@WFU}tdNX1j+%=pm9(9LZFiQc#?hX$;>55Wtko6v#@;tcN)d z`#kLTFz?|84+lIfcsS_ckcS&R+~nbAg40ND`G$%!u(ra=$_L^cjj#_hn0-pSCmur| z9Yg3AptwKI!wK6kSAghTJJ|2pZIcfI9aQ%4+%s}=dm#kc+?Qb%P5GzzDGuWEb-HnO z5PkX3XDHqvcfuTyyI>ab-H}%c-v>k(*?c;KHOq{qbj{RN><~ZMHv$fITsJb3C8l&$ zH?Rz=qaf-zE1R>TuFObE&*lv!J!6fCmv^?};K0D?{=tF4Au*X3tr;x7=Xn(^EM-oJ zCdT6E%@3}=`~GCqaW$eUDXf`zM7%UP=JMZp`|_2E$t&WtZiq6rBt<o&fdbt<WurpF z(7E%&=gtodWNgmBCbn#5;AF;Tle#Lyb`Z$ZlA;mvP{!s>OVVUGHo)PG-H_8{Y^aKc z0iOcVB<$y4e;P#fd6yO830+D79b&h+w1Kf^`|?;-^#yRG=CJM0NNGr=WV5Nfq}goR zkn*4>B%OS?+6^usHaxm(Dd^HYdx0Gluo`mrJGMQR<AGb4Q7pXiDya)5tYkLGZEwH} zK*nn@rQq8gq}~|#w%cHOh^$?POp#idL{I1mg9tpKY%ZnC*nEPviO@4MHlt^746fds zkB#Z6oKr6`3#%9+%=DX<lA6OtzpO84sxCn;WAj*>kEu#Bmd#r;x;7L&IT$nHsQp>U zASB6*WtD6!0b;UlfRI~)F|VSc*}N?{*O+i>&FF<=9EZ;g!c;`R3eDw?m5Zxvr$MMG z?<v974bcfR3Se)TONfNIM3G0dKX^i$L`DxRMi{0DZ8tcc6LUCkvld>oOyWcojR-6@ z?=Y1DHi(xK@R{8(xhLza3Efq>CLI0t=67cve_RuWR@tGyACv_J=b)=j$4aAn^b+(e zneIZcGBVW#fi2Q=5TU`zth0(5O(E^@5<N@qc;B#g(;#ys)Tf>dMeNZs(}nJl-Sa&7 zUdn_2e|X?u%0t6*J-i@#_oDYi|Bv!Z)Qcqc<TLQsv&h2i&i`i59W2p17AH|8Sok48 zx~tbRZ{H?0bo;irpjb1a<hD=|notaynF+5;lq}0ok~s^TBO`7nCF)L{kqr!ubYIma zIkpM0*OBNYTah%oeQfvrBpmi`m)kGY=h*0TZIITdXz4w6CXAyH<;EW{o>6@U{A-X+ z^%^7tHkB|0Se?FMkot=-wol4t;awZA69INsS2Q59BtD~`kbLm6bE;*M;s>AZiwa1Z zsX%9kCS#lh#sGZgI!r~h*@_yQi{o{_uzYFxMscw`T&1f_`P`cS*dyj=|FJsXct5lf zdVs5MRkSreTyHv19xW%A3(M?(&>62}*7%;6)45h_KfcCC_A0S~&##xRKL}UZO5Ym$ zYTd=<o;9|^+XK&EiLS9n>O$!LnUyo;(_g%~%62)8VImT={fUIErxFR9!Dh-$o*+xc zoO^|)9aPCrbq7(4Hd9ctHYMAX>hwpa6*;*x-hjM0cAeZl<1b`%Ij7=_#wajIS1=iv zHyMheey4eg-E2et#v-%M2Z~%h*jVI>$x=hTrLBCo)^Ze3y41Mde4vag0)XjKh_G^% zZkJPU>!^k+*8t4cP)q&bq3Ws16ri~pYW)|%EtYEPEefzSpDhMAeTefHsb7LkWubcO zr(o|EVkn_BRvazfsW-KjZ&q(qK3w^<cxCxW>8eXeK05i;bnRfc))e;0EVtZJ8ZV7* o`ayRyfH+_A&hnA<miF>|<*<9$Egwa7ZSfQ}yv?^$-A<DJ1U5dHbpQYW diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-312.pyc deleted file mode 100644 index 2715ee8d21194fbfbb16f3a343798887e9257b98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3254 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-312.pyc deleted file mode 100644 index 8ecd995fc900eaa11e7e1a10d75d586c10acf2bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4591 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-312.pyc deleted file mode 100644 index 77d187f1ce080d575c080d394c96eb07174f2b36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38351 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 Ox9$6T0e6hg`hNi+@Kb^S diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-312.pyc deleted file mode 100644 index 05a9c69cba2e6e3630bd6939c1665a362d547e13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1590 zcmZWp-A^1<6u)<7KZgC_Q)$5(Z&WH%WtVQFiJKNeDT$h9tKI6uwsbQ)b9b3#zB+e+ z?m8HZHG(t&eW6c=$2R;azEDXNCp?(=#M=se>WiM4-GK&AGUuLq&+ndd?)jKs)9C~P zl7IPn&f^jK+uwu~=?KU7LD)hHDj@|coQ6wS;cK|Wafsr2EQFt~N(9b@(|suIaBZm+ zRickjDW=4g*dttuH#kvf{+=K}R->j<!(kcSRH&vJG&ud{EG2^DDZ*6U(kKbR#FA`A zZ8BPs7*&XAfW1&BX4;qXvS~GJwKnJE$#f`^-1zuMW4ZC%6;f#sXO5E3JAn{~O8N(c zQA(!1yz|Me+r>=aJFlrSH5kp4>%|*w{moCOX9~p`QZ;R&P)AZVmPs7?PcC@pYt$)M zRgF3gi<Yalsh2AY)he}{?H7(t=E<T;TwpqI`jCjkKf8PN+QjT6xu;wr;v~rjt}~Yc zRn-AtXc9!$FxuRa{M*;aD7kw-e~-<+PsD_b!y>>6g$};sJ0NT!=R{TaHD}00JDt1B z*u{3Ai|f%d5ZEd>L={m3iCp2(za;WrGR%M3re2Iu$(HB5Xw5bkERplD=3$-rZ9&LO zCp%~AG^<MvTg=`t<%OUVvJTZ~&6e~r=BV;KwZ{~5$<Rzmp>}qW8jD#?tz@l+GiMrC zGM95%raE-YlH_@*Mp@QUt!x=!ifIF=-CWr)ri|6_2LE3fzwhi61T_dB8wIw44upX} zgyHAH@RQ4X!ka5of5wIVp5Be6wWZAm>&;zZsKq0p>lm;|?zFitBR^MuR*!!JwuM|& zf3*^D=F?7lLCc)WDUjtPQn)4zrh>ochd_4&%?=>6%sVIbarrRc%Mmxi@Z&x=B6AoO zQ3N?B^>Hx_EZ*td0xKh6CF(|<c*h}fxzNr$L=ATOU-7}YQQv!r=y-bP)Kh~OBh8x$ ze{hSkWCVlLZtGwO!Zb4?849tfvtS#i9jjJhKq*lfU>6LfJywVR0@?lp3Sz`dFiTS% zzZ@*6hZnUaqeeYmqlOssc<|+Q>C(e;0P&)2WEb4_cyQ-omHEFXKR!b2B#5@3i-27K zfqe&T1+@f}?%gP?74}jWR%Z6o{hPVX#%6uH?<Z|Lw>vQMJbm#9@zHau_@MjU?JxGa z-&=*o?%p35{PD9^9274E)IG5I@srB-+k5GeBNU0gv5NPTsmE;d!}aF+#6kb))7PIq zcy@lTKesyV_4Mzb8~!=b>H=IVg;KqC8sZS~q5p1C@Z#mNV#?*R$HC0NM$$Cc#AQ>r z;1A-(znZyy{Z?_t_TLudC3w&?6qpH~`BJzF$zRaug#8wP{FY-=z*;=U_#aNdk>l48 zPW+V|*-czriML{?XK1yuQD3XK5I-D&eN6bF^lj-l&iC}KB#%-&9)6MP!R<)@10*Sq As{jB1 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-312.pyc deleted file mode 100644 index 7acc83841e7f94fd944eb15bde9363c5779d7782..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3418 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 QD<N6x5M-5e^Z>Z{AL0#YP5=M^ diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-312.pyc deleted file mode 100644 index 4692af1ab7fd298dc5f34d183c37b151f02ac1db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4103 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 U!nhl6S<c|XS5a)m=QK9|1-ib|y8r+H diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-312.pyc deleted file mode 100644 index bff7bd86e2ab6d9a4eb623da2c64bd72db72623e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4778 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 A8UO$Q diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-312.pyc deleted file mode 100644 index d46a56a187a4a20fbbe48c623a93ef094331d3f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11068 zcmb_iYfu|kmhP5XkJbYTfn_il+Qu*0SOh!q*f=J(!4UkwNpRu`8KNla2BZiHcQ;@Z zk!7>q9Wn8aVKY;}CRxifsS2)4RlNV4+TALrvbB?~`6F3)P<ovz*FJva9|5O!<6nEu zZM7t@>?BijOS*mgKF+=O^gZW%=XC$UZnsd70{`&l;D2tSsQ<znEg5o!)i4xhDW2-3 zc$(LR>0TPH`mk<D->avwjtMhEhF$|H8^XpRQ?H4XjbZZ;+si`P)NA3*y;h#>wegl- zyN>Flc<UvKw+W_?_3AvmWxV|o)$177dCL3@O;HvO((w4ekPwk2uQWUuj9e5h%B1?O zhmwWV_mEy3bQ2;{FdE_HC^sNP1ko=GoPR`)4*BI^fa9Zq5hM#Y&?nl@g@ucPC^Zrq z{ZSEm$#Bp4BRtn13}e}=PS6sF4v&k$fkC;2YtxF{z9*hIuy@}R`}T9Mk8|>%z&)2+ zHYW@Ip+-&;1n$_2=bk<LLXVfs(Gm^@V1+^pcf6-vZ9m=BcA~rI1P9Y|yde97VVLu4 z<W0ASRt%9SFGx@@zZ4Y4P6s6!%4~a36asQ^RDheRh#<)V?;G}ulHeN)%7Z>RD2D|p zw$bACazjymBrLSFaN8w|1^)1h{S+GlVZS8h>XG9uJ%dqE<|6(fK_b0LWk)b9<f=F% zK`PI5ojJkD<HOjI(8XG$A3OFZQO2Qp5<5$h=!Rvfd(b)t)Z?S(aBN6gJr0*yN}%AZ zQoTB!?$z_UUWV8A8hEDH2xU`{>NWEQIB_g*gxtcLAh+^n$Zb3exqaN?u_{*WQMN|| zu?Sh-F^<>xj^`^74Ts?=aQ<*OcaEA0N2n=xe8^GKP9mX#r;+f!KusbKAI{H^dP+LJ z#{Gyo$O78VaC<13C^f4IXqu(ueA~y^3Mo$c@^x`4#Hh8!IZs!^Ew6iH7fetNeN4rz zYFVQ;K}Y1rQqkwBu#ctk{9~ywc`DY&Qt>{PiXl(M{#Ytj*`c-b#*cH{dYhKZwc3zN zD;2JJj_BkKT5X&TZPdzzD{s<h^5);MALAp0G@+M~?Igi2K;y1YaeZ8;X+#>HV<<PW zxL-TfcNl0fr747Ji~FkOP+f^Su0&nK!*y{++X+owKEhCOU1;0Gy?Q8*rJI~o#i%M% z#Zr(0#gr2R#i2I(qN9R13Ysj|7>tbi!$F?&ivvU_6B*d5>3z`DTMGj6fVL<U=sKem z9T5Y9r$W(7f~>GWUDZwstC5iuho<Fyxdm0^D~eX;EL5tBUa890tXr$Xp12qghS6q- zD1M4L5FHwhjzoA7B}_3$!{MMT8r3ow7eO&=v=lQeR1QW4B&7m$c2wkjyf7?8cp(x9 z3X-Dt^E}WS42F48h<FSNBMIStMIRlJ6$W*`q8kk>y8eiS!jHO-doa>87#$Ltz*tG6 zP3<|8CN;@ISQrrfLwhAKb#DmbUOqY&2}k|BAU2H(k<q4b@b#wQad|Kr+3#)M*CYjH zVeha%@P>atkeY^r!%aTu#z#fyq#EC*yz%u8k1Kj{BocEJsYNeToPbqHVD+g<>TY%I zdm9qW<+7~Raiw*tb#6=ATAMWAw(iQh+)J(<Y1fX7Yu8j;)?R+))u~tKj-~B&$;R7u zFKOPLcJ0o%8rL;@Zrk^e=ACKR&Wy{mwmG$R|84tz(%zJIHDz4QQ*Hn4s!7$J%(zaa zY^UxzDzCgX^;X7FpJ49VH%td+gEPS-^KNwE^+kJgLU-59B`ZJLbZyhZ3pXkk%?E(e ztarw{LecCAI&nN}b6z<)b#lp8pSIO6*><IEyOwNEr)^I!*^Z`dM{l|A*xHx%*!P~J z;>yI-M9N&d3jA2Bv{4-qr9BP#&&z)907!*!iW;IPXabiAq?*vt)Bq?7_%l3niJCCT zd8G=f<}s=fjoI&vnyLXMk))`ff%=#*PMCBcws8}0LhYl8^MpBW4%wh$U4q)ObyaX1 zgZ~5@XF_=eS?B}Q4H|VAT}pB0)EI9L<rQaPe4N$RR8p0)yhYnp$#yGm)7mf667Y|= zKVlveUslWkSTiw$?@_!XZhVjWK+ikhFIIQIVc=Qt&fm}zmbj&zx?;Uz3&4{J==$~o zH>^d<oPkzbKu6l#&}NI<;#QnXqA#;@jkZ^<R@?84?s63a^d@XYHBC^XpRi3>e^Hhw z>!<nhOXgoV5@iWTzm9iZGEdm!`bRtkyJny?YG6Vh(Ra$hSMZhm2HyQ~4jz2}n0P7r zu=Bn~vg1e26u0pkkr!~S%3Z7R%5Q?28Z5yRsQp0y@JcRw!QecCZmHGqn@gTAy|%X= z;5AM7J*JijpT{UqUF>FO-cR6U|LY@RzsPA;3SEQ(yvw-)sDsY|)(8AIG86%4K@<q~ zCsu>t=SFg$cSa;`5FCoIz^h(DP*UNd1qor=1;~GEcQhhw^{6AkF8U=wbwm7II2d^Y z@h18g>Kp_<dWqG&4o30xiJzW$p$E*Pvp*Q&RjcPCeFDWO0u4w7{8teu%u;b$WO+J{ zk3bivA=iIk=mF#b7M<ySK))8#aZktet*`m6Qyv}IA^_luenbpQNR#8lop4dCszvqT z8e@lwZG&b2b4ECC_`OeuqXB<dYV{Tk4FD~v9<oX5ONT34y=m^rxgAMea({ArQc7*y zlXC9KR%}e15<Spo4J5|JkWG1^0Gk5cN=_KbLwPU^jk%;r3T#u?EuxAA#u>uVF+l`g z(ibHhqwem3`RTBK=yl%T8awdgwx*361X@xhWRujbW4HXDwSQ6mS?BN1e0JvZvy&9r z49uy2Ll`Fud7x|L6nggq-OqL_wC@4^GljuZ@ip%80qylLVl$K!OW|NCrrc3c4C?cS z_IyG-f(Ui>7G%GsXVJXS1)pIGaHOU_L6o1)84cZpKCTzHfXP9lwJw23;wf5}0J-KE ztz7{zdP-A(6Q_#-jiR2d3_P?_en_0wdf~&0xjKl0&iPSH!vZHp#~#p}hf(yg;ILx! z4<oFCM;RKC06T@EL4;GLoRo?UuxN!2D|A39Q|sVlMh4_TDUYls)iceGiGYlJKtA@9 zANSbv1IJ)8>1D|NZ<4y_s!X)qt*V*pUg*qJJ-I?L_8l|KG(Fw?WkqGSa^vjDnUixD zu8z%*B`>@eyHmOQUan3`HqVdTsocKI!iZ%X1=R;<4$if`dn9G!R7og)5P9*2CrSNU zH%m?Fz&3%lBen_Lya`})oI>V<^<fz}3=@=&n$pMVUxLu*^dkj2Q5UN@k1WV@S`r|* z;Fm#75uP6rpMWXgICjGYk@&E97E0oCkV$A%IBqh>ONYu5=z^h`s2Dr)r*Jes{B4{8 zbpY~p>l1%;HP1aiy?^?`yHBND&51V1zO1O73rs(gvTgltMNd`iBkTDaTQvi+1R5-6 zJE4V$c1fO?y%6)jTkB~I2dR+}B5PtB%q6x%7Gqn8gtff(mUsdyn=nIH(o?2v1Muw4 zfoDL<xyY63MR<Kfa5BLG5W!edO3h=siU2Ms^l?Op=O_kv0z;CB%1v<)G56)&9kB~) z#eJBa!giA=42S&zP|!pEi;5l&w#O-M#b%t8&{YM%KtxB}kAqmUA)?nA-Y@$VmaG^o zheY<R*m81$T_nY*-hmqs9TU$X*}_A2!YvrGqIC2q5hk$;T4LLN$V2}r^pt)NisZXV z>RSuN9;LrBAI+9I6Z(5jSHiHu=-I0K7K+=E?EffyE&SU^x}|5a{@e=1vW}^<iLPn+ z%c@-ql?(ps8#7hSiLPw*)}`vkbamsx_)^oeY4}w?n>cyTR(|F5)afs)8j|e`<<~kF zUjC%-dS9mMaJFvi)!=+^!IG)lzf^ZPU3d6q+pP_my3VD#v+26Cspoo9FTR|q>%Cpa zr(Wf=HT72y%^ymhTi9~#e5Ph^ww6nl&v(upN*+rFldq(zo4;WVo65eW40gvd3oBf4 zQ&q?5gzet0C;wMZZ#s~z+jd`1)zsa5>W_8L-Dtbj_J#5DQ}0V)@kXy5zEj_HyY9I= zo1R~#plhP+zL90OeCyV;4a>k7+ZD@{W#*Yo#kNKB_N>`TZV%19lzjDu@77SJ;@qP7 zMXg%vRZ+D<8CY+kEo*b2Pct)~byiGw%vkYqI_=zo*RGketgB|OEoquRJ=eNW4pw)S zWvcdm3o6UItcUTSh1O1wj?ehi_*}(1Z>7wezgsy%)jv;vN0u#N?BVmevQC}x^F~X@ z5$ESWaYFvDCKhV`?T7*LHI^I$(t7x>PJ#+q>mz~T(gndcf<Ggpo+Aki%wvLAydJzF zreNTv>An|oCeAQnj2l&)Fkve4vP?V#yW@rdTEnB@DN!L3DA(pxub~nlrqbS%X258w z5MYX%;|6VA;90Sy{3fZa5NP5JaYGD@d4X2xF%uR!ACQV$WRyITw7DSMX9?v!60H@` zcs>jU-i|)BxzM7O;--N-R0ttVTbJSn-W1xht`cs6%VtDl+RAfY8vDrJmg3$aG}-GC zU*z+ZY`61e+J3)xHb?PnTJN}}-=M7*yeLzg83o^Rn!dcHw1*4cV1et_l3cfb57(`6 zYn+Lj&~C##FEUio8P`Adj62t!@xGbd2{(Zs3KVgFlV$RDjfs4D-1Hv(K_0HXO>4bE zi00QN4Jq@4Pa!nB>yp+Zv}aud-107si{Q8FN}U=RZ4*hrWjkLXqe)fo?b=vGEB*R) zr{4x}6+);W#ii*YI#KBu*N(hg%TSl!1-MxmDs@`(d;z$*K@Dn(xU)5CD(`UEprzn& z^ibEqoxnx{j>H2{Dsm;ngK!_)`xrY|@QXC(VIGF8qW008he_3C5Dy`(9q0XG1YiZe z6oL0z;4Ma?GB}!}2;0E<l4KEDy$UlT_a77?ZcK^CFgps_*QjSjJa6I=%vv#f2C}aa zz5TH5iUT+ZS^ekO>nBJDy(NNcW9~CSNrL4UHbSDq;&JHlfZi)2-tbh5FW~@!a1cC* zFGHqSe7+zAXGPiPBiKpgu-5D&;K}DxOat(aO_oK)<nsZWpvEu^oRSqw5N4EQe*|EZ z;q`GDArB7`TL{5gAco5e{r-`#tRk;dINd9lp@=~{27ti_hA{?YJh&sGdS%a?ZGZ9f ziT1N?Vjo!uan|A1Q&t4fP}3<U^;MmuIMqV_AxfeTr+N)L8PzrbdQo1{15{Jkd_U3% zccPV$8x;IJ@KC~_UJ){bq6*D0AQ!87%#r*RbdWZ}nVzJ+GCxD0SQeZaQ?_Pv%3O7~ ze!GUmKJ_lvcdb&D>^>EUWj9pMZJ9Zr=(y{u1zd7&;mI4G8#Ni%5yT(PE8SDwOSZbS zt!_@b8lR6Z+8Xb=s^=Q!#v#B9Ju2L@hyU*IUFU|ByY*Ie+I@1-c`92~bJaR;O?2IL zRL^-nd~wmSCtJIHskSj)+qm#jruNBcHfyWMQ5{W+8Qbn9TXWjhoOM=bot3lf3_G`N z?!x@ejC1R4XJfK|edUsKciOpoVgC(7#(7}L*_w8?-jr^&XPjNPojqT?w7z?eM)k7Q zu)pR$puAduMoxEX^WKbOZ??MjYR!DjwDE4m=DGe4g~f`-?B<56ee-<_2Qr)YO?PDX zG^d<g(w%YcTJ`|f?l)4v%<~`hUF-X;513ikwL%%$#;NW^2XuDSCyi;x&Xl9+D|h{; z{VA>^<L*p3JG1T`$<egiyW~EUb|1>P58phNcDF9M+tcp$jJspWeJ1Tb^F<)zej(AB zgMGgmPj)PH-st(~iks*EsW$!8iBv;JdSl0;tutFy2Vrk}<1_<EaMm(odH-ONpMU0# zbI&(=s9v_hdX}A(({*KRYHV71C!R9bJRFV5W4K*#Y97XLMRx5+VYj~j$k{bLy!>Kv z$gMa&ZXn1_UxeI@KLWWKOU1o43$zBg8RL2lT}+tbrc%gl!dyUZakC6DVKr&v0EL-D zs5RClK94#8b(%`OA_T0cD}~Nv1llCU;gxnt%f_sI1CYZy=12Bsae*2KO5!XFZ`F3B zQHz`VnRWK|E3mb;k}E2<wRY8TLLAQ0arT8X$IhLDaOR)K3N@EhZ-v)@4_n=Tft^dL z)%}A0V#~iXlSNin3_|NVV=9KQu3$`wZE`8~B^~|3%;I0;u)N(8BY2C>J~3Eg6idUH zUBFDjOvY>kGBjuCl!J-GK!9TII0Gz08<RIo9*b&T$Si1H3N}Q13vd4dvq{YU60^U8 zjBLALDO4+g2RK&$J#73GM}G$yT8h?t=(MAG2rcb6klt}1v*X~Wk;VEmE0mRO`g2%_ zA7BjJ)wAK5a6$21O#Wn{{gbZiT{rlf&Hp%%X>7gS`0TA6*@m4T9lCaC;oOZa*Ux7f zo?2=+l5RM1GjQvvOhec02GslwjmrjIgZCRsSLOYd(%GAqD_|STRo|xz(Kkh$wVI$y z=|b>c0o$%mALl9n;m#K6JSv32+;u6$uB(7s8BZ=rCExHdr8FJNdI(SLx}?cJctK1_ zO=l?5bcT|e&QMa*<=@Io7(k<y@JQuaZ7DEwUb|^^;8*J7hV@>-<$2IG%=hXVLtfXI zI=W7yqETg<NNu@NTUu(>F9gJQU<m|e76cW-pW~7khXzERDmVkNB;s2_a#eX{)u~Zn z6G#%J)?-u!mdrr}wi%lyF+&NJ@C2yBsR|}~ow3@|f~l_e4>)WdGL*`LL@Kk@+||wV zo8PO)a8Nrv)s<+UZdilK-j}YvIsfLu{!d!3x2Ee`mg?Km^=*r`_8)}6NNfo}M%zcH zubsZJ?IxRQIG)~k{En>+fD+7yAn73l(G5_Tu;G`mRK@1=T^R9)bLtIQs8|R6k}nXA zz_)#};u3`mBk&m(?<;)q;fj)vGyLJAx@veAR#f2|8-#eO1fM$yidF6IlZJ(WxC>?= zQA!c<u!!nTMAoXVjR#BU8;fQwYk`7v6tYXyH#)t+ylkc_swPjtORE&)&gI<p6tfwy z^5m%%rrfZ3Wk-vlZsj7~V5nU=NjnX-tJ^GwS^}R4-8HrjT`;0Io`3>6n5Eug@wAM- zCP|tdrm1m!r=?hja}j881>nt{9lkK}<v&~_^MR$+Lr}WNKLxi%kVl5azXyt0_)GXM zf0D{FrX^-Wn%OWt^x-Ram}atM2rZM7{kPCX{m?~*Zx+=rV>ZB?BY5itPYUAKe)zHl zzQV*kDV6y)@~I+xT8TaqDnX@O{m{gVL%rmSNAfj|7=uRfP0Xe+yMh^c5V+2DPYB-D zsp8ivUWHarx|D>11z%{;^fx+|W>(!4ZT%l=(^u4P@;k6>G}xI*cDanTF_Y$Hx0zfj aO;~xq@)aFjJMFno;dM36(DXjC{r?AzcF=wR diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-312.pyc deleted file mode 100644 index b14e849e25d98303b8c35409ca243fc6850690f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6696 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-312.pyc deleted file mode 100644 index ca42489a70a7fee71f22cd584e89019215a2edc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8164 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 CksVC{ diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-312.pyc deleted file mode 100644 index b882c424cd5c398b6928461c8fc0201ee7ad0b00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33010 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%0D%aC3UL3z?EkzSAV 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 OHMwAanXs<e?f(I49Z@m> diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-312.pyc deleted file mode 100644 index ed86359aa1e4167881a8c07b28c3ae4044839bf7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14003 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/cmdline.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/cmdline.py deleted file mode 100644 index eec1775..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/cmdline.py +++ /dev/null @@ -1,668 +0,0 @@ -""" - pygments.cmdline - ~~~~~~~~~~~~~~~~ - - Command line interface. - - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -import os -import sys -import shutil -import argparse -from textwrap import dedent - -from pip._vendor.pygments import __version__, highlight -from pip._vendor.pygments.util import ClassNotFound, OptionError, docstring_headline, \ - guess_decode, guess_decode_from_terminal, terminal_encoding, \ - UnclosingTextIOWrapper -from pip._vendor.pygments.lexers import get_all_lexers, get_lexer_by_name, guess_lexer, \ - load_lexer_from_file, get_lexer_for_filename, find_lexer_class_for_filename -from pip._vendor.pygments.lexers.special import TextLexer -from pip._vendor.pygments.formatters.latex import LatexEmbeddedLexer, LatexFormatter -from pip._vendor.pygments.formatters import get_all_formatters, get_formatter_by_name, \ - load_formatter_from_file, get_formatter_for_filename, find_formatter_class -from pip._vendor.pygments.formatters.terminal import TerminalFormatter -from pip._vendor.pygments.formatters.terminal256 import Terminal256Formatter, TerminalTrueColorFormatter -from pip._vendor.pygments.filters import get_all_filters, find_filter_class -from pip._vendor.pygments.styles import get_all_styles, get_style_by_name - - -def _parse_options(o_strs): - opts = {} - if not o_strs: - return opts - for o_str in o_strs: - if not o_str.strip(): - continue - o_args = o_str.split(',') - for o_arg in o_args: - o_arg = o_arg.strip() - try: - o_key, o_val = o_arg.split('=', 1) - o_key = o_key.strip() - o_val = o_val.strip() - except ValueError: - opts[o_arg] = True - else: - opts[o_key] = o_val - return opts - - -def _parse_filters(f_strs): - filters = [] - if not f_strs: - return filters - for f_str in f_strs: - if ':' in f_str: - fname, fopts = f_str.split(':', 1) - filters.append((fname, _parse_options([fopts]))) - else: - filters.append((f_str, {})) - return filters - - -def _print_help(what, name): - try: - if what == 'lexer': - cls = get_lexer_by_name(name) - print("Help on the %s lexer:" % cls.name) - print(dedent(cls.__doc__)) - elif what == 'formatter': - cls = find_formatter_class(name) - print("Help on the %s formatter:" % cls.name) - print(dedent(cls.__doc__)) - elif what == 'filter': - cls = find_filter_class(name) - print("Help on the %s filter:" % name) - print(dedent(cls.__doc__)) - return 0 - except (AttributeError, ValueError): - print("%s not found!" % what, file=sys.stderr) - return 1 - - -def _print_list(what): - if what == 'lexer': - print() - print("Lexers:") - print("~~~~~~~") - - info = [] - for fullname, names, exts, _ in get_all_lexers(): - tup = (', '.join(names)+':', fullname, - exts and '(filenames ' + ', '.join(exts) + ')' or '') - info.append(tup) - info.sort() - for i in info: - print(('* %s\n %s %s') % i) - - elif what == 'formatter': - print() - print("Formatters:") - print("~~~~~~~~~~~") - - info = [] - for cls in get_all_formatters(): - doc = docstring_headline(cls) - tup = (', '.join(cls.aliases) + ':', doc, cls.filenames and - '(filenames ' + ', '.join(cls.filenames) + ')' or '') - info.append(tup) - info.sort() - for i in info: - print(('* %s\n %s %s') % i) - - elif what == 'filter': - print() - print("Filters:") - print("~~~~~~~~") - - for name in get_all_filters(): - cls = find_filter_class(name) - print("* " + name + ':') - print(" %s" % docstring_headline(cls)) - - elif what == 'style': - print() - print("Styles:") - print("~~~~~~~") - - for name in get_all_styles(): - cls = get_style_by_name(name) - print("* " + name + ':') - print(" %s" % docstring_headline(cls)) - - -def _print_list_as_json(requested_items): - import json - result = {} - if 'lexer' in requested_items: - info = {} - for fullname, names, filenames, mimetypes in get_all_lexers(): - info[fullname] = { - 'aliases': names, - 'filenames': filenames, - 'mimetypes': mimetypes - } - result['lexers'] = info - - if 'formatter' in requested_items: - info = {} - for cls in get_all_formatters(): - doc = docstring_headline(cls) - info[cls.name] = { - 'aliases': cls.aliases, - 'filenames': cls.filenames, - 'doc': doc - } - result['formatters'] = info - - if 'filter' in requested_items: - info = {} - for name in get_all_filters(): - cls = find_filter_class(name) - info[name] = { - 'doc': docstring_headline(cls) - } - result['filters'] = info - - if 'style' in requested_items: - info = {} - for name in get_all_styles(): - cls = get_style_by_name(name) - info[name] = { - 'doc': docstring_headline(cls) - } - result['styles'] = info - - json.dump(result, sys.stdout) - -def main_inner(parser, argns): - if argns.help: - parser.print_help() - return 0 - - if argns.V: - print('Pygments version %s, (c) 2006-2023 by Georg Brandl, Matthäus ' - 'Chajdas and contributors.' % __version__) - return 0 - - def is_only_option(opt): - return not any(v for (k, v) in vars(argns).items() if k != opt) - - # handle ``pygmentize -L`` - if argns.L is not None: - arg_set = set() - for k, v in vars(argns).items(): - if v: - arg_set.add(k) - - arg_set.discard('L') - arg_set.discard('json') - - if arg_set: - parser.print_help(sys.stderr) - return 2 - - # print version - if not argns.json: - main(['', '-V']) - allowed_types = {'lexer', 'formatter', 'filter', 'style'} - largs = [arg.rstrip('s') for arg in argns.L] - if any(arg not in allowed_types for arg in largs): - parser.print_help(sys.stderr) - return 0 - if not largs: - largs = allowed_types - if not argns.json: - for arg in largs: - _print_list(arg) - else: - _print_list_as_json(largs) - return 0 - - # handle ``pygmentize -H`` - if argns.H: - if not is_only_option('H'): - parser.print_help(sys.stderr) - return 2 - what, name = argns.H - if what not in ('lexer', 'formatter', 'filter'): - parser.print_help(sys.stderr) - return 2 - return _print_help(what, name) - - # parse -O options - parsed_opts = _parse_options(argns.O or []) - - # parse -P options - for p_opt in argns.P or []: - try: - name, value = p_opt.split('=', 1) - except ValueError: - parsed_opts[p_opt] = True - else: - parsed_opts[name] = value - - # encodings - inencoding = parsed_opts.get('inencoding', parsed_opts.get('encoding')) - outencoding = parsed_opts.get('outencoding', parsed_opts.get('encoding')) - - # handle ``pygmentize -N`` - if argns.N: - lexer = find_lexer_class_for_filename(argns.N) - if lexer is None: - lexer = TextLexer - - print(lexer.aliases[0]) - return 0 - - # handle ``pygmentize -C`` - if argns.C: - inp = sys.stdin.buffer.read() - try: - lexer = guess_lexer(inp, inencoding=inencoding) - except ClassNotFound: - lexer = TextLexer - - print(lexer.aliases[0]) - return 0 - - # handle ``pygmentize -S`` - S_opt = argns.S - a_opt = argns.a - if S_opt is not None: - f_opt = argns.f - if not f_opt: - parser.print_help(sys.stderr) - return 2 - if argns.l or argns.INPUTFILE: - parser.print_help(sys.stderr) - return 2 - - try: - parsed_opts['style'] = S_opt - fmter = get_formatter_by_name(f_opt, **parsed_opts) - except ClassNotFound as err: - print(err, file=sys.stderr) - return 1 - - print(fmter.get_style_defs(a_opt or '')) - return 0 - - # if no -S is given, -a is not allowed - if argns.a is not None: - parser.print_help(sys.stderr) - return 2 - - # parse -F options - F_opts = _parse_filters(argns.F or []) - - # -x: allow custom (eXternal) lexers and formatters - allow_custom_lexer_formatter = bool(argns.x) - - # select lexer - lexer = None - - # given by name? - lexername = argns.l - if lexername: - # custom lexer, located relative to user's cwd - if allow_custom_lexer_formatter and '.py' in lexername: - try: - filename = None - name = None - if ':' in lexername: - filename, name = lexername.rsplit(':', 1) - - if '.py' in name: - # This can happen on Windows: If the lexername is - # C:\lexer.py -- return to normal load path in that case - name = None - - if filename and name: - lexer = load_lexer_from_file(filename, name, - **parsed_opts) - else: - lexer = load_lexer_from_file(lexername, **parsed_opts) - except ClassNotFound as err: - print('Error:', err, file=sys.stderr) - return 1 - else: - try: - lexer = get_lexer_by_name(lexername, **parsed_opts) - except (OptionError, ClassNotFound) as err: - print('Error:', err, file=sys.stderr) - return 1 - - # read input code - code = None - - if argns.INPUTFILE: - if argns.s: - print('Error: -s option not usable when input file specified', - file=sys.stderr) - return 2 - - infn = argns.INPUTFILE - try: - with open(infn, 'rb') as infp: - code = infp.read() - except Exception as err: - print('Error: cannot read infile:', err, file=sys.stderr) - return 1 - if not inencoding: - code, inencoding = guess_decode(code) - - # do we have to guess the lexer? - if not lexer: - try: - lexer = get_lexer_for_filename(infn, code, **parsed_opts) - except ClassNotFound as err: - if argns.g: - try: - lexer = guess_lexer(code, **parsed_opts) - except ClassNotFound: - lexer = TextLexer(**parsed_opts) - else: - print('Error:', err, file=sys.stderr) - return 1 - except OptionError as err: - print('Error:', err, file=sys.stderr) - return 1 - - elif not argns.s: # treat stdin as full file (-s support is later) - # read code from terminal, always in binary mode since we want to - # decode ourselves and be tolerant with it - code = sys.stdin.buffer.read() # use .buffer to get a binary stream - if not inencoding: - code, inencoding = guess_decode_from_terminal(code, sys.stdin) - # else the lexer will do the decoding - if not lexer: - try: - lexer = guess_lexer(code, **parsed_opts) - except ClassNotFound: - lexer = TextLexer(**parsed_opts) - - else: # -s option needs a lexer with -l - if not lexer: - print('Error: when using -s a lexer has to be selected with -l', - file=sys.stderr) - return 2 - - # process filters - for fname, fopts in F_opts: - try: - lexer.add_filter(fname, **fopts) - except ClassNotFound as err: - print('Error:', err, file=sys.stderr) - return 1 - - # select formatter - outfn = argns.o - fmter = argns.f - if fmter: - # custom formatter, located relative to user's cwd - if allow_custom_lexer_formatter and '.py' in fmter: - try: - filename = None - name = None - if ':' in fmter: - # Same logic as above for custom lexer - filename, name = fmter.rsplit(':', 1) - - if '.py' in name: - name = None - - if filename and name: - fmter = load_formatter_from_file(filename, name, - **parsed_opts) - else: - fmter = load_formatter_from_file(fmter, **parsed_opts) - except ClassNotFound as err: - print('Error:', err, file=sys.stderr) - return 1 - else: - try: - fmter = get_formatter_by_name(fmter, **parsed_opts) - except (OptionError, ClassNotFound) as err: - print('Error:', err, file=sys.stderr) - return 1 - - if outfn: - if not fmter: - try: - fmter = get_formatter_for_filename(outfn, **parsed_opts) - except (OptionError, ClassNotFound) as err: - print('Error:', err, file=sys.stderr) - return 1 - try: - outfile = open(outfn, 'wb') - except Exception as err: - print('Error: cannot open outfile:', err, file=sys.stderr) - return 1 - else: - if not fmter: - if os.environ.get('COLORTERM','') in ('truecolor', '24bit'): - fmter = TerminalTrueColorFormatter(**parsed_opts) - elif '256' in os.environ.get('TERM', ''): - fmter = Terminal256Formatter(**parsed_opts) - else: - fmter = TerminalFormatter(**parsed_opts) - outfile = sys.stdout.buffer - - # determine output encoding if not explicitly selected - if not outencoding: - if outfn: - # output file? use lexer encoding for now (can still be None) - fmter.encoding = inencoding - else: - # else use terminal encoding - fmter.encoding = terminal_encoding(sys.stdout) - - # provide coloring under Windows, if possible - if not outfn and sys.platform in ('win32', 'cygwin') and \ - fmter.name in ('Terminal', 'Terminal256'): # pragma: no cover - # unfortunately colorama doesn't support binary streams on Py3 - outfile = UnclosingTextIOWrapper(outfile, encoding=fmter.encoding) - fmter.encoding = None - try: - import pip._vendor.colorama.initialise as colorama_initialise - except ImportError: - pass - else: - outfile = colorama_initialise.wrap_stream( - outfile, convert=None, strip=None, autoreset=False, wrap=True) - - # When using the LaTeX formatter and the option `escapeinside` is - # specified, we need a special lexer which collects escaped text - # before running the chosen language lexer. - escapeinside = parsed_opts.get('escapeinside', '') - if len(escapeinside) == 2 and isinstance(fmter, LatexFormatter): - left = escapeinside[0] - right = escapeinside[1] - lexer = LatexEmbeddedLexer(left, right, lexer) - - # ... and do it! - if not argns.s: - # process whole input as per normal... - try: - highlight(code, lexer, fmter, outfile) - finally: - if outfn: - outfile.close() - return 0 - else: - # line by line processing of stdin (eg: for 'tail -f')... - try: - while 1: - line = sys.stdin.buffer.readline() - if not line: - break - if not inencoding: - line = guess_decode_from_terminal(line, sys.stdin)[0] - highlight(line, lexer, fmter, outfile) - if hasattr(outfile, 'flush'): - outfile.flush() - return 0 - except KeyboardInterrupt: # pragma: no cover - return 0 - finally: - if outfn: - outfile.close() - - -class HelpFormatter(argparse.HelpFormatter): - def __init__(self, prog, indent_increment=2, max_help_position=16, width=None): - if width is None: - try: - width = shutil.get_terminal_size().columns - 2 - except Exception: - pass - argparse.HelpFormatter.__init__(self, prog, indent_increment, - max_help_position, width) - - -def main(args=sys.argv): - """ - Main command line entry point. - """ - desc = "Highlight an input file and write the result to an output file." - parser = argparse.ArgumentParser(description=desc, add_help=False, - formatter_class=HelpFormatter) - - operation = parser.add_argument_group('Main operation') - lexersel = operation.add_mutually_exclusive_group() - lexersel.add_argument( - '-l', metavar='LEXER', - help='Specify the lexer to use. (Query names with -L.) If not ' - 'given and -g is not present, the lexer is guessed from the filename.') - lexersel.add_argument( - '-g', action='store_true', - help='Guess the lexer from the file contents, or pass through ' - 'as plain text if nothing can be guessed.') - operation.add_argument( - '-F', metavar='FILTER[:options]', action='append', - help='Add a filter to the token stream. (Query names with -L.) ' - 'Filter options are given after a colon if necessary.') - operation.add_argument( - '-f', metavar='FORMATTER', - help='Specify the formatter to use. (Query names with -L.) ' - 'If not given, the formatter is guessed from the output filename, ' - 'and defaults to the terminal formatter if the output is to the ' - 'terminal or an unknown file extension.') - operation.add_argument( - '-O', metavar='OPTION=value[,OPTION=value,...]', action='append', - help='Give options to the lexer and formatter as a comma-separated ' - 'list of key-value pairs. ' - 'Example: `-O bg=light,python=cool`.') - operation.add_argument( - '-P', metavar='OPTION=value', action='append', - help='Give a single option to the lexer and formatter - with this ' - 'you can pass options whose value contains commas and equal signs. ' - 'Example: `-P "heading=Pygments, the Python highlighter"`.') - operation.add_argument( - '-o', metavar='OUTPUTFILE', - help='Where to write the output. Defaults to standard output.') - - operation.add_argument( - 'INPUTFILE', nargs='?', - help='Where to read the input. Defaults to standard input.') - - flags = parser.add_argument_group('Operation flags') - flags.add_argument( - '-v', action='store_true', - help='Print a detailed traceback on unhandled exceptions, which ' - 'is useful for debugging and bug reports.') - flags.add_argument( - '-s', action='store_true', - help='Process lines one at a time until EOF, rather than waiting to ' - 'process the entire file. This only works for stdin, only for lexers ' - 'with no line-spanning constructs, and is intended for streaming ' - 'input such as you get from `tail -f`. ' - 'Example usage: `tail -f sql.log | pygmentize -s -l sql`.') - flags.add_argument( - '-x', action='store_true', - help='Allow custom lexers and formatters to be loaded from a .py file ' - 'relative to the current working directory. For example, ' - '`-l ./customlexer.py -x`. By default, this option expects a file ' - 'with a class named CustomLexer or CustomFormatter; you can also ' - 'specify your own class name with a colon (`-l ./lexer.py:MyLexer`). ' - 'Users should be very careful not to use this option with untrusted ' - 'files, because it will import and run them.') - flags.add_argument('--json', help='Output as JSON. This can ' - 'be only used in conjunction with -L.', - default=False, - action='store_true') - - special_modes_group = parser.add_argument_group( - 'Special modes - do not do any highlighting') - special_modes = special_modes_group.add_mutually_exclusive_group() - special_modes.add_argument( - '-S', metavar='STYLE -f formatter', - help='Print style definitions for STYLE for a formatter ' - 'given with -f. The argument given by -a is formatter ' - 'dependent.') - special_modes.add_argument( - '-L', nargs='*', metavar='WHAT', - help='List lexers, formatters, styles or filters -- ' - 'give additional arguments for the thing(s) you want to list ' - '(e.g. "styles"), or omit them to list everything.') - special_modes.add_argument( - '-N', metavar='FILENAME', - help='Guess and print out a lexer name based solely on the given ' - 'filename. Does not take input or highlight anything. If no specific ' - 'lexer can be determined, "text" is printed.') - special_modes.add_argument( - '-C', action='store_true', - help='Like -N, but print out a lexer name based solely on ' - 'a given content from standard input.') - special_modes.add_argument( - '-H', action='store', nargs=2, metavar=('NAME', 'TYPE'), - help='Print detailed help for the object <name> of type <type>, ' - 'where <type> is one of "lexer", "formatter" or "filter".') - special_modes.add_argument( - '-V', action='store_true', - help='Print the package version.') - special_modes.add_argument( - '-h', '--help', action='store_true', - help='Print this help.') - special_modes_group.add_argument( - '-a', metavar='ARG', - help='Formatter-specific additional argument for the -S (print ' - 'style sheet) mode.') - - argns = parser.parse_args(args[1:]) - - try: - return main_inner(parser, argns) - except BrokenPipeError: - # someone closed our stdout, e.g. by quitting a pager. - return 0 - except Exception: - if argns.v: - print(file=sys.stderr) - print('*' * 65, file=sys.stderr) - print('An unhandled exception occurred while highlighting.', - file=sys.stderr) - print('Please report the whole traceback to the issue tracker at', - file=sys.stderr) - print('<https://github.com/pygments/pygments/issues>.', - file=sys.stderr) - print('*' * 65, file=sys.stderr) - print(file=sys.stderr) - raise - import traceback - info = traceback.format_exception(*sys.exc_info()) - msg = info[-1].strip() - if len(info) >= 3: - # extract relevant file and position info - msg += '\n (f%s)' % info[-2].split('\n')[0].strip()[1:] - print(file=sys.stderr) - print('*** Error while highlighting:', file=sys.stderr) - print(msg, file=sys.stderr) - print('*** If this is a bug you want to report, please rerun with -v.', - file=sys.stderr) - return 1 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/console.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/console.py deleted file mode 100644 index deb4937..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/console.py +++ /dev/null @@ -1,70 +0,0 @@ -""" - pygments.console - ~~~~~~~~~~~~~~~~ - - Format colored console output. - - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -esc = "\x1b[" - -codes = {} -codes[""] = "" -codes["reset"] = esc + "39;49;00m" - -codes["bold"] = esc + "01m" -codes["faint"] = esc + "02m" -codes["standout"] = esc + "03m" -codes["underline"] = esc + "04m" -codes["blink"] = esc + "05m" -codes["overline"] = esc + "06m" - -dark_colors = ["black", "red", "green", "yellow", "blue", - "magenta", "cyan", "gray"] -light_colors = ["brightblack", "brightred", "brightgreen", "brightyellow", "brightblue", - "brightmagenta", "brightcyan", "white"] - -x = 30 -for d, l in zip(dark_colors, light_colors): - codes[d] = esc + "%im" % x - codes[l] = esc + "%im" % (60 + x) - x += 1 - -del d, l, x - -codes["white"] = codes["bold"] - - -def reset_color(): - return codes["reset"] - - -def colorize(color_key, text): - return codes[color_key] + text + codes["reset"] - - -def ansiformat(attr, text): - """ - Format ``text`` with a color and/or some attributes:: - - color normal color - *color* bold color - _color_ underlined color - +color+ blinking color - """ - result = [] - if attr[:1] == attr[-1:] == '+': - result.append(codes['blink']) - attr = attr[1:-1] - if attr[:1] == attr[-1:] == '*': - result.append(codes['bold']) - attr = attr[1:-1] - if attr[:1] == attr[-1:] == '_': - result.append(codes['underline']) - attr = attr[1:-1] - result.append(codes[attr]) - result.append(text) - result.append(codes['reset']) - return ''.join(result) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/filter.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/filter.py deleted file mode 100644 index dafa08d..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/filter.py +++ /dev/null @@ -1,71 +0,0 @@ -""" - pygments.filter - ~~~~~~~~~~~~~~~ - - Module that implements the default filter. - - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - - -def apply_filters(stream, filters, lexer=None): - """ - Use this method to apply an iterable of filters to - a stream. If lexer is given it's forwarded to the - filter, otherwise the filter receives `None`. - """ - def _apply(filter_, stream): - yield from filter_.filter(lexer, stream) - for filter_ in filters: - stream = _apply(filter_, stream) - return stream - - -def simplefilter(f): - """ - Decorator that converts a function into a filter:: - - @simplefilter - def lowercase(self, lexer, stream, options): - for ttype, value in stream: - yield ttype, value.lower() - """ - return type(f.__name__, (FunctionFilter,), { - '__module__': getattr(f, '__module__'), - '__doc__': f.__doc__, - 'function': f, - }) - - -class Filter: - """ - Default filter. Subclass this class or use the `simplefilter` - decorator to create own filters. - """ - - def __init__(self, **options): - self.options = options - - def filter(self, lexer, stream): - raise NotImplementedError() - - -class FunctionFilter(Filter): - """ - Abstract class used by `simplefilter` to create simple - function filters on the fly. The `simplefilter` decorator - automatically creates subclasses of this class for - functions passed to it. - """ - function = None - - def __init__(self, **options): - if not hasattr(self, 'function'): - raise TypeError('%r used without bound function' % - self.__class__.__name__) - Filter.__init__(self, **options) - - def filter(self, lexer, stream): - # pylint: disable=not-callable - yield from self.function(lexer, stream, self.options) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__init__.py deleted file mode 100644 index 5aa9ecb..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__init__.py +++ /dev/null @@ -1,940 +0,0 @@ -""" - pygments.filters - ~~~~~~~~~~~~~~~~ - - Module containing filter lookup functions and default - filters. - - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -import re - -from pip._vendor.pygments.token import String, Comment, Keyword, Name, Error, Whitespace, \ - string_to_tokentype -from pip._vendor.pygments.filter import Filter -from pip._vendor.pygments.util import get_list_opt, get_int_opt, get_bool_opt, \ - get_choice_opt, ClassNotFound, OptionError -from pip._vendor.pygments.plugin import find_plugin_filters - - -def find_filter_class(filtername): - """Lookup a filter by name. Return None if not found.""" - if filtername in FILTERS: - return FILTERS[filtername] - for name, cls in find_plugin_filters(): - if name == filtername: - return cls - return None - - -def get_filter_by_name(filtername, **options): - """Return an instantiated filter. - - Options are passed to the filter initializer if wanted. - Raise a ClassNotFound if not found. - """ - cls = find_filter_class(filtername) - if cls: - return cls(**options) - else: - raise ClassNotFound('filter %r not found' % filtername) - - -def get_all_filters(): - """Return a generator of all filter names.""" - yield from FILTERS - for name, _ in find_plugin_filters(): - yield name - - -def _replace_special(ttype, value, regex, specialttype, - replacefunc=lambda x: x): - last = 0 - for match in regex.finditer(value): - start, end = match.start(), match.end() - if start != last: - yield ttype, value[last:start] - yield specialttype, replacefunc(value[start:end]) - last = end - if last != len(value): - yield ttype, value[last:] - - -class CodeTagFilter(Filter): - """Highlight special code tags in comments and docstrings. - - Options accepted: - - `codetags` : list of strings - A list of strings that are flagged as code tags. The default is to - highlight ``XXX``, ``TODO``, ``FIXME``, ``BUG`` and ``NOTE``. - - .. versionchanged:: 2.13 - Now recognizes ``FIXME`` by default. - """ - - def __init__(self, **options): - Filter.__init__(self, **options) - tags = get_list_opt(options, 'codetags', - ['XXX', 'TODO', 'FIXME', 'BUG', 'NOTE']) - self.tag_re = re.compile(r'\b(%s)\b' % '|'.join([ - re.escape(tag) for tag in tags if tag - ])) - - def filter(self, lexer, stream): - regex = self.tag_re - for ttype, value in stream: - if ttype in String.Doc or \ - ttype in Comment and \ - ttype not in Comment.Preproc: - yield from _replace_special(ttype, value, regex, Comment.Special) - else: - yield ttype, value - - -class SymbolFilter(Filter): - """Convert mathematical symbols such as \\<longrightarrow> in Isabelle - or \\longrightarrow in LaTeX into Unicode characters. - - This is mostly useful for HTML or console output when you want to - approximate the source rendering you'd see in an IDE. - - Options accepted: - - `lang` : string - The symbol language. Must be one of ``'isabelle'`` or - ``'latex'``. The default is ``'isabelle'``. - """ - - latex_symbols = { - '\\alpha' : '\U000003b1', - '\\beta' : '\U000003b2', - '\\gamma' : '\U000003b3', - '\\delta' : '\U000003b4', - '\\varepsilon' : '\U000003b5', - '\\zeta' : '\U000003b6', - '\\eta' : '\U000003b7', - '\\vartheta' : '\U000003b8', - '\\iota' : '\U000003b9', - '\\kappa' : '\U000003ba', - '\\lambda' : '\U000003bb', - '\\mu' : '\U000003bc', - '\\nu' : '\U000003bd', - '\\xi' : '\U000003be', - '\\pi' : '\U000003c0', - '\\varrho' : '\U000003c1', - '\\sigma' : '\U000003c3', - '\\tau' : '\U000003c4', - '\\upsilon' : '\U000003c5', - '\\varphi' : '\U000003c6', - '\\chi' : '\U000003c7', - '\\psi' : '\U000003c8', - '\\omega' : '\U000003c9', - '\\Gamma' : '\U00000393', - '\\Delta' : '\U00000394', - '\\Theta' : '\U00000398', - '\\Lambda' : '\U0000039b', - '\\Xi' : '\U0000039e', - '\\Pi' : '\U000003a0', - '\\Sigma' : '\U000003a3', - '\\Upsilon' : '\U000003a5', - '\\Phi' : '\U000003a6', - '\\Psi' : '\U000003a8', - '\\Omega' : '\U000003a9', - '\\leftarrow' : '\U00002190', - '\\longleftarrow' : '\U000027f5', - '\\rightarrow' : '\U00002192', - '\\longrightarrow' : '\U000027f6', - '\\Leftarrow' : '\U000021d0', - '\\Longleftarrow' : '\U000027f8', - '\\Rightarrow' : '\U000021d2', - '\\Longrightarrow' : '\U000027f9', - '\\leftrightarrow' : '\U00002194', - '\\longleftrightarrow' : '\U000027f7', - '\\Leftrightarrow' : '\U000021d4', - '\\Longleftrightarrow' : '\U000027fa', - '\\mapsto' : '\U000021a6', - '\\longmapsto' : '\U000027fc', - '\\relbar' : '\U00002500', - '\\Relbar' : '\U00002550', - '\\hookleftarrow' : '\U000021a9', - '\\hookrightarrow' : '\U000021aa', - '\\leftharpoondown' : '\U000021bd', - '\\rightharpoondown' : '\U000021c1', - '\\leftharpoonup' : '\U000021bc', - '\\rightharpoonup' : '\U000021c0', - '\\rightleftharpoons' : '\U000021cc', - '\\leadsto' : '\U0000219d', - '\\downharpoonleft' : '\U000021c3', - '\\downharpoonright' : '\U000021c2', - '\\upharpoonleft' : '\U000021bf', - '\\upharpoonright' : '\U000021be', - '\\restriction' : '\U000021be', - '\\uparrow' : '\U00002191', - '\\Uparrow' : '\U000021d1', - '\\downarrow' : '\U00002193', - '\\Downarrow' : '\U000021d3', - '\\updownarrow' : '\U00002195', - '\\Updownarrow' : '\U000021d5', - '\\langle' : '\U000027e8', - '\\rangle' : '\U000027e9', - '\\lceil' : '\U00002308', - '\\rceil' : '\U00002309', - '\\lfloor' : '\U0000230a', - '\\rfloor' : '\U0000230b', - '\\flqq' : '\U000000ab', - '\\frqq' : '\U000000bb', - '\\bot' : '\U000022a5', - '\\top' : '\U000022a4', - '\\wedge' : '\U00002227', - '\\bigwedge' : '\U000022c0', - '\\vee' : '\U00002228', - '\\bigvee' : '\U000022c1', - '\\forall' : '\U00002200', - '\\exists' : '\U00002203', - '\\nexists' : '\U00002204', - '\\neg' : '\U000000ac', - '\\Box' : '\U000025a1', - '\\Diamond' : '\U000025c7', - '\\vdash' : '\U000022a2', - '\\models' : '\U000022a8', - '\\dashv' : '\U000022a3', - '\\surd' : '\U0000221a', - '\\le' : '\U00002264', - '\\ge' : '\U00002265', - '\\ll' : '\U0000226a', - '\\gg' : '\U0000226b', - '\\lesssim' : '\U00002272', - '\\gtrsim' : '\U00002273', - '\\lessapprox' : '\U00002a85', - '\\gtrapprox' : '\U00002a86', - '\\in' : '\U00002208', - '\\notin' : '\U00002209', - '\\subset' : '\U00002282', - '\\supset' : '\U00002283', - '\\subseteq' : '\U00002286', - '\\supseteq' : '\U00002287', - '\\sqsubset' : '\U0000228f', - '\\sqsupset' : '\U00002290', - '\\sqsubseteq' : '\U00002291', - '\\sqsupseteq' : '\U00002292', - '\\cap' : '\U00002229', - '\\bigcap' : '\U000022c2', - '\\cup' : '\U0000222a', - '\\bigcup' : '\U000022c3', - '\\sqcup' : '\U00002294', - '\\bigsqcup' : '\U00002a06', - '\\sqcap' : '\U00002293', - '\\Bigsqcap' : '\U00002a05', - '\\setminus' : '\U00002216', - '\\propto' : '\U0000221d', - '\\uplus' : '\U0000228e', - '\\bigplus' : '\U00002a04', - '\\sim' : '\U0000223c', - '\\doteq' : '\U00002250', - '\\simeq' : '\U00002243', - '\\approx' : '\U00002248', - '\\asymp' : '\U0000224d', - '\\cong' : '\U00002245', - '\\equiv' : '\U00002261', - '\\Join' : '\U000022c8', - '\\bowtie' : '\U00002a1d', - '\\prec' : '\U0000227a', - '\\succ' : '\U0000227b', - '\\preceq' : '\U0000227c', - '\\succeq' : '\U0000227d', - '\\parallel' : '\U00002225', - '\\mid' : '\U000000a6', - '\\pm' : '\U000000b1', - '\\mp' : '\U00002213', - '\\times' : '\U000000d7', - '\\div' : '\U000000f7', - '\\cdot' : '\U000022c5', - '\\star' : '\U000022c6', - '\\circ' : '\U00002218', - '\\dagger' : '\U00002020', - '\\ddagger' : '\U00002021', - '\\lhd' : '\U000022b2', - '\\rhd' : '\U000022b3', - '\\unlhd' : '\U000022b4', - '\\unrhd' : '\U000022b5', - '\\triangleleft' : '\U000025c3', - '\\triangleright' : '\U000025b9', - '\\triangle' : '\U000025b3', - '\\triangleq' : '\U0000225c', - '\\oplus' : '\U00002295', - '\\bigoplus' : '\U00002a01', - '\\otimes' : '\U00002297', - '\\bigotimes' : '\U00002a02', - '\\odot' : '\U00002299', - '\\bigodot' : '\U00002a00', - '\\ominus' : '\U00002296', - '\\oslash' : '\U00002298', - '\\dots' : '\U00002026', - '\\cdots' : '\U000022ef', - '\\sum' : '\U00002211', - '\\prod' : '\U0000220f', - '\\coprod' : '\U00002210', - '\\infty' : '\U0000221e', - '\\int' : '\U0000222b', - '\\oint' : '\U0000222e', - '\\clubsuit' : '\U00002663', - '\\diamondsuit' : '\U00002662', - '\\heartsuit' : '\U00002661', - '\\spadesuit' : '\U00002660', - '\\aleph' : '\U00002135', - '\\emptyset' : '\U00002205', - '\\nabla' : '\U00002207', - '\\partial' : '\U00002202', - '\\flat' : '\U0000266d', - '\\natural' : '\U0000266e', - '\\sharp' : '\U0000266f', - '\\angle' : '\U00002220', - '\\copyright' : '\U000000a9', - '\\textregistered' : '\U000000ae', - '\\textonequarter' : '\U000000bc', - '\\textonehalf' : '\U000000bd', - '\\textthreequarters' : '\U000000be', - '\\textordfeminine' : '\U000000aa', - '\\textordmasculine' : '\U000000ba', - '\\euro' : '\U000020ac', - '\\pounds' : '\U000000a3', - '\\yen' : '\U000000a5', - '\\textcent' : '\U000000a2', - '\\textcurrency' : '\U000000a4', - '\\textdegree' : '\U000000b0', - } - - isabelle_symbols = { - '\\<zero>' : '\U0001d7ec', - '\\<one>' : '\U0001d7ed', - '\\<two>' : '\U0001d7ee', - '\\<three>' : '\U0001d7ef', - '\\<four>' : '\U0001d7f0', - '\\<five>' : '\U0001d7f1', - '\\<six>' : '\U0001d7f2', - '\\<seven>' : '\U0001d7f3', - '\\<eight>' : '\U0001d7f4', - '\\<nine>' : '\U0001d7f5', - '\\<A>' : '\U0001d49c', - '\\<B>' : '\U0000212c', - '\\<C>' : '\U0001d49e', - '\\<D>' : '\U0001d49f', - '\\<E>' : '\U00002130', - '\\<F>' : '\U00002131', - '\\<G>' : '\U0001d4a2', - '\\<H>' : '\U0000210b', - '\\<I>' : '\U00002110', - '\\<J>' : '\U0001d4a5', - '\\<K>' : '\U0001d4a6', - '\\<L>' : '\U00002112', - '\\<M>' : '\U00002133', - '\\<N>' : '\U0001d4a9', - '\\<O>' : '\U0001d4aa', - '\\<P>' : '\U0001d4ab', - '\\<Q>' : '\U0001d4ac', - '\\<R>' : '\U0000211b', - '\\<S>' : '\U0001d4ae', - '\\<T>' : '\U0001d4af', - '\\<U>' : '\U0001d4b0', - '\\<V>' : '\U0001d4b1', - '\\<W>' : '\U0001d4b2', - '\\<X>' : '\U0001d4b3', - '\\<Y>' : '\U0001d4b4', - '\\<Z>' : '\U0001d4b5', - '\\<a>' : '\U0001d5ba', - '\\<b>' : '\U0001d5bb', - '\\<c>' : '\U0001d5bc', - '\\<d>' : '\U0001d5bd', - '\\<e>' : '\U0001d5be', - '\\<f>' : '\U0001d5bf', - '\\<g>' : '\U0001d5c0', - '\\<h>' : '\U0001d5c1', - '\\<i>' : '\U0001d5c2', - '\\<j>' : '\U0001d5c3', - '\\<k>' : '\U0001d5c4', - '\\<l>' : '\U0001d5c5', - '\\<m>' : '\U0001d5c6', - '\\<n>' : '\U0001d5c7', - '\\<o>' : '\U0001d5c8', - '\\<p>' : '\U0001d5c9', - '\\<q>' : '\U0001d5ca', - '\\<r>' : '\U0001d5cb', - '\\<s>' : '\U0001d5cc', - '\\<t>' : '\U0001d5cd', - '\\<u>' : '\U0001d5ce', - '\\<v>' : '\U0001d5cf', - '\\<w>' : '\U0001d5d0', - '\\<x>' : '\U0001d5d1', - '\\<y>' : '\U0001d5d2', - '\\<z>' : '\U0001d5d3', - '\\<AA>' : '\U0001d504', - '\\<BB>' : '\U0001d505', - '\\<CC>' : '\U0000212d', - '\\<DD>' : '\U0001d507', - '\\<EE>' : '\U0001d508', - '\\<FF>' : '\U0001d509', - '\\<GG>' : '\U0001d50a', - '\\<HH>' : '\U0000210c', - '\\<II>' : '\U00002111', - '\\<JJ>' : '\U0001d50d', - '\\<KK>' : '\U0001d50e', - '\\<LL>' : '\U0001d50f', - '\\<MM>' : '\U0001d510', - '\\<NN>' : '\U0001d511', - '\\<OO>' : '\U0001d512', - '\\<PP>' : '\U0001d513', - '\\<QQ>' : '\U0001d514', - '\\<RR>' : '\U0000211c', - '\\<SS>' : '\U0001d516', - '\\<TT>' : '\U0001d517', - '\\<UU>' : '\U0001d518', - '\\<VV>' : '\U0001d519', - '\\<WW>' : '\U0001d51a', - '\\<XX>' : '\U0001d51b', - '\\<YY>' : '\U0001d51c', - '\\<ZZ>' : '\U00002128', - '\\<aa>' : '\U0001d51e', - '\\<bb>' : '\U0001d51f', - '\\<cc>' : '\U0001d520', - '\\<dd>' : '\U0001d521', - '\\<ee>' : '\U0001d522', - '\\<ff>' : '\U0001d523', - '\\<gg>' : '\U0001d524', - '\\<hh>' : '\U0001d525', - '\\<ii>' : '\U0001d526', - '\\<jj>' : '\U0001d527', - '\\<kk>' : '\U0001d528', - '\\<ll>' : '\U0001d529', - '\\<mm>' : '\U0001d52a', - '\\<nn>' : '\U0001d52b', - '\\<oo>' : '\U0001d52c', - '\\<pp>' : '\U0001d52d', - '\\<qq>' : '\U0001d52e', - '\\<rr>' : '\U0001d52f', - '\\<ss>' : '\U0001d530', - '\\<tt>' : '\U0001d531', - '\\<uu>' : '\U0001d532', - '\\<vv>' : '\U0001d533', - '\\<ww>' : '\U0001d534', - '\\<xx>' : '\U0001d535', - '\\<yy>' : '\U0001d536', - '\\<zz>' : '\U0001d537', - '\\<alpha>' : '\U000003b1', - '\\<beta>' : '\U000003b2', - '\\<gamma>' : '\U000003b3', - '\\<delta>' : '\U000003b4', - '\\<epsilon>' : '\U000003b5', - '\\<zeta>' : '\U000003b6', - '\\<eta>' : '\U000003b7', - '\\<theta>' : '\U000003b8', - '\\<iota>' : '\U000003b9', - '\\<kappa>' : '\U000003ba', - '\\<lambda>' : '\U000003bb', - '\\<mu>' : '\U000003bc', - '\\<nu>' : '\U000003bd', - '\\<xi>' : '\U000003be', - '\\<pi>' : '\U000003c0', - '\\<rho>' : '\U000003c1', - '\\<sigma>' : '\U000003c3', - '\\<tau>' : '\U000003c4', - '\\<upsilon>' : '\U000003c5', - '\\<phi>' : '\U000003c6', - '\\<chi>' : '\U000003c7', - '\\<psi>' : '\U000003c8', - '\\<omega>' : '\U000003c9', - '\\<Gamma>' : '\U00000393', - '\\<Delta>' : '\U00000394', - '\\<Theta>' : '\U00000398', - '\\<Lambda>' : '\U0000039b', - '\\<Xi>' : '\U0000039e', - '\\<Pi>' : '\U000003a0', - '\\<Sigma>' : '\U000003a3', - '\\<Upsilon>' : '\U000003a5', - '\\<Phi>' : '\U000003a6', - '\\<Psi>' : '\U000003a8', - '\\<Omega>' : '\U000003a9', - '\\<bool>' : '\U0001d539', - '\\<complex>' : '\U00002102', - '\\<nat>' : '\U00002115', - '\\<rat>' : '\U0000211a', - '\\<real>' : '\U0000211d', - '\\<int>' : '\U00002124', - '\\<leftarrow>' : '\U00002190', - '\\<longleftarrow>' : '\U000027f5', - '\\<rightarrow>' : '\U00002192', - '\\<longrightarrow>' : '\U000027f6', - '\\<Leftarrow>' : '\U000021d0', - '\\<Longleftarrow>' : '\U000027f8', - '\\<Rightarrow>' : '\U000021d2', - '\\<Longrightarrow>' : '\U000027f9', - '\\<leftrightarrow>' : '\U00002194', - '\\<longleftrightarrow>' : '\U000027f7', - '\\<Leftrightarrow>' : '\U000021d4', - '\\<Longleftrightarrow>' : '\U000027fa', - '\\<mapsto>' : '\U000021a6', - '\\<longmapsto>' : '\U000027fc', - '\\<midarrow>' : '\U00002500', - '\\<Midarrow>' : '\U00002550', - '\\<hookleftarrow>' : '\U000021a9', - '\\<hookrightarrow>' : '\U000021aa', - '\\<leftharpoondown>' : '\U000021bd', - '\\<rightharpoondown>' : '\U000021c1', - '\\<leftharpoonup>' : '\U000021bc', - '\\<rightharpoonup>' : '\U000021c0', - '\\<rightleftharpoons>' : '\U000021cc', - '\\<leadsto>' : '\U0000219d', - '\\<downharpoonleft>' : '\U000021c3', - '\\<downharpoonright>' : '\U000021c2', - '\\<upharpoonleft>' : '\U000021bf', - '\\<upharpoonright>' : '\U000021be', - '\\<restriction>' : '\U000021be', - '\\<Colon>' : '\U00002237', - '\\<up>' : '\U00002191', - '\\<Up>' : '\U000021d1', - '\\<down>' : '\U00002193', - '\\<Down>' : '\U000021d3', - '\\<updown>' : '\U00002195', - '\\<Updown>' : '\U000021d5', - '\\<langle>' : '\U000027e8', - '\\<rangle>' : '\U000027e9', - '\\<lceil>' : '\U00002308', - '\\<rceil>' : '\U00002309', - '\\<lfloor>' : '\U0000230a', - '\\<rfloor>' : '\U0000230b', - '\\<lparr>' : '\U00002987', - '\\<rparr>' : '\U00002988', - '\\<lbrakk>' : '\U000027e6', - '\\<rbrakk>' : '\U000027e7', - '\\<lbrace>' : '\U00002983', - '\\<rbrace>' : '\U00002984', - '\\<guillemotleft>' : '\U000000ab', - '\\<guillemotright>' : '\U000000bb', - '\\<bottom>' : '\U000022a5', - '\\<top>' : '\U000022a4', - '\\<and>' : '\U00002227', - '\\<And>' : '\U000022c0', - '\\<or>' : '\U00002228', - '\\<Or>' : '\U000022c1', - '\\<forall>' : '\U00002200', - '\\<exists>' : '\U00002203', - '\\<nexists>' : '\U00002204', - '\\<not>' : '\U000000ac', - '\\<box>' : '\U000025a1', - '\\<diamond>' : '\U000025c7', - '\\<turnstile>' : '\U000022a2', - '\\<Turnstile>' : '\U000022a8', - '\\<tturnstile>' : '\U000022a9', - '\\<TTurnstile>' : '\U000022ab', - '\\<stileturn>' : '\U000022a3', - '\\<surd>' : '\U0000221a', - '\\<le>' : '\U00002264', - '\\<ge>' : '\U00002265', - '\\<lless>' : '\U0000226a', - '\\<ggreater>' : '\U0000226b', - '\\<lesssim>' : '\U00002272', - '\\<greatersim>' : '\U00002273', - '\\<lessapprox>' : '\U00002a85', - '\\<greaterapprox>' : '\U00002a86', - '\\<in>' : '\U00002208', - '\\<notin>' : '\U00002209', - '\\<subset>' : '\U00002282', - '\\<supset>' : '\U00002283', - '\\<subseteq>' : '\U00002286', - '\\<supseteq>' : '\U00002287', - '\\<sqsubset>' : '\U0000228f', - '\\<sqsupset>' : '\U00002290', - '\\<sqsubseteq>' : '\U00002291', - '\\<sqsupseteq>' : '\U00002292', - '\\<inter>' : '\U00002229', - '\\<Inter>' : '\U000022c2', - '\\<union>' : '\U0000222a', - '\\<Union>' : '\U000022c3', - '\\<squnion>' : '\U00002294', - '\\<Squnion>' : '\U00002a06', - '\\<sqinter>' : '\U00002293', - '\\<Sqinter>' : '\U00002a05', - '\\<setminus>' : '\U00002216', - '\\<propto>' : '\U0000221d', - '\\<uplus>' : '\U0000228e', - '\\<Uplus>' : '\U00002a04', - '\\<noteq>' : '\U00002260', - '\\<sim>' : '\U0000223c', - '\\<doteq>' : '\U00002250', - '\\<simeq>' : '\U00002243', - '\\<approx>' : '\U00002248', - '\\<asymp>' : '\U0000224d', - '\\<cong>' : '\U00002245', - '\\<smile>' : '\U00002323', - '\\<equiv>' : '\U00002261', - '\\<frown>' : '\U00002322', - '\\<Join>' : '\U000022c8', - '\\<bowtie>' : '\U00002a1d', - '\\<prec>' : '\U0000227a', - '\\<succ>' : '\U0000227b', - '\\<preceq>' : '\U0000227c', - '\\<succeq>' : '\U0000227d', - '\\<parallel>' : '\U00002225', - '\\<bar>' : '\U000000a6', - '\\<plusminus>' : '\U000000b1', - '\\<minusplus>' : '\U00002213', - '\\<times>' : '\U000000d7', - '\\<div>' : '\U000000f7', - '\\<cdot>' : '\U000022c5', - '\\<star>' : '\U000022c6', - '\\<bullet>' : '\U00002219', - '\\<circ>' : '\U00002218', - '\\<dagger>' : '\U00002020', - '\\<ddagger>' : '\U00002021', - '\\<lhd>' : '\U000022b2', - '\\<rhd>' : '\U000022b3', - '\\<unlhd>' : '\U000022b4', - '\\<unrhd>' : '\U000022b5', - '\\<triangleleft>' : '\U000025c3', - '\\<triangleright>' : '\U000025b9', - '\\<triangle>' : '\U000025b3', - '\\<triangleq>' : '\U0000225c', - '\\<oplus>' : '\U00002295', - '\\<Oplus>' : '\U00002a01', - '\\<otimes>' : '\U00002297', - '\\<Otimes>' : '\U00002a02', - '\\<odot>' : '\U00002299', - '\\<Odot>' : '\U00002a00', - '\\<ominus>' : '\U00002296', - '\\<oslash>' : '\U00002298', - '\\<dots>' : '\U00002026', - '\\<cdots>' : '\U000022ef', - '\\<Sum>' : '\U00002211', - '\\<Prod>' : '\U0000220f', - '\\<Coprod>' : '\U00002210', - '\\<infinity>' : '\U0000221e', - '\\<integral>' : '\U0000222b', - '\\<ointegral>' : '\U0000222e', - '\\<clubsuit>' : '\U00002663', - '\\<diamondsuit>' : '\U00002662', - '\\<heartsuit>' : '\U00002661', - '\\<spadesuit>' : '\U00002660', - '\\<aleph>' : '\U00002135', - '\\<emptyset>' : '\U00002205', - '\\<nabla>' : '\U00002207', - '\\<partial>' : '\U00002202', - '\\<flat>' : '\U0000266d', - '\\<natural>' : '\U0000266e', - '\\<sharp>' : '\U0000266f', - '\\<angle>' : '\U00002220', - '\\<copyright>' : '\U000000a9', - '\\<registered>' : '\U000000ae', - '\\<hyphen>' : '\U000000ad', - '\\<inverse>' : '\U000000af', - '\\<onequarter>' : '\U000000bc', - '\\<onehalf>' : '\U000000bd', - '\\<threequarters>' : '\U000000be', - '\\<ordfeminine>' : '\U000000aa', - '\\<ordmasculine>' : '\U000000ba', - '\\<section>' : '\U000000a7', - '\\<paragraph>' : '\U000000b6', - '\\<exclamdown>' : '\U000000a1', - '\\<questiondown>' : '\U000000bf', - '\\<euro>' : '\U000020ac', - '\\<pounds>' : '\U000000a3', - '\\<yen>' : '\U000000a5', - '\\<cent>' : '\U000000a2', - '\\<currency>' : '\U000000a4', - '\\<degree>' : '\U000000b0', - '\\<amalg>' : '\U00002a3f', - '\\<mho>' : '\U00002127', - '\\<lozenge>' : '\U000025ca', - '\\<wp>' : '\U00002118', - '\\<wrong>' : '\U00002240', - '\\<struct>' : '\U000022c4', - '\\<acute>' : '\U000000b4', - '\\<index>' : '\U00000131', - '\\<dieresis>' : '\U000000a8', - '\\<cedilla>' : '\U000000b8', - '\\<hungarumlaut>' : '\U000002dd', - '\\<some>' : '\U000003f5', - '\\<newline>' : '\U000023ce', - '\\<open>' : '\U00002039', - '\\<close>' : '\U0000203a', - '\\<here>' : '\U00002302', - '\\<^sub>' : '\U000021e9', - '\\<^sup>' : '\U000021e7', - '\\<^bold>' : '\U00002759', - '\\<^bsub>' : '\U000021d8', - '\\<^esub>' : '\U000021d9', - '\\<^bsup>' : '\U000021d7', - '\\<^esup>' : '\U000021d6', - } - - lang_map = {'isabelle' : isabelle_symbols, 'latex' : latex_symbols} - - def __init__(self, **options): - Filter.__init__(self, **options) - lang = get_choice_opt(options, 'lang', - ['isabelle', 'latex'], 'isabelle') - self.symbols = self.lang_map[lang] - - def filter(self, lexer, stream): - for ttype, value in stream: - if value in self.symbols: - yield ttype, self.symbols[value] - else: - yield ttype, value - - -class KeywordCaseFilter(Filter): - """Convert keywords to lowercase or uppercase or capitalize them, which - means first letter uppercase, rest lowercase. - - This can be useful e.g. if you highlight Pascal code and want to adapt the - code to your styleguide. - - Options accepted: - - `case` : string - The casing to convert keywords to. Must be one of ``'lower'``, - ``'upper'`` or ``'capitalize'``. The default is ``'lower'``. - """ - - def __init__(self, **options): - Filter.__init__(self, **options) - case = get_choice_opt(options, 'case', - ['lower', 'upper', 'capitalize'], 'lower') - self.convert = getattr(str, case) - - def filter(self, lexer, stream): - for ttype, value in stream: - if ttype in Keyword: - yield ttype, self.convert(value) - else: - yield ttype, value - - -class NameHighlightFilter(Filter): - """Highlight a normal Name (and Name.*) token with a different token type. - - Example:: - - filter = NameHighlightFilter( - names=['foo', 'bar', 'baz'], - tokentype=Name.Function, - ) - - This would highlight the names "foo", "bar" and "baz" - as functions. `Name.Function` is the default token type. - - Options accepted: - - `names` : list of strings - A list of names that should be given the different token type. - There is no default. - `tokentype` : TokenType or string - A token type or a string containing a token type name that is - used for highlighting the strings in `names`. The default is - `Name.Function`. - """ - - def __init__(self, **options): - Filter.__init__(self, **options) - self.names = set(get_list_opt(options, 'names', [])) - tokentype = options.get('tokentype') - if tokentype: - self.tokentype = string_to_tokentype(tokentype) - else: - self.tokentype = Name.Function - - def filter(self, lexer, stream): - for ttype, value in stream: - if ttype in Name and value in self.names: - yield self.tokentype, value - else: - yield ttype, value - - -class ErrorToken(Exception): - pass - - -class RaiseOnErrorTokenFilter(Filter): - """Raise an exception when the lexer generates an error token. - - Options accepted: - - `excclass` : Exception class - The exception class to raise. - The default is `pygments.filters.ErrorToken`. - - .. versionadded:: 0.8 - """ - - def __init__(self, **options): - Filter.__init__(self, **options) - self.exception = options.get('excclass', ErrorToken) - try: - # issubclass() will raise TypeError if first argument is not a class - if not issubclass(self.exception, Exception): - raise TypeError - except TypeError: - raise OptionError('excclass option is not an exception class') - - def filter(self, lexer, stream): - for ttype, value in stream: - if ttype is Error: - raise self.exception(value) - yield ttype, value - - -class VisibleWhitespaceFilter(Filter): - """Convert tabs, newlines and/or spaces to visible characters. - - Options accepted: - - `spaces` : string or bool - If this is a one-character string, spaces will be replaces by this string. - If it is another true value, spaces will be replaced by ``·`` (unicode - MIDDLE DOT). If it is a false value, spaces will not be replaced. The - default is ``False``. - `tabs` : string or bool - The same as for `spaces`, but the default replacement character is ``»`` - (unicode RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK). The default value - is ``False``. Note: this will not work if the `tabsize` option for the - lexer is nonzero, as tabs will already have been expanded then. - `tabsize` : int - If tabs are to be replaced by this filter (see the `tabs` option), this - is the total number of characters that a tab should be expanded to. - The default is ``8``. - `newlines` : string or bool - The same as for `spaces`, but the default replacement character is ``¶`` - (unicode PILCROW SIGN). The default value is ``False``. - `wstokentype` : bool - If true, give whitespace the special `Whitespace` token type. This allows - styling the visible whitespace differently (e.g. greyed out), but it can - disrupt background colors. The default is ``True``. - - .. versionadded:: 0.8 - """ - - def __init__(self, **options): - Filter.__init__(self, **options) - for name, default in [('spaces', '·'), - ('tabs', '»'), - ('newlines', '¶')]: - opt = options.get(name, False) - if isinstance(opt, str) and len(opt) == 1: - setattr(self, name, opt) - else: - setattr(self, name, (opt and default or '')) - tabsize = get_int_opt(options, 'tabsize', 8) - if self.tabs: - self.tabs += ' ' * (tabsize - 1) - if self.newlines: - self.newlines += '\n' - self.wstt = get_bool_opt(options, 'wstokentype', True) - - def filter(self, lexer, stream): - if self.wstt: - spaces = self.spaces or ' ' - tabs = self.tabs or '\t' - newlines = self.newlines or '\n' - regex = re.compile(r'\s') - - def replacefunc(wschar): - if wschar == ' ': - return spaces - elif wschar == '\t': - return tabs - elif wschar == '\n': - return newlines - return wschar - - for ttype, value in stream: - yield from _replace_special(ttype, value, regex, Whitespace, - replacefunc) - else: - spaces, tabs, newlines = self.spaces, self.tabs, self.newlines - # simpler processing - for ttype, value in stream: - if spaces: - value = value.replace(' ', spaces) - if tabs: - value = value.replace('\t', tabs) - if newlines: - value = value.replace('\n', newlines) - yield ttype, value - - -class GobbleFilter(Filter): - """Gobbles source code lines (eats initial characters). - - This filter drops the first ``n`` characters off every line of code. This - may be useful when the source code fed to the lexer is indented by a fixed - amount of space that isn't desired in the output. - - Options accepted: - - `n` : int - The number of characters to gobble. - - .. versionadded:: 1.2 - """ - def __init__(self, **options): - Filter.__init__(self, **options) - self.n = get_int_opt(options, 'n', 0) - - def gobble(self, value, left): - if left < len(value): - return value[left:], 0 - else: - return '', left - len(value) - - def filter(self, lexer, stream): - n = self.n - left = n # How many characters left to gobble. - for ttype, value in stream: - # Remove ``left`` tokens from first line, ``n`` from all others. - parts = value.split('\n') - (parts[0], left) = self.gobble(parts[0], left) - for i in range(1, len(parts)): - (parts[i], left) = self.gobble(parts[i], n) - value = '\n'.join(parts) - - if value != '': - yield ttype, value - - -class TokenMergeFilter(Filter): - """Merges consecutive tokens with the same token type in the output - stream of a lexer. - - .. versionadded:: 1.2 - """ - def __init__(self, **options): - Filter.__init__(self, **options) - - def filter(self, lexer, stream): - current_type = None - current_value = None - for ttype, value in stream: - if ttype is current_type: - current_value += value - else: - if current_type is not None: - yield current_type, current_value - current_type = ttype - current_value = value - if current_type is not None: - yield current_type, current_value - - -FILTERS = { - 'codetagify': CodeTagFilter, - 'keywordcase': KeywordCaseFilter, - 'highlight': NameHighlightFilter, - 'raiseonerror': RaiseOnErrorTokenFilter, - 'whitespace': VisibleWhitespaceFilter, - 'gobble': GobbleFilter, - 'tokenmerge': TokenMergeFilter, - 'symbols': SymbolFilter, -} diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 7db3e17c98beb1ee99885dbbc15773bed118d21f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37958 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%0A#8uYMSz^aT`EGOoI5=~X8sS3gU}IWp+t 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatter.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatter.py deleted file mode 100644 index 3ca4892..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatter.py +++ /dev/null @@ -1,124 +0,0 @@ -""" - pygments.formatter - ~~~~~~~~~~~~~~~~~~ - - Base formatter class. - - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -import codecs - -from pip._vendor.pygments.util import get_bool_opt -from pip._vendor.pygments.styles import get_style_by_name - -__all__ = ['Formatter'] - - -def _lookup_style(style): - if isinstance(style, str): - return get_style_by_name(style) - return style - - -class Formatter: - """ - Converts a token stream to text. - - Formatters should have attributes to help selecting them. These - are similar to the corresponding :class:`~pygments.lexer.Lexer` - attributes. - - .. autoattribute:: name - :no-value: - - .. autoattribute:: aliases - :no-value: - - .. autoattribute:: filenames - :no-value: - - You can pass options as keyword arguments to the constructor. - All formatters accept these basic options: - - ``style`` - The style to use, can be a string or a Style subclass - (default: "default"). Not used by e.g. the - TerminalFormatter. - ``full`` - Tells the formatter to output a "full" document, i.e. - a complete self-contained document. This doesn't have - any effect for some formatters (default: false). - ``title`` - If ``full`` is true, the title that should be used to - caption the document (default: ''). - ``encoding`` - If given, must be an encoding name. This will be used to - convert the Unicode token strings to byte strings in the - output. If it is "" or None, Unicode strings will be written - to the output file, which most file-like objects do not - support (default: None). - ``outencoding`` - Overrides ``encoding`` if given. - - """ - - #: Full name for the formatter, in human-readable form. - name = None - - #: A list of short, unique identifiers that can be used to lookup - #: the formatter from a list, e.g. using :func:`.get_formatter_by_name()`. - aliases = [] - - #: A list of fnmatch patterns that match filenames for which this - #: formatter can produce output. The patterns in this list should be unique - #: among all formatters. - filenames = [] - - #: If True, this formatter outputs Unicode strings when no encoding - #: option is given. - unicodeoutput = True - - def __init__(self, **options): - """ - As with lexers, this constructor takes arbitrary optional arguments, - and if you override it, you should first process your own options, then - call the base class implementation. - """ - self.style = _lookup_style(options.get('style', 'default')) - self.full = get_bool_opt(options, 'full', False) - self.title = options.get('title', '') - self.encoding = options.get('encoding', None) or None - if self.encoding in ('guess', 'chardet'): - # can happen for e.g. pygmentize -O encoding=guess - self.encoding = 'utf-8' - self.encoding = options.get('outencoding') or self.encoding - self.options = options - - def get_style_defs(self, arg=''): - """ - This method must return statements or declarations suitable to define - the current style for subsequent highlighted text (e.g. CSS classes - in the `HTMLFormatter`). - - The optional argument `arg` can be used to modify the generation and - is formatter dependent (it is standardized because it can be given on - the command line). - - This method is called by the ``-S`` :doc:`command-line option <cmdline>`, - the `arg` is then given by the ``-a`` option. - """ - return '' - - def format(self, tokensource, outfile): - """ - This method must format the tokens from the `tokensource` iterable and - write the formatted version to the file object `outfile`. - - Formatter options can control how exactly the tokens are converted. - """ - if self.encoding: - # wrap the outfile in a StreamWriter - outfile = codecs.lookup(self.encoding)[3](outfile) - return self.format_unencoded(tokensource, outfile) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__init__.py deleted file mode 100644 index 39db842..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__init__.py +++ /dev/null @@ -1,158 +0,0 @@ -""" - pygments.formatters - ~~~~~~~~~~~~~~~~~~~ - - Pygments formatters. - - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -import re -import sys -import types -import fnmatch -from os.path import basename - -from pip._vendor.pygments.formatters._mapping import FORMATTERS -from pip._vendor.pygments.plugin import find_plugin_formatters -from pip._vendor.pygments.util import ClassNotFound - -__all__ = ['get_formatter_by_name', 'get_formatter_for_filename', - 'get_all_formatters', 'load_formatter_from_file'] + list(FORMATTERS) - -_formatter_cache = {} # classes by name -_pattern_cache = {} - - -def _fn_matches(fn, glob): - """Return whether the supplied file name fn matches pattern filename.""" - if glob not in _pattern_cache: - pattern = _pattern_cache[glob] = re.compile(fnmatch.translate(glob)) - return pattern.match(fn) - return _pattern_cache[glob].match(fn) - - -def _load_formatters(module_name): - """Load a formatter (and all others in the module too).""" - mod = __import__(module_name, None, None, ['__all__']) - for formatter_name in mod.__all__: - cls = getattr(mod, formatter_name) - _formatter_cache[cls.name] = cls - - -def get_all_formatters(): - """Return a generator for all formatter classes.""" - # NB: this returns formatter classes, not info like get_all_lexers(). - for info in FORMATTERS.values(): - if info[1] not in _formatter_cache: - _load_formatters(info[0]) - yield _formatter_cache[info[1]] - for _, formatter in find_plugin_formatters(): - yield formatter - - -def find_formatter_class(alias): - """Lookup a formatter by alias. - - Returns None if not found. - """ - for module_name, name, aliases, _, _ in FORMATTERS.values(): - if alias in aliases: - if name not in _formatter_cache: - _load_formatters(module_name) - return _formatter_cache[name] - for _, cls in find_plugin_formatters(): - if alias in cls.aliases: - return cls - - -def get_formatter_by_name(_alias, **options): - """ - Return an instance of a :class:`.Formatter` subclass that has `alias` in its - aliases list. The formatter is given the `options` at its instantiation. - - Will raise :exc:`pygments.util.ClassNotFound` if no formatter with that - alias is found. - """ - cls = find_formatter_class(_alias) - if cls is None: - raise ClassNotFound("no formatter found for name %r" % _alias) - return cls(**options) - - -def load_formatter_from_file(filename, formattername="CustomFormatter", **options): - """ - Return a `Formatter` subclass instance loaded from the provided file, relative - to the current directory. - - The file is expected to contain a Formatter class named ``formattername`` - (by default, CustomFormatter). Users should be very careful with the input, because - this method is equivalent to running ``eval()`` on the input file. The formatter is - given the `options` at its instantiation. - - :exc:`pygments.util.ClassNotFound` is raised if there are any errors loading - the formatter. - - .. versionadded:: 2.2 - """ - try: - # This empty dict will contain the namespace for the exec'd file - custom_namespace = {} - with open(filename, 'rb') as f: - exec(f.read(), custom_namespace) - # Retrieve the class `formattername` from that namespace - if formattername not in custom_namespace: - raise ClassNotFound('no valid %s class found in %s' % - (formattername, filename)) - formatter_class = custom_namespace[formattername] - # And finally instantiate it with the options - return formatter_class(**options) - except OSError as err: - raise ClassNotFound('cannot read %s: %s' % (filename, err)) - except ClassNotFound: - raise - except Exception as err: - raise ClassNotFound('error when loading custom formatter: %s' % err) - - -def get_formatter_for_filename(fn, **options): - """ - Return a :class:`.Formatter` subclass instance that has a filename pattern - matching `fn`. The formatter is given the `options` at its instantiation. - - Will raise :exc:`pygments.util.ClassNotFound` if no formatter for that filename - is found. - """ - fn = basename(fn) - for modname, name, _, filenames, _ in FORMATTERS.values(): - for filename in filenames: - if _fn_matches(fn, filename): - if name not in _formatter_cache: - _load_formatters(modname) - return _formatter_cache[name](**options) - for cls in find_plugin_formatters(): - for filename in cls.filenames: - if _fn_matches(fn, filename): - return cls(**options) - raise ClassNotFound("no formatter found for file name %r" % fn) - - -class _automodule(types.ModuleType): - """Automatically import formatters.""" - - def __getattr__(self, name): - info = FORMATTERS.get(name) - if info: - _load_formatters(info[0]) - cls = _formatter_cache[info[1]] - setattr(self, name, cls) - return cls - raise AttributeError(name) - - -oldmod = sys.modules[__name__] -newmod = _automodule(__name__) -newmod.__dict__.update(oldmod.__dict__) -sys.modules[__name__] = newmod -del newmod.newmod, newmod.oldmod, newmod.sys, newmod.types diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index a6c97bf3edfe301543130c1906928f39e2849e9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6948 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-312.pyc deleted file mode 100644 index 27f0f2e8ae5c79bc03f77df11c0ac8731d519d97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4237 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 Z{>PQ<KGARH`_D`Nc>wyWIsFW9{TC5Px+DMq diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-312.pyc deleted file mode 100644 index 6355d964eee3fbc59b84d7b8bf9dad70a8a716bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4216 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-312.pyc deleted file mode 100644 index 6f3ea16e6fad3de773eee865b6995698067582db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7286 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-312.pyc deleted file mode 100644 index c53e547e2db2ba2031e3edcba815690b0a44e830..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40594 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-312.pyc deleted file mode 100644 index 8d34cbfe93abebdb0220980bb4a676e1fffe8af5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27065 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 I^dTz!zi~(xr2qf` diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-312.pyc deleted file mode 100644 index 80b52e4d648bab736c7a6ddadd4f7656851caa9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6087 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-312.pyc deleted file mode 100644 index d80804406165741f2b9a0839fb5a879a56ebff80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19976 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-312.pyc deleted file mode 100644 index f6b3dcd24997aa67d401838049a3551afbbb260d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6906 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc deleted file mode 100644 index 38fea5167aaa7e1816236c521ac889c33314f4c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2952 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-312.pyc deleted file mode 100644 index 1f9e76cca704fe36e0fbef53c115211cf6cd2c01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-312.pyc deleted file mode 100644 index 5bd59fa6789c77526581a2485e77cd24583857f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9088 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-312.pyc deleted file mode 100644 index c69353da8945ce119c329380537908f2b81b1e70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5851 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-312.pyc deleted file mode 100644 index a5fdba4cce7553da66a07bf9a9e461f43382eacc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15179 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/_mapping.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/_mapping.py deleted file mode 100644 index 72ca840..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/_mapping.py +++ /dev/null @@ -1,23 +0,0 @@ -# Automatically generated by scripts/gen_mapfiles.py. -# DO NOT EDIT BY HAND; run `tox -e mapfiles` instead. - -FORMATTERS = { - 'BBCodeFormatter': ('pygments.formatters.bbcode', 'BBCode', ('bbcode', 'bb'), (), 'Format tokens with BBcodes. These formatting codes are used by many bulletin boards, so you can highlight your sourcecode with pygments before posting it there.'), - 'BmpImageFormatter': ('pygments.formatters.img', 'img_bmp', ('bmp', 'bitmap'), ('*.bmp',), 'Create a bitmap image from source code. This uses the Python Imaging Library to generate a pixmap from the source code.'), - 'GifImageFormatter': ('pygments.formatters.img', 'img_gif', ('gif',), ('*.gif',), 'Create a GIF image from source code. This uses the Python Imaging Library to generate a pixmap from the source code.'), - 'GroffFormatter': ('pygments.formatters.groff', 'groff', ('groff', 'troff', 'roff'), (), 'Format tokens with groff escapes to change their color and font style.'), - 'HtmlFormatter': ('pygments.formatters.html', 'HTML', ('html',), ('*.html', '*.htm'), "Format tokens as HTML 4 ``<span>`` tags. By default, the content is enclosed in a ``<pre>`` tag, itself wrapped in a ``<div>`` tag (but see the `nowrap` option). The ``<div>``'s CSS class can be set by the `cssclass` option."), - 'IRCFormatter': ('pygments.formatters.irc', 'IRC', ('irc', 'IRC'), (), 'Format tokens with IRC color sequences'), - 'ImageFormatter': ('pygments.formatters.img', 'img', ('img', 'IMG', 'png'), ('*.png',), 'Create a PNG image from source code. This uses the Python Imaging Library to generate a pixmap from the source code.'), - 'JpgImageFormatter': ('pygments.formatters.img', 'img_jpg', ('jpg', 'jpeg'), ('*.jpg',), 'Create a JPEG image from source code. This uses the Python Imaging Library to generate a pixmap from the source code.'), - 'LatexFormatter': ('pygments.formatters.latex', 'LaTeX', ('latex', 'tex'), ('*.tex',), 'Format tokens as LaTeX code. This needs the `fancyvrb` and `color` standard packages.'), - 'NullFormatter': ('pygments.formatters.other', 'Text only', ('text', 'null'), ('*.txt',), 'Output the text unchanged without any formatting.'), - 'PangoMarkupFormatter': ('pygments.formatters.pangomarkup', 'Pango Markup', ('pango', 'pangomarkup'), (), 'Format tokens as Pango Markup code. It can then be rendered to an SVG.'), - 'RawTokenFormatter': ('pygments.formatters.other', 'Raw tokens', ('raw', 'tokens'), ('*.raw',), 'Format tokens as a raw representation for storing token streams.'), - 'RtfFormatter': ('pygments.formatters.rtf', 'RTF', ('rtf',), ('*.rtf',), 'Format tokens as RTF markup. This formatter automatically outputs full RTF documents with color information and other useful stuff. Perfect for Copy and Paste into Microsoft(R) Word(R) documents.'), - 'SvgFormatter': ('pygments.formatters.svg', 'SVG', ('svg',), ('*.svg',), 'Format tokens as an SVG graphics file. This formatter is still experimental. Each line of code is a ``<text>`` element with explicit ``x`` and ``y`` coordinates containing ``<tspan>`` elements with the individual token styles.'), - 'Terminal256Formatter': ('pygments.formatters.terminal256', 'Terminal256', ('terminal256', 'console256', '256'), (), 'Format tokens with ANSI color sequences, for output in a 256-color terminal or console. Like in `TerminalFormatter` color sequences are terminated at newlines, so that paging the output works correctly.'), - 'TerminalFormatter': ('pygments.formatters.terminal', 'Terminal', ('terminal', 'console'), (), 'Format tokens with ANSI color sequences, for output in a text console. Color sequences are terminated at newlines, so that paging the output works correctly.'), - 'TerminalTrueColorFormatter': ('pygments.formatters.terminal256', 'TerminalTrueColor', ('terminal16m', 'console16m', '16m'), (), 'Format tokens with ANSI color sequences, for output in a true-color terminal or console. Like in `TerminalFormatter` color sequences are terminated at newlines, so that paging the output works correctly.'), - 'TestcaseFormatter': ('pygments.formatters.other', 'Testcase', ('testcase',), (), 'Format tokens as appropriate for a new testcase.'), -} diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/bbcode.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/bbcode.py deleted file mode 100644 index c4db8f4..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/bbcode.py +++ /dev/null @@ -1,108 +0,0 @@ -""" - pygments.formatters.bbcode - ~~~~~~~~~~~~~~~~~~~~~~~~~~ - - BBcode formatter. - - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - - -from pip._vendor.pygments.formatter import Formatter -from pip._vendor.pygments.util import get_bool_opt - -__all__ = ['BBCodeFormatter'] - - -class BBCodeFormatter(Formatter): - """ - Format tokens with BBcodes. These formatting codes are used by many - bulletin boards, so you can highlight your sourcecode with pygments before - posting it there. - - This formatter has no support for background colors and borders, as there - are no common BBcode tags for that. - - Some board systems (e.g. phpBB) don't support colors in their [code] tag, - so you can't use the highlighting together with that tag. - Text in a [code] tag usually is shown with a monospace font (which this - formatter can do with the ``monofont`` option) and no spaces (which you - need for indentation) are removed. - - Additional options accepted: - - `style` - The style to use, can be a string or a Style subclass (default: - ``'default'``). - - `codetag` - If set to true, put the output into ``[code]`` tags (default: - ``false``) - - `monofont` - If set to true, add a tag to show the code with a monospace font - (default: ``false``). - """ - name = 'BBCode' - aliases = ['bbcode', 'bb'] - filenames = [] - - def __init__(self, **options): - Formatter.__init__(self, **options) - self._code = get_bool_opt(options, 'codetag', False) - self._mono = get_bool_opt(options, 'monofont', False) - - self.styles = {} - self._make_styles() - - def _make_styles(self): - for ttype, ndef in self.style: - start = end = '' - if ndef['color']: - start += '[color=#%s]' % ndef['color'] - end = '[/color]' + end - if ndef['bold']: - start += '[b]' - end = '[/b]' + end - if ndef['italic']: - start += '[i]' - end = '[/i]' + end - if ndef['underline']: - start += '[u]' - end = '[/u]' + end - # there are no common BBcodes for background-color and border - - self.styles[ttype] = start, end - - def format_unencoded(self, tokensource, outfile): - if self._code: - outfile.write('[code]') - if self._mono: - outfile.write('[font=monospace]') - - lastval = '' - lasttype = None - - for ttype, value in tokensource: - while ttype not in self.styles: - ttype = ttype.parent - if ttype == lasttype: - lastval += value - else: - if lastval: - start, end = self.styles[lasttype] - outfile.write(''.join((start, lastval, end))) - lastval = value - lasttype = ttype - - if lastval: - start, end = self.styles[lasttype] - outfile.write(''.join((start, lastval, end))) - - if self._mono: - outfile.write('[/font]') - if self._code: - outfile.write('[/code]') - if self._code or self._mono: - outfile.write('\n') diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/groff.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/groff.py deleted file mode 100644 index 30a528e..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/groff.py +++ /dev/null @@ -1,170 +0,0 @@ -""" - pygments.formatters.groff - ~~~~~~~~~~~~~~~~~~~~~~~~~ - - Formatter for groff output. - - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -import math -from pip._vendor.pygments.formatter import Formatter -from pip._vendor.pygments.util import get_bool_opt, get_int_opt - -__all__ = ['GroffFormatter'] - - -class GroffFormatter(Formatter): - """ - Format tokens with groff escapes to change their color and font style. - - .. versionadded:: 2.11 - - Additional options accepted: - - `style` - The style to use, can be a string or a Style subclass (default: - ``'default'``). - - `monospaced` - If set to true, monospace font will be used (default: ``true``). - - `linenos` - If set to true, print the line numbers (default: ``false``). - - `wrap` - Wrap lines to the specified number of characters. Disabled if set to 0 - (default: ``0``). - """ - - name = 'groff' - aliases = ['groff','troff','roff'] - filenames = [] - - def __init__(self, **options): - Formatter.__init__(self, **options) - - self.monospaced = get_bool_opt(options, 'monospaced', True) - self.linenos = get_bool_opt(options, 'linenos', False) - self._lineno = 0 - self.wrap = get_int_opt(options, 'wrap', 0) - self._linelen = 0 - - self.styles = {} - self._make_styles() - - - def _make_styles(self): - regular = '\\f[CR]' if self.monospaced else '\\f[R]' - bold = '\\f[CB]' if self.monospaced else '\\f[B]' - italic = '\\f[CI]' if self.monospaced else '\\f[I]' - - for ttype, ndef in self.style: - start = end = '' - if ndef['color']: - start += '\\m[%s]' % ndef['color'] - end = '\\m[]' + end - if ndef['bold']: - start += bold - end = regular + end - if ndef['italic']: - start += italic - end = regular + end - if ndef['bgcolor']: - start += '\\M[%s]' % ndef['bgcolor'] - end = '\\M[]' + end - - self.styles[ttype] = start, end - - - def _define_colors(self, outfile): - colors = set() - for _, ndef in self.style: - if ndef['color'] is not None: - colors.add(ndef['color']) - - for color in sorted(colors): - outfile.write('.defcolor ' + color + ' rgb #' + color + '\n') - - - def _write_lineno(self, outfile): - self._lineno += 1 - outfile.write("%s% 4d " % (self._lineno != 1 and '\n' or '', self._lineno)) - - - def _wrap_line(self, line): - length = len(line.rstrip('\n')) - space = ' ' if self.linenos else '' - newline = '' - - if length > self.wrap: - for i in range(0, math.floor(length / self.wrap)): - chunk = line[i*self.wrap:i*self.wrap+self.wrap] - newline += (chunk + '\n' + space) - remainder = length % self.wrap - if remainder > 0: - newline += line[-remainder-1:] - self._linelen = remainder - elif self._linelen + length > self.wrap: - newline = ('\n' + space) + line - self._linelen = length - else: - newline = line - self._linelen += length - - return newline - - - def _escape_chars(self, text): - text = text.replace('\\', '\\[u005C]'). \ - replace('.', '\\[char46]'). \ - replace('\'', '\\[u0027]'). \ - replace('`', '\\[u0060]'). \ - replace('~', '\\[u007E]') - copy = text - - for char in copy: - if len(char) != len(char.encode()): - uni = char.encode('unicode_escape') \ - .decode()[1:] \ - .replace('x', 'u00') \ - .upper() - text = text.replace(char, '\\[u' + uni[1:] + ']') - - return text - - - def format_unencoded(self, tokensource, outfile): - self._define_colors(outfile) - - outfile.write('.nf\n\\f[CR]\n') - - if self.linenos: - self._write_lineno(outfile) - - for ttype, value in tokensource: - while ttype not in self.styles: - ttype = ttype.parent - start, end = self.styles[ttype] - - for line in value.splitlines(True): - if self.wrap > 0: - line = self._wrap_line(line) - - if start and end: - text = self._escape_chars(line.rstrip('\n')) - if text != '': - outfile.write(''.join((start, text, end))) - else: - outfile.write(self._escape_chars(line.rstrip('\n'))) - - if line.endswith('\n'): - if self.linenos: - self._write_lineno(outfile) - self._linelen = 0 - else: - outfile.write('\n') - self._linelen = 0 - - outfile.write('\n.fi') diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/html.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/html.py deleted file mode 100644 index 931d7c3..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/html.py +++ /dev/null @@ -1,989 +0,0 @@ -""" - pygments.formatters.html - ~~~~~~~~~~~~~~~~~~~~~~~~ - - Formatter for HTML output. - - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -import functools -import os -import sys -import os.path -from io import StringIO - -from pip._vendor.pygments.formatter import Formatter -from pip._vendor.pygments.token import Token, Text, STANDARD_TYPES -from pip._vendor.pygments.util import get_bool_opt, get_int_opt, get_list_opt - -try: - import ctags -except ImportError: - ctags = None - -__all__ = ['HtmlFormatter'] - - -_escape_html_table = { - ord('&'): '&amp;', - ord('<'): '&lt;', - ord('>'): '&gt;', - ord('"'): '&quot;', - ord("'"): '&#39;', -} - - -def escape_html(text, table=_escape_html_table): - """Escape &, <, > as well as single and double quotes for HTML.""" - return text.translate(table) - - -def webify(color): - if color.startswith('calc') or color.startswith('var'): - return color - else: - return '#' + color - - -def _get_ttype_class(ttype): - fname = STANDARD_TYPES.get(ttype) - if fname: - return fname - aname = '' - while fname is None: - aname = '-' + ttype[-1] + aname - ttype = ttype.parent - fname = STANDARD_TYPES.get(ttype) - return fname + aname - - -CSSFILE_TEMPLATE = '''\ -/* -generated by Pygments <https://pygments.org/> -Copyright 2006-2023 by the Pygments team. -Licensed under the BSD license, see LICENSE for details. -*/ -%(styledefs)s -''' - -DOC_HEADER = '''\ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" - "http://www.w3.org/TR/html4/strict.dtd"> -<!-- -generated by Pygments <https://pygments.org/> -Copyright 2006-2023 by the Pygments team. -Licensed under the BSD license, see LICENSE for details. ---> -<html> -<head> - <title>%(title)s</title> - <meta http-equiv="content-type" content="text/html; charset=%(encoding)s"> - <style type="text/css"> -''' + CSSFILE_TEMPLATE + ''' - </style> -</head> -<body> -<h2>%(title)s</h2> - -''' - -DOC_HEADER_EXTERNALCSS = '''\ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" - "http://www.w3.org/TR/html4/strict.dtd"> - -<html> -<head> - <title>%(title)s</title> - <meta http-equiv="content-type" content="text/html; charset=%(encoding)s"> - <link rel="stylesheet" href="%(cssfile)s" type="text/css"> -</head> -<body> -<h2>%(title)s</h2> - -''' - -DOC_FOOTER = '''\ -</body> -</html> -''' - - -class HtmlFormatter(Formatter): - r""" - Format tokens as HTML 4 ``<span>`` tags. By default, the content is enclosed - in a ``<pre>`` tag, itself wrapped in a ``<div>`` tag (but see the `nowrap` option). - The ``<div>``'s CSS class can be set by the `cssclass` option. - - If the `linenos` option is set to ``"table"``, the ``<pre>`` is - additionally wrapped inside a ``<table>`` which has one row and two - cells: one containing the line numbers and one containing the code. - Example: - - .. sourcecode:: html - - <div class="highlight" > - <table><tr> - <td class="linenos" title="click to toggle" - onclick="with (this.firstChild.style) - { display = (display == '') ? 'none' : '' }"> - <pre>1 - 2</pre> - </td> - <td class="code"> - <pre><span class="Ke">def </span><span class="NaFu">foo</span>(bar): - <span class="Ke">pass</span> - </pre> - </td> - </tr></table></div> - - (whitespace added to improve clarity). - - A list of lines can be specified using the `hl_lines` option to make these - lines highlighted (as of Pygments 0.11). - - With the `full` option, a complete HTML 4 document is output, including - the style definitions inside a ``<style>`` tag, or in a separate file if - the `cssfile` option is given. - - When `tagsfile` is set to the path of a ctags index file, it is used to - generate hyperlinks from names to their definition. You must enable - `lineanchors` and run ctags with the `-n` option for this to work. The - `python-ctags` module from PyPI must be installed to use this feature; - otherwise a `RuntimeError` will be raised. - - The `get_style_defs(arg='')` method of a `HtmlFormatter` returns a string - containing CSS rules for the CSS classes used by the formatter. The - argument `arg` can be used to specify additional CSS selectors that - are prepended to the classes. A call `fmter.get_style_defs('td .code')` - would result in the following CSS classes: - - .. sourcecode:: css - - td .code .kw { font-weight: bold; color: #00FF00 } - td .code .cm { color: #999999 } - ... - - If you have Pygments 0.6 or higher, you can also pass a list or tuple to the - `get_style_defs()` method to request multiple prefixes for the tokens: - - .. sourcecode:: python - - formatter.get_style_defs(['div.syntax pre', 'pre.syntax']) - - The output would then look like this: - - .. sourcecode:: css - - div.syntax pre .kw, - pre.syntax .kw { font-weight: bold; color: #00FF00 } - div.syntax pre .cm, - pre.syntax .cm { color: #999999 } - ... - - Additional options accepted: - - `nowrap` - If set to ``True``, don't add a ``<pre>`` and a ``<div>`` tag - around the tokens. This disables most other options (default: ``False``). - - `full` - Tells the formatter to output a "full" document, i.e. a complete - self-contained document (default: ``False``). - - `title` - If `full` is true, the title that should be used to caption the - document (default: ``''``). - - `style` - The style to use, can be a string or a Style subclass (default: - ``'default'``). This option has no effect if the `cssfile` - and `noclobber_cssfile` option are given and the file specified in - `cssfile` exists. - - `noclasses` - If set to true, token ``<span>`` tags (as well as line number elements) - will not use CSS classes, but inline styles. This is not recommended - for larger pieces of code since it increases output size by quite a bit - (default: ``False``). - - `classprefix` - Since the token types use relatively short class names, they may clash - with some of your own class names. In this case you can use the - `classprefix` option to give a string to prepend to all Pygments-generated - CSS class names for token types. - Note that this option also affects the output of `get_style_defs()`. - - `cssclass` - CSS class for the wrapping ``<div>`` tag (default: ``'highlight'``). - If you set this option, the default selector for `get_style_defs()` - will be this class. - - .. versionadded:: 0.9 - If you select the ``'table'`` line numbers, the wrapping table will - have a CSS class of this string plus ``'table'``, the default is - accordingly ``'highlighttable'``. - - `cssstyles` - Inline CSS styles for the wrapping ``<div>`` tag (default: ``''``). - - `prestyles` - Inline CSS styles for the ``<pre>`` tag (default: ``''``). - - .. versionadded:: 0.11 - - `cssfile` - If the `full` option is true and this option is given, it must be the - name of an external file. If the filename does not include an absolute - path, the file's path will be assumed to be relative to the main output - file's path, if the latter can be found. The stylesheet is then written - to this file instead of the HTML file. - - .. versionadded:: 0.6 - - `noclobber_cssfile` - If `cssfile` is given and the specified file exists, the css file will - not be overwritten. This allows the use of the `full` option in - combination with a user specified css file. Default is ``False``. - - .. versionadded:: 1.1 - - `linenos` - If set to ``'table'``, output line numbers as a table with two cells, - one containing the line numbers, the other the whole code. This is - copy-and-paste-friendly, but may cause alignment problems with some - browsers or fonts. If set to ``'inline'``, the line numbers will be - integrated in the ``<pre>`` tag that contains the code (that setting - is *new in Pygments 0.8*). - - For compatibility with Pygments 0.7 and earlier, every true value - except ``'inline'`` means the same as ``'table'`` (in particular, that - means also ``True``). - - The default value is ``False``, which means no line numbers at all. - - **Note:** with the default ("table") line number mechanism, the line - numbers and code can have different line heights in Internet Explorer - unless you give the enclosing ``<pre>`` tags an explicit ``line-height`` - CSS property (you get the default line spacing with ``line-height: - 125%``). - - `hl_lines` - Specify a list of lines to be highlighted. The line numbers are always - relative to the input (i.e. the first line is line 1) and are - independent of `linenostart`. - - .. versionadded:: 0.11 - - `linenostart` - The line number for the first line (default: ``1``). - - `linenostep` - If set to a number n > 1, only every nth line number is printed. - - `linenospecial` - If set to a number n > 0, every nth line number is given the CSS - class ``"special"`` (default: ``0``). - - `nobackground` - If set to ``True``, the formatter won't output the background color - for the wrapping element (this automatically defaults to ``False`` - when there is no wrapping element [eg: no argument for the - `get_syntax_defs` method given]) (default: ``False``). - - .. versionadded:: 0.6 - - `lineseparator` - This string is output between lines of code. It defaults to ``"\n"``, - which is enough to break a line inside ``<pre>`` tags, but you can - e.g. set it to ``"<br>"`` to get HTML line breaks. - - .. versionadded:: 0.7 - - `lineanchors` - If set to a nonempty string, e.g. ``foo``, the formatter will wrap each - output line in an anchor tag with an ``id`` (and `name`) of ``foo-linenumber``. - This allows easy linking to certain lines. - - .. versionadded:: 0.9 - - `linespans` - If set to a nonempty string, e.g. ``foo``, the formatter will wrap each - output line in a span tag with an ``id`` of ``foo-linenumber``. - This allows easy access to lines via javascript. - - .. versionadded:: 1.6 - - `anchorlinenos` - If set to `True`, will wrap line numbers in <a> tags. Used in - combination with `linenos` and `lineanchors`. - - `tagsfile` - If set to the path of a ctags file, wrap names in anchor tags that - link to their definitions. `lineanchors` should be used, and the - tags file should specify line numbers (see the `-n` option to ctags). - - .. versionadded:: 1.6 - - `tagurlformat` - A string formatting pattern used to generate links to ctags definitions. - Available variables are `%(path)s`, `%(fname)s` and `%(fext)s`. - Defaults to an empty string, resulting in just `#prefix-number` links. - - .. versionadded:: 1.6 - - `filename` - A string used to generate a filename when rendering ``<pre>`` blocks, - for example if displaying source code. If `linenos` is set to - ``'table'`` then the filename will be rendered in an initial row - containing a single `<th>` which spans both columns. - - .. versionadded:: 2.1 - - `wrapcode` - Wrap the code inside ``<pre>`` blocks using ``<code>``, as recommended - by the HTML5 specification. - - .. versionadded:: 2.4 - - `debug_token_types` - Add ``title`` attributes to all token ``<span>`` tags that show the - name of the token. - - .. versionadded:: 2.10 - - - **Subclassing the HTML formatter** - - .. versionadded:: 0.7 - - The HTML formatter is now built in a way that allows easy subclassing, thus - customizing the output HTML code. The `format()` method calls - `self._format_lines()` which returns a generator that yields tuples of ``(1, - line)``, where the ``1`` indicates that the ``line`` is a line of the - formatted source code. - - If the `nowrap` option is set, the generator is the iterated over and the - resulting HTML is output. - - Otherwise, `format()` calls `self.wrap()`, which wraps the generator with - other generators. These may add some HTML code to the one generated by - `_format_lines()`, either by modifying the lines generated by the latter, - then yielding them again with ``(1, line)``, and/or by yielding other HTML - code before or after the lines, with ``(0, html)``. The distinction between - source lines and other code makes it possible to wrap the generator multiple - times. - - The default `wrap()` implementation adds a ``<div>`` and a ``<pre>`` tag. - - A custom `HtmlFormatter` subclass could look like this: - - .. sourcecode:: python - - class CodeHtmlFormatter(HtmlFormatter): - - def wrap(self, source, *, include_div): - return self._wrap_code(source) - - def _wrap_code(self, source): - yield 0, '<code>' - for i, t in source: - if i == 1: - # it's a line of formatted code - t += '<br>' - yield i, t - yield 0, '</code>' - - This results in wrapping the formatted lines with a ``<code>`` tag, where the - source lines are broken using ``<br>`` tags. - - After calling `wrap()`, the `format()` method also adds the "line numbers" - and/or "full document" wrappers if the respective options are set. Then, all - HTML yielded by the wrapped generator is output. - """ - - name = 'HTML' - aliases = ['html'] - filenames = ['*.html', '*.htm'] - - def __init__(self, **options): - Formatter.__init__(self, **options) - self.title = self._decodeifneeded(self.title) - self.nowrap = get_bool_opt(options, 'nowrap', False) - self.noclasses = get_bool_opt(options, 'noclasses', False) - self.classprefix = options.get('classprefix', '') - self.cssclass = self._decodeifneeded(options.get('cssclass', 'highlight')) - self.cssstyles = self._decodeifneeded(options.get('cssstyles', '')) - self.prestyles = self._decodeifneeded(options.get('prestyles', '')) - self.cssfile = self._decodeifneeded(options.get('cssfile', '')) - self.noclobber_cssfile = get_bool_opt(options, 'noclobber_cssfile', False) - self.tagsfile = self._decodeifneeded(options.get('tagsfile', '')) - self.tagurlformat = self._decodeifneeded(options.get('tagurlformat', '')) - self.filename = self._decodeifneeded(options.get('filename', '')) - self.wrapcode = get_bool_opt(options, 'wrapcode', False) - self.span_element_openers = {} - self.debug_token_types = get_bool_opt(options, 'debug_token_types', False) - - if self.tagsfile: - if not ctags: - raise RuntimeError('The "ctags" package must to be installed ' - 'to be able to use the "tagsfile" feature.') - self._ctags = ctags.CTags(self.tagsfile) - - linenos = options.get('linenos', False) - if linenos == 'inline': - self.linenos = 2 - elif linenos: - # compatibility with <= 0.7 - self.linenos = 1 - else: - self.linenos = 0 - self.linenostart = abs(get_int_opt(options, 'linenostart', 1)) - self.linenostep = abs(get_int_opt(options, 'linenostep', 1)) - self.linenospecial = abs(get_int_opt(options, 'linenospecial', 0)) - self.nobackground = get_bool_opt(options, 'nobackground', False) - self.lineseparator = options.get('lineseparator', '\n') - self.lineanchors = options.get('lineanchors', '') - self.linespans = options.get('linespans', '') - self.anchorlinenos = get_bool_opt(options, 'anchorlinenos', False) - self.hl_lines = set() - for lineno in get_list_opt(options, 'hl_lines', []): - try: - self.hl_lines.add(int(lineno)) - except ValueError: - pass - - self._create_stylesheet() - - def _get_css_class(self, ttype): - """Return the css class of this token type prefixed with - the classprefix option.""" - ttypeclass = _get_ttype_class(ttype) - if ttypeclass: - return self.classprefix + ttypeclass - return '' - - def _get_css_classes(self, ttype): - """Return the CSS classes of this token type prefixed with the classprefix option.""" - cls = self._get_css_class(ttype) - while ttype not in STANDARD_TYPES: - ttype = ttype.parent - cls = self._get_css_class(ttype) + ' ' + cls - return cls or '' - - def _get_css_inline_styles(self, ttype): - """Return the inline CSS styles for this token type.""" - cclass = self.ttype2class.get(ttype) - while cclass is None: - ttype = ttype.parent - cclass = self.ttype2class.get(ttype) - return cclass or '' - - def _create_stylesheet(self): - t2c = self.ttype2class = {Token: ''} - c2s = self.class2style = {} - for ttype, ndef in self.style: - name = self._get_css_class(ttype) - style = '' - if ndef['color']: - style += 'color: %s; ' % webify(ndef['color']) - if ndef['bold']: - style += 'font-weight: bold; ' - if ndef['italic']: - style += 'font-style: italic; ' - if ndef['underline']: - style += 'text-decoration: underline; ' - if ndef['bgcolor']: - style += 'background-color: %s; ' % webify(ndef['bgcolor']) - if ndef['border']: - style += 'border: 1px solid %s; ' % webify(ndef['border']) - if style: - t2c[ttype] = name - # save len(ttype) to enable ordering the styles by - # hierarchy (necessary for CSS cascading rules!) - c2s[name] = (style[:-2], ttype, len(ttype)) - - def get_style_defs(self, arg=None): - """ - Return CSS style definitions for the classes produced by the current - highlighting style. ``arg`` can be a string or list of selectors to - insert before the token type classes. - """ - style_lines = [] - - style_lines.extend(self.get_linenos_style_defs()) - style_lines.extend(self.get_background_style_defs(arg)) - style_lines.extend(self.get_token_style_defs(arg)) - - return '\n'.join(style_lines) - - def get_token_style_defs(self, arg=None): - prefix = self.get_css_prefix(arg) - - styles = [ - (level, ttype, cls, style) - for cls, (style, ttype, level) in self.class2style.items() - if cls and style - ] - styles.sort() - - lines = [ - '%s { %s } /* %s */' % (prefix(cls), style, repr(ttype)[6:]) - for (level, ttype, cls, style) in styles - ] - - return lines - - def get_background_style_defs(self, arg=None): - prefix = self.get_css_prefix(arg) - bg_color = self.style.background_color - hl_color = self.style.highlight_color - - lines = [] - - if arg and not self.nobackground and bg_color is not None: - text_style = '' - if Text in self.ttype2class: - text_style = ' ' + self.class2style[self.ttype2class[Text]][0] - lines.insert( - 0, '%s{ background: %s;%s }' % ( - prefix(''), bg_color, text_style - ) - ) - if hl_color is not None: - lines.insert( - 0, '%s { background-color: %s }' % (prefix('hll'), hl_color) - ) - - return lines - - def get_linenos_style_defs(self): - lines = [ - 'pre { %s }' % self._pre_style, - 'td.linenos .normal { %s }' % self._linenos_style, - 'span.linenos { %s }' % self._linenos_style, - 'td.linenos .special { %s }' % self._linenos_special_style, - 'span.linenos.special { %s }' % self._linenos_special_style, - ] - - return lines - - def get_css_prefix(self, arg): - if arg is None: - arg = ('cssclass' in self.options and '.'+self.cssclass or '') - if isinstance(arg, str): - args = [arg] - else: - args = list(arg) - - def prefix(cls): - if cls: - cls = '.' + cls - tmp = [] - for arg in args: - tmp.append((arg and arg + ' ' or '') + cls) - return ', '.join(tmp) - - return prefix - - @property - def _pre_style(self): - return 'line-height: 125%;' - - @property - def _linenos_style(self): - return 'color: %s; background-color: %s; padding-left: 5px; padding-right: 5px;' % ( - self.style.line_number_color, - self.style.line_number_background_color - ) - - @property - def _linenos_special_style(self): - return 'color: %s; background-color: %s; padding-left: 5px; padding-right: 5px;' % ( - self.style.line_number_special_color, - self.style.line_number_special_background_color - ) - - def _decodeifneeded(self, value): - if isinstance(value, bytes): - if self.encoding: - return value.decode(self.encoding) - return value.decode() - return value - - def _wrap_full(self, inner, outfile): - if self.cssfile: - if os.path.isabs(self.cssfile): - # it's an absolute filename - cssfilename = self.cssfile - else: - try: - filename = outfile.name - if not filename or filename[0] == '<': - # pseudo files, e.g. name == '<fdopen>' - raise AttributeError - cssfilename = os.path.join(os.path.dirname(filename), - self.cssfile) - except AttributeError: - print('Note: Cannot determine output file name, ' - 'using current directory as base for the CSS file name', - file=sys.stderr) - cssfilename = self.cssfile - # write CSS file only if noclobber_cssfile isn't given as an option. - try: - if not os.path.exists(cssfilename) or not self.noclobber_cssfile: - with open(cssfilename, "w", encoding="utf-8") as cf: - cf.write(CSSFILE_TEMPLATE % - {'styledefs': self.get_style_defs('body')}) - except OSError as err: - err.strerror = 'Error writing CSS file: ' + err.strerror - raise - - yield 0, (DOC_HEADER_EXTERNALCSS % - dict(title=self.title, - cssfile=self.cssfile, - encoding=self.encoding)) - else: - yield 0, (DOC_HEADER % - dict(title=self.title, - styledefs=self.get_style_defs('body'), - encoding=self.encoding)) - - yield from inner - yield 0, DOC_FOOTER - - def _wrap_tablelinenos(self, inner): - dummyoutfile = StringIO() - lncount = 0 - for t, line in inner: - if t: - lncount += 1 - dummyoutfile.write(line) - - fl = self.linenostart - mw = len(str(lncount + fl - 1)) - sp = self.linenospecial - st = self.linenostep - anchor_name = self.lineanchors or self.linespans - aln = self.anchorlinenos - nocls = self.noclasses - - lines = [] - - for i in range(fl, fl+lncount): - print_line = i % st == 0 - special_line = sp and i % sp == 0 - - if print_line: - line = '%*d' % (mw, i) - if aln: - line = '<a href="#%s-%d">%s</a>' % (anchor_name, i, line) - else: - line = ' ' * mw - - if nocls: - if special_line: - style = ' style="%s"' % self._linenos_special_style - else: - style = ' style="%s"' % self._linenos_style - else: - if special_line: - style = ' class="special"' - else: - style = ' class="normal"' - - if style: - line = '<span%s>%s</span>' % (style, line) - - lines.append(line) - - ls = '\n'.join(lines) - - # If a filename was specified, we can't put it into the code table as it - # would misalign the line numbers. Hence we emit a separate row for it. - filename_tr = "" - if self.filename: - filename_tr = ( - '<tr><th colspan="2" class="filename">' - '<span class="filename">' + self.filename + '</span>' - '</th></tr>') - - # in case you wonder about the seemingly redundant <div> here: since the - # content in the other cell also is wrapped in a div, some browsers in - # some configurations seem to mess up the formatting... - yield 0, (f'<table class="{self.cssclass}table">' + filename_tr + - '<tr><td class="linenos"><div class="linenodiv"><pre>' + - ls + '</pre></div></td><td class="code">') - yield 0, '<div>' - yield 0, dummyoutfile.getvalue() - yield 0, '</div>' - yield 0, '</td></tr></table>' - - - def _wrap_inlinelinenos(self, inner): - # need a list of lines since we need the width of a single number :( - inner_lines = list(inner) - sp = self.linenospecial - st = self.linenostep - num = self.linenostart - mw = len(str(len(inner_lines) + num - 1)) - anchor_name = self.lineanchors or self.linespans - aln = self.anchorlinenos - nocls = self.noclasses - - for _, inner_line in inner_lines: - print_line = num % st == 0 - special_line = sp and num % sp == 0 - - if print_line: - line = '%*d' % (mw, num) - else: - line = ' ' * mw - - if nocls: - if special_line: - style = ' style="%s"' % self._linenos_special_style - else: - style = ' style="%s"' % self._linenos_style - else: - if special_line: - style = ' class="linenos special"' - else: - style = ' class="linenos"' - - if style: - linenos = '<span%s>%s</span>' % (style, line) - else: - linenos = line - - if aln: - yield 1, ('<a href="#%s-%d">%s</a>' % (anchor_name, num, linenos) + - inner_line) - else: - yield 1, linenos + inner_line - num += 1 - - def _wrap_lineanchors(self, inner): - s = self.lineanchors - # subtract 1 since we have to increment i *before* yielding - i = self.linenostart - 1 - for t, line in inner: - if t: - i += 1 - href = "" if self.linenos else ' href="#%s-%d"' % (s, i) - yield 1, '<a id="%s-%d" name="%s-%d"%s></a>' % (s, i, s, i, href) + line - else: - yield 0, line - - def _wrap_linespans(self, inner): - s = self.linespans - i = self.linenostart - 1 - for t, line in inner: - if t: - i += 1 - yield 1, '<span id="%s-%d">%s</span>' % (s, i, line) - else: - yield 0, line - - def _wrap_div(self, inner): - style = [] - if (self.noclasses and not self.nobackground and - self.style.background_color is not None): - style.append('background: %s' % (self.style.background_color,)) - if self.cssstyles: - style.append(self.cssstyles) - style = '; '.join(style) - - yield 0, ('<div' + (self.cssclass and ' class="%s"' % self.cssclass) + - (style and (' style="%s"' % style)) + '>') - yield from inner - yield 0, '</div>\n' - - def _wrap_pre(self, inner): - style = [] - if self.prestyles: - style.append(self.prestyles) - if self.noclasses: - style.append(self._pre_style) - style = '; '.join(style) - - if self.filename and self.linenos != 1: - yield 0, ('<span class="filename">' + self.filename + '</span>') - - # the empty span here is to keep leading empty lines from being - # ignored by HTML parsers - yield 0, ('<pre' + (style and ' style="%s"' % style) + '><span></span>') - yield from inner - yield 0, '</pre>' - - def _wrap_code(self, inner): - yield 0, '<code>' - yield from inner - yield 0, '</code>' - - @functools.lru_cache(maxsize=100) - def _translate_parts(self, value): - """HTML-escape a value and split it by newlines.""" - return value.translate(_escape_html_table).split('\n') - - def _format_lines(self, tokensource): - """ - Just format the tokens, without any wrapping tags. - Yield individual lines. - """ - nocls = self.noclasses - lsep = self.lineseparator - tagsfile = self.tagsfile - - lspan = '' - line = [] - for ttype, value in tokensource: - try: - cspan = self.span_element_openers[ttype] - except KeyError: - title = ' title="%s"' % '.'.join(ttype) if self.debug_token_types else '' - if nocls: - css_style = self._get_css_inline_styles(ttype) - if css_style: - css_style = self.class2style[css_style][0] - cspan = '<span style="%s"%s>' % (css_style, title) - else: - cspan = '' - else: - css_class = self._get_css_classes(ttype) - if css_class: - cspan = '<span class="%s"%s>' % (css_class, title) - else: - cspan = '' - self.span_element_openers[ttype] = cspan - - parts = self._translate_parts(value) - - if tagsfile and ttype in Token.Name: - filename, linenumber = self._lookup_ctag(value) - if linenumber: - base, filename = os.path.split(filename) - if base: - base += '/' - filename, extension = os.path.splitext(filename) - url = self.tagurlformat % {'path': base, 'fname': filename, - 'fext': extension} - parts[0] = "<a href=\"%s#%s-%d\">%s" % \ - (url, self.lineanchors, linenumber, parts[0]) - parts[-1] = parts[-1] + "</a>" - - # for all but the last line - for part in parts[:-1]: - if line: - # Also check for part being non-empty, so we avoid creating - # empty <span> tags - if lspan != cspan and part: - line.extend(((lspan and '</span>'), cspan, part, - (cspan and '</span>'), lsep)) - else: # both are the same, or the current part was empty - line.extend((part, (lspan and '</span>'), lsep)) - yield 1, ''.join(line) - line = [] - elif part: - yield 1, ''.join((cspan, part, (cspan and '</span>'), lsep)) - else: - yield 1, lsep - # for the last line - if line and parts[-1]: - if lspan != cspan: - line.extend(((lspan and '</span>'), cspan, parts[-1])) - lspan = cspan - else: - line.append(parts[-1]) - elif parts[-1]: - line = [cspan, parts[-1]] - lspan = cspan - # else we neither have to open a new span nor set lspan - - if line: - line.extend(((lspan and '</span>'), lsep)) - yield 1, ''.join(line) - - def _lookup_ctag(self, token): - entry = ctags.TagEntry() - if self._ctags.find(entry, token.encode(), 0): - return entry['file'], entry['lineNumber'] - else: - return None, None - - def _highlight_lines(self, tokensource): - """ - Highlighted the lines specified in the `hl_lines` option by - post-processing the token stream coming from `_format_lines`. - """ - hls = self.hl_lines - - for i, (t, value) in enumerate(tokensource): - if t != 1: - yield t, value - if i + 1 in hls: # i + 1 because Python indexes start at 0 - if self.noclasses: - style = '' - if self.style.highlight_color is not None: - style = (' style="background-color: %s"' % - (self.style.highlight_color,)) - yield 1, '<span%s>%s</span>' % (style, value) - else: - yield 1, '<span class="hll">%s</span>' % value - else: - yield 1, value - - def wrap(self, source): - """ - Wrap the ``source``, which is a generator yielding - individual lines, in custom generators. See docstring - for `format`. Can be overridden. - """ - - output = source - if self.wrapcode: - output = self._wrap_code(output) - - output = self._wrap_pre(output) - - return output - - def format_unencoded(self, tokensource, outfile): - """ - The formatting process uses several nested generators; which of - them are used is determined by the user's options. - - Each generator should take at least one argument, ``inner``, - and wrap the pieces of text generated by this. - - Always yield 2-tuples: (code, text). If "code" is 1, the text - is part of the original tokensource being highlighted, if it's - 0, the text is some piece of wrapping. This makes it possible to - use several different wrappers that process the original source - linewise, e.g. line number generators. - """ - source = self._format_lines(tokensource) - - # As a special case, we wrap line numbers before line highlighting - # so the line numbers get wrapped in the highlighting tag. - if not self.nowrap and self.linenos == 2: - source = self._wrap_inlinelinenos(source) - - if self.hl_lines: - source = self._highlight_lines(source) - - if not self.nowrap: - if self.lineanchors: - source = self._wrap_lineanchors(source) - if self.linespans: - source = self._wrap_linespans(source) - source = self.wrap(source) - if self.linenos == 1: - source = self._wrap_tablelinenos(source) - source = self._wrap_div(source) - if self.full: - source = self._wrap_full(source, outfile) - - for t, piece in source: - outfile.write(piece) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/img.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/img.py deleted file mode 100644 index a338c15..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/img.py +++ /dev/null @@ -1,645 +0,0 @@ -""" - pygments.formatters.img - ~~~~~~~~~~~~~~~~~~~~~~~ - - Formatter for Pixmap output. - - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -import os -import sys - -from pip._vendor.pygments.formatter import Formatter -from pip._vendor.pygments.util import get_bool_opt, get_int_opt, get_list_opt, \ - get_choice_opt - -import subprocess - -# Import this carefully -try: - from PIL import Image, ImageDraw, ImageFont - pil_available = True -except ImportError: - pil_available = False - -try: - import _winreg -except ImportError: - try: - import winreg as _winreg - except ImportError: - _winreg = None - -__all__ = ['ImageFormatter', 'GifImageFormatter', 'JpgImageFormatter', - 'BmpImageFormatter'] - - -# For some unknown reason every font calls it something different -STYLES = { - 'NORMAL': ['', 'Roman', 'Book', 'Normal', 'Regular', 'Medium'], - 'ITALIC': ['Oblique', 'Italic'], - 'BOLD': ['Bold'], - 'BOLDITALIC': ['Bold Oblique', 'Bold Italic'], -} - -# A sane default for modern systems -DEFAULT_FONT_NAME_NIX = 'DejaVu Sans Mono' -DEFAULT_FONT_NAME_WIN = 'Courier New' -DEFAULT_FONT_NAME_MAC = 'Menlo' - - -class PilNotAvailable(ImportError): - """When Python imaging library is not available""" - - -class FontNotFound(Exception): - """When there are no usable fonts specified""" - - -class FontManager: - """ - Manages a set of fonts: normal, italic, bold, etc... - """ - - def __init__(self, font_name, font_size=14): - self.font_name = font_name - self.font_size = font_size - self.fonts = {} - self.encoding = None - if sys.platform.startswith('win'): - if not font_name: - self.font_name = DEFAULT_FONT_NAME_WIN - self._create_win() - elif sys.platform.startswith('darwin'): - if not font_name: - self.font_name = DEFAULT_FONT_NAME_MAC - self._create_mac() - else: - if not font_name: - self.font_name = DEFAULT_FONT_NAME_NIX - self._create_nix() - - def _get_nix_font_path(self, name, style): - proc = subprocess.Popen(['fc-list', "%s:style=%s" % (name, style), 'file'], - stdout=subprocess.PIPE, stderr=None) - stdout, _ = proc.communicate() - if proc.returncode == 0: - lines = stdout.splitlines() - for line in lines: - if line.startswith(b'Fontconfig warning:'): - continue - path = line.decode().strip().strip(':') - if path: - return path - return None - - def _create_nix(self): - for name in STYLES['NORMAL']: - path = self._get_nix_font_path(self.font_name, name) - if path is not None: - self.fonts['NORMAL'] = ImageFont.truetype(path, self.font_size) - break - else: - raise FontNotFound('No usable fonts named: "%s"' % - self.font_name) - for style in ('ITALIC', 'BOLD', 'BOLDITALIC'): - for stylename in STYLES[style]: - path = self._get_nix_font_path(self.font_name, stylename) - if path is not None: - self.fonts[style] = ImageFont.truetype(path, self.font_size) - break - else: - if style == 'BOLDITALIC': - self.fonts[style] = self.fonts['BOLD'] - else: - self.fonts[style] = self.fonts['NORMAL'] - - def _get_mac_font_path(self, font_map, name, style): - return font_map.get((name + ' ' + style).strip().lower()) - - def _create_mac(self): - font_map = {} - for font_dir in (os.path.join(os.getenv("HOME"), 'Library/Fonts/'), - '/Library/Fonts/', '/System/Library/Fonts/'): - font_map.update( - (os.path.splitext(f)[0].lower(), os.path.join(font_dir, f)) - for f in os.listdir(font_dir) - if f.lower().endswith(('ttf', 'ttc'))) - - for name in STYLES['NORMAL']: - path = self._get_mac_font_path(font_map, self.font_name, name) - if path is not None: - self.fonts['NORMAL'] = ImageFont.truetype(path, self.font_size) - break - else: - raise FontNotFound('No usable fonts named: "%s"' % - self.font_name) - for style in ('ITALIC', 'BOLD', 'BOLDITALIC'): - for stylename in STYLES[style]: - path = self._get_mac_font_path(font_map, self.font_name, stylename) - if path is not None: - self.fonts[style] = ImageFont.truetype(path, self.font_size) - break - else: - if style == 'BOLDITALIC': - self.fonts[style] = self.fonts['BOLD'] - else: - self.fonts[style] = self.fonts['NORMAL'] - - def _lookup_win(self, key, basename, styles, fail=False): - for suffix in ('', ' (TrueType)'): - for style in styles: - try: - valname = '%s%s%s' % (basename, style and ' '+style, suffix) - val, _ = _winreg.QueryValueEx(key, valname) - return val - except OSError: - continue - else: - if fail: - raise FontNotFound('Font %s (%s) not found in registry' % - (basename, styles[0])) - return None - - def _create_win(self): - lookuperror = None - keynames = [ (_winreg.HKEY_CURRENT_USER, r'Software\Microsoft\Windows NT\CurrentVersion\Fonts'), - (_winreg.HKEY_CURRENT_USER, r'Software\Microsoft\Windows\CurrentVersion\Fonts'), - (_winreg.HKEY_LOCAL_MACHINE, r'Software\Microsoft\Windows NT\CurrentVersion\Fonts'), - (_winreg.HKEY_LOCAL_MACHINE, r'Software\Microsoft\Windows\CurrentVersion\Fonts') ] - for keyname in keynames: - try: - key = _winreg.OpenKey(*keyname) - try: - path = self._lookup_win(key, self.font_name, STYLES['NORMAL'], True) - self.fonts['NORMAL'] = ImageFont.truetype(path, self.font_size) - for style in ('ITALIC', 'BOLD', 'BOLDITALIC'): - path = self._lookup_win(key, self.font_name, STYLES[style]) - if path: - self.fonts[style] = ImageFont.truetype(path, self.font_size) - else: - if style == 'BOLDITALIC': - self.fonts[style] = self.fonts['BOLD'] - else: - self.fonts[style] = self.fonts['NORMAL'] - return - except FontNotFound as err: - lookuperror = err - finally: - _winreg.CloseKey(key) - except OSError: - pass - else: - # If we get here, we checked all registry keys and had no luck - # We can be in one of two situations now: - # * All key lookups failed. In this case lookuperror is None and we - # will raise a generic error - # * At least one lookup failed with a FontNotFound error. In this - # case, we will raise that as a more specific error - if lookuperror: - raise lookuperror - raise FontNotFound('Can\'t open Windows font registry key') - - def get_char_size(self): - """ - Get the character size. - """ - return self.get_text_size('M') - - def get_text_size(self, text): - """ - Get the text size (width, height). - """ - font = self.fonts['NORMAL'] - if hasattr(font, 'getbbox'): # Pillow >= 9.2.0 - return font.getbbox(text)[2:4] - else: - return font.getsize(text) - - def get_font(self, bold, oblique): - """ - Get the font based on bold and italic flags. - """ - if bold and oblique: - return self.fonts['BOLDITALIC'] - elif bold: - return self.fonts['BOLD'] - elif oblique: - return self.fonts['ITALIC'] - else: - return self.fonts['NORMAL'] - - -class ImageFormatter(Formatter): - """ - Create a PNG image from source code. This uses the Python Imaging Library to - generate a pixmap from the source code. - - .. versionadded:: 0.10 - - Additional options accepted: - - `image_format` - An image format to output to that is recognised by PIL, these include: - - * "PNG" (default) - * "JPEG" - * "BMP" - * "GIF" - - `line_pad` - The extra spacing (in pixels) between each line of text. - - Default: 2 - - `font_name` - The font name to be used as the base font from which others, such as - bold and italic fonts will be generated. This really should be a - monospace font to look sane. - - Default: "Courier New" on Windows, "Menlo" on Mac OS, and - "DejaVu Sans Mono" on \\*nix - - `font_size` - The font size in points to be used. - - Default: 14 - - `image_pad` - The padding, in pixels to be used at each edge of the resulting image. - - Default: 10 - - `line_numbers` - Whether line numbers should be shown: True/False - - Default: True - - `line_number_start` - The line number of the first line. - - Default: 1 - - `line_number_step` - The step used when printing line numbers. - - Default: 1 - - `line_number_bg` - The background colour (in "#123456" format) of the line number bar, or - None to use the style background color. - - Default: "#eed" - - `line_number_fg` - The text color of the line numbers (in "#123456"-like format). - - Default: "#886" - - `line_number_chars` - The number of columns of line numbers allowable in the line number - margin. - - Default: 2 - - `line_number_bold` - Whether line numbers will be bold: True/False - - Default: False - - `line_number_italic` - Whether line numbers will be italicized: True/False - - Default: False - - `line_number_separator` - Whether a line will be drawn between the line number area and the - source code area: True/False - - Default: True - - `line_number_pad` - The horizontal padding (in pixels) between the line number margin, and - the source code area. - - Default: 6 - - `hl_lines` - Specify a list of lines to be highlighted. - - .. versionadded:: 1.2 - - Default: empty list - - `hl_color` - Specify the color for highlighting lines. - - .. versionadded:: 1.2 - - Default: highlight color of the selected style - """ - - # Required by the pygments mapper - name = 'img' - aliases = ['img', 'IMG', 'png'] - filenames = ['*.png'] - - unicodeoutput = False - - default_image_format = 'png' - - def __init__(self, **options): - """ - See the class docstring for explanation of options. - """ - if not pil_available: - raise PilNotAvailable( - 'Python Imaging Library is required for this formatter') - Formatter.__init__(self, **options) - self.encoding = 'latin1' # let pygments.format() do the right thing - # Read the style - self.styles = dict(self.style) - if self.style.background_color is None: - self.background_color = '#fff' - else: - self.background_color = self.style.background_color - # Image options - self.image_format = get_choice_opt( - options, 'image_format', ['png', 'jpeg', 'gif', 'bmp'], - self.default_image_format, normcase=True) - self.image_pad = get_int_opt(options, 'image_pad', 10) - self.line_pad = get_int_opt(options, 'line_pad', 2) - # The fonts - fontsize = get_int_opt(options, 'font_size', 14) - self.fonts = FontManager(options.get('font_name', ''), fontsize) - self.fontw, self.fonth = self.fonts.get_char_size() - # Line number options - self.line_number_fg = options.get('line_number_fg', '#886') - self.line_number_bg = options.get('line_number_bg', '#eed') - self.line_number_chars = get_int_opt(options, - 'line_number_chars', 2) - self.line_number_bold = get_bool_opt(options, - 'line_number_bold', False) - self.line_number_italic = get_bool_opt(options, - 'line_number_italic', False) - self.line_number_pad = get_int_opt(options, 'line_number_pad', 6) - self.line_numbers = get_bool_opt(options, 'line_numbers', True) - self.line_number_separator = get_bool_opt(options, - 'line_number_separator', True) - self.line_number_step = get_int_opt(options, 'line_number_step', 1) - self.line_number_start = get_int_opt(options, 'line_number_start', 1) - if self.line_numbers: - self.line_number_width = (self.fontw * self.line_number_chars + - self.line_number_pad * 2) - else: - self.line_number_width = 0 - self.hl_lines = [] - hl_lines_str = get_list_opt(options, 'hl_lines', []) - for line in hl_lines_str: - try: - self.hl_lines.append(int(line)) - except ValueError: - pass - self.hl_color = options.get('hl_color', - self.style.highlight_color) or '#f90' - self.drawables = [] - - def get_style_defs(self, arg=''): - raise NotImplementedError('The -S option is meaningless for the image ' - 'formatter. Use -O style=<stylename> instead.') - - def _get_line_height(self): - """ - Get the height of a line. - """ - return self.fonth + self.line_pad - - def _get_line_y(self, lineno): - """ - Get the Y coordinate of a line number. - """ - return lineno * self._get_line_height() + self.image_pad - - def _get_char_width(self): - """ - Get the width of a character. - """ - return self.fontw - - def _get_char_x(self, linelength): - """ - Get the X coordinate of a character position. - """ - return linelength + self.image_pad + self.line_number_width - - def _get_text_pos(self, linelength, lineno): - """ - Get the actual position for a character and line position. - """ - return self._get_char_x(linelength), self._get_line_y(lineno) - - def _get_linenumber_pos(self, lineno): - """ - Get the actual position for the start of a line number. - """ - return (self.image_pad, self._get_line_y(lineno)) - - def _get_text_color(self, style): - """ - Get the correct color for the token from the style. - """ - if style['color'] is not None: - fill = '#' + style['color'] - else: - fill = '#000' - return fill - - def _get_text_bg_color(self, style): - """ - Get the correct background color for the token from the style. - """ - if style['bgcolor'] is not None: - bg_color = '#' + style['bgcolor'] - else: - bg_color = None - return bg_color - - def _get_style_font(self, style): - """ - Get the correct font for the style. - """ - return self.fonts.get_font(style['bold'], style['italic']) - - def _get_image_size(self, maxlinelength, maxlineno): - """ - Get the required image size. - """ - return (self._get_char_x(maxlinelength) + self.image_pad, - self._get_line_y(maxlineno + 0) + self.image_pad) - - def _draw_linenumber(self, posno, lineno): - """ - Remember a line number drawable to paint later. - """ - self._draw_text( - self._get_linenumber_pos(posno), - str(lineno).rjust(self.line_number_chars), - font=self.fonts.get_font(self.line_number_bold, - self.line_number_italic), - text_fg=self.line_number_fg, - text_bg=None, - ) - - def _draw_text(self, pos, text, font, text_fg, text_bg): - """ - Remember a single drawable tuple to paint later. - """ - self.drawables.append((pos, text, font, text_fg, text_bg)) - - def _create_drawables(self, tokensource): - """ - Create drawables for the token content. - """ - lineno = charno = maxcharno = 0 - maxlinelength = linelength = 0 - for ttype, value in tokensource: - while ttype not in self.styles: - ttype = ttype.parent - style = self.styles[ttype] - # TODO: make sure tab expansion happens earlier in the chain. It - # really ought to be done on the input, as to do it right here is - # quite complex. - value = value.expandtabs(4) - lines = value.splitlines(True) - # print lines - for i, line in enumerate(lines): - temp = line.rstrip('\n') - if temp: - self._draw_text( - self._get_text_pos(linelength, lineno), - temp, - font = self._get_style_font(style), - text_fg = self._get_text_color(style), - text_bg = self._get_text_bg_color(style), - ) - temp_width, _ = self.fonts.get_text_size(temp) - linelength += temp_width - maxlinelength = max(maxlinelength, linelength) - charno += len(temp) - maxcharno = max(maxcharno, charno) - if line.endswith('\n'): - # add a line for each extra line in the value - linelength = 0 - charno = 0 - lineno += 1 - self.maxlinelength = maxlinelength - self.maxcharno = maxcharno - self.maxlineno = lineno - - def _draw_line_numbers(self): - """ - Create drawables for the line numbers. - """ - if not self.line_numbers: - return - for p in range(self.maxlineno): - n = p + self.line_number_start - if (n % self.line_number_step) == 0: - self._draw_linenumber(p, n) - - def _paint_line_number_bg(self, im): - """ - Paint the line number background on the image. - """ - if not self.line_numbers: - return - if self.line_number_fg is None: - return - draw = ImageDraw.Draw(im) - recth = im.size[-1] - rectw = self.image_pad + self.line_number_width - self.line_number_pad - draw.rectangle([(0, 0), (rectw, recth)], - fill=self.line_number_bg) - if self.line_number_separator: - draw.line([(rectw, 0), (rectw, recth)], fill=self.line_number_fg) - del draw - - def format(self, tokensource, outfile): - """ - Format ``tokensource``, an iterable of ``(tokentype, tokenstring)`` - tuples and write it into ``outfile``. - - This implementation calculates where it should draw each token on the - pixmap, then calculates the required pixmap size and draws the items. - """ - self._create_drawables(tokensource) - self._draw_line_numbers() - im = Image.new( - 'RGB', - self._get_image_size(self.maxlinelength, self.maxlineno), - self.background_color - ) - self._paint_line_number_bg(im) - draw = ImageDraw.Draw(im) - # Highlight - if self.hl_lines: - x = self.image_pad + self.line_number_width - self.line_number_pad + 1 - recth = self._get_line_height() - rectw = im.size[0] - x - for linenumber in self.hl_lines: - y = self._get_line_y(linenumber - 1) - draw.rectangle([(x, y), (x + rectw, y + recth)], - fill=self.hl_color) - for pos, value, font, text_fg, text_bg in self.drawables: - if text_bg: - text_size = draw.textsize(text=value, font=font) - draw.rectangle([pos[0], pos[1], pos[0] + text_size[0], pos[1] + text_size[1]], fill=text_bg) - draw.text(pos, value, font=font, fill=text_fg) - im.save(outfile, self.image_format.upper()) - - -# Add one formatter per format, so that the "-f gif" option gives the correct result -# when used in pygmentize. - -class GifImageFormatter(ImageFormatter): - """ - Create a GIF image from source code. This uses the Python Imaging Library to - generate a pixmap from the source code. - - .. versionadded:: 1.0 - """ - - name = 'img_gif' - aliases = ['gif'] - filenames = ['*.gif'] - default_image_format = 'gif' - - -class JpgImageFormatter(ImageFormatter): - """ - Create a JPEG image from source code. This uses the Python Imaging Library to - generate a pixmap from the source code. - - .. versionadded:: 1.0 - """ - - name = 'img_jpg' - aliases = ['jpg', 'jpeg'] - filenames = ['*.jpg'] - default_image_format = 'jpeg' - - -class BmpImageFormatter(ImageFormatter): - """ - Create a bitmap image from source code. This uses the Python Imaging Library to - generate a pixmap from the source code. - - .. versionadded:: 1.0 - """ - - name = 'img_bmp' - aliases = ['bmp', 'bitmap'] - filenames = ['*.bmp'] - default_image_format = 'bmp' diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/irc.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/irc.py deleted file mode 100644 index 2144d43..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/irc.py +++ /dev/null @@ -1,154 +0,0 @@ -""" - pygments.formatters.irc - ~~~~~~~~~~~~~~~~~~~~~~~ - - Formatter for IRC output - - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -from pip._vendor.pygments.formatter import Formatter -from pip._vendor.pygments.token import Keyword, Name, Comment, String, Error, \ - Number, Operator, Generic, Token, Whitespace -from pip._vendor.pygments.util import get_choice_opt - - -__all__ = ['IRCFormatter'] - - -#: Map token types to a tuple of color values for light and dark -#: backgrounds. -IRC_COLORS = { - Token: ('', ''), - - Whitespace: ('gray', 'brightblack'), - Comment: ('gray', 'brightblack'), - Comment.Preproc: ('cyan', 'brightcyan'), - Keyword: ('blue', 'brightblue'), - Keyword.Type: ('cyan', 'brightcyan'), - Operator.Word: ('magenta', 'brightcyan'), - Name.Builtin: ('cyan', 'brightcyan'), - Name.Function: ('green', 'brightgreen'), - Name.Namespace: ('_cyan_', '_brightcyan_'), - Name.Class: ('_green_', '_brightgreen_'), - Name.Exception: ('cyan', 'brightcyan'), - Name.Decorator: ('brightblack', 'gray'), - Name.Variable: ('red', 'brightred'), - Name.Constant: ('red', 'brightred'), - Name.Attribute: ('cyan', 'brightcyan'), - Name.Tag: ('brightblue', 'brightblue'), - String: ('yellow', 'yellow'), - Number: ('blue', 'brightblue'), - - Generic.Deleted: ('brightred', 'brightred'), - Generic.Inserted: ('green', 'brightgreen'), - Generic.Heading: ('**', '**'), - Generic.Subheading: ('*magenta*', '*brightmagenta*'), - Generic.Error: ('brightred', 'brightred'), - - Error: ('_brightred_', '_brightred_'), -} - - -IRC_COLOR_MAP = { - 'white': 0, - 'black': 1, - 'blue': 2, - 'brightgreen': 3, - 'brightred': 4, - 'yellow': 5, - 'magenta': 6, - 'orange': 7, - 'green': 7, #compat w/ ansi - 'brightyellow': 8, - 'lightgreen': 9, - 'brightcyan': 9, # compat w/ ansi - 'cyan': 10, - 'lightblue': 11, - 'red': 11, # compat w/ ansi - 'brightblue': 12, - 'brightmagenta': 13, - 'brightblack': 14, - 'gray': 15, -} - -def ircformat(color, text): - if len(color) < 1: - return text - add = sub = '' - if '_' in color: # italic - add += '\x1D' - sub = '\x1D' + sub - color = color.strip('_') - if '*' in color: # bold - add += '\x02' - sub = '\x02' + sub - color = color.strip('*') - # underline (\x1F) not supported - # backgrounds (\x03FF,BB) not supported - if len(color) > 0: # actual color - may have issues with ircformat("red", "blah")+"10" type stuff - add += '\x03' + str(IRC_COLOR_MAP[color]).zfill(2) - sub = '\x03' + sub - return add + text + sub - return '<'+add+'>'+text+'</'+sub+'>' - - -class IRCFormatter(Formatter): - r""" - Format tokens with IRC color sequences - - The `get_style_defs()` method doesn't do anything special since there is - no support for common styles. - - Options accepted: - - `bg` - Set to ``"light"`` or ``"dark"`` depending on the terminal's background - (default: ``"light"``). - - `colorscheme` - A dictionary mapping token types to (lightbg, darkbg) color names or - ``None`` (default: ``None`` = use builtin colorscheme). - - `linenos` - Set to ``True`` to have line numbers in the output as well - (default: ``False`` = no line numbers). - """ - name = 'IRC' - aliases = ['irc', 'IRC'] - filenames = [] - - def __init__(self, **options): - Formatter.__init__(self, **options) - self.darkbg = get_choice_opt(options, 'bg', - ['light', 'dark'], 'light') == 'dark' - self.colorscheme = options.get('colorscheme', None) or IRC_COLORS - self.linenos = options.get('linenos', False) - self._lineno = 0 - - def _write_lineno(self, outfile): - if self.linenos: - self._lineno += 1 - outfile.write("%04d: " % self._lineno) - - def format_unencoded(self, tokensource, outfile): - self._write_lineno(outfile) - - for ttype, value in tokensource: - color = self.colorscheme.get(ttype) - while color is None: - ttype = ttype[:-1] - color = self.colorscheme.get(ttype) - if color: - color = color[self.darkbg] - spl = value.split('\n') - for line in spl[:-1]: - if line: - outfile.write(ircformat(color, line)) - outfile.write('\n') - self._write_lineno(outfile) - if spl[-1]: - outfile.write(ircformat(color, spl[-1])) - else: - outfile.write(value) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/latex.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/latex.py deleted file mode 100644 index ca539b4..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/latex.py +++ /dev/null @@ -1,521 +0,0 @@ -""" - pygments.formatters.latex - ~~~~~~~~~~~~~~~~~~~~~~~~~ - - Formatter for LaTeX fancyvrb output. - - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -from io import StringIO - -from pip._vendor.pygments.formatter import Formatter -from pip._vendor.pygments.lexer import Lexer, do_insertions -from pip._vendor.pygments.token import Token, STANDARD_TYPES -from pip._vendor.pygments.util import get_bool_opt, get_int_opt - - -__all__ = ['LatexFormatter'] - - -def escape_tex(text, commandprefix): - return text.replace('\\', '\x00'). \ - replace('{', '\x01'). \ - replace('}', '\x02'). \ - replace('\x00', r'\%sZbs{}' % commandprefix). \ - replace('\x01', r'\%sZob{}' % commandprefix). \ - replace('\x02', r'\%sZcb{}' % commandprefix). \ - replace('^', r'\%sZca{}' % commandprefix). \ - replace('_', r'\%sZus{}' % commandprefix). \ - replace('&', r'\%sZam{}' % commandprefix). \ - replace('<', r'\%sZlt{}' % commandprefix). \ - replace('>', r'\%sZgt{}' % commandprefix). \ - replace('#', r'\%sZsh{}' % commandprefix). \ - replace('%', r'\%sZpc{}' % commandprefix). \ - replace('$', r'\%sZdl{}' % commandprefix). \ - replace('-', r'\%sZhy{}' % commandprefix). \ - replace("'", r'\%sZsq{}' % commandprefix). \ - replace('"', r'\%sZdq{}' % commandprefix). \ - replace('~', r'\%sZti{}' % commandprefix) - - -DOC_TEMPLATE = r''' -\documentclass{%(docclass)s} -\usepackage{fancyvrb} -\usepackage{color} -\usepackage[%(encoding)s]{inputenc} -%(preamble)s - -%(styledefs)s - -\begin{document} - -\section*{%(title)s} - -%(code)s -\end{document} -''' - -## Small explanation of the mess below :) -# -# The previous version of the LaTeX formatter just assigned a command to -# each token type defined in the current style. That obviously is -# problematic if the highlighted code is produced for a different style -# than the style commands themselves. -# -# This version works much like the HTML formatter which assigns multiple -# CSS classes to each <span> tag, from the most specific to the least -# specific token type, thus falling back to the parent token type if one -# is not defined. Here, the classes are there too and use the same short -# forms given in token.STANDARD_TYPES. -# -# Highlighted code now only uses one custom command, which by default is -# \PY and selectable by the commandprefix option (and in addition the -# escapes \PYZat, \PYZlb and \PYZrb which haven't been renamed for -# backwards compatibility purposes). -# -# \PY has two arguments: the classes, separated by +, and the text to -# render in that style. The classes are resolved into the respective -# style commands by magic, which serves to ignore unknown classes. -# -# The magic macros are: -# * \PY@it, \PY@bf, etc. are unconditionally wrapped around the text -# to render in \PY@do. Their definition determines the style. -# * \PY@reset resets \PY@it etc. to do nothing. -# * \PY@toks parses the list of classes, using magic inspired by the -# keyval package (but modified to use plusses instead of commas -# because fancyvrb redefines commas inside its environments). -# * \PY@tok processes one class, calling the \PY@tok@classname command -# if it exists. -# * \PY@tok@classname sets the \PY@it etc. to reflect the chosen style -# for its class. -# * \PY resets the style, parses the classnames and then calls \PY@do. -# -# Tip: to read this code, print it out in substituted form using e.g. -# >>> print STYLE_TEMPLATE % {'cp': 'PY'} - -STYLE_TEMPLATE = r''' -\makeatletter -\def\%(cp)s@reset{\let\%(cp)s@it=\relax \let\%(cp)s@bf=\relax%% - \let\%(cp)s@ul=\relax \let\%(cp)s@tc=\relax%% - \let\%(cp)s@bc=\relax \let\%(cp)s@ff=\relax} -\def\%(cp)s@tok#1{\csname %(cp)s@tok@#1\endcsname} -\def\%(cp)s@toks#1+{\ifx\relax#1\empty\else%% - \%(cp)s@tok{#1}\expandafter\%(cp)s@toks\fi} -\def\%(cp)s@do#1{\%(cp)s@bc{\%(cp)s@tc{\%(cp)s@ul{%% - \%(cp)s@it{\%(cp)s@bf{\%(cp)s@ff{#1}}}}}}} -\def\%(cp)s#1#2{\%(cp)s@reset\%(cp)s@toks#1+\relax+\%(cp)s@do{#2}} - -%(styles)s - -\def\%(cp)sZbs{\char`\\} -\def\%(cp)sZus{\char`\_} -\def\%(cp)sZob{\char`\{} -\def\%(cp)sZcb{\char`\}} -\def\%(cp)sZca{\char`\^} -\def\%(cp)sZam{\char`\&} -\def\%(cp)sZlt{\char`\<} -\def\%(cp)sZgt{\char`\>} -\def\%(cp)sZsh{\char`\#} -\def\%(cp)sZpc{\char`\%%} -\def\%(cp)sZdl{\char`\$} -\def\%(cp)sZhy{\char`\-} -\def\%(cp)sZsq{\char`\'} -\def\%(cp)sZdq{\char`\"} -\def\%(cp)sZti{\char`\~} -%% for compatibility with earlier versions -\def\%(cp)sZat{@} -\def\%(cp)sZlb{[} -\def\%(cp)sZrb{]} -\makeatother -''' - - -def _get_ttype_name(ttype): - fname = STANDARD_TYPES.get(ttype) - if fname: - return fname - aname = '' - while fname is None: - aname = ttype[-1] + aname - ttype = ttype.parent - fname = STANDARD_TYPES.get(ttype) - return fname + aname - - -class LatexFormatter(Formatter): - r""" - Format tokens as LaTeX code. This needs the `fancyvrb` and `color` - standard packages. - - Without the `full` option, code is formatted as one ``Verbatim`` - environment, like this: - - .. sourcecode:: latex - - \begin{Verbatim}[commandchars=\\\{\}] - \PY{k}{def }\PY{n+nf}{foo}(\PY{n}{bar}): - \PY{k}{pass} - \end{Verbatim} - - Wrapping can be disabled using the `nowrap` option. - - The special command used here (``\PY``) and all the other macros it needs - are output by the `get_style_defs` method. - - With the `full` option, a complete LaTeX document is output, including - the command definitions in the preamble. - - The `get_style_defs()` method of a `LatexFormatter` returns a string - containing ``\def`` commands defining the macros needed inside the - ``Verbatim`` environments. - - Additional options accepted: - - `nowrap` - If set to ``True``, don't wrap the tokens at all, not even inside a - ``\begin{Verbatim}`` environment. This disables most other options - (default: ``False``). - - `style` - The style to use, can be a string or a Style subclass (default: - ``'default'``). - - `full` - Tells the formatter to output a "full" document, i.e. a complete - self-contained document (default: ``False``). - - `title` - If `full` is true, the title that should be used to caption the - document (default: ``''``). - - `docclass` - If the `full` option is enabled, this is the document class to use - (default: ``'article'``). - - `preamble` - If the `full` option is enabled, this can be further preamble commands, - e.g. ``\usepackage`` (default: ``''``). - - `linenos` - If set to ``True``, output line numbers (default: ``False``). - - `linenostart` - The line number for the first line (default: ``1``). - - `linenostep` - If set to a number n > 1, only every nth line number is printed. - - `verboptions` - Additional options given to the Verbatim environment (see the *fancyvrb* - docs for possible values) (default: ``''``). - - `commandprefix` - The LaTeX commands used to produce colored output are constructed - using this prefix and some letters (default: ``'PY'``). - - .. versionadded:: 0.7 - .. versionchanged:: 0.10 - The default is now ``'PY'`` instead of ``'C'``. - - `texcomments` - If set to ``True``, enables LaTeX comment lines. That is, LaTex markup - in comment tokens is not escaped so that LaTeX can render it (default: - ``False``). - - .. versionadded:: 1.2 - - `mathescape` - If set to ``True``, enables LaTeX math mode escape in comments. That - is, ``'$...$'`` inside a comment will trigger math mode (default: - ``False``). - - .. versionadded:: 1.2 - - `escapeinside` - If set to a string of length 2, enables escaping to LaTeX. Text - delimited by these 2 characters is read as LaTeX code and - typeset accordingly. It has no effect in string literals. It has - no effect in comments if `texcomments` or `mathescape` is - set. (default: ``''``). - - .. versionadded:: 2.0 - - `envname` - Allows you to pick an alternative environment name replacing Verbatim. - The alternate environment still has to support Verbatim's option syntax. - (default: ``'Verbatim'``). - - .. versionadded:: 2.0 - """ - name = 'LaTeX' - aliases = ['latex', 'tex'] - filenames = ['*.tex'] - - def __init__(self, **options): - Formatter.__init__(self, **options) - self.nowrap = get_bool_opt(options, 'nowrap', False) - self.docclass = options.get('docclass', 'article') - self.preamble = options.get('preamble', '') - self.linenos = get_bool_opt(options, 'linenos', False) - self.linenostart = abs(get_int_opt(options, 'linenostart', 1)) - self.linenostep = abs(get_int_opt(options, 'linenostep', 1)) - self.verboptions = options.get('verboptions', '') - self.nobackground = get_bool_opt(options, 'nobackground', False) - self.commandprefix = options.get('commandprefix', 'PY') - self.texcomments = get_bool_opt(options, 'texcomments', False) - self.mathescape = get_bool_opt(options, 'mathescape', False) - self.escapeinside = options.get('escapeinside', '') - if len(self.escapeinside) == 2: - self.left = self.escapeinside[0] - self.right = self.escapeinside[1] - else: - self.escapeinside = '' - self.envname = options.get('envname', 'Verbatim') - - self._create_stylesheet() - - def _create_stylesheet(self): - t2n = self.ttype2name = {Token: ''} - c2d = self.cmd2def = {} - cp = self.commandprefix - - def rgbcolor(col): - if col: - return ','.join(['%.2f' % (int(col[i] + col[i + 1], 16) / 255.0) - for i in (0, 2, 4)]) - else: - return '1,1,1' - - for ttype, ndef in self.style: - name = _get_ttype_name(ttype) - cmndef = '' - if ndef['bold']: - cmndef += r'\let\$$@bf=\textbf' - if ndef['italic']: - cmndef += r'\let\$$@it=\textit' - if ndef['underline']: - cmndef += r'\let\$$@ul=\underline' - if ndef['roman']: - cmndef += r'\let\$$@ff=\textrm' - if ndef['sans']: - cmndef += r'\let\$$@ff=\textsf' - if ndef['mono']: - cmndef += r'\let\$$@ff=\textsf' - if ndef['color']: - cmndef += (r'\def\$$@tc##1{\textcolor[rgb]{%s}{##1}}' % - rgbcolor(ndef['color'])) - if ndef['border']: - cmndef += (r'\def\$$@bc##1{{\setlength{\fboxsep}{\string -\fboxrule}' - r'\fcolorbox[rgb]{%s}{%s}{\strut ##1}}}' % - (rgbcolor(ndef['border']), - rgbcolor(ndef['bgcolor']))) - elif ndef['bgcolor']: - cmndef += (r'\def\$$@bc##1{{\setlength{\fboxsep}{0pt}' - r'\colorbox[rgb]{%s}{\strut ##1}}}' % - rgbcolor(ndef['bgcolor'])) - if cmndef == '': - continue - cmndef = cmndef.replace('$$', cp) - t2n[ttype] = name - c2d[name] = cmndef - - def get_style_defs(self, arg=''): - """ - Return the command sequences needed to define the commands - used to format text in the verbatim environment. ``arg`` is ignored. - """ - cp = self.commandprefix - styles = [] - for name, definition in self.cmd2def.items(): - styles.append(r'\@namedef{%s@tok@%s}{%s}' % (cp, name, definition)) - return STYLE_TEMPLATE % {'cp': self.commandprefix, - 'styles': '\n'.join(styles)} - - def format_unencoded(self, tokensource, outfile): - # TODO: add support for background colors - t2n = self.ttype2name - cp = self.commandprefix - - if self.full: - realoutfile = outfile - outfile = StringIO() - - if not self.nowrap: - outfile.write('\\begin{' + self.envname + '}[commandchars=\\\\\\{\\}') - if self.linenos: - start, step = self.linenostart, self.linenostep - outfile.write(',numbers=left' + - (start and ',firstnumber=%d' % start or '') + - (step and ',stepnumber=%d' % step or '')) - if self.mathescape or self.texcomments or self.escapeinside: - outfile.write(',codes={\\catcode`\\$=3\\catcode`\\^=7' - '\\catcode`\\_=8\\relax}') - if self.verboptions: - outfile.write(',' + self.verboptions) - outfile.write(']\n') - - for ttype, value in tokensource: - if ttype in Token.Comment: - if self.texcomments: - # Try to guess comment starting lexeme and escape it ... - start = value[0:1] - for i in range(1, len(value)): - if start[0] != value[i]: - break - start += value[i] - - value = value[len(start):] - start = escape_tex(start, cp) - - # ... but do not escape inside comment. - value = start + value - elif self.mathescape: - # Only escape parts not inside a math environment. - parts = value.split('$') - in_math = False - for i, part in enumerate(parts): - if not in_math: - parts[i] = escape_tex(part, cp) - in_math = not in_math - value = '$'.join(parts) - elif self.escapeinside: - text = value - value = '' - while text: - a, sep1, text = text.partition(self.left) - if sep1: - b, sep2, text = text.partition(self.right) - if sep2: - value += escape_tex(a, cp) + b - else: - value += escape_tex(a + sep1 + b, cp) - else: - value += escape_tex(a, cp) - else: - value = escape_tex(value, cp) - elif ttype not in Token.Escape: - value = escape_tex(value, cp) - styles = [] - while ttype is not Token: - try: - styles.append(t2n[ttype]) - except KeyError: - # not in current style - styles.append(_get_ttype_name(ttype)) - ttype = ttype.parent - styleval = '+'.join(reversed(styles)) - if styleval: - spl = value.split('\n') - for line in spl[:-1]: - if line: - outfile.write("\\%s{%s}{%s}" % (cp, styleval, line)) - outfile.write('\n') - if spl[-1]: - outfile.write("\\%s{%s}{%s}" % (cp, styleval, spl[-1])) - else: - outfile.write(value) - - if not self.nowrap: - outfile.write('\\end{' + self.envname + '}\n') - - if self.full: - encoding = self.encoding or 'utf8' - # map known existings encodings from LaTeX distribution - encoding = { - 'utf_8': 'utf8', - 'latin_1': 'latin1', - 'iso_8859_1': 'latin1', - }.get(encoding.replace('-', '_'), encoding) - realoutfile.write(DOC_TEMPLATE % - dict(docclass = self.docclass, - preamble = self.preamble, - title = self.title, - encoding = encoding, - styledefs = self.get_style_defs(), - code = outfile.getvalue())) - - -class LatexEmbeddedLexer(Lexer): - """ - This lexer takes one lexer as argument, the lexer for the language - being formatted, and the left and right delimiters for escaped text. - - First everything is scanned using the language lexer to obtain - strings and comments. All other consecutive tokens are merged and - the resulting text is scanned for escaped segments, which are given - the Token.Escape type. Finally text that is not escaped is scanned - again with the language lexer. - """ - def __init__(self, left, right, lang, **options): - self.left = left - self.right = right - self.lang = lang - Lexer.__init__(self, **options) - - def get_tokens_unprocessed(self, text): - # find and remove all the escape tokens (replace with an empty string) - # this is very similar to DelegatingLexer.get_tokens_unprocessed. - buffered = '' - insertions = [] - insertion_buf = [] - for i, t, v in self._find_safe_escape_tokens(text): - if t is None: - if insertion_buf: - insertions.append((len(buffered), insertion_buf)) - insertion_buf = [] - buffered += v - else: - insertion_buf.append((i, t, v)) - if insertion_buf: - insertions.append((len(buffered), insertion_buf)) - return do_insertions(insertions, - self.lang.get_tokens_unprocessed(buffered)) - - def _find_safe_escape_tokens(self, text): - """ find escape tokens that are not in strings or comments """ - for i, t, v in self._filter_to( - self.lang.get_tokens_unprocessed(text), - lambda t: t in Token.Comment or t in Token.String - ): - if t is None: - for i2, t2, v2 in self._find_escape_tokens(v): - yield i + i2, t2, v2 - else: - yield i, None, v - - def _filter_to(self, it, pred): - """ Keep only the tokens that match `pred`, merge the others together """ - buf = '' - idx = 0 - for i, t, v in it: - if pred(t): - if buf: - yield idx, None, buf - buf = '' - yield i, t, v - else: - if not buf: - idx = i - buf += v - if buf: - yield idx, None, buf - - def _find_escape_tokens(self, text): - """ Find escape tokens within text, give token=None otherwise """ - index = 0 - while text: - a, sep1, text = text.partition(self.left) - if a: - yield index, None, a - index += len(a) - if sep1: - b, sep2, text = text.partition(self.right) - if sep2: - yield index + len(sep1), Token.Escape, b - index += len(sep1) + len(b) + len(sep2) - else: - yield index, Token.Error, sep1 - index += len(sep1) - text = b diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/other.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/other.py deleted file mode 100644 index 990ead4..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/other.py +++ /dev/null @@ -1,161 +0,0 @@ -""" - pygments.formatters.other - ~~~~~~~~~~~~~~~~~~~~~~~~~ - - Other formatters: NullFormatter, RawTokenFormatter. - - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -from pip._vendor.pygments.formatter import Formatter -from pip._vendor.pygments.util import get_choice_opt -from pip._vendor.pygments.token import Token -from pip._vendor.pygments.console import colorize - -__all__ = ['NullFormatter', 'RawTokenFormatter', 'TestcaseFormatter'] - - -class NullFormatter(Formatter): - """ - Output the text unchanged without any formatting. - """ - name = 'Text only' - aliases = ['text', 'null'] - filenames = ['*.txt'] - - def format(self, tokensource, outfile): - enc = self.encoding - for ttype, value in tokensource: - if enc: - outfile.write(value.encode(enc)) - else: - outfile.write(value) - - -class RawTokenFormatter(Formatter): - r""" - Format tokens as a raw representation for storing token streams. - - The format is ``tokentype<TAB>repr(tokenstring)\n``. The output can later - be converted to a token stream with the `RawTokenLexer`, described in the - :doc:`lexer list <lexers>`. - - Only two options are accepted: - - `compress` - If set to ``'gz'`` or ``'bz2'``, compress the output with the given - compression algorithm after encoding (default: ``''``). - `error_color` - If set to a color name, highlight error tokens using that color. If - set but with no value, defaults to ``'red'``. - - .. versionadded:: 0.11 - - """ - name = 'Raw tokens' - aliases = ['raw', 'tokens'] - filenames = ['*.raw'] - - unicodeoutput = False - - def __init__(self, **options): - Formatter.__init__(self, **options) - # We ignore self.encoding if it is set, since it gets set for lexer - # and formatter if given with -Oencoding on the command line. - # The RawTokenFormatter outputs only ASCII. Override here. - self.encoding = 'ascii' # let pygments.format() do the right thing - self.compress = get_choice_opt(options, 'compress', - ['', 'none', 'gz', 'bz2'], '') - self.error_color = options.get('error_color', None) - if self.error_color is True: - self.error_color = 'red' - if self.error_color is not None: - try: - colorize(self.error_color, '') - except KeyError: - raise ValueError("Invalid color %r specified" % - self.error_color) - - def format(self, tokensource, outfile): - try: - outfile.write(b'') - except TypeError: - raise TypeError('The raw tokens formatter needs a binary ' - 'output file') - if self.compress == 'gz': - import gzip - outfile = gzip.GzipFile('', 'wb', 9, outfile) - - write = outfile.write - flush = outfile.close - elif self.compress == 'bz2': - import bz2 - compressor = bz2.BZ2Compressor(9) - - def write(text): - outfile.write(compressor.compress(text)) - - def flush(): - outfile.write(compressor.flush()) - outfile.flush() - else: - write = outfile.write - flush = outfile.flush - - if self.error_color: - for ttype, value in tokensource: - line = b"%r\t%r\n" % (ttype, value) - if ttype is Token.Error: - write(colorize(self.error_color, line)) - else: - write(line) - else: - for ttype, value in tokensource: - write(b"%r\t%r\n" % (ttype, value)) - flush() - - -TESTCASE_BEFORE = '''\ - def testNeedsName(lexer): - fragment = %r - tokens = [ -''' -TESTCASE_AFTER = '''\ - ] - assert list(lexer.get_tokens(fragment)) == tokens -''' - - -class TestcaseFormatter(Formatter): - """ - Format tokens as appropriate for a new testcase. - - .. versionadded:: 2.0 - """ - name = 'Testcase' - aliases = ['testcase'] - - def __init__(self, **options): - Formatter.__init__(self, **options) - if self.encoding is not None and self.encoding != 'utf-8': - raise ValueError("Only None and utf-8 are allowed encodings.") - - def format(self, tokensource, outfile): - indentation = ' ' * 12 - rawbuf = [] - outbuf = [] - for ttype, value in tokensource: - rawbuf.append(value) - outbuf.append('%s(%s, %r),\n' % (indentation, ttype, value)) - - before = TESTCASE_BEFORE % (''.join(rawbuf),) - during = ''.join(outbuf) - after = TESTCASE_AFTER - if self.encoding is None: - outfile.write(before + during + after) - else: - outfile.write(before.encode('utf-8')) - outfile.write(during.encode('utf-8')) - outfile.write(after.encode('utf-8')) - outfile.flush() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py deleted file mode 100644 index 6bb325d..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py +++ /dev/null @@ -1,83 +0,0 @@ -""" - pygments.formatters.pangomarkup - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - Formatter for Pango markup output. - - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -from pip._vendor.pygments.formatter import Formatter - - -__all__ = ['PangoMarkupFormatter'] - - -_escape_table = { - ord('&'): '&amp;', - ord('<'): '&lt;', -} - - -def escape_special_chars(text, table=_escape_table): - """Escape & and < for Pango Markup.""" - return text.translate(table) - - -class PangoMarkupFormatter(Formatter): - """ - Format tokens as Pango Markup code. It can then be rendered to an SVG. - - .. versionadded:: 2.9 - """ - - name = 'Pango Markup' - aliases = ['pango', 'pangomarkup'] - filenames = [] - - def __init__(self, **options): - Formatter.__init__(self, **options) - - self.styles = {} - - for token, style in self.style: - start = '' - end = '' - if style['color']: - start += '<span fgcolor="#%s">' % style['color'] - end = '</span>' + end - if style['bold']: - start += '<b>' - end = '</b>' + end - if style['italic']: - start += '<i>' - end = '</i>' + end - if style['underline']: - start += '<u>' - end = '</u>' + end - self.styles[token] = (start, end) - - def format_unencoded(self, tokensource, outfile): - lastval = '' - lasttype = None - - outfile.write('<tt>') - - for ttype, value in tokensource: - while ttype not in self.styles: - ttype = ttype.parent - if ttype == lasttype: - lastval += escape_special_chars(value) - else: - if lastval: - stylebegin, styleend = self.styles[lasttype] - outfile.write(stylebegin + lastval + styleend) - lastval = escape_special_chars(value) - lasttype = ttype - - if lastval: - stylebegin, styleend = self.styles[lasttype] - outfile.write(stylebegin + lastval + styleend) - - outfile.write('</tt>') diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/rtf.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/rtf.py deleted file mode 100644 index 125189c..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/rtf.py +++ /dev/null @@ -1,146 +0,0 @@ -""" - pygments.formatters.rtf - ~~~~~~~~~~~~~~~~~~~~~~~ - - A formatter that generates RTF files. - - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -from pip._vendor.pygments.formatter import Formatter -from pip._vendor.pygments.util import get_int_opt, surrogatepair - - -__all__ = ['RtfFormatter'] - - -class RtfFormatter(Formatter): - """ - Format tokens as RTF markup. This formatter automatically outputs full RTF - documents with color information and other useful stuff. Perfect for Copy and - Paste into Microsoft(R) Word(R) documents. - - Please note that ``encoding`` and ``outencoding`` options are ignored. - The RTF format is ASCII natively, but handles unicode characters correctly - thanks to escape sequences. - - .. versionadded:: 0.6 - - Additional options accepted: - - `style` - The style to use, can be a string or a Style subclass (default: - ``'default'``). - - `fontface` - The used font family, for example ``Bitstream Vera Sans``. Defaults to - some generic font which is supposed to have fixed width. - - `fontsize` - Size of the font used. Size is specified in half points. The - default is 24 half-points, giving a size 12 font. - - .. versionadded:: 2.0 - """ - name = 'RTF' - aliases = ['rtf'] - filenames = ['*.rtf'] - - def __init__(self, **options): - r""" - Additional options accepted: - - ``fontface`` - Name of the font used. Could for example be ``'Courier New'`` - to further specify the default which is ``'\fmodern'``. The RTF - specification claims that ``\fmodern`` are "Fixed-pitch serif - and sans serif fonts". Hope every RTF implementation thinks - the same about modern... - - """ - Formatter.__init__(self, **options) - self.fontface = options.get('fontface') or '' - self.fontsize = get_int_opt(options, 'fontsize', 0) - - def _escape(self, text): - return text.replace('\\', '\\\\') \ - .replace('{', '\\{') \ - .replace('}', '\\}') - - def _escape_text(self, text): - # empty strings, should give a small performance improvement - if not text: - return '' - - # escape text - text = self._escape(text) - - buf = [] - for c in text: - cn = ord(c) - if cn < (2**7): - # ASCII character - buf.append(str(c)) - elif (2**7) <= cn < (2**16): - # single unicode escape sequence - buf.append('{\\u%d}' % cn) - elif (2**16) <= cn: - # RTF limits unicode to 16 bits. - # Force surrogate pairs - buf.append('{\\u%d}{\\u%d}' % surrogatepair(cn)) - - return ''.join(buf).replace('\n', '\\par\n') - - def format_unencoded(self, tokensource, outfile): - # rtf 1.8 header - outfile.write('{\\rtf1\\ansi\\uc0\\deff0' - '{\\fonttbl{\\f0\\fmodern\\fprq1\\fcharset0%s;}}' - '{\\colortbl;' % (self.fontface and - ' ' + self._escape(self.fontface) or - '')) - - # convert colors and save them in a mapping to access them later. - color_mapping = {} - offset = 1 - for _, style in self.style: - for color in style['color'], style['bgcolor'], style['border']: - if color and color not in color_mapping: - color_mapping[color] = offset - outfile.write('\\red%d\\green%d\\blue%d;' % ( - int(color[0:2], 16), - int(color[2:4], 16), - int(color[4:6], 16) - )) - offset += 1 - outfile.write('}\\f0 ') - if self.fontsize: - outfile.write('\\fs%d' % self.fontsize) - - # highlight stream - for ttype, value in tokensource: - while not self.style.styles_token(ttype) and ttype.parent: - ttype = ttype.parent - style = self.style.style_for_token(ttype) - buf = [] - if style['bgcolor']: - buf.append('\\cb%d' % color_mapping[style['bgcolor']]) - if style['color']: - buf.append('\\cf%d' % color_mapping[style['color']]) - if style['bold']: - buf.append('\\b') - if style['italic']: - buf.append('\\i') - if style['underline']: - buf.append('\\ul') - if style['border']: - buf.append('\\chbrdr\\chcfpat%d' % - color_mapping[style['border']]) - start = ''.join(buf) - if start: - outfile.write('{%s ' % start) - outfile.write(self._escape_text(value)) - if start: - outfile.write('}') - - outfile.write('}') diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/svg.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/svg.py deleted file mode 100644 index a8727ed..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/svg.py +++ /dev/null @@ -1,188 +0,0 @@ -""" - pygments.formatters.svg - ~~~~~~~~~~~~~~~~~~~~~~~ - - Formatter for SVG output. - - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -from pip._vendor.pygments.formatter import Formatter -from pip._vendor.pygments.token import Comment -from pip._vendor.pygments.util import get_bool_opt, get_int_opt - -__all__ = ['SvgFormatter'] - - -def escape_html(text): - """Escape &, <, > as well as single and double quotes for HTML.""" - return text.replace('&', '&amp;'). \ - replace('<', '&lt;'). \ - replace('>', '&gt;'). \ - replace('"', '&quot;'). \ - replace("'", '&#39;') - - -class2style = {} - -class SvgFormatter(Formatter): - """ - Format tokens as an SVG graphics file. This formatter is still experimental. - Each line of code is a ``<text>`` element with explicit ``x`` and ``y`` - coordinates containing ``<tspan>`` elements with the individual token styles. - - By default, this formatter outputs a full SVG document including doctype - declaration and the ``<svg>`` root element. - - .. versionadded:: 0.9 - - Additional options accepted: - - `nowrap` - Don't wrap the SVG ``<text>`` elements in ``<svg><g>`` elements and - don't add a XML declaration and a doctype. If true, the `fontfamily` - and `fontsize` options are ignored. Defaults to ``False``. - - `fontfamily` - The value to give the wrapping ``<g>`` element's ``font-family`` - attribute, defaults to ``"monospace"``. - - `fontsize` - The value to give the wrapping ``<g>`` element's ``font-size`` - attribute, defaults to ``"14px"``. - - `linenos` - If ``True``, add line numbers (default: ``False``). - - `linenostart` - The line number for the first line (default: ``1``). - - `linenostep` - If set to a number n > 1, only every nth line number is printed. - - `linenowidth` - Maximum width devoted to line numbers (default: ``3*ystep``, sufficient - for up to 4-digit line numbers. Increase width for longer code blocks). - - `xoffset` - Starting offset in X direction, defaults to ``0``. - - `yoffset` - Starting offset in Y direction, defaults to the font size if it is given - in pixels, or ``20`` else. (This is necessary since text coordinates - refer to the text baseline, not the top edge.) - - `ystep` - Offset to add to the Y coordinate for each subsequent line. This should - roughly be the text size plus 5. It defaults to that value if the text - size is given in pixels, or ``25`` else. - - `spacehack` - Convert spaces in the source to ``&#160;``, which are non-breaking - spaces. SVG provides the ``xml:space`` attribute to control how - whitespace inside tags is handled, in theory, the ``preserve`` value - could be used to keep all whitespace as-is. However, many current SVG - viewers don't obey that rule, so this option is provided as a workaround - and defaults to ``True``. - """ - name = 'SVG' - aliases = ['svg'] - filenames = ['*.svg'] - - def __init__(self, **options): - Formatter.__init__(self, **options) - self.nowrap = get_bool_opt(options, 'nowrap', False) - self.fontfamily = options.get('fontfamily', 'monospace') - self.fontsize = options.get('fontsize', '14px') - self.xoffset = get_int_opt(options, 'xoffset', 0) - fs = self.fontsize.strip() - if fs.endswith('px'): fs = fs[:-2].strip() - try: - int_fs = int(fs) - except: - int_fs = 20 - self.yoffset = get_int_opt(options, 'yoffset', int_fs) - self.ystep = get_int_opt(options, 'ystep', int_fs + 5) - self.spacehack = get_bool_opt(options, 'spacehack', True) - self.linenos = get_bool_opt(options,'linenos',False) - self.linenostart = get_int_opt(options,'linenostart',1) - self.linenostep = get_int_opt(options,'linenostep',1) - self.linenowidth = get_int_opt(options,'linenowidth', 3*self.ystep) - self._stylecache = {} - - def format_unencoded(self, tokensource, outfile): - """ - Format ``tokensource``, an iterable of ``(tokentype, tokenstring)`` - tuples and write it into ``outfile``. - - For our implementation we put all lines in their own 'line group'. - """ - x = self.xoffset - y = self.yoffset - if not self.nowrap: - if self.encoding: - outfile.write('<?xml version="1.0" encoding="%s"?>\n' % - self.encoding) - else: - outfile.write('<?xml version="1.0"?>\n') - outfile.write('<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" ' - '"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/' - 'svg10.dtd">\n') - outfile.write('<svg xmlns="http://www.w3.org/2000/svg">\n') - outfile.write('<g font-family="%s" font-size="%s">\n' % - (self.fontfamily, self.fontsize)) - - counter = self.linenostart - counter_step = self.linenostep - counter_style = self._get_style(Comment) - line_x = x - - if self.linenos: - if counter % counter_step == 0: - outfile.write('<text x="%s" y="%s" %s text-anchor="end">%s</text>' % - (x+self.linenowidth,y,counter_style,counter)) - line_x += self.linenowidth + self.ystep - counter += 1 - - outfile.write('<text x="%s" y="%s" xml:space="preserve">' % (line_x, y)) - for ttype, value in tokensource: - style = self._get_style(ttype) - tspan = style and '<tspan' + style + '>' or '' - tspanend = tspan and '</tspan>' or '' - value = escape_html(value) - if self.spacehack: - value = value.expandtabs().replace(' ', '&#160;') - parts = value.split('\n') - for part in parts[:-1]: - outfile.write(tspan + part + tspanend) - y += self.ystep - outfile.write('</text>\n') - if self.linenos and counter % counter_step == 0: - outfile.write('<text x="%s" y="%s" text-anchor="end" %s>%s</text>' % - (x+self.linenowidth,y,counter_style,counter)) - - counter += 1 - outfile.write('<text x="%s" y="%s" ' 'xml:space="preserve">' % (line_x,y)) - outfile.write(tspan + parts[-1] + tspanend) - outfile.write('</text>') - - if not self.nowrap: - outfile.write('</g></svg>\n') - - def _get_style(self, tokentype): - if tokentype in self._stylecache: - return self._stylecache[tokentype] - otokentype = tokentype - while not self.style.styles_token(tokentype): - tokentype = tokentype.parent - value = self.style.style_for_token(tokentype) - result = '' - if value['color']: - result = ' fill="#' + value['color'] + '"' - if value['bold']: - result += ' font-weight="bold"' - if value['italic']: - result += ' font-style="italic"' - self._stylecache[otokentype] = result - return result diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal.py deleted file mode 100644 index abb8770..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal.py +++ /dev/null @@ -1,127 +0,0 @@ -""" - pygments.formatters.terminal - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - Formatter for terminal output with ANSI sequences. - - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -from pip._vendor.pygments.formatter import Formatter -from pip._vendor.pygments.token import Keyword, Name, Comment, String, Error, \ - Number, Operator, Generic, Token, Whitespace -from pip._vendor.pygments.console import ansiformat -from pip._vendor.pygments.util import get_choice_opt - - -__all__ = ['TerminalFormatter'] - - -#: Map token types to a tuple of color values for light and dark -#: backgrounds. -TERMINAL_COLORS = { - Token: ('', ''), - - Whitespace: ('gray', 'brightblack'), - Comment: ('gray', 'brightblack'), - Comment.Preproc: ('cyan', 'brightcyan'), - Keyword: ('blue', 'brightblue'), - Keyword.Type: ('cyan', 'brightcyan'), - Operator.Word: ('magenta', 'brightmagenta'), - Name.Builtin: ('cyan', 'brightcyan'), - Name.Function: ('green', 'brightgreen'), - Name.Namespace: ('_cyan_', '_brightcyan_'), - Name.Class: ('_green_', '_brightgreen_'), - Name.Exception: ('cyan', 'brightcyan'), - Name.Decorator: ('brightblack', 'gray'), - Name.Variable: ('red', 'brightred'), - Name.Constant: ('red', 'brightred'), - Name.Attribute: ('cyan', 'brightcyan'), - Name.Tag: ('brightblue', 'brightblue'), - String: ('yellow', 'yellow'), - Number: ('blue', 'brightblue'), - - Generic.Deleted: ('brightred', 'brightred'), - Generic.Inserted: ('green', 'brightgreen'), - Generic.Heading: ('**', '**'), - Generic.Subheading: ('*magenta*', '*brightmagenta*'), - Generic.Prompt: ('**', '**'), - Generic.Error: ('brightred', 'brightred'), - - Error: ('_brightred_', '_brightred_'), -} - - -class TerminalFormatter(Formatter): - r""" - Format tokens with ANSI color sequences, for output in a text console. - Color sequences are terminated at newlines, so that paging the output - works correctly. - - The `get_style_defs()` method doesn't do anything special since there is - no support for common styles. - - Options accepted: - - `bg` - Set to ``"light"`` or ``"dark"`` depending on the terminal's background - (default: ``"light"``). - - `colorscheme` - A dictionary mapping token types to (lightbg, darkbg) color names or - ``None`` (default: ``None`` = use builtin colorscheme). - - `linenos` - Set to ``True`` to have line numbers on the terminal output as well - (default: ``False`` = no line numbers). - """ - name = 'Terminal' - aliases = ['terminal', 'console'] - filenames = [] - - def __init__(self, **options): - Formatter.__init__(self, **options) - self.darkbg = get_choice_opt(options, 'bg', - ['light', 'dark'], 'light') == 'dark' - self.colorscheme = options.get('colorscheme', None) or TERMINAL_COLORS - self.linenos = options.get('linenos', False) - self._lineno = 0 - - def format(self, tokensource, outfile): - return Formatter.format(self, tokensource, outfile) - - def _write_lineno(self, outfile): - self._lineno += 1 - outfile.write("%s%04d: " % (self._lineno != 1 and '\n' or '', self._lineno)) - - def _get_color(self, ttype): - # self.colorscheme is a dict containing usually generic types, so we - # have to walk the tree of dots. The base Token type must be a key, - # even if it's empty string, as in the default above. - colors = self.colorscheme.get(ttype) - while colors is None: - ttype = ttype.parent - colors = self.colorscheme.get(ttype) - return colors[self.darkbg] - - def format_unencoded(self, tokensource, outfile): - if self.linenos: - self._write_lineno(outfile) - - for ttype, value in tokensource: - color = self._get_color(ttype) - - for line in value.splitlines(True): - if color: - outfile.write(ansiformat(color, line.rstrip('\n'))) - else: - outfile.write(line.rstrip('\n')) - if line.endswith('\n'): - if self.linenos: - self._write_lineno(outfile) - else: - outfile.write('\n') - - if self.linenos: - outfile.write("\n") diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal256.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal256.py deleted file mode 100644 index 0cfe5d1..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal256.py +++ /dev/null @@ -1,338 +0,0 @@ -""" - pygments.formatters.terminal256 - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - Formatter for 256-color terminal output with ANSI sequences. - - RGB-to-XTERM color conversion routines adapted from xterm256-conv - tool (http://frexx.de/xterm-256-notes/data/xterm256-conv2.tar.bz2) - by Wolfgang Frisch. - - Formatter version 1. - - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -# TODO: -# - Options to map style's bold/underline/italic/border attributes -# to some ANSI attrbutes (something like 'italic=underline') -# - An option to output "style RGB to xterm RGB/index" conversion table -# - An option to indicate that we are running in "reverse background" -# xterm. This means that default colors are white-on-black, not -# black-on-while, so colors like "white background" need to be converted -# to "white background, black foreground", etc... - -from pip._vendor.pygments.formatter import Formatter -from pip._vendor.pygments.console import codes -from pip._vendor.pygments.style import ansicolors - - -__all__ = ['Terminal256Formatter', 'TerminalTrueColorFormatter'] - - -class EscapeSequence: - def __init__(self, fg=None, bg=None, bold=False, underline=False, italic=False): - self.fg = fg - self.bg = bg - self.bold = bold - self.underline = underline - self.italic = italic - - def escape(self, attrs): - if len(attrs): - return "\x1b[" + ";".join(attrs) + "m" - return "" - - def color_string(self): - attrs = [] - if self.fg is not None: - if self.fg in ansicolors: - esc = codes[self.fg.replace('ansi','')] - if ';01m' in esc: - self.bold = True - # extract fg color code. - attrs.append(esc[2:4]) - else: - attrs.extend(("38", "5", "%i" % self.fg)) - if self.bg is not None: - if self.bg in ansicolors: - esc = codes[self.bg.replace('ansi','')] - # extract fg color code, add 10 for bg. - attrs.append(str(int(esc[2:4])+10)) - else: - attrs.extend(("48", "5", "%i" % self.bg)) - if self.bold: - attrs.append("01") - if self.underline: - attrs.append("04") - if self.italic: - attrs.append("03") - return self.escape(attrs) - - def true_color_string(self): - attrs = [] - if self.fg: - attrs.extend(("38", "2", str(self.fg[0]), str(self.fg[1]), str(self.fg[2]))) - if self.bg: - attrs.extend(("48", "2", str(self.bg[0]), str(self.bg[1]), str(self.bg[2]))) - if self.bold: - attrs.append("01") - if self.underline: - attrs.append("04") - if self.italic: - attrs.append("03") - return self.escape(attrs) - - def reset_string(self): - attrs = [] - if self.fg is not None: - attrs.append("39") - if self.bg is not None: - attrs.append("49") - if self.bold or self.underline or self.italic: - attrs.append("00") - return self.escape(attrs) - - -class Terminal256Formatter(Formatter): - """ - Format tokens with ANSI color sequences, for output in a 256-color - terminal or console. Like in `TerminalFormatter` color sequences - are terminated at newlines, so that paging the output works correctly. - - The formatter takes colors from a style defined by the `style` option - and converts them to nearest ANSI 256-color escape sequences. Bold and - underline attributes from the style are preserved (and displayed). - - .. versionadded:: 0.9 - - .. versionchanged:: 2.2 - If the used style defines foreground colors in the form ``#ansi*``, then - `Terminal256Formatter` will map these to non extended foreground color. - See :ref:`AnsiTerminalStyle` for more information. - - .. versionchanged:: 2.4 - The ANSI color names have been updated with names that are easier to - understand and align with colornames of other projects and terminals. - See :ref:`this table <new-ansi-color-names>` for more information. - - - Options accepted: - - `style` - The style to use, can be a string or a Style subclass (default: - ``'default'``). - - `linenos` - Set to ``True`` to have line numbers on the terminal output as well - (default: ``False`` = no line numbers). - """ - name = 'Terminal256' - aliases = ['terminal256', 'console256', '256'] - filenames = [] - - def __init__(self, **options): - Formatter.__init__(self, **options) - - self.xterm_colors = [] - self.best_match = {} - self.style_string = {} - - self.usebold = 'nobold' not in options - self.useunderline = 'nounderline' not in options - self.useitalic = 'noitalic' not in options - - self._build_color_table() # build an RGB-to-256 color conversion table - self._setup_styles() # convert selected style's colors to term. colors - - self.linenos = options.get('linenos', False) - self._lineno = 0 - - def _build_color_table(self): - # colors 0..15: 16 basic colors - - self.xterm_colors.append((0x00, 0x00, 0x00)) # 0 - self.xterm_colors.append((0xcd, 0x00, 0x00)) # 1 - self.xterm_colors.append((0x00, 0xcd, 0x00)) # 2 - self.xterm_colors.append((0xcd, 0xcd, 0x00)) # 3 - self.xterm_colors.append((0x00, 0x00, 0xee)) # 4 - self.xterm_colors.append((0xcd, 0x00, 0xcd)) # 5 - self.xterm_colors.append((0x00, 0xcd, 0xcd)) # 6 - self.xterm_colors.append((0xe5, 0xe5, 0xe5)) # 7 - self.xterm_colors.append((0x7f, 0x7f, 0x7f)) # 8 - self.xterm_colors.append((0xff, 0x00, 0x00)) # 9 - self.xterm_colors.append((0x00, 0xff, 0x00)) # 10 - self.xterm_colors.append((0xff, 0xff, 0x00)) # 11 - self.xterm_colors.append((0x5c, 0x5c, 0xff)) # 12 - self.xterm_colors.append((0xff, 0x00, 0xff)) # 13 - self.xterm_colors.append((0x00, 0xff, 0xff)) # 14 - self.xterm_colors.append((0xff, 0xff, 0xff)) # 15 - - # colors 16..232: the 6x6x6 color cube - - valuerange = (0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff) - - for i in range(217): - r = valuerange[(i // 36) % 6] - g = valuerange[(i // 6) % 6] - b = valuerange[i % 6] - self.xterm_colors.append((r, g, b)) - - # colors 233..253: grayscale - - for i in range(1, 22): - v = 8 + i * 10 - self.xterm_colors.append((v, v, v)) - - def _closest_color(self, r, g, b): - distance = 257*257*3 # "infinity" (>distance from #000000 to #ffffff) - match = 0 - - for i in range(0, 254): - values = self.xterm_colors[i] - - rd = r - values[0] - gd = g - values[1] - bd = b - values[2] - d = rd*rd + gd*gd + bd*bd - - if d < distance: - match = i - distance = d - return match - - def _color_index(self, color): - index = self.best_match.get(color, None) - if color in ansicolors: - # strip the `ansi/#ansi` part and look up code - index = color - self.best_match[color] = index - if index is None: - try: - rgb = int(str(color), 16) - except ValueError: - rgb = 0 - - r = (rgb >> 16) & 0xff - g = (rgb >> 8) & 0xff - b = rgb & 0xff - index = self._closest_color(r, g, b) - self.best_match[color] = index - return index - - def _setup_styles(self): - for ttype, ndef in self.style: - escape = EscapeSequence() - # get foreground from ansicolor if set - if ndef['ansicolor']: - escape.fg = self._color_index(ndef['ansicolor']) - elif ndef['color']: - escape.fg = self._color_index(ndef['color']) - if ndef['bgansicolor']: - escape.bg = self._color_index(ndef['bgansicolor']) - elif ndef['bgcolor']: - escape.bg = self._color_index(ndef['bgcolor']) - if self.usebold and ndef['bold']: - escape.bold = True - if self.useunderline and ndef['underline']: - escape.underline = True - if self.useitalic and ndef['italic']: - escape.italic = True - self.style_string[str(ttype)] = (escape.color_string(), - escape.reset_string()) - - def _write_lineno(self, outfile): - self._lineno += 1 - outfile.write("%s%04d: " % (self._lineno != 1 and '\n' or '', self._lineno)) - - def format(self, tokensource, outfile): - return Formatter.format(self, tokensource, outfile) - - def format_unencoded(self, tokensource, outfile): - if self.linenos: - self._write_lineno(outfile) - - for ttype, value in tokensource: - not_found = True - while ttype and not_found: - try: - # outfile.write( "<" + str(ttype) + ">" ) - on, off = self.style_string[str(ttype)] - - # Like TerminalFormatter, add "reset colors" escape sequence - # on newline. - spl = value.split('\n') - for line in spl[:-1]: - if line: - outfile.write(on + line + off) - if self.linenos: - self._write_lineno(outfile) - else: - outfile.write('\n') - - if spl[-1]: - outfile.write(on + spl[-1] + off) - - not_found = False - # outfile.write( '#' + str(ttype) + '#' ) - - except KeyError: - # ottype = ttype - ttype = ttype.parent - # outfile.write( '!' + str(ottype) + '->' + str(ttype) + '!' ) - - if not_found: - outfile.write(value) - - if self.linenos: - outfile.write("\n") - - - -class TerminalTrueColorFormatter(Terminal256Formatter): - r""" - Format tokens with ANSI color sequences, for output in a true-color - terminal or console. Like in `TerminalFormatter` color sequences - are terminated at newlines, so that paging the output works correctly. - - .. versionadded:: 2.1 - - Options accepted: - - `style` - The style to use, can be a string or a Style subclass (default: - ``'default'``). - """ - name = 'TerminalTrueColor' - aliases = ['terminal16m', 'console16m', '16m'] - filenames = [] - - def _build_color_table(self): - pass - - def _color_tuple(self, color): - try: - rgb = int(str(color), 16) - except ValueError: - return None - r = (rgb >> 16) & 0xff - g = (rgb >> 8) & 0xff - b = rgb & 0xff - return (r, g, b) - - def _setup_styles(self): - for ttype, ndef in self.style: - escape = EscapeSequence() - if ndef['color']: - escape.fg = self._color_tuple(ndef['color']) - if ndef['bgcolor']: - escape.bg = self._color_tuple(ndef['bgcolor']) - if self.usebold and ndef['bold']: - escape.bold = True - if self.useunderline and ndef['underline']: - escape.underline = True - if self.useitalic and ndef['italic']: - escape.italic = True - self.style_string[str(ttype)] = (escape.true_color_string(), - escape.reset_string()) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py deleted file mode 100644 index eb2c1b4..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py +++ /dev/null @@ -1,943 +0,0 @@ -""" - pygments.lexer - ~~~~~~~~~~~~~~ - - Base lexer classes. - - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -import re -import sys -import time - -from pip._vendor.pygments.filter import apply_filters, Filter -from pip._vendor.pygments.filters import get_filter_by_name -from pip._vendor.pygments.token import Error, Text, Other, Whitespace, _TokenType -from pip._vendor.pygments.util import get_bool_opt, get_int_opt, get_list_opt, \ - make_analysator, Future, guess_decode -from pip._vendor.pygments.regexopt import regex_opt - -__all__ = ['Lexer', 'RegexLexer', 'ExtendedRegexLexer', 'DelegatingLexer', - 'LexerContext', 'include', 'inherit', 'bygroups', 'using', 'this', - 'default', 'words', 'line_re'] - -line_re = re.compile('.*?\n') - -_encoding_map = [(b'\xef\xbb\xbf', 'utf-8'), - (b'\xff\xfe\0\0', 'utf-32'), - (b'\0\0\xfe\xff', 'utf-32be'), - (b'\xff\xfe', 'utf-16'), - (b'\xfe\xff', 'utf-16be')] - -_default_analyse = staticmethod(lambda x: 0.0) - - -class LexerMeta(type): - """ - This metaclass automagically converts ``analyse_text`` methods into - static methods which always return float values. - """ - - def __new__(mcs, name, bases, d): - if 'analyse_text' in d: - d['analyse_text'] = make_analysator(d['analyse_text']) - return type.__new__(mcs, name, bases, d) - - -class Lexer(metaclass=LexerMeta): - """ - Lexer for a specific language. - - See also :doc:`lexerdevelopment`, a high-level guide to writing - lexers. - - Lexer classes have attributes used for choosing the most appropriate - lexer based on various criteria. - - .. autoattribute:: name - :no-value: - .. autoattribute:: aliases - :no-value: - .. autoattribute:: filenames - :no-value: - .. autoattribute:: alias_filenames - .. autoattribute:: mimetypes - :no-value: - .. autoattribute:: priority - - Lexers included in Pygments should have an additional attribute: - - .. autoattribute:: url - :no-value: - - You can pass options to the constructor. The basic options recognized - by all lexers and processed by the base `Lexer` class are: - - ``stripnl`` - Strip leading and trailing newlines from the input (default: True). - ``stripall`` - Strip all leading and trailing whitespace from the input - (default: False). - ``ensurenl`` - Make sure that the input ends with a newline (default: True). This - is required for some lexers that consume input linewise. - - .. versionadded:: 1.3 - - ``tabsize`` - If given and greater than 0, expand tabs in the input (default: 0). - ``encoding`` - If given, must be an encoding name. This encoding will be used to - convert the input string to Unicode, if it is not already a Unicode - string (default: ``'guess'``, which uses a simple UTF-8 / Locale / - Latin1 detection. Can also be ``'chardet'`` to use the chardet - library, if it is installed. - ``inencoding`` - Overrides the ``encoding`` if given. - """ - - #: Full name of the lexer, in human-readable form - name = None - - #: A list of short, unique identifiers that can be used to look - #: up the lexer from a list, e.g., using `get_lexer_by_name()`. - aliases = [] - - #: A list of `fnmatch` patterns that match filenames which contain - #: content for this lexer. The patterns in this list should be unique among - #: all lexers. - filenames = [] - - #: A list of `fnmatch` patterns that match filenames which may or may not - #: contain content for this lexer. This list is used by the - #: :func:`.guess_lexer_for_filename()` function, to determine which lexers - #: are then included in guessing the correct one. That means that - #: e.g. every lexer for HTML and a template language should include - #: ``\*.html`` in this list. - alias_filenames = [] - - #: A list of MIME types for content that can be lexed with this lexer. - mimetypes = [] - - #: Priority, should multiple lexers match and no content is provided - priority = 0 - - #: URL of the language specification/definition. Used in the Pygments - #: documentation. - url = None - - def __init__(self, **options): - """ - This constructor takes arbitrary options as keyword arguments. - Every subclass must first process its own options and then call - the `Lexer` constructor, since it processes the basic - options like `stripnl`. - - An example looks like this: - - .. sourcecode:: python - - def __init__(self, **options): - self.compress = options.get('compress', '') - Lexer.__init__(self, **options) - - As these options must all be specifiable as strings (due to the - command line usage), there are various utility functions - available to help with that, see `Utilities`_. - """ - self.options = options - self.stripnl = get_bool_opt(options, 'stripnl', True) - self.stripall = get_bool_opt(options, 'stripall', False) - self.ensurenl = get_bool_opt(options, 'ensurenl', True) - self.tabsize = get_int_opt(options, 'tabsize', 0) - self.encoding = options.get('encoding', 'guess') - self.encoding = options.get('inencoding') or self.encoding - self.filters = [] - for filter_ in get_list_opt(options, 'filters', ()): - self.add_filter(filter_) - - def __repr__(self): - if self.options: - return '<pygments.lexers.%s with %r>' % (self.__class__.__name__, - self.options) - else: - return '<pygments.lexers.%s>' % self.__class__.__name__ - - def add_filter(self, filter_, **options): - """ - Add a new stream filter to this lexer. - """ - if not isinstance(filter_, Filter): - filter_ = get_filter_by_name(filter_, **options) - self.filters.append(filter_) - - def analyse_text(text): - """ - A static method which is called for lexer guessing. - - It should analyse the text and return a float in the range - from ``0.0`` to ``1.0``. If it returns ``0.0``, the lexer - will not be selected as the most probable one, if it returns - ``1.0``, it will be selected immediately. This is used by - `guess_lexer`. - - The `LexerMeta` metaclass automatically wraps this function so - that it works like a static method (no ``self`` or ``cls`` - parameter) and the return value is automatically converted to - `float`. If the return value is an object that is boolean `False` - it's the same as if the return values was ``0.0``. - """ - - def get_tokens(self, text, unfiltered=False): - """ - This method is the basic interface of a lexer. It is called by - the `highlight()` function. It must process the text and return an - iterable of ``(tokentype, value)`` pairs from `text`. - - Normally, you don't need to override this method. The default - implementation processes the options recognized by all lexers - (`stripnl`, `stripall` and so on), and then yields all tokens - from `get_tokens_unprocessed()`, with the ``index`` dropped. - - If `unfiltered` is set to `True`, the filtering mechanism is - bypassed even if filters are defined. - """ - if not isinstance(text, str): - if self.encoding == 'guess': - text, _ = guess_decode(text) - elif self.encoding == 'chardet': - try: - from pip._vendor import chardet - except ImportError as e: - raise ImportError('To enable chardet encoding guessing, ' - 'please install the chardet library ' - 'from http://chardet.feedparser.org/') from e - # check for BOM first - decoded = None - for bom, encoding in _encoding_map: - if text.startswith(bom): - decoded = text[len(bom):].decode(encoding, 'replace') - break - # no BOM found, so use chardet - if decoded is None: - enc = chardet.detect(text[:1024]) # Guess using first 1KB - decoded = text.decode(enc.get('encoding') or 'utf-8', - 'replace') - text = decoded - else: - text = text.decode(self.encoding) - if text.startswith('\ufeff'): - text = text[len('\ufeff'):] - else: - if text.startswith('\ufeff'): - text = text[len('\ufeff'):] - - # text now *is* a unicode string - text = text.replace('\r\n', '\n') - text = text.replace('\r', '\n') - if self.stripall: - text = text.strip() - elif self.stripnl: - text = text.strip('\n') - if self.tabsize > 0: - text = text.expandtabs(self.tabsize) - if self.ensurenl and not text.endswith('\n'): - text += '\n' - - def streamer(): - for _, t, v in self.get_tokens_unprocessed(text): - yield t, v - stream = streamer() - if not unfiltered: - stream = apply_filters(stream, self.filters, self) - return stream - - def get_tokens_unprocessed(self, text): - """ - This method should process the text and return an iterable of - ``(index, tokentype, value)`` tuples where ``index`` is the starting - position of the token within the input text. - - It must be overridden by subclasses. It is recommended to - implement it as a generator to maximize effectiveness. - """ - raise NotImplementedError - - -class DelegatingLexer(Lexer): - """ - This lexer takes two lexer as arguments. A root lexer and - a language lexer. First everything is scanned using the language - lexer, afterwards all ``Other`` tokens are lexed using the root - lexer. - - The lexers from the ``template`` lexer package use this base lexer. - """ - - def __init__(self, _root_lexer, _language_lexer, _needle=Other, **options): - self.root_lexer = _root_lexer(**options) - self.language_lexer = _language_lexer(**options) - self.needle = _needle - Lexer.__init__(self, **options) - - def get_tokens_unprocessed(self, text): - buffered = '' - insertions = [] - lng_buffer = [] - for i, t, v in self.language_lexer.get_tokens_unprocessed(text): - if t is self.needle: - if lng_buffer: - insertions.append((len(buffered), lng_buffer)) - lng_buffer = [] - buffered += v - else: - lng_buffer.append((i, t, v)) - if lng_buffer: - insertions.append((len(buffered), lng_buffer)) - return do_insertions(insertions, - self.root_lexer.get_tokens_unprocessed(buffered)) - - -# ------------------------------------------------------------------------------ -# RegexLexer and ExtendedRegexLexer -# - - -class include(str): # pylint: disable=invalid-name - """ - Indicates that a state should include rules from another state. - """ - pass - - -class _inherit: - """ - Indicates the a state should inherit from its superclass. - """ - def __repr__(self): - return 'inherit' - -inherit = _inherit() # pylint: disable=invalid-name - - -class combined(tuple): # pylint: disable=invalid-name - """ - Indicates a state combined from multiple states. - """ - - def __new__(cls, *args): - return tuple.__new__(cls, args) - - def __init__(self, *args): - # tuple.__init__ doesn't do anything - pass - - -class _PseudoMatch: - """ - A pseudo match object constructed from a string. - """ - - def __init__(self, start, text): - self._text = text - self._start = start - - def start(self, arg=None): - return self._start - - def end(self, arg=None): - return self._start + len(self._text) - - def group(self, arg=None): - if arg: - raise IndexError('No such group') - return self._text - - def groups(self): - return (self._text,) - - def groupdict(self): - return {} - - -def bygroups(*args): - """ - Callback that yields multiple actions for each group in the match. - """ - def callback(lexer, match, ctx=None): - for i, action in enumerate(args): - if action is None: - continue - elif type(action) is _TokenType: - data = match.group(i + 1) - if data: - yield match.start(i + 1), action, data - else: - data = match.group(i + 1) - if data is not None: - if ctx: - ctx.pos = match.start(i + 1) - for item in action(lexer, - _PseudoMatch(match.start(i + 1), data), ctx): - if item: - yield item - if ctx: - ctx.pos = match.end() - return callback - - -class _This: - """ - Special singleton used for indicating the caller class. - Used by ``using``. - """ - -this = _This() - - -def using(_other, **kwargs): - """ - Callback that processes the match with a different lexer. - - The keyword arguments are forwarded to the lexer, except `state` which - is handled separately. - - `state` specifies the state that the new lexer will start in, and can - be an enumerable such as ('root', 'inline', 'string') or a simple - string which is assumed to be on top of the root state. - - Note: For that to work, `_other` must not be an `ExtendedRegexLexer`. - """ - gt_kwargs = {} - if 'state' in kwargs: - s = kwargs.pop('state') - if isinstance(s, (list, tuple)): - gt_kwargs['stack'] = s - else: - gt_kwargs['stack'] = ('root', s) - - if _other is this: - def callback(lexer, match, ctx=None): - # if keyword arguments are given the callback - # function has to create a new lexer instance - if kwargs: - # XXX: cache that somehow - kwargs.update(lexer.options) - lx = lexer.__class__(**kwargs) - else: - lx = lexer - s = match.start() - for i, t, v in lx.get_tokens_unprocessed(match.group(), **gt_kwargs): - yield i + s, t, v - if ctx: - ctx.pos = match.end() - else: - def callback(lexer, match, ctx=None): - # XXX: cache that somehow - kwargs.update(lexer.options) - lx = _other(**kwargs) - - s = match.start() - for i, t, v in lx.get_tokens_unprocessed(match.group(), **gt_kwargs): - yield i + s, t, v - if ctx: - ctx.pos = match.end() - return callback - - -class default: - """ - Indicates a state or state action (e.g. #pop) to apply. - For example default('#pop') is equivalent to ('', Token, '#pop') - Note that state tuples may be used as well. - - .. versionadded:: 2.0 - """ - def __init__(self, state): - self.state = state - - -class words(Future): - """ - Indicates a list of literal words that is transformed into an optimized - regex that matches any of the words. - - .. versionadded:: 2.0 - """ - def __init__(self, words, prefix='', suffix=''): - self.words = words - self.prefix = prefix - self.suffix = suffix - - def get(self): - return regex_opt(self.words, prefix=self.prefix, suffix=self.suffix) - - -class RegexLexerMeta(LexerMeta): - """ - Metaclass for RegexLexer, creates the self._tokens attribute from - self.tokens on the first instantiation. - """ - - def _process_regex(cls, regex, rflags, state): - """Preprocess the regular expression component of a token definition.""" - if isinstance(regex, Future): - regex = regex.get() - return re.compile(regex, rflags).match - - def _process_token(cls, token): - """Preprocess the token component of a token definition.""" - assert type(token) is _TokenType or callable(token), \ - 'token type must be simple type or callable, not %r' % (token,) - return token - - def _process_new_state(cls, new_state, unprocessed, processed): - """Preprocess the state transition action of a token definition.""" - if isinstance(new_state, str): - # an existing state - if new_state == '#pop': - return -1 - elif new_state in unprocessed: - return (new_state,) - elif new_state == '#push': - return new_state - elif new_state[:5] == '#pop:': - return -int(new_state[5:]) - else: - assert False, 'unknown new state %r' % new_state - elif isinstance(new_state, combined): - # combine a new state from existing ones - tmp_state = '_tmp_%d' % cls._tmpname - cls._tmpname += 1 - itokens = [] - for istate in new_state: - assert istate != new_state, 'circular state ref %r' % istate - itokens.extend(cls._process_state(unprocessed, - processed, istate)) - processed[tmp_state] = itokens - return (tmp_state,) - elif isinstance(new_state, tuple): - # push more than one state - for istate in new_state: - assert (istate in unprocessed or - istate in ('#pop', '#push')), \ - 'unknown new state ' + istate - return new_state - else: - assert False, 'unknown new state def %r' % new_state - - def _process_state(cls, unprocessed, processed, state): - """Preprocess a single state definition.""" - assert type(state) is str, "wrong state name %r" % state - assert state[0] != '#', "invalid state name %r" % state - if state in processed: - return processed[state] - tokens = processed[state] = [] - rflags = cls.flags - for tdef in unprocessed[state]: - if isinstance(tdef, include): - # it's a state reference - assert tdef != state, "circular state reference %r" % state - tokens.extend(cls._process_state(unprocessed, processed, - str(tdef))) - continue - if isinstance(tdef, _inherit): - # should be processed already, but may not in the case of: - # 1. the state has no counterpart in any parent - # 2. the state includes more than one 'inherit' - continue - if isinstance(tdef, default): - new_state = cls._process_new_state(tdef.state, unprocessed, processed) - tokens.append((re.compile('').match, None, new_state)) - continue - - assert type(tdef) is tuple, "wrong rule def %r" % tdef - - try: - rex = cls._process_regex(tdef[0], rflags, state) - except Exception as err: - raise ValueError("uncompilable regex %r in state %r of %r: %s" % - (tdef[0], state, cls, err)) from err - - token = cls._process_token(tdef[1]) - - if len(tdef) == 2: - new_state = None - else: - new_state = cls._process_new_state(tdef[2], - unprocessed, processed) - - tokens.append((rex, token, new_state)) - return tokens - - def process_tokendef(cls, name, tokendefs=None): - """Preprocess a dictionary of token definitions.""" - processed = cls._all_tokens[name] = {} - tokendefs = tokendefs or cls.tokens[name] - for state in list(tokendefs): - cls._process_state(tokendefs, processed, state) - return processed - - def get_tokendefs(cls): - """ - Merge tokens from superclasses in MRO order, returning a single tokendef - dictionary. - - Any state that is not defined by a subclass will be inherited - automatically. States that *are* defined by subclasses will, by - default, override that state in the superclass. If a subclass wishes to - inherit definitions from a superclass, it can use the special value - "inherit", which will cause the superclass' state definition to be - included at that point in the state. - """ - tokens = {} - inheritable = {} - for c in cls.__mro__: - toks = c.__dict__.get('tokens', {}) - - for state, items in toks.items(): - curitems = tokens.get(state) - if curitems is None: - # N.b. because this is assigned by reference, sufficiently - # deep hierarchies are processed incrementally (e.g. for - # A(B), B(C), C(RegexLexer), B will be premodified so X(B) - # will not see any inherits in B). - tokens[state] = items - try: - inherit_ndx = items.index(inherit) - except ValueError: - continue - inheritable[state] = inherit_ndx - continue - - inherit_ndx = inheritable.pop(state, None) - if inherit_ndx is None: - continue - - # Replace the "inherit" value with the items - curitems[inherit_ndx:inherit_ndx+1] = items - try: - # N.b. this is the index in items (that is, the superclass - # copy), so offset required when storing below. - new_inh_ndx = items.index(inherit) - except ValueError: - pass - else: - inheritable[state] = inherit_ndx + new_inh_ndx - - return tokens - - def __call__(cls, *args, **kwds): - """Instantiate cls after preprocessing its token definitions.""" - if '_tokens' not in cls.__dict__: - cls._all_tokens = {} - cls._tmpname = 0 - if hasattr(cls, 'token_variants') and cls.token_variants: - # don't process yet - pass - else: - cls._tokens = cls.process_tokendef('', cls.get_tokendefs()) - - return type.__call__(cls, *args, **kwds) - - -class RegexLexer(Lexer, metaclass=RegexLexerMeta): - """ - Base for simple stateful regular expression-based lexers. - Simplifies the lexing process so that you need only - provide a list of states and regular expressions. - """ - - #: Flags for compiling the regular expressions. - #: Defaults to MULTILINE. - flags = re.MULTILINE - - #: At all time there is a stack of states. Initially, the stack contains - #: a single state 'root'. The top of the stack is called "the current state". - #: - #: Dict of ``{'state': [(regex, tokentype, new_state), ...], ...}`` - #: - #: ``new_state`` can be omitted to signify no state transition. - #: If ``new_state`` is a string, it is pushed on the stack. This ensure - #: the new current state is ``new_state``. - #: If ``new_state`` is a tuple of strings, all of those strings are pushed - #: on the stack and the current state will be the last element of the list. - #: ``new_state`` can also be ``combined('state1', 'state2', ...)`` - #: to signify a new, anonymous state combined from the rules of two - #: or more existing ones. - #: Furthermore, it can be '#pop' to signify going back one step in - #: the state stack, or '#push' to push the current state on the stack - #: again. Note that if you push while in a combined state, the combined - #: state itself is pushed, and not only the state in which the rule is - #: defined. - #: - #: The tuple can also be replaced with ``include('state')``, in which - #: case the rules from the state named by the string are included in the - #: current one. - tokens = {} - - def get_tokens_unprocessed(self, text, stack=('root',)): - """ - Split ``text`` into (tokentype, text) pairs. - - ``stack`` is the initial stack (default: ``['root']``) - """ - pos = 0 - tokendefs = self._tokens - statestack = list(stack) - statetokens = tokendefs[statestack[-1]] - while 1: - for rexmatch, action, new_state in statetokens: - m = rexmatch(text, pos) - if m: - if action is not None: - if type(action) is _TokenType: - yield pos, action, m.group() - else: - yield from action(self, m) - pos = m.end() - if new_state is not None: - # state transition - if isinstance(new_state, tuple): - for state in new_state: - if state == '#pop': - if len(statestack) > 1: - statestack.pop() - elif state == '#push': - statestack.append(statestack[-1]) - else: - statestack.append(state) - elif isinstance(new_state, int): - # pop, but keep at least one state on the stack - # (random code leading to unexpected pops should - # not allow exceptions) - if abs(new_state) >= len(statestack): - del statestack[1:] - else: - del statestack[new_state:] - elif new_state == '#push': - statestack.append(statestack[-1]) - else: - assert False, "wrong state def: %r" % new_state - statetokens = tokendefs[statestack[-1]] - break - else: - # We are here only if all state tokens have been considered - # and there was not a match on any of them. - try: - if text[pos] == '\n': - # at EOL, reset state to "root" - statestack = ['root'] - statetokens = tokendefs['root'] - yield pos, Whitespace, '\n' - pos += 1 - continue - yield pos, Error, text[pos] - pos += 1 - except IndexError: - break - - -class LexerContext: - """ - A helper object that holds lexer position data. - """ - - def __init__(self, text, pos, stack=None, end=None): - self.text = text - self.pos = pos - self.end = end or len(text) # end=0 not supported ;-) - self.stack = stack or ['root'] - - def __repr__(self): - return 'LexerContext(%r, %r, %r)' % ( - self.text, self.pos, self.stack) - - -class ExtendedRegexLexer(RegexLexer): - """ - A RegexLexer that uses a context object to store its state. - """ - - def get_tokens_unprocessed(self, text=None, context=None): - """ - Split ``text`` into (tokentype, text) pairs. - If ``context`` is given, use this lexer context instead. - """ - tokendefs = self._tokens - if not context: - ctx = LexerContext(text, 0) - statetokens = tokendefs['root'] - else: - ctx = context - statetokens = tokendefs[ctx.stack[-1]] - text = ctx.text - while 1: - for rexmatch, action, new_state in statetokens: - m = rexmatch(text, ctx.pos, ctx.end) - if m: - if action is not None: - if type(action) is _TokenType: - yield ctx.pos, action, m.group() - ctx.pos = m.end() - else: - yield from action(self, m, ctx) - if not new_state: - # altered the state stack? - statetokens = tokendefs[ctx.stack[-1]] - # CAUTION: callback must set ctx.pos! - if new_state is not None: - # state transition - if isinstance(new_state, tuple): - for state in new_state: - if state == '#pop': - if len(ctx.stack) > 1: - ctx.stack.pop() - elif state == '#push': - ctx.stack.append(ctx.stack[-1]) - else: - ctx.stack.append(state) - elif isinstance(new_state, int): - # see RegexLexer for why this check is made - if abs(new_state) >= len(ctx.stack): - del ctx.stack[1:] - else: - del ctx.stack[new_state:] - elif new_state == '#push': - ctx.stack.append(ctx.stack[-1]) - else: - assert False, "wrong state def: %r" % new_state - statetokens = tokendefs[ctx.stack[-1]] - break - else: - try: - if ctx.pos >= ctx.end: - break - if text[ctx.pos] == '\n': - # at EOL, reset state to "root" - ctx.stack = ['root'] - statetokens = tokendefs['root'] - yield ctx.pos, Text, '\n' - ctx.pos += 1 - continue - yield ctx.pos, Error, text[ctx.pos] - ctx.pos += 1 - except IndexError: - break - - -def do_insertions(insertions, tokens): - """ - Helper for lexers which must combine the results of several - sublexers. - - ``insertions`` is a list of ``(index, itokens)`` pairs. - Each ``itokens`` iterable should be inserted at position - ``index`` into the token stream given by the ``tokens`` - argument. - - The result is a combined token stream. - - TODO: clean up the code here. - """ - insertions = iter(insertions) - try: - index, itokens = next(insertions) - except StopIteration: - # no insertions - yield from tokens - return - - realpos = None - insleft = True - - # iterate over the token stream where we want to insert - # the tokens from the insertion list. - for i, t, v in tokens: - # first iteration. store the position of first item - if realpos is None: - realpos = i - oldi = 0 - while insleft and i + len(v) >= index: - tmpval = v[oldi:index - i] - if tmpval: - yield realpos, t, tmpval - realpos += len(tmpval) - for it_index, it_token, it_value in itokens: - yield realpos, it_token, it_value - realpos += len(it_value) - oldi = index - i - try: - index, itokens = next(insertions) - except StopIteration: - insleft = False - break # not strictly necessary - if oldi < len(v): - yield realpos, t, v[oldi:] - realpos += len(v) - oldi - - # leftover tokens - while insleft: - # no normal tokens, set realpos to zero - realpos = realpos or 0 - for p, t, v in itokens: - yield realpos, t, v - realpos += len(v) - try: - index, itokens = next(insertions) - except StopIteration: - insleft = False - break # not strictly necessary - - -class ProfilingRegexLexerMeta(RegexLexerMeta): - """Metaclass for ProfilingRegexLexer, collects regex timing info.""" - - def _process_regex(cls, regex, rflags, state): - if isinstance(regex, words): - rex = regex_opt(regex.words, prefix=regex.prefix, - suffix=regex.suffix) - else: - rex = regex - compiled = re.compile(rex, rflags) - - def match_func(text, pos, endpos=sys.maxsize): - info = cls._prof_data[-1].setdefault((state, rex), [0, 0.0]) - t0 = time.time() - res = compiled.match(text, pos, endpos) - t1 = time.time() - info[0] += 1 - info[1] += t1 - t0 - return res - return match_func - - -class ProfilingRegexLexer(RegexLexer, metaclass=ProfilingRegexLexerMeta): - """Drop-in replacement for RegexLexer that does profiling of its regexes.""" - - _prof_data = [] - _prof_sort_index = 4 # defaults to time per call - - def get_tokens_unprocessed(self, text, stack=('root',)): - # this needs to be a stack, since using(this) will produce nested calls - self.__class__._prof_data.append({}) - yield from RegexLexer.get_tokens_unprocessed(self, text, stack) - rawdata = self.__class__._prof_data.pop() - data = sorted(((s, repr(r).strip('u\'').replace('\\\\', '\\')[:65], - n, 1000 * t, 1000 * t / n) - for ((s, r), (n, t)) in rawdata.items()), - key=lambda x: x[self._prof_sort_index], - reverse=True) - sum_total = sum(x[3] for x in data) - - print() - print('Profiling result for %s lexing %d chars in %.3f ms' % - (self.__class__.__name__, len(text), sum_total)) - print('=' * 110) - print('%-20s %-64s ncalls tottime percall' % ('state', 'regex')) - print('-' * 110) - for d in data: - print('%-20s %-65s %5d %8.4f %8.4f' % d) - print('=' * 110) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__init__.py deleted file mode 100644 index d97c3e3..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__init__.py +++ /dev/null @@ -1,362 +0,0 @@ -""" - pygments.lexers - ~~~~~~~~~~~~~~~ - - Pygments lexers. - - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -import re -import sys -import types -import fnmatch -from os.path import basename - -from pip._vendor.pygments.lexers._mapping import LEXERS -from pip._vendor.pygments.modeline import get_filetype_from_buffer -from pip._vendor.pygments.plugin import find_plugin_lexers -from pip._vendor.pygments.util import ClassNotFound, guess_decode - -COMPAT = { - 'Python3Lexer': 'PythonLexer', - 'Python3TracebackLexer': 'PythonTracebackLexer', -} - -__all__ = ['get_lexer_by_name', 'get_lexer_for_filename', 'find_lexer_class', - 'guess_lexer', 'load_lexer_from_file'] + list(LEXERS) + list(COMPAT) - -_lexer_cache = {} -_pattern_cache = {} - - -def _fn_matches(fn, glob): - """Return whether the supplied file name fn matches pattern filename.""" - if glob not in _pattern_cache: - pattern = _pattern_cache[glob] = re.compile(fnmatch.translate(glob)) - return pattern.match(fn) - return _pattern_cache[glob].match(fn) - - -def _load_lexers(module_name): - """Load a lexer (and all others in the module too).""" - mod = __import__(module_name, None, None, ['__all__']) - for lexer_name in mod.__all__: - cls = getattr(mod, lexer_name) - _lexer_cache[cls.name] = cls - - -def get_all_lexers(plugins=True): - """Return a generator of tuples in the form ``(name, aliases, - filenames, mimetypes)`` of all know lexers. - - If *plugins* is true (the default), plugin lexers supplied by entrypoints - are also returned. Otherwise, only builtin ones are considered. - """ - for item in LEXERS.values(): - yield item[1:] - if plugins: - for lexer in find_plugin_lexers(): - yield lexer.name, lexer.aliases, lexer.filenames, lexer.mimetypes - - -def find_lexer_class(name): - """ - Return the `Lexer` subclass that with the *name* attribute as given by - the *name* argument. - """ - if name in _lexer_cache: - return _lexer_cache[name] - # lookup builtin lexers - for module_name, lname, aliases, _, _ in LEXERS.values(): - if name == lname: - _load_lexers(module_name) - return _lexer_cache[name] - # continue with lexers from setuptools entrypoints - for cls in find_plugin_lexers(): - if cls.name == name: - return cls - - -def find_lexer_class_by_name(_alias): - """ - Return the `Lexer` subclass that has `alias` in its aliases list, without - instantiating it. - - Like `get_lexer_by_name`, but does not instantiate the class. - - Will raise :exc:`pygments.util.ClassNotFound` if no lexer with that alias is - found. - - .. versionadded:: 2.2 - """ - if not _alias: - raise ClassNotFound('no lexer for alias %r found' % _alias) - # lookup builtin lexers - for module_name, name, aliases, _, _ in LEXERS.values(): - if _alias.lower() in aliases: - if name not in _lexer_cache: - _load_lexers(module_name) - return _lexer_cache[name] - # continue with lexers from setuptools entrypoints - for cls in find_plugin_lexers(): - if _alias.lower() in cls.aliases: - return cls - raise ClassNotFound('no lexer for alias %r found' % _alias) - - -def get_lexer_by_name(_alias, **options): - """ - Return an instance of a `Lexer` subclass that has `alias` in its - aliases list. The lexer is given the `options` at its - instantiation. - - Will raise :exc:`pygments.util.ClassNotFound` if no lexer with that alias is - found. - """ - if not _alias: - raise ClassNotFound('no lexer for alias %r found' % _alias) - - # lookup builtin lexers - for module_name, name, aliases, _, _ in LEXERS.values(): - if _alias.lower() in aliases: - if name not in _lexer_cache: - _load_lexers(module_name) - return _lexer_cache[name](**options) - # continue with lexers from setuptools entrypoints - for cls in find_plugin_lexers(): - if _alias.lower() in cls.aliases: - return cls(**options) - raise ClassNotFound('no lexer for alias %r found' % _alias) - - -def load_lexer_from_file(filename, lexername="CustomLexer", **options): - """Load a lexer from a file. - - This method expects a file located relative to the current working - directory, which contains a Lexer class. By default, it expects the - Lexer to be name CustomLexer; you can specify your own class name - as the second argument to this function. - - Users should be very careful with the input, because this method - is equivalent to running eval on the input file. - - Raises ClassNotFound if there are any problems importing the Lexer. - - .. versionadded:: 2.2 - """ - try: - # This empty dict will contain the namespace for the exec'd file - custom_namespace = {} - with open(filename, 'rb') as f: - exec(f.read(), custom_namespace) - # Retrieve the class `lexername` from that namespace - if lexername not in custom_namespace: - raise ClassNotFound('no valid %s class found in %s' % - (lexername, filename)) - lexer_class = custom_namespace[lexername] - # And finally instantiate it with the options - return lexer_class(**options) - except OSError as err: - raise ClassNotFound('cannot read %s: %s' % (filename, err)) - except ClassNotFound: - raise - except Exception as err: - raise ClassNotFound('error when loading custom lexer: %s' % err) - - -def find_lexer_class_for_filename(_fn, code=None): - """Get a lexer for a filename. - - If multiple lexers match the filename pattern, use ``analyse_text()`` to - figure out which one is more appropriate. - - Returns None if not found. - """ - matches = [] - fn = basename(_fn) - for modname, name, _, filenames, _ in LEXERS.values(): - for filename in filenames: - if _fn_matches(fn, filename): - if name not in _lexer_cache: - _load_lexers(modname) - matches.append((_lexer_cache[name], filename)) - for cls in find_plugin_lexers(): - for filename in cls.filenames: - if _fn_matches(fn, filename): - matches.append((cls, filename)) - - if isinstance(code, bytes): - # decode it, since all analyse_text functions expect unicode - code = guess_decode(code) - - def get_rating(info): - cls, filename = info - # explicit patterns get a bonus - bonus = '*' not in filename and 0.5 or 0 - # The class _always_ defines analyse_text because it's included in - # the Lexer class. The default implementation returns None which - # gets turned into 0.0. Run scripts/detect_missing_analyse_text.py - # to find lexers which need it overridden. - if code: - return cls.analyse_text(code) + bonus, cls.__name__ - return cls.priority + bonus, cls.__name__ - - if matches: - matches.sort(key=get_rating) - # print "Possible lexers, after sort:", matches - return matches[-1][0] - - -def get_lexer_for_filename(_fn, code=None, **options): - """Get a lexer for a filename. - - Return a `Lexer` subclass instance that has a filename pattern - matching `fn`. The lexer is given the `options` at its - instantiation. - - Raise :exc:`pygments.util.ClassNotFound` if no lexer for that filename - is found. - - If multiple lexers match the filename pattern, use their ``analyse_text()`` - methods to figure out which one is more appropriate. - """ - res = find_lexer_class_for_filename(_fn, code) - if not res: - raise ClassNotFound('no lexer for filename %r found' % _fn) - return res(**options) - - -def get_lexer_for_mimetype(_mime, **options): - """ - Return a `Lexer` subclass instance that has `mime` in its mimetype - list. The lexer is given the `options` at its instantiation. - - Will raise :exc:`pygments.util.ClassNotFound` if not lexer for that mimetype - is found. - """ - for modname, name, _, _, mimetypes in LEXERS.values(): - if _mime in mimetypes: - if name not in _lexer_cache: - _load_lexers(modname) - return _lexer_cache[name](**options) - for cls in find_plugin_lexers(): - if _mime in cls.mimetypes: - return cls(**options) - raise ClassNotFound('no lexer for mimetype %r found' % _mime) - - -def _iter_lexerclasses(plugins=True): - """Return an iterator over all lexer classes.""" - for key in sorted(LEXERS): - module_name, name = LEXERS[key][:2] - if name not in _lexer_cache: - _load_lexers(module_name) - yield _lexer_cache[name] - if plugins: - yield from find_plugin_lexers() - - -def guess_lexer_for_filename(_fn, _text, **options): - """ - As :func:`guess_lexer()`, but only lexers which have a pattern in `filenames` - or `alias_filenames` that matches `filename` are taken into consideration. - - :exc:`pygments.util.ClassNotFound` is raised if no lexer thinks it can - handle the content. - """ - fn = basename(_fn) - primary = {} - matching_lexers = set() - for lexer in _iter_lexerclasses(): - for filename in lexer.filenames: - if _fn_matches(fn, filename): - matching_lexers.add(lexer) - primary[lexer] = True - for filename in lexer.alias_filenames: - if _fn_matches(fn, filename): - matching_lexers.add(lexer) - primary[lexer] = False - if not matching_lexers: - raise ClassNotFound('no lexer for filename %r found' % fn) - if len(matching_lexers) == 1: - return matching_lexers.pop()(**options) - result = [] - for lexer in matching_lexers: - rv = lexer.analyse_text(_text) - if rv == 1.0: - return lexer(**options) - result.append((rv, lexer)) - - def type_sort(t): - # sort by: - # - analyse score - # - is primary filename pattern? - # - priority - # - last resort: class name - return (t[0], primary[t[1]], t[1].priority, t[1].__name__) - result.sort(key=type_sort) - - return result[-1][1](**options) - - -def guess_lexer(_text, **options): - """ - Return a `Lexer` subclass instance that's guessed from the text in - `text`. For that, the :meth:`.analyse_text()` method of every known lexer - class is called with the text as argument, and the lexer which returned the - highest value will be instantiated and returned. - - :exc:`pygments.util.ClassNotFound` is raised if no lexer thinks it can - handle the content. - """ - - if not isinstance(_text, str): - inencoding = options.get('inencoding', options.get('encoding')) - if inencoding: - _text = _text.decode(inencoding or 'utf8') - else: - _text, _ = guess_decode(_text) - - # try to get a vim modeline first - ft = get_filetype_from_buffer(_text) - - if ft is not None: - try: - return get_lexer_by_name(ft, **options) - except ClassNotFound: - pass - - best_lexer = [0.0, None] - for lexer in _iter_lexerclasses(): - rv = lexer.analyse_text(_text) - if rv == 1.0: - return lexer(**options) - if rv > best_lexer[0]: - best_lexer[:] = (rv, lexer) - if not best_lexer[0] or best_lexer[1] is None: - raise ClassNotFound('no lexer matching the text found') - return best_lexer[1](**options) - - -class _automodule(types.ModuleType): - """Automatically import lexers.""" - - def __getattr__(self, name): - info = LEXERS.get(name) - if info: - _load_lexers(info[0]) - cls = _lexer_cache[info[1]] - setattr(self, name, cls) - return cls - if name in COMPAT: - return getattr(self, COMPAT[name]) - raise AttributeError(name) - - -oldmod = sys.modules[__name__] -newmod = _automodule(__name__) -newmod.__dict__.update(oldmod.__dict__) -sys.modules[__name__] = newmod -del newmod.newmod, newmod.oldmod, newmod.sys, newmod.types diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 1b8881a7081de77ac68ca2e1dc4c574317ea359d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14674 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-312.pyc deleted file mode 100644 index 7e544a7891643dfd15465e3a869229d95eac4a26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64426 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 J{U83s=zq*?in{;+ diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-312.pyc deleted file mode 100644 index b2c997b4873a9da61bece4cbe479bf8ab8a0a525..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42661 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/_mapping.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/_mapping.py deleted file mode 100644 index de6a015..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/_mapping.py +++ /dev/null @@ -1,559 +0,0 @@ -# Automatically generated by scripts/gen_mapfiles.py. -# DO NOT EDIT BY HAND; run `tox -e mapfiles` instead. - -LEXERS = { - 'ABAPLexer': ('pip._vendor.pygments.lexers.business', 'ABAP', ('abap',), ('*.abap', '*.ABAP'), ('text/x-abap',)), - 'AMDGPULexer': ('pip._vendor.pygments.lexers.amdgpu', 'AMDGPU', ('amdgpu',), ('*.isa',), ()), - 'APLLexer': ('pip._vendor.pygments.lexers.apl', 'APL', ('apl',), ('*.apl', '*.aplf', '*.aplo', '*.apln', '*.aplc', '*.apli', '*.dyalog'), ()), - 'AbnfLexer': ('pip._vendor.pygments.lexers.grammar_notation', 'ABNF', ('abnf',), ('*.abnf',), ('text/x-abnf',)), - 'ActionScript3Lexer': ('pip._vendor.pygments.lexers.actionscript', 'ActionScript 3', ('actionscript3', 'as3'), ('*.as',), ('application/x-actionscript3', 'text/x-actionscript3', 'text/actionscript3')), - 'ActionScriptLexer': ('pip._vendor.pygments.lexers.actionscript', 'ActionScript', ('actionscript', 'as'), ('*.as',), ('application/x-actionscript', 'text/x-actionscript', 'text/actionscript')), - 'AdaLexer': ('pip._vendor.pygments.lexers.ada', 'Ada', ('ada', 'ada95', 'ada2005'), ('*.adb', '*.ads', '*.ada'), ('text/x-ada',)), - 'AdlLexer': ('pip._vendor.pygments.lexers.archetype', 'ADL', ('adl',), ('*.adl', '*.adls', '*.adlf', '*.adlx'), ()), - 'AgdaLexer': ('pip._vendor.pygments.lexers.haskell', 'Agda', ('agda',), ('*.agda',), ('text/x-agda',)), - 'AheuiLexer': ('pip._vendor.pygments.lexers.esoteric', 'Aheui', ('aheui',), ('*.aheui',), ()), - 'AlloyLexer': ('pip._vendor.pygments.lexers.dsls', 'Alloy', ('alloy',), ('*.als',), ('text/x-alloy',)), - 'AmbientTalkLexer': ('pip._vendor.pygments.lexers.ambient', 'AmbientTalk', ('ambienttalk', 'ambienttalk/2', 'at'), ('*.at',), ('text/x-ambienttalk',)), - 'AmplLexer': ('pip._vendor.pygments.lexers.ampl', 'Ampl', ('ampl',), ('*.run',), ()), - 'Angular2HtmlLexer': ('pip._vendor.pygments.lexers.templates', 'HTML + Angular2', ('html+ng2',), ('*.ng2',), ()), - 'Angular2Lexer': ('pip._vendor.pygments.lexers.templates', 'Angular2', ('ng2',), (), ()), - 'AntlrActionScriptLexer': ('pip._vendor.pygments.lexers.parsers', 'ANTLR With ActionScript Target', ('antlr-actionscript', 'antlr-as'), ('*.G', '*.g'), ()), - 'AntlrCSharpLexer': ('pip._vendor.pygments.lexers.parsers', 'ANTLR With C# Target', ('antlr-csharp', 'antlr-c#'), ('*.G', '*.g'), ()), - 'AntlrCppLexer': ('pip._vendor.pygments.lexers.parsers', 'ANTLR With CPP Target', ('antlr-cpp',), ('*.G', '*.g'), ()), - 'AntlrJavaLexer': ('pip._vendor.pygments.lexers.parsers', 'ANTLR With Java Target', ('antlr-java',), ('*.G', '*.g'), ()), - 'AntlrLexer': ('pip._vendor.pygments.lexers.parsers', 'ANTLR', ('antlr',), (), ()), - 'AntlrObjectiveCLexer': ('pip._vendor.pygments.lexers.parsers', 'ANTLR With ObjectiveC Target', ('antlr-objc',), ('*.G', '*.g'), ()), - 'AntlrPerlLexer': ('pip._vendor.pygments.lexers.parsers', 'ANTLR With Perl Target', ('antlr-perl',), ('*.G', '*.g'), ()), - 'AntlrPythonLexer': ('pip._vendor.pygments.lexers.parsers', 'ANTLR With Python Target', ('antlr-python',), ('*.G', '*.g'), ()), - 'AntlrRubyLexer': ('pip._vendor.pygments.lexers.parsers', 'ANTLR With Ruby Target', ('antlr-ruby', 'antlr-rb'), ('*.G', '*.g'), ()), - 'ApacheConfLexer': ('pip._vendor.pygments.lexers.configs', 'ApacheConf', ('apacheconf', 'aconf', 'apache'), ('.htaccess', 'apache.conf', 'apache2.conf'), ('text/x-apacheconf',)), - 'AppleScriptLexer': ('pip._vendor.pygments.lexers.scripting', 'AppleScript', ('applescript',), ('*.applescript',), ()), - 'ArduinoLexer': ('pip._vendor.pygments.lexers.c_like', 'Arduino', ('arduino',), ('*.ino',), ('text/x-arduino',)), - 'ArrowLexer': ('pip._vendor.pygments.lexers.arrow', 'Arrow', ('arrow',), ('*.arw',), ()), - 'ArturoLexer': ('pip._vendor.pygments.lexers.arturo', 'Arturo', ('arturo', 'art'), ('*.art',), ()), - 'AscLexer': ('pip._vendor.pygments.lexers.asc', 'ASCII armored', ('asc', 'pem'), ('*.asc', '*.pem', 'id_dsa', 'id_ecdsa', 'id_ecdsa_sk', 'id_ed25519', 'id_ed25519_sk', 'id_rsa'), ('application/pgp-keys', 'application/pgp-encrypted', 'application/pgp-signature')), - 'AspectJLexer': ('pip._vendor.pygments.lexers.jvm', 'AspectJ', ('aspectj',), ('*.aj',), ('text/x-aspectj',)), - 'AsymptoteLexer': ('pip._vendor.pygments.lexers.graphics', 'Asymptote', ('asymptote', 'asy'), ('*.asy',), ('text/x-asymptote',)), - 'AugeasLexer': ('pip._vendor.pygments.lexers.configs', 'Augeas', ('augeas',), ('*.aug',), ()), - 'AutoItLexer': ('pip._vendor.pygments.lexers.automation', 'AutoIt', ('autoit',), ('*.au3',), ('text/x-autoit',)), - 'AutohotkeyLexer': ('pip._vendor.pygments.lexers.automation', 'autohotkey', ('autohotkey', 'ahk'), ('*.ahk', '*.ahkl'), ('text/x-autohotkey',)), - 'AwkLexer': ('pip._vendor.pygments.lexers.textedit', 'Awk', ('awk', 'gawk', 'mawk', 'nawk'), ('*.awk',), ('application/x-awk',)), - 'BBCBasicLexer': ('pip._vendor.pygments.lexers.basic', 'BBC Basic', ('bbcbasic',), ('*.bbc',), ()), - 'BBCodeLexer': ('pip._vendor.pygments.lexers.markup', 'BBCode', ('bbcode',), (), ('text/x-bbcode',)), - 'BCLexer': ('pip._vendor.pygments.lexers.algebra', 'BC', ('bc',), ('*.bc',), ()), - 'BSTLexer': ('pip._vendor.pygments.lexers.bibtex', 'BST', ('bst', 'bst-pybtex'), ('*.bst',), ()), - 'BareLexer': ('pip._vendor.pygments.lexers.bare', 'BARE', ('bare',), ('*.bare',), ()), - 'BaseMakefileLexer': ('pip._vendor.pygments.lexers.make', 'Base Makefile', ('basemake',), (), ()), - 'BashLexer': ('pip._vendor.pygments.lexers.shell', 'Bash', ('bash', 'sh', 'ksh', 'zsh', 'shell'), ('*.sh', '*.ksh', '*.bash', '*.ebuild', '*.eclass', '*.exheres-0', '*.exlib', '*.zsh', '.bashrc', 'bashrc', '.bash_*', 'bash_*', 'zshrc', '.zshrc', '.kshrc', 'kshrc', 'PKGBUILD'), ('application/x-sh', 'application/x-shellscript', 'text/x-shellscript')), - 'BashSessionLexer': ('pip._vendor.pygments.lexers.shell', 'Bash Session', ('console', 'shell-session'), ('*.sh-session', '*.shell-session'), ('application/x-shell-session', 'application/x-sh-session')), - 'BatchLexer': ('pip._vendor.pygments.lexers.shell', 'Batchfile', ('batch', 'bat', 'dosbatch', 'winbatch'), ('*.bat', '*.cmd'), ('application/x-dos-batch',)), - 'BddLexer': ('pip._vendor.pygments.lexers.bdd', 'Bdd', ('bdd',), ('*.feature',), ('text/x-bdd',)), - 'BefungeLexer': ('pip._vendor.pygments.lexers.esoteric', 'Befunge', ('befunge',), ('*.befunge',), ('application/x-befunge',)), - 'BerryLexer': ('pip._vendor.pygments.lexers.berry', 'Berry', ('berry', 'be'), ('*.be',), ('text/x-berry', 'application/x-berry')), - 'BibTeXLexer': ('pip._vendor.pygments.lexers.bibtex', 'BibTeX', ('bibtex', 'bib'), ('*.bib',), ('text/x-bibtex',)), - 'BlitzBasicLexer': ('pip._vendor.pygments.lexers.basic', 'BlitzBasic', ('blitzbasic', 'b3d', 'bplus'), ('*.bb', '*.decls'), ('text/x-bb',)), - 'BlitzMaxLexer': ('pip._vendor.pygments.lexers.basic', 'BlitzMax', ('blitzmax', 'bmax'), ('*.bmx',), ('text/x-bmx',)), - 'BnfLexer': ('pip._vendor.pygments.lexers.grammar_notation', 'BNF', ('bnf',), ('*.bnf',), ('text/x-bnf',)), - 'BoaLexer': ('pip._vendor.pygments.lexers.boa', 'Boa', ('boa',), ('*.boa',), ()), - 'BooLexer': ('pip._vendor.pygments.lexers.dotnet', 'Boo', ('boo',), ('*.boo',), ('text/x-boo',)), - 'BoogieLexer': ('pip._vendor.pygments.lexers.verification', 'Boogie', ('boogie',), ('*.bpl',), ()), - 'BrainfuckLexer': ('pip._vendor.pygments.lexers.esoteric', 'Brainfuck', ('brainfuck', 'bf'), ('*.bf', '*.b'), ('application/x-brainfuck',)), - 'BugsLexer': ('pip._vendor.pygments.lexers.modeling', 'BUGS', ('bugs', 'winbugs', 'openbugs'), ('*.bug',), ()), - 'CAmkESLexer': ('pip._vendor.pygments.lexers.esoteric', 'CAmkES', ('camkes', 'idl4'), ('*.camkes', '*.idl4'), ()), - 'CLexer': ('pip._vendor.pygments.lexers.c_cpp', 'C', ('c',), ('*.c', '*.h', '*.idc', '*.x[bp]m'), ('text/x-chdr', 'text/x-csrc', 'image/x-xbitmap', 'image/x-xpixmap')), - 'CMakeLexer': ('pip._vendor.pygments.lexers.make', 'CMake', ('cmake',), ('*.cmake', 'CMakeLists.txt'), ('text/x-cmake',)), - 'CObjdumpLexer': ('pip._vendor.pygments.lexers.asm', 'c-objdump', ('c-objdump',), ('*.c-objdump',), ('text/x-c-objdump',)), - 'CPSALexer': ('pip._vendor.pygments.lexers.lisp', 'CPSA', ('cpsa',), ('*.cpsa',), ()), - 'CSSUL4Lexer': ('pip._vendor.pygments.lexers.ul4', 'CSS+UL4', ('css+ul4',), ('*.cssul4',), ()), - 'CSharpAspxLexer': ('pip._vendor.pygments.lexers.dotnet', 'aspx-cs', ('aspx-cs',), ('*.aspx', '*.asax', '*.ascx', '*.ashx', '*.asmx', '*.axd'), ()), - 'CSharpLexer': ('pip._vendor.pygments.lexers.dotnet', 'C#', ('csharp', 'c#', 'cs'), ('*.cs',), ('text/x-csharp',)), - 'Ca65Lexer': ('pip._vendor.pygments.lexers.asm', 'ca65 assembler', ('ca65',), ('*.s',), ()), - 'CadlLexer': ('pip._vendor.pygments.lexers.archetype', 'cADL', ('cadl',), ('*.cadl',), ()), - 'CapDLLexer': ('pip._vendor.pygments.lexers.esoteric', 'CapDL', ('capdl',), ('*.cdl',), ()), - 'CapnProtoLexer': ('pip._vendor.pygments.lexers.capnproto', "Cap'n Proto", ('capnp',), ('*.capnp',), ()), - 'CarbonLexer': ('pip._vendor.pygments.lexers.carbon', 'Carbon', ('carbon',), ('*.carbon',), ('text/x-carbon',)), - 'CbmBasicV2Lexer': ('pip._vendor.pygments.lexers.basic', 'CBM BASIC V2', ('cbmbas',), ('*.bas',), ()), - 'CddlLexer': ('pip._vendor.pygments.lexers.cddl', 'CDDL', ('cddl',), ('*.cddl',), ('text/x-cddl',)), - 'CeylonLexer': ('pip._vendor.pygments.lexers.jvm', 'Ceylon', ('ceylon',), ('*.ceylon',), ('text/x-ceylon',)), - 'Cfengine3Lexer': ('pip._vendor.pygments.lexers.configs', 'CFEngine3', ('cfengine3', 'cf3'), ('*.cf',), ()), - 'ChaiscriptLexer': ('pip._vendor.pygments.lexers.scripting', 'ChaiScript', ('chaiscript', 'chai'), ('*.chai',), ('text/x-chaiscript', 'application/x-chaiscript')), - 'ChapelLexer': ('pip._vendor.pygments.lexers.chapel', 'Chapel', ('chapel', 'chpl'), ('*.chpl',), ()), - 'CharmciLexer': ('pip._vendor.pygments.lexers.c_like', 'Charmci', ('charmci',), ('*.ci',), ()), - 'CheetahHtmlLexer': ('pip._vendor.pygments.lexers.templates', 'HTML+Cheetah', ('html+cheetah', 'html+spitfire', 'htmlcheetah'), (), ('text/html+cheetah', 'text/html+spitfire')), - 'CheetahJavascriptLexer': ('pip._vendor.pygments.lexers.templates', 'JavaScript+Cheetah', ('javascript+cheetah', 'js+cheetah', 'javascript+spitfire', 'js+spitfire'), (), ('application/x-javascript+cheetah', 'text/x-javascript+cheetah', 'text/javascript+cheetah', 'application/x-javascript+spitfire', 'text/x-javascript+spitfire', 'text/javascript+spitfire')), - 'CheetahLexer': ('pip._vendor.pygments.lexers.templates', 'Cheetah', ('cheetah', 'spitfire'), ('*.tmpl', '*.spt'), ('application/x-cheetah', 'application/x-spitfire')), - 'CheetahXmlLexer': ('pip._vendor.pygments.lexers.templates', 'XML+Cheetah', ('xml+cheetah', 'xml+spitfire'), (), ('application/xml+cheetah', 'application/xml+spitfire')), - 'CirruLexer': ('pip._vendor.pygments.lexers.webmisc', 'Cirru', ('cirru',), ('*.cirru',), ('text/x-cirru',)), - 'ClayLexer': ('pip._vendor.pygments.lexers.c_like', 'Clay', ('clay',), ('*.clay',), ('text/x-clay',)), - 'CleanLexer': ('pip._vendor.pygments.lexers.clean', 'Clean', ('clean',), ('*.icl', '*.dcl'), ()), - 'ClojureLexer': ('pip._vendor.pygments.lexers.jvm', 'Clojure', ('clojure', 'clj'), ('*.clj', '*.cljc'), ('text/x-clojure', 'application/x-clojure')), - 'ClojureScriptLexer': ('pip._vendor.pygments.lexers.jvm', 'ClojureScript', ('clojurescript', 'cljs'), ('*.cljs',), ('text/x-clojurescript', 'application/x-clojurescript')), - 'CobolFreeformatLexer': ('pip._vendor.pygments.lexers.business', 'COBOLFree', ('cobolfree',), ('*.cbl', '*.CBL'), ()), - 'CobolLexer': ('pip._vendor.pygments.lexers.business', 'COBOL', ('cobol',), ('*.cob', '*.COB', '*.cpy', '*.CPY'), ('text/x-cobol',)), - 'CoffeeScriptLexer': ('pip._vendor.pygments.lexers.javascript', 'CoffeeScript', ('coffeescript', 'coffee-script', 'coffee'), ('*.coffee',), ('text/coffeescript',)), - 'ColdfusionCFCLexer': ('pip._vendor.pygments.lexers.templates', 'Coldfusion CFC', ('cfc',), ('*.cfc',), ()), - 'ColdfusionHtmlLexer': ('pip._vendor.pygments.lexers.templates', 'Coldfusion HTML', ('cfm',), ('*.cfm', '*.cfml'), ('application/x-coldfusion',)), - 'ColdfusionLexer': ('pip._vendor.pygments.lexers.templates', 'cfstatement', ('cfs',), (), ()), - 'Comal80Lexer': ('pip._vendor.pygments.lexers.comal', 'COMAL-80', ('comal', 'comal80'), ('*.cml', '*.comal'), ()), - 'CommonLispLexer': ('pip._vendor.pygments.lexers.lisp', 'Common Lisp', ('common-lisp', 'cl', 'lisp'), ('*.cl', '*.lisp'), ('text/x-common-lisp',)), - 'ComponentPascalLexer': ('pip._vendor.pygments.lexers.oberon', 'Component Pascal', ('componentpascal', 'cp'), ('*.cp', '*.cps'), ('text/x-component-pascal',)), - 'CoqLexer': ('pip._vendor.pygments.lexers.theorem', 'Coq', ('coq',), ('*.v',), ('text/x-coq',)), - 'CplintLexer': ('pip._vendor.pygments.lexers.cplint', 'cplint', ('cplint',), ('*.ecl', '*.prolog', '*.pro', '*.pl', '*.P', '*.lpad', '*.cpl'), ('text/x-cplint',)), - 'CppLexer': ('pip._vendor.pygments.lexers.c_cpp', 'C++', ('cpp', 'c++'), ('*.cpp', '*.hpp', '*.c++', '*.h++', '*.cc', '*.hh', '*.cxx', '*.hxx', '*.C', '*.H', '*.cp', '*.CPP', '*.tpp'), ('text/x-c++hdr', 'text/x-c++src')), - 'CppObjdumpLexer': ('pip._vendor.pygments.lexers.asm', 'cpp-objdump', ('cpp-objdump', 'c++-objdumb', 'cxx-objdump'), ('*.cpp-objdump', '*.c++-objdump', '*.cxx-objdump'), ('text/x-cpp-objdump',)), - 'CrmshLexer': ('pip._vendor.pygments.lexers.dsls', 'Crmsh', ('crmsh', 'pcmk'), ('*.crmsh', '*.pcmk'), ()), - 'CrocLexer': ('pip._vendor.pygments.lexers.d', 'Croc', ('croc',), ('*.croc',), ('text/x-crocsrc',)), - 'CryptolLexer': ('pip._vendor.pygments.lexers.haskell', 'Cryptol', ('cryptol', 'cry'), ('*.cry',), ('text/x-cryptol',)), - 'CrystalLexer': ('pip._vendor.pygments.lexers.crystal', 'Crystal', ('cr', 'crystal'), ('*.cr',), ('text/x-crystal',)), - 'CsoundDocumentLexer': ('pip._vendor.pygments.lexers.csound', 'Csound Document', ('csound-document', 'csound-csd'), ('*.csd',), ()), - 'CsoundOrchestraLexer': ('pip._vendor.pygments.lexers.csound', 'Csound Orchestra', ('csound', 'csound-orc'), ('*.orc', '*.udo'), ()), - 'CsoundScoreLexer': ('pip._vendor.pygments.lexers.csound', 'Csound Score', ('csound-score', 'csound-sco'), ('*.sco',), ()), - 'CssDjangoLexer': ('pip._vendor.pygments.lexers.templates', 'CSS+Django/Jinja', ('css+django', 'css+jinja'), ('*.css.j2', '*.css.jinja2'), ('text/css+django', 'text/css+jinja')), - 'CssErbLexer': ('pip._vendor.pygments.lexers.templates', 'CSS+Ruby', ('css+ruby', 'css+erb'), (), ('text/css+ruby',)), - 'CssGenshiLexer': ('pip._vendor.pygments.lexers.templates', 'CSS+Genshi Text', ('css+genshitext', 'css+genshi'), (), ('text/css+genshi',)), - 'CssLexer': ('pip._vendor.pygments.lexers.css', 'CSS', ('css',), ('*.css',), ('text/css',)), - 'CssPhpLexer': ('pip._vendor.pygments.lexers.templates', 'CSS+PHP', ('css+php',), (), ('text/css+php',)), - 'CssSmartyLexer': ('pip._vendor.pygments.lexers.templates', 'CSS+Smarty', ('css+smarty',), (), ('text/css+smarty',)), - 'CudaLexer': ('pip._vendor.pygments.lexers.c_like', 'CUDA', ('cuda', 'cu'), ('*.cu', '*.cuh'), ('text/x-cuda',)), - 'CypherLexer': ('pip._vendor.pygments.lexers.graph', 'Cypher', ('cypher',), ('*.cyp', '*.cypher'), ()), - 'CythonLexer': ('pip._vendor.pygments.lexers.python', 'Cython', ('cython', 'pyx', 'pyrex'), ('*.pyx', '*.pxd', '*.pxi'), ('text/x-cython', 'application/x-cython')), - 'DLexer': ('pip._vendor.pygments.lexers.d', 'D', ('d',), ('*.d', '*.di'), ('text/x-dsrc',)), - 'DObjdumpLexer': ('pip._vendor.pygments.lexers.asm', 'd-objdump', ('d-objdump',), ('*.d-objdump',), ('text/x-d-objdump',)), - 'DarcsPatchLexer': ('pip._vendor.pygments.lexers.diff', 'Darcs Patch', ('dpatch',), ('*.dpatch', '*.darcspatch'), ()), - 'DartLexer': ('pip._vendor.pygments.lexers.javascript', 'Dart', ('dart',), ('*.dart',), ('text/x-dart',)), - 'Dasm16Lexer': ('pip._vendor.pygments.lexers.asm', 'DASM16', ('dasm16',), ('*.dasm16', '*.dasm'), ('text/x-dasm16',)), - 'DaxLexer': ('pip._vendor.pygments.lexers.dax', 'Dax', ('dax',), ('*.dax',), ()), - 'DebianControlLexer': ('pip._vendor.pygments.lexers.installers', 'Debian Control file', ('debcontrol', 'control'), ('control',), ()), - 'DelphiLexer': ('pip._vendor.pygments.lexers.pascal', 'Delphi', ('delphi', 'pas', 'pascal', 'objectpascal'), ('*.pas', '*.dpr'), ('text/x-pascal',)), - 'DevicetreeLexer': ('pip._vendor.pygments.lexers.devicetree', 'Devicetree', ('devicetree', 'dts'), ('*.dts', '*.dtsi'), ('text/x-c',)), - 'DgLexer': ('pip._vendor.pygments.lexers.python', 'dg', ('dg',), ('*.dg',), ('text/x-dg',)), - 'DiffLexer': ('pip._vendor.pygments.lexers.diff', 'Diff', ('diff', 'udiff'), ('*.diff', '*.patch'), ('text/x-diff', 'text/x-patch')), - 'DjangoLexer': ('pip._vendor.pygments.lexers.templates', 'Django/Jinja', ('django', 'jinja'), (), ('application/x-django-templating', 'application/x-jinja')), - 'DockerLexer': ('pip._vendor.pygments.lexers.configs', 'Docker', ('docker', 'dockerfile'), ('Dockerfile', '*.docker'), ('text/x-dockerfile-config',)), - 'DtdLexer': ('pip._vendor.pygments.lexers.html', 'DTD', ('dtd',), ('*.dtd',), ('application/xml-dtd',)), - 'DuelLexer': ('pip._vendor.pygments.lexers.webmisc', 'Duel', ('duel', 'jbst', 'jsonml+bst'), ('*.duel', '*.jbst'), ('text/x-duel', 'text/x-jbst')), - 'DylanConsoleLexer': ('pip._vendor.pygments.lexers.dylan', 'Dylan session', ('dylan-console', 'dylan-repl'), ('*.dylan-console',), ('text/x-dylan-console',)), - 'DylanLexer': ('pip._vendor.pygments.lexers.dylan', 'Dylan', ('dylan',), ('*.dylan', '*.dyl', '*.intr'), ('text/x-dylan',)), - 'DylanLidLexer': ('pip._vendor.pygments.lexers.dylan', 'DylanLID', ('dylan-lid', 'lid'), ('*.lid', '*.hdp'), ('text/x-dylan-lid',)), - 'ECLLexer': ('pip._vendor.pygments.lexers.ecl', 'ECL', ('ecl',), ('*.ecl',), ('application/x-ecl',)), - 'ECLexer': ('pip._vendor.pygments.lexers.c_like', 'eC', ('ec',), ('*.ec', '*.eh'), ('text/x-echdr', 'text/x-ecsrc')), - 'EarlGreyLexer': ('pip._vendor.pygments.lexers.javascript', 'Earl Grey', ('earl-grey', 'earlgrey', 'eg'), ('*.eg',), ('text/x-earl-grey',)), - 'EasytrieveLexer': ('pip._vendor.pygments.lexers.scripting', 'Easytrieve', ('easytrieve',), ('*.ezt', '*.mac'), ('text/x-easytrieve',)), - 'EbnfLexer': ('pip._vendor.pygments.lexers.parsers', 'EBNF', ('ebnf',), ('*.ebnf',), ('text/x-ebnf',)), - 'EiffelLexer': ('pip._vendor.pygments.lexers.eiffel', 'Eiffel', ('eiffel',), ('*.e',), ('text/x-eiffel',)), - 'ElixirConsoleLexer': ('pip._vendor.pygments.lexers.erlang', 'Elixir iex session', ('iex',), (), ('text/x-elixir-shellsession',)), - 'ElixirLexer': ('pip._vendor.pygments.lexers.erlang', 'Elixir', ('elixir', 'ex', 'exs'), ('*.ex', '*.eex', '*.exs', '*.leex'), ('text/x-elixir',)), - 'ElmLexer': ('pip._vendor.pygments.lexers.elm', 'Elm', ('elm',), ('*.elm',), ('text/x-elm',)), - 'ElpiLexer': ('pip._vendor.pygments.lexers.elpi', 'Elpi', ('elpi',), ('*.elpi',), ('text/x-elpi',)), - 'EmacsLispLexer': ('pip._vendor.pygments.lexers.lisp', 'EmacsLisp', ('emacs-lisp', 'elisp', 'emacs'), ('*.el',), ('text/x-elisp', 'application/x-elisp')), - 'EmailLexer': ('pip._vendor.pygments.lexers.email', 'E-mail', ('email', 'eml'), ('*.eml',), ('message/rfc822',)), - 'ErbLexer': ('pip._vendor.pygments.lexers.templates', 'ERB', ('erb',), (), ('application/x-ruby-templating',)), - 'ErlangLexer': ('pip._vendor.pygments.lexers.erlang', 'Erlang', ('erlang',), ('*.erl', '*.hrl', '*.es', '*.escript'), ('text/x-erlang',)), - 'ErlangShellLexer': ('pip._vendor.pygments.lexers.erlang', 'Erlang erl session', ('erl',), ('*.erl-sh',), ('text/x-erl-shellsession',)), - 'EvoqueHtmlLexer': ('pip._vendor.pygments.lexers.templates', 'HTML+Evoque', ('html+evoque',), ('*.html',), ('text/html+evoque',)), - 'EvoqueLexer': ('pip._vendor.pygments.lexers.templates', 'Evoque', ('evoque',), ('*.evoque',), ('application/x-evoque',)), - 'EvoqueXmlLexer': ('pip._vendor.pygments.lexers.templates', 'XML+Evoque', ('xml+evoque',), ('*.xml',), ('application/xml+evoque',)), - 'ExeclineLexer': ('pip._vendor.pygments.lexers.shell', 'execline', ('execline',), ('*.exec',), ()), - 'EzhilLexer': ('pip._vendor.pygments.lexers.ezhil', 'Ezhil', ('ezhil',), ('*.n',), ('text/x-ezhil',)), - 'FSharpLexer': ('pip._vendor.pygments.lexers.dotnet', 'F#', ('fsharp', 'f#'), ('*.fs', '*.fsi', '*.fsx'), ('text/x-fsharp',)), - 'FStarLexer': ('pip._vendor.pygments.lexers.ml', 'FStar', ('fstar',), ('*.fst', '*.fsti'), ('text/x-fstar',)), - 'FactorLexer': ('pip._vendor.pygments.lexers.factor', 'Factor', ('factor',), ('*.factor',), ('text/x-factor',)), - 'FancyLexer': ('pip._vendor.pygments.lexers.ruby', 'Fancy', ('fancy', 'fy'), ('*.fy', '*.fancypack'), ('text/x-fancysrc',)), - 'FantomLexer': ('pip._vendor.pygments.lexers.fantom', 'Fantom', ('fan',), ('*.fan',), ('application/x-fantom',)), - 'FelixLexer': ('pip._vendor.pygments.lexers.felix', 'Felix', ('felix', 'flx'), ('*.flx', '*.flxh'), ('text/x-felix',)), - 'FennelLexer': ('pip._vendor.pygments.lexers.lisp', 'Fennel', ('fennel', 'fnl'), ('*.fnl',), ()), - 'FiftLexer': ('pip._vendor.pygments.lexers.fift', 'Fift', ('fift', 'fif'), ('*.fif',), ()), - 'FishShellLexer': ('pip._vendor.pygments.lexers.shell', 'Fish', ('fish', 'fishshell'), ('*.fish', '*.load'), ('application/x-fish',)), - 'FlatlineLexer': ('pip._vendor.pygments.lexers.dsls', 'Flatline', ('flatline',), (), ('text/x-flatline',)), - 'FloScriptLexer': ('pip._vendor.pygments.lexers.floscript', 'FloScript', ('floscript', 'flo'), ('*.flo',), ()), - 'ForthLexer': ('pip._vendor.pygments.lexers.forth', 'Forth', ('forth',), ('*.frt', '*.fs'), ('application/x-forth',)), - 'FortranFixedLexer': ('pip._vendor.pygments.lexers.fortran', 'FortranFixed', ('fortranfixed',), ('*.f', '*.F'), ()), - 'FortranLexer': ('pip._vendor.pygments.lexers.fortran', 'Fortran', ('fortran', 'f90'), ('*.f03', '*.f90', '*.F03', '*.F90'), ('text/x-fortran',)), - 'FoxProLexer': ('pip._vendor.pygments.lexers.foxpro', 'FoxPro', ('foxpro', 'vfp', 'clipper', 'xbase'), ('*.PRG', '*.prg'), ()), - 'FreeFemLexer': ('pip._vendor.pygments.lexers.freefem', 'Freefem', ('freefem',), ('*.edp',), ('text/x-freefem',)), - 'FuncLexer': ('pip._vendor.pygments.lexers.func', 'FunC', ('func', 'fc'), ('*.fc', '*.func'), ()), - 'FutharkLexer': ('pip._vendor.pygments.lexers.futhark', 'Futhark', ('futhark',), ('*.fut',), ('text/x-futhark',)), - 'GAPConsoleLexer': ('pip._vendor.pygments.lexers.algebra', 'GAP session', ('gap-console', 'gap-repl'), ('*.tst',), ()), - 'GAPLexer': ('pip._vendor.pygments.lexers.algebra', 'GAP', ('gap',), ('*.g', '*.gd', '*.gi', '*.gap'), ()), - 'GDScriptLexer': ('pip._vendor.pygments.lexers.gdscript', 'GDScript', ('gdscript', 'gd'), ('*.gd',), ('text/x-gdscript', 'application/x-gdscript')), - 'GLShaderLexer': ('pip._vendor.pygments.lexers.graphics', 'GLSL', ('glsl',), ('*.vert', '*.frag', '*.geo'), ('text/x-glslsrc',)), - 'GSQLLexer': ('pip._vendor.pygments.lexers.gsql', 'GSQL', ('gsql',), ('*.gsql',), ()), - 'GasLexer': ('pip._vendor.pygments.lexers.asm', 'GAS', ('gas', 'asm'), ('*.s', '*.S'), ('text/x-gas',)), - 'GcodeLexer': ('pip._vendor.pygments.lexers.gcodelexer', 'g-code', ('gcode',), ('*.gcode',), ()), - 'GenshiLexer': ('pip._vendor.pygments.lexers.templates', 'Genshi', ('genshi', 'kid', 'xml+genshi', 'xml+kid'), ('*.kid',), ('application/x-genshi', 'application/x-kid')), - 'GenshiTextLexer': ('pip._vendor.pygments.lexers.templates', 'Genshi Text', ('genshitext',), (), ('application/x-genshi-text', 'text/x-genshi')), - 'GettextLexer': ('pip._vendor.pygments.lexers.textfmts', 'Gettext Catalog', ('pot', 'po'), ('*.pot', '*.po'), ('application/x-gettext', 'text/x-gettext', 'text/gettext')), - 'GherkinLexer': ('pip._vendor.pygments.lexers.testing', 'Gherkin', ('gherkin', 'cucumber'), ('*.feature',), ('text/x-gherkin',)), - 'GnuplotLexer': ('pip._vendor.pygments.lexers.graphics', 'Gnuplot', ('gnuplot',), ('*.plot', '*.plt'), ('text/x-gnuplot',)), - 'GoLexer': ('pip._vendor.pygments.lexers.go', 'Go', ('go', 'golang'), ('*.go',), ('text/x-gosrc',)), - 'GoloLexer': ('pip._vendor.pygments.lexers.jvm', 'Golo', ('golo',), ('*.golo',), ()), - 'GoodDataCLLexer': ('pip._vendor.pygments.lexers.business', 'GoodData-CL', ('gooddata-cl',), ('*.gdc',), ('text/x-gooddata-cl',)), - 'GosuLexer': ('pip._vendor.pygments.lexers.jvm', 'Gosu', ('gosu',), ('*.gs', '*.gsx', '*.gsp', '*.vark'), ('text/x-gosu',)), - 'GosuTemplateLexer': ('pip._vendor.pygments.lexers.jvm', 'Gosu Template', ('gst',), ('*.gst',), ('text/x-gosu-template',)), - 'GraphvizLexer': ('pip._vendor.pygments.lexers.graphviz', 'Graphviz', ('graphviz', 'dot'), ('*.gv', '*.dot'), ('text/x-graphviz', 'text/vnd.graphviz')), - 'GroffLexer': ('pip._vendor.pygments.lexers.markup', 'Groff', ('groff', 'nroff', 'man'), ('*.[1-9]', '*.man', '*.1p', '*.3pm'), ('application/x-troff', 'text/troff')), - 'GroovyLexer': ('pip._vendor.pygments.lexers.jvm', 'Groovy', ('groovy',), ('*.groovy', '*.gradle'), ('text/x-groovy',)), - 'HLSLShaderLexer': ('pip._vendor.pygments.lexers.graphics', 'HLSL', ('hlsl',), ('*.hlsl', '*.hlsli'), ('text/x-hlsl',)), - 'HTMLUL4Lexer': ('pip._vendor.pygments.lexers.ul4', 'HTML+UL4', ('html+ul4',), ('*.htmlul4',), ()), - 'HamlLexer': ('pip._vendor.pygments.lexers.html', 'Haml', ('haml',), ('*.haml',), ('text/x-haml',)), - 'HandlebarsHtmlLexer': ('pip._vendor.pygments.lexers.templates', 'HTML+Handlebars', ('html+handlebars',), ('*.handlebars', '*.hbs'), ('text/html+handlebars', 'text/x-handlebars-template')), - 'HandlebarsLexer': ('pip._vendor.pygments.lexers.templates', 'Handlebars', ('handlebars',), (), ()), - 'HaskellLexer': ('pip._vendor.pygments.lexers.haskell', 'Haskell', ('haskell', 'hs'), ('*.hs',), ('text/x-haskell',)), - 'HaxeLexer': ('pip._vendor.pygments.lexers.haxe', 'Haxe', ('haxe', 'hxsl', 'hx'), ('*.hx', '*.hxsl'), ('text/haxe', 'text/x-haxe', 'text/x-hx')), - 'HexdumpLexer': ('pip._vendor.pygments.lexers.hexdump', 'Hexdump', ('hexdump',), (), ()), - 'HsailLexer': ('pip._vendor.pygments.lexers.asm', 'HSAIL', ('hsail', 'hsa'), ('*.hsail',), ('text/x-hsail',)), - 'HspecLexer': ('pip._vendor.pygments.lexers.haskell', 'Hspec', ('hspec',), ('*Spec.hs',), ()), - 'HtmlDjangoLexer': ('pip._vendor.pygments.lexers.templates', 'HTML+Django/Jinja', ('html+django', 'html+jinja', 'htmldjango'), ('*.html.j2', '*.htm.j2', '*.xhtml.j2', '*.html.jinja2', '*.htm.jinja2', '*.xhtml.jinja2'), ('text/html+django', 'text/html+jinja')), - 'HtmlGenshiLexer': ('pip._vendor.pygments.lexers.templates', 'HTML+Genshi', ('html+genshi', 'html+kid'), (), ('text/html+genshi',)), - 'HtmlLexer': ('pip._vendor.pygments.lexers.html', 'HTML', ('html',), ('*.html', '*.htm', '*.xhtml', '*.xslt'), ('text/html', 'application/xhtml+xml')), - 'HtmlPhpLexer': ('pip._vendor.pygments.lexers.templates', 'HTML+PHP', ('html+php',), ('*.phtml',), ('application/x-php', 'application/x-httpd-php', 'application/x-httpd-php3', 'application/x-httpd-php4', 'application/x-httpd-php5')), - 'HtmlSmartyLexer': ('pip._vendor.pygments.lexers.templates', 'HTML+Smarty', ('html+smarty',), (), ('text/html+smarty',)), - 'HttpLexer': ('pip._vendor.pygments.lexers.textfmts', 'HTTP', ('http',), (), ()), - 'HxmlLexer': ('pip._vendor.pygments.lexers.haxe', 'Hxml', ('haxeml', 'hxml'), ('*.hxml',), ()), - 'HyLexer': ('pip._vendor.pygments.lexers.lisp', 'Hy', ('hylang',), ('*.hy',), ('text/x-hy', 'application/x-hy')), - 'HybrisLexer': ('pip._vendor.pygments.lexers.scripting', 'Hybris', ('hybris', 'hy'), ('*.hy', '*.hyb'), ('text/x-hybris', 'application/x-hybris')), - 'IDLLexer': ('pip._vendor.pygments.lexers.idl', 'IDL', ('idl',), ('*.pro',), ('text/idl',)), - 'IconLexer': ('pip._vendor.pygments.lexers.unicon', 'Icon', ('icon',), ('*.icon', '*.ICON'), ()), - 'IdrisLexer': ('pip._vendor.pygments.lexers.haskell', 'Idris', ('idris', 'idr'), ('*.idr',), ('text/x-idris',)), - 'IgorLexer': ('pip._vendor.pygments.lexers.igor', 'Igor', ('igor', 'igorpro'), ('*.ipf',), ('text/ipf',)), - 'Inform6Lexer': ('pip._vendor.pygments.lexers.int_fiction', 'Inform 6', ('inform6', 'i6'), ('*.inf',), ()), - 'Inform6TemplateLexer': ('pip._vendor.pygments.lexers.int_fiction', 'Inform 6 template', ('i6t',), ('*.i6t',), ()), - 'Inform7Lexer': ('pip._vendor.pygments.lexers.int_fiction', 'Inform 7', ('inform7', 'i7'), ('*.ni', '*.i7x'), ()), - 'IniLexer': ('pip._vendor.pygments.lexers.configs', 'INI', ('ini', 'cfg', 'dosini'), ('*.ini', '*.cfg', '*.inf', '.editorconfig', '*.service', '*.socket', '*.device', '*.mount', '*.automount', '*.swap', '*.target', '*.path', '*.timer', '*.slice', '*.scope'), ('text/x-ini', 'text/inf')), - 'IoLexer': ('pip._vendor.pygments.lexers.iolang', 'Io', ('io',), ('*.io',), ('text/x-iosrc',)), - 'IokeLexer': ('pip._vendor.pygments.lexers.jvm', 'Ioke', ('ioke', 'ik'), ('*.ik',), ('text/x-iokesrc',)), - 'IrcLogsLexer': ('pip._vendor.pygments.lexers.textfmts', 'IRC logs', ('irc',), ('*.weechatlog',), ('text/x-irclog',)), - 'IsabelleLexer': ('pip._vendor.pygments.lexers.theorem', 'Isabelle', ('isabelle',), ('*.thy',), ('text/x-isabelle',)), - 'JLexer': ('pip._vendor.pygments.lexers.j', 'J', ('j',), ('*.ijs',), ('text/x-j',)), - 'JMESPathLexer': ('pip._vendor.pygments.lexers.jmespath', 'JMESPath', ('jmespath', 'jp'), ('*.jp',), ()), - 'JSLTLexer': ('pip._vendor.pygments.lexers.jslt', 'JSLT', ('jslt',), ('*.jslt',), ('text/x-jslt',)), - 'JagsLexer': ('pip._vendor.pygments.lexers.modeling', 'JAGS', ('jags',), ('*.jag', '*.bug'), ()), - 'JasminLexer': ('pip._vendor.pygments.lexers.jvm', 'Jasmin', ('jasmin', 'jasminxt'), ('*.j',), ()), - 'JavaLexer': ('pip._vendor.pygments.lexers.jvm', 'Java', ('java',), ('*.java',), ('text/x-java',)), - 'JavascriptDjangoLexer': ('pip._vendor.pygments.lexers.templates', 'JavaScript+Django/Jinja', ('javascript+django', 'js+django', 'javascript+jinja', 'js+jinja'), ('*.js.j2', '*.js.jinja2'), ('application/x-javascript+django', 'application/x-javascript+jinja', 'text/x-javascript+django', 'text/x-javascript+jinja', 'text/javascript+django', 'text/javascript+jinja')), - 'JavascriptErbLexer': ('pip._vendor.pygments.lexers.templates', 'JavaScript+Ruby', ('javascript+ruby', 'js+ruby', 'javascript+erb', 'js+erb'), (), ('application/x-javascript+ruby', 'text/x-javascript+ruby', 'text/javascript+ruby')), - 'JavascriptGenshiLexer': ('pip._vendor.pygments.lexers.templates', 'JavaScript+Genshi Text', ('js+genshitext', 'js+genshi', 'javascript+genshitext', 'javascript+genshi'), (), ('application/x-javascript+genshi', 'text/x-javascript+genshi', 'text/javascript+genshi')), - 'JavascriptLexer': ('pip._vendor.pygments.lexers.javascript', 'JavaScript', ('javascript', 'js'), ('*.js', '*.jsm', '*.mjs', '*.cjs'), ('application/javascript', 'application/x-javascript', 'text/x-javascript', 'text/javascript')), - 'JavascriptPhpLexer': ('pip._vendor.pygments.lexers.templates', 'JavaScript+PHP', ('javascript+php', 'js+php'), (), ('application/x-javascript+php', 'text/x-javascript+php', 'text/javascript+php')), - 'JavascriptSmartyLexer': ('pip._vendor.pygments.lexers.templates', 'JavaScript+Smarty', ('javascript+smarty', 'js+smarty'), (), ('application/x-javascript+smarty', 'text/x-javascript+smarty', 'text/javascript+smarty')), - 'JavascriptUL4Lexer': ('pip._vendor.pygments.lexers.ul4', 'Javascript+UL4', ('js+ul4',), ('*.jsul4',), ()), - 'JclLexer': ('pip._vendor.pygments.lexers.scripting', 'JCL', ('jcl',), ('*.jcl',), ('text/x-jcl',)), - 'JsgfLexer': ('pip._vendor.pygments.lexers.grammar_notation', 'JSGF', ('jsgf',), ('*.jsgf',), ('application/jsgf', 'application/x-jsgf', 'text/jsgf')), - 'JsonBareObjectLexer': ('pip._vendor.pygments.lexers.data', 'JSONBareObject', (), (), ()), - 'JsonLdLexer': ('pip._vendor.pygments.lexers.data', 'JSON-LD', ('jsonld', 'json-ld'), ('*.jsonld',), ('application/ld+json',)), - 'JsonLexer': ('pip._vendor.pygments.lexers.data', 'JSON', ('json', 'json-object'), ('*.json', 'Pipfile.lock'), ('application/json', 'application/json-object')), - 'JsonnetLexer': ('pip._vendor.pygments.lexers.jsonnet', 'Jsonnet', ('jsonnet',), ('*.jsonnet', '*.libsonnet'), ()), - 'JspLexer': ('pip._vendor.pygments.lexers.templates', 'Java Server Page', ('jsp',), ('*.jsp',), ('application/x-jsp',)), - 'JuliaConsoleLexer': ('pip._vendor.pygments.lexers.julia', 'Julia console', ('jlcon', 'julia-repl'), (), ()), - 'JuliaLexer': ('pip._vendor.pygments.lexers.julia', 'Julia', ('julia', 'jl'), ('*.jl',), ('text/x-julia', 'application/x-julia')), - 'JuttleLexer': ('pip._vendor.pygments.lexers.javascript', 'Juttle', ('juttle',), ('*.juttle',), ('application/juttle', 'application/x-juttle', 'text/x-juttle', 'text/juttle')), - 'KLexer': ('pip._vendor.pygments.lexers.q', 'K', ('k',), ('*.k',), ()), - 'KalLexer': ('pip._vendor.pygments.lexers.javascript', 'Kal', ('kal',), ('*.kal',), ('text/kal', 'application/kal')), - 'KconfigLexer': ('pip._vendor.pygments.lexers.configs', 'Kconfig', ('kconfig', 'menuconfig', 'linux-config', 'kernel-config'), ('Kconfig*', '*Config.in*', 'external.in*', 'standard-modules.in'), ('text/x-kconfig',)), - 'KernelLogLexer': ('pip._vendor.pygments.lexers.textfmts', 'Kernel log', ('kmsg', 'dmesg'), ('*.kmsg', '*.dmesg'), ()), - 'KokaLexer': ('pip._vendor.pygments.lexers.haskell', 'Koka', ('koka',), ('*.kk', '*.kki'), ('text/x-koka',)), - 'KotlinLexer': ('pip._vendor.pygments.lexers.jvm', 'Kotlin', ('kotlin',), ('*.kt', '*.kts'), ('text/x-kotlin',)), - 'KuinLexer': ('pip._vendor.pygments.lexers.kuin', 'Kuin', ('kuin',), ('*.kn',), ()), - 'LSLLexer': ('pip._vendor.pygments.lexers.scripting', 'LSL', ('lsl',), ('*.lsl',), ('text/x-lsl',)), - 'LassoCssLexer': ('pip._vendor.pygments.lexers.templates', 'CSS+Lasso', ('css+lasso',), (), ('text/css+lasso',)), - 'LassoHtmlLexer': ('pip._vendor.pygments.lexers.templates', 'HTML+Lasso', ('html+lasso',), (), ('text/html+lasso', 'application/x-httpd-lasso', 'application/x-httpd-lasso[89]')), - 'LassoJavascriptLexer': ('pip._vendor.pygments.lexers.templates', 'JavaScript+Lasso', ('javascript+lasso', 'js+lasso'), (), ('application/x-javascript+lasso', 'text/x-javascript+lasso', 'text/javascript+lasso')), - 'LassoLexer': ('pip._vendor.pygments.lexers.javascript', 'Lasso', ('lasso', 'lassoscript'), ('*.lasso', '*.lasso[89]'), ('text/x-lasso',)), - 'LassoXmlLexer': ('pip._vendor.pygments.lexers.templates', 'XML+Lasso', ('xml+lasso',), (), ('application/xml+lasso',)), - 'LeanLexer': ('pip._vendor.pygments.lexers.theorem', 'Lean', ('lean',), ('*.lean',), ('text/x-lean',)), - 'LessCssLexer': ('pip._vendor.pygments.lexers.css', 'LessCss', ('less',), ('*.less',), ('text/x-less-css',)), - 'LighttpdConfLexer': ('pip._vendor.pygments.lexers.configs', 'Lighttpd configuration file', ('lighttpd', 'lighty'), ('lighttpd.conf',), ('text/x-lighttpd-conf',)), - 'LilyPondLexer': ('pip._vendor.pygments.lexers.lilypond', 'LilyPond', ('lilypond',), ('*.ly',), ()), - 'LimboLexer': ('pip._vendor.pygments.lexers.inferno', 'Limbo', ('limbo',), ('*.b',), ('text/limbo',)), - 'LiquidLexer': ('pip._vendor.pygments.lexers.templates', 'liquid', ('liquid',), ('*.liquid',), ()), - 'LiterateAgdaLexer': ('pip._vendor.pygments.lexers.haskell', 'Literate Agda', ('literate-agda', 'lagda'), ('*.lagda',), ('text/x-literate-agda',)), - 'LiterateCryptolLexer': ('pip._vendor.pygments.lexers.haskell', 'Literate Cryptol', ('literate-cryptol', 'lcryptol', 'lcry'), ('*.lcry',), ('text/x-literate-cryptol',)), - 'LiterateHaskellLexer': ('pip._vendor.pygments.lexers.haskell', 'Literate Haskell', ('literate-haskell', 'lhaskell', 'lhs'), ('*.lhs',), ('text/x-literate-haskell',)), - 'LiterateIdrisLexer': ('pip._vendor.pygments.lexers.haskell', 'Literate Idris', ('literate-idris', 'lidris', 'lidr'), ('*.lidr',), ('text/x-literate-idris',)), - 'LiveScriptLexer': ('pip._vendor.pygments.lexers.javascript', 'LiveScript', ('livescript', 'live-script'), ('*.ls',), ('text/livescript',)), - 'LlvmLexer': ('pip._vendor.pygments.lexers.asm', 'LLVM', ('llvm',), ('*.ll',), ('text/x-llvm',)), - 'LlvmMirBodyLexer': ('pip._vendor.pygments.lexers.asm', 'LLVM-MIR Body', ('llvm-mir-body',), (), ()), - 'LlvmMirLexer': ('pip._vendor.pygments.lexers.asm', 'LLVM-MIR', ('llvm-mir',), ('*.mir',), ()), - 'LogosLexer': ('pip._vendor.pygments.lexers.objective', 'Logos', ('logos',), ('*.x', '*.xi', '*.xm', '*.xmi'), ('text/x-logos',)), - 'LogtalkLexer': ('pip._vendor.pygments.lexers.prolog', 'Logtalk', ('logtalk',), ('*.lgt', '*.logtalk'), ('text/x-logtalk',)), - 'LuaLexer': ('pip._vendor.pygments.lexers.scripting', 'Lua', ('lua',), ('*.lua', '*.wlua'), ('text/x-lua', 'application/x-lua')), - 'MCFunctionLexer': ('pip._vendor.pygments.lexers.minecraft', 'MCFunction', ('mcfunction', 'mcf'), ('*.mcfunction',), ('text/mcfunction',)), - 'MCSchemaLexer': ('pip._vendor.pygments.lexers.minecraft', 'MCSchema', ('mcschema',), ('*.mcschema',), ('text/mcschema',)), - 'MIMELexer': ('pip._vendor.pygments.lexers.mime', 'MIME', ('mime',), (), ('multipart/mixed', 'multipart/related', 'multipart/alternative')), - 'MIPSLexer': ('pip._vendor.pygments.lexers.mips', 'MIPS', ('mips',), ('*.mips', '*.MIPS'), ()), - 'MOOCodeLexer': ('pip._vendor.pygments.lexers.scripting', 'MOOCode', ('moocode', 'moo'), ('*.moo',), ('text/x-moocode',)), - 'MSDOSSessionLexer': ('pip._vendor.pygments.lexers.shell', 'MSDOS Session', ('doscon',), (), ()), - 'Macaulay2Lexer': ('pip._vendor.pygments.lexers.macaulay2', 'Macaulay2', ('macaulay2',), ('*.m2',), ()), - 'MakefileLexer': ('pip._vendor.pygments.lexers.make', 'Makefile', ('make', 'makefile', 'mf', 'bsdmake'), ('*.mak', '*.mk', 'Makefile', 'makefile', 'Makefile.*', 'GNUmakefile'), ('text/x-makefile',)), - 'MakoCssLexer': ('pip._vendor.pygments.lexers.templates', 'CSS+Mako', ('css+mako',), (), ('text/css+mako',)), - 'MakoHtmlLexer': ('pip._vendor.pygments.lexers.templates', 'HTML+Mako', ('html+mako',), (), ('text/html+mako',)), - 'MakoJavascriptLexer': ('pip._vendor.pygments.lexers.templates', 'JavaScript+Mako', ('javascript+mako', 'js+mako'), (), ('application/x-javascript+mako', 'text/x-javascript+mako', 'text/javascript+mako')), - 'MakoLexer': ('pip._vendor.pygments.lexers.templates', 'Mako', ('mako',), ('*.mao',), ('application/x-mako',)), - 'MakoXmlLexer': ('pip._vendor.pygments.lexers.templates', 'XML+Mako', ('xml+mako',), (), ('application/xml+mako',)), - 'MaqlLexer': ('pip._vendor.pygments.lexers.business', 'MAQL', ('maql',), ('*.maql',), ('text/x-gooddata-maql', 'application/x-gooddata-maql')), - 'MarkdownLexer': ('pip._vendor.pygments.lexers.markup', 'Markdown', ('markdown', 'md'), ('*.md', '*.markdown'), ('text/x-markdown',)), - 'MaskLexer': ('pip._vendor.pygments.lexers.javascript', 'Mask', ('mask',), ('*.mask',), ('text/x-mask',)), - 'MasonLexer': ('pip._vendor.pygments.lexers.templates', 'Mason', ('mason',), ('*.m', '*.mhtml', '*.mc', '*.mi', 'autohandler', 'dhandler'), ('application/x-mason',)), - 'MathematicaLexer': ('pip._vendor.pygments.lexers.algebra', 'Mathematica', ('mathematica', 'mma', 'nb'), ('*.nb', '*.cdf', '*.nbp', '*.ma'), ('application/mathematica', 'application/vnd.wolfram.mathematica', 'application/vnd.wolfram.mathematica.package', 'application/vnd.wolfram.cdf')), - 'MatlabLexer': ('pip._vendor.pygments.lexers.matlab', 'Matlab', ('matlab',), ('*.m',), ('text/matlab',)), - 'MatlabSessionLexer': ('pip._vendor.pygments.lexers.matlab', 'Matlab session', ('matlabsession',), (), ()), - 'MaximaLexer': ('pip._vendor.pygments.lexers.maxima', 'Maxima', ('maxima', 'macsyma'), ('*.mac', '*.max'), ()), - 'MesonLexer': ('pip._vendor.pygments.lexers.meson', 'Meson', ('meson', 'meson.build'), ('meson.build', 'meson_options.txt'), ('text/x-meson',)), - 'MiniDLexer': ('pip._vendor.pygments.lexers.d', 'MiniD', ('minid',), (), ('text/x-minidsrc',)), - 'MiniScriptLexer': ('pip._vendor.pygments.lexers.scripting', 'MiniScript', ('miniscript', 'ms'), ('*.ms',), ('text/x-minicript', 'application/x-miniscript')), - 'ModelicaLexer': ('pip._vendor.pygments.lexers.modeling', 'Modelica', ('modelica',), ('*.mo',), ('text/x-modelica',)), - 'Modula2Lexer': ('pip._vendor.pygments.lexers.modula2', 'Modula-2', ('modula2', 'm2'), ('*.def', '*.mod'), ('text/x-modula2',)), - 'MoinWikiLexer': ('pip._vendor.pygments.lexers.markup', 'MoinMoin/Trac Wiki markup', ('trac-wiki', 'moin'), (), ('text/x-trac-wiki',)), - 'MonkeyLexer': ('pip._vendor.pygments.lexers.basic', 'Monkey', ('monkey',), ('*.monkey',), ('text/x-monkey',)), - 'MonteLexer': ('pip._vendor.pygments.lexers.monte', 'Monte', ('monte',), ('*.mt',), ()), - 'MoonScriptLexer': ('pip._vendor.pygments.lexers.scripting', 'MoonScript', ('moonscript', 'moon'), ('*.moon',), ('text/x-moonscript', 'application/x-moonscript')), - 'MoselLexer': ('pip._vendor.pygments.lexers.mosel', 'Mosel', ('mosel',), ('*.mos',), ()), - 'MozPreprocCssLexer': ('pip._vendor.pygments.lexers.markup', 'CSS+mozpreproc', ('css+mozpreproc',), ('*.css.in',), ()), - 'MozPreprocHashLexer': ('pip._vendor.pygments.lexers.markup', 'mozhashpreproc', ('mozhashpreproc',), (), ()), - 'MozPreprocJavascriptLexer': ('pip._vendor.pygments.lexers.markup', 'Javascript+mozpreproc', ('javascript+mozpreproc',), ('*.js.in',), ()), - 'MozPreprocPercentLexer': ('pip._vendor.pygments.lexers.markup', 'mozpercentpreproc', ('mozpercentpreproc',), (), ()), - 'MozPreprocXulLexer': ('pip._vendor.pygments.lexers.markup', 'XUL+mozpreproc', ('xul+mozpreproc',), ('*.xul.in',), ()), - 'MqlLexer': ('pip._vendor.pygments.lexers.c_like', 'MQL', ('mql', 'mq4', 'mq5', 'mql4', 'mql5'), ('*.mq4', '*.mq5', '*.mqh'), ('text/x-mql',)), - 'MscgenLexer': ('pip._vendor.pygments.lexers.dsls', 'Mscgen', ('mscgen', 'msc'), ('*.msc',), ()), - 'MuPADLexer': ('pip._vendor.pygments.lexers.algebra', 'MuPAD', ('mupad',), ('*.mu',), ()), - 'MxmlLexer': ('pip._vendor.pygments.lexers.actionscript', 'MXML', ('mxml',), ('*.mxml',), ()), - 'MySqlLexer': ('pip._vendor.pygments.lexers.sql', 'MySQL', ('mysql',), (), ('text/x-mysql',)), - 'MyghtyCssLexer': ('pip._vendor.pygments.lexers.templates', 'CSS+Myghty', ('css+myghty',), (), ('text/css+myghty',)), - 'MyghtyHtmlLexer': ('pip._vendor.pygments.lexers.templates', 'HTML+Myghty', ('html+myghty',), (), ('text/html+myghty',)), - 'MyghtyJavascriptLexer': ('pip._vendor.pygments.lexers.templates', 'JavaScript+Myghty', ('javascript+myghty', 'js+myghty'), (), ('application/x-javascript+myghty', 'text/x-javascript+myghty', 'text/javascript+mygthy')), - 'MyghtyLexer': ('pip._vendor.pygments.lexers.templates', 'Myghty', ('myghty',), ('*.myt', 'autodelegate'), ('application/x-myghty',)), - 'MyghtyXmlLexer': ('pip._vendor.pygments.lexers.templates', 'XML+Myghty', ('xml+myghty',), (), ('application/xml+myghty',)), - 'NCLLexer': ('pip._vendor.pygments.lexers.ncl', 'NCL', ('ncl',), ('*.ncl',), ('text/ncl',)), - 'NSISLexer': ('pip._vendor.pygments.lexers.installers', 'NSIS', ('nsis', 'nsi', 'nsh'), ('*.nsi', '*.nsh'), ('text/x-nsis',)), - 'NasmLexer': ('pip._vendor.pygments.lexers.asm', 'NASM', ('nasm',), ('*.asm', '*.ASM', '*.nasm'), ('text/x-nasm',)), - 'NasmObjdumpLexer': ('pip._vendor.pygments.lexers.asm', 'objdump-nasm', ('objdump-nasm',), ('*.objdump-intel',), ('text/x-nasm-objdump',)), - 'NemerleLexer': ('pip._vendor.pygments.lexers.dotnet', 'Nemerle', ('nemerle',), ('*.n',), ('text/x-nemerle',)), - 'NesCLexer': ('pip._vendor.pygments.lexers.c_like', 'nesC', ('nesc',), ('*.nc',), ('text/x-nescsrc',)), - 'NestedTextLexer': ('pip._vendor.pygments.lexers.configs', 'NestedText', ('nestedtext', 'nt'), ('*.nt',), ()), - 'NewLispLexer': ('pip._vendor.pygments.lexers.lisp', 'NewLisp', ('newlisp',), ('*.lsp', '*.nl', '*.kif'), ('text/x-newlisp', 'application/x-newlisp')), - 'NewspeakLexer': ('pip._vendor.pygments.lexers.smalltalk', 'Newspeak', ('newspeak',), ('*.ns2',), ('text/x-newspeak',)), - 'NginxConfLexer': ('pip._vendor.pygments.lexers.configs', 'Nginx configuration file', ('nginx',), ('nginx.conf',), ('text/x-nginx-conf',)), - 'NimrodLexer': ('pip._vendor.pygments.lexers.nimrod', 'Nimrod', ('nimrod', 'nim'), ('*.nim', '*.nimrod'), ('text/x-nim',)), - 'NitLexer': ('pip._vendor.pygments.lexers.nit', 'Nit', ('nit',), ('*.nit',), ()), - 'NixLexer': ('pip._vendor.pygments.lexers.nix', 'Nix', ('nixos', 'nix'), ('*.nix',), ('text/x-nix',)), - 'NodeConsoleLexer': ('pip._vendor.pygments.lexers.javascript', 'Node.js REPL console session', ('nodejsrepl',), (), ('text/x-nodejsrepl',)), - 'NotmuchLexer': ('pip._vendor.pygments.lexers.textfmts', 'Notmuch', ('notmuch',), (), ()), - 'NuSMVLexer': ('pip._vendor.pygments.lexers.smv', 'NuSMV', ('nusmv',), ('*.smv',), ()), - 'NumPyLexer': ('pip._vendor.pygments.lexers.python', 'NumPy', ('numpy',), (), ()), - 'ObjdumpLexer': ('pip._vendor.pygments.lexers.asm', 'objdump', ('objdump',), ('*.objdump',), ('text/x-objdump',)), - 'ObjectiveCLexer': ('pip._vendor.pygments.lexers.objective', 'Objective-C', ('objective-c', 'objectivec', 'obj-c', 'objc'), ('*.m', '*.h'), ('text/x-objective-c',)), - 'ObjectiveCppLexer': ('pip._vendor.pygments.lexers.objective', 'Objective-C++', ('objective-c++', 'objectivec++', 'obj-c++', 'objc++'), ('*.mm', '*.hh'), ('text/x-objective-c++',)), - 'ObjectiveJLexer': ('pip._vendor.pygments.lexers.javascript', 'Objective-J', ('objective-j', 'objectivej', 'obj-j', 'objj'), ('*.j',), ('text/x-objective-j',)), - 'OcamlLexer': ('pip._vendor.pygments.lexers.ml', 'OCaml', ('ocaml',), ('*.ml', '*.mli', '*.mll', '*.mly'), ('text/x-ocaml',)), - 'OctaveLexer': ('pip._vendor.pygments.lexers.matlab', 'Octave', ('octave',), ('*.m',), ('text/octave',)), - 'OdinLexer': ('pip._vendor.pygments.lexers.archetype', 'ODIN', ('odin',), ('*.odin',), ('text/odin',)), - 'OmgIdlLexer': ('pip._vendor.pygments.lexers.c_like', 'OMG Interface Definition Language', ('omg-idl',), ('*.idl', '*.pidl'), ()), - 'OocLexer': ('pip._vendor.pygments.lexers.ooc', 'Ooc', ('ooc',), ('*.ooc',), ('text/x-ooc',)), - 'OpaLexer': ('pip._vendor.pygments.lexers.ml', 'Opa', ('opa',), ('*.opa',), ('text/x-opa',)), - 'OpenEdgeLexer': ('pip._vendor.pygments.lexers.business', 'OpenEdge ABL', ('openedge', 'abl', 'progress'), ('*.p', '*.cls'), ('text/x-openedge', 'application/x-openedge')), - 'OutputLexer': ('pip._vendor.pygments.lexers.special', 'Text output', ('output',), (), ()), - 'PacmanConfLexer': ('pip._vendor.pygments.lexers.configs', 'PacmanConf', ('pacmanconf',), ('pacman.conf',), ()), - 'PanLexer': ('pip._vendor.pygments.lexers.dsls', 'Pan', ('pan',), ('*.pan',), ()), - 'ParaSailLexer': ('pip._vendor.pygments.lexers.parasail', 'ParaSail', ('parasail',), ('*.psi', '*.psl'), ('text/x-parasail',)), - 'PawnLexer': ('pip._vendor.pygments.lexers.pawn', 'Pawn', ('pawn',), ('*.p', '*.pwn', '*.inc'), ('text/x-pawn',)), - 'PegLexer': ('pip._vendor.pygments.lexers.grammar_notation', 'PEG', ('peg',), ('*.peg',), ('text/x-peg',)), - 'Perl6Lexer': ('pip._vendor.pygments.lexers.perl', 'Perl6', ('perl6', 'pl6', 'raku'), ('*.pl', '*.pm', '*.nqp', '*.p6', '*.6pl', '*.p6l', '*.pl6', '*.6pm', '*.p6m', '*.pm6', '*.t', '*.raku', '*.rakumod', '*.rakutest', '*.rakudoc'), ('text/x-perl6', 'application/x-perl6')), - 'PerlLexer': ('pip._vendor.pygments.lexers.perl', 'Perl', ('perl', 'pl'), ('*.pl', '*.pm', '*.t', '*.perl'), ('text/x-perl', 'application/x-perl')), - 'PhixLexer': ('pip._vendor.pygments.lexers.phix', 'Phix', ('phix',), ('*.exw',), ('text/x-phix',)), - 'PhpLexer': ('pip._vendor.pygments.lexers.php', 'PHP', ('php', 'php3', 'php4', 'php5'), ('*.php', '*.php[345]', '*.inc'), ('text/x-php',)), - 'PigLexer': ('pip._vendor.pygments.lexers.jvm', 'Pig', ('pig',), ('*.pig',), ('text/x-pig',)), - 'PikeLexer': ('pip._vendor.pygments.lexers.c_like', 'Pike', ('pike',), ('*.pike', '*.pmod'), ('text/x-pike',)), - 'PkgConfigLexer': ('pip._vendor.pygments.lexers.configs', 'PkgConfig', ('pkgconfig',), ('*.pc',), ()), - 'PlPgsqlLexer': ('pip._vendor.pygments.lexers.sql', 'PL/pgSQL', ('plpgsql',), (), ('text/x-plpgsql',)), - 'PointlessLexer': ('pip._vendor.pygments.lexers.pointless', 'Pointless', ('pointless',), ('*.ptls',), ()), - 'PonyLexer': ('pip._vendor.pygments.lexers.pony', 'Pony', ('pony',), ('*.pony',), ()), - 'PortugolLexer': ('pip._vendor.pygments.lexers.pascal', 'Portugol', ('portugol',), ('*.alg', '*.portugol'), ()), - 'PostScriptLexer': ('pip._vendor.pygments.lexers.graphics', 'PostScript', ('postscript', 'postscr'), ('*.ps', '*.eps'), ('application/postscript',)), - 'PostgresConsoleLexer': ('pip._vendor.pygments.lexers.sql', 'PostgreSQL console (psql)', ('psql', 'postgresql-console', 'postgres-console'), (), ('text/x-postgresql-psql',)), - 'PostgresExplainLexer': ('pip._vendor.pygments.lexers.sql', 'PostgreSQL EXPLAIN dialect', ('postgres-explain',), ('*.explain',), ('text/x-postgresql-explain',)), - 'PostgresLexer': ('pip._vendor.pygments.lexers.sql', 'PostgreSQL SQL dialect', ('postgresql', 'postgres'), (), ('text/x-postgresql',)), - 'PovrayLexer': ('pip._vendor.pygments.lexers.graphics', 'POVRay', ('pov',), ('*.pov', '*.inc'), ('text/x-povray',)), - 'PowerShellLexer': ('pip._vendor.pygments.lexers.shell', 'PowerShell', ('powershell', 'pwsh', 'posh', 'ps1', 'psm1'), ('*.ps1', '*.psm1'), ('text/x-powershell',)), - 'PowerShellSessionLexer': ('pip._vendor.pygments.lexers.shell', 'PowerShell Session', ('pwsh-session', 'ps1con'), (), ()), - 'PraatLexer': ('pip._vendor.pygments.lexers.praat', 'Praat', ('praat',), ('*.praat', '*.proc', '*.psc'), ()), - 'ProcfileLexer': ('pip._vendor.pygments.lexers.procfile', 'Procfile', ('procfile',), ('Procfile',), ()), - 'PrologLexer': ('pip._vendor.pygments.lexers.prolog', 'Prolog', ('prolog',), ('*.ecl', '*.prolog', '*.pro', '*.pl'), ('text/x-prolog',)), - 'PromQLLexer': ('pip._vendor.pygments.lexers.promql', 'PromQL', ('promql',), ('*.promql',), ()), - 'PropertiesLexer': ('pip._vendor.pygments.lexers.configs', 'Properties', ('properties', 'jproperties'), ('*.properties',), ('text/x-java-properties',)), - 'ProtoBufLexer': ('pip._vendor.pygments.lexers.dsls', 'Protocol Buffer', ('protobuf', 'proto'), ('*.proto',), ()), - 'PsyshConsoleLexer': ('pip._vendor.pygments.lexers.php', 'PsySH console session for PHP', ('psysh',), (), ()), - 'PugLexer': ('pip._vendor.pygments.lexers.html', 'Pug', ('pug', 'jade'), ('*.pug', '*.jade'), ('text/x-pug', 'text/x-jade')), - 'PuppetLexer': ('pip._vendor.pygments.lexers.dsls', 'Puppet', ('puppet',), ('*.pp',), ()), - 'PyPyLogLexer': ('pip._vendor.pygments.lexers.console', 'PyPy Log', ('pypylog', 'pypy'), ('*.pypylog',), ('application/x-pypylog',)), - 'Python2Lexer': ('pip._vendor.pygments.lexers.python', 'Python 2.x', ('python2', 'py2'), (), ('text/x-python2', 'application/x-python2')), - 'Python2TracebackLexer': ('pip._vendor.pygments.lexers.python', 'Python 2.x Traceback', ('py2tb',), ('*.py2tb',), ('text/x-python2-traceback',)), - 'PythonConsoleLexer': ('pip._vendor.pygments.lexers.python', 'Python console session', ('pycon',), (), ('text/x-python-doctest',)), - 'PythonLexer': ('pip._vendor.pygments.lexers.python', 'Python', ('python', 'py', 'sage', 'python3', 'py3'), ('*.py', '*.pyw', '*.pyi', '*.jy', '*.sage', '*.sc', 'SConstruct', 'SConscript', '*.bzl', 'BUCK', 'BUILD', 'BUILD.bazel', 'WORKSPACE', '*.tac'), ('text/x-python', 'application/x-python', 'text/x-python3', 'application/x-python3')), - 'PythonTracebackLexer': ('pip._vendor.pygments.lexers.python', 'Python Traceback', ('pytb', 'py3tb'), ('*.pytb', '*.py3tb'), ('text/x-python-traceback', 'text/x-python3-traceback')), - 'PythonUL4Lexer': ('pip._vendor.pygments.lexers.ul4', 'Python+UL4', ('py+ul4',), ('*.pyul4',), ()), - 'QBasicLexer': ('pip._vendor.pygments.lexers.basic', 'QBasic', ('qbasic', 'basic'), ('*.BAS', '*.bas'), ('text/basic',)), - 'QLexer': ('pip._vendor.pygments.lexers.q', 'Q', ('q',), ('*.q',), ()), - 'QVToLexer': ('pip._vendor.pygments.lexers.qvt', 'QVTO', ('qvto', 'qvt'), ('*.qvto',), ()), - 'QlikLexer': ('pip._vendor.pygments.lexers.qlik', 'Qlik', ('qlik', 'qlikview', 'qliksense', 'qlikscript'), ('*.qvs', '*.qvw'), ()), - 'QmlLexer': ('pip._vendor.pygments.lexers.webmisc', 'QML', ('qml', 'qbs'), ('*.qml', '*.qbs'), ('application/x-qml', 'application/x-qt.qbs+qml')), - 'RConsoleLexer': ('pip._vendor.pygments.lexers.r', 'RConsole', ('rconsole', 'rout'), ('*.Rout',), ()), - 'RNCCompactLexer': ('pip._vendor.pygments.lexers.rnc', 'Relax-NG Compact', ('rng-compact', 'rnc'), ('*.rnc',), ()), - 'RPMSpecLexer': ('pip._vendor.pygments.lexers.installers', 'RPMSpec', ('spec',), ('*.spec',), ('text/x-rpm-spec',)), - 'RacketLexer': ('pip._vendor.pygments.lexers.lisp', 'Racket', ('racket', 'rkt'), ('*.rkt', '*.rktd', '*.rktl'), ('text/x-racket', 'application/x-racket')), - 'RagelCLexer': ('pip._vendor.pygments.lexers.parsers', 'Ragel in C Host', ('ragel-c',), ('*.rl',), ()), - 'RagelCppLexer': ('pip._vendor.pygments.lexers.parsers', 'Ragel in CPP Host', ('ragel-cpp',), ('*.rl',), ()), - 'RagelDLexer': ('pip._vendor.pygments.lexers.parsers', 'Ragel in D Host', ('ragel-d',), ('*.rl',), ()), - 'RagelEmbeddedLexer': ('pip._vendor.pygments.lexers.parsers', 'Embedded Ragel', ('ragel-em',), ('*.rl',), ()), - 'RagelJavaLexer': ('pip._vendor.pygments.lexers.parsers', 'Ragel in Java Host', ('ragel-java',), ('*.rl',), ()), - 'RagelLexer': ('pip._vendor.pygments.lexers.parsers', 'Ragel', ('ragel',), (), ()), - 'RagelObjectiveCLexer': ('pip._vendor.pygments.lexers.parsers', 'Ragel in Objective C Host', ('ragel-objc',), ('*.rl',), ()), - 'RagelRubyLexer': ('pip._vendor.pygments.lexers.parsers', 'Ragel in Ruby Host', ('ragel-ruby', 'ragel-rb'), ('*.rl',), ()), - 'RawTokenLexer': ('pip._vendor.pygments.lexers.special', 'Raw token data', (), (), ('application/x-pygments-tokens',)), - 'RdLexer': ('pip._vendor.pygments.lexers.r', 'Rd', ('rd',), ('*.Rd',), ('text/x-r-doc',)), - 'ReasonLexer': ('pip._vendor.pygments.lexers.ml', 'ReasonML', ('reasonml', 'reason'), ('*.re', '*.rei'), ('text/x-reasonml',)), - 'RebolLexer': ('pip._vendor.pygments.lexers.rebol', 'REBOL', ('rebol',), ('*.r', '*.r3', '*.reb'), ('text/x-rebol',)), - 'RedLexer': ('pip._vendor.pygments.lexers.rebol', 'Red', ('red', 'red/system'), ('*.red', '*.reds'), ('text/x-red', 'text/x-red-system')), - 'RedcodeLexer': ('pip._vendor.pygments.lexers.esoteric', 'Redcode', ('redcode',), ('*.cw',), ()), - 'RegeditLexer': ('pip._vendor.pygments.lexers.configs', 'reg', ('registry',), ('*.reg',), ('text/x-windows-registry',)), - 'ResourceLexer': ('pip._vendor.pygments.lexers.resource', 'ResourceBundle', ('resourcebundle', 'resource'), (), ()), - 'RexxLexer': ('pip._vendor.pygments.lexers.scripting', 'Rexx', ('rexx', 'arexx'), ('*.rexx', '*.rex', '*.rx', '*.arexx'), ('text/x-rexx',)), - 'RhtmlLexer': ('pip._vendor.pygments.lexers.templates', 'RHTML', ('rhtml', 'html+erb', 'html+ruby'), ('*.rhtml',), ('text/html+ruby',)), - 'RideLexer': ('pip._vendor.pygments.lexers.ride', 'Ride', ('ride',), ('*.ride',), ('text/x-ride',)), - 'RitaLexer': ('pip._vendor.pygments.lexers.rita', 'Rita', ('rita',), ('*.rita',), ('text/rita',)), - 'RoboconfGraphLexer': ('pip._vendor.pygments.lexers.roboconf', 'Roboconf Graph', ('roboconf-graph',), ('*.graph',), ()), - 'RoboconfInstancesLexer': ('pip._vendor.pygments.lexers.roboconf', 'Roboconf Instances', ('roboconf-instances',), ('*.instances',), ()), - 'RobotFrameworkLexer': ('pip._vendor.pygments.lexers.robotframework', 'RobotFramework', ('robotframework',), ('*.robot', '*.resource'), ('text/x-robotframework',)), - 'RqlLexer': ('pip._vendor.pygments.lexers.sql', 'RQL', ('rql',), ('*.rql',), ('text/x-rql',)), - 'RslLexer': ('pip._vendor.pygments.lexers.dsls', 'RSL', ('rsl',), ('*.rsl',), ('text/rsl',)), - 'RstLexer': ('pip._vendor.pygments.lexers.markup', 'reStructuredText', ('restructuredtext', 'rst', 'rest'), ('*.rst', '*.rest'), ('text/x-rst', 'text/prs.fallenstein.rst')), - 'RtsLexer': ('pip._vendor.pygments.lexers.trafficscript', 'TrafficScript', ('trafficscript', 'rts'), ('*.rts',), ()), - 'RubyConsoleLexer': ('pip._vendor.pygments.lexers.ruby', 'Ruby irb session', ('rbcon', 'irb'), (), ('text/x-ruby-shellsession',)), - 'RubyLexer': ('pip._vendor.pygments.lexers.ruby', 'Ruby', ('ruby', 'rb', 'duby'), ('*.rb', '*.rbw', 'Rakefile', '*.rake', '*.gemspec', '*.rbx', '*.duby', 'Gemfile', 'Vagrantfile'), ('text/x-ruby', 'application/x-ruby')), - 'RustLexer': ('pip._vendor.pygments.lexers.rust', 'Rust', ('rust', 'rs'), ('*.rs', '*.rs.in'), ('text/rust', 'text/x-rust')), - 'SASLexer': ('pip._vendor.pygments.lexers.sas', 'SAS', ('sas',), ('*.SAS', '*.sas'), ('text/x-sas', 'text/sas', 'application/x-sas')), - 'SLexer': ('pip._vendor.pygments.lexers.r', 'S', ('splus', 's', 'r'), ('*.S', '*.R', '.Rhistory', '.Rprofile', '.Renviron'), ('text/S-plus', 'text/S', 'text/x-r-source', 'text/x-r', 'text/x-R', 'text/x-r-history', 'text/x-r-profile')), - 'SMLLexer': ('pip._vendor.pygments.lexers.ml', 'Standard ML', ('sml',), ('*.sml', '*.sig', '*.fun'), ('text/x-standardml', 'application/x-standardml')), - 'SNBTLexer': ('pip._vendor.pygments.lexers.minecraft', 'SNBT', ('snbt',), ('*.snbt',), ('text/snbt',)), - 'SarlLexer': ('pip._vendor.pygments.lexers.jvm', 'SARL', ('sarl',), ('*.sarl',), ('text/x-sarl',)), - 'SassLexer': ('pip._vendor.pygments.lexers.css', 'Sass', ('sass',), ('*.sass',), ('text/x-sass',)), - 'SaviLexer': ('pip._vendor.pygments.lexers.savi', 'Savi', ('savi',), ('*.savi',), ()), - 'ScalaLexer': ('pip._vendor.pygments.lexers.jvm', 'Scala', ('scala',), ('*.scala',), ('text/x-scala',)), - 'ScamlLexer': ('pip._vendor.pygments.lexers.html', 'Scaml', ('scaml',), ('*.scaml',), ('text/x-scaml',)), - 'ScdocLexer': ('pip._vendor.pygments.lexers.scdoc', 'scdoc', ('scdoc', 'scd'), ('*.scd', '*.scdoc'), ()), - 'SchemeLexer': ('pip._vendor.pygments.lexers.lisp', 'Scheme', ('scheme', 'scm'), ('*.scm', '*.ss'), ('text/x-scheme', 'application/x-scheme')), - 'ScilabLexer': ('pip._vendor.pygments.lexers.matlab', 'Scilab', ('scilab',), ('*.sci', '*.sce', '*.tst'), ('text/scilab',)), - 'ScssLexer': ('pip._vendor.pygments.lexers.css', 'SCSS', ('scss',), ('*.scss',), ('text/x-scss',)), - 'SedLexer': ('pip._vendor.pygments.lexers.textedit', 'Sed', ('sed', 'gsed', 'ssed'), ('*.sed', '*.[gs]sed'), ('text/x-sed',)), - 'ShExCLexer': ('pip._vendor.pygments.lexers.rdf', 'ShExC', ('shexc', 'shex'), ('*.shex',), ('text/shex',)), - 'ShenLexer': ('pip._vendor.pygments.lexers.lisp', 'Shen', ('shen',), ('*.shen',), ('text/x-shen', 'application/x-shen')), - 'SieveLexer': ('pip._vendor.pygments.lexers.sieve', 'Sieve', ('sieve',), ('*.siv', '*.sieve'), ()), - 'SilverLexer': ('pip._vendor.pygments.lexers.verification', 'Silver', ('silver',), ('*.sil', '*.vpr'), ()), - 'SingularityLexer': ('pip._vendor.pygments.lexers.configs', 'Singularity', ('singularity',), ('*.def', 'Singularity'), ()), - 'SlashLexer': ('pip._vendor.pygments.lexers.slash', 'Slash', ('slash',), ('*.sla',), ()), - 'SlimLexer': ('pip._vendor.pygments.lexers.webmisc', 'Slim', ('slim',), ('*.slim',), ('text/x-slim',)), - 'SlurmBashLexer': ('pip._vendor.pygments.lexers.shell', 'Slurm', ('slurm', 'sbatch'), ('*.sl',), ()), - 'SmaliLexer': ('pip._vendor.pygments.lexers.dalvik', 'Smali', ('smali',), ('*.smali',), ('text/smali',)), - 'SmalltalkLexer': ('pip._vendor.pygments.lexers.smalltalk', 'Smalltalk', ('smalltalk', 'squeak', 'st'), ('*.st',), ('text/x-smalltalk',)), - 'SmartGameFormatLexer': ('pip._vendor.pygments.lexers.sgf', 'SmartGameFormat', ('sgf',), ('*.sgf',), ()), - 'SmartyLexer': ('pip._vendor.pygments.lexers.templates', 'Smarty', ('smarty',), ('*.tpl',), ('application/x-smarty',)), - 'SmithyLexer': ('pip._vendor.pygments.lexers.smithy', 'Smithy', ('smithy',), ('*.smithy',), ()), - 'SnobolLexer': ('pip._vendor.pygments.lexers.snobol', 'Snobol', ('snobol',), ('*.snobol',), ('text/x-snobol',)), - 'SnowballLexer': ('pip._vendor.pygments.lexers.dsls', 'Snowball', ('snowball',), ('*.sbl',), ()), - 'SolidityLexer': ('pip._vendor.pygments.lexers.solidity', 'Solidity', ('solidity',), ('*.sol',), ()), - 'SophiaLexer': ('pip._vendor.pygments.lexers.sophia', 'Sophia', ('sophia',), ('*.aes',), ()), - 'SourcePawnLexer': ('pip._vendor.pygments.lexers.pawn', 'SourcePawn', ('sp',), ('*.sp',), ('text/x-sourcepawn',)), - 'SourcesListLexer': ('pip._vendor.pygments.lexers.installers', 'Debian Sourcelist', ('debsources', 'sourceslist', 'sources.list'), ('sources.list',), ()), - 'SparqlLexer': ('pip._vendor.pygments.lexers.rdf', 'SPARQL', ('sparql',), ('*.rq', '*.sparql'), ('application/sparql-query',)), - 'SpiceLexer': ('pip._vendor.pygments.lexers.spice', 'Spice', ('spice', 'spicelang'), ('*.spice',), ('text/x-spice',)), - 'SqlJinjaLexer': ('pip._vendor.pygments.lexers.templates', 'SQL+Jinja', ('sql+jinja',), ('*.sql', '*.sql.j2', '*.sql.jinja2'), ()), - 'SqlLexer': ('pip._vendor.pygments.lexers.sql', 'SQL', ('sql',), ('*.sql',), ('text/x-sql',)), - 'SqliteConsoleLexer': ('pip._vendor.pygments.lexers.sql', 'sqlite3con', ('sqlite3',), ('*.sqlite3-console',), ('text/x-sqlite3-console',)), - 'SquidConfLexer': ('pip._vendor.pygments.lexers.configs', 'SquidConf', ('squidconf', 'squid.conf', 'squid'), ('squid.conf',), ('text/x-squidconf',)), - 'SrcinfoLexer': ('pip._vendor.pygments.lexers.srcinfo', 'Srcinfo', ('srcinfo',), ('.SRCINFO',), ()), - 'SspLexer': ('pip._vendor.pygments.lexers.templates', 'Scalate Server Page', ('ssp',), ('*.ssp',), ('application/x-ssp',)), - 'StanLexer': ('pip._vendor.pygments.lexers.modeling', 'Stan', ('stan',), ('*.stan',), ()), - 'StataLexer': ('pip._vendor.pygments.lexers.stata', 'Stata', ('stata', 'do'), ('*.do', '*.ado'), ('text/x-stata', 'text/stata', 'application/x-stata')), - 'SuperColliderLexer': ('pip._vendor.pygments.lexers.supercollider', 'SuperCollider', ('supercollider', 'sc'), ('*.sc', '*.scd'), ('application/supercollider', 'text/supercollider')), - 'SwiftLexer': ('pip._vendor.pygments.lexers.objective', 'Swift', ('swift',), ('*.swift',), ('text/x-swift',)), - 'SwigLexer': ('pip._vendor.pygments.lexers.c_like', 'SWIG', ('swig',), ('*.swg', '*.i'), ('text/swig',)), - 'SystemVerilogLexer': ('pip._vendor.pygments.lexers.hdl', 'systemverilog', ('systemverilog', 'sv'), ('*.sv', '*.svh'), ('text/x-systemverilog',)), - 'TAPLexer': ('pip._vendor.pygments.lexers.testing', 'TAP', ('tap',), ('*.tap',), ()), - 'TNTLexer': ('pip._vendor.pygments.lexers.tnt', 'Typographic Number Theory', ('tnt',), ('*.tnt',), ()), - 'TOMLLexer': ('pip._vendor.pygments.lexers.configs', 'TOML', ('toml',), ('*.toml', 'Pipfile', 'poetry.lock'), ()), - 'Tads3Lexer': ('pip._vendor.pygments.lexers.int_fiction', 'TADS 3', ('tads3',), ('*.t',), ()), - 'TalLexer': ('pip._vendor.pygments.lexers.tal', 'Tal', ('tal', 'uxntal'), ('*.tal',), ('text/x-uxntal',)), - 'TasmLexer': ('pip._vendor.pygments.lexers.asm', 'TASM', ('tasm',), ('*.asm', '*.ASM', '*.tasm'), ('text/x-tasm',)), - 'TclLexer': ('pip._vendor.pygments.lexers.tcl', 'Tcl', ('tcl',), ('*.tcl', '*.rvt'), ('text/x-tcl', 'text/x-script.tcl', 'application/x-tcl')), - 'TcshLexer': ('pip._vendor.pygments.lexers.shell', 'Tcsh', ('tcsh', 'csh'), ('*.tcsh', '*.csh'), ('application/x-csh',)), - 'TcshSessionLexer': ('pip._vendor.pygments.lexers.shell', 'Tcsh Session', ('tcshcon',), (), ()), - 'TeaTemplateLexer': ('pip._vendor.pygments.lexers.templates', 'Tea', ('tea',), ('*.tea',), ('text/x-tea',)), - 'TealLexer': ('pip._vendor.pygments.lexers.teal', 'teal', ('teal',), ('*.teal',), ()), - 'TeraTermLexer': ('pip._vendor.pygments.lexers.teraterm', 'Tera Term macro', ('teratermmacro', 'teraterm', 'ttl'), ('*.ttl',), ('text/x-teratermmacro',)), - 'TermcapLexer': ('pip._vendor.pygments.lexers.configs', 'Termcap', ('termcap',), ('termcap', 'termcap.src'), ()), - 'TerminfoLexer': ('pip._vendor.pygments.lexers.configs', 'Terminfo', ('terminfo',), ('terminfo', 'terminfo.src'), ()), - 'TerraformLexer': ('pip._vendor.pygments.lexers.configs', 'Terraform', ('terraform', 'tf', 'hcl'), ('*.tf', '*.hcl'), ('application/x-tf', 'application/x-terraform')), - 'TexLexer': ('pip._vendor.pygments.lexers.markup', 'TeX', ('tex', 'latex'), ('*.tex', '*.aux', '*.toc'), ('text/x-tex', 'text/x-latex')), - 'TextLexer': ('pip._vendor.pygments.lexers.special', 'Text only', ('text',), ('*.txt',), ('text/plain',)), - 'ThingsDBLexer': ('pip._vendor.pygments.lexers.thingsdb', 'ThingsDB', ('ti', 'thingsdb'), ('*.ti',), ()), - 'ThriftLexer': ('pip._vendor.pygments.lexers.dsls', 'Thrift', ('thrift',), ('*.thrift',), ('application/x-thrift',)), - 'TiddlyWiki5Lexer': ('pip._vendor.pygments.lexers.markup', 'tiddler', ('tid',), ('*.tid',), ('text/vnd.tiddlywiki',)), - 'TlbLexer': ('pip._vendor.pygments.lexers.tlb', 'Tl-b', ('tlb',), ('*.tlb',), ()), - 'TodotxtLexer': ('pip._vendor.pygments.lexers.textfmts', 'Todotxt', ('todotxt',), ('todo.txt', '*.todotxt'), ('text/x-todo',)), - 'TransactSqlLexer': ('pip._vendor.pygments.lexers.sql', 'Transact-SQL', ('tsql', 't-sql'), ('*.sql',), ('text/x-tsql',)), - 'TreetopLexer': ('pip._vendor.pygments.lexers.parsers', 'Treetop', ('treetop',), ('*.treetop', '*.tt'), ()), - 'TurtleLexer': ('pip._vendor.pygments.lexers.rdf', 'Turtle', ('turtle',), ('*.ttl',), ('text/turtle', 'application/x-turtle')), - 'TwigHtmlLexer': ('pip._vendor.pygments.lexers.templates', 'HTML+Twig', ('html+twig',), ('*.twig',), ('text/html+twig',)), - 'TwigLexer': ('pip._vendor.pygments.lexers.templates', 'Twig', ('twig',), (), ('application/x-twig',)), - 'TypeScriptLexer': ('pip._vendor.pygments.lexers.javascript', 'TypeScript', ('typescript', 'ts'), ('*.ts',), ('application/x-typescript', 'text/x-typescript')), - 'TypoScriptCssDataLexer': ('pip._vendor.pygments.lexers.typoscript', 'TypoScriptCssData', ('typoscriptcssdata',), (), ()), - 'TypoScriptHtmlDataLexer': ('pip._vendor.pygments.lexers.typoscript', 'TypoScriptHtmlData', ('typoscripthtmldata',), (), ()), - 'TypoScriptLexer': ('pip._vendor.pygments.lexers.typoscript', 'TypoScript', ('typoscript',), ('*.typoscript',), ('text/x-typoscript',)), - 'UL4Lexer': ('pip._vendor.pygments.lexers.ul4', 'UL4', ('ul4',), ('*.ul4',), ()), - 'UcodeLexer': ('pip._vendor.pygments.lexers.unicon', 'ucode', ('ucode',), ('*.u', '*.u1', '*.u2'), ()), - 'UniconLexer': ('pip._vendor.pygments.lexers.unicon', 'Unicon', ('unicon',), ('*.icn',), ('text/unicon',)), - 'UnixConfigLexer': ('pip._vendor.pygments.lexers.configs', 'Unix/Linux config files', ('unixconfig', 'linuxconfig'), (), ()), - 'UrbiscriptLexer': ('pip._vendor.pygments.lexers.urbi', 'UrbiScript', ('urbiscript',), ('*.u',), ('application/x-urbiscript',)), - 'UsdLexer': ('pip._vendor.pygments.lexers.usd', 'USD', ('usd', 'usda'), ('*.usd', '*.usda'), ()), - 'VBScriptLexer': ('pip._vendor.pygments.lexers.basic', 'VBScript', ('vbscript',), ('*.vbs', '*.VBS'), ()), - 'VCLLexer': ('pip._vendor.pygments.lexers.varnish', 'VCL', ('vcl',), ('*.vcl',), ('text/x-vclsrc',)), - 'VCLSnippetLexer': ('pip._vendor.pygments.lexers.varnish', 'VCLSnippets', ('vclsnippets', 'vclsnippet'), (), ('text/x-vclsnippet',)), - 'VCTreeStatusLexer': ('pip._vendor.pygments.lexers.console', 'VCTreeStatus', ('vctreestatus',), (), ()), - 'VGLLexer': ('pip._vendor.pygments.lexers.dsls', 'VGL', ('vgl',), ('*.rpf',), ()), - 'ValaLexer': ('pip._vendor.pygments.lexers.c_like', 'Vala', ('vala', 'vapi'), ('*.vala', '*.vapi'), ('text/x-vala',)), - 'VbNetAspxLexer': ('pip._vendor.pygments.lexers.dotnet', 'aspx-vb', ('aspx-vb',), ('*.aspx', '*.asax', '*.ascx', '*.ashx', '*.asmx', '*.axd'), ()), - 'VbNetLexer': ('pip._vendor.pygments.lexers.dotnet', 'VB.net', ('vb.net', 'vbnet', 'lobas', 'oobas', 'sobas'), ('*.vb', '*.bas'), ('text/x-vbnet', 'text/x-vba')), - 'VelocityHtmlLexer': ('pip._vendor.pygments.lexers.templates', 'HTML+Velocity', ('html+velocity',), (), ('text/html+velocity',)), - 'VelocityLexer': ('pip._vendor.pygments.lexers.templates', 'Velocity', ('velocity',), ('*.vm', '*.fhtml'), ()), - 'VelocityXmlLexer': ('pip._vendor.pygments.lexers.templates', 'XML+Velocity', ('xml+velocity',), (), ('application/xml+velocity',)), - 'VerilogLexer': ('pip._vendor.pygments.lexers.hdl', 'verilog', ('verilog', 'v'), ('*.v',), ('text/x-verilog',)), - 'VhdlLexer': ('pip._vendor.pygments.lexers.hdl', 'vhdl', ('vhdl',), ('*.vhdl', '*.vhd'), ('text/x-vhdl',)), - 'VimLexer': ('pip._vendor.pygments.lexers.textedit', 'VimL', ('vim',), ('*.vim', '.vimrc', '.exrc', '.gvimrc', '_vimrc', '_exrc', '_gvimrc', 'vimrc', 'gvimrc'), ('text/x-vim',)), - 'WDiffLexer': ('pip._vendor.pygments.lexers.diff', 'WDiff', ('wdiff',), ('*.wdiff',), ()), - 'WatLexer': ('pip._vendor.pygments.lexers.webassembly', 'WebAssembly', ('wast', 'wat'), ('*.wat', '*.wast'), ()), - 'WebIDLLexer': ('pip._vendor.pygments.lexers.webidl', 'Web IDL', ('webidl',), ('*.webidl',), ()), - 'WgslLexer': ('pip._vendor.pygments.lexers.wgsl', 'WebGPU Shading Language', ('wgsl',), ('*.wgsl',), ('text/wgsl',)), - 'WhileyLexer': ('pip._vendor.pygments.lexers.whiley', 'Whiley', ('whiley',), ('*.whiley',), ('text/x-whiley',)), - 'WikitextLexer': ('pip._vendor.pygments.lexers.markup', 'Wikitext', ('wikitext', 'mediawiki'), (), ('text/x-wiki',)), - 'WoWTocLexer': ('pip._vendor.pygments.lexers.wowtoc', 'World of Warcraft TOC', ('wowtoc',), ('*.toc',), ()), - 'WrenLexer': ('pip._vendor.pygments.lexers.wren', 'Wren', ('wren',), ('*.wren',), ()), - 'X10Lexer': ('pip._vendor.pygments.lexers.x10', 'X10', ('x10', 'xten'), ('*.x10',), ('text/x-x10',)), - 'XMLUL4Lexer': ('pip._vendor.pygments.lexers.ul4', 'XML+UL4', ('xml+ul4',), ('*.xmlul4',), ()), - 'XQueryLexer': ('pip._vendor.pygments.lexers.webmisc', 'XQuery', ('xquery', 'xqy', 'xq', 'xql', 'xqm'), ('*.xqy', '*.xquery', '*.xq', '*.xql', '*.xqm'), ('text/xquery', 'application/xquery')), - 'XmlDjangoLexer': ('pip._vendor.pygments.lexers.templates', 'XML+Django/Jinja', ('xml+django', 'xml+jinja'), ('*.xml.j2', '*.xml.jinja2'), ('application/xml+django', 'application/xml+jinja')), - 'XmlErbLexer': ('pip._vendor.pygments.lexers.templates', 'XML+Ruby', ('xml+ruby', 'xml+erb'), (), ('application/xml+ruby',)), - 'XmlLexer': ('pip._vendor.pygments.lexers.html', 'XML', ('xml',), ('*.xml', '*.xsl', '*.rss', '*.xslt', '*.xsd', '*.wsdl', '*.wsf'), ('text/xml', 'application/xml', 'image/svg+xml', 'application/rss+xml', 'application/atom+xml')), - 'XmlPhpLexer': ('pip._vendor.pygments.lexers.templates', 'XML+PHP', ('xml+php',), (), ('application/xml+php',)), - 'XmlSmartyLexer': ('pip._vendor.pygments.lexers.templates', 'XML+Smarty', ('xml+smarty',), (), ('application/xml+smarty',)), - 'XorgLexer': ('pip._vendor.pygments.lexers.xorg', 'Xorg', ('xorg.conf',), ('xorg.conf',), ()), - 'XppLexer': ('pip._vendor.pygments.lexers.dotnet', 'X++', ('xpp', 'x++'), ('*.xpp',), ()), - 'XsltLexer': ('pip._vendor.pygments.lexers.html', 'XSLT', ('xslt',), ('*.xsl', '*.xslt', '*.xpl'), ('application/xsl+xml', 'application/xslt+xml')), - 'XtendLexer': ('pip._vendor.pygments.lexers.jvm', 'Xtend', ('xtend',), ('*.xtend',), ('text/x-xtend',)), - 'XtlangLexer': ('pip._vendor.pygments.lexers.lisp', 'xtlang', ('extempore',), ('*.xtm',), ()), - 'YamlJinjaLexer': ('pip._vendor.pygments.lexers.templates', 'YAML+Jinja', ('yaml+jinja', 'salt', 'sls'), ('*.sls', '*.yaml.j2', '*.yml.j2', '*.yaml.jinja2', '*.yml.jinja2'), ('text/x-yaml+jinja', 'text/x-sls')), - 'YamlLexer': ('pip._vendor.pygments.lexers.data', 'YAML', ('yaml',), ('*.yaml', '*.yml'), ('text/x-yaml',)), - 'YangLexer': ('pip._vendor.pygments.lexers.yang', 'YANG', ('yang',), ('*.yang',), ('application/yang',)), - 'ZeekLexer': ('pip._vendor.pygments.lexers.dsls', 'Zeek', ('zeek', 'bro'), ('*.zeek', '*.bro'), ()), - 'ZephirLexer': ('pip._vendor.pygments.lexers.php', 'Zephir', ('zephir',), ('*.zep',), ()), - 'ZigLexer': ('pip._vendor.pygments.lexers.zig', 'Zig', ('zig',), ('*.zig',), ('text/zig',)), - 'apdlexer': ('pip._vendor.pygments.lexers.apdlexer', 'ANSYS parametric design language', ('ansys', 'apdl'), ('*.ans',), ()), -} diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/python.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/python.py deleted file mode 100644 index e9bf2d3..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/python.py +++ /dev/null @@ -1,1198 +0,0 @@ -""" - pygments.lexers.python - ~~~~~~~~~~~~~~~~~~~~~~ - - Lexers for Python and related languages. - - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -import re -import keyword - -from pip._vendor.pygments.lexer import DelegatingLexer, Lexer, RegexLexer, include, \ - bygroups, using, default, words, combined, do_insertions, this, line_re -from pip._vendor.pygments.util import get_bool_opt, shebang_matches -from pip._vendor.pygments.token import Text, Comment, Operator, Keyword, Name, String, \ - Number, Punctuation, Generic, Other, Error, Whitespace -from pip._vendor.pygments import unistring as uni - -__all__ = ['PythonLexer', 'PythonConsoleLexer', 'PythonTracebackLexer', - 'Python2Lexer', 'Python2TracebackLexer', - 'CythonLexer', 'DgLexer', 'NumPyLexer'] - - -class PythonLexer(RegexLexer): - """ - For Python source code (version 3.x). - - .. versionadded:: 0.10 - - .. versionchanged:: 2.5 - This is now the default ``PythonLexer``. It is still available as the - alias ``Python3Lexer``. - """ - - name = 'Python' - url = 'http://www.python.org' - aliases = ['python', 'py', 'sage', 'python3', 'py3'] - filenames = [ - '*.py', - '*.pyw', - # Type stubs - '*.pyi', - # Jython - '*.jy', - # Sage - '*.sage', - # SCons - '*.sc', - 'SConstruct', - 'SConscript', - # Skylark/Starlark (used by Bazel, Buck, and Pants) - '*.bzl', - 'BUCK', - 'BUILD', - 'BUILD.bazel', - 'WORKSPACE', - # Twisted Application infrastructure - '*.tac', - ] - mimetypes = ['text/x-python', 'application/x-python', - 'text/x-python3', 'application/x-python3'] - - uni_name = "[%s][%s]*" % (uni.xid_start, uni.xid_continue) - - def innerstring_rules(ttype): - return [ - # the old style '%s' % (...) string formatting (still valid in Py3) - (r'%(\(\w+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?' - '[hlL]?[E-GXc-giorsaux%]', String.Interpol), - # the new style '{}'.format(...) string formatting - (r'\{' - r'((\w+)((\.\w+)|(\[[^\]]+\]))*)?' # field name - r'(\![sra])?' # conversion - r'(\:(.?[<>=\^])?[-+ ]?#?0?(\d+)?,?(\.\d+)?[E-GXb-gnosx%]?)?' - r'\}', String.Interpol), - - # backslashes, quotes and formatting signs must be parsed one at a time - (r'[^\\\'"%{\n]+', ttype), - (r'[\'"\\]', ttype), - # unhandled string formatting sign - (r'%|(\{{1,2})', ttype) - # newlines are an error (use "nl" state) - ] - - def fstring_rules(ttype): - return [ - # Assuming that a '}' is the closing brace after format specifier. - # Sadly, this means that we won't detect syntax error. But it's - # more important to parse correct syntax correctly, than to - # highlight invalid syntax. - (r'\}', String.Interpol), - (r'\{', String.Interpol, 'expr-inside-fstring'), - # backslashes, quotes and formatting signs must be parsed one at a time - (r'[^\\\'"{}\n]+', ttype), - (r'[\'"\\]', ttype), - # newlines are an error (use "nl" state) - ] - - tokens = { - 'root': [ - (r'\n', Whitespace), - (r'^(\s*)([rRuUbB]{,2})("""(?:.|\n)*?""")', - bygroups(Whitespace, String.Affix, String.Doc)), - (r"^(\s*)([rRuUbB]{,2})('''(?:.|\n)*?''')", - bygroups(Whitespace, String.Affix, String.Doc)), - (r'\A#!.+$', Comment.Hashbang), - (r'#.*$', Comment.Single), - (r'\\\n', Text), - (r'\\', Text), - include('keywords'), - include('soft-keywords'), - (r'(def)((?:\s|\\\s)+)', bygroups(Keyword, Text), 'funcname'), - (r'(class)((?:\s|\\\s)+)', bygroups(Keyword, Text), 'classname'), - (r'(from)((?:\s|\\\s)+)', bygroups(Keyword.Namespace, Text), - 'fromimport'), - (r'(import)((?:\s|\\\s)+)', bygroups(Keyword.Namespace, Text), - 'import'), - include('expr'), - ], - 'expr': [ - # raw f-strings - ('(?i)(rf|fr)(""")', - bygroups(String.Affix, String.Double), - combined('rfstringescape', 'tdqf')), - ("(?i)(rf|fr)(''')", - bygroups(String.Affix, String.Single), - combined('rfstringescape', 'tsqf')), - ('(?i)(rf|fr)(")', - bygroups(String.Affix, String.Double), - combined('rfstringescape', 'dqf')), - ("(?i)(rf|fr)(')", - bygroups(String.Affix, String.Single), - combined('rfstringescape', 'sqf')), - # non-raw f-strings - ('([fF])(""")', bygroups(String.Affix, String.Double), - combined('fstringescape', 'tdqf')), - ("([fF])(''')", bygroups(String.Affix, String.Single), - combined('fstringescape', 'tsqf')), - ('([fF])(")', bygroups(String.Affix, String.Double), - combined('fstringescape', 'dqf')), - ("([fF])(')", bygroups(String.Affix, String.Single), - combined('fstringescape', 'sqf')), - # raw bytes and strings - ('(?i)(rb|br|r)(""")', - bygroups(String.Affix, String.Double), 'tdqs'), - ("(?i)(rb|br|r)(''')", - bygroups(String.Affix, String.Single), 'tsqs'), - ('(?i)(rb|br|r)(")', - bygroups(String.Affix, String.Double), 'dqs'), - ("(?i)(rb|br|r)(')", - bygroups(String.Affix, String.Single), 'sqs'), - # non-raw strings - ('([uU]?)(""")', bygroups(String.Affix, String.Double), - combined('stringescape', 'tdqs')), - ("([uU]?)(''')", bygroups(String.Affix, String.Single), - combined('stringescape', 'tsqs')), - ('([uU]?)(")', bygroups(String.Affix, String.Double), - combined('stringescape', 'dqs')), - ("([uU]?)(')", bygroups(String.Affix, String.Single), - combined('stringescape', 'sqs')), - # non-raw bytes - ('([bB])(""")', bygroups(String.Affix, String.Double), - combined('bytesescape', 'tdqs')), - ("([bB])(''')", bygroups(String.Affix, String.Single), - combined('bytesescape', 'tsqs')), - ('([bB])(")', bygroups(String.Affix, String.Double), - combined('bytesescape', 'dqs')), - ("([bB])(')", bygroups(String.Affix, String.Single), - combined('bytesescape', 'sqs')), - - (r'[^\S\n]+', Text), - include('numbers'), - (r'!=|==|<<|>>|:=|[-~+/*%=<>&^|.]', Operator), - (r'[]{}:(),;[]', Punctuation), - (r'(in|is|and|or|not)\b', Operator.Word), - include('expr-keywords'), - include('builtins'), - include('magicfuncs'), - include('magicvars'), - include('name'), - ], - 'expr-inside-fstring': [ - (r'[{([]', Punctuation, 'expr-inside-fstring-inner'), - # without format specifier - (r'(=\s*)?' # debug (https://bugs.python.org/issue36817) - r'(\![sraf])?' # conversion - r'\}', String.Interpol, '#pop'), - # with format specifier - # we'll catch the remaining '}' in the outer scope - (r'(=\s*)?' # debug (https://bugs.python.org/issue36817) - r'(\![sraf])?' # conversion - r':', String.Interpol, '#pop'), - (r'\s+', Whitespace), # allow new lines - include('expr'), - ], - 'expr-inside-fstring-inner': [ - (r'[{([]', Punctuation, 'expr-inside-fstring-inner'), - (r'[])}]', Punctuation, '#pop'), - (r'\s+', Whitespace), # allow new lines - include('expr'), - ], - 'expr-keywords': [ - # Based on https://docs.python.org/3/reference/expressions.html - (words(( - 'async for', 'await', 'else', 'for', 'if', 'lambda', - 'yield', 'yield from'), suffix=r'\b'), - Keyword), - (words(('True', 'False', 'None'), suffix=r'\b'), Keyword.Constant), - ], - 'keywords': [ - (words(( - 'assert', 'async', 'await', 'break', 'continue', 'del', 'elif', - 'else', 'except', 'finally', 'for', 'global', 'if', 'lambda', - 'pass', 'raise', 'nonlocal', 'return', 'try', 'while', 'yield', - 'yield from', 'as', 'with'), suffix=r'\b'), - Keyword), - (words(('True', 'False', 'None'), suffix=r'\b'), Keyword.Constant), - ], - 'soft-keywords': [ - # `match`, `case` and `_` soft keywords - (r'(^[ \t]*)' # at beginning of line + possible indentation - r'(match|case)\b' # a possible keyword - r'(?![ \t]*(?:' # not followed by... - r'[:,;=^&|@~)\]}]|(?:' + # characters and keywords that mean this isn't - r'|'.join(keyword.kwlist) + r')\b))', # pattern matching - bygroups(Text, Keyword), 'soft-keywords-inner'), - ], - 'soft-keywords-inner': [ - # optional `_` keyword - (r'(\s+)([^\n_]*)(_\b)', bygroups(Whitespace, using(this), Keyword)), - default('#pop') - ], - 'builtins': [ - (words(( - '__import__', 'abs', 'aiter', 'all', 'any', 'bin', 'bool', 'bytearray', - 'breakpoint', 'bytes', 'callable', 'chr', 'classmethod', 'compile', - 'complex', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', - 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', - 'hasattr', 'hash', 'hex', 'id', 'input', 'int', 'isinstance', - 'issubclass', 'iter', 'len', 'list', 'locals', 'map', 'max', - 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', - 'print', 'property', 'range', 'repr', 'reversed', 'round', 'set', - 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', - 'tuple', 'type', 'vars', 'zip'), prefix=r'(?<!\.)', suffix=r'\b'), - Name.Builtin), - (r'(?<!\.)(self|Ellipsis|NotImplemented|cls)\b', Name.Builtin.Pseudo), - (words(( - 'ArithmeticError', 'AssertionError', 'AttributeError', - 'BaseException', 'BufferError', 'BytesWarning', 'DeprecationWarning', - 'EOFError', 'EnvironmentError', 'Exception', 'FloatingPointError', - 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', - 'ImportWarning', 'IndentationError', 'IndexError', 'KeyError', - 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', - 'NotImplementedError', 'OSError', 'OverflowError', - 'PendingDeprecationWarning', 'ReferenceError', 'ResourceWarning', - 'RuntimeError', 'RuntimeWarning', 'StopIteration', - 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', - 'TabError', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', - 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', - 'UnicodeWarning', 'UserWarning', 'ValueError', 'VMSError', - 'Warning', 'WindowsError', 'ZeroDivisionError', - # new builtin exceptions from PEP 3151 - 'BlockingIOError', 'ChildProcessError', 'ConnectionError', - 'BrokenPipeError', 'ConnectionAbortedError', 'ConnectionRefusedError', - 'ConnectionResetError', 'FileExistsError', 'FileNotFoundError', - 'InterruptedError', 'IsADirectoryError', 'NotADirectoryError', - 'PermissionError', 'ProcessLookupError', 'TimeoutError', - # others new in Python 3 - 'StopAsyncIteration', 'ModuleNotFoundError', 'RecursionError', - 'EncodingWarning'), - prefix=r'(?<!\.)', suffix=r'\b'), - Name.Exception), - ], - 'magicfuncs': [ - (words(( - '__abs__', '__add__', '__aenter__', '__aexit__', '__aiter__', - '__and__', '__anext__', '__await__', '__bool__', '__bytes__', - '__call__', '__complex__', '__contains__', '__del__', '__delattr__', - '__delete__', '__delitem__', '__dir__', '__divmod__', '__enter__', - '__eq__', '__exit__', '__float__', '__floordiv__', '__format__', - '__ge__', '__get__', '__getattr__', '__getattribute__', - '__getitem__', '__gt__', '__hash__', '__iadd__', '__iand__', - '__ifloordiv__', '__ilshift__', '__imatmul__', '__imod__', - '__imul__', '__index__', '__init__', '__instancecheck__', - '__int__', '__invert__', '__ior__', '__ipow__', '__irshift__', - '__isub__', '__iter__', '__itruediv__', '__ixor__', '__le__', - '__len__', '__length_hint__', '__lshift__', '__lt__', '__matmul__', - '__missing__', '__mod__', '__mul__', '__ne__', '__neg__', - '__new__', '__next__', '__or__', '__pos__', '__pow__', - '__prepare__', '__radd__', '__rand__', '__rdivmod__', '__repr__', - '__reversed__', '__rfloordiv__', '__rlshift__', '__rmatmul__', - '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', - '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', - '__rxor__', '__set__', '__setattr__', '__setitem__', '__str__', - '__sub__', '__subclasscheck__', '__truediv__', - '__xor__'), suffix=r'\b'), - Name.Function.Magic), - ], - 'magicvars': [ - (words(( - '__annotations__', '__bases__', '__class__', '__closure__', - '__code__', '__defaults__', '__dict__', '__doc__', '__file__', - '__func__', '__globals__', '__kwdefaults__', '__module__', - '__mro__', '__name__', '__objclass__', '__qualname__', - '__self__', '__slots__', '__weakref__'), suffix=r'\b'), - Name.Variable.Magic), - ], - 'numbers': [ - (r'(\d(?:_?\d)*\.(?:\d(?:_?\d)*)?|(?:\d(?:_?\d)*)?\.\d(?:_?\d)*)' - r'([eE][+-]?\d(?:_?\d)*)?', Number.Float), - (r'\d(?:_?\d)*[eE][+-]?\d(?:_?\d)*j?', Number.Float), - (r'0[oO](?:_?[0-7])+', Number.Oct), - (r'0[bB](?:_?[01])+', Number.Bin), - (r'0[xX](?:_?[a-fA-F0-9])+', Number.Hex), - (r'\d(?:_?\d)*', Number.Integer), - ], - 'name': [ - (r'@' + uni_name, Name.Decorator), - (r'@', Operator), # new matrix multiplication operator - (uni_name, Name), - ], - 'funcname': [ - include('magicfuncs'), - (uni_name, Name.Function, '#pop'), - default('#pop'), - ], - 'classname': [ - (uni_name, Name.Class, '#pop'), - ], - 'import': [ - (r'(\s+)(as)(\s+)', bygroups(Text, Keyword, Text)), - (r'\.', Name.Namespace), - (uni_name, Name.Namespace), - (r'(\s*)(,)(\s*)', bygroups(Text, Operator, Text)), - default('#pop') # all else: go back - ], - 'fromimport': [ - (r'(\s+)(import)\b', bygroups(Text, Keyword.Namespace), '#pop'), - (r'\.', Name.Namespace), - # if None occurs here, it's "raise x from None", since None can - # never be a module name - (r'None\b', Keyword.Constant, '#pop'), - (uni_name, Name.Namespace), - default('#pop'), - ], - 'rfstringescape': [ - (r'\{\{', String.Escape), - (r'\}\}', String.Escape), - ], - 'fstringescape': [ - include('rfstringescape'), - include('stringescape'), - ], - 'bytesescape': [ - (r'\\([\\abfnrtv"\']|\n|x[a-fA-F0-9]{2}|[0-7]{1,3})', String.Escape) - ], - 'stringescape': [ - (r'\\(N\{.*?\}|u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8})', String.Escape), - include('bytesescape') - ], - 'fstrings-single': fstring_rules(String.Single), - 'fstrings-double': fstring_rules(String.Double), - 'strings-single': innerstring_rules(String.Single), - 'strings-double': innerstring_rules(String.Double), - 'dqf': [ - (r'"', String.Double, '#pop'), - (r'\\\\|\\"|\\\n', String.Escape), # included here for raw strings - include('fstrings-double') - ], - 'sqf': [ - (r"'", String.Single, '#pop'), - (r"\\\\|\\'|\\\n", String.Escape), # included here for raw strings - include('fstrings-single') - ], - 'dqs': [ - (r'"', String.Double, '#pop'), - (r'\\\\|\\"|\\\n', String.Escape), # included here for raw strings - include('strings-double') - ], - 'sqs': [ - (r"'", String.Single, '#pop'), - (r"\\\\|\\'|\\\n", String.Escape), # included here for raw strings - include('strings-single') - ], - 'tdqf': [ - (r'"""', String.Double, '#pop'), - include('fstrings-double'), - (r'\n', String.Double) - ], - 'tsqf': [ - (r"'''", String.Single, '#pop'), - include('fstrings-single'), - (r'\n', String.Single) - ], - 'tdqs': [ - (r'"""', String.Double, '#pop'), - include('strings-double'), - (r'\n', String.Double) - ], - 'tsqs': [ - (r"'''", String.Single, '#pop'), - include('strings-single'), - (r'\n', String.Single) - ], - } - - def analyse_text(text): - return shebang_matches(text, r'pythonw?(3(\.\d)?)?') or \ - 'import ' in text[:1000] - - -Python3Lexer = PythonLexer - - -class Python2Lexer(RegexLexer): - """ - For Python 2.x source code. - - .. versionchanged:: 2.5 - This class has been renamed from ``PythonLexer``. ``PythonLexer`` now - refers to the Python 3 variant. File name patterns like ``*.py`` have - been moved to Python 3 as well. - """ - - name = 'Python 2.x' - url = 'http://www.python.org' - aliases = ['python2', 'py2'] - filenames = [] # now taken over by PythonLexer (3.x) - mimetypes = ['text/x-python2', 'application/x-python2'] - - def innerstring_rules(ttype): - return [ - # the old style '%s' % (...) string formatting - (r'%(\(\w+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?' - '[hlL]?[E-GXc-giorsux%]', String.Interpol), - # backslashes, quotes and formatting signs must be parsed one at a time - (r'[^\\\'"%\n]+', ttype), - (r'[\'"\\]', ttype), - # unhandled string formatting sign - (r'%', ttype), - # newlines are an error (use "nl" state) - ] - - tokens = { - 'root': [ - (r'\n', Whitespace), - (r'^(\s*)([rRuUbB]{,2})("""(?:.|\n)*?""")', - bygroups(Whitespace, String.Affix, String.Doc)), - (r"^(\s*)([rRuUbB]{,2})('''(?:.|\n)*?''')", - bygroups(Whitespace, String.Affix, String.Doc)), - (r'[^\S\n]+', Text), - (r'\A#!.+$', Comment.Hashbang), - (r'#.*$', Comment.Single), - (r'[]{}:(),;[]', Punctuation), - (r'\\\n', Text), - (r'\\', Text), - (r'(in|is|and|or|not)\b', Operator.Word), - (r'!=|==|<<|>>|[-~+/*%=<>&^|.]', Operator), - include('keywords'), - (r'(def)((?:\s|\\\s)+)', bygroups(Keyword, Text), 'funcname'), - (r'(class)((?:\s|\\\s)+)', bygroups(Keyword, Text), 'classname'), - (r'(from)((?:\s|\\\s)+)', bygroups(Keyword.Namespace, Text), - 'fromimport'), - (r'(import)((?:\s|\\\s)+)', bygroups(Keyword.Namespace, Text), - 'import'), - include('builtins'), - include('magicfuncs'), - include('magicvars'), - include('backtick'), - ('([rR]|[uUbB][rR]|[rR][uUbB])(""")', - bygroups(String.Affix, String.Double), 'tdqs'), - ("([rR]|[uUbB][rR]|[rR][uUbB])(''')", - bygroups(String.Affix, String.Single), 'tsqs'), - ('([rR]|[uUbB][rR]|[rR][uUbB])(")', - bygroups(String.Affix, String.Double), 'dqs'), - ("([rR]|[uUbB][rR]|[rR][uUbB])(')", - bygroups(String.Affix, String.Single), 'sqs'), - ('([uUbB]?)(""")', bygroups(String.Affix, String.Double), - combined('stringescape', 'tdqs')), - ("([uUbB]?)(''')", bygroups(String.Affix, String.Single), - combined('stringescape', 'tsqs')), - ('([uUbB]?)(")', bygroups(String.Affix, String.Double), - combined('stringescape', 'dqs')), - ("([uUbB]?)(')", bygroups(String.Affix, String.Single), - combined('stringescape', 'sqs')), - include('name'), - include('numbers'), - ], - 'keywords': [ - (words(( - 'assert', 'break', 'continue', 'del', 'elif', 'else', 'except', - 'exec', 'finally', 'for', 'global', 'if', 'lambda', 'pass', - 'print', 'raise', 'return', 'try', 'while', 'yield', - 'yield from', 'as', 'with'), suffix=r'\b'), - Keyword), - ], - 'builtins': [ - (words(( - '__import__', 'abs', 'all', 'any', 'apply', 'basestring', 'bin', - 'bool', 'buffer', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', - 'cmp', 'coerce', 'compile', 'complex', 'delattr', 'dict', 'dir', 'divmod', - 'enumerate', 'eval', 'execfile', 'exit', 'file', 'filter', 'float', - 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'hex', 'id', - 'input', 'int', 'intern', 'isinstance', 'issubclass', 'iter', 'len', - 'list', 'locals', 'long', 'map', 'max', 'min', 'next', 'object', - 'oct', 'open', 'ord', 'pow', 'property', 'range', 'raw_input', 'reduce', - 'reload', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', - 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', - 'unichr', 'unicode', 'vars', 'xrange', 'zip'), - prefix=r'(?<!\.)', suffix=r'\b'), - Name.Builtin), - (r'(?<!\.)(self|None|Ellipsis|NotImplemented|False|True|cls' - r')\b', Name.Builtin.Pseudo), - (words(( - 'ArithmeticError', 'AssertionError', 'AttributeError', - 'BaseException', 'DeprecationWarning', 'EOFError', 'EnvironmentError', - 'Exception', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', - 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', - 'IndexError', 'KeyError', 'KeyboardInterrupt', 'LookupError', - 'MemoryError', 'NameError', - 'NotImplementedError', 'OSError', 'OverflowError', 'OverflowWarning', - 'PendingDeprecationWarning', 'ReferenceError', - 'RuntimeError', 'RuntimeWarning', 'StandardError', 'StopIteration', - 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', - 'TabError', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', - 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', - 'UnicodeWarning', 'UserWarning', 'ValueError', 'VMSError', 'Warning', - 'WindowsError', 'ZeroDivisionError'), prefix=r'(?<!\.)', suffix=r'\b'), - Name.Exception), - ], - 'magicfuncs': [ - (words(( - '__abs__', '__add__', '__and__', '__call__', '__cmp__', '__coerce__', - '__complex__', '__contains__', '__del__', '__delattr__', '__delete__', - '__delitem__', '__delslice__', '__div__', '__divmod__', '__enter__', - '__eq__', '__exit__', '__float__', '__floordiv__', '__ge__', '__get__', - '__getattr__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', - '__hash__', '__hex__', '__iadd__', '__iand__', '__idiv__', '__ifloordiv__', - '__ilshift__', '__imod__', '__imul__', '__index__', '__init__', - '__instancecheck__', '__int__', '__invert__', '__iop__', '__ior__', - '__ipow__', '__irshift__', '__isub__', '__iter__', '__itruediv__', - '__ixor__', '__le__', '__len__', '__long__', '__lshift__', '__lt__', - '__missing__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', - '__nonzero__', '__oct__', '__op__', '__or__', '__pos__', '__pow__', - '__radd__', '__rand__', '__rcmp__', '__rdiv__', '__rdivmod__', '__repr__', - '__reversed__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', - '__rop__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', - '__rtruediv__', '__rxor__', '__set__', '__setattr__', '__setitem__', - '__setslice__', '__str__', '__sub__', '__subclasscheck__', '__truediv__', - '__unicode__', '__xor__'), suffix=r'\b'), - Name.Function.Magic), - ], - 'magicvars': [ - (words(( - '__bases__', '__class__', '__closure__', '__code__', '__defaults__', - '__dict__', '__doc__', '__file__', '__func__', '__globals__', - '__metaclass__', '__module__', '__mro__', '__name__', '__self__', - '__slots__', '__weakref__'), - suffix=r'\b'), - Name.Variable.Magic), - ], - 'numbers': [ - (r'(\d+\.\d*|\d*\.\d+)([eE][+-]?[0-9]+)?j?', Number.Float), - (r'\d+[eE][+-]?[0-9]+j?', Number.Float), - (r'0[0-7]+j?', Number.Oct), - (r'0[bB][01]+', Number.Bin), - (r'0[xX][a-fA-F0-9]+', Number.Hex), - (r'\d+L', Number.Integer.Long), - (r'\d+j?', Number.Integer) - ], - 'backtick': [ - ('`.*?`', String.Backtick), - ], - 'name': [ - (r'@[\w.]+', Name.Decorator), - (r'[a-zA-Z_]\w*', Name), - ], - 'funcname': [ - include('magicfuncs'), - (r'[a-zA-Z_]\w*', Name.Function, '#pop'), - default('#pop'), - ], - 'classname': [ - (r'[a-zA-Z_]\w*', Name.Class, '#pop') - ], - 'import': [ - (r'(?:[ \t]|\\\n)+', Text), - (r'as\b', Keyword.Namespace), - (r',', Operator), - (r'[a-zA-Z_][\w.]*', Name.Namespace), - default('#pop') # all else: go back - ], - 'fromimport': [ - (r'(?:[ \t]|\\\n)+', Text), - (r'import\b', Keyword.Namespace, '#pop'), - # if None occurs here, it's "raise x from None", since None can - # never be a module name - (r'None\b', Name.Builtin.Pseudo, '#pop'), - # sadly, in "raise x from y" y will be highlighted as namespace too - (r'[a-zA-Z_.][\w.]*', Name.Namespace), - # anything else here also means "raise x from y" and is therefore - # not an error - default('#pop'), - ], - 'stringescape': [ - (r'\\([\\abfnrtv"\']|\n|N\{.*?\}|u[a-fA-F0-9]{4}|' - r'U[a-fA-F0-9]{8}|x[a-fA-F0-9]{2}|[0-7]{1,3})', String.Escape) - ], - 'strings-single': innerstring_rules(String.Single), - 'strings-double': innerstring_rules(String.Double), - 'dqs': [ - (r'"', String.Double, '#pop'), - (r'\\\\|\\"|\\\n', String.Escape), # included here for raw strings - include('strings-double') - ], - 'sqs': [ - (r"'", String.Single, '#pop'), - (r"\\\\|\\'|\\\n", String.Escape), # included here for raw strings - include('strings-single') - ], - 'tdqs': [ - (r'"""', String.Double, '#pop'), - include('strings-double'), - (r'\n', String.Double) - ], - 'tsqs': [ - (r"'''", String.Single, '#pop'), - include('strings-single'), - (r'\n', String.Single) - ], - } - - def analyse_text(text): - return shebang_matches(text, r'pythonw?2(\.\d)?') - -class _PythonConsoleLexerBase(RegexLexer): - name = 'Python console session' - aliases = ['pycon'] - mimetypes = ['text/x-python-doctest'] - - """Auxiliary lexer for `PythonConsoleLexer`. - - Code tokens are output as ``Token.Other.Code``, traceback tokens as - ``Token.Other.Traceback``. - """ - tokens = { - 'root': [ - (r'(>>> )(.*\n)', bygroups(Generic.Prompt, Other.Code), 'continuations'), - # This happens, e.g., when tracebacks are embedded in documentation; - # trailing whitespaces are often stripped in such contexts. - (r'(>>>)(\n)', bygroups(Generic.Prompt, Whitespace)), - (r'(\^C)?Traceback \(most recent call last\):\n', Other.Traceback, 'traceback'), - # SyntaxError starts with this - (r' File "[^"]+", line \d+', Other.Traceback, 'traceback'), - (r'.*\n', Generic.Output), - ], - 'continuations': [ - (r'(\.\.\. )(.*\n)', bygroups(Generic.Prompt, Other.Code)), - # See above. - (r'(\.\.\.)(\n)', bygroups(Generic.Prompt, Whitespace)), - default('#pop'), - ], - 'traceback': [ - # As soon as we see a traceback, consume everything until the next - # >>> prompt. - (r'(?=>>>( |$))', Text, '#pop'), - (r'(KeyboardInterrupt)(\n)', bygroups(Name.Class, Whitespace)), - (r'.*\n', Other.Traceback), - ], - } - -class PythonConsoleLexer(DelegatingLexer): - """ - For Python console output or doctests, such as: - - .. sourcecode:: pycon - - >>> a = 'foo' - >>> print(a) - foo - >>> 1 / 0 - Traceback (most recent call last): - File "<stdin>", line 1, in <module> - ZeroDivisionError: integer division or modulo by zero - - Additional options: - - `python3` - Use Python 3 lexer for code. Default is ``True``. - - .. versionadded:: 1.0 - .. versionchanged:: 2.5 - Now defaults to ``True``. - """ - - name = 'Python console session' - aliases = ['pycon'] - mimetypes = ['text/x-python-doctest'] - - def __init__(self, **options): - python3 = get_bool_opt(options, 'python3', True) - if python3: - pylexer = PythonLexer - tblexer = PythonTracebackLexer - else: - pylexer = Python2Lexer - tblexer = Python2TracebackLexer - # We have two auxiliary lexers. Use DelegatingLexer twice with - # different tokens. TODO: DelegatingLexer should support this - # directly, by accepting a tuplet of auxiliary lexers and a tuple of - # distinguishing tokens. Then we wouldn't need this intermediary - # class. - class _ReplaceInnerCode(DelegatingLexer): - def __init__(self, **options): - super().__init__(pylexer, _PythonConsoleLexerBase, Other.Code, **options) - super().__init__(tblexer, _ReplaceInnerCode, Other.Traceback, **options) - -class PythonTracebackLexer(RegexLexer): - """ - For Python 3.x tracebacks, with support for chained exceptions. - - .. versionadded:: 1.0 - - .. versionchanged:: 2.5 - This is now the default ``PythonTracebackLexer``. It is still available - as the alias ``Python3TracebackLexer``. - """ - - name = 'Python Traceback' - aliases = ['pytb', 'py3tb'] - filenames = ['*.pytb', '*.py3tb'] - mimetypes = ['text/x-python-traceback', 'text/x-python3-traceback'] - - tokens = { - 'root': [ - (r'\n', Whitespace), - (r'^(\^C)?Traceback \(most recent call last\):\n', Generic.Traceback, 'intb'), - (r'^During handling of the above exception, another ' - r'exception occurred:\n\n', Generic.Traceback), - (r'^The above exception was the direct cause of the ' - r'following exception:\n\n', Generic.Traceback), - (r'^(?= File "[^"]+", line \d+)', Generic.Traceback, 'intb'), - (r'^.*\n', Other), - ], - 'intb': [ - (r'^( File )("[^"]+")(, line )(\d+)(, in )(.+)(\n)', - bygroups(Text, Name.Builtin, Text, Number, Text, Name, Whitespace)), - (r'^( File )("[^"]+")(, line )(\d+)(\n)', - bygroups(Text, Name.Builtin, Text, Number, Whitespace)), - (r'^( )(.+)(\n)', - bygroups(Whitespace, using(PythonLexer), Whitespace), 'markers'), - (r'^([ \t]*)(\.\.\.)(\n)', - bygroups(Whitespace, Comment, Whitespace)), # for doctests... - (r'^([^:]+)(: )(.+)(\n)', - bygroups(Generic.Error, Text, Name, Whitespace), '#pop'), - (r'^([a-zA-Z_][\w.]*)(:?\n)', - bygroups(Generic.Error, Whitespace), '#pop'), - default('#pop'), - ], - 'markers': [ - # Either `PEP 657 <https://www.python.org/dev/peps/pep-0657/>` - # error locations in Python 3.11+, or single-caret markers - # for syntax errors before that. - (r'^( {4,})([~^]+)(\n)', - bygroups(Whitespace, Punctuation.Marker, Whitespace), - '#pop'), - default('#pop'), - ], - } - - -Python3TracebackLexer = PythonTracebackLexer - - -class Python2TracebackLexer(RegexLexer): - """ - For Python tracebacks. - - .. versionadded:: 0.7 - - .. versionchanged:: 2.5 - This class has been renamed from ``PythonTracebackLexer``. - ``PythonTracebackLexer`` now refers to the Python 3 variant. - """ - - name = 'Python 2.x Traceback' - aliases = ['py2tb'] - filenames = ['*.py2tb'] - mimetypes = ['text/x-python2-traceback'] - - tokens = { - 'root': [ - # Cover both (most recent call last) and (innermost last) - # The optional ^C allows us to catch keyboard interrupt signals. - (r'^(\^C)?(Traceback.*\n)', - bygroups(Text, Generic.Traceback), 'intb'), - # SyntaxError starts with this. - (r'^(?= File "[^"]+", line \d+)', Generic.Traceback, 'intb'), - (r'^.*\n', Other), - ], - 'intb': [ - (r'^( File )("[^"]+")(, line )(\d+)(, in )(.+)(\n)', - bygroups(Text, Name.Builtin, Text, Number, Text, Name, Whitespace)), - (r'^( File )("[^"]+")(, line )(\d+)(\n)', - bygroups(Text, Name.Builtin, Text, Number, Whitespace)), - (r'^( )(.+)(\n)', - bygroups(Text, using(Python2Lexer), Whitespace), 'marker'), - (r'^([ \t]*)(\.\.\.)(\n)', - bygroups(Text, Comment, Whitespace)), # for doctests... - (r'^([^:]+)(: )(.+)(\n)', - bygroups(Generic.Error, Text, Name, Whitespace), '#pop'), - (r'^([a-zA-Z_]\w*)(:?\n)', - bygroups(Generic.Error, Whitespace), '#pop') - ], - 'marker': [ - # For syntax errors. - (r'( {4,})(\^)', bygroups(Text, Punctuation.Marker), '#pop'), - default('#pop'), - ], - } - - -class CythonLexer(RegexLexer): - """ - For Pyrex and Cython source code. - - .. versionadded:: 1.1 - """ - - name = 'Cython' - url = 'http://cython.org' - aliases = ['cython', 'pyx', 'pyrex'] - filenames = ['*.pyx', '*.pxd', '*.pxi'] - mimetypes = ['text/x-cython', 'application/x-cython'] - - tokens = { - 'root': [ - (r'\n', Whitespace), - (r'^(\s*)("""(?:.|\n)*?""")', bygroups(Whitespace, String.Doc)), - (r"^(\s*)('''(?:.|\n)*?''')", bygroups(Whitespace, String.Doc)), - (r'[^\S\n]+', Text), - (r'#.*$', Comment), - (r'[]{}:(),;[]', Punctuation), - (r'\\\n', Whitespace), - (r'\\', Text), - (r'(in|is|and|or|not)\b', Operator.Word), - (r'(<)([a-zA-Z0-9.?]+)(>)', - bygroups(Punctuation, Keyword.Type, Punctuation)), - (r'!=|==|<<|>>|[-~+/*%=<>&^|.?]', Operator), - (r'(from)(\d+)(<=)(\s+)(<)(\d+)(:)', - bygroups(Keyword, Number.Integer, Operator, Name, Operator, - Name, Punctuation)), - include('keywords'), - (r'(def|property)(\s+)', bygroups(Keyword, Text), 'funcname'), - (r'(cp?def)(\s+)', bygroups(Keyword, Text), 'cdef'), - # (should actually start a block with only cdefs) - (r'(cdef)(:)', bygroups(Keyword, Punctuation)), - (r'(class|struct)(\s+)', bygroups(Keyword, Text), 'classname'), - (r'(from)(\s+)', bygroups(Keyword, Text), 'fromimport'), - (r'(c?import)(\s+)', bygroups(Keyword, Text), 'import'), - include('builtins'), - include('backtick'), - ('(?:[rR]|[uU][rR]|[rR][uU])"""', String, 'tdqs'), - ("(?:[rR]|[uU][rR]|[rR][uU])'''", String, 'tsqs'), - ('(?:[rR]|[uU][rR]|[rR][uU])"', String, 'dqs'), - ("(?:[rR]|[uU][rR]|[rR][uU])'", String, 'sqs'), - ('[uU]?"""', String, combined('stringescape', 'tdqs')), - ("[uU]?'''", String, combined('stringescape', 'tsqs')), - ('[uU]?"', String, combined('stringescape', 'dqs')), - ("[uU]?'", String, combined('stringescape', 'sqs')), - include('name'), - include('numbers'), - ], - 'keywords': [ - (words(( - 'assert', 'async', 'await', 'break', 'by', 'continue', 'ctypedef', 'del', 'elif', - 'else', 'except', 'except?', 'exec', 'finally', 'for', 'fused', 'gil', - 'global', 'if', 'include', 'lambda', 'nogil', 'pass', 'print', - 'raise', 'return', 'try', 'while', 'yield', 'as', 'with'), suffix=r'\b'), - Keyword), - (r'(DEF|IF|ELIF|ELSE)\b', Comment.Preproc), - ], - 'builtins': [ - (words(( - '__import__', 'abs', 'all', 'any', 'apply', 'basestring', 'bin', 'bint', - 'bool', 'buffer', 'bytearray', 'bytes', 'callable', 'chr', - 'classmethod', 'cmp', 'coerce', 'compile', 'complex', 'delattr', - 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'execfile', 'exit', - 'file', 'filter', 'float', 'frozenset', 'getattr', 'globals', - 'hasattr', 'hash', 'hex', 'id', 'input', 'int', 'intern', 'isinstance', - 'issubclass', 'iter', 'len', 'list', 'locals', 'long', 'map', 'max', - 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'property', 'Py_ssize_t', - 'range', 'raw_input', 'reduce', 'reload', 'repr', 'reversed', - 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', - 'str', 'sum', 'super', 'tuple', 'type', 'unichr', 'unicode', 'unsigned', - 'vars', 'xrange', 'zip'), prefix=r'(?<!\.)', suffix=r'\b'), - Name.Builtin), - (r'(?<!\.)(self|None|Ellipsis|NotImplemented|False|True|NULL' - r')\b', Name.Builtin.Pseudo), - (words(( - 'ArithmeticError', 'AssertionError', 'AttributeError', - 'BaseException', 'DeprecationWarning', 'EOFError', 'EnvironmentError', - 'Exception', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', - 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', - 'IndexError', 'KeyError', 'KeyboardInterrupt', 'LookupError', - 'MemoryError', 'NameError', 'NotImplemented', 'NotImplementedError', - 'OSError', 'OverflowError', 'OverflowWarning', - 'PendingDeprecationWarning', 'ReferenceError', 'RuntimeError', - 'RuntimeWarning', 'StandardError', 'StopIteration', 'SyntaxError', - 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', - 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', - 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', - 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', - 'ZeroDivisionError'), prefix=r'(?<!\.)', suffix=r'\b'), - Name.Exception), - ], - 'numbers': [ - (r'(\d+\.?\d*|\d*\.\d+)([eE][+-]?[0-9]+)?', Number.Float), - (r'0\d+', Number.Oct), - (r'0[xX][a-fA-F0-9]+', Number.Hex), - (r'\d+L', Number.Integer.Long), - (r'\d+', Number.Integer) - ], - 'backtick': [ - ('`.*?`', String.Backtick), - ], - 'name': [ - (r'@\w+', Name.Decorator), - (r'[a-zA-Z_]\w*', Name), - ], - 'funcname': [ - (r'[a-zA-Z_]\w*', Name.Function, '#pop') - ], - 'cdef': [ - (r'(public|readonly|extern|api|inline)\b', Keyword.Reserved), - (r'(struct|enum|union|class)\b', Keyword), - (r'([a-zA-Z_]\w*)(\s*)(?=[(:#=]|$)', - bygroups(Name.Function, Text), '#pop'), - (r'([a-zA-Z_]\w*)(\s*)(,)', - bygroups(Name.Function, Text, Punctuation)), - (r'from\b', Keyword, '#pop'), - (r'as\b', Keyword), - (r':', Punctuation, '#pop'), - (r'(?=["\'])', Text, '#pop'), - (r'[a-zA-Z_]\w*', Keyword.Type), - (r'.', Text), - ], - 'classname': [ - (r'[a-zA-Z_]\w*', Name.Class, '#pop') - ], - 'import': [ - (r'(\s+)(as)(\s+)', bygroups(Text, Keyword, Text)), - (r'[a-zA-Z_][\w.]*', Name.Namespace), - (r'(\s*)(,)(\s*)', bygroups(Text, Operator, Text)), - default('#pop') # all else: go back - ], - 'fromimport': [ - (r'(\s+)(c?import)\b', bygroups(Text, Keyword), '#pop'), - (r'[a-zA-Z_.][\w.]*', Name.Namespace), - # ``cdef foo from "header"``, or ``for foo from 0 < i < 10`` - default('#pop'), - ], - 'stringescape': [ - (r'\\([\\abfnrtv"\']|\n|N\{.*?\}|u[a-fA-F0-9]{4}|' - r'U[a-fA-F0-9]{8}|x[a-fA-F0-9]{2}|[0-7]{1,3})', String.Escape) - ], - 'strings': [ - (r'%(\([a-zA-Z0-9]+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?' - '[hlL]?[E-GXc-giorsux%]', String.Interpol), - (r'[^\\\'"%\n]+', String), - # quotes, percents and backslashes must be parsed one at a time - (r'[\'"\\]', String), - # unhandled string formatting sign - (r'%', String) - # newlines are an error (use "nl" state) - ], - 'nl': [ - (r'\n', String) - ], - 'dqs': [ - (r'"', String, '#pop'), - (r'\\\\|\\"|\\\n', String.Escape), # included here again for raw strings - include('strings') - ], - 'sqs': [ - (r"'", String, '#pop'), - (r"\\\\|\\'|\\\n", String.Escape), # included here again for raw strings - include('strings') - ], - 'tdqs': [ - (r'"""', String, '#pop'), - include('strings'), - include('nl') - ], - 'tsqs': [ - (r"'''", String, '#pop'), - include('strings'), - include('nl') - ], - } - - -class DgLexer(RegexLexer): - """ - Lexer for dg, - a functional and object-oriented programming language - running on the CPython 3 VM. - - .. versionadded:: 1.6 - """ - name = 'dg' - aliases = ['dg'] - filenames = ['*.dg'] - mimetypes = ['text/x-dg'] - - tokens = { - 'root': [ - (r'\s+', Text), - (r'#.*?$', Comment.Single), - - (r'(?i)0b[01]+', Number.Bin), - (r'(?i)0o[0-7]+', Number.Oct), - (r'(?i)0x[0-9a-f]+', Number.Hex), - (r'(?i)[+-]?[0-9]+\.[0-9]+(e[+-]?[0-9]+)?j?', Number.Float), - (r'(?i)[+-]?[0-9]+e[+-]?\d+j?', Number.Float), - (r'(?i)[+-]?[0-9]+j?', Number.Integer), - - (r"(?i)(br|r?b?)'''", String, combined('stringescape', 'tsqs', 'string')), - (r'(?i)(br|r?b?)"""', String, combined('stringescape', 'tdqs', 'string')), - (r"(?i)(br|r?b?)'", String, combined('stringescape', 'sqs', 'string')), - (r'(?i)(br|r?b?)"', String, combined('stringescape', 'dqs', 'string')), - - (r"`\w+'*`", Operator), - (r'\b(and|in|is|or|where)\b', Operator.Word), - (r'[!$%&*+\-./:<-@\\^|~;,]+', Operator), - - (words(( - 'bool', 'bytearray', 'bytes', 'classmethod', 'complex', 'dict', 'dict\'', - 'float', 'frozenset', 'int', 'list', 'list\'', 'memoryview', 'object', - 'property', 'range', 'set', 'set\'', 'slice', 'staticmethod', 'str', - 'super', 'tuple', 'tuple\'', 'type'), - prefix=r'(?<!\.)', suffix=r'(?![\'\w])'), - Name.Builtin), - (words(( - '__import__', 'abs', 'all', 'any', 'bin', 'bind', 'chr', 'cmp', 'compile', - 'complex', 'delattr', 'dir', 'divmod', 'drop', 'dropwhile', 'enumerate', - 'eval', 'exhaust', 'filter', 'flip', 'foldl1?', 'format', 'fst', - 'getattr', 'globals', 'hasattr', 'hash', 'head', 'hex', 'id', 'init', - 'input', 'isinstance', 'issubclass', 'iter', 'iterate', 'last', 'len', - 'locals', 'map', 'max', 'min', 'next', 'oct', 'open', 'ord', 'pow', - 'print', 'repr', 'reversed', 'round', 'setattr', 'scanl1?', 'snd', - 'sorted', 'sum', 'tail', 'take', 'takewhile', 'vars', 'zip'), - prefix=r'(?<!\.)', suffix=r'(?![\'\w])'), - Name.Builtin), - (r"(?<!\.)(self|Ellipsis|NotImplemented|None|True|False)(?!['\w])", - Name.Builtin.Pseudo), - - (r"(?<!\.)[A-Z]\w*(Error|Exception|Warning)'*(?!['\w])", - Name.Exception), - (r"(?<!\.)(Exception|GeneratorExit|KeyboardInterrupt|StopIteration|" - r"SystemExit)(?!['\w])", Name.Exception), - - (r"(?<![\w.])(except|finally|for|if|import|not|otherwise|raise|" - r"subclass|while|with|yield)(?!['\w])", Keyword.Reserved), - - (r"[A-Z_]+'*(?!['\w])", Name), - (r"[A-Z]\w+'*(?!['\w])", Keyword.Type), - (r"\w+'*", Name), - - (r'[()]', Punctuation), - (r'.', Error), - ], - 'stringescape': [ - (r'\\([\\abfnrtv"\']|\n|N\{.*?\}|u[a-fA-F0-9]{4}|' - r'U[a-fA-F0-9]{8}|x[a-fA-F0-9]{2}|[0-7]{1,3})', String.Escape) - ], - 'string': [ - (r'%(\(\w+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?' - '[hlL]?[E-GXc-giorsux%]', String.Interpol), - (r'[^\\\'"%\n]+', String), - # quotes, percents and backslashes must be parsed one at a time - (r'[\'"\\]', String), - # unhandled string formatting sign - (r'%', String), - (r'\n', String) - ], - 'dqs': [ - (r'"', String, '#pop') - ], - 'sqs': [ - (r"'", String, '#pop') - ], - 'tdqs': [ - (r'"""', String, '#pop') - ], - 'tsqs': [ - (r"'''", String, '#pop') - ], - } - - -class NumPyLexer(PythonLexer): - """ - A Python lexer recognizing Numerical Python builtins. - - .. versionadded:: 0.10 - """ - - name = 'NumPy' - url = 'https://numpy.org/' - aliases = ['numpy'] - - # override the mimetypes to not inherit them from python - mimetypes = [] - filenames = [] - - EXTRA_KEYWORDS = { - 'abs', 'absolute', 'accumulate', 'add', 'alen', 'all', 'allclose', - 'alltrue', 'alterdot', 'amax', 'amin', 'angle', 'any', 'append', - 'apply_along_axis', 'apply_over_axes', 'arange', 'arccos', 'arccosh', - 'arcsin', 'arcsinh', 'arctan', 'arctan2', 'arctanh', 'argmax', 'argmin', - 'argsort', 'argwhere', 'around', 'array', 'array2string', 'array_equal', - 'array_equiv', 'array_repr', 'array_split', 'array_str', 'arrayrange', - 'asanyarray', 'asarray', 'asarray_chkfinite', 'ascontiguousarray', - 'asfarray', 'asfortranarray', 'asmatrix', 'asscalar', 'astype', - 'atleast_1d', 'atleast_2d', 'atleast_3d', 'average', 'bartlett', - 'base_repr', 'beta', 'binary_repr', 'bincount', 'binomial', - 'bitwise_and', 'bitwise_not', 'bitwise_or', 'bitwise_xor', 'blackman', - 'bmat', 'broadcast', 'byte_bounds', 'bytes', 'byteswap', 'c_', - 'can_cast', 'ceil', 'choose', 'clip', 'column_stack', 'common_type', - 'compare_chararrays', 'compress', 'concatenate', 'conj', 'conjugate', - 'convolve', 'copy', 'corrcoef', 'correlate', 'cos', 'cosh', 'cov', - 'cross', 'cumprod', 'cumproduct', 'cumsum', 'delete', 'deprecate', - 'diag', 'diagflat', 'diagonal', 'diff', 'digitize', 'disp', 'divide', - 'dot', 'dsplit', 'dstack', 'dtype', 'dump', 'dumps', 'ediff1d', 'empty', - 'empty_like', 'equal', 'exp', 'expand_dims', 'expm1', 'extract', 'eye', - 'fabs', 'fastCopyAndTranspose', 'fft', 'fftfreq', 'fftshift', 'fill', - 'finfo', 'fix', 'flat', 'flatnonzero', 'flatten', 'fliplr', 'flipud', - 'floor', 'floor_divide', 'fmod', 'frexp', 'fromarrays', 'frombuffer', - 'fromfile', 'fromfunction', 'fromiter', 'frompyfunc', 'fromstring', - 'generic', 'get_array_wrap', 'get_include', 'get_numarray_include', - 'get_numpy_include', 'get_printoptions', 'getbuffer', 'getbufsize', - 'geterr', 'geterrcall', 'geterrobj', 'getfield', 'gradient', 'greater', - 'greater_equal', 'gumbel', 'hamming', 'hanning', 'histogram', - 'histogram2d', 'histogramdd', 'hsplit', 'hstack', 'hypot', 'i0', - 'identity', 'ifft', 'imag', 'index_exp', 'indices', 'inf', 'info', - 'inner', 'insert', 'int_asbuffer', 'interp', 'intersect1d', - 'intersect1d_nu', 'inv', 'invert', 'iscomplex', 'iscomplexobj', - 'isfinite', 'isfortran', 'isinf', 'isnan', 'isneginf', 'isposinf', - 'isreal', 'isrealobj', 'isscalar', 'issctype', 'issubclass_', - 'issubdtype', 'issubsctype', 'item', 'itemset', 'iterable', 'ix_', - 'kaiser', 'kron', 'ldexp', 'left_shift', 'less', 'less_equal', 'lexsort', - 'linspace', 'load', 'loads', 'loadtxt', 'log', 'log10', 'log1p', 'log2', - 'logical_and', 'logical_not', 'logical_or', 'logical_xor', 'logspace', - 'lstsq', 'mat', 'matrix', 'max', 'maximum', 'maximum_sctype', - 'may_share_memory', 'mean', 'median', 'meshgrid', 'mgrid', 'min', - 'minimum', 'mintypecode', 'mod', 'modf', 'msort', 'multiply', 'nan', - 'nan_to_num', 'nanargmax', 'nanargmin', 'nanmax', 'nanmin', 'nansum', - 'ndenumerate', 'ndim', 'ndindex', 'negative', 'newaxis', 'newbuffer', - 'newbyteorder', 'nonzero', 'not_equal', 'obj2sctype', 'ogrid', 'ones', - 'ones_like', 'outer', 'permutation', 'piecewise', 'pinv', 'pkgload', - 'place', 'poisson', 'poly', 'poly1d', 'polyadd', 'polyder', 'polydiv', - 'polyfit', 'polyint', 'polymul', 'polysub', 'polyval', 'power', 'prod', - 'product', 'ptp', 'put', 'putmask', 'r_', 'randint', 'random_integers', - 'random_sample', 'ranf', 'rank', 'ravel', 'real', 'real_if_close', - 'recarray', 'reciprocal', 'reduce', 'remainder', 'repeat', 'require', - 'reshape', 'resize', 'restoredot', 'right_shift', 'rint', 'roll', - 'rollaxis', 'roots', 'rot90', 'round', 'round_', 'row_stack', 's_', - 'sample', 'savetxt', 'sctype2char', 'searchsorted', 'seed', 'select', - 'set_numeric_ops', 'set_printoptions', 'set_string_function', - 'setbufsize', 'setdiff1d', 'seterr', 'seterrcall', 'seterrobj', - 'setfield', 'setflags', 'setmember1d', 'setxor1d', 'shape', - 'show_config', 'shuffle', 'sign', 'signbit', 'sin', 'sinc', 'sinh', - 'size', 'slice', 'solve', 'sometrue', 'sort', 'sort_complex', 'source', - 'split', 'sqrt', 'square', 'squeeze', 'standard_normal', 'std', - 'subtract', 'sum', 'svd', 'swapaxes', 'take', 'tan', 'tanh', 'tensordot', - 'test', 'tile', 'tofile', 'tolist', 'tostring', 'trace', 'transpose', - 'trapz', 'tri', 'tril', 'trim_zeros', 'triu', 'true_divide', 'typeDict', - 'typename', 'uniform', 'union1d', 'unique', 'unique1d', 'unravel_index', - 'unwrap', 'vander', 'var', 'vdot', 'vectorize', 'view', 'vonmises', - 'vsplit', 'vstack', 'weibull', 'where', 'who', 'zeros', 'zeros_like' - } - - def get_tokens_unprocessed(self, text): - for index, token, value in \ - PythonLexer.get_tokens_unprocessed(self, text): - if token is Name and value in self.EXTRA_KEYWORDS: - yield index, Keyword.Pseudo, value - else: - yield index, token, value - - def analyse_text(text): - ltext = text[:1000] - return (shebang_matches(text, r'pythonw?(3(\.\d)?)?') or - 'import ' in ltext) \ - and ('import numpy' in ltext or 'from numpy import' in ltext) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/modeline.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/modeline.py deleted file mode 100644 index 7b6f6a3..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/modeline.py +++ /dev/null @@ -1,43 +0,0 @@ -""" - pygments.modeline - ~~~~~~~~~~~~~~~~~ - - A simple modeline parser (based on pymodeline). - - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -import re - -__all__ = ['get_filetype_from_buffer'] - - -modeline_re = re.compile(r''' - (?: vi | vim | ex ) (?: [<=>]? \d* )? : - .* (?: ft | filetype | syn | syntax ) = ( [^:\s]+ ) -''', re.VERBOSE) - - -def get_filetype_from_line(l): - m = modeline_re.search(l) - if m: - return m.group(1) - - -def get_filetype_from_buffer(buf, max_lines=5): - """ - Scan the buffer for modelines and return filetype if one is found. - """ - lines = buf.splitlines() - for l in lines[-1:-max_lines-1:-1]: - ret = get_filetype_from_line(l) - if ret: - return ret - for i in range(max_lines, -1, -1): - if i < len(lines): - ret = get_filetype_from_line(lines[i]) - if ret: - return ret - - return None diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/plugin.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/plugin.py deleted file mode 100644 index 7b722d5..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/plugin.py +++ /dev/null @@ -1,88 +0,0 @@ -""" - pygments.plugin - ~~~~~~~~~~~~~~~ - - Pygments plugin interface. By default, this tries to use - ``importlib.metadata``, which is in the Python standard - library since Python 3.8, or its ``importlib_metadata`` - backport for earlier versions of Python. It falls back on - ``pkg_resources`` if not found. Finally, if ``pkg_resources`` - is not found either, no plugins are loaded at all. - - lexer plugins:: - - [pygments.lexers] - yourlexer = yourmodule:YourLexer - - formatter plugins:: - - [pygments.formatters] - yourformatter = yourformatter:YourFormatter - /.ext = yourformatter:YourFormatter - - As you can see, you can define extensions for the formatter - with a leading slash. - - syntax plugins:: - - [pygments.styles] - yourstyle = yourstyle:YourStyle - - filter plugin:: - - [pygments.filter] - yourfilter = yourfilter:YourFilter - - - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -LEXER_ENTRY_POINT = 'pygments.lexers' -FORMATTER_ENTRY_POINT = 'pygments.formatters' -STYLE_ENTRY_POINT = 'pygments.styles' -FILTER_ENTRY_POINT = 'pygments.filters' - - -def iter_entry_points(group_name): - try: - from importlib.metadata import entry_points - except ImportError: - try: - from importlib_metadata import entry_points - except ImportError: - try: - from pip._vendor.pkg_resources import iter_entry_points - except (ImportError, OSError): - return [] - else: - return iter_entry_points(group_name) - groups = entry_points() - if hasattr(groups, 'select'): - # New interface in Python 3.10 and newer versions of the - # importlib_metadata backport. - return groups.select(group=group_name) - else: - # Older interface, deprecated in Python 3.10 and recent - # importlib_metadata, but we need it in Python 3.8 and 3.9. - return groups.get(group_name, []) - - -def find_plugin_lexers(): - for entrypoint in iter_entry_points(LEXER_ENTRY_POINT): - yield entrypoint.load() - - -def find_plugin_formatters(): - for entrypoint in iter_entry_points(FORMATTER_ENTRY_POINT): - yield entrypoint.name, entrypoint.load() - - -def find_plugin_styles(): - for entrypoint in iter_entry_points(STYLE_ENTRY_POINT): - yield entrypoint.name, entrypoint.load() - - -def find_plugin_filters(): - for entrypoint in iter_entry_points(FILTER_ENTRY_POINT): - yield entrypoint.name, entrypoint.load() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/regexopt.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/regexopt.py deleted file mode 100644 index 45223ec..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/regexopt.py +++ /dev/null @@ -1,91 +0,0 @@ -""" - pygments.regexopt - ~~~~~~~~~~~~~~~~~ - - An algorithm that generates optimized regexes for matching long lists of - literal strings. - - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -import re -from re import escape -from os.path import commonprefix -from itertools import groupby -from operator import itemgetter - -CS_ESCAPE = re.compile(r'[\[\^\\\-\]]') -FIRST_ELEMENT = itemgetter(0) - - -def make_charset(letters): - return '[' + CS_ESCAPE.sub(lambda m: '\\' + m.group(), ''.join(letters)) + ']' - - -def regex_opt_inner(strings, open_paren): - """Return a regex that matches any string in the sorted list of strings.""" - close_paren = open_paren and ')' or '' - # print strings, repr(open_paren) - if not strings: - # print '-> nothing left' - return '' - first = strings[0] - if len(strings) == 1: - # print '-> only 1 string' - return open_paren + escape(first) + close_paren - if not first: - # print '-> first string empty' - return open_paren + regex_opt_inner(strings[1:], '(?:') \ - + '?' + close_paren - if len(first) == 1: - # multiple one-char strings? make a charset - oneletter = [] - rest = [] - for s in strings: - if len(s) == 1: - oneletter.append(s) - else: - rest.append(s) - if len(oneletter) > 1: # do we have more than one oneletter string? - if rest: - # print '-> 1-character + rest' - return open_paren + regex_opt_inner(rest, '') + '|' \ - + make_charset(oneletter) + close_paren - # print '-> only 1-character' - return open_paren + make_charset(oneletter) + close_paren - prefix = commonprefix(strings) - if prefix: - plen = len(prefix) - # we have a prefix for all strings - # print '-> prefix:', prefix - return open_paren + escape(prefix) \ - + regex_opt_inner([s[plen:] for s in strings], '(?:') \ - + close_paren - # is there a suffix? - strings_rev = [s[::-1] for s in strings] - suffix = commonprefix(strings_rev) - if suffix: - slen = len(suffix) - # print '-> suffix:', suffix[::-1] - return open_paren \ - + regex_opt_inner(sorted(s[:-slen] for s in strings), '(?:') \ - + escape(suffix[::-1]) + close_paren - # recurse on common 1-string prefixes - # print '-> last resort' - return open_paren + \ - '|'.join(regex_opt_inner(list(group[1]), '') - for group in groupby(strings, lambda s: s[0] == first[0])) \ - + close_paren - - -def regex_opt(strings, prefix='', suffix=''): - """Return a compiled regex that matches any string in the given list. - - The strings to match must be literal strings, not regexes. They will be - regex-escaped. - - *prefix* and *suffix* are pre- and appended to the final regex. - """ - strings = sorted(strings) - return prefix + regex_opt_inner(strings, '(') + suffix diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/scanner.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/scanner.py deleted file mode 100644 index 32a2f30..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/scanner.py +++ /dev/null @@ -1,104 +0,0 @@ -""" - pygments.scanner - ~~~~~~~~~~~~~~~~ - - This library implements a regex based scanner. Some languages - like Pascal are easy to parse but have some keywords that - depend on the context. Because of this it's impossible to lex - that just by using a regular expression lexer like the - `RegexLexer`. - - Have a look at the `DelphiLexer` to get an idea of how to use - this scanner. - - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" -import re - - -class EndOfText(RuntimeError): - """ - Raise if end of text is reached and the user - tried to call a match function. - """ - - -class Scanner: - """ - Simple scanner - - All method patterns are regular expression strings (not - compiled expressions!) - """ - - def __init__(self, text, flags=0): - """ - :param text: The text which should be scanned - :param flags: default regular expression flags - """ - self.data = text - self.data_length = len(text) - self.start_pos = 0 - self.pos = 0 - self.flags = flags - self.last = None - self.match = None - self._re_cache = {} - - def eos(self): - """`True` if the scanner reached the end of text.""" - return self.pos >= self.data_length - eos = property(eos, eos.__doc__) - - def check(self, pattern): - """ - Apply `pattern` on the current position and return - the match object. (Doesn't touch pos). Use this for - lookahead. - """ - if self.eos: - raise EndOfText() - if pattern not in self._re_cache: - self._re_cache[pattern] = re.compile(pattern, self.flags) - return self._re_cache[pattern].match(self.data, self.pos) - - def test(self, pattern): - """Apply a pattern on the current position and check - if it patches. Doesn't touch pos. - """ - return self.check(pattern) is not None - - def scan(self, pattern): - """ - Scan the text for the given pattern and update pos/match - and related fields. The return value is a boolean that - indicates if the pattern matched. The matched value is - stored on the instance as ``match``, the last value is - stored as ``last``. ``start_pos`` is the position of the - pointer before the pattern was matched, ``pos`` is the - end position. - """ - if self.eos: - raise EndOfText() - if pattern not in self._re_cache: - self._re_cache[pattern] = re.compile(pattern, self.flags) - self.last = self.match - m = self._re_cache[pattern].match(self.data, self.pos) - if m is None: - return False - self.start_pos = m.start() - self.pos = m.end() - self.match = m.group() - return True - - def get_char(self): - """Scan exactly one char.""" - self.scan('.') - - def __repr__(self): - return '<%s %d/%d>' % ( - self.__class__.__name__, - self.pos, - self.data_length - ) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/sphinxext.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/sphinxext.py deleted file mode 100644 index 2c7facd..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/sphinxext.py +++ /dev/null @@ -1,217 +0,0 @@ -""" - pygments.sphinxext - ~~~~~~~~~~~~~~~~~~ - - Sphinx extension to generate automatic documentation of lexers, - formatters and filters. - - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -import sys - -from docutils import nodes -from docutils.statemachine import ViewList -from docutils.parsers.rst import Directive -from sphinx.util.nodes import nested_parse_with_titles - - -MODULEDOC = ''' -.. module:: %s - -%s -%s -''' - -LEXERDOC = ''' -.. class:: %s - - :Short names: %s - :Filenames: %s - :MIME types: %s - - %s - -''' - -FMTERDOC = ''' -.. class:: %s - - :Short names: %s - :Filenames: %s - - %s - -''' - -FILTERDOC = ''' -.. class:: %s - - :Name: %s - - %s - -''' - - -class PygmentsDoc(Directive): - """ - A directive to collect all lexers/formatters/filters and generate - autoclass directives for them. - """ - has_content = False - required_arguments = 1 - optional_arguments = 0 - final_argument_whitespace = False - option_spec = {} - - def run(self): - self.filenames = set() - if self.arguments[0] == 'lexers': - out = self.document_lexers() - elif self.arguments[0] == 'formatters': - out = self.document_formatters() - elif self.arguments[0] == 'filters': - out = self.document_filters() - elif self.arguments[0] == 'lexers_overview': - out = self.document_lexers_overview() - else: - raise Exception('invalid argument for "pygmentsdoc" directive') - node = nodes.compound() - vl = ViewList(out.split('\n'), source='') - nested_parse_with_titles(self.state, vl, node) - for fn in self.filenames: - self.state.document.settings.record_dependencies.add(fn) - return node.children - - def document_lexers_overview(self): - """Generate a tabular overview of all lexers. - - The columns are the lexer name, the extensions handled by this lexer - (or "None"), the aliases and a link to the lexer class.""" - from pip._vendor.pygments.lexers._mapping import LEXERS - from pip._vendor.pygments.lexers import find_lexer_class - out = [] - - table = [] - - def format_link(name, url): - if url: - return f'`{name} <{url}>`_' - return name - - for classname, data in sorted(LEXERS.items(), key=lambda x: x[1][1].lower()): - lexer_cls = find_lexer_class(data[1]) - extensions = lexer_cls.filenames + lexer_cls.alias_filenames - - table.append({ - 'name': format_link(data[1], lexer_cls.url), - 'extensions': ', '.join(extensions).replace('*', '\\*').replace('_', '\\') or 'None', - 'aliases': ', '.join(data[2]), - 'class': f'{data[0]}.{classname}' - }) - - column_names = ['name', 'extensions', 'aliases', 'class'] - column_lengths = [max([len(row[column]) for row in table if row[column]]) - for column in column_names] - - def write_row(*columns): - """Format a table row""" - out = [] - for l, c in zip(column_lengths, columns): - if c: - out.append(c.ljust(l)) - else: - out.append(' '*l) - - return ' '.join(out) - - def write_seperator(): - """Write a table separator row""" - sep = ['='*c for c in column_lengths] - return write_row(*sep) - - out.append(write_seperator()) - out.append(write_row('Name', 'Extension(s)', 'Short name(s)', 'Lexer class')) - out.append(write_seperator()) - for row in table: - out.append(write_row( - row['name'], - row['extensions'], - row['aliases'], - f':class:`~{row["class"]}`')) - out.append(write_seperator()) - - return '\n'.join(out) - - def document_lexers(self): - from pip._vendor.pygments.lexers._mapping import LEXERS - out = [] - modules = {} - moduledocstrings = {} - for classname, data in sorted(LEXERS.items(), key=lambda x: x[0]): - module = data[0] - mod = __import__(module, None, None, [classname]) - self.filenames.add(mod.__file__) - cls = getattr(mod, classname) - if not cls.__doc__: - print("Warning: %s does not have a docstring." % classname) - docstring = cls.__doc__ - if isinstance(docstring, bytes): - docstring = docstring.decode('utf8') - modules.setdefault(module, []).append(( - classname, - ', '.join(data[2]) or 'None', - ', '.join(data[3]).replace('*', '\\*').replace('_', '\\') or 'None', - ', '.join(data[4]) or 'None', - docstring)) - if module not in moduledocstrings: - moddoc = mod.__doc__ - if isinstance(moddoc, bytes): - moddoc = moddoc.decode('utf8') - moduledocstrings[module] = moddoc - - for module, lexers in sorted(modules.items(), key=lambda x: x[0]): - if moduledocstrings[module] is None: - raise Exception("Missing docstring for %s" % (module,)) - heading = moduledocstrings[module].splitlines()[4].strip().rstrip('.') - out.append(MODULEDOC % (module, heading, '-'*len(heading))) - for data in lexers: - out.append(LEXERDOC % data) - - return ''.join(out) - - def document_formatters(self): - from pip._vendor.pygments.formatters import FORMATTERS - - out = [] - for classname, data in sorted(FORMATTERS.items(), key=lambda x: x[0]): - module = data[0] - mod = __import__(module, None, None, [classname]) - self.filenames.add(mod.__file__) - cls = getattr(mod, classname) - docstring = cls.__doc__ - if isinstance(docstring, bytes): - docstring = docstring.decode('utf8') - heading = cls.__name__ - out.append(FMTERDOC % (heading, ', '.join(data[2]) or 'None', - ', '.join(data[3]).replace('*', '\\*') or 'None', - docstring)) - return ''.join(out) - - def document_filters(self): - from pip._vendor.pygments.filters import FILTERS - - out = [] - for name, cls in FILTERS.items(): - self.filenames.add(sys.modules[cls.__module__].__file__) - docstring = cls.__doc__ - if isinstance(docstring, bytes): - docstring = docstring.decode('utf8') - out.append(FILTERDOC % (cls.__name__, name, docstring)) - return ''.join(out) - - -def setup(app): - app.add_directive('pygmentsdoc', PygmentsDoc) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/style.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/style.py deleted file mode 100644 index edc1962..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/style.py +++ /dev/null @@ -1,197 +0,0 @@ -""" - pygments.style - ~~~~~~~~~~~~~~ - - Basic style object. - - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -from pip._vendor.pygments.token import Token, STANDARD_TYPES - -# Default mapping of ansixxx to RGB colors. -_ansimap = { - # dark - 'ansiblack': '000000', - 'ansired': '7f0000', - 'ansigreen': '007f00', - 'ansiyellow': '7f7fe0', - 'ansiblue': '00007f', - 'ansimagenta': '7f007f', - 'ansicyan': '007f7f', - 'ansigray': 'e5e5e5', - # normal - 'ansibrightblack': '555555', - 'ansibrightred': 'ff0000', - 'ansibrightgreen': '00ff00', - 'ansibrightyellow': 'ffff00', - 'ansibrightblue': '0000ff', - 'ansibrightmagenta': 'ff00ff', - 'ansibrightcyan': '00ffff', - 'ansiwhite': 'ffffff', -} -# mapping of deprecated #ansixxx colors to new color names -_deprecated_ansicolors = { - # dark - '#ansiblack': 'ansiblack', - '#ansidarkred': 'ansired', - '#ansidarkgreen': 'ansigreen', - '#ansibrown': 'ansiyellow', - '#ansidarkblue': 'ansiblue', - '#ansipurple': 'ansimagenta', - '#ansiteal': 'ansicyan', - '#ansilightgray': 'ansigray', - # normal - '#ansidarkgray': 'ansibrightblack', - '#ansired': 'ansibrightred', - '#ansigreen': 'ansibrightgreen', - '#ansiyellow': 'ansibrightyellow', - '#ansiblue': 'ansibrightblue', - '#ansifuchsia': 'ansibrightmagenta', - '#ansiturquoise': 'ansibrightcyan', - '#ansiwhite': 'ansiwhite', -} -ansicolors = set(_ansimap) - - -class StyleMeta(type): - - def __new__(mcs, name, bases, dct): - obj = type.__new__(mcs, name, bases, dct) - for token in STANDARD_TYPES: - if token not in obj.styles: - obj.styles[token] = '' - - def colorformat(text): - if text in ansicolors: - return text - if text[0:1] == '#': - col = text[1:] - if len(col) == 6: - return col - elif len(col) == 3: - return col[0] * 2 + col[1] * 2 + col[2] * 2 - elif text == '': - return '' - elif text.startswith('var') or text.startswith('calc'): - return text - assert False, "wrong color format %r" % text - - _styles = obj._styles = {} - - for ttype in obj.styles: - for token in ttype.split(): - if token in _styles: - continue - ndef = _styles.get(token.parent, None) - styledefs = obj.styles.get(token, '').split() - if not ndef or token is None: - ndef = ['', 0, 0, 0, '', '', 0, 0, 0] - elif 'noinherit' in styledefs and token is not Token: - ndef = _styles[Token][:] - else: - ndef = ndef[:] - _styles[token] = ndef - for styledef in obj.styles.get(token, '').split(): - if styledef == 'noinherit': - pass - elif styledef == 'bold': - ndef[1] = 1 - elif styledef == 'nobold': - ndef[1] = 0 - elif styledef == 'italic': - ndef[2] = 1 - elif styledef == 'noitalic': - ndef[2] = 0 - elif styledef == 'underline': - ndef[3] = 1 - elif styledef == 'nounderline': - ndef[3] = 0 - elif styledef[:3] == 'bg:': - ndef[4] = colorformat(styledef[3:]) - elif styledef[:7] == 'border:': - ndef[5] = colorformat(styledef[7:]) - elif styledef == 'roman': - ndef[6] = 1 - elif styledef == 'sans': - ndef[7] = 1 - elif styledef == 'mono': - ndef[8] = 1 - else: - ndef[0] = colorformat(styledef) - - return obj - - def style_for_token(cls, token): - t = cls._styles[token] - ansicolor = bgansicolor = None - color = t[0] - if color in _deprecated_ansicolors: - color = _deprecated_ansicolors[color] - if color in ansicolors: - ansicolor = color - color = _ansimap[color] - bgcolor = t[4] - if bgcolor in _deprecated_ansicolors: - bgcolor = _deprecated_ansicolors[bgcolor] - if bgcolor in ansicolors: - bgansicolor = bgcolor - bgcolor = _ansimap[bgcolor] - - return { - 'color': color or None, - 'bold': bool(t[1]), - 'italic': bool(t[2]), - 'underline': bool(t[3]), - 'bgcolor': bgcolor or None, - 'border': t[5] or None, - 'roman': bool(t[6]) or None, - 'sans': bool(t[7]) or None, - 'mono': bool(t[8]) or None, - 'ansicolor': ansicolor, - 'bgansicolor': bgansicolor, - } - - def list_styles(cls): - return list(cls) - - def styles_token(cls, ttype): - return ttype in cls._styles - - def __iter__(cls): - for token in cls._styles: - yield token, cls.style_for_token(token) - - def __len__(cls): - return len(cls._styles) - - -class Style(metaclass=StyleMeta): - - #: overall background color (``None`` means transparent) - background_color = '#ffffff' - - #: highlight background color - highlight_color = '#ffffcc' - - #: line number font color - line_number_color = 'inherit' - - #: line number background color - line_number_background_color = 'transparent' - - #: special line number font color - line_number_special_color = '#000000' - - #: special line number background color - line_number_special_background_color = '#ffffc0' - - #: Style definitions for individual token types. - styles = {} - - # Attribute for lexers defined within Pygments. If set - # to True, the style is not shown in the style gallery - # on the website. This is intended for language-specific - # styles. - web_style_gallery_exclude = False diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__init__.py deleted file mode 100644 index 7401cf5..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__init__.py +++ /dev/null @@ -1,103 +0,0 @@ -""" - pygments.styles - ~~~~~~~~~~~~~~~ - - Contains built-in styles. - - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -from pip._vendor.pygments.plugin import find_plugin_styles -from pip._vendor.pygments.util import ClassNotFound - -#: A dictionary of built-in styles, mapping style names to -#: ``'submodule::classname'`` strings. -STYLE_MAP = { - 'default': 'default::DefaultStyle', - 'emacs': 'emacs::EmacsStyle', - 'friendly': 'friendly::FriendlyStyle', - 'friendly_grayscale': 'friendly_grayscale::FriendlyGrayscaleStyle', - 'colorful': 'colorful::ColorfulStyle', - 'autumn': 'autumn::AutumnStyle', - 'murphy': 'murphy::MurphyStyle', - 'manni': 'manni::ManniStyle', - 'material': 'material::MaterialStyle', - 'monokai': 'monokai::MonokaiStyle', - 'perldoc': 'perldoc::PerldocStyle', - 'pastie': 'pastie::PastieStyle', - 'borland': 'borland::BorlandStyle', - 'trac': 'trac::TracStyle', - 'native': 'native::NativeStyle', - 'fruity': 'fruity::FruityStyle', - 'bw': 'bw::BlackWhiteStyle', - 'vim': 'vim::VimStyle', - 'vs': 'vs::VisualStudioStyle', - 'tango': 'tango::TangoStyle', - 'rrt': 'rrt::RrtStyle', - 'xcode': 'xcode::XcodeStyle', - 'igor': 'igor::IgorStyle', - 'paraiso-light': 'paraiso_light::ParaisoLightStyle', - 'paraiso-dark': 'paraiso_dark::ParaisoDarkStyle', - 'lovelace': 'lovelace::LovelaceStyle', - 'algol': 'algol::AlgolStyle', - 'algol_nu': 'algol_nu::Algol_NuStyle', - 'arduino': 'arduino::ArduinoStyle', - 'rainbow_dash': 'rainbow_dash::RainbowDashStyle', - 'abap': 'abap::AbapStyle', - 'solarized-dark': 'solarized::SolarizedDarkStyle', - 'solarized-light': 'solarized::SolarizedLightStyle', - 'sas': 'sas::SasStyle', - 'staroffice' : 'staroffice::StarofficeStyle', - 'stata': 'stata_light::StataLightStyle', - 'stata-light': 'stata_light::StataLightStyle', - 'stata-dark': 'stata_dark::StataDarkStyle', - 'inkpot': 'inkpot::InkPotStyle', - 'zenburn': 'zenburn::ZenburnStyle', - 'gruvbox-dark': 'gruvbox::GruvboxDarkStyle', - 'gruvbox-light': 'gruvbox::GruvboxLightStyle', - 'dracula': 'dracula::DraculaStyle', - 'one-dark': 'onedark::OneDarkStyle', - 'lilypond' : 'lilypond::LilyPondStyle', - 'nord': 'nord::NordStyle', - 'nord-darker': 'nord::NordDarkerStyle', - 'github-dark': 'gh_dark::GhDarkStyle' -} - - -def get_style_by_name(name): - """ - Return a style class by its short name. The names of the builtin styles - are listed in :data:`pygments.styles.STYLE_MAP`. - - Will raise :exc:`pygments.util.ClassNotFound` if no style of that name is - found. - """ - if name in STYLE_MAP: - mod, cls = STYLE_MAP[name].split('::') - builtin = "yes" - else: - for found_name, style in find_plugin_styles(): - if name == found_name: - return style - # perhaps it got dropped into our styles package - builtin = "" - mod = name - cls = name.title() + "Style" - - try: - mod = __import__('pygments.styles.' + mod, None, None, [cls]) - except ImportError: - raise ClassNotFound("Could not find style module %r" % mod + - (builtin and ", though it should be builtin") + ".") - try: - return getattr(mod, cls) - except AttributeError: - raise ClassNotFound("Could not find style class %r in style module." % cls) - - -def get_all_styles(): - """Return a generator for all styles by name, both builtin and plugin.""" - yield from STYLE_MAP - for name, _ in find_plugin_styles(): - yield name diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 3cc48673a8ed3f0aacefdc8b73396cdc3770a234..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4470 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/token.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/token.py deleted file mode 100644 index 7395cb6..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/token.py +++ /dev/null @@ -1,213 +0,0 @@ -""" - pygments.token - ~~~~~~~~~~~~~~ - - Basic token types and the standard tokens. - - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - - -class _TokenType(tuple): - parent = None - - def split(self): - buf = [] - node = self - while node is not None: - buf.append(node) - node = node.parent - buf.reverse() - return buf - - def __init__(self, *args): - # no need to call super.__init__ - self.subtypes = set() - - def __contains__(self, val): - return self is val or ( - type(val) is self.__class__ and - val[:len(self)] == self - ) - - def __getattr__(self, val): - if not val or not val[0].isupper(): - return tuple.__getattribute__(self, val) - new = _TokenType(self + (val,)) - setattr(self, val, new) - self.subtypes.add(new) - new.parent = self - return new - - def __repr__(self): - return 'Token' + (self and '.' or '') + '.'.join(self) - - def __copy__(self): - # These instances are supposed to be singletons - return self - - def __deepcopy__(self, memo): - # These instances are supposed to be singletons - return self - - -Token = _TokenType() - -# Special token types -Text = Token.Text -Whitespace = Text.Whitespace -Escape = Token.Escape -Error = Token.Error -# Text that doesn't belong to this lexer (e.g. HTML in PHP) -Other = Token.Other - -# Common token types for source code -Keyword = Token.Keyword -Name = Token.Name -Literal = Token.Literal -String = Literal.String -Number = Literal.Number -Punctuation = Token.Punctuation -Operator = Token.Operator -Comment = Token.Comment - -# Generic types for non-source code -Generic = Token.Generic - -# String and some others are not direct children of Token. -# alias them: -Token.Token = Token -Token.String = String -Token.Number = Number - - -def is_token_subtype(ttype, other): - """ - Return True if ``ttype`` is a subtype of ``other``. - - exists for backwards compatibility. use ``ttype in other`` now. - """ - return ttype in other - - -def string_to_tokentype(s): - """ - Convert a string into a token type:: - - >>> string_to_token('String.Double') - Token.Literal.String.Double - >>> string_to_token('Token.Literal.Number') - Token.Literal.Number - >>> string_to_token('') - Token - - Tokens that are already tokens are returned unchanged: - - >>> string_to_token(String) - Token.Literal.String - """ - if isinstance(s, _TokenType): - return s - if not s: - return Token - node = Token - for item in s.split('.'): - node = getattr(node, item) - return node - - -# Map standard token types to short names, used in CSS class naming. -# If you add a new item, please be sure to run this file to perform -# a consistency check for duplicate values. -STANDARD_TYPES = { - Token: '', - - Text: '', - Whitespace: 'w', - Escape: 'esc', - Error: 'err', - Other: 'x', - - Keyword: 'k', - Keyword.Constant: 'kc', - Keyword.Declaration: 'kd', - Keyword.Namespace: 'kn', - Keyword.Pseudo: 'kp', - Keyword.Reserved: 'kr', - Keyword.Type: 'kt', - - Name: 'n', - Name.Attribute: 'na', - Name.Builtin: 'nb', - Name.Builtin.Pseudo: 'bp', - Name.Class: 'nc', - Name.Constant: 'no', - Name.Decorator: 'nd', - Name.Entity: 'ni', - Name.Exception: 'ne', - Name.Function: 'nf', - Name.Function.Magic: 'fm', - Name.Property: 'py', - Name.Label: 'nl', - Name.Namespace: 'nn', - Name.Other: 'nx', - Name.Tag: 'nt', - Name.Variable: 'nv', - Name.Variable.Class: 'vc', - Name.Variable.Global: 'vg', - Name.Variable.Instance: 'vi', - Name.Variable.Magic: 'vm', - - Literal: 'l', - Literal.Date: 'ld', - - String: 's', - String.Affix: 'sa', - String.Backtick: 'sb', - String.Char: 'sc', - String.Delimiter: 'dl', - String.Doc: 'sd', - String.Double: 's2', - String.Escape: 'se', - String.Heredoc: 'sh', - String.Interpol: 'si', - String.Other: 'sx', - String.Regex: 'sr', - String.Single: 's1', - String.Symbol: 'ss', - - Number: 'm', - Number.Bin: 'mb', - Number.Float: 'mf', - Number.Hex: 'mh', - Number.Integer: 'mi', - Number.Integer.Long: 'il', - Number.Oct: 'mo', - - Operator: 'o', - Operator.Word: 'ow', - - Punctuation: 'p', - Punctuation.Marker: 'pm', - - Comment: 'c', - Comment.Hashbang: 'ch', - Comment.Multiline: 'cm', - Comment.Preproc: 'cp', - Comment.PreprocFile: 'cpf', - Comment.Single: 'c1', - Comment.Special: 'cs', - - Generic: 'g', - Generic.Deleted: 'gd', - Generic.Emph: 'ge', - Generic.Error: 'gr', - Generic.Heading: 'gh', - Generic.Inserted: 'gi', - Generic.Output: 'go', - Generic.Prompt: 'gp', - Generic.Strong: 'gs', - Generic.Subheading: 'gu', - Generic.Traceback: 'gt', -} diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/unistring.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/unistring.py deleted file mode 100644 index 39f6bae..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/unistring.py +++ /dev/null @@ -1,153 +0,0 @@ -""" - pygments.unistring - ~~~~~~~~~~~~~~~~~~ - - Strings of all Unicode characters of a certain category. - Used for matching in Unicode-aware languages. Run to regenerate. - - Inspired by chartypes_create.py from the MoinMoin project. - - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -Cc = '\x00-\x1f\x7f-\x9f' - -Cf = '\xad\u0600-\u0605\u061c\u06dd\u070f\u08e2\u180e\u200b-\u200f\u202a-\u202e\u2060-\u2064\u2066-\u206f\ufeff\ufff9-\ufffb\U000110bd\U000110cd\U0001bca0-\U0001bca3\U0001d173-\U0001d17a\U000e0001\U000e0020-\U000e007f' - -Cn = '\u0378-\u0379\u0380-\u0383\u038b\u038d\u03a2\u0530\u0557-\u0558\u058b-\u058c\u0590\u05c8-\u05cf\u05eb-\u05ee\u05f5-\u05ff\u061d\u070e\u074b-\u074c\u07b2-\u07bf\u07fb-\u07fc\u082e-\u082f\u083f\u085c-\u085d\u085f\u086b-\u089f\u08b5\u08be-\u08d2\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09bb\u09c5-\u09c6\u09c9-\u09ca\u09cf-\u09d6\u09d8-\u09db\u09de\u09e4-\u09e5\u09ff-\u0a00\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a3b\u0a3d\u0a43-\u0a46\u0a49-\u0a4a\u0a4e-\u0a50\u0a52-\u0a58\u0a5d\u0a5f-\u0a65\u0a77-\u0a80\u0a84\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abb\u0ac6\u0aca\u0ace-\u0acf\u0ad1-\u0adf\u0ae4-\u0ae5\u0af2-\u0af8\u0b00\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34\u0b3a-\u0b3b\u0b45-\u0b46\u0b49-\u0b4a\u0b4e-\u0b55\u0b58-\u0b5b\u0b5e\u0b64-\u0b65\u0b78-\u0b81\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bba-\u0bbd\u0bc3-\u0bc5\u0bc9\u0bce-\u0bcf\u0bd1-\u0bd6\u0bd8-\u0be5\u0bfb-\u0bff\u0c0d\u0c11\u0c29\u0c3a-\u0c3c\u0c45\u0c49\u0c4e-\u0c54\u0c57\u0c5b-\u0c5f\u0c64-\u0c65\u0c70-\u0c77\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cbb\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce4-\u0ce5\u0cf0\u0cf3-\u0cff\u0d04\u0d0d\u0d11\u0d45\u0d49\u0d50-\u0d53\u0d64-\u0d65\u0d80-\u0d81\u0d84\u0d97-\u0d99\u0db2\u0dbc\u0dbe-\u0dbf\u0dc7-\u0dc9\u0dcb-\u0dce\u0dd5\u0dd7\u0de0-\u0de5\u0df0-\u0df1\u0df5-\u0e00\u0e3b-\u0e3e\u0e5c-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eba\u0ebe-\u0ebf\u0ec5\u0ec7\u0ece-\u0ecf\u0eda-\u0edb\u0ee0-\u0eff\u0f48\u0f6d-\u0f70\u0f98\u0fbd\u0fcd\u0fdb-\u0fff\u10c6\u10c8-\u10cc\u10ce-\u10cf\u1249\u124e-\u124f\u1257\u1259\u125e-\u125f\u1289\u128e-\u128f\u12b1\u12b6-\u12b7\u12bf\u12c1\u12c6-\u12c7\u12d7\u1311\u1316-\u1317\u135b-\u135c\u137d-\u137f\u139a-\u139f\u13f6-\u13f7\u13fe-\u13ff\u169d-\u169f\u16f9-\u16ff\u170d\u1715-\u171f\u1737-\u173f\u1754-\u175f\u176d\u1771\u1774-\u177f\u17de-\u17df\u17ea-\u17ef\u17fa-\u17ff\u180f\u181a-\u181f\u1879-\u187f\u18ab-\u18af\u18f6-\u18ff\u191f\u192c-\u192f\u193c-\u193f\u1941-\u1943\u196e-\u196f\u1975-\u197f\u19ac-\u19af\u19ca-\u19cf\u19db-\u19dd\u1a1c-\u1a1d\u1a5f\u1a7d-\u1a7e\u1a8a-\u1a8f\u1a9a-\u1a9f\u1aae-\u1aaf\u1abf-\u1aff\u1b4c-\u1b4f\u1b7d-\u1b7f\u1bf4-\u1bfb\u1c38-\u1c3a\u1c4a-\u1c4c\u1c89-\u1c8f\u1cbb-\u1cbc\u1cc8-\u1ccf\u1cfa-\u1cff\u1dfa\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fc5\u1fd4-\u1fd5\u1fdc\u1ff0-\u1ff1\u1ff5\u1fff\u2065\u2072-\u2073\u208f\u209d-\u209f\u20c0-\u20cf\u20f1-\u20ff\u218c-\u218f\u2427-\u243f\u244b-\u245f\u2b74-\u2b75\u2b96-\u2b97\u2bc9\u2bff\u2c2f\u2c5f\u2cf4-\u2cf8\u2d26\u2d28-\u2d2c\u2d2e-\u2d2f\u2d68-\u2d6e\u2d71-\u2d7e\u2d97-\u2d9f\u2da7\u2daf\u2db7\u2dbf\u2dc7\u2dcf\u2dd7\u2ddf\u2e4f-\u2e7f\u2e9a\u2ef4-\u2eff\u2fd6-\u2fef\u2ffc-\u2fff\u3040\u3097-\u3098\u3100-\u3104\u3130\u318f\u31bb-\u31bf\u31e4-\u31ef\u321f\u32ff\u4db6-\u4dbf\u9ff0-\u9fff\ua48d-\ua48f\ua4c7-\ua4cf\ua62c-\ua63f\ua6f8-\ua6ff\ua7ba-\ua7f6\ua82c-\ua82f\ua83a-\ua83f\ua878-\ua87f\ua8c6-\ua8cd\ua8da-\ua8df\ua954-\ua95e\ua97d-\ua97f\ua9ce\ua9da-\ua9dd\ua9ff\uaa37-\uaa3f\uaa4e-\uaa4f\uaa5a-\uaa5b\uaac3-\uaada\uaaf7-\uab00\uab07-\uab08\uab0f-\uab10\uab17-\uab1f\uab27\uab2f\uab66-\uab6f\uabee-\uabef\uabfa-\uabff\ud7a4-\ud7af\ud7c7-\ud7ca\ud7fc-\ud7ff\ufa6e-\ufa6f\ufada-\ufaff\ufb07-\ufb12\ufb18-\ufb1c\ufb37\ufb3d\ufb3f\ufb42\ufb45\ufbc2-\ufbd2\ufd40-\ufd4f\ufd90-\ufd91\ufdc8-\ufdef\ufdfe-\ufdff\ufe1a-\ufe1f\ufe53\ufe67\ufe6c-\ufe6f\ufe75\ufefd-\ufefe\uff00\uffbf-\uffc1\uffc8-\uffc9\uffd0-\uffd1\uffd8-\uffd9\uffdd-\uffdf\uffe7\uffef-\ufff8\ufffe-\uffff\U0001000c\U00010027\U0001003b\U0001003e\U0001004e-\U0001004f\U0001005e-\U0001007f\U000100fb-\U000100ff\U00010103-\U00010106\U00010134-\U00010136\U0001018f\U0001019c-\U0001019f\U000101a1-\U000101cf\U000101fe-\U0001027f\U0001029d-\U0001029f\U000102d1-\U000102df\U000102fc-\U000102ff\U00010324-\U0001032c\U0001034b-\U0001034f\U0001037b-\U0001037f\U0001039e\U000103c4-\U000103c7\U000103d6-\U000103ff\U0001049e-\U0001049f\U000104aa-\U000104af\U000104d4-\U000104d7\U000104fc-\U000104ff\U00010528-\U0001052f\U00010564-\U0001056e\U00010570-\U000105ff\U00010737-\U0001073f\U00010756-\U0001075f\U00010768-\U000107ff\U00010806-\U00010807\U00010809\U00010836\U00010839-\U0001083b\U0001083d-\U0001083e\U00010856\U0001089f-\U000108a6\U000108b0-\U000108df\U000108f3\U000108f6-\U000108fa\U0001091c-\U0001091e\U0001093a-\U0001093e\U00010940-\U0001097f\U000109b8-\U000109bb\U000109d0-\U000109d1\U00010a04\U00010a07-\U00010a0b\U00010a14\U00010a18\U00010a36-\U00010a37\U00010a3b-\U00010a3e\U00010a49-\U00010a4f\U00010a59-\U00010a5f\U00010aa0-\U00010abf\U00010ae7-\U00010aea\U00010af7-\U00010aff\U00010b36-\U00010b38\U00010b56-\U00010b57\U00010b73-\U00010b77\U00010b92-\U00010b98\U00010b9d-\U00010ba8\U00010bb0-\U00010bff\U00010c49-\U00010c7f\U00010cb3-\U00010cbf\U00010cf3-\U00010cf9\U00010d28-\U00010d2f\U00010d3a-\U00010e5f\U00010e7f-\U00010eff\U00010f28-\U00010f2f\U00010f5a-\U00010fff\U0001104e-\U00011051\U00011070-\U0001107e\U000110c2-\U000110cc\U000110ce-\U000110cf\U000110e9-\U000110ef\U000110fa-\U000110ff\U00011135\U00011147-\U0001114f\U00011177-\U0001117f\U000111ce-\U000111cf\U000111e0\U000111f5-\U000111ff\U00011212\U0001123f-\U0001127f\U00011287\U00011289\U0001128e\U0001129e\U000112aa-\U000112af\U000112eb-\U000112ef\U000112fa-\U000112ff\U00011304\U0001130d-\U0001130e\U00011311-\U00011312\U00011329\U00011331\U00011334\U0001133a\U00011345-\U00011346\U00011349-\U0001134a\U0001134e-\U0001134f\U00011351-\U00011356\U00011358-\U0001135c\U00011364-\U00011365\U0001136d-\U0001136f\U00011375-\U000113ff\U0001145a\U0001145c\U0001145f-\U0001147f\U000114c8-\U000114cf\U000114da-\U0001157f\U000115b6-\U000115b7\U000115de-\U000115ff\U00011645-\U0001164f\U0001165a-\U0001165f\U0001166d-\U0001167f\U000116b8-\U000116bf\U000116ca-\U000116ff\U0001171b-\U0001171c\U0001172c-\U0001172f\U00011740-\U000117ff\U0001183c-\U0001189f\U000118f3-\U000118fe\U00011900-\U000119ff\U00011a48-\U00011a4f\U00011a84-\U00011a85\U00011aa3-\U00011abf\U00011af9-\U00011bff\U00011c09\U00011c37\U00011c46-\U00011c4f\U00011c6d-\U00011c6f\U00011c90-\U00011c91\U00011ca8\U00011cb7-\U00011cff\U00011d07\U00011d0a\U00011d37-\U00011d39\U00011d3b\U00011d3e\U00011d48-\U00011d4f\U00011d5a-\U00011d5f\U00011d66\U00011d69\U00011d8f\U00011d92\U00011d99-\U00011d9f\U00011daa-\U00011edf\U00011ef9-\U00011fff\U0001239a-\U000123ff\U0001246f\U00012475-\U0001247f\U00012544-\U00012fff\U0001342f-\U000143ff\U00014647-\U000167ff\U00016a39-\U00016a3f\U00016a5f\U00016a6a-\U00016a6d\U00016a70-\U00016acf\U00016aee-\U00016aef\U00016af6-\U00016aff\U00016b46-\U00016b4f\U00016b5a\U00016b62\U00016b78-\U00016b7c\U00016b90-\U00016e3f\U00016e9b-\U00016eff\U00016f45-\U00016f4f\U00016f7f-\U00016f8e\U00016fa0-\U00016fdf\U00016fe2-\U00016fff\U000187f2-\U000187ff\U00018af3-\U0001afff\U0001b11f-\U0001b16f\U0001b2fc-\U0001bbff\U0001bc6b-\U0001bc6f\U0001bc7d-\U0001bc7f\U0001bc89-\U0001bc8f\U0001bc9a-\U0001bc9b\U0001bca4-\U0001cfff\U0001d0f6-\U0001d0ff\U0001d127-\U0001d128\U0001d1e9-\U0001d1ff\U0001d246-\U0001d2df\U0001d2f4-\U0001d2ff\U0001d357-\U0001d35f\U0001d379-\U0001d3ff\U0001d455\U0001d49d\U0001d4a0-\U0001d4a1\U0001d4a3-\U0001d4a4\U0001d4a7-\U0001d4a8\U0001d4ad\U0001d4ba\U0001d4bc\U0001d4c4\U0001d506\U0001d50b-\U0001d50c\U0001d515\U0001d51d\U0001d53a\U0001d53f\U0001d545\U0001d547-\U0001d549\U0001d551\U0001d6a6-\U0001d6a7\U0001d7cc-\U0001d7cd\U0001da8c-\U0001da9a\U0001daa0\U0001dab0-\U0001dfff\U0001e007\U0001e019-\U0001e01a\U0001e022\U0001e025\U0001e02b-\U0001e7ff\U0001e8c5-\U0001e8c6\U0001e8d7-\U0001e8ff\U0001e94b-\U0001e94f\U0001e95a-\U0001e95d\U0001e960-\U0001ec70\U0001ecb5-\U0001edff\U0001ee04\U0001ee20\U0001ee23\U0001ee25-\U0001ee26\U0001ee28\U0001ee33\U0001ee38\U0001ee3a\U0001ee3c-\U0001ee41\U0001ee43-\U0001ee46\U0001ee48\U0001ee4a\U0001ee4c\U0001ee50\U0001ee53\U0001ee55-\U0001ee56\U0001ee58\U0001ee5a\U0001ee5c\U0001ee5e\U0001ee60\U0001ee63\U0001ee65-\U0001ee66\U0001ee6b\U0001ee73\U0001ee78\U0001ee7d\U0001ee7f\U0001ee8a\U0001ee9c-\U0001eea0\U0001eea4\U0001eeaa\U0001eebc-\U0001eeef\U0001eef2-\U0001efff\U0001f02c-\U0001f02f\U0001f094-\U0001f09f\U0001f0af-\U0001f0b0\U0001f0c0\U0001f0d0\U0001f0f6-\U0001f0ff\U0001f10d-\U0001f10f\U0001f16c-\U0001f16f\U0001f1ad-\U0001f1e5\U0001f203-\U0001f20f\U0001f23c-\U0001f23f\U0001f249-\U0001f24f\U0001f252-\U0001f25f\U0001f266-\U0001f2ff\U0001f6d5-\U0001f6df\U0001f6ed-\U0001f6ef\U0001f6fa-\U0001f6ff\U0001f774-\U0001f77f\U0001f7d9-\U0001f7ff\U0001f80c-\U0001f80f\U0001f848-\U0001f84f\U0001f85a-\U0001f85f\U0001f888-\U0001f88f\U0001f8ae-\U0001f8ff\U0001f90c-\U0001f90f\U0001f93f\U0001f971-\U0001f972\U0001f977-\U0001f979\U0001f97b\U0001f9a3-\U0001f9af\U0001f9ba-\U0001f9bf\U0001f9c3-\U0001f9cf\U0001fa00-\U0001fa5f\U0001fa6e-\U0001ffff\U0002a6d7-\U0002a6ff\U0002b735-\U0002b73f\U0002b81e-\U0002b81f\U0002cea2-\U0002ceaf\U0002ebe1-\U0002f7ff\U0002fa1e-\U000e0000\U000e0002-\U000e001f\U000e0080-\U000e00ff\U000e01f0-\U000effff\U000ffffe-\U000fffff\U0010fffe-\U0010ffff' - -Co = '\ue000-\uf8ff\U000f0000-\U000ffffd\U00100000-\U0010fffd' - -Cs = '\ud800-\udbff\\\udc00\udc01-\udfff' - -Ll = 'a-z\xb5\xdf-\xf6\xf8-\xff\u0101\u0103\u0105\u0107\u0109\u010b\u010d\u010f\u0111\u0113\u0115\u0117\u0119\u011b\u011d\u011f\u0121\u0123\u0125\u0127\u0129\u012b\u012d\u012f\u0131\u0133\u0135\u0137-\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148-\u0149\u014b\u014d\u014f\u0151\u0153\u0155\u0157\u0159\u015b\u015d\u015f\u0161\u0163\u0165\u0167\u0169\u016b\u016d\u016f\u0171\u0173\u0175\u0177\u017a\u017c\u017e-\u0180\u0183\u0185\u0188\u018c-\u018d\u0192\u0195\u0199-\u019b\u019e\u01a1\u01a3\u01a5\u01a8\u01aa-\u01ab\u01ad\u01b0\u01b4\u01b6\u01b9-\u01ba\u01bd-\u01bf\u01c6\u01c9\u01cc\u01ce\u01d0\u01d2\u01d4\u01d6\u01d8\u01da\u01dc-\u01dd\u01df\u01e1\u01e3\u01e5\u01e7\u01e9\u01eb\u01ed\u01ef-\u01f0\u01f3\u01f5\u01f9\u01fb\u01fd\u01ff\u0201\u0203\u0205\u0207\u0209\u020b\u020d\u020f\u0211\u0213\u0215\u0217\u0219\u021b\u021d\u021f\u0221\u0223\u0225\u0227\u0229\u022b\u022d\u022f\u0231\u0233-\u0239\u023c\u023f-\u0240\u0242\u0247\u0249\u024b\u024d\u024f-\u0293\u0295-\u02af\u0371\u0373\u0377\u037b-\u037d\u0390\u03ac-\u03ce\u03d0-\u03d1\u03d5-\u03d7\u03d9\u03db\u03dd\u03df\u03e1\u03e3\u03e5\u03e7\u03e9\u03eb\u03ed\u03ef-\u03f3\u03f5\u03f8\u03fb-\u03fc\u0430-\u045f\u0461\u0463\u0465\u0467\u0469\u046b\u046d\u046f\u0471\u0473\u0475\u0477\u0479\u047b\u047d\u047f\u0481\u048b\u048d\u048f\u0491\u0493\u0495\u0497\u0499\u049b\u049d\u049f\u04a1\u04a3\u04a5\u04a7\u04a9\u04ab\u04ad\u04af\u04b1\u04b3\u04b5\u04b7\u04b9\u04bb\u04bd\u04bf\u04c2\u04c4\u04c6\u04c8\u04ca\u04cc\u04ce-\u04cf\u04d1\u04d3\u04d5\u04d7\u04d9\u04db\u04dd\u04df\u04e1\u04e3\u04e5\u04e7\u04e9\u04eb\u04ed\u04ef\u04f1\u04f3\u04f5\u04f7\u04f9\u04fb\u04fd\u04ff\u0501\u0503\u0505\u0507\u0509\u050b\u050d\u050f\u0511\u0513\u0515\u0517\u0519\u051b\u051d\u051f\u0521\u0523\u0525\u0527\u0529\u052b\u052d\u052f\u0560-\u0588\u10d0-\u10fa\u10fd-\u10ff\u13f8-\u13fd\u1c80-\u1c88\u1d00-\u1d2b\u1d6b-\u1d77\u1d79-\u1d9a\u1e01\u1e03\u1e05\u1e07\u1e09\u1e0b\u1e0d\u1e0f\u1e11\u1e13\u1e15\u1e17\u1e19\u1e1b\u1e1d\u1e1f\u1e21\u1e23\u1e25\u1e27\u1e29\u1e2b\u1e2d\u1e2f\u1e31\u1e33\u1e35\u1e37\u1e39\u1e3b\u1e3d\u1e3f\u1e41\u1e43\u1e45\u1e47\u1e49\u1e4b\u1e4d\u1e4f\u1e51\u1e53\u1e55\u1e57\u1e59\u1e5b\u1e5d\u1e5f\u1e61\u1e63\u1e65\u1e67\u1e69\u1e6b\u1e6d\u1e6f\u1e71\u1e73\u1e75\u1e77\u1e79\u1e7b\u1e7d\u1e7f\u1e81\u1e83\u1e85\u1e87\u1e89\u1e8b\u1e8d\u1e8f\u1e91\u1e93\u1e95-\u1e9d\u1e9f\u1ea1\u1ea3\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1eb9\u1ebb\u1ebd\u1ebf\u1ec1\u1ec3\u1ec5\u1ec7\u1ec9\u1ecb\u1ecd\u1ecf\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u1edb\u1edd\u1edf\u1ee1\u1ee3\u1ee5\u1ee7\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u1ef3\u1ef5\u1ef7\u1ef9\u1efb\u1efd\u1eff-\u1f07\u1f10-\u1f15\u1f20-\u1f27\u1f30-\u1f37\u1f40-\u1f45\u1f50-\u1f57\u1f60-\u1f67\u1f70-\u1f7d\u1f80-\u1f87\u1f90-\u1f97\u1fa0-\u1fa7\u1fb0-\u1fb4\u1fb6-\u1fb7\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fc7\u1fd0-\u1fd3\u1fd6-\u1fd7\u1fe0-\u1fe7\u1ff2-\u1ff4\u1ff6-\u1ff7\u210a\u210e-\u210f\u2113\u212f\u2134\u2139\u213c-\u213d\u2146-\u2149\u214e\u2184\u2c30-\u2c5e\u2c61\u2c65-\u2c66\u2c68\u2c6a\u2c6c\u2c71\u2c73-\u2c74\u2c76-\u2c7b\u2c81\u2c83\u2c85\u2c87\u2c89\u2c8b\u2c8d\u2c8f\u2c91\u2c93\u2c95\u2c97\u2c99\u2c9b\u2c9d\u2c9f\u2ca1\u2ca3\u2ca5\u2ca7\u2ca9\u2cab\u2cad\u2caf\u2cb1\u2cb3\u2cb5\u2cb7\u2cb9\u2cbb\u2cbd\u2cbf\u2cc1\u2cc3\u2cc5\u2cc7\u2cc9\u2ccb\u2ccd\u2ccf\u2cd1\u2cd3\u2cd5\u2cd7\u2cd9\u2cdb\u2cdd\u2cdf\u2ce1\u2ce3-\u2ce4\u2cec\u2cee\u2cf3\u2d00-\u2d25\u2d27\u2d2d\ua641\ua643\ua645\ua647\ua649\ua64b\ua64d\ua64f\ua651\ua653\ua655\ua657\ua659\ua65b\ua65d\ua65f\ua661\ua663\ua665\ua667\ua669\ua66b\ua66d\ua681\ua683\ua685\ua687\ua689\ua68b\ua68d\ua68f\ua691\ua693\ua695\ua697\ua699\ua69b\ua723\ua725\ua727\ua729\ua72b\ua72d\ua72f-\ua731\ua733\ua735\ua737\ua739\ua73b\ua73d\ua73f\ua741\ua743\ua745\ua747\ua749\ua74b\ua74d\ua74f\ua751\ua753\ua755\ua757\ua759\ua75b\ua75d\ua75f\ua761\ua763\ua765\ua767\ua769\ua76b\ua76d\ua76f\ua771-\ua778\ua77a\ua77c\ua77f\ua781\ua783\ua785\ua787\ua78c\ua78e\ua791\ua793-\ua795\ua797\ua799\ua79b\ua79d\ua79f\ua7a1\ua7a3\ua7a5\ua7a7\ua7a9\ua7af\ua7b5\ua7b7\ua7b9\ua7fa\uab30-\uab5a\uab60-\uab65\uab70-\uabbf\ufb00-\ufb06\ufb13-\ufb17\uff41-\uff5a\U00010428-\U0001044f\U000104d8-\U000104fb\U00010cc0-\U00010cf2\U000118c0-\U000118df\U00016e60-\U00016e7f\U0001d41a-\U0001d433\U0001d44e-\U0001d454\U0001d456-\U0001d467\U0001d482-\U0001d49b\U0001d4b6-\U0001d4b9\U0001d4bb\U0001d4bd-\U0001d4c3\U0001d4c5-\U0001d4cf\U0001d4ea-\U0001d503\U0001d51e-\U0001d537\U0001d552-\U0001d56b\U0001d586-\U0001d59f\U0001d5ba-\U0001d5d3\U0001d5ee-\U0001d607\U0001d622-\U0001d63b\U0001d656-\U0001d66f\U0001d68a-\U0001d6a5\U0001d6c2-\U0001d6da\U0001d6dc-\U0001d6e1\U0001d6fc-\U0001d714\U0001d716-\U0001d71b\U0001d736-\U0001d74e\U0001d750-\U0001d755\U0001d770-\U0001d788\U0001d78a-\U0001d78f\U0001d7aa-\U0001d7c2\U0001d7c4-\U0001d7c9\U0001d7cb\U0001e922-\U0001e943' - -Lm = '\u02b0-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0374\u037a\u0559\u0640\u06e5-\u06e6\u07f4-\u07f5\u07fa\u081a\u0824\u0828\u0971\u0e46\u0ec6\u10fc\u17d7\u1843\u1aa7\u1c78-\u1c7d\u1d2c-\u1d6a\u1d78\u1d9b-\u1dbf\u2071\u207f\u2090-\u209c\u2c7c-\u2c7d\u2d6f\u2e2f\u3005\u3031-\u3035\u303b\u309d-\u309e\u30fc-\u30fe\ua015\ua4f8-\ua4fd\ua60c\ua67f\ua69c-\ua69d\ua717-\ua71f\ua770\ua788\ua7f8-\ua7f9\ua9cf\ua9e6\uaa70\uaadd\uaaf3-\uaaf4\uab5c-\uab5f\uff70\uff9e-\uff9f\U00016b40-\U00016b43\U00016f93-\U00016f9f\U00016fe0-\U00016fe1' - -Lo = '\xaa\xba\u01bb\u01c0-\u01c3\u0294\u05d0-\u05ea\u05ef-\u05f2\u0620-\u063f\u0641-\u064a\u066e-\u066f\u0671-\u06d3\u06d5\u06ee-\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u0800-\u0815\u0840-\u0858\u0860-\u086a\u08a0-\u08b4\u08b6-\u08bd\u0904-\u0939\u093d\u0950\u0958-\u0961\u0972-\u0980\u0985-\u098c\u098f-\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc-\u09dd\u09df-\u09e1\u09f0-\u09f1\u09fc\u0a05-\u0a0a\u0a0f-\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32-\u0a33\u0a35-\u0a36\u0a38-\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2-\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0-\u0ae1\u0af9\u0b05-\u0b0c\u0b0f-\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32-\u0b33\u0b35-\u0b39\u0b3d\u0b5c-\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99-\u0b9a\u0b9c\u0b9e-\u0b9f\u0ba3-\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c60-\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0-\u0ce1\u0cf1-\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32-\u0e33\u0e40-\u0e45\u0e81-\u0e82\u0e84\u0e87-\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa-\u0eab\u0ead-\u0eb0\u0eb2-\u0eb3\u0ebd\u0ec0-\u0ec4\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065-\u1066\u106e-\u1070\u1075-\u1081\u108e\u1100-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16f1-\u16f8\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17dc\u1820-\u1842\u1844-\u1878\u1880-\u1884\u1887-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae-\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c77\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5-\u1cf6\u2135-\u2138\u2d30-\u2d67\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3006\u303c\u3041-\u3096\u309f\u30a1-\u30fa\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fef\ua000-\ua014\ua016-\ua48c\ua4d0-\ua4f7\ua500-\ua60b\ua610-\ua61f\ua62a-\ua62b\ua66e\ua6a0-\ua6e5\ua78f\ua7f7\ua7fb-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd-\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9e0-\ua9e4\ua9e7-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa6f\uaa71-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5-\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadc\uaae0-\uaaea\uaaf2\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff66-\uff6f\uff71-\uff9d\uffa0-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc\U00010000-\U0001000b\U0001000d-\U00010026\U00010028-\U0001003a\U0001003c-\U0001003d\U0001003f-\U0001004d\U00010050-\U0001005d\U00010080-\U000100fa\U00010280-\U0001029c\U000102a0-\U000102d0\U00010300-\U0001031f\U0001032d-\U00010340\U00010342-\U00010349\U00010350-\U00010375\U00010380-\U0001039d\U000103a0-\U000103c3\U000103c8-\U000103cf\U00010450-\U0001049d\U00010500-\U00010527\U00010530-\U00010563\U00010600-\U00010736\U00010740-\U00010755\U00010760-\U00010767\U00010800-\U00010805\U00010808\U0001080a-\U00010835\U00010837-\U00010838\U0001083c\U0001083f-\U00010855\U00010860-\U00010876\U00010880-\U0001089e\U000108e0-\U000108f2\U000108f4-\U000108f5\U00010900-\U00010915\U00010920-\U00010939\U00010980-\U000109b7\U000109be-\U000109bf\U00010a00\U00010a10-\U00010a13\U00010a15-\U00010a17\U00010a19-\U00010a35\U00010a60-\U00010a7c\U00010a80-\U00010a9c\U00010ac0-\U00010ac7\U00010ac9-\U00010ae4\U00010b00-\U00010b35\U00010b40-\U00010b55\U00010b60-\U00010b72\U00010b80-\U00010b91\U00010c00-\U00010c48\U00010d00-\U00010d23\U00010f00-\U00010f1c\U00010f27\U00010f30-\U00010f45\U00011003-\U00011037\U00011083-\U000110af\U000110d0-\U000110e8\U00011103-\U00011126\U00011144\U00011150-\U00011172\U00011176\U00011183-\U000111b2\U000111c1-\U000111c4\U000111da\U000111dc\U00011200-\U00011211\U00011213-\U0001122b\U00011280-\U00011286\U00011288\U0001128a-\U0001128d\U0001128f-\U0001129d\U0001129f-\U000112a8\U000112b0-\U000112de\U00011305-\U0001130c\U0001130f-\U00011310\U00011313-\U00011328\U0001132a-\U00011330\U00011332-\U00011333\U00011335-\U00011339\U0001133d\U00011350\U0001135d-\U00011361\U00011400-\U00011434\U00011447-\U0001144a\U00011480-\U000114af\U000114c4-\U000114c5\U000114c7\U00011580-\U000115ae\U000115d8-\U000115db\U00011600-\U0001162f\U00011644\U00011680-\U000116aa\U00011700-\U0001171a\U00011800-\U0001182b\U000118ff\U00011a00\U00011a0b-\U00011a32\U00011a3a\U00011a50\U00011a5c-\U00011a83\U00011a86-\U00011a89\U00011a9d\U00011ac0-\U00011af8\U00011c00-\U00011c08\U00011c0a-\U00011c2e\U00011c40\U00011c72-\U00011c8f\U00011d00-\U00011d06\U00011d08-\U00011d09\U00011d0b-\U00011d30\U00011d46\U00011d60-\U00011d65\U00011d67-\U00011d68\U00011d6a-\U00011d89\U00011d98\U00011ee0-\U00011ef2\U00012000-\U00012399\U00012480-\U00012543\U00013000-\U0001342e\U00014400-\U00014646\U00016800-\U00016a38\U00016a40-\U00016a5e\U00016ad0-\U00016aed\U00016b00-\U00016b2f\U00016b63-\U00016b77\U00016b7d-\U00016b8f\U00016f00-\U00016f44\U00016f50\U00017000-\U000187f1\U00018800-\U00018af2\U0001b000-\U0001b11e\U0001b170-\U0001b2fb\U0001bc00-\U0001bc6a\U0001bc70-\U0001bc7c\U0001bc80-\U0001bc88\U0001bc90-\U0001bc99\U0001e800-\U0001e8c4\U0001ee00-\U0001ee03\U0001ee05-\U0001ee1f\U0001ee21-\U0001ee22\U0001ee24\U0001ee27\U0001ee29-\U0001ee32\U0001ee34-\U0001ee37\U0001ee39\U0001ee3b\U0001ee42\U0001ee47\U0001ee49\U0001ee4b\U0001ee4d-\U0001ee4f\U0001ee51-\U0001ee52\U0001ee54\U0001ee57\U0001ee59\U0001ee5b\U0001ee5d\U0001ee5f\U0001ee61-\U0001ee62\U0001ee64\U0001ee67-\U0001ee6a\U0001ee6c-\U0001ee72\U0001ee74-\U0001ee77\U0001ee79-\U0001ee7c\U0001ee7e\U0001ee80-\U0001ee89\U0001ee8b-\U0001ee9b\U0001eea1-\U0001eea3\U0001eea5-\U0001eea9\U0001eeab-\U0001eebb\U00020000-\U0002a6d6\U0002a700-\U0002b734\U0002b740-\U0002b81d\U0002b820-\U0002cea1\U0002ceb0-\U0002ebe0\U0002f800-\U0002fa1d' - -Lt = '\u01c5\u01c8\u01cb\u01f2\u1f88-\u1f8f\u1f98-\u1f9f\u1fa8-\u1faf\u1fbc\u1fcc\u1ffc' - -Lu = 'A-Z\xc0-\xd6\xd8-\xde\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0139\u013b\u013d\u013f\u0141\u0143\u0145\u0147\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176\u0178-\u0179\u017b\u017d\u0181-\u0182\u0184\u0186-\u0187\u0189-\u018b\u018e-\u0191\u0193-\u0194\u0196-\u0198\u019c-\u019d\u019f-\u01a0\u01a2\u01a4\u01a6-\u01a7\u01a9\u01ac\u01ae-\u01af\u01b1-\u01b3\u01b5\u01b7-\u01b8\u01bc\u01c4\u01c7\u01ca\u01cd\u01cf\u01d1\u01d3\u01d5\u01d7\u01d9\u01db\u01de\u01e0\u01e2\u01e4\u01e6\u01e8\u01ea\u01ec\u01ee\u01f1\u01f4\u01f6-\u01f8\u01fa\u01fc\u01fe\u0200\u0202\u0204\u0206\u0208\u020a\u020c\u020e\u0210\u0212\u0214\u0216\u0218\u021a\u021c\u021e\u0220\u0222\u0224\u0226\u0228\u022a\u022c\u022e\u0230\u0232\u023a-\u023b\u023d-\u023e\u0241\u0243-\u0246\u0248\u024a\u024c\u024e\u0370\u0372\u0376\u037f\u0386\u0388-\u038a\u038c\u038e-\u038f\u0391-\u03a1\u03a3-\u03ab\u03cf\u03d2-\u03d4\u03d8\u03da\u03dc\u03de\u03e0\u03e2\u03e4\u03e6\u03e8\u03ea\u03ec\u03ee\u03f4\u03f7\u03f9-\u03fa\u03fd-\u042f\u0460\u0462\u0464\u0466\u0468\u046a\u046c\u046e\u0470\u0472\u0474\u0476\u0478\u047a\u047c\u047e\u0480\u048a\u048c\u048e\u0490\u0492\u0494\u0496\u0498\u049a\u049c\u049e\u04a0\u04a2\u04a4\u04a6\u04a8\u04aa\u04ac\u04ae\u04b0\u04b2\u04b4\u04b6\u04b8\u04ba\u04bc\u04be\u04c0-\u04c1\u04c3\u04c5\u04c7\u04c9\u04cb\u04cd\u04d0\u04d2\u04d4\u04d6\u04d8\u04da\u04dc\u04de\u04e0\u04e2\u04e4\u04e6\u04e8\u04ea\u04ec\u04ee\u04f0\u04f2\u04f4\u04f6\u04f8\u04fa\u04fc\u04fe\u0500\u0502\u0504\u0506\u0508\u050a\u050c\u050e\u0510\u0512\u0514\u0516\u0518\u051a\u051c\u051e\u0520\u0522\u0524\u0526\u0528\u052a\u052c\u052e\u0531-\u0556\u10a0-\u10c5\u10c7\u10cd\u13a0-\u13f5\u1c90-\u1cba\u1cbd-\u1cbf\u1e00\u1e02\u1e04\u1e06\u1e08\u1e0a\u1e0c\u1e0e\u1e10\u1e12\u1e14\u1e16\u1e18\u1e1a\u1e1c\u1e1e\u1e20\u1e22\u1e24\u1e26\u1e28\u1e2a\u1e2c\u1e2e\u1e30\u1e32\u1e34\u1e36\u1e38\u1e3a\u1e3c\u1e3e\u1e40\u1e42\u1e44\u1e46\u1e48\u1e4a\u1e4c\u1e4e\u1e50\u1e52\u1e54\u1e56\u1e58\u1e5a\u1e5c\u1e5e\u1e60\u1e62\u1e64\u1e66\u1e68\u1e6a\u1e6c\u1e6e\u1e70\u1e72\u1e74\u1e76\u1e78\u1e7a\u1e7c\u1e7e\u1e80\u1e82\u1e84\u1e86\u1e88\u1e8a\u1e8c\u1e8e\u1e90\u1e92\u1e94\u1e9e\u1ea0\u1ea2\u1ea4\u1ea6\u1ea8\u1eaa\u1eac\u1eae\u1eb0\u1eb2\u1eb4\u1eb6\u1eb8\u1eba\u1ebc\u1ebe\u1ec0\u1ec2\u1ec4\u1ec6\u1ec8\u1eca\u1ecc\u1ece\u1ed0\u1ed2\u1ed4\u1ed6\u1ed8\u1eda\u1edc\u1ede\u1ee0\u1ee2\u1ee4\u1ee6\u1ee8\u1eea\u1eec\u1eee\u1ef0\u1ef2\u1ef4\u1ef6\u1ef8\u1efa\u1efc\u1efe\u1f08-\u1f0f\u1f18-\u1f1d\u1f28-\u1f2f\u1f38-\u1f3f\u1f48-\u1f4d\u1f59\u1f5b\u1f5d\u1f5f\u1f68-\u1f6f\u1fb8-\u1fbb\u1fc8-\u1fcb\u1fd8-\u1fdb\u1fe8-\u1fec\u1ff8-\u1ffb\u2102\u2107\u210b-\u210d\u2110-\u2112\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u2130-\u2133\u213e-\u213f\u2145\u2183\u2c00-\u2c2e\u2c60\u2c62-\u2c64\u2c67\u2c69\u2c6b\u2c6d-\u2c70\u2c72\u2c75\u2c7e-\u2c80\u2c82\u2c84\u2c86\u2c88\u2c8a\u2c8c\u2c8e\u2c90\u2c92\u2c94\u2c96\u2c98\u2c9a\u2c9c\u2c9e\u2ca0\u2ca2\u2ca4\u2ca6\u2ca8\u2caa\u2cac\u2cae\u2cb0\u2cb2\u2cb4\u2cb6\u2cb8\u2cba\u2cbc\u2cbe\u2cc0\u2cc2\u2cc4\u2cc6\u2cc8\u2cca\u2ccc\u2cce\u2cd0\u2cd2\u2cd4\u2cd6\u2cd8\u2cda\u2cdc\u2cde\u2ce0\u2ce2\u2ceb\u2ced\u2cf2\ua640\ua642\ua644\ua646\ua648\ua64a\ua64c\ua64e\ua650\ua652\ua654\ua656\ua658\ua65a\ua65c\ua65e\ua660\ua662\ua664\ua666\ua668\ua66a\ua66c\ua680\ua682\ua684\ua686\ua688\ua68a\ua68c\ua68e\ua690\ua692\ua694\ua696\ua698\ua69a\ua722\ua724\ua726\ua728\ua72a\ua72c\ua72e\ua732\ua734\ua736\ua738\ua73a\ua73c\ua73e\ua740\ua742\ua744\ua746\ua748\ua74a\ua74c\ua74e\ua750\ua752\ua754\ua756\ua758\ua75a\ua75c\ua75e\ua760\ua762\ua764\ua766\ua768\ua76a\ua76c\ua76e\ua779\ua77b\ua77d-\ua77e\ua780\ua782\ua784\ua786\ua78b\ua78d\ua790\ua792\ua796\ua798\ua79a\ua79c\ua79e\ua7a0\ua7a2\ua7a4\ua7a6\ua7a8\ua7aa-\ua7ae\ua7b0-\ua7b4\ua7b6\ua7b8\uff21-\uff3a\U00010400-\U00010427\U000104b0-\U000104d3\U00010c80-\U00010cb2\U000118a0-\U000118bf\U00016e40-\U00016e5f\U0001d400-\U0001d419\U0001d434-\U0001d44d\U0001d468-\U0001d481\U0001d49c\U0001d49e-\U0001d49f\U0001d4a2\U0001d4a5-\U0001d4a6\U0001d4a9-\U0001d4ac\U0001d4ae-\U0001d4b5\U0001d4d0-\U0001d4e9\U0001d504-\U0001d505\U0001d507-\U0001d50a\U0001d50d-\U0001d514\U0001d516-\U0001d51c\U0001d538-\U0001d539\U0001d53b-\U0001d53e\U0001d540-\U0001d544\U0001d546\U0001d54a-\U0001d550\U0001d56c-\U0001d585\U0001d5a0-\U0001d5b9\U0001d5d4-\U0001d5ed\U0001d608-\U0001d621\U0001d63c-\U0001d655\U0001d670-\U0001d689\U0001d6a8-\U0001d6c0\U0001d6e2-\U0001d6fa\U0001d71c-\U0001d734\U0001d756-\U0001d76e\U0001d790-\U0001d7a8\U0001d7ca\U0001e900-\U0001e921' - -Mc = '\u0903\u093b\u093e-\u0940\u0949-\u094c\u094e-\u094f\u0982-\u0983\u09be-\u09c0\u09c7-\u09c8\u09cb-\u09cc\u09d7\u0a03\u0a3e-\u0a40\u0a83\u0abe-\u0ac0\u0ac9\u0acb-\u0acc\u0b02-\u0b03\u0b3e\u0b40\u0b47-\u0b48\u0b4b-\u0b4c\u0b57\u0bbe-\u0bbf\u0bc1-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcc\u0bd7\u0c01-\u0c03\u0c41-\u0c44\u0c82-\u0c83\u0cbe\u0cc0-\u0cc4\u0cc7-\u0cc8\u0cca-\u0ccb\u0cd5-\u0cd6\u0d02-\u0d03\u0d3e-\u0d40\u0d46-\u0d48\u0d4a-\u0d4c\u0d57\u0d82-\u0d83\u0dcf-\u0dd1\u0dd8-\u0ddf\u0df2-\u0df3\u0f3e-\u0f3f\u0f7f\u102b-\u102c\u1031\u1038\u103b-\u103c\u1056-\u1057\u1062-\u1064\u1067-\u106d\u1083-\u1084\u1087-\u108c\u108f\u109a-\u109c\u17b6\u17be-\u17c5\u17c7-\u17c8\u1923-\u1926\u1929-\u192b\u1930-\u1931\u1933-\u1938\u1a19-\u1a1a\u1a55\u1a57\u1a61\u1a63-\u1a64\u1a6d-\u1a72\u1b04\u1b35\u1b3b\u1b3d-\u1b41\u1b43-\u1b44\u1b82\u1ba1\u1ba6-\u1ba7\u1baa\u1be7\u1bea-\u1bec\u1bee\u1bf2-\u1bf3\u1c24-\u1c2b\u1c34-\u1c35\u1ce1\u1cf2-\u1cf3\u1cf7\u302e-\u302f\ua823-\ua824\ua827\ua880-\ua881\ua8b4-\ua8c3\ua952-\ua953\ua983\ua9b4-\ua9b5\ua9ba-\ua9bb\ua9bd-\ua9c0\uaa2f-\uaa30\uaa33-\uaa34\uaa4d\uaa7b\uaa7d\uaaeb\uaaee-\uaaef\uaaf5\uabe3-\uabe4\uabe6-\uabe7\uabe9-\uabea\uabec\U00011000\U00011002\U00011082\U000110b0-\U000110b2\U000110b7-\U000110b8\U0001112c\U00011145-\U00011146\U00011182\U000111b3-\U000111b5\U000111bf-\U000111c0\U0001122c-\U0001122e\U00011232-\U00011233\U00011235\U000112e0-\U000112e2\U00011302-\U00011303\U0001133e-\U0001133f\U00011341-\U00011344\U00011347-\U00011348\U0001134b-\U0001134d\U00011357\U00011362-\U00011363\U00011435-\U00011437\U00011440-\U00011441\U00011445\U000114b0-\U000114b2\U000114b9\U000114bb-\U000114be\U000114c1\U000115af-\U000115b1\U000115b8-\U000115bb\U000115be\U00011630-\U00011632\U0001163b-\U0001163c\U0001163e\U000116ac\U000116ae-\U000116af\U000116b6\U00011720-\U00011721\U00011726\U0001182c-\U0001182e\U00011838\U00011a39\U00011a57-\U00011a58\U00011a97\U00011c2f\U00011c3e\U00011ca9\U00011cb1\U00011cb4\U00011d8a-\U00011d8e\U00011d93-\U00011d94\U00011d96\U00011ef5-\U00011ef6\U00016f51-\U00016f7e\U0001d165-\U0001d166\U0001d16d-\U0001d172' - -Me = '\u0488-\u0489\u1abe\u20dd-\u20e0\u20e2-\u20e4\ua670-\ua672' - -Mn = '\u0300-\u036f\u0483-\u0487\u0591-\u05bd\u05bf\u05c1-\u05c2\u05c4-\u05c5\u05c7\u0610-\u061a\u064b-\u065f\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7-\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08d3-\u08e1\u08e3-\u0902\u093a\u093c\u0941-\u0948\u094d\u0951-\u0957\u0962-\u0963\u0981\u09bc\u09c1-\u09c4\u09cd\u09e2-\u09e3\u09fe\u0a01-\u0a02\u0a3c\u0a41-\u0a42\u0a47-\u0a48\u0a4b-\u0a4d\u0a51\u0a70-\u0a71\u0a75\u0a81-\u0a82\u0abc\u0ac1-\u0ac5\u0ac7-\u0ac8\u0acd\u0ae2-\u0ae3\u0afa-\u0aff\u0b01\u0b3c\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b62-\u0b63\u0b82\u0bc0\u0bcd\u0c00\u0c04\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55-\u0c56\u0c62-\u0c63\u0c81\u0cbc\u0cbf\u0cc6\u0ccc-\u0ccd\u0ce2-\u0ce3\u0d00-\u0d01\u0d3b-\u0d3c\u0d41-\u0d44\u0d4d\u0d62-\u0d63\u0dca\u0dd2-\u0dd4\u0dd6\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb-\u0ebc\u0ec8-\u0ecd\u0f18-\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86-\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039-\u103a\u103d-\u103e\u1058-\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085-\u1086\u108d\u109d\u135d-\u135f\u1712-\u1714\u1732-\u1734\u1752-\u1753\u1772-\u1773\u17b4-\u17b5\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u1885-\u1886\u18a9\u1920-\u1922\u1927-\u1928\u1932\u1939-\u193b\u1a17-\u1a18\u1a1b\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1ab0-\u1abd\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80-\u1b81\u1ba2-\u1ba5\u1ba8-\u1ba9\u1bab-\u1bad\u1be6\u1be8-\u1be9\u1bed\u1bef-\u1bf1\u1c2c-\u1c33\u1c36-\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1cf4\u1cf8-\u1cf9\u1dc0-\u1df9\u1dfb-\u1dff\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302d\u3099-\u309a\ua66f\ua674-\ua67d\ua69e-\ua69f\ua6f0-\ua6f1\ua802\ua806\ua80b\ua825-\ua826\ua8c4-\ua8c5\ua8e0-\ua8f1\ua8ff\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\ua9e5\uaa29-\uaa2e\uaa31-\uaa32\uaa35-\uaa36\uaa43\uaa4c\uaa7c\uaab0\uaab2-\uaab4\uaab7-\uaab8\uaabe-\uaabf\uaac1\uaaec-\uaaed\uaaf6\uabe5\uabe8\uabed\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\U000101fd\U000102e0\U00010376-\U0001037a\U00010a01-\U00010a03\U00010a05-\U00010a06\U00010a0c-\U00010a0f\U00010a38-\U00010a3a\U00010a3f\U00010ae5-\U00010ae6\U00010d24-\U00010d27\U00010f46-\U00010f50\U00011001\U00011038-\U00011046\U0001107f-\U00011081\U000110b3-\U000110b6\U000110b9-\U000110ba\U00011100-\U00011102\U00011127-\U0001112b\U0001112d-\U00011134\U00011173\U00011180-\U00011181\U000111b6-\U000111be\U000111c9-\U000111cc\U0001122f-\U00011231\U00011234\U00011236-\U00011237\U0001123e\U000112df\U000112e3-\U000112ea\U00011300-\U00011301\U0001133b-\U0001133c\U00011340\U00011366-\U0001136c\U00011370-\U00011374\U00011438-\U0001143f\U00011442-\U00011444\U00011446\U0001145e\U000114b3-\U000114b8\U000114ba\U000114bf-\U000114c0\U000114c2-\U000114c3\U000115b2-\U000115b5\U000115bc-\U000115bd\U000115bf-\U000115c0\U000115dc-\U000115dd\U00011633-\U0001163a\U0001163d\U0001163f-\U00011640\U000116ab\U000116ad\U000116b0-\U000116b5\U000116b7\U0001171d-\U0001171f\U00011722-\U00011725\U00011727-\U0001172b\U0001182f-\U00011837\U00011839-\U0001183a\U00011a01-\U00011a0a\U00011a33-\U00011a38\U00011a3b-\U00011a3e\U00011a47\U00011a51-\U00011a56\U00011a59-\U00011a5b\U00011a8a-\U00011a96\U00011a98-\U00011a99\U00011c30-\U00011c36\U00011c38-\U00011c3d\U00011c3f\U00011c92-\U00011ca7\U00011caa-\U00011cb0\U00011cb2-\U00011cb3\U00011cb5-\U00011cb6\U00011d31-\U00011d36\U00011d3a\U00011d3c-\U00011d3d\U00011d3f-\U00011d45\U00011d47\U00011d90-\U00011d91\U00011d95\U00011d97\U00011ef3-\U00011ef4\U00016af0-\U00016af4\U00016b30-\U00016b36\U00016f8f-\U00016f92\U0001bc9d-\U0001bc9e\U0001d167-\U0001d169\U0001d17b-\U0001d182\U0001d185-\U0001d18b\U0001d1aa-\U0001d1ad\U0001d242-\U0001d244\U0001da00-\U0001da36\U0001da3b-\U0001da6c\U0001da75\U0001da84\U0001da9b-\U0001da9f\U0001daa1-\U0001daaf\U0001e000-\U0001e006\U0001e008-\U0001e018\U0001e01b-\U0001e021\U0001e023-\U0001e024\U0001e026-\U0001e02a\U0001e8d0-\U0001e8d6\U0001e944-\U0001e94a\U000e0100-\U000e01ef' - -Nd = '0-9\u0660-\u0669\u06f0-\u06f9\u07c0-\u07c9\u0966-\u096f\u09e6-\u09ef\u0a66-\u0a6f\u0ae6-\u0aef\u0b66-\u0b6f\u0be6-\u0bef\u0c66-\u0c6f\u0ce6-\u0cef\u0d66-\u0d6f\u0de6-\u0def\u0e50-\u0e59\u0ed0-\u0ed9\u0f20-\u0f29\u1040-\u1049\u1090-\u1099\u17e0-\u17e9\u1810-\u1819\u1946-\u194f\u19d0-\u19d9\u1a80-\u1a89\u1a90-\u1a99\u1b50-\u1b59\u1bb0-\u1bb9\u1c40-\u1c49\u1c50-\u1c59\ua620-\ua629\ua8d0-\ua8d9\ua900-\ua909\ua9d0-\ua9d9\ua9f0-\ua9f9\uaa50-\uaa59\uabf0-\uabf9\uff10-\uff19\U000104a0-\U000104a9\U00010d30-\U00010d39\U00011066-\U0001106f\U000110f0-\U000110f9\U00011136-\U0001113f\U000111d0-\U000111d9\U000112f0-\U000112f9\U00011450-\U00011459\U000114d0-\U000114d9\U00011650-\U00011659\U000116c0-\U000116c9\U00011730-\U00011739\U000118e0-\U000118e9\U00011c50-\U00011c59\U00011d50-\U00011d59\U00011da0-\U00011da9\U00016a60-\U00016a69\U00016b50-\U00016b59\U0001d7ce-\U0001d7ff\U0001e950-\U0001e959' - -Nl = '\u16ee-\u16f0\u2160-\u2182\u2185-\u2188\u3007\u3021-\u3029\u3038-\u303a\ua6e6-\ua6ef\U00010140-\U00010174\U00010341\U0001034a\U000103d1-\U000103d5\U00012400-\U0001246e' - -No = '\xb2-\xb3\xb9\xbc-\xbe\u09f4-\u09f9\u0b72-\u0b77\u0bf0-\u0bf2\u0c78-\u0c7e\u0d58-\u0d5e\u0d70-\u0d78\u0f2a-\u0f33\u1369-\u137c\u17f0-\u17f9\u19da\u2070\u2074-\u2079\u2080-\u2089\u2150-\u215f\u2189\u2460-\u249b\u24ea-\u24ff\u2776-\u2793\u2cfd\u3192-\u3195\u3220-\u3229\u3248-\u324f\u3251-\u325f\u3280-\u3289\u32b1-\u32bf\ua830-\ua835\U00010107-\U00010133\U00010175-\U00010178\U0001018a-\U0001018b\U000102e1-\U000102fb\U00010320-\U00010323\U00010858-\U0001085f\U00010879-\U0001087f\U000108a7-\U000108af\U000108fb-\U000108ff\U00010916-\U0001091b\U000109bc-\U000109bd\U000109c0-\U000109cf\U000109d2-\U000109ff\U00010a40-\U00010a48\U00010a7d-\U00010a7e\U00010a9d-\U00010a9f\U00010aeb-\U00010aef\U00010b58-\U00010b5f\U00010b78-\U00010b7f\U00010ba9-\U00010baf\U00010cfa-\U00010cff\U00010e60-\U00010e7e\U00010f1d-\U00010f26\U00010f51-\U00010f54\U00011052-\U00011065\U000111e1-\U000111f4\U0001173a-\U0001173b\U000118ea-\U000118f2\U00011c5a-\U00011c6c\U00016b5b-\U00016b61\U00016e80-\U00016e96\U0001d2e0-\U0001d2f3\U0001d360-\U0001d378\U0001e8c7-\U0001e8cf\U0001ec71-\U0001ecab\U0001ecad-\U0001ecaf\U0001ecb1-\U0001ecb4\U0001f100-\U0001f10c' - -Pc = '_\u203f-\u2040\u2054\ufe33-\ufe34\ufe4d-\ufe4f\uff3f' - -Pd = '\\-\u058a\u05be\u1400\u1806\u2010-\u2015\u2e17\u2e1a\u2e3a-\u2e3b\u2e40\u301c\u3030\u30a0\ufe31-\ufe32\ufe58\ufe63\uff0d' - -Pe = ')\\]}\u0f3b\u0f3d\u169c\u2046\u207e\u208e\u2309\u230b\u232a\u2769\u276b\u276d\u276f\u2771\u2773\u2775\u27c6\u27e7\u27e9\u27eb\u27ed\u27ef\u2984\u2986\u2988\u298a\u298c\u298e\u2990\u2992\u2994\u2996\u2998\u29d9\u29db\u29fd\u2e23\u2e25\u2e27\u2e29\u3009\u300b\u300d\u300f\u3011\u3015\u3017\u3019\u301b\u301e-\u301f\ufd3e\ufe18\ufe36\ufe38\ufe3a\ufe3c\ufe3e\ufe40\ufe42\ufe44\ufe48\ufe5a\ufe5c\ufe5e\uff09\uff3d\uff5d\uff60\uff63' - -Pf = '\xbb\u2019\u201d\u203a\u2e03\u2e05\u2e0a\u2e0d\u2e1d\u2e21' - -Pi = '\xab\u2018\u201b-\u201c\u201f\u2039\u2e02\u2e04\u2e09\u2e0c\u2e1c\u2e20' - -Po = "!-#%-'*,.-/:-;?-@\\\\\xa1\xa7\xb6-\xb7\xbf\u037e\u0387\u055a-\u055f\u0589\u05c0\u05c3\u05c6\u05f3-\u05f4\u0609-\u060a\u060c-\u060d\u061b\u061e-\u061f\u066a-\u066d\u06d4\u0700-\u070d\u07f7-\u07f9\u0830-\u083e\u085e\u0964-\u0965\u0970\u09fd\u0a76\u0af0\u0c84\u0df4\u0e4f\u0e5a-\u0e5b\u0f04-\u0f12\u0f14\u0f85\u0fd0-\u0fd4\u0fd9-\u0fda\u104a-\u104f\u10fb\u1360-\u1368\u166d-\u166e\u16eb-\u16ed\u1735-\u1736\u17d4-\u17d6\u17d8-\u17da\u1800-\u1805\u1807-\u180a\u1944-\u1945\u1a1e-\u1a1f\u1aa0-\u1aa6\u1aa8-\u1aad\u1b5a-\u1b60\u1bfc-\u1bff\u1c3b-\u1c3f\u1c7e-\u1c7f\u1cc0-\u1cc7\u1cd3\u2016-\u2017\u2020-\u2027\u2030-\u2038\u203b-\u203e\u2041-\u2043\u2047-\u2051\u2053\u2055-\u205e\u2cf9-\u2cfc\u2cfe-\u2cff\u2d70\u2e00-\u2e01\u2e06-\u2e08\u2e0b\u2e0e-\u2e16\u2e18-\u2e19\u2e1b\u2e1e-\u2e1f\u2e2a-\u2e2e\u2e30-\u2e39\u2e3c-\u2e3f\u2e41\u2e43-\u2e4e\u3001-\u3003\u303d\u30fb\ua4fe-\ua4ff\ua60d-\ua60f\ua673\ua67e\ua6f2-\ua6f7\ua874-\ua877\ua8ce-\ua8cf\ua8f8-\ua8fa\ua8fc\ua92e-\ua92f\ua95f\ua9c1-\ua9cd\ua9de-\ua9df\uaa5c-\uaa5f\uaade-\uaadf\uaaf0-\uaaf1\uabeb\ufe10-\ufe16\ufe19\ufe30\ufe45-\ufe46\ufe49-\ufe4c\ufe50-\ufe52\ufe54-\ufe57\ufe5f-\ufe61\ufe68\ufe6a-\ufe6b\uff01-\uff03\uff05-\uff07\uff0a\uff0c\uff0e-\uff0f\uff1a-\uff1b\uff1f-\uff20\uff3c\uff61\uff64-\uff65\U00010100-\U00010102\U0001039f\U000103d0\U0001056f\U00010857\U0001091f\U0001093f\U00010a50-\U00010a58\U00010a7f\U00010af0-\U00010af6\U00010b39-\U00010b3f\U00010b99-\U00010b9c\U00010f55-\U00010f59\U00011047-\U0001104d\U000110bb-\U000110bc\U000110be-\U000110c1\U00011140-\U00011143\U00011174-\U00011175\U000111c5-\U000111c8\U000111cd\U000111db\U000111dd-\U000111df\U00011238-\U0001123d\U000112a9\U0001144b-\U0001144f\U0001145b\U0001145d\U000114c6\U000115c1-\U000115d7\U00011641-\U00011643\U00011660-\U0001166c\U0001173c-\U0001173e\U0001183b\U00011a3f-\U00011a46\U00011a9a-\U00011a9c\U00011a9e-\U00011aa2\U00011c41-\U00011c45\U00011c70-\U00011c71\U00011ef7-\U00011ef8\U00012470-\U00012474\U00016a6e-\U00016a6f\U00016af5\U00016b37-\U00016b3b\U00016b44\U00016e97-\U00016e9a\U0001bc9f\U0001da87-\U0001da8b\U0001e95e-\U0001e95f" - -Ps = '(\\[{\u0f3a\u0f3c\u169b\u201a\u201e\u2045\u207d\u208d\u2308\u230a\u2329\u2768\u276a\u276c\u276e\u2770\u2772\u2774\u27c5\u27e6\u27e8\u27ea\u27ec\u27ee\u2983\u2985\u2987\u2989\u298b\u298d\u298f\u2991\u2993\u2995\u2997\u29d8\u29da\u29fc\u2e22\u2e24\u2e26\u2e28\u2e42\u3008\u300a\u300c\u300e\u3010\u3014\u3016\u3018\u301a\u301d\ufd3f\ufe17\ufe35\ufe37\ufe39\ufe3b\ufe3d\ufe3f\ufe41\ufe43\ufe47\ufe59\ufe5b\ufe5d\uff08\uff3b\uff5b\uff5f\uff62' - -Sc = '$\xa2-\xa5\u058f\u060b\u07fe-\u07ff\u09f2-\u09f3\u09fb\u0af1\u0bf9\u0e3f\u17db\u20a0-\u20bf\ua838\ufdfc\ufe69\uff04\uffe0-\uffe1\uffe5-\uffe6\U0001ecb0' - -Sk = '\\^`\xa8\xaf\xb4\xb8\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384-\u0385\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd-\u1ffe\u309b-\u309c\ua700-\ua716\ua720-\ua721\ua789-\ua78a\uab5b\ufbb2-\ufbc1\uff3e\uff40\uffe3\U0001f3fb-\U0001f3ff' - -Sm = '+<->|~\xac\xb1\xd7\xf7\u03f6\u0606-\u0608\u2044\u2052\u207a-\u207c\u208a-\u208c\u2118\u2140-\u2144\u214b\u2190-\u2194\u219a-\u219b\u21a0\u21a3\u21a6\u21ae\u21ce-\u21cf\u21d2\u21d4\u21f4-\u22ff\u2320-\u2321\u237c\u239b-\u23b3\u23dc-\u23e1\u25b7\u25c1\u25f8-\u25ff\u266f\u27c0-\u27c4\u27c7-\u27e5\u27f0-\u27ff\u2900-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2aff\u2b30-\u2b44\u2b47-\u2b4c\ufb29\ufe62\ufe64-\ufe66\uff0b\uff1c-\uff1e\uff5c\uff5e\uffe2\uffe9-\uffec\U0001d6c1\U0001d6db\U0001d6fb\U0001d715\U0001d735\U0001d74f\U0001d76f\U0001d789\U0001d7a9\U0001d7c3\U0001eef0-\U0001eef1' - -So = '\xa6\xa9\xae\xb0\u0482\u058d-\u058e\u060e-\u060f\u06de\u06e9\u06fd-\u06fe\u07f6\u09fa\u0b70\u0bf3-\u0bf8\u0bfa\u0c7f\u0d4f\u0d79\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce-\u0fcf\u0fd5-\u0fd8\u109e-\u109f\u1390-\u1399\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u2100-\u2101\u2103-\u2106\u2108-\u2109\u2114\u2116-\u2117\u211e-\u2123\u2125\u2127\u2129\u212e\u213a-\u213b\u214a\u214c-\u214d\u214f\u218a-\u218b\u2195-\u2199\u219c-\u219f\u21a1-\u21a2\u21a4-\u21a5\u21a7-\u21ad\u21af-\u21cd\u21d0-\u21d1\u21d3\u21d5-\u21f3\u2300-\u2307\u230c-\u231f\u2322-\u2328\u232b-\u237b\u237d-\u239a\u23b4-\u23db\u23e2-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u25b6\u25b8-\u25c0\u25c2-\u25f7\u2600-\u266e\u2670-\u2767\u2794-\u27bf\u2800-\u28ff\u2b00-\u2b2f\u2b45-\u2b46\u2b4d-\u2b73\u2b76-\u2b95\u2b98-\u2bc8\u2bca-\u2bfe\u2ce5-\u2cea\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012-\u3013\u3020\u3036-\u3037\u303e-\u303f\u3190-\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u32fe\u3300-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua828-\ua82b\ua836-\ua837\ua839\uaa77-\uaa79\ufdfd\uffe4\uffe8\uffed-\uffee\ufffc-\ufffd\U00010137-\U0001013f\U00010179-\U00010189\U0001018c-\U0001018e\U00010190-\U0001019b\U000101a0\U000101d0-\U000101fc\U00010877-\U00010878\U00010ac8\U0001173f\U00016b3c-\U00016b3f\U00016b45\U0001bc9c\U0001d000-\U0001d0f5\U0001d100-\U0001d126\U0001d129-\U0001d164\U0001d16a-\U0001d16c\U0001d183-\U0001d184\U0001d18c-\U0001d1a9\U0001d1ae-\U0001d1e8\U0001d200-\U0001d241\U0001d245\U0001d300-\U0001d356\U0001d800-\U0001d9ff\U0001da37-\U0001da3a\U0001da6d-\U0001da74\U0001da76-\U0001da83\U0001da85-\U0001da86\U0001ecac\U0001f000-\U0001f02b\U0001f030-\U0001f093\U0001f0a0-\U0001f0ae\U0001f0b1-\U0001f0bf\U0001f0c1-\U0001f0cf\U0001f0d1-\U0001f0f5\U0001f110-\U0001f16b\U0001f170-\U0001f1ac\U0001f1e6-\U0001f202\U0001f210-\U0001f23b\U0001f240-\U0001f248\U0001f250-\U0001f251\U0001f260-\U0001f265\U0001f300-\U0001f3fa\U0001f400-\U0001f6d4\U0001f6e0-\U0001f6ec\U0001f6f0-\U0001f6f9\U0001f700-\U0001f773\U0001f780-\U0001f7d8\U0001f800-\U0001f80b\U0001f810-\U0001f847\U0001f850-\U0001f859\U0001f860-\U0001f887\U0001f890-\U0001f8ad\U0001f900-\U0001f90b\U0001f910-\U0001f93e\U0001f940-\U0001f970\U0001f973-\U0001f976\U0001f97a\U0001f97c-\U0001f9a2\U0001f9b0-\U0001f9b9\U0001f9c0-\U0001f9c2\U0001f9d0-\U0001f9ff\U0001fa60-\U0001fa6d' - -Zl = '\u2028' - -Zp = '\u2029' - -Zs = ' \xa0\u1680\u2000-\u200a\u202f\u205f\u3000' - -xid_continue = '0-9A-Z_a-z\xaa\xb5\xb7\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0300-\u0374\u0376-\u0377\u037b-\u037d\u037f\u0386-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u0483-\u0487\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u0591-\u05bd\u05bf\u05c1-\u05c2\u05c4-\u05c5\u05c7\u05d0-\u05ea\u05ef-\u05f2\u0610-\u061a\u0620-\u0669\u066e-\u06d3\u06d5-\u06dc\u06df-\u06e8\u06ea-\u06fc\u06ff\u0710-\u074a\u074d-\u07b1\u07c0-\u07f5\u07fa\u07fd\u0800-\u082d\u0840-\u085b\u0860-\u086a\u08a0-\u08b4\u08b6-\u08bd\u08d3-\u08e1\u08e3-\u0963\u0966-\u096f\u0971-\u0983\u0985-\u098c\u098f-\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7-\u09c8\u09cb-\u09ce\u09d7\u09dc-\u09dd\u09df-\u09e3\u09e6-\u09f1\u09fc\u09fe\u0a01-\u0a03\u0a05-\u0a0a\u0a0f-\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32-\u0a33\u0a35-\u0a36\u0a38-\u0a39\u0a3c\u0a3e-\u0a42\u0a47-\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a66-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2-\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0ae6-\u0aef\u0af9-\u0aff\u0b01-\u0b03\u0b05-\u0b0c\u0b0f-\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32-\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47-\u0b48\u0b4b-\u0b4d\u0b56-\u0b57\u0b5c-\u0b5d\u0b5f-\u0b63\u0b66-\u0b6f\u0b71\u0b82-\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99-\u0b9a\u0b9c\u0b9e-\u0b9f\u0ba3-\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0be6-\u0bef\u0c00-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55-\u0c56\u0c58-\u0c5a\u0c60-\u0c63\u0c66-\u0c6f\u0c80-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5-\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1-\u0cf2\u0d00-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d44\u0d46-\u0d48\u0d4a-\u0d4e\u0d54-\u0d57\u0d5f-\u0d63\u0d66-\u0d6f\u0d7a-\u0d7f\u0d82-\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2-\u0df3\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e81-\u0e82\u0e84\u0e87-\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa-\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edf\u0f00\u0f18-\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e-\u0f47\u0f49-\u0f6c\u0f71-\u0f84\u0f86-\u0f97\u0f99-\u0fbc\u0fc6\u1000-\u1049\u1050-\u109d\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u135d-\u135f\u1369-\u1371\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772-\u1773\u1780-\u17d3\u17d7\u17dc-\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u1820-\u1878\u1880-\u18aa\u18b0-\u18f5\u1900-\u191e\u1920-\u192b\u1930-\u193b\u1946-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19da\u1a00-\u1a1b\u1a20-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1aa7\u1ab0-\u1abd\u1b00-\u1b4b\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1bf3\u1c00-\u1c37\u1c40-\u1c49\u1c4d-\u1c7d\u1c80-\u1c88\u1c90-\u1cba\u1cbd-\u1cbf\u1cd0-\u1cd2\u1cd4-\u1cf9\u1d00-\u1df9\u1dfb-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u203f-\u2040\u2054\u2071\u207f\u2090-\u209c\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d7f-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2de0-\u2dff\u3005-\u3007\u3021-\u302f\u3031-\u3035\u3038-\u303c\u3041-\u3096\u3099-\u309a\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fef\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua62b\ua640-\ua66f\ua674-\ua67d\ua67f-\ua6f1\ua717-\ua71f\ua722-\ua788\ua78b-\ua7b9\ua7f7-\ua827\ua840-\ua873\ua880-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f7\ua8fb\ua8fd-\ua92d\ua930-\ua953\ua960-\ua97c\ua980-\ua9c0\ua9cf-\ua9d9\ua9e0-\ua9fe\uaa00-\uaa36\uaa40-\uaa4d\uaa50-\uaa59\uaa60-\uaa76\uaa7a-\uaac2\uaadb-\uaadd\uaae0-\uaaef\uaaf2-\uaaf6\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab65\uab70-\uabea\uabec-\uabed\uabf0-\uabf9\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufbb1\ufbd3-\ufc5d\ufc64-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdf9\ufe00-\ufe0f\ufe20-\ufe2f\ufe33-\ufe34\ufe4d-\ufe4f\ufe71\ufe73\ufe77\ufe79\ufe7b\ufe7d\ufe7f-\ufefc\uff10-\uff19\uff21-\uff3a\uff3f\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc\U00010000-\U0001000b\U0001000d-\U00010026\U00010028-\U0001003a\U0001003c-\U0001003d\U0001003f-\U0001004d\U00010050-\U0001005d\U00010080-\U000100fa\U00010140-\U00010174\U000101fd\U00010280-\U0001029c\U000102a0-\U000102d0\U000102e0\U00010300-\U0001031f\U0001032d-\U0001034a\U00010350-\U0001037a\U00010380-\U0001039d\U000103a0-\U000103c3\U000103c8-\U000103cf\U000103d1-\U000103d5\U00010400-\U0001049d\U000104a0-\U000104a9\U000104b0-\U000104d3\U000104d8-\U000104fb\U00010500-\U00010527\U00010530-\U00010563\U00010600-\U00010736\U00010740-\U00010755\U00010760-\U00010767\U00010800-\U00010805\U00010808\U0001080a-\U00010835\U00010837-\U00010838\U0001083c\U0001083f-\U00010855\U00010860-\U00010876\U00010880-\U0001089e\U000108e0-\U000108f2\U000108f4-\U000108f5\U00010900-\U00010915\U00010920-\U00010939\U00010980-\U000109b7\U000109be-\U000109bf\U00010a00-\U00010a03\U00010a05-\U00010a06\U00010a0c-\U00010a13\U00010a15-\U00010a17\U00010a19-\U00010a35\U00010a38-\U00010a3a\U00010a3f\U00010a60-\U00010a7c\U00010a80-\U00010a9c\U00010ac0-\U00010ac7\U00010ac9-\U00010ae6\U00010b00-\U00010b35\U00010b40-\U00010b55\U00010b60-\U00010b72\U00010b80-\U00010b91\U00010c00-\U00010c48\U00010c80-\U00010cb2\U00010cc0-\U00010cf2\U00010d00-\U00010d27\U00010d30-\U00010d39\U00010f00-\U00010f1c\U00010f27\U00010f30-\U00010f50\U00011000-\U00011046\U00011066-\U0001106f\U0001107f-\U000110ba\U000110d0-\U000110e8\U000110f0-\U000110f9\U00011100-\U00011134\U00011136-\U0001113f\U00011144-\U00011146\U00011150-\U00011173\U00011176\U00011180-\U000111c4\U000111c9-\U000111cc\U000111d0-\U000111da\U000111dc\U00011200-\U00011211\U00011213-\U00011237\U0001123e\U00011280-\U00011286\U00011288\U0001128a-\U0001128d\U0001128f-\U0001129d\U0001129f-\U000112a8\U000112b0-\U000112ea\U000112f0-\U000112f9\U00011300-\U00011303\U00011305-\U0001130c\U0001130f-\U00011310\U00011313-\U00011328\U0001132a-\U00011330\U00011332-\U00011333\U00011335-\U00011339\U0001133b-\U00011344\U00011347-\U00011348\U0001134b-\U0001134d\U00011350\U00011357\U0001135d-\U00011363\U00011366-\U0001136c\U00011370-\U00011374\U00011400-\U0001144a\U00011450-\U00011459\U0001145e\U00011480-\U000114c5\U000114c7\U000114d0-\U000114d9\U00011580-\U000115b5\U000115b8-\U000115c0\U000115d8-\U000115dd\U00011600-\U00011640\U00011644\U00011650-\U00011659\U00011680-\U000116b7\U000116c0-\U000116c9\U00011700-\U0001171a\U0001171d-\U0001172b\U00011730-\U00011739\U00011800-\U0001183a\U000118a0-\U000118e9\U000118ff\U00011a00-\U00011a3e\U00011a47\U00011a50-\U00011a83\U00011a86-\U00011a99\U00011a9d\U00011ac0-\U00011af8\U00011c00-\U00011c08\U00011c0a-\U00011c36\U00011c38-\U00011c40\U00011c50-\U00011c59\U00011c72-\U00011c8f\U00011c92-\U00011ca7\U00011ca9-\U00011cb6\U00011d00-\U00011d06\U00011d08-\U00011d09\U00011d0b-\U00011d36\U00011d3a\U00011d3c-\U00011d3d\U00011d3f-\U00011d47\U00011d50-\U00011d59\U00011d60-\U00011d65\U00011d67-\U00011d68\U00011d6a-\U00011d8e\U00011d90-\U00011d91\U00011d93-\U00011d98\U00011da0-\U00011da9\U00011ee0-\U00011ef6\U00012000-\U00012399\U00012400-\U0001246e\U00012480-\U00012543\U00013000-\U0001342e\U00014400-\U00014646\U00016800-\U00016a38\U00016a40-\U00016a5e\U00016a60-\U00016a69\U00016ad0-\U00016aed\U00016af0-\U00016af4\U00016b00-\U00016b36\U00016b40-\U00016b43\U00016b50-\U00016b59\U00016b63-\U00016b77\U00016b7d-\U00016b8f\U00016e40-\U00016e7f\U00016f00-\U00016f44\U00016f50-\U00016f7e\U00016f8f-\U00016f9f\U00016fe0-\U00016fe1\U00017000-\U000187f1\U00018800-\U00018af2\U0001b000-\U0001b11e\U0001b170-\U0001b2fb\U0001bc00-\U0001bc6a\U0001bc70-\U0001bc7c\U0001bc80-\U0001bc88\U0001bc90-\U0001bc99\U0001bc9d-\U0001bc9e\U0001d165-\U0001d169\U0001d16d-\U0001d172\U0001d17b-\U0001d182\U0001d185-\U0001d18b\U0001d1aa-\U0001d1ad\U0001d242-\U0001d244\U0001d400-\U0001d454\U0001d456-\U0001d49c\U0001d49e-\U0001d49f\U0001d4a2\U0001d4a5-\U0001d4a6\U0001d4a9-\U0001d4ac\U0001d4ae-\U0001d4b9\U0001d4bb\U0001d4bd-\U0001d4c3\U0001d4c5-\U0001d505\U0001d507-\U0001d50a\U0001d50d-\U0001d514\U0001d516-\U0001d51c\U0001d51e-\U0001d539\U0001d53b-\U0001d53e\U0001d540-\U0001d544\U0001d546\U0001d54a-\U0001d550\U0001d552-\U0001d6a5\U0001d6a8-\U0001d6c0\U0001d6c2-\U0001d6da\U0001d6dc-\U0001d6fa\U0001d6fc-\U0001d714\U0001d716-\U0001d734\U0001d736-\U0001d74e\U0001d750-\U0001d76e\U0001d770-\U0001d788\U0001d78a-\U0001d7a8\U0001d7aa-\U0001d7c2\U0001d7c4-\U0001d7cb\U0001d7ce-\U0001d7ff\U0001da00-\U0001da36\U0001da3b-\U0001da6c\U0001da75\U0001da84\U0001da9b-\U0001da9f\U0001daa1-\U0001daaf\U0001e000-\U0001e006\U0001e008-\U0001e018\U0001e01b-\U0001e021\U0001e023-\U0001e024\U0001e026-\U0001e02a\U0001e800-\U0001e8c4\U0001e8d0-\U0001e8d6\U0001e900-\U0001e94a\U0001e950-\U0001e959\U0001ee00-\U0001ee03\U0001ee05-\U0001ee1f\U0001ee21-\U0001ee22\U0001ee24\U0001ee27\U0001ee29-\U0001ee32\U0001ee34-\U0001ee37\U0001ee39\U0001ee3b\U0001ee42\U0001ee47\U0001ee49\U0001ee4b\U0001ee4d-\U0001ee4f\U0001ee51-\U0001ee52\U0001ee54\U0001ee57\U0001ee59\U0001ee5b\U0001ee5d\U0001ee5f\U0001ee61-\U0001ee62\U0001ee64\U0001ee67-\U0001ee6a\U0001ee6c-\U0001ee72\U0001ee74-\U0001ee77\U0001ee79-\U0001ee7c\U0001ee7e\U0001ee80-\U0001ee89\U0001ee8b-\U0001ee9b\U0001eea1-\U0001eea3\U0001eea5-\U0001eea9\U0001eeab-\U0001eebb\U00020000-\U0002a6d6\U0002a700-\U0002b734\U0002b740-\U0002b81d\U0002b820-\U0002cea1\U0002ceb0-\U0002ebe0\U0002f800-\U0002fa1d\U000e0100-\U000e01ef' - -xid_start = 'A-Z_a-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376-\u0377\u037b-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e-\u066f\u0671-\u06d3\u06d5\u06e5-\u06e6\u06ee-\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4-\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u08a0-\u08b4\u08b6-\u08bd\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f-\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc-\u09dd\u09df-\u09e1\u09f0-\u09f1\u09fc\u0a05-\u0a0a\u0a0f-\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32-\u0a33\u0a35-\u0a36\u0a38-\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2-\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0-\u0ae1\u0af9\u0b05-\u0b0c\u0b0f-\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32-\u0b33\u0b35-\u0b39\u0b3d\u0b5c-\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99-\u0b9a\u0b9c\u0b9e-\u0b9f\u0ba3-\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c60-\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0-\u0ce1\u0cf1-\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e40-\u0e46\u0e81-\u0e82\u0e84\u0e87-\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa-\u0eab\u0ead-\u0eb0\u0eb2\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065-\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae-\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5-\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2-\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fef\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a-\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7b9\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd-\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5-\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab65\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufbb1\ufbd3-\ufc5d\ufc64-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdf9\ufe71\ufe73\ufe77\ufe79\ufe7b\ufe7d\ufe7f-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uff9d\uffa0-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc\U00010000-\U0001000b\U0001000d-\U00010026\U00010028-\U0001003a\U0001003c-\U0001003d\U0001003f-\U0001004d\U00010050-\U0001005d\U00010080-\U000100fa\U00010140-\U00010174\U00010280-\U0001029c\U000102a0-\U000102d0\U00010300-\U0001031f\U0001032d-\U0001034a\U00010350-\U00010375\U00010380-\U0001039d\U000103a0-\U000103c3\U000103c8-\U000103cf\U000103d1-\U000103d5\U00010400-\U0001049d\U000104b0-\U000104d3\U000104d8-\U000104fb\U00010500-\U00010527\U00010530-\U00010563\U00010600-\U00010736\U00010740-\U00010755\U00010760-\U00010767\U00010800-\U00010805\U00010808\U0001080a-\U00010835\U00010837-\U00010838\U0001083c\U0001083f-\U00010855\U00010860-\U00010876\U00010880-\U0001089e\U000108e0-\U000108f2\U000108f4-\U000108f5\U00010900-\U00010915\U00010920-\U00010939\U00010980-\U000109b7\U000109be-\U000109bf\U00010a00\U00010a10-\U00010a13\U00010a15-\U00010a17\U00010a19-\U00010a35\U00010a60-\U00010a7c\U00010a80-\U00010a9c\U00010ac0-\U00010ac7\U00010ac9-\U00010ae4\U00010b00-\U00010b35\U00010b40-\U00010b55\U00010b60-\U00010b72\U00010b80-\U00010b91\U00010c00-\U00010c48\U00010c80-\U00010cb2\U00010cc0-\U00010cf2\U00010d00-\U00010d23\U00010f00-\U00010f1c\U00010f27\U00010f30-\U00010f45\U00011003-\U00011037\U00011083-\U000110af\U000110d0-\U000110e8\U00011103-\U00011126\U00011144\U00011150-\U00011172\U00011176\U00011183-\U000111b2\U000111c1-\U000111c4\U000111da\U000111dc\U00011200-\U00011211\U00011213-\U0001122b\U00011280-\U00011286\U00011288\U0001128a-\U0001128d\U0001128f-\U0001129d\U0001129f-\U000112a8\U000112b0-\U000112de\U00011305-\U0001130c\U0001130f-\U00011310\U00011313-\U00011328\U0001132a-\U00011330\U00011332-\U00011333\U00011335-\U00011339\U0001133d\U00011350\U0001135d-\U00011361\U00011400-\U00011434\U00011447-\U0001144a\U00011480-\U000114af\U000114c4-\U000114c5\U000114c7\U00011580-\U000115ae\U000115d8-\U000115db\U00011600-\U0001162f\U00011644\U00011680-\U000116aa\U00011700-\U0001171a\U00011800-\U0001182b\U000118a0-\U000118df\U000118ff\U00011a00\U00011a0b-\U00011a32\U00011a3a\U00011a50\U00011a5c-\U00011a83\U00011a86-\U00011a89\U00011a9d\U00011ac0-\U00011af8\U00011c00-\U00011c08\U00011c0a-\U00011c2e\U00011c40\U00011c72-\U00011c8f\U00011d00-\U00011d06\U00011d08-\U00011d09\U00011d0b-\U00011d30\U00011d46\U00011d60-\U00011d65\U00011d67-\U00011d68\U00011d6a-\U00011d89\U00011d98\U00011ee0-\U00011ef2\U00012000-\U00012399\U00012400-\U0001246e\U00012480-\U00012543\U00013000-\U0001342e\U00014400-\U00014646\U00016800-\U00016a38\U00016a40-\U00016a5e\U00016ad0-\U00016aed\U00016b00-\U00016b2f\U00016b40-\U00016b43\U00016b63-\U00016b77\U00016b7d-\U00016b8f\U00016e40-\U00016e7f\U00016f00-\U00016f44\U00016f50\U00016f93-\U00016f9f\U00016fe0-\U00016fe1\U00017000-\U000187f1\U00018800-\U00018af2\U0001b000-\U0001b11e\U0001b170-\U0001b2fb\U0001bc00-\U0001bc6a\U0001bc70-\U0001bc7c\U0001bc80-\U0001bc88\U0001bc90-\U0001bc99\U0001d400-\U0001d454\U0001d456-\U0001d49c\U0001d49e-\U0001d49f\U0001d4a2\U0001d4a5-\U0001d4a6\U0001d4a9-\U0001d4ac\U0001d4ae-\U0001d4b9\U0001d4bb\U0001d4bd-\U0001d4c3\U0001d4c5-\U0001d505\U0001d507-\U0001d50a\U0001d50d-\U0001d514\U0001d516-\U0001d51c\U0001d51e-\U0001d539\U0001d53b-\U0001d53e\U0001d540-\U0001d544\U0001d546\U0001d54a-\U0001d550\U0001d552-\U0001d6a5\U0001d6a8-\U0001d6c0\U0001d6c2-\U0001d6da\U0001d6dc-\U0001d6fa\U0001d6fc-\U0001d714\U0001d716-\U0001d734\U0001d736-\U0001d74e\U0001d750-\U0001d76e\U0001d770-\U0001d788\U0001d78a-\U0001d7a8\U0001d7aa-\U0001d7c2\U0001d7c4-\U0001d7cb\U0001e800-\U0001e8c4\U0001e900-\U0001e943\U0001ee00-\U0001ee03\U0001ee05-\U0001ee1f\U0001ee21-\U0001ee22\U0001ee24\U0001ee27\U0001ee29-\U0001ee32\U0001ee34-\U0001ee37\U0001ee39\U0001ee3b\U0001ee42\U0001ee47\U0001ee49\U0001ee4b\U0001ee4d-\U0001ee4f\U0001ee51-\U0001ee52\U0001ee54\U0001ee57\U0001ee59\U0001ee5b\U0001ee5d\U0001ee5f\U0001ee61-\U0001ee62\U0001ee64\U0001ee67-\U0001ee6a\U0001ee6c-\U0001ee72\U0001ee74-\U0001ee77\U0001ee79-\U0001ee7c\U0001ee7e\U0001ee80-\U0001ee89\U0001ee8b-\U0001ee9b\U0001eea1-\U0001eea3\U0001eea5-\U0001eea9\U0001eeab-\U0001eebb\U00020000-\U0002a6d6\U0002a700-\U0002b734\U0002b740-\U0002b81d\U0002b820-\U0002cea1\U0002ceb0-\U0002ebe0\U0002f800-\U0002fa1d' - -cats = ['Cc', 'Cf', 'Cn', 'Co', 'Cs', 'Ll', 'Lm', 'Lo', 'Lt', 'Lu', 'Mc', 'Me', 'Mn', 'Nd', 'Nl', 'No', 'Pc', 'Pd', 'Pe', 'Pf', 'Pi', 'Po', 'Ps', 'Sc', 'Sk', 'Sm', 'So', 'Zl', 'Zp', 'Zs'] - -# Generated from unidata 11.0.0 - -def combine(*args): - return ''.join(globals()[cat] for cat in args) - - -def allexcept(*args): - newcats = cats[:] - for arg in args: - newcats.remove(arg) - return ''.join(globals()[cat] for cat in newcats) - - -def _handle_runs(char_list): # pragma: no cover - buf = [] - for c in char_list: - if len(c) == 1: - if buf and buf[-1][1] == chr(ord(c)-1): - buf[-1] = (buf[-1][0], c) - else: - buf.append((c, c)) - else: - buf.append((c, c)) - for a, b in buf: - if a == b: - yield a - else: - yield '%s-%s' % (a, b) - - -if __name__ == '__main__': # pragma: no cover - import unicodedata - - categories = {'xid_start': [], 'xid_continue': []} - - with open(__file__, encoding='utf-8') as fp: - content = fp.read() - - header = content[:content.find('Cc =')] - footer = content[content.find("def combine("):] - - for code in range(0x110000): - c = chr(code) - cat = unicodedata.category(c) - if ord(c) == 0xdc00: - # Hack to avoid combining this combining with the preceding high - # surrogate, 0xdbff, when doing a repr. - c = '\\' + c - elif ord(c) in (0x2d, 0x5b, 0x5c, 0x5d, 0x5e): - # Escape regex metachars. - c = '\\' + c - categories.setdefault(cat, []).append(c) - # XID_START and XID_CONTINUE are special categories used for matching - # identifiers in Python 3. - if c.isidentifier(): - categories['xid_start'].append(c) - if ('a' + c).isidentifier(): - categories['xid_continue'].append(c) - - with open(__file__, 'w', encoding='utf-8') as fp: - fp.write(header) - - for cat in sorted(categories): - val = ''.join(_handle_runs(categories[cat])) - fp.write('%s = %a\n\n' % (cat, val)) - - cats = sorted(categories) - cats.remove('xid_start') - cats.remove('xid_continue') - fp.write('cats = %r\n\n' % cats) - - fp.write('# Generated from unidata %s\n\n' % (unicodedata.unidata_version,)) - - fp.write(footer) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/util.py b/venv/lib/python3.12/site-packages/pip/_vendor/pygments/util.py deleted file mode 100644 index 941fdb9..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pygments/util.py +++ /dev/null @@ -1,330 +0,0 @@ -""" - pygments.util - ~~~~~~~~~~~~~ - - Utility functions. - - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -import re -from io import TextIOWrapper - - -split_path_re = re.compile(r'[/\\ ]') -doctype_lookup_re = re.compile(r''' - <!DOCTYPE\s+( - [a-zA-Z_][a-zA-Z0-9]* - (?: \s+ # optional in HTML5 - [a-zA-Z_][a-zA-Z0-9]*\s+ - "[^"]*")? - ) - [^>]*> -''', re.DOTALL | re.MULTILINE | re.VERBOSE) -tag_re = re.compile(r'<(.+?)(\s.*?)?>.*?</.+?>', - re.IGNORECASE | re.DOTALL | re.MULTILINE) -xml_decl_re = re.compile(r'\s*<\?xml[^>]*\?>', re.I) - - -class ClassNotFound(ValueError): - """Raised if one of the lookup functions didn't find a matching class.""" - - -class OptionError(Exception): - """ - This exception will be raised by all option processing functions if - the type or value of the argument is not correct. - """ - -def get_choice_opt(options, optname, allowed, default=None, normcase=False): - """ - If the key `optname` from the dictionary is not in the sequence - `allowed`, raise an error, otherwise return it. - """ - string = options.get(optname, default) - if normcase: - string = string.lower() - if string not in allowed: - raise OptionError('Value for option %s must be one of %s' % - (optname, ', '.join(map(str, allowed)))) - return string - - -def get_bool_opt(options, optname, default=None): - """ - Intuitively, this is `options.get(optname, default)`, but restricted to - Boolean value. The Booleans can be represented as string, in order to accept - Boolean value from the command line arguments. If the key `optname` is - present in the dictionary `options` and is not associated with a Boolean, - raise an `OptionError`. If it is absent, `default` is returned instead. - - The valid string values for ``True`` are ``1``, ``yes``, ``true`` and - ``on``, the ones for ``False`` are ``0``, ``no``, ``false`` and ``off`` - (matched case-insensitively). - """ - string = options.get(optname, default) - if isinstance(string, bool): - return string - elif isinstance(string, int): - return bool(string) - elif not isinstance(string, str): - raise OptionError('Invalid type %r for option %s; use ' - '1/0, yes/no, true/false, on/off' % ( - string, optname)) - elif string.lower() in ('1', 'yes', 'true', 'on'): - return True - elif string.lower() in ('0', 'no', 'false', 'off'): - return False - else: - raise OptionError('Invalid value %r for option %s; use ' - '1/0, yes/no, true/false, on/off' % ( - string, optname)) - - -def get_int_opt(options, optname, default=None): - """As :func:`get_bool_opt`, but interpret the value as an integer.""" - string = options.get(optname, default) - try: - return int(string) - except TypeError: - raise OptionError('Invalid type %r for option %s; you ' - 'must give an integer value' % ( - string, optname)) - except ValueError: - raise OptionError('Invalid value %r for option %s; you ' - 'must give an integer value' % ( - string, optname)) - -def get_list_opt(options, optname, default=None): - """ - If the key `optname` from the dictionary `options` is a string, - split it at whitespace and return it. If it is already a list - or a tuple, it is returned as a list. - """ - val = options.get(optname, default) - if isinstance(val, str): - return val.split() - elif isinstance(val, (list, tuple)): - return list(val) - else: - raise OptionError('Invalid type %r for option %s; you ' - 'must give a list value' % ( - val, optname)) - - -def docstring_headline(obj): - if not obj.__doc__: - return '' - res = [] - for line in obj.__doc__.strip().splitlines(): - if line.strip(): - res.append(" " + line.strip()) - else: - break - return ''.join(res).lstrip() - - -def make_analysator(f): - """Return a static text analyser function that returns float values.""" - def text_analyse(text): - try: - rv = f(text) - except Exception: - return 0.0 - if not rv: - return 0.0 - try: - return min(1.0, max(0.0, float(rv))) - except (ValueError, TypeError): - return 0.0 - text_analyse.__doc__ = f.__doc__ - return staticmethod(text_analyse) - - -def shebang_matches(text, regex): - r"""Check if the given regular expression matches the last part of the - shebang if one exists. - - >>> from pygments.util import shebang_matches - >>> shebang_matches('#!/usr/bin/env python', r'python(2\.\d)?') - True - >>> shebang_matches('#!/usr/bin/python2.4', r'python(2\.\d)?') - True - >>> shebang_matches('#!/usr/bin/python-ruby', r'python(2\.\d)?') - False - >>> shebang_matches('#!/usr/bin/python/ruby', r'python(2\.\d)?') - False - >>> shebang_matches('#!/usr/bin/startsomethingwith python', - ... r'python(2\.\d)?') - True - - It also checks for common windows executable file extensions:: - - >>> shebang_matches('#!C:\\Python2.4\\Python.exe', r'python(2\.\d)?') - True - - Parameters (``'-f'`` or ``'--foo'`` are ignored so ``'perl'`` does - the same as ``'perl -e'``) - - Note that this method automatically searches the whole string (eg: - the regular expression is wrapped in ``'^$'``) - """ - index = text.find('\n') - if index >= 0: - first_line = text[:index].lower() - else: - first_line = text.lower() - if first_line.startswith('#!'): - try: - found = [x for x in split_path_re.split(first_line[2:].strip()) - if x and not x.startswith('-')][-1] - except IndexError: - return False - regex = re.compile(r'^%s(\.(exe|cmd|bat|bin))?$' % regex, re.IGNORECASE) - if regex.search(found) is not None: - return True - return False - - -def doctype_matches(text, regex): - """Check if the doctype matches a regular expression (if present). - - Note that this method only checks the first part of a DOCTYPE. - eg: 'html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"' - """ - m = doctype_lookup_re.search(text) - if m is None: - return False - doctype = m.group(1) - return re.compile(regex, re.I).match(doctype.strip()) is not None - - -def html_doctype_matches(text): - """Check if the file looks like it has a html doctype.""" - return doctype_matches(text, r'html') - - -_looks_like_xml_cache = {} - - -def looks_like_xml(text): - """Check if a doctype exists or if we have some tags.""" - if xml_decl_re.match(text): - return True - key = hash(text) - try: - return _looks_like_xml_cache[key] - except KeyError: - m = doctype_lookup_re.search(text) - if m is not None: - return True - rv = tag_re.search(text[:1000]) is not None - _looks_like_xml_cache[key] = rv - return rv - - -def surrogatepair(c): - """Given a unicode character code with length greater than 16 bits, - return the two 16 bit surrogate pair. - """ - # From example D28 of: - # http://www.unicode.org/book/ch03.pdf - return (0xd7c0 + (c >> 10), (0xdc00 + (c & 0x3ff))) - - -def format_lines(var_name, seq, raw=False, indent_level=0): - """Formats a sequence of strings for output.""" - lines = [] - base_indent = ' ' * indent_level * 4 - inner_indent = ' ' * (indent_level + 1) * 4 - lines.append(base_indent + var_name + ' = (') - if raw: - # These should be preformatted reprs of, say, tuples. - for i in seq: - lines.append(inner_indent + i + ',') - else: - for i in seq: - # Force use of single quotes - r = repr(i + '"') - lines.append(inner_indent + r[:-2] + r[-1] + ',') - lines.append(base_indent + ')') - return '\n'.join(lines) - - -def duplicates_removed(it, already_seen=()): - """ - Returns a list with duplicates removed from the iterable `it`. - - Order is preserved. - """ - lst = [] - seen = set() - for i in it: - if i in seen or i in already_seen: - continue - lst.append(i) - seen.add(i) - return lst - - -class Future: - """Generic class to defer some work. - - Handled specially in RegexLexerMeta, to support regex string construction at - first use. - """ - def get(self): - raise NotImplementedError - - -def guess_decode(text): - """Decode *text* with guessed encoding. - - First try UTF-8; this should fail for non-UTF-8 encodings. - Then try the preferred locale encoding. - Fall back to latin-1, which always works. - """ - try: - text = text.decode('utf-8') - return text, 'utf-8' - except UnicodeDecodeError: - try: - import locale - prefencoding = locale.getpreferredencoding() - text = text.decode() - return text, prefencoding - except (UnicodeDecodeError, LookupError): - text = text.decode('latin1') - return text, 'latin1' - - -def guess_decode_from_terminal(text, term): - """Decode *text* coming from terminal *term*. - - First try the terminal encoding, if given. - Then try UTF-8. Then try the preferred locale encoding. - Fall back to latin-1, which always works. - """ - if getattr(term, 'encoding', None): - try: - text = text.decode(term.encoding) - except UnicodeDecodeError: - pass - else: - return text, term.encoding - return guess_decode(text) - - -def terminal_encoding(term): - """Return our best guess of encoding for the given *term*.""" - if getattr(term, 'encoding', None): - return term.encoding - import locale - return locale.getpreferredencoding() - - -class UnclosingTextIOWrapper(TextIOWrapper): - # Don't close underlying buffer on destruction. - def close(self): - self.flush() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__init__.py deleted file mode 100644 index 88bc10a..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__init__.py +++ /dev/null @@ -1,322 +0,0 @@ -# module pyparsing.py -# -# Copyright (c) 2003-2022 Paul T. McGuire -# -# 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. -# - -__doc__ = """ -pyparsing module - Classes and methods to define and execute parsing grammars -============================================================================= - -The pyparsing module is an alternative approach to creating and -executing simple grammars, vs. the traditional lex/yacc approach, or the -use of regular expressions. With pyparsing, you don't need to learn -a new syntax for defining grammars or matching expressions - the parsing -module provides a library of classes that you use to construct the -grammar directly in Python. - -Here is a program to parse "Hello, World!" (or any greeting of the form -``"<salutation>, <addressee>!"``), built up using :class:`Word`, -:class:`Literal`, and :class:`And` elements -(the :meth:`'+'<ParserElement.__add__>` operators create :class:`And` expressions, -and the strings are auto-converted to :class:`Literal` expressions):: - - from pip._vendor.pyparsing import Word, alphas - - # define grammar of a greeting - greet = Word(alphas) + "," + Word(alphas) + "!" - - hello = "Hello, World!" - print(hello, "->", greet.parse_string(hello)) - -The program outputs the following:: - - Hello, World! -> ['Hello', ',', 'World', '!'] - -The Python representation of the grammar is quite readable, owing to the -self-explanatory class names, and the use of :class:`'+'<And>`, -:class:`'|'<MatchFirst>`, :class:`'^'<Or>` and :class:`'&'<Each>` operators. - -The :class:`ParseResults` object returned from -:class:`ParserElement.parse_string` can be -accessed as a nested list, a dictionary, or an object with named -attributes. - -The pyparsing module handles some of the problems that are typically -vexing when writing text parsers: - - - extra or missing whitespace (the above program will also handle - "Hello,World!", "Hello , World !", etc.) - - quoted strings - - embedded comments - - -Getting Started - ------------------ -Visit the classes :class:`ParserElement` and :class:`ParseResults` to -see the base classes that most other pyparsing -classes inherit from. Use the docstrings for examples of how to: - - - construct literal match expressions from :class:`Literal` and - :class:`CaselessLiteral` classes - - construct character word-group expressions using the :class:`Word` - class - - see how to create repetitive expressions using :class:`ZeroOrMore` - and :class:`OneOrMore` classes - - use :class:`'+'<And>`, :class:`'|'<MatchFirst>`, :class:`'^'<Or>`, - and :class:`'&'<Each>` operators to combine simple expressions into - more complex ones - - associate names with your parsed results using - :class:`ParserElement.set_results_name` - - access the parsed data, which is returned as a :class:`ParseResults` - object - - find some helpful expression short-cuts like :class:`DelimitedList` - and :class:`one_of` - - find more useful common expressions in the :class:`pyparsing_common` - namespace class -""" -from typing import NamedTuple - - -class version_info(NamedTuple): - major: int - minor: int - micro: int - releaselevel: str - serial: int - - @property - def __version__(self): - return ( - f"{self.major}.{self.minor}.{self.micro}" - + ( - f"{'r' if self.releaselevel[0] == 'c' else ''}{self.releaselevel[0]}{self.serial}", - "", - )[self.releaselevel == "final"] - ) - - def __str__(self): - return f"{__name__} {self.__version__} / {__version_time__}" - - def __repr__(self): - return f"{__name__}.{type(self).__name__}({', '.join('{}={!r}'.format(*nv) for nv in zip(self._fields, self))})" - - -__version_info__ = version_info(3, 1, 0, "final", 1) -__version_time__ = "18 Jun 2023 14:05 UTC" -__version__ = __version_info__.__version__ -__versionTime__ = __version_time__ -__author__ = "Paul McGuire <ptmcg.gm+pyparsing@gmail.com>" - -from .util import * -from .exceptions import * -from .actions import * -from .core import __diag__, __compat__ -from .results import * -from .core import * # type: ignore[misc, assignment] -from .core import _builtin_exprs as core_builtin_exprs -from .helpers import * # type: ignore[misc, assignment] -from .helpers import _builtin_exprs as helper_builtin_exprs - -from .unicode import unicode_set, UnicodeRangeList, pyparsing_unicode as unicode -from .testing import pyparsing_test as testing -from .common import ( - pyparsing_common as common, - _builtin_exprs as common_builtin_exprs, -) - -# define backward compat synonyms -if "pyparsing_unicode" not in globals(): - pyparsing_unicode = unicode # type: ignore[misc] -if "pyparsing_common" not in globals(): - pyparsing_common = common # type: ignore[misc] -if "pyparsing_test" not in globals(): - pyparsing_test = testing # type: ignore[misc] - -core_builtin_exprs += common_builtin_exprs + helper_builtin_exprs - - -__all__ = [ - "__version__", - "__version_time__", - "__author__", - "__compat__", - "__diag__", - "And", - "AtLineStart", - "AtStringStart", - "CaselessKeyword", - "CaselessLiteral", - "CharsNotIn", - "CloseMatch", - "Combine", - "DelimitedList", - "Dict", - "Each", - "Empty", - "FollowedBy", - "Forward", - "GoToColumn", - "Group", - "IndentedBlock", - "Keyword", - "LineEnd", - "LineStart", - "Literal", - "Located", - "PrecededBy", - "MatchFirst", - "NoMatch", - "NotAny", - "OneOrMore", - "OnlyOnce", - "OpAssoc", - "Opt", - "Optional", - "Or", - "ParseBaseException", - "ParseElementEnhance", - "ParseException", - "ParseExpression", - "ParseFatalException", - "ParseResults", - "ParseSyntaxException", - "ParserElement", - "PositionToken", - "QuotedString", - "RecursiveGrammarException", - "Regex", - "SkipTo", - "StringEnd", - "StringStart", - "Suppress", - "Token", - "TokenConverter", - "White", - "Word", - "WordEnd", - "WordStart", - "ZeroOrMore", - "Char", - "alphanums", - "alphas", - "alphas8bit", - "any_close_tag", - "any_open_tag", - "autoname_elements", - "c_style_comment", - "col", - "common_html_entity", - "condition_as_parse_action", - "counted_array", - "cpp_style_comment", - "dbl_quoted_string", - "dbl_slash_comment", - "delimited_list", - "dict_of", - "empty", - "hexnums", - "html_comment", - "identchars", - "identbodychars", - "infix_notation", - "java_style_comment", - "line", - "line_end", - "line_start", - "lineno", - "make_html_tags", - "make_xml_tags", - "match_only_at_col", - "match_previous_expr", - "match_previous_literal", - "nested_expr", - "null_debug_action", - "nums", - "one_of", - "original_text_for", - "printables", - "punc8bit", - "pyparsing_common", - "pyparsing_test", - "pyparsing_unicode", - "python_style_comment", - "quoted_string", - "remove_quotes", - "replace_with", - "replace_html_entity", - "rest_of_line", - "sgl_quoted_string", - "srange", - "string_end", - "string_start", - "token_map", - "trace_parse_action", - "ungroup", - "unicode_set", - "unicode_string", - "with_attribute", - "with_class", - # pre-PEP8 compatibility names - "__versionTime__", - "anyCloseTag", - "anyOpenTag", - "cStyleComment", - "commonHTMLEntity", - "conditionAsParseAction", - "countedArray", - "cppStyleComment", - "dblQuotedString", - "dblSlashComment", - "delimitedList", - "dictOf", - "htmlComment", - "indentedBlock", - "infixNotation", - "javaStyleComment", - "lineEnd", - "lineStart", - "locatedExpr", - "makeHTMLTags", - "makeXMLTags", - "matchOnlyAtCol", - "matchPreviousExpr", - "matchPreviousLiteral", - "nestedExpr", - "nullDebugAction", - "oneOf", - "opAssoc", - "originalTextFor", - "pythonStyleComment", - "quotedString", - "removeQuotes", - "replaceHTMLEntity", - "replaceWith", - "restOfLine", - "sglQuotedString", - "stringEnd", - "stringStart", - "tokenMap", - "traceParseAction", - "unicodeString", - "withAttribute", - "withClass", -] diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index b68e4f123fcdaed1383b2d7535822ba24d2d135f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7933 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-312.pyc deleted file mode 100644 index 57241496ee38e45dc824d6487bca95aec06e605b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8417 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 O50pJLb^yOZaQ_3+0n|7E diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-312.pyc deleted file mode 100644 index e17ef927ebb84c87029e603a19a388cba5bf73b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13436 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 QL-fc#<uLxd$_V9u1Lpbp5C8xG diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-312.pyc deleted file mode 100644 index 3887d3263fe15048695c13e8e5a99b9ec2b84354..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 267730 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%0DyNT^YB>9jdv;={*l;M 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 HuQL4~Y2K6O diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/exceptions.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/exceptions.cpython-312.pyc deleted file mode 100644 index bb4794cb56d6faf18ed55368a8c15ec4e6f59f3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13016 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 T`)E@Qf0AFS{vAg#o2>r?_>6dh diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-312.pyc deleted file mode 100644 index 84f6631fb6b564720b85695785a1d127574f25af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48523 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 Y+kd{h_UX+9zi<{ky~Fg2S`+U7FHjC#&j0`b diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-312.pyc deleted file mode 100644 index ede9e2e9423fd58b6c937f114b1bb0557f50cb4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34132 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-312.pyc deleted file mode 100644 index 16e4ca98ebb4409a218c59e816490d45aec60bee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17210 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 J6sClq{|97vi1q*g diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-312.pyc deleted file mode 100644 index 3091ecff3d57224372529dbb55cc5de4912150ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13206 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 GBK;3STSn&q diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-312.pyc deleted file mode 100644 index c0ec9f45a9d003d08103d7e842a516d737c868bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14926 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 Zl0Prb*3Nowbj+5_Z+`L~uj2Ige*gxp@l5~# diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/actions.py b/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/actions.py deleted file mode 100644 index ca6e4c6..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/actions.py +++ /dev/null @@ -1,217 +0,0 @@ -# actions.py - -from .exceptions import ParseException -from .util import col, replaced_by_pep8 - - -class OnlyOnce: - """ - Wrapper for parse actions, to ensure they are only called once. - """ - - def __init__(self, method_call): - from .core import _trim_arity - - self.callable = _trim_arity(method_call) - self.called = False - - def __call__(self, s, l, t): - if not self.called: - results = self.callable(s, l, t) - self.called = True - return results - raise ParseException(s, l, "OnlyOnce obj called multiple times w/out reset") - - def reset(self): - """ - Allow the associated parse action to be called once more. - """ - - self.called = False - - -def match_only_at_col(n): - """ - Helper method for defining parse actions that require matching at - a specific column in the input text. - """ - - def verify_col(strg, locn, toks): - if col(locn, strg) != n: - raise ParseException(strg, locn, f"matched token not at column {n}") - - return verify_col - - -def replace_with(repl_str): - """ - Helper method for common parse actions that simply return - a literal value. Especially useful when used with - :class:`transform_string<ParserElement.transform_string>` (). - - Example:: - - num = Word(nums).set_parse_action(lambda toks: int(toks[0])) - na = one_of("N/A NA").set_parse_action(replace_with(math.nan)) - term = na | num - - term[1, ...].parse_string("324 234 N/A 234") # -> [324, 234, nan, 234] - """ - return lambda s, l, t: [repl_str] - - -def remove_quotes(s, l, t): - """ - Helper parse action for removing quotation marks from parsed - quoted strings. - - Example:: - - # by default, quotation marks are included in parsed results - quoted_string.parse_string("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"] - - # use remove_quotes to strip quotation marks from parsed results - quoted_string.set_parse_action(remove_quotes) - quoted_string.parse_string("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"] - """ - return t[0][1:-1] - - -def with_attribute(*args, **attr_dict): - """ - Helper to create a validating parse action to be used with start - tags created with :class:`make_xml_tags` or - :class:`make_html_tags`. Use ``with_attribute`` to qualify - a starting tag with a required attribute value, to avoid false - matches on common tags such as ``<TD>`` or ``<DIV>``. - - Call ``with_attribute`` with a series of attribute names and - values. Specify the list of filter attributes names and values as: - - - keyword arguments, as in ``(align="right")``, or - - as an explicit dict with ``**`` operator, when an attribute - name is also a Python reserved word, as in ``**{"class":"Customer", "align":"right"}`` - - a list of name-value tuples, as in ``(("ns1:class", "Customer"), ("ns2:align", "right"))`` - - For attribute names with a namespace prefix, you must use the second - form. Attribute names are matched insensitive to upper/lower case. - - If just testing for ``class`` (with or without a namespace), use - :class:`with_class`. - - To verify that the attribute exists, but without specifying a value, - pass ``with_attribute.ANY_VALUE`` as the value. - - Example:: - - html = ''' - <div> - Some text - <div type="grid">1 4 0 1 0</div> - <div type="graph">1,3 2,3 1,1</div> - <div>this has no type</div> - </div> - - ''' - div,div_end = make_html_tags("div") - - # only match div tag having a type attribute with value "grid" - div_grid = div().set_parse_action(with_attribute(type="grid")) - grid_expr = div_grid + SkipTo(div | div_end)("body") - for grid_header in grid_expr.search_string(html): - print(grid_header.body) - - # construct a match with any div tag having a type attribute, regardless of the value - div_any_type = div().set_parse_action(with_attribute(type=with_attribute.ANY_VALUE)) - div_expr = div_any_type + SkipTo(div | div_end)("body") - for div_header in div_expr.search_string(html): - print(div_header.body) - - prints:: - - 1 4 0 1 0 - - 1 4 0 1 0 - 1,3 2,3 1,1 - """ - if args: - attrs = args[:] - else: - attrs = attr_dict.items() - attrs = [(k, v) for k, v in attrs] - - def pa(s, l, tokens): - for attrName, attrValue in attrs: - if attrName not in tokens: - raise ParseException(s, l, "no matching attribute " + attrName) - if attrValue != with_attribute.ANY_VALUE and tokens[attrName] != attrValue: - raise ParseException( - s, - l, - f"attribute {attrName!r} has value {tokens[attrName]!r}, must be {attrValue!r}", - ) - - return pa - - -with_attribute.ANY_VALUE = object() # type: ignore [attr-defined] - - -def with_class(classname, namespace=""): - """ - Simplified version of :class:`with_attribute` when - matching on a div class - made difficult because ``class`` is - a reserved word in Python. - - Example:: - - html = ''' - <div> - Some text - <div class="grid">1 4 0 1 0</div> - <div class="graph">1,3 2,3 1,1</div> - <div>this &lt;div&gt; has no class</div> - </div> - - ''' - div,div_end = make_html_tags("div") - div_grid = div().set_parse_action(with_class("grid")) - - grid_expr = div_grid + SkipTo(div | div_end)("body") - for grid_header in grid_expr.search_string(html): - print(grid_header.body) - - div_any_type = div().set_parse_action(with_class(withAttribute.ANY_VALUE)) - div_expr = div_any_type + SkipTo(div | div_end)("body") - for div_header in div_expr.search_string(html): - print(div_header.body) - - prints:: - - 1 4 0 1 0 - - 1 4 0 1 0 - 1,3 2,3 1,1 - """ - classattr = f"{namespace}:class" if namespace else "class" - return with_attribute(**{classattr: classname}) - - -# pre-PEP8 compatibility symbols -# fmt: off -@replaced_by_pep8(replace_with) -def replaceWith(): ... - -@replaced_by_pep8(remove_quotes) -def removeQuotes(): ... - -@replaced_by_pep8(with_attribute) -def withAttribute(): ... - -@replaced_by_pep8(with_class) -def withClass(): ... - -@replaced_by_pep8(match_only_at_col) -def matchOnlyAtCol(): ... - -# fmt: on diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/common.py b/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/common.py deleted file mode 100644 index 7a666b2..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/common.py +++ /dev/null @@ -1,432 +0,0 @@ -# common.py -from .core import * -from .helpers import DelimitedList, any_open_tag, any_close_tag -from datetime import datetime - - -# some other useful expressions - using lower-case class name since we are really using this as a namespace -class pyparsing_common: - """Here are some common low-level expressions that may be useful in - jump-starting parser development: - - - numeric forms (:class:`integers<integer>`, :class:`reals<real>`, - :class:`scientific notation<sci_real>`) - - common :class:`programming identifiers<identifier>` - - network addresses (:class:`MAC<mac_address>`, - :class:`IPv4<ipv4_address>`, :class:`IPv6<ipv6_address>`) - - ISO8601 :class:`dates<iso8601_date>` and - :class:`datetime<iso8601_datetime>` - - :class:`UUID<uuid>` - - :class:`comma-separated list<comma_separated_list>` - - :class:`url` - - Parse actions: - - - :class:`convert_to_integer` - - :class:`convert_to_float` - - :class:`convert_to_date` - - :class:`convert_to_datetime` - - :class:`strip_html_tags` - - :class:`upcase_tokens` - - :class:`downcase_tokens` - - Example:: - - pyparsing_common.number.run_tests(''' - # any int or real number, returned as the appropriate type - 100 - -100 - +100 - 3.14159 - 6.02e23 - 1e-12 - ''') - - pyparsing_common.fnumber.run_tests(''' - # any int or real number, returned as float - 100 - -100 - +100 - 3.14159 - 6.02e23 - 1e-12 - ''') - - pyparsing_common.hex_integer.run_tests(''' - # hex numbers - 100 - FF - ''') - - pyparsing_common.fraction.run_tests(''' - # fractions - 1/2 - -3/4 - ''') - - pyparsing_common.mixed_integer.run_tests(''' - # mixed fractions - 1 - 1/2 - -3/4 - 1-3/4 - ''') - - import uuid - pyparsing_common.uuid.set_parse_action(token_map(uuid.UUID)) - pyparsing_common.uuid.run_tests(''' - # uuid - 12345678-1234-5678-1234-567812345678 - ''') - - prints:: - - # any int or real number, returned as the appropriate type - 100 - [100] - - -100 - [-100] - - +100 - [100] - - 3.14159 - [3.14159] - - 6.02e23 - [6.02e+23] - - 1e-12 - [1e-12] - - # any int or real number, returned as float - 100 - [100.0] - - -100 - [-100.0] - - +100 - [100.0] - - 3.14159 - [3.14159] - - 6.02e23 - [6.02e+23] - - 1e-12 - [1e-12] - - # hex numbers - 100 - [256] - - FF - [255] - - # fractions - 1/2 - [0.5] - - -3/4 - [-0.75] - - # mixed fractions - 1 - [1] - - 1/2 - [0.5] - - -3/4 - [-0.75] - - 1-3/4 - [1.75] - - # uuid - 12345678-1234-5678-1234-567812345678 - [UUID('12345678-1234-5678-1234-567812345678')] - """ - - convert_to_integer = token_map(int) - """ - Parse action for converting parsed integers to Python int - """ - - convert_to_float = token_map(float) - """ - Parse action for converting parsed numbers to Python float - """ - - integer = Word(nums).set_name("integer").set_parse_action(convert_to_integer) - """expression that parses an unsigned integer, returns an int""" - - hex_integer = ( - Word(hexnums).set_name("hex integer").set_parse_action(token_map(int, 16)) - ) - """expression that parses a hexadecimal integer, returns an int""" - - signed_integer = ( - Regex(r"[+-]?\d+") - .set_name("signed integer") - .set_parse_action(convert_to_integer) - ) - """expression that parses an integer with optional leading sign, returns an int""" - - fraction = ( - signed_integer().set_parse_action(convert_to_float) - + "/" - + signed_integer().set_parse_action(convert_to_float) - ).set_name("fraction") - """fractional expression of an integer divided by an integer, returns a float""" - fraction.add_parse_action(lambda tt: tt[0] / tt[-1]) - - mixed_integer = ( - fraction | signed_integer + Opt(Opt("-").suppress() + fraction) - ).set_name("fraction or mixed integer-fraction") - """mixed integer of the form 'integer - fraction', with optional leading integer, returns float""" - mixed_integer.add_parse_action(sum) - - real = ( - Regex(r"[+-]?(?:\d+\.\d*|\.\d+)") - .set_name("real number") - .set_parse_action(convert_to_float) - ) - """expression that parses a floating point number and returns a float""" - - sci_real = ( - Regex(r"[+-]?(?:\d+(?:[eE][+-]?\d+)|(?:\d+\.\d*|\.\d+)(?:[eE][+-]?\d+)?)") - .set_name("real number with scientific notation") - .set_parse_action(convert_to_float) - ) - """expression that parses a floating point number with optional - scientific notation and returns a float""" - - # streamlining this expression makes the docs nicer-looking - number = (sci_real | real | signed_integer).setName("number").streamline() - """any numeric expression, returns the corresponding Python type""" - - fnumber = ( - Regex(r"[+-]?\d+\.?\d*([eE][+-]?\d+)?") - .set_name("fnumber") - .set_parse_action(convert_to_float) - ) - """any int or real number, returned as float""" - - identifier = Word(identchars, identbodychars).set_name("identifier") - """typical code identifier (leading alpha or '_', followed by 0 or more alphas, nums, or '_')""" - - ipv4_address = Regex( - r"(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}" - ).set_name("IPv4 address") - "IPv4 address (``0.0.0.0 - 255.255.255.255``)" - - _ipv6_part = Regex(r"[0-9a-fA-F]{1,4}").set_name("hex_integer") - _full_ipv6_address = (_ipv6_part + (":" + _ipv6_part) * 7).set_name( - "full IPv6 address" - ) - _short_ipv6_address = ( - Opt(_ipv6_part + (":" + _ipv6_part) * (0, 6)) - + "::" - + Opt(_ipv6_part + (":" + _ipv6_part) * (0, 6)) - ).set_name("short IPv6 address") - _short_ipv6_address.add_condition( - lambda t: sum(1 for tt in t if pyparsing_common._ipv6_part.matches(tt)) < 8 - ) - _mixed_ipv6_address = ("::ffff:" + ipv4_address).set_name("mixed IPv6 address") - ipv6_address = Combine( - (_full_ipv6_address | _mixed_ipv6_address | _short_ipv6_address).set_name( - "IPv6 address" - ) - ).set_name("IPv6 address") - "IPv6 address (long, short, or mixed form)" - - mac_address = Regex( - r"[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}" - ).set_name("MAC address") - "MAC address xx:xx:xx:xx:xx (may also have '-' or '.' delimiters)" - - @staticmethod - def convert_to_date(fmt: str = "%Y-%m-%d"): - """ - Helper to create a parse action for converting parsed date string to Python datetime.date - - Params - - - fmt - format to be passed to datetime.strptime (default= ``"%Y-%m-%d"``) - - Example:: - - date_expr = pyparsing_common.iso8601_date.copy() - date_expr.set_parse_action(pyparsing_common.convert_to_date()) - print(date_expr.parse_string("1999-12-31")) - - prints:: - - [datetime.date(1999, 12, 31)] - """ - - def cvt_fn(ss, ll, tt): - try: - return datetime.strptime(tt[0], fmt).date() - except ValueError as ve: - raise ParseException(ss, ll, str(ve)) - - return cvt_fn - - @staticmethod - def convert_to_datetime(fmt: str = "%Y-%m-%dT%H:%M:%S.%f"): - """Helper to create a parse action for converting parsed - datetime string to Python datetime.datetime - - Params - - - fmt - format to be passed to datetime.strptime (default= ``"%Y-%m-%dT%H:%M:%S.%f"``) - - Example:: - - dt_expr = pyparsing_common.iso8601_datetime.copy() - dt_expr.set_parse_action(pyparsing_common.convert_to_datetime()) - print(dt_expr.parse_string("1999-12-31T23:59:59.999")) - - prints:: - - [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)] - """ - - def cvt_fn(s, l, t): - try: - return datetime.strptime(t[0], fmt) - except ValueError as ve: - raise ParseException(s, l, str(ve)) - - return cvt_fn - - iso8601_date = Regex( - r"(?P<year>\d{4})(?:-(?P<month>\d\d)(?:-(?P<day>\d\d))?)?" - ).set_name("ISO8601 date") - "ISO8601 date (``yyyy-mm-dd``)" - - iso8601_datetime = Regex( - r"(?P<year>\d{4})-(?P<month>\d\d)-(?P<day>\d\d)[T ](?P<hour>\d\d):(?P<minute>\d\d)(:(?P<second>\d\d(\.\d*)?)?)?(?P<tz>Z|[+-]\d\d:?\d\d)?" - ).set_name("ISO8601 datetime") - "ISO8601 datetime (``yyyy-mm-ddThh:mm:ss.s(Z|+-00:00)``) - trailing seconds, milliseconds, and timezone optional; accepts separating ``'T'`` or ``' '``" - - uuid = Regex(r"[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}").set_name("UUID") - "UUID (``xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx``)" - - _html_stripper = any_open_tag.suppress() | any_close_tag.suppress() - - @staticmethod - def strip_html_tags(s: str, l: int, tokens: ParseResults): - """Parse action to remove HTML tags from web page HTML source - - Example:: - - # strip HTML links from normal text - text = '<td>More info at the <a href="https://github.com/pyparsing/pyparsing/wiki">pyparsing</a> wiki page</td>' - td, td_end = make_html_tags("TD") - table_text = td + SkipTo(td_end).set_parse_action(pyparsing_common.strip_html_tags)("body") + td_end - print(table_text.parse_string(text).body) - - Prints:: - - More info at the pyparsing wiki page - """ - return pyparsing_common._html_stripper.transform_string(tokens[0]) - - _commasepitem = ( - Combine( - OneOrMore( - ~Literal(",") - + ~LineEnd() - + Word(printables, exclude_chars=",") - + Opt(White(" \t") + ~FollowedBy(LineEnd() | ",")) - ) - ) - .streamline() - .set_name("commaItem") - ) - comma_separated_list = DelimitedList( - Opt(quoted_string.copy() | _commasepitem, default="") - ).set_name("comma separated list") - """Predefined expression of 1 or more printable words or quoted strings, separated by commas.""" - - upcase_tokens = staticmethod(token_map(lambda t: t.upper())) - """Parse action to convert tokens to upper case.""" - - downcase_tokens = staticmethod(token_map(lambda t: t.lower())) - """Parse action to convert tokens to lower case.""" - - # fmt: off - url = Regex( - # https://mathiasbynens.be/demo/url-regex - # https://gist.github.com/dperini/729294 - r"(?P<url>" + - # protocol identifier (optional) - # short syntax // still required - r"(?:(?:(?P<scheme>https?|ftp):)?\/\/)" + - # user:pass BasicAuth (optional) - r"(?:(?P<auth>\S+(?::\S*)?)@)?" + - r"(?P<host>" + - # IP address exclusion - # private & local networks - r"(?!(?:10|127)(?:\.\d{1,3}){3})" + - r"(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})" + - r"(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})" + - # IP address dotted notation octets - # excludes loopback network 0.0.0.0 - # excludes reserved space >= 224.0.0.0 - # excludes network & broadcast addresses - # (first & last IP address of each class) - r"(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])" + - r"(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}" + - r"(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))" + - r"|" + - # host & domain names, may end with dot - # can be replaced by a shortest alternative - # (?![-_])(?:[-\w\u00a1-\uffff]{0,63}[^-_]\.)+ - r"(?:" + - r"(?:" + - r"[a-z0-9\u00a1-\uffff]" + - r"[a-z0-9\u00a1-\uffff_-]{0,62}" + - r")?" + - r"[a-z0-9\u00a1-\uffff]\." + - r")+" + - # TLD identifier name, may end with dot - r"(?:[a-z\u00a1-\uffff]{2,}\.?)" + - r")" + - # port number (optional) - r"(:(?P<port>\d{2,5}))?" + - # resource path (optional) - r"(?P<path>\/[^?# ]*)?" + - # query string (optional) - r"(\?(?P<query>[^#]*))?" + - # fragment (optional) - r"(#(?P<fragment>\S*))?" + - r")" - ).set_name("url") - """URL (http/https/ftp scheme)""" - # fmt: on - - # pre-PEP8 compatibility names - convertToInteger = convert_to_integer - """Deprecated - use :class:`convert_to_integer`""" - convertToFloat = convert_to_float - """Deprecated - use :class:`convert_to_float`""" - convertToDate = convert_to_date - """Deprecated - use :class:`convert_to_date`""" - convertToDatetime = convert_to_datetime - """Deprecated - use :class:`convert_to_datetime`""" - stripHTMLTags = strip_html_tags - """Deprecated - use :class:`strip_html_tags`""" - upcaseTokens = upcase_tokens - """Deprecated - use :class:`upcase_tokens`""" - downcaseTokens = downcase_tokens - """Deprecated - use :class:`downcase_tokens`""" - - -_builtin_exprs = [ - v for v in vars(pyparsing_common).values() if isinstance(v, ParserElement) -] diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/core.py b/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/core.py deleted file mode 100644 index 8d5a856..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/core.py +++ /dev/null @@ -1,6115 +0,0 @@ -# -# core.py -# - -from collections import deque -import os -import typing -from typing import ( - Any, - Callable, - Generator, - List, - NamedTuple, - Sequence, - Set, - TextIO, - Tuple, - Union, - cast, -) -from abc import ABC, abstractmethod -from enum import Enum -import string -import copy -import warnings -import re -import sys -from collections.abc import Iterable -import traceback -import types -from operator import itemgetter -from functools import wraps -from threading import RLock -from pathlib import Path - -from .util import ( - _FifoCache, - _UnboundedCache, - __config_flags, - _collapse_string_to_ranges, - _escape_regex_range_chars, - _bslash, - _flatten, - LRUMemo as _LRUMemo, - UnboundedMemo as _UnboundedMemo, - replaced_by_pep8, -) -from .exceptions import * -from .actions import * -from .results import ParseResults, _ParseResultsWithOffset -from .unicode import pyparsing_unicode - -_MAX_INT = sys.maxsize -str_type: Tuple[type, ...] = (str, bytes) - -# -# Copyright (c) 2003-2022 Paul T. McGuire -# -# 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. -# - - -if sys.version_info >= (3, 8): - from functools import cached_property -else: - - class cached_property: - def __init__(self, func): - self._func = func - - def __get__(self, instance, owner=None): - ret = instance.__dict__[self._func.__name__] = self._func(instance) - return ret - - -class __compat__(__config_flags): - """ - A cross-version compatibility configuration for pyparsing features that will be - released in a future version. By setting values in this configuration to True, - those features can be enabled in prior versions for compatibility development - and testing. - - - ``collect_all_And_tokens`` - flag to enable fix for Issue #63 that fixes erroneous grouping - of results names when an :class:`And` expression is nested within an :class:`Or` or :class:`MatchFirst`; - maintained for compatibility, but setting to ``False`` no longer restores pre-2.3.1 - behavior - """ - - _type_desc = "compatibility" - - collect_all_And_tokens = True - - _all_names = [__ for __ in locals() if not __.startswith("_")] - _fixed_names = """ - collect_all_And_tokens - """.split() - - -class __diag__(__config_flags): - _type_desc = "diagnostic" - - warn_multiple_tokens_in_named_alternation = False - warn_ungrouped_named_tokens_in_collection = False - warn_name_set_on_empty_Forward = False - warn_on_parse_using_empty_Forward = False - warn_on_assignment_to_Forward = False - warn_on_multiple_string_args_to_oneof = False - warn_on_match_first_with_lshift_operator = False - enable_debug_on_named_expressions = False - - _all_names = [__ for __ in locals() if not __.startswith("_")] - _warning_names = [name for name in _all_names if name.startswith("warn")] - _debug_names = [name for name in _all_names if name.startswith("enable_debug")] - - @classmethod - def enable_all_warnings(cls) -> None: - for name in cls._warning_names: - cls.enable(name) - - -class Diagnostics(Enum): - """ - Diagnostic configuration (all default to disabled) - - - ``warn_multiple_tokens_in_named_alternation`` - flag to enable warnings when a results - name is defined on a :class:`MatchFirst` or :class:`Or` expression with one or more :class:`And` subexpressions - - ``warn_ungrouped_named_tokens_in_collection`` - flag to enable warnings when a results - name is defined on a containing expression with ungrouped subexpressions that also - have results names - - ``warn_name_set_on_empty_Forward`` - flag to enable warnings when a :class:`Forward` is defined - with a results name, but has no contents defined - - ``warn_on_parse_using_empty_Forward`` - flag to enable warnings when a :class:`Forward` is - defined in a grammar but has never had an expression attached to it - - ``warn_on_assignment_to_Forward`` - flag to enable warnings when a :class:`Forward` is defined - but is overwritten by assigning using ``'='`` instead of ``'<<='`` or ``'<<'`` - - ``warn_on_multiple_string_args_to_oneof`` - flag to enable warnings when :class:`one_of` is - incorrectly called with multiple str arguments - - ``enable_debug_on_named_expressions`` - flag to auto-enable debug on all subsequent - calls to :class:`ParserElement.set_name` - - Diagnostics are enabled/disabled by calling :class:`enable_diag` and :class:`disable_diag`. - All warnings can be enabled by calling :class:`enable_all_warnings`. - """ - - warn_multiple_tokens_in_named_alternation = 0 - warn_ungrouped_named_tokens_in_collection = 1 - warn_name_set_on_empty_Forward = 2 - warn_on_parse_using_empty_Forward = 3 - warn_on_assignment_to_Forward = 4 - warn_on_multiple_string_args_to_oneof = 5 - warn_on_match_first_with_lshift_operator = 6 - enable_debug_on_named_expressions = 7 - - -def enable_diag(diag_enum: Diagnostics) -> None: - """ - Enable a global pyparsing diagnostic flag (see :class:`Diagnostics`). - """ - __diag__.enable(diag_enum.name) - - -def disable_diag(diag_enum: Diagnostics) -> None: - """ - Disable a global pyparsing diagnostic flag (see :class:`Diagnostics`). - """ - __diag__.disable(diag_enum.name) - - -def enable_all_warnings() -> None: - """ - Enable all global pyparsing diagnostic warnings (see :class:`Diagnostics`). - """ - __diag__.enable_all_warnings() - - -# hide abstract class -del __config_flags - - -def _should_enable_warnings( - cmd_line_warn_options: typing.Iterable[str], warn_env_var: typing.Optional[str] -) -> bool: - enable = bool(warn_env_var) - for warn_opt in cmd_line_warn_options: - w_action, w_message, w_category, w_module, w_line = (warn_opt + "::::").split( - ":" - )[:5] - if not w_action.lower().startswith("i") and ( - not (w_message or w_category or w_module) or w_module == "pyparsing" - ): - enable = True - elif w_action.lower().startswith("i") and w_module in ("pyparsing", ""): - enable = False - return enable - - -if _should_enable_warnings( - sys.warnoptions, os.environ.get("PYPARSINGENABLEALLWARNINGS") -): - enable_all_warnings() - - -# build list of single arg builtins, that can be used as parse actions -_single_arg_builtins = { - sum, - len, - sorted, - reversed, - list, - tuple, - set, - any, - all, - min, - max, -} - -_generatorType = types.GeneratorType -ParseImplReturnType = Tuple[int, Any] -PostParseReturnType = Union[ParseResults, Sequence[ParseResults]] -ParseAction = Union[ - Callable[[], Any], - Callable[[ParseResults], Any], - Callable[[int, ParseResults], Any], - Callable[[str, int, ParseResults], Any], -] -ParseCondition = Union[ - Callable[[], bool], - Callable[[ParseResults], bool], - Callable[[int, ParseResults], bool], - Callable[[str, int, ParseResults], bool], -] -ParseFailAction = Callable[[str, int, "ParserElement", Exception], None] -DebugStartAction = Callable[[str, int, "ParserElement", bool], None] -DebugSuccessAction = Callable[ - [str, int, int, "ParserElement", ParseResults, bool], None -] -DebugExceptionAction = Callable[[str, int, "ParserElement", Exception, bool], None] - - -alphas = string.ascii_uppercase + string.ascii_lowercase -identchars = pyparsing_unicode.Latin1.identchars -identbodychars = pyparsing_unicode.Latin1.identbodychars -nums = "0123456789" -hexnums = nums + "ABCDEFabcdef" -alphanums = alphas + nums -printables = "".join([c for c in string.printable if c not in string.whitespace]) - -_trim_arity_call_line: traceback.StackSummary = None # type: ignore[assignment] - - -def _trim_arity(func, max_limit=3): - """decorator to trim function calls to match the arity of the target""" - global _trim_arity_call_line - - if func in _single_arg_builtins: - return lambda s, l, t: func(t) - - limit = 0 - found_arity = False - - # synthesize what would be returned by traceback.extract_stack at the call to - # user's parse action 'func', so that we don't incur call penalty at parse time - - # fmt: off - LINE_DIFF = 7 - # IF ANY CODE CHANGES, EVEN JUST COMMENTS OR BLANK LINES, BETWEEN THE NEXT LINE AND - # THE CALL TO FUNC INSIDE WRAPPER, LINE_DIFF MUST BE MODIFIED!!!! - _trim_arity_call_line = (_trim_arity_call_line or traceback.extract_stack(limit=2)[-1]) - pa_call_line_synth = (_trim_arity_call_line[0], _trim_arity_call_line[1] + LINE_DIFF) - - def wrapper(*args): - nonlocal found_arity, limit - while 1: - try: - ret = func(*args[limit:]) - found_arity = True - return ret - except TypeError as te: - # re-raise TypeErrors if they did not come from our arity testing - if found_arity: - raise - else: - tb = te.__traceback__ - frames = traceback.extract_tb(tb, limit=2) - frame_summary = frames[-1] - trim_arity_type_error = ( - [frame_summary[:2]][-1][:2] == pa_call_line_synth - ) - del tb - - if trim_arity_type_error: - if limit < max_limit: - limit += 1 - continue - - raise - # fmt: on - - # copy func name to wrapper for sensible debug output - # (can't use functools.wraps, since that messes with function signature) - func_name = getattr(func, "__name__", getattr(func, "__class__").__name__) - wrapper.__name__ = func_name - wrapper.__doc__ = func.__doc__ - - return wrapper - - -def condition_as_parse_action( - fn: ParseCondition, message: typing.Optional[str] = None, fatal: bool = False -) -> ParseAction: - """ - Function to convert a simple predicate function that returns ``True`` or ``False`` - into a parse action. Can be used in places when a parse action is required - and :class:`ParserElement.add_condition` cannot be used (such as when adding a condition - to an operator level in :class:`infix_notation`). - - Optional keyword arguments: - - - ``message`` - define a custom message to be used in the raised exception - - ``fatal`` - if True, will raise :class:`ParseFatalException` to stop parsing immediately; - otherwise will raise :class:`ParseException` - - """ - msg = message if message is not None else "failed user-defined condition" - exc_type = ParseFatalException if fatal else ParseException - fn = _trim_arity(fn) - - @wraps(fn) - def pa(s, l, t): - if not bool(fn(s, l, t)): - raise exc_type(s, l, msg) - - return pa - - -def _default_start_debug_action( - instring: str, loc: int, expr: "ParserElement", cache_hit: bool = False -): - cache_hit_str = "*" if cache_hit else "" - print( - ( - f"{cache_hit_str}Match {expr} at loc {loc}({lineno(loc, instring)},{col(loc, instring)})\n" - f" {line(loc, instring)}\n" - f" {' ' * (col(loc, instring) - 1)}^" - ) - ) - - -def _default_success_debug_action( - instring: str, - startloc: int, - endloc: int, - expr: "ParserElement", - toks: ParseResults, - cache_hit: bool = False, -): - cache_hit_str = "*" if cache_hit else "" - print(f"{cache_hit_str}Matched {expr} -> {toks.as_list()}") - - -def _default_exception_debug_action( - instring: str, - loc: int, - expr: "ParserElement", - exc: Exception, - cache_hit: bool = False, -): - cache_hit_str = "*" if cache_hit else "" - print(f"{cache_hit_str}Match {expr} failed, {type(exc).__name__} raised: {exc}") - - -def null_debug_action(*args): - """'Do-nothing' debug action, to suppress debugging output during parsing.""" - - -class ParserElement(ABC): - """Abstract base level parser element class.""" - - DEFAULT_WHITE_CHARS: str = " \n\t\r" - verbose_stacktrace: bool = False - _literalStringClass: type = None # type: ignore[assignment] - - @staticmethod - def set_default_whitespace_chars(chars: str) -> None: - r""" - Overrides the default whitespace chars - - Example:: - - # default whitespace chars are space, <TAB> and newline - Word(alphas)[1, ...].parse_string("abc def\nghi jkl") # -> ['abc', 'def', 'ghi', 'jkl'] - - # change to just treat newline as significant - ParserElement.set_default_whitespace_chars(" \t") - Word(alphas)[1, ...].parse_string("abc def\nghi jkl") # -> ['abc', 'def'] - """ - ParserElement.DEFAULT_WHITE_CHARS = chars - - # update whitespace all parse expressions defined in this module - for expr in _builtin_exprs: - if expr.copyDefaultWhiteChars: - expr.whiteChars = set(chars) - - @staticmethod - def inline_literals_using(cls: type) -> None: - """ - Set class to be used for inclusion of string literals into a parser. - - Example:: - - # default literal class used is Literal - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - date_str.parse_string("1999/12/31") # -> ['1999', '/', '12', '/', '31'] - - - # change to Suppress - ParserElement.inline_literals_using(Suppress) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - date_str.parse_string("1999/12/31") # -> ['1999', '12', '31'] - """ - ParserElement._literalStringClass = cls - - @classmethod - def using_each(cls, seq, **class_kwargs): - """ - Yields a sequence of class(obj, **class_kwargs) for obj in seq. - - Example:: - - LPAR, RPAR, LBRACE, RBRACE, SEMI = Suppress.using_each("(){};") - - """ - yield from (cls(obj, **class_kwargs) for obj in seq) - - class DebugActions(NamedTuple): - debug_try: typing.Optional[DebugStartAction] - debug_match: typing.Optional[DebugSuccessAction] - debug_fail: typing.Optional[DebugExceptionAction] - - def __init__(self, savelist: bool = False): - self.parseAction: List[ParseAction] = list() - self.failAction: typing.Optional[ParseFailAction] = None - self.customName: str = None # type: ignore[assignment] - self._defaultName: typing.Optional[str] = None - self.resultsName: str = None # type: ignore[assignment] - self.saveAsList = savelist - self.skipWhitespace = True - self.whiteChars = set(ParserElement.DEFAULT_WHITE_CHARS) - self.copyDefaultWhiteChars = True - # used when checking for left-recursion - self.mayReturnEmpty = False - self.keepTabs = False - self.ignoreExprs: List["ParserElement"] = list() - self.debug = False - self.streamlined = False - # optimize exception handling for subclasses that don't advance parse index - self.mayIndexError = True - self.errmsg = "" - # mark results names as modal (report only last) or cumulative (list all) - self.modalResults = True - # custom debug actions - self.debugActions = self.DebugActions(None, None, None) - # avoid redundant calls to preParse - self.callPreparse = True - self.callDuringTry = False - self.suppress_warnings_: List[Diagnostics] = [] - - def suppress_warning(self, warning_type: Diagnostics) -> "ParserElement": - """ - Suppress warnings emitted for a particular diagnostic on this expression. - - Example:: - - base = pp.Forward() - base.suppress_warning(Diagnostics.warn_on_parse_using_empty_Forward) - - # statement would normally raise a warning, but is now suppressed - print(base.parse_string("x")) - - """ - self.suppress_warnings_.append(warning_type) - return self - - def visit_all(self): - """General-purpose method to yield all expressions and sub-expressions - in a grammar. Typically just for internal use. - """ - to_visit = deque([self]) - seen = set() - while to_visit: - cur = to_visit.popleft() - - # guard against looping forever through recursive grammars - if cur in seen: - continue - seen.add(cur) - - to_visit.extend(cur.recurse()) - yield cur - - def copy(self) -> "ParserElement": - """ - Make a copy of this :class:`ParserElement`. Useful for defining - different parse actions for the same parsing pattern, using copies of - the original parse element. - - Example:: - - integer = Word(nums).set_parse_action(lambda toks: int(toks[0])) - integerK = integer.copy().add_parse_action(lambda toks: toks[0] * 1024) + Suppress("K") - integerM = integer.copy().add_parse_action(lambda toks: toks[0] * 1024 * 1024) + Suppress("M") - - print((integerK | integerM | integer)[1, ...].parse_string("5K 100 640K 256M")) - - prints:: - - [5120, 100, 655360, 268435456] - - Equivalent form of ``expr.copy()`` is just ``expr()``:: - - integerM = integer().add_parse_action(lambda toks: toks[0] * 1024 * 1024) + Suppress("M") - """ - cpy = copy.copy(self) - cpy.parseAction = self.parseAction[:] - cpy.ignoreExprs = self.ignoreExprs[:] - if self.copyDefaultWhiteChars: - cpy.whiteChars = set(ParserElement.DEFAULT_WHITE_CHARS) - return cpy - - def set_results_name( - self, name: str, list_all_matches: bool = False, *, listAllMatches: bool = False - ) -> "ParserElement": - """ - Define name for referencing matching tokens as a nested attribute - of the returned parse results. - - Normally, results names are assigned as you would assign keys in a dict: - any existing value is overwritten by later values. If it is necessary to - keep all values captured for a particular results name, call ``set_results_name`` - with ``list_all_matches`` = True. - - NOTE: ``set_results_name`` returns a *copy* of the original :class:`ParserElement` object; - this is so that the client can define a basic element, such as an - integer, and reference it in multiple places with different names. - - You can also set results names using the abbreviated syntax, - ``expr("name")`` in place of ``expr.set_results_name("name")`` - - see :class:`__call__`. If ``list_all_matches`` is required, use - ``expr("name*")``. - - Example:: - - date_str = (integer.set_results_name("year") + '/' - + integer.set_results_name("month") + '/' - + integer.set_results_name("day")) - - # equivalent form: - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - """ - listAllMatches = listAllMatches or list_all_matches - return self._setResultsName(name, listAllMatches) - - def _setResultsName(self, name, listAllMatches=False): - if name is None: - return self - newself = self.copy() - if name.endswith("*"): - name = name[:-1] - listAllMatches = True - newself.resultsName = name - newself.modalResults = not listAllMatches - return newself - - def set_break(self, break_flag: bool = True) -> "ParserElement": - """ - Method to invoke the Python pdb debugger when this element is - about to be parsed. Set ``break_flag`` to ``True`` to enable, ``False`` to - disable. - """ - if break_flag: - _parseMethod = self._parse - - def breaker(instring, loc, doActions=True, callPreParse=True): - import pdb - - # this call to pdb.set_trace() is intentional, not a checkin error - pdb.set_trace() - return _parseMethod(instring, loc, doActions, callPreParse) - - breaker._originalParseMethod = _parseMethod # type: ignore [attr-defined] - self._parse = breaker # type: ignore [assignment] - else: - if hasattr(self._parse, "_originalParseMethod"): - self._parse = self._parse._originalParseMethod # type: ignore [attr-defined, assignment] - return self - - def set_parse_action(self, *fns: ParseAction, **kwargs) -> "ParserElement": - """ - Define one or more actions to perform when successfully matching parse element definition. - - Parse actions can be called to perform data conversions, do extra validation, - update external data structures, or enhance or replace the parsed tokens. - Each parse action ``fn`` is a callable method with 0-3 arguments, called as - ``fn(s, loc, toks)`` , ``fn(loc, toks)`` , ``fn(toks)`` , or just ``fn()`` , where: - - - ``s`` = the original string being parsed (see note below) - - ``loc`` = the location of the matching substring - - ``toks`` = a list of the matched tokens, packaged as a :class:`ParseResults` object - - The parsed tokens are passed to the parse action as ParseResults. They can be - modified in place using list-style append, extend, and pop operations to update - the parsed list elements; and with dictionary-style item set and del operations - to add, update, or remove any named results. If the tokens are modified in place, - it is not necessary to return them with a return statement. - - Parse actions can also completely replace the given tokens, with another ``ParseResults`` - object, or with some entirely different object (common for parse actions that perform data - conversions). A convenient way to build a new parse result is to define the values - using a dict, and then create the return value using :class:`ParseResults.from_dict`. - - If None is passed as the ``fn`` parse action, all previously added parse actions for this - expression are cleared. - - Optional keyword arguments: - - - ``call_during_try`` = (default= ``False``) indicate if parse action should be run during - lookaheads and alternate testing. For parse actions that have side effects, it is - important to only call the parse action once it is determined that it is being - called as part of a successful parse. For parse actions that perform additional - validation, then call_during_try should be passed as True, so that the validation - code is included in the preliminary "try" parses. - - Note: the default parsing behavior is to expand tabs in the input string - before starting the parsing process. See :class:`parse_string` for more - information on parsing strings containing ``<TAB>`` s, and suggested - methods to maintain a consistent view of the parsed string, the parse - location, and line and column positions within the parsed string. - - Example:: - - # parse dates in the form YYYY/MM/DD - - # use parse action to convert toks from str to int at parse time - def convert_to_int(toks): - return int(toks[0]) - - # use a parse action to verify that the date is a valid date - def is_valid_date(instring, loc, toks): - from datetime import date - year, month, day = toks[::2] - try: - date(year, month, day) - except ValueError: - raise ParseException(instring, loc, "invalid date given") - - integer = Word(nums) - date_str = integer + '/' + integer + '/' + integer - - # add parse actions - integer.set_parse_action(convert_to_int) - date_str.set_parse_action(is_valid_date) - - # note that integer fields are now ints, not strings - date_str.run_tests(''' - # successful parse - note that integer fields were converted to ints - 1999/12/31 - - # fail - invalid date - 1999/13/31 - ''') - """ - if list(fns) == [None]: - self.parseAction = [] - else: - if not all(callable(fn) for fn in fns): - raise TypeError("parse actions must be callable") - self.parseAction = [_trim_arity(fn) for fn in fns] - self.callDuringTry = kwargs.get( - "call_during_try", kwargs.get("callDuringTry", False) - ) - return self - - def add_parse_action(self, *fns: ParseAction, **kwargs) -> "ParserElement": - """ - Add one or more parse actions to expression's list of parse actions. See :class:`set_parse_action`. - - See examples in :class:`copy`. - """ - self.parseAction += [_trim_arity(fn) for fn in fns] - self.callDuringTry = self.callDuringTry or kwargs.get( - "call_during_try", kwargs.get("callDuringTry", False) - ) - return self - - def add_condition(self, *fns: ParseCondition, **kwargs) -> "ParserElement": - """Add a boolean predicate function to expression's list of parse actions. See - :class:`set_parse_action` for function call signatures. Unlike ``set_parse_action``, - functions passed to ``add_condition`` need to return boolean success/fail of the condition. - - Optional keyword arguments: - - - ``message`` = define a custom message to be used in the raised exception - - ``fatal`` = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise - ParseException - - ``call_during_try`` = boolean to indicate if this method should be called during internal tryParse calls, - default=False - - Example:: - - integer = Word(nums).set_parse_action(lambda toks: int(toks[0])) - year_int = integer.copy() - year_int.add_condition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later") - date_str = year_int + '/' + integer + '/' + integer - - result = date_str.parse_string("1999/12/31") # -> Exception: Only support years 2000 and later (at char 0), - (line:1, col:1) - """ - for fn in fns: - self.parseAction.append( - condition_as_parse_action( - fn, - message=str(kwargs.get("message")), - fatal=bool(kwargs.get("fatal", False)), - ) - ) - - self.callDuringTry = self.callDuringTry or kwargs.get( - "call_during_try", kwargs.get("callDuringTry", False) - ) - return self - - def set_fail_action(self, fn: ParseFailAction) -> "ParserElement": - """ - Define action to perform if parsing fails at this expression. - Fail acton fn is a callable function that takes the arguments - ``fn(s, loc, expr, err)`` where: - - - ``s`` = string being parsed - - ``loc`` = location where expression match was attempted and failed - - ``expr`` = the parse expression that failed - - ``err`` = the exception thrown - - The function returns no value. It may throw :class:`ParseFatalException` - if it is desired to stop parsing immediately.""" - self.failAction = fn - return self - - def _skipIgnorables(self, instring: str, loc: int) -> int: - if not self.ignoreExprs: - return loc - exprsFound = True - ignore_expr_fns = [e._parse for e in self.ignoreExprs] - while exprsFound: - exprsFound = False - for ignore_fn in ignore_expr_fns: - try: - while 1: - loc, dummy = ignore_fn(instring, loc) - exprsFound = True - except ParseException: - pass - return loc - - def preParse(self, instring: str, loc: int) -> int: - if self.ignoreExprs: - loc = self._skipIgnorables(instring, loc) - - if self.skipWhitespace: - instrlen = len(instring) - white_chars = self.whiteChars - while loc < instrlen and instring[loc] in white_chars: - loc += 1 - - return loc - - def parseImpl(self, instring, loc, doActions=True): - return loc, [] - - def postParse(self, instring, loc, tokenlist): - return tokenlist - - # @profile - def _parseNoCache( - self, instring, loc, doActions=True, callPreParse=True - ) -> Tuple[int, ParseResults]: - TRY, MATCH, FAIL = 0, 1, 2 - debugging = self.debug # and doActions) - len_instring = len(instring) - - if debugging or self.failAction: - # print("Match {} at loc {}({}, {})".format(self, loc, lineno(loc, instring), col(loc, instring))) - try: - if callPreParse and self.callPreparse: - pre_loc = self.preParse(instring, loc) - else: - pre_loc = loc - tokens_start = pre_loc - if self.debugActions.debug_try: - self.debugActions.debug_try(instring, tokens_start, self, False) - if self.mayIndexError or pre_loc >= len_instring: - try: - loc, tokens = self.parseImpl(instring, pre_loc, doActions) - except IndexError: - raise ParseException(instring, len_instring, self.errmsg, self) - else: - loc, tokens = self.parseImpl(instring, pre_loc, doActions) - except Exception as err: - # print("Exception raised:", err) - if self.debugActions.debug_fail: - self.debugActions.debug_fail( - instring, tokens_start, self, err, False - ) - if self.failAction: - self.failAction(instring, tokens_start, self, err) - raise - else: - if callPreParse and self.callPreparse: - pre_loc = self.preParse(instring, loc) - else: - pre_loc = loc - tokens_start = pre_loc - if self.mayIndexError or pre_loc >= len_instring: - try: - loc, tokens = self.parseImpl(instring, pre_loc, doActions) - except IndexError: - raise ParseException(instring, len_instring, self.errmsg, self) - else: - loc, tokens = self.parseImpl(instring, pre_loc, doActions) - - tokens = self.postParse(instring, loc, tokens) - - ret_tokens = ParseResults( - tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults - ) - if self.parseAction and (doActions or self.callDuringTry): - if debugging: - try: - for fn in self.parseAction: - try: - tokens = fn(instring, tokens_start, ret_tokens) # type: ignore [call-arg, arg-type] - except IndexError as parse_action_exc: - exc = ParseException("exception raised in parse action") - raise exc from parse_action_exc - - if tokens is not None and tokens is not ret_tokens: - ret_tokens = ParseResults( - tokens, - self.resultsName, - asList=self.saveAsList - and isinstance(tokens, (ParseResults, list)), - modal=self.modalResults, - ) - except Exception as err: - # print "Exception raised in user parse action:", err - if self.debugActions.debug_fail: - self.debugActions.debug_fail( - instring, tokens_start, self, err, False - ) - raise - else: - for fn in self.parseAction: - try: - tokens = fn(instring, tokens_start, ret_tokens) # type: ignore [call-arg, arg-type] - except IndexError as parse_action_exc: - exc = ParseException("exception raised in parse action") - raise exc from parse_action_exc - - if tokens is not None and tokens is not ret_tokens: - ret_tokens = ParseResults( - tokens, - self.resultsName, - asList=self.saveAsList - and isinstance(tokens, (ParseResults, list)), - modal=self.modalResults, - ) - if debugging: - # print("Matched", self, "->", ret_tokens.as_list()) - if self.debugActions.debug_match: - self.debugActions.debug_match( - instring, tokens_start, loc, self, ret_tokens, False - ) - - return loc, ret_tokens - - def try_parse( - self, - instring: str, - loc: int, - *, - raise_fatal: bool = False, - do_actions: bool = False, - ) -> int: - try: - return self._parse(instring, loc, doActions=do_actions)[0] - except ParseFatalException: - if raise_fatal: - raise - raise ParseException(instring, loc, self.errmsg, self) - - def can_parse_next(self, instring: str, loc: int, do_actions: bool = False) -> bool: - try: - self.try_parse(instring, loc, do_actions=do_actions) - except (ParseException, IndexError): - return False - else: - return True - - # cache for left-recursion in Forward references - recursion_lock = RLock() - recursion_memos: typing.Dict[ - Tuple[int, "Forward", bool], Tuple[int, Union[ParseResults, Exception]] - ] = {} - - class _CacheType(dict): - """ - class to help type checking - """ - - not_in_cache: bool - - def get(self, *args): - ... - - def set(self, *args): - ... - - # argument cache for optimizing repeated calls when backtracking through recursive expressions - packrat_cache = ( - _CacheType() - ) # set later by enable_packrat(); this is here so that reset_cache() doesn't fail - packrat_cache_lock = RLock() - packrat_cache_stats = [0, 0] - - # this method gets repeatedly called during backtracking with the same arguments - - # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression - def _parseCache( - self, instring, loc, doActions=True, callPreParse=True - ) -> Tuple[int, ParseResults]: - HIT, MISS = 0, 1 - TRY, MATCH, FAIL = 0, 1, 2 - lookup = (self, instring, loc, callPreParse, doActions) - with ParserElement.packrat_cache_lock: - cache = ParserElement.packrat_cache - value = cache.get(lookup) - if value is cache.not_in_cache: - ParserElement.packrat_cache_stats[MISS] += 1 - try: - value = self._parseNoCache(instring, loc, doActions, callPreParse) - except ParseBaseException as pe: - # cache a copy of the exception, without the traceback - cache.set(lookup, pe.__class__(*pe.args)) - raise - else: - cache.set(lookup, (value[0], value[1].copy(), loc)) - return value - else: - ParserElement.packrat_cache_stats[HIT] += 1 - if self.debug and self.debugActions.debug_try: - try: - self.debugActions.debug_try(instring, loc, self, cache_hit=True) # type: ignore [call-arg] - except TypeError: - pass - if isinstance(value, Exception): - if self.debug and self.debugActions.debug_fail: - try: - self.debugActions.debug_fail( - instring, loc, self, value, cache_hit=True # type: ignore [call-arg] - ) - except TypeError: - pass - raise value - - value = cast(Tuple[int, ParseResults, int], value) - loc_, result, endloc = value[0], value[1].copy(), value[2] - if self.debug and self.debugActions.debug_match: - try: - self.debugActions.debug_match( - instring, loc_, endloc, self, result, cache_hit=True # type: ignore [call-arg] - ) - except TypeError: - pass - - return loc_, result - - _parse = _parseNoCache - - @staticmethod - def reset_cache() -> None: - ParserElement.packrat_cache.clear() - ParserElement.packrat_cache_stats[:] = [0] * len( - ParserElement.packrat_cache_stats - ) - ParserElement.recursion_memos.clear() - - _packratEnabled = False - _left_recursion_enabled = False - - @staticmethod - def disable_memoization() -> None: - """ - Disables active Packrat or Left Recursion parsing and their memoization - - This method also works if neither Packrat nor Left Recursion are enabled. - This makes it safe to call before activating Packrat nor Left Recursion - to clear any previous settings. - """ - ParserElement.reset_cache() - ParserElement._left_recursion_enabled = False - ParserElement._packratEnabled = False - ParserElement._parse = ParserElement._parseNoCache - - @staticmethod - def enable_left_recursion( - cache_size_limit: typing.Optional[int] = None, *, force=False - ) -> None: - """ - Enables "bounded recursion" parsing, which allows for both direct and indirect - left-recursion. During parsing, left-recursive :class:`Forward` elements are - repeatedly matched with a fixed recursion depth that is gradually increased - until finding the longest match. - - Example:: - - from pip._vendor import pyparsing as pp - pp.ParserElement.enable_left_recursion() - - E = pp.Forward("E") - num = pp.Word(pp.nums) - # match `num`, or `num '+' num`, or `num '+' num '+' num`, ... - E <<= E + '+' - num | num - - print(E.parse_string("1+2+3")) - - Recursion search naturally memoizes matches of ``Forward`` elements and may - thus skip reevaluation of parse actions during backtracking. This may break - programs with parse actions which rely on strict ordering of side-effects. - - Parameters: - - - ``cache_size_limit`` - (default=``None``) - memoize at most this many - ``Forward`` elements during matching; if ``None`` (the default), - memoize all ``Forward`` elements. - - Bounded Recursion parsing works similar but not identical to Packrat parsing, - thus the two cannot be used together. Use ``force=True`` to disable any - previous, conflicting settings. - """ - if force: - ParserElement.disable_memoization() - elif ParserElement._packratEnabled: - raise RuntimeError("Packrat and Bounded Recursion are not compatible") - if cache_size_limit is None: - ParserElement.recursion_memos = _UnboundedMemo() # type: ignore[assignment] - elif cache_size_limit > 0: - ParserElement.recursion_memos = _LRUMemo(capacity=cache_size_limit) # type: ignore[assignment] - else: - raise NotImplementedError("Memo size of %s" % cache_size_limit) - ParserElement._left_recursion_enabled = True - - @staticmethod - def enable_packrat(cache_size_limit: int = 128, *, force: bool = False) -> None: - """ - Enables "packrat" parsing, which adds memoizing to the parsing logic. - Repeated parse attempts at the same string location (which happens - often in many complex grammars) can immediately return a cached value, - instead of re-executing parsing/validating code. Memoizing is done of - both valid results and parsing exceptions. - - Parameters: - - - ``cache_size_limit`` - (default= ``128``) - if an integer value is provided - will limit the size of the packrat cache; if None is passed, then - the cache size will be unbounded; if 0 is passed, the cache will - be effectively disabled. - - This speedup may break existing programs that use parse actions that - have side-effects. For this reason, packrat parsing is disabled when - you first import pyparsing. To activate the packrat feature, your - program must call the class method :class:`ParserElement.enable_packrat`. - For best results, call ``enable_packrat()`` immediately after - importing pyparsing. - - Example:: - - from pip._vendor import pyparsing - pyparsing.ParserElement.enable_packrat() - - Packrat parsing works similar but not identical to Bounded Recursion parsing, - thus the two cannot be used together. Use ``force=True`` to disable any - previous, conflicting settings. - """ - if force: - ParserElement.disable_memoization() - elif ParserElement._left_recursion_enabled: - raise RuntimeError("Packrat and Bounded Recursion are not compatible") - if not ParserElement._packratEnabled: - ParserElement._packratEnabled = True - if cache_size_limit is None: - ParserElement.packrat_cache = _UnboundedCache() - else: - ParserElement.packrat_cache = _FifoCache(cache_size_limit) # type: ignore[assignment] - ParserElement._parse = ParserElement._parseCache - - def parse_string( - self, instring: str, parse_all: bool = False, *, parseAll: bool = False - ) -> ParseResults: - """ - Parse a string with respect to the parser definition. This function is intended as the primary interface to the - client code. - - :param instring: The input string to be parsed. - :param parse_all: If set, the entire input string must match the grammar. - :param parseAll: retained for pre-PEP8 compatibility, will be removed in a future release. - :raises ParseException: Raised if ``parse_all`` is set and the input string does not match the whole grammar. - :returns: the parsed data as a :class:`ParseResults` object, which may be accessed as a `list`, a `dict`, or - an object with attributes if the given parser includes results names. - - If the input string is required to match the entire grammar, ``parse_all`` flag must be set to ``True``. This - is also equivalent to ending the grammar with :class:`StringEnd`\\ (). - - To report proper column numbers, ``parse_string`` operates on a copy of the input string where all tabs are - converted to spaces (8 spaces per tab, as per the default in ``string.expandtabs``). If the input string - contains tabs and the grammar uses parse actions that use the ``loc`` argument to index into the string - being parsed, one can ensure a consistent view of the input string by doing one of the following: - - - calling ``parse_with_tabs`` on your grammar before calling ``parse_string`` (see :class:`parse_with_tabs`), - - define your parse action using the full ``(s,loc,toks)`` signature, and reference the input string using the - parse action's ``s`` argument, or - - explicitly expand the tabs in your input string before calling ``parse_string``. - - Examples: - - By default, partial matches are OK. - - >>> res = Word('a').parse_string('aaaaabaaa') - >>> print(res) - ['aaaaa'] - - The parsing behavior varies by the inheriting class of this abstract class. Please refer to the children - directly to see more examples. - - It raises an exception if parse_all flag is set and instring does not match the whole grammar. - - >>> res = Word('a').parse_string('aaaaabaaa', parse_all=True) - Traceback (most recent call last): - ... - pyparsing.ParseException: Expected end of text, found 'b' (at char 5), (line:1, col:6) - """ - parseAll = parse_all or parseAll - - ParserElement.reset_cache() - if not self.streamlined: - self.streamline() - for e in self.ignoreExprs: - e.streamline() - if not self.keepTabs: - instring = instring.expandtabs() - try: - loc, tokens = self._parse(instring, 0) - if parseAll: - loc = self.preParse(instring, loc) - se = Empty() + StringEnd() - se._parse(instring, loc) - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clearing out pyparsing internal stack trace - raise exc.with_traceback(None) - else: - return tokens - - def scan_string( - self, - instring: str, - max_matches: int = _MAX_INT, - overlap: bool = False, - *, - debug: bool = False, - maxMatches: int = _MAX_INT, - ) -> Generator[Tuple[ParseResults, int, int], None, None]: - """ - Scan the input string for expression matches. Each match will return the - matching tokens, start location, and end location. May be called with optional - ``max_matches`` argument, to clip scanning after 'n' matches are found. If - ``overlap`` is specified, then overlapping matches will be reported. - - Note that the start and end locations are reported relative to the string - being parsed. See :class:`parse_string` for more information on parsing - strings with embedded tabs. - - Example:: - - source = "sldjf123lsdjjkf345sldkjf879lkjsfd987" - print(source) - for tokens, start, end in Word(alphas).scan_string(source): - print(' '*start + '^'*(end-start)) - print(' '*start + tokens[0]) - - prints:: - - sldjf123lsdjjkf345sldkjf879lkjsfd987 - ^^^^^ - sldjf - ^^^^^^^ - lsdjjkf - ^^^^^^ - sldkjf - ^^^^^^ - lkjsfd - """ - maxMatches = min(maxMatches, max_matches) - if not self.streamlined: - self.streamline() - for e in self.ignoreExprs: - e.streamline() - - if not self.keepTabs: - instring = str(instring).expandtabs() - instrlen = len(instring) - loc = 0 - preparseFn = self.preParse - parseFn = self._parse - ParserElement.resetCache() - matches = 0 - try: - while loc <= instrlen and matches < maxMatches: - try: - preloc: int = preparseFn(instring, loc) - nextLoc: int - tokens: ParseResults - nextLoc, tokens = parseFn(instring, preloc, callPreParse=False) - except ParseException: - loc = preloc + 1 - else: - if nextLoc > loc: - matches += 1 - if debug: - print( - { - "tokens": tokens.asList(), - "start": preloc, - "end": nextLoc, - } - ) - yield tokens, preloc, nextLoc - if overlap: - nextloc = preparseFn(instring, loc) - if nextloc > loc: - loc = nextLoc - else: - loc += 1 - else: - loc = nextLoc - else: - loc = preloc + 1 - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc.with_traceback(None) - - def transform_string(self, instring: str, *, debug: bool = False) -> str: - """ - Extension to :class:`scan_string`, to modify matching text with modified tokens that may - be returned from a parse action. To use ``transform_string``, define a grammar and - attach a parse action to it that modifies the returned token list. - Invoking ``transform_string()`` on a target string will then scan for matches, - and replace the matched text patterns according to the logic in the parse - action. ``transform_string()`` returns the resulting transformed string. - - Example:: - - wd = Word(alphas) - wd.set_parse_action(lambda toks: toks[0].title()) - - print(wd.transform_string("now is the winter of our discontent made glorious summer by this sun of york.")) - - prints:: - - Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York. - """ - out: List[str] = [] - lastE = 0 - # force preservation of <TAB>s, to minimize unwanted transformation of string, and to - # keep string locs straight between transform_string and scan_string - self.keepTabs = True - try: - for t, s, e in self.scan_string(instring, debug=debug): - out.append(instring[lastE:s]) - if t: - if isinstance(t, ParseResults): - out += t.as_list() - elif isinstance(t, Iterable) and not isinstance(t, str_type): - out.extend(t) - else: - out.append(t) - lastE = e - out.append(instring[lastE:]) - out = [o for o in out if o] - return "".join([str(s) for s in _flatten(out)]) - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc.with_traceback(None) - - def search_string( - self, - instring: str, - max_matches: int = _MAX_INT, - *, - debug: bool = False, - maxMatches: int = _MAX_INT, - ) -> ParseResults: - """ - Another extension to :class:`scan_string`, simplifying the access to the tokens found - to match the given parse expression. May be called with optional - ``max_matches`` argument, to clip searching after 'n' matches are found. - - Example:: - - # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters - cap_word = Word(alphas.upper(), alphas.lower()) - - print(cap_word.search_string("More than Iron, more than Lead, more than Gold I need Electricity")) - - # the sum() builtin can be used to merge results into a single ParseResults object - print(sum(cap_word.search_string("More than Iron, more than Lead, more than Gold I need Electricity"))) - - prints:: - - [['More'], ['Iron'], ['Lead'], ['Gold'], ['I'], ['Electricity']] - ['More', 'Iron', 'Lead', 'Gold', 'I', 'Electricity'] - """ - maxMatches = min(maxMatches, max_matches) - try: - return ParseResults( - [t for t, s, e in self.scan_string(instring, maxMatches, debug=debug)] - ) - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc.with_traceback(None) - - def split( - self, - instring: str, - maxsplit: int = _MAX_INT, - include_separators: bool = False, - *, - includeSeparators=False, - ) -> Generator[str, None, None]: - """ - Generator method to split a string using the given expression as a separator. - May be called with optional ``maxsplit`` argument, to limit the number of splits; - and the optional ``include_separators`` argument (default= ``False``), if the separating - matching text should be included in the split results. - - Example:: - - punc = one_of(list(".,;:/-!?")) - print(list(punc.split("This, this?, this sentence, is badly punctuated!"))) - - prints:: - - ['This', ' this', '', ' this sentence', ' is badly punctuated', ''] - """ - includeSeparators = includeSeparators or include_separators - last = 0 - for t, s, e in self.scan_string(instring, max_matches=maxsplit): - yield instring[last:s] - if includeSeparators: - yield t[0] - last = e - yield instring[last:] - - def __add__(self, other) -> "ParserElement": - """ - Implementation of ``+`` operator - returns :class:`And`. Adding strings to a :class:`ParserElement` - converts them to :class:`Literal`\\ s by default. - - Example:: - - greet = Word(alphas) + "," + Word(alphas) + "!" - hello = "Hello, World!" - print(hello, "->", greet.parse_string(hello)) - - prints:: - - Hello, World! -> ['Hello', ',', 'World', '!'] - - ``...`` may be used as a parse expression as a short form of :class:`SkipTo`:: - - Literal('start') + ... + Literal('end') - - is equivalent to:: - - Literal('start') + SkipTo('end')("_skipped*") + Literal('end') - - Note that the skipped text is returned with '_skipped' as a results name, - and to support having multiple skips in the same parser, the value returned is - a list of all skipped text. - """ - if other is Ellipsis: - return _PendingSkip(self) - - if isinstance(other, str_type): - other = self._literalStringClass(other) - if not isinstance(other, ParserElement): - return NotImplemented - return And([self, other]) - - def __radd__(self, other) -> "ParserElement": - """ - Implementation of ``+`` operator when left operand is not a :class:`ParserElement` - """ - if other is Ellipsis: - return SkipTo(self)("_skipped*") + self - - if isinstance(other, str_type): - other = self._literalStringClass(other) - if not isinstance(other, ParserElement): - return NotImplemented - return other + self - - def __sub__(self, other) -> "ParserElement": - """ - Implementation of ``-`` operator, returns :class:`And` with error stop - """ - if isinstance(other, str_type): - other = self._literalStringClass(other) - if not isinstance(other, ParserElement): - return NotImplemented - return self + And._ErrorStop() + other - - def __rsub__(self, other) -> "ParserElement": - """ - Implementation of ``-`` operator when left operand is not a :class:`ParserElement` - """ - if isinstance(other, str_type): - other = self._literalStringClass(other) - if not isinstance(other, ParserElement): - return NotImplemented - return other - self - - def __mul__(self, other) -> "ParserElement": - """ - Implementation of ``*`` operator, allows use of ``expr * 3`` in place of - ``expr + expr + expr``. Expressions may also be multiplied by a 2-integer - tuple, similar to ``{min, max}`` multipliers in regular expressions. Tuples - may also include ``None`` as in: - - - ``expr*(n, None)`` or ``expr*(n, )`` is equivalent - to ``expr*n + ZeroOrMore(expr)`` - (read as "at least n instances of ``expr``") - - ``expr*(None, n)`` is equivalent to ``expr*(0, n)`` - (read as "0 to n instances of ``expr``") - - ``expr*(None, None)`` is equivalent to ``ZeroOrMore(expr)`` - - ``expr*(1, None)`` is equivalent to ``OneOrMore(expr)`` - - Note that ``expr*(None, n)`` does not raise an exception if - more than n exprs exist in the input stream; that is, - ``expr*(None, n)`` does not enforce a maximum number of expr - occurrences. If this behavior is desired, then write - ``expr*(None, n) + ~expr`` - """ - if other is Ellipsis: - other = (0, None) - elif isinstance(other, tuple) and other[:1] == (Ellipsis,): - other = ((0,) + other[1:] + (None,))[:2] - - if isinstance(other, int): - minElements, optElements = other, 0 - elif isinstance(other, tuple): - other = tuple(o if o is not Ellipsis else None for o in other) - other = (other + (None, None))[:2] - if other[0] is None: - other = (0, other[1]) - if isinstance(other[0], int) and other[1] is None: - if other[0] == 0: - return ZeroOrMore(self) - if other[0] == 1: - return OneOrMore(self) - else: - return self * other[0] + ZeroOrMore(self) - elif isinstance(other[0], int) and isinstance(other[1], int): - minElements, optElements = other - optElements -= minElements - else: - return NotImplemented - else: - return NotImplemented - - if minElements < 0: - raise ValueError("cannot multiply ParserElement by negative value") - if optElements < 0: - raise ValueError( - "second tuple value must be greater or equal to first tuple value" - ) - if minElements == optElements == 0: - return And([]) - - if optElements: - - def makeOptionalList(n): - if n > 1: - return Opt(self + makeOptionalList(n - 1)) - else: - return Opt(self) - - if minElements: - if minElements == 1: - ret = self + makeOptionalList(optElements) - else: - ret = And([self] * minElements) + makeOptionalList(optElements) - else: - ret = makeOptionalList(optElements) - else: - if minElements == 1: - ret = self - else: - ret = And([self] * minElements) - return ret - - def __rmul__(self, other) -> "ParserElement": - return self.__mul__(other) - - def __or__(self, other) -> "ParserElement": - """ - Implementation of ``|`` operator - returns :class:`MatchFirst` - """ - if other is Ellipsis: - return _PendingSkip(self, must_skip=True) - - if isinstance(other, str_type): - # `expr | ""` is equivalent to `Opt(expr)` - if other == "": - return Opt(self) - other = self._literalStringClass(other) - if not isinstance(other, ParserElement): - return NotImplemented - return MatchFirst([self, other]) - - def __ror__(self, other) -> "ParserElement": - """ - Implementation of ``|`` operator when left operand is not a :class:`ParserElement` - """ - if isinstance(other, str_type): - other = self._literalStringClass(other) - if not isinstance(other, ParserElement): - return NotImplemented - return other | self - - def __xor__(self, other) -> "ParserElement": - """ - Implementation of ``^`` operator - returns :class:`Or` - """ - if isinstance(other, str_type): - other = self._literalStringClass(other) - if not isinstance(other, ParserElement): - return NotImplemented - return Or([self, other]) - - def __rxor__(self, other) -> "ParserElement": - """ - Implementation of ``^`` operator when left operand is not a :class:`ParserElement` - """ - if isinstance(other, str_type): - other = self._literalStringClass(other) - if not isinstance(other, ParserElement): - return NotImplemented - return other ^ self - - def __and__(self, other) -> "ParserElement": - """ - Implementation of ``&`` operator - returns :class:`Each` - """ - if isinstance(other, str_type): - other = self._literalStringClass(other) - if not isinstance(other, ParserElement): - return NotImplemented - return Each([self, other]) - - def __rand__(self, other) -> "ParserElement": - """ - Implementation of ``&`` operator when left operand is not a :class:`ParserElement` - """ - if isinstance(other, str_type): - other = self._literalStringClass(other) - if not isinstance(other, ParserElement): - return NotImplemented - return other & self - - def __invert__(self) -> "ParserElement": - """ - Implementation of ``~`` operator - returns :class:`NotAny` - """ - return NotAny(self) - - # disable __iter__ to override legacy use of sequential access to __getitem__ to - # iterate over a sequence - __iter__ = None - - def __getitem__(self, key): - """ - use ``[]`` indexing notation as a short form for expression repetition: - - - ``expr[n]`` is equivalent to ``expr*n`` - - ``expr[m, n]`` is equivalent to ``expr*(m, n)`` - - ``expr[n, ...]`` or ``expr[n,]`` is equivalent - to ``expr*n + ZeroOrMore(expr)`` - (read as "at least n instances of ``expr``") - - ``expr[..., n]`` is equivalent to ``expr*(0, n)`` - (read as "0 to n instances of ``expr``") - - ``expr[...]`` and ``expr[0, ...]`` are equivalent to ``ZeroOrMore(expr)`` - - ``expr[1, ...]`` is equivalent to ``OneOrMore(expr)`` - - ``None`` may be used in place of ``...``. - - Note that ``expr[..., n]`` and ``expr[m, n]`` do not raise an exception - if more than ``n`` ``expr``\\ s exist in the input stream. If this behavior is - desired, then write ``expr[..., n] + ~expr``. - - For repetition with a stop_on expression, use slice notation: - - - ``expr[...: end_expr]`` and ``expr[0, ...: end_expr]`` are equivalent to ``ZeroOrMore(expr, stop_on=end_expr)`` - - ``expr[1, ...: end_expr]`` is equivalent to ``OneOrMore(expr, stop_on=end_expr)`` - - """ - - stop_on_defined = False - stop_on = NoMatch() - if isinstance(key, slice): - key, stop_on = key.start, key.stop - if key is None: - key = ... - stop_on_defined = True - elif isinstance(key, tuple) and isinstance(key[-1], slice): - key, stop_on = (key[0], key[1].start), key[1].stop - stop_on_defined = True - - # convert single arg keys to tuples - if isinstance(key, str_type): - key = (key,) - try: - iter(key) - except TypeError: - key = (key, key) - - if len(key) > 2: - raise TypeError( - f"only 1 or 2 index arguments supported ({key[:5]}{f'... [{len(key)}]' if len(key) > 5 else ''})" - ) - - # clip to 2 elements - ret = self * tuple(key[:2]) - ret = typing.cast(_MultipleMatch, ret) - - if stop_on_defined: - ret.stopOn(stop_on) - - return ret - - def __call__(self, name: typing.Optional[str] = None) -> "ParserElement": - """ - Shortcut for :class:`set_results_name`, with ``list_all_matches=False``. - - If ``name`` is given with a trailing ``'*'`` character, then ``list_all_matches`` will be - passed as ``True``. - - If ``name`` is omitted, same as calling :class:`copy`. - - Example:: - - # these are equivalent - userdata = Word(alphas).set_results_name("name") + Word(nums + "-").set_results_name("socsecno") - userdata = Word(alphas)("name") + Word(nums + "-")("socsecno") - """ - if name is not None: - return self._setResultsName(name) - else: - return self.copy() - - def suppress(self) -> "ParserElement": - """ - Suppresses the output of this :class:`ParserElement`; useful to keep punctuation from - cluttering up returned output. - """ - return Suppress(self) - - def ignore_whitespace(self, recursive: bool = True) -> "ParserElement": - """ - Enables the skipping of whitespace before matching the characters in the - :class:`ParserElement`'s defined pattern. - - :param recursive: If ``True`` (the default), also enable whitespace skipping in child elements (if any) - """ - self.skipWhitespace = True - return self - - def leave_whitespace(self, recursive: bool = True) -> "ParserElement": - """ - Disables the skipping of whitespace before matching the characters in the - :class:`ParserElement`'s defined pattern. This is normally only used internally by - the pyparsing module, but may be needed in some whitespace-sensitive grammars. - - :param recursive: If true (the default), also disable whitespace skipping in child elements (if any) - """ - self.skipWhitespace = False - return self - - def set_whitespace_chars( - self, chars: Union[Set[str], str], copy_defaults: bool = False - ) -> "ParserElement": - """ - Overrides the default whitespace chars - """ - self.skipWhitespace = True - self.whiteChars = set(chars) - self.copyDefaultWhiteChars = copy_defaults - return self - - def parse_with_tabs(self) -> "ParserElement": - """ - Overrides default behavior to expand ``<TAB>`` s to spaces before parsing the input string. - Must be called before ``parse_string`` when the input grammar contains elements that - match ``<TAB>`` characters. - """ - self.keepTabs = True - return self - - def ignore(self, other: "ParserElement") -> "ParserElement": - """ - Define expression to be ignored (e.g., comments) while doing pattern - matching; may be called repeatedly, to define multiple comment or other - ignorable patterns. - - Example:: - - patt = Word(alphas)[1, ...] - patt.parse_string('ablaj /* comment */ lskjd') - # -> ['ablaj'] - - patt.ignore(c_style_comment) - patt.parse_string('ablaj /* comment */ lskjd') - # -> ['ablaj', 'lskjd'] - """ - import typing - - if isinstance(other, str_type): - other = Suppress(other) - - if isinstance(other, Suppress): - if other not in self.ignoreExprs: - self.ignoreExprs.append(other) - else: - self.ignoreExprs.append(Suppress(other.copy())) - return self - - def set_debug_actions( - self, - start_action: DebugStartAction, - success_action: DebugSuccessAction, - exception_action: DebugExceptionAction, - ) -> "ParserElement": - """ - Customize display of debugging messages while doing pattern matching: - - - ``start_action`` - method to be called when an expression is about to be parsed; - should have the signature ``fn(input_string: str, location: int, expression: ParserElement, cache_hit: bool)`` - - - ``success_action`` - method to be called when an expression has successfully parsed; - should have the signature ``fn(input_string: str, start_location: int, end_location: int, expression: ParserELement, parsed_tokens: ParseResults, cache_hit: bool)`` - - - ``exception_action`` - method to be called when expression fails to parse; - should have the signature ``fn(input_string: str, location: int, expression: ParserElement, exception: Exception, cache_hit: bool)`` - """ - self.debugActions = self.DebugActions( - start_action or _default_start_debug_action, # type: ignore[truthy-function] - success_action or _default_success_debug_action, # type: ignore[truthy-function] - exception_action or _default_exception_debug_action, # type: ignore[truthy-function] - ) - self.debug = True - return self - - def set_debug(self, flag: bool = True, recurse: bool = False) -> "ParserElement": - """ - Enable display of debugging messages while doing pattern matching. - Set ``flag`` to ``True`` to enable, ``False`` to disable. - Set ``recurse`` to ``True`` to set the debug flag on this expression and all sub-expressions. - - Example:: - - wd = Word(alphas).set_name("alphaword") - integer = Word(nums).set_name("numword") - term = wd | integer - - # turn on debugging for wd - wd.set_debug() - - term[1, ...].parse_string("abc 123 xyz 890") - - prints:: - - Match alphaword at loc 0(1,1) - Matched alphaword -> ['abc'] - Match alphaword at loc 3(1,4) - Exception raised:Expected alphaword (at char 4), (line:1, col:5) - Match alphaword at loc 7(1,8) - Matched alphaword -> ['xyz'] - Match alphaword at loc 11(1,12) - Exception raised:Expected alphaword (at char 12), (line:1, col:13) - Match alphaword at loc 15(1,16) - Exception raised:Expected alphaword (at char 15), (line:1, col:16) - - The output shown is that produced by the default debug actions - custom debug actions can be - specified using :class:`set_debug_actions`. Prior to attempting - to match the ``wd`` expression, the debugging message ``"Match <exprname> at loc <n>(<line>,<col>)"`` - is shown. Then if the parse succeeds, a ``"Matched"`` message is shown, or an ``"Exception raised"`` - message is shown. Also note the use of :class:`set_name` to assign a human-readable name to the expression, - which makes debugging and exception messages easier to understand - for instance, the default - name created for the :class:`Word` expression without calling ``set_name`` is ``"W:(A-Za-z)"``. - """ - if recurse: - for expr in self.visit_all(): - expr.set_debug(flag, recurse=False) - return self - - if flag: - self.set_debug_actions( - _default_start_debug_action, - _default_success_debug_action, - _default_exception_debug_action, - ) - else: - self.debug = False - return self - - @property - def default_name(self) -> str: - if self._defaultName is None: - self._defaultName = self._generateDefaultName() - return self._defaultName - - @abstractmethod - def _generateDefaultName(self) -> str: - """ - Child classes must define this method, which defines how the ``default_name`` is set. - """ - - def set_name(self, name: str) -> "ParserElement": - """ - Define name for this expression, makes debugging and exception messages clearer. - - Example:: - - Word(nums).parse_string("ABC") # -> Exception: Expected W:(0-9) (at char 0), (line:1, col:1) - Word(nums).set_name("integer").parse_string("ABC") # -> Exception: Expected integer (at char 0), (line:1, col:1) - """ - self.customName = name - self.errmsg = "Expected " + self.name - if __diag__.enable_debug_on_named_expressions: - self.set_debug() - return self - - @property - def name(self) -> str: - # This will use a user-defined name if available, but otherwise defaults back to the auto-generated name - return self.customName if self.customName is not None else self.default_name - - def __str__(self) -> str: - return self.name - - def __repr__(self) -> str: - return str(self) - - def streamline(self) -> "ParserElement": - self.streamlined = True - self._defaultName = None - return self - - def recurse(self) -> List["ParserElement"]: - return [] - - def _checkRecursion(self, parseElementList): - subRecCheckList = parseElementList[:] + [self] - for e in self.recurse(): - e._checkRecursion(subRecCheckList) - - def validate(self, validateTrace=None) -> None: - """ - Check defined expressions for valid structure, check for infinite recursive definitions. - """ - warnings.warn( - "ParserElement.validate() is deprecated, and should not be used to check for left recursion", - DeprecationWarning, - stacklevel=2, - ) - self._checkRecursion([]) - - def parse_file( - self, - file_or_filename: Union[str, Path, TextIO], - encoding: str = "utf-8", - parse_all: bool = False, - *, - parseAll: bool = False, - ) -> ParseResults: - """ - Execute the parse expression on the given file or filename. - If a filename is specified (instead of a file object), - the entire file is opened, read, and closed before parsing. - """ - parseAll = parseAll or parse_all - try: - file_or_filename = typing.cast(TextIO, file_or_filename) - file_contents = file_or_filename.read() - except AttributeError: - file_or_filename = typing.cast(str, file_or_filename) - with open(file_or_filename, "r", encoding=encoding) as f: - file_contents = f.read() - try: - return self.parse_string(file_contents, parseAll) - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc.with_traceback(None) - - def __eq__(self, other): - if self is other: - return True - elif isinstance(other, str_type): - return self.matches(other, parse_all=True) - elif isinstance(other, ParserElement): - return vars(self) == vars(other) - return False - - def __hash__(self): - return id(self) - - def matches( - self, test_string: str, parse_all: bool = True, *, parseAll: bool = True - ) -> bool: - """ - Method for quick testing of a parser against a test string. Good for simple - inline microtests of sub expressions while building up larger parser. - - Parameters: - - - ``test_string`` - to test against this expression for a match - - ``parse_all`` - (default= ``True``) - flag to pass to :class:`parse_string` when running tests - - Example:: - - expr = Word(nums) - assert expr.matches("100") - """ - parseAll = parseAll and parse_all - try: - self.parse_string(str(test_string), parse_all=parseAll) - return True - except ParseBaseException: - return False - - def run_tests( - self, - tests: Union[str, List[str]], - parse_all: bool = True, - comment: typing.Optional[Union["ParserElement", str]] = "#", - full_dump: bool = True, - print_results: bool = True, - failure_tests: bool = False, - post_parse: typing.Optional[Callable[[str, ParseResults], str]] = None, - file: typing.Optional[TextIO] = None, - with_line_numbers: bool = False, - *, - parseAll: bool = True, - fullDump: bool = True, - printResults: bool = True, - failureTests: bool = False, - postParse: typing.Optional[Callable[[str, ParseResults], str]] = None, - ) -> Tuple[bool, List[Tuple[str, Union[ParseResults, Exception]]]]: - """ - Execute the parse expression on a series of test strings, showing each - test, the parsed results or where the parse failed. Quick and easy way to - run a parse expression against a list of sample strings. - - Parameters: - - - ``tests`` - a list of separate test strings, or a multiline string of test strings - - ``parse_all`` - (default= ``True``) - flag to pass to :class:`parse_string` when running tests - - ``comment`` - (default= ``'#'``) - expression for indicating embedded comments in the test - string; pass None to disable comment filtering - - ``full_dump`` - (default= ``True``) - dump results as list followed by results names in nested outline; - if False, only dump nested list - - ``print_results`` - (default= ``True``) prints test output to stdout - - ``failure_tests`` - (default= ``False``) indicates if these tests are expected to fail parsing - - ``post_parse`` - (default= ``None``) optional callback for successful parse results; called as - `fn(test_string, parse_results)` and returns a string to be added to the test output - - ``file`` - (default= ``None``) optional file-like object to which test output will be written; - if None, will default to ``sys.stdout`` - - ``with_line_numbers`` - default= ``False``) show test strings with line and column numbers - - Returns: a (success, results) tuple, where success indicates that all tests succeeded - (or failed if ``failure_tests`` is True), and the results contain a list of lines of each - test's output - - Example:: - - number_expr = pyparsing_common.number.copy() - - result = number_expr.run_tests(''' - # unsigned integer - 100 - # negative integer - -100 - # float with scientific notation - 6.02e23 - # integer with scientific notation - 1e-12 - ''') - print("Success" if result[0] else "Failed!") - - result = number_expr.run_tests(''' - # stray character - 100Z - # missing leading digit before '.' - -.100 - # too many '.' - 3.14.159 - ''', failure_tests=True) - print("Success" if result[0] else "Failed!") - - prints:: - - # unsigned integer - 100 - [100] - - # negative integer - -100 - [-100] - - # float with scientific notation - 6.02e23 - [6.02e+23] - - # integer with scientific notation - 1e-12 - [1e-12] - - Success - - # stray character - 100Z - ^ - FAIL: Expected end of text (at char 3), (line:1, col:4) - - # missing leading digit before '.' - -.100 - ^ - FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1) - - # too many '.' - 3.14.159 - ^ - FAIL: Expected end of text (at char 4), (line:1, col:5) - - Success - - Each test string must be on a single line. If you want to test a string that spans multiple - lines, create a test like this:: - - expr.run_tests(r"this is a test\\n of strings that spans \\n 3 lines") - - (Note that this is a raw string literal, you must include the leading ``'r'``.) - """ - from .testing import pyparsing_test - - parseAll = parseAll and parse_all - fullDump = fullDump and full_dump - printResults = printResults and print_results - failureTests = failureTests or failure_tests - postParse = postParse or post_parse - if isinstance(tests, str_type): - tests = typing.cast(str, tests) - line_strip = type(tests).strip - tests = [line_strip(test_line) for test_line in tests.rstrip().splitlines()] - comment_specified = comment is not None - if comment_specified: - if isinstance(comment, str_type): - comment = typing.cast(str, comment) - comment = Literal(comment) - comment = typing.cast(ParserElement, comment) - if file is None: - file = sys.stdout - print_ = file.write - - result: Union[ParseResults, Exception] - allResults: List[Tuple[str, Union[ParseResults, Exception]]] = [] - comments: List[str] = [] - success = True - NL = Literal(r"\n").add_parse_action(replace_with("\n")).ignore(quoted_string) - BOM = "\ufeff" - for t in tests: - if comment_specified and comment.matches(t, False) or comments and not t: - comments.append( - pyparsing_test.with_line_numbers(t) if with_line_numbers else t - ) - continue - if not t: - continue - out = [ - "\n" + "\n".join(comments) if comments else "", - pyparsing_test.with_line_numbers(t) if with_line_numbers else t, - ] - comments = [] - try: - # convert newline marks to actual newlines, and strip leading BOM if present - t = NL.transform_string(t.lstrip(BOM)) - result = self.parse_string(t, parse_all=parseAll) - except ParseBaseException as pe: - fatal = "(FATAL)" if isinstance(pe, ParseFatalException) else "" - out.append(pe.explain()) - out.append("FAIL: " + str(pe)) - if ParserElement.verbose_stacktrace: - out.extend(traceback.format_tb(pe.__traceback__)) - success = success and failureTests - result = pe - except Exception as exc: - out.append(f"FAIL-EXCEPTION: {type(exc).__name__}: {exc}") - if ParserElement.verbose_stacktrace: - out.extend(traceback.format_tb(exc.__traceback__)) - success = success and failureTests - result = exc - else: - success = success and not failureTests - if postParse is not None: - try: - pp_value = postParse(t, result) - if pp_value is not None: - if isinstance(pp_value, ParseResults): - out.append(pp_value.dump()) - else: - out.append(str(pp_value)) - else: - out.append(result.dump()) - except Exception as e: - out.append(result.dump(full=fullDump)) - out.append( - f"{postParse.__name__} failed: {type(e).__name__}: {e}" - ) - else: - out.append(result.dump(full=fullDump)) - out.append("") - - if printResults: - print_("\n".join(out)) - - allResults.append((t, result)) - - return success, allResults - - def create_diagram( - self, - output_html: Union[TextIO, Path, str], - vertical: int = 3, - show_results_names: bool = False, - show_groups: bool = False, - embed: bool = False, - **kwargs, - ) -> None: - """ - Create a railroad diagram for the parser. - - Parameters: - - - ``output_html`` (str or file-like object) - output target for generated - diagram HTML - - ``vertical`` (int) - threshold for formatting multiple alternatives vertically - instead of horizontally (default=3) - - ``show_results_names`` - bool flag whether diagram should show annotations for - defined results names - - ``show_groups`` - bool flag whether groups should be highlighted with an unlabeled surrounding box - - ``embed`` - bool flag whether generated HTML should omit <HEAD>, <BODY>, and <DOCTYPE> tags to embed - the resulting HTML in an enclosing HTML source - - ``head`` - str containing additional HTML to insert into the <HEAD> section of the generated code; - can be used to insert custom CSS styling - - ``body`` - str containing additional HTML to insert at the beginning of the <BODY> section of the - generated code - - Additional diagram-formatting keyword arguments can also be included; - see railroad.Diagram class. - """ - - try: - from .diagram import to_railroad, railroad_to_html - except ImportError as ie: - raise Exception( - "must ``pip install pyparsing[diagrams]`` to generate parser railroad diagrams" - ) from ie - - self.streamline() - - railroad = to_railroad( - self, - vertical=vertical, - show_results_names=show_results_names, - show_groups=show_groups, - diagram_kwargs=kwargs, - ) - if isinstance(output_html, (str, Path)): - with open(output_html, "w", encoding="utf-8") as diag_file: - diag_file.write(railroad_to_html(railroad, embed=embed, **kwargs)) - else: - # we were passed a file-like object, just write to it - output_html.write(railroad_to_html(railroad, embed=embed, **kwargs)) - - # Compatibility synonyms - # fmt: off - @staticmethod - @replaced_by_pep8(inline_literals_using) - def inlineLiteralsUsing(): ... - - @staticmethod - @replaced_by_pep8(set_default_whitespace_chars) - def setDefaultWhitespaceChars(): ... - - @replaced_by_pep8(set_results_name) - def setResultsName(self): ... - - @replaced_by_pep8(set_break) - def setBreak(self): ... - - @replaced_by_pep8(set_parse_action) - def setParseAction(self): ... - - @replaced_by_pep8(add_parse_action) - def addParseAction(self): ... - - @replaced_by_pep8(add_condition) - def addCondition(self): ... - - @replaced_by_pep8(set_fail_action) - def setFailAction(self): ... - - @replaced_by_pep8(try_parse) - def tryParse(self): ... - - @staticmethod - @replaced_by_pep8(enable_left_recursion) - def enableLeftRecursion(): ... - - @staticmethod - @replaced_by_pep8(enable_packrat) - def enablePackrat(): ... - - @replaced_by_pep8(parse_string) - def parseString(self): ... - - @replaced_by_pep8(scan_string) - def scanString(self): ... - - @replaced_by_pep8(transform_string) - def transformString(self): ... - - @replaced_by_pep8(search_string) - def searchString(self): ... - - @replaced_by_pep8(ignore_whitespace) - def ignoreWhitespace(self): ... - - @replaced_by_pep8(leave_whitespace) - def leaveWhitespace(self): ... - - @replaced_by_pep8(set_whitespace_chars) - def setWhitespaceChars(self): ... - - @replaced_by_pep8(parse_with_tabs) - def parseWithTabs(self): ... - - @replaced_by_pep8(set_debug_actions) - def setDebugActions(self): ... - - @replaced_by_pep8(set_debug) - def setDebug(self): ... - - @replaced_by_pep8(set_name) - def setName(self): ... - - @replaced_by_pep8(parse_file) - def parseFile(self): ... - - @replaced_by_pep8(run_tests) - def runTests(self): ... - - canParseNext = can_parse_next - resetCache = reset_cache - defaultName = default_name - # fmt: on - - -class _PendingSkip(ParserElement): - # internal placeholder class to hold a place were '...' is added to a parser element, - # once another ParserElement is added, this placeholder will be replaced with a SkipTo - def __init__(self, expr: ParserElement, must_skip: bool = False): - super().__init__() - self.anchor = expr - self.must_skip = must_skip - - def _generateDefaultName(self) -> str: - return str(self.anchor + Empty()).replace("Empty", "...") - - def __add__(self, other) -> "ParserElement": - skipper = SkipTo(other).set_name("...")("_skipped*") - if self.must_skip: - - def must_skip(t): - if not t._skipped or t._skipped.as_list() == [""]: - del t[0] - t.pop("_skipped", None) - - def show_skip(t): - if t._skipped.as_list()[-1:] == [""]: - t.pop("_skipped") - t["_skipped"] = "missing <" + repr(self.anchor) + ">" - - return ( - self.anchor + skipper().add_parse_action(must_skip) - | skipper().add_parse_action(show_skip) - ) + other - - return self.anchor + skipper + other - - def __repr__(self): - return self.defaultName - - def parseImpl(self, *args): - raise Exception( - "use of `...` expression without following SkipTo target expression" - ) - - -class Token(ParserElement): - """Abstract :class:`ParserElement` subclass, for defining atomic - matching patterns. - """ - - def __init__(self): - super().__init__(savelist=False) - - def _generateDefaultName(self) -> str: - return type(self).__name__ - - -class NoMatch(Token): - """ - A token that will never match. - """ - - def __init__(self): - super().__init__() - self.mayReturnEmpty = True - self.mayIndexError = False - self.errmsg = "Unmatchable token" - - def parseImpl(self, instring, loc, doActions=True): - raise ParseException(instring, loc, self.errmsg, self) - - -class Literal(Token): - """ - Token to exactly match a specified string. - - Example:: - - Literal('blah').parse_string('blah') # -> ['blah'] - Literal('blah').parse_string('blahfooblah') # -> ['blah'] - Literal('blah').parse_string('bla') # -> Exception: Expected "blah" - - For case-insensitive matching, use :class:`CaselessLiteral`. - - For keyword matching (force word break before and after the matched string), - use :class:`Keyword` or :class:`CaselessKeyword`. - """ - - def __new__(cls, match_string: str = "", *, matchString: str = ""): - # Performance tuning: select a subclass with optimized parseImpl - if cls is Literal: - match_string = matchString or match_string - if not match_string: - return super().__new__(Empty) - if len(match_string) == 1: - return super().__new__(_SingleCharLiteral) - - # Default behavior - return super().__new__(cls) - - # Needed to make copy.copy() work correctly if we customize __new__ - def __getnewargs__(self): - return (self.match,) - - def __init__(self, match_string: str = "", *, matchString: str = ""): - super().__init__() - match_string = matchString or match_string - self.match = match_string - self.matchLen = len(match_string) - self.firstMatchChar = match_string[:1] - self.errmsg = "Expected " + self.name - self.mayReturnEmpty = False - self.mayIndexError = False - - def _generateDefaultName(self) -> str: - return repr(self.match) - - def parseImpl(self, instring, loc, doActions=True): - if instring[loc] == self.firstMatchChar and instring.startswith( - self.match, loc - ): - return loc + self.matchLen, self.match - raise ParseException(instring, loc, self.errmsg, self) - - -class Empty(Literal): - """ - An empty token, will always match. - """ - - def __init__(self, match_string="", *, matchString=""): - super().__init__("") - self.mayReturnEmpty = True - self.mayIndexError = False - - def _generateDefaultName(self) -> str: - return "Empty" - - def parseImpl(self, instring, loc, doActions=True): - return loc, [] - - -class _SingleCharLiteral(Literal): - def parseImpl(self, instring, loc, doActions=True): - if instring[loc] == self.firstMatchChar: - return loc + 1, self.match - raise ParseException(instring, loc, self.errmsg, self) - - -ParserElement._literalStringClass = Literal - - -class Keyword(Token): - """ - Token to exactly match a specified string as a keyword, that is, - it must be immediately preceded and followed by whitespace or - non-keyword characters. Compare with :class:`Literal`: - - - ``Literal("if")`` will match the leading ``'if'`` in - ``'ifAndOnlyIf'``. - - ``Keyword("if")`` will not; it will only match the leading - ``'if'`` in ``'if x=1'``, or ``'if(y==2)'`` - - Accepts two optional constructor arguments in addition to the - keyword string: - - - ``ident_chars`` is a string of characters that would be valid - identifier characters, defaulting to all alphanumerics + "_" and - "$" - - ``caseless`` allows case-insensitive matching, default is ``False``. - - Example:: - - Keyword("start").parse_string("start") # -> ['start'] - Keyword("start").parse_string("starting") # -> Exception - - For case-insensitive matching, use :class:`CaselessKeyword`. - """ - - DEFAULT_KEYWORD_CHARS = alphanums + "_$" - - def __init__( - self, - match_string: str = "", - ident_chars: typing.Optional[str] = None, - caseless: bool = False, - *, - matchString: str = "", - identChars: typing.Optional[str] = None, - ): - super().__init__() - identChars = identChars or ident_chars - if identChars is None: - identChars = Keyword.DEFAULT_KEYWORD_CHARS - match_string = matchString or match_string - self.match = match_string - self.matchLen = len(match_string) - try: - self.firstMatchChar = match_string[0] - except IndexError: - raise ValueError("null string passed to Keyword; use Empty() instead") - self.errmsg = f"Expected {type(self).__name__} {self.name}" - self.mayReturnEmpty = False - self.mayIndexError = False - self.caseless = caseless - if caseless: - self.caselessmatch = match_string.upper() - identChars = identChars.upper() - self.identChars = set(identChars) - - def _generateDefaultName(self) -> str: - return repr(self.match) - - def parseImpl(self, instring, loc, doActions=True): - errmsg = self.errmsg - errloc = loc - if self.caseless: - if instring[loc : loc + self.matchLen].upper() == self.caselessmatch: - if loc == 0 or instring[loc - 1].upper() not in self.identChars: - if ( - loc >= len(instring) - self.matchLen - or instring[loc + self.matchLen].upper() not in self.identChars - ): - return loc + self.matchLen, self.match - else: - # followed by keyword char - errmsg += ", was immediately followed by keyword character" - errloc = loc + self.matchLen - else: - # preceded by keyword char - errmsg += ", keyword was immediately preceded by keyword character" - errloc = loc - 1 - # else no match just raise plain exception - - else: - if ( - instring[loc] == self.firstMatchChar - and self.matchLen == 1 - or instring.startswith(self.match, loc) - ): - if loc == 0 or instring[loc - 1] not in self.identChars: - if ( - loc >= len(instring) - self.matchLen - or instring[loc + self.matchLen] not in self.identChars - ): - return loc + self.matchLen, self.match - else: - # followed by keyword char - errmsg += ( - ", keyword was immediately followed by keyword character" - ) - errloc = loc + self.matchLen - else: - # preceded by keyword char - errmsg += ", keyword was immediately preceded by keyword character" - errloc = loc - 1 - # else no match just raise plain exception - - raise ParseException(instring, errloc, errmsg, self) - - @staticmethod - def set_default_keyword_chars(chars) -> None: - """ - Overrides the default characters used by :class:`Keyword` expressions. - """ - Keyword.DEFAULT_KEYWORD_CHARS = chars - - setDefaultKeywordChars = set_default_keyword_chars - - -class CaselessLiteral(Literal): - """ - Token to match a specified string, ignoring case of letters. - Note: the matched results will always be in the case of the given - match string, NOT the case of the input text. - - Example:: - - CaselessLiteral("CMD")[1, ...].parse_string("cmd CMD Cmd10") - # -> ['CMD', 'CMD', 'CMD'] - - (Contrast with example for :class:`CaselessKeyword`.) - """ - - def __init__(self, match_string: str = "", *, matchString: str = ""): - match_string = matchString or match_string - super().__init__(match_string.upper()) - # Preserve the defining literal. - self.returnString = match_string - self.errmsg = "Expected " + self.name - - def parseImpl(self, instring, loc, doActions=True): - if instring[loc : loc + self.matchLen].upper() == self.match: - return loc + self.matchLen, self.returnString - raise ParseException(instring, loc, self.errmsg, self) - - -class CaselessKeyword(Keyword): - """ - Caseless version of :class:`Keyword`. - - Example:: - - CaselessKeyword("CMD")[1, ...].parse_string("cmd CMD Cmd10") - # -> ['CMD', 'CMD'] - - (Contrast with example for :class:`CaselessLiteral`.) - """ - - def __init__( - self, - match_string: str = "", - ident_chars: typing.Optional[str] = None, - *, - matchString: str = "", - identChars: typing.Optional[str] = None, - ): - identChars = identChars or ident_chars - match_string = matchString or match_string - super().__init__(match_string, identChars, caseless=True) - - -class CloseMatch(Token): - """A variation on :class:`Literal` which matches "close" matches, - that is, strings with at most 'n' mismatching characters. - :class:`CloseMatch` takes parameters: - - - ``match_string`` - string to be matched - - ``caseless`` - a boolean indicating whether to ignore casing when comparing characters - - ``max_mismatches`` - (``default=1``) maximum number of - mismatches allowed to count as a match - - The results from a successful parse will contain the matched text - from the input string and the following named results: - - - ``mismatches`` - a list of the positions within the - match_string where mismatches were found - - ``original`` - the original match_string used to compare - against the input string - - If ``mismatches`` is an empty list, then the match was an exact - match. - - Example:: - - patt = CloseMatch("ATCATCGAATGGA") - patt.parse_string("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']}) - patt.parse_string("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1) - - # exact match - patt.parse_string("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']}) - - # close match allowing up to 2 mismatches - patt = CloseMatch("ATCATCGAATGGA", max_mismatches=2) - patt.parse_string("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']}) - """ - - def __init__( - self, - match_string: str, - max_mismatches: typing.Optional[int] = None, - *, - maxMismatches: int = 1, - caseless=False, - ): - maxMismatches = max_mismatches if max_mismatches is not None else maxMismatches - super().__init__() - self.match_string = match_string - self.maxMismatches = maxMismatches - self.errmsg = f"Expected {self.match_string!r} (with up to {self.maxMismatches} mismatches)" - self.caseless = caseless - self.mayIndexError = False - self.mayReturnEmpty = False - - def _generateDefaultName(self) -> str: - return f"{type(self).__name__}:{self.match_string!r}" - - def parseImpl(self, instring, loc, doActions=True): - start = loc - instrlen = len(instring) - maxloc = start + len(self.match_string) - - if maxloc <= instrlen: - match_string = self.match_string - match_stringloc = 0 - mismatches = [] - maxMismatches = self.maxMismatches - - for match_stringloc, s_m in enumerate( - zip(instring[loc:maxloc], match_string) - ): - src, mat = s_m - if self.caseless: - src, mat = src.lower(), mat.lower() - - if src != mat: - mismatches.append(match_stringloc) - if len(mismatches) > maxMismatches: - break - else: - loc = start + match_stringloc + 1 - results = ParseResults([instring[start:loc]]) - results["original"] = match_string - results["mismatches"] = mismatches - return loc, results - - raise ParseException(instring, loc, self.errmsg, self) - - -class Word(Token): - """Token for matching words composed of allowed character sets. - - Parameters: - - - ``init_chars`` - string of all characters that should be used to - match as a word; "ABC" will match "AAA", "ABAB", "CBAC", etc.; - if ``body_chars`` is also specified, then this is the string of - initial characters - - ``body_chars`` - string of characters that - can be used for matching after a matched initial character as - given in ``init_chars``; if omitted, same as the initial characters - (default=``None``) - - ``min`` - minimum number of characters to match (default=1) - - ``max`` - maximum number of characters to match (default=0) - - ``exact`` - exact number of characters to match (default=0) - - ``as_keyword`` - match as a keyword (default=``False``) - - ``exclude_chars`` - characters that might be - found in the input ``body_chars`` string but which should not be - accepted for matching ;useful to define a word of all - printables except for one or two characters, for instance - (default=``None``) - - :class:`srange` is useful for defining custom character set strings - for defining :class:`Word` expressions, using range notation from - regular expression character sets. - - A common mistake is to use :class:`Word` to match a specific literal - string, as in ``Word("Address")``. Remember that :class:`Word` - uses the string argument to define *sets* of matchable characters. - This expression would match "Add", "AAA", "dAred", or any other word - made up of the characters 'A', 'd', 'r', 'e', and 's'. To match an - exact literal string, use :class:`Literal` or :class:`Keyword`. - - pyparsing includes helper strings for building Words: - - - :class:`alphas` - - :class:`nums` - - :class:`alphanums` - - :class:`hexnums` - - :class:`alphas8bit` (alphabetic characters in ASCII range 128-255 - - accented, tilded, umlauted, etc.) - - :class:`punc8bit` (non-alphabetic characters in ASCII range - 128-255 - currency, symbols, superscripts, diacriticals, etc.) - - :class:`printables` (any non-whitespace character) - - ``alphas``, ``nums``, and ``printables`` are also defined in several - Unicode sets - see :class:`pyparsing_unicode``. - - Example:: - - # a word composed of digits - integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9")) - - # a word with a leading capital, and zero or more lowercase - capital_word = Word(alphas.upper(), alphas.lower()) - - # hostnames are alphanumeric, with leading alpha, and '-' - hostname = Word(alphas, alphanums + '-') - - # roman numeral (not a strict parser, accepts invalid mix of characters) - roman = Word("IVXLCDM") - - # any string of non-whitespace characters, except for ',' - csv_value = Word(printables, exclude_chars=",") - """ - - def __init__( - self, - init_chars: str = "", - body_chars: typing.Optional[str] = None, - min: int = 1, - max: int = 0, - exact: int = 0, - as_keyword: bool = False, - exclude_chars: typing.Optional[str] = None, - *, - initChars: typing.Optional[str] = None, - bodyChars: typing.Optional[str] = None, - asKeyword: bool = False, - excludeChars: typing.Optional[str] = None, - ): - initChars = initChars or init_chars - bodyChars = bodyChars or body_chars - asKeyword = asKeyword or as_keyword - excludeChars = excludeChars or exclude_chars - super().__init__() - if not initChars: - raise ValueError( - f"invalid {type(self).__name__}, initChars cannot be empty string" - ) - - initChars_set = set(initChars) - if excludeChars: - excludeChars_set = set(excludeChars) - initChars_set -= excludeChars_set - if bodyChars: - bodyChars = "".join(set(bodyChars) - excludeChars_set) - self.initChars = initChars_set - self.initCharsOrig = "".join(sorted(initChars_set)) - - if bodyChars: - self.bodyChars = set(bodyChars) - self.bodyCharsOrig = "".join(sorted(bodyChars)) - else: - self.bodyChars = initChars_set - self.bodyCharsOrig = self.initCharsOrig - - self.maxSpecified = max > 0 - - if min < 1: - raise ValueError( - "cannot specify a minimum length < 1; use Opt(Word()) if zero-length word is permitted" - ) - - if self.maxSpecified and min > max: - raise ValueError( - f"invalid args, if min and max both specified min must be <= max (min={min}, max={max})" - ) - - self.minLen = min - - if max > 0: - self.maxLen = max - else: - self.maxLen = _MAX_INT - - if exact > 0: - min = max = exact - self.maxLen = exact - self.minLen = exact - - self.errmsg = "Expected " + self.name - self.mayIndexError = False - self.asKeyword = asKeyword - if self.asKeyword: - self.errmsg += " as a keyword" - - # see if we can make a regex for this Word - if " " not in (self.initChars | self.bodyChars): - if len(self.initChars) == 1: - re_leading_fragment = re.escape(self.initCharsOrig) - else: - re_leading_fragment = f"[{_collapse_string_to_ranges(self.initChars)}]" - - if self.bodyChars == self.initChars: - if max == 0: - repeat = "+" - elif max == 1: - repeat = "" - else: - if self.minLen != self.maxLen: - repeat = f"{{{self.minLen},{'' if self.maxLen == _MAX_INT else self.maxLen}}}" - else: - repeat = f"{{{self.minLen}}}" - self.reString = f"{re_leading_fragment}{repeat}" - else: - if max == 1: - re_body_fragment = "" - repeat = "" - else: - re_body_fragment = f"[{_collapse_string_to_ranges(self.bodyChars)}]" - if max == 0: - repeat = "*" - elif max == 2: - repeat = "?" if min <= 1 else "" - else: - if min != max: - repeat = f"{{{min - 1 if min > 0 else 0},{max - 1}}}" - else: - repeat = f"{{{min - 1 if min > 0 else 0}}}" - - self.reString = ( - f"{re_leading_fragment}" f"{re_body_fragment}" f"{repeat}" - ) - - if self.asKeyword: - self.reString = rf"\b{self.reString}\b" - - try: - self.re = re.compile(self.reString) - except re.error: - self.re = None # type: ignore[assignment] - else: - self.re_match = self.re.match - self.parseImpl = self.parseImpl_regex # type: ignore[assignment] - - def _generateDefaultName(self) -> str: - def charsAsStr(s): - max_repr_len = 16 - s = _collapse_string_to_ranges(s, re_escape=False) - if len(s) > max_repr_len: - return s[: max_repr_len - 3] + "..." - else: - return s - - if self.initChars != self.bodyChars: - base = f"W:({charsAsStr(self.initChars)}, {charsAsStr(self.bodyChars)})" - else: - base = f"W:({charsAsStr(self.initChars)})" - - # add length specification - if self.minLen > 1 or self.maxLen != _MAX_INT: - if self.minLen == self.maxLen: - if self.minLen == 1: - return base[2:] - else: - return base + f"{{{self.minLen}}}" - elif self.maxLen == _MAX_INT: - return base + f"{{{self.minLen},...}}" - else: - return base + f"{{{self.minLen},{self.maxLen}}}" - return base - - def parseImpl(self, instring, loc, doActions=True): - if instring[loc] not in self.initChars: - raise ParseException(instring, loc, self.errmsg, self) - - start = loc - loc += 1 - instrlen = len(instring) - bodychars = self.bodyChars - maxloc = start + self.maxLen - maxloc = min(maxloc, instrlen) - while loc < maxloc and instring[loc] in bodychars: - loc += 1 - - throwException = False - if loc - start < self.minLen: - throwException = True - elif self.maxSpecified and loc < instrlen and instring[loc] in bodychars: - throwException = True - elif self.asKeyword: - if ( - start > 0 - and instring[start - 1] in bodychars - or loc < instrlen - and instring[loc] in bodychars - ): - throwException = True - - if throwException: - raise ParseException(instring, loc, self.errmsg, self) - - return loc, instring[start:loc] - - def parseImpl_regex(self, instring, loc, doActions=True): - result = self.re_match(instring, loc) - if not result: - raise ParseException(instring, loc, self.errmsg, self) - - loc = result.end() - return loc, result.group() - - -class Char(Word): - """A short-cut class for defining :class:`Word` ``(characters, exact=1)``, - when defining a match of any single character in a string of - characters. - """ - - def __init__( - self, - charset: str, - as_keyword: bool = False, - exclude_chars: typing.Optional[str] = None, - *, - asKeyword: bool = False, - excludeChars: typing.Optional[str] = None, - ): - asKeyword = asKeyword or as_keyword - excludeChars = excludeChars or exclude_chars - super().__init__( - charset, exact=1, as_keyword=asKeyword, exclude_chars=excludeChars - ) - - -class Regex(Token): - r"""Token for matching strings that match a given regular - expression. Defined with string specifying the regular expression in - a form recognized by the stdlib Python `re module <https://docs.python.org/3/library/re.html>`_. - If the given regex contains named groups (defined using ``(?P<name>...)``), - these will be preserved as named :class:`ParseResults`. - - If instead of the Python stdlib ``re`` module you wish to use a different RE module - (such as the ``regex`` module), you can do so by building your ``Regex`` object with - a compiled RE that was compiled using ``regex``. - - Example:: - - realnum = Regex(r"[+-]?\d+\.\d*") - # ref: https://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression - roman = Regex(r"M{0,4}(CM|CD|D?{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})") - - # named fields in a regex will be returned as named results - date = Regex(r'(?P<year>\d{4})-(?P<month>\d\d?)-(?P<day>\d\d?)') - - # the Regex class will accept re's compiled using the regex module - import regex - parser = pp.Regex(regex.compile(r'[0-9]')) - """ - - def __init__( - self, - pattern: Any, - flags: Union[re.RegexFlag, int] = 0, - as_group_list: bool = False, - as_match: bool = False, - *, - asGroupList: bool = False, - asMatch: bool = False, - ): - """The parameters ``pattern`` and ``flags`` are passed - to the ``re.compile()`` function as-is. See the Python - `re module <https://docs.python.org/3/library/re.html>`_ module for an - explanation of the acceptable patterns and flags. - """ - super().__init__() - asGroupList = asGroupList or as_group_list - asMatch = asMatch or as_match - - if isinstance(pattern, str_type): - if not pattern: - raise ValueError("null string passed to Regex; use Empty() instead") - - self._re = None - self.reString = self.pattern = pattern - self.flags = flags - - elif hasattr(pattern, "pattern") and hasattr(pattern, "match"): - self._re = pattern - self.pattern = self.reString = pattern.pattern - self.flags = flags - - else: - raise TypeError( - "Regex may only be constructed with a string or a compiled RE object" - ) - - self.errmsg = "Expected " + self.name - self.mayIndexError = False - self.asGroupList = asGroupList - self.asMatch = asMatch - if self.asGroupList: - self.parseImpl = self.parseImplAsGroupList # type: ignore [assignment] - if self.asMatch: - self.parseImpl = self.parseImplAsMatch # type: ignore [assignment] - - @cached_property - def re(self): - if self._re: - return self._re - else: - try: - return re.compile(self.pattern, self.flags) - except re.error: - raise ValueError(f"invalid pattern ({self.pattern!r}) passed to Regex") - - @cached_property - def re_match(self): - return self.re.match - - @cached_property - def mayReturnEmpty(self): - return self.re_match("") is not None - - def _generateDefaultName(self) -> str: - return "Re:({})".format(repr(self.pattern).replace("\\\\", "\\")) - - def parseImpl(self, instring, loc, doActions=True): - result = self.re_match(instring, loc) - if not result: - raise ParseException(instring, loc, self.errmsg, self) - - loc = result.end() - ret = ParseResults(result.group()) - d = result.groupdict() - if d: - for k, v in d.items(): - ret[k] = v - return loc, ret - - def parseImplAsGroupList(self, instring, loc, doActions=True): - result = self.re_match(instring, loc) - if not result: - raise ParseException(instring, loc, self.errmsg, self) - - loc = result.end() - ret = result.groups() - return loc, ret - - def parseImplAsMatch(self, instring, loc, doActions=True): - result = self.re_match(instring, loc) - if not result: - raise ParseException(instring, loc, self.errmsg, self) - - loc = result.end() - ret = result - return loc, ret - - def sub(self, repl: str) -> ParserElement: - r""" - Return :class:`Regex` with an attached parse action to transform the parsed - result as if called using `re.sub(expr, repl, string) <https://docs.python.org/3/library/re.html#re.sub>`_. - - Example:: - - make_html = Regex(r"(\w+):(.*?):").sub(r"<\1>\2</\1>") - print(make_html.transform_string("h1:main title:")) - # prints "<h1>main title</h1>" - """ - if self.asGroupList: - raise TypeError("cannot use sub() with Regex(as_group_list=True)") - - if self.asMatch and callable(repl): - raise TypeError( - "cannot use sub() with a callable with Regex(as_match=True)" - ) - - if self.asMatch: - - def pa(tokens): - return tokens[0].expand(repl) - - else: - - def pa(tokens): - return self.re.sub(repl, tokens[0]) - - return self.add_parse_action(pa) - - -class QuotedString(Token): - r""" - Token for matching strings that are delimited by quoting characters. - - Defined with the following parameters: - - - ``quote_char`` - string of one or more characters defining the - quote delimiting string - - ``esc_char`` - character to re_escape quotes, typically backslash - (default= ``None``) - - ``esc_quote`` - special quote sequence to re_escape an embedded quote - string (such as SQL's ``""`` to re_escape an embedded ``"``) - (default= ``None``) - - ``multiline`` - boolean indicating whether quotes can span - multiple lines (default= ``False``) - - ``unquote_results`` - boolean indicating whether the matched text - should be unquoted (default= ``True``) - - ``end_quote_char`` - string of one or more characters defining the - end of the quote delimited string (default= ``None`` => same as - quote_char) - - ``convert_whitespace_escapes`` - convert escaped whitespace - (``'\t'``, ``'\n'``, etc.) to actual whitespace - (default= ``True``) - - Example:: - - qs = QuotedString('"') - print(qs.search_string('lsjdf "This is the quote" sldjf')) - complex_qs = QuotedString('{{', end_quote_char='}}') - print(complex_qs.search_string('lsjdf {{This is the "quote"}} sldjf')) - sql_qs = QuotedString('"', esc_quote='""') - print(sql_qs.search_string('lsjdf "This is the quote with ""embedded"" quotes" sldjf')) - - prints:: - - [['This is the quote']] - [['This is the "quote"']] - [['This is the quote with "embedded" quotes']] - """ - ws_map = dict(((r"\t", "\t"), (r"\n", "\n"), (r"\f", "\f"), (r"\r", "\r"))) - - def __init__( - self, - quote_char: str = "", - esc_char: typing.Optional[str] = None, - esc_quote: typing.Optional[str] = None, - multiline: bool = False, - unquote_results: bool = True, - end_quote_char: typing.Optional[str] = None, - convert_whitespace_escapes: bool = True, - *, - quoteChar: str = "", - escChar: typing.Optional[str] = None, - escQuote: typing.Optional[str] = None, - unquoteResults: bool = True, - endQuoteChar: typing.Optional[str] = None, - convertWhitespaceEscapes: bool = True, - ): - super().__init__() - escChar = escChar or esc_char - escQuote = escQuote or esc_quote - unquoteResults = unquoteResults and unquote_results - endQuoteChar = endQuoteChar or end_quote_char - convertWhitespaceEscapes = ( - convertWhitespaceEscapes and convert_whitespace_escapes - ) - quote_char = quoteChar or quote_char - - # remove white space from quote chars - wont work anyway - quote_char = quote_char.strip() - if not quote_char: - raise ValueError("quote_char cannot be the empty string") - - if endQuoteChar is None: - endQuoteChar = quote_char - else: - endQuoteChar = endQuoteChar.strip() - if not endQuoteChar: - raise ValueError("end_quote_char cannot be the empty string") - - self.quoteChar: str = quote_char - self.quoteCharLen: int = len(quote_char) - self.firstQuoteChar: str = quote_char[0] - self.endQuoteChar: str = endQuoteChar - self.endQuoteCharLen: int = len(endQuoteChar) - self.escChar: str = escChar or "" - self.escQuote: str = escQuote or "" - self.unquoteResults: bool = unquoteResults - self.convertWhitespaceEscapes: bool = convertWhitespaceEscapes - self.multiline = multiline - - sep = "" - inner_pattern = "" - - if escQuote: - inner_pattern += rf"{sep}(?:{re.escape(escQuote)})" - sep = "|" - - if escChar: - inner_pattern += rf"{sep}(?:{re.escape(escChar)}.)" - sep = "|" - self.escCharReplacePattern = re.escape(escChar) + "(.)" - - if len(self.endQuoteChar) > 1: - inner_pattern += ( - f"{sep}(?:" - + "|".join( - f"(?:{re.escape(self.endQuoteChar[:i])}(?!{re.escape(self.endQuoteChar[i:])}))" - for i in range(len(self.endQuoteChar) - 1, 0, -1) - ) - + ")" - ) - sep = "|" - - self.flags = re.RegexFlag(0) - - if multiline: - self.flags = re.MULTILINE | re.DOTALL - inner_pattern += ( - rf"{sep}(?:[^{_escape_regex_range_chars(self.endQuoteChar[0])}" - rf"{(_escape_regex_range_chars(escChar) if escChar is not None else '')}])" - ) - else: - inner_pattern += ( - rf"{sep}(?:[^{_escape_regex_range_chars(self.endQuoteChar[0])}\n\r" - rf"{(_escape_regex_range_chars(escChar) if escChar is not None else '')}])" - ) - - self.pattern = "".join( - [ - re.escape(self.quoteChar), - "(?:", - inner_pattern, - ")*", - re.escape(self.endQuoteChar), - ] - ) - - if self.unquoteResults: - if self.convertWhitespaceEscapes: - self.unquote_scan_re = re.compile( - rf"({'|'.join(re.escape(k) for k in self.ws_map)})|({re.escape(self.escChar)}.)|(\n|.)", - flags=self.flags, - ) - else: - self.unquote_scan_re = re.compile( - rf"({re.escape(self.escChar)}.)|(\n|.)", flags=self.flags - ) - - try: - self.re = re.compile(self.pattern, self.flags) - self.reString = self.pattern - self.re_match = self.re.match - except re.error: - raise ValueError(f"invalid pattern {self.pattern!r} passed to Regex") - - self.errmsg = "Expected " + self.name - self.mayIndexError = False - self.mayReturnEmpty = True - - def _generateDefaultName(self) -> str: - if self.quoteChar == self.endQuoteChar and isinstance(self.quoteChar, str_type): - return f"string enclosed in {self.quoteChar!r}" - - return f"quoted string, starting with {self.quoteChar} ending with {self.endQuoteChar}" - - def parseImpl(self, instring, loc, doActions=True): - result = ( - instring[loc] == self.firstQuoteChar - and self.re_match(instring, loc) - or None - ) - if not result: - raise ParseException(instring, loc, self.errmsg, self) - - loc = result.end() - ret = result.group() - - if self.unquoteResults: - # strip off quotes - ret = ret[self.quoteCharLen : -self.endQuoteCharLen] - - if isinstance(ret, str_type): - if self.convertWhitespaceEscapes: - ret = "".join( - self.ws_map[match.group(1)] - if match.group(1) - else match.group(2)[-1] - if match.group(2) - else match.group(3) - for match in self.unquote_scan_re.finditer(ret) - ) - else: - ret = "".join( - match.group(1)[-1] if match.group(1) else match.group(2) - for match in self.unquote_scan_re.finditer(ret) - ) - - # replace escaped quotes - if self.escQuote: - ret = ret.replace(self.escQuote, self.endQuoteChar) - - return loc, ret - - -class CharsNotIn(Token): - """Token for matching words composed of characters *not* in a given - set (will include whitespace in matched characters if not listed in - the provided exclusion set - see example). Defined with string - containing all disallowed characters, and an optional minimum, - maximum, and/or exact length. The default value for ``min`` is - 1 (a minimum value < 1 is not valid); the default values for - ``max`` and ``exact`` are 0, meaning no maximum or exact - length restriction. - - Example:: - - # define a comma-separated-value as anything that is not a ',' - csv_value = CharsNotIn(',') - print(DelimitedList(csv_value).parse_string("dkls,lsdkjf,s12 34,@!#,213")) - - prints:: - - ['dkls', 'lsdkjf', 's12 34', '@!#', '213'] - """ - - def __init__( - self, - not_chars: str = "", - min: int = 1, - max: int = 0, - exact: int = 0, - *, - notChars: str = "", - ): - super().__init__() - self.skipWhitespace = False - self.notChars = not_chars or notChars - self.notCharsSet = set(self.notChars) - - if min < 1: - raise ValueError( - "cannot specify a minimum length < 1; use " - "Opt(CharsNotIn()) if zero-length char group is permitted" - ) - - self.minLen = min - - if max > 0: - self.maxLen = max - else: - self.maxLen = _MAX_INT - - if exact > 0: - self.maxLen = exact - self.minLen = exact - - self.errmsg = "Expected " + self.name - self.mayReturnEmpty = self.minLen == 0 - self.mayIndexError = False - - def _generateDefaultName(self) -> str: - not_chars_str = _collapse_string_to_ranges(self.notChars) - if len(not_chars_str) > 16: - return f"!W:({self.notChars[: 16 - 3]}...)" - else: - return f"!W:({self.notChars})" - - def parseImpl(self, instring, loc, doActions=True): - notchars = self.notCharsSet - if instring[loc] in notchars: - raise ParseException(instring, loc, self.errmsg, self) - - start = loc - loc += 1 - maxlen = min(start + self.maxLen, len(instring)) - while loc < maxlen and instring[loc] not in notchars: - loc += 1 - - if loc - start < self.minLen: - raise ParseException(instring, loc, self.errmsg, self) - - return loc, instring[start:loc] - - -class White(Token): - """Special matching class for matching whitespace. Normally, - whitespace is ignored by pyparsing grammars. This class is included - when some whitespace structures are significant. Define with - a string containing the whitespace characters to be matched; default - is ``" \\t\\r\\n"``. Also takes optional ``min``, - ``max``, and ``exact`` arguments, as defined for the - :class:`Word` class. - """ - - whiteStrs = { - " ": "<SP>", - "\t": "<TAB>", - "\n": "<LF>", - "\r": "<CR>", - "\f": "<FF>", - "\u00A0": "<NBSP>", - "\u1680": "<OGHAM_SPACE_MARK>", - "\u180E": "<MONGOLIAN_VOWEL_SEPARATOR>", - "\u2000": "<EN_QUAD>", - "\u2001": "<EM_QUAD>", - "\u2002": "<EN_SPACE>", - "\u2003": "<EM_SPACE>", - "\u2004": "<THREE-PER-EM_SPACE>", - "\u2005": "<FOUR-PER-EM_SPACE>", - "\u2006": "<SIX-PER-EM_SPACE>", - "\u2007": "<FIGURE_SPACE>", - "\u2008": "<PUNCTUATION_SPACE>", - "\u2009": "<THIN_SPACE>", - "\u200A": "<HAIR_SPACE>", - "\u200B": "<ZERO_WIDTH_SPACE>", - "\u202F": "<NNBSP>", - "\u205F": "<MMSP>", - "\u3000": "<IDEOGRAPHIC_SPACE>", - } - - def __init__(self, ws: str = " \t\r\n", min: int = 1, max: int = 0, exact: int = 0): - super().__init__() - self.matchWhite = ws - self.set_whitespace_chars( - "".join(c for c in self.whiteStrs if c not in self.matchWhite), - copy_defaults=True, - ) - # self.leave_whitespace() - self.mayReturnEmpty = True - self.errmsg = "Expected " + self.name - - self.minLen = min - - if max > 0: - self.maxLen = max - else: - self.maxLen = _MAX_INT - - if exact > 0: - self.maxLen = exact - self.minLen = exact - - def _generateDefaultName(self) -> str: - return "".join(White.whiteStrs[c] for c in self.matchWhite) - - def parseImpl(self, instring, loc, doActions=True): - if instring[loc] not in self.matchWhite: - raise ParseException(instring, loc, self.errmsg, self) - start = loc - loc += 1 - maxloc = start + self.maxLen - maxloc = min(maxloc, len(instring)) - while loc < maxloc and instring[loc] in self.matchWhite: - loc += 1 - - if loc - start < self.minLen: - raise ParseException(instring, loc, self.errmsg, self) - - return loc, instring[start:loc] - - -class PositionToken(Token): - def __init__(self): - super().__init__() - self.mayReturnEmpty = True - self.mayIndexError = False - - -class GoToColumn(PositionToken): - """Token to advance to a specific column of input text; useful for - tabular report scraping. - """ - - def __init__(self, colno: int): - super().__init__() - self.col = colno - - def preParse(self, instring: str, loc: int) -> int: - if col(loc, instring) != self.col: - instrlen = len(instring) - if self.ignoreExprs: - loc = self._skipIgnorables(instring, loc) - while ( - loc < instrlen - and instring[loc].isspace() - and col(loc, instring) != self.col - ): - loc += 1 - return loc - - def parseImpl(self, instring, loc, doActions=True): - thiscol = col(loc, instring) - if thiscol > self.col: - raise ParseException(instring, loc, "Text not in expected column", self) - newloc = loc + self.col - thiscol - ret = instring[loc:newloc] - return newloc, ret - - -class LineStart(PositionToken): - r"""Matches if current position is at the beginning of a line within - the parse string - - Example:: - - test = '''\ - AAA this line - AAA and this line - AAA but not this one - B AAA and definitely not this one - ''' - - for t in (LineStart() + 'AAA' + rest_of_line).search_string(test): - print(t) - - prints:: - - ['AAA', ' this line'] - ['AAA', ' and this line'] - - """ - - def __init__(self): - super().__init__() - self.leave_whitespace() - self.orig_whiteChars = set() | self.whiteChars - self.whiteChars.discard("\n") - self.skipper = Empty().set_whitespace_chars(self.whiteChars) - self.errmsg = "Expected start of line" - - def preParse(self, instring: str, loc: int) -> int: - if loc == 0: - return loc - else: - ret = self.skipper.preParse(instring, loc) - if "\n" in self.orig_whiteChars: - while instring[ret : ret + 1] == "\n": - ret = self.skipper.preParse(instring, ret + 1) - return ret - - def parseImpl(self, instring, loc, doActions=True): - if col(loc, instring) == 1: - return loc, [] - raise ParseException(instring, loc, self.errmsg, self) - - -class LineEnd(PositionToken): - """Matches if current position is at the end of a line within the - parse string - """ - - def __init__(self): - super().__init__() - self.whiteChars.discard("\n") - self.set_whitespace_chars(self.whiteChars, copy_defaults=False) - self.errmsg = "Expected end of line" - - def parseImpl(self, instring, loc, doActions=True): - if loc < len(instring): - if instring[loc] == "\n": - return loc + 1, "\n" - else: - raise ParseException(instring, loc, self.errmsg, self) - elif loc == len(instring): - return loc + 1, [] - else: - raise ParseException(instring, loc, self.errmsg, self) - - -class StringStart(PositionToken): - """Matches if current position is at the beginning of the parse - string - """ - - def __init__(self): - super().__init__() - self.errmsg = "Expected start of text" - - def parseImpl(self, instring, loc, doActions=True): - if loc != 0: - # see if entire string up to here is just whitespace and ignoreables - if loc != self.preParse(instring, 0): - raise ParseException(instring, loc, self.errmsg, self) - return loc, [] - - -class StringEnd(PositionToken): - """ - Matches if current position is at the end of the parse string - """ - - def __init__(self): - super().__init__() - self.errmsg = "Expected end of text" - - def parseImpl(self, instring, loc, doActions=True): - if loc < len(instring): - raise ParseException(instring, loc, self.errmsg, self) - elif loc == len(instring): - return loc + 1, [] - elif loc > len(instring): - return loc, [] - else: - raise ParseException(instring, loc, self.errmsg, self) - - -class WordStart(PositionToken): - """Matches if the current position is at the beginning of a - :class:`Word`, and is not preceded by any character in a given - set of ``word_chars`` (default= ``printables``). To emulate the - ``\b`` behavior of regular expressions, use - ``WordStart(alphanums)``. ``WordStart`` will also match at - the beginning of the string being parsed, or at the beginning of - a line. - """ - - def __init__(self, word_chars: str = printables, *, wordChars: str = printables): - wordChars = word_chars if wordChars == printables else wordChars - super().__init__() - self.wordChars = set(wordChars) - self.errmsg = "Not at the start of a word" - - def parseImpl(self, instring, loc, doActions=True): - if loc != 0: - if ( - instring[loc - 1] in self.wordChars - or instring[loc] not in self.wordChars - ): - raise ParseException(instring, loc, self.errmsg, self) - return loc, [] - - -class WordEnd(PositionToken): - """Matches if the current position is at the end of a :class:`Word`, - and is not followed by any character in a given set of ``word_chars`` - (default= ``printables``). To emulate the ``\b`` behavior of - regular expressions, use ``WordEnd(alphanums)``. ``WordEnd`` - will also match at the end of the string being parsed, or at the end - of a line. - """ - - def __init__(self, word_chars: str = printables, *, wordChars: str = printables): - wordChars = word_chars if wordChars == printables else wordChars - super().__init__() - self.wordChars = set(wordChars) - self.skipWhitespace = False - self.errmsg = "Not at the end of a word" - - def parseImpl(self, instring, loc, doActions=True): - instrlen = len(instring) - if instrlen > 0 and loc < instrlen: - if ( - instring[loc] in self.wordChars - or instring[loc - 1] not in self.wordChars - ): - raise ParseException(instring, loc, self.errmsg, self) - return loc, [] - - -class ParseExpression(ParserElement): - """Abstract subclass of ParserElement, for combining and - post-processing parsed tokens. - """ - - def __init__(self, exprs: typing.Iterable[ParserElement], savelist: bool = False): - super().__init__(savelist) - self.exprs: List[ParserElement] - if isinstance(exprs, _generatorType): - exprs = list(exprs) - - if isinstance(exprs, str_type): - self.exprs = [self._literalStringClass(exprs)] - elif isinstance(exprs, ParserElement): - self.exprs = [exprs] - elif isinstance(exprs, Iterable): - exprs = list(exprs) - # if sequence of strings provided, wrap with Literal - if any(isinstance(expr, str_type) for expr in exprs): - exprs = ( - self._literalStringClass(e) if isinstance(e, str_type) else e - for e in exprs - ) - self.exprs = list(exprs) - else: - try: - self.exprs = list(exprs) - except TypeError: - self.exprs = [exprs] - self.callPreparse = False - - def recurse(self) -> List[ParserElement]: - return self.exprs[:] - - def append(self, other) -> ParserElement: - self.exprs.append(other) - self._defaultName = None - return self - - def leave_whitespace(self, recursive: bool = True) -> ParserElement: - """ - Extends ``leave_whitespace`` defined in base class, and also invokes ``leave_whitespace`` on - all contained expressions. - """ - super().leave_whitespace(recursive) - - if recursive: - self.exprs = [e.copy() for e in self.exprs] - for e in self.exprs: - e.leave_whitespace(recursive) - return self - - def ignore_whitespace(self, recursive: bool = True) -> ParserElement: - """ - Extends ``ignore_whitespace`` defined in base class, and also invokes ``leave_whitespace`` on - all contained expressions. - """ - super().ignore_whitespace(recursive) - if recursive: - self.exprs = [e.copy() for e in self.exprs] - for e in self.exprs: - e.ignore_whitespace(recursive) - return self - - def ignore(self, other) -> ParserElement: - if isinstance(other, Suppress): - if other not in self.ignoreExprs: - super().ignore(other) - for e in self.exprs: - e.ignore(self.ignoreExprs[-1]) - else: - super().ignore(other) - for e in self.exprs: - e.ignore(self.ignoreExprs[-1]) - return self - - def _generateDefaultName(self) -> str: - return f"{self.__class__.__name__}:({str(self.exprs)})" - - def streamline(self) -> ParserElement: - if self.streamlined: - return self - - super().streamline() - - for e in self.exprs: - e.streamline() - - # collapse nested :class:`And`'s of the form ``And(And(And(a, b), c), d)`` to ``And(a, b, c, d)`` - # but only if there are no parse actions or resultsNames on the nested And's - # (likewise for :class:`Or`'s and :class:`MatchFirst`'s) - if len(self.exprs) == 2: - other = self.exprs[0] - if ( - isinstance(other, self.__class__) - and not other.parseAction - and other.resultsName is None - and not other.debug - ): - self.exprs = other.exprs[:] + [self.exprs[1]] - self._defaultName = None - self.mayReturnEmpty |= other.mayReturnEmpty - self.mayIndexError |= other.mayIndexError - - other = self.exprs[-1] - if ( - isinstance(other, self.__class__) - and not other.parseAction - and other.resultsName is None - and not other.debug - ): - self.exprs = self.exprs[:-1] + other.exprs[:] - self._defaultName = None - self.mayReturnEmpty |= other.mayReturnEmpty - self.mayIndexError |= other.mayIndexError - - self.errmsg = "Expected " + str(self) - - return self - - def validate(self, validateTrace=None) -> None: - warnings.warn( - "ParserElement.validate() is deprecated, and should not be used to check for left recursion", - DeprecationWarning, - stacklevel=2, - ) - tmp = (validateTrace if validateTrace is not None else [])[:] + [self] - for e in self.exprs: - e.validate(tmp) - self._checkRecursion([]) - - def copy(self) -> ParserElement: - ret = super().copy() - ret = typing.cast(ParseExpression, ret) - ret.exprs = [e.copy() for e in self.exprs] - return ret - - def _setResultsName(self, name, listAllMatches=False): - if ( - __diag__.warn_ungrouped_named_tokens_in_collection - and Diagnostics.warn_ungrouped_named_tokens_in_collection - not in self.suppress_warnings_ - ): - for e in self.exprs: - if ( - isinstance(e, ParserElement) - and e.resultsName - and Diagnostics.warn_ungrouped_named_tokens_in_collection - not in e.suppress_warnings_ - ): - warnings.warn( - "{}: setting results name {!r} on {} expression " - "collides with {!r} on contained expression".format( - "warn_ungrouped_named_tokens_in_collection", - name, - type(self).__name__, - e.resultsName, - ), - stacklevel=3, - ) - - return super()._setResultsName(name, listAllMatches) - - # Compatibility synonyms - # fmt: off - @replaced_by_pep8(leave_whitespace) - def leaveWhitespace(self): ... - - @replaced_by_pep8(ignore_whitespace) - def ignoreWhitespace(self): ... - # fmt: on - - -class And(ParseExpression): - """ - Requires all given :class:`ParseExpression` s to be found in the given order. - Expressions may be separated by whitespace. - May be constructed using the ``'+'`` operator. - May also be constructed using the ``'-'`` operator, which will - suppress backtracking. - - Example:: - - integer = Word(nums) - name_expr = Word(alphas)[1, ...] - - expr = And([integer("id"), name_expr("name"), integer("age")]) - # more easily written as: - expr = integer("id") + name_expr("name") + integer("age") - """ - - class _ErrorStop(Empty): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.leave_whitespace() - - def _generateDefaultName(self) -> str: - return "-" - - def __init__( - self, exprs_arg: typing.Iterable[ParserElement], savelist: bool = True - ): - exprs: List[ParserElement] = list(exprs_arg) - if exprs and Ellipsis in exprs: - tmp = [] - for i, expr in enumerate(exprs): - if expr is Ellipsis: - if i < len(exprs) - 1: - skipto_arg: ParserElement = typing.cast( - ParseExpression, (Empty() + exprs[i + 1]) - ).exprs[-1] - tmp.append(SkipTo(skipto_arg)("_skipped*")) - else: - raise Exception( - "cannot construct And with sequence ending in ..." - ) - else: - tmp.append(expr) - exprs[:] = tmp - super().__init__(exprs, savelist) - if self.exprs: - self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) - if not isinstance(self.exprs[0], White): - self.set_whitespace_chars( - self.exprs[0].whiteChars, - copy_defaults=self.exprs[0].copyDefaultWhiteChars, - ) - self.skipWhitespace = self.exprs[0].skipWhitespace - else: - self.skipWhitespace = False - else: - self.mayReturnEmpty = True - self.callPreparse = True - - def streamline(self) -> ParserElement: - # collapse any _PendingSkip's - if self.exprs: - if any( - isinstance(e, ParseExpression) - and e.exprs - and isinstance(e.exprs[-1], _PendingSkip) - for e in self.exprs[:-1] - ): - deleted_expr_marker = NoMatch() - for i, e in enumerate(self.exprs[:-1]): - if e is deleted_expr_marker: - continue - if ( - isinstance(e, ParseExpression) - and e.exprs - and isinstance(e.exprs[-1], _PendingSkip) - ): - e.exprs[-1] = e.exprs[-1] + self.exprs[i + 1] - self.exprs[i + 1] = deleted_expr_marker - self.exprs = [e for e in self.exprs if e is not deleted_expr_marker] - - super().streamline() - - # link any IndentedBlocks to the prior expression - prev: ParserElement - cur: ParserElement - for prev, cur in zip(self.exprs, self.exprs[1:]): - # traverse cur or any first embedded expr of cur looking for an IndentedBlock - # (but watch out for recursive grammar) - seen = set() - while True: - if id(cur) in seen: - break - seen.add(id(cur)) - if isinstance(cur, IndentedBlock): - prev.add_parse_action( - lambda s, l, t, cur_=cur: setattr( - cur_, "parent_anchor", col(l, s) - ) - ) - break - subs = cur.recurse() - next_first = next(iter(subs), None) - if next_first is None: - break - cur = typing.cast(ParserElement, next_first) - - self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) - return self - - def parseImpl(self, instring, loc, doActions=True): - # pass False as callPreParse arg to _parse for first element, since we already - # pre-parsed the string as part of our And pre-parsing - loc, resultlist = self.exprs[0]._parse( - instring, loc, doActions, callPreParse=False - ) - errorStop = False - for e in self.exprs[1:]: - # if isinstance(e, And._ErrorStop): - if type(e) is And._ErrorStop: - errorStop = True - continue - if errorStop: - try: - loc, exprtokens = e._parse(instring, loc, doActions) - except ParseSyntaxException: - raise - except ParseBaseException as pe: - pe.__traceback__ = None - raise ParseSyntaxException._from_exception(pe) - except IndexError: - raise ParseSyntaxException( - instring, len(instring), self.errmsg, self - ) - else: - loc, exprtokens = e._parse(instring, loc, doActions) - resultlist += exprtokens - return loc, resultlist - - def __iadd__(self, other): - if isinstance(other, str_type): - other = self._literalStringClass(other) - if not isinstance(other, ParserElement): - return NotImplemented - return self.append(other) # And([self, other]) - - def _checkRecursion(self, parseElementList): - subRecCheckList = parseElementList[:] + [self] - for e in self.exprs: - e._checkRecursion(subRecCheckList) - if not e.mayReturnEmpty: - break - - def _generateDefaultName(self) -> str: - inner = " ".join(str(e) for e in self.exprs) - # strip off redundant inner {}'s - while len(inner) > 1 and inner[0 :: len(inner) - 1] == "{}": - inner = inner[1:-1] - return "{" + inner + "}" - - -class Or(ParseExpression): - """Requires that at least one :class:`ParseExpression` is found. If - two expressions match, the expression that matches the longest - string will be used. May be constructed using the ``'^'`` - operator. - - Example:: - - # construct Or using '^' operator - - number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums)) - print(number.search_string("123 3.1416 789")) - - prints:: - - [['123'], ['3.1416'], ['789']] - """ - - def __init__(self, exprs: typing.Iterable[ParserElement], savelist: bool = False): - super().__init__(exprs, savelist) - if self.exprs: - self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) - self.skipWhitespace = all(e.skipWhitespace for e in self.exprs) - else: - self.mayReturnEmpty = True - - def streamline(self) -> ParserElement: - super().streamline() - if self.exprs: - self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) - self.saveAsList = any(e.saveAsList for e in self.exprs) - self.skipWhitespace = all( - e.skipWhitespace and not isinstance(e, White) for e in self.exprs - ) - else: - self.saveAsList = False - return self - - def parseImpl(self, instring, loc, doActions=True): - maxExcLoc = -1 - maxException = None - matches = [] - fatals = [] - if all(e.callPreparse for e in self.exprs): - loc = self.preParse(instring, loc) - for e in self.exprs: - try: - loc2 = e.try_parse(instring, loc, raise_fatal=True) - except ParseFatalException as pfe: - pfe.__traceback__ = None - pfe.parser_element = e - fatals.append(pfe) - maxException = None - maxExcLoc = -1 - except ParseException as err: - if not fatals: - err.__traceback__ = None - if err.loc > maxExcLoc: - maxException = err - maxExcLoc = err.loc - except IndexError: - if len(instring) > maxExcLoc: - maxException = ParseException( - instring, len(instring), e.errmsg, self - ) - maxExcLoc = len(instring) - else: - # save match among all matches, to retry longest to shortest - matches.append((loc2, e)) - - if matches: - # re-evaluate all matches in descending order of length of match, in case attached actions - # might change whether or how much they match of the input. - matches.sort(key=itemgetter(0), reverse=True) - - if not doActions: - # no further conditions or parse actions to change the selection of - # alternative, so the first match will be the best match - best_expr = matches[0][1] - return best_expr._parse(instring, loc, doActions) - - longest = -1, None - for loc1, expr1 in matches: - if loc1 <= longest[0]: - # already have a longer match than this one will deliver, we are done - return longest - - try: - loc2, toks = expr1._parse(instring, loc, doActions) - except ParseException as err: - err.__traceback__ = None - if err.loc > maxExcLoc: - maxException = err - maxExcLoc = err.loc - else: - if loc2 >= loc1: - return loc2, toks - # didn't match as much as before - elif loc2 > longest[0]: - longest = loc2, toks - - if longest != (-1, None): - return longest - - if fatals: - if len(fatals) > 1: - fatals.sort(key=lambda e: -e.loc) - if fatals[0].loc == fatals[1].loc: - fatals.sort(key=lambda e: (-e.loc, -len(str(e.parser_element)))) - max_fatal = fatals[0] - raise max_fatal - - if maxException is not None: - # infer from this check that all alternatives failed at the current position - # so emit this collective error message instead of any single error message - if maxExcLoc == loc: - maxException.msg = self.errmsg - raise maxException - else: - raise ParseException( - instring, loc, "no defined alternatives to match", self - ) - - def __ixor__(self, other): - if isinstance(other, str_type): - other = self._literalStringClass(other) - if not isinstance(other, ParserElement): - return NotImplemented - return self.append(other) # Or([self, other]) - - def _generateDefaultName(self) -> str: - return "{" + " ^ ".join(str(e) for e in self.exprs) + "}" - - def _setResultsName(self, name, listAllMatches=False): - if ( - __diag__.warn_multiple_tokens_in_named_alternation - and Diagnostics.warn_multiple_tokens_in_named_alternation - not in self.suppress_warnings_ - ): - if any( - isinstance(e, And) - and Diagnostics.warn_multiple_tokens_in_named_alternation - not in e.suppress_warnings_ - for e in self.exprs - ): - warnings.warn( - "{}: setting results name {!r} on {} expression " - "will return a list of all parsed tokens in an And alternative, " - "in prior versions only the first token was returned; enclose " - "contained argument in Group".format( - "warn_multiple_tokens_in_named_alternation", - name, - type(self).__name__, - ), - stacklevel=3, - ) - - return super()._setResultsName(name, listAllMatches) - - -class MatchFirst(ParseExpression): - """Requires that at least one :class:`ParseExpression` is found. If - more than one expression matches, the first one listed is the one that will - match. May be constructed using the ``'|'`` operator. - - Example:: - - # construct MatchFirst using '|' operator - - # watch the order of expressions to match - number = Word(nums) | Combine(Word(nums) + '.' + Word(nums)) - print(number.search_string("123 3.1416 789")) # Fail! -> [['123'], ['3'], ['1416'], ['789']] - - # put more selective expression first - number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums) - print(number.search_string("123 3.1416 789")) # Better -> [['123'], ['3.1416'], ['789']] - """ - - def __init__(self, exprs: typing.Iterable[ParserElement], savelist: bool = False): - super().__init__(exprs, savelist) - if self.exprs: - self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) - self.skipWhitespace = all(e.skipWhitespace for e in self.exprs) - else: - self.mayReturnEmpty = True - - def streamline(self) -> ParserElement: - if self.streamlined: - return self - - super().streamline() - if self.exprs: - self.saveAsList = any(e.saveAsList for e in self.exprs) - self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) - self.skipWhitespace = all( - e.skipWhitespace and not isinstance(e, White) for e in self.exprs - ) - else: - self.saveAsList = False - self.mayReturnEmpty = True - return self - - def parseImpl(self, instring, loc, doActions=True): - maxExcLoc = -1 - maxException = None - - for e in self.exprs: - try: - return e._parse( - instring, - loc, - doActions, - ) - except ParseFatalException as pfe: - pfe.__traceback__ = None - pfe.parser_element = e - raise - except ParseException as err: - if err.loc > maxExcLoc: - maxException = err - maxExcLoc = err.loc - except IndexError: - if len(instring) > maxExcLoc: - maxException = ParseException( - instring, len(instring), e.errmsg, self - ) - maxExcLoc = len(instring) - - if maxException is not None: - # infer from this check that all alternatives failed at the current position - # so emit this collective error message instead of any individual error message - if maxExcLoc == loc: - maxException.msg = self.errmsg - raise maxException - else: - raise ParseException( - instring, loc, "no defined alternatives to match", self - ) - - def __ior__(self, other): - if isinstance(other, str_type): - other = self._literalStringClass(other) - if not isinstance(other, ParserElement): - return NotImplemented - return self.append(other) # MatchFirst([self, other]) - - def _generateDefaultName(self) -> str: - return "{" + " | ".join(str(e) for e in self.exprs) + "}" - - def _setResultsName(self, name, listAllMatches=False): - if ( - __diag__.warn_multiple_tokens_in_named_alternation - and Diagnostics.warn_multiple_tokens_in_named_alternation - not in self.suppress_warnings_ - ): - if any( - isinstance(e, And) - and Diagnostics.warn_multiple_tokens_in_named_alternation - not in e.suppress_warnings_ - for e in self.exprs - ): - warnings.warn( - "{}: setting results name {!r} on {} expression " - "will return a list of all parsed tokens in an And alternative, " - "in prior versions only the first token was returned; enclose " - "contained argument in Group".format( - "warn_multiple_tokens_in_named_alternation", - name, - type(self).__name__, - ), - stacklevel=3, - ) - - return super()._setResultsName(name, listAllMatches) - - -class Each(ParseExpression): - """Requires all given :class:`ParseExpression` s to be found, but in - any order. Expressions may be separated by whitespace. - - May be constructed using the ``'&'`` operator. - - Example:: - - color = one_of("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN") - shape_type = one_of("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON") - integer = Word(nums) - shape_attr = "shape:" + shape_type("shape") - posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn") - color_attr = "color:" + color("color") - size_attr = "size:" + integer("size") - - # use Each (using operator '&') to accept attributes in any order - # (shape and posn are required, color and size are optional) - shape_spec = shape_attr & posn_attr & Opt(color_attr) & Opt(size_attr) - - shape_spec.run_tests(''' - shape: SQUARE color: BLACK posn: 100, 120 - shape: CIRCLE size: 50 color: BLUE posn: 50,80 - color:GREEN size:20 shape:TRIANGLE posn:20,40 - ''' - ) - - prints:: - - shape: SQUARE color: BLACK posn: 100, 120 - ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']] - - color: BLACK - - posn: ['100', ',', '120'] - - x: 100 - - y: 120 - - shape: SQUARE - - - shape: CIRCLE size: 50 color: BLUE posn: 50,80 - ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']] - - color: BLUE - - posn: ['50', ',', '80'] - - x: 50 - - y: 80 - - shape: CIRCLE - - size: 50 - - - color: GREEN size: 20 shape: TRIANGLE posn: 20,40 - ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']] - - color: GREEN - - posn: ['20', ',', '40'] - - x: 20 - - y: 40 - - shape: TRIANGLE - - size: 20 - """ - - def __init__(self, exprs: typing.Iterable[ParserElement], savelist: bool = True): - super().__init__(exprs, savelist) - if self.exprs: - self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) - else: - self.mayReturnEmpty = True - self.skipWhitespace = True - self.initExprGroups = True - self.saveAsList = True - - def __iand__(self, other): - if isinstance(other, str_type): - other = self._literalStringClass(other) - if not isinstance(other, ParserElement): - return NotImplemented - return self.append(other) # Each([self, other]) - - def streamline(self) -> ParserElement: - super().streamline() - if self.exprs: - self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) - else: - self.mayReturnEmpty = True - return self - - def parseImpl(self, instring, loc, doActions=True): - if self.initExprGroups: - self.opt1map = dict( - (id(e.expr), e) for e in self.exprs if isinstance(e, Opt) - ) - opt1 = [e.expr for e in self.exprs if isinstance(e, Opt)] - opt2 = [ - e - for e in self.exprs - if e.mayReturnEmpty and not isinstance(e, (Opt, Regex, ZeroOrMore)) - ] - self.optionals = opt1 + opt2 - self.multioptionals = [ - e.expr.set_results_name(e.resultsName, list_all_matches=True) - for e in self.exprs - if isinstance(e, _MultipleMatch) - ] - self.multirequired = [ - e.expr.set_results_name(e.resultsName, list_all_matches=True) - for e in self.exprs - if isinstance(e, OneOrMore) - ] - self.required = [ - e for e in self.exprs if not isinstance(e, (Opt, ZeroOrMore, OneOrMore)) - ] - self.required += self.multirequired - self.initExprGroups = False - - tmpLoc = loc - tmpReqd = self.required[:] - tmpOpt = self.optionals[:] - multis = self.multioptionals[:] - matchOrder = [] - - keepMatching = True - failed = [] - fatals = [] - while keepMatching: - tmpExprs = tmpReqd + tmpOpt + multis - failed.clear() - fatals.clear() - for e in tmpExprs: - try: - tmpLoc = e.try_parse(instring, tmpLoc, raise_fatal=True) - except ParseFatalException as pfe: - pfe.__traceback__ = None - pfe.parser_element = e - fatals.append(pfe) - failed.append(e) - except ParseException: - failed.append(e) - else: - matchOrder.append(self.opt1map.get(id(e), e)) - if e in tmpReqd: - tmpReqd.remove(e) - elif e in tmpOpt: - tmpOpt.remove(e) - if len(failed) == len(tmpExprs): - keepMatching = False - - # look for any ParseFatalExceptions - if fatals: - if len(fatals) > 1: - fatals.sort(key=lambda e: -e.loc) - if fatals[0].loc == fatals[1].loc: - fatals.sort(key=lambda e: (-e.loc, -len(str(e.parser_element)))) - max_fatal = fatals[0] - raise max_fatal - - if tmpReqd: - missing = ", ".join([str(e) for e in tmpReqd]) - raise ParseException( - instring, - loc, - f"Missing one or more required elements ({missing})", - ) - - # add any unmatched Opts, in case they have default values defined - matchOrder += [e for e in self.exprs if isinstance(e, Opt) and e.expr in tmpOpt] - - total_results = ParseResults([]) - for e in matchOrder: - loc, results = e._parse(instring, loc, doActions) - total_results += results - - return loc, total_results - - def _generateDefaultName(self) -> str: - return "{" + " & ".join(str(e) for e in self.exprs) + "}" - - -class ParseElementEnhance(ParserElement): - """Abstract subclass of :class:`ParserElement`, for combining and - post-processing parsed tokens. - """ - - def __init__(self, expr: Union[ParserElement, str], savelist: bool = False): - super().__init__(savelist) - if isinstance(expr, str_type): - expr_str = typing.cast(str, expr) - if issubclass(self._literalStringClass, Token): - expr = self._literalStringClass(expr_str) # type: ignore[call-arg] - elif issubclass(type(self), self._literalStringClass): - expr = Literal(expr_str) - else: - expr = self._literalStringClass(Literal(expr_str)) # type: ignore[assignment, call-arg] - expr = typing.cast(ParserElement, expr) - self.expr = expr - if expr is not None: - self.mayIndexError = expr.mayIndexError - self.mayReturnEmpty = expr.mayReturnEmpty - self.set_whitespace_chars( - expr.whiteChars, copy_defaults=expr.copyDefaultWhiteChars - ) - self.skipWhitespace = expr.skipWhitespace - self.saveAsList = expr.saveAsList - self.callPreparse = expr.callPreparse - self.ignoreExprs.extend(expr.ignoreExprs) - - def recurse(self) -> List[ParserElement]: - return [self.expr] if self.expr is not None else [] - - def parseImpl(self, instring, loc, doActions=True): - if self.expr is not None: - try: - return self.expr._parse(instring, loc, doActions, callPreParse=False) - except ParseBaseException as pbe: - pbe.msg = self.errmsg - raise - else: - raise ParseException(instring, loc, "No expression defined", self) - - def leave_whitespace(self, recursive: bool = True) -> ParserElement: - super().leave_whitespace(recursive) - - if recursive: - if self.expr is not None: - self.expr = self.expr.copy() - self.expr.leave_whitespace(recursive) - return self - - def ignore_whitespace(self, recursive: bool = True) -> ParserElement: - super().ignore_whitespace(recursive) - - if recursive: - if self.expr is not None: - self.expr = self.expr.copy() - self.expr.ignore_whitespace(recursive) - return self - - def ignore(self, other) -> ParserElement: - if isinstance(other, Suppress): - if other not in self.ignoreExprs: - super().ignore(other) - if self.expr is not None: - self.expr.ignore(self.ignoreExprs[-1]) - else: - super().ignore(other) - if self.expr is not None: - self.expr.ignore(self.ignoreExprs[-1]) - return self - - def streamline(self) -> ParserElement: - super().streamline() - if self.expr is not None: - self.expr.streamline() - return self - - def _checkRecursion(self, parseElementList): - if self in parseElementList: - raise RecursiveGrammarException(parseElementList + [self]) - subRecCheckList = parseElementList[:] + [self] - if self.expr is not None: - self.expr._checkRecursion(subRecCheckList) - - def validate(self, validateTrace=None) -> None: - warnings.warn( - "ParserElement.validate() is deprecated, and should not be used to check for left recursion", - DeprecationWarning, - stacklevel=2, - ) - if validateTrace is None: - validateTrace = [] - tmp = validateTrace[:] + [self] - if self.expr is not None: - self.expr.validate(tmp) - self._checkRecursion([]) - - def _generateDefaultName(self) -> str: - return f"{self.__class__.__name__}:({str(self.expr)})" - - # Compatibility synonyms - # fmt: off - @replaced_by_pep8(leave_whitespace) - def leaveWhitespace(self): ... - - @replaced_by_pep8(ignore_whitespace) - def ignoreWhitespace(self): ... - # fmt: on - - -class IndentedBlock(ParseElementEnhance): - """ - Expression to match one or more expressions at a given indentation level. - Useful for parsing text where structure is implied by indentation (like Python source code). - """ - - class _Indent(Empty): - def __init__(self, ref_col: int): - super().__init__() - self.errmsg = f"expected indent at column {ref_col}" - self.add_condition(lambda s, l, t: col(l, s) == ref_col) - - class _IndentGreater(Empty): - def __init__(self, ref_col: int): - super().__init__() - self.errmsg = f"expected indent at column greater than {ref_col}" - self.add_condition(lambda s, l, t: col(l, s) > ref_col) - - def __init__( - self, expr: ParserElement, *, recursive: bool = False, grouped: bool = True - ): - super().__init__(expr, savelist=True) - # if recursive: - # raise NotImplementedError("IndentedBlock with recursive is not implemented") - self._recursive = recursive - self._grouped = grouped - self.parent_anchor = 1 - - def parseImpl(self, instring, loc, doActions=True): - # advance parse position to non-whitespace by using an Empty() - # this should be the column to be used for all subsequent indented lines - anchor_loc = Empty().preParse(instring, loc) - - # see if self.expr matches at the current location - if not it will raise an exception - # and no further work is necessary - self.expr.try_parse(instring, anchor_loc, do_actions=doActions) - - indent_col = col(anchor_loc, instring) - peer_detect_expr = self._Indent(indent_col) - - inner_expr = Empty() + peer_detect_expr + self.expr - if self._recursive: - sub_indent = self._IndentGreater(indent_col) - nested_block = IndentedBlock( - self.expr, recursive=self._recursive, grouped=self._grouped - ) - nested_block.set_debug(self.debug) - nested_block.parent_anchor = indent_col - inner_expr += Opt(sub_indent + nested_block) - - inner_expr.set_name(f"inner {hex(id(inner_expr))[-4:].upper()}@{indent_col}") - block = OneOrMore(inner_expr) - - trailing_undent = self._Indent(self.parent_anchor) | StringEnd() - - if self._grouped: - wrapper = Group - else: - wrapper = lambda expr: expr - return (wrapper(block) + Optional(trailing_undent)).parseImpl( - instring, anchor_loc, doActions - ) - - -class AtStringStart(ParseElementEnhance): - """Matches if expression matches at the beginning of the parse - string:: - - AtStringStart(Word(nums)).parse_string("123") - # prints ["123"] - - AtStringStart(Word(nums)).parse_string(" 123") - # raises ParseException - """ - - def __init__(self, expr: Union[ParserElement, str]): - super().__init__(expr) - self.callPreparse = False - - def parseImpl(self, instring, loc, doActions=True): - if loc != 0: - raise ParseException(instring, loc, "not found at string start") - return super().parseImpl(instring, loc, doActions) - - -class AtLineStart(ParseElementEnhance): - r"""Matches if an expression matches at the beginning of a line within - the parse string - - Example:: - - test = '''\ - AAA this line - AAA and this line - AAA but not this one - B AAA and definitely not this one - ''' - - for t in (AtLineStart('AAA') + rest_of_line).search_string(test): - print(t) - - prints:: - - ['AAA', ' this line'] - ['AAA', ' and this line'] - - """ - - def __init__(self, expr: Union[ParserElement, str]): - super().__init__(expr) - self.callPreparse = False - - def parseImpl(self, instring, loc, doActions=True): - if col(loc, instring) != 1: - raise ParseException(instring, loc, "not found at line start") - return super().parseImpl(instring, loc, doActions) - - -class FollowedBy(ParseElementEnhance): - """Lookahead matching of the given parse expression. - ``FollowedBy`` does *not* advance the parsing position within - the input string, it only verifies that the specified parse - expression matches at the current position. ``FollowedBy`` - always returns a null token list. If any results names are defined - in the lookahead expression, those *will* be returned for access by - name. - - Example:: - - # use FollowedBy to match a label only if it is followed by a ':' - data_word = Word(alphas) - label = data_word + FollowedBy(':') - attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stop_on=label).set_parse_action(' '.join)) - - attr_expr[1, ...].parse_string("shape: SQUARE color: BLACK posn: upper left").pprint() - - prints:: - - [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']] - """ - - def __init__(self, expr: Union[ParserElement, str]): - super().__init__(expr) - self.mayReturnEmpty = True - - def parseImpl(self, instring, loc, doActions=True): - # by using self._expr.parse and deleting the contents of the returned ParseResults list - # we keep any named results that were defined in the FollowedBy expression - _, ret = self.expr._parse(instring, loc, doActions=doActions) - del ret[:] - - return loc, ret - - -class PrecededBy(ParseElementEnhance): - """Lookbehind matching of the given parse expression. - ``PrecededBy`` does not advance the parsing position within the - input string, it only verifies that the specified parse expression - matches prior to the current position. ``PrecededBy`` always - returns a null token list, but if a results name is defined on the - given expression, it is returned. - - Parameters: - - - ``expr`` - expression that must match prior to the current parse - location - - ``retreat`` - (default= ``None``) - (int) maximum number of characters - to lookbehind prior to the current parse location - - If the lookbehind expression is a string, :class:`Literal`, - :class:`Keyword`, or a :class:`Word` or :class:`CharsNotIn` - with a specified exact or maximum length, then the retreat - parameter is not required. Otherwise, retreat must be specified to - give a maximum number of characters to look back from - the current parse position for a lookbehind match. - - Example:: - - # VB-style variable names with type prefixes - int_var = PrecededBy("#") + pyparsing_common.identifier - str_var = PrecededBy("$") + pyparsing_common.identifier - - """ - - def __init__( - self, expr: Union[ParserElement, str], retreat: typing.Optional[int] = None - ): - super().__init__(expr) - self.expr = self.expr().leave_whitespace() - self.mayReturnEmpty = True - self.mayIndexError = False - self.exact = False - if isinstance(expr, str_type): - expr = typing.cast(str, expr) - retreat = len(expr) - self.exact = True - elif isinstance(expr, (Literal, Keyword)): - retreat = expr.matchLen - self.exact = True - elif isinstance(expr, (Word, CharsNotIn)) and expr.maxLen != _MAX_INT: - retreat = expr.maxLen - self.exact = True - elif isinstance(expr, PositionToken): - retreat = 0 - self.exact = True - self.retreat = retreat - self.errmsg = "not preceded by " + str(expr) - self.skipWhitespace = False - self.parseAction.append(lambda s, l, t: t.__delitem__(slice(None, None))) - - def parseImpl(self, instring, loc=0, doActions=True): - if self.exact: - if loc < self.retreat: - raise ParseException(instring, loc, self.errmsg) - start = loc - self.retreat - _, ret = self.expr._parse(instring, start) - else: - # retreat specified a maximum lookbehind window, iterate - test_expr = self.expr + StringEnd() - instring_slice = instring[max(0, loc - self.retreat) : loc] - last_expr = ParseException(instring, loc, self.errmsg) - for offset in range(1, min(loc, self.retreat + 1) + 1): - try: - # print('trying', offset, instring_slice, repr(instring_slice[loc - offset:])) - _, ret = test_expr._parse( - instring_slice, len(instring_slice) - offset - ) - except ParseBaseException as pbe: - last_expr = pbe - else: - break - else: - raise last_expr - return loc, ret - - -class Located(ParseElementEnhance): - """ - Decorates a returned token with its starting and ending - locations in the input string. - - This helper adds the following results names: - - - ``locn_start`` - location where matched expression begins - - ``locn_end`` - location where matched expression ends - - ``value`` - the actual parsed results - - Be careful if the input text contains ``<TAB>`` characters, you - may want to call :class:`ParserElement.parse_with_tabs` - - Example:: - - wd = Word(alphas) - for match in Located(wd).search_string("ljsdf123lksdjjf123lkkjj1222"): - print(match) - - prints:: - - [0, ['ljsdf'], 5] - [8, ['lksdjjf'], 15] - [18, ['lkkjj'], 23] - - """ - - def parseImpl(self, instring, loc, doActions=True): - start = loc - loc, tokens = self.expr._parse(instring, start, doActions, callPreParse=False) - ret_tokens = ParseResults([start, tokens, loc]) - ret_tokens["locn_start"] = start - ret_tokens["value"] = tokens - ret_tokens["locn_end"] = loc - if self.resultsName: - # must return as a list, so that the name will be attached to the complete group - return loc, [ret_tokens] - else: - return loc, ret_tokens - - -class NotAny(ParseElementEnhance): - """ - Lookahead to disallow matching with the given parse expression. - ``NotAny`` does *not* advance the parsing position within the - input string, it only verifies that the specified parse expression - does *not* match at the current position. Also, ``NotAny`` does - *not* skip over leading whitespace. ``NotAny`` always returns - a null token list. May be constructed using the ``'~'`` operator. - - Example:: - - AND, OR, NOT = map(CaselessKeyword, "AND OR NOT".split()) - - # take care not to mistake keywords for identifiers - ident = ~(AND | OR | NOT) + Word(alphas) - boolean_term = Opt(NOT) + ident - - # very crude boolean expression - to support parenthesis groups and - # operation hierarchy, use infix_notation - boolean_expr = boolean_term + ((AND | OR) + boolean_term)[...] - - # integers that are followed by "." are actually floats - integer = Word(nums) + ~Char(".") - """ - - def __init__(self, expr: Union[ParserElement, str]): - super().__init__(expr) - # do NOT use self.leave_whitespace(), don't want to propagate to exprs - # self.leave_whitespace() - self.skipWhitespace = False - - self.mayReturnEmpty = True - self.errmsg = "Found unwanted token, " + str(self.expr) - - def parseImpl(self, instring, loc, doActions=True): - if self.expr.can_parse_next(instring, loc, do_actions=doActions): - raise ParseException(instring, loc, self.errmsg, self) - return loc, [] - - def _generateDefaultName(self) -> str: - return "~{" + str(self.expr) + "}" - - -class _MultipleMatch(ParseElementEnhance): - def __init__( - self, - expr: Union[str, ParserElement], - stop_on: typing.Optional[Union[ParserElement, str]] = None, - *, - stopOn: typing.Optional[Union[ParserElement, str]] = None, - ): - super().__init__(expr) - stopOn = stopOn or stop_on - self.saveAsList = True - ender = stopOn - if isinstance(ender, str_type): - ender = self._literalStringClass(ender) - self.stopOn(ender) - - def stopOn(self, ender) -> ParserElement: - if isinstance(ender, str_type): - ender = self._literalStringClass(ender) - self.not_ender = ~ender if ender is not None else None - return self - - def parseImpl(self, instring, loc, doActions=True): - self_expr_parse = self.expr._parse - self_skip_ignorables = self._skipIgnorables - check_ender = self.not_ender is not None - if check_ender: - try_not_ender = self.not_ender.try_parse - - # must be at least one (but first see if we are the stopOn sentinel; - # if so, fail) - if check_ender: - try_not_ender(instring, loc) - loc, tokens = self_expr_parse(instring, loc, doActions) - try: - hasIgnoreExprs = not not self.ignoreExprs - while 1: - if check_ender: - try_not_ender(instring, loc) - if hasIgnoreExprs: - preloc = self_skip_ignorables(instring, loc) - else: - preloc = loc - loc, tmptokens = self_expr_parse(instring, preloc, doActions) - tokens += tmptokens - except (ParseException, IndexError): - pass - - return loc, tokens - - def _setResultsName(self, name, listAllMatches=False): - if ( - __diag__.warn_ungrouped_named_tokens_in_collection - and Diagnostics.warn_ungrouped_named_tokens_in_collection - not in self.suppress_warnings_ - ): - for e in [self.expr] + self.expr.recurse(): - if ( - isinstance(e, ParserElement) - and e.resultsName - and Diagnostics.warn_ungrouped_named_tokens_in_collection - not in e.suppress_warnings_ - ): - warnings.warn( - "{}: setting results name {!r} on {} expression " - "collides with {!r} on contained expression".format( - "warn_ungrouped_named_tokens_in_collection", - name, - type(self).__name__, - e.resultsName, - ), - stacklevel=3, - ) - - return super()._setResultsName(name, listAllMatches) - - -class OneOrMore(_MultipleMatch): - """ - Repetition of one or more of the given expression. - - Parameters: - - - ``expr`` - expression that must match one or more times - - ``stop_on`` - (default= ``None``) - expression for a terminating sentinel - (only required if the sentinel would ordinarily match the repetition - expression) - - Example:: - - data_word = Word(alphas) - label = data_word + FollowedBy(':') - attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).set_parse_action(' '.join)) - - text = "shape: SQUARE posn: upper left color: BLACK" - attr_expr[1, ...].parse_string(text).pprint() # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']] - - # use stop_on attribute for OneOrMore to avoid reading label string as part of the data - attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stop_on=label).set_parse_action(' '.join)) - OneOrMore(attr_expr).parse_string(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']] - - # could also be written as - (attr_expr * (1,)).parse_string(text).pprint() - """ - - def _generateDefaultName(self) -> str: - return "{" + str(self.expr) + "}..." - - -class ZeroOrMore(_MultipleMatch): - """ - Optional repetition of zero or more of the given expression. - - Parameters: - - - ``expr`` - expression that must match zero or more times - - ``stop_on`` - expression for a terminating sentinel - (only required if the sentinel would ordinarily match the repetition - expression) - (default= ``None``) - - Example: similar to :class:`OneOrMore` - """ - - def __init__( - self, - expr: Union[str, ParserElement], - stop_on: typing.Optional[Union[ParserElement, str]] = None, - *, - stopOn: typing.Optional[Union[ParserElement, str]] = None, - ): - super().__init__(expr, stopOn=stopOn or stop_on) - self.mayReturnEmpty = True - - def parseImpl(self, instring, loc, doActions=True): - try: - return super().parseImpl(instring, loc, doActions) - except (ParseException, IndexError): - return loc, ParseResults([], name=self.resultsName) - - def _generateDefaultName(self) -> str: - return "[" + str(self.expr) + "]..." - - -class DelimitedList(ParseElementEnhance): - def __init__( - self, - expr: Union[str, ParserElement], - delim: Union[str, ParserElement] = ",", - combine: bool = False, - min: typing.Optional[int] = None, - max: typing.Optional[int] = None, - *, - allow_trailing_delim: bool = False, - ): - """Helper to define a delimited list of expressions - the delimiter - defaults to ','. By default, the list elements and delimiters can - have intervening whitespace, and comments, but this can be - overridden by passing ``combine=True`` in the constructor. If - ``combine`` is set to ``True``, the matching tokens are - returned as a single token string, with the delimiters included; - otherwise, the matching tokens are returned as a list of tokens, - with the delimiters suppressed. - - If ``allow_trailing_delim`` is set to True, then the list may end with - a delimiter. - - Example:: - - DelimitedList(Word(alphas)).parse_string("aa,bb,cc") # -> ['aa', 'bb', 'cc'] - DelimitedList(Word(hexnums), delim=':', combine=True).parse_string("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE'] - """ - if isinstance(expr, str_type): - expr = ParserElement._literalStringClass(expr) - expr = typing.cast(ParserElement, expr) - - if min is not None: - if min < 1: - raise ValueError("min must be greater than 0") - if max is not None: - if min is not None and max < min: - raise ValueError("max must be greater than, or equal to min") - - self.content = expr - self.raw_delim = str(delim) - self.delim = delim - self.combine = combine - if not combine: - self.delim = Suppress(delim) - self.min = min or 1 - self.max = max - self.allow_trailing_delim = allow_trailing_delim - - delim_list_expr = self.content + (self.delim + self.content) * ( - self.min - 1, - None if self.max is None else self.max - 1, - ) - if self.allow_trailing_delim: - delim_list_expr += Opt(self.delim) - - if self.combine: - delim_list_expr = Combine(delim_list_expr) - - super().__init__(delim_list_expr, savelist=True) - - def _generateDefaultName(self) -> str: - return "{0} [{1} {0}]...".format(self.content.streamline(), self.raw_delim) - - -class _NullToken: - def __bool__(self): - return False - - def __str__(self): - return "" - - -class Opt(ParseElementEnhance): - """ - Optional matching of the given expression. - - Parameters: - - - ``expr`` - expression that must match zero or more times - - ``default`` (optional) - value to be returned if the optional expression is not found. - - Example:: - - # US postal code can be a 5-digit zip, plus optional 4-digit qualifier - zip = Combine(Word(nums, exact=5) + Opt('-' + Word(nums, exact=4))) - zip.run_tests(''' - # traditional ZIP code - 12345 - - # ZIP+4 form - 12101-0001 - - # invalid ZIP - 98765- - ''') - - prints:: - - # traditional ZIP code - 12345 - ['12345'] - - # ZIP+4 form - 12101-0001 - ['12101-0001'] - - # invalid ZIP - 98765- - ^ - FAIL: Expected end of text (at char 5), (line:1, col:6) - """ - - __optionalNotMatched = _NullToken() - - def __init__( - self, expr: Union[ParserElement, str], default: Any = __optionalNotMatched - ): - super().__init__(expr, savelist=False) - self.saveAsList = self.expr.saveAsList - self.defaultValue = default - self.mayReturnEmpty = True - - def parseImpl(self, instring, loc, doActions=True): - self_expr = self.expr - try: - loc, tokens = self_expr._parse(instring, loc, doActions, callPreParse=False) - except (ParseException, IndexError): - default_value = self.defaultValue - if default_value is not self.__optionalNotMatched: - if self_expr.resultsName: - tokens = ParseResults([default_value]) - tokens[self_expr.resultsName] = default_value - else: - tokens = [default_value] - else: - tokens = [] - return loc, tokens - - def _generateDefaultName(self) -> str: - inner = str(self.expr) - # strip off redundant inner {}'s - while len(inner) > 1 and inner[0 :: len(inner) - 1] == "{}": - inner = inner[1:-1] - return "[" + inner + "]" - - -Optional = Opt - - -class SkipTo(ParseElementEnhance): - """ - Token for skipping over all undefined text until the matched - expression is found. - - Parameters: - - - ``expr`` - target expression marking the end of the data to be skipped - - ``include`` - if ``True``, the target expression is also parsed - (the skipped text and target expression are returned as a 2-element - list) (default= ``False``). - - ``ignore`` - (default= ``None``) used to define grammars (typically quoted strings and - comments) that might contain false matches to the target expression - - ``fail_on`` - (default= ``None``) define expressions that are not allowed to be - included in the skipped test; if found before the target expression is found, - the :class:`SkipTo` is not a match - - Example:: - - report = ''' - Outstanding Issues Report - 1 Jan 2000 - - # | Severity | Description | Days Open - -----+----------+-------------------------------------------+----------- - 101 | Critical | Intermittent system crash | 6 - 94 | Cosmetic | Spelling error on Login ('log|n') | 14 - 79 | Minor | System slow when running too many reports | 47 - ''' - integer = Word(nums) - SEP = Suppress('|') - # use SkipTo to simply match everything up until the next SEP - # - ignore quoted strings, so that a '|' character inside a quoted string does not match - # - parse action will call token.strip() for each matched token, i.e., the description body - string_data = SkipTo(SEP, ignore=quoted_string) - string_data.set_parse_action(token_map(str.strip)) - ticket_expr = (integer("issue_num") + SEP - + string_data("sev") + SEP - + string_data("desc") + SEP - + integer("days_open")) - - for tkt in ticket_expr.search_string(report): - print tkt.dump() - - prints:: - - ['101', 'Critical', 'Intermittent system crash', '6'] - - days_open: '6' - - desc: 'Intermittent system crash' - - issue_num: '101' - - sev: 'Critical' - ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14'] - - days_open: '14' - - desc: "Spelling error on Login ('log|n')" - - issue_num: '94' - - sev: 'Cosmetic' - ['79', 'Minor', 'System slow when running too many reports', '47'] - - days_open: '47' - - desc: 'System slow when running too many reports' - - issue_num: '79' - - sev: 'Minor' - """ - - def __init__( - self, - other: Union[ParserElement, str], - include: bool = False, - ignore: typing.Optional[Union[ParserElement, str]] = None, - fail_on: typing.Optional[Union[ParserElement, str]] = None, - *, - failOn: typing.Optional[Union[ParserElement, str]] = None, - ): - super().__init__(other) - failOn = failOn or fail_on - if ignore is not None: - self.ignore(ignore) - self.mayReturnEmpty = True - self.mayIndexError = False - self.includeMatch = include - self.saveAsList = False - if isinstance(failOn, str_type): - self.failOn = self._literalStringClass(failOn) - else: - self.failOn = failOn - self.errmsg = "No match found for " + str(self.expr) - - def parseImpl(self, instring, loc, doActions=True): - startloc = loc - instrlen = len(instring) - self_expr_parse = self.expr._parse - self_failOn_canParseNext = ( - self.failOn.canParseNext if self.failOn is not None else None - ) - self_preParse = self.preParse if self.callPreparse else None - - tmploc = loc - while tmploc <= instrlen: - if self_failOn_canParseNext is not None: - # break if failOn expression matches - if self_failOn_canParseNext(instring, tmploc): - break - - if self_preParse is not None: - # skip grammar-ignored expressions - tmploc = self_preParse(instring, tmploc) - - try: - self_expr_parse(instring, tmploc, doActions=False, callPreParse=False) - except (ParseException, IndexError): - # no match, advance loc in string - tmploc += 1 - else: - # matched skipto expr, done - break - - else: - # ran off the end of the input string without matching skipto expr, fail - raise ParseException(instring, loc, self.errmsg, self) - - # build up return values - loc = tmploc - skiptext = instring[startloc:loc] - skipresult = ParseResults(skiptext) - - if self.includeMatch: - loc, mat = self_expr_parse(instring, loc, doActions, callPreParse=False) - skipresult += mat - - return loc, skipresult - - -class Forward(ParseElementEnhance): - """ - Forward declaration of an expression to be defined later - - used for recursive grammars, such as algebraic infix notation. - When the expression is known, it is assigned to the ``Forward`` - variable using the ``'<<'`` operator. - - Note: take care when assigning to ``Forward`` not to overlook - precedence of operators. - - Specifically, ``'|'`` has a lower precedence than ``'<<'``, so that:: - - fwd_expr << a | b | c - - will actually be evaluated as:: - - (fwd_expr << a) | b | c - - thereby leaving b and c out as parseable alternatives. It is recommended that you - explicitly group the values inserted into the ``Forward``:: - - fwd_expr << (a | b | c) - - Converting to use the ``'<<='`` operator instead will avoid this problem. - - See :class:`ParseResults.pprint` for an example of a recursive - parser created using ``Forward``. - """ - - def __init__(self, other: typing.Optional[Union[ParserElement, str]] = None): - self.caller_frame = traceback.extract_stack(limit=2)[0] - super().__init__(other, savelist=False) # type: ignore[arg-type] - self.lshift_line = None - - def __lshift__(self, other) -> "Forward": - if hasattr(self, "caller_frame"): - del self.caller_frame - if isinstance(other, str_type): - other = self._literalStringClass(other) - - if not isinstance(other, ParserElement): - return NotImplemented - - self.expr = other - self.streamlined = other.streamlined - self.mayIndexError = self.expr.mayIndexError - self.mayReturnEmpty = self.expr.mayReturnEmpty - self.set_whitespace_chars( - self.expr.whiteChars, copy_defaults=self.expr.copyDefaultWhiteChars - ) - self.skipWhitespace = self.expr.skipWhitespace - self.saveAsList = self.expr.saveAsList - self.ignoreExprs.extend(self.expr.ignoreExprs) - self.lshift_line = traceback.extract_stack(limit=2)[-2] # type: ignore[assignment] - return self - - def __ilshift__(self, other) -> "Forward": - if not isinstance(other, ParserElement): - return NotImplemented - - return self << other - - def __or__(self, other) -> "ParserElement": - caller_line = traceback.extract_stack(limit=2)[-2] - if ( - __diag__.warn_on_match_first_with_lshift_operator - and caller_line == self.lshift_line - and Diagnostics.warn_on_match_first_with_lshift_operator - not in self.suppress_warnings_ - ): - warnings.warn( - "using '<<' operator with '|' is probably an error, use '<<='", - stacklevel=2, - ) - ret = super().__or__(other) - return ret - - def __del__(self): - # see if we are getting dropped because of '=' reassignment of var instead of '<<=' or '<<' - if ( - self.expr is None - and __diag__.warn_on_assignment_to_Forward - and Diagnostics.warn_on_assignment_to_Forward not in self.suppress_warnings_ - ): - warnings.warn_explicit( - "Forward defined here but no expression attached later using '<<=' or '<<'", - UserWarning, - filename=self.caller_frame.filename, - lineno=self.caller_frame.lineno, - ) - - def parseImpl(self, instring, loc, doActions=True): - if ( - self.expr is None - and __diag__.warn_on_parse_using_empty_Forward - and Diagnostics.warn_on_parse_using_empty_Forward - not in self.suppress_warnings_ - ): - # walk stack until parse_string, scan_string, search_string, or transform_string is found - parse_fns = ( - "parse_string", - "scan_string", - "search_string", - "transform_string", - ) - tb = traceback.extract_stack(limit=200) - for i, frm in enumerate(reversed(tb), start=1): - if frm.name in parse_fns: - stacklevel = i + 1 - break - else: - stacklevel = 2 - warnings.warn( - "Forward expression was never assigned a value, will not parse any input", - stacklevel=stacklevel, - ) - if not ParserElement._left_recursion_enabled: - return super().parseImpl(instring, loc, doActions) - # ## Bounded Recursion algorithm ## - # Recursion only needs to be processed at ``Forward`` elements, since they are - # the only ones that can actually refer to themselves. The general idea is - # to handle recursion stepwise: We start at no recursion, then recurse once, - # recurse twice, ..., until more recursion offers no benefit (we hit the bound). - # - # The "trick" here is that each ``Forward`` gets evaluated in two contexts - # - to *match* a specific recursion level, and - # - to *search* the bounded recursion level - # and the two run concurrently. The *search* must *match* each recursion level - # to find the best possible match. This is handled by a memo table, which - # provides the previous match to the next level match attempt. - # - # See also "Left Recursion in Parsing Expression Grammars", Medeiros et al. - # - # There is a complication since we not only *parse* but also *transform* via - # actions: We do not want to run the actions too often while expanding. Thus, - # we expand using `doActions=False` and only run `doActions=True` if the next - # recursion level is acceptable. - with ParserElement.recursion_lock: - memo = ParserElement.recursion_memos - try: - # we are parsing at a specific recursion expansion - use it as-is - prev_loc, prev_result = memo[loc, self, doActions] - if isinstance(prev_result, Exception): - raise prev_result - return prev_loc, prev_result.copy() - except KeyError: - act_key = (loc, self, True) - peek_key = (loc, self, False) - # we are searching for the best recursion expansion - keep on improving - # both `doActions` cases must be tracked separately here! - prev_loc, prev_peek = memo[peek_key] = ( - loc - 1, - ParseException( - instring, loc, "Forward recursion without base case", self - ), - ) - if doActions: - memo[act_key] = memo[peek_key] - while True: - try: - new_loc, new_peek = super().parseImpl(instring, loc, False) - except ParseException: - # we failed before getting any match – do not hide the error - if isinstance(prev_peek, Exception): - raise - new_loc, new_peek = prev_loc, prev_peek - # the match did not get better: we are done - if new_loc <= prev_loc: - if doActions: - # replace the match for doActions=False as well, - # in case the action did backtrack - prev_loc, prev_result = memo[peek_key] = memo[act_key] - del memo[peek_key], memo[act_key] - return prev_loc, prev_result.copy() - del memo[peek_key] - return prev_loc, prev_peek.copy() - # the match did get better: see if we can improve further - else: - if doActions: - try: - memo[act_key] = super().parseImpl(instring, loc, True) - except ParseException as e: - memo[peek_key] = memo[act_key] = (new_loc, e) - raise - prev_loc, prev_peek = memo[peek_key] = new_loc, new_peek - - def leave_whitespace(self, recursive: bool = True) -> ParserElement: - self.skipWhitespace = False - return self - - def ignore_whitespace(self, recursive: bool = True) -> ParserElement: - self.skipWhitespace = True - return self - - def streamline(self) -> ParserElement: - if not self.streamlined: - self.streamlined = True - if self.expr is not None: - self.expr.streamline() - return self - - def validate(self, validateTrace=None) -> None: - warnings.warn( - "ParserElement.validate() is deprecated, and should not be used to check for left recursion", - DeprecationWarning, - stacklevel=2, - ) - if validateTrace is None: - validateTrace = [] - - if self not in validateTrace: - tmp = validateTrace[:] + [self] - if self.expr is not None: - self.expr.validate(tmp) - self._checkRecursion([]) - - def _generateDefaultName(self) -> str: - # Avoid infinite recursion by setting a temporary _defaultName - self._defaultName = ": ..." - - # Use the string representation of main expression. - retString = "..." - try: - if self.expr is not None: - retString = str(self.expr)[:1000] - else: - retString = "None" - finally: - return self.__class__.__name__ + ": " + retString - - def copy(self) -> ParserElement: - if self.expr is not None: - return super().copy() - else: - ret = Forward() - ret <<= self - return ret - - def _setResultsName(self, name, list_all_matches=False): - if ( - __diag__.warn_name_set_on_empty_Forward - and Diagnostics.warn_name_set_on_empty_Forward - not in self.suppress_warnings_ - ): - if self.expr is None: - warnings.warn( - "{}: setting results name {!r} on {} expression " - "that has no contained expression".format( - "warn_name_set_on_empty_Forward", name, type(self).__name__ - ), - stacklevel=3, - ) - - return super()._setResultsName(name, list_all_matches) - - # Compatibility synonyms - # fmt: off - @replaced_by_pep8(leave_whitespace) - def leaveWhitespace(self): ... - - @replaced_by_pep8(ignore_whitespace) - def ignoreWhitespace(self): ... - # fmt: on - - -class TokenConverter(ParseElementEnhance): - """ - Abstract subclass of :class:`ParseExpression`, for converting parsed results. - """ - - def __init__(self, expr: Union[ParserElement, str], savelist=False): - super().__init__(expr) # , savelist) - self.saveAsList = False - - -class Combine(TokenConverter): - """Converter to concatenate all matching tokens to a single string. - By default, the matching patterns must also be contiguous in the - input string; this can be disabled by specifying - ``'adjacent=False'`` in the constructor. - - Example:: - - real = Word(nums) + '.' + Word(nums) - print(real.parse_string('3.1416')) # -> ['3', '.', '1416'] - # will also erroneously match the following - print(real.parse_string('3. 1416')) # -> ['3', '.', '1416'] - - real = Combine(Word(nums) + '.' + Word(nums)) - print(real.parse_string('3.1416')) # -> ['3.1416'] - # no match when there are internal spaces - print(real.parse_string('3. 1416')) # -> Exception: Expected W:(0123...) - """ - - def __init__( - self, - expr: ParserElement, - join_string: str = "", - adjacent: bool = True, - *, - joinString: typing.Optional[str] = None, - ): - super().__init__(expr) - joinString = joinString if joinString is not None else join_string - # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself - if adjacent: - self.leave_whitespace() - self.adjacent = adjacent - self.skipWhitespace = True - self.joinString = joinString - self.callPreparse = True - - def ignore(self, other) -> ParserElement: - if self.adjacent: - ParserElement.ignore(self, other) - else: - super().ignore(other) - return self - - def postParse(self, instring, loc, tokenlist): - retToks = tokenlist.copy() - del retToks[:] - retToks += ParseResults( - ["".join(tokenlist._asStringList(self.joinString))], modal=self.modalResults - ) - - if self.resultsName and retToks.haskeys(): - return [retToks] - else: - return retToks - - -class Group(TokenConverter): - """Converter to return the matched tokens as a list - useful for - returning tokens of :class:`ZeroOrMore` and :class:`OneOrMore` expressions. - - The optional ``aslist`` argument when set to True will return the - parsed tokens as a Python list instead of a pyparsing ParseResults. - - Example:: - - ident = Word(alphas) - num = Word(nums) - term = ident | num - func = ident + Opt(DelimitedList(term)) - print(func.parse_string("fn a, b, 100")) - # -> ['fn', 'a', 'b', '100'] - - func = ident + Group(Opt(DelimitedList(term))) - print(func.parse_string("fn a, b, 100")) - # -> ['fn', ['a', 'b', '100']] - """ - - def __init__(self, expr: ParserElement, aslist: bool = False): - super().__init__(expr) - self.saveAsList = True - self._asPythonList = aslist - - def postParse(self, instring, loc, tokenlist): - if self._asPythonList: - return ParseResults.List( - tokenlist.asList() - if isinstance(tokenlist, ParseResults) - else list(tokenlist) - ) - else: - return [tokenlist] - - -class Dict(TokenConverter): - """Converter to return a repetitive expression as a list, but also - as a dictionary. Each element can also be referenced using the first - token in the expression as its key. Useful for tabular report - scraping when the first column can be used as a item key. - - The optional ``asdict`` argument when set to True will return the - parsed tokens as a Python dict instead of a pyparsing ParseResults. - - Example:: - - data_word = Word(alphas) - label = data_word + FollowedBy(':') - - text = "shape: SQUARE posn: upper left color: light blue texture: burlap" - attr_expr = (label + Suppress(':') + OneOrMore(data_word, stop_on=label).set_parse_action(' '.join)) - - # print attributes as plain groups - print(attr_expr[1, ...].parse_string(text).dump()) - - # instead of OneOrMore(expr), parse using Dict(Group(expr)[1, ...]) - Dict will auto-assign names - result = Dict(Group(attr_expr)[1, ...]).parse_string(text) - print(result.dump()) - - # access named fields as dict entries, or output as dict - print(result['shape']) - print(result.as_dict()) - - prints:: - - ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap'] - [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] - - color: 'light blue' - - posn: 'upper left' - - shape: 'SQUARE' - - texture: 'burlap' - SQUARE - {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'} - - See more examples at :class:`ParseResults` of accessing fields by results name. - """ - - def __init__(self, expr: ParserElement, asdict: bool = False): - super().__init__(expr) - self.saveAsList = True - self._asPythonDict = asdict - - def postParse(self, instring, loc, tokenlist): - for i, tok in enumerate(tokenlist): - if len(tok) == 0: - continue - - ikey = tok[0] - if isinstance(ikey, int): - ikey = str(ikey).strip() - - if len(tok) == 1: - tokenlist[ikey] = _ParseResultsWithOffset("", i) - - elif len(tok) == 2 and not isinstance(tok[1], ParseResults): - tokenlist[ikey] = _ParseResultsWithOffset(tok[1], i) - - else: - try: - dictvalue = tok.copy() # ParseResults(i) - except Exception: - exc = TypeError( - "could not extract dict values from parsed results" - " - Dict expression must contain Grouped expressions" - ) - raise exc from None - - del dictvalue[0] - - if len(dictvalue) != 1 or ( - isinstance(dictvalue, ParseResults) and dictvalue.haskeys() - ): - tokenlist[ikey] = _ParseResultsWithOffset(dictvalue, i) - else: - tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0], i) - - if self._asPythonDict: - return [tokenlist.as_dict()] if self.resultsName else tokenlist.as_dict() - else: - return [tokenlist] if self.resultsName else tokenlist - - -class Suppress(TokenConverter): - """Converter for ignoring the results of a parsed expression. - - Example:: - - source = "a, b, c,d" - wd = Word(alphas) - wd_list1 = wd + (',' + wd)[...] - print(wd_list1.parse_string(source)) - - # often, delimiters that are useful during parsing are just in the - # way afterward - use Suppress to keep them out of the parsed output - wd_list2 = wd + (Suppress(',') + wd)[...] - print(wd_list2.parse_string(source)) - - # Skipped text (using '...') can be suppressed as well - source = "lead in START relevant text END trailing text" - start_marker = Keyword("START") - end_marker = Keyword("END") - find_body = Suppress(...) + start_marker + ... + end_marker - print(find_body.parse_string(source) - - prints:: - - ['a', ',', 'b', ',', 'c', ',', 'd'] - ['a', 'b', 'c', 'd'] - ['START', 'relevant text ', 'END'] - - (See also :class:`DelimitedList`.) - """ - - def __init__(self, expr: Union[ParserElement, str], savelist: bool = False): - if expr is ...: - expr = _PendingSkip(NoMatch()) - super().__init__(expr) - - def __add__(self, other) -> "ParserElement": - if isinstance(self.expr, _PendingSkip): - return Suppress(SkipTo(other)) + other - else: - return super().__add__(other) - - def __sub__(self, other) -> "ParserElement": - if isinstance(self.expr, _PendingSkip): - return Suppress(SkipTo(other)) - other - else: - return super().__sub__(other) - - def postParse(self, instring, loc, tokenlist): - return [] - - def suppress(self) -> ParserElement: - return self - - -def trace_parse_action(f: ParseAction) -> ParseAction: - """Decorator for debugging parse actions. - - When the parse action is called, this decorator will print - ``">> entering method-name(line:<current_source_line>, <parse_location>, <matched_tokens>)"``. - When the parse action completes, the decorator will print - ``"<<"`` followed by the returned value, or any exception that the parse action raised. - - Example:: - - wd = Word(alphas) - - @trace_parse_action - def remove_duplicate_chars(tokens): - return ''.join(sorted(set(''.join(tokens)))) - - wds = wd[1, ...].set_parse_action(remove_duplicate_chars) - print(wds.parse_string("slkdjs sld sldd sdlf sdljf")) - - prints:: - - >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {})) - <<leaving remove_duplicate_chars (ret: 'dfjkls') - ['dfjkls'] - """ - f = _trim_arity(f) - - def z(*paArgs): - thisFunc = f.__name__ - s, l, t = paArgs[-3:] - if len(paArgs) > 3: - thisFunc = paArgs[0].__class__.__name__ + "." + thisFunc - sys.stderr.write(f">>entering {thisFunc}(line: {line(l, s)!r}, {l}, {t!r})\n") - try: - ret = f(*paArgs) - except Exception as exc: - sys.stderr.write(f"<<leaving {thisFunc} (exception: {exc})\n") - raise - sys.stderr.write(f"<<leaving {thisFunc} (ret: {ret!r})\n") - return ret - - z.__name__ = f.__name__ - return z - - -# convenience constants for positional expressions -empty = Empty().set_name("empty") -line_start = LineStart().set_name("line_start") -line_end = LineEnd().set_name("line_end") -string_start = StringStart().set_name("string_start") -string_end = StringEnd().set_name("string_end") - -_escapedPunc = Regex(r"\\[\\[\]\/\-\*\.\$\+\^\?()~ ]").set_parse_action( - lambda s, l, t: t[0][1] -) -_escapedHexChar = Regex(r"\\0?[xX][0-9a-fA-F]+").set_parse_action( - lambda s, l, t: chr(int(t[0].lstrip(r"\0x"), 16)) -) -_escapedOctChar = Regex(r"\\0[0-7]+").set_parse_action( - lambda s, l, t: chr(int(t[0][1:], 8)) -) -_singleChar = ( - _escapedPunc | _escapedHexChar | _escapedOctChar | CharsNotIn(r"\]", exact=1) -) -_charRange = Group(_singleChar + Suppress("-") + _singleChar) -_reBracketExpr = ( - Literal("[") - + Opt("^").set_results_name("negate") - + Group(OneOrMore(_charRange | _singleChar)).set_results_name("body") - + Literal("]") -) - - -def srange(s: str) -> str: - r"""Helper to easily define string ranges for use in :class:`Word` - construction. Borrows syntax from regexp ``'[]'`` string range - definitions:: - - srange("[0-9]") -> "0123456789" - srange("[a-z]") -> "abcdefghijklmnopqrstuvwxyz" - srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_" - - The input string must be enclosed in []'s, and the returned string - is the expanded character set joined into a single string. The - values enclosed in the []'s may be: - - - a single character - - an escaped character with a leading backslash (such as ``\-`` - or ``\]``) - - an escaped hex character with a leading ``'\x'`` - (``\x21``, which is a ``'!'`` character) (``\0x##`` - is also supported for backwards compatibility) - - an escaped octal character with a leading ``'\0'`` - (``\041``, which is a ``'!'`` character) - - a range of any of the above, separated by a dash (``'a-z'``, - etc.) - - any combination of the above (``'aeiouy'``, - ``'a-zA-Z0-9_$'``, etc.) - """ - _expanded = ( - lambda p: p - if not isinstance(p, ParseResults) - else "".join(chr(c) for c in range(ord(p[0]), ord(p[1]) + 1)) - ) - try: - return "".join(_expanded(part) for part in _reBracketExpr.parse_string(s).body) - except Exception as e: - return "" - - -def token_map(func, *args) -> ParseAction: - """Helper to define a parse action by mapping a function to all - elements of a :class:`ParseResults` list. If any additional args are passed, - they are forwarded to the given function as additional arguments - after the token, as in - ``hex_integer = Word(hexnums).set_parse_action(token_map(int, 16))``, - which will convert the parsed data to an integer using base 16. - - Example (compare the last to example in :class:`ParserElement.transform_string`:: - - hex_ints = Word(hexnums)[1, ...].set_parse_action(token_map(int, 16)) - hex_ints.run_tests(''' - 00 11 22 aa FF 0a 0d 1a - ''') - - upperword = Word(alphas).set_parse_action(token_map(str.upper)) - upperword[1, ...].run_tests(''' - my kingdom for a horse - ''') - - wd = Word(alphas).set_parse_action(token_map(str.title)) - wd[1, ...].set_parse_action(' '.join).run_tests(''' - now is the winter of our discontent made glorious summer by this sun of york - ''') - - prints:: - - 00 11 22 aa FF 0a 0d 1a - [0, 17, 34, 170, 255, 10, 13, 26] - - my kingdom for a horse - ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE'] - - now is the winter of our discontent made glorious summer by this sun of york - ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York'] - """ - - def pa(s, l, t): - return [func(tokn, *args) for tokn in t] - - func_name = getattr(func, "__name__", getattr(func, "__class__").__name__) - pa.__name__ = func_name - - return pa - - -def autoname_elements() -> None: - """ - Utility to simplify mass-naming of parser elements, for - generating railroad diagram with named subdiagrams. - """ - calling_frame = sys._getframe().f_back - if calling_frame is None: - return - calling_frame = typing.cast(types.FrameType, calling_frame) - for name, var in calling_frame.f_locals.items(): - if isinstance(var, ParserElement) and not var.customName: - var.set_name(name) - - -dbl_quoted_string = Combine( - Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*') + '"' -).set_name("string enclosed in double quotes") - -sgl_quoted_string = Combine( - Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*") + "'" -).set_name("string enclosed in single quotes") - -quoted_string = Combine( - (Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*') + '"').set_name( - "double quoted string" - ) - | (Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*") + "'").set_name( - "single quoted string" - ) -).set_name("quoted string using single or double quotes") - -python_quoted_string = Combine( - (Regex(r'"""(?:[^"\\]|""(?!")|"(?!"")|\\.)*', flags=re.MULTILINE) + '"""').set_name( - "multiline double quoted string" - ) - ^ ( - Regex(r"'''(?:[^'\\]|''(?!')|'(?!'')|\\.)*", flags=re.MULTILINE) + "'''" - ).set_name("multiline single quoted string") - ^ (Regex(r'"(?:[^"\n\r\\]|(?:\\")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*') + '"').set_name( - "double quoted string" - ) - ^ (Regex(r"'(?:[^'\n\r\\]|(?:\\')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*") + "'").set_name( - "single quoted string" - ) -).set_name("Python quoted string") - -unicode_string = Combine("u" + quoted_string.copy()).set_name("unicode string literal") - - -alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]") -punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]") - -# build list of built-in expressions, for future reference if a global default value -# gets updated -_builtin_exprs: List[ParserElement] = [ - v for v in vars().values() if isinstance(v, ParserElement) -] - -# backward compatibility names -# fmt: off -sglQuotedString = sgl_quoted_string -dblQuotedString = dbl_quoted_string -quotedString = quoted_string -unicodeString = unicode_string -lineStart = line_start -lineEnd = line_end -stringStart = string_start -stringEnd = string_end - -@replaced_by_pep8(null_debug_action) -def nullDebugAction(): ... - -@replaced_by_pep8(trace_parse_action) -def traceParseAction(): ... - -@replaced_by_pep8(condition_as_parse_action) -def conditionAsParseAction(): ... - -@replaced_by_pep8(token_map) -def tokenMap(): ... -# fmt: on diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__init__.py deleted file mode 100644 index 83f9018..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__init__.py +++ /dev/null @@ -1,656 +0,0 @@ -# mypy: ignore-errors -import railroad -from pip._vendor import pyparsing -import typing -from typing import ( - List, - NamedTuple, - Generic, - TypeVar, - Dict, - Callable, - Set, - Iterable, -) -from jinja2 import Template -from io import StringIO -import inspect - - -jinja2_template_source = """\ -{% if not embed %} -<!DOCTYPE html> -<html> -<head> -{% endif %} - {% if not head %} - <style> - .railroad-heading { - font-family: monospace; - } - </style> - {% else %} - {{ head | safe }} - {% endif %} -{% if not embed %} -</head> -<body> -{% endif %} -{{ body | safe }} -{% for diagram in diagrams %} - <div class="railroad-group"> - <h1 class="railroad-heading">{{ diagram.title }}</h1> - <div class="railroad-description">{{ diagram.text }}</div> - <div class="railroad-svg"> - {{ diagram.svg }} - </div> - </div> -{% endfor %} -{% if not embed %} -</body> -</html> -{% endif %} -""" - -template = Template(jinja2_template_source) - -# Note: ideally this would be a dataclass, but we're supporting Python 3.5+ so we can't do this yet -NamedDiagram = NamedTuple( - "NamedDiagram", - [("name", str), ("diagram", typing.Optional[railroad.DiagramItem]), ("index", int)], -) -""" -A simple structure for associating a name with a railroad diagram -""" - -T = TypeVar("T") - - -class EachItem(railroad.Group): - """ - Custom railroad item to compose a: - - Group containing a - - OneOrMore containing a - - Choice of the elements in the Each - with the group label indicating that all must be matched - """ - - all_label = "[ALL]" - - def __init__(self, *items): - choice_item = railroad.Choice(len(items) - 1, *items) - one_or_more_item = railroad.OneOrMore(item=choice_item) - super().__init__(one_or_more_item, label=self.all_label) - - -class AnnotatedItem(railroad.Group): - """ - Simple subclass of Group that creates an annotation label - """ - - def __init__(self, label: str, item): - super().__init__(item=item, label="[{}]".format(label) if label else label) - - -class EditablePartial(Generic[T]): - """ - Acts like a functools.partial, but can be edited. In other words, it represents a type that hasn't yet been - constructed. - """ - - # We need this here because the railroad constructors actually transform the data, so can't be called until the - # entire tree is assembled - - def __init__(self, func: Callable[..., T], args: list, kwargs: dict): - self.func = func - self.args = args - self.kwargs = kwargs - - @classmethod - def from_call(cls, func: Callable[..., T], *args, **kwargs) -> "EditablePartial[T]": - """ - If you call this function in the same way that you would call the constructor, it will store the arguments - as you expect. For example EditablePartial.from_call(Fraction, 1, 3)() == Fraction(1, 3) - """ - return EditablePartial(func=func, args=list(args), kwargs=kwargs) - - @property - def name(self): - return self.kwargs["name"] - - def __call__(self) -> T: - """ - Evaluate the partial and return the result - """ - args = self.args.copy() - kwargs = self.kwargs.copy() - - # This is a helpful hack to allow you to specify varargs parameters (e.g. *args) as keyword args (e.g. - # args=['list', 'of', 'things']) - arg_spec = inspect.getfullargspec(self.func) - if arg_spec.varargs in self.kwargs: - args += kwargs.pop(arg_spec.varargs) - - return self.func(*args, **kwargs) - - -def railroad_to_html(diagrams: List[NamedDiagram], embed=False, **kwargs) -> str: - """ - Given a list of NamedDiagram, produce a single HTML string that visualises those diagrams - :params kwargs: kwargs to be passed in to the template - """ - data = [] - for diagram in diagrams: - if diagram.diagram is None: - continue - io = StringIO() - try: - css = kwargs.get('css') - diagram.diagram.writeStandalone(io.write, css=css) - except AttributeError: - diagram.diagram.writeSvg(io.write) - title = diagram.name - if diagram.index == 0: - title += " (root)" - data.append({"title": title, "text": "", "svg": io.getvalue()}) - - return template.render(diagrams=data, embed=embed, **kwargs) - - -def resolve_partial(partial: "EditablePartial[T]") -> T: - """ - Recursively resolves a collection of Partials into whatever type they are - """ - if isinstance(partial, EditablePartial): - partial.args = resolve_partial(partial.args) - partial.kwargs = resolve_partial(partial.kwargs) - return partial() - elif isinstance(partial, list): - return [resolve_partial(x) for x in partial] - elif isinstance(partial, dict): - return {key: resolve_partial(x) for key, x in partial.items()} - else: - return partial - - -def to_railroad( - element: pyparsing.ParserElement, - diagram_kwargs: typing.Optional[dict] = None, - vertical: int = 3, - show_results_names: bool = False, - show_groups: bool = False, -) -> List[NamedDiagram]: - """ - Convert a pyparsing element tree into a list of diagrams. This is the recommended entrypoint to diagram - creation if you want to access the Railroad tree before it is converted to HTML - :param element: base element of the parser being diagrammed - :param diagram_kwargs: kwargs to pass to the Diagram() constructor - :param vertical: (optional) - int - limit at which number of alternatives should be - shown vertically instead of horizontally - :param show_results_names - bool to indicate whether results name annotations should be - included in the diagram - :param show_groups - bool to indicate whether groups should be highlighted with an unlabeled - surrounding box - """ - # Convert the whole tree underneath the root - lookup = ConverterState(diagram_kwargs=diagram_kwargs or {}) - _to_diagram_element( - element, - lookup=lookup, - parent=None, - vertical=vertical, - show_results_names=show_results_names, - show_groups=show_groups, - ) - - root_id = id(element) - # Convert the root if it hasn't been already - if root_id in lookup: - if not element.customName: - lookup[root_id].name = "" - lookup[root_id].mark_for_extraction(root_id, lookup, force=True) - - # Now that we're finished, we can convert from intermediate structures into Railroad elements - diags = list(lookup.diagrams.values()) - if len(diags) > 1: - # collapse out duplicate diags with the same name - seen = set() - deduped_diags = [] - for d in diags: - # don't extract SkipTo elements, they are uninformative as subdiagrams - if d.name == "...": - continue - if d.name is not None and d.name not in seen: - seen.add(d.name) - deduped_diags.append(d) - resolved = [resolve_partial(partial) for partial in deduped_diags] - else: - # special case - if just one diagram, always display it, even if - # it has no name - resolved = [resolve_partial(partial) for partial in diags] - return sorted(resolved, key=lambda diag: diag.index) - - -def _should_vertical( - specification: int, exprs: Iterable[pyparsing.ParserElement] -) -> bool: - """ - Returns true if we should return a vertical list of elements - """ - if specification is None: - return False - else: - return len(_visible_exprs(exprs)) >= specification - - -class ElementState: - """ - State recorded for an individual pyparsing Element - """ - - # Note: this should be a dataclass, but we have to support Python 3.5 - def __init__( - self, - element: pyparsing.ParserElement, - converted: EditablePartial, - parent: EditablePartial, - number: int, - name: str = None, - parent_index: typing.Optional[int] = None, - ): - #: The pyparsing element that this represents - self.element: pyparsing.ParserElement = element - #: The name of the element - self.name: typing.Optional[str] = name - #: The output Railroad element in an unconverted state - self.converted: EditablePartial = converted - #: The parent Railroad element, which we store so that we can extract this if it's duplicated - self.parent: EditablePartial = parent - #: The order in which we found this element, used for sorting diagrams if this is extracted into a diagram - self.number: int = number - #: The index of this inside its parent - self.parent_index: typing.Optional[int] = parent_index - #: If true, we should extract this out into a subdiagram - self.extract: bool = False - #: If true, all of this element's children have been filled out - self.complete: bool = False - - def mark_for_extraction( - self, el_id: int, state: "ConverterState", name: str = None, force: bool = False - ): - """ - Called when this instance has been seen twice, and thus should eventually be extracted into a sub-diagram - :param el_id: id of the element - :param state: element/diagram state tracker - :param name: name to use for this element's text - :param force: If true, force extraction now, regardless of the state of this. Only useful for extracting the - root element when we know we're finished - """ - self.extract = True - - # Set the name - if not self.name: - if name: - # Allow forcing a custom name - self.name = name - elif self.element.customName: - self.name = self.element.customName - else: - self.name = "" - - # Just because this is marked for extraction doesn't mean we can do it yet. We may have to wait for children - # to be added - # Also, if this is just a string literal etc, don't bother extracting it - if force or (self.complete and _worth_extracting(self.element)): - state.extract_into_diagram(el_id) - - -class ConverterState: - """ - Stores some state that persists between recursions into the element tree - """ - - def __init__(self, diagram_kwargs: typing.Optional[dict] = None): - #: A dictionary mapping ParserElements to state relating to them - self._element_diagram_states: Dict[int, ElementState] = {} - #: A dictionary mapping ParserElement IDs to subdiagrams generated from them - self.diagrams: Dict[int, EditablePartial[NamedDiagram]] = {} - #: The index of the next unnamed element - self.unnamed_index: int = 1 - #: The index of the next element. This is used for sorting - self.index: int = 0 - #: Shared kwargs that are used to customize the construction of diagrams - self.diagram_kwargs: dict = diagram_kwargs or {} - self.extracted_diagram_names: Set[str] = set() - - def __setitem__(self, key: int, value: ElementState): - self._element_diagram_states[key] = value - - def __getitem__(self, key: int) -> ElementState: - return self._element_diagram_states[key] - - def __delitem__(self, key: int): - del self._element_diagram_states[key] - - def __contains__(self, key: int): - return key in self._element_diagram_states - - def generate_unnamed(self) -> int: - """ - Generate a number used in the name of an otherwise unnamed diagram - """ - self.unnamed_index += 1 - return self.unnamed_index - - def generate_index(self) -> int: - """ - Generate a number used to index a diagram - """ - self.index += 1 - return self.index - - def extract_into_diagram(self, el_id: int): - """ - Used when we encounter the same token twice in the same tree. When this - happens, we replace all instances of that token with a terminal, and - create a new subdiagram for the token - """ - position = self[el_id] - - # Replace the original definition of this element with a regular block - if position.parent: - ret = EditablePartial.from_call(railroad.NonTerminal, text=position.name) - if "item" in position.parent.kwargs: - position.parent.kwargs["item"] = ret - elif "items" in position.parent.kwargs: - position.parent.kwargs["items"][position.parent_index] = ret - - # If the element we're extracting is a group, skip to its content but keep the title - if position.converted.func == railroad.Group: - content = position.converted.kwargs["item"] - else: - content = position.converted - - self.diagrams[el_id] = EditablePartial.from_call( - NamedDiagram, - name=position.name, - diagram=EditablePartial.from_call( - railroad.Diagram, content, **self.diagram_kwargs - ), - index=position.number, - ) - - del self[el_id] - - -def _worth_extracting(element: pyparsing.ParserElement) -> bool: - """ - Returns true if this element is worth having its own sub-diagram. Simply, if any of its children - themselves have children, then its complex enough to extract - """ - children = element.recurse() - return any(child.recurse() for child in children) - - -def _apply_diagram_item_enhancements(fn): - """ - decorator to ensure enhancements to a diagram item (such as results name annotations) - get applied on return from _to_diagram_element (we do this since there are several - returns in _to_diagram_element) - """ - - def _inner( - element: pyparsing.ParserElement, - parent: typing.Optional[EditablePartial], - lookup: ConverterState = None, - vertical: int = None, - index: int = 0, - name_hint: str = None, - show_results_names: bool = False, - show_groups: bool = False, - ) -> typing.Optional[EditablePartial]: - ret = fn( - element, - parent, - lookup, - vertical, - index, - name_hint, - show_results_names, - show_groups, - ) - - # apply annotation for results name, if present - if show_results_names and ret is not None: - element_results_name = element.resultsName - if element_results_name: - # add "*" to indicate if this is a "list all results" name - element_results_name += "" if element.modalResults else "*" - ret = EditablePartial.from_call( - railroad.Group, item=ret, label=element_results_name - ) - - return ret - - return _inner - - -def _visible_exprs(exprs: Iterable[pyparsing.ParserElement]): - non_diagramming_exprs = ( - pyparsing.ParseElementEnhance, - pyparsing.PositionToken, - pyparsing.And._ErrorStop, - ) - return [ - e - for e in exprs - if not (e.customName or e.resultsName or isinstance(e, non_diagramming_exprs)) - ] - - -@_apply_diagram_item_enhancements -def _to_diagram_element( - element: pyparsing.ParserElement, - parent: typing.Optional[EditablePartial], - lookup: ConverterState = None, - vertical: int = None, - index: int = 0, - name_hint: str = None, - show_results_names: bool = False, - show_groups: bool = False, -) -> typing.Optional[EditablePartial]: - """ - Recursively converts a PyParsing Element to a railroad Element - :param lookup: The shared converter state that keeps track of useful things - :param index: The index of this element within the parent - :param parent: The parent of this element in the output tree - :param vertical: Controls at what point we make a list of elements vertical. If this is an integer (the default), - it sets the threshold of the number of items before we go vertical. If True, always go vertical, if False, never - do so - :param name_hint: If provided, this will override the generated name - :param show_results_names: bool flag indicating whether to add annotations for results names - :returns: The converted version of the input element, but as a Partial that hasn't yet been constructed - :param show_groups: bool flag indicating whether to show groups using bounding box - """ - exprs = element.recurse() - name = name_hint or element.customName or element.__class__.__name__ - - # Python's id() is used to provide a unique identifier for elements - el_id = id(element) - - element_results_name = element.resultsName - - # Here we basically bypass processing certain wrapper elements if they contribute nothing to the diagram - if not element.customName: - if isinstance( - element, - ( - # pyparsing.TokenConverter, - # pyparsing.Forward, - pyparsing.Located, - ), - ): - # However, if this element has a useful custom name, and its child does not, we can pass it on to the child - if exprs: - if not exprs[0].customName: - propagated_name = name - else: - propagated_name = None - - return _to_diagram_element( - element.expr, - parent=parent, - lookup=lookup, - vertical=vertical, - index=index, - name_hint=propagated_name, - show_results_names=show_results_names, - show_groups=show_groups, - ) - - # If the element isn't worth extracting, we always treat it as the first time we say it - if _worth_extracting(element): - if el_id in lookup: - # If we've seen this element exactly once before, we are only just now finding out that it's a duplicate, - # so we have to extract it into a new diagram. - looked_up = lookup[el_id] - looked_up.mark_for_extraction(el_id, lookup, name=name_hint) - ret = EditablePartial.from_call(railroad.NonTerminal, text=looked_up.name) - return ret - - elif el_id in lookup.diagrams: - # If we have seen the element at least twice before, and have already extracted it into a subdiagram, we - # just put in a marker element that refers to the sub-diagram - ret = EditablePartial.from_call( - railroad.NonTerminal, text=lookup.diagrams[el_id].kwargs["name"] - ) - return ret - - # Recursively convert child elements - # Here we find the most relevant Railroad element for matching pyparsing Element - # We use ``items=[]`` here to hold the place for where the child elements will go once created - if isinstance(element, pyparsing.And): - # detect And's created with ``expr*N`` notation - for these use a OneOrMore with a repeat - # (all will have the same name, and resultsName) - if not exprs: - return None - if len(set((e.name, e.resultsName) for e in exprs)) == 1: - ret = EditablePartial.from_call( - railroad.OneOrMore, item="", repeat=str(len(exprs)) - ) - elif _should_vertical(vertical, exprs): - ret = EditablePartial.from_call(railroad.Stack, items=[]) - else: - ret = EditablePartial.from_call(railroad.Sequence, items=[]) - elif isinstance(element, (pyparsing.Or, pyparsing.MatchFirst)): - if not exprs: - return None - if _should_vertical(vertical, exprs): - ret = EditablePartial.from_call(railroad.Choice, 0, items=[]) - else: - ret = EditablePartial.from_call(railroad.HorizontalChoice, items=[]) - elif isinstance(element, pyparsing.Each): - if not exprs: - return None - ret = EditablePartial.from_call(EachItem, items=[]) - elif isinstance(element, pyparsing.NotAny): - ret = EditablePartial.from_call(AnnotatedItem, label="NOT", item="") - elif isinstance(element, pyparsing.FollowedBy): - ret = EditablePartial.from_call(AnnotatedItem, label="LOOKAHEAD", item="") - elif isinstance(element, pyparsing.PrecededBy): - ret = EditablePartial.from_call(AnnotatedItem, label="LOOKBEHIND", item="") - elif isinstance(element, pyparsing.Group): - if show_groups: - ret = EditablePartial.from_call(AnnotatedItem, label="", item="") - else: - ret = EditablePartial.from_call(railroad.Group, label="", item="") - elif isinstance(element, pyparsing.TokenConverter): - label = type(element).__name__.lower() - if label == "tokenconverter": - ret = EditablePartial.from_call(railroad.Sequence, items=[]) - else: - ret = EditablePartial.from_call(AnnotatedItem, label=label, item="") - elif isinstance(element, pyparsing.Opt): - ret = EditablePartial.from_call(railroad.Optional, item="") - elif isinstance(element, pyparsing.OneOrMore): - ret = EditablePartial.from_call(railroad.OneOrMore, item="") - elif isinstance(element, pyparsing.ZeroOrMore): - ret = EditablePartial.from_call(railroad.ZeroOrMore, item="") - elif isinstance(element, pyparsing.Group): - ret = EditablePartial.from_call( - railroad.Group, item=None, label=element_results_name - ) - elif isinstance(element, pyparsing.Empty) and not element.customName: - # Skip unnamed "Empty" elements - ret = None - elif isinstance(element, pyparsing.ParseElementEnhance): - ret = EditablePartial.from_call(railroad.Sequence, items=[]) - elif len(exprs) > 0 and not element_results_name: - ret = EditablePartial.from_call(railroad.Group, item="", label=name) - elif len(exprs) > 0: - ret = EditablePartial.from_call(railroad.Sequence, items=[]) - else: - terminal = EditablePartial.from_call(railroad.Terminal, element.defaultName) - ret = terminal - - if ret is None: - return - - # Indicate this element's position in the tree so we can extract it if necessary - lookup[el_id] = ElementState( - element=element, - converted=ret, - parent=parent, - parent_index=index, - number=lookup.generate_index(), - ) - if element.customName: - lookup[el_id].mark_for_extraction(el_id, lookup, element.customName) - - i = 0 - for expr in exprs: - # Add a placeholder index in case we have to extract the child before we even add it to the parent - if "items" in ret.kwargs: - ret.kwargs["items"].insert(i, None) - - item = _to_diagram_element( - expr, - parent=ret, - lookup=lookup, - vertical=vertical, - index=i, - show_results_names=show_results_names, - show_groups=show_groups, - ) - - # Some elements don't need to be shown in the diagram - if item is not None: - if "item" in ret.kwargs: - ret.kwargs["item"] = item - elif "items" in ret.kwargs: - # If we've already extracted the child, don't touch this index, since it's occupied by a nonterminal - ret.kwargs["items"][i] = item - i += 1 - elif "items" in ret.kwargs: - # If we're supposed to skip this element, remove it from the parent - del ret.kwargs["items"][i] - - # If all this items children are none, skip this item - if ret and ( - ("items" in ret.kwargs and len(ret.kwargs["items"]) == 0) - or ("item" in ret.kwargs and ret.kwargs["item"] is None) - ): - ret = EditablePartial.from_call(railroad.Terminal, name) - - # Mark this element as "complete", ie it has all of its children - if el_id in lookup: - lookup[el_id].complete = True - - if el_id in lookup and lookup[el_id].extract and lookup[el_id].complete: - lookup.extract_into_diagram(el_id) - if ret is not None: - ret = EditablePartial.from_call( - railroad.NonTerminal, text=lookup.diagrams[el_id].kwargs["name"] - ) - - return ret diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 492ecf30a96aac20e6045566a4231ffe8b0d9b96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26835 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 Zqj#n^WnKHYjFRzjQB&h169pLp{$Dwh`!WCk diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/exceptions.py b/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/exceptions.py deleted file mode 100644 index 12219f1..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/exceptions.py +++ /dev/null @@ -1,299 +0,0 @@ -# exceptions.py - -import re -import sys -import typing - -from .util import ( - col, - line, - lineno, - _collapse_string_to_ranges, - replaced_by_pep8, -) -from .unicode import pyparsing_unicode as ppu - - -class ExceptionWordUnicode(ppu.Latin1, ppu.LatinA, ppu.LatinB, ppu.Greek, ppu.Cyrillic): - pass - - -_extract_alphanums = _collapse_string_to_ranges(ExceptionWordUnicode.alphanums) -_exception_word_extractor = re.compile("([" + _extract_alphanums + "]{1,16})|.") - - -class ParseBaseException(Exception): - """base exception class for all parsing runtime exceptions""" - - loc: int - msg: str - pstr: str - parser_element: typing.Any # "ParserElement" - args: typing.Tuple[str, int, typing.Optional[str]] - - __slots__ = ( - "loc", - "msg", - "pstr", - "parser_element", - "args", - ) - - # Performance tuning: we construct a *lot* of these, so keep this - # constructor as small and fast as possible - def __init__( - self, - pstr: str, - loc: int = 0, - msg: typing.Optional[str] = None, - elem=None, - ): - self.loc = loc - if msg is None: - self.msg = pstr - self.pstr = "" - else: - self.msg = msg - self.pstr = pstr - self.parser_element = elem - self.args = (pstr, loc, msg) - - @staticmethod - def explain_exception(exc, depth=16): - """ - Method to take an exception and translate the Python internal traceback into a list - of the pyparsing expressions that caused the exception to be raised. - - Parameters: - - - exc - exception raised during parsing (need not be a ParseException, in support - of Python exceptions that might be raised in a parse action) - - depth (default=16) - number of levels back in the stack trace to list expression - and function names; if None, the full stack trace names will be listed; if 0, only - the failing input line, marker, and exception string will be shown - - Returns a multi-line string listing the ParserElements and/or function names in the - exception's stack trace. - """ - import inspect - from .core import ParserElement - - if depth is None: - depth = sys.getrecursionlimit() - ret = [] - if isinstance(exc, ParseBaseException): - ret.append(exc.line) - ret.append(" " * (exc.column - 1) + "^") - ret.append(f"{type(exc).__name__}: {exc}") - - if depth > 0: - callers = inspect.getinnerframes(exc.__traceback__, context=depth) - seen = set() - for i, ff in enumerate(callers[-depth:]): - frm = ff[0] - - f_self = frm.f_locals.get("self", None) - if isinstance(f_self, ParserElement): - if not frm.f_code.co_name.startswith( - ("parseImpl", "_parseNoCache") - ): - continue - if id(f_self) in seen: - continue - seen.add(id(f_self)) - - self_type = type(f_self) - ret.append( - f"{self_type.__module__}.{self_type.__name__} - {f_self}" - ) - - elif f_self is not None: - self_type = type(f_self) - ret.append(f"{self_type.__module__}.{self_type.__name__}") - - else: - code = frm.f_code - if code.co_name in ("wrapper", "<module>"): - continue - - ret.append(code.co_name) - - depth -= 1 - if not depth: - break - - return "\n".join(ret) - - @classmethod - def _from_exception(cls, pe): - """ - internal factory method to simplify creating one type of ParseException - from another - avoids having __init__ signature conflicts among subclasses - """ - return cls(pe.pstr, pe.loc, pe.msg, pe.parser_element) - - @property - def line(self) -> str: - """ - Return the line of text where the exception occurred. - """ - return line(self.loc, self.pstr) - - @property - def lineno(self) -> int: - """ - Return the 1-based line number of text where the exception occurred. - """ - return lineno(self.loc, self.pstr) - - @property - def col(self) -> int: - """ - Return the 1-based column on the line of text where the exception occurred. - """ - return col(self.loc, self.pstr) - - @property - def column(self) -> int: - """ - Return the 1-based column on the line of text where the exception occurred. - """ - return col(self.loc, self.pstr) - - # pre-PEP8 compatibility - @property - def parserElement(self): - return self.parser_element - - @parserElement.setter - def parserElement(self, elem): - self.parser_element = elem - - def __str__(self) -> str: - if self.pstr: - if self.loc >= len(self.pstr): - foundstr = ", found end of text" - else: - # pull out next word at error location - found_match = _exception_word_extractor.match(self.pstr, self.loc) - if found_match is not None: - found = found_match.group(0) - else: - found = self.pstr[self.loc : self.loc + 1] - foundstr = (", found %r" % found).replace(r"\\", "\\") - else: - foundstr = "" - return f"{self.msg}{foundstr} (at char {self.loc}), (line:{self.lineno}, col:{self.column})" - - def __repr__(self): - return str(self) - - def mark_input_line( - self, marker_string: typing.Optional[str] = None, *, markerString: str = ">!<" - ) -> str: - """ - Extracts the exception line from the input string, and marks - the location of the exception with a special symbol. - """ - markerString = marker_string if marker_string is not None else markerString - line_str = self.line - line_column = self.column - 1 - if markerString: - line_str = "".join( - (line_str[:line_column], markerString, line_str[line_column:]) - ) - return line_str.strip() - - def explain(self, depth=16) -> str: - """ - Method to translate the Python internal traceback into a list - of the pyparsing expressions that caused the exception to be raised. - - Parameters: - - - depth (default=16) - number of levels back in the stack trace to list expression - and function names; if None, the full stack trace names will be listed; if 0, only - the failing input line, marker, and exception string will be shown - - Returns a multi-line string listing the ParserElements and/or function names in the - exception's stack trace. - - Example:: - - expr = pp.Word(pp.nums) * 3 - try: - expr.parse_string("123 456 A789") - except pp.ParseException as pe: - print(pe.explain(depth=0)) - - prints:: - - 123 456 A789 - ^ - ParseException: Expected W:(0-9), found 'A' (at char 8), (line:1, col:9) - - Note: the diagnostic output will include string representations of the expressions - that failed to parse. These representations will be more helpful if you use `set_name` to - give identifiable names to your expressions. Otherwise they will use the default string - forms, which may be cryptic to read. - - Note: pyparsing's default truncation of exception tracebacks may also truncate the - stack of expressions that are displayed in the ``explain`` output. To get the full listing - of parser expressions, you may have to set ``ParserElement.verbose_stacktrace = True`` - """ - return self.explain_exception(self, depth) - - # fmt: off - @replaced_by_pep8(mark_input_line) - def markInputline(self): ... - # fmt: on - - -class ParseException(ParseBaseException): - """ - Exception thrown when a parse expression doesn't match the input string - - Example:: - - try: - Word(nums).set_name("integer").parse_string("ABC") - except ParseException as pe: - print(pe) - print("column: {}".format(pe.column)) - - prints:: - - Expected integer (at char 0), (line:1, col:1) - column: 1 - - """ - - -class ParseFatalException(ParseBaseException): - """ - User-throwable exception thrown when inconsistent parse content - is found; stops all parsing immediately - """ - - -class ParseSyntaxException(ParseFatalException): - """ - Just like :class:`ParseFatalException`, but thrown internally - when an :class:`ErrorStop<And._ErrorStop>` ('-' operator) indicates - that parsing is to stop immediately because an unbacktrackable - syntax error has been found. - """ - - -class RecursiveGrammarException(Exception): - """ - Exception thrown by :class:`ParserElement.validate` if the - grammar could be left-recursive; parser may need to enable - left recursion using :class:`ParserElement.enable_left_recursion<ParserElement.enable_left_recursion>` - """ - - def __init__(self, parseElementList): - self.parseElementTrace = parseElementList - - def __str__(self) -> str: - return f"RecursiveGrammarException: {self.parseElementTrace}" diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/helpers.py b/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/helpers.py deleted file mode 100644 index 018f0d6..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/helpers.py +++ /dev/null @@ -1,1100 +0,0 @@ -# helpers.py -import html.entities -import re -import sys -import typing - -from . import __diag__ -from .core import * -from .util import ( - _bslash, - _flatten, - _escape_regex_range_chars, - replaced_by_pep8, -) - - -# -# global helpers -# -def counted_array( - expr: ParserElement, - int_expr: typing.Optional[ParserElement] = None, - *, - intExpr: typing.Optional[ParserElement] = None, -) -> ParserElement: - """Helper to define a counted list of expressions. - - This helper defines a pattern of the form:: - - integer expr expr expr... - - where the leading integer tells how many expr expressions follow. - The matched tokens returns the array of expr tokens as a list - the - leading count token is suppressed. - - If ``int_expr`` is specified, it should be a pyparsing expression - that produces an integer value. - - Example:: - - counted_array(Word(alphas)).parse_string('2 ab cd ef') # -> ['ab', 'cd'] - - # in this parser, the leading integer value is given in binary, - # '10' indicating that 2 values are in the array - binary_constant = Word('01').set_parse_action(lambda t: int(t[0], 2)) - counted_array(Word(alphas), int_expr=binary_constant).parse_string('10 ab cd ef') # -> ['ab', 'cd'] - - # if other fields must be parsed after the count but before the - # list items, give the fields results names and they will - # be preserved in the returned ParseResults: - count_with_metadata = integer + Word(alphas)("type") - typed_array = counted_array(Word(alphanums), int_expr=count_with_metadata)("items") - result = typed_array.parse_string("3 bool True True False") - print(result.dump()) - - # prints - # ['True', 'True', 'False'] - # - items: ['True', 'True', 'False'] - # - type: 'bool' - """ - intExpr = intExpr or int_expr - array_expr = Forward() - - def count_field_parse_action(s, l, t): - nonlocal array_expr - n = t[0] - array_expr <<= (expr * n) if n else Empty() - # clear list contents, but keep any named results - del t[:] - - if intExpr is None: - intExpr = Word(nums).set_parse_action(lambda t: int(t[0])) - else: - intExpr = intExpr.copy() - intExpr.set_name("arrayLen") - intExpr.add_parse_action(count_field_parse_action, call_during_try=True) - return (intExpr + array_expr).set_name("(len) " + str(expr) + "...") - - -def match_previous_literal(expr: ParserElement) -> ParserElement: - """Helper to define an expression that is indirectly defined from - the tokens matched in a previous expression, that is, it looks for - a 'repeat' of a previous expression. For example:: - - first = Word(nums) - second = match_previous_literal(first) - match_expr = first + ":" + second - - will match ``"1:1"``, but not ``"1:2"``. Because this - matches a previous literal, will also match the leading - ``"1:1"`` in ``"1:10"``. If this is not desired, use - :class:`match_previous_expr`. Do *not* use with packrat parsing - enabled. - """ - rep = Forward() - - def copy_token_to_repeater(s, l, t): - if t: - if len(t) == 1: - rep << t[0] - else: - # flatten t tokens - tflat = _flatten(t.as_list()) - rep << And(Literal(tt) for tt in tflat) - else: - rep << Empty() - - expr.add_parse_action(copy_token_to_repeater, callDuringTry=True) - rep.set_name("(prev) " + str(expr)) - return rep - - -def match_previous_expr(expr: ParserElement) -> ParserElement: - """Helper to define an expression that is indirectly defined from - the tokens matched in a previous expression, that is, it looks for - a 'repeat' of a previous expression. For example:: - - first = Word(nums) - second = match_previous_expr(first) - match_expr = first + ":" + second - - will match ``"1:1"``, but not ``"1:2"``. Because this - matches by expressions, will *not* match the leading ``"1:1"`` - in ``"1:10"``; the expressions are evaluated first, and then - compared, so ``"1"`` is compared with ``"10"``. Do *not* use - with packrat parsing enabled. - """ - rep = Forward() - e2 = expr.copy() - rep <<= e2 - - def copy_token_to_repeater(s, l, t): - matchTokens = _flatten(t.as_list()) - - def must_match_these_tokens(s, l, t): - theseTokens = _flatten(t.as_list()) - if theseTokens != matchTokens: - raise ParseException( - s, l, f"Expected {matchTokens}, found{theseTokens}" - ) - - rep.set_parse_action(must_match_these_tokens, callDuringTry=True) - - expr.add_parse_action(copy_token_to_repeater, callDuringTry=True) - rep.set_name("(prev) " + str(expr)) - return rep - - -def one_of( - strs: Union[typing.Iterable[str], str], - caseless: bool = False, - use_regex: bool = True, - as_keyword: bool = False, - *, - useRegex: bool = True, - asKeyword: bool = False, -) -> ParserElement: - """Helper to quickly define a set of alternative :class:`Literal` s, - and makes sure to do longest-first testing when there is a conflict, - regardless of the input order, but returns - a :class:`MatchFirst` for best performance. - - Parameters: - - - ``strs`` - a string of space-delimited literals, or a collection of - string literals - - ``caseless`` - treat all literals as caseless - (default= ``False``) - - ``use_regex`` - as an optimization, will - generate a :class:`Regex` object; otherwise, will generate - a :class:`MatchFirst` object (if ``caseless=True`` or ``as_keyword=True``, or if - creating a :class:`Regex` raises an exception) - (default= ``True``) - - ``as_keyword`` - enforce :class:`Keyword`-style matching on the - generated expressions - (default= ``False``) - - ``asKeyword`` and ``useRegex`` are retained for pre-PEP8 compatibility, - but will be removed in a future release - - Example:: - - comp_oper = one_of("< = > <= >= !=") - var = Word(alphas) - number = Word(nums) - term = var | number - comparison_expr = term + comp_oper + term - print(comparison_expr.search_string("B = 12 AA=23 B<=AA AA>12")) - - prints:: - - [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']] - """ - asKeyword = asKeyword or as_keyword - useRegex = useRegex and use_regex - - if ( - isinstance(caseless, str_type) - and __diag__.warn_on_multiple_string_args_to_oneof - ): - warnings.warn( - "More than one string argument passed to one_of, pass" - " choices as a list or space-delimited string", - stacklevel=2, - ) - - if caseless: - isequal = lambda a, b: a.upper() == b.upper() - masks = lambda a, b: b.upper().startswith(a.upper()) - parseElementClass = CaselessKeyword if asKeyword else CaselessLiteral - else: - isequal = lambda a, b: a == b - masks = lambda a, b: b.startswith(a) - parseElementClass = Keyword if asKeyword else Literal - - symbols: List[str] = [] - if isinstance(strs, str_type): - strs = typing.cast(str, strs) - symbols = strs.split() - elif isinstance(strs, Iterable): - symbols = list(strs) - else: - raise TypeError("Invalid argument to one_of, expected string or iterable") - if not symbols: - return NoMatch() - - # reorder given symbols to take care to avoid masking longer choices with shorter ones - # (but only if the given symbols are not just single characters) - if any(len(sym) > 1 for sym in symbols): - i = 0 - while i < len(symbols) - 1: - cur = symbols[i] - for j, other in enumerate(symbols[i + 1 :]): - if isequal(other, cur): - del symbols[i + j + 1] - break - elif masks(cur, other): - del symbols[i + j + 1] - symbols.insert(i, other) - break - else: - i += 1 - - if useRegex: - re_flags: int = re.IGNORECASE if caseless else 0 - - try: - if all(len(sym) == 1 for sym in symbols): - # symbols are just single characters, create range regex pattern - patt = f"[{''.join(_escape_regex_range_chars(sym) for sym in symbols)}]" - else: - patt = "|".join(re.escape(sym) for sym in symbols) - - # wrap with \b word break markers if defining as keywords - if asKeyword: - patt = rf"\b(?:{patt})\b" - - ret = Regex(patt, flags=re_flags).set_name(" | ".join(symbols)) - - if caseless: - # add parse action to return symbols as specified, not in random - # casing as found in input string - symbol_map = {sym.lower(): sym for sym in symbols} - ret.add_parse_action(lambda s, l, t: symbol_map[t[0].lower()]) - - return ret - - except re.error: - warnings.warn( - "Exception creating Regex for one_of, building MatchFirst", stacklevel=2 - ) - - # last resort, just use MatchFirst - return MatchFirst(parseElementClass(sym) for sym in symbols).set_name( - " | ".join(symbols) - ) - - -def dict_of(key: ParserElement, value: ParserElement) -> ParserElement: - """Helper to easily and clearly define a dictionary by specifying - the respective patterns for the key and value. Takes care of - defining the :class:`Dict`, :class:`ZeroOrMore`, and - :class:`Group` tokens in the proper order. The key pattern - can include delimiting markers or punctuation, as long as they are - suppressed, thereby leaving the significant key text. The value - pattern can include named results, so that the :class:`Dict` results - can include named token fields. - - Example:: - - text = "shape: SQUARE posn: upper left color: light blue texture: burlap" - attr_expr = (label + Suppress(':') + OneOrMore(data_word, stop_on=label).set_parse_action(' '.join)) - print(attr_expr[1, ...].parse_string(text).dump()) - - attr_label = label - attr_value = Suppress(':') + OneOrMore(data_word, stop_on=label).set_parse_action(' '.join) - - # similar to Dict, but simpler call format - result = dict_of(attr_label, attr_value).parse_string(text) - print(result.dump()) - print(result['shape']) - print(result.shape) # object attribute access works too - print(result.as_dict()) - - prints:: - - [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] - - color: 'light blue' - - posn: 'upper left' - - shape: 'SQUARE' - - texture: 'burlap' - SQUARE - SQUARE - {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'} - """ - return Dict(OneOrMore(Group(key + value))) - - -def original_text_for( - expr: ParserElement, as_string: bool = True, *, asString: bool = True -) -> ParserElement: - """Helper to return the original, untokenized text for a given - expression. Useful to restore the parsed fields of an HTML start - tag into the raw tag text itself, or to revert separate tokens with - intervening whitespace back to the original matching input text. By - default, returns a string containing the original parsed text. - - If the optional ``as_string`` argument is passed as - ``False``, then the return value is - a :class:`ParseResults` containing any results names that - were originally matched, and a single token containing the original - matched text from the input string. So if the expression passed to - :class:`original_text_for` contains expressions with defined - results names, you must set ``as_string`` to ``False`` if you - want to preserve those results name values. - - The ``asString`` pre-PEP8 argument is retained for compatibility, - but will be removed in a future release. - - Example:: - - src = "this is test <b> bold <i>text</i> </b> normal text " - for tag in ("b", "i"): - opener, closer = make_html_tags(tag) - patt = original_text_for(opener + ... + closer) - print(patt.search_string(src)[0]) - - prints:: - - ['<b> bold <i>text</i> </b>'] - ['<i>text</i>'] - """ - asString = asString and as_string - - locMarker = Empty().set_parse_action(lambda s, loc, t: loc) - endlocMarker = locMarker.copy() - endlocMarker.callPreparse = False - matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end") - if asString: - extractText = lambda s, l, t: s[t._original_start : t._original_end] - else: - - def extractText(s, l, t): - t[:] = [s[t.pop("_original_start") : t.pop("_original_end")]] - - matchExpr.set_parse_action(extractText) - matchExpr.ignoreExprs = expr.ignoreExprs - matchExpr.suppress_warning(Diagnostics.warn_ungrouped_named_tokens_in_collection) - return matchExpr - - -def ungroup(expr: ParserElement) -> ParserElement: - """Helper to undo pyparsing's default grouping of And expressions, - even if all but one are non-empty. - """ - return TokenConverter(expr).add_parse_action(lambda t: t[0]) - - -def locatedExpr(expr: ParserElement) -> ParserElement: - """ - (DEPRECATED - future code should use the :class:`Located` class) - Helper to decorate a returned token with its starting and ending - locations in the input string. - - This helper adds the following results names: - - - ``locn_start`` - location where matched expression begins - - ``locn_end`` - location where matched expression ends - - ``value`` - the actual parsed results - - Be careful if the input text contains ``<TAB>`` characters, you - may want to call :class:`ParserElement.parse_with_tabs` - - Example:: - - wd = Word(alphas) - for match in locatedExpr(wd).search_string("ljsdf123lksdjjf123lkkjj1222"): - print(match) - - prints:: - - [[0, 'ljsdf', 5]] - [[8, 'lksdjjf', 15]] - [[18, 'lkkjj', 23]] - """ - locator = Empty().set_parse_action(lambda ss, ll, tt: ll) - return Group( - locator("locn_start") - + expr("value") - + locator.copy().leaveWhitespace()("locn_end") - ) - - -def nested_expr( - opener: Union[str, ParserElement] = "(", - closer: Union[str, ParserElement] = ")", - content: typing.Optional[ParserElement] = None, - ignore_expr: ParserElement = quoted_string(), - *, - ignoreExpr: ParserElement = quoted_string(), -) -> ParserElement: - """Helper method for defining nested lists enclosed in opening and - closing delimiters (``"("`` and ``")"`` are the default). - - Parameters: - - - ``opener`` - opening character for a nested list - (default= ``"("``); can also be a pyparsing expression - - ``closer`` - closing character for a nested list - (default= ``")"``); can also be a pyparsing expression - - ``content`` - expression for items within the nested lists - (default= ``None``) - - ``ignore_expr`` - expression for ignoring opening and closing delimiters - (default= :class:`quoted_string`) - - ``ignoreExpr`` - this pre-PEP8 argument is retained for compatibility - but will be removed in a future release - - If an expression is not provided for the content argument, the - nested expression will capture all whitespace-delimited content - between delimiters as a list of separate values. - - Use the ``ignore_expr`` argument to define expressions that may - contain opening or closing characters that should not be treated as - opening or closing characters for nesting, such as quoted_string or - a comment expression. Specify multiple expressions using an - :class:`Or` or :class:`MatchFirst`. The default is - :class:`quoted_string`, but if no expressions are to be ignored, then - pass ``None`` for this argument. - - Example:: - - data_type = one_of("void int short long char float double") - decl_data_type = Combine(data_type + Opt(Word('*'))) - ident = Word(alphas+'_', alphanums+'_') - number = pyparsing_common.number - arg = Group(decl_data_type + ident) - LPAR, RPAR = map(Suppress, "()") - - code_body = nested_expr('{', '}', ignore_expr=(quoted_string | c_style_comment)) - - c_function = (decl_data_type("type") - + ident("name") - + LPAR + Opt(DelimitedList(arg), [])("args") + RPAR - + code_body("body")) - c_function.ignore(c_style_comment) - - source_code = ''' - int is_odd(int x) { - return (x%2); - } - - int dec_to_hex(char hchar) { - if (hchar >= '0' && hchar <= '9') { - return (ord(hchar)-ord('0')); - } else { - return (10+ord(hchar)-ord('A')); - } - } - ''' - for func in c_function.search_string(source_code): - print("%(name)s (%(type)s) args: %(args)s" % func) - - - prints:: - - is_odd (int) args: [['int', 'x']] - dec_to_hex (int) args: [['char', 'hchar']] - """ - if ignoreExpr != ignore_expr: - ignoreExpr = ignore_expr if ignoreExpr == quoted_string() else ignoreExpr - if opener == closer: - raise ValueError("opening and closing strings cannot be the same") - if content is None: - if isinstance(opener, str_type) and isinstance(closer, str_type): - opener = typing.cast(str, opener) - closer = typing.cast(str, closer) - if len(opener) == 1 and len(closer) == 1: - if ignoreExpr is not None: - content = Combine( - OneOrMore( - ~ignoreExpr - + CharsNotIn( - opener + closer + ParserElement.DEFAULT_WHITE_CHARS, - exact=1, - ) - ) - ).set_parse_action(lambda t: t[0].strip()) - else: - content = empty.copy() + CharsNotIn( - opener + closer + ParserElement.DEFAULT_WHITE_CHARS - ).set_parse_action(lambda t: t[0].strip()) - else: - if ignoreExpr is not None: - content = Combine( - OneOrMore( - ~ignoreExpr - + ~Literal(opener) - + ~Literal(closer) - + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS, exact=1) - ) - ).set_parse_action(lambda t: t[0].strip()) - else: - content = Combine( - OneOrMore( - ~Literal(opener) - + ~Literal(closer) - + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS, exact=1) - ) - ).set_parse_action(lambda t: t[0].strip()) - else: - raise ValueError( - "opening and closing arguments must be strings if no content expression is given" - ) - ret = Forward() - if ignoreExpr is not None: - ret <<= Group( - Suppress(opener) + ZeroOrMore(ignoreExpr | ret | content) + Suppress(closer) - ) - else: - ret <<= Group(Suppress(opener) + ZeroOrMore(ret | content) + Suppress(closer)) - ret.set_name("nested %s%s expression" % (opener, closer)) - return ret - - -def _makeTags(tagStr, xml, suppress_LT=Suppress("<"), suppress_GT=Suppress(">")): - """Internal helper to construct opening and closing tag expressions, given a tag name""" - if isinstance(tagStr, str_type): - resname = tagStr - tagStr = Keyword(tagStr, caseless=not xml) - else: - resname = tagStr.name - - tagAttrName = Word(alphas, alphanums + "_-:") - if xml: - tagAttrValue = dbl_quoted_string.copy().set_parse_action(remove_quotes) - openTag = ( - suppress_LT - + tagStr("tag") - + Dict(ZeroOrMore(Group(tagAttrName + Suppress("=") + tagAttrValue))) - + Opt("/", default=[False])("empty").set_parse_action( - lambda s, l, t: t[0] == "/" - ) - + suppress_GT - ) - else: - tagAttrValue = quoted_string.copy().set_parse_action(remove_quotes) | Word( - printables, exclude_chars=">" - ) - openTag = ( - suppress_LT - + tagStr("tag") - + Dict( - ZeroOrMore( - Group( - tagAttrName.set_parse_action(lambda t: t[0].lower()) - + Opt(Suppress("=") + tagAttrValue) - ) - ) - ) - + Opt("/", default=[False])("empty").set_parse_action( - lambda s, l, t: t[0] == "/" - ) - + suppress_GT - ) - closeTag = Combine(Literal("</") + tagStr + ">", adjacent=False) - - openTag.set_name("<%s>" % resname) - # add start<tagname> results name in parse action now that ungrouped names are not reported at two levels - openTag.add_parse_action( - lambda t: t.__setitem__( - "start" + "".join(resname.replace(":", " ").title().split()), t.copy() - ) - ) - closeTag = closeTag( - "end" + "".join(resname.replace(":", " ").title().split()) - ).set_name("</%s>" % resname) - openTag.tag = resname - closeTag.tag = resname - openTag.tag_body = SkipTo(closeTag()) - return openTag, closeTag - - -def make_html_tags( - tag_str: Union[str, ParserElement] -) -> Tuple[ParserElement, ParserElement]: - """Helper to construct opening and closing tag expressions for HTML, - given a tag name. Matches tags in either upper or lower case, - attributes with namespaces and with quoted or unquoted values. - - Example:: - - text = '<td>More info at the <a href="https://github.com/pyparsing/pyparsing/wiki">pyparsing</a> wiki page</td>' - # make_html_tags returns pyparsing expressions for the opening and - # closing tags as a 2-tuple - a, a_end = make_html_tags("A") - link_expr = a + SkipTo(a_end)("link_text") + a_end - - for link in link_expr.search_string(text): - # attributes in the <A> tag (like "href" shown here) are - # also accessible as named results - print(link.link_text, '->', link.href) - - prints:: - - pyparsing -> https://github.com/pyparsing/pyparsing/wiki - """ - return _makeTags(tag_str, False) - - -def make_xml_tags( - tag_str: Union[str, ParserElement] -) -> Tuple[ParserElement, ParserElement]: - """Helper to construct opening and closing tag expressions for XML, - given a tag name. Matches tags only in the given upper/lower case. - - Example: similar to :class:`make_html_tags` - """ - return _makeTags(tag_str, True) - - -any_open_tag: ParserElement -any_close_tag: ParserElement -any_open_tag, any_close_tag = make_html_tags( - Word(alphas, alphanums + "_:").set_name("any tag") -) - -_htmlEntityMap = {k.rstrip(";"): v for k, v in html.entities.html5.items()} -common_html_entity = Regex("&(?P<entity>" + "|".join(_htmlEntityMap) + ");").set_name( - "common HTML entity" -) - - -def replace_html_entity(s, l, t): - """Helper parser action to replace common HTML entities with their special characters""" - return _htmlEntityMap.get(t.entity) - - -class OpAssoc(Enum): - """Enumeration of operator associativity - - used in constructing InfixNotationOperatorSpec for :class:`infix_notation`""" - - LEFT = 1 - RIGHT = 2 - - -InfixNotationOperatorArgType = Union[ - ParserElement, str, Tuple[Union[ParserElement, str], Union[ParserElement, str]] -] -InfixNotationOperatorSpec = Union[ - Tuple[ - InfixNotationOperatorArgType, - int, - OpAssoc, - typing.Optional[ParseAction], - ], - Tuple[ - InfixNotationOperatorArgType, - int, - OpAssoc, - ], -] - - -def infix_notation( - base_expr: ParserElement, - op_list: List[InfixNotationOperatorSpec], - lpar: Union[str, ParserElement] = Suppress("("), - rpar: Union[str, ParserElement] = Suppress(")"), -) -> ParserElement: - """Helper method for constructing grammars of expressions made up of - operators working in a precedence hierarchy. Operators may be unary - or binary, left- or right-associative. Parse actions can also be - attached to operator expressions. The generated parser will also - recognize the use of parentheses to override operator precedences - (see example below). - - Note: if you define a deep operator list, you may see performance - issues when using infix_notation. See - :class:`ParserElement.enable_packrat` for a mechanism to potentially - improve your parser performance. - - Parameters: - - - ``base_expr`` - expression representing the most basic operand to - be used in the expression - - ``op_list`` - list of tuples, one for each operator precedence level - in the expression grammar; each tuple is of the form ``(op_expr, - num_operands, right_left_assoc, (optional)parse_action)``, where: - - - ``op_expr`` is the pyparsing expression for the operator; may also - be a string, which will be converted to a Literal; if ``num_operands`` - is 3, ``op_expr`` is a tuple of two expressions, for the two - operators separating the 3 terms - - ``num_operands`` is the number of terms for this operator (must be 1, - 2, or 3) - - ``right_left_assoc`` is the indicator whether the operator is right - or left associative, using the pyparsing-defined constants - ``OpAssoc.RIGHT`` and ``OpAssoc.LEFT``. - - ``parse_action`` is the parse action to be associated with - expressions matching this operator expression (the parse action - tuple member may be omitted); if the parse action is passed - a tuple or list of functions, this is equivalent to calling - ``set_parse_action(*fn)`` - (:class:`ParserElement.set_parse_action`) - - ``lpar`` - expression for matching left-parentheses; if passed as a - str, then will be parsed as ``Suppress(lpar)``. If lpar is passed as - an expression (such as ``Literal('(')``), then it will be kept in - the parsed results, and grouped with them. (default= ``Suppress('(')``) - - ``rpar`` - expression for matching right-parentheses; if passed as a - str, then will be parsed as ``Suppress(rpar)``. If rpar is passed as - an expression (such as ``Literal(')')``), then it will be kept in - the parsed results, and grouped with them. (default= ``Suppress(')')``) - - Example:: - - # simple example of four-function arithmetic with ints and - # variable names - integer = pyparsing_common.signed_integer - varname = pyparsing_common.identifier - - arith_expr = infix_notation(integer | varname, - [ - ('-', 1, OpAssoc.RIGHT), - (one_of('* /'), 2, OpAssoc.LEFT), - (one_of('+ -'), 2, OpAssoc.LEFT), - ]) - - arith_expr.run_tests(''' - 5+3*6 - (5+3)*6 - -2--11 - ''', full_dump=False) - - prints:: - - 5+3*6 - [[5, '+', [3, '*', 6]]] - - (5+3)*6 - [[[5, '+', 3], '*', 6]] - - (5+x)*y - [[[5, '+', 'x'], '*', 'y']] - - -2--11 - [[['-', 2], '-', ['-', 11]]] - """ - - # captive version of FollowedBy that does not do parse actions or capture results names - class _FB(FollowedBy): - def parseImpl(self, instring, loc, doActions=True): - self.expr.try_parse(instring, loc) - return loc, [] - - _FB.__name__ = "FollowedBy>" - - ret = Forward() - if isinstance(lpar, str): - lpar = Suppress(lpar) - if isinstance(rpar, str): - rpar = Suppress(rpar) - - # if lpar and rpar are not suppressed, wrap in group - if not (isinstance(rpar, Suppress) and isinstance(rpar, Suppress)): - lastExpr = base_expr | Group(lpar + ret + rpar) - else: - lastExpr = base_expr | (lpar + ret + rpar) - - arity: int - rightLeftAssoc: opAssoc - pa: typing.Optional[ParseAction] - opExpr1: ParserElement - opExpr2: ParserElement - for i, operDef in enumerate(op_list): - opExpr, arity, rightLeftAssoc, pa = (operDef + (None,))[:4] # type: ignore[assignment] - if isinstance(opExpr, str_type): - opExpr = ParserElement._literalStringClass(opExpr) - opExpr = typing.cast(ParserElement, opExpr) - if arity == 3: - if not isinstance(opExpr, (tuple, list)) or len(opExpr) != 2: - raise ValueError( - "if numterms=3, opExpr must be a tuple or list of two expressions" - ) - opExpr1, opExpr2 = opExpr - term_name = f"{opExpr1}{opExpr2} term" - else: - term_name = f"{opExpr} term" - - if not 1 <= arity <= 3: - raise ValueError("operator must be unary (1), binary (2), or ternary (3)") - - if rightLeftAssoc not in (OpAssoc.LEFT, OpAssoc.RIGHT): - raise ValueError("operator must indicate right or left associativity") - - thisExpr: ParserElement = Forward().set_name(term_name) - thisExpr = typing.cast(Forward, thisExpr) - if rightLeftAssoc is OpAssoc.LEFT: - if arity == 1: - matchExpr = _FB(lastExpr + opExpr) + Group(lastExpr + opExpr[1, ...]) - elif arity == 2: - if opExpr is not None: - matchExpr = _FB(lastExpr + opExpr + lastExpr) + Group( - lastExpr + (opExpr + lastExpr)[1, ...] - ) - else: - matchExpr = _FB(lastExpr + lastExpr) + Group(lastExpr[2, ...]) - elif arity == 3: - matchExpr = _FB( - lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr - ) + Group(lastExpr + OneOrMore(opExpr1 + lastExpr + opExpr2 + lastExpr)) - elif rightLeftAssoc is OpAssoc.RIGHT: - if arity == 1: - # try to avoid LR with this extra test - if not isinstance(opExpr, Opt): - opExpr = Opt(opExpr) - matchExpr = _FB(opExpr.expr + thisExpr) + Group(opExpr + thisExpr) - elif arity == 2: - if opExpr is not None: - matchExpr = _FB(lastExpr + opExpr + thisExpr) + Group( - lastExpr + (opExpr + thisExpr)[1, ...] - ) - else: - matchExpr = _FB(lastExpr + thisExpr) + Group( - lastExpr + thisExpr[1, ...] - ) - elif arity == 3: - matchExpr = _FB( - lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr - ) + Group(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) - if pa: - if isinstance(pa, (tuple, list)): - matchExpr.set_parse_action(*pa) - else: - matchExpr.set_parse_action(pa) - thisExpr <<= (matchExpr | lastExpr).setName(term_name) - lastExpr = thisExpr - ret <<= lastExpr - return ret - - -def indentedBlock(blockStatementExpr, indentStack, indent=True, backup_stacks=[]): - """ - (DEPRECATED - use :class:`IndentedBlock` class instead) - Helper method for defining space-delimited indentation blocks, - such as those used to define block statements in Python source code. - - Parameters: - - - ``blockStatementExpr`` - expression defining syntax of statement that - is repeated within the indented block - - ``indentStack`` - list created by caller to manage indentation stack - (multiple ``statementWithIndentedBlock`` expressions within a single - grammar should share a common ``indentStack``) - - ``indent`` - boolean indicating whether block must be indented beyond - the current level; set to ``False`` for block of left-most statements - (default= ``True``) - - A valid block must contain at least one ``blockStatement``. - - (Note that indentedBlock uses internal parse actions which make it - incompatible with packrat parsing.) - - Example:: - - data = ''' - def A(z): - A1 - B = 100 - G = A2 - A2 - A3 - B - def BB(a,b,c): - BB1 - def BBA(): - bba1 - bba2 - bba3 - C - D - def spam(x,y): - def eggs(z): - pass - ''' - - - indentStack = [1] - stmt = Forward() - - identifier = Word(alphas, alphanums) - funcDecl = ("def" + identifier + Group("(" + Opt(delimitedList(identifier)) + ")") + ":") - func_body = indentedBlock(stmt, indentStack) - funcDef = Group(funcDecl + func_body) - - rvalue = Forward() - funcCall = Group(identifier + "(" + Opt(delimitedList(rvalue)) + ")") - rvalue << (funcCall | identifier | Word(nums)) - assignment = Group(identifier + "=" + rvalue) - stmt << (funcDef | assignment | identifier) - - module_body = stmt[1, ...] - - parseTree = module_body.parseString(data) - parseTree.pprint() - - prints:: - - [['def', - 'A', - ['(', 'z', ')'], - ':', - [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]], - 'B', - ['def', - 'BB', - ['(', 'a', 'b', 'c', ')'], - ':', - [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]], - 'C', - 'D', - ['def', - 'spam', - ['(', 'x', 'y', ')'], - ':', - [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] - """ - backup_stacks.append(indentStack[:]) - - def reset_stack(): - indentStack[:] = backup_stacks[-1] - - def checkPeerIndent(s, l, t): - if l >= len(s): - return - curCol = col(l, s) - if curCol != indentStack[-1]: - if curCol > indentStack[-1]: - raise ParseException(s, l, "illegal nesting") - raise ParseException(s, l, "not a peer entry") - - def checkSubIndent(s, l, t): - curCol = col(l, s) - if curCol > indentStack[-1]: - indentStack.append(curCol) - else: - raise ParseException(s, l, "not a subentry") - - def checkUnindent(s, l, t): - if l >= len(s): - return - curCol = col(l, s) - if not (indentStack and curCol in indentStack): - raise ParseException(s, l, "not an unindent") - if curCol < indentStack[-1]: - indentStack.pop() - - NL = OneOrMore(LineEnd().set_whitespace_chars("\t ").suppress()) - INDENT = (Empty() + Empty().set_parse_action(checkSubIndent)).set_name("INDENT") - PEER = Empty().set_parse_action(checkPeerIndent).set_name("") - UNDENT = Empty().set_parse_action(checkUnindent).set_name("UNINDENT") - if indent: - smExpr = Group( - Opt(NL) - + INDENT - + OneOrMore(PEER + Group(blockStatementExpr) + Opt(NL)) - + UNDENT - ) - else: - smExpr = Group( - Opt(NL) - + OneOrMore(PEER + Group(blockStatementExpr) + Opt(NL)) - + Opt(UNDENT) - ) - - # add a parse action to remove backup_stack from list of backups - smExpr.add_parse_action( - lambda: backup_stacks.pop(-1) and None if backup_stacks else None - ) - smExpr.set_fail_action(lambda a, b, c, d: reset_stack()) - blockStatementExpr.ignore(_bslash + LineEnd()) - return smExpr.set_name("indented block") - - -# it's easy to get these comment structures wrong - they're very common, so may as well make them available -c_style_comment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + "*/").set_name( - "C style comment" -) -"Comment of the form ``/* ... */``" - -html_comment = Regex(r"<!--[\s\S]*?-->").set_name("HTML comment") -"Comment of the form ``<!-- ... -->``" - -rest_of_line = Regex(r".*").leave_whitespace().set_name("rest of line") -dbl_slash_comment = Regex(r"//(?:\\\n|[^\n])*").set_name("// comment") -"Comment of the form ``// ... (to end of line)``" - -cpp_style_comment = Combine( - Regex(r"/\*(?:[^*]|\*(?!/))*") + "*/" | dbl_slash_comment -).set_name("C++ style comment") -"Comment of either form :class:`c_style_comment` or :class:`dbl_slash_comment`" - -java_style_comment = cpp_style_comment -"Same as :class:`cpp_style_comment`" - -python_style_comment = Regex(r"#.*").set_name("Python style comment") -"Comment of the form ``# ... (to end of line)``" - - -# build list of built-in expressions, for future reference if a global default value -# gets updated -_builtin_exprs: List[ParserElement] = [ - v for v in vars().values() if isinstance(v, ParserElement) -] - - -# compatibility function, superseded by DelimitedList class -def delimited_list( - expr: Union[str, ParserElement], - delim: Union[str, ParserElement] = ",", - combine: bool = False, - min: typing.Optional[int] = None, - max: typing.Optional[int] = None, - *, - allow_trailing_delim: bool = False, -) -> ParserElement: - """(DEPRECATED - use :class:`DelimitedList` class)""" - return DelimitedList( - expr, delim, combine, min, max, allow_trailing_delim=allow_trailing_delim - ) - - -# pre-PEP8 compatible names -# fmt: off -opAssoc = OpAssoc -anyOpenTag = any_open_tag -anyCloseTag = any_close_tag -commonHTMLEntity = common_html_entity -cStyleComment = c_style_comment -htmlComment = html_comment -restOfLine = rest_of_line -dblSlashComment = dbl_slash_comment -cppStyleComment = cpp_style_comment -javaStyleComment = java_style_comment -pythonStyleComment = python_style_comment - -@replaced_by_pep8(DelimitedList) -def delimitedList(): ... - -@replaced_by_pep8(DelimitedList) -def delimited_list(): ... - -@replaced_by_pep8(counted_array) -def countedArray(): ... - -@replaced_by_pep8(match_previous_literal) -def matchPreviousLiteral(): ... - -@replaced_by_pep8(match_previous_expr) -def matchPreviousExpr(): ... - -@replaced_by_pep8(one_of) -def oneOf(): ... - -@replaced_by_pep8(dict_of) -def dictOf(): ... - -@replaced_by_pep8(original_text_for) -def originalTextFor(): ... - -@replaced_by_pep8(nested_expr) -def nestedExpr(): ... - -@replaced_by_pep8(make_html_tags) -def makeHTMLTags(): ... - -@replaced_by_pep8(make_xml_tags) -def makeXMLTags(): ... - -@replaced_by_pep8(replace_html_entity) -def replaceHTMLEntity(): ... - -@replaced_by_pep8(infix_notation) -def infixNotation(): ... -# fmt: on diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/results.py b/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/results.py deleted file mode 100644 index 0313049..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/results.py +++ /dev/null @@ -1,796 +0,0 @@ -# results.py -from collections.abc import ( - MutableMapping, - Mapping, - MutableSequence, - Iterator, - Sequence, - Container, -) -import pprint -from typing import Tuple, Any, Dict, Set, List - -str_type: Tuple[type, ...] = (str, bytes) -_generator_type = type((_ for _ in ())) - - -class _ParseResultsWithOffset: - tup: Tuple["ParseResults", int] - __slots__ = ["tup"] - - def __init__(self, p1: "ParseResults", p2: int): - self.tup: Tuple[ParseResults, int] = (p1, p2) - - def __getitem__(self, i): - return self.tup[i] - - def __getstate__(self): - return self.tup - - def __setstate__(self, *args): - self.tup = args[0] - - -class ParseResults: - """Structured parse results, to provide multiple means of access to - the parsed data: - - - as a list (``len(results)``) - - by list index (``results[0], results[1]``, etc.) - - by attribute (``results.<results_name>`` - see :class:`ParserElement.set_results_name`) - - Example:: - - integer = Word(nums) - date_str = (integer.set_results_name("year") + '/' - + integer.set_results_name("month") + '/' - + integer.set_results_name("day")) - # equivalent form: - # date_str = (integer("year") + '/' - # + integer("month") + '/' - # + integer("day")) - - # parse_string returns a ParseResults object - result = date_str.parse_string("1999/12/31") - - def test(s, fn=repr): - print(f"{s} -> {fn(eval(s))}") - test("list(result)") - test("result[0]") - test("result['month']") - test("result.day") - test("'month' in result") - test("'minutes' in result") - test("result.dump()", str) - - prints:: - - list(result) -> ['1999', '/', '12', '/', '31'] - result[0] -> '1999' - result['month'] -> '12' - result.day -> '31' - 'month' in result -> True - 'minutes' in result -> False - result.dump() -> ['1999', '/', '12', '/', '31'] - - day: '31' - - month: '12' - - year: '1999' - """ - - _null_values: Tuple[Any, ...] = (None, [], ()) - - _name: str - _parent: "ParseResults" - _all_names: Set[str] - _modal: bool - _toklist: List[Any] - _tokdict: Dict[str, Any] - - __slots__ = ( - "_name", - "_parent", - "_all_names", - "_modal", - "_toklist", - "_tokdict", - ) - - class List(list): - """ - Simple wrapper class to distinguish parsed list results that should be preserved - as actual Python lists, instead of being converted to :class:`ParseResults`:: - - LBRACK, RBRACK = map(pp.Suppress, "[]") - element = pp.Forward() - item = ppc.integer - element_list = LBRACK + pp.DelimitedList(element) + RBRACK - - # add parse actions to convert from ParseResults to actual Python collection types - def as_python_list(t): - return pp.ParseResults.List(t.as_list()) - element_list.add_parse_action(as_python_list) - - element <<= item | element_list - - element.run_tests(''' - 100 - [2,3,4] - [[2, 1],3,4] - [(2, 1),3,4] - (2,3,4) - ''', post_parse=lambda s, r: (r[0], type(r[0]))) - - prints:: - - 100 - (100, <class 'int'>) - - [2,3,4] - ([2, 3, 4], <class 'list'>) - - [[2, 1],3,4] - ([[2, 1], 3, 4], <class 'list'>) - - (Used internally by :class:`Group` when `aslist=True`.) - """ - - def __new__(cls, contained=None): - if contained is None: - contained = [] - - if not isinstance(contained, list): - raise TypeError( - f"{cls.__name__} may only be constructed with a list, not {type(contained).__name__}" - ) - - return list.__new__(cls) - - def __new__(cls, toklist=None, name=None, **kwargs): - if isinstance(toklist, ParseResults): - return toklist - self = object.__new__(cls) - self._name = None - self._parent = None - self._all_names = set() - - if toklist is None: - self._toklist = [] - elif isinstance(toklist, (list, _generator_type)): - self._toklist = ( - [toklist[:]] - if isinstance(toklist, ParseResults.List) - else list(toklist) - ) - else: - self._toklist = [toklist] - self._tokdict = dict() - return self - - # Performance tuning: we construct a *lot* of these, so keep this - # constructor as small and fast as possible - def __init__( - self, toklist=None, name=None, asList=True, modal=True, isinstance=isinstance - ): - self._tokdict: Dict[str, _ParseResultsWithOffset] - self._modal = modal - if name is not None and name != "": - if isinstance(name, int): - name = str(name) - if not modal: - self._all_names = {name} - self._name = name - if toklist not in self._null_values: - if isinstance(toklist, (str_type, type)): - toklist = [toklist] - if asList: - if isinstance(toklist, ParseResults): - self[name] = _ParseResultsWithOffset( - ParseResults(toklist._toklist), 0 - ) - else: - self[name] = _ParseResultsWithOffset( - ParseResults(toklist[0]), 0 - ) - self[name]._name = name - else: - try: - self[name] = toklist[0] - except (KeyError, TypeError, IndexError): - if toklist is not self: - self[name] = toklist - else: - self._name = name - - def __getitem__(self, i): - if isinstance(i, (int, slice)): - return self._toklist[i] - else: - if i not in self._all_names: - return self._tokdict[i][-1][0] - else: - return ParseResults([v[0] for v in self._tokdict[i]]) - - def __setitem__(self, k, v, isinstance=isinstance): - if isinstance(v, _ParseResultsWithOffset): - self._tokdict[k] = self._tokdict.get(k, list()) + [v] - sub = v[0] - elif isinstance(k, (int, slice)): - self._toklist[k] = v - sub = v - else: - self._tokdict[k] = self._tokdict.get(k, list()) + [ - _ParseResultsWithOffset(v, 0) - ] - sub = v - if isinstance(sub, ParseResults): - sub._parent = self - - def __delitem__(self, i): - if isinstance(i, (int, slice)): - mylen = len(self._toklist) - del self._toklist[i] - - # convert int to slice - if isinstance(i, int): - if i < 0: - i += mylen - i = slice(i, i + 1) - # get removed indices - removed = list(range(*i.indices(mylen))) - removed.reverse() - # fixup indices in token dictionary - for name, occurrences in self._tokdict.items(): - for j in removed: - for k, (value, position) in enumerate(occurrences): - occurrences[k] = _ParseResultsWithOffset( - value, position - (position > j) - ) - else: - del self._tokdict[i] - - def __contains__(self, k) -> bool: - return k in self._tokdict - - def __len__(self) -> int: - return len(self._toklist) - - def __bool__(self) -> bool: - return not not (self._toklist or self._tokdict) - - def __iter__(self) -> Iterator: - return iter(self._toklist) - - def __reversed__(self) -> Iterator: - return iter(self._toklist[::-1]) - - def keys(self): - return iter(self._tokdict) - - def values(self): - return (self[k] for k in self.keys()) - - def items(self): - return ((k, self[k]) for k in self.keys()) - - def haskeys(self) -> bool: - """ - Since ``keys()`` returns an iterator, this method is helpful in bypassing - code that looks for the existence of any defined results names.""" - return not not self._tokdict - - def pop(self, *args, **kwargs): - """ - Removes and returns item at specified index (default= ``last``). - Supports both ``list`` and ``dict`` semantics for ``pop()``. If - passed no argument or an integer argument, it will use ``list`` - semantics and pop tokens from the list of parsed tokens. If passed - a non-integer argument (most likely a string), it will use ``dict`` - semantics and pop the corresponding value from any defined results - names. A second default return value argument is supported, just as in - ``dict.pop()``. - - Example:: - - numlist = Word(nums)[...] - print(numlist.parse_string("0 123 321")) # -> ['0', '123', '321'] - - def remove_first(tokens): - tokens.pop(0) - numlist.add_parse_action(remove_first) - print(numlist.parse_string("0 123 321")) # -> ['123', '321'] - - label = Word(alphas) - patt = label("LABEL") + Word(nums)[1, ...] - print(patt.parse_string("AAB 123 321").dump()) - - # Use pop() in a parse action to remove named result (note that corresponding value is not - # removed from list form of results) - def remove_LABEL(tokens): - tokens.pop("LABEL") - return tokens - patt.add_parse_action(remove_LABEL) - print(patt.parse_string("AAB 123 321").dump()) - - prints:: - - ['AAB', '123', '321'] - - LABEL: 'AAB' - - ['AAB', '123', '321'] - """ - if not args: - args = [-1] - for k, v in kwargs.items(): - if k == "default": - args = (args[0], v) - else: - raise TypeError(f"pop() got an unexpected keyword argument {k!r}") - if isinstance(args[0], int) or len(args) == 1 or args[0] in self: - index = args[0] - ret = self[index] - del self[index] - return ret - else: - defaultvalue = args[1] - return defaultvalue - - def get(self, key, default_value=None): - """ - Returns named result matching the given key, or if there is no - such name, then returns the given ``default_value`` or ``None`` if no - ``default_value`` is specified. - - Similar to ``dict.get()``. - - Example:: - - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - result = date_str.parse_string("1999/12/31") - print(result.get("year")) # -> '1999' - print(result.get("hour", "not specified")) # -> 'not specified' - print(result.get("hour")) # -> None - """ - if key in self: - return self[key] - else: - return default_value - - def insert(self, index, ins_string): - """ - Inserts new element at location index in the list of parsed tokens. - - Similar to ``list.insert()``. - - Example:: - - numlist = Word(nums)[...] - print(numlist.parse_string("0 123 321")) # -> ['0', '123', '321'] - - # use a parse action to insert the parse location in the front of the parsed results - def insert_locn(locn, tokens): - tokens.insert(0, locn) - numlist.add_parse_action(insert_locn) - print(numlist.parse_string("0 123 321")) # -> [0, '0', '123', '321'] - """ - self._toklist.insert(index, ins_string) - # fixup indices in token dictionary - for name, occurrences in self._tokdict.items(): - for k, (value, position) in enumerate(occurrences): - occurrences[k] = _ParseResultsWithOffset( - value, position + (position > index) - ) - - def append(self, item): - """ - Add single element to end of ``ParseResults`` list of elements. - - Example:: - - numlist = Word(nums)[...] - print(numlist.parse_string("0 123 321")) # -> ['0', '123', '321'] - - # use a parse action to compute the sum of the parsed integers, and add it to the end - def append_sum(tokens): - tokens.append(sum(map(int, tokens))) - numlist.add_parse_action(append_sum) - print(numlist.parse_string("0 123 321")) # -> ['0', '123', '321', 444] - """ - self._toklist.append(item) - - def extend(self, itemseq): - """ - Add sequence of elements to end of ``ParseResults`` list of elements. - - Example:: - - patt = Word(alphas)[1, ...] - - # use a parse action to append the reverse of the matched strings, to make a palindrome - def make_palindrome(tokens): - tokens.extend(reversed([t[::-1] for t in tokens])) - return ''.join(tokens) - patt.add_parse_action(make_palindrome) - print(patt.parse_string("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl' - """ - if isinstance(itemseq, ParseResults): - self.__iadd__(itemseq) - else: - self._toklist.extend(itemseq) - - def clear(self): - """ - Clear all elements and results names. - """ - del self._toklist[:] - self._tokdict.clear() - - def __getattr__(self, name): - try: - return self[name] - except KeyError: - if name.startswith("__"): - raise AttributeError(name) - return "" - - def __add__(self, other: "ParseResults") -> "ParseResults": - ret = self.copy() - ret += other - return ret - - def __iadd__(self, other: "ParseResults") -> "ParseResults": - if not other: - return self - - if other._tokdict: - offset = len(self._toklist) - addoffset = lambda a: offset if a < 0 else a + offset - otheritems = other._tokdict.items() - otherdictitems = [ - (k, _ParseResultsWithOffset(v[0], addoffset(v[1]))) - for k, vlist in otheritems - for v in vlist - ] - for k, v in otherdictitems: - self[k] = v - if isinstance(v[0], ParseResults): - v[0]._parent = self - - self._toklist += other._toklist - self._all_names |= other._all_names - return self - - def __radd__(self, other) -> "ParseResults": - if isinstance(other, int) and other == 0: - # useful for merging many ParseResults using sum() builtin - return self.copy() - else: - # this may raise a TypeError - so be it - return other + self - - def __repr__(self) -> str: - return f"{type(self).__name__}({self._toklist!r}, {self.as_dict()})" - - def __str__(self) -> str: - return ( - "[" - + ", ".join( - [ - str(i) if isinstance(i, ParseResults) else repr(i) - for i in self._toklist - ] - ) - + "]" - ) - - def _asStringList(self, sep=""): - out = [] - for item in self._toklist: - if out and sep: - out.append(sep) - if isinstance(item, ParseResults): - out += item._asStringList() - else: - out.append(str(item)) - return out - - def as_list(self) -> list: - """ - Returns the parse results as a nested list of matching tokens, all converted to strings. - - Example:: - - patt = Word(alphas)[1, ...] - result = patt.parse_string("sldkj lsdkj sldkj") - # even though the result prints in string-like form, it is actually a pyparsing ParseResults - print(type(result), result) # -> <class 'pyparsing.ParseResults'> ['sldkj', 'lsdkj', 'sldkj'] - - # Use as_list() to create an actual list - result_list = result.as_list() - print(type(result_list), result_list) # -> <class 'list'> ['sldkj', 'lsdkj', 'sldkj'] - """ - return [ - res.as_list() if isinstance(res, ParseResults) else res - for res in self._toklist - ] - - def as_dict(self) -> dict: - """ - Returns the named parse results as a nested dictionary. - - Example:: - - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - result = date_str.parse_string('12/31/1999') - print(type(result), repr(result)) # -> <class 'pyparsing.ParseResults'> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]}) - - result_dict = result.as_dict() - print(type(result_dict), repr(result_dict)) # -> <class 'dict'> {'day': '1999', 'year': '12', 'month': '31'} - - # even though a ParseResults supports dict-like access, sometime you just need to have a dict - import json - print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable - print(json.dumps(result.as_dict())) # -> {"month": "31", "day": "1999", "year": "12"} - """ - - def to_item(obj): - if isinstance(obj, ParseResults): - return obj.as_dict() if obj.haskeys() else [to_item(v) for v in obj] - else: - return obj - - return dict((k, to_item(v)) for k, v in self.items()) - - def copy(self) -> "ParseResults": - """ - Returns a new shallow copy of a :class:`ParseResults` object. `ParseResults` - items contained within the source are shared with the copy. Use - :class:`ParseResults.deepcopy()` to create a copy with its own separate - content values. - """ - ret = ParseResults(self._toklist) - ret._tokdict = self._tokdict.copy() - ret._parent = self._parent - ret._all_names |= self._all_names - ret._name = self._name - return ret - - def deepcopy(self) -> "ParseResults": - """ - Returns a new deep copy of a :class:`ParseResults` object. - """ - ret = self.copy() - # replace values with copies if they are of known mutable types - for i, obj in enumerate(self._toklist): - if isinstance(obj, ParseResults): - self._toklist[i] = obj.deepcopy() - elif isinstance(obj, (str, bytes)): - pass - elif isinstance(obj, MutableMapping): - self._toklist[i] = dest = type(obj)() - for k, v in obj.items(): - dest[k] = v.deepcopy() if isinstance(v, ParseResults) else v - elif isinstance(obj, Container): - self._toklist[i] = type(obj)( - v.deepcopy() if isinstance(v, ParseResults) else v for v in obj - ) - return ret - - def get_name(self): - r""" - Returns the results name for this token expression. Useful when several - different expressions might match at a particular location. - - Example:: - - integer = Word(nums) - ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d") - house_number_expr = Suppress('#') + Word(nums, alphanums) - user_data = (Group(house_number_expr)("house_number") - | Group(ssn_expr)("ssn") - | Group(integer)("age")) - user_info = user_data[1, ...] - - result = user_info.parse_string("22 111-22-3333 #221B") - for item in result: - print(item.get_name(), ':', item[0]) - - prints:: - - age : 22 - ssn : 111-22-3333 - house_number : 221B - """ - if self._name: - return self._name - elif self._parent: - par: "ParseResults" = self._parent - parent_tokdict_items = par._tokdict.items() - return next( - ( - k - for k, vlist in parent_tokdict_items - for v, loc in vlist - if v is self - ), - None, - ) - elif ( - len(self) == 1 - and len(self._tokdict) == 1 - and next(iter(self._tokdict.values()))[0][1] in (0, -1) - ): - return next(iter(self._tokdict.keys())) - else: - return None - - def dump(self, indent="", full=True, include_list=True, _depth=0) -> str: - """ - Diagnostic method for listing out the contents of - a :class:`ParseResults`. Accepts an optional ``indent`` argument so - that this string can be embedded in a nested display of other data. - - Example:: - - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - result = date_str.parse_string('1999/12/31') - print(result.dump()) - - prints:: - - ['1999', '/', '12', '/', '31'] - - day: '31' - - month: '12' - - year: '1999' - """ - out = [] - NL = "\n" - out.append(indent + str(self.as_list()) if include_list else "") - - if full: - if self.haskeys(): - items = sorted((str(k), v) for k, v in self.items()) - for k, v in items: - if out: - out.append(NL) - out.append(f"{indent}{(' ' * _depth)}- {k}: ") - if isinstance(v, ParseResults): - if v: - out.append( - v.dump( - indent=indent, - full=full, - include_list=include_list, - _depth=_depth + 1, - ) - ) - else: - out.append(str(v)) - else: - out.append(repr(v)) - if any(isinstance(vv, ParseResults) for vv in self): - v = self - for i, vv in enumerate(v): - if isinstance(vv, ParseResults): - out.append( - "\n{}{}[{}]:\n{}{}{}".format( - indent, - (" " * (_depth)), - i, - indent, - (" " * (_depth + 1)), - vv.dump( - indent=indent, - full=full, - include_list=include_list, - _depth=_depth + 1, - ), - ) - ) - else: - out.append( - "\n%s%s[%d]:\n%s%s%s" - % ( - indent, - (" " * (_depth)), - i, - indent, - (" " * (_depth + 1)), - str(vv), - ) - ) - - return "".join(out) - - def pprint(self, *args, **kwargs): - """ - Pretty-printer for parsed results as a list, using the - `pprint <https://docs.python.org/3/library/pprint.html>`_ module. - Accepts additional positional or keyword args as defined for - `pprint.pprint <https://docs.python.org/3/library/pprint.html#pprint.pprint>`_ . - - Example:: - - ident = Word(alphas, alphanums) - num = Word(nums) - func = Forward() - term = ident | num | Group('(' + func + ')') - func <<= ident + Group(Optional(DelimitedList(term))) - result = func.parse_string("fna a,b,(fnb c,d,200),100") - result.pprint(width=40) - - prints:: - - ['fna', - ['a', - 'b', - ['(', 'fnb', ['c', 'd', '200'], ')'], - '100']] - """ - pprint.pprint(self.as_list(), *args, **kwargs) - - # add support for pickle protocol - def __getstate__(self): - return ( - self._toklist, - ( - self._tokdict.copy(), - None, - self._all_names, - self._name, - ), - ) - - def __setstate__(self, state): - self._toklist, (self._tokdict, par, inAccumNames, self._name) = state - self._all_names = set(inAccumNames) - self._parent = None - - def __getnewargs__(self): - return self._toklist, self._name - - def __dir__(self): - return dir(type(self)) + list(self.keys()) - - @classmethod - def from_dict(cls, other, name=None) -> "ParseResults": - """ - Helper classmethod to construct a ``ParseResults`` from a ``dict``, preserving the - name-value relations as results names. If an optional ``name`` argument is - given, a nested ``ParseResults`` will be returned. - """ - - def is_iterable(obj): - try: - iter(obj) - except Exception: - return False - # str's are iterable, but in pyparsing, we don't want to iterate over them - else: - return not isinstance(obj, str_type) - - ret = cls([]) - for k, v in other.items(): - if isinstance(v, Mapping): - ret += cls.from_dict(v, name=k) - else: - ret += cls([v], name=k, asList=is_iterable(v)) - if name is not None: - ret = cls([ret], name=name) - return ret - - asList = as_list - """Deprecated - use :class:`as_list`""" - asDict = as_dict - """Deprecated - use :class:`as_dict`""" - getName = get_name - """Deprecated - use :class:`get_name`""" - - -MutableMapping.register(ParseResults) -MutableSequence.register(ParseResults) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/testing.py b/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/testing.py deleted file mode 100644 index 6a254c1..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/testing.py +++ /dev/null @@ -1,331 +0,0 @@ -# testing.py - -from contextlib import contextmanager -import typing - -from .core import ( - ParserElement, - ParseException, - Keyword, - __diag__, - __compat__, -) - - -class pyparsing_test: - """ - namespace class for classes useful in writing unit tests - """ - - class reset_pyparsing_context: - """ - Context manager to be used when writing unit tests that modify pyparsing config values: - - packrat parsing - - bounded recursion parsing - - default whitespace characters. - - default keyword characters - - literal string auto-conversion class - - __diag__ settings - - Example:: - - with reset_pyparsing_context(): - # test that literals used to construct a grammar are automatically suppressed - ParserElement.inlineLiteralsUsing(Suppress) - - term = Word(alphas) | Word(nums) - group = Group('(' + term[...] + ')') - - # assert that the '()' characters are not included in the parsed tokens - self.assertParseAndCheckList(group, "(abc 123 def)", ['abc', '123', 'def']) - - # after exiting context manager, literals are converted to Literal expressions again - """ - - def __init__(self): - self._save_context = {} - - def save(self): - self._save_context["default_whitespace"] = ParserElement.DEFAULT_WHITE_CHARS - self._save_context["default_keyword_chars"] = Keyword.DEFAULT_KEYWORD_CHARS - - self._save_context[ - "literal_string_class" - ] = ParserElement._literalStringClass - - self._save_context["verbose_stacktrace"] = ParserElement.verbose_stacktrace - - self._save_context["packrat_enabled"] = ParserElement._packratEnabled - if ParserElement._packratEnabled: - self._save_context[ - "packrat_cache_size" - ] = ParserElement.packrat_cache.size - else: - self._save_context["packrat_cache_size"] = None - self._save_context["packrat_parse"] = ParserElement._parse - self._save_context[ - "recursion_enabled" - ] = ParserElement._left_recursion_enabled - - self._save_context["__diag__"] = { - name: getattr(__diag__, name) for name in __diag__._all_names - } - - self._save_context["__compat__"] = { - "collect_all_And_tokens": __compat__.collect_all_And_tokens - } - - return self - - def restore(self): - # reset pyparsing global state - if ( - ParserElement.DEFAULT_WHITE_CHARS - != self._save_context["default_whitespace"] - ): - ParserElement.set_default_whitespace_chars( - self._save_context["default_whitespace"] - ) - - ParserElement.verbose_stacktrace = self._save_context["verbose_stacktrace"] - - Keyword.DEFAULT_KEYWORD_CHARS = self._save_context["default_keyword_chars"] - ParserElement.inlineLiteralsUsing( - self._save_context["literal_string_class"] - ) - - for name, value in self._save_context["__diag__"].items(): - (__diag__.enable if value else __diag__.disable)(name) - - ParserElement._packratEnabled = False - if self._save_context["packrat_enabled"]: - ParserElement.enable_packrat(self._save_context["packrat_cache_size"]) - else: - ParserElement._parse = self._save_context["packrat_parse"] - ParserElement._left_recursion_enabled = self._save_context[ - "recursion_enabled" - ] - - __compat__.collect_all_And_tokens = self._save_context["__compat__"] - - return self - - def copy(self): - ret = type(self)() - ret._save_context.update(self._save_context) - return ret - - def __enter__(self): - return self.save() - - def __exit__(self, *args): - self.restore() - - class TestParseResultsAsserts: - """ - A mixin class to add parse results assertion methods to normal unittest.TestCase classes. - """ - - def assertParseResultsEquals( - self, result, expected_list=None, expected_dict=None, msg=None - ): - """ - Unit test assertion to compare a :class:`ParseResults` object with an optional ``expected_list``, - and compare any defined results names with an optional ``expected_dict``. - """ - if expected_list is not None: - self.assertEqual(expected_list, result.as_list(), msg=msg) - if expected_dict is not None: - self.assertEqual(expected_dict, result.as_dict(), msg=msg) - - def assertParseAndCheckList( - self, expr, test_string, expected_list, msg=None, verbose=True - ): - """ - Convenience wrapper assert to test a parser element and input string, and assert that - the resulting ``ParseResults.asList()`` is equal to the ``expected_list``. - """ - result = expr.parse_string(test_string, parse_all=True) - if verbose: - print(result.dump()) - else: - print(result.as_list()) - self.assertParseResultsEquals(result, expected_list=expected_list, msg=msg) - - def assertParseAndCheckDict( - self, expr, test_string, expected_dict, msg=None, verbose=True - ): - """ - Convenience wrapper assert to test a parser element and input string, and assert that - the resulting ``ParseResults.asDict()`` is equal to the ``expected_dict``. - """ - result = expr.parse_string(test_string, parseAll=True) - if verbose: - print(result.dump()) - else: - print(result.as_list()) - self.assertParseResultsEquals(result, expected_dict=expected_dict, msg=msg) - - def assertRunTestResults( - self, run_tests_report, expected_parse_results=None, msg=None - ): - """ - Unit test assertion to evaluate output of ``ParserElement.runTests()``. If a list of - list-dict tuples is given as the ``expected_parse_results`` argument, then these are zipped - with the report tuples returned by ``runTests`` and evaluated using ``assertParseResultsEquals``. - Finally, asserts that the overall ``runTests()`` success value is ``True``. - - :param run_tests_report: tuple(bool, [tuple(str, ParseResults or Exception)]) returned from runTests - :param expected_parse_results (optional): [tuple(str, list, dict, Exception)] - """ - run_test_success, run_test_results = run_tests_report - - if expected_parse_results is not None: - merged = [ - (*rpt, expected) - for rpt, expected in zip(run_test_results, expected_parse_results) - ] - for test_string, result, expected in merged: - # expected should be a tuple containing a list and/or a dict or an exception, - # and optional failure message string - # an empty tuple will skip any result validation - fail_msg = next( - (exp for exp in expected if isinstance(exp, str)), None - ) - expected_exception = next( - ( - exp - for exp in expected - if isinstance(exp, type) and issubclass(exp, Exception) - ), - None, - ) - if expected_exception is not None: - with self.assertRaises( - expected_exception=expected_exception, msg=fail_msg or msg - ): - if isinstance(result, Exception): - raise result - else: - expected_list = next( - (exp for exp in expected if isinstance(exp, list)), None - ) - expected_dict = next( - (exp for exp in expected if isinstance(exp, dict)), None - ) - if (expected_list, expected_dict) != (None, None): - self.assertParseResultsEquals( - result, - expected_list=expected_list, - expected_dict=expected_dict, - msg=fail_msg or msg, - ) - else: - # warning here maybe? - print(f"no validation for {test_string!r}") - - # do this last, in case some specific test results can be reported instead - self.assertTrue( - run_test_success, msg=msg if msg is not None else "failed runTests" - ) - - @contextmanager - def assertRaisesParseException(self, exc_type=ParseException, msg=None): - with self.assertRaises(exc_type, msg=msg): - yield - - @staticmethod - def with_line_numbers( - s: str, - start_line: typing.Optional[int] = None, - end_line: typing.Optional[int] = None, - expand_tabs: bool = True, - eol_mark: str = "|", - mark_spaces: typing.Optional[str] = None, - mark_control: typing.Optional[str] = None, - ) -> str: - """ - Helpful method for debugging a parser - prints a string with line and column numbers. - (Line and column numbers are 1-based.) - - :param s: tuple(bool, str - string to be printed with line and column numbers - :param start_line: int - (optional) starting line number in s to print (default=1) - :param end_line: int - (optional) ending line number in s to print (default=len(s)) - :param expand_tabs: bool - (optional) expand tabs to spaces, to match the pyparsing default - :param eol_mark: str - (optional) string to mark the end of lines, helps visualize trailing spaces (default="|") - :param mark_spaces: str - (optional) special character to display in place of spaces - :param mark_control: str - (optional) convert non-printing control characters to a placeholding - character; valid values: - - "unicode" - replaces control chars with Unicode symbols, such as "␍" and "␊" - - any single character string - replace control characters with given string - - None (default) - string is displayed as-is - - :return: str - input string with leading line numbers and column number headers - """ - if expand_tabs: - s = s.expandtabs() - if mark_control is not None: - mark_control = typing.cast(str, mark_control) - if mark_control == "unicode": - transtable_map = { - c: u for c, u in zip(range(0, 33), range(0x2400, 0x2433)) - } - transtable_map[127] = 0x2421 - tbl = str.maketrans(transtable_map) - eol_mark = "" - else: - ord_mark_control = ord(mark_control) - tbl = str.maketrans( - {c: ord_mark_control for c in list(range(0, 32)) + [127]} - ) - s = s.translate(tbl) - if mark_spaces is not None and mark_spaces != " ": - if mark_spaces == "unicode": - tbl = str.maketrans({9: 0x2409, 32: 0x2423}) - s = s.translate(tbl) - else: - s = s.replace(" ", mark_spaces) - if start_line is None: - start_line = 1 - if end_line is None: - end_line = len(s) - end_line = min(end_line, len(s)) - start_line = min(max(1, start_line), end_line) - - if mark_control != "unicode": - s_lines = s.splitlines()[start_line - 1 : end_line] - else: - s_lines = [line + "␊" for line in s.split("␊")[start_line - 1 : end_line]] - if not s_lines: - return "" - - lineno_width = len(str(end_line)) - max_line_len = max(len(line) for line in s_lines) - lead = " " * (lineno_width + 1) - if max_line_len >= 99: - header0 = ( - lead - + "".join( - f"{' ' * 99}{(i + 1) % 100}" - for i in range(max(max_line_len // 100, 1)) - ) - + "\n" - ) - else: - header0 = "" - header1 = ( - header0 - + lead - + "".join(f" {(i + 1) % 10}" for i in range(-(-max_line_len // 10))) - + "\n" - ) - header2 = lead + "1234567890" * (-(-max_line_len // 10)) + "\n" - return ( - header1 - + header2 - + "\n".join( - f"{i:{lineno_width}d}:{line}{eol_mark}" - for i, line in enumerate(s_lines, start=start_line) - ) - + "\n" - ) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/unicode.py b/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/unicode.py deleted file mode 100644 index ec0b3a4..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/unicode.py +++ /dev/null @@ -1,361 +0,0 @@ -# unicode.py - -import sys -from itertools import filterfalse -from typing import List, Tuple, Union - - -class _lazyclassproperty: - def __init__(self, fn): - self.fn = fn - self.__doc__ = fn.__doc__ - self.__name__ = fn.__name__ - - def __get__(self, obj, cls): - if cls is None: - cls = type(obj) - if not hasattr(cls, "_intern") or any( - cls._intern is getattr(superclass, "_intern", []) - for superclass in cls.__mro__[1:] - ): - cls._intern = {} - attrname = self.fn.__name__ - if attrname not in cls._intern: - cls._intern[attrname] = self.fn(cls) - return cls._intern[attrname] - - -UnicodeRangeList = List[Union[Tuple[int, int], Tuple[int]]] - - -class unicode_set: - """ - A set of Unicode characters, for language-specific strings for - ``alphas``, ``nums``, ``alphanums``, and ``printables``. - A unicode_set is defined by a list of ranges in the Unicode character - set, in a class attribute ``_ranges``. Ranges can be specified using - 2-tuples or a 1-tuple, such as:: - - _ranges = [ - (0x0020, 0x007e), - (0x00a0, 0x00ff), - (0x0100,), - ] - - Ranges are left- and right-inclusive. A 1-tuple of (x,) is treated as (x, x). - - A unicode set can also be defined using multiple inheritance of other unicode sets:: - - class CJK(Chinese, Japanese, Korean): - pass - """ - - _ranges: UnicodeRangeList = [] - - @_lazyclassproperty - def _chars_for_ranges(cls): - ret = [] - for cc in cls.__mro__: - if cc is unicode_set: - break - for rr in getattr(cc, "_ranges", ()): - ret.extend(range(rr[0], rr[-1] + 1)) - return [chr(c) for c in sorted(set(ret))] - - @_lazyclassproperty - def printables(cls): - """all non-whitespace characters in this range""" - return "".join(filterfalse(str.isspace, cls._chars_for_ranges)) - - @_lazyclassproperty - def alphas(cls): - """all alphabetic characters in this range""" - return "".join(filter(str.isalpha, cls._chars_for_ranges)) - - @_lazyclassproperty - def nums(cls): - """all numeric digit characters in this range""" - return "".join(filter(str.isdigit, cls._chars_for_ranges)) - - @_lazyclassproperty - def alphanums(cls): - """all alphanumeric characters in this range""" - return cls.alphas + cls.nums - - @_lazyclassproperty - def identchars(cls): - """all characters in this range that are valid identifier characters, plus underscore '_'""" - return "".join( - sorted( - set( - "".join(filter(str.isidentifier, cls._chars_for_ranges)) - + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzªµº" - + "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ" - + "_" - ) - ) - ) - - @_lazyclassproperty - def identbodychars(cls): - """ - all characters in this range that are valid identifier body characters, - plus the digits 0-9, and · (Unicode MIDDLE DOT) - """ - return "".join( - sorted( - set( - cls.identchars - + "0123456789·" - + "".join( - [c for c in cls._chars_for_ranges if ("_" + c).isidentifier()] - ) - ) - ) - ) - - @_lazyclassproperty - def identifier(cls): - """ - a pyparsing Word expression for an identifier using this range's definitions for - identchars and identbodychars - """ - from pip._vendor.pyparsing import Word - - return Word(cls.identchars, cls.identbodychars) - - -class pyparsing_unicode(unicode_set): - """ - A namespace class for defining common language unicode_sets. - """ - - # fmt: off - - # define ranges in language character sets - _ranges: UnicodeRangeList = [ - (0x0020, sys.maxunicode), - ] - - class BasicMultilingualPlane(unicode_set): - """Unicode set for the Basic Multilingual Plane""" - _ranges: UnicodeRangeList = [ - (0x0020, 0xFFFF), - ] - - class Latin1(unicode_set): - """Unicode set for Latin-1 Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x0020, 0x007E), - (0x00A0, 0x00FF), - ] - - class LatinA(unicode_set): - """Unicode set for Latin-A Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x0100, 0x017F), - ] - - class LatinB(unicode_set): - """Unicode set for Latin-B Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x0180, 0x024F), - ] - - class Greek(unicode_set): - """Unicode set for Greek Unicode Character Ranges""" - _ranges: UnicodeRangeList = [ - (0x0342, 0x0345), - (0x0370, 0x0377), - (0x037A, 0x037F), - (0x0384, 0x038A), - (0x038C,), - (0x038E, 0x03A1), - (0x03A3, 0x03E1), - (0x03F0, 0x03FF), - (0x1D26, 0x1D2A), - (0x1D5E,), - (0x1D60,), - (0x1D66, 0x1D6A), - (0x1F00, 0x1F15), - (0x1F18, 0x1F1D), - (0x1F20, 0x1F45), - (0x1F48, 0x1F4D), - (0x1F50, 0x1F57), - (0x1F59,), - (0x1F5B,), - (0x1F5D,), - (0x1F5F, 0x1F7D), - (0x1F80, 0x1FB4), - (0x1FB6, 0x1FC4), - (0x1FC6, 0x1FD3), - (0x1FD6, 0x1FDB), - (0x1FDD, 0x1FEF), - (0x1FF2, 0x1FF4), - (0x1FF6, 0x1FFE), - (0x2129,), - (0x2719, 0x271A), - (0xAB65,), - (0x10140, 0x1018D), - (0x101A0,), - (0x1D200, 0x1D245), - (0x1F7A1, 0x1F7A7), - ] - - class Cyrillic(unicode_set): - """Unicode set for Cyrillic Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x0400, 0x052F), - (0x1C80, 0x1C88), - (0x1D2B,), - (0x1D78,), - (0x2DE0, 0x2DFF), - (0xA640, 0xA672), - (0xA674, 0xA69F), - (0xFE2E, 0xFE2F), - ] - - class Chinese(unicode_set): - """Unicode set for Chinese Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x2E80, 0x2E99), - (0x2E9B, 0x2EF3), - (0x31C0, 0x31E3), - (0x3400, 0x4DB5), - (0x4E00, 0x9FEF), - (0xA700, 0xA707), - (0xF900, 0xFA6D), - (0xFA70, 0xFAD9), - (0x16FE2, 0x16FE3), - (0x1F210, 0x1F212), - (0x1F214, 0x1F23B), - (0x1F240, 0x1F248), - (0x20000, 0x2A6D6), - (0x2A700, 0x2B734), - (0x2B740, 0x2B81D), - (0x2B820, 0x2CEA1), - (0x2CEB0, 0x2EBE0), - (0x2F800, 0x2FA1D), - ] - - class Japanese(unicode_set): - """Unicode set for Japanese Unicode Character Range, combining Kanji, Hiragana, and Katakana ranges""" - - class Kanji(unicode_set): - "Unicode set for Kanji Unicode Character Range" - _ranges: UnicodeRangeList = [ - (0x4E00, 0x9FBF), - (0x3000, 0x303F), - ] - - class Hiragana(unicode_set): - """Unicode set for Hiragana Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x3041, 0x3096), - (0x3099, 0x30A0), - (0x30FC,), - (0xFF70,), - (0x1B001,), - (0x1B150, 0x1B152), - (0x1F200,), - ] - - class Katakana(unicode_set): - """Unicode set for Katakana Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x3099, 0x309C), - (0x30A0, 0x30FF), - (0x31F0, 0x31FF), - (0x32D0, 0x32FE), - (0xFF65, 0xFF9F), - (0x1B000,), - (0x1B164, 0x1B167), - (0x1F201, 0x1F202), - (0x1F213,), - ] - - 漢字 = Kanji - カタカナ = Katakana - ひらがな = Hiragana - - _ranges = ( - Kanji._ranges - + Hiragana._ranges - + Katakana._ranges - ) - - class Hangul(unicode_set): - """Unicode set for Hangul (Korean) Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x1100, 0x11FF), - (0x302E, 0x302F), - (0x3131, 0x318E), - (0x3200, 0x321C), - (0x3260, 0x327B), - (0x327E,), - (0xA960, 0xA97C), - (0xAC00, 0xD7A3), - (0xD7B0, 0xD7C6), - (0xD7CB, 0xD7FB), - (0xFFA0, 0xFFBE), - (0xFFC2, 0xFFC7), - (0xFFCA, 0xFFCF), - (0xFFD2, 0xFFD7), - (0xFFDA, 0xFFDC), - ] - - Korean = Hangul - - class CJK(Chinese, Japanese, Hangul): - """Unicode set for combined Chinese, Japanese, and Korean (CJK) Unicode Character Range""" - - class Thai(unicode_set): - """Unicode set for Thai Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x0E01, 0x0E3A), - (0x0E3F, 0x0E5B) - ] - - class Arabic(unicode_set): - """Unicode set for Arabic Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x0600, 0x061B), - (0x061E, 0x06FF), - (0x0700, 0x077F), - ] - - class Hebrew(unicode_set): - """Unicode set for Hebrew Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x0591, 0x05C7), - (0x05D0, 0x05EA), - (0x05EF, 0x05F4), - (0xFB1D, 0xFB36), - (0xFB38, 0xFB3C), - (0xFB3E,), - (0xFB40, 0xFB41), - (0xFB43, 0xFB44), - (0xFB46, 0xFB4F), - ] - - class Devanagari(unicode_set): - """Unicode set for Devanagari Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x0900, 0x097F), - (0xA8E0, 0xA8FF) - ] - - BMP = BasicMultilingualPlane - - # add language identifiers using language Unicode - العربية = Arabic - 中文 = Chinese - кириллица = Cyrillic - Ελληνικά = Greek - עִברִית = Hebrew - 日本語 = Japanese - 한국어 = Korean - ไทย = Thai - देवनागरी = Devanagari - - # fmt: on diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/util.py b/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/util.py deleted file mode 100644 index d8d3f41..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/util.py +++ /dev/null @@ -1,284 +0,0 @@ -# util.py -import inspect -import warnings -import types -import collections -import itertools -from functools import lru_cache, wraps -from typing import Callable, List, Union, Iterable, TypeVar, cast - -_bslash = chr(92) -C = TypeVar("C", bound=Callable) - - -class __config_flags: - """Internal class for defining compatibility and debugging flags""" - - _all_names: List[str] = [] - _fixed_names: List[str] = [] - _type_desc = "configuration" - - @classmethod - def _set(cls, dname, value): - if dname in cls._fixed_names: - warnings.warn( - f"{cls.__name__}.{dname} {cls._type_desc} is {str(getattr(cls, dname)).upper()}" - f" and cannot be overridden", - stacklevel=3, - ) - return - if dname in cls._all_names: - setattr(cls, dname, value) - else: - raise ValueError(f"no such {cls._type_desc} {dname!r}") - - enable = classmethod(lambda cls, name: cls._set(name, True)) - disable = classmethod(lambda cls, name: cls._set(name, False)) - - -@lru_cache(maxsize=128) -def col(loc: int, strg: str) -> int: - """ - Returns current column within a string, counting newlines as line separators. - The first column is number 1. - - Note: the default parsing behavior is to expand tabs in the input string - before starting the parsing process. See - :class:`ParserElement.parse_string` for more - information on parsing strings containing ``<TAB>`` s, and suggested - methods to maintain a consistent view of the parsed string, the parse - location, and line and column positions within the parsed string. - """ - s = strg - return 1 if 0 < loc < len(s) and s[loc - 1] == "\n" else loc - s.rfind("\n", 0, loc) - - -@lru_cache(maxsize=128) -def lineno(loc: int, strg: str) -> int: - """Returns current line number within a string, counting newlines as line separators. - The first line is number 1. - - Note - the default parsing behavior is to expand tabs in the input string - before starting the parsing process. See :class:`ParserElement.parse_string` - for more information on parsing strings containing ``<TAB>`` s, and - suggested methods to maintain a consistent view of the parsed string, the - parse location, and line and column positions within the parsed string. - """ - return strg.count("\n", 0, loc) + 1 - - -@lru_cache(maxsize=128) -def line(loc: int, strg: str) -> str: - """ - Returns the line of text containing loc within a string, counting newlines as line separators. - """ - last_cr = strg.rfind("\n", 0, loc) - next_cr = strg.find("\n", loc) - return strg[last_cr + 1 : next_cr] if next_cr >= 0 else strg[last_cr + 1 :] - - -class _UnboundedCache: - def __init__(self): - cache = {} - cache_get = cache.get - self.not_in_cache = not_in_cache = object() - - def get(_, key): - return cache_get(key, not_in_cache) - - def set_(_, key, value): - cache[key] = value - - def clear(_): - cache.clear() - - self.size = None - self.get = types.MethodType(get, self) - self.set = types.MethodType(set_, self) - self.clear = types.MethodType(clear, self) - - -class _FifoCache: - def __init__(self, size): - self.not_in_cache = not_in_cache = object() - cache = {} - keyring = [object()] * size - cache_get = cache.get - cache_pop = cache.pop - keyiter = itertools.cycle(range(size)) - - def get(_, key): - return cache_get(key, not_in_cache) - - def set_(_, key, value): - cache[key] = value - i = next(keyiter) - cache_pop(keyring[i], None) - keyring[i] = key - - def clear(_): - cache.clear() - keyring[:] = [object()] * size - - self.size = size - self.get = types.MethodType(get, self) - self.set = types.MethodType(set_, self) - self.clear = types.MethodType(clear, self) - - -class LRUMemo: - """ - A memoizing mapping that retains `capacity` deleted items - - The memo tracks retained items by their access order; once `capacity` items - are retained, the least recently used item is discarded. - """ - - def __init__(self, capacity): - self._capacity = capacity - self._active = {} - self._memory = collections.OrderedDict() - - def __getitem__(self, key): - try: - return self._active[key] - except KeyError: - self._memory.move_to_end(key) - return self._memory[key] - - def __setitem__(self, key, value): - self._memory.pop(key, None) - self._active[key] = value - - def __delitem__(self, key): - try: - value = self._active.pop(key) - except KeyError: - pass - else: - while len(self._memory) >= self._capacity: - self._memory.popitem(last=False) - self._memory[key] = value - - def clear(self): - self._active.clear() - self._memory.clear() - - -class UnboundedMemo(dict): - """ - A memoizing mapping that retains all deleted items - """ - - def __delitem__(self, key): - pass - - -def _escape_regex_range_chars(s: str) -> str: - # escape these chars: ^-[] - for c in r"\^-[]": - s = s.replace(c, _bslash + c) - s = s.replace("\n", r"\n") - s = s.replace("\t", r"\t") - return str(s) - - -def _collapse_string_to_ranges( - s: Union[str, Iterable[str]], re_escape: bool = True -) -> str: - def is_consecutive(c): - c_int = ord(c) - is_consecutive.prev, prev = c_int, is_consecutive.prev - if c_int - prev > 1: - is_consecutive.value = next(is_consecutive.counter) - return is_consecutive.value - - is_consecutive.prev = 0 # type: ignore [attr-defined] - is_consecutive.counter = itertools.count() # type: ignore [attr-defined] - is_consecutive.value = -1 # type: ignore [attr-defined] - - def escape_re_range_char(c): - return "\\" + c if c in r"\^-][" else c - - def no_escape_re_range_char(c): - return c - - if not re_escape: - escape_re_range_char = no_escape_re_range_char - - ret = [] - s = "".join(sorted(set(s))) - if len(s) > 3: - for _, chars in itertools.groupby(s, key=is_consecutive): - first = last = next(chars) - last = collections.deque( - itertools.chain(iter([last]), chars), maxlen=1 - ).pop() - if first == last: - ret.append(escape_re_range_char(first)) - else: - sep = "" if ord(last) == ord(first) + 1 else "-" - ret.append( - f"{escape_re_range_char(first)}{sep}{escape_re_range_char(last)}" - ) - else: - ret = [escape_re_range_char(c) for c in s] - - return "".join(ret) - - -def _flatten(ll: list) -> list: - ret = [] - for i in ll: - if isinstance(i, list): - ret.extend(_flatten(i)) - else: - ret.append(i) - return ret - - -def _make_synonym_function(compat_name: str, fn: C) -> C: - # In a future version, uncomment the code in the internal _inner() functions - # to begin emitting DeprecationWarnings. - - # Unwrap staticmethod/classmethod - fn = getattr(fn, "__func__", fn) - - # (Presence of 'self' arg in signature is used by explain_exception() methods, so we take - # some extra steps to add it if present in decorated function.) - if "self" == list(inspect.signature(fn).parameters)[0]: - - @wraps(fn) - def _inner(self, *args, **kwargs): - # warnings.warn( - # f"Deprecated - use {fn.__name__}", DeprecationWarning, stacklevel=3 - # ) - return fn(self, *args, **kwargs) - - else: - - @wraps(fn) - def _inner(*args, **kwargs): - # warnings.warn( - # f"Deprecated - use {fn.__name__}", DeprecationWarning, stacklevel=3 - # ) - return fn(*args, **kwargs) - - _inner.__doc__ = f"""Deprecated - use :class:`{fn.__name__}`""" - _inner.__name__ = compat_name - _inner.__annotations__ = fn.__annotations__ - if isinstance(fn, types.FunctionType): - _inner.__kwdefaults__ = fn.__kwdefaults__ - elif isinstance(fn, type) and hasattr(fn, "__init__"): - _inner.__kwdefaults__ = fn.__init__.__kwdefaults__ - else: - _inner.__kwdefaults__ = None - _inner.__qualname__ = fn.__qualname__ - return cast(C, _inner) - - -def replaced_by_pep8(fn: C) -> Callable[[Callable], C]: - """ - Decorator for pre-PEP8 compatibility synonyms, to link them to the new function. - """ - return lambda other: _make_synonym_function(other.__name__, fn) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__init__.py deleted file mode 100644 index ddfcf7f..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__init__.py +++ /dev/null @@ -1,23 +0,0 @@ -"""Wrappers to call pyproject.toml-based build backend hooks. -""" - -from ._impl import ( - BackendInvalid, - BackendUnavailable, - BuildBackendHookCaller, - HookMissing, - UnsupportedOperation, - default_subprocess_runner, - quiet_subprocess_runner, -) - -__version__ = '1.0.0' -__all__ = [ - 'BackendUnavailable', - 'BackendInvalid', - 'HookMissing', - 'UnsupportedOperation', - 'default_subprocess_runner', - 'quiet_subprocess_runner', - 'BuildBackendHookCaller', -] diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 646e45f6a237b475db465f374f04a836313b4aa9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 635 zcmZvZzit#U5XSAj+uKb}Ap%7~bl0IPZk<4b1fmEOPykhgw2kFkn>!Q#i|t)>Ndr$o zM?uH4@CMsbA)15~ky0^EjxH{Knz84zKhON!+S)|0ns2AeKNz83Dfz#$b#U<ng0G09 z8ga}sg>_bEdQcDaupa8X&h@As>7p)lS(g~`LA|j+eE1#Lo2z^}I(houGv|a4lV~Rm zQ)=Q?&fAZoiB+^(&E_l!KAE>t0a<e-44*8mJqp$4Z!m?XMSthuX8*P6n3BA|x6Tg@ z>zGt*u0+3kkZxEXyaN3TcuV+xoZ>e!1Zfui&Y=mdbJj<}-+?I>r8WHnE<UhUMH<>U zSZhQG)VIcf`u=e%#VrRX`F^!m?M(|m1dD!<FiI#A%7l%C9PoBJ?h8t}Z7A(?Dz#HL zf@^82xJ}xRDea(bU=U=Whwo7O16@Epx;iCGs|C?4hK{_nO{;~8fkdIi!ZSS!Q9>vE zjN4B}S;mDYoiH6ya!%YTF0FZ7?LQ(xMlo~HT(%H_IOzzyX}I-Jv>p<@o&}*)8W}0A z-0G@)rY&!kc<%3lmo%gB5O6lY7@ubt4=+b0&Mpz)JmG8yZSQ^_|INyA_NDOKQ2P(M C6TNf* diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-312.pyc deleted file mode 100644 index 87f6ef2ed8bf2adee36388067d768c4ea77137c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 396 zcmYLDJx{|h6tv@{Mg3r)5+f30Bw7nt5mRS=K!g;9*feSEII`VTfrXigjg6h(!UPK_ zVnC{d)D5XyCtgr1p5(i;-#x#3>GwMbDt@|6?tvH0Wn0chti~W75kmoDm^lImnB%Ft zwf!?A*(E~S`*V?iR1PRtxY7#<MwR1xKCatVNg>j!Wixl-J4*t*>;gd3YnrLws@q{0 z2@!@hF_o!%CD$fZd6?$cN;kRcZjlzFu;e*YTDRck8La@(`i3S-aw;QhN;+2YO!C|s zYPsMO9m%1wX`FFAWNMxZ6)~<U{8CbgM2pHMDnA_^pHP!pJ}ja*izeJqSVlL?z*J~8 z<*^MDr7}aqSji%?qoP{xoJqxIf}iVMh=SpmLx3NGG5+Z6-?bO0^F><kWbjG`5A!#2 N@agV-yGObQu3r%&ZJhuB diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-312.pyc deleted file mode 100644 index cd87eb0585e662a37ce234c90b8d044729d15b5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14747 zcmeHOYiu0Hec!$Ji#)zXN~E+T^*TyAS}#kYWmymE72Avv%N0x~JsxkD(ox4ddUj6~ znPW{GN=>y+B%^IaBSB3gMl99}qL2RQwm|x!Ur3)E(Q5`ZP`5~c0;NSEN{xKz??3yv z2T92`+%^R=5@%=UwKM<M{N_J%|6EZK5D*f7``z=`qJr?R^kN0KnOOQQ64wP;kj0eH zYdpnXk-s~79sKF+b>itrxrW@mZjtIZQ=TDjua~D?Nc(#IJnc>ehJwApp-^vVsG_$5 zc^=uDsvHXUhLQGN7J92>KjLbKa8i&1mjyYf)V%97#?o8Mb3@3jD9Wwlxs}Kb7v<LT z+$!W&7v(m{Yvh{CV(%I}Yw>K9>+rQEUbh}~8{T!8-&#8=MjC%ZFFg@auS{gpnsP}S zil^h}6owpcyk8xTYv+-44Q7(*h*S4Gd#3xF&z;c&iStV0LM#zarSy=I&SbUWto9ob z-JwBUESZiCvrHnUCRlP<i%~}j^UM7E9>hWXEnPx%UC^i@4>?g5WyejYMU%b4xKlIf zBM5^ot6t%m6LQW0M^eZ+-WGo#axQ>F);vXFRA?7=3aU8b5QXOj5&uSoOU~zo5i#QG z(Z!L^-C1p5$Nm{n_bKT_Moy;BVXm&su#(2i)eK@eJ2V_|>CR05pzfl%=$;EBaduAC z#Q~LuBq4l$sq=hhNa-AkYwE?$?o1*(q@*>qQ&UpPITjz<p=!y*1%>U9Gb8C#CN3+i z^P-Zz*qKW9cMgwg=QHWu(Ve?G)ug8E7>*|{fDvlvaB{dahH7$#p%Q31s3f%5`Ap`5 z+8Ij@4X2{Rqk3S3p;3$m%NjA93jC@25lsjS{)$QY+Og>^xBVT9g6Q6OBfj7ZUG-n_ zUu(bi;+(I2>cj`W_WMqh+^6EtDEeIWq4CwmN1V6Z2fPWJImjf&5j&O`q7ueIfo?i1 zvV(2nL)a$1YxbKUB`aasv#Ybr*~4gdtP)Yg$*L$_jYxM9Nh1zcM>!3MRFXGIVr!_> z&y=`q5NI9VYp5I+!6MMq+1vh2M4sjw)eGU;tD{#&r>g%lM`URxvNYeN$RNuP>UTJQ z=6=+hKyy1-BwC^`Ul$aCEC{TJ2+QGs2D(O_5TKf)U@Lg}TsnR+o=nC2Q_9%!v&mFS z>Q^KdPpXP6B?lz!ydw1*HKjy6oz7@f4rXVVMm5sB2FZX#N~Wl4v_!dR;+#h`&Fex= z%n31jq@%)&*aKnrYb>5n=rc18-K8q20oIC2B~<gppvXxr78_f)eB@E9unEnU{D>xm z`KGo>*Y_)z=xaSQZXF$@<3ma;rUzoNp^ThOQ92Zhy_k)s%o1-bCc{$1*hVy(5!hxt zIMY}Qr6?j6s$|M93m>_@x#SSt?M5{!Ea8J?W0u-b@@g3;CWQgmmdn0g*Q9Vs>~%j2 z3DPUgnVn8wjHi<FSmeR{NUESeuNh6a@C_>vy*bSfBk?yPG{Y(puDEi-_p#jMoR-9k z22ZTP!gPT{)S8D;fo(tn^5Ryr!wTbs(L<(0aDo=zxQTYNb~Io+DcXfd_YOfQU_W$! zES5;cRW%k<X~82qHDM5!s6Do(bn-S!>HDgL=y$LnzKSc}IbY+{n%lnC`R1*YuG_vQ z{`}C_#Mv<8VOvp`MJVc^Xd6ZJ1--%?Ktf5SVzC*K?Ln?e>T=i^2WcUrh<K@zKL3um zy!*bx>5eQ4hzwR!l?49mU{UXjvpRSRD)V$wRbk@C4wdmala_{zB8gj9X)81_E)8Ij zBg&H^ZsB^Eg_cH26^>X(e@jICGUkJ|ocXr7D`&pNZYO&LtqrRAX$YLtuyO5_{TM}@ zcJ!fAF4h&z%VyygR8vWDidoon+t+UDs6o}e)a^d1TEvnAlu6MhDzI5{>b}F_ZeJ7- z8I7q*0)KY+Vpg#3xisY3FlOI`e8;t9COy{ubbPeP4EEzCn@q_uRZgl}xm8T2<zynR zDJm>s9HpAUo>H!mfN-v?YzDcKF$t9z8H-}W$C)tJveGzh`f|A?0&!aOFrqixZoM0_ z{W!f+MESM>>nSo|RG6SaT7k5b5Be1(imk|?CGS>EJO`<ES$NlcA9v;)tUBi$^p;h? zYtB)yL>gIc9ss1oob#q=K`#I$N5nZcat6zhtPI4nDNPzufKy~CGXR38QqUv56pgU> zFc>MR*?wz53Ixd3oH-AB358Lmu7PYi(bZQ}qW~iNq-+{!$XeCpC~q5a=+4B5tUG~` zdLnM!kx_Lo(n&^;ERg~3@nnZ(NCBfM&H$e!hGcdaX}tnamc?UcZFU5CDp_k96K9Ry zWX>p77*UL6(`lI7)2K*_tac)r5bgzpV8zvrD;-xmuXN@E>n4tU<gJ_c1+NCK1g<>} zoA{}#a#EdgPS^g@wTTNu2}5nb^cs5mzhJ1w_dxi#0M-%_5KPv-cnnPBWG_%b8aba# zDPZOBFvB83EH=P>^oz38sJ;qQot#0OBf3Y`z;@OX@vx&96gx&yH$}%OA`HrieC!0G zGXAZ3F`HDh6}a~l>K>x{v>JXP?p0l@oob)nee>ckU5^_4D^@j|fBymN_Eq?ovn@Xh zYPK@UcJ3=;0V=Gh<hFuhLT1PbmI9AE9@3h2S!LlNEeKzi1ppM$g7)^8oe$|JT-FI* z3x;Rh^%Yv%0BYR*kk+&%C<{4P&V9}{d^y(zEPEv!vCCe886<2t_UoPu8v-g+6)B#U zC2p~#xQ)#Tdzo5s97`HgjMa$XJ5yfFDk`CM6ShfIS%NiGhm}NfAc>N=ioTeV!uoen z;pN-8;iFGM^)ji8w7z9fDV4!uhefi;PM$-Xw4`RTEP>B5MKK5REk(<+G=?i-|DH)@ zHAT9pFqIm^XqOJn7(dy>u?9-3(ohy_E$v0jQH}9o74nm5H7Ub56h0gA8@gKuYU}Q# zim&Q{KZ&QZ%5larjFG|7eQD5<zQAa~GF}sLRe|>)Gc=S*!_o{SFGW0h(C9fv6QVtv zNklz>ZevE7UP0+XQIPt!$}0JbU8s`s()=u|Z<K?;G0sc&Jj%a;KlNvbU@WQxU*Oe| zmq%V5e|h}c^S8Yl7AhNOn|9_acg^~CeOg_6ea-7@u5WmK!}Pj*^^S>eEYvkzKl%E} zJ9Qi9>NdXpt#{78b@rWazxC}~9q%Rcn@;8HPES02&nMK@U*GcjmOC|Vb2V+#UHO{m z#FGp4Yp$Pt{p_9kO>^~|rib$NdnS4oyng!h9q+n1@4BfMZbWCB59GaF?_K!7dzug9 zv3%vhS>M4=f{nATM#E5H)ON6p*3w@ft8@$M7wDfHmYr}3xfHkTx-3{Yq1Pk3u|f69 zRk8=AK3=n0_9E@)=^D7L#NGhP{dfk=@&M8yvpk4&1<FHsR^nNKXIO^As<#RVqE>G> zN=VM!Y7kbXWk+FSCyq!Ka)6i<px^?^ai6U>1{fd6FzA6PcXE=!36f!>22kip5Sy() z7S@TsrB4xI^Xr=M6l?{o4wdmxu*=wdS;Q;bisgX5bIxwzswd$%CnOx-fp=xxQw*6_ z^hkLuTlu=<wY4sIu*N+(C%$6CHP|8{W{*1OR;#p1Yg~f_xXZ%0JLg6VdnFhZ6Yypw z9OIr5A>xSt6_zG$I!MyHhU4%ynY4<5R$USyxN_Q&Wx-B1bAhZD{0+n+o9G~Sd4C2P zH?5h`Woa8SY|9!MUJUO4>ynPha+1tgJY`rzxW`x$HjbFPd<-k~XCO4=>s>G!#eh;W z3Z;Y3+9*`|7DsgIp+1@|aA^7X47XcMxuhhr8o6V->>5N$qT4gvGba_QP(Sj6sAqT4 z6A5rIX&AwPY1_aNy`qGg+zc5T_nPI1Mt7>Cu&IRs=+(=H9q}5w#P2|E*q>5F09N;y zh_;_z#9@_mgXV=$<OJAobVc>FcRB-TrCvldAuLKlsAlreLVa}d#HVXpr#td%cTBoo z3(vQ7kXvBwN5M6p96a?~r=z)Ye&7DTuAI`|eCdssZiydO?OLSF$)~V=Y_44N2rUuA zkI=^b2^&5NOAAu_JC$!$&W2j%TX#*mKJ=~sue)JX=8lV>wj9~vDsghTFraq)Ez#tj z1fqqm3xi0PhjCyR=#HHYLn!{xab3hdoZK#U{;1eqmNR1diGSvVuh<da4lO$(nT~SF z^pqRItB`Ll&XTE7DTC#fCCQ7-W!l_k*fQ~@q}E*1iC@tuzAP&{`hf*5bahFF2pEu@ z$|-QC0hv+kr5=}7=IYjHG#ar-L#;-V047CEqlLYIxg*-T3f7L4Y72FS-tEqDuE2=A zmJ1_+G~DM*xu}v6Mr~s&R=w<lV_R1q{PLlF4;`ty5&fF{9E%M?Ro$KN=DG0ZN!Pq7 zT8j>+f7{2Q>Q6RzOm=@5YX9A|%%8tk3A4OX*C}3iwF^J;b&5anZ+G5wc8VnqZ;~?_ z?$TyNT*e><<v|vc_K5?KqhsuliNnaO0Y7R4zB0q6@f%R$0BJCMwi`r(yMtRm!(K-9 zTG#>8MG~{B!)Y7fhc4Xx58{&ebH9zL%}KnEb*w_V6*|05?TH8z!Y6QgzjWoL*$sPc z_2<I}W_<^i?}TXe;*{t>Vs%Q$(6^+$TOb@Ae-tD;sc2HXumH#k&R1j{xX=PXfDLQ9 z%$2F1tP!bC99vOENfjvpl!wr*ilxM+YS*wb+|_4yH);cHrb-9*KC=H%UqK?fm^M1B zbn&(?s2clDL4TlMaT!pQFHq306Hp^s><TqVyic3X`I5y_&R`1Uq=&92(**3fIvI+k zkq3l4-P?i5ZPlQ@U^BE)V;UpY5dfc_Vmd&mlHPm{yIhk#Y78r7jMFE^Nu!5hjRunE zVydEPAeqX@0M0m!#UPDziC1d~8DqOwk&g#`=SS2NNt>x+hNwI~A8MI;33mOk7+4Y< zRYBNxf6$N{(i$t+i0m+OR+pO<k(nch^OGMtEj-1gDeMr0XP5$*gKe4A*Vhpx7vYX% zdLYx+2N6n<FNs?<c&p-Y5W$Pf5e7J69-yr#Q$664wMj}VBe3NOoEp&{4hE{I+hi#p ziA@rQVSS7smjO@v`nL1sB9228b2+doEtg4%V?oxwK51N87->6OB8+`~F$jESBxd=$ zK}nEHV_EI|==NgU1j-ucRdMx#frGd}O7W8ZxOhqzlX2d(udhgG(KD?!d`C?-&t@Jl z7M)2E!3S7osH8vc=C!_TSb-8X0b{v9#4G}rtICX1ud&N)4l&XZJzO?-D9{DubJ#ZH zGL%WB464m&H&N=0VlN_VY~L!1^{|os9rd>Z5r<b*b%t^sS!j#Qb{x#NJwCr7ivOQ^ zUEQQ+E>bhs1J$e-eL>BfF9(Z`)eEi@Y(xf~s8SYWv8cA~oB~8zu7LjubIvCV;W8La z`~s&RtY9S!C1_1%ab<-wdL<pkVP{_-e=XLlBK<8_mD9M#KvF~=4{ii3i7sdt>8okU zSCq^VcxE_^vd>zrKFE-iOrr}jb-t_bVLXN*;LCf-x-pW;rb@NYI_c%xGC3-pPQ!&1 zmyO2w#>HeNtHLgkHfbj5Ev0}%98RT@!C}v{0_|+YE07;YC<Em5wfb5?!Gc8^3|$JB zvBXdfQW7W+8Go)pmhy~I23H=cQKmd}17xgi73C@V>ig96AR_3=dLguaHW*oG-8vh2 zEZ=%?Hne`;KrmC|3mZ01zm(swkMyQ(5A>#Unc83hvBOtKHHW_%s!2-<w!yU7{3E`R z^bM=v4vR*H*buB?8AK&`=FgBZ_UI~-^N@b;P-pFkN+8W)3(_3>--R?ae}pt-lx?%j z)!z0-l>zKOC`e<;>8hxv#3Gj>9IOejybmzC?GIR2tPe8=A!b>M$VXFVTqlq<*0qX? ze1YEoow{5GPP&(alaqfa;3NoD;`7BiS7vEBto(lsQ!J)i()P6?6}$5lz)Fb}bKt^v zyf`W{e8^u8td#U-02gwoekHI{($@;WrIOo{m^C>z3W;Xlr6@<TO<08tkKqq}1#e@U zR#BJIj($(A>G}qT?W@6&*$th`@W`(J89Xxf=E*PbV!;t2?Z1lf^w;lWA@WjK)tAAC z@SuhMGO^`LIxcvpb%1ErDj$Mx@ZpY&;++v4(9ru5-6#06jtjUg?Ax&XF!_pYm5eJ* zU-zEL==DK+CW8%NgbC((3tY1a^F(2PWw3&l6w7t{D$+c+#B<C39N7<n?!4>u#D*=X z3|+C<Py*CHb2|y8J85(4v^KZJtO%enXT{ryaa$iAeZqw0At~b8ld#e)3KrE!)p-~s z#+HRa`)sXHuyRlDVlouQT{y+V=9so5ntjV+FvJT>BI~FXm!jP=u4Q4A9?iZTk@INw zZG{|;W-VWr?7rzKT*cCAtuBjt^J0YLzby;nKIE?{%fxHWr!`r*8eN0tA?LMbWIb_S z;y#BH%E4x<PT`3QV&1~2=-PJiU3-l#j`C14C!aMZ>kH%loPV&@s#|!<eyavsr?p%8 ztJDq1!Sa4_b7SRxLq+{=`WpMKu>0Mmk%036%2~;xCvuDToo2}@<E<>r?Pl1b_o}n2 zvPZFAi&&prrRQp^?j=#h8FJwioO+jQNI<^Gh5XlkYy5^{)!$as_ULub9Dio-&V8|? z&z*j%J9hNQu_urBbnCTNuJImw=E#{-tR9~o3nbI{5lNJO#_$^=6@E$L!A(yb6XRb0 zVPvpVR4r)UN8`WE2xbeHNf}9$F6e=DCT1Q~>tQp2i|qW?HjZA+Gie;tWf%<HPU@JB zOWAH}9^yw~=2c+5+Dz~x7vt)6zyKLBbQh^F9JcanFuIrDqfv&<i!K_R{N!2DYtEQQ zgrnV-cbNZDLw66;k82p&H`Y%PotPO1#!k3|89&h_UDch~(elfr#=ZC`)jNO)hs>lY z#tmVjBd3ya0PN6YJ-{c#NsAkI{P#Gz$2dO3FI(Up=ND70wZTF{<NzIOT?GjhpF+X1 zPs1Y8-T%&8b$50io7;J8wy}G%;*((bPO$ldVDrMdmN&cJ=z8;sH=ek$=gzi+bK4H) z*F8S@)co!zCZC>N+c_6{<kO1!I~7~!Dz@e;@GF(I{>?Y~=hwDPpO|ghHu;T(P{Xyc zxA)$tx$*6Md)NCrKMWne=Mic)=c~6Y3Z9CZ8;{O6wcKgyoNMa5=9$L<VAYnnsx9;N z>wbLp?PqT^{N#mv%g$Q|-s_*OJ2Kzc{AT!#@O)e6qF1QidQWgw*W7ob58V8zYx(hW z)4Qg}^DTSxwU17AlSAp!l}l3<x5Jwk8ai(5`T72t{kNWczb3z}JKu18w(7W5BXm2w zX`x~3jk=#V&NSZI_8!Yej^-PV%~l;VYs@xAZihP-8aB?iZo1RDd#-giPwbj&-8J7V zy?N@5Q`0e=yEPxU=XI^Afq%EUW-&l;g}z^TJG^C~p>=xWJ6qq{I=k&qzU_$*+Mas< zK)&JW*{Y}KYu8ML=4v<H-wUdJMx?tRz<fAiKEEHtJE!O8>Si$X?_0K<^f>>)bwoVT z<^D(av2A$!MVI@e)BlSnyh#6($9*#FjW~OHdW@eSIC{>^IC^>_)vI3cXS6D_a}?3> zBcn4W?hj|=*JI?OVG|S)v}Oe4IBGB)>~t-fpBEYE`vrQXh!jB`M|4^E3_tepEmjI^ z*JGyh>)VzpTHL!A4+);S&m3X*wk0Q0i<G+C=5Ti{`6}E&TvFKg80fm>uER@I*t36r zL;I4u-W^<uu3p@L;zxXl>imcrTHTwCk?}!IV=R$%{D(%yb+<lbupc7AkKv48&f!;F zoEEw_qel5%H^Lj-4zMX+v2e_7+-mhwIbCwqgVyimaN*W41-NG<Fs}Cg<ChW&KRGVb zd&3r-riygu)wo2$M_WqP&wU4tU)~&IKSe!4FDmh7(J6}J$3pO9!T+%k_*e-4O4#%( zVcoBU)_)Q9%?bPdP1teQ;}AFA4LHQ+djY4|KGk$jz~f%XEk>?Ae^0>UUX@F1zZQWa mA-|I99N=}9LVj`cQlnqocek-#Y`Xu*d8fGfu0Sy->wg2CY)FUz diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_compat.py b/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_compat.py deleted file mode 100644 index 95e509c..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_compat.py +++ /dev/null @@ -1,8 +0,0 @@ -__all__ = ("tomllib",) - -import sys - -if sys.version_info >= (3, 11): - import tomllib -else: - from pip._vendor import tomli as tomllib diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py b/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py deleted file mode 100644 index 37b0e65..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py +++ /dev/null @@ -1,330 +0,0 @@ -import json -import os -import sys -import tempfile -from contextlib import contextmanager -from os.path import abspath -from os.path import join as pjoin -from subprocess import STDOUT, check_call, check_output - -from ._in_process import _in_proc_script_path - - -def write_json(obj, path, **kwargs): - with open(path, 'w', encoding='utf-8') as f: - json.dump(obj, f, **kwargs) - - -def read_json(path): - with open(path, encoding='utf-8') as f: - return json.load(f) - - -class BackendUnavailable(Exception): - """Will be raised if the backend cannot be imported in the hook process.""" - def __init__(self, traceback): - self.traceback = traceback - - -class BackendInvalid(Exception): - """Will be raised if the backend is invalid.""" - def __init__(self, backend_name, backend_path, message): - super().__init__(message) - self.backend_name = backend_name - self.backend_path = backend_path - - -class HookMissing(Exception): - """Will be raised on missing hooks (if a fallback can't be used).""" - def __init__(self, hook_name): - super().__init__(hook_name) - self.hook_name = hook_name - - -class UnsupportedOperation(Exception): - """May be raised by build_sdist if the backend indicates that it can't.""" - def __init__(self, traceback): - self.traceback = traceback - - -def default_subprocess_runner(cmd, cwd=None, extra_environ=None): - """The default method of calling the wrapper subprocess. - - This uses :func:`subprocess.check_call` under the hood. - """ - env = os.environ.copy() - if extra_environ: - env.update(extra_environ) - - check_call(cmd, cwd=cwd, env=env) - - -def quiet_subprocess_runner(cmd, cwd=None, extra_environ=None): - """Call the subprocess while suppressing output. - - This uses :func:`subprocess.check_output` under the hood. - """ - env = os.environ.copy() - if extra_environ: - env.update(extra_environ) - - check_output(cmd, cwd=cwd, env=env, stderr=STDOUT) - - -def norm_and_check(source_tree, requested): - """Normalise and check a backend path. - - Ensure that the requested backend path is specified as a relative path, - and resolves to a location under the given source tree. - - Return an absolute version of the requested path. - """ - if os.path.isabs(requested): - raise ValueError("paths must be relative") - - abs_source = os.path.abspath(source_tree) - abs_requested = os.path.normpath(os.path.join(abs_source, requested)) - # We have to use commonprefix for Python 2.7 compatibility. So we - # normalise case to avoid problems because commonprefix is a character - # based comparison :-( - norm_source = os.path.normcase(abs_source) - norm_requested = os.path.normcase(abs_requested) - if os.path.commonprefix([norm_source, norm_requested]) != norm_source: - raise ValueError("paths must be inside source tree") - - return abs_requested - - -class BuildBackendHookCaller: - """A wrapper to call the build backend hooks for a source directory. - """ - - def __init__( - self, - source_dir, - build_backend, - backend_path=None, - runner=None, - python_executable=None, - ): - """ - :param source_dir: The source directory to invoke the build backend for - :param build_backend: The build backend spec - :param backend_path: Additional path entries for the build backend spec - :param runner: The :ref:`subprocess runner <Subprocess Runners>` to use - :param python_executable: - The Python executable used to invoke the build backend - """ - if runner is None: - runner = default_subprocess_runner - - self.source_dir = abspath(source_dir) - self.build_backend = build_backend - if backend_path: - backend_path = [ - norm_and_check(self.source_dir, p) for p in backend_path - ] - self.backend_path = backend_path - self._subprocess_runner = runner - if not python_executable: - python_executable = sys.executable - self.python_executable = python_executable - - @contextmanager - def subprocess_runner(self, runner): - """A context manager for temporarily overriding the default - :ref:`subprocess runner <Subprocess Runners>`. - - .. code-block:: python - - hook_caller = BuildBackendHookCaller(...) - with hook_caller.subprocess_runner(quiet_subprocess_runner): - ... - """ - prev = self._subprocess_runner - self._subprocess_runner = runner - try: - yield - finally: - self._subprocess_runner = prev - - def _supported_features(self): - """Return the list of optional features supported by the backend.""" - return self._call_hook('_supported_features', {}) - - def get_requires_for_build_wheel(self, config_settings=None): - """Get additional dependencies required for building a wheel. - - :returns: A list of :pep:`dependency specifiers <508>`. - :rtype: list[str] - - .. admonition:: Fallback - - If the build backend does not defined a hook with this name, an - empty list will be returned. - """ - return self._call_hook('get_requires_for_build_wheel', { - 'config_settings': config_settings - }) - - def prepare_metadata_for_build_wheel( - self, metadata_directory, config_settings=None, - _allow_fallback=True): - """Prepare a ``*.dist-info`` folder with metadata for this project. - - :returns: Name of the newly created subfolder within - ``metadata_directory``, containing the metadata. - :rtype: str - - .. admonition:: Fallback - - If the build backend does not define a hook with this name and - ``_allow_fallback`` is truthy, the backend will be asked to build a - wheel via the ``build_wheel`` hook and the dist-info extracted from - that will be returned. - """ - return self._call_hook('prepare_metadata_for_build_wheel', { - 'metadata_directory': abspath(metadata_directory), - 'config_settings': config_settings, - '_allow_fallback': _allow_fallback, - }) - - def build_wheel( - self, wheel_directory, config_settings=None, - metadata_directory=None): - """Build a wheel from this project. - - :returns: - The name of the newly created wheel within ``wheel_directory``. - - .. admonition:: Interaction with fallback - - If the ``build_wheel`` hook was called in the fallback for - :meth:`prepare_metadata_for_build_wheel`, the build backend would - not be invoked. Instead, the previously built wheel will be copied - to ``wheel_directory`` and the name of that file will be returned. - """ - if metadata_directory is not None: - metadata_directory = abspath(metadata_directory) - return self._call_hook('build_wheel', { - 'wheel_directory': abspath(wheel_directory), - 'config_settings': config_settings, - 'metadata_directory': metadata_directory, - }) - - def get_requires_for_build_editable(self, config_settings=None): - """Get additional dependencies required for building an editable wheel. - - :returns: A list of :pep:`dependency specifiers <508>`. - :rtype: list[str] - - .. admonition:: Fallback - - If the build backend does not defined a hook with this name, an - empty list will be returned. - """ - return self._call_hook('get_requires_for_build_editable', { - 'config_settings': config_settings - }) - - def prepare_metadata_for_build_editable( - self, metadata_directory, config_settings=None, - _allow_fallback=True): - """Prepare a ``*.dist-info`` folder with metadata for this project. - - :returns: Name of the newly created subfolder within - ``metadata_directory``, containing the metadata. - :rtype: str - - .. admonition:: Fallback - - If the build backend does not define a hook with this name and - ``_allow_fallback`` is truthy, the backend will be asked to build a - wheel via the ``build_editable`` hook and the dist-info - extracted from that will be returned. - """ - return self._call_hook('prepare_metadata_for_build_editable', { - 'metadata_directory': abspath(metadata_directory), - 'config_settings': config_settings, - '_allow_fallback': _allow_fallback, - }) - - def build_editable( - self, wheel_directory, config_settings=None, - metadata_directory=None): - """Build an editable wheel from this project. - - :returns: - The name of the newly created wheel within ``wheel_directory``. - - .. admonition:: Interaction with fallback - - If the ``build_editable`` hook was called in the fallback for - :meth:`prepare_metadata_for_build_editable`, the build backend - would not be invoked. Instead, the previously built wheel will be - copied to ``wheel_directory`` and the name of that file will be - returned. - """ - if metadata_directory is not None: - metadata_directory = abspath(metadata_directory) - return self._call_hook('build_editable', { - 'wheel_directory': abspath(wheel_directory), - 'config_settings': config_settings, - 'metadata_directory': metadata_directory, - }) - - def get_requires_for_build_sdist(self, config_settings=None): - """Get additional dependencies required for building an sdist. - - :returns: A list of :pep:`dependency specifiers <508>`. - :rtype: list[str] - """ - return self._call_hook('get_requires_for_build_sdist', { - 'config_settings': config_settings - }) - - def build_sdist(self, sdist_directory, config_settings=None): - """Build an sdist from this project. - - :returns: - The name of the newly created sdist within ``wheel_directory``. - """ - return self._call_hook('build_sdist', { - 'sdist_directory': abspath(sdist_directory), - 'config_settings': config_settings, - }) - - def _call_hook(self, hook_name, kwargs): - extra_environ = {'PEP517_BUILD_BACKEND': self.build_backend} - - if self.backend_path: - backend_path = os.pathsep.join(self.backend_path) - extra_environ['PEP517_BACKEND_PATH'] = backend_path - - with tempfile.TemporaryDirectory() as td: - hook_input = {'kwargs': kwargs} - write_json(hook_input, pjoin(td, 'input.json'), indent=2) - - # Run the hook in a subprocess - with _in_proc_script_path() as script: - python = self.python_executable - self._subprocess_runner( - [python, abspath(str(script)), hook_name, td], - cwd=self.source_dir, - extra_environ=extra_environ - ) - - data = read_json(pjoin(td, 'output.json')) - if data.get('unsupported'): - raise UnsupportedOperation(data.get('traceback', '')) - if data.get('no_backend'): - raise BackendUnavailable(data.get('traceback', '')) - if data.get('backend_invalid'): - raise BackendInvalid( - backend_name=self.build_backend, - backend_path=self.backend_path, - message=data.get('backend_error', '') - ) - if data.get('hook_missing'): - raise HookMissing(data.get('missing_hook_name') or hook_name) - return data['return_val'] diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py deleted file mode 100644 index 917fa06..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py +++ /dev/null @@ -1,18 +0,0 @@ -"""This is a subpackage because the directory is on sys.path for _in_process.py - -The subpackage should stay as empty as possible to avoid shadowing modules that -the backend might import. -""" - -import importlib.resources as resources - -try: - resources.files -except AttributeError: - # Python 3.8 compatibility - def _in_proc_script_path(): - return resources.path(__package__, '_in_process.py') -else: - def _in_proc_script_path(): - return resources.as_file( - resources.files(__package__).joinpath('_in_process.py')) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 0e3291cf31a413546482e9ca21f5062ce6bedc40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1102 zcmah|&r2IY6rS1LXcAW=XiMp7Xe%hiELtdqYN0=JDwu*^^s;PrM|Wa&XPKF(u^^=s z#9llKMSAK*`VaJf=tc2hS-kbsTiUcxJoQaXG<xZ<^X8j*Z|1%EzS*yXgLwqa|M)t* zV<7ZhPrA+OfYvJjdniClD8PYH!;!IMV3b4DsP=V(FGq|5^Br2U8pd5jGxw0_gB44! zETV?7jyB9iw2mh-n_m_}CJB5Vk@ZUA`K#UvB^By>bxDZ|DG8XMzT%>xqj*eYLlzTH zg=Cov;<DIH1ox?g#YR5A02_MFks+_w0wR^yAf6;NN>m#pTuN4{K>|*^HO?R;^a8%l z;uR9{pkAXAa(gPT3#dR*G!96_RzgKslyISn`5*eSbN=O(5z4^Cgx=Z!vxgM!I;+6y z_15F<a@-T5E;#+%Ii;HGad%*VyWZ|Nj}DBv&7rHbOk~oWppw@G@Ras@(p_dXnr5_> z>458YXm{N-Tjea)>>i+&PI9*Gggl~7<SDu4yx@L4qOp>WqBXiAyl7G?2JDDQATO?Q zFQCF%qw$(kV-+W9sF24Gic`~$WQtC9(nu#^iQ__8zy$<>epOJ|4LM(xPEYBM3lpYX z7o<%`yAD_Sf+Y%yR-qV#8i%1v2h1CETDWymAV&pqYTwu`@09mn9^2z5_SBI*bvXU( z*nZwJ@o)(@5zdvc7=S%j1k^&b1$+qLzXD#!1~PO6o<~BjPMAW!h16=-m<1^GAJ$GN zY>jl?ZKHu41=B8mcWY;BfA#SG<Kx22VRojyVWKbXcin*dAkWD8>jQF&7lO7^iT>_^ z>CjW91gq2)EeXNJwajPPnezw!M2x@|{kY^KFijI<{L`?o^~XkdylLfd34gN&x65zK pE!)VH@ZaVD%HI5iOg#JB!kO7-2GE(**LiQ>Mjx_c<|jO6{sUmx41WLs diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-312.pyc deleted file mode 100644 index 38a18185b1426bb539557184d9bf48336da81790..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14419 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py b/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py deleted file mode 100644 index ee511ff..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py +++ /dev/null @@ -1,353 +0,0 @@ -"""This is invoked in a subprocess to call the build backend hooks. - -It expects: -- Command line args: hook_name, control_dir -- Environment variables: - PEP517_BUILD_BACKEND=entry.point:spec - PEP517_BACKEND_PATH=paths (separated with os.pathsep) -- control_dir/input.json: - - {"kwargs": {...}} - -Results: -- control_dir/output.json - - {"return_val": ...} -""" -import json -import os -import os.path -import re -import shutil -import sys -import traceback -from glob import glob -from importlib import import_module -from os.path import join as pjoin - -# This file is run as a script, and `import wrappers` is not zip-safe, so we -# include write_json() and read_json() from wrappers.py. - - -def write_json(obj, path, **kwargs): - with open(path, 'w', encoding='utf-8') as f: - json.dump(obj, f, **kwargs) - - -def read_json(path): - with open(path, encoding='utf-8') as f: - return json.load(f) - - -class BackendUnavailable(Exception): - """Raised if we cannot import the backend""" - def __init__(self, traceback): - self.traceback = traceback - - -class BackendInvalid(Exception): - """Raised if the backend is invalid""" - def __init__(self, message): - self.message = message - - -class HookMissing(Exception): - """Raised if a hook is missing and we are not executing the fallback""" - def __init__(self, hook_name=None): - super().__init__(hook_name) - self.hook_name = hook_name - - -def contained_in(filename, directory): - """Test if a file is located within the given directory.""" - filename = os.path.normcase(os.path.abspath(filename)) - directory = os.path.normcase(os.path.abspath(directory)) - return os.path.commonprefix([filename, directory]) == directory - - -def _build_backend(): - """Find and load the build backend""" - # Add in-tree backend directories to the front of sys.path. - backend_path = os.environ.get('PEP517_BACKEND_PATH') - if backend_path: - extra_pathitems = backend_path.split(os.pathsep) - sys.path[:0] = extra_pathitems - - ep = os.environ['PEP517_BUILD_BACKEND'] - mod_path, _, obj_path = ep.partition(':') - try: - obj = import_module(mod_path) - except ImportError: - raise BackendUnavailable(traceback.format_exc()) - - if backend_path: - if not any( - contained_in(obj.__file__, path) - for path in extra_pathitems - ): - raise BackendInvalid("Backend was not loaded from backend-path") - - if obj_path: - for path_part in obj_path.split('.'): - obj = getattr(obj, path_part) - return obj - - -def _supported_features(): - """Return the list of options features supported by the backend. - - Returns a list of strings. - The only possible value is 'build_editable'. - """ - backend = _build_backend() - features = [] - if hasattr(backend, "build_editable"): - features.append("build_editable") - return features - - -def get_requires_for_build_wheel(config_settings): - """Invoke the optional get_requires_for_build_wheel hook - - Returns [] if the hook is not defined. - """ - backend = _build_backend() - try: - hook = backend.get_requires_for_build_wheel - except AttributeError: - return [] - else: - return hook(config_settings) - - -def get_requires_for_build_editable(config_settings): - """Invoke the optional get_requires_for_build_editable hook - - Returns [] if the hook is not defined. - """ - backend = _build_backend() - try: - hook = backend.get_requires_for_build_editable - except AttributeError: - return [] - else: - return hook(config_settings) - - -def prepare_metadata_for_build_wheel( - metadata_directory, config_settings, _allow_fallback): - """Invoke optional prepare_metadata_for_build_wheel - - Implements a fallback by building a wheel if the hook isn't defined, - unless _allow_fallback is False in which case HookMissing is raised. - """ - backend = _build_backend() - try: - hook = backend.prepare_metadata_for_build_wheel - except AttributeError: - if not _allow_fallback: - raise HookMissing() - else: - return hook(metadata_directory, config_settings) - # fallback to build_wheel outside the try block to avoid exception chaining - # which can be confusing to users and is not relevant - whl_basename = backend.build_wheel(metadata_directory, config_settings) - return _get_wheel_metadata_from_wheel(whl_basename, metadata_directory, - config_settings) - - -def prepare_metadata_for_build_editable( - metadata_directory, config_settings, _allow_fallback): - """Invoke optional prepare_metadata_for_build_editable - - Implements a fallback by building an editable wheel if the hook isn't - defined, unless _allow_fallback is False in which case HookMissing is - raised. - """ - backend = _build_backend() - try: - hook = backend.prepare_metadata_for_build_editable - except AttributeError: - if not _allow_fallback: - raise HookMissing() - try: - build_hook = backend.build_editable - except AttributeError: - raise HookMissing(hook_name='build_editable') - else: - whl_basename = build_hook(metadata_directory, config_settings) - return _get_wheel_metadata_from_wheel(whl_basename, - metadata_directory, - config_settings) - else: - return hook(metadata_directory, config_settings) - - -WHEEL_BUILT_MARKER = 'PEP517_ALREADY_BUILT_WHEEL' - - -def _dist_info_files(whl_zip): - """Identify the .dist-info folder inside a wheel ZipFile.""" - res = [] - for path in whl_zip.namelist(): - m = re.match(r'[^/\\]+-[^/\\]+\.dist-info/', path) - if m: - res.append(path) - if res: - return res - raise Exception("No .dist-info folder found in wheel") - - -def _get_wheel_metadata_from_wheel( - whl_basename, metadata_directory, config_settings): - """Extract the metadata from a wheel. - - Fallback for when the build backend does not - define the 'get_wheel_metadata' hook. - """ - from zipfile import ZipFile - with open(os.path.join(metadata_directory, WHEEL_BUILT_MARKER), 'wb'): - pass # Touch marker file - - whl_file = os.path.join(metadata_directory, whl_basename) - with ZipFile(whl_file) as zipf: - dist_info = _dist_info_files(zipf) - zipf.extractall(path=metadata_directory, members=dist_info) - return dist_info[0].split('/')[0] - - -def _find_already_built_wheel(metadata_directory): - """Check for a wheel already built during the get_wheel_metadata hook. - """ - if not metadata_directory: - return None - metadata_parent = os.path.dirname(metadata_directory) - if not os.path.isfile(pjoin(metadata_parent, WHEEL_BUILT_MARKER)): - return None - - whl_files = glob(os.path.join(metadata_parent, '*.whl')) - if not whl_files: - print('Found wheel built marker, but no .whl files') - return None - if len(whl_files) > 1: - print('Found multiple .whl files; unspecified behaviour. ' - 'Will call build_wheel.') - return None - - # Exactly one .whl file - return whl_files[0] - - -def build_wheel(wheel_directory, config_settings, metadata_directory=None): - """Invoke the mandatory build_wheel hook. - - If a wheel was already built in the - prepare_metadata_for_build_wheel fallback, this - will copy it rather than rebuilding the wheel. - """ - prebuilt_whl = _find_already_built_wheel(metadata_directory) - if prebuilt_whl: - shutil.copy2(prebuilt_whl, wheel_directory) - return os.path.basename(prebuilt_whl) - - return _build_backend().build_wheel(wheel_directory, config_settings, - metadata_directory) - - -def build_editable(wheel_directory, config_settings, metadata_directory=None): - """Invoke the optional build_editable hook. - - If a wheel was already built in the - prepare_metadata_for_build_editable fallback, this - will copy it rather than rebuilding the wheel. - """ - backend = _build_backend() - try: - hook = backend.build_editable - except AttributeError: - raise HookMissing() - else: - prebuilt_whl = _find_already_built_wheel(metadata_directory) - if prebuilt_whl: - shutil.copy2(prebuilt_whl, wheel_directory) - return os.path.basename(prebuilt_whl) - - return hook(wheel_directory, config_settings, metadata_directory) - - -def get_requires_for_build_sdist(config_settings): - """Invoke the optional get_requires_for_build_wheel hook - - Returns [] if the hook is not defined. - """ - backend = _build_backend() - try: - hook = backend.get_requires_for_build_sdist - except AttributeError: - return [] - else: - return hook(config_settings) - - -class _DummyException(Exception): - """Nothing should ever raise this exception""" - - -class GotUnsupportedOperation(Exception): - """For internal use when backend raises UnsupportedOperation""" - def __init__(self, traceback): - self.traceback = traceback - - -def build_sdist(sdist_directory, config_settings): - """Invoke the mandatory build_sdist hook.""" - backend = _build_backend() - try: - return backend.build_sdist(sdist_directory, config_settings) - except getattr(backend, 'UnsupportedOperation', _DummyException): - raise GotUnsupportedOperation(traceback.format_exc()) - - -HOOK_NAMES = { - 'get_requires_for_build_wheel', - 'prepare_metadata_for_build_wheel', - 'build_wheel', - 'get_requires_for_build_editable', - 'prepare_metadata_for_build_editable', - 'build_editable', - 'get_requires_for_build_sdist', - 'build_sdist', - '_supported_features', -} - - -def main(): - if len(sys.argv) < 3: - sys.exit("Needs args: hook_name, control_dir") - hook_name = sys.argv[1] - control_dir = sys.argv[2] - if hook_name not in HOOK_NAMES: - sys.exit("Unknown hook: %s" % hook_name) - hook = globals()[hook_name] - - hook_input = read_json(pjoin(control_dir, 'input.json')) - - json_out = {'unsupported': False, 'return_val': None} - try: - json_out['return_val'] = hook(**hook_input['kwargs']) - except BackendUnavailable as e: - json_out['no_backend'] = True - json_out['traceback'] = e.traceback - except BackendInvalid as e: - json_out['backend_invalid'] = True - json_out['backend_error'] = e.message - except GotUnsupportedOperation as e: - json_out['unsupported'] = True - json_out['traceback'] = e.traceback - except HookMissing as e: - json_out['hook_missing'] = True - json_out['missing_hook_name'] = e.hook_name or hook_name - - write_json(json_out, pjoin(control_dir, 'output.json'), indent=2) - - -if __name__ == '__main__': - main() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py deleted file mode 100644 index 10ff67f..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py +++ /dev/null @@ -1,182 +0,0 @@ -# __ -# /__) _ _ _ _ _/ _ -# / ( (- (/ (/ (- _) / _) -# / - -""" -Requests HTTP Library -~~~~~~~~~~~~~~~~~~~~~ - -Requests is an HTTP library, written in Python, for human beings. -Basic GET usage: - - >>> import requests - >>> r = requests.get('https://www.python.org') - >>> r.status_code - 200 - >>> b'Python is a programming language' in r.content - True - -... or POST: - - >>> payload = dict(key1='value1', key2='value2') - >>> r = requests.post('https://httpbin.org/post', data=payload) - >>> print(r.text) - { - ... - "form": { - "key1": "value1", - "key2": "value2" - }, - ... - } - -The other HTTP methods are supported - see `requests.api`. Full documentation -is at <https://requests.readthedocs.io>. - -:copyright: (c) 2017 by Kenneth Reitz. -:license: Apache 2.0, see LICENSE for more details. -""" - -import warnings - -from pip._vendor import urllib3 - -from .exceptions import RequestsDependencyWarning - -charset_normalizer_version = None - -try: - from pip._vendor.chardet import __version__ as chardet_version -except ImportError: - chardet_version = None - - -def check_compatibility(urllib3_version, chardet_version, charset_normalizer_version): - urllib3_version = urllib3_version.split(".") - assert urllib3_version != ["dev"] # Verify urllib3 isn't installed from git. - - # Sometimes, urllib3 only reports its version as 16.1. - if len(urllib3_version) == 2: - urllib3_version.append("0") - - # Check urllib3 for compatibility. - major, minor, patch = urllib3_version # noqa: F811 - major, minor, patch = int(major), int(minor), int(patch) - # urllib3 >= 1.21.1 - assert major >= 1 - if major == 1: - assert minor >= 21 - - # Check charset_normalizer for compatibility. - if chardet_version: - major, minor, patch = chardet_version.split(".")[:3] - major, minor, patch = int(major), int(minor), int(patch) - # chardet_version >= 3.0.2, < 6.0.0 - assert (3, 0, 2) <= (major, minor, patch) < (6, 0, 0) - elif charset_normalizer_version: - major, minor, patch = charset_normalizer_version.split(".")[:3] - major, minor, patch = int(major), int(minor), int(patch) - # charset_normalizer >= 2.0.0 < 4.0.0 - assert (2, 0, 0) <= (major, minor, patch) < (4, 0, 0) - else: - raise Exception("You need either charset_normalizer or chardet installed") - - -def _check_cryptography(cryptography_version): - # cryptography < 1.3.4 - try: - cryptography_version = list(map(int, cryptography_version.split("."))) - except ValueError: - return - - if cryptography_version < [1, 3, 4]: - warning = "Old version of cryptography ({}) may cause slowdown.".format( - cryptography_version - ) - warnings.warn(warning, RequestsDependencyWarning) - - -# Check imported dependencies for compatibility. -try: - check_compatibility( - urllib3.__version__, chardet_version, charset_normalizer_version - ) -except (AssertionError, ValueError): - warnings.warn( - "urllib3 ({}) or chardet ({})/charset_normalizer ({}) doesn't match a supported " - "version!".format( - urllib3.__version__, chardet_version, charset_normalizer_version - ), - RequestsDependencyWarning, - ) - -# Attempt to enable urllib3's fallback for SNI support -# if the standard library doesn't support SNI or the -# 'ssl' library isn't available. -try: - # Note: This logic prevents upgrading cryptography on Windows, if imported - # as part of pip. - from pip._internal.utils.compat import WINDOWS - if not WINDOWS: - raise ImportError("pip internals: don't import cryptography on Windows") - try: - import ssl - except ImportError: - ssl = None - - if not getattr(ssl, "HAS_SNI", False): - from pip._vendor.urllib3.contrib import pyopenssl - - pyopenssl.inject_into_urllib3() - - # Check cryptography version - from cryptography import __version__ as cryptography_version - - _check_cryptography(cryptography_version) -except ImportError: - pass - -# urllib3's DependencyWarnings should be silenced. -from pip._vendor.urllib3.exceptions import DependencyWarning - -warnings.simplefilter("ignore", DependencyWarning) - -# Set default logging handler to avoid "No handler found" warnings. -import logging -from logging import NullHandler - -from . import packages, utils -from .__version__ import ( - __author__, - __author_email__, - __build__, - __cake__, - __copyright__, - __description__, - __license__, - __title__, - __url__, - __version__, -) -from .api import delete, get, head, options, patch, post, put, request -from .exceptions import ( - ConnectionError, - ConnectTimeout, - FileModeWarning, - HTTPError, - JSONDecodeError, - ReadTimeout, - RequestException, - Timeout, - TooManyRedirects, - URLRequired, -) -from .models import PreparedRequest, Request, Response -from .sessions import Session, session -from .status_codes import codes - -logging.getLogger(__name__).addHandler(NullHandler()) - -# FileModeWarnings go off per the default. -warnings.simplefilter("default", FileModeWarning, append=True) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index e9269365018d630a74f0485a59049b5a8b23ffad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5475 zcmcH-TTC3+_0G;dW*@MI#bATI3}6gv!!8fw2QfGpgCDWM0TRojNSpD_HOw-zv$->C zf(@1HRw_-ama0;N8mV%de7LedA|)UGjHTA9)Stz;1y3EtRU1|QBX*)h&QH&somp1K zN<Z2T;>^A0oO{l>=ic*}{c~Aa0Kt>`&6TOnDun()C(gs!gQvqRLhm982}oijm%<1P zyjjJivI5H>$t`&lx9Sl*Fm?%EKjrc&K9v*vfbsnh2|<Yi81f?*!a>ZYw>T;`-q?@5 zH$e}57-Y!^C>3g@P{|-%sdKP0AO&wS1&(Ws#o<ySLIfyPI3k6lGH1Qs3>K6tTh(fz znxQ(Y)A7Q(Qh3vzfQ{7NZD8+qi#vq3J9;cySgBR(ggT4Hqz{(LD2$~oxbCK_Ft%2> zl%2v(kXoVaRHH%^aBitmsaJV{R~v)|YaUTJwNYqPn}jBHm#|B17Mj)F!fv%iXi-~* zRy8KX)IGu;u!^(ztCYQJo6x4V3+-xLh^q-9p>_xzYNybtb_rc-x6p0zZH2SgC+t&u zgdTOjuwOkO98eDm2h~HuA+=ZNRbLWbQV$D<)jpxm;;&Zv)g!_Y^=08@bwC)fa5c(N zbx;^oj|s=D`8H)p9TtWy5A00;Y_kXO3CCmUUv8$t2}B)lJAB{a&Fy%<RC}w=IZX!5 zx|-nhcOl{hYg~f=JX&Oa+CGEcX3wJ;254ot{Gto!UAENdW*a1bx?wZ+Ki@^{**IBC z??{Q>4VxksZTLBwn?V-7$-&2Vh|l1n1jg`NIjkExe_~?dEPq<QKtwVd_}+`2zy`Cd z^J1p3L@6w3<7bF$7&ybr8UF07F{NeN_=_6hr*bN=Ucho@QjZ6Yin^TQj}J}oIbEE@ zy@3GF^Zot(ysTz5V(`Q^$3YXmuZW9JVxzTX$}qBeZz3@>GZW8Rdg2<HY>5?D#C1b7 za(XhQNthzLIyxNMg_eS4Jhh+C5^a)*stT6zikO+qfk7?Qd=gJ-8Q6+J*G-Td4g})y zI1igSJ32nGVRKfTRWwlo6D2uiv`*vM&c2pQqLRa%Ep0qZyX<LKiFu_P%4&Maj_A%V z$Qinw1f_rsNi@VhTTO9?St4hQRuVVx+lGa_Lha;vu(2>`1i!0|y}XU*`9^9QAQ}tC zHMSM_3WTmAp{ucgpSS6@!1+L6VhZz`F@;It%vB8MD}fIQ=Ji~bo*b6=c3#Jrf73a_ zxR{mSjPt`eMd2kal~ci?q9JRU0QJ7XA9hZ%xPV|$0wut#$7QWQ9tiZNwCpUAC#Q^F zzBLttv+O*;Uzp`z!I=!$z>i_sxEv4kDsl>Ebll4iWW^NN+7<6;v#dFNa&Ty5e8{?q zss`pt*brp}ZsKDagCjA<^yP>Gm$>^e&FC=S?u5iKoW&UlXHv80M3RA90>of4c?lC8 zc9Be`>>^<Wvj-rZKkbF6dKb;1v|S)9stqLOrj4Bk4#_piOdmi<cb!7l7^5g{4mn&B zJKc&9sQ_tI{&SDycK8^O_6Dq<XXoAX9>eD_&an<h39h)R1m|)1<~<;Rons}>^c#+4 z){NTWn{!Lv5<EjjTxgC-JL*c_8#|St@YeoMt&_MpcFsNLxyYtmZ@Z>z!7{Jpp9a6{ z9_mR3Q8<g{T;$B0>$}h4|6pC<1=a;OTW9zkcS#|~``4IQ*~l{{Zn6@-^qAIhlj$IC zct74s0lgwImXyJZP%5D<Q;dD=Eg~ouI4HirQ9wMVGByyG51iL>d<H|%LIBaQPECnK z$3`*(nL||M%YcG(N3jqvkP{)NDhifj9@C>|71=OZ1!qjJn57|NvXGEW|IphhoTULC z^O|8hsGMjq!?vs<qIR>&BF&?UX^og3NX_(>6^+!CPB%%@9M3;95>uLr6RK$FmlDV9 z+@dE8tYDha+jT=uO=Hq7X)_s`p)pBZ!kJ462=hdtW^~6pyArx=;C4tD(~$V}L{`ow zz=DjVk%W_y63L{Tk&R>$N{tzT%#xahx}t(X@&y^(FiUoTRS?5SKM9e26|Ge_uU79} zuHJiNaHYEA>gZaqb}6?sc`w+UcQ@yQ&0l&E7hE{9;;UPF>z<Ea<7!s9=rR{w((iLk z>t0m1XW3nIb!eeyvH4-`&L#Zbo)1ztn%_@<-1H&-XwPEvLeJHqN5L(N1Ml?a-CGxW z*L<Nx=Gx`8aMhCQohx~+cHznwprU3i+P$Q$M!T1z-5(CFL=WDsyxowG9$x0^7CZ~N zMf@<@aJ~7x^sS~F_~xFEQ@5KxN-yGt+=Ay(c-zuz*N1NO<ac!55BGg|@?N+v&-E=k z@PWT+EqZV@+P@s_zpbxC2R}Lb$*cM3@&8`(Kg(<K+g@EMAIo!NPr;)oRhmKRCxDe- zAHv{WXv>Wvbt7{c^qN}_<Rz4*H|Du#BQH74loNY2BTqt3{vAVOm9$B0I{4gTm~Q0e zdB&h|Xg%q2XSDI2V~pa*g`*1^Ncd|)hVwy#pjCtqm-B!vHfHV-Ldg)tR?u3(9tOna zeWQxR+tr8HF7hcdn>A<)lbxF7Td&N=cvYO`Q({hss;p=;^!CSNe$%bUIs~jLW=RC( z5Nehgc%AksLxezpd1=2O8YVYWsB^mMrXxaYPRwOil`1O6sLx@h8HVRc9hDkM+A&gM z8fgK_>+r8@0Is5SH|q&MtZ({Y@D`hIKb~(NSZzPP+<yE|>`MFTm0f36>PPb2j&%-k zJAN(S^R=v1o>;9MU9KEm3-M1`S0u3DgDCP>{JiYPWs8&d>ks~gJGAacT<bSq`cSC) z31U3q2VD6&3-4!o1?apM8>mNj>iq+I**kj}fS1qN>8aqhl1xY4nAn_|3Vf1=^-PNa zZialsizTg(eJTyKoj7-L<k;xB@yp$iP#|*}m}Epn?}Z+SuC@EzQkU{thCe4m-kH%& z--&_o<oL+RVUXm{&T5cebzOl;#ink=^vaWv9x?4oMxe<$A!Z~66F4x=$!Vr1XF#(P z3z&gqQp`cqMv_T$OL2@<=!F2|PbM$qWJQ7@2Yrn=jbT&<Bd7a<X*ijbu%05amEr*b zt&rVz!2~22vZ2s*zGM=-n@kcKelgDUN|2TfY_ib4o9-#-@l2m)3DF7EZe+S?vum>1 zoMHOx#0wUO2Q}#NQna2FZfUuVn2=Sh0dII%R`3~U^6l=-^wUq60&n=#_~^(nOg{k% zh~OCLbyjY%JG^4SGJQqTgr=PlGqYn@k_l+n&ERWerzt;7r5J05&k~%4zE`qkm_BE~ zjbS~jK^F=q;2Xy}Z4ynNUKqe3d8jpT!V<nH<`iQh#*j+tp;Odj(DQ=Fny5R1aBt#v zAtE&8nE~unR^5t8QbVzk627=yT`ixJYD>&X>x;_TzE!2HI5f)#bRCnTS4ji#l3f%u z(p9yVQ0Laht?L6{L$u-%XaSMQ!gVx#aFn895VNk-20Ny#k0%0Og?lJ}M9!qak5EPp zjou5|X`7+a>ra{~U-U(iO7^{%GKF*q9|d2O6^JU+r)ZOt(3X>SN<)PHvO*FRbWqSq zK^Fzx6zrp*hl2eS(3(x?FDNDp-znq}o%T}j5(S4TpqG>MQP5Ap5ei<WV1R<76bw>u zjDjHwhAB8s!3hdZ0x-QQ9J`{EQxx+G1*a*RvoD5D&QRP4#f3_~Ty-)^QGW3BY1k%g z7a}twsx-m^q9obT{(D4r()Bd^KI0C9uAGAVi40R(AN5-RArmsp7oi5m{S<yUVYYmZ z>OV)Fk9IcXQ7t56rtVYs(I<f&%sBI;Kgjg1M}v&_fxBjn3$Jo@P}i4|`S^)1S(nGV z9^K0Lzw#na_k&>NgYxb9+R>Hrvw809x{LKh{>D{)!J$xOv3tpXz2|-~_9=Jh5!bxn zU*(#Yx#s&^3oP{yF@NXk@;f^2bDduW5YzVvZN18^qOHql>*7?N@4Sz?o_Y}z{uI^! z3+?>c6=YmrqaxUbnB&YU8eT!eFCZOQM*BZQyJ6`gRB_d}iYk^-#bWCUs#`_7m(lLu zUU`51KI(x!i>WRum9N*|uKFwL|7QKT8*ve+A57g^b?pyEso(0pU02{oz?!8%-q-X5 z`55n-yW;AJAD#LBnROTAk9-!{{)_!<p~z~eemPWsy*}S{8fsKk095!JzYcoAXDlrG zcD)saYG`SStd&>(gr&tP^6mOITOZVDj%xEi)6c=F{mOgn2ztM2s0`iSGF*f1_}#;P zbf+u<<3Akn4F%Xg`WXt#dWOC1T@OQ{-#1*v-rd3i&)o<^$5qz2#xu;bck3B|{|4aC Bq1ONa diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-312.pyc deleted file mode 100644 index 5ebf119a570aec37d47c40d8bf7d3ceaab3ba966..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 606 zcmY*WF>ljA7(FL#;y861QA8w!gcl^D5?_;U6+$2wDj}f?b@Fm@eIM~Dw$Hsgr;1t3 z4`60Nu)>DK&tPG+GQuB-)U6X=T2jF`+`aei-s$_^{cv4}U`3za#@{VMey_;7kYCls zBiud^P6EQMz~YUd!J9#oZv-2BGuY&<pvBuko7;iSJ3(je47v+j!C3*?=(2x2H?hpT zqmz?k?~PR6QIUq3_RIURF}XgZbbZxV5ONa(myz~`EL&s$VC3%$GHQ_0eF<3xCiY%~ zFlD)$!qe%sqE>=0)ueQu<zW<qH}?0-{&Shnm6*iF`_EZy;V{2Ge({!{-+%KEyc#%* z4r4}`1Q=WFFvdYgO5{e!423phg-Q@~8JmI9*D5+r3z2Zt9mc`}M^uP=HyF}T{B<QF zf=sU-cNvS;Z6URhhEqKFN-kDOU!K!gra;rs=ox(>qauaOXlfvVi3-!9HX@pW8ghA_ zB{Jlo=nS$MO~fh9uVOy%M`NmmfgwgQ4JV*!E^>;UXI!eAsOdkm`1$<Oew<2PB=AJ_ zu#eTp>qA_YP0O;D4srWcr@pmU?bOa*)vmYiRNZ>(Hfrv@%BgoB{v^G6`!0&TLFLxn K2k&gPjrKpeUCBxS diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-312.pyc deleted file mode 100644 index 43a33448d2cfb36e38b9a8cf02717beaa13ea9dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2046 zcmah}-D?zA6u&dGUzts^i8V^1(Th!^+tw_NNFjbeY|?6|8aA=us+rEtoMb1?&TQ|! zo47G8Qhd-SeJB{A)R$5yLZQ(A!k2+ayB+!vD1GoPZTe7r>bbKY!PL+TbLXCOf9K<# z^Sk$1SC>w3Sl`?({SqhScPX?+thw0w85fU;O$x+TY}Hi?imll(S1oG=O(7})Wiiz< z+Wy<|r%FRA#COFc+L*+ym}DE1+!d2*V^WZS)Vx~gfH)-auR|Ji=!6bOEp*vwyW_4> z=(hE{q>!np+0K<8bOxVQfeSujIGzCJnXXY4j?48gUKzSR&HN?D22SO+BWiTM>RH0^ zJx)c*6x3uuEtINduxZPeTcgDq%{OD{%O%GuQ5!1Y+0^$a+!74RfT(#`mQs`eErDAB z#_2I$MYze)Z@FTMto}ll^wJAi*{l+#i&e)Jj%RSecrWVauFZ{I=Qrfcu6sA$9$M-B zkBVm`@cPWPxh7_HZfGU5Lt&{1Y7NN*4Zp2voE{O;>?<LwM6_{Fn=2MuC7-LS>J08K zBByqaRi)Ld1}dwpJp0I50*{&$kKuR=)GscACEleB7EETlz&Z8jsi;*z>O_@c#Z6pQ z7;x}}DSLnjo#Kc((e&eZC<65mummmV4L9IfzAa;!*asV$!g2{1L~cB=Fs#XHBXqXp zU^p(@%IWyb2Ny2Tsuv|Cd>5ODA=t9RVI(rlYN76M$K%5EEMT&9VIm3uxRq#R7N%P9 zL(Q)WE{lt~zr39*`DMtJO~IFP6TXEZJ;8GVTv%Xc`8XGjbraZe+h6uv-?V|{uy9K` z*D2;IHBs`t6C>}9=C~u^c*V4CnhU^l6{nIj5N7)<*W!9^2iHd`wXjF{Mx#`cPFNe( ziD~uY$8$K{A%E*6wddjR*Y7+}4%fT)-qSWyq%(78YBNqUeGkg_%WLP?yWhH}ZKS*J zOl_eFvD!>Qq0OR26#kDzT%96cDjmCU$Zm5;AvN_)A`&v197BZRn{<`bv}JNjyGoXo zY;5JH3BY?*c08cYJT}k4cDMQ9dwBWq+6oh!*6goUGMQ<i4Ij~?u8vhuQI-^<)n;|Z zb~+M1wMt;!9HAGhT+kx40FejDP02OS7j!ym6&<CYqQg%cycuJXm}9i)`)*_q#!YTH z&g_TT7?Z~fH3Wx=h&T}Lxzaerq~tM7GUhXU4^pk<xGX$nX=&HfJh0(#BXY_1qIwuV zK86$awVQPAdszBbd!8N&VnacCXj6^F`|7El2bueswdC^@t!Li&=eP9WUqp%b{hHak zsp0=6m;CsucbI(FF{=HjjA~hh$+soj6DAGA_ASE*RR&?A@pv`vLQ)Ej3*mtA$@s?? zCXDlw;}es4<I?!WNh3dLoVz+Z8TP+^Z)P?h9(Z*NeO%eL+u^glDGm3vB1K`xXD{bx z45{D$8hw;RyjT;!Sr48l>}_VbZ5v&VsFL3k)`gg;*e_G3%f4N8;Ve6XI@tyO5GO2{ zqWq~Ql-O1`QS?8^;f=wgYxyUI$A#e7nf1Z50U4+t99}#3Wa{x$aP-vr!P5chuOB+L zR(!JfcrnPHUO#juAP4H(R%7dfr_gF+;6!lpa?n2=kbU(7CxiF%!N5#F_HV>Gg7lGk bEE#kh-i&K~YCw9oI&~$pHPET_MH&AKFuybC diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-312.pyc deleted file mode 100644 index cb63ce2146a19756f49668e4a9a423e916567c5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21302 zcmeHvdr%zrooCOB8JK|qhL?CYNCL(ZgM=hwV=Nm1l4VIq5h#f#kMU@_fkE>i-919! zLF-GocE?#~EuVK+QpH)LJy%&Sd+W4&kM%w3)_Gl$+p1j%c$xI!ic+VmtNd|QSaL48 z`2M)h_t%eU(D;$f)?VfATH-gq{yo0G_xJtlzb-E?<M71(<eBOBPjcLUp%>$E>5+SH z**NYhCvag-unG2rEo^7Mj<5s2j)XJm3cHde;Sw9=JMr!gdsy6scxkwd#Y+(PhP_E& z*q1C1mnSR26)fG2bbq*##XX2ug{zX);cE6?iuXXchQ-SgwaL10U9vu0&)&U>hUAWL zBa8bGZwfcDczL2Z*%EF+yh89NT9a+zHWsf;@X7XYd$J?k!QQJ9JCnP@yI8zBu{+rr z?o4)tyU^d#WOukb84L%L4}>2;-~7ov;XTQ{;l1cffRzs<dXk}Vh{bCXy~%yyeJoy^ z*q`hR_azU64<rwU4<-+V4<#QAKbY(f_a`3;KV;)dX@=?&4<`r01E|pu9u#(j9~Erj z!-75hn4LSu360NjLeraeZSKR5v$STUwTO?u>CjV$=IuK<@sVAeL~~yM92XvVihH4Z zj=SV|ikq_qTNj=$lf<uNL|KtTQ6W03h>~1(dHYjVHZdKS`D9wiBt$-zPASoNO6HYm zkyoT>N}f$i3U5?La#Z2Z>QMQNETUwZ7sSbUN-T?}1U`w{1c4x>#F!FKr{qxC&#2F1 zLA&Z7PNZc~IFn8%MkOgNsexgw+(bMnrZWml4BFJvCnhG&7%%0=Qx~I&xbTD+6+|iM zRI5*>V^ISA*=QmoYJkd5MK7Hd6=`03tsWESbkHcL7da!Pm2^yR8m*Ke;gVJXeXBeR z_||@?<!42VKP78Tpn_+7{G`?^yXvJuoQkHRQ=+6+%o3!?q?ArZGExFX-8v*1%xqMW zMLpfcI{7o4CJtHt$oZ%ok42&xWjZ1&61q`_6s(yPPfe*Fz+#nAv`)N)1&Jw<SUP<n zF3J%l9hr$r!7@y$IoH}iE4EImRD#A-zdnm>%;(OYRE=pJk4=los9L7yBTMp91+Qg3 z)Uv|dN)=k)J;v;ybAe%W`Z#7PCC8QcMR6n^Q-W@_Ze;Z6(7BTnk>R1pk#l1sCr2Y^ zh9;g+YmBih#AjzkAu=0Pre(EiN>sF&Fy>L+K}ljNmKHD_+VoDdT_CFsvywO~ri6%0 z{TCzg$w*2R1yN9avY5cui?B6O%Q1)8pi*>-CK-LL8b3XJVw_EbzI-tZ$b9I0`SEwJ z0l`&Hp_O8fV0%-Kf7KSWk1ceaipw&(h3!xMKrgW>{A60<Sp&SBnWe)M3fiP*0Kn2Z zqtcYDmRy*lUzv_K&;Ls4olYmk-egpfFZPb4W0|CwQsiC*W0;bn$sSpW$1aFckC2{A zCDL>PdM}Epi@k~X`QF)iWjdWY5Zd3@i+LA&W}~qS*pG7WY<#vif?`5i>NSu+uW^b) zv-46Ajk9175t&x>S#G1EX}NiHwc_Zq=jc78a7TYegkj6<=s1bH*N2?n!~BR`*aoTq zY7lnhxJl54=R9F2aGXnUJZB5L1Sc?4NshZ@3%kd;V2SEIf~_*7;iHAd3E&w@;3rIE zqvyrUiAPJcDD-!)1Hm8Juq^o1p66{@?&}~^Z|d(hZk~I?M##p66~Ni_L?ZE2T!}<z z1+X<H)zU~LmWax7B%&?Cvr-Q#ONS6F)L6O~GHM=24x6N3VwODR&%0MV4expyr4Z6% zZUn|deP;cn8MXEjTgDb0M%FkMMdr_7??xq2&`~L$K0kvU8v<%oG7`|QakPw#vNB$O z22d}W<n=`z;AsK}*k}fx-VSweTf*U|`ST*}Se#QOv>haHju=f2@ZITI!mZInkpJAY z2tptcj@NP-UC`TR#G)7=MZ@J=AU%<u;}dB#4N!B@xWdi}5gA#OF6u2{X3Rd(XoaW} zMTc>sM1CrMkvg84-OER1KFUwxC@6b*9JVMwAc>O$Pj|;OEXeE4@7)3mLlcagAU~*= zkuf7mW;P*OCPSH@1?e+}z}lf^STPf%z6$7hd~$xvKu6<j#?Wz)2Qix3%YzusO~+%? ze2n%vhK`OZQaT|cS)1NDk=G!Z@M-vk+3Aw`iId}eOq7)PWE`YV)JLw7i6TuTGqQrI z!{iWZ-3m61)Zroid?qD;;$uBP#?2D?z^JJ$!x~D>Q#q*zNcCbISe6GVwDyPqp+QAL z%c5YJPi?;vE(Uts0&@b(ucz|@2nKCBX`TQ@XJ->ELUW*Rw*tsFKySv<%JC!?j*z7& zXf)X^J&04My7dZbiMD4|x4xQci8jlslZL0d^|oa?z%=1_7$P7nkrEavt(bsPz#DTi zVZ>*-4>~x1$Fiqg!vI!H^|2UWp?#S4gp7S`@Kn4!E5>M5u`|S^9FiVJ10WeR6q$hO zeR9Q!b6Tjfc8VoMsGtYIv)rAEcB4;kxQ>oZjEx07g#J=d(8q{c7KvzV9^$@8<SUtI zLeFtWB0@SAi7*r>4FQ-mj6f~d5oJtFBqEVFY*IfpM!kAmLz(-jC<R9;gUH-3pW}Y) z-1ULe=4#sXa1*xA+wM84Tpj<T)9&hEv&D+XP||#ydhFisBC?&POmTw!Pi<kR=)%7e z(LL#8RL1dKY1qSPOR3-jg(*XhO(+4y@d|Fd`vecda-kGqg-|J!A;&Lx@m4AL5LOB0 z2&;t(gaJ^iD#4EuHH=Qxf=*SdUSdIYS`>W|eWdMrJ`+zUJvh;n$?Lfcmx0RwMLrPH zF!dSjln|zx5>uiSP4sA|AG=kWjK)M(=d8g<gW;30`x!G$*a2*w)&f{+b~LHEaUN~R z{P}r4ZtQ$QiF8EnBc4DydP5;l2=MoeLhy6(M1sM~$XI+FF`U>KP$P~I!6i@zEg9Fk z#1HBbU`h=J&<5e_X$@z@(l}G#@EKGcdCUUyflD>{e~n0`GRgC(n4Y9z&{SDO1fHsB zqmP1{(~i0oS~7Y`jxUHBB)r6vnIvC;Xlablha9~KM4MvcA;??cp>{-qpun&Zt?B*X z^lV;4XDq!mk)%AG&Ljjrs^G-Vf@%X90V69k&xE;%4NRvr1U4CsCos7qW8)xy=?j@z zc`q-g!O$rtG;8NcgetrnWC(RqBIcRKrXx2-JU|y2jhv3kCbT3tL?SXMO3SH{*ARbX zo}{#BCIO;pZaX23o~F_YfI@KMwZ58=3jL5n{P9VCKAk}~Fc`3<sZ1g&8H9|dJ-}K+ z6#@J|?PRu1OjsHL1fA1biW<WJ=}IyQQ{NMybWcBhmU{EFvEOJ)X2GnPu$T-A8C3yE z-?Fl7-<?ljb_WWa3+A9O5Vp^Fefd~Pb`A>#jGcT=1{*yvV6a_>4<9x<YRtdh9m<jU zM~(5wA^o^?2Q3An)&fyo6c1VOOSffHK6=1fRSqT7nUvDqHLWPK1HHXn;D5CIpiA{y zs;MOy#bkU+t%__ve?a3b38m=}sb1}sjX!26cnAkm+=0J){|f<e*;z+{&%V$NR3A_% zpFL1w*xzy(N{TEOF+>9{)mSJsL$c?#C+m2VNC+NltvJ0Iq<~{@X5SQ_R-WUYcY)h) zv2y!a@c$8_f9%QH@m6ZSIq}AnTa=RJX6lWc!Y}IEv(C4ihGK=}hoEarqTw8cxacI- z5iEy`%~#N;`VFD>?C8YV<D=tJ041eU2viRfT!DL~F?ua04r4x&)RY9$K`KW=hIE>O zGZcIVfm+Gr6Ivs^Xs|?MWh(DmN}qKlwMNTW66>8tpJ~b&H?u{qv1~U}uK7Kblrsn* z*KAgBzWP^sf8-5rwC!5@%*}IaZ3l8A@A{hWwC#HJ^7YF%FRZo=<VMzf&H1{9obv^5 zzNIbaT=O*E(FGzzZ@2HKq}F^(kY(kYcGGXeZI5r=)3V}eS#Ay8^1buqvZv);&*}S_ zCt5hR0Y8rjwjVcx-|f!`_o6Lkk8?5mmnu1K(U!Fpwp*6VLK-!e@@4xA)lQUKw2dRQ zvDh3Z9RNhgf{+4%!6it6svBwsiU;l5ygOM2?Er%%1iyqbGD?AyT4>lhnT4EhqKb@z z0%j~f`1oIq{hP7B^Pjjia>e<FQ`dy0k(;|#>v~rzdw=9VvFthVKk*~ej(@SX%Na9| z4-#kv**yFWB3HG;fSC5MqoE%lY--z#c}$EFh2t^8eW{w`z6jWh_C<$cimI3=JC31# zm~Gq(HBOps^WYR9A=NxUTT;y<xh0k4-fhoYwn95NTJ|w%0wsbTi56KqC@#kPs%}|Z z2I(ov*?LHVPHkyiYz?HRQ9^Y=EeQQ4O(E@fjd{mP0nA6NR3T>xmE=hT*!d+~E3fTW zZD-$Z;$MB_`Xk?X^e$&B?Rx%1Zsf}D4PW5O$hBQdu6KQ%n+_zSR%yAmtMk6fbzjGd zuVZOseb<94yB>U7SU)_ra(Hah!IifDoU@mfX?vY|YCN<Sq-VSLSp?YYgvN|KS{*J@ zSYrp?%>7YVMZv+47c}s%II_;yY=1y7%r@rjL1(lM)s92^5r+bG0n|Qfa$jeFZgl;Z z&c4wcYRX`UrD?&Slf)npp9qE##Gf!6lLSFl1#mq?p27DJzhhEp@zN}5c{RQmGB4!Z z6x3no83U>FtY%?@;j|nne$b$@rsCR4Ee}6!>98TN{>JPkja~<)6UyI++q8gVsCj@t zLY#><7pXMnQM7U<SQ&70(TiXgqvyBiBXs#0s}<1{hXed5X@dC+;{04%0vjq#X*xq% z7AQH=V111RXIvSrG;c07b&Q^%LoEdd&3FM>b?al6&S4LZy#Wfi?fglk6IH!LYYZag z(oUq;!ahlauo(=ksNQ9nP!wxb6C3G#FEm?LJhYtx{uxThLkMs@Te*%NoviHA$qGBJ z4R@M4H#t{xS-!44U(=MYu7BT+H;A47#`jAR%Q@fmG-xN!JUswOSdN{%|9}&woxEan z<{~Fm6{kR1+YW$ObYvalgnxA`iX`(fl##`7b3u<Roi3c^tf^gQ*xI@1QcP@|wN2Wx z&Ma7;-xL=M_E%h4J7J1THuS$Jea+eiF%C91Zl=l{k{K!Vbg@Js-iJM`k0t*AJ#@U{ z{PaBphWlGAA|wW=O$(@v*e-p;GbBWk5HyIuLX0D`ppV~He8<M2At)BrL_;<U78Jj2 z9ttWnL$+r8>8C|2nt+i3o}&3YLv`;*D^SKV750EuKwpIdwwFl1I$$hSh(Xz22%3AK zN*NN4hjfmlq*6U30}{TI;@EEmJOgu}&SvX|q3!u)jL%SAiS!(d0cBteBt@QsmR8zD zfPxfkWi=$3(!g7CL0zTjVsote*pH6W2xT(kpY#<fE>S=g?^h>QY1Q=N5$LlQTCBM5 zzU=Q4m{RO(AioCAS9N7%y{2;o|Gl00y2kao?v=Xko3$%-y}4tXA+EAMSFzc{RRmuA z!t-DF{V%PT?_Me2y)?B}9@=Q{yLD)_{oxf~Ywn3F(;I!m`O4Z&hvz`W?H%oT{BLYs zZ``-ixG&$(yx#D@O2Y#TeCJAC=lkU-1(6`o_P(EDoTt1ZckGH_X?(L=Yr2+eX<u&+ ztu%*jW>%XI<xXw%J<i&3qn*}0AJ>Q%MK*oZNIAtg_x+7jvqm%|Ze?_d&0#EZ1wtTk z`wZr5`(vWvA}HE|hM&zkq|1VR(Uo-wj*LwLYmB%{_A6$KiYdn$vMZI4+7wgrEQXqA z%D49jh}C64kSi1-s_YSf-oL?p({AK_)h4*Iwt`&y3GJ9@*nqdC9S=x{tsn=dTG%_0 zK=!0+g%WF9g56r0y_sdRPU&wIqJHejI+aEvZfFAJ+N@J>QxQNh#Q~&w^fYtKsR|G^ zOBvRZnG3>7`s8hoH1r8GQEbMGLNaDrZm_IEY4KLKt_;ewZtE6ar6Yf@o)v*qv}a|- zTix2Tc{}|JdZR<&cRtIEQ+#y0rAF5XCqE67U&fd=1otuf{Qn^)U!!?NRLGhM71lw} zjyTh36Oz}|k}&t&NBaOmgQd$FV4dOma9=T~Hkpa<|0cU0X}yb>@3f&7W<Yh3(or6p zSQs8=3U87G;pqdB1JYbvAwh*1CWnW%SOPW6B3UJw+YU294)ALE@aWlz$l1})oI8GY zbVMy>uVbgjMwzNjs=*mr=-<{5F&f)UpXfmXa_3gy3%wsv5kgYY3c*T=RGShhzoeZM zbRbaeX<2oW$y6;7FU8?GrMgd#Yfd$#WHf~3;48A~ipxSAjs>x3gc4=dtH&agTo#8{ z2-u7i^6ChvR+GA|deEN;#S9IflY}SLfz2o#rd~Wo6+Emdh>NnR%F~q_UY4UR)Iz<L ziLhk+cfgQ8Z?X^m7axB9;opB`-P^w6ZC~nI^FHv##oP5wxhJ5(sI0p-vEpyfH??2! z{4~(C(bT)P@91jNG4}Ra-|PK1`d>eM<M6HSwVjV_)U|BdZS}kJyL*<NgbJi~-#v$; zzIu~$R8?=5ajiYMkr&491ZuDLztn&A(U%@wYFG<AkmtLvIRB{p_Rc+5obOihw_CcY zRKA(V&#8RdPNq=&sn@>|Xt^f5_T*ZiH{ZT{DSD$GDzl0_4@Kk+Hv`bVTTj7HdEOs* z@$%O$zjprhsT)(Tr*5QfP5kAT|NP5qog;-#24Da3jV~|nI!HZz(9%;6S6TDo;@1{m zJNx?QZhVdk-5UAJQ-6MHZTAsW&ex5;BYZ#kt>inA<(hN%9CjL@9RqZ5ox`@=;^q#{ zSE+F$R-S^CIrM(-Z!qmvry+v_f%45PpJlF-hEgo+D5l!kQrZzWRhkBEKrP~c*rODv zvt!2OM~qx319i>_bxbaX)PIqJI?yp=QtCpz8DfFAJ*Z{2U={vm==g4X6x#jlF?a*1 z9aOAH$r+QQFlum|;I#DHR6(YyibFuZ%rZ)o0VV4w#zT<O%$R)}Dc&5B0@ne-H)4*P zgy5hn`mZs8M_~Dd;|{z{bY~mWMW>*wGLm2`)u|EFmYD*XNlhi)uTUq&x<TqwE7}a& zYr-R^Ge}DR@QOCW0A{Mjfd4eAX-va57bCui&yk^)(k$VMCO(=|U=Bi;NhxD1kvEE( z&QJzZGN22Srnc~`KCdQB@&Sn|8F@@~>*C>pE2B*IJQS>wc<d61RIaL5D+HT0Oxx|0 z{2~RrDbHhgAF2*1I;WPv8YHJv((h7%uTcTl`FTZzSDzrV>f|-3x^*8-=@EJ>D=5ee zEw%$)Cd-mMt9p##ZPQ~{kgtINf}^>hE;L%P{norr>`(dMp(!|~)NnP;FAwBAACz!> z*OGGc^S6}Mw!xfd&C`se=H9pFZYgg+^#l8A?}^o>la$_o^p*#2O|L(AbmhULtIfwK zaYr5$!t;VJ-`Mf$-s^kU8+%q7dywG2<E_0CyE^sK)GL`a@9un4>#P0O`(HhL{qW7M z)uz7O6JI}hTT9D5@xn<!E^WJZX}zs?rLFf?;FhrFc?49axsA1(Z|$JprrZAdod15D zYD##07@ifUvh%Ae^hgOOowZ;~D8mhG1DtEhZv~s<qBH9(W|fq^1%;bnk;9<UGVv>> zSbr?=AO{we^Gt=_VoA1SoGVBf76qC+>n^5ZGpPm?`ZF-#Y=1sYdqGF^1x%c#8nY_? z3%hZfZj9Jp%>b|kA(@BilPv%SV*1C_{F{6{x=&g#eRzl#I9ZFjYr7NL5Pw$p!hxsl zJQ!MwCmMWJNH;_N91Mr0$)yCw4jtcE;BV7v4V%^o(!HA#s5*(EUO0LNPGG>+@N|Je zfN6i2=)oUX$dr<dCV<bAkViCc5OOtv{Uxb;8xu=BotEKOTqbp4V@RD8&?W(Rq)SBo zq<MM|6qed_O_#_7u9m=LNjzr)FR;Xsvl+u?(&H4nhyY&eOgTuUn4#`@N-Tjj0!9Yr zZ)RX&&FoeIh!&@xt>|iN-U&iiuK*m-RW(=Da&3I6Yqj!$oa?9F%8i=6H_zQVx?1x{ zZgiueeQEb<LwD|YKG1yi@IO7gQMVf$Xzigb+#D&N`c|4r)7AWN?o>X&uLlmU1P<OB zUkyB*8-Wh1vL@&Kpp>g?y%u}<OSz-@>V~U5FZI0Kn;Xst>emB1R{}fN1N|$3{<j^g zfx+C!ZGRx=)$kE|YCgojF&^)a5&0<N^v4+kz-w?bCf8=d<z`GitdM440L_3)M(&S? zOa|O}xTP=r=|~&|0}f^6X%&UnCi4V?H!nPRAr)Ix-@_S6g7;)%UUyw$-h^<%BHb=_ zt*(@1n~>nZCk-0(En3}zi>>b9N-l~(H7HGXBJAM8283sgv0=tQ1!?1{@M#pIlBS<6 z(QLW81)gm|-9uh884aVtLY0*Uvi?rfUV0RHP?h?aLAC+D+3TLx6;JD$htJpUSg-9` zsqI>?4XxCMR%`c>Nw+aKn)g+`c;fjJUqAIeY`MB4H!ZI5n8arg4QwSoGge!YULFjk zNsuf=$5yQDoBF0IMub3|9G7g83tPo0*e<}`a?u6FWC@7eK?_{dfu<OYVpe=(J1r8y zDMHQ!6C&EO%@nciFG7hZ)n`lOS}P&@xbdNe2kf&miaSl*>GSMX5N$4C6vERcznY9* zF#H&yT);*((W|**;C)6llkiD|Ult+Bf*(6_q;zI#nvZHOlMHRqmWGdICXpb_%ELhp zO`70<O$nce_|qsQ&BbNt6X2VsQ$6OoN4+Buqzk}ihT}DmKTZ^-F*T71j9HMj5X?_u zD&I~hO=$lJrgD9He{D9tFy)1#yq&NPZ6lxB-5lT|i8rD|)QC<ocTbb}S<r*Q)q|9o z(;_{CgLYJ!MF?`m$R07@Ix*8g7Zf^VEW&*%B3<N*6D-vT95Les0w>+Xt6CqI**&2+ zZXpqICIt^&nNzDWbhjtM3{m<`BHjF>w?^&DWTG|DnxUf6AyD&MRWz0iiO|*`pfX5c zGm*g0z50dgUjPeT*_U%|RPDId_3EDMdseGD*Q<I~s(NxIw>!Fi)bZ%eqqnA3_CC7o zY0Edm)qBT}K`@(kE{%TUvGu0?D^2^?oBCIp`d6DC&YjHjd)N8?6~6y%_bUJRvajWK zMeTY;>q<py&hcY!$I70;jq0`~_v_vp-qq^8x#8RX>YVPSvK_w>zPLvS@hT%R(GC<C z5{NyS=XI%yIfeq?>rTW4v>)P!7$v&c7utuzgOf{6r{=ms<ejF&k9wwi>iG;~gA(GT zc1wi3OQkqn0Hb0!m=X~w+(R@xN=#^UI1RbfLMeV7car~SPBSoY6l-X#UlDHEFbhv$ zR`2&UVVVt^aFPlLpVJMA?qC5mj7b-;Wr7aN+1rZ*nW!v|jK(#3(T9j3nQzf&S~6aw z!$Ld~Gl!OzYpj`dmzvc236vs#xkY>7-d;i6VxAQaqOp?SDl%rB2K6S@9P@s#gL2uU z9yC%Aptec|H1@*mvB{)4#hK90IlE<L*_#HHVmMD1v|!M_09S4@Q~+HtulQti3YS3u z3U?_rTRXNo8UqI=74GT8(qP_VVBT0ORGj*w(>@8<k9lNAQ(*r<7?lj1@tOOU(YN@d z*|Xu(V`HPk69uZuXk$V1^ILZ$*esYTB!g;eq(&oRG(uhY{Wx)s7Tlbsg}@mSh<b)_ zi!?387uW@4u&cYU<)m5!aG7Fq6iH8-0?Bj?*zW&CegX?SEGR0(dS{%3Z_<YELm6!N zMlMjBb8obealPfxil;H>xzhbpZ(yTm@a@mPb7{5bOzzlnO>o8cz-@nBu0lH-R)K;H zqIBl&{Q%04t8jjT5TbLSNHrgDeby7Dr)NuylL5}LxPPeoBWl8+{U)7DJWTK@!gWHC zQ-EIz_(hGkq^f4#PbF|S*A>{Lwk@Wz7VH_^G?nSA0x&HXQ(#}@eB5H0MRn~^Oog;D zR;dQF<Y3ssyXaF)r}3;e>wC*(lv;G8TDQQd(?$!0yFQbWEmdx*4ONx3HrjB{kg&e( zLBER_zO!VSE~2C_K1#u({llCVF)(93%ibz|Q(uwAa+Es0trK{~>XaKJ8RvF#ioTj0 zhi?v4FM2G#Yo4qPUcUOM;ksa7^j!AL*^F-ypf0IJ*@L?H&O^b40Imm)Z*YS9o2CTv zRck$7uf{1IMr_i~+OJSZKg*tM#eMBpT&|e2DWn=<4{H1XJvQAWvYr{@47WYX14e=| z7OCqK>kv_6k5NZ1S9*=K?6#TtL}>erng%qfTsdH*{o2qD8Z|A@AX943uMO=XqoxHK z@zm_O4_aY$w#|XDI}{?c?9unrC)Y5?L%Rs;X&K9#I!-I>KE>>>LZ(&ru)Xu8tvjJm z?o*A+vWJw%b+CmKU#<)rY4^>DwdROX%F^aBBW-)lui_5m))N&hi~bIf`Z##5|9_eM zxAZbO3B?A}H=*4(*DYKo&!LOgh7XG6X8zy99mRx70xQ%V8dSzNYPSS`?Q7;+Aa1>K zP8{iP`89Jx523Tna_BzmBCcr@{u=}5N4QKPJ!HX+gQ*%8=vyob)T})x#ncqOKVm22 zAiEkXjidNNrT*C!<E|&a5DoEX;KhXLGd^js7a~Pe2%1IMw+M_+06;E=)k6DD0VW+c zT=3}ua(vRZ6jQU1Y#_snmS;-V(9xh*Ez$hHG#jS#d|H@iJS&+a;lu*bLajt6$mNA9 zMo43$`e!APK0!iyej1Znp&32RcU-+^7i-x}V4%~P)CExp?w0-;%?#7n5Nj&o0v{*6 zK*66;@XsmumlQC&E7?|67aOGN(@(~DG!qlmvd<Pi_~XXeN#nyS(!ZdJrzj|+;Ga-H z{sfYTf|n^E&P5_!jYRH>60w<58v<N~WK2Et@X@|{QyMY8@x#7zBLU08f*T=TT`NVp zQHhu;wIZUg-4j?H=qQLcmA-)>=(h;HAGI?iW>B$-+O+&zs{0od(5{fKBTyZHDf<zl z18aFSh4>IM7AmbW1WDk30Wv86D{x{E9XcJQ`<aEKb0yHZH23;5H=en5j9EBvMS|`w zk*fS!&9%8#pSk`FR7)dko`>@l)tZ**+T2a|YQ?^sBTsktsAS$3$Om@NMGJ&gwTNt% zbEP{z;M}EUo7G%H+tut#*(GJUe$S8U&o1{q_D=uzAN$s0%e`lptH*P0vKwnQ<4wD} zygJW!y;Oe1eXVArvGeBK+Y@VzM_zJ&;NvP9uDM@phVL@&RNblTxY_@9{aW1+{G6Q! zO6xF~tAj5M=IdLpUViCvzNS83+kEwlFMToJ(DthTx<9|8HQ(Nu=XdAZb}^6U?v;ja z<l+BjJy*lu<9sz0un56sP+7C??^yA7EcM?US@rK<_U!-V2UB*gvV+V6`!}kauYKmG zd#!rkvTxsqblYqHhaYrvHLZ6!XL<ET9iOkmd@jW|IorN7HiWgG!B-AUUnmC(efU8i zSJnE;+_JxmKt8ll-M+N*=G<C!|FW<D!#n=wyIf`IgB$)G*V<q0zTUmItAEY^(4G4B zrS{jmZ*;HiJ-k-`*hXXb&8l0+)*1(wYX<KaMPEC$=I=uvma1+ZTdO;`TzRmNbz;rG z?<2B~ulYlFU;_Kf&91e&zU9ikJLpmS&Cjh>A6oVuLXR*w8+x=YwUJVJHX$$fEc@C% zyi>X3m4Rh{=UuL}w2t-vm8aJHU0XnJR5e{2T5IcFt3q$IR_YEdR~};NuUuZM3T@Qw zTpGf3)b%e{_TR3o{ctk?aKDmM*wkNb9%<peU0Xf!2=^WLkaM)2`)*6=$U~0rc9xGE zaD4ZGi{g*$7_D)9uik&6-SNH7^3em1?;Y?_{IOxjal7M(c6#|?Mfve2#}AuWyvuvM z&+)^)YNY=s=TO6mX2)MQyYRwpgG$7X1?!|y{76SBAYM!&ZIbk51Zt&m=l9I%(<jG| zhexH)QgW3w`N&CpS4z9z8>Na<6g))%8DlkcN7z9_hQkyqU_Y5&=}1c?iAhf)uzqLb zBqdTHPzI^N@tuwL?F}x^-Ge1nCC?t;tl=6T$k*=9*X+y(cKzI2<2qxzyVvGAX}eqE zb(L*4b9)BwIT~DLcMtAz)!#j7>vvV(m25j*4fme3HMwf;4tQLRcWatlfx81fSNYxM zfUACUFZ+JSFC5c0S07U>ur36Tu!&LKX*ooCcIh&@14kQN*$@@A6`!68>7Sko>FiBN zyc84JM}=gDPc?k(LN)1I6fng3ZHh7K!0<N1)(oMOm@54h1q}5v<V}LG^bP{Gtyp`O zTWajy8oSJaFNPKAT1JT{B)a7!{d)?S9lhuns9=cb+dRAQjgNUj5yTWfboD-onPA?Y z%p@WGF~K64S1q%Qolzx5fto14nF2-%iJWKzsRUnW5fie+BZV%jNSPQ6^`gw&l2rIE z#gR#(u;#S7i((`<X<h(b6eGb_Z7()fBHL2@e25t}*v%K!i?8Uwx}}k}|47xpM*-X2 zHP+o7nK*uG^z^w2_W2gJ514*e+ZH{j^DEDw_H~)V(%<0~bcmDRK>+k=v%POGu{rNm zayI{e=F0yYcltf<$a~zAzp%S(_In(HpZhr5sO=}*lkahl|AagC9yj<N7kZD|_g}g8 zpK#spaeIDY_uA~g;Edqs4V<loC3`3t!TS_!*0^lPZ0|XTVfC+VT;{6sf!bxRGG85d z)(?lKWv=EIB~7-D_c;U~3|=g;^<CNXbB=z0xp~gUc>;Gi2LRC5YmV7AT@?S7Ok3jH UyGn*V+;=>l;eg{i)i#9x8-h)bKmY&$ diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/api.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/api.cpython-312.pyc deleted file mode 100644 index b372a3c30c95be6d02073e53cb708d274aa724de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7226 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-312.pyc deleted file mode 100644 index 42b390c7e1e26cc1eb0f1499b66b137ba054ace5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13945 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-312.pyc deleted file mode 100644 index 96ab93bc84f25078ba6f2504f7b38ea3a9966fba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 944 zcmZ8gzi-qq6t<Jxk4BV2=|FGtg6N6%LdysORc(<fRY%p{bW4=R&Yj!DPHpGP6$y0! ziHd;*i4DPoQ2!K`mW>la2qw0|ZJn@lxdEPJ`}x`5_uh-Ye43nefwu7NlkNixfS+bF zHm7igk#^ny4B7xgY{jq*u}$Fa_<Vd{uRSO#`i>LZiPLr<U^Xs218s+taCvVI0CCv@ zq^yT?QlL)Y$bq15^{sj(d#D4hAp04SN;X0wlysl|W3JokQi&3dvzQ=3R3?~2s!LER zNJNAn7-13xS**~?GBOl2qG6y2+Q}G>NdvXIL=Z%!%URq<oDuZn=ygtE{7CR5-xN@k z2H{@NAr04Ek5HdyDA4Fpkg^WiDyp4Fq|s^2qlgO>pbg5h#|TrY1l`FL<qYNVBw(5g zyM*<q;4C3b&F7?Hz);u?Scl}vbqkcy5iUXprsBCeQoQI`XOJWfgl;SDyG4cAG+Z?4 z{xV;-IhgS`*Ejv`)^c-odE-%Y&0ksDYSrPOlv9SqJLHR20I>BK>Zj5#uJWLncFoCu zhT*J^Y=gSh6b4kc1{RltO3~LxFf@RReXq+C;w6ESJ#UqVnQ2&hx@yu9L9!qf4flvx z!2E#4JitVFJx$@objM5ks>|7(#^RDEsUizSm(ojV>iPN_=E56m#mlwQNc+MFGoNO( zBd7Ir1insPeRX(zcv`!CHnn(KT@({KJgEA95>V#*^~#{)`<REmFUkg9F~`?*o<@-; zm!j5DPHccINQmzbN~xesiK+n^PGNqii|W0RJnxGudTTT;@9OE?h7kTPyU-b42hja) u&%T@fP<vlHvu}NK>VF(qS~@QS=hBPA&-UyWXX5zA%bU-e=QeO^Ir(3uP6sLg diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-312.pyc deleted file mode 100644 index d8b9ceeb6263a5d0e96eb1cd94bc2a175f463bd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1529 zcmZ8h&2QT_6sP<l+wxbErg6U7sB7B9U1MztHtett7}gzHAkBd8L<|sQiME-LqDoRu zy#a%FYj3&jGVH!TW9OZET0kJ!p{Lw31VMqGM#@f`PJn;>y&vCurrzVzU-h~J^b`L6 z)4(nQ@Y)!cPi{)imn{H(1rdNCvZ5TZXb$Eq!}BB$^C-Vxz6^Q4!Xhe0){+*Y!oem0 z(0*qZGrN?<mtk42HYw8ztYkS$#GzGK&3KvAXdTvR12$+AHZ!e4X6P)O%eX_X(RnzZ z@hZ7a7vMt1YotXN;UZmvOLQ47(-pWvSK%tX0dLTo@Frb@Yt)4<y#;S&{&n&Zy$x^E zb+}INz&rFVyh}IWh6T_jZ0p}9x(DwejlCTF7~Mx(dhMY5JqvoHe7o`EpAJXQQY574 zgp4MEbbkKuah&f5Sh$o$DM4<+(Gas#kdZqG;)tNg#WZ1Dx|3+!#RSWdi-pihoi37x z2*vJqBROEPyY1?jOJk?wK9Vj+G{CWNdyKo?AUrq>cqE(;lcll5#FYc&#^||pX|S)I zhlmTz;*N7_I@h*TDIDlnB%hp`?w{r-YV+~ay(bS*$RhMD=ZtH|>YjGvD0+xP+0Lu- zHvu6*mmpQz4Uz=Mebv}arBSA~j;Vx<9bmK{m<0AN;{p-Q%1<TN0gv|Djw(J&nMBIT z7C#}WP^C1Uh_xx1$d#0n2=#c-SB9e4oK8D)vd?g=%9<pB{)dc-L>E*!T1(?hZ5Nf( zM>65;IYvS)yyrfOhnTaNqFAbC=IjroOniccR5cSZ^1GuX5JD|pwXO!XKT##$k67sY zs+!=W;}20BG0sgvRbGsQs!eO}<G9CEK|63|W8o*G?diIs3j2b^+%_@QkP(7Hsk<e3 z$tcY$N+;-s+)N>_7%(%f3g*<jYUs4^1b0=<sQQ+gMhIRryE)8w-H@8DkM`+gFU=cT z;!OiH24)S+8MtO(-oSMO3kF&mRAU-H9R|K=cFZS$FB@1fu&O~9Kyp>>rkF?^`^G4C zM^g8}=>|fNk+}{kk97lzJ;DO1>TyaD$DuDriFT{&E!0PRV*UZnbyDz_djm$1M*}H_ z-a{7ZkXQ;&B7*unpj$%X@Bs0xh#kf{tG>RT?#j^9uk0n+Z0&SD-Sz~QXe-fE6!eks zbo0Dv^SsL;_a>9oNk(tWUruKFEB=K(g8ohd@tcOTyk%Mc=1NxKVh&jDYv7zUK)L#N zsr9PV8W+xN;51$YFIz`nzg!*L|1;0az^a`9_reC&`aj^oEAZe1Y@C3#6VQ6&RIS__ z@D3JjD|Z1joXvpd+_-vdSH}6{a(!GpZp<Ei_Tq=Jb38kLgpO+Cx*_&2b^f_N;D0cB B+b;kB diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-312.pyc deleted file mode 100644 index fdb359d7b60e402921f451d66e87685916953fc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25268 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc deleted file mode 100644 index 993a6e8b028153c85449cbff79e03599a43b4ed3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7069 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 Rq+u_s8=YT5>9R`J`Cs#NSIPhY diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/help.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/help.cpython-312.pyc deleted file mode 100644 index ec1a189b5c382e503e39b702187e2b90deca82b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4334 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 H4AlPx;-o3# diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-312.pyc deleted file mode 100644 index 734b0c7bf06bcfc4d3f6fdf3ed35cc3a966b4bc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1074 zcmY*YL2DaF6rR~#S@ue<8`m~CG%(P*%?7NcF7Y9RLP4f=0}jMF8O(aTJCdeaX*M%s zIZ9SVhaTkCG%7vVr=EIf$*I4im!y=UEGZQF2b}2Cocd-X1^VE9^Y(jh-oAbB?Qiq* zE&>UEeAxKQLg*j!Fcmy8#+Si3LlN3T5w7Ds99dtZJu9*S?XKe$9{lP`cJGKOttt&6 zn#%p^f8x4#8(fi=h>l`L5-B=7Vv6VnBOy)bA&<G{K-7fH$vcx|Bu_?ES83L&xbCMN z%42#6IdaDh*F89pOeLbN*ulXKmw?=bq*IR6S({0!Sww15v<M}W%oR7Aod$)|&oyTO z)CL`I0-PZY_*$yy5eh91x(_iul%hKN!8$EE!1T~AAkM90<l!9;XNAvi-@dhL4Ax<7 ztxPY;t9yP!w3y$bT6O%Y2#;FE=W7<Tx}>djrFqz7ay=5q?O4!=Ngr-^{Fop5Nmn;S z`{T+-8@}S2ttT{W(mGRq!V^D$ut-RMItF+TjG>Zrv-ybC=uxbLoRLMSV*yl|nfB51 z_pbg~^3K-=Tf>c$?cYn@6UX}(4&{LR#9eVh(~YUjfKdV+_W{mOitl3u-_21Er})e1 zx`1ygDSA9%O@w@3zsZ*32tS5}Ga~I2*2+Xw(f-@eUB^PHlUg;*QELB$zr(#kTIl1` zg|yJKP8S`NTD!=z9&A>*N~jJSusby02@>&8bJ3=<OGF#UI)~1XgtL$lQ6mx6w35vR zK}h2`2s|sZ>r7|G231sR>CI$zlXbH~-mGlS9D%u$%`}gxtgFm1ROaU0%st99#Vj5n z(wNZjNl|%>Tm)_fRP6)w(ck4u-`pDB>2Hn7mmY1OY!Ab4cluk;isk2}#o_hyYk!p1 zM$4CnpAEJ~ORF!DJ@?_D`fT;eIe)sk@$)9Y;EU11>eGd_(YqgfKX*}tfQwmFUVh>% zjo}4o$8)k`5JVyj0%?YrPdu;U7bM>?gsJk??9JDI<0sM-XNIJ%09@D@;}@2Tor@LZ UE)B~4!pj+quZ`a-;pP1Lf2kHIQvd(} diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/models.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/models.cpython-312.pyc deleted file mode 100644 index b62175bacf9ab60da5e266071e9a46e32fe4cd6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35470 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 U&r$w2z4ikZ9^YK2l#SN^2b*E4VgLXD diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-312.pyc deleted file mode 100644 index 4a843aa0529511ef2f045593bc4c9cfe62d139e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 794 zcmZuv&rj4q7@cX$7Q28b5LOcmU^H@|jRM94;Q}JMLcAFlVN*MwY@yrMnOSi0qVcjO zB<hJ9fs-2k0R0m*9_&I)*73;68$WJ)a+=*H9GJt*``$P2&HIx1+1_p-xty(6g|7-i z2XT?CR1=)kCD=p+5$vHHBFYq6pa|tKQ30>ZUQSUEsG#iPhC)`_Zc_|+Tq4P|09tNq zlBbSDBR!|3lMXs4D>o2gJ)kdNICZfJK_OcFW};(wqYrfHe~zdLNAP8oGtPbw^h;8G zc8|1x5qrmpH)b@n!8KIIL#cnVMsq`|&`Z?w+-D;~bBS*Y-6`0V0AFtl-O$Xhf=>c! z*0H&M<upOzMF|*ZW@tMr_7X62C@oZ0W<qZ=qO+j|l1~^TpLdI4KzTkdQeNQL9uu19 zGA{IDKuR7kp-LbO#%;>kn#&79^}rV$B|oI_+<hs{<b^NjBu-!FRv{>YRkS%<wWb26 zR0N+hi-QMC)GiJ)?m8<#he@#Jdx1@WS~AnBCC9bGGA{)Fh<Wpt#as@<$sCrP(rS)v zB~w~S*9^<`*6~Kz3ECq=#NUH$$?Z_Z82?4ap@BNhW7LWl@#}lF-fN%rYOfV(-G4HJ z(bbXt%;=lxw=<Q;RjubJg*v-GOm1dBX7|tcA0xG85m(e&x+A(cxR)N>c0Tz#el&LX zyILK~{=WXO*4Mw&wY|7MFd7YvMSZs`bG6w=zvh3;M^BzsXBR4y@3Zf+QRdFKiE8Hl SUfY8sJ$5`w$5CjPjQAf!y4iUE diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-312.pyc deleted file mode 100644 index 3912045074327e42eb04c093f755bfdec3a223f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27779 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 F{tswCT1x-` diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-312.pyc deleted file mode 100644 index 6b000878a8ea860805fc5197ea2c90976e1ab1bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5981 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 AUH||9 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-312.pyc deleted file mode 100644 index 69455963f1b66c3f1c20e98d1da9aec3101698f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5639 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 I{PE%b1G+C6@c;k- diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index 9058e677f1c7b874fd67169acbf01cbcead507cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36291 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/__version__.py b/venv/lib/python3.12/site-packages/pip/_vendor/requests/__version__.py deleted file mode 100644 index 5063c3f..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/requests/__version__.py +++ /dev/null @@ -1,14 +0,0 @@ -# .-. .-. .-. . . .-. .-. .-. .-. -# |( |- |.| | | |- `-. | `-. -# ' ' `-' `-`.`-' `-' `-' ' `-' - -__title__ = "requests" -__description__ = "Python HTTP for Humans." -__url__ = "https://requests.readthedocs.io" -__version__ = "2.31.0" -__build__ = 0x023100 -__author__ = "Kenneth Reitz" -__author_email__ = "me@kennethreitz.org" -__license__ = "Apache 2.0" -__copyright__ = "Copyright Kenneth Reitz" -__cake__ = "\u2728 \U0001f370 \u2728" diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/_internal_utils.py b/venv/lib/python3.12/site-packages/pip/_vendor/requests/_internal_utils.py deleted file mode 100644 index f2cf635..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/requests/_internal_utils.py +++ /dev/null @@ -1,50 +0,0 @@ -""" -requests._internal_utils -~~~~~~~~~~~~~~ - -Provides utility functions that are consumed internally by Requests -which depend on extremely few external helpers (such as compat) -""" -import re - -from .compat import builtin_str - -_VALID_HEADER_NAME_RE_BYTE = re.compile(rb"^[^:\s][^:\r\n]*$") -_VALID_HEADER_NAME_RE_STR = re.compile(r"^[^:\s][^:\r\n]*$") -_VALID_HEADER_VALUE_RE_BYTE = re.compile(rb"^\S[^\r\n]*$|^$") -_VALID_HEADER_VALUE_RE_STR = re.compile(r"^\S[^\r\n]*$|^$") - -_HEADER_VALIDATORS_STR = (_VALID_HEADER_NAME_RE_STR, _VALID_HEADER_VALUE_RE_STR) -_HEADER_VALIDATORS_BYTE = (_VALID_HEADER_NAME_RE_BYTE, _VALID_HEADER_VALUE_RE_BYTE) -HEADER_VALIDATORS = { - bytes: _HEADER_VALIDATORS_BYTE, - str: _HEADER_VALIDATORS_STR, -} - - -def to_native_string(string, encoding="ascii"): - """Given a string object, regardless of type, returns a representation of - that string in the native string type, encoding and decoding where - necessary. This assumes ASCII unless told otherwise. - """ - if isinstance(string, builtin_str): - out = string - else: - out = string.decode(encoding) - - return out - - -def unicode_is_ascii(u_string): - """Determine if unicode string only contains ASCII characters. - - :param str u_string: unicode string to check. Must be unicode - and not Python 2 `str`. - :rtype: bool - """ - assert isinstance(u_string, str) - try: - u_string.encode("ascii") - return True - except UnicodeEncodeError: - return False diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/adapters.py b/venv/lib/python3.12/site-packages/pip/_vendor/requests/adapters.py deleted file mode 100644 index 10c1767..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/requests/adapters.py +++ /dev/null @@ -1,538 +0,0 @@ -""" -requests.adapters -~~~~~~~~~~~~~~~~~ - -This module contains the transport adapters that Requests uses to define -and maintain connections. -""" - -import os.path -import socket # noqa: F401 - -from pip._vendor.urllib3.exceptions import ClosedPoolError, ConnectTimeoutError -from pip._vendor.urllib3.exceptions import HTTPError as _HTTPError -from pip._vendor.urllib3.exceptions import InvalidHeader as _InvalidHeader -from pip._vendor.urllib3.exceptions import ( - LocationValueError, - MaxRetryError, - NewConnectionError, - ProtocolError, -) -from pip._vendor.urllib3.exceptions import ProxyError as _ProxyError -from pip._vendor.urllib3.exceptions import ReadTimeoutError, ResponseError -from pip._vendor.urllib3.exceptions import SSLError as _SSLError -from pip._vendor.urllib3.poolmanager import PoolManager, proxy_from_url -from pip._vendor.urllib3.util import Timeout as TimeoutSauce -from pip._vendor.urllib3.util import parse_url -from pip._vendor.urllib3.util.retry import Retry - -from .auth import _basic_auth_str -from .compat import basestring, urlparse -from .cookies import extract_cookies_to_jar -from .exceptions import ( - ConnectionError, - ConnectTimeout, - InvalidHeader, - InvalidProxyURL, - InvalidSchema, - InvalidURL, - ProxyError, - ReadTimeout, - RetryError, - SSLError, -) -from .models import Response -from .structures import CaseInsensitiveDict -from .utils import ( - DEFAULT_CA_BUNDLE_PATH, - extract_zipped_paths, - get_auth_from_url, - get_encoding_from_headers, - prepend_scheme_if_needed, - select_proxy, - urldefragauth, -) - -try: - from pip._vendor.urllib3.contrib.socks import SOCKSProxyManager -except ImportError: - - def SOCKSProxyManager(*args, **kwargs): - raise InvalidSchema("Missing dependencies for SOCKS support.") - - -DEFAULT_POOLBLOCK = False -DEFAULT_POOLSIZE = 10 -DEFAULT_RETRIES = 0 -DEFAULT_POOL_TIMEOUT = None - - -class BaseAdapter: - """The Base Transport Adapter""" - - def __init__(self): - super().__init__() - - def send( - self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None - ): - """Sends PreparedRequest object. Returns Response object. - - :param request: The :class:`PreparedRequest <PreparedRequest>` being sent. - :param stream: (optional) Whether to stream the request content. - :param timeout: (optional) How long to wait for the server to send - data before giving up, as a float, or a :ref:`(connect timeout, - read timeout) <timeouts>` tuple. - :type timeout: float or tuple - :param verify: (optional) Either a boolean, in which case it controls whether we verify - the server's TLS certificate, or a string, in which case it must be a path - to a CA bundle to use - :param cert: (optional) Any user-provided SSL certificate to be trusted. - :param proxies: (optional) The proxies dictionary to apply to the request. - """ - raise NotImplementedError - - def close(self): - """Cleans up adapter specific items.""" - raise NotImplementedError - - -class HTTPAdapter(BaseAdapter): - """The built-in HTTP Adapter for urllib3. - - Provides a general-case interface for Requests sessions to contact HTTP and - HTTPS urls by implementing the Transport Adapter interface. This class will - usually be created by the :class:`Session <Session>` class under the - covers. - - :param pool_connections: The number of urllib3 connection pools to cache. - :param pool_maxsize: The maximum number of connections to save in the pool. - :param max_retries: The maximum number of retries each connection - should attempt. Note, this applies only to failed DNS lookups, socket - connections and connection timeouts, never to requests where data has - made it to the server. By default, Requests does not retry failed - connections. If you need granular control over the conditions under - which we retry a request, import urllib3's ``Retry`` class and pass - that instead. - :param pool_block: Whether the connection pool should block for connections. - - Usage:: - - >>> import requests - >>> s = requests.Session() - >>> a = requests.adapters.HTTPAdapter(max_retries=3) - >>> s.mount('http://', a) - """ - - __attrs__ = [ - "max_retries", - "config", - "_pool_connections", - "_pool_maxsize", - "_pool_block", - ] - - def __init__( - self, - pool_connections=DEFAULT_POOLSIZE, - pool_maxsize=DEFAULT_POOLSIZE, - max_retries=DEFAULT_RETRIES, - pool_block=DEFAULT_POOLBLOCK, - ): - if max_retries == DEFAULT_RETRIES: - self.max_retries = Retry(0, read=False) - else: - self.max_retries = Retry.from_int(max_retries) - self.config = {} - self.proxy_manager = {} - - super().__init__() - - self._pool_connections = pool_connections - self._pool_maxsize = pool_maxsize - self._pool_block = pool_block - - self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block) - - def __getstate__(self): - return {attr: getattr(self, attr, None) for attr in self.__attrs__} - - def __setstate__(self, state): - # Can't handle by adding 'proxy_manager' to self.__attrs__ because - # self.poolmanager uses a lambda function, which isn't pickleable. - self.proxy_manager = {} - self.config = {} - - for attr, value in state.items(): - setattr(self, attr, value) - - self.init_poolmanager( - self._pool_connections, self._pool_maxsize, block=self._pool_block - ) - - def init_poolmanager( - self, connections, maxsize, block=DEFAULT_POOLBLOCK, **pool_kwargs - ): - """Initializes a urllib3 PoolManager. - - This method should not be called from user code, and is only - exposed for use when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param connections: The number of urllib3 connection pools to cache. - :param maxsize: The maximum number of connections to save in the pool. - :param block: Block when no free connections are available. - :param pool_kwargs: Extra keyword arguments used to initialize the Pool Manager. - """ - # save these values for pickling - self._pool_connections = connections - self._pool_maxsize = maxsize - self._pool_block = block - - self.poolmanager = PoolManager( - num_pools=connections, - maxsize=maxsize, - block=block, - **pool_kwargs, - ) - - def proxy_manager_for(self, proxy, **proxy_kwargs): - """Return urllib3 ProxyManager for the given proxy. - - This method should not be called from user code, and is only - exposed for use when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param proxy: The proxy to return a urllib3 ProxyManager for. - :param proxy_kwargs: Extra keyword arguments used to configure the Proxy Manager. - :returns: ProxyManager - :rtype: urllib3.ProxyManager - """ - if proxy in self.proxy_manager: - manager = self.proxy_manager[proxy] - elif proxy.lower().startswith("socks"): - username, password = get_auth_from_url(proxy) - manager = self.proxy_manager[proxy] = SOCKSProxyManager( - proxy, - username=username, - password=password, - num_pools=self._pool_connections, - maxsize=self._pool_maxsize, - block=self._pool_block, - **proxy_kwargs, - ) - else: - proxy_headers = self.proxy_headers(proxy) - manager = self.proxy_manager[proxy] = proxy_from_url( - proxy, - proxy_headers=proxy_headers, - num_pools=self._pool_connections, - maxsize=self._pool_maxsize, - block=self._pool_block, - **proxy_kwargs, - ) - - return manager - - def cert_verify(self, conn, url, verify, cert): - """Verify a SSL certificate. This method should not be called from user - code, and is only exposed for use when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param conn: The urllib3 connection object associated with the cert. - :param url: The requested URL. - :param verify: Either a boolean, in which case it controls whether we verify - the server's TLS certificate, or a string, in which case it must be a path - to a CA bundle to use - :param cert: The SSL certificate to verify. - """ - if url.lower().startswith("https") and verify: - - cert_loc = None - - # Allow self-specified cert location. - if verify is not True: - cert_loc = verify - - if not cert_loc: - cert_loc = extract_zipped_paths(DEFAULT_CA_BUNDLE_PATH) - - if not cert_loc or not os.path.exists(cert_loc): - raise OSError( - f"Could not find a suitable TLS CA certificate bundle, " - f"invalid path: {cert_loc}" - ) - - conn.cert_reqs = "CERT_REQUIRED" - - if not os.path.isdir(cert_loc): - conn.ca_certs = cert_loc - else: - conn.ca_cert_dir = cert_loc - else: - conn.cert_reqs = "CERT_NONE" - conn.ca_certs = None - conn.ca_cert_dir = None - - if cert: - if not isinstance(cert, basestring): - conn.cert_file = cert[0] - conn.key_file = cert[1] - else: - conn.cert_file = cert - conn.key_file = None - if conn.cert_file and not os.path.exists(conn.cert_file): - raise OSError( - f"Could not find the TLS certificate file, " - f"invalid path: {conn.cert_file}" - ) - if conn.key_file and not os.path.exists(conn.key_file): - raise OSError( - f"Could not find the TLS key file, invalid path: {conn.key_file}" - ) - - def build_response(self, req, resp): - """Builds a :class:`Response <requests.Response>` object from a urllib3 - response. This should not be called from user code, and is only exposed - for use when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>` - - :param req: The :class:`PreparedRequest <PreparedRequest>` used to generate the response. - :param resp: The urllib3 response object. - :rtype: requests.Response - """ - response = Response() - - # Fallback to None if there's no status_code, for whatever reason. - response.status_code = getattr(resp, "status", None) - - # Make headers case-insensitive. - response.headers = CaseInsensitiveDict(getattr(resp, "headers", {})) - - # Set encoding. - response.encoding = get_encoding_from_headers(response.headers) - response.raw = resp - response.reason = response.raw.reason - - if isinstance(req.url, bytes): - response.url = req.url.decode("utf-8") - else: - response.url = req.url - - # Add new cookies from the server. - extract_cookies_to_jar(response.cookies, req, resp) - - # Give the Response some context. - response.request = req - response.connection = self - - return response - - def get_connection(self, url, proxies=None): - """Returns a urllib3 connection for the given URL. This should not be - called from user code, and is only exposed for use when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param url: The URL to connect to. - :param proxies: (optional) A Requests-style dictionary of proxies used on this request. - :rtype: urllib3.ConnectionPool - """ - proxy = select_proxy(url, proxies) - - if proxy: - proxy = prepend_scheme_if_needed(proxy, "http") - proxy_url = parse_url(proxy) - if not proxy_url.host: - raise InvalidProxyURL( - "Please check proxy URL. It is malformed " - "and could be missing the host." - ) - proxy_manager = self.proxy_manager_for(proxy) - conn = proxy_manager.connection_from_url(url) - else: - # Only scheme should be lower case - parsed = urlparse(url) - url = parsed.geturl() - conn = self.poolmanager.connection_from_url(url) - - return conn - - def close(self): - """Disposes of any internal state. - - Currently, this closes the PoolManager and any active ProxyManager, - which closes any pooled connections. - """ - self.poolmanager.clear() - for proxy in self.proxy_manager.values(): - proxy.clear() - - def request_url(self, request, proxies): - """Obtain the url to use when making the final request. - - If the message is being sent through a HTTP proxy, the full URL has to - be used. Otherwise, we should only use the path portion of the URL. - - This should not be called from user code, and is only exposed for use - when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param request: The :class:`PreparedRequest <PreparedRequest>` being sent. - :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs. - :rtype: str - """ - proxy = select_proxy(request.url, proxies) - scheme = urlparse(request.url).scheme - - is_proxied_http_request = proxy and scheme != "https" - using_socks_proxy = False - if proxy: - proxy_scheme = urlparse(proxy).scheme.lower() - using_socks_proxy = proxy_scheme.startswith("socks") - - url = request.path_url - if is_proxied_http_request and not using_socks_proxy: - url = urldefragauth(request.url) - - return url - - def add_headers(self, request, **kwargs): - """Add any headers needed by the connection. As of v2.0 this does - nothing by default, but is left for overriding by users that subclass - the :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - This should not be called from user code, and is only exposed for use - when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param request: The :class:`PreparedRequest <PreparedRequest>` to add headers to. - :param kwargs: The keyword arguments from the call to send(). - """ - pass - - def proxy_headers(self, proxy): - """Returns a dictionary of the headers to add to any request sent - through a proxy. This works with urllib3 magic to ensure that they are - correctly sent to the proxy, rather than in a tunnelled request if - CONNECT is being used. - - This should not be called from user code, and is only exposed for use - when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param proxy: The url of the proxy being used for this request. - :rtype: dict - """ - headers = {} - username, password = get_auth_from_url(proxy) - - if username: - headers["Proxy-Authorization"] = _basic_auth_str(username, password) - - return headers - - def send( - self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None - ): - """Sends PreparedRequest object. Returns Response object. - - :param request: The :class:`PreparedRequest <PreparedRequest>` being sent. - :param stream: (optional) Whether to stream the request content. - :param timeout: (optional) How long to wait for the server to send - data before giving up, as a float, or a :ref:`(connect timeout, - read timeout) <timeouts>` tuple. - :type timeout: float or tuple or urllib3 Timeout object - :param verify: (optional) Either a boolean, in which case it controls whether - we verify the server's TLS certificate, or a string, in which case it - must be a path to a CA bundle to use - :param cert: (optional) Any user-provided SSL certificate to be trusted. - :param proxies: (optional) The proxies dictionary to apply to the request. - :rtype: requests.Response - """ - - try: - conn = self.get_connection(request.url, proxies) - except LocationValueError as e: - raise InvalidURL(e, request=request) - - self.cert_verify(conn, request.url, verify, cert) - url = self.request_url(request, proxies) - self.add_headers( - request, - stream=stream, - timeout=timeout, - verify=verify, - cert=cert, - proxies=proxies, - ) - - chunked = not (request.body is None or "Content-Length" in request.headers) - - if isinstance(timeout, tuple): - try: - connect, read = timeout - timeout = TimeoutSauce(connect=connect, read=read) - except ValueError: - raise ValueError( - f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, " - f"or a single float to set both timeouts to the same value." - ) - elif isinstance(timeout, TimeoutSauce): - pass - else: - timeout = TimeoutSauce(connect=timeout, read=timeout) - - try: - resp = conn.urlopen( - method=request.method, - url=url, - body=request.body, - headers=request.headers, - redirect=False, - assert_same_host=False, - preload_content=False, - decode_content=False, - retries=self.max_retries, - timeout=timeout, - chunked=chunked, - ) - - except (ProtocolError, OSError) as err: - raise ConnectionError(err, request=request) - - except MaxRetryError as e: - if isinstance(e.reason, ConnectTimeoutError): - # TODO: Remove this in 3.0.0: see #2811 - if not isinstance(e.reason, NewConnectionError): - raise ConnectTimeout(e, request=request) - - if isinstance(e.reason, ResponseError): - raise RetryError(e, request=request) - - if isinstance(e.reason, _ProxyError): - raise ProxyError(e, request=request) - - if isinstance(e.reason, _SSLError): - # This branch is for urllib3 v1.22 and later. - raise SSLError(e, request=request) - - raise ConnectionError(e, request=request) - - except ClosedPoolError as e: - raise ConnectionError(e, request=request) - - except _ProxyError as e: - raise ProxyError(e) - - except (_SSLError, _HTTPError) as e: - if isinstance(e, _SSLError): - # This branch is for urllib3 versions earlier than v1.22 - raise SSLError(e, request=request) - elif isinstance(e, ReadTimeoutError): - raise ReadTimeout(e, request=request) - elif isinstance(e, _InvalidHeader): - raise InvalidHeader(e, request=request) - else: - raise - - return self.build_response(request, resp) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/api.py b/venv/lib/python3.12/site-packages/pip/_vendor/requests/api.py deleted file mode 100644 index cd0b3ee..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/requests/api.py +++ /dev/null @@ -1,157 +0,0 @@ -""" -requests.api -~~~~~~~~~~~~ - -This module implements the Requests API. - -:copyright: (c) 2012 by Kenneth Reitz. -:license: Apache2, see LICENSE for more details. -""" - -from . import sessions - - -def request(method, url, **kwargs): - """Constructs and sends a :class:`Request <Request>`. - - :param method: method for the new :class:`Request` object: ``GET``, ``OPTIONS``, ``HEAD``, ``POST``, ``PUT``, ``PATCH``, or ``DELETE``. - :param url: URL for the new :class:`Request` object. - :param params: (optional) Dictionary, list of tuples or bytes to send - in the query string for the :class:`Request`. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. - :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. - :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. - :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload. - ``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')`` - or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content-type'`` is a string - defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers - to add for the file. - :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. - :param timeout: (optional) How many seconds to wait for the server to send data - before giving up, as a float, or a :ref:`(connect timeout, read - timeout) <timeouts>` tuple. - :type timeout: float or tuple - :param allow_redirects: (optional) Boolean. Enable/disable GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD redirection. Defaults to ``True``. - :type allow_redirects: bool - :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. - :param verify: (optional) Either a boolean, in which case it controls whether we verify - the server's TLS certificate, or a string, in which case it must be a path - to a CA bundle to use. Defaults to ``True``. - :param stream: (optional) if ``False``, the response content will be immediately downloaded. - :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. - :return: :class:`Response <Response>` object - :rtype: requests.Response - - Usage:: - - >>> import requests - >>> req = requests.request('GET', 'https://httpbin.org/get') - >>> req - <Response [200]> - """ - - # By using the 'with' statement we are sure the session is closed, thus we - # avoid leaving sockets open which can trigger a ResourceWarning in some - # cases, and look like a memory leak in others. - with sessions.Session() as session: - return session.request(method=method, url=url, **kwargs) - - -def get(url, params=None, **kwargs): - r"""Sends a GET request. - - :param url: URL for the new :class:`Request` object. - :param params: (optional) Dictionary, list of tuples or bytes to send - in the query string for the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - return request("get", url, params=params, **kwargs) - - -def options(url, **kwargs): - r"""Sends an OPTIONS request. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - return request("options", url, **kwargs) - - -def head(url, **kwargs): - r"""Sends a HEAD request. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. If - `allow_redirects` is not provided, it will be set to `False` (as - opposed to the default :meth:`request` behavior). - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - kwargs.setdefault("allow_redirects", False) - return request("head", url, **kwargs) - - -def post(url, data=None, json=None, **kwargs): - r"""Sends a POST request. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - return request("post", url, data=data, json=json, **kwargs) - - -def put(url, data=None, **kwargs): - r"""Sends a PUT request. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - return request("put", url, data=data, **kwargs) - - -def patch(url, data=None, **kwargs): - r"""Sends a PATCH request. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - return request("patch", url, data=data, **kwargs) - - -def delete(url, **kwargs): - r"""Sends a DELETE request. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - return request("delete", url, **kwargs) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/auth.py b/venv/lib/python3.12/site-packages/pip/_vendor/requests/auth.py deleted file mode 100644 index 9733686..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/requests/auth.py +++ /dev/null @@ -1,315 +0,0 @@ -""" -requests.auth -~~~~~~~~~~~~~ - -This module contains the authentication handlers for Requests. -""" - -import hashlib -import os -import re -import threading -import time -import warnings -from base64 import b64encode - -from ._internal_utils import to_native_string -from .compat import basestring, str, urlparse -from .cookies import extract_cookies_to_jar -from .utils import parse_dict_header - -CONTENT_TYPE_FORM_URLENCODED = "application/x-www-form-urlencoded" -CONTENT_TYPE_MULTI_PART = "multipart/form-data" - - -def _basic_auth_str(username, password): - """Returns a Basic Auth string.""" - - # "I want us to put a big-ol' comment on top of it that - # says that this behaviour is dumb but we need to preserve - # it because people are relying on it." - # - Lukasa - # - # These are here solely to maintain backwards compatibility - # for things like ints. This will be removed in 3.0.0. - if not isinstance(username, basestring): - warnings.warn( - "Non-string usernames will no longer be supported in Requests " - "3.0.0. Please convert the object you've passed in ({!r}) to " - "a string or bytes object in the near future to avoid " - "problems.".format(username), - category=DeprecationWarning, - ) - username = str(username) - - if not isinstance(password, basestring): - warnings.warn( - "Non-string passwords will no longer be supported in Requests " - "3.0.0. Please convert the object you've passed in ({!r}) to " - "a string or bytes object in the near future to avoid " - "problems.".format(type(password)), - category=DeprecationWarning, - ) - password = str(password) - # -- End Removal -- - - if isinstance(username, str): - username = username.encode("latin1") - - if isinstance(password, str): - password = password.encode("latin1") - - authstr = "Basic " + to_native_string( - b64encode(b":".join((username, password))).strip() - ) - - return authstr - - -class AuthBase: - """Base class that all auth implementations derive from""" - - def __call__(self, r): - raise NotImplementedError("Auth hooks must be callable.") - - -class HTTPBasicAuth(AuthBase): - """Attaches HTTP Basic Authentication to the given Request object.""" - - def __init__(self, username, password): - self.username = username - self.password = password - - def __eq__(self, other): - return all( - [ - self.username == getattr(other, "username", None), - self.password == getattr(other, "password", None), - ] - ) - - def __ne__(self, other): - return not self == other - - def __call__(self, r): - r.headers["Authorization"] = _basic_auth_str(self.username, self.password) - return r - - -class HTTPProxyAuth(HTTPBasicAuth): - """Attaches HTTP Proxy Authentication to a given Request object.""" - - def __call__(self, r): - r.headers["Proxy-Authorization"] = _basic_auth_str(self.username, self.password) - return r - - -class HTTPDigestAuth(AuthBase): - """Attaches HTTP Digest Authentication to the given Request object.""" - - def __init__(self, username, password): - self.username = username - self.password = password - # Keep state in per-thread local storage - self._thread_local = threading.local() - - def init_per_thread_state(self): - # Ensure state is initialized just once per-thread - if not hasattr(self._thread_local, "init"): - self._thread_local.init = True - self._thread_local.last_nonce = "" - self._thread_local.nonce_count = 0 - self._thread_local.chal = {} - self._thread_local.pos = None - self._thread_local.num_401_calls = None - - def build_digest_header(self, method, url): - """ - :rtype: str - """ - - realm = self._thread_local.chal["realm"] - nonce = self._thread_local.chal["nonce"] - qop = self._thread_local.chal.get("qop") - algorithm = self._thread_local.chal.get("algorithm") - opaque = self._thread_local.chal.get("opaque") - hash_utf8 = None - - if algorithm is None: - _algorithm = "MD5" - else: - _algorithm = algorithm.upper() - # lambdas assume digest modules are imported at the top level - if _algorithm == "MD5" or _algorithm == "MD5-SESS": - - def md5_utf8(x): - if isinstance(x, str): - x = x.encode("utf-8") - return hashlib.md5(x).hexdigest() - - hash_utf8 = md5_utf8 - elif _algorithm == "SHA": - - def sha_utf8(x): - if isinstance(x, str): - x = x.encode("utf-8") - return hashlib.sha1(x).hexdigest() - - hash_utf8 = sha_utf8 - elif _algorithm == "SHA-256": - - def sha256_utf8(x): - if isinstance(x, str): - x = x.encode("utf-8") - return hashlib.sha256(x).hexdigest() - - hash_utf8 = sha256_utf8 - elif _algorithm == "SHA-512": - - def sha512_utf8(x): - if isinstance(x, str): - x = x.encode("utf-8") - return hashlib.sha512(x).hexdigest() - - hash_utf8 = sha512_utf8 - - KD = lambda s, d: hash_utf8(f"{s}:{d}") # noqa:E731 - - if hash_utf8 is None: - return None - - # XXX not implemented yet - entdig = None - p_parsed = urlparse(url) - #: path is request-uri defined in RFC 2616 which should not be empty - path = p_parsed.path or "/" - if p_parsed.query: - path += f"?{p_parsed.query}" - - A1 = f"{self.username}:{realm}:{self.password}" - A2 = f"{method}:{path}" - - HA1 = hash_utf8(A1) - HA2 = hash_utf8(A2) - - if nonce == self._thread_local.last_nonce: - self._thread_local.nonce_count += 1 - else: - self._thread_local.nonce_count = 1 - ncvalue = f"{self._thread_local.nonce_count:08x}" - s = str(self._thread_local.nonce_count).encode("utf-8") - s += nonce.encode("utf-8") - s += time.ctime().encode("utf-8") - s += os.urandom(8) - - cnonce = hashlib.sha1(s).hexdigest()[:16] - if _algorithm == "MD5-SESS": - HA1 = hash_utf8(f"{HA1}:{nonce}:{cnonce}") - - if not qop: - respdig = KD(HA1, f"{nonce}:{HA2}") - elif qop == "auth" or "auth" in qop.split(","): - noncebit = f"{nonce}:{ncvalue}:{cnonce}:auth:{HA2}" - respdig = KD(HA1, noncebit) - else: - # XXX handle auth-int. - return None - - self._thread_local.last_nonce = nonce - - # XXX should the partial digests be encoded too? - base = ( - f'username="{self.username}", realm="{realm}", nonce="{nonce}", ' - f'uri="{path}", response="{respdig}"' - ) - if opaque: - base += f', opaque="{opaque}"' - if algorithm: - base += f', algorithm="{algorithm}"' - if entdig: - base += f', digest="{entdig}"' - if qop: - base += f', qop="auth", nc={ncvalue}, cnonce="{cnonce}"' - - return f"Digest {base}" - - def handle_redirect(self, r, **kwargs): - """Reset num_401_calls counter on redirects.""" - if r.is_redirect: - self._thread_local.num_401_calls = 1 - - def handle_401(self, r, **kwargs): - """ - Takes the given response and tries digest-auth, if needed. - - :rtype: requests.Response - """ - - # If response is not 4xx, do not auth - # See https://github.com/psf/requests/issues/3772 - if not 400 <= r.status_code < 500: - self._thread_local.num_401_calls = 1 - return r - - if self._thread_local.pos is not None: - # Rewind the file position indicator of the body to where - # it was to resend the request. - r.request.body.seek(self._thread_local.pos) - s_auth = r.headers.get("www-authenticate", "") - - if "digest" in s_auth.lower() and self._thread_local.num_401_calls < 2: - - self._thread_local.num_401_calls += 1 - pat = re.compile(r"digest ", flags=re.IGNORECASE) - self._thread_local.chal = parse_dict_header(pat.sub("", s_auth, count=1)) - - # Consume content and release the original connection - # to allow our new request to reuse the same one. - r.content - r.close() - prep = r.request.copy() - extract_cookies_to_jar(prep._cookies, r.request, r.raw) - prep.prepare_cookies(prep._cookies) - - prep.headers["Authorization"] = self.build_digest_header( - prep.method, prep.url - ) - _r = r.connection.send(prep, **kwargs) - _r.history.append(r) - _r.request = prep - - return _r - - self._thread_local.num_401_calls = 1 - return r - - def __call__(self, r): - # Initialize per-thread state, if needed - self.init_per_thread_state() - # If we have a saved nonce, skip the 401 - if self._thread_local.last_nonce: - r.headers["Authorization"] = self.build_digest_header(r.method, r.url) - try: - self._thread_local.pos = r.body.tell() - except AttributeError: - # In the case of HTTPDigestAuth being reused and the body of - # the previous request was a file-like object, pos has the - # file position of the previous body. Ensure it's set to - # None. - self._thread_local.pos = None - r.register_hook("response", self.handle_401) - r.register_hook("response", self.handle_redirect) - self._thread_local.num_401_calls = 1 - - return r - - def __eq__(self, other): - return all( - [ - self.username == getattr(other, "username", None), - self.password == getattr(other, "password", None), - ] - ) - - def __ne__(self, other): - return not self == other diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/certs.py b/venv/lib/python3.12/site-packages/pip/_vendor/requests/certs.py deleted file mode 100644 index 38696a1..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/requests/certs.py +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env python - -""" -requests.certs -~~~~~~~~~~~~~~ - -This module returns the preferred default CA certificate bundle. There is -only one — the one from the certifi package. - -If you are packaging Requests, e.g., for a Linux distribution or a managed -environment, you can change the definition of where() to return a separately -packaged CA bundle. -""" - -import os - -if "_PIP_STANDALONE_CERT" not in os.environ: - from pip._vendor.certifi import where -else: - def where(): - return os.environ["_PIP_STANDALONE_CERT"] - -if __name__ == "__main__": - print(where()) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/compat.py b/venv/lib/python3.12/site-packages/pip/_vendor/requests/compat.py deleted file mode 100644 index 9ab2bb4..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/requests/compat.py +++ /dev/null @@ -1,67 +0,0 @@ -""" -requests.compat -~~~~~~~~~~~~~~~ - -This module previously handled import compatibility issues -between Python 2 and Python 3. It remains for backwards -compatibility until the next major version. -""" - -from pip._vendor import chardet - -import sys - -# ------- -# Pythons -# ------- - -# Syntax sugar. -_ver = sys.version_info - -#: Python 2.x? -is_py2 = _ver[0] == 2 - -#: Python 3.x? -is_py3 = _ver[0] == 3 - -# Note: We've patched out simplejson support in pip because it prevents -# upgrading simplejson on Windows. -import json -from json import JSONDecodeError - -# Keep OrderedDict for backwards compatibility. -from collections import OrderedDict -from collections.abc import Callable, Mapping, MutableMapping -from http import cookiejar as cookielib -from http.cookies import Morsel -from io import StringIO - -# -------------- -# Legacy Imports -# -------------- -from urllib.parse import ( - quote, - quote_plus, - unquote, - unquote_plus, - urldefrag, - urlencode, - urljoin, - urlparse, - urlsplit, - urlunparse, -) -from urllib.request import ( - getproxies, - getproxies_environment, - parse_http_list, - proxy_bypass, - proxy_bypass_environment, -) - -builtin_str = str -str = str -bytes = bytes -basestring = (str, bytes) -numeric_types = (int, float) -integer_types = (int,) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/cookies.py b/venv/lib/python3.12/site-packages/pip/_vendor/requests/cookies.py deleted file mode 100644 index bf54ab2..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/requests/cookies.py +++ /dev/null @@ -1,561 +0,0 @@ -""" -requests.cookies -~~~~~~~~~~~~~~~~ - -Compatibility code to be able to use `cookielib.CookieJar` with requests. - -requests.utils imports from here, so be careful with imports. -""" - -import calendar -import copy -import time - -from ._internal_utils import to_native_string -from .compat import Morsel, MutableMapping, cookielib, urlparse, urlunparse - -try: - import threading -except ImportError: - import dummy_threading as threading - - -class MockRequest: - """Wraps a `requests.Request` to mimic a `urllib2.Request`. - - The code in `cookielib.CookieJar` expects this interface in order to correctly - manage cookie policies, i.e., determine whether a cookie can be set, given the - domains of the request and the cookie. - - The original request object is read-only. The client is responsible for collecting - the new headers via `get_new_headers()` and interpreting them appropriately. You - probably want `get_cookie_header`, defined below. - """ - - def __init__(self, request): - self._r = request - self._new_headers = {} - self.type = urlparse(self._r.url).scheme - - def get_type(self): - return self.type - - def get_host(self): - return urlparse(self._r.url).netloc - - def get_origin_req_host(self): - return self.get_host() - - def get_full_url(self): - # Only return the response's URL if the user hadn't set the Host - # header - if not self._r.headers.get("Host"): - return self._r.url - # If they did set it, retrieve it and reconstruct the expected domain - host = to_native_string(self._r.headers["Host"], encoding="utf-8") - parsed = urlparse(self._r.url) - # Reconstruct the URL as we expect it - return urlunparse( - [ - parsed.scheme, - host, - parsed.path, - parsed.params, - parsed.query, - parsed.fragment, - ] - ) - - def is_unverifiable(self): - return True - - def has_header(self, name): - return name in self._r.headers or name in self._new_headers - - def get_header(self, name, default=None): - return self._r.headers.get(name, self._new_headers.get(name, default)) - - def add_header(self, key, val): - """cookielib has no legitimate use for this method; add it back if you find one.""" - raise NotImplementedError( - "Cookie headers should be added with add_unredirected_header()" - ) - - def add_unredirected_header(self, name, value): - self._new_headers[name] = value - - def get_new_headers(self): - return self._new_headers - - @property - def unverifiable(self): - return self.is_unverifiable() - - @property - def origin_req_host(self): - return self.get_origin_req_host() - - @property - def host(self): - return self.get_host() - - -class MockResponse: - """Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`. - - ...what? Basically, expose the parsed HTTP headers from the server response - the way `cookielib` expects to see them. - """ - - def __init__(self, headers): - """Make a MockResponse for `cookielib` to read. - - :param headers: a httplib.HTTPMessage or analogous carrying the headers - """ - self._headers = headers - - def info(self): - return self._headers - - def getheaders(self, name): - self._headers.getheaders(name) - - -def extract_cookies_to_jar(jar, request, response): - """Extract the cookies from the response into a CookieJar. - - :param jar: cookielib.CookieJar (not necessarily a RequestsCookieJar) - :param request: our own requests.Request object - :param response: urllib3.HTTPResponse object - """ - if not (hasattr(response, "_original_response") and response._original_response): - return - # the _original_response field is the wrapped httplib.HTTPResponse object, - req = MockRequest(request) - # pull out the HTTPMessage with the headers and put it in the mock: - res = MockResponse(response._original_response.msg) - jar.extract_cookies(res, req) - - -def get_cookie_header(jar, request): - """ - Produce an appropriate Cookie header string to be sent with `request`, or None. - - :rtype: str - """ - r = MockRequest(request) - jar.add_cookie_header(r) - return r.get_new_headers().get("Cookie") - - -def remove_cookie_by_name(cookiejar, name, domain=None, path=None): - """Unsets a cookie by name, by default over all domains and paths. - - Wraps CookieJar.clear(), is O(n). - """ - clearables = [] - for cookie in cookiejar: - if cookie.name != name: - continue - if domain is not None and domain != cookie.domain: - continue - if path is not None and path != cookie.path: - continue - clearables.append((cookie.domain, cookie.path, cookie.name)) - - for domain, path, name in clearables: - cookiejar.clear(domain, path, name) - - -class CookieConflictError(RuntimeError): - """There are two cookies that meet the criteria specified in the cookie jar. - Use .get and .set and include domain and path args in order to be more specific. - """ - - -class RequestsCookieJar(cookielib.CookieJar, MutableMapping): - """Compatibility class; is a cookielib.CookieJar, but exposes a dict - interface. - - This is the CookieJar we create by default for requests and sessions that - don't specify one, since some clients may expect response.cookies and - session.cookies to support dict operations. - - Requests does not use the dict interface internally; it's just for - compatibility with external client code. All requests code should work - out of the box with externally provided instances of ``CookieJar``, e.g. - ``LWPCookieJar`` and ``FileCookieJar``. - - Unlike a regular CookieJar, this class is pickleable. - - .. warning:: dictionary operations that are normally O(1) may be O(n). - """ - - def get(self, name, default=None, domain=None, path=None): - """Dict-like get() that also supports optional domain and path args in - order to resolve naming collisions from using one cookie jar over - multiple domains. - - .. warning:: operation is O(n), not O(1). - """ - try: - return self._find_no_duplicates(name, domain, path) - except KeyError: - return default - - def set(self, name, value, **kwargs): - """Dict-like set() that also supports optional domain and path args in - order to resolve naming collisions from using one cookie jar over - multiple domains. - """ - # support client code that unsets cookies by assignment of a None value: - if value is None: - remove_cookie_by_name( - self, name, domain=kwargs.get("domain"), path=kwargs.get("path") - ) - return - - if isinstance(value, Morsel): - c = morsel_to_cookie(value) - else: - c = create_cookie(name, value, **kwargs) - self.set_cookie(c) - return c - - def iterkeys(self): - """Dict-like iterkeys() that returns an iterator of names of cookies - from the jar. - - .. seealso:: itervalues() and iteritems(). - """ - for cookie in iter(self): - yield cookie.name - - def keys(self): - """Dict-like keys() that returns a list of names of cookies from the - jar. - - .. seealso:: values() and items(). - """ - return list(self.iterkeys()) - - def itervalues(self): - """Dict-like itervalues() that returns an iterator of values of cookies - from the jar. - - .. seealso:: iterkeys() and iteritems(). - """ - for cookie in iter(self): - yield cookie.value - - def values(self): - """Dict-like values() that returns a list of values of cookies from the - jar. - - .. seealso:: keys() and items(). - """ - return list(self.itervalues()) - - def iteritems(self): - """Dict-like iteritems() that returns an iterator of name-value tuples - from the jar. - - .. seealso:: iterkeys() and itervalues(). - """ - for cookie in iter(self): - yield cookie.name, cookie.value - - def items(self): - """Dict-like items() that returns a list of name-value tuples from the - jar. Allows client-code to call ``dict(RequestsCookieJar)`` and get a - vanilla python dict of key value pairs. - - .. seealso:: keys() and values(). - """ - return list(self.iteritems()) - - def list_domains(self): - """Utility method to list all the domains in the jar.""" - domains = [] - for cookie in iter(self): - if cookie.domain not in domains: - domains.append(cookie.domain) - return domains - - def list_paths(self): - """Utility method to list all the paths in the jar.""" - paths = [] - for cookie in iter(self): - if cookie.path not in paths: - paths.append(cookie.path) - return paths - - def multiple_domains(self): - """Returns True if there are multiple domains in the jar. - Returns False otherwise. - - :rtype: bool - """ - domains = [] - for cookie in iter(self): - if cookie.domain is not None and cookie.domain in domains: - return True - domains.append(cookie.domain) - return False # there is only one domain in jar - - def get_dict(self, domain=None, path=None): - """Takes as an argument an optional domain and path and returns a plain - old Python dict of name-value pairs of cookies that meet the - requirements. - - :rtype: dict - """ - dictionary = {} - for cookie in iter(self): - if (domain is None or cookie.domain == domain) and ( - path is None or cookie.path == path - ): - dictionary[cookie.name] = cookie.value - return dictionary - - def __contains__(self, name): - try: - return super().__contains__(name) - except CookieConflictError: - return True - - def __getitem__(self, name): - """Dict-like __getitem__() for compatibility with client code. Throws - exception if there are more than one cookie with name. In that case, - use the more explicit get() method instead. - - .. warning:: operation is O(n), not O(1). - """ - return self._find_no_duplicates(name) - - def __setitem__(self, name, value): - """Dict-like __setitem__ for compatibility with client code. Throws - exception if there is already a cookie of that name in the jar. In that - case, use the more explicit set() method instead. - """ - self.set(name, value) - - def __delitem__(self, name): - """Deletes a cookie given a name. Wraps ``cookielib.CookieJar``'s - ``remove_cookie_by_name()``. - """ - remove_cookie_by_name(self, name) - - def set_cookie(self, cookie, *args, **kwargs): - if ( - hasattr(cookie.value, "startswith") - and cookie.value.startswith('"') - and cookie.value.endswith('"') - ): - cookie.value = cookie.value.replace('\\"', "") - return super().set_cookie(cookie, *args, **kwargs) - - def update(self, other): - """Updates this jar with cookies from another CookieJar or dict-like""" - if isinstance(other, cookielib.CookieJar): - for cookie in other: - self.set_cookie(copy.copy(cookie)) - else: - super().update(other) - - def _find(self, name, domain=None, path=None): - """Requests uses this method internally to get cookie values. - - If there are conflicting cookies, _find arbitrarily chooses one. - See _find_no_duplicates if you want an exception thrown if there are - conflicting cookies. - - :param name: a string containing name of cookie - :param domain: (optional) string containing domain of cookie - :param path: (optional) string containing path of cookie - :return: cookie.value - """ - for cookie in iter(self): - if cookie.name == name: - if domain is None or cookie.domain == domain: - if path is None or cookie.path == path: - return cookie.value - - raise KeyError(f"name={name!r}, domain={domain!r}, path={path!r}") - - def _find_no_duplicates(self, name, domain=None, path=None): - """Both ``__get_item__`` and ``get`` call this function: it's never - used elsewhere in Requests. - - :param name: a string containing name of cookie - :param domain: (optional) string containing domain of cookie - :param path: (optional) string containing path of cookie - :raises KeyError: if cookie is not found - :raises CookieConflictError: if there are multiple cookies - that match name and optionally domain and path - :return: cookie.value - """ - toReturn = None - for cookie in iter(self): - if cookie.name == name: - if domain is None or cookie.domain == domain: - if path is None or cookie.path == path: - if toReturn is not None: - # if there are multiple cookies that meet passed in criteria - raise CookieConflictError( - f"There are multiple cookies with name, {name!r}" - ) - # we will eventually return this as long as no cookie conflict - toReturn = cookie.value - - if toReturn: - return toReturn - raise KeyError(f"name={name!r}, domain={domain!r}, path={path!r}") - - def __getstate__(self): - """Unlike a normal CookieJar, this class is pickleable.""" - state = self.__dict__.copy() - # remove the unpickleable RLock object - state.pop("_cookies_lock") - return state - - def __setstate__(self, state): - """Unlike a normal CookieJar, this class is pickleable.""" - self.__dict__.update(state) - if "_cookies_lock" not in self.__dict__: - self._cookies_lock = threading.RLock() - - def copy(self): - """Return a copy of this RequestsCookieJar.""" - new_cj = RequestsCookieJar() - new_cj.set_policy(self.get_policy()) - new_cj.update(self) - return new_cj - - def get_policy(self): - """Return the CookiePolicy instance used.""" - return self._policy - - -def _copy_cookie_jar(jar): - if jar is None: - return None - - if hasattr(jar, "copy"): - # We're dealing with an instance of RequestsCookieJar - return jar.copy() - # We're dealing with a generic CookieJar instance - new_jar = copy.copy(jar) - new_jar.clear() - for cookie in jar: - new_jar.set_cookie(copy.copy(cookie)) - return new_jar - - -def create_cookie(name, value, **kwargs): - """Make a cookie from underspecified parameters. - - By default, the pair of `name` and `value` will be set for the domain '' - and sent on every request (this is sometimes called a "supercookie"). - """ - result = { - "version": 0, - "name": name, - "value": value, - "port": None, - "domain": "", - "path": "/", - "secure": False, - "expires": None, - "discard": True, - "comment": None, - "comment_url": None, - "rest": {"HttpOnly": None}, - "rfc2109": False, - } - - badargs = set(kwargs) - set(result) - if badargs: - raise TypeError( - f"create_cookie() got unexpected keyword arguments: {list(badargs)}" - ) - - result.update(kwargs) - result["port_specified"] = bool(result["port"]) - result["domain_specified"] = bool(result["domain"]) - result["domain_initial_dot"] = result["domain"].startswith(".") - result["path_specified"] = bool(result["path"]) - - return cookielib.Cookie(**result) - - -def morsel_to_cookie(morsel): - """Convert a Morsel object into a Cookie containing the one k/v pair.""" - - expires = None - if morsel["max-age"]: - try: - expires = int(time.time() + int(morsel["max-age"])) - except ValueError: - raise TypeError(f"max-age: {morsel['max-age']} must be integer") - elif morsel["expires"]: - time_template = "%a, %d-%b-%Y %H:%M:%S GMT" - expires = calendar.timegm(time.strptime(morsel["expires"], time_template)) - return create_cookie( - comment=morsel["comment"], - comment_url=bool(morsel["comment"]), - discard=False, - domain=morsel["domain"], - expires=expires, - name=morsel.key, - path=morsel["path"], - port=None, - rest={"HttpOnly": morsel["httponly"]}, - rfc2109=False, - secure=bool(morsel["secure"]), - value=morsel.value, - version=morsel["version"] or 0, - ) - - -def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True): - """Returns a CookieJar from a key/value dictionary. - - :param cookie_dict: Dict of key/values to insert into CookieJar. - :param cookiejar: (optional) A cookiejar to add the cookies to. - :param overwrite: (optional) If False, will not replace cookies - already in the jar with new ones. - :rtype: CookieJar - """ - if cookiejar is None: - cookiejar = RequestsCookieJar() - - if cookie_dict is not None: - names_from_jar = [cookie.name for cookie in cookiejar] - for name in cookie_dict: - if overwrite or (name not in names_from_jar): - cookiejar.set_cookie(create_cookie(name, cookie_dict[name])) - - return cookiejar - - -def merge_cookies(cookiejar, cookies): - """Add cookies to cookiejar and returns a merged CookieJar. - - :param cookiejar: CookieJar object to add the cookies to. - :param cookies: Dictionary or CookieJar object to be added. - :rtype: CookieJar - """ - if not isinstance(cookiejar, cookielib.CookieJar): - raise ValueError("You can only merge into CookieJar") - - if isinstance(cookies, dict): - cookiejar = cookiejar_from_dict(cookies, cookiejar=cookiejar, overwrite=False) - elif isinstance(cookies, cookielib.CookieJar): - try: - cookiejar.update(cookies) - except AttributeError: - for cookie_in_jar in cookies: - cookiejar.set_cookie(cookie_in_jar) - - return cookiejar diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/exceptions.py b/venv/lib/python3.12/site-packages/pip/_vendor/requests/exceptions.py deleted file mode 100644 index 168d073..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/requests/exceptions.py +++ /dev/null @@ -1,141 +0,0 @@ -""" -requests.exceptions -~~~~~~~~~~~~~~~~~~~ - -This module contains the set of Requests' exceptions. -""" -from pip._vendor.urllib3.exceptions import HTTPError as BaseHTTPError - -from .compat import JSONDecodeError as CompatJSONDecodeError - - -class RequestException(IOError): - """There was an ambiguous exception that occurred while handling your - request. - """ - - def __init__(self, *args, **kwargs): - """Initialize RequestException with `request` and `response` objects.""" - response = kwargs.pop("response", None) - self.response = response - self.request = kwargs.pop("request", None) - if response is not None and not self.request and hasattr(response, "request"): - self.request = self.response.request - super().__init__(*args, **kwargs) - - -class InvalidJSONError(RequestException): - """A JSON error occurred.""" - - -class JSONDecodeError(InvalidJSONError, CompatJSONDecodeError): - """Couldn't decode the text into json""" - - def __init__(self, *args, **kwargs): - """ - Construct the JSONDecodeError instance first with all - args. Then use it's args to construct the IOError so that - the json specific args aren't used as IOError specific args - and the error message from JSONDecodeError is preserved. - """ - CompatJSONDecodeError.__init__(self, *args) - InvalidJSONError.__init__(self, *self.args, **kwargs) - - -class HTTPError(RequestException): - """An HTTP error occurred.""" - - -class ConnectionError(RequestException): - """A Connection error occurred.""" - - -class ProxyError(ConnectionError): - """A proxy error occurred.""" - - -class SSLError(ConnectionError): - """An SSL error occurred.""" - - -class Timeout(RequestException): - """The request timed out. - - Catching this error will catch both - :exc:`~requests.exceptions.ConnectTimeout` and - :exc:`~requests.exceptions.ReadTimeout` errors. - """ - - -class ConnectTimeout(ConnectionError, Timeout): - """The request timed out while trying to connect to the remote server. - - Requests that produced this error are safe to retry. - """ - - -class ReadTimeout(Timeout): - """The server did not send any data in the allotted amount of time.""" - - -class URLRequired(RequestException): - """A valid URL is required to make a request.""" - - -class TooManyRedirects(RequestException): - """Too many redirects.""" - - -class MissingSchema(RequestException, ValueError): - """The URL scheme (e.g. http or https) is missing.""" - - -class InvalidSchema(RequestException, ValueError): - """The URL scheme provided is either invalid or unsupported.""" - - -class InvalidURL(RequestException, ValueError): - """The URL provided was somehow invalid.""" - - -class InvalidHeader(RequestException, ValueError): - """The header value provided was somehow invalid.""" - - -class InvalidProxyURL(InvalidURL): - """The proxy URL provided is invalid.""" - - -class ChunkedEncodingError(RequestException): - """The server declared chunked encoding but sent an invalid chunk.""" - - -class ContentDecodingError(RequestException, BaseHTTPError): - """Failed to decode response content.""" - - -class StreamConsumedError(RequestException, TypeError): - """The content for this response was already consumed.""" - - -class RetryError(RequestException): - """Custom retries logic failed""" - - -class UnrewindableBodyError(RequestException): - """Requests encountered an error when trying to rewind a body.""" - - -# Warnings - - -class RequestsWarning(Warning): - """Base warning for Requests.""" - - -class FileModeWarning(RequestsWarning, DeprecationWarning): - """A file was opened in text mode, but Requests determined its binary length.""" - - -class RequestsDependencyWarning(RequestsWarning): - """An imported dependency doesn't match the expected version range.""" diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/help.py b/venv/lib/python3.12/site-packages/pip/_vendor/requests/help.py deleted file mode 100644 index 2d292c2..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/requests/help.py +++ /dev/null @@ -1,131 +0,0 @@ -"""Module containing bug report helper(s).""" - -import json -import platform -import ssl -import sys - -from pip._vendor import idna -from pip._vendor import urllib3 - -from . import __version__ as requests_version - -charset_normalizer = None - -try: - from pip._vendor import chardet -except ImportError: - chardet = None - -try: - from pip._vendor.urllib3.contrib import pyopenssl -except ImportError: - pyopenssl = None - OpenSSL = None - cryptography = None -else: - import cryptography - import OpenSSL - - -def _implementation(): - """Return a dict with the Python implementation and version. - - Provide both the name and the version of the Python implementation - currently running. For example, on CPython 3.10.3 it will return - {'name': 'CPython', 'version': '3.10.3'}. - - This function works best on CPython and PyPy: in particular, it probably - doesn't work for Jython or IronPython. Future investigation should be done - to work out the correct shape of the code for those platforms. - """ - implementation = platform.python_implementation() - - if implementation == "CPython": - implementation_version = platform.python_version() - elif implementation == "PyPy": - implementation_version = "{}.{}.{}".format( - sys.pypy_version_info.major, - sys.pypy_version_info.minor, - sys.pypy_version_info.micro, - ) - if sys.pypy_version_info.releaselevel != "final": - implementation_version = "".join( - [implementation_version, sys.pypy_version_info.releaselevel] - ) - elif implementation == "Jython": - implementation_version = platform.python_version() # Complete Guess - elif implementation == "IronPython": - implementation_version = platform.python_version() # Complete Guess - else: - implementation_version = "Unknown" - - return {"name": implementation, "version": implementation_version} - - -def info(): - """Generate information for a bug report.""" - try: - platform_info = { - "system": platform.system(), - "release": platform.release(), - } - except OSError: - platform_info = { - "system": "Unknown", - "release": "Unknown", - } - - implementation_info = _implementation() - urllib3_info = {"version": urllib3.__version__} - charset_normalizer_info = {"version": None} - chardet_info = {"version": None} - if charset_normalizer: - charset_normalizer_info = {"version": charset_normalizer.__version__} - if chardet: - chardet_info = {"version": chardet.__version__} - - pyopenssl_info = { - "version": None, - "openssl_version": "", - } - if OpenSSL: - pyopenssl_info = { - "version": OpenSSL.__version__, - "openssl_version": f"{OpenSSL.SSL.OPENSSL_VERSION_NUMBER:x}", - } - cryptography_info = { - "version": getattr(cryptography, "__version__", ""), - } - idna_info = { - "version": getattr(idna, "__version__", ""), - } - - system_ssl = ssl.OPENSSL_VERSION_NUMBER - system_ssl_info = {"version": f"{system_ssl:x}" if system_ssl is not None else ""} - - return { - "platform": platform_info, - "implementation": implementation_info, - "system_ssl": system_ssl_info, - "using_pyopenssl": pyopenssl is not None, - "using_charset_normalizer": chardet is None, - "pyOpenSSL": pyopenssl_info, - "urllib3": urllib3_info, - "chardet": chardet_info, - "charset_normalizer": charset_normalizer_info, - "cryptography": cryptography_info, - "idna": idna_info, - "requests": { - "version": requests_version, - }, - } - - -def main(): - """Pretty-print the bug information as JSON.""" - print(json.dumps(info(), sort_keys=True, indent=2)) - - -if __name__ == "__main__": - main() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/hooks.py b/venv/lib/python3.12/site-packages/pip/_vendor/requests/hooks.py deleted file mode 100644 index d181ba2..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/requests/hooks.py +++ /dev/null @@ -1,33 +0,0 @@ -""" -requests.hooks -~~~~~~~~~~~~~~ - -This module provides the capabilities for the Requests hooks system. - -Available hooks: - -``response``: - The response generated from a Request. -""" -HOOKS = ["response"] - - -def default_hooks(): - return {event: [] for event in HOOKS} - - -# TODO: response is the only one - - -def dispatch_hook(key, hooks, hook_data, **kwargs): - """Dispatches a hook dictionary on a given piece of data.""" - hooks = hooks or {} - hooks = hooks.get(key) - if hooks: - if hasattr(hooks, "__call__"): - hooks = [hooks] - for hook in hooks: - _hook_data = hook(hook_data, **kwargs) - if _hook_data is not None: - hook_data = _hook_data - return hook_data diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/models.py b/venv/lib/python3.12/site-packages/pip/_vendor/requests/models.py deleted file mode 100644 index 76e6f19..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/requests/models.py +++ /dev/null @@ -1,1034 +0,0 @@ -""" -requests.models -~~~~~~~~~~~~~~~ - -This module contains the primary objects that power Requests. -""" - -import datetime - -# Import encoding now, to avoid implicit import later. -# Implicit import within threads may cause LookupError when standard library is in a ZIP, -# such as in Embedded Python. See https://github.com/psf/requests/issues/3578. -import encodings.idna # noqa: F401 -from io import UnsupportedOperation - -from pip._vendor.urllib3.exceptions import ( - DecodeError, - LocationParseError, - ProtocolError, - ReadTimeoutError, - SSLError, -) -from pip._vendor.urllib3.fields import RequestField -from pip._vendor.urllib3.filepost import encode_multipart_formdata -from pip._vendor.urllib3.util import parse_url - -from ._internal_utils import to_native_string, unicode_is_ascii -from .auth import HTTPBasicAuth -from .compat import ( - Callable, - JSONDecodeError, - Mapping, - basestring, - builtin_str, - chardet, - cookielib, -) -from .compat import json as complexjson -from .compat import urlencode, urlsplit, urlunparse -from .cookies import _copy_cookie_jar, cookiejar_from_dict, get_cookie_header -from .exceptions import ( - ChunkedEncodingError, - ConnectionError, - ContentDecodingError, - HTTPError, - InvalidJSONError, - InvalidURL, -) -from .exceptions import JSONDecodeError as RequestsJSONDecodeError -from .exceptions import MissingSchema -from .exceptions import SSLError as RequestsSSLError -from .exceptions import StreamConsumedError -from .hooks import default_hooks -from .status_codes import codes -from .structures import CaseInsensitiveDict -from .utils import ( - check_header_validity, - get_auth_from_url, - guess_filename, - guess_json_utf, - iter_slices, - parse_header_links, - requote_uri, - stream_decode_response_unicode, - super_len, - to_key_val_list, -) - -#: The set of HTTP status codes that indicate an automatically -#: processable redirect. -REDIRECT_STATI = ( - codes.moved, # 301 - codes.found, # 302 - codes.other, # 303 - codes.temporary_redirect, # 307 - codes.permanent_redirect, # 308 -) - -DEFAULT_REDIRECT_LIMIT = 30 -CONTENT_CHUNK_SIZE = 10 * 1024 -ITER_CHUNK_SIZE = 512 - - -class RequestEncodingMixin: - @property - def path_url(self): - """Build the path URL to use.""" - - url = [] - - p = urlsplit(self.url) - - path = p.path - if not path: - path = "/" - - url.append(path) - - query = p.query - if query: - url.append("?") - url.append(query) - - return "".join(url) - - @staticmethod - def _encode_params(data): - """Encode parameters in a piece of data. - - Will successfully encode parameters when passed as a dict or a list of - 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary - if parameters are supplied as a dict. - """ - - if isinstance(data, (str, bytes)): - return data - elif hasattr(data, "read"): - return data - elif hasattr(data, "__iter__"): - result = [] - for k, vs in to_key_val_list(data): - if isinstance(vs, basestring) or not hasattr(vs, "__iter__"): - vs = [vs] - for v in vs: - if v is not None: - result.append( - ( - k.encode("utf-8") if isinstance(k, str) else k, - v.encode("utf-8") if isinstance(v, str) else v, - ) - ) - return urlencode(result, doseq=True) - else: - return data - - @staticmethod - def _encode_files(files, data): - """Build the body for a multipart/form-data request. - - Will successfully encode files when passed as a dict or a list of - tuples. Order is retained if data is a list of tuples but arbitrary - if parameters are supplied as a dict. - The tuples may be 2-tuples (filename, fileobj), 3-tuples (filename, fileobj, contentype) - or 4-tuples (filename, fileobj, contentype, custom_headers). - """ - if not files: - raise ValueError("Files must be provided.") - elif isinstance(data, basestring): - raise ValueError("Data must not be a string.") - - new_fields = [] - fields = to_key_val_list(data or {}) - files = to_key_val_list(files or {}) - - for field, val in fields: - if isinstance(val, basestring) or not hasattr(val, "__iter__"): - val = [val] - for v in val: - if v is not None: - # Don't call str() on bytestrings: in Py3 it all goes wrong. - if not isinstance(v, bytes): - v = str(v) - - new_fields.append( - ( - field.decode("utf-8") - if isinstance(field, bytes) - else field, - v.encode("utf-8") if isinstance(v, str) else v, - ) - ) - - for (k, v) in files: - # support for explicit filename - ft = None - fh = None - if isinstance(v, (tuple, list)): - if len(v) == 2: - fn, fp = v - elif len(v) == 3: - fn, fp, ft = v - else: - fn, fp, ft, fh = v - else: - fn = guess_filename(v) or k - fp = v - - if isinstance(fp, (str, bytes, bytearray)): - fdata = fp - elif hasattr(fp, "read"): - fdata = fp.read() - elif fp is None: - continue - else: - fdata = fp - - rf = RequestField(name=k, data=fdata, filename=fn, headers=fh) - rf.make_multipart(content_type=ft) - new_fields.append(rf) - - body, content_type = encode_multipart_formdata(new_fields) - - return body, content_type - - -class RequestHooksMixin: - def register_hook(self, event, hook): - """Properly register a hook.""" - - if event not in self.hooks: - raise ValueError(f'Unsupported event specified, with event name "{event}"') - - if isinstance(hook, Callable): - self.hooks[event].append(hook) - elif hasattr(hook, "__iter__"): - self.hooks[event].extend(h for h in hook if isinstance(h, Callable)) - - def deregister_hook(self, event, hook): - """Deregister a previously registered hook. - Returns True if the hook existed, False if not. - """ - - try: - self.hooks[event].remove(hook) - return True - except ValueError: - return False - - -class Request(RequestHooksMixin): - """A user-created :class:`Request <Request>` object. - - Used to prepare a :class:`PreparedRequest <PreparedRequest>`, which is sent to the server. - - :param method: HTTP method to use. - :param url: URL to send. - :param headers: dictionary of headers to send. - :param files: dictionary of {filename: fileobject} files to multipart upload. - :param data: the body to attach to the request. If a dictionary or - list of tuples ``[(key, value)]`` is provided, form-encoding will - take place. - :param json: json for the body to attach to the request (if files or data is not specified). - :param params: URL parameters to append to the URL. If a dictionary or - list of tuples ``[(key, value)]`` is provided, form-encoding will - take place. - :param auth: Auth handler or (user, pass) tuple. - :param cookies: dictionary or CookieJar of cookies to attach to this request. - :param hooks: dictionary of callback hooks, for internal usage. - - Usage:: - - >>> import requests - >>> req = requests.Request('GET', 'https://httpbin.org/get') - >>> req.prepare() - <PreparedRequest [GET]> - """ - - def __init__( - self, - method=None, - url=None, - headers=None, - files=None, - data=None, - params=None, - auth=None, - cookies=None, - hooks=None, - json=None, - ): - - # Default empty dicts for dict params. - data = [] if data is None else data - files = [] if files is None else files - headers = {} if headers is None else headers - params = {} if params is None else params - hooks = {} if hooks is None else hooks - - self.hooks = default_hooks() - for (k, v) in list(hooks.items()): - self.register_hook(event=k, hook=v) - - self.method = method - self.url = url - self.headers = headers - self.files = files - self.data = data - self.json = json - self.params = params - self.auth = auth - self.cookies = cookies - - def __repr__(self): - return f"<Request [{self.method}]>" - - def prepare(self): - """Constructs a :class:`PreparedRequest <PreparedRequest>` for transmission and returns it.""" - p = PreparedRequest() - p.prepare( - method=self.method, - url=self.url, - headers=self.headers, - files=self.files, - data=self.data, - json=self.json, - params=self.params, - auth=self.auth, - cookies=self.cookies, - hooks=self.hooks, - ) - return p - - -class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): - """The fully mutable :class:`PreparedRequest <PreparedRequest>` object, - containing the exact bytes that will be sent to the server. - - Instances are generated from a :class:`Request <Request>` object, and - should not be instantiated manually; doing so may produce undesirable - effects. - - Usage:: - - >>> import requests - >>> req = requests.Request('GET', 'https://httpbin.org/get') - >>> r = req.prepare() - >>> r - <PreparedRequest [GET]> - - >>> s = requests.Session() - >>> s.send(r) - <Response [200]> - """ - - def __init__(self): - #: HTTP verb to send to the server. - self.method = None - #: HTTP URL to send the request to. - self.url = None - #: dictionary of HTTP headers. - self.headers = None - # The `CookieJar` used to create the Cookie header will be stored here - # after prepare_cookies is called - self._cookies = None - #: request body to send to the server. - self.body = None - #: dictionary of callback hooks, for internal usage. - self.hooks = default_hooks() - #: integer denoting starting position of a readable file-like body. - self._body_position = None - - def prepare( - self, - method=None, - url=None, - headers=None, - files=None, - data=None, - params=None, - auth=None, - cookies=None, - hooks=None, - json=None, - ): - """Prepares the entire request with the given parameters.""" - - self.prepare_method(method) - self.prepare_url(url, params) - self.prepare_headers(headers) - self.prepare_cookies(cookies) - self.prepare_body(data, files, json) - self.prepare_auth(auth, url) - - # Note that prepare_auth must be last to enable authentication schemes - # such as OAuth to work on a fully prepared request. - - # This MUST go after prepare_auth. Authenticators could add a hook - self.prepare_hooks(hooks) - - def __repr__(self): - return f"<PreparedRequest [{self.method}]>" - - def copy(self): - p = PreparedRequest() - p.method = self.method - p.url = self.url - p.headers = self.headers.copy() if self.headers is not None else None - p._cookies = _copy_cookie_jar(self._cookies) - p.body = self.body - p.hooks = self.hooks - p._body_position = self._body_position - return p - - def prepare_method(self, method): - """Prepares the given HTTP method.""" - self.method = method - if self.method is not None: - self.method = to_native_string(self.method.upper()) - - @staticmethod - def _get_idna_encoded_host(host): - from pip._vendor import idna - - try: - host = idna.encode(host, uts46=True).decode("utf-8") - except idna.IDNAError: - raise UnicodeError - return host - - def prepare_url(self, url, params): - """Prepares the given HTTP URL.""" - #: Accept objects that have string representations. - #: We're unable to blindly call unicode/str functions - #: as this will include the bytestring indicator (b'') - #: on python 3.x. - #: https://github.com/psf/requests/pull/2238 - if isinstance(url, bytes): - url = url.decode("utf8") - else: - url = str(url) - - # Remove leading whitespaces from url - url = url.lstrip() - - # Don't do any URL preparation for non-HTTP schemes like `mailto`, - # `data` etc to work around exceptions from `url_parse`, which - # handles RFC 3986 only. - if ":" in url and not url.lower().startswith("http"): - self.url = url - return - - # Support for unicode domain names and paths. - try: - scheme, auth, host, port, path, query, fragment = parse_url(url) - except LocationParseError as e: - raise InvalidURL(*e.args) - - if not scheme: - raise MissingSchema( - f"Invalid URL {url!r}: No scheme supplied. " - f"Perhaps you meant https://{url}?" - ) - - if not host: - raise InvalidURL(f"Invalid URL {url!r}: No host supplied") - - # In general, we want to try IDNA encoding the hostname if the string contains - # non-ASCII characters. This allows users to automatically get the correct IDNA - # behaviour. For strings containing only ASCII characters, we need to also verify - # it doesn't start with a wildcard (*), before allowing the unencoded hostname. - if not unicode_is_ascii(host): - try: - host = self._get_idna_encoded_host(host) - except UnicodeError: - raise InvalidURL("URL has an invalid label.") - elif host.startswith(("*", ".")): - raise InvalidURL("URL has an invalid label.") - - # Carefully reconstruct the network location - netloc = auth or "" - if netloc: - netloc += "@" - netloc += host - if port: - netloc += f":{port}" - - # Bare domains aren't valid URLs. - if not path: - path = "/" - - if isinstance(params, (str, bytes)): - params = to_native_string(params) - - enc_params = self._encode_params(params) - if enc_params: - if query: - query = f"{query}&{enc_params}" - else: - query = enc_params - - url = requote_uri(urlunparse([scheme, netloc, path, None, query, fragment])) - self.url = url - - def prepare_headers(self, headers): - """Prepares the given HTTP headers.""" - - self.headers = CaseInsensitiveDict() - if headers: - for header in headers.items(): - # Raise exception on invalid header value. - check_header_validity(header) - name, value = header - self.headers[to_native_string(name)] = value - - def prepare_body(self, data, files, json=None): - """Prepares the given HTTP body data.""" - - # Check if file, fo, generator, iterator. - # If not, run through normal process. - - # Nottin' on you. - body = None - content_type = None - - if not data and json is not None: - # urllib3 requires a bytes-like body. Python 2's json.dumps - # provides this natively, but Python 3 gives a Unicode string. - content_type = "application/json" - - try: - body = complexjson.dumps(json, allow_nan=False) - except ValueError as ve: - raise InvalidJSONError(ve, request=self) - - if not isinstance(body, bytes): - body = body.encode("utf-8") - - is_stream = all( - [ - hasattr(data, "__iter__"), - not isinstance(data, (basestring, list, tuple, Mapping)), - ] - ) - - if is_stream: - try: - length = super_len(data) - except (TypeError, AttributeError, UnsupportedOperation): - length = None - - body = data - - if getattr(body, "tell", None) is not None: - # Record the current file position before reading. - # This will allow us to rewind a file in the event - # of a redirect. - try: - self._body_position = body.tell() - except OSError: - # This differentiates from None, allowing us to catch - # a failed `tell()` later when trying to rewind the body - self._body_position = object() - - if files: - raise NotImplementedError( - "Streamed bodies and files are mutually exclusive." - ) - - if length: - self.headers["Content-Length"] = builtin_str(length) - else: - self.headers["Transfer-Encoding"] = "chunked" - else: - # Multi-part file uploads. - if files: - (body, content_type) = self._encode_files(files, data) - else: - if data: - body = self._encode_params(data) - if isinstance(data, basestring) or hasattr(data, "read"): - content_type = None - else: - content_type = "application/x-www-form-urlencoded" - - self.prepare_content_length(body) - - # Add content-type if it wasn't explicitly provided. - if content_type and ("content-type" not in self.headers): - self.headers["Content-Type"] = content_type - - self.body = body - - def prepare_content_length(self, body): - """Prepare Content-Length header based on request method and body""" - if body is not None: - length = super_len(body) - if length: - # If length exists, set it. Otherwise, we fallback - # to Transfer-Encoding: chunked. - self.headers["Content-Length"] = builtin_str(length) - elif ( - self.method not in ("GET", "HEAD") - and self.headers.get("Content-Length") is None - ): - # Set Content-Length to 0 for methods that can have a body - # but don't provide one. (i.e. not GET or HEAD) - self.headers["Content-Length"] = "0" - - def prepare_auth(self, auth, url=""): - """Prepares the given HTTP auth data.""" - - # If no Auth is explicitly provided, extract it from the URL first. - if auth is None: - url_auth = get_auth_from_url(self.url) - auth = url_auth if any(url_auth) else None - - if auth: - if isinstance(auth, tuple) and len(auth) == 2: - # special-case basic HTTP auth - auth = HTTPBasicAuth(*auth) - - # Allow auth to make its changes. - r = auth(self) - - # Update self to reflect the auth changes. - self.__dict__.update(r.__dict__) - - # Recompute Content-Length - self.prepare_content_length(self.body) - - def prepare_cookies(self, cookies): - """Prepares the given HTTP cookie data. - - This function eventually generates a ``Cookie`` header from the - given cookies using cookielib. Due to cookielib's design, the header - will not be regenerated if it already exists, meaning this function - can only be called once for the life of the - :class:`PreparedRequest <PreparedRequest>` object. Any subsequent calls - to ``prepare_cookies`` will have no actual effect, unless the "Cookie" - header is removed beforehand. - """ - if isinstance(cookies, cookielib.CookieJar): - self._cookies = cookies - else: - self._cookies = cookiejar_from_dict(cookies) - - cookie_header = get_cookie_header(self._cookies, self) - if cookie_header is not None: - self.headers["Cookie"] = cookie_header - - def prepare_hooks(self, hooks): - """Prepares the given hooks.""" - # hooks can be passed as None to the prepare method and to this - # method. To prevent iterating over None, simply use an empty list - # if hooks is False-y - hooks = hooks or [] - for event in hooks: - self.register_hook(event, hooks[event]) - - -class Response: - """The :class:`Response <Response>` object, which contains a - server's response to an HTTP request. - """ - - __attrs__ = [ - "_content", - "status_code", - "headers", - "url", - "history", - "encoding", - "reason", - "cookies", - "elapsed", - "request", - ] - - def __init__(self): - self._content = False - self._content_consumed = False - self._next = None - - #: Integer Code of responded HTTP Status, e.g. 404 or 200. - self.status_code = None - - #: Case-insensitive Dictionary of Response Headers. - #: For example, ``headers['content-encoding']`` will return the - #: value of a ``'Content-Encoding'`` response header. - self.headers = CaseInsensitiveDict() - - #: File-like object representation of response (for advanced usage). - #: Use of ``raw`` requires that ``stream=True`` be set on the request. - #: This requirement does not apply for use internally to Requests. - self.raw = None - - #: Final URL location of Response. - self.url = None - - #: Encoding to decode with when accessing r.text. - self.encoding = None - - #: A list of :class:`Response <Response>` objects from - #: the history of the Request. Any redirect responses will end - #: up here. The list is sorted from the oldest to the most recent request. - self.history = [] - - #: Textual reason of responded HTTP Status, e.g. "Not Found" or "OK". - self.reason = None - - #: A CookieJar of Cookies the server sent back. - self.cookies = cookiejar_from_dict({}) - - #: The amount of time elapsed between sending the request - #: and the arrival of the response (as a timedelta). - #: This property specifically measures the time taken between sending - #: the first byte of the request and finishing parsing the headers. It - #: is therefore unaffected by consuming the response content or the - #: value of the ``stream`` keyword argument. - self.elapsed = datetime.timedelta(0) - - #: The :class:`PreparedRequest <PreparedRequest>` object to which this - #: is a response. - self.request = None - - def __enter__(self): - return self - - def __exit__(self, *args): - self.close() - - def __getstate__(self): - # Consume everything; accessing the content attribute makes - # sure the content has been fully read. - if not self._content_consumed: - self.content - - return {attr: getattr(self, attr, None) for attr in self.__attrs__} - - def __setstate__(self, state): - for name, value in state.items(): - setattr(self, name, value) - - # pickled objects do not have .raw - setattr(self, "_content_consumed", True) - setattr(self, "raw", None) - - def __repr__(self): - return f"<Response [{self.status_code}]>" - - def __bool__(self): - """Returns True if :attr:`status_code` is less than 400. - - This attribute checks if the status code of the response is between - 400 and 600 to see if there was a client error or a server error. If - the status code, is between 200 and 400, this will return True. This - is **not** a check to see if the response code is ``200 OK``. - """ - return self.ok - - def __nonzero__(self): - """Returns True if :attr:`status_code` is less than 400. - - This attribute checks if the status code of the response is between - 400 and 600 to see if there was a client error or a server error. If - the status code, is between 200 and 400, this will return True. This - is **not** a check to see if the response code is ``200 OK``. - """ - return self.ok - - def __iter__(self): - """Allows you to use a response as an iterator.""" - return self.iter_content(128) - - @property - def ok(self): - """Returns True if :attr:`status_code` is less than 400, False if not. - - This attribute checks if the status code of the response is between - 400 and 600 to see if there was a client error or a server error. If - the status code is between 200 and 400, this will return True. This - is **not** a check to see if the response code is ``200 OK``. - """ - try: - self.raise_for_status() - except HTTPError: - return False - return True - - @property - def is_redirect(self): - """True if this Response is a well-formed HTTP redirect that could have - been processed automatically (by :meth:`Session.resolve_redirects`). - """ - return "location" in self.headers and self.status_code in REDIRECT_STATI - - @property - def is_permanent_redirect(self): - """True if this Response one of the permanent versions of redirect.""" - return "location" in self.headers and self.status_code in ( - codes.moved_permanently, - codes.permanent_redirect, - ) - - @property - def next(self): - """Returns a PreparedRequest for the next request in a redirect chain, if there is one.""" - return self._next - - @property - def apparent_encoding(self): - """The apparent encoding, provided by the charset_normalizer or chardet libraries.""" - return chardet.detect(self.content)["encoding"] - - def iter_content(self, chunk_size=1, decode_unicode=False): - """Iterates over the response data. When stream=True is set on the - request, this avoids reading the content at once into memory for - large responses. The chunk size is the number of bytes it should - read into memory. This is not necessarily the length of each item - returned as decoding can take place. - - chunk_size must be of type int or None. A value of None will - function differently depending on the value of `stream`. - stream=True will read data as it arrives in whatever size the - chunks are received. If stream=False, data is returned as - a single chunk. - - If decode_unicode is True, content will be decoded using the best - available encoding based on the response. - """ - - def generate(): - # Special case for urllib3. - if hasattr(self.raw, "stream"): - try: - yield from self.raw.stream(chunk_size, decode_content=True) - except ProtocolError as e: - raise ChunkedEncodingError(e) - except DecodeError as e: - raise ContentDecodingError(e) - except ReadTimeoutError as e: - raise ConnectionError(e) - except SSLError as e: - raise RequestsSSLError(e) - else: - # Standard file-like object. - while True: - chunk = self.raw.read(chunk_size) - if not chunk: - break - yield chunk - - self._content_consumed = True - - if self._content_consumed and isinstance(self._content, bool): - raise StreamConsumedError() - elif chunk_size is not None and not isinstance(chunk_size, int): - raise TypeError( - f"chunk_size must be an int, it is instead a {type(chunk_size)}." - ) - # simulate reading small chunks of the content - reused_chunks = iter_slices(self._content, chunk_size) - - stream_chunks = generate() - - chunks = reused_chunks if self._content_consumed else stream_chunks - - if decode_unicode: - chunks = stream_decode_response_unicode(chunks, self) - - return chunks - - def iter_lines( - self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=False, delimiter=None - ): - """Iterates over the response data, one line at a time. When - stream=True is set on the request, this avoids reading the - content at once into memory for large responses. - - .. note:: This method is not reentrant safe. - """ - - pending = None - - for chunk in self.iter_content( - chunk_size=chunk_size, decode_unicode=decode_unicode - ): - - if pending is not None: - chunk = pending + chunk - - if delimiter: - lines = chunk.split(delimiter) - else: - lines = chunk.splitlines() - - if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]: - pending = lines.pop() - else: - pending = None - - yield from lines - - if pending is not None: - yield pending - - @property - def content(self): - """Content of the response, in bytes.""" - - if self._content is False: - # Read the contents. - if self._content_consumed: - raise RuntimeError("The content for this response was already consumed") - - if self.status_code == 0 or self.raw is None: - self._content = None - else: - self._content = b"".join(self.iter_content(CONTENT_CHUNK_SIZE)) or b"" - - self._content_consumed = True - # don't need to release the connection; that's been handled by urllib3 - # since we exhausted the data. - return self._content - - @property - def text(self): - """Content of the response, in unicode. - - If Response.encoding is None, encoding will be guessed using - ``charset_normalizer`` or ``chardet``. - - The encoding of the response content is determined based solely on HTTP - headers, following RFC 2616 to the letter. If you can take advantage of - non-HTTP knowledge to make a better guess at the encoding, you should - set ``r.encoding`` appropriately before accessing this property. - """ - - # Try charset from content-type - content = None - encoding = self.encoding - - if not self.content: - return "" - - # Fallback to auto-detected encoding. - if self.encoding is None: - encoding = self.apparent_encoding - - # Decode unicode from given encoding. - try: - content = str(self.content, encoding, errors="replace") - except (LookupError, TypeError): - # A LookupError is raised if the encoding was not found which could - # indicate a misspelling or similar mistake. - # - # A TypeError can be raised if encoding is None - # - # So we try blindly encoding. - content = str(self.content, errors="replace") - - return content - - def json(self, **kwargs): - r"""Returns the json-encoded content of a response, if any. - - :param \*\*kwargs: Optional arguments that ``json.loads`` takes. - :raises requests.exceptions.JSONDecodeError: If the response body does not - contain valid json. - """ - - if not self.encoding and self.content and len(self.content) > 3: - # No encoding set. JSON RFC 4627 section 3 states we should expect - # UTF-8, -16 or -32. Detect which one to use; If the detection or - # decoding fails, fall back to `self.text` (using charset_normalizer to make - # a best guess). - encoding = guess_json_utf(self.content) - if encoding is not None: - try: - return complexjson.loads(self.content.decode(encoding), **kwargs) - except UnicodeDecodeError: - # Wrong UTF codec detected; usually because it's not UTF-8 - # but some other 8-bit codec. This is an RFC violation, - # and the server didn't bother to tell us what codec *was* - # used. - pass - except JSONDecodeError as e: - raise RequestsJSONDecodeError(e.msg, e.doc, e.pos) - - try: - return complexjson.loads(self.text, **kwargs) - except JSONDecodeError as e: - # Catch JSON-related errors and raise as requests.JSONDecodeError - # This aliases json.JSONDecodeError and simplejson.JSONDecodeError - raise RequestsJSONDecodeError(e.msg, e.doc, e.pos) - - @property - def links(self): - """Returns the parsed header links of the response, if any.""" - - header = self.headers.get("link") - - resolved_links = {} - - if header: - links = parse_header_links(header) - - for link in links: - key = link.get("rel") or link.get("url") - resolved_links[key] = link - - return resolved_links - - def raise_for_status(self): - """Raises :class:`HTTPError`, if one occurred.""" - - http_error_msg = "" - if isinstance(self.reason, bytes): - # We attempt to decode utf-8 first because some servers - # choose to localize their reason strings. If the string - # isn't utf-8, we fall back to iso-8859-1 for all other - # encodings. (See PR #3538) - try: - reason = self.reason.decode("utf-8") - except UnicodeDecodeError: - reason = self.reason.decode("iso-8859-1") - else: - reason = self.reason - - if 400 <= self.status_code < 500: - http_error_msg = ( - f"{self.status_code} Client Error: {reason} for url: {self.url}" - ) - - elif 500 <= self.status_code < 600: - http_error_msg = ( - f"{self.status_code} Server Error: {reason} for url: {self.url}" - ) - - if http_error_msg: - raise HTTPError(http_error_msg, response=self) - - def close(self): - """Releases the connection back to the pool. Once this method has been - called the underlying ``raw`` object must not be accessed again. - - *Note: Should not normally need to be called explicitly.* - """ - if not self._content_consumed: - self.raw.close() - - release_conn = getattr(self.raw, "release_conn", None) - if release_conn is not None: - release_conn() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/packages.py b/venv/lib/python3.12/site-packages/pip/_vendor/requests/packages.py deleted file mode 100644 index 9582fa7..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/requests/packages.py +++ /dev/null @@ -1,16 +0,0 @@ -import sys - -# This code exists for backwards compatibility reasons. -# I don't like it either. Just look the other way. :) - -for package in ('urllib3', 'idna', 'chardet'): - vendored_package = "pip._vendor." + package - locals()[package] = __import__(vendored_package) - # This traversal is apparently necessary such that the identities are - # preserved (requests.packages.urllib3.* is urllib3.*) - for mod in list(sys.modules): - if mod == vendored_package or mod.startswith(vendored_package + '.'): - unprefixed_mod = mod[len("pip._vendor."):] - sys.modules['pip._vendor.requests.packages.' + unprefixed_mod] = sys.modules[mod] - -# Kinda cool, though, right? diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/sessions.py b/venv/lib/python3.12/site-packages/pip/_vendor/requests/sessions.py deleted file mode 100644 index dbcf2a7..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/requests/sessions.py +++ /dev/null @@ -1,833 +0,0 @@ -""" -requests.sessions -~~~~~~~~~~~~~~~~~ - -This module provides a Session object to manage and persist settings across -requests (cookies, auth, proxies). -""" -import os -import sys -import time -from collections import OrderedDict -from datetime import timedelta - -from ._internal_utils import to_native_string -from .adapters import HTTPAdapter -from .auth import _basic_auth_str -from .compat import Mapping, cookielib, urljoin, urlparse -from .cookies import ( - RequestsCookieJar, - cookiejar_from_dict, - extract_cookies_to_jar, - merge_cookies, -) -from .exceptions import ( - ChunkedEncodingError, - ContentDecodingError, - InvalidSchema, - TooManyRedirects, -) -from .hooks import default_hooks, dispatch_hook - -# formerly defined here, reexposed here for backward compatibility -from .models import ( # noqa: F401 - DEFAULT_REDIRECT_LIMIT, - REDIRECT_STATI, - PreparedRequest, - Request, -) -from .status_codes import codes -from .structures import CaseInsensitiveDict -from .utils import ( # noqa: F401 - DEFAULT_PORTS, - default_headers, - get_auth_from_url, - get_environ_proxies, - get_netrc_auth, - requote_uri, - resolve_proxies, - rewind_body, - should_bypass_proxies, - to_key_val_list, -) - -# Preferred clock, based on which one is more accurate on a given system. -if sys.platform == "win32": - preferred_clock = time.perf_counter -else: - preferred_clock = time.time - - -def merge_setting(request_setting, session_setting, dict_class=OrderedDict): - """Determines appropriate setting for a given request, taking into account - the explicit setting on that request, and the setting in the session. If a - setting is a dictionary, they will be merged together using `dict_class` - """ - - if session_setting is None: - return request_setting - - if request_setting is None: - return session_setting - - # Bypass if not a dictionary (e.g. verify) - if not ( - isinstance(session_setting, Mapping) and isinstance(request_setting, Mapping) - ): - return request_setting - - merged_setting = dict_class(to_key_val_list(session_setting)) - merged_setting.update(to_key_val_list(request_setting)) - - # Remove keys that are set to None. Extract keys first to avoid altering - # the dictionary during iteration. - none_keys = [k for (k, v) in merged_setting.items() if v is None] - for key in none_keys: - del merged_setting[key] - - return merged_setting - - -def merge_hooks(request_hooks, session_hooks, dict_class=OrderedDict): - """Properly merges both requests and session hooks. - - This is necessary because when request_hooks == {'response': []}, the - merge breaks Session hooks entirely. - """ - if session_hooks is None or session_hooks.get("response") == []: - return request_hooks - - if request_hooks is None or request_hooks.get("response") == []: - return session_hooks - - return merge_setting(request_hooks, session_hooks, dict_class) - - -class SessionRedirectMixin: - def get_redirect_target(self, resp): - """Receives a Response. Returns a redirect URI or ``None``""" - # Due to the nature of how requests processes redirects this method will - # be called at least once upon the original response and at least twice - # on each subsequent redirect response (if any). - # If a custom mixin is used to handle this logic, it may be advantageous - # to cache the redirect location onto the response object as a private - # attribute. - if resp.is_redirect: - location = resp.headers["location"] - # Currently the underlying http module on py3 decode headers - # in latin1, but empirical evidence suggests that latin1 is very - # rarely used with non-ASCII characters in HTTP headers. - # It is more likely to get UTF8 header rather than latin1. - # This causes incorrect handling of UTF8 encoded location headers. - # To solve this, we re-encode the location in latin1. - location = location.encode("latin1") - return to_native_string(location, "utf8") - return None - - def should_strip_auth(self, old_url, new_url): - """Decide whether Authorization header should be removed when redirecting""" - old_parsed = urlparse(old_url) - new_parsed = urlparse(new_url) - if old_parsed.hostname != new_parsed.hostname: - return True - # Special case: allow http -> https redirect when using the standard - # ports. This isn't specified by RFC 7235, but is kept to avoid - # breaking backwards compatibility with older versions of requests - # that allowed any redirects on the same host. - if ( - old_parsed.scheme == "http" - and old_parsed.port in (80, None) - and new_parsed.scheme == "https" - and new_parsed.port in (443, None) - ): - return False - - # Handle default port usage corresponding to scheme. - changed_port = old_parsed.port != new_parsed.port - changed_scheme = old_parsed.scheme != new_parsed.scheme - default_port = (DEFAULT_PORTS.get(old_parsed.scheme, None), None) - if ( - not changed_scheme - and old_parsed.port in default_port - and new_parsed.port in default_port - ): - return False - - # Standard case: root URI must match - return changed_port or changed_scheme - - def resolve_redirects( - self, - resp, - req, - stream=False, - timeout=None, - verify=True, - cert=None, - proxies=None, - yield_requests=False, - **adapter_kwargs, - ): - """Receives a Response. Returns a generator of Responses or Requests.""" - - hist = [] # keep track of history - - url = self.get_redirect_target(resp) - previous_fragment = urlparse(req.url).fragment - while url: - prepared_request = req.copy() - - # Update history and keep track of redirects. - # resp.history must ignore the original request in this loop - hist.append(resp) - resp.history = hist[1:] - - try: - resp.content # Consume socket so it can be released - except (ChunkedEncodingError, ContentDecodingError, RuntimeError): - resp.raw.read(decode_content=False) - - if len(resp.history) >= self.max_redirects: - raise TooManyRedirects( - f"Exceeded {self.max_redirects} redirects.", response=resp - ) - - # Release the connection back into the pool. - resp.close() - - # Handle redirection without scheme (see: RFC 1808 Section 4) - if url.startswith("//"): - parsed_rurl = urlparse(resp.url) - url = ":".join([to_native_string(parsed_rurl.scheme), url]) - - # Normalize url case and attach previous fragment if needed (RFC 7231 7.1.2) - parsed = urlparse(url) - if parsed.fragment == "" and previous_fragment: - parsed = parsed._replace(fragment=previous_fragment) - elif parsed.fragment: - previous_fragment = parsed.fragment - url = parsed.geturl() - - # Facilitate relative 'location' headers, as allowed by RFC 7231. - # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') - # Compliant with RFC3986, we percent encode the url. - if not parsed.netloc: - url = urljoin(resp.url, requote_uri(url)) - else: - url = requote_uri(url) - - prepared_request.url = to_native_string(url) - - self.rebuild_method(prepared_request, resp) - - # https://github.com/psf/requests/issues/1084 - if resp.status_code not in ( - codes.temporary_redirect, - codes.permanent_redirect, - ): - # https://github.com/psf/requests/issues/3490 - purged_headers = ("Content-Length", "Content-Type", "Transfer-Encoding") - for header in purged_headers: - prepared_request.headers.pop(header, None) - prepared_request.body = None - - headers = prepared_request.headers - headers.pop("Cookie", None) - - # Extract any cookies sent on the response to the cookiejar - # in the new request. Because we've mutated our copied prepared - # request, use the old one that we haven't yet touched. - extract_cookies_to_jar(prepared_request._cookies, req, resp.raw) - merge_cookies(prepared_request._cookies, self.cookies) - prepared_request.prepare_cookies(prepared_request._cookies) - - # Rebuild auth and proxy information. - proxies = self.rebuild_proxies(prepared_request, proxies) - self.rebuild_auth(prepared_request, resp) - - # A failed tell() sets `_body_position` to `object()`. This non-None - # value ensures `rewindable` will be True, allowing us to raise an - # UnrewindableBodyError, instead of hanging the connection. - rewindable = prepared_request._body_position is not None and ( - "Content-Length" in headers or "Transfer-Encoding" in headers - ) - - # Attempt to rewind consumed file-like object. - if rewindable: - rewind_body(prepared_request) - - # Override the original request. - req = prepared_request - - if yield_requests: - yield req - else: - - resp = self.send( - req, - stream=stream, - timeout=timeout, - verify=verify, - cert=cert, - proxies=proxies, - allow_redirects=False, - **adapter_kwargs, - ) - - extract_cookies_to_jar(self.cookies, prepared_request, resp.raw) - - # extract redirect url, if any, for the next loop - url = self.get_redirect_target(resp) - yield resp - - def rebuild_auth(self, prepared_request, response): - """When being redirected we may want to strip authentication from the - request to avoid leaking credentials. This method intelligently removes - and reapplies authentication where possible to avoid credential loss. - """ - headers = prepared_request.headers - url = prepared_request.url - - if "Authorization" in headers and self.should_strip_auth( - response.request.url, url - ): - # If we get redirected to a new host, we should strip out any - # authentication headers. - del headers["Authorization"] - - # .netrc might have more auth for us on our new host. - new_auth = get_netrc_auth(url) if self.trust_env else None - if new_auth is not None: - prepared_request.prepare_auth(new_auth) - - def rebuild_proxies(self, prepared_request, proxies): - """This method re-evaluates the proxy configuration by considering the - environment variables. If we are redirected to a URL covered by - NO_PROXY, we strip the proxy configuration. Otherwise, we set missing - proxy keys for this URL (in case they were stripped by a previous - redirect). - - This method also replaces the Proxy-Authorization header where - necessary. - - :rtype: dict - """ - headers = prepared_request.headers - scheme = urlparse(prepared_request.url).scheme - new_proxies = resolve_proxies(prepared_request, proxies, self.trust_env) - - if "Proxy-Authorization" in headers: - del headers["Proxy-Authorization"] - - try: - username, password = get_auth_from_url(new_proxies[scheme]) - except KeyError: - username, password = None, None - - # urllib3 handles proxy authorization for us in the standard adapter. - # Avoid appending this to TLS tunneled requests where it may be leaked. - if not scheme.startswith('https') and username and password: - headers["Proxy-Authorization"] = _basic_auth_str(username, password) - - return new_proxies - - def rebuild_method(self, prepared_request, response): - """When being redirected we may want to change the method of the request - based on certain specs or browser behavior. - """ - method = prepared_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... - # First, turn 302s into GETs. - if response.status_code == codes.found and method != "HEAD": - method = "GET" - - # Second, if a POST is responded to with a 301, turn it into a GET. - # This bizarre behaviour is explained in Issue 1704. - if response.status_code == codes.moved and method == "POST": - method = "GET" - - prepared_request.method = method - - -class Session(SessionRedirectMixin): - """A Requests session. - - Provides cookie persistence, connection-pooling, and configuration. - - Basic Usage:: - - >>> import requests - >>> s = requests.Session() - >>> s.get('https://httpbin.org/get') - <Response [200]> - - Or as a context manager:: - - >>> with requests.Session() as s: - ... s.get('https://httpbin.org/get') - <Response [200]> - """ - - __attrs__ = [ - "headers", - "cookies", - "auth", - "proxies", - "hooks", - "params", - "verify", - "cert", - "adapters", - "stream", - "trust_env", - "max_redirects", - ] - - def __init__(self): - - #: A case-insensitive dictionary of headers to be sent on each - #: :class:`Request <Request>` sent from this - #: :class:`Session <Session>`. - self.headers = default_headers() - - #: Default Authentication tuple or object to attach to - #: :class:`Request <Request>`. - self.auth = None - - #: Dictionary mapping protocol or protocol and host to the URL of the proxy - #: (e.g. {'http': 'foo.bar:3128', 'http://host.name': 'foo.bar:4012'}) to - #: be used on each :class:`Request <Request>`. - self.proxies = {} - - #: Event-handling hooks. - self.hooks = default_hooks() - - #: Dictionary of querystring data to attach to each - #: :class:`Request <Request>`. The dictionary values may be lists for - #: representing multivalued query parameters. - self.params = {} - - #: Stream response content default. - self.stream = False - - #: SSL Verification default. - #: Defaults to `True`, requiring requests to verify the TLS certificate at the - #: remote end. - #: If verify is set to `False`, requests will accept any TLS certificate - #: presented by the server, and will ignore hostname mismatches and/or - #: expired certificates, which will make your application vulnerable to - #: man-in-the-middle (MitM) attacks. - #: Only set this to `False` for testing. - self.verify = True - - #: SSL client certificate default, if String, path to ssl client - #: cert file (.pem). If Tuple, ('cert', 'key') pair. - self.cert = None - - #: Maximum number of redirects allowed. If the request exceeds this - #: limit, a :class:`TooManyRedirects` exception is raised. - #: This defaults to requests.models.DEFAULT_REDIRECT_LIMIT, which is - #: 30. - self.max_redirects = DEFAULT_REDIRECT_LIMIT - - #: Trust environment settings for proxy configuration, default - #: authentication and similar. - self.trust_env = True - - #: A CookieJar containing all currently outstanding cookies set on this - #: session. By default it is a - #: :class:`RequestsCookieJar <requests.cookies.RequestsCookieJar>`, but - #: may be any other ``cookielib.CookieJar`` compatible object. - self.cookies = cookiejar_from_dict({}) - - # Default connection adapters. - self.adapters = OrderedDict() - self.mount("https://", HTTPAdapter()) - self.mount("http://", HTTPAdapter()) - - def __enter__(self): - return self - - def __exit__(self, *args): - self.close() - - def prepare_request(self, request): - """Constructs a :class:`PreparedRequest <PreparedRequest>` for - transmission and returns it. The :class:`PreparedRequest` has settings - merged from the :class:`Request <Request>` instance and those of the - :class:`Session`. - - :param request: :class:`Request` instance to prepare with this - session's settings. - :rtype: requests.PreparedRequest - """ - cookies = request.cookies or {} - - # Bootstrap CookieJar. - if not isinstance(cookies, cookielib.CookieJar): - cookies = cookiejar_from_dict(cookies) - - # Merge with session cookies - merged_cookies = merge_cookies( - merge_cookies(RequestsCookieJar(), self.cookies), cookies - ) - - # Set environment's basic authentication if not explicitly set. - auth = request.auth - if self.trust_env and not auth and not self.auth: - auth = get_netrc_auth(request.url) - - p = PreparedRequest() - p.prepare( - method=request.method.upper(), - url=request.url, - files=request.files, - data=request.data, - json=request.json, - headers=merge_setting( - request.headers, self.headers, dict_class=CaseInsensitiveDict - ), - params=merge_setting(request.params, self.params), - auth=merge_setting(auth, self.auth), - cookies=merged_cookies, - hooks=merge_hooks(request.hooks, self.hooks), - ) - return p - - def request( - self, - method, - url, - params=None, - data=None, - headers=None, - cookies=None, - files=None, - auth=None, - timeout=None, - allow_redirects=True, - proxies=None, - hooks=None, - stream=None, - verify=None, - cert=None, - json=None, - ): - """Constructs a :class:`Request <Request>`, prepares it and sends it. - Returns :class:`Response <Response>` object. - - :param method: method for the new :class:`Request` object. - :param url: URL for the new :class:`Request` object. - :param params: (optional) Dictionary or bytes to be sent in the query - string for the :class:`Request`. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) json to send in the body of the - :class:`Request`. - :param headers: (optional) Dictionary of HTTP Headers to send with the - :class:`Request`. - :param cookies: (optional) Dict or CookieJar object to send with the - :class:`Request`. - :param files: (optional) Dictionary of ``'filename': file-like-objects`` - for multipart encoding upload. - :param auth: (optional) Auth tuple or callable to enable - Basic/Digest/Custom HTTP Auth. - :param timeout: (optional) How long to wait for the server to send - data before giving up, as a float, or a :ref:`(connect timeout, - read timeout) <timeouts>` tuple. - :type timeout: float or tuple - :param allow_redirects: (optional) Set to True by default. - :type allow_redirects: bool - :param proxies: (optional) Dictionary mapping protocol or protocol and - hostname to the URL of the proxy. - :param stream: (optional) whether to immediately download the response - content. Defaults to ``False``. - :param verify: (optional) Either a boolean, in which case it controls whether we verify - the server's TLS certificate, or a string, in which case it must be a path - to a CA bundle to use. Defaults to ``True``. When set to - ``False``, requests will accept any TLS certificate presented by - the server, and will ignore hostname mismatches and/or expired - certificates, which will make your application vulnerable to - man-in-the-middle (MitM) attacks. Setting verify to ``False`` - may be useful during local development or testing. - :param cert: (optional) if String, path to ssl client cert file (.pem). - If Tuple, ('cert', 'key') pair. - :rtype: requests.Response - """ - # Create the Request. - req = Request( - method=method.upper(), - url=url, - headers=headers, - files=files, - data=data or {}, - json=json, - params=params or {}, - auth=auth, - cookies=cookies, - hooks=hooks, - ) - prep = self.prepare_request(req) - - proxies = proxies or {} - - settings = self.merge_environment_settings( - prep.url, proxies, stream, verify, cert - ) - - # Send the request. - send_kwargs = { - "timeout": timeout, - "allow_redirects": allow_redirects, - } - send_kwargs.update(settings) - resp = self.send(prep, **send_kwargs) - - return resp - - def get(self, url, **kwargs): - r"""Sends a GET request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - kwargs.setdefault("allow_redirects", True) - return self.request("GET", url, **kwargs) - - def options(self, url, **kwargs): - r"""Sends a OPTIONS request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - kwargs.setdefault("allow_redirects", True) - return self.request("OPTIONS", url, **kwargs) - - def head(self, url, **kwargs): - r"""Sends a HEAD request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - kwargs.setdefault("allow_redirects", False) - return self.request("HEAD", url, **kwargs) - - def post(self, url, data=None, json=None, **kwargs): - r"""Sends a POST request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) json to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - return self.request("POST", url, data=data, json=json, **kwargs) - - def put(self, url, data=None, **kwargs): - r"""Sends a PUT request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - return self.request("PUT", url, data=data, **kwargs) - - def patch(self, url, data=None, **kwargs): - r"""Sends a PATCH request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - return self.request("PATCH", url, data=data, **kwargs) - - def delete(self, url, **kwargs): - r"""Sends a DELETE request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - return self.request("DELETE", url, **kwargs) - - def send(self, request, **kwargs): - """Send a given PreparedRequest. - - :rtype: requests.Response - """ - # Set defaults that the hooks can utilize to ensure they always have - # the correct parameters to reproduce the previous request. - kwargs.setdefault("stream", self.stream) - kwargs.setdefault("verify", self.verify) - kwargs.setdefault("cert", self.cert) - if "proxies" not in kwargs: - kwargs["proxies"] = resolve_proxies(request, self.proxies, self.trust_env) - - # It's possible that users might accidentally send a Request object. - # Guard against that specific failure case. - if isinstance(request, Request): - raise ValueError("You can only send PreparedRequests.") - - # Set up variables needed for resolve_redirects and dispatching of hooks - allow_redirects = kwargs.pop("allow_redirects", True) - stream = kwargs.get("stream") - hooks = request.hooks - - # Get the appropriate adapter to use - adapter = self.get_adapter(url=request.url) - - # Start time (approximately) of the request - start = preferred_clock() - - # Send the request - r = adapter.send(request, **kwargs) - - # Total elapsed time of the request (approximately) - elapsed = preferred_clock() - start - r.elapsed = timedelta(seconds=elapsed) - - # Response manipulation hooks - r = dispatch_hook("response", hooks, r, **kwargs) - - # Persist cookies - if r.history: - - # If the hooks create history then we want those cookies too - for resp in r.history: - extract_cookies_to_jar(self.cookies, resp.request, resp.raw) - - extract_cookies_to_jar(self.cookies, request, r.raw) - - # Resolve redirects if allowed. - if allow_redirects: - # Redirect resolving generator. - gen = self.resolve_redirects(r, request, **kwargs) - history = [resp for resp in gen] - else: - history = [] - - # Shuffle things around if there's history. - if history: - # Insert the first (original) request at the start - history.insert(0, r) - # Get the last request made - r = history.pop() - r.history = history - - # If redirects aren't being followed, store the response on the Request for Response.next(). - if not allow_redirects: - try: - r._next = next( - self.resolve_redirects(r, request, yield_requests=True, **kwargs) - ) - except StopIteration: - pass - - if not stream: - r.content - - return r - - def merge_environment_settings(self, url, proxies, stream, verify, cert): - """ - Check the environment and merge it with some settings. - - :rtype: dict - """ - # Gather clues from the surrounding environment. - if self.trust_env: - # Set environment's proxies. - no_proxy = proxies.get("no_proxy") if proxies is not None else None - env_proxies = get_environ_proxies(url, no_proxy=no_proxy) - for (k, v) in env_proxies.items(): - proxies.setdefault(k, v) - - # Look for requests environment configuration - # and be compatible with cURL. - if verify is True or verify is None: - verify = ( - os.environ.get("REQUESTS_CA_BUNDLE") - or os.environ.get("CURL_CA_BUNDLE") - or verify - ) - - # Merge all the kwargs. - proxies = merge_setting(proxies, self.proxies) - stream = merge_setting(stream, self.stream) - verify = merge_setting(verify, self.verify) - cert = merge_setting(cert, self.cert) - - return {"proxies": proxies, "stream": stream, "verify": verify, "cert": cert} - - def get_adapter(self, url): - """ - Returns the appropriate connection adapter for the given URL. - - :rtype: requests.adapters.BaseAdapter - """ - for (prefix, adapter) in self.adapters.items(): - - if url.lower().startswith(prefix.lower()): - return adapter - - # Nothing matches :-/ - raise InvalidSchema(f"No connection adapters were found for {url!r}") - - def close(self): - """Closes all adapters and as such the session""" - for v in self.adapters.values(): - v.close() - - def mount(self, prefix, adapter): - """Registers a connection adapter to a prefix. - - Adapters are sorted in descending order by prefix length. - """ - self.adapters[prefix] = adapter - keys_to_move = [k for k in self.adapters if len(k) < len(prefix)] - - for key in keys_to_move: - self.adapters[key] = self.adapters.pop(key) - - def __getstate__(self): - state = {attr: getattr(self, attr, None) for attr in self.__attrs__} - return state - - def __setstate__(self, state): - for attr, value in state.items(): - setattr(self, attr, value) - - -def session(): - """ - Returns a :class:`Session` for context-management. - - .. deprecated:: 1.0.0 - - This method has been deprecated since version 1.0.0 and is only kept for - backwards compatibility. New code should use :class:`~requests.sessions.Session` - to create a session. This may be removed at a future date. - - :rtype: Session - """ - return Session() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/status_codes.py b/venv/lib/python3.12/site-packages/pip/_vendor/requests/status_codes.py deleted file mode 100644 index 4bd072b..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/requests/status_codes.py +++ /dev/null @@ -1,128 +0,0 @@ -r""" -The ``codes`` object defines a mapping from common names for HTTP statuses -to their numerical codes, accessible either as attributes or as dictionary -items. - -Example:: - - >>> import requests - >>> requests.codes['temporary_redirect'] - 307 - >>> requests.codes.teapot - 418 - >>> requests.codes['\o/'] - 200 - -Some codes have multiple names, and both upper- and lower-case versions of -the names are allowed. For example, ``codes.ok``, ``codes.OK``, and -``codes.okay`` all correspond to the HTTP status code 200. -""" - -from .structures import LookupDict - -_codes = { - # Informational. - 100: ("continue",), - 101: ("switching_protocols",), - 102: ("processing",), - 103: ("checkpoint",), - 122: ("uri_too_long", "request_uri_too_long"), - 200: ("ok", "okay", "all_ok", "all_okay", "all_good", "\\o/", "✓"), - 201: ("created",), - 202: ("accepted",), - 203: ("non_authoritative_info", "non_authoritative_information"), - 204: ("no_content",), - 205: ("reset_content", "reset"), - 206: ("partial_content", "partial"), - 207: ("multi_status", "multiple_status", "multi_stati", "multiple_stati"), - 208: ("already_reported",), - 226: ("im_used",), - # Redirection. - 300: ("multiple_choices",), - 301: ("moved_permanently", "moved", "\\o-"), - 302: ("found",), - 303: ("see_other", "other"), - 304: ("not_modified",), - 305: ("use_proxy",), - 306: ("switch_proxy",), - 307: ("temporary_redirect", "temporary_moved", "temporary"), - 308: ( - "permanent_redirect", - "resume_incomplete", - "resume", - ), # "resume" and "resume_incomplete" to be removed in 3.0 - # Client Error. - 400: ("bad_request", "bad"), - 401: ("unauthorized",), - 402: ("payment_required", "payment"), - 403: ("forbidden",), - 404: ("not_found", "-o-"), - 405: ("method_not_allowed", "not_allowed"), - 406: ("not_acceptable",), - 407: ("proxy_authentication_required", "proxy_auth", "proxy_authentication"), - 408: ("request_timeout", "timeout"), - 409: ("conflict",), - 410: ("gone",), - 411: ("length_required",), - 412: ("precondition_failed", "precondition"), - 413: ("request_entity_too_large",), - 414: ("request_uri_too_large",), - 415: ("unsupported_media_type", "unsupported_media", "media_type"), - 416: ( - "requested_range_not_satisfiable", - "requested_range", - "range_not_satisfiable", - ), - 417: ("expectation_failed",), - 418: ("im_a_teapot", "teapot", "i_am_a_teapot"), - 421: ("misdirected_request",), - 422: ("unprocessable_entity", "unprocessable"), - 423: ("locked",), - 424: ("failed_dependency", "dependency"), - 425: ("unordered_collection", "unordered"), - 426: ("upgrade_required", "upgrade"), - 428: ("precondition_required", "precondition"), - 429: ("too_many_requests", "too_many"), - 431: ("header_fields_too_large", "fields_too_large"), - 444: ("no_response", "none"), - 449: ("retry_with", "retry"), - 450: ("blocked_by_windows_parental_controls", "parental_controls"), - 451: ("unavailable_for_legal_reasons", "legal_reasons"), - 499: ("client_closed_request",), - # Server Error. - 500: ("internal_server_error", "server_error", "/o\\", "✗"), - 501: ("not_implemented",), - 502: ("bad_gateway",), - 503: ("service_unavailable", "unavailable"), - 504: ("gateway_timeout",), - 505: ("http_version_not_supported", "http_version"), - 506: ("variant_also_negotiates",), - 507: ("insufficient_storage",), - 509: ("bandwidth_limit_exceeded", "bandwidth"), - 510: ("not_extended",), - 511: ("network_authentication_required", "network_auth", "network_authentication"), -} - -codes = LookupDict(name="status_codes") - - -def _init(): - for code, titles in _codes.items(): - for title in titles: - setattr(codes, title, code) - if not title.startswith(("\\", "/")): - setattr(codes, title.upper(), code) - - def doc(code): - names = ", ".join(f"``{n}``" for n in _codes[code]) - return "* %d: %s" % (code, names) - - global __doc__ - __doc__ = ( - __doc__ + "\n" + "\n".join(doc(code) for code in sorted(_codes)) - if __doc__ is not None - else None - ) - - -_init() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/structures.py b/venv/lib/python3.12/site-packages/pip/_vendor/requests/structures.py deleted file mode 100644 index 188e13e..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/requests/structures.py +++ /dev/null @@ -1,99 +0,0 @@ -""" -requests.structures -~~~~~~~~~~~~~~~~~~~ - -Data structures that power Requests. -""" - -from collections import OrderedDict - -from .compat import Mapping, MutableMapping - - -class CaseInsensitiveDict(MutableMapping): - """A case-insensitive ``dict``-like object. - - Implements all methods and operations of - ``MutableMapping`` as well as dict's ``copy``. Also - provides ``lower_items``. - - All keys are expected to be strings. The structure remembers the - case of the last key to be set, and ``iter(instance)``, - ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()`` - will contain case-sensitive keys. However, querying and contains - testing is case insensitive:: - - cid = CaseInsensitiveDict() - cid['Accept'] = 'application/json' - cid['aCCEPT'] == 'application/json' # True - list(cid) == ['Accept'] # True - - For example, ``headers['content-encoding']`` will return the - value of a ``'Content-Encoding'`` response header, regardless - of how the header name was originally stored. - - If the constructor, ``.update``, or equality comparison - operations are given keys that have equal ``.lower()``s, the - behavior is undefined. - """ - - def __init__(self, data=None, **kwargs): - self._store = OrderedDict() - if data is None: - data = {} - self.update(data, **kwargs) - - def __setitem__(self, key, value): - # Use the lowercased key for lookups, but store the actual - # key alongside the value. - self._store[key.lower()] = (key, value) - - def __getitem__(self, key): - return self._store[key.lower()][1] - - def __delitem__(self, key): - del self._store[key.lower()] - - def __iter__(self): - return (casedkey for casedkey, mappedvalue in self._store.values()) - - def __len__(self): - return len(self._store) - - def lower_items(self): - """Like iteritems(), but with all lowercase keys.""" - return ((lowerkey, keyval[1]) for (lowerkey, keyval) in self._store.items()) - - def __eq__(self, other): - if isinstance(other, Mapping): - other = CaseInsensitiveDict(other) - else: - return NotImplemented - # Compare insensitively - return dict(self.lower_items()) == dict(other.lower_items()) - - # Copy is required - def copy(self): - return CaseInsensitiveDict(self._store.values()) - - def __repr__(self): - return str(dict(self.items())) - - -class LookupDict(dict): - """Dictionary lookup object.""" - - def __init__(self, name=None): - self.name = name - super().__init__() - - def __repr__(self): - return f"<lookup '{self.name}'>" - - def __getitem__(self, key): - # We allow fall-through here, so values default to None - - return self.__dict__.get(key, None) - - def get(self, key, default=None): - return self.__dict__.get(key, default) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/requests/utils.py b/venv/lib/python3.12/site-packages/pip/_vendor/requests/utils.py deleted file mode 100644 index 36607ed..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/requests/utils.py +++ /dev/null @@ -1,1094 +0,0 @@ -""" -requests.utils -~~~~~~~~~~~~~~ - -This module provides utility functions that are used within Requests -that are also useful for external consumption. -""" - -import codecs -import contextlib -import io -import os -import re -import socket -import struct -import sys -import tempfile -import warnings -import zipfile -from collections import OrderedDict - -from pip._vendor.urllib3.util import make_headers, parse_url - -from . import certs -from .__version__ import __version__ - -# to_native_string is unused here, but imported here for backwards compatibility -from ._internal_utils import ( # noqa: F401 - _HEADER_VALIDATORS_BYTE, - _HEADER_VALIDATORS_STR, - HEADER_VALIDATORS, - to_native_string, -) -from .compat import ( - Mapping, - basestring, - bytes, - getproxies, - getproxies_environment, - integer_types, -) -from .compat import parse_http_list as _parse_list_header -from .compat import ( - proxy_bypass, - proxy_bypass_environment, - quote, - str, - unquote, - urlparse, - urlunparse, -) -from .cookies import cookiejar_from_dict -from .exceptions import ( - FileModeWarning, - InvalidHeader, - InvalidURL, - UnrewindableBodyError, -) -from .structures import CaseInsensitiveDict - -NETRC_FILES = (".netrc", "_netrc") - -DEFAULT_CA_BUNDLE_PATH = certs.where() - -DEFAULT_PORTS = {"http": 80, "https": 443} - -# Ensure that ', ' is used to preserve previous delimiter behavior. -DEFAULT_ACCEPT_ENCODING = ", ".join( - re.split(r",\s*", make_headers(accept_encoding=True)["accept-encoding"]) -) - - -if sys.platform == "win32": - # provide a proxy_bypass version on Windows without DNS lookups - - def proxy_bypass_registry(host): - try: - import winreg - except ImportError: - return False - - try: - internetSettings = winreg.OpenKey( - winreg.HKEY_CURRENT_USER, - r"Software\Microsoft\Windows\CurrentVersion\Internet Settings", - ) - # ProxyEnable could be REG_SZ or REG_DWORD, normalizing it - proxyEnable = int(winreg.QueryValueEx(internetSettings, "ProxyEnable")[0]) - # ProxyOverride is almost always a string - proxyOverride = winreg.QueryValueEx(internetSettings, "ProxyOverride")[0] - except (OSError, ValueError): - return False - if not proxyEnable or not proxyOverride: - return False - - # make a check value list from the registry entry: replace the - # '<local>' string by the localhost entry and the corresponding - # canonical entry. - proxyOverride = proxyOverride.split(";") - # now check if we match one of the registry values. - for test in proxyOverride: - if test == "<local>": - if "." not in host: - return True - test = test.replace(".", r"\.") # mask dots - test = test.replace("*", r".*") # change glob sequence - test = test.replace("?", r".") # change glob char - if re.match(test, host, re.I): - return True - return False - - def proxy_bypass(host): # noqa - """Return True, if the host should be bypassed. - - Checks proxy settings gathered from the environment, if specified, - or the registry. - """ - if getproxies_environment(): - return proxy_bypass_environment(host) - else: - return proxy_bypass_registry(host) - - -def dict_to_sequence(d): - """Returns an internal sequence dictionary update.""" - - if hasattr(d, "items"): - d = d.items() - - return d - - -def super_len(o): - total_length = None - current_position = 0 - - if hasattr(o, "__len__"): - total_length = len(o) - - elif hasattr(o, "len"): - total_length = o.len - - elif hasattr(o, "fileno"): - try: - fileno = o.fileno() - except (io.UnsupportedOperation, AttributeError): - # AttributeError is a surprising exception, seeing as how we've just checked - # that `hasattr(o, 'fileno')`. It happens for objects obtained via - # `Tarfile.extractfile()`, per issue 5229. - pass - else: - total_length = os.fstat(fileno).st_size - - # Having used fstat to determine the file length, we need to - # confirm that this file was opened up in binary mode. - if "b" not in o.mode: - warnings.warn( - ( - "Requests has determined the content-length for this " - "request using the binary size of the file: however, the " - "file has been opened in text mode (i.e. without the 'b' " - "flag in the mode). This may lead to an incorrect " - "content-length. In Requests 3.0, support will be removed " - "for files in text mode." - ), - FileModeWarning, - ) - - if hasattr(o, "tell"): - try: - current_position = o.tell() - except OSError: - # This can happen in some weird situations, such as when the file - # is actually a special file descriptor like stdin. In this - # instance, we don't know what the length is, so set it to zero and - # let requests chunk it instead. - if total_length is not None: - current_position = total_length - else: - if hasattr(o, "seek") and total_length is None: - # StringIO and BytesIO have seek but no usable fileno - try: - # seek to end of file - o.seek(0, 2) - total_length = o.tell() - - # seek back to current position to support - # partially read file-like objects - o.seek(current_position or 0) - except OSError: - total_length = 0 - - if total_length is None: - total_length = 0 - - return max(0, total_length - current_position) - - -def get_netrc_auth(url, raise_errors=False): - """Returns the Requests tuple auth for a given url from netrc.""" - - netrc_file = os.environ.get("NETRC") - if netrc_file is not None: - netrc_locations = (netrc_file,) - else: - netrc_locations = (f"~/{f}" for f in NETRC_FILES) - - try: - from netrc import NetrcParseError, netrc - - netrc_path = None - - for f in netrc_locations: - try: - loc = os.path.expanduser(f) - except KeyError: - # os.path.expanduser can fail when $HOME is undefined and - # getpwuid fails. See https://bugs.python.org/issue20164 & - # https://github.com/psf/requests/issues/1846 - return - - if os.path.exists(loc): - netrc_path = loc - break - - # Abort early if there isn't one. - if netrc_path is None: - return - - ri = urlparse(url) - - # Strip port numbers from netloc. This weird `if...encode`` dance is - # used for Python 3.2, which doesn't support unicode literals. - splitstr = b":" - if isinstance(url, str): - splitstr = splitstr.decode("ascii") - host = ri.netloc.split(splitstr)[0] - - try: - _netrc = netrc(netrc_path).authenticators(host) - if _netrc: - # Return with login / password - login_i = 0 if _netrc[0] else 1 - return (_netrc[login_i], _netrc[2]) - except (NetrcParseError, OSError): - # If there was a parsing error or a permissions issue reading the file, - # we'll just skip netrc auth unless explicitly asked to raise errors. - if raise_errors: - raise - - # App Engine hackiness. - except (ImportError, AttributeError): - pass - - -def guess_filename(obj): - """Tries to guess the filename of the given object.""" - name = getattr(obj, "name", None) - if name and isinstance(name, basestring) and name[0] != "<" and name[-1] != ">": - return os.path.basename(name) - - -def extract_zipped_paths(path): - """Replace nonexistent paths that look like they refer to a member of a zip - archive with the location of an extracted copy of the target, or else - just return the provided path unchanged. - """ - if os.path.exists(path): - # this is already a valid path, no need to do anything further - return path - - # find the first valid part of the provided path and treat that as a zip archive - # assume the rest of the path is the name of a member in the archive - archive, member = os.path.split(path) - while archive and not os.path.exists(archive): - archive, prefix = os.path.split(archive) - if not prefix: - # If we don't check for an empty prefix after the split (in other words, archive remains unchanged after the split), - # we _can_ end up in an infinite loop on a rare corner case affecting a small number of users - break - member = "/".join([prefix, member]) - - if not zipfile.is_zipfile(archive): - return path - - zip_file = zipfile.ZipFile(archive) - if member not in zip_file.namelist(): - return path - - # we have a valid zip archive and a valid member of that archive - tmp = tempfile.gettempdir() - extracted_path = os.path.join(tmp, member.split("/")[-1]) - if not os.path.exists(extracted_path): - # use read + write to avoid the creating nested folders, we only want the file, avoids mkdir racing condition - with atomic_open(extracted_path) as file_handler: - file_handler.write(zip_file.read(member)) - return extracted_path - - -@contextlib.contextmanager -def atomic_open(filename): - """Write a file to the disk in an atomic fashion""" - tmp_descriptor, tmp_name = tempfile.mkstemp(dir=os.path.dirname(filename)) - try: - with os.fdopen(tmp_descriptor, "wb") as tmp_handler: - yield tmp_handler - os.replace(tmp_name, filename) - except BaseException: - os.remove(tmp_name) - raise - - -def from_key_val_list(value): - """Take an object and test to see if it can be represented as a - dictionary. Unless it can not be represented as such, return an - OrderedDict, e.g., - - :: - - >>> from_key_val_list([('key', 'val')]) - OrderedDict([('key', 'val')]) - >>> from_key_val_list('string') - Traceback (most recent call last): - ... - ValueError: cannot encode objects that are not 2-tuples - >>> from_key_val_list({'key': 'val'}) - OrderedDict([('key', 'val')]) - - :rtype: OrderedDict - """ - if value is None: - return None - - if isinstance(value, (str, bytes, bool, int)): - raise ValueError("cannot encode objects that are not 2-tuples") - - return OrderedDict(value) - - -def to_key_val_list(value): - """Take an object and test to see if it can be represented as a - dictionary. If it can be, return a list of tuples, e.g., - - :: - - >>> to_key_val_list([('key', 'val')]) - [('key', 'val')] - >>> to_key_val_list({'key': 'val'}) - [('key', 'val')] - >>> to_key_val_list('string') - Traceback (most recent call last): - ... - ValueError: cannot encode objects that are not 2-tuples - - :rtype: list - """ - if value is None: - return None - - if isinstance(value, (str, bytes, bool, int)): - raise ValueError("cannot encode objects that are not 2-tuples") - - if isinstance(value, Mapping): - value = value.items() - - return list(value) - - -# From mitsuhiko/werkzeug (used with permission). -def parse_list_header(value): - """Parse lists as described by RFC 2068 Section 2. - - In particular, parse comma-separated lists where the elements of - the list may include quoted-strings. A quoted-string could - contain a comma. A non-quoted string could have quotes in the - middle. Quotes are removed automatically after parsing. - - It basically works like :func:`parse_set_header` just that items - may appear multiple times and case sensitivity is preserved. - - The return value is a standard :class:`list`: - - >>> parse_list_header('token, "quoted value"') - ['token', 'quoted value'] - - To create a header from the :class:`list` again, use the - :func:`dump_header` function. - - :param value: a string with a list header. - :return: :class:`list` - :rtype: list - """ - result = [] - for item in _parse_list_header(value): - if item[:1] == item[-1:] == '"': - item = unquote_header_value(item[1:-1]) - result.append(item) - return result - - -# From mitsuhiko/werkzeug (used with permission). -def parse_dict_header(value): - """Parse lists of key, value pairs as described by RFC 2068 Section 2 and - convert them into a python dict: - - >>> d = parse_dict_header('foo="is a fish", bar="as well"') - >>> type(d) is dict - True - >>> sorted(d.items()) - [('bar', 'as well'), ('foo', 'is a fish')] - - If there is no value for a key it will be `None`: - - >>> parse_dict_header('key_without_value') - {'key_without_value': None} - - To create a header from the :class:`dict` again, use the - :func:`dump_header` function. - - :param value: a string with a dict header. - :return: :class:`dict` - :rtype: dict - """ - result = {} - for item in _parse_list_header(value): - if "=" not in item: - result[item] = None - continue - name, value = item.split("=", 1) - if value[:1] == value[-1:] == '"': - value = unquote_header_value(value[1:-1]) - result[name] = value - return result - - -# From mitsuhiko/werkzeug (used with permission). -def unquote_header_value(value, is_filename=False): - r"""Unquotes a header value. (Reversal of :func:`quote_header_value`). - This does not use the real unquoting but what browsers are actually - using for quoting. - - :param value: the header value to unquote. - :rtype: str - """ - if value and value[0] == value[-1] == '"': - # this is not the real unquoting, but fixing this so that the - # RFC is met will result in bugs with internet explorer and - # probably some other browsers as well. IE for example is - # uploading files with "C:\foo\bar.txt" as filename - value = value[1:-1] - - # if this is a filename and the starting characters look like - # a UNC path, then just return the value without quotes. Using the - # replace sequence below on a UNC path has the effect of turning - # the leading double slash into a single slash and then - # _fix_ie_filename() doesn't work correctly. See #458. - if not is_filename or value[:2] != "\\\\": - return value.replace("\\\\", "\\").replace('\\"', '"') - return value - - -def dict_from_cookiejar(cj): - """Returns a key/value dictionary from a CookieJar. - - :param cj: CookieJar object to extract cookies from. - :rtype: dict - """ - - cookie_dict = {} - - for cookie in cj: - cookie_dict[cookie.name] = cookie.value - - return cookie_dict - - -def add_dict_to_cookiejar(cj, cookie_dict): - """Returns a CookieJar from a key/value dictionary. - - :param cj: CookieJar to insert cookies into. - :param cookie_dict: Dict of key/values to insert into CookieJar. - :rtype: CookieJar - """ - - return cookiejar_from_dict(cookie_dict, cj) - - -def get_encodings_from_content(content): - """Returns encodings from given content string. - - :param content: bytestring to extract encodings from. - """ - warnings.warn( - ( - "In requests 3.0, get_encodings_from_content will be removed. For " - "more information, please see the discussion on issue #2266. (This" - " warning should only appear once.)" - ), - DeprecationWarning, - ) - - charset_re = re.compile(r'<meta.*?charset=["\']*(.+?)["\'>]', flags=re.I) - pragma_re = re.compile(r'<meta.*?content=["\']*;?charset=(.+?)["\'>]', flags=re.I) - xml_re = re.compile(r'^<\?xml.*?encoding=["\']*(.+?)["\'>]') - - return ( - charset_re.findall(content) - + pragma_re.findall(content) - + xml_re.findall(content) - ) - - -def _parse_content_type_header(header): - """Returns content type and parameters from given header - - :param header: string - :return: tuple containing content type and dictionary of - parameters - """ - - tokens = header.split(";") - content_type, params = tokens[0].strip(), tokens[1:] - params_dict = {} - items_to_strip = "\"' " - - for param in params: - param = param.strip() - if param: - key, value = param, True - index_of_equals = param.find("=") - if index_of_equals != -1: - key = param[:index_of_equals].strip(items_to_strip) - value = param[index_of_equals + 1 :].strip(items_to_strip) - params_dict[key.lower()] = value - return content_type, params_dict - - -def get_encoding_from_headers(headers): - """Returns encodings from given HTTP Header Dict. - - :param headers: dictionary to extract encoding from. - :rtype: str - """ - - content_type = headers.get("content-type") - - if not content_type: - return None - - content_type, params = _parse_content_type_header(content_type) - - if "charset" in params: - return params["charset"].strip("'\"") - - if "text" in content_type: - return "ISO-8859-1" - - if "application/json" in content_type: - # Assume UTF-8 based on RFC 4627: https://www.ietf.org/rfc/rfc4627.txt since the charset was unset - return "utf-8" - - -def stream_decode_response_unicode(iterator, r): - """Stream decodes an iterator.""" - - if r.encoding is None: - yield from iterator - return - - decoder = codecs.getincrementaldecoder(r.encoding)(errors="replace") - for chunk in iterator: - rv = decoder.decode(chunk) - if rv: - yield rv - rv = decoder.decode(b"", final=True) - if rv: - yield rv - - -def iter_slices(string, slice_length): - """Iterate over slices of a string.""" - pos = 0 - if slice_length is None or slice_length <= 0: - slice_length = len(string) - while pos < len(string): - yield string[pos : pos + slice_length] - pos += slice_length - - -def get_unicode_from_response(r): - """Returns the requested content back in unicode. - - :param r: Response object to get unicode content from. - - Tried: - - 1. charset from content-type - 2. fall back and replace all unicode characters - - :rtype: str - """ - warnings.warn( - ( - "In requests 3.0, get_unicode_from_response will be removed. For " - "more information, please see the discussion on issue #2266. (This" - " warning should only appear once.)" - ), - DeprecationWarning, - ) - - tried_encodings = [] - - # Try charset from content-type - encoding = get_encoding_from_headers(r.headers) - - if encoding: - try: - return str(r.content, encoding) - except UnicodeError: - tried_encodings.append(encoding) - - # Fall back: - try: - return str(r.content, encoding, errors="replace") - except TypeError: - return r.content - - -# The unreserved URI characters (RFC 3986) -UNRESERVED_SET = frozenset( - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789-._~" -) - - -def unquote_unreserved(uri): - """Un-escape any percent-escape sequences in a URI that are unreserved - characters. This leaves all reserved, illegal and non-ASCII bytes encoded. - - :rtype: str - """ - parts = uri.split("%") - for i in range(1, len(parts)): - h = parts[i][0:2] - if len(h) == 2 and h.isalnum(): - try: - c = chr(int(h, 16)) - except ValueError: - raise InvalidURL(f"Invalid percent-escape sequence: '{h}'") - - if c in UNRESERVED_SET: - parts[i] = c + parts[i][2:] - else: - parts[i] = f"%{parts[i]}" - else: - parts[i] = f"%{parts[i]}" - return "".join(parts) - - -def requote_uri(uri): - """Re-quote the given URI. - - This function passes the given URI through an unquote/quote cycle to - ensure that it is fully and consistently quoted. - - :rtype: str - """ - safe_with_percent = "!#$%&'()*+,/:;=?@[]~" - safe_without_percent = "!#$&'()*+,/:;=?@[]~" - try: - # Unquote only the unreserved characters - # Then quote only illegal characters (do not quote reserved, - # unreserved, or '%') - return quote(unquote_unreserved(uri), safe=safe_with_percent) - except InvalidURL: - # We couldn't unquote the given URI, so let's try quoting it, but - # there may be unquoted '%'s in the URI. We need to make sure they're - # properly quoted so they do not cause issues elsewhere. - return quote(uri, safe=safe_without_percent) - - -def address_in_network(ip, net): - """This function allows you to check if an IP belongs to a network subnet - - Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24 - returns False if ip = 192.168.1.1 and net = 192.168.100.0/24 - - :rtype: bool - """ - ipaddr = struct.unpack("=L", socket.inet_aton(ip))[0] - netaddr, bits = net.split("/") - netmask = struct.unpack("=L", socket.inet_aton(dotted_netmask(int(bits))))[0] - network = struct.unpack("=L", socket.inet_aton(netaddr))[0] & netmask - return (ipaddr & netmask) == (network & netmask) - - -def dotted_netmask(mask): - """Converts mask from /xx format to xxx.xxx.xxx.xxx - - Example: if mask is 24 function returns 255.255.255.0 - - :rtype: str - """ - bits = 0xFFFFFFFF ^ (1 << 32 - mask) - 1 - return socket.inet_ntoa(struct.pack(">I", bits)) - - -def is_ipv4_address(string_ip): - """ - :rtype: bool - """ - try: - socket.inet_aton(string_ip) - except OSError: - return False - return True - - -def is_valid_cidr(string_network): - """ - Very simple check of the cidr format in no_proxy variable. - - :rtype: bool - """ - if string_network.count("/") == 1: - try: - mask = int(string_network.split("/")[1]) - except ValueError: - return False - - if mask < 1 or mask > 32: - return False - - try: - socket.inet_aton(string_network.split("/")[0]) - except OSError: - return False - else: - return False - return True - - -@contextlib.contextmanager -def set_environ(env_name, value): - """Set the environment variable 'env_name' to 'value' - - Save previous value, yield, and then restore the previous value stored in - the environment variable 'env_name'. - - If 'value' is None, do nothing""" - value_changed = value is not None - if value_changed: - old_value = os.environ.get(env_name) - os.environ[env_name] = value - try: - yield - finally: - if value_changed: - if old_value is None: - del os.environ[env_name] - else: - os.environ[env_name] = old_value - - -def should_bypass_proxies(url, no_proxy): - """ - Returns whether we should bypass proxies or not. - - :rtype: bool - """ - # Prioritize lowercase environment variables over uppercase - # to keep a consistent behaviour with other http projects (curl, wget). - def get_proxy(key): - return os.environ.get(key) or os.environ.get(key.upper()) - - # First check whether no_proxy is defined. If it is, check that the URL - # we're getting isn't in the no_proxy list. - no_proxy_arg = no_proxy - if no_proxy is None: - no_proxy = get_proxy("no_proxy") - parsed = urlparse(url) - - if parsed.hostname is None: - # URLs don't always have hostnames, e.g. file:/// urls. - return True - - if no_proxy: - # We need to check whether we match here. We need to see if we match - # the end of the hostname, both with and without the port. - no_proxy = (host for host in no_proxy.replace(" ", "").split(",") if host) - - if is_ipv4_address(parsed.hostname): - for proxy_ip in no_proxy: - if is_valid_cidr(proxy_ip): - if address_in_network(parsed.hostname, proxy_ip): - return True - elif parsed.hostname == proxy_ip: - # If no_proxy ip was defined in plain IP notation instead of cidr notation & - # matches the IP of the index - return True - else: - host_with_port = parsed.hostname - if parsed.port: - host_with_port += f":{parsed.port}" - - for host in no_proxy: - if parsed.hostname.endswith(host) or host_with_port.endswith(host): - # The URL does match something in no_proxy, so we don't want - # to apply the proxies on this URL. - return True - - with set_environ("no_proxy", no_proxy_arg): - # parsed.hostname can be `None` in cases such as a file URI. - try: - bypass = proxy_bypass(parsed.hostname) - except (TypeError, socket.gaierror): - bypass = False - - if bypass: - return True - - return False - - -def get_environ_proxies(url, no_proxy=None): - """ - Return a dict of environment proxies. - - :rtype: dict - """ - if should_bypass_proxies(url, no_proxy=no_proxy): - return {} - else: - return getproxies() - - -def select_proxy(url, proxies): - """Select a proxy for the url, if applicable. - - :param url: The url being for the request - :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs - """ - proxies = proxies or {} - urlparts = urlparse(url) - if urlparts.hostname is None: - return proxies.get(urlparts.scheme, proxies.get("all")) - - proxy_keys = [ - urlparts.scheme + "://" + urlparts.hostname, - urlparts.scheme, - "all://" + urlparts.hostname, - "all", - ] - proxy = None - for proxy_key in proxy_keys: - if proxy_key in proxies: - proxy = proxies[proxy_key] - break - - return proxy - - -def resolve_proxies(request, proxies, trust_env=True): - """This method takes proxy information from a request and configuration - input to resolve a mapping of target proxies. This will consider settings - such a NO_PROXY to strip proxy configurations. - - :param request: Request or PreparedRequest - :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs - :param trust_env: Boolean declaring whether to trust environment configs - - :rtype: dict - """ - proxies = proxies if proxies is not None else {} - url = request.url - scheme = urlparse(url).scheme - no_proxy = proxies.get("no_proxy") - new_proxies = proxies.copy() - - if trust_env and not should_bypass_proxies(url, no_proxy=no_proxy): - environ_proxies = get_environ_proxies(url, no_proxy=no_proxy) - - proxy = environ_proxies.get(scheme, environ_proxies.get("all")) - - if proxy: - new_proxies.setdefault(scheme, proxy) - return new_proxies - - -def default_user_agent(name="python-requests"): - """ - Return a string representing the default user agent. - - :rtype: str - """ - return f"{name}/{__version__}" - - -def default_headers(): - """ - :rtype: requests.structures.CaseInsensitiveDict - """ - return CaseInsensitiveDict( - { - "User-Agent": default_user_agent(), - "Accept-Encoding": DEFAULT_ACCEPT_ENCODING, - "Accept": "*/*", - "Connection": "keep-alive", - } - ) - - -def parse_header_links(value): - """Return a list of parsed link headers proxies. - - i.e. Link: <http:/.../front.jpeg>; rel=front; type="image/jpeg",<http://.../back.jpeg>; rel=back;type="image/jpeg" - - :rtype: list - """ - - links = [] - - 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 - - -# Null bytes; no need to recreate these on each call to guess_json_utf -_null = "\x00".encode("ascii") # encoding to ASCII for Python 3 -_null2 = _null * 2 -_null3 = _null * 3 - - -def guess_json_utf(data): - """ - :rtype: str - """ - # JSON always starts with two ASCII characters, so detection is as - # easy as counting the nulls and from their location and count - # determine the encoding. Also detect a BOM, if present. - sample = data[:4] - if sample in (codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE): - return "utf-32" # BOM included - if sample[:3] == codecs.BOM_UTF8: - return "utf-8-sig" # BOM included, MS style (discouraged) - if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE): - return "utf-16" # BOM included - nullcount = sample.count(_null) - if nullcount == 0: - return "utf-8" - if nullcount == 2: - if sample[::2] == _null2: # 1st and 3rd are null - return "utf-16-be" - if sample[1::2] == _null2: # 2nd and 4th are null - return "utf-16-le" - # Did not detect 2 valid UTF-16 ascii-range characters - if nullcount == 3: - if sample[:3] == _null3: - return "utf-32-be" - if sample[1:] == _null3: - return "utf-32-le" - # Did not detect a valid UTF-32 ascii-range character - return None - - -def prepend_scheme_if_needed(url, new_scheme): - """Given a URL that may or may not have a scheme, prepend the given scheme. - Does not replace a present scheme with the one provided as an argument. - - :rtype: str - """ - parsed = parse_url(url) - scheme, auth, host, port, path, query, fragment = parsed - - # A defect in urlparse determines that there isn't a netloc present in some - # urls. We previously assumed parsing was overly cautious, and swapped the - # netloc and path. Due to a lack of tests on the original defect, this is - # maintained with parse_url for backwards compatibility. - netloc = parsed.netloc - if not netloc: - netloc, path = path, netloc - - if auth: - # parse_url doesn't provide the netloc with auth - # so we'll add it ourselves. - netloc = "@".join([auth, netloc]) - if scheme is None: - scheme = new_scheme - if path is None: - path = "" - - return urlunparse((scheme, netloc, path, "", query, fragment)) - - -def get_auth_from_url(url): - """Given a url with authentication components, extract them into a tuple of - username,password. - - :rtype: (str,str) - """ - parsed = urlparse(url) - - try: - auth = (unquote(parsed.username), unquote(parsed.password)) - except (AttributeError, TypeError): - auth = ("", "") - - return auth - - -def check_header_validity(header): - """Verifies that header parts don't contain leading whitespace - reserved characters, or return characters. - - :param header: tuple, in the format (name, value). - """ - name, value = header - _validate_header_part(header, name, 0) - _validate_header_part(header, value, 1) - - -def _validate_header_part(header, header_part, header_validator_index): - if isinstance(header_part, str): - validator = _HEADER_VALIDATORS_STR[header_validator_index] - elif isinstance(header_part, bytes): - validator = _HEADER_VALIDATORS_BYTE[header_validator_index] - else: - raise InvalidHeader( - f"Header part ({header_part!r}) from {header} " - f"must be of type str or bytes, not {type(header_part)}" - ) - - if not validator.match(header_part): - header_kind = "name" if header_validator_index == 0 else "value" - raise InvalidHeader( - f"Invalid leading whitespace, reserved character(s), or return" - f"character(s) in header {header_kind}: {header_part!r}" - ) - - -def urldefragauth(url): - """ - Given a url remove the fragment and the authentication part. - - :rtype: str - """ - scheme, netloc, path, params, query, fragment = urlparse(url) - - # see func:`prepend_scheme_if_needed` - if not netloc: - netloc, path = path, netloc - - netloc = netloc.rsplit("@", 1)[-1] - - return urlunparse((scheme, netloc, path, params, query, "")) - - -def rewind_body(prepared_request): - """Move file pointer back to its recorded starting position - so it can be read again on redirect. - """ - body_seek = getattr(prepared_request.body, "seek", None) - if body_seek is not None and isinstance( - prepared_request._body_position, integer_types - ): - try: - body_seek(prepared_request._body_position) - except OSError: - raise UnrewindableBodyError( - "An error occurred when rewinding request body for redirect." - ) - else: - raise UnrewindableBodyError("Unable to rewind request body for redirect.") diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__init__.py deleted file mode 100644 index d92acc7..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -__all__ = [ - "__version__", - "AbstractProvider", - "AbstractResolver", - "BaseReporter", - "InconsistentCandidate", - "Resolver", - "RequirementsConflicted", - "ResolutionError", - "ResolutionImpossible", - "ResolutionTooDeep", -] - -__version__ = "1.0.1" - - -from .providers import AbstractProvider, AbstractResolver -from .reporters import BaseReporter -from .resolvers import ( - InconsistentCandidate, - RequirementsConflicted, - ResolutionError, - ResolutionImpossible, - ResolutionTooDeep, - Resolver, -) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index e2ed38d743b033802c1c4cddfd09e4f42a3c849f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 656 zcmaJ;J&zMH5VbeSZjwznK*veYQUxh7fes-gxT81;Arw)$u{LXySm%$uv9su)xqm@N zLC0_5AFM=0MHg{Jq^qz)ARSY@nKynKd!D}yhkX>H{QPlwH$mt}B!46DZCt$y=@VKY zj=o@uIHs5<yrmM|qAlH~ZHxkMtBy`-x~)4Z(_PxtJ=)WK+SfVF^?(lakPb1rNJrVI z-{g$d0-UslvF7IUx${tz{teh#asm6!OgO88vKhQ6oS2Eqf)DJ@sVS{-(s^P0abdXR zg%?ftpZsVh&Q}tI4(IOJns-W;Uhw8%t62GP@k;;;&EdXrsw?Z9oGa1X+IQbtdm=>j zp);L4oJ@b>;KnF{R!Go}HHJ=1DWtL0jnIn_orOF?7U1>hMw2mCD8(2=YnxuRTh{G| zH9gpE=(bZM|FggQ|M;)yD$GRJHCb9Mh%UUV$%!pj+x>|bN-UtzW9MagCSc6%d!uX- ztR}TEHBoX-stdog=J90uh&buRxGKuCVj&!<WJSVn8E%2>-V^nVNh3XDlj`ES`&3)L yQsNmLhG#^N+=Bq?7RLBjlIO`~w!ViBjxO^}itv-~=>8_jaI!%G))C-#kpBiIXuCuJ diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-312.pyc deleted file mode 100644 index 44a40d82ae624574f7224385408f11001ff566e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6873 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 VC(i=<e)hBF>-6hC0lo}d{{@b#G^GFl diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-312.pyc deleted file mode 100644 index 6a1406b5e83f77b04944f10659933f284f243d31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2676 zcma)8&5zqe6t|N&$!4<!br(?iP=^D8RBS9jszg<luOiANNL4v>FV4g>*$j0&?#wt# z%n50)NZfiuToHc>;x8aq{sFXsOHaJ#alH0srL7gcOlID^kKg;f=lr?1*K^<rfB9kd zS=({`#vhx<D;De5Ve!mqIA1x;Idz!Jo!^`G?8sd<2F-AD1Hawk$NE!PJaf2n<TB@| z!Q7)JYn(bqE!G6-u@=ZS^FVf38)TPtK<=<E$R67Pxx4HQc31t+spb!PB9-AP`{X{4 z_%St{gb~%67)cT(7lLtxi(|!MQ{~zsJ|<JCh?#NN(K1?aH4Hc56;V2v$hwt>x^xGP z?C=X3MVyfdhr9gza%zN(2@OpO=S!juRYng-zc~YU)zUngYP3wApZGI5=l+};z3}hL zFrD+*Xy0Jiip~$U5#bZA4w*cOBS|4{f5GF0ABl;dEX_>D9}PeF(AUE7!-R%U=rPxR zA`(9UH71o`q=Nc3Pp<SZS+2TyNRV{)N)@r;W*c){H$eR8tU)><uB*>QBp%n1;53{O zCDWJ@IkkXVObRG^JyJZ60B{jA{yh<zWL(L^36zixONEg_Y7H6+80W0KTvuZ_gs2W~ zUE2g5<PNhpF3rdu;sv#X0+}2Z#Dt}NE@t(|3uXmi>tQt~$OS&5Zyu4*GDJ)-vIFlB zYG4~Q^T>zfTg}NB4xljO5&*cmlqor(F(}J|uVgA>8i|Y|(}v_lQEcWYsy?K<@&Gr( zHRcSpuvqr3^8(2mH6*J?dvK|O<5leN>o}H8W;u}~q0=ygcATcrFvD8S)l1;4R`IqC zCELFwzJq#XS5%n(1dUh(cQWJ9vkbu}l*If5pnjSP#jz=Yqkw%G_yR_Xg0547R_cBy zq0qI}Yj^U>pi!(7jjCr@%n2tnNg@F=1b$6L1SZSEV~3zex}YMWlL&lL;0B}M80dz_ z_!M5jH^gZj7J4xF%nT@2<e|xUTuEs>CKMQ0+Cf{4Cx9)F!{z$~rr}7&(4Et*d%##c zf!59uk<!$xRGes%z~qJWL`<ei&cW2f&3G+_(|d#Q_&l4U^p>cr-HNGI+oo7&>~&kQ zprV-Ftnp%7;k7zPu43=6Rf24W4c3bq!{<qfZ_blY#?wfIxCw8OoZ#CG32CaiwzU#5 zygT3xfNu==AfTa)BB603FJG<=1c8$Y40)qK07<tnD@J77TCa7?zQr1D1)BhMMrtr! zqVaYerz?6XyIsXe@$YzOY%iVDk);Z^YH8FfzEkv-j8{A5y?V(ZnZkBZYHTI5rSWb( znX8KaaW$E8DwO`P{8*4g8t6I!on2PDKD^!px3yAq5)sD$LUvGtzu3K1i*hvRuew1H z(>V`<RWAtUlBE%@`$6y&{#+C%ogiQ`3<A}~>-lhg8CTa)yo%xminmbQM1il={1upw zeT9|H1^zA3K8RE2uh!RRE!Vqy)^2(Iv%Ux7n(N&=Yj<IFkng$Pm+rdldJkM{3(brM uja6Gt5Poa6?&^8>uFc_|dIz*~fBUfbr|G)xzl~e&1NZ0K|2g=b+x#E>_u^mx diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-312.pyc deleted file mode 100644 index 302982b53fe0c0879e2837d3a0c9910d09470f7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25919 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-312.pyc deleted file mode 100644 index 953fd65cc0f357d5142408aabe81caa7b4e964cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10528 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 1aec9a8c821803164e8974b46a4349e7d9155cdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 222 zcmZ9GF$w}P5Jfkxf(RbOVs}tmv9k6GA!Y|Rm}Ei{R~GRccJ`jdV|W7D&dQ|q!_55u zdBwcu^I4H3AJ;bDcV7P*#;Lg%eX(HsXW>UF4Vn4gpe2J~L<}A5NS+Pa7$Bm?qZg(M zQOOhfs-cV3BpUS4q3uAc1Gql6WY_g_1wlouoRBAR!~jk?;0bHUgU3L+!^}%EPDJ2b eSrs|2UH_eK3^iwsTR%zPurwi?PstebWpY2Ujz5S1 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-312.pyc deleted file mode 100644 index 9f1ece9f70506b4eecc393d9ffb177d7c7dd0edb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 442 zcmYk0uTKLp6vx}^jSa>^LhuU#GjZ1pEJ1-lfI%^HDZQ8NSbHsPx3ORl1PcyB@cb>9 z;m8>T3P-?@DSF}OOZvX=<@;&-y>B$;kS~6F+Pm@kTrNKqeh=?kez-;{N^v*npjng# zDG^u(oj{Tf!Dt+=AP85HspBuN^5-3RcZ5#J0UF^}rKs*Qt+Tva)b`<c06B-3@|RX% z0xyR6w%3{|s!76xNRncKD<OcpOyxFahx`vK>N`>^<F<`arl|kp?$CSr=JcHQlmsf7 zvqQS2_&`GLEOj8DYnY6z%XlA5l&VoK6idO-A>>0UvO}uJuBY<#xV=Vg<{;9H_gNP# z)tRP=$5Lge0jtCiN}emJne+0SHt}g=J)YJ!q)G<@HqE>bh5fPAw^xEOeylHD9Zlwz q&#JE>!SPero`mg>$Liu6!sQx0gi#5`Q(IoXs4bw&Mw8s)Ciw(g|9*S` diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py b/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py deleted file mode 100644 index 1becc50..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py +++ /dev/null @@ -1,6 +0,0 @@ -__all__ = ["Mapping", "Sequence"] - -try: - from collections.abc import Mapping, Sequence -except ImportError: - from collections import Mapping, Sequence diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/providers.py b/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/providers.py deleted file mode 100644 index e99d87e..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/providers.py +++ /dev/null @@ -1,133 +0,0 @@ -class AbstractProvider(object): - """Delegate class to provide the required interface for the resolver.""" - - def identify(self, requirement_or_candidate): - """Given a requirement, return an identifier for it. - - This is used to identify a requirement, e.g. whether two requirements - should have their specifier parts merged. - """ - raise NotImplementedError - - def get_preference( - self, - identifier, - resolutions, - candidates, - information, - backtrack_causes, - ): - """Produce a sort key for given requirement based on preference. - - The preference is defined as "I think this requirement should be - resolved first". The lower the return value is, the more preferred - this group of arguments is. - - :param identifier: An identifier as returned by ``identify()``. This - identifies the dependency matches which should be returned. - :param resolutions: Mapping of candidates currently pinned by the - resolver. Each key is an identifier, and the value is a candidate. - The candidate may conflict with requirements from ``information``. - :param candidates: Mapping of each dependency's possible candidates. - Each value is an iterator of candidates. - :param information: Mapping of requirement information of each package. - Each value is an iterator of *requirement information*. - :param backtrack_causes: Sequence of requirement information that were - the requirements that caused the resolver to most recently backtrack. - - A *requirement information* instance is a named tuple with two members: - - * ``requirement`` specifies a requirement contributing to the current - list of candidates. - * ``parent`` specifies the candidate that provides (depended on) the - requirement, or ``None`` to indicate a root requirement. - - The preference could depend on various issues, including (not - necessarily in this order): - - * Is this package pinned in the current resolution result? - * How relaxed is the requirement? Stricter ones should probably be - worked on first? (I don't know, actually.) - * How many possibilities are there to satisfy this requirement? Those - with few left should likely be worked on first, I guess? - * Are there any known conflicts for this requirement? We should - probably work on those with the most known conflicts. - - A sortable value should be returned (this will be used as the ``key`` - parameter of the built-in sorting function). The smaller the value is, - the more preferred this requirement is (i.e. the sorting function - is called with ``reverse=False``). - """ - raise NotImplementedError - - def find_matches(self, identifier, requirements, incompatibilities): - """Find all possible candidates that satisfy the given constraints. - - :param identifier: An identifier as returned by ``identify()``. This - identifies the dependency matches of which should be returned. - :param requirements: A mapping of requirements that all returned - candidates must satisfy. Each key is an identifier, and the value - an iterator of requirements for that dependency. - :param incompatibilities: A mapping of known incompatibilities of - each dependency. Each key is an identifier, and the value an - iterator of incompatibilities known to the resolver. All - incompatibilities *must* be excluded from the return value. - - This should try to get candidates based on the requirements' types. - For VCS, local, and archive requirements, the one-and-only match is - returned, and for a "named" requirement, the index(es) should be - consulted to find concrete candidates for this requirement. - - The return value should produce candidates ordered by preference; the - most preferred candidate should come first. The return type may be one - of the following: - - * A callable that returns an iterator that yields candidates. - * An collection of candidates. - * An iterable of candidates. This will be consumed immediately into a - list of candidates. - """ - raise NotImplementedError - - def is_satisfied_by(self, requirement, candidate): - """Whether the given requirement can be satisfied by a candidate. - - The candidate is guaranteed to have been generated from the - requirement. - - A boolean should be returned to indicate whether ``candidate`` is a - viable solution to the requirement. - """ - raise NotImplementedError - - def get_dependencies(self, candidate): - """Get dependencies of a candidate. - - This should return a collection of requirements that `candidate` - specifies as its dependencies. - """ - raise NotImplementedError - - -class AbstractResolver(object): - """The thing that performs the actual resolution work.""" - - base_exception = Exception - - def __init__(self, provider, reporter): - self.provider = provider - self.reporter = reporter - - def resolve(self, requirements, **kwargs): - """Take a collection of constraints, spit out the resolution result. - - This returns a representation of the final resolution state, with one - guarenteed attribute ``mapping`` that contains resolved candidates as - values. The keys are their respective identifiers. - - :param requirements: A collection of constraints. - :param kwargs: Additional keyword arguments that subclasses may accept. - - :raises: ``self.base_exception`` or its subclass. - """ - raise NotImplementedError diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/reporters.py b/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/reporters.py deleted file mode 100644 index 688b5e1..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/reporters.py +++ /dev/null @@ -1,43 +0,0 @@ -class BaseReporter(object): - """Delegate class to provider progress reporting for the resolver.""" - - def starting(self): - """Called before the resolution actually starts.""" - - def starting_round(self, index): - """Called before each round of resolution starts. - - The index is zero-based. - """ - - def ending_round(self, index, state): - """Called before each round of resolution ends. - - This is NOT called if the resolution ends at this round. Use `ending` - if you want to report finalization. The index is zero-based. - """ - - def ending(self, state): - """Called before the resolution ends successfully.""" - - def adding_requirement(self, requirement, parent): - """Called when adding a new requirement into the resolve criteria. - - :param requirement: The additional requirement to be applied to filter - the available candidaites. - :param parent: The candidate that requires ``requirement`` as a - dependency, or None if ``requirement`` is one of the root - requirements passed in from ``Resolver.resolve()``. - """ - - def resolving_conflicts(self, causes): - """Called when starting to attempt requirement conflict resolution. - - :param causes: The information on the collision that caused the backtracking. - """ - - def rejecting_candidate(self, criterion, candidate): - """Called when rejecting a candidate during backtracking.""" - - def pinning(self, candidate): - """Called when adding a candidate to the potential solution.""" diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers.py b/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers.py deleted file mode 100644 index 2c3d0e3..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers.py +++ /dev/null @@ -1,547 +0,0 @@ -import collections -import itertools -import operator - -from .providers import AbstractResolver -from .structs import DirectedGraph, IteratorMapping, build_iter_view - -RequirementInformation = collections.namedtuple( - "RequirementInformation", ["requirement", "parent"] -) - - -class ResolverException(Exception): - """A base class for all exceptions raised by this module. - - Exceptions derived by this class should all be handled in this module. Any - bubbling pass the resolver should be treated as a bug. - """ - - -class RequirementsConflicted(ResolverException): - def __init__(self, criterion): - super(RequirementsConflicted, self).__init__(criterion) - self.criterion = criterion - - def __str__(self): - return "Requirements conflict: {}".format( - ", ".join(repr(r) for r in self.criterion.iter_requirement()), - ) - - -class InconsistentCandidate(ResolverException): - def __init__(self, candidate, criterion): - super(InconsistentCandidate, self).__init__(candidate, criterion) - self.candidate = candidate - self.criterion = criterion - - def __str__(self): - return "Provided candidate {!r} does not satisfy {}".format( - self.candidate, - ", ".join(repr(r) for r in self.criterion.iter_requirement()), - ) - - -class Criterion(object): - """Representation of possible resolution results of a package. - - This holds three attributes: - - * `information` is a collection of `RequirementInformation` pairs. - Each pair is a requirement contributing to this criterion, and the - candidate that provides the requirement. - * `incompatibilities` is a collection of all known not-to-work candidates - to exclude from consideration. - * `candidates` is a collection containing all possible candidates deducted - from the union of contributing requirements and known incompatibilities. - It should never be empty, except when the criterion is an attribute of a - raised `RequirementsConflicted` (in which case it is always empty). - - .. note:: - This class is intended to be externally immutable. **Do not** mutate - any of its attribute containers. - """ - - def __init__(self, candidates, information, incompatibilities): - self.candidates = candidates - self.information = information - self.incompatibilities = incompatibilities - - def __repr__(self): - requirements = ", ".join( - "({!r}, via={!r})".format(req, parent) - for req, parent in self.information - ) - return "Criterion({})".format(requirements) - - def iter_requirement(self): - return (i.requirement for i in self.information) - - def iter_parent(self): - return (i.parent for i in self.information) - - -class ResolutionError(ResolverException): - pass - - -class ResolutionImpossible(ResolutionError): - def __init__(self, causes): - super(ResolutionImpossible, self).__init__(causes) - # causes is a list of RequirementInformation objects - self.causes = causes - - -class ResolutionTooDeep(ResolutionError): - def __init__(self, round_count): - super(ResolutionTooDeep, self).__init__(round_count) - self.round_count = round_count - - -# Resolution state in a round. -State = collections.namedtuple("State", "mapping criteria backtrack_causes") - - -class Resolution(object): - """Stateful resolution object. - - This is designed as a one-off object that holds information to kick start - the resolution process, and holds the results afterwards. - """ - - def __init__(self, provider, reporter): - self._p = provider - self._r = reporter - self._states = [] - - @property - def state(self): - try: - return self._states[-1] - except IndexError: - raise AttributeError("state") - - def _push_new_state(self): - """Push a new state into history. - - This new state will be used to hold resolution results of the next - coming round. - """ - base = self._states[-1] - state = State( - mapping=base.mapping.copy(), - criteria=base.criteria.copy(), - backtrack_causes=base.backtrack_causes[:], - ) - self._states.append(state) - - def _add_to_criteria(self, criteria, requirement, parent): - self._r.adding_requirement(requirement=requirement, parent=parent) - - identifier = self._p.identify(requirement_or_candidate=requirement) - criterion = criteria.get(identifier) - if criterion: - incompatibilities = list(criterion.incompatibilities) - else: - incompatibilities = [] - - matches = self._p.find_matches( - identifier=identifier, - requirements=IteratorMapping( - criteria, - operator.methodcaller("iter_requirement"), - {identifier: [requirement]}, - ), - incompatibilities=IteratorMapping( - criteria, - operator.attrgetter("incompatibilities"), - {identifier: incompatibilities}, - ), - ) - - if criterion: - information = list(criterion.information) - information.append(RequirementInformation(requirement, parent)) - else: - information = [RequirementInformation(requirement, parent)] - - criterion = Criterion( - candidates=build_iter_view(matches), - information=information, - incompatibilities=incompatibilities, - ) - if not criterion.candidates: - raise RequirementsConflicted(criterion) - criteria[identifier] = criterion - - def _remove_information_from_criteria(self, criteria, parents): - """Remove information from parents of criteria. - - Concretely, removes all values from each criterion's ``information`` - field that have one of ``parents`` as provider of the requirement. - - :param criteria: The criteria to update. - :param parents: Identifiers for which to remove information from all criteria. - """ - if not parents: - return - for key, criterion in criteria.items(): - criteria[key] = Criterion( - criterion.candidates, - [ - information - for information in criterion.information - if ( - information.parent is None - or self._p.identify(information.parent) not in parents - ) - ], - criterion.incompatibilities, - ) - - def _get_preference(self, name): - return self._p.get_preference( - identifier=name, - resolutions=self.state.mapping, - candidates=IteratorMapping( - self.state.criteria, - operator.attrgetter("candidates"), - ), - information=IteratorMapping( - self.state.criteria, - operator.attrgetter("information"), - ), - backtrack_causes=self.state.backtrack_causes, - ) - - def _is_current_pin_satisfying(self, name, criterion): - try: - current_pin = self.state.mapping[name] - except KeyError: - return False - return all( - self._p.is_satisfied_by(requirement=r, candidate=current_pin) - for r in criterion.iter_requirement() - ) - - def _get_updated_criteria(self, candidate): - criteria = self.state.criteria.copy() - for requirement in self._p.get_dependencies(candidate=candidate): - self._add_to_criteria(criteria, requirement, parent=candidate) - return criteria - - def _attempt_to_pin_criterion(self, name): - criterion = self.state.criteria[name] - - causes = [] - for candidate in criterion.candidates: - try: - criteria = self._get_updated_criteria(candidate) - except RequirementsConflicted as e: - self._r.rejecting_candidate(e.criterion, candidate) - causes.append(e.criterion) - continue - - # Check the newly-pinned candidate actually works. This should - # always pass under normal circumstances, but in the case of a - # faulty provider, we will raise an error to notify the implementer - # to fix find_matches() and/or is_satisfied_by(). - satisfied = all( - self._p.is_satisfied_by(requirement=r, candidate=candidate) - for r in criterion.iter_requirement() - ) - if not satisfied: - raise InconsistentCandidate(candidate, criterion) - - self._r.pinning(candidate=candidate) - self.state.criteria.update(criteria) - - # Put newly-pinned candidate at the end. This is essential because - # backtracking looks at this mapping to get the last pin. - self.state.mapping.pop(name, None) - self.state.mapping[name] = candidate - - return [] - - # All candidates tried, nothing works. This criterion is a dead - # end, signal for backtracking. - return causes - - def _backjump(self, causes): - """Perform backjumping. - - When we enter here, the stack is like this:: - - [ state Z ] - [ state Y ] - [ state X ] - .... earlier states are irrelevant. - - 1. No pins worked for Z, so it does not have a pin. - 2. We want to reset state Y to unpinned, and pin another candidate. - 3. State X holds what state Y was before the pin, but does not - have the incompatibility information gathered in state Y. - - Each iteration of the loop will: - - 1. Identify Z. The incompatibility is not always caused by the latest - state. For example, given three requirements A, B and C, with - dependencies A1, B1 and C1, where A1 and B1 are incompatible: the - last state might be related to C, so we want to discard the - previous state. - 2. Discard Z. - 3. Discard Y but remember its incompatibility information gathered - previously, and the failure we're dealing with right now. - 4. Push a new state Y' based on X, and apply the incompatibility - information from Y to Y'. - 5a. If this causes Y' to conflict, we need to backtrack again. Make Y' - the new Z and go back to step 2. - 5b. If the incompatibilities apply cleanly, end backtracking. - """ - incompatible_reqs = itertools.chain( - (c.parent for c in causes if c.parent is not None), - (c.requirement for c in causes), - ) - incompatible_deps = {self._p.identify(r) for r in incompatible_reqs} - while len(self._states) >= 3: - # Remove the state that triggered backtracking. - del self._states[-1] - - # Ensure to backtrack to a state that caused the incompatibility - incompatible_state = False - while not incompatible_state: - # Retrieve the last candidate pin and known incompatibilities. - try: - broken_state = self._states.pop() - name, candidate = broken_state.mapping.popitem() - except (IndexError, KeyError): - raise ResolutionImpossible(causes) - current_dependencies = { - self._p.identify(d) - for d in self._p.get_dependencies(candidate) - } - incompatible_state = not current_dependencies.isdisjoint( - incompatible_deps - ) - - incompatibilities_from_broken = [ - (k, list(v.incompatibilities)) - for k, v in broken_state.criteria.items() - ] - - # Also mark the newly known incompatibility. - incompatibilities_from_broken.append((name, [candidate])) - - # Create a new state from the last known-to-work one, and apply - # the previously gathered incompatibility information. - def _patch_criteria(): - for k, incompatibilities in incompatibilities_from_broken: - if not incompatibilities: - continue - try: - criterion = self.state.criteria[k] - except KeyError: - continue - matches = self._p.find_matches( - identifier=k, - requirements=IteratorMapping( - self.state.criteria, - operator.methodcaller("iter_requirement"), - ), - incompatibilities=IteratorMapping( - self.state.criteria, - operator.attrgetter("incompatibilities"), - {k: incompatibilities}, - ), - ) - candidates = build_iter_view(matches) - if not candidates: - return False - incompatibilities.extend(criterion.incompatibilities) - self.state.criteria[k] = Criterion( - candidates=candidates, - information=list(criterion.information), - incompatibilities=incompatibilities, - ) - return True - - self._push_new_state() - success = _patch_criteria() - - # It works! Let's work on this new state. - if success: - return True - - # State does not work after applying known incompatibilities. - # Try the still previous state. - - # No way to backtrack anymore. - return False - - def resolve(self, requirements, max_rounds): - if self._states: - raise RuntimeError("already resolved") - - self._r.starting() - - # Initialize the root state. - self._states = [ - State( - mapping=collections.OrderedDict(), - criteria={}, - backtrack_causes=[], - ) - ] - for r in requirements: - try: - self._add_to_criteria(self.state.criteria, r, parent=None) - except RequirementsConflicted as e: - raise ResolutionImpossible(e.criterion.information) - - # The root state is saved as a sentinel so the first ever pin can have - # something to backtrack to if it fails. The root state is basically - # pinning the virtual "root" package in the graph. - self._push_new_state() - - for round_index in range(max_rounds): - self._r.starting_round(index=round_index) - - unsatisfied_names = [ - key - for key, criterion in self.state.criteria.items() - if not self._is_current_pin_satisfying(key, criterion) - ] - - # All criteria are accounted for. Nothing more to pin, we are done! - if not unsatisfied_names: - self._r.ending(state=self.state) - return self.state - - # keep track of satisfied names to calculate diff after pinning - satisfied_names = set(self.state.criteria.keys()) - set( - unsatisfied_names - ) - - # Choose the most preferred unpinned criterion to try. - name = min(unsatisfied_names, key=self._get_preference) - failure_causes = self._attempt_to_pin_criterion(name) - - if failure_causes: - causes = [i for c in failure_causes for i in c.information] - # Backjump if pinning fails. The backjump process puts us in - # an unpinned state, so we can work on it in the next round. - self._r.resolving_conflicts(causes=causes) - success = self._backjump(causes) - self.state.backtrack_causes[:] = causes - - # Dead ends everywhere. Give up. - if not success: - raise ResolutionImpossible(self.state.backtrack_causes) - else: - # discard as information sources any invalidated names - # (unsatisfied names that were previously satisfied) - newly_unsatisfied_names = { - key - for key, criterion in self.state.criteria.items() - if key in satisfied_names - and not self._is_current_pin_satisfying(key, criterion) - } - self._remove_information_from_criteria( - self.state.criteria, newly_unsatisfied_names - ) - # Pinning was successful. Push a new state to do another pin. - self._push_new_state() - - self._r.ending_round(index=round_index, state=self.state) - - raise ResolutionTooDeep(max_rounds) - - -def _has_route_to_root(criteria, key, all_keys, connected): - if key in connected: - return True - if key not in criteria: - return False - for p in criteria[key].iter_parent(): - try: - pkey = all_keys[id(p)] - except KeyError: - continue - if pkey in connected: - connected.add(key) - return True - if _has_route_to_root(criteria, pkey, all_keys, connected): - connected.add(key) - return True - return False - - -Result = collections.namedtuple("Result", "mapping graph criteria") - - -def _build_result(state): - mapping = state.mapping - all_keys = {id(v): k for k, v in mapping.items()} - all_keys[id(None)] = None - - graph = DirectedGraph() - graph.add(None) # Sentinel as root dependencies' parent. - - connected = {None} - for key, criterion in state.criteria.items(): - if not _has_route_to_root(state.criteria, key, all_keys, connected): - continue - if key not in graph: - graph.add(key) - for p in criterion.iter_parent(): - try: - pkey = all_keys[id(p)] - except KeyError: - continue - if pkey not in graph: - graph.add(pkey) - graph.connect(pkey, key) - - return Result( - mapping={k: v for k, v in mapping.items() if k in connected}, - graph=graph, - criteria=state.criteria, - ) - - -class Resolver(AbstractResolver): - """The thing that performs the actual resolution work.""" - - base_exception = ResolverException - - def resolve(self, requirements, max_rounds=100): - """Take a collection of constraints, spit out the resolution result. - - The return value is a representation to the final resolution result. It - is a tuple subclass with three public members: - - * `mapping`: A dict of resolved candidates. Each key is an identifier - of a requirement (as returned by the provider's `identify` method), - and the value is the resolved candidate. - * `graph`: A `DirectedGraph` instance representing the dependency tree. - The vertices are keys of `mapping`, and each edge represents *why* - a particular package is included. A special vertex `None` is - included to represent parents of user-supplied requirements. - * `criteria`: A dict of "criteria" that hold detailed information on - how edges in the graph are derived. Each key is an identifier of a - requirement, and the value is a `Criterion` instance. - - The following exceptions may be raised if a resolution cannot be found: - - * `ResolutionImpossible`: A resolution cannot be found for the given - combination of requirements. The `causes` attribute of the - exception is a list of (requirement, parent), giving the - requirements that could not be satisfied. - * `ResolutionTooDeep`: The dependency tree is too deeply nested and - the resolver gave up. This is usually caused by a circular - dependency, but you can try to resolve this by increasing the - `max_rounds` argument. - """ - resolution = Resolution(self.provider, self.reporter) - state = resolution.resolve(requirements, max_rounds=max_rounds) - return _build_result(state) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/structs.py b/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/structs.py deleted file mode 100644 index 359a34f..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/structs.py +++ /dev/null @@ -1,170 +0,0 @@ -import itertools - -from .compat import collections_abc - - -class DirectedGraph(object): - """A graph structure with directed edges.""" - - def __init__(self): - self._vertices = set() - self._forwards = {} # <key> -> Set[<key>] - self._backwards = {} # <key> -> Set[<key>] - - def __iter__(self): - return iter(self._vertices) - - def __len__(self): - return len(self._vertices) - - def __contains__(self, key): - return key in self._vertices - - def copy(self): - """Return a shallow copy of this graph.""" - other = DirectedGraph() - other._vertices = set(self._vertices) - other._forwards = {k: set(v) for k, v in self._forwards.items()} - other._backwards = {k: set(v) for k, v in self._backwards.items()} - return other - - def add(self, key): - """Add a new vertex to the graph.""" - if key in self._vertices: - raise ValueError("vertex exists") - self._vertices.add(key) - self._forwards[key] = set() - self._backwards[key] = set() - - def remove(self, key): - """Remove a vertex from the graph, disconnecting all edges from/to it.""" - self._vertices.remove(key) - for f in self._forwards.pop(key): - self._backwards[f].remove(key) - for t in self._backwards.pop(key): - self._forwards[t].remove(key) - - def connected(self, f, t): - return f in self._backwards[t] and t in self._forwards[f] - - def connect(self, f, t): - """Connect two existing vertices. - - Nothing happens if the vertices are already connected. - """ - if t not in self._vertices: - raise KeyError(t) - self._forwards[f].add(t) - self._backwards[t].add(f) - - def iter_edges(self): - for f, children in self._forwards.items(): - for t in children: - yield f, t - - def iter_children(self, key): - return iter(self._forwards[key]) - - def iter_parents(self, key): - return iter(self._backwards[key]) - - -class IteratorMapping(collections_abc.Mapping): - def __init__(self, mapping, accessor, appends=None): - self._mapping = mapping - self._accessor = accessor - self._appends = appends or {} - - def __repr__(self): - return "IteratorMapping({!r}, {!r}, {!r})".format( - self._mapping, - self._accessor, - self._appends, - ) - - def __bool__(self): - return bool(self._mapping or self._appends) - - __nonzero__ = __bool__ # XXX: Python 2. - - def __contains__(self, key): - return key in self._mapping or key in self._appends - - def __getitem__(self, k): - try: - v = self._mapping[k] - except KeyError: - return iter(self._appends[k]) - return itertools.chain(self._accessor(v), self._appends.get(k, ())) - - def __iter__(self): - more = (k for k in self._appends if k not in self._mapping) - return itertools.chain(self._mapping, more) - - def __len__(self): - more = sum(1 for k in self._appends if k not in self._mapping) - return len(self._mapping) + more - - -class _FactoryIterableView(object): - """Wrap an iterator factory returned by `find_matches()`. - - Calling `iter()` on this class would invoke the underlying iterator - factory, making it a "collection with ordering" that can be iterated - through multiple times, but lacks random access methods presented in - built-in Python sequence types. - """ - - def __init__(self, factory): - self._factory = factory - self._iterable = None - - def __repr__(self): - return "{}({})".format(type(self).__name__, list(self)) - - def __bool__(self): - try: - next(iter(self)) - except StopIteration: - return False - return True - - __nonzero__ = __bool__ # XXX: Python 2. - - def __iter__(self): - iterable = ( - self._factory() if self._iterable is None else self._iterable - ) - self._iterable, current = itertools.tee(iterable) - return current - - -class _SequenceIterableView(object): - """Wrap an iterable returned by find_matches(). - - This is essentially just a proxy to the underlying sequence that provides - the same interface as `_FactoryIterableView`. - """ - - def __init__(self, sequence): - self._sequence = sequence - - def __repr__(self): - return "{}({})".format(type(self).__name__, self._sequence) - - def __bool__(self): - return bool(self._sequence) - - __nonzero__ = __bool__ # XXX: Python 2. - - def __iter__(self): - return iter(self._sequence) - - -def build_iter_view(matches): - """Build an iterable view from the value returned by `find_matches()`.""" - if callable(matches): - return _FactoryIterableView(matches) - if not isinstance(matches, collections_abc.Sequence): - matches = list(matches) - return _SequenceIterableView(matches) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__init__.py deleted file mode 100644 index 73f58d7..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__init__.py +++ /dev/null @@ -1,177 +0,0 @@ -"""Rich text and beautiful formatting in the terminal.""" - -import os -from typing import IO, TYPE_CHECKING, Any, Callable, Optional, Union - -from ._extension import load_ipython_extension # noqa: F401 - -__all__ = ["get_console", "reconfigure", "print", "inspect", "print_json"] - -if TYPE_CHECKING: - from .console import Console - -# Global console used by alternative print -_console: Optional["Console"] = None - -try: - _IMPORT_CWD = os.path.abspath(os.getcwd()) -except FileNotFoundError: - # Can happen if the cwd has been deleted - _IMPORT_CWD = "" - - -def get_console() -> "Console": - """Get a global :class:`~rich.console.Console` instance. This function is used when Rich requires a Console, - and hasn't been explicitly given one. - - Returns: - Console: A console instance. - """ - global _console - if _console is None: - from .console import Console - - _console = Console() - - return _console - - -def reconfigure(*args: Any, **kwargs: Any) -> None: - """Reconfigures the global console by replacing it with another. - - Args: - *args (Any): Positional arguments for the replacement :class:`~rich.console.Console`. - **kwargs (Any): Keyword arguments for the replacement :class:`~rich.console.Console`. - """ - from pip._vendor.rich.console import Console - - new_console = Console(*args, **kwargs) - _console = get_console() - _console.__dict__ = new_console.__dict__ - - -def print( - *objects: Any, - sep: str = " ", - end: str = "\n", - file: Optional[IO[str]] = None, - flush: bool = False, -) -> None: - r"""Print object(s) supplied via positional arguments. - This function has an identical signature to the built-in print. - For more advanced features, see the :class:`~rich.console.Console` class. - - Args: - sep (str, optional): Separator between printed objects. Defaults to " ". - end (str, optional): Character to write at end of output. Defaults to "\\n". - file (IO[str], optional): File to write to, or None for stdout. Defaults to None. - flush (bool, optional): Has no effect as Rich always flushes output. Defaults to False. - - """ - from .console import Console - - write_console = get_console() if file is None else Console(file=file) - return write_console.print(*objects, sep=sep, end=end) - - -def print_json( - json: Optional[str] = None, - *, - data: Any = None, - indent: Union[None, int, str] = 2, - highlight: bool = True, - skip_keys: bool = False, - ensure_ascii: bool = False, - check_circular: bool = True, - allow_nan: bool = True, - default: Optional[Callable[[Any], Any]] = None, - sort_keys: bool = False, -) -> None: - """Pretty prints JSON. Output will be valid JSON. - - Args: - json (str): A string containing JSON. - data (Any): If json is not supplied, then encode this data. - indent (int, optional): Number of spaces to indent. Defaults to 2. - highlight (bool, optional): Enable highlighting of output: Defaults to True. - skip_keys (bool, optional): Skip keys not of a basic type. Defaults to False. - ensure_ascii (bool, optional): Escape all non-ascii characters. Defaults to False. - check_circular (bool, optional): Check for circular references. Defaults to True. - allow_nan (bool, optional): Allow NaN and Infinity values. Defaults to True. - default (Callable, optional): A callable that converts values that can not be encoded - in to something that can be JSON encoded. Defaults to None. - sort_keys (bool, optional): Sort dictionary keys. Defaults to False. - """ - - get_console().print_json( - json, - data=data, - indent=indent, - highlight=highlight, - skip_keys=skip_keys, - ensure_ascii=ensure_ascii, - check_circular=check_circular, - allow_nan=allow_nan, - default=default, - sort_keys=sort_keys, - ) - - -def inspect( - obj: Any, - *, - console: Optional["Console"] = None, - title: Optional[str] = None, - help: bool = False, - methods: bool = False, - docs: bool = True, - private: bool = False, - dunder: bool = False, - sort: bool = True, - all: bool = False, - value: bool = True, -) -> None: - """Inspect any Python object. - - * inspect(<OBJECT>) to see summarized info. - * inspect(<OBJECT>, methods=True) to see methods. - * inspect(<OBJECT>, help=True) to see full (non-abbreviated) help. - * inspect(<OBJECT>, private=True) to see private attributes (single underscore). - * inspect(<OBJECT>, dunder=True) to see attributes beginning with double underscore. - * inspect(<OBJECT>, all=True) to see all attributes. - - Args: - obj (Any): An object to inspect. - title (str, optional): Title to display over inspect result, or None use type. Defaults to None. - help (bool, optional): Show full help text rather than just first paragraph. Defaults to False. - methods (bool, optional): Enable inspection of callables. Defaults to False. - docs (bool, optional): Also render doc strings. Defaults to True. - private (bool, optional): Show private attributes (beginning with underscore). Defaults to False. - dunder (bool, optional): Show attributes starting with double underscore. Defaults to False. - sort (bool, optional): Sort attributes alphabetically. Defaults to True. - all (bool, optional): Show all attributes. Defaults to False. - value (bool, optional): Pretty print value. Defaults to True. - """ - _console = console or get_console() - from pip._vendor.rich._inspect import Inspect - - # Special case for inspect(inspect) - is_inspect = obj is inspect - - _inspect = Inspect( - obj, - title=title, - help=is_inspect or help, - methods=is_inspect or methods, - docs=is_inspect or docs, - private=private, - dunder=dunder, - sort=sort, - all=all, - value=value, - ) - _console.print(_inspect) - - -if __name__ == "__main__": # pragma: no cover - print("Hello, **World**") diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__main__.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__main__.py deleted file mode 100644 index 270629f..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__main__.py +++ /dev/null @@ -1,274 +0,0 @@ -import colorsys -import io -from time import process_time - -from pip._vendor.rich import box -from pip._vendor.rich.color import Color -from pip._vendor.rich.console import Console, ConsoleOptions, Group, RenderableType, RenderResult -from pip._vendor.rich.markdown import Markdown -from pip._vendor.rich.measure import Measurement -from pip._vendor.rich.pretty import Pretty -from pip._vendor.rich.segment import Segment -from pip._vendor.rich.style import Style -from pip._vendor.rich.syntax import Syntax -from pip._vendor.rich.table import Table -from pip._vendor.rich.text import Text - - -class ColorBox: - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - for y in range(0, 5): - for x in range(options.max_width): - h = x / options.max_width - l = 0.1 + ((y / 5) * 0.7) - r1, g1, b1 = colorsys.hls_to_rgb(h, l, 1.0) - r2, g2, b2 = colorsys.hls_to_rgb(h, l + 0.7 / 10, 1.0) - bgcolor = Color.from_rgb(r1 * 255, g1 * 255, b1 * 255) - color = Color.from_rgb(r2 * 255, g2 * 255, b2 * 255) - yield Segment("▄", Style(color=color, bgcolor=bgcolor)) - yield Segment.line() - - def __rich_measure__( - self, console: "Console", options: ConsoleOptions - ) -> Measurement: - return Measurement(1, options.max_width) - - -def make_test_card() -> Table: - """Get a renderable that demonstrates a number of features.""" - table = Table.grid(padding=1, pad_edge=True) - table.title = "Rich features" - table.add_column("Feature", no_wrap=True, justify="center", style="bold red") - table.add_column("Demonstration") - - color_table = Table( - box=None, - expand=False, - show_header=False, - show_edge=False, - pad_edge=False, - ) - color_table.add_row( - ( - "✓ [bold green]4-bit color[/]\n" - "✓ [bold blue]8-bit color[/]\n" - "✓ [bold magenta]Truecolor (16.7 million)[/]\n" - "✓ [bold yellow]Dumb terminals[/]\n" - "✓ [bold cyan]Automatic color conversion" - ), - ColorBox(), - ) - - table.add_row("Colors", color_table) - - table.add_row( - "Styles", - "All ansi styles: [bold]bold[/], [dim]dim[/], [italic]italic[/italic], [underline]underline[/], [strike]strikethrough[/], [reverse]reverse[/], and even [blink]blink[/].", - ) - - lorem = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque in metus sed sapien ultricies pretium a at justo. Maecenas luctus velit et auctor maximus." - lorem_table = Table.grid(padding=1, collapse_padding=True) - lorem_table.pad_edge = False - lorem_table.add_row( - Text(lorem, justify="left", style="green"), - Text(lorem, justify="center", style="yellow"), - Text(lorem, justify="right", style="blue"), - Text(lorem, justify="full", style="red"), - ) - table.add_row( - "Text", - Group( - Text.from_markup( - """Word wrap text. Justify [green]left[/], [yellow]center[/], [blue]right[/] or [red]full[/].\n""" - ), - lorem_table, - ), - ) - - def comparison(renderable1: RenderableType, renderable2: RenderableType) -> Table: - table = Table(show_header=False, pad_edge=False, box=None, expand=True) - table.add_column("1", ratio=1) - table.add_column("2", ratio=1) - table.add_row(renderable1, renderable2) - return table - - table.add_row( - "Asian\nlanguage\nsupport", - ":flag_for_china: 该库支持中文,日文和韩文文本!\n:flag_for_japan: ライブラリは中国語、日本語、韓国語のテキストをサポートしています\n:flag_for_south_korea: 이 라이브러리는 중국어, 일본어 및 한국어 텍스트를 지원합니다", - ) - - markup_example = ( - "[bold magenta]Rich[/] supports a simple [i]bbcode[/i]-like [b]markup[/b] for [yellow]color[/], [underline]style[/], and emoji! " - ":+1: :apple: :ant: :bear: :baguette_bread: :bus: " - ) - table.add_row("Markup", markup_example) - - example_table = Table( - show_edge=False, - show_header=True, - expand=False, - row_styles=["none", "dim"], - box=box.SIMPLE, - ) - example_table.add_column("[green]Date", style="green", no_wrap=True) - example_table.add_column("[blue]Title", style="blue") - example_table.add_column( - "[cyan]Production Budget", - style="cyan", - justify="right", - no_wrap=True, - ) - example_table.add_column( - "[magenta]Box Office", - style="magenta", - justify="right", - no_wrap=True, - ) - example_table.add_row( - "Dec 20, 2019", - "Star Wars: The Rise of Skywalker", - "$275,000,000", - "$375,126,118", - ) - example_table.add_row( - "May 25, 2018", - "[b]Solo[/]: A Star Wars Story", - "$275,000,000", - "$393,151,347", - ) - example_table.add_row( - "Dec 15, 2017", - "Star Wars Ep. VIII: The Last Jedi", - "$262,000,000", - "[bold]$1,332,539,889[/bold]", - ) - example_table.add_row( - "May 19, 1999", - "Star Wars Ep. [b]I[/b]: [i]The phantom Menace", - "$115,000,000", - "$1,027,044,677", - ) - - table.add_row("Tables", example_table) - - code = '''\ -def iter_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]: - """Iterate and generate a tuple with a flag for last value.""" - iter_values = iter(values) - try: - previous_value = next(iter_values) - except StopIteration: - return - for value in iter_values: - yield False, previous_value - previous_value = value - yield True, previous_value''' - - pretty_data = { - "foo": [ - 3.1427, - ( - "Paul Atreides", - "Vladimir Harkonnen", - "Thufir Hawat", - ), - ], - "atomic": (False, True, None), - } - table.add_row( - "Syntax\nhighlighting\n&\npretty\nprinting", - comparison( - Syntax(code, "python3", line_numbers=True, indent_guides=True), - Pretty(pretty_data, indent_guides=True), - ), - ) - - markdown_example = """\ -# Markdown - -Supports much of the *markdown* __syntax__! - -- Headers -- Basic formatting: **bold**, *italic*, `code` -- Block quotes -- Lists, and more... - """ - table.add_row( - "Markdown", comparison("[cyan]" + markdown_example, Markdown(markdown_example)) - ) - - table.add_row( - "+more!", - """Progress bars, columns, styled logging handler, tracebacks, etc...""", - ) - return table - - -if __name__ == "__main__": # pragma: no cover - - console = Console( - file=io.StringIO(), - force_terminal=True, - ) - test_card = make_test_card() - - # Print once to warm cache - start = process_time() - console.print(test_card) - pre_cache_taken = round((process_time() - start) * 1000.0, 1) - - console.file = io.StringIO() - - start = process_time() - console.print(test_card) - taken = round((process_time() - start) * 1000.0, 1) - - c = Console(record=True) - c.print(test_card) - - print(f"rendered in {pre_cache_taken}ms (cold cache)") - print(f"rendered in {taken}ms (warm cache)") - - from pip._vendor.rich.panel import Panel - - console = Console() - - sponsor_message = Table.grid(padding=1) - sponsor_message.add_column(style="green", justify="right") - sponsor_message.add_column(no_wrap=True) - - sponsor_message.add_row( - "Textualize", - "[u blue link=https://github.com/textualize]https://github.com/textualize", - ) - sponsor_message.add_row( - "Twitter", - "[u blue link=https://twitter.com/willmcgugan]https://twitter.com/willmcgugan", - ) - - intro_message = Text.from_markup( - """\ -We hope you enjoy using Rich! - -Rich is maintained with [red]:heart:[/] by [link=https://www.textualize.io]Textualize.io[/] - -- Will McGugan""" - ) - - message = Table.grid(padding=2) - message.add_column() - message.add_column(no_wrap=True) - message.add_row(intro_message, sponsor_message) - - console.print( - Panel.fit( - message, - box=box.ROUNDED, - padding=(1, 2), - title="[b red]Thanks for trying out Rich!", - border_style="bright_blue", - ), - justify="center", - ) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index ff076c44878b87faebc97e905ece2c24612d40a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7037 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 K3;s(~LH&OsmZS~< diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-312.pyc deleted file mode 100644 index d572c92ab8750b464b392a4e1b43bce3533e478f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10326 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-312.pyc deleted file mode 100644 index baafae7b58dd284dcb80fc6bfacb1ad8ac8b0f8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7843 zcmYk>3s9D276<V6gEUt%t*pG1*+mfxKkxzyh^Q#!E!5PkO^{1?5(Pid(%b|~yINLT zt~J%xwry(7lBQh-LtC}0n`>q>ZA~QA`jk!>c2P6-{PTT0e`Y*${LTM7&-1?D$NM_t z`<*&<4D_eusoUmMB?dt={^Eb)!lv~sZPo<kL22-8<oaN7Bq^?6V<ZTY;vEt(<bE#- z%7MECrA>bnmZ5(diFR6&;w6X=0;$vzj>sKnDBPpP!$X>sty=t|jp#dI4Q!=rY)9fP zOUMquP6PKg`ajS}m-d?Ip~bH;9#ClDs?g(Z_{4rBKC^^;0r-mGe}IDo-vSOBxO2|b z^%7{&6a^Uv4X@>SKs~{CfK~%{5<NZxKXQTI3+b-KLr=iv1bqOB1WABof|-CD2tERQ zNze?4(|Z{1;xf>8vU9jBz}W^eQbF=*WFq>`l$eaf3`<Bcpv1t{q3>cNt^sh4fo#Xf z4jS2w{#;5NK%$uvzo9>m5)u8NB~FXKxGeNtDKQd>QI?QAKt92Ez(fN#8U6XRMimkZ zD6tUz1(c{mVmT!m&|gT2?MUpjguD%S$H47I-;G8NAkl0IISyzua1s4V#=6^x%L4Qu z7y;;MAR`qd7kcW8>n5VVh!WF~m~IIv29y}M<>)WA5w{J{i(oeZ&kw&#pkMr0Z-O%b zml{a6g5*HM->9*Ge1dU+i3HOC(+P?JB?hhz{bja`YXDqM&<MDKU>Bf|fqbAKyP@I1 z4gi`70{v~0h!&s71Y{A61mqgHiRk;%F2zWcP@)cfq9xpWfPMzD7bE*<WIy^OOSn}1 zt&a6KkiiO)0S&Ju4=~BVy^Q`!8hHhY22030fZYV$^vNLIwS<ehA?UBNHC#F%nP3=T zfPpMfklUf*!D<0_608K=MX(C6hF~qA!NBc8AEjNA^?@WQTKp~p0qF$802u_s0oerC z0cH}+0u&J}0Mr<`<>*uB94nAmNr_eHQ!U}11PnBgKp&k_sKtdh=tg}GN}(2iE$8av zM!IV8Fc2`9U<zO=0iIA&P4Eg}Gr_BXtp;uv`oVOtcaivr5}%_VLWu-@s7WU+{$MKr zD-GN_^l3EGTOVq2nHE2i2<T_v2BJ@=kzq(=T0$<==b&`c60YHTq91A_ZaQF?fn0}? zSu|3FKEo2O7?5coWeQRO4L_G^z)}OZ41E@j)FZLY5)$YGTH>|%lMY5doJP`+$e=_P z`fN+MQGgK!G8ZG&HX^lvI)Y~be<yeWu#R8@;3Wh14f-6~<scG{5{J=`q{R0~9I=F4 zr7s&9q{ZK{G(bAR9>89LeSju{1Av1D?lAgMwyiq~7;PZGVC0yM$Toe0$uTYd947#6 z1PQ$rI&1NXet-c4MSv25J%AR19{RG8o?2pqg5Uqqn*``j-~fjVTnqYKO@||{6)?s? zPU`zfe$(O??W(U5IbVy1e85x#w+#JQTf;p9$Rl_LkZ&OC6=VZ6Jo;9^n*=)mI}O~w z(O+$AxP5?e1m6P28^{j|(h5Dbi~AA%1WUN%fQbYr0h0*Y>3cGEje&GjkOXMBXg~A? zmT(gQlL;mPrWnXn1(^m7*O-BRDkUC8Vhttg(O+u`*9e$qAU*ZfDi>+-ix!}tZV5LH zFvCE;*Egvg(c+&D%k)heyAFx)k<+9gZO{;E_0=kCwS>FK6M$BNKwpdUu@;|b0h}NR zQWTQ3_(Xp|G9cV#03e$ZBLR;QtOYy{2uGd(v{9m6szOwY-z63B0KsZNGeHZWm%bbQ zNN?>WkDvh1sNWc$2qr1q|D3^U?PV81<?{+LE&il6fIksD1$dgE1#rZ`#l4{8GwpM6 z?E%*lBmizOkUk317kcUjxvS9skrF$Q*l7uA0vs`LZRl^Lk-qCRk*vjEOCDe{K@ngn z;M7-JY5~hF;WnY4MT>4h;&n?%17NFx`x<>AjU=tt!~iY+9I1eT1VaF625vO^B3r{v z0L&&>3MeM12b37dMg@5V8h+_s1-wS^CZN&4ZAV{9YaBx2FeQFMUuFsS^#+BT2o3_u z2@V717)bD<F8a4mRKvR-98+jJei~e_6WR-p{HBS{TKu(i0dxn1YxD+0DUkx0LWyeu zHxbMM%q57lDHLh(i#7qiF>og%ksx-n9n3YwDa<vHMe&h9mT2)OjdWCq*W#fapgqA^ zfX)O%0T~8v1o{fv<!dCqv4mXFNg+{--(|zu3NLE$Ft)QoftC<lq>J|RXwjhxG8P(s zVU_{v2sQz>5WEg}gCICZAx?{5BN1>VK{8;lfvZM8pUzQ>M4csM3*b$HcL5(5xDU}+ z(i+ioHIb^tU+rM@Rg_3WBApW1=oeVReF2CWNHa#hwGj!<Q;2BsSDOjQGH^NQt7(m! zkf^YPQ~_!ThIUmLp~Wvc3Xp5y#-gvWMcpjGLIc@^k=JPC4fKmB(TK!0OUPS*e-Ugv zUtzNre~t#gR)R*rHiFLppA!taKp{hm{}_g&zlF{*0*M?-Y(RgjCEQDZ#RgK3k<B#n zD*7dqxcEX%T%yGv{W3rwf<(ZT1kr8^>012AFhB-DW_N`wE&f`v(cfm<y3v582C@$$ zpV)|e3iz*qYeN4g8j1AKL`N<D9D@Ku2{HlM1}+c%?X<>ZB&J(JW&&;?xEJsk!CwGt z2~sXnNYmoaF%&S|z>Pq^jJACkiGNr^)&uGZHUc&gYzAy0NWEAgO^d(D8R%<imn<ZP zTS7(v#u&If^mR0{8i|J}@hJM`mT+qTcNj=(FC96m#b18Q%>XSPQsye8Y4In$rc(Pm zX^jUJ<Y8#|JZ%Cr15UlP+*jyV&`1jsM=T*hmBP<=ogR_kZiSEUCs?J>L5qKB1@#KO zUN$JuUZxO~0?G-h04Fxu$de5UPigT-FaM8%Xz_3xU^&4Gz<mVk0WT4Z+N+SO#jg>3 zs*t9|LnffYz%4|-(r%Eu6L6P-Jb{s?ZA6{{{F5MPQfRNm@6rL#ji4vsQi96?R}l0C z^e0I9QXx%?U-Zxch3~a^*mF=}zZMU<`oBpsPD=>xj27+h#<hfBhYtbw5Ik^1;a&rI zNI@QlhX3pdeo%<h;-L#5lOP9>Pf!4uOi%<UBM4d*dTa5ECIf~Lqyv@`+zxnz;IDx9 z2tEXSM9>6iF>puG-$z&b3liB!PoKl(pue9IqZH&<OGq1F_>ZSYWW4q=iJ$;bZs3-n zUqy>Pio|1-cn<volsJLJH9y%dwc5*01NQ;?2Weyv5_>Hn9|Jxi_zrN0;3(i%f~KDp zzSH7Am$Qy3WN7h_1sFq+2e_4B3E+K#-GDZNs^bbZTKuB70+tZe0#*{N2E0H}57<Jm z4e%Dh9>9KrAcza(WLw<nZ3F$URfTwi$l3ZUrselvph-!QPZLIunJ}Sn#?`sk=1*N0 zwCe2+j@LxzRL(1l&YN9Ry(pSnS+a0m+5DR7XiZr~S$S;syyWT{DVbXqOD?UvWqw8F z?9#GWbWz#-MbQc=j#e$MnNvA`(16r|(Q2tFORkz-GIw@)S#`8Zs-lG&E3J%0V^T6F zT3Aw6QBin{l-A6t9#FOTc!#Wcm8A<S%CcjB)<Z<}Pjx3PE%A{^<cIb-XLgROONc$J F@_+FUuHXOw diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-312.pyc deleted file mode 100644 index b74e9227650d61ab9ceeb30a7bca584eb13d5a97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 205998 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%0AEe?rp>Rw0%(2;f~5{2 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-312.pyc deleted file mode 100644 index 9d14f3a10e1cce45cdfe777f21bd638ee645ad71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1751 zcmZ8hO>7fK6rTNGJBgDx6hhJjC(x30?JR9+i)aL?C{h7I)I_DiqOvwS6US!PYt60` zk~)$PNCXaTI8+G|qExC>P%4$4%BfP%z1U49%=XYqRS%qM8l<9}`o{JWn$hmO@BQq& znQz{{pF29j2!?t4)7cRbp+A`tj8F?~-UqOXFv6ULY%aywe2TY)l)y0?Z;2@p3s|%y zTTaOwB0N#{!WSu(a74{;M490mdI<CoQ8M6fS;Cm-5fO8{gOuA6OY2-y%k^$s12n^9 znJ8ExLNgauNf^W0Gb#>Wky0HCyw>)Z1#5z@o-i!Sn6`*7oi#jj)>kJAUe?JQ*15+l zg~s{P$+HuuPc06O938nh6+f<x96t)r#iTYuY$um3dE~OEX~&OhzQ~~8iOGynw7m43 zL9<5Q^TX*zVA?HC`!Xe7k>*Vy*epn(7BPMEN0_ckSLLh9D)Im~M~)BBw!AK54)a*J z#V-jZA;(tOF|I2mjz+;J?Qnov;;^{hS~U;&x`ZW94&ppDK<r|$ysgiO%hIyEtjq{l zxzfHQ@~Fg@#1abDnnIeo*gr`MmSK`u<IpkF!6cT=#~3xEMRv@;AAHu5pKCm2$$Y61 z>jSXaCD1l7nyniKh!8tO54@WzFnuAcq7urz=m#qs>rH_!LY^gV3CIZ{9$k}4eC|cU zTTwxDP)iUgmxOE2sab@$DYPGX&*?pYsKfz%CVv4u^XRg00nKw7cMd8^&QPaVaDB;g z<_Y!HGi2c;r4H2;+6fE!;bsvqJ_4LKY~m|Hne5t8H|a)bC_}tv{rGJRwxV4H){Ma@ zm&;po`mAFU9k_Gn^!FXJXp_9>>K?I3h8lL#^|IzALX+5;&s&ax3DxIFeonWt(|TdS zn|1PUj=uhe?q)rbEEwh`BST!hkS*wG2*VE5Y1W+8TUAV(*E?ER@Wa?ix75Yq9quv9 zF%8Q-Ho6_N2e#~9fazHo)#CbhiF=9l(W-iIIlOZEj#B5P(BPw<m)BAc2a?r+<i>!$ z(R1kgcWYgHDtnWg0)II21o68fb;Nf>o;{UOSMNWF3k}wK27YNDs0#qMT*mb3zIV_M zZSP6KPa+4iCQ-(f-<D1Te{e)Qo%RKQlwGSYxE|HiMj2Ap(<p0sz8cU>`<adHoU%?s z*)QR;nq}O_#>dBLA1Hq0|EH%hFt)?%reWGDqo?htd-ubxp=#Gq`BbepcK1lN^Kkit zTC{I9aU)Sa^Jsix?Z}s7H^=UFK8XI>KUVqZ<BHf@7Zqvn)+=8NH{*2#@Y|k$nRpUK z?YmcUcMfc{9ju54Hz5VmBEIY`6tejYWtHAI8)biu&r{;Jx3<SB%5Bg=2bnLDo+MKq zg|C{;ub~&GpZCPh^hws@ri#;N36u%;71OZ`S?HDmG_%Gj?;$$G5;7XL)G^z^MT;Dx zuYt;bQ1=>4a5)_JJ4#eh;x`of3+=1RD7t6Gz0p^W)VlYs9jo-k@1Cgi>DBH-V2Spv zoddQ1(Ea_D{<o^px67UNFnTp!8&2FA{wDraypsHIV|eo6@cHWS`6tRQZlo6Os0$$f dcxhnGyzxn00t`92V|C`Ot4Iz#4FPIw^*@Y_wv+$> diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-312.pyc deleted file mode 100644 index 8600b31a0a84d9cd5144e73a88e4ff8865f9b54c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2343 zcmc&$OK%%D5SDDWbp@nI;~=>*+n}~kt*AI@8mN*{$B#6CU$ESu@kO9_DJ^a8a!Ydc zu%KgqLvOwJxAc<U3SavN4CIzmhumFBaBLul6y;(0m?3B8o8ia(^VY3W0h;&wD0s41 zDEwn4c`Igvw|8OiTfr|J7yROJ(Vsh>^XHG}hYRIT$Ty(Wc(A#@arF9N3k5plYo$g& zi4R>!H9=lLq@ud%{B*SKK67AM=^>|UrIGDbK&c*=PJ};1qfrS#^8^>Njz%3JX;+FQ z^2gs>!3pus(gioynJ$6OcwB1W?DPiCoXA`<2G;B;jaX7-wVF;xMB43;knv%CmquJv zmN)4sd6l3Ri4@uukyx&HB2t1ARaxE;iDXowJ=$NcgdkKg@u;)b@Ptp-M&>(iU^{7G zFayEj)G)YXp&`G13V5kr7kO}^YC4j6fvc$uSwy&ldW`m;i$T+=p&A<XnXiK}8U>Vf z13h-oAmkBj3bc;v829`AYX5On$Sz*3)oK`y1$+&JjR&raUeJh2qN$JiOb6%?EJ1>F ztg@||4s=2|JEv79kn3h!GXU*5KV$%TG*6B>eHJz3Y%@vF288aUSuz?*dUeEwNBD}B z8?k#xy9p=KDOc>-MlWxP1jXDp&yP-3)#D=ZJD^Xio(M5HB?HXaiNYPQXCTH;tE<%- z?u$-m6&ojJja2QjQwCpUNc4)6%|E*7>n&d~?3Aa_Snw>ybrc!r_!U{-CcBQF)M}{& z%G%)cQFHNJaR0wegt72HWMN|V15<DUZr+f9?`9HUGf*8R5&I>fZRU?%s4B?@H(ra$ zt*D?0QCzX3;N}6%8G>wQH#{CpbvTQto34YFnO&!4%c(~sBfw;oDD4sj<2vdjoV%7l zCROx)5SnTJ{?$$$d-QD98*3*o&1*o*NE8`QvWkYfwH7m?Ppf!B&{ov&X-8$e<8c-r z5Fje%H=S9ejbKWVsWwoYq@G5GDIGMlUmGlJ&Dpe_(x-z`5N9P5LdBVJoLf)l7H*Y$ zoI07t;ssKKG?R3Zmhes(j%hk}$boNHrXCE&6*Qd<$7Kh2AEJpN&Zc8n@2eXlEoWRl zn!a(lN0ZlMc5_;g`KEN1N6^i~gaKrr2i^G>_Cc7`>G`64ia@qkUbtA=*xzgI?`*Yy zJlfr9Z|@)Ot{+|8$roF%UgT@H+v#NQsJ*?u`*P>?#gbjw*jaD2wp#6j!>#R?KmSp9 zYyKtP^>6^_VQ^0M@TTyRkVaZzO*y>uBy^Q#-WipyFZ%Ep6Q4@lqfyTgKaPhw5Ygl6 zqgAY!rhuV$M!Hntn8mmaYQB)z#DLp$5DTf>Dfd_7;k(5~DEtKeI^^fzhWW2i58-n; qUn~|c=f1qZ@TRbI`SrK=puck&6$^JCzA4=P`yTqMup~bN#eV@Uv(aq; diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-312.pyc deleted file mode 100644 index f26ee6a2a8fae6e4cd6db6a1d29d42a0b931571d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 559 zcmZWmv2NQi5G5&AX`DDnGq^yqc-3GLZI=v1(E?cl6#f7&hAgr+5s4Cxv=bpMkRkns zb_%iv`ILM?1$Zcm4&4kmlcyYQrx|hp@7|Gj?;gp!X0t)i(yQ~)CMD#LPaci0!Mu&& z2a!b5jO4UODUnQ38A$$x%NLit$0{C$|9p8w>)?~AYNpFN1m(tHx+xO>H-;#{H9tg$ zq*O9b`puJi%n&n582L(X*G<ceJ!KV%f-ZO>oVKBjbxD>*LH)YaW!#@ABMXQ@r=z$; z1+Ib(EUovSojOQTHAvEvC;)%gRb9hDf6ZyV(004M05K|ZCGy1Ci8w0KajuNB!l_IR zA;~+|>GVWFM;50hD-x+dpp1#g^gxuA8x`hV{N}B&+Nn;71Cyb$0`-WsTH)1-zB+Tt zSY4R7tm>90>g!ee(-CZ=Ca>1+p}Qb|xtQ{gzxmeX@h`sf{qr1m@qOyhRi!pV@K;#& v+z@DbyoGM@@_k;&ai%`NE~fr}>;bx2Kq;M))+`L^tDkm8FkHKPAC}Dz{&<k; diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-312.pyc deleted file mode 100644 index 7e9092bdf2fc33863a50f722be926d2326a7697c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 877 zcmZWnzi-n(6n<yB&X2ZIC=AWi6HpOLO)OwR6#`WhP?iP(OM_74+Ly%C_F3mk+LRy_ ziGdX{R4hykp#B4l>?}wuV2OzVAu$Bn0d?Y?(-tJ&@btcS@4fr(yZ3&2x(I0Q%ZJ@L z9pI}1N2ZMfvRA=i2R!gd03m4-qGB!3LcOVnM$<q%;ptC|=ET6T%<rnrBI%?PMO-@4 z=TTy5sa9{K`D;!PIBNlO$#{0=C(z^FWbYORJ0OqGhIpf=?c$lTM`TDI=L?|0knE0A za0dq38IXre0nUQZ39Mpv12*+l*dUg^_2VX!wCx8h;uVXw1rMo{;RWirF7HLsk2<u? z1&uiu!GQW<9I%i@l6hHOHSpIN<!cX^E0bEWNYR!=Ct1uQh1B#`R#mAttVO!?U*BQd zZ6<pn`lr*6BpuQf9<fDwx67ztNiUF;x3dWmr+%9{eaFvaTcAi%)v7FynaI?oZ9HaP zEn}0K<Cm_W<hc$*{iR3?*Ed}jtDnGZ;h3z*p^S+VkJ1BfcX`O{(2+^sUgmC336R*5 z1*{{Su$oBUU1y@|@r@|pj>m-EXHnk{{53ls$S#jA*3MtB6JN4w?6~Vrhb4CG$94<L zJT7eEyIs3AW><>`X%X2SLNSFLOhx7@x^38>fr|Zl@V4@9`Qy3z_Ki=u=?}T`NHYtw zpHG&bUwYaYO~F*@_x>c5%D=!U%>K;7so7Bhqk}{ZduEp5MPXilMdtMt%MfbIw{rEy zy+n%psVTB=*ed>2-!ju;tJUt|_pnw=sGUnqIf!vJgn>Y)EzNkofjtaCOrkr;Uk<s~ f3)mGggHUa5QbIS<2_awL^f#E>H)lvmoWSHCha2u5 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-312.pyc deleted file mode 100644 index 6e3b57a552052eceea337c99902cd69bb5a33822..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12099 zcmb6<YiwNAnfK0}_uHO_-}a3iJD$WDLrl^pB%#J3goGrJn5sC0$z<*wd(1q{z1K-* zxI;sWw39Sj9B4PDgsoAL>IknIR%qpwsuf$h64L$|V}mDGMx-s;Eq_+CIJ*n!pZ&gb z=gu7)!?JfY=lPx2ch2`b=U-heI|X0tZ=W0cq?@Atgc<EKR}!lSXo|W<aTG@<sT4gz z)0j3S4I>7KnWQ1bj4&zVh%sdvF{R8S=9Fc`lCq9i37j!$OW8;4DaVK-<s5OQTqCZO zd&HgcjCfMs5ih`)ICHWtRX<Xn@{RaN-jejE0wV#EwkCtAhLHx6wj~==O(RVtZBI6* zT1Hw(+L3HcwT-lqv@_YB>KN%DX;+d>Z5r8>>Ky5WyqoXhJbYK&$a!Bhj%+qi4^v#- zixgMSH@(HEYaQw4e7u+M;XS;)35wzd455{q-@^IT9JCKW`(A+Tff@(jMIen_5K2R& zv_UI{`mJ#@*9bM+vW8I8XE;oVRy@(OVkS8$@sUJoA|pu0LT1GpOY+e)mx(FnQC`B> z0&zT%<P}Roj3uL@s8|zXD#J}ekxfjDrlZoNz=tdfGnmdQ_MuEN$;YHbCaqW>k$53` z7T~PMC$J=%R7}H@6Hs6r&Q9=(>4`Lyeg+#$g$#=6VIea)p}0@*X-;j2Krl}~FUF!1 zd?c1hOF||IF~^HI{}cR#a40c4mV`eH1x3!olM`7;9!*?Gq#<v5ESlz%kT5?c@RF3p zqG6m8jAtC?FGz|NLoyqNtQx>3g>($(q<y$8_+PyTf@_pajn~#zpg8)iO6gMoo2T=J zyg{Z<!oqT)hk1#W#&|ZK5JZWchzikBAv!U}#)V9Zjj}MVC<%%5XgFuE+hK|}0Fe@i zu@ED)!T_X1ZKTi<5hug4?A?j}u}q5ZPemp1T>pVgY%;~CC9z-PlRONN+Ad0o*fYGa zoy(k0Co@sNYX3PteXc*5INJ|s8q1^y!uRgz7ZVb{eIgorCOXQC{S%3a{s@3^8KGZD z#K!s~iL^KYTN<9oD&7cLL!`O}p$q0x2Y(Ugd6BvuY`T`ZnwmMd7~J;4@r#cXo}JoM za`=lz|0>i|F$}b?p^{krCrDhQcxr^^C?IEggy9Sv13zOWG(yUB-Nu=DBWK}FyqOS$ zmA7y<_}k&{fWH&|F8I6Q?}5LUGsJ^HT;>rgY3b!{KsNP226oQNJK_e;2Wcng=UtV0 z6K^AAWG2Mr1}G2jB_#$zSan<j%)kpXa8<|+iK-rnO0hhmqA7X_wr7wPs;8KhGHeBf zY&4x^A0wD&kDnb!q}uJUlkA`{D()dE%w^7wv%Nq~p*`$i8gl?x(@VGt2!|xev%PS7 z`q)f`#GuhIDTZOWggB9mX4%X+UZ~DN;Kj+L1PuiCSSHQ0lOoSbKxtw203VM+m55_u zl|IlIpPXQO&t@{oH3OX-%baK9lgT7Y03;wKR*1q;7vQ`{)9m;pocDF7e(f*^qe-!5 zoD>hIk`p%=>Y+4}t+ogt4K@>JW6@+1i^Xs36zOY&9tV?Rrm{^)f~-n|>$(~iCTpfQ zAtcU4CBXQ`n9!=D5|Hy*V5~SSKblCVfw<Z832BU-MBXOGGQcsvdCmmz>jtVBK$MVI zXx(#}NyL&q$~O)o0@L4U2rRA{BAT2Si=O3ynE<-8YkORaAE@7`KRhK^rT4kElXZvS zTr@ek5sp<B&H|Rx5~~8i8Bob%ZHM}-jvX8h*%T8Y6vc?ARIyYJnPS9)p;#)rrkFW` zHpPf&Q5cx8Vj`m`42&Uc0VXB%Vi3Y$D+b#z=)+(;24M{PF=&GzW`F=c8~l-F<A3$v zAh<?JRSEJI<nfcKNVQC+A*Z#bWWxnotfNuxSX9{BP_D`yXk*lBWSd~-=nHh-2!C_l zA~R5Hs@57IrzuvHY=Zs`&_BXdN07~xQVWz?t1U5y>mi?Pg&a}cFe}?3=TK`XDhrbD z*l@@x1fWE5jOk)pKryN~BB|&ze1vSwx4|u<HROQJ;gfOF!?$Tv-4GGyg{-ym37t3x zYXoFlLW)Fk-U{;$YbChbVitmn)SXtUb=zV~U%|L!Z7lhM1>+TKDbV~uU|^bCZVxZC zhiApb_5moi-*UK1q3uQI_QJyuOpVT%Oa4Zvu$3CxA#y_Q<wvIvR7yT*=$+{y#lcpH z92#t(xnTTjyRaEXubv@DQ@DTR49!BK_6+G~KnzL<LB5(&hotX)^}GlUN#E^iY1*fk zO8QP$>oqM0v>R%?y4%{Aa0(1n2u5Z=|Dkh%qp;H~=sBu*Vac9{LuLVo2aOXb4Vk!r zr%Yjh4J$^JN5T%shm68~5UFRzMp{M?!mcJ!;)r<aabL-%3ImYK`KtS=pRxy`LOcWk zY^jy1Yn*0&=6usS>wDAnPUC#nJ8gFu%H^G6t{nQb&i}LF>8@9ve5Ji?p=|YKI~8nR z4s<UBx@QuLfqM$}lBcO?ZBlorO1024(iGXD2}soL(0G-ap`!BD?8%0dt#O8*BIQ>p zP-_ha0nHian745C@ByZc$8t^(Eg;FyW&{v3Hw*#}E1-G?iX<Ls#i>>S4zsAzPeeHm zgh$9EpfaW~@q{GQW6Bay6&TVgM3YSraj7bnk#tZwTuVA?$)f-zBIRAARy_WfvX`<e z&bq1luI;_L_m%xcXJ@HCcx~&|t)-?dC4ciBo5^c0Qzn~w-W6jyn&M;CGYq}p$_Y*l zu$XJWOm*H_bJnY;PCI=Zor8vX&?56jXrrIxDrDX$xd4QGGR+z1Om9_oDQ}XEf?qa` zd$f8z=FGD3HR|<hFN7~6hSz;Eqs=65mVpzCE}D{j8jx(@EI^-?b>=M+a!K-y2ep(Q z>og@WoHcJvH`l;7>Tp_W4ZIED4V*o1)mJ;-tU>CrY<-R59IqQVr)(WZ@wM*b9GpwT z53WCMkS&}MLUVN$HraNP>Y}8|iKM8_lwbmr*N|tPq^|snRFybT&d}78RF*kUU4Xjt zG_<P95gjgW&>*jTq(O$<xem0aqHNXnWaFU9MytwT_%6LCXX*`y!=Yn2Z$<MCYh30A zSb*g4=bXtz`Wetpll-3ke#IGyJUbap;_-__6ce#@bGE3MO~;UNDGUU6X*OroIutem zhC&|UyATO@ycGNQQE_=l5Hf;dLz9vu1zfgbIet>jA?g(i&LELfSsbyjQ8fY!TQwn6 z#^?ikI|C*$Xm@;kGF`E$!2st|z%3Pvz=Lid<3o0pLk{6Qh-kG(s;E&sVrEi^@nE(k zd0d;~(hw0LS$7pQg1l6*YDiGb69OMkTu|ItqW37`J|VYNKUI*rBj6;^VRFGL`(0B$ z3{6FFf&gbI8%?&xm8RC~PtJ(1J-yh}H!ChQ?I;{BJE^VVf~RaS+Ui!?yJuprB@4&z z*r}$r>EUAN{-wsf1=lS{bIIAX?A)~A+%)s(&5q(dgT>AVmz+bTrncp#&_YvacI#r( z&Vu{4ui*pVzU$wa8JKm?8y8#l6|8s6l+*Xp1D76{9$0d8lme}n4z9TT%dXx9SMRKE z$+f){U@slK4I=p9r%i3YY<sn><P8=sOg&q8YWfE=@n5IkNZ&j;-?iAYzu5givE_S3 z=U~YdC^m$O&aEY9^Qy(zY%jQB72fuuwe5>LLp0@W{+yz1n@UaW<-;qUM$9zc@->th zi2riO36kh~Q_<7)Ic2cb{lV!in;^a`_5!Yc)G$;>U3U!iQSa3`hC<AH?N$tXX$<>3 zL;IQc_R$co@mAnb?1KO5pW)#BRp1Ck1J~qe35wKDs>&jrQY$VdLk(1wT6OrU>xp^M zm<Nuj*KoBhtMtFV|G2Rbh|`?uMJLf7HjrtT15#C|xD=>zP)6rnHGCDc*m1YEDm@lA z$;<)jB~#2W3i{J&;HSXPP2(HzXwIySAkbF=vgxYfN}~~E2EbF}C<fPk|Bs$6U)yu7 z)Tzpd98eX=iQ0KP)p;90qmoTpZ*c?6(G7F7kU9F-O%Sp|y=)n;N)x?arsu3$FCd9D z-wQRqf&AcXoPExrar?X#Btnbcla}I~b1uC{fI$z?x-V}7Ot!Bpglyg}A^RkszRyA{ zK;zk6_i=83(PXnjcD!Jf9e+b#qtTtJ#?Wr_x<-%{?tyYtd)9sWh<T^%e4$MWX#ld5 z^Ul>($8rJo?Q(UMd6(?^%D7v#wt6fKN@x#~PajL%wb7czZ4#O`>tR{xUaeF@jh1|u z0$e@k<NR|0P3z-=a}C;T*UijwfSRIDgFtu+Fqb!x(4F__YaPE&>sOEE|C>?_Tw|K% zn!tP3tc{%a%I+8T$lmeq=sjsEO^eOf$#vtqwNgFiTJ$pn*tW@ah;!+F4MKKn_0_m? z5@_nmvpPm)k5(_d0lU6eYp=&5edW@|=L=Ttsjj77uD=){Gx6$}mp!t5u2qB4Vwl0- zf6d7o-uUF{v&{Qs-wT6s{rCg=47C*3Ci~7&f`MxTOt)+6qA7A3eOf;6m;D=Jv_pdc z-E_nLWxo!gu2inq*EB_6Y5TV82iO541+@P?ZSHz3m}IMZCbJ&dEVR~~ya#nCEyc02 z88pyMuUC1Z);8;jfp;Qi$eYeX_|??kG3V(}XRdN@p!tIoBY3q_sv`#N7VSgfglhO| z90GLa6T+ZL2#Tt1T<C&ErpFnrxgP5d|M9AEt=DSDK5oD(fMcq%$OuRvsDBEH3B{Dm zoQF#bqwq8qGSBc?#T?;Ldn7)jwPvkiN3T=_*Cgh;s_K<$q=ok;GoaRq`@=fW^U$e? z>flAH)U{>7$rgsLc1-n5cdz(cr=NJ`_{_;)Kl#R!v*NFwUhdw#(7k)H`~ISDZ_&Az zShb1`6;h%iu2C*<r38E5hs4imG{-=-sN(k$I0dwWgewQNzCx_T7;xulFtq5nA!c|I z+U4oz;etes&(l=}-%wHTH76=Ms?l%GUx@L<#~nTvG6;{s1QgptS{c~4JeHVL1meOg z*CZEJ71b$5<2<UVxUgLJ*JH2->_^xOa>*}HVP#z1rN-9lqcgGD-HYuziw(Pq-d$g; z_*y}u!>YDvX)6Drck^FBvvYOd6;U|<*i}bewe>Q;V7i#s>0ahnrd~!dfbERZ56tSb z5DEJrI0#EZPN10i3lnewr<er1)Pl<(3p&vg@vK6Dd0#OQ!sy5p4g&n}XQ+>VhU_lH zD6Ry!m(x;YbTR=~WQsi%y$}Jte^eS%)2fR*=hwO+?#+s~0A{lvddc~;N<>sx^@-{O zV<B8=8Q6U}w+6_gg&^i&aP^*uYyotK{+qkBT{wc>I<#7Fy5_8>&a$y=G<`Z3J=K5u zRN}Pm8txTCY&s*cA~=oH;ZyxkcVaTlo;rK_R0{5=(o*zvr6*|FdkR6%)|7-!^`AXW z3_|rjL=1;I1ymAMI}MSg7}0yLno10p5EKSbM7+2_Wav#7(NnMbc8OaTuX+^YsF2_k zJNQfB{xLb3N-Gvj3z_p|orJQ5r*I%t2$Xta5rJU}mva)&MPStentrN#7#&~4-9_9k z0;*ubNo-~W_f1wfPLg2X3B=c|n4=RDaGj*sU^EzgGA$_%ygLLJs_@L@L@20QfE;#{ zAZ>w}h>AnXNMO1Vo<UBU;sJC;2xcqYm`J7KAW=jjZn)>L8{9k9sx{)=6)Ob9LKMcZ z22~ct3Ztl2qvd>5z&j4bqZ@%LG$MmsVG?|c=-jASj%%ausm{AWsLy#GsT`z=4+<wF z?gtk9#h(c!nhmyn*PnQEV2+vj?yHe9*iHN13A`iy_T<g%!o7p5m@ivRw(d8F(6Q7# z_s~0C?}#^hZyf(G%$D7h$M@3MrLh9D;;Ek+_{oKWaV6L^z4?_y!BK*$=Po}79P=aJ zf$5=H@i))kcz&Myuz%>~p`!0V;Q#~(BVU#Y%up33_F?~n2s4B*L#5{KIcE02TegMf zdkdb@&fOn*_sqtox~|GILyHZ)AJm14-aQ2q1SN;(rQMfzmz;Gk9lmsUdQai-lC$U2 zV9T}ftK+l5dDBvGKTON&Teh|@SlegL7p?6}*8Wm`+j4#PLVb6^QUc#(uxBCIQ*eCh z@J$U}*#}%|xpCV<<F?rcZ!(LG_Z1!~c^ZqJ&81++%brrO@n!4n%Amf6W#85X-`3fI zMPGjbS61|Nth98@7-x?ywcI~tz17k)b78UNo+)c7*#5G++IY|9J=f3Ah}Y%03-ioe z{`c1ReZP0D)HkengHz({=J_4(cP@F4mf8mHm>8e?bBb}f%T~%4xP0h#SMMst+78nT z&JGYs?Ni;;ft7}qYx%4B+x~{q_IrNw^o^(I4=imTT=0k9eZFjB>gu6sU1-%|Zgdw8 z!S;CrMGsqQ?)>HUSGT{`KV>O-8?Je-dS*OJ-g|C&8>TI9w9F0P?0)Oi;-=k8fMIXr zr=Ess)0H2VU>x~nx#VxX-PyC;xpSd&=grvs&c)8bDNo7QS@dna<!_lj^k#haiFX}K zJ&%6qKYAOQWM9sfI=YrSb}e-5x;eSnv2WT~YUwDpY%8^HTW;O4(7I#(zIX5Y$Gvag z_x{PH*2iykZlC2AI|rtRO06BgJo4(1S=UnQt}5)!fu+{(`~k<A$$aGB^#_=+_068y z!2FS=&O;x0A1M#gh@SF;H05kqcCa5fSlI1FXWK1T>q>oaxxRCu9(<_H(+?Dzx0NZn z?{ON!x)by&1E^jlsAed4+n1joF;M=8=r8~18~XB(-aTK6sC@i*aPQF_^gllkJlbXa zUC@YOb3K&&t}l4B*Z3Y|#L(i0lJ{Ebj&3);*LT<q8O5SrvqjciNT61P|J9#CQ0wm2 zuO7hAH(aE%^hU1QZ_=BHgP`hyfbJ`w=-AMeYtY>Wy7Ln?ujp?<Ik9WJ=AjFc5XHN6 zc#HuIO%;cDkqmd$>H_=VdNC8@MUhQ_k1@@`1u?z{!K{88J`Bw(V0iNi?^48s2-oI` zG)tb(VBzG1HVS##u?1^UHb?PUM_+YDQuG;w&ZLuB7(!(4UGqRB5ogcfg%^?cXV`>D zL?hmA>OJ5j)dw=9gUTZrm=tILmDdHh{IxF(u%xo1+Dik(iCTo$|DY&o^RHkD1x`(W zCse%Xj~1{??U~OhXmffG>7arqp3@PoKRtl;rQwxAbtle8MUdTa4XfiC9wiB=bqc7s z3uiDu*BE(sBA|)|njflY!W9fq+-T2ZREZ)(Nv^pnQP3Z`Mk<%E#SjE=E7VK@`x^bp z4+}=%%7wipU&9J84&zUrU-on@c)Aun-B1JEKYKa5;_I3@u;>dF4y<@E<p~w7A)-2m ze0Vuh@gv(K5%sAQsC<WD5V%)CaSA!qL<GEl5YV+EOk%JT1EM9M$*<}LXez0?3sEk> zD?|yXfeR=q1zg<?ij1o+w+BlxKnITqUUuq5>OT!GleOGKb%)^E67<wkpb5i<R!sOC zL4bVT)MRS8?E>E;#K3L6jnmcz&!(~svv!b|We295RDH1Q!W7ETvIkRMEUUv*JyjPd z`!MCl+5o14l)Jv%fT>2x>o4Ol<z~w6UTwkDE~}||S}ao#%}A>lmHlRueY$&<f~f56 zHnq<Tlqra2Pm<{759YbIpI*h1@-g}pZE{aH&V(15?p>uYQ_dNDrmeGGWeTF3z4HTa zZ@+^{6+Z+uXc&aQV$u*Mb{MMGFflMqG-C$X4#JQROdLQfetD|)4iE3+w7U>sJxuOc zg+>S+96fP-4Wj{uK<*d_F#rduAwS>)K=UjRM?wNHxY@vGcVRp`DIo)A=PHa1+P-Bh zDxy9vpj(9)M4)sN%LnIIxv2BwiLa14-l~e&hwyU%_z(Dth?I-erw&krrfo}(PVkR= ze4rF1Ks!<kXLc+)dWyy#g2XkL!y`;ECqZH@<}?g}AC|88VLJd{wPFAaK^<RU`7<>b z2H$dR-Rlf^JvSNA2LJ|R#RmWeW5|>%6HfYV5X~ZQ!KX@Stt8?J;7CZM;<w)b^{LiF z7osV6!dUZM>&$xeMxr8KQUhZbdk>#He(V5`+*k;mfj2-f0ac{1XHIPy7c=QFr`CpR zAh-0fTh2}<l5q7ShSlD;oIXRAD!c^97Sa&hrNe}$faQqWsU84>YS)->t0N*B-<5lD zrDLOmP%~5ERRI1U_-l9M^;8gOX)zG~ZxiD*-*(pBVc_m$YUgy{tYOiyt!VF?9h@7z z$<IIi{)xr#W5w-{e_%cFIRmg|iZPkL1g+0$7LjfLbn{N5(t^m(l1ny%{fK%R$sTO1 zRp3$nx?^?P3dad_3z<GgfnyI|`DSS&1rPC<+|@Nl;tWbl5S=Q8jV9n_V@1qq6v+01 zgW)UW*SDVjLM)IQ2x^d$q%SfGS=0Ixg?a$Wav*tCjtw6K!bJ3ftinYJzkoookv$^o zM=ApGNm#fNOo$r6!f269T*Z{|Ish4gvPJY(gS2u}!JRixE(UhP&5^0GV8dsYjRPMz z2Jmvp1Vv@I>#8GU8|qU)62&L+r7rLf98P!~1Kb@|yqYnk+ogDmq?lobaEMh|h4(T7 z5kEv~5u4hBWnKiepc0gUM;v%<LIe~k!uPsFN~;ECfPjvxZ*&DT1{D){JNTsf`~a^U z;gK$}hvCf@u|`$n8}BAn$w;InxpVEpk&u5WW|c%#K1gT*k*&&9#2R6ksu1Xe>|N_# zRVeQlW+98rQv3%9z;8p-A5%SlqTHWQN0zB0pHPRFslyA@;eV&LeoTcvrg}f7HhoMr zeoQq(_zA_9%?urw26+R~Oc&_hbl{G2n4z~8l6NSK%W1Qj-ZIV49GpFH(|6;M;^v(T z?Yqhp6wdE_*Z;2gZqvg3M?l=sTgvrz+B_R9QxM%eJTJa|d=-=BW;<P1vU$o3#^LYI S`)*`N`nJh-#{^|$UH=P)>xsz# diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-312.pyc deleted file mode 100644 index dc9fa65ebbbc6c5ce19eb1e161efc970ab05d46e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4169 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 H$}#P~wq3L* diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-312.pyc deleted file mode 100644 index 26547ef6a92e4f76b273ce77f874f4535bb21485..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1907 zcmbW1UrZcD7{F(CcJD9T0i{(6g*CJ_2Zgo%i#E^;T1hL0#CX&cqnG7&?oZgez0U3( zoIMDkKAcIT*O*u&#_(8TH0O&_HL-p6g+D&v#>5zX(6_VjKpG$XW)BL9G{sIbv)_E* zw=?t2@B8M*`g$LN7W?c<@+T3Y-}z*xdA5a(PeHhWG^Al2rST|E3!_4sj1r6lM2RMR zj%%KyqDCmDVhc<)5hQ_1RE!IJ&U;+cr1!*8*F(Kr;N{-Oi?2rZtmXzkPr(!N{>2Xv zBDUv(MVUILQ(KDUvhZ<73R!wlWj2o3uDq(}sA;<xwQ?*I+deh_6+!H%6Z*z93_}P* zyw-ht5$!}cg}ulk;Nr9*zONTFp(w<KkMRwRQ4ya*Z^P|P2^!heUh|2lfIE@J_j1~C z#NZAufp!8-l1pd;e?ca2NPPE2Ck%_qYDSY2Gy^g5iEQzh<cXA(gh^ai6LQ>Oay-RM zOLl_m9gYkx5?f5cHP~W?PFi;T8<vr+t(P(~A;R3Sx9#U1(d`S7YF{3gEX()OO43ME zC9PU!UO8vPa%q~eOvR!)O)xdxV_K=$IAuMWF_F;?RijMF(@b8`Q)5cDU?q*rGrgyu zR!rEUC#%NB)dV$_Y$~fn!A&!m!cwuM64ebO+nX)eJ}yL^AXp<D!3EvC2*aOfYX<$% zbfldB=+w+mRUlIEmxku@TWbwZl%%Q)`GaMt)V(SmUT<u>i?GyMlGX!<$|EIx&2#i` z0*b9oH>zvlw&2g6KowNMf6O*mdbX|~f9UT;^UeMEOYa%-jnI#8;WOl0(vSDgi&^;V zQS!pc1*owpsFU4XD3U4RTAhgY=EnhZ<AoZ_1LlUV?xx0Igz;hziB1Zz0LXSA%V<7j z<jh(wuplT+o}iEjGHc*2UWX4~h&98!iF-t0*bh(3vAOZJmab9&@H8E}iv+2o2IZaQ zK<BEbbG@bg{XkU$b&X$O+1I`%wr_3vAH*pPoSs7SN5Z(`?IX8@F#Znrk?%?P0h~U7 zlRXM2O_(AMt9oE17KuZK)aqFyU=x8@P()zi9Jeh8WcJekVpgkXUiy3KMFwm1q+NRK z5Cm&WwbF6ONuc25w$TN5ODpOCd<^Uz(9JXq4+B`=IP;2AT4aaf$lUO9plj9Bwcc<T zxH>T1V6A$PzoFb*o?iBySQAfdZ3h2~^Em7{TQ?v9&*#y68wg)}2L$qi0MZ?dLA)an zkcUHF+hrB9sZ4_L7m4v~WIQm&Uj|zoGYs8%D4cX;Jfuam0V8tq^`56MZD={2o@Kn! z`6F&#g#oG`<6lwt3hMq%^p{?~`q~Vxy1clxJh_0cU#TJx7bYuGMOzxEB)$r)JQ?2L zy6WRT+)+->UA{hEMIbIDZ{{kIrPGx+7pGTFp55TO>d`uUa_;=X>z@o&5r{X>S4Nhe Yz1@8K@>2iGa~D=ly}HTOtQF4jFZXEEH2?qr diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-312.pyc deleted file mode 100644 index 5d421fb38603795964d7f1b3c6696183284798c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3642 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-312.pyc deleted file mode 100644 index f7980a5a793c244839652c01f417c8387dbff84c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5182 zcmZ9QPiz!r7{+IJ%bysLVnK{xJQ$T#+7a--h!$F*N-9bf!=+ie6WXxt*4d>>yl~Ta zHsZmMXkudZU}8La(1Tv|fEP`gaMHx=#aKAWMc?O{@11$RHsRTq-@M=Z`@ZRv(D`}W zw%Zc>n!Eb${FOaP@(2FnUqhj|dD4n2NjquRI>}<~Y^|2mldN_=Y1coieN`*E&ej8K z2x|m3By8x?rsn1WRyAvDTTZn)S-+n(hntPT?Z$FQ83ul|daxaFpM`-D)Sn{mD8LV> zKS9_Z>&UmEeiE@pFnAyJZp6n0cn0-Hi0cLT#Xj=8JXRZn71VconD#HL2PY73SQtR} z;3o^;>AwK$h|evo<5|@2ApR@BxAsx&?rH&AxcD3BLj|~jdY?ygc(phU7cp$?m$-~G z22j)w3qU=1T|n8L<C5K?vfBYWNVP-3BbZl)&A5Lf;Kh=9hk|lB7kfv!&OlkSV>MVf z1F<i$hbC|G5QEFuKzTG<%zD(R0oDrG!2tCR1!c{}cDujFyfF{k5mr`VfV<;5gaOti z^$rDPcXZ5hT{MI1_Cs2nyE^h<)@V~6k->W#!PgtX?-+DQ=o0`i`yc{D1n~0|fu}Zt zr#Av@+?QZ^WFb%sfm#UELZB7`wV*q)5U7PfEd&VPDS=uD)PjqVg+MI?Y9UYy0m8Ke z{8k?jN}!VobTWZXCg8Nki$Pe<?fRZ85GGe3Os+tfT!FCX3czQFASh`BKqH_QE>R1C zS_ssF<<VIP)Iy*Z0<{pRg+MLnjw}RfAy5ke!cR+}76P^4Vq_su3xQe))Ixx8ErD84 zM-~FL5U7PfEd**IK$w<yulz?X0>M&s1WN^ir2@fH0kvSBpM@O+Y9YWS-v@zO2-HHL zmeTDrN>v2Z!Va|%sD(f+=#I`pfX%ptKrIA_s6#F6Pzx?b76P>psD(f+1PIp>s0DRo zAy5l}S_srapcVpzX?ZSv#wrjj6$q9Jpo(S$OVyzk%=5FbgFr0=Y9UYyfm#UEg5{Bg z0Bycg0<{pRg+MI?YAH|XL(2n2KrQT03xQe))PjrASqStj1Zp8r3jxA6MxYkdk%d4l z1Zp8r3xQe)5T>P3pRo!AO9g_Z0>M%NRMAkiV4k0aO9<3LpcVqP5U7PfEm$5|2+-ym zBTx&0S_srapcZsT76P>psD%LG`yfyYfm(Q%!v9oRGt@$$76P@D>s(8q7Sz#M2-HHL z76P>pV6s~X7>^c|H6OGvxdLHw1;XSCaL<p)Ak6SRvyDI}6X;|DolFq+T+KjbhakZ6 z$U>kN0<{pRg+MI?YC(5oAy5l}S_lxnQv$URsD-yMJWD(rfm#UELZB7`glh>n?VwNs zolKyU33M_6r{VWL`z3U%edKs+!7y+qYP?`z7}$&Yu!n&MQ9tKl08d_i#KZQCHz`$E z#{|Ih9tNgSzu;luP1NHa2F{^A>S3UR`dAseQKc4k=>ybsAPjs6FzI1CdH{79*6{_v ziyj8PL4DlAz;~$eUWQ>a?nPaObzB3O@~{rPO{&5={sef*!@%FDU-p=8Zd%*2T)d>p z8%Ec*pP8DTc;(FL*;C^uCue3R*M?8ej89LDzcx{l9g|bXPt437otkm9n%uOt$*s52 z`R-ztF1Gr;m2{#zcX2UW>i5!q*2&K2t;Nw^e_`%ImXEf(Z!dMat#+2DE7{UY+F3Z4 zE??@;cb5*09XOcw7W&!fa%=8F>wMNrmlu}PS!-)|^E6+Wn@?xMhI?bnmu_u6yx47D z>|{ss)3yV9g_88}ZT_cGtJSV2d)K!nBlp~>@7T2YW@BWeetG-){$%GK2RrN6lHv8S YWY^vs_3<I}92?qI|25f>ziKo72g`)rL;wH) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-312.pyc deleted file mode 100644 index 3309adeda3342e3ee15ac07719ce9f52b51e77bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 748 zcmZWnL2DC16n?YW-KI$+wFPTXa1J6y$PQHyi6Rt&2aziFR*<mSohD0nch=cWG&O1w z4@EuHQ*Yu;rGLQx;3eWEEO_$dEt;Ns^35gzp%3Qm_h#Pv-nTRFTd7n4H0Q&!_9p`H zO9eC2r(k>u!2!775+4GxNeH+aCtNGzzMJFPmhS4W_03$*sF=T1QH7-W`%&VF(DqZa zYx^A@r>5jdM~03{m{|_N9IkO4-2wC=p1X@}4yWg@NFVC(C=c+Q^vN!HXZDGs5!e77 z5|lf!m*jAYH=v^Je0|_K+car&y5-3@p`i$?xHxSJ;Zq^$L`Rn4+nA8)vkC=@wkBI~ zEki20GLcR%tI|r1u7y1sc7i6CRBUB@+zu7xy5gTCPl+C8Kl>k-qNve3CnX_;m37=H zuPUxU$Qc((ecbURckx2?OoJxXtE9%Hmxh?q<AAkAz*%4?ahKJF(+PN(#4O=HZ%I3- z#tGgCmsM9h34LL^T(T|?yUh2REb1j~5ni)aud>)ncr~(}ZM(%|7I_hCV45o=lb+LN zjR;w+sF%(w&`@%u8XhGmzJYER{w%@5(m=Nc%hnIw+PgkHz48|{qr7Jfi;Lfj=ZDK@ z-`pD+xN~H}!s5R1_U1r8Gsaq2ujr|n^dc{8Ni`KxjYY=)1!Pg-d34A5TY+#pKEEwb lVW^%xzJP9&BZT~fb0f1vR`#EM)Zf1t0m9E0kJKk4_y_(j#&ZAw diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-312.pyc deleted file mode 100644 index c1f50b96a16f54b35a5bba6745acb9d2bb95cc88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6601 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 F{{~SohX?=w diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-312.pyc deleted file mode 100644 index e33d8220f1bcdbac1e7786baff3507927f7271d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13201 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 H@H+ATMw{I1 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-312.pyc deleted file mode 100644 index f32f2a109dabf8c8a031fb3f1c3a0125b93f5f34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 987 zcmY*Yzi-n(6uvwENSZXX6$~^B$Aa+CSOtlxLj0)IrK&)!7`#}n@7kF97k8IHLWfFp zXeY9@6Fcgk!pwjdikP}Zq%2+Fot;YXhR^SwpWpkw&-RyAtAQZGPw%@vM(C$LT!%eP zCQl$aK@2e*qXc_6As)eqAWj%LgQs+O20?3x8Hb3O9CKq4YG+1y3wh?ia_kFza7baU zM^Y8FtwGLT1){)PVbxWkIXz4sL2`mP@-RalVc0Xc$q2W02rMzrrfr@L>nui?wPP~- z(DZ7ss#aK=DhT(6cb-z21aVAdH%e&M=YnqcqF6;Kje$g`umx8=k%m(d<xm2siBDz$ zPS8Hc)?zk+`*2~6E2^@bW;;~s6`hMe5TB8Q3sdrVN9sxRDs{VA!rdfLvhS{DVK3pS zlCI)0-xWc!Bvlmdak0d*w`rUOj0?BV)4m%=+ipHk-7J0BS$^QkNb#i{)&#p;x_Okl zKD4n+xFQO>u3u5e2ZaHghBKw;4x}?cLbd=7(AY-vw?@y7-yO|OpnwV!W+oe<R(Ty- zZK?PkBwF$7fBl$t?c?iLjnM#u7b`D%vP*-M>VY&%!56B!yz+(K5AqzSQn0#YNmDQ+ z4dVd(=1yk=46~~ihY0Pom<N!W7NtUSFU%Yk3>%dyo!`(M8V=BTefDGXxH($=T3-}% zP;%-;-S^WV;l5uqd_T!pFV^|2@4x8<@$^p3_gNM~xt@zG=RysH1y2h-Rov9j)SxGp zBt%VT8uZ^FmjMpZH`6({T4O@2+oPAi5L_k(vTu}yah+K0(}giq+o$SMU#e+(#)e}R zwi@J7x+}EdLVxWQfpX9PyRYgim5Rrr4So8Z$h!bz17rLh(H~~>==q2B1AJ*WaQkR= Nv~axk8$ntw{0nae?t1_L diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-312.pyc deleted file mode 100644 index c71eae7b6b610feade5d41be4b54eb77def928fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 887 zcmZWn&1(}u6rb6hY?`GhRIq53vQQ5$m|gpUC#eTNN)>Vv#2gHpooTY|ela`SnwUZm z50zf(#TJU9w@UFZ@zNedS?j5ndTWh>dh%_$>7@_m&F{^7^PBgZnNP){iooo*&l>MB zLI-Kkw|oY=PXKHniYka=D!JIh6^v6XyHZ7hnYgk?Dg+}YE%f;M6ely4XpSjVVT9%{ z!qPmU121wrSy3h5l=VWZq&{>!#x*<e1$!zq&+@H0<JYvncbi%qF{(MfMp-Sc8>;#v z-K^t;2-s8xP?%*t<CX|`l8@rr0<%S;a3*5z>vFkVwn5#gDS*adbVG0t5C(PPG~e%Q z1ylSQZ-COXxi)Tr&K0RGQK^*!Bn!FE-bP!9%59mFEkbi|$WF$LQ4@cZm$9z2u7}+5 zg(ezIW3CmZ+EN{ccJ-{-y5raNvU3Rht-@(}OExCv6UmEoiKizgxgMoXICKM1BrGnH ze8!%r8K`<uM4&(e`{$dDz+<LoiD=2Z6WFoGd=Z&~xvb7DuM`Q#USzyPgJs_hEXugK z#QY`Gb!ukV6pg^2GA1U?$Pug*TJ|D5S7e4xXjY+&2HfP1-7u@EGH!&;B-cZH2+kjb z5zT-*M1MNymx7AJYxg>LzmdZJ(7Cnw_4uXVnf*F^VRQP`Sm*veDXczPom+pr+1ei8 z9W%CTyXwSeGWoZs<@xjttPdplYLy0dwR&<LYW9tw*F+J`5H69Y!jqvak$ta3js)+u z^Z|7tk9ZN>zk!=xKx3E9@DT{p2aIlmJCZTR$C8Z6Zx!K@12p^{T|QEfH24LN?%~m6 gNx@U=Q%4A<cXPYO%-)q-KhvNqBk58v%g+PPf9}HSh5!Hn diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc deleted file mode 100644 index 6bc543a99b9fa714f077f41b10387ce085243f4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28998 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 a{sf3*<o=Y;o!j)a6D#9Jj<06A$o~iXI!FBg diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-312.pyc deleted file mode 100644 index 601a9d8df50fb158db7579da8a02d97016ca05e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2512 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-312.pyc deleted file mode 100644 index 87254abcce87721770168d34e67a308020ebc88d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3595 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 H8ts1oLKs~> diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-312.pyc deleted file mode 100644 index c67c6429b6da6434deb0bb7ee06dcf655dd812fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2382 zcmah~O>7&-6`tYla{0HSB$A3`%aSY$j;Tgu?N~Xag;Cpb5+|XZRB{rtauzgqB(1dM zZe~}KsV)JgFc7H_5D5q>8V(A!ZebO20UwiFdJB?^WjQFhRS^e8fci#9mnNsYS&EA7 zrsxoSv-93J^WMyS@6G3u6hP3jzyI~rPep|O#RkphT41o#iV<2v3R19!(yaGrIOj=w za$K6r@o63-g;RJ<$a&LV_gm1!oG<Om`O|)kJcyv_XmimYdd0f|>#~*(Dk2FfKH?!f zk>D4a;JQH1{u8|7zsjdul$eVN5J?G=Fkm?%xptotx+<hwNt+_g96^X4gIHR$_FN<# zaeYUW@U7N8Pwk|AI?jAP-juc`!krU^nEgt-5>_I&q8nTT`vanY3pn2KfT_>LImdU_ zA~bVZBM$$nYFdskHfw0)0oz<0JAO^q4Oz>WR@~$GvP9EljpUs`b_&#NXfF82&B5`} zpMZ3Di(IiBFD2G2&1ZMd$Mw&HJOuxp&p^C_FuM_4#FlGhVtO~uJq3K&$i^F<hNkGT zJ@1~eJ=4OYh{pHEu4){xMXtyL3fS;uQ*iSPih|AAye&*{zr$-7qyHNP|5y}wd8B{} z=&#&7j(g5g7GRurL`vj&ohpuy%UIbdhc}H(-Vr9LK5N9il+n@g8M>)jstyOppmGB# zm{x{b4oC8e!!y0<1#q9+zRM-2^c+b7(ws|<=-JsE$y;X9A{v>bncR?Rso5DqhZKE2 zujv_u(BvG+&m}eWa?&VRQ+oc{#L;6(a7%`aOm-$SNzA078c7*oicXVM%}yodd73d2 zM!^wW|MV#cfJJOhfcQ81PYG4St)-W?+d9_{tR5&^mAAIq5~Y``f#{t;Up3adCa=m{ zvBOJ&MPbpbhP(bA?%fRcR`6E1f03`YL{>)219w__?)rMRW8G_)RxeeKuSd3GLyLjB z9|dDufxd6e5V-oy$)1yk@ZS!4Kte34V!=U9=$ev!lpgGO*m$SxruHOUy3I|4;>lLz zfn<WUOCcbK*V?0xjhb{AL6`oF&^WAE6pOy1--B$g?f)?fHHp@oSq#{M9asRjHl7)Q z^qsQ<yI*PBL(f?LW<<8%#tOdWX{KW_Xa)Cd!RC4p2^0aB#-XBQi_{0P@V3~rV`PVD zBR;9AD+<f|ZPAkUR@<{IfUYPm5AtaFogZ7PvCl`=xoQh0UVhIOLH_nh&;NzKZVQj= zTz|syO&;0YD2j8tsR4B(m$@RF>H?u{5M^9+ycxp)_E8@UU9LgRFfFPYlpPpl$?I@X zXW}hx-q22_W%be#6?INkh)KKINYd0ik@u3y?^YyMplF1dd6_whvCp8JZ(x}OMoFxC z8ANgO)pU4P-ax`yW($BDnb(xG!=2yoD>D#%8Z_)lFuw)?snNB+^kP+tzW?^p+ocz( z(O4<9-P&0?yM3U)a{T(QzCj(r(59~oQo~vqt9A5N_?y8$1aC-N9f`$YHP~7H*=F$Y zdhBj6Q4Q}aU$`6YuSK5P9!RWPACXTp_Xb{DNo^la-j=owpZErevE;QtnJ+7~{e89W z{>t!&sjv3;)}9%@t!$jXmb%}4@K2-b(Hj>xyA#*WJPZT;VLR$PQ0wd|&weP?28Py^ z8|PP3PFv3(hik1JE3+R+wZ8cJz>V;#bU)N}?PA5cE^mgOSxVK1Antksg(9VMJFrnG zUouoIH80EXFo>u1ys5)O!OBD&yH~XEi=)S$JwDu*xtvwV#N?DZJ)`CFy73NN?(E!r z;mX3vQ>RDHyzt^nXJ3Bh)zrE3uf6`u(Xk6}y!qC}be}ub+4n!@UMVa*a0@MNa0rjZ zV~&Rs$7>Y~H9tvNJ)rEBp)A84L1qtEgGqw>PBqBJ_~nRMJ!hyIp)6?}4w&a~YTjxv zk-x0#ntR1;zxhm#$TFMZ?v@U^iyIW+e?b(I6}kNQ&iC`2uFPuW1brTK?Bz3Wf~a#C z<9{Ikm*~hQI`TE@{t`WXKM-B)e}8akaAkZe&|ebkUJ)l&xH^Ka?5o5o=KAT|kxFs% z;P7VWb307^FxrhHE7>}Nu5!rj*2moLqp?p8eSC3;8R{nxA6i_v%XR&e@B6AHRz7vF tr5A|F2j5G*o4V6Jc8|YM<NZs6cVb6xANvH~3!M6bKV1(ZexJLM?*Ri(O>+PM diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-312.pyc deleted file mode 100644 index 17f9ec86cff1a728cef1bcce15a49fc510b136af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1630 zcmZuwJ!~9B6rS0?yW5<9!jB>YGAmNxGx03}k-|ceOi++0?BEz79mQ&Icbr>pcW0TI zGd_b*3KyU>?&1njg4|M2($hq7kYJ@02nmVq%vnN8#e2K=BU>J6-|Wo$-h1EsnO|pS zYyvCz?#s@ePRL()7%yw|GyEHV9+HrRG$sjcQA#xO0SUEz66%Z|fgP@v#`MtWE)gO= z1*{nxiP<s{%gmz^LRuD_D)3dA$+RP_ygs7kUSLbDb+HzrS`f7|wrthFS8d|mo_Mz} zwl8Cc)r++KTEEt?|3NAZn(J%t-3m%tr8Gx};WGR@B#g9Z2swwer86Vcm<hG8wvEu( zHzs^4eY0WZvzt-S*<@+Rgx`*te-+YQOC7&0mGA@Qw0+5(Aoitnwz+T+?T86nHf`I1 zwayiDRL55!m|#vMos>H%W1*wC!*&%|fC{b)SJx2cL@8baqz55D1<0Vog02&7JAPXD z<?YWHkdVDB<3a%h%+678GQkxOc-(Yu13|XyCt1u^S4(0@4%|gDN~QACfGs6`uk?DY z@H9=mv08*g3tRzDC68G%6Tow7)hPYuCdW*3OEA?FX)qd=q74Q}9J}F-q8Vy5K!kin zLpmOgT`KF8oY752?k;KQdpB;4YcZ|c*+PhEFQ!Gv=RFS<-iW{F<<-%R2a{9j_|jKO zG_+g~Vkz($NhI$$&$@1hC(KQJC3oESdC*H(s-&w}%<c(4S&=FVx=gHu{EIZ^K1__e z!_pl$j@oY4R~??d-Ms#mD<j2LGC%10_n36ED04l4g<QDE%k|qqGwUNw*=rZm(BZu6 zd3&#7W2fzCo(Ie!)kP5Z$*D!=uN?FqExvg?cm46)#!sL8{P8az9>25ksJbx(1X*uX zG40e(7!<(vyo86n82{^@_j%8cN1BS~g*<@kO9hjJK^9?dsD8$Bqs@6NX2IK!L|||+ zg94vgA+XJI1;jo%(W+*3@B*<e4>ZlZL%-h|5Zr$V|1I{R4yuzvReC}vNHFoE)Wg0Q zTkuHEJn8Y&4C{cMKIuNi*4^fOy`hVFP>IVZo<ng3#gysGctr6Ed=f+Mli#cL5`p(Q z)ag>LLq`P8YndAQ%wL4IHAii0V%wSu_=yG7QI(s;qsZ;)vnt}`bo(5KXVrJh%HI@M z!4`9pUxOIvl+vf<`BQ6_-k}F~PYLdW*N9R7X791S@YGoTvs!;(-Cz5|sC~P9uyuIz z*j|2Oyip!MI-EVWUw>jO{bx{f=7gZINUi?B92-m!rNQRm;<3H-o6#675aXqy0{;X0 C|DX*3 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/align.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/align.cpython-312.pyc deleted file mode 100644 index e73a4dbae58ada2c20ed1946109a32597d1f25ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12344 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 B{1yNJ diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-312.pyc deleted file mode 100644 index 5b19fa4fd0930a6d5f04b4fff717137fa123a221..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9128 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 VY(DS>*O1=DICp+-tfnUQe*l6BlfD1| diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-312.pyc deleted file mode 100644 index 8c3df648e72d38a935c7eb2cc836988ac96234d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4294 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/box.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/box.cpython-312.pyc deleted file mode 100644 index 10f320857b778fdc2caa093975d59192f8f05eb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11880 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 A0{{R3 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-312.pyc deleted file mode 100644 index 1462b81c65cb1189d93f99db1f881a878dbdb9fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5640 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color.cpython-312.pyc deleted file mode 100644 index 3c7fa7002e9b09206944824bb9588cdd96d61f9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26592 zcmc(H3w#vUb@%K`TJ5f$s|SeJf&gg|2v#c|;$?&+K)jKJ0Rdhwnh{!9X~packdSQb zIE{$iSlDh5v0clq6XTdPxJg^wI1R4T#%a=I7vW0Y-~_jBnrZr2z)2JL`9Js0%&vrR z?0)^eZ-1II=YQ^<`#AUBGxwf*N8iiLv<djN{_d&vB^w3dZwY9>9F@8Kuw4+&38Ekx zf<g<w8(Iv&#-Opo)M7G_%oH?tSXwNMHwV)?(p%CQZwXpEGFmb^Y%R79dyBop(c*wS zO-v7Fc4W0=b!4|>cjUC>Fqt)&+mY9j$M}q(vm?JHzoVd~fMHv(u%oD@$RJ1=vIEcC zfv2=gVPTHo)Q;koVuN55B;m+1tpdsWD=I5y9xW4umgz=eqabEIB8b_N<rNbTY?;BN zIgsY2NM{BFF;5hpG>A?y4K!aY04)@YK&OaPL5sy{pwq<}pfkl;pe}JX=p3;GbgnoL zbiP;$S|++d7l`Gc3&lmC72;yhC8Fm^1M;b)yXY0GK$nWkK$nXvK&!=-psU2yplign zp!bODKx@SHptWKhXuY@rbfdTlv_aeqx<%Xyx=q{;x<lLvx=U<)((pyfsYz@G-Ywn> zx<}j#x=(BY-7g*hJt*D>>J#q=^^1o<TSXC665Buzi|wER@d)TqF$mfrc7le)F3@A5 z3>p?AYEIqaao`i;Nzfifd&N`W`^0|G2gC<KPm2$MJ}iC;^bzsXpuZ)426R9?1NvF< zQP9W4-v<4h_&DgGcoy^t@k!99#NSbK`n-4!ct|`C`UUZ6&}YPFL4Q|#4s=+29`ptA z_ds71zX<vz@g>j;;>)047GD9qD1HU>_r<S*UJ_pg{R8o9pkEjN5cH44KUQ<PEWQT( zCyahWd>#BZ8U0i7Ti~yVZ-D-p_$KJL#XkrA3-LRkZ;9Up{Y&wCpx+n&3iJo!4?&}1 z4D_lv0(wn+8}zTmQ8lMA@g3l}_#@Ek;=7<f7JmYILwpbPZ^XX^eP8@L(4UHb5Bf7v z0sRN@=b-;6{uAgwi~j<e5O0FsV)VB70r+2tzXbhP@mFe2zZO3P{x|X8LH~o%{}li0 zNy8w<IW7a^jNnX+GlR1*E)85d<E-E^7-s`#XPg6ECgZZeWiu`ZTrT7Cz&RP04-VrB zv=A4@7U&dQ7+=(1!4>1eI0K!I3u6s*CazhGbAg-9xH;fT7&jN(JjTrjSIW3DaBjve z09Veqh2R!3t^(X*#w`KoVO%9RFXO7fEoIy?aLXCDLg%W%VU((+T?K^E3c3atMl9$( zxG-u#Yj9!Yg4W`~=mo9Eg%J$85f?@=Xag>cWY8_RFq%QP;lhXp-GK|E8gv&fjBL;* zTo~D)yK!N3gYLnF5e~W!7e+bgeq0#oYH1GwVZ?*_aADMg`f*|8gSO(r=m(W>!2*CD z#sw<?8o&ih0D2S`tN~~TE?5N65H45+&||n@89>9hU>!iaaltx(p1=hQ0osGBmvN`S z^)arWb82ZH0D6$gPwU)6;2vhOPwCtv;6BY{zom1Z0XM*8XLRnf;2veN$8_$u!F`U& z9@n`+aA%q937vZq+*3^UJ39AyaOZU04sir}9@iIG+^2Q!8E~*spuekg&w(3evgdW~ z1#rK|WH0L67r}jr$zIaA3*cU6vM=l0E8s3N*;jP#_rZOY$u4p3i&TbJ)$0#%r|WC# z^>y6o`a|{lBi!lwWA(cHOx70-EwkwT3CU}Z5d9O$rN3Ec<GpM+QkQ%mYaHTz10fqU zoV>qc<b2CqsX$Hlb(ZcoC7YJ6_EvA1hjji_qEY@WDX)!e)0IceEu|S$j(2dqA?1Po z8KZAXWCJK3*{g3qVrg+pWDEYBW(I=>d5cIE?Jt7m9Sd6)((D50JHbUA6)hEa%rzG3 zB`8M?$$Gqn>$`)7i+`z?f04B4h%Z?$jYGU|id63JA@=vR8ew*Gx7dG$xIZB4c=3lH zBX(4TMZFl)O7RitUL`yGv0{#p4Ni@TI+LBe_J|<OI?}4uEP2<oQzvNLD+V6gQYlr| z2?rk%gac^j7H<pL*0-gq<AQ8>%z<>t+W$4KQK{-_;aR+QlKHkQmAs<oD4vsNLt7om z{4`ENjHhWXNU4lb3Uq(gq~)H}-(%~gEXg|+54J47TUtnGzU0-Oy?d(C@*`bZ36gh6 z<s{O$S1g<}2#<ZrEJ)=?y0wtxU0S5&X%Ko0J%+M4l&4VmcDEsJlMf&AMMA#zU>GR9 zp)*q7+1&v)BPe(KTK%o<lG_~5Y~HuC-dDS+zIIE)_Kk7dc7KN?Hg|UgrMPuRS0oVX z^atY>CQztp+@^SLeZ$60&A#;w&Ay#ATkD&f>*G01%{ANWY8vZwN%o$G?R7i$G-(3l z>!=L{LvphmK;jX%F`m{ag}Z~1c!nHkZTHDimyAe-b@dx+c5iL=HP<(8YuH}1)z`eK zep@|4GMgp2BY@&Gw@V$;%Z9kQSvnbsr|$`LilGzXalK154Z`geDDpW>`DroIViXN6 zCehep7ELV{(cF?IT3XV@G|Ad#6w_f2GF09Q-qw@hw#DtN$W1-rh}6;R+0iMvLT#={ zyX5k^TB$OwFbi^pySutVazqkchk9HQwVdG!nU+op6-J>YgklDXr^!;JTkdRCJ32%H zdZHjujN2{{ETjy5!Vz#2f7H>N1h;W}FV`h6SOw{#6YWO#uoP?yQ_`*vI~KQxI;6!N z{z&-v;<`|4cZbv&2``RFLFusU?^qO$1X_<u@*-%jGZ^xVlDzo1)OmbyFmPybS5Krp z)akA8R4xt&BGRHRf9p~IVJW=0E6}yrhiGC*UQF$_nCYRSt0!*tu{QMidh=7XR-s8} zpiE&W$Z26LcgB$TT;P0QXn!=@9kse|Q$@!qgp|P)G6l>zA)+g*Ptf{&lkl>E`nj2U zjywzTc)jJ>VB_gNUpOM8FwXIXVL}&0c7U7~u4g+3>mKcmTBph-5NvnbsUoCJpD%9n z`8q;kcaV68&v&fbA5=q-yclYQ*sAsXc!oYK;u+12yX$LrY~9g_?#ahN+=QIvImkjT z1$kLu*|D<9MI<FsfGg|)c|>@}yy`}F&go5KIk~4BILXRBy)j`nSQZSG+!k<4q!}#5 zL(UJt7xUC8jaFRxPag+MAo@+?pv5YtOBomo$^M_gl-JzTCH2lFO5L9|xGNk9$>{EZ zP8W;fY7P3s=<t*w>-91<oJ@98E+#S!WLyh>;x2E~%TggzXPVgLOu4;z$yi#?TZG7Z z&zm+>_gusIhM`r_?9!;URBLn@uXaIp6Ino{93-Bu+9G)&i6|Mlg2-Ybq*30U)L<#C z=_N>HF0L@8My*+KgPL#bE=^iCR6@;I#*?9k<Ca4~jJdc8T8>)|%aYW|R2om~k%Ga{ z38vb(`B1Q1VhWC@cVK*WM*IrBIO68k9)G8j#u7TwjuEV+6Yn@A2M)JKd@OCnN+O#o zLOx1HY8;lQLKZBZsm9@1D|V9E^`yEbg~n1mOO<E^$xMyL%9BMBtqi<a*(9R+^(;}y zokYC9XGuJx(|^1N<wWASB+d~1@==cSSTqXqD)~C^QE2qUZ7d!ydm#z3L`mxMg^%*Y zsub#yaR*!xhb5V%=T)eKjuTZX)Lr9gESV~0I)Th^mmKIk>{Dgb1LHOr@?+hhKv=3$ zW|ClhW?scb!qm(>3bRf;Wv@cLZhXpKg*u^HU8XeZM)B+*YqzlE=LJyak#u}^mCF1( zg&u{>&G<Yj73#rp3nlMWSXa+tYSXKuP>)ZkUZq04UsZ@lp;0hCNsmI~A@0QFA<*67 zOVyP^<AY~bsZ{E`M`7LE$}*<Tx0ix!thKrVoky#beiEd2b<3D9R4L0-kXNDiI=UeG zfbV!9g!zP0&B8;nzw<C+-$#hF+~ZxYtWtp=AfBZbQA>9<ODP=mM<lg7tYs28)Z-5_ ziATAINm|?eazvK8skPUUB%768Z<8to{!vJ~{CHvLs;pAhlhlSOgv8TRYDr*E3cN}k zd$2VmceY_{s~uCRXYrERdX=p#saCwJX$)g*G>{-e>)l>uGkYYNv`5*+B&<xV>v|QM zZK6C{SMn;`Srk8BZykR0aSW>+B*{@VrB_AS$s#5TRH<~0PpeXC8ZYoDyV*0z#63zc zNpiUEnA&N?S1Nl*>|kQeg6wC{GLhQKr%95=+fI3i1@n=?y9_O(;+C#pcSn_SKk?&R z+p8R6k0e{$qtN>@p3W^>m2!ko+KG0_AE{C#2B;G)^(t*D@B_qi)ZwTWU+Pf~Q}6__ zzbBqKuD2=ecf?|?7$9*jt7j+}I4<!q?p1z=<a}uA&7}lMsM!P6ta+7AlIk6yQVFqG zT*=9n{ya%1s@|(a#y#v&x(VBp?d(yGGYPLX>qg2+CQ0@ykMayjCMNDtPLUXsG|{UJ z6Pv55gtsW>jH2=Y$*pRudzBXn@}9uQvsd{NiENnZ2mGDvk(Wr2(H@HUsO7!N1;Scu zhve4w0P_1Z3AHBRLglwoBl3<^sXWGnOk0OTK@soTkf;o>r`4AB2RkqyR=z?qn;Z(` zbs}TltbCRP%+M_JDvzqb-?PlC7l!BIQGS~OEtI@h`2&^=%kOBr|7bvYoCKM8=lPF> zeC*BWRR-16q@HEf%2^d4>FRi{S}5J5c$Ft8T<d?jTzQhjYVY<cmkCX<T9wMPB(?J- z`72?F#Zxm;yO>8gPf`bKeV;lL_yURU=(v^2(=37Uz0ae(!KCBOqepp;q)EH)RbC*0 z)*C97w+QMjU8%fGI8ANMFB2Hw>>lNZBuv-3&P76M^>|<TeUex>|5eVzVtAEH#HXp2 z=2Zf!LiIl3RlY`IQv{Q%uM=nQ2!ta&K6D6J%|9fGHPQ}I5b%!(GGkP!{4w!qtgXGu zYXl}HU8($-#F<>{T)$rB8|*nUK`W}1*Hz#LxU&y<ly6eF+SrxKpAx#GZ9K{ql0%=J zQjaK|s8s%pa7y!gls8F2Bi5sQo7iOIR4RWyUf@x_LjtX}Jj!<o+PUs&pn8<QWRm32 z^(fzGk7#38`2mZ-ItzbJiIOBe%*LEYiLr3Ce<DUuxk{28){&A{#G{O`$9T`ERIa5U zkMg#PXnNpL{+f_I?C%t{aXd;ARry-RV=NZWn0kvxd50vd=XjJj=h1UK%8wXN-Nd6@ zCw|;e_9#CgSxR5=C^tx=^%alu9znI~Jj&k?n%F@+%HNWhcOsASJ_GDc<x&2QKnBep z!hs;l`BTE_)NMRVmMDL(B0nKM+4d?wBO#k?d%0-2qUfUK+@yIt%0G|{_6^T^RN+$P z=SksGRamY3V^Ubng_U0ApLAiRR~0T-{y8aBGx9D`{zVshm++Y0rAi_xR5S8cD>suu zHKVFZ<(4k2s^pJXEmLkMh0C~b=@R7wUAR=uXla%5i=?nhjk!YkWm33;3zt<Y|Edd@ zsTnO>ru-@?T&DaQK>3i!zY+O&BL6|;KZ*Poh&ziXx11Hg-^1@x&vKSGuv&)YEL&hT z`xPul41YD}6-+6>s&ZB^eE_R^sb)I&_f&gnmZSd+Dt9{v%y_Rrj}Z>OY_^8p>6gP& zy)1|1-kET@sq6mMP<K#tb%r9YLz1hDqKFmS-R8;G&$0)}r!0(rhJ0lrE?i*?0v~~y zQP;dA@4e?f+kuj@{Yw^A`xmtxJhiOfJ-5%+N{+SzWlVhVlxLy0-+h4OaBq_IfOsIh z@L)N~Y~yN~q1Ey-l1|ogH@s^tCdn*WMB{2i$q=M8@Fvc~E0``>rHrWvfz+Z)ZIIek zX__i^F;9sDUXx6CO)}s$%#yN!a)4})m|sx~(2~ofd63#uq)uJxNRj4e2;yupQ?iO# zlpBs8<RL|STbh`IjfeuNP_#%HV!9}_nZ?|c=ZX+AN6br+Oo7BHO%?NT72u+0tYTqG zjAFzn5sOkJ)1*SUucwPsE>6|lY+|uwR`Z*djH%ZRM<OP~pR1O6CZ3z#W~5r6tTP_5 z=+9sqXu>lyr5rVnS;;(FTs>y@ytsw+#@=Gh{i}9FQECfx2FO8OA<sk}adQL?s_pSK zIJpl=ay&i49nE)op3)K9gzNU7fRM8lr&NRvL%#vLH`u+V6D$2jIw{g;JYq$Z2|v*c z=d5jl5b$ZEXhDeM&XCDsAIZKmo~EFuv8VK`MNCHt;0V5G)tZ7jnYJ?lH?XaDL0ur+ z74-LnnNQl^8i9jSRZpPJ)d=^ji<}nlOLJE=yrq_=NKa6boyfg6eKi|fu3n?7>_daQ zo0Rf57hj}UECBMgZfo3v84e!#7YrjP89sM89}(kLIQ*oJLkJ=D%Ri@J3tPRqO|pwb z^aP6=rj%VS7kAB)qnJGYzTPa>wB#aYcopJ@n-KN1@OM_%yVjXEvZoJ39`8TXKbBQ6 zD4q+P4GbO}o-^G1(!S^Sy>#F6_l?f0j?JqcnYSuBclG6(sAKI|X5QKQVe_^8c~Qsw zF-OkrbaRd^A(%64%nprnKvJ1XaNVYP{uaT2t}waR{qu%%=o$z!BI1M}4`cp%^MoKk zj5w1T!-(h8J}O3!@D<YugWI%S{zp>VKY_rk>Z(mjC;C0(nX3NC53W1BHKlUl2GZ<G zWdAeaSMa}Q<vkua6ZmX)3R5^_e$Ia0KHMD5a$mK&$Fhos@}HZ2e)@1EnpHkxE&p|x zO8;<;P-8TVQzO}NQsr%0G~7*v5nXjhCQ%dZtI9bMT|JYHx+Wn)<Cgs*c8#07!L;$B z-7!`Sz2zIF2pcAy{s@-Xnj4$%-?U*Xhvw~ETH#J(-I;lD<)z4syXY5!i<>Z>?r4HE zz7M2s%T#c*m6T3TpB55nf+Oeg>NC~PWQ<O6$ELWi+TGWkGe@1JF=uJiQF=YQ_!;j| z<hh>nJx{M4$zBk(E||Q-GEKK2&HtIEQ`$k-HWE{RZN}pUrmN+(?NaMe7i<Xab#WsB z<zTZefZZf1*yCc>SKaPH6kg#9bl88R&Rc{8Q~c$#08{s7asy!>f5NAx(_6$X!5slj zq{F#*p6M_r|M632PQAElv}8rBWX0>{qbqmBR_=(-*%{5=8MW@bQ)Sfcn9Asl{XbI~ zbxx*~`I9TfPrC3!HCo>>P3$`pt8YUs)n|Hh^m?n3y;Na(XKEGhIn(n@!|3!yG5lpO zidq-3TE;DCnGQ+LL(I4h-B&s+hq^n(R;sP`(`&yI9BOYkofgr;gnrs%)Q6=m79wVi zpUhsdp<0Y5CwVcRHf|Okrc@^hYr2d5Ov!DMS1QYGHd37ArOI=QWND?HJQiv4W8_T} z;R!#Mcj@G*sx>tnA@xuAP5#8kEC;<<C;UE!4hpqLenZ}qXz?N5W=7f3XE-uNODB1U z?hHqYlUU<uMED;>UnQ&R?{rDWx&z1I_wH1OflHlzxh7avn+?+d_N$Q(hga%|M65@< z%CvbN)*KzuLRUyVgy3H3(#|93JM8=s#F1Uw;m>eILN0jcwE<b-s^cRQ)1wfJP%$pQ z<fw6#9SVhl<ML{jyCqh5KT&mb@gdIg+u#o(C#u~cY}4_<H$Fp3p(0t|Mz-rep~`IZ zt0y8>x@uHYtLd&ag#A2Bayt*Z8aJ*-U`H2fi9P&eJ=|GxF4`o;<Wvx(*#kGgY%)Rb zOSXv_xBKBC@G*-X=KGkL2#e<=>&OG+Imv2qi8iUDvkI~SBuu6T&BiBnnTN3@5kZw% z+Ul-*#W>+XGHw5khhW-@1xN0{n(O%s2I|M`+1i`2JT|5Ls=a*7S#)mo+0{{JdDKx3 zs$s{hvCQ1Z_nq1IjC-_rQLK2;)yzc{w(9JvsB=Nou>kbCb1vqG`=8$*b9$l<Ps#%e zW5o-vW-grgz?gH&sB>=Yu8)<+ip#HNvNDX%XU=fdORJt=6>~0*Iu_s1iZLG(&!}_$ zJByYNE**8cV@`L}(R6wD=$fY3nkKOP9hGW#^$C;=)tsYc2c7>gU=d(^*3^du2|LJC zn6%uJS?xZ<MRRg#kP=t7=15%qjgRZL^uAFmW4}Xk`PIFAzJhYK$)OHcAW|B3typv@ zK*Ky7aPhE|etqXSRv$0JL<xhoMtubSg2)N%V!M_ss$9Ah2M1b%-C<0`Qj)s+5Mjwk zC)Dx<I>T_lw&GDT8}#c<W8JPyPEf~hL`BhE$IqQ1@Is#4%f|^MQ)@8HCe~qU5Und` zP{n;z+g|Posn7*|)P?I2_q1>`U&wKeIj0WIADS|p8_g{lE33Ga_htK2?$NxtvAnqm z`aoZOykEV3w0di-dh0mpNA!hF$b<I<*kAAye<>5W$y?Zv><w;X?@#p>)`zHSQs@v9 zYiPf2vT?=(ro3B%nb8$|XDe$)sw~xpvG!(7p{JH&#NZBI=wkZ^=u0>%g*?U?H9fcA z+!1&lp+iTc)=07&jB9kZf-=QT?b1o!@?;s^M%jwCW(IOxqdQm|tCdnuk??j`WsgzQ z&p;At(+{Q7dg-Ejbita~f;Cr8T+7}OweDa|DlbPgc?A(#bG4?n5P7B8jI;|3n~@^j ziNA<Gi;IwTV81@YD{9OXnQ;=?9fugTIP9Ih4v9?C8CVyHwBwkG`VLCIZ0L*+Ed$uj zdfAdiYcYJ?AK5j~&aN_SWcz9SHv;I1QCch=ZUvGpM}wI64E@24bmrw_KFYe1{^a^` z9qW!f|2MiBPM``h%{}E0p-`-QSg#u2?qO<os+j8bU_A_8OU><};UT2J&I#eYI0Z&! zG<#Mod)AANi%plDuk8JL`0~=P^?uuXCGuwVh-=$O_V%cCJGUHae_-8%@?!m}5{&j1 zNqG;Dft&EVXw(k>qGy<TkFlxT1QY8b|A7?7q=RN5)D6b3c9It2qsFW{593`c+34|f zH8G4z-B^QXcA6H>ZUfV6%Gy!RK}C8qna!zCpZ*f*kCvPmnOV@^P{zfK(X#4TS@pH- zl~L<TrmTPf4Z*X8V^Sw!*d_TUo@!0iias)LL65Xr>Nmpnrs`PLpXR1JqL0#~Vzn@= zuJB0=o4Ze;H+r8TWu-I8(mS;+BKrF2i0<e}=8&`l{iZ(CLsdNWK9fFApq{{fldYQi zOylMW$+-GDN_$!mCdAd(NJpH>I2xByDs!LtbXKH54>6Ks^jY0fVTEWuLajC7r)lm0 zwAyd!PwP+bv&h>bv~Xg-$TW@Xv(U$Z#rU95>%Zf|(nafC!>nRPYMAzp?8oSx&_>g> z+>-Y`>qY&;0<4SD<i?bI(=;pFpV5~g+K<+eeMo9S#QN%KW2zR^cFXvf?UwNg+HG9i zzVsvHfSB+TGxhS?BD1x?KAR>LvyQ@;jjKU+A6hcC27NZxR`z~Jf99m^WY<zl(UW5m znO>G;dqhgKGGX6C=(FDWfj~G_ySWp~_Q~7Ro!2{+ZF#x;>MIcDMc-i{vjc1NbC?4@ zy)<&3mRG$6E;z?%OUzFbrvSb0Fs<TeVQEdxPr$APha}k2Y>Xb8#V0Z9bh)ED%=Xk) zuW|ADvFk&_LUzitcZPJb3-cVjNVPY#wh*Lu+c<A529H4I^Y(lY&8dA5ri~dS;V72! z+#&s#-HdMrn9JEHQ*pMl?K(_~jTJb3slTyPCrKY>ti};j6h>a#JCmDWwgXtPIv8rj zdU$Px9{yvb7$zIQ9L`q@Yc4bl_6*m)T~rz?tob#2Gd`T1Yv?WEI!I>cx>FDCJoy($ zj`kt2rIUO+#B*x4H#PX!Icwkcnr-z>aT6At$r*m!+K5jZ*fDGi{FbflZ1<72UPIko z;pFR^o$5vMUBN&kZh{jdZt@3%SX#4}I=v|3Ss@&prH>EP<*|d6+sE4uN2RF2eJqc- zm4nKvcsl1+kUA+G?|$C=)NA6{*wmVF!h|tQ#+W7!$seCWSeUwd`Bw=Q41ARoO}!J7 z2dhv#YanYZr{J9Zto_N%(VUW4PRU5lyaCG%d(L3PRr`#0oP~qkFIJD1RK-fFt~r-R z9ZTOYDjh8<j}?_)s2?e+9B_=;i=y@tL_|7c3s+pOyt;7BQ-RUKvRGl+SWyYqH2GQB zQOV4Dzjo_r?Y*(ud&fyXa0o@S&UK#c9Ns-rSUzAMvlm9~Gq2~(9=<O+cUg4Vmgt<V zBYE4Rj%_zeD@RMKW2Mz2rK@7rxdYb0(xK{i?9S_jbFSw&2R9Av8ag((ZMbqIXZ}Ug zg-w@sT{?DQ+vUoUvbEnfUD@>3uD6a|*%ocuJ+kiJ+a_aC*1*P_X+nO{VD~eD(V3pu zOwZ-z*POLcN9}u=`PU1k3>7_jU|_>ocEOP8vwhbK=S9mlzGb=66P>?nq_8oX)2LOr z@>1iMw<PO3Bc;A;HjJ*>8C$b+tSCjA$P$W6o||=k)&=Lt)I|fEuV?2Cu6*>t;n`QS zOOVZ2q4(1EsJA|vzky1bmk^A(dDsnbEr>a$57Z7844F~i7rn#b-&=wCUcoCZuRAX{ ze`D%MVeP=i>&`-qmdi!g3Tv)8YglU4mn)*xTcY_}ld0XM+HBTSF>Z#VZ+!Nmzue6m zj#-cKqgR(~R%7im$R^Ryh7AMJNOas&lgx0~Q_JC@)Mq#7<m!)RGOABio5vVMb0<C^ zrjNh+&Ha{?Egyqy>ofP6dhx9GE@AmwCXuDqWD@V^|MxOYGV5YxS}?huG{3WK6w{y` z%yd%pGO1>D4Vjo1T%W^fnup!cy!MlXvG+S>V*S+GTAmpxdFr#C6j{2KXNoMjg>AuF z!`ADjwFa#w$b!41aH}8Rmb8XMDLm0(95;Ha<Ho9Lc|D4ZwLt(kImCE{{5;A55JXym zNGsxorEx>0J0ry%O3MiD=wzPIB?M_7k9$X%k03*Kk$`-faf^>m5ip-n+)PeUd}0Cr z?nDDkYX#jnbK9InzE0J<ih8IYK`{?#Qu;nwYue&ryF0lB=Q7S_3|PkOIZri==Ff}e z&%0`$_s;bBgLP47Wz<o5LA~F|%p;S8cW3F<%+j%fsps~e-4AQ#oEmjvr+Xgg*u3%! z{uf%#Pr0=B%;tf*!MWG-i(W1sG7lX;pE;7hG3soHIvOtLUrBpyh7Q$a$+BO~Ec@S1 z)*UN!U(Iw+^tYmVXX`H1T`IxCw(47}URyP?9HrY7b!>uJ%%3ve@jI*JxxVv#x~WWk z*88=S-*#Tv{bup^o1(jRe{WyZxhLw_!~HL`2|3R4=|0v%Sf;yKzK^zgeFkig3NrTb zX;0*%H>+t3<3r(97{!z9YNb4T7n_7<XW-dMtOFmd5%T%7-{i3-+n4&Bz(%vN-_(y4 z8rG)h?s7wNg@P5Nu@`#MMsL3b>nszqMkdkRpVpZPY*BF<FjirG7P7+qX%T%rhw@Ca zi<F|-NvwZg+QoEj=FhCuB=u%xhaJM|3RaJm-9lV1R>++;kx6@@Ytcp$Rw`ScRgVcy zk4gOan0Bn#v^2r#F^L}^(;=Egdy3BV^%7~0auppZq5Aqq3rz{r*FpamG?>~ui+Mju zrK}CV@IURF^0dkOoc<n}r1knUJ836%k~Ov3pY;`L#HE#V^7!Nq_?&?CroKKrGFN*d zdGFI#l%J??PNJ&`eKS?Fw8EP3W14;E|FLG<CfAhS9+PNYG_w)3<P(hBNoqTJzNuq5 z^2yuPt*P{Xv0W!C`vjYVSxIK^@;ZFcfuqhMZH2KVoA!M-_K*D<e<BcRceP3QN{hz{ zR~+`T-<$Uw=7q0b$JhQeKaqVzp2Z6ZYkxKc`2h*&wZNt^a+o;g8z`7KZ6T}5=PB$| zO$9;bKA=^8+}0VAJK%2Ur4K~e;Sc#AkPY{wvMCPBj)tR5engpGHZuOPl{z1yjbE&B zT_mOS<3?Y5+z^Z#!f`X5_m<~SRCs|>wlZ)iKX8(c_2W|`FwA2gw-QSpc)qJb8R~N* z#_$PJ27PDFw5x5a=>pnQ4u2VhEn?M^Qd38#E{IKCaA8AqiZ^EWVjeND<%T`?sr{n` z3t|NeM(hhNM810J<x{U89bMZLTiZ0UxQXT(sT;@Fi)Le!cJ=eCM@v@5N>)aTR-M^2 zuzt`m=)t$ugH@kBdA(@*(5~V9^Lw9saL|mWhdfVIkCn_jyA_k6p~fd##!BX&-Fl;B z{)PPKR}OBa*v-%FJHL<o%d28#tFCOlR<tXcv+Kr$dCJ(Fc^8Z?lnu5Ht$(8ZlHpR* z<;qw0UdelPM{Eg}bz}3(FC2Q|$dF~&_yyY~|K+7uDqmaqR$gr7me{f_0}W$y%Pv&D z&@dPoI`l-(CC_E^W%;#?D~++`8)M#$12jv@bq+Q@GjBNk>55oESuCgQg6CrQrF|od z?}?S)6U({h+w<PCzPUJ-vnyc|GN*okS=CgW<(qnb>WdAdbC<{FF2CZq=A;!klFG_| z>J(r8(;j!Wlg?K?b98j3H#XCIHQPH@H0@m9*}iDe;%Lrd(6Qo~&n-N^@ND`G1e`j1 zDq2(#&8YyrUOfL=S@q?)-ztBtJXW?LTD);E{rzd>qtiUGX`V}^Bhyw6Y`yNBk}Suv z*xY58`>r{+MjcykWICx73t~kJu4XRyKPZJd*Bs8f>MXfF%{83=($wdtUThd$xF)u6 z%@y%GN8dPlZCYbAzj5;7E*PD*BsOiyrJ|8()f0-lG&XnX<={2vmZ)RPjcn(DolP{c z9wDzZJL8J~%Fv8`AT~bPm}4O{BDGkIH#ECvPkLCMRwnUmAC?gCB;tr-s56Xno#e~o zW`ib9Y_lmPi(k@sr-Q`uuV?^UyW|iSFOeR80FMo7Go5Ua|AQj_7m+lKGWe_LYyA!h z|KmZFGiaF8epcMV_Uz;=5|B$trfIWWMjS18<fX)|BQoJ+KeIbT@DFf=F#Q*jPYdsv z=iaboeyU;2Tt8-Werm^<*)=xZb$Y|VropB&+eU!Q)noG)oZdLFcQ6>sEEzE`faJD0 z!(vMmnk@^5j^7q=OE`qItc1~QDIc=mf}s4iNfW3+M$0b4aMdk=?rI>h@P^TYMoYy| z9R*hCVHF9Ru*I;$aMLuy(rg$jm@yQJ6;vcRs@=$$8yN++Efk(uE2QNnjF}eOP&gsr zHhkh1-6%OOPs{{&%a~!=$?}Jg*hC=<w_A1?hL$D-x?d>Z_e&DLUrE2k<Z4nB1qWj& ztu)IjRR}JT1KB&4tii}N%k+fNW2rL?l_UhZ50~CzcZxiNKVc^M%{GIOmdzfxX`E`= zYq*e~5a@on;Bxp%?d6lN&AP=fdoaPG++3zTk}xi}<PX~u0&bU3M%-Aun<STM=EdGL z_=rq8$^D^s9<rwnL$4|ISny>3z=Q9Ph0`~~gQV^LJZzYB?;CqPq8U3k7JbKux+eSK zw2WCyyK7jQXh;py)*0ju$2&j0x19U@@d|UHHZJ<+73b(BIZUo~y!Pqfm3ji8g1x4D z^ED6kvXs~<&VKgRr>P`PBj8Ji)NNv;ynzJdQBL)%$1|BLm;A#%I<2q?kyhaf??Wo5 zh4<}Q13izf9olu(J~L`w7IiHf0fkf5G3C0|KF~1eA2JMVA6h?Ro%Nz~c;AI%mvV>i zyVN)`d&TP|mjiDZ-kN>6^Q}W8D|f+Xn3;CE9%kQ>dwMHt$T&YZgHOBIe5Vp#X?)8V z_O)RWH0~^^-kvX_OtgY#D>AGlu}(B3{Y1%jPPSv8sV@z_IZS!_*b0+YJlZNVC6>7_ zz0dp`V_EvFSanXCmfp75fkWFGdgrW%FJE-g$v}R7jt;x<X7$6!wo7saY%?>~Y!}}q zH&F9zCb9)2Zj?Q7<6&HfaLJY6aUH6}Kc|pR@Qxp*iCl8Fqt0~jQADT6-2Kf+rVdxQ zlQkubQr?t@HlJQUU>sOKmRqE;*K?**Q?4JJGbo=e9cqc?mc|^VBi6D{BE`oJxoM{x zVBH)AQ8OQ?^v`TMaE8$5qrLB1yj1Yd66gbuW<LtKp&9!<_HcXXgs&|WLa)cPj(~)J zjuE%w|BM8>!hta2SWX1QNPFBGIxfld9}41W+xb^E7WV%{5F`Bv_OAkMJ@PGd?zox$ zjT9!l445`aC*vlxz#ThPWJ+!?0MU1<Fi~YLU)p@f_IsOA-L1;RZWa4LLY{}{e5=YN z<Nv-1al_HL;dq#A4cdV<fLsJQBYsjnIVAWtlylwr$k4Ij*@L@=3{P!{IoGK>QMpe1 z8zD?)dwOljw(K>9I<W^g$8Auj^*8QuufjVP-~7Wd*ntiK9kEe^v+OeEA2&<b5R%Qr zX0&y8wnp&o4YRjsJPm$D9HEfme-dPJ#LMi3PQxmm;iFGkBM~W_GEryeGBf$ck!pZ= zSEbbqf9aFQHlBrMWB(S*hYpPs;p{kQ9>uwhmS9s8ekgx2$=H&DO)936?lS66wo2@P zE#Df$j#Woj0RQ_d{oeY<^*fsC<!Pi!_I_usQ!-6*JrU~JY$8M3T&!Ek_d<k&>D062 zJ;dAmqDbSUyQ4Fn7H0n-D{jF*qv;5%_9o018FcuA_QPnCtQFlZo=y+q`+8<7Wjm#1 zf_22FxAZyFgz3kJ*46yKG_92%KupwH2)i&VN|+1=!;ggQ9|;-n3bWo7rhxuLSTiE5 z`FmkYOxW_SQ2G<0<XxfiJyXuR=0)$Ci(wh<#RFxJFFvz)#5QfHCuS=<o&G_Z!%#d} z`hkGk2QzJkvcdEZ1l$tEK~uhQ%xoXPM4Q+f=8OSP!a^((vN#}5XTU00G6(#L3<hk1 z#XeAzuruHgELj7`5}6ES@sMl=a(Du{4CDzG=U`33$w0nf$sL@XC}5zFLe?jW7?>hh z@&_9eQyC~0EO~>KiD?W>7c2#XhY~Xwn8`zCG2r3}%w}K?W!iYNgn_vXB<3+NU$Ep1 z<|RrQDC5A*zycnvoPmWLEMlO73OXmTn1Lm{1Re$|d8S?lsyJB6z%o+Rp~P|qR`B{% zGq94Uwu*t(Jhe3ptmO&Z!@xQNPoc)Z;CevPNiBzUfT+i<dJgefl%;S`PHg0G6CkOn zfy2!z+`{2jKuT&GhuZ<6ti%oucdC(hao7k*m2cv(8IbC=o5OnnDXBdiVnYD`$g483 zkHZ!~N_jtr2UK{F!}|cU2aO3IhxY^K4wfYR93BG98jusM9EvKGIK-@wI>oKS9JZ^W z0S=D<QX!9W7*t^ghn;|=oDhdyfYiT^aVV=W%ps-$EVP@$<A9{+6C9pYVGoDBfTXKa z9O8^Ed$ym$2h_+9a){*z3#~Eo_64M8YdOTLmi5zm4l&zekvDP(;|1uw)xaU%^X%Cz z9Bx%3Z{u(~V9}5<v4g{%{Mp1V4ja{Hn>d6qWJ&Gj5QdO4O6=iqFCZngkHZ!~8npX4 z#QTm#KFHyHfSCiW2_J{|v(U<fpTk3d)Hhl=6alGGBo5ou$cH&>2h17>CjuPe+&HCt z>nMjo4ig<5cB(MMVHaT0kSTGDL(Fd(408yFK00tyqMO6xYUl|LPXbOEawd8>#BMVR z*_t@TVIN@OU^vmwAxt)!%$azQ!*wPeTEk3gVm%-gqn5)uK#E+?;RZm`^F|Igsjz{= z%_`i&;Z{H-b!!`k+X3wZwTT@Z?gXSV@8Yl#FniFHXyULL&^cI}*v;X+fHdg#aJUzc zO0|!}7C@@+ehx7?X1Y4a;eBeTkHh;_=;!c|8o8B25s)&HIBWx?zHyktb`=IV#Cb%P z?@<nefR2HtL<fhRfJo|Ah{G;GYQbY1V*bKX4s(cUIfLCC9tR}loM7<gNx-7>rbG{i zy?|L~!iiHH_5l{2Mf-C20ASu(Z{k4?*O_@}jhV*p&GmrJv$cs@4(kA?oJad|xIvA) zk;6?YY~XM+VD8zH#1;;>0%o5zCAM+69WdvtGqHoioq(BVT5s**uo1A}Y-^&4!)8FL z!fp=l1*9_X;czdY<4jXxABQa}+|S_wK%|^F$l-l}q#PfI_XFC_coTjO4*^ojtsIJg zRA!08HbBbgFo*4clyZPWd^*cgKFVPbF#jytm%~mqa)`q&6&~XdlTuRbtuTi;jLPcU z&Eat#nmEDXNkCFv4~M;gROVA0_5s?@)F%2ld;pMI;Xw}9Svag=^PrpS0jYwu9M%C+ zQuQ2eP~k=nH>r^uINYp;ZsBk%Ahppp4!5hJJ2>14NNV53VWS$kiNj_NZ|&yrUNv+N zhkF63RQot=0VKul=kS0UdXU5W0I7|99Nw=&KZl1@*vg>@NJ&W?wgFN`hdFEqB;^D+ zJOW4+Jj!7ZkZRPyVJ9GUh7gBcDm=y^78$I`!W`lg0p7kG9_R4Z2@X#JQWbhQ#O@@6 zr#S3WVLyitsPI7!*I{N$#i&W+<5z{X9M-9@p2H0)+{oc36*h3VS%q6T+^WKD9Bx<P z4i0y!a2JP-Ds1AgS%tefyjO*LINZzOt$iG}sG<8gJfOmZ9NwowABXp=(9hu^6}ECH zs!-yvO@)U!Y*%4`LwrxmRCkoapb9%U>{MZh!!8vb;}Gjc_H39#93fz^o5SNOJi*~f z74~r0%i+ya9QLIN*?I3|<$j#M+k4mwCMx9o^1gI~!95tjzbQ4i;l^+j4pctA^32Mc zaLt<Ga<HU-X7fXvZ)c`EjHj)Me8Fh{rLn<m$RF5zTcA4}h(>#YiEi$-rWtaFnr;fX z4IlV`Zg`^JunGQCyP;srG36$^&#B<|)ivyX!;<@f1>uS5g4uDVcf>UHr)JlW&C{`P zdoQct(ZK1A?>TbMOD{*>c2u3NA2Vl+n)74k{Ih$8*S}f}=9+nRQn>f|6PMbV@Sddb z-r?m;RGt*=9-hxc?o^SRi59+>>AdP(7cE^rTDm4yx@M&Go@>r^Bbn<?Zy1|7_m*I@ zWW}t-1CBxQ9eeIz^O?0{j{J8Drk*c*x%QIz!to0W-!51_V8eOKp*dIW)5jdSk8eA( zZD_%T=@+tI%YVagW$u;2H;!FCI#Rv)ZEQN^&l?WL^1b+8l1CiNDL!92>=>E8=;g?( z{>$b|$6woZY0Jpsbywzn$Nh%;t=&J|_uYNJfX6Q@k&BYx%My#@Gus~8HaPEX^OQuj KVCMfb_`d;$UA2Ay diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-312.pyc deleted file mode 100644 index 43a8ff1e1358b146fd87488a615f8bf176002055..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1723 zcmah}%}*Og6rcU_7auOPQCcaACXiHhFkTELP>QOyfRa`UhX5D1)v|cU_BQKXcXmv$ z15zcZl-_)UDoW+vK)K}q=*79Ydnr;*z0uNMIQ7l!227>4v(lUQHM8&i<~Q^6z(5MY zDE|1ka$QB}6*pcFEmBTzgR+k-WJwOHN(HGZ7i0;^=q|G4J!C0Fdai`I1*M^8wBNXq zk%QE-StZtLz2=ZW6H_rv3uP=aPWM3BM+6ll3l-!w_)kG0D$y)?9wJF3bfrgEBRytm zBwmuO*q-`4+N_Wuuf6deZ&G+uq>q0k<sHa|b%~yg{zfvB3i=m3$D^y%hMHMZU#$>K ziIv4=N{E}qrfcC1r%rIutJXZ1xXj0137cTUvRt4*a-fOiK;?-+j1pF-Zc&Qr;}Zv# z19ti@h<&t;z65JW+L3n@OWKw!`Kh`s3#oAVOkF`4r8!zA3^OQ5{0p<NMr^xyVPysT ztl^N{nKT+G6O&s<=tvDzpExBNhkwun7fBF495TW%&gy!_s}j9xGJjKF^osQ=??z|D zA!TY-$9-lO9}+rld5>JjGc7{(P2z6qj=iDR8m!{EQ@Q-4?%Rxv*UaKWvrK%wX4iBB z(kzea)Gk(ZQL7QvnyWPer9!rvZ}g&^1J58YZ4AV>=p=@&;g^ZGpD0h(T8rJG;nq~k zZ)Faa+M@>_w%OrA`|D0R-$~?8Ast=9mACpIxIP8CZp%U{AeCovz*TL!{E$OT0m}z> zKgA`F0xY>yiUY;R1967_+_{50eMaZ-CoZPtjc|DulUzB6*VjkD^<I8rB0D*iot&P| zjI6Kc&X+b-9zBz?XHtgpzG)i7`MJ;`uz*M9jenp7p0{{ngwo(;l&-Xjt+j(22TKPt z?HldI_MO9_PI|197^82(qDv@o1_+eGYu(E};GWd%LkQRx&cH`*mlQxsZvM33xtoMC zX!o4`w#z(R0)oIz*dXi?ToXJY?n(at02D967h-KT+#;I30$efU&j!C-tO9oryZlTX zyGbkocAfSVaRF`_dPC^g`}kjxO<io%yn2a-7lG@rho1ofY`lzfdbqXr{bS(b(hv6! z-+yuIXugx4=_F<Z%FCI7AYm9TJbH!^qzt3#S#^i&{f6;P-E^Wz+%PP!2yO+y3(|&R zx~|7eW_zv=-b9UhH9#5e3Q&v=Lml)g7yRG?P2ffO0~Yqk&sUI!^7m8-p6G9Z_zwM| zesG-Z-@VsWZ+H6!cR%l{*=}lJ_p`1#cB~DY$ci@ETKNOPbgH1(pm3a|gcjGbJOon| z0_|it3e5rrw+^qo&^ja2FR$I<X|p2jcNsJRhbUz^qXse7sM&6ra?*(=!b%1A&#OO6 k%!hD&L~lYKe=dE__Y*~uq+ij^KVu`(Y-{c>1e4hQZ+{2C0RR91 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-312.pyc deleted file mode 100644 index 1da492128e72f24a836b7dd00cef002ad91b479f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8609 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 YZbg*$(E}5*juAXo_^+Crqh8(r1K?IB0RR91 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/console.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/console.cpython-312.pyc deleted file mode 100644 index e62f231df80d7dd76f02405ea9ae2a5193afcb23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113815 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 VscNLlTG%E@(^Vt=)<T~I{U0zwQzQTY diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-312.pyc deleted file mode 100644 index d936a60cd006b8c47ae8fc07f1b9a5f555608e1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2280 zcmaJ?TWl0n7(R2|YcDCX)wbv~^?|K)ms`|SL()J6A+4mXG0uaN>CS0)%3PK+vy_EG z&@`qd80Ce1Gx#Kg7%?#so`h##ihby2q5)$}#Q0FMm>8b?|C#C4;@Rwf{>!=i=l{NQ z=Es(nG=Wz7;(R$N5%L=vs}1b1H9vr^P7Gpj7O^>%vw4;0h`}3zCD@`WhPr4;wyeq= zp*+h%OtKPoQcc<^HD#yOw4G5i9O21PV#xEvNKo;n5G}7}Ysq}-5gK_uNWN3?P1n(_ zpk?Cylf&BKW5b6}yghpK5r=Uu$R4j&YCdHn=2_DLJ2OIcuga)R9X~GyiNmhrxfTst zV<lS73tGphV^F3~T6CgTp+PpX$Ea7e{8E%jBondGoB*XxC{a0ssJy|cf|15U8zL2{ z^a4Z;$&jaHBQY<ja*C|~jEs?-7uCeNCq;~`kpf?`Cg)p%6lUi$-E_|Vxuz<9nJTlU z;g=P6O3@Xzma*cyU{9N8sG~Sldy+C7Q7Y?9FF`H5LOQKL8)DPmV5p(BVfyaPhtCfx zLmR{H<P0tOg|(Sc4!cdq-=nxO9581B(zErmrd_q;G-1ewEb^FUv}-{*LZ@`7tcSkW z_eN_6>Ghl#@-C3Vtpb@*zsj7^QcQ^u0UjjUO$9`q%yDx>11)NEJXlDHu+_*7ZZyxc zR<Kwbh`bPp9<`>{JsvIvRe5^4Saxk%v~}M*Q#|69s>mF#=u?YMGu<BWe6w_lvH`=L zbu3p0&J>~SXNs0NSp?>lUFSey-~OU!`gEY8mrm)^)GJoZN>PJhhRce~ER~C;ReTGT zT9DK<(=mNbJJ+!Wc45`m0eN}tATE(c*UJmy<+jGot_AVabQ64JQ$=KO^ufRR7l;#t z!>W)O(6_crZQ#fHZE07zI>(V3nd4_xFZYHK{wnjIu`0|;ZWtb`H{*S7#%Np+=D3;6 zf5&Z~(VVb4e;6K^^8nISzRrIvNpQLvd5v6_z7}RVhDFNDA+#Z+LAF{kbf0Pwe+1if zf)sEwwt-K0+4CaX0TY7+qJfV>B4V=_w3N!GWoWVKi7*Pdp|Iz0c)O+{hFUxeVC&il z+vZpfW_a&{_=Eg&iLA&Z+y2?$CxeTbU5$=hy?CX#l<j@k)3@BS_kPdb?{?gp_+I^1 zz1z7wG<JVzY-!*4QqRP~NTc(``o$|3uNhytU%Iz0EOibqXNP~v4nOtq;2#b34;|$0 z?cs*@i}wa(&^NIHkqqz2RZyPAh!48~Jsh>AZO@-IEO~#8Co{;tEe-A@+{0~I5$^?T z5XMP_pA_NuJS@VHYJo6K{SeL=DAt3aT^P#P>(BZ#;E6|U3(s2YC0NWm1Y#35y^Y+i z<y`;$T>tfh-wfUuT*|$=aP;R~Z{5A(UYou?dt3aW?M~ZL?$|=6(blz?>|zLWo_ll> zJ2}b|??RX?OQD8Wm?7`~FOJ8~r|>~=ben2gkk&NYHL4csSxq}#)vY*^&@{s>0Tr>5 zfdG#&+lgD?iC7<q8zjss<Sc7JFA98CJqlu;Jmw`S`M8yrx)=KntPtpLAG<q#XCzb? z$KPwBYbBYG-r^da%8C#wue=c{4^y2@2|X(vveX^MvBxm<4^z1(67*39xbG-@)nva` zF`el!V}^GsNX$fEYlh?r5-}_x`WuQE)(;a8>ldA+A5E-!c)q8}H={BgVg>NwQ{!O` mRs@dY9+3XuN$)R2`Bi9tAdW7Hqfg{+uKV-s-vqjFk$(Y_5)z64 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-312.pyc deleted file mode 100644 index ccc71afda5473bfbc38a55d173f8cd5db696c8e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9248 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/control.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/control.cpython-312.pyc deleted file mode 100644 index d29fa1b5981771354af5d029a0bffbd17536bbf0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10951 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 CYE5DQ diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-312.pyc deleted file mode 100644 index 39a4f5658a79ce1caf9a1e30646cbb964dca9598..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10395 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 KsEok7%Kro8m=^5- diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-312.pyc deleted file mode 100644 index a9ad308fdfe0f220fc3a04492856496d7dcd9d56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1509 zcmZux-A^1<6u<Mav%@YQf-ME2c1tvNt?U$wK@&A;m(2p*uPl_<ZJNn2bJ@KxU%7Ju z7a_$&BZ(&3v<Wt?+E;@Q`giC9S~PmwMiceHHzH5+<h`>y#aPe7xxe#q&zy75ne$Co zR{}6HKYP3JtpvbtT!=_)gM&o|wt)pK!3MR~Dbxfei?--UHA&z)$(Eg1E#@dSC6r}5 z?x;02#4)?WNz@VytCsSvTuZ`EE539Z0IZ4tCU@E&5<pXE3h9nNxm-#MG>+WBhbBpj zG@kX`z_THJst$?1id@TE4Ro`m)EA&ZmN5+2omj<iq0N9&!H|%q*$y5aamHDh;NVSx zmqZwEQIx_4Alx3(I@oF31wdkv_K~OXFHhmf(-Jnsb#VfGB$*-trg(J#fDLI~BK+GS zEvgYZI@hHr!VU4mAsKAQ><(B=9(hEFbVX>fJ3>b%>5cHZ97VLmFQuJ!Gb5b<{y(}U zlP9AHi^n2#bVk+R23G9TM>(^`DW)i}YB!`+kdCjtTEWOADI<lU?_rW6UWzneia_ij z*RWHoh%{0boL{cjky}q8cfrGsL6GOBlT@C~Rg1JETP~EVAyl)4sZgS7sjRn9C%5R8 zYB^s$Uu4r!E?g>>W@xN1Rm#oKp6N@K%glp2hx)Ea(Xw|>S1#+7^VM8wR<BG=(EhoZ zY<VK5&*iEY$}>5=P|oM4O8K>cEAv-#?h3-5>p)h}oPm)sZ?^`GAY#L{gl`*!r~mr! zp)g!ZC$Y?)3-c+$d}yfX1yo@}3*8kO^ZC1Ah3lmSL@*x;szxEG5;Ow>opg-G+oMg@ zXtrqwi=exP0|P4agGx*h@Nc9z9r{|sbD+lFF<8+iJad_+9B2gEu#OF9Bp}FKf_Q}e zIj-#)7R1^Li=f$PUh|uz;koBBqc3RzB5=ev%q61^1I<UirZYFo!x~0rL$i=kcf9~+ z{3cae?Zv|^2fjywEygy%@7>2gK%4moa&jxbCm(yzbLL*p$mS%MC->yz`*LTmvN^Rs z1Ty14CdTj1ZjIgS+aA0=_{rFfliwv%yNU75EMq^($@h!z6mLGaoxYyFGj}(8`^xU< z#l615o?QI3W&3#g&Rd^fyLIi}$+Nr9jDFR-+js5<dF=1M;vo4-_%dHVec^eTs=DqN z$klbWNLbEnRk)>e7w%`-;vvT96RgZkyUYwPGwdH7_^&$C?n<l2VSD=@^YQrtYW4WU z<Hm3)g?$g7jpxRjsq0^W1C|QFrx-g_UvoTb*@kc67n#V{P;i#9eMu06`=H}K==lRY p`wN(U2u?o)FB~W*gqQcnfZVyY_PsRtvz&Nua$f@S5I(~${R7%pg7g3Y diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-312.pyc deleted file mode 100644 index e05013948a6001bf08f9604ed7cbb85b987bb90a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4231 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-312.pyc deleted file mode 100644 index 9511d8f495bbf5be2aedb6a18de1b17c9892ee1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1867 zcmb7^%Wl&^6ozdlrMdRXr73MREp2I}HWsh~A*2c_HZ(|dmyPAvLu2ZA+?h#Q7gneb z;9Xg<uXq!9gKT*Lq?Aop%$cbpv&h1ca{T+7(ai5NXU?x`wWNuk^Zj%8tD$MX;U)P^ z-HOpqAucsTd#kzHh34v5`;k*)ZCz4B&|HcdlI8`S!uoh_PSQJqPGe(C^O6<>EvDv9 zNm>%LoT7Imtq598(P>F%1f5OMf~0eT&ZlTGT4*df$rr*?zkM0a32~`mt*yIS+i>-E zE;1UqVdXUm81eBwrG%c>_X31LAum9V8bKt))aD)unyst+uwYq%-NTkOELm2MxP2dV z#j;NNwtqV^ZCNgHEbB@e!S*+S*(E(}_H51u<{RSldpO|C<k-hY)b8yv?m5Sp?z-eO z@QLkWY7THPFnzCMh7s?Q;92v@Q<Hfd?}oN>Y#(7}hF)k|Vwy{+Nj;})O5>~<Mih=u z2Kf3B9Q1`Y%x_aD2FWv}sC3AqBteVm1To;O*`j$^w+KP*PzE)V1lXP>9#+*17|i5h zPI@?u0&btFqgs{(o!Sg_Y}b#_M?yt{Id&%)f&!or!06b}hB5>^lcCCi$Cwu!Nf+lc zErM9z=^~ku2?iFx0EBAVz>+cmJd=T0l@Tt=K_%pYN(cjjJSHl5VEf*rY}^Gi5a!cn z)|46GnanJ-2>&2TQCyTxQYy9goln@|U?m_N(edzv^xOwW5bmWNJyMQ<XL3|Nu<3C> zRH=EWUNRKR5}1KdOPkqLW`JihQ+($Qk`5ysiEQ|`C{@G>f-&TJEcESYLTZ-54TMz? z6$tX80m@{g+#-8EKXfR@!TG9?h)In^Bf~O16rc1xI`I;%z}^tn#D9E=9xFS*TaD7N zxPRv05IUynM6wmg>nE>(EIoPJGRyMg<huWNkek9w)m~rGx>y)m89Nc-PfpkMYeUx? z@$+j<Jgy76UXN>_>!3H|FQ7L;*WwqTYoOO-AM`rtjc+TUH$ZR2JD|5fH{uFtx#o7f K^H*rqHva+SQGba5 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-312.pyc deleted file mode 100644 index bcc432bf603b4c6e9eed806f5557d9636d86dcc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3599 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-312.pyc deleted file mode 100644 index 25afa6b202f6998713ef76b32ec2e8ce39fdf806..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3104 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-312.pyc deleted file mode 100644 index 74de33faab2e253be852b093769bcb68d82fb0fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9920 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 M?J<UHr`i1f0qw%6MgRZ+ diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/json.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/json.cpython-312.pyc deleted file mode 100644 index 90371171ea9dd07982c62b08d22703ea3dbd5ea7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6057 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-312.pyc deleted file mode 100644 index d7b6ee802e908633a886105f227c2cd0fa242c63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5231 zcmcgwT}&L;6}~e&GdueO3oPa*vGE4mkWI|49lLRZF*5OD;~$7?NK&sFjn+G}FtEF` zzB7Q?%t}1?0XI%fluE{G(h#*$uu>`XM`|AWVCSh)U!W)gk8IUZ+K0StLZl>q>NzvJ z3&yAqt<)>+x#ynyJLjJB-E;PDRaIUBCHd<&NB-m|<V$Rni%??L*MPZ6WFj+Zl40UZ zhK;isSKO81;#`K0^BEy7FhpUf0Atv+J0r$LhR80NOM5cjxYy?Sv@he2`)yuGS7oZ> z)!WQ*#{(=mMP%_Rkv$)?&I#f*w#*AMUqx0c`xQ>{H^UIQN~ue6a`ja%9^51iD0Om` zT$2*yTIi{l>l9WF!q1V_gKWoCO?bywxJg*Bs)jC}@0CvU^`1C;df=4h>d8)7Tue<G zmU!AwXyQ^@vAA=p4(&nZ^0<;sDq+T|J)vcFEv;Nova&PiD+bqNEZ?wVNJ*y`n(jem zIHP0@U>jn+CwpE!HzW=9Ug$qP&~r{2>g(<A&A;1~qe@6Orqar>*2xjoP&)KnBB^wO z_^39a&{SHR?6}gI7&o+|X*H{Kj40~xh|!tVXeN<9n$ogHM=Fs~(^H-ON;a+SZ;vUX ziPy$MgNdvj>esSb`+ny{34MS232mIJ3Jnb?lkNL6&}nbh+Wlryla)eO6n5?QCQ&=( zV%rKd)-M3LNfZ)iWD;j(Chn41g_B+I<76H*E`WA<*{ui)XWx)m;XI04<`fa`j!UuF zml9<!jP^|NVV_ldW;{0q+TKuSKHL-1N7PKn&_a_GbP^gdGHGm;hK915p<L3mv53WC zm&F;%6~hv!VvN)5K+;t{J=ADW*j^6-xk*gMBoc5=F<EHg<=JHl?r<Q?(i&*dS|DMU z#py~qwIR`QsZc2NNQ;hW86}!Y82UssrX|PmqV=euq?KWs$aLt2njBMThpbJ)tt7xu zq7zDXBAQk&Md5QtwCthC!55-B-Z)(NSYlYwqd7Gfm0*~x(I{1uBhgVuHIdwuB}$T- zRSikXKlOydBIUjva5^22KTX!^n`XG{9=m$mvko$1xz%hkJuWMjTe;#e!q{Yj4(pF; z3_-vLzxD5dfX2uu)LRQkORl=PM`qq*3!KT&XH9OD-`wNyAD2Wia)ZAiBwZ>=vTsxo z@-tYgz!wCQH<<~dGuM5<3GcGk0~{%Eb`SeMtjSI=+pftC!u||Nx(Y&ppL~qJ&4MN5 zy=Yg_Tsom<^B$W=a|^p{>#(iD;^77}de}|t;oE2v5;Sr86cCG(6Gp;f#w=z+cY^>d z2Mfh}vT7x&<fxQUGs>m$tejS){GM&DcIzNqU7rFnO^O29z2^h<mbxhaS^d4b95_D1 z-SgG0wLkw+{=@ul%++A*)@yT#`P#+HpPu@IIomUP`JLEOFg6og4#plI*jFBS$Nl#s zr^+MyaAe<FAUNauVckvYdzl};4EE^_u=^+eo&&;Pcp!J1{XH)VciVWNVJ{kLHjz;z z$?{54Mw7?k!z9ZuNteeH=~9ndl4LCjVwY}Eipx<E35NvjhCT!2HldBkqqb<EOzMEq zhk#rq_qanvj^&%@28#r$1(#hda_iVCiXvaX*0_7#^-iJaLOy!rQ`hYh-*?uQJ@iz~ zBxeuJj9hE^mWMIUhPc;bC<yPQUDi)RwG{>9fP#pD3a<!wIkHgU+<<%{AfKQJCFJwU z9vk_*fPDVaZTG8Jz`l<6$TDJFA{)8@z8|8M=LMyi#F!FNjgmB^W}n1D+76pLX6Qlg zaa*LQx9$Br1qgVP7!@2Wduf3)DoDD$Kbr*P<)8u9FPHL@{c&l{0&n1v>|*j2sQ|MP zX||M2BiyFj6l_!xZB!9Q0WG$c@_7MOJU6^sP{mX5nw|=(cua2zRm1}JAgcVgYnD-E z>zZN(RlEgH1yyXG?u4@gR^UflTpA+_c(gE#u-sbCP$6`%Y5*2cBI!=_pj*{t$))jB zN}+TYF5=r3aNMQn!xGE0H{LGV0`ur@Bq1O=9>Rtrhd6GAewT0AY?zTJU@DBWQR&m< zTR#c5yxTG3z8`FybAM2Mt9ss8c>NRUwzSf8Y$ez|Bi;|}o)=dF;Tdi%(6AcVw;b3v zKe7^tLc67Pv3@!5;{OM;&>QZy`Co1q?jGWSepcguxkLDD7Y}qG?4_;HPxm0%i)0@V z%Ogp8S~GM>a^R^AdmhIq$LTg;3Uxz~;3|4Q5QM2S4{PeCPZzlWpiuQQMHkc$Yn$ix zytAvw0}nV}_mtgoV@o8#hN1^KFY#7a@W}@f2cPUs4&qL>Q&$`pB<PIjwCg5FA%bTN zXgEb?H+YDhU01mRGfWDs$!_<Q7hDE@sa*gF@b$9GC<67CVv@2;$H*H$h36bjfRA<o z+?O)fy)1@Z8*UFzJ3VF!+qyniUa26OBK63eDgKJcyvYL<-siKhP66hRmJxZ=NoY_8 zu-L8#=8E<Tp7&ukoW`|r8irhtb42!zBIs`^CR;g;$H1`4E~CLRw^5s(-}x$Iy{31N zg#80fl<>qAp;~c?^%M|0zS?|&r8Q+nX3Ho#x?Mj!IsdVrmxXda9LAmZ_v*<+&IzR> zkC?VR-<HVajy__#@?2Zm0Hzz5VdE$!E)a91AqxpJ_9y7Le<^4Y6nmL`sEkQvoQZU$ zwPYf#cSoENT`))Q05VM;27))tYv$aE`9=VO)xg2!z`?~mixVq>?$yA_<-o~1`d?43 z1O}JHLEFCbRb7ymWXow$o^9>UySt(&>&|<+5}^^Qq>i=b>smtwM6Zf*tW~;{PGrYm z9M=_1bX%B=ahTJ9W24hrLL!#~RHgWOP_!KYNHvp7tEnlg8nZTx>m)l5LtM^|S=^|m zX070vSI=LBoK5N*>OUu)eC0xa&yXdgF!?e7f^8ps377MvXu?kRbSvQOC6y%>Z;U7z z#a5-oJ9{8b8&reLg+hEpkK(b=z_thF2zDdEak>QrVn3GUhnQd5k<SqG-XO+2LkwWY z&X(!ZYYn?s8`_o|+NNK*?{A&%y&q~{4INkx9awBy33Yx$JbcTtxO0Y^QD$GqIM82z zFR)`)e#=BGu2~B<tp?kdgY66aN-#1LyVrGm_Ko?&^KA?4!r_IsMfY;>$9LqJ*jk|e zM*ipdwdU6OAAQvMVdwn*rO5F+^>>6j@>1j3S?-?LILCc1?kWahzhVRNSKl~t?a1s) zE52RRvHQN3Ro}j4-@b*zOTK+8z5~;-hrYn{SqI@T`x;1Y&M?qxY+%a*vpHJX0G|T8 zDPCbsrfmNOmj{3l{-%JxFbW(4DWS=kuClu_WXiRN7!_FCOQ?$>7eP8nuDC9eNhZwY zpLVj-P}$lyC8H6F$3(A@RUO=BY9P$pmt}{nR^aq`JKc+vdg&P$Z3X-7z<5A2PHGVQ z_fo1+m}c7(e!G)f)Qvj%U&+_(|04pblRiqN^>hrE?HAm6z;Std4-Ap@ZXna-pT4K( z`c{1VK<mxVEgW8~Uuk}EiEAjbZocY)*!_jrxYYFA=i>9<!=-#fTzu8n0`XK8-M~H4 z(OYg+KT8%ohh2YU4ns<e8Ka%wB%!NP@EnMt>zzP0Ur;$bE3lyWZQmM`sPIDkmiYw( zP{rh%&QtBmR0zB*bi(;FC6uFT)`&oEZbweM-Gnsk71+u?2|WN@IXQO}@e}MratXUI z>;XkoH@}scKDFj+nmKag*tKJGdzXCS`L<<Wc!>+!mKScY1Y;_vW``+S+osnZUsj6G zpdAZXO^~cdO38Wzll4d`^r9XdgGz7?>n_=h13T65Pe(@0Ceo4v3N|41;9%699XZ&D z<yeq?nf8a+v3(`XcqDc?nN>G^4W=PJ>u&=ox)_G}2kBiUy<fO$9&nxiBFzuT&IjZL zrwQ3oBez6?-+2Q}{nrG@cYEuR15%7MFg0^m7Tn9b4-^UTi-0Lm6<_c%RkI^=lgkb5 jMFRYSZdZ%OI<|^CUCeW{!6Jcb9uhF97PxP*vi13IwExz5 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-312.pyc deleted file mode 100644 index 6e162e08148126d0c7d464f5367cfeec521bb084..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20242 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 XIKTPiSD&2e{*_Rl+lr+Q6Bhp)Cu=4P diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live.cpython-312.pyc deleted file mode 100644 index e3bd5cac2479c447f9dc8cd3827aa67ade4a7f9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19165 zcmeHvdvIIlmEXmScn~B&5+uR*<(uGJ5+&IZMZHK-PfC$!Cx)ZI5bvc33J>O9&=k3p zBd4COoR!y7;#Bm;yP>n$TCO#-ayuQnvpY@fc;if)b_kJKz&F-JnRYwlKiWc;c9g3B z^mo3Ciw6lhNq46+o%T}rp67d?@0|0U?|l0AMMX9a-^8E&!PEykIqpAEMEi<Tfd}Iz zj=RA<#R;6C3vyoa^+8=o@70G4UPH*}HR>qM5Hy7fyag<544Ok0uO(#lT0=IkEmY_& z4B5T*P?5JNRO~GdIlK<QnS_F%GgRU&VPSKyG*sp-3%R_mP`S4}RN<{)>6Tz+$nABr zur*i}s`gg1uq{{<s`b{gaAB}6RPU`1HFz6X+#cjZjowBUE($h<n!U|BPS1^ULh(zS z;1G@P7}U{uTUe?SsU>2qSn-ZAmEJ1038fc0IPRKWs>kSb!FF#u^E<p9@XLapP^Y&O zEpUPhqwVr`u~Bw=yIHH{!JbgBx0i)0)RD1pWw0;Q>TP9Vcd$RS#k+-ttAblY+q~OY zxH>ox+V0)X!ZpDip`G5H)O)e)oz#+eOA*^H)CzS%{jG-dSO$=~Q{aV0p(&lVL)<a_ z^;EGePiPiegjNj-Ew!QS7NPweoeCs$h&u$2&?$5Y-EZiH9+B$aCiH6g=dIo+k<uwX zsik;#o#%wUALzWhk=`nn-s;zKwsYRW0O#E!c8T5MkT^7{uR<f@-ju&j*fNMXO6?c6 zYGsDGYr3;fbDZ~pxLZ7cyo2IyEpMTK<ERGju(+GS?L~M*91(|Uy(HaL8{j*puc{-- zc7<(P9c(_^r~f!RR}Eu52j0=A!lnxdNtI&h^!1I9Xyu5wORG`yF_+ts(>^`6v4pmM z!j1*(DZ#V=kcC3b#U6239GTRo=HZ~YN2@J&<S2ptdSMuS>Jax#e|KXGfIo(u*Ei;9 zZEH0PY!0;;n~$Bs&Rb7tDPF>y?`^C{NUyk#+XNy#C!0c~*AftWrvG$fD_U=dxwG9I z_f@O{{k$i=r@UXvkI~{u@f1eiEPhEC{GJi+9=3LRVJNH<_TJj3t!W15ul5=_ad7%C zHnxs>dZ+*S#&mIqHanWH1D;+zU?le$BWDGjpg*lG9XGF=*EMrnI9WHR*KyBqI{eM+ zE*hTU=5(I@pHUNI9)n^Ud0q@h71QbCk%<dR!T6LU`UQ_pDH@mj6XH4l#D($s8PQ`= z^hZuAhW+7r#d6Re4EoOnMa6hLAV(F;$(d*%67~mCTD%wqn30Mo#tFY1{fu@ssw+G% zMtu{Jup9}B9;0GDs0NjiRN%B27DS2FTAT^9dTeU^a3pd86;a8k6bT||JroFvr=-Zm zc|`0-XJ_W4qI4o~F%b6X72EN^^P*Z(sd!qHqJas2@Z|HNG#QM{oe-l_5gKK|nF&c0 z!w4Cv?-SV*kG;;m2m9dtA^4EUd36Hk)eAbWLC^~Z!6+JulS~#|;U;y0`6av8B-jMY zOGa-2d@FqO74D+WYdOPt3YB8tX>n2#<tcTJ7q;!^qinX}`J+6#7nFHP1?lkcNRq_! zvq8Va2f`TG^ZuaRs~CeA7EL_d(iE_7MwEQAh}jjC0!fU{O5w4I6qjKmpfLR&JO}5y zx*Oc0ZjtjLtbU7n#8T9k<D#Gs>Zk1l<fdzjTD07k4U60><)9_HTlx%6&T}5a*f`Cs z;1@%Yu%|$(M+u21hiXxbLL@9ICV3XURxCbWARLJLe835#ECwet(2CXPn+W=4+2@mq zHS#=v`EjssDiRX=LjI`yeBW?nVm1WimHVP%P&_aBLp?H<`GP3*2$8vPFyaSF^#Q$~ z?+XUb^#MJmBH?YlTekMefvDIs1KjqX7v;X0z)YVHU_wOdlL8Y{fPP-=otc-~(Ck8G z?y~i2JuXA0+y&=1m$`(?eZ_dynrIrhVqCK{eCn$D&L|~(YAJfz9J9EWjVl)SFD$JO z0M1RMry3C=_iSmNKmZHFO~YURO{b?nlcOyTHZ}LQZp@>XT9Bz2WHI`-PHIP3rgnJA zL&-)t8kt!rTQ?L+Bz7h{;9wLM`>WQMt*;inT=a@V>O@*jS7|@6u1=!j->0hrux*-_ zaNS4zN5dTX5@56)mjySS#<xu3c2KfSCJHsK|Fnsct2b#ulQy#oYGuGt*<XgLZqja^ z1^S&vt-HE7j|E&$r>_pA=(K)JqP6ju)zvl5`2$gPFVU`2Ouita+5s8+KdP8h1VQRW zX7=(Mq}lL7>AKZNS}nnmD1gN;t+?U2?zz!>y?41}c|6`a7{kBD!L`yoiIVagRoAO- zG+b}E&*_Ug5|uSK=C9AkE8An0?Q4}DVE>IH*N?<qtua^YnydYh2|!5$S5}#~#(3$T zM|y&wx*p54WIx(|pxy9cyXio``E9+_h?Fspm54*w9};~&#pd&cBEoEt!ginU>$Cn~ zD#z^e36TjTn?Tq7QMP5JK2#uWhocmwXvl;Z41&n$B#3G1%<N+uL#iWCa-5VwIRBfM zxKE6Gl18JcZRzPG2k-rI=KXl!?<w}ct~0qG6&Ot&Y>TkM6DXJdXh+fa;56GO*<1r$ zx=rOA;2Yo{_$xr%{DxJqh(^&wMFlHD1uSF}%|ao5cF`gf!7s+ofuB>f;>=(aZRa`B zq{^}kzEsdpRtRM;nZ1RgT__dJlX}7Rl2OBEZxPY}FO-8b6$|Y`1?r+QMxpX0lh+}1 z2yWy!A$?cDFA=KIMyXgvb+h_w5N9!=79m%<O^Z+m_;Qr5hhG7|0e&Ux1GUFz^}&sC zH@>06cunc{3xuYZ3cOV)*Nk%2LW@`<)~dB@A@s2od3E!8Pp8y?4*CBZD2mG8W!@j= z{j<?X&+Lrgj|Rf$d7|LF5Rhkr{&_w!34nS2JkrA8shXhCYqNo;@cX6n@-7ylSSFkA zP-`cdgyfKJK9Z7iJiGYuDKQ%~8p&y~mmd}<{j<TS%p)h&4eC}n5}ktIn{Ey~n<OH> zBP9mqG@{8>d@2)ifE@LQC&YC9{9GUyq|q}80V3E2P<~Dduo*!|<fsstjb<8`ne4-N zoQp()ISr45Y0$hs2(csVkBWQ>5_>SyHXGX^2qj{sMp^`4iU@r{y@0~(F<GdWKQc)( zL=6hv{Cs3q9aC5o1)4mPiumVJz#X3F_=v<m$Cg>7*jykwrB%gG2L0#LQ^UG9F3pPR zxlUD*B`xtCjA-PHeQY*#PLv2|qJfYo^N><_Rkot;Xk&|F{j+f_x7mTrj6@}WSPno) z$uk`XgCc}GswxZXB4J*<7y$T`Uk1ML;^d?_5#{HmfV=84?4eP4a$8)t4w5JYBoy<h zOP;6g)Dmlekl$&@DtI?9NBHNSn~{K3&ppS7u!YWv{H!brxs6gkG9%ThqBccI`hD62 z_!rd-p`A(ZzDP=Z=R5KX^f?Q8I5I~oHsucsz~!tNW>bk74iJh&_$Xo6B+!Z$BDEiL zd(#Bw5txw!a#LosbezemvqL)*J^Sq0Za$ZAAR&u#q&GETHrr<CBx=j*VQ%YV5SP_< z#}18uMq-p=(K-YsX-;)nDNwOPv1e~WCMzh`G!`n3>}3Kq$W6dPC?y-FTPe;RtzyfJ zT-t{YN&Cq;Kn_pNL2`!486oEoIiutdXP+REmp&_gG#n;VE-+rXXcBa!W01{9q3P53 z);D$Q&nqwL7xiIlG%a;$kT|JmwR4L&pJdK00>!8`_AQzbOP_NVEr_LMPXV%}&#XbR zSXu^+mTBo(EkZA%ehjuyi!B;ak6nwg_S2H)qCwIN#;|U&05HXA7;2fsJ@ze{5F@EX zjad;ZNylu6m1?mlN&D=BbV}m>x-Z>V>n)Qe$)Y^YZt90KTfvw_6Sq*Ghe(EI<tPz= zA-?|*PIhcLJrzn}7XC}rPlgJL*_Xn@LLc~t7I6YNha@SvDTH_qz~Dq8i7Bd;n*a!j z)=%0BN3jKF=6!Pk0f@=)4zeOxqZAbdhJ36j<1aq-h^^u!AtJJJu~~9ct%RNsEs3V5 z#^otwrzq(#W$z>Bcf@ig(UL5Y`cy%)4K*wj9Y_7?6XZ4|$$taqGMB97oK4I7?>Jgl zETb#!qpNTot%;geI#0S2O`ese?bql2diP)L!LibwsH|gN4bQUg@qOgiB{YBQ4vN<% zQvQD~ul~-LQNWh)^uTi@YC9;uDpB8zXwfH)?XSCTK7(NKy(dvWl}sIE?=^0vczvP) z1(E(~ZCk?bjN2Px_J&n^<I46!4-NV{+ZE$4EL9s1jM&oZ=B`FyvjZbkBf5q5gHz(f z1wJsD!&E`LWgs3gK6Pz-fqkb@*M{?rjSfI6%z}f>aVFte6p(3;VU`Oxr|Z>AFJD@* z)Nbr9Z2(4#zJ|bN-F?xCJw^jt_i1}9T!{QM4axvr0u8&Ulc9+dbQrRJOo1bf13)?o z2d5s|#0=SFDh^4Mb~3}ug)%mzT(o@-x$={6Qp1Wnnq!XU6-OTqUPUEwJ0G+2Yxbsl zCFSvw##l*X(#%=Qk~Yp+eaF$Tbb7_opdMcaP(_*~Bg_#YWYh2h`mxzGq>kWu1}fR| zsUk5cw0YNk(`hoB$yiLQ1Ta-OiYe5QCd3(diQlB|G$GEwf~BOE4&*OQ@HZ)+Cd66g z4O)4ofJl?$41|UTEI;3f(+nh2CVRw-I;q4;%8fK}&cNl=O<QW+CvA_?L6&`sR0pXD z)_qyzKf_wMX?`6TqSMVA(=t8SsBCWLq7_<+7EUT<GeBp!bzi2AZ*p^-s^(a){z$8- zjSGusXj`jfL6th_9F;m!rA}}}XLC<+l%k318;>{pgOG1i*}1aTIx%`|{E(-VF&vfb z?88_T3p6c^Pe{ioT1?Rlr<0CTVxc@0ne$D|N^(R}%6uX_Pi0tOAfh;DX630Ar}0fe zwJp&`RIDQxCq#D4RFxP9kf`b?cnX~%7!#v(pdO53P_Z0}aSjO!O#9u-0H+85_oPH9 z>|Al_tKOHr_qhsdPr_05>ZNa8N;oSXnGj7<8YpB@$*ad-J|4F>#_WyDEo=7nL@j@1 z`05D)U;Nf$qPhL8!8Zrv%|o%~q4%S!&BND>Yfc_)K`qu2v$rfiwPx>PjDlioc48W8 zt|w;q+(b&>Cyt7w-cnLcx})RQkH0pSbb>a=9sC^!|7rX7+rs<9@xe2(!85Dv<J3S) z0=dqXn6oAB?2I`(*PPvtdbD2u=3zDGZv31pD5(a8E3YDL)N98QuBv1ak{&;*(EuMa z4bLmZ!`lo$JWv7m!`;r|a{W&V_v;Y(sJv#l-}F(xfx_EN!-M7={U;G0Mi{>d(((Hf zM)@B|7&9B^cOr{DAOLB}6g^LUFE-{+pH9oB8YFbHsUYzz5X`i^%w*X#=|+8d2pus9 zM#$1+CR4B6mcPt&TB6N@C4T$ch+$<0UJGUVzDZkONSaV4U%&e|sVg5bCT(+`d6`a= zXsxH&^SntJ(s!-<1Y-^>%F|n^W|P_)*HwjRhA}d--Lw%x+Kbxqv?6cYq?Oi<bpVp2 z;C0^@omg_lNXprD-;3?2Ghc6M?0Mj)d)8HeXa-X@3NHEB9BTgm_?8C~{-40Nj(<#i zn}YzfnFxei{k^|MI5I8Np1}p)X0p-PA;tWBKn{@l+Eck+im^?Q@==vzn2<rDg(`C# zq7V~f=vXzaUaPC(iOZK#)#k`Dj+w|zwkV?%q8wDmp#T{L;Kn*EN_3`@&XRKw4%1rE zExz;=#fr6qzbY|FU!p|QL@*+Y>yLV@iwjnEAfoHbe+p1}Oi$9yJxDH0wyCl9Cvf+) z=i7UjY=dZ$BPS!<G{@}CYxdSeZ6irG_Z(%a;6c}3PsUoGTxlK25;r_Cr)SOCm1yr` zg2=tr-Ydg6S<$Un?e*IGoU^Dusdtq0Cu$nvHC=aVx^54@cl_Ps@quG^2971%wcoeD zZhxcrp35C~^~78~Yp%YO&=Ys{$6WnuuC1Ap#`o;++T;C)@AMx|m5jSRF}G*U-IXrX z9dmWx9H(NHHMoPjQ`w#d-4=6iyFIez-gOUGbT54Sg_}aWcj!*<P#T~+=0@3g&rqyq zDBg1-)^lRD=j59E6kX|k<N7yND!1N_zW2hve1Qr$UU$UZJu!FBFWh~P8ZpX8mD*JP zCdot0`oDNQI3z!DNQdD*e$;@Gu|<5G8Q)`>u=JJU<J%2C+}{KD!xG)`4%3HaTSo_t zKQRrrA@XsT1sNX?4ttKbnt$GEK+?}UOvkrcf8IkGKi_UTK9nm!k~qKwNZN2rfXt&v z0D%EEum1#YR(DI6%?_Co0XO|5|Kluh4j$7atluzXMuF=GScv!*ic{*RRQxYcM&{wD zSO2z`ZA$~d;21D?V5Mf~72BHS2}u1{3Yn$=TIY)sz9?Dtm?;E%6s3SAotwxObg1`i zlr0EsHp&dso#!N&SwRWJcDBc;o@&01BuOGihNIbkq>LGGFHBb?7?7q<Q=@MaD9N$x zq+=~2V}@7M&gTg7B)YO5?m}NT6Xf%)f?R>sLE-gZK0#0V?|{WYVf`mfM@jL`zGzxN zpH3@^wLBQ&q!q*3sa-z)#U&u5r!^!QRkfgtrga(l`~StYYOQO220BNF;>z?~3rWGe zV@>M`G`PHDJ&|c=I!_6VH9cqln`6yWt2Rc>&-B4psP%SUul{)q3vKJK(V&}1U!(DT zbe~3dTN3qj%u^)ogD(ZhnIz`~9H_Eo?OqqwJM%Iwa@aksMBS54l0%3fjS(>AktX~U zrS!tdvht9~qHDpe?(vN(hj$73EjZwmg^pJTUmlDXHs2|1UXH%C_~v4~edtd65O#aq z(Q?Ppa?AVIh9BAfjqRf&YdvG1ws*d@@a6*JexKGgE_d8Ia$9&W_-^o{gC8IL;OJ`i z$<?}3uNhvm{ey~s*OoMKy(e`mj+UgA>)5+dK}%GI?c4u|z-IeaYRg;;F%ulXuK&`j zOEt1D>!OHsj#@Hl(b79AoybY;>)OZzlc$Z$0h-!Kw@ugtTxuUyZ^5CNQg2E~(X}}; z6=b2tMRZM?Cx_t$8T4#Gj`K)ds8W$5j}Z4)$d*a&V%QNcY`9a{@M%@u($r03ykjud zF}PZ_=jy?$N1^^9>4#4gI(`e#FYG)P)Xr~QM_NO+j^haYHVy&Bd0vhv6=n<-7t@^a z3``r@jl$e0u2k1utur%A-1?pqvvi1}pqhb@%J4L^oy@WZQ4=+T5wZf=#bcSsss!c< znOo4zy|Bli-gF+v&?M3eNM1NO3cABcNZnFoYWRqt=)?-%Rm@dX$ICln<sGZ#omXs$ zR!_Wj`<>S9SD(K&z3OOOv5dUG3y!M4kDyFie^2rR@tmw(5>3k(i@Io9ve2+|(?eTY zy@T3PUuKrsn&iQGb}NvhDq7S_q`>(t%BA&&%bV(h^$V*{k%^D^doOK1{jj#K>n(j? z-!mr8Wi2n+5y1Q*v&w`Qo9mZPtEMfikJxI2Enlo=hI!u{CK=>EDls0R-LT_QOHxm6 zN0G0}dWOtR5lfJ1v8g|FU!)YMwlNEZY^SRcB9}7Vn_cD}7IXHBYtuh$UMp-%RMmaI z_VwC$Re!9i|916i)!>z*3GEDJur?$bJhatop{m7c=!X5e{k7spW@J3#;M^xiwcdNb zdVh`KgBsKRmRxx^Eoc1~ba69!z4=YjbedkG>!}a8lt-q@mW%Vz>wJn(X^E+O^udCV z`I3%QoOnirXG528MTb`MNHdq~_1t3GC;=2aExjR~s8pUZIX%mhpBjChoP0_q!E~!2 zr^Y;ca5|4-6MakXd~GIi!}EnR$&3??8lBK_;eU-<^0mijYSco~$xUFJG>D8ZKbapk zH8c5I%rnAhTHUCfEHd-7VI-%}Vq2yMT1Xy7dWROv`0^9~r+c`*$MeSZ6!B`QrW}f< zmCv|!qo-;*!5A#QWLPvz=TjS-GxPEccXj(_>Zhv*wEA-&kX#+hpFVF?(><1jwk!&r zqJGSp4%SsflTyY}z0BSO?*z;#7<w{rayB|M8>Qz1(iY7BLI)F!VV>0la}U+pLvCWW zTB*k#JYEsZM5L&vT&0q#Hi>TJGMqKbfMXJsDvl$k*h7HcRKwCYDU}RLQY}dT1PQ7R z%C2h3U?+usDJEtSrxYFuQJW)@gv&k4oL>q<oRAgRW=mlv+$&D#zXaG3rj=k4-C(G9 zhzAkUPPx>w+S<1e%01;W+P+|CWIV-cJ|&=UfS+gSx~i;O*+pAj%w89_cgO5d@BF3j zZQq)G54*5?c`@#2yW?m}>WfQ`=<d39-gRxkHK4mzRrmCM(%Jt`$CB|4$0zQFW#e0p zHyvy4{(ImI4X=~2cli-rS`{=9a}T`Vvf>_CbMH+nlsaSX&YJ`AuEAK>V7zNI)-}53 zJ`4kJ6oh>@xdj|7%b_TXmw4`!cy716*ZppHeCx?OTTdo%Q}@;DU%k)iO17r8TWv8{ z+Yjgde16Tf<&gmyNy<effIac;6E|D_viD!~-uqn&KH7r0Npf%=)n~f%KOdHH?&i-q zL&=!#m#*e}uG$+XuAf+GI{vq=6G=0rK7LfKHT(FHEfY*v_gE%T`<21bcEblY`=KuV z2NgRI{?NYPeyG9p6Zd`{Vjoqtj5<so?dd`IZ#r8>YfL{awjlh|2GgMq>rY$E6z-}Y zwVOV+>Jk39P)A|Afx-^csN4Fni(o#kF^#rZKjvAu-89;7Rtht?EvF?v^e7|w{WIXm zX8abkEDtZpIq?{&vfM8puaM4tAze&!$4pI<E1H%Br;9V`T1cba;i~+-oG#HIGrm^l z5=;Wm!^q|bo17P}>n^bea@kMh=&XR2@?AUDB0UdRmYwIp>%XWCs&hTHrnD4&)GzGD zi?s<+rl($-0LpBYQ#x>7)q%sP8_#J|2JACZ<UF$F-Z2=Z9m3d|+FX?si$QCc^|yZ_ z3i7JbL3a8enxh!$y_5nCJ)S(l$Tww^kVT48;^Zp?Y(gVqG*_T3L*vxlEQ%_plni-t z{s*d&e+&o57z@|8E#5mE>m9ygj9aQ=mZ~*N7tW2U>Y?pUVH=E-Zd6~dzRwjDjS``7 z*Q)yLhX$^^Ry7L%DT-Hh#;Q8wRl8zUyC9^(kg22s*Zh3zO8uebKY(+4I6g2E8yG?G zTH&K2R+*b~)~r~np-Dg+Mc*!37TyZ~AbhWS_tLSI>fJY8anG)pXBUE3j@@%q1M*Q- zcDctgscio3e*1wT!-qqrgBEj2OL<7zfea{I8{x5s2%dTg@7Fnr9&kxdlCz5(QWr^N z?IRJ=Dn>H0mv&Q}#21Nlfb6k~V!<@R$UHhPeVNim$vH<(A2~DR(56v}4)|p;V;(}n zn>0%f?OlnE_bR8mOrZgCXa`D!+|qa8yv?ZxMmi?2jx(njG5Hqg#Y^0MeUZtMY~uO{ zlBPD34eQs|nW(Hy)HNnrS`*a`3BHB?4Gbmrk9=MQ2oTSuui-L6123&!YLAsPC9PE2 zhKWxWQpnC#)+CE4RLs>iB^?xUaxQnWghHiUb$zmoLM{rGQ>cQg-I}bVkejP&Tz21V zx*1;S#A~EIG51iCnod@8w&Djh6gs8j3W}3@y{T?#_;U{41A~^3v=o^5<>Ch%y!*~t zQ_s?Pl7n|sctGBR!8%j_gCV`iMS!k*=>NcSQLLsnR@#>|A%%EX^-@o)q$6pjsD&%3 zTB?gV+mlv`+NckO2t9CGOkdJHaG6aV7!UQvY&xV{8vC3hKh+-!B6mc0RQEY&H#IER zC&_ysU4r*BbP3*r+8Wc=<gPMP4eo?i_${%Ttw{r7_pC)L#SJkl|Imb(x{xH^(Hp6d zKM<z3O}H_ehrEI}y~g3dM3gPRVj7>FK^ijm2LtEv(3PPhJSt7er~F}&9@836<9QYQ zf;02ssQ)5mjgxu0{{<k2Ai^>;f?Gbk$BcGB^FJ%fyZ9rxRUnXO$Ip8Bo}sKbwfU_2 ztYrM`S@m^IQ&STwfWte{w(}xx1?eR3=c5F!KIQPUM;uJVqo#P)R4<C!aKh#BYEz<n z2ei)bVX;(SJS;mZ&1W9+%t+$%fyk_^!UH^v_q`oiHK=89fdP9fo-R_=-hoJFDp4QP zvdZa&0Bag=ZL&L(0iF+tL4ju`WZisj^Q;CML2fd7#j0f4YH@l~vA(oYpgvutXSH^^ zP4$J@BNbUOOhzJ#;hbM0XF<_zQFL1s-L{1npTRqt3A_sm`7fxt674#chh-Yfq$Rcn z^z;EiXg6e01q+gd9%auGrUHUUZ=$vLA58d#)@yDGudbPHLt{%kI)FD=lJ?31;&AUm z$B{5U37*u=KN~oU=U3161<q!%JoS~&TtvFCP<Li_Vv2{U@3SF1#|848WgU>8?K|7s z+q+PE3ab#E$J7y<6QEO<W+(8*S(K4WS5f{D&}X4I7Yr}JjqI+<7{wSCtSVMheZ`|R zM!f$3;z{$3o-)O7W^`CFoOtH6Vi<V}&QoU)-TxGvqo<xx3<t*!D~7|z5Iwjb&XF;I z3?DnD7)B4AQVge`I-nTFyvR85l`-TFBX|7Eh>jmd#?xcN*lYV}r<MZM@EGMh?8|}n zxJaLfekLH}{GYr|-zR%NBYOSW&)@|1Vb3iTgV?hI{Am=BX-7r_Q4G~_CNe8ci2T7> z2{OdQ{DNy3hV!^=Ck~%UEy^jsVCWr~Brbt3xmPhj%dD6nRj|kJFe#kJ?jM&(lZ@vg z>{&XNk-gYf&F)DVgAPCiDoezBlmdhagtR;o9n)2w#+VLce#Ai;>r(G8o}s9doPFdF zS5%o3W0E9mNf*drVvB7ONah2AU7Tn4Ac|SDLm=B5rI7G6C6TE1`;4jXr}9kcN>ZUz zLk`(nsqBupG~UO9_(VcL4!rJCtV9p+2q-8^uM^y#kn=r)Gx>>JN^ekt`qXxY2&MF= zlxdVeE2Tf9V1dlYrSyGPh#{`DOkuNM5PVW(PH}15BwK=_%T$K9vSQWnLRM^SSZXCd zLM74*<dD#SR|`IW7|#dU8skYkWHrJi#T0-Lc~LP0#jxVQ1A2P&rB%poY#9c@W;7^@ zGk743(PJ9{K5||$5=m4Hu-+ge4g60I#tS0upKR3giAZoZ6h`$?F+^8V4CC;2ABd(D zX$>$;mM&BO3MSa4vUG!b+({0}8ILW4>bu<`>AxZhtmfqZfa6EfpwsC-<!ry=I%8bt zU9RC*+~GKPc$GW+cU;x4xMQo_vAbODU9J)Te#Py+%T?dyDjpU%bsg89e#pUl*cLG8 zYOV|}RX^k?l>CaBGup2#tQx9*X)O7r(Q((<@GE0S%-HdF#@f3^{;sj<E(NOZ8tW1G zb#eJ01ul>Nx~MFvw^^GYa9B%l8huz(TwHMZ(0!gOD!taaRK9FlwYOa!Nf@nvc;dwq z*P5@%O9$7Ce6m1i9nt;T0+#&5s^!Uqr9ELON?6(wCDkh}12N0?grzKDDgMM_Un#0v zwLqvTtSwkEy6;zW&hnLV&#I&I^5M^ou9AYwNA7n*h`4rs%?fFt(X?~9GqHOQq|v3} z<??0u=E3EQZ#LX+U1{7It3^|LeqCO@wCy|I2VA{%=arE}efv$*yN26G{#9|TV<=X? z_sYq8wfH{<YKnGVvn0xDmcDVPtT*ARO*pHs8E@FG+m^Py=17z^UfXeF==#ud<MQd% zvW}Zu?v!;WTs1e2T|f4warrBMUQ7lm2SyU*P1l~jarXMz@A#JGSb677f6Uc)-=IIJ zD_y};m6Nx>vH}xe=id7ToU3xB(z9CD`SzLHRquT5eSfTH@13%}30GU()fsbjzCEzg ze<0pJ8tWfj?LV^Gb@XRjVqGWJTw|ZO>o8wy?(Nr1_nhT%Cm(b2D~(&%oZAwa=*~6g z6Y1!3!<uu;y`4wmJ5R=To?PAerO!D_Nkz=H?fTcQO)d$`XJPY8=lO)Y9vX^I+_i~@ z?we;;>bE4io_K%TovxubTYo(I&}68p{(G~zydr5pX~>-=HF0NS%-Oiyz1;d%_nX}} zXIGoH|E+V!=Q}Z#_sy8>M`kPzTcPAhJ!h<bG^W=Q9y61Jj~Ye>j@BFgUA^gOyZL_s DUs!OB diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-312.pyc deleted file mode 100644 index 06ae7d3831206c766c9c40fc47a9baf909d7d651..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4916 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-312.pyc deleted file mode 100644 index 225373cd3a5d2381071fe0d20bf2cbdd73cd8907..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13576 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-312.pyc deleted file mode 100644 index 5b7b34a02736d7c4b87c492782cf590bb5e82496..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9320 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-312.pyc deleted file mode 100644 index 4f05230e6e53eaf91ad3058292714a95210841ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6398 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 C<3k$& diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-312.pyc deleted file mode 100644 index 55e527eaccc8a13c8dc7c27e7056bf68ed60fe0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7156 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 W)VI1XXZgl@<X`ClaHzDVmH!J%({0rN diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-312.pyc deleted file mode 100644 index 77921eafab9a877fb555903d68ed1ea16cae93b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1842 zcmZux&2Jk;6rc5ec>NWJek2VvXhYP-2E|T_K%%OU(ggJuAq5WgWwqX!#7_3Z%xn_Y z^bn*R5^+d5B`1_4Rrn`*<^lvnv4~p4sW%r#D$0rXcGo5;%u4Ugym|BHz2E%aeqShL z2@Lz2FB*4bLjJ@>e`v|1_cu)T2_;l=h%413H&shXxK25;tJD;Uq{ux&<!wS0CLKW> z95pqvs$kWaI<RUiP19>7Lik5irx{0gGqnsv(`nYpy17~oqp{pk9E8-eEW0|EEY2yK z`!0VZ#fJBYM8NBfbKA)jB4zrK`rdF?0l%YE>?Dz}5EdrMED_Qs)O8=Cq3v_|KG~GY zL(kEzoa)GPcjr4pR$T<#vICa|4WE`JFngh$To)-dS@hn9$v$DECQ(vLQK=>~g{GKF zWvVPIRNYqksnxVlDQg||V{3)+_UK(pFvE5%A&h088<x>Rd!>`MeJ@~M(9t*x*15N6 zCnXH7N9cP>bZ;n?Q|<av!{0QLV@A_UB4x8iGUoV-xII{*vF}`hI?K0>`S?mB@Qpe% zXj8NtD`d1XIJ5YOJW6#G!JK8T!_5M7GK@2~+VEXgb*(^bR2O`E-G$6WHDC@~;g&ls zf~LL3_%!u5J;%2w<JAr3ZB(6Rz1j)^T<_h=?5(P325h=z*=qoSsJ5D|stIn?=T+Xc z8`T(@RtO0|rR{8lU<K!cT)red$cU8F9o;lN%Vnn7$(p9?({%^udDHxC-Exwhv}sb` zHcgHwc4Pp77h%S8D27oCp-A@yzP7jlVw?P?OgvLBcT=jGKbY?lP=^bDq3X#*yYd3< zaRfYkfiid(j@}H2i<AMvC{$)D5JuTnYFfOexYl5u4pk^Dw-kzixiNjFJ{3$DL4(DQ z4X-W&%W)Vrd@nMK$hi`|7SF(q7ifeOifHtHluMBG7=iBZchD;CzcL;Sc9)=87CUMy z1RSAl0P3dO@_7JItI>1uJe*Bv5~11A%xI&1>0BL^*mebduYuSizZb_2rjCnm{aP&j zSS)=zdR(0SL7$Bvz1RtZ5^ln|ee!^;4vGLnGX6~%njL#(0&t7*0gfcttqXvy9vV?G zmBq5eufy^G6cACQJ$ycUq~Iv{3Z%;xd8X(0a=W>Q_kPi@M;VuO{u+k5gyJ#^tdw6x zft-pj`akMnRE`4Ai+4aE^=7+@q~1EPy9Css-9y#YQtCKT5!B(rDXN%&cpAIGwVIx3 zK1X!mPd4OQYs?Io2u$1J_-{)?_Y2=)pTJxbLFh2CSRU%gR^8?Za@-_Z5Vo4$N}P7o z7*UE*d2gbZ0V4W&VJtp@Cj3_e9eC3VUTLi}{Z8DPAMz=1!ra6Lh^{P2(o-^dLPk!t zjFjJ*KP8|}uj$hG!yBgrRCk0Z`JMJp^4N(|I#G;2hOU0q+`9K9GrTvxJAOcS#*Z_T zF94a+6TP@s*e!hR9gp1nS)Y0-gAI`@b#p{{{bjblJQK*($HmdP8Ts*yI`={P9~rEf A82|tP diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-312.pyc deleted file mode 100644 index dbad954bdb3c9574bd0fa6f6da005240d204afbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5336 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 KU4*NnyZj$QYU-N+ diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-312.pyc deleted file mode 100644 index 581070c2d494afdd09eed1c55dd6339e8291c77f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12119 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 W<t5Q*!c5`N-wu{Lh%qRy^M3;dcYcfj diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc deleted file mode 100644 index b73d3e31f4bf7ba4f876c15a94d4b807df4b7a10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40078 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-312.pyc deleted file mode 100644 index 535bca2d18d626a7525b215bdfb84090ce7d034a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75100 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-312.pyc deleted file mode 100644 index 4be3a2ce82dce7d0a13e5bd1e8cba16882f307a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10411 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 E07kT+sQ>@~ diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-312.pyc deleted file mode 100644 index e2bfe66eacacf8e4ec3988a67b618113c8ce91ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14803 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-312.pyc deleted file mode 100644 index ab9eda9a55001bc58ba5437d678e0e9b51987473..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1814 zcmZux%}*Og6rc4ji`ljLObDWBv`s`CL$Fgm+6tj6grWphiYnkztJP}R9qcvxrI`V0 zY9tOlaHuMz9>SrjklI5cu08aB=!M8cr6Z!YYA(H@KrcD<&DzFR#K@j`Z|1$X@8kF0 zZ|Ss#VA(%@T@2e0`bRL0rPPVDFMxQA9OOtI@}<1wC-Mnj&da`%S0r(t@Y;MeuSy6j zL<L^<+Wllc32#ci!)e2kqhf7EaoWF8^1746DMxiWfY*Rem-S5QU-7Ao!sVHu%oW?B zjLVCd@$}N?pUs)G59ek-oqzNoBk^{Z+MY$}Q;Byj;K0GeTK4c#Il_F@a*G?7xTUf2 z$+7VXuSA_78lPCDp|j#f8zF{E_?0}mT5?u+$}VDi)eM(Q*k)WMn5~h(mg+H!L&Pt` z|11yNW5h1rDu^ZEDqaV5>MMy3N{B%YYpVj;YI#e&@s?=3EuxIPIWjAJG29iy3XGaZ zhHsUPWo(c*NbDHPWn;m$i&>sDO#*~z^6olihXD;eY?>LFYc6#I%B;Y~T&9fh_M$~C z#z;mYI=Dtf6vpc)R}6ie^DRc#bDxCvnvVlUa}0a9KrDZhGS^<kWYh^a0xz^6&$)FR ztmiy;ITw{#F$~7D?~moE%kXGq*{fCo(_G|6ITOU3kmQ7mxrl@;v_mf&m3i8wW-S;| zF>(dm5YVGzux+Dr6?OFOPXF9jO%A<6iH^w=y?1wdf3T|Gc_jn;Qm}{bj92xE({`mz zJp(PowHAXNaB+G0K7fz`z7oI`;JYQYmf}Fzfwh%j?KKJ^D4pCW4<Sq#j#mX8)FD6% zt<o%RAt7?1rL%NRM_6lUEh5&{ylsACOHQDQeBlXVJx!^G?v_$fDv5POq##pCl=>PH z&9kC3WFfxGV@X{ai}Y=QU2WK@NZ@ZB(g00m^Z6_^V+$-<XjpYniaH8d+Lq_JLBVL? zQs6ium;$1*nr6V7Aq6@WQ-W(2&A43yduGa*F`|%xh6~2Zts*svnw^EXNn1?S9;b|@ zqUaR5<}o8&0m@z@)LqA5=}qUdu^U8$NRndfge{}<0RV5d4&JN)Z?@i5MARQz2{Y0w z<V9+^W<Hp|e}8Uae(@n!2#%o53YdvD;|deQNVXh@hyjvmBmF`xw$dFp?mDz6!;T3i zxh`g%>0{_9hj%qIV+t!&OcRkYgNTCjj#yo2kek4ZJNg}L+vvYu)b`QKn?pYh9V%B& zw4UAJz0#4E`Q^P|hmXeQMDtAjuz92ppY&bZ)2e;94pX;I`rqCwJsGa{Pwwb{Ts6M` zaz{HEys@`g9UR{2I@SjdZ)Bh8+2d5tadP1I<n?FC>wD%=a`e0pfwiXj=VNo{{V3JF z+qth*^^rqmga|M_%5-uSVgOtaF+<~A5D^biVS_my&<F-^oK7+z?nQ>kpm<c4!_bQ- z1XpVnj^llbV$*RhUMHvh&{^~F$K*Dsh`yxvU^|s1N%|Art)jax&|81Y-7l06|4QH6 k)=pJbQupOk1jiHQOdO}Z*Q7gp@17z!4u>Ys#TkF$f7&(4Q2+n{ diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/region.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/region.cpython-312.pyc deleted file mode 100644 index 0e52bc667260acb81e0b9d26f968dbb56162307e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 589 zcmX|;&ubJh6vvbKwPkH>D_%SZa}oyG4Jy4z@l+HP_8@whONf)#nb4VJOfp-?9$Ufx zpf`_#_^0>})B!>8<V{$;^kimc+Xs31yu5FIyu5E)TT|pL`*c!#cJr@3xUz5!t9uU4 z5l0-CsKP16$V1N%_s$Ua0e|&JUFx+#68`Rk1b5Q~tAM|1>JqXsKl-&8tscAh905u( zN2&MP9iI9SK*+s)ml?>vrr?^wp4upxbkR%5g_7^@AHboIU}6?)$Sjk2Q!?$i&&KL7 zwgto{(*Sbb;ddQwyYN_WTXazYA}{PBiMkC+rF$@?-IUTw@uuu~lhU^hE7zF`rCeoh z*%#7w+mtdXm1WjlV<`QCR(*w+k`$@}QZZ|m<UnOj1=1Q~p@dwsYG$m+jzG`2I+mqk z95h*iT#{0}A$4mDB_GWnJS0X~nAI#hVmTO6i<(d;<4O}PvVx4&&Ffb8T^d~Az}#`} z1Nt89{hUlspI!{^#?8~`7n|E>FZAw}c9Hm9WZPQET=yLrPub~d(A;u#xv@Wf#1nnn bh1d<#!yg}G`~%(n8%22MWBL!dY1s82Ivkzr diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-312.pyc deleted file mode 100644 index 0b0b7f1bd37abe408021b7075a991e7d7c26632a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6648 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-312.pyc deleted file mode 100644 index f7565715dd0a2eafc7523d3d1866e658fb64c34f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6590 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-312.pyc deleted file mode 100644 index 38570e0501ae22a356248a6c9d2d27db52806ee5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3852 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 NPc}Cpq2Jr`e*i@}=Ys$M diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-312.pyc deleted file mode 100644 index 82404d6193030cbf3c250ab5d492de968e8ede3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2506 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 F{{fjiRSp0E diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-312.pyc deleted file mode 100644 index b9e3e31de1a848fd8e0abfb17d242bb9423c3fe9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28183 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 Qe)YdGXddN^4UCEZA6@yr8UO$Q diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-312.pyc deleted file mode 100644 index ac1b4e2ba0b84ae003aa9bba8250056a636acd30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6086 zcmd5ATWlQF_0G=BK4<N<y|&jI+Zj6#dr4vw9(h4Xz)nLRI5aUIS*hJ_c4qB$W*@yX zPO@fQ5Q<u-jTGodV@g_#ii9Iv!AC#frvh53Nd1YiX_iqUf&jJrZQ`gvzIx7`omtzM zuc}h-YVSSwb?&+6edq7Npr1fV{r=g}r4S*XW5+JRDzG%i5ptO*MBy}&<>Fk{6?bL% zIG+{bLRO5698p{fuer0HxQD@l=FR%zJ_d`LKO2Y#80^-hY%m_=h$_%V*yGXavi0%$ zY$zVeHpCmUjqygd&Z{+L!|^ajT;w28eCLVcf74}A6K_^ql)&j;Lg)lgBx$YLNIb%J z1+}(pG#+JeowhF99&cxGz1ETKjCUe7H46Xr@b`@Ex35`i->iaf!hNv}l1n7z8iD_h zqJ&K1{^k<aLHKu-h`mk;%{AEc%{AK4ORkIU0_>e6N|Vww7k-nsu*SP#cPISY)o!I( zX_;%aXOzfXo4xyC67TTgSrH{_pTm)hzT&!+i(^>Nk_}`#(YdqGKS?<F71y2PPm;4- zto<uIDkhpjDybW$a5Mw8_gKNm<a0^Q3=W@s`aojf$pZsN4h<bN#b<Ib{uN$2#+lv| zPahf@I&l01z=5aKq&`m7teP{RD-I`5X(|B1uzJpj38rTtpVRZ2YSvW&>j>SHj;lFE zrN>o$Tr<o%tB0G1iv>jBJ7E;9PRe46RZG>*((3?RCMt<@3W>WEF3$Ui5>a?XP{b=P z#jOg8NAW5?RaE?KuvQ7EZbee~v|kCH2QBoG+D~ay8qW)HuTrPfD<P#pkyKyWtu(=y zUkS5)-n5`JLqC9e48N8u{CDt+s+*mJr+Agt^X|A*<YQ6ObE1&R<y4yd0vPzXtXn-f znagC8$nQSCUxxBH9ntqN2z$9?R+W2ogU0sALkQ>7&dy#so|6kjV>F+Ww`FCTNsabZ zvBvrw3<gL*?p?{)t#ZC9VnF-2OqmRj>#~uTm5g4{l0`Xb$i}D&Xh%j3JQh1P(MXY; zr!tCHHj0HzDyeD3Sf4zorjsB^9T9bR*Qn4@jB>9d%@q`|Q8^9xZ2UE*tiU*w&#B9B z7F1P{d(&DzX{^M@Ceq220Vome_n_O}cYl@X$CDXdUB>n!YViQ2dAdhFl(uA$(Q`e( zh8&XsW5sx(kf#Pv@ExLci$;?SjaYhG*%xz}BI5xxNS!I5WK993L&2XC+Kg2LRxMDO zZmJsNG?%LS0x)nwMEGNW=_kz3`iKD?tCTp@xk=H$HLR3ehTDd1UqPD<pFK9l{JGt; z+LFumAUUq&Dv^YP!Kk-a8b~cGHT-yXNmN|e+Gl~!B~b!6oD-Mf2wND~E`IqgSRb(G z6x?lFIw|qcvm*^D3DB!^R$|YgP{E!<Wf8oeQH=?NY$UXvBZkdYh*Tx+71!^ad%wV) zB~{-j4ox)X@{V*-!$H`lJ551yy6Mg243(ZqYX7vUh&52WtLe41$Mk3POinkFxs+=1 zU@{bMV+PVRpG{<w^z?XvMqq>@IaI)E9WD@=O4D|P{ji-H2_utLEfrzfQO}4-<noDp zI<2dQ8BB~9l%%01n0Ce7rl6}@nzkZNb_7!|w%1eDR~?0mK1P=B<@-nTS+yS=k$$Fs zFrOMnN3Qo9s-}*>b+_q8CUsh++m!s-9GDw;?EW)q?o7XyIn{4@pa=W5KhUpd40T%} znL3>uQT6^prqG{&WlEm*qjT!79^6+bn%+brlgk*1#6;+X<p}%i5s08fpM&aoQVH?C zJvUl9r;V3#QwQ&QNzeAT!++8jH$QT5@VeAKFSSn(FG}6-g)2Pq1uy#Ux=HK0D-XTS zzr1^9WOj6Z^Uj5qUGFwrYk6c!xEQz*X}|K!%)!~i^BZ?AM0UYYu)L)on)-5c6dJ$X zY>rI{i{AEfhdd>G?2UeNx0Qq<cL)cxG)Av=^uI04p1Zbg*Fxj&Ytrrt599ZA)Y=z( zPc)Mcnj=qa<4sS>ig*-N*7R8ZR;Q@4j!gqhQ0g1tzcd8Z5s1x~LF>n=c?AqPrNoUn zTI&pw)tSg|xXT>Gck)LbqB}PPZU-C*Mp)B3qFQPc<LPEVK<~q93sgGd1udYED-ko4 zNT9G1Rr*0fk(z{7&TPlcGF1N}-+-{(q`v9W=?kZ)d#*?Cn~&bN5Z$^^w{5|@?OPph z`ND=x+={C^?(8_se&4kf&UQ(Ye9dgf5aFs)LYKwcDbfiNa}80nd${j5XejzSlLs!u zgjEb+7Q$!*F05ih)=F&FV1qNW0}$&Qp<+A;g)cpO;o0f!zxvsfaHBqY>A4HfO`o0h zyd7Ss-*L^mV+qy~@cUrTDaR|pkO%%KhoxV`C}Re6R+r~Ja7mJIhOsy1^lHEa+!bb) z<F8Im0MlV+4fZMA1n4mSVczlk%WwiX>8iyKScM#2Rg9X4c6@5h@2|bb7Vrd|$|4CF zbG&yA{W(sD{8e$y@pgongorTKSX*I3bTf-xj<u}f*_wNRtB%dF_~Aq?IKzon_6Z<w zP_+}pK>y0h+N%t7y{s5s8%n!u`e|2<n`7wpR+SR3h->4mDY?;MZyM{gp<1iB=R7ud zCxwzQ)>WIcA&jeQ-O#3zgIEj3<em7ll|!z`16gt<k7U5h%c#=TbPCOAWgd$oxS*P@ zLE1Tty-ZHlRq!+lq)dKXgXK8Oe3oTn)*yN@`(>~yYXuBO65>g2q?YQ*EJW6_MJpBC ze`!BOabD%DXo~E+$H^4M1J4alA*m>U215A;7-6Xxi^CM{n}u&HMDq~+O<q%T7Me{s z%i`>Mgk-2pZ&KIQEF{$wYzj<%gk}`e1Naj(e>NssKIkE~(vId3`7yaLMFTIYql3h| zTP}%tv57j{8C!1sQCOnG`x$*tBauRv_FdR_Ezn)=?4BCDc<fel+w|b8$6h`*-@Ikk zcx&S7#C&*n8CE@Y;i>5#%uC(3c~{tfOA1|=<atTHExN*8Q(lOo4b8af$b}<U_~|EK z3C{7egKr(VdSsz@*L-BxytMnh@ZX~EM?ZS}hab|rysN=KC04v}`t?A^M}dy=hAmTr zi;`R=qTJSTy=}{U8w_4NT<+S4bDg&!R1|+%EH_1_j@}5iP7AO4UiQ5{Fc+SAWHH!( zqp9`s-k0{yG|%$0!*89udUBy@=QU~P7vZ+chhI88^V7v}Z0bN+YGC)+G!uTK?X|W= zX$!+f9|V?w&tIAKq-^U(uYlf<`P!cY0KS%^TMc_2dbMoPwgJeSQ5LMM<r_;*kb=A! zJ+$LrOD^hR-pJWs;;EPAvW|}}az!rYO8x>!c!ni$I=sCMnmILYs5-v9l1>tuOhe8o zXAF5XsmrHSusW6=s>(9+S;O%DFP?y?$p4FHAjA9LJ_T34EQewq>KL+R^<5zRWjcih zZ|4y!HEmTM;kNSfn%!FcAH#nAF{qv=x7)#TZanblJHvl{aPfhISA^@4-uX!HY<Mx! z_u()Y&7n^Mp>kU%nh!!<o2LdpmO3Hjl^QH%=a@^2xvi8ABQVSBSh7hmqEdVt#e$f1 z<Fhl7F#U-{Hm{6p2uq2?Psfv5b;grODESm5fiiAHwWZxy#jxtf3d25q04tVPJps^F z!YE-GByGYetdJ7@bEwXf+b+N8t#p#^jTKL`*j4e9-mT@<=$#;RZq+qZL>z<!a=kqr zicAOQ>o-;cI3bZxa|M@H>WIH?sUD#|UhFHk$`u~lEswDFmalb5gnq>@h&$ONwm1px zEnj#^gtj8dV%zk?6#~t*O%E?&TRF@DY2}_R<*rS40!?C1l@^4&ko;S;_^|88u6W_O z3R@-tJ$HjJZrvYmja<$`G)g4!OPH>yY5^n5KwcZq=5!o;I+;^70N``m8F2O^6bzYS z78&E1iVZ{BE~VJ|L^?y^lbl;US4id*_~vFkmUL4%rH!ljRl&#@@Lf$hm8TFN6U@NA z!UzZW8>yP6sy>=1;0%kiBfota%e(uAVjE01e!0nwEPH-3aie3Rn2(x1cuul!R=V}F z^;C0SO9l4hI*e_WUEtexnFiuZhw0tw&l^lV25=UGA3X#WzLpqw=wa-Ma935MM-Ub? z;1NBFpj&6(TTJ1!S_B4AwLnb?UgZvvaAm1VFw=7#o%;PuDerk7we<ZlnuI}|(62)U zuQ!hSl<fVO?ER9gze(hqByy9qe8z`96^0gsp__vIwOir1p4;%Lfa|FY@kEfOCO+cZ zZVJ&a1^K4X4!~zk(c5m))iX0WbMB4F*Czk)+=9IG-y-kx-wL(g=1DO8;?dWPtAlU1 zFKm76y^+P9p?^rn?(i@V+SL***Eih_dcyAKkKS$sefq>3oYH3QduPX@_lfelj=Li7 zcUOogwt`an>&kVFpGXZaZn$_DJV1R@B}Rnkw|C&7?EgB1YjEK`9n<3X_pTohy&voj O4EXuK_{D)H&wl_H?25Sn diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/status.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/status.cpython-312.pyc deleted file mode 100644 index 3d572119a9acb871a0968d0f15d8b4d20f62e526..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6090 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/style.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/style.cpython-312.pyc deleted file mode 100644 index 52f7acd667b3518dbeee18c58793db2506007ebf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33536 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%0AQi%hvoBH=)e4g`rho+^Gp>>5J;q1G5VHh<$ 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 J28T8L{{f(~<IDg6 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-312.pyc deleted file mode 100644 index dd24ff76b5f650f648c8458d4077eb2e9a05a503..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2161 zcmZuy&2JM|5P$3a^0%EhU<gQ<@@d-GDy33OD<D8bKV1Y|x|fyldn69~;l5pioEnh> zm0YP+RrL^hY3Zp%2(`Vm{13fAb0A$cDyZs#o{WN2iBo6ZuAKz>Y|qZen|bqoGqe6R zlSvX-jc-1l`9~q-FBAq#jhNM+fmtAwP{|^;WJnUBF)CXzTQ+3DE0$ubhAMc~(rn$( zCBh`0hJBh9w-ZLfP8vx&Wu)x1k(Nk|oFY`eMriz2EIh@?uq;hn+)oJK4JRe7oSirF z5RuT7HDZq%qv*vl@EfJ+TT<vnGeiFZSn{keut=nn?PSZjN4T*p1(|ano}MyKyft;= z-M4F}9-%*IQ}467*XGP-jt`=KmQ6=&;;i4X*tt%Nm6bq0;X0mcu^<~UAGG`?sDktv z=1|7ZFt2U-K{k}?=R?Ovm}5w_NLW1v%mQJ=kSH-?R5E0mqRKVJP!eSAL(?<?I+dza zqdJY#7}G9jGzmJrBbPIQCi0_mw<lXIt5d3%Jj}P`yTEdh6sA#0CQGm;`LuUfa44;r zOZzuwTs~ZybUN!cREADr`2B0Bz}9tVhDkKI>v<)AhLr%%CTGt@3N+6AHg{?bIl==U z*a9f8mVhjfuGA$aaN+94K#IyuNQW#+wQ?*-u3aKfMQ&v|P&{T`;3MG2M}c@46Yl%e zsm{1ItJ-znyHq{tHriNYuj(_4P4l`v;rY$RMaCznd)cwvIux{ei8+_5R`Yzd)$wOs z=atIK2diGwXA`Y@<6?c9dDT|4RW)H7b$OLH8#7gr1+BC?LEJQ(PSZEdxtzd@RtAa! zrj-XWPnO4b_mt0a%bUh~%IC>d(2+oIgnh>2LUO|{;|Y*900xs90(Ju!1Z;K)5GbP6 zC9~0N4K(;1%*PcOyap4#ZUcA?T6MiPHkh+3ijV1tH7nj711WrVm99M8t9I41gyVh7 zT9BA#z9~Qw)xlQ4*$L}~X9lS{wo$mJtZ@X37m;j1f+Y<`LMKK|FC0}bhz~dqgFwAu z@iE+-H%+XJ8KDaGC=Tnf(SWCTQ$XfPUn3)1?&o*j%kR9g`}+gm9azdw^wj0;yS}Y` zUAuYchog%}@0?oNe)4X7>mP;j`-Q#t3VZMFd+pAirNXgZd^uO_<@jcZw4q=KwCM1Y zz$_4dSg!vo5%fRw{45svnRP3gngOUX$H0LM$O;(C@-v_fMqnczcKFhJ9*?162ZZ&u z0huRHG?L%;#nn%*UcY=(|8eY>9Y5_@%1z#lPl{VYnZ&%MV6UhU*OAKtsew&Y51TnG zA$E?iaqOIO94E!8+srhBq-okNZCl8vP4lC6-HI%_X;QZVrQC$xn3=dWe*w5fBC-(I z;~6v|!DPI5fLtSwW2zco&BoMi{kW!XSuU3PGCp5?Lp&cOimNKf{k*ImmxNU?Xh!Bi zV(f{EOn3|i$DHkY(=ko>!%$niDgHUs({+bgfjYx1%bn9*r*z(Gvs!s9(ELuT=}dDh zU7$w@hjr7V&gIy+>(E<6O#p^iaRIQn;Vul6hu2Rfdi_+emw6f0o1axzT9_9<fJQas z_hC5fP=VUh_?sc_NBBX|VPkq{fb?Zal2%CRZ&F$z+u{3A&i|>@mXzART2VSKJtj!| xhlrBy&HW~CT~YR~C@(!skAC^;_2O4YZoIyfo|vEdT}kxzeDYpDMU-)I=6_ky|D^x` diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-312.pyc deleted file mode 100644 index d02e7c1c8e1842a36397c96a25cb4a4145762d69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39634 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/table.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/table.cpython-312.pyc deleted file mode 100644 index a2289da147fc1338a40eae0e31b6109c5672ddea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43606 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 DY0@J- diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-312.pyc deleted file mode 100644 index d41e5c13414432d66ca52b19587935c7c1d71b7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3370 zcma)8TWlOx89p<!H}85ko5XQ$q?x49WK(;$Z2+}_rg38vTlJ-C+_c)XOgB5n-febw zmNR2F4i+*fK#HIQUSjSgLJ&7Et*Sn75kd$M2p-~=qA)5VQsH6X0XvSURD|IF&YAUY zAVSP)zxmGhU(SDSGxO_oI?3oNfAiy&18K(IMx%AbL$dZ4A{Uv>Y^}!XT2ZU(MZInm z4UO5lZPX(5XfY~zq!z2ki*b!{gD3EtGPYA}u}f#im>oUG?AR4uWi2Lk#*=p3PE0eq z>yk#8yrf-;gw~X_rtEIg)6$yhuy#x920KgEjncZQ!<r5=ZzgMxv~KCJW~8;(-b&VO z(z?CFx?yfdZfAfZa)uunt-79{m}q)cr%|f;(aD)+jRzX6n%{lYsX1a&R7vxw9e=b$ z#N%Z(1cj-vvGy>Li;T0PX0xJhYel1r#%&usVn^s7<xw8NT-h-mYjN3*+xk?}PMnJt z<8yj0>8B^Ts8^|+$qKLY(koQWfLTT<rU%8Gak*_iSK$qlpJ_V6t2U;|-f*27$KB%% zFP}`BbPb4U_mE_0ohp@2PYY+JVVnEqKu=a1UZ2^5r*nr)>ax>K_L^T$Fy#pTe<bL1 z^Y|Grr>bw~X*i-@s+s#S`zLQ#2}&6-Yh*T^Df50a44_JR!>xLADxurXcuG{KE8hRg z*k?N7D*s3BFjNlJB`;x)I}N@*W=x#tn1VNX$@{ND^5!6)D$Ue97fuLNHI4hp_H6sf z_Kf&3H5Nan`t@Uido!X@j)waPH*kagYf}UlnTP!-uX*hSHqWf}c85immhkK`=C#f? zn>XeoXEayWh@GV@SHft@6P`uJ=Gc-po{I_u`Pp{mmYfwo+pb?JA_2!#i55c%ZZ7Ia zTwa?JI1i#5Ku;ScG6XKhgLyRHoh?+HIxo~qo;zC@bjmYz+N^HD<2Bk?rFy^XRm-Qj z=(nBc8a1b6b5WS(joCu2daBTz^D0i`VE*3w3bY4!f0MRzX_~u*X0=(c$jx>{K~&2X zN~aExCC^K~Ip-%VtJ<h~mUXuGmeZAQ={>0P0|X1~W`^zQzx?b~^MUh`-zIjwW%hM6 zcJ6)ggO^Xd-v8jsv&(lLeq-lD=Ob?>wyjYh6B`L~3G~${)wyN)Nz1A`_Dl`D+p<13 zQ>ulQxMkT+ndFppR6b<z+!0uFfkhEp36_}H2Hp$6LtH`^5%&baIku`NqKTC|SmEGm zsw;X#yWX>VB?__<V_VFXxTFcTam$61%h^3EU9z2I8@Dg^ES_H8eqcF!_lgW$>1N5y z%{1()OZ2v61ph*(W($@Kf$i0XTte(2A!h^&x9Xwe-j<p(gyfw<I~CNHhg3shoy%bA z<tNB@XA5$PRuKF{A62c41dxa1COkqx@=jshTLx3ey0Im+b4b%}CI>Ay`Fn{A0M++< z@b|SK*G19}wC-xbk`delN4~%!AYl>wIv~vQPw<NX^g|xs0Otg%uzgB>66!MGuLRW9 z&%l2UcufhXz&{EYg%B5r6bHZ!(FgraKnd!-0BL_eG0OIL2uBElzbOH)D)Dd&sI2e9 z_#?m%2;^uFq4gl(C?q5JG5AA(VI_PP{HuTuNkKdS{#^hLAB9YS&jP-!ginJ%1^9vz zo&f(M;5!5&?CLy(=OK&{<l>a-A85(7y9bgHY@k~p00k+C`@x%lgHi}^;DS2fZ7GPS z>893eS_(lPf}As3c}T&8I!Lf&1V_LhAqb8WU}8iJEu7;3b4-=I0gl-W4l4o65?mq> zcPqh%@Dc<BQw}VmK*r#AU=^tbcn}9)0z6AVy`KgDB!K`EX9(nEyaT-fX&#ahj6k>w z0c$`V$cgzW)YD2h0scL}pQI2}>88f6ic}NxD|lRx9<uo0TM%B6LXe}Iz}iSyGSq_q z5+1*R2M&pxt8qw=Lo$Nj&`rDmp(q8F_A=DZE8!C`z6!vkQ^+&mpCb_1Vl*05C~(Ha zXQU8R=oY*P;md&M3CK-$`!(XhS0K=~5hhx95r`Tj^#}<*1z}hTviEZkFrnmul@wnm z2m&RT;C%#QP6`3$SfHQQgDMX$0jBX>){l8}P5PAUcnd_y;-}?1*z(k8sCq@mo9atc zy@w6@E)u(tFNuKO!J&@~JU%*UO%6RaHZndiYE2FgjScznv5E1CM+Qdx%;3n_*wCQW zYIl#192=grCY~4_IX>)XkDoYZ4L$kj#AB2Jf#MFN#>tScqIVM?Rxh=~Vu>`3{_YP6 zRt!zk{>b((v;BW&`~JY*b3L>9!qLUei{%Sr%bC3ksdr*M+7WG)NzAhy`>sVcUyGz~ z=v~p+jUIxvom+S4S6T1seJr)@S|m&M8+wwAy$Lez+M3cA;;Z+tO}lSn+oUgK$d=tD ZlV)#;%jyf=l(T2gZQ^?LWtNqL`!_Nx96|s9 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/text.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/text.cpython-312.pyc deleted file mode 100644 index bf5e32dd1055cba44f4d260246492e4ab8024a06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58985 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%0AR~t?#2o^6(N5rU?O4{LbMzIVXXgH;yT=^Zy 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-312.pyc deleted file mode 100644 index 99e6d945303ad6b68e2863f808f3bb1c497862f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6362 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-312.pyc deleted file mode 100644 index 041a2a062ae33a1dc1300f8f357fc28a11d60b5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 336 zcmXv}Jx{|h5VezrLaSD6urUYGTEL2skXojSrD32;Wa4WR)s7?E35uBb2W)KYh@Zm9 zR;d#c8>m|+Y$$KId-wV7-a4HYvPhoq)2a0zF8GJPA*&-xo)AL}b0qKtW5+%234h{a z<RS0@zv92{Nu&0|#;1!yyyy;wmlxNgC>}>Qqv6<Qf+z(6S7ET|GMLhmn^>EggH}#% z5g1oi4ab|C;TN=WyVp5Mr2rzR(G?lUq!f@FO$>0DDJpu}WXT*<kIB27OUgiz3i68Z z?3NU@No9W8KRzKkGtet&GN&`pq{s>q+cqW@QCX6b-ve~NsMp(PLb8&>xoTT^_mSSS c=F7(zFVW!=?SF5f_U>c%y>;-=R6Dlz0~1PH+W-In diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-312.pyc deleted file mode 100644 index d5834960eec4a23ceff92ee5b3722e1cb6b5456f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31570 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 GjQ;~sP$|0r diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-312.pyc deleted file mode 100644 index 4806b44407e85ec0a676c741d26c3b45d30f713a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11461 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_cell_widths.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/_cell_widths.py deleted file mode 100644 index 36286df..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_cell_widths.py +++ /dev/null @@ -1,451 +0,0 @@ -# Auto generated by make_terminal_widths.py - -CELL_WIDTHS = [ - (0, 0, 0), - (1, 31, -1), - (127, 159, -1), - (768, 879, 0), - (1155, 1161, 0), - (1425, 1469, 0), - (1471, 1471, 0), - (1473, 1474, 0), - (1476, 1477, 0), - (1479, 1479, 0), - (1552, 1562, 0), - (1611, 1631, 0), - (1648, 1648, 0), - (1750, 1756, 0), - (1759, 1764, 0), - (1767, 1768, 0), - (1770, 1773, 0), - (1809, 1809, 0), - (1840, 1866, 0), - (1958, 1968, 0), - (2027, 2035, 0), - (2045, 2045, 0), - (2070, 2073, 0), - (2075, 2083, 0), - (2085, 2087, 0), - (2089, 2093, 0), - (2137, 2139, 0), - (2259, 2273, 0), - (2275, 2306, 0), - (2362, 2362, 0), - (2364, 2364, 0), - (2369, 2376, 0), - (2381, 2381, 0), - (2385, 2391, 0), - (2402, 2403, 0), - (2433, 2433, 0), - (2492, 2492, 0), - (2497, 2500, 0), - (2509, 2509, 0), - (2530, 2531, 0), - (2558, 2558, 0), - (2561, 2562, 0), - (2620, 2620, 0), - (2625, 2626, 0), - (2631, 2632, 0), - (2635, 2637, 0), - (2641, 2641, 0), - (2672, 2673, 0), - (2677, 2677, 0), - (2689, 2690, 0), - (2748, 2748, 0), - (2753, 2757, 0), - (2759, 2760, 0), - (2765, 2765, 0), - (2786, 2787, 0), - (2810, 2815, 0), - (2817, 2817, 0), - (2876, 2876, 0), - (2879, 2879, 0), - (2881, 2884, 0), - (2893, 2893, 0), - (2901, 2902, 0), - (2914, 2915, 0), - (2946, 2946, 0), - (3008, 3008, 0), - (3021, 3021, 0), - (3072, 3072, 0), - (3076, 3076, 0), - (3134, 3136, 0), - (3142, 3144, 0), - (3146, 3149, 0), - (3157, 3158, 0), - (3170, 3171, 0), - (3201, 3201, 0), - (3260, 3260, 0), - (3263, 3263, 0), - (3270, 3270, 0), - (3276, 3277, 0), - (3298, 3299, 0), - (3328, 3329, 0), - (3387, 3388, 0), - (3393, 3396, 0), - (3405, 3405, 0), - (3426, 3427, 0), - (3457, 3457, 0), - (3530, 3530, 0), - (3538, 3540, 0), - (3542, 3542, 0), - (3633, 3633, 0), - (3636, 3642, 0), - (3655, 3662, 0), - (3761, 3761, 0), - (3764, 3772, 0), - (3784, 3789, 0), - (3864, 3865, 0), - (3893, 3893, 0), - (3895, 3895, 0), - (3897, 3897, 0), - (3953, 3966, 0), - (3968, 3972, 0), - (3974, 3975, 0), - (3981, 3991, 0), - (3993, 4028, 0), - (4038, 4038, 0), - (4141, 4144, 0), - (4146, 4151, 0), - (4153, 4154, 0), - (4157, 4158, 0), - (4184, 4185, 0), - (4190, 4192, 0), - (4209, 4212, 0), - (4226, 4226, 0), - (4229, 4230, 0), - (4237, 4237, 0), - (4253, 4253, 0), - (4352, 4447, 2), - (4957, 4959, 0), - (5906, 5908, 0), - (5938, 5940, 0), - (5970, 5971, 0), - (6002, 6003, 0), - (6068, 6069, 0), - (6071, 6077, 0), - (6086, 6086, 0), - (6089, 6099, 0), - (6109, 6109, 0), - (6155, 6157, 0), - (6277, 6278, 0), - (6313, 6313, 0), - (6432, 6434, 0), - (6439, 6440, 0), - (6450, 6450, 0), - (6457, 6459, 0), - (6679, 6680, 0), - (6683, 6683, 0), - (6742, 6742, 0), - (6744, 6750, 0), - (6752, 6752, 0), - (6754, 6754, 0), - (6757, 6764, 0), - (6771, 6780, 0), - (6783, 6783, 0), - (6832, 6848, 0), - (6912, 6915, 0), - (6964, 6964, 0), - (6966, 6970, 0), - (6972, 6972, 0), - (6978, 6978, 0), - (7019, 7027, 0), - (7040, 7041, 0), - (7074, 7077, 0), - (7080, 7081, 0), - (7083, 7085, 0), - (7142, 7142, 0), - (7144, 7145, 0), - (7149, 7149, 0), - (7151, 7153, 0), - (7212, 7219, 0), - (7222, 7223, 0), - (7376, 7378, 0), - (7380, 7392, 0), - (7394, 7400, 0), - (7405, 7405, 0), - (7412, 7412, 0), - (7416, 7417, 0), - (7616, 7673, 0), - (7675, 7679, 0), - (8203, 8207, 0), - (8232, 8238, 0), - (8288, 8291, 0), - (8400, 8432, 0), - (8986, 8987, 2), - (9001, 9002, 2), - (9193, 9196, 2), - (9200, 9200, 2), - (9203, 9203, 2), - (9725, 9726, 2), - (9748, 9749, 2), - (9800, 9811, 2), - (9855, 9855, 2), - (9875, 9875, 2), - (9889, 9889, 2), - (9898, 9899, 2), - (9917, 9918, 2), - (9924, 9925, 2), - (9934, 9934, 2), - (9940, 9940, 2), - (9962, 9962, 2), - (9970, 9971, 2), - (9973, 9973, 2), - (9978, 9978, 2), - (9981, 9981, 2), - (9989, 9989, 2), - (9994, 9995, 2), - (10024, 10024, 2), - (10060, 10060, 2), - (10062, 10062, 2), - (10067, 10069, 2), - (10071, 10071, 2), - (10133, 10135, 2), - (10160, 10160, 2), - (10175, 10175, 2), - (11035, 11036, 2), - (11088, 11088, 2), - (11093, 11093, 2), - (11503, 11505, 0), - (11647, 11647, 0), - (11744, 11775, 0), - (11904, 11929, 2), - (11931, 12019, 2), - (12032, 12245, 2), - (12272, 12283, 2), - (12288, 12329, 2), - (12330, 12333, 0), - (12334, 12350, 2), - (12353, 12438, 2), - (12441, 12442, 0), - (12443, 12543, 2), - (12549, 12591, 2), - (12593, 12686, 2), - (12688, 12771, 2), - (12784, 12830, 2), - (12832, 12871, 2), - (12880, 19903, 2), - (19968, 42124, 2), - (42128, 42182, 2), - (42607, 42610, 0), - (42612, 42621, 0), - (42654, 42655, 0), - (42736, 42737, 0), - (43010, 43010, 0), - (43014, 43014, 0), - (43019, 43019, 0), - (43045, 43046, 0), - (43052, 43052, 0), - (43204, 43205, 0), - (43232, 43249, 0), - (43263, 43263, 0), - (43302, 43309, 0), - (43335, 43345, 0), - (43360, 43388, 2), - (43392, 43394, 0), - (43443, 43443, 0), - (43446, 43449, 0), - (43452, 43453, 0), - (43493, 43493, 0), - (43561, 43566, 0), - (43569, 43570, 0), - (43573, 43574, 0), - (43587, 43587, 0), - (43596, 43596, 0), - (43644, 43644, 0), - (43696, 43696, 0), - (43698, 43700, 0), - (43703, 43704, 0), - (43710, 43711, 0), - (43713, 43713, 0), - (43756, 43757, 0), - (43766, 43766, 0), - (44005, 44005, 0), - (44008, 44008, 0), - (44013, 44013, 0), - (44032, 55203, 2), - (63744, 64255, 2), - (64286, 64286, 0), - (65024, 65039, 0), - (65040, 65049, 2), - (65056, 65071, 0), - (65072, 65106, 2), - (65108, 65126, 2), - (65128, 65131, 2), - (65281, 65376, 2), - (65504, 65510, 2), - (66045, 66045, 0), - (66272, 66272, 0), - (66422, 66426, 0), - (68097, 68099, 0), - (68101, 68102, 0), - (68108, 68111, 0), - (68152, 68154, 0), - (68159, 68159, 0), - (68325, 68326, 0), - (68900, 68903, 0), - (69291, 69292, 0), - (69446, 69456, 0), - (69633, 69633, 0), - (69688, 69702, 0), - (69759, 69761, 0), - (69811, 69814, 0), - (69817, 69818, 0), - (69888, 69890, 0), - (69927, 69931, 0), - (69933, 69940, 0), - (70003, 70003, 0), - (70016, 70017, 0), - (70070, 70078, 0), - (70089, 70092, 0), - (70095, 70095, 0), - (70191, 70193, 0), - (70196, 70196, 0), - (70198, 70199, 0), - (70206, 70206, 0), - (70367, 70367, 0), - (70371, 70378, 0), - (70400, 70401, 0), - (70459, 70460, 0), - (70464, 70464, 0), - (70502, 70508, 0), - (70512, 70516, 0), - (70712, 70719, 0), - (70722, 70724, 0), - (70726, 70726, 0), - (70750, 70750, 0), - (70835, 70840, 0), - (70842, 70842, 0), - (70847, 70848, 0), - (70850, 70851, 0), - (71090, 71093, 0), - (71100, 71101, 0), - (71103, 71104, 0), - (71132, 71133, 0), - (71219, 71226, 0), - (71229, 71229, 0), - (71231, 71232, 0), - (71339, 71339, 0), - (71341, 71341, 0), - (71344, 71349, 0), - (71351, 71351, 0), - (71453, 71455, 0), - (71458, 71461, 0), - (71463, 71467, 0), - (71727, 71735, 0), - (71737, 71738, 0), - (71995, 71996, 0), - (71998, 71998, 0), - (72003, 72003, 0), - (72148, 72151, 0), - (72154, 72155, 0), - (72160, 72160, 0), - (72193, 72202, 0), - (72243, 72248, 0), - (72251, 72254, 0), - (72263, 72263, 0), - (72273, 72278, 0), - (72281, 72283, 0), - (72330, 72342, 0), - (72344, 72345, 0), - (72752, 72758, 0), - (72760, 72765, 0), - (72767, 72767, 0), - (72850, 72871, 0), - (72874, 72880, 0), - (72882, 72883, 0), - (72885, 72886, 0), - (73009, 73014, 0), - (73018, 73018, 0), - (73020, 73021, 0), - (73023, 73029, 0), - (73031, 73031, 0), - (73104, 73105, 0), - (73109, 73109, 0), - (73111, 73111, 0), - (73459, 73460, 0), - (92912, 92916, 0), - (92976, 92982, 0), - (94031, 94031, 0), - (94095, 94098, 0), - (94176, 94179, 2), - (94180, 94180, 0), - (94192, 94193, 2), - (94208, 100343, 2), - (100352, 101589, 2), - (101632, 101640, 2), - (110592, 110878, 2), - (110928, 110930, 2), - (110948, 110951, 2), - (110960, 111355, 2), - (113821, 113822, 0), - (119143, 119145, 0), - (119163, 119170, 0), - (119173, 119179, 0), - (119210, 119213, 0), - (119362, 119364, 0), - (121344, 121398, 0), - (121403, 121452, 0), - (121461, 121461, 0), - (121476, 121476, 0), - (121499, 121503, 0), - (121505, 121519, 0), - (122880, 122886, 0), - (122888, 122904, 0), - (122907, 122913, 0), - (122915, 122916, 0), - (122918, 122922, 0), - (123184, 123190, 0), - (123628, 123631, 0), - (125136, 125142, 0), - (125252, 125258, 0), - (126980, 126980, 2), - (127183, 127183, 2), - (127374, 127374, 2), - (127377, 127386, 2), - (127488, 127490, 2), - (127504, 127547, 2), - (127552, 127560, 2), - (127568, 127569, 2), - (127584, 127589, 2), - (127744, 127776, 2), - (127789, 127797, 2), - (127799, 127868, 2), - (127870, 127891, 2), - (127904, 127946, 2), - (127951, 127955, 2), - (127968, 127984, 2), - (127988, 127988, 2), - (127992, 128062, 2), - (128064, 128064, 2), - (128066, 128252, 2), - (128255, 128317, 2), - (128331, 128334, 2), - (128336, 128359, 2), - (128378, 128378, 2), - (128405, 128406, 2), - (128420, 128420, 2), - (128507, 128591, 2), - (128640, 128709, 2), - (128716, 128716, 2), - (128720, 128722, 2), - (128725, 128727, 2), - (128747, 128748, 2), - (128756, 128764, 2), - (128992, 129003, 2), - (129292, 129338, 2), - (129340, 129349, 2), - (129351, 129400, 2), - (129402, 129483, 2), - (129485, 129535, 2), - (129648, 129652, 2), - (129656, 129658, 2), - (129664, 129670, 2), - (129680, 129704, 2), - (129712, 129718, 2), - (129728, 129730, 2), - (129744, 129750, 2), - (131072, 196605, 2), - (196608, 262141, 2), - (917760, 917999, 0), -] diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_codes.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_codes.py deleted file mode 100644 index 1f2877b..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_codes.py +++ /dev/null @@ -1,3610 +0,0 @@ -EMOJI = { - "1st_place_medal": "🥇", - "2nd_place_medal": "🥈", - "3rd_place_medal": "🥉", - "ab_button_(blood_type)": "🆎", - "atm_sign": "🏧", - "a_button_(blood_type)": "🅰", - "afghanistan": "🇦🇫", - "albania": "🇦🇱", - "algeria": "🇩🇿", - "american_samoa": "🇦🇸", - "andorra": "🇦🇩", - "angola": "🇦🇴", - "anguilla": "🇦🇮", - "antarctica": "🇦🇶", - "antigua_&_barbuda": "🇦🇬", - "aquarius": "♒", - "argentina": "🇦🇷", - "aries": "♈", - "armenia": "🇦🇲", - "aruba": "🇦🇼", - "ascension_island": "🇦🇨", - "australia": "🇦🇺", - "austria": "🇦🇹", - "azerbaijan": "🇦🇿", - "back_arrow": "🔙", - "b_button_(blood_type)": "🅱", - "bahamas": "🇧🇸", - "bahrain": "🇧🇭", - "bangladesh": "🇧🇩", - "barbados": "🇧🇧", - "belarus": "🇧🇾", - "belgium": "🇧🇪", - "belize": "🇧🇿", - "benin": "🇧🇯", - "bermuda": "🇧🇲", - "bhutan": "🇧🇹", - "bolivia": "🇧🇴", - "bosnia_&_herzegovina": "🇧🇦", - "botswana": "🇧🇼", - "bouvet_island": "🇧🇻", - "brazil": "🇧🇷", - "british_indian_ocean_territory": "🇮🇴", - "british_virgin_islands": "🇻🇬", - "brunei": "🇧🇳", - "bulgaria": "🇧🇬", - "burkina_faso": "🇧🇫", - "burundi": "🇧🇮", - "cl_button": "🆑", - "cool_button": "🆒", - "cambodia": "🇰🇭", - "cameroon": "🇨🇲", - "canada": "🇨🇦", - "canary_islands": "🇮🇨", - "cancer": "♋", - "cape_verde": "🇨🇻", - "capricorn": "♑", - "caribbean_netherlands": "🇧🇶", - "cayman_islands": "🇰🇾", - "central_african_republic": "🇨🇫", - "ceuta_&_melilla": "🇪🇦", - "chad": "🇹🇩", - "chile": "🇨🇱", - "china": "🇨🇳", - "christmas_island": "🇨🇽", - "christmas_tree": "🎄", - "clipperton_island": "🇨🇵", - "cocos_(keeling)_islands": "🇨🇨", - "colombia": "🇨🇴", - "comoros": "🇰🇲", - "congo_-_brazzaville": "🇨🇬", - "congo_-_kinshasa": "🇨🇩", - "cook_islands": "🇨🇰", - "costa_rica": "🇨🇷", - "croatia": "🇭🇷", - "cuba": "🇨🇺", - "curaçao": "🇨🇼", - "cyprus": "🇨🇾", - "czechia": "🇨🇿", - "côte_d’ivoire": "🇨🇮", - "denmark": "🇩🇰", - "diego_garcia": "🇩🇬", - "djibouti": "🇩🇯", - "dominica": "🇩🇲", - "dominican_republic": "🇩🇴", - "end_arrow": "🔚", - "ecuador": "🇪🇨", - "egypt": "🇪🇬", - "el_salvador": "🇸🇻", - "england": "🏴\U000e0067\U000e0062\U000e0065\U000e006e\U000e0067\U000e007f", - "equatorial_guinea": "🇬🇶", - "eritrea": "🇪🇷", - "estonia": "🇪🇪", - "ethiopia": "🇪🇹", - "european_union": "🇪🇺", - "free_button": "🆓", - "falkland_islands": "🇫🇰", - "faroe_islands": "🇫🇴", - "fiji": "🇫🇯", - "finland": "🇫🇮", - "france": "🇫🇷", - "french_guiana": "🇬🇫", - "french_polynesia": "🇵🇫", - "french_southern_territories": "🇹🇫", - "gabon": "🇬🇦", - "gambia": "🇬🇲", - "gemini": "♊", - "georgia": "🇬🇪", - "germany": "🇩🇪", - "ghana": "🇬🇭", - "gibraltar": "🇬🇮", - "greece": "🇬🇷", - "greenland": "🇬🇱", - "grenada": "🇬🇩", - "guadeloupe": "🇬🇵", - "guam": "🇬🇺", - "guatemala": "🇬🇹", - "guernsey": "🇬🇬", - "guinea": "🇬🇳", - "guinea-bissau": "🇬🇼", - "guyana": "🇬🇾", - "haiti": "🇭🇹", - "heard_&_mcdonald_islands": "🇭🇲", - "honduras": "🇭🇳", - "hong_kong_sar_china": "🇭🇰", - "hungary": "🇭🇺", - "id_button": "🆔", - "iceland": "🇮🇸", - "india": "🇮🇳", - "indonesia": "🇮🇩", - "iran": "🇮🇷", - "iraq": "🇮🇶", - "ireland": "🇮🇪", - "isle_of_man": "🇮🇲", - "israel": "🇮🇱", - "italy": "🇮🇹", - "jamaica": "🇯🇲", - "japan": "🗾", - "japanese_acceptable_button": "🉑", - "japanese_application_button": "🈸", - "japanese_bargain_button": "🉐", - "japanese_castle": "🏯", - "japanese_congratulations_button": "㊗", - "japanese_discount_button": "🈹", - "japanese_dolls": "🎎", - "japanese_free_of_charge_button": "🈚", - "japanese_here_button": "🈁", - "japanese_monthly_amount_button": "🈷", - "japanese_no_vacancy_button": "🈵", - "japanese_not_free_of_charge_button": "🈶", - "japanese_open_for_business_button": "🈺", - "japanese_passing_grade_button": "🈴", - "japanese_post_office": "🏣", - "japanese_prohibited_button": "🈲", - "japanese_reserved_button": "🈯", - "japanese_secret_button": "㊙", - "japanese_service_charge_button": "🈂", - "japanese_symbol_for_beginner": "🔰", - "japanese_vacancy_button": "🈳", - "jersey": "🇯🇪", - "jordan": "🇯🇴", - "kazakhstan": "🇰🇿", - "kenya": "🇰🇪", - "kiribati": "🇰🇮", - "kosovo": "🇽🇰", - "kuwait": "🇰🇼", - "kyrgyzstan": "🇰🇬", - "laos": "🇱🇦", - "latvia": "🇱🇻", - "lebanon": "🇱🇧", - "leo": "♌", - "lesotho": "🇱🇸", - "liberia": "🇱🇷", - "libra": "♎", - "libya": "🇱🇾", - "liechtenstein": "🇱🇮", - "lithuania": "🇱🇹", - "luxembourg": "🇱🇺", - "macau_sar_china": "🇲🇴", - "macedonia": "🇲🇰", - "madagascar": "🇲🇬", - "malawi": "🇲🇼", - "malaysia": "🇲🇾", - "maldives": "🇲🇻", - "mali": "🇲🇱", - "malta": "🇲🇹", - "marshall_islands": "🇲🇭", - "martinique": "🇲🇶", - "mauritania": "🇲🇷", - "mauritius": "🇲🇺", - "mayotte": "🇾🇹", - "mexico": "🇲🇽", - "micronesia": "🇫🇲", - "moldova": "🇲🇩", - "monaco": "🇲🇨", - "mongolia": "🇲🇳", - "montenegro": "🇲🇪", - "montserrat": "🇲🇸", - "morocco": "🇲🇦", - "mozambique": "🇲🇿", - "mrs._claus": "🤶", - "mrs._claus_dark_skin_tone": "🤶🏿", - "mrs._claus_light_skin_tone": "🤶🏻", - "mrs._claus_medium-dark_skin_tone": "🤶🏾", - "mrs._claus_medium-light_skin_tone": "🤶🏼", - "mrs._claus_medium_skin_tone": "🤶🏽", - "myanmar_(burma)": "🇲🇲", - "new_button": "🆕", - "ng_button": "🆖", - "namibia": "🇳🇦", - "nauru": "🇳🇷", - "nepal": "🇳🇵", - "netherlands": "🇳🇱", - "new_caledonia": "🇳🇨", - "new_zealand": "🇳🇿", - "nicaragua": "🇳🇮", - "niger": "🇳🇪", - "nigeria": "🇳🇬", - "niue": "🇳🇺", - "norfolk_island": "🇳🇫", - "north_korea": "🇰🇵", - "northern_mariana_islands": "🇲🇵", - "norway": "🇳🇴", - "ok_button": "🆗", - "ok_hand": "👌", - "ok_hand_dark_skin_tone": "👌🏿", - "ok_hand_light_skin_tone": "👌🏻", - "ok_hand_medium-dark_skin_tone": "👌🏾", - "ok_hand_medium-light_skin_tone": "👌🏼", - "ok_hand_medium_skin_tone": "👌🏽", - "on!_arrow": "🔛", - "o_button_(blood_type)": "🅾", - "oman": "🇴🇲", - "ophiuchus": "⛎", - "p_button": "🅿", - "pakistan": "🇵🇰", - "palau": "🇵🇼", - "palestinian_territories": "🇵🇸", - "panama": "🇵🇦", - "papua_new_guinea": "🇵🇬", - "paraguay": "🇵🇾", - "peru": "🇵🇪", - "philippines": "🇵🇭", - "pisces": "♓", - "pitcairn_islands": "🇵🇳", - "poland": "🇵🇱", - "portugal": "🇵🇹", - "puerto_rico": "🇵🇷", - "qatar": "🇶🇦", - "romania": "🇷🇴", - "russia": "🇷🇺", - "rwanda": "🇷🇼", - "réunion": "🇷🇪", - "soon_arrow": "🔜", - "sos_button": "🆘", - "sagittarius": "♐", - "samoa": "🇼🇸", - "san_marino": "🇸🇲", - "santa_claus": "🎅", - "santa_claus_dark_skin_tone": "🎅🏿", - "santa_claus_light_skin_tone": "🎅🏻", - "santa_claus_medium-dark_skin_tone": "🎅🏾", - "santa_claus_medium-light_skin_tone": "🎅🏼", - "santa_claus_medium_skin_tone": "🎅🏽", - "saudi_arabia": "🇸🇦", - "scorpio": "♏", - "scotland": "🏴\U000e0067\U000e0062\U000e0073\U000e0063\U000e0074\U000e007f", - "senegal": "🇸🇳", - "serbia": "🇷🇸", - "seychelles": "🇸🇨", - "sierra_leone": "🇸🇱", - "singapore": "🇸🇬", - "sint_maarten": "🇸🇽", - "slovakia": "🇸🇰", - "slovenia": "🇸🇮", - "solomon_islands": "🇸🇧", - "somalia": "🇸🇴", - "south_africa": "🇿🇦", - "south_georgia_&_south_sandwich_islands": "🇬🇸", - "south_korea": "🇰🇷", - "south_sudan": "🇸🇸", - "spain": "🇪🇸", - "sri_lanka": "🇱🇰", - "st._barthélemy": "🇧🇱", - "st._helena": "🇸🇭", - "st._kitts_&_nevis": "🇰🇳", - "st._lucia": "🇱🇨", - "st._martin": "🇲🇫", - "st._pierre_&_miquelon": "🇵🇲", - "st._vincent_&_grenadines": "🇻🇨", - "statue_of_liberty": "🗽", - "sudan": "🇸🇩", - "suriname": "🇸🇷", - "svalbard_&_jan_mayen": "🇸🇯", - "swaziland": "🇸🇿", - "sweden": "🇸🇪", - "switzerland": "🇨🇭", - "syria": "🇸🇾", - "são_tomé_&_príncipe": "🇸🇹", - "t-rex": "🦖", - "top_arrow": "🔝", - "taiwan": "🇹🇼", - "tajikistan": "🇹🇯", - "tanzania": "🇹🇿", - "taurus": "♉", - "thailand": "🇹🇭", - "timor-leste": "🇹🇱", - "togo": "🇹🇬", - "tokelau": "🇹🇰", - "tokyo_tower": "🗼", - "tonga": "🇹🇴", - "trinidad_&_tobago": "🇹🇹", - "tristan_da_cunha": "🇹🇦", - "tunisia": "🇹🇳", - "turkey": "🦃", - "turkmenistan": "🇹🇲", - "turks_&_caicos_islands": "🇹🇨", - "tuvalu": "🇹🇻", - "u.s._outlying_islands": "🇺🇲", - "u.s._virgin_islands": "🇻🇮", - "up!_button": "🆙", - "uganda": "🇺🇬", - "ukraine": "🇺🇦", - "united_arab_emirates": "🇦🇪", - "united_kingdom": "🇬🇧", - "united_nations": "🇺🇳", - "united_states": "🇺🇸", - "uruguay": "🇺🇾", - "uzbekistan": "🇺🇿", - "vs_button": "🆚", - "vanuatu": "🇻🇺", - "vatican_city": "🇻🇦", - "venezuela": "🇻🇪", - "vietnam": "🇻🇳", - "virgo": "♍", - "wales": "🏴\U000e0067\U000e0062\U000e0077\U000e006c\U000e0073\U000e007f", - "wallis_&_futuna": "🇼🇫", - "western_sahara": "🇪🇭", - "yemen": "🇾🇪", - "zambia": "🇿🇲", - "zimbabwe": "🇿🇼", - "abacus": "🧮", - "adhesive_bandage": "🩹", - "admission_tickets": "🎟", - "adult": "🧑", - "adult_dark_skin_tone": "🧑🏿", - "adult_light_skin_tone": "🧑🏻", - "adult_medium-dark_skin_tone": "🧑🏾", - "adult_medium-light_skin_tone": "🧑🏼", - "adult_medium_skin_tone": "🧑🏽", - "aerial_tramway": "🚡", - "airplane": "✈", - "airplane_arrival": "🛬", - "airplane_departure": "🛫", - "alarm_clock": "⏰", - "alembic": "⚗", - "alien": "👽", - "alien_monster": "👾", - "ambulance": "🚑", - "american_football": "🏈", - "amphora": "🏺", - "anchor": "⚓", - "anger_symbol": "💢", - "angry_face": "😠", - "angry_face_with_horns": "👿", - "anguished_face": "😧", - "ant": "🐜", - "antenna_bars": "📶", - "anxious_face_with_sweat": "😰", - "articulated_lorry": "🚛", - "artist_palette": "🎨", - "astonished_face": "😲", - "atom_symbol": "⚛", - "auto_rickshaw": "🛺", - "automobile": "🚗", - "avocado": "🥑", - "axe": "🪓", - "baby": "👶", - "baby_angel": "👼", - "baby_angel_dark_skin_tone": "👼🏿", - "baby_angel_light_skin_tone": "👼🏻", - "baby_angel_medium-dark_skin_tone": "👼🏾", - "baby_angel_medium-light_skin_tone": "👼🏼", - "baby_angel_medium_skin_tone": "👼🏽", - "baby_bottle": "🍼", - "baby_chick": "🐤", - "baby_dark_skin_tone": "👶🏿", - "baby_light_skin_tone": "👶🏻", - "baby_medium-dark_skin_tone": "👶🏾", - "baby_medium-light_skin_tone": "👶🏼", - "baby_medium_skin_tone": "👶🏽", - "baby_symbol": "🚼", - "backhand_index_pointing_down": "👇", - "backhand_index_pointing_down_dark_skin_tone": "👇🏿", - "backhand_index_pointing_down_light_skin_tone": "👇🏻", - "backhand_index_pointing_down_medium-dark_skin_tone": "👇🏾", - "backhand_index_pointing_down_medium-light_skin_tone": "👇🏼", - "backhand_index_pointing_down_medium_skin_tone": "👇🏽", - "backhand_index_pointing_left": "👈", - "backhand_index_pointing_left_dark_skin_tone": "👈🏿", - "backhand_index_pointing_left_light_skin_tone": "👈🏻", - "backhand_index_pointing_left_medium-dark_skin_tone": "👈🏾", - "backhand_index_pointing_left_medium-light_skin_tone": "👈🏼", - "backhand_index_pointing_left_medium_skin_tone": "👈🏽", - "backhand_index_pointing_right": "👉", - "backhand_index_pointing_right_dark_skin_tone": "👉🏿", - "backhand_index_pointing_right_light_skin_tone": "👉🏻", - "backhand_index_pointing_right_medium-dark_skin_tone": "👉🏾", - "backhand_index_pointing_right_medium-light_skin_tone": "👉🏼", - "backhand_index_pointing_right_medium_skin_tone": "👉🏽", - "backhand_index_pointing_up": "👆", - "backhand_index_pointing_up_dark_skin_tone": "👆🏿", - "backhand_index_pointing_up_light_skin_tone": "👆🏻", - "backhand_index_pointing_up_medium-dark_skin_tone": "👆🏾", - "backhand_index_pointing_up_medium-light_skin_tone": "👆🏼", - "backhand_index_pointing_up_medium_skin_tone": "👆🏽", - "bacon": "🥓", - "badger": "🦡", - "badminton": "🏸", - "bagel": "🥯", - "baggage_claim": "🛄", - "baguette_bread": "🥖", - "balance_scale": "⚖", - "bald": "🦲", - "bald_man": "👨\u200d🦲", - "bald_woman": "👩\u200d🦲", - "ballet_shoes": "🩰", - "balloon": "🎈", - "ballot_box_with_ballot": "🗳", - "ballot_box_with_check": "☑", - "banana": "🍌", - "banjo": "🪕", - "bank": "🏦", - "bar_chart": "📊", - "barber_pole": "💈", - "baseball": "⚾", - "basket": "🧺", - "basketball": "🏀", - "bat": "🦇", - "bathtub": "🛁", - "battery": "🔋", - "beach_with_umbrella": "🏖", - "beaming_face_with_smiling_eyes": "😁", - "bear_face": "🐻", - "bearded_person": "🧔", - "bearded_person_dark_skin_tone": "🧔🏿", - "bearded_person_light_skin_tone": "🧔🏻", - "bearded_person_medium-dark_skin_tone": "🧔🏾", - "bearded_person_medium-light_skin_tone": "🧔🏼", - "bearded_person_medium_skin_tone": "🧔🏽", - "beating_heart": "💓", - "bed": "🛏", - "beer_mug": "🍺", - "bell": "🔔", - "bell_with_slash": "🔕", - "bellhop_bell": "🛎", - "bento_box": "🍱", - "beverage_box": "🧃", - "bicycle": "🚲", - "bikini": "👙", - "billed_cap": "🧢", - "biohazard": "☣", - "bird": "🐦", - "birthday_cake": "🎂", - "black_circle": "⚫", - "black_flag": "🏴", - "black_heart": "🖤", - "black_large_square": "⬛", - "black_medium-small_square": "◾", - "black_medium_square": "◼", - "black_nib": "✒", - "black_small_square": "▪", - "black_square_button": "🔲", - "blond-haired_man": "👱\u200d♂️", - "blond-haired_man_dark_skin_tone": "👱🏿\u200d♂️", - "blond-haired_man_light_skin_tone": "👱🏻\u200d♂️", - "blond-haired_man_medium-dark_skin_tone": "👱🏾\u200d♂️", - "blond-haired_man_medium-light_skin_tone": "👱🏼\u200d♂️", - "blond-haired_man_medium_skin_tone": "👱🏽\u200d♂️", - "blond-haired_person": "👱", - "blond-haired_person_dark_skin_tone": "👱🏿", - "blond-haired_person_light_skin_tone": "👱🏻", - "blond-haired_person_medium-dark_skin_tone": "👱🏾", - "blond-haired_person_medium-light_skin_tone": "👱🏼", - "blond-haired_person_medium_skin_tone": "👱🏽", - "blond-haired_woman": "👱\u200d♀️", - "blond-haired_woman_dark_skin_tone": "👱🏿\u200d♀️", - "blond-haired_woman_light_skin_tone": "👱🏻\u200d♀️", - "blond-haired_woman_medium-dark_skin_tone": "👱🏾\u200d♀️", - "blond-haired_woman_medium-light_skin_tone": "👱🏼\u200d♀️", - "blond-haired_woman_medium_skin_tone": "👱🏽\u200d♀️", - "blossom": "🌼", - "blowfish": "🐡", - "blue_book": "📘", - "blue_circle": "🔵", - "blue_heart": "💙", - "blue_square": "🟦", - "boar": "🐗", - "bomb": "💣", - "bone": "🦴", - "bookmark": "🔖", - "bookmark_tabs": "📑", - "books": "📚", - "bottle_with_popping_cork": "🍾", - "bouquet": "💐", - "bow_and_arrow": "🏹", - "bowl_with_spoon": "🥣", - "bowling": "🎳", - "boxing_glove": "🥊", - "boy": "👦", - "boy_dark_skin_tone": "👦🏿", - "boy_light_skin_tone": "👦🏻", - "boy_medium-dark_skin_tone": "👦🏾", - "boy_medium-light_skin_tone": "👦🏼", - "boy_medium_skin_tone": "👦🏽", - "brain": "🧠", - "bread": "🍞", - "breast-feeding": "🤱", - "breast-feeding_dark_skin_tone": "🤱🏿", - "breast-feeding_light_skin_tone": "🤱🏻", - "breast-feeding_medium-dark_skin_tone": "🤱🏾", - "breast-feeding_medium-light_skin_tone": "🤱🏼", - "breast-feeding_medium_skin_tone": "🤱🏽", - "brick": "🧱", - "bride_with_veil": "👰", - "bride_with_veil_dark_skin_tone": "👰🏿", - "bride_with_veil_light_skin_tone": "👰🏻", - "bride_with_veil_medium-dark_skin_tone": "👰🏾", - "bride_with_veil_medium-light_skin_tone": "👰🏼", - "bride_with_veil_medium_skin_tone": "👰🏽", - "bridge_at_night": "🌉", - "briefcase": "💼", - "briefs": "🩲", - "bright_button": "🔆", - "broccoli": "🥦", - "broken_heart": "💔", - "broom": "🧹", - "brown_circle": "🟤", - "brown_heart": "🤎", - "brown_square": "🟫", - "bug": "🐛", - "building_construction": "🏗", - "bullet_train": "🚅", - "burrito": "🌯", - "bus": "🚌", - "bus_stop": "🚏", - "bust_in_silhouette": "👤", - "busts_in_silhouette": "👥", - "butter": "🧈", - "butterfly": "🦋", - "cactus": "🌵", - "calendar": "📆", - "call_me_hand": "🤙", - "call_me_hand_dark_skin_tone": "🤙🏿", - "call_me_hand_light_skin_tone": "🤙🏻", - "call_me_hand_medium-dark_skin_tone": "🤙🏾", - "call_me_hand_medium-light_skin_tone": "🤙🏼", - "call_me_hand_medium_skin_tone": "🤙🏽", - "camel": "🐫", - "camera": "📷", - "camera_with_flash": "📸", - "camping": "🏕", - "candle": "🕯", - "candy": "🍬", - "canned_food": "🥫", - "canoe": "🛶", - "card_file_box": "🗃", - "card_index": "📇", - "card_index_dividers": "🗂", - "carousel_horse": "🎠", - "carp_streamer": "🎏", - "carrot": "🥕", - "castle": "🏰", - "cat": "🐱", - "cat_face": "🐱", - "cat_face_with_tears_of_joy": "😹", - "cat_face_with_wry_smile": "😼", - "chains": "⛓", - "chair": "🪑", - "chart_decreasing": "📉", - "chart_increasing": "📈", - "chart_increasing_with_yen": "💹", - "cheese_wedge": "🧀", - "chequered_flag": "🏁", - "cherries": "🍒", - "cherry_blossom": "🌸", - "chess_pawn": "♟", - "chestnut": "🌰", - "chicken": "🐔", - "child": "🧒", - "child_dark_skin_tone": "🧒🏿", - "child_light_skin_tone": "🧒🏻", - "child_medium-dark_skin_tone": "🧒🏾", - "child_medium-light_skin_tone": "🧒🏼", - "child_medium_skin_tone": "🧒🏽", - "children_crossing": "🚸", - "chipmunk": "🐿", - "chocolate_bar": "🍫", - "chopsticks": "🥢", - "church": "⛪", - "cigarette": "🚬", - "cinema": "🎦", - "circled_m": "Ⓜ", - "circus_tent": "🎪", - "cityscape": "🏙", - "cityscape_at_dusk": "🌆", - "clamp": "🗜", - "clapper_board": "🎬", - "clapping_hands": "👏", - "clapping_hands_dark_skin_tone": "👏🏿", - "clapping_hands_light_skin_tone": "👏🏻", - "clapping_hands_medium-dark_skin_tone": "👏🏾", - "clapping_hands_medium-light_skin_tone": "👏🏼", - "clapping_hands_medium_skin_tone": "👏🏽", - "classical_building": "🏛", - "clinking_beer_mugs": "🍻", - "clinking_glasses": "🥂", - "clipboard": "📋", - "clockwise_vertical_arrows": "🔃", - "closed_book": "📕", - "closed_mailbox_with_lowered_flag": "📪", - "closed_mailbox_with_raised_flag": "📫", - "closed_umbrella": "🌂", - "cloud": "☁", - "cloud_with_lightning": "🌩", - "cloud_with_lightning_and_rain": "⛈", - "cloud_with_rain": "🌧", - "cloud_with_snow": "🌨", - "clown_face": "🤡", - "club_suit": "♣", - "clutch_bag": "👝", - "coat": "🧥", - "cocktail_glass": "🍸", - "coconut": "🥥", - "coffin": "⚰", - "cold_face": "🥶", - "collision": "💥", - "comet": "☄", - "compass": "🧭", - "computer_disk": "💽", - "computer_mouse": "🖱", - "confetti_ball": "🎊", - "confounded_face": "😖", - "confused_face": "😕", - "construction": "🚧", - "construction_worker": "👷", - "construction_worker_dark_skin_tone": "👷🏿", - "construction_worker_light_skin_tone": "👷🏻", - "construction_worker_medium-dark_skin_tone": "👷🏾", - "construction_worker_medium-light_skin_tone": "👷🏼", - "construction_worker_medium_skin_tone": "👷🏽", - "control_knobs": "🎛", - "convenience_store": "🏪", - "cooked_rice": "🍚", - "cookie": "🍪", - "cooking": "🍳", - "copyright": "©", - "couch_and_lamp": "🛋", - "counterclockwise_arrows_button": "🔄", - "couple_with_heart": "💑", - "couple_with_heart_man_man": "👨\u200d❤️\u200d👨", - "couple_with_heart_woman_man": "👩\u200d❤️\u200d👨", - "couple_with_heart_woman_woman": "👩\u200d❤️\u200d👩", - "cow": "🐮", - "cow_face": "🐮", - "cowboy_hat_face": "🤠", - "crab": "🦀", - "crayon": "🖍", - "credit_card": "💳", - "crescent_moon": "🌙", - "cricket": "🦗", - "cricket_game": "🏏", - "crocodile": "🐊", - "croissant": "🥐", - "cross_mark": "❌", - "cross_mark_button": "❎", - "crossed_fingers": "🤞", - "crossed_fingers_dark_skin_tone": "🤞🏿", - "crossed_fingers_light_skin_tone": "🤞🏻", - "crossed_fingers_medium-dark_skin_tone": "🤞🏾", - "crossed_fingers_medium-light_skin_tone": "🤞🏼", - "crossed_fingers_medium_skin_tone": "🤞🏽", - "crossed_flags": "🎌", - "crossed_swords": "⚔", - "crown": "👑", - "crying_cat_face": "😿", - "crying_face": "😢", - "crystal_ball": "🔮", - "cucumber": "🥒", - "cupcake": "🧁", - "cup_with_straw": "🥤", - "curling_stone": "🥌", - "curly_hair": "🦱", - "curly-haired_man": "👨\u200d🦱", - "curly-haired_woman": "👩\u200d🦱", - "curly_loop": "➰", - "currency_exchange": "💱", - "curry_rice": "🍛", - "custard": "🍮", - "customs": "🛃", - "cut_of_meat": "🥩", - "cyclone": "🌀", - "dagger": "🗡", - "dango": "🍡", - "dashing_away": "💨", - "deaf_person": "🧏", - "deciduous_tree": "🌳", - "deer": "🦌", - "delivery_truck": "🚚", - "department_store": "🏬", - "derelict_house": "🏚", - "desert": "🏜", - "desert_island": "🏝", - "desktop_computer": "🖥", - "detective": "🕵", - "detective_dark_skin_tone": "🕵🏿", - "detective_light_skin_tone": "🕵🏻", - "detective_medium-dark_skin_tone": "🕵🏾", - "detective_medium-light_skin_tone": "🕵🏼", - "detective_medium_skin_tone": "🕵🏽", - "diamond_suit": "♦", - "diamond_with_a_dot": "💠", - "dim_button": "🔅", - "direct_hit": "🎯", - "disappointed_face": "😞", - "diving_mask": "🤿", - "diya_lamp": "🪔", - "dizzy": "💫", - "dizzy_face": "😵", - "dna": "🧬", - "dog": "🐶", - "dog_face": "🐶", - "dollar_banknote": "💵", - "dolphin": "🐬", - "door": "🚪", - "dotted_six-pointed_star": "🔯", - "double_curly_loop": "➿", - "double_exclamation_mark": "‼", - "doughnut": "🍩", - "dove": "🕊", - "down-left_arrow": "↙", - "down-right_arrow": "↘", - "down_arrow": "⬇", - "downcast_face_with_sweat": "😓", - "downwards_button": "🔽", - "dragon": "🐉", - "dragon_face": "🐲", - "dress": "👗", - "drooling_face": "🤤", - "drop_of_blood": "🩸", - "droplet": "💧", - "drum": "🥁", - "duck": "🦆", - "dumpling": "🥟", - "dvd": "📀", - "e-mail": "📧", - "eagle": "🦅", - "ear": "👂", - "ear_dark_skin_tone": "👂🏿", - "ear_light_skin_tone": "👂🏻", - "ear_medium-dark_skin_tone": "👂🏾", - "ear_medium-light_skin_tone": "👂🏼", - "ear_medium_skin_tone": "👂🏽", - "ear_of_corn": "🌽", - "ear_with_hearing_aid": "🦻", - "egg": "🍳", - "eggplant": "🍆", - "eight-pointed_star": "✴", - "eight-spoked_asterisk": "✳", - "eight-thirty": "🕣", - "eight_o’clock": "🕗", - "eject_button": "⏏", - "electric_plug": "🔌", - "elephant": "🐘", - "eleven-thirty": "🕦", - "eleven_o’clock": "🕚", - "elf": "🧝", - "elf_dark_skin_tone": "🧝🏿", - "elf_light_skin_tone": "🧝🏻", - "elf_medium-dark_skin_tone": "🧝🏾", - "elf_medium-light_skin_tone": "🧝🏼", - "elf_medium_skin_tone": "🧝🏽", - "envelope": "✉", - "envelope_with_arrow": "📩", - "euro_banknote": "💶", - "evergreen_tree": "🌲", - "ewe": "🐑", - "exclamation_mark": "❗", - "exclamation_question_mark": "⁉", - "exploding_head": "🤯", - "expressionless_face": "😑", - "eye": "👁", - "eye_in_speech_bubble": "👁️\u200d🗨️", - "eyes": "👀", - "face_blowing_a_kiss": "😘", - "face_savoring_food": "😋", - "face_screaming_in_fear": "😱", - "face_vomiting": "🤮", - "face_with_hand_over_mouth": "🤭", - "face_with_head-bandage": "🤕", - "face_with_medical_mask": "😷", - "face_with_monocle": "🧐", - "face_with_open_mouth": "😮", - "face_with_raised_eyebrow": "🤨", - "face_with_rolling_eyes": "🙄", - "face_with_steam_from_nose": "😤", - "face_with_symbols_on_mouth": "🤬", - "face_with_tears_of_joy": "😂", - "face_with_thermometer": "🤒", - "face_with_tongue": "😛", - "face_without_mouth": "😶", - "factory": "🏭", - "fairy": "🧚", - "fairy_dark_skin_tone": "🧚🏿", - "fairy_light_skin_tone": "🧚🏻", - "fairy_medium-dark_skin_tone": "🧚🏾", - "fairy_medium-light_skin_tone": "🧚🏼", - "fairy_medium_skin_tone": "🧚🏽", - "falafel": "🧆", - "fallen_leaf": "🍂", - "family": "👪", - "family_man_boy": "👨\u200d👦", - "family_man_boy_boy": "👨\u200d👦\u200d👦", - "family_man_girl": "👨\u200d👧", - "family_man_girl_boy": "👨\u200d👧\u200d👦", - "family_man_girl_girl": "👨\u200d👧\u200d👧", - "family_man_man_boy": "👨\u200d👨\u200d👦", - "family_man_man_boy_boy": "👨\u200d👨\u200d👦\u200d👦", - "family_man_man_girl": "👨\u200d👨\u200d👧", - "family_man_man_girl_boy": "👨\u200d👨\u200d👧\u200d👦", - "family_man_man_girl_girl": "👨\u200d👨\u200d👧\u200d👧", - "family_man_woman_boy": "👨\u200d👩\u200d👦", - "family_man_woman_boy_boy": "👨\u200d👩\u200d👦\u200d👦", - "family_man_woman_girl": "👨\u200d👩\u200d👧", - "family_man_woman_girl_boy": "👨\u200d👩\u200d👧\u200d👦", - "family_man_woman_girl_girl": "👨\u200d👩\u200d👧\u200d👧", - "family_woman_boy": "👩\u200d👦", - "family_woman_boy_boy": "👩\u200d👦\u200d👦", - "family_woman_girl": "👩\u200d👧", - "family_woman_girl_boy": "👩\u200d👧\u200d👦", - "family_woman_girl_girl": "👩\u200d👧\u200d👧", - "family_woman_woman_boy": "👩\u200d👩\u200d👦", - "family_woman_woman_boy_boy": "👩\u200d👩\u200d👦\u200d👦", - "family_woman_woman_girl": "👩\u200d👩\u200d👧", - "family_woman_woman_girl_boy": "👩\u200d👩\u200d👧\u200d👦", - "family_woman_woman_girl_girl": "👩\u200d👩\u200d👧\u200d👧", - "fast-forward_button": "⏩", - "fast_down_button": "⏬", - "fast_reverse_button": "⏪", - "fast_up_button": "⏫", - "fax_machine": "📠", - "fearful_face": "😨", - "female_sign": "♀", - "ferris_wheel": "🎡", - "ferry": "⛴", - "field_hockey": "🏑", - "file_cabinet": "🗄", - "file_folder": "📁", - "film_frames": "🎞", - "film_projector": "📽", - "fire": "🔥", - "fire_extinguisher": "🧯", - "firecracker": "🧨", - "fire_engine": "🚒", - "fireworks": "🎆", - "first_quarter_moon": "🌓", - "first_quarter_moon_face": "🌛", - "fish": "🐟", - "fish_cake_with_swirl": "🍥", - "fishing_pole": "🎣", - "five-thirty": "🕠", - "five_o’clock": "🕔", - "flag_in_hole": "⛳", - "flamingo": "🦩", - "flashlight": "🔦", - "flat_shoe": "🥿", - "fleur-de-lis": "⚜", - "flexed_biceps": "💪", - "flexed_biceps_dark_skin_tone": "💪🏿", - "flexed_biceps_light_skin_tone": "💪🏻", - "flexed_biceps_medium-dark_skin_tone": "💪🏾", - "flexed_biceps_medium-light_skin_tone": "💪🏼", - "flexed_biceps_medium_skin_tone": "💪🏽", - "floppy_disk": "💾", - "flower_playing_cards": "🎴", - "flushed_face": "😳", - "flying_disc": "🥏", - "flying_saucer": "🛸", - "fog": "🌫", - "foggy": "🌁", - "folded_hands": "🙏", - "folded_hands_dark_skin_tone": "🙏🏿", - "folded_hands_light_skin_tone": "🙏🏻", - "folded_hands_medium-dark_skin_tone": "🙏🏾", - "folded_hands_medium-light_skin_tone": "🙏🏼", - "folded_hands_medium_skin_tone": "🙏🏽", - "foot": "🦶", - "footprints": "👣", - "fork_and_knife": "🍴", - "fork_and_knife_with_plate": "🍽", - "fortune_cookie": "🥠", - "fountain": "⛲", - "fountain_pen": "🖋", - "four-thirty": "🕟", - "four_leaf_clover": "🍀", - "four_o’clock": "🕓", - "fox_face": "🦊", - "framed_picture": "🖼", - "french_fries": "🍟", - "fried_shrimp": "🍤", - "frog_face": "🐸", - "front-facing_baby_chick": "🐥", - "frowning_face": "☹", - "frowning_face_with_open_mouth": "😦", - "fuel_pump": "⛽", - "full_moon": "🌕", - "full_moon_face": "🌝", - "funeral_urn": "⚱", - "game_die": "🎲", - "garlic": "🧄", - "gear": "⚙", - "gem_stone": "💎", - "genie": "🧞", - "ghost": "👻", - "giraffe": "🦒", - "girl": "👧", - "girl_dark_skin_tone": "👧🏿", - "girl_light_skin_tone": "👧🏻", - "girl_medium-dark_skin_tone": "👧🏾", - "girl_medium-light_skin_tone": "👧🏼", - "girl_medium_skin_tone": "👧🏽", - "glass_of_milk": "🥛", - "glasses": "👓", - "globe_showing_americas": "🌎", - "globe_showing_asia-australia": "🌏", - "globe_showing_europe-africa": "🌍", - "globe_with_meridians": "🌐", - "gloves": "🧤", - "glowing_star": "🌟", - "goal_net": "🥅", - "goat": "🐐", - "goblin": "👺", - "goggles": "🥽", - "gorilla": "🦍", - "graduation_cap": "🎓", - "grapes": "🍇", - "green_apple": "🍏", - "green_book": "📗", - "green_circle": "🟢", - "green_heart": "💚", - "green_salad": "🥗", - "green_square": "🟩", - "grimacing_face": "😬", - "grinning_cat_face": "😺", - "grinning_cat_face_with_smiling_eyes": "😸", - "grinning_face": "😀", - "grinning_face_with_big_eyes": "😃", - "grinning_face_with_smiling_eyes": "😄", - "grinning_face_with_sweat": "😅", - "grinning_squinting_face": "😆", - "growing_heart": "💗", - "guard": "💂", - "guard_dark_skin_tone": "💂🏿", - "guard_light_skin_tone": "💂🏻", - "guard_medium-dark_skin_tone": "💂🏾", - "guard_medium-light_skin_tone": "💂🏼", - "guard_medium_skin_tone": "💂🏽", - "guide_dog": "🦮", - "guitar": "🎸", - "hamburger": "🍔", - "hammer": "🔨", - "hammer_and_pick": "⚒", - "hammer_and_wrench": "🛠", - "hamster_face": "🐹", - "hand_with_fingers_splayed": "🖐", - "hand_with_fingers_splayed_dark_skin_tone": "🖐🏿", - "hand_with_fingers_splayed_light_skin_tone": "🖐🏻", - "hand_with_fingers_splayed_medium-dark_skin_tone": "🖐🏾", - "hand_with_fingers_splayed_medium-light_skin_tone": "🖐🏼", - "hand_with_fingers_splayed_medium_skin_tone": "🖐🏽", - "handbag": "👜", - "handshake": "🤝", - "hatching_chick": "🐣", - "headphone": "🎧", - "hear-no-evil_monkey": "🙉", - "heart_decoration": "💟", - "heart_suit": "♥", - "heart_with_arrow": "💘", - "heart_with_ribbon": "💝", - "heavy_check_mark": "✔", - "heavy_division_sign": "➗", - "heavy_dollar_sign": "💲", - "heavy_heart_exclamation": "❣", - "heavy_large_circle": "⭕", - "heavy_minus_sign": "➖", - "heavy_multiplication_x": "✖", - "heavy_plus_sign": "➕", - "hedgehog": "🦔", - "helicopter": "🚁", - "herb": "🌿", - "hibiscus": "🌺", - "high-heeled_shoe": "👠", - "high-speed_train": "🚄", - "high_voltage": "⚡", - "hiking_boot": "🥾", - "hindu_temple": "🛕", - "hippopotamus": "🦛", - "hole": "🕳", - "honey_pot": "🍯", - "honeybee": "🐝", - "horizontal_traffic_light": "🚥", - "horse": "🐴", - "horse_face": "🐴", - "horse_racing": "🏇", - "horse_racing_dark_skin_tone": "🏇🏿", - "horse_racing_light_skin_tone": "🏇🏻", - "horse_racing_medium-dark_skin_tone": "🏇🏾", - "horse_racing_medium-light_skin_tone": "🏇🏼", - "horse_racing_medium_skin_tone": "🏇🏽", - "hospital": "🏥", - "hot_beverage": "☕", - "hot_dog": "🌭", - "hot_face": "🥵", - "hot_pepper": "🌶", - "hot_springs": "♨", - "hotel": "🏨", - "hourglass_done": "⌛", - "hourglass_not_done": "⏳", - "house": "🏠", - "house_with_garden": "🏡", - "houses": "🏘", - "hugging_face": "🤗", - "hundred_points": "💯", - "hushed_face": "😯", - "ice": "🧊", - "ice_cream": "🍨", - "ice_hockey": "🏒", - "ice_skate": "⛸", - "inbox_tray": "📥", - "incoming_envelope": "📨", - "index_pointing_up": "☝", - "index_pointing_up_dark_skin_tone": "☝🏿", - "index_pointing_up_light_skin_tone": "☝🏻", - "index_pointing_up_medium-dark_skin_tone": "☝🏾", - "index_pointing_up_medium-light_skin_tone": "☝🏼", - "index_pointing_up_medium_skin_tone": "☝🏽", - "infinity": "♾", - "information": "ℹ", - "input_latin_letters": "🔤", - "input_latin_lowercase": "🔡", - "input_latin_uppercase": "🔠", - "input_numbers": "🔢", - "input_symbols": "🔣", - "jack-o-lantern": "🎃", - "jeans": "👖", - "jigsaw": "🧩", - "joker": "🃏", - "joystick": "🕹", - "kaaba": "🕋", - "kangaroo": "🦘", - "key": "🔑", - "keyboard": "⌨", - "keycap_#": "#️⃣", - "keycap_*": "*️⃣", - "keycap_0": "0️⃣", - "keycap_1": "1️⃣", - "keycap_10": "🔟", - "keycap_2": "2️⃣", - "keycap_3": "3️⃣", - "keycap_4": "4️⃣", - "keycap_5": "5️⃣", - "keycap_6": "6️⃣", - "keycap_7": "7️⃣", - "keycap_8": "8️⃣", - "keycap_9": "9️⃣", - "kick_scooter": "🛴", - "kimono": "👘", - "kiss": "💋", - "kiss_man_man": "👨\u200d❤️\u200d💋\u200d👨", - "kiss_mark": "💋", - "kiss_woman_man": "👩\u200d❤️\u200d💋\u200d👨", - "kiss_woman_woman": "👩\u200d❤️\u200d💋\u200d👩", - "kissing_cat_face": "😽", - "kissing_face": "😗", - "kissing_face_with_closed_eyes": "😚", - "kissing_face_with_smiling_eyes": "😙", - "kitchen_knife": "🔪", - "kite": "🪁", - "kiwi_fruit": "🥝", - "koala": "🐨", - "lab_coat": "🥼", - "label": "🏷", - "lacrosse": "🥍", - "lady_beetle": "🐞", - "laptop_computer": "💻", - "large_blue_diamond": "🔷", - "large_orange_diamond": "🔶", - "last_quarter_moon": "🌗", - "last_quarter_moon_face": "🌜", - "last_track_button": "⏮", - "latin_cross": "✝", - "leaf_fluttering_in_wind": "🍃", - "leafy_green": "🥬", - "ledger": "📒", - "left-facing_fist": "🤛", - "left-facing_fist_dark_skin_tone": "🤛🏿", - "left-facing_fist_light_skin_tone": "🤛🏻", - "left-facing_fist_medium-dark_skin_tone": "🤛🏾", - "left-facing_fist_medium-light_skin_tone": "🤛🏼", - "left-facing_fist_medium_skin_tone": "🤛🏽", - "left-right_arrow": "↔", - "left_arrow": "⬅", - "left_arrow_curving_right": "↪", - "left_luggage": "🛅", - "left_speech_bubble": "🗨", - "leg": "🦵", - "lemon": "🍋", - "leopard": "🐆", - "level_slider": "🎚", - "light_bulb": "💡", - "light_rail": "🚈", - "link": "🔗", - "linked_paperclips": "🖇", - "lion_face": "🦁", - "lipstick": "💄", - "litter_in_bin_sign": "🚮", - "lizard": "🦎", - "llama": "🦙", - "lobster": "🦞", - "locked": "🔒", - "locked_with_key": "🔐", - "locked_with_pen": "🔏", - "locomotive": "🚂", - "lollipop": "🍭", - "lotion_bottle": "🧴", - "loudly_crying_face": "😭", - "loudspeaker": "📢", - "love-you_gesture": "🤟", - "love-you_gesture_dark_skin_tone": "🤟🏿", - "love-you_gesture_light_skin_tone": "🤟🏻", - "love-you_gesture_medium-dark_skin_tone": "🤟🏾", - "love-you_gesture_medium-light_skin_tone": "🤟🏼", - "love-you_gesture_medium_skin_tone": "🤟🏽", - "love_hotel": "🏩", - "love_letter": "💌", - "luggage": "🧳", - "lying_face": "🤥", - "mage": "🧙", - "mage_dark_skin_tone": "🧙🏿", - "mage_light_skin_tone": "🧙🏻", - "mage_medium-dark_skin_tone": "🧙🏾", - "mage_medium-light_skin_tone": "🧙🏼", - "mage_medium_skin_tone": "🧙🏽", - "magnet": "🧲", - "magnifying_glass_tilted_left": "🔍", - "magnifying_glass_tilted_right": "🔎", - "mahjong_red_dragon": "🀄", - "male_sign": "♂", - "man": "👨", - "man_and_woman_holding_hands": "👫", - "man_artist": "👨\u200d🎨", - "man_artist_dark_skin_tone": "👨🏿\u200d🎨", - "man_artist_light_skin_tone": "👨🏻\u200d🎨", - "man_artist_medium-dark_skin_tone": "👨🏾\u200d🎨", - "man_artist_medium-light_skin_tone": "👨🏼\u200d🎨", - "man_artist_medium_skin_tone": "👨🏽\u200d🎨", - "man_astronaut": "👨\u200d🚀", - "man_astronaut_dark_skin_tone": "👨🏿\u200d🚀", - "man_astronaut_light_skin_tone": "👨🏻\u200d🚀", - "man_astronaut_medium-dark_skin_tone": "👨🏾\u200d🚀", - "man_astronaut_medium-light_skin_tone": "👨🏼\u200d🚀", - "man_astronaut_medium_skin_tone": "👨🏽\u200d🚀", - "man_biking": "🚴\u200d♂️", - "man_biking_dark_skin_tone": "🚴🏿\u200d♂️", - "man_biking_light_skin_tone": "🚴🏻\u200d♂️", - "man_biking_medium-dark_skin_tone": "🚴🏾\u200d♂️", - "man_biking_medium-light_skin_tone": "🚴🏼\u200d♂️", - "man_biking_medium_skin_tone": "🚴🏽\u200d♂️", - "man_bouncing_ball": "⛹️\u200d♂️", - "man_bouncing_ball_dark_skin_tone": "⛹🏿\u200d♂️", - "man_bouncing_ball_light_skin_tone": "⛹🏻\u200d♂️", - "man_bouncing_ball_medium-dark_skin_tone": "⛹🏾\u200d♂️", - "man_bouncing_ball_medium-light_skin_tone": "⛹🏼\u200d♂️", - "man_bouncing_ball_medium_skin_tone": "⛹🏽\u200d♂️", - "man_bowing": "🙇\u200d♂️", - "man_bowing_dark_skin_tone": "🙇🏿\u200d♂️", - "man_bowing_light_skin_tone": "🙇🏻\u200d♂️", - "man_bowing_medium-dark_skin_tone": "🙇🏾\u200d♂️", - "man_bowing_medium-light_skin_tone": "🙇🏼\u200d♂️", - "man_bowing_medium_skin_tone": "🙇🏽\u200d♂️", - "man_cartwheeling": "🤸\u200d♂️", - "man_cartwheeling_dark_skin_tone": "🤸🏿\u200d♂️", - "man_cartwheeling_light_skin_tone": "🤸🏻\u200d♂️", - "man_cartwheeling_medium-dark_skin_tone": "🤸🏾\u200d♂️", - "man_cartwheeling_medium-light_skin_tone": "🤸🏼\u200d♂️", - "man_cartwheeling_medium_skin_tone": "🤸🏽\u200d♂️", - "man_climbing": "🧗\u200d♂️", - "man_climbing_dark_skin_tone": "🧗🏿\u200d♂️", - "man_climbing_light_skin_tone": "🧗🏻\u200d♂️", - "man_climbing_medium-dark_skin_tone": "🧗🏾\u200d♂️", - "man_climbing_medium-light_skin_tone": "🧗🏼\u200d♂️", - "man_climbing_medium_skin_tone": "🧗🏽\u200d♂️", - "man_construction_worker": "👷\u200d♂️", - "man_construction_worker_dark_skin_tone": "👷🏿\u200d♂️", - "man_construction_worker_light_skin_tone": "👷🏻\u200d♂️", - "man_construction_worker_medium-dark_skin_tone": "👷🏾\u200d♂️", - "man_construction_worker_medium-light_skin_tone": "👷🏼\u200d♂️", - "man_construction_worker_medium_skin_tone": "👷🏽\u200d♂️", - "man_cook": "👨\u200d🍳", - "man_cook_dark_skin_tone": "👨🏿\u200d🍳", - "man_cook_light_skin_tone": "👨🏻\u200d🍳", - "man_cook_medium-dark_skin_tone": "👨🏾\u200d🍳", - "man_cook_medium-light_skin_tone": "👨🏼\u200d🍳", - "man_cook_medium_skin_tone": "👨🏽\u200d🍳", - "man_dancing": "🕺", - "man_dancing_dark_skin_tone": "🕺🏿", - "man_dancing_light_skin_tone": "🕺🏻", - "man_dancing_medium-dark_skin_tone": "🕺🏾", - "man_dancing_medium-light_skin_tone": "🕺🏼", - "man_dancing_medium_skin_tone": "🕺🏽", - "man_dark_skin_tone": "👨🏿", - "man_detective": "🕵️\u200d♂️", - "man_detective_dark_skin_tone": "🕵🏿\u200d♂️", - "man_detective_light_skin_tone": "🕵🏻\u200d♂️", - "man_detective_medium-dark_skin_tone": "🕵🏾\u200d♂️", - "man_detective_medium-light_skin_tone": "🕵🏼\u200d♂️", - "man_detective_medium_skin_tone": "🕵🏽\u200d♂️", - "man_elf": "🧝\u200d♂️", - "man_elf_dark_skin_tone": "🧝🏿\u200d♂️", - "man_elf_light_skin_tone": "🧝🏻\u200d♂️", - "man_elf_medium-dark_skin_tone": "🧝🏾\u200d♂️", - "man_elf_medium-light_skin_tone": "🧝🏼\u200d♂️", - "man_elf_medium_skin_tone": "🧝🏽\u200d♂️", - "man_facepalming": "🤦\u200d♂️", - "man_facepalming_dark_skin_tone": "🤦🏿\u200d♂️", - "man_facepalming_light_skin_tone": "🤦🏻\u200d♂️", - "man_facepalming_medium-dark_skin_tone": "🤦🏾\u200d♂️", - "man_facepalming_medium-light_skin_tone": "🤦🏼\u200d♂️", - "man_facepalming_medium_skin_tone": "🤦🏽\u200d♂️", - "man_factory_worker": "👨\u200d🏭", - "man_factory_worker_dark_skin_tone": "👨🏿\u200d🏭", - "man_factory_worker_light_skin_tone": "👨🏻\u200d🏭", - "man_factory_worker_medium-dark_skin_tone": "👨🏾\u200d🏭", - "man_factory_worker_medium-light_skin_tone": "👨🏼\u200d🏭", - "man_factory_worker_medium_skin_tone": "👨🏽\u200d🏭", - "man_fairy": "🧚\u200d♂️", - "man_fairy_dark_skin_tone": "🧚🏿\u200d♂️", - "man_fairy_light_skin_tone": "🧚🏻\u200d♂️", - "man_fairy_medium-dark_skin_tone": "🧚🏾\u200d♂️", - "man_fairy_medium-light_skin_tone": "🧚🏼\u200d♂️", - "man_fairy_medium_skin_tone": "🧚🏽\u200d♂️", - "man_farmer": "👨\u200d🌾", - "man_farmer_dark_skin_tone": "👨🏿\u200d🌾", - "man_farmer_light_skin_tone": "👨🏻\u200d🌾", - "man_farmer_medium-dark_skin_tone": "👨🏾\u200d🌾", - "man_farmer_medium-light_skin_tone": "👨🏼\u200d🌾", - "man_farmer_medium_skin_tone": "👨🏽\u200d🌾", - "man_firefighter": "👨\u200d🚒", - "man_firefighter_dark_skin_tone": "👨🏿\u200d🚒", - "man_firefighter_light_skin_tone": "👨🏻\u200d🚒", - "man_firefighter_medium-dark_skin_tone": "👨🏾\u200d🚒", - "man_firefighter_medium-light_skin_tone": "👨🏼\u200d🚒", - "man_firefighter_medium_skin_tone": "👨🏽\u200d🚒", - "man_frowning": "🙍\u200d♂️", - "man_frowning_dark_skin_tone": "🙍🏿\u200d♂️", - "man_frowning_light_skin_tone": "🙍🏻\u200d♂️", - "man_frowning_medium-dark_skin_tone": "🙍🏾\u200d♂️", - "man_frowning_medium-light_skin_tone": "🙍🏼\u200d♂️", - "man_frowning_medium_skin_tone": "🙍🏽\u200d♂️", - "man_genie": "🧞\u200d♂️", - "man_gesturing_no": "🙅\u200d♂️", - "man_gesturing_no_dark_skin_tone": "🙅🏿\u200d♂️", - "man_gesturing_no_light_skin_tone": "🙅🏻\u200d♂️", - "man_gesturing_no_medium-dark_skin_tone": "🙅🏾\u200d♂️", - "man_gesturing_no_medium-light_skin_tone": "🙅🏼\u200d♂️", - "man_gesturing_no_medium_skin_tone": "🙅🏽\u200d♂️", - "man_gesturing_ok": "🙆\u200d♂️", - "man_gesturing_ok_dark_skin_tone": "🙆🏿\u200d♂️", - "man_gesturing_ok_light_skin_tone": "🙆🏻\u200d♂️", - "man_gesturing_ok_medium-dark_skin_tone": "🙆🏾\u200d♂️", - "man_gesturing_ok_medium-light_skin_tone": "🙆🏼\u200d♂️", - "man_gesturing_ok_medium_skin_tone": "🙆🏽\u200d♂️", - "man_getting_haircut": "💇\u200d♂️", - "man_getting_haircut_dark_skin_tone": "💇🏿\u200d♂️", - "man_getting_haircut_light_skin_tone": "💇🏻\u200d♂️", - "man_getting_haircut_medium-dark_skin_tone": "💇🏾\u200d♂️", - "man_getting_haircut_medium-light_skin_tone": "💇🏼\u200d♂️", - "man_getting_haircut_medium_skin_tone": "💇🏽\u200d♂️", - "man_getting_massage": "💆\u200d♂️", - "man_getting_massage_dark_skin_tone": "💆🏿\u200d♂️", - "man_getting_massage_light_skin_tone": "💆🏻\u200d♂️", - "man_getting_massage_medium-dark_skin_tone": "💆🏾\u200d♂️", - "man_getting_massage_medium-light_skin_tone": "💆🏼\u200d♂️", - "man_getting_massage_medium_skin_tone": "💆🏽\u200d♂️", - "man_golfing": "🏌️\u200d♂️", - "man_golfing_dark_skin_tone": "🏌🏿\u200d♂️", - "man_golfing_light_skin_tone": "🏌🏻\u200d♂️", - "man_golfing_medium-dark_skin_tone": "🏌🏾\u200d♂️", - "man_golfing_medium-light_skin_tone": "🏌🏼\u200d♂️", - "man_golfing_medium_skin_tone": "🏌🏽\u200d♂️", - "man_guard": "💂\u200d♂️", - "man_guard_dark_skin_tone": "💂🏿\u200d♂️", - "man_guard_light_skin_tone": "💂🏻\u200d♂️", - "man_guard_medium-dark_skin_tone": "💂🏾\u200d♂️", - "man_guard_medium-light_skin_tone": "💂🏼\u200d♂️", - "man_guard_medium_skin_tone": "💂🏽\u200d♂️", - "man_health_worker": "👨\u200d⚕️", - "man_health_worker_dark_skin_tone": "👨🏿\u200d⚕️", - "man_health_worker_light_skin_tone": "👨🏻\u200d⚕️", - "man_health_worker_medium-dark_skin_tone": "👨🏾\u200d⚕️", - "man_health_worker_medium-light_skin_tone": "👨🏼\u200d⚕️", - "man_health_worker_medium_skin_tone": "👨🏽\u200d⚕️", - "man_in_lotus_position": "🧘\u200d♂️", - "man_in_lotus_position_dark_skin_tone": "🧘🏿\u200d♂️", - "man_in_lotus_position_light_skin_tone": "🧘🏻\u200d♂️", - "man_in_lotus_position_medium-dark_skin_tone": "🧘🏾\u200d♂️", - "man_in_lotus_position_medium-light_skin_tone": "🧘🏼\u200d♂️", - "man_in_lotus_position_medium_skin_tone": "🧘🏽\u200d♂️", - "man_in_manual_wheelchair": "👨\u200d🦽", - "man_in_motorized_wheelchair": "👨\u200d🦼", - "man_in_steamy_room": "🧖\u200d♂️", - "man_in_steamy_room_dark_skin_tone": "🧖🏿\u200d♂️", - "man_in_steamy_room_light_skin_tone": "🧖🏻\u200d♂️", - "man_in_steamy_room_medium-dark_skin_tone": "🧖🏾\u200d♂️", - "man_in_steamy_room_medium-light_skin_tone": "🧖🏼\u200d♂️", - "man_in_steamy_room_medium_skin_tone": "🧖🏽\u200d♂️", - "man_in_suit_levitating": "🕴", - "man_in_suit_levitating_dark_skin_tone": "🕴🏿", - "man_in_suit_levitating_light_skin_tone": "🕴🏻", - "man_in_suit_levitating_medium-dark_skin_tone": "🕴🏾", - "man_in_suit_levitating_medium-light_skin_tone": "🕴🏼", - "man_in_suit_levitating_medium_skin_tone": "🕴🏽", - "man_in_tuxedo": "🤵", - "man_in_tuxedo_dark_skin_tone": "🤵🏿", - "man_in_tuxedo_light_skin_tone": "🤵🏻", - "man_in_tuxedo_medium-dark_skin_tone": "🤵🏾", - "man_in_tuxedo_medium-light_skin_tone": "🤵🏼", - "man_in_tuxedo_medium_skin_tone": "🤵🏽", - "man_judge": "👨\u200d⚖️", - "man_judge_dark_skin_tone": "👨🏿\u200d⚖️", - "man_judge_light_skin_tone": "👨🏻\u200d⚖️", - "man_judge_medium-dark_skin_tone": "👨🏾\u200d⚖️", - "man_judge_medium-light_skin_tone": "👨🏼\u200d⚖️", - "man_judge_medium_skin_tone": "👨🏽\u200d⚖️", - "man_juggling": "🤹\u200d♂️", - "man_juggling_dark_skin_tone": "🤹🏿\u200d♂️", - "man_juggling_light_skin_tone": "🤹🏻\u200d♂️", - "man_juggling_medium-dark_skin_tone": "🤹🏾\u200d♂️", - "man_juggling_medium-light_skin_tone": "🤹🏼\u200d♂️", - "man_juggling_medium_skin_tone": "🤹🏽\u200d♂️", - "man_lifting_weights": "🏋️\u200d♂️", - "man_lifting_weights_dark_skin_tone": "🏋🏿\u200d♂️", - "man_lifting_weights_light_skin_tone": "🏋🏻\u200d♂️", - "man_lifting_weights_medium-dark_skin_tone": "🏋🏾\u200d♂️", - "man_lifting_weights_medium-light_skin_tone": "🏋🏼\u200d♂️", - "man_lifting_weights_medium_skin_tone": "🏋🏽\u200d♂️", - "man_light_skin_tone": "👨🏻", - "man_mage": "🧙\u200d♂️", - "man_mage_dark_skin_tone": "🧙🏿\u200d♂️", - "man_mage_light_skin_tone": "🧙🏻\u200d♂️", - "man_mage_medium-dark_skin_tone": "🧙🏾\u200d♂️", - "man_mage_medium-light_skin_tone": "🧙🏼\u200d♂️", - "man_mage_medium_skin_tone": "🧙🏽\u200d♂️", - "man_mechanic": "👨\u200d🔧", - "man_mechanic_dark_skin_tone": "👨🏿\u200d🔧", - "man_mechanic_light_skin_tone": "👨🏻\u200d🔧", - "man_mechanic_medium-dark_skin_tone": "👨🏾\u200d🔧", - "man_mechanic_medium-light_skin_tone": "👨🏼\u200d🔧", - "man_mechanic_medium_skin_tone": "👨🏽\u200d🔧", - "man_medium-dark_skin_tone": "👨🏾", - "man_medium-light_skin_tone": "👨🏼", - "man_medium_skin_tone": "👨🏽", - "man_mountain_biking": "🚵\u200d♂️", - "man_mountain_biking_dark_skin_tone": "🚵🏿\u200d♂️", - "man_mountain_biking_light_skin_tone": "🚵🏻\u200d♂️", - "man_mountain_biking_medium-dark_skin_tone": "🚵🏾\u200d♂️", - "man_mountain_biking_medium-light_skin_tone": "🚵🏼\u200d♂️", - "man_mountain_biking_medium_skin_tone": "🚵🏽\u200d♂️", - "man_office_worker": "👨\u200d💼", - "man_office_worker_dark_skin_tone": "👨🏿\u200d💼", - "man_office_worker_light_skin_tone": "👨🏻\u200d💼", - "man_office_worker_medium-dark_skin_tone": "👨🏾\u200d💼", - "man_office_worker_medium-light_skin_tone": "👨🏼\u200d💼", - "man_office_worker_medium_skin_tone": "👨🏽\u200d💼", - "man_pilot": "👨\u200d✈️", - "man_pilot_dark_skin_tone": "👨🏿\u200d✈️", - "man_pilot_light_skin_tone": "👨🏻\u200d✈️", - "man_pilot_medium-dark_skin_tone": "👨🏾\u200d✈️", - "man_pilot_medium-light_skin_tone": "👨🏼\u200d✈️", - "man_pilot_medium_skin_tone": "👨🏽\u200d✈️", - "man_playing_handball": "🤾\u200d♂️", - "man_playing_handball_dark_skin_tone": "🤾🏿\u200d♂️", - "man_playing_handball_light_skin_tone": "🤾🏻\u200d♂️", - "man_playing_handball_medium-dark_skin_tone": "🤾🏾\u200d♂️", - "man_playing_handball_medium-light_skin_tone": "🤾🏼\u200d♂️", - "man_playing_handball_medium_skin_tone": "🤾🏽\u200d♂️", - "man_playing_water_polo": "🤽\u200d♂️", - "man_playing_water_polo_dark_skin_tone": "🤽🏿\u200d♂️", - "man_playing_water_polo_light_skin_tone": "🤽🏻\u200d♂️", - "man_playing_water_polo_medium-dark_skin_tone": "🤽🏾\u200d♂️", - "man_playing_water_polo_medium-light_skin_tone": "🤽🏼\u200d♂️", - "man_playing_water_polo_medium_skin_tone": "🤽🏽\u200d♂️", - "man_police_officer": "👮\u200d♂️", - "man_police_officer_dark_skin_tone": "👮🏿\u200d♂️", - "man_police_officer_light_skin_tone": "👮🏻\u200d♂️", - "man_police_officer_medium-dark_skin_tone": "👮🏾\u200d♂️", - "man_police_officer_medium-light_skin_tone": "👮🏼\u200d♂️", - "man_police_officer_medium_skin_tone": "👮🏽\u200d♂️", - "man_pouting": "🙎\u200d♂️", - "man_pouting_dark_skin_tone": "🙎🏿\u200d♂️", - "man_pouting_light_skin_tone": "🙎🏻\u200d♂️", - "man_pouting_medium-dark_skin_tone": "🙎🏾\u200d♂️", - "man_pouting_medium-light_skin_tone": "🙎🏼\u200d♂️", - "man_pouting_medium_skin_tone": "🙎🏽\u200d♂️", - "man_raising_hand": "🙋\u200d♂️", - "man_raising_hand_dark_skin_tone": "🙋🏿\u200d♂️", - "man_raising_hand_light_skin_tone": "🙋🏻\u200d♂️", - "man_raising_hand_medium-dark_skin_tone": "🙋🏾\u200d♂️", - "man_raising_hand_medium-light_skin_tone": "🙋🏼\u200d♂️", - "man_raising_hand_medium_skin_tone": "🙋🏽\u200d♂️", - "man_rowing_boat": "🚣\u200d♂️", - "man_rowing_boat_dark_skin_tone": "🚣🏿\u200d♂️", - "man_rowing_boat_light_skin_tone": "🚣🏻\u200d♂️", - "man_rowing_boat_medium-dark_skin_tone": "🚣🏾\u200d♂️", - "man_rowing_boat_medium-light_skin_tone": "🚣🏼\u200d♂️", - "man_rowing_boat_medium_skin_tone": "🚣🏽\u200d♂️", - "man_running": "🏃\u200d♂️", - "man_running_dark_skin_tone": "🏃🏿\u200d♂️", - "man_running_light_skin_tone": "🏃🏻\u200d♂️", - "man_running_medium-dark_skin_tone": "🏃🏾\u200d♂️", - "man_running_medium-light_skin_tone": "🏃🏼\u200d♂️", - "man_running_medium_skin_tone": "🏃🏽\u200d♂️", - "man_scientist": "👨\u200d🔬", - "man_scientist_dark_skin_tone": "👨🏿\u200d🔬", - "man_scientist_light_skin_tone": "👨🏻\u200d🔬", - "man_scientist_medium-dark_skin_tone": "👨🏾\u200d🔬", - "man_scientist_medium-light_skin_tone": "👨🏼\u200d🔬", - "man_scientist_medium_skin_tone": "👨🏽\u200d🔬", - "man_shrugging": "🤷\u200d♂️", - "man_shrugging_dark_skin_tone": "🤷🏿\u200d♂️", - "man_shrugging_light_skin_tone": "🤷🏻\u200d♂️", - "man_shrugging_medium-dark_skin_tone": "🤷🏾\u200d♂️", - "man_shrugging_medium-light_skin_tone": "🤷🏼\u200d♂️", - "man_shrugging_medium_skin_tone": "🤷🏽\u200d♂️", - "man_singer": "👨\u200d🎤", - "man_singer_dark_skin_tone": "👨🏿\u200d🎤", - "man_singer_light_skin_tone": "👨🏻\u200d🎤", - "man_singer_medium-dark_skin_tone": "👨🏾\u200d🎤", - "man_singer_medium-light_skin_tone": "👨🏼\u200d🎤", - "man_singer_medium_skin_tone": "👨🏽\u200d🎤", - "man_student": "👨\u200d🎓", - "man_student_dark_skin_tone": "👨🏿\u200d🎓", - "man_student_light_skin_tone": "👨🏻\u200d🎓", - "man_student_medium-dark_skin_tone": "👨🏾\u200d🎓", - "man_student_medium-light_skin_tone": "👨🏼\u200d🎓", - "man_student_medium_skin_tone": "👨🏽\u200d🎓", - "man_surfing": "🏄\u200d♂️", - "man_surfing_dark_skin_tone": "🏄🏿\u200d♂️", - "man_surfing_light_skin_tone": "🏄🏻\u200d♂️", - "man_surfing_medium-dark_skin_tone": "🏄🏾\u200d♂️", - "man_surfing_medium-light_skin_tone": "🏄🏼\u200d♂️", - "man_surfing_medium_skin_tone": "🏄🏽\u200d♂️", - "man_swimming": "🏊\u200d♂️", - "man_swimming_dark_skin_tone": "🏊🏿\u200d♂️", - "man_swimming_light_skin_tone": "🏊🏻\u200d♂️", - "man_swimming_medium-dark_skin_tone": "🏊🏾\u200d♂️", - "man_swimming_medium-light_skin_tone": "🏊🏼\u200d♂️", - "man_swimming_medium_skin_tone": "🏊🏽\u200d♂️", - "man_teacher": "👨\u200d🏫", - "man_teacher_dark_skin_tone": "👨🏿\u200d🏫", - "man_teacher_light_skin_tone": "👨🏻\u200d🏫", - "man_teacher_medium-dark_skin_tone": "👨🏾\u200d🏫", - "man_teacher_medium-light_skin_tone": "👨🏼\u200d🏫", - "man_teacher_medium_skin_tone": "👨🏽\u200d🏫", - "man_technologist": "👨\u200d💻", - "man_technologist_dark_skin_tone": "👨🏿\u200d💻", - "man_technologist_light_skin_tone": "👨🏻\u200d💻", - "man_technologist_medium-dark_skin_tone": "👨🏾\u200d💻", - "man_technologist_medium-light_skin_tone": "👨🏼\u200d💻", - "man_technologist_medium_skin_tone": "👨🏽\u200d💻", - "man_tipping_hand": "💁\u200d♂️", - "man_tipping_hand_dark_skin_tone": "💁🏿\u200d♂️", - "man_tipping_hand_light_skin_tone": "💁🏻\u200d♂️", - "man_tipping_hand_medium-dark_skin_tone": "💁🏾\u200d♂️", - "man_tipping_hand_medium-light_skin_tone": "💁🏼\u200d♂️", - "man_tipping_hand_medium_skin_tone": "💁🏽\u200d♂️", - "man_vampire": "🧛\u200d♂️", - "man_vampire_dark_skin_tone": "🧛🏿\u200d♂️", - "man_vampire_light_skin_tone": "🧛🏻\u200d♂️", - "man_vampire_medium-dark_skin_tone": "🧛🏾\u200d♂️", - "man_vampire_medium-light_skin_tone": "🧛🏼\u200d♂️", - "man_vampire_medium_skin_tone": "🧛🏽\u200d♂️", - "man_walking": "🚶\u200d♂️", - "man_walking_dark_skin_tone": "🚶🏿\u200d♂️", - "man_walking_light_skin_tone": "🚶🏻\u200d♂️", - "man_walking_medium-dark_skin_tone": "🚶🏾\u200d♂️", - "man_walking_medium-light_skin_tone": "🚶🏼\u200d♂️", - "man_walking_medium_skin_tone": "🚶🏽\u200d♂️", - "man_wearing_turban": "👳\u200d♂️", - "man_wearing_turban_dark_skin_tone": "👳🏿\u200d♂️", - "man_wearing_turban_light_skin_tone": "👳🏻\u200d♂️", - "man_wearing_turban_medium-dark_skin_tone": "👳🏾\u200d♂️", - "man_wearing_turban_medium-light_skin_tone": "👳🏼\u200d♂️", - "man_wearing_turban_medium_skin_tone": "👳🏽\u200d♂️", - "man_with_probing_cane": "👨\u200d🦯", - "man_with_chinese_cap": "👲", - "man_with_chinese_cap_dark_skin_tone": "👲🏿", - "man_with_chinese_cap_light_skin_tone": "👲🏻", - "man_with_chinese_cap_medium-dark_skin_tone": "👲🏾", - "man_with_chinese_cap_medium-light_skin_tone": "👲🏼", - "man_with_chinese_cap_medium_skin_tone": "👲🏽", - "man_zombie": "🧟\u200d♂️", - "mango": "🥭", - "mantelpiece_clock": "🕰", - "manual_wheelchair": "🦽", - "man’s_shoe": "👞", - "map_of_japan": "🗾", - "maple_leaf": "🍁", - "martial_arts_uniform": "🥋", - "mate": "🧉", - "meat_on_bone": "🍖", - "mechanical_arm": "🦾", - "mechanical_leg": "🦿", - "medical_symbol": "⚕", - "megaphone": "📣", - "melon": "🍈", - "memo": "📝", - "men_with_bunny_ears": "👯\u200d♂️", - "men_wrestling": "🤼\u200d♂️", - "menorah": "🕎", - "men’s_room": "🚹", - "mermaid": "🧜\u200d♀️", - "mermaid_dark_skin_tone": "🧜🏿\u200d♀️", - "mermaid_light_skin_tone": "🧜🏻\u200d♀️", - "mermaid_medium-dark_skin_tone": "🧜🏾\u200d♀️", - "mermaid_medium-light_skin_tone": "🧜🏼\u200d♀️", - "mermaid_medium_skin_tone": "🧜🏽\u200d♀️", - "merman": "🧜\u200d♂️", - "merman_dark_skin_tone": "🧜🏿\u200d♂️", - "merman_light_skin_tone": "🧜🏻\u200d♂️", - "merman_medium-dark_skin_tone": "🧜🏾\u200d♂️", - "merman_medium-light_skin_tone": "🧜🏼\u200d♂️", - "merman_medium_skin_tone": "🧜🏽\u200d♂️", - "merperson": "🧜", - "merperson_dark_skin_tone": "🧜🏿", - "merperson_light_skin_tone": "🧜🏻", - "merperson_medium-dark_skin_tone": "🧜🏾", - "merperson_medium-light_skin_tone": "🧜🏼", - "merperson_medium_skin_tone": "🧜🏽", - "metro": "🚇", - "microbe": "🦠", - "microphone": "🎤", - "microscope": "🔬", - "middle_finger": "🖕", - "middle_finger_dark_skin_tone": "🖕🏿", - "middle_finger_light_skin_tone": "🖕🏻", - "middle_finger_medium-dark_skin_tone": "🖕🏾", - "middle_finger_medium-light_skin_tone": "🖕🏼", - "middle_finger_medium_skin_tone": "🖕🏽", - "military_medal": "🎖", - "milky_way": "🌌", - "minibus": "🚐", - "moai": "🗿", - "mobile_phone": "📱", - "mobile_phone_off": "📴", - "mobile_phone_with_arrow": "📲", - "money-mouth_face": "🤑", - "money_bag": "💰", - "money_with_wings": "💸", - "monkey": "🐒", - "monkey_face": "🐵", - "monorail": "🚝", - "moon_cake": "🥮", - "moon_viewing_ceremony": "🎑", - "mosque": "🕌", - "mosquito": "🦟", - "motor_boat": "🛥", - "motor_scooter": "🛵", - "motorcycle": "🏍", - "motorized_wheelchair": "🦼", - "motorway": "🛣", - "mount_fuji": "🗻", - "mountain": "⛰", - "mountain_cableway": "🚠", - "mountain_railway": "🚞", - "mouse": "🐭", - "mouse_face": "🐭", - "mouth": "👄", - "movie_camera": "🎥", - "mushroom": "🍄", - "musical_keyboard": "🎹", - "musical_note": "🎵", - "musical_notes": "🎶", - "musical_score": "🎼", - "muted_speaker": "🔇", - "nail_polish": "💅", - "nail_polish_dark_skin_tone": "💅🏿", - "nail_polish_light_skin_tone": "💅🏻", - "nail_polish_medium-dark_skin_tone": "💅🏾", - "nail_polish_medium-light_skin_tone": "💅🏼", - "nail_polish_medium_skin_tone": "💅🏽", - "name_badge": "📛", - "national_park": "🏞", - "nauseated_face": "🤢", - "nazar_amulet": "🧿", - "necktie": "👔", - "nerd_face": "🤓", - "neutral_face": "😐", - "new_moon": "🌑", - "new_moon_face": "🌚", - "newspaper": "📰", - "next_track_button": "⏭", - "night_with_stars": "🌃", - "nine-thirty": "🕤", - "nine_o’clock": "🕘", - "no_bicycles": "🚳", - "no_entry": "⛔", - "no_littering": "🚯", - "no_mobile_phones": "📵", - "no_one_under_eighteen": "🔞", - "no_pedestrians": "🚷", - "no_smoking": "🚭", - "non-potable_water": "🚱", - "nose": "👃", - "nose_dark_skin_tone": "👃🏿", - "nose_light_skin_tone": "👃🏻", - "nose_medium-dark_skin_tone": "👃🏾", - "nose_medium-light_skin_tone": "👃🏼", - "nose_medium_skin_tone": "👃🏽", - "notebook": "📓", - "notebook_with_decorative_cover": "📔", - "nut_and_bolt": "🔩", - "octopus": "🐙", - "oden": "🍢", - "office_building": "🏢", - "ogre": "👹", - "oil_drum": "🛢", - "old_key": "🗝", - "old_man": "👴", - "old_man_dark_skin_tone": "👴🏿", - "old_man_light_skin_tone": "👴🏻", - "old_man_medium-dark_skin_tone": "👴🏾", - "old_man_medium-light_skin_tone": "👴🏼", - "old_man_medium_skin_tone": "👴🏽", - "old_woman": "👵", - "old_woman_dark_skin_tone": "👵🏿", - "old_woman_light_skin_tone": "👵🏻", - "old_woman_medium-dark_skin_tone": "👵🏾", - "old_woman_medium-light_skin_tone": "👵🏼", - "old_woman_medium_skin_tone": "👵🏽", - "older_adult": "🧓", - "older_adult_dark_skin_tone": "🧓🏿", - "older_adult_light_skin_tone": "🧓🏻", - "older_adult_medium-dark_skin_tone": "🧓🏾", - "older_adult_medium-light_skin_tone": "🧓🏼", - "older_adult_medium_skin_tone": "🧓🏽", - "om": "🕉", - "oncoming_automobile": "🚘", - "oncoming_bus": "🚍", - "oncoming_fist": "👊", - "oncoming_fist_dark_skin_tone": "👊🏿", - "oncoming_fist_light_skin_tone": "👊🏻", - "oncoming_fist_medium-dark_skin_tone": "👊🏾", - "oncoming_fist_medium-light_skin_tone": "👊🏼", - "oncoming_fist_medium_skin_tone": "👊🏽", - "oncoming_police_car": "🚔", - "oncoming_taxi": "🚖", - "one-piece_swimsuit": "🩱", - "one-thirty": "🕜", - "one_o’clock": "🕐", - "onion": "🧅", - "open_book": "📖", - "open_file_folder": "📂", - "open_hands": "👐", - "open_hands_dark_skin_tone": "👐🏿", - "open_hands_light_skin_tone": "👐🏻", - "open_hands_medium-dark_skin_tone": "👐🏾", - "open_hands_medium-light_skin_tone": "👐🏼", - "open_hands_medium_skin_tone": "👐🏽", - "open_mailbox_with_lowered_flag": "📭", - "open_mailbox_with_raised_flag": "📬", - "optical_disk": "💿", - "orange_book": "📙", - "orange_circle": "🟠", - "orange_heart": "🧡", - "orange_square": "🟧", - "orangutan": "🦧", - "orthodox_cross": "☦", - "otter": "🦦", - "outbox_tray": "📤", - "owl": "🦉", - "ox": "🐂", - "oyster": "🦪", - "package": "📦", - "page_facing_up": "📄", - "page_with_curl": "📃", - "pager": "📟", - "paintbrush": "🖌", - "palm_tree": "🌴", - "palms_up_together": "🤲", - "palms_up_together_dark_skin_tone": "🤲🏿", - "palms_up_together_light_skin_tone": "🤲🏻", - "palms_up_together_medium-dark_skin_tone": "🤲🏾", - "palms_up_together_medium-light_skin_tone": "🤲🏼", - "palms_up_together_medium_skin_tone": "🤲🏽", - "pancakes": "🥞", - "panda_face": "🐼", - "paperclip": "📎", - "parrot": "🦜", - "part_alternation_mark": "〽", - "party_popper": "🎉", - "partying_face": "🥳", - "passenger_ship": "🛳", - "passport_control": "🛂", - "pause_button": "⏸", - "paw_prints": "🐾", - "peace_symbol": "☮", - "peach": "🍑", - "peacock": "🦚", - "peanuts": "🥜", - "pear": "🍐", - "pen": "🖊", - "pencil": "📝", - "penguin": "🐧", - "pensive_face": "😔", - "people_holding_hands": "🧑\u200d🤝\u200d🧑", - "people_with_bunny_ears": "👯", - "people_wrestling": "🤼", - "performing_arts": "🎭", - "persevering_face": "😣", - "person_biking": "🚴", - "person_biking_dark_skin_tone": "🚴🏿", - "person_biking_light_skin_tone": "🚴🏻", - "person_biking_medium-dark_skin_tone": "🚴🏾", - "person_biking_medium-light_skin_tone": "🚴🏼", - "person_biking_medium_skin_tone": "🚴🏽", - "person_bouncing_ball": "⛹", - "person_bouncing_ball_dark_skin_tone": "⛹🏿", - "person_bouncing_ball_light_skin_tone": "⛹🏻", - "person_bouncing_ball_medium-dark_skin_tone": "⛹🏾", - "person_bouncing_ball_medium-light_skin_tone": "⛹🏼", - "person_bouncing_ball_medium_skin_tone": "⛹🏽", - "person_bowing": "🙇", - "person_bowing_dark_skin_tone": "🙇🏿", - "person_bowing_light_skin_tone": "🙇🏻", - "person_bowing_medium-dark_skin_tone": "🙇🏾", - "person_bowing_medium-light_skin_tone": "🙇🏼", - "person_bowing_medium_skin_tone": "🙇🏽", - "person_cartwheeling": "🤸", - "person_cartwheeling_dark_skin_tone": "🤸🏿", - "person_cartwheeling_light_skin_tone": "🤸🏻", - "person_cartwheeling_medium-dark_skin_tone": "🤸🏾", - "person_cartwheeling_medium-light_skin_tone": "🤸🏼", - "person_cartwheeling_medium_skin_tone": "🤸🏽", - "person_climbing": "🧗", - "person_climbing_dark_skin_tone": "🧗🏿", - "person_climbing_light_skin_tone": "🧗🏻", - "person_climbing_medium-dark_skin_tone": "🧗🏾", - "person_climbing_medium-light_skin_tone": "🧗🏼", - "person_climbing_medium_skin_tone": "🧗🏽", - "person_facepalming": "🤦", - "person_facepalming_dark_skin_tone": "🤦🏿", - "person_facepalming_light_skin_tone": "🤦🏻", - "person_facepalming_medium-dark_skin_tone": "🤦🏾", - "person_facepalming_medium-light_skin_tone": "🤦🏼", - "person_facepalming_medium_skin_tone": "🤦🏽", - "person_fencing": "🤺", - "person_frowning": "🙍", - "person_frowning_dark_skin_tone": "🙍🏿", - "person_frowning_light_skin_tone": "🙍🏻", - "person_frowning_medium-dark_skin_tone": "🙍🏾", - "person_frowning_medium-light_skin_tone": "🙍🏼", - "person_frowning_medium_skin_tone": "🙍🏽", - "person_gesturing_no": "🙅", - "person_gesturing_no_dark_skin_tone": "🙅🏿", - "person_gesturing_no_light_skin_tone": "🙅🏻", - "person_gesturing_no_medium-dark_skin_tone": "🙅🏾", - "person_gesturing_no_medium-light_skin_tone": "🙅🏼", - "person_gesturing_no_medium_skin_tone": "🙅🏽", - "person_gesturing_ok": "🙆", - "person_gesturing_ok_dark_skin_tone": "🙆🏿", - "person_gesturing_ok_light_skin_tone": "🙆🏻", - "person_gesturing_ok_medium-dark_skin_tone": "🙆🏾", - "person_gesturing_ok_medium-light_skin_tone": "🙆🏼", - "person_gesturing_ok_medium_skin_tone": "🙆🏽", - "person_getting_haircut": "💇", - "person_getting_haircut_dark_skin_tone": "💇🏿", - "person_getting_haircut_light_skin_tone": "💇🏻", - "person_getting_haircut_medium-dark_skin_tone": "💇🏾", - "person_getting_haircut_medium-light_skin_tone": "💇🏼", - "person_getting_haircut_medium_skin_tone": "💇🏽", - "person_getting_massage": "💆", - "person_getting_massage_dark_skin_tone": "💆🏿", - "person_getting_massage_light_skin_tone": "💆🏻", - "person_getting_massage_medium-dark_skin_tone": "💆🏾", - "person_getting_massage_medium-light_skin_tone": "💆🏼", - "person_getting_massage_medium_skin_tone": "💆🏽", - "person_golfing": "🏌", - "person_golfing_dark_skin_tone": "🏌🏿", - "person_golfing_light_skin_tone": "🏌🏻", - "person_golfing_medium-dark_skin_tone": "🏌🏾", - "person_golfing_medium-light_skin_tone": "🏌🏼", - "person_golfing_medium_skin_tone": "🏌🏽", - "person_in_bed": "🛌", - "person_in_bed_dark_skin_tone": "🛌🏿", - "person_in_bed_light_skin_tone": "🛌🏻", - "person_in_bed_medium-dark_skin_tone": "🛌🏾", - "person_in_bed_medium-light_skin_tone": "🛌🏼", - "person_in_bed_medium_skin_tone": "🛌🏽", - "person_in_lotus_position": "🧘", - "person_in_lotus_position_dark_skin_tone": "🧘🏿", - "person_in_lotus_position_light_skin_tone": "🧘🏻", - "person_in_lotus_position_medium-dark_skin_tone": "🧘🏾", - "person_in_lotus_position_medium-light_skin_tone": "🧘🏼", - "person_in_lotus_position_medium_skin_tone": "🧘🏽", - "person_in_steamy_room": "🧖", - "person_in_steamy_room_dark_skin_tone": "🧖🏿", - "person_in_steamy_room_light_skin_tone": "🧖🏻", - "person_in_steamy_room_medium-dark_skin_tone": "🧖🏾", - "person_in_steamy_room_medium-light_skin_tone": "🧖🏼", - "person_in_steamy_room_medium_skin_tone": "🧖🏽", - "person_juggling": "🤹", - "person_juggling_dark_skin_tone": "🤹🏿", - "person_juggling_light_skin_tone": "🤹🏻", - "person_juggling_medium-dark_skin_tone": "🤹🏾", - "person_juggling_medium-light_skin_tone": "🤹🏼", - "person_juggling_medium_skin_tone": "🤹🏽", - "person_kneeling": "🧎", - "person_lifting_weights": "🏋", - "person_lifting_weights_dark_skin_tone": "🏋🏿", - "person_lifting_weights_light_skin_tone": "🏋🏻", - "person_lifting_weights_medium-dark_skin_tone": "🏋🏾", - "person_lifting_weights_medium-light_skin_tone": "🏋🏼", - "person_lifting_weights_medium_skin_tone": "🏋🏽", - "person_mountain_biking": "🚵", - "person_mountain_biking_dark_skin_tone": "🚵🏿", - "person_mountain_biking_light_skin_tone": "🚵🏻", - "person_mountain_biking_medium-dark_skin_tone": "🚵🏾", - "person_mountain_biking_medium-light_skin_tone": "🚵🏼", - "person_mountain_biking_medium_skin_tone": "🚵🏽", - "person_playing_handball": "🤾", - "person_playing_handball_dark_skin_tone": "🤾🏿", - "person_playing_handball_light_skin_tone": "🤾🏻", - "person_playing_handball_medium-dark_skin_tone": "🤾🏾", - "person_playing_handball_medium-light_skin_tone": "🤾🏼", - "person_playing_handball_medium_skin_tone": "🤾🏽", - "person_playing_water_polo": "🤽", - "person_playing_water_polo_dark_skin_tone": "🤽🏿", - "person_playing_water_polo_light_skin_tone": "🤽🏻", - "person_playing_water_polo_medium-dark_skin_tone": "🤽🏾", - "person_playing_water_polo_medium-light_skin_tone": "🤽🏼", - "person_playing_water_polo_medium_skin_tone": "🤽🏽", - "person_pouting": "🙎", - "person_pouting_dark_skin_tone": "🙎🏿", - "person_pouting_light_skin_tone": "🙎🏻", - "person_pouting_medium-dark_skin_tone": "🙎🏾", - "person_pouting_medium-light_skin_tone": "🙎🏼", - "person_pouting_medium_skin_tone": "🙎🏽", - "person_raising_hand": "🙋", - "person_raising_hand_dark_skin_tone": "🙋🏿", - "person_raising_hand_light_skin_tone": "🙋🏻", - "person_raising_hand_medium-dark_skin_tone": "🙋🏾", - "person_raising_hand_medium-light_skin_tone": "🙋🏼", - "person_raising_hand_medium_skin_tone": "🙋🏽", - "person_rowing_boat": "🚣", - "person_rowing_boat_dark_skin_tone": "🚣🏿", - "person_rowing_boat_light_skin_tone": "🚣🏻", - "person_rowing_boat_medium-dark_skin_tone": "🚣🏾", - "person_rowing_boat_medium-light_skin_tone": "🚣🏼", - "person_rowing_boat_medium_skin_tone": "🚣🏽", - "person_running": "🏃", - "person_running_dark_skin_tone": "🏃🏿", - "person_running_light_skin_tone": "🏃🏻", - "person_running_medium-dark_skin_tone": "🏃🏾", - "person_running_medium-light_skin_tone": "🏃🏼", - "person_running_medium_skin_tone": "🏃🏽", - "person_shrugging": "🤷", - "person_shrugging_dark_skin_tone": "🤷🏿", - "person_shrugging_light_skin_tone": "🤷🏻", - "person_shrugging_medium-dark_skin_tone": "🤷🏾", - "person_shrugging_medium-light_skin_tone": "🤷🏼", - "person_shrugging_medium_skin_tone": "🤷🏽", - "person_standing": "🧍", - "person_surfing": "🏄", - "person_surfing_dark_skin_tone": "🏄🏿", - "person_surfing_light_skin_tone": "🏄🏻", - "person_surfing_medium-dark_skin_tone": "🏄🏾", - "person_surfing_medium-light_skin_tone": "🏄🏼", - "person_surfing_medium_skin_tone": "🏄🏽", - "person_swimming": "🏊", - "person_swimming_dark_skin_tone": "🏊🏿", - "person_swimming_light_skin_tone": "🏊🏻", - "person_swimming_medium-dark_skin_tone": "🏊🏾", - "person_swimming_medium-light_skin_tone": "🏊🏼", - "person_swimming_medium_skin_tone": "🏊🏽", - "person_taking_bath": "🛀", - "person_taking_bath_dark_skin_tone": "🛀🏿", - "person_taking_bath_light_skin_tone": "🛀🏻", - "person_taking_bath_medium-dark_skin_tone": "🛀🏾", - "person_taking_bath_medium-light_skin_tone": "🛀🏼", - "person_taking_bath_medium_skin_tone": "🛀🏽", - "person_tipping_hand": "💁", - "person_tipping_hand_dark_skin_tone": "💁🏿", - "person_tipping_hand_light_skin_tone": "💁🏻", - "person_tipping_hand_medium-dark_skin_tone": "💁🏾", - "person_tipping_hand_medium-light_skin_tone": "💁🏼", - "person_tipping_hand_medium_skin_tone": "💁🏽", - "person_walking": "🚶", - "person_walking_dark_skin_tone": "🚶🏿", - "person_walking_light_skin_tone": "🚶🏻", - "person_walking_medium-dark_skin_tone": "🚶🏾", - "person_walking_medium-light_skin_tone": "🚶🏼", - "person_walking_medium_skin_tone": "🚶🏽", - "person_wearing_turban": "👳", - "person_wearing_turban_dark_skin_tone": "👳🏿", - "person_wearing_turban_light_skin_tone": "👳🏻", - "person_wearing_turban_medium-dark_skin_tone": "👳🏾", - "person_wearing_turban_medium-light_skin_tone": "👳🏼", - "person_wearing_turban_medium_skin_tone": "👳🏽", - "petri_dish": "🧫", - "pick": "⛏", - "pie": "🥧", - "pig": "🐷", - "pig_face": "🐷", - "pig_nose": "🐽", - "pile_of_poo": "💩", - "pill": "💊", - "pinching_hand": "🤏", - "pine_decoration": "🎍", - "pineapple": "🍍", - "ping_pong": "🏓", - "pirate_flag": "🏴\u200d☠️", - "pistol": "🔫", - "pizza": "🍕", - "place_of_worship": "🛐", - "play_button": "▶", - "play_or_pause_button": "⏯", - "pleading_face": "🥺", - "police_car": "🚓", - "police_car_light": "🚨", - "police_officer": "👮", - "police_officer_dark_skin_tone": "👮🏿", - "police_officer_light_skin_tone": "👮🏻", - "police_officer_medium-dark_skin_tone": "👮🏾", - "police_officer_medium-light_skin_tone": "👮🏼", - "police_officer_medium_skin_tone": "👮🏽", - "poodle": "🐩", - "pool_8_ball": "🎱", - "popcorn": "🍿", - "post_office": "🏣", - "postal_horn": "📯", - "postbox": "📮", - "pot_of_food": "🍲", - "potable_water": "🚰", - "potato": "🥔", - "poultry_leg": "🍗", - "pound_banknote": "💷", - "pouting_cat_face": "😾", - "pouting_face": "😡", - "prayer_beads": "📿", - "pregnant_woman": "🤰", - "pregnant_woman_dark_skin_tone": "🤰🏿", - "pregnant_woman_light_skin_tone": "🤰🏻", - "pregnant_woman_medium-dark_skin_tone": "🤰🏾", - "pregnant_woman_medium-light_skin_tone": "🤰🏼", - "pregnant_woman_medium_skin_tone": "🤰🏽", - "pretzel": "🥨", - "probing_cane": "🦯", - "prince": "🤴", - "prince_dark_skin_tone": "🤴🏿", - "prince_light_skin_tone": "🤴🏻", - "prince_medium-dark_skin_tone": "🤴🏾", - "prince_medium-light_skin_tone": "🤴🏼", - "prince_medium_skin_tone": "🤴🏽", - "princess": "👸", - "princess_dark_skin_tone": "👸🏿", - "princess_light_skin_tone": "👸🏻", - "princess_medium-dark_skin_tone": "👸🏾", - "princess_medium-light_skin_tone": "👸🏼", - "princess_medium_skin_tone": "👸🏽", - "printer": "🖨", - "prohibited": "🚫", - "purple_circle": "🟣", - "purple_heart": "💜", - "purple_square": "🟪", - "purse": "👛", - "pushpin": "📌", - "question_mark": "❓", - "rabbit": "🐰", - "rabbit_face": "🐰", - "raccoon": "🦝", - "racing_car": "🏎", - "radio": "📻", - "radio_button": "🔘", - "radioactive": "☢", - "railway_car": "🚃", - "railway_track": "🛤", - "rainbow": "🌈", - "rainbow_flag": "🏳️\u200d🌈", - "raised_back_of_hand": "🤚", - "raised_back_of_hand_dark_skin_tone": "🤚🏿", - "raised_back_of_hand_light_skin_tone": "🤚🏻", - "raised_back_of_hand_medium-dark_skin_tone": "🤚🏾", - "raised_back_of_hand_medium-light_skin_tone": "🤚🏼", - "raised_back_of_hand_medium_skin_tone": "🤚🏽", - "raised_fist": "✊", - "raised_fist_dark_skin_tone": "✊🏿", - "raised_fist_light_skin_tone": "✊🏻", - "raised_fist_medium-dark_skin_tone": "✊🏾", - "raised_fist_medium-light_skin_tone": "✊🏼", - "raised_fist_medium_skin_tone": "✊🏽", - "raised_hand": "✋", - "raised_hand_dark_skin_tone": "✋🏿", - "raised_hand_light_skin_tone": "✋🏻", - "raised_hand_medium-dark_skin_tone": "✋🏾", - "raised_hand_medium-light_skin_tone": "✋🏼", - "raised_hand_medium_skin_tone": "✋🏽", - "raising_hands": "🙌", - "raising_hands_dark_skin_tone": "🙌🏿", - "raising_hands_light_skin_tone": "🙌🏻", - "raising_hands_medium-dark_skin_tone": "🙌🏾", - "raising_hands_medium-light_skin_tone": "🙌🏼", - "raising_hands_medium_skin_tone": "🙌🏽", - "ram": "🐏", - "rat": "🐀", - "razor": "🪒", - "ringed_planet": "🪐", - "receipt": "🧾", - "record_button": "⏺", - "recycling_symbol": "♻", - "red_apple": "🍎", - "red_circle": "🔴", - "red_envelope": "🧧", - "red_hair": "🦰", - "red-haired_man": "👨\u200d🦰", - "red-haired_woman": "👩\u200d🦰", - "red_heart": "❤", - "red_paper_lantern": "🏮", - "red_square": "🟥", - "red_triangle_pointed_down": "🔻", - "red_triangle_pointed_up": "🔺", - "registered": "®", - "relieved_face": "😌", - "reminder_ribbon": "🎗", - "repeat_button": "🔁", - "repeat_single_button": "🔂", - "rescue_worker’s_helmet": "⛑", - "restroom": "🚻", - "reverse_button": "◀", - "revolving_hearts": "💞", - "rhinoceros": "🦏", - "ribbon": "🎀", - "rice_ball": "🍙", - "rice_cracker": "🍘", - "right-facing_fist": "🤜", - "right-facing_fist_dark_skin_tone": "🤜🏿", - "right-facing_fist_light_skin_tone": "🤜🏻", - "right-facing_fist_medium-dark_skin_tone": "🤜🏾", - "right-facing_fist_medium-light_skin_tone": "🤜🏼", - "right-facing_fist_medium_skin_tone": "🤜🏽", - "right_anger_bubble": "🗯", - "right_arrow": "➡", - "right_arrow_curving_down": "⤵", - "right_arrow_curving_left": "↩", - "right_arrow_curving_up": "⤴", - "ring": "💍", - "roasted_sweet_potato": "🍠", - "robot_face": "🤖", - "rocket": "🚀", - "roll_of_paper": "🧻", - "rolled-up_newspaper": "🗞", - "roller_coaster": "🎢", - "rolling_on_the_floor_laughing": "🤣", - "rooster": "🐓", - "rose": "🌹", - "rosette": "🏵", - "round_pushpin": "📍", - "rugby_football": "🏉", - "running_shirt": "🎽", - "running_shoe": "👟", - "sad_but_relieved_face": "😥", - "safety_pin": "🧷", - "safety_vest": "🦺", - "salt": "🧂", - "sailboat": "⛵", - "sake": "🍶", - "sandwich": "🥪", - "sari": "🥻", - "satellite": "📡", - "satellite_antenna": "📡", - "sauropod": "🦕", - "saxophone": "🎷", - "scarf": "🧣", - "school": "🏫", - "school_backpack": "🎒", - "scissors": "✂", - "scorpion": "🦂", - "scroll": "📜", - "seat": "💺", - "see-no-evil_monkey": "🙈", - "seedling": "🌱", - "selfie": "🤳", - "selfie_dark_skin_tone": "🤳🏿", - "selfie_light_skin_tone": "🤳🏻", - "selfie_medium-dark_skin_tone": "🤳🏾", - "selfie_medium-light_skin_tone": "🤳🏼", - "selfie_medium_skin_tone": "🤳🏽", - "service_dog": "🐕\u200d🦺", - "seven-thirty": "🕢", - "seven_o’clock": "🕖", - "shallow_pan_of_food": "🥘", - "shamrock": "☘", - "shark": "🦈", - "shaved_ice": "🍧", - "sheaf_of_rice": "🌾", - "shield": "🛡", - "shinto_shrine": "⛩", - "ship": "🚢", - "shooting_star": "🌠", - "shopping_bags": "🛍", - "shopping_cart": "🛒", - "shortcake": "🍰", - "shorts": "🩳", - "shower": "🚿", - "shrimp": "🦐", - "shuffle_tracks_button": "🔀", - "shushing_face": "🤫", - "sign_of_the_horns": "🤘", - "sign_of_the_horns_dark_skin_tone": "🤘🏿", - "sign_of_the_horns_light_skin_tone": "🤘🏻", - "sign_of_the_horns_medium-dark_skin_tone": "🤘🏾", - "sign_of_the_horns_medium-light_skin_tone": "🤘🏼", - "sign_of_the_horns_medium_skin_tone": "🤘🏽", - "six-thirty": "🕡", - "six_o’clock": "🕕", - "skateboard": "🛹", - "skier": "⛷", - "skis": "🎿", - "skull": "💀", - "skull_and_crossbones": "☠", - "skunk": "🦨", - "sled": "🛷", - "sleeping_face": "😴", - "sleepy_face": "😪", - "slightly_frowning_face": "🙁", - "slightly_smiling_face": "🙂", - "slot_machine": "🎰", - "sloth": "🦥", - "small_airplane": "🛩", - "small_blue_diamond": "🔹", - "small_orange_diamond": "🔸", - "smiling_cat_face_with_heart-eyes": "😻", - "smiling_face": "☺", - "smiling_face_with_halo": "😇", - "smiling_face_with_3_hearts": "🥰", - "smiling_face_with_heart-eyes": "😍", - "smiling_face_with_horns": "😈", - "smiling_face_with_smiling_eyes": "😊", - "smiling_face_with_sunglasses": "😎", - "smirking_face": "😏", - "snail": "🐌", - "snake": "🐍", - "sneezing_face": "🤧", - "snow-capped_mountain": "🏔", - "snowboarder": "🏂", - "snowboarder_dark_skin_tone": "🏂🏿", - "snowboarder_light_skin_tone": "🏂🏻", - "snowboarder_medium-dark_skin_tone": "🏂🏾", - "snowboarder_medium-light_skin_tone": "🏂🏼", - "snowboarder_medium_skin_tone": "🏂🏽", - "snowflake": "❄", - "snowman": "☃", - "snowman_without_snow": "⛄", - "soap": "🧼", - "soccer_ball": "⚽", - "socks": "🧦", - "softball": "🥎", - "soft_ice_cream": "🍦", - "spade_suit": "♠", - "spaghetti": "🍝", - "sparkle": "❇", - "sparkler": "🎇", - "sparkles": "✨", - "sparkling_heart": "💖", - "speak-no-evil_monkey": "🙊", - "speaker_high_volume": "🔊", - "speaker_low_volume": "🔈", - "speaker_medium_volume": "🔉", - "speaking_head": "🗣", - "speech_balloon": "💬", - "speedboat": "🚤", - "spider": "🕷", - "spider_web": "🕸", - "spiral_calendar": "🗓", - "spiral_notepad": "🗒", - "spiral_shell": "🐚", - "spoon": "🥄", - "sponge": "🧽", - "sport_utility_vehicle": "🚙", - "sports_medal": "🏅", - "spouting_whale": "🐳", - "squid": "🦑", - "squinting_face_with_tongue": "😝", - "stadium": "🏟", - "star-struck": "🤩", - "star_and_crescent": "☪", - "star_of_david": "✡", - "station": "🚉", - "steaming_bowl": "🍜", - "stethoscope": "🩺", - "stop_button": "⏹", - "stop_sign": "🛑", - "stopwatch": "⏱", - "straight_ruler": "📏", - "strawberry": "🍓", - "studio_microphone": "🎙", - "stuffed_flatbread": "🥙", - "sun": "☀", - "sun_behind_cloud": "⛅", - "sun_behind_large_cloud": "🌥", - "sun_behind_rain_cloud": "🌦", - "sun_behind_small_cloud": "🌤", - "sun_with_face": "🌞", - "sunflower": "🌻", - "sunglasses": "😎", - "sunrise": "🌅", - "sunrise_over_mountains": "🌄", - "sunset": "🌇", - "superhero": "🦸", - "supervillain": "🦹", - "sushi": "🍣", - "suspension_railway": "🚟", - "swan": "🦢", - "sweat_droplets": "💦", - "synagogue": "🕍", - "syringe": "💉", - "t-shirt": "👕", - "taco": "🌮", - "takeout_box": "🥡", - "tanabata_tree": "🎋", - "tangerine": "🍊", - "taxi": "🚕", - "teacup_without_handle": "🍵", - "tear-off_calendar": "📆", - "teddy_bear": "🧸", - "telephone": "☎", - "telephone_receiver": "📞", - "telescope": "🔭", - "television": "📺", - "ten-thirty": "🕥", - "ten_o’clock": "🕙", - "tennis": "🎾", - "tent": "⛺", - "test_tube": "🧪", - "thermometer": "🌡", - "thinking_face": "🤔", - "thought_balloon": "💭", - "thread": "🧵", - "three-thirty": "🕞", - "three_o’clock": "🕒", - "thumbs_down": "👎", - "thumbs_down_dark_skin_tone": "👎🏿", - "thumbs_down_light_skin_tone": "👎🏻", - "thumbs_down_medium-dark_skin_tone": "👎🏾", - "thumbs_down_medium-light_skin_tone": "👎🏼", - "thumbs_down_medium_skin_tone": "👎🏽", - "thumbs_up": "👍", - "thumbs_up_dark_skin_tone": "👍🏿", - "thumbs_up_light_skin_tone": "👍🏻", - "thumbs_up_medium-dark_skin_tone": "👍🏾", - "thumbs_up_medium-light_skin_tone": "👍🏼", - "thumbs_up_medium_skin_tone": "👍🏽", - "ticket": "🎫", - "tiger": "🐯", - "tiger_face": "🐯", - "timer_clock": "⏲", - "tired_face": "😫", - "toolbox": "🧰", - "toilet": "🚽", - "tomato": "🍅", - "tongue": "👅", - "tooth": "🦷", - "top_hat": "🎩", - "tornado": "🌪", - "trackball": "🖲", - "tractor": "🚜", - "trade_mark": "™", - "train": "🚋", - "tram": "🚊", - "tram_car": "🚋", - "triangular_flag": "🚩", - "triangular_ruler": "📐", - "trident_emblem": "🔱", - "trolleybus": "🚎", - "trophy": "🏆", - "tropical_drink": "🍹", - "tropical_fish": "🐠", - "trumpet": "🎺", - "tulip": "🌷", - "tumbler_glass": "🥃", - "turtle": "🐢", - "twelve-thirty": "🕧", - "twelve_o’clock": "🕛", - "two-hump_camel": "🐫", - "two-thirty": "🕝", - "two_hearts": "💕", - "two_men_holding_hands": "👬", - "two_o’clock": "🕑", - "two_women_holding_hands": "👭", - "umbrella": "☂", - "umbrella_on_ground": "⛱", - "umbrella_with_rain_drops": "☔", - "unamused_face": "😒", - "unicorn_face": "🦄", - "unlocked": "🔓", - "up-down_arrow": "↕", - "up-left_arrow": "↖", - "up-right_arrow": "↗", - "up_arrow": "⬆", - "upside-down_face": "🙃", - "upwards_button": "🔼", - "vampire": "🧛", - "vampire_dark_skin_tone": "🧛🏿", - "vampire_light_skin_tone": "🧛🏻", - "vampire_medium-dark_skin_tone": "🧛🏾", - "vampire_medium-light_skin_tone": "🧛🏼", - "vampire_medium_skin_tone": "🧛🏽", - "vertical_traffic_light": "🚦", - "vibration_mode": "📳", - "victory_hand": "✌", - "victory_hand_dark_skin_tone": "✌🏿", - "victory_hand_light_skin_tone": "✌🏻", - "victory_hand_medium-dark_skin_tone": "✌🏾", - "victory_hand_medium-light_skin_tone": "✌🏼", - "victory_hand_medium_skin_tone": "✌🏽", - "video_camera": "📹", - "video_game": "🎮", - "videocassette": "📼", - "violin": "🎻", - "volcano": "🌋", - "volleyball": "🏐", - "vulcan_salute": "🖖", - "vulcan_salute_dark_skin_tone": "🖖🏿", - "vulcan_salute_light_skin_tone": "🖖🏻", - "vulcan_salute_medium-dark_skin_tone": "🖖🏾", - "vulcan_salute_medium-light_skin_tone": "🖖🏼", - "vulcan_salute_medium_skin_tone": "🖖🏽", - "waffle": "🧇", - "waning_crescent_moon": "🌘", - "waning_gibbous_moon": "🌖", - "warning": "⚠", - "wastebasket": "🗑", - "watch": "⌚", - "water_buffalo": "🐃", - "water_closet": "🚾", - "water_wave": "🌊", - "watermelon": "🍉", - "waving_hand": "👋", - "waving_hand_dark_skin_tone": "👋🏿", - "waving_hand_light_skin_tone": "👋🏻", - "waving_hand_medium-dark_skin_tone": "👋🏾", - "waving_hand_medium-light_skin_tone": "👋🏼", - "waving_hand_medium_skin_tone": "👋🏽", - "wavy_dash": "〰", - "waxing_crescent_moon": "🌒", - "waxing_gibbous_moon": "🌔", - "weary_cat_face": "🙀", - "weary_face": "😩", - "wedding": "💒", - "whale": "🐳", - "wheel_of_dharma": "☸", - "wheelchair_symbol": "♿", - "white_circle": "⚪", - "white_exclamation_mark": "❕", - "white_flag": "🏳", - "white_flower": "💮", - "white_hair": "🦳", - "white-haired_man": "👨\u200d🦳", - "white-haired_woman": "👩\u200d🦳", - "white_heart": "🤍", - "white_heavy_check_mark": "✅", - "white_large_square": "⬜", - "white_medium-small_square": "◽", - "white_medium_square": "◻", - "white_medium_star": "⭐", - "white_question_mark": "❔", - "white_small_square": "▫", - "white_square_button": "🔳", - "wilted_flower": "🥀", - "wind_chime": "🎐", - "wind_face": "🌬", - "wine_glass": "🍷", - "winking_face": "😉", - "winking_face_with_tongue": "😜", - "wolf_face": "🐺", - "woman": "👩", - "woman_artist": "👩\u200d🎨", - "woman_artist_dark_skin_tone": "👩🏿\u200d🎨", - "woman_artist_light_skin_tone": "👩🏻\u200d🎨", - "woman_artist_medium-dark_skin_tone": "👩🏾\u200d🎨", - "woman_artist_medium-light_skin_tone": "👩🏼\u200d🎨", - "woman_artist_medium_skin_tone": "👩🏽\u200d🎨", - "woman_astronaut": "👩\u200d🚀", - "woman_astronaut_dark_skin_tone": "👩🏿\u200d🚀", - "woman_astronaut_light_skin_tone": "👩🏻\u200d🚀", - "woman_astronaut_medium-dark_skin_tone": "👩🏾\u200d🚀", - "woman_astronaut_medium-light_skin_tone": "👩🏼\u200d🚀", - "woman_astronaut_medium_skin_tone": "👩🏽\u200d🚀", - "woman_biking": "🚴\u200d♀️", - "woman_biking_dark_skin_tone": "🚴🏿\u200d♀️", - "woman_biking_light_skin_tone": "🚴🏻\u200d♀️", - "woman_biking_medium-dark_skin_tone": "🚴🏾\u200d♀️", - "woman_biking_medium-light_skin_tone": "🚴🏼\u200d♀️", - "woman_biking_medium_skin_tone": "🚴🏽\u200d♀️", - "woman_bouncing_ball": "⛹️\u200d♀️", - "woman_bouncing_ball_dark_skin_tone": "⛹🏿\u200d♀️", - "woman_bouncing_ball_light_skin_tone": "⛹🏻\u200d♀️", - "woman_bouncing_ball_medium-dark_skin_tone": "⛹🏾\u200d♀️", - "woman_bouncing_ball_medium-light_skin_tone": "⛹🏼\u200d♀️", - "woman_bouncing_ball_medium_skin_tone": "⛹🏽\u200d♀️", - "woman_bowing": "🙇\u200d♀️", - "woman_bowing_dark_skin_tone": "🙇🏿\u200d♀️", - "woman_bowing_light_skin_tone": "🙇🏻\u200d♀️", - "woman_bowing_medium-dark_skin_tone": "🙇🏾\u200d♀️", - "woman_bowing_medium-light_skin_tone": "🙇🏼\u200d♀️", - "woman_bowing_medium_skin_tone": "🙇🏽\u200d♀️", - "woman_cartwheeling": "🤸\u200d♀️", - "woman_cartwheeling_dark_skin_tone": "🤸🏿\u200d♀️", - "woman_cartwheeling_light_skin_tone": "🤸🏻\u200d♀️", - "woman_cartwheeling_medium-dark_skin_tone": "🤸🏾\u200d♀️", - "woman_cartwheeling_medium-light_skin_tone": "🤸🏼\u200d♀️", - "woman_cartwheeling_medium_skin_tone": "🤸🏽\u200d♀️", - "woman_climbing": "🧗\u200d♀️", - "woman_climbing_dark_skin_tone": "🧗🏿\u200d♀️", - "woman_climbing_light_skin_tone": "🧗🏻\u200d♀️", - "woman_climbing_medium-dark_skin_tone": "🧗🏾\u200d♀️", - "woman_climbing_medium-light_skin_tone": "🧗🏼\u200d♀️", - "woman_climbing_medium_skin_tone": "🧗🏽\u200d♀️", - "woman_construction_worker": "👷\u200d♀️", - "woman_construction_worker_dark_skin_tone": "👷🏿\u200d♀️", - "woman_construction_worker_light_skin_tone": "👷🏻\u200d♀️", - "woman_construction_worker_medium-dark_skin_tone": "👷🏾\u200d♀️", - "woman_construction_worker_medium-light_skin_tone": "👷🏼\u200d♀️", - "woman_construction_worker_medium_skin_tone": "👷🏽\u200d♀️", - "woman_cook": "👩\u200d🍳", - "woman_cook_dark_skin_tone": "👩🏿\u200d🍳", - "woman_cook_light_skin_tone": "👩🏻\u200d🍳", - "woman_cook_medium-dark_skin_tone": "👩🏾\u200d🍳", - "woman_cook_medium-light_skin_tone": "👩🏼\u200d🍳", - "woman_cook_medium_skin_tone": "👩🏽\u200d🍳", - "woman_dancing": "💃", - "woman_dancing_dark_skin_tone": "💃🏿", - "woman_dancing_light_skin_tone": "💃🏻", - "woman_dancing_medium-dark_skin_tone": "💃🏾", - "woman_dancing_medium-light_skin_tone": "💃🏼", - "woman_dancing_medium_skin_tone": "💃🏽", - "woman_dark_skin_tone": "👩🏿", - "woman_detective": "🕵️\u200d♀️", - "woman_detective_dark_skin_tone": "🕵🏿\u200d♀️", - "woman_detective_light_skin_tone": "🕵🏻\u200d♀️", - "woman_detective_medium-dark_skin_tone": "🕵🏾\u200d♀️", - "woman_detective_medium-light_skin_tone": "🕵🏼\u200d♀️", - "woman_detective_medium_skin_tone": "🕵🏽\u200d♀️", - "woman_elf": "🧝\u200d♀️", - "woman_elf_dark_skin_tone": "🧝🏿\u200d♀️", - "woman_elf_light_skin_tone": "🧝🏻\u200d♀️", - "woman_elf_medium-dark_skin_tone": "🧝🏾\u200d♀️", - "woman_elf_medium-light_skin_tone": "🧝🏼\u200d♀️", - "woman_elf_medium_skin_tone": "🧝🏽\u200d♀️", - "woman_facepalming": "🤦\u200d♀️", - "woman_facepalming_dark_skin_tone": "🤦🏿\u200d♀️", - "woman_facepalming_light_skin_tone": "🤦🏻\u200d♀️", - "woman_facepalming_medium-dark_skin_tone": "🤦🏾\u200d♀️", - "woman_facepalming_medium-light_skin_tone": "🤦🏼\u200d♀️", - "woman_facepalming_medium_skin_tone": "🤦🏽\u200d♀️", - "woman_factory_worker": "👩\u200d🏭", - "woman_factory_worker_dark_skin_tone": "👩🏿\u200d🏭", - "woman_factory_worker_light_skin_tone": "👩🏻\u200d🏭", - "woman_factory_worker_medium-dark_skin_tone": "👩🏾\u200d🏭", - "woman_factory_worker_medium-light_skin_tone": "👩🏼\u200d🏭", - "woman_factory_worker_medium_skin_tone": "👩🏽\u200d🏭", - "woman_fairy": "🧚\u200d♀️", - "woman_fairy_dark_skin_tone": "🧚🏿\u200d♀️", - "woman_fairy_light_skin_tone": "🧚🏻\u200d♀️", - "woman_fairy_medium-dark_skin_tone": "🧚🏾\u200d♀️", - "woman_fairy_medium-light_skin_tone": "🧚🏼\u200d♀️", - "woman_fairy_medium_skin_tone": "🧚🏽\u200d♀️", - "woman_farmer": "👩\u200d🌾", - "woman_farmer_dark_skin_tone": "👩🏿\u200d🌾", - "woman_farmer_light_skin_tone": "👩🏻\u200d🌾", - "woman_farmer_medium-dark_skin_tone": "👩🏾\u200d🌾", - "woman_farmer_medium-light_skin_tone": "👩🏼\u200d🌾", - "woman_farmer_medium_skin_tone": "👩🏽\u200d🌾", - "woman_firefighter": "👩\u200d🚒", - "woman_firefighter_dark_skin_tone": "👩🏿\u200d🚒", - "woman_firefighter_light_skin_tone": "👩🏻\u200d🚒", - "woman_firefighter_medium-dark_skin_tone": "👩🏾\u200d🚒", - "woman_firefighter_medium-light_skin_tone": "👩🏼\u200d🚒", - "woman_firefighter_medium_skin_tone": "👩🏽\u200d🚒", - "woman_frowning": "🙍\u200d♀️", - "woman_frowning_dark_skin_tone": "🙍🏿\u200d♀️", - "woman_frowning_light_skin_tone": "🙍🏻\u200d♀️", - "woman_frowning_medium-dark_skin_tone": "🙍🏾\u200d♀️", - "woman_frowning_medium-light_skin_tone": "🙍🏼\u200d♀️", - "woman_frowning_medium_skin_tone": "🙍🏽\u200d♀️", - "woman_genie": "🧞\u200d♀️", - "woman_gesturing_no": "🙅\u200d♀️", - "woman_gesturing_no_dark_skin_tone": "🙅🏿\u200d♀️", - "woman_gesturing_no_light_skin_tone": "🙅🏻\u200d♀️", - "woman_gesturing_no_medium-dark_skin_tone": "🙅🏾\u200d♀️", - "woman_gesturing_no_medium-light_skin_tone": "🙅🏼\u200d♀️", - "woman_gesturing_no_medium_skin_tone": "🙅🏽\u200d♀️", - "woman_gesturing_ok": "🙆\u200d♀️", - "woman_gesturing_ok_dark_skin_tone": "🙆🏿\u200d♀️", - "woman_gesturing_ok_light_skin_tone": "🙆🏻\u200d♀️", - "woman_gesturing_ok_medium-dark_skin_tone": "🙆🏾\u200d♀️", - "woman_gesturing_ok_medium-light_skin_tone": "🙆🏼\u200d♀️", - "woman_gesturing_ok_medium_skin_tone": "🙆🏽\u200d♀️", - "woman_getting_haircut": "💇\u200d♀️", - "woman_getting_haircut_dark_skin_tone": "💇🏿\u200d♀️", - "woman_getting_haircut_light_skin_tone": "💇🏻\u200d♀️", - "woman_getting_haircut_medium-dark_skin_tone": "💇🏾\u200d♀️", - "woman_getting_haircut_medium-light_skin_tone": "💇🏼\u200d♀️", - "woman_getting_haircut_medium_skin_tone": "💇🏽\u200d♀️", - "woman_getting_massage": "💆\u200d♀️", - "woman_getting_massage_dark_skin_tone": "💆🏿\u200d♀️", - "woman_getting_massage_light_skin_tone": "💆🏻\u200d♀️", - "woman_getting_massage_medium-dark_skin_tone": "💆🏾\u200d♀️", - "woman_getting_massage_medium-light_skin_tone": "💆🏼\u200d♀️", - "woman_getting_massage_medium_skin_tone": "💆🏽\u200d♀️", - "woman_golfing": "🏌️\u200d♀️", - "woman_golfing_dark_skin_tone": "🏌🏿\u200d♀️", - "woman_golfing_light_skin_tone": "🏌🏻\u200d♀️", - "woman_golfing_medium-dark_skin_tone": "🏌🏾\u200d♀️", - "woman_golfing_medium-light_skin_tone": "🏌🏼\u200d♀️", - "woman_golfing_medium_skin_tone": "🏌🏽\u200d♀️", - "woman_guard": "💂\u200d♀️", - "woman_guard_dark_skin_tone": "💂🏿\u200d♀️", - "woman_guard_light_skin_tone": "💂🏻\u200d♀️", - "woman_guard_medium-dark_skin_tone": "💂🏾\u200d♀️", - "woman_guard_medium-light_skin_tone": "💂🏼\u200d♀️", - "woman_guard_medium_skin_tone": "💂🏽\u200d♀️", - "woman_health_worker": "👩\u200d⚕️", - "woman_health_worker_dark_skin_tone": "👩🏿\u200d⚕️", - "woman_health_worker_light_skin_tone": "👩🏻\u200d⚕️", - "woman_health_worker_medium-dark_skin_tone": "👩🏾\u200d⚕️", - "woman_health_worker_medium-light_skin_tone": "👩🏼\u200d⚕️", - "woman_health_worker_medium_skin_tone": "👩🏽\u200d⚕️", - "woman_in_lotus_position": "🧘\u200d♀️", - "woman_in_lotus_position_dark_skin_tone": "🧘🏿\u200d♀️", - "woman_in_lotus_position_light_skin_tone": "🧘🏻\u200d♀️", - "woman_in_lotus_position_medium-dark_skin_tone": "🧘🏾\u200d♀️", - "woman_in_lotus_position_medium-light_skin_tone": "🧘🏼\u200d♀️", - "woman_in_lotus_position_medium_skin_tone": "🧘🏽\u200d♀️", - "woman_in_manual_wheelchair": "👩\u200d🦽", - "woman_in_motorized_wheelchair": "👩\u200d🦼", - "woman_in_steamy_room": "🧖\u200d♀️", - "woman_in_steamy_room_dark_skin_tone": "🧖🏿\u200d♀️", - "woman_in_steamy_room_light_skin_tone": "🧖🏻\u200d♀️", - "woman_in_steamy_room_medium-dark_skin_tone": "🧖🏾\u200d♀️", - "woman_in_steamy_room_medium-light_skin_tone": "🧖🏼\u200d♀️", - "woman_in_steamy_room_medium_skin_tone": "🧖🏽\u200d♀️", - "woman_judge": "👩\u200d⚖️", - "woman_judge_dark_skin_tone": "👩🏿\u200d⚖️", - "woman_judge_light_skin_tone": "👩🏻\u200d⚖️", - "woman_judge_medium-dark_skin_tone": "👩🏾\u200d⚖️", - "woman_judge_medium-light_skin_tone": "👩🏼\u200d⚖️", - "woman_judge_medium_skin_tone": "👩🏽\u200d⚖️", - "woman_juggling": "🤹\u200d♀️", - "woman_juggling_dark_skin_tone": "🤹🏿\u200d♀️", - "woman_juggling_light_skin_tone": "🤹🏻\u200d♀️", - "woman_juggling_medium-dark_skin_tone": "🤹🏾\u200d♀️", - "woman_juggling_medium-light_skin_tone": "🤹🏼\u200d♀️", - "woman_juggling_medium_skin_tone": "🤹🏽\u200d♀️", - "woman_lifting_weights": "🏋️\u200d♀️", - "woman_lifting_weights_dark_skin_tone": "🏋🏿\u200d♀️", - "woman_lifting_weights_light_skin_tone": "🏋🏻\u200d♀️", - "woman_lifting_weights_medium-dark_skin_tone": "🏋🏾\u200d♀️", - "woman_lifting_weights_medium-light_skin_tone": "🏋🏼\u200d♀️", - "woman_lifting_weights_medium_skin_tone": "🏋🏽\u200d♀️", - "woman_light_skin_tone": "👩🏻", - "woman_mage": "🧙\u200d♀️", - "woman_mage_dark_skin_tone": "🧙🏿\u200d♀️", - "woman_mage_light_skin_tone": "🧙🏻\u200d♀️", - "woman_mage_medium-dark_skin_tone": "🧙🏾\u200d♀️", - "woman_mage_medium-light_skin_tone": "🧙🏼\u200d♀️", - "woman_mage_medium_skin_tone": "🧙🏽\u200d♀️", - "woman_mechanic": "👩\u200d🔧", - "woman_mechanic_dark_skin_tone": "👩🏿\u200d🔧", - "woman_mechanic_light_skin_tone": "👩🏻\u200d🔧", - "woman_mechanic_medium-dark_skin_tone": "👩🏾\u200d🔧", - "woman_mechanic_medium-light_skin_tone": "👩🏼\u200d🔧", - "woman_mechanic_medium_skin_tone": "👩🏽\u200d🔧", - "woman_medium-dark_skin_tone": "👩🏾", - "woman_medium-light_skin_tone": "👩🏼", - "woman_medium_skin_tone": "👩🏽", - "woman_mountain_biking": "🚵\u200d♀️", - "woman_mountain_biking_dark_skin_tone": "🚵🏿\u200d♀️", - "woman_mountain_biking_light_skin_tone": "🚵🏻\u200d♀️", - "woman_mountain_biking_medium-dark_skin_tone": "🚵🏾\u200d♀️", - "woman_mountain_biking_medium-light_skin_tone": "🚵🏼\u200d♀️", - "woman_mountain_biking_medium_skin_tone": "🚵🏽\u200d♀️", - "woman_office_worker": "👩\u200d💼", - "woman_office_worker_dark_skin_tone": "👩🏿\u200d💼", - "woman_office_worker_light_skin_tone": "👩🏻\u200d💼", - "woman_office_worker_medium-dark_skin_tone": "👩🏾\u200d💼", - "woman_office_worker_medium-light_skin_tone": "👩🏼\u200d💼", - "woman_office_worker_medium_skin_tone": "👩🏽\u200d💼", - "woman_pilot": "👩\u200d✈️", - "woman_pilot_dark_skin_tone": "👩🏿\u200d✈️", - "woman_pilot_light_skin_tone": "👩🏻\u200d✈️", - "woman_pilot_medium-dark_skin_tone": "👩🏾\u200d✈️", - "woman_pilot_medium-light_skin_tone": "👩🏼\u200d✈️", - "woman_pilot_medium_skin_tone": "👩🏽\u200d✈️", - "woman_playing_handball": "🤾\u200d♀️", - "woman_playing_handball_dark_skin_tone": "🤾🏿\u200d♀️", - "woman_playing_handball_light_skin_tone": "🤾🏻\u200d♀️", - "woman_playing_handball_medium-dark_skin_tone": "🤾🏾\u200d♀️", - "woman_playing_handball_medium-light_skin_tone": "🤾🏼\u200d♀️", - "woman_playing_handball_medium_skin_tone": "🤾🏽\u200d♀️", - "woman_playing_water_polo": "🤽\u200d♀️", - "woman_playing_water_polo_dark_skin_tone": "🤽🏿\u200d♀️", - "woman_playing_water_polo_light_skin_tone": "🤽🏻\u200d♀️", - "woman_playing_water_polo_medium-dark_skin_tone": "🤽🏾\u200d♀️", - "woman_playing_water_polo_medium-light_skin_tone": "🤽🏼\u200d♀️", - "woman_playing_water_polo_medium_skin_tone": "🤽🏽\u200d♀️", - "woman_police_officer": "👮\u200d♀️", - "woman_police_officer_dark_skin_tone": "👮🏿\u200d♀️", - "woman_police_officer_light_skin_tone": "👮🏻\u200d♀️", - "woman_police_officer_medium-dark_skin_tone": "👮🏾\u200d♀️", - "woman_police_officer_medium-light_skin_tone": "👮🏼\u200d♀️", - "woman_police_officer_medium_skin_tone": "👮🏽\u200d♀️", - "woman_pouting": "🙎\u200d♀️", - "woman_pouting_dark_skin_tone": "🙎🏿\u200d♀️", - "woman_pouting_light_skin_tone": "🙎🏻\u200d♀️", - "woman_pouting_medium-dark_skin_tone": "🙎🏾\u200d♀️", - "woman_pouting_medium-light_skin_tone": "🙎🏼\u200d♀️", - "woman_pouting_medium_skin_tone": "🙎🏽\u200d♀️", - "woman_raising_hand": "🙋\u200d♀️", - "woman_raising_hand_dark_skin_tone": "🙋🏿\u200d♀️", - "woman_raising_hand_light_skin_tone": "🙋🏻\u200d♀️", - "woman_raising_hand_medium-dark_skin_tone": "🙋🏾\u200d♀️", - "woman_raising_hand_medium-light_skin_tone": "🙋🏼\u200d♀️", - "woman_raising_hand_medium_skin_tone": "🙋🏽\u200d♀️", - "woman_rowing_boat": "🚣\u200d♀️", - "woman_rowing_boat_dark_skin_tone": "🚣🏿\u200d♀️", - "woman_rowing_boat_light_skin_tone": "🚣🏻\u200d♀️", - "woman_rowing_boat_medium-dark_skin_tone": "🚣🏾\u200d♀️", - "woman_rowing_boat_medium-light_skin_tone": "🚣🏼\u200d♀️", - "woman_rowing_boat_medium_skin_tone": "🚣🏽\u200d♀️", - "woman_running": "🏃\u200d♀️", - "woman_running_dark_skin_tone": "🏃🏿\u200d♀️", - "woman_running_light_skin_tone": "🏃🏻\u200d♀️", - "woman_running_medium-dark_skin_tone": "🏃🏾\u200d♀️", - "woman_running_medium-light_skin_tone": "🏃🏼\u200d♀️", - "woman_running_medium_skin_tone": "🏃🏽\u200d♀️", - "woman_scientist": "👩\u200d🔬", - "woman_scientist_dark_skin_tone": "👩🏿\u200d🔬", - "woman_scientist_light_skin_tone": "👩🏻\u200d🔬", - "woman_scientist_medium-dark_skin_tone": "👩🏾\u200d🔬", - "woman_scientist_medium-light_skin_tone": "👩🏼\u200d🔬", - "woman_scientist_medium_skin_tone": "👩🏽\u200d🔬", - "woman_shrugging": "🤷\u200d♀️", - "woman_shrugging_dark_skin_tone": "🤷🏿\u200d♀️", - "woman_shrugging_light_skin_tone": "🤷🏻\u200d♀️", - "woman_shrugging_medium-dark_skin_tone": "🤷🏾\u200d♀️", - "woman_shrugging_medium-light_skin_tone": "🤷🏼\u200d♀️", - "woman_shrugging_medium_skin_tone": "🤷🏽\u200d♀️", - "woman_singer": "👩\u200d🎤", - "woman_singer_dark_skin_tone": "👩🏿\u200d🎤", - "woman_singer_light_skin_tone": "👩🏻\u200d🎤", - "woman_singer_medium-dark_skin_tone": "👩🏾\u200d🎤", - "woman_singer_medium-light_skin_tone": "👩🏼\u200d🎤", - "woman_singer_medium_skin_tone": "👩🏽\u200d🎤", - "woman_student": "👩\u200d🎓", - "woman_student_dark_skin_tone": "👩🏿\u200d🎓", - "woman_student_light_skin_tone": "👩🏻\u200d🎓", - "woman_student_medium-dark_skin_tone": "👩🏾\u200d🎓", - "woman_student_medium-light_skin_tone": "👩🏼\u200d🎓", - "woman_student_medium_skin_tone": "👩🏽\u200d🎓", - "woman_surfing": "🏄\u200d♀️", - "woman_surfing_dark_skin_tone": "🏄🏿\u200d♀️", - "woman_surfing_light_skin_tone": "🏄🏻\u200d♀️", - "woman_surfing_medium-dark_skin_tone": "🏄🏾\u200d♀️", - "woman_surfing_medium-light_skin_tone": "🏄🏼\u200d♀️", - "woman_surfing_medium_skin_tone": "🏄🏽\u200d♀️", - "woman_swimming": "🏊\u200d♀️", - "woman_swimming_dark_skin_tone": "🏊🏿\u200d♀️", - "woman_swimming_light_skin_tone": "🏊🏻\u200d♀️", - "woman_swimming_medium-dark_skin_tone": "🏊🏾\u200d♀️", - "woman_swimming_medium-light_skin_tone": "🏊🏼\u200d♀️", - "woman_swimming_medium_skin_tone": "🏊🏽\u200d♀️", - "woman_teacher": "👩\u200d🏫", - "woman_teacher_dark_skin_tone": "👩🏿\u200d🏫", - "woman_teacher_light_skin_tone": "👩🏻\u200d🏫", - "woman_teacher_medium-dark_skin_tone": "👩🏾\u200d🏫", - "woman_teacher_medium-light_skin_tone": "👩🏼\u200d🏫", - "woman_teacher_medium_skin_tone": "👩🏽\u200d🏫", - "woman_technologist": "👩\u200d💻", - "woman_technologist_dark_skin_tone": "👩🏿\u200d💻", - "woman_technologist_light_skin_tone": "👩🏻\u200d💻", - "woman_technologist_medium-dark_skin_tone": "👩🏾\u200d💻", - "woman_technologist_medium-light_skin_tone": "👩🏼\u200d💻", - "woman_technologist_medium_skin_tone": "👩🏽\u200d💻", - "woman_tipping_hand": "💁\u200d♀️", - "woman_tipping_hand_dark_skin_tone": "💁🏿\u200d♀️", - "woman_tipping_hand_light_skin_tone": "💁🏻\u200d♀️", - "woman_tipping_hand_medium-dark_skin_tone": "💁🏾\u200d♀️", - "woman_tipping_hand_medium-light_skin_tone": "💁🏼\u200d♀️", - "woman_tipping_hand_medium_skin_tone": "💁🏽\u200d♀️", - "woman_vampire": "🧛\u200d♀️", - "woman_vampire_dark_skin_tone": "🧛🏿\u200d♀️", - "woman_vampire_light_skin_tone": "🧛🏻\u200d♀️", - "woman_vampire_medium-dark_skin_tone": "🧛🏾\u200d♀️", - "woman_vampire_medium-light_skin_tone": "🧛🏼\u200d♀️", - "woman_vampire_medium_skin_tone": "🧛🏽\u200d♀️", - "woman_walking": "🚶\u200d♀️", - "woman_walking_dark_skin_tone": "🚶🏿\u200d♀️", - "woman_walking_light_skin_tone": "🚶🏻\u200d♀️", - "woman_walking_medium-dark_skin_tone": "🚶🏾\u200d♀️", - "woman_walking_medium-light_skin_tone": "🚶🏼\u200d♀️", - "woman_walking_medium_skin_tone": "🚶🏽\u200d♀️", - "woman_wearing_turban": "👳\u200d♀️", - "woman_wearing_turban_dark_skin_tone": "👳🏿\u200d♀️", - "woman_wearing_turban_light_skin_tone": "👳🏻\u200d♀️", - "woman_wearing_turban_medium-dark_skin_tone": "👳🏾\u200d♀️", - "woman_wearing_turban_medium-light_skin_tone": "👳🏼\u200d♀️", - "woman_wearing_turban_medium_skin_tone": "👳🏽\u200d♀️", - "woman_with_headscarf": "🧕", - "woman_with_headscarf_dark_skin_tone": "🧕🏿", - "woman_with_headscarf_light_skin_tone": "🧕🏻", - "woman_with_headscarf_medium-dark_skin_tone": "🧕🏾", - "woman_with_headscarf_medium-light_skin_tone": "🧕🏼", - "woman_with_headscarf_medium_skin_tone": "🧕🏽", - "woman_with_probing_cane": "👩\u200d🦯", - "woman_zombie": "🧟\u200d♀️", - "woman’s_boot": "👢", - "woman’s_clothes": "👚", - "woman’s_hat": "👒", - "woman’s_sandal": "👡", - "women_with_bunny_ears": "👯\u200d♀️", - "women_wrestling": "🤼\u200d♀️", - "women’s_room": "🚺", - "woozy_face": "🥴", - "world_map": "🗺", - "worried_face": "😟", - "wrapped_gift": "🎁", - "wrench": "🔧", - "writing_hand": "✍", - "writing_hand_dark_skin_tone": "✍🏿", - "writing_hand_light_skin_tone": "✍🏻", - "writing_hand_medium-dark_skin_tone": "✍🏾", - "writing_hand_medium-light_skin_tone": "✍🏼", - "writing_hand_medium_skin_tone": "✍🏽", - "yarn": "🧶", - "yawning_face": "🥱", - "yellow_circle": "🟡", - "yellow_heart": "💛", - "yellow_square": "🟨", - "yen_banknote": "💴", - "yo-yo": "🪀", - "yin_yang": "☯", - "zany_face": "🤪", - "zebra": "🦓", - "zipper-mouth_face": "🤐", - "zombie": "🧟", - "zzz": "💤", - "åland_islands": "🇦🇽", - "keycap_asterisk": "*⃣", - "keycap_digit_eight": "8⃣", - "keycap_digit_five": "5⃣", - "keycap_digit_four": "4⃣", - "keycap_digit_nine": "9⃣", - "keycap_digit_one": "1⃣", - "keycap_digit_seven": "7⃣", - "keycap_digit_six": "6⃣", - "keycap_digit_three": "3⃣", - "keycap_digit_two": "2⃣", - "keycap_digit_zero": "0⃣", - "keycap_number_sign": "#⃣", - "light_skin_tone": "🏻", - "medium_light_skin_tone": "🏼", - "medium_skin_tone": "🏽", - "medium_dark_skin_tone": "🏾", - "dark_skin_tone": "🏿", - "regional_indicator_symbol_letter_a": "🇦", - "regional_indicator_symbol_letter_b": "🇧", - "regional_indicator_symbol_letter_c": "🇨", - "regional_indicator_symbol_letter_d": "🇩", - "regional_indicator_symbol_letter_e": "🇪", - "regional_indicator_symbol_letter_f": "🇫", - "regional_indicator_symbol_letter_g": "🇬", - "regional_indicator_symbol_letter_h": "🇭", - "regional_indicator_symbol_letter_i": "🇮", - "regional_indicator_symbol_letter_j": "🇯", - "regional_indicator_symbol_letter_k": "🇰", - "regional_indicator_symbol_letter_l": "🇱", - "regional_indicator_symbol_letter_m": "🇲", - "regional_indicator_symbol_letter_n": "🇳", - "regional_indicator_symbol_letter_o": "🇴", - "regional_indicator_symbol_letter_p": "🇵", - "regional_indicator_symbol_letter_q": "🇶", - "regional_indicator_symbol_letter_r": "🇷", - "regional_indicator_symbol_letter_s": "🇸", - "regional_indicator_symbol_letter_t": "🇹", - "regional_indicator_symbol_letter_u": "🇺", - "regional_indicator_symbol_letter_v": "🇻", - "regional_indicator_symbol_letter_w": "🇼", - "regional_indicator_symbol_letter_x": "🇽", - "regional_indicator_symbol_letter_y": "🇾", - "regional_indicator_symbol_letter_z": "🇿", - "airplane_arriving": "🛬", - "space_invader": "👾", - "football": "🏈", - "anger": "💢", - "angry": "😠", - "anguished": "😧", - "signal_strength": "📶", - "arrows_counterclockwise": "🔄", - "arrow_heading_down": "⤵", - "arrow_heading_up": "⤴", - "art": "🎨", - "astonished": "😲", - "athletic_shoe": "👟", - "atm": "🏧", - "car": "🚗", - "red_car": "🚗", - "angel": "👼", - "back": "🔙", - "badminton_racquet_and_shuttlecock": "🏸", - "dollar": "💵", - "euro": "💶", - "pound": "💷", - "yen": "💴", - "barber": "💈", - "bath": "🛀", - "bear": "🐻", - "heartbeat": "💓", - "beer": "🍺", - "no_bell": "🔕", - "bento": "🍱", - "bike": "🚲", - "bicyclist": "🚴", - "8ball": "🎱", - "biohazard_sign": "☣", - "birthday": "🎂", - "black_circle_for_record": "⏺", - "clubs": "♣", - "diamonds": "♦", - "arrow_double_down": "⏬", - "hearts": "♥", - "rewind": "⏪", - "black_left__pointing_double_triangle_with_vertical_bar": "⏮", - "arrow_backward": "◀", - "black_medium_small_square": "◾", - "question": "❓", - "fast_forward": "⏩", - "black_right__pointing_double_triangle_with_vertical_bar": "⏭", - "arrow_forward": "▶", - "black_right__pointing_triangle_with_double_vertical_bar": "⏯", - "arrow_right": "➡", - "spades": "♠", - "black_square_for_stop": "⏹", - "sunny": "☀", - "phone": "☎", - "recycle": "♻", - "arrow_double_up": "⏫", - "busstop": "🚏", - "date": "📅", - "flags": "🎏", - "cat2": "🐈", - "joy_cat": "😹", - "smirk_cat": "😼", - "chart_with_downwards_trend": "📉", - "chart_with_upwards_trend": "📈", - "chart": "💹", - "mega": "📣", - "checkered_flag": "🏁", - "accept": "🉑", - "ideograph_advantage": "🉐", - "congratulations": "㊗", - "secret": "㊙", - "m": "Ⓜ", - "city_sunset": "🌆", - "clapper": "🎬", - "clap": "👏", - "beers": "🍻", - "clock830": "🕣", - "clock8": "🕗", - "clock1130": "🕦", - "clock11": "🕚", - "clock530": "🕠", - "clock5": "🕔", - "clock430": "🕟", - "clock4": "🕓", - "clock930": "🕤", - "clock9": "🕘", - "clock130": "🕜", - "clock1": "🕐", - "clock730": "🕢", - "clock7": "🕖", - "clock630": "🕡", - "clock6": "🕕", - "clock1030": "🕥", - "clock10": "🕙", - "clock330": "🕞", - "clock3": "🕒", - "clock1230": "🕧", - "clock12": "🕛", - "clock230": "🕝", - "clock2": "🕑", - "arrows_clockwise": "🔃", - "repeat": "🔁", - "repeat_one": "🔂", - "closed_lock_with_key": "🔐", - "mailbox_closed": "📪", - "mailbox": "📫", - "cloud_with_tornado": "🌪", - "cocktail": "🍸", - "boom": "💥", - "compression": "🗜", - "confounded": "😖", - "confused": "😕", - "rice": "🍚", - "cow2": "🐄", - "cricket_bat_and_ball": "🏏", - "x": "❌", - "cry": "😢", - "curry": "🍛", - "dagger_knife": "🗡", - "dancer": "💃", - "dark_sunglasses": "🕶", - "dash": "💨", - "truck": "🚚", - "derelict_house_building": "🏚", - "diamond_shape_with_a_dot_inside": "💠", - "dart": "🎯", - "disappointed_relieved": "😥", - "disappointed": "😞", - "do_not_litter": "🚯", - "dog2": "🐕", - "flipper": "🐬", - "loop": "➿", - "bangbang": "‼", - "double_vertical_bar": "⏸", - "dove_of_peace": "🕊", - "small_red_triangle_down": "🔻", - "arrow_down_small": "🔽", - "arrow_down": "⬇", - "dromedary_camel": "🐪", - "e__mail": "📧", - "corn": "🌽", - "ear_of_rice": "🌾", - "earth_americas": "🌎", - "earth_asia": "🌏", - "earth_africa": "🌍", - "eight_pointed_black_star": "✴", - "eight_spoked_asterisk": "✳", - "eject_symbol": "⏏", - "bulb": "💡", - "emoji_modifier_fitzpatrick_type__1__2": "🏻", - "emoji_modifier_fitzpatrick_type__3": "🏼", - "emoji_modifier_fitzpatrick_type__4": "🏽", - "emoji_modifier_fitzpatrick_type__5": "🏾", - "emoji_modifier_fitzpatrick_type__6": "🏿", - "end": "🔚", - "email": "✉", - "european_castle": "🏰", - "european_post_office": "🏤", - "interrobang": "⁉", - "expressionless": "😑", - "eyeglasses": "👓", - "massage": "💆", - "yum": "😋", - "scream": "😱", - "kissing_heart": "😘", - "sweat": "😓", - "face_with_head__bandage": "🤕", - "triumph": "😤", - "mask": "😷", - "no_good": "🙅", - "ok_woman": "🙆", - "open_mouth": "😮", - "cold_sweat": "😰", - "stuck_out_tongue": "😛", - "stuck_out_tongue_closed_eyes": "😝", - "stuck_out_tongue_winking_eye": "😜", - "joy": "😂", - "no_mouth": "😶", - "santa": "🎅", - "fax": "📠", - "fearful": "😨", - "field_hockey_stick_and_ball": "🏑", - "first_quarter_moon_with_face": "🌛", - "fish_cake": "🍥", - "fishing_pole_and_fish": "🎣", - "facepunch": "👊", - "punch": "👊", - "flag_for_afghanistan": "🇦🇫", - "flag_for_albania": "🇦🇱", - "flag_for_algeria": "🇩🇿", - "flag_for_american_samoa": "🇦🇸", - "flag_for_andorra": "🇦🇩", - "flag_for_angola": "🇦🇴", - "flag_for_anguilla": "🇦🇮", - "flag_for_antarctica": "🇦🇶", - "flag_for_antigua_&_barbuda": "🇦🇬", - "flag_for_argentina": "🇦🇷", - "flag_for_armenia": "🇦🇲", - "flag_for_aruba": "🇦🇼", - "flag_for_ascension_island": "🇦🇨", - "flag_for_australia": "🇦🇺", - "flag_for_austria": "🇦🇹", - "flag_for_azerbaijan": "🇦🇿", - "flag_for_bahamas": "🇧🇸", - "flag_for_bahrain": "🇧🇭", - "flag_for_bangladesh": "🇧🇩", - "flag_for_barbados": "🇧🇧", - "flag_for_belarus": "🇧🇾", - "flag_for_belgium": "🇧🇪", - "flag_for_belize": "🇧🇿", - "flag_for_benin": "🇧🇯", - "flag_for_bermuda": "🇧🇲", - "flag_for_bhutan": "🇧🇹", - "flag_for_bolivia": "🇧🇴", - "flag_for_bosnia_&_herzegovina": "🇧🇦", - "flag_for_botswana": "🇧🇼", - "flag_for_bouvet_island": "🇧🇻", - "flag_for_brazil": "🇧🇷", - "flag_for_british_indian_ocean_territory": "🇮🇴", - "flag_for_british_virgin_islands": "🇻🇬", - "flag_for_brunei": "🇧🇳", - "flag_for_bulgaria": "🇧🇬", - "flag_for_burkina_faso": "🇧🇫", - "flag_for_burundi": "🇧🇮", - "flag_for_cambodia": "🇰🇭", - "flag_for_cameroon": "🇨🇲", - "flag_for_canada": "🇨🇦", - "flag_for_canary_islands": "🇮🇨", - "flag_for_cape_verde": "🇨🇻", - "flag_for_caribbean_netherlands": "🇧🇶", - "flag_for_cayman_islands": "🇰🇾", - "flag_for_central_african_republic": "🇨🇫", - "flag_for_ceuta_&_melilla": "🇪🇦", - "flag_for_chad": "🇹🇩", - "flag_for_chile": "🇨🇱", - "flag_for_china": "🇨🇳", - "flag_for_christmas_island": "🇨🇽", - "flag_for_clipperton_island": "🇨🇵", - "flag_for_cocos__islands": "🇨🇨", - "flag_for_colombia": "🇨🇴", - "flag_for_comoros": "🇰🇲", - "flag_for_congo____brazzaville": "🇨🇬", - "flag_for_congo____kinshasa": "🇨🇩", - "flag_for_cook_islands": "🇨🇰", - "flag_for_costa_rica": "🇨🇷", - "flag_for_croatia": "🇭🇷", - "flag_for_cuba": "🇨🇺", - "flag_for_curaçao": "🇨🇼", - "flag_for_cyprus": "🇨🇾", - "flag_for_czech_republic": "🇨🇿", - "flag_for_côte_d’ivoire": "🇨🇮", - "flag_for_denmark": "🇩🇰", - "flag_for_diego_garcia": "🇩🇬", - "flag_for_djibouti": "🇩🇯", - "flag_for_dominica": "🇩🇲", - "flag_for_dominican_republic": "🇩🇴", - "flag_for_ecuador": "🇪🇨", - "flag_for_egypt": "🇪🇬", - "flag_for_el_salvador": "🇸🇻", - "flag_for_equatorial_guinea": "🇬🇶", - "flag_for_eritrea": "🇪🇷", - "flag_for_estonia": "🇪🇪", - "flag_for_ethiopia": "🇪🇹", - "flag_for_european_union": "🇪🇺", - "flag_for_falkland_islands": "🇫🇰", - "flag_for_faroe_islands": "🇫🇴", - "flag_for_fiji": "🇫🇯", - "flag_for_finland": "🇫🇮", - "flag_for_france": "🇫🇷", - "flag_for_french_guiana": "🇬🇫", - "flag_for_french_polynesia": "🇵🇫", - "flag_for_french_southern_territories": "🇹🇫", - "flag_for_gabon": "🇬🇦", - "flag_for_gambia": "🇬🇲", - "flag_for_georgia": "🇬🇪", - "flag_for_germany": "🇩🇪", - "flag_for_ghana": "🇬🇭", - "flag_for_gibraltar": "🇬🇮", - "flag_for_greece": "🇬🇷", - "flag_for_greenland": "🇬🇱", - "flag_for_grenada": "🇬🇩", - "flag_for_guadeloupe": "🇬🇵", - "flag_for_guam": "🇬🇺", - "flag_for_guatemala": "🇬🇹", - "flag_for_guernsey": "🇬🇬", - "flag_for_guinea": "🇬🇳", - "flag_for_guinea__bissau": "🇬🇼", - "flag_for_guyana": "🇬🇾", - "flag_for_haiti": "🇭🇹", - "flag_for_heard_&_mcdonald_islands": "🇭🇲", - "flag_for_honduras": "🇭🇳", - "flag_for_hong_kong": "🇭🇰", - "flag_for_hungary": "🇭🇺", - "flag_for_iceland": "🇮🇸", - "flag_for_india": "🇮🇳", - "flag_for_indonesia": "🇮🇩", - "flag_for_iran": "🇮🇷", - "flag_for_iraq": "🇮🇶", - "flag_for_ireland": "🇮🇪", - "flag_for_isle_of_man": "🇮🇲", - "flag_for_israel": "🇮🇱", - "flag_for_italy": "🇮🇹", - "flag_for_jamaica": "🇯🇲", - "flag_for_japan": "🇯🇵", - "flag_for_jersey": "🇯🇪", - "flag_for_jordan": "🇯🇴", - "flag_for_kazakhstan": "🇰🇿", - "flag_for_kenya": "🇰🇪", - "flag_for_kiribati": "🇰🇮", - "flag_for_kosovo": "🇽🇰", - "flag_for_kuwait": "🇰🇼", - "flag_for_kyrgyzstan": "🇰🇬", - "flag_for_laos": "🇱🇦", - "flag_for_latvia": "🇱🇻", - "flag_for_lebanon": "🇱🇧", - "flag_for_lesotho": "🇱🇸", - "flag_for_liberia": "🇱🇷", - "flag_for_libya": "🇱🇾", - "flag_for_liechtenstein": "🇱🇮", - "flag_for_lithuania": "🇱🇹", - "flag_for_luxembourg": "🇱🇺", - "flag_for_macau": "🇲🇴", - "flag_for_macedonia": "🇲🇰", - "flag_for_madagascar": "🇲🇬", - "flag_for_malawi": "🇲🇼", - "flag_for_malaysia": "🇲🇾", - "flag_for_maldives": "🇲🇻", - "flag_for_mali": "🇲🇱", - "flag_for_malta": "🇲🇹", - "flag_for_marshall_islands": "🇲🇭", - "flag_for_martinique": "🇲🇶", - "flag_for_mauritania": "🇲🇷", - "flag_for_mauritius": "🇲🇺", - "flag_for_mayotte": "🇾🇹", - "flag_for_mexico": "🇲🇽", - "flag_for_micronesia": "🇫🇲", - "flag_for_moldova": "🇲🇩", - "flag_for_monaco": "🇲🇨", - "flag_for_mongolia": "🇲🇳", - "flag_for_montenegro": "🇲🇪", - "flag_for_montserrat": "🇲🇸", - "flag_for_morocco": "🇲🇦", - "flag_for_mozambique": "🇲🇿", - "flag_for_myanmar": "🇲🇲", - "flag_for_namibia": "🇳🇦", - "flag_for_nauru": "🇳🇷", - "flag_for_nepal": "🇳🇵", - "flag_for_netherlands": "🇳🇱", - "flag_for_new_caledonia": "🇳🇨", - "flag_for_new_zealand": "🇳🇿", - "flag_for_nicaragua": "🇳🇮", - "flag_for_niger": "🇳🇪", - "flag_for_nigeria": "🇳🇬", - "flag_for_niue": "🇳🇺", - "flag_for_norfolk_island": "🇳🇫", - "flag_for_north_korea": "🇰🇵", - "flag_for_northern_mariana_islands": "🇲🇵", - "flag_for_norway": "🇳🇴", - "flag_for_oman": "🇴🇲", - "flag_for_pakistan": "🇵🇰", - "flag_for_palau": "🇵🇼", - "flag_for_palestinian_territories": "🇵🇸", - "flag_for_panama": "🇵🇦", - "flag_for_papua_new_guinea": "🇵🇬", - "flag_for_paraguay": "🇵🇾", - "flag_for_peru": "🇵🇪", - "flag_for_philippines": "🇵🇭", - "flag_for_pitcairn_islands": "🇵🇳", - "flag_for_poland": "🇵🇱", - "flag_for_portugal": "🇵🇹", - "flag_for_puerto_rico": "🇵🇷", - "flag_for_qatar": "🇶🇦", - "flag_for_romania": "🇷🇴", - "flag_for_russia": "🇷🇺", - "flag_for_rwanda": "🇷🇼", - "flag_for_réunion": "🇷🇪", - "flag_for_samoa": "🇼🇸", - "flag_for_san_marino": "🇸🇲", - "flag_for_saudi_arabia": "🇸🇦", - "flag_for_senegal": "🇸🇳", - "flag_for_serbia": "🇷🇸", - "flag_for_seychelles": "🇸🇨", - "flag_for_sierra_leone": "🇸🇱", - "flag_for_singapore": "🇸🇬", - "flag_for_sint_maarten": "🇸🇽", - "flag_for_slovakia": "🇸🇰", - "flag_for_slovenia": "🇸🇮", - "flag_for_solomon_islands": "🇸🇧", - "flag_for_somalia": "🇸🇴", - "flag_for_south_africa": "🇿🇦", - "flag_for_south_georgia_&_south_sandwich_islands": "🇬🇸", - "flag_for_south_korea": "🇰🇷", - "flag_for_south_sudan": "🇸🇸", - "flag_for_spain": "🇪🇸", - "flag_for_sri_lanka": "🇱🇰", - "flag_for_st._barthélemy": "🇧🇱", - "flag_for_st._helena": "🇸🇭", - "flag_for_st._kitts_&_nevis": "🇰🇳", - "flag_for_st._lucia": "🇱🇨", - "flag_for_st._martin": "🇲🇫", - "flag_for_st._pierre_&_miquelon": "🇵🇲", - "flag_for_st._vincent_&_grenadines": "🇻🇨", - "flag_for_sudan": "🇸🇩", - "flag_for_suriname": "🇸🇷", - "flag_for_svalbard_&_jan_mayen": "🇸🇯", - "flag_for_swaziland": "🇸🇿", - "flag_for_sweden": "🇸🇪", - "flag_for_switzerland": "🇨🇭", - "flag_for_syria": "🇸🇾", - "flag_for_são_tomé_&_príncipe": "🇸🇹", - "flag_for_taiwan": "🇹🇼", - "flag_for_tajikistan": "🇹🇯", - "flag_for_tanzania": "🇹🇿", - "flag_for_thailand": "🇹🇭", - "flag_for_timor__leste": "🇹🇱", - "flag_for_togo": "🇹🇬", - "flag_for_tokelau": "🇹🇰", - "flag_for_tonga": "🇹🇴", - "flag_for_trinidad_&_tobago": "🇹🇹", - "flag_for_tristan_da_cunha": "🇹🇦", - "flag_for_tunisia": "🇹🇳", - "flag_for_turkey": "🇹🇷", - "flag_for_turkmenistan": "🇹🇲", - "flag_for_turks_&_caicos_islands": "🇹🇨", - "flag_for_tuvalu": "🇹🇻", - "flag_for_u.s._outlying_islands": "🇺🇲", - "flag_for_u.s._virgin_islands": "🇻🇮", - "flag_for_uganda": "🇺🇬", - "flag_for_ukraine": "🇺🇦", - "flag_for_united_arab_emirates": "🇦🇪", - "flag_for_united_kingdom": "🇬🇧", - "flag_for_united_states": "🇺🇸", - "flag_for_uruguay": "🇺🇾", - "flag_for_uzbekistan": "🇺🇿", - "flag_for_vanuatu": "🇻🇺", - "flag_for_vatican_city": "🇻🇦", - "flag_for_venezuela": "🇻🇪", - "flag_for_vietnam": "🇻🇳", - "flag_for_wallis_&_futuna": "🇼🇫", - "flag_for_western_sahara": "🇪🇭", - "flag_for_yemen": "🇾🇪", - "flag_for_zambia": "🇿🇲", - "flag_for_zimbabwe": "🇿🇼", - "flag_for_åland_islands": "🇦🇽", - "golf": "⛳", - "fleur__de__lis": "⚜", - "muscle": "💪", - "flushed": "😳", - "frame_with_picture": "🖼", - "fries": "🍟", - "frog": "🐸", - "hatched_chick": "🐥", - "frowning": "😦", - "fuelpump": "⛽", - "full_moon_with_face": "🌝", - "gem": "💎", - "star2": "🌟", - "golfer": "🏌", - "mortar_board": "🎓", - "grimacing": "😬", - "smile_cat": "😸", - "grinning": "😀", - "grin": "😁", - "heartpulse": "💗", - "guardsman": "💂", - "haircut": "💇", - "hamster": "🐹", - "raising_hand": "🙋", - "headphones": "🎧", - "hear_no_evil": "🙉", - "cupid": "💘", - "gift_heart": "💝", - "heart": "❤", - "exclamation": "❗", - "heavy_exclamation_mark": "❗", - "heavy_heart_exclamation_mark_ornament": "❣", - "o": "⭕", - "helm_symbol": "⎈", - "helmet_with_white_cross": "⛑", - "high_heel": "👠", - "bullettrain_side": "🚄", - "bullettrain_front": "🚅", - "high_brightness": "🔆", - "zap": "⚡", - "hocho": "🔪", - "knife": "🔪", - "bee": "🐝", - "traffic_light": "🚥", - "racehorse": "🐎", - "coffee": "☕", - "hotsprings": "♨", - "hourglass": "⌛", - "hourglass_flowing_sand": "⏳", - "house_buildings": "🏘", - "100": "💯", - "hushed": "😯", - "ice_hockey_stick_and_puck": "🏒", - "imp": "👿", - "information_desk_person": "💁", - "information_source": "ℹ", - "capital_abcd": "🔠", - "abc": "🔤", - "abcd": "🔡", - "1234": "🔢", - "symbols": "🔣", - "izakaya_lantern": "🏮", - "lantern": "🏮", - "jack_o_lantern": "🎃", - "dolls": "🎎", - "japanese_goblin": "👺", - "japanese_ogre": "👹", - "beginner": "🔰", - "zero": "0️⃣", - "one": "1️⃣", - "ten": "🔟", - "two": "2️⃣", - "three": "3️⃣", - "four": "4️⃣", - "five": "5️⃣", - "six": "6️⃣", - "seven": "7️⃣", - "eight": "8️⃣", - "nine": "9️⃣", - "couplekiss": "💏", - "kissing_cat": "😽", - "kissing": "😗", - "kissing_closed_eyes": "😚", - "kissing_smiling_eyes": "😙", - "beetle": "🐞", - "large_blue_circle": "🔵", - "last_quarter_moon_with_face": "🌜", - "leaves": "🍃", - "mag": "🔍", - "left_right_arrow": "↔", - "leftwards_arrow_with_hook": "↩", - "arrow_left": "⬅", - "lock": "🔒", - "lock_with_ink_pen": "🔏", - "sob": "😭", - "low_brightness": "🔅", - "lower_left_ballpoint_pen": "🖊", - "lower_left_crayon": "🖍", - "lower_left_fountain_pen": "🖋", - "lower_left_paintbrush": "🖌", - "mahjong": "🀄", - "couple": "👫", - "man_in_business_suit_levitating": "🕴", - "man_with_gua_pi_mao": "👲", - "man_with_turban": "👳", - "mans_shoe": "👞", - "shoe": "👞", - "menorah_with_nine_branches": "🕎", - "mens": "🚹", - "minidisc": "💽", - "iphone": "📱", - "calling": "📲", - "money__mouth_face": "🤑", - "moneybag": "💰", - "rice_scene": "🎑", - "mountain_bicyclist": "🚵", - "mouse2": "🐁", - "lips": "👄", - "moyai": "🗿", - "notes": "🎶", - "nail_care": "💅", - "ab": "🆎", - "negative_squared_cross_mark": "❎", - "a": "🅰", - "b": "🅱", - "o2": "🅾", - "parking": "🅿", - "new_moon_with_face": "🌚", - "no_entry_sign": "🚫", - "underage": "🔞", - "non__potable_water": "🚱", - "arrow_upper_right": "↗", - "arrow_upper_left": "↖", - "office": "🏢", - "older_man": "👴", - "older_woman": "👵", - "om_symbol": "🕉", - "on": "🔛", - "book": "📖", - "unlock": "🔓", - "mailbox_with_no_mail": "📭", - "mailbox_with_mail": "📬", - "cd": "💿", - "tada": "🎉", - "feet": "🐾", - "walking": "🚶", - "pencil2": "✏", - "pensive": "😔", - "persevere": "😣", - "bow": "🙇", - "raised_hands": "🙌", - "person_with_ball": "⛹", - "person_with_blond_hair": "👱", - "pray": "🙏", - "person_with_pouting_face": "🙎", - "computer": "💻", - "pig2": "🐖", - "hankey": "💩", - "poop": "💩", - "shit": "💩", - "bamboo": "🎍", - "gun": "🔫", - "black_joker": "🃏", - "rotating_light": "🚨", - "cop": "👮", - "stew": "🍲", - "pouch": "👝", - "pouting_cat": "😾", - "rage": "😡", - "put_litter_in_its_place": "🚮", - "rabbit2": "🐇", - "racing_motorcycle": "🏍", - "radioactive_sign": "☢", - "fist": "✊", - "hand": "✋", - "raised_hand_with_fingers_splayed": "🖐", - "raised_hand_with_part_between_middle_and_ring_fingers": "🖖", - "blue_car": "🚙", - "apple": "🍎", - "relieved": "😌", - "reversed_hand_with_middle_finger_extended": "🖕", - "mag_right": "🔎", - "arrow_right_hook": "↪", - "sweet_potato": "🍠", - "robot": "🤖", - "rolled__up_newspaper": "🗞", - "rowboat": "🚣", - "runner": "🏃", - "running": "🏃", - "running_shirt_with_sash": "🎽", - "boat": "⛵", - "scales": "⚖", - "school_satchel": "🎒", - "scorpius": "♏", - "see_no_evil": "🙈", - "sheep": "🐑", - "stars": "🌠", - "cake": "🍰", - "six_pointed_star": "🔯", - "ski": "🎿", - "sleeping_accommodation": "🛌", - "sleeping": "😴", - "sleepy": "😪", - "sleuth_or_spy": "🕵", - "heart_eyes_cat": "😻", - "smiley_cat": "😺", - "innocent": "😇", - "heart_eyes": "😍", - "smiling_imp": "😈", - "smiley": "😃", - "sweat_smile": "😅", - "smile": "😄", - "laughing": "😆", - "satisfied": "😆", - "blush": "😊", - "smirk": "😏", - "smoking": "🚬", - "snow_capped_mountain": "🏔", - "soccer": "⚽", - "icecream": "🍦", - "soon": "🔜", - "arrow_lower_right": "↘", - "arrow_lower_left": "↙", - "speak_no_evil": "🙊", - "speaker": "🔈", - "mute": "🔇", - "sound": "🔉", - "loud_sound": "🔊", - "speaking_head_in_silhouette": "🗣", - "spiral_calendar_pad": "🗓", - "spiral_note_pad": "🗒", - "shell": "🐚", - "sweat_drops": "💦", - "u5272": "🈹", - "u5408": "🈴", - "u55b6": "🈺", - "u6307": "🈯", - "u6708": "🈷", - "u6709": "🈶", - "u6e80": "🈵", - "u7121": "🈚", - "u7533": "🈸", - "u7981": "🈲", - "u7a7a": "🈳", - "cl": "🆑", - "cool": "🆒", - "free": "🆓", - "id": "🆔", - "koko": "🈁", - "sa": "🈂", - "new": "🆕", - "ng": "🆖", - "ok": "🆗", - "sos": "🆘", - "up": "🆙", - "vs": "🆚", - "steam_locomotive": "🚂", - "ramen": "🍜", - "partly_sunny": "⛅", - "city_sunrise": "🌇", - "surfer": "🏄", - "swimmer": "🏊", - "shirt": "👕", - "tshirt": "👕", - "table_tennis_paddle_and_ball": "🏓", - "tea": "🍵", - "tv": "📺", - "three_button_mouse": "🖱", - "+1": "👍", - "thumbsup": "👍", - "__1": "👎", - "-1": "👎", - "thumbsdown": "👎", - "thunder_cloud_and_rain": "⛈", - "tiger2": "🐅", - "tophat": "🎩", - "top": "🔝", - "tm": "™", - "train2": "🚆", - "triangular_flag_on_post": "🚩", - "trident": "🔱", - "twisted_rightwards_arrows": "🔀", - "unamused": "😒", - "small_red_triangle": "🔺", - "arrow_up_small": "🔼", - "arrow_up_down": "↕", - "upside__down_face": "🙃", - "arrow_up": "⬆", - "v": "✌", - "vhs": "📼", - "wc": "🚾", - "ocean": "🌊", - "waving_black_flag": "🏴", - "wave": "👋", - "waving_white_flag": "🏳", - "moon": "🌔", - "scream_cat": "🙀", - "weary": "😩", - "weight_lifter": "🏋", - "whale2": "🐋", - "wheelchair": "♿", - "point_down": "👇", - "grey_exclamation": "❕", - "white_frowning_face": "☹", - "white_check_mark": "✅", - "point_left": "👈", - "white_medium_small_square": "◽", - "star": "⭐", - "grey_question": "❔", - "point_right": "👉", - "relaxed": "☺", - "white_sun_behind_cloud": "🌥", - "white_sun_behind_cloud_with_rain": "🌦", - "white_sun_with_small_cloud": "🌤", - "point_up_2": "👆", - "point_up": "☝", - "wind_blowing_face": "🌬", - "wink": "😉", - "wolf": "🐺", - "dancers": "👯", - "boot": "👢", - "womans_clothes": "👚", - "womans_hat": "👒", - "sandal": "👡", - "womens": "🚺", - "worried": "😟", - "gift": "🎁", - "zipper__mouth_face": "🤐", - "regional_indicator_a": "🇦", - "regional_indicator_b": "🇧", - "regional_indicator_c": "🇨", - "regional_indicator_d": "🇩", - "regional_indicator_e": "🇪", - "regional_indicator_f": "🇫", - "regional_indicator_g": "🇬", - "regional_indicator_h": "🇭", - "regional_indicator_i": "🇮", - "regional_indicator_j": "🇯", - "regional_indicator_k": "🇰", - "regional_indicator_l": "🇱", - "regional_indicator_m": "🇲", - "regional_indicator_n": "🇳", - "regional_indicator_o": "🇴", - "regional_indicator_p": "🇵", - "regional_indicator_q": "🇶", - "regional_indicator_r": "🇷", - "regional_indicator_s": "🇸", - "regional_indicator_t": "🇹", - "regional_indicator_u": "🇺", - "regional_indicator_v": "🇻", - "regional_indicator_w": "🇼", - "regional_indicator_x": "🇽", - "regional_indicator_y": "🇾", - "regional_indicator_z": "🇿", -} diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_replace.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_replace.py deleted file mode 100644 index bb2cafa..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_replace.py +++ /dev/null @@ -1,32 +0,0 @@ -from typing import Callable, Match, Optional -import re - -from ._emoji_codes import EMOJI - - -_ReStringMatch = Match[str] # regex match object -_ReSubCallable = Callable[[_ReStringMatch], str] # Callable invoked by re.sub -_EmojiSubMethod = Callable[[_ReSubCallable, str], str] # Sub method of a compiled re - - -def _emoji_replace( - text: str, - default_variant: Optional[str] = None, - _emoji_sub: _EmojiSubMethod = re.compile(r"(:(\S*?)(?:(?:\-)(emoji|text))?:)").sub, -) -> str: - """Replace emoji code in text.""" - get_emoji = EMOJI.__getitem__ - variants = {"text": "\uFE0E", "emoji": "\uFE0F"} - get_variant = variants.get - default_variant_code = variants.get(default_variant, "") if default_variant else "" - - def do_replace(match: Match[str]) -> str: - emoji_code, emoji_name, variant = match.groups() - try: - return get_emoji(emoji_name.lower()) + get_variant( - variant, default_variant_code - ) - except KeyError: - return emoji_code - - return _emoji_sub(do_replace, text) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_export_format.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/_export_format.py deleted file mode 100644 index 094d2dc..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_export_format.py +++ /dev/null @@ -1,76 +0,0 @@ -CONSOLE_HTML_FORMAT = """\ -<!DOCTYPE html> -<head> -<meta charset="UTF-8"> -<style> -{stylesheet} -body {{ - color: {foreground}; - background-color: {background}; -}} -</style> -</head> -<html> -<body> - <pre style="font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace"><code>{code}</code></pre> -</body> -</html> -""" - -CONSOLE_SVG_FORMAT = """\ -<svg class="rich-terminal" viewBox="0 0 {width} {height}" xmlns="http://www.w3.org/2000/svg"> - <!-- Generated with Rich https://www.textualize.io --> - <style> - - @font-face {{ - font-family: "Fira Code"; - src: local("FiraCode-Regular"), - url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"), - url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff"); - font-style: normal; - font-weight: 400; - }} - @font-face {{ - font-family: "Fira Code"; - src: local("FiraCode-Bold"), - url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"), - url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff"); - font-style: bold; - font-weight: 700; - }} - - .{unique_id}-matrix {{ - font-family: Fira Code, monospace; - font-size: {char_height}px; - line-height: {line_height}px; - font-variant-east-asian: full-width; - }} - - .{unique_id}-title {{ - font-size: 18px; - font-weight: bold; - font-family: arial; - }} - - {styles} - </style> - - <defs> - <clipPath id="{unique_id}-clip-terminal"> - <rect x="0" y="0" width="{terminal_width}" height="{terminal_height}" /> - </clipPath> - {lines} - </defs> - - {chrome} - <g transform="translate({terminal_x}, {terminal_y})" clip-path="url(#{unique_id}-clip-terminal)"> - {backgrounds} - <g class="{unique_id}-matrix"> - {matrix} - </g> - </g> -</svg> -""" - -_SVG_FONT_FAMILY = "Rich Fira Code" -_SVG_CLASSES_PREFIX = "rich-svg" diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_extension.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/_extension.py deleted file mode 100644 index cbd6da9..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_extension.py +++ /dev/null @@ -1,10 +0,0 @@ -from typing import Any - - -def load_ipython_extension(ip: Any) -> None: # pragma: no cover - # prevent circular import - from pip._vendor.rich.pretty import install - from pip._vendor.rich.traceback import install as tr_install - - install() - tr_install() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_fileno.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/_fileno.py deleted file mode 100644 index b17ee65..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_fileno.py +++ /dev/null @@ -1,24 +0,0 @@ -from __future__ import annotations - -from typing import IO, Callable - - -def get_fileno(file_like: IO[str]) -> int | None: - """Get fileno() from a file, accounting for poorly implemented file-like objects. - - Args: - file_like (IO): A file-like object. - - Returns: - int | None: The result of fileno if available, or None if operation failed. - """ - fileno: Callable[[], int] | None = getattr(file_like, "fileno", None) - if fileno is not None: - try: - return fileno() - except Exception: - # `fileno` is documented as potentially raising a OSError - # Alas, from the issues, there are so many poorly implemented file-like objects, - # that `fileno()` can raise just about anything. - return None - return None diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_inspect.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/_inspect.py deleted file mode 100644 index 30446ce..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_inspect.py +++ /dev/null @@ -1,270 +0,0 @@ -from __future__ import absolute_import - -import inspect -from inspect import cleandoc, getdoc, getfile, isclass, ismodule, signature -from typing import Any, Collection, Iterable, Optional, Tuple, Type, Union - -from .console import Group, RenderableType -from .control import escape_control_codes -from .highlighter import ReprHighlighter -from .jupyter import JupyterMixin -from .panel import Panel -from .pretty import Pretty -from .table import Table -from .text import Text, TextType - - -def _first_paragraph(doc: str) -> str: - """Get the first paragraph from a docstring.""" - paragraph, _, _ = doc.partition("\n\n") - return paragraph - - -class Inspect(JupyterMixin): - """A renderable to inspect any Python Object. - - Args: - obj (Any): An object to inspect. - title (str, optional): Title to display over inspect result, or None use type. Defaults to None. - help (bool, optional): Show full help text rather than just first paragraph. Defaults to False. - methods (bool, optional): Enable inspection of callables. Defaults to False. - docs (bool, optional): Also render doc strings. Defaults to True. - private (bool, optional): Show private attributes (beginning with underscore). Defaults to False. - dunder (bool, optional): Show attributes starting with double underscore. Defaults to False. - sort (bool, optional): Sort attributes alphabetically. Defaults to True. - all (bool, optional): Show all attributes. Defaults to False. - value (bool, optional): Pretty print value of object. Defaults to True. - """ - - def __init__( - self, - obj: Any, - *, - title: Optional[TextType] = None, - help: bool = False, - methods: bool = False, - docs: bool = True, - private: bool = False, - dunder: bool = False, - sort: bool = True, - all: bool = True, - value: bool = True, - ) -> None: - self.highlighter = ReprHighlighter() - self.obj = obj - self.title = title or self._make_title(obj) - if all: - methods = private = dunder = True - self.help = help - self.methods = methods - self.docs = docs or help - self.private = private or dunder - self.dunder = dunder - self.sort = sort - self.value = value - - def _make_title(self, obj: Any) -> Text: - """Make a default title.""" - title_str = ( - str(obj) - if (isclass(obj) or callable(obj) or ismodule(obj)) - else str(type(obj)) - ) - title_text = self.highlighter(title_str) - return title_text - - def __rich__(self) -> Panel: - return Panel.fit( - Group(*self._render()), - title=self.title, - border_style="scope.border", - padding=(0, 1), - ) - - def _get_signature(self, name: str, obj: Any) -> Optional[Text]: - """Get a signature for a callable.""" - try: - _signature = str(signature(obj)) + ":" - except ValueError: - _signature = "(...)" - except TypeError: - return None - - source_filename: Optional[str] = None - try: - source_filename = getfile(obj) - except (OSError, TypeError): - # OSError is raised if obj has no source file, e.g. when defined in REPL. - pass - - callable_name = Text(name, style="inspect.callable") - if source_filename: - callable_name.stylize(f"link file://{source_filename}") - signature_text = self.highlighter(_signature) - - qualname = name or getattr(obj, "__qualname__", name) - - # If obj is a module, there may be classes (which are callable) to display - if inspect.isclass(obj): - prefix = "class" - elif inspect.iscoroutinefunction(obj): - prefix = "async def" - else: - prefix = "def" - - qual_signature = Text.assemble( - (f"{prefix} ", f"inspect.{prefix.replace(' ', '_')}"), - (qualname, "inspect.callable"), - signature_text, - ) - - return qual_signature - - def _render(self) -> Iterable[RenderableType]: - """Render object.""" - - def sort_items(item: Tuple[str, Any]) -> Tuple[bool, str]: - key, (_error, value) = item - return (callable(value), key.strip("_").lower()) - - def safe_getattr(attr_name: str) -> Tuple[Any, Any]: - """Get attribute or any exception.""" - try: - return (None, getattr(obj, attr_name)) - except Exception as error: - return (error, None) - - obj = self.obj - keys = dir(obj) - total_items = len(keys) - if not self.dunder: - keys = [key for key in keys if not key.startswith("__")] - if not self.private: - keys = [key for key in keys if not key.startswith("_")] - not_shown_count = total_items - len(keys) - items = [(key, safe_getattr(key)) for key in keys] - if self.sort: - items.sort(key=sort_items) - - items_table = Table.grid(padding=(0, 1), expand=False) - items_table.add_column(justify="right") - add_row = items_table.add_row - highlighter = self.highlighter - - if callable(obj): - signature = self._get_signature("", obj) - if signature is not None: - yield signature - yield "" - - if self.docs: - _doc = self._get_formatted_doc(obj) - if _doc is not None: - doc_text = Text(_doc, style="inspect.help") - doc_text = highlighter(doc_text) - yield doc_text - yield "" - - if self.value and not (isclass(obj) or callable(obj) or ismodule(obj)): - yield Panel( - Pretty(obj, indent_guides=True, max_length=10, max_string=60), - border_style="inspect.value.border", - ) - yield "" - - for key, (error, value) in items: - key_text = Text.assemble( - ( - key, - "inspect.attr.dunder" if key.startswith("__") else "inspect.attr", - ), - (" =", "inspect.equals"), - ) - if error is not None: - warning = key_text.copy() - warning.stylize("inspect.error") - add_row(warning, highlighter(repr(error))) - continue - - if callable(value): - if not self.methods: - continue - - _signature_text = self._get_signature(key, value) - if _signature_text is None: - add_row(key_text, Pretty(value, highlighter=highlighter)) - else: - if self.docs: - docs = self._get_formatted_doc(value) - if docs is not None: - _signature_text.append("\n" if "\n" in docs else " ") - doc = highlighter(docs) - doc.stylize("inspect.doc") - _signature_text.append(doc) - - add_row(key_text, _signature_text) - else: - add_row(key_text, Pretty(value, highlighter=highlighter)) - if items_table.row_count: - yield items_table - elif not_shown_count: - yield Text.from_markup( - f"[b cyan]{not_shown_count}[/][i] attribute(s) not shown.[/i] " - f"Run [b][magenta]inspect[/]([not b]inspect[/])[/b] for options." - ) - - def _get_formatted_doc(self, object_: Any) -> Optional[str]: - """ - Extract the docstring of an object, process it and returns it. - The processing consists in cleaning up the doctring's indentation, - taking only its 1st paragraph if `self.help` is not True, - and escape its control codes. - - Args: - object_ (Any): the object to get the docstring from. - - Returns: - Optional[str]: the processed docstring, or None if no docstring was found. - """ - docs = getdoc(object_) - if docs is None: - return None - docs = cleandoc(docs).strip() - if not self.help: - docs = _first_paragraph(docs) - return escape_control_codes(docs) - - -def get_object_types_mro(obj: Union[object, Type[Any]]) -> Tuple[type, ...]: - """Returns the MRO of an object's class, or of the object itself if it's a class.""" - if not hasattr(obj, "__mro__"): - # N.B. we cannot use `if type(obj) is type` here because it doesn't work with - # some types of classes, such as the ones that use abc.ABCMeta. - obj = type(obj) - return getattr(obj, "__mro__", ()) - - -def get_object_types_mro_as_strings(obj: object) -> Collection[str]: - """ - Returns the MRO of an object's class as full qualified names, or of the object itself if it's a class. - - Examples: - `object_types_mro_as_strings(JSONDecoder)` will return `['json.decoder.JSONDecoder', 'builtins.object']` - """ - return [ - f'{getattr(type_, "__module__", "")}.{getattr(type_, "__qualname__", "")}' - for type_ in get_object_types_mro(obj) - ] - - -def is_object_one_of_types( - obj: object, fully_qualified_types_names: Collection[str] -) -> bool: - """ - Returns `True` if the given object's class (or the object itself, if it's a class) has one of the - fully qualified names in its MRO. - """ - for type_name in get_object_types_mro_as_strings(obj): - if type_name in fully_qualified_types_names: - return True - return False diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_log_render.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/_log_render.py deleted file mode 100644 index fc16c84..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_log_render.py +++ /dev/null @@ -1,94 +0,0 @@ -from datetime import datetime -from typing import Iterable, List, Optional, TYPE_CHECKING, Union, Callable - - -from .text import Text, TextType - -if TYPE_CHECKING: - from .console import Console, ConsoleRenderable, RenderableType - from .table import Table - -FormatTimeCallable = Callable[[datetime], Text] - - -class LogRender: - def __init__( - self, - show_time: bool = True, - show_level: bool = False, - show_path: bool = True, - time_format: Union[str, FormatTimeCallable] = "[%x %X]", - omit_repeated_times: bool = True, - level_width: Optional[int] = 8, - ) -> None: - self.show_time = show_time - self.show_level = show_level - self.show_path = show_path - self.time_format = time_format - self.omit_repeated_times = omit_repeated_times - self.level_width = level_width - self._last_time: Optional[Text] = None - - def __call__( - self, - console: "Console", - renderables: Iterable["ConsoleRenderable"], - log_time: Optional[datetime] = None, - time_format: Optional[Union[str, FormatTimeCallable]] = None, - level: TextType = "", - path: Optional[str] = None, - line_no: Optional[int] = None, - link_path: Optional[str] = None, - ) -> "Table": - from .containers import Renderables - from .table import Table - - output = Table.grid(padding=(0, 1)) - output.expand = True - if self.show_time: - output.add_column(style="log.time") - if self.show_level: - output.add_column(style="log.level", width=self.level_width) - output.add_column(ratio=1, style="log.message", overflow="fold") - if self.show_path and path: - output.add_column(style="log.path") - row: List["RenderableType"] = [] - if self.show_time: - log_time = log_time or console.get_datetime() - time_format = time_format or self.time_format - if callable(time_format): - log_time_display = time_format(log_time) - else: - log_time_display = Text(log_time.strftime(time_format)) - if log_time_display == self._last_time and self.omit_repeated_times: - row.append(Text(" " * len(log_time_display))) - else: - row.append(log_time_display) - self._last_time = log_time_display - if self.show_level: - row.append(level) - - row.append(Renderables(renderables)) - if self.show_path and path: - path_text = Text() - path_text.append( - path, style=f"link file://{link_path}" if link_path else "" - ) - if line_no: - path_text.append(":") - path_text.append( - f"{line_no}", - style=f"link file://{link_path}#{line_no}" if link_path else "", - ) - row.append(path_text) - - output.add_row(*row) - return output - - -if __name__ == "__main__": # pragma: no cover - from pip._vendor.rich.console import Console - - c = Console() - c.print("[on blue]Hello", justify="right") - c.log("[on blue]hello", justify="right") diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_loop.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/_loop.py deleted file mode 100644 index 01c6caf..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_loop.py +++ /dev/null @@ -1,43 +0,0 @@ -from typing import Iterable, Tuple, TypeVar - -T = TypeVar("T") - - -def loop_first(values: Iterable[T]) -> Iterable[Tuple[bool, T]]: - """Iterate and generate a tuple with a flag for first value.""" - iter_values = iter(values) - try: - value = next(iter_values) - except StopIteration: - return - yield True, value - for value in iter_values: - yield False, value - - -def loop_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]: - """Iterate and generate a tuple with a flag for last value.""" - iter_values = iter(values) - try: - previous_value = next(iter_values) - except StopIteration: - return - for value in iter_values: - yield False, previous_value - previous_value = value - yield True, previous_value - - -def loop_first_last(values: Iterable[T]) -> Iterable[Tuple[bool, bool, T]]: - """Iterate and generate a tuple with a flag for first and last value.""" - iter_values = iter(values) - try: - previous_value = next(iter_values) - except StopIteration: - return - first = True - for value in iter_values: - yield first, False, previous_value - first = False - previous_value = value - yield first, True, previous_value diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_null_file.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/_null_file.py deleted file mode 100644 index b659673..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_null_file.py +++ /dev/null @@ -1,69 +0,0 @@ -from types import TracebackType -from typing import IO, Iterable, Iterator, List, Optional, Type - - -class NullFile(IO[str]): - def close(self) -> None: - pass - - def isatty(self) -> bool: - return False - - def read(self, __n: int = 1) -> str: - return "" - - def readable(self) -> bool: - return False - - def readline(self, __limit: int = 1) -> str: - return "" - - def readlines(self, __hint: int = 1) -> List[str]: - return [] - - def seek(self, __offset: int, __whence: int = 1) -> int: - return 0 - - def seekable(self) -> bool: - return False - - def tell(self) -> int: - return 0 - - def truncate(self, __size: Optional[int] = 1) -> int: - return 0 - - def writable(self) -> bool: - return False - - def writelines(self, __lines: Iterable[str]) -> None: - pass - - def __next__(self) -> str: - return "" - - def __iter__(self) -> Iterator[str]: - return iter([""]) - - def __enter__(self) -> IO[str]: - pass - - def __exit__( - self, - __t: Optional[Type[BaseException]], - __value: Optional[BaseException], - __traceback: Optional[TracebackType], - ) -> None: - pass - - def write(self, text: str) -> int: - return 0 - - def flush(self) -> None: - pass - - def fileno(self) -> int: - return -1 - - -NULL_FILE = NullFile() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_palettes.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/_palettes.py deleted file mode 100644 index 3c748d3..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_palettes.py +++ /dev/null @@ -1,309 +0,0 @@ -from .palette import Palette - - -# Taken from https://en.wikipedia.org/wiki/ANSI_escape_code (Windows 10 column) -WINDOWS_PALETTE = Palette( - [ - (12, 12, 12), - (197, 15, 31), - (19, 161, 14), - (193, 156, 0), - (0, 55, 218), - (136, 23, 152), - (58, 150, 221), - (204, 204, 204), - (118, 118, 118), - (231, 72, 86), - (22, 198, 12), - (249, 241, 165), - (59, 120, 255), - (180, 0, 158), - (97, 214, 214), - (242, 242, 242), - ] -) - -# # The standard ansi colors (including bright variants) -STANDARD_PALETTE = Palette( - [ - (0, 0, 0), - (170, 0, 0), - (0, 170, 0), - (170, 85, 0), - (0, 0, 170), - (170, 0, 170), - (0, 170, 170), - (170, 170, 170), - (85, 85, 85), - (255, 85, 85), - (85, 255, 85), - (255, 255, 85), - (85, 85, 255), - (255, 85, 255), - (85, 255, 255), - (255, 255, 255), - ] -) - - -# The 256 color palette -EIGHT_BIT_PALETTE = Palette( - [ - (0, 0, 0), - (128, 0, 0), - (0, 128, 0), - (128, 128, 0), - (0, 0, 128), - (128, 0, 128), - (0, 128, 128), - (192, 192, 192), - (128, 128, 128), - (255, 0, 0), - (0, 255, 0), - (255, 255, 0), - (0, 0, 255), - (255, 0, 255), - (0, 255, 255), - (255, 255, 255), - (0, 0, 0), - (0, 0, 95), - (0, 0, 135), - (0, 0, 175), - (0, 0, 215), - (0, 0, 255), - (0, 95, 0), - (0, 95, 95), - (0, 95, 135), - (0, 95, 175), - (0, 95, 215), - (0, 95, 255), - (0, 135, 0), - (0, 135, 95), - (0, 135, 135), - (0, 135, 175), - (0, 135, 215), - (0, 135, 255), - (0, 175, 0), - (0, 175, 95), - (0, 175, 135), - (0, 175, 175), - (0, 175, 215), - (0, 175, 255), - (0, 215, 0), - (0, 215, 95), - (0, 215, 135), - (0, 215, 175), - (0, 215, 215), - (0, 215, 255), - (0, 255, 0), - (0, 255, 95), - (0, 255, 135), - (0, 255, 175), - (0, 255, 215), - (0, 255, 255), - (95, 0, 0), - (95, 0, 95), - (95, 0, 135), - (95, 0, 175), - (95, 0, 215), - (95, 0, 255), - (95, 95, 0), - (95, 95, 95), - (95, 95, 135), - (95, 95, 175), - (95, 95, 215), - (95, 95, 255), - (95, 135, 0), - (95, 135, 95), - (95, 135, 135), - (95, 135, 175), - (95, 135, 215), - (95, 135, 255), - (95, 175, 0), - (95, 175, 95), - (95, 175, 135), - (95, 175, 175), - (95, 175, 215), - (95, 175, 255), - (95, 215, 0), - (95, 215, 95), - (95, 215, 135), - (95, 215, 175), - (95, 215, 215), - (95, 215, 255), - (95, 255, 0), - (95, 255, 95), - (95, 255, 135), - (95, 255, 175), - (95, 255, 215), - (95, 255, 255), - (135, 0, 0), - (135, 0, 95), - (135, 0, 135), - (135, 0, 175), - (135, 0, 215), - (135, 0, 255), - (135, 95, 0), - (135, 95, 95), - (135, 95, 135), - (135, 95, 175), - (135, 95, 215), - (135, 95, 255), - (135, 135, 0), - (135, 135, 95), - (135, 135, 135), - (135, 135, 175), - (135, 135, 215), - (135, 135, 255), - (135, 175, 0), - (135, 175, 95), - (135, 175, 135), - (135, 175, 175), - (135, 175, 215), - (135, 175, 255), - (135, 215, 0), - (135, 215, 95), - (135, 215, 135), - (135, 215, 175), - (135, 215, 215), - (135, 215, 255), - (135, 255, 0), - (135, 255, 95), - (135, 255, 135), - (135, 255, 175), - (135, 255, 215), - (135, 255, 255), - (175, 0, 0), - (175, 0, 95), - (175, 0, 135), - (175, 0, 175), - (175, 0, 215), - (175, 0, 255), - (175, 95, 0), - (175, 95, 95), - (175, 95, 135), - (175, 95, 175), - (175, 95, 215), - (175, 95, 255), - (175, 135, 0), - (175, 135, 95), - (175, 135, 135), - (175, 135, 175), - (175, 135, 215), - (175, 135, 255), - (175, 175, 0), - (175, 175, 95), - (175, 175, 135), - (175, 175, 175), - (175, 175, 215), - (175, 175, 255), - (175, 215, 0), - (175, 215, 95), - (175, 215, 135), - (175, 215, 175), - (175, 215, 215), - (175, 215, 255), - (175, 255, 0), - (175, 255, 95), - (175, 255, 135), - (175, 255, 175), - (175, 255, 215), - (175, 255, 255), - (215, 0, 0), - (215, 0, 95), - (215, 0, 135), - (215, 0, 175), - (215, 0, 215), - (215, 0, 255), - (215, 95, 0), - (215, 95, 95), - (215, 95, 135), - (215, 95, 175), - (215, 95, 215), - (215, 95, 255), - (215, 135, 0), - (215, 135, 95), - (215, 135, 135), - (215, 135, 175), - (215, 135, 215), - (215, 135, 255), - (215, 175, 0), - (215, 175, 95), - (215, 175, 135), - (215, 175, 175), - (215, 175, 215), - (215, 175, 255), - (215, 215, 0), - (215, 215, 95), - (215, 215, 135), - (215, 215, 175), - (215, 215, 215), - (215, 215, 255), - (215, 255, 0), - (215, 255, 95), - (215, 255, 135), - (215, 255, 175), - (215, 255, 215), - (215, 255, 255), - (255, 0, 0), - (255, 0, 95), - (255, 0, 135), - (255, 0, 175), - (255, 0, 215), - (255, 0, 255), - (255, 95, 0), - (255, 95, 95), - (255, 95, 135), - (255, 95, 175), - (255, 95, 215), - (255, 95, 255), - (255, 135, 0), - (255, 135, 95), - (255, 135, 135), - (255, 135, 175), - (255, 135, 215), - (255, 135, 255), - (255, 175, 0), - (255, 175, 95), - (255, 175, 135), - (255, 175, 175), - (255, 175, 215), - (255, 175, 255), - (255, 215, 0), - (255, 215, 95), - (255, 215, 135), - (255, 215, 175), - (255, 215, 215), - (255, 215, 255), - (255, 255, 0), - (255, 255, 95), - (255, 255, 135), - (255, 255, 175), - (255, 255, 215), - (255, 255, 255), - (8, 8, 8), - (18, 18, 18), - (28, 28, 28), - (38, 38, 38), - (48, 48, 48), - (58, 58, 58), - (68, 68, 68), - (78, 78, 78), - (88, 88, 88), - (98, 98, 98), - (108, 108, 108), - (118, 118, 118), - (128, 128, 128), - (138, 138, 138), - (148, 148, 148), - (158, 158, 158), - (168, 168, 168), - (178, 178, 178), - (188, 188, 188), - (198, 198, 198), - (208, 208, 208), - (218, 218, 218), - (228, 228, 228), - (238, 238, 238), - ] -) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_pick.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/_pick.py deleted file mode 100644 index 4f6d8b2..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_pick.py +++ /dev/null @@ -1,17 +0,0 @@ -from typing import Optional - - -def pick_bool(*values: Optional[bool]) -> bool: - """Pick the first non-none bool or return the last value. - - Args: - *values (bool): Any number of boolean or None values. - - Returns: - bool: First non-none boolean. - """ - assert values, "1 or more values required" - for value in values: - if value is not None: - return value - return bool(value) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py deleted file mode 100644 index e8a3a67..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py +++ /dev/null @@ -1,160 +0,0 @@ -import sys -from fractions import Fraction -from math import ceil -from typing import cast, List, Optional, Sequence - -if sys.version_info >= (3, 8): - from typing import Protocol -else: - from pip._vendor.typing_extensions import Protocol # pragma: no cover - - -class Edge(Protocol): - """Any object that defines an edge (such as Layout).""" - - size: Optional[int] = None - ratio: int = 1 - minimum_size: int = 1 - - -def ratio_resolve(total: int, edges: Sequence[Edge]) -> List[int]: - """Divide total space to satisfy size, ratio, and minimum_size, constraints. - - The returned list of integers should add up to total in most cases, unless it is - impossible to satisfy all the constraints. For instance, if there are two edges - with a minimum size of 20 each and `total` is 30 then the returned list will be - greater than total. In practice, this would mean that a Layout object would - clip the rows that would overflow the screen height. - - Args: - total (int): Total number of characters. - edges (List[Edge]): Edges within total space. - - Returns: - List[int]: Number of characters for each edge. - """ - # Size of edge or None for yet to be determined - sizes = [(edge.size or None) for edge in edges] - - _Fraction = Fraction - - # While any edges haven't been calculated - while None in sizes: - # Get flexible edges and index to map these back on to sizes list - flexible_edges = [ - (index, edge) - for index, (size, edge) in enumerate(zip(sizes, edges)) - if size is None - ] - # Remaining space in total - remaining = total - sum(size or 0 for size in sizes) - if remaining <= 0: - # No room for flexible edges - return [ - ((edge.minimum_size or 1) if size is None else size) - for size, edge in zip(sizes, edges) - ] - # Calculate number of characters in a ratio portion - portion = _Fraction( - remaining, sum((edge.ratio or 1) for _, edge in flexible_edges) - ) - - # If any edges will be less than their minimum, replace size with the minimum - for index, edge in flexible_edges: - if portion * edge.ratio <= edge.minimum_size: - sizes[index] = edge.minimum_size - # New fixed size will invalidate calculations, so we need to repeat the process - break - else: - # Distribute flexible space and compensate for rounding error - # Since edge sizes can only be integers we need to add the remainder - # to the following line - remainder = _Fraction(0) - for index, edge in flexible_edges: - size, remainder = divmod(portion * edge.ratio + remainder, 1) - sizes[index] = size - break - # Sizes now contains integers only - return cast(List[int], sizes) - - -def ratio_reduce( - total: int, ratios: List[int], maximums: List[int], values: List[int] -) -> List[int]: - """Divide an integer total in to parts based on ratios. - - Args: - total (int): The total to divide. - ratios (List[int]): A list of integer ratios. - maximums (List[int]): List of maximums values for each slot. - values (List[int]): List of values - - Returns: - List[int]: A list of integers guaranteed to sum to total. - """ - ratios = [ratio if _max else 0 for ratio, _max in zip(ratios, maximums)] - total_ratio = sum(ratios) - if not total_ratio: - return values[:] - total_remaining = total - result: List[int] = [] - append = result.append - for ratio, maximum, value in zip(ratios, maximums, values): - if ratio and total_ratio > 0: - distributed = min(maximum, round(ratio * total_remaining / total_ratio)) - append(value - distributed) - total_remaining -= distributed - total_ratio -= ratio - else: - append(value) - return result - - -def ratio_distribute( - total: int, ratios: List[int], minimums: Optional[List[int]] = None -) -> List[int]: - """Distribute an integer total in to parts based on ratios. - - Args: - total (int): The total to divide. - ratios (List[int]): A list of integer ratios. - minimums (List[int]): List of minimum values for each slot. - - Returns: - List[int]: A list of integers guaranteed to sum to total. - """ - if minimums: - ratios = [ratio if _min else 0 for ratio, _min in zip(ratios, minimums)] - total_ratio = sum(ratios) - assert total_ratio > 0, "Sum of ratios must be > 0" - - total_remaining = total - distributed_total: List[int] = [] - append = distributed_total.append - if minimums is None: - _minimums = [0] * len(ratios) - else: - _minimums = minimums - for ratio, minimum in zip(ratios, _minimums): - if total_ratio > 0: - distributed = max(minimum, ceil(ratio * total_remaining / total_ratio)) - else: - distributed = total_remaining - append(distributed) - total_ratio -= ratio - total_remaining -= distributed - return distributed_total - - -if __name__ == "__main__": - from dataclasses import dataclass - - @dataclass - class E: - - size: Optional[int] = None - ratio: int = 1 - minimum_size: int = 1 - - resolved = ratio_resolve(110, [E(None, 1, 1), E(None, 1, 1), E(None, 1, 1)]) - print(sum(resolved)) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_spinners.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/_spinners.py deleted file mode 100644 index d0bb1fe..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_spinners.py +++ /dev/null @@ -1,482 +0,0 @@ -""" -Spinners are from: -* cli-spinners: - MIT License - Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com) - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights to - use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - the Software, and to permit persons to whom the Software is furnished to do so, - subject to the following conditions: - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, - INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR - PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE - FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - IN THE SOFTWARE. -""" - -SPINNERS = { - "dots": { - "interval": 80, - "frames": "⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏", - }, - "dots2": {"interval": 80, "frames": "⣾⣽⣻⢿⡿⣟⣯⣷"}, - "dots3": { - "interval": 80, - "frames": "⠋⠙⠚⠞⠖⠦⠴⠲⠳⠓", - }, - "dots4": { - "interval": 80, - "frames": "⠄⠆⠇⠋⠙⠸⠰⠠⠰⠸⠙⠋⠇⠆", - }, - "dots5": { - "interval": 80, - "frames": "⠋⠙⠚⠒⠂⠂⠒⠲⠴⠦⠖⠒⠐⠐⠒⠓⠋", - }, - "dots6": { - "interval": 80, - "frames": "⠁⠉⠙⠚⠒⠂⠂⠒⠲⠴⠤⠄⠄⠤⠴⠲⠒⠂⠂⠒⠚⠙⠉⠁", - }, - "dots7": { - "interval": 80, - "frames": "⠈⠉⠋⠓⠒⠐⠐⠒⠖⠦⠤⠠⠠⠤⠦⠖⠒⠐⠐⠒⠓⠋⠉⠈", - }, - "dots8": { - "interval": 80, - "frames": "⠁⠁⠉⠙⠚⠒⠂⠂⠒⠲⠴⠤⠄⠄⠤⠠⠠⠤⠦⠖⠒⠐⠐⠒⠓⠋⠉⠈⠈", - }, - "dots9": {"interval": 80, "frames": "⢹⢺⢼⣸⣇⡧⡗⡏"}, - "dots10": {"interval": 80, "frames": "⢄⢂⢁⡁⡈⡐⡠"}, - "dots11": {"interval": 100, "frames": "⠁⠂⠄⡀⢀⠠⠐⠈"}, - "dots12": { - "interval": 80, - "frames": [ - "⢀⠀", - "⡀⠀", - "⠄⠀", - "⢂⠀", - "⡂⠀", - "⠅⠀", - "⢃⠀", - "⡃⠀", - "⠍⠀", - "⢋⠀", - "⡋⠀", - "⠍⠁", - "⢋⠁", - "⡋⠁", - "⠍⠉", - "⠋⠉", - "⠋⠉", - "⠉⠙", - "⠉⠙", - "⠉⠩", - "⠈⢙", - "⠈⡙", - "⢈⠩", - "⡀⢙", - "⠄⡙", - "⢂⠩", - "⡂⢘", - "⠅⡘", - "⢃⠨", - "⡃⢐", - "⠍⡐", - "⢋⠠", - "⡋⢀", - "⠍⡁", - "⢋⠁", - "⡋⠁", - "⠍⠉", - "⠋⠉", - "⠋⠉", - "⠉⠙", - "⠉⠙", - "⠉⠩", - "⠈⢙", - "⠈⡙", - "⠈⠩", - "⠀⢙", - "⠀⡙", - "⠀⠩", - "⠀⢘", - "⠀⡘", - "⠀⠨", - "⠀⢐", - "⠀⡐", - "⠀⠠", - "⠀⢀", - "⠀⡀", - ], - }, - "dots8Bit": { - "interval": 80, - "frames": "⠀⠁⠂⠃⠄⠅⠆⠇⡀⡁⡂⡃⡄⡅⡆⡇⠈⠉⠊⠋⠌⠍⠎⠏⡈⡉⡊⡋⡌⡍⡎⡏⠐⠑⠒⠓⠔⠕⠖⠗⡐⡑⡒⡓⡔⡕⡖⡗⠘⠙⠚⠛⠜⠝⠞⠟⡘⡙" - "⡚⡛⡜⡝⡞⡟⠠⠡⠢⠣⠤⠥⠦⠧⡠⡡⡢⡣⡤⡥⡦⡧⠨⠩⠪⠫⠬⠭⠮⠯⡨⡩⡪⡫⡬⡭⡮⡯⠰⠱⠲⠳⠴⠵⠶⠷⡰⡱⡲⡳⡴⡵⡶⡷⠸⠹⠺⠻" - "⠼⠽⠾⠿⡸⡹⡺⡻⡼⡽⡾⡿⢀⢁⢂⢃⢄⢅⢆⢇⣀⣁⣂⣃⣄⣅⣆⣇⢈⢉⢊⢋⢌⢍⢎⢏⣈⣉⣊⣋⣌⣍⣎⣏⢐⢑⢒⢓⢔⢕⢖⢗⣐⣑⣒⣓⣔⣕" - "⣖⣗⢘⢙⢚⢛⢜⢝⢞⢟⣘⣙⣚⣛⣜⣝⣞⣟⢠⢡⢢⢣⢤⢥⢦⢧⣠⣡⣢⣣⣤⣥⣦⣧⢨⢩⢪⢫⢬⢭⢮⢯⣨⣩⣪⣫⣬⣭⣮⣯⢰⢱⢲⢳⢴⢵⢶⢷" - "⣰⣱⣲⣳⣴⣵⣶⣷⢸⢹⢺⢻⢼⢽⢾⢿⣸⣹⣺⣻⣼⣽⣾⣿", - }, - "line": {"interval": 130, "frames": ["-", "\\", "|", "/"]}, - "line2": {"interval": 100, "frames": "⠂-–—–-"}, - "pipe": {"interval": 100, "frames": "┤┘┴└├┌┬┐"}, - "simpleDots": {"interval": 400, "frames": [". ", ".. ", "...", " "]}, - "simpleDotsScrolling": { - "interval": 200, - "frames": [". ", ".. ", "...", " ..", " .", " "], - }, - "star": {"interval": 70, "frames": "✶✸✹✺✹✷"}, - "star2": {"interval": 80, "frames": "+x*"}, - "flip": { - "interval": 70, - "frames": "___-``'´-___", - }, - "hamburger": {"interval": 100, "frames": "☱☲☴"}, - "growVertical": { - "interval": 120, - "frames": "▁▃▄▅▆▇▆▅▄▃", - }, - "growHorizontal": { - "interval": 120, - "frames": "▏▎▍▌▋▊▉▊▋▌▍▎", - }, - "balloon": {"interval": 140, "frames": " .oO@* "}, - "balloon2": {"interval": 120, "frames": ".oO°Oo."}, - "noise": {"interval": 100, "frames": "▓▒░"}, - "bounce": {"interval": 120, "frames": "⠁⠂⠄⠂"}, - "boxBounce": {"interval": 120, "frames": "▖▘▝▗"}, - "boxBounce2": {"interval": 100, "frames": "▌▀▐▄"}, - "triangle": {"interval": 50, "frames": "◢◣◤◥"}, - "arc": {"interval": 100, "frames": "◜◠◝◞◡◟"}, - "circle": {"interval": 120, "frames": "◡⊙◠"}, - "squareCorners": {"interval": 180, "frames": "◰◳◲◱"}, - "circleQuarters": {"interval": 120, "frames": "◴◷◶◵"}, - "circleHalves": {"interval": 50, "frames": "◐◓◑◒"}, - "squish": {"interval": 100, "frames": "╫╪"}, - "toggle": {"interval": 250, "frames": "⊶⊷"}, - "toggle2": {"interval": 80, "frames": "▫▪"}, - "toggle3": {"interval": 120, "frames": "□■"}, - "toggle4": {"interval": 100, "frames": "■□▪▫"}, - "toggle5": {"interval": 100, "frames": "▮▯"}, - "toggle6": {"interval": 300, "frames": "ဝ၀"}, - "toggle7": {"interval": 80, "frames": "⦾⦿"}, - "toggle8": {"interval": 100, "frames": "◍◌"}, - "toggle9": {"interval": 100, "frames": "◉◎"}, - "toggle10": {"interval": 100, "frames": "㊂㊀㊁"}, - "toggle11": {"interval": 50, "frames": "⧇⧆"}, - "toggle12": {"interval": 120, "frames": "☗☖"}, - "toggle13": {"interval": 80, "frames": "=*-"}, - "arrow": {"interval": 100, "frames": "←↖↑↗→↘↓↙"}, - "arrow2": { - "interval": 80, - "frames": ["⬆️ ", "↗️ ", "➡️ ", "↘️ ", "⬇️ ", "↙️ ", "⬅️ ", "↖️ "], - }, - "arrow3": { - "interval": 120, - "frames": ["▹▹▹▹▹", "▸▹▹▹▹", "▹▸▹▹▹", "▹▹▸▹▹", "▹▹▹▸▹", "▹▹▹▹▸"], - }, - "bouncingBar": { - "interval": 80, - "frames": [ - "[ ]", - "[= ]", - "[== ]", - "[=== ]", - "[ ===]", - "[ ==]", - "[ =]", - "[ ]", - "[ =]", - "[ ==]", - "[ ===]", - "[====]", - "[=== ]", - "[== ]", - "[= ]", - ], - }, - "bouncingBall": { - "interval": 80, - "frames": [ - "( ● )", - "( ● )", - "( ● )", - "( ● )", - "( ●)", - "( ● )", - "( ● )", - "( ● )", - "( ● )", - "(● )", - ], - }, - "smiley": {"interval": 200, "frames": ["😄 ", "😝 "]}, - "monkey": {"interval": 300, "frames": ["🙈 ", "🙈 ", "🙉 ", "🙊 "]}, - "hearts": {"interval": 100, "frames": ["💛 ", "💙 ", "💜 ", "💚 ", "❤️ "]}, - "clock": { - "interval": 100, - "frames": [ - "🕛 ", - "🕐 ", - "🕑 ", - "🕒 ", - "🕓 ", - "🕔 ", - "🕕 ", - "🕖 ", - "🕗 ", - "🕘 ", - "🕙 ", - "🕚 ", - ], - }, - "earth": {"interval": 180, "frames": ["🌍 ", "🌎 ", "🌏 "]}, - "material": { - "interval": 17, - "frames": [ - "█▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", - "██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", - "███▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", - "████▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", - "██████▁▁▁▁▁▁▁▁▁▁▁▁▁▁", - "██████▁▁▁▁▁▁▁▁▁▁▁▁▁▁", - "███████▁▁▁▁▁▁▁▁▁▁▁▁▁", - "████████▁▁▁▁▁▁▁▁▁▁▁▁", - "█████████▁▁▁▁▁▁▁▁▁▁▁", - "█████████▁▁▁▁▁▁▁▁▁▁▁", - "██████████▁▁▁▁▁▁▁▁▁▁", - "███████████▁▁▁▁▁▁▁▁▁", - "█████████████▁▁▁▁▁▁▁", - "██████████████▁▁▁▁▁▁", - "██████████████▁▁▁▁▁▁", - "▁██████████████▁▁▁▁▁", - "▁██████████████▁▁▁▁▁", - "▁██████████████▁▁▁▁▁", - "▁▁██████████████▁▁▁▁", - "▁▁▁██████████████▁▁▁", - "▁▁▁▁█████████████▁▁▁", - "▁▁▁▁██████████████▁▁", - "▁▁▁▁██████████████▁▁", - "▁▁▁▁▁██████████████▁", - "▁▁▁▁▁██████████████▁", - "▁▁▁▁▁██████████████▁", - "▁▁▁▁▁▁██████████████", - "▁▁▁▁▁▁██████████████", - "▁▁▁▁▁▁▁█████████████", - "▁▁▁▁▁▁▁█████████████", - "▁▁▁▁▁▁▁▁████████████", - "▁▁▁▁▁▁▁▁████████████", - "▁▁▁▁▁▁▁▁▁███████████", - "▁▁▁▁▁▁▁▁▁███████████", - "▁▁▁▁▁▁▁▁▁▁██████████", - "▁▁▁▁▁▁▁▁▁▁██████████", - "▁▁▁▁▁▁▁▁▁▁▁▁████████", - "▁▁▁▁▁▁▁▁▁▁▁▁▁███████", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁██████", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████", - "█▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████", - "██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", - "██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", - "███▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", - "████▁▁▁▁▁▁▁▁▁▁▁▁▁▁██", - "█████▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", - "█████▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", - "██████▁▁▁▁▁▁▁▁▁▁▁▁▁█", - "████████▁▁▁▁▁▁▁▁▁▁▁▁", - "█████████▁▁▁▁▁▁▁▁▁▁▁", - "█████████▁▁▁▁▁▁▁▁▁▁▁", - "█████████▁▁▁▁▁▁▁▁▁▁▁", - "█████████▁▁▁▁▁▁▁▁▁▁▁", - "███████████▁▁▁▁▁▁▁▁▁", - "████████████▁▁▁▁▁▁▁▁", - "████████████▁▁▁▁▁▁▁▁", - "██████████████▁▁▁▁▁▁", - "██████████████▁▁▁▁▁▁", - "▁██████████████▁▁▁▁▁", - "▁██████████████▁▁▁▁▁", - "▁▁▁█████████████▁▁▁▁", - "▁▁▁▁▁████████████▁▁▁", - "▁▁▁▁▁████████████▁▁▁", - "▁▁▁▁▁▁███████████▁▁▁", - "▁▁▁▁▁▁▁▁█████████▁▁▁", - "▁▁▁▁▁▁▁▁█████████▁▁▁", - "▁▁▁▁▁▁▁▁▁█████████▁▁", - "▁▁▁▁▁▁▁▁▁█████████▁▁", - "▁▁▁▁▁▁▁▁▁▁█████████▁", - "▁▁▁▁▁▁▁▁▁▁▁████████▁", - "▁▁▁▁▁▁▁▁▁▁▁████████▁", - "▁▁▁▁▁▁▁▁▁▁▁▁███████▁", - "▁▁▁▁▁▁▁▁▁▁▁▁███████▁", - "▁▁▁▁▁▁▁▁▁▁▁▁▁███████", - "▁▁▁▁▁▁▁▁▁▁▁▁▁███████", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", - ], - }, - "moon": { - "interval": 80, - "frames": ["🌑 ", "🌒 ", "🌓 ", "🌔 ", "🌕 ", "🌖 ", "🌗 ", "🌘 "], - }, - "runner": {"interval": 140, "frames": ["🚶 ", "🏃 "]}, - "pong": { - "interval": 80, - "frames": [ - "▐⠂ ▌", - "▐⠈ ▌", - "▐ ⠂ ▌", - "▐ ⠠ ▌", - "▐ ⡀ ▌", - "▐ ⠠ ▌", - "▐ ⠂ ▌", - "▐ ⠈ ▌", - "▐ ⠂ ▌", - "▐ ⠠ ▌", - "▐ ⡀ ▌", - "▐ ⠠ ▌", - "▐ ⠂ ▌", - "▐ ⠈ ▌", - "▐ ⠂▌", - "▐ ⠠▌", - "▐ ⡀▌", - "▐ ⠠ ▌", - "▐ ⠂ ▌", - "▐ ⠈ ▌", - "▐ ⠂ ▌", - "▐ ⠠ ▌", - "▐ ⡀ ▌", - "▐ ⠠ ▌", - "▐ ⠂ ▌", - "▐ ⠈ ▌", - "▐ ⠂ ▌", - "▐ ⠠ ▌", - "▐ ⡀ ▌", - "▐⠠ ▌", - ], - }, - "shark": { - "interval": 120, - "frames": [ - "▐|\\____________▌", - "▐_|\\___________▌", - "▐__|\\__________▌", - "▐___|\\_________▌", - "▐____|\\________▌", - "▐_____|\\_______▌", - "▐______|\\______▌", - "▐_______|\\_____▌", - "▐________|\\____▌", - "▐_________|\\___▌", - "▐__________|\\__▌", - "▐___________|\\_▌", - "▐____________|\\▌", - "▐____________/|▌", - "▐___________/|_▌", - "▐__________/|__▌", - "▐_________/|___▌", - "▐________/|____▌", - "▐_______/|_____▌", - "▐______/|______▌", - "▐_____/|_______▌", - "▐____/|________▌", - "▐___/|_________▌", - "▐__/|__________▌", - "▐_/|___________▌", - "▐/|____________▌", - ], - }, - "dqpb": {"interval": 100, "frames": "dqpb"}, - "weather": { - "interval": 100, - "frames": [ - "☀️ ", - "☀️ ", - "☀️ ", - "🌤 ", - "⛅️ ", - "🌥 ", - "☁️ ", - "🌧 ", - "🌨 ", - "🌧 ", - "🌨 ", - "🌧 ", - "🌨 ", - "⛈ ", - "🌨 ", - "🌧 ", - "🌨 ", - "☁️ ", - "🌥 ", - "⛅️ ", - "🌤 ", - "☀️ ", - "☀️ ", - ], - }, - "christmas": {"interval": 400, "frames": "🌲🎄"}, - "grenade": { - "interval": 80, - "frames": [ - "، ", - "′ ", - " ´ ", - " ‾ ", - " ⸌", - " ⸊", - " |", - " ⁎", - " ⁕", - " ෴ ", - " ⁓", - " ", - " ", - " ", - ], - }, - "point": {"interval": 125, "frames": ["∙∙∙", "●∙∙", "∙●∙", "∙∙●", "∙∙∙"]}, - "layer": {"interval": 150, "frames": "-=≡"}, - "betaWave": { - "interval": 80, - "frames": [ - "ρββββββ", - "βρβββββ", - "ββρββββ", - "βββρβββ", - "ββββρββ", - "βββββρβ", - "ββββββρ", - ], - }, - "aesthetic": { - "interval": 80, - "frames": [ - "▰▱▱▱▱▱▱", - "▰▰▱▱▱▱▱", - "▰▰▰▱▱▱▱", - "▰▰▰▰▱▱▱", - "▰▰▰▰▰▱▱", - "▰▰▰▰▰▰▱", - "▰▰▰▰▰▰▰", - "▰▱▱▱▱▱▱", - ], - }, -} diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_stack.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/_stack.py deleted file mode 100644 index 194564e..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_stack.py +++ /dev/null @@ -1,16 +0,0 @@ -from typing import List, TypeVar - -T = TypeVar("T") - - -class Stack(List[T]): - """A small shim over builtin list.""" - - @property - def top(self) -> T: - """Get top of stack.""" - return self[-1] - - def push(self, item: T) -> None: - """Push an item on to the stack (append in stack nomenclature).""" - self.append(item) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_timer.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/_timer.py deleted file mode 100644 index a2ca6be..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_timer.py +++ /dev/null @@ -1,19 +0,0 @@ -""" -Timer context manager, only used in debug. - -""" - -from time import time - -import contextlib -from typing import Generator - - -@contextlib.contextmanager -def timer(subject: str = "time") -> Generator[None, None, None]: - """print the elapsed time. (only used in debugging)""" - start = time() - yield - elapsed = time() - start - elapsed_ms = elapsed * 1000 - print(f"{subject} elapsed {elapsed_ms:.1f}ms") diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py deleted file mode 100644 index 81b1082..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py +++ /dev/null @@ -1,662 +0,0 @@ -"""Light wrapper around the Win32 Console API - this module should only be imported on Windows - -The API that this module wraps is documented at https://docs.microsoft.com/en-us/windows/console/console-functions -""" -import ctypes -import sys -from typing import Any - -windll: Any = None -if sys.platform == "win32": - windll = ctypes.LibraryLoader(ctypes.WinDLL) -else: - raise ImportError(f"{__name__} can only be imported on Windows") - -import time -from ctypes import Structure, byref, wintypes -from typing import IO, NamedTuple, Type, cast - -from pip._vendor.rich.color import ColorSystem -from pip._vendor.rich.style import Style - -STDOUT = -11 -ENABLE_VIRTUAL_TERMINAL_PROCESSING = 4 - -COORD = wintypes._COORD - - -class LegacyWindowsError(Exception): - pass - - -class WindowsCoordinates(NamedTuple): - """Coordinates in the Windows Console API are (y, x), not (x, y). - This class is intended to prevent that confusion. - Rows and columns are indexed from 0. - This class can be used in place of wintypes._COORD in arguments and argtypes. - """ - - row: int - col: int - - @classmethod - def from_param(cls, value: "WindowsCoordinates") -> COORD: - """Converts a WindowsCoordinates into a wintypes _COORD structure. - This classmethod is internally called by ctypes to perform the conversion. - - Args: - value (WindowsCoordinates): The input coordinates to convert. - - Returns: - wintypes._COORD: The converted coordinates struct. - """ - return COORD(value.col, value.row) - - -class CONSOLE_SCREEN_BUFFER_INFO(Structure): - _fields_ = [ - ("dwSize", COORD), - ("dwCursorPosition", COORD), - ("wAttributes", wintypes.WORD), - ("srWindow", wintypes.SMALL_RECT), - ("dwMaximumWindowSize", COORD), - ] - - -class CONSOLE_CURSOR_INFO(ctypes.Structure): - _fields_ = [("dwSize", wintypes.DWORD), ("bVisible", wintypes.BOOL)] - - -_GetStdHandle = windll.kernel32.GetStdHandle -_GetStdHandle.argtypes = [ - wintypes.DWORD, -] -_GetStdHandle.restype = wintypes.HANDLE - - -def GetStdHandle(handle: int = STDOUT) -> wintypes.HANDLE: - """Retrieves a handle to the specified standard device (standard input, standard output, or standard error). - - Args: - handle (int): Integer identifier for the handle. Defaults to -11 (stdout). - - Returns: - wintypes.HANDLE: The handle - """ - return cast(wintypes.HANDLE, _GetStdHandle(handle)) - - -_GetConsoleMode = windll.kernel32.GetConsoleMode -_GetConsoleMode.argtypes = [wintypes.HANDLE, wintypes.LPDWORD] -_GetConsoleMode.restype = wintypes.BOOL - - -def GetConsoleMode(std_handle: wintypes.HANDLE) -> int: - """Retrieves the current input mode of a console's input buffer - or the current output mode of a console screen buffer. - - Args: - std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. - - Raises: - LegacyWindowsError: If any error occurs while calling the Windows console API. - - Returns: - int: Value representing the current console mode as documented at - https://docs.microsoft.com/en-us/windows/console/getconsolemode#parameters - """ - - console_mode = wintypes.DWORD() - success = bool(_GetConsoleMode(std_handle, console_mode)) - if not success: - raise LegacyWindowsError("Unable to get legacy Windows Console Mode") - return console_mode.value - - -_FillConsoleOutputCharacterW = windll.kernel32.FillConsoleOutputCharacterW -_FillConsoleOutputCharacterW.argtypes = [ - wintypes.HANDLE, - ctypes.c_char, - wintypes.DWORD, - cast(Type[COORD], WindowsCoordinates), - ctypes.POINTER(wintypes.DWORD), -] -_FillConsoleOutputCharacterW.restype = wintypes.BOOL - - -def FillConsoleOutputCharacter( - std_handle: wintypes.HANDLE, - char: str, - length: int, - start: WindowsCoordinates, -) -> int: - """Writes a character to the console screen buffer a specified number of times, beginning at the specified coordinates. - - Args: - std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. - char (str): The character to write. Must be a string of length 1. - length (int): The number of times to write the character. - start (WindowsCoordinates): The coordinates to start writing at. - - Returns: - int: The number of characters written. - """ - character = ctypes.c_char(char.encode()) - num_characters = wintypes.DWORD(length) - num_written = wintypes.DWORD(0) - _FillConsoleOutputCharacterW( - std_handle, - character, - num_characters, - start, - byref(num_written), - ) - return num_written.value - - -_FillConsoleOutputAttribute = windll.kernel32.FillConsoleOutputAttribute -_FillConsoleOutputAttribute.argtypes = [ - wintypes.HANDLE, - wintypes.WORD, - wintypes.DWORD, - cast(Type[COORD], WindowsCoordinates), - ctypes.POINTER(wintypes.DWORD), -] -_FillConsoleOutputAttribute.restype = wintypes.BOOL - - -def FillConsoleOutputAttribute( - std_handle: wintypes.HANDLE, - attributes: int, - length: int, - start: WindowsCoordinates, -) -> int: - """Sets the character attributes for a specified number of character cells, - beginning at the specified coordinates in a screen buffer. - - Args: - std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. - attributes (int): Integer value representing the foreground and background colours of the cells. - length (int): The number of cells to set the output attribute of. - start (WindowsCoordinates): The coordinates of the first cell whose attributes are to be set. - - Returns: - int: The number of cells whose attributes were actually set. - """ - num_cells = wintypes.DWORD(length) - style_attrs = wintypes.WORD(attributes) - num_written = wintypes.DWORD(0) - _FillConsoleOutputAttribute( - std_handle, style_attrs, num_cells, start, byref(num_written) - ) - return num_written.value - - -_SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute -_SetConsoleTextAttribute.argtypes = [ - wintypes.HANDLE, - wintypes.WORD, -] -_SetConsoleTextAttribute.restype = wintypes.BOOL - - -def SetConsoleTextAttribute( - std_handle: wintypes.HANDLE, attributes: wintypes.WORD -) -> bool: - """Set the colour attributes for all text written after this function is called. - - Args: - std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. - attributes (int): Integer value representing the foreground and background colours. - - - Returns: - bool: True if the attribute was set successfully, otherwise False. - """ - return bool(_SetConsoleTextAttribute(std_handle, attributes)) - - -_GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo -_GetConsoleScreenBufferInfo.argtypes = [ - wintypes.HANDLE, - ctypes.POINTER(CONSOLE_SCREEN_BUFFER_INFO), -] -_GetConsoleScreenBufferInfo.restype = wintypes.BOOL - - -def GetConsoleScreenBufferInfo( - std_handle: wintypes.HANDLE, -) -> CONSOLE_SCREEN_BUFFER_INFO: - """Retrieves information about the specified console screen buffer. - - Args: - std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. - - Returns: - CONSOLE_SCREEN_BUFFER_INFO: A CONSOLE_SCREEN_BUFFER_INFO ctype struct contain information about - screen size, cursor position, colour attributes, and more.""" - console_screen_buffer_info = CONSOLE_SCREEN_BUFFER_INFO() - _GetConsoleScreenBufferInfo(std_handle, byref(console_screen_buffer_info)) - return console_screen_buffer_info - - -_SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition -_SetConsoleCursorPosition.argtypes = [ - wintypes.HANDLE, - cast(Type[COORD], WindowsCoordinates), -] -_SetConsoleCursorPosition.restype = wintypes.BOOL - - -def SetConsoleCursorPosition( - std_handle: wintypes.HANDLE, coords: WindowsCoordinates -) -> bool: - """Set the position of the cursor in the console screen - - Args: - std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. - coords (WindowsCoordinates): The coordinates to move the cursor to. - - Returns: - bool: True if the function succeeds, otherwise False. - """ - return bool(_SetConsoleCursorPosition(std_handle, coords)) - - -_GetConsoleCursorInfo = windll.kernel32.GetConsoleCursorInfo -_GetConsoleCursorInfo.argtypes = [ - wintypes.HANDLE, - ctypes.POINTER(CONSOLE_CURSOR_INFO), -] -_GetConsoleCursorInfo.restype = wintypes.BOOL - - -def GetConsoleCursorInfo( - std_handle: wintypes.HANDLE, cursor_info: CONSOLE_CURSOR_INFO -) -> bool: - """Get the cursor info - used to get cursor visibility and width - - Args: - std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. - cursor_info (CONSOLE_CURSOR_INFO): CONSOLE_CURSOR_INFO ctype struct that receives information - about the console's cursor. - - Returns: - bool: True if the function succeeds, otherwise False. - """ - return bool(_GetConsoleCursorInfo(std_handle, byref(cursor_info))) - - -_SetConsoleCursorInfo = windll.kernel32.SetConsoleCursorInfo -_SetConsoleCursorInfo.argtypes = [ - wintypes.HANDLE, - ctypes.POINTER(CONSOLE_CURSOR_INFO), -] -_SetConsoleCursorInfo.restype = wintypes.BOOL - - -def SetConsoleCursorInfo( - std_handle: wintypes.HANDLE, cursor_info: CONSOLE_CURSOR_INFO -) -> bool: - """Set the cursor info - used for adjusting cursor visibility and width - - Args: - std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. - cursor_info (CONSOLE_CURSOR_INFO): CONSOLE_CURSOR_INFO ctype struct containing the new cursor info. - - Returns: - bool: True if the function succeeds, otherwise False. - """ - return bool(_SetConsoleCursorInfo(std_handle, byref(cursor_info))) - - -_SetConsoleTitle = windll.kernel32.SetConsoleTitleW -_SetConsoleTitle.argtypes = [wintypes.LPCWSTR] -_SetConsoleTitle.restype = wintypes.BOOL - - -def SetConsoleTitle(title: str) -> bool: - """Sets the title of the current console window - - Args: - title (str): The new title of the console window. - - Returns: - bool: True if the function succeeds, otherwise False. - """ - return bool(_SetConsoleTitle(title)) - - -class LegacyWindowsTerm: - """This class allows interaction with the legacy Windows Console API. It should only be used in the context - of environments where virtual terminal processing is not available. However, if it is used in a Windows environment, - the entire API should work. - - Args: - file (IO[str]): The file which the Windows Console API HANDLE is retrieved from, defaults to sys.stdout. - """ - - BRIGHT_BIT = 8 - - # Indices are ANSI color numbers, values are the corresponding Windows Console API color numbers - ANSI_TO_WINDOWS = [ - 0, # black The Windows colours are defined in wincon.h as follows: - 4, # red define FOREGROUND_BLUE 0x0001 -- 0000 0001 - 2, # green define FOREGROUND_GREEN 0x0002 -- 0000 0010 - 6, # yellow define FOREGROUND_RED 0x0004 -- 0000 0100 - 1, # blue define FOREGROUND_INTENSITY 0x0008 -- 0000 1000 - 5, # magenta define BACKGROUND_BLUE 0x0010 -- 0001 0000 - 3, # cyan define BACKGROUND_GREEN 0x0020 -- 0010 0000 - 7, # white define BACKGROUND_RED 0x0040 -- 0100 0000 - 8, # bright black (grey) define BACKGROUND_INTENSITY 0x0080 -- 1000 0000 - 12, # bright red - 10, # bright green - 14, # bright yellow - 9, # bright blue - 13, # bright magenta - 11, # bright cyan - 15, # bright white - ] - - def __init__(self, file: "IO[str]") -> None: - handle = GetStdHandle(STDOUT) - self._handle = handle - default_text = GetConsoleScreenBufferInfo(handle).wAttributes - self._default_text = default_text - - self._default_fore = default_text & 7 - self._default_back = (default_text >> 4) & 7 - self._default_attrs = self._default_fore | (self._default_back << 4) - - self._file = file - self.write = file.write - self.flush = file.flush - - @property - def cursor_position(self) -> WindowsCoordinates: - """Returns the current position of the cursor (0-based) - - Returns: - WindowsCoordinates: The current cursor position. - """ - coord: COORD = GetConsoleScreenBufferInfo(self._handle).dwCursorPosition - return WindowsCoordinates(row=cast(int, coord.Y), col=cast(int, coord.X)) - - @property - def screen_size(self) -> WindowsCoordinates: - """Returns the current size of the console screen buffer, in character columns and rows - - Returns: - WindowsCoordinates: The width and height of the screen as WindowsCoordinates. - """ - screen_size: COORD = GetConsoleScreenBufferInfo(self._handle).dwSize - return WindowsCoordinates( - row=cast(int, screen_size.Y), col=cast(int, screen_size.X) - ) - - def write_text(self, text: str) -> None: - """Write text directly to the terminal without any modification of styles - - Args: - text (str): The text to write to the console - """ - self.write(text) - self.flush() - - def write_styled(self, text: str, style: Style) -> None: - """Write styled text to the terminal. - - Args: - text (str): The text to write - style (Style): The style of the text - """ - color = style.color - bgcolor = style.bgcolor - if style.reverse: - color, bgcolor = bgcolor, color - - if color: - fore = color.downgrade(ColorSystem.WINDOWS).number - fore = fore if fore is not None else 7 # Default to ANSI 7: White - if style.bold: - fore = fore | self.BRIGHT_BIT - if style.dim: - fore = fore & ~self.BRIGHT_BIT - fore = self.ANSI_TO_WINDOWS[fore] - else: - fore = self._default_fore - - if bgcolor: - back = bgcolor.downgrade(ColorSystem.WINDOWS).number - back = back if back is not None else 0 # Default to ANSI 0: Black - back = self.ANSI_TO_WINDOWS[back] - else: - back = self._default_back - - assert fore is not None - assert back is not None - - SetConsoleTextAttribute( - self._handle, attributes=ctypes.c_ushort(fore | (back << 4)) - ) - self.write_text(text) - SetConsoleTextAttribute(self._handle, attributes=self._default_text) - - def move_cursor_to(self, new_position: WindowsCoordinates) -> None: - """Set the position of the cursor - - Args: - new_position (WindowsCoordinates): The WindowsCoordinates representing the new position of the cursor. - """ - if new_position.col < 0 or new_position.row < 0: - return - SetConsoleCursorPosition(self._handle, coords=new_position) - - def erase_line(self) -> None: - """Erase all content on the line the cursor is currently located at""" - screen_size = self.screen_size - cursor_position = self.cursor_position - cells_to_erase = screen_size.col - start_coordinates = WindowsCoordinates(row=cursor_position.row, col=0) - FillConsoleOutputCharacter( - self._handle, " ", length=cells_to_erase, start=start_coordinates - ) - FillConsoleOutputAttribute( - self._handle, - self._default_attrs, - length=cells_to_erase, - start=start_coordinates, - ) - - def erase_end_of_line(self) -> None: - """Erase all content from the cursor position to the end of that line""" - cursor_position = self.cursor_position - cells_to_erase = self.screen_size.col - cursor_position.col - FillConsoleOutputCharacter( - self._handle, " ", length=cells_to_erase, start=cursor_position - ) - FillConsoleOutputAttribute( - self._handle, - self._default_attrs, - length=cells_to_erase, - start=cursor_position, - ) - - def erase_start_of_line(self) -> None: - """Erase all content from the cursor position to the start of that line""" - row, col = self.cursor_position - start = WindowsCoordinates(row, 0) - FillConsoleOutputCharacter(self._handle, " ", length=col, start=start) - FillConsoleOutputAttribute( - self._handle, self._default_attrs, length=col, start=start - ) - - def move_cursor_up(self) -> None: - """Move the cursor up a single cell""" - cursor_position = self.cursor_position - SetConsoleCursorPosition( - self._handle, - coords=WindowsCoordinates( - row=cursor_position.row - 1, col=cursor_position.col - ), - ) - - def move_cursor_down(self) -> None: - """Move the cursor down a single cell""" - cursor_position = self.cursor_position - SetConsoleCursorPosition( - self._handle, - coords=WindowsCoordinates( - row=cursor_position.row + 1, - col=cursor_position.col, - ), - ) - - def move_cursor_forward(self) -> None: - """Move the cursor forward a single cell. Wrap to the next line if required.""" - row, col = self.cursor_position - if col == self.screen_size.col - 1: - row += 1 - col = 0 - else: - col += 1 - SetConsoleCursorPosition( - self._handle, coords=WindowsCoordinates(row=row, col=col) - ) - - def move_cursor_to_column(self, column: int) -> None: - """Move cursor to the column specified by the zero-based column index, staying on the same row - - Args: - column (int): The zero-based column index to move the cursor to. - """ - row, _ = self.cursor_position - SetConsoleCursorPosition(self._handle, coords=WindowsCoordinates(row, column)) - - def move_cursor_backward(self) -> None: - """Move the cursor backward a single cell. Wrap to the previous line if required.""" - row, col = self.cursor_position - if col == 0: - row -= 1 - col = self.screen_size.col - 1 - else: - col -= 1 - SetConsoleCursorPosition( - self._handle, coords=WindowsCoordinates(row=row, col=col) - ) - - def hide_cursor(self) -> None: - """Hide the cursor""" - current_cursor_size = self._get_cursor_size() - invisible_cursor = CONSOLE_CURSOR_INFO(dwSize=current_cursor_size, bVisible=0) - SetConsoleCursorInfo(self._handle, cursor_info=invisible_cursor) - - def show_cursor(self) -> None: - """Show the cursor""" - current_cursor_size = self._get_cursor_size() - visible_cursor = CONSOLE_CURSOR_INFO(dwSize=current_cursor_size, bVisible=1) - SetConsoleCursorInfo(self._handle, cursor_info=visible_cursor) - - def set_title(self, title: str) -> None: - """Set the title of the terminal window - - Args: - title (str): The new title of the console window - """ - assert len(title) < 255, "Console title must be less than 255 characters" - SetConsoleTitle(title) - - def _get_cursor_size(self) -> int: - """Get the percentage of the character cell that is filled by the cursor""" - cursor_info = CONSOLE_CURSOR_INFO() - GetConsoleCursorInfo(self._handle, cursor_info=cursor_info) - return int(cursor_info.dwSize) - - -if __name__ == "__main__": - handle = GetStdHandle() - - from pip._vendor.rich.console import Console - - console = Console() - - term = LegacyWindowsTerm(sys.stdout) - term.set_title("Win32 Console Examples") - - style = Style(color="black", bgcolor="red") - - heading = Style.parse("black on green") - - # Check colour output - console.rule("Checking colour output") - console.print("[on red]on red!") - console.print("[blue]blue!") - console.print("[yellow]yellow!") - console.print("[bold yellow]bold yellow!") - console.print("[bright_yellow]bright_yellow!") - console.print("[dim bright_yellow]dim bright_yellow!") - console.print("[italic cyan]italic cyan!") - console.print("[bold white on blue]bold white on blue!") - console.print("[reverse bold white on blue]reverse bold white on blue!") - console.print("[bold black on cyan]bold black on cyan!") - console.print("[black on green]black on green!") - console.print("[blue on green]blue on green!") - console.print("[white on black]white on black!") - console.print("[black on white]black on white!") - console.print("[#1BB152 on #DA812D]#1BB152 on #DA812D!") - - # Check cursor movement - console.rule("Checking cursor movement") - console.print() - term.move_cursor_backward() - term.move_cursor_backward() - term.write_text("went back and wrapped to prev line") - time.sleep(1) - term.move_cursor_up() - term.write_text("we go up") - time.sleep(1) - term.move_cursor_down() - term.write_text("and down") - time.sleep(1) - term.move_cursor_up() - term.move_cursor_backward() - term.move_cursor_backward() - term.write_text("we went up and back 2") - time.sleep(1) - term.move_cursor_down() - term.move_cursor_backward() - term.move_cursor_backward() - term.write_text("we went down and back 2") - time.sleep(1) - - # Check erasing of lines - term.hide_cursor() - console.print() - console.rule("Checking line erasing") - console.print("\n...Deleting to the start of the line...") - term.write_text("The red arrow shows the cursor location, and direction of erase") - time.sleep(1) - term.move_cursor_to_column(16) - term.write_styled("<", Style.parse("black on red")) - term.move_cursor_backward() - time.sleep(1) - term.erase_start_of_line() - time.sleep(1) - - console.print("\n\n...And to the end of the line...") - term.write_text("The red arrow shows the cursor location, and direction of erase") - time.sleep(1) - - term.move_cursor_to_column(16) - term.write_styled(">", Style.parse("black on red")) - time.sleep(1) - term.erase_end_of_line() - time.sleep(1) - - console.print("\n\n...Now the whole line will be erased...") - term.write_styled("I'm going to disappear!", style=Style.parse("black on cyan")) - time.sleep(1) - term.erase_line() - - term.show_cursor() - print("\n") diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows.py deleted file mode 100644 index 10fc0d7..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows.py +++ /dev/null @@ -1,72 +0,0 @@ -import sys -from dataclasses import dataclass - - -@dataclass -class WindowsConsoleFeatures: - """Windows features available.""" - - vt: bool = False - """The console supports VT codes.""" - truecolor: bool = False - """The console supports truecolor.""" - - -try: - import ctypes - from ctypes import LibraryLoader - - if sys.platform == "win32": - windll = LibraryLoader(ctypes.WinDLL) - else: - windll = None - raise ImportError("Not windows") - - from pip._vendor.rich._win32_console import ( - ENABLE_VIRTUAL_TERMINAL_PROCESSING, - GetConsoleMode, - GetStdHandle, - LegacyWindowsError, - ) - -except (AttributeError, ImportError, ValueError): - - # Fallback if we can't load the Windows DLL - def get_windows_console_features() -> WindowsConsoleFeatures: - features = WindowsConsoleFeatures() - return features - -else: - - def get_windows_console_features() -> WindowsConsoleFeatures: - """Get windows console features. - - Returns: - WindowsConsoleFeatures: An instance of WindowsConsoleFeatures. - """ - handle = GetStdHandle() - try: - console_mode = GetConsoleMode(handle) - success = True - except LegacyWindowsError: - console_mode = 0 - success = False - vt = bool(success and console_mode & ENABLE_VIRTUAL_TERMINAL_PROCESSING) - truecolor = False - if vt: - win_version = sys.getwindowsversion() - truecolor = win_version.major > 10 or ( - win_version.major == 10 and win_version.build >= 15063 - ) - features = WindowsConsoleFeatures(vt=vt, truecolor=truecolor) - return features - - -if __name__ == "__main__": - import platform - - features = get_windows_console_features() - from pip._vendor.rich import print - - print(f'platform="{platform.system()}"') - print(repr(features)) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows_renderer.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows_renderer.py deleted file mode 100644 index 5ece056..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows_renderer.py +++ /dev/null @@ -1,56 +0,0 @@ -from typing import Iterable, Sequence, Tuple, cast - -from pip._vendor.rich._win32_console import LegacyWindowsTerm, WindowsCoordinates -from pip._vendor.rich.segment import ControlCode, ControlType, Segment - - -def legacy_windows_render(buffer: Iterable[Segment], term: LegacyWindowsTerm) -> None: - """Makes appropriate Windows Console API calls based on the segments in the buffer. - - Args: - buffer (Iterable[Segment]): Iterable of Segments to convert to Win32 API calls. - term (LegacyWindowsTerm): Used to call the Windows Console API. - """ - for text, style, control in buffer: - if not control: - if style: - term.write_styled(text, style) - else: - term.write_text(text) - else: - control_codes: Sequence[ControlCode] = control - for control_code in control_codes: - control_type = control_code[0] - if control_type == ControlType.CURSOR_MOVE_TO: - _, x, y = cast(Tuple[ControlType, int, int], control_code) - term.move_cursor_to(WindowsCoordinates(row=y - 1, col=x - 1)) - elif control_type == ControlType.CARRIAGE_RETURN: - term.write_text("\r") - elif control_type == ControlType.HOME: - term.move_cursor_to(WindowsCoordinates(0, 0)) - elif control_type == ControlType.CURSOR_UP: - term.move_cursor_up() - elif control_type == ControlType.CURSOR_DOWN: - term.move_cursor_down() - elif control_type == ControlType.CURSOR_FORWARD: - term.move_cursor_forward() - elif control_type == ControlType.CURSOR_BACKWARD: - term.move_cursor_backward() - elif control_type == ControlType.CURSOR_MOVE_TO_COLUMN: - _, column = cast(Tuple[ControlType, int], control_code) - term.move_cursor_to_column(column - 1) - elif control_type == ControlType.HIDE_CURSOR: - term.hide_cursor() - elif control_type == ControlType.SHOW_CURSOR: - term.show_cursor() - elif control_type == ControlType.ERASE_IN_LINE: - _, mode = cast(Tuple[ControlType, int], control_code) - if mode == 0: - term.erase_end_of_line() - elif mode == 1: - term.erase_start_of_line() - elif mode == 2: - term.erase_line() - elif control_type == ControlType.SET_WINDOW_TITLE: - _, title = cast(Tuple[ControlType, str], control_code) - term.set_title(title) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py deleted file mode 100644 index c45f193..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py +++ /dev/null @@ -1,56 +0,0 @@ -import re -from typing import Iterable, List, Tuple - -from ._loop import loop_last -from .cells import cell_len, chop_cells - -re_word = re.compile(r"\s*\S+\s*") - - -def words(text: str) -> Iterable[Tuple[int, int, str]]: - position = 0 - word_match = re_word.match(text, position) - while word_match is not None: - start, end = word_match.span() - word = word_match.group(0) - yield start, end, word - word_match = re_word.match(text, end) - - -def divide_line(text: str, width: int, fold: bool = True) -> List[int]: - divides: List[int] = [] - append = divides.append - line_position = 0 - _cell_len = cell_len - for start, _end, word in words(text): - word_length = _cell_len(word.rstrip()) - if line_position + word_length > width: - if word_length > width: - if fold: - chopped_words = chop_cells(word, max_size=width, position=0) - for last, line in loop_last(chopped_words): - if start: - append(start) - - if last: - line_position = _cell_len(line) - else: - start += len(line) - else: - if start: - append(start) - line_position = _cell_len(word) - elif line_position and start: - append(start) - line_position = _cell_len(word) - else: - line_position += _cell_len(word) - return divides - - -if __name__ == "__main__": # pragma: no cover - from .console import Console - - console = Console(width=10) - console.print("12345 abcdefghijklmnopqrstuvwyxzABCDEFGHIJKLMNOPQRSTUVWXYZ 12345") - print(chop_cells("abcdefghijklmnopqrstuvwxyz", 10, position=2)) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/abc.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/abc.py deleted file mode 100644 index e6e498e..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/abc.py +++ /dev/null @@ -1,33 +0,0 @@ -from abc import ABC - - -class RichRenderable(ABC): - """An abstract base class for Rich renderables. - - Note that there is no need to extend this class, the intended use is to check if an - object supports the Rich renderable protocol. For example:: - - if isinstance(my_object, RichRenderable): - console.print(my_object) - - """ - - @classmethod - def __subclasshook__(cls, other: type) -> bool: - """Check if this class supports the rich render protocol.""" - return hasattr(other, "__rich_console__") or hasattr(other, "__rich__") - - -if __name__ == "__main__": # pragma: no cover - from pip._vendor.rich.text import Text - - t = Text() - print(isinstance(Text, RichRenderable)) - print(isinstance(t, RichRenderable)) - - class Foo: - pass - - f = Foo() - print(isinstance(f, RichRenderable)) - print(isinstance("", RichRenderable)) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/align.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/align.py deleted file mode 100644 index c310b66..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/align.py +++ /dev/null @@ -1,311 +0,0 @@ -import sys -from itertools import chain -from typing import TYPE_CHECKING, Iterable, Optional - -if sys.version_info >= (3, 8): - from typing import Literal -else: - from pip._vendor.typing_extensions import Literal # pragma: no cover - -from .constrain import Constrain -from .jupyter import JupyterMixin -from .measure import Measurement -from .segment import Segment -from .style import StyleType - -if TYPE_CHECKING: - from .console import Console, ConsoleOptions, RenderableType, RenderResult - -AlignMethod = Literal["left", "center", "right"] -VerticalAlignMethod = Literal["top", "middle", "bottom"] - - -class Align(JupyterMixin): - """Align a renderable by adding spaces if necessary. - - Args: - renderable (RenderableType): A console renderable. - align (AlignMethod): One of "left", "center", or "right"" - style (StyleType, optional): An optional style to apply to the background. - vertical (Optional[VerticalAlginMethod], optional): Optional vertical align, one of "top", "middle", or "bottom". Defaults to None. - pad (bool, optional): Pad the right with spaces. Defaults to True. - width (int, optional): Restrict contents to given width, or None to use default width. Defaults to None. - height (int, optional): Set height of align renderable, or None to fit to contents. Defaults to None. - - Raises: - ValueError: if ``align`` is not one of the expected values. - """ - - def __init__( - self, - renderable: "RenderableType", - align: AlignMethod = "left", - style: Optional[StyleType] = None, - *, - vertical: Optional[VerticalAlignMethod] = None, - pad: bool = True, - width: Optional[int] = None, - height: Optional[int] = None, - ) -> None: - if align not in ("left", "center", "right"): - raise ValueError( - f'invalid value for align, expected "left", "center", or "right" (not {align!r})' - ) - if vertical is not None and vertical not in ("top", "middle", "bottom"): - raise ValueError( - f'invalid value for vertical, expected "top", "middle", or "bottom" (not {vertical!r})' - ) - self.renderable = renderable - self.align = align - self.style = style - self.vertical = vertical - self.pad = pad - self.width = width - self.height = height - - def __repr__(self) -> str: - return f"Align({self.renderable!r}, {self.align!r})" - - @classmethod - def left( - cls, - renderable: "RenderableType", - style: Optional[StyleType] = None, - *, - vertical: Optional[VerticalAlignMethod] = None, - pad: bool = True, - width: Optional[int] = None, - height: Optional[int] = None, - ) -> "Align": - """Align a renderable to the left.""" - return cls( - renderable, - "left", - style=style, - vertical=vertical, - pad=pad, - width=width, - height=height, - ) - - @classmethod - def center( - cls, - renderable: "RenderableType", - style: Optional[StyleType] = None, - *, - vertical: Optional[VerticalAlignMethod] = None, - pad: bool = True, - width: Optional[int] = None, - height: Optional[int] = None, - ) -> "Align": - """Align a renderable to the center.""" - return cls( - renderable, - "center", - style=style, - vertical=vertical, - pad=pad, - width=width, - height=height, - ) - - @classmethod - def right( - cls, - renderable: "RenderableType", - style: Optional[StyleType] = None, - *, - vertical: Optional[VerticalAlignMethod] = None, - pad: bool = True, - width: Optional[int] = None, - height: Optional[int] = None, - ) -> "Align": - """Align a renderable to the right.""" - return cls( - renderable, - "right", - style=style, - vertical=vertical, - pad=pad, - width=width, - height=height, - ) - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - align = self.align - width = console.measure(self.renderable, options=options).maximum - rendered = console.render( - Constrain( - self.renderable, width if self.width is None else min(width, self.width) - ), - options.update(height=None), - ) - lines = list(Segment.split_lines(rendered)) - width, height = Segment.get_shape(lines) - lines = Segment.set_shape(lines, width, height) - new_line = Segment.line() - excess_space = options.max_width - width - style = console.get_style(self.style) if self.style is not None else None - - def generate_segments() -> Iterable[Segment]: - if excess_space <= 0: - # Exact fit - for line in lines: - yield from line - yield new_line - - elif align == "left": - # Pad on the right - pad = Segment(" " * excess_space, style) if self.pad else None - for line in lines: - yield from line - if pad: - yield pad - yield new_line - - elif align == "center": - # Pad left and right - left = excess_space // 2 - pad = Segment(" " * left, style) - pad_right = ( - Segment(" " * (excess_space - left), style) if self.pad else None - ) - for line in lines: - if left: - yield pad - yield from line - if pad_right: - yield pad_right - yield new_line - - elif align == "right": - # Padding on left - pad = Segment(" " * excess_space, style) - for line in lines: - yield pad - yield from line - yield new_line - - blank_line = ( - Segment(f"{' ' * (self.width or options.max_width)}\n", style) - if self.pad - else Segment("\n") - ) - - def blank_lines(count: int) -> Iterable[Segment]: - if count > 0: - for _ in range(count): - yield blank_line - - vertical_height = self.height or options.height - iter_segments: Iterable[Segment] - if self.vertical and vertical_height is not None: - if self.vertical == "top": - bottom_space = vertical_height - height - iter_segments = chain(generate_segments(), blank_lines(bottom_space)) - elif self.vertical == "middle": - top_space = (vertical_height - height) // 2 - bottom_space = vertical_height - top_space - height - iter_segments = chain( - blank_lines(top_space), - generate_segments(), - blank_lines(bottom_space), - ) - else: # self.vertical == "bottom": - top_space = vertical_height - height - iter_segments = chain(blank_lines(top_space), generate_segments()) - else: - iter_segments = generate_segments() - if self.style: - style = console.get_style(self.style) - iter_segments = Segment.apply_style(iter_segments, style) - yield from iter_segments - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> Measurement: - measurement = Measurement.get(console, options, self.renderable) - return measurement - - -class VerticalCenter(JupyterMixin): - """Vertically aligns a renderable. - - Warn: - This class is deprecated and may be removed in a future version. Use Align class with - `vertical="middle"`. - - Args: - renderable (RenderableType): A renderable object. - """ - - def __init__( - self, - renderable: "RenderableType", - style: Optional[StyleType] = None, - ) -> None: - self.renderable = renderable - self.style = style - - def __repr__(self) -> str: - return f"VerticalCenter({self.renderable!r})" - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - style = console.get_style(self.style) if self.style is not None else None - lines = console.render_lines( - self.renderable, options.update(height=None), pad=False - ) - width, _height = Segment.get_shape(lines) - new_line = Segment.line() - height = options.height or options.size.height - top_space = (height - len(lines)) // 2 - bottom_space = height - top_space - len(lines) - blank_line = Segment(f"{' ' * width}", style) - - def blank_lines(count: int) -> Iterable[Segment]: - for _ in range(count): - yield blank_line - yield new_line - - if top_space > 0: - yield from blank_lines(top_space) - for line in lines: - yield from line - yield new_line - if bottom_space > 0: - yield from blank_lines(bottom_space) - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> Measurement: - measurement = Measurement.get(console, options, self.renderable) - return measurement - - -if __name__ == "__main__": # pragma: no cover - from pip._vendor.rich.console import Console, Group - from pip._vendor.rich.highlighter import ReprHighlighter - from pip._vendor.rich.panel import Panel - - highlighter = ReprHighlighter() - console = Console() - - panel = Panel( - Group( - Align.left(highlighter("align='left'")), - Align.center(highlighter("align='center'")), - Align.right(highlighter("align='right'")), - ), - width=60, - style="on dark_blue", - title="Align", - ) - - console.print( - Align.center(panel, vertical="middle", style="on red", height=console.height) - ) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/ansi.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/ansi.py deleted file mode 100644 index 66365e6..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/ansi.py +++ /dev/null @@ -1,240 +0,0 @@ -import re -import sys -from contextlib import suppress -from typing import Iterable, NamedTuple, Optional - -from .color import Color -from .style import Style -from .text import Text - -re_ansi = re.compile( - r""" -(?:\x1b\](.*?)\x1b\\)| -(?:\x1b([(@-Z\\-_]|\[[0-?]*[ -/]*[@-~])) -""", - re.VERBOSE, -) - - -class _AnsiToken(NamedTuple): - """Result of ansi tokenized string.""" - - plain: str = "" - sgr: Optional[str] = "" - osc: Optional[str] = "" - - -def _ansi_tokenize(ansi_text: str) -> Iterable[_AnsiToken]: - """Tokenize a string in to plain text and ANSI codes. - - Args: - ansi_text (str): A String containing ANSI codes. - - Yields: - AnsiToken: A named tuple of (plain, sgr, osc) - """ - - position = 0 - sgr: Optional[str] - osc: Optional[str] - for match in re_ansi.finditer(ansi_text): - start, end = match.span(0) - osc, sgr = match.groups() - if start > position: - yield _AnsiToken(ansi_text[position:start]) - if sgr: - if sgr == "(": - position = end + 1 - continue - if sgr.endswith("m"): - yield _AnsiToken("", sgr[1:-1], osc) - else: - yield _AnsiToken("", sgr, osc) - position = end - if position < len(ansi_text): - yield _AnsiToken(ansi_text[position:]) - - -SGR_STYLE_MAP = { - 1: "bold", - 2: "dim", - 3: "italic", - 4: "underline", - 5: "blink", - 6: "blink2", - 7: "reverse", - 8: "conceal", - 9: "strike", - 21: "underline2", - 22: "not dim not bold", - 23: "not italic", - 24: "not underline", - 25: "not blink", - 26: "not blink2", - 27: "not reverse", - 28: "not conceal", - 29: "not strike", - 30: "color(0)", - 31: "color(1)", - 32: "color(2)", - 33: "color(3)", - 34: "color(4)", - 35: "color(5)", - 36: "color(6)", - 37: "color(7)", - 39: "default", - 40: "on color(0)", - 41: "on color(1)", - 42: "on color(2)", - 43: "on color(3)", - 44: "on color(4)", - 45: "on color(5)", - 46: "on color(6)", - 47: "on color(7)", - 49: "on default", - 51: "frame", - 52: "encircle", - 53: "overline", - 54: "not frame not encircle", - 55: "not overline", - 90: "color(8)", - 91: "color(9)", - 92: "color(10)", - 93: "color(11)", - 94: "color(12)", - 95: "color(13)", - 96: "color(14)", - 97: "color(15)", - 100: "on color(8)", - 101: "on color(9)", - 102: "on color(10)", - 103: "on color(11)", - 104: "on color(12)", - 105: "on color(13)", - 106: "on color(14)", - 107: "on color(15)", -} - - -class AnsiDecoder: - """Translate ANSI code in to styled Text.""" - - def __init__(self) -> None: - self.style = Style.null() - - def decode(self, terminal_text: str) -> Iterable[Text]: - """Decode ANSI codes in an iterable of lines. - - Args: - lines (Iterable[str]): An iterable of lines of terminal output. - - Yields: - Text: Marked up Text. - """ - for line in terminal_text.splitlines(): - yield self.decode_line(line) - - def decode_line(self, line: str) -> Text: - """Decode a line containing ansi codes. - - Args: - line (str): A line of terminal output. - - Returns: - Text: A Text instance marked up according to ansi codes. - """ - from_ansi = Color.from_ansi - from_rgb = Color.from_rgb - _Style = Style - text = Text() - append = text.append - line = line.rsplit("\r", 1)[-1] - for plain_text, sgr, osc in _ansi_tokenize(line): - if plain_text: - append(plain_text, self.style or None) - elif osc is not None: - if osc.startswith("8;"): - _params, semicolon, link = osc[2:].partition(";") - if semicolon: - self.style = self.style.update_link(link or None) - elif sgr is not None: - # Translate in to semi-colon separated codes - # Ignore invalid codes, because we want to be lenient - codes = [ - min(255, int(_code) if _code else 0) - for _code in sgr.split(";") - if _code.isdigit() or _code == "" - ] - iter_codes = iter(codes) - for code in iter_codes: - if code == 0: - # reset - self.style = _Style.null() - elif code in SGR_STYLE_MAP: - # styles - self.style += _Style.parse(SGR_STYLE_MAP[code]) - elif code == 38: - #  Foreground - with suppress(StopIteration): - color_type = next(iter_codes) - if color_type == 5: - self.style += _Style.from_color( - from_ansi(next(iter_codes)) - ) - elif color_type == 2: - self.style += _Style.from_color( - from_rgb( - next(iter_codes), - next(iter_codes), - next(iter_codes), - ) - ) - elif code == 48: - # Background - with suppress(StopIteration): - color_type = next(iter_codes) - if color_type == 5: - self.style += _Style.from_color( - None, from_ansi(next(iter_codes)) - ) - elif color_type == 2: - self.style += _Style.from_color( - None, - from_rgb( - next(iter_codes), - next(iter_codes), - next(iter_codes), - ), - ) - - return text - - -if sys.platform != "win32" and __name__ == "__main__": # pragma: no cover - import io - import os - import pty - import sys - - decoder = AnsiDecoder() - - stdout = io.BytesIO() - - def read(fd: int) -> bytes: - data = os.read(fd, 1024) - stdout.write(data) - return data - - pty.spawn(sys.argv[1:], read) - - from .console import Console - - console = Console(record=True) - - stdout_result = stdout.getvalue().decode("utf-8") - print(stdout_result) - - for line in decoder.decode(stdout_result): - console.print(line) - - console.save_html("stdout.html") diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/bar.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/bar.py deleted file mode 100644 index ed86a55..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/bar.py +++ /dev/null @@ -1,94 +0,0 @@ -from typing import Optional, Union - -from .color import Color -from .console import Console, ConsoleOptions, RenderResult -from .jupyter import JupyterMixin -from .measure import Measurement -from .segment import Segment -from .style import Style - -# There are left-aligned characters for 1/8 to 7/8, but -# the right-aligned characters exist only for 1/8 and 4/8. -BEGIN_BLOCK_ELEMENTS = ["█", "█", "█", "▐", "▐", "▐", "▕", "▕"] -END_BLOCK_ELEMENTS = [" ", "▏", "▎", "▍", "▌", "▋", "▊", "▉"] -FULL_BLOCK = "█" - - -class Bar(JupyterMixin): - """Renders a solid block bar. - - Args: - size (float): Value for the end of the bar. - begin (float): Begin point (between 0 and size, inclusive). - end (float): End point (between 0 and size, inclusive). - width (int, optional): Width of the bar, or ``None`` for maximum width. Defaults to None. - color (Union[Color, str], optional): Color of the bar. Defaults to "default". - bgcolor (Union[Color, str], optional): Color of bar background. Defaults to "default". - """ - - def __init__( - self, - size: float, - begin: float, - end: float, - *, - width: Optional[int] = None, - color: Union[Color, str] = "default", - bgcolor: Union[Color, str] = "default", - ): - self.size = size - self.begin = max(begin, 0) - self.end = min(end, size) - self.width = width - self.style = Style(color=color, bgcolor=bgcolor) - - def __repr__(self) -> str: - return f"Bar({self.size}, {self.begin}, {self.end})" - - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - - width = min( - self.width if self.width is not None else options.max_width, - options.max_width, - ) - - if self.begin >= self.end: - yield Segment(" " * width, self.style) - yield Segment.line() - return - - prefix_complete_eights = int(width * 8 * self.begin / self.size) - prefix_bar_count = prefix_complete_eights // 8 - prefix_eights_count = prefix_complete_eights % 8 - - body_complete_eights = int(width * 8 * self.end / self.size) - body_bar_count = body_complete_eights // 8 - body_eights_count = body_complete_eights % 8 - - # When start and end fall into the same cell, we ideally should render - # a symbol that's "center-aligned", but there is no good symbol in Unicode. - # In this case, we fall back to right-aligned block symbol for simplicity. - - prefix = " " * prefix_bar_count - if prefix_eights_count: - prefix += BEGIN_BLOCK_ELEMENTS[prefix_eights_count] - - body = FULL_BLOCK * body_bar_count - if body_eights_count: - body += END_BLOCK_ELEMENTS[body_eights_count] - - suffix = " " * (width - len(body)) - - yield Segment(prefix + body[len(prefix) :] + suffix, self.style) - yield Segment.line() - - def __rich_measure__( - self, console: Console, options: ConsoleOptions - ) -> Measurement: - return ( - Measurement(self.width, self.width) - if self.width is not None - else Measurement(4, options.max_width) - ) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/box.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/box.py deleted file mode 100644 index 97d2a94..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/box.py +++ /dev/null @@ -1,517 +0,0 @@ -import sys -from typing import TYPE_CHECKING, Iterable, List - -if sys.version_info >= (3, 8): - from typing import Literal -else: - from pip._vendor.typing_extensions import Literal # pragma: no cover - - -from ._loop import loop_last - -if TYPE_CHECKING: - from pip._vendor.rich.console import ConsoleOptions - - -class Box: - """Defines characters to render boxes. - - ┌─┬┐ top - │ ││ head - ├─┼┤ head_row - │ ││ mid - ├─┼┤ row - ├─┼┤ foot_row - │ ││ foot - └─┴┘ bottom - - Args: - box (str): Characters making up box. - ascii (bool, optional): True if this box uses ascii characters only. Default is False. - """ - - def __init__(self, box: str, *, ascii: bool = False) -> None: - self._box = box - self.ascii = ascii - line1, line2, line3, line4, line5, line6, line7, line8 = box.splitlines() - # top - self.top_left, self.top, self.top_divider, self.top_right = iter(line1) - # head - self.head_left, _, self.head_vertical, self.head_right = iter(line2) - # head_row - ( - self.head_row_left, - self.head_row_horizontal, - self.head_row_cross, - self.head_row_right, - ) = iter(line3) - - # mid - self.mid_left, _, self.mid_vertical, self.mid_right = iter(line4) - # row - self.row_left, self.row_horizontal, self.row_cross, self.row_right = iter(line5) - # foot_row - ( - self.foot_row_left, - self.foot_row_horizontal, - self.foot_row_cross, - self.foot_row_right, - ) = iter(line6) - # foot - self.foot_left, _, self.foot_vertical, self.foot_right = iter(line7) - # bottom - self.bottom_left, self.bottom, self.bottom_divider, self.bottom_right = iter( - line8 - ) - - def __repr__(self) -> str: - return "Box(...)" - - def __str__(self) -> str: - return self._box - - def substitute(self, options: "ConsoleOptions", safe: bool = True) -> "Box": - """Substitute this box for another if it won't render due to platform issues. - - Args: - options (ConsoleOptions): Console options used in rendering. - safe (bool, optional): Substitute this for another Box if there are known problems - displaying on the platform (currently only relevant on Windows). Default is True. - - Returns: - Box: A different Box or the same Box. - """ - box = self - if options.legacy_windows and safe: - box = LEGACY_WINDOWS_SUBSTITUTIONS.get(box, box) - if options.ascii_only and not box.ascii: - box = ASCII - return box - - def get_plain_headed_box(self) -> "Box": - """If this box uses special characters for the borders of the header, then - return the equivalent box that does not. - - Returns: - Box: The most similar Box that doesn't use header-specific box characters. - If the current Box already satisfies this criterion, then it's returned. - """ - return PLAIN_HEADED_SUBSTITUTIONS.get(self, self) - - def get_top(self, widths: Iterable[int]) -> str: - """Get the top of a simple box. - - Args: - widths (List[int]): Widths of columns. - - Returns: - str: A string of box characters. - """ - - parts: List[str] = [] - append = parts.append - append(self.top_left) - for last, width in loop_last(widths): - append(self.top * width) - if not last: - append(self.top_divider) - append(self.top_right) - return "".join(parts) - - def get_row( - self, - widths: Iterable[int], - level: Literal["head", "row", "foot", "mid"] = "row", - edge: bool = True, - ) -> str: - """Get the top of a simple box. - - Args: - width (List[int]): Widths of columns. - - Returns: - str: A string of box characters. - """ - if level == "head": - left = self.head_row_left - horizontal = self.head_row_horizontal - cross = self.head_row_cross - right = self.head_row_right - elif level == "row": - left = self.row_left - horizontal = self.row_horizontal - cross = self.row_cross - right = self.row_right - elif level == "mid": - left = self.mid_left - horizontal = " " - cross = self.mid_vertical - right = self.mid_right - elif level == "foot": - left = self.foot_row_left - horizontal = self.foot_row_horizontal - cross = self.foot_row_cross - right = self.foot_row_right - else: - raise ValueError("level must be 'head', 'row' or 'foot'") - - parts: List[str] = [] - append = parts.append - if edge: - append(left) - for last, width in loop_last(widths): - append(horizontal * width) - if not last: - append(cross) - if edge: - append(right) - return "".join(parts) - - def get_bottom(self, widths: Iterable[int]) -> str: - """Get the bottom of a simple box. - - Args: - widths (List[int]): Widths of columns. - - Returns: - str: A string of box characters. - """ - - parts: List[str] = [] - append = parts.append - append(self.bottom_left) - for last, width in loop_last(widths): - append(self.bottom * width) - if not last: - append(self.bottom_divider) - append(self.bottom_right) - return "".join(parts) - - -ASCII: Box = Box( - """\ -+--+ -| || -|-+| -| || -|-+| -|-+| -| || -+--+ -""", - ascii=True, -) - -ASCII2: Box = Box( - """\ -+-++ -| || -+-++ -| || -+-++ -+-++ -| || -+-++ -""", - ascii=True, -) - -ASCII_DOUBLE_HEAD: Box = Box( - """\ -+-++ -| || -+=++ -| || -+-++ -+-++ -| || -+-++ -""", - ascii=True, -) - -SQUARE: Box = Box( - """\ -┌─┬┐ -│ ││ -├─┼┤ -│ ││ -├─┼┤ -├─┼┤ -│ ││ -└─┴┘ -""" -) - -SQUARE_DOUBLE_HEAD: Box = Box( - """\ -┌─┬┐ -│ ││ -╞═╪╡ -│ ││ -├─┼┤ -├─┼┤ -│ ││ -└─┴┘ -""" -) - -MINIMAL: Box = Box( - """\ - ╷ - │ -╶─┼╴ - │ -╶─┼╴ -╶─┼╴ - │ - ╵ -""" -) - - -MINIMAL_HEAVY_HEAD: Box = Box( - """\ - ╷ - │ -╺━┿╸ - │ -╶─┼╴ -╶─┼╴ - │ - ╵ -""" -) - -MINIMAL_DOUBLE_HEAD: Box = Box( - """\ - ╷ - │ - ═╪ - │ - ─┼ - ─┼ - │ - ╵ -""" -) - - -SIMPLE: Box = Box( - """\ - - - ── - - - ── - - -""" -) - -SIMPLE_HEAD: Box = Box( - """\ - - - ── - - - - - -""" -) - - -SIMPLE_HEAVY: Box = Box( - """\ - - - ━━ - - - ━━ - - -""" -) - - -HORIZONTALS: Box = Box( - """\ - ── - - ── - - ── - ── - - ── -""" -) - -ROUNDED: Box = Box( - """\ -╭─┬╮ -│ ││ -├─┼┤ -│ ││ -├─┼┤ -├─┼┤ -│ ││ -╰─┴╯ -""" -) - -HEAVY: Box = Box( - """\ -┏━┳┓ -┃ ┃┃ -┣━╋┫ -┃ ┃┃ -┣━╋┫ -┣━╋┫ -┃ ┃┃ -┗━┻┛ -""" -) - -HEAVY_EDGE: Box = Box( - """\ -┏━┯┓ -┃ │┃ -┠─┼┨ -┃ │┃ -┠─┼┨ -┠─┼┨ -┃ │┃ -┗━┷┛ -""" -) - -HEAVY_HEAD: Box = Box( - """\ -┏━┳┓ -┃ ┃┃ -┡━╇┩ -│ ││ -├─┼┤ -├─┼┤ -│ ││ -└─┴┘ -""" -) - -DOUBLE: Box = Box( - """\ -╔═╦╗ -║ ║║ -╠═╬╣ -║ ║║ -╠═╬╣ -╠═╬╣ -║ ║║ -╚═╩╝ -""" -) - -DOUBLE_EDGE: Box = Box( - """\ -╔═╤╗ -║ │║ -╟─┼╢ -║ │║ -╟─┼╢ -╟─┼╢ -║ │║ -╚═╧╝ -""" -) - -MARKDOWN: Box = Box( - """\ - -| || -|-|| -| || -|-|| -|-|| -| || - -""", - ascii=True, -) - -# Map Boxes that don't render with raster fonts on to equivalent that do -LEGACY_WINDOWS_SUBSTITUTIONS = { - ROUNDED: SQUARE, - MINIMAL_HEAVY_HEAD: MINIMAL, - SIMPLE_HEAVY: SIMPLE, - HEAVY: SQUARE, - HEAVY_EDGE: SQUARE, - HEAVY_HEAD: SQUARE, -} - -# Map headed boxes to their headerless equivalents -PLAIN_HEADED_SUBSTITUTIONS = { - HEAVY_HEAD: SQUARE, - SQUARE_DOUBLE_HEAD: SQUARE, - MINIMAL_DOUBLE_HEAD: MINIMAL, - MINIMAL_HEAVY_HEAD: MINIMAL, - ASCII_DOUBLE_HEAD: ASCII2, -} - - -if __name__ == "__main__": # pragma: no cover - - from pip._vendor.rich.columns import Columns - from pip._vendor.rich.panel import Panel - - from . import box as box - from .console import Console - from .table import Table - from .text import Text - - console = Console(record=True) - - BOXES = [ - "ASCII", - "ASCII2", - "ASCII_DOUBLE_HEAD", - "SQUARE", - "SQUARE_DOUBLE_HEAD", - "MINIMAL", - "MINIMAL_HEAVY_HEAD", - "MINIMAL_DOUBLE_HEAD", - "SIMPLE", - "SIMPLE_HEAD", - "SIMPLE_HEAVY", - "HORIZONTALS", - "ROUNDED", - "HEAVY", - "HEAVY_EDGE", - "HEAVY_HEAD", - "DOUBLE", - "DOUBLE_EDGE", - "MARKDOWN", - ] - - console.print(Panel("[bold green]Box Constants", style="green"), justify="center") - console.print() - - columns = Columns(expand=True, padding=2) - for box_name in sorted(BOXES): - table = Table( - show_footer=True, style="dim", border_style="not dim", expand=True - ) - table.add_column("Header 1", "Footer 1") - table.add_column("Header 2", "Footer 2") - table.add_row("Cell", "Cell") - table.add_row("Cell", "Cell") - table.box = getattr(box, box_name) - table.title = Text(f"box.{box_name}", style="magenta") - columns.add_renderable(table) - console.print(columns) - - # console.save_svg("box.svg") diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/cells.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/cells.py deleted file mode 100644 index 9354f9e..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/cells.py +++ /dev/null @@ -1,154 +0,0 @@ -import re -from functools import lru_cache -from typing import Callable, List - -from ._cell_widths import CELL_WIDTHS - -# Regex to match sequence of the most common character ranges -_is_single_cell_widths = re.compile("^[\u0020-\u006f\u00a0\u02ff\u0370-\u0482]*$").match - - -@lru_cache(4096) -def cached_cell_len(text: str) -> int: - """Get the number of cells required to display text. - - This method always caches, which may use up a lot of memory. It is recommended to use - `cell_len` over this method. - - Args: - text (str): Text to display. - - Returns: - int: Get the number of cells required to display text. - """ - _get_size = get_character_cell_size - total_size = sum(_get_size(character) for character in text) - return total_size - - -def cell_len(text: str, _cell_len: Callable[[str], int] = cached_cell_len) -> int: - """Get the number of cells required to display text. - - Args: - text (str): Text to display. - - Returns: - int: Get the number of cells required to display text. - """ - if len(text) < 512: - return _cell_len(text) - _get_size = get_character_cell_size - total_size = sum(_get_size(character) for character in text) - return total_size - - -@lru_cache(maxsize=4096) -def get_character_cell_size(character: str) -> int: - """Get the cell size of a character. - - Args: - character (str): A single character. - - Returns: - int: Number of cells (0, 1 or 2) occupied by that character. - """ - return _get_codepoint_cell_size(ord(character)) - - -@lru_cache(maxsize=4096) -def _get_codepoint_cell_size(codepoint: int) -> int: - """Get the cell size of a character. - - Args: - codepoint (int): Codepoint of a character. - - Returns: - int: Number of cells (0, 1 or 2) occupied by that character. - """ - - _table = CELL_WIDTHS - lower_bound = 0 - upper_bound = len(_table) - 1 - index = (lower_bound + upper_bound) // 2 - while True: - start, end, width = _table[index] - if codepoint < start: - upper_bound = index - 1 - elif codepoint > end: - lower_bound = index + 1 - else: - return 0 if width == -1 else width - if upper_bound < lower_bound: - break - index = (lower_bound + upper_bound) // 2 - return 1 - - -def set_cell_size(text: str, total: int) -> str: - """Set the length of a string to fit within given number of cells.""" - - if _is_single_cell_widths(text): - size = len(text) - if size < total: - return text + " " * (total - size) - return text[:total] - - if total <= 0: - return "" - cell_size = cell_len(text) - if cell_size == total: - return text - if cell_size < total: - return text + " " * (total - cell_size) - - start = 0 - end = len(text) - - # Binary search until we find the right size - while True: - pos = (start + end) // 2 - before = text[: pos + 1] - before_len = cell_len(before) - if before_len == total + 1 and cell_len(before[-1]) == 2: - return before[:-1] + " " - if before_len == total: - return before - if before_len > total: - end = pos - else: - start = pos - - -# TODO: This is inefficient -# TODO: This might not work with CWJ type characters -def chop_cells(text: str, max_size: int, position: int = 0) -> List[str]: - """Break text in to equal (cell) length strings, returning the characters in reverse - order""" - _get_character_cell_size = get_character_cell_size - characters = [ - (character, _get_character_cell_size(character)) for character in text - ] - total_size = position - lines: List[List[str]] = [[]] - append = lines[-1].append - - for character, size in reversed(characters): - if total_size + size > max_size: - lines.append([character]) - append = lines[-1].append - total_size = size - else: - total_size += size - append(character) - - return ["".join(line) for line in lines] - - -if __name__ == "__main__": # pragma: no cover - - print(get_character_cell_size("😽")) - for line in chop_cells("""这是对亚洲语言支持的测试。面对模棱两可的想法,拒绝猜测的诱惑。""", 8): - print(line) - for n in range(80, 1, -1): - print(set_cell_size("""这是对亚洲语言支持的测试。面对模棱两可的想法,拒绝猜测的诱惑。""", n) + "|") - print("x" * n) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py deleted file mode 100644 index dfe4559..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py +++ /dev/null @@ -1,622 +0,0 @@ -import platform -import re -from colorsys import rgb_to_hls -from enum import IntEnum -from functools import lru_cache -from typing import TYPE_CHECKING, NamedTuple, Optional, Tuple - -from ._palettes import EIGHT_BIT_PALETTE, STANDARD_PALETTE, WINDOWS_PALETTE -from .color_triplet import ColorTriplet -from .repr import Result, rich_repr -from .terminal_theme import DEFAULT_TERMINAL_THEME - -if TYPE_CHECKING: # pragma: no cover - from .terminal_theme import TerminalTheme - from .text import Text - - -WINDOWS = platform.system() == "Windows" - - -class ColorSystem(IntEnum): - """One of the 3 color system supported by terminals.""" - - STANDARD = 1 - EIGHT_BIT = 2 - TRUECOLOR = 3 - WINDOWS = 4 - - def __repr__(self) -> str: - return f"ColorSystem.{self.name}" - - def __str__(self) -> str: - return repr(self) - - -class ColorType(IntEnum): - """Type of color stored in Color class.""" - - DEFAULT = 0 - STANDARD = 1 - EIGHT_BIT = 2 - TRUECOLOR = 3 - WINDOWS = 4 - - def __repr__(self) -> str: - return f"ColorType.{self.name}" - - -ANSI_COLOR_NAMES = { - "black": 0, - "red": 1, - "green": 2, - "yellow": 3, - "blue": 4, - "magenta": 5, - "cyan": 6, - "white": 7, - "bright_black": 8, - "bright_red": 9, - "bright_green": 10, - "bright_yellow": 11, - "bright_blue": 12, - "bright_magenta": 13, - "bright_cyan": 14, - "bright_white": 15, - "grey0": 16, - "gray0": 16, - "navy_blue": 17, - "dark_blue": 18, - "blue3": 20, - "blue1": 21, - "dark_green": 22, - "deep_sky_blue4": 25, - "dodger_blue3": 26, - "dodger_blue2": 27, - "green4": 28, - "spring_green4": 29, - "turquoise4": 30, - "deep_sky_blue3": 32, - "dodger_blue1": 33, - "green3": 40, - "spring_green3": 41, - "dark_cyan": 36, - "light_sea_green": 37, - "deep_sky_blue2": 38, - "deep_sky_blue1": 39, - "spring_green2": 47, - "cyan3": 43, - "dark_turquoise": 44, - "turquoise2": 45, - "green1": 46, - "spring_green1": 48, - "medium_spring_green": 49, - "cyan2": 50, - "cyan1": 51, - "dark_red": 88, - "deep_pink4": 125, - "purple4": 55, - "purple3": 56, - "blue_violet": 57, - "orange4": 94, - "grey37": 59, - "gray37": 59, - "medium_purple4": 60, - "slate_blue3": 62, - "royal_blue1": 63, - "chartreuse4": 64, - "dark_sea_green4": 71, - "pale_turquoise4": 66, - "steel_blue": 67, - "steel_blue3": 68, - "cornflower_blue": 69, - "chartreuse3": 76, - "cadet_blue": 73, - "sky_blue3": 74, - "steel_blue1": 81, - "pale_green3": 114, - "sea_green3": 78, - "aquamarine3": 79, - "medium_turquoise": 80, - "chartreuse2": 112, - "sea_green2": 83, - "sea_green1": 85, - "aquamarine1": 122, - "dark_slate_gray2": 87, - "dark_magenta": 91, - "dark_violet": 128, - "purple": 129, - "light_pink4": 95, - "plum4": 96, - "medium_purple3": 98, - "slate_blue1": 99, - "yellow4": 106, - "wheat4": 101, - "grey53": 102, - "gray53": 102, - "light_slate_grey": 103, - "light_slate_gray": 103, - "medium_purple": 104, - "light_slate_blue": 105, - "dark_olive_green3": 149, - "dark_sea_green": 108, - "light_sky_blue3": 110, - "sky_blue2": 111, - "dark_sea_green3": 150, - "dark_slate_gray3": 116, - "sky_blue1": 117, - "chartreuse1": 118, - "light_green": 120, - "pale_green1": 156, - "dark_slate_gray1": 123, - "red3": 160, - "medium_violet_red": 126, - "magenta3": 164, - "dark_orange3": 166, - "indian_red": 167, - "hot_pink3": 168, - "medium_orchid3": 133, - "medium_orchid": 134, - "medium_purple2": 140, - "dark_goldenrod": 136, - "light_salmon3": 173, - "rosy_brown": 138, - "grey63": 139, - "gray63": 139, - "medium_purple1": 141, - "gold3": 178, - "dark_khaki": 143, - "navajo_white3": 144, - "grey69": 145, - "gray69": 145, - "light_steel_blue3": 146, - "light_steel_blue": 147, - "yellow3": 184, - "dark_sea_green2": 157, - "light_cyan3": 152, - "light_sky_blue1": 153, - "green_yellow": 154, - "dark_olive_green2": 155, - "dark_sea_green1": 193, - "pale_turquoise1": 159, - "deep_pink3": 162, - "magenta2": 200, - "hot_pink2": 169, - "orchid": 170, - "medium_orchid1": 207, - "orange3": 172, - "light_pink3": 174, - "pink3": 175, - "plum3": 176, - "violet": 177, - "light_goldenrod3": 179, - "tan": 180, - "misty_rose3": 181, - "thistle3": 182, - "plum2": 183, - "khaki3": 185, - "light_goldenrod2": 222, - "light_yellow3": 187, - "grey84": 188, - "gray84": 188, - "light_steel_blue1": 189, - "yellow2": 190, - "dark_olive_green1": 192, - "honeydew2": 194, - "light_cyan1": 195, - "red1": 196, - "deep_pink2": 197, - "deep_pink1": 199, - "magenta1": 201, - "orange_red1": 202, - "indian_red1": 204, - "hot_pink": 206, - "dark_orange": 208, - "salmon1": 209, - "light_coral": 210, - "pale_violet_red1": 211, - "orchid2": 212, - "orchid1": 213, - "orange1": 214, - "sandy_brown": 215, - "light_salmon1": 216, - "light_pink1": 217, - "pink1": 218, - "plum1": 219, - "gold1": 220, - "navajo_white1": 223, - "misty_rose1": 224, - "thistle1": 225, - "yellow1": 226, - "light_goldenrod1": 227, - "khaki1": 228, - "wheat1": 229, - "cornsilk1": 230, - "grey100": 231, - "gray100": 231, - "grey3": 232, - "gray3": 232, - "grey7": 233, - "gray7": 233, - "grey11": 234, - "gray11": 234, - "grey15": 235, - "gray15": 235, - "grey19": 236, - "gray19": 236, - "grey23": 237, - "gray23": 237, - "grey27": 238, - "gray27": 238, - "grey30": 239, - "gray30": 239, - "grey35": 240, - "gray35": 240, - "grey39": 241, - "gray39": 241, - "grey42": 242, - "gray42": 242, - "grey46": 243, - "gray46": 243, - "grey50": 244, - "gray50": 244, - "grey54": 245, - "gray54": 245, - "grey58": 246, - "gray58": 246, - "grey62": 247, - "gray62": 247, - "grey66": 248, - "gray66": 248, - "grey70": 249, - "gray70": 249, - "grey74": 250, - "gray74": 250, - "grey78": 251, - "gray78": 251, - "grey82": 252, - "gray82": 252, - "grey85": 253, - "gray85": 253, - "grey89": 254, - "gray89": 254, - "grey93": 255, - "gray93": 255, -} - - -class ColorParseError(Exception): - """The color could not be parsed.""" - - -RE_COLOR = re.compile( - r"""^ -\#([0-9a-f]{6})$| -color\(([0-9]{1,3})\)$| -rgb\(([\d\s,]+)\)$ -""", - re.VERBOSE, -) - - -@rich_repr -class Color(NamedTuple): - """Terminal color definition.""" - - name: str - """The name of the color (typically the input to Color.parse).""" - type: ColorType - """The type of the color.""" - number: Optional[int] = None - """The color number, if a standard color, or None.""" - triplet: Optional[ColorTriplet] = None - """A triplet of color components, if an RGB color.""" - - def __rich__(self) -> "Text": - """Displays the actual color if Rich printed.""" - from .style import Style - from .text import Text - - return Text.assemble( - f"<color {self.name!r} ({self.type.name.lower()})", - ("⬤", Style(color=self)), - " >", - ) - - def __rich_repr__(self) -> Result: - yield self.name - yield self.type - yield "number", self.number, None - yield "triplet", self.triplet, None - - @property - def system(self) -> ColorSystem: - """Get the native color system for this color.""" - if self.type == ColorType.DEFAULT: - return ColorSystem.STANDARD - return ColorSystem(int(self.type)) - - @property - def is_system_defined(self) -> bool: - """Check if the color is ultimately defined by the system.""" - return self.system not in (ColorSystem.EIGHT_BIT, ColorSystem.TRUECOLOR) - - @property - def is_default(self) -> bool: - """Check if the color is a default color.""" - return self.type == ColorType.DEFAULT - - def get_truecolor( - self, theme: Optional["TerminalTheme"] = None, foreground: bool = True - ) -> ColorTriplet: - """Get an equivalent color triplet for this color. - - Args: - theme (TerminalTheme, optional): Optional terminal theme, or None to use default. Defaults to None. - foreground (bool, optional): True for a foreground color, or False for background. Defaults to True. - - Returns: - ColorTriplet: A color triplet containing RGB components. - """ - - if theme is None: - theme = DEFAULT_TERMINAL_THEME - if self.type == ColorType.TRUECOLOR: - assert self.triplet is not None - return self.triplet - elif self.type == ColorType.EIGHT_BIT: - assert self.number is not None - return EIGHT_BIT_PALETTE[self.number] - elif self.type == ColorType.STANDARD: - assert self.number is not None - return theme.ansi_colors[self.number] - elif self.type == ColorType.WINDOWS: - assert self.number is not None - return WINDOWS_PALETTE[self.number] - else: # self.type == ColorType.DEFAULT: - assert self.number is None - return theme.foreground_color if foreground else theme.background_color - - @classmethod - def from_ansi(cls, number: int) -> "Color": - """Create a Color number from it's 8-bit ansi number. - - Args: - number (int): A number between 0-255 inclusive. - - Returns: - Color: A new Color instance. - """ - return cls( - name=f"color({number})", - type=(ColorType.STANDARD if number < 16 else ColorType.EIGHT_BIT), - number=number, - ) - - @classmethod - def from_triplet(cls, triplet: "ColorTriplet") -> "Color": - """Create a truecolor RGB color from a triplet of values. - - Args: - triplet (ColorTriplet): A color triplet containing red, green and blue components. - - Returns: - Color: A new color object. - """ - return cls(name=triplet.hex, type=ColorType.TRUECOLOR, triplet=triplet) - - @classmethod - def from_rgb(cls, red: float, green: float, blue: float) -> "Color": - """Create a truecolor from three color components in the range(0->255). - - Args: - red (float): Red component in range 0-255. - green (float): Green component in range 0-255. - blue (float): Blue component in range 0-255. - - Returns: - Color: A new color object. - """ - return cls.from_triplet(ColorTriplet(int(red), int(green), int(blue))) - - @classmethod - def default(cls) -> "Color": - """Get a Color instance representing the default color. - - Returns: - Color: Default color. - """ - return cls(name="default", type=ColorType.DEFAULT) - - @classmethod - @lru_cache(maxsize=1024) - def parse(cls, color: str) -> "Color": - """Parse a color definition.""" - original_color = color - color = color.lower().strip() - - if color == "default": - return cls(color, type=ColorType.DEFAULT) - - color_number = ANSI_COLOR_NAMES.get(color) - if color_number is not None: - return cls( - color, - type=(ColorType.STANDARD if color_number < 16 else ColorType.EIGHT_BIT), - number=color_number, - ) - - color_match = RE_COLOR.match(color) - if color_match is None: - raise ColorParseError(f"{original_color!r} is not a valid color") - - color_24, color_8, color_rgb = color_match.groups() - if color_24: - triplet = ColorTriplet( - int(color_24[0:2], 16), int(color_24[2:4], 16), int(color_24[4:6], 16) - ) - return cls(color, ColorType.TRUECOLOR, triplet=triplet) - - elif color_8: - number = int(color_8) - if number > 255: - raise ColorParseError(f"color number must be <= 255 in {color!r}") - return cls( - color, - type=(ColorType.STANDARD if number < 16 else ColorType.EIGHT_BIT), - number=number, - ) - - else: # color_rgb: - components = color_rgb.split(",") - if len(components) != 3: - raise ColorParseError( - f"expected three components in {original_color!r}" - ) - red, green, blue = components - triplet = ColorTriplet(int(red), int(green), int(blue)) - if not all(component <= 255 for component in triplet): - raise ColorParseError( - f"color components must be <= 255 in {original_color!r}" - ) - return cls(color, ColorType.TRUECOLOR, triplet=triplet) - - @lru_cache(maxsize=1024) - def get_ansi_codes(self, foreground: bool = True) -> Tuple[str, ...]: - """Get the ANSI escape codes for this color.""" - _type = self.type - if _type == ColorType.DEFAULT: - return ("39" if foreground else "49",) - - elif _type == ColorType.WINDOWS: - number = self.number - assert number is not None - fore, back = (30, 40) if number < 8 else (82, 92) - return (str(fore + number if foreground else back + number),) - - elif _type == ColorType.STANDARD: - number = self.number - assert number is not None - fore, back = (30, 40) if number < 8 else (82, 92) - return (str(fore + number if foreground else back + number),) - - elif _type == ColorType.EIGHT_BIT: - assert self.number is not None - return ("38" if foreground else "48", "5", str(self.number)) - - else: # self.standard == ColorStandard.TRUECOLOR: - assert self.triplet is not None - red, green, blue = self.triplet - return ("38" if foreground else "48", "2", str(red), str(green), str(blue)) - - @lru_cache(maxsize=1024) - def downgrade(self, system: ColorSystem) -> "Color": - """Downgrade a color system to a system with fewer colors.""" - - if self.type in (ColorType.DEFAULT, system): - return self - # Convert to 8-bit color from truecolor color - if system == ColorSystem.EIGHT_BIT and self.system == ColorSystem.TRUECOLOR: - assert self.triplet is not None - _h, l, s = rgb_to_hls(*self.triplet.normalized) - # If saturation is under 15% assume it is grayscale - if s < 0.15: - gray = round(l * 25.0) - if gray == 0: - color_number = 16 - elif gray == 25: - color_number = 231 - else: - color_number = 231 + gray - return Color(self.name, ColorType.EIGHT_BIT, number=color_number) - - red, green, blue = self.triplet - six_red = red / 95 if red < 95 else 1 + (red - 95) / 40 - six_green = green / 95 if green < 95 else 1 + (green - 95) / 40 - six_blue = blue / 95 if blue < 95 else 1 + (blue - 95) / 40 - - color_number = ( - 16 + 36 * round(six_red) + 6 * round(six_green) + round(six_blue) - ) - return Color(self.name, ColorType.EIGHT_BIT, number=color_number) - - # Convert to standard from truecolor or 8-bit - elif system == ColorSystem.STANDARD: - if self.system == ColorSystem.TRUECOLOR: - assert self.triplet is not None - triplet = self.triplet - else: # self.system == ColorSystem.EIGHT_BIT - assert self.number is not None - triplet = ColorTriplet(*EIGHT_BIT_PALETTE[self.number]) - - color_number = STANDARD_PALETTE.match(triplet) - return Color(self.name, ColorType.STANDARD, number=color_number) - - elif system == ColorSystem.WINDOWS: - if self.system == ColorSystem.TRUECOLOR: - assert self.triplet is not None - triplet = self.triplet - else: # self.system == ColorSystem.EIGHT_BIT - assert self.number is not None - if self.number < 16: - return Color(self.name, ColorType.WINDOWS, number=self.number) - triplet = ColorTriplet(*EIGHT_BIT_PALETTE[self.number]) - - color_number = WINDOWS_PALETTE.match(triplet) - return Color(self.name, ColorType.WINDOWS, number=color_number) - - return self - - -def parse_rgb_hex(hex_color: str) -> ColorTriplet: - """Parse six hex characters in to RGB triplet.""" - assert len(hex_color) == 6, "must be 6 characters" - color = ColorTriplet( - int(hex_color[0:2], 16), int(hex_color[2:4], 16), int(hex_color[4:6], 16) - ) - return color - - -def blend_rgb( - color1: ColorTriplet, color2: ColorTriplet, cross_fade: float = 0.5 -) -> ColorTriplet: - """Blend one RGB color in to another.""" - r1, g1, b1 = color1 - r2, g2, b2 = color2 - new_color = ColorTriplet( - int(r1 + (r2 - r1) * cross_fade), - int(g1 + (g2 - g1) * cross_fade), - int(b1 + (b2 - b1) * cross_fade), - ) - return new_color - - -if __name__ == "__main__": # pragma: no cover - - from .console import Console - from .table import Table - from .text import Text - - console = Console() - - table = Table(show_footer=False, show_edge=True) - table.add_column("Color", width=10, overflow="ellipsis") - table.add_column("Number", justify="right", style="yellow") - table.add_column("Name", style="green") - table.add_column("Hex", style="blue") - table.add_column("RGB", style="magenta") - - colors = sorted((v, k) for k, v in ANSI_COLOR_NAMES.items()) - for color_number, name in colors: - if "grey" in name: - continue - color_cell = Text(" " * 10, style=f"on {name}") - if color_number < 16: - table.add_row(color_cell, f"{color_number}", Text(f'"{name}"')) - else: - color = EIGHT_BIT_PALETTE[color_number] # type: ignore[has-type] - table.add_row( - color_cell, str(color_number), Text(f'"{name}"'), color.hex, color.rgb - ) - - console.print(table) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/color_triplet.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/color_triplet.py deleted file mode 100644 index 02cab32..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/color_triplet.py +++ /dev/null @@ -1,38 +0,0 @@ -from typing import NamedTuple, Tuple - - -class ColorTriplet(NamedTuple): - """The red, green, and blue components of a color.""" - - red: int - """Red component in 0 to 255 range.""" - green: int - """Green component in 0 to 255 range.""" - blue: int - """Blue component in 0 to 255 range.""" - - @property - def hex(self) -> str: - """get the color triplet in CSS style.""" - red, green, blue = self - return f"#{red:02x}{green:02x}{blue:02x}" - - @property - def rgb(self) -> str: - """The color in RGB format. - - Returns: - str: An rgb color, e.g. ``"rgb(100,23,255)"``. - """ - red, green, blue = self - return f"rgb({red},{green},{blue})" - - @property - def normalized(self) -> Tuple[float, float, float]: - """Convert components into floats between 0 and 1. - - Returns: - Tuple[float, float, float]: A tuple of three normalized colour components. - """ - red, green, blue = self - return red / 255.0, green / 255.0, blue / 255.0 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/columns.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/columns.py deleted file mode 100644 index 669a3a7..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/columns.py +++ /dev/null @@ -1,187 +0,0 @@ -from collections import defaultdict -from itertools import chain -from operator import itemgetter -from typing import Dict, Iterable, List, Optional, Tuple - -from .align import Align, AlignMethod -from .console import Console, ConsoleOptions, RenderableType, RenderResult -from .constrain import Constrain -from .measure import Measurement -from .padding import Padding, PaddingDimensions -from .table import Table -from .text import TextType -from .jupyter import JupyterMixin - - -class Columns(JupyterMixin): - """Display renderables in neat columns. - - Args: - renderables (Iterable[RenderableType]): Any number of Rich renderables (including str). - width (int, optional): The desired width of the columns, or None to auto detect. Defaults to None. - padding (PaddingDimensions, optional): Optional padding around cells. Defaults to (0, 1). - expand (bool, optional): Expand columns to full width. Defaults to False. - equal (bool, optional): Arrange in to equal sized columns. Defaults to False. - column_first (bool, optional): Align items from top to bottom (rather than left to right). Defaults to False. - right_to_left (bool, optional): Start column from right hand side. Defaults to False. - align (str, optional): Align value ("left", "right", or "center") or None for default. Defaults to None. - title (TextType, optional): Optional title for Columns. - """ - - def __init__( - self, - renderables: Optional[Iterable[RenderableType]] = None, - padding: PaddingDimensions = (0, 1), - *, - width: Optional[int] = None, - expand: bool = False, - equal: bool = False, - column_first: bool = False, - right_to_left: bool = False, - align: Optional[AlignMethod] = None, - title: Optional[TextType] = None, - ) -> None: - self.renderables = list(renderables or []) - self.width = width - self.padding = padding - self.expand = expand - self.equal = equal - self.column_first = column_first - self.right_to_left = right_to_left - self.align: Optional[AlignMethod] = align - self.title = title - - def add_renderable(self, renderable: RenderableType) -> None: - """Add a renderable to the columns. - - Args: - renderable (RenderableType): Any renderable object. - """ - self.renderables.append(renderable) - - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - render_str = console.render_str - renderables = [ - render_str(renderable) if isinstance(renderable, str) else renderable - for renderable in self.renderables - ] - if not renderables: - return - _top, right, _bottom, left = Padding.unpack(self.padding) - width_padding = max(left, right) - max_width = options.max_width - widths: Dict[int, int] = defaultdict(int) - column_count = len(renderables) - - get_measurement = Measurement.get - renderable_widths = [ - get_measurement(console, options, renderable).maximum - for renderable in renderables - ] - if self.equal: - renderable_widths = [max(renderable_widths)] * len(renderable_widths) - - def iter_renderables( - column_count: int, - ) -> Iterable[Tuple[int, Optional[RenderableType]]]: - item_count = len(renderables) - if self.column_first: - width_renderables = list(zip(renderable_widths, renderables)) - - column_lengths: List[int] = [item_count // column_count] * column_count - for col_no in range(item_count % column_count): - column_lengths[col_no] += 1 - - row_count = (item_count + column_count - 1) // column_count - cells = [[-1] * column_count for _ in range(row_count)] - row = col = 0 - for index in range(item_count): - cells[row][col] = index - column_lengths[col] -= 1 - if column_lengths[col]: - row += 1 - else: - col += 1 - row = 0 - for index in chain.from_iterable(cells): - if index == -1: - break - yield width_renderables[index] - else: - yield from zip(renderable_widths, renderables) - # Pad odd elements with spaces - if item_count % column_count: - for _ in range(column_count - (item_count % column_count)): - yield 0, None - - table = Table.grid(padding=self.padding, collapse_padding=True, pad_edge=False) - table.expand = self.expand - table.title = self.title - - if self.width is not None: - column_count = (max_width) // (self.width + width_padding) - for _ in range(column_count): - table.add_column(width=self.width) - else: - while column_count > 1: - widths.clear() - column_no = 0 - for renderable_width, _ in iter_renderables(column_count): - widths[column_no] = max(widths[column_no], renderable_width) - total_width = sum(widths.values()) + width_padding * ( - len(widths) - 1 - ) - if total_width > max_width: - column_count = len(widths) - 1 - break - else: - column_no = (column_no + 1) % column_count - else: - break - - get_renderable = itemgetter(1) - _renderables = [ - get_renderable(_renderable) - for _renderable in iter_renderables(column_count) - ] - if self.equal: - _renderables = [ - None - if renderable is None - else Constrain(renderable, renderable_widths[0]) - for renderable in _renderables - ] - if self.align: - align = self.align - _Align = Align - _renderables = [ - None if renderable is None else _Align(renderable, align) - for renderable in _renderables - ] - - right_to_left = self.right_to_left - add_row = table.add_row - for start in range(0, len(_renderables), column_count): - row = _renderables[start : start + column_count] - if right_to_left: - row = row[::-1] - add_row(*row) - yield table - - -if __name__ == "__main__": # pragma: no cover - import os - - console = Console() - - files = [f"{i} {s}" for i, s in enumerate(sorted(os.listdir()))] - columns = Columns(files, padding=(0, 1), expand=False, equal=False) - console.print(columns) - console.rule() - columns.column_first = True - console.print(columns) - columns.right_to_left = True - console.rule() - console.print(columns) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/console.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/console.py deleted file mode 100644 index e559cbb..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/console.py +++ /dev/null @@ -1,2633 +0,0 @@ -import inspect -import os -import platform -import sys -import threading -import zlib -from abc import ABC, abstractmethod -from dataclasses import dataclass, field -from datetime import datetime -from functools import wraps -from getpass import getpass -from html import escape -from inspect import isclass -from itertools import islice -from math import ceil -from time import monotonic -from types import FrameType, ModuleType, TracebackType -from typing import ( - IO, - TYPE_CHECKING, - Any, - Callable, - Dict, - Iterable, - List, - Mapping, - NamedTuple, - Optional, - TextIO, - Tuple, - Type, - Union, - cast, -) - -from pip._vendor.rich._null_file import NULL_FILE - -if sys.version_info >= (3, 8): - from typing import Literal, Protocol, runtime_checkable -else: - from pip._vendor.typing_extensions import ( - Literal, - Protocol, - runtime_checkable, - ) # pragma: no cover - -from . import errors, themes -from ._emoji_replace import _emoji_replace -from ._export_format import CONSOLE_HTML_FORMAT, CONSOLE_SVG_FORMAT -from ._fileno import get_fileno -from ._log_render import FormatTimeCallable, LogRender -from .align import Align, AlignMethod -from .color import ColorSystem, blend_rgb -from .control import Control -from .emoji import EmojiVariant -from .highlighter import NullHighlighter, ReprHighlighter -from .markup import render as render_markup -from .measure import Measurement, measure_renderables -from .pager import Pager, SystemPager -from .pretty import Pretty, is_expandable -from .protocol import rich_cast -from .region import Region -from .scope import render_scope -from .screen import Screen -from .segment import Segment -from .style import Style, StyleType -from .styled import Styled -from .terminal_theme import DEFAULT_TERMINAL_THEME, SVG_EXPORT_THEME, TerminalTheme -from .text import Text, TextType -from .theme import Theme, ThemeStack - -if TYPE_CHECKING: - from ._windows import WindowsConsoleFeatures - from .live import Live - from .status import Status - -JUPYTER_DEFAULT_COLUMNS = 115 -JUPYTER_DEFAULT_LINES = 100 -WINDOWS = platform.system() == "Windows" - -HighlighterType = Callable[[Union[str, "Text"]], "Text"] -JustifyMethod = Literal["default", "left", "center", "right", "full"] -OverflowMethod = Literal["fold", "crop", "ellipsis", "ignore"] - - -class NoChange: - pass - - -NO_CHANGE = NoChange() - -try: - _STDIN_FILENO = sys.__stdin__.fileno() -except Exception: - _STDIN_FILENO = 0 -try: - _STDOUT_FILENO = sys.__stdout__.fileno() -except Exception: - _STDOUT_FILENO = 1 -try: - _STDERR_FILENO = sys.__stderr__.fileno() -except Exception: - _STDERR_FILENO = 2 - -_STD_STREAMS = (_STDIN_FILENO, _STDOUT_FILENO, _STDERR_FILENO) -_STD_STREAMS_OUTPUT = (_STDOUT_FILENO, _STDERR_FILENO) - - -_TERM_COLORS = { - "kitty": ColorSystem.EIGHT_BIT, - "256color": ColorSystem.EIGHT_BIT, - "16color": ColorSystem.STANDARD, -} - - -class ConsoleDimensions(NamedTuple): - """Size of the terminal.""" - - width: int - """The width of the console in 'cells'.""" - height: int - """The height of the console in lines.""" - - -@dataclass -class ConsoleOptions: - """Options for __rich_console__ method.""" - - size: ConsoleDimensions - """Size of console.""" - legacy_windows: bool - """legacy_windows: flag for legacy windows.""" - min_width: int - """Minimum width of renderable.""" - max_width: int - """Maximum width of renderable.""" - is_terminal: bool - """True if the target is a terminal, otherwise False.""" - encoding: str - """Encoding of terminal.""" - max_height: int - """Height of container (starts as terminal)""" - justify: Optional[JustifyMethod] = None - """Justify value override for renderable.""" - overflow: Optional[OverflowMethod] = None - """Overflow value override for renderable.""" - no_wrap: Optional[bool] = False - """Disable wrapping for text.""" - highlight: Optional[bool] = None - """Highlight override for render_str.""" - markup: Optional[bool] = None - """Enable markup when rendering strings.""" - height: Optional[int] = None - - @property - def ascii_only(self) -> bool: - """Check if renderables should use ascii only.""" - return not self.encoding.startswith("utf") - - def copy(self) -> "ConsoleOptions": - """Return a copy of the options. - - Returns: - ConsoleOptions: a copy of self. - """ - options: ConsoleOptions = ConsoleOptions.__new__(ConsoleOptions) - options.__dict__ = self.__dict__.copy() - return options - - def update( - self, - *, - width: Union[int, NoChange] = NO_CHANGE, - min_width: Union[int, NoChange] = NO_CHANGE, - max_width: Union[int, NoChange] = NO_CHANGE, - justify: Union[Optional[JustifyMethod], NoChange] = NO_CHANGE, - overflow: Union[Optional[OverflowMethod], NoChange] = NO_CHANGE, - no_wrap: Union[Optional[bool], NoChange] = NO_CHANGE, - highlight: Union[Optional[bool], NoChange] = NO_CHANGE, - markup: Union[Optional[bool], NoChange] = NO_CHANGE, - height: Union[Optional[int], NoChange] = NO_CHANGE, - ) -> "ConsoleOptions": - """Update values, return a copy.""" - options = self.copy() - if not isinstance(width, NoChange): - options.min_width = options.max_width = max(0, width) - if not isinstance(min_width, NoChange): - options.min_width = min_width - if not isinstance(max_width, NoChange): - options.max_width = max_width - if not isinstance(justify, NoChange): - options.justify = justify - if not isinstance(overflow, NoChange): - options.overflow = overflow - if not isinstance(no_wrap, NoChange): - options.no_wrap = no_wrap - if not isinstance(highlight, NoChange): - options.highlight = highlight - if not isinstance(markup, NoChange): - options.markup = markup - if not isinstance(height, NoChange): - if height is not None: - options.max_height = height - options.height = None if height is None else max(0, height) - return options - - def update_width(self, width: int) -> "ConsoleOptions": - """Update just the width, return a copy. - - Args: - width (int): New width (sets both min_width and max_width) - - Returns: - ~ConsoleOptions: New console options instance. - """ - options = self.copy() - options.min_width = options.max_width = max(0, width) - return options - - def update_height(self, height: int) -> "ConsoleOptions": - """Update the height, and return a copy. - - Args: - height (int): New height - - Returns: - ~ConsoleOptions: New Console options instance. - """ - options = self.copy() - options.max_height = options.height = height - return options - - def reset_height(self) -> "ConsoleOptions": - """Return a copy of the options with height set to ``None``. - - Returns: - ~ConsoleOptions: New console options instance. - """ - options = self.copy() - options.height = None - return options - - def update_dimensions(self, width: int, height: int) -> "ConsoleOptions": - """Update the width and height, and return a copy. - - Args: - width (int): New width (sets both min_width and max_width). - height (int): New height. - - Returns: - ~ConsoleOptions: New console options instance. - """ - options = self.copy() - options.min_width = options.max_width = max(0, width) - options.height = options.max_height = height - return options - - -@runtime_checkable -class RichCast(Protocol): - """An object that may be 'cast' to a console renderable.""" - - def __rich__( - self, - ) -> Union["ConsoleRenderable", "RichCast", str]: # pragma: no cover - ... - - -@runtime_checkable -class ConsoleRenderable(Protocol): - """An object that supports the console protocol.""" - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": # pragma: no cover - ... - - -# A type that may be rendered by Console. -RenderableType = Union[ConsoleRenderable, RichCast, str] - -# The result of calling a __rich_console__ method. -RenderResult = Iterable[Union[RenderableType, Segment]] - -_null_highlighter = NullHighlighter() - - -class CaptureError(Exception): - """An error in the Capture context manager.""" - - -class NewLine: - """A renderable to generate new line(s)""" - - def __init__(self, count: int = 1) -> None: - self.count = count - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> Iterable[Segment]: - yield Segment("\n" * self.count) - - -class ScreenUpdate: - """Render a list of lines at a given offset.""" - - def __init__(self, lines: List[List[Segment]], x: int, y: int) -> None: - self._lines = lines - self.x = x - self.y = y - - def __rich_console__( - self, console: "Console", options: ConsoleOptions - ) -> RenderResult: - x = self.x - move_to = Control.move_to - for offset, line in enumerate(self._lines, self.y): - yield move_to(x, offset) - yield from line - - -class Capture: - """Context manager to capture the result of printing to the console. - See :meth:`~rich.console.Console.capture` for how to use. - - Args: - console (Console): A console instance to capture output. - """ - - def __init__(self, console: "Console") -> None: - self._console = console - self._result: Optional[str] = None - - def __enter__(self) -> "Capture": - self._console.begin_capture() - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - self._result = self._console.end_capture() - - def get(self) -> str: - """Get the result of the capture.""" - if self._result is None: - raise CaptureError( - "Capture result is not available until context manager exits." - ) - return self._result - - -class ThemeContext: - """A context manager to use a temporary theme. See :meth:`~rich.console.Console.use_theme` for usage.""" - - def __init__(self, console: "Console", theme: Theme, inherit: bool = True) -> None: - self.console = console - self.theme = theme - self.inherit = inherit - - def __enter__(self) -> "ThemeContext": - self.console.push_theme(self.theme) - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - self.console.pop_theme() - - -class PagerContext: - """A context manager that 'pages' content. See :meth:`~rich.console.Console.pager` for usage.""" - - def __init__( - self, - console: "Console", - pager: Optional[Pager] = None, - styles: bool = False, - links: bool = False, - ) -> None: - self._console = console - self.pager = SystemPager() if pager is None else pager - self.styles = styles - self.links = links - - def __enter__(self) -> "PagerContext": - self._console._enter_buffer() - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - if exc_type is None: - with self._console._lock: - buffer: List[Segment] = self._console._buffer[:] - del self._console._buffer[:] - segments: Iterable[Segment] = buffer - if not self.styles: - segments = Segment.strip_styles(segments) - elif not self.links: - segments = Segment.strip_links(segments) - content = self._console._render_buffer(segments) - self.pager.show(content) - self._console._exit_buffer() - - -class ScreenContext: - """A context manager that enables an alternative screen. See :meth:`~rich.console.Console.screen` for usage.""" - - def __init__( - self, console: "Console", hide_cursor: bool, style: StyleType = "" - ) -> None: - self.console = console - self.hide_cursor = hide_cursor - self.screen = Screen(style=style) - self._changed = False - - def update( - self, *renderables: RenderableType, style: Optional[StyleType] = None - ) -> None: - """Update the screen. - - Args: - renderable (RenderableType, optional): Optional renderable to replace current renderable, - or None for no change. Defaults to None. - style: (Style, optional): Replacement style, or None for no change. Defaults to None. - """ - if renderables: - self.screen.renderable = ( - Group(*renderables) if len(renderables) > 1 else renderables[0] - ) - if style is not None: - self.screen.style = style - self.console.print(self.screen, end="") - - def __enter__(self) -> "ScreenContext": - self._changed = self.console.set_alt_screen(True) - if self._changed and self.hide_cursor: - self.console.show_cursor(False) - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - if self._changed: - self.console.set_alt_screen(False) - if self.hide_cursor: - self.console.show_cursor(True) - - -class Group: - """Takes a group of renderables and returns a renderable object that renders the group. - - Args: - renderables (Iterable[RenderableType]): An iterable of renderable objects. - fit (bool, optional): Fit dimension of group to contents, or fill available space. Defaults to True. - """ - - def __init__(self, *renderables: "RenderableType", fit: bool = True) -> None: - self._renderables = renderables - self.fit = fit - self._render: Optional[List[RenderableType]] = None - - @property - def renderables(self) -> List["RenderableType"]: - if self._render is None: - self._render = list(self._renderables) - return self._render - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> "Measurement": - if self.fit: - return measure_renderables(console, options, self.renderables) - else: - return Measurement(options.max_width, options.max_width) - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> RenderResult: - yield from self.renderables - - -def group(fit: bool = True) -> Callable[..., Callable[..., Group]]: - """A decorator that turns an iterable of renderables in to a group. - - Args: - fit (bool, optional): Fit dimension of group to contents, or fill available space. Defaults to True. - """ - - def decorator( - method: Callable[..., Iterable[RenderableType]] - ) -> Callable[..., Group]: - """Convert a method that returns an iterable of renderables in to a Group.""" - - @wraps(method) - def _replace(*args: Any, **kwargs: Any) -> Group: - renderables = method(*args, **kwargs) - return Group(*renderables, fit=fit) - - return _replace - - return decorator - - -def _is_jupyter() -> bool: # pragma: no cover - """Check if we're running in a Jupyter notebook.""" - try: - get_ipython # type: ignore[name-defined] - except NameError: - return False - ipython = get_ipython() # type: ignore[name-defined] - shell = ipython.__class__.__name__ - if ( - "google.colab" in str(ipython.__class__) - or os.getenv("DATABRICKS_RUNTIME_VERSION") - or shell == "ZMQInteractiveShell" - ): - return True # Jupyter notebook or qtconsole - elif shell == "TerminalInteractiveShell": - return False # Terminal running IPython - else: - return False # Other type (?) - - -COLOR_SYSTEMS = { - "standard": ColorSystem.STANDARD, - "256": ColorSystem.EIGHT_BIT, - "truecolor": ColorSystem.TRUECOLOR, - "windows": ColorSystem.WINDOWS, -} - -_COLOR_SYSTEMS_NAMES = {system: name for name, system in COLOR_SYSTEMS.items()} - - -@dataclass -class ConsoleThreadLocals(threading.local): - """Thread local values for Console context.""" - - theme_stack: ThemeStack - buffer: List[Segment] = field(default_factory=list) - buffer_index: int = 0 - - -class RenderHook(ABC): - """Provides hooks in to the render process.""" - - @abstractmethod - def process_renderables( - self, renderables: List[ConsoleRenderable] - ) -> List[ConsoleRenderable]: - """Called with a list of objects to render. - - This method can return a new list of renderables, or modify and return the same list. - - Args: - renderables (List[ConsoleRenderable]): A number of renderable objects. - - Returns: - List[ConsoleRenderable]: A replacement list of renderables. - """ - - -_windows_console_features: Optional["WindowsConsoleFeatures"] = None - - -def get_windows_console_features() -> "WindowsConsoleFeatures": # pragma: no cover - global _windows_console_features - if _windows_console_features is not None: - return _windows_console_features - from ._windows import get_windows_console_features - - _windows_console_features = get_windows_console_features() - return _windows_console_features - - -def detect_legacy_windows() -> bool: - """Detect legacy Windows.""" - return WINDOWS and not get_windows_console_features().vt - - -class Console: - """A high level console interface. - - Args: - color_system (str, optional): The color system supported by your terminal, - either ``"standard"``, ``"256"`` or ``"truecolor"``. Leave as ``"auto"`` to autodetect. - force_terminal (Optional[bool], optional): Enable/disable terminal control codes, or None to auto-detect terminal. Defaults to None. - force_jupyter (Optional[bool], optional): Enable/disable Jupyter rendering, or None to auto-detect Jupyter. Defaults to None. - force_interactive (Optional[bool], optional): Enable/disable interactive mode, or None to auto detect. Defaults to None. - soft_wrap (Optional[bool], optional): Set soft wrap default on print method. Defaults to False. - theme (Theme, optional): An optional style theme object, or ``None`` for default theme. - stderr (bool, optional): Use stderr rather than stdout if ``file`` is not specified. Defaults to False. - file (IO, optional): A file object where the console should write to. Defaults to stdout. - quiet (bool, Optional): Boolean to suppress all output. Defaults to False. - width (int, optional): The width of the terminal. Leave as default to auto-detect width. - height (int, optional): The height of the terminal. Leave as default to auto-detect height. - style (StyleType, optional): Style to apply to all output, or None for no style. Defaults to None. - no_color (Optional[bool], optional): Enabled no color mode, or None to auto detect. Defaults to None. - tab_size (int, optional): Number of spaces used to replace a tab character. Defaults to 8. - record (bool, optional): Boolean to enable recording of terminal output, - required to call :meth:`export_html`, :meth:`export_svg`, and :meth:`export_text`. Defaults to False. - markup (bool, optional): Boolean to enable :ref:`console_markup`. Defaults to True. - emoji (bool, optional): Enable emoji code. Defaults to True. - emoji_variant (str, optional): Optional emoji variant, either "text" or "emoji". Defaults to None. - highlight (bool, optional): Enable automatic highlighting. Defaults to True. - log_time (bool, optional): Boolean to enable logging of time by :meth:`log` methods. Defaults to True. - log_path (bool, optional): Boolean to enable the logging of the caller by :meth:`log`. Defaults to True. - log_time_format (Union[str, TimeFormatterCallable], optional): If ``log_time`` is enabled, either string for strftime or callable that formats the time. Defaults to "[%X] ". - highlighter (HighlighterType, optional): Default highlighter. - legacy_windows (bool, optional): Enable legacy Windows mode, or ``None`` to auto detect. Defaults to ``None``. - safe_box (bool, optional): Restrict box options that don't render on legacy Windows. - get_datetime (Callable[[], datetime], optional): Callable that gets the current time as a datetime.datetime object (used by Console.log), - or None for datetime.now. - get_time (Callable[[], time], optional): Callable that gets the current time in seconds, default uses time.monotonic. - """ - - _environ: Mapping[str, str] = os.environ - - def __init__( - self, - *, - color_system: Optional[ - Literal["auto", "standard", "256", "truecolor", "windows"] - ] = "auto", - force_terminal: Optional[bool] = None, - force_jupyter: Optional[bool] = None, - force_interactive: Optional[bool] = None, - soft_wrap: bool = False, - theme: Optional[Theme] = None, - stderr: bool = False, - file: Optional[IO[str]] = None, - quiet: bool = False, - width: Optional[int] = None, - height: Optional[int] = None, - style: Optional[StyleType] = None, - no_color: Optional[bool] = None, - tab_size: int = 8, - record: bool = False, - markup: bool = True, - emoji: bool = True, - emoji_variant: Optional[EmojiVariant] = None, - highlight: bool = True, - log_time: bool = True, - log_path: bool = True, - log_time_format: Union[str, FormatTimeCallable] = "[%X]", - highlighter: Optional["HighlighterType"] = ReprHighlighter(), - legacy_windows: Optional[bool] = None, - safe_box: bool = True, - get_datetime: Optional[Callable[[], datetime]] = None, - get_time: Optional[Callable[[], float]] = None, - _environ: Optional[Mapping[str, str]] = None, - ): - # Copy of os.environ allows us to replace it for testing - if _environ is not None: - self._environ = _environ - - self.is_jupyter = _is_jupyter() if force_jupyter is None else force_jupyter - if self.is_jupyter: - if width is None: - jupyter_columns = self._environ.get("JUPYTER_COLUMNS") - if jupyter_columns is not None and jupyter_columns.isdigit(): - width = int(jupyter_columns) - else: - width = JUPYTER_DEFAULT_COLUMNS - if height is None: - jupyter_lines = self._environ.get("JUPYTER_LINES") - if jupyter_lines is not None and jupyter_lines.isdigit(): - height = int(jupyter_lines) - else: - height = JUPYTER_DEFAULT_LINES - - self.tab_size = tab_size - self.record = record - self._markup = markup - self._emoji = emoji - self._emoji_variant: Optional[EmojiVariant] = emoji_variant - self._highlight = highlight - self.legacy_windows: bool = ( - (detect_legacy_windows() and not self.is_jupyter) - if legacy_windows is None - else legacy_windows - ) - - if width is None: - columns = self._environ.get("COLUMNS") - if columns is not None and columns.isdigit(): - width = int(columns) - self.legacy_windows - if height is None: - lines = self._environ.get("LINES") - if lines is not None and lines.isdigit(): - height = int(lines) - - self.soft_wrap = soft_wrap - self._width = width - self._height = height - - self._color_system: Optional[ColorSystem] - - self._force_terminal = None - if force_terminal is not None: - self._force_terminal = force_terminal - - self._file = file - self.quiet = quiet - self.stderr = stderr - - if color_system is None: - self._color_system = None - elif color_system == "auto": - self._color_system = self._detect_color_system() - else: - self._color_system = COLOR_SYSTEMS[color_system] - - self._lock = threading.RLock() - self._log_render = LogRender( - show_time=log_time, - show_path=log_path, - time_format=log_time_format, - ) - self.highlighter: HighlighterType = highlighter or _null_highlighter - self.safe_box = safe_box - self.get_datetime = get_datetime or datetime.now - self.get_time = get_time or monotonic - self.style = style - self.no_color = ( - no_color if no_color is not None else "NO_COLOR" in self._environ - ) - self.is_interactive = ( - (self.is_terminal and not self.is_dumb_terminal) - if force_interactive is None - else force_interactive - ) - - self._record_buffer_lock = threading.RLock() - self._thread_locals = ConsoleThreadLocals( - theme_stack=ThemeStack(themes.DEFAULT if theme is None else theme) - ) - self._record_buffer: List[Segment] = [] - self._render_hooks: List[RenderHook] = [] - self._live: Optional["Live"] = None - self._is_alt_screen = False - - def __repr__(self) -> str: - return f"<console width={self.width} {self._color_system!s}>" - - @property - def file(self) -> IO[str]: - """Get the file object to write to.""" - file = self._file or (sys.stderr if self.stderr else sys.stdout) - file = getattr(file, "rich_proxied_file", file) - if file is None: - file = NULL_FILE - return file - - @file.setter - def file(self, new_file: IO[str]) -> None: - """Set a new file object.""" - self._file = new_file - - @property - def _buffer(self) -> List[Segment]: - """Get a thread local buffer.""" - return self._thread_locals.buffer - - @property - def _buffer_index(self) -> int: - """Get a thread local buffer.""" - return self._thread_locals.buffer_index - - @_buffer_index.setter - def _buffer_index(self, value: int) -> None: - self._thread_locals.buffer_index = value - - @property - def _theme_stack(self) -> ThemeStack: - """Get the thread local theme stack.""" - return self._thread_locals.theme_stack - - def _detect_color_system(self) -> Optional[ColorSystem]: - """Detect color system from env vars.""" - if self.is_jupyter: - return ColorSystem.TRUECOLOR - if not self.is_terminal or self.is_dumb_terminal: - return None - if WINDOWS: # pragma: no cover - if self.legacy_windows: # pragma: no cover - return ColorSystem.WINDOWS - windows_console_features = get_windows_console_features() - return ( - ColorSystem.TRUECOLOR - if windows_console_features.truecolor - else ColorSystem.EIGHT_BIT - ) - else: - color_term = self._environ.get("COLORTERM", "").strip().lower() - if color_term in ("truecolor", "24bit"): - return ColorSystem.TRUECOLOR - term = self._environ.get("TERM", "").strip().lower() - _term_name, _hyphen, colors = term.rpartition("-") - color_system = _TERM_COLORS.get(colors, ColorSystem.STANDARD) - return color_system - - def _enter_buffer(self) -> None: - """Enter in to a buffer context, and buffer all output.""" - self._buffer_index += 1 - - def _exit_buffer(self) -> None: - """Leave buffer context, and render content if required.""" - self._buffer_index -= 1 - self._check_buffer() - - def set_live(self, live: "Live") -> None: - """Set Live instance. Used by Live context manager. - - Args: - live (Live): Live instance using this Console. - - Raises: - errors.LiveError: If this Console has a Live context currently active. - """ - with self._lock: - if self._live is not None: - raise errors.LiveError("Only one live display may be active at once") - self._live = live - - def clear_live(self) -> None: - """Clear the Live instance.""" - with self._lock: - self._live = None - - def push_render_hook(self, hook: RenderHook) -> None: - """Add a new render hook to the stack. - - Args: - hook (RenderHook): Render hook instance. - """ - with self._lock: - self._render_hooks.append(hook) - - def pop_render_hook(self) -> None: - """Pop the last renderhook from the stack.""" - with self._lock: - self._render_hooks.pop() - - def __enter__(self) -> "Console": - """Own context manager to enter buffer context.""" - self._enter_buffer() - return self - - def __exit__(self, exc_type: Any, exc_value: Any, traceback: Any) -> None: - """Exit buffer context.""" - self._exit_buffer() - - def begin_capture(self) -> None: - """Begin capturing console output. Call :meth:`end_capture` to exit capture mode and return output.""" - self._enter_buffer() - - def end_capture(self) -> str: - """End capture mode and return captured string. - - Returns: - str: Console output. - """ - render_result = self._render_buffer(self._buffer) - del self._buffer[:] - self._exit_buffer() - return render_result - - def push_theme(self, theme: Theme, *, inherit: bool = True) -> None: - """Push a new theme on to the top of the stack, replacing the styles from the previous theme. - Generally speaking, you should call :meth:`~rich.console.Console.use_theme` to get a context manager, rather - than calling this method directly. - - Args: - theme (Theme): A theme instance. - inherit (bool, optional): Inherit existing styles. Defaults to True. - """ - self._theme_stack.push_theme(theme, inherit=inherit) - - def pop_theme(self) -> None: - """Remove theme from top of stack, restoring previous theme.""" - self._theme_stack.pop_theme() - - def use_theme(self, theme: Theme, *, inherit: bool = True) -> ThemeContext: - """Use a different theme for the duration of the context manager. - - Args: - theme (Theme): Theme instance to user. - inherit (bool, optional): Inherit existing console styles. Defaults to True. - - Returns: - ThemeContext: [description] - """ - return ThemeContext(self, theme, inherit) - - @property - def color_system(self) -> Optional[str]: - """Get color system string. - - Returns: - Optional[str]: "standard", "256" or "truecolor". - """ - - if self._color_system is not None: - return _COLOR_SYSTEMS_NAMES[self._color_system] - else: - return None - - @property - def encoding(self) -> str: - """Get the encoding of the console file, e.g. ``"utf-8"``. - - Returns: - str: A standard encoding string. - """ - return (getattr(self.file, "encoding", "utf-8") or "utf-8").lower() - - @property - def is_terminal(self) -> bool: - """Check if the console is writing to a terminal. - - Returns: - bool: True if the console writing to a device capable of - understanding terminal codes, otherwise False. - """ - if self._force_terminal is not None: - return self._force_terminal - - if hasattr(sys.stdin, "__module__") and sys.stdin.__module__.startswith( - "idlelib" - ): - # Return False for Idle which claims to be a tty but can't handle ansi codes - return False - - if self.is_jupyter: - # return False for Jupyter, which may have FORCE_COLOR set - return False - - # If FORCE_COLOR env var has any value at all, we assume a terminal. - force_color = self._environ.get("FORCE_COLOR") - if force_color is not None: - self._force_terminal = True - return True - - isatty: Optional[Callable[[], bool]] = getattr(self.file, "isatty", None) - try: - return False if isatty is None else isatty() - except ValueError: - # in some situation (at the end of a pytest run for example) isatty() can raise - # ValueError: I/O operation on closed file - # return False because we aren't in a terminal anymore - return False - - @property - def is_dumb_terminal(self) -> bool: - """Detect dumb terminal. - - Returns: - bool: True if writing to a dumb terminal, otherwise False. - - """ - _term = self._environ.get("TERM", "") - is_dumb = _term.lower() in ("dumb", "unknown") - return self.is_terminal and is_dumb - - @property - def options(self) -> ConsoleOptions: - """Get default console options.""" - return ConsoleOptions( - max_height=self.size.height, - size=self.size, - legacy_windows=self.legacy_windows, - min_width=1, - max_width=self.width, - encoding=self.encoding, - is_terminal=self.is_terminal, - ) - - @property - def size(self) -> ConsoleDimensions: - """Get the size of the console. - - Returns: - ConsoleDimensions: A named tuple containing the dimensions. - """ - - if self._width is not None and self._height is not None: - return ConsoleDimensions(self._width - self.legacy_windows, self._height) - - if self.is_dumb_terminal: - return ConsoleDimensions(80, 25) - - width: Optional[int] = None - height: Optional[int] = None - - if WINDOWS: # pragma: no cover - try: - width, height = os.get_terminal_size() - except (AttributeError, ValueError, OSError): # Probably not a terminal - pass - else: - for file_descriptor in _STD_STREAMS: - try: - width, height = os.get_terminal_size(file_descriptor) - except (AttributeError, ValueError, OSError): - pass - else: - break - - columns = self._environ.get("COLUMNS") - if columns is not None and columns.isdigit(): - width = int(columns) - lines = self._environ.get("LINES") - if lines is not None and lines.isdigit(): - height = int(lines) - - # get_terminal_size can report 0, 0 if run from pseudo-terminal - width = width or 80 - height = height or 25 - return ConsoleDimensions( - width - self.legacy_windows if self._width is None else self._width, - height if self._height is None else self._height, - ) - - @size.setter - def size(self, new_size: Tuple[int, int]) -> None: - """Set a new size for the terminal. - - Args: - new_size (Tuple[int, int]): New width and height. - """ - width, height = new_size - self._width = width - self._height = height - - @property - def width(self) -> int: - """Get the width of the console. - - Returns: - int: The width (in characters) of the console. - """ - return self.size.width - - @width.setter - def width(self, width: int) -> None: - """Set width. - - Args: - width (int): New width. - """ - self._width = width - - @property - def height(self) -> int: - """Get the height of the console. - - Returns: - int: The height (in lines) of the console. - """ - return self.size.height - - @height.setter - def height(self, height: int) -> None: - """Set height. - - Args: - height (int): new height. - """ - self._height = height - - def bell(self) -> None: - """Play a 'bell' sound (if supported by the terminal).""" - self.control(Control.bell()) - - def capture(self) -> Capture: - """A context manager to *capture* the result of print() or log() in a string, - rather than writing it to the console. - - Example: - >>> from rich.console import Console - >>> console = Console() - >>> with console.capture() as capture: - ... console.print("[bold magenta]Hello World[/]") - >>> print(capture.get()) - - Returns: - Capture: Context manager with disables writing to the terminal. - """ - capture = Capture(self) - return capture - - def pager( - self, pager: Optional[Pager] = None, styles: bool = False, links: bool = False - ) -> PagerContext: - """A context manager to display anything printed within a "pager". The pager application - is defined by the system and will typically support at least pressing a key to scroll. - - Args: - pager (Pager, optional): A pager object, or None to use :class:`~rich.pager.SystemPager`. Defaults to None. - styles (bool, optional): Show styles in pager. Defaults to False. - links (bool, optional): Show links in pager. Defaults to False. - - Example: - >>> from rich.console import Console - >>> from rich.__main__ import make_test_card - >>> console = Console() - >>> with console.pager(): - console.print(make_test_card()) - - Returns: - PagerContext: A context manager. - """ - return PagerContext(self, pager=pager, styles=styles, links=links) - - def line(self, count: int = 1) -> None: - """Write new line(s). - - Args: - count (int, optional): Number of new lines. Defaults to 1. - """ - - assert count >= 0, "count must be >= 0" - self.print(NewLine(count)) - - def clear(self, home: bool = True) -> None: - """Clear the screen. - - Args: - home (bool, optional): Also move the cursor to 'home' position. Defaults to True. - """ - if home: - self.control(Control.clear(), Control.home()) - else: - self.control(Control.clear()) - - def status( - self, - status: RenderableType, - *, - spinner: str = "dots", - spinner_style: StyleType = "status.spinner", - speed: float = 1.0, - refresh_per_second: float = 12.5, - ) -> "Status": - """Display a status and spinner. - - Args: - status (RenderableType): A status renderable (str or Text typically). - spinner (str, optional): Name of spinner animation (see python -m rich.spinner). Defaults to "dots". - spinner_style (StyleType, optional): Style of spinner. Defaults to "status.spinner". - speed (float, optional): Speed factor for spinner animation. Defaults to 1.0. - refresh_per_second (float, optional): Number of refreshes per second. Defaults to 12.5. - - Returns: - Status: A Status object that may be used as a context manager. - """ - from .status import Status - - status_renderable = Status( - status, - console=self, - spinner=spinner, - spinner_style=spinner_style, - speed=speed, - refresh_per_second=refresh_per_second, - ) - return status_renderable - - def show_cursor(self, show: bool = True) -> bool: - """Show or hide the cursor. - - Args: - show (bool, optional): Set visibility of the cursor. - """ - if self.is_terminal: - self.control(Control.show_cursor(show)) - return True - return False - - def set_alt_screen(self, enable: bool = True) -> bool: - """Enables alternative screen mode. - - Note, if you enable this mode, you should ensure that is disabled before - the application exits. See :meth:`~rich.Console.screen` for a context manager - that handles this for you. - - Args: - enable (bool, optional): Enable (True) or disable (False) alternate screen. Defaults to True. - - Returns: - bool: True if the control codes were written. - - """ - changed = False - if self.is_terminal and not self.legacy_windows: - self.control(Control.alt_screen(enable)) - changed = True - self._is_alt_screen = enable - return changed - - @property - def is_alt_screen(self) -> bool: - """Check if the alt screen was enabled. - - Returns: - bool: True if the alt screen was enabled, otherwise False. - """ - return self._is_alt_screen - - def set_window_title(self, title: str) -> bool: - """Set the title of the console terminal window. - - Warning: There is no means within Rich of "resetting" the window title to its - previous value, meaning the title you set will persist even after your application - exits. - - ``fish`` shell resets the window title before and after each command by default, - negating this issue. Windows Terminal and command prompt will also reset the title for you. - Most other shells and terminals, however, do not do this. - - Some terminals may require configuration changes before you can set the title. - Some terminals may not support setting the title at all. - - Other software (including the terminal itself, the shell, custom prompts, plugins, etc.) - may also set the terminal window title. This could result in whatever value you write - using this method being overwritten. - - Args: - title (str): The new title of the terminal window. - - Returns: - bool: True if the control code to change the terminal title was - written, otherwise False. Note that a return value of True - does not guarantee that the window title has actually changed, - since the feature may be unsupported/disabled in some terminals. - """ - if self.is_terminal: - self.control(Control.title(title)) - return True - return False - - def screen( - self, hide_cursor: bool = True, style: Optional[StyleType] = None - ) -> "ScreenContext": - """Context manager to enable and disable 'alternative screen' mode. - - Args: - hide_cursor (bool, optional): Also hide the cursor. Defaults to False. - style (Style, optional): Optional style for screen. Defaults to None. - - Returns: - ~ScreenContext: Context which enables alternate screen on enter, and disables it on exit. - """ - return ScreenContext(self, hide_cursor=hide_cursor, style=style or "") - - def measure( - self, renderable: RenderableType, *, options: Optional[ConsoleOptions] = None - ) -> Measurement: - """Measure a renderable. Returns a :class:`~rich.measure.Measurement` object which contains - information regarding the number of characters required to print the renderable. - - Args: - renderable (RenderableType): Any renderable or string. - options (Optional[ConsoleOptions], optional): Options to use when measuring, or None - to use default options. Defaults to None. - - Returns: - Measurement: A measurement of the renderable. - """ - measurement = Measurement.get(self, options or self.options, renderable) - return measurement - - def render( - self, renderable: RenderableType, options: Optional[ConsoleOptions] = None - ) -> Iterable[Segment]: - """Render an object in to an iterable of `Segment` instances. - - This method contains the logic for rendering objects with the console protocol. - You are unlikely to need to use it directly, unless you are extending the library. - - Args: - renderable (RenderableType): An object supporting the console protocol, or - an object that may be converted to a string. - options (ConsoleOptions, optional): An options object, or None to use self.options. Defaults to None. - - Returns: - Iterable[Segment]: An iterable of segments that may be rendered. - """ - - _options = options or self.options - if _options.max_width < 1: - # No space to render anything. This prevents potential recursion errors. - return - render_iterable: RenderResult - - renderable = rich_cast(renderable) - if hasattr(renderable, "__rich_console__") and not isclass(renderable): - render_iterable = renderable.__rich_console__(self, _options) # type: ignore[union-attr] - elif isinstance(renderable, str): - text_renderable = self.render_str( - renderable, highlight=_options.highlight, markup=_options.markup - ) - render_iterable = text_renderable.__rich_console__(self, _options) - else: - raise errors.NotRenderableError( - f"Unable to render {renderable!r}; " - "A str, Segment or object with __rich_console__ method is required" - ) - - try: - iter_render = iter(render_iterable) - except TypeError: - raise errors.NotRenderableError( - f"object {render_iterable!r} is not renderable" - ) - _Segment = Segment - _options = _options.reset_height() - for render_output in iter_render: - if isinstance(render_output, _Segment): - yield render_output - else: - yield from self.render(render_output, _options) - - def render_lines( - self, - renderable: RenderableType, - options: Optional[ConsoleOptions] = None, - *, - style: Optional[Style] = None, - pad: bool = True, - new_lines: bool = False, - ) -> List[List[Segment]]: - """Render objects in to a list of lines. - - The output of render_lines is useful when further formatting of rendered console text - is required, such as the Panel class which draws a border around any renderable object. - - Args: - renderable (RenderableType): Any object renderable in the console. - options (Optional[ConsoleOptions], optional): Console options, or None to use self.options. Default to ``None``. - style (Style, optional): Optional style to apply to renderables. Defaults to ``None``. - pad (bool, optional): Pad lines shorter than render width. Defaults to ``True``. - new_lines (bool, optional): Include "\n" characters at end of lines. - - Returns: - List[List[Segment]]: A list of lines, where a line is a list of Segment objects. - """ - with self._lock: - render_options = options or self.options - _rendered = self.render(renderable, render_options) - if style: - _rendered = Segment.apply_style(_rendered, style) - - render_height = render_options.height - if render_height is not None: - render_height = max(0, render_height) - - lines = list( - islice( - Segment.split_and_crop_lines( - _rendered, - render_options.max_width, - include_new_lines=new_lines, - pad=pad, - style=style, - ), - None, - render_height, - ) - ) - if render_options.height is not None: - extra_lines = render_options.height - len(lines) - if extra_lines > 0: - pad_line = [ - [Segment(" " * render_options.max_width, style), Segment("\n")] - if new_lines - else [Segment(" " * render_options.max_width, style)] - ] - lines.extend(pad_line * extra_lines) - - return lines - - def render_str( - self, - text: str, - *, - style: Union[str, Style] = "", - justify: Optional[JustifyMethod] = None, - overflow: Optional[OverflowMethod] = None, - emoji: Optional[bool] = None, - markup: Optional[bool] = None, - highlight: Optional[bool] = None, - highlighter: Optional[HighlighterType] = None, - ) -> "Text": - """Convert a string to a Text instance. This is called automatically if - you print or log a string. - - Args: - text (str): Text to render. - style (Union[str, Style], optional): Style to apply to rendered text. - justify (str, optional): Justify method: "default", "left", "center", "full", or "right". Defaults to ``None``. - overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to ``None``. - emoji (Optional[bool], optional): Enable emoji, or ``None`` to use Console default. - markup (Optional[bool], optional): Enable markup, or ``None`` to use Console default. - highlight (Optional[bool], optional): Enable highlighting, or ``None`` to use Console default. - highlighter (HighlighterType, optional): Optional highlighter to apply. - Returns: - ConsoleRenderable: Renderable object. - - """ - emoji_enabled = emoji or (emoji is None and self._emoji) - markup_enabled = markup or (markup is None and self._markup) - highlight_enabled = highlight or (highlight is None and self._highlight) - - if markup_enabled: - rich_text = render_markup( - text, - style=style, - emoji=emoji_enabled, - emoji_variant=self._emoji_variant, - ) - rich_text.justify = justify - rich_text.overflow = overflow - else: - rich_text = Text( - _emoji_replace(text, default_variant=self._emoji_variant) - if emoji_enabled - else text, - justify=justify, - overflow=overflow, - style=style, - ) - - _highlighter = (highlighter or self.highlighter) if highlight_enabled else None - if _highlighter is not None: - highlight_text = _highlighter(str(rich_text)) - highlight_text.copy_styles(rich_text) - return highlight_text - - return rich_text - - def get_style( - self, name: Union[str, Style], *, default: Optional[Union[Style, str]] = None - ) -> Style: - """Get a Style instance by its theme name or parse a definition. - - Args: - name (str): The name of a style or a style definition. - - Returns: - Style: A Style object. - - Raises: - MissingStyle: If no style could be parsed from name. - - """ - if isinstance(name, Style): - return name - - try: - style = self._theme_stack.get(name) - if style is None: - style = Style.parse(name) - return style.copy() if style.link else style - except errors.StyleSyntaxError as error: - if default is not None: - return self.get_style(default) - raise errors.MissingStyle( - f"Failed to get style {name!r}; {error}" - ) from None - - def _collect_renderables( - self, - objects: Iterable[Any], - sep: str, - end: str, - *, - justify: Optional[JustifyMethod] = None, - emoji: Optional[bool] = None, - markup: Optional[bool] = None, - highlight: Optional[bool] = None, - ) -> List[ConsoleRenderable]: - """Combine a number of renderables and text into one renderable. - - Args: - objects (Iterable[Any]): Anything that Rich can render. - sep (str): String to write between print data. - end (str): String to write at end of print data. - justify (str, optional): One of "left", "right", "center", or "full". Defaults to ``None``. - emoji (Optional[bool], optional): Enable emoji code, or ``None`` to use console default. - markup (Optional[bool], optional): Enable markup, or ``None`` to use console default. - highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use console default. - - Returns: - List[ConsoleRenderable]: A list of things to render. - """ - renderables: List[ConsoleRenderable] = [] - _append = renderables.append - text: List[Text] = [] - append_text = text.append - - append = _append - if justify in ("left", "center", "right"): - - def align_append(renderable: RenderableType) -> None: - _append(Align(renderable, cast(AlignMethod, justify))) - - append = align_append - - _highlighter: HighlighterType = _null_highlighter - if highlight or (highlight is None and self._highlight): - _highlighter = self.highlighter - - def check_text() -> None: - if text: - sep_text = Text(sep, justify=justify, end=end) - append(sep_text.join(text)) - text.clear() - - for renderable in objects: - renderable = rich_cast(renderable) - if isinstance(renderable, str): - append_text( - self.render_str( - renderable, emoji=emoji, markup=markup, highlighter=_highlighter - ) - ) - elif isinstance(renderable, Text): - append_text(renderable) - elif isinstance(renderable, ConsoleRenderable): - check_text() - append(renderable) - elif is_expandable(renderable): - check_text() - append(Pretty(renderable, highlighter=_highlighter)) - else: - append_text(_highlighter(str(renderable))) - - check_text() - - if self.style is not None: - style = self.get_style(self.style) - renderables = [Styled(renderable, style) for renderable in renderables] - - return renderables - - def rule( - self, - title: TextType = "", - *, - characters: str = "─", - style: Union[str, Style] = "rule.line", - align: AlignMethod = "center", - ) -> None: - """Draw a line with optional centered title. - - Args: - title (str, optional): Text to render over the rule. Defaults to "". - characters (str, optional): Character(s) to form the line. Defaults to "─". - style (str, optional): Style of line. Defaults to "rule.line". - align (str, optional): How to align the title, one of "left", "center", or "right". Defaults to "center". - """ - from .rule import Rule - - rule = Rule(title=title, characters=characters, style=style, align=align) - self.print(rule) - - def control(self, *control: Control) -> None: - """Insert non-printing control codes. - - Args: - control_codes (str): Control codes, such as those that may move the cursor. - """ - if not self.is_dumb_terminal: - with self: - self._buffer.extend(_control.segment for _control in control) - - def out( - self, - *objects: Any, - sep: str = " ", - end: str = "\n", - style: Optional[Union[str, Style]] = None, - highlight: Optional[bool] = None, - ) -> None: - """Output to the terminal. This is a low-level way of writing to the terminal which unlike - :meth:`~rich.console.Console.print` won't pretty print, wrap text, or apply markup, but will - optionally apply highlighting and a basic style. - - Args: - sep (str, optional): String to write between print data. Defaults to " ". - end (str, optional): String to write at end of print data. Defaults to "\\\\n". - style (Union[str, Style], optional): A style to apply to output. Defaults to None. - highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use - console default. Defaults to ``None``. - """ - raw_output: str = sep.join(str(_object) for _object in objects) - self.print( - raw_output, - style=style, - highlight=highlight, - emoji=False, - markup=False, - no_wrap=True, - overflow="ignore", - crop=False, - end=end, - ) - - def print( - self, - *objects: Any, - sep: str = " ", - end: str = "\n", - style: Optional[Union[str, Style]] = None, - justify: Optional[JustifyMethod] = None, - overflow: Optional[OverflowMethod] = None, - no_wrap: Optional[bool] = None, - emoji: Optional[bool] = None, - markup: Optional[bool] = None, - highlight: Optional[bool] = None, - width: Optional[int] = None, - height: Optional[int] = None, - crop: bool = True, - soft_wrap: Optional[bool] = None, - new_line_start: bool = False, - ) -> None: - """Print to the console. - - Args: - objects (positional args): Objects to log to the terminal. - sep (str, optional): String to write between print data. Defaults to " ". - end (str, optional): String to write at end of print data. Defaults to "\\\\n". - style (Union[str, Style], optional): A style to apply to output. Defaults to None. - justify (str, optional): Justify method: "default", "left", "right", "center", or "full". Defaults to ``None``. - overflow (str, optional): Overflow method: "ignore", "crop", "fold", or "ellipsis". Defaults to None. - no_wrap (Optional[bool], optional): Disable word wrapping. Defaults to None. - emoji (Optional[bool], optional): Enable emoji code, or ``None`` to use console default. Defaults to ``None``. - markup (Optional[bool], optional): Enable markup, or ``None`` to use console default. Defaults to ``None``. - highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use console default. Defaults to ``None``. - width (Optional[int], optional): Width of output, or ``None`` to auto-detect. Defaults to ``None``. - crop (Optional[bool], optional): Crop output to width of terminal. Defaults to True. - soft_wrap (bool, optional): Enable soft wrap mode which disables word wrapping and cropping of text or ``None`` for - Console default. Defaults to ``None``. - new_line_start (bool, False): Insert a new line at the start if the output contains more than one line. Defaults to ``False``. - """ - if not objects: - objects = (NewLine(),) - - if soft_wrap is None: - soft_wrap = self.soft_wrap - if soft_wrap: - if no_wrap is None: - no_wrap = True - if overflow is None: - overflow = "ignore" - crop = False - render_hooks = self._render_hooks[:] - with self: - renderables = self._collect_renderables( - objects, - sep, - end, - justify=justify, - emoji=emoji, - markup=markup, - highlight=highlight, - ) - for hook in render_hooks: - renderables = hook.process_renderables(renderables) - render_options = self.options.update( - justify=justify, - overflow=overflow, - width=min(width, self.width) if width is not None else NO_CHANGE, - height=height, - no_wrap=no_wrap, - markup=markup, - highlight=highlight, - ) - - new_segments: List[Segment] = [] - extend = new_segments.extend - render = self.render - if style is None: - for renderable in renderables: - extend(render(renderable, render_options)) - else: - for renderable in renderables: - extend( - Segment.apply_style( - render(renderable, render_options), self.get_style(style) - ) - ) - if new_line_start: - if ( - len("".join(segment.text for segment in new_segments).splitlines()) - > 1 - ): - new_segments.insert(0, Segment.line()) - if crop: - buffer_extend = self._buffer.extend - for line in Segment.split_and_crop_lines( - new_segments, self.width, pad=False - ): - buffer_extend(line) - else: - self._buffer.extend(new_segments) - - def print_json( - self, - json: Optional[str] = None, - *, - data: Any = None, - indent: Union[None, int, str] = 2, - highlight: bool = True, - skip_keys: bool = False, - ensure_ascii: bool = False, - check_circular: bool = True, - allow_nan: bool = True, - default: Optional[Callable[[Any], Any]] = None, - sort_keys: bool = False, - ) -> None: - """Pretty prints JSON. Output will be valid JSON. - - Args: - json (Optional[str]): A string containing JSON. - data (Any): If json is not supplied, then encode this data. - indent (Union[None, int, str], optional): Number of spaces to indent. Defaults to 2. - highlight (bool, optional): Enable highlighting of output: Defaults to True. - skip_keys (bool, optional): Skip keys not of a basic type. Defaults to False. - ensure_ascii (bool, optional): Escape all non-ascii characters. Defaults to False. - check_circular (bool, optional): Check for circular references. Defaults to True. - allow_nan (bool, optional): Allow NaN and Infinity values. Defaults to True. - default (Callable, optional): A callable that converts values that can not be encoded - in to something that can be JSON encoded. Defaults to None. - sort_keys (bool, optional): Sort dictionary keys. Defaults to False. - """ - from pip._vendor.rich.json import JSON - - if json is None: - json_renderable = JSON.from_data( - data, - indent=indent, - highlight=highlight, - skip_keys=skip_keys, - ensure_ascii=ensure_ascii, - check_circular=check_circular, - allow_nan=allow_nan, - default=default, - sort_keys=sort_keys, - ) - else: - if not isinstance(json, str): - raise TypeError( - f"json must be str. Did you mean print_json(data={json!r}) ?" - ) - json_renderable = JSON( - json, - indent=indent, - highlight=highlight, - skip_keys=skip_keys, - ensure_ascii=ensure_ascii, - check_circular=check_circular, - allow_nan=allow_nan, - default=default, - sort_keys=sort_keys, - ) - self.print(json_renderable, soft_wrap=True) - - def update_screen( - self, - renderable: RenderableType, - *, - region: Optional[Region] = None, - options: Optional[ConsoleOptions] = None, - ) -> None: - """Update the screen at a given offset. - - Args: - renderable (RenderableType): A Rich renderable. - region (Region, optional): Region of screen to update, or None for entire screen. Defaults to None. - x (int, optional): x offset. Defaults to 0. - y (int, optional): y offset. Defaults to 0. - - Raises: - errors.NoAltScreen: If the Console isn't in alt screen mode. - - """ - if not self.is_alt_screen: - raise errors.NoAltScreen("Alt screen must be enabled to call update_screen") - render_options = options or self.options - if region is None: - x = y = 0 - render_options = render_options.update_dimensions( - render_options.max_width, render_options.height or self.height - ) - else: - x, y, width, height = region - render_options = render_options.update_dimensions(width, height) - - lines = self.render_lines(renderable, options=render_options) - self.update_screen_lines(lines, x, y) - - def update_screen_lines( - self, lines: List[List[Segment]], x: int = 0, y: int = 0 - ) -> None: - """Update lines of the screen at a given offset. - - Args: - lines (List[List[Segment]]): Rendered lines (as produced by :meth:`~rich.Console.render_lines`). - x (int, optional): x offset (column no). Defaults to 0. - y (int, optional): y offset (column no). Defaults to 0. - - Raises: - errors.NoAltScreen: If the Console isn't in alt screen mode. - """ - if not self.is_alt_screen: - raise errors.NoAltScreen("Alt screen must be enabled to call update_screen") - screen_update = ScreenUpdate(lines, x, y) - segments = self.render(screen_update) - self._buffer.extend(segments) - self._check_buffer() - - def print_exception( - self, - *, - width: Optional[int] = 100, - extra_lines: int = 3, - theme: Optional[str] = None, - word_wrap: bool = False, - show_locals: bool = False, - suppress: Iterable[Union[str, ModuleType]] = (), - max_frames: int = 100, - ) -> None: - """Prints a rich render of the last exception and traceback. - - Args: - width (Optional[int], optional): Number of characters used to render code. Defaults to 100. - extra_lines (int, optional): Additional lines of code to render. Defaults to 3. - theme (str, optional): Override pygments theme used in traceback - word_wrap (bool, optional): Enable word wrapping of long lines. Defaults to False. - show_locals (bool, optional): Enable display of local variables. Defaults to False. - suppress (Iterable[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback. - max_frames (int): Maximum number of frames to show in a traceback, 0 for no maximum. Defaults to 100. - """ - from .traceback import Traceback - - traceback = Traceback( - width=width, - extra_lines=extra_lines, - theme=theme, - word_wrap=word_wrap, - show_locals=show_locals, - suppress=suppress, - max_frames=max_frames, - ) - self.print(traceback) - - @staticmethod - def _caller_frame_info( - offset: int, - currentframe: Callable[[], Optional[FrameType]] = inspect.currentframe, - ) -> Tuple[str, int, Dict[str, Any]]: - """Get caller frame information. - - Args: - offset (int): the caller offset within the current frame stack. - currentframe (Callable[[], Optional[FrameType]], optional): the callable to use to - retrieve the current frame. Defaults to ``inspect.currentframe``. - - Returns: - Tuple[str, int, Dict[str, Any]]: A tuple containing the filename, the line number and - the dictionary of local variables associated with the caller frame. - - Raises: - RuntimeError: If the stack offset is invalid. - """ - # Ignore the frame of this local helper - offset += 1 - - frame = currentframe() - if frame is not None: - # Use the faster currentframe where implemented - while offset and frame is not None: - frame = frame.f_back - offset -= 1 - assert frame is not None - return frame.f_code.co_filename, frame.f_lineno, frame.f_locals - else: - # Fallback to the slower stack - frame_info = inspect.stack()[offset] - return frame_info.filename, frame_info.lineno, frame_info.frame.f_locals - - def log( - self, - *objects: Any, - sep: str = " ", - end: str = "\n", - style: Optional[Union[str, Style]] = None, - justify: Optional[JustifyMethod] = None, - emoji: Optional[bool] = None, - markup: Optional[bool] = None, - highlight: Optional[bool] = None, - log_locals: bool = False, - _stack_offset: int = 1, - ) -> None: - """Log rich content to the terminal. - - Args: - objects (positional args): Objects to log to the terminal. - sep (str, optional): String to write between print data. Defaults to " ". - end (str, optional): String to write at end of print data. Defaults to "\\\\n". - style (Union[str, Style], optional): A style to apply to output. Defaults to None. - justify (str, optional): One of "left", "right", "center", or "full". Defaults to ``None``. - overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to None. - emoji (Optional[bool], optional): Enable emoji code, or ``None`` to use console default. Defaults to None. - markup (Optional[bool], optional): Enable markup, or ``None`` to use console default. Defaults to None. - highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use console default. Defaults to None. - log_locals (bool, optional): Boolean to enable logging of locals where ``log()`` - was called. Defaults to False. - _stack_offset (int, optional): Offset of caller from end of call stack. Defaults to 1. - """ - if not objects: - objects = (NewLine(),) - - render_hooks = self._render_hooks[:] - - with self: - renderables = self._collect_renderables( - objects, - sep, - end, - justify=justify, - emoji=emoji, - markup=markup, - highlight=highlight, - ) - if style is not None: - renderables = [Styled(renderable, style) for renderable in renderables] - - filename, line_no, locals = self._caller_frame_info(_stack_offset) - link_path = None if filename.startswith("<") else os.path.abspath(filename) - path = filename.rpartition(os.sep)[-1] - if log_locals: - locals_map = { - key: value - for key, value in locals.items() - if not key.startswith("__") - } - renderables.append(render_scope(locals_map, title="[i]locals")) - - renderables = [ - self._log_render( - self, - renderables, - log_time=self.get_datetime(), - path=path, - line_no=line_no, - link_path=link_path, - ) - ] - for hook in render_hooks: - renderables = hook.process_renderables(renderables) - new_segments: List[Segment] = [] - extend = new_segments.extend - render = self.render - render_options = self.options - for renderable in renderables: - extend(render(renderable, render_options)) - buffer_extend = self._buffer.extend - for line in Segment.split_and_crop_lines( - new_segments, self.width, pad=False - ): - buffer_extend(line) - - def _check_buffer(self) -> None: - """Check if the buffer may be rendered. Render it if it can (e.g. Console.quiet is False) - Rendering is supported on Windows, Unix and Jupyter environments. For - legacy Windows consoles, the win32 API is called directly. - This method will also record what it renders if recording is enabled via Console.record. - """ - if self.quiet: - del self._buffer[:] - return - with self._lock: - if self.record: - with self._record_buffer_lock: - self._record_buffer.extend(self._buffer[:]) - - if self._buffer_index == 0: - if self.is_jupyter: # pragma: no cover - from .jupyter import display - - display(self._buffer, self._render_buffer(self._buffer[:])) - del self._buffer[:] - else: - if WINDOWS: - use_legacy_windows_render = False - if self.legacy_windows: - fileno = get_fileno(self.file) - if fileno is not None: - use_legacy_windows_render = ( - fileno in _STD_STREAMS_OUTPUT - ) - - if use_legacy_windows_render: - from pip._vendor.rich._win32_console import LegacyWindowsTerm - from pip._vendor.rich._windows_renderer import legacy_windows_render - - buffer = self._buffer[:] - if self.no_color and self._color_system: - buffer = list(Segment.remove_color(buffer)) - - legacy_windows_render(buffer, LegacyWindowsTerm(self.file)) - else: - # Either a non-std stream on legacy Windows, or modern Windows. - text = self._render_buffer(self._buffer[:]) - # https://bugs.python.org/issue37871 - # https://github.com/python/cpython/issues/82052 - # We need to avoid writing more than 32Kb in a single write, due to the above bug - write = self.file.write - # Worse case scenario, every character is 4 bytes of utf-8 - MAX_WRITE = 32 * 1024 // 4 - try: - if len(text) <= MAX_WRITE: - write(text) - else: - batch: List[str] = [] - batch_append = batch.append - size = 0 - for line in text.splitlines(True): - if size + len(line) > MAX_WRITE and batch: - write("".join(batch)) - batch.clear() - size = 0 - batch_append(line) - size += len(line) - if batch: - write("".join(batch)) - batch.clear() - except UnicodeEncodeError as error: - error.reason = f"{error.reason}\n*** You may need to add PYTHONIOENCODING=utf-8 to your environment ***" - raise - else: - text = self._render_buffer(self._buffer[:]) - try: - self.file.write(text) - except UnicodeEncodeError as error: - error.reason = f"{error.reason}\n*** You may need to add PYTHONIOENCODING=utf-8 to your environment ***" - raise - - self.file.flush() - del self._buffer[:] - - def _render_buffer(self, buffer: Iterable[Segment]) -> str: - """Render buffered output, and clear buffer.""" - output: List[str] = [] - append = output.append - color_system = self._color_system - legacy_windows = self.legacy_windows - not_terminal = not self.is_terminal - if self.no_color and color_system: - buffer = Segment.remove_color(buffer) - for text, style, control in buffer: - if style: - append( - style.render( - text, - color_system=color_system, - legacy_windows=legacy_windows, - ) - ) - elif not (not_terminal and control): - append(text) - - rendered = "".join(output) - return rendered - - def input( - self, - prompt: TextType = "", - *, - markup: bool = True, - emoji: bool = True, - password: bool = False, - stream: Optional[TextIO] = None, - ) -> str: - """Displays a prompt and waits for input from the user. The prompt may contain color / style. - - It works in the same way as Python's builtin :func:`input` function and provides elaborate line editing and history features if Python's builtin :mod:`readline` module is previously loaded. - - Args: - prompt (Union[str, Text]): Text to render in the prompt. - markup (bool, optional): Enable console markup (requires a str prompt). Defaults to True. - emoji (bool, optional): Enable emoji (requires a str prompt). Defaults to True. - password: (bool, optional): Hide typed text. Defaults to False. - stream: (TextIO, optional): Optional file to read input from (rather than stdin). Defaults to None. - - Returns: - str: Text read from stdin. - """ - if prompt: - self.print(prompt, markup=markup, emoji=emoji, end="") - if password: - result = getpass("", stream=stream) - else: - if stream: - result = stream.readline() - else: - result = input() - return result - - def export_text(self, *, clear: bool = True, styles: bool = False) -> str: - """Generate text from console contents (requires record=True argument in constructor). - - Args: - clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``. - styles (bool, optional): If ``True``, ansi escape codes will be included. ``False`` for plain text. - Defaults to ``False``. - - Returns: - str: String containing console contents. - - """ - assert ( - self.record - ), "To export console contents set record=True in the constructor or instance" - - with self._record_buffer_lock: - if styles: - text = "".join( - (style.render(text) if style else text) - for text, style, _ in self._record_buffer - ) - else: - text = "".join( - segment.text - for segment in self._record_buffer - if not segment.control - ) - if clear: - del self._record_buffer[:] - return text - - def save_text(self, path: str, *, clear: bool = True, styles: bool = False) -> None: - """Generate text from console and save to a given location (requires record=True argument in constructor). - - Args: - path (str): Path to write text files. - clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``. - styles (bool, optional): If ``True``, ansi style codes will be included. ``False`` for plain text. - Defaults to ``False``. - - """ - text = self.export_text(clear=clear, styles=styles) - with open(path, "wt", encoding="utf-8") as write_file: - write_file.write(text) - - def export_html( - self, - *, - theme: Optional[TerminalTheme] = None, - clear: bool = True, - code_format: Optional[str] = None, - inline_styles: bool = False, - ) -> str: - """Generate HTML from console contents (requires record=True argument in constructor). - - Args: - theme (TerminalTheme, optional): TerminalTheme object containing console colors. - clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``. - code_format (str, optional): Format string to render HTML. In addition to '{foreground}', - '{background}', and '{code}', should contain '{stylesheet}' if inline_styles is ``False``. - inline_styles (bool, optional): If ``True`` styles will be inlined in to spans, which makes files - larger but easier to cut and paste markup. If ``False``, styles will be embedded in a style tag. - Defaults to False. - - Returns: - str: String containing console contents as HTML. - """ - assert ( - self.record - ), "To export console contents set record=True in the constructor or instance" - fragments: List[str] = [] - append = fragments.append - _theme = theme or DEFAULT_TERMINAL_THEME - stylesheet = "" - - render_code_format = CONSOLE_HTML_FORMAT if code_format is None else code_format - - with self._record_buffer_lock: - if inline_styles: - for text, style, _ in Segment.filter_control( - Segment.simplify(self._record_buffer) - ): - text = escape(text) - if style: - rule = style.get_html_style(_theme) - if style.link: - text = f'<a href="{style.link}">{text}</a>' - text = f'<span style="{rule}">{text}</span>' if rule else text - append(text) - else: - styles: Dict[str, int] = {} - for text, style, _ in Segment.filter_control( - Segment.simplify(self._record_buffer) - ): - text = escape(text) - if style: - rule = style.get_html_style(_theme) - style_number = styles.setdefault(rule, len(styles) + 1) - if style.link: - text = f'<a class="r{style_number}" href="{style.link}">{text}</a>' - else: - text = f'<span class="r{style_number}">{text}</span>' - append(text) - stylesheet_rules: List[str] = [] - stylesheet_append = stylesheet_rules.append - for style_rule, style_number in styles.items(): - if style_rule: - stylesheet_append(f".r{style_number} {{{style_rule}}}") - stylesheet = "\n".join(stylesheet_rules) - - rendered_code = render_code_format.format( - code="".join(fragments), - stylesheet=stylesheet, - foreground=_theme.foreground_color.hex, - background=_theme.background_color.hex, - ) - if clear: - del self._record_buffer[:] - return rendered_code - - def save_html( - self, - path: str, - *, - theme: Optional[TerminalTheme] = None, - clear: bool = True, - code_format: str = CONSOLE_HTML_FORMAT, - inline_styles: bool = False, - ) -> None: - """Generate HTML from console contents and write to a file (requires record=True argument in constructor). - - Args: - path (str): Path to write html file. - theme (TerminalTheme, optional): TerminalTheme object containing console colors. - clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``. - code_format (str, optional): Format string to render HTML. In addition to '{foreground}', - '{background}', and '{code}', should contain '{stylesheet}' if inline_styles is ``False``. - inline_styles (bool, optional): If ``True`` styles will be inlined in to spans, which makes files - larger but easier to cut and paste markup. If ``False``, styles will be embedded in a style tag. - Defaults to False. - - """ - html = self.export_html( - theme=theme, - clear=clear, - code_format=code_format, - inline_styles=inline_styles, - ) - with open(path, "wt", encoding="utf-8") as write_file: - write_file.write(html) - - def export_svg( - self, - *, - title: str = "Rich", - theme: Optional[TerminalTheme] = None, - clear: bool = True, - code_format: str = CONSOLE_SVG_FORMAT, - font_aspect_ratio: float = 0.61, - unique_id: Optional[str] = None, - ) -> str: - """ - Generate an SVG from the console contents (requires record=True in Console constructor). - - Args: - title (str, optional): The title of the tab in the output image - theme (TerminalTheme, optional): The ``TerminalTheme`` object to use to style the terminal - clear (bool, optional): Clear record buffer after exporting. Defaults to ``True`` - code_format (str, optional): Format string used to generate the SVG. Rich will inject a number of variables - into the string in order to form the final SVG output. The default template used and the variables - injected by Rich can be found by inspecting the ``console.CONSOLE_SVG_FORMAT`` variable. - font_aspect_ratio (float, optional): The width to height ratio of the font used in the ``code_format`` - string. Defaults to 0.61, which is the width to height ratio of Fira Code (the default font). - If you aren't specifying a different font inside ``code_format``, you probably don't need this. - unique_id (str, optional): unique id that is used as the prefix for various elements (CSS styles, node - ids). If not set, this defaults to a computed value based on the recorded content. - """ - - from pip._vendor.rich.cells import cell_len - - style_cache: Dict[Style, str] = {} - - def get_svg_style(style: Style) -> str: - """Convert a Style to CSS rules for SVG.""" - if style in style_cache: - return style_cache[style] - css_rules = [] - color = ( - _theme.foreground_color - if (style.color is None or style.color.is_default) - else style.color.get_truecolor(_theme) - ) - bgcolor = ( - _theme.background_color - if (style.bgcolor is None or style.bgcolor.is_default) - else style.bgcolor.get_truecolor(_theme) - ) - if style.reverse: - color, bgcolor = bgcolor, color - if style.dim: - color = blend_rgb(color, bgcolor, 0.4) - css_rules.append(f"fill: {color.hex}") - if style.bold: - css_rules.append("font-weight: bold") - if style.italic: - css_rules.append("font-style: italic;") - if style.underline: - css_rules.append("text-decoration: underline;") - if style.strike: - css_rules.append("text-decoration: line-through;") - - css = ";".join(css_rules) - style_cache[style] = css - return css - - _theme = theme or SVG_EXPORT_THEME - - width = self.width - char_height = 20 - char_width = char_height * font_aspect_ratio - line_height = char_height * 1.22 - - margin_top = 1 - margin_right = 1 - margin_bottom = 1 - margin_left = 1 - - padding_top = 40 - padding_right = 8 - padding_bottom = 8 - padding_left = 8 - - padding_width = padding_left + padding_right - padding_height = padding_top + padding_bottom - margin_width = margin_left + margin_right - margin_height = margin_top + margin_bottom - - text_backgrounds: List[str] = [] - text_group: List[str] = [] - classes: Dict[str, int] = {} - style_no = 1 - - def escape_text(text: str) -> str: - """HTML escape text and replace spaces with nbsp.""" - return escape(text).replace(" ", "&#160;") - - def make_tag( - name: str, content: Optional[str] = None, **attribs: object - ) -> str: - """Make a tag from name, content, and attributes.""" - - def stringify(value: object) -> str: - if isinstance(value, (float)): - return format(value, "g") - return str(value) - - tag_attribs = " ".join( - f'{k.lstrip("_").replace("_", "-")}="{stringify(v)}"' - for k, v in attribs.items() - ) - return ( - f"<{name} {tag_attribs}>{content}</{name}>" - if content - else f"<{name} {tag_attribs}/>" - ) - - with self._record_buffer_lock: - segments = list(Segment.filter_control(self._record_buffer)) - if clear: - self._record_buffer.clear() - - if unique_id is None: - unique_id = "terminal-" + str( - zlib.adler32( - ("".join(repr(segment) for segment in segments)).encode( - "utf-8", - "ignore", - ) - + title.encode("utf-8", "ignore") - ) - ) - y = 0 - for y, line in enumerate(Segment.split_and_crop_lines(segments, length=width)): - x = 0 - for text, style, _control in line: - style = style or Style() - rules = get_svg_style(style) - if rules not in classes: - classes[rules] = style_no - style_no += 1 - class_name = f"r{classes[rules]}" - - if style.reverse: - has_background = True - background = ( - _theme.foreground_color.hex - if style.color is None - else style.color.get_truecolor(_theme).hex - ) - else: - bgcolor = style.bgcolor - has_background = bgcolor is not None and not bgcolor.is_default - background = ( - _theme.background_color.hex - if style.bgcolor is None - else style.bgcolor.get_truecolor(_theme).hex - ) - - text_length = cell_len(text) - if has_background: - text_backgrounds.append( - make_tag( - "rect", - fill=background, - x=x * char_width, - y=y * line_height + 1.5, - width=char_width * text_length, - height=line_height + 0.25, - shape_rendering="crispEdges", - ) - ) - - if text != " " * len(text): - text_group.append( - make_tag( - "text", - escape_text(text), - _class=f"{unique_id}-{class_name}", - x=x * char_width, - y=y * line_height + char_height, - textLength=char_width * len(text), - clip_path=f"url(#{unique_id}-line-{y})", - ) - ) - x += cell_len(text) - - line_offsets = [line_no * line_height + 1.5 for line_no in range(y)] - lines = "\n".join( - f"""<clipPath id="{unique_id}-line-{line_no}"> - {make_tag("rect", x=0, y=offset, width=char_width * width, height=line_height + 0.25)} - </clipPath>""" - for line_no, offset in enumerate(line_offsets) - ) - - styles = "\n".join( - f".{unique_id}-r{rule_no} {{ {css} }}" for css, rule_no in classes.items() - ) - backgrounds = "".join(text_backgrounds) - matrix = "".join(text_group) - - terminal_width = ceil(width * char_width + padding_width) - terminal_height = (y + 1) * line_height + padding_height - chrome = make_tag( - "rect", - fill=_theme.background_color.hex, - stroke="rgba(255,255,255,0.35)", - stroke_width="1", - x=margin_left, - y=margin_top, - width=terminal_width, - height=terminal_height, - rx=8, - ) - - title_color = _theme.foreground_color.hex - if title: - chrome += make_tag( - "text", - escape_text(title), - _class=f"{unique_id}-title", - fill=title_color, - text_anchor="middle", - x=terminal_width // 2, - y=margin_top + char_height + 6, - ) - chrome += f""" - <g transform="translate(26,22)"> - <circle cx="0" cy="0" r="7" fill="#ff5f57"/> - <circle cx="22" cy="0" r="7" fill="#febc2e"/> - <circle cx="44" cy="0" r="7" fill="#28c840"/> - </g> - """ - - svg = code_format.format( - unique_id=unique_id, - char_width=char_width, - char_height=char_height, - line_height=line_height, - terminal_width=char_width * width - 1, - terminal_height=(y + 1) * line_height - 1, - width=terminal_width + margin_width, - height=terminal_height + margin_height, - terminal_x=margin_left + padding_left, - terminal_y=margin_top + padding_top, - styles=styles, - chrome=chrome, - backgrounds=backgrounds, - matrix=matrix, - lines=lines, - ) - return svg - - def save_svg( - self, - path: str, - *, - title: str = "Rich", - theme: Optional[TerminalTheme] = None, - clear: bool = True, - code_format: str = CONSOLE_SVG_FORMAT, - font_aspect_ratio: float = 0.61, - unique_id: Optional[str] = None, - ) -> None: - """Generate an SVG file from the console contents (requires record=True in Console constructor). - - Args: - path (str): The path to write the SVG to. - title (str, optional): The title of the tab in the output image - theme (TerminalTheme, optional): The ``TerminalTheme`` object to use to style the terminal - clear (bool, optional): Clear record buffer after exporting. Defaults to ``True`` - code_format (str, optional): Format string used to generate the SVG. Rich will inject a number of variables - into the string in order to form the final SVG output. The default template used and the variables - injected by Rich can be found by inspecting the ``console.CONSOLE_SVG_FORMAT`` variable. - font_aspect_ratio (float, optional): The width to height ratio of the font used in the ``code_format`` - string. Defaults to 0.61, which is the width to height ratio of Fira Code (the default font). - If you aren't specifying a different font inside ``code_format``, you probably don't need this. - unique_id (str, optional): unique id that is used as the prefix for various elements (CSS styles, node - ids). If not set, this defaults to a computed value based on the recorded content. - """ - svg = self.export_svg( - title=title, - theme=theme, - clear=clear, - code_format=code_format, - font_aspect_ratio=font_aspect_ratio, - unique_id=unique_id, - ) - with open(path, "wt", encoding="utf-8") as write_file: - write_file.write(svg) - - -def _svg_hash(svg_main_code: str) -> str: - """Returns a unique hash for the given SVG main code. - - Args: - svg_main_code (str): The content we're going to inject in the SVG envelope. - - Returns: - str: a hash of the given content - """ - return str(zlib.adler32(svg_main_code.encode())) - - -if __name__ == "__main__": # pragma: no cover - console = Console(record=True) - - console.log( - "JSONRPC [i]request[/i]", - 5, - 1.3, - True, - False, - None, - { - "jsonrpc": "2.0", - "method": "subtract", - "params": {"minuend": 42, "subtrahend": 23}, - "id": 3, - }, - ) - - console.log("Hello, World!", "{'a': 1}", repr(console)) - - console.print( - { - "name": None, - "empty": [], - "quiz": { - "sport": { - "answered": True, - "q1": { - "question": "Which one is correct team name in NBA?", - "options": [ - "New York Bulls", - "Los Angeles Kings", - "Golden State Warriors", - "Huston Rocket", - ], - "answer": "Huston Rocket", - }, - }, - "maths": { - "answered": False, - "q1": { - "question": "5 + 7 = ?", - "options": [10, 11, 12, 13], - "answer": 12, - }, - "q2": { - "question": "12 - 8 = ?", - "options": [1, 2, 3, 4], - "answer": 4, - }, - }, - }, - } - ) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/constrain.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/constrain.py deleted file mode 100644 index 65fdf56..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/constrain.py +++ /dev/null @@ -1,37 +0,0 @@ -from typing import Optional, TYPE_CHECKING - -from .jupyter import JupyterMixin -from .measure import Measurement - -if TYPE_CHECKING: - from .console import Console, ConsoleOptions, RenderableType, RenderResult - - -class Constrain(JupyterMixin): - """Constrain the width of a renderable to a given number of characters. - - Args: - renderable (RenderableType): A renderable object. - width (int, optional): The maximum width (in characters) to render. Defaults to 80. - """ - - def __init__(self, renderable: "RenderableType", width: Optional[int] = 80) -> None: - self.renderable = renderable - self.width = width - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - if self.width is None: - yield self.renderable - else: - child_options = options.update_width(min(self.width, options.max_width)) - yield from console.render(self.renderable, child_options) - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> "Measurement": - if self.width is not None: - options = options.update_width(self.width) - measurement = Measurement.get(console, options, self.renderable) - return measurement diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/containers.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/containers.py deleted file mode 100644 index e29cf36..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/containers.py +++ /dev/null @@ -1,167 +0,0 @@ -from itertools import zip_longest -from typing import ( - Iterator, - Iterable, - List, - Optional, - Union, - overload, - TypeVar, - TYPE_CHECKING, -) - -if TYPE_CHECKING: - from .console import ( - Console, - ConsoleOptions, - JustifyMethod, - OverflowMethod, - RenderResult, - RenderableType, - ) - from .text import Text - -from .cells import cell_len -from .measure import Measurement - -T = TypeVar("T") - - -class Renderables: - """A list subclass which renders its contents to the console.""" - - def __init__( - self, renderables: Optional[Iterable["RenderableType"]] = None - ) -> None: - self._renderables: List["RenderableType"] = ( - list(renderables) if renderables is not None else [] - ) - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - """Console render method to insert line-breaks.""" - yield from self._renderables - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> "Measurement": - dimensions = [ - Measurement.get(console, options, renderable) - for renderable in self._renderables - ] - if not dimensions: - return Measurement(1, 1) - _min = max(dimension.minimum for dimension in dimensions) - _max = max(dimension.maximum for dimension in dimensions) - return Measurement(_min, _max) - - def append(self, renderable: "RenderableType") -> None: - self._renderables.append(renderable) - - def __iter__(self) -> Iterable["RenderableType"]: - return iter(self._renderables) - - -class Lines: - """A list subclass which can render to the console.""" - - def __init__(self, lines: Iterable["Text"] = ()) -> None: - self._lines: List["Text"] = list(lines) - - def __repr__(self) -> str: - return f"Lines({self._lines!r})" - - def __iter__(self) -> Iterator["Text"]: - return iter(self._lines) - - @overload - def __getitem__(self, index: int) -> "Text": - ... - - @overload - def __getitem__(self, index: slice) -> List["Text"]: - ... - - def __getitem__(self, index: Union[slice, int]) -> Union["Text", List["Text"]]: - return self._lines[index] - - def __setitem__(self, index: int, value: "Text") -> "Lines": - self._lines[index] = value - return self - - def __len__(self) -> int: - return self._lines.__len__() - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - """Console render method to insert line-breaks.""" - yield from self._lines - - def append(self, line: "Text") -> None: - self._lines.append(line) - - def extend(self, lines: Iterable["Text"]) -> None: - self._lines.extend(lines) - - def pop(self, index: int = -1) -> "Text": - return self._lines.pop(index) - - def justify( - self, - console: "Console", - width: int, - justify: "JustifyMethod" = "left", - overflow: "OverflowMethod" = "fold", - ) -> None: - """Justify and overflow text to a given width. - - Args: - console (Console): Console instance. - width (int): Number of characters per line. - justify (str, optional): Default justify method for text: "left", "center", "full" or "right". Defaults to "left". - overflow (str, optional): Default overflow for text: "crop", "fold", or "ellipsis". Defaults to "fold". - - """ - from .text import Text - - if justify == "left": - for line in self._lines: - line.truncate(width, overflow=overflow, pad=True) - elif justify == "center": - for line in self._lines: - line.rstrip() - line.truncate(width, overflow=overflow) - line.pad_left((width - cell_len(line.plain)) // 2) - line.pad_right(width - cell_len(line.plain)) - elif justify == "right": - for line in self._lines: - line.rstrip() - line.truncate(width, overflow=overflow) - line.pad_left(width - cell_len(line.plain)) - elif justify == "full": - for line_index, line in enumerate(self._lines): - if line_index == len(self._lines) - 1: - break - words = line.split(" ") - words_size = sum(cell_len(word.plain) for word in words) - num_spaces = len(words) - 1 - spaces = [1 for _ in range(num_spaces)] - index = 0 - if spaces: - while words_size + num_spaces < width: - spaces[len(spaces) - index - 1] += 1 - num_spaces += 1 - index = (index + 1) % len(spaces) - tokens: List[Text] = [] - for index, (word, next_word) in enumerate( - zip_longest(words, words[1:]) - ): - tokens.append(word) - if index < len(spaces): - style = word.get_style_at_offset(console, -1) - next_style = next_word.get_style_at_offset(console, 0) - space_style = style if style == next_style else line.style - tokens.append(Text(" " * spaces[index], style=space_style)) - self[line_index] = Text("").join(tokens) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/control.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/control.py deleted file mode 100644 index 88fcb92..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/control.py +++ /dev/null @@ -1,225 +0,0 @@ -import sys -import time -from typing import TYPE_CHECKING, Callable, Dict, Iterable, List, Union - -if sys.version_info >= (3, 8): - from typing import Final -else: - from pip._vendor.typing_extensions import Final # pragma: no cover - -from .segment import ControlCode, ControlType, Segment - -if TYPE_CHECKING: - from .console import Console, ConsoleOptions, RenderResult - -STRIP_CONTROL_CODES: Final = [ - 7, # Bell - 8, # Backspace - 11, # Vertical tab - 12, # Form feed - 13, # Carriage return -] -_CONTROL_STRIP_TRANSLATE: Final = { - _codepoint: None for _codepoint in STRIP_CONTROL_CODES -} - -CONTROL_ESCAPE: Final = { - 7: "\\a", - 8: "\\b", - 11: "\\v", - 12: "\\f", - 13: "\\r", -} - -CONTROL_CODES_FORMAT: Dict[int, Callable[..., str]] = { - ControlType.BELL: lambda: "\x07", - ControlType.CARRIAGE_RETURN: lambda: "\r", - ControlType.HOME: lambda: "\x1b[H", - ControlType.CLEAR: lambda: "\x1b[2J", - ControlType.ENABLE_ALT_SCREEN: lambda: "\x1b[?1049h", - ControlType.DISABLE_ALT_SCREEN: lambda: "\x1b[?1049l", - ControlType.SHOW_CURSOR: lambda: "\x1b[?25h", - ControlType.HIDE_CURSOR: lambda: "\x1b[?25l", - ControlType.CURSOR_UP: lambda param: f"\x1b[{param}A", - ControlType.CURSOR_DOWN: lambda param: f"\x1b[{param}B", - ControlType.CURSOR_FORWARD: lambda param: f"\x1b[{param}C", - ControlType.CURSOR_BACKWARD: lambda param: f"\x1b[{param}D", - ControlType.CURSOR_MOVE_TO_COLUMN: lambda param: f"\x1b[{param+1}G", - ControlType.ERASE_IN_LINE: lambda param: f"\x1b[{param}K", - ControlType.CURSOR_MOVE_TO: lambda x, y: f"\x1b[{y+1};{x+1}H", - ControlType.SET_WINDOW_TITLE: lambda title: f"\x1b]0;{title}\x07", -} - - -class Control: - """A renderable that inserts a control code (non printable but may move cursor). - - Args: - *codes (str): Positional arguments are either a :class:`~rich.segment.ControlType` enum or a - tuple of ControlType and an integer parameter - """ - - __slots__ = ["segment"] - - def __init__(self, *codes: Union[ControlType, ControlCode]) -> None: - control_codes: List[ControlCode] = [ - (code,) if isinstance(code, ControlType) else code for code in codes - ] - _format_map = CONTROL_CODES_FORMAT - rendered_codes = "".join( - _format_map[code](*parameters) for code, *parameters in control_codes - ) - self.segment = Segment(rendered_codes, None, control_codes) - - @classmethod - def bell(cls) -> "Control": - """Ring the 'bell'.""" - return cls(ControlType.BELL) - - @classmethod - def home(cls) -> "Control": - """Move cursor to 'home' position.""" - return cls(ControlType.HOME) - - @classmethod - def move(cls, x: int = 0, y: int = 0) -> "Control": - """Move cursor relative to current position. - - Args: - x (int): X offset. - y (int): Y offset. - - Returns: - ~Control: Control object. - - """ - - def get_codes() -> Iterable[ControlCode]: - control = ControlType - if x: - yield ( - control.CURSOR_FORWARD if x > 0 else control.CURSOR_BACKWARD, - abs(x), - ) - if y: - yield ( - control.CURSOR_DOWN if y > 0 else control.CURSOR_UP, - abs(y), - ) - - control = cls(*get_codes()) - return control - - @classmethod - def move_to_column(cls, x: int, y: int = 0) -> "Control": - """Move to the given column, optionally add offset to row. - - Returns: - x (int): absolute x (column) - y (int): optional y offset (row) - - Returns: - ~Control: Control object. - """ - - return ( - cls( - (ControlType.CURSOR_MOVE_TO_COLUMN, x), - ( - ControlType.CURSOR_DOWN if y > 0 else ControlType.CURSOR_UP, - abs(y), - ), - ) - if y - else cls((ControlType.CURSOR_MOVE_TO_COLUMN, x)) - ) - - @classmethod - def move_to(cls, x: int, y: int) -> "Control": - """Move cursor to absolute position. - - Args: - x (int): x offset (column) - y (int): y offset (row) - - Returns: - ~Control: Control object. - """ - return cls((ControlType.CURSOR_MOVE_TO, x, y)) - - @classmethod - def clear(cls) -> "Control": - """Clear the screen.""" - return cls(ControlType.CLEAR) - - @classmethod - def show_cursor(cls, show: bool) -> "Control": - """Show or hide the cursor.""" - return cls(ControlType.SHOW_CURSOR if show else ControlType.HIDE_CURSOR) - - @classmethod - def alt_screen(cls, enable: bool) -> "Control": - """Enable or disable alt screen.""" - if enable: - return cls(ControlType.ENABLE_ALT_SCREEN, ControlType.HOME) - else: - return cls(ControlType.DISABLE_ALT_SCREEN) - - @classmethod - def title(cls, title: str) -> "Control": - """Set the terminal window title - - Args: - title (str): The new terminal window title - """ - return cls((ControlType.SET_WINDOW_TITLE, title)) - - def __str__(self) -> str: - return self.segment.text - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - if self.segment.text: - yield self.segment - - -def strip_control_codes( - text: str, _translate_table: Dict[int, None] = _CONTROL_STRIP_TRANSLATE -) -> str: - """Remove control codes from text. - - Args: - text (str): A string possibly contain control codes. - - Returns: - str: String with control codes removed. - """ - return text.translate(_translate_table) - - -def escape_control_codes( - text: str, - _translate_table: Dict[int, str] = CONTROL_ESCAPE, -) -> str: - """Replace control codes with their "escaped" equivalent in the given text. - (e.g. "\b" becomes "\\b") - - Args: - text (str): A string possibly containing control codes. - - Returns: - str: String with control codes replaced with their escaped version. - """ - return text.translate(_translate_table) - - -if __name__ == "__main__": # pragma: no cover - from pip._vendor.rich.console import Console - - console = Console() - console.print("Look at the title of your terminal window ^") - # console.print(Control((ControlType.SET_WINDOW_TITLE, "Hello, world!"))) - for i in range(10): - console.set_window_title("🚀 Loading" + "." * i) - time.sleep(0.5) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/default_styles.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/default_styles.py deleted file mode 100644 index dca3719..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/default_styles.py +++ /dev/null @@ -1,190 +0,0 @@ -from typing import Dict - -from .style import Style - -DEFAULT_STYLES: Dict[str, Style] = { - "none": Style.null(), - "reset": Style( - color="default", - bgcolor="default", - dim=False, - bold=False, - italic=False, - underline=False, - blink=False, - blink2=False, - reverse=False, - conceal=False, - strike=False, - ), - "dim": Style(dim=True), - "bright": Style(dim=False), - "bold": Style(bold=True), - "strong": Style(bold=True), - "code": Style(reverse=True, bold=True), - "italic": Style(italic=True), - "emphasize": Style(italic=True), - "underline": Style(underline=True), - "blink": Style(blink=True), - "blink2": Style(blink2=True), - "reverse": Style(reverse=True), - "strike": Style(strike=True), - "black": Style(color="black"), - "red": Style(color="red"), - "green": Style(color="green"), - "yellow": Style(color="yellow"), - "magenta": Style(color="magenta"), - "cyan": Style(color="cyan"), - "white": Style(color="white"), - "inspect.attr": Style(color="yellow", italic=True), - "inspect.attr.dunder": Style(color="yellow", italic=True, dim=True), - "inspect.callable": Style(bold=True, color="red"), - "inspect.async_def": Style(italic=True, color="bright_cyan"), - "inspect.def": Style(italic=True, color="bright_cyan"), - "inspect.class": Style(italic=True, color="bright_cyan"), - "inspect.error": Style(bold=True, color="red"), - "inspect.equals": Style(), - "inspect.help": Style(color="cyan"), - "inspect.doc": Style(dim=True), - "inspect.value.border": Style(color="green"), - "live.ellipsis": Style(bold=True, color="red"), - "layout.tree.row": Style(dim=False, color="red"), - "layout.tree.column": Style(dim=False, color="blue"), - "logging.keyword": Style(bold=True, color="yellow"), - "logging.level.notset": Style(dim=True), - "logging.level.debug": Style(color="green"), - "logging.level.info": Style(color="blue"), - "logging.level.warning": Style(color="red"), - "logging.level.error": Style(color="red", bold=True), - "logging.level.critical": Style(color="red", bold=True, reverse=True), - "log.level": Style.null(), - "log.time": Style(color="cyan", dim=True), - "log.message": Style.null(), - "log.path": Style(dim=True), - "repr.ellipsis": Style(color="yellow"), - "repr.indent": Style(color="green", dim=True), - "repr.error": Style(color="red", bold=True), - "repr.str": Style(color="green", italic=False, bold=False), - "repr.brace": Style(bold=True), - "repr.comma": Style(bold=True), - "repr.ipv4": Style(bold=True, color="bright_green"), - "repr.ipv6": Style(bold=True, color="bright_green"), - "repr.eui48": Style(bold=True, color="bright_green"), - "repr.eui64": Style(bold=True, color="bright_green"), - "repr.tag_start": Style(bold=True), - "repr.tag_name": Style(color="bright_magenta", bold=True), - "repr.tag_contents": Style(color="default"), - "repr.tag_end": Style(bold=True), - "repr.attrib_name": Style(color="yellow", italic=False), - "repr.attrib_equal": Style(bold=True), - "repr.attrib_value": Style(color="magenta", italic=False), - "repr.number": Style(color="cyan", bold=True, italic=False), - "repr.number_complex": Style(color="cyan", bold=True, italic=False), # same - "repr.bool_true": Style(color="bright_green", italic=True), - "repr.bool_false": Style(color="bright_red", italic=True), - "repr.none": Style(color="magenta", italic=True), - "repr.url": Style(underline=True, color="bright_blue", italic=False, bold=False), - "repr.uuid": Style(color="bright_yellow", bold=False), - "repr.call": Style(color="magenta", bold=True), - "repr.path": Style(color="magenta"), - "repr.filename": Style(color="bright_magenta"), - "rule.line": Style(color="bright_green"), - "rule.text": Style.null(), - "json.brace": Style(bold=True), - "json.bool_true": Style(color="bright_green", italic=True), - "json.bool_false": Style(color="bright_red", italic=True), - "json.null": Style(color="magenta", italic=True), - "json.number": Style(color="cyan", bold=True, italic=False), - "json.str": Style(color="green", italic=False, bold=False), - "json.key": Style(color="blue", bold=True), - "prompt": Style.null(), - "prompt.choices": Style(color="magenta", bold=True), - "prompt.default": Style(color="cyan", bold=True), - "prompt.invalid": Style(color="red"), - "prompt.invalid.choice": Style(color="red"), - "pretty": Style.null(), - "scope.border": Style(color="blue"), - "scope.key": Style(color="yellow", italic=True), - "scope.key.special": Style(color="yellow", italic=True, dim=True), - "scope.equals": Style(color="red"), - "table.header": Style(bold=True), - "table.footer": Style(bold=True), - "table.cell": Style.null(), - "table.title": Style(italic=True), - "table.caption": Style(italic=True, dim=True), - "traceback.error": Style(color="red", italic=True), - "traceback.border.syntax_error": Style(color="bright_red"), - "traceback.border": Style(color="red"), - "traceback.text": Style.null(), - "traceback.title": Style(color="red", bold=True), - "traceback.exc_type": Style(color="bright_red", bold=True), - "traceback.exc_value": Style.null(), - "traceback.offset": Style(color="bright_red", bold=True), - "bar.back": Style(color="grey23"), - "bar.complete": Style(color="rgb(249,38,114)"), - "bar.finished": Style(color="rgb(114,156,31)"), - "bar.pulse": Style(color="rgb(249,38,114)"), - "progress.description": Style.null(), - "progress.filesize": Style(color="green"), - "progress.filesize.total": Style(color="green"), - "progress.download": Style(color="green"), - "progress.elapsed": Style(color="yellow"), - "progress.percentage": Style(color="magenta"), - "progress.remaining": Style(color="cyan"), - "progress.data.speed": Style(color="red"), - "progress.spinner": Style(color="green"), - "status.spinner": Style(color="green"), - "tree": Style(), - "tree.line": Style(), - "markdown.paragraph": Style(), - "markdown.text": Style(), - "markdown.em": Style(italic=True), - "markdown.emph": Style(italic=True), # For commonmark backwards compatibility - "markdown.strong": Style(bold=True), - "markdown.code": Style(bold=True, color="cyan", bgcolor="black"), - "markdown.code_block": Style(color="cyan", bgcolor="black"), - "markdown.block_quote": Style(color="magenta"), - "markdown.list": Style(color="cyan"), - "markdown.item": Style(), - "markdown.item.bullet": Style(color="yellow", bold=True), - "markdown.item.number": Style(color="yellow", bold=True), - "markdown.hr": Style(color="yellow"), - "markdown.h1.border": Style(), - "markdown.h1": Style(bold=True), - "markdown.h2": Style(bold=True, underline=True), - "markdown.h3": Style(bold=True), - "markdown.h4": Style(bold=True, dim=True), - "markdown.h5": Style(underline=True), - "markdown.h6": Style(italic=True), - "markdown.h7": Style(italic=True, dim=True), - "markdown.link": Style(color="bright_blue"), - "markdown.link_url": Style(color="blue", underline=True), - "markdown.s": Style(strike=True), - "iso8601.date": Style(color="blue"), - "iso8601.time": Style(color="magenta"), - "iso8601.timezone": Style(color="yellow"), -} - - -if __name__ == "__main__": # pragma: no cover - import argparse - import io - - from pip._vendor.rich.console import Console - from pip._vendor.rich.table import Table - from pip._vendor.rich.text import Text - - parser = argparse.ArgumentParser() - parser.add_argument("--html", action="store_true", help="Export as HTML table") - args = parser.parse_args() - html: bool = args.html - console = Console(record=True, width=70, file=io.StringIO()) if html else Console() - - table = Table("Name", "Styling") - - for style_name, style in DEFAULT_STYLES.items(): - table.add_row(Text(style_name, style=style), str(style)) - - console.print(table) - if html: - print(console.export_html(inline_styles=True)) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/diagnose.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/diagnose.py deleted file mode 100644 index ad36183..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/diagnose.py +++ /dev/null @@ -1,37 +0,0 @@ -import os -import platform - -from pip._vendor.rich import inspect -from pip._vendor.rich.console import Console, get_windows_console_features -from pip._vendor.rich.panel import Panel -from pip._vendor.rich.pretty import Pretty - - -def report() -> None: # pragma: no cover - """Print a report to the terminal with debugging information""" - console = Console() - inspect(console) - features = get_windows_console_features() - inspect(features) - - env_names = ( - "TERM", - "COLORTERM", - "CLICOLOR", - "NO_COLOR", - "TERM_PROGRAM", - "COLUMNS", - "LINES", - "JUPYTER_COLUMNS", - "JUPYTER_LINES", - "JPY_PARENT_PID", - "VSCODE_VERBOSE_LOGGING", - ) - env = {name: os.getenv(name) for name in env_names} - console.print(Panel.fit((Pretty(env)), title="[b]Environment Variables")) - - console.print(f'platform="{platform.system()}"') - - -if __name__ == "__main__": # pragma: no cover - report() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/emoji.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/emoji.py deleted file mode 100644 index 791f046..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/emoji.py +++ /dev/null @@ -1,96 +0,0 @@ -import sys -from typing import TYPE_CHECKING, Optional, Union - -from .jupyter import JupyterMixin -from .segment import Segment -from .style import Style -from ._emoji_codes import EMOJI -from ._emoji_replace import _emoji_replace - -if sys.version_info >= (3, 8): - from typing import Literal -else: - from pip._vendor.typing_extensions import Literal # pragma: no cover - - -if TYPE_CHECKING: - from .console import Console, ConsoleOptions, RenderResult - - -EmojiVariant = Literal["emoji", "text"] - - -class NoEmoji(Exception): - """No emoji by that name.""" - - -class Emoji(JupyterMixin): - __slots__ = ["name", "style", "_char", "variant"] - - VARIANTS = {"text": "\uFE0E", "emoji": "\uFE0F"} - - def __init__( - self, - name: str, - style: Union[str, Style] = "none", - variant: Optional[EmojiVariant] = None, - ) -> None: - """A single emoji character. - - Args: - name (str): Name of emoji. - style (Union[str, Style], optional): Optional style. Defaults to None. - - Raises: - NoEmoji: If the emoji doesn't exist. - """ - self.name = name - self.style = style - self.variant = variant - try: - self._char = EMOJI[name] - except KeyError: - raise NoEmoji(f"No emoji called {name!r}") - if variant is not None: - self._char += self.VARIANTS.get(variant, "") - - @classmethod - def replace(cls, text: str) -> str: - """Replace emoji markup with corresponding unicode characters. - - Args: - text (str): A string with emojis codes, e.g. "Hello :smiley:!" - - Returns: - str: A string with emoji codes replaces with actual emoji. - """ - return _emoji_replace(text) - - def __repr__(self) -> str: - return f"<emoji {self.name!r}>" - - def __str__(self) -> str: - return self._char - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - yield Segment(self._char, console.get_style(self.style)) - - -if __name__ == "__main__": # pragma: no cover - import sys - - from pip._vendor.rich.columns import Columns - from pip._vendor.rich.console import Console - - console = Console(record=True) - - columns = Columns( - (f":{name}: {name}" for name in sorted(EMOJI.keys()) if "\u200D" not in name), - column_first=True, - ) - - console.print(columns) - if len(sys.argv) > 1: - console.save_html(sys.argv[1]) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/errors.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/errors.py deleted file mode 100644 index 0bcbe53..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/errors.py +++ /dev/null @@ -1,34 +0,0 @@ -class ConsoleError(Exception): - """An error in console operation.""" - - -class StyleError(Exception): - """An error in styles.""" - - -class StyleSyntaxError(ConsoleError): - """Style was badly formatted.""" - - -class MissingStyle(StyleError): - """No such style.""" - - -class StyleStackError(ConsoleError): - """Style stack is invalid.""" - - -class NotRenderableError(ConsoleError): - """Object is not renderable.""" - - -class MarkupError(ConsoleError): - """Markup was badly formatted.""" - - -class LiveError(ConsoleError): - """Error related to Live display.""" - - -class NoAltScreen(ConsoleError): - """Alt screen mode was required.""" diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/file_proxy.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/file_proxy.py deleted file mode 100644 index 4b0b0da..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/file_proxy.py +++ /dev/null @@ -1,57 +0,0 @@ -import io -from typing import IO, TYPE_CHECKING, Any, List - -from .ansi import AnsiDecoder -from .text import Text - -if TYPE_CHECKING: - from .console import Console - - -class FileProxy(io.TextIOBase): - """Wraps a file (e.g. sys.stdout) and redirects writes to a console.""" - - def __init__(self, console: "Console", file: IO[str]) -> None: - self.__console = console - self.__file = file - self.__buffer: List[str] = [] - self.__ansi_decoder = AnsiDecoder() - - @property - def rich_proxied_file(self) -> IO[str]: - """Get proxied file.""" - return self.__file - - def __getattr__(self, name: str) -> Any: - return getattr(self.__file, name) - - def write(self, text: str) -> int: - if not isinstance(text, str): - raise TypeError(f"write() argument must be str, not {type(text).__name__}") - buffer = self.__buffer - lines: List[str] = [] - while text: - line, new_line, text = text.partition("\n") - if new_line: - lines.append("".join(buffer) + line) - buffer.clear() - else: - buffer.append(line) - break - if lines: - console = self.__console - with console: - output = Text("\n").join( - self.__ansi_decoder.decode_line(line) for line in lines - ) - console.print(output) - return len(text) - - def flush(self) -> None: - output = "".join(self.__buffer) - if output: - self.__console.print(output) - del self.__buffer[:] - - def fileno(self) -> int: - return self.__file.fileno() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/filesize.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/filesize.py deleted file mode 100644 index 99f118e..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/filesize.py +++ /dev/null @@ -1,89 +0,0 @@ -# coding: utf-8 -"""Functions for reporting filesizes. Borrowed from https://github.com/PyFilesystem/pyfilesystem2 - -The functions declared in this module should cover the different -use cases needed to generate a string representation of a file size -using several different units. Since there are many standards regarding -file size units, three different functions have been implemented. - -See Also: - * `Wikipedia: Binary prefix <https://en.wikipedia.org/wiki/Binary_prefix>`_ - -""" - -__all__ = ["decimal"] - -from typing import Iterable, List, Optional, Tuple - - -def _to_str( - size: int, - suffixes: Iterable[str], - base: int, - *, - precision: Optional[int] = 1, - separator: Optional[str] = " ", -) -> str: - if size == 1: - return "1 byte" - elif size < base: - return "{:,} bytes".format(size) - - for i, suffix in enumerate(suffixes, 2): # noqa: B007 - unit = base**i - if size < unit: - break - return "{:,.{precision}f}{separator}{}".format( - (base * size / unit), - suffix, - precision=precision, - separator=separator, - ) - - -def pick_unit_and_suffix(size: int, suffixes: List[str], base: int) -> Tuple[int, str]: - """Pick a suffix and base for the given size.""" - for i, suffix in enumerate(suffixes): - unit = base**i - if size < unit * base: - break - return unit, suffix - - -def decimal( - size: int, - *, - precision: Optional[int] = 1, - separator: Optional[str] = " ", -) -> str: - """Convert a filesize in to a string (powers of 1000, SI prefixes). - - In this convention, ``1000 B = 1 kB``. - - This is typically the format used to advertise the storage - capacity of USB flash drives and the like (*256 MB* meaning - actually a storage capacity of more than *256 000 000 B*), - or used by **Mac OS X** since v10.6 to report file sizes. - - Arguments: - int (size): A file size. - int (precision): The number of decimal places to include (default = 1). - str (separator): The string to separate the value from the units (default = " "). - - Returns: - `str`: A string containing a abbreviated file size and units. - - Example: - >>> filesize.decimal(30000) - '30.0 kB' - >>> filesize.decimal(30000, precision=2, separator="") - '30.00kB' - - """ - return _to_str( - size, - ("kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"), - 1000, - precision=precision, - separator=separator, - ) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py deleted file mode 100644 index c264679..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py +++ /dev/null @@ -1,232 +0,0 @@ -import re -from abc import ABC, abstractmethod -from typing import List, Union - -from .text import Span, Text - - -def _combine_regex(*regexes: str) -> str: - """Combine a number of regexes in to a single regex. - - Returns: - str: New regex with all regexes ORed together. - """ - return "|".join(regexes) - - -class Highlighter(ABC): - """Abstract base class for highlighters.""" - - def __call__(self, text: Union[str, Text]) -> Text: - """Highlight a str or Text instance. - - Args: - text (Union[str, ~Text]): Text to highlight. - - Raises: - TypeError: If not called with text or str. - - Returns: - Text: A test instance with highlighting applied. - """ - if isinstance(text, str): - highlight_text = Text(text) - elif isinstance(text, Text): - highlight_text = text.copy() - else: - raise TypeError(f"str or Text instance required, not {text!r}") - self.highlight(highlight_text) - return highlight_text - - @abstractmethod - def highlight(self, text: Text) -> None: - """Apply highlighting in place to text. - - Args: - text (~Text): A text object highlight. - """ - - -class NullHighlighter(Highlighter): - """A highlighter object that doesn't highlight. - - May be used to disable highlighting entirely. - - """ - - def highlight(self, text: Text) -> None: - """Nothing to do""" - - -class RegexHighlighter(Highlighter): - """Applies highlighting from a list of regular expressions.""" - - highlights: List[str] = [] - base_style: str = "" - - def highlight(self, text: Text) -> None: - """Highlight :class:`rich.text.Text` using regular expressions. - - Args: - text (~Text): Text to highlighted. - - """ - - highlight_regex = text.highlight_regex - for re_highlight in self.highlights: - highlight_regex(re_highlight, style_prefix=self.base_style) - - -class ReprHighlighter(RegexHighlighter): - """Highlights the text typically produced from ``__repr__`` methods.""" - - base_style = "repr." - highlights = [ - r"(?P<tag_start><)(?P<tag_name>[-\w.:|]*)(?P<tag_contents>[\w\W]*)(?P<tag_end>>)", - r'(?P<attrib_name>[\w_]{1,50})=(?P<attrib_value>"?[\w_]+"?)?', - r"(?P<brace>[][{}()])", - _combine_regex( - r"(?P<ipv4>[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})", - r"(?P<ipv6>([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4})", - r"(?P<eui64>(?:[0-9A-Fa-f]{1,2}-){7}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{1,2}:){7}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{4}\.){3}[0-9A-Fa-f]{4})", - r"(?P<eui48>(?:[0-9A-Fa-f]{1,2}-){5}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{1,2}:){5}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})", - r"(?P<uuid>[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12})", - r"(?P<call>[\w.]*?)\(", - r"\b(?P<bool_true>True)\b|\b(?P<bool_false>False)\b|\b(?P<none>None)\b", - r"(?P<ellipsis>\.\.\.)", - r"(?P<number_complex>(?<!\w)(?:\-?[0-9]+\.?[0-9]*(?:e[-+]?\d+?)?)(?:[-+](?:[0-9]+\.?[0-9]*(?:e[-+]?\d+)?))?j)", - r"(?P<number>(?<!\w)\-?[0-9]+\.?[0-9]*(e[-+]?\d+?)?\b|0x[0-9a-fA-F]*)", - r"(?P<path>\B(/[-\w._+]+)*\/)(?P<filename>[-\w._+]*)?", - r"(?<![\\\w])(?P<str>b?'''.*?(?<!\\)'''|b?'.*?(?<!\\)'|b?\"\"\".*?(?<!\\)\"\"\"|b?\".*?(?<!\\)\")", - r"(?P<url>(file|https|http|ws|wss)://[-0-9a-zA-Z$_+!`(),.?/;:&=%#]*)", - ), - ] - - -class JSONHighlighter(RegexHighlighter): - """Highlights JSON""" - - # Captures the start and end of JSON strings, handling escaped quotes - JSON_STR = r"(?<![\\\w])(?P<str>b?\".*?(?<!\\)\")" - JSON_WHITESPACE = {" ", "\n", "\r", "\t"} - - base_style = "json." - highlights = [ - _combine_regex( - r"(?P<brace>[\{\[\(\)\]\}])", - r"\b(?P<bool_true>true)\b|\b(?P<bool_false>false)\b|\b(?P<null>null)\b", - r"(?P<number>(?<!\w)\-?[0-9]+\.?[0-9]*(e[\-\+]?\d+?)?\b|0x[0-9a-fA-F]*)", - JSON_STR, - ), - ] - - def highlight(self, text: Text) -> None: - super().highlight(text) - - # Additional work to handle highlighting JSON keys - plain = text.plain - append = text.spans.append - whitespace = self.JSON_WHITESPACE - for match in re.finditer(self.JSON_STR, plain): - start, end = match.span() - cursor = end - while cursor < len(plain): - char = plain[cursor] - cursor += 1 - if char == ":": - append(Span(start, end, "json.key")) - elif char in whitespace: - continue - break - - -class ISO8601Highlighter(RegexHighlighter): - """Highlights the ISO8601 date time strings. - Regex reference: https://www.oreilly.com/library/view/regular-expressions-cookbook/9781449327453/ch04s07.html - """ - - base_style = "iso8601." - highlights = [ - # - # Dates - # - # Calendar month (e.g. 2008-08). The hyphen is required - r"^(?P<year>[0-9]{4})-(?P<month>1[0-2]|0[1-9])$", - # Calendar date w/o hyphens (e.g. 20080830) - r"^(?P<date>(?P<year>[0-9]{4})(?P<month>1[0-2]|0[1-9])(?P<day>3[01]|0[1-9]|[12][0-9]))$", - # Ordinal date (e.g. 2008-243). The hyphen is optional - r"^(?P<date>(?P<year>[0-9]{4})-?(?P<day>36[0-6]|3[0-5][0-9]|[12][0-9]{2}|0[1-9][0-9]|00[1-9]))$", - # - # Weeks - # - # Week of the year (e.g., 2008-W35). The hyphen is optional - r"^(?P<date>(?P<year>[0-9]{4})-?W(?P<week>5[0-3]|[1-4][0-9]|0[1-9]))$", - # Week date (e.g., 2008-W35-6). The hyphens are optional - r"^(?P<date>(?P<year>[0-9]{4})-?W(?P<week>5[0-3]|[1-4][0-9]|0[1-9])-?(?P<day>[1-7]))$", - # - # Times - # - # Hours and minutes (e.g., 17:21). The colon is optional - r"^(?P<time>(?P<hour>2[0-3]|[01][0-9]):?(?P<minute>[0-5][0-9]))$", - # Hours, minutes, and seconds w/o colons (e.g., 172159) - r"^(?P<time>(?P<hour>2[0-3]|[01][0-9])(?P<minute>[0-5][0-9])(?P<second>[0-5][0-9]))$", - # Time zone designator (e.g., Z, +07 or +07:00). The colons and the minutes are optional - r"^(?P<timezone>(Z|[+-](?:2[0-3]|[01][0-9])(?::?(?:[0-5][0-9]))?))$", - # Hours, minutes, and seconds with time zone designator (e.g., 17:21:59+07:00). - # All the colons are optional. The minutes in the time zone designator are also optional - r"^(?P<time>(?P<hour>2[0-3]|[01][0-9])(?P<minute>[0-5][0-9])(?P<second>[0-5][0-9]))(?P<timezone>Z|[+-](?:2[0-3]|[01][0-9])(?::?(?:[0-5][0-9]))?)$", - # - # Date and Time - # - # Calendar date with hours, minutes, and seconds (e.g., 2008-08-30 17:21:59 or 20080830 172159). - # A space is required between the date and the time. The hyphens and colons are optional. - # This regex matches dates and times that specify some hyphens or colons but omit others. - # This does not follow ISO 8601 - r"^(?P<date>(?P<year>[0-9]{4})(?P<hyphen>-)?(?P<month>1[0-2]|0[1-9])(?(hyphen)-)(?P<day>3[01]|0[1-9]|[12][0-9])) (?P<time>(?P<hour>2[0-3]|[01][0-9])(?(hyphen):)(?P<minute>[0-5][0-9])(?(hyphen):)(?P<second>[0-5][0-9]))$", - # - # XML Schema dates and times - # - # Date, with optional time zone (e.g., 2008-08-30 or 2008-08-30+07:00). - # Hyphens are required. This is the XML Schema 'date' type - r"^(?P<date>(?P<year>-?(?:[1-9][0-9]*)?[0-9]{4})-(?P<month>1[0-2]|0[1-9])-(?P<day>3[01]|0[1-9]|[12][0-9]))(?P<timezone>Z|[+-](?:2[0-3]|[01][0-9]):[0-5][0-9])?$", - # Time, with optional fractional seconds and time zone (e.g., 01:45:36 or 01:45:36.123+07:00). - # There is no limit on the number of digits for the fractional seconds. This is the XML Schema 'time' type - r"^(?P<time>(?P<hour>2[0-3]|[01][0-9]):(?P<minute>[0-5][0-9]):(?P<second>[0-5][0-9])(?P<frac>\.[0-9]+)?)(?P<timezone>Z|[+-](?:2[0-3]|[01][0-9]):[0-5][0-9])?$", - # Date and time, with optional fractional seconds and time zone (e.g., 2008-08-30T01:45:36 or 2008-08-30T01:45:36.123Z). - # This is the XML Schema 'dateTime' type - r"^(?P<date>(?P<year>-?(?:[1-9][0-9]*)?[0-9]{4})-(?P<month>1[0-2]|0[1-9])-(?P<day>3[01]|0[1-9]|[12][0-9]))T(?P<time>(?P<hour>2[0-3]|[01][0-9]):(?P<minute>[0-5][0-9]):(?P<second>[0-5][0-9])(?P<ms>\.[0-9]+)?)(?P<timezone>Z|[+-](?:2[0-3]|[01][0-9]):[0-5][0-9])?$", - ] - - -if __name__ == "__main__": # pragma: no cover - from .console import Console - - console = Console() - console.print("[bold green]hello world![/bold green]") - console.print("'[bold green]hello world![/bold green]'") - - console.print(" /foo") - console.print("/foo/") - console.print("/foo/bar") - console.print("foo/bar/baz") - - console.print("/foo/bar/baz?foo=bar+egg&egg=baz") - console.print("/foo/bar/baz/") - console.print("/foo/bar/baz/egg") - console.print("/foo/bar/baz/egg.py") - console.print("/foo/bar/baz/egg.py word") - console.print(" /foo/bar/baz/egg.py word") - console.print("foo /foo/bar/baz/egg.py word") - console.print("foo /foo/bar/ba._++z/egg+.py word") - console.print("https://example.org?foo=bar#header") - - console.print(1234567.34) - console.print(1 / 2) - console.print(-1 / 123123123123) - - console.print( - "127.0.1.1 bar 192.168.1.4 2001:0db8:85a3:0000:0000:8a2e:0370:7334 foo" - ) - import json - - console.print_json(json.dumps(obj={"name": "apple", "count": 1}), indent=None) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/json.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/json.py deleted file mode 100644 index ea94493..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/json.py +++ /dev/null @@ -1,140 +0,0 @@ -from pathlib import Path -from json import loads, dumps -from typing import Any, Callable, Optional, Union - -from .text import Text -from .highlighter import JSONHighlighter, NullHighlighter - - -class JSON: - """A renderable which pretty prints JSON. - - Args: - json (str): JSON encoded data. - indent (Union[None, int, str], optional): Number of characters to indent by. Defaults to 2. - highlight (bool, optional): Enable highlighting. Defaults to True. - skip_keys (bool, optional): Skip keys not of a basic type. Defaults to False. - ensure_ascii (bool, optional): Escape all non-ascii characters. Defaults to False. - check_circular (bool, optional): Check for circular references. Defaults to True. - allow_nan (bool, optional): Allow NaN and Infinity values. Defaults to True. - default (Callable, optional): A callable that converts values that can not be encoded - in to something that can be JSON encoded. Defaults to None. - sort_keys (bool, optional): Sort dictionary keys. Defaults to False. - """ - - def __init__( - self, - json: str, - indent: Union[None, int, str] = 2, - highlight: bool = True, - skip_keys: bool = False, - ensure_ascii: bool = False, - check_circular: bool = True, - allow_nan: bool = True, - default: Optional[Callable[[Any], Any]] = None, - sort_keys: bool = False, - ) -> None: - data = loads(json) - json = dumps( - data, - indent=indent, - skipkeys=skip_keys, - ensure_ascii=ensure_ascii, - check_circular=check_circular, - allow_nan=allow_nan, - default=default, - sort_keys=sort_keys, - ) - highlighter = JSONHighlighter() if highlight else NullHighlighter() - self.text = highlighter(json) - self.text.no_wrap = True - self.text.overflow = None - - @classmethod - def from_data( - cls, - data: Any, - indent: Union[None, int, str] = 2, - highlight: bool = True, - skip_keys: bool = False, - ensure_ascii: bool = False, - check_circular: bool = True, - allow_nan: bool = True, - default: Optional[Callable[[Any], Any]] = None, - sort_keys: bool = False, - ) -> "JSON": - """Encodes a JSON object from arbitrary data. - - Args: - data (Any): An object that may be encoded in to JSON - indent (Union[None, int, str], optional): Number of characters to indent by. Defaults to 2. - highlight (bool, optional): Enable highlighting. Defaults to True. - default (Callable, optional): Optional callable which will be called for objects that cannot be serialized. Defaults to None. - skip_keys (bool, optional): Skip keys not of a basic type. Defaults to False. - ensure_ascii (bool, optional): Escape all non-ascii characters. Defaults to False. - check_circular (bool, optional): Check for circular references. Defaults to True. - allow_nan (bool, optional): Allow NaN and Infinity values. Defaults to True. - default (Callable, optional): A callable that converts values that can not be encoded - in to something that can be JSON encoded. Defaults to None. - sort_keys (bool, optional): Sort dictionary keys. Defaults to False. - - Returns: - JSON: New JSON object from the given data. - """ - json_instance: "JSON" = cls.__new__(cls) - json = dumps( - data, - indent=indent, - skipkeys=skip_keys, - ensure_ascii=ensure_ascii, - check_circular=check_circular, - allow_nan=allow_nan, - default=default, - sort_keys=sort_keys, - ) - highlighter = JSONHighlighter() if highlight else NullHighlighter() - json_instance.text = highlighter(json) - json_instance.text.no_wrap = True - json_instance.text.overflow = None - return json_instance - - def __rich__(self) -> Text: - return self.text - - -if __name__ == "__main__": - - import argparse - import sys - - parser = argparse.ArgumentParser(description="Pretty print json") - parser.add_argument( - "path", - metavar="PATH", - help="path to file, or - for stdin", - ) - parser.add_argument( - "-i", - "--indent", - metavar="SPACES", - type=int, - help="Number of spaces in an indent", - default=2, - ) - args = parser.parse_args() - - from pip._vendor.rich.console import Console - - console = Console() - error_console = Console(stderr=True) - - try: - if args.path == "-": - json_data = sys.stdin.read() - else: - json_data = Path(args.path).read_text() - except Exception as error: - error_console.print(f"Unable to read {args.path!r}; {error}") - sys.exit(-1) - - console.print(JSON(json_data, indent=args.indent), soft_wrap=True) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/jupyter.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/jupyter.py deleted file mode 100644 index 22f4d71..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/jupyter.py +++ /dev/null @@ -1,101 +0,0 @@ -from typing import TYPE_CHECKING, Any, Dict, Iterable, List, Sequence - -if TYPE_CHECKING: - from pip._vendor.rich.console import ConsoleRenderable - -from . import get_console -from .segment import Segment -from .terminal_theme import DEFAULT_TERMINAL_THEME - -if TYPE_CHECKING: - from pip._vendor.rich.console import ConsoleRenderable - -JUPYTER_HTML_FORMAT = """\ -<pre style="white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace">{code}</pre> -""" - - -class JupyterRenderable: - """A shim to write html to Jupyter notebook.""" - - def __init__(self, html: str, text: str) -> None: - self.html = html - self.text = text - - def _repr_mimebundle_( - self, include: Sequence[str], exclude: Sequence[str], **kwargs: Any - ) -> Dict[str, str]: - data = {"text/plain": self.text, "text/html": self.html} - if include: - data = {k: v for (k, v) in data.items() if k in include} - if exclude: - data = {k: v for (k, v) in data.items() if k not in exclude} - return data - - -class JupyterMixin: - """Add to an Rich renderable to make it render in Jupyter notebook.""" - - __slots__ = () - - def _repr_mimebundle_( - self: "ConsoleRenderable", - include: Sequence[str], - exclude: Sequence[str], - **kwargs: Any, - ) -> Dict[str, str]: - console = get_console() - segments = list(console.render(self, console.options)) - html = _render_segments(segments) - text = console._render_buffer(segments) - data = {"text/plain": text, "text/html": html} - if include: - data = {k: v for (k, v) in data.items() if k in include} - if exclude: - data = {k: v for (k, v) in data.items() if k not in exclude} - return data - - -def _render_segments(segments: Iterable[Segment]) -> str: - def escape(text: str) -> str: - """Escape html.""" - return text.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;") - - fragments: List[str] = [] - append_fragment = fragments.append - theme = DEFAULT_TERMINAL_THEME - for text, style, control in Segment.simplify(segments): - if control: - continue - text = escape(text) - if style: - rule = style.get_html_style(theme) - text = f'<span style="{rule}">{text}</span>' if rule else text - if style.link: - text = f'<a href="{style.link}" target="_blank">{text}</a>' - append_fragment(text) - - code = "".join(fragments) - html = JUPYTER_HTML_FORMAT.format(code=code) - - return html - - -def display(segments: Iterable[Segment], text: str) -> None: - """Render segments to Jupyter.""" - html = _render_segments(segments) - jupyter_renderable = JupyterRenderable(html, text) - try: - from IPython.display import display as ipython_display - - ipython_display(jupyter_renderable) - except ModuleNotFoundError: - # Handle the case where the Console has force_jupyter=True, - # but IPython is not installed. - pass - - -def print(*args: Any, **kwargs: Any) -> None: - """Proxy for Console print.""" - console = get_console() - return console.print(*args, **kwargs) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/layout.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/layout.py deleted file mode 100644 index 849356e..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/layout.py +++ /dev/null @@ -1,443 +0,0 @@ -from abc import ABC, abstractmethod -from itertools import islice -from operator import itemgetter -from threading import RLock -from typing import ( - TYPE_CHECKING, - Dict, - Iterable, - List, - NamedTuple, - Optional, - Sequence, - Tuple, - Union, -) - -from ._ratio import ratio_resolve -from .align import Align -from .console import Console, ConsoleOptions, RenderableType, RenderResult -from .highlighter import ReprHighlighter -from .panel import Panel -from .pretty import Pretty -from .region import Region -from .repr import Result, rich_repr -from .segment import Segment -from .style import StyleType - -if TYPE_CHECKING: - from pip._vendor.rich.tree import Tree - - -class LayoutRender(NamedTuple): - """An individual layout render.""" - - region: Region - render: List[List[Segment]] - - -RegionMap = Dict["Layout", Region] -RenderMap = Dict["Layout", LayoutRender] - - -class LayoutError(Exception): - """Layout related error.""" - - -class NoSplitter(LayoutError): - """Requested splitter does not exist.""" - - -class _Placeholder: - """An internal renderable used as a Layout placeholder.""" - - highlighter = ReprHighlighter() - - def __init__(self, layout: "Layout", style: StyleType = "") -> None: - self.layout = layout - self.style = style - - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - width = options.max_width - height = options.height or options.size.height - layout = self.layout - title = ( - f"{layout.name!r} ({width} x {height})" - if layout.name - else f"({width} x {height})" - ) - yield Panel( - Align.center(Pretty(layout), vertical="middle"), - style=self.style, - title=self.highlighter(title), - border_style="blue", - height=height, - ) - - -class Splitter(ABC): - """Base class for a splitter.""" - - name: str = "" - - @abstractmethod - def get_tree_icon(self) -> str: - """Get the icon (emoji) used in layout.tree""" - - @abstractmethod - def divide( - self, children: Sequence["Layout"], region: Region - ) -> Iterable[Tuple["Layout", Region]]: - """Divide a region amongst several child layouts. - - Args: - children (Sequence(Layout)): A number of child layouts. - region (Region): A rectangular region to divide. - """ - - -class RowSplitter(Splitter): - """Split a layout region in to rows.""" - - name = "row" - - def get_tree_icon(self) -> str: - return "[layout.tree.row]⬌" - - def divide( - self, children: Sequence["Layout"], region: Region - ) -> Iterable[Tuple["Layout", Region]]: - x, y, width, height = region - render_widths = ratio_resolve(width, children) - offset = 0 - _Region = Region - for child, child_width in zip(children, render_widths): - yield child, _Region(x + offset, y, child_width, height) - offset += child_width - - -class ColumnSplitter(Splitter): - """Split a layout region in to columns.""" - - name = "column" - - def get_tree_icon(self) -> str: - return "[layout.tree.column]⬍" - - def divide( - self, children: Sequence["Layout"], region: Region - ) -> Iterable[Tuple["Layout", Region]]: - x, y, width, height = region - render_heights = ratio_resolve(height, children) - offset = 0 - _Region = Region - for child, child_height in zip(children, render_heights): - yield child, _Region(x, y + offset, width, child_height) - offset += child_height - - -@rich_repr -class Layout: - """A renderable to divide a fixed height in to rows or columns. - - Args: - renderable (RenderableType, optional): Renderable content, or None for placeholder. Defaults to None. - name (str, optional): Optional identifier for Layout. Defaults to None. - size (int, optional): Optional fixed size of layout. Defaults to None. - minimum_size (int, optional): Minimum size of layout. Defaults to 1. - ratio (int, optional): Optional ratio for flexible layout. Defaults to 1. - visible (bool, optional): Visibility of layout. Defaults to True. - """ - - splitters = {"row": RowSplitter, "column": ColumnSplitter} - - def __init__( - self, - renderable: Optional[RenderableType] = None, - *, - name: Optional[str] = None, - size: Optional[int] = None, - minimum_size: int = 1, - ratio: int = 1, - visible: bool = True, - ) -> None: - self._renderable = renderable or _Placeholder(self) - self.size = size - self.minimum_size = minimum_size - self.ratio = ratio - self.name = name - self.visible = visible - self.splitter: Splitter = self.splitters["column"]() - self._children: List[Layout] = [] - self._render_map: RenderMap = {} - self._lock = RLock() - - def __rich_repr__(self) -> Result: - yield "name", self.name, None - yield "size", self.size, None - yield "minimum_size", self.minimum_size, 1 - yield "ratio", self.ratio, 1 - - @property - def renderable(self) -> RenderableType: - """Layout renderable.""" - return self if self._children else self._renderable - - @property - def children(self) -> List["Layout"]: - """Gets (visible) layout children.""" - return [child for child in self._children if child.visible] - - @property - def map(self) -> RenderMap: - """Get a map of the last render.""" - return self._render_map - - def get(self, name: str) -> Optional["Layout"]: - """Get a named layout, or None if it doesn't exist. - - Args: - name (str): Name of layout. - - Returns: - Optional[Layout]: Layout instance or None if no layout was found. - """ - if self.name == name: - return self - else: - for child in self._children: - named_layout = child.get(name) - if named_layout is not None: - return named_layout - return None - - def __getitem__(self, name: str) -> "Layout": - layout = self.get(name) - if layout is None: - raise KeyError(f"No layout with name {name!r}") - return layout - - @property - def tree(self) -> "Tree": - """Get a tree renderable to show layout structure.""" - from pip._vendor.rich.styled import Styled - from pip._vendor.rich.table import Table - from pip._vendor.rich.tree import Tree - - def summary(layout: "Layout") -> Table: - - icon = layout.splitter.get_tree_icon() - - table = Table.grid(padding=(0, 1, 0, 0)) - - text: RenderableType = ( - Pretty(layout) if layout.visible else Styled(Pretty(layout), "dim") - ) - table.add_row(icon, text) - _summary = table - return _summary - - layout = self - tree = Tree( - summary(layout), - guide_style=f"layout.tree.{layout.splitter.name}", - highlight=True, - ) - - def recurse(tree: "Tree", layout: "Layout") -> None: - for child in layout._children: - recurse( - tree.add( - summary(child), - guide_style=f"layout.tree.{child.splitter.name}", - ), - child, - ) - - recurse(tree, self) - return tree - - def split( - self, - *layouts: Union["Layout", RenderableType], - splitter: Union[Splitter, str] = "column", - ) -> None: - """Split the layout in to multiple sub-layouts. - - Args: - *layouts (Layout): Positional arguments should be (sub) Layout instances. - splitter (Union[Splitter, str]): Splitter instance or name of splitter. - """ - _layouts = [ - layout if isinstance(layout, Layout) else Layout(layout) - for layout in layouts - ] - try: - self.splitter = ( - splitter - if isinstance(splitter, Splitter) - else self.splitters[splitter]() - ) - except KeyError: - raise NoSplitter(f"No splitter called {splitter!r}") - self._children[:] = _layouts - - def add_split(self, *layouts: Union["Layout", RenderableType]) -> None: - """Add a new layout(s) to existing split. - - Args: - *layouts (Union[Layout, RenderableType]): Positional arguments should be renderables or (sub) Layout instances. - - """ - _layouts = ( - layout if isinstance(layout, Layout) else Layout(layout) - for layout in layouts - ) - self._children.extend(_layouts) - - def split_row(self, *layouts: Union["Layout", RenderableType]) -> None: - """Split the layout in to a row (layouts side by side). - - Args: - *layouts (Layout): Positional arguments should be (sub) Layout instances. - """ - self.split(*layouts, splitter="row") - - def split_column(self, *layouts: Union["Layout", RenderableType]) -> None: - """Split the layout in to a column (layouts stacked on top of each other). - - Args: - *layouts (Layout): Positional arguments should be (sub) Layout instances. - """ - self.split(*layouts, splitter="column") - - def unsplit(self) -> None: - """Reset splits to initial state.""" - del self._children[:] - - def update(self, renderable: RenderableType) -> None: - """Update renderable. - - Args: - renderable (RenderableType): New renderable object. - """ - with self._lock: - self._renderable = renderable - - def refresh_screen(self, console: "Console", layout_name: str) -> None: - """Refresh a sub-layout. - - Args: - console (Console): Console instance where Layout is to be rendered. - layout_name (str): Name of layout. - """ - with self._lock: - layout = self[layout_name] - region, _lines = self._render_map[layout] - (x, y, width, height) = region - lines = console.render_lines( - layout, console.options.update_dimensions(width, height) - ) - self._render_map[layout] = LayoutRender(region, lines) - console.update_screen_lines(lines, x, y) - - def _make_region_map(self, width: int, height: int) -> RegionMap: - """Create a dict that maps layout on to Region.""" - stack: List[Tuple[Layout, Region]] = [(self, Region(0, 0, width, height))] - push = stack.append - pop = stack.pop - layout_regions: List[Tuple[Layout, Region]] = [] - append_layout_region = layout_regions.append - while stack: - append_layout_region(pop()) - layout, region = layout_regions[-1] - children = layout.children - if children: - for child_and_region in layout.splitter.divide(children, region): - push(child_and_region) - - region_map = { - layout: region - for layout, region in sorted(layout_regions, key=itemgetter(1)) - } - return region_map - - def render(self, console: Console, options: ConsoleOptions) -> RenderMap: - """Render the sub_layouts. - - Args: - console (Console): Console instance. - options (ConsoleOptions): Console options. - - Returns: - RenderMap: A dict that maps Layout on to a tuple of Region, lines - """ - render_width = options.max_width - render_height = options.height or console.height - region_map = self._make_region_map(render_width, render_height) - layout_regions = [ - (layout, region) - for layout, region in region_map.items() - if not layout.children - ] - render_map: Dict["Layout", "LayoutRender"] = {} - render_lines = console.render_lines - update_dimensions = options.update_dimensions - - for layout, region in layout_regions: - lines = render_lines( - layout.renderable, update_dimensions(region.width, region.height) - ) - render_map[layout] = LayoutRender(region, lines) - return render_map - - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - with self._lock: - width = options.max_width or console.width - height = options.height or console.height - render_map = self.render(console, options.update_dimensions(width, height)) - self._render_map = render_map - layout_lines: List[List[Segment]] = [[] for _ in range(height)] - _islice = islice - for (region, lines) in render_map.values(): - _x, y, _layout_width, layout_height = region - for row, line in zip( - _islice(layout_lines, y, y + layout_height), lines - ): - row.extend(line) - - new_line = Segment.line() - for layout_row in layout_lines: - yield from layout_row - yield new_line - - -if __name__ == "__main__": - from pip._vendor.rich.console import Console - - console = Console() - layout = Layout() - - layout.split_column( - Layout(name="header", size=3), - Layout(ratio=1, name="main"), - Layout(size=10, name="footer"), - ) - - layout["main"].split_row(Layout(name="side"), Layout(name="body", ratio=2)) - - layout["body"].split_row(Layout(name="content", ratio=2), Layout(name="s2")) - - layout["s2"].split_column( - Layout(name="top"), Layout(name="middle"), Layout(name="bottom") - ) - - layout["side"].split_column(Layout(layout.tree, name="left1"), Layout(name="left2")) - - layout["content"].update("foo") - - console.print(layout) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/live.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/live.py deleted file mode 100644 index 3ebbbc4..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/live.py +++ /dev/null @@ -1,375 +0,0 @@ -import sys -from threading import Event, RLock, Thread -from types import TracebackType -from typing import IO, Any, Callable, List, Optional, TextIO, Type, cast - -from . import get_console -from .console import Console, ConsoleRenderable, RenderableType, RenderHook -from .control import Control -from .file_proxy import FileProxy -from .jupyter import JupyterMixin -from .live_render import LiveRender, VerticalOverflowMethod -from .screen import Screen -from .text import Text - - -class _RefreshThread(Thread): - """A thread that calls refresh() at regular intervals.""" - - def __init__(self, live: "Live", refresh_per_second: float) -> None: - self.live = live - self.refresh_per_second = refresh_per_second - self.done = Event() - super().__init__(daemon=True) - - def stop(self) -> None: - self.done.set() - - def run(self) -> None: - while not self.done.wait(1 / self.refresh_per_second): - with self.live._lock: - if not self.done.is_set(): - self.live.refresh() - - -class Live(JupyterMixin, RenderHook): - """Renders an auto-updating live display of any given renderable. - - Args: - renderable (RenderableType, optional): The renderable to live display. Defaults to displaying nothing. - console (Console, optional): Optional Console instance. Default will an internal Console instance writing to stdout. - screen (bool, optional): Enable alternate screen mode. Defaults to False. - auto_refresh (bool, optional): Enable auto refresh. If disabled, you will need to call `refresh()` or `update()` with refresh flag. Defaults to True - refresh_per_second (float, optional): Number of times per second to refresh the live display. Defaults to 4. - transient (bool, optional): Clear the renderable on exit (has no effect when screen=True). Defaults to False. - redirect_stdout (bool, optional): Enable redirection of stdout, so ``print`` may be used. Defaults to True. - redirect_stderr (bool, optional): Enable redirection of stderr. Defaults to True. - vertical_overflow (VerticalOverflowMethod, optional): How to handle renderable when it is too tall for the console. Defaults to "ellipsis". - get_renderable (Callable[[], RenderableType], optional): Optional callable to get renderable. Defaults to None. - """ - - def __init__( - self, - renderable: Optional[RenderableType] = None, - *, - console: Optional[Console] = None, - screen: bool = False, - auto_refresh: bool = True, - refresh_per_second: float = 4, - transient: bool = False, - redirect_stdout: bool = True, - redirect_stderr: bool = True, - vertical_overflow: VerticalOverflowMethod = "ellipsis", - get_renderable: Optional[Callable[[], RenderableType]] = None, - ) -> None: - assert refresh_per_second > 0, "refresh_per_second must be > 0" - self._renderable = renderable - self.console = console if console is not None else get_console() - self._screen = screen - self._alt_screen = False - - self._redirect_stdout = redirect_stdout - self._redirect_stderr = redirect_stderr - self._restore_stdout: Optional[IO[str]] = None - self._restore_stderr: Optional[IO[str]] = None - - self._lock = RLock() - self.ipy_widget: Optional[Any] = None - self.auto_refresh = auto_refresh - self._started: bool = False - self.transient = True if screen else transient - - self._refresh_thread: Optional[_RefreshThread] = None - self.refresh_per_second = refresh_per_second - - self.vertical_overflow = vertical_overflow - self._get_renderable = get_renderable - self._live_render = LiveRender( - self.get_renderable(), vertical_overflow=vertical_overflow - ) - - @property - def is_started(self) -> bool: - """Check if live display has been started.""" - return self._started - - def get_renderable(self) -> RenderableType: - renderable = ( - self._get_renderable() - if self._get_renderable is not None - else self._renderable - ) - return renderable or "" - - def start(self, refresh: bool = False) -> None: - """Start live rendering display. - - Args: - refresh (bool, optional): Also refresh. Defaults to False. - """ - with self._lock: - if self._started: - return - self.console.set_live(self) - self._started = True - if self._screen: - self._alt_screen = self.console.set_alt_screen(True) - self.console.show_cursor(False) - self._enable_redirect_io() - self.console.push_render_hook(self) - if refresh: - try: - self.refresh() - except Exception: - # If refresh fails, we want to stop the redirection of sys.stderr, - # so the error stacktrace is properly displayed in the terminal. - # (or, if the code that calls Rich captures the exception and wants to display something, - # let this be displayed in the terminal). - self.stop() - raise - if self.auto_refresh: - self._refresh_thread = _RefreshThread(self, self.refresh_per_second) - self._refresh_thread.start() - - def stop(self) -> None: - """Stop live rendering display.""" - with self._lock: - if not self._started: - return - self.console.clear_live() - self._started = False - - if self.auto_refresh and self._refresh_thread is not None: - self._refresh_thread.stop() - self._refresh_thread = None - # allow it to fully render on the last even if overflow - self.vertical_overflow = "visible" - with self.console: - try: - if not self._alt_screen and not self.console.is_jupyter: - self.refresh() - finally: - self._disable_redirect_io() - self.console.pop_render_hook() - if not self._alt_screen and self.console.is_terminal: - self.console.line() - self.console.show_cursor(True) - if self._alt_screen: - self.console.set_alt_screen(False) - - if self.transient and not self._alt_screen: - self.console.control(self._live_render.restore_cursor()) - if self.ipy_widget is not None and self.transient: - self.ipy_widget.close() # pragma: no cover - - def __enter__(self) -> "Live": - self.start(refresh=self._renderable is not None) - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - self.stop() - - def _enable_redirect_io(self) -> None: - """Enable redirecting of stdout / stderr.""" - if self.console.is_terminal or self.console.is_jupyter: - if self._redirect_stdout and not isinstance(sys.stdout, FileProxy): - self._restore_stdout = sys.stdout - sys.stdout = cast("TextIO", FileProxy(self.console, sys.stdout)) - if self._redirect_stderr and not isinstance(sys.stderr, FileProxy): - self._restore_stderr = sys.stderr - sys.stderr = cast("TextIO", FileProxy(self.console, sys.stderr)) - - def _disable_redirect_io(self) -> None: - """Disable redirecting of stdout / stderr.""" - if self._restore_stdout: - sys.stdout = cast("TextIO", self._restore_stdout) - self._restore_stdout = None - if self._restore_stderr: - sys.stderr = cast("TextIO", self._restore_stderr) - self._restore_stderr = None - - @property - def renderable(self) -> RenderableType: - """Get the renderable that is being displayed - - Returns: - RenderableType: Displayed renderable. - """ - renderable = self.get_renderable() - return Screen(renderable) if self._alt_screen else renderable - - def update(self, renderable: RenderableType, *, refresh: bool = False) -> None: - """Update the renderable that is being displayed - - Args: - renderable (RenderableType): New renderable to use. - refresh (bool, optional): Refresh the display. Defaults to False. - """ - if isinstance(renderable, str): - renderable = self.console.render_str(renderable) - with self._lock: - self._renderable = renderable - if refresh: - self.refresh() - - def refresh(self) -> None: - """Update the display of the Live Render.""" - with self._lock: - self._live_render.set_renderable(self.renderable) - if self.console.is_jupyter: # pragma: no cover - try: - from IPython.display import display - from ipywidgets import Output - except ImportError: - import warnings - - warnings.warn('install "ipywidgets" for Jupyter support') - else: - if self.ipy_widget is None: - self.ipy_widget = Output() - display(self.ipy_widget) - - with self.ipy_widget: - self.ipy_widget.clear_output(wait=True) - self.console.print(self._live_render.renderable) - elif self.console.is_terminal and not self.console.is_dumb_terminal: - with self.console: - self.console.print(Control()) - elif ( - not self._started and not self.transient - ): # if it is finished allow files or dumb-terminals to see final result - with self.console: - self.console.print(Control()) - - def process_renderables( - self, renderables: List[ConsoleRenderable] - ) -> List[ConsoleRenderable]: - """Process renderables to restore cursor and display progress.""" - self._live_render.vertical_overflow = self.vertical_overflow - if self.console.is_interactive: - # lock needs acquiring as user can modify live_render renderable at any time unlike in Progress. - with self._lock: - reset = ( - Control.home() - if self._alt_screen - else self._live_render.position_cursor() - ) - renderables = [reset, *renderables, self._live_render] - elif ( - not self._started and not self.transient - ): # if it is finished render the final output for files or dumb_terminals - renderables = [*renderables, self._live_render] - - return renderables - - -if __name__ == "__main__": # pragma: no cover - import random - import time - from itertools import cycle - from typing import Dict, List, Tuple - - from .align import Align - from .console import Console - from .live import Live as Live - from .panel import Panel - from .rule import Rule - from .syntax import Syntax - from .table import Table - - console = Console() - - syntax = Syntax( - '''def loop_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]: - """Iterate and generate a tuple with a flag for last value.""" - iter_values = iter(values) - try: - previous_value = next(iter_values) - except StopIteration: - return - for value in iter_values: - yield False, previous_value - previous_value = value - yield True, previous_value''', - "python", - line_numbers=True, - ) - - table = Table("foo", "bar", "baz") - table.add_row("1", "2", "3") - - progress_renderables = [ - "You can make the terminal shorter and taller to see the live table hide" - "Text may be printed while the progress bars are rendering.", - Panel("In fact, [i]any[/i] renderable will work"), - "Such as [magenta]tables[/]...", - table, - "Pretty printed structures...", - {"type": "example", "text": "Pretty printed"}, - "Syntax...", - syntax, - Rule("Give it a try!"), - ] - - examples = cycle(progress_renderables) - - exchanges = [ - "SGD", - "MYR", - "EUR", - "USD", - "AUD", - "JPY", - "CNH", - "HKD", - "CAD", - "INR", - "DKK", - "GBP", - "RUB", - "NZD", - "MXN", - "IDR", - "TWD", - "THB", - "VND", - ] - with Live(console=console) as live_table: - exchange_rate_dict: Dict[Tuple[str, str], float] = {} - - for index in range(100): - select_exchange = exchanges[index % len(exchanges)] - - for exchange in exchanges: - if exchange == select_exchange: - continue - time.sleep(0.4) - if random.randint(0, 10) < 1: - console.log(next(examples)) - exchange_rate_dict[(select_exchange, exchange)] = 200 / ( - (random.random() * 320) + 1 - ) - if len(exchange_rate_dict) > len(exchanges) - 1: - exchange_rate_dict.pop(list(exchange_rate_dict.keys())[0]) - table = Table(title="Exchange Rates") - - table.add_column("Source Currency") - table.add_column("Destination Currency") - table.add_column("Exchange Rate") - - for ((source, dest), exchange_rate) in exchange_rate_dict.items(): - table.add_row( - source, - dest, - Text( - f"{exchange_rate:.4f}", - style="red" if exchange_rate < 1.0 else "green", - ), - ) - - live_table.update(Align.center(table)) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/live_render.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/live_render.py deleted file mode 100644 index b90fbf7..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/live_render.py +++ /dev/null @@ -1,113 +0,0 @@ -import sys -from typing import Optional, Tuple - -if sys.version_info >= (3, 8): - from typing import Literal -else: - from pip._vendor.typing_extensions import Literal # pragma: no cover - - -from ._loop import loop_last -from .console import Console, ConsoleOptions, RenderableType, RenderResult -from .control import Control -from .segment import ControlType, Segment -from .style import StyleType -from .text import Text - -VerticalOverflowMethod = Literal["crop", "ellipsis", "visible"] - - -class LiveRender: - """Creates a renderable that may be updated. - - Args: - renderable (RenderableType): Any renderable object. - style (StyleType, optional): An optional style to apply to the renderable. Defaults to "". - """ - - def __init__( - self, - renderable: RenderableType, - style: StyleType = "", - vertical_overflow: VerticalOverflowMethod = "ellipsis", - ) -> None: - self.renderable = renderable - self.style = style - self.vertical_overflow = vertical_overflow - self._shape: Optional[Tuple[int, int]] = None - - def set_renderable(self, renderable: RenderableType) -> None: - """Set a new renderable. - - Args: - renderable (RenderableType): Any renderable object, including str. - """ - self.renderable = renderable - - def position_cursor(self) -> Control: - """Get control codes to move cursor to beginning of live render. - - Returns: - Control: A control instance that may be printed. - """ - if self._shape is not None: - _, height = self._shape - return Control( - ControlType.CARRIAGE_RETURN, - (ControlType.ERASE_IN_LINE, 2), - *( - ( - (ControlType.CURSOR_UP, 1), - (ControlType.ERASE_IN_LINE, 2), - ) - * (height - 1) - ) - ) - return Control() - - def restore_cursor(self) -> Control: - """Get control codes to clear the render and restore the cursor to its previous position. - - Returns: - Control: A Control instance that may be printed. - """ - if self._shape is not None: - _, height = self._shape - return Control( - ControlType.CARRIAGE_RETURN, - *((ControlType.CURSOR_UP, 1), (ControlType.ERASE_IN_LINE, 2)) * height - ) - return Control() - - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - - renderable = self.renderable - style = console.get_style(self.style) - lines = console.render_lines(renderable, options, style=style, pad=False) - shape = Segment.get_shape(lines) - - _, height = shape - if height > options.size.height: - if self.vertical_overflow == "crop": - lines = lines[: options.size.height] - shape = Segment.get_shape(lines) - elif self.vertical_overflow == "ellipsis": - lines = lines[: (options.size.height - 1)] - overflow_text = Text( - "...", - overflow="crop", - justify="center", - end="", - style="live.ellipsis", - ) - lines.append(list(console.render(overflow_text))) - shape = Segment.get_shape(lines) - self._shape = shape - - new_line = Segment.line() - for last, line in loop_last(lines): - yield from line - if not last: - yield new_line diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/logging.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/logging.py deleted file mode 100644 index 91368dd..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/logging.py +++ /dev/null @@ -1,289 +0,0 @@ -import logging -from datetime import datetime -from logging import Handler, LogRecord -from pathlib import Path -from types import ModuleType -from typing import ClassVar, Iterable, List, Optional, Type, Union - -from pip._vendor.rich._null_file import NullFile - -from . import get_console -from ._log_render import FormatTimeCallable, LogRender -from .console import Console, ConsoleRenderable -from .highlighter import Highlighter, ReprHighlighter -from .text import Text -from .traceback import Traceback - - -class RichHandler(Handler): - """A logging handler that renders output with Rich. The time / level / message and file are displayed in columns. - The level is color coded, and the message is syntax highlighted. - - Note: - Be careful when enabling console markup in log messages if you have configured logging for libraries not - under your control. If a dependency writes messages containing square brackets, it may not produce the intended output. - - Args: - level (Union[int, str], optional): Log level. Defaults to logging.NOTSET. - console (:class:`~rich.console.Console`, optional): Optional console instance to write logs. - Default will use a global console instance writing to stdout. - show_time (bool, optional): Show a column for the time. Defaults to True. - omit_repeated_times (bool, optional): Omit repetition of the same time. Defaults to True. - show_level (bool, optional): Show a column for the level. Defaults to True. - show_path (bool, optional): Show the path to the original log call. Defaults to True. - enable_link_path (bool, optional): Enable terminal link of path column to file. Defaults to True. - highlighter (Highlighter, optional): Highlighter to style log messages, or None to use ReprHighlighter. Defaults to None. - markup (bool, optional): Enable console markup in log messages. Defaults to False. - rich_tracebacks (bool, optional): Enable rich tracebacks with syntax highlighting and formatting. Defaults to False. - tracebacks_width (Optional[int], optional): Number of characters used to render tracebacks, or None for full width. Defaults to None. - tracebacks_extra_lines (int, optional): Additional lines of code to render tracebacks, or None for full width. Defaults to None. - tracebacks_theme (str, optional): Override pygments theme used in traceback. - tracebacks_word_wrap (bool, optional): Enable word wrapping of long tracebacks lines. Defaults to True. - tracebacks_show_locals (bool, optional): Enable display of locals in tracebacks. Defaults to False. - tracebacks_suppress (Sequence[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback. - locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. - Defaults to 10. - locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80. - log_time_format (Union[str, TimeFormatterCallable], optional): If ``log_time`` is enabled, either string for strftime or callable that formats the time. Defaults to "[%x %X] ". - keywords (List[str], optional): List of words to highlight instead of ``RichHandler.KEYWORDS``. - """ - - KEYWORDS: ClassVar[Optional[List[str]]] = [ - "GET", - "POST", - "HEAD", - "PUT", - "DELETE", - "OPTIONS", - "TRACE", - "PATCH", - ] - HIGHLIGHTER_CLASS: ClassVar[Type[Highlighter]] = ReprHighlighter - - def __init__( - self, - level: Union[int, str] = logging.NOTSET, - console: Optional[Console] = None, - *, - show_time: bool = True, - omit_repeated_times: bool = True, - show_level: bool = True, - show_path: bool = True, - enable_link_path: bool = True, - highlighter: Optional[Highlighter] = None, - markup: bool = False, - rich_tracebacks: bool = False, - tracebacks_width: Optional[int] = None, - tracebacks_extra_lines: int = 3, - tracebacks_theme: Optional[str] = None, - tracebacks_word_wrap: bool = True, - tracebacks_show_locals: bool = False, - tracebacks_suppress: Iterable[Union[str, ModuleType]] = (), - locals_max_length: int = 10, - locals_max_string: int = 80, - log_time_format: Union[str, FormatTimeCallable] = "[%x %X]", - keywords: Optional[List[str]] = None, - ) -> None: - super().__init__(level=level) - self.console = console or get_console() - self.highlighter = highlighter or self.HIGHLIGHTER_CLASS() - self._log_render = LogRender( - show_time=show_time, - show_level=show_level, - show_path=show_path, - time_format=log_time_format, - omit_repeated_times=omit_repeated_times, - level_width=None, - ) - self.enable_link_path = enable_link_path - self.markup = markup - self.rich_tracebacks = rich_tracebacks - self.tracebacks_width = tracebacks_width - self.tracebacks_extra_lines = tracebacks_extra_lines - self.tracebacks_theme = tracebacks_theme - self.tracebacks_word_wrap = tracebacks_word_wrap - self.tracebacks_show_locals = tracebacks_show_locals - self.tracebacks_suppress = tracebacks_suppress - self.locals_max_length = locals_max_length - self.locals_max_string = locals_max_string - self.keywords = keywords - - def get_level_text(self, record: LogRecord) -> Text: - """Get the level name from the record. - - Args: - record (LogRecord): LogRecord instance. - - Returns: - Text: A tuple of the style and level name. - """ - level_name = record.levelname - level_text = Text.styled( - level_name.ljust(8), f"logging.level.{level_name.lower()}" - ) - return level_text - - def emit(self, record: LogRecord) -> None: - """Invoked by logging.""" - message = self.format(record) - traceback = None - if ( - self.rich_tracebacks - and record.exc_info - and record.exc_info != (None, None, None) - ): - exc_type, exc_value, exc_traceback = record.exc_info - assert exc_type is not None - assert exc_value is not None - traceback = Traceback.from_exception( - exc_type, - exc_value, - exc_traceback, - width=self.tracebacks_width, - extra_lines=self.tracebacks_extra_lines, - theme=self.tracebacks_theme, - word_wrap=self.tracebacks_word_wrap, - show_locals=self.tracebacks_show_locals, - locals_max_length=self.locals_max_length, - locals_max_string=self.locals_max_string, - suppress=self.tracebacks_suppress, - ) - message = record.getMessage() - if self.formatter: - record.message = record.getMessage() - formatter = self.formatter - if hasattr(formatter, "usesTime") and formatter.usesTime(): - record.asctime = formatter.formatTime(record, formatter.datefmt) - message = formatter.formatMessage(record) - - message_renderable = self.render_message(record, message) - log_renderable = self.render( - record=record, traceback=traceback, message_renderable=message_renderable - ) - if isinstance(self.console.file, NullFile): - # Handles pythonw, where stdout/stderr are null, and we return NullFile - # instance from Console.file. In this case, we still want to make a log record - # even though we won't be writing anything to a file. - self.handleError(record) - else: - try: - self.console.print(log_renderable) - except Exception: - self.handleError(record) - - def render_message(self, record: LogRecord, message: str) -> "ConsoleRenderable": - """Render message text in to Text. - - Args: - record (LogRecord): logging Record. - message (str): String containing log message. - - Returns: - ConsoleRenderable: Renderable to display log message. - """ - use_markup = getattr(record, "markup", self.markup) - message_text = Text.from_markup(message) if use_markup else Text(message) - - highlighter = getattr(record, "highlighter", self.highlighter) - if highlighter: - message_text = highlighter(message_text) - - if self.keywords is None: - self.keywords = self.KEYWORDS - - if self.keywords: - message_text.highlight_words(self.keywords, "logging.keyword") - - return message_text - - def render( - self, - *, - record: LogRecord, - traceback: Optional[Traceback], - message_renderable: "ConsoleRenderable", - ) -> "ConsoleRenderable": - """Render log for display. - - Args: - record (LogRecord): logging Record. - traceback (Optional[Traceback]): Traceback instance or None for no Traceback. - message_renderable (ConsoleRenderable): Renderable (typically Text) containing log message contents. - - Returns: - ConsoleRenderable: Renderable to display log. - """ - path = Path(record.pathname).name - level = self.get_level_text(record) - time_format = None if self.formatter is None else self.formatter.datefmt - log_time = datetime.fromtimestamp(record.created) - - log_renderable = self._log_render( - self.console, - [message_renderable] if not traceback else [message_renderable, traceback], - log_time=log_time, - time_format=time_format, - level=level, - path=path, - line_no=record.lineno, - link_path=record.pathname if self.enable_link_path else None, - ) - return log_renderable - - -if __name__ == "__main__": # pragma: no cover - from time import sleep - - FORMAT = "%(message)s" - # FORMAT = "%(asctime)-15s - %(levelname)s - %(message)s" - logging.basicConfig( - level="NOTSET", - format=FORMAT, - datefmt="[%X]", - handlers=[RichHandler(rich_tracebacks=True, tracebacks_show_locals=True)], - ) - log = logging.getLogger("rich") - - log.info("Server starting...") - log.info("Listening on http://127.0.0.1:8080") - sleep(1) - - log.info("GET /index.html 200 1298") - log.info("GET /imgs/backgrounds/back1.jpg 200 54386") - log.info("GET /css/styles.css 200 54386") - log.warning("GET /favicon.ico 404 242") - sleep(1) - - log.debug( - "JSONRPC request\n--> %r\n<-- %r", - { - "version": "1.1", - "method": "confirmFruitPurchase", - "params": [["apple", "orange", "mangoes", "pomelo"], 1.123], - "id": "194521489", - }, - {"version": "1.1", "result": True, "error": None, "id": "194521489"}, - ) - log.debug( - "Loading configuration file /adasd/asdasd/qeqwe/qwrqwrqwr/sdgsdgsdg/werwerwer/dfgerert/ertertert/ertetert/werwerwer" - ) - log.error("Unable to find 'pomelo' in database!") - log.info("POST /jsonrpc/ 200 65532") - log.info("POST /admin/ 401 42234") - log.warning("password was rejected for admin site.") - - def divide() -> None: - number = 1 - divisor = 0 - foos = ["foo"] * 100 - log.debug("in divide") - try: - number / divisor - except: - log.exception("An error of some kind occurred!") - - divide() - sleep(1) - log.critical("Out of memory!") - log.info("Server exited with code=-1") - log.info("[bold]EXITING...[/bold]", extra=dict(markup=True)) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/markup.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/markup.py deleted file mode 100644 index fd80d8c..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/markup.py +++ /dev/null @@ -1,246 +0,0 @@ -import re -from ast import literal_eval -from operator import attrgetter -from typing import Callable, Iterable, List, Match, NamedTuple, Optional, Tuple, Union - -from ._emoji_replace import _emoji_replace -from .emoji import EmojiVariant -from .errors import MarkupError -from .style import Style -from .text import Span, Text - -RE_TAGS = re.compile( - r"""((\\*)\[([a-z#/@][^[]*?)])""", - re.VERBOSE, -) - -RE_HANDLER = re.compile(r"^([\w.]*?)(\(.*?\))?$") - - -class Tag(NamedTuple): - """A tag in console markup.""" - - name: str - """The tag name. e.g. 'bold'.""" - parameters: Optional[str] - """Any additional parameters after the name.""" - - def __str__(self) -> str: - return ( - self.name if self.parameters is None else f"{self.name} {self.parameters}" - ) - - @property - def markup(self) -> str: - """Get the string representation of this tag.""" - return ( - f"[{self.name}]" - if self.parameters is None - else f"[{self.name}={self.parameters}]" - ) - - -_ReStringMatch = Match[str] # regex match object -_ReSubCallable = Callable[[_ReStringMatch], str] # Callable invoked by re.sub -_EscapeSubMethod = Callable[[_ReSubCallable, str], str] # Sub method of a compiled re - - -def escape( - markup: str, - _escape: _EscapeSubMethod = re.compile(r"(\\*)(\[[a-z#/@][^[]*?])").sub, -) -> str: - """Escapes text so that it won't be interpreted as markup. - - Args: - markup (str): Content to be inserted in to markup. - - Returns: - str: Markup with square brackets escaped. - """ - - def escape_backslashes(match: Match[str]) -> str: - """Called by re.sub replace matches.""" - backslashes, text = match.groups() - return f"{backslashes}{backslashes}\\{text}" - - markup = _escape(escape_backslashes, markup) - return markup - - -def _parse(markup: str) -> Iterable[Tuple[int, Optional[str], Optional[Tag]]]: - """Parse markup in to an iterable of tuples of (position, text, tag). - - Args: - markup (str): A string containing console markup - - """ - position = 0 - _divmod = divmod - _Tag = Tag - for match in RE_TAGS.finditer(markup): - full_text, escapes, tag_text = match.groups() - start, end = match.span() - if start > position: - yield start, markup[position:start], None - if escapes: - backslashes, escaped = _divmod(len(escapes), 2) - if backslashes: - # Literal backslashes - yield start, "\\" * backslashes, None - start += backslashes * 2 - if escaped: - # Escape of tag - yield start, full_text[len(escapes) :], None - position = end - continue - text, equals, parameters = tag_text.partition("=") - yield start, None, _Tag(text, parameters if equals else None) - position = end - if position < len(markup): - yield position, markup[position:], None - - -def render( - markup: str, - style: Union[str, Style] = "", - emoji: bool = True, - emoji_variant: Optional[EmojiVariant] = None, -) -> Text: - """Render console markup in to a Text instance. - - Args: - markup (str): A string containing console markup. - emoji (bool, optional): Also render emoji code. Defaults to True. - - Raises: - MarkupError: If there is a syntax error in the markup. - - Returns: - Text: A test instance. - """ - emoji_replace = _emoji_replace - if "[" not in markup: - return Text( - emoji_replace(markup, default_variant=emoji_variant) if emoji else markup, - style=style, - ) - text = Text(style=style) - append = text.append - normalize = Style.normalize - - style_stack: List[Tuple[int, Tag]] = [] - pop = style_stack.pop - - spans: List[Span] = [] - append_span = spans.append - - _Span = Span - _Tag = Tag - - def pop_style(style_name: str) -> Tuple[int, Tag]: - """Pop tag matching given style name.""" - for index, (_, tag) in enumerate(reversed(style_stack), 1): - if tag.name == style_name: - return pop(-index) - raise KeyError(style_name) - - for position, plain_text, tag in _parse(markup): - if plain_text is not None: - # Handle open brace escapes, where the brace is not part of a tag. - plain_text = plain_text.replace("\\[", "[") - append(emoji_replace(plain_text) if emoji else plain_text) - elif tag is not None: - if tag.name.startswith("/"): # Closing tag - style_name = tag.name[1:].strip() - - if style_name: # explicit close - style_name = normalize(style_name) - try: - start, open_tag = pop_style(style_name) - except KeyError: - raise MarkupError( - f"closing tag '{tag.markup}' at position {position} doesn't match any open tag" - ) from None - else: # implicit close - try: - start, open_tag = pop() - except IndexError: - raise MarkupError( - f"closing tag '[/]' at position {position} has nothing to close" - ) from None - - if open_tag.name.startswith("@"): - if open_tag.parameters: - handler_name = "" - parameters = open_tag.parameters.strip() - handler_match = RE_HANDLER.match(parameters) - if handler_match is not None: - handler_name, match_parameters = handler_match.groups() - parameters = ( - "()" if match_parameters is None else match_parameters - ) - - try: - meta_params = literal_eval(parameters) - except SyntaxError as error: - raise MarkupError( - f"error parsing {parameters!r} in {open_tag.parameters!r}; {error.msg}" - ) - except Exception as error: - raise MarkupError( - f"error parsing {open_tag.parameters!r}; {error}" - ) from None - - if handler_name: - meta_params = ( - handler_name, - meta_params - if isinstance(meta_params, tuple) - else (meta_params,), - ) - - else: - meta_params = () - - append_span( - _Span( - start, len(text), Style(meta={open_tag.name: meta_params}) - ) - ) - else: - append_span(_Span(start, len(text), str(open_tag))) - - else: # Opening tag - normalized_tag = _Tag(normalize(tag.name), tag.parameters) - style_stack.append((len(text), normalized_tag)) - - text_length = len(text) - while style_stack: - start, tag = style_stack.pop() - style = str(tag) - if style: - append_span(_Span(start, text_length, style)) - - text.spans = sorted(spans[::-1], key=attrgetter("start")) - return text - - -if __name__ == "__main__": # pragma: no cover - - MARKUP = [ - "[red]Hello World[/red]", - "[magenta]Hello [b]World[/b]", - "[bold]Bold[italic] bold and italic [/bold]italic[/italic]", - "Click [link=https://www.willmcgugan.com]here[/link] to visit my Blog", - ":warning-emoji: [bold red blink] DANGER![/]", - ] - - from pip._vendor.rich import print - from pip._vendor.rich.table import Table - - grid = Table("Markup", "Result", padding=(0, 1)) - - for markup in MARKUP: - grid.add_row(Text(markup), markup) - - print(grid) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/measure.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/measure.py deleted file mode 100644 index a508ffa..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/measure.py +++ /dev/null @@ -1,151 +0,0 @@ -from operator import itemgetter -from typing import TYPE_CHECKING, Callable, NamedTuple, Optional, Sequence - -from . import errors -from .protocol import is_renderable, rich_cast - -if TYPE_CHECKING: - from .console import Console, ConsoleOptions, RenderableType - - -class Measurement(NamedTuple): - """Stores the minimum and maximum widths (in characters) required to render an object.""" - - minimum: int - """Minimum number of cells required to render.""" - maximum: int - """Maximum number of cells required to render.""" - - @property - def span(self) -> int: - """Get difference between maximum and minimum.""" - return self.maximum - self.minimum - - def normalize(self) -> "Measurement": - """Get measurement that ensures that minimum <= maximum and minimum >= 0 - - Returns: - Measurement: A normalized measurement. - """ - minimum, maximum = self - minimum = min(max(0, minimum), maximum) - return Measurement(max(0, minimum), max(0, max(minimum, maximum))) - - def with_maximum(self, width: int) -> "Measurement": - """Get a RenderableWith where the widths are <= width. - - Args: - width (int): Maximum desired width. - - Returns: - Measurement: New Measurement object. - """ - minimum, maximum = self - return Measurement(min(minimum, width), min(maximum, width)) - - def with_minimum(self, width: int) -> "Measurement": - """Get a RenderableWith where the widths are >= width. - - Args: - width (int): Minimum desired width. - - Returns: - Measurement: New Measurement object. - """ - minimum, maximum = self - width = max(0, width) - return Measurement(max(minimum, width), max(maximum, width)) - - def clamp( - self, min_width: Optional[int] = None, max_width: Optional[int] = None - ) -> "Measurement": - """Clamp a measurement within the specified range. - - Args: - min_width (int): Minimum desired width, or ``None`` for no minimum. Defaults to None. - max_width (int): Maximum desired width, or ``None`` for no maximum. Defaults to None. - - Returns: - Measurement: New Measurement object. - """ - measurement = self - if min_width is not None: - measurement = measurement.with_minimum(min_width) - if max_width is not None: - measurement = measurement.with_maximum(max_width) - return measurement - - @classmethod - def get( - cls, console: "Console", options: "ConsoleOptions", renderable: "RenderableType" - ) -> "Measurement": - """Get a measurement for a renderable. - - Args: - console (~rich.console.Console): Console instance. - options (~rich.console.ConsoleOptions): Console options. - renderable (RenderableType): An object that may be rendered with Rich. - - Raises: - errors.NotRenderableError: If the object is not renderable. - - Returns: - Measurement: Measurement object containing range of character widths required to render the object. - """ - _max_width = options.max_width - if _max_width < 1: - return Measurement(0, 0) - if isinstance(renderable, str): - renderable = console.render_str( - renderable, markup=options.markup, highlight=False - ) - renderable = rich_cast(renderable) - if is_renderable(renderable): - get_console_width: Optional[ - Callable[["Console", "ConsoleOptions"], "Measurement"] - ] = getattr(renderable, "__rich_measure__", None) - if get_console_width is not None: - render_width = ( - get_console_width(console, options) - .normalize() - .with_maximum(_max_width) - ) - if render_width.maximum < 1: - return Measurement(0, 0) - return render_width.normalize() - else: - return Measurement(0, _max_width) - else: - raise errors.NotRenderableError( - f"Unable to get render width for {renderable!r}; " - "a str, Segment, or object with __rich_console__ method is required" - ) - - -def measure_renderables( - console: "Console", - options: "ConsoleOptions", - renderables: Sequence["RenderableType"], -) -> "Measurement": - """Get a measurement that would fit a number of renderables. - - Args: - console (~rich.console.Console): Console instance. - options (~rich.console.ConsoleOptions): Console options. - renderables (Iterable[RenderableType]): One or more renderable objects. - - Returns: - Measurement: Measurement object containing range of character widths required to - contain all given renderables. - """ - if not renderables: - return Measurement(0, 0) - get_measurement = Measurement.get - measurements = [ - get_measurement(console, options, renderable) for renderable in renderables - ] - measured_width = Measurement( - max(measurements, key=itemgetter(0)).minimum, - max(measurements, key=itemgetter(1)).maximum, - ) - return measured_width diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/padding.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/padding.py deleted file mode 100644 index 1b2204f..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/padding.py +++ /dev/null @@ -1,141 +0,0 @@ -from typing import cast, List, Optional, Tuple, TYPE_CHECKING, Union - -if TYPE_CHECKING: - from .console import ( - Console, - ConsoleOptions, - RenderableType, - RenderResult, - ) -from .jupyter import JupyterMixin -from .measure import Measurement -from .style import Style -from .segment import Segment - - -PaddingDimensions = Union[int, Tuple[int], Tuple[int, int], Tuple[int, int, int, int]] - - -class Padding(JupyterMixin): - """Draw space around content. - - Example: - >>> print(Padding("Hello", (2, 4), style="on blue")) - - Args: - renderable (RenderableType): String or other renderable. - pad (Union[int, Tuple[int]]): Padding for top, right, bottom, and left borders. - May be specified with 1, 2, or 4 integers (CSS style). - style (Union[str, Style], optional): Style for padding characters. Defaults to "none". - expand (bool, optional): Expand padding to fit available width. Defaults to True. - """ - - def __init__( - self, - renderable: "RenderableType", - pad: "PaddingDimensions" = (0, 0, 0, 0), - *, - style: Union[str, Style] = "none", - expand: bool = True, - ): - self.renderable = renderable - self.top, self.right, self.bottom, self.left = self.unpack(pad) - self.style = style - self.expand = expand - - @classmethod - def indent(cls, renderable: "RenderableType", level: int) -> "Padding": - """Make padding instance to render an indent. - - Args: - renderable (RenderableType): String or other renderable. - level (int): Number of characters to indent. - - Returns: - Padding: A Padding instance. - """ - - return Padding(renderable, pad=(0, 0, 0, level), expand=False) - - @staticmethod - def unpack(pad: "PaddingDimensions") -> Tuple[int, int, int, int]: - """Unpack padding specified in CSS style.""" - if isinstance(pad, int): - return (pad, pad, pad, pad) - if len(pad) == 1: - _pad = pad[0] - return (_pad, _pad, _pad, _pad) - if len(pad) == 2: - pad_top, pad_right = cast(Tuple[int, int], pad) - return (pad_top, pad_right, pad_top, pad_right) - if len(pad) == 4: - top, right, bottom, left = cast(Tuple[int, int, int, int], pad) - return (top, right, bottom, left) - raise ValueError(f"1, 2 or 4 integers required for padding; {len(pad)} given") - - def __repr__(self) -> str: - return f"Padding({self.renderable!r}, ({self.top},{self.right},{self.bottom},{self.left}))" - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - style = console.get_style(self.style) - if self.expand: - width = options.max_width - else: - width = min( - Measurement.get(console, options, self.renderable).maximum - + self.left - + self.right, - options.max_width, - ) - render_options = options.update_width(width - self.left - self.right) - if render_options.height is not None: - render_options = render_options.update_height( - height=render_options.height - self.top - self.bottom - ) - lines = console.render_lines( - self.renderable, render_options, style=style, pad=True - ) - _Segment = Segment - - left = _Segment(" " * self.left, style) if self.left else None - right = ( - [_Segment(f'{" " * self.right}', style), _Segment.line()] - if self.right - else [_Segment.line()] - ) - blank_line: Optional[List[Segment]] = None - if self.top: - blank_line = [_Segment(f'{" " * width}\n', style)] - yield from blank_line * self.top - if left: - for line in lines: - yield left - yield from line - yield from right - else: - for line in lines: - yield from line - yield from right - if self.bottom: - blank_line = blank_line or [_Segment(f'{" " * width}\n', style)] - yield from blank_line * self.bottom - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> "Measurement": - max_width = options.max_width - extra_width = self.left + self.right - if max_width - extra_width < 1: - return Measurement(max_width, max_width) - measure_min, measure_max = Measurement.get(console, options, self.renderable) - measurement = Measurement(measure_min + extra_width, measure_max + extra_width) - measurement = measurement.with_maximum(max_width) - return measurement - - -if __name__ == "__main__": # pragma: no cover - from pip._vendor.rich import print - - print(Padding("Hello, World", (2, 4), style="on blue")) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/pager.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/pager.py deleted file mode 100644 index a3f7aa6..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/pager.py +++ /dev/null @@ -1,34 +0,0 @@ -from abc import ABC, abstractmethod -from typing import Any - - -class Pager(ABC): - """Base class for a pager.""" - - @abstractmethod - def show(self, content: str) -> None: - """Show content in pager. - - Args: - content (str): Content to be displayed. - """ - - -class SystemPager(Pager): - """Uses the pager installed on the system.""" - - def _pager(self, content: str) -> Any: #  pragma: no cover - return __import__("pydoc").pager(content) - - def show(self, content: str) -> None: - """Use the same pager used by pydoc.""" - self._pager(content) - - -if __name__ == "__main__": # pragma: no cover - from .__main__ import make_test_card - from .console import Console - - console = Console() - with console.pager(styles=True): - console.print(make_test_card()) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/palette.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/palette.py deleted file mode 100644 index fa0c4dd..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/palette.py +++ /dev/null @@ -1,100 +0,0 @@ -from math import sqrt -from functools import lru_cache -from typing import Sequence, Tuple, TYPE_CHECKING - -from .color_triplet import ColorTriplet - -if TYPE_CHECKING: - from pip._vendor.rich.table import Table - - -class Palette: - """A palette of available colors.""" - - def __init__(self, colors: Sequence[Tuple[int, int, int]]): - self._colors = colors - - def __getitem__(self, number: int) -> ColorTriplet: - return ColorTriplet(*self._colors[number]) - - def __rich__(self) -> "Table": - from pip._vendor.rich.color import Color - from pip._vendor.rich.style import Style - from pip._vendor.rich.text import Text - from pip._vendor.rich.table import Table - - table = Table( - "index", - "RGB", - "Color", - title="Palette", - caption=f"{len(self._colors)} colors", - highlight=True, - caption_justify="right", - ) - for index, color in enumerate(self._colors): - table.add_row( - str(index), - repr(color), - Text(" " * 16, style=Style(bgcolor=Color.from_rgb(*color))), - ) - return table - - # This is somewhat inefficient and needs caching - @lru_cache(maxsize=1024) - def match(self, color: Tuple[int, int, int]) -> int: - """Find a color from a palette that most closely matches a given color. - - Args: - color (Tuple[int, int, int]): RGB components in range 0 > 255. - - Returns: - int: Index of closes matching color. - """ - red1, green1, blue1 = color - _sqrt = sqrt - get_color = self._colors.__getitem__ - - def get_color_distance(index: int) -> float: - """Get the distance to a color.""" - red2, green2, blue2 = get_color(index) - red_mean = (red1 + red2) // 2 - red = red1 - red2 - green = green1 - green2 - blue = blue1 - blue2 - return _sqrt( - (((512 + red_mean) * red * red) >> 8) - + 4 * green * green - + (((767 - red_mean) * blue * blue) >> 8) - ) - - min_index = min(range(len(self._colors)), key=get_color_distance) - return min_index - - -if __name__ == "__main__": # pragma: no cover - import colorsys - from typing import Iterable - from pip._vendor.rich.color import Color - from pip._vendor.rich.console import Console, ConsoleOptions - from pip._vendor.rich.segment import Segment - from pip._vendor.rich.style import Style - - class ColorBox: - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> Iterable[Segment]: - height = console.size.height - 3 - for y in range(0, height): - for x in range(options.max_width): - h = x / options.max_width - l = y / (height + 1) - r1, g1, b1 = colorsys.hls_to_rgb(h, l, 1.0) - r2, g2, b2 = colorsys.hls_to_rgb(h, l + (1 / height / 2), 1.0) - bgcolor = Color.from_rgb(r1 * 255, g1 * 255, b1 * 255) - color = Color.from_rgb(r2 * 255, g2 * 255, b2 * 255) - yield Segment("▄", Style(color=color, bgcolor=bgcolor)) - yield Segment.line() - - console = Console() - console.print(ColorBox()) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/panel.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/panel.py deleted file mode 100644 index d522d80..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/panel.py +++ /dev/null @@ -1,308 +0,0 @@ -from typing import TYPE_CHECKING, Optional - -from .align import AlignMethod -from .box import ROUNDED, Box -from .cells import cell_len -from .jupyter import JupyterMixin -from .measure import Measurement, measure_renderables -from .padding import Padding, PaddingDimensions -from .segment import Segment -from .style import Style, StyleType -from .text import Text, TextType - -if TYPE_CHECKING: - from .console import Console, ConsoleOptions, RenderableType, RenderResult - - -class Panel(JupyterMixin): - """A console renderable that draws a border around its contents. - - Example: - >>> console.print(Panel("Hello, World!")) - - Args: - renderable (RenderableType): A console renderable object. - box (Box, optional): A Box instance that defines the look of the border (see :ref:`appendix_box`. - Defaults to box.ROUNDED. - safe_box (bool, optional): Disable box characters that don't display on windows legacy terminal with *raster* fonts. Defaults to True. - expand (bool, optional): If True the panel will stretch to fill the console - width, otherwise it will be sized to fit the contents. Defaults to True. - style (str, optional): The style of the panel (border and contents). Defaults to "none". - border_style (str, optional): The style of the border. Defaults to "none". - width (Optional[int], optional): Optional width of panel. Defaults to None to auto-detect. - height (Optional[int], optional): Optional height of panel. Defaults to None to auto-detect. - padding (Optional[PaddingDimensions]): Optional padding around renderable. Defaults to 0. - highlight (bool, optional): Enable automatic highlighting of panel title (if str). Defaults to False. - """ - - def __init__( - self, - renderable: "RenderableType", - box: Box = ROUNDED, - *, - title: Optional[TextType] = None, - title_align: AlignMethod = "center", - subtitle: Optional[TextType] = None, - subtitle_align: AlignMethod = "center", - safe_box: Optional[bool] = None, - expand: bool = True, - style: StyleType = "none", - border_style: StyleType = "none", - width: Optional[int] = None, - height: Optional[int] = None, - padding: PaddingDimensions = (0, 1), - highlight: bool = False, - ) -> None: - self.renderable = renderable - self.box = box - self.title = title - self.title_align: AlignMethod = title_align - self.subtitle = subtitle - self.subtitle_align = subtitle_align - self.safe_box = safe_box - self.expand = expand - self.style = style - self.border_style = border_style - self.width = width - self.height = height - self.padding = padding - self.highlight = highlight - - @classmethod - def fit( - cls, - renderable: "RenderableType", - box: Box = ROUNDED, - *, - title: Optional[TextType] = None, - title_align: AlignMethod = "center", - subtitle: Optional[TextType] = None, - subtitle_align: AlignMethod = "center", - safe_box: Optional[bool] = None, - style: StyleType = "none", - border_style: StyleType = "none", - width: Optional[int] = None, - padding: PaddingDimensions = (0, 1), - ) -> "Panel": - """An alternative constructor that sets expand=False.""" - return cls( - renderable, - box, - title=title, - title_align=title_align, - subtitle=subtitle, - subtitle_align=subtitle_align, - safe_box=safe_box, - style=style, - border_style=border_style, - width=width, - padding=padding, - expand=False, - ) - - @property - def _title(self) -> Optional[Text]: - if self.title: - title_text = ( - Text.from_markup(self.title) - if isinstance(self.title, str) - else self.title.copy() - ) - title_text.end = "" - title_text.plain = title_text.plain.replace("\n", " ") - title_text.no_wrap = True - title_text.expand_tabs() - title_text.pad(1) - return title_text - return None - - @property - def _subtitle(self) -> Optional[Text]: - if self.subtitle: - subtitle_text = ( - Text.from_markup(self.subtitle) - if isinstance(self.subtitle, str) - else self.subtitle.copy() - ) - subtitle_text.end = "" - subtitle_text.plain = subtitle_text.plain.replace("\n", " ") - subtitle_text.no_wrap = True - subtitle_text.expand_tabs() - subtitle_text.pad(1) - return subtitle_text - return None - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - _padding = Padding.unpack(self.padding) - renderable = ( - Padding(self.renderable, _padding) if any(_padding) else self.renderable - ) - style = console.get_style(self.style) - border_style = style + console.get_style(self.border_style) - width = ( - options.max_width - if self.width is None - else min(options.max_width, self.width) - ) - - safe_box: bool = console.safe_box if self.safe_box is None else self.safe_box - box = self.box.substitute(options, safe=safe_box) - - def align_text( - text: Text, width: int, align: str, character: str, style: Style - ) -> Text: - """Gets new aligned text. - - Args: - text (Text): Title or subtitle text. - width (int): Desired width. - align (str): Alignment. - character (str): Character for alignment. - style (Style): Border style - - Returns: - Text: New text instance - """ - text = text.copy() - text.truncate(width) - excess_space = width - cell_len(text.plain) - if excess_space: - if align == "left": - return Text.assemble( - text, - (character * excess_space, style), - no_wrap=True, - end="", - ) - elif align == "center": - left = excess_space // 2 - return Text.assemble( - (character * left, style), - text, - (character * (excess_space - left), style), - no_wrap=True, - end="", - ) - else: - return Text.assemble( - (character * excess_space, style), - text, - no_wrap=True, - end="", - ) - return text - - title_text = self._title - if title_text is not None: - title_text.stylize_before(border_style) - - child_width = ( - width - 2 - if self.expand - else console.measure( - renderable, options=options.update_width(width - 2) - ).maximum - ) - child_height = self.height or options.height or None - if child_height: - child_height -= 2 - if title_text is not None: - child_width = min( - options.max_width - 2, max(child_width, title_text.cell_len + 2) - ) - - width = child_width + 2 - child_options = options.update( - width=child_width, height=child_height, highlight=self.highlight - ) - lines = console.render_lines(renderable, child_options, style=style) - - line_start = Segment(box.mid_left, border_style) - line_end = Segment(f"{box.mid_right}", border_style) - new_line = Segment.line() - if title_text is None or width <= 4: - yield Segment(box.get_top([width - 2]), border_style) - else: - title_text = align_text( - title_text, - width - 4, - self.title_align, - box.top, - border_style, - ) - yield Segment(box.top_left + box.top, border_style) - yield from console.render(title_text, child_options.update_width(width - 4)) - yield Segment(box.top + box.top_right, border_style) - - yield new_line - for line in lines: - yield line_start - yield from line - yield line_end - yield new_line - - subtitle_text = self._subtitle - if subtitle_text is not None: - subtitle_text.stylize_before(border_style) - - if subtitle_text is None or width <= 4: - yield Segment(box.get_bottom([width - 2]), border_style) - else: - subtitle_text = align_text( - subtitle_text, - width - 4, - self.subtitle_align, - box.bottom, - border_style, - ) - yield Segment(box.bottom_left + box.bottom, border_style) - yield from console.render( - subtitle_text, child_options.update_width(width - 4) - ) - yield Segment(box.bottom + box.bottom_right, border_style) - - yield new_line - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> "Measurement": - _title = self._title - _, right, _, left = Padding.unpack(self.padding) - padding = left + right - renderables = [self.renderable, _title] if _title else [self.renderable] - - if self.width is None: - width = ( - measure_renderables( - console, - options.update_width(options.max_width - padding - 2), - renderables, - ).maximum - + padding - + 2 - ) - else: - width = self.width - return Measurement(width, width) - - -if __name__ == "__main__": # pragma: no cover - from .console import Console - - c = Console() - - from .box import DOUBLE, ROUNDED - from .padding import Padding - - p = Panel( - "Hello, World!", - title="rich.Panel", - style="white on blue", - box=DOUBLE, - padding=1, - ) - - c.print() - c.print(p) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py deleted file mode 100644 index 2bd9eb0..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py +++ /dev/null @@ -1,994 +0,0 @@ -import builtins -import collections -import dataclasses -import inspect -import os -import sys -from array import array -from collections import Counter, UserDict, UserList, defaultdict, deque -from dataclasses import dataclass, fields, is_dataclass -from inspect import isclass -from itertools import islice -from types import MappingProxyType -from typing import ( - TYPE_CHECKING, - Any, - Callable, - DefaultDict, - Dict, - Iterable, - List, - Optional, - Sequence, - Set, - Tuple, - Union, -) - -from pip._vendor.rich.repr import RichReprResult - -try: - import attr as _attr_module - - _has_attrs = hasattr(_attr_module, "ib") -except ImportError: # pragma: no cover - _has_attrs = False - -from . import get_console -from ._loop import loop_last -from ._pick import pick_bool -from .abc import RichRenderable -from .cells import cell_len -from .highlighter import ReprHighlighter -from .jupyter import JupyterMixin, JupyterRenderable -from .measure import Measurement -from .text import Text - -if TYPE_CHECKING: - from .console import ( - Console, - ConsoleOptions, - HighlighterType, - JustifyMethod, - OverflowMethod, - RenderResult, - ) - - -def _is_attr_object(obj: Any) -> bool: - """Check if an object was created with attrs module.""" - return _has_attrs and _attr_module.has(type(obj)) - - -def _get_attr_fields(obj: Any) -> Sequence["_attr_module.Attribute[Any]"]: - """Get fields for an attrs object.""" - return _attr_module.fields(type(obj)) if _has_attrs else [] - - -def _is_dataclass_repr(obj: object) -> bool: - """Check if an instance of a dataclass contains the default repr. - - Args: - obj (object): A dataclass instance. - - Returns: - bool: True if the default repr is used, False if there is a custom repr. - """ - # Digging in to a lot of internals here - # Catching all exceptions in case something is missing on a non CPython implementation - try: - return obj.__repr__.__code__.co_filename == dataclasses.__file__ - except Exception: # pragma: no coverage - return False - - -_dummy_namedtuple = collections.namedtuple("_dummy_namedtuple", []) - - -def _has_default_namedtuple_repr(obj: object) -> bool: - """Check if an instance of namedtuple contains the default repr - - Args: - obj (object): A namedtuple - - Returns: - bool: True if the default repr is used, False if there's a custom repr. - """ - obj_file = None - try: - obj_file = inspect.getfile(obj.__repr__) - except (OSError, TypeError): - # OSError handles case where object is defined in __main__ scope, e.g. REPL - no filename available. - # TypeError trapped defensively, in case of object without filename slips through. - pass - default_repr_file = inspect.getfile(_dummy_namedtuple.__repr__) - return obj_file == default_repr_file - - -def _ipy_display_hook( - value: Any, - console: Optional["Console"] = None, - overflow: "OverflowMethod" = "ignore", - crop: bool = False, - indent_guides: bool = False, - max_length: Optional[int] = None, - max_string: Optional[int] = None, - max_depth: Optional[int] = None, - expand_all: bool = False, -) -> Union[str, None]: - # needed here to prevent circular import: - from .console import ConsoleRenderable - - # always skip rich generated jupyter renderables or None values - if _safe_isinstance(value, JupyterRenderable) or value is None: - return None - - console = console or get_console() - - with console.capture() as capture: - # certain renderables should start on a new line - if _safe_isinstance(value, ConsoleRenderable): - console.line() - console.print( - value - if _safe_isinstance(value, RichRenderable) - else Pretty( - value, - overflow=overflow, - indent_guides=indent_guides, - max_length=max_length, - max_string=max_string, - max_depth=max_depth, - expand_all=expand_all, - margin=12, - ), - crop=crop, - new_line_start=True, - end="", - ) - # strip trailing newline, not usually part of a text repr - # I'm not sure if this should be prevented at a lower level - return capture.get().rstrip("\n") - - -def _safe_isinstance( - obj: object, class_or_tuple: Union[type, Tuple[type, ...]] -) -> bool: - """isinstance can fail in rare cases, for example types with no __class__""" - try: - return isinstance(obj, class_or_tuple) - except Exception: - return False - - -def install( - console: Optional["Console"] = None, - overflow: "OverflowMethod" = "ignore", - crop: bool = False, - indent_guides: bool = False, - max_length: Optional[int] = None, - max_string: Optional[int] = None, - max_depth: Optional[int] = None, - expand_all: bool = False, -) -> None: - """Install automatic pretty printing in the Python REPL. - - Args: - console (Console, optional): Console instance or ``None`` to use global console. Defaults to None. - overflow (Optional[OverflowMethod], optional): Overflow method. Defaults to "ignore". - crop (Optional[bool], optional): Enable cropping of long lines. Defaults to False. - indent_guides (bool, optional): Enable indentation guides. Defaults to False. - max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. - Defaults to None. - max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to None. - max_depth (int, optional): Maximum depth of nested data structures, or None for no maximum. Defaults to None. - expand_all (bool, optional): Expand all containers. Defaults to False. - max_frames (int): Maximum number of frames to show in a traceback, 0 for no maximum. Defaults to 100. - """ - from pip._vendor.rich import get_console - - console = console or get_console() - assert console is not None - - def display_hook(value: Any) -> None: - """Replacement sys.displayhook which prettifies objects with Rich.""" - if value is not None: - assert console is not None - builtins._ = None # type: ignore[attr-defined] - console.print( - value - if _safe_isinstance(value, RichRenderable) - else Pretty( - value, - overflow=overflow, - indent_guides=indent_guides, - max_length=max_length, - max_string=max_string, - max_depth=max_depth, - expand_all=expand_all, - ), - crop=crop, - ) - builtins._ = value # type: ignore[attr-defined] - - if "get_ipython" in globals(): - ip = get_ipython() # type: ignore[name-defined] - from IPython.core.formatters import BaseFormatter - - class RichFormatter(BaseFormatter): # type: ignore[misc] - pprint: bool = True - - def __call__(self, value: Any) -> Any: - if self.pprint: - return _ipy_display_hook( - value, - console=get_console(), - overflow=overflow, - indent_guides=indent_guides, - max_length=max_length, - max_string=max_string, - max_depth=max_depth, - expand_all=expand_all, - ) - else: - return repr(value) - - # replace plain text formatter with rich formatter - rich_formatter = RichFormatter() - ip.display_formatter.formatters["text/plain"] = rich_formatter - else: - sys.displayhook = display_hook - - -class Pretty(JupyterMixin): - """A rich renderable that pretty prints an object. - - Args: - _object (Any): An object to pretty print. - highlighter (HighlighterType, optional): Highlighter object to apply to result, or None for ReprHighlighter. Defaults to None. - indent_size (int, optional): Number of spaces in indent. Defaults to 4. - justify (JustifyMethod, optional): Justify method, or None for default. Defaults to None. - overflow (OverflowMethod, optional): Overflow method, or None for default. Defaults to None. - no_wrap (Optional[bool], optional): Disable word wrapping. Defaults to False. - indent_guides (bool, optional): Enable indentation guides. Defaults to False. - max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. - Defaults to None. - max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to None. - max_depth (int, optional): Maximum depth of nested data structures, or None for no maximum. Defaults to None. - expand_all (bool, optional): Expand all containers. Defaults to False. - margin (int, optional): Subtrace a margin from width to force containers to expand earlier. Defaults to 0. - insert_line (bool, optional): Insert a new line if the output has multiple new lines. Defaults to False. - """ - - def __init__( - self, - _object: Any, - highlighter: Optional["HighlighterType"] = None, - *, - indent_size: int = 4, - justify: Optional["JustifyMethod"] = None, - overflow: Optional["OverflowMethod"] = None, - no_wrap: Optional[bool] = False, - indent_guides: bool = False, - max_length: Optional[int] = None, - max_string: Optional[int] = None, - max_depth: Optional[int] = None, - expand_all: bool = False, - margin: int = 0, - insert_line: bool = False, - ) -> None: - self._object = _object - self.highlighter = highlighter or ReprHighlighter() - self.indent_size = indent_size - self.justify: Optional["JustifyMethod"] = justify - self.overflow: Optional["OverflowMethod"] = overflow - self.no_wrap = no_wrap - self.indent_guides = indent_guides - self.max_length = max_length - self.max_string = max_string - self.max_depth = max_depth - self.expand_all = expand_all - self.margin = margin - self.insert_line = insert_line - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - pretty_str = pretty_repr( - self._object, - max_width=options.max_width - self.margin, - indent_size=self.indent_size, - max_length=self.max_length, - max_string=self.max_string, - max_depth=self.max_depth, - expand_all=self.expand_all, - ) - pretty_text = Text.from_ansi( - pretty_str, - justify=self.justify or options.justify, - overflow=self.overflow or options.overflow, - no_wrap=pick_bool(self.no_wrap, options.no_wrap), - style="pretty", - ) - pretty_text = ( - self.highlighter(pretty_text) - if pretty_text - else Text( - f"{type(self._object)}.__repr__ returned empty string", - style="dim italic", - ) - ) - if self.indent_guides and not options.ascii_only: - pretty_text = pretty_text.with_indent_guides( - self.indent_size, style="repr.indent" - ) - if self.insert_line and "\n" in pretty_text: - yield "" - yield pretty_text - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> "Measurement": - pretty_str = pretty_repr( - self._object, - max_width=options.max_width, - indent_size=self.indent_size, - max_length=self.max_length, - max_string=self.max_string, - max_depth=self.max_depth, - expand_all=self.expand_all, - ) - text_width = ( - max(cell_len(line) for line in pretty_str.splitlines()) if pretty_str else 0 - ) - return Measurement(text_width, text_width) - - -def _get_braces_for_defaultdict(_object: DefaultDict[Any, Any]) -> Tuple[str, str, str]: - return ( - f"defaultdict({_object.default_factory!r}, {{", - "})", - f"defaultdict({_object.default_factory!r}, {{}})", - ) - - -def _get_braces_for_array(_object: "array[Any]") -> Tuple[str, str, str]: - return (f"array({_object.typecode!r}, [", "])", f"array({_object.typecode!r})") - - -_BRACES: Dict[type, Callable[[Any], Tuple[str, str, str]]] = { - os._Environ: lambda _object: ("environ({", "})", "environ({})"), - array: _get_braces_for_array, - defaultdict: _get_braces_for_defaultdict, - Counter: lambda _object: ("Counter({", "})", "Counter()"), - deque: lambda _object: ("deque([", "])", "deque()"), - dict: lambda _object: ("{", "}", "{}"), - UserDict: lambda _object: ("{", "}", "{}"), - frozenset: lambda _object: ("frozenset({", "})", "frozenset()"), - list: lambda _object: ("[", "]", "[]"), - UserList: lambda _object: ("[", "]", "[]"), - set: lambda _object: ("{", "}", "set()"), - tuple: lambda _object: ("(", ")", "()"), - MappingProxyType: lambda _object: ("mappingproxy({", "})", "mappingproxy({})"), -} -_CONTAINERS = tuple(_BRACES.keys()) -_MAPPING_CONTAINERS = (dict, os._Environ, MappingProxyType, UserDict) - - -def is_expandable(obj: Any) -> bool: - """Check if an object may be expanded by pretty print.""" - return ( - _safe_isinstance(obj, _CONTAINERS) - or (is_dataclass(obj)) - or (hasattr(obj, "__rich_repr__")) - or _is_attr_object(obj) - ) and not isclass(obj) - - -@dataclass -class Node: - """A node in a repr tree. May be atomic or a container.""" - - key_repr: str = "" - value_repr: str = "" - open_brace: str = "" - close_brace: str = "" - empty: str = "" - last: bool = False - is_tuple: bool = False - is_namedtuple: bool = False - children: Optional[List["Node"]] = None - key_separator: str = ": " - separator: str = ", " - - def iter_tokens(self) -> Iterable[str]: - """Generate tokens for this node.""" - if self.key_repr: - yield self.key_repr - yield self.key_separator - if self.value_repr: - yield self.value_repr - elif self.children is not None: - if self.children: - yield self.open_brace - if self.is_tuple and not self.is_namedtuple and len(self.children) == 1: - yield from self.children[0].iter_tokens() - yield "," - else: - for child in self.children: - yield from child.iter_tokens() - if not child.last: - yield self.separator - yield self.close_brace - else: - yield self.empty - - def check_length(self, start_length: int, max_length: int) -> bool: - """Check the length fits within a limit. - - Args: - start_length (int): Starting length of the line (indent, prefix, suffix). - max_length (int): Maximum length. - - Returns: - bool: True if the node can be rendered within max length, otherwise False. - """ - total_length = start_length - for token in self.iter_tokens(): - total_length += cell_len(token) - if total_length > max_length: - return False - return True - - def __str__(self) -> str: - repr_text = "".join(self.iter_tokens()) - return repr_text - - def render( - self, max_width: int = 80, indent_size: int = 4, expand_all: bool = False - ) -> str: - """Render the node to a pretty repr. - - Args: - max_width (int, optional): Maximum width of the repr. Defaults to 80. - indent_size (int, optional): Size of indents. Defaults to 4. - expand_all (bool, optional): Expand all levels. Defaults to False. - - Returns: - str: A repr string of the original object. - """ - lines = [_Line(node=self, is_root=True)] - line_no = 0 - while line_no < len(lines): - line = lines[line_no] - if line.expandable and not line.expanded: - if expand_all or not line.check_length(max_width): - lines[line_no : line_no + 1] = line.expand(indent_size) - line_no += 1 - - repr_str = "\n".join(str(line) for line in lines) - return repr_str - - -@dataclass -class _Line: - """A line in repr output.""" - - parent: Optional["_Line"] = None - is_root: bool = False - node: Optional[Node] = None - text: str = "" - suffix: str = "" - whitespace: str = "" - expanded: bool = False - last: bool = False - - @property - def expandable(self) -> bool: - """Check if the line may be expanded.""" - return bool(self.node is not None and self.node.children) - - def check_length(self, max_length: int) -> bool: - """Check this line fits within a given number of cells.""" - start_length = ( - len(self.whitespace) + cell_len(self.text) + cell_len(self.suffix) - ) - assert self.node is not None - return self.node.check_length(start_length, max_length) - - def expand(self, indent_size: int) -> Iterable["_Line"]: - """Expand this line by adding children on their own line.""" - node = self.node - assert node is not None - whitespace = self.whitespace - assert node.children - if node.key_repr: - new_line = yield _Line( - text=f"{node.key_repr}{node.key_separator}{node.open_brace}", - whitespace=whitespace, - ) - else: - new_line = yield _Line(text=node.open_brace, whitespace=whitespace) - child_whitespace = self.whitespace + " " * indent_size - tuple_of_one = node.is_tuple and len(node.children) == 1 - for last, child in loop_last(node.children): - separator = "," if tuple_of_one else node.separator - line = _Line( - parent=new_line, - node=child, - whitespace=child_whitespace, - suffix=separator, - last=last and not tuple_of_one, - ) - yield line - - yield _Line( - text=node.close_brace, - whitespace=whitespace, - suffix=self.suffix, - last=self.last, - ) - - def __str__(self) -> str: - if self.last: - return f"{self.whitespace}{self.text}{self.node or ''}" - else: - return ( - f"{self.whitespace}{self.text}{self.node or ''}{self.suffix.rstrip()}" - ) - - -def _is_namedtuple(obj: Any) -> bool: - """Checks if an object is most likely a namedtuple. It is possible - to craft an object that passes this check and isn't a namedtuple, but - there is only a minuscule chance of this happening unintentionally. - - Args: - obj (Any): The object to test - - Returns: - bool: True if the object is a namedtuple. False otherwise. - """ - try: - fields = getattr(obj, "_fields", None) - except Exception: - # Being very defensive - if we cannot get the attr then its not a namedtuple - return False - return isinstance(obj, tuple) and isinstance(fields, tuple) - - -def traverse( - _object: Any, - max_length: Optional[int] = None, - max_string: Optional[int] = None, - max_depth: Optional[int] = None, -) -> Node: - """Traverse object and generate a tree. - - Args: - _object (Any): Object to be traversed. - max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. - Defaults to None. - max_string (int, optional): Maximum length of string before truncating, or None to disable truncating. - Defaults to None. - max_depth (int, optional): Maximum depth of data structures, or None for no maximum. - Defaults to None. - - Returns: - Node: The root of a tree structure which can be used to render a pretty repr. - """ - - def to_repr(obj: Any) -> str: - """Get repr string for an object, but catch errors.""" - if ( - max_string is not None - and _safe_isinstance(obj, (bytes, str)) - and len(obj) > max_string - ): - truncated = len(obj) - max_string - obj_repr = f"{obj[:max_string]!r}+{truncated}" - else: - try: - obj_repr = repr(obj) - except Exception as error: - obj_repr = f"<repr-error {str(error)!r}>" - return obj_repr - - visited_ids: Set[int] = set() - push_visited = visited_ids.add - pop_visited = visited_ids.remove - - def _traverse(obj: Any, root: bool = False, depth: int = 0) -> Node: - """Walk the object depth first.""" - - obj_id = id(obj) - if obj_id in visited_ids: - # Recursion detected - return Node(value_repr="...") - - obj_type = type(obj) - children: List[Node] - reached_max_depth = max_depth is not None and depth >= max_depth - - def iter_rich_args(rich_args: Any) -> Iterable[Union[Any, Tuple[str, Any]]]: - for arg in rich_args: - if _safe_isinstance(arg, tuple): - if len(arg) == 3: - key, child, default = arg - if default == child: - continue - yield key, child - elif len(arg) == 2: - key, child = arg - yield key, child - elif len(arg) == 1: - yield arg[0] - else: - yield arg - - try: - fake_attributes = hasattr( - obj, "awehoi234_wdfjwljet234_234wdfoijsdfmmnxpi492" - ) - except Exception: - fake_attributes = False - - rich_repr_result: Optional[RichReprResult] = None - if not fake_attributes: - try: - if hasattr(obj, "__rich_repr__") and not isclass(obj): - rich_repr_result = obj.__rich_repr__() - except Exception: - pass - - if rich_repr_result is not None: - push_visited(obj_id) - angular = getattr(obj.__rich_repr__, "angular", False) - args = list(iter_rich_args(rich_repr_result)) - class_name = obj.__class__.__name__ - - if args: - children = [] - append = children.append - - if reached_max_depth: - if angular: - node = Node(value_repr=f"<{class_name}...>") - else: - node = Node(value_repr=f"{class_name}(...)") - else: - if angular: - node = Node( - open_brace=f"<{class_name} ", - close_brace=">", - children=children, - last=root, - separator=" ", - ) - else: - node = Node( - open_brace=f"{class_name}(", - close_brace=")", - children=children, - last=root, - ) - for last, arg in loop_last(args): - if _safe_isinstance(arg, tuple): - key, child = arg - child_node = _traverse(child, depth=depth + 1) - child_node.last = last - child_node.key_repr = key - child_node.key_separator = "=" - append(child_node) - else: - child_node = _traverse(arg, depth=depth + 1) - child_node.last = last - append(child_node) - else: - node = Node( - value_repr=f"<{class_name}>" if angular else f"{class_name}()", - children=[], - last=root, - ) - pop_visited(obj_id) - elif _is_attr_object(obj) and not fake_attributes: - push_visited(obj_id) - children = [] - append = children.append - - attr_fields = _get_attr_fields(obj) - if attr_fields: - if reached_max_depth: - node = Node(value_repr=f"{obj.__class__.__name__}(...)") - else: - node = Node( - open_brace=f"{obj.__class__.__name__}(", - close_brace=")", - children=children, - last=root, - ) - - def iter_attrs() -> Iterable[ - Tuple[str, Any, Optional[Callable[[Any], str]]] - ]: - """Iterate over attr fields and values.""" - for attr in attr_fields: - if attr.repr: - try: - value = getattr(obj, attr.name) - except Exception as error: - # Can happen, albeit rarely - yield (attr.name, error, None) - else: - yield ( - attr.name, - value, - attr.repr if callable(attr.repr) else None, - ) - - for last, (name, value, repr_callable) in loop_last(iter_attrs()): - if repr_callable: - child_node = Node(value_repr=str(repr_callable(value))) - else: - child_node = _traverse(value, depth=depth + 1) - child_node.last = last - child_node.key_repr = name - child_node.key_separator = "=" - append(child_node) - else: - node = Node( - value_repr=f"{obj.__class__.__name__}()", children=[], last=root - ) - pop_visited(obj_id) - elif ( - is_dataclass(obj) - and not _safe_isinstance(obj, type) - and not fake_attributes - and _is_dataclass_repr(obj) - ): - push_visited(obj_id) - children = [] - append = children.append - if reached_max_depth: - node = Node(value_repr=f"{obj.__class__.__name__}(...)") - else: - node = Node( - open_brace=f"{obj.__class__.__name__}(", - close_brace=")", - children=children, - last=root, - empty=f"{obj.__class__.__name__}()", - ) - - for last, field in loop_last( - field for field in fields(obj) if field.repr - ): - child_node = _traverse(getattr(obj, field.name), depth=depth + 1) - child_node.key_repr = field.name - child_node.last = last - child_node.key_separator = "=" - append(child_node) - - pop_visited(obj_id) - elif _is_namedtuple(obj) and _has_default_namedtuple_repr(obj): - push_visited(obj_id) - class_name = obj.__class__.__name__ - if reached_max_depth: - # If we've reached the max depth, we still show the class name, but not its contents - node = Node( - value_repr=f"{class_name}(...)", - ) - else: - children = [] - append = children.append - node = Node( - open_brace=f"{class_name}(", - close_brace=")", - children=children, - empty=f"{class_name}()", - ) - for last, (key, value) in loop_last(obj._asdict().items()): - child_node = _traverse(value, depth=depth + 1) - child_node.key_repr = key - child_node.last = last - child_node.key_separator = "=" - append(child_node) - pop_visited(obj_id) - elif _safe_isinstance(obj, _CONTAINERS): - for container_type in _CONTAINERS: - if _safe_isinstance(obj, container_type): - obj_type = container_type - break - - push_visited(obj_id) - - open_brace, close_brace, empty = _BRACES[obj_type](obj) - - if reached_max_depth: - node = Node(value_repr=f"{open_brace}...{close_brace}") - elif obj_type.__repr__ != type(obj).__repr__: - node = Node(value_repr=to_repr(obj), last=root) - elif obj: - children = [] - node = Node( - open_brace=open_brace, - close_brace=close_brace, - children=children, - last=root, - ) - append = children.append - num_items = len(obj) - last_item_index = num_items - 1 - - if _safe_isinstance(obj, _MAPPING_CONTAINERS): - iter_items = iter(obj.items()) - if max_length is not None: - iter_items = islice(iter_items, max_length) - for index, (key, child) in enumerate(iter_items): - child_node = _traverse(child, depth=depth + 1) - child_node.key_repr = to_repr(key) - child_node.last = index == last_item_index - append(child_node) - else: - iter_values = iter(obj) - if max_length is not None: - iter_values = islice(iter_values, max_length) - for index, child in enumerate(iter_values): - child_node = _traverse(child, depth=depth + 1) - child_node.last = index == last_item_index - append(child_node) - if max_length is not None and num_items > max_length: - append(Node(value_repr=f"... +{num_items - max_length}", last=True)) - else: - node = Node(empty=empty, children=[], last=root) - - pop_visited(obj_id) - else: - node = Node(value_repr=to_repr(obj), last=root) - node.is_tuple = _safe_isinstance(obj, tuple) - node.is_namedtuple = _is_namedtuple(obj) - return node - - node = _traverse(_object, root=True) - return node - - -def pretty_repr( - _object: Any, - *, - max_width: int = 80, - indent_size: int = 4, - max_length: Optional[int] = None, - max_string: Optional[int] = None, - max_depth: Optional[int] = None, - expand_all: bool = False, -) -> str: - """Prettify repr string by expanding on to new lines to fit within a given width. - - Args: - _object (Any): Object to repr. - max_width (int, optional): Desired maximum width of repr string. Defaults to 80. - indent_size (int, optional): Number of spaces to indent. Defaults to 4. - max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. - Defaults to None. - max_string (int, optional): Maximum length of string before truncating, or None to disable truncating. - Defaults to None. - max_depth (int, optional): Maximum depth of nested data structure, or None for no depth. - Defaults to None. - expand_all (bool, optional): Expand all containers regardless of available width. Defaults to False. - - Returns: - str: A possibly multi-line representation of the object. - """ - - if _safe_isinstance(_object, Node): - node = _object - else: - node = traverse( - _object, max_length=max_length, max_string=max_string, max_depth=max_depth - ) - repr_str: str = node.render( - max_width=max_width, indent_size=indent_size, expand_all=expand_all - ) - return repr_str - - -def pprint( - _object: Any, - *, - console: Optional["Console"] = None, - indent_guides: bool = True, - max_length: Optional[int] = None, - max_string: Optional[int] = None, - max_depth: Optional[int] = None, - expand_all: bool = False, -) -> None: - """A convenience function for pretty printing. - - Args: - _object (Any): Object to pretty print. - console (Console, optional): Console instance, or None to use default. Defaults to None. - max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. - Defaults to None. - max_string (int, optional): Maximum length of strings before truncating, or None to disable. Defaults to None. - max_depth (int, optional): Maximum depth for nested data structures, or None for unlimited depth. Defaults to None. - indent_guides (bool, optional): Enable indentation guides. Defaults to True. - expand_all (bool, optional): Expand all containers. Defaults to False. - """ - _console = get_console() if console is None else console - _console.print( - Pretty( - _object, - max_length=max_length, - max_string=max_string, - max_depth=max_depth, - indent_guides=indent_guides, - expand_all=expand_all, - overflow="ignore", - ), - soft_wrap=True, - ) - - -if __name__ == "__main__": # pragma: no cover - - class BrokenRepr: - def __repr__(self) -> str: - 1 / 0 - return "this will fail" - - from typing import NamedTuple - - class StockKeepingUnit(NamedTuple): - name: str - description: str - price: float - category: str - reviews: List[str] - - d = defaultdict(int) - d["foo"] = 5 - data = { - "foo": [ - 1, - "Hello World!", - 100.123, - 323.232, - 432324.0, - {5, 6, 7, (1, 2, 3, 4), 8}, - ], - "bar": frozenset({1, 2, 3}), - "defaultdict": defaultdict( - list, {"crumble": ["apple", "rhubarb", "butter", "sugar", "flour"]} - ), - "counter": Counter( - [ - "apple", - "orange", - "pear", - "kumquat", - "kumquat", - "durian" * 100, - ] - ), - "atomic": (False, True, None), - "namedtuple": StockKeepingUnit( - "Sparkling British Spring Water", - "Carbonated spring water", - 0.9, - "water", - ["its amazing!", "its terrible!"], - ), - "Broken": BrokenRepr(), - } - data["foo"].append(data) # type: ignore[attr-defined] - - from pip._vendor.rich import print - - # print(Pretty(data, indent_guides=True, max_string=20)) - - class Thing: - def __repr__(self) -> str: - return "Hello\x1b[38;5;239m World!" - - print(Pretty(Thing())) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/progress.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/progress.py deleted file mode 100644 index 8b0a315..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/progress.py +++ /dev/null @@ -1,1702 +0,0 @@ -import io -import sys -import typing -import warnings -from abc import ABC, abstractmethod -from collections import deque -from dataclasses import dataclass, field -from datetime import timedelta -from io import RawIOBase, UnsupportedOperation -from math import ceil -from mmap import mmap -from operator import length_hint -from os import PathLike, stat -from threading import Event, RLock, Thread -from types import TracebackType -from typing import ( - Any, - BinaryIO, - Callable, - ContextManager, - Deque, - Dict, - Generic, - Iterable, - List, - NamedTuple, - NewType, - Optional, - Sequence, - TextIO, - Tuple, - Type, - TypeVar, - Union, -) - -if sys.version_info >= (3, 8): - from typing import Literal -else: - from pip._vendor.typing_extensions import Literal # pragma: no cover - -from . import filesize, get_console -from .console import Console, Group, JustifyMethod, RenderableType -from .highlighter import Highlighter -from .jupyter import JupyterMixin -from .live import Live -from .progress_bar import ProgressBar -from .spinner import Spinner -from .style import StyleType -from .table import Column, Table -from .text import Text, TextType - -TaskID = NewType("TaskID", int) - -ProgressType = TypeVar("ProgressType") - -GetTimeCallable = Callable[[], float] - - -_I = typing.TypeVar("_I", TextIO, BinaryIO) - - -class _TrackThread(Thread): - """A thread to periodically update progress.""" - - def __init__(self, progress: "Progress", task_id: "TaskID", update_period: float): - self.progress = progress - self.task_id = task_id - self.update_period = update_period - self.done = Event() - - self.completed = 0 - super().__init__() - - def run(self) -> None: - task_id = self.task_id - advance = self.progress.advance - update_period = self.update_period - last_completed = 0 - wait = self.done.wait - while not wait(update_period): - completed = self.completed - if last_completed != completed: - advance(task_id, completed - last_completed) - last_completed = completed - - self.progress.update(self.task_id, completed=self.completed, refresh=True) - - def __enter__(self) -> "_TrackThread": - self.start() - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - self.done.set() - self.join() - - -def track( - sequence: Union[Sequence[ProgressType], Iterable[ProgressType]], - description: str = "Working...", - total: Optional[float] = None, - auto_refresh: bool = True, - console: Optional[Console] = None, - transient: bool = False, - get_time: Optional[Callable[[], float]] = None, - refresh_per_second: float = 10, - style: StyleType = "bar.back", - complete_style: StyleType = "bar.complete", - finished_style: StyleType = "bar.finished", - pulse_style: StyleType = "bar.pulse", - update_period: float = 0.1, - disable: bool = False, - show_speed: bool = True, -) -> Iterable[ProgressType]: - """Track progress by iterating over a sequence. - - Args: - sequence (Iterable[ProgressType]): A sequence (must support "len") you wish to iterate over. - description (str, optional): Description of task show next to progress bar. Defaults to "Working". - total: (float, optional): Total number of steps. Default is len(sequence). - auto_refresh (bool, optional): Automatic refresh, disable to force a refresh after each iteration. Default is True. - transient: (bool, optional): Clear the progress on exit. Defaults to False. - console (Console, optional): Console to write to. Default creates internal Console instance. - refresh_per_second (float): Number of times per second to refresh the progress information. Defaults to 10. - style (StyleType, optional): Style for the bar background. Defaults to "bar.back". - complete_style (StyleType, optional): Style for the completed bar. Defaults to "bar.complete". - finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.finished". - pulse_style (StyleType, optional): Style for pulsing bars. Defaults to "bar.pulse". - update_period (float, optional): Minimum time (in seconds) between calls to update(). Defaults to 0.1. - disable (bool, optional): Disable display of progress. - show_speed (bool, optional): Show speed if total isn't known. Defaults to True. - Returns: - Iterable[ProgressType]: An iterable of the values in the sequence. - - """ - - columns: List["ProgressColumn"] = ( - [TextColumn("[progress.description]{task.description}")] if description else [] - ) - columns.extend( - ( - BarColumn( - style=style, - complete_style=complete_style, - finished_style=finished_style, - pulse_style=pulse_style, - ), - TaskProgressColumn(show_speed=show_speed), - TimeRemainingColumn(elapsed_when_finished=True), - ) - ) - progress = Progress( - *columns, - auto_refresh=auto_refresh, - console=console, - transient=transient, - get_time=get_time, - refresh_per_second=refresh_per_second or 10, - disable=disable, - ) - - with progress: - yield from progress.track( - sequence, total=total, description=description, update_period=update_period - ) - - -class _Reader(RawIOBase, BinaryIO): - """A reader that tracks progress while it's being read from.""" - - def __init__( - self, - handle: BinaryIO, - progress: "Progress", - task: TaskID, - close_handle: bool = True, - ) -> None: - self.handle = handle - self.progress = progress - self.task = task - self.close_handle = close_handle - self._closed = False - - def __enter__(self) -> "_Reader": - self.handle.__enter__() - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - self.close() - - def __iter__(self) -> BinaryIO: - return self - - def __next__(self) -> bytes: - line = next(self.handle) - self.progress.advance(self.task, advance=len(line)) - return line - - @property - def closed(self) -> bool: - return self._closed - - def fileno(self) -> int: - return self.handle.fileno() - - def isatty(self) -> bool: - return self.handle.isatty() - - @property - def mode(self) -> str: - return self.handle.mode - - @property - def name(self) -> str: - return self.handle.name - - def readable(self) -> bool: - return self.handle.readable() - - def seekable(self) -> bool: - return self.handle.seekable() - - def writable(self) -> bool: - return False - - def read(self, size: int = -1) -> bytes: - block = self.handle.read(size) - self.progress.advance(self.task, advance=len(block)) - return block - - def readinto(self, b: Union[bytearray, memoryview, mmap]): # type: ignore[no-untyped-def, override] - n = self.handle.readinto(b) # type: ignore[attr-defined] - self.progress.advance(self.task, advance=n) - return n - - def readline(self, size: int = -1) -> bytes: # type: ignore[override] - line = self.handle.readline(size) - self.progress.advance(self.task, advance=len(line)) - return line - - def readlines(self, hint: int = -1) -> List[bytes]: - lines = self.handle.readlines(hint) - self.progress.advance(self.task, advance=sum(map(len, lines))) - return lines - - def close(self) -> None: - if self.close_handle: - self.handle.close() - self._closed = True - - def seek(self, offset: int, whence: int = 0) -> int: - pos = self.handle.seek(offset, whence) - self.progress.update(self.task, completed=pos) - return pos - - def tell(self) -> int: - return self.handle.tell() - - def write(self, s: Any) -> int: - raise UnsupportedOperation("write") - - -class _ReadContext(ContextManager[_I], Generic[_I]): - """A utility class to handle a context for both a reader and a progress.""" - - def __init__(self, progress: "Progress", reader: _I) -> None: - self.progress = progress - self.reader: _I = reader - - def __enter__(self) -> _I: - self.progress.start() - return self.reader.__enter__() - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - self.progress.stop() - self.reader.__exit__(exc_type, exc_val, exc_tb) - - -def wrap_file( - file: BinaryIO, - total: int, - *, - description: str = "Reading...", - auto_refresh: bool = True, - console: Optional[Console] = None, - transient: bool = False, - get_time: Optional[Callable[[], float]] = None, - refresh_per_second: float = 10, - style: StyleType = "bar.back", - complete_style: StyleType = "bar.complete", - finished_style: StyleType = "bar.finished", - pulse_style: StyleType = "bar.pulse", - disable: bool = False, -) -> ContextManager[BinaryIO]: - """Read bytes from a file while tracking progress. - - Args: - file (Union[str, PathLike[str], BinaryIO]): The path to the file to read, or a file-like object in binary mode. - total (int): Total number of bytes to read. - description (str, optional): Description of task show next to progress bar. Defaults to "Reading". - auto_refresh (bool, optional): Automatic refresh, disable to force a refresh after each iteration. Default is True. - transient: (bool, optional): Clear the progress on exit. Defaults to False. - console (Console, optional): Console to write to. Default creates internal Console instance. - refresh_per_second (float): Number of times per second to refresh the progress information. Defaults to 10. - style (StyleType, optional): Style for the bar background. Defaults to "bar.back". - complete_style (StyleType, optional): Style for the completed bar. Defaults to "bar.complete". - finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.finished". - pulse_style (StyleType, optional): Style for pulsing bars. Defaults to "bar.pulse". - disable (bool, optional): Disable display of progress. - Returns: - ContextManager[BinaryIO]: A context manager yielding a progress reader. - - """ - - columns: List["ProgressColumn"] = ( - [TextColumn("[progress.description]{task.description}")] if description else [] - ) - columns.extend( - ( - BarColumn( - style=style, - complete_style=complete_style, - finished_style=finished_style, - pulse_style=pulse_style, - ), - DownloadColumn(), - TimeRemainingColumn(), - ) - ) - progress = Progress( - *columns, - auto_refresh=auto_refresh, - console=console, - transient=transient, - get_time=get_time, - refresh_per_second=refresh_per_second or 10, - disable=disable, - ) - - reader = progress.wrap_file(file, total=total, description=description) - return _ReadContext(progress, reader) - - -@typing.overload -def open( - file: Union[str, "PathLike[str]", bytes], - mode: Union[Literal["rt"], Literal["r"]], - buffering: int = -1, - encoding: Optional[str] = None, - errors: Optional[str] = None, - newline: Optional[str] = None, - *, - total: Optional[int] = None, - description: str = "Reading...", - auto_refresh: bool = True, - console: Optional[Console] = None, - transient: bool = False, - get_time: Optional[Callable[[], float]] = None, - refresh_per_second: float = 10, - style: StyleType = "bar.back", - complete_style: StyleType = "bar.complete", - finished_style: StyleType = "bar.finished", - pulse_style: StyleType = "bar.pulse", - disable: bool = False, -) -> ContextManager[TextIO]: - pass - - -@typing.overload -def open( - file: Union[str, "PathLike[str]", bytes], - mode: Literal["rb"], - buffering: int = -1, - encoding: Optional[str] = None, - errors: Optional[str] = None, - newline: Optional[str] = None, - *, - total: Optional[int] = None, - description: str = "Reading...", - auto_refresh: bool = True, - console: Optional[Console] = None, - transient: bool = False, - get_time: Optional[Callable[[], float]] = None, - refresh_per_second: float = 10, - style: StyleType = "bar.back", - complete_style: StyleType = "bar.complete", - finished_style: StyleType = "bar.finished", - pulse_style: StyleType = "bar.pulse", - disable: bool = False, -) -> ContextManager[BinaryIO]: - pass - - -def open( - file: Union[str, "PathLike[str]", bytes], - mode: Union[Literal["rb"], Literal["rt"], Literal["r"]] = "r", - buffering: int = -1, - encoding: Optional[str] = None, - errors: Optional[str] = None, - newline: Optional[str] = None, - *, - total: Optional[int] = None, - description: str = "Reading...", - auto_refresh: bool = True, - console: Optional[Console] = None, - transient: bool = False, - get_time: Optional[Callable[[], float]] = None, - refresh_per_second: float = 10, - style: StyleType = "bar.back", - complete_style: StyleType = "bar.complete", - finished_style: StyleType = "bar.finished", - pulse_style: StyleType = "bar.pulse", - disable: bool = False, -) -> Union[ContextManager[BinaryIO], ContextManager[TextIO]]: - """Read bytes from a file while tracking progress. - - Args: - path (Union[str, PathLike[str], BinaryIO]): The path to the file to read, or a file-like object in binary mode. - mode (str): The mode to use to open the file. Only supports "r", "rb" or "rt". - buffering (int): The buffering strategy to use, see :func:`io.open`. - encoding (str, optional): The encoding to use when reading in text mode, see :func:`io.open`. - errors (str, optional): The error handling strategy for decoding errors, see :func:`io.open`. - newline (str, optional): The strategy for handling newlines in text mode, see :func:`io.open` - total: (int, optional): Total number of bytes to read. Must be provided if reading from a file handle. Default for a path is os.stat(file).st_size. - description (str, optional): Description of task show next to progress bar. Defaults to "Reading". - auto_refresh (bool, optional): Automatic refresh, disable to force a refresh after each iteration. Default is True. - transient: (bool, optional): Clear the progress on exit. Defaults to False. - console (Console, optional): Console to write to. Default creates internal Console instance. - refresh_per_second (float): Number of times per second to refresh the progress information. Defaults to 10. - style (StyleType, optional): Style for the bar background. Defaults to "bar.back". - complete_style (StyleType, optional): Style for the completed bar. Defaults to "bar.complete". - finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.finished". - pulse_style (StyleType, optional): Style for pulsing bars. Defaults to "bar.pulse". - disable (bool, optional): Disable display of progress. - encoding (str, optional): The encoding to use when reading in text mode. - - Returns: - ContextManager[BinaryIO]: A context manager yielding a progress reader. - - """ - - columns: List["ProgressColumn"] = ( - [TextColumn("[progress.description]{task.description}")] if description else [] - ) - columns.extend( - ( - BarColumn( - style=style, - complete_style=complete_style, - finished_style=finished_style, - pulse_style=pulse_style, - ), - DownloadColumn(), - TimeRemainingColumn(), - ) - ) - progress = Progress( - *columns, - auto_refresh=auto_refresh, - console=console, - transient=transient, - get_time=get_time, - refresh_per_second=refresh_per_second or 10, - disable=disable, - ) - - reader = progress.open( - file, - mode=mode, - buffering=buffering, - encoding=encoding, - errors=errors, - newline=newline, - total=total, - description=description, - ) - return _ReadContext(progress, reader) # type: ignore[return-value, type-var] - - -class ProgressColumn(ABC): - """Base class for a widget to use in progress display.""" - - max_refresh: Optional[float] = None - - def __init__(self, table_column: Optional[Column] = None) -> None: - self._table_column = table_column - self._renderable_cache: Dict[TaskID, Tuple[float, RenderableType]] = {} - self._update_time: Optional[float] = None - - def get_table_column(self) -> Column: - """Get a table column, used to build tasks table.""" - return self._table_column or Column() - - def __call__(self, task: "Task") -> RenderableType: - """Called by the Progress object to return a renderable for the given task. - - Args: - task (Task): An object containing information regarding the task. - - Returns: - RenderableType: Anything renderable (including str). - """ - current_time = task.get_time() - if self.max_refresh is not None and not task.completed: - try: - timestamp, renderable = self._renderable_cache[task.id] - except KeyError: - pass - else: - if timestamp + self.max_refresh > current_time: - return renderable - - renderable = self.render(task) - self._renderable_cache[task.id] = (current_time, renderable) - return renderable - - @abstractmethod - def render(self, task: "Task") -> RenderableType: - """Should return a renderable object.""" - - -class RenderableColumn(ProgressColumn): - """A column to insert an arbitrary column. - - Args: - renderable (RenderableType, optional): Any renderable. Defaults to empty string. - """ - - def __init__( - self, renderable: RenderableType = "", *, table_column: Optional[Column] = None - ): - self.renderable = renderable - super().__init__(table_column=table_column) - - def render(self, task: "Task") -> RenderableType: - return self.renderable - - -class SpinnerColumn(ProgressColumn): - """A column with a 'spinner' animation. - - Args: - spinner_name (str, optional): Name of spinner animation. Defaults to "dots". - style (StyleType, optional): Style of spinner. Defaults to "progress.spinner". - speed (float, optional): Speed factor of spinner. Defaults to 1.0. - finished_text (TextType, optional): Text used when task is finished. Defaults to " ". - """ - - def __init__( - self, - spinner_name: str = "dots", - style: Optional[StyleType] = "progress.spinner", - speed: float = 1.0, - finished_text: TextType = " ", - table_column: Optional[Column] = None, - ): - self.spinner = Spinner(spinner_name, style=style, speed=speed) - self.finished_text = ( - Text.from_markup(finished_text) - if isinstance(finished_text, str) - else finished_text - ) - super().__init__(table_column=table_column) - - def set_spinner( - self, - spinner_name: str, - spinner_style: Optional[StyleType] = "progress.spinner", - speed: float = 1.0, - ) -> None: - """Set a new spinner. - - Args: - spinner_name (str): Spinner name, see python -m rich.spinner. - spinner_style (Optional[StyleType], optional): Spinner style. Defaults to "progress.spinner". - speed (float, optional): Speed factor of spinner. Defaults to 1.0. - """ - self.spinner = Spinner(spinner_name, style=spinner_style, speed=speed) - - def render(self, task: "Task") -> RenderableType: - text = ( - self.finished_text - if task.finished - else self.spinner.render(task.get_time()) - ) - return text - - -class TextColumn(ProgressColumn): - """A column containing text.""" - - def __init__( - self, - text_format: str, - style: StyleType = "none", - justify: JustifyMethod = "left", - markup: bool = True, - highlighter: Optional[Highlighter] = None, - table_column: Optional[Column] = None, - ) -> None: - self.text_format = text_format - self.justify: JustifyMethod = justify - self.style = style - self.markup = markup - self.highlighter = highlighter - super().__init__(table_column=table_column or Column(no_wrap=True)) - - def render(self, task: "Task") -> Text: - _text = self.text_format.format(task=task) - if self.markup: - text = Text.from_markup(_text, style=self.style, justify=self.justify) - else: - text = Text(_text, style=self.style, justify=self.justify) - if self.highlighter: - self.highlighter.highlight(text) - return text - - -class BarColumn(ProgressColumn): - """Renders a visual progress bar. - - Args: - bar_width (Optional[int], optional): Width of bar or None for full width. Defaults to 40. - style (StyleType, optional): Style for the bar background. Defaults to "bar.back". - complete_style (StyleType, optional): Style for the completed bar. Defaults to "bar.complete". - finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.finished". - pulse_style (StyleType, optional): Style for pulsing bars. Defaults to "bar.pulse". - """ - - def __init__( - self, - bar_width: Optional[int] = 40, - style: StyleType = "bar.back", - complete_style: StyleType = "bar.complete", - finished_style: StyleType = "bar.finished", - pulse_style: StyleType = "bar.pulse", - table_column: Optional[Column] = None, - ) -> None: - self.bar_width = bar_width - self.style = style - self.complete_style = complete_style - self.finished_style = finished_style - self.pulse_style = pulse_style - super().__init__(table_column=table_column) - - def render(self, task: "Task") -> ProgressBar: - """Gets a progress bar widget for a task.""" - return ProgressBar( - total=max(0, task.total) if task.total is not None else None, - completed=max(0, task.completed), - width=None if self.bar_width is None else max(1, self.bar_width), - pulse=not task.started, - animation_time=task.get_time(), - style=self.style, - complete_style=self.complete_style, - finished_style=self.finished_style, - pulse_style=self.pulse_style, - ) - - -class TimeElapsedColumn(ProgressColumn): - """Renders time elapsed.""" - - def render(self, task: "Task") -> Text: - """Show time elapsed.""" - elapsed = task.finished_time if task.finished else task.elapsed - if elapsed is None: - return Text("-:--:--", style="progress.elapsed") - delta = timedelta(seconds=int(elapsed)) - return Text(str(delta), style="progress.elapsed") - - -class TaskProgressColumn(TextColumn): - """Show task progress as a percentage. - - Args: - text_format (str, optional): Format for percentage display. Defaults to "[progress.percentage]{task.percentage:>3.0f}%". - text_format_no_percentage (str, optional): Format if percentage is unknown. Defaults to "". - style (StyleType, optional): Style of output. Defaults to "none". - justify (JustifyMethod, optional): Text justification. Defaults to "left". - markup (bool, optional): Enable markup. Defaults to True. - highlighter (Optional[Highlighter], optional): Highlighter to apply to output. Defaults to None. - table_column (Optional[Column], optional): Table Column to use. Defaults to None. - show_speed (bool, optional): Show speed if total is unknown. Defaults to False. - """ - - def __init__( - self, - text_format: str = "[progress.percentage]{task.percentage:>3.0f}%", - text_format_no_percentage: str = "", - style: StyleType = "none", - justify: JustifyMethod = "left", - markup: bool = True, - highlighter: Optional[Highlighter] = None, - table_column: Optional[Column] = None, - show_speed: bool = False, - ) -> None: - - self.text_format_no_percentage = text_format_no_percentage - self.show_speed = show_speed - super().__init__( - text_format=text_format, - style=style, - justify=justify, - markup=markup, - highlighter=highlighter, - table_column=table_column, - ) - - @classmethod - def render_speed(cls, speed: Optional[float]) -> Text: - """Render the speed in iterations per second. - - Args: - task (Task): A Task object. - - Returns: - Text: Text object containing the task speed. - """ - if speed is None: - return Text("", style="progress.percentage") - unit, suffix = filesize.pick_unit_and_suffix( - int(speed), - ["", "×10³", "×10⁶", "×10⁹", "×10¹²"], - 1000, - ) - data_speed = speed / unit - return Text(f"{data_speed:.1f}{suffix} it/s", style="progress.percentage") - - def render(self, task: "Task") -> Text: - if task.total is None and self.show_speed: - return self.render_speed(task.finished_speed or task.speed) - text_format = ( - self.text_format_no_percentage if task.total is None else self.text_format - ) - _text = text_format.format(task=task) - if self.markup: - text = Text.from_markup(_text, style=self.style, justify=self.justify) - else: - text = Text(_text, style=self.style, justify=self.justify) - if self.highlighter: - self.highlighter.highlight(text) - return text - - -class TimeRemainingColumn(ProgressColumn): - """Renders estimated time remaining. - - Args: - compact (bool, optional): Render MM:SS when time remaining is less than an hour. Defaults to False. - elapsed_when_finished (bool, optional): Render time elapsed when the task is finished. Defaults to False. - """ - - # Only refresh twice a second to prevent jitter - max_refresh = 0.5 - - def __init__( - self, - compact: bool = False, - elapsed_when_finished: bool = False, - table_column: Optional[Column] = None, - ): - self.compact = compact - self.elapsed_when_finished = elapsed_when_finished - super().__init__(table_column=table_column) - - def render(self, task: "Task") -> Text: - """Show time remaining.""" - if self.elapsed_when_finished and task.finished: - task_time = task.finished_time - style = "progress.elapsed" - else: - task_time = task.time_remaining - style = "progress.remaining" - - if task.total is None: - return Text("", style=style) - - if task_time is None: - return Text("--:--" if self.compact else "-:--:--", style=style) - - # Based on https://github.com/tqdm/tqdm/blob/master/tqdm/std.py - minutes, seconds = divmod(int(task_time), 60) - hours, minutes = divmod(minutes, 60) - - if self.compact and not hours: - formatted = f"{minutes:02d}:{seconds:02d}" - else: - formatted = f"{hours:d}:{minutes:02d}:{seconds:02d}" - - return Text(formatted, style=style) - - -class FileSizeColumn(ProgressColumn): - """Renders completed filesize.""" - - def render(self, task: "Task") -> Text: - """Show data completed.""" - data_size = filesize.decimal(int(task.completed)) - return Text(data_size, style="progress.filesize") - - -class TotalFileSizeColumn(ProgressColumn): - """Renders total filesize.""" - - def render(self, task: "Task") -> Text: - """Show data completed.""" - data_size = filesize.decimal(int(task.total)) if task.total is not None else "" - return Text(data_size, style="progress.filesize.total") - - -class MofNCompleteColumn(ProgressColumn): - """Renders completed count/total, e.g. ' 10/1000'. - - Best for bounded tasks with int quantities. - - Space pads the completed count so that progress length does not change as task progresses - past powers of 10. - - Args: - separator (str, optional): Text to separate completed and total values. Defaults to "/". - """ - - def __init__(self, separator: str = "/", table_column: Optional[Column] = None): - self.separator = separator - super().__init__(table_column=table_column) - - def render(self, task: "Task") -> Text: - """Show completed/total.""" - completed = int(task.completed) - total = int(task.total) if task.total is not None else "?" - total_width = len(str(total)) - return Text( - f"{completed:{total_width}d}{self.separator}{total}", - style="progress.download", - ) - - -class DownloadColumn(ProgressColumn): - """Renders file size downloaded and total, e.g. '0.5/2.3 GB'. - - Args: - binary_units (bool, optional): Use binary units, KiB, MiB etc. Defaults to False. - """ - - def __init__( - self, binary_units: bool = False, table_column: Optional[Column] = None - ) -> None: - self.binary_units = binary_units - super().__init__(table_column=table_column) - - def render(self, task: "Task") -> Text: - """Calculate common unit for completed and total.""" - completed = int(task.completed) - - unit_and_suffix_calculation_base = ( - int(task.total) if task.total is not None else completed - ) - if self.binary_units: - unit, suffix = filesize.pick_unit_and_suffix( - unit_and_suffix_calculation_base, - ["bytes", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"], - 1024, - ) - else: - unit, suffix = filesize.pick_unit_and_suffix( - unit_and_suffix_calculation_base, - ["bytes", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"], - 1000, - ) - precision = 0 if unit == 1 else 1 - - completed_ratio = completed / unit - completed_str = f"{completed_ratio:,.{precision}f}" - - if task.total is not None: - total = int(task.total) - total_ratio = total / unit - total_str = f"{total_ratio:,.{precision}f}" - else: - total_str = "?" - - download_status = f"{completed_str}/{total_str} {suffix}" - download_text = Text(download_status, style="progress.download") - return download_text - - -class TransferSpeedColumn(ProgressColumn): - """Renders human readable transfer speed.""" - - def render(self, task: "Task") -> Text: - """Show data transfer speed.""" - speed = task.finished_speed or task.speed - if speed is None: - return Text("?", style="progress.data.speed") - data_speed = filesize.decimal(int(speed)) - return Text(f"{data_speed}/s", style="progress.data.speed") - - -class ProgressSample(NamedTuple): - """Sample of progress for a given time.""" - - timestamp: float - """Timestamp of sample.""" - completed: float - """Number of steps completed.""" - - -@dataclass -class Task: - """Information regarding a progress task. - - This object should be considered read-only outside of the :class:`~Progress` class. - - """ - - id: TaskID - """Task ID associated with this task (used in Progress methods).""" - - description: str - """str: Description of the task.""" - - total: Optional[float] - """Optional[float]: Total number of steps in this task.""" - - completed: float - """float: Number of steps completed""" - - _get_time: GetTimeCallable - """Callable to get the current time.""" - - finished_time: Optional[float] = None - """float: Time task was finished.""" - - visible: bool = True - """bool: Indicates if this task is visible in the progress display.""" - - fields: Dict[str, Any] = field(default_factory=dict) - """dict: Arbitrary fields passed in via Progress.update.""" - - start_time: Optional[float] = field(default=None, init=False, repr=False) - """Optional[float]: Time this task was started, or None if not started.""" - - stop_time: Optional[float] = field(default=None, init=False, repr=False) - """Optional[float]: Time this task was stopped, or None if not stopped.""" - - finished_speed: Optional[float] = None - """Optional[float]: The last speed for a finished task.""" - - _progress: Deque[ProgressSample] = field( - default_factory=lambda: deque(maxlen=1000), init=False, repr=False - ) - - _lock: RLock = field(repr=False, default_factory=RLock) - """Thread lock.""" - - def get_time(self) -> float: - """float: Get the current time, in seconds.""" - return self._get_time() - - @property - def started(self) -> bool: - """bool: Check if the task as started.""" - return self.start_time is not None - - @property - def remaining(self) -> Optional[float]: - """Optional[float]: Get the number of steps remaining, if a non-None total was set.""" - if self.total is None: - return None - return self.total - self.completed - - @property - def elapsed(self) -> Optional[float]: - """Optional[float]: Time elapsed since task was started, or ``None`` if the task hasn't started.""" - if self.start_time is None: - return None - if self.stop_time is not None: - return self.stop_time - self.start_time - return self.get_time() - self.start_time - - @property - def finished(self) -> bool: - """Check if the task has finished.""" - return self.finished_time is not None - - @property - def percentage(self) -> float: - """float: Get progress of task as a percentage. If a None total was set, returns 0""" - if not self.total: - return 0.0 - completed = (self.completed / self.total) * 100.0 - completed = min(100.0, max(0.0, completed)) - return completed - - @property - def speed(self) -> Optional[float]: - """Optional[float]: Get the estimated speed in steps per second.""" - if self.start_time is None: - return None - with self._lock: - progress = self._progress - if not progress: - return None - total_time = progress[-1].timestamp - progress[0].timestamp - if total_time == 0: - return None - iter_progress = iter(progress) - next(iter_progress) - total_completed = sum(sample.completed for sample in iter_progress) - speed = total_completed / total_time - return speed - - @property - def time_remaining(self) -> Optional[float]: - """Optional[float]: Get estimated time to completion, or ``None`` if no data.""" - if self.finished: - return 0.0 - speed = self.speed - if not speed: - return None - remaining = self.remaining - if remaining is None: - return None - estimate = ceil(remaining / speed) - return estimate - - def _reset(self) -> None: - """Reset progress.""" - self._progress.clear() - self.finished_time = None - self.finished_speed = None - - -class Progress(JupyterMixin): - """Renders an auto-updating progress bar(s). - - Args: - console (Console, optional): Optional Console instance. Default will an internal Console instance writing to stdout. - auto_refresh (bool, optional): Enable auto refresh. If disabled, you will need to call `refresh()`. - refresh_per_second (Optional[float], optional): Number of times per second to refresh the progress information or None to use default (10). Defaults to None. - speed_estimate_period: (float, optional): Period (in seconds) used to calculate the speed estimate. Defaults to 30. - transient: (bool, optional): Clear the progress on exit. Defaults to False. - redirect_stdout: (bool, optional): Enable redirection of stdout, so ``print`` may be used. Defaults to True. - redirect_stderr: (bool, optional): Enable redirection of stderr. Defaults to True. - get_time: (Callable, optional): A callable that gets the current time, or None to use Console.get_time. Defaults to None. - disable (bool, optional): Disable progress display. Defaults to False - expand (bool, optional): Expand tasks table to fit width. Defaults to False. - """ - - def __init__( - self, - *columns: Union[str, ProgressColumn], - console: Optional[Console] = None, - auto_refresh: bool = True, - refresh_per_second: float = 10, - speed_estimate_period: float = 30.0, - transient: bool = False, - redirect_stdout: bool = True, - redirect_stderr: bool = True, - get_time: Optional[GetTimeCallable] = None, - disable: bool = False, - expand: bool = False, - ) -> None: - assert refresh_per_second > 0, "refresh_per_second must be > 0" - self._lock = RLock() - self.columns = columns or self.get_default_columns() - self.speed_estimate_period = speed_estimate_period - - self.disable = disable - self.expand = expand - self._tasks: Dict[TaskID, Task] = {} - self._task_index: TaskID = TaskID(0) - self.live = Live( - console=console or get_console(), - auto_refresh=auto_refresh, - refresh_per_second=refresh_per_second, - transient=transient, - redirect_stdout=redirect_stdout, - redirect_stderr=redirect_stderr, - get_renderable=self.get_renderable, - ) - self.get_time = get_time or self.console.get_time - self.print = self.console.print - self.log = self.console.log - - @classmethod - def get_default_columns(cls) -> Tuple[ProgressColumn, ...]: - """Get the default columns used for a new Progress instance: - - a text column for the description (TextColumn) - - the bar itself (BarColumn) - - a text column showing completion percentage (TextColumn) - - an estimated-time-remaining column (TimeRemainingColumn) - If the Progress instance is created without passing a columns argument, - the default columns defined here will be used. - - You can also create a Progress instance using custom columns before - and/or after the defaults, as in this example: - - progress = Progress( - SpinnerColumn(), - *Progress.default_columns(), - "Elapsed:", - TimeElapsedColumn(), - ) - - This code shows the creation of a Progress display, containing - a spinner to the left, the default columns, and a labeled elapsed - time column. - """ - return ( - TextColumn("[progress.description]{task.description}"), - BarColumn(), - TaskProgressColumn(), - TimeRemainingColumn(), - ) - - @property - def console(self) -> Console: - return self.live.console - - @property - def tasks(self) -> List[Task]: - """Get a list of Task instances.""" - with self._lock: - return list(self._tasks.values()) - - @property - def task_ids(self) -> List[TaskID]: - """A list of task IDs.""" - with self._lock: - return list(self._tasks.keys()) - - @property - def finished(self) -> bool: - """Check if all tasks have been completed.""" - with self._lock: - if not self._tasks: - return True - return all(task.finished for task in self._tasks.values()) - - def start(self) -> None: - """Start the progress display.""" - if not self.disable: - self.live.start(refresh=True) - - def stop(self) -> None: - """Stop the progress display.""" - self.live.stop() - if not self.console.is_interactive: - self.console.print() - - def __enter__(self) -> "Progress": - self.start() - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - self.stop() - - def track( - self, - sequence: Union[Iterable[ProgressType], Sequence[ProgressType]], - total: Optional[float] = None, - task_id: Optional[TaskID] = None, - description: str = "Working...", - update_period: float = 0.1, - ) -> Iterable[ProgressType]: - """Track progress by iterating over a sequence. - - Args: - sequence (Sequence[ProgressType]): A sequence of values you want to iterate over and track progress. - total: (float, optional): Total number of steps. Default is len(sequence). - task_id: (TaskID): Task to track. Default is new task. - description: (str, optional): Description of task, if new task is created. - update_period (float, optional): Minimum time (in seconds) between calls to update(). Defaults to 0.1. - - Returns: - Iterable[ProgressType]: An iterable of values taken from the provided sequence. - """ - if total is None: - total = float(length_hint(sequence)) or None - - if task_id is None: - task_id = self.add_task(description, total=total) - else: - self.update(task_id, total=total) - - if self.live.auto_refresh: - with _TrackThread(self, task_id, update_period) as track_thread: - for value in sequence: - yield value - track_thread.completed += 1 - else: - advance = self.advance - refresh = self.refresh - for value in sequence: - yield value - advance(task_id, 1) - refresh() - - def wrap_file( - self, - file: BinaryIO, - total: Optional[int] = None, - *, - task_id: Optional[TaskID] = None, - description: str = "Reading...", - ) -> BinaryIO: - """Track progress file reading from a binary file. - - Args: - file (BinaryIO): A file-like object opened in binary mode. - total (int, optional): Total number of bytes to read. This must be provided unless a task with a total is also given. - task_id (TaskID): Task to track. Default is new task. - description (str, optional): Description of task, if new task is created. - - Returns: - BinaryIO: A readable file-like object in binary mode. - - Raises: - ValueError: When no total value can be extracted from the arguments or the task. - """ - # attempt to recover the total from the task - total_bytes: Optional[float] = None - if total is not None: - total_bytes = total - elif task_id is not None: - with self._lock: - total_bytes = self._tasks[task_id].total - if total_bytes is None: - raise ValueError( - f"unable to get the total number of bytes, please specify 'total'" - ) - - # update total of task or create new task - if task_id is None: - task_id = self.add_task(description, total=total_bytes) - else: - self.update(task_id, total=total_bytes) - - return _Reader(file, self, task_id, close_handle=False) - - @typing.overload - def open( - self, - file: Union[str, "PathLike[str]", bytes], - mode: Literal["rb"], - buffering: int = -1, - encoding: Optional[str] = None, - errors: Optional[str] = None, - newline: Optional[str] = None, - *, - total: Optional[int] = None, - task_id: Optional[TaskID] = None, - description: str = "Reading...", - ) -> BinaryIO: - pass - - @typing.overload - def open( - self, - file: Union[str, "PathLike[str]", bytes], - mode: Union[Literal["r"], Literal["rt"]], - buffering: int = -1, - encoding: Optional[str] = None, - errors: Optional[str] = None, - newline: Optional[str] = None, - *, - total: Optional[int] = None, - task_id: Optional[TaskID] = None, - description: str = "Reading...", - ) -> TextIO: - pass - - def open( - self, - file: Union[str, "PathLike[str]", bytes], - mode: Union[Literal["rb"], Literal["rt"], Literal["r"]] = "r", - buffering: int = -1, - encoding: Optional[str] = None, - errors: Optional[str] = None, - newline: Optional[str] = None, - *, - total: Optional[int] = None, - task_id: Optional[TaskID] = None, - description: str = "Reading...", - ) -> Union[BinaryIO, TextIO]: - """Track progress while reading from a binary file. - - Args: - path (Union[str, PathLike[str]]): The path to the file to read. - mode (str): The mode to use to open the file. Only supports "r", "rb" or "rt". - buffering (int): The buffering strategy to use, see :func:`io.open`. - encoding (str, optional): The encoding to use when reading in text mode, see :func:`io.open`. - errors (str, optional): The error handling strategy for decoding errors, see :func:`io.open`. - newline (str, optional): The strategy for handling newlines in text mode, see :func:`io.open`. - total (int, optional): Total number of bytes to read. If none given, os.stat(path).st_size is used. - task_id (TaskID): Task to track. Default is new task. - description (str, optional): Description of task, if new task is created. - - Returns: - BinaryIO: A readable file-like object in binary mode. - - Raises: - ValueError: When an invalid mode is given. - """ - # normalize the mode (always rb, rt) - _mode = "".join(sorted(mode, reverse=False)) - if _mode not in ("br", "rt", "r"): - raise ValueError("invalid mode {!r}".format(mode)) - - # patch buffering to provide the same behaviour as the builtin `open` - line_buffering = buffering == 1 - if _mode == "br" and buffering == 1: - warnings.warn( - "line buffering (buffering=1) isn't supported in binary mode, the default buffer size will be used", - RuntimeWarning, - ) - buffering = -1 - elif _mode in ("rt", "r"): - if buffering == 0: - raise ValueError("can't have unbuffered text I/O") - elif buffering == 1: - buffering = -1 - - # attempt to get the total with `os.stat` - if total is None: - total = stat(file).st_size - - # update total of task or create new task - if task_id is None: - task_id = self.add_task(description, total=total) - else: - self.update(task_id, total=total) - - # open the file in binary mode, - handle = io.open(file, "rb", buffering=buffering) - reader = _Reader(handle, self, task_id, close_handle=True) - - # wrap the reader in a `TextIOWrapper` if text mode - if mode in ("r", "rt"): - return io.TextIOWrapper( - reader, - encoding=encoding, - errors=errors, - newline=newline, - line_buffering=line_buffering, - ) - - return reader - - def start_task(self, task_id: TaskID) -> None: - """Start a task. - - Starts a task (used when calculating elapsed time). You may need to call this manually, - if you called ``add_task`` with ``start=False``. - - Args: - task_id (TaskID): ID of task. - """ - with self._lock: - task = self._tasks[task_id] - if task.start_time is None: - task.start_time = self.get_time() - - def stop_task(self, task_id: TaskID) -> None: - """Stop a task. - - This will freeze the elapsed time on the task. - - Args: - task_id (TaskID): ID of task. - """ - with self._lock: - task = self._tasks[task_id] - current_time = self.get_time() - if task.start_time is None: - task.start_time = current_time - task.stop_time = current_time - - def update( - self, - task_id: TaskID, - *, - total: Optional[float] = None, - completed: Optional[float] = None, - advance: Optional[float] = None, - description: Optional[str] = None, - visible: Optional[bool] = None, - refresh: bool = False, - **fields: Any, - ) -> None: - """Update information associated with a task. - - Args: - task_id (TaskID): Task id (returned by add_task). - total (float, optional): Updates task.total if not None. - completed (float, optional): Updates task.completed if not None. - advance (float, optional): Add a value to task.completed if not None. - description (str, optional): Change task description if not None. - visible (bool, optional): Set visible flag if not None. - refresh (bool): Force a refresh of progress information. Default is False. - **fields (Any): Additional data fields required for rendering. - """ - with self._lock: - task = self._tasks[task_id] - completed_start = task.completed - - if total is not None and total != task.total: - task.total = total - task._reset() - if advance is not None: - task.completed += advance - if completed is not None: - task.completed = completed - if description is not None: - task.description = description - if visible is not None: - task.visible = visible - task.fields.update(fields) - update_completed = task.completed - completed_start - - current_time = self.get_time() - old_sample_time = current_time - self.speed_estimate_period - _progress = task._progress - - popleft = _progress.popleft - while _progress and _progress[0].timestamp < old_sample_time: - popleft() - if update_completed > 0: - _progress.append(ProgressSample(current_time, update_completed)) - if ( - task.total is not None - and task.completed >= task.total - and task.finished_time is None - ): - task.finished_time = task.elapsed - - if refresh: - self.refresh() - - def reset( - self, - task_id: TaskID, - *, - start: bool = True, - total: Optional[float] = None, - completed: int = 0, - visible: Optional[bool] = None, - description: Optional[str] = None, - **fields: Any, - ) -> None: - """Reset a task so completed is 0 and the clock is reset. - - Args: - task_id (TaskID): ID of task. - start (bool, optional): Start the task after reset. Defaults to True. - total (float, optional): New total steps in task, or None to use current total. Defaults to None. - completed (int, optional): Number of steps completed. Defaults to 0. - visible (bool, optional): Enable display of the task. Defaults to True. - description (str, optional): Change task description if not None. Defaults to None. - **fields (str): Additional data fields required for rendering. - """ - current_time = self.get_time() - with self._lock: - task = self._tasks[task_id] - task._reset() - task.start_time = current_time if start else None - if total is not None: - task.total = total - task.completed = completed - if visible is not None: - task.visible = visible - if fields: - task.fields = fields - if description is not None: - task.description = description - task.finished_time = None - self.refresh() - - def advance(self, task_id: TaskID, advance: float = 1) -> None: - """Advance task by a number of steps. - - Args: - task_id (TaskID): ID of task. - advance (float): Number of steps to advance. Default is 1. - """ - current_time = self.get_time() - with self._lock: - task = self._tasks[task_id] - completed_start = task.completed - task.completed += advance - update_completed = task.completed - completed_start - old_sample_time = current_time - self.speed_estimate_period - _progress = task._progress - - popleft = _progress.popleft - while _progress and _progress[0].timestamp < old_sample_time: - popleft() - while len(_progress) > 1000: - popleft() - _progress.append(ProgressSample(current_time, update_completed)) - if ( - task.total is not None - and task.completed >= task.total - and task.finished_time is None - ): - task.finished_time = task.elapsed - task.finished_speed = task.speed - - def refresh(self) -> None: - """Refresh (render) the progress information.""" - if not self.disable and self.live.is_started: - self.live.refresh() - - def get_renderable(self) -> RenderableType: - """Get a renderable for the progress display.""" - renderable = Group(*self.get_renderables()) - return renderable - - def get_renderables(self) -> Iterable[RenderableType]: - """Get a number of renderables for the progress display.""" - table = self.make_tasks_table(self.tasks) - yield table - - def make_tasks_table(self, tasks: Iterable[Task]) -> Table: - """Get a table to render the Progress display. - - Args: - tasks (Iterable[Task]): An iterable of Task instances, one per row of the table. - - Returns: - Table: A table instance. - """ - table_columns = ( - ( - Column(no_wrap=True) - if isinstance(_column, str) - else _column.get_table_column().copy() - ) - for _column in self.columns - ) - table = Table.grid(*table_columns, padding=(0, 1), expand=self.expand) - - for task in tasks: - if task.visible: - table.add_row( - *( - ( - column.format(task=task) - if isinstance(column, str) - else column(task) - ) - for column in self.columns - ) - ) - return table - - def __rich__(self) -> RenderableType: - """Makes the Progress class itself renderable.""" - with self._lock: - return self.get_renderable() - - def add_task( - self, - description: str, - start: bool = True, - total: Optional[float] = 100.0, - completed: int = 0, - visible: bool = True, - **fields: Any, - ) -> TaskID: - """Add a new 'task' to the Progress display. - - Args: - description (str): A description of the task. - start (bool, optional): Start the task immediately (to calculate elapsed time). If set to False, - you will need to call `start` manually. Defaults to True. - total (float, optional): Number of total steps in the progress if known. - Set to None to render a pulsing animation. Defaults to 100. - completed (int, optional): Number of steps completed so far. Defaults to 0. - visible (bool, optional): Enable display of the task. Defaults to True. - **fields (str): Additional data fields required for rendering. - - Returns: - TaskID: An ID you can use when calling `update`. - """ - with self._lock: - task = Task( - self._task_index, - description, - total, - completed, - visible=visible, - fields=fields, - _get_time=self.get_time, - _lock=self._lock, - ) - self._tasks[self._task_index] = task - if start: - self.start_task(self._task_index) - new_task_index = self._task_index - self._task_index = TaskID(int(self._task_index) + 1) - self.refresh() - return new_task_index - - def remove_task(self, task_id: TaskID) -> None: - """Delete a task if it exists. - - Args: - task_id (TaskID): A task ID. - - """ - with self._lock: - del self._tasks[task_id] - - -if __name__ == "__main__": # pragma: no coverage - - import random - import time - - from .panel import Panel - from .rule import Rule - from .syntax import Syntax - from .table import Table - - syntax = Syntax( - '''def loop_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]: - """Iterate and generate a tuple with a flag for last value.""" - iter_values = iter(values) - try: - previous_value = next(iter_values) - except StopIteration: - return - for value in iter_values: - yield False, previous_value - previous_value = value - yield True, previous_value''', - "python", - line_numbers=True, - ) - - table = Table("foo", "bar", "baz") - table.add_row("1", "2", "3") - - progress_renderables = [ - "Text may be printed while the progress bars are rendering.", - Panel("In fact, [i]any[/i] renderable will work"), - "Such as [magenta]tables[/]...", - table, - "Pretty printed structures...", - {"type": "example", "text": "Pretty printed"}, - "Syntax...", - syntax, - Rule("Give it a try!"), - ] - - from itertools import cycle - - examples = cycle(progress_renderables) - - console = Console(record=True) - - with Progress( - SpinnerColumn(), - *Progress.get_default_columns(), - TimeElapsedColumn(), - console=console, - transient=False, - ) as progress: - - task1 = progress.add_task("[red]Downloading", total=1000) - task2 = progress.add_task("[green]Processing", total=1000) - task3 = progress.add_task("[yellow]Thinking", total=None) - - while not progress.finished: - progress.update(task1, advance=0.5) - progress.update(task2, advance=0.3) - time.sleep(0.01) - if random.randint(0, 100) < 1: - progress.log(next(examples)) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/progress_bar.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/progress_bar.py deleted file mode 100644 index 67361df..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/progress_bar.py +++ /dev/null @@ -1,224 +0,0 @@ -import math -from functools import lru_cache -from time import monotonic -from typing import Iterable, List, Optional - -from .color import Color, blend_rgb -from .color_triplet import ColorTriplet -from .console import Console, ConsoleOptions, RenderResult -from .jupyter import JupyterMixin -from .measure import Measurement -from .segment import Segment -from .style import Style, StyleType - -# Number of characters before 'pulse' animation repeats -PULSE_SIZE = 20 - - -class ProgressBar(JupyterMixin): - """Renders a (progress) bar. Used by rich.progress. - - Args: - total (float, optional): Number of steps in the bar. Defaults to 100. Set to None to render a pulsing animation. - completed (float, optional): Number of steps completed. Defaults to 0. - width (int, optional): Width of the bar, or ``None`` for maximum width. Defaults to None. - pulse (bool, optional): Enable pulse effect. Defaults to False. Will pulse if a None total was passed. - style (StyleType, optional): Style for the bar background. Defaults to "bar.back". - complete_style (StyleType, optional): Style for the completed bar. Defaults to "bar.complete". - finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.finished". - pulse_style (StyleType, optional): Style for pulsing bars. Defaults to "bar.pulse". - animation_time (Optional[float], optional): Time in seconds to use for animation, or None to use system time. - """ - - def __init__( - self, - total: Optional[float] = 100.0, - completed: float = 0, - width: Optional[int] = None, - pulse: bool = False, - style: StyleType = "bar.back", - complete_style: StyleType = "bar.complete", - finished_style: StyleType = "bar.finished", - pulse_style: StyleType = "bar.pulse", - animation_time: Optional[float] = None, - ): - self.total = total - self.completed = completed - self.width = width - self.pulse = pulse - self.style = style - self.complete_style = complete_style - self.finished_style = finished_style - self.pulse_style = pulse_style - self.animation_time = animation_time - - self._pulse_segments: Optional[List[Segment]] = None - - def __repr__(self) -> str: - return f"<Bar {self.completed!r} of {self.total!r}>" - - @property - def percentage_completed(self) -> Optional[float]: - """Calculate percentage complete.""" - if self.total is None: - return None - completed = (self.completed / self.total) * 100.0 - completed = min(100, max(0.0, completed)) - return completed - - @lru_cache(maxsize=16) - def _get_pulse_segments( - self, - fore_style: Style, - back_style: Style, - color_system: str, - no_color: bool, - ascii: bool = False, - ) -> List[Segment]: - """Get a list of segments to render a pulse animation. - - Returns: - List[Segment]: A list of segments, one segment per character. - """ - bar = "-" if ascii else "━" - segments: List[Segment] = [] - if color_system not in ("standard", "eight_bit", "truecolor") or no_color: - segments += [Segment(bar, fore_style)] * (PULSE_SIZE // 2) - segments += [Segment(" " if no_color else bar, back_style)] * ( - PULSE_SIZE - (PULSE_SIZE // 2) - ) - return segments - - append = segments.append - fore_color = ( - fore_style.color.get_truecolor() - if fore_style.color - else ColorTriplet(255, 0, 255) - ) - back_color = ( - back_style.color.get_truecolor() - if back_style.color - else ColorTriplet(0, 0, 0) - ) - cos = math.cos - pi = math.pi - _Segment = Segment - _Style = Style - from_triplet = Color.from_triplet - - for index in range(PULSE_SIZE): - position = index / PULSE_SIZE - fade = 0.5 + cos((position * pi * 2)) / 2.0 - color = blend_rgb(fore_color, back_color, cross_fade=fade) - append(_Segment(bar, _Style(color=from_triplet(color)))) - return segments - - def update(self, completed: float, total: Optional[float] = None) -> None: - """Update progress with new values. - - Args: - completed (float): Number of steps completed. - total (float, optional): Total number of steps, or ``None`` to not change. Defaults to None. - """ - self.completed = completed - self.total = total if total is not None else self.total - - def _render_pulse( - self, console: Console, width: int, ascii: bool = False - ) -> Iterable[Segment]: - """Renders the pulse animation. - - Args: - console (Console): Console instance. - width (int): Width in characters of pulse animation. - - Returns: - RenderResult: [description] - - Yields: - Iterator[Segment]: Segments to render pulse - """ - fore_style = console.get_style(self.pulse_style, default="white") - back_style = console.get_style(self.style, default="black") - - pulse_segments = self._get_pulse_segments( - fore_style, back_style, console.color_system, console.no_color, ascii=ascii - ) - segment_count = len(pulse_segments) - current_time = ( - monotonic() if self.animation_time is None else self.animation_time - ) - segments = pulse_segments * (int(width / segment_count) + 2) - offset = int(-current_time * 15) % segment_count - segments = segments[offset : offset + width] - yield from segments - - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - - width = min(self.width or options.max_width, options.max_width) - ascii = options.legacy_windows or options.ascii_only - should_pulse = self.pulse or self.total is None - if should_pulse: - yield from self._render_pulse(console, width, ascii=ascii) - return - - completed: Optional[float] = ( - min(self.total, max(0, self.completed)) if self.total is not None else None - ) - - bar = "-" if ascii else "━" - half_bar_right = " " if ascii else "╸" - half_bar_left = " " if ascii else "╺" - complete_halves = ( - int(width * 2 * completed / self.total) - if self.total and completed is not None - else width * 2 - ) - bar_count = complete_halves // 2 - half_bar_count = complete_halves % 2 - style = console.get_style(self.style) - is_finished = self.total is None or self.completed >= self.total - complete_style = console.get_style( - self.finished_style if is_finished else self.complete_style - ) - _Segment = Segment - if bar_count: - yield _Segment(bar * bar_count, complete_style) - if half_bar_count: - yield _Segment(half_bar_right * half_bar_count, complete_style) - - if not console.no_color: - remaining_bars = width - bar_count - half_bar_count - if remaining_bars and console.color_system is not None: - if not half_bar_count and bar_count: - yield _Segment(half_bar_left, style) - remaining_bars -= 1 - if remaining_bars: - yield _Segment(bar * remaining_bars, style) - - def __rich_measure__( - self, console: Console, options: ConsoleOptions - ) -> Measurement: - return ( - Measurement(self.width, self.width) - if self.width is not None - else Measurement(4, options.max_width) - ) - - -if __name__ == "__main__": # pragma: no cover - console = Console() - bar = ProgressBar(width=50, total=100) - - import time - - console.show_cursor(False) - for n in range(0, 101, 1): - bar.update(n) - console.print(bar) - console.file.write("\r") - time.sleep(0.05) - console.show_cursor(True) - console.print() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/prompt.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/prompt.py deleted file mode 100644 index 2bd0a77..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/prompt.py +++ /dev/null @@ -1,376 +0,0 @@ -from typing import Any, Generic, List, Optional, TextIO, TypeVar, Union, overload - -from . import get_console -from .console import Console -from .text import Text, TextType - -PromptType = TypeVar("PromptType") -DefaultType = TypeVar("DefaultType") - - -class PromptError(Exception): - """Exception base class for prompt related errors.""" - - -class InvalidResponse(PromptError): - """Exception to indicate a response was invalid. Raise this within process_response() to indicate an error - and provide an error message. - - Args: - message (Union[str, Text]): Error message. - """ - - def __init__(self, message: TextType) -> None: - self.message = message - - def __rich__(self) -> TextType: - return self.message - - -class PromptBase(Generic[PromptType]): - """Ask the user for input until a valid response is received. This is the base class, see one of - the concrete classes for examples. - - Args: - prompt (TextType, optional): Prompt text. Defaults to "". - console (Console, optional): A Console instance or None to use global console. Defaults to None. - password (bool, optional): Enable password input. Defaults to False. - choices (List[str], optional): A list of valid choices. Defaults to None. - show_default (bool, optional): Show default in prompt. Defaults to True. - show_choices (bool, optional): Show choices in prompt. Defaults to True. - """ - - response_type: type = str - - validate_error_message = "[prompt.invalid]Please enter a valid value" - illegal_choice_message = ( - "[prompt.invalid.choice]Please select one of the available options" - ) - prompt_suffix = ": " - - choices: Optional[List[str]] = None - - def __init__( - self, - prompt: TextType = "", - *, - console: Optional[Console] = None, - password: bool = False, - choices: Optional[List[str]] = None, - show_default: bool = True, - show_choices: bool = True, - ) -> None: - self.console = console or get_console() - self.prompt = ( - Text.from_markup(prompt, style="prompt") - if isinstance(prompt, str) - else prompt - ) - self.password = password - if choices is not None: - self.choices = choices - self.show_default = show_default - self.show_choices = show_choices - - @classmethod - @overload - def ask( - cls, - prompt: TextType = "", - *, - console: Optional[Console] = None, - password: bool = False, - choices: Optional[List[str]] = None, - show_default: bool = True, - show_choices: bool = True, - default: DefaultType, - stream: Optional[TextIO] = None, - ) -> Union[DefaultType, PromptType]: - ... - - @classmethod - @overload - def ask( - cls, - prompt: TextType = "", - *, - console: Optional[Console] = None, - password: bool = False, - choices: Optional[List[str]] = None, - show_default: bool = True, - show_choices: bool = True, - stream: Optional[TextIO] = None, - ) -> PromptType: - ... - - @classmethod - def ask( - cls, - prompt: TextType = "", - *, - console: Optional[Console] = None, - password: bool = False, - choices: Optional[List[str]] = None, - show_default: bool = True, - show_choices: bool = True, - default: Any = ..., - stream: Optional[TextIO] = None, - ) -> Any: - """Shortcut to construct and run a prompt loop and return the result. - - Example: - >>> filename = Prompt.ask("Enter a filename") - - Args: - prompt (TextType, optional): Prompt text. Defaults to "". - console (Console, optional): A Console instance or None to use global console. Defaults to None. - password (bool, optional): Enable password input. Defaults to False. - choices (List[str], optional): A list of valid choices. Defaults to None. - show_default (bool, optional): Show default in prompt. Defaults to True. - show_choices (bool, optional): Show choices in prompt. Defaults to True. - stream (TextIO, optional): Optional text file open for reading to get input. Defaults to None. - """ - _prompt = cls( - prompt, - console=console, - password=password, - choices=choices, - show_default=show_default, - show_choices=show_choices, - ) - return _prompt(default=default, stream=stream) - - def render_default(self, default: DefaultType) -> Text: - """Turn the supplied default in to a Text instance. - - Args: - default (DefaultType): Default value. - - Returns: - Text: Text containing rendering of default value. - """ - return Text(f"({default})", "prompt.default") - - def make_prompt(self, default: DefaultType) -> Text: - """Make prompt text. - - Args: - default (DefaultType): Default value. - - Returns: - Text: Text to display in prompt. - """ - prompt = self.prompt.copy() - prompt.end = "" - - if self.show_choices and self.choices: - _choices = "/".join(self.choices) - choices = f"[{_choices}]" - prompt.append(" ") - prompt.append(choices, "prompt.choices") - - if ( - default != ... - and self.show_default - and isinstance(default, (str, self.response_type)) - ): - prompt.append(" ") - _default = self.render_default(default) - prompt.append(_default) - - prompt.append(self.prompt_suffix) - - return prompt - - @classmethod - def get_input( - cls, - console: Console, - prompt: TextType, - password: bool, - stream: Optional[TextIO] = None, - ) -> str: - """Get input from user. - - Args: - console (Console): Console instance. - prompt (TextType): Prompt text. - password (bool): Enable password entry. - - Returns: - str: String from user. - """ - return console.input(prompt, password=password, stream=stream) - - def check_choice(self, value: str) -> bool: - """Check value is in the list of valid choices. - - Args: - value (str): Value entered by user. - - Returns: - bool: True if choice was valid, otherwise False. - """ - assert self.choices is not None - return value.strip() in self.choices - - def process_response(self, value: str) -> PromptType: - """Process response from user, convert to prompt type. - - Args: - value (str): String typed by user. - - Raises: - InvalidResponse: If ``value`` is invalid. - - Returns: - PromptType: The value to be returned from ask method. - """ - value = value.strip() - try: - return_value: PromptType = self.response_type(value) - except ValueError: - raise InvalidResponse(self.validate_error_message) - - if self.choices is not None and not self.check_choice(value): - raise InvalidResponse(self.illegal_choice_message) - - return return_value - - def on_validate_error(self, value: str, error: InvalidResponse) -> None: - """Called to handle validation error. - - Args: - value (str): String entered by user. - error (InvalidResponse): Exception instance the initiated the error. - """ - self.console.print(error) - - def pre_prompt(self) -> None: - """Hook to display something before the prompt.""" - - @overload - def __call__(self, *, stream: Optional[TextIO] = None) -> PromptType: - ... - - @overload - def __call__( - self, *, default: DefaultType, stream: Optional[TextIO] = None - ) -> Union[PromptType, DefaultType]: - ... - - def __call__(self, *, default: Any = ..., stream: Optional[TextIO] = None) -> Any: - """Run the prompt loop. - - Args: - default (Any, optional): Optional default value. - - Returns: - PromptType: Processed value. - """ - while True: - self.pre_prompt() - prompt = self.make_prompt(default) - value = self.get_input(self.console, prompt, self.password, stream=stream) - if value == "" and default != ...: - return default - try: - return_value = self.process_response(value) - except InvalidResponse as error: - self.on_validate_error(value, error) - continue - else: - return return_value - - -class Prompt(PromptBase[str]): - """A prompt that returns a str. - - Example: - >>> name = Prompt.ask("Enter your name") - - - """ - - response_type = str - - -class IntPrompt(PromptBase[int]): - """A prompt that returns an integer. - - Example: - >>> burrito_count = IntPrompt.ask("How many burritos do you want to order") - - """ - - response_type = int - validate_error_message = "[prompt.invalid]Please enter a valid integer number" - - -class FloatPrompt(PromptBase[int]): - """A prompt that returns a float. - - Example: - >>> temperature = FloatPrompt.ask("Enter desired temperature") - - """ - - response_type = float - validate_error_message = "[prompt.invalid]Please enter a number" - - -class Confirm(PromptBase[bool]): - """A yes / no confirmation prompt. - - Example: - >>> if Confirm.ask("Continue"): - run_job() - - """ - - response_type = bool - validate_error_message = "[prompt.invalid]Please enter Y or N" - choices: List[str] = ["y", "n"] - - def render_default(self, default: DefaultType) -> Text: - """Render the default as (y) or (n) rather than True/False.""" - yes, no = self.choices - return Text(f"({yes})" if default else f"({no})", style="prompt.default") - - def process_response(self, value: str) -> bool: - """Convert choices to a bool.""" - value = value.strip().lower() - if value not in self.choices: - raise InvalidResponse(self.validate_error_message) - return value == self.choices[0] - - -if __name__ == "__main__": # pragma: no cover - - from pip._vendor.rich import print - - if Confirm.ask("Run [i]prompt[/i] tests?", default=True): - while True: - result = IntPrompt.ask( - ":rocket: Enter a number between [b]1[/b] and [b]10[/b]", default=5 - ) - if result >= 1 and result <= 10: - break - print(":pile_of_poo: [prompt.invalid]Number must be between 1 and 10") - print(f"number={result}") - - while True: - password = Prompt.ask( - "Please enter a password [cyan](must be at least 5 characters)", - password=True, - ) - if len(password) >= 5: - break - print("[prompt.invalid]password too short") - print(f"password={password!r}") - - fruit = Prompt.ask("Enter a fruit", choices=["apple", "orange", "pear"]) - print(f"fruit={fruit!r}") - - else: - print("[b]OK :loudly_crying_face:") diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/protocol.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/protocol.py deleted file mode 100644 index 12ab237..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/protocol.py +++ /dev/null @@ -1,42 +0,0 @@ -from typing import Any, cast, Set, TYPE_CHECKING -from inspect import isclass - -if TYPE_CHECKING: - from pip._vendor.rich.console import RenderableType - -_GIBBERISH = """aihwerij235234ljsdnp34ksodfipwoe234234jlskjdf""" - - -def is_renderable(check_object: Any) -> bool: - """Check if an object may be rendered by Rich.""" - return ( - isinstance(check_object, str) - or hasattr(check_object, "__rich__") - or hasattr(check_object, "__rich_console__") - ) - - -def rich_cast(renderable: object) -> "RenderableType": - """Cast an object to a renderable by calling __rich__ if present. - - Args: - renderable (object): A potentially renderable object - - Returns: - object: The result of recursively calling __rich__. - """ - from pip._vendor.rich.console import RenderableType - - rich_visited_set: Set[type] = set() # Prevent potential infinite loop - while hasattr(renderable, "__rich__") and not isclass(renderable): - # Detect object which claim to have all the attributes - if hasattr(renderable, _GIBBERISH): - return repr(renderable) - cast_method = getattr(renderable, "__rich__") - renderable = cast_method() - renderable_type = type(renderable) - if renderable_type in rich_visited_set: - break - rich_visited_set.add(renderable_type) - - return cast(RenderableType, renderable) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/region.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/region.py deleted file mode 100644 index 75b3631..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/region.py +++ /dev/null @@ -1,10 +0,0 @@ -from typing import NamedTuple - - -class Region(NamedTuple): - """Defines a rectangular region of the screen.""" - - x: int - y: int - width: int - height: int diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/repr.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/repr.py deleted file mode 100644 index f284bca..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/repr.py +++ /dev/null @@ -1,149 +0,0 @@ -import inspect -from functools import partial -from typing import ( - Any, - Callable, - Iterable, - List, - Optional, - Tuple, - Type, - TypeVar, - Union, - overload, -) - -T = TypeVar("T") - - -Result = Iterable[Union[Any, Tuple[Any], Tuple[str, Any], Tuple[str, Any, Any]]] -RichReprResult = Result - - -class ReprError(Exception): - """An error occurred when attempting to build a repr.""" - - -@overload -def auto(cls: Optional[Type[T]]) -> Type[T]: - ... - - -@overload -def auto(*, angular: bool = False) -> Callable[[Type[T]], Type[T]]: - ... - - -def auto( - cls: Optional[Type[T]] = None, *, angular: Optional[bool] = None -) -> Union[Type[T], Callable[[Type[T]], Type[T]]]: - """Class decorator to create __repr__ from __rich_repr__""" - - def do_replace(cls: Type[T], angular: Optional[bool] = None) -> Type[T]: - def auto_repr(self: T) -> str: - """Create repr string from __rich_repr__""" - repr_str: List[str] = [] - append = repr_str.append - - angular: bool = getattr(self.__rich_repr__, "angular", False) # type: ignore[attr-defined] - for arg in self.__rich_repr__(): # type: ignore[attr-defined] - if isinstance(arg, tuple): - if len(arg) == 1: - append(repr(arg[0])) - else: - key, value, *default = arg - if key is None: - append(repr(value)) - else: - if default and default[0] == value: - continue - append(f"{key}={value!r}") - else: - append(repr(arg)) - if angular: - return f"<{self.__class__.__name__} {' '.join(repr_str)}>" - else: - return f"{self.__class__.__name__}({', '.join(repr_str)})" - - def auto_rich_repr(self: Type[T]) -> Result: - """Auto generate __rich_rep__ from signature of __init__""" - try: - signature = inspect.signature(self.__init__) - for name, param in signature.parameters.items(): - if param.kind == param.POSITIONAL_ONLY: - yield getattr(self, name) - elif param.kind in ( - param.POSITIONAL_OR_KEYWORD, - param.KEYWORD_ONLY, - ): - if param.default == param.empty: - yield getattr(self, param.name) - else: - yield param.name, getattr(self, param.name), param.default - except Exception as error: - raise ReprError( - f"Failed to auto generate __rich_repr__; {error}" - ) from None - - if not hasattr(cls, "__rich_repr__"): - auto_rich_repr.__doc__ = "Build a rich repr" - cls.__rich_repr__ = auto_rich_repr # type: ignore[attr-defined] - - auto_repr.__doc__ = "Return repr(self)" - cls.__repr__ = auto_repr # type: ignore[assignment] - if angular is not None: - cls.__rich_repr__.angular = angular # type: ignore[attr-defined] - return cls - - if cls is None: - return partial(do_replace, angular=angular) - else: - return do_replace(cls, angular=angular) - - -@overload -def rich_repr(cls: Optional[Type[T]]) -> Type[T]: - ... - - -@overload -def rich_repr(*, angular: bool = False) -> Callable[[Type[T]], Type[T]]: - ... - - -def rich_repr( - cls: Optional[Type[T]] = None, *, angular: bool = False -) -> Union[Type[T], Callable[[Type[T]], Type[T]]]: - if cls is None: - return auto(angular=angular) - else: - return auto(cls) - - -if __name__ == "__main__": - - @auto - class Foo: - def __rich_repr__(self) -> Result: - yield "foo" - yield "bar", {"shopping": ["eggs", "ham", "pineapple"]} - yield "buy", "hand sanitizer" - - foo = Foo() - from pip._vendor.rich.console import Console - - console = Console() - - console.rule("Standard repr") - console.print(foo) - - console.print(foo, width=60) - console.print(foo, width=30) - - console.rule("Angular repr") - Foo.__rich_repr__.angular = True # type: ignore[attr-defined] - - console.print(foo) - - console.print(foo, width=60) - console.print(foo, width=30) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/rule.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/rule.py deleted file mode 100644 index fd00ce6..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/rule.py +++ /dev/null @@ -1,130 +0,0 @@ -from typing import Union - -from .align import AlignMethod -from .cells import cell_len, set_cell_size -from .console import Console, ConsoleOptions, RenderResult -from .jupyter import JupyterMixin -from .measure import Measurement -from .style import Style -from .text import Text - - -class Rule(JupyterMixin): - """A console renderable to draw a horizontal rule (line). - - Args: - title (Union[str, Text], optional): Text to render in the rule. Defaults to "". - characters (str, optional): Character(s) used to draw the line. Defaults to "─". - style (StyleType, optional): Style of Rule. Defaults to "rule.line". - end (str, optional): Character at end of Rule. defaults to "\\\\n" - align (str, optional): How to align the title, one of "left", "center", or "right". Defaults to "center". - """ - - def __init__( - self, - title: Union[str, Text] = "", - *, - characters: str = "─", - style: Union[str, Style] = "rule.line", - end: str = "\n", - align: AlignMethod = "center", - ) -> None: - if cell_len(characters) < 1: - raise ValueError( - "'characters' argument must have a cell width of at least 1" - ) - if align not in ("left", "center", "right"): - raise ValueError( - f'invalid value for align, expected "left", "center", "right" (not {align!r})' - ) - self.title = title - self.characters = characters - self.style = style - self.end = end - self.align = align - - def __repr__(self) -> str: - return f"Rule({self.title!r}, {self.characters!r})" - - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - width = options.max_width - - characters = ( - "-" - if (options.ascii_only and not self.characters.isascii()) - else self.characters - ) - - chars_len = cell_len(characters) - if not self.title: - yield self._rule_line(chars_len, width) - return - - if isinstance(self.title, Text): - title_text = self.title - else: - title_text = console.render_str(self.title, style="rule.text") - - title_text.plain = title_text.plain.replace("\n", " ") - title_text.expand_tabs() - - required_space = 4 if self.align == "center" else 2 - truncate_width = max(0, width - required_space) - if not truncate_width: - yield self._rule_line(chars_len, width) - return - - rule_text = Text(end=self.end) - if self.align == "center": - title_text.truncate(truncate_width, overflow="ellipsis") - side_width = (width - cell_len(title_text.plain)) // 2 - left = Text(characters * (side_width // chars_len + 1)) - left.truncate(side_width - 1) - right_length = width - cell_len(left.plain) - cell_len(title_text.plain) - right = Text(characters * (side_width // chars_len + 1)) - right.truncate(right_length) - rule_text.append(left.plain + " ", self.style) - rule_text.append(title_text) - rule_text.append(" " + right.plain, self.style) - elif self.align == "left": - title_text.truncate(truncate_width, overflow="ellipsis") - rule_text.append(title_text) - rule_text.append(" ") - rule_text.append(characters * (width - rule_text.cell_len), self.style) - elif self.align == "right": - title_text.truncate(truncate_width, overflow="ellipsis") - rule_text.append(characters * (width - title_text.cell_len - 1), self.style) - rule_text.append(" ") - rule_text.append(title_text) - - rule_text.plain = set_cell_size(rule_text.plain, width) - yield rule_text - - def _rule_line(self, chars_len: int, width: int) -> Text: - rule_text = Text(self.characters * ((width // chars_len) + 1), self.style) - rule_text.truncate(width) - rule_text.plain = set_cell_size(rule_text.plain, width) - return rule_text - - def __rich_measure__( - self, console: Console, options: ConsoleOptions - ) -> Measurement: - return Measurement(1, 1) - - -if __name__ == "__main__": # pragma: no cover - import sys - - from pip._vendor.rich.console import Console - - try: - text = sys.argv[1] - except IndexError: - text = "Hello, World" - console = Console() - console.print(Rule(title=text)) - - console = Console() - console.print(Rule("foo"), width=4) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/scope.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/scope.py deleted file mode 100644 index c9d134c..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/scope.py +++ /dev/null @@ -1,86 +0,0 @@ -from collections.abc import Mapping -from typing import TYPE_CHECKING, Any, Optional, Tuple - -from .highlighter import ReprHighlighter -from .panel import Panel -from .pretty import Pretty -from .table import Table -from .text import Text, TextType - -if TYPE_CHECKING: - from .console import ConsoleRenderable - - -def render_scope( - scope: "Mapping[str, Any]", - *, - title: Optional[TextType] = None, - sort_keys: bool = True, - indent_guides: bool = False, - max_length: Optional[int] = None, - max_string: Optional[int] = None, -) -> "ConsoleRenderable": - """Render python variables in a given scope. - - Args: - scope (Mapping): A mapping containing variable names and values. - title (str, optional): Optional title. Defaults to None. - sort_keys (bool, optional): Enable sorting of items. Defaults to True. - indent_guides (bool, optional): Enable indentation guides. Defaults to False. - max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. - Defaults to None. - max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to None. - - Returns: - ConsoleRenderable: A renderable object. - """ - highlighter = ReprHighlighter() - items_table = Table.grid(padding=(0, 1), expand=False) - items_table.add_column(justify="right") - - def sort_items(item: Tuple[str, Any]) -> Tuple[bool, str]: - """Sort special variables first, then alphabetically.""" - key, _ = item - return (not key.startswith("__"), key.lower()) - - items = sorted(scope.items(), key=sort_items) if sort_keys else scope.items() - for key, value in items: - key_text = Text.assemble( - (key, "scope.key.special" if key.startswith("__") else "scope.key"), - (" =", "scope.equals"), - ) - items_table.add_row( - key_text, - Pretty( - value, - highlighter=highlighter, - indent_guides=indent_guides, - max_length=max_length, - max_string=max_string, - ), - ) - return Panel.fit( - items_table, - title=title, - border_style="scope.border", - padding=(0, 1), - ) - - -if __name__ == "__main__": # pragma: no cover - from pip._vendor.rich import print - - print() - - def test(foo: float, bar: float) -> None: - list_of_things = [1, 2, 3, None, 4, True, False, "Hello World"] - dict_of_things = { - "version": "1.1", - "method": "confirmFruitPurchase", - "params": [["apple", "orange", "mangoes", "pomelo"], 1.123], - "id": "194521489", - } - print(render_scope(locals(), title="[i]locals", sort_keys=False)) - - test(20.3423, 3.1427) - print() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/screen.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/screen.py deleted file mode 100644 index 7f416e1..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/screen.py +++ /dev/null @@ -1,54 +0,0 @@ -from typing import Optional, TYPE_CHECKING - -from .segment import Segment -from .style import StyleType -from ._loop import loop_last - - -if TYPE_CHECKING: - from .console import ( - Console, - ConsoleOptions, - RenderResult, - RenderableType, - Group, - ) - - -class Screen: - """A renderable that fills the terminal screen and crops excess. - - Args: - renderable (RenderableType): Child renderable. - style (StyleType, optional): Optional background style. Defaults to None. - """ - - renderable: "RenderableType" - - def __init__( - self, - *renderables: "RenderableType", - style: Optional[StyleType] = None, - application_mode: bool = False, - ) -> None: - from pip._vendor.rich.console import Group - - self.renderable = Group(*renderables) - self.style = style - self.application_mode = application_mode - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - width, height = options.size - style = console.get_style(self.style) if self.style else None - render_options = options.update(width=width, height=height) - lines = console.render_lines( - self.renderable or "", render_options, style=style, pad=True - ) - lines = Segment.set_shape(lines, width, height, style=style) - new_line = Segment("\n\r") if self.application_mode else Segment.line() - for last, line in loop_last(lines): - yield from line - if not last: - yield new_line diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/segment.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/segment.py deleted file mode 100644 index e125798..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/segment.py +++ /dev/null @@ -1,739 +0,0 @@ -from enum import IntEnum -from functools import lru_cache -from itertools import filterfalse -from logging import getLogger -from operator import attrgetter -from typing import ( - TYPE_CHECKING, - Dict, - Iterable, - List, - NamedTuple, - Optional, - Sequence, - Tuple, - Type, - Union, -) - -from .cells import ( - _is_single_cell_widths, - cached_cell_len, - cell_len, - get_character_cell_size, - set_cell_size, -) -from .repr import Result, rich_repr -from .style import Style - -if TYPE_CHECKING: - from .console import Console, ConsoleOptions, RenderResult - -log = getLogger("rich") - - -class ControlType(IntEnum): - """Non-printable control codes which typically translate to ANSI codes.""" - - BELL = 1 - CARRIAGE_RETURN = 2 - HOME = 3 - CLEAR = 4 - SHOW_CURSOR = 5 - HIDE_CURSOR = 6 - ENABLE_ALT_SCREEN = 7 - DISABLE_ALT_SCREEN = 8 - CURSOR_UP = 9 - CURSOR_DOWN = 10 - CURSOR_FORWARD = 11 - CURSOR_BACKWARD = 12 - CURSOR_MOVE_TO_COLUMN = 13 - CURSOR_MOVE_TO = 14 - ERASE_IN_LINE = 15 - SET_WINDOW_TITLE = 16 - - -ControlCode = Union[ - Tuple[ControlType], - Tuple[ControlType, Union[int, str]], - Tuple[ControlType, int, int], -] - - -@rich_repr() -class Segment(NamedTuple): - """A piece of text with associated style. Segments are produced by the Console render process and - are ultimately converted in to strings to be written to the terminal. - - Args: - text (str): A piece of text. - style (:class:`~rich.style.Style`, optional): An optional style to apply to the text. - control (Tuple[ControlCode], optional): Optional sequence of control codes. - - Attributes: - cell_length (int): The cell length of this Segment. - """ - - text: str - style: Optional[Style] = None - control: Optional[Sequence[ControlCode]] = None - - @property - def cell_length(self) -> int: - """The number of terminal cells required to display self.text. - - Returns: - int: A number of cells. - """ - text, _style, control = self - return 0 if control else cell_len(text) - - def __rich_repr__(self) -> Result: - yield self.text - if self.control is None: - if self.style is not None: - yield self.style - else: - yield self.style - yield self.control - - def __bool__(self) -> bool: - """Check if the segment contains text.""" - return bool(self.text) - - @property - def is_control(self) -> bool: - """Check if the segment contains control codes.""" - return self.control is not None - - @classmethod - @lru_cache(1024 * 16) - def _split_cells(cls, segment: "Segment", cut: int) -> Tuple["Segment", "Segment"]: - - text, style, control = segment - _Segment = Segment - - cell_length = segment.cell_length - if cut >= cell_length: - return segment, _Segment("", style, control) - - cell_size = get_character_cell_size - - pos = int((cut / cell_length) * (len(text) - 1)) - - before = text[:pos] - cell_pos = cell_len(before) - if cell_pos == cut: - return ( - _Segment(before, style, control), - _Segment(text[pos:], style, control), - ) - while pos < len(text): - char = text[pos] - pos += 1 - cell_pos += cell_size(char) - before = text[:pos] - if cell_pos == cut: - return ( - _Segment(before, style, control), - _Segment(text[pos:], style, control), - ) - if cell_pos > cut: - return ( - _Segment(before[: pos - 1] + " ", style, control), - _Segment(" " + text[pos:], style, control), - ) - - raise AssertionError("Will never reach here") - - def split_cells(self, cut: int) -> Tuple["Segment", "Segment"]: - """Split segment in to two segments at the specified column. - - If the cut point falls in the middle of a 2-cell wide character then it is replaced - by two spaces, to preserve the display width of the parent segment. - - Returns: - Tuple[Segment, Segment]: Two segments. - """ - text, style, control = self - - if _is_single_cell_widths(text): - # Fast path with all 1 cell characters - if cut >= len(text): - return self, Segment("", style, control) - return ( - Segment(text[:cut], style, control), - Segment(text[cut:], style, control), - ) - - return self._split_cells(self, cut) - - @classmethod - def line(cls) -> "Segment": - """Make a new line segment.""" - return cls("\n") - - @classmethod - def apply_style( - cls, - segments: Iterable["Segment"], - style: Optional[Style] = None, - post_style: Optional[Style] = None, - ) -> Iterable["Segment"]: - """Apply style(s) to an iterable of segments. - - Returns an iterable of segments where the style is replaced by ``style + segment.style + post_style``. - - Args: - segments (Iterable[Segment]): Segments to process. - style (Style, optional): Base style. Defaults to None. - post_style (Style, optional): Style to apply on top of segment style. Defaults to None. - - Returns: - Iterable[Segments]: A new iterable of segments (possibly the same iterable). - """ - result_segments = segments - if style: - apply = style.__add__ - result_segments = ( - cls(text, None if control else apply(_style), control) - for text, _style, control in result_segments - ) - if post_style: - result_segments = ( - cls( - text, - ( - None - if control - else (_style + post_style if _style else post_style) - ), - control, - ) - for text, _style, control in result_segments - ) - return result_segments - - @classmethod - def filter_control( - cls, segments: Iterable["Segment"], is_control: bool = False - ) -> Iterable["Segment"]: - """Filter segments by ``is_control`` attribute. - - Args: - segments (Iterable[Segment]): An iterable of Segment instances. - is_control (bool, optional): is_control flag to match in search. - - Returns: - Iterable[Segment]: And iterable of Segment instances. - - """ - if is_control: - return filter(attrgetter("control"), segments) - else: - return filterfalse(attrgetter("control"), segments) - - @classmethod - def split_lines(cls, segments: Iterable["Segment"]) -> Iterable[List["Segment"]]: - """Split a sequence of segments in to a list of lines. - - Args: - segments (Iterable[Segment]): Segments potentially containing line feeds. - - Yields: - Iterable[List[Segment]]: Iterable of segment lists, one per line. - """ - line: List[Segment] = [] - append = line.append - - for segment in segments: - if "\n" in segment.text and not segment.control: - text, style, _ = segment - while text: - _text, new_line, text = text.partition("\n") - if _text: - append(cls(_text, style)) - if new_line: - yield line - line = [] - append = line.append - else: - append(segment) - if line: - yield line - - @classmethod - def split_and_crop_lines( - cls, - segments: Iterable["Segment"], - length: int, - style: Optional[Style] = None, - pad: bool = True, - include_new_lines: bool = True, - ) -> Iterable[List["Segment"]]: - """Split segments in to lines, and crop lines greater than a given length. - - Args: - segments (Iterable[Segment]): An iterable of segments, probably - generated from console.render. - length (int): Desired line length. - style (Style, optional): Style to use for any padding. - pad (bool): Enable padding of lines that are less than `length`. - - Returns: - Iterable[List[Segment]]: An iterable of lines of segments. - """ - line: List[Segment] = [] - append = line.append - - adjust_line_length = cls.adjust_line_length - new_line_segment = cls("\n") - - for segment in segments: - if "\n" in segment.text and not segment.control: - text, segment_style, _ = segment - while text: - _text, new_line, text = text.partition("\n") - if _text: - append(cls(_text, segment_style)) - if new_line: - cropped_line = adjust_line_length( - line, length, style=style, pad=pad - ) - if include_new_lines: - cropped_line.append(new_line_segment) - yield cropped_line - line.clear() - else: - append(segment) - if line: - yield adjust_line_length(line, length, style=style, pad=pad) - - @classmethod - def adjust_line_length( - cls, - line: List["Segment"], - length: int, - style: Optional[Style] = None, - pad: bool = True, - ) -> List["Segment"]: - """Adjust a line to a given width (cropping or padding as required). - - Args: - segments (Iterable[Segment]): A list of segments in a single line. - length (int): The desired width of the line. - style (Style, optional): The style of padding if used (space on the end). Defaults to None. - pad (bool, optional): Pad lines with spaces if they are shorter than `length`. Defaults to True. - - Returns: - List[Segment]: A line of segments with the desired length. - """ - line_length = sum(segment.cell_length for segment in line) - new_line: List[Segment] - - if line_length < length: - if pad: - new_line = line + [cls(" " * (length - line_length), style)] - else: - new_line = line[:] - elif line_length > length: - new_line = [] - append = new_line.append - line_length = 0 - for segment in line: - segment_length = segment.cell_length - if line_length + segment_length < length or segment.control: - append(segment) - line_length += segment_length - else: - text, segment_style, _ = segment - text = set_cell_size(text, length - line_length) - append(cls(text, segment_style)) - break - else: - new_line = line[:] - return new_line - - @classmethod - def get_line_length(cls, line: List["Segment"]) -> int: - """Get the length of list of segments. - - Args: - line (List[Segment]): A line encoded as a list of Segments (assumes no '\\\\n' characters), - - Returns: - int: The length of the line. - """ - _cell_len = cell_len - return sum(_cell_len(text) for text, style, control in line if not control) - - @classmethod - def get_shape(cls, lines: List[List["Segment"]]) -> Tuple[int, int]: - """Get the shape (enclosing rectangle) of a list of lines. - - Args: - lines (List[List[Segment]]): A list of lines (no '\\\\n' characters). - - Returns: - Tuple[int, int]: Width and height in characters. - """ - get_line_length = cls.get_line_length - max_width = max(get_line_length(line) for line in lines) if lines else 0 - return (max_width, len(lines)) - - @classmethod - def set_shape( - cls, - lines: List[List["Segment"]], - width: int, - height: Optional[int] = None, - style: Optional[Style] = None, - new_lines: bool = False, - ) -> List[List["Segment"]]: - """Set the shape of a list of lines (enclosing rectangle). - - Args: - lines (List[List[Segment]]): A list of lines. - width (int): Desired width. - height (int, optional): Desired height or None for no change. - style (Style, optional): Style of any padding added. - new_lines (bool, optional): Padded lines should include "\n". Defaults to False. - - Returns: - List[List[Segment]]: New list of lines. - """ - _height = height or len(lines) - - blank = ( - [cls(" " * width + "\n", style)] if new_lines else [cls(" " * width, style)] - ) - - adjust_line_length = cls.adjust_line_length - shaped_lines = lines[:_height] - shaped_lines[:] = [ - adjust_line_length(line, width, style=style) for line in lines - ] - if len(shaped_lines) < _height: - shaped_lines.extend([blank] * (_height - len(shaped_lines))) - return shaped_lines - - @classmethod - def align_top( - cls: Type["Segment"], - lines: List[List["Segment"]], - width: int, - height: int, - style: Style, - new_lines: bool = False, - ) -> List[List["Segment"]]: - """Aligns lines to top (adds extra lines to bottom as required). - - Args: - lines (List[List[Segment]]): A list of lines. - width (int): Desired width. - height (int, optional): Desired height or None for no change. - style (Style): Style of any padding added. - new_lines (bool, optional): Padded lines should include "\n". Defaults to False. - - Returns: - List[List[Segment]]: New list of lines. - """ - extra_lines = height - len(lines) - if not extra_lines: - return lines[:] - lines = lines[:height] - blank = cls(" " * width + "\n", style) if new_lines else cls(" " * width, style) - lines = lines + [[blank]] * extra_lines - return lines - - @classmethod - def align_bottom( - cls: Type["Segment"], - lines: List[List["Segment"]], - width: int, - height: int, - style: Style, - new_lines: bool = False, - ) -> List[List["Segment"]]: - """Aligns render to bottom (adds extra lines above as required). - - Args: - lines (List[List[Segment]]): A list of lines. - width (int): Desired width. - height (int, optional): Desired height or None for no change. - style (Style): Style of any padding added. Defaults to None. - new_lines (bool, optional): Padded lines should include "\n". Defaults to False. - - Returns: - List[List[Segment]]: New list of lines. - """ - extra_lines = height - len(lines) - if not extra_lines: - return lines[:] - lines = lines[:height] - blank = cls(" " * width + "\n", style) if new_lines else cls(" " * width, style) - lines = [[blank]] * extra_lines + lines - return lines - - @classmethod - def align_middle( - cls: Type["Segment"], - lines: List[List["Segment"]], - width: int, - height: int, - style: Style, - new_lines: bool = False, - ) -> List[List["Segment"]]: - """Aligns lines to middle (adds extra lines to above and below as required). - - Args: - lines (List[List[Segment]]): A list of lines. - width (int): Desired width. - height (int, optional): Desired height or None for no change. - style (Style): Style of any padding added. - new_lines (bool, optional): Padded lines should include "\n". Defaults to False. - - Returns: - List[List[Segment]]: New list of lines. - """ - extra_lines = height - len(lines) - if not extra_lines: - return lines[:] - lines = lines[:height] - blank = cls(" " * width + "\n", style) if new_lines else cls(" " * width, style) - top_lines = extra_lines // 2 - bottom_lines = extra_lines - top_lines - lines = [[blank]] * top_lines + lines + [[blank]] * bottom_lines - return lines - - @classmethod - def simplify(cls, segments: Iterable["Segment"]) -> Iterable["Segment"]: - """Simplify an iterable of segments by combining contiguous segments with the same style. - - Args: - segments (Iterable[Segment]): An iterable of segments. - - Returns: - Iterable[Segment]: A possibly smaller iterable of segments that will render the same way. - """ - iter_segments = iter(segments) - try: - last_segment = next(iter_segments) - except StopIteration: - return - - _Segment = Segment - for segment in iter_segments: - if last_segment.style == segment.style and not segment.control: - last_segment = _Segment( - last_segment.text + segment.text, last_segment.style - ) - else: - yield last_segment - last_segment = segment - yield last_segment - - @classmethod - def strip_links(cls, segments: Iterable["Segment"]) -> Iterable["Segment"]: - """Remove all links from an iterable of styles. - - Args: - segments (Iterable[Segment]): An iterable segments. - - Yields: - Segment: Segments with link removed. - """ - for segment in segments: - if segment.control or segment.style is None: - yield segment - else: - text, style, _control = segment - yield cls(text, style.update_link(None) if style else None) - - @classmethod - def strip_styles(cls, segments: Iterable["Segment"]) -> Iterable["Segment"]: - """Remove all styles from an iterable of segments. - - Args: - segments (Iterable[Segment]): An iterable segments. - - Yields: - Segment: Segments with styles replace with None - """ - for text, _style, control in segments: - yield cls(text, None, control) - - @classmethod - def remove_color(cls, segments: Iterable["Segment"]) -> Iterable["Segment"]: - """Remove all color from an iterable of segments. - - Args: - segments (Iterable[Segment]): An iterable segments. - - Yields: - Segment: Segments with colorless style. - """ - - cache: Dict[Style, Style] = {} - for text, style, control in segments: - if style: - colorless_style = cache.get(style) - if colorless_style is None: - colorless_style = style.without_color - cache[style] = colorless_style - yield cls(text, colorless_style, control) - else: - yield cls(text, None, control) - - @classmethod - def divide( - cls, segments: Iterable["Segment"], cuts: Iterable[int] - ) -> Iterable[List["Segment"]]: - """Divides an iterable of segments in to portions. - - Args: - cuts (Iterable[int]): Cell positions where to divide. - - Yields: - [Iterable[List[Segment]]]: An iterable of Segments in List. - """ - split_segments: List["Segment"] = [] - add_segment = split_segments.append - - iter_cuts = iter(cuts) - - while True: - cut = next(iter_cuts, -1) - if cut == -1: - return [] - if cut != 0: - break - yield [] - pos = 0 - - segments_clear = split_segments.clear - segments_copy = split_segments.copy - - _cell_len = cached_cell_len - for segment in segments: - text, _style, control = segment - while text: - end_pos = pos if control else pos + _cell_len(text) - if end_pos < cut: - add_segment(segment) - pos = end_pos - break - - if end_pos == cut: - add_segment(segment) - yield segments_copy() - segments_clear() - pos = end_pos - - cut = next(iter_cuts, -1) - if cut == -1: - if split_segments: - yield segments_copy() - return - - break - - else: - before, segment = segment.split_cells(cut - pos) - text, _style, control = segment - add_segment(before) - yield segments_copy() - segments_clear() - pos = cut - - cut = next(iter_cuts, -1) - if cut == -1: - if split_segments: - yield segments_copy() - return - - yield segments_copy() - - -class Segments: - """A simple renderable to render an iterable of segments. This class may be useful if - you want to print segments outside of a __rich_console__ method. - - Args: - segments (Iterable[Segment]): An iterable of segments. - new_lines (bool, optional): Add new lines between segments. Defaults to False. - """ - - def __init__(self, segments: Iterable[Segment], new_lines: bool = False) -> None: - self.segments = list(segments) - self.new_lines = new_lines - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - if self.new_lines: - line = Segment.line() - for segment in self.segments: - yield segment - yield line - else: - yield from self.segments - - -class SegmentLines: - def __init__(self, lines: Iterable[List[Segment]], new_lines: bool = False) -> None: - """A simple renderable containing a number of lines of segments. May be used as an intermediate - in rendering process. - - Args: - lines (Iterable[List[Segment]]): Lists of segments forming lines. - new_lines (bool, optional): Insert new lines after each line. Defaults to False. - """ - self.lines = list(lines) - self.new_lines = new_lines - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - if self.new_lines: - new_line = Segment.line() - for line in self.lines: - yield from line - yield new_line - else: - for line in self.lines: - yield from line - - -if __name__ == "__main__": # pragma: no cover - from pip._vendor.rich.console import Console - from pip._vendor.rich.syntax import Syntax - from pip._vendor.rich.text import Text - - code = """from rich.console import Console -console = Console() -text = Text.from_markup("Hello, [bold magenta]World[/]!") -console.print(text)""" - - text = Text.from_markup("Hello, [bold magenta]World[/]!") - - console = Console() - - console.rule("rich.Segment") - console.print( - "A Segment is the last step in the Rich render process before generating text with ANSI codes." - ) - console.print("\nConsider the following code:\n") - console.print(Syntax(code, "python", line_numbers=True)) - console.print() - console.print( - "When you call [b]print()[/b], Rich [i]renders[/i] the object in to the following:\n" - ) - fragments = list(console.render(text)) - console.print(fragments) - console.print() - console.print("The Segments are then processed to produce the following output:\n") - console.print(text) - console.print( - "\nYou will only need to know this if you are implementing your own Rich renderables." - ) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/spinner.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/spinner.py deleted file mode 100644 index 91ea630..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/spinner.py +++ /dev/null @@ -1,137 +0,0 @@ -from typing import cast, List, Optional, TYPE_CHECKING, Union - -from ._spinners import SPINNERS -from .measure import Measurement -from .table import Table -from .text import Text - -if TYPE_CHECKING: - from .console import Console, ConsoleOptions, RenderResult, RenderableType - from .style import StyleType - - -class Spinner: - """A spinner animation. - - Args: - name (str): Name of spinner (run python -m rich.spinner). - text (RenderableType, optional): A renderable to display at the right of the spinner (str or Text typically). Defaults to "". - style (StyleType, optional): Style for spinner animation. Defaults to None. - speed (float, optional): Speed factor for animation. Defaults to 1.0. - - Raises: - KeyError: If name isn't one of the supported spinner animations. - """ - - def __init__( - self, - name: str, - text: "RenderableType" = "", - *, - style: Optional["StyleType"] = None, - speed: float = 1.0, - ) -> None: - try: - spinner = SPINNERS[name] - except KeyError: - raise KeyError(f"no spinner called {name!r}") - self.text: "Union[RenderableType, Text]" = ( - Text.from_markup(text) if isinstance(text, str) else text - ) - self.frames = cast(List[str], spinner["frames"])[:] - self.interval = cast(float, spinner["interval"]) - self.start_time: Optional[float] = None - self.style = style - self.speed = speed - self.frame_no_offset: float = 0.0 - self._update_speed = 0.0 - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - yield self.render(console.get_time()) - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> Measurement: - text = self.render(0) - return Measurement.get(console, options, text) - - def render(self, time: float) -> "RenderableType": - """Render the spinner for a given time. - - Args: - time (float): Time in seconds. - - Returns: - RenderableType: A renderable containing animation frame. - """ - if self.start_time is None: - self.start_time = time - - frame_no = ((time - self.start_time) * self.speed) / ( - self.interval / 1000.0 - ) + self.frame_no_offset - frame = Text( - self.frames[int(frame_no) % len(self.frames)], style=self.style or "" - ) - - if self._update_speed: - self.frame_no_offset = frame_no - self.start_time = time - self.speed = self._update_speed - self._update_speed = 0.0 - - if not self.text: - return frame - elif isinstance(self.text, (str, Text)): - return Text.assemble(frame, " ", self.text) - else: - table = Table.grid(padding=1) - table.add_row(frame, self.text) - return table - - def update( - self, - *, - text: "RenderableType" = "", - style: Optional["StyleType"] = None, - speed: Optional[float] = None, - ) -> None: - """Updates attributes of a spinner after it has been started. - - Args: - text (RenderableType, optional): A renderable to display at the right of the spinner (str or Text typically). Defaults to "". - style (StyleType, optional): Style for spinner animation. Defaults to None. - speed (float, optional): Speed factor for animation. Defaults to None. - """ - if text: - self.text = Text.from_markup(text) if isinstance(text, str) else text - if style: - self.style = style - if speed: - self._update_speed = speed - - -if __name__ == "__main__": # pragma: no cover - from time import sleep - - from .columns import Columns - from .panel import Panel - from .live import Live - - all_spinners = Columns( - [ - Spinner(spinner_name, text=Text(repr(spinner_name), style="green")) - for spinner_name in sorted(SPINNERS.keys()) - ], - column_first=True, - expand=True, - ) - - with Live( - Panel(all_spinners, title="Spinners", border_style="blue"), - refresh_per_second=20, - ) as live: - while True: - sleep(0.1) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/status.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/status.py deleted file mode 100644 index 09eff40..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/status.py +++ /dev/null @@ -1,132 +0,0 @@ -from types import TracebackType -from typing import Optional, Type - -from .console import Console, RenderableType -from .jupyter import JupyterMixin -from .live import Live -from .spinner import Spinner -from .style import StyleType - - -class Status(JupyterMixin): - """Displays a status indicator with a 'spinner' animation. - - Args: - status (RenderableType): A status renderable (str or Text typically). - console (Console, optional): Console instance to use, or None for global console. Defaults to None. - spinner (str, optional): Name of spinner animation (see python -m rich.spinner). Defaults to "dots". - spinner_style (StyleType, optional): Style of spinner. Defaults to "status.spinner". - speed (float, optional): Speed factor for spinner animation. Defaults to 1.0. - refresh_per_second (float, optional): Number of refreshes per second. Defaults to 12.5. - """ - - def __init__( - self, - status: RenderableType, - *, - console: Optional[Console] = None, - spinner: str = "dots", - spinner_style: StyleType = "status.spinner", - speed: float = 1.0, - refresh_per_second: float = 12.5, - ): - self.status = status - self.spinner_style = spinner_style - self.speed = speed - self._spinner = Spinner(spinner, text=status, style=spinner_style, speed=speed) - self._live = Live( - self.renderable, - console=console, - refresh_per_second=refresh_per_second, - transient=True, - ) - - @property - def renderable(self) -> Spinner: - return self._spinner - - @property - def console(self) -> "Console": - """Get the Console used by the Status objects.""" - return self._live.console - - def update( - self, - status: Optional[RenderableType] = None, - *, - spinner: Optional[str] = None, - spinner_style: Optional[StyleType] = None, - speed: Optional[float] = None, - ) -> None: - """Update status. - - Args: - status (Optional[RenderableType], optional): New status renderable or None for no change. Defaults to None. - spinner (Optional[str], optional): New spinner or None for no change. Defaults to None. - spinner_style (Optional[StyleType], optional): New spinner style or None for no change. Defaults to None. - speed (Optional[float], optional): Speed factor for spinner animation or None for no change. Defaults to None. - """ - if status is not None: - self.status = status - if spinner_style is not None: - self.spinner_style = spinner_style - if speed is not None: - self.speed = speed - if spinner is not None: - self._spinner = Spinner( - spinner, text=self.status, style=self.spinner_style, speed=self.speed - ) - self._live.update(self.renderable, refresh=True) - else: - self._spinner.update( - text=self.status, style=self.spinner_style, speed=self.speed - ) - - def start(self) -> None: - """Start the status animation.""" - self._live.start() - - def stop(self) -> None: - """Stop the spinner animation.""" - self._live.stop() - - def __rich__(self) -> RenderableType: - return self.renderable - - def __enter__(self) -> "Status": - self.start() - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - self.stop() - - -if __name__ == "__main__": # pragma: no cover - - from time import sleep - - from .console import Console - - console = Console() - with console.status("[magenta]Covid detector booting up") as status: - sleep(3) - console.log("Importing advanced AI") - sleep(3) - console.log("Advanced Covid AI Ready") - sleep(3) - status.update(status="[bold blue] Scanning for Covid", spinner="earth") - sleep(3) - console.log("Found 10,000,000,000 copies of Covid32.exe") - sleep(3) - status.update( - status="[bold red]Moving Covid32.exe to Trash", - spinner="bouncingBall", - spinner_style="yellow", - ) - sleep(5) - console.print("[bold green]Covid deleted successfully") diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/style.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/style.py deleted file mode 100644 index 313c889..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/style.py +++ /dev/null @@ -1,796 +0,0 @@ -import sys -from functools import lru_cache -from marshal import dumps, loads -from random import randint -from typing import Any, Dict, Iterable, List, Optional, Type, Union, cast - -from . import errors -from .color import Color, ColorParseError, ColorSystem, blend_rgb -from .repr import Result, rich_repr -from .terminal_theme import DEFAULT_TERMINAL_THEME, TerminalTheme - -# Style instances and style definitions are often interchangeable -StyleType = Union[str, "Style"] - - -class _Bit: - """A descriptor to get/set a style attribute bit.""" - - __slots__ = ["bit"] - - def __init__(self, bit_no: int) -> None: - self.bit = 1 << bit_no - - def __get__(self, obj: "Style", objtype: Type["Style"]) -> Optional[bool]: - if obj._set_attributes & self.bit: - return obj._attributes & self.bit != 0 - return None - - -@rich_repr -class Style: - """A terminal style. - - A terminal style consists of a color (`color`), a background color (`bgcolor`), and a number of attributes, such - as bold, italic etc. The attributes have 3 states: they can either be on - (``True``), off (``False``), or not set (``None``). - - Args: - color (Union[Color, str], optional): Color of terminal text. Defaults to None. - bgcolor (Union[Color, str], optional): Color of terminal background. Defaults to None. - bold (bool, optional): Enable bold text. Defaults to None. - dim (bool, optional): Enable dim text. Defaults to None. - italic (bool, optional): Enable italic text. Defaults to None. - underline (bool, optional): Enable underlined text. Defaults to None. - blink (bool, optional): Enabled blinking text. Defaults to None. - blink2 (bool, optional): Enable fast blinking text. Defaults to None. - reverse (bool, optional): Enabled reverse text. Defaults to None. - conceal (bool, optional): Enable concealed text. Defaults to None. - strike (bool, optional): Enable strikethrough text. Defaults to None. - underline2 (bool, optional): Enable doubly underlined text. Defaults to None. - frame (bool, optional): Enable framed text. Defaults to None. - encircle (bool, optional): Enable encircled text. Defaults to None. - overline (bool, optional): Enable overlined text. Defaults to None. - link (str, link): Link URL. Defaults to None. - - """ - - _color: Optional[Color] - _bgcolor: Optional[Color] - _attributes: int - _set_attributes: int - _hash: Optional[int] - _null: bool - _meta: Optional[bytes] - - __slots__ = [ - "_color", - "_bgcolor", - "_attributes", - "_set_attributes", - "_link", - "_link_id", - "_ansi", - "_style_definition", - "_hash", - "_null", - "_meta", - ] - - # maps bits on to SGR parameter - _style_map = { - 0: "1", - 1: "2", - 2: "3", - 3: "4", - 4: "5", - 5: "6", - 6: "7", - 7: "8", - 8: "9", - 9: "21", - 10: "51", - 11: "52", - 12: "53", - } - - STYLE_ATTRIBUTES = { - "dim": "dim", - "d": "dim", - "bold": "bold", - "b": "bold", - "italic": "italic", - "i": "italic", - "underline": "underline", - "u": "underline", - "blink": "blink", - "blink2": "blink2", - "reverse": "reverse", - "r": "reverse", - "conceal": "conceal", - "c": "conceal", - "strike": "strike", - "s": "strike", - "underline2": "underline2", - "uu": "underline2", - "frame": "frame", - "encircle": "encircle", - "overline": "overline", - "o": "overline", - } - - def __init__( - self, - *, - color: Optional[Union[Color, str]] = None, - bgcolor: Optional[Union[Color, str]] = None, - bold: Optional[bool] = None, - dim: Optional[bool] = None, - italic: Optional[bool] = None, - underline: Optional[bool] = None, - blink: Optional[bool] = None, - blink2: Optional[bool] = None, - reverse: Optional[bool] = None, - conceal: Optional[bool] = None, - strike: Optional[bool] = None, - underline2: Optional[bool] = None, - frame: Optional[bool] = None, - encircle: Optional[bool] = None, - overline: Optional[bool] = None, - link: Optional[str] = None, - meta: Optional[Dict[str, Any]] = None, - ): - self._ansi: Optional[str] = None - self._style_definition: Optional[str] = None - - def _make_color(color: Union[Color, str]) -> Color: - return color if isinstance(color, Color) else Color.parse(color) - - self._color = None if color is None else _make_color(color) - self._bgcolor = None if bgcolor is None else _make_color(bgcolor) - self._set_attributes = sum( - ( - bold is not None, - dim is not None and 2, - italic is not None and 4, - underline is not None and 8, - blink is not None and 16, - blink2 is not None and 32, - reverse is not None and 64, - conceal is not None and 128, - strike is not None and 256, - underline2 is not None and 512, - frame is not None and 1024, - encircle is not None and 2048, - overline is not None and 4096, - ) - ) - self._attributes = ( - sum( - ( - bold and 1 or 0, - dim and 2 or 0, - italic and 4 or 0, - underline and 8 or 0, - blink and 16 or 0, - blink2 and 32 or 0, - reverse and 64 or 0, - conceal and 128 or 0, - strike and 256 or 0, - underline2 and 512 or 0, - frame and 1024 or 0, - encircle and 2048 or 0, - overline and 4096 or 0, - ) - ) - if self._set_attributes - else 0 - ) - - self._link = link - self._meta = None if meta is None else dumps(meta) - self._link_id = ( - f"{randint(0, 999999)}{hash(self._meta)}" if (link or meta) else "" - ) - self._hash: Optional[int] = None - self._null = not (self._set_attributes or color or bgcolor or link or meta) - - @classmethod - def null(cls) -> "Style": - """Create an 'null' style, equivalent to Style(), but more performant.""" - return NULL_STYLE - - @classmethod - def from_color( - cls, color: Optional[Color] = None, bgcolor: Optional[Color] = None - ) -> "Style": - """Create a new style with colors and no attributes. - - Returns: - color (Optional[Color]): A (foreground) color, or None for no color. Defaults to None. - bgcolor (Optional[Color]): A (background) color, or None for no color. Defaults to None. - """ - style: Style = cls.__new__(Style) - style._ansi = None - style._style_definition = None - style._color = color - style._bgcolor = bgcolor - style._set_attributes = 0 - style._attributes = 0 - style._link = None - style._link_id = "" - style._meta = None - style._null = not (color or bgcolor) - style._hash = None - return style - - @classmethod - def from_meta(cls, meta: Optional[Dict[str, Any]]) -> "Style": - """Create a new style with meta data. - - Returns: - meta (Optional[Dict[str, Any]]): A dictionary of meta data. Defaults to None. - """ - style: Style = cls.__new__(Style) - style._ansi = None - style._style_definition = None - style._color = None - style._bgcolor = None - style._set_attributes = 0 - style._attributes = 0 - style._link = None - style._meta = dumps(meta) - style._link_id = f"{randint(0, 999999)}{hash(style._meta)}" - style._hash = None - style._null = not (meta) - return style - - @classmethod - def on(cls, meta: Optional[Dict[str, Any]] = None, **handlers: Any) -> "Style": - """Create a blank style with meta information. - - Example: - style = Style.on(click=self.on_click) - - Args: - meta (Optional[Dict[str, Any]], optional): An optional dict of meta information. - **handlers (Any): Keyword arguments are translated in to handlers. - - Returns: - Style: A Style with meta information attached. - """ - meta = {} if meta is None else meta - meta.update({f"@{key}": value for key, value in handlers.items()}) - return cls.from_meta(meta) - - bold = _Bit(0) - dim = _Bit(1) - italic = _Bit(2) - underline = _Bit(3) - blink = _Bit(4) - blink2 = _Bit(5) - reverse = _Bit(6) - conceal = _Bit(7) - strike = _Bit(8) - underline2 = _Bit(9) - frame = _Bit(10) - encircle = _Bit(11) - overline = _Bit(12) - - @property - def link_id(self) -> str: - """Get a link id, used in ansi code for links.""" - return self._link_id - - def __str__(self) -> str: - """Re-generate style definition from attributes.""" - if self._style_definition is None: - attributes: List[str] = [] - append = attributes.append - bits = self._set_attributes - if bits & 0b0000000001111: - if bits & 1: - append("bold" if self.bold else "not bold") - if bits & (1 << 1): - append("dim" if self.dim else "not dim") - if bits & (1 << 2): - append("italic" if self.italic else "not italic") - if bits & (1 << 3): - append("underline" if self.underline else "not underline") - if bits & 0b0000111110000: - if bits & (1 << 4): - append("blink" if self.blink else "not blink") - if bits & (1 << 5): - append("blink2" if self.blink2 else "not blink2") - if bits & (1 << 6): - append("reverse" if self.reverse else "not reverse") - if bits & (1 << 7): - append("conceal" if self.conceal else "not conceal") - if bits & (1 << 8): - append("strike" if self.strike else "not strike") - if bits & 0b1111000000000: - if bits & (1 << 9): - append("underline2" if self.underline2 else "not underline2") - if bits & (1 << 10): - append("frame" if self.frame else "not frame") - if bits & (1 << 11): - append("encircle" if self.encircle else "not encircle") - if bits & (1 << 12): - append("overline" if self.overline else "not overline") - if self._color is not None: - append(self._color.name) - if self._bgcolor is not None: - append("on") - append(self._bgcolor.name) - if self._link: - append("link") - append(self._link) - self._style_definition = " ".join(attributes) or "none" - return self._style_definition - - def __bool__(self) -> bool: - """A Style is false if it has no attributes, colors, or links.""" - return not self._null - - def _make_ansi_codes(self, color_system: ColorSystem) -> str: - """Generate ANSI codes for this style. - - Args: - color_system (ColorSystem): Color system. - - Returns: - str: String containing codes. - """ - - if self._ansi is None: - sgr: List[str] = [] - append = sgr.append - _style_map = self._style_map - attributes = self._attributes & self._set_attributes - if attributes: - if attributes & 1: - append(_style_map[0]) - if attributes & 2: - append(_style_map[1]) - if attributes & 4: - append(_style_map[2]) - if attributes & 8: - append(_style_map[3]) - if attributes & 0b0000111110000: - for bit in range(4, 9): - if attributes & (1 << bit): - append(_style_map[bit]) - if attributes & 0b1111000000000: - for bit in range(9, 13): - if attributes & (1 << bit): - append(_style_map[bit]) - if self._color is not None: - sgr.extend(self._color.downgrade(color_system).get_ansi_codes()) - if self._bgcolor is not None: - sgr.extend( - self._bgcolor.downgrade(color_system).get_ansi_codes( - foreground=False - ) - ) - self._ansi = ";".join(sgr) - return self._ansi - - @classmethod - @lru_cache(maxsize=1024) - def normalize(cls, style: str) -> str: - """Normalize a style definition so that styles with the same effect have the same string - representation. - - Args: - style (str): A style definition. - - Returns: - str: Normal form of style definition. - """ - try: - return str(cls.parse(style)) - except errors.StyleSyntaxError: - return style.strip().lower() - - @classmethod - def pick_first(cls, *values: Optional[StyleType]) -> StyleType: - """Pick first non-None style.""" - for value in values: - if value is not None: - return value - raise ValueError("expected at least one non-None style") - - def __rich_repr__(self) -> Result: - yield "color", self.color, None - yield "bgcolor", self.bgcolor, None - yield "bold", self.bold, None, - yield "dim", self.dim, None, - yield "italic", self.italic, None - yield "underline", self.underline, None, - yield "blink", self.blink, None - yield "blink2", self.blink2, None - yield "reverse", self.reverse, None - yield "conceal", self.conceal, None - yield "strike", self.strike, None - yield "underline2", self.underline2, None - yield "frame", self.frame, None - yield "encircle", self.encircle, None - yield "link", self.link, None - if self._meta: - yield "meta", self.meta - - def __eq__(self, other: Any) -> bool: - if not isinstance(other, Style): - return NotImplemented - return self.__hash__() == other.__hash__() - - def __ne__(self, other: Any) -> bool: - if not isinstance(other, Style): - return NotImplemented - return self.__hash__() != other.__hash__() - - def __hash__(self) -> int: - if self._hash is not None: - return self._hash - self._hash = hash( - ( - self._color, - self._bgcolor, - self._attributes, - self._set_attributes, - self._link, - self._meta, - ) - ) - return self._hash - - @property - def color(self) -> Optional[Color]: - """The foreground color or None if it is not set.""" - return self._color - - @property - def bgcolor(self) -> Optional[Color]: - """The background color or None if it is not set.""" - return self._bgcolor - - @property - def link(self) -> Optional[str]: - """Link text, if set.""" - return self._link - - @property - def transparent_background(self) -> bool: - """Check if the style specified a transparent background.""" - return self.bgcolor is None or self.bgcolor.is_default - - @property - def background_style(self) -> "Style": - """A Style with background only.""" - return Style(bgcolor=self.bgcolor) - - @property - def meta(self) -> Dict[str, Any]: - """Get meta information (can not be changed after construction).""" - return {} if self._meta is None else cast(Dict[str, Any], loads(self._meta)) - - @property - def without_color(self) -> "Style": - """Get a copy of the style with color removed.""" - if self._null: - return NULL_STYLE - style: Style = self.__new__(Style) - style._ansi = None - style._style_definition = None - style._color = None - style._bgcolor = None - style._attributes = self._attributes - style._set_attributes = self._set_attributes - style._link = self._link - style._link_id = f"{randint(0, 999999)}" if self._link else "" - style._null = False - style._meta = None - style._hash = None - return style - - @classmethod - @lru_cache(maxsize=4096) - def parse(cls, style_definition: str) -> "Style": - """Parse a style definition. - - Args: - style_definition (str): A string containing a style. - - Raises: - errors.StyleSyntaxError: If the style definition syntax is invalid. - - Returns: - `Style`: A Style instance. - """ - if style_definition.strip() == "none" or not style_definition: - return cls.null() - - STYLE_ATTRIBUTES = cls.STYLE_ATTRIBUTES - color: Optional[str] = None - bgcolor: Optional[str] = None - attributes: Dict[str, Optional[Any]] = {} - link: Optional[str] = None - - words = iter(style_definition.split()) - for original_word in words: - word = original_word.lower() - if word == "on": - word = next(words, "") - if not word: - raise errors.StyleSyntaxError("color expected after 'on'") - try: - Color.parse(word) is None - except ColorParseError as error: - raise errors.StyleSyntaxError( - f"unable to parse {word!r} as background color; {error}" - ) from None - bgcolor = word - - elif word == "not": - word = next(words, "") - attribute = STYLE_ATTRIBUTES.get(word) - if attribute is None: - raise errors.StyleSyntaxError( - f"expected style attribute after 'not', found {word!r}" - ) - attributes[attribute] = False - - elif word == "link": - word = next(words, "") - if not word: - raise errors.StyleSyntaxError("URL expected after 'link'") - link = word - - elif word in STYLE_ATTRIBUTES: - attributes[STYLE_ATTRIBUTES[word]] = True - - else: - try: - Color.parse(word) - except ColorParseError as error: - raise errors.StyleSyntaxError( - f"unable to parse {word!r} as color; {error}" - ) from None - color = word - style = Style(color=color, bgcolor=bgcolor, link=link, **attributes) - return style - - @lru_cache(maxsize=1024) - def get_html_style(self, theme: Optional[TerminalTheme] = None) -> str: - """Get a CSS style rule.""" - theme = theme or DEFAULT_TERMINAL_THEME - css: List[str] = [] - append = css.append - - color = self.color - bgcolor = self.bgcolor - if self.reverse: - color, bgcolor = bgcolor, color - if self.dim: - foreground_color = ( - theme.foreground_color if color is None else color.get_truecolor(theme) - ) - color = Color.from_triplet( - blend_rgb(foreground_color, theme.background_color, 0.5) - ) - if color is not None: - theme_color = color.get_truecolor(theme) - append(f"color: {theme_color.hex}") - append(f"text-decoration-color: {theme_color.hex}") - if bgcolor is not None: - theme_color = bgcolor.get_truecolor(theme, foreground=False) - append(f"background-color: {theme_color.hex}") - if self.bold: - append("font-weight: bold") - if self.italic: - append("font-style: italic") - if self.underline: - append("text-decoration: underline") - if self.strike: - append("text-decoration: line-through") - if self.overline: - append("text-decoration: overline") - return "; ".join(css) - - @classmethod - def combine(cls, styles: Iterable["Style"]) -> "Style": - """Combine styles and get result. - - Args: - styles (Iterable[Style]): Styles to combine. - - Returns: - Style: A new style instance. - """ - iter_styles = iter(styles) - return sum(iter_styles, next(iter_styles)) - - @classmethod - def chain(cls, *styles: "Style") -> "Style": - """Combine styles from positional argument in to a single style. - - Args: - *styles (Iterable[Style]): Styles to combine. - - Returns: - Style: A new style instance. - """ - iter_styles = iter(styles) - return sum(iter_styles, next(iter_styles)) - - def copy(self) -> "Style": - """Get a copy of this style. - - Returns: - Style: A new Style instance with identical attributes. - """ - if self._null: - return NULL_STYLE - style: Style = self.__new__(Style) - style._ansi = self._ansi - style._style_definition = self._style_definition - style._color = self._color - style._bgcolor = self._bgcolor - style._attributes = self._attributes - style._set_attributes = self._set_attributes - style._link = self._link - style._link_id = f"{randint(0, 999999)}" if self._link else "" - style._hash = self._hash - style._null = False - style._meta = self._meta - return style - - @lru_cache(maxsize=128) - def clear_meta_and_links(self) -> "Style": - """Get a copy of this style with link and meta information removed. - - Returns: - Style: New style object. - """ - if self._null: - return NULL_STYLE - style: Style = self.__new__(Style) - style._ansi = self._ansi - style._style_definition = self._style_definition - style._color = self._color - style._bgcolor = self._bgcolor - style._attributes = self._attributes - style._set_attributes = self._set_attributes - style._link = None - style._link_id = "" - style._hash = self._hash - style._null = False - style._meta = None - return style - - def update_link(self, link: Optional[str] = None) -> "Style": - """Get a copy with a different value for link. - - Args: - link (str, optional): New value for link. Defaults to None. - - Returns: - Style: A new Style instance. - """ - style: Style = self.__new__(Style) - style._ansi = self._ansi - style._style_definition = self._style_definition - style._color = self._color - style._bgcolor = self._bgcolor - style._attributes = self._attributes - style._set_attributes = self._set_attributes - style._link = link - style._link_id = f"{randint(0, 999999)}" if link else "" - style._hash = None - style._null = False - style._meta = self._meta - return style - - def render( - self, - text: str = "", - *, - color_system: Optional[ColorSystem] = ColorSystem.TRUECOLOR, - legacy_windows: bool = False, - ) -> str: - """Render the ANSI codes for the style. - - Args: - text (str, optional): A string to style. Defaults to "". - color_system (Optional[ColorSystem], optional): Color system to render to. Defaults to ColorSystem.TRUECOLOR. - - Returns: - str: A string containing ANSI style codes. - """ - if not text or color_system is None: - return text - attrs = self._ansi or self._make_ansi_codes(color_system) - rendered = f"\x1b[{attrs}m{text}\x1b[0m" if attrs else text - if self._link and not legacy_windows: - rendered = ( - f"\x1b]8;id={self._link_id};{self._link}\x1b\\{rendered}\x1b]8;;\x1b\\" - ) - return rendered - - def test(self, text: Optional[str] = None) -> None: - """Write text with style directly to terminal. - - This method is for testing purposes only. - - Args: - text (Optional[str], optional): Text to style or None for style name. - - """ - text = text or str(self) - sys.stdout.write(f"{self.render(text)}\n") - - @lru_cache(maxsize=1024) - def _add(self, style: Optional["Style"]) -> "Style": - if style is None or style._null: - return self - if self._null: - return style - new_style: Style = self.__new__(Style) - new_style._ansi = None - new_style._style_definition = None - new_style._color = style._color or self._color - new_style._bgcolor = style._bgcolor or self._bgcolor - new_style._attributes = (self._attributes & ~style._set_attributes) | ( - style._attributes & style._set_attributes - ) - new_style._set_attributes = self._set_attributes | style._set_attributes - new_style._link = style._link or self._link - new_style._link_id = style._link_id or self._link_id - new_style._null = style._null - if self._meta and style._meta: - new_style._meta = dumps({**self.meta, **style.meta}) - else: - new_style._meta = self._meta or style._meta - new_style._hash = None - return new_style - - def __add__(self, style: Optional["Style"]) -> "Style": - combined_style = self._add(style) - return combined_style.copy() if combined_style.link else combined_style - - -NULL_STYLE = Style() - - -class StyleStack: - """A stack of styles.""" - - __slots__ = ["_stack"] - - def __init__(self, default_style: "Style") -> None: - self._stack: List[Style] = [default_style] - - def __repr__(self) -> str: - return f"<stylestack {self._stack!r}>" - - @property - def current(self) -> Style: - """Get the Style at the top of the stack.""" - return self._stack[-1] - - def push(self, style: Style) -> None: - """Push a new style on to the stack. - - Args: - style (Style): New style to combine with current style. - """ - self._stack.append(self._stack[-1] + style) - - def pop(self) -> Style: - """Pop last style and discard. - - Returns: - Style: New current style (also available as stack.current) - """ - self._stack.pop() - return self._stack[-1] diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/styled.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/styled.py deleted file mode 100644 index 91cd0db..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/styled.py +++ /dev/null @@ -1,42 +0,0 @@ -from typing import TYPE_CHECKING - -from .measure import Measurement -from .segment import Segment -from .style import StyleType - -if TYPE_CHECKING: - from .console import Console, ConsoleOptions, RenderResult, RenderableType - - -class Styled: - """Apply a style to a renderable. - - Args: - renderable (RenderableType): Any renderable. - style (StyleType): A style to apply across the entire renderable. - """ - - def __init__(self, renderable: "RenderableType", style: "StyleType") -> None: - self.renderable = renderable - self.style = style - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - style = console.get_style(self.style) - rendered_segments = console.render(self.renderable, options) - segments = Segment.apply_style(rendered_segments, style) - return segments - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> Measurement: - return Measurement.get(console, options, self.renderable) - - -if __name__ == "__main__": # pragma: no cover - from pip._vendor.rich import print - from pip._vendor.rich.panel import Panel - - panel = Styled(Panel("hello"), "on blue") - print(panel) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/syntax.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/syntax.py deleted file mode 100644 index 5703376..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/syntax.py +++ /dev/null @@ -1,948 +0,0 @@ -import os.path -import platform -import re -import sys -import textwrap -from abc import ABC, abstractmethod -from pathlib import Path -from typing import ( - Any, - Dict, - Iterable, - List, - NamedTuple, - Optional, - Sequence, - Set, - Tuple, - Type, - Union, -) - -from pip._vendor.pygments.lexer import Lexer -from pip._vendor.pygments.lexers import get_lexer_by_name, guess_lexer_for_filename -from pip._vendor.pygments.style import Style as PygmentsStyle -from pip._vendor.pygments.styles import get_style_by_name -from pip._vendor.pygments.token import ( - Comment, - Error, - Generic, - Keyword, - Name, - Number, - Operator, - String, - Token, - Whitespace, -) -from pip._vendor.pygments.util import ClassNotFound - -from pip._vendor.rich.containers import Lines -from pip._vendor.rich.padding import Padding, PaddingDimensions - -from ._loop import loop_first -from .cells import cell_len -from .color import Color, blend_rgb -from .console import Console, ConsoleOptions, JustifyMethod, RenderResult -from .jupyter import JupyterMixin -from .measure import Measurement -from .segment import Segment, Segments -from .style import Style, StyleType -from .text import Text - -TokenType = Tuple[str, ...] - -WINDOWS = platform.system() == "Windows" -DEFAULT_THEME = "monokai" - -# The following styles are based on https://github.com/pygments/pygments/blob/master/pygments/formatters/terminal.py -# A few modifications were made - -ANSI_LIGHT: Dict[TokenType, Style] = { - Token: Style(), - Whitespace: Style(color="white"), - Comment: Style(dim=True), - Comment.Preproc: Style(color="cyan"), - Keyword: Style(color="blue"), - Keyword.Type: Style(color="cyan"), - Operator.Word: Style(color="magenta"), - Name.Builtin: Style(color="cyan"), - Name.Function: Style(color="green"), - Name.Namespace: Style(color="cyan", underline=True), - Name.Class: Style(color="green", underline=True), - Name.Exception: Style(color="cyan"), - Name.Decorator: Style(color="magenta", bold=True), - Name.Variable: Style(color="red"), - Name.Constant: Style(color="red"), - Name.Attribute: Style(color="cyan"), - Name.Tag: Style(color="bright_blue"), - String: Style(color="yellow"), - Number: Style(color="blue"), - Generic.Deleted: Style(color="bright_red"), - Generic.Inserted: Style(color="green"), - Generic.Heading: Style(bold=True), - Generic.Subheading: Style(color="magenta", bold=True), - Generic.Prompt: Style(bold=True), - Generic.Error: Style(color="bright_red"), - Error: Style(color="red", underline=True), -} - -ANSI_DARK: Dict[TokenType, Style] = { - Token: Style(), - Whitespace: Style(color="bright_black"), - Comment: Style(dim=True), - Comment.Preproc: Style(color="bright_cyan"), - Keyword: Style(color="bright_blue"), - Keyword.Type: Style(color="bright_cyan"), - Operator.Word: Style(color="bright_magenta"), - Name.Builtin: Style(color="bright_cyan"), - Name.Function: Style(color="bright_green"), - Name.Namespace: Style(color="bright_cyan", underline=True), - Name.Class: Style(color="bright_green", underline=True), - Name.Exception: Style(color="bright_cyan"), - Name.Decorator: Style(color="bright_magenta", bold=True), - Name.Variable: Style(color="bright_red"), - Name.Constant: Style(color="bright_red"), - Name.Attribute: Style(color="bright_cyan"), - Name.Tag: Style(color="bright_blue"), - String: Style(color="yellow"), - Number: Style(color="bright_blue"), - Generic.Deleted: Style(color="bright_red"), - Generic.Inserted: Style(color="bright_green"), - Generic.Heading: Style(bold=True), - Generic.Subheading: Style(color="bright_magenta", bold=True), - Generic.Prompt: Style(bold=True), - Generic.Error: Style(color="bright_red"), - Error: Style(color="red", underline=True), -} - -RICH_SYNTAX_THEMES = {"ansi_light": ANSI_LIGHT, "ansi_dark": ANSI_DARK} -NUMBERS_COLUMN_DEFAULT_PADDING = 2 - - -class SyntaxTheme(ABC): - """Base class for a syntax theme.""" - - @abstractmethod - def get_style_for_token(self, token_type: TokenType) -> Style: - """Get a style for a given Pygments token.""" - raise NotImplementedError # pragma: no cover - - @abstractmethod - def get_background_style(self) -> Style: - """Get the background color.""" - raise NotImplementedError # pragma: no cover - - -class PygmentsSyntaxTheme(SyntaxTheme): - """Syntax theme that delegates to Pygments theme.""" - - def __init__(self, theme: Union[str, Type[PygmentsStyle]]) -> None: - self._style_cache: Dict[TokenType, Style] = {} - if isinstance(theme, str): - try: - self._pygments_style_class = get_style_by_name(theme) - except ClassNotFound: - self._pygments_style_class = get_style_by_name("default") - else: - self._pygments_style_class = theme - - self._background_color = self._pygments_style_class.background_color - self._background_style = Style(bgcolor=self._background_color) - - def get_style_for_token(self, token_type: TokenType) -> Style: - """Get a style from a Pygments class.""" - try: - return self._style_cache[token_type] - except KeyError: - try: - pygments_style = self._pygments_style_class.style_for_token(token_type) - except KeyError: - style = Style.null() - else: - color = pygments_style["color"] - bgcolor = pygments_style["bgcolor"] - style = Style( - color="#" + color if color else "#000000", - bgcolor="#" + bgcolor if bgcolor else self._background_color, - bold=pygments_style["bold"], - italic=pygments_style["italic"], - underline=pygments_style["underline"], - ) - self._style_cache[token_type] = style - return style - - def get_background_style(self) -> Style: - return self._background_style - - -class ANSISyntaxTheme(SyntaxTheme): - """Syntax theme to use standard colors.""" - - def __init__(self, style_map: Dict[TokenType, Style]) -> None: - self.style_map = style_map - self._missing_style = Style.null() - self._background_style = Style.null() - self._style_cache: Dict[TokenType, Style] = {} - - def get_style_for_token(self, token_type: TokenType) -> Style: - """Look up style in the style map.""" - try: - return self._style_cache[token_type] - except KeyError: - # Styles form a hierarchy - # We need to go from most to least specific - # e.g. ("foo", "bar", "baz") to ("foo", "bar") to ("foo",) - get_style = self.style_map.get - token = tuple(token_type) - style = self._missing_style - while token: - _style = get_style(token) - if _style is not None: - style = _style - break - token = token[:-1] - self._style_cache[token_type] = style - return style - - def get_background_style(self) -> Style: - return self._background_style - - -SyntaxPosition = Tuple[int, int] - - -class _SyntaxHighlightRange(NamedTuple): - """ - A range to highlight in a Syntax object. - `start` and `end` are 2-integers tuples, where the first integer is the line number - (starting from 1) and the second integer is the column index (starting from 0). - """ - - style: StyleType - start: SyntaxPosition - end: SyntaxPosition - - -class Syntax(JupyterMixin): - """Construct a Syntax object to render syntax highlighted code. - - Args: - code (str): Code to highlight. - lexer (Lexer | str): Lexer to use (see https://pygments.org/docs/lexers/) - theme (str, optional): Color theme, aka Pygments style (see https://pygments.org/docs/styles/#getting-a-list-of-available-styles). Defaults to "monokai". - dedent (bool, optional): Enable stripping of initial whitespace. Defaults to False. - line_numbers (bool, optional): Enable rendering of line numbers. Defaults to False. - start_line (int, optional): Starting number for line numbers. Defaults to 1. - line_range (Tuple[int | None, int | None], optional): If given should be a tuple of the start and end line to render. - A value of None in the tuple indicates the range is open in that direction. - highlight_lines (Set[int]): A set of line numbers to highlight. - code_width: Width of code to render (not including line numbers), or ``None`` to use all available width. - tab_size (int, optional): Size of tabs. Defaults to 4. - word_wrap (bool, optional): Enable word wrapping. - background_color (str, optional): Optional background color, or None to use theme color. Defaults to None. - indent_guides (bool, optional): Show indent guides. Defaults to False. - padding (PaddingDimensions): Padding to apply around the syntax. Defaults to 0 (no padding). - """ - - _pygments_style_class: Type[PygmentsStyle] - _theme: SyntaxTheme - - @classmethod - def get_theme(cls, name: Union[str, SyntaxTheme]) -> SyntaxTheme: - """Get a syntax theme instance.""" - if isinstance(name, SyntaxTheme): - return name - theme: SyntaxTheme - if name in RICH_SYNTAX_THEMES: - theme = ANSISyntaxTheme(RICH_SYNTAX_THEMES[name]) - else: - theme = PygmentsSyntaxTheme(name) - return theme - - def __init__( - self, - code: str, - lexer: Union[Lexer, str], - *, - theme: Union[str, SyntaxTheme] = DEFAULT_THEME, - dedent: bool = False, - line_numbers: bool = False, - start_line: int = 1, - line_range: Optional[Tuple[Optional[int], Optional[int]]] = None, - highlight_lines: Optional[Set[int]] = None, - code_width: Optional[int] = None, - tab_size: int = 4, - word_wrap: bool = False, - background_color: Optional[str] = None, - indent_guides: bool = False, - padding: PaddingDimensions = 0, - ) -> None: - self.code = code - self._lexer = lexer - self.dedent = dedent - self.line_numbers = line_numbers - self.start_line = start_line - self.line_range = line_range - self.highlight_lines = highlight_lines or set() - self.code_width = code_width - self.tab_size = tab_size - self.word_wrap = word_wrap - self.background_color = background_color - self.background_style = ( - Style(bgcolor=background_color) if background_color else Style() - ) - self.indent_guides = indent_guides - self.padding = padding - - self._theme = self.get_theme(theme) - self._stylized_ranges: List[_SyntaxHighlightRange] = [] - - @classmethod - def from_path( - cls, - path: str, - encoding: str = "utf-8", - lexer: Optional[Union[Lexer, str]] = None, - theme: Union[str, SyntaxTheme] = DEFAULT_THEME, - dedent: bool = False, - line_numbers: bool = False, - line_range: Optional[Tuple[int, int]] = None, - start_line: int = 1, - highlight_lines: Optional[Set[int]] = None, - code_width: Optional[int] = None, - tab_size: int = 4, - word_wrap: bool = False, - background_color: Optional[str] = None, - indent_guides: bool = False, - padding: PaddingDimensions = 0, - ) -> "Syntax": - """Construct a Syntax object from a file. - - Args: - path (str): Path to file to highlight. - encoding (str): Encoding of file. - lexer (str | Lexer, optional): Lexer to use. If None, lexer will be auto-detected from path/file content. - theme (str, optional): Color theme, aka Pygments style (see https://pygments.org/docs/styles/#getting-a-list-of-available-styles). Defaults to "emacs". - dedent (bool, optional): Enable stripping of initial whitespace. Defaults to True. - line_numbers (bool, optional): Enable rendering of line numbers. Defaults to False. - start_line (int, optional): Starting number for line numbers. Defaults to 1. - line_range (Tuple[int, int], optional): If given should be a tuple of the start and end line to render. - highlight_lines (Set[int]): A set of line numbers to highlight. - code_width: Width of code to render (not including line numbers), or ``None`` to use all available width. - tab_size (int, optional): Size of tabs. Defaults to 4. - word_wrap (bool, optional): Enable word wrapping of code. - background_color (str, optional): Optional background color, or None to use theme color. Defaults to None. - indent_guides (bool, optional): Show indent guides. Defaults to False. - padding (PaddingDimensions): Padding to apply around the syntax. Defaults to 0 (no padding). - - Returns: - [Syntax]: A Syntax object that may be printed to the console - """ - code = Path(path).read_text(encoding=encoding) - - if not lexer: - lexer = cls.guess_lexer(path, code=code) - - return cls( - code, - lexer, - theme=theme, - dedent=dedent, - line_numbers=line_numbers, - line_range=line_range, - start_line=start_line, - highlight_lines=highlight_lines, - code_width=code_width, - tab_size=tab_size, - word_wrap=word_wrap, - background_color=background_color, - indent_guides=indent_guides, - padding=padding, - ) - - @classmethod - def guess_lexer(cls, path: str, code: Optional[str] = None) -> str: - """Guess the alias of the Pygments lexer to use based on a path and an optional string of code. - If code is supplied, it will use a combination of the code and the filename to determine the - best lexer to use. For example, if the file is ``index.html`` and the file contains Django - templating syntax, then "html+django" will be returned. If the file is ``index.html``, and no - templating language is used, the "html" lexer will be used. If no string of code - is supplied, the lexer will be chosen based on the file extension.. - - Args: - path (AnyStr): The path to the file containing the code you wish to know the lexer for. - code (str, optional): Optional string of code that will be used as a fallback if no lexer - is found for the supplied path. - - Returns: - str: The name of the Pygments lexer that best matches the supplied path/code. - """ - lexer: Optional[Lexer] = None - lexer_name = "default" - if code: - try: - lexer = guess_lexer_for_filename(path, code) - except ClassNotFound: - pass - - if not lexer: - try: - _, ext = os.path.splitext(path) - if ext: - extension = ext.lstrip(".").lower() - lexer = get_lexer_by_name(extension) - except ClassNotFound: - pass - - if lexer: - if lexer.aliases: - lexer_name = lexer.aliases[0] - else: - lexer_name = lexer.name - - return lexer_name - - def _get_base_style(self) -> Style: - """Get the base style.""" - default_style = self._theme.get_background_style() + self.background_style - return default_style - - def _get_token_color(self, token_type: TokenType) -> Optional[Color]: - """Get a color (if any) for the given token. - - Args: - token_type (TokenType): A token type tuple from Pygments. - - Returns: - Optional[Color]: Color from theme, or None for no color. - """ - style = self._theme.get_style_for_token(token_type) - return style.color - - @property - def lexer(self) -> Optional[Lexer]: - """The lexer for this syntax, or None if no lexer was found. - - Tries to find the lexer by name if a string was passed to the constructor. - """ - - if isinstance(self._lexer, Lexer): - return self._lexer - try: - return get_lexer_by_name( - self._lexer, - stripnl=False, - ensurenl=True, - tabsize=self.tab_size, - ) - except ClassNotFound: - return None - - def highlight( - self, - code: str, - line_range: Optional[Tuple[Optional[int], Optional[int]]] = None, - ) -> Text: - """Highlight code and return a Text instance. - - Args: - code (str): Code to highlight. - line_range(Tuple[int, int], optional): Optional line range to highlight. - - Returns: - Text: A text instance containing highlighted syntax. - """ - - base_style = self._get_base_style() - justify: JustifyMethod = ( - "default" if base_style.transparent_background else "left" - ) - - text = Text( - justify=justify, - style=base_style, - tab_size=self.tab_size, - no_wrap=not self.word_wrap, - ) - _get_theme_style = self._theme.get_style_for_token - - lexer = self.lexer - - if lexer is None: - text.append(code) - else: - if line_range: - # More complicated path to only stylize a portion of the code - # This speeds up further operations as there are less spans to process - line_start, line_end = line_range - - def line_tokenize() -> Iterable[Tuple[Any, str]]: - """Split tokens to one per line.""" - assert lexer # required to make MyPy happy - we know lexer is not None at this point - - for token_type, token in lexer.get_tokens(code): - while token: - line_token, new_line, token = token.partition("\n") - yield token_type, line_token + new_line - - def tokens_to_spans() -> Iterable[Tuple[str, Optional[Style]]]: - """Convert tokens to spans.""" - tokens = iter(line_tokenize()) - line_no = 0 - _line_start = line_start - 1 if line_start else 0 - - # Skip over tokens until line start - while line_no < _line_start: - try: - _token_type, token = next(tokens) - except StopIteration: - break - yield (token, None) - if token.endswith("\n"): - line_no += 1 - # Generate spans until line end - for token_type, token in tokens: - yield (token, _get_theme_style(token_type)) - if token.endswith("\n"): - line_no += 1 - if line_end and line_no >= line_end: - break - - text.append_tokens(tokens_to_spans()) - - else: - text.append_tokens( - (token, _get_theme_style(token_type)) - for token_type, token in lexer.get_tokens(code) - ) - if self.background_color is not None: - text.stylize(f"on {self.background_color}") - - if self._stylized_ranges: - self._apply_stylized_ranges(text) - - return text - - def stylize_range( - self, style: StyleType, start: SyntaxPosition, end: SyntaxPosition - ) -> None: - """ - Adds a custom style on a part of the code, that will be applied to the syntax display when it's rendered. - Line numbers are 1-based, while column indexes are 0-based. - - Args: - style (StyleType): The style to apply. - start (Tuple[int, int]): The start of the range, in the form `[line number, column index]`. - end (Tuple[int, int]): The end of the range, in the form `[line number, column index]`. - """ - self._stylized_ranges.append(_SyntaxHighlightRange(style, start, end)) - - def _get_line_numbers_color(self, blend: float = 0.3) -> Color: - background_style = self._theme.get_background_style() + self.background_style - background_color = background_style.bgcolor - if background_color is None or background_color.is_system_defined: - return Color.default() - foreground_color = self._get_token_color(Token.Text) - if foreground_color is None or foreground_color.is_system_defined: - return foreground_color or Color.default() - new_color = blend_rgb( - background_color.get_truecolor(), - foreground_color.get_truecolor(), - cross_fade=blend, - ) - return Color.from_triplet(new_color) - - @property - def _numbers_column_width(self) -> int: - """Get the number of characters used to render the numbers column.""" - column_width = 0 - if self.line_numbers: - column_width = ( - len(str(self.start_line + self.code.count("\n"))) - + NUMBERS_COLUMN_DEFAULT_PADDING - ) - return column_width - - def _get_number_styles(self, console: Console) -> Tuple[Style, Style, Style]: - """Get background, number, and highlight styles for line numbers.""" - background_style = self._get_base_style() - if background_style.transparent_background: - return Style.null(), Style(dim=True), Style.null() - if console.color_system in ("256", "truecolor"): - number_style = Style.chain( - background_style, - self._theme.get_style_for_token(Token.Text), - Style(color=self._get_line_numbers_color()), - self.background_style, - ) - highlight_number_style = Style.chain( - background_style, - self._theme.get_style_for_token(Token.Text), - Style(bold=True, color=self._get_line_numbers_color(0.9)), - self.background_style, - ) - else: - number_style = background_style + Style(dim=True) - highlight_number_style = background_style + Style(dim=False) - return background_style, number_style, highlight_number_style - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> "Measurement": - _, right, _, left = Padding.unpack(self.padding) - padding = left + right - if self.code_width is not None: - width = self.code_width + self._numbers_column_width + padding + 1 - return Measurement(self._numbers_column_width, width) - lines = self.code.splitlines() - width = ( - self._numbers_column_width - + padding - + (max(cell_len(line) for line in lines) if lines else 0) - ) - if self.line_numbers: - width += 1 - return Measurement(self._numbers_column_width, width) - - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - segments = Segments(self._get_syntax(console, options)) - if self.padding: - yield Padding( - segments, style=self._theme.get_background_style(), pad=self.padding - ) - else: - yield segments - - def _get_syntax( - self, - console: Console, - options: ConsoleOptions, - ) -> Iterable[Segment]: - """ - Get the Segments for the Syntax object, excluding any vertical/horizontal padding - """ - transparent_background = self._get_base_style().transparent_background - code_width = ( - ( - (options.max_width - self._numbers_column_width - 1) - if self.line_numbers - else options.max_width - ) - if self.code_width is None - else self.code_width - ) - - ends_on_nl, processed_code = self._process_code(self.code) - text = self.highlight(processed_code, self.line_range) - - if not self.line_numbers and not self.word_wrap and not self.line_range: - if not ends_on_nl: - text.remove_suffix("\n") - # Simple case of just rendering text - style = ( - self._get_base_style() - + self._theme.get_style_for_token(Comment) - + Style(dim=True) - + self.background_style - ) - if self.indent_guides and not options.ascii_only: - text = text.with_indent_guides(self.tab_size, style=style) - text.overflow = "crop" - if style.transparent_background: - yield from console.render( - text, options=options.update(width=code_width) - ) - else: - syntax_lines = console.render_lines( - text, - options.update(width=code_width, height=None, justify="left"), - style=self.background_style, - pad=True, - new_lines=True, - ) - for syntax_line in syntax_lines: - yield from syntax_line - return - - start_line, end_line = self.line_range or (None, None) - line_offset = 0 - if start_line: - line_offset = max(0, start_line - 1) - lines: Union[List[Text], Lines] = text.split("\n", allow_blank=ends_on_nl) - if self.line_range: - if line_offset > len(lines): - return - lines = lines[line_offset:end_line] - - if self.indent_guides and not options.ascii_only: - style = ( - self._get_base_style() - + self._theme.get_style_for_token(Comment) - + Style(dim=True) - + self.background_style - ) - lines = ( - Text("\n") - .join(lines) - .with_indent_guides(self.tab_size, style=style + Style(italic=False)) - .split("\n", allow_blank=True) - ) - - numbers_column_width = self._numbers_column_width - render_options = options.update(width=code_width) - - highlight_line = self.highlight_lines.__contains__ - _Segment = Segment - new_line = _Segment("\n") - - line_pointer = "> " if options.legacy_windows else "❱ " - - ( - background_style, - number_style, - highlight_number_style, - ) = self._get_number_styles(console) - - for line_no, line in enumerate(lines, self.start_line + line_offset): - if self.word_wrap: - wrapped_lines = console.render_lines( - line, - render_options.update(height=None, justify="left"), - style=background_style, - pad=not transparent_background, - ) - else: - segments = list(line.render(console, end="")) - if options.no_wrap: - wrapped_lines = [segments] - else: - wrapped_lines = [ - _Segment.adjust_line_length( - segments, - render_options.max_width, - style=background_style, - pad=not transparent_background, - ) - ] - - if self.line_numbers: - wrapped_line_left_pad = _Segment( - " " * numbers_column_width + " ", background_style - ) - for first, wrapped_line in loop_first(wrapped_lines): - if first: - line_column = str(line_no).rjust(numbers_column_width - 2) + " " - if highlight_line(line_no): - yield _Segment(line_pointer, Style(color="red")) - yield _Segment(line_column, highlight_number_style) - else: - yield _Segment(" ", highlight_number_style) - yield _Segment(line_column, number_style) - else: - yield wrapped_line_left_pad - yield from wrapped_line - yield new_line - else: - for wrapped_line in wrapped_lines: - yield from wrapped_line - yield new_line - - def _apply_stylized_ranges(self, text: Text) -> None: - """ - Apply stylized ranges to a text instance, - using the given code to determine the right portion to apply the style to. - - Args: - text (Text): Text instance to apply the style to. - """ - code = text.plain - newlines_offsets = [ - # Let's add outer boundaries at each side of the list: - 0, - # N.B. using "\n" here is much faster than using metacharacters such as "^" or "\Z": - *[ - match.start() + 1 - for match in re.finditer("\n", code, flags=re.MULTILINE) - ], - len(code) + 1, - ] - - for stylized_range in self._stylized_ranges: - start = _get_code_index_for_syntax_position( - newlines_offsets, stylized_range.start - ) - end = _get_code_index_for_syntax_position( - newlines_offsets, stylized_range.end - ) - if start is not None and end is not None: - text.stylize(stylized_range.style, start, end) - - def _process_code(self, code: str) -> Tuple[bool, str]: - """ - Applies various processing to a raw code string - (normalises it so it always ends with a line return, dedents it if necessary, etc.) - - Args: - code (str): The raw code string to process - - Returns: - Tuple[bool, str]: the boolean indicates whether the raw code ends with a line return, - while the string is the processed code. - """ - ends_on_nl = code.endswith("\n") - processed_code = code if ends_on_nl else code + "\n" - processed_code = ( - textwrap.dedent(processed_code) if self.dedent else processed_code - ) - processed_code = processed_code.expandtabs(self.tab_size) - return ends_on_nl, processed_code - - -def _get_code_index_for_syntax_position( - newlines_offsets: Sequence[int], position: SyntaxPosition -) -> Optional[int]: - """ - Returns the index of the code string for the given positions. - - Args: - newlines_offsets (Sequence[int]): The offset of each newline character found in the code snippet. - position (SyntaxPosition): The position to search for. - - Returns: - Optional[int]: The index of the code string for this position, or `None` - if the given position's line number is out of range (if it's the column that is out of range - we silently clamp its value so that it reaches the end of the line) - """ - lines_count = len(newlines_offsets) - - line_number, column_index = position - if line_number > lines_count or len(newlines_offsets) < (line_number + 1): - return None # `line_number` is out of range - line_index = line_number - 1 - line_length = newlines_offsets[line_index + 1] - newlines_offsets[line_index] - 1 - # If `column_index` is out of range: let's silently clamp it: - column_index = min(line_length, column_index) - return newlines_offsets[line_index] + column_index - - -if __name__ == "__main__": # pragma: no cover - import argparse - import sys - - parser = argparse.ArgumentParser( - description="Render syntax to the console with Rich" - ) - parser.add_argument( - "path", - metavar="PATH", - help="path to file, or - for stdin", - ) - parser.add_argument( - "-c", - "--force-color", - dest="force_color", - action="store_true", - default=None, - help="force color for non-terminals", - ) - parser.add_argument( - "-i", - "--indent-guides", - dest="indent_guides", - action="store_true", - default=False, - help="display indent guides", - ) - parser.add_argument( - "-l", - "--line-numbers", - dest="line_numbers", - action="store_true", - help="render line numbers", - ) - parser.add_argument( - "-w", - "--width", - type=int, - dest="width", - default=None, - help="width of output (default will auto-detect)", - ) - parser.add_argument( - "-r", - "--wrap", - dest="word_wrap", - action="store_true", - default=False, - help="word wrap long lines", - ) - parser.add_argument( - "-s", - "--soft-wrap", - action="store_true", - dest="soft_wrap", - default=False, - help="enable soft wrapping mode", - ) - parser.add_argument( - "-t", "--theme", dest="theme", default="monokai", help="pygments theme" - ) - parser.add_argument( - "-b", - "--background-color", - dest="background_color", - default=None, - help="Override background color", - ) - parser.add_argument( - "-x", - "--lexer", - default=None, - dest="lexer_name", - help="Lexer name", - ) - parser.add_argument( - "-p", "--padding", type=int, default=0, dest="padding", help="Padding" - ) - parser.add_argument( - "--highlight-line", - type=int, - default=None, - dest="highlight_line", - help="The line number (not index!) to highlight", - ) - args = parser.parse_args() - - from pip._vendor.rich.console import Console - - console = Console(force_terminal=args.force_color, width=args.width) - - if args.path == "-": - code = sys.stdin.read() - syntax = Syntax( - code=code, - lexer=args.lexer_name, - line_numbers=args.line_numbers, - word_wrap=args.word_wrap, - theme=args.theme, - background_color=args.background_color, - indent_guides=args.indent_guides, - padding=args.padding, - highlight_lines={args.highlight_line}, - ) - else: - syntax = Syntax.from_path( - args.path, - lexer=args.lexer_name, - line_numbers=args.line_numbers, - word_wrap=args.word_wrap, - theme=args.theme, - background_color=args.background_color, - indent_guides=args.indent_guides, - padding=args.padding, - highlight_lines={args.highlight_line}, - ) - console.print(syntax, soft_wrap=args.soft_wrap) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/table.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/table.py deleted file mode 100644 index 17409f2..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/table.py +++ /dev/null @@ -1,1002 +0,0 @@ -from dataclasses import dataclass, field, replace -from typing import ( - TYPE_CHECKING, - Dict, - Iterable, - List, - NamedTuple, - Optional, - Sequence, - Tuple, - Union, -) - -from . import box, errors -from ._loop import loop_first_last, loop_last -from ._pick import pick_bool -from ._ratio import ratio_distribute, ratio_reduce -from .align import VerticalAlignMethod -from .jupyter import JupyterMixin -from .measure import Measurement -from .padding import Padding, PaddingDimensions -from .protocol import is_renderable -from .segment import Segment -from .style import Style, StyleType -from .text import Text, TextType - -if TYPE_CHECKING: - from .console import ( - Console, - ConsoleOptions, - JustifyMethod, - OverflowMethod, - RenderableType, - RenderResult, - ) - - -@dataclass -class Column: - """Defines a column within a ~Table. - - Args: - title (Union[str, Text], optional): The title of the table rendered at the top. Defaults to None. - caption (Union[str, Text], optional): The table caption rendered below. Defaults to None. - width (int, optional): The width in characters of the table, or ``None`` to automatically fit. Defaults to None. - min_width (Optional[int], optional): The minimum width of the table, or ``None`` for no minimum. Defaults to None. - box (box.Box, optional): One of the constants in box.py used to draw the edges (see :ref:`appendix_box`), or ``None`` for no box lines. Defaults to box.HEAVY_HEAD. - safe_box (Optional[bool], optional): Disable box characters that don't display on windows legacy terminal with *raster* fonts. Defaults to True. - padding (PaddingDimensions, optional): Padding for cells (top, right, bottom, left). Defaults to (0, 1). - collapse_padding (bool, optional): Enable collapsing of padding around cells. Defaults to False. - pad_edge (bool, optional): Enable padding of edge cells. Defaults to True. - expand (bool, optional): Expand the table to fit the available space if ``True``, otherwise the table width will be auto-calculated. Defaults to False. - show_header (bool, optional): Show a header row. Defaults to True. - show_footer (bool, optional): Show a footer row. Defaults to False. - show_edge (bool, optional): Draw a box around the outside of the table. Defaults to True. - show_lines (bool, optional): Draw lines between every row. Defaults to False. - leading (bool, optional): Number of blank lines between rows (precludes ``show_lines``). Defaults to 0. - style (Union[str, Style], optional): Default style for the table. Defaults to "none". - row_styles (List[Union, str], optional): Optional list of row styles, if more than one style is given then the styles will alternate. Defaults to None. - header_style (Union[str, Style], optional): Style of the header. Defaults to "table.header". - footer_style (Union[str, Style], optional): Style of the footer. Defaults to "table.footer". - border_style (Union[str, Style], optional): Style of the border. Defaults to None. - title_style (Union[str, Style], optional): Style of the title. Defaults to None. - caption_style (Union[str, Style], optional): Style of the caption. Defaults to None. - title_justify (str, optional): Justify method for title. Defaults to "center". - caption_justify (str, optional): Justify method for caption. Defaults to "center". - highlight (bool, optional): Highlight cell contents (if str). Defaults to False. - """ - - header: "RenderableType" = "" - """RenderableType: Renderable for the header (typically a string)""" - - footer: "RenderableType" = "" - """RenderableType: Renderable for the footer (typically a string)""" - - header_style: StyleType = "" - """StyleType: The style of the header.""" - - footer_style: StyleType = "" - """StyleType: The style of the footer.""" - - style: StyleType = "" - """StyleType: The style of the column.""" - - justify: "JustifyMethod" = "left" - """str: How to justify text within the column ("left", "center", "right", or "full")""" - - vertical: "VerticalAlignMethod" = "top" - """str: How to vertically align content ("top", "middle", or "bottom")""" - - overflow: "OverflowMethod" = "ellipsis" - """str: Overflow method.""" - - width: Optional[int] = None - """Optional[int]: Width of the column, or ``None`` (default) to auto calculate width.""" - - min_width: Optional[int] = None - """Optional[int]: Minimum width of column, or ``None`` for no minimum. Defaults to None.""" - - max_width: Optional[int] = None - """Optional[int]: Maximum width of column, or ``None`` for no maximum. Defaults to None.""" - - ratio: Optional[int] = None - """Optional[int]: Ratio to use when calculating column width, or ``None`` (default) to adapt to column contents.""" - - no_wrap: bool = False - """bool: Prevent wrapping of text within the column. Defaults to ``False``.""" - - _index: int = 0 - """Index of column.""" - - _cells: List["RenderableType"] = field(default_factory=list) - - def copy(self) -> "Column": - """Return a copy of this Column.""" - return replace(self, _cells=[]) - - @property - def cells(self) -> Iterable["RenderableType"]: - """Get all cells in the column, not including header.""" - yield from self._cells - - @property - def flexible(self) -> bool: - """Check if this column is flexible.""" - return self.ratio is not None - - -@dataclass -class Row: - """Information regarding a row.""" - - style: Optional[StyleType] = None - """Style to apply to row.""" - - end_section: bool = False - """Indicated end of section, which will force a line beneath the row.""" - - -class _Cell(NamedTuple): - """A single cell in a table.""" - - style: StyleType - """Style to apply to cell.""" - renderable: "RenderableType" - """Cell renderable.""" - vertical: VerticalAlignMethod - """Cell vertical alignment.""" - - -class Table(JupyterMixin): - """A console renderable to draw a table. - - Args: - *headers (Union[Column, str]): Column headers, either as a string, or :class:`~rich.table.Column` instance. - title (Union[str, Text], optional): The title of the table rendered at the top. Defaults to None. - caption (Union[str, Text], optional): The table caption rendered below. Defaults to None. - width (int, optional): The width in characters of the table, or ``None`` to automatically fit. Defaults to None. - min_width (Optional[int], optional): The minimum width of the table, or ``None`` for no minimum. Defaults to None. - box (box.Box, optional): One of the constants in box.py used to draw the edges (see :ref:`appendix_box`), or ``None`` for no box lines. Defaults to box.HEAVY_HEAD. - safe_box (Optional[bool], optional): Disable box characters that don't display on windows legacy terminal with *raster* fonts. Defaults to True. - padding (PaddingDimensions, optional): Padding for cells (top, right, bottom, left). Defaults to (0, 1). - collapse_padding (bool, optional): Enable collapsing of padding around cells. Defaults to False. - pad_edge (bool, optional): Enable padding of edge cells. Defaults to True. - expand (bool, optional): Expand the table to fit the available space if ``True``, otherwise the table width will be auto-calculated. Defaults to False. - show_header (bool, optional): Show a header row. Defaults to True. - show_footer (bool, optional): Show a footer row. Defaults to False. - show_edge (bool, optional): Draw a box around the outside of the table. Defaults to True. - show_lines (bool, optional): Draw lines between every row. Defaults to False. - leading (bool, optional): Number of blank lines between rows (precludes ``show_lines``). Defaults to 0. - style (Union[str, Style], optional): Default style for the table. Defaults to "none". - row_styles (List[Union, str], optional): Optional list of row styles, if more than one style is given then the styles will alternate. Defaults to None. - header_style (Union[str, Style], optional): Style of the header. Defaults to "table.header". - footer_style (Union[str, Style], optional): Style of the footer. Defaults to "table.footer". - border_style (Union[str, Style], optional): Style of the border. Defaults to None. - title_style (Union[str, Style], optional): Style of the title. Defaults to None. - caption_style (Union[str, Style], optional): Style of the caption. Defaults to None. - title_justify (str, optional): Justify method for title. Defaults to "center". - caption_justify (str, optional): Justify method for caption. Defaults to "center". - highlight (bool, optional): Highlight cell contents (if str). Defaults to False. - """ - - columns: List[Column] - rows: List[Row] - - def __init__( - self, - *headers: Union[Column, str], - title: Optional[TextType] = None, - caption: Optional[TextType] = None, - width: Optional[int] = None, - min_width: Optional[int] = None, - box: Optional[box.Box] = box.HEAVY_HEAD, - safe_box: Optional[bool] = None, - padding: PaddingDimensions = (0, 1), - collapse_padding: bool = False, - pad_edge: bool = True, - expand: bool = False, - show_header: bool = True, - show_footer: bool = False, - show_edge: bool = True, - show_lines: bool = False, - leading: int = 0, - style: StyleType = "none", - row_styles: Optional[Iterable[StyleType]] = None, - header_style: Optional[StyleType] = "table.header", - footer_style: Optional[StyleType] = "table.footer", - border_style: Optional[StyleType] = None, - title_style: Optional[StyleType] = None, - caption_style: Optional[StyleType] = None, - title_justify: "JustifyMethod" = "center", - caption_justify: "JustifyMethod" = "center", - highlight: bool = False, - ) -> None: - - self.columns: List[Column] = [] - self.rows: List[Row] = [] - self.title = title - self.caption = caption - self.width = width - self.min_width = min_width - self.box = box - self.safe_box = safe_box - self._padding = Padding.unpack(padding) - self.pad_edge = pad_edge - self._expand = expand - self.show_header = show_header - self.show_footer = show_footer - self.show_edge = show_edge - self.show_lines = show_lines - self.leading = leading - self.collapse_padding = collapse_padding - self.style = style - self.header_style = header_style or "" - self.footer_style = footer_style or "" - self.border_style = border_style - self.title_style = title_style - self.caption_style = caption_style - self.title_justify: "JustifyMethod" = title_justify - self.caption_justify: "JustifyMethod" = caption_justify - self.highlight = highlight - self.row_styles: Sequence[StyleType] = list(row_styles or []) - append_column = self.columns.append - for header in headers: - if isinstance(header, str): - self.add_column(header=header) - else: - header._index = len(self.columns) - append_column(header) - - @classmethod - def grid( - cls, - *headers: Union[Column, str], - padding: PaddingDimensions = 0, - collapse_padding: bool = True, - pad_edge: bool = False, - expand: bool = False, - ) -> "Table": - """Get a table with no lines, headers, or footer. - - Args: - *headers (Union[Column, str]): Column headers, either as a string, or :class:`~rich.table.Column` instance. - padding (PaddingDimensions, optional): Get padding around cells. Defaults to 0. - collapse_padding (bool, optional): Enable collapsing of padding around cells. Defaults to True. - pad_edge (bool, optional): Enable padding around edges of table. Defaults to False. - expand (bool, optional): Expand the table to fit the available space if ``True``, otherwise the table width will be auto-calculated. Defaults to False. - - Returns: - Table: A table instance. - """ - return cls( - *headers, - box=None, - padding=padding, - collapse_padding=collapse_padding, - show_header=False, - show_footer=False, - show_edge=False, - pad_edge=pad_edge, - expand=expand, - ) - - @property - def expand(self) -> bool: - """Setting a non-None self.width implies expand.""" - return self._expand or self.width is not None - - @expand.setter - def expand(self, expand: bool) -> None: - """Set expand.""" - self._expand = expand - - @property - def _extra_width(self) -> int: - """Get extra width to add to cell content.""" - width = 0 - if self.box and self.show_edge: - width += 2 - if self.box: - width += len(self.columns) - 1 - return width - - @property - def row_count(self) -> int: - """Get the current number of rows.""" - return len(self.rows) - - def get_row_style(self, console: "Console", index: int) -> StyleType: - """Get the current row style.""" - style = Style.null() - if self.row_styles: - style += console.get_style(self.row_styles[index % len(self.row_styles)]) - row_style = self.rows[index].style - if row_style is not None: - style += console.get_style(row_style) - return style - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> Measurement: - max_width = options.max_width - if self.width is not None: - max_width = self.width - if max_width < 0: - return Measurement(0, 0) - - extra_width = self._extra_width - max_width = sum( - self._calculate_column_widths( - console, options.update_width(max_width - extra_width) - ) - ) - _measure_column = self._measure_column - - measurements = [ - _measure_column(console, options.update_width(max_width), column) - for column in self.columns - ] - minimum_width = ( - sum(measurement.minimum for measurement in measurements) + extra_width - ) - maximum_width = ( - sum(measurement.maximum for measurement in measurements) + extra_width - if (self.width is None) - else self.width - ) - measurement = Measurement(minimum_width, maximum_width) - measurement = measurement.clamp(self.min_width) - return measurement - - @property - def padding(self) -> Tuple[int, int, int, int]: - """Get cell padding.""" - return self._padding - - @padding.setter - def padding(self, padding: PaddingDimensions) -> "Table": - """Set cell padding.""" - self._padding = Padding.unpack(padding) - return self - - def add_column( - self, - header: "RenderableType" = "", - footer: "RenderableType" = "", - *, - header_style: Optional[StyleType] = None, - footer_style: Optional[StyleType] = None, - style: Optional[StyleType] = None, - justify: "JustifyMethod" = "left", - vertical: "VerticalAlignMethod" = "top", - overflow: "OverflowMethod" = "ellipsis", - width: Optional[int] = None, - min_width: Optional[int] = None, - max_width: Optional[int] = None, - ratio: Optional[int] = None, - no_wrap: bool = False, - ) -> None: - """Add a column to the table. - - Args: - header (RenderableType, optional): Text or renderable for the header. - Defaults to "". - footer (RenderableType, optional): Text or renderable for the footer. - Defaults to "". - header_style (Union[str, Style], optional): Style for the header, or None for default. Defaults to None. - footer_style (Union[str, Style], optional): Style for the footer, or None for default. Defaults to None. - style (Union[str, Style], optional): Style for the column cells, or None for default. Defaults to None. - justify (JustifyMethod, optional): Alignment for cells. Defaults to "left". - vertical (VerticalAlignMethod, optional): Vertical alignment, one of "top", "middle", or "bottom". Defaults to "top". - overflow (OverflowMethod): Overflow method: "crop", "fold", "ellipsis". Defaults to "ellipsis". - width (int, optional): Desired width of column in characters, or None to fit to contents. Defaults to None. - min_width (Optional[int], optional): Minimum width of column, or ``None`` for no minimum. Defaults to None. - max_width (Optional[int], optional): Maximum width of column, or ``None`` for no maximum. Defaults to None. - ratio (int, optional): Flexible ratio for the column (requires ``Table.expand`` or ``Table.width``). Defaults to None. - no_wrap (bool, optional): Set to ``True`` to disable wrapping of this column. - """ - - column = Column( - _index=len(self.columns), - header=header, - footer=footer, - header_style=header_style or "", - footer_style=footer_style or "", - style=style or "", - justify=justify, - vertical=vertical, - overflow=overflow, - width=width, - min_width=min_width, - max_width=max_width, - ratio=ratio, - no_wrap=no_wrap, - ) - self.columns.append(column) - - def add_row( - self, - *renderables: Optional["RenderableType"], - style: Optional[StyleType] = None, - end_section: bool = False, - ) -> None: - """Add a row of renderables. - - Args: - *renderables (None or renderable): Each cell in a row must be a renderable object (including str), - or ``None`` for a blank cell. - style (StyleType, optional): An optional style to apply to the entire row. Defaults to None. - end_section (bool, optional): End a section and draw a line. Defaults to False. - - Raises: - errors.NotRenderableError: If you add something that can't be rendered. - """ - - def add_cell(column: Column, renderable: "RenderableType") -> None: - column._cells.append(renderable) - - cell_renderables: List[Optional["RenderableType"]] = list(renderables) - - columns = self.columns - if len(cell_renderables) < len(columns): - cell_renderables = [ - *cell_renderables, - *[None] * (len(columns) - len(cell_renderables)), - ] - for index, renderable in enumerate(cell_renderables): - if index == len(columns): - column = Column(_index=index) - for _ in self.rows: - add_cell(column, Text("")) - self.columns.append(column) - else: - column = columns[index] - if renderable is None: - add_cell(column, "") - elif is_renderable(renderable): - add_cell(column, renderable) - else: - raise errors.NotRenderableError( - f"unable to render {type(renderable).__name__}; a string or other renderable object is required" - ) - self.rows.append(Row(style=style, end_section=end_section)) - - def add_section(self) -> None: - """Add a new section (draw a line after current row).""" - - if self.rows: - self.rows[-1].end_section = True - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - - if not self.columns: - yield Segment("\n") - return - - max_width = options.max_width - if self.width is not None: - max_width = self.width - - extra_width = self._extra_width - widths = self._calculate_column_widths( - console, options.update_width(max_width - extra_width) - ) - table_width = sum(widths) + extra_width - - render_options = options.update( - width=table_width, highlight=self.highlight, height=None - ) - - def render_annotation( - text: TextType, style: StyleType, justify: "JustifyMethod" = "center" - ) -> "RenderResult": - render_text = ( - console.render_str(text, style=style, highlight=False) - if isinstance(text, str) - else text - ) - return console.render( - render_text, options=render_options.update(justify=justify) - ) - - if self.title: - yield from render_annotation( - self.title, - style=Style.pick_first(self.title_style, "table.title"), - justify=self.title_justify, - ) - yield from self._render(console, render_options, widths) - if self.caption: - yield from render_annotation( - self.caption, - style=Style.pick_first(self.caption_style, "table.caption"), - justify=self.caption_justify, - ) - - def _calculate_column_widths( - self, console: "Console", options: "ConsoleOptions" - ) -> List[int]: - """Calculate the widths of each column, including padding, not including borders.""" - max_width = options.max_width - columns = self.columns - width_ranges = [ - self._measure_column(console, options, column) for column in columns - ] - widths = [_range.maximum or 1 for _range in width_ranges] - get_padding_width = self._get_padding_width - extra_width = self._extra_width - if self.expand: - ratios = [col.ratio or 0 for col in columns if col.flexible] - if any(ratios): - fixed_widths = [ - 0 if column.flexible else _range.maximum - for _range, column in zip(width_ranges, columns) - ] - flex_minimum = [ - (column.width or 1) + get_padding_width(column._index) - for column in columns - if column.flexible - ] - flexible_width = max_width - sum(fixed_widths) - flex_widths = ratio_distribute(flexible_width, ratios, flex_minimum) - iter_flex_widths = iter(flex_widths) - for index, column in enumerate(columns): - if column.flexible: - widths[index] = fixed_widths[index] + next(iter_flex_widths) - table_width = sum(widths) - - if table_width > max_width: - widths = self._collapse_widths( - widths, - [(column.width is None and not column.no_wrap) for column in columns], - max_width, - ) - table_width = sum(widths) - # last resort, reduce columns evenly - if table_width > max_width: - excess_width = table_width - max_width - widths = ratio_reduce(excess_width, [1] * len(widths), widths, widths) - table_width = sum(widths) - - width_ranges = [ - self._measure_column(console, options.update_width(width), column) - for width, column in zip(widths, columns) - ] - widths = [_range.maximum or 0 for _range in width_ranges] - - if (table_width < max_width and self.expand) or ( - self.min_width is not None and table_width < (self.min_width - extra_width) - ): - _max_width = ( - max_width - if self.min_width is None - else min(self.min_width - extra_width, max_width) - ) - pad_widths = ratio_distribute(_max_width - table_width, widths) - widths = [_width + pad for _width, pad in zip(widths, pad_widths)] - - return widths - - @classmethod - def _collapse_widths( - cls, widths: List[int], wrapable: List[bool], max_width: int - ) -> List[int]: - """Reduce widths so that the total is under max_width. - - Args: - widths (List[int]): List of widths. - wrapable (List[bool]): List of booleans that indicate if a column may shrink. - max_width (int): Maximum width to reduce to. - - Returns: - List[int]: A new list of widths. - """ - total_width = sum(widths) - excess_width = total_width - max_width - if any(wrapable): - while total_width and excess_width > 0: - max_column = max( - width for width, allow_wrap in zip(widths, wrapable) if allow_wrap - ) - second_max_column = max( - width if allow_wrap and width != max_column else 0 - for width, allow_wrap in zip(widths, wrapable) - ) - column_difference = max_column - second_max_column - ratios = [ - (1 if (width == max_column and allow_wrap) else 0) - for width, allow_wrap in zip(widths, wrapable) - ] - if not any(ratios) or not column_difference: - break - max_reduce = [min(excess_width, column_difference)] * len(widths) - widths = ratio_reduce(excess_width, ratios, max_reduce, widths) - - total_width = sum(widths) - excess_width = total_width - max_width - return widths - - def _get_cells( - self, console: "Console", column_index: int, column: Column - ) -> Iterable[_Cell]: - """Get all the cells with padding and optional header.""" - - collapse_padding = self.collapse_padding - pad_edge = self.pad_edge - padding = self.padding - any_padding = any(padding) - - first_column = column_index == 0 - last_column = column_index == len(self.columns) - 1 - - _padding_cache: Dict[Tuple[bool, bool], Tuple[int, int, int, int]] = {} - - def get_padding(first_row: bool, last_row: bool) -> Tuple[int, int, int, int]: - cached = _padding_cache.get((first_row, last_row)) - if cached: - return cached - top, right, bottom, left = padding - - if collapse_padding: - if not first_column: - left = max(0, left - right) - if not last_row: - bottom = max(0, top - bottom) - - if not pad_edge: - if first_column: - left = 0 - if last_column: - right = 0 - if first_row: - top = 0 - if last_row: - bottom = 0 - _padding = (top, right, bottom, left) - _padding_cache[(first_row, last_row)] = _padding - return _padding - - raw_cells: List[Tuple[StyleType, "RenderableType"]] = [] - _append = raw_cells.append - get_style = console.get_style - if self.show_header: - header_style = get_style(self.header_style or "") + get_style( - column.header_style - ) - _append((header_style, column.header)) - cell_style = get_style(column.style or "") - for cell in column.cells: - _append((cell_style, cell)) - if self.show_footer: - footer_style = get_style(self.footer_style or "") + get_style( - column.footer_style - ) - _append((footer_style, column.footer)) - - if any_padding: - _Padding = Padding - for first, last, (style, renderable) in loop_first_last(raw_cells): - yield _Cell( - style, - _Padding(renderable, get_padding(first, last)), - getattr(renderable, "vertical", None) or column.vertical, - ) - else: - for (style, renderable) in raw_cells: - yield _Cell( - style, - renderable, - getattr(renderable, "vertical", None) or column.vertical, - ) - - def _get_padding_width(self, column_index: int) -> int: - """Get extra width from padding.""" - _, pad_right, _, pad_left = self.padding - if self.collapse_padding: - if column_index > 0: - pad_left = max(0, pad_left - pad_right) - return pad_left + pad_right - - def _measure_column( - self, - console: "Console", - options: "ConsoleOptions", - column: Column, - ) -> Measurement: - """Get the minimum and maximum width of the column.""" - - max_width = options.max_width - if max_width < 1: - return Measurement(0, 0) - - padding_width = self._get_padding_width(column._index) - - if column.width is not None: - # Fixed width column - return Measurement( - column.width + padding_width, column.width + padding_width - ).with_maximum(max_width) - # Flexible column, we need to measure contents - min_widths: List[int] = [] - max_widths: List[int] = [] - append_min = min_widths.append - append_max = max_widths.append - get_render_width = Measurement.get - for cell in self._get_cells(console, column._index, column): - _min, _max = get_render_width(console, options, cell.renderable) - append_min(_min) - append_max(_max) - - measurement = Measurement( - max(min_widths) if min_widths else 1, - max(max_widths) if max_widths else max_width, - ).with_maximum(max_width) - measurement = measurement.clamp( - None if column.min_width is None else column.min_width + padding_width, - None if column.max_width is None else column.max_width + padding_width, - ) - return measurement - - def _render( - self, console: "Console", options: "ConsoleOptions", widths: List[int] - ) -> "RenderResult": - table_style = console.get_style(self.style or "") - - border_style = table_style + console.get_style(self.border_style or "") - _column_cells = ( - self._get_cells(console, column_index, column) - for column_index, column in enumerate(self.columns) - ) - row_cells: List[Tuple[_Cell, ...]] = list(zip(*_column_cells)) - _box = ( - self.box.substitute( - options, safe=pick_bool(self.safe_box, console.safe_box) - ) - if self.box - else None - ) - _box = _box.get_plain_headed_box() if _box and not self.show_header else _box - - new_line = Segment.line() - - columns = self.columns - show_header = self.show_header - show_footer = self.show_footer - show_edge = self.show_edge - show_lines = self.show_lines - leading = self.leading - - _Segment = Segment - if _box: - box_segments = [ - ( - _Segment(_box.head_left, border_style), - _Segment(_box.head_right, border_style), - _Segment(_box.head_vertical, border_style), - ), - ( - _Segment(_box.foot_left, border_style), - _Segment(_box.foot_right, border_style), - _Segment(_box.foot_vertical, border_style), - ), - ( - _Segment(_box.mid_left, border_style), - _Segment(_box.mid_right, border_style), - _Segment(_box.mid_vertical, border_style), - ), - ] - if show_edge: - yield _Segment(_box.get_top(widths), border_style) - yield new_line - else: - box_segments = [] - - get_row_style = self.get_row_style - get_style = console.get_style - - for index, (first, last, row_cell) in enumerate(loop_first_last(row_cells)): - header_row = first and show_header - footer_row = last and show_footer - row = ( - self.rows[index - show_header] - if (not header_row and not footer_row) - else None - ) - max_height = 1 - cells: List[List[List[Segment]]] = [] - if header_row or footer_row: - row_style = Style.null() - else: - row_style = get_style( - get_row_style(console, index - 1 if show_header else index) - ) - for width, cell, column in zip(widths, row_cell, columns): - render_options = options.update( - width=width, - justify=column.justify, - no_wrap=column.no_wrap, - overflow=column.overflow, - height=None, - ) - lines = console.render_lines( - cell.renderable, - render_options, - style=get_style(cell.style) + row_style, - ) - max_height = max(max_height, len(lines)) - cells.append(lines) - - row_height = max(len(cell) for cell in cells) - - def align_cell( - cell: List[List[Segment]], - vertical: "VerticalAlignMethod", - width: int, - style: Style, - ) -> List[List[Segment]]: - if header_row: - vertical = "bottom" - elif footer_row: - vertical = "top" - - if vertical == "top": - return _Segment.align_top(cell, width, row_height, style) - elif vertical == "middle": - return _Segment.align_middle(cell, width, row_height, style) - return _Segment.align_bottom(cell, width, row_height, style) - - cells[:] = [ - _Segment.set_shape( - align_cell( - cell, - _cell.vertical, - width, - get_style(_cell.style) + row_style, - ), - width, - max_height, - ) - for width, _cell, cell, column in zip(widths, row_cell, cells, columns) - ] - - if _box: - if last and show_footer: - yield _Segment( - _box.get_row(widths, "foot", edge=show_edge), border_style - ) - yield new_line - left, right, _divider = box_segments[0 if first else (2 if last else 1)] - - # If the column divider is whitespace also style it with the row background - divider = ( - _divider - if _divider.text.strip() - else _Segment( - _divider.text, row_style.background_style + _divider.style - ) - ) - for line_no in range(max_height): - if show_edge: - yield left - for last_cell, rendered_cell in loop_last(cells): - yield from rendered_cell[line_no] - if not last_cell: - yield divider - if show_edge: - yield right - yield new_line - else: - for line_no in range(max_height): - for rendered_cell in cells: - yield from rendered_cell[line_no] - yield new_line - if _box and first and show_header: - yield _Segment( - _box.get_row(widths, "head", edge=show_edge), border_style - ) - yield new_line - end_section = row and row.end_section - if _box and (show_lines or leading or end_section): - if ( - not last - and not (show_footer and index >= len(row_cells) - 2) - and not (show_header and header_row) - ): - if leading: - yield _Segment( - _box.get_row(widths, "mid", edge=show_edge) * leading, - border_style, - ) - else: - yield _Segment( - _box.get_row(widths, "row", edge=show_edge), border_style - ) - yield new_line - - if _box and show_edge: - yield _Segment(_box.get_bottom(widths), border_style) - yield new_line - - -if __name__ == "__main__": # pragma: no cover - from pip._vendor.rich.console import Console - from pip._vendor.rich.highlighter import ReprHighlighter - from pip._vendor.rich.table import Table as Table - - from ._timer import timer - - with timer("Table render"): - table = Table( - title="Star Wars Movies", - caption="Rich example table", - caption_justify="right", - ) - - table.add_column( - "Released", header_style="bright_cyan", style="cyan", no_wrap=True - ) - table.add_column("Title", style="magenta") - table.add_column("Box Office", justify="right", style="green") - - table.add_row( - "Dec 20, 2019", - "Star Wars: The Rise of Skywalker", - "$952,110,690", - ) - table.add_row("May 25, 2018", "Solo: A Star Wars Story", "$393,151,347") - table.add_row( - "Dec 15, 2017", - "Star Wars Ep. V111: The Last Jedi", - "$1,332,539,889", - style="on black", - end_section=True, - ) - table.add_row( - "Dec 16, 2016", - "Rogue One: A Star Wars Story", - "$1,332,439,889", - ) - - def header(text: str) -> None: - console.print() - console.rule(highlight(text)) - console.print() - - console = Console() - highlight = ReprHighlighter() - header("Example Table") - console.print(table, justify="center") - - table.expand = True - header("expand=True") - console.print(table) - - table.width = 50 - header("width=50") - - console.print(table, justify="center") - - table.width = None - table.expand = False - table.row_styles = ["dim", "none"] - header("row_styles=['dim', 'none']") - - console.print(table, justify="center") - - table.width = None - table.expand = False - table.row_styles = ["dim", "none"] - table.leading = 1 - header("leading=1, row_styles=['dim', 'none']") - console.print(table, justify="center") - - table.width = None - table.expand = False - table.row_styles = ["dim", "none"] - table.show_lines = True - table.leading = 0 - header("show_lines=True, row_styles=['dim', 'none']") - console.print(table, justify="center") diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/terminal_theme.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/terminal_theme.py deleted file mode 100644 index 565e9d9..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/terminal_theme.py +++ /dev/null @@ -1,153 +0,0 @@ -from typing import List, Optional, Tuple - -from .color_triplet import ColorTriplet -from .palette import Palette - -_ColorTuple = Tuple[int, int, int] - - -class TerminalTheme: - """A color theme used when exporting console content. - - Args: - background (Tuple[int, int, int]): The background color. - foreground (Tuple[int, int, int]): The foreground (text) color. - normal (List[Tuple[int, int, int]]): A list of 8 normal intensity colors. - bright (List[Tuple[int, int, int]], optional): A list of 8 bright colors, or None - to repeat normal intensity. Defaults to None. - """ - - def __init__( - self, - background: _ColorTuple, - foreground: _ColorTuple, - normal: List[_ColorTuple], - bright: Optional[List[_ColorTuple]] = None, - ) -> None: - self.background_color = ColorTriplet(*background) - self.foreground_color = ColorTriplet(*foreground) - self.ansi_colors = Palette(normal + (bright or normal)) - - -DEFAULT_TERMINAL_THEME = TerminalTheme( - (255, 255, 255), - (0, 0, 0), - [ - (0, 0, 0), - (128, 0, 0), - (0, 128, 0), - (128, 128, 0), - (0, 0, 128), - (128, 0, 128), - (0, 128, 128), - (192, 192, 192), - ], - [ - (128, 128, 128), - (255, 0, 0), - (0, 255, 0), - (255, 255, 0), - (0, 0, 255), - (255, 0, 255), - (0, 255, 255), - (255, 255, 255), - ], -) - -MONOKAI = TerminalTheme( - (12, 12, 12), - (217, 217, 217), - [ - (26, 26, 26), - (244, 0, 95), - (152, 224, 36), - (253, 151, 31), - (157, 101, 255), - (244, 0, 95), - (88, 209, 235), - (196, 197, 181), - (98, 94, 76), - ], - [ - (244, 0, 95), - (152, 224, 36), - (224, 213, 97), - (157, 101, 255), - (244, 0, 95), - (88, 209, 235), - (246, 246, 239), - ], -) -DIMMED_MONOKAI = TerminalTheme( - (25, 25, 25), - (185, 188, 186), - [ - (58, 61, 67), - (190, 63, 72), - (135, 154, 59), - (197, 166, 53), - (79, 118, 161), - (133, 92, 141), - (87, 143, 164), - (185, 188, 186), - (136, 137, 135), - ], - [ - (251, 0, 31), - (15, 114, 47), - (196, 112, 51), - (24, 109, 227), - (251, 0, 103), - (46, 112, 109), - (253, 255, 185), - ], -) -NIGHT_OWLISH = TerminalTheme( - (255, 255, 255), - (64, 63, 83), - [ - (1, 22, 39), - (211, 66, 62), - (42, 162, 152), - (218, 170, 1), - (72, 118, 214), - (64, 63, 83), - (8, 145, 106), - (122, 129, 129), - (122, 129, 129), - ], - [ - (247, 110, 110), - (73, 208, 197), - (218, 194, 107), - (92, 167, 228), - (105, 112, 152), - (0, 201, 144), - (152, 159, 177), - ], -) - -SVG_EXPORT_THEME = TerminalTheme( - (41, 41, 41), - (197, 200, 198), - [ - (75, 78, 85), - (204, 85, 90), - (152, 168, 75), - (208, 179, 68), - (96, 138, 177), - (152, 114, 159), - (104, 160, 179), - (197, 200, 198), - (154, 155, 153), - ], - [ - (255, 38, 39), - (0, 130, 61), - (208, 132, 66), - (25, 132, 233), - (255, 44, 122), - (57, 130, 128), - (253, 253, 197), - ], -) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/text.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/text.py deleted file mode 100644 index 998cb87..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/text.py +++ /dev/null @@ -1,1307 +0,0 @@ -import re -from functools import partial, reduce -from math import gcd -from operator import itemgetter -from typing import ( - TYPE_CHECKING, - Any, - Callable, - Dict, - Iterable, - List, - NamedTuple, - Optional, - Tuple, - Union, -) - -from ._loop import loop_last -from ._pick import pick_bool -from ._wrap import divide_line -from .align import AlignMethod -from .cells import cell_len, set_cell_size -from .containers import Lines -from .control import strip_control_codes -from .emoji import EmojiVariant -from .jupyter import JupyterMixin -from .measure import Measurement -from .segment import Segment -from .style import Style, StyleType - -if TYPE_CHECKING: # pragma: no cover - from .console import Console, ConsoleOptions, JustifyMethod, OverflowMethod - -DEFAULT_JUSTIFY: "JustifyMethod" = "default" -DEFAULT_OVERFLOW: "OverflowMethod" = "fold" - - -_re_whitespace = re.compile(r"\s+$") - -TextType = Union[str, "Text"] - -GetStyleCallable = Callable[[str], Optional[StyleType]] - - -class Span(NamedTuple): - """A marked up region in some text.""" - - start: int - """Span start index.""" - end: int - """Span end index.""" - style: Union[str, Style] - """Style associated with the span.""" - - def __repr__(self) -> str: - return f"Span({self.start}, {self.end}, {self.style!r})" - - def __bool__(self) -> bool: - return self.end > self.start - - def split(self, offset: int) -> Tuple["Span", Optional["Span"]]: - """Split a span in to 2 from a given offset.""" - - if offset < self.start: - return self, None - if offset >= self.end: - return self, None - - start, end, style = self - span1 = Span(start, min(end, offset), style) - span2 = Span(span1.end, end, style) - return span1, span2 - - def move(self, offset: int) -> "Span": - """Move start and end by a given offset. - - Args: - offset (int): Number of characters to add to start and end. - - Returns: - TextSpan: A new TextSpan with adjusted position. - """ - start, end, style = self - return Span(start + offset, end + offset, style) - - def right_crop(self, offset: int) -> "Span": - """Crop the span at the given offset. - - Args: - offset (int): A value between start and end. - - Returns: - Span: A new (possibly smaller) span. - """ - start, end, style = self - if offset >= end: - return self - return Span(start, min(offset, end), style) - - -class Text(JupyterMixin): - """Text with color / style. - - Args: - text (str, optional): Default unstyled text. Defaults to "". - style (Union[str, Style], optional): Base style for text. Defaults to "". - justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None. - overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None. - no_wrap (bool, optional): Disable text wrapping, or None for default. Defaults to None. - end (str, optional): Character to end text with. Defaults to "\\\\n". - tab_size (int): Number of spaces per tab, or ``None`` to use ``console.tab_size``. Defaults to 8. - spans (List[Span], optional). A list of predefined style spans. Defaults to None. - """ - - __slots__ = [ - "_text", - "style", - "justify", - "overflow", - "no_wrap", - "end", - "tab_size", - "_spans", - "_length", - ] - - def __init__( - self, - text: str = "", - style: Union[str, Style] = "", - *, - justify: Optional["JustifyMethod"] = None, - overflow: Optional["OverflowMethod"] = None, - no_wrap: Optional[bool] = None, - end: str = "\n", - tab_size: Optional[int] = 8, - spans: Optional[List[Span]] = None, - ) -> None: - sanitized_text = strip_control_codes(text) - self._text = [sanitized_text] - self.style = style - self.justify: Optional["JustifyMethod"] = justify - self.overflow: Optional["OverflowMethod"] = overflow - self.no_wrap = no_wrap - self.end = end - self.tab_size = tab_size - self._spans: List[Span] = spans or [] - self._length: int = len(sanitized_text) - - def __len__(self) -> int: - return self._length - - def __bool__(self) -> bool: - return bool(self._length) - - def __str__(self) -> str: - return self.plain - - def __repr__(self) -> str: - return f"<text {self.plain!r} {self._spans!r}>" - - def __add__(self, other: Any) -> "Text": - if isinstance(other, (str, Text)): - result = self.copy() - result.append(other) - return result - return NotImplemented - - def __eq__(self, other: object) -> bool: - if not isinstance(other, Text): - return NotImplemented - return self.plain == other.plain and self._spans == other._spans - - def __contains__(self, other: object) -> bool: - if isinstance(other, str): - return other in self.plain - elif isinstance(other, Text): - return other.plain in self.plain - return False - - def __getitem__(self, slice: Union[int, slice]) -> "Text": - def get_text_at(offset: int) -> "Text": - _Span = Span - text = Text( - self.plain[offset], - spans=[ - _Span(0, 1, style) - for start, end, style in self._spans - if end > offset >= start - ], - end="", - ) - return text - - if isinstance(slice, int): - return get_text_at(slice) - else: - start, stop, step = slice.indices(len(self.plain)) - if step == 1: - lines = self.divide([start, stop]) - return lines[1] - else: - # This would be a bit of work to implement efficiently - # For now, its not required - raise TypeError("slices with step!=1 are not supported") - - @property - def cell_len(self) -> int: - """Get the number of cells required to render this text.""" - return cell_len(self.plain) - - @property - def markup(self) -> str: - """Get console markup to render this Text. - - Returns: - str: A string potentially creating markup tags. - """ - from .markup import escape - - output: List[str] = [] - - plain = self.plain - markup_spans = [ - (0, False, self.style), - *((span.start, False, span.style) for span in self._spans), - *((span.end, True, span.style) for span in self._spans), - (len(plain), True, self.style), - ] - markup_spans.sort(key=itemgetter(0, 1)) - position = 0 - append = output.append - for offset, closing, style in markup_spans: - if offset > position: - append(escape(plain[position:offset])) - position = offset - if style: - append(f"[/{style}]" if closing else f"[{style}]") - markup = "".join(output) - return markup - - @classmethod - def from_markup( - cls, - text: str, - *, - style: Union[str, Style] = "", - emoji: bool = True, - emoji_variant: Optional[EmojiVariant] = None, - justify: Optional["JustifyMethod"] = None, - overflow: Optional["OverflowMethod"] = None, - end: str = "\n", - ) -> "Text": - """Create Text instance from markup. - - Args: - text (str): A string containing console markup. - emoji (bool, optional): Also render emoji code. Defaults to True. - justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None. - overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None. - end (str, optional): Character to end text with. Defaults to "\\\\n". - - Returns: - Text: A Text instance with markup rendered. - """ - from .markup import render - - rendered_text = render(text, style, emoji=emoji, emoji_variant=emoji_variant) - rendered_text.justify = justify - rendered_text.overflow = overflow - rendered_text.end = end - return rendered_text - - @classmethod - def from_ansi( - cls, - text: str, - *, - style: Union[str, Style] = "", - justify: Optional["JustifyMethod"] = None, - overflow: Optional["OverflowMethod"] = None, - no_wrap: Optional[bool] = None, - end: str = "\n", - tab_size: Optional[int] = 8, - ) -> "Text": - """Create a Text object from a string containing ANSI escape codes. - - Args: - text (str): A string containing escape codes. - style (Union[str, Style], optional): Base style for text. Defaults to "". - justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None. - overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None. - no_wrap (bool, optional): Disable text wrapping, or None for default. Defaults to None. - end (str, optional): Character to end text with. Defaults to "\\\\n". - tab_size (int): Number of spaces per tab, or ``None`` to use ``console.tab_size``. Defaults to 8. - """ - from .ansi import AnsiDecoder - - joiner = Text( - "\n", - justify=justify, - overflow=overflow, - no_wrap=no_wrap, - end=end, - tab_size=tab_size, - style=style, - ) - decoder = AnsiDecoder() - result = joiner.join(line for line in decoder.decode(text)) - return result - - @classmethod - def styled( - cls, - text: str, - style: StyleType = "", - *, - justify: Optional["JustifyMethod"] = None, - overflow: Optional["OverflowMethod"] = None, - ) -> "Text": - """Construct a Text instance with a pre-applied styled. A style applied in this way won't be used - to pad the text when it is justified. - - Args: - text (str): A string containing console markup. - style (Union[str, Style]): Style to apply to the text. Defaults to "". - justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None. - overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None. - - Returns: - Text: A text instance with a style applied to the entire string. - """ - styled_text = cls(text, justify=justify, overflow=overflow) - styled_text.stylize(style) - return styled_text - - @classmethod - def assemble( - cls, - *parts: Union[str, "Text", Tuple[str, StyleType]], - style: Union[str, Style] = "", - justify: Optional["JustifyMethod"] = None, - overflow: Optional["OverflowMethod"] = None, - no_wrap: Optional[bool] = None, - end: str = "\n", - tab_size: int = 8, - meta: Optional[Dict[str, Any]] = None, - ) -> "Text": - """Construct a text instance by combining a sequence of strings with optional styles. - The positional arguments should be either strings, or a tuple of string + style. - - Args: - style (Union[str, Style], optional): Base style for text. Defaults to "". - justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None. - overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None. - end (str, optional): Character to end text with. Defaults to "\\\\n". - tab_size (int): Number of spaces per tab, or ``None`` to use ``console.tab_size``. Defaults to 8. - meta (Dict[str, Any], optional). Meta data to apply to text, or None for no meta data. Default to None - - Returns: - Text: A new text instance. - """ - text = cls( - style=style, - justify=justify, - overflow=overflow, - no_wrap=no_wrap, - end=end, - tab_size=tab_size, - ) - append = text.append - _Text = Text - for part in parts: - if isinstance(part, (_Text, str)): - append(part) - else: - append(*part) - if meta: - text.apply_meta(meta) - return text - - @property - def plain(self) -> str: - """Get the text as a single string.""" - if len(self._text) != 1: - self._text[:] = ["".join(self._text)] - return self._text[0] - - @plain.setter - def plain(self, new_text: str) -> None: - """Set the text to a new value.""" - if new_text != self.plain: - sanitized_text = strip_control_codes(new_text) - self._text[:] = [sanitized_text] - old_length = self._length - self._length = len(sanitized_text) - if old_length > self._length: - self._trim_spans() - - @property - def spans(self) -> List[Span]: - """Get a reference to the internal list of spans.""" - return self._spans - - @spans.setter - def spans(self, spans: List[Span]) -> None: - """Set spans.""" - self._spans = spans[:] - - def blank_copy(self, plain: str = "") -> "Text": - """Return a new Text instance with copied meta data (but not the string or spans).""" - copy_self = Text( - plain, - style=self.style, - justify=self.justify, - overflow=self.overflow, - no_wrap=self.no_wrap, - end=self.end, - tab_size=self.tab_size, - ) - return copy_self - - def copy(self) -> "Text": - """Return a copy of this instance.""" - copy_self = Text( - self.plain, - style=self.style, - justify=self.justify, - overflow=self.overflow, - no_wrap=self.no_wrap, - end=self.end, - tab_size=self.tab_size, - ) - copy_self._spans[:] = self._spans - return copy_self - - def stylize( - self, - style: Union[str, Style], - start: int = 0, - end: Optional[int] = None, - ) -> None: - """Apply a style to the text, or a portion of the text. - - Args: - style (Union[str, Style]): Style instance or style definition to apply. - start (int): Start offset (negative indexing is supported). Defaults to 0. - end (Optional[int], optional): End offset (negative indexing is supported), or None for end of text. Defaults to None. - """ - if style: - length = len(self) - if start < 0: - start = length + start - if end is None: - end = length - if end < 0: - end = length + end - if start >= length or end <= start: - # Span not in text or not valid - return - self._spans.append(Span(start, min(length, end), style)) - - def stylize_before( - self, - style: Union[str, Style], - start: int = 0, - end: Optional[int] = None, - ) -> None: - """Apply a style to the text, or a portion of the text. Styles will be applied before other styles already present. - - Args: - style (Union[str, Style]): Style instance or style definition to apply. - start (int): Start offset (negative indexing is supported). Defaults to 0. - end (Optional[int], optional): End offset (negative indexing is supported), or None for end of text. Defaults to None. - """ - if style: - length = len(self) - if start < 0: - start = length + start - if end is None: - end = length - if end < 0: - end = length + end - if start >= length or end <= start: - # Span not in text or not valid - return - self._spans.insert(0, Span(start, min(length, end), style)) - - def apply_meta( - self, meta: Dict[str, Any], start: int = 0, end: Optional[int] = None - ) -> None: - """Apply meta data to the text, or a portion of the text. - - Args: - meta (Dict[str, Any]): A dict of meta information. - start (int): Start offset (negative indexing is supported). Defaults to 0. - end (Optional[int], optional): End offset (negative indexing is supported), or None for end of text. Defaults to None. - - """ - style = Style.from_meta(meta) - self.stylize(style, start=start, end=end) - - def on(self, meta: Optional[Dict[str, Any]] = None, **handlers: Any) -> "Text": - """Apply event handlers (used by Textual project). - - Example: - >>> from rich.text import Text - >>> text = Text("hello world") - >>> text.on(click="view.toggle('world')") - - Args: - meta (Dict[str, Any]): Mapping of meta information. - **handlers: Keyword args are prefixed with "@" to defined handlers. - - Returns: - Text: Self is returned to method may be chained. - """ - meta = {} if meta is None else meta - meta.update({f"@{key}": value for key, value in handlers.items()}) - self.stylize(Style.from_meta(meta)) - return self - - def remove_suffix(self, suffix: str) -> None: - """Remove a suffix if it exists. - - Args: - suffix (str): Suffix to remove. - """ - if self.plain.endswith(suffix): - self.right_crop(len(suffix)) - - def get_style_at_offset(self, console: "Console", offset: int) -> Style: - """Get the style of a character at give offset. - - Args: - console (~Console): Console where text will be rendered. - offset (int): Offset in to text (negative indexing supported) - - Returns: - Style: A Style instance. - """ - # TODO: This is a little inefficient, it is only used by full justify - if offset < 0: - offset = len(self) + offset - get_style = console.get_style - style = get_style(self.style).copy() - for start, end, span_style in self._spans: - if end > offset >= start: - style += get_style(span_style, default="") - return style - - def highlight_regex( - self, - re_highlight: str, - style: Optional[Union[GetStyleCallable, StyleType]] = None, - *, - style_prefix: str = "", - ) -> int: - """Highlight text with a regular expression, where group names are - translated to styles. - - Args: - re_highlight (str): A regular expression. - style (Union[GetStyleCallable, StyleType]): Optional style to apply to whole match, or a callable - which accepts the matched text and returns a style. Defaults to None. - style_prefix (str, optional): Optional prefix to add to style group names. - - Returns: - int: Number of regex matches - """ - count = 0 - append_span = self._spans.append - _Span = Span - plain = self.plain - for match in re.finditer(re_highlight, plain): - get_span = match.span - if style: - start, end = get_span() - match_style = style(plain[start:end]) if callable(style) else style - if match_style is not None and end > start: - append_span(_Span(start, end, match_style)) - - count += 1 - for name in match.groupdict().keys(): - start, end = get_span(name) - if start != -1 and end > start: - append_span(_Span(start, end, f"{style_prefix}{name}")) - return count - - def highlight_words( - self, - words: Iterable[str], - style: Union[str, Style], - *, - case_sensitive: bool = True, - ) -> int: - """Highlight words with a style. - - Args: - words (Iterable[str]): Worlds to highlight. - style (Union[str, Style]): Style to apply. - case_sensitive (bool, optional): Enable case sensitive matchings. Defaults to True. - - Returns: - int: Number of words highlighted. - """ - re_words = "|".join(re.escape(word) for word in words) - add_span = self._spans.append - count = 0 - _Span = Span - for match in re.finditer( - re_words, self.plain, flags=0 if case_sensitive else re.IGNORECASE - ): - start, end = match.span(0) - add_span(_Span(start, end, style)) - count += 1 - return count - - def rstrip(self) -> None: - """Strip whitespace from end of text.""" - self.plain = self.plain.rstrip() - - def rstrip_end(self, size: int) -> None: - """Remove whitespace beyond a certain width at the end of the text. - - Args: - size (int): The desired size of the text. - """ - text_length = len(self) - if text_length > size: - excess = text_length - size - whitespace_match = _re_whitespace.search(self.plain) - if whitespace_match is not None: - whitespace_count = len(whitespace_match.group(0)) - self.right_crop(min(whitespace_count, excess)) - - def set_length(self, new_length: int) -> None: - """Set new length of the text, clipping or padding is required.""" - length = len(self) - if length != new_length: - if length < new_length: - self.pad_right(new_length - length) - else: - self.right_crop(length - new_length) - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> Iterable[Segment]: - tab_size: int = console.tab_size or self.tab_size or 8 - justify = self.justify or options.justify or DEFAULT_JUSTIFY - - overflow = self.overflow or options.overflow or DEFAULT_OVERFLOW - - lines = self.wrap( - console, - options.max_width, - justify=justify, - overflow=overflow, - tab_size=tab_size or 8, - no_wrap=pick_bool(self.no_wrap, options.no_wrap, False), - ) - all_lines = Text("\n").join(lines) - yield from all_lines.render(console, end=self.end) - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> Measurement: - text = self.plain - lines = text.splitlines() - max_text_width = max(cell_len(line) for line in lines) if lines else 0 - words = text.split() - min_text_width = ( - max(cell_len(word) for word in words) if words else max_text_width - ) - return Measurement(min_text_width, max_text_width) - - def render(self, console: "Console", end: str = "") -> Iterable["Segment"]: - """Render the text as Segments. - - Args: - console (Console): Console instance. - end (Optional[str], optional): Optional end character. - - Returns: - Iterable[Segment]: Result of render that may be written to the console. - """ - _Segment = Segment - text = self.plain - if not self._spans: - yield Segment(text) - if end: - yield _Segment(end) - return - get_style = partial(console.get_style, default=Style.null()) - - enumerated_spans = list(enumerate(self._spans, 1)) - style_map = {index: get_style(span.style) for index, span in enumerated_spans} - style_map[0] = get_style(self.style) - - spans = [ - (0, False, 0), - *((span.start, False, index) for index, span in enumerated_spans), - *((span.end, True, index) for index, span in enumerated_spans), - (len(text), True, 0), - ] - spans.sort(key=itemgetter(0, 1)) - - stack: List[int] = [] - stack_append = stack.append - stack_pop = stack.remove - - style_cache: Dict[Tuple[Style, ...], Style] = {} - style_cache_get = style_cache.get - combine = Style.combine - - def get_current_style() -> Style: - """Construct current style from stack.""" - styles = tuple(style_map[_style_id] for _style_id in sorted(stack)) - cached_style = style_cache_get(styles) - if cached_style is not None: - return cached_style - current_style = combine(styles) - style_cache[styles] = current_style - return current_style - - for (offset, leaving, style_id), (next_offset, _, _) in zip(spans, spans[1:]): - if leaving: - stack_pop(style_id) - else: - stack_append(style_id) - if next_offset > offset: - yield _Segment(text[offset:next_offset], get_current_style()) - if end: - yield _Segment(end) - - def join(self, lines: Iterable["Text"]) -> "Text": - """Join text together with this instance as the separator. - - Args: - lines (Iterable[Text]): An iterable of Text instances to join. - - Returns: - Text: A new text instance containing join text. - """ - - new_text = self.blank_copy() - - def iter_text() -> Iterable["Text"]: - if self.plain: - for last, line in loop_last(lines): - yield line - if not last: - yield self - else: - yield from lines - - extend_text = new_text._text.extend - append_span = new_text._spans.append - extend_spans = new_text._spans.extend - offset = 0 - _Span = Span - - for text in iter_text(): - extend_text(text._text) - if text.style: - append_span(_Span(offset, offset + len(text), text.style)) - extend_spans( - _Span(offset + start, offset + end, style) - for start, end, style in text._spans - ) - offset += len(text) - new_text._length = offset - return new_text - - def expand_tabs(self, tab_size: Optional[int] = None) -> None: - """Converts tabs to spaces. - - Args: - tab_size (int, optional): Size of tabs. Defaults to 8. - - """ - if "\t" not in self.plain: - return - pos = 0 - if tab_size is None: - tab_size = self.tab_size - assert tab_size is not None - result = self.blank_copy() - append = result.append - - _style = self.style - for line in self.split("\n", include_separator=True): - parts = line.split("\t", include_separator=True) - for part in parts: - if part.plain.endswith("\t"): - part._text = [part.plain[:-1] + " "] - append(part) - pos += len(part) - spaces = tab_size - ((pos - 1) % tab_size) - 1 - if spaces: - append(" " * spaces, _style) - pos += spaces - else: - append(part) - self._text = [result.plain] - self._length = len(self.plain) - self._spans[:] = result._spans - - def truncate( - self, - max_width: int, - *, - overflow: Optional["OverflowMethod"] = None, - pad: bool = False, - ) -> None: - """Truncate text if it is longer that a given width. - - Args: - max_width (int): Maximum number of characters in text. - overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to None, to use self.overflow. - pad (bool, optional): Pad with spaces if the length is less than max_width. Defaults to False. - """ - _overflow = overflow or self.overflow or DEFAULT_OVERFLOW - if _overflow != "ignore": - length = cell_len(self.plain) - if length > max_width: - if _overflow == "ellipsis": - self.plain = set_cell_size(self.plain, max_width - 1) + "…" - else: - self.plain = set_cell_size(self.plain, max_width) - if pad and length < max_width: - spaces = max_width - length - self._text = [f"{self.plain}{' ' * spaces}"] - self._length = len(self.plain) - - def _trim_spans(self) -> None: - """Remove or modify any spans that are over the end of the text.""" - max_offset = len(self.plain) - _Span = Span - self._spans[:] = [ - ( - span - if span.end < max_offset - else _Span(span.start, min(max_offset, span.end), span.style) - ) - for span in self._spans - if span.start < max_offset - ] - - def pad(self, count: int, character: str = " ") -> None: - """Pad left and right with a given number of characters. - - Args: - count (int): Width of padding. - """ - assert len(character) == 1, "Character must be a string of length 1" - if count: - pad_characters = character * count - self.plain = f"{pad_characters}{self.plain}{pad_characters}" - _Span = Span - self._spans[:] = [ - _Span(start + count, end + count, style) - for start, end, style in self._spans - ] - - def pad_left(self, count: int, character: str = " ") -> None: - """Pad the left with a given character. - - Args: - count (int): Number of characters to pad. - character (str, optional): Character to pad with. Defaults to " ". - """ - assert len(character) == 1, "Character must be a string of length 1" - if count: - self.plain = f"{character * count}{self.plain}" - _Span = Span - self._spans[:] = [ - _Span(start + count, end + count, style) - for start, end, style in self._spans - ] - - def pad_right(self, count: int, character: str = " ") -> None: - """Pad the right with a given character. - - Args: - count (int): Number of characters to pad. - character (str, optional): Character to pad with. Defaults to " ". - """ - assert len(character) == 1, "Character must be a string of length 1" - if count: - self.plain = f"{self.plain}{character * count}" - - def align(self, align: AlignMethod, width: int, character: str = " ") -> None: - """Align text to a given width. - - Args: - align (AlignMethod): One of "left", "center", or "right". - width (int): Desired width. - character (str, optional): Character to pad with. Defaults to " ". - """ - self.truncate(width) - excess_space = width - cell_len(self.plain) - if excess_space: - if align == "left": - self.pad_right(excess_space, character) - elif align == "center": - left = excess_space // 2 - self.pad_left(left, character) - self.pad_right(excess_space - left, character) - else: - self.pad_left(excess_space, character) - - def append( - self, text: Union["Text", str], style: Optional[Union[str, "Style"]] = None - ) -> "Text": - """Add text with an optional style. - - Args: - text (Union[Text, str]): A str or Text to append. - style (str, optional): A style name. Defaults to None. - - Returns: - Text: Returns self for chaining. - """ - - if not isinstance(text, (str, Text)): - raise TypeError("Only str or Text can be appended to Text") - - if len(text): - if isinstance(text, str): - sanitized_text = strip_control_codes(text) - self._text.append(sanitized_text) - offset = len(self) - text_length = len(sanitized_text) - if style is not None: - self._spans.append(Span(offset, offset + text_length, style)) - self._length += text_length - elif isinstance(text, Text): - _Span = Span - if style is not None: - raise ValueError( - "style must not be set when appending Text instance" - ) - text_length = self._length - if text.style is not None: - self._spans.append( - _Span(text_length, text_length + len(text), text.style) - ) - self._text.append(text.plain) - self._spans.extend( - _Span(start + text_length, end + text_length, style) - for start, end, style in text._spans - ) - self._length += len(text) - return self - - def append_text(self, text: "Text") -> "Text": - """Append another Text instance. This method is more performant that Text.append, but - only works for Text. - - Returns: - Text: Returns self for chaining. - """ - _Span = Span - text_length = self._length - if text.style is not None: - self._spans.append(_Span(text_length, text_length + len(text), text.style)) - self._text.append(text.plain) - self._spans.extend( - _Span(start + text_length, end + text_length, style) - for start, end, style in text._spans - ) - self._length += len(text) - return self - - def append_tokens( - self, tokens: Iterable[Tuple[str, Optional[StyleType]]] - ) -> "Text": - """Append iterable of str and style. Style may be a Style instance or a str style definition. - - Args: - pairs (Iterable[Tuple[str, Optional[StyleType]]]): An iterable of tuples containing str content and style. - - Returns: - Text: Returns self for chaining. - """ - append_text = self._text.append - append_span = self._spans.append - _Span = Span - offset = len(self) - for content, style in tokens: - append_text(content) - if style is not None: - append_span(_Span(offset, offset + len(content), style)) - offset += len(content) - self._length = offset - return self - - def copy_styles(self, text: "Text") -> None: - """Copy styles from another Text instance. - - Args: - text (Text): A Text instance to copy styles from, must be the same length. - """ - self._spans.extend(text._spans) - - def split( - self, - separator: str = "\n", - *, - include_separator: bool = False, - allow_blank: bool = False, - ) -> Lines: - """Split rich text in to lines, preserving styles. - - Args: - separator (str, optional): String to split on. Defaults to "\\\\n". - include_separator (bool, optional): Include the separator in the lines. Defaults to False. - allow_blank (bool, optional): Return a blank line if the text ends with a separator. Defaults to False. - - Returns: - List[RichText]: A list of rich text, one per line of the original. - """ - assert separator, "separator must not be empty" - - text = self.plain - if separator not in text: - return Lines([self.copy()]) - - if include_separator: - lines = self.divide( - match.end() for match in re.finditer(re.escape(separator), text) - ) - else: - - def flatten_spans() -> Iterable[int]: - for match in re.finditer(re.escape(separator), text): - start, end = match.span() - yield start - yield end - - lines = Lines( - line for line in self.divide(flatten_spans()) if line.plain != separator - ) - - if not allow_blank and text.endswith(separator): - lines.pop() - - return lines - - def divide(self, offsets: Iterable[int]) -> Lines: - """Divide text in to a number of lines at given offsets. - - Args: - offsets (Iterable[int]): Offsets used to divide text. - - Returns: - Lines: New RichText instances between offsets. - """ - _offsets = list(offsets) - - if not _offsets: - return Lines([self.copy()]) - - text = self.plain - text_length = len(text) - divide_offsets = [0, *_offsets, text_length] - line_ranges = list(zip(divide_offsets, divide_offsets[1:])) - - style = self.style - justify = self.justify - overflow = self.overflow - _Text = Text - new_lines = Lines( - _Text( - text[start:end], - style=style, - justify=justify, - overflow=overflow, - ) - for start, end in line_ranges - ) - if not self._spans: - return new_lines - - _line_appends = [line._spans.append for line in new_lines._lines] - line_count = len(line_ranges) - _Span = Span - - for span_start, span_end, style in self._spans: - - lower_bound = 0 - upper_bound = line_count - start_line_no = (lower_bound + upper_bound) // 2 - - while True: - line_start, line_end = line_ranges[start_line_no] - if span_start < line_start: - upper_bound = start_line_no - 1 - elif span_start > line_end: - lower_bound = start_line_no + 1 - else: - break - start_line_no = (lower_bound + upper_bound) // 2 - - if span_end < line_end: - end_line_no = start_line_no - else: - end_line_no = lower_bound = start_line_no - upper_bound = line_count - - while True: - line_start, line_end = line_ranges[end_line_no] - if span_end < line_start: - upper_bound = end_line_no - 1 - elif span_end > line_end: - lower_bound = end_line_no + 1 - else: - break - end_line_no = (lower_bound + upper_bound) // 2 - - for line_no in range(start_line_no, end_line_no + 1): - line_start, line_end = line_ranges[line_no] - new_start = max(0, span_start - line_start) - new_end = min(span_end - line_start, line_end - line_start) - if new_end > new_start: - _line_appends[line_no](_Span(new_start, new_end, style)) - - return new_lines - - def right_crop(self, amount: int = 1) -> None: - """Remove a number of characters from the end of the text.""" - max_offset = len(self.plain) - amount - _Span = Span - self._spans[:] = [ - ( - span - if span.end < max_offset - else _Span(span.start, min(max_offset, span.end), span.style) - ) - for span in self._spans - if span.start < max_offset - ] - self._text = [self.plain[:-amount]] - self._length -= amount - - def wrap( - self, - console: "Console", - width: int, - *, - justify: Optional["JustifyMethod"] = None, - overflow: Optional["OverflowMethod"] = None, - tab_size: int = 8, - no_wrap: Optional[bool] = None, - ) -> Lines: - """Word wrap the text. - - Args: - console (Console): Console instance. - width (int): Number of characters per line. - emoji (bool, optional): Also render emoji code. Defaults to True. - justify (str, optional): Justify method: "default", "left", "center", "full", "right". Defaults to "default". - overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to None. - tab_size (int, optional): Default tab size. Defaults to 8. - no_wrap (bool, optional): Disable wrapping, Defaults to False. - - Returns: - Lines: Number of lines. - """ - wrap_justify = justify or self.justify or DEFAULT_JUSTIFY - wrap_overflow = overflow or self.overflow or DEFAULT_OVERFLOW - - no_wrap = pick_bool(no_wrap, self.no_wrap, False) or overflow == "ignore" - - lines = Lines() - for line in self.split(allow_blank=True): - if "\t" in line: - line.expand_tabs(tab_size) - if no_wrap: - new_lines = Lines([line]) - else: - offsets = divide_line(str(line), width, fold=wrap_overflow == "fold") - new_lines = line.divide(offsets) - for line in new_lines: - line.rstrip_end(width) - if wrap_justify: - new_lines.justify( - console, width, justify=wrap_justify, overflow=wrap_overflow - ) - for line in new_lines: - line.truncate(width, overflow=wrap_overflow) - lines.extend(new_lines) - return lines - - def fit(self, width: int) -> Lines: - """Fit the text in to given width by chopping in to lines. - - Args: - width (int): Maximum characters in a line. - - Returns: - Lines: Lines container. - """ - lines: Lines = Lines() - append = lines.append - for line in self.split(): - line.set_length(width) - append(line) - return lines - - def detect_indentation(self) -> int: - """Auto-detect indentation of code. - - Returns: - int: Number of spaces used to indent code. - """ - - _indentations = { - len(match.group(1)) - for match in re.finditer(r"^( *)(.*)$", self.plain, flags=re.MULTILINE) - } - - try: - indentation = ( - reduce(gcd, [indent for indent in _indentations if not indent % 2]) or 1 - ) - except TypeError: - indentation = 1 - - return indentation - - def with_indent_guides( - self, - indent_size: Optional[int] = None, - *, - character: str = "│", - style: StyleType = "dim green", - ) -> "Text": - """Adds indent guide lines to text. - - Args: - indent_size (Optional[int]): Size of indentation, or None to auto detect. Defaults to None. - character (str, optional): Character to use for indentation. Defaults to "│". - style (Union[Style, str], optional): Style of indent guides. - - Returns: - Text: New text with indentation guides. - """ - - _indent_size = self.detect_indentation() if indent_size is None else indent_size - - text = self.copy() - text.expand_tabs() - indent_line = f"{character}{' ' * (_indent_size - 1)}" - - re_indent = re.compile(r"^( *)(.*)$") - new_lines: List[Text] = [] - add_line = new_lines.append - blank_lines = 0 - for line in text.split(allow_blank=True): - match = re_indent.match(line.plain) - if not match or not match.group(2): - blank_lines += 1 - continue - indent = match.group(1) - full_indents, remaining_space = divmod(len(indent), _indent_size) - new_indent = f"{indent_line * full_indents}{' ' * remaining_space}" - line.plain = new_indent + line.plain[len(new_indent) :] - line.stylize(style, 0, len(new_indent)) - if blank_lines: - new_lines.extend([Text(new_indent, style=style)] * blank_lines) - blank_lines = 0 - add_line(line) - if blank_lines: - new_lines.extend([Text("", style=style)] * blank_lines) - - new_text = text.blank_copy("\n").join(new_lines) - return new_text - - -if __name__ == "__main__": # pragma: no cover - from pip._vendor.rich.console import Console - - text = Text( - """\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n""" - ) - text.highlight_words(["Lorem"], "bold") - text.highlight_words(["ipsum"], "italic") - - console = Console() - - console.rule("justify='left'") - console.print(text, style="red") - console.print() - - console.rule("justify='center'") - console.print(text, style="green", justify="center") - console.print() - - console.rule("justify='right'") - console.print(text, style="blue", justify="right") - console.print() - - console.rule("justify='full'") - console.print(text, style="magenta", justify="full") - console.print() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/theme.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/theme.py deleted file mode 100644 index 471dfb2..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/theme.py +++ /dev/null @@ -1,115 +0,0 @@ -import configparser -from typing import Dict, List, IO, Mapping, Optional - -from .default_styles import DEFAULT_STYLES -from .style import Style, StyleType - - -class Theme: - """A container for style information, used by :class:`~rich.console.Console`. - - Args: - styles (Dict[str, Style], optional): A mapping of style names on to styles. Defaults to None for a theme with no styles. - inherit (bool, optional): Inherit default styles. Defaults to True. - """ - - styles: Dict[str, Style] - - def __init__( - self, styles: Optional[Mapping[str, StyleType]] = None, inherit: bool = True - ): - self.styles = DEFAULT_STYLES.copy() if inherit else {} - if styles is not None: - self.styles.update( - { - name: style if isinstance(style, Style) else Style.parse(style) - for name, style in styles.items() - } - ) - - @property - def config(self) -> str: - """Get contents of a config file for this theme.""" - config = "[styles]\n" + "\n".join( - f"{name} = {style}" for name, style in sorted(self.styles.items()) - ) - return config - - @classmethod - def from_file( - cls, config_file: IO[str], source: Optional[str] = None, inherit: bool = True - ) -> "Theme": - """Load a theme from a text mode file. - - Args: - config_file (IO[str]): An open conf file. - source (str, optional): The filename of the open file. Defaults to None. - inherit (bool, optional): Inherit default styles. Defaults to True. - - Returns: - Theme: A New theme instance. - """ - config = configparser.ConfigParser() - config.read_file(config_file, source=source) - styles = {name: Style.parse(value) for name, value in config.items("styles")} - theme = Theme(styles, inherit=inherit) - return theme - - @classmethod - def read( - cls, path: str, inherit: bool = True, encoding: Optional[str] = None - ) -> "Theme": - """Read a theme from a path. - - Args: - path (str): Path to a config file readable by Python configparser module. - inherit (bool, optional): Inherit default styles. Defaults to True. - encoding (str, optional): Encoding of the config file. Defaults to None. - - Returns: - Theme: A new theme instance. - """ - with open(path, "rt", encoding=encoding) as config_file: - return cls.from_file(config_file, source=path, inherit=inherit) - - -class ThemeStackError(Exception): - """Base exception for errors related to the theme stack.""" - - -class ThemeStack: - """A stack of themes. - - Args: - theme (Theme): A theme instance - """ - - def __init__(self, theme: Theme) -> None: - self._entries: List[Dict[str, Style]] = [theme.styles] - self.get = self._entries[-1].get - - def push_theme(self, theme: Theme, inherit: bool = True) -> None: - """Push a theme on the top of the stack. - - Args: - theme (Theme): A Theme instance. - inherit (boolean, optional): Inherit styles from current top of stack. - """ - styles: Dict[str, Style] - styles = ( - {**self._entries[-1], **theme.styles} if inherit else theme.styles.copy() - ) - self._entries.append(styles) - self.get = self._entries[-1].get - - def pop_theme(self) -> None: - """Pop (and discard) the top-most theme.""" - if len(self._entries) == 1: - raise ThemeStackError("Unable to pop base theme") - self._entries.pop() - self.get = self._entries[-1].get - - -if __name__ == "__main__": # pragma: no cover - theme = Theme() - print(theme.config) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/themes.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/themes.py deleted file mode 100644 index bf6db10..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/themes.py +++ /dev/null @@ -1,5 +0,0 @@ -from .default_styles import DEFAULT_STYLES -from .theme import Theme - - -DEFAULT = Theme(DEFAULT_STYLES) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/traceback.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/traceback.py deleted file mode 100644 index c4ffe1f..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/traceback.py +++ /dev/null @@ -1,756 +0,0 @@ -from __future__ import absolute_import - -import linecache -import os -import platform -import sys -from dataclasses import dataclass, field -from traceback import walk_tb -from types import ModuleType, TracebackType -from typing import ( - Any, - Callable, - Dict, - Iterable, - List, - Optional, - Sequence, - Tuple, - Type, - Union, -) - -from pip._vendor.pygments.lexers import guess_lexer_for_filename -from pip._vendor.pygments.token import Comment, Keyword, Name, Number, Operator, String -from pip._vendor.pygments.token import Text as TextToken -from pip._vendor.pygments.token import Token -from pip._vendor.pygments.util import ClassNotFound - -from . import pretty -from ._loop import loop_last -from .columns import Columns -from .console import Console, ConsoleOptions, ConsoleRenderable, RenderResult, group -from .constrain import Constrain -from .highlighter import RegexHighlighter, ReprHighlighter -from .panel import Panel -from .scope import render_scope -from .style import Style -from .syntax import Syntax -from .text import Text -from .theme import Theme - -WINDOWS = platform.system() == "Windows" - -LOCALS_MAX_LENGTH = 10 -LOCALS_MAX_STRING = 80 - - -def install( - *, - console: Optional[Console] = None, - width: Optional[int] = 100, - extra_lines: int = 3, - theme: Optional[str] = None, - word_wrap: bool = False, - show_locals: bool = False, - locals_max_length: int = LOCALS_MAX_LENGTH, - locals_max_string: int = LOCALS_MAX_STRING, - locals_hide_dunder: bool = True, - locals_hide_sunder: Optional[bool] = None, - indent_guides: bool = True, - suppress: Iterable[Union[str, ModuleType]] = (), - max_frames: int = 100, -) -> Callable[[Type[BaseException], BaseException, Optional[TracebackType]], Any]: - """Install a rich traceback handler. - - Once installed, any tracebacks will be printed with syntax highlighting and rich formatting. - - - Args: - console (Optional[Console], optional): Console to write exception to. Default uses internal Console instance. - width (Optional[int], optional): Width (in characters) of traceback. Defaults to 100. - extra_lines (int, optional): Extra lines of code. Defaults to 3. - theme (Optional[str], optional): Pygments theme to use in traceback. Defaults to ``None`` which will pick - a theme appropriate for the platform. - word_wrap (bool, optional): Enable word wrapping of long lines. Defaults to False. - show_locals (bool, optional): Enable display of local variables. Defaults to False. - locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. - Defaults to 10. - locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80. - locals_hide_dunder (bool, optional): Hide locals prefixed with double underscore. Defaults to True. - locals_hide_sunder (bool, optional): Hide locals prefixed with single underscore. Defaults to False. - indent_guides (bool, optional): Enable indent guides in code and locals. Defaults to True. - suppress (Sequence[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback. - - Returns: - Callable: The previous exception handler that was replaced. - - """ - traceback_console = Console(stderr=True) if console is None else console - - locals_hide_sunder = ( - True - if (traceback_console.is_jupyter and locals_hide_sunder is None) - else locals_hide_sunder - ) - - def excepthook( - type_: Type[BaseException], - value: BaseException, - traceback: Optional[TracebackType], - ) -> None: - traceback_console.print( - Traceback.from_exception( - type_, - value, - traceback, - width=width, - extra_lines=extra_lines, - theme=theme, - word_wrap=word_wrap, - show_locals=show_locals, - locals_max_length=locals_max_length, - locals_max_string=locals_max_string, - locals_hide_dunder=locals_hide_dunder, - locals_hide_sunder=bool(locals_hide_sunder), - indent_guides=indent_guides, - suppress=suppress, - max_frames=max_frames, - ) - ) - - def ipy_excepthook_closure(ip: Any) -> None: # pragma: no cover - tb_data = {} # store information about showtraceback call - default_showtraceback = ip.showtraceback # keep reference of default traceback - - def ipy_show_traceback(*args: Any, **kwargs: Any) -> None: - """wrap the default ip.showtraceback to store info for ip._showtraceback""" - nonlocal tb_data - tb_data = kwargs - default_showtraceback(*args, **kwargs) - - def ipy_display_traceback( - *args: Any, is_syntax: bool = False, **kwargs: Any - ) -> None: - """Internally called traceback from ip._showtraceback""" - nonlocal tb_data - exc_tuple = ip._get_exc_info() - - # do not display trace on syntax error - tb: Optional[TracebackType] = None if is_syntax else exc_tuple[2] - - # determine correct tb_offset - compiled = tb_data.get("running_compiled_code", False) - tb_offset = tb_data.get("tb_offset", 1 if compiled else 0) - # remove ipython internal frames from trace with tb_offset - for _ in range(tb_offset): - if tb is None: - break - tb = tb.tb_next - - excepthook(exc_tuple[0], exc_tuple[1], tb) - tb_data = {} # clear data upon usage - - # replace _showtraceback instead of showtraceback to allow ipython features such as debugging to work - # this is also what the ipython docs recommends to modify when subclassing InteractiveShell - ip._showtraceback = ipy_display_traceback - # add wrapper to capture tb_data - ip.showtraceback = ipy_show_traceback - ip.showsyntaxerror = lambda *args, **kwargs: ipy_display_traceback( - *args, is_syntax=True, **kwargs - ) - - try: # pragma: no cover - # if within ipython, use customized traceback - ip = get_ipython() # type: ignore[name-defined] - ipy_excepthook_closure(ip) - return sys.excepthook - except Exception: - # otherwise use default system hook - old_excepthook = sys.excepthook - sys.excepthook = excepthook - return old_excepthook - - -@dataclass -class Frame: - filename: str - lineno: int - name: str - line: str = "" - locals: Optional[Dict[str, pretty.Node]] = None - - -@dataclass -class _SyntaxError: - offset: int - filename: str - line: str - lineno: int - msg: str - - -@dataclass -class Stack: - exc_type: str - exc_value: str - syntax_error: Optional[_SyntaxError] = None - is_cause: bool = False - frames: List[Frame] = field(default_factory=list) - - -@dataclass -class Trace: - stacks: List[Stack] - - -class PathHighlighter(RegexHighlighter): - highlights = [r"(?P<dim>.*/)(?P<bold>.+)"] - - -class Traceback: - """A Console renderable that renders a traceback. - - Args: - trace (Trace, optional): A `Trace` object produced from `extract`. Defaults to None, which uses - the last exception. - width (Optional[int], optional): Number of characters used to traceback. Defaults to 100. - extra_lines (int, optional): Additional lines of code to render. Defaults to 3. - theme (str, optional): Override pygments theme used in traceback. - word_wrap (bool, optional): Enable word wrapping of long lines. Defaults to False. - show_locals (bool, optional): Enable display of local variables. Defaults to False. - indent_guides (bool, optional): Enable indent guides in code and locals. Defaults to True. - locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. - Defaults to 10. - locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80. - locals_hide_dunder (bool, optional): Hide locals prefixed with double underscore. Defaults to True. - locals_hide_sunder (bool, optional): Hide locals prefixed with single underscore. Defaults to False. - suppress (Sequence[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback. - max_frames (int): Maximum number of frames to show in a traceback, 0 for no maximum. Defaults to 100. - - """ - - LEXERS = { - "": "text", - ".py": "python", - ".pxd": "cython", - ".pyx": "cython", - ".pxi": "pyrex", - } - - def __init__( - self, - trace: Optional[Trace] = None, - *, - width: Optional[int] = 100, - extra_lines: int = 3, - theme: Optional[str] = None, - word_wrap: bool = False, - show_locals: bool = False, - locals_max_length: int = LOCALS_MAX_LENGTH, - locals_max_string: int = LOCALS_MAX_STRING, - locals_hide_dunder: bool = True, - locals_hide_sunder: bool = False, - indent_guides: bool = True, - suppress: Iterable[Union[str, ModuleType]] = (), - max_frames: int = 100, - ): - if trace is None: - exc_type, exc_value, traceback = sys.exc_info() - if exc_type is None or exc_value is None or traceback is None: - raise ValueError( - "Value for 'trace' required if not called in except: block" - ) - trace = self.extract( - exc_type, exc_value, traceback, show_locals=show_locals - ) - self.trace = trace - self.width = width - self.extra_lines = extra_lines - self.theme = Syntax.get_theme(theme or "ansi_dark") - self.word_wrap = word_wrap - self.show_locals = show_locals - self.indent_guides = indent_guides - self.locals_max_length = locals_max_length - self.locals_max_string = locals_max_string - self.locals_hide_dunder = locals_hide_dunder - self.locals_hide_sunder = locals_hide_sunder - - self.suppress: Sequence[str] = [] - for suppress_entity in suppress: - if not isinstance(suppress_entity, str): - assert ( - suppress_entity.__file__ is not None - ), f"{suppress_entity!r} must be a module with '__file__' attribute" - path = os.path.dirname(suppress_entity.__file__) - else: - path = suppress_entity - path = os.path.normpath(os.path.abspath(path)) - self.suppress.append(path) - self.max_frames = max(4, max_frames) if max_frames > 0 else 0 - - @classmethod - def from_exception( - cls, - exc_type: Type[Any], - exc_value: BaseException, - traceback: Optional[TracebackType], - *, - width: Optional[int] = 100, - extra_lines: int = 3, - theme: Optional[str] = None, - word_wrap: bool = False, - show_locals: bool = False, - locals_max_length: int = LOCALS_MAX_LENGTH, - locals_max_string: int = LOCALS_MAX_STRING, - locals_hide_dunder: bool = True, - locals_hide_sunder: bool = False, - indent_guides: bool = True, - suppress: Iterable[Union[str, ModuleType]] = (), - max_frames: int = 100, - ) -> "Traceback": - """Create a traceback from exception info - - Args: - exc_type (Type[BaseException]): Exception type. - exc_value (BaseException): Exception value. - traceback (TracebackType): Python Traceback object. - width (Optional[int], optional): Number of characters used to traceback. Defaults to 100. - extra_lines (int, optional): Additional lines of code to render. Defaults to 3. - theme (str, optional): Override pygments theme used in traceback. - word_wrap (bool, optional): Enable word wrapping of long lines. Defaults to False. - show_locals (bool, optional): Enable display of local variables. Defaults to False. - indent_guides (bool, optional): Enable indent guides in code and locals. Defaults to True. - locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. - Defaults to 10. - locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80. - locals_hide_dunder (bool, optional): Hide locals prefixed with double underscore. Defaults to True. - locals_hide_sunder (bool, optional): Hide locals prefixed with single underscore. Defaults to False. - suppress (Iterable[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback. - max_frames (int): Maximum number of frames to show in a traceback, 0 for no maximum. Defaults to 100. - - Returns: - Traceback: A Traceback instance that may be printed. - """ - rich_traceback = cls.extract( - exc_type, - exc_value, - traceback, - show_locals=show_locals, - locals_max_length=locals_max_length, - locals_max_string=locals_max_string, - locals_hide_dunder=locals_hide_dunder, - locals_hide_sunder=locals_hide_sunder, - ) - - return cls( - rich_traceback, - width=width, - extra_lines=extra_lines, - theme=theme, - word_wrap=word_wrap, - show_locals=show_locals, - indent_guides=indent_guides, - locals_max_length=locals_max_length, - locals_max_string=locals_max_string, - locals_hide_dunder=locals_hide_dunder, - locals_hide_sunder=locals_hide_sunder, - suppress=suppress, - max_frames=max_frames, - ) - - @classmethod - def extract( - cls, - exc_type: Type[BaseException], - exc_value: BaseException, - traceback: Optional[TracebackType], - *, - show_locals: bool = False, - locals_max_length: int = LOCALS_MAX_LENGTH, - locals_max_string: int = LOCALS_MAX_STRING, - locals_hide_dunder: bool = True, - locals_hide_sunder: bool = False, - ) -> Trace: - """Extract traceback information. - - Args: - exc_type (Type[BaseException]): Exception type. - exc_value (BaseException): Exception value. - traceback (TracebackType): Python Traceback object. - show_locals (bool, optional): Enable display of local variables. Defaults to False. - locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. - Defaults to 10. - locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80. - locals_hide_dunder (bool, optional): Hide locals prefixed with double underscore. Defaults to True. - locals_hide_sunder (bool, optional): Hide locals prefixed with single underscore. Defaults to False. - - Returns: - Trace: A Trace instance which you can use to construct a `Traceback`. - """ - - stacks: List[Stack] = [] - is_cause = False - - from pip._vendor.rich import _IMPORT_CWD - - def safe_str(_object: Any) -> str: - """Don't allow exceptions from __str__ to propagate.""" - try: - return str(_object) - except Exception: - return "<exception str() failed>" - - while True: - stack = Stack( - exc_type=safe_str(exc_type.__name__), - exc_value=safe_str(exc_value), - is_cause=is_cause, - ) - - if isinstance(exc_value, SyntaxError): - stack.syntax_error = _SyntaxError( - offset=exc_value.offset or 0, - filename=exc_value.filename or "?", - lineno=exc_value.lineno or 0, - line=exc_value.text or "", - msg=exc_value.msg, - ) - - stacks.append(stack) - append = stack.frames.append - - def get_locals( - iter_locals: Iterable[Tuple[str, object]] - ) -> Iterable[Tuple[str, object]]: - """Extract locals from an iterator of key pairs.""" - if not (locals_hide_dunder or locals_hide_sunder): - yield from iter_locals - return - for key, value in iter_locals: - if locals_hide_dunder and key.startswith("__"): - continue - if locals_hide_sunder and key.startswith("_"): - continue - yield key, value - - for frame_summary, line_no in walk_tb(traceback): - filename = frame_summary.f_code.co_filename - if filename and not filename.startswith("<"): - if not os.path.isabs(filename): - filename = os.path.join(_IMPORT_CWD, filename) - if frame_summary.f_locals.get("_rich_traceback_omit", False): - continue - - frame = Frame( - filename=filename or "?", - lineno=line_no, - name=frame_summary.f_code.co_name, - locals={ - key: pretty.traverse( - value, - max_length=locals_max_length, - max_string=locals_max_string, - ) - for key, value in get_locals(frame_summary.f_locals.items()) - } - if show_locals - else None, - ) - append(frame) - if frame_summary.f_locals.get("_rich_traceback_guard", False): - del stack.frames[:] - - cause = getattr(exc_value, "__cause__", None) - if cause: - exc_type = cause.__class__ - exc_value = cause - # __traceback__ can be None, e.g. for exceptions raised by the - # 'multiprocessing' module - traceback = cause.__traceback__ - is_cause = True - continue - - cause = exc_value.__context__ - if cause and not getattr(exc_value, "__suppress_context__", False): - exc_type = cause.__class__ - exc_value = cause - traceback = cause.__traceback__ - is_cause = False - continue - # No cover, code is reached but coverage doesn't recognize it. - break # pragma: no cover - - trace = Trace(stacks=stacks) - return trace - - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - theme = self.theme - background_style = theme.get_background_style() - token_style = theme.get_style_for_token - - traceback_theme = Theme( - { - "pretty": token_style(TextToken), - "pygments.text": token_style(Token), - "pygments.string": token_style(String), - "pygments.function": token_style(Name.Function), - "pygments.number": token_style(Number), - "repr.indent": token_style(Comment) + Style(dim=True), - "repr.str": token_style(String), - "repr.brace": token_style(TextToken) + Style(bold=True), - "repr.number": token_style(Number), - "repr.bool_true": token_style(Keyword.Constant), - "repr.bool_false": token_style(Keyword.Constant), - "repr.none": token_style(Keyword.Constant), - "scope.border": token_style(String.Delimiter), - "scope.equals": token_style(Operator), - "scope.key": token_style(Name), - "scope.key.special": token_style(Name.Constant) + Style(dim=True), - }, - inherit=False, - ) - - highlighter = ReprHighlighter() - for last, stack in loop_last(reversed(self.trace.stacks)): - if stack.frames: - stack_renderable: ConsoleRenderable = Panel( - self._render_stack(stack), - title="[traceback.title]Traceback [dim](most recent call last)", - style=background_style, - border_style="traceback.border", - expand=True, - padding=(0, 1), - ) - stack_renderable = Constrain(stack_renderable, self.width) - with console.use_theme(traceback_theme): - yield stack_renderable - if stack.syntax_error is not None: - with console.use_theme(traceback_theme): - yield Constrain( - Panel( - self._render_syntax_error(stack.syntax_error), - style=background_style, - border_style="traceback.border.syntax_error", - expand=True, - padding=(0, 1), - width=self.width, - ), - self.width, - ) - yield Text.assemble( - (f"{stack.exc_type}: ", "traceback.exc_type"), - highlighter(stack.syntax_error.msg), - ) - elif stack.exc_value: - yield Text.assemble( - (f"{stack.exc_type}: ", "traceback.exc_type"), - highlighter(stack.exc_value), - ) - else: - yield Text.assemble((f"{stack.exc_type}", "traceback.exc_type")) - - if not last: - if stack.is_cause: - yield Text.from_markup( - "\n[i]The above exception was the direct cause of the following exception:\n", - ) - else: - yield Text.from_markup( - "\n[i]During handling of the above exception, another exception occurred:\n", - ) - - @group() - def _render_syntax_error(self, syntax_error: _SyntaxError) -> RenderResult: - highlighter = ReprHighlighter() - path_highlighter = PathHighlighter() - if syntax_error.filename != "<stdin>": - if os.path.exists(syntax_error.filename): - text = Text.assemble( - (f" {syntax_error.filename}", "pygments.string"), - (":", "pygments.text"), - (str(syntax_error.lineno), "pygments.number"), - style="pygments.text", - ) - yield path_highlighter(text) - syntax_error_text = highlighter(syntax_error.line.rstrip()) - syntax_error_text.no_wrap = True - offset = min(syntax_error.offset - 1, len(syntax_error_text)) - syntax_error_text.stylize("bold underline", offset, offset) - syntax_error_text += Text.from_markup( - "\n" + " " * offset + "[traceback.offset]▲[/]", - style="pygments.text", - ) - yield syntax_error_text - - @classmethod - def _guess_lexer(cls, filename: str, code: str) -> str: - ext = os.path.splitext(filename)[-1] - if not ext: - # No extension, look at first line to see if it is a hashbang - # Note, this is an educated guess and not a guarantee - # If it fails, the only downside is that the code is highlighted strangely - new_line_index = code.index("\n") - first_line = code[:new_line_index] if new_line_index != -1 else code - if first_line.startswith("#!") and "python" in first_line.lower(): - return "python" - try: - return cls.LEXERS.get(ext) or guess_lexer_for_filename(filename, code).name - except ClassNotFound: - return "text" - - @group() - def _render_stack(self, stack: Stack) -> RenderResult: - path_highlighter = PathHighlighter() - theme = self.theme - - def read_code(filename: str) -> str: - """Read files, and cache results on filename. - - Args: - filename (str): Filename to read - - Returns: - str: Contents of file - """ - return "".join(linecache.getlines(filename)) - - def render_locals(frame: Frame) -> Iterable[ConsoleRenderable]: - if frame.locals: - yield render_scope( - frame.locals, - title="locals", - indent_guides=self.indent_guides, - max_length=self.locals_max_length, - max_string=self.locals_max_string, - ) - - exclude_frames: Optional[range] = None - if self.max_frames != 0: - exclude_frames = range( - self.max_frames // 2, - len(stack.frames) - self.max_frames // 2, - ) - - excluded = False - for frame_index, frame in enumerate(stack.frames): - - if exclude_frames and frame_index in exclude_frames: - excluded = True - continue - - if excluded: - assert exclude_frames is not None - yield Text( - f"\n... {len(exclude_frames)} frames hidden ...", - justify="center", - style="traceback.error", - ) - excluded = False - - first = frame_index == 0 - frame_filename = frame.filename - suppressed = any(frame_filename.startswith(path) for path in self.suppress) - - if os.path.exists(frame.filename): - text = Text.assemble( - path_highlighter(Text(frame.filename, style="pygments.string")), - (":", "pygments.text"), - (str(frame.lineno), "pygments.number"), - " in ", - (frame.name, "pygments.function"), - style="pygments.text", - ) - else: - text = Text.assemble( - "in ", - (frame.name, "pygments.function"), - (":", "pygments.text"), - (str(frame.lineno), "pygments.number"), - style="pygments.text", - ) - if not frame.filename.startswith("<") and not first: - yield "" - yield text - if frame.filename.startswith("<"): - yield from render_locals(frame) - continue - if not suppressed: - try: - code = read_code(frame.filename) - if not code: - # code may be an empty string if the file doesn't exist, OR - # if the traceback filename is generated dynamically - continue - lexer_name = self._guess_lexer(frame.filename, code) - syntax = Syntax( - code, - lexer_name, - theme=theme, - line_numbers=True, - line_range=( - frame.lineno - self.extra_lines, - frame.lineno + self.extra_lines, - ), - highlight_lines={frame.lineno}, - word_wrap=self.word_wrap, - code_width=88, - indent_guides=self.indent_guides, - dedent=False, - ) - yield "" - except Exception as error: - yield Text.assemble( - (f"\n{error}", "traceback.error"), - ) - else: - yield ( - Columns( - [ - syntax, - *render_locals(frame), - ], - padding=1, - ) - if frame.locals - else syntax - ) - - -if __name__ == "__main__": # pragma: no cover - - from .console import Console - - console = Console() - import sys - - def bar(a: Any) -> None: # 这是对亚洲语言支持的测试。面对模棱两可的想法,拒绝猜测的诱惑 - one = 1 - print(one / a) - - def foo(a: Any) -> None: - _rich_traceback_guard = True - zed = { - "characters": { - "Paul Atreides", - "Vladimir Harkonnen", - "Thufir Hawat", - "Duncan Idaho", - }, - "atomic_types": (None, False, True), - } - bar(a) - - def error() -> None: - - try: - try: - foo(0) - except: - slfkjsldkfj # type: ignore[name-defined] - except: - console.print_exception(show_locals=True) - - error() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/rich/tree.py b/venv/lib/python3.12/site-packages/pip/_vendor/rich/tree.py deleted file mode 100644 index afe8da1..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/rich/tree.py +++ /dev/null @@ -1,251 +0,0 @@ -from typing import Iterator, List, Optional, Tuple - -from ._loop import loop_first, loop_last -from .console import Console, ConsoleOptions, RenderableType, RenderResult -from .jupyter import JupyterMixin -from .measure import Measurement -from .segment import Segment -from .style import Style, StyleStack, StyleType -from .styled import Styled - - -class Tree(JupyterMixin): - """A renderable for a tree structure. - - Args: - label (RenderableType): The renderable or str for the tree label. - style (StyleType, optional): Style of this tree. Defaults to "tree". - guide_style (StyleType, optional): Style of the guide lines. Defaults to "tree.line". - expanded (bool, optional): Also display children. Defaults to True. - highlight (bool, optional): Highlight renderable (if str). Defaults to False. - """ - - def __init__( - self, - label: RenderableType, - *, - style: StyleType = "tree", - guide_style: StyleType = "tree.line", - expanded: bool = True, - highlight: bool = False, - hide_root: bool = False, - ) -> None: - self.label = label - self.style = style - self.guide_style = guide_style - self.children: List[Tree] = [] - self.expanded = expanded - self.highlight = highlight - self.hide_root = hide_root - - def add( - self, - label: RenderableType, - *, - style: Optional[StyleType] = None, - guide_style: Optional[StyleType] = None, - expanded: bool = True, - highlight: Optional[bool] = False, - ) -> "Tree": - """Add a child tree. - - Args: - label (RenderableType): The renderable or str for the tree label. - style (StyleType, optional): Style of this tree. Defaults to "tree". - guide_style (StyleType, optional): Style of the guide lines. Defaults to "tree.line". - expanded (bool, optional): Also display children. Defaults to True. - highlight (Optional[bool], optional): Highlight renderable (if str). Defaults to False. - - Returns: - Tree: A new child Tree, which may be further modified. - """ - node = Tree( - label, - style=self.style if style is None else style, - guide_style=self.guide_style if guide_style is None else guide_style, - expanded=expanded, - highlight=self.highlight if highlight is None else highlight, - ) - self.children.append(node) - return node - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - - stack: List[Iterator[Tuple[bool, Tree]]] = [] - pop = stack.pop - push = stack.append - new_line = Segment.line() - - get_style = console.get_style - null_style = Style.null() - guide_style = get_style(self.guide_style, default="") or null_style - SPACE, CONTINUE, FORK, END = range(4) - - ASCII_GUIDES = (" ", "| ", "+-- ", "`-- ") - TREE_GUIDES = [ - (" ", "│ ", "├── ", "└── "), - (" ", "┃ ", "┣━━ ", "┗━━ "), - (" ", "║ ", "╠══ ", "╚══ "), - ] - _Segment = Segment - - def make_guide(index: int, style: Style) -> Segment: - """Make a Segment for a level of the guide lines.""" - if options.ascii_only: - line = ASCII_GUIDES[index] - else: - guide = 1 if style.bold else (2 if style.underline2 else 0) - line = TREE_GUIDES[0 if options.legacy_windows else guide][index] - return _Segment(line, style) - - levels: List[Segment] = [make_guide(CONTINUE, guide_style)] - push(iter(loop_last([self]))) - - guide_style_stack = StyleStack(get_style(self.guide_style)) - style_stack = StyleStack(get_style(self.style)) - remove_guide_styles = Style(bold=False, underline2=False) - - depth = 0 - - while stack: - stack_node = pop() - try: - last, node = next(stack_node) - except StopIteration: - levels.pop() - if levels: - guide_style = levels[-1].style or null_style - levels[-1] = make_guide(FORK, guide_style) - guide_style_stack.pop() - style_stack.pop() - continue - push(stack_node) - if last: - levels[-1] = make_guide(END, levels[-1].style or null_style) - - guide_style = guide_style_stack.current + get_style(node.guide_style) - style = style_stack.current + get_style(node.style) - prefix = levels[(2 if self.hide_root else 1) :] - renderable_lines = console.render_lines( - Styled(node.label, style), - options.update( - width=options.max_width - - sum(level.cell_length for level in prefix), - highlight=self.highlight, - height=None, - ), - pad=options.justify is not None, - ) - - if not (depth == 0 and self.hide_root): - for first, line in loop_first(renderable_lines): - if prefix: - yield from _Segment.apply_style( - prefix, - style.background_style, - post_style=remove_guide_styles, - ) - yield from line - yield new_line - if first and prefix: - prefix[-1] = make_guide( - SPACE if last else CONTINUE, prefix[-1].style or null_style - ) - - if node.expanded and node.children: - levels[-1] = make_guide( - SPACE if last else CONTINUE, levels[-1].style or null_style - ) - levels.append( - make_guide(END if len(node.children) == 1 else FORK, guide_style) - ) - style_stack.push(get_style(node.style)) - guide_style_stack.push(get_style(node.guide_style)) - push(iter(loop_last(node.children))) - depth += 1 - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> "Measurement": - stack: List[Iterator[Tree]] = [iter([self])] - pop = stack.pop - push = stack.append - minimum = 0 - maximum = 0 - measure = Measurement.get - level = 0 - while stack: - iter_tree = pop() - try: - tree = next(iter_tree) - except StopIteration: - level -= 1 - continue - push(iter_tree) - min_measure, max_measure = measure(console, options, tree.label) - indent = level * 4 - minimum = max(min_measure + indent, minimum) - maximum = max(max_measure + indent, maximum) - if tree.expanded and tree.children: - push(iter(tree.children)) - level += 1 - return Measurement(minimum, maximum) - - -if __name__ == "__main__": # pragma: no cover - - from pip._vendor.rich.console import Group - from pip._vendor.rich.markdown import Markdown - from pip._vendor.rich.panel import Panel - from pip._vendor.rich.syntax import Syntax - from pip._vendor.rich.table import Table - - table = Table(row_styles=["", "dim"]) - - table.add_column("Released", style="cyan", no_wrap=True) - table.add_column("Title", style="magenta") - table.add_column("Box Office", justify="right", style="green") - - table.add_row("Dec 20, 2019", "Star Wars: The Rise of Skywalker", "$952,110,690") - table.add_row("May 25, 2018", "Solo: A Star Wars Story", "$393,151,347") - table.add_row("Dec 15, 2017", "Star Wars Ep. V111: The Last Jedi", "$1,332,539,889") - table.add_row("Dec 16, 2016", "Rogue One: A Star Wars Story", "$1,332,439,889") - - code = """\ -class Segment(NamedTuple): - text: str = "" - style: Optional[Style] = None - is_control: bool = False -""" - syntax = Syntax(code, "python", theme="monokai", line_numbers=True) - - markdown = Markdown( - """\ -### example.md -> Hello, World! -> -> Markdown _all_ the things -""" - ) - - root = Tree("🌲 [b green]Rich Tree", highlight=True, hide_root=True) - - node = root.add(":file_folder: Renderables", guide_style="red") - simple_node = node.add(":file_folder: [bold yellow]Atomic", guide_style="uu green") - simple_node.add(Group("📄 Syntax", syntax)) - simple_node.add(Group("📄 Markdown", Panel(markdown, border_style="green"))) - - containers_node = node.add( - ":file_folder: [bold magenta]Containers", guide_style="bold magenta" - ) - containers_node.expanded = True - panel = Panel.fit("Just a panel", border_style="red") - containers_node.add(Group("📄 Panels", panel)) - - containers_node.add(Group("📄 [b magenta]Table", table)) - - console = Console() - - console.print(root) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/six.py b/venv/lib/python3.12/site-packages/pip/_vendor/six.py deleted file mode 100644 index 4e15675..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/six.py +++ /dev/null @@ -1,998 +0,0 @@ -# Copyright (c) 2010-2020 Benjamin Peterson -# -# 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. - -"""Utilities for writing code that runs on Python 2 and 3""" - -from __future__ import absolute_import - -import functools -import itertools -import operator -import sys -import types - -__author__ = "Benjamin Peterson <benjamin@python.org>" -__version__ = "1.16.0" - - -# Useful for very coarse version differentiation. -PY2 = sys.version_info[0] == 2 -PY3 = sys.version_info[0] == 3 -PY34 = sys.version_info[0:2] >= (3, 4) - -if PY3: - string_types = str, - integer_types = int, - class_types = type, - text_type = str - binary_type = bytes - - MAXSIZE = sys.maxsize -else: - string_types = basestring, - integer_types = (int, long) - class_types = (type, types.ClassType) - text_type = unicode - binary_type = str - - if sys.platform.startswith("java"): - # Jython always uses 32 bits. - MAXSIZE = int((1 << 31) - 1) - else: - # It's possible to have sizeof(long) != sizeof(Py_ssize_t). - class X(object): - - def __len__(self): - return 1 << 31 - try: - len(X()) - except OverflowError: - # 32-bit - MAXSIZE = int((1 << 31) - 1) - else: - # 64-bit - MAXSIZE = int((1 << 63) - 1) - del X - -if PY34: - from importlib.util import spec_from_loader -else: - spec_from_loader = None - - -def _add_doc(func, doc): - """Add documentation to a function.""" - func.__doc__ = doc - - -def _import_module(name): - """Import module, returning the module after the last dot.""" - __import__(name) - return sys.modules[name] - - -class _LazyDescr(object): - - def __init__(self, name): - self.name = name - - def __get__(self, obj, tp): - result = self._resolve() - setattr(obj, self.name, result) # Invokes __set__. - try: - # This is a bit ugly, but it avoids running this again by - # removing this descriptor. - delattr(obj.__class__, self.name) - except AttributeError: - pass - return result - - -class MovedModule(_LazyDescr): - - def __init__(self, name, old, new=None): - super(MovedModule, self).__init__(name) - if PY3: - if new is None: - new = name - self.mod = new - else: - self.mod = old - - def _resolve(self): - return _import_module(self.mod) - - def __getattr__(self, attr): - _module = self._resolve() - value = getattr(_module, attr) - setattr(self, attr, value) - return value - - -class _LazyModule(types.ModuleType): - - def __init__(self, name): - super(_LazyModule, self).__init__(name) - self.__doc__ = self.__class__.__doc__ - - def __dir__(self): - attrs = ["__doc__", "__name__"] - attrs += [attr.name for attr in self._moved_attributes] - return attrs - - # Subclasses should override this - _moved_attributes = [] - - -class MovedAttribute(_LazyDescr): - - def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): - super(MovedAttribute, self).__init__(name) - if PY3: - if new_mod is None: - new_mod = name - self.mod = new_mod - if new_attr is None: - if old_attr is None: - new_attr = name - else: - new_attr = old_attr - self.attr = new_attr - else: - self.mod = old_mod - if old_attr is None: - old_attr = name - self.attr = old_attr - - def _resolve(self): - module = _import_module(self.mod) - return getattr(module, self.attr) - - -class _SixMetaPathImporter(object): - - """ - A meta path importer to import six.moves and its submodules. - - This class implements a PEP302 finder and loader. It should be compatible - with Python 2.5 and all existing versions of Python3 - """ - - def __init__(self, six_module_name): - self.name = six_module_name - self.known_modules = {} - - def _add_module(self, mod, *fullnames): - for fullname in fullnames: - self.known_modules[self.name + "." + fullname] = mod - - def _get_module(self, fullname): - return self.known_modules[self.name + "." + fullname] - - def find_module(self, fullname, path=None): - if fullname in self.known_modules: - return self - return None - - def find_spec(self, fullname, path, target=None): - if fullname in self.known_modules: - return spec_from_loader(fullname, self) - return None - - def __get_module(self, fullname): - try: - return self.known_modules[fullname] - except KeyError: - raise ImportError("This loader does not know module " + fullname) - - def load_module(self, fullname): - try: - # in case of a reload - return sys.modules[fullname] - except KeyError: - pass - mod = self.__get_module(fullname) - if isinstance(mod, MovedModule): - mod = mod._resolve() - else: - mod.__loader__ = self - sys.modules[fullname] = mod - return mod - - def is_package(self, fullname): - """ - Return true, if the named module is a package. - - We need this method to get correct spec objects with - Python 3.4 (see PEP451) - """ - return hasattr(self.__get_module(fullname), "__path__") - - def get_code(self, fullname): - """Return None - - Required, if is_package is implemented""" - self.__get_module(fullname) # eventually raises ImportError - return None - get_source = get_code # same as get_code - - def create_module(self, spec): - return self.load_module(spec.name) - - def exec_module(self, module): - pass - -_importer = _SixMetaPathImporter(__name__) - - -class _MovedItems(_LazyModule): - - """Lazy loading of moved objects""" - __path__ = [] # mark as package - - -_moved_attributes = [ - MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), - MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), - MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), - MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), - MovedAttribute("intern", "__builtin__", "sys"), - MovedAttribute("map", "itertools", "builtins", "imap", "map"), - MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), - MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), - MovedAttribute("getoutput", "commands", "subprocess"), - MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), - MovedAttribute("reduce", "__builtin__", "functools"), - MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), - MovedAttribute("StringIO", "StringIO", "io"), - MovedAttribute("UserDict", "UserDict", "collections"), - MovedAttribute("UserList", "UserList", "collections"), - MovedAttribute("UserString", "UserString", "collections"), - MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), - MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), - MovedModule("builtins", "__builtin__"), - MovedModule("configparser", "ConfigParser"), - MovedModule("collections_abc", "collections", "collections.abc" if sys.version_info >= (3, 3) else "collections"), - MovedModule("copyreg", "copy_reg"), - MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), - MovedModule("dbm_ndbm", "dbm", "dbm.ndbm"), - MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread" if sys.version_info < (3, 9) else "_thread"), - MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), - MovedModule("http_cookies", "Cookie", "http.cookies"), - MovedModule("html_entities", "htmlentitydefs", "html.entities"), - MovedModule("html_parser", "HTMLParser", "html.parser"), - MovedModule("http_client", "httplib", "http.client"), - MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), - MovedModule("email_mime_image", "email.MIMEImage", "email.mime.image"), - MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), - MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), - MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), - MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), - MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), - MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), - MovedModule("cPickle", "cPickle", "pickle"), - MovedModule("queue", "Queue"), - MovedModule("reprlib", "repr"), - MovedModule("socketserver", "SocketServer"), - MovedModule("_thread", "thread", "_thread"), - MovedModule("tkinter", "Tkinter"), - MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), - MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), - MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), - MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), - MovedModule("tkinter_tix", "Tix", "tkinter.tix"), - MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), - MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), - MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), - MovedModule("tkinter_colorchooser", "tkColorChooser", - "tkinter.colorchooser"), - MovedModule("tkinter_commondialog", "tkCommonDialog", - "tkinter.commondialog"), - MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), - MovedModule("tkinter_font", "tkFont", "tkinter.font"), - MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), - MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", - "tkinter.simpledialog"), - MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), - MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), - MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), - MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), - MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), - MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), -] -# Add windows specific modules. -if sys.platform == "win32": - _moved_attributes += [ - MovedModule("winreg", "_winreg"), - ] - -for attr in _moved_attributes: - setattr(_MovedItems, attr.name, attr) - if isinstance(attr, MovedModule): - _importer._add_module(attr, "moves." + attr.name) -del attr - -_MovedItems._moved_attributes = _moved_attributes - -moves = _MovedItems(__name__ + ".moves") -_importer._add_module(moves, "moves") - - -class Module_six_moves_urllib_parse(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_parse""" - - -_urllib_parse_moved_attributes = [ - MovedAttribute("ParseResult", "urlparse", "urllib.parse"), - MovedAttribute("SplitResult", "urlparse", "urllib.parse"), - MovedAttribute("parse_qs", "urlparse", "urllib.parse"), - MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), - MovedAttribute("urldefrag", "urlparse", "urllib.parse"), - MovedAttribute("urljoin", "urlparse", "urllib.parse"), - MovedAttribute("urlparse", "urlparse", "urllib.parse"), - MovedAttribute("urlsplit", "urlparse", "urllib.parse"), - MovedAttribute("urlunparse", "urlparse", "urllib.parse"), - MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), - MovedAttribute("quote", "urllib", "urllib.parse"), - MovedAttribute("quote_plus", "urllib", "urllib.parse"), - MovedAttribute("unquote", "urllib", "urllib.parse"), - MovedAttribute("unquote_plus", "urllib", "urllib.parse"), - MovedAttribute("unquote_to_bytes", "urllib", "urllib.parse", "unquote", "unquote_to_bytes"), - MovedAttribute("urlencode", "urllib", "urllib.parse"), - MovedAttribute("splitquery", "urllib", "urllib.parse"), - MovedAttribute("splittag", "urllib", "urllib.parse"), - MovedAttribute("splituser", "urllib", "urllib.parse"), - MovedAttribute("splitvalue", "urllib", "urllib.parse"), - MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), - MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), - MovedAttribute("uses_params", "urlparse", "urllib.parse"), - MovedAttribute("uses_query", "urlparse", "urllib.parse"), - MovedAttribute("uses_relative", "urlparse", "urllib.parse"), -] -for attr in _urllib_parse_moved_attributes: - setattr(Module_six_moves_urllib_parse, attr.name, attr) -del attr - -Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes - -_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), - "moves.urllib_parse", "moves.urllib.parse") - - -class Module_six_moves_urllib_error(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_error""" - - -_urllib_error_moved_attributes = [ - MovedAttribute("URLError", "urllib2", "urllib.error"), - MovedAttribute("HTTPError", "urllib2", "urllib.error"), - MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), -] -for attr in _urllib_error_moved_attributes: - setattr(Module_six_moves_urllib_error, attr.name, attr) -del attr - -Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes - -_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), - "moves.urllib_error", "moves.urllib.error") - - -class Module_six_moves_urllib_request(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_request""" - - -_urllib_request_moved_attributes = [ - MovedAttribute("urlopen", "urllib2", "urllib.request"), - MovedAttribute("install_opener", "urllib2", "urllib.request"), - MovedAttribute("build_opener", "urllib2", "urllib.request"), - MovedAttribute("pathname2url", "urllib", "urllib.request"), - MovedAttribute("url2pathname", "urllib", "urllib.request"), - MovedAttribute("getproxies", "urllib", "urllib.request"), - MovedAttribute("Request", "urllib2", "urllib.request"), - MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), - MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), - MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), - MovedAttribute("BaseHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), - MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), - MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), - MovedAttribute("FileHandler", "urllib2", "urllib.request"), - MovedAttribute("FTPHandler", "urllib2", "urllib.request"), - MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), - MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), - MovedAttribute("urlretrieve", "urllib", "urllib.request"), - MovedAttribute("urlcleanup", "urllib", "urllib.request"), - MovedAttribute("URLopener", "urllib", "urllib.request"), - MovedAttribute("FancyURLopener", "urllib", "urllib.request"), - MovedAttribute("proxy_bypass", "urllib", "urllib.request"), - MovedAttribute("parse_http_list", "urllib2", "urllib.request"), - MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"), -] -for attr in _urllib_request_moved_attributes: - setattr(Module_six_moves_urllib_request, attr.name, attr) -del attr - -Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes - -_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), - "moves.urllib_request", "moves.urllib.request") - - -class Module_six_moves_urllib_response(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_response""" - - -_urllib_response_moved_attributes = [ - MovedAttribute("addbase", "urllib", "urllib.response"), - MovedAttribute("addclosehook", "urllib", "urllib.response"), - MovedAttribute("addinfo", "urllib", "urllib.response"), - MovedAttribute("addinfourl", "urllib", "urllib.response"), -] -for attr in _urllib_response_moved_attributes: - setattr(Module_six_moves_urllib_response, attr.name, attr) -del attr - -Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes - -_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), - "moves.urllib_response", "moves.urllib.response") - - -class Module_six_moves_urllib_robotparser(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_robotparser""" - - -_urllib_robotparser_moved_attributes = [ - MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), -] -for attr in _urllib_robotparser_moved_attributes: - setattr(Module_six_moves_urllib_robotparser, attr.name, attr) -del attr - -Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes - -_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), - "moves.urllib_robotparser", "moves.urllib.robotparser") - - -class Module_six_moves_urllib(types.ModuleType): - - """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" - __path__ = [] # mark as package - parse = _importer._get_module("moves.urllib_parse") - error = _importer._get_module("moves.urllib_error") - request = _importer._get_module("moves.urllib_request") - response = _importer._get_module("moves.urllib_response") - robotparser = _importer._get_module("moves.urllib_robotparser") - - def __dir__(self): - return ['parse', 'error', 'request', 'response', 'robotparser'] - -_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), - "moves.urllib") - - -def add_move(move): - """Add an item to six.moves.""" - setattr(_MovedItems, move.name, move) - - -def remove_move(name): - """Remove item from six.moves.""" - try: - delattr(_MovedItems, name) - except AttributeError: - try: - del moves.__dict__[name] - except KeyError: - raise AttributeError("no such move, %r" % (name,)) - - -if PY3: - _meth_func = "__func__" - _meth_self = "__self__" - - _func_closure = "__closure__" - _func_code = "__code__" - _func_defaults = "__defaults__" - _func_globals = "__globals__" -else: - _meth_func = "im_func" - _meth_self = "im_self" - - _func_closure = "func_closure" - _func_code = "func_code" - _func_defaults = "func_defaults" - _func_globals = "func_globals" - - -try: - advance_iterator = next -except NameError: - def advance_iterator(it): - return it.next() -next = advance_iterator - - -try: - callable = callable -except NameError: - def callable(obj): - return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) - - -if PY3: - def get_unbound_function(unbound): - return unbound - - create_bound_method = types.MethodType - - def create_unbound_method(func, cls): - return func - - Iterator = object -else: - def get_unbound_function(unbound): - return unbound.im_func - - def create_bound_method(func, obj): - return types.MethodType(func, obj, obj.__class__) - - def create_unbound_method(func, cls): - return types.MethodType(func, None, cls) - - class Iterator(object): - - def next(self): - return type(self).__next__(self) - - callable = callable -_add_doc(get_unbound_function, - """Get the function out of a possibly unbound function""") - - -get_method_function = operator.attrgetter(_meth_func) -get_method_self = operator.attrgetter(_meth_self) -get_function_closure = operator.attrgetter(_func_closure) -get_function_code = operator.attrgetter(_func_code) -get_function_defaults = operator.attrgetter(_func_defaults) -get_function_globals = operator.attrgetter(_func_globals) - - -if PY3: - def iterkeys(d, **kw): - return iter(d.keys(**kw)) - - def itervalues(d, **kw): - return iter(d.values(**kw)) - - def iteritems(d, **kw): - return iter(d.items(**kw)) - - def iterlists(d, **kw): - return iter(d.lists(**kw)) - - viewkeys = operator.methodcaller("keys") - - viewvalues = operator.methodcaller("values") - - viewitems = operator.methodcaller("items") -else: - def iterkeys(d, **kw): - return d.iterkeys(**kw) - - def itervalues(d, **kw): - return d.itervalues(**kw) - - def iteritems(d, **kw): - return d.iteritems(**kw) - - def iterlists(d, **kw): - return d.iterlists(**kw) - - viewkeys = operator.methodcaller("viewkeys") - - viewvalues = operator.methodcaller("viewvalues") - - viewitems = operator.methodcaller("viewitems") - -_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") -_add_doc(itervalues, "Return an iterator over the values of a dictionary.") -_add_doc(iteritems, - "Return an iterator over the (key, value) pairs of a dictionary.") -_add_doc(iterlists, - "Return an iterator over the (key, [values]) pairs of a dictionary.") - - -if PY3: - def b(s): - return s.encode("latin-1") - - def u(s): - return s - unichr = chr - import struct - int2byte = struct.Struct(">B").pack - del struct - byte2int = operator.itemgetter(0) - indexbytes = operator.getitem - iterbytes = iter - import io - StringIO = io.StringIO - BytesIO = io.BytesIO - del io - _assertCountEqual = "assertCountEqual" - if sys.version_info[1] <= 1: - _assertRaisesRegex = "assertRaisesRegexp" - _assertRegex = "assertRegexpMatches" - _assertNotRegex = "assertNotRegexpMatches" - else: - _assertRaisesRegex = "assertRaisesRegex" - _assertRegex = "assertRegex" - _assertNotRegex = "assertNotRegex" -else: - def b(s): - return s - # Workaround for standalone backslash - - def u(s): - return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") - unichr = unichr - int2byte = chr - - def byte2int(bs): - return ord(bs[0]) - - def indexbytes(buf, i): - return ord(buf[i]) - iterbytes = functools.partial(itertools.imap, ord) - import StringIO - StringIO = BytesIO = StringIO.StringIO - _assertCountEqual = "assertItemsEqual" - _assertRaisesRegex = "assertRaisesRegexp" - _assertRegex = "assertRegexpMatches" - _assertNotRegex = "assertNotRegexpMatches" -_add_doc(b, """Byte literal""") -_add_doc(u, """Text literal""") - - -def assertCountEqual(self, *args, **kwargs): - return getattr(self, _assertCountEqual)(*args, **kwargs) - - -def assertRaisesRegex(self, *args, **kwargs): - return getattr(self, _assertRaisesRegex)(*args, **kwargs) - - -def assertRegex(self, *args, **kwargs): - return getattr(self, _assertRegex)(*args, **kwargs) - - -def assertNotRegex(self, *args, **kwargs): - return getattr(self, _assertNotRegex)(*args, **kwargs) - - -if PY3: - exec_ = getattr(moves.builtins, "exec") - - def reraise(tp, value, tb=None): - try: - if value is None: - value = tp() - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value - finally: - value = None - tb = None - -else: - def exec_(_code_, _globs_=None, _locs_=None): - """Execute code in a namespace.""" - if _globs_ is None: - frame = sys._getframe(1) - _globs_ = frame.f_globals - if _locs_ is None: - _locs_ = frame.f_locals - del frame - elif _locs_ is None: - _locs_ = _globs_ - exec("""exec _code_ in _globs_, _locs_""") - - exec_("""def reraise(tp, value, tb=None): - try: - raise tp, value, tb - finally: - tb = None -""") - - -if sys.version_info[:2] > (3,): - exec_("""def raise_from(value, from_value): - try: - raise value from from_value - finally: - value = None -""") -else: - def raise_from(value, from_value): - raise value - - -print_ = getattr(moves.builtins, "print", None) -if print_ is None: - def print_(*args, **kwargs): - """The new-style print function for Python 2.4 and 2.5.""" - fp = kwargs.pop("file", sys.stdout) - if fp is None: - return - - def write(data): - if not isinstance(data, basestring): - data = str(data) - # If the file has an encoding, encode unicode with it. - if (isinstance(fp, file) and - isinstance(data, unicode) and - fp.encoding is not None): - errors = getattr(fp, "errors", None) - if errors is None: - errors = "strict" - data = data.encode(fp.encoding, errors) - fp.write(data) - want_unicode = False - sep = kwargs.pop("sep", None) - if sep is not None: - if isinstance(sep, unicode): - want_unicode = True - elif not isinstance(sep, str): - raise TypeError("sep must be None or a string") - end = kwargs.pop("end", None) - if end is not None: - if isinstance(end, unicode): - want_unicode = True - elif not isinstance(end, str): - raise TypeError("end must be None or a string") - if kwargs: - raise TypeError("invalid keyword arguments to print()") - if not want_unicode: - for arg in args: - if isinstance(arg, unicode): - want_unicode = True - break - if want_unicode: - newline = unicode("\n") - space = unicode(" ") - else: - newline = "\n" - space = " " - if sep is None: - sep = space - if end is None: - end = newline - for i, arg in enumerate(args): - if i: - write(sep) - write(arg) - write(end) -if sys.version_info[:2] < (3, 3): - _print = print_ - - def print_(*args, **kwargs): - fp = kwargs.get("file", sys.stdout) - flush = kwargs.pop("flush", False) - _print(*args, **kwargs) - if flush and fp is not None: - fp.flush() - -_add_doc(reraise, """Reraise an exception.""") - -if sys.version_info[0:2] < (3, 4): - # This does exactly the same what the :func:`py3:functools.update_wrapper` - # function does on Python versions after 3.2. It sets the ``__wrapped__`` - # attribute on ``wrapper`` object and it doesn't raise an error if any of - # the attributes mentioned in ``assigned`` and ``updated`` are missing on - # ``wrapped`` object. - def _update_wrapper(wrapper, wrapped, - assigned=functools.WRAPPER_ASSIGNMENTS, - updated=functools.WRAPPER_UPDATES): - for attr in assigned: - try: - value = getattr(wrapped, attr) - except AttributeError: - continue - else: - setattr(wrapper, attr, value) - for attr in updated: - getattr(wrapper, attr).update(getattr(wrapped, attr, {})) - wrapper.__wrapped__ = wrapped - return wrapper - _update_wrapper.__doc__ = functools.update_wrapper.__doc__ - - def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, - updated=functools.WRAPPER_UPDATES): - return functools.partial(_update_wrapper, wrapped=wrapped, - assigned=assigned, updated=updated) - wraps.__doc__ = functools.wraps.__doc__ - -else: - wraps = functools.wraps - - -def with_metaclass(meta, *bases): - """Create a base class with a metaclass.""" - # This requires a bit of explanation: the basic idea is to make a dummy - # metaclass for one level of class instantiation that replaces itself with - # the actual metaclass. - class metaclass(type): - - def __new__(cls, name, this_bases, d): - if sys.version_info[:2] >= (3, 7): - # This version introduced PEP 560 that requires a bit - # of extra care (we mimic what is done by __build_class__). - resolved_bases = types.resolve_bases(bases) - if resolved_bases is not bases: - d['__orig_bases__'] = bases - else: - resolved_bases = bases - return meta(name, resolved_bases, d) - - @classmethod - def __prepare__(cls, name, this_bases): - return meta.__prepare__(name, bases) - return type.__new__(metaclass, 'temporary_class', (), {}) - - -def add_metaclass(metaclass): - """Class decorator for creating a class with a metaclass.""" - def wrapper(cls): - orig_vars = cls.__dict__.copy() - slots = orig_vars.get('__slots__') - if slots is not None: - if isinstance(slots, str): - slots = [slots] - for slots_var in slots: - orig_vars.pop(slots_var) - orig_vars.pop('__dict__', None) - orig_vars.pop('__weakref__', None) - if hasattr(cls, '__qualname__'): - orig_vars['__qualname__'] = cls.__qualname__ - return metaclass(cls.__name__, cls.__bases__, orig_vars) - return wrapper - - -def ensure_binary(s, encoding='utf-8', errors='strict'): - """Coerce **s** to six.binary_type. - - For Python 2: - - `unicode` -> encoded to `str` - - `str` -> `str` - - For Python 3: - - `str` -> encoded to `bytes` - - `bytes` -> `bytes` - """ - if isinstance(s, binary_type): - return s - if isinstance(s, text_type): - return s.encode(encoding, errors) - raise TypeError("not expecting type '%s'" % type(s)) - - -def ensure_str(s, encoding='utf-8', errors='strict'): - """Coerce *s* to `str`. - - For Python 2: - - `unicode` -> encoded to `str` - - `str` -> `str` - - For Python 3: - - `str` -> `str` - - `bytes` -> decoded to `str` - """ - # Optimization: Fast return for the common case. - if type(s) is str: - return s - if PY2 and isinstance(s, text_type): - return s.encode(encoding, errors) - elif PY3 and isinstance(s, binary_type): - return s.decode(encoding, errors) - elif not isinstance(s, (text_type, binary_type)): - raise TypeError("not expecting type '%s'" % type(s)) - return s - - -def ensure_text(s, encoding='utf-8', errors='strict'): - """Coerce *s* to six.text_type. - - For Python 2: - - `unicode` -> `unicode` - - `str` -> `unicode` - - For Python 3: - - `str` -> `str` - - `bytes` -> decoded to `str` - """ - if isinstance(s, binary_type): - return s.decode(encoding, errors) - elif isinstance(s, text_type): - return s - else: - raise TypeError("not expecting type '%s'" % type(s)) - - -def python_2_unicode_compatible(klass): - """ - A class decorator that defines __unicode__ and __str__ methods under Python 2. - Under Python 3 it does nothing. - - To support Python 2 and 3 with a single code base, define a __str__ method - returning text and apply this decorator to the class. - """ - if PY2: - if '__str__' not in klass.__dict__: - raise ValueError("@python_2_unicode_compatible cannot be applied " - "to %s because it doesn't define __str__()." % - klass.__name__) - klass.__unicode__ = klass.__str__ - klass.__str__ = lambda self: self.__unicode__().encode('utf-8') - return klass - - -# Complete the moves implementation. -# This code is at the end of this module to speed up module loading. -# Turn this module into a package. -__path__ = [] # required for PEP 302 and PEP 451 -__package__ = __name__ # see PEP 366 @ReservedAssignment -if globals().get("__spec__") is not None: - __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable -# Remove other six meta path importers, since they cause problems. This can -# happen if six is removed from sys.modules and then reloaded. (Setuptools does -# this for some reason.) -if sys.meta_path: - for i, importer in enumerate(sys.meta_path): - # Here's some real nastiness: Another "instance" of the six module might - # be floating around. Therefore, we can't use isinstance() to check for - # the six meta path importer, since the other six instance will have - # inserted an importer with different class. - if (type(importer).__name__ == "_SixMetaPathImporter" and - importer.name == __name__): - del sys.meta_path[i] - break - del i, importer -# Finally, add the importer to the meta path import hook. -sys.meta_path.append(_importer) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__init__.py deleted file mode 100644 index 4f1603a..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__init__.py +++ /dev/null @@ -1,608 +0,0 @@ -# Copyright 2016-2018 Julien Danjou -# Copyright 2017 Elisey Zanko -# Copyright 2016 Étienne Bersac -# Copyright 2016 Joshua Harlow -# Copyright 2013-2014 Ray Holder -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -import functools -import sys -import threading -import time -import typing as t -import warnings -from abc import ABC, abstractmethod -from concurrent import futures -from inspect import iscoroutinefunction - -# Import all built-in retry strategies for easier usage. -from .retry import retry_base # noqa -from .retry import retry_all # noqa -from .retry import retry_always # noqa -from .retry import retry_any # noqa -from .retry import retry_if_exception # noqa -from .retry import retry_if_exception_type # noqa -from .retry import retry_if_exception_cause_type # noqa -from .retry import retry_if_not_exception_type # noqa -from .retry import retry_if_not_result # noqa -from .retry import retry_if_result # noqa -from .retry import retry_never # noqa -from .retry import retry_unless_exception_type # noqa -from .retry import retry_if_exception_message # noqa -from .retry import retry_if_not_exception_message # noqa - -# Import all nap strategies for easier usage. -from .nap import sleep # noqa -from .nap import sleep_using_event # noqa - -# Import all built-in stop strategies for easier usage. -from .stop import stop_after_attempt # noqa -from .stop import stop_after_delay # noqa -from .stop import stop_all # noqa -from .stop import stop_any # noqa -from .stop import stop_never # noqa -from .stop import stop_when_event_set # noqa - -# Import all built-in wait strategies for easier usage. -from .wait import wait_chain # noqa -from .wait import wait_combine # noqa -from .wait import wait_exponential # noqa -from .wait import wait_fixed # noqa -from .wait import wait_incrementing # noqa -from .wait import wait_none # noqa -from .wait import wait_random # noqa -from .wait import wait_random_exponential # noqa -from .wait import wait_random_exponential as wait_full_jitter # noqa -from .wait import wait_exponential_jitter # noqa - -# Import all built-in before strategies for easier usage. -from .before import before_log # noqa -from .before import before_nothing # noqa - -# Import all built-in after strategies for easier usage. -from .after import after_log # noqa -from .after import after_nothing # noqa - -# Import all built-in after strategies for easier usage. -from .before_sleep import before_sleep_log # noqa -from .before_sleep import before_sleep_nothing # noqa - -# Replace a conditional import with a hard-coded None so that pip does -# not attempt to use tornado even if it is present in the environment. -# If tornado is non-None, tenacity will attempt to execute some code -# that is sensitive to the version of tornado, which could break pip -# if an old version is found. -tornado = None # type: ignore - -if t.TYPE_CHECKING: - import types - - from .retry import RetryBaseT - from .stop import StopBaseT - from .wait import WaitBaseT - - -WrappedFnReturnT = t.TypeVar("WrappedFnReturnT") -WrappedFn = t.TypeVar("WrappedFn", bound=t.Callable[..., t.Any]) - - -class TryAgain(Exception): - """Always retry the executed function when raised.""" - - -NO_RESULT = object() - - -class DoAttempt: - pass - - -class DoSleep(float): - pass - - -class BaseAction: - """Base class for representing actions to take by retry object. - - Concrete implementations must define: - - __init__: to initialize all necessary fields - - REPR_FIELDS: class variable specifying attributes to include in repr(self) - - NAME: for identification in retry object methods and callbacks - """ - - REPR_FIELDS: t.Sequence[str] = () - NAME: t.Optional[str] = None - - def __repr__(self) -> str: - state_str = ", ".join(f"{field}={getattr(self, field)!r}" for field in self.REPR_FIELDS) - return f"{self.__class__.__name__}({state_str})" - - def __str__(self) -> str: - return repr(self) - - -class RetryAction(BaseAction): - REPR_FIELDS = ("sleep",) - NAME = "retry" - - def __init__(self, sleep: t.SupportsFloat) -> None: - self.sleep = float(sleep) - - -_unset = object() - - -def _first_set(first: t.Union[t.Any, object], second: t.Any) -> t.Any: - return second if first is _unset else first - - -class RetryError(Exception): - """Encapsulates the last attempt instance right before giving up.""" - - def __init__(self, last_attempt: "Future") -> None: - self.last_attempt = last_attempt - super().__init__(last_attempt) - - def reraise(self) -> "t.NoReturn": - if self.last_attempt.failed: - raise self.last_attempt.result() - raise self - - def __str__(self) -> str: - return f"{self.__class__.__name__}[{self.last_attempt}]" - - -class AttemptManager: - """Manage attempt context.""" - - def __init__(self, retry_state: "RetryCallState"): - self.retry_state = retry_state - - def __enter__(self) -> None: - pass - - def __exit__( - self, - exc_type: t.Optional[t.Type[BaseException]], - exc_value: t.Optional[BaseException], - traceback: t.Optional["types.TracebackType"], - ) -> t.Optional[bool]: - if exc_type is not None and exc_value is not None: - self.retry_state.set_exception((exc_type, exc_value, traceback)) - return True # Swallow exception. - else: - # We don't have the result, actually. - self.retry_state.set_result(None) - return None - - -class BaseRetrying(ABC): - def __init__( - self, - sleep: t.Callable[[t.Union[int, float]], None] = sleep, - stop: "StopBaseT" = stop_never, - wait: "WaitBaseT" = wait_none(), - retry: "RetryBaseT" = retry_if_exception_type(), - before: t.Callable[["RetryCallState"], None] = before_nothing, - after: t.Callable[["RetryCallState"], None] = after_nothing, - before_sleep: t.Optional[t.Callable[["RetryCallState"], None]] = None, - reraise: bool = False, - retry_error_cls: t.Type[RetryError] = RetryError, - retry_error_callback: t.Optional[t.Callable[["RetryCallState"], t.Any]] = None, - ): - self.sleep = sleep - self.stop = stop - self.wait = wait - self.retry = retry - self.before = before - self.after = after - self.before_sleep = before_sleep - self.reraise = reraise - self._local = threading.local() - self.retry_error_cls = retry_error_cls - self.retry_error_callback = retry_error_callback - - def copy( - self, - sleep: t.Union[t.Callable[[t.Union[int, float]], None], object] = _unset, - stop: t.Union["StopBaseT", object] = _unset, - wait: t.Union["WaitBaseT", object] = _unset, - retry: t.Union[retry_base, object] = _unset, - before: t.Union[t.Callable[["RetryCallState"], None], object] = _unset, - after: t.Union[t.Callable[["RetryCallState"], None], object] = _unset, - before_sleep: t.Union[t.Optional[t.Callable[["RetryCallState"], None]], object] = _unset, - reraise: t.Union[bool, object] = _unset, - retry_error_cls: t.Union[t.Type[RetryError], object] = _unset, - retry_error_callback: t.Union[t.Optional[t.Callable[["RetryCallState"], t.Any]], object] = _unset, - ) -> "BaseRetrying": - """Copy this object with some parameters changed if needed.""" - return self.__class__( - sleep=_first_set(sleep, self.sleep), - stop=_first_set(stop, self.stop), - wait=_first_set(wait, self.wait), - retry=_first_set(retry, self.retry), - before=_first_set(before, self.before), - after=_first_set(after, self.after), - before_sleep=_first_set(before_sleep, self.before_sleep), - reraise=_first_set(reraise, self.reraise), - retry_error_cls=_first_set(retry_error_cls, self.retry_error_cls), - retry_error_callback=_first_set(retry_error_callback, self.retry_error_callback), - ) - - def __repr__(self) -> str: - return ( - f"<{self.__class__.__name__} object at 0x{id(self):x} (" - f"stop={self.stop}, " - f"wait={self.wait}, " - f"sleep={self.sleep}, " - f"retry={self.retry}, " - f"before={self.before}, " - f"after={self.after})>" - ) - - @property - def statistics(self) -> t.Dict[str, t.Any]: - """Return a dictionary of runtime statistics. - - This dictionary will be empty when the controller has never been - ran. When it is running or has ran previously it should have (but - may not) have useful and/or informational keys and values when - running is underway and/or completed. - - .. warning:: The keys in this dictionary **should** be some what - stable (not changing), but there existence **may** - change between major releases as new statistics are - gathered or removed so before accessing keys ensure that - they actually exist and handle when they do not. - - .. note:: The values in this dictionary are local to the thread - running call (so if multiple threads share the same retrying - object - either directly or indirectly) they will each have - there own view of statistics they have collected (in the - future we may provide a way to aggregate the various - statistics from each thread). - """ - try: - return self._local.statistics # type: ignore[no-any-return] - except AttributeError: - self._local.statistics = t.cast(t.Dict[str, t.Any], {}) - return self._local.statistics - - def wraps(self, f: WrappedFn) -> WrappedFn: - """Wrap a function for retrying. - - :param f: A function to wraps for retrying. - """ - - @functools.wraps(f) - def wrapped_f(*args: t.Any, **kw: t.Any) -> t.Any: - return self(f, *args, **kw) - - def retry_with(*args: t.Any, **kwargs: t.Any) -> WrappedFn: - return self.copy(*args, **kwargs).wraps(f) - - wrapped_f.retry = self # type: ignore[attr-defined] - wrapped_f.retry_with = retry_with # type: ignore[attr-defined] - - return wrapped_f # type: ignore[return-value] - - def begin(self) -> None: - self.statistics.clear() - self.statistics["start_time"] = time.monotonic() - self.statistics["attempt_number"] = 1 - self.statistics["idle_for"] = 0 - - def iter(self, retry_state: "RetryCallState") -> t.Union[DoAttempt, DoSleep, t.Any]: # noqa - fut = retry_state.outcome - if fut is None: - if self.before is not None: - self.before(retry_state) - return DoAttempt() - - is_explicit_retry = fut.failed and isinstance(fut.exception(), TryAgain) - if not (is_explicit_retry or self.retry(retry_state)): - return fut.result() - - if self.after is not None: - self.after(retry_state) - - self.statistics["delay_since_first_attempt"] = retry_state.seconds_since_start - if self.stop(retry_state): - if self.retry_error_callback: - return self.retry_error_callback(retry_state) - retry_exc = self.retry_error_cls(fut) - if self.reraise: - raise retry_exc.reraise() - raise retry_exc from fut.exception() - - if self.wait: - sleep = self.wait(retry_state) - else: - sleep = 0.0 - retry_state.next_action = RetryAction(sleep) - retry_state.idle_for += sleep - self.statistics["idle_for"] += sleep - self.statistics["attempt_number"] += 1 - - if self.before_sleep is not None: - self.before_sleep(retry_state) - - return DoSleep(sleep) - - def __iter__(self) -> t.Generator[AttemptManager, None, None]: - self.begin() - - retry_state = RetryCallState(self, fn=None, args=(), kwargs={}) - while True: - do = self.iter(retry_state=retry_state) - if isinstance(do, DoAttempt): - yield AttemptManager(retry_state=retry_state) - elif isinstance(do, DoSleep): - retry_state.prepare_for_next_attempt() - self.sleep(do) - else: - break - - @abstractmethod - def __call__( - self, - fn: t.Callable[..., WrappedFnReturnT], - *args: t.Any, - **kwargs: t.Any, - ) -> WrappedFnReturnT: - pass - - -class Retrying(BaseRetrying): - """Retrying controller.""" - - def __call__( - self, - fn: t.Callable[..., WrappedFnReturnT], - *args: t.Any, - **kwargs: t.Any, - ) -> WrappedFnReturnT: - self.begin() - - retry_state = RetryCallState(retry_object=self, fn=fn, args=args, kwargs=kwargs) - while True: - do = self.iter(retry_state=retry_state) - if isinstance(do, DoAttempt): - try: - result = fn(*args, **kwargs) - except BaseException: # noqa: B902 - retry_state.set_exception(sys.exc_info()) # type: ignore[arg-type] - else: - retry_state.set_result(result) - elif isinstance(do, DoSleep): - retry_state.prepare_for_next_attempt() - self.sleep(do) - else: - return do # type: ignore[no-any-return] - - -if sys.version_info[1] >= 9: - FutureGenericT = futures.Future[t.Any] -else: - FutureGenericT = futures.Future - - -class Future(FutureGenericT): - """Encapsulates a (future or past) attempted call to a target function.""" - - def __init__(self, attempt_number: int) -> None: - super().__init__() - self.attempt_number = attempt_number - - @property - def failed(self) -> bool: - """Return whether a exception is being held in this future.""" - return self.exception() is not None - - @classmethod - def construct(cls, attempt_number: int, value: t.Any, has_exception: bool) -> "Future": - """Construct a new Future object.""" - fut = cls(attempt_number) - if has_exception: - fut.set_exception(value) - else: - fut.set_result(value) - return fut - - -class RetryCallState: - """State related to a single call wrapped with Retrying.""" - - def __init__( - self, - retry_object: BaseRetrying, - fn: t.Optional[WrappedFn], - args: t.Any, - kwargs: t.Any, - ) -> None: - #: Retry call start timestamp - self.start_time = time.monotonic() - #: Retry manager object - self.retry_object = retry_object - #: Function wrapped by this retry call - self.fn = fn - #: Arguments of the function wrapped by this retry call - self.args = args - #: Keyword arguments of the function wrapped by this retry call - self.kwargs = kwargs - - #: The number of the current attempt - self.attempt_number: int = 1 - #: Last outcome (result or exception) produced by the function - self.outcome: t.Optional[Future] = None - #: Timestamp of the last outcome - self.outcome_timestamp: t.Optional[float] = None - #: Time spent sleeping in retries - self.idle_for: float = 0.0 - #: Next action as decided by the retry manager - self.next_action: t.Optional[RetryAction] = None - - @property - def seconds_since_start(self) -> t.Optional[float]: - if self.outcome_timestamp is None: - return None - return self.outcome_timestamp - self.start_time - - def prepare_for_next_attempt(self) -> None: - self.outcome = None - self.outcome_timestamp = None - self.attempt_number += 1 - self.next_action = None - - def set_result(self, val: t.Any) -> None: - ts = time.monotonic() - fut = Future(self.attempt_number) - fut.set_result(val) - self.outcome, self.outcome_timestamp = fut, ts - - def set_exception( - self, exc_info: t.Tuple[t.Type[BaseException], BaseException, "types.TracebackType| None"] - ) -> None: - ts = time.monotonic() - fut = Future(self.attempt_number) - fut.set_exception(exc_info[1]) - self.outcome, self.outcome_timestamp = fut, ts - - def __repr__(self) -> str: - if self.outcome is None: - result = "none yet" - elif self.outcome.failed: - exception = self.outcome.exception() - result = f"failed ({exception.__class__.__name__} {exception})" - else: - result = f"returned {self.outcome.result()}" - - slept = float(round(self.idle_for, 2)) - clsname = self.__class__.__name__ - return f"<{clsname} {id(self)}: attempt #{self.attempt_number}; slept for {slept}; last result: {result}>" - - -@t.overload -def retry(func: WrappedFn) -> WrappedFn: - ... - - -@t.overload -def retry( - sleep: t.Callable[[t.Union[int, float]], None] = sleep, - stop: "StopBaseT" = stop_never, - wait: "WaitBaseT" = wait_none(), - retry: "RetryBaseT" = retry_if_exception_type(), - before: t.Callable[["RetryCallState"], None] = before_nothing, - after: t.Callable[["RetryCallState"], None] = after_nothing, - before_sleep: t.Optional[t.Callable[["RetryCallState"], None]] = None, - reraise: bool = False, - retry_error_cls: t.Type["RetryError"] = RetryError, - retry_error_callback: t.Optional[t.Callable[["RetryCallState"], t.Any]] = None, -) -> t.Callable[[WrappedFn], WrappedFn]: - ... - - -def retry(*dargs: t.Any, **dkw: t.Any) -> t.Any: - """Wrap a function with a new `Retrying` object. - - :param dargs: positional arguments passed to Retrying object - :param dkw: keyword arguments passed to the Retrying object - """ - # support both @retry and @retry() as valid syntax - if len(dargs) == 1 and callable(dargs[0]): - return retry()(dargs[0]) - else: - - def wrap(f: WrappedFn) -> WrappedFn: - if isinstance(f, retry_base): - warnings.warn( - f"Got retry_base instance ({f.__class__.__name__}) as callable argument, " - f"this will probably hang indefinitely (did you mean retry={f.__class__.__name__}(...)?)" - ) - r: "BaseRetrying" - if iscoroutinefunction(f): - r = AsyncRetrying(*dargs, **dkw) - elif tornado and hasattr(tornado.gen, "is_coroutine_function") and tornado.gen.is_coroutine_function(f): - r = TornadoRetrying(*dargs, **dkw) - else: - r = Retrying(*dargs, **dkw) - - return r.wraps(f) - - return wrap - - -from pip._vendor.tenacity._asyncio import AsyncRetrying # noqa:E402,I100 - -if tornado: - from pip._vendor.tenacity.tornadoweb import TornadoRetrying - - -__all__ = [ - "retry_base", - "retry_all", - "retry_always", - "retry_any", - "retry_if_exception", - "retry_if_exception_type", - "retry_if_exception_cause_type", - "retry_if_not_exception_type", - "retry_if_not_result", - "retry_if_result", - "retry_never", - "retry_unless_exception_type", - "retry_if_exception_message", - "retry_if_not_exception_message", - "sleep", - "sleep_using_event", - "stop_after_attempt", - "stop_after_delay", - "stop_all", - "stop_any", - "stop_never", - "stop_when_event_set", - "wait_chain", - "wait_combine", - "wait_exponential", - "wait_fixed", - "wait_incrementing", - "wait_none", - "wait_random", - "wait_random_exponential", - "wait_full_jitter", - "wait_exponential_jitter", - "before_log", - "before_nothing", - "after_log", - "after_nothing", - "before_sleep_log", - "before_sleep_nothing", - "retry", - "WrappedFn", - "TryAgain", - "NO_RESULT", - "DoAttempt", - "DoSleep", - "BaseAction", - "RetryAction", - "RetryError", - "AttemptManager", - "BaseRetrying", - "Retrying", - "Future", - "RetryCallState", - "AsyncRetrying", -] diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 65ab99d74e9c39074bc160bfe6eba7e748d826bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27108 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 IR8DgL5AB4qSpWb4 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-312.pyc deleted file mode 100644 index cbf2f097f45b11cb9fa8055952ed5aa521559398..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4828 zcmb_geQZ<L6~FgAKgXYm9Xk%r2P7mZI3#fiG%W}y`Jf$ZiPWaF!_xX@{9b~C^X%UD zLI@ZMQMM)%9YIq^kfxDJl^O(7>0hPOq?Wc)C+#15WQ+G2G^TaZ_MbbqTFYNM=RMnT zAYC<SSMt5*o^$T!Ip=rJ^Y7hm2Z0j%)#+n@aTD@4?37AXktozsLM{`DNHjqrW=kW~ z=yMSsS}tLk5F!Fa8K1CDR7I)`+5)sKVl!v~XnVwN&{m)w5r;un0qu-9DdC9Bk8da~ zzS>H*>##nSi2GZ0>@c>;)T*o{2k<vma!eYyEe~^pz#8SSzTv#inevF2BTo~_b)HCW z*>;^Ta%-n)sQRDS84gihP!qD80;0NK)8vVib||Vu$7BW^*FaR2pO-Z@9aqMnZy!n) zb)Zu<lpHCIG;{`|iNuH&)nwiC5{sr%vh<V!f=Q;lpxeuw9vCVdO-?FO%-oJy+lrmS zS-7v)z+y5%D@C}&c(WyG#Ryp#qablru!<ybs~_gB-j8gP=pImz?W0t}IsUJ+OWgYF zOT1(mwayS&Q#kLAI3%m=l&Zc(_gm+XU86S1cHR<kOFWES$7|#o$pS0!=6NMM=z1i# z<bc)-V`@e@$q96=u|6+5M=i#lT<2X8-wZiPBmNN*s@C28>a-Fo*`A^6=+@&?Q8uRP zR%TdrI97Bs<FW;)o$xF4LiGl{Othlo6Ee%E$?FyZAs8oV?k)N=N=cfgiC7*#O+wu8 zH4@^%8z)mT(`}*{SK^u|8Y_n^x<!=}qeh3Jado>W#u8Cg6-5<hCM_*3XYXs_W623Q zJQ3B@6XBs`Y;r<YG&QWr33-e~C%RQF9y>0xZYepXB$81{X5kaEaw43F9}TCbwPQ(T zN6+@&uo~Co?o>2(9HKxCr{bxw2x?N2!Awdt7T2c3Via#Dp6p3YGaoE}DzN6ddP=)* z2btOc)z@dqip@P+m9=fi+BVPk{lT_5SJyCOdEHR}Dbcx6MYrJPuDMeyh%Umf@Ef?x zX9$I`NR#pMz2Zo-TrakiXvH8Wpb2-(rTH85I^GbJGZs6JM@v0W(v}-s38>BpS_wQ! zTF}bDQ34g#W(T;#xxtz|TJu$a&eO2&FZj#+PXvLSv8FBK=nD^&w6(MbCCZ*PtN2T* z<yAUij`|XJwOu_aoCJORfsz(VYm|4znY)5DxwJ4sE}VOuTo`F1S{XXp33~)Q(lTE2 zz+}+Xyd~avZHZcKOS>tpNy!m%Vfz$0$sZw86xP}EYkrD`_+jv17eo!47L!NE<(S6s ztzfu+!=0~D-D!$d1kjKhAW|NSD-3U6w}3-3-4R#g3W$}M%+N7(hbn6#lhw(Drn?cT z51fq2DJ`B<bT^9Ra+g=9Row=C2&&N}L-XnzQcO-onJfZBROFMI7&YPFjJPU>CV60+ ztQkjgQW7Bm*Hv*Uh&?PUfI<k|7`y|b_;5&={H>s+egf4$Fevg?Vs~G3%sMW(J`c3t zY`@j};ZWwemzDxQm~rN+YjfVZ%fU;*h0}AvJKh~L11mMb`OUwKFV$?#bAorrpW8YX zv`kyy;)!fq-*R)`+*5fQscTvGcV_*ai+z9e_pW#w=Lg=ZTJmnqc^a2JJF}jhOP;=5 zpyBfPrSXN@pDW9r_N=G<UVU)Ro^K>IKA2$R<KL{*xBrV!@4lRW)3U!i>+il1dna)% zab5Y7e{Y@#!Tr38csuT^2jL*+`uV{|dfVz8*g|f5=|G3&cC7{JK))3PA2rdzpyi`x z8`2#V1Rrhb8Vv9s`#9iyTt|@(Sb&aIMmEMV{tD<Rm1ru_lDD0sfSRY;*FaB;>0d2z zwM9v4E$BJXqX`)w?-!<1@&U$@>>4$UtKxF2W<%BW%x3cUg070l3qV#~pV_eQPW6)+ z+mj4Kbj`leHI01_1M$D%6((hI0!UQEtI8K5P2gGLhZ%-rh=0H@fq{9F87(e|2@EtN zl2{k;D-R0qMzna+`ZX5^m|Ya?$02P{oh3P&%XH3_rq0EkH-~Pq-)&xMIy7ThvITQB zz8UAk=f}Oj3ctecGG-g7TWMPmV*vy!zkntOYryNG?ire<XRTWCHo(zn1!mH9kU5~0 zQTMy%9wBSyDq~?8e|N4w!+IE5LP5Y#GG4~Z)f1)5Ct3%S*PQRd8-STE12ef{hS^QX z&Ne~A!cgh8BU&<LSnVMCH9{S0K`A;N!+SEYjXi=CI$?-2VQdS~D&BPorqB%x&=XHR z>;|Ub0FF5al>t;0V5BW?c_O>z3529wGXuFA@64%{z}Adss|hytC2!|SeaFrA<=(+; z@8DAXP{uP<i9`NnPixlGy6oAV_3U2q?0E={J~w8|*C8Bv44A>E=iGo}01(7Q2LMgn zZlKrX3W&r;+`$(M<X^901_ms%7#SG6`?F<B{FG|tJYYR9T-B7QhSzJ9^-^Vt`wlt( z-{p`LQ%H&}=UpW~I>XJ<apTjjw658vIkCKF&?x)tsupOJ_nPJaF@)jON0#C99$Qr= z1ZTSnzrv$Xy+O?kizBmKnm}$t*W@<EEMkO!hgu8|rDZfKzvBijsb~hsN6iP(9mP~p zoHD<NPIayY9b~ILdlE@_9Mye2Yjj_PX;gf1zcxJZuffLo7c#-Fg%`8Iu4P|W#?_Va zb=_C-8eVk;=tb(c%n1P+s$%Fax?s$$+easrn3hZ?RGn%%->*#Tf&q}a!^Fv{xOOaL zsd(=DU^J_P%FL{PR6GfL99XA(>+Jt|)J;P54LlC++S!+8e>mTJ$Gvfe`_f7rzKfe? zH_g}Hu{Y&8YVUsQmA5C~oXis-e@j0Q-WLq=lh#i=Zg+f%+yYM=&4wzx#hY5M9=mdE z#=T@~%(ZpAz4y(%NVnXpY0B7|4Df{zN4qlk1Av6;F#k}Z6S64k4pE#)N|OnsU84BP zWHez)*e+1jZTPv0Popl3!pDH7+xw^B0YDDhjS4jg5%7i@FazHi2A~+(K11JRcC13E zX@6Q)5RQ_}#Gr1Jpi8kGSmC|t?&9}KOvdCWM9m9Epx<x!iLrm9Y6YIU0@c?)CON0; z;_lhqbCYvp^RHYzedYAx_IDn;_E>h)_Do=V*4cZ<(tGcFhrS@3&^RBxI(}t*v176R zX6t*~-raU9`honuob4UTgod&k59CoNb0o5S<mK#<m(5;m>?`EvZ9btPSKFB9v2E{o z`@owAO!~3D_YS{%*r4y(g9QQP`A#bAr}M2>w_Vw`pxl&h4P_qLpKa(b5abuEyx`9} zoI+?}V}U@EZ*U3C^Y%P}W+DD>Y`(zCFr8^LAA150%i5vRt=e=7{%SBSRAod%JZW6K z?uQStp5ljCPw7L<yl)I+^9eu@G_!yz%ywRkGSf`^kw1VHn%1-*I*gG{n0vwO^}cP7 z=`#D+_o0i{Q752+l#kLvJ7k2P5yxkw_AUwjorLd_?z^P(F4=mQgzx#9=C)tnb!k_o zIef?WXoh%luDY52iw9>9&K+O$zSD56;pX5i?+1<VH-7lsr-yGJ&hC09v-6p3=-DOL Up|kcct$S(n+_PU1XpHUr2X}x3od5s; diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-312.pyc deleted file mode 100644 index 74037c76bd6d43f8c147b502763cd8ffc7687d1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2337 zcmaJCOKcle@V#BzS$~qXleA5nv~n7V;?j6&3lgFfl<+B4Aw^27l1Oy3_C6=;*lY9l zIgNvhBIuzhm6A$`II5uG0*MOZ+G`_jTwD@FSc+7MQ*Nfop$Z(Bx3=3PEsW$h^JeDF zjOVvM)z|wFK>VwZMn07g`jcO3;HnbqD?rR59qBlQ1}hj3Vz>(_AuSGy7!j0&*E>NM zC;SKvx^)-v=x$P%aOs}Qu0d(by$<ePT_QNyyz@0ex)=DnpX4Wmy}+zm^nrx{=<Rz_ zk9bG}5fdWU9+Y)Ik>O1PL=k{D!90%CuklBH5o~*zktRAxF>Or%mR*<4SgM&z+a5|- zj+$}IHLJiABf@We1ddr$fW(Y;Aw+Rr09vflE}-32+5>c5m6mjG0mX%JVH859Zr$f# zAunLW9(e(M|AYsjTUAa!iUj(o6PmzA);QM|EJk@KwqWXOJRV!1`Wok~@no*?$}VC% zkT6VL%~0JiwbUY}ZeUy7KzNfXBbhW&(i*eIls7W*T$-57QW!~*VXCFOEoQ_=3GLQ1 z7tK^g(+O3^h&iUDjF^(mvyqH>EPCXqVi}BdXSMjKHcTufYh)D_)btDmOQse#SYA<c z%t%?$Y@RlPXXj|;al8k|B)VVMFw_1?VO4Hg^#*5puD1Or<-0Px;%zN9{_Jf9owA60 zZ5tjGY%89ekIlWaEJsRGWF2gxrxz>?5?-(y+frRi@(uK*&<`o=qao0vO>k5aMR`7L zAIsFzNLzsM9GCBbV-l@4?7A}Wd13zK@}9$`-Q6XBwB(A?UHp|0k43iy!}ITS&kz)0 z77e3I*oz7{S*<ikA3*^ndC7M`EnEz*EI;$s#Dy*00v1uy8SR?1f@vFgs^8AzHyuA+ z|5nvMhG9?2PrfVQS~UHr12Nuw4m^XXg3<r{FX-)^P_u-QDetfaD`o(hu8U|~96%TG z0J`>ZjeeTuwevM;M4T{B5*F6NaV?dKL63$Lxl}6O{b5c^83}{vVN*+!sLvM$IF$&S z8HWMtW;jN|S(?#vanKqXq9jYZ;<3okP}r~>bHLV2JzUukM2|W)oFU!B(THSwv}_jU zzz(P?cgG#6s@>4T7&T%!M&6_}Lv2Y_s}dJ?Vf$1y4Ng;B*JGF#q0DwAGlm%vDBonZ zWRYQKP%U1ZaJbT)p<%+*+MjeR(q}=ez|Z;yj!9JZp<v_W+hxJy4y{VTX?aR63OD6B zc}42_D}Vyc_vEIT-p|Ib$Yqz?8@extrY~K+v>I%gm9NY5c>d_OC%!(h5<F6dfoqx` zpBgVp%W`{3YJa$~9|iV3KrVNvEQsFFYM^=g%+#4;@6FS5r+*1_J-jFHe}J$z^jjcU z76JcLt^?h_H(F5ez&63A^%jJBxwWSgec#pFj_!1Ndk=_ro^S092upqp^isgv+u~l@ zC2)EV=5&k5>HUth-P_wOE*-{jR(86YGYz(F{&?qA<`0P3EsKD0t^<WFom`s$+6)s? zSJQZmZ&k@!_x8i&J*Fw&4-uE`PQd<Tw$HGjqD(X6gmQ0oJ<BjHrCKDOF?B0~X(w=Z zE}g2B@`ZDn%i&`K^}Oc~ewVzx_s3H!(Y~3zzlOT*hPswRhnD>pO0El~vmaClXA4C_ zwrJ%o+r#o%!yL9HU1NlQ@+wi(rL}R(m>{<FZqNJb`JPi}ZP73pykWGmu=&2TrPpDG zv{;JRVvm`3+RJvIGmVT%c|>*tx9B8X1wX`zcM&-OI6b;4y;AAySLsWj&ljHc1su>5 z7_T2h*#A4K{{tO>Mh(c*$ES`LLsPF!N@Y(yK2+=|BS7;V>l~HC7%N4wi~!Ax>l~G( z-S}X!^QJPVEOac4{V=gOv7p@D_i`Bl|F*TxQTZrpY?*Dl-d2pyzqk-79XNJ3^ulCA U*@Ll)i&1V)#S7;)9PGsXFCLl?1poj5 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-312.pyc deleted file mode 100644 index 96eb21e971ed1eaf30cd2be9f7c67880ce3d4ad1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1646 zcmZ`3O>Y}TbY|D<Z@Y>cJG8avHWCR2yr$$DSxQ4mS|CD{3r1+O@r><F*1KkQoMJbr zTq#oGQzayn0|Moks0V%s7l$5VZ8=1O9=ISQgFrd)W}Q?`fT!Iz@9q2knEfG<h$4XU zcMob`1rhpLFlP`uC5Agd>>`2)wopl&l7;J1Ny3PtRj|4UEb8k9N&z@!&{awbMkG#x zTY*wAf=GgdNSH)uh(u|aDBvY^(FZ~#P{jmSq$?n*gh^~mDMed2m;6<zF6FQn)SKM2 zT%eL4Q_foRhGpI32B$0l8eWi5-eh(e3;mZs26`wob`iLf+Ea5CFj323t-73neYK_X zn!#1#P*=4bUNh~gwse3XQVg83mhOr$uJEj$d{L-5by}z!++8oc>y(>yYIC>1sYR>I zsOMd7me(lD6X(8dIR>Guuukpuf@Q808ZBOP>>2ImI|bL|G~Y1FYetp2g@)NE=%7X% z2A*uAZ1PsY5Q%DymY47;{WLWuMtBWgR|5114FN;>mQ$@#)=r936!3x1dlBGui>_14 zi@LO|R~!bZmql03Ks3kiQWl79w2ikV7{9cGchHVhkqO?4Z^|3;J(QE%xBj<#5XV)y zqq@)?RU`pT<~6ETOxtv8l&A*hwBF#_xe1A-yA1E}H$Y#@yJ!Qg0(B8Oki{mpuk#mq zuZpZMz<=95Io*g&+?7{D7fgWdN<`Yg-@xj21K=V2Z;duAJ;(zuMfb1Kc}=j5pZ_Ab zv*=*2d>eWqMh1XU3*~}K?Z|A?UbA6SitW^UXN~e#6FNEF4o|E8=+$=WbvO4G^wV_J z`v&wG8rvRIxe2`%>M(HC<XSG|Nfn!kCV693%5@=IfhE&zqfR{;#^POuEpTk&>aJ;* zsaS2sy(o8dhY`~@EH8OFDBW(>S18LVOti!cRczl2O9012r7Q`^RRF1Kr_*5(p!_}5 zP2RpT+F6LG%~}rR;TAPuKr|(+z6A7l2lZo_$Hi{37rSwsxzSztC6hhMXoneX|H1bU z4<0_v6n7T-;pF3JH`<S<`$=_gVlOg4_>FWweSPoEqsh5Lc+zvd@muh99%p~bP9A0R zhuQr8+L5++s4YIt-sxSt+q?VOK#>xk<3AN85@llP4g!8z{=b8X8kU&Yja*<<nqQ=- zkG%rO70b4~ysVCDjJ&9gT?N5)p>YY&NeBIvj49E<RTNKkKJ?=-@juJqw({EB+Ds)E z^Mbt9fN^=_aObttJFlJH`O)YSpM3h!ZGC?6_Wb*ImKMB_xJ_U(%2jNhC!03+WcYn~ z;dvObv0_m_6~Bg2TrrK4@NC^7O^X)UB(UNlxCWqsj4>WgBAk4VrjO;wkv#FEJn<}$ zdLEb=1~I-lNTP{Xe-Dl0R6m{_$Z#HCN(~e^2SGG8J`j>Y7zN|o`XjxUnd+sd_s4tb N{Gp=#5doQ>!ao_$l>q<% diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-312.pyc deleted file mode 100644 index 871851b88816322f7ee55ff16fdc69d5b7b5e2e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1486 zcmZ`&&2Jk;6rb5$e{B+n2Cz$v)J-pzQM@bK8;X3u6gMJu5aog?Y}TH!v&nkbnjHt( zO)4W*YJBPm<$ypvHtGS6aN-X@LJmD7S~ygK9(uE6K+qF!*0u;1Jng=DGxI)w@6GoM z3n~JteR+F(If~FPVl$=qL>TozI6?#w?4XKRB?mX9ii8nGJ76_SObvCFiUO+)x{*o* zBQi&#ca=(%#7LYZXpBU_`h{6rgox6>1lOfk;Hn-aD%d1CI5+=HsFrg$h?;F~J3dIs z_b6wbqUAU@xy30{KqH7U%G=DXVWEGHWROQf;|PH}shfS1);&hG8klQ7XW*dG(fGE- zHR4fUb3MLoyA8d3j3Cq;cx4^a7jb;yT6@lnZLdj<rp5g|<1Me&Zc>-~2B!{fFsqsO zxn0|(EKj^oT*tErWyT(L_YB9b8m$iB_S~!b>sJil<}}~3YP(j0`bNuc878O^kAWxG zs@c3_RKra5Rwqb~MRSrI6Wz<e?@PcwMI+#Vfa5h9ly#G06(wwh`yc^()1iCRsR{Kd z31C8SE`o3m-NVpp=@1{Hx<v5Z`2%TRx`}df_l^Gt3>^C!_cR{>(L_|r07<G@oYQ8D z>;Gy-0>Zoq|L6x`pGik(AMJoNOFfz31MFVnBDausME7Rszil5)nty=%@=k2V1h##N zNc;G6n9g(Fr}KVJ9lVF{<J=L5Q}1A}d=Ysx!4jhm%0<fE#9G_kb)n~l?h=e8<IsWe zkO4s1?qYTops{@oJ^@kpg2rt?O^l(?w7H&(22$N+qVC{AgK|^cRbfI**J{#027m*V zd#1;T?OINdoWN|l?Pis-oWevYL9FhE25bR#Y#x{|0MxWzkBJ_Hb7I=OyF3{x@T;#m z9z^pCI&9$Xvaqs%{n<ljbE*4<eqk`T@+7s=Fa4T&^)#iQr1Xckzq)gL=W(iVSUQU* z@2h?FZ2sl5r1l{FATdPvwam|%mD9}XNoMuoho||{Nxt+rbA7P9K3J~|WxQ|;{~l2i zDw~5S$K%w)hs+{yP-dcgIXO&!Tu2HIe1Xl@mNu?K{U?7WX84lOSOoT05B(8UBkJ%X znqTVO2t%+mT;$Xs$~!H<J9r6RoIZJR`t-$(v0r%qgLki)#p~CK@2r<gK}-xbn2fU% za}mh4%Y%3k+GAB68U_y&9!C-&Kaa09J<@h)fr+%lT>6{9pmK~ymk~}rMcF5E;#5xm zD5rl?mYynCM^TKg4C9M<X^_qi5v*Sq!{wW|zuWwFb8zFM!N$jfEi%|3Cu{UKp%4cA E8>{hc1^@s6 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-312.pyc deleted file mode 100644 index 714f31acf35cf4c0143b13e75b92af288ce93430..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2324 zcmbVNO>7fK6yEi&f7fw{Nt~9X$vO>Aj2fE)7f@<NArLBPR6$kL6uNA@W5>>V*P0!N z*f`WwNO4ZkLq#P-MNb7$saKBNds&l%t!)pfS`NLrN~=~m_08HQBn_87*)#9WesA8J zH}Adqv8&6+042Y<u{h&pm|v;TA)(D|Re`z3D2&3Y%sibPDw}i6J6HxWSyu<XGh?5P z<>z^rIlwySoh+mH71wQk-sNSKF2${Q6fbfsKIBoHuuE`9yTd7bnpN18<4ssdc@*Kc zbKX~Eqk-QkU@pp9E~!8=ssUW!A|kkWT2|FdL?#IHfUsN`kpk9|EXBV<9PnEdagTxR z9Hp^ol+rO0lb|jd1j7dDqDU5HA}TsEL`^4)87&=~d(40-0d~bj$)I)&y0y5y5?|DF zD4vsvu^gY#lZ718h!H19MQJSOCJd5EE+IUj=+`w>mlcHL%Sc;}tC@v(zDO2z?Rf0n zV{s!x&_rHNF3D+R#PgYaTmqP)W7tWPlNnNsFW8<+hKf)=mM>bpuP#V!M=`z80r(pZ z7;Z6JFhVp`J)K6l6reLb&IMbxydX;|T1KknK`TiqqowpD4N-?^r0kFl0<*@fv1<;< z1xM9UWvfhzQ`p=7Rj$lkVxnB>)ayeDW(<+&q5+{2sSgN4jFBi4f^vBh+jUKTFm(|A zTM0PASKK|O%w$2_OBI2<^i*M=v@iM#7SPn|J+uq$*oEGMq~gALeR+RBvQRmD=}CKG zl~uSho3*QKHzrF@xrgpE3SVaLGY_~`Zq>2w!UO-qBCmxN=PIuaDX!OOckeL^;!A(Q zF4YFj1OG);IK{o{)P@PY9h<Vf9d2jdU$+zSRp+`V+rNYEaO=<$%1(%Y7xeeJzw8?w z<jxFeU)cepQ08FtKk%0M@4KF~vw~%cOf)c8iqIU-knyNp<46%(Wh3eZlBDT)T{c7m zk<yXZ;54*CBsobky4Jx$cabv&Qc8|f;#tenYBeBwCkxt=28Es|dF`eIr6!hmF{6p4 zZZMM6HN_CYUWSO<Ec{|o76;%!(Jsr~_Q&#HENCQ?LuWA7u_e4>-g2enjEWS?3$=>! z)FaC)Nl8^U3`w#)lBCHw1ROL!qo5MYk<u`YhSifsM4~Nj0XmG0vN$-d<+Phg)Qde7 z<v=SIzl`vL<y@B40<xf8fRfbd43;~k*~+%hxC?YJO=E*rfM`>tQo&TRI}Sv>)Q)zm zYe`@;Hfe8aBx0?2N9YCvP`&?Dn5K*I_t%A?nlNMvk)MM@=J4!B@SN#Cw<(0`!bnXR zF@+=c`uUCE1=D}QUZ?oFaQL}!xY09M?-{N2jMjT%wVv2U&(Z31<Iu=M{9XCma(!&F zHa2NS-g|oSnd2!jM`!LHuFm|@-QNhmQxBi0g-_JOiCQ?Z5uW-ouo;fPaA@@5Qay6A z7CBjuOw}S&8<A<M(|Bv7ItQljB-RtA5Z(-h*JpnV4c0@kS}6AD#t%0i-`of#s<WG( zz#ZSZui@`&1p2>r-z`4$JQ}D+r)trudh~29de$7DefGI|`BU@bE9RA}=4VOss$we0 z^rsqqZ#UhH_uyX)@AYB&7(eFiTe6=w?1Y6m?1nMQ+jr2q4Vp{XjwmgmYuB!ct=l-T z>#2ai<8k;t41a^x`F4f*J233@HK$p|AFO;}+rwk<CCZ+S3YLo$^N`9`FT6{!_PZ48 zyi2VN>-y-E56?)a&z(7a{{6XG%MCW@L(}q>_CJfuXvE?dbRFIr`dG^gDze?MkI^zo zQ)k;VnbVbmiW2xJh_tU8G7L?QW!bF}h7G)6#x^-`o$G(j_5Z{NU+~AbTr7L68DK&K zf4IllV8cJy<Y3<H4mO=ILtb?sY|<}H599K$Nw*|36fyh89`%}i6E$b-PcMA4UHBKf CKsX%$ diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-312.pyc deleted file mode 100644 index abf09e009f055e7f12ecea9f96fb70815c242c9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1434 zcmZ`&OOG2x5bpLo{9uhCJT`13)ItGeq^yT$4k+S4SOtP)kk|w9rPVv#w#S)=>F(KO zmOU)eN^A}&+%_i^P6&kqNB#pRkRo7mLE^;C!jX`2qPlG_VId{Es=BM{tE#S=AKL8} z0*b!;WHj^;`rRCs<SvxihoBrGjyO(Ge=cz!3p`$WEF(Zl*ZMhqhu4J59gYVscMsgY zS3{Q(_YM&EZ`bAleZRy({SR~KRdpqzJmaeJrO<`UB0P7p+yQR>vo5eBq>pXm1(fw# zusw8pVaEs()OK&S2+#+K5EG)bWLgYMqDM><E)rHMB0d&Tq2oLwgIp3uhViz@NLHj< zLXvzy7NvDt7HD%6D*`_~5&$q@MWT;k&l8q$lCqL)36kc~HNi<<Xp389u_jt59cRO? zMd}5$%GGfyDo>f}0xV6J%9Ky;=iw+%MVK<Jw!^pbs7OVoRj5TGhLWZ000j7Qo##7Q zk~1!32xV`FNxT(KN<GT6SGq5~9I9B0^$Clvv7u1mB%Xv6+;}blDPvKr%P?b;?xd7; zNNd?MrijOY?W21u$ZLLf<<l#NJ9pgG8Qh`Buq7>5VD={593g@Fn4^A;V_1N?9lXmu z;f+_80slx*H+guCJFp@?tVpADf=2bYeF|DAcqS^KRK5G+|IKcP#aa=V8Ow-uBRV&) zu7vJNQ&ul}a5;=_SLhTdM`#c4Aqv`@N)+H;fGf`enW-p|3}hRu$^;T38z8C%r7=vA z(%rTHRM}nHo;OiVVEgEor`8VL&s)-*s=AppEW^LbG9}rvE`kDOp)tslG&UY5Xb*pj zAJ}sg)Sv-rh8EOp;gxG%2o8_Joi&_nC1OePuvX@_a}cVY2DXo;K5Djaw63>qbgp-9 z)ek#&8s}_Zfos$4cJxRJ#?5kXn5oTY5H!uBWh@nxRxL`?oEM4FS1A3cV9CN#r<CUr zrLqIbDqoiqz^NMVP0UxxlFA#vhHLo*SieCwtsRJb1THLl4ixnQumkj~`})kq-kGWI zc)>0I>&{o5@4O$$g(-sb_pjbFVh&-VgSzw$$Z23zd-Ll18}!oK8<*aFr+2w(9=9ad zjF0_5Y|1m{Xr^k*xZk)q@9PcuEZmvTS6u)$buh-Wvk0%;MeX05=FiURPtNLH_sOa6 Z<I`WfHbo$AZqAJO>r@j5e<ENO_iy97P~QLm diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-312.pyc deleted file mode 100644 index bbc7d1aa2bbb6f283ec9ea6f1ebd2a9efe25469c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14303 zcmdrzZEPD?a=ZNg6lIDMB}=w8`m*W7lD{SS9L2V5%O8o7#!3#SOTf_NN~TPa%3I0~ zS;bMVMk8I4+D4m7Msc+cXY?YZMSVrlrojEkuOdZ(f(#Q#w{Zajy(_N&<fGEd`A<9Z z-tKZquM}P4AZZuiytlLObKcCnc{7jy>h-!fc%py#hv#>+aNK|3i~3lVOz}T?j+^6R zT#Qd}!z|^8dHQY|Hi@P&n_8um5*vIsB`o9CVJpv>xB)I^zQV;UA~)tKl~Qx>nOSbw z4y{$I*itGY-d}oGb1~~EFS<rd4S-;9*iHMgL0@*!uC?niaiZrvrP{EUmT^ECr>;yD zl&R9n_-GjylyU3IR8y=6uwJoRYkd>NRsq(h!}=+<8nBym*cyuU1GYxjZh&F~fUVVG zYbmx4ut6QRj$-Qp+n{SVNU@s%+b9OLk=0Xd6JWRKT4<oyt$=OTVK-;^knmqfqrng_ zS3N7HNv1!NNSsYa(qdGh9ZfXO7=+h3PUMgqhD|Yk*eqJcC`ajwbHE8PGpxOB#1gY! zv1l~5$DA?S70a+A=8D-Nb!HqPx9lR=bNF0D60@Nr=cF`=MAHJk3eiMFl7x{I5oj3! zzoo^|xF~hXZdOgg(Guh**#?+Nl8l<l2gBjVq6NSlm*E!q!9{M-BwHjgF+z}&B`hxp z_h0ThpBfjt#v^IzV%M=$baGrwrlqd5m=H%vWPGQTjz=$uWM?dODVaz`Vj}6fC?+p< zCF1A0CNk;sspQ_y-Fv#Ecv{>!5s6-ijEYj%M0}zv48>w80xcyY(Re!3MMvH_k&zwY za1<yW4rgoFY;e|{DzXU&hqRyO?m9e0$Z%zI!zt0ZZHCMomj<zA&lESszo$^)EJvJx zg%x(PE}*|f6G5Srt*P{Rktp*gUPRf$;YczD1M-&*h~fk&Q1k(q=I;3F=L7ST1z&s4 z(M}NeFh-Wl5ES~d0olUg6oK(<DjN@?TA?VZMS%SehAgB8UyxwLj$jjj2eCoKx{&nA z$ha5|%dT*EJQbTvVBQlBzdRX9C|`gWu~Zb$=E%9IToqAxb6kYQj>(pDsZ@egVNU@B z^$1WH=y)hO*<f%)sIjC20IqPqu<X5Sbu3wfd24XR#9O_&wtXucr0)lQgGtfM+3M+s zqK&t9tRi4d(y8H!N8zVE$OiZn1pwvJsmP&)$>FdyV++|~j*OH^@uEnwJD)}AQza`S zq|Zmv0{sLsHzr2Yk`PH|ATLcO(w$UbsI*ZMmn}MufwChG2t<t!nFdcVg17;rUsX!A zY^{DE8rSc{vW)AOeF3(%i#CD;B*^Hb5dq2uX+}U7pn~j=;0FXd;3r{KBzyOYg}2r! z)UJI$unN?!Wt7FTUx}z*WiFA#rAS7~b{bKYeR~*W9a@j9b!9`*=-Q2>Q0ZF3=t^1v zS;@2Qh(oXsYpBHQLE;4z;sqG-*y_--#>9IDTBzhm;~hh^!Om`HdphnN3dcHPwwOI; zhA)<wgYFoXkW*H4Q+y;Wz7iED((zO>d&G$1$mp<H2=NhMVnHh`0OQ9;@IyqHAYv>Y zg*~KGc4~Rb+=FG@jq214zana=IZ&`uTo`if$uK3m$deEt6!l8;dag&E6Hms|pv@X_ zWSOvj2Cz`<;}K}0h&p?kTW)BXvAkWycog?4Dtcw(!ZFct{TpO(Tw{<{KGW_rmZ49K ze~)LmAMnPd$5f4?)WC%FtWg#<ZN;PR_ph3!Ol3WrbUkxpIK_%*N-J@e%a}u!!Ta0Q z&2W22z^zh@3FkyG2t*+@nU2DKEnJF7f+VKzZ&wi`kvJ_jnFeJh>Q+5234^Jmcw*5i z+m*ty=h?|*IzBEQCnQB=8>=fjHCAB@YNq=oQ+}w#C8VYx2u#VN23li9+3tP}t3&|6 zin{BT+*|YRtvPqc9skx`^QnUWbk1}7u8LoBw}0erU#@Rms(&<J|L9Wv{(SxZLVfql zsbyb%&L`ZdYss}fRj3=xRSz!L1n2s$_br49HIL;ykKL`Qr<@XU8EH$|md;GXlcTZ& zjl9UYgeZHDg1K>A6(OchQT-a~)b02IK_C32LjX{xo<X(Hy3p~{t{->Ze*AXV2m5k+ z2J$T@aYJkUaHxpMip^zhpqc|x)Etm7md56y@Y5cZn~Dp7dZR*jh?WsPW)iJNCknvg zGE_XG1JxINGdN4ES0iTDpD|)!#g15JIOyGW#XIbp;a=f~-Df%2OM?%}aTv%fW*<j& zWTbk|1G}CR#iT$YaS6CNH6j2{3Si=nBUfW(Fm8Ps1JdTCP6LgEQc5NNAY|U*-{9xC z*)pw^)(qiU(-ikM$lDALbKtKyR5|3qAckE!swf0XJ!}>YsUmK%??9t^yK=VDu3Y40 zS6qrG!3<AEMX;-Rkvt9+nckbG0&?GRC=nSy7mM^|_pCuLP5E^mN~Az&q&~>7Ixk>r zxVE29bGHt@8@b(FXgxB`jI2d7?M${xlM^B#$h&|-+m_*-pgr&i5e_qneTfZ-7R<s% zT&aU8v9+-bVb5r7{BD|Csp5pL8Oz6xraKPrtUd3jFEkwa#Br4J@uJ62;G8AV>VZ~d z>vKuisbtF#tTDkwldVIO6A3s{VBV{YH7eqP0Jf5ofR%7%4l^}_B1aJX0e-;E=W~?6 z0T`OM?w;FW?dR_{G~aBx(X{OGUp+H>X5O3kbYT9;*(c}gZZ_U%TzE0xu=n=aTtiRZ z)4O8kz2CWKHg9&VSh4bohjUf^){EJD96~0e*yI0c87=L#$yB;zF)%r$W&_G86S#6S zVMDS?IqjQ}&#ka9Ys;sHQ%-*5Fq9)l0qA9t;GUE{pozePq|wCSL6Jlgqll*~6v^!E zM{b7;+m7d2k1JA1j>9K10Kh=%+BVYVIqYB^$vggu;{@Z*Q`pth*p*IFP(TO*6q1sp zoY5p@;HyZ=KuJ;tsH6-il7c-NOUiBd@@?JCz`k~Xuf`1)wi7ID58d6ou)DcrMRF#S z2@!N?`IeMD_^h(Sp#haB7aXv(*4y6xABc=0P1X^aSAYWuZYYdxHy|PF_b`D?J*Tzz zjh+o8K4W?arvtNUmB6{=3r`1&mO-)$rawe>BN6r>peJ0kh{`Q<MdPeRPiCTLp_+uk zyS9nGV&keCmwYXGU(1p&^pP(F=J(w|^HN}2KCo>musa{vT?p)*aW1<9Id_xZxL@|w zT)jMdc|Kn7ZO=KjQx*tS8QBcvG)@Gq1#$+#lL*jMAWtEn#(Bx>F^ITI<@a4gA{d9C zgn*g}#~!Nk`wYwk(1QWDHAD@2NZ$|qmV<=xH}-F=3U9%ea+kn2Yu1BFZyg4Abh#4D zSV8@5(YC6R>WfAuC6Sp9zfu(-^)6)4lE?EVEg`9IiW<}!5I{8=n*1&oaIG+e4V)LF z7vNApTf_5!+7@kDeJN`(hDQh@Mkk3BzbGa$!gi*VN8-sC9QkO|We$)yYdv~CLUZ8q zLt7`A5?;ddHcm18QixVtQ&(@qAp&0KT5X_8!}Np`VjgJPxZXv=Ec1?a39o6{tH|JJ z>{Ii+WB-ih6Gsc<KVyApfwHI{ivJDZYxI>o`Q^0X>$}pLPh`qu6juSgi1V#@R98Pi zJ#1JHJu$EIZ|$N!m28LVQ(51mGISzjCwrkUf{sA49|1Z)$PoZC9<3Oo5VW#FIv0s- zhBY^Ek$mB@GF3be%}GfB2C8_V;6Iu3oUHVg__r+i+w=bRC4X1m-&OGMp6Orq*Iw(o zQ?q40dUO27_`5?(I|uSR2R^Pjx!l;iT-Pu+etrC!dBx7v)LrjdadFkm5ghV<b*=1z zp))S@V(vv1%s@uE0N@ID&t$PWR_f@v&2HWQrH^e;m!8^+Ud;L3igz1QbhALh#(_g9 z)5a(W_!MIR%C#{#SPVmYfHh#f-@|F^(}bGE60(o#^d~A#hBo%iQa7A|4`d@sh&&3D zB#!}jP}9^`3`)~2i&&=<0S1>!VUIH3tENxTzW@64i4+34S3P6UllrWoWi%b4mg6|p zBdc0i;9WH>nwbR!?$Amp4?#_grees4xZ$OYaOjK48W4_2?_Xnav|<dTSM_!JHdmNY z)QkD(Qp^5)%l@U7L;03Ng_gcT%@aA#6RJ~l(a@>MOr>7vPBtHb@FBI0sFj4Htc+|R zw-W?^1wZL90Cb@2*Sjze{Nur&9lZV62bSEPWBHcj%#GQmxH0XD8xvBLFGv`7V3Xgt zd?^uR2r1xMUXigK#xh34k;!yL_~Yvmu_jH#O5@VR?4N*g8yB;`gVJB4nC*DjVun7L zjERimB+nx-mZdc)#N_GcP)~Xaz{ce%*f@9j`sIZSOC7!Wj^3q?!}*TGg^r_zV1KTr zKj-OJMT(#wr&31nz(5fE1N<}@+4q%Y1e+|A5mliTaTJx#5hv$_3q26{Gv14A=++0P z#d=?@G1G`mbK2XfTf+fv4Trp0<H(Y2Iu0HVxUiAkqZ61ii&-fkh<HB$Y<Te3N77)b zOPzzVUHK?mDUOB4(a=;M3uN%U*au!Jbk)CMLuWl{n=+9Wy?=cSH?)e!C>-|}a5?Ko zTCnT~JhW9CGo{h&rBBS9cBpv>U7*|Fa>etidCL5%B{>Ma?nomq(#L3DF9qU$Xj`XU z8?<YMcCAxZX!py`#HOD~8WlHvX6+EPc!cAoEb6vJ!xi?yY$pT*(~%44wT*-2K!k0| z0&K%|*+v&(+hcH?fonu?#f4d|$Zy7h4gtQPBXyS7FNNCah3%Z`N`>Q$8Ll9~;f314 z1nTL1s<K-dMtCF{&GxL#Wt#dcxmI;GKgMP;U<KaQ<>1y^tqbv=bmoJ*a@D)&c2hP9 zoE44M;FeqN4W8x4^gIaP@kv`*3UuYvDORTHogp*ZPbH{9E&@;{E?Xu@YP4+TPD*n+ z?~+gX0qHWDHwqEf`xM%z!4{bHonYhqv74uFoW3Q!+xwHtg{A|AV0W&%n@&Hw7gm2f zE<w;~RM-tx<I9tAh~WznGD>f388QQ08gOFRg@$=)WQE!J)U|>}gKQ$AY=?mI1O$)C z37qjxoUwyNlW?gCrNbr6p@BruWkfOvP6Cin-h`L%5Pw)7Woq338~h8_{}F)u)7(85 z=c&0qdB@*4pT2qd#^t5v1Nr6yxvkx~ZZX$1Qt*%FJfrt)PzY4AclWJV!9?-y{(0at zOu$9e&^CMO7heCJn%cR8*ALE%g_^dRV_3B3){9uQ=kL>4v<Hi}%%1wCK|f=;rV9ms zBIil`Qi*lVH+<q~rPN<E4GxB!hKD2?<8nMruVX|Klwp{|Y7l1jfSc-NL?ZZS_(@1` z>ZUrh;^0C%mpgXcvo~1V?rsXsHD7ODsL5|?U$FuLeQ<SGUz>exUdsDgSFj9JfUuPl za`!j@%p${vjdvSdHN)M;^)PoE>QAzY4#lbNq`Qv`b|1IARbz<qn2VwTvisE?$iT0z zlrh?bNQp(MrqheQw*8<38nz!Z1a%?Do>>d1Sx^daqs63p5_nJ!M%&I0%`;{eL5ABe z+E&G4$ZC6-qK-kSD%Jr&tz_ab1RaM?Zt;J@mts>c_#QILRuEn(EZZ+!Vi^xuvD#%E z#gm{2)iJ1%?OmUS26{$~Ca*wsDF6V}%+IDicrMrd{D-6Y?&ouRpPy!DJ@8~`;!g!V zWUbTze+>1R(BniaC4Som2ls0nN*e$OFR!{dXB7=A&j%OUKXz=t%Z#`g&!-K~e@m_a zeG_he@_i)r9t7P;F63&Ux9;A}7gL+r(Z9j!5da&vqrZxKpInBnLhdycC3y|L>vSYN zxY9GLp|*S-OC$Id{G{&zpxW|@lD2eMzsr}aOT<*_ONv8<`I(bu11`mZ4=FnEAz=y> z`zlkQs6+56V$|h9myzzyo>jTChqu4+&YnF3clJmSs%3Ypx~<%0jsk-*_-G2;)p(l^ zz2p}oiFmA2wksbM=MRr#P##o3sO!GqO5Q9KSycSZm@ji?;3lu$b%uMcn&vP;M@1)m zq&65xpoh`L2B-%w;URI5HH(J<;6<F0A*o)u0fnk5Oemy0#|&IEMi+9>4O{F4@D6{5 z<M9y8y$J5OS9uet)LHEy@aOy-&vS28S>RsJ-<U7)^y)V~;VqhFQ|B(3C+x~QlOv{5 z?>i5Tib?U63DTEsXS$0~f(cH^M%9YhkT`hr`tx6-9{tGQvk<wy``Y*C`ttss-_fh~ zf8?))`@e8;8k{mnbluVSC7tvtH#znF!QV%?Vm&sF*UbF|f6u%7{`Sz~p^yDN1z%6j z(ZlQzhoNYpKCX<C;U2>l&x<)^L<;@~G7`E4(Fyb&Jm5AjY(|Gq^KA<{e41C_=5?=f z<F%LFc<p5kVH*!sIyOOr*)F|wBoZ|K^Pp%%;FcJZ4Mtd$fbtt$8<7k0CR8JD0a#lc z5(!NlJg_L_ZLG2pcj#d#_^p%zat$Y}XMXahfYI2V&Uj6>uSO#L8I&jQ0HEBRNNj|= zb<O&)jX7+C5)xw_l^z)61^V9wCzRC~wD<R7P;4XANVZ^8QwXSW?j8ExGsnaICy)1^ zIW;&S2jI^soywn6I@Ld?u)ornj~wl1e_l9)wR;iZ7A3ooM>BYDbckNCSO11X|1m&s zg3BI7htQkw^u{Q?wMH-G(7-eciNvtYaRe_TcpU+iO*;Q_p@kcS>@OO9<Q9|zx^R*U zAY5VN`C<#lyFcZepK{*2X6KSQ_>npI@0Pu*HaFjKt!6HGJqV!?zGJ0{s|s9wVfKaj z9Sb8rP5n5P>mJA*IQd~)?!aKa<LTVyr}N%trd_Kx3txNf;3@~ny(-Sv_-1n2jmW^Y z(})ZJvU<y#uT6VaZPk3k{N_~-lGP43-_Pf^?!vD6`PC*jKfvc&_TlRQyw>v}`UdIh zfkwV|0osCO^^liuxHh)RL9!|UnBSq~oA|ceBYRglNLTxUP`mw!RSweCeRjV0nhTuI PeD7+2=0C$cWvBlIP%Wrm diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-312.pyc deleted file mode 100644 index ac973c5e335d2d917f480c93ddd2ed40e4a289a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5590 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 Gmj5r&Zg?>O diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-312.pyc deleted file mode 100644 index 9e9f1f6ffb9110fbba1272ccd8d9dc924fa9bc77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2608 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 F%fBPnay9?} diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-312.pyc deleted file mode 100644 index 7253ccda4d64702877a245b31e89fa57d2af3742..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12435 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 AQUCw| diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/_asyncio.py b/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/_asyncio.py deleted file mode 100644 index 2e50cd7..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/_asyncio.py +++ /dev/null @@ -1,94 +0,0 @@ -# Copyright 2016 Étienne Bersac -# Copyright 2016 Julien Danjou -# Copyright 2016 Joshua Harlow -# Copyright 2013-2014 Ray Holder -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import functools -import sys -import typing as t -from asyncio import sleep - -from pip._vendor.tenacity import AttemptManager -from pip._vendor.tenacity import BaseRetrying -from pip._vendor.tenacity import DoAttempt -from pip._vendor.tenacity import DoSleep -from pip._vendor.tenacity import RetryCallState - -WrappedFnReturnT = t.TypeVar("WrappedFnReturnT") -WrappedFn = t.TypeVar("WrappedFn", bound=t.Callable[..., t.Awaitable[t.Any]]) - - -class AsyncRetrying(BaseRetrying): - sleep: t.Callable[[float], t.Awaitable[t.Any]] - - def __init__(self, sleep: t.Callable[[float], t.Awaitable[t.Any]] = sleep, **kwargs: t.Any) -> None: - super().__init__(**kwargs) - self.sleep = sleep - - async def __call__( # type: ignore[override] - self, fn: WrappedFn, *args: t.Any, **kwargs: t.Any - ) -> WrappedFnReturnT: - self.begin() - - retry_state = RetryCallState(retry_object=self, fn=fn, args=args, kwargs=kwargs) - while True: - do = self.iter(retry_state=retry_state) - if isinstance(do, DoAttempt): - try: - result = await fn(*args, **kwargs) - except BaseException: # noqa: B902 - retry_state.set_exception(sys.exc_info()) # type: ignore[arg-type] - else: - retry_state.set_result(result) - elif isinstance(do, DoSleep): - retry_state.prepare_for_next_attempt() - await self.sleep(do) - else: - return do # type: ignore[no-any-return] - - def __iter__(self) -> t.Generator[AttemptManager, None, None]: - raise TypeError("AsyncRetrying object is not iterable") - - def __aiter__(self) -> "AsyncRetrying": - self.begin() - self._retry_state = RetryCallState(self, fn=None, args=(), kwargs={}) - return self - - async def __anext__(self) -> AttemptManager: - while True: - do = self.iter(retry_state=self._retry_state) - if do is None: - raise StopAsyncIteration - elif isinstance(do, DoAttempt): - return AttemptManager(retry_state=self._retry_state) - elif isinstance(do, DoSleep): - self._retry_state.prepare_for_next_attempt() - await self.sleep(do) - else: - raise StopAsyncIteration - - def wraps(self, fn: WrappedFn) -> WrappedFn: - fn = super().wraps(fn) - # Ensure wrapper is recognized as a coroutine function. - - @functools.wraps(fn) - async def async_wrapped(*args: t.Any, **kwargs: t.Any) -> t.Any: - return await fn(*args, **kwargs) - - # Preserve attributes - async_wrapped.retry = fn.retry # type: ignore[attr-defined] - async_wrapped.retry_with = fn.retry_with # type: ignore[attr-defined] - - return async_wrapped # type: ignore[return-value] diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/_utils.py b/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/_utils.py deleted file mode 100644 index f14ff32..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/_utils.py +++ /dev/null @@ -1,76 +0,0 @@ -# Copyright 2016 Julien Danjou -# Copyright 2016 Joshua Harlow -# Copyright 2013-2014 Ray Holder -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import sys -import typing -from datetime import timedelta - - -# sys.maxsize: -# An integer giving the maximum value a variable of type Py_ssize_t can take. -MAX_WAIT = sys.maxsize / 2 - - -def find_ordinal(pos_num: int) -> str: - # See: https://en.wikipedia.org/wiki/English_numerals#Ordinal_numbers - if pos_num == 0: - return "th" - elif pos_num == 1: - return "st" - elif pos_num == 2: - return "nd" - elif pos_num == 3: - return "rd" - elif 4 <= pos_num <= 20: - return "th" - else: - return find_ordinal(pos_num % 10) - - -def to_ordinal(pos_num: int) -> str: - return f"{pos_num}{find_ordinal(pos_num)}" - - -def get_callback_name(cb: typing.Callable[..., typing.Any]) -> str: - """Get a callback fully-qualified name. - - If no name can be produced ``repr(cb)`` is called and returned. - """ - segments = [] - try: - segments.append(cb.__qualname__) - except AttributeError: - try: - segments.append(cb.__name__) - except AttributeError: - pass - if not segments: - return repr(cb) - else: - try: - # When running under sphinx it appears this can be none? - if cb.__module__: - segments.insert(0, cb.__module__) - except AttributeError: - pass - return ".".join(segments) - - -time_unit_type = typing.Union[int, float, timedelta] - - -def to_seconds(time_unit: time_unit_type) -> float: - return float(time_unit.total_seconds() if isinstance(time_unit, timedelta) else time_unit) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/after.py b/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/after.py deleted file mode 100644 index 574c9bc..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/after.py +++ /dev/null @@ -1,51 +0,0 @@ -# Copyright 2016 Julien Danjou -# Copyright 2016 Joshua Harlow -# Copyright 2013-2014 Ray Holder -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import typing - -from pip._vendor.tenacity import _utils - -if typing.TYPE_CHECKING: - import logging - - from pip._vendor.tenacity import RetryCallState - - -def after_nothing(retry_state: "RetryCallState") -> None: - """After call strategy that does nothing.""" - - -def after_log( - logger: "logging.Logger", - log_level: int, - sec_format: str = "%0.3f", -) -> typing.Callable[["RetryCallState"], None]: - """After call strategy that logs to some logger the finished attempt.""" - - def log_it(retry_state: "RetryCallState") -> None: - if retry_state.fn is None: - # NOTE(sileht): can't really happen, but we must please mypy - fn_name = "<unknown>" - else: - fn_name = _utils.get_callback_name(retry_state.fn) - logger.log( - log_level, - f"Finished call to '{fn_name}' " - f"after {sec_format % retry_state.seconds_since_start}(s), " - f"this was the {_utils.to_ordinal(retry_state.attempt_number)} time calling it.", - ) - - return log_it diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/before.py b/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/before.py deleted file mode 100644 index cfd7dc7..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/before.py +++ /dev/null @@ -1,46 +0,0 @@ -# Copyright 2016 Julien Danjou -# Copyright 2016 Joshua Harlow -# Copyright 2013-2014 Ray Holder -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import typing - -from pip._vendor.tenacity import _utils - -if typing.TYPE_CHECKING: - import logging - - from pip._vendor.tenacity import RetryCallState - - -def before_nothing(retry_state: "RetryCallState") -> None: - """Before call strategy that does nothing.""" - - -def before_log(logger: "logging.Logger", log_level: int) -> typing.Callable[["RetryCallState"], None]: - """Before call strategy that logs to some logger the attempt.""" - - def log_it(retry_state: "RetryCallState") -> None: - if retry_state.fn is None: - # NOTE(sileht): can't really happen, but we must please mypy - fn_name = "<unknown>" - else: - fn_name = _utils.get_callback_name(retry_state.fn) - logger.log( - log_level, - f"Starting call to '{fn_name}', " - f"this is the {_utils.to_ordinal(retry_state.attempt_number)} time calling it.", - ) - - return log_it diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/before_sleep.py b/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/before_sleep.py deleted file mode 100644 index 8c6167f..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/before_sleep.py +++ /dev/null @@ -1,71 +0,0 @@ -# Copyright 2016 Julien Danjou -# Copyright 2016 Joshua Harlow -# Copyright 2013-2014 Ray Holder -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import typing - -from pip._vendor.tenacity import _utils - -if typing.TYPE_CHECKING: - import logging - - from pip._vendor.tenacity import RetryCallState - - -def before_sleep_nothing(retry_state: "RetryCallState") -> None: - """Before call strategy that does nothing.""" - - -def before_sleep_log( - logger: "logging.Logger", - log_level: int, - exc_info: bool = False, -) -> typing.Callable[["RetryCallState"], None]: - """Before call strategy that logs to some logger the attempt.""" - - def log_it(retry_state: "RetryCallState") -> None: - local_exc_info: BaseException | bool | None - - if retry_state.outcome is None: - raise RuntimeError("log_it() called before outcome was set") - - if retry_state.next_action is None: - raise RuntimeError("log_it() called before next_action was set") - - if retry_state.outcome.failed: - ex = retry_state.outcome.exception() - verb, value = "raised", f"{ex.__class__.__name__}: {ex}" - - if exc_info: - local_exc_info = retry_state.outcome.exception() - else: - local_exc_info = False - else: - verb, value = "returned", retry_state.outcome.result() - local_exc_info = False # exc_info does not apply when no exception - - if retry_state.fn is None: - # NOTE(sileht): can't really happen, but we must please mypy - fn_name = "<unknown>" - else: - fn_name = _utils.get_callback_name(retry_state.fn) - - logger.log( - log_level, - f"Retrying {fn_name} " f"in {retry_state.next_action.sleep} seconds as it {verb} {value}.", - exc_info=local_exc_info, - ) - - return log_it diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/nap.py b/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/nap.py deleted file mode 100644 index 72aa5bf..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/nap.py +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright 2016 Étienne Bersac -# Copyright 2016 Julien Danjou -# Copyright 2016 Joshua Harlow -# Copyright 2013-2014 Ray Holder -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import time -import typing - -if typing.TYPE_CHECKING: - import threading - - -def sleep(seconds: float) -> None: - """ - Sleep strategy that delays execution for a given number of seconds. - - This is the default strategy, and may be mocked out for unit testing. - """ - time.sleep(seconds) - - -class sleep_using_event: - """Sleep strategy that waits on an event to be set.""" - - def __init__(self, event: "threading.Event") -> None: - self.event = event - - def __call__(self, timeout: typing.Optional[float]) -> None: - # NOTE(harlowja): this may *not* actually wait for timeout - # seconds if the event is set (ie this may eject out early). - self.event.wait(timeout=timeout) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/retry.py b/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/retry.py deleted file mode 100644 index 3898873..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/retry.py +++ /dev/null @@ -1,272 +0,0 @@ -# Copyright 2016–2021 Julien Danjou -# Copyright 2016 Joshua Harlow -# Copyright 2013-2014 Ray Holder -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import abc -import re -import typing - -if typing.TYPE_CHECKING: - from pip._vendor.tenacity import RetryCallState - - -class retry_base(abc.ABC): - """Abstract base class for retry strategies.""" - - @abc.abstractmethod - def __call__(self, retry_state: "RetryCallState") -> bool: - pass - - def __and__(self, other: "retry_base") -> "retry_all": - return retry_all(self, other) - - def __or__(self, other: "retry_base") -> "retry_any": - return retry_any(self, other) - - -RetryBaseT = typing.Union[retry_base, typing.Callable[["RetryCallState"], bool]] - - -class _retry_never(retry_base): - """Retry strategy that never rejects any result.""" - - def __call__(self, retry_state: "RetryCallState") -> bool: - return False - - -retry_never = _retry_never() - - -class _retry_always(retry_base): - """Retry strategy that always rejects any result.""" - - def __call__(self, retry_state: "RetryCallState") -> bool: - return True - - -retry_always = _retry_always() - - -class retry_if_exception(retry_base): - """Retry strategy that retries if an exception verifies a predicate.""" - - def __init__(self, predicate: typing.Callable[[BaseException], bool]) -> None: - self.predicate = predicate - - def __call__(self, retry_state: "RetryCallState") -> bool: - if retry_state.outcome is None: - raise RuntimeError("__call__() called before outcome was set") - - if retry_state.outcome.failed: - exception = retry_state.outcome.exception() - if exception is None: - raise RuntimeError("outcome failed but the exception is None") - return self.predicate(exception) - else: - return False - - -class retry_if_exception_type(retry_if_exception): - """Retries if an exception has been raised of one or more types.""" - - def __init__( - self, - exception_types: typing.Union[ - typing.Type[BaseException], - typing.Tuple[typing.Type[BaseException], ...], - ] = Exception, - ) -> None: - self.exception_types = exception_types - super().__init__(lambda e: isinstance(e, exception_types)) - - -class retry_if_not_exception_type(retry_if_exception): - """Retries except an exception has been raised of one or more types.""" - - def __init__( - self, - exception_types: typing.Union[ - typing.Type[BaseException], - typing.Tuple[typing.Type[BaseException], ...], - ] = Exception, - ) -> None: - self.exception_types = exception_types - super().__init__(lambda e: not isinstance(e, exception_types)) - - -class retry_unless_exception_type(retry_if_exception): - """Retries until an exception is raised of one or more types.""" - - def __init__( - self, - exception_types: typing.Union[ - typing.Type[BaseException], - typing.Tuple[typing.Type[BaseException], ...], - ] = Exception, - ) -> None: - self.exception_types = exception_types - super().__init__(lambda e: not isinstance(e, exception_types)) - - def __call__(self, retry_state: "RetryCallState") -> bool: - if retry_state.outcome is None: - raise RuntimeError("__call__() called before outcome was set") - - # always retry if no exception was raised - if not retry_state.outcome.failed: - return True - - exception = retry_state.outcome.exception() - if exception is None: - raise RuntimeError("outcome failed but the exception is None") - return self.predicate(exception) - - -class retry_if_exception_cause_type(retry_base): - """Retries if any of the causes of the raised exception is of one or more types. - - The check on the type of the cause of the exception is done recursively (until finding - an exception in the chain that has no `__cause__`) - """ - - def __init__( - self, - exception_types: typing.Union[ - typing.Type[BaseException], - typing.Tuple[typing.Type[BaseException], ...], - ] = Exception, - ) -> None: - self.exception_cause_types = exception_types - - def __call__(self, retry_state: "RetryCallState") -> bool: - if retry_state.outcome is None: - raise RuntimeError("__call__ called before outcome was set") - - if retry_state.outcome.failed: - exc = retry_state.outcome.exception() - while exc is not None: - if isinstance(exc.__cause__, self.exception_cause_types): - return True - exc = exc.__cause__ - - return False - - -class retry_if_result(retry_base): - """Retries if the result verifies a predicate.""" - - def __init__(self, predicate: typing.Callable[[typing.Any], bool]) -> None: - self.predicate = predicate - - def __call__(self, retry_state: "RetryCallState") -> bool: - if retry_state.outcome is None: - raise RuntimeError("__call__() called before outcome was set") - - if not retry_state.outcome.failed: - return self.predicate(retry_state.outcome.result()) - else: - return False - - -class retry_if_not_result(retry_base): - """Retries if the result refutes a predicate.""" - - def __init__(self, predicate: typing.Callable[[typing.Any], bool]) -> None: - self.predicate = predicate - - def __call__(self, retry_state: "RetryCallState") -> bool: - if retry_state.outcome is None: - raise RuntimeError("__call__() called before outcome was set") - - if not retry_state.outcome.failed: - return not self.predicate(retry_state.outcome.result()) - else: - return False - - -class retry_if_exception_message(retry_if_exception): - """Retries if an exception message equals or matches.""" - - def __init__( - self, - message: typing.Optional[str] = None, - match: typing.Optional[str] = None, - ) -> None: - if message and match: - raise TypeError(f"{self.__class__.__name__}() takes either 'message' or 'match', not both") - - # set predicate - if message: - - def message_fnc(exception: BaseException) -> bool: - return message == str(exception) - - predicate = message_fnc - elif match: - prog = re.compile(match) - - def match_fnc(exception: BaseException) -> bool: - return bool(prog.match(str(exception))) - - predicate = match_fnc - else: - raise TypeError(f"{self.__class__.__name__}() missing 1 required argument 'message' or 'match'") - - super().__init__(predicate) - - -class retry_if_not_exception_message(retry_if_exception_message): - """Retries until an exception message equals or matches.""" - - def __init__( - self, - message: typing.Optional[str] = None, - match: typing.Optional[str] = None, - ) -> None: - super().__init__(message, match) - # invert predicate - if_predicate = self.predicate - self.predicate = lambda *args_, **kwargs_: not if_predicate(*args_, **kwargs_) - - def __call__(self, retry_state: "RetryCallState") -> bool: - if retry_state.outcome is None: - raise RuntimeError("__call__() called before outcome was set") - - if not retry_state.outcome.failed: - return True - - exception = retry_state.outcome.exception() - if exception is None: - raise RuntimeError("outcome failed but the exception is None") - return self.predicate(exception) - - -class retry_any(retry_base): - """Retries if any of the retries condition is valid.""" - - def __init__(self, *retries: retry_base) -> None: - self.retries = retries - - def __call__(self, retry_state: "RetryCallState") -> bool: - return any(r(retry_state) for r in self.retries) - - -class retry_all(retry_base): - """Retries if all the retries condition are valid.""" - - def __init__(self, *retries: retry_base) -> None: - self.retries = retries - - def __call__(self, retry_state: "RetryCallState") -> bool: - return all(r(retry_state) for r in self.retries) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/stop.py b/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/stop.py deleted file mode 100644 index bb23eff..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/stop.py +++ /dev/null @@ -1,103 +0,0 @@ -# Copyright 2016–2021 Julien Danjou -# Copyright 2016 Joshua Harlow -# Copyright 2013-2014 Ray Holder -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -import abc -import typing - -from pip._vendor.tenacity import _utils - -if typing.TYPE_CHECKING: - import threading - - from pip._vendor.tenacity import RetryCallState - - -class stop_base(abc.ABC): - """Abstract base class for stop strategies.""" - - @abc.abstractmethod - def __call__(self, retry_state: "RetryCallState") -> bool: - pass - - def __and__(self, other: "stop_base") -> "stop_all": - return stop_all(self, other) - - def __or__(self, other: "stop_base") -> "stop_any": - return stop_any(self, other) - - -StopBaseT = typing.Union[stop_base, typing.Callable[["RetryCallState"], bool]] - - -class stop_any(stop_base): - """Stop if any of the stop condition is valid.""" - - def __init__(self, *stops: stop_base) -> None: - self.stops = stops - - def __call__(self, retry_state: "RetryCallState") -> bool: - return any(x(retry_state) for x in self.stops) - - -class stop_all(stop_base): - """Stop if all the stop conditions are valid.""" - - def __init__(self, *stops: stop_base) -> None: - self.stops = stops - - def __call__(self, retry_state: "RetryCallState") -> bool: - return all(x(retry_state) for x in self.stops) - - -class _stop_never(stop_base): - """Never stop.""" - - def __call__(self, retry_state: "RetryCallState") -> bool: - return False - - -stop_never = _stop_never() - - -class stop_when_event_set(stop_base): - """Stop when the given event is set.""" - - def __init__(self, event: "threading.Event") -> None: - self.event = event - - def __call__(self, retry_state: "RetryCallState") -> bool: - return self.event.is_set() - - -class stop_after_attempt(stop_base): - """Stop when the previous attempt >= max_attempt.""" - - def __init__(self, max_attempt_number: int) -> None: - self.max_attempt_number = max_attempt_number - - def __call__(self, retry_state: "RetryCallState") -> bool: - return retry_state.attempt_number >= self.max_attempt_number - - -class stop_after_delay(stop_base): - """Stop when the time from the first attempt >= limit.""" - - def __init__(self, max_delay: _utils.time_unit_type) -> None: - self.max_delay = _utils.to_seconds(max_delay) - - def __call__(self, retry_state: "RetryCallState") -> bool: - if retry_state.seconds_since_start is None: - raise RuntimeError("__call__() called but seconds_since_start is not set") - return retry_state.seconds_since_start >= self.max_delay diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/tornadoweb.py b/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/tornadoweb.py deleted file mode 100644 index e19c30b..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/tornadoweb.py +++ /dev/null @@ -1,59 +0,0 @@ -# Copyright 2017 Elisey Zanko -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import sys -import typing - -from pip._vendor.tenacity import BaseRetrying -from pip._vendor.tenacity import DoAttempt -from pip._vendor.tenacity import DoSleep -from pip._vendor.tenacity import RetryCallState - -from tornado import gen - -if typing.TYPE_CHECKING: - from tornado.concurrent import Future - -_RetValT = typing.TypeVar("_RetValT") - - -class TornadoRetrying(BaseRetrying): - def __init__(self, sleep: "typing.Callable[[float], Future[None]]" = gen.sleep, **kwargs: typing.Any) -> None: - super().__init__(**kwargs) - self.sleep = sleep - - @gen.coroutine # type: ignore[misc] - def __call__( - self, - fn: "typing.Callable[..., typing.Union[typing.Generator[typing.Any, typing.Any, _RetValT], Future[_RetValT]]]", - *args: typing.Any, - **kwargs: typing.Any, - ) -> "typing.Generator[typing.Any, typing.Any, _RetValT]": - self.begin() - - retry_state = RetryCallState(retry_object=self, fn=fn, args=args, kwargs=kwargs) - while True: - do = self.iter(retry_state=retry_state) - if isinstance(do, DoAttempt): - try: - result = yield fn(*args, **kwargs) - except BaseException: # noqa: B902 - retry_state.set_exception(sys.exc_info()) # type: ignore[arg-type] - else: - retry_state.set_result(result) - elif isinstance(do, DoSleep): - retry_state.prepare_for_next_attempt() - yield self.sleep(do) - else: - raise gen.Return(do) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/wait.py b/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/wait.py deleted file mode 100644 index f9349c0..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/wait.py +++ /dev/null @@ -1,228 +0,0 @@ -# Copyright 2016–2021 Julien Danjou -# Copyright 2016 Joshua Harlow -# Copyright 2013-2014 Ray Holder -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import abc -import random -import typing - -from pip._vendor.tenacity import _utils - -if typing.TYPE_CHECKING: - from pip._vendor.tenacity import RetryCallState - - -class wait_base(abc.ABC): - """Abstract base class for wait strategies.""" - - @abc.abstractmethod - def __call__(self, retry_state: "RetryCallState") -> float: - pass - - def __add__(self, other: "wait_base") -> "wait_combine": - return wait_combine(self, other) - - def __radd__(self, other: "wait_base") -> typing.Union["wait_combine", "wait_base"]: - # make it possible to use multiple waits with the built-in sum function - if other == 0: # type: ignore[comparison-overlap] - return self - return self.__add__(other) - - -WaitBaseT = typing.Union[wait_base, typing.Callable[["RetryCallState"], typing.Union[float, int]]] - - -class wait_fixed(wait_base): - """Wait strategy that waits a fixed amount of time between each retry.""" - - def __init__(self, wait: _utils.time_unit_type) -> None: - self.wait_fixed = _utils.to_seconds(wait) - - def __call__(self, retry_state: "RetryCallState") -> float: - return self.wait_fixed - - -class wait_none(wait_fixed): - """Wait strategy that doesn't wait at all before retrying.""" - - def __init__(self) -> None: - super().__init__(0) - - -class wait_random(wait_base): - """Wait strategy that waits a random amount of time between min/max.""" - - def __init__(self, min: _utils.time_unit_type = 0, max: _utils.time_unit_type = 1) -> None: # noqa - self.wait_random_min = _utils.to_seconds(min) - self.wait_random_max = _utils.to_seconds(max) - - def __call__(self, retry_state: "RetryCallState") -> float: - return self.wait_random_min + (random.random() * (self.wait_random_max - self.wait_random_min)) - - -class wait_combine(wait_base): - """Combine several waiting strategies.""" - - def __init__(self, *strategies: wait_base) -> None: - self.wait_funcs = strategies - - def __call__(self, retry_state: "RetryCallState") -> float: - return sum(x(retry_state=retry_state) for x in self.wait_funcs) - - -class wait_chain(wait_base): - """Chain two or more waiting strategies. - - If all strategies are exhausted, the very last strategy is used - thereafter. - - For example:: - - @retry(wait=wait_chain(*[wait_fixed(1) for i in range(3)] + - [wait_fixed(2) for j in range(5)] + - [wait_fixed(5) for k in range(4))) - def wait_chained(): - print("Wait 1s for 3 attempts, 2s for 5 attempts and 5s - thereafter.") - """ - - def __init__(self, *strategies: wait_base) -> None: - self.strategies = strategies - - def __call__(self, retry_state: "RetryCallState") -> float: - wait_func_no = min(max(retry_state.attempt_number, 1), len(self.strategies)) - wait_func = self.strategies[wait_func_no - 1] - return wait_func(retry_state=retry_state) - - -class wait_incrementing(wait_base): - """Wait an incremental amount of time after each attempt. - - Starting at a starting value and incrementing by a value for each attempt - (and restricting the upper limit to some maximum value). - """ - - def __init__( - self, - start: _utils.time_unit_type = 0, - increment: _utils.time_unit_type = 100, - max: _utils.time_unit_type = _utils.MAX_WAIT, # noqa - ) -> None: - self.start = _utils.to_seconds(start) - self.increment = _utils.to_seconds(increment) - self.max = _utils.to_seconds(max) - - def __call__(self, retry_state: "RetryCallState") -> float: - result = self.start + (self.increment * (retry_state.attempt_number - 1)) - return max(0, min(result, self.max)) - - -class wait_exponential(wait_base): - """Wait strategy that applies exponential backoff. - - It allows for a customized multiplier and an ability to restrict the - upper and lower limits to some maximum and minimum value. - - The intervals are fixed (i.e. there is no jitter), so this strategy is - suitable for balancing retries against latency when a required resource is - unavailable for an unknown duration, but *not* suitable for resolving - contention between multiple processes for a shared resource. Use - wait_random_exponential for the latter case. - """ - - def __init__( - self, - multiplier: typing.Union[int, float] = 1, - max: _utils.time_unit_type = _utils.MAX_WAIT, # noqa - exp_base: typing.Union[int, float] = 2, - min: _utils.time_unit_type = 0, # noqa - ) -> None: - self.multiplier = multiplier - self.min = _utils.to_seconds(min) - self.max = _utils.to_seconds(max) - self.exp_base = exp_base - - def __call__(self, retry_state: "RetryCallState") -> float: - try: - exp = self.exp_base ** (retry_state.attempt_number - 1) - result = self.multiplier * exp - except OverflowError: - return self.max - return max(max(0, self.min), min(result, self.max)) - - -class wait_random_exponential(wait_exponential): - """Random wait with exponentially widening window. - - An exponential backoff strategy used to mediate contention between multiple - uncoordinated processes for a shared resource in distributed systems. This - is the sense in which "exponential backoff" is meant in e.g. Ethernet - networking, and corresponds to the "Full Jitter" algorithm described in - this blog post: - - https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/ - - Each retry occurs at a random time in a geometrically expanding interval. - It allows for a custom multiplier and an ability to restrict the upper - limit of the random interval to some maximum value. - - Example:: - - wait_random_exponential(multiplier=0.5, # initial window 0.5s - max=60) # max 60s timeout - - When waiting for an unavailable resource to become available again, as - opposed to trying to resolve contention for a shared resource, the - wait_exponential strategy (which uses a fixed interval) may be preferable. - - """ - - def __call__(self, retry_state: "RetryCallState") -> float: - high = super().__call__(retry_state=retry_state) - return random.uniform(0, high) - - -class wait_exponential_jitter(wait_base): - """Wait strategy that applies exponential backoff and jitter. - - It allows for a customized initial wait, maximum wait and jitter. - - This implements the strategy described here: - https://cloud.google.com/storage/docs/retry-strategy - - The wait time is min(initial * 2**n + random.uniform(0, jitter), maximum) - where n is the retry count. - """ - - def __init__( - self, - initial: float = 1, - max: float = _utils.MAX_WAIT, # noqa - exp_base: float = 2, - jitter: float = 1, - ) -> None: - self.initial = initial - self.max = max - self.exp_base = exp_base - self.jitter = jitter - - def __call__(self, retry_state: "RetryCallState") -> float: - jitter = random.uniform(0, self.jitter) - try: - exp = self.exp_base ** (retry_state.attempt_number - 1) - result = self.initial * exp + jitter - except OverflowError: - result = self.max - return max(0, min(result, self.max)) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/tomli/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/tomli/__init__.py deleted file mode 100644 index 4c6ec97..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/tomli/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -# SPDX-License-Identifier: MIT -# SPDX-FileCopyrightText: 2021 Taneli Hukkinen -# Licensed to PSF under a Contributor Agreement. - -__all__ = ("loads", "load", "TOMLDecodeError") -__version__ = "2.0.1" # DO NOT EDIT THIS LINE MANUALLY. LET bump2version UTILITY DO IT - -from ._parser import TOMLDecodeError, load, loads - -# Pretend this exception was created here. -TOMLDecodeError.__module__ = __name__ diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index e6d69805f2122d8a0bfedaf6974945a472d059da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 406 zcmZ8cyH3L}6m{yPty<bnEDT62NEsTFvLdFk@mQF$SSGewt9}IA4Js`C0CqNZzJ-Ya z31wwKY?Zoo!Vz@g4CkIB-N(7Fy<P`+<j)V&#{huO+HBGI6YIo_CqO|4XpjZ8L7`|! zm_Zq4p^UO90IbO%Zfyq_VI0M<ii9TAR$*PL!S&U}`IzOJvNL0}xsOK4QIdZ9qacPR z^u@rM>Z_M=yJ}%fguuA!Vq7v~xmMn^a6yb^=HEco##j-_d`Aaksp(vJ{Q}m08Q9#S zsg?{$;%te=I-g6XoJEcaHZepFt>gKOnIYA8st(HxDw!&g;5VpPxT#jhNjgH7J2osx zJ|h!mQNau3gDI*Fa#{+GFy@LojFV!qX`lRtI5mBrpnlRGcv`_A2v!}?Ma$Mle|Opa V0_ht_S52^gxE#ELJ+tGxegFqpaMb_+ diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-312.pyc deleted file mode 100644 index 6d6146f66e642391c5192c1361c673fa8370784e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26949 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-312.pyc deleted file mode 100644 index 5cf353a76ce7e0f9b4a788a6d028473d8f009eb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3930 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 IW*7D6f1y{9iU0rr diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-312.pyc deleted file mode 100644 index 44d73052f7816d8b8556268ef0b81084fe00f5fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 388 zcmXv|F-yZh6u!%~v5iCrL2z`^4((ChL<FgbAV@){EG12zY3yAt++8cdrQJGa)5+c6 z;?%8Vb#g0o5ITq#s2{xVeGk6(z4z(54l)SdUk1OXf0e^O$VRNrjCe&M3Nb?*dzf3E z#fe8S0t+e;2K;Cp7>`#40+rC(Og3zJwTv_>-(^sP6y!3=idx5K%<nTOst==-LF=wj zFKnHqaT3Y$q^y)wHB=C#W#M#vso<IkUl-&SvVz2kQC*=v(8{>bTF`;uK)J8gm|lrs z#39j&YG4papEs3`gCWRfD4r7&6N02;NXC@KeVS%^Ad=Ho`-G}kLo@Y*p&x;wX`IrY zv4uiXEjWv5&pZjLm1gVOITzuG!G+v4_pvF}Hnb!d;~xj%<2gE7+GuA#S2?`h=TCF@ ZaN;cN?O7+^o83&sge>g(lt|ZX{Q>A+Z#@72 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/tomli/_parser.py b/venv/lib/python3.12/site-packages/pip/_vendor/tomli/_parser.py deleted file mode 100644 index f1bb0aa..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/tomli/_parser.py +++ /dev/null @@ -1,691 +0,0 @@ -# SPDX-License-Identifier: MIT -# SPDX-FileCopyrightText: 2021 Taneli Hukkinen -# Licensed to PSF under a Contributor Agreement. - -from __future__ import annotations - -from collections.abc import Iterable -import string -from types import MappingProxyType -from typing import Any, BinaryIO, NamedTuple - -from ._re import ( - RE_DATETIME, - RE_LOCALTIME, - RE_NUMBER, - match_to_datetime, - match_to_localtime, - match_to_number, -) -from ._types import Key, ParseFloat, Pos - -ASCII_CTRL = frozenset(chr(i) for i in range(32)) | frozenset(chr(127)) - -# Neither of these sets include quotation mark or backslash. They are -# currently handled as separate cases in the parser functions. -ILLEGAL_BASIC_STR_CHARS = ASCII_CTRL - frozenset("\t") -ILLEGAL_MULTILINE_BASIC_STR_CHARS = ASCII_CTRL - frozenset("\t\n") - -ILLEGAL_LITERAL_STR_CHARS = ILLEGAL_BASIC_STR_CHARS -ILLEGAL_MULTILINE_LITERAL_STR_CHARS = ILLEGAL_MULTILINE_BASIC_STR_CHARS - -ILLEGAL_COMMENT_CHARS = ILLEGAL_BASIC_STR_CHARS - -TOML_WS = frozenset(" \t") -TOML_WS_AND_NEWLINE = TOML_WS | frozenset("\n") -BARE_KEY_CHARS = frozenset(string.ascii_letters + string.digits + "-_") -KEY_INITIAL_CHARS = BARE_KEY_CHARS | frozenset("\"'") -HEXDIGIT_CHARS = frozenset(string.hexdigits) - -BASIC_STR_ESCAPE_REPLACEMENTS = MappingProxyType( - { - "\\b": "\u0008", # backspace - "\\t": "\u0009", # tab - "\\n": "\u000A", # linefeed - "\\f": "\u000C", # form feed - "\\r": "\u000D", # carriage return - '\\"': "\u0022", # quote - "\\\\": "\u005C", # backslash - } -) - - -class TOMLDecodeError(ValueError): - """An error raised if a document is not valid TOML.""" - - -def load(__fp: BinaryIO, *, parse_float: ParseFloat = float) -> dict[str, Any]: - """Parse TOML from a binary file object.""" - b = __fp.read() - try: - s = b.decode() - except AttributeError: - raise TypeError( - "File must be opened in binary mode, e.g. use `open('foo.toml', 'rb')`" - ) from None - return loads(s, parse_float=parse_float) - - -def loads(__s: str, *, parse_float: ParseFloat = float) -> dict[str, Any]: # noqa: C901 - """Parse TOML from a string.""" - - # The spec allows converting "\r\n" to "\n", even in string - # literals. Let's do so to simplify parsing. - src = __s.replace("\r\n", "\n") - pos = 0 - out = Output(NestedDict(), Flags()) - header: Key = () - parse_float = make_safe_parse_float(parse_float) - - # Parse one statement at a time - # (typically means one line in TOML source) - while True: - # 1. Skip line leading whitespace - pos = skip_chars(src, pos, TOML_WS) - - # 2. Parse rules. Expect one of the following: - # - end of file - # - end of line - # - comment - # - key/value pair - # - append dict to list (and move to its namespace) - # - create dict (and move to its namespace) - # Skip trailing whitespace when applicable. - try: - char = src[pos] - except IndexError: - break - if char == "\n": - pos += 1 - continue - if char in KEY_INITIAL_CHARS: - pos = key_value_rule(src, pos, out, header, parse_float) - pos = skip_chars(src, pos, TOML_WS) - elif char == "[": - try: - second_char: str | None = src[pos + 1] - except IndexError: - second_char = None - out.flags.finalize_pending() - if second_char == "[": - pos, header = create_list_rule(src, pos, out) - else: - pos, header = create_dict_rule(src, pos, out) - pos = skip_chars(src, pos, TOML_WS) - elif char != "#": - raise suffixed_err(src, pos, "Invalid statement") - - # 3. Skip comment - pos = skip_comment(src, pos) - - # 4. Expect end of line or end of file - try: - char = src[pos] - except IndexError: - break - if char != "\n": - raise suffixed_err( - src, pos, "Expected newline or end of document after a statement" - ) - pos += 1 - - return out.data.dict - - -class Flags: - """Flags that map to parsed keys/namespaces.""" - - # Marks an immutable namespace (inline array or inline table). - FROZEN = 0 - # Marks a nest that has been explicitly created and can no longer - # be opened using the "[table]" syntax. - EXPLICIT_NEST = 1 - - def __init__(self) -> None: - self._flags: dict[str, dict] = {} - self._pending_flags: set[tuple[Key, int]] = set() - - def add_pending(self, key: Key, flag: int) -> None: - self._pending_flags.add((key, flag)) - - def finalize_pending(self) -> None: - for key, flag in self._pending_flags: - self.set(key, flag, recursive=False) - self._pending_flags.clear() - - def unset_all(self, key: Key) -> None: - cont = self._flags - for k in key[:-1]: - if k not in cont: - return - cont = cont[k]["nested"] - cont.pop(key[-1], None) - - def set(self, key: Key, flag: int, *, recursive: bool) -> None: # noqa: A003 - cont = self._flags - key_parent, key_stem = key[:-1], key[-1] - for k in key_parent: - if k not in cont: - cont[k] = {"flags": set(), "recursive_flags": set(), "nested": {}} - cont = cont[k]["nested"] - if key_stem not in cont: - cont[key_stem] = {"flags": set(), "recursive_flags": set(), "nested": {}} - cont[key_stem]["recursive_flags" if recursive else "flags"].add(flag) - - def is_(self, key: Key, flag: int) -> bool: - if not key: - return False # document root has no flags - cont = self._flags - for k in key[:-1]: - if k not in cont: - return False - inner_cont = cont[k] - if flag in inner_cont["recursive_flags"]: - return True - cont = inner_cont["nested"] - key_stem = key[-1] - if key_stem in cont: - cont = cont[key_stem] - return flag in cont["flags"] or flag in cont["recursive_flags"] - return False - - -class NestedDict: - def __init__(self) -> None: - # The parsed content of the TOML document - self.dict: dict[str, Any] = {} - - def get_or_create_nest( - self, - key: Key, - *, - access_lists: bool = True, - ) -> dict: - cont: Any = self.dict - for k in key: - if k not in cont: - cont[k] = {} - cont = cont[k] - if access_lists and isinstance(cont, list): - cont = cont[-1] - if not isinstance(cont, dict): - raise KeyError("There is no nest behind this key") - return cont - - def append_nest_to_list(self, key: Key) -> None: - cont = self.get_or_create_nest(key[:-1]) - last_key = key[-1] - if last_key in cont: - list_ = cont[last_key] - if not isinstance(list_, list): - raise KeyError("An object other than list found behind this key") - list_.append({}) - else: - cont[last_key] = [{}] - - -class Output(NamedTuple): - data: NestedDict - flags: Flags - - -def skip_chars(src: str, pos: Pos, chars: Iterable[str]) -> Pos: - try: - while src[pos] in chars: - pos += 1 - except IndexError: - pass - return pos - - -def skip_until( - src: str, - pos: Pos, - expect: str, - *, - error_on: frozenset[str], - error_on_eof: bool, -) -> Pos: - try: - new_pos = src.index(expect, pos) - except ValueError: - new_pos = len(src) - if error_on_eof: - raise suffixed_err(src, new_pos, f"Expected {expect!r}") from None - - if not error_on.isdisjoint(src[pos:new_pos]): - while src[pos] not in error_on: - pos += 1 - raise suffixed_err(src, pos, f"Found invalid character {src[pos]!r}") - return new_pos - - -def skip_comment(src: str, pos: Pos) -> Pos: - try: - char: str | None = src[pos] - except IndexError: - char = None - if char == "#": - return skip_until( - src, pos + 1, "\n", error_on=ILLEGAL_COMMENT_CHARS, error_on_eof=False - ) - return pos - - -def skip_comments_and_array_ws(src: str, pos: Pos) -> Pos: - while True: - pos_before_skip = pos - pos = skip_chars(src, pos, TOML_WS_AND_NEWLINE) - pos = skip_comment(src, pos) - if pos == pos_before_skip: - return pos - - -def create_dict_rule(src: str, pos: Pos, out: Output) -> tuple[Pos, Key]: - pos += 1 # Skip "[" - pos = skip_chars(src, pos, TOML_WS) - pos, key = parse_key(src, pos) - - if out.flags.is_(key, Flags.EXPLICIT_NEST) or out.flags.is_(key, Flags.FROZEN): - raise suffixed_err(src, pos, f"Cannot declare {key} twice") - out.flags.set(key, Flags.EXPLICIT_NEST, recursive=False) - try: - out.data.get_or_create_nest(key) - except KeyError: - raise suffixed_err(src, pos, "Cannot overwrite a value") from None - - if not src.startswith("]", pos): - raise suffixed_err(src, pos, "Expected ']' at the end of a table declaration") - return pos + 1, key - - -def create_list_rule(src: str, pos: Pos, out: Output) -> tuple[Pos, Key]: - pos += 2 # Skip "[[" - pos = skip_chars(src, pos, TOML_WS) - pos, key = parse_key(src, pos) - - if out.flags.is_(key, Flags.FROZEN): - raise suffixed_err(src, pos, f"Cannot mutate immutable namespace {key}") - # Free the namespace now that it points to another empty list item... - out.flags.unset_all(key) - # ...but this key precisely is still prohibited from table declaration - out.flags.set(key, Flags.EXPLICIT_NEST, recursive=False) - try: - out.data.append_nest_to_list(key) - except KeyError: - raise suffixed_err(src, pos, "Cannot overwrite a value") from None - - if not src.startswith("]]", pos): - raise suffixed_err(src, pos, "Expected ']]' at the end of an array declaration") - return pos + 2, key - - -def key_value_rule( - src: str, pos: Pos, out: Output, header: Key, parse_float: ParseFloat -) -> Pos: - pos, key, value = parse_key_value_pair(src, pos, parse_float) - key_parent, key_stem = key[:-1], key[-1] - abs_key_parent = header + key_parent - - relative_path_cont_keys = (header + key[:i] for i in range(1, len(key))) - for cont_key in relative_path_cont_keys: - # Check that dotted key syntax does not redefine an existing table - if out.flags.is_(cont_key, Flags.EXPLICIT_NEST): - raise suffixed_err(src, pos, f"Cannot redefine namespace {cont_key}") - # Containers in the relative path can't be opened with the table syntax or - # dotted key/value syntax in following table sections. - out.flags.add_pending(cont_key, Flags.EXPLICIT_NEST) - - if out.flags.is_(abs_key_parent, Flags.FROZEN): - raise suffixed_err( - src, pos, f"Cannot mutate immutable namespace {abs_key_parent}" - ) - - try: - nest = out.data.get_or_create_nest(abs_key_parent) - except KeyError: - raise suffixed_err(src, pos, "Cannot overwrite a value") from None - if key_stem in nest: - raise suffixed_err(src, pos, "Cannot overwrite a value") - # Mark inline table and array namespaces recursively immutable - if isinstance(value, (dict, list)): - out.flags.set(header + key, Flags.FROZEN, recursive=True) - nest[key_stem] = value - return pos - - -def parse_key_value_pair( - src: str, pos: Pos, parse_float: ParseFloat -) -> tuple[Pos, Key, Any]: - pos, key = parse_key(src, pos) - try: - char: str | None = src[pos] - except IndexError: - char = None - if char != "=": - raise suffixed_err(src, pos, "Expected '=' after a key in a key/value pair") - pos += 1 - pos = skip_chars(src, pos, TOML_WS) - pos, value = parse_value(src, pos, parse_float) - return pos, key, value - - -def parse_key(src: str, pos: Pos) -> tuple[Pos, Key]: - pos, key_part = parse_key_part(src, pos) - key: Key = (key_part,) - pos = skip_chars(src, pos, TOML_WS) - while True: - try: - char: str | None = src[pos] - except IndexError: - char = None - if char != ".": - return pos, key - pos += 1 - pos = skip_chars(src, pos, TOML_WS) - pos, key_part = parse_key_part(src, pos) - key += (key_part,) - pos = skip_chars(src, pos, TOML_WS) - - -def parse_key_part(src: str, pos: Pos) -> tuple[Pos, str]: - try: - char: str | None = src[pos] - except IndexError: - char = None - if char in BARE_KEY_CHARS: - start_pos = pos - pos = skip_chars(src, pos, BARE_KEY_CHARS) - return pos, src[start_pos:pos] - if char == "'": - return parse_literal_str(src, pos) - if char == '"': - return parse_one_line_basic_str(src, pos) - raise suffixed_err(src, pos, "Invalid initial character for a key part") - - -def parse_one_line_basic_str(src: str, pos: Pos) -> tuple[Pos, str]: - pos += 1 - return parse_basic_str(src, pos, multiline=False) - - -def parse_array(src: str, pos: Pos, parse_float: ParseFloat) -> tuple[Pos, list]: - pos += 1 - array: list = [] - - pos = skip_comments_and_array_ws(src, pos) - if src.startswith("]", pos): - return pos + 1, array - while True: - pos, val = parse_value(src, pos, parse_float) - array.append(val) - pos = skip_comments_and_array_ws(src, pos) - - c = src[pos : pos + 1] - if c == "]": - return pos + 1, array - if c != ",": - raise suffixed_err(src, pos, "Unclosed array") - pos += 1 - - pos = skip_comments_and_array_ws(src, pos) - if src.startswith("]", pos): - return pos + 1, array - - -def parse_inline_table(src: str, pos: Pos, parse_float: ParseFloat) -> tuple[Pos, dict]: - pos += 1 - nested_dict = NestedDict() - flags = Flags() - - pos = skip_chars(src, pos, TOML_WS) - if src.startswith("}", pos): - return pos + 1, nested_dict.dict - while True: - pos, key, value = parse_key_value_pair(src, pos, parse_float) - key_parent, key_stem = key[:-1], key[-1] - if flags.is_(key, Flags.FROZEN): - raise suffixed_err(src, pos, f"Cannot mutate immutable namespace {key}") - try: - nest = nested_dict.get_or_create_nest(key_parent, access_lists=False) - except KeyError: - raise suffixed_err(src, pos, "Cannot overwrite a value") from None - if key_stem in nest: - raise suffixed_err(src, pos, f"Duplicate inline table key {key_stem!r}") - nest[key_stem] = value - pos = skip_chars(src, pos, TOML_WS) - c = src[pos : pos + 1] - if c == "}": - return pos + 1, nested_dict.dict - if c != ",": - raise suffixed_err(src, pos, "Unclosed inline table") - if isinstance(value, (dict, list)): - flags.set(key, Flags.FROZEN, recursive=True) - pos += 1 - pos = skip_chars(src, pos, TOML_WS) - - -def parse_basic_str_escape( - src: str, pos: Pos, *, multiline: bool = False -) -> tuple[Pos, str]: - escape_id = src[pos : pos + 2] - pos += 2 - if multiline and escape_id in {"\\ ", "\\\t", "\\\n"}: - # Skip whitespace until next non-whitespace character or end of - # the doc. Error if non-whitespace is found before newline. - if escape_id != "\\\n": - pos = skip_chars(src, pos, TOML_WS) - try: - char = src[pos] - except IndexError: - return pos, "" - if char != "\n": - raise suffixed_err(src, pos, "Unescaped '\\' in a string") - pos += 1 - pos = skip_chars(src, pos, TOML_WS_AND_NEWLINE) - return pos, "" - if escape_id == "\\u": - return parse_hex_char(src, pos, 4) - if escape_id == "\\U": - return parse_hex_char(src, pos, 8) - try: - return pos, BASIC_STR_ESCAPE_REPLACEMENTS[escape_id] - except KeyError: - raise suffixed_err(src, pos, "Unescaped '\\' in a string") from None - - -def parse_basic_str_escape_multiline(src: str, pos: Pos) -> tuple[Pos, str]: - return parse_basic_str_escape(src, pos, multiline=True) - - -def parse_hex_char(src: str, pos: Pos, hex_len: int) -> tuple[Pos, str]: - hex_str = src[pos : pos + hex_len] - if len(hex_str) != hex_len or not HEXDIGIT_CHARS.issuperset(hex_str): - raise suffixed_err(src, pos, "Invalid hex value") - pos += hex_len - hex_int = int(hex_str, 16) - if not is_unicode_scalar_value(hex_int): - raise suffixed_err(src, pos, "Escaped character is not a Unicode scalar value") - return pos, chr(hex_int) - - -def parse_literal_str(src: str, pos: Pos) -> tuple[Pos, str]: - pos += 1 # Skip starting apostrophe - start_pos = pos - pos = skip_until( - src, pos, "'", error_on=ILLEGAL_LITERAL_STR_CHARS, error_on_eof=True - ) - return pos + 1, src[start_pos:pos] # Skip ending apostrophe - - -def parse_multiline_str(src: str, pos: Pos, *, literal: bool) -> tuple[Pos, str]: - pos += 3 - if src.startswith("\n", pos): - pos += 1 - - if literal: - delim = "'" - end_pos = skip_until( - src, - pos, - "'''", - error_on=ILLEGAL_MULTILINE_LITERAL_STR_CHARS, - error_on_eof=True, - ) - result = src[pos:end_pos] - pos = end_pos + 3 - else: - delim = '"' - pos, result = parse_basic_str(src, pos, multiline=True) - - # Add at maximum two extra apostrophes/quotes if the end sequence - # is 4 or 5 chars long instead of just 3. - if not src.startswith(delim, pos): - return pos, result - pos += 1 - if not src.startswith(delim, pos): - return pos, result + delim - pos += 1 - return pos, result + (delim * 2) - - -def parse_basic_str(src: str, pos: Pos, *, multiline: bool) -> tuple[Pos, str]: - if multiline: - error_on = ILLEGAL_MULTILINE_BASIC_STR_CHARS - parse_escapes = parse_basic_str_escape_multiline - else: - error_on = ILLEGAL_BASIC_STR_CHARS - parse_escapes = parse_basic_str_escape - result = "" - start_pos = pos - while True: - try: - char = src[pos] - except IndexError: - raise suffixed_err(src, pos, "Unterminated string") from None - if char == '"': - if not multiline: - return pos + 1, result + src[start_pos:pos] - if src.startswith('"""', pos): - return pos + 3, result + src[start_pos:pos] - pos += 1 - continue - if char == "\\": - result += src[start_pos:pos] - pos, parsed_escape = parse_escapes(src, pos) - result += parsed_escape - start_pos = pos - continue - if char in error_on: - raise suffixed_err(src, pos, f"Illegal character {char!r}") - pos += 1 - - -def parse_value( # noqa: C901 - src: str, pos: Pos, parse_float: ParseFloat -) -> tuple[Pos, Any]: - try: - char: str | None = src[pos] - except IndexError: - char = None - - # IMPORTANT: order conditions based on speed of checking and likelihood - - # Basic strings - if char == '"': - if src.startswith('"""', pos): - return parse_multiline_str(src, pos, literal=False) - return parse_one_line_basic_str(src, pos) - - # Literal strings - if char == "'": - if src.startswith("'''", pos): - return parse_multiline_str(src, pos, literal=True) - return parse_literal_str(src, pos) - - # Booleans - if char == "t": - if src.startswith("true", pos): - return pos + 4, True - if char == "f": - if src.startswith("false", pos): - return pos + 5, False - - # Arrays - if char == "[": - return parse_array(src, pos, parse_float) - - # Inline tables - if char == "{": - return parse_inline_table(src, pos, parse_float) - - # Dates and times - datetime_match = RE_DATETIME.match(src, pos) - if datetime_match: - try: - datetime_obj = match_to_datetime(datetime_match) - except ValueError as e: - raise suffixed_err(src, pos, "Invalid date or datetime") from e - return datetime_match.end(), datetime_obj - localtime_match = RE_LOCALTIME.match(src, pos) - if localtime_match: - return localtime_match.end(), match_to_localtime(localtime_match) - - # Integers and "normal" floats. - # The regex will greedily match any type starting with a decimal - # char, so needs to be located after handling of dates and times. - number_match = RE_NUMBER.match(src, pos) - if number_match: - return number_match.end(), match_to_number(number_match, parse_float) - - # Special floats - first_three = src[pos : pos + 3] - if first_three in {"inf", "nan"}: - return pos + 3, parse_float(first_three) - first_four = src[pos : pos + 4] - if first_four in {"-inf", "+inf", "-nan", "+nan"}: - return pos + 4, parse_float(first_four) - - raise suffixed_err(src, pos, "Invalid value") - - -def suffixed_err(src: str, pos: Pos, msg: str) -> TOMLDecodeError: - """Return a `TOMLDecodeError` where error message is suffixed with - coordinates in source.""" - - def coord_repr(src: str, pos: Pos) -> str: - if pos >= len(src): - return "end of document" - line = src.count("\n", 0, pos) + 1 - if line == 1: - column = pos + 1 - else: - column = pos - src.rindex("\n", 0, pos) - return f"line {line}, column {column}" - - return TOMLDecodeError(f"{msg} (at {coord_repr(src, pos)})") - - -def is_unicode_scalar_value(codepoint: int) -> bool: - return (0 <= codepoint <= 55295) or (57344 <= codepoint <= 1114111) - - -def make_safe_parse_float(parse_float: ParseFloat) -> ParseFloat: - """A decorator to make `parse_float` safe. - - `parse_float` must not return dicts or lists, because these types - would be mixed with parsed TOML tables and arrays, thus confusing - the parser. The returned decorated callable raises `ValueError` - instead of returning illegal types. - """ - # The default `float` callable never returns illegal types. Optimize it. - if parse_float is float: # type: ignore[comparison-overlap] - return float - - def safe_parse_float(float_str: str) -> Any: - float_value = parse_float(float_str) - if isinstance(float_value, (dict, list)): - raise ValueError("parse_float must not return dicts or lists") - return float_value - - return safe_parse_float diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/tomli/_re.py b/venv/lib/python3.12/site-packages/pip/_vendor/tomli/_re.py deleted file mode 100644 index 994bb74..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/tomli/_re.py +++ /dev/null @@ -1,107 +0,0 @@ -# SPDX-License-Identifier: MIT -# SPDX-FileCopyrightText: 2021 Taneli Hukkinen -# Licensed to PSF under a Contributor Agreement. - -from __future__ import annotations - -from datetime import date, datetime, time, timedelta, timezone, tzinfo -from functools import lru_cache -import re -from typing import Any - -from ._types import ParseFloat - -# E.g. -# - 00:32:00.999999 -# - 00:32:00 -_TIME_RE_STR = r"([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])(?:\.([0-9]{1,6})[0-9]*)?" - -RE_NUMBER = re.compile( - r""" -0 -(?: - x[0-9A-Fa-f](?:_?[0-9A-Fa-f])* # hex - | - b[01](?:_?[01])* # bin - | - o[0-7](?:_?[0-7])* # oct -) -| -[+-]?(?:0|[1-9](?:_?[0-9])*) # dec, integer part -(?P<floatpart> - (?:\.[0-9](?:_?[0-9])*)? # optional fractional part - (?:[eE][+-]?[0-9](?:_?[0-9])*)? # optional exponent part -) -""", - flags=re.VERBOSE, -) -RE_LOCALTIME = re.compile(_TIME_RE_STR) -RE_DATETIME = re.compile( - rf""" -([0-9]{{4}})-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01]) # date, e.g. 1988-10-27 -(?: - [Tt ] - {_TIME_RE_STR} - (?:([Zz])|([+-])([01][0-9]|2[0-3]):([0-5][0-9]))? # optional time offset -)? -""", - flags=re.VERBOSE, -) - - -def match_to_datetime(match: re.Match) -> datetime | date: - """Convert a `RE_DATETIME` match to `datetime.datetime` or `datetime.date`. - - Raises ValueError if the match does not correspond to a valid date - or datetime. - """ - ( - year_str, - month_str, - day_str, - hour_str, - minute_str, - sec_str, - micros_str, - zulu_time, - offset_sign_str, - offset_hour_str, - offset_minute_str, - ) = match.groups() - year, month, day = int(year_str), int(month_str), int(day_str) - if hour_str is None: - return date(year, month, day) - hour, minute, sec = int(hour_str), int(minute_str), int(sec_str) - micros = int(micros_str.ljust(6, "0")) if micros_str else 0 - if offset_sign_str: - tz: tzinfo | None = cached_tz( - offset_hour_str, offset_minute_str, offset_sign_str - ) - elif zulu_time: - tz = timezone.utc - else: # local date-time - tz = None - return datetime(year, month, day, hour, minute, sec, micros, tzinfo=tz) - - -@lru_cache(maxsize=None) -def cached_tz(hour_str: str, minute_str: str, sign_str: str) -> timezone: - sign = 1 if sign_str == "+" else -1 - return timezone( - timedelta( - hours=sign * int(hour_str), - minutes=sign * int(minute_str), - ) - ) - - -def match_to_localtime(match: re.Match) -> time: - hour_str, minute_str, sec_str, micros_str = match.groups() - micros = int(micros_str.ljust(6, "0")) if micros_str else 0 - return time(int(hour_str), int(minute_str), int(sec_str), micros) - - -def match_to_number(match: re.Match, parse_float: ParseFloat) -> Any: - if match.group("floatpart"): - return parse_float(match.group()) - return int(match.group(), 0) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/tomli/_types.py b/venv/lib/python3.12/site-packages/pip/_vendor/tomli/_types.py deleted file mode 100644 index d949412..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/tomli/_types.py +++ /dev/null @@ -1,10 +0,0 @@ -# SPDX-License-Identifier: MIT -# SPDX-FileCopyrightText: 2021 Taneli Hukkinen -# Licensed to PSF under a Contributor Agreement. - -from typing import Any, Callable, Tuple - -# Type annotations -ParseFloat = Callable[[str], Any] -Key = Tuple[str, ...] -Pos = int diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__init__.py deleted file mode 100644 index 59930f4..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -"""Verify certificates using native system trust stores""" - -import sys as _sys - -if _sys.version_info < (3, 10): - raise ImportError("truststore requires Python 3.10 or later") - -from ._api import SSLContext, extract_from_ssl, inject_into_ssl # noqa: E402 - -del _api, _sys # type: ignore[name-defined] # noqa: F821 - -__all__ = ["SSLContext", "inject_into_ssl", "extract_from_ssl"] -__version__ = "0.8.0" diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 8cbb560998d033c668b34add08c08d87c98f62ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 640 zcmYLFF>ljA6h7NY>^c;xDrH1BFpwd+P#CHT5h`FnLI|l6gFBpD-zB-m_L+AVmy`vV z7?Bv*7}yX$g{6f7>Zzgw%7)af6L*2AZ+Q3az3+YRd++P=a)^v2A775%I|!ZH&%(U_ z!P%|}J|Ko7#2n_PPULcTud#q#yv!TB2tnW?USqW{hR@m?ht*jlt!Is>k@=CI1ySIj zo%)VDM9lx>L`y7)!l~O{I=KCegBVP4!a<9HNMg+uo+yzIaUN??a;&CG^9*a4D2<ht zz}3tSdD3=gR`1NNb8ur`pO-Q4=M!OI_~}%SWR7ojZ}zYRoEmbNS&eP43b(f(-<P@O zFLbqH9K?yH1CSY2Dy^=Fe2<%i$hEYIwg+~52(0t%z<RH{(e1UHl}{;?38j^1lvXur z{iTwF5;8aa16eg6WrYO&5I}+f#D(}rW_jj}mLpD6!_lO4(Mms~GXp^9B^k+#lPuP% zBoAaV$#||6(LCith_jB;A{le&Fu9+nGG-h|$@7w=VwV*23z!3}6D2h76mc?+hg^|D z6vT|mnFMliIzo+Np(*Va)AQg?CfOwAccEou*t4lk<NkP#;~b;SQ?z>G`9HkYk=J^+ r|INF09IhQ+z4txbI;?H|M*SnyKdA+8um1}Bul%2v*IqYa)wKTww{^Xc diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_api.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_api.cpython-312.pyc deleted file mode 100644 index c299ac63c1e8d7ec4f7d90cfa687613690e69aaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15819 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 Y*s-vC@B1xxzeMx*IoCrD%IHk}zh<zz^#A|> diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_macos.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_macos.cpython-312.pyc deleted file mode 100644 index 4cdc4eed5a430d6a399c6d611b33567cd666a36f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16684 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 GVEBKghjA<b diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_openssl.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_openssl.cpython-312.pyc deleted file mode 100644 index d09af80107f45dadc2b921c400ed332bd69cbcc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2237 zcmZ`)O>h)N6z-m#{ZF#H`PqbkIFJ}?r8XlF1wp`=pMnx|An0KgrzSJK+1c#QZ1wae zY)A-2Q6;IeDsnNwgIFFcD73UZd6bg}FG&$9Vc=ku9`v>*9F&u<XEP)~=-Pe#`t|GA z-S2&0&u{hh5d=;9>O!tLjL;u^;58V#Z5?5R=8=wcTtJyxk2BaE3mL)feHowIiy3hg z>B2WS;};MS@^xOY&0hE2hIqVXf&}H`HGQkpMdHghZne~O-A}}P^EP(81B_Ww4_py% zZ%k*RdXUt?ih8hzu85h2Fw*Pw@CzbGNQ}gJ6g>*7@MI7)zmBsZz3z%Xlc?ZS!{0pe zP)eLk$b@OKZ5L#XP}W@{#mN@eR2nm6R<JkCd!O=z2{p}^7+FJ88L_)H$|jSWK5BZT zZ0ZH#hHU-hqu0}Ksp)KQdhpzZ!_yyk^YOV($EUILPJj|trlz)$N%zts$PW0g_ki_1 zDB3(?Pv-N2>+_WGay5;oaGtMzrrCSI9(cwGL)yhWY@qEuyb9CA6v{`RkKpZ$k$Idw z!AL(k_Xa}K0&DPAY=@3~lQ+BBPYK?RHvX&w_H5al^Ry}9JM4L3$c~9c!15P(9%EEN z-}@$TN*GFEC!ncWqd-zo#|Jfb+C~Xebdpue1*VJ>YGf-)No6^k^2~5=K5~*uO;I$< zWU67>3a_;7wAn9M?ldWVy~^OJ(*w{C^`GkRJv%V$2$t=LZoq(H^J6$I1xwYvjSCh4 z$FNL0<)c2neQ4ukwbR(#CP~ucaXDudiCk2fJudfKTDeF}X3LBe$S75dX`30^7@=w1 znlO2MLgjH{j>`pOL@rfW&N2^n?>`{h1|#W`s*S0m#Fk4&Nrr=%x<zG1%Qmx_MTx9f zC1OIRx=R(OkzYS+jFu^J6G6^1%FC66zg-6L7y9=SdenyEO)If|OR;@-W9dsLSA(%n zXD-hy9KLbl%M;7;z%RL9tvlAT{NZXSx)SPK3U%HKbv=rp*4NgMFPywO_%N23o0y%L zyEuDsA$u?O$|{75r<UTWACrsm)N=gr{dh|?2(GZmANkMb2)o>S^xZam=Xg6v%HjJQ zcX;yFzXbuj0a<I?@h0#0W;gpO<YCLk6}*La+wf=87Z4AR&NOBrFVc2wnR<d-K=%$n zs~{qHk$jVbeL13yNfSB3a)e4X1WM$*0kx4-Q<pq2N-h{B!<4`g97;rEM3=G_1&DMH zo=pX4J)D4Y;yHf9)(z?e3lN4YZOX~s;gbXXO5eblvo2zXdfy*V&I~wySgqw!f}2lA zG}R)p`8y*?lt15;e_LF!9~8R}#3l4+w0`c;?4h}1v&R;a%TZ}H*8DKuI3KwdS$Okq zeD4|({B2johtZCeXlf~%y4iUzD&KEvt@^=U4WPQjI)p(^6cFb@%!%;pDOwJA=frG6 zfu>5%vKc>+#>=|3xn<_B-8|6#79P5VfJ{4KOm}hd5(tk+?k#}Y9_<OCZXy+<SSrvx z;CYmL!^Z+HR&7B3Fl`5&z6>JO2*-lA04M;ga?|Swlu+*M1X!hHn4^>f(+O%;u>@47 zt$ft5v8bq;z&h$ghKEo0)#5mzQ;bj*Sm%-o-X}&Kam2C;Zjv35SIqH`RN&j<o{mZo zv34Y0kH?|6i<Vw4kmEEBL;h{Be*#hUVT>Q3!~+y|e~|~Mek~Ag6&6ubHHmh0EgZOU z<oc1tu6OS4>|I2>3_{%sZePOfRiPC}7W!@sT_36<P;ZX^Fmr3>XSO8wukrD^4+%S6 zr)p0SC%!&dMbO>sS?67~9d*3=PcVqXtBL0M-Pd+keW3pyZ~pv)YtgD7bl54mW1;6- RrpmplAry!_3WMg}>3=wG1@Zs@ diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-312.pyc deleted file mode 100644 index b31703fd391d2d5c302d06779106c3b7722a1259..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1121 zcmZ`&&rcIU6rSx)x24c3NikXhiG&|Zq#N*HMC2kzzys=GFOy|=D7$QTH#5^}BOxCA z2RPM}i6=um$e-ZdODi$O(F2JmZ%rT`I61rhnSh&}H}8G(&CHwc&3sL#Q$T#?``0@T z1mJfVbUvl+oc$F}6+8zPup}4gtzOclD30kd44e+PGgtIFi~$_S5W`Qg7OX2c=4ARP zZ5JnR2@elgvE{H&3Qvwa$;n=3J2x(47Tlc$fQa4nAxqNJ9>f`aNJMEXesy-1BJlAm zR!UgXwqhmULj8J0QV0Holnp+K7%5RknNKj<++2I&dknu~$SQdjCdhORO8MRYkZ39B zauQ}xVLQIZ2Pt)t*;<AVmNBunE2!vOm@5Rc67kHoYEh1&Hb55bY*m;lU=bJ^r=QhE zop^V+>+FF&sZ$3DRDddNs4~wXpV$T4GhEb4vUfC+5Oa9~A&MD7YK(*>jzAi2IWcju zr|tMftQ8GL%i5}MmWtS8RAbo11!5HEDYMO8Oy({BrRVyF&`B#}udKQDmevyCetuz5 zqc+3yfnn|%1x&TT4m2camQS>v<Qi(LMVTS?$OjcZ8YR{zqL|gykfcS5qoUEAFmJ%Q z0^)ZXaIOyL8gQ`=7mpr&8T<~{&crBChq)})5vD@9!YYC76?m$r1kd(V>O<p^VkCS& zJoz+Wwl8GlP|U~t8bXHW`OFAWiV)A(#lXd(KoP{DXB06Bt4hMMa>d_ru*rDpMRbUD zaSx(190C$P7&0WxMRHl(kCKa5$e0Kv(P&kerYuR)FOd2f{^@2C+`L`gKiIE<?2oa# zwaEvyhwH~<8#Rz?X2A5lkLUwBdRCuWItEKk1x%^OVD?m28uCb89%;zAx}1Awf0JiU z)W<bAeKMD?!<kc6i~N-uoM|euv@V?tXRG4}<4rjV@(Z86L$4K_#s|*hAsQwA53MmJ ARsaA1 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_windows.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_windows.cpython-312.pyc deleted file mode 100644 index 0a230a5f6fc1f9de4314fc5def67c279c616f521..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15528 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 P{M117b%&UVzKi+)0&k!8 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/truststore/_api.py b/venv/lib/python3.12/site-packages/pip/_vendor/truststore/_api.py deleted file mode 100644 index 829aff7..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/truststore/_api.py +++ /dev/null @@ -1,302 +0,0 @@ -import os -import platform -import socket -import ssl -import typing - -import _ssl # type: ignore[import] - -from ._ssl_constants import ( - _original_SSLContext, - _original_super_SSLContext, - _truststore_SSLContext_dunder_class, - _truststore_SSLContext_super_class, -) - -if platform.system() == "Windows": - from ._windows import _configure_context, _verify_peercerts_impl -elif platform.system() == "Darwin": - from ._macos import _configure_context, _verify_peercerts_impl -else: - from ._openssl import _configure_context, _verify_peercerts_impl - -if typing.TYPE_CHECKING: - from pip._vendor.typing_extensions import Buffer - -# From typeshed/stdlib/ssl.pyi -_StrOrBytesPath: typing.TypeAlias = str | bytes | os.PathLike[str] | os.PathLike[bytes] -_PasswordType: typing.TypeAlias = str | bytes | typing.Callable[[], str | bytes] - - -def inject_into_ssl() -> None: - """Injects the :class:`truststore.SSLContext` into the ``ssl`` - module by replacing :class:`ssl.SSLContext`. - """ - setattr(ssl, "SSLContext", SSLContext) - # urllib3 holds on to its own reference of ssl.SSLContext - # so we need to replace that reference too. - try: - import pip._vendor.urllib3.util.ssl_ as urllib3_ssl - - setattr(urllib3_ssl, "SSLContext", SSLContext) - except ImportError: - pass - - -def extract_from_ssl() -> None: - """Restores the :class:`ssl.SSLContext` class to its original state""" - setattr(ssl, "SSLContext", _original_SSLContext) - try: - import pip._vendor.urllib3.util.ssl_ as urllib3_ssl - - urllib3_ssl.SSLContext = _original_SSLContext - except ImportError: - pass - - -class SSLContext(_truststore_SSLContext_super_class): # type: ignore[misc] - """SSLContext API that uses system certificates on all platforms""" - - @property # type: ignore[misc] - def __class__(self) -> type: - # Dirty hack to get around isinstance() checks - # for ssl.SSLContext instances in aiohttp/trustme - # when using non-CPython implementations. - return _truststore_SSLContext_dunder_class or SSLContext - - def __init__(self, protocol: int = None) -> None: # type: ignore[assignment] - self._ctx = _original_SSLContext(protocol) - - class TruststoreSSLObject(ssl.SSLObject): - # This object exists because wrap_bio() doesn't - # immediately do the handshake so we need to do - # certificate verifications after SSLObject.do_handshake() - - def do_handshake(self) -> None: - ret = super().do_handshake() - _verify_peercerts(self, server_hostname=self.server_hostname) - return ret - - self._ctx.sslobject_class = TruststoreSSLObject - - def wrap_socket( - self, - sock: socket.socket, - server_side: bool = False, - do_handshake_on_connect: bool = True, - suppress_ragged_eofs: bool = True, - server_hostname: str | None = None, - session: ssl.SSLSession | None = None, - ) -> ssl.SSLSocket: - # Use a context manager here because the - # inner SSLContext holds on to our state - # but also does the actual handshake. - with _configure_context(self._ctx): - ssl_sock = self._ctx.wrap_socket( - sock, - server_side=server_side, - server_hostname=server_hostname, - do_handshake_on_connect=do_handshake_on_connect, - suppress_ragged_eofs=suppress_ragged_eofs, - session=session, - ) - try: - _verify_peercerts(ssl_sock, server_hostname=server_hostname) - except Exception: - ssl_sock.close() - raise - return ssl_sock - - def wrap_bio( - self, - incoming: ssl.MemoryBIO, - outgoing: ssl.MemoryBIO, - server_side: bool = False, - server_hostname: str | None = None, - session: ssl.SSLSession | None = None, - ) -> ssl.SSLObject: - with _configure_context(self._ctx): - ssl_obj = self._ctx.wrap_bio( - incoming, - outgoing, - server_hostname=server_hostname, - server_side=server_side, - session=session, - ) - return ssl_obj - - def load_verify_locations( - self, - cafile: str | bytes | os.PathLike[str] | os.PathLike[bytes] | None = None, - capath: str | bytes | os.PathLike[str] | os.PathLike[bytes] | None = None, - cadata: typing.Union[str, "Buffer", None] = None, - ) -> None: - return self._ctx.load_verify_locations( - cafile=cafile, capath=capath, cadata=cadata - ) - - def load_cert_chain( - self, - certfile: _StrOrBytesPath, - keyfile: _StrOrBytesPath | None = None, - password: _PasswordType | None = None, - ) -> None: - return self._ctx.load_cert_chain( - certfile=certfile, keyfile=keyfile, password=password - ) - - def load_default_certs( - self, purpose: ssl.Purpose = ssl.Purpose.SERVER_AUTH - ) -> None: - return self._ctx.load_default_certs(purpose) - - def set_alpn_protocols(self, alpn_protocols: typing.Iterable[str]) -> None: - return self._ctx.set_alpn_protocols(alpn_protocols) - - def set_npn_protocols(self, npn_protocols: typing.Iterable[str]) -> None: - return self._ctx.set_npn_protocols(npn_protocols) - - def set_ciphers(self, __cipherlist: str) -> None: - return self._ctx.set_ciphers(__cipherlist) - - def get_ciphers(self) -> typing.Any: - return self._ctx.get_ciphers() - - def session_stats(self) -> dict[str, int]: - return self._ctx.session_stats() - - def cert_store_stats(self) -> dict[str, int]: - raise NotImplementedError() - - @typing.overload - def get_ca_certs( - self, binary_form: typing.Literal[False] = ... - ) -> list[typing.Any]: - ... - - @typing.overload - def get_ca_certs(self, binary_form: typing.Literal[True] = ...) -> list[bytes]: - ... - - @typing.overload - def get_ca_certs(self, binary_form: bool = ...) -> typing.Any: - ... - - def get_ca_certs(self, binary_form: bool = False) -> list[typing.Any] | list[bytes]: - raise NotImplementedError() - - @property - def check_hostname(self) -> bool: - return self._ctx.check_hostname - - @check_hostname.setter - def check_hostname(self, value: bool) -> None: - self._ctx.check_hostname = value - - @property - def hostname_checks_common_name(self) -> bool: - return self._ctx.hostname_checks_common_name - - @hostname_checks_common_name.setter - def hostname_checks_common_name(self, value: bool) -> None: - self._ctx.hostname_checks_common_name = value - - @property - def keylog_filename(self) -> str: - return self._ctx.keylog_filename - - @keylog_filename.setter - def keylog_filename(self, value: str) -> None: - self._ctx.keylog_filename = value - - @property - def maximum_version(self) -> ssl.TLSVersion: - return self._ctx.maximum_version - - @maximum_version.setter - def maximum_version(self, value: ssl.TLSVersion) -> None: - _original_super_SSLContext.maximum_version.__set__( # type: ignore[attr-defined] - self._ctx, value - ) - - @property - def minimum_version(self) -> ssl.TLSVersion: - return self._ctx.minimum_version - - @minimum_version.setter - def minimum_version(self, value: ssl.TLSVersion) -> None: - _original_super_SSLContext.minimum_version.__set__( # type: ignore[attr-defined] - self._ctx, value - ) - - @property - def options(self) -> ssl.Options: - return self._ctx.options - - @options.setter - def options(self, value: ssl.Options) -> None: - _original_super_SSLContext.options.__set__( # type: ignore[attr-defined] - self._ctx, value - ) - - @property - def post_handshake_auth(self) -> bool: - return self._ctx.post_handshake_auth - - @post_handshake_auth.setter - def post_handshake_auth(self, value: bool) -> None: - self._ctx.post_handshake_auth = value - - @property - def protocol(self) -> ssl._SSLMethod: - return self._ctx.protocol - - @property - def security_level(self) -> int: - return self._ctx.security_level - - @property - def verify_flags(self) -> ssl.VerifyFlags: - return self._ctx.verify_flags - - @verify_flags.setter - def verify_flags(self, value: ssl.VerifyFlags) -> None: - _original_super_SSLContext.verify_flags.__set__( # type: ignore[attr-defined] - self._ctx, value - ) - - @property - def verify_mode(self) -> ssl.VerifyMode: - return self._ctx.verify_mode - - @verify_mode.setter - def verify_mode(self, value: ssl.VerifyMode) -> None: - _original_super_SSLContext.verify_mode.__set__( # type: ignore[attr-defined] - self._ctx, value - ) - - -def _verify_peercerts( - sock_or_sslobj: ssl.SSLSocket | ssl.SSLObject, server_hostname: str | None -) -> None: - """ - Verifies the peer certificates from an SSLSocket or SSLObject - against the certificates in the OS trust store. - """ - sslobj: ssl.SSLObject = sock_or_sslobj # type: ignore[assignment] - try: - while not hasattr(sslobj, "get_unverified_chain"): - sslobj = sslobj._sslobj # type: ignore[attr-defined] - except AttributeError: - pass - - # SSLObject.get_unverified_chain() returns 'None' - # if the peer sends no certificates. This is common - # for the server-side scenario. - unverified_chain: typing.Sequence[_ssl.Certificate] = ( - sslobj.get_unverified_chain() or () # type: ignore[attr-defined] - ) - cert_bytes = [cert.public_bytes(_ssl.ENCODING_DER) for cert in unverified_chain] - _verify_peercerts_impl( - sock_or_sslobj.context, cert_bytes, server_hostname=server_hostname - ) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/truststore/_macos.py b/venv/lib/python3.12/site-packages/pip/_vendor/truststore/_macos.py deleted file mode 100644 index 7dc440b..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/truststore/_macos.py +++ /dev/null @@ -1,501 +0,0 @@ -import contextlib -import ctypes -import platform -import ssl -import typing -from ctypes import ( - CDLL, - POINTER, - c_bool, - c_char_p, - c_int32, - c_long, - c_uint32, - c_ulong, - c_void_p, -) -from ctypes.util import find_library - -from ._ssl_constants import _set_ssl_context_verify_mode - -_mac_version = platform.mac_ver()[0] -_mac_version_info = tuple(map(int, _mac_version.split("."))) -if _mac_version_info < (10, 8): - raise ImportError( - f"Only OS X 10.8 and newer are supported, not {_mac_version_info[0]}.{_mac_version_info[1]}" - ) - - -def _load_cdll(name: str, macos10_16_path: str) -> CDLL: - """Loads a CDLL by name, falling back to known path on 10.16+""" - try: - # Big Sur is technically 11 but we use 10.16 due to the Big Sur - # beta being labeled as 10.16. - path: str | None - if _mac_version_info >= (10, 16): - path = macos10_16_path - else: - path = find_library(name) - if not path: - raise OSError # Caught and reraised as 'ImportError' - return CDLL(path, use_errno=True) - except OSError: - raise ImportError(f"The library {name} failed to load") from None - - -Security = _load_cdll( - "Security", "/System/Library/Frameworks/Security.framework/Security" -) -CoreFoundation = _load_cdll( - "CoreFoundation", - "/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation", -) - -Boolean = c_bool -CFIndex = c_long -CFStringEncoding = c_uint32 -CFData = c_void_p -CFString = c_void_p -CFArray = c_void_p -CFMutableArray = c_void_p -CFError = c_void_p -CFType = c_void_p -CFTypeID = c_ulong -CFTypeRef = POINTER(CFType) -CFAllocatorRef = c_void_p - -OSStatus = c_int32 - -CFErrorRef = POINTER(CFError) -CFDataRef = POINTER(CFData) -CFStringRef = POINTER(CFString) -CFArrayRef = POINTER(CFArray) -CFMutableArrayRef = POINTER(CFMutableArray) -CFArrayCallBacks = c_void_p -CFOptionFlags = c_uint32 - -SecCertificateRef = POINTER(c_void_p) -SecPolicyRef = POINTER(c_void_p) -SecTrustRef = POINTER(c_void_p) -SecTrustResultType = c_uint32 -SecTrustOptionFlags = c_uint32 - -try: - Security.SecCertificateCreateWithData.argtypes = [CFAllocatorRef, CFDataRef] - Security.SecCertificateCreateWithData.restype = SecCertificateRef - - Security.SecCertificateCopyData.argtypes = [SecCertificateRef] - Security.SecCertificateCopyData.restype = CFDataRef - - Security.SecCopyErrorMessageString.argtypes = [OSStatus, c_void_p] - Security.SecCopyErrorMessageString.restype = CFStringRef - - Security.SecTrustSetAnchorCertificates.argtypes = [SecTrustRef, CFArrayRef] - Security.SecTrustSetAnchorCertificates.restype = OSStatus - - Security.SecTrustSetAnchorCertificatesOnly.argtypes = [SecTrustRef, Boolean] - Security.SecTrustSetAnchorCertificatesOnly.restype = OSStatus - - Security.SecTrustEvaluate.argtypes = [SecTrustRef, POINTER(SecTrustResultType)] - Security.SecTrustEvaluate.restype = OSStatus - - Security.SecPolicyCreateRevocation.argtypes = [CFOptionFlags] - Security.SecPolicyCreateRevocation.restype = SecPolicyRef - - Security.SecPolicyCreateSSL.argtypes = [Boolean, CFStringRef] - Security.SecPolicyCreateSSL.restype = SecPolicyRef - - Security.SecTrustCreateWithCertificates.argtypes = [ - CFTypeRef, - CFTypeRef, - POINTER(SecTrustRef), - ] - Security.SecTrustCreateWithCertificates.restype = OSStatus - - Security.SecTrustGetTrustResult.argtypes = [ - SecTrustRef, - POINTER(SecTrustResultType), - ] - Security.SecTrustGetTrustResult.restype = OSStatus - - Security.SecTrustRef = SecTrustRef # type: ignore[attr-defined] - Security.SecTrustResultType = SecTrustResultType # type: ignore[attr-defined] - Security.OSStatus = OSStatus # type: ignore[attr-defined] - - kSecRevocationUseAnyAvailableMethod = 3 - kSecRevocationRequirePositiveResponse = 8 - - CoreFoundation.CFRelease.argtypes = [CFTypeRef] - CoreFoundation.CFRelease.restype = None - - CoreFoundation.CFGetTypeID.argtypes = [CFTypeRef] - CoreFoundation.CFGetTypeID.restype = CFTypeID - - CoreFoundation.CFStringCreateWithCString.argtypes = [ - CFAllocatorRef, - c_char_p, - CFStringEncoding, - ] - CoreFoundation.CFStringCreateWithCString.restype = CFStringRef - - CoreFoundation.CFStringGetCStringPtr.argtypes = [CFStringRef, CFStringEncoding] - CoreFoundation.CFStringGetCStringPtr.restype = c_char_p - - CoreFoundation.CFStringGetCString.argtypes = [ - CFStringRef, - c_char_p, - CFIndex, - CFStringEncoding, - ] - CoreFoundation.CFStringGetCString.restype = c_bool - - CoreFoundation.CFDataCreate.argtypes = [CFAllocatorRef, c_char_p, CFIndex] - CoreFoundation.CFDataCreate.restype = CFDataRef - - CoreFoundation.CFDataGetLength.argtypes = [CFDataRef] - CoreFoundation.CFDataGetLength.restype = CFIndex - - CoreFoundation.CFDataGetBytePtr.argtypes = [CFDataRef] - CoreFoundation.CFDataGetBytePtr.restype = c_void_p - - CoreFoundation.CFArrayCreate.argtypes = [ - CFAllocatorRef, - POINTER(CFTypeRef), - CFIndex, - CFArrayCallBacks, - ] - CoreFoundation.CFArrayCreate.restype = CFArrayRef - - CoreFoundation.CFArrayCreateMutable.argtypes = [ - CFAllocatorRef, - CFIndex, - CFArrayCallBacks, - ] - CoreFoundation.CFArrayCreateMutable.restype = CFMutableArrayRef - - CoreFoundation.CFArrayAppendValue.argtypes = [CFMutableArrayRef, c_void_p] - CoreFoundation.CFArrayAppendValue.restype = None - - CoreFoundation.CFArrayGetCount.argtypes = [CFArrayRef] - CoreFoundation.CFArrayGetCount.restype = CFIndex - - CoreFoundation.CFArrayGetValueAtIndex.argtypes = [CFArrayRef, CFIndex] - CoreFoundation.CFArrayGetValueAtIndex.restype = c_void_p - - CoreFoundation.CFErrorGetCode.argtypes = [CFErrorRef] - CoreFoundation.CFErrorGetCode.restype = CFIndex - - CoreFoundation.CFErrorCopyDescription.argtypes = [CFErrorRef] - CoreFoundation.CFErrorCopyDescription.restype = CFStringRef - - CoreFoundation.kCFAllocatorDefault = CFAllocatorRef.in_dll( # type: ignore[attr-defined] - CoreFoundation, "kCFAllocatorDefault" - ) - CoreFoundation.kCFTypeArrayCallBacks = c_void_p.in_dll( # type: ignore[attr-defined] - CoreFoundation, "kCFTypeArrayCallBacks" - ) - - CoreFoundation.CFTypeRef = CFTypeRef # type: ignore[attr-defined] - CoreFoundation.CFArrayRef = CFArrayRef # type: ignore[attr-defined] - CoreFoundation.CFStringRef = CFStringRef # type: ignore[attr-defined] - CoreFoundation.CFErrorRef = CFErrorRef # type: ignore[attr-defined] - -except AttributeError: - raise ImportError("Error initializing ctypes") from None - - -def _handle_osstatus(result: OSStatus, _: typing.Any, args: typing.Any) -> typing.Any: - """ - Raises an error if the OSStatus value is non-zero. - """ - if int(result) == 0: - return args - - # Returns a CFString which we need to transform - # into a UTF-8 Python string. - error_message_cfstring = None - try: - error_message_cfstring = Security.SecCopyErrorMessageString(result, None) - - # First step is convert the CFString into a C string pointer. - # We try the fast no-copy way first. - error_message_cfstring_c_void_p = ctypes.cast( - error_message_cfstring, ctypes.POINTER(ctypes.c_void_p) - ) - message = CoreFoundation.CFStringGetCStringPtr( - error_message_cfstring_c_void_p, CFConst.kCFStringEncodingUTF8 - ) - - # Quoting the Apple dev docs: - # - # "A pointer to a C string or NULL if the internal - # storage of theString does not allow this to be - # returned efficiently." - # - # So we need to get our hands dirty. - if message is None: - buffer = ctypes.create_string_buffer(1024) - result = CoreFoundation.CFStringGetCString( - error_message_cfstring_c_void_p, - buffer, - 1024, - CFConst.kCFStringEncodingUTF8, - ) - if not result: - raise OSError("Error copying C string from CFStringRef") - message = buffer.value - - finally: - if error_message_cfstring is not None: - CoreFoundation.CFRelease(error_message_cfstring) - - # If no message can be found for this status we come - # up with a generic one that forwards the status code. - if message is None or message == "": - message = f"SecureTransport operation returned a non-zero OSStatus: {result}" - - raise ssl.SSLError(message) - - -Security.SecTrustCreateWithCertificates.errcheck = _handle_osstatus # type: ignore[assignment] -Security.SecTrustSetAnchorCertificates.errcheck = _handle_osstatus # type: ignore[assignment] -Security.SecTrustGetTrustResult.errcheck = _handle_osstatus # type: ignore[assignment] - - -class CFConst: - """CoreFoundation constants""" - - kCFStringEncodingUTF8 = CFStringEncoding(0x08000100) - - errSecIncompleteCertRevocationCheck = -67635 - errSecHostNameMismatch = -67602 - errSecCertificateExpired = -67818 - errSecNotTrusted = -67843 - - -def _bytes_to_cf_data_ref(value: bytes) -> CFDataRef: # type: ignore[valid-type] - return CoreFoundation.CFDataCreate( # type: ignore[no-any-return] - CoreFoundation.kCFAllocatorDefault, value, len(value) - ) - - -def _bytes_to_cf_string(value: bytes) -> CFString: - """ - Given a Python binary data, create a CFString. - The string must be CFReleased by the caller. - """ - c_str = ctypes.c_char_p(value) - cf_str = CoreFoundation.CFStringCreateWithCString( - CoreFoundation.kCFAllocatorDefault, - c_str, - CFConst.kCFStringEncodingUTF8, - ) - return cf_str # type: ignore[no-any-return] - - -def _cf_string_ref_to_str(cf_string_ref: CFStringRef) -> str | None: # type: ignore[valid-type] - """ - Creates a Unicode string from a CFString object. Used entirely for error - reporting. - Yes, it annoys me quite a lot that this function is this complex. - """ - - string = CoreFoundation.CFStringGetCStringPtr( - cf_string_ref, CFConst.kCFStringEncodingUTF8 - ) - if string is None: - buffer = ctypes.create_string_buffer(1024) - result = CoreFoundation.CFStringGetCString( - cf_string_ref, buffer, 1024, CFConst.kCFStringEncodingUTF8 - ) - if not result: - raise OSError("Error copying C string from CFStringRef") - string = buffer.value - if string is not None: - string = string.decode("utf-8") - return string # type: ignore[no-any-return] - - -def _der_certs_to_cf_cert_array(certs: list[bytes]) -> CFMutableArrayRef: # type: ignore[valid-type] - """Builds a CFArray of SecCertificateRefs from a list of DER-encoded certificates. - Responsibility of the caller to call CoreFoundation.CFRelease on the CFArray. - """ - cf_array = CoreFoundation.CFArrayCreateMutable( - CoreFoundation.kCFAllocatorDefault, - 0, - ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks), - ) - if not cf_array: - raise MemoryError("Unable to allocate memory!") - - for cert_data in certs: - cf_data = None - sec_cert_ref = None - try: - cf_data = _bytes_to_cf_data_ref(cert_data) - sec_cert_ref = Security.SecCertificateCreateWithData( - CoreFoundation.kCFAllocatorDefault, cf_data - ) - CoreFoundation.CFArrayAppendValue(cf_array, sec_cert_ref) - finally: - if cf_data: - CoreFoundation.CFRelease(cf_data) - if sec_cert_ref: - CoreFoundation.CFRelease(sec_cert_ref) - - return cf_array # type: ignore[no-any-return] - - -@contextlib.contextmanager -def _configure_context(ctx: ssl.SSLContext) -> typing.Iterator[None]: - check_hostname = ctx.check_hostname - verify_mode = ctx.verify_mode - ctx.check_hostname = False - _set_ssl_context_verify_mode(ctx, ssl.CERT_NONE) - try: - yield - finally: - ctx.check_hostname = check_hostname - _set_ssl_context_verify_mode(ctx, verify_mode) - - -def _verify_peercerts_impl( - ssl_context: ssl.SSLContext, - cert_chain: list[bytes], - server_hostname: str | None = None, -) -> None: - certs = None - policies = None - trust = None - cf_error = None - try: - if server_hostname is not None: - cf_str_hostname = None - try: - cf_str_hostname = _bytes_to_cf_string(server_hostname.encode("ascii")) - ssl_policy = Security.SecPolicyCreateSSL(True, cf_str_hostname) - finally: - if cf_str_hostname: - CoreFoundation.CFRelease(cf_str_hostname) - else: - ssl_policy = Security.SecPolicyCreateSSL(True, None) - - policies = ssl_policy - if ssl_context.verify_flags & ssl.VERIFY_CRL_CHECK_CHAIN: - # Add explicit policy requiring positive revocation checks - policies = CoreFoundation.CFArrayCreateMutable( - CoreFoundation.kCFAllocatorDefault, - 0, - ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks), - ) - CoreFoundation.CFArrayAppendValue(policies, ssl_policy) - CoreFoundation.CFRelease(ssl_policy) - revocation_policy = Security.SecPolicyCreateRevocation( - kSecRevocationUseAnyAvailableMethod - | kSecRevocationRequirePositiveResponse - ) - CoreFoundation.CFArrayAppendValue(policies, revocation_policy) - CoreFoundation.CFRelease(revocation_policy) - elif ssl_context.verify_flags & ssl.VERIFY_CRL_CHECK_LEAF: - raise NotImplementedError("VERIFY_CRL_CHECK_LEAF not implemented for macOS") - - certs = None - try: - certs = _der_certs_to_cf_cert_array(cert_chain) - - # Now that we have certificates loaded and a SecPolicy - # we can finally create a SecTrust object! - trust = Security.SecTrustRef() - Security.SecTrustCreateWithCertificates( - certs, policies, ctypes.byref(trust) - ) - - finally: - # The certs are now being held by SecTrust so we can - # release our handles for the array. - if certs: - CoreFoundation.CFRelease(certs) - - # If there are additional trust anchors to load we need to transform - # the list of DER-encoded certificates into a CFArray. Otherwise - # pass 'None' to signal that we only want system / fetched certificates. - ctx_ca_certs_der: list[bytes] | None = ssl_context.get_ca_certs( - binary_form=True - ) - if ctx_ca_certs_der: - ctx_ca_certs = None - try: - ctx_ca_certs = _der_certs_to_cf_cert_array(cert_chain) - Security.SecTrustSetAnchorCertificates(trust, ctx_ca_certs) - finally: - if ctx_ca_certs: - CoreFoundation.CFRelease(ctx_ca_certs) - else: - Security.SecTrustSetAnchorCertificates(trust, None) - - cf_error = CoreFoundation.CFErrorRef() - sec_trust_eval_result = Security.SecTrustEvaluateWithError( - trust, ctypes.byref(cf_error) - ) - # sec_trust_eval_result is a bool (0 or 1) - # where 1 means that the certs are trusted. - if sec_trust_eval_result == 1: - is_trusted = True - elif sec_trust_eval_result == 0: - is_trusted = False - else: - raise ssl.SSLError( - f"Unknown result from Security.SecTrustEvaluateWithError: {sec_trust_eval_result!r}" - ) - - cf_error_code = 0 - if not is_trusted: - cf_error_code = CoreFoundation.CFErrorGetCode(cf_error) - - # If the error is a known failure that we're - # explicitly okay with from SSLContext configuration - # we can set is_trusted accordingly. - if ssl_context.verify_mode != ssl.CERT_REQUIRED and ( - cf_error_code == CFConst.errSecNotTrusted - or cf_error_code == CFConst.errSecCertificateExpired - ): - is_trusted = True - elif ( - not ssl_context.check_hostname - and cf_error_code == CFConst.errSecHostNameMismatch - ): - is_trusted = True - - # If we're still not trusted then we start to - # construct and raise the SSLCertVerificationError. - if not is_trusted: - cf_error_string_ref = None - try: - cf_error_string_ref = CoreFoundation.CFErrorCopyDescription(cf_error) - - # Can this ever return 'None' if there's a CFError? - cf_error_message = ( - _cf_string_ref_to_str(cf_error_string_ref) - or "Certificate verification failed" - ) - - # TODO: Not sure if we need the SecTrustResultType for anything? - # We only care whether or not it's a success or failure for now. - sec_trust_result_type = Security.SecTrustResultType() - Security.SecTrustGetTrustResult( - trust, ctypes.byref(sec_trust_result_type) - ) - - err = ssl.SSLCertVerificationError(cf_error_message) - err.verify_message = cf_error_message - err.verify_code = cf_error_code - raise err - finally: - if cf_error_string_ref: - CoreFoundation.CFRelease(cf_error_string_ref) - - finally: - if policies: - CoreFoundation.CFRelease(policies) - if trust: - CoreFoundation.CFRelease(trust) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/truststore/_openssl.py b/venv/lib/python3.12/site-packages/pip/_vendor/truststore/_openssl.py deleted file mode 100644 index 9951cf7..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/truststore/_openssl.py +++ /dev/null @@ -1,66 +0,0 @@ -import contextlib -import os -import re -import ssl -import typing - -# candidates based on https://github.com/tiran/certifi-system-store by Christian Heimes -_CA_FILE_CANDIDATES = [ - # Alpine, Arch, Fedora 34+, OpenWRT, RHEL 9+, BSD - "/etc/ssl/cert.pem", - # Fedora <= 34, RHEL <= 9, CentOS <= 9 - "/etc/pki/tls/cert.pem", - # Debian, Ubuntu (requires ca-certificates) - "/etc/ssl/certs/ca-certificates.crt", - # SUSE - "/etc/ssl/ca-bundle.pem", -] - -_HASHED_CERT_FILENAME_RE = re.compile(r"^[0-9a-fA-F]{8}\.[0-9]$") - - -@contextlib.contextmanager -def _configure_context(ctx: ssl.SSLContext) -> typing.Iterator[None]: - # First, check whether the default locations from OpenSSL - # seem like they will give us a usable set of CA certs. - # ssl.get_default_verify_paths already takes care of: - # - getting cafile from either the SSL_CERT_FILE env var - # or the path configured when OpenSSL was compiled, - # and verifying that that path exists - # - getting capath from either the SSL_CERT_DIR env var - # or the path configured when OpenSSL was compiled, - # and verifying that that path exists - # In addition we'll check whether capath appears to contain certs. - defaults = ssl.get_default_verify_paths() - if defaults.cafile or (defaults.capath and _capath_contains_certs(defaults.capath)): - ctx.set_default_verify_paths() - else: - # cafile from OpenSSL doesn't exist - # and capath from OpenSSL doesn't contain certs. - # Let's search other common locations instead. - for cafile in _CA_FILE_CANDIDATES: - if os.path.isfile(cafile): - ctx.load_verify_locations(cafile=cafile) - break - - yield - - -def _capath_contains_certs(capath: str) -> bool: - """Check whether capath exists and contains certs in the expected format.""" - if not os.path.isdir(capath): - return False - for name in os.listdir(capath): - if _HASHED_CERT_FILENAME_RE.match(name): - return True - return False - - -def _verify_peercerts_impl( - ssl_context: ssl.SSLContext, - cert_chain: list[bytes], - server_hostname: str | None = None, -) -> None: - # This is a no-op because we've enabled SSLContext's built-in - # verification via verify_mode=CERT_REQUIRED, and don't need to repeat it. - pass diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/truststore/_ssl_constants.py b/venv/lib/python3.12/site-packages/pip/_vendor/truststore/_ssl_constants.py deleted file mode 100644 index b1ee7a3..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/truststore/_ssl_constants.py +++ /dev/null @@ -1,31 +0,0 @@ -import ssl -import sys -import typing - -# Hold on to the original class so we can create it consistently -# even if we inject our own SSLContext into the ssl module. -_original_SSLContext = ssl.SSLContext -_original_super_SSLContext = super(_original_SSLContext, _original_SSLContext) - -# CPython is known to be good, but non-CPython implementations -# may implement SSLContext differently so to be safe we don't -# subclass the SSLContext. - -# This is returned by truststore.SSLContext.__class__() -_truststore_SSLContext_dunder_class: typing.Optional[type] - -# This value is the superclass of truststore.SSLContext. -_truststore_SSLContext_super_class: type - -if sys.implementation.name == "cpython": - _truststore_SSLContext_super_class = _original_SSLContext - _truststore_SSLContext_dunder_class = None -else: - _truststore_SSLContext_super_class = object - _truststore_SSLContext_dunder_class = _original_SSLContext - - -def _set_ssl_context_verify_mode( - ssl_context: ssl.SSLContext, verify_mode: ssl.VerifyMode -) -> None: - _original_super_SSLContext.verify_mode.__set__(ssl_context, verify_mode) # type: ignore[attr-defined] diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/truststore/_windows.py b/venv/lib/python3.12/site-packages/pip/_vendor/truststore/_windows.py deleted file mode 100644 index 3de4960..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/truststore/_windows.py +++ /dev/null @@ -1,554 +0,0 @@ -import contextlib -import ssl -import typing -from ctypes import WinDLL # type: ignore -from ctypes import WinError # type: ignore -from ctypes import ( - POINTER, - Structure, - c_char_p, - c_ulong, - c_void_p, - c_wchar_p, - cast, - create_unicode_buffer, - pointer, - sizeof, -) -from ctypes.wintypes import ( - BOOL, - DWORD, - HANDLE, - LONG, - LPCSTR, - LPCVOID, - LPCWSTR, - LPFILETIME, - LPSTR, - LPWSTR, -) -from typing import TYPE_CHECKING, Any - -from ._ssl_constants import _set_ssl_context_verify_mode - -HCERTCHAINENGINE = HANDLE -HCERTSTORE = HANDLE -HCRYPTPROV_LEGACY = HANDLE - - -class CERT_CONTEXT(Structure): - _fields_ = ( - ("dwCertEncodingType", DWORD), - ("pbCertEncoded", c_void_p), - ("cbCertEncoded", DWORD), - ("pCertInfo", c_void_p), - ("hCertStore", HCERTSTORE), - ) - - -PCERT_CONTEXT = POINTER(CERT_CONTEXT) -PCCERT_CONTEXT = POINTER(PCERT_CONTEXT) - - -class CERT_ENHKEY_USAGE(Structure): - _fields_ = ( - ("cUsageIdentifier", DWORD), - ("rgpszUsageIdentifier", POINTER(LPSTR)), - ) - - -PCERT_ENHKEY_USAGE = POINTER(CERT_ENHKEY_USAGE) - - -class CERT_USAGE_MATCH(Structure): - _fields_ = ( - ("dwType", DWORD), - ("Usage", CERT_ENHKEY_USAGE), - ) - - -class CERT_CHAIN_PARA(Structure): - _fields_ = ( - ("cbSize", DWORD), - ("RequestedUsage", CERT_USAGE_MATCH), - ("RequestedIssuancePolicy", CERT_USAGE_MATCH), - ("dwUrlRetrievalTimeout", DWORD), - ("fCheckRevocationFreshnessTime", BOOL), - ("dwRevocationFreshnessTime", DWORD), - ("pftCacheResync", LPFILETIME), - ("pStrongSignPara", c_void_p), - ("dwStrongSignFlags", DWORD), - ) - - -if TYPE_CHECKING: - PCERT_CHAIN_PARA = pointer[CERT_CHAIN_PARA] # type: ignore[misc] -else: - PCERT_CHAIN_PARA = POINTER(CERT_CHAIN_PARA) - - -class CERT_TRUST_STATUS(Structure): - _fields_ = ( - ("dwErrorStatus", DWORD), - ("dwInfoStatus", DWORD), - ) - - -class CERT_CHAIN_ELEMENT(Structure): - _fields_ = ( - ("cbSize", DWORD), - ("pCertContext", PCERT_CONTEXT), - ("TrustStatus", CERT_TRUST_STATUS), - ("pRevocationInfo", c_void_p), - ("pIssuanceUsage", PCERT_ENHKEY_USAGE), - ("pApplicationUsage", PCERT_ENHKEY_USAGE), - ("pwszExtendedErrorInfo", LPCWSTR), - ) - - -PCERT_CHAIN_ELEMENT = POINTER(CERT_CHAIN_ELEMENT) - - -class CERT_SIMPLE_CHAIN(Structure): - _fields_ = ( - ("cbSize", DWORD), - ("TrustStatus", CERT_TRUST_STATUS), - ("cElement", DWORD), - ("rgpElement", POINTER(PCERT_CHAIN_ELEMENT)), - ("pTrustListInfo", c_void_p), - ("fHasRevocationFreshnessTime", BOOL), - ("dwRevocationFreshnessTime", DWORD), - ) - - -PCERT_SIMPLE_CHAIN = POINTER(CERT_SIMPLE_CHAIN) - - -class CERT_CHAIN_CONTEXT(Structure): - _fields_ = ( - ("cbSize", DWORD), - ("TrustStatus", CERT_TRUST_STATUS), - ("cChain", DWORD), - ("rgpChain", POINTER(PCERT_SIMPLE_CHAIN)), - ("cLowerQualityChainContext", DWORD), - ("rgpLowerQualityChainContext", c_void_p), - ("fHasRevocationFreshnessTime", BOOL), - ("dwRevocationFreshnessTime", DWORD), - ) - - -PCERT_CHAIN_CONTEXT = POINTER(CERT_CHAIN_CONTEXT) -PCCERT_CHAIN_CONTEXT = POINTER(PCERT_CHAIN_CONTEXT) - - -class SSL_EXTRA_CERT_CHAIN_POLICY_PARA(Structure): - _fields_ = ( - ("cbSize", DWORD), - ("dwAuthType", DWORD), - ("fdwChecks", DWORD), - ("pwszServerName", LPCWSTR), - ) - - -class CERT_CHAIN_POLICY_PARA(Structure): - _fields_ = ( - ("cbSize", DWORD), - ("dwFlags", DWORD), - ("pvExtraPolicyPara", c_void_p), - ) - - -PCERT_CHAIN_POLICY_PARA = POINTER(CERT_CHAIN_POLICY_PARA) - - -class CERT_CHAIN_POLICY_STATUS(Structure): - _fields_ = ( - ("cbSize", DWORD), - ("dwError", DWORD), - ("lChainIndex", LONG), - ("lElementIndex", LONG), - ("pvExtraPolicyStatus", c_void_p), - ) - - -PCERT_CHAIN_POLICY_STATUS = POINTER(CERT_CHAIN_POLICY_STATUS) - - -class CERT_CHAIN_ENGINE_CONFIG(Structure): - _fields_ = ( - ("cbSize", DWORD), - ("hRestrictedRoot", HCERTSTORE), - ("hRestrictedTrust", HCERTSTORE), - ("hRestrictedOther", HCERTSTORE), - ("cAdditionalStore", DWORD), - ("rghAdditionalStore", c_void_p), - ("dwFlags", DWORD), - ("dwUrlRetrievalTimeout", DWORD), - ("MaximumCachedCertificates", DWORD), - ("CycleDetectionModulus", DWORD), - ("hExclusiveRoot", HCERTSTORE), - ("hExclusiveTrustedPeople", HCERTSTORE), - ("dwExclusiveFlags", DWORD), - ) - - -PCERT_CHAIN_ENGINE_CONFIG = POINTER(CERT_CHAIN_ENGINE_CONFIG) -PHCERTCHAINENGINE = POINTER(HCERTCHAINENGINE) - -X509_ASN_ENCODING = 0x00000001 -PKCS_7_ASN_ENCODING = 0x00010000 -CERT_STORE_PROV_MEMORY = b"Memory" -CERT_STORE_ADD_USE_EXISTING = 2 -USAGE_MATCH_TYPE_OR = 1 -OID_PKIX_KP_SERVER_AUTH = c_char_p(b"1.3.6.1.5.5.7.3.1") -CERT_CHAIN_REVOCATION_CHECK_END_CERT = 0x10000000 -CERT_CHAIN_REVOCATION_CHECK_CHAIN = 0x20000000 -CERT_CHAIN_POLICY_IGNORE_ALL_NOT_TIME_VALID_FLAGS = 0x00000007 -CERT_CHAIN_POLICY_IGNORE_INVALID_BASIC_CONSTRAINTS_FLAG = 0x00000008 -CERT_CHAIN_POLICY_ALLOW_UNKNOWN_CA_FLAG = 0x00000010 -CERT_CHAIN_POLICY_IGNORE_INVALID_NAME_FLAG = 0x00000040 -CERT_CHAIN_POLICY_IGNORE_WRONG_USAGE_FLAG = 0x00000020 -CERT_CHAIN_POLICY_IGNORE_INVALID_POLICY_FLAG = 0x00000080 -CERT_CHAIN_POLICY_IGNORE_ALL_REV_UNKNOWN_FLAGS = 0x00000F00 -CERT_CHAIN_POLICY_ALLOW_TESTROOT_FLAG = 0x00008000 -CERT_CHAIN_POLICY_TRUST_TESTROOT_FLAG = 0x00004000 -AUTHTYPE_SERVER = 2 -CERT_CHAIN_POLICY_SSL = 4 -FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000 -FORMAT_MESSAGE_IGNORE_INSERTS = 0x00000200 - -# Flags to set for SSLContext.verify_mode=CERT_NONE -CERT_CHAIN_POLICY_VERIFY_MODE_NONE_FLAGS = ( - CERT_CHAIN_POLICY_IGNORE_ALL_NOT_TIME_VALID_FLAGS - | CERT_CHAIN_POLICY_IGNORE_INVALID_BASIC_CONSTRAINTS_FLAG - | CERT_CHAIN_POLICY_ALLOW_UNKNOWN_CA_FLAG - | CERT_CHAIN_POLICY_IGNORE_INVALID_NAME_FLAG - | CERT_CHAIN_POLICY_IGNORE_WRONG_USAGE_FLAG - | CERT_CHAIN_POLICY_IGNORE_INVALID_POLICY_FLAG - | CERT_CHAIN_POLICY_IGNORE_ALL_REV_UNKNOWN_FLAGS - | CERT_CHAIN_POLICY_ALLOW_TESTROOT_FLAG - | CERT_CHAIN_POLICY_TRUST_TESTROOT_FLAG -) - -wincrypt = WinDLL("crypt32.dll") -kernel32 = WinDLL("kernel32.dll") - - -def _handle_win_error(result: bool, _: Any, args: Any) -> Any: - if not result: - # Note, actually raises OSError after calling GetLastError and FormatMessage - raise WinError() - return args - - -CertCreateCertificateChainEngine = wincrypt.CertCreateCertificateChainEngine -CertCreateCertificateChainEngine.argtypes = ( - PCERT_CHAIN_ENGINE_CONFIG, - PHCERTCHAINENGINE, -) -CertCreateCertificateChainEngine.errcheck = _handle_win_error - -CertOpenStore = wincrypt.CertOpenStore -CertOpenStore.argtypes = (LPCSTR, DWORD, HCRYPTPROV_LEGACY, DWORD, c_void_p) -CertOpenStore.restype = HCERTSTORE -CertOpenStore.errcheck = _handle_win_error - -CertAddEncodedCertificateToStore = wincrypt.CertAddEncodedCertificateToStore -CertAddEncodedCertificateToStore.argtypes = ( - HCERTSTORE, - DWORD, - c_char_p, - DWORD, - DWORD, - PCCERT_CONTEXT, -) -CertAddEncodedCertificateToStore.restype = BOOL - -CertCreateCertificateContext = wincrypt.CertCreateCertificateContext -CertCreateCertificateContext.argtypes = (DWORD, c_char_p, DWORD) -CertCreateCertificateContext.restype = PCERT_CONTEXT -CertCreateCertificateContext.errcheck = _handle_win_error - -CertGetCertificateChain = wincrypt.CertGetCertificateChain -CertGetCertificateChain.argtypes = ( - HCERTCHAINENGINE, - PCERT_CONTEXT, - LPFILETIME, - HCERTSTORE, - PCERT_CHAIN_PARA, - DWORD, - c_void_p, - PCCERT_CHAIN_CONTEXT, -) -CertGetCertificateChain.restype = BOOL -CertGetCertificateChain.errcheck = _handle_win_error - -CertVerifyCertificateChainPolicy = wincrypt.CertVerifyCertificateChainPolicy -CertVerifyCertificateChainPolicy.argtypes = ( - c_ulong, - PCERT_CHAIN_CONTEXT, - PCERT_CHAIN_POLICY_PARA, - PCERT_CHAIN_POLICY_STATUS, -) -CertVerifyCertificateChainPolicy.restype = BOOL - -CertCloseStore = wincrypt.CertCloseStore -CertCloseStore.argtypes = (HCERTSTORE, DWORD) -CertCloseStore.restype = BOOL -CertCloseStore.errcheck = _handle_win_error - -CertFreeCertificateChain = wincrypt.CertFreeCertificateChain -CertFreeCertificateChain.argtypes = (PCERT_CHAIN_CONTEXT,) - -CertFreeCertificateContext = wincrypt.CertFreeCertificateContext -CertFreeCertificateContext.argtypes = (PCERT_CONTEXT,) - -CertFreeCertificateChainEngine = wincrypt.CertFreeCertificateChainEngine -CertFreeCertificateChainEngine.argtypes = (HCERTCHAINENGINE,) - -FormatMessageW = kernel32.FormatMessageW -FormatMessageW.argtypes = ( - DWORD, - LPCVOID, - DWORD, - DWORD, - LPWSTR, - DWORD, - c_void_p, -) -FormatMessageW.restype = DWORD - - -def _verify_peercerts_impl( - ssl_context: ssl.SSLContext, - cert_chain: list[bytes], - server_hostname: str | None = None, -) -> None: - """Verify the cert_chain from the server using Windows APIs.""" - pCertContext = None - hIntermediateCertStore = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, None, 0, None) - try: - # Add intermediate certs to an in-memory cert store - for cert_bytes in cert_chain[1:]: - CertAddEncodedCertificateToStore( - hIntermediateCertStore, - X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, - cert_bytes, - len(cert_bytes), - CERT_STORE_ADD_USE_EXISTING, - None, - ) - - # Cert context for leaf cert - leaf_cert = cert_chain[0] - pCertContext = CertCreateCertificateContext( - X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, leaf_cert, len(leaf_cert) - ) - - # Chain params to match certs for serverAuth extended usage - cert_enhkey_usage = CERT_ENHKEY_USAGE() - cert_enhkey_usage.cUsageIdentifier = 1 - cert_enhkey_usage.rgpszUsageIdentifier = (c_char_p * 1)(OID_PKIX_KP_SERVER_AUTH) - cert_usage_match = CERT_USAGE_MATCH() - cert_usage_match.Usage = cert_enhkey_usage - chain_params = CERT_CHAIN_PARA() - chain_params.RequestedUsage = cert_usage_match - chain_params.cbSize = sizeof(chain_params) - pChainPara = pointer(chain_params) - - if ssl_context.verify_flags & ssl.VERIFY_CRL_CHECK_CHAIN: - chain_flags = CERT_CHAIN_REVOCATION_CHECK_CHAIN - elif ssl_context.verify_flags & ssl.VERIFY_CRL_CHECK_LEAF: - chain_flags = CERT_CHAIN_REVOCATION_CHECK_END_CERT - else: - chain_flags = 0 - - try: - # First attempt to verify using the default Windows system trust roots - # (default chain engine). - _get_and_verify_cert_chain( - ssl_context, - None, - hIntermediateCertStore, - pCertContext, - pChainPara, - server_hostname, - chain_flags=chain_flags, - ) - except ssl.SSLCertVerificationError: - # If that fails but custom CA certs have been added - # to the SSLContext using load_verify_locations, - # try verifying using a custom chain engine - # that trusts the custom CA certs. - custom_ca_certs: list[bytes] | None = ssl_context.get_ca_certs( - binary_form=True - ) - if custom_ca_certs: - _verify_using_custom_ca_certs( - ssl_context, - custom_ca_certs, - hIntermediateCertStore, - pCertContext, - pChainPara, - server_hostname, - chain_flags=chain_flags, - ) - else: - raise - finally: - CertCloseStore(hIntermediateCertStore, 0) - if pCertContext: - CertFreeCertificateContext(pCertContext) - - -def _get_and_verify_cert_chain( - ssl_context: ssl.SSLContext, - hChainEngine: HCERTCHAINENGINE | None, - hIntermediateCertStore: HCERTSTORE, - pPeerCertContext: c_void_p, - pChainPara: PCERT_CHAIN_PARA, # type: ignore[valid-type] - server_hostname: str | None, - chain_flags: int, -) -> None: - ppChainContext = None - try: - # Get cert chain - ppChainContext = pointer(PCERT_CHAIN_CONTEXT()) - CertGetCertificateChain( - hChainEngine, # chain engine - pPeerCertContext, # leaf cert context - None, # current system time - hIntermediateCertStore, # additional in-memory cert store - pChainPara, # chain-building parameters - chain_flags, - None, # reserved - ppChainContext, # the resulting chain context - ) - pChainContext = ppChainContext.contents - - # Verify cert chain - ssl_extra_cert_chain_policy_para = SSL_EXTRA_CERT_CHAIN_POLICY_PARA() - ssl_extra_cert_chain_policy_para.cbSize = sizeof( - ssl_extra_cert_chain_policy_para - ) - ssl_extra_cert_chain_policy_para.dwAuthType = AUTHTYPE_SERVER - ssl_extra_cert_chain_policy_para.fdwChecks = 0 - if server_hostname: - ssl_extra_cert_chain_policy_para.pwszServerName = c_wchar_p(server_hostname) - - chain_policy = CERT_CHAIN_POLICY_PARA() - chain_policy.pvExtraPolicyPara = cast( - pointer(ssl_extra_cert_chain_policy_para), c_void_p - ) - if ssl_context.verify_mode == ssl.CERT_NONE: - chain_policy.dwFlags |= CERT_CHAIN_POLICY_VERIFY_MODE_NONE_FLAGS - if not ssl_context.check_hostname: - chain_policy.dwFlags |= CERT_CHAIN_POLICY_IGNORE_INVALID_NAME_FLAG - chain_policy.cbSize = sizeof(chain_policy) - - pPolicyPara = pointer(chain_policy) - policy_status = CERT_CHAIN_POLICY_STATUS() - policy_status.cbSize = sizeof(policy_status) - pPolicyStatus = pointer(policy_status) - CertVerifyCertificateChainPolicy( - CERT_CHAIN_POLICY_SSL, - pChainContext, - pPolicyPara, - pPolicyStatus, - ) - - # Check status - error_code = policy_status.dwError - if error_code: - # Try getting a human readable message for an error code. - error_message_buf = create_unicode_buffer(1024) - error_message_chars = FormatMessageW( - FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, - None, - error_code, - 0, - error_message_buf, - sizeof(error_message_buf), - None, - ) - - # See if we received a message for the error, - # otherwise we use a generic error with the - # error code and hope that it's search-able. - if error_message_chars <= 0: - error_message = f"Certificate chain policy error {error_code:#x} [{policy_status.lElementIndex}]" - else: - error_message = error_message_buf.value.strip() - - err = ssl.SSLCertVerificationError(error_message) - err.verify_message = error_message - err.verify_code = error_code - raise err from None - finally: - if ppChainContext: - CertFreeCertificateChain(ppChainContext.contents) - - -def _verify_using_custom_ca_certs( - ssl_context: ssl.SSLContext, - custom_ca_certs: list[bytes], - hIntermediateCertStore: HCERTSTORE, - pPeerCertContext: c_void_p, - pChainPara: PCERT_CHAIN_PARA, # type: ignore[valid-type] - server_hostname: str | None, - chain_flags: int, -) -> None: - hChainEngine = None - hRootCertStore = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, None, 0, None) - try: - # Add custom CA certs to an in-memory cert store - for cert_bytes in custom_ca_certs: - CertAddEncodedCertificateToStore( - hRootCertStore, - X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, - cert_bytes, - len(cert_bytes), - CERT_STORE_ADD_USE_EXISTING, - None, - ) - - # Create a custom cert chain engine which exclusively trusts - # certs from our hRootCertStore - cert_chain_engine_config = CERT_CHAIN_ENGINE_CONFIG() - cert_chain_engine_config.cbSize = sizeof(cert_chain_engine_config) - cert_chain_engine_config.hExclusiveRoot = hRootCertStore - pConfig = pointer(cert_chain_engine_config) - phChainEngine = pointer(HCERTCHAINENGINE()) - CertCreateCertificateChainEngine( - pConfig, - phChainEngine, - ) - hChainEngine = phChainEngine.contents - - # Get and verify a cert chain using the custom chain engine - _get_and_verify_cert_chain( - ssl_context, - hChainEngine, - hIntermediateCertStore, - pPeerCertContext, - pChainPara, - server_hostname, - chain_flags, - ) - finally: - if hChainEngine: - CertFreeCertificateChainEngine(hChainEngine) - CertCloseStore(hRootCertStore, 0) - - -@contextlib.contextmanager -def _configure_context(ctx: ssl.SSLContext) -> typing.Iterator[None]: - check_hostname = ctx.check_hostname - verify_mode = ctx.verify_mode - ctx.check_hostname = False - _set_ssl_context_verify_mode(ctx, ssl.CERT_NONE) - try: - yield - finally: - ctx.check_hostname = check_hostname - _set_ssl_context_verify_mode(ctx, verify_mode) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/typing_extensions.py b/venv/lib/python3.12/site-packages/pip/_vendor/typing_extensions.py deleted file mode 100644 index 4f93acf..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/typing_extensions.py +++ /dev/null @@ -1,3072 +0,0 @@ -import abc -import collections -import collections.abc -import functools -import inspect -import operator -import sys -import types as _types -import typing -import warnings - -__all__ = [ - # Super-special typing primitives. - 'Any', - 'ClassVar', - 'Concatenate', - 'Final', - 'LiteralString', - 'ParamSpec', - 'ParamSpecArgs', - 'ParamSpecKwargs', - 'Self', - 'Type', - 'TypeVar', - 'TypeVarTuple', - 'Unpack', - - # ABCs (from collections.abc). - 'Awaitable', - 'AsyncIterator', - 'AsyncIterable', - 'Coroutine', - 'AsyncGenerator', - 'AsyncContextManager', - 'Buffer', - 'ChainMap', - - # Concrete collection types. - 'ContextManager', - 'Counter', - 'Deque', - 'DefaultDict', - 'NamedTuple', - 'OrderedDict', - 'TypedDict', - - # Structural checks, a.k.a. protocols. - 'SupportsAbs', - 'SupportsBytes', - 'SupportsComplex', - 'SupportsFloat', - 'SupportsIndex', - 'SupportsInt', - 'SupportsRound', - - # One-off things. - 'Annotated', - 'assert_never', - 'assert_type', - 'clear_overloads', - 'dataclass_transform', - 'deprecated', - 'get_overloads', - 'final', - 'get_args', - 'get_origin', - 'get_original_bases', - 'get_protocol_members', - 'get_type_hints', - 'IntVar', - 'is_protocol', - 'is_typeddict', - 'Literal', - 'NewType', - 'overload', - 'override', - 'Protocol', - 'reveal_type', - 'runtime', - 'runtime_checkable', - 'Text', - 'TypeAlias', - 'TypeAliasType', - 'TypeGuard', - 'TYPE_CHECKING', - 'Never', - 'NoReturn', - 'Required', - 'NotRequired', - - # Pure aliases, have always been in typing - 'AbstractSet', - 'AnyStr', - 'BinaryIO', - 'Callable', - 'Collection', - 'Container', - 'Dict', - 'ForwardRef', - 'FrozenSet', - 'Generator', - 'Generic', - 'Hashable', - 'IO', - 'ItemsView', - 'Iterable', - 'Iterator', - 'KeysView', - 'List', - 'Mapping', - 'MappingView', - 'Match', - 'MutableMapping', - 'MutableSequence', - 'MutableSet', - 'Optional', - 'Pattern', - 'Reversible', - 'Sequence', - 'Set', - 'Sized', - 'TextIO', - 'Tuple', - 'Union', - 'ValuesView', - 'cast', - 'no_type_check', - 'no_type_check_decorator', -] - -# for backward compatibility -PEP_560 = True -GenericMeta = type - -# The functions below are modified copies of typing internal helpers. -# They are needed by _ProtocolMeta and they provide support for PEP 646. - - -class _Sentinel: - def __repr__(self): - return "<sentinel>" - - -_marker = _Sentinel() - - -def _check_generic(cls, parameters, elen=_marker): - """Check correct count for parameters of a generic cls (internal helper). - This gives a nice error message in case of count mismatch. - """ - if not elen: - raise TypeError(f"{cls} is not a generic class") - if elen is _marker: - if not hasattr(cls, "__parameters__") or not cls.__parameters__: - raise TypeError(f"{cls} is not a generic class") - elen = len(cls.__parameters__) - alen = len(parameters) - if alen != elen: - if hasattr(cls, "__parameters__"): - parameters = [p for p in cls.__parameters__ if not _is_unpack(p)] - num_tv_tuples = sum(isinstance(p, TypeVarTuple) for p in parameters) - if (num_tv_tuples > 0) and (alen >= elen - num_tv_tuples): - return - raise TypeError(f"Too {'many' if alen > elen else 'few'} parameters for {cls};" - f" actual {alen}, expected {elen}") - - -if sys.version_info >= (3, 10): - def _should_collect_from_parameters(t): - return isinstance( - t, (typing._GenericAlias, _types.GenericAlias, _types.UnionType) - ) -elif sys.version_info >= (3, 9): - def _should_collect_from_parameters(t): - return isinstance(t, (typing._GenericAlias, _types.GenericAlias)) -else: - def _should_collect_from_parameters(t): - return isinstance(t, typing._GenericAlias) and not t._special - - -def _collect_type_vars(types, typevar_types=None): - """Collect all type variable contained in types in order of - first appearance (lexicographic order). For example:: - - _collect_type_vars((T, List[S, T])) == (T, S) - """ - if typevar_types is None: - typevar_types = typing.TypeVar - tvars = [] - for t in types: - if ( - isinstance(t, typevar_types) and - t not in tvars and - not _is_unpack(t) - ): - tvars.append(t) - if _should_collect_from_parameters(t): - tvars.extend([t for t in t.__parameters__ if t not in tvars]) - return tuple(tvars) - - -NoReturn = typing.NoReturn - -# Some unconstrained type variables. These are used by the container types. -# (These are not for export.) -T = typing.TypeVar('T') # Any type. -KT = typing.TypeVar('KT') # Key type. -VT = typing.TypeVar('VT') # Value type. -T_co = typing.TypeVar('T_co', covariant=True) # Any type covariant containers. -T_contra = typing.TypeVar('T_contra', contravariant=True) # Ditto contravariant. - - -if sys.version_info >= (3, 11): - from typing import Any -else: - - class _AnyMeta(type): - def __instancecheck__(self, obj): - if self is Any: - raise TypeError("typing_extensions.Any cannot be used with isinstance()") - return super().__instancecheck__(obj) - - def __repr__(self): - if self is Any: - return "typing_extensions.Any" - return super().__repr__() - - class Any(metaclass=_AnyMeta): - """Special type indicating an unconstrained type. - - Any is compatible with every type. - - Any assumed to have all methods. - - All values assumed to be instances of Any. - Note that all the above statements are true from the point of view of - static type checkers. At runtime, Any should not be used with instance - checks. - """ - def __new__(cls, *args, **kwargs): - if cls is Any: - raise TypeError("Any cannot be instantiated") - return super().__new__(cls, *args, **kwargs) - - -ClassVar = typing.ClassVar - - -class _ExtensionsSpecialForm(typing._SpecialForm, _root=True): - def __repr__(self): - return 'typing_extensions.' + self._name - - -# On older versions of typing there is an internal class named "Final". -# 3.8+ -if hasattr(typing, 'Final') and sys.version_info[:2] >= (3, 7): - Final = typing.Final -# 3.7 -else: - class _FinalForm(_ExtensionsSpecialForm, _root=True): - def __getitem__(self, parameters): - item = typing._type_check(parameters, - f'{self._name} accepts only a single type.') - return typing._GenericAlias(self, (item,)) - - Final = _FinalForm('Final', - doc="""A special typing construct to indicate that a name - cannot be re-assigned or overridden in a subclass. - For example: - - MAX_SIZE: Final = 9000 - MAX_SIZE += 1 # Error reported by type checker - - class Connection: - TIMEOUT: Final[int] = 10 - class FastConnector(Connection): - TIMEOUT = 1 # Error reported by type checker - - There is no runtime checking of these properties.""") - -if sys.version_info >= (3, 11): - final = typing.final -else: - # @final exists in 3.8+, but we backport it for all versions - # before 3.11 to keep support for the __final__ attribute. - # See https://bugs.python.org/issue46342 - def final(f): - """This decorator can be used to indicate to type checkers that - the decorated method cannot be overridden, and decorated class - cannot be subclassed. For example: - - class Base: - @final - def done(self) -> None: - ... - class Sub(Base): - def done(self) -> None: # Error reported by type checker - ... - @final - class Leaf: - ... - class Other(Leaf): # Error reported by type checker - ... - - There is no runtime checking of these properties. The decorator - sets the ``__final__`` attribute to ``True`` on the decorated object - to allow runtime introspection. - """ - try: - f.__final__ = True - except (AttributeError, TypeError): - # Skip the attribute silently if it is not writable. - # AttributeError happens if the object has __slots__ or a - # read-only property, TypeError if it's a builtin class. - pass - return f - - -def IntVar(name): - return typing.TypeVar(name) - - -# A Literal bug was fixed in 3.11.0, 3.10.1 and 3.9.8 -if sys.version_info >= (3, 10, 1): - Literal = typing.Literal -else: - def _flatten_literal_params(parameters): - """An internal helper for Literal creation: flatten Literals among parameters""" - params = [] - for p in parameters: - if isinstance(p, _LiteralGenericAlias): - params.extend(p.__args__) - else: - params.append(p) - return tuple(params) - - def _value_and_type_iter(params): - for p in params: - yield p, type(p) - - class _LiteralGenericAlias(typing._GenericAlias, _root=True): - def __eq__(self, other): - if not isinstance(other, _LiteralGenericAlias): - return NotImplemented - these_args_deduped = set(_value_and_type_iter(self.__args__)) - other_args_deduped = set(_value_and_type_iter(other.__args__)) - return these_args_deduped == other_args_deduped - - def __hash__(self): - return hash(frozenset(_value_and_type_iter(self.__args__))) - - class _LiteralForm(_ExtensionsSpecialForm, _root=True): - def __init__(self, doc: str): - self._name = 'Literal' - self._doc = self.__doc__ = doc - - def __getitem__(self, parameters): - if not isinstance(parameters, tuple): - parameters = (parameters,) - - parameters = _flatten_literal_params(parameters) - - val_type_pairs = list(_value_and_type_iter(parameters)) - try: - deduped_pairs = set(val_type_pairs) - except TypeError: - # unhashable parameters - pass - else: - # similar logic to typing._deduplicate on Python 3.9+ - if len(deduped_pairs) < len(val_type_pairs): - new_parameters = [] - for pair in val_type_pairs: - if pair in deduped_pairs: - new_parameters.append(pair[0]) - deduped_pairs.remove(pair) - assert not deduped_pairs, deduped_pairs - parameters = tuple(new_parameters) - - return _LiteralGenericAlias(self, parameters) - - Literal = _LiteralForm(doc="""\ - A type that can be used to indicate to type checkers - that the corresponding value has a value literally equivalent - to the provided parameter. For example: - - var: Literal[4] = 4 - - The type checker understands that 'var' is literally equal to - the value 4 and no other value. - - Literal[...] cannot be subclassed. There is no runtime - checking verifying that the parameter is actually a value - instead of a type.""") - - -_overload_dummy = typing._overload_dummy - - -if hasattr(typing, "get_overloads"): # 3.11+ - overload = typing.overload - get_overloads = typing.get_overloads - clear_overloads = typing.clear_overloads -else: - # {module: {qualname: {firstlineno: func}}} - _overload_registry = collections.defaultdict( - functools.partial(collections.defaultdict, dict) - ) - - def overload(func): - """Decorator for overloaded functions/methods. - - In a stub file, place two or more stub definitions for the same - function in a row, each decorated with @overload. For example: - - @overload - def utf8(value: None) -> None: ... - @overload - def utf8(value: bytes) -> bytes: ... - @overload - def utf8(value: str) -> bytes: ... - - In a non-stub file (i.e. a regular .py file), do the same but - follow it with an implementation. The implementation should *not* - be decorated with @overload. For example: - - @overload - def utf8(value: None) -> None: ... - @overload - def utf8(value: bytes) -> bytes: ... - @overload - def utf8(value: str) -> bytes: ... - def utf8(value): - # implementation goes here - - The overloads for a function can be retrieved at runtime using the - get_overloads() function. - """ - # classmethod and staticmethod - f = getattr(func, "__func__", func) - try: - _overload_registry[f.__module__][f.__qualname__][ - f.__code__.co_firstlineno - ] = func - except AttributeError: - # Not a normal function; ignore. - pass - return _overload_dummy - - def get_overloads(func): - """Return all defined overloads for *func* as a sequence.""" - # classmethod and staticmethod - f = getattr(func, "__func__", func) - if f.__module__ not in _overload_registry: - return [] - mod_dict = _overload_registry[f.__module__] - if f.__qualname__ not in mod_dict: - return [] - return list(mod_dict[f.__qualname__].values()) - - def clear_overloads(): - """Clear all overloads in the registry.""" - _overload_registry.clear() - - -# This is not a real generic class. Don't use outside annotations. -Type = typing.Type - -# Various ABCs mimicking those in collections.abc. -# A few are simply re-exported for completeness. - - -Awaitable = typing.Awaitable -Coroutine = typing.Coroutine -AsyncIterable = typing.AsyncIterable -AsyncIterator = typing.AsyncIterator -Deque = typing.Deque -ContextManager = typing.ContextManager -AsyncContextManager = typing.AsyncContextManager -DefaultDict = typing.DefaultDict - -# 3.7.2+ -if hasattr(typing, 'OrderedDict'): - OrderedDict = typing.OrderedDict -# 3.7.0-3.7.2 -else: - OrderedDict = typing._alias(collections.OrderedDict, (KT, VT)) - -Counter = typing.Counter -ChainMap = typing.ChainMap -AsyncGenerator = typing.AsyncGenerator -Text = typing.Text -TYPE_CHECKING = typing.TYPE_CHECKING - - -_PROTO_ALLOWLIST = { - 'collections.abc': [ - 'Callable', 'Awaitable', 'Iterable', 'Iterator', 'AsyncIterable', - 'Hashable', 'Sized', 'Container', 'Collection', 'Reversible', 'Buffer', - ], - 'contextlib': ['AbstractContextManager', 'AbstractAsyncContextManager'], - 'typing_extensions': ['Buffer'], -} - - -_EXCLUDED_ATTRS = { - "__abstractmethods__", "__annotations__", "__weakref__", "_is_protocol", - "_is_runtime_protocol", "__dict__", "__slots__", "__parameters__", - "__orig_bases__", "__module__", "_MutableMapping__marker", "__doc__", - "__subclasshook__", "__orig_class__", "__init__", "__new__", - "__protocol_attrs__", "__callable_proto_members_only__", -} - -if sys.version_info < (3, 8): - _EXCLUDED_ATTRS |= { - "_gorg", "__next_in_mro__", "__extra__", "__tree_hash__", "__args__", - "__origin__" - } - -if sys.version_info >= (3, 9): - _EXCLUDED_ATTRS.add("__class_getitem__") - -if sys.version_info >= (3, 12): - _EXCLUDED_ATTRS.add("__type_params__") - -_EXCLUDED_ATTRS = frozenset(_EXCLUDED_ATTRS) - - -def _get_protocol_attrs(cls): - attrs = set() - for base in cls.__mro__[:-1]: # without object - if base.__name__ in {'Protocol', 'Generic'}: - continue - annotations = getattr(base, '__annotations__', {}) - for attr in (*base.__dict__, *annotations): - if (not attr.startswith('_abc_') and attr not in _EXCLUDED_ATTRS): - attrs.add(attr) - return attrs - - -def _maybe_adjust_parameters(cls): - """Helper function used in Protocol.__init_subclass__ and _TypedDictMeta.__new__. - - The contents of this function are very similar - to logic found in typing.Generic.__init_subclass__ - on the CPython main branch. - """ - tvars = [] - if '__orig_bases__' in cls.__dict__: - tvars = _collect_type_vars(cls.__orig_bases__) - # Look for Generic[T1, ..., Tn] or Protocol[T1, ..., Tn]. - # If found, tvars must be a subset of it. - # If not found, tvars is it. - # Also check for and reject plain Generic, - # and reject multiple Generic[...] and/or Protocol[...]. - gvars = None - for base in cls.__orig_bases__: - if (isinstance(base, typing._GenericAlias) and - base.__origin__ in (typing.Generic, Protocol)): - # for error messages - the_base = base.__origin__.__name__ - if gvars is not None: - raise TypeError( - "Cannot inherit from Generic[...]" - " and/or Protocol[...] multiple types.") - gvars = base.__parameters__ - if gvars is None: - gvars = tvars - else: - tvarset = set(tvars) - gvarset = set(gvars) - if not tvarset <= gvarset: - s_vars = ', '.join(str(t) for t in tvars if t not in gvarset) - s_args = ', '.join(str(g) for g in gvars) - raise TypeError(f"Some type variables ({s_vars}) are" - f" not listed in {the_base}[{s_args}]") - tvars = gvars - cls.__parameters__ = tuple(tvars) - - -def _caller(depth=2): - try: - return sys._getframe(depth).f_globals.get('__name__', '__main__') - except (AttributeError, ValueError): # For platforms without _getframe() - return None - - -# The performance of runtime-checkable protocols is significantly improved on Python 3.12, -# so we backport the 3.12 version of Protocol to Python <=3.11 -if sys.version_info >= (3, 12): - Protocol = typing.Protocol -else: - def _allow_reckless_class_checks(depth=3): - """Allow instance and class checks for special stdlib modules. - The abc and functools modules indiscriminately call isinstance() and - issubclass() on the whole MRO of a user class, which may contain protocols. - """ - return _caller(depth) in {'abc', 'functools', None} - - def _no_init(self, *args, **kwargs): - if type(self)._is_protocol: - raise TypeError('Protocols cannot be instantiated') - - if sys.version_info >= (3, 8): - # Inheriting from typing._ProtocolMeta isn't actually desirable, - # but is necessary to allow typing.Protocol and typing_extensions.Protocol - # to mix without getting TypeErrors about "metaclass conflict" - _typing_Protocol = typing.Protocol - _ProtocolMetaBase = type(_typing_Protocol) - else: - _typing_Protocol = _marker - _ProtocolMetaBase = abc.ABCMeta - - class _ProtocolMeta(_ProtocolMetaBase): - # This metaclass is somewhat unfortunate, - # but is necessary for several reasons... - # - # NOTE: DO NOT call super() in any methods in this class - # That would call the methods on typing._ProtocolMeta on Python 3.8-3.11 - # and those are slow - def __new__(mcls, name, bases, namespace, **kwargs): - if name == "Protocol" and len(bases) < 2: - pass - elif {Protocol, _typing_Protocol} & set(bases): - for base in bases: - if not ( - base in {object, typing.Generic, Protocol, _typing_Protocol} - or base.__name__ in _PROTO_ALLOWLIST.get(base.__module__, []) - or is_protocol(base) - ): - raise TypeError( - f"Protocols can only inherit from other protocols, " - f"got {base!r}" - ) - return abc.ABCMeta.__new__(mcls, name, bases, namespace, **kwargs) - - def __init__(cls, *args, **kwargs): - abc.ABCMeta.__init__(cls, *args, **kwargs) - if getattr(cls, "_is_protocol", False): - cls.__protocol_attrs__ = _get_protocol_attrs(cls) - # PEP 544 prohibits using issubclass() - # with protocols that have non-method members. - cls.__callable_proto_members_only__ = all( - callable(getattr(cls, attr, None)) for attr in cls.__protocol_attrs__ - ) - - def __subclasscheck__(cls, other): - if cls is Protocol: - return type.__subclasscheck__(cls, other) - if ( - getattr(cls, '_is_protocol', False) - and not _allow_reckless_class_checks() - ): - if not isinstance(other, type): - # Same error message as for issubclass(1, int). - raise TypeError('issubclass() arg 1 must be a class') - if ( - not cls.__callable_proto_members_only__ - and cls.__dict__.get("__subclasshook__") is _proto_hook - ): - raise TypeError( - "Protocols with non-method members don't support issubclass()" - ) - if not getattr(cls, '_is_runtime_protocol', False): - raise TypeError( - "Instance and class checks can only be used with " - "@runtime_checkable protocols" - ) - return abc.ABCMeta.__subclasscheck__(cls, other) - - def __instancecheck__(cls, instance): - # We need this method for situations where attributes are - # assigned in __init__. - if cls is Protocol: - return type.__instancecheck__(cls, instance) - if not getattr(cls, "_is_protocol", False): - # i.e., it's a concrete subclass of a protocol - return abc.ABCMeta.__instancecheck__(cls, instance) - - if ( - not getattr(cls, '_is_runtime_protocol', False) and - not _allow_reckless_class_checks() - ): - raise TypeError("Instance and class checks can only be used with" - " @runtime_checkable protocols") - - if abc.ABCMeta.__instancecheck__(cls, instance): - return True - - for attr in cls.__protocol_attrs__: - try: - val = inspect.getattr_static(instance, attr) - except AttributeError: - break - if val is None and callable(getattr(cls, attr, None)): - break - else: - return True - - return False - - def __eq__(cls, other): - # Hack so that typing.Generic.__class_getitem__ - # treats typing_extensions.Protocol - # as equivalent to typing.Protocol on Python 3.8+ - if abc.ABCMeta.__eq__(cls, other) is True: - return True - return ( - cls is Protocol and other is getattr(typing, "Protocol", object()) - ) - - # This has to be defined, or the abc-module cache - # complains about classes with this metaclass being unhashable, - # if we define only __eq__! - def __hash__(cls) -> int: - return type.__hash__(cls) - - @classmethod - def _proto_hook(cls, other): - if not cls.__dict__.get('_is_protocol', False): - return NotImplemented - - for attr in cls.__protocol_attrs__: - for base in other.__mro__: - # Check if the members appears in the class dictionary... - if attr in base.__dict__: - if base.__dict__[attr] is None: - return NotImplemented - break - - # ...or in annotations, if it is a sub-protocol. - annotations = getattr(base, '__annotations__', {}) - if ( - isinstance(annotations, collections.abc.Mapping) - and attr in annotations - and is_protocol(other) - ): - break - else: - return NotImplemented - return True - - if sys.version_info >= (3, 8): - class Protocol(typing.Generic, metaclass=_ProtocolMeta): - __doc__ = typing.Protocol.__doc__ - __slots__ = () - _is_protocol = True - _is_runtime_protocol = False - - def __init_subclass__(cls, *args, **kwargs): - super().__init_subclass__(*args, **kwargs) - - # Determine if this is a protocol or a concrete subclass. - if not cls.__dict__.get('_is_protocol', False): - cls._is_protocol = any(b is Protocol for b in cls.__bases__) - - # Set (or override) the protocol subclass hook. - if '__subclasshook__' not in cls.__dict__: - cls.__subclasshook__ = _proto_hook - - # Prohibit instantiation for protocol classes - if cls._is_protocol and cls.__init__ is Protocol.__init__: - cls.__init__ = _no_init - - else: - class Protocol(metaclass=_ProtocolMeta): - # There is quite a lot of overlapping code with typing.Generic. - # Unfortunately it is hard to avoid this on Python <3.8, - # as the typing module on Python 3.7 doesn't let us subclass typing.Generic! - """Base class for protocol classes. Protocol classes are defined as:: - - class Proto(Protocol): - def meth(self) -> int: - ... - - Such classes are primarily used with static type checkers that recognize - structural subtyping (static duck-typing), for example:: - - class C: - def meth(self) -> int: - return 0 - - def func(x: Proto) -> int: - return x.meth() - - func(C()) # Passes static type check - - See PEP 544 for details. Protocol classes decorated with - @typing_extensions.runtime_checkable act - as simple-minded runtime-checkable protocols that check - only the presence of given attributes, ignoring their type signatures. - - Protocol classes can be generic, they are defined as:: - - class GenProto(Protocol[T]): - def meth(self) -> T: - ... - """ - __slots__ = () - _is_protocol = True - _is_runtime_protocol = False - - def __new__(cls, *args, **kwds): - if cls is Protocol: - raise TypeError("Type Protocol cannot be instantiated; " - "it can only be used as a base class") - return super().__new__(cls) - - @typing._tp_cache - def __class_getitem__(cls, params): - if not isinstance(params, tuple): - params = (params,) - if not params and cls is not typing.Tuple: - raise TypeError( - f"Parameter list to {cls.__qualname__}[...] cannot be empty") - msg = "Parameters to generic types must be types." - params = tuple(typing._type_check(p, msg) for p in params) - if cls is Protocol: - # Generic can only be subscripted with unique type variables. - if not all(isinstance(p, typing.TypeVar) for p in params): - i = 0 - while isinstance(params[i], typing.TypeVar): - i += 1 - raise TypeError( - "Parameters to Protocol[...] must all be type variables." - f" Parameter {i + 1} is {params[i]}") - if len(set(params)) != len(params): - raise TypeError( - "Parameters to Protocol[...] must all be unique") - else: - # Subscripting a regular Generic subclass. - _check_generic(cls, params, len(cls.__parameters__)) - return typing._GenericAlias(cls, params) - - def __init_subclass__(cls, *args, **kwargs): - if '__orig_bases__' in cls.__dict__: - error = typing.Generic in cls.__orig_bases__ - else: - error = typing.Generic in cls.__bases__ - if error: - raise TypeError("Cannot inherit from plain Generic") - _maybe_adjust_parameters(cls) - - # Determine if this is a protocol or a concrete subclass. - if not cls.__dict__.get('_is_protocol', None): - cls._is_protocol = any(b is Protocol for b in cls.__bases__) - - # Set (or override) the protocol subclass hook. - if '__subclasshook__' not in cls.__dict__: - cls.__subclasshook__ = _proto_hook - - # Prohibit instantiation for protocol classes - if cls._is_protocol and cls.__init__ is Protocol.__init__: - cls.__init__ = _no_init - - -if sys.version_info >= (3, 8): - runtime_checkable = typing.runtime_checkable -else: - def runtime_checkable(cls): - """Mark a protocol class as a runtime protocol, so that it - can be used with isinstance() and issubclass(). Raise TypeError - if applied to a non-protocol class. - - This allows a simple-minded structural check very similar to the - one-offs in collections.abc such as Hashable. - """ - if not ( - (isinstance(cls, _ProtocolMeta) or issubclass(cls, typing.Generic)) - and getattr(cls, "_is_protocol", False) - ): - raise TypeError('@runtime_checkable can be only applied to protocol classes,' - f' got {cls!r}') - cls._is_runtime_protocol = True - return cls - - -# Exists for backwards compatibility. -runtime = runtime_checkable - - -# Our version of runtime-checkable protocols is faster on Python 3.7-3.11 -if sys.version_info >= (3, 12): - SupportsInt = typing.SupportsInt - SupportsFloat = typing.SupportsFloat - SupportsComplex = typing.SupportsComplex - SupportsBytes = typing.SupportsBytes - SupportsIndex = typing.SupportsIndex - SupportsAbs = typing.SupportsAbs - SupportsRound = typing.SupportsRound -else: - @runtime_checkable - class SupportsInt(Protocol): - """An ABC with one abstract method __int__.""" - __slots__ = () - - @abc.abstractmethod - def __int__(self) -> int: - pass - - @runtime_checkable - class SupportsFloat(Protocol): - """An ABC with one abstract method __float__.""" - __slots__ = () - - @abc.abstractmethod - def __float__(self) -> float: - pass - - @runtime_checkable - class SupportsComplex(Protocol): - """An ABC with one abstract method __complex__.""" - __slots__ = () - - @abc.abstractmethod - def __complex__(self) -> complex: - pass - - @runtime_checkable - class SupportsBytes(Protocol): - """An ABC with one abstract method __bytes__.""" - __slots__ = () - - @abc.abstractmethod - def __bytes__(self) -> bytes: - pass - - @runtime_checkable - class SupportsIndex(Protocol): - __slots__ = () - - @abc.abstractmethod - def __index__(self) -> int: - pass - - @runtime_checkable - class SupportsAbs(Protocol[T_co]): - """ - An ABC with one abstract method __abs__ that is covariant in its return type. - """ - __slots__ = () - - @abc.abstractmethod - def __abs__(self) -> T_co: - pass - - @runtime_checkable - class SupportsRound(Protocol[T_co]): - """ - An ABC with one abstract method __round__ that is covariant in its return type. - """ - __slots__ = () - - @abc.abstractmethod - def __round__(self, ndigits: int = 0) -> T_co: - pass - - -def _ensure_subclassable(mro_entries): - def inner(func): - if sys.implementation.name == "pypy" and sys.version_info < (3, 9): - cls_dict = { - "__call__": staticmethod(func), - "__mro_entries__": staticmethod(mro_entries) - } - t = type(func.__name__, (), cls_dict) - return functools.update_wrapper(t(), func) - else: - func.__mro_entries__ = mro_entries - return func - return inner - - -if sys.version_info >= (3, 13): - # The standard library TypedDict in Python 3.8 does not store runtime information - # about which (if any) keys are optional. See https://bugs.python.org/issue38834 - # The standard library TypedDict in Python 3.9.0/1 does not honour the "total" - # keyword with old-style TypedDict(). See https://bugs.python.org/issue42059 - # The standard library TypedDict below Python 3.11 does not store runtime - # information about optional and required keys when using Required or NotRequired. - # Generic TypedDicts are also impossible using typing.TypedDict on Python <3.11. - # Aaaand on 3.12 we add __orig_bases__ to TypedDict - # to enable better runtime introspection. - # On 3.13 we deprecate some odd ways of creating TypedDicts. - TypedDict = typing.TypedDict - _TypedDictMeta = typing._TypedDictMeta - is_typeddict = typing.is_typeddict -else: - # 3.10.0 and later - _TAKES_MODULE = "module" in inspect.signature(typing._type_check).parameters - - if sys.version_info >= (3, 8): - _fake_name = "Protocol" - else: - _fake_name = "_Protocol" - - class _TypedDictMeta(type): - def __new__(cls, name, bases, ns, total=True): - """Create new typed dict class object. - - This method is called when TypedDict is subclassed, - or when TypedDict is instantiated. This way - TypedDict supports all three syntax forms described in its docstring. - Subclasses and instances of TypedDict return actual dictionaries. - """ - for base in bases: - if type(base) is not _TypedDictMeta and base is not typing.Generic: - raise TypeError('cannot inherit from both a TypedDict type ' - 'and a non-TypedDict base class') - - if any(issubclass(b, typing.Generic) for b in bases): - generic_base = (typing.Generic,) - else: - generic_base = () - - # typing.py generally doesn't let you inherit from plain Generic, unless - # the name of the class happens to be "Protocol" (or "_Protocol" on 3.7). - tp_dict = type.__new__(_TypedDictMeta, _fake_name, (*generic_base, dict), ns) - tp_dict.__name__ = name - if tp_dict.__qualname__ == _fake_name: - tp_dict.__qualname__ = name - - if not hasattr(tp_dict, '__orig_bases__'): - tp_dict.__orig_bases__ = bases - - annotations = {} - own_annotations = ns.get('__annotations__', {}) - msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type" - if _TAKES_MODULE: - own_annotations = { - n: typing._type_check(tp, msg, module=tp_dict.__module__) - for n, tp in own_annotations.items() - } - else: - own_annotations = { - n: typing._type_check(tp, msg) - for n, tp in own_annotations.items() - } - required_keys = set() - optional_keys = set() - - for base in bases: - annotations.update(base.__dict__.get('__annotations__', {})) - required_keys.update(base.__dict__.get('__required_keys__', ())) - optional_keys.update(base.__dict__.get('__optional_keys__', ())) - - annotations.update(own_annotations) - for annotation_key, annotation_type in own_annotations.items(): - annotation_origin = get_origin(annotation_type) - if annotation_origin is Annotated: - annotation_args = get_args(annotation_type) - if annotation_args: - annotation_type = annotation_args[0] - annotation_origin = get_origin(annotation_type) - - if annotation_origin is Required: - required_keys.add(annotation_key) - elif annotation_origin is NotRequired: - optional_keys.add(annotation_key) - elif total: - required_keys.add(annotation_key) - else: - optional_keys.add(annotation_key) - - tp_dict.__annotations__ = annotations - tp_dict.__required_keys__ = frozenset(required_keys) - tp_dict.__optional_keys__ = frozenset(optional_keys) - if not hasattr(tp_dict, '__total__'): - tp_dict.__total__ = total - return tp_dict - - __call__ = dict # static method - - def __subclasscheck__(cls, other): - # Typed dicts are only for static structural subtyping. - raise TypeError('TypedDict does not support instance and class checks') - - __instancecheck__ = __subclasscheck__ - - _TypedDict = type.__new__(_TypedDictMeta, 'TypedDict', (), {}) - - @_ensure_subclassable(lambda bases: (_TypedDict,)) - def TypedDict(__typename, __fields=_marker, *, total=True, **kwargs): - """A simple typed namespace. At runtime it is equivalent to a plain dict. - - TypedDict creates a dictionary type such that a type checker will expect all - instances to have a certain set of keys, where each key is - associated with a value of a consistent type. This expectation - is not checked at runtime. - - Usage:: - - class Point2D(TypedDict): - x: int - y: int - label: str - - a: Point2D = {'x': 1, 'y': 2, 'label': 'good'} # OK - b: Point2D = {'z': 3, 'label': 'bad'} # Fails type check - - assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first') - - The type info can be accessed via the Point2D.__annotations__ dict, and - the Point2D.__required_keys__ and Point2D.__optional_keys__ frozensets. - TypedDict supports an additional equivalent form:: - - Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str}) - - By default, all keys must be present in a TypedDict. It is possible - to override this by specifying totality:: - - class Point2D(TypedDict, total=False): - x: int - y: int - - This means that a Point2D TypedDict can have any of the keys omitted. A type - checker is only expected to support a literal False or True as the value of - the total argument. True is the default, and makes all items defined in the - class body be required. - - The Required and NotRequired special forms can also be used to mark - individual keys as being required or not required:: - - class Point2D(TypedDict): - x: int # the "x" key must always be present (Required is the default) - y: NotRequired[int] # the "y" key can be omitted - - See PEP 655 for more details on Required and NotRequired. - """ - if __fields is _marker or __fields is None: - if __fields is _marker: - deprecated_thing = "Failing to pass a value for the 'fields' parameter" - else: - deprecated_thing = "Passing `None` as the 'fields' parameter" - - example = f"`{__typename} = TypedDict({__typename!r}, {{}})`" - deprecation_msg = ( - f"{deprecated_thing} is deprecated and will be disallowed in " - "Python 3.15. To create a TypedDict class with 0 fields " - "using the functional syntax, pass an empty dictionary, e.g. " - ) + example + "." - warnings.warn(deprecation_msg, DeprecationWarning, stacklevel=2) - __fields = kwargs - elif kwargs: - raise TypeError("TypedDict takes either a dict or keyword arguments," - " but not both") - if kwargs: - warnings.warn( - "The kwargs-based syntax for TypedDict definitions is deprecated " - "in Python 3.11, will be removed in Python 3.13, and may not be " - "understood by third-party type checkers.", - DeprecationWarning, - stacklevel=2, - ) - - ns = {'__annotations__': dict(__fields)} - module = _caller() - if module is not None: - # Setting correct module is necessary to make typed dict classes pickleable. - ns['__module__'] = module - - td = _TypedDictMeta(__typename, (), ns, total=total) - td.__orig_bases__ = (TypedDict,) - return td - - if hasattr(typing, "_TypedDictMeta"): - _TYPEDDICT_TYPES = (typing._TypedDictMeta, _TypedDictMeta) - else: - _TYPEDDICT_TYPES = (_TypedDictMeta,) - - def is_typeddict(tp): - """Check if an annotation is a TypedDict class - - For example:: - class Film(TypedDict): - title: str - year: int - - is_typeddict(Film) # => True - is_typeddict(Union[list, str]) # => False - """ - # On 3.8, this would otherwise return True - if hasattr(typing, "TypedDict") and tp is typing.TypedDict: - return False - return isinstance(tp, _TYPEDDICT_TYPES) - - -if hasattr(typing, "assert_type"): - assert_type = typing.assert_type - -else: - def assert_type(__val, __typ): - """Assert (to the type checker) that the value is of the given type. - - When the type checker encounters a call to assert_type(), it - emits an error if the value is not of the specified type:: - - def greet(name: str) -> None: - assert_type(name, str) # ok - assert_type(name, int) # type checker error - - At runtime this returns the first argument unchanged and otherwise - does nothing. - """ - return __val - - -if hasattr(typing, "Required"): - get_type_hints = typing.get_type_hints -else: - # replaces _strip_annotations() - def _strip_extras(t): - """Strips Annotated, Required and NotRequired from a given type.""" - if isinstance(t, _AnnotatedAlias): - return _strip_extras(t.__origin__) - if hasattr(t, "__origin__") and t.__origin__ in (Required, NotRequired): - return _strip_extras(t.__args__[0]) - if isinstance(t, typing._GenericAlias): - stripped_args = tuple(_strip_extras(a) for a in t.__args__) - if stripped_args == t.__args__: - return t - return t.copy_with(stripped_args) - if hasattr(_types, "GenericAlias") and isinstance(t, _types.GenericAlias): - stripped_args = tuple(_strip_extras(a) for a in t.__args__) - if stripped_args == t.__args__: - return t - return _types.GenericAlias(t.__origin__, stripped_args) - if hasattr(_types, "UnionType") and isinstance(t, _types.UnionType): - stripped_args = tuple(_strip_extras(a) for a in t.__args__) - if stripped_args == t.__args__: - return t - return functools.reduce(operator.or_, stripped_args) - - return t - - def get_type_hints(obj, globalns=None, localns=None, include_extras=False): - """Return type hints for an object. - - This is often the same as obj.__annotations__, but it handles - forward references encoded as string literals, adds Optional[t] if a - default value equal to None is set and recursively replaces all - 'Annotated[T, ...]', 'Required[T]' or 'NotRequired[T]' with 'T' - (unless 'include_extras=True'). - - The argument may be a module, class, method, or function. The annotations - are returned as a dictionary. For classes, annotations include also - inherited members. - - TypeError is raised if the argument is not of a type that can contain - annotations, and an empty dictionary is returned if no annotations are - present. - - BEWARE -- the behavior of globalns and localns is counterintuitive - (unless you are familiar with how eval() and exec() work). The - search order is locals first, then globals. - - - If no dict arguments are passed, an attempt is made to use the - globals from obj (or the respective module's globals for classes), - and these are also used as the locals. If the object does not appear - to have globals, an empty dictionary is used. - - - If one dict argument is passed, it is used for both globals and - locals. - - - If two dict arguments are passed, they specify globals and - locals, respectively. - """ - if hasattr(typing, "Annotated"): - hint = typing.get_type_hints( - obj, globalns=globalns, localns=localns, include_extras=True - ) - else: - hint = typing.get_type_hints(obj, globalns=globalns, localns=localns) - if include_extras: - return hint - return {k: _strip_extras(t) for k, t in hint.items()} - - -# Python 3.9+ has PEP 593 (Annotated) -if hasattr(typing, 'Annotated'): - Annotated = typing.Annotated - # Not exported and not a public API, but needed for get_origin() and get_args() - # to work. - _AnnotatedAlias = typing._AnnotatedAlias -# 3.7-3.8 -else: - class _AnnotatedAlias(typing._GenericAlias, _root=True): - """Runtime representation of an annotated type. - - At its core 'Annotated[t, dec1, dec2, ...]' is an alias for the type 't' - with extra annotations. The alias behaves like a normal typing alias, - instantiating is the same as instantiating the underlying type, binding - it to types is also the same. - """ - def __init__(self, origin, metadata): - if isinstance(origin, _AnnotatedAlias): - metadata = origin.__metadata__ + metadata - origin = origin.__origin__ - super().__init__(origin, origin) - self.__metadata__ = metadata - - def copy_with(self, params): - assert len(params) == 1 - new_type = params[0] - return _AnnotatedAlias(new_type, self.__metadata__) - - def __repr__(self): - return (f"typing_extensions.Annotated[{typing._type_repr(self.__origin__)}, " - f"{', '.join(repr(a) for a in self.__metadata__)}]") - - def __reduce__(self): - return operator.getitem, ( - Annotated, (self.__origin__,) + self.__metadata__ - ) - - def __eq__(self, other): - if not isinstance(other, _AnnotatedAlias): - return NotImplemented - if self.__origin__ != other.__origin__: - return False - return self.__metadata__ == other.__metadata__ - - def __hash__(self): - return hash((self.__origin__, self.__metadata__)) - - class Annotated: - """Add context specific metadata to a type. - - Example: Annotated[int, runtime_check.Unsigned] indicates to the - hypothetical runtime_check module that this type is an unsigned int. - Every other consumer of this type can ignore this metadata and treat - this type as int. - - The first argument to Annotated must be a valid type (and will be in - the __origin__ field), the remaining arguments are kept as a tuple in - the __extra__ field. - - Details: - - - It's an error to call `Annotated` with less than two arguments. - - Nested Annotated are flattened:: - - Annotated[Annotated[T, Ann1, Ann2], Ann3] == Annotated[T, Ann1, Ann2, Ann3] - - - Instantiating an annotated type is equivalent to instantiating the - underlying type:: - - Annotated[C, Ann1](5) == C(5) - - - Annotated can be used as a generic type alias:: - - Optimized = Annotated[T, runtime.Optimize()] - Optimized[int] == Annotated[int, runtime.Optimize()] - - OptimizedList = Annotated[List[T], runtime.Optimize()] - OptimizedList[int] == Annotated[List[int], runtime.Optimize()] - """ - - __slots__ = () - - def __new__(cls, *args, **kwargs): - raise TypeError("Type Annotated cannot be instantiated.") - - @typing._tp_cache - def __class_getitem__(cls, params): - if not isinstance(params, tuple) or len(params) < 2: - raise TypeError("Annotated[...] should be used " - "with at least two arguments (a type and an " - "annotation).") - allowed_special_forms = (ClassVar, Final) - if get_origin(params[0]) in allowed_special_forms: - origin = params[0] - else: - msg = "Annotated[t, ...]: t must be a type." - origin = typing._type_check(params[0], msg) - metadata = tuple(params[1:]) - return _AnnotatedAlias(origin, metadata) - - def __init_subclass__(cls, *args, **kwargs): - raise TypeError( - f"Cannot subclass {cls.__module__}.Annotated" - ) - -# Python 3.8 has get_origin() and get_args() but those implementations aren't -# Annotated-aware, so we can't use those. Python 3.9's versions don't support -# ParamSpecArgs and ParamSpecKwargs, so only Python 3.10's versions will do. -if sys.version_info[:2] >= (3, 10): - get_origin = typing.get_origin - get_args = typing.get_args -# 3.7-3.9 -else: - try: - # 3.9+ - from typing import _BaseGenericAlias - except ImportError: - _BaseGenericAlias = typing._GenericAlias - try: - # 3.9+ - from typing import GenericAlias as _typing_GenericAlias - except ImportError: - _typing_GenericAlias = typing._GenericAlias - - def get_origin(tp): - """Get the unsubscripted version of a type. - - This supports generic types, Callable, Tuple, Union, Literal, Final, ClassVar - and Annotated. Return None for unsupported types. Examples:: - - get_origin(Literal[42]) is Literal - get_origin(int) is None - get_origin(ClassVar[int]) is ClassVar - get_origin(Generic) is Generic - get_origin(Generic[T]) is Generic - get_origin(Union[T, int]) is Union - get_origin(List[Tuple[T, T]][int]) == list - get_origin(P.args) is P - """ - if isinstance(tp, _AnnotatedAlias): - return Annotated - if isinstance(tp, (typing._GenericAlias, _typing_GenericAlias, _BaseGenericAlias, - ParamSpecArgs, ParamSpecKwargs)): - return tp.__origin__ - if tp is typing.Generic: - return typing.Generic - return None - - def get_args(tp): - """Get type arguments with all substitutions performed. - - For unions, basic simplifications used by Union constructor are performed. - Examples:: - get_args(Dict[str, int]) == (str, int) - get_args(int) == () - get_args(Union[int, Union[T, int], str][int]) == (int, str) - get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int]) - get_args(Callable[[], T][int]) == ([], int) - """ - if isinstance(tp, _AnnotatedAlias): - return (tp.__origin__,) + tp.__metadata__ - if isinstance(tp, (typing._GenericAlias, _typing_GenericAlias)): - if getattr(tp, "_special", False): - return () - res = tp.__args__ - if get_origin(tp) is collections.abc.Callable and res[0] is not Ellipsis: - res = (list(res[:-1]), res[-1]) - return res - return () - - -# 3.10+ -if hasattr(typing, 'TypeAlias'): - TypeAlias = typing.TypeAlias -# 3.9 -elif sys.version_info[:2] >= (3, 9): - @_ExtensionsSpecialForm - def TypeAlias(self, parameters): - """Special marker indicating that an assignment should - be recognized as a proper type alias definition by type - checkers. - - For example:: - - Predicate: TypeAlias = Callable[..., bool] - - It's invalid when used anywhere except as in the example above. - """ - raise TypeError(f"{self} is not subscriptable") -# 3.7-3.8 -else: - TypeAlias = _ExtensionsSpecialForm( - 'TypeAlias', - doc="""Special marker indicating that an assignment should - be recognized as a proper type alias definition by type - checkers. - - For example:: - - Predicate: TypeAlias = Callable[..., bool] - - It's invalid when used anywhere except as in the example - above.""" - ) - - -def _set_default(type_param, default): - if isinstance(default, (tuple, list)): - type_param.__default__ = tuple((typing._type_check(d, "Default must be a type") - for d in default)) - elif default != _marker: - type_param.__default__ = typing._type_check(default, "Default must be a type") - else: - type_param.__default__ = None - - -def _set_module(typevarlike): - # for pickling: - def_mod = _caller(depth=3) - if def_mod != 'typing_extensions': - typevarlike.__module__ = def_mod - - -class _DefaultMixin: - """Mixin for TypeVarLike defaults.""" - - __slots__ = () - __init__ = _set_default - - -# Classes using this metaclass must provide a _backported_typevarlike ClassVar -class _TypeVarLikeMeta(type): - def __instancecheck__(cls, __instance: Any) -> bool: - return isinstance(__instance, cls._backported_typevarlike) - - -# Add default and infer_variance parameters from PEP 696 and 695 -class TypeVar(metaclass=_TypeVarLikeMeta): - """Type variable.""" - - _backported_typevarlike = typing.TypeVar - - def __new__(cls, name, *constraints, bound=None, - covariant=False, contravariant=False, - default=_marker, infer_variance=False): - if hasattr(typing, "TypeAliasType"): - # PEP 695 implemented, can pass infer_variance to typing.TypeVar - typevar = typing.TypeVar(name, *constraints, bound=bound, - covariant=covariant, contravariant=contravariant, - infer_variance=infer_variance) - else: - typevar = typing.TypeVar(name, *constraints, bound=bound, - covariant=covariant, contravariant=contravariant) - if infer_variance and (covariant or contravariant): - raise ValueError("Variance cannot be specified with infer_variance.") - typevar.__infer_variance__ = infer_variance - _set_default(typevar, default) - _set_module(typevar) - return typevar - - def __init_subclass__(cls) -> None: - raise TypeError(f"type '{__name__}.TypeVar' is not an acceptable base type") - - -# Python 3.10+ has PEP 612 -if hasattr(typing, 'ParamSpecArgs'): - ParamSpecArgs = typing.ParamSpecArgs - ParamSpecKwargs = typing.ParamSpecKwargs -# 3.7-3.9 -else: - class _Immutable: - """Mixin to indicate that object should not be copied.""" - __slots__ = () - - def __copy__(self): - return self - - def __deepcopy__(self, memo): - return self - - class ParamSpecArgs(_Immutable): - """The args for a ParamSpec object. - - Given a ParamSpec object P, P.args is an instance of ParamSpecArgs. - - ParamSpecArgs objects have a reference back to their ParamSpec: - - P.args.__origin__ is P - - This type is meant for runtime introspection and has no special meaning to - static type checkers. - """ - def __init__(self, origin): - self.__origin__ = origin - - def __repr__(self): - return f"{self.__origin__.__name__}.args" - - def __eq__(self, other): - if not isinstance(other, ParamSpecArgs): - return NotImplemented - return self.__origin__ == other.__origin__ - - class ParamSpecKwargs(_Immutable): - """The kwargs for a ParamSpec object. - - Given a ParamSpec object P, P.kwargs is an instance of ParamSpecKwargs. - - ParamSpecKwargs objects have a reference back to their ParamSpec: - - P.kwargs.__origin__ is P - - This type is meant for runtime introspection and has no special meaning to - static type checkers. - """ - def __init__(self, origin): - self.__origin__ = origin - - def __repr__(self): - return f"{self.__origin__.__name__}.kwargs" - - def __eq__(self, other): - if not isinstance(other, ParamSpecKwargs): - return NotImplemented - return self.__origin__ == other.__origin__ - -# 3.10+ -if hasattr(typing, 'ParamSpec'): - - # Add default parameter - PEP 696 - class ParamSpec(metaclass=_TypeVarLikeMeta): - """Parameter specification.""" - - _backported_typevarlike = typing.ParamSpec - - def __new__(cls, name, *, bound=None, - covariant=False, contravariant=False, - infer_variance=False, default=_marker): - if hasattr(typing, "TypeAliasType"): - # PEP 695 implemented, can pass infer_variance to typing.TypeVar - paramspec = typing.ParamSpec(name, bound=bound, - covariant=covariant, - contravariant=contravariant, - infer_variance=infer_variance) - else: - paramspec = typing.ParamSpec(name, bound=bound, - covariant=covariant, - contravariant=contravariant) - paramspec.__infer_variance__ = infer_variance - - _set_default(paramspec, default) - _set_module(paramspec) - return paramspec - - def __init_subclass__(cls) -> None: - raise TypeError(f"type '{__name__}.ParamSpec' is not an acceptable base type") - -# 3.7-3.9 -else: - - # Inherits from list as a workaround for Callable checks in Python < 3.9.2. - class ParamSpec(list, _DefaultMixin): - """Parameter specification variable. - - Usage:: - - P = ParamSpec('P') - - Parameter specification variables exist primarily for the benefit of static - type checkers. They are used to forward the parameter types of one - callable to another callable, a pattern commonly found in higher order - functions and decorators. They are only valid when used in ``Concatenate``, - or s the first argument to ``Callable``. In Python 3.10 and higher, - they are also supported in user-defined Generics at runtime. - See class Generic for more information on generic types. An - example for annotating a decorator:: - - T = TypeVar('T') - P = ParamSpec('P') - - def add_logging(f: Callable[P, T]) -> Callable[P, T]: - '''A type-safe decorator to add logging to a function.''' - def inner(*args: P.args, **kwargs: P.kwargs) -> T: - logging.info(f'{f.__name__} was called') - return f(*args, **kwargs) - return inner - - @add_logging - def add_two(x: float, y: float) -> float: - '''Add two numbers together.''' - return x + y - - Parameter specification variables defined with covariant=True or - contravariant=True can be used to declare covariant or contravariant - generic types. These keyword arguments are valid, but their actual semantics - are yet to be decided. See PEP 612 for details. - - Parameter specification variables can be introspected. e.g.: - - P.__name__ == 'T' - P.__bound__ == None - P.__covariant__ == False - P.__contravariant__ == False - - Note that only parameter specification variables defined in global scope can - be pickled. - """ - - # Trick Generic __parameters__. - __class__ = typing.TypeVar - - @property - def args(self): - return ParamSpecArgs(self) - - @property - def kwargs(self): - return ParamSpecKwargs(self) - - def __init__(self, name, *, bound=None, covariant=False, contravariant=False, - infer_variance=False, default=_marker): - super().__init__([self]) - self.__name__ = name - self.__covariant__ = bool(covariant) - self.__contravariant__ = bool(contravariant) - self.__infer_variance__ = bool(infer_variance) - if bound: - self.__bound__ = typing._type_check(bound, 'Bound must be a type.') - else: - self.__bound__ = None - _DefaultMixin.__init__(self, default) - - # for pickling: - def_mod = _caller() - if def_mod != 'typing_extensions': - self.__module__ = def_mod - - def __repr__(self): - if self.__infer_variance__: - prefix = '' - elif self.__covariant__: - prefix = '+' - elif self.__contravariant__: - prefix = '-' - else: - prefix = '~' - return prefix + self.__name__ - - def __hash__(self): - return object.__hash__(self) - - def __eq__(self, other): - return self is other - - def __reduce__(self): - return self.__name__ - - # Hack to get typing._type_check to pass. - def __call__(self, *args, **kwargs): - pass - - -# 3.7-3.9 -if not hasattr(typing, 'Concatenate'): - # Inherits from list as a workaround for Callable checks in Python < 3.9.2. - class _ConcatenateGenericAlias(list): - - # Trick Generic into looking into this for __parameters__. - __class__ = typing._GenericAlias - - # Flag in 3.8. - _special = False - - def __init__(self, origin, args): - super().__init__(args) - self.__origin__ = origin - self.__args__ = args - - def __repr__(self): - _type_repr = typing._type_repr - return (f'{_type_repr(self.__origin__)}' - f'[{", ".join(_type_repr(arg) for arg in self.__args__)}]') - - def __hash__(self): - return hash((self.__origin__, self.__args__)) - - # Hack to get typing._type_check to pass in Generic. - def __call__(self, *args, **kwargs): - pass - - @property - def __parameters__(self): - return tuple( - tp for tp in self.__args__ if isinstance(tp, (typing.TypeVar, ParamSpec)) - ) - - -# 3.7-3.9 -@typing._tp_cache -def _concatenate_getitem(self, parameters): - if parameters == (): - raise TypeError("Cannot take a Concatenate of no types.") - if not isinstance(parameters, tuple): - parameters = (parameters,) - if not isinstance(parameters[-1], ParamSpec): - raise TypeError("The last parameter to Concatenate should be a " - "ParamSpec variable.") - msg = "Concatenate[arg, ...]: each arg must be a type." - parameters = tuple(typing._type_check(p, msg) for p in parameters) - return _ConcatenateGenericAlias(self, parameters) - - -# 3.10+ -if hasattr(typing, 'Concatenate'): - Concatenate = typing.Concatenate - _ConcatenateGenericAlias = typing._ConcatenateGenericAlias # noqa: F811 -# 3.9 -elif sys.version_info[:2] >= (3, 9): - @_ExtensionsSpecialForm - def Concatenate(self, parameters): - """Used in conjunction with ``ParamSpec`` and ``Callable`` to represent a - higher order function which adds, removes or transforms parameters of a - callable. - - For example:: - - Callable[Concatenate[int, P], int] - - See PEP 612 for detailed information. - """ - return _concatenate_getitem(self, parameters) -# 3.7-8 -else: - class _ConcatenateForm(_ExtensionsSpecialForm, _root=True): - def __getitem__(self, parameters): - return _concatenate_getitem(self, parameters) - - Concatenate = _ConcatenateForm( - 'Concatenate', - doc="""Used in conjunction with ``ParamSpec`` and ``Callable`` to represent a - higher order function which adds, removes or transforms parameters of a - callable. - - For example:: - - Callable[Concatenate[int, P], int] - - See PEP 612 for detailed information. - """) - -# 3.10+ -if hasattr(typing, 'TypeGuard'): - TypeGuard = typing.TypeGuard -# 3.9 -elif sys.version_info[:2] >= (3, 9): - @_ExtensionsSpecialForm - def TypeGuard(self, parameters): - """Special typing form used to annotate the return type of a user-defined - type guard function. ``TypeGuard`` only accepts a single type argument. - At runtime, functions marked this way should return a boolean. - - ``TypeGuard`` aims to benefit *type narrowing* -- a technique used by static - type checkers to determine a more precise type of an expression within a - program's code flow. Usually type narrowing is done by analyzing - conditional code flow and applying the narrowing to a block of code. The - conditional expression here is sometimes referred to as a "type guard". - - Sometimes it would be convenient to use a user-defined boolean function - as a type guard. Such a function should use ``TypeGuard[...]`` as its - return type to alert static type checkers to this intention. - - Using ``-> TypeGuard`` tells the static type checker that for a given - function: - - 1. The return value is a boolean. - 2. If the return value is ``True``, the type of its argument - is the type inside ``TypeGuard``. - - For example:: - - def is_str(val: Union[str, float]): - # "isinstance" type guard - if isinstance(val, str): - # Type of ``val`` is narrowed to ``str`` - ... - else: - # Else, type of ``val`` is narrowed to ``float``. - ... - - Strict type narrowing is not enforced -- ``TypeB`` need not be a narrower - form of ``TypeA`` (it can even be a wider form) and this may lead to - type-unsafe results. The main reason is to allow for things like - narrowing ``List[object]`` to ``List[str]`` even though the latter is not - a subtype of the former, since ``List`` is invariant. The responsibility of - writing type-safe type guards is left to the user. - - ``TypeGuard`` also works with type variables. For more information, see - PEP 647 (User-Defined Type Guards). - """ - item = typing._type_check(parameters, f'{self} accepts only a single type.') - return typing._GenericAlias(self, (item,)) -# 3.7-3.8 -else: - class _TypeGuardForm(_ExtensionsSpecialForm, _root=True): - def __getitem__(self, parameters): - item = typing._type_check(parameters, - f'{self._name} accepts only a single type') - return typing._GenericAlias(self, (item,)) - - TypeGuard = _TypeGuardForm( - 'TypeGuard', - doc="""Special typing form used to annotate the return type of a user-defined - type guard function. ``TypeGuard`` only accepts a single type argument. - At runtime, functions marked this way should return a boolean. - - ``TypeGuard`` aims to benefit *type narrowing* -- a technique used by static - type checkers to determine a more precise type of an expression within a - program's code flow. Usually type narrowing is done by analyzing - conditional code flow and applying the narrowing to a block of code. The - conditional expression here is sometimes referred to as a "type guard". - - Sometimes it would be convenient to use a user-defined boolean function - as a type guard. Such a function should use ``TypeGuard[...]`` as its - return type to alert static type checkers to this intention. - - Using ``-> TypeGuard`` tells the static type checker that for a given - function: - - 1. The return value is a boolean. - 2. If the return value is ``True``, the type of its argument - is the type inside ``TypeGuard``. - - For example:: - - def is_str(val: Union[str, float]): - # "isinstance" type guard - if isinstance(val, str): - # Type of ``val`` is narrowed to ``str`` - ... - else: - # Else, type of ``val`` is narrowed to ``float``. - ... - - Strict type narrowing is not enforced -- ``TypeB`` need not be a narrower - form of ``TypeA`` (it can even be a wider form) and this may lead to - type-unsafe results. The main reason is to allow for things like - narrowing ``List[object]`` to ``List[str]`` even though the latter is not - a subtype of the former, since ``List`` is invariant. The responsibility of - writing type-safe type guards is left to the user. - - ``TypeGuard`` also works with type variables. For more information, see - PEP 647 (User-Defined Type Guards). - """) - - -# Vendored from cpython typing._SpecialFrom -class _SpecialForm(typing._Final, _root=True): - __slots__ = ('_name', '__doc__', '_getitem') - - def __init__(self, getitem): - self._getitem = getitem - self._name = getitem.__name__ - self.__doc__ = getitem.__doc__ - - def __getattr__(self, item): - if item in {'__name__', '__qualname__'}: - return self._name - - raise AttributeError(item) - - def __mro_entries__(self, bases): - raise TypeError(f"Cannot subclass {self!r}") - - def __repr__(self): - return f'typing_extensions.{self._name}' - - def __reduce__(self): - return self._name - - def __call__(self, *args, **kwds): - raise TypeError(f"Cannot instantiate {self!r}") - - def __or__(self, other): - return typing.Union[self, other] - - def __ror__(self, other): - return typing.Union[other, self] - - def __instancecheck__(self, obj): - raise TypeError(f"{self} cannot be used with isinstance()") - - def __subclasscheck__(self, cls): - raise TypeError(f"{self} cannot be used with issubclass()") - - @typing._tp_cache - def __getitem__(self, parameters): - return self._getitem(self, parameters) - - -if hasattr(typing, "LiteralString"): - LiteralString = typing.LiteralString -else: - @_SpecialForm - def LiteralString(self, params): - """Represents an arbitrary literal string. - - Example:: - - from pip._vendor.typing_extensions import LiteralString - - def query(sql: LiteralString) -> ...: - ... - - query("SELECT * FROM table") # ok - query(f"SELECT * FROM {input()}") # not ok - - See PEP 675 for details. - - """ - raise TypeError(f"{self} is not subscriptable") - - -if hasattr(typing, "Self"): - Self = typing.Self -else: - @_SpecialForm - def Self(self, params): - """Used to spell the type of "self" in classes. - - Example:: - - from typing import Self - - class ReturnsSelf: - def parse(self, data: bytes) -> Self: - ... - return self - - """ - - raise TypeError(f"{self} is not subscriptable") - - -if hasattr(typing, "Never"): - Never = typing.Never -else: - @_SpecialForm - def Never(self, params): - """The bottom type, a type that has no members. - - This can be used to define a function that should never be - called, or a function that never returns:: - - from pip._vendor.typing_extensions import Never - - def never_call_me(arg: Never) -> None: - pass - - def int_or_str(arg: int | str) -> None: - never_call_me(arg) # type checker error - match arg: - case int(): - print("It's an int") - case str(): - print("It's a str") - case _: - never_call_me(arg) # ok, arg is of type Never - - """ - - raise TypeError(f"{self} is not subscriptable") - - -if hasattr(typing, 'Required'): - Required = typing.Required - NotRequired = typing.NotRequired -elif sys.version_info[:2] >= (3, 9): - @_ExtensionsSpecialForm - def Required(self, parameters): - """A special typing construct to mark a key of a total=False TypedDict - as required. For example: - - class Movie(TypedDict, total=False): - title: Required[str] - year: int - - m = Movie( - title='The Matrix', # typechecker error if key is omitted - year=1999, - ) - - There is no runtime checking that a required key is actually provided - when instantiating a related TypedDict. - """ - item = typing._type_check(parameters, f'{self._name} accepts only a single type.') - return typing._GenericAlias(self, (item,)) - - @_ExtensionsSpecialForm - def NotRequired(self, parameters): - """A special typing construct to mark a key of a TypedDict as - potentially missing. For example: - - class Movie(TypedDict): - title: str - year: NotRequired[int] - - m = Movie( - title='The Matrix', # typechecker error if key is omitted - year=1999, - ) - """ - item = typing._type_check(parameters, f'{self._name} accepts only a single type.') - return typing._GenericAlias(self, (item,)) - -else: - class _RequiredForm(_ExtensionsSpecialForm, _root=True): - def __getitem__(self, parameters): - item = typing._type_check(parameters, - f'{self._name} accepts only a single type.') - return typing._GenericAlias(self, (item,)) - - Required = _RequiredForm( - 'Required', - doc="""A special typing construct to mark a key of a total=False TypedDict - as required. For example: - - class Movie(TypedDict, total=False): - title: Required[str] - year: int - - m = Movie( - title='The Matrix', # typechecker error if key is omitted - year=1999, - ) - - There is no runtime checking that a required key is actually provided - when instantiating a related TypedDict. - """) - NotRequired = _RequiredForm( - 'NotRequired', - doc="""A special typing construct to mark a key of a TypedDict as - potentially missing. For example: - - class Movie(TypedDict): - title: str - year: NotRequired[int] - - m = Movie( - title='The Matrix', # typechecker error if key is omitted - year=1999, - ) - """) - - -_UNPACK_DOC = """\ -Type unpack operator. - -The type unpack operator takes the child types from some container type, -such as `tuple[int, str]` or a `TypeVarTuple`, and 'pulls them out'. For -example: - - # For some generic class `Foo`: - Foo[Unpack[tuple[int, str]]] # Equivalent to Foo[int, str] - - Ts = TypeVarTuple('Ts') - # Specifies that `Bar` is generic in an arbitrary number of types. - # (Think of `Ts` as a tuple of an arbitrary number of individual - # `TypeVar`s, which the `Unpack` is 'pulling out' directly into the - # `Generic[]`.) - class Bar(Generic[Unpack[Ts]]): ... - Bar[int] # Valid - Bar[int, str] # Also valid - -From Python 3.11, this can also be done using the `*` operator: - - Foo[*tuple[int, str]] - class Bar(Generic[*Ts]): ... - -The operator can also be used along with a `TypedDict` to annotate -`**kwargs` in a function signature. For instance: - - class Movie(TypedDict): - name: str - year: int - - # This function expects two keyword arguments - *name* of type `str` and - # *year* of type `int`. - def foo(**kwargs: Unpack[Movie]): ... - -Note that there is only some runtime checking of this operator. Not -everything the runtime allows may be accepted by static type checkers. - -For more information, see PEP 646 and PEP 692. -""" - - -if sys.version_info >= (3, 12): # PEP 692 changed the repr of Unpack[] - Unpack = typing.Unpack - - def _is_unpack(obj): - return get_origin(obj) is Unpack - -elif sys.version_info[:2] >= (3, 9): - class _UnpackSpecialForm(_ExtensionsSpecialForm, _root=True): - def __init__(self, getitem): - super().__init__(getitem) - self.__doc__ = _UNPACK_DOC - - class _UnpackAlias(typing._GenericAlias, _root=True): - __class__ = typing.TypeVar - - @_UnpackSpecialForm - def Unpack(self, parameters): - item = typing._type_check(parameters, f'{self._name} accepts only a single type.') - return _UnpackAlias(self, (item,)) - - def _is_unpack(obj): - return isinstance(obj, _UnpackAlias) - -else: - class _UnpackAlias(typing._GenericAlias, _root=True): - __class__ = typing.TypeVar - - class _UnpackForm(_ExtensionsSpecialForm, _root=True): - def __getitem__(self, parameters): - item = typing._type_check(parameters, - f'{self._name} accepts only a single type.') - return _UnpackAlias(self, (item,)) - - Unpack = _UnpackForm('Unpack', doc=_UNPACK_DOC) - - def _is_unpack(obj): - return isinstance(obj, _UnpackAlias) - - -if hasattr(typing, "TypeVarTuple"): # 3.11+ - - # Add default parameter - PEP 696 - class TypeVarTuple(metaclass=_TypeVarLikeMeta): - """Type variable tuple.""" - - _backported_typevarlike = typing.TypeVarTuple - - def __new__(cls, name, *, default=_marker): - tvt = typing.TypeVarTuple(name) - _set_default(tvt, default) - _set_module(tvt) - return tvt - - def __init_subclass__(self, *args, **kwds): - raise TypeError("Cannot subclass special typing classes") - -else: - class TypeVarTuple(_DefaultMixin): - """Type variable tuple. - - Usage:: - - Ts = TypeVarTuple('Ts') - - In the same way that a normal type variable is a stand-in for a single - type such as ``int``, a type variable *tuple* is a stand-in for a *tuple* - type such as ``Tuple[int, str]``. - - Type variable tuples can be used in ``Generic`` declarations. - Consider the following example:: - - class Array(Generic[*Ts]): ... - - The ``Ts`` type variable tuple here behaves like ``tuple[T1, T2]``, - where ``T1`` and ``T2`` are type variables. To use these type variables - as type parameters of ``Array``, we must *unpack* the type variable tuple using - the star operator: ``*Ts``. The signature of ``Array`` then behaves - as if we had simply written ``class Array(Generic[T1, T2]): ...``. - In contrast to ``Generic[T1, T2]``, however, ``Generic[*Shape]`` allows - us to parameterise the class with an *arbitrary* number of type parameters. - - Type variable tuples can be used anywhere a normal ``TypeVar`` can. - This includes class definitions, as shown above, as well as function - signatures and variable annotations:: - - class Array(Generic[*Ts]): - - def __init__(self, shape: Tuple[*Ts]): - self._shape: Tuple[*Ts] = shape - - def get_shape(self) -> Tuple[*Ts]: - return self._shape - - shape = (Height(480), Width(640)) - x: Array[Height, Width] = Array(shape) - y = abs(x) # Inferred type is Array[Height, Width] - z = x + x # ... is Array[Height, Width] - x.get_shape() # ... is tuple[Height, Width] - - """ - - # Trick Generic __parameters__. - __class__ = typing.TypeVar - - def __iter__(self): - yield self.__unpacked__ - - def __init__(self, name, *, default=_marker): - self.__name__ = name - _DefaultMixin.__init__(self, default) - - # for pickling: - def_mod = _caller() - if def_mod != 'typing_extensions': - self.__module__ = def_mod - - self.__unpacked__ = Unpack[self] - - def __repr__(self): - return self.__name__ - - def __hash__(self): - return object.__hash__(self) - - def __eq__(self, other): - return self is other - - def __reduce__(self): - return self.__name__ - - def __init_subclass__(self, *args, **kwds): - if '_root' not in kwds: - raise TypeError("Cannot subclass special typing classes") - - -if hasattr(typing, "reveal_type"): - reveal_type = typing.reveal_type -else: - def reveal_type(__obj: T) -> T: - """Reveal the inferred type of a variable. - - When a static type checker encounters a call to ``reveal_type()``, - it will emit the inferred type of the argument:: - - x: int = 1 - reveal_type(x) - - Running a static type checker (e.g., ``mypy``) on this example - will produce output similar to 'Revealed type is "builtins.int"'. - - At runtime, the function prints the runtime type of the - argument and returns it unchanged. - - """ - print(f"Runtime type is {type(__obj).__name__!r}", file=sys.stderr) - return __obj - - -if hasattr(typing, "assert_never"): - assert_never = typing.assert_never -else: - def assert_never(__arg: Never) -> Never: - """Assert to the type checker that a line of code is unreachable. - - Example:: - - def int_or_str(arg: int | str) -> None: - match arg: - case int(): - print("It's an int") - case str(): - print("It's a str") - case _: - assert_never(arg) - - If a type checker finds that a call to assert_never() is - reachable, it will emit an error. - - At runtime, this throws an exception when called. - - """ - raise AssertionError("Expected code to be unreachable") - - -if sys.version_info >= (3, 12): - # dataclass_transform exists in 3.11 but lacks the frozen_default parameter - dataclass_transform = typing.dataclass_transform -else: - def dataclass_transform( - *, - eq_default: bool = True, - order_default: bool = False, - kw_only_default: bool = False, - frozen_default: bool = False, - field_specifiers: typing.Tuple[ - typing.Union[typing.Type[typing.Any], typing.Callable[..., typing.Any]], - ... - ] = (), - **kwargs: typing.Any, - ) -> typing.Callable[[T], T]: - """Decorator that marks a function, class, or metaclass as providing - dataclass-like behavior. - - Example: - - from pip._vendor.typing_extensions import dataclass_transform - - _T = TypeVar("_T") - - # Used on a decorator function - @dataclass_transform() - def create_model(cls: type[_T]) -> type[_T]: - ... - return cls - - @create_model - class CustomerModel: - id: int - name: str - - # Used on a base class - @dataclass_transform() - class ModelBase: ... - - class CustomerModel(ModelBase): - id: int - name: str - - # Used on a metaclass - @dataclass_transform() - class ModelMeta(type): ... - - class ModelBase(metaclass=ModelMeta): ... - - class CustomerModel(ModelBase): - id: int - name: str - - Each of the ``CustomerModel`` classes defined in this example will now - behave similarly to a dataclass created with the ``@dataclasses.dataclass`` - decorator. For example, the type checker will synthesize an ``__init__`` - method. - - The arguments to this decorator can be used to customize this behavior: - - ``eq_default`` indicates whether the ``eq`` parameter is assumed to be - True or False if it is omitted by the caller. - - ``order_default`` indicates whether the ``order`` parameter is - assumed to be True or False if it is omitted by the caller. - - ``kw_only_default`` indicates whether the ``kw_only`` parameter is - assumed to be True or False if it is omitted by the caller. - - ``frozen_default`` indicates whether the ``frozen`` parameter is - assumed to be True or False if it is omitted by the caller. - - ``field_specifiers`` specifies a static list of supported classes - or functions that describe fields, similar to ``dataclasses.field()``. - - At runtime, this decorator records its arguments in the - ``__dataclass_transform__`` attribute on the decorated object. - - See PEP 681 for details. - - """ - def decorator(cls_or_fn): - cls_or_fn.__dataclass_transform__ = { - "eq_default": eq_default, - "order_default": order_default, - "kw_only_default": kw_only_default, - "frozen_default": frozen_default, - "field_specifiers": field_specifiers, - "kwargs": kwargs, - } - return cls_or_fn - return decorator - - -if hasattr(typing, "override"): - override = typing.override -else: - _F = typing.TypeVar("_F", bound=typing.Callable[..., typing.Any]) - - def override(__arg: _F) -> _F: - """Indicate that a method is intended to override a method in a base class. - - Usage: - - class Base: - def method(self) -> None: ... - pass - - class Child(Base): - @override - def method(self) -> None: - super().method() - - When this decorator is applied to a method, the type checker will - validate that it overrides a method with the same name on a base class. - This helps prevent bugs that may occur when a base class is changed - without an equivalent change to a child class. - - There is no runtime checking of these properties. The decorator - sets the ``__override__`` attribute to ``True`` on the decorated object - to allow runtime introspection. - - See PEP 698 for details. - - """ - try: - __arg.__override__ = True - except (AttributeError, TypeError): - # Skip the attribute silently if it is not writable. - # AttributeError happens if the object has __slots__ or a - # read-only property, TypeError if it's a builtin class. - pass - return __arg - - -if hasattr(typing, "deprecated"): - deprecated = typing.deprecated -else: - _T = typing.TypeVar("_T") - - def deprecated( - __msg: str, - *, - category: typing.Optional[typing.Type[Warning]] = DeprecationWarning, - stacklevel: int = 1, - ) -> typing.Callable[[_T], _T]: - """Indicate that a class, function or overload is deprecated. - - Usage: - - @deprecated("Use B instead") - class A: - pass - - @deprecated("Use g instead") - def f(): - pass - - @overload - @deprecated("int support is deprecated") - def g(x: int) -> int: ... - @overload - def g(x: str) -> int: ... - - When this decorator is applied to an object, the type checker - will generate a diagnostic on usage of the deprecated object. - - The warning specified by ``category`` will be emitted on use - of deprecated objects. For functions, that happens on calls; - for classes, on instantiation. If the ``category`` is ``None``, - no warning is emitted. The ``stacklevel`` determines where the - warning is emitted. If it is ``1`` (the default), the warning - is emitted at the direct caller of the deprecated object; if it - is higher, it is emitted further up the stack. - - The decorator sets the ``__deprecated__`` - attribute on the decorated object to the deprecation message - passed to the decorator. If applied to an overload, the decorator - must be after the ``@overload`` decorator for the attribute to - exist on the overload as returned by ``get_overloads()``. - - See PEP 702 for details. - - """ - def decorator(__arg: _T) -> _T: - if category is None: - __arg.__deprecated__ = __msg - return __arg - elif isinstance(__arg, type): - original_new = __arg.__new__ - has_init = __arg.__init__ is not object.__init__ - - @functools.wraps(original_new) - def __new__(cls, *args, **kwargs): - warnings.warn(__msg, category=category, stacklevel=stacklevel + 1) - if original_new is not object.__new__: - return original_new(cls, *args, **kwargs) - # Mirrors a similar check in object.__new__. - elif not has_init and (args or kwargs): - raise TypeError(f"{cls.__name__}() takes no arguments") - else: - return original_new(cls) - - __arg.__new__ = staticmethod(__new__) - __arg.__deprecated__ = __new__.__deprecated__ = __msg - return __arg - elif callable(__arg): - @functools.wraps(__arg) - def wrapper(*args, **kwargs): - warnings.warn(__msg, category=category, stacklevel=stacklevel + 1) - return __arg(*args, **kwargs) - - __arg.__deprecated__ = wrapper.__deprecated__ = __msg - return wrapper - else: - raise TypeError( - "@deprecated decorator with non-None category must be applied to " - f"a class or callable, not {__arg!r}" - ) - - return decorator - - -# We have to do some monkey patching to deal with the dual nature of -# Unpack/TypeVarTuple: -# - We want Unpack to be a kind of TypeVar so it gets accepted in -# Generic[Unpack[Ts]] -# - We want it to *not* be treated as a TypeVar for the purposes of -# counting generic parameters, so that when we subscript a generic, -# the runtime doesn't try to substitute the Unpack with the subscripted type. -if not hasattr(typing, "TypeVarTuple"): - typing._collect_type_vars = _collect_type_vars - typing._check_generic = _check_generic - - -# Backport typing.NamedTuple as it exists in Python 3.12. -# In 3.11, the ability to define generic `NamedTuple`s was supported. -# This was explicitly disallowed in 3.9-3.10, and only half-worked in <=3.8. -# On 3.12, we added __orig_bases__ to call-based NamedTuples -# On 3.13, we deprecated kwargs-based NamedTuples -if sys.version_info >= (3, 13): - NamedTuple = typing.NamedTuple -else: - def _make_nmtuple(name, types, module, defaults=()): - fields = [n for n, t in types] - annotations = {n: typing._type_check(t, f"field {n} annotation must be a type") - for n, t in types} - nm_tpl = collections.namedtuple(name, fields, - defaults=defaults, module=module) - nm_tpl.__annotations__ = nm_tpl.__new__.__annotations__ = annotations - # The `_field_types` attribute was removed in 3.9; - # in earlier versions, it is the same as the `__annotations__` attribute - if sys.version_info < (3, 9): - nm_tpl._field_types = annotations - return nm_tpl - - _prohibited_namedtuple_fields = typing._prohibited - _special_namedtuple_fields = frozenset({'__module__', '__name__', '__annotations__'}) - - class _NamedTupleMeta(type): - def __new__(cls, typename, bases, ns): - assert _NamedTuple in bases - for base in bases: - if base is not _NamedTuple and base is not typing.Generic: - raise TypeError( - 'can only inherit from a NamedTuple type and Generic') - bases = tuple(tuple if base is _NamedTuple else base for base in bases) - types = ns.get('__annotations__', {}) - default_names = [] - for field_name in types: - if field_name in ns: - default_names.append(field_name) - elif default_names: - raise TypeError(f"Non-default namedtuple field {field_name} " - f"cannot follow default field" - f"{'s' if len(default_names) > 1 else ''} " - f"{', '.join(default_names)}") - nm_tpl = _make_nmtuple( - typename, types.items(), - defaults=[ns[n] for n in default_names], - module=ns['__module__'] - ) - nm_tpl.__bases__ = bases - if typing.Generic in bases: - if hasattr(typing, '_generic_class_getitem'): # 3.12+ - nm_tpl.__class_getitem__ = classmethod(typing._generic_class_getitem) - else: - class_getitem = typing.Generic.__class_getitem__.__func__ - nm_tpl.__class_getitem__ = classmethod(class_getitem) - # update from user namespace without overriding special namedtuple attributes - for key in ns: - if key in _prohibited_namedtuple_fields: - raise AttributeError("Cannot overwrite NamedTuple attribute " + key) - elif key not in _special_namedtuple_fields and key not in nm_tpl._fields: - setattr(nm_tpl, key, ns[key]) - if typing.Generic in bases: - nm_tpl.__init_subclass__() - return nm_tpl - - _NamedTuple = type.__new__(_NamedTupleMeta, 'NamedTuple', (), {}) - - def _namedtuple_mro_entries(bases): - assert NamedTuple in bases - return (_NamedTuple,) - - @_ensure_subclassable(_namedtuple_mro_entries) - def NamedTuple(__typename, __fields=_marker, **kwargs): - """Typed version of namedtuple. - - Usage:: - - class Employee(NamedTuple): - name: str - id: int - - This is equivalent to:: - - Employee = collections.namedtuple('Employee', ['name', 'id']) - - The resulting class has an extra __annotations__ attribute, giving a - dict that maps field names to types. (The field names are also in - the _fields attribute, which is part of the namedtuple API.) - An alternative equivalent functional syntax is also accepted:: - - Employee = NamedTuple('Employee', [('name', str), ('id', int)]) - """ - if __fields is _marker: - if kwargs: - deprecated_thing = "Creating NamedTuple classes using keyword arguments" - deprecation_msg = ( - "{name} is deprecated and will be disallowed in Python {remove}. " - "Use the class-based or functional syntax instead." - ) - else: - deprecated_thing = "Failing to pass a value for the 'fields' parameter" - example = f"`{__typename} = NamedTuple({__typename!r}, [])`" - deprecation_msg = ( - "{name} is deprecated and will be disallowed in Python {remove}. " - "To create a NamedTuple class with 0 fields " - "using the functional syntax, " - "pass an empty list, e.g. " - ) + example + "." - elif __fields is None: - if kwargs: - raise TypeError( - "Cannot pass `None` as the 'fields' parameter " - "and also specify fields using keyword arguments" - ) - else: - deprecated_thing = "Passing `None` as the 'fields' parameter" - example = f"`{__typename} = NamedTuple({__typename!r}, [])`" - deprecation_msg = ( - "{name} is deprecated and will be disallowed in Python {remove}. " - "To create a NamedTuple class with 0 fields " - "using the functional syntax, " - "pass an empty list, e.g. " - ) + example + "." - elif kwargs: - raise TypeError("Either list of fields or keywords" - " can be provided to NamedTuple, not both") - if __fields is _marker or __fields is None: - warnings.warn( - deprecation_msg.format(name=deprecated_thing, remove="3.15"), - DeprecationWarning, - stacklevel=2, - ) - __fields = kwargs.items() - nt = _make_nmtuple(__typename, __fields, module=_caller()) - nt.__orig_bases__ = (NamedTuple,) - return nt - - # On 3.8+, alter the signature so that it matches typing.NamedTuple. - # The signature of typing.NamedTuple on >=3.8 is invalid syntax in Python 3.7, - # so just leave the signature as it is on 3.7. - if sys.version_info >= (3, 8): - _new_signature = '(typename, fields=None, /, **kwargs)' - if isinstance(NamedTuple, _types.FunctionType): - NamedTuple.__text_signature__ = _new_signature - else: - NamedTuple.__call__.__text_signature__ = _new_signature - - -if hasattr(collections.abc, "Buffer"): - Buffer = collections.abc.Buffer -else: - class Buffer(abc.ABC): - """Base class for classes that implement the buffer protocol. - - The buffer protocol allows Python objects to expose a low-level - memory buffer interface. Before Python 3.12, it is not possible - to implement the buffer protocol in pure Python code, or even - to check whether a class implements the buffer protocol. In - Python 3.12 and higher, the ``__buffer__`` method allows access - to the buffer protocol from Python code, and the - ``collections.abc.Buffer`` ABC allows checking whether a class - implements the buffer protocol. - - To indicate support for the buffer protocol in earlier versions, - inherit from this ABC, either in a stub file or at runtime, - or use ABC registration. This ABC provides no methods, because - there is no Python-accessible methods shared by pre-3.12 buffer - classes. It is useful primarily for static checks. - - """ - - # As a courtesy, register the most common stdlib buffer classes. - Buffer.register(memoryview) - Buffer.register(bytearray) - Buffer.register(bytes) - - -# Backport of types.get_original_bases, available on 3.12+ in CPython -if hasattr(_types, "get_original_bases"): - get_original_bases = _types.get_original_bases -else: - def get_original_bases(__cls): - """Return the class's "original" bases prior to modification by `__mro_entries__`. - - Examples:: - - from typing import TypeVar, Generic - from pip._vendor.typing_extensions import NamedTuple, TypedDict - - T = TypeVar("T") - class Foo(Generic[T]): ... - class Bar(Foo[int], float): ... - class Baz(list[str]): ... - Eggs = NamedTuple("Eggs", [("a", int), ("b", str)]) - Spam = TypedDict("Spam", {"a": int, "b": str}) - - assert get_original_bases(Bar) == (Foo[int], float) - assert get_original_bases(Baz) == (list[str],) - assert get_original_bases(Eggs) == (NamedTuple,) - assert get_original_bases(Spam) == (TypedDict,) - assert get_original_bases(int) == (object,) - """ - try: - return __cls.__orig_bases__ - except AttributeError: - try: - return __cls.__bases__ - except AttributeError: - raise TypeError( - f'Expected an instance of type, not {type(__cls).__name__!r}' - ) from None - - -# NewType is a class on Python 3.10+, making it pickleable -# The error message for subclassing instances of NewType was improved on 3.11+ -if sys.version_info >= (3, 11): - NewType = typing.NewType -else: - class NewType: - """NewType creates simple unique types with almost zero - runtime overhead. NewType(name, tp) is considered a subtype of tp - by static type checkers. At runtime, NewType(name, tp) returns - a dummy callable that simply returns its argument. Usage:: - UserId = NewType('UserId', int) - def name_by_id(user_id: UserId) -> str: - ... - UserId('user') # Fails type check - name_by_id(42) # Fails type check - name_by_id(UserId(42)) # OK - num = UserId(5) + 1 # type: int - """ - - def __call__(self, obj): - return obj - - def __init__(self, name, tp): - self.__qualname__ = name - if '.' in name: - name = name.rpartition('.')[-1] - self.__name__ = name - self.__supertype__ = tp - def_mod = _caller() - if def_mod != 'typing_extensions': - self.__module__ = def_mod - - def __mro_entries__(self, bases): - # We defined __mro_entries__ to get a better error message - # if a user attempts to subclass a NewType instance. bpo-46170 - supercls_name = self.__name__ - - class Dummy: - def __init_subclass__(cls): - subcls_name = cls.__name__ - raise TypeError( - f"Cannot subclass an instance of NewType. " - f"Perhaps you were looking for: " - f"`{subcls_name} = NewType({subcls_name!r}, {supercls_name})`" - ) - - return (Dummy,) - - def __repr__(self): - return f'{self.__module__}.{self.__qualname__}' - - def __reduce__(self): - return self.__qualname__ - - if sys.version_info >= (3, 10): - # PEP 604 methods - # It doesn't make sense to have these methods on Python <3.10 - - def __or__(self, other): - return typing.Union[self, other] - - def __ror__(self, other): - return typing.Union[other, self] - - -if hasattr(typing, "TypeAliasType"): - TypeAliasType = typing.TypeAliasType -else: - def _is_unionable(obj): - """Corresponds to is_unionable() in unionobject.c in CPython.""" - return obj is None or isinstance(obj, ( - type, - _types.GenericAlias, - _types.UnionType, - TypeAliasType, - )) - - class TypeAliasType: - """Create named, parameterized type aliases. - - This provides a backport of the new `type` statement in Python 3.12: - - type ListOrSet[T] = list[T] | set[T] - - is equivalent to: - - T = TypeVar("T") - ListOrSet = TypeAliasType("ListOrSet", list[T] | set[T], type_params=(T,)) - - The name ListOrSet can then be used as an alias for the type it refers to. - - The type_params argument should contain all the type parameters used - in the value of the type alias. If the alias is not generic, this - argument is omitted. - - Static type checkers should only support type aliases declared using - TypeAliasType that follow these rules: - - - The first argument (the name) must be a string literal. - - The TypeAliasType instance must be immediately assigned to a variable - of the same name. (For example, 'X = TypeAliasType("Y", int)' is invalid, - as is 'X, Y = TypeAliasType("X", int), TypeAliasType("Y", int)'). - - """ - - def __init__(self, name: str, value, *, type_params=()): - if not isinstance(name, str): - raise TypeError("TypeAliasType name must be a string") - self.__value__ = value - self.__type_params__ = type_params - - parameters = [] - for type_param in type_params: - if isinstance(type_param, TypeVarTuple): - parameters.extend(type_param) - else: - parameters.append(type_param) - self.__parameters__ = tuple(parameters) - def_mod = _caller() - if def_mod != 'typing_extensions': - self.__module__ = def_mod - # Setting this attribute closes the TypeAliasType from further modification - self.__name__ = name - - def __setattr__(self, __name: str, __value: object) -> None: - if hasattr(self, "__name__"): - self._raise_attribute_error(__name) - super().__setattr__(__name, __value) - - def __delattr__(self, __name: str) -> Never: - self._raise_attribute_error(__name) - - def _raise_attribute_error(self, name: str) -> Never: - # Match the Python 3.12 error messages exactly - if name == "__name__": - raise AttributeError("readonly attribute") - elif name in {"__value__", "__type_params__", "__parameters__", "__module__"}: - raise AttributeError( - f"attribute '{name}' of 'typing.TypeAliasType' objects " - "is not writable" - ) - else: - raise AttributeError( - f"'typing.TypeAliasType' object has no attribute '{name}'" - ) - - def __repr__(self) -> str: - return self.__name__ - - def __getitem__(self, parameters): - if not isinstance(parameters, tuple): - parameters = (parameters,) - parameters = [ - typing._type_check( - item, f'Subscripting {self.__name__} requires a type.' - ) - for item in parameters - ] - return typing._GenericAlias(self, tuple(parameters)) - - def __reduce__(self): - return self.__name__ - - def __init_subclass__(cls, *args, **kwargs): - raise TypeError( - "type 'typing_extensions.TypeAliasType' is not an acceptable base type" - ) - - # The presence of this method convinces typing._type_check - # that TypeAliasTypes are types. - def __call__(self): - raise TypeError("Type alias is not callable") - - if sys.version_info >= (3, 10): - def __or__(self, right): - # For forward compatibility with 3.12, reject Unions - # that are not accepted by the built-in Union. - if not _is_unionable(right): - return NotImplemented - return typing.Union[self, right] - - def __ror__(self, left): - if not _is_unionable(left): - return NotImplemented - return typing.Union[left, self] - - -if hasattr(typing, "is_protocol"): - is_protocol = typing.is_protocol - get_protocol_members = typing.get_protocol_members -else: - def is_protocol(__tp: type) -> bool: - """Return True if the given type is a Protocol. - - Example:: - - >>> from typing_extensions import Protocol, is_protocol - >>> class P(Protocol): - ... def a(self) -> str: ... - ... b: int - >>> is_protocol(P) - True - >>> is_protocol(int) - False - """ - return ( - isinstance(__tp, type) - and getattr(__tp, '_is_protocol', False) - and __tp is not Protocol - and __tp is not getattr(typing, "Protocol", object()) - ) - - def get_protocol_members(__tp: type) -> typing.FrozenSet[str]: - """Return the set of members defined in a Protocol. - - Example:: - - >>> from typing_extensions import Protocol, get_protocol_members - >>> class P(Protocol): - ... def a(self) -> str: ... - ... b: int - >>> get_protocol_members(P) - frozenset({'a', 'b'}) - - Raise a TypeError for arguments that are not Protocols. - """ - if not is_protocol(__tp): - raise TypeError(f'{__tp!r} is not a Protocol') - if hasattr(__tp, '__protocol_attrs__'): - return frozenset(__tp.__protocol_attrs__) - return frozenset(_get_protocol_attrs(__tp)) - - -# Aliases for items that have always been in typing. -# Explicitly assign these (rather than using `from typing import *` at the top), -# so that we get a CI error if one of these is deleted from typing.py -# in a future version of Python -AbstractSet = typing.AbstractSet -AnyStr = typing.AnyStr -BinaryIO = typing.BinaryIO -Callable = typing.Callable -Collection = typing.Collection -Container = typing.Container -Dict = typing.Dict -ForwardRef = typing.ForwardRef -FrozenSet = typing.FrozenSet -Generator = typing.Generator -Generic = typing.Generic -Hashable = typing.Hashable -IO = typing.IO -ItemsView = typing.ItemsView -Iterable = typing.Iterable -Iterator = typing.Iterator -KeysView = typing.KeysView -List = typing.List -Mapping = typing.Mapping -MappingView = typing.MappingView -Match = typing.Match -MutableMapping = typing.MutableMapping -MutableSequence = typing.MutableSequence -MutableSet = typing.MutableSet -Optional = typing.Optional -Pattern = typing.Pattern -Reversible = typing.Reversible -Sequence = typing.Sequence -Set = typing.Set -Sized = typing.Sized -TextIO = typing.TextIO -Tuple = typing.Tuple -Union = typing.Union -ValuesView = typing.ValuesView -cast = typing.cast -no_type_check = typing.no_type_check -no_type_check_decorator = typing.no_type_check_decorator diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__init__.py deleted file mode 100644 index c6fa382..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__init__.py +++ /dev/null @@ -1,102 +0,0 @@ -""" -Python HTTP library with thread-safe connection pooling, file post support, user friendly, and more -""" -from __future__ import absolute_import - -# Set default logging handler to avoid "No handler found" warnings. -import logging -import warnings -from logging import NullHandler - -from . import exceptions -from ._version import __version__ -from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool, connection_from_url -from .filepost import encode_multipart_formdata -from .poolmanager import PoolManager, ProxyManager, proxy_from_url -from .response import HTTPResponse -from .util.request import make_headers -from .util.retry import Retry -from .util.timeout import Timeout -from .util.url import get_host - -# === NOTE TO REPACKAGERS AND VENDORS === -# Please delete this block, this logic is only -# for urllib3 being distributed via PyPI. -# See: https://github.com/urllib3/urllib3/issues/2680 -try: - import urllib3_secure_extra # type: ignore # noqa: F401 -except ImportError: - pass -else: - warnings.warn( - "'urllib3[secure]' extra is deprecated and will be removed " - "in a future release of urllib3 2.x. Read more in this issue: " - "https://github.com/urllib3/urllib3/issues/2680", - category=DeprecationWarning, - stacklevel=2, - ) - -__author__ = "Andrey Petrov (andrey.petrov@shazow.net)" -__license__ = "MIT" -__version__ = __version__ - -__all__ = ( - "HTTPConnectionPool", - "HTTPSConnectionPool", - "PoolManager", - "ProxyManager", - "HTTPResponse", - "Retry", - "Timeout", - "add_stderr_logger", - "connection_from_url", - "disable_warnings", - "encode_multipart_formdata", - "get_host", - "make_headers", - "proxy_from_url", -) - -logging.getLogger(__name__).addHandler(NullHandler()) - - -def add_stderr_logger(level=logging.DEBUG): - """ - Helper for quickly adding a StreamHandler to the logger. Useful for - debugging. - - Returns the handler after adding it. - """ - # This method needs to be in this __init__.py to get the __name__ correct - # even if urllib3 is vendored within another package. - logger = logging.getLogger(__name__) - handler = logging.StreamHandler() - handler.setFormatter(logging.Formatter("%(asctime)s %(levelname)s %(message)s")) - logger.addHandler(handler) - logger.setLevel(level) - logger.debug("Added a stderr logging handler to logger: %s", __name__) - return handler - - -# ... Clean up. -del NullHandler - - -# All warning filters *must* be appended unless you're really certain that they -# shouldn't be: otherwise, it's very hard for users to use most Python -# mechanisms to silence them. -# SecurityWarning's always go off by default. -warnings.simplefilter("always", exceptions.SecurityWarning, append=True) -# SubjectAltNameWarning's should go off once per host -warnings.simplefilter("default", exceptions.SubjectAltNameWarning, append=True) -# InsecurePlatformWarning's don't vary between requests, so we keep it default. -warnings.simplefilter("default", exceptions.InsecurePlatformWarning, append=True) -# SNIMissingWarnings should go off only once. -warnings.simplefilter("default", exceptions.SNIMissingWarning, append=True) - - -def disable_warnings(category=exceptions.HTTPWarning): - """ - Helper for quickly disabling all urllib3 warnings. - """ - warnings.simplefilter("ignore", category) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 092a1fc5147c6f924b15c8479bc1c5287e03c3a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3427 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 LA^%^30?_{fhdFio diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-312.pyc deleted file mode 100644 index cee434cdc883a873f1e9f72b4ec88a0a4051c784..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15953 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-312.pyc deleted file mode 100644 index 3242923bc5e06629d6ba83b966ba931d93c161b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 240 zcmX@j%ge<81j+NNGaP{QV-N=h7@>^M96-i&h7^V<hDt_FrYd$rJtH$cLvue(##`L+ z@nxw+#hLke@$oAeK7(}pD%Q`)&rQ|OO)M!c(|5^FF3nBND=F45NzF-3FG|eSEiTDS z&Q2}TP026M%gIknNiEVZOU*0O&&f>EFQ_cZ$j>v@Gc?jK&MZmQEl5nxPE1cN)-T8` z&<9$Tmy%zkUs{v{RBH_4gRRypsQkrYlbfGXnv-f*#0GQ&$mzu(pM79vWMq86C*H_i I!~*03078C69RL6T diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-312.pyc deleted file mode 100644 index b3581af0763c886ed0335dd44eeb1eb74c45bfb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20429 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 T{NXm9;_aaUr}Mu!c*Or7R1K@) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-312.pyc deleted file mode 100644 index 2aa5f1c0077ab469d4182c46ab0111736f6be038..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36301 zcmd6Qd2m}tn%~1k0t85aBzRLKc!`8Wg1Qe{hh<TxB}$ekd(9aS2;n`7pm1;=KvCp? z9<4K#p>{nhYG-yuXS^A@;)>;xE2~_!p2{XWJDJRx$`T?SaxikD-8hw+|EOa#E<4xn z>wXtN$oB3gRe7Qs{rdIm^Xsp_tH1Y)($W$ESNI=(ZFJY0g79DHM!kxZ$m0dGAlwo} zK{Q2$m}$slqPRI~9x}6E%aDcrT8FIc*EVEhzePhu?6-KR7{8XNEoL8buy?J9mkc=( zw~0kjSFCiXG*&iL7IP1|W1b;TtbC|ERxwl&s~oC~d563#Uvac5Ry|Z5s~M_^)ehCh z>W1oK^+WZshM|U7<4|L4!_bCU(@;~ad8j$&8}h|khFW5+L#^yxd$cXqKGe?Qj%Y`0 z<IqMHFNt=>x`w(~+!^)9HVtiJaaVM6tb3@N#Y>|-vA|G(#ml0-u`NSeSlk`m8rwFs zjm16D?Xew0J6OCtx-+(GXcvoDM0dyb4DDg@%IMx$-%uZmd!x_9_6_Ze?H}6D?yGQr zVCW!=S0n!H(6g~aLx)U)gOBucL(fUijs1OfV)WmkeyM%z_w;);Ha4fm^xvW5W<j!y z{l1=}#-x*XOgujHJo22nqdXWoZ5ECRV(m8su@0#gCC`9l9{Y#tyZSFu7xX(dHfkPv zft6B^QW~TIsq2oFKN~v7(i@S!K{}_EeqL<)hA=cJHX}SB`Vd~2GPeoRk#<2Q=&^}4 z(W9~cp?;I_vhez~N#UyHWnt3fZ}~M9>o;ZHp^M2xbRs1MBeC&>oEkuyO_Jq={H`fm zoQlMx#6;@X)M39p>v}Gfl+K?&b%dU0-OtI1%ToMoWL#1b`X^$ssl$nQTneWmiFmf` z_~77K!+j~;AGsQq#@S;x-JUl*uX$0DBO?(>%zscuO$%O}3MRv&QcUufX5ELQiKHZ+ zO(dec^0Fhb@zj)lUvXRtiIRLaBqt;BOFWO~cp{lPJQ|8$l0=?TeIlNe!V|J|PWtME zluW%8lH<sptvHnkhp3S+hN2Tn_exKPuAY-p@)UoyVnCYI+s@NU&&r8ZBCNKl1h-d} z?4EOI&mbR9p4qOAq|2C&39uw1S7{#5qzMU;GNpB=rPOFbOd`caBXmwmjwjH5+*d`C z!LT;)K~YYOk4qvRG#gT7^f4k!$>3-zH6Bb&V4kAL;y4u<NxYy`Ri2bm!I4N*3XUg| z5gGw1J(NsJn1E3>q``4Mrg&gu<AI3hFrH)TFlc<VkXEep%5TnEF38brSx}0H6QUGM zh2%?83OU@tctVbaqLFDSIEtx3PCK5kc-BGHNWlr2+US{-LYHM}1Wk*x{9(Q<cnFNk zuE%@ub4!qfA(JQo-<p7H%|lkn2Ha{FE#EK!w_34A?4k{!Lo7mAA{HZbPMQ6VY?(fv z1W2K00QV(6Tm<*Na1_Jf8%fB%P&De($JIBEyvc4~aw0tH3nkeLeJpd|aDe71x71-@ zC@%VPG8onX)jJ$0VTA+&zIY-f_4TnkG$Xg50EQ+pF2%e2J~1IBDKGvj<LN^)$0a!| z#Zx_e*nNE1eHYH1;B7>KlcN!|Ig<2EB&Csws4p_&n@UW`YF1486-j2L$2(K#;5e<r zymCdgb%yc-ENvjHAVD@cgvjXrF=60aLfVvcrW8afV6(iV#9uR|w71fxv@oV1Kvsql zyl1|nOnF)e8gh?0jJbGRMbF4-Q=g{IxKlT5VM_2@2Bs?p5<Y@KUvgXuGb9vv*OV<% z5KggNg_q^c6l_P3wNl=!Et;5=<g7C|P79sGt(C^eZ^>GdQglS#L2v9vkfe5E$Um9t z9Zkff-dHG=ywcmB2v5W?N6Frl6qPQ?p;%8c6$xLK<Q_3G8IL9ihxJ~O;#Yd3k&C_K zQ$PUm?SZY^da*dAp7Bula_Ewj>>ZDc_Xd$oOvt?e3*_D2t3xOOXkdIQYYzq^@klBd zoUX|OCH28MYALOvYr-$xmG>*!7d!SYRrD>o`abfuE%e{@{z=0>ZCLj1pS8a3SZ!$j zUf&yi-`zKBUAEV*dTVE`-*P<0yFyr-SKQDzvw0su<d&e%d0J5Cd`w-y$e~`}HHlA| z{qLGZ%-@(cf9e~8fG3teDmpLttpn3VT{J`cr;EF>KIPQ@PfUKlHET^xjY~8R@lZ?( z2KDKA*CbQ7lhksbycc1%I2cT(WDHjIy1`=ULzKS-!8PH&zvs4ir+&r1Z^^&!eeusC z|0?oR?_bpYqHfWBe$jqjeg?U628F6&gF?N)Vi3*?@0teQ7361eZ)}7k2&|css2R2E znxQ;-h2AMfa7|csSI#<lb;fl=<IAdRM}(>yGtLmw=u%gTNtiPE%>ze)c5PwWW&Kt* zHd(uLH5_CESWK}ip=h><C0$HXWdLqv<S@R{)u+H2e=v;v$ub0JvfXu~<a){Lt_N=K z`hh|g-g2tp7FzbMdAeW4I6g)MFmy~HE{O)LoMdQLj3h%BqmnN*Dls(85fim^K<-D0 z`Qt4gL*leIZ=~5MNO<y?kMf#baFnvP%7>BacgY9wlPw7bV+nBrduK4~3I@MA5sGp! zBTy0(VZa;V4!Mmo+u4qLIGU9EDD4mhM<{rn0%`_tAb}2pM|lgyD4>QXdk}m>cxblU z>}y`3tm4|yRd?;R<BzRHwz@|ilWoxSsK{jVJ}R=<svehEZAyFT{V@J(7vpGf_xPV7 zD7<${#n>?|qE&K?dA0Yn2xv?zo+|%FO0cV%hMa6yb%|clj=NIPfjzcNEJ5fNod`Xm z3t_ofim*be6s;p>u?#uAq8lkyq6cBMSdOqpDY-(Vd{hf+LoJoaT{~s*S7j^K@3Emi z>;w!-21jKOEj`K52sUtyKw_}Kw(>+=VrXC4a{EAZgkmg3+jV`%X<NV!DY7?Gqu4L0 zO2c;S>yiSO0>0KLsKzMaomM~44pB{_FA`5BG=NpNeWJhu;b;UaIFCe7H-DuiguC>X zoTcseb6PS$T|yIy*uxS<4Zc*uw`YsiBCRphGK~=V!Yu;si-ZkrIvhfSk|2@9^Qlm3 zB6%u;`cd#j$tQ;*Yy?Kw`b)CMz9>Bphlrp+7DnW0Bm~GOU&x16M?^Nny;}oYh?3bF z*y=O9{&yW)TL0^aD@r^Qk52g}6Y}LGrp<Sj?Y6#c0pB3aIRgy|xR^#aatWjsn_V^A z_FNEBSSNk%&L^;~V=g!gK;?t;NW?`>Qc58r#NuM)N<;+SFu<x(J4Q^KIE-7!Hv-}y zMT3KBlrBkfw?fT<fKRgVR%;@PmGB>fS>ge}=X7gj;bAC_GBCXHu;fdOXb_>$5rK(R zBpOg?`C+A!OOY#>bI^*u7=}SB4Ai;Q11bhT3>T;5MAVlc8d9lO?S3-gJ2XN=Ne#m& z0H`LyDYRu&A)skCE=p2d0g!HFq)`WWL?=U21SP|T+n2aF2JSO=E@GjpN$?o@TntRa zE~0XDR>uh#w1h7ix<Z=;1{UMZKv<&X7Vw=$H|as#w^gT?wSHqVV-wL-B*m}|`VQ)B zg7J^&=!p^E@bE>ThRegl^e!fdsyZ5qCZ+D&@iVq&G6F6GGaUv3OQFb%6L@V@0({Z~ zBKGl++AI1JG;{Q<^NKzfZ1h;;IX9so6xI-ZB+xjeJ%jQDniEg37V)kQ4=W>wh8JoY z!$hH!HVh#)y#e1#qnJ39G$KnztczL0Acn4lB2n6uX-)|fpf|j)G(=ii6LEkYrdh9- zV1vVi3|bi+8K#9TOo9rPgGok2$tR7B00szKYsF#lg07y3hUBNt6hK=-`v`q%{M2NK zqfhiSccvI9D5GO&Bd`SEigo~+;&E95O^${{6A2Mwg<PoQ+;mc(3ofx>a2Sb)qZ8=K zBtVMMH_G|}n>i7WO5j5i7(CR(IC4I)v?g^NAzdAhM#7O)bSk%284`?$WT=&~@YIEo z$fXIH0WGzidVF!pCrTqBKsIlP+6Y2kY&|l@A_u%UC#3i3EHUvSMgsg1SkF^nlSdO1 zQBeh820|jF5@EEoo8cjJ3ArR4lGRO9UGPk*ayk?T=OYgns9lj$82Wg~Ct}ZnFe4<> z`oWm;1}Ve$*^Sa*h>)b(xOG_a>5cmGrcDII!ON5SupAOaCR_og*R~Zti)=tJ{(RZf z5=xG)t4v=M`P74s*z-p%?;V580a!^v|4B|CgS!QNGH_HTayRVKNIgLy7TSsbj~BsG zfSJ=Cjajs)7D<E2Pn%U)rAbI>40s`i54np~w%#P9Ek@Qpr7`wtYf7b91vPiFDn)H# z*O;-jN?O`_M`3qntZDl-Pl^~1c8z(|nEpFsPg_y9UZWj%TAg5>YV^EnENxS3Kwhl{ z=_1^fYIz*E(`rtaTs0-lCLsc5Ea=wqIB}=7Db=Q>YvuO~uWS&6nNqZ)R(-1fj&<m9 zH706own=!s*$Pn$>ZsJ7(w#=tr(L)sNe8=7N240of8_zBZ_@A8*cfpnd6#Iuq|FlM zv|xFKOA{^oP!^u~@`~iC1?m^A${Pj7Wu`3EtCo`%Qp5zYD_y2TC&WOu0hu`EY*~`g zYQY4PQzx@FhApx#_Cs=3ph|xoXUG`$)=X~|amqMb5`n~-lT&gRJt!HG6R{wp*W`_q zP~3my=%EXz24&*@v&9NZmPz=Mh4?5D&Dz*DE&mp!l=5m7TqVCuX+>9Ml455q;}fZ@ zJ3bLJNPm-A7bU33I$Nw@pKJ+sdIg`$0V<^?$T(YwdJ|D&0e&}Q_;u-sOtKE8waTU^ z4^s)nYOB6NcSRigL(-em<ZP*O&qq!kp}eM`9K>&uV4sLR!^PQM8rbQE^}Jm`l~vuP z*P&8^4B<(W;HX)#H)rh43)ThkcK@<{>wSB*mU3y?9(YjQ2&t9xBX`|==i9rN-J9=M zZ&<1B%2apVu34(yI(zJavtst({pyBWv70g6)ifcyYnA^z@Ydcsee?7}=aP35lYLdy z<EP|7RRjI3ZrFTp!`9m}3Bu}E8~yZK_oPUusGTqVcJm{_<nYZNT6KADoVb4C#_8*) z=i5JUHLqEa3`v5og|auUHf~_AsTDfiH~N0356?@>Z=AY*YQ@!-akVYB@3?z$*|qmU zd)GTB-#R(lPmktnGOm`@&Als|_hmNkQ_`9;uC6tg;PKv=x;`~)eFBL^-Mn|XdDr{a z5A6Hb%USFgOhVz0PhvnxLUh$MhTHs0G))7ch0Qc|{7PxEyD<&DtIr_UB}turtHqE? zu%CA!mD-VaaYQLv?vMxwmq{=aVkqHv#!$5VP0B@H4OQ!<jA<xZPeV=(DeI}C^-XLP zV-<Re8hhLHd!`vv+5|~t(ez%8egLI4A;&?h=5Fe_AP)XtT?%abo$fjh!FmeRqc1K^ zawbmS%6(lOqQB4Ak?iY8X3b#ot%gNQBg|JWNsRm@vWTCoC7QUDwTaTjiA#FkZ0TW5 zI6^WhhM3$+Jwb(&<Ym$7eb>w-f>z3rBnVJNe~utp$#BVZV{XUJk`P*Zx`ua>a|o^p zOq#Z0Z@g!3Trg$qEg#q$@7tX>9M>JIu3cC)D=uHg<x`fA@^jC%Vcz@1VRMwMl?k5K z+0=@=CF5>c6N)?~tL0U<>TcGlKUle^Zk}54ZpnDJtX9_CdgkUc4;{$1RwB47Z$z(0 zA3AY2Yo&s`s_;|;YP68Rnk|ig%$9~|nlU>F0Fj)36{dm;sW8$eU5PPcPMhV^sdBY6 z&`b)wB0rbXz-vs~m(_e&UIg&f`n?)cDI@H;=CL|8RsX%CL_w1^sHthQSR@v!`=MyR zjJ->S4vkueCFo)MH)xOiOD*fX&?cm`MGgIPDN5I=DA+Wpt%8b2TfBvqAl_|YwJ8hU zSflJp>C}=STJ<ua-+o)uZ#zP7U<kF9bPO!Fk(C6CN=!61UcMk{0|b|1SXa=5DRMN8 zUsd=hTAkpU!QSfG^Eg|s;lmy{4h<mZ{E6`&9%elM@G#?ife5trafG0kN4a_9z~pic zhpJUrcx5^2+yp&4uLzUCI!uNlBpd+yEBU|_66%;3XKf;Z9B#FGS)q!mQsu57(dYX4 zWFS|i4mN=c@@TZEg%WApsodQ13iO*~3&RG?HsCii`hnq@X*Zz;Dv(hlVqp3JOMu)1 z+J4aof+G@}h(V?@4e0@Nr>cxXA1`J6qoj_*`#xyKr4+-NiYDAJSA;FIj?hFZ0s2mg zGbGE%K2SZhtz|7xL38S+>`)5KG6XMNr!CVaAU9DS8ygy#maN=D!B;7eDPS5ulHX^G zQBVja$dkD9TR2U{kn$BIs0u-@Y;pui@l8D{j5pP%Hh^{V-{E!O&00cO)-|)sQBH_$ z@6Elp_TSvUka}nOt?Bo7&+T8TJUrX~uu*V%mc9Pl?aSWY`z|-pAdA&|-f#ai|M&gN zu6{zOC$FD;{nUMT^;~NHOSfB=+}(Fg_uN~7munm6tPk9k_uQRxsavn!e08a&bJ5=U z@srJhr-{g#XYN<DEVM6nsX9Wp_r}+*f9;V_gcbq0PXEsI{pxmT23Ng<k8PHkiZ#Jf zUh$A<nzd5o`6NjL_>Ioz%7h=59X#x@{9CsPVc3X$i3MfY*N2|pf{oAL0P{kHsAE~E zwJg9;8cqS0v5-|v`~@9r6(T>7Zyzw3j<Gb34lPqIkqCjpgoB#J@H<Am&bw4Bs^VYP zGOLQu(k8h)Z5q?KHvMJwJ?b5_A-2#*M!a_xGD9QY^Ie3(7~DRP1j*iLA+JX-1cbS` z<uFpXNso_<R~1DFq<0gtOcE|8@uIa!`U;ZbtJn)Nq+IL}gAEI?qDBY|lL)&{O;y2M z)q)U$0<u*bOGqLVC5_IM5B3UCMTDp~PeURMQ9%0_4#}dVBdCi~nA8=%NeBsn=OjEM z{6eUO32O6EidF*AY>=GCNlK-42+e}vm%pycwIGy*@D5ER`J|4z^E$yXow5&5@AQfx zpHc+B%)%+RBRX+-6dLPcz`?-uDZ})rsF@Fr(t6qe^zsS+1&q2Y_70Pe;|ZulLV|Lb zg0E4)@SXK2Mw=nIZ1E(wkz$ArHcIp+*H=y;dmb?e_VhE5n)(#BgF-Tiw}I3eU5+w^ z$m6Wif;4-2+10)3s`&W6d&48a>?r?Bm*+lE&GhwYLN#R{0joWK{rOeTS5`gVTaKF! z<>!|BrhCcL^52WCrDbb2Wc=iz2gp#tc;7m;X2D&O$g0;i_=E+=p}m$nhnxuie2)oX z4jMuxj)n+-kRIA^{^WuN2!|oW1|-RmOQYJ(8`5+h0LmEbIJ$iyP36G_3~bNi;(dK$ z6~*+r!7L+%dqjjTfRAWPA@VvW%kvmkc>wL@?4A*;=66S6ifpcNE>JTB*$`90CXB?m z(*<kJ$?^hCDACQ=ga>xl`s!&A8B)KC2-yPZg2V|yt_L#BZ!Gc^;xAS7cV0-*M!_zW zrg4!fc_@2;J`3=thW9m6wGd~S*6fqO)0w9Gj!RJz^fOJ7qLJbl5BO=Fv^Gb9<}ZTz zNk5mWb2f{NEaH;<B{ZJNi{vjO1_FufQCN<gHRWQ2f<gjLHx~i|LZV8B3p5c&Q4l7= zS@E6GjI)VIg?%^otyFeoDm#`cI~QG@A33Y$F1<Oq?Ce~vtS1`c+Xok2t&kab8+f*b zOG}l3MOT2&B+Z_B5jn$V@(Ch2);%U&GN8|bE&_(Q7tBT4GK~_{O%IHLVHQQr%1ds= z>}hkVRxKDd<tu{h`Mk14OG?|i_4&LaBuhnW;U}M8=9CQ_{-G0G;VO|?tS=OX>MsgC zGS`N|eD<KiZICt`spqhL4Juk-<R>$MPg*FEY0sd|n@9zGT|f&w0k`{smzh;=JTdK{ znPr)#YecBYNf8)M#Kxo0O!K$=1O8$LP1#beb5<&o>oIbW*oBgeC?)1Q>j^UU1Up0! zt&b;?usu!5s=<#1X;}*xgKVh+PlSV@KPCvEt(nuVWkIIsS7EL&e#prZBCvcDg+O#y zB)F>Q!f)<hcKYvEv;uX{g%=wR{9r?-Vc@aFTv@gzm`lr^xCB?_-1hn6Wv6f9{5vnd z_44wz=Q177J^c-^^RAjV+vdaH?aDY?7dIaK(e_oB8zuIeN*)U4&Jt8y+4hv`){2pV z13Lk@dN~oH|1h#)XzL3L$$-#kk>p(ly+m=k__NRx=ud576j}&)Tcc0)O738k=}Mb) zV@F0mYaBFx&hx0b$&Nm4ldB+PGZm68z<AO!VvY#uA`)|%gt(XGEFg8y&xuxU)N52@ zGmeyBji*gy-J_xdc|7e9ZA=c~Np05hKsO{7r5(A5BkeFy@!e`({TJIx0R17cciuI& zH7^0TDYDaI*BG&Ld6&9r=pz<y_~K=!9r}9?8f()S*@xy`V)1)+HQ!80&Imcg5_N=T zoT=y37srmMG5uGBK56Wzey_%mdR&d`zeqi)->EU0#kBM5C1a=56#X|{GDh@8-gQUW zN(quuFQ^ZZmlPa%m)b|jdrFuDiFj;w>5{JzGkCCe=;ee$GO)BA?K2gUBZ2o*R-H+B z4f3ZM`>Xazlgd+p7bJwpE|hO2j%&{J`uS9&A@vw)wT}@AoOh+Pv@u`aBitIEwtnW* z_VrIkEmusk={2;5w-{~uqXKOw>VREn`*Uo~7K9@eR%c4$-RLnXRn)h9GxpSe^?vMt z8q<H%u=-QCZW<llia1hpN0N=(Im5UXn8VbwYPlm8w7C8=XVdYyGdHM~meR(7LCN+R zmtjS`q~_9pMQAw3NQIVnr7bEXrd?QjrMj|#_1pETi{KMIM@)wye_054QkOHHm1IcW zV%X#r?Hh!MxM7wVJ}zK0aAGPmoeJR?4H(Qs412%9WaSHT=Q#{MF9jwnux%nsex2`Q z+<sE$NIz4U_?fn9#IGv-(~Z-}8c7#u5^?Y}12x9qGNU7ulY||%Y7|C>e-l!U*$$OM z)hYav(i_GT8<L4u>Lxitt|eOuy{%sP<`6kVxoSI?Yu4s7nzQ8;hIZ(tZT!RpC+HLd z3aXR|79sWf13;SmhZNjGFo1Ib7+fZBly4wm5N6hnixaR|l0k(*Rmu+MTuH{s_<XvE z==<J-(+$w@^!73}kFT{O2}T`%t^8-Y{U|J|Kodf$11=3TrfL<`1&|}!kyw6I!|b;s z@sWhTN0z8T-$IZrg{m57dz7K&8tWQZog|`Hq@bcMR!KXV_%z0o$ls*cO$vxGm*){= z-3n9$!=n@N%aTZ{ZDwvL(~giWK5>Sfe3BXIX*+WE#MvWR$C2~LFAVmdd1)Y9a^&o} zGlORaUq-Tv=2WY8hN@uXt6Nc>2M14_K62*5p!^T0WYTOa6e`s440yBUV1tzAtB;&W zLeJQtsjOoVM*&!SvZZvs=ZGrzmPyHxE#U+!t*5M$)6u-~U!}G%NiPuz1{E6g|78D~ zErQMMC0GJ>P%)NR@{&wC9Qif6Ee&et?Jzg~QqJU&I5=BGGO&cmL4~MJDDIVEtRR@c znGRK_4^yJ7Q>Dluk;|GS`5)689zCPdOBV+x38&z2AkQ*7E+vTxQdb50<y3rWFa|uN zRx!;qjfXYK8cE~>xjBf2|4+bv5ZbiD9)87Mch6oo|3b#z^ntzZL3RB~b!Vo!^LFu4 z^_E%Zs=ac>-U993vc2toP18!vu1w9YyI)(`eJ->6+)~YX(zUM@*&G#+&aAkaGcG9d zmt7reo+?N6FWuFvp7uHGil;r}X<vBp_W6wG*y4_(OP*s7JdjY|a@};zzqo+ZgNxk< z?s*QbbqTd?D>c2Dn%-F#F&LF|JLanwyvxpwq!VwP|LQ%r?|$`0NT%o87Mq{@!Iv}5 zFMu^50kyfjVyy^y-ke-%-j%_hdzT_k;?=+X;!4N<OvnDEj)Na~o_)XtPD;zZyzJSw zR^)b6teKsq-4EJ2SK78`+P1$hF1Br7YCF8>@xf4`ws}6a5WG9ORC93Fr71f7B$Xl| z7Pk`6elQ;HRafn*tC3p(XptwCB~X6W+8t&0T`h~P+g4h4Wm<PFyLPWt2p->}z4_xO zlV+j3>CN<_yZez~aa26eM)uHcwCT^H-;XZ3nwMRuv;5PwV&wSriBIsrUI8MuzakM^ z^&`RIsD>WEQ+{Le`s962)h*{uC;dROhMyIWFXQp86<eFj9tu`Z8C0s})qm|o?9(*| z-u(2*QIp_>%+6lgy=E;c?_TZPywbTl)46-8b8p7m{_*{q_D6!Xyc?p1s@huvHwPBB zE{H4M%^B}zlz<2SbIpNwKYdccdh*_v7TtTPc?Kw<z8L#q!_!ZnbP45cZ=YCn2bh46 z)E-PgNK?7uY0Y?A7q%~XI#)fFt92XJ971XBZv-2Jge-s_n8xqZwQ>>}CU0Z8{CQ*f z(M`gi2R0w`2|sGDIDSC*ab?xX{lbqoxsPqI{CIEkv0BSdYHf)B#OFBvjO8cYb_#dw zJHE^E(_J>ie|o@i(qZ|T-E*SO{IgmU#p@g=&9<MlR-f2!``I2FrR=vM<>zJ#;y<@p zPP&Aj+bQSI9W3thp6s*y+*fsSr{(86Z4}?{e*U247p|`7`z*icvmu@%vLqZr^zY+w z1UaIag5ovMMa0(UT}Y*J@-AqvO)7;{h#!TJ%sc=oLLP>+j)zjCew$4EUfwf?_Ee$Q zzrk~(&`bX3NGObvjOg?sVI;!3IFRM8m~a2y<~KIq?*HQx@1A(S|Ibc*|HM!Gm)$R{ zxG!Yf7Z&XoID4<K$askl78@`Uz_C+OEIBv0W}1S@+*ocRyAw@eGps%YgKZ3z#x7mn zM5n9d(?~>TnWTM`$BB;3+7nTcS!3n&{umxj*A|fUF)hLq>U9sYFiQ%ckG<FTE;<__ zFMrU~`n|{-k=x!yd&8`KuKhcH;6jIQ!Ty2W{~0pb<0z11vW3ow>E|?M)0EkGQd1?L zzl=W5m}e|7wY2<psX-=ZNt@r()b%qk?<@pZa&6k0tk%s23W+sz^N1O1d}HBqlJzhY zRoGBSjtdA!^ir6B0VfC1Vq$fzBh<D6mO)4@tl}%MKt?Q7Dwct5dQ77n506TuedFpZ z&JzsNDF%KlAmocl>Zt@q+Y)8W^=c$ujA(~;^J#irb?}L)cW^-7MgV08O+<8ElB}I& z5{U4_t0ZcWN&X{GQ=lzStV)7FPJL*p{N$<)4-ABY3un!VY-h(^3re7k8DOj>B#8zF zc$Nr2#0Rb)m~UHVa%g~K)5eAHcVEfa>t~DRtaIY3)4k|yxL?`2u;Xsga^>#Xer(1B z)4#L#jluhsEs8jLWT~>}dOx%9`Te^2)Z4GFU_a^H`~JqI&O`T_4?)B|+yB5*J#U>C z7u{{Qt$*x%*LipFPhS3~FaN;$6UU!B7CTR7+$R_9C)qL>3=>JDUNrMg{C|w*=Auo_ zEN7-HT~<g#G2>2KuMvY;0FlmEbrD|Lwq8S#Z2cT~wUIe-A-L3;<r!PL<XT0#bgY1Y zj}FeM%=}DAx>#;PY2|9C^<RBmBui73YC1{lVdSjfv)5qOT}TuoYG%rEbE-ytw~(Q- z(d<aY9P00kIsQ3sWArs4jamz|2nsHrA)_Tvx@4w2)vP{6Uwvv^|3zx6ey7ILZnd8? z73qrP=CrktS+youvEq5B`mX+qvVj5eFSU(u&0(6U6pLoO2EnE!?b2q*#RRp4*7L5k zE*7jp9ld#vahrC$SFF~9ai|*GQXr2fsF{To9vjg#VY+IP%OHB*slK1~z>R`Q9UYf2 zQ=P7sE7KJ)P7n$SG1DHk9n73-uUd}&n}%KvkX1!^H|>1SaYqqz&(x$#lIFB04ik=< zTI4AeOZMS4X8EZJvGj7r=waTKt{K5@oUTpVMCY59bSbmStP`y>-n2Jao%W!2WYp#v zBh6dhrOmDf`ODMgas_($N?s=18heNt^CWktzM|$D3#l>vSFB9i(v?_a3WiW@Sug52 z)EFBV8Wmdi#UsTKb2`!`X(z-}-ZyQ$H|HUQ=e_uP-57E7d6(9U#&o0nD)NlvWx%ai zrR;yzGbZ%FHg<k}9@dt+wD4Yy+HPQ)y0O^$oNA32SKC-({quC44iSctBAz<$5^Dh$ zjVi2t<~TL7U0WF`!#LHwX;;T7l~jwzC=|fX1u<s5+E(><W&?UPp_ZioVtfjYZF+;+ zemVMod29=bFu(ZNHUI*#FVppzBg^Tb&m7rw9TVGY;$sMRi-6s*%7ER<UlVk}uP&HP z_4B$RC_k#jj%zVZ36auN4kN|w5YEfZGxdZs>G1eWgJD0dPib$f{gTfV#%uCn;E;y2 zHn;LKzyLnAZv9v8Eu3Cx-xo{S8mdm6QQsHKQqQY#y)LzFGxazhqF_4U5JT$?J=SIj zCa(p`LK!dQl%bF5S+(X7y$r10g1sy?wAqc8Do}yaTc1+;a|KFwrHDsim*_E;@)`I9 zRvxJf>RV$ksxkfdjuI8iX{&m#;ttWFxPW_Xg+%yje&C+^nM#Q5O*8ec*3X$=|Cq;g zv3;BH|7Hi66bwp`QQlfXz>0ulHMF?^(}<n(bMWYELb@(&ei^*PXO>MO#JuZoQ?|b` zwAo`&XdKHkoaR~zVo#XW7_<0Obsq7Y6XyEaT;wiM<&9*Zi?gv&oQuU7cRKnDeF?0i zE|ZN~NYyIfJZ6Fpmv`cM97cL1+2(F}U{w)~YNb&-<j^Dzsiq(ShwNQ@qMz>9lF$Tp zh#STdu>{Wf<FIL}6XrVOWUnkoU{|Fcdu0k0oTY_#hA@u(GO;Wj7{$?igDD}(!}(ZM ztq?fJCEcgFi!PXWEAF6F+eSqaZZvEx+{j_&bTgC4<Gejt15$gTU>T*;=`gOu*<P4q zVq794#_kQn28%of(VHolD(>gz=6F#vdQ{Idlc@KLyh<ai2+?`{5mG88;lM}?P2m^n zEn+ZXqhc)WB82yBM#<b1=7R8XKqe|UTYNDRjil5Q$pjRN7K#sYuGJ|CJXDBKXQ4|S z)ni8nyM1TRoTu;t0x1;^`1Sc$iUo6>Tjn78gHy;%RieNx10p_o7-s_vDP>$th*P<R z^oLTg?Ey%_-x7>HnSx50ULWN~YcM7-4^x2ynj8RxdUtUuB_)S-D^eN;Qe43u0`pa4 zaKS(?_U66E^juI)MWvo-<T4a}Mu!K6Ayt$>c}>@kL6h@?iDU{&M^#;<bV&!@3vd9| zbLbL4DYvyJMtaE0NYCj|Dm==^o~(2!jl3<vm|rcD4*b)JW@cQgE}`7QFj5AUm1@ca zc!$klG=v2hichgZdlb)HVYT%2a|Ii`+{5iO9#CSiqwUN^f)7U{71s|+W|~PLmBb_f zoE@1^4oT!`Gu2sm6);8awE~875~q!h0f(7oF*`YGXdpG@EcuTc9;RV}$OqL@3#M?O zpFACqFAbc6mvD%mAwsUd3GkP46|3u-!gQIeFrXn637cvL6b!i<m6#+tBE_X~v2y<$ zVuUo1WXeqrp5R_!gtZQy0(9|`)(56$Wll%b;nX^V3RF{Z7>^}n5?#TYMvNwrG*-#n z$tR~4IL^VH8E7^0H<iA_x)|2#32X%1j|lpgH?9D^{G&DM+!FjLKA=PZ68)dj=ZEZX znVL^G5T`yyVnA=SA;5Qn?@%<E(EJjxVc}<JFiAPnPMUr=gkhcx@;b>e41a_?d}cK> zZ!{H$kaCR0`)DN8@$b_RhX#7<=DS<<CZg)VRR<{49R-i6jmt#{7(4FxgAT;NCmlRE zlI<cKorrLorM{E&b#dh;07wLMY~QlA8^N~R$=tqWJEiWXV2?lGJ3>Bf)FSXE03G`+ zS;%r&_4PCFT(tEo^OXaaZ0A!ZPb&r{^NECE{*}&=t0gG0HL>KnP7V+AGf2?%(}qg> zA9iR!2Ln%<Atq`C*i)S0Fa@QP*O{Dl0mPFLc!I!Mk>J9G7s$Yfd5Su0@Gq*kLNP!m zEpwwQADSRKkf7B{1|te31$+so83eWJ?n3wpo`+aljpU9p3W`d2UFS8IhA@)AB9cMJ zaEn!SYgb-Wj&)#F07d2WS!n>!IIU%(MKFupz@rO0pyJ8M|97#$SU;&W3#tjg`aTh5 zilNa44y|TJCGb2&j%4<8u*PG>SBXN$(e&qZjpb%NA09T=2o$Y4Xkt^qtao!y#E~pN zt~>XlxisKEG)Ox;$fzWRRG`5oH!+cf@qmc7N||dLM*OYov*I#H=@WKV?f}%_Lx-$^ z75b5ljNY8wKCe3lgc+x;7B4I4iBKcojznJ<p=q{m)UtC4Pi6BWgJmopEDT^lw$&iY zwh~I#N>)iYxZ8>6v}zsw%9bn;iR$GC3q|)*+KD=-y9&_@ERs{0u}YBn7znmvb8!31 zSd6S&Dw9FTFQ=5@VL4!=$GiLh3oKD%>DYW^Z9k{;r1bC$4?LrcIOT*>n`8>cmnOG` zO5_muRFg74FaZg`nx(5VkLK^}X80V<T)&<abCPvn#aD_#*YE*hq%HM>=vg2r!qLj> zz7$+fBtb0X3>5P*i(CQU8N4P>!qgqEia4qC^dhMSY%FmRJVH)!%5?Q`QyN;Gv4F3i zpPIn<DBiQycM(V1Sd+<nac)1)D(;NwWjGhQOutx=Ivve=sw`3Nwh5bovQ+`E<up&- z)Bu`O<I0xF93o97$giCWPQa3cl2rc7I2<{}(carLo*0LFD&j&hD17#5g|NbMsRQOQ z$OpGV24KkT?9<%~DNYFuE(r;1Dd+E$1_I(0>XTTobLtKAVxkxr4QuVkQQoXw9gl3W zvZG|(d2l%>{}AGdqcX{Gn9UZf14wV0wbHoDBpQ+bCEb@PTTPJTYZ%axmONXcFDRKL z>|sUOgQy_b@t;&xkADvVeD4=jUF*u~LIPmXY!G*8s-(|yD6ERg?x<=flL$NHD>xI7 zge@^ngd$D~;DJv}zUiVbeI?X0{mQg=QchqgVG|~MEQNZW_P|;$4tKvKWMJ;Y{kE)i zED?!k&9aoWC1LxOlD~t#$)t+GfIE`OC>_{<7xrS%)JgIIOp-hGL`FxDRIq9u3?<7F z)MijQ$aSKCO#xtljztIdF<+L+1A#A8)c-*3Ns<gQBZP*g?{&S=_4c-R_Pn*{_VIra ze&7Gk<14#PW_F!i+I4EF?etRpz+CYI@21<A7QH*~d0$-I`}|KQ7x%unW`Xq;Q^{s+ z1Zc_W?*m2Shzuu$;L;rCjkIu?JcP(5CL^HjnRWuYIS&F6JXM&8FhW|Ox77C)z8{N{ zG6ryBUh4C)YG7KagMLWF0))5LWFV60mEv$gxoubAYHvuqLJkteo(UT5z-THKZDTL@ zu-5gk+32AZo&a~fp*TOB!#E;pHp>~9t~{(WNui54FpK5=Ynna)JLx8}Hf93?x6;6k z;mg3cVQG5nIpXZ7OI;nZUpY#sFACp9=8T_2Qk@-gC$spp@fGGWQZ-~)sZ$ty$=PWM z62^@50+zED$X58G=2$@fk7(1h_ngAqP!l?mzMcbQRBC67QT{Qt+LKR&b3@TpJd=M( z0j+O2i(uNxI@7~kKu$Z@4Quf}nKYi<DuJN{b|`Km(z132yuk0gMrOV6Bg#w*U;eig zaJx+@PINt4&&r!9^$#g%rQo+HAjL@*eoNpEyJ%vZj#J8{r<2<$_!b4PQlJ~UGTYPZ zl=i0xvS>OV7Pv{ty0jGqkpTAwK#FOZYzX8(rl6Jr!cTGo1*9mJNt`W{dOYi3M}^4& zIL=*7CFMV&L|ZZ{N#p!T?KdbZvp9W?9u+IAGh2ndAEug|rwr0kCGU3fUCLffIm@~E zY9g-X%9e;oi!;hH>t=NXv9IDe;EEZv5-x`CDLZfnON2cy5xqea!nr?x6E_n17gP-! z*Pl_0%@iSJ1_$zo6eHX&7nu62Q{7z1h_!^-D~sghKU)E&1TGs`N0je8$X8Gbx}rcV z?XbN0URr0$7Yxu=_E`gwSz2SG0C>ll|7rP8*z0(SeA2MR$6lAePwAyvLueJr_o>0} zQ?SI|S~s{^H%`v+feEsMyvZhHq}}uB7x!fK-;i&*{^_`uju0e&jhzvv;f5?ib@P1k z+h3W5SE<gG4S~#tz@ojL`KDT}uD=z%8J#`GeOT>WcKgX)Rs3dr;ibD*;c&e1XN}9% zFV4b~Rn4Nad9`8V_YS^saB(v{k}owJo;~#trZkNU{VVM|GwnO?hL_v>aC~lI$L-47 zmzFAaExLA*t&MJ=bHAeMR^Vpf?WVhyrIsB_6+5pV{)i_n)W6g8R?||&mf6Gb4gnVw z)xrk<qP^~;<^yE73U?Co)|Fa+rq;i>c|YuGeI<+b#)q)0Y+tS3KwbEDeD>I?tMbOc z^?~^vD-AuFhMr|t0EVV0&4QomhS?H2e%i4xcze%M<&IhVnsw6T=y*`yv{Ju0Q@{E4 zv8DPQv(M96)&n;W-0q$`utdf}4;nVEH0;VW?3(R={nP_r`#U9XmE3J#^zDMtXiM3j zPSSC|k$DkKde%e-3-^^Rx;9`~JS~}yz05YWE#qlh=wJ5uF&4h|mFBIP=B;?J>VXMz z<!Wu)YE|88Z8QGX+=6f0W5Mo25sh%N;otd2|NHH;r}19T_SxqbYr8ToDx`MjTxzAJ zGgH&KQnMpdvttzovzDUTvIi)rp$i4U8Br}+&Q><T5m9Z~>~R?I);G<beE6(c@HXK= zZR5R~?gcCL<sZ4`tgG!^i=LLhbd&EecseS(SvH^gz|;Ph?n><({NW$G^waR-`4^v9 zaC8!F@cQO<(3xMQ7u1~^_E$@-ahG|^);vO;Z*_y8{?NU;mWOqeT2HNNpqNmGl3Ilg z9rqef+^${mAItcUE%{Gi(tinCLwC)MuV4TALfbue$7)^EToH_YOMR>LEy`pay?giv zU5n>lT&&-`RR7XkG0tX|R&guuWw<VLRdU<rh2zVv9?eBb_wDfF_Wotpk=4p(L-SkM zY}Bkds8uD@>bjQImaWw4&uRXXR-vJJ{_09|Z>G6-rFna%dHdbdOU=(M)gPX9uR1GM zoDCUg!~D^O<L{h#>&)HYvh&EA`ES+_=CPn_+0~}>V(#+7_GK4NRU3Oy`M2)D8qBk6 zXWbt^Ib>rFSgbJWuG=tsa@E%XIEEQF4C+ej?z`|;!@}D8F7JI;<C@#<DS0gHba=5+ z>zij!KC%{<Ry=7G${Xglz8PKiY=$NLt&_ih@|WJd@3$;__bIpR=jO>3Z%4-4al7W8 zcgshBNVBDC2N`T{n1A8h&p&n+RaM+HJt-3^8s`ta?OF~TSZqGHT>k8RZzDawX}XU} z4!!MM?m4*F{Oof1p&y7p8T;YbeQ(oZ^WOKjE_wHBS>AhPvH6+h@_qNcFlgWXe)*F3 znK{z~^3q2K2>`tFmW8di`~NgdrtAMI{?ivS2hPBULrvFX!CX@|dkm0X>ZK`o{S2a& z-rqa?>Dpxzdj09caoC}M@wEhta8C<2UT=YYIzYLyex<VeUS;>Hw{gYWneleQqt2?g zZndWQ_uVj5FZF%;WS`(QWZrbIa??{Yf085>{f`bj*E3Kl{A^FvV59KwH&$IJ5&lEv zuJc`%zi{+>&$n5YHWZ!TEG)IzkhIigq4?&&V4Y>TvFk#y<%1#<g(Y1Vc3M8zVM54U zIKVCCL6j|%C4x+~$S+W^odPEXNeX-v{1pXV6ud(LSyeGlMVtU)l*czIjnO`gGMcB` z-=%;^A!e1$$&??_Ep2mhKLyWFu$O{CH5f-E`A-ngHw*USn*~=)LYWsIE%3HpJH1-b zbnSU8=CX=aH{qrgPiKa#^UGJu_+s(Go6u@a12(|Nbq8z*9zAQWw0R$I>acY^8Zd3Z z2M-S50|$>>W(4*UTkoUV8e7@g4q?-__jf+FOqguGM{$eE_98xsP-5HksJ7DfylHJ4 zRY$1M3p-LA16cLc5^~3%rwS=g8d5e}E$<5TB8>mqMF)E5dYne^O|YB=KRE=8OR2b^ z=fIp#CMX{`&_AJ2!9Jnj5b482CHQ~>K2O9xpx~MnMojpKf_<oT7HsBF8Q4o_wvw?u zI!kdDG+d|wBn4y9&yy7~WbUfYD9>LoWrk{!<a?|bMWT|EJI7Nnm@XzACQZojutM=e z#RON(P@>0EaBjxx)t-@9oxXwr2^sNe!^4z-8zyNXNi+QOz>!9Rc;d(iI5&+qQZ!FY zyQ5TOC=9PE;!x<1*t_)cDPpSeM1=fW>B=CaDZ|5;r78AREAqWIJRBxn0ZD!gx1b`E z%55k}8R$;wN|>hvL2mOb#9AvnJWrtVNwk7*2Z+>D$R<@Dm9+E_uq4F3VZ6o#CupKB z8m3{P7e+{-&pydOqK`hZ3}=c)rtP5`C*{z1ke_a2>cfd~xY`%Fpq_+A`p`i$&ptN5 zii0`<Um8=AxHeB-2HdLtoxKFf%2kSALKBaFh`@Meq>$MYj4R1_Q!`TJrgtOG2+V7^ zZvdDp3PFG(znFJni*^Se#zCugSB5*qzy~H#Zrl+I!7dm~3c+IS&VxJRsMwW;>8Zh2 zGt4w~U(Hk8tBv2u(GVfHtX+kKtV4qWB}x#Gbs1+eYgcAInROaqAnP>DKfa)+d>l;y z^lZiYRpGDVjMEM@f!WmS4t3=Sr43V{^HG=SHcG+&px}Q}@V_Yd-xR=R51tt*uuuSL zlOUTY7{OEK&!`|r!Z9+90(UWISl5IGG{3rkgegk?J!AtrvPEz-tk~N!_BIgq>K{&D zRkFWwHG-7-hc%^iAWguju{w%133c#n`+DhWT`PXd)St#K?&h}E#~wCpq}y8XD*U%O zK);QvtvhDnsJ5Bm-<(rTC1@DI(Bpda*a)F;`=ddcDw~t1ag0TSD!ip!Fox5hOHBjR z6?8v~RH`%YLMk!&c^6U(9})57WyCG=s@sU+AySR&QF(&XRtm(!kgTA`Px$ztb;~a1 zc-A~U%di)L!ddRViAk1${WJ^<Oa%!*zVx>szR}7eYz0OgmMRfArYE$+KO{(4j?3wQ z+^|bPx1~ZMq(lsi8Sv_`%)r=0aI1kazNEw?J~W6~J7nh!6MxaS`I?x(yE(#8@;=So zS5eQocbavuZ_M%^XaP_$SOD-lQ#~gxH*Q~c?jYV4)Fo(z?`?Qv!|H|>&YrK<H+?Vg zMnL^ho;Lbc8oM)%-K*dteLFI~9jkO4v@g@vw^lBc)<40C*)n{%iFi!nM`pq4fREC? z-lc&unn3`}K>o*wJndu_z{2<ra?*uV4aM>lCA9$ftG3Dv#54q}zg1`%h$d$FS`0tW z1}8IEbZ-4UHFigdkgGz!b^0$f_&B116G#gfR<Z9=8aFc>U`k9}8s);?!)FEtjvO8| zsD1|5y#NT*KopxQq{hsAj$6SoTNBbxG1)J6SbXpYAEeM)gYTfiAW))LNO^M{XdPl= zoJQwl3WISd6i=M(BVUI)l(Ri`aDbh>A_rWoRq`%$nq&MB#eRzdBF3|osb~^k;|tP{ zD#7Be+F{x!=L0b#!lzpcka__Px>?KqieUE`Du5u~0~ovEzV0SrOjoA1>vsDe```87 z9bDOYEVJ|2vi<l2ax#9sZ^hY|aW*a#--G|J&dmgg?eN-m!*$*Dtul^)u}HOx&<uk{ zLbr5E^8aT~;eh`F$eW$!D3G4gP&(WNIdw<FI60+^08Ty?+&bvo=U9O?1Lw&FeTV;c zcj5Fx+Y&3gzy?ydK6XN;K;PgpiHNm=n@*uE2RTWQoOdC$HZKXcNUblJ+PFSdw7pr3 z{3JWgyV&_0I(ylY_W-xLdlv9K#nVT%)e7AKcj27tQ=R0)#_y{c@V&teF>}!|?LVLI zVEw!i`xrf}TXyW&K7AO99VmH~ZIoCSwk(-lsjBLweUXT6{yjiqNk|o>(fk2;Xwzvy z!o{2*WSgVDSN7w9zg!mSIa3126w_a1ygbb{S1vH*!U{`K+7JbKC5}*9F@RZh@#f_2 z>iDNi)f+-=O!l7Z=#5DSrZ*HsLaNvIhlGFd<!Qn{^p(V?_;ufny|l1j_on$O&9A!` zUfu7xTNVaaI(BC|cK_+YOvlOl74@s03y|O{p5ahSO~b9o%?Nx<Kt9eR9Iq`pTWC|> z^v0&|^}f*yX|eI<fxAWb8t)*l@s0FXz*{^O3mH2k1Giqe`3iRbmAXxtx=jz=cndgI zaUx%iJ0=N-hXLk`exZHIP2Q5%ld#%;?!!3!feAz`W`$om37Zza1x#x^H*Qc+<5V2H zBN7(Il_cMm4jwm#`hJV&1u#OgQ}=pUh-@Wwb|L8nIbPG9bE%{@&I#%)8o6=P+9%q8 zO&dO^uA)LEPMPsp=3@EpqgTvkU|{<F3vtftV_WB|j`mJ$_O!$<N~D`4SF5xrNmc+| zXtEPFocP)jo)E*Qe4~1u!~p6-DCV)}L(dD^00zr{cl9v1#2&?2ZZccWwr5hNs~tEx z{U_^sqtoV0hC%&MtO3s}+T;HpI^!>al5zqxlKcrx%{M8Sp}+}%&N>Z!%-Xd9uu_a8 zFE8?{{?M6<4_~=uUg+_~T>@&K?;2-TspO|nJ+P3`o#9qlu?%LB`D2jmKs#m2Wi1Ok zGWOl?gPGh9sko;GzRh1;7+iL5A}StVO?iC)s;d=u^F4PngyclmuURcs?GPMyZhj~7 zR^(x^rE1F)I5g>e;<m#9rI&e;S*+{6EiO5?-<`-f_Zi<~Isck+LL%+rA6S7y`KQWa zNzlS&v0W5<hXP{F8FJ<#*Gami5rEeqK0IM58Vv^hCb=5p%)S!*EFUK}4HUdi=$Ceh zk4etzgq*crD61kdYumNcUqr$RQD{Xq{Xq_jI9#{aHsV9ih&=Z9+IBv=XsW<RWxGmk zHIJHFZC$@PZfb(4RY1T+rPPQpTBluv?1*H1{D%l~_;t<7#^5r-3hNnk?z3%m$Z@QS zcF1XiXl6`EnE?S=ASi`gDuR!&5Lp5Dz#4*t_sYCyerxC&Xjw*69HWou`S3YG8P3I_ z1!u%XTo<1n)|h7|I)%Uv%nO-LLLM4{u_Iv}P4Wnwguf8E2A5M|$XJQnCPDxQc?cn4 zb#sSZI6uQ!Y5ukGZdMB1MT6C*t(Y}Tu}nt0fag#S#C<qr!@h9<450~ZpVmHAu*+@7 zP>OCacIYB}ec>AijDP_iWG!Px`#2tg4)QM%5=FzC2fKVUih9Psj}=mV$SWqSFibOk z>W)r55Mx*Hi+30SMRJLX`4>QyjvCHoX~f>sdKvIt;Fh5@zRE!{-V20Dd~w!r*hw*U z#)mh#-*yZ(<L&TeMLI*oj}RTX8X}LneSP|gq5}sGFp|%=U#0vYYvvYJ7|pIuqBvnk zbSaUz6qN!v#?ssA*BVYQ%gURuu46k^S10UjV6NGzX8bi%*DPb1FoqExIl3uMoHTdV z!B+VoZt;j#Q`UTWQup9d&{s#LzM*JsrH`u!y9i^xf<k~WyM+4Ig|_c*$XKhd9i8o; zYljz(d(N%jIiPymxP5V{a_hDJ)#B2*ntR2y_ua4>$hi03hI5U*cP}EgXy5x0=(P5X zd(Z8`MfaY&=MY=8?^#d#pjys7l5{f{9e~zRBp5TqQP4(^cNx6TR3k?L!5*j%1^LMM zG!FT^s28X-=85GXn~wq5l49?`w?t^I@~`i*(`j-f3Cn)A>d3T=eI}C2(G^X^C#Elb zVtR!!4Zr^1xcruE8NLF{OJfu?vqOTPJ$%)dUWbdH9q0m^Bcn))yJFdlN9Sl7NK=Ms zfOnMo`SyjPC1>Zgeh`*+*EhfZ+h3ncE*CdI`(OH2>Fw~cZyRJpbBE?G&Q8x-F-_N= zU(cXxL;M=br7vdS=y|~pzO%1mD8ogct71;l3k<tXNWR`-{DMXyX0=`Us>YN>J+2B- z&$fQDJR(d8$cKkVEO8w!`G_-DMiAT3kr7hf9F?!3_2ffp8oyl2NIavQMxeS*BHAHm zTt_Jf1tN{>VMM@&;EU*`tI+kqR%Fl3JqsOkuqf%8?f)fIityf6a<k++uC-#2@gIY7 zaFyS9=K3@Ew27_smv$FE(Pk_CBuP?%*EV(uw<`}={<Z0V#s4CG>V0Gan*%=eF4Kr{ zmxjgov=&(%%6~yg?^5tzDez*DnPnfh31ckUO?vPP3hWfn_9Qb_jy6kfK*neU5`{7x zkS)<qobfNwl+z=UA#)ozqN?O73aTj}12b-Z#_Y}N>6Y1`5mTPEkHfN%%tpD@T!nfY zNJg#(VmKv|WFLNz-=f!=DY#F84?)(=B*gj*vM=CdOIRwSa+$fElE7x1fAZeNawzDJ z8Qf({l_bT|u!D-{1u+XW{<*{&mWgyOIG_|BWh;$Tip-iW%S%<zI(J`bXD<LPb5CQN zsO7ZUWMa5DR_&phiYIYSRhC9zTnNK6!U^oVi0r!;**0xR=oBmM!^wb>AG$-HJ!|7b zb&*PQz$Wh$003k$Bm0PB&ld5McwB3~g{2%hbnMWHfvoe$OJ^>e>VNLknZwV^-^LTJ zrD8~)Ff@bXJbn5n_I+HUa6sOREcg?WjR*m#Cew$)#{VL?ekGLsN^ty2DE*aC@+-mp zq0srEu=zJuhspdK0l{Mme&a2pTQ&G=iv4wyV5<L6==e}*`%q~8P}ugNu=_)y1uuUn zZ23^w@S(61xBpr2BOT$I)n+<s`jxc;-$~@=O^a49c=3|b8+F&~RvdL1N8Poe2Sqj4 zF0B;RWQuC$?Mp>1*DQbOEdSj-*X&R19j4N`7oQ0DSvzMEs_N+@Z3`VMt=luL+ZQW$ zEDD|{MK8NdwewB4o1O?1dvdk*lG#+YSl|6bpva>^Tb*g|qdjhu=W)B;RQmDSOD%%E m8jBY#`_I-RG$=<+pCoC8{BWPA|Df=rgU%zRmVf6mA^bmLEa|!c diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-312.pyc deleted file mode 100644 index a3df3432b0d747c87026561aefe338a650fc0174..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13515 zcmcIqYiu0Xb)MM=xup0IA9_#{rIGdGMieQ_mMl?kQPjhhRthQEF>7Es+!=CL+TGdQ znI*+F?J9`dNQl#@1qu^294P%$sX_s_ztUf6fAmiS6jW-%?7{(z^Z^*?54qgLfq?@3 z&bc$gS!yYp0XpCu-aYp*=bpzs=bn3i(cIjq;7R@D&2*QhDF04Byr<4BEWQy|l=l=v zG1RP*Q%6-*F+xT-8_I=8BdQWo&MQXb9mR;6(MM=W&uATE>wv8{>wRpDu`ys9%sL<2 zz}QA$*O(1Hwvn+-z%~cku3>Bou&n`X6Jyr`+ZMn!GqxSrjsUjBY#D9knoiWLGaLOc zu4U|cU^fJ?ZH(OrY*%2EcE)Z3c5?vR!PqUpcAFg-BjR$Slkr=D-)46B-&@C64cP7G zI?UW_y`J&U0ly=_j}4673GA)_b|YhV1G~p0`n)kVF}?@*xVg#y;%3Hv3)sB@>=wrM z0=q9Tmu|-P0o!lJ{1LV?c0aJsn_GSCHpU(R_JsgeW9*B-9t>c&GxiX$F9opAG4?R9 zM*?5l!Po&{j|Q+i8G8)a<7SK5<<EH+<4*v8GBA(bj6DVHX|v9Z_^rc?KLh+=6@Cxn z&jLRb7^R1?=YTzL#?3AMDBoiI1>i4&5>Na0GWKO)UkQxS%h*f6UJhXQ%_QPiJ|{(q ztL0XG+_ths$4q8&1xq-es}kRGF`u$>g{<kA!=`Seq+Ur#P3T!%3-F#|Dx<2QjD`$# zG&~cEhszBYu3fu2B!neOJI?5~shPJ@X2Ho=d97%hhBiK<Iq8h8<t(F^HTx0|Bjs2! znb&h>GFfg+CM6!_reyNFMLp}*)F+dMl}aWbDvR{>uZsO?D`)oSbjP0RKWn9mIWzCr z{f?P6CxxEdXFHkHO;hYMtm%B#(hXDePnr3t{%mHvzcAyZt^5mp&mZWwGmg2hpr>x? zlcwEY$Q1gMXl7WVzbLY3`$E4@zTH=t5%u^sgBS`nfp?UDi|qR>5)&<6)vDOFhS>F* zF7lcDWNAAyY+C-R%`QRT6wL(qgRN9*^8lfIs`mO+QGIQywxFh3h(_ogWi(=h0i!dK zc(mMb)v~fup#94PI$;UTBvIR1N@wX#XCU0XrfUUs>Pv+&y!X)hPQMo~0KBKns<TSc zt5ckiSG*DRN=yG|(fWPWP-jE$s~?0PxouTtMu~?KrO<!|y^GKnSu~_inS91cCJAku z*$J@@W0mW3rfrj)i3&~A1oLh^ew5n%Ire#dHvn&M1-Pv&bZ)#8dAH%ySlcJDO^;)n z=3e~kYk&LF{Pv?C$BwZSQl3$uIUJNbPwI?$DmMtb>@n1d&<IhFzr;he+>lJBvbt?U z!BxSZrXeMXWEH|RiYZt~sWV8ahuw^}HVOH*@>y%gkKexg_T21z>)!d;UM4T`uue3f zR*>@*YX~$Eps9;)0?YKNgKz{o@!G^D(()t!6A49+FUCUAUa5Q3B8As~JT@$T1GQ=z zHosdmZAWU>;ToFd&(y|>p*vbypE5P@$Vz2&2P?_-;Y)U3%5_0Z1E~(H*eMji`q1iB zY&PsIsiayD)dch>jCFun!Q6^RSU9XtVh27VHUij00~9K#QR{-!^OcIa*d#3|RmXZL zRV<)X_dD-Te;n(7TBB%qp4MR$R@5lcG~bHQ(0vSLB22m_o&zEt67+RRItj^MQZv?s z(uQSpdn&ev8dDEn#qLM$8-JDlY5K#+{I-Mhtq1302c@<NQvBsAr4fz*y}nAFA(h%s zDs@Pz6xF8i`j4+tE4Z83$jBwBLPv)63^|zTw3*j{)l#N#G835;ltr7+Gg(`sl_{^$ ziaVmEtbE=~kzeXd)Lc||g9bsM7w@9C)DQZLDpggH>M?(jIQ;_%D(D;UC=)7{*4Sv| zj&e&Kjl%fD<;JVRx-}!o?+udgq|E?<nqz5LQK_w*NcF->>Op>K@dUu1tM4g}$F#t* zI;;E$){jLuG#Q!=|E2mjb$_C$(n3hJ_?dB)BvOvr#R3-gIMA&3<rYh1CNp_Gn*`bt z@u;)|(*AOkQRRp(CT&(Po9vM6;dWq&?O2+tZw?31&fX62yW7gAvF3Mg%<X&}>v^!@ z!(H>SlRw+}ud$O0TX)=vd>q@%+VPBKtlaD_peZw(#d5icMkY3#k|gj<2ppga(xu<g zl6L4z=-<vK3V_r<YEmUskCiKhJ8RCGDa$aW437q7s23dz;YlW?8Po*+T^mO{WN3(l z2Cck<cxB(UnS!gED<~n6D+mnW^_6hQS3;^<6}`<6gJY#UkA5OZv5km|-1nqb%$v6g zunth0)(ZtQk9aL(>=Say?iZ$Au<|ydx0;qiVig2V;q}9j3qH|QRYkOKIiye3c4JT| zqK-xoTSm*xm-So2rX!@u=uHq#kbbh7oPH~lE9SI(F*j}s&6>~zI%G^3zs;ejX_!V| zV<V~OKtV^S$f3%BcCFgvD4LLs9Fh_J9MA^XM-Pm>?FNT^ON$6K=%bYdqIK65@?T@Y z57{7um@6<8ea>YkxiaB?Oi~nxIfwk{S(v(Q<z>%e9szB3hDKxKlk-VbIYU3*y2ebM z4F{c}jHL`L1@B{T{Xz7t$k#_;aHsx$hGVZtqO=VX@i|On6MHp^0_8MIO<K>O3=I+Z zf2GE;>eb1aus4ui)m=^2fl%q1NZX}r^_G&LZ(U!d2L5XD8amnJr{G-IZ@Cls(VAah zc;%m8oo~N(r~W@;ou9<IAIG}qjQeLF?05i2`;xSHTC5*NSB{UCg+?zCWdttcwJD5x zNBJUDAB|PoqtU~1NUC0ieur4U!_e=w7cAQuOzZhc(~v95$)JA2cbT^`*x5krq;J}! z>DZd?>5)d^xK7Z_Oy;#T#;OjFe2usS0+C^XGbjNE+2gl-ZiKzk(tnD+t7Xr+<Qc6S zg~zYK$_#Q<7S@YpbObbFmmLo;iN0L#ny2ScmUQ4GC|Fqsx|XxbSA%i%^VFdI_&<an zw-4T_|8%+hKZ?Dyuwg5dq={vgh^wE|)WuN(%Vd6>a0F<-Vp9-JzT;vg5{_<@5~s=( zUjO+zx6yVjlQXTNGvXjRk)nP+DCz>@ToN-xp2<(?*^Hst)KrE7j_h1}^*sY31c5YO zfAu};uf9~ZDq5RdS|yo350a^Ch{kW4j^<J%S0l|zrHaCKSJ^?`NwHJmZ9gwpP={<5 zTSio9;}+J60W2K@W0Y$Me#_>?^Vo9qi7~LnaQnE+ZB;kzSPkrnu|6KIHq*`$(+K2= zX`Wd}qOm7UO0+==nW|UCxV6hEFP(cP^Ca64z-F@K98zXxigdux9ay!navIoeiYZgn zp2Ins1A$vK2QOf~>I<H#Rz-hD4K|ieee)@#Tvv!Wa0L4-;wdR02;9c&6aTVLJXNiV z`1XW3?b44JU+V6KAnnsK@*>i(4b{i989NOQ=gsLr=-sDXw~>U(&S*n}R}zWgp>x+q zhR&`K_q+@m1%W>f&SBV}168eR4lP5uf-^&Lgrt8kNWaXnXrhSV3@ZtRIv&Fjo3V-H zEu`55HqG>Av(_|1pW3=Z9zhUz7w@8{JC}XZscKcEw+?141iLHJ?#4bEqF@v0BX=_T z1b$(+F9R;bp0+k_!keUcuoY;(LbMb3Gb)f@mi9`hRngpj$-<fhZFyDC7Ts0(Sdir) z44gzDxfCf+3k&Ma0gtXtW{^CjyaX2QLeW`)-ft6y1m^Jis(#MrHC5H7n-Vt5!eh?X z&4lBTvQPb0UDz)5$Ai=(T1Zk*pdn1KGr3Gw7w*0oCV;>bxmx1<68WhRzUMs=6vBAj z^c{i+m4k=S*9H%vrGy<P{rpj7`mW;~_U1BjU?K)I4iPxhN)s-}vaVPVIBWnyTqi(V zg&LW>&7KUGxZp<yKcy}^01zOy?|IPkxcvY{27XrW{)UfY@y|ADhzgozR8TV<7@^M- z_z8{Yg#+goBa!HKsd-dcB|&e>-#j(27GfAlrOljqJ%2NgBzEaQP?q|VnAl1XCtw{Y z7AT7kUfSHVuS$R<JQg7NF-jBE65-M=00{$R3TH!)+)xI|0?OFZ2>eLlZBAH@w)9=n z9r<k%VnpmkQ}G%BmSml*d+27-UZ)C@qs$tRhAm4PbS>wCFUv=0Z0`g>>R_S0|HIvn z+Ygg4n?GvVdOz|w*7sl<A>L<lA0VaDPhVP|7+~TEJfH#n#K5sHA<gb53V`fPO{zrd zM|d=W<wi*fbT@t8JnU|k<r04OI;8-xuIaQ|J9;LM1&;%F1oxC$f#aur9y2vd5jCgN zt9Lx5jgEz-UC+<>edLDRF75Vf-lTxBXeTK>@z(NoiFnPFaJl*XP-1BK;$U)Uc=*b2 zxn<<)(BQ>$-tXms@f(=BAn<p1{iI&vv(CQTmlxI@|6W4!j#|{_-3m#)))5l{WX75C z4o3D<0leVc9x_v4SdKy?+ieG?AwSLmGpF?I+Fou9ga`tEkJtBd1OCcORjVR&-AHl# z2J$4QvrYmhSRT1&g5-Km*^7dB33eSuFh!ZmxFNqbayqes>mcF;fuG~`UB@MV0#voC z39P?}G!A%;b3V?-do$<{&LF4XboU~~JfctJR3QqPMRncy3gntZE`fgvl6%A_m#S7p zZrjL=?U*@=_B~3gRKw<K-i@%EF4}Gu3m$IV)Yw_qR*gv_mB25kpcCNpHA1b5#0?%t zuV!_J^wcBtVvwaIc-X#n?b1j;=c=vzL}s!mIQ$^e^H^8)DR@Q%rY5Bf5h1w)uE6XJ z(M;emUSBsxd}dSCs%FwQlDK$TDy27vBf&X%YEi8U91BrAirz~zSb^r7L^FX;sIZ3s zbDdDDqxGzbtb<|ZQ~sKf;_Y6LU^q$Lf%+62;&2X!!W8_=qi^t6o;=G~&ND`fPp);D zoin^|Af5QE&18<|LEu+-7n=YmM-;|pveDm6QuV54*zWlec-+BsF@MuEN=H2$b}goX zV=~tAl&mGkVF~032@R(LPXd*~Ni9{|D+r_jvIK$uqQVOVSRjO26}cPFSjG%Uz2G<n zoTCroIstSWx?K7J%Y~{nJ8c!SxDsIcnbkC!_od+X@(yQHy$OzK+00Fod-lk4z`Qn5 zAaRP!I4&^IrWwfuB$J8)n;)TL6UXz6vvZ~CCtbeu#GfTQK~pC1-&CM%fMfunsu<vh zbUmn9`LstKr1P0i9nO3rB8ujvf8m*Ulhd+heiB&_!!qss9tWC9i4i{ok6kPu7F^<1 zGSv&e!?|eM^?6z8An&R#aEy@(@CFb{;b_Pw6(uhz@E99I*zIKW?3ipeWg*#=0>?Pd zh)u#I)*tqA*k>XxaZr_m10bHdW{?VFQr<&h9Q|JG1K{H*ucrDqYK=UOTG||V$4_Ay zHWH(Phpy#%m(Fs`W6g?jBNpM{1r|SQ{9lY|)1fw^MmliH&l!(ny$@ddF#U1tBn!Ig zD4(XmQ#p(R2h24O^J^cxPH=LS5BW>|)%5i2%HST1gF^{oVy}juyifP$6~{Sk5uX%O z1hxPK&S~j-gD?vMmjRxhrmVopp1;v)J+;uZ_Q#j*UZQ`O?_Pcq4WCsTzfi(!8=olQ zhDM(C!}^sI;J1i|{REcB&MYAUzaa`c0C1@GMJS47c#9f6rT(@q5|!h#)~C?Ge|}H% zDYsvg>Ci#4ZfOyvy)I6gyk|`uH@h|uKD#GYwN<qQy1q_TZ`Aw5`-MktX;!^KIg@42 zl4|qTi8#d%-%F_TetBwNFV+4{;N@;9g3C<V@>;n#K;$_D42Z+ZF>f;EI$7u4O87(S zdYb?p@_V-uf`_o1pXQ!#8;ztiFQTKgjgMNi`#6o=ztGf4YV*S@bKm)-`_SX=LzQr- zq47zb(zPA;7n<FZmj6fF+5a@nJ(Gxz<lMDgg6(I?oXB{X32Z^jj7N|*muj;?+D=>0 zc21MgymI#y*Mwj@Lr>X`n8A=w*#?V|Ks}AO76m?VK3IuFqusx4@ePBTR2c@E^Rv={ zbF<5i3s^Z!QR<<C#59-bhQL&Y&)?wYDMgjGrm^7j@xcoI{`>frAh40h^zwcO{GgGl zs>t*0_Bqt7?Dhhe9NPKdzdD!kJmW6wd0fX5?Dsg}brT7khN3d>e`U^~b}AzQBFJuM zaXIWJ9I*%)%3H`x-3}X}w?g@-5q>&L^{f;Jk{Xdjxq%W+S=y(SPB5XIY)K=6LPAxN z)9b}9*klVw#*E~D2m1Rdy+%bF<<ekv|EF^_$dmYE;RYS|Ts8>OUVAZ5@kazGk0M3^ zYMS@ctoF@&2MPEzI>NkRy-n@+{@|Buw1stDcg`)WX}fb`Vg0Lj&!eL4Rdu0#;}>DI zt?NlxY3{7Vl!g{>G5B!9$FU=9>!M~hg-Il^mA>X{{n0ODP0@iT3V`fPO{&xi&G}hL z>(^J!%uhI#j-NB#(<N^|YFkB-f@gKo!YWRt-OWh>muK8d009})-U{9YC4#^KnuKQ) z=Y5-?sw(1t51WwIOF2rc=rS{uaPxaOC&%F*_J>Jn)=7jt)T&oQpsV530tp4|!m)?J zu^U|s%370s)9#&7J|v{8u+>+D!XTO6#WMiXU~Z{)2si8LUS$aPDnlQH-wH3Ka-TAi z@FQ15eDWVol<U2`WLqy%k3=J4LOQCV+n7>ee~6FC2u>dGm+K940@)I~-0by8Qjb6m zFp4h70ao1{+Wa)Le62o8BHD#c(CUSKFaC1h>7O+`-go*RkI%P%+f4^bH}-X!%d`?W zOe6Z5`yIL<1kDAInoCWpgzvIt#rx3fuIGh0oyi-tk*8gcl=cz#3JDHCQdW@;LBKw2 zP-PB~^IW*+LTMM?z0m*=^*C*+YTmi|Q_v*{oB~0Coiw2m@jkjkI#I;t2zN*YX+n9c zck8*&&fMzDSyR~4(z1nnsI>dyh^@SyFxb8&tK-*lgMTeW-ngxI69n=mGDU(yBe0u5 zoWKDB2LZ~h*w45(WSA9vn}Uzm`P7<EVfh%7j|2HUjZdcdh^O4RbT-3hD4d9wDdsom z6JrEOK%95tj1DJ7ILpABa^BwZ7EiE~{yrL)TTZjdc_)Q(t>uM)6@$6kOr!E{xD}<Z zV#j2{;Dq=K{3JE7e+~E~tg7m-l->WST&pyO)rNZw6$Sq)O;q0FmK)Sw!sB0MV}p9= z-VrJvs%%7?J2P&ZsJioBS4F|U%3A6h4~%n>%THRA4()bprKwdteD6|4!N1DRI(6H< z*@}XHm3DNS^FCjXA@CXet8~(Ev-jVS1JdAgy-S17clAEVEd9LqdY~M@&uzNz)zquo z=ezdO*xM_e^=kM0hB*D`u5?D!6ZbAw6#T2S&_{1BjWu^AP)-KQt%0%?D6etLbs!gI z{F4*xe$W`GnQ?1c)y8|T&ufQ>D~*+%Eo$Rj*Zj_bih@$*Iidx0;a{bxO&yrqIv)pb cP^$D0H%8s6D5|<h1OqIBxr@J{F02Fp2ThJLo&W#< diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-312.pyc deleted file mode 100644 index cf9b8cfe2b88a88c7b0fbb07ab192a639f071b45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10435 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-312.pyc deleted file mode 100644 index 38eeb5614fa6d46903b8252b151a49a24f16863e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4040 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-312.pyc deleted file mode 100644 index 8a7e87951a66a561ff5ea3018a985128f69f9217..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20652 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 OvCP^e<~+of=KlkPhO2J? diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-312.pyc deleted file mode 100644 index 6bcc5c14c60f717b0d8cfd9a63904198f73e77bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7316 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 OPMzF7u4p5Yp#KI}l>Jfw diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-312.pyc deleted file mode 100644 index 3fc1a823e54571e15d63c2248998bd845887819e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33990 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/_collections.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/_collections.py deleted file mode 100644 index da9857e..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/_collections.py +++ /dev/null @@ -1,337 +0,0 @@ -from __future__ import absolute_import - -try: - from collections.abc import Mapping, MutableMapping -except ImportError: - from collections import Mapping, MutableMapping -try: - from threading import RLock -except ImportError: # Platform-specific: No threads available - - class RLock: - def __enter__(self): - pass - - def __exit__(self, exc_type, exc_value, traceback): - pass - - -from collections import OrderedDict - -from .exceptions import InvalidHeader -from .packages import six -from .packages.six import iterkeys, itervalues - -__all__ = ["RecentlyUsedContainer", "HTTPHeaderDict"] - - -_Null = object() - - -class RecentlyUsedContainer(MutableMapping): - """ - Provides a thread-safe dict-like container which maintains up to - ``maxsize`` keys while throwing away the least-recently-used keys beyond - ``maxsize``. - - :param maxsize: - Maximum number of recent elements to retain. - - :param dispose_func: - Every time an item is evicted from the container, - ``dispose_func(value)`` is called. Callback which will get called - """ - - ContainerCls = OrderedDict - - def __init__(self, maxsize=10, dispose_func=None): - self._maxsize = maxsize - self.dispose_func = dispose_func - - self._container = self.ContainerCls() - self.lock = RLock() - - def __getitem__(self, key): - # Re-insert the item, moving it to the end of the eviction line. - with self.lock: - item = self._container.pop(key) - self._container[key] = item - return item - - def __setitem__(self, key, value): - evicted_value = _Null - with self.lock: - # Possibly evict the existing value of 'key' - evicted_value = self._container.get(key, _Null) - self._container[key] = value - - # If we didn't evict an existing value, we might have to evict the - # least recently used item from the beginning of the container. - if len(self._container) > self._maxsize: - _key, evicted_value = self._container.popitem(last=False) - - if self.dispose_func and evicted_value is not _Null: - self.dispose_func(evicted_value) - - def __delitem__(self, key): - with self.lock: - value = self._container.pop(key) - - if self.dispose_func: - self.dispose_func(value) - - def __len__(self): - with self.lock: - return len(self._container) - - def __iter__(self): - raise NotImplementedError( - "Iteration over this class is unlikely to be threadsafe." - ) - - def clear(self): - with self.lock: - # Copy pointers to all values, then wipe the mapping - values = list(itervalues(self._container)) - self._container.clear() - - if self.dispose_func: - for value in values: - self.dispose_func(value) - - def keys(self): - with self.lock: - return list(iterkeys(self._container)) - - -class HTTPHeaderDict(MutableMapping): - """ - :param headers: - An iterable of field-value pairs. Must not contain multiple field names - when compared case-insensitively. - - :param kwargs: - Additional field-value pairs to pass in to ``dict.update``. - - A ``dict`` like container for storing HTTP Headers. - - Field names are stored and compared case-insensitively in compliance with - RFC 7230. Iteration provides the first case-sensitive key seen for each - case-insensitive pair. - - Using ``__setitem__`` syntax overwrites fields that compare equal - case-insensitively in order to maintain ``dict``'s api. For fields that - compare equal, instead create a new ``HTTPHeaderDict`` and use ``.add`` - in a loop. - - If multiple fields that are equal case-insensitively are passed to the - constructor or ``.update``, the behavior is undefined and some will be - lost. - - >>> headers = HTTPHeaderDict() - >>> headers.add('Set-Cookie', 'foo=bar') - >>> headers.add('set-cookie', 'baz=quxx') - >>> headers['content-length'] = '7' - >>> headers['SET-cookie'] - 'foo=bar, baz=quxx' - >>> headers['Content-Length'] - '7' - """ - - def __init__(self, headers=None, **kwargs): - super(HTTPHeaderDict, self).__init__() - self._container = OrderedDict() - if headers is not None: - if isinstance(headers, HTTPHeaderDict): - self._copy_from(headers) - else: - self.extend(headers) - if kwargs: - self.extend(kwargs) - - def __setitem__(self, key, val): - self._container[key.lower()] = [key, val] - return self._container[key.lower()] - - def __getitem__(self, key): - val = self._container[key.lower()] - return ", ".join(val[1:]) - - def __delitem__(self, key): - del self._container[key.lower()] - - def __contains__(self, key): - return key.lower() in self._container - - def __eq__(self, other): - if not isinstance(other, Mapping) and not hasattr(other, "keys"): - return False - if not isinstance(other, type(self)): - other = type(self)(other) - return dict((k.lower(), v) for k, v in self.itermerged()) == dict( - (k.lower(), v) for k, v in other.itermerged() - ) - - def __ne__(self, other): - return not self.__eq__(other) - - if six.PY2: # Python 2 - iterkeys = MutableMapping.iterkeys - itervalues = MutableMapping.itervalues - - __marker = object() - - def __len__(self): - return len(self._container) - - def __iter__(self): - # Only provide the originally cased names - for vals in self._container.values(): - yield vals[0] - - def pop(self, key, default=__marker): - """D.pop(k[,d]) -> v, remove specified key and return the corresponding value. - If key is not found, d is returned if given, otherwise KeyError is raised. - """ - # Using the MutableMapping function directly fails due to the private marker. - # Using ordinary dict.pop would expose the internal structures. - # So let's reinvent the wheel. - try: - value = self[key] - except KeyError: - if default is self.__marker: - raise - return default - else: - del self[key] - return value - - def discard(self, key): - try: - del self[key] - except KeyError: - pass - - def add(self, key, val): - """Adds a (name, value) pair, doesn't overwrite the value if it already - exists. - - >>> headers = HTTPHeaderDict(foo='bar') - >>> headers.add('Foo', 'baz') - >>> headers['foo'] - 'bar, baz' - """ - key_lower = key.lower() - new_vals = [key, val] - # Keep the common case aka no item present as fast as possible - vals = self._container.setdefault(key_lower, new_vals) - if new_vals is not vals: - vals.append(val) - - def extend(self, *args, **kwargs): - """Generic import function for any type of header-like object. - Adapted version of MutableMapping.update in order to insert items - with self.add instead of self.__setitem__ - """ - if len(args) > 1: - raise TypeError( - "extend() takes at most 1 positional " - "arguments ({0} given)".format(len(args)) - ) - other = args[0] if len(args) >= 1 else () - - if isinstance(other, HTTPHeaderDict): - for key, val in other.iteritems(): - self.add(key, val) - elif isinstance(other, Mapping): - for key in other: - self.add(key, other[key]) - elif hasattr(other, "keys"): - for key in other.keys(): - self.add(key, other[key]) - else: - for key, value in other: - self.add(key, value) - - for key, value in kwargs.items(): - self.add(key, value) - - def getlist(self, key, default=__marker): - """Returns a list of all the values for the named field. Returns an - empty list if the key doesn't exist.""" - try: - vals = self._container[key.lower()] - except KeyError: - if default is self.__marker: - return [] - return default - else: - return vals[1:] - - # Backwards compatibility for httplib - getheaders = getlist - getallmatchingheaders = getlist - iget = getlist - - # Backwards compatibility for http.cookiejar - get_all = getlist - - def __repr__(self): - return "%s(%s)" % (type(self).__name__, dict(self.itermerged())) - - def _copy_from(self, other): - for key in other: - val = other.getlist(key) - if isinstance(val, list): - # Don't need to convert tuples - val = list(val) - self._container[key.lower()] = [key] + val - - def copy(self): - clone = type(self)() - clone._copy_from(self) - return clone - - def iteritems(self): - """Iterate over all header lines, including duplicate ones.""" - for key in self: - vals = self._container[key.lower()] - for val in vals[1:]: - yield vals[0], val - - def itermerged(self): - """Iterate over all headers, merging duplicate ones together.""" - for key in self: - val = self._container[key.lower()] - yield val[0], ", ".join(val[1:]) - - def items(self): - return list(self.iteritems()) - - @classmethod - def from_httplib(cls, message): # Python 2 - """Read headers from a Python 2 httplib message object.""" - # python2.7 does not expose a proper API for exporting multiheaders - # efficiently. This function re-reads raw lines from the message - # object and extracts the multiheaders properly. - obs_fold_continued_leaders = (" ", "\t") - headers = [] - - for line in message.headers: - if line.startswith(obs_fold_continued_leaders): - if not headers: - # We received a header line that starts with OWS as described - # in RFC-7230 S3.2.4. This indicates a multiline header, but - # there exists no previous header to which we can attach it. - raise InvalidHeader( - "Header continuation with no previous header: %s" % line - ) - else: - key, value = headers[-1] - headers[-1] = (key, value + " " + line.strip()) - continue - - key, value = line.split(":", 1) - headers.append((key, value.strip())) - - return cls(headers) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/_version.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/_version.py deleted file mode 100644 index cad75fb..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/_version.py +++ /dev/null @@ -1,2 +0,0 @@ -# This file is protected via CODEOWNERS -__version__ = "1.26.17" diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/connection.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/connection.py deleted file mode 100644 index 54b96b1..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/connection.py +++ /dev/null @@ -1,572 +0,0 @@ -from __future__ import absolute_import - -import datetime -import logging -import os -import re -import socket -import warnings -from socket import error as SocketError -from socket import timeout as SocketTimeout - -from .packages import six -from .packages.six.moves.http_client import HTTPConnection as _HTTPConnection -from .packages.six.moves.http_client import HTTPException # noqa: F401 -from .util.proxy import create_proxy_ssl_context - -try: # Compiled with SSL? - import ssl - - BaseSSLError = ssl.SSLError -except (ImportError, AttributeError): # Platform-specific: No SSL. - ssl = None - - class BaseSSLError(BaseException): - pass - - -try: - # Python 3: not a no-op, we're adding this to the namespace so it can be imported. - ConnectionError = ConnectionError -except NameError: - # Python 2 - class ConnectionError(Exception): - pass - - -try: # Python 3: - # Not a no-op, we're adding this to the namespace so it can be imported. - BrokenPipeError = BrokenPipeError -except NameError: # Python 2: - - class BrokenPipeError(Exception): - pass - - -from ._collections import HTTPHeaderDict # noqa (historical, removed in v2) -from ._version import __version__ -from .exceptions import ( - ConnectTimeoutError, - NewConnectionError, - SubjectAltNameWarning, - SystemTimeWarning, -) -from .util import SKIP_HEADER, SKIPPABLE_HEADERS, connection -from .util.ssl_ import ( - assert_fingerprint, - create_urllib3_context, - is_ipaddress, - resolve_cert_reqs, - resolve_ssl_version, - ssl_wrap_socket, -) -from .util.ssl_match_hostname import CertificateError, match_hostname - -log = logging.getLogger(__name__) - -port_by_scheme = {"http": 80, "https": 443} - -# When it comes time to update this value as a part of regular maintenance -# (ie test_recent_date is failing) update it to ~6 months before the current date. -RECENT_DATE = datetime.date(2022, 1, 1) - -_CONTAINS_CONTROL_CHAR_RE = re.compile(r"[^-!#$%&'*+.^_`|~0-9a-zA-Z]") - - -class HTTPConnection(_HTTPConnection, object): - """ - Based on :class:`http.client.HTTPConnection` but provides an extra constructor - backwards-compatibility layer between older and newer Pythons. - - Additional keyword parameters are used to configure attributes of the connection. - Accepted parameters include: - - - ``strict``: See the documentation on :class:`urllib3.connectionpool.HTTPConnectionPool` - - ``source_address``: Set the source address for the current connection. - - ``socket_options``: Set specific options on the underlying socket. If not specified, then - defaults are loaded from ``HTTPConnection.default_socket_options`` which includes disabling - Nagle's algorithm (sets TCP_NODELAY to 1) unless the connection is behind a proxy. - - For example, if you wish to enable TCP Keep Alive in addition to the defaults, - you might pass: - - .. code-block:: python - - HTTPConnection.default_socket_options + [ - (socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1), - ] - - Or you may want to disable the defaults by passing an empty list (e.g., ``[]``). - """ - - default_port = port_by_scheme["http"] - - #: Disable Nagle's algorithm by default. - #: ``[(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]`` - default_socket_options = [(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)] - - #: Whether this connection verifies the host's certificate. - is_verified = False - - #: Whether this proxy connection (if used) verifies the proxy host's - #: certificate. - proxy_is_verified = None - - def __init__(self, *args, **kw): - if not six.PY2: - kw.pop("strict", None) - - # Pre-set source_address. - self.source_address = kw.get("source_address") - - #: The socket options provided by the user. If no options are - #: provided, we use the default options. - self.socket_options = kw.pop("socket_options", self.default_socket_options) - - # Proxy options provided by the user. - self.proxy = kw.pop("proxy", None) - self.proxy_config = kw.pop("proxy_config", None) - - _HTTPConnection.__init__(self, *args, **kw) - - @property - def host(self): - """ - Getter method to remove any trailing dots that indicate the hostname is an FQDN. - - In general, SSL certificates don't include the trailing dot indicating a - fully-qualified domain name, and thus, they don't validate properly when - checked against a domain name that includes the dot. In addition, some - servers may not expect to receive the trailing dot when provided. - - However, the hostname with trailing dot is critical to DNS resolution; doing a - lookup with the trailing dot will properly only resolve the appropriate FQDN, - whereas a lookup without a trailing dot will search the system's search domain - list. Thus, it's important to keep the original host around for use only in - those cases where it's appropriate (i.e., when doing DNS lookup to establish the - actual TCP connection across which we're going to send HTTP requests). - """ - return self._dns_host.rstrip(".") - - @host.setter - def host(self, value): - """ - Setter for the `host` property. - - We assume that only urllib3 uses the _dns_host attribute; httplib itself - only uses `host`, and it seems reasonable that other libraries follow suit. - """ - self._dns_host = value - - def _new_conn(self): - """Establish a socket connection and set nodelay settings on it. - - :return: New socket connection. - """ - extra_kw = {} - if self.source_address: - extra_kw["source_address"] = self.source_address - - if self.socket_options: - extra_kw["socket_options"] = self.socket_options - - try: - conn = connection.create_connection( - (self._dns_host, self.port), self.timeout, **extra_kw - ) - - except SocketTimeout: - raise ConnectTimeoutError( - self, - "Connection to %s timed out. (connect timeout=%s)" - % (self.host, self.timeout), - ) - - except SocketError as e: - raise NewConnectionError( - self, "Failed to establish a new connection: %s" % e - ) - - return conn - - def _is_using_tunnel(self): - # Google App Engine's httplib does not define _tunnel_host - return getattr(self, "_tunnel_host", None) - - def _prepare_conn(self, conn): - self.sock = conn - if self._is_using_tunnel(): - # TODO: Fix tunnel so it doesn't depend on self.sock state. - self._tunnel() - # Mark this connection as not reusable - self.auto_open = 0 - - def connect(self): - conn = self._new_conn() - self._prepare_conn(conn) - - def putrequest(self, method, url, *args, **kwargs): - """ """ - # Empty docstring because the indentation of CPython's implementation - # is broken but we don't want this method in our documentation. - match = _CONTAINS_CONTROL_CHAR_RE.search(method) - if match: - raise ValueError( - "Method cannot contain non-token characters %r (found at least %r)" - % (method, match.group()) - ) - - return _HTTPConnection.putrequest(self, method, url, *args, **kwargs) - - def putheader(self, header, *values): - """ """ - if not any(isinstance(v, str) and v == SKIP_HEADER for v in values): - _HTTPConnection.putheader(self, header, *values) - elif six.ensure_str(header.lower()) not in SKIPPABLE_HEADERS: - raise ValueError( - "urllib3.util.SKIP_HEADER only supports '%s'" - % ("', '".join(map(str.title, sorted(SKIPPABLE_HEADERS))),) - ) - - def request(self, method, url, body=None, headers=None): - # Update the inner socket's timeout value to send the request. - # This only triggers if the connection is re-used. - if getattr(self, "sock", None) is not None: - self.sock.settimeout(self.timeout) - - if headers is None: - headers = {} - else: - # Avoid modifying the headers passed into .request() - headers = headers.copy() - if "user-agent" not in (six.ensure_str(k.lower()) for k in headers): - headers["User-Agent"] = _get_default_user_agent() - super(HTTPConnection, self).request(method, url, body=body, headers=headers) - - def request_chunked(self, method, url, body=None, headers=None): - """ - Alternative to the common request method, which sends the - body with chunked encoding and not as one block - """ - headers = headers or {} - header_keys = set([six.ensure_str(k.lower()) for k in headers]) - skip_accept_encoding = "accept-encoding" in header_keys - skip_host = "host" in header_keys - self.putrequest( - method, url, skip_accept_encoding=skip_accept_encoding, skip_host=skip_host - ) - if "user-agent" not in header_keys: - self.putheader("User-Agent", _get_default_user_agent()) - for header, value in headers.items(): - self.putheader(header, value) - if "transfer-encoding" not in header_keys: - self.putheader("Transfer-Encoding", "chunked") - self.endheaders() - - if body is not None: - stringish_types = six.string_types + (bytes,) - if isinstance(body, stringish_types): - body = (body,) - for chunk in body: - if not chunk: - continue - if not isinstance(chunk, bytes): - chunk = chunk.encode("utf8") - len_str = hex(len(chunk))[2:] - to_send = bytearray(len_str.encode()) - to_send += b"\r\n" - to_send += chunk - to_send += b"\r\n" - self.send(to_send) - - # After the if clause, to always have a closed body - self.send(b"0\r\n\r\n") - - -class HTTPSConnection(HTTPConnection): - """ - Many of the parameters to this constructor are passed to the underlying SSL - socket by means of :py:func:`urllib3.util.ssl_wrap_socket`. - """ - - default_port = port_by_scheme["https"] - - cert_reqs = None - ca_certs = None - ca_cert_dir = None - ca_cert_data = None - ssl_version = None - assert_fingerprint = None - tls_in_tls_required = False - - def __init__( - self, - host, - port=None, - key_file=None, - cert_file=None, - key_password=None, - strict=None, - timeout=socket._GLOBAL_DEFAULT_TIMEOUT, - ssl_context=None, - server_hostname=None, - **kw - ): - - HTTPConnection.__init__(self, host, port, strict=strict, timeout=timeout, **kw) - - self.key_file = key_file - self.cert_file = cert_file - self.key_password = key_password - self.ssl_context = ssl_context - self.server_hostname = server_hostname - - # Required property for Google AppEngine 1.9.0 which otherwise causes - # HTTPS requests to go out as HTTP. (See Issue #356) - self._protocol = "https" - - def set_cert( - self, - key_file=None, - cert_file=None, - cert_reqs=None, - key_password=None, - ca_certs=None, - assert_hostname=None, - assert_fingerprint=None, - ca_cert_dir=None, - ca_cert_data=None, - ): - """ - This method should only be called once, before the connection is used. - """ - # If cert_reqs is not provided we'll assume CERT_REQUIRED unless we also - # have an SSLContext object in which case we'll use its verify_mode. - if cert_reqs is None: - if self.ssl_context is not None: - cert_reqs = self.ssl_context.verify_mode - else: - cert_reqs = resolve_cert_reqs(None) - - self.key_file = key_file - self.cert_file = cert_file - self.cert_reqs = cert_reqs - self.key_password = key_password - self.assert_hostname = assert_hostname - self.assert_fingerprint = assert_fingerprint - self.ca_certs = ca_certs and os.path.expanduser(ca_certs) - self.ca_cert_dir = ca_cert_dir and os.path.expanduser(ca_cert_dir) - self.ca_cert_data = ca_cert_data - - def connect(self): - # Add certificate verification - self.sock = conn = self._new_conn() - hostname = self.host - tls_in_tls = False - - if self._is_using_tunnel(): - if self.tls_in_tls_required: - self.sock = conn = self._connect_tls_proxy(hostname, conn) - tls_in_tls = True - - # Calls self._set_hostport(), so self.host is - # self._tunnel_host below. - self._tunnel() - # Mark this connection as not reusable - self.auto_open = 0 - - # Override the host with the one we're requesting data from. - hostname = self._tunnel_host - - server_hostname = hostname - if self.server_hostname is not None: - server_hostname = self.server_hostname - - is_time_off = datetime.date.today() < RECENT_DATE - if is_time_off: - warnings.warn( - ( - "System time is way off (before {0}). This will probably " - "lead to SSL verification errors" - ).format(RECENT_DATE), - SystemTimeWarning, - ) - - # Wrap socket using verification with the root certs in - # trusted_root_certs - default_ssl_context = False - if self.ssl_context is None: - default_ssl_context = True - self.ssl_context = create_urllib3_context( - ssl_version=resolve_ssl_version(self.ssl_version), - cert_reqs=resolve_cert_reqs(self.cert_reqs), - ) - - context = self.ssl_context - context.verify_mode = resolve_cert_reqs(self.cert_reqs) - - # Try to load OS default certs if none are given. - # Works well on Windows (requires Python3.4+) - if ( - not self.ca_certs - and not self.ca_cert_dir - and not self.ca_cert_data - and default_ssl_context - and hasattr(context, "load_default_certs") - ): - context.load_default_certs() - - self.sock = ssl_wrap_socket( - sock=conn, - keyfile=self.key_file, - certfile=self.cert_file, - key_password=self.key_password, - ca_certs=self.ca_certs, - ca_cert_dir=self.ca_cert_dir, - ca_cert_data=self.ca_cert_data, - server_hostname=server_hostname, - ssl_context=context, - tls_in_tls=tls_in_tls, - ) - - # If we're using all defaults and the connection - # is TLSv1 or TLSv1.1 we throw a DeprecationWarning - # for the host. - if ( - default_ssl_context - and self.ssl_version is None - and hasattr(self.sock, "version") - and self.sock.version() in {"TLSv1", "TLSv1.1"} - ): - warnings.warn( - "Negotiating TLSv1/TLSv1.1 by default is deprecated " - "and will be disabled in urllib3 v2.0.0. Connecting to " - "'%s' with '%s' can be enabled by explicitly opting-in " - "with 'ssl_version'" % (self.host, self.sock.version()), - DeprecationWarning, - ) - - if self.assert_fingerprint: - assert_fingerprint( - self.sock.getpeercert(binary_form=True), self.assert_fingerprint - ) - elif ( - context.verify_mode != ssl.CERT_NONE - and not getattr(context, "check_hostname", False) - and self.assert_hostname is not False - ): - # While urllib3 attempts to always turn off hostname matching from - # the TLS library, this cannot always be done. So we check whether - # the TLS Library still thinks it's matching hostnames. - cert = self.sock.getpeercert() - if not cert.get("subjectAltName", ()): - warnings.warn( - ( - "Certificate for {0} has no `subjectAltName`, falling back to check for a " - "`commonName` for now. This feature is being removed by major browsers and " - "deprecated by RFC 2818. (See https://github.com/urllib3/urllib3/issues/497 " - "for details.)".format(hostname) - ), - SubjectAltNameWarning, - ) - _match_hostname(cert, self.assert_hostname or server_hostname) - - self.is_verified = ( - context.verify_mode == ssl.CERT_REQUIRED - or self.assert_fingerprint is not None - ) - - def _connect_tls_proxy(self, hostname, conn): - """ - Establish a TLS connection to the proxy using the provided SSL context. - """ - proxy_config = self.proxy_config - ssl_context = proxy_config.ssl_context - if ssl_context: - # If the user provided a proxy context, we assume CA and client - # certificates have already been set - return ssl_wrap_socket( - sock=conn, - server_hostname=hostname, - ssl_context=ssl_context, - ) - - ssl_context = create_proxy_ssl_context( - self.ssl_version, - self.cert_reqs, - self.ca_certs, - self.ca_cert_dir, - self.ca_cert_data, - ) - - # If no cert was provided, use only the default options for server - # certificate validation - socket = ssl_wrap_socket( - sock=conn, - ca_certs=self.ca_certs, - ca_cert_dir=self.ca_cert_dir, - ca_cert_data=self.ca_cert_data, - server_hostname=hostname, - ssl_context=ssl_context, - ) - - if ssl_context.verify_mode != ssl.CERT_NONE and not getattr( - ssl_context, "check_hostname", False - ): - # While urllib3 attempts to always turn off hostname matching from - # the TLS library, this cannot always be done. So we check whether - # the TLS Library still thinks it's matching hostnames. - cert = socket.getpeercert() - if not cert.get("subjectAltName", ()): - warnings.warn( - ( - "Certificate for {0} has no `subjectAltName`, falling back to check for a " - "`commonName` for now. This feature is being removed by major browsers and " - "deprecated by RFC 2818. (See https://github.com/urllib3/urllib3/issues/497 " - "for details.)".format(hostname) - ), - SubjectAltNameWarning, - ) - _match_hostname(cert, hostname) - - self.proxy_is_verified = ssl_context.verify_mode == ssl.CERT_REQUIRED - return socket - - -def _match_hostname(cert, asserted_hostname): - # Our upstream implementation of ssl.match_hostname() - # only applies this normalization to IP addresses so it doesn't - # match DNS SANs so we do the same thing! - stripped_hostname = asserted_hostname.strip("u[]") - if is_ipaddress(stripped_hostname): - asserted_hostname = stripped_hostname - - try: - match_hostname(cert, asserted_hostname) - except CertificateError as e: - log.warning( - "Certificate did not match expected hostname: %s. Certificate: %s", - asserted_hostname, - cert, - ) - # Add cert to exception and reraise so client code can inspect - # the cert when catching the exception, if they want to - e._peer_cert = cert - raise - - -def _get_default_user_agent(): - return "python-urllib3/%s" % __version__ - - -class DummyConnection(object): - """Used to detect a failed ConnectionCls import.""" - - pass - - -if not ssl: - HTTPSConnection = DummyConnection # noqa: F811 - - -VerifiedHTTPSConnection = HTTPSConnection diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/connectionpool.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/connectionpool.py deleted file mode 100644 index 96844d9..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/connectionpool.py +++ /dev/null @@ -1,1132 +0,0 @@ -from __future__ import absolute_import - -import errno -import logging -import re -import socket -import sys -import warnings -from socket import error as SocketError -from socket import timeout as SocketTimeout - -from .connection import ( - BaseSSLError, - BrokenPipeError, - DummyConnection, - HTTPConnection, - HTTPException, - HTTPSConnection, - VerifiedHTTPSConnection, - port_by_scheme, -) -from .exceptions import ( - ClosedPoolError, - EmptyPoolError, - HeaderParsingError, - HostChangedError, - InsecureRequestWarning, - LocationValueError, - MaxRetryError, - NewConnectionError, - ProtocolError, - ProxyError, - ReadTimeoutError, - SSLError, - TimeoutError, -) -from .packages import six -from .packages.six.moves import queue -from .request import RequestMethods -from .response import HTTPResponse -from .util.connection import is_connection_dropped -from .util.proxy import connection_requires_http_tunnel -from .util.queue import LifoQueue -from .util.request import set_file_position -from .util.response import assert_header_parsing -from .util.retry import Retry -from .util.ssl_match_hostname import CertificateError -from .util.timeout import Timeout -from .util.url import Url, _encode_target -from .util.url import _normalize_host as normalize_host -from .util.url import get_host, parse_url - -try: # Platform-specific: Python 3 - import weakref - - weakref_finalize = weakref.finalize -except AttributeError: # Platform-specific: Python 2 - from .packages.backports.weakref_finalize import weakref_finalize - -xrange = six.moves.xrange - -log = logging.getLogger(__name__) - -_Default = object() - - -# Pool objects -class ConnectionPool(object): - """ - Base class for all connection pools, such as - :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`. - - .. note:: - ConnectionPool.urlopen() does not normalize or percent-encode target URIs - which is useful if your target server doesn't support percent-encoded - target URIs. - """ - - scheme = None - QueueCls = LifoQueue - - def __init__(self, host, port=None): - if not host: - raise LocationValueError("No host specified.") - - self.host = _normalize_host(host, scheme=self.scheme) - self._proxy_host = host.lower() - self.port = port - - def __str__(self): - return "%s(host=%r, port=%r)" % (type(self).__name__, self.host, self.port) - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - self.close() - # Return False to re-raise any potential exceptions - return False - - def close(self): - """ - Close all pooled connections and disable the pool. - """ - pass - - -# This is taken from http://hg.python.org/cpython/file/7aaba721ebc0/Lib/socket.py#l252 -_blocking_errnos = {errno.EAGAIN, errno.EWOULDBLOCK} - - -class HTTPConnectionPool(ConnectionPool, RequestMethods): - """ - Thread-safe connection pool for one host. - - :param host: - Host used for this HTTP Connection (e.g. "localhost"), passed into - :class:`http.client.HTTPConnection`. - - :param port: - Port used for this HTTP Connection (None is equivalent to 80), passed - into :class:`http.client.HTTPConnection`. - - :param strict: - Causes BadStatusLine to be raised if the status line can't be parsed - as a valid HTTP/1.0 or 1.1 status line, passed into - :class:`http.client.HTTPConnection`. - - .. note:: - Only works in Python 2. This parameter is ignored in Python 3. - - :param timeout: - Socket timeout in seconds for each individual connection. This can - be a float or integer, which sets the timeout for the HTTP request, - or an instance of :class:`urllib3.util.Timeout` which gives you more - fine-grained control over request timeouts. After the constructor has - been parsed, this is always a `urllib3.util.Timeout` object. - - :param maxsize: - Number of connections to save that can be reused. More than 1 is useful - in multithreaded situations. If ``block`` is set to False, more - connections will be created but they will not be saved once they've - been used. - - :param block: - If set to True, no more than ``maxsize`` connections will be used at - a time. When no free connections are available, the call will block - until a connection has been released. This is a useful side effect for - particular multithreaded situations where one does not want to use more - than maxsize connections per host to prevent flooding. - - :param headers: - Headers to include with all requests, unless other headers are given - explicitly. - - :param retries: - Retry configuration to use by default with requests in this pool. - - :param _proxy: - Parsed proxy URL, should not be used directly, instead, see - :class:`urllib3.ProxyManager` - - :param _proxy_headers: - A dictionary with proxy headers, should not be used directly, - instead, see :class:`urllib3.ProxyManager` - - :param \\**conn_kw: - Additional parameters are used to create fresh :class:`urllib3.connection.HTTPConnection`, - :class:`urllib3.connection.HTTPSConnection` instances. - """ - - scheme = "http" - ConnectionCls = HTTPConnection - ResponseCls = HTTPResponse - - def __init__( - self, - host, - port=None, - strict=False, - timeout=Timeout.DEFAULT_TIMEOUT, - maxsize=1, - block=False, - headers=None, - retries=None, - _proxy=None, - _proxy_headers=None, - _proxy_config=None, - **conn_kw - ): - ConnectionPool.__init__(self, host, port) - RequestMethods.__init__(self, headers) - - self.strict = strict - - if not isinstance(timeout, Timeout): - timeout = Timeout.from_float(timeout) - - if retries is None: - retries = Retry.DEFAULT - - self.timeout = timeout - self.retries = retries - - self.pool = self.QueueCls(maxsize) - self.block = block - - self.proxy = _proxy - self.proxy_headers = _proxy_headers or {} - self.proxy_config = _proxy_config - - # Fill the queue up so that doing get() on it will block properly - for _ in xrange(maxsize): - self.pool.put(None) - - # These are mostly for testing and debugging purposes. - self.num_connections = 0 - self.num_requests = 0 - self.conn_kw = conn_kw - - if self.proxy: - # Enable Nagle's algorithm for proxies, to avoid packet fragmentation. - # We cannot know if the user has added default socket options, so we cannot replace the - # list. - self.conn_kw.setdefault("socket_options", []) - - self.conn_kw["proxy"] = self.proxy - self.conn_kw["proxy_config"] = self.proxy_config - - # Do not pass 'self' as callback to 'finalize'. - # Then the 'finalize' would keep an endless living (leak) to self. - # By just passing a reference to the pool allows the garbage collector - # to free self if nobody else has a reference to it. - pool = self.pool - - # Close all the HTTPConnections in the pool before the - # HTTPConnectionPool object is garbage collected. - weakref_finalize(self, _close_pool_connections, pool) - - def _new_conn(self): - """ - Return a fresh :class:`HTTPConnection`. - """ - self.num_connections += 1 - log.debug( - "Starting new HTTP connection (%d): %s:%s", - self.num_connections, - self.host, - self.port or "80", - ) - - conn = self.ConnectionCls( - host=self.host, - port=self.port, - timeout=self.timeout.connect_timeout, - strict=self.strict, - **self.conn_kw - ) - return conn - - def _get_conn(self, timeout=None): - """ - Get a connection. Will return a pooled connection if one is available. - - If no connections are available and :prop:`.block` is ``False``, then a - fresh connection is returned. - - :param timeout: - Seconds to wait before giving up and raising - :class:`urllib3.exceptions.EmptyPoolError` if the pool is empty and - :prop:`.block` is ``True``. - """ - conn = None - try: - conn = self.pool.get(block=self.block, timeout=timeout) - - except AttributeError: # self.pool is None - raise ClosedPoolError(self, "Pool is closed.") - - except queue.Empty: - if self.block: - raise EmptyPoolError( - self, - "Pool reached maximum size and no more connections are allowed.", - ) - pass # Oh well, we'll create a new connection then - - # If this is a persistent connection, check if it got disconnected - if conn and is_connection_dropped(conn): - log.debug("Resetting dropped connection: %s", self.host) - conn.close() - if getattr(conn, "auto_open", 1) == 0: - # This is a proxied connection that has been mutated by - # http.client._tunnel() and cannot be reused (since it would - # attempt to bypass the proxy) - conn = None - - return conn or self._new_conn() - - def _put_conn(self, conn): - """ - Put a connection back into the pool. - - :param conn: - Connection object for the current host and port as returned by - :meth:`._new_conn` or :meth:`._get_conn`. - - If the pool is already full, the connection is closed and discarded - because we exceeded maxsize. If connections are discarded frequently, - then maxsize should be increased. - - If the pool is closed, then the connection will be closed and discarded. - """ - try: - self.pool.put(conn, block=False) - return # Everything is dandy, done. - except AttributeError: - # self.pool is None. - pass - except queue.Full: - # This should never happen if self.block == True - log.warning( - "Connection pool is full, discarding connection: %s. Connection pool size: %s", - self.host, - self.pool.qsize(), - ) - # Connection never got put back into the pool, close it. - if conn: - conn.close() - - def _validate_conn(self, conn): - """ - Called right before a request is made, after the socket is created. - """ - pass - - def _prepare_proxy(self, conn): - # Nothing to do for HTTP connections. - pass - - def _get_timeout(self, timeout): - """Helper that always returns a :class:`urllib3.util.Timeout`""" - if timeout is _Default: - return self.timeout.clone() - - if isinstance(timeout, Timeout): - return timeout.clone() - else: - # User passed us an int/float. This is for backwards compatibility, - # can be removed later - return Timeout.from_float(timeout) - - def _raise_timeout(self, err, url, timeout_value): - """Is the error actually a timeout? Will raise a ReadTimeout or pass""" - - if isinstance(err, SocketTimeout): - raise ReadTimeoutError( - self, url, "Read timed out. (read timeout=%s)" % timeout_value - ) - - # See the above comment about EAGAIN in Python 3. In Python 2 we have - # to specifically catch it and throw the timeout error - if hasattr(err, "errno") and err.errno in _blocking_errnos: - raise ReadTimeoutError( - self, url, "Read timed out. (read timeout=%s)" % timeout_value - ) - - # Catch possible read timeouts thrown as SSL errors. If not the - # case, rethrow the original. We need to do this because of: - # http://bugs.python.org/issue10272 - if "timed out" in str(err) or "did not complete (read)" in str( - err - ): # Python < 2.7.4 - raise ReadTimeoutError( - self, url, "Read timed out. (read timeout=%s)" % timeout_value - ) - - def _make_request( - self, conn, method, url, timeout=_Default, chunked=False, **httplib_request_kw - ): - """ - Perform a request on a given urllib connection object taken from our - pool. - - :param conn: - a connection from one of our connection pools - - :param timeout: - Socket timeout in seconds for the request. This can be a - float or integer, which will set the same timeout value for - the socket connect and the socket read, or an instance of - :class:`urllib3.util.Timeout`, which gives you more fine-grained - control over your timeouts. - """ - self.num_requests += 1 - - timeout_obj = self._get_timeout(timeout) - timeout_obj.start_connect() - conn.timeout = Timeout.resolve_default_timeout(timeout_obj.connect_timeout) - - # Trigger any extra validation we need to do. - try: - self._validate_conn(conn) - except (SocketTimeout, BaseSSLError) as e: - # Py2 raises this as a BaseSSLError, Py3 raises it as socket timeout. - self._raise_timeout(err=e, url=url, timeout_value=conn.timeout) - raise - - # conn.request() calls http.client.*.request, not the method in - # urllib3.request. It also calls makefile (recv) on the socket. - try: - if chunked: - conn.request_chunked(method, url, **httplib_request_kw) - else: - conn.request(method, url, **httplib_request_kw) - - # We are swallowing BrokenPipeError (errno.EPIPE) since the server is - # legitimately able to close the connection after sending a valid response. - # With this behaviour, the received response is still readable. - except BrokenPipeError: - # Python 3 - pass - except IOError as e: - # Python 2 and macOS/Linux - # EPIPE and ESHUTDOWN are BrokenPipeError on Python 2, and EPROTOTYPE is needed on macOS - # https://erickt.github.io/blog/2014/11/19/adventures-in-debugging-a-potential-osx-kernel-bug/ - if e.errno not in { - errno.EPIPE, - errno.ESHUTDOWN, - errno.EPROTOTYPE, - }: - raise - - # Reset the timeout for the recv() on the socket - read_timeout = timeout_obj.read_timeout - - # App Engine doesn't have a sock attr - if getattr(conn, "sock", None): - # In Python 3 socket.py will catch EAGAIN and return None when you - # try and read into the file pointer created by http.client, which - # instead raises a BadStatusLine exception. Instead of catching - # the exception and assuming all BadStatusLine exceptions are read - # timeouts, check for a zero timeout before making the request. - if read_timeout == 0: - raise ReadTimeoutError( - self, url, "Read timed out. (read timeout=%s)" % read_timeout - ) - if read_timeout is Timeout.DEFAULT_TIMEOUT: - conn.sock.settimeout(socket.getdefaulttimeout()) - else: # None or a value - conn.sock.settimeout(read_timeout) - - # Receive the response from the server - try: - try: - # Python 2.7, use buffering of HTTP responses - httplib_response = conn.getresponse(buffering=True) - except TypeError: - # Python 3 - try: - httplib_response = conn.getresponse() - except BaseException as e: - # Remove the TypeError from the exception chain in - # Python 3 (including for exceptions like SystemExit). - # Otherwise it looks like a bug in the code. - six.raise_from(e, None) - except (SocketTimeout, BaseSSLError, SocketError) as e: - self._raise_timeout(err=e, url=url, timeout_value=read_timeout) - raise - - # AppEngine doesn't have a version attr. - http_version = getattr(conn, "_http_vsn_str", "HTTP/?") - log.debug( - '%s://%s:%s "%s %s %s" %s %s', - self.scheme, - self.host, - self.port, - method, - url, - http_version, - httplib_response.status, - httplib_response.length, - ) - - try: - assert_header_parsing(httplib_response.msg) - except (HeaderParsingError, TypeError) as hpe: # Platform-specific: Python 3 - log.warning( - "Failed to parse headers (url=%s): %s", - self._absolute_url(url), - hpe, - exc_info=True, - ) - - return httplib_response - - def _absolute_url(self, path): - return Url(scheme=self.scheme, host=self.host, port=self.port, path=path).url - - def close(self): - """ - Close all pooled connections and disable the pool. - """ - if self.pool is None: - return - # Disable access to the pool - old_pool, self.pool = self.pool, None - - # Close all the HTTPConnections in the pool. - _close_pool_connections(old_pool) - - def is_same_host(self, url): - """ - Check if the given ``url`` is a member of the same host as this - connection pool. - """ - if url.startswith("/"): - return True - - # TODO: Add optional support for socket.gethostbyname checking. - scheme, host, port = get_host(url) - if host is not None: - host = _normalize_host(host, scheme=scheme) - - # Use explicit default port for comparison when none is given - if self.port and not port: - port = port_by_scheme.get(scheme) - elif not self.port and port == port_by_scheme.get(scheme): - port = None - - return (scheme, host, port) == (self.scheme, self.host, self.port) - - def urlopen( - self, - method, - url, - body=None, - headers=None, - retries=None, - redirect=True, - assert_same_host=True, - timeout=_Default, - pool_timeout=None, - release_conn=None, - chunked=False, - body_pos=None, - **response_kw - ): - """ - Get a connection from the pool and perform an HTTP request. This is the - lowest level call for making a request, so you'll need to specify all - the raw details. - - .. note:: - - More commonly, it's appropriate to use a convenience method provided - by :class:`.RequestMethods`, such as :meth:`request`. - - .. note:: - - `release_conn` will only behave as expected if - `preload_content=False` because we want to make - `preload_content=False` the default behaviour someday soon without - breaking backwards compatibility. - - :param method: - HTTP request method (such as GET, POST, PUT, etc.) - - :param url: - The URL to perform the request on. - - :param body: - Data to send in the request body, either :class:`str`, :class:`bytes`, - an iterable of :class:`str`/:class:`bytes`, or a file-like object. - - :param headers: - Dictionary of custom headers to send, such as User-Agent, - If-None-Match, etc. If None, pool headers are used. If provided, - these headers completely replace any pool-specific headers. - - :param retries: - Configure the number of retries to allow before raising a - :class:`~urllib3.exceptions.MaxRetryError` exception. - - Pass ``None`` to retry until you receive a response. Pass a - :class:`~urllib3.util.retry.Retry` object for fine-grained control - over different types of retries. - Pass an integer number to retry connection errors that many times, - but no other types of errors. Pass zero to never retry. - - If ``False``, then retries are disabled and any exception is raised - immediately. Also, instead of raising a MaxRetryError on redirects, - the redirect response will be returned. - - :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int. - - :param redirect: - If True, automatically handle redirects (status codes 301, 302, - 303, 307, 308). Each redirect counts as a retry. Disabling retries - will disable redirect, too. - - :param assert_same_host: - If ``True``, will make sure that the host of the pool requests is - consistent else will raise HostChangedError. When ``False``, you can - use the pool on an HTTP proxy and request foreign hosts. - - :param timeout: - If specified, overrides the default timeout for this one - request. It may be a float (in seconds) or an instance of - :class:`urllib3.util.Timeout`. - - :param pool_timeout: - If set and the pool is set to block=True, then this method will - block for ``pool_timeout`` seconds and raise EmptyPoolError if no - connection is available within the time period. - - :param release_conn: - If False, then the urlopen call will not release the connection - back into the pool once a response is received (but will release if - you read the entire contents of the response such as when - `preload_content=True`). This is useful if you're not preloading - the response's content immediately. You will need to call - ``r.release_conn()`` on the response ``r`` to return the connection - back into the pool. If None, it takes the value of - ``response_kw.get('preload_content', True)``. - - :param chunked: - If True, urllib3 will send the body using chunked transfer - encoding. Otherwise, urllib3 will send the body using the standard - content-length form. Defaults to False. - - :param int body_pos: - Position to seek to in file-like body in the event of a retry or - redirect. Typically this won't need to be set because urllib3 will - auto-populate the value when needed. - - :param \\**response_kw: - Additional parameters are passed to - :meth:`urllib3.response.HTTPResponse.from_httplib` - """ - - parsed_url = parse_url(url) - destination_scheme = parsed_url.scheme - - if headers is None: - headers = self.headers - - if not isinstance(retries, Retry): - retries = Retry.from_int(retries, redirect=redirect, default=self.retries) - - if release_conn is None: - release_conn = response_kw.get("preload_content", True) - - # Check host - if assert_same_host and not self.is_same_host(url): - raise HostChangedError(self, url, retries) - - # Ensure that the URL we're connecting to is properly encoded - if url.startswith("/"): - url = six.ensure_str(_encode_target(url)) - else: - url = six.ensure_str(parsed_url.url) - - conn = None - - # Track whether `conn` needs to be released before - # returning/raising/recursing. Update this variable if necessary, and - # leave `release_conn` constant throughout the function. That way, if - # the function recurses, the original value of `release_conn` will be - # passed down into the recursive call, and its value will be respected. - # - # See issue #651 [1] for details. - # - # [1] <https://github.com/urllib3/urllib3/issues/651> - release_this_conn = release_conn - - http_tunnel_required = connection_requires_http_tunnel( - self.proxy, self.proxy_config, destination_scheme - ) - - # Merge the proxy headers. Only done when not using HTTP CONNECT. We - # have to copy the headers dict so we can safely change it without those - # changes being reflected in anyone else's copy. - if not http_tunnel_required: - headers = headers.copy() - headers.update(self.proxy_headers) - - # Must keep the exception bound to a separate variable or else Python 3 - # complains about UnboundLocalError. - err = None - - # Keep track of whether we cleanly exited the except block. This - # ensures we do proper cleanup in finally. - clean_exit = False - - # Rewind body position, if needed. Record current position - # for future rewinds in the event of a redirect/retry. - body_pos = set_file_position(body, body_pos) - - try: - # Request a connection from the queue. - timeout_obj = self._get_timeout(timeout) - conn = self._get_conn(timeout=pool_timeout) - - conn.timeout = timeout_obj.connect_timeout - - is_new_proxy_conn = self.proxy is not None and not getattr( - conn, "sock", None - ) - if is_new_proxy_conn and http_tunnel_required: - self._prepare_proxy(conn) - - # Make the request on the httplib connection object. - httplib_response = self._make_request( - conn, - method, - url, - timeout=timeout_obj, - body=body, - headers=headers, - chunked=chunked, - ) - - # If we're going to release the connection in ``finally:``, then - # the response doesn't need to know about the connection. Otherwise - # it will also try to release it and we'll have a double-release - # mess. - response_conn = conn if not release_conn else None - - # Pass method to Response for length checking - response_kw["request_method"] = method - - # Import httplib's response into our own wrapper object - response = self.ResponseCls.from_httplib( - httplib_response, - pool=self, - connection=response_conn, - retries=retries, - **response_kw - ) - - # Everything went great! - clean_exit = True - - except EmptyPoolError: - # Didn't get a connection from the pool, no need to clean up - clean_exit = True - release_this_conn = False - raise - - except ( - TimeoutError, - HTTPException, - SocketError, - ProtocolError, - BaseSSLError, - SSLError, - CertificateError, - ) as e: - # Discard the connection for these exceptions. It will be - # replaced during the next _get_conn() call. - clean_exit = False - - def _is_ssl_error_message_from_http_proxy(ssl_error): - # We're trying to detect the message 'WRONG_VERSION_NUMBER' but - # SSLErrors are kinda all over the place when it comes to the message, - # so we try to cover our bases here! - message = " ".join(re.split("[^a-z]", str(ssl_error).lower())) - return ( - "wrong version number" in message or "unknown protocol" in message - ) - - # Try to detect a common user error with proxies which is to - # set an HTTP proxy to be HTTPS when it should be 'http://' - # (ie {'http': 'http://proxy', 'https': 'https://proxy'}) - # Instead we add a nice error message and point to a URL. - if ( - isinstance(e, BaseSSLError) - and self.proxy - and _is_ssl_error_message_from_http_proxy(e) - and conn.proxy - and conn.proxy.scheme == "https" - ): - e = ProxyError( - "Your proxy appears to only use HTTP and not HTTPS, " - "try changing your proxy URL to be HTTP. See: " - "https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html" - "#https-proxy-error-http-proxy", - SSLError(e), - ) - elif isinstance(e, (BaseSSLError, CertificateError)): - e = SSLError(e) - elif isinstance(e, (SocketError, NewConnectionError)) and self.proxy: - e = ProxyError("Cannot connect to proxy.", e) - elif isinstance(e, (SocketError, HTTPException)): - e = ProtocolError("Connection aborted.", e) - - retries = retries.increment( - method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2] - ) - retries.sleep() - - # Keep track of the error for the retry warning. - err = e - - finally: - if not clean_exit: - # We hit some kind of exception, handled or otherwise. We need - # to throw the connection away unless explicitly told not to. - # Close the connection, set the variable to None, and make sure - # we put the None back in the pool to avoid leaking it. - conn = conn and conn.close() - release_this_conn = True - - if release_this_conn: - # Put the connection back to be reused. If the connection is - # expired then it will be None, which will get replaced with a - # fresh connection during _get_conn. - self._put_conn(conn) - - if not conn: - # Try again - log.warning( - "Retrying (%r) after connection broken by '%r': %s", retries, err, url - ) - return self.urlopen( - method, - url, - body, - headers, - retries, - redirect, - assert_same_host, - timeout=timeout, - pool_timeout=pool_timeout, - release_conn=release_conn, - chunked=chunked, - body_pos=body_pos, - **response_kw - ) - - # Handle redirect? - redirect_location = redirect and response.get_redirect_location() - if redirect_location: - if response.status == 303: - method = "GET" - - try: - retries = retries.increment(method, url, response=response, _pool=self) - except MaxRetryError: - if retries.raise_on_redirect: - response.drain_conn() - raise - return response - - response.drain_conn() - retries.sleep_for_retry(response) - log.debug("Redirecting %s -> %s", url, redirect_location) - return self.urlopen( - method, - redirect_location, - body, - headers, - retries=retries, - redirect=redirect, - assert_same_host=assert_same_host, - timeout=timeout, - pool_timeout=pool_timeout, - release_conn=release_conn, - chunked=chunked, - body_pos=body_pos, - **response_kw - ) - - # Check if we should retry the HTTP response. - has_retry_after = bool(response.headers.get("Retry-After")) - if retries.is_retry(method, response.status, has_retry_after): - try: - retries = retries.increment(method, url, response=response, _pool=self) - except MaxRetryError: - if retries.raise_on_status: - response.drain_conn() - raise - return response - - response.drain_conn() - retries.sleep(response) - log.debug("Retry: %s", url) - return self.urlopen( - method, - url, - body, - headers, - retries=retries, - redirect=redirect, - assert_same_host=assert_same_host, - timeout=timeout, - pool_timeout=pool_timeout, - release_conn=release_conn, - chunked=chunked, - body_pos=body_pos, - **response_kw - ) - - return response - - -class HTTPSConnectionPool(HTTPConnectionPool): - """ - Same as :class:`.HTTPConnectionPool`, but HTTPS. - - :class:`.HTTPSConnection` uses one of ``assert_fingerprint``, - ``assert_hostname`` and ``host`` in this order to verify connections. - If ``assert_hostname`` is False, no verification is done. - - The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs``, - ``ca_cert_dir``, ``ssl_version``, ``key_password`` are only used if :mod:`ssl` - is available and are fed into :meth:`urllib3.util.ssl_wrap_socket` to upgrade - the connection socket into an SSL socket. - """ - - scheme = "https" - ConnectionCls = HTTPSConnection - - def __init__( - self, - host, - port=None, - strict=False, - timeout=Timeout.DEFAULT_TIMEOUT, - maxsize=1, - block=False, - headers=None, - retries=None, - _proxy=None, - _proxy_headers=None, - key_file=None, - cert_file=None, - cert_reqs=None, - key_password=None, - ca_certs=None, - ssl_version=None, - assert_hostname=None, - assert_fingerprint=None, - ca_cert_dir=None, - **conn_kw - ): - - HTTPConnectionPool.__init__( - self, - host, - port, - strict, - timeout, - maxsize, - block, - headers, - retries, - _proxy, - _proxy_headers, - **conn_kw - ) - - self.key_file = key_file - self.cert_file = cert_file - self.cert_reqs = cert_reqs - self.key_password = key_password - self.ca_certs = ca_certs - self.ca_cert_dir = ca_cert_dir - self.ssl_version = ssl_version - self.assert_hostname = assert_hostname - self.assert_fingerprint = assert_fingerprint - - def _prepare_conn(self, conn): - """ - Prepare the ``connection`` for :meth:`urllib3.util.ssl_wrap_socket` - and establish the tunnel if proxy is used. - """ - - if isinstance(conn, VerifiedHTTPSConnection): - conn.set_cert( - key_file=self.key_file, - key_password=self.key_password, - cert_file=self.cert_file, - cert_reqs=self.cert_reqs, - ca_certs=self.ca_certs, - ca_cert_dir=self.ca_cert_dir, - assert_hostname=self.assert_hostname, - assert_fingerprint=self.assert_fingerprint, - ) - conn.ssl_version = self.ssl_version - return conn - - def _prepare_proxy(self, conn): - """ - Establishes a tunnel connection through HTTP CONNECT. - - Tunnel connection is established early because otherwise httplib would - improperly set Host: header to proxy's IP:port. - """ - - conn.set_tunnel(self._proxy_host, self.port, self.proxy_headers) - - if self.proxy.scheme == "https": - conn.tls_in_tls_required = True - - conn.connect() - - def _new_conn(self): - """ - Return a fresh :class:`http.client.HTTPSConnection`. - """ - self.num_connections += 1 - log.debug( - "Starting new HTTPS connection (%d): %s:%s", - self.num_connections, - self.host, - self.port or "443", - ) - - if not self.ConnectionCls or self.ConnectionCls is DummyConnection: - raise SSLError( - "Can't connect to HTTPS URL because the SSL module is not available." - ) - - actual_host = self.host - actual_port = self.port - if self.proxy is not None: - actual_host = self.proxy.host - actual_port = self.proxy.port - - conn = self.ConnectionCls( - host=actual_host, - port=actual_port, - timeout=self.timeout.connect_timeout, - strict=self.strict, - cert_file=self.cert_file, - key_file=self.key_file, - key_password=self.key_password, - **self.conn_kw - ) - - return self._prepare_conn(conn) - - def _validate_conn(self, conn): - """ - Called right before a request is made, after the socket is created. - """ - super(HTTPSConnectionPool, self)._validate_conn(conn) - - # Force connect early to allow us to validate the connection. - if not getattr(conn, "sock", None): # AppEngine might not have `.sock` - conn.connect() - - if not conn.is_verified: - warnings.warn( - ( - "Unverified HTTPS request is being made to host '%s'. " - "Adding certificate verification is strongly advised. See: " - "https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html" - "#ssl-warnings" % conn.host - ), - InsecureRequestWarning, - ) - - if getattr(conn, "proxy_is_verified", None) is False: - warnings.warn( - ( - "Unverified HTTPS connection done to an HTTPS proxy. " - "Adding certificate verification is strongly advised. See: " - "https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html" - "#ssl-warnings" - ), - InsecureRequestWarning, - ) - - -def connection_from_url(url, **kw): - """ - Given a url, return an :class:`.ConnectionPool` instance of its host. - - This is a shortcut for not having to parse out the scheme, host, and port - of the url before creating an :class:`.ConnectionPool` instance. - - :param url: - Absolute URL string that must include the scheme. Port is optional. - - :param \\**kw: - Passes additional parameters to the constructor of the appropriate - :class:`.ConnectionPool`. Useful for specifying things like - timeout, maxsize, headers, etc. - - Example:: - - >>> conn = connection_from_url('http://google.com/') - >>> r = conn.request('GET', '/') - """ - scheme, host, port = get_host(url) - port = port or port_by_scheme.get(scheme, 80) - if scheme == "https": - return HTTPSConnectionPool(host, port=port, **kw) - else: - return HTTPConnectionPool(host, port=port, **kw) - - -def _normalize_host(host, scheme): - """ - Normalize hosts for comparisons and use with sockets. - """ - - host = normalize_host(host, scheme) - - # httplib doesn't like it when we include brackets in IPv6 addresses - # Specifically, if we include brackets but also pass the port then - # httplib crazily doubles up the square brackets on the Host header. - # Instead, we need to make sure we never pass ``None`` as the port. - # However, for backward compatibility reasons we can't actually - # *assert* that. See http://bugs.python.org/issue28539 - if host.startswith("[") and host.endswith("]"): - host = host[1:-1] - return host - - -def _close_pool_connections(pool): - """Drains a queue of connections and closes each one.""" - try: - while True: - conn = pool.get(block=False) - if conn: - conn.close() - except queue.Empty: - pass # Done. diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index fe5418cb351f486b104c6dfcf203462fb67a23b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220 zcmZ9GJqiLr425_60TDci#Ts;5v9k6G!#Eq<!TBRIyRvu?JA2RKF+73TS($Bpki3`h z1@c@h<^@aNug&1Eq5bPK;mxh+i={X`3L5eB8JO=Cn&1$e%Bh2W(5*wC6J)e_BIU}I zjXoolb+~vNRE-23`VOo)LhN%Be6?C{AeoG1RQjw=m>`-6lCe4vv}BpBKnI_RkEAr- dWGPp%|IW59)UCxGP5BqWm4@&h3n6IC=?4^VK6wBD diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-312.pyc deleted file mode 100644 index 09aa83faa9f91f4d97afe344f8b19613f921832b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1870 zcmdT_&ub(_6t3!?U(QT+H!+0WpkwU@jk6@vn3V)%U5I3|EYWdEqCzfBr>ipElb)`o zs%AD5FA)?3FW#aciXh06(}J)k!Mm62W)Dl_LGU2n*2L4EeAV+~vq}5|e9*7o)O-E< ztM7f)^Xt%19)Y>ve(e2hBJ_v;(Kn+P991CLMHH<eim4IcHB8M<(V9V1;7ytapQ0J? zX_^I}=@{kQ_B;7i&zGdhX)9nP61?qG2EUmTN}@QSOfgpx<uNiJMWh<m{g4qBwtd0F zCJR+1|Ca_(b9*q7o5ln<Q4f>C{p4OR*upZ8k<vAZ_19NW8Q022JmO0`;I0$cP86}^ zrSUMV0YLg}=`K3bPe1+4@_3V3O-ISLwZPq$1|}`V0#+AJb6P6j-DF~#@;hO`9m<5& zhAmiuzivex<?--Z<&7Cj`if0Qj=Sm9nY1E5vTP`$Tv#m;K<zcl<)ISr&@%{jkBUmv ziHiVm09U*K$Z~MWQE)rxx5CQ@g;yRHW*<$wc`z}%pPCg}NSsaEB4l>aS+t2Upshc0 z)JQ?$38VNDtWaa~b%cOU)0qJFms!MxlEmLgMhPehOkK3X&=2dx50ljmUr0sjEM&q_ zJ`ag>Lb}ekD)~GCTLleB1{BcaHPA!(O^}Qu7y+$#p$}sVIs`}$0^Qo__n9K=Ek%5l zbkm}1xgH6a1RzWTudedjY>G(U>#w_Xc#BAnw*neYDiShAwJKeYxtnBz3+Pr!+DXQU zr&J{0vMe{?En2B_UJqEs<xOia6pM0KT2jHj96_x<_M}5RJb(LkwRZDXt!giSP+PtA zUNz2j)iE<yHj{bA2A6TRH*%2yo|7R8J?D7z`1tJ}cj7#xif~B+ZU_By4iztcapPfO z>6`WM8ecc|%hw;2-u`9$L1}3}wRBn%dces^`Wyl{-B`iBYmI>n`YQ;v(H0gKNMx{d zR#hWCNDl&PP;;->v7wcD!f0x*cZxw&>6$1&K0d!vUH-7TY_Gh(xcbrjay3TV#Rb-8 z0gv<%wC<+F5Y&lty4b8U73YC`5aJzQc_;W2daH>WgFw!L+d+>Dr5~>Rc=h|M`-Q1P zWE3y|G;)9Z-uV5}z0%{{rLSg=Ok*bVXXe5ujW0_F8S*4;q%Z%^NEE|*-y`6*M{XvX zJ@%!w#EUxnywZdoU*cYZK+b_X&D7+7GPOVa>Otl;P1WRSs-Ra_Z+aTLsDsPKc42`< zg1L@jw6fU6@;sn;?9`{(Znm3JT!bc9;F22g4*I=tA$emt8)t1B&Z2F1^`XC&$w}#o zAlaXO_Qb}Y=B{`DsBVaH$Z9>xGPoxu#`tf;z^S7g!ui7t#&d_cEPfXsj+*%LVbR2s LM@0h<CvX23RbZvc diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-312.pyc deleted file mode 100644 index c2ad90757191f32da26d67343e5b11e0b57c5157..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11586 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 O5$73?^)ojE&;JG4aD18o diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-312.pyc deleted file mode 100644 index 579b1351f2ada73a7be5f6cfda0efc107d0ab6a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5741 zcmd5Ae{2)i`JH{X&u7PWoL>Zz@F=0+5Nx0lMS;?#BtS}VTL{p4bf=5&a4tFf+`Dr^ zjH6`}QjJ6h{4tTL+L}p|8k9<;f0b#{x_>5B+aHTbrdTH`RqFZ&|Aj)eiof=~^PQcB zbZnC*?L~R_-uK@7e!cJe-uL-0b#*L)mi+bQk%fAMz9JL5xvasX85rC`0!ko(5*#v> zb|f4W89QZX!U<nmrqiy3%Y?aPciNqB!`Ll&WKWt&Fy@$%y=gYVQpkZs=V-G{r1llO zqJQ2|nVY*@V%<DdnI{4cbQ}rn6(smXX5MK*gOkpPKmSuUJ~Vg=^ErJ)%;-{**QHDf zXB9>6#z`fktI}{z7X>^#iA7Z!ONxT1YP!m2Sav|uaw6WoZ*Mo&M6m~t=z6v%7E3CE z7)>ckN*1F@B^}Gga;hv#!!N`nazKj-qRvb5%aZWYzP;=N!cBxSg8Z<i$Uusd(pg2- z;{fxfM14?6r9>4bbVirc4~U2`X*e-7^!k~jN+u&FbxFy*4*U`%>%jbWP{GiMh<92n z07IroQG$#Jxf7=qAt#Gi(y$<ARS^^b(()MrPe`(ihefQ4X=NN>QU+UC@c91dUVzIY zuZi7ND4@tFI_8G~ovvUlmnDK=Nyk}L$%?8xi3Ly?EU9o%$!J)XG(rt9o2sd(Py-#N zBz+_|Y^u*zp8d6yxPSk_{ZTw{5l<>P%&Q{iaZVFetX#zU2ykMFl{I;Un@p$SdI=@C zXH3SRHA0$PNi<n8iArzT2YU1h%-;pu6;Xl$`*jEu*sCK!7tuwq-YZPPCD2z;!tF)& zpWrsvTvxmaPZ3?B63iJC@fcxZV&A{4{2MHWHjoAe2{#(396x1=N(PUExdE$0F4$pT z09>PW^QNhqxC|FDKrKnH5r%kS5dI(i0lHsOw~%i61VXyyEeI9Rd*H_fT0#ZaZ>e8U z6e>6ih_m&83KYz$SPRssZw&=&NPOG&zbSXYEjU|YWwh?;o%0q5aC+=j*zX|w0mf8e z4w!lE*(4ot<^N>LN%ThC6?8$YmdD_Xf|AB(PY+^H6uDn81kf7{dAM?on4b=Q0@n>* zOq3k0A~J0TwvbcjCBQSGnRe7o4h@4TPue!q_u8r6f%pY-Aj79cd{I%;yk5hUogkzL zo-D6v6N)O3Ehd1Rscn2hU3frlK_wRukFbUdJVjJh5=#w+<D`tFbDZI^WHdY~KS40S zzN{?ih70@(W^Ry~mof%zt~s(35yqf3QNE~>@Tj(s4uUc=XkJZehI?$n{IX;_m*rJm zGrSy^lz~}}(}>!MVxdhxxf~l&(qat6)5c?cN-}3!XiNu(PpN!*j|OpaOjP%PwlcE9 zLqv>?i<$8l1i4stQXf$=FGTn4k7<%F?#c4WF+K%RFDqqZ9BdO5wHgquXcV)fQ8YWL zhJcg&mZv=?YHQ{>*r5Fcy6>jZV?Xi+mIHXUv&8IO=v-ua?>>Kz=`FW(6zOaJa?2L; z)6{w^aWgSX&+<!6yNYbN8PC?=Os_OYO3jg_=H0NzS8nW>dFSRS7<$X$#v=Wm=Mhjq z$*Q}+gqSOFibu!X<Vh=lgO9>=eG{lWn0?a0RTpZmHfleM)is0!F!YV^02Jt~Zvd^j zNNsK2a!+_HodPXUQ<UJEatQ7zr(Si|AH?Uc;ju>_d#cV%3ye-eh}lNT?W}8nH@pr6 z(|JpCd5{4Dh~qH8o}mYCfwHMW2%<-up2jM$8_O>MjhYVNEHVFe%?><ME}g_0vlU#U zo9%J!Yx6$keg?-rINw$~XO95dVUKHHJMo~Nr3Zh(UDLxeIH&_!+iEoIkr1$Ds9^#f zxi}IL%vNw0Dj|A@4XJ&FpnZDEBcLg!;ORqe!_7~53tj;Uq0LCBAKL|9NL}*-BqX5C zu<KfwMg?ZNQQv7}62b-N2b9oY)B1q=6>VewIkm>B0N46fVC<b2AWlxPQ@%C(yVmap z8zYv{y#XAJMmL1+-2m#FxBPR;FE9oF|E29#pY07}$^XbA|6Px%S=)bSx3-Uhl?67V z8n%u7OlTZ?5nj2Me_*wV*r@7TV~@?YO@Z~*th8n0^I*A~U}XbO{=OZ5->;q_cdN|- ziExk{ZjP$~FvR=|XLNXyN$FuGfo2|0>JK~1%P3L2L#QRlJG32|!PauhC+ta4%<k!x zrE$@y>xJ}4QKdW-GfE~OnwXf_v!=iiBMyTeQ8eA4NrImDm?U>-`G(WtJ5ZqLctj+R zy4Hh%i1T>=P`>%JsAVBzhtx{v^_;l^i}}VXe9e)3OBE{cI#00RA4j9nw;u>ZR7W>{ zK-?_vGU?`hXEWlZY$ZR-hoLsGC{-}_;0K?>X6YupC!nQDVyB9umHldk;T}ApDxf=( z+nC82BwltFmTx(4uE7$?32pQ}_z8vc%{2{T5FGM7NgEM`NUIUd<kDR20zeP4k}_O^ zIGjtV+kqo9xl$Q2>LeWz$!JePX#+JJk&KJ?AAfCVpm(UBJJo;YOz-i2mAsRX&sCT< zd{Exm>=?8lC3VANsnKv(^lZ2*rIJCzS1=qGvuXpu;qAYa6tm=ZjW)>TG>hWV6TO3j z{qf^fiUwZGQ198H6aDd_fun1AGP6bU)S4+{q)y#L#`_2r7C7Z992q{ssXd{IVhksM z2!q;)pc-LfVAeV}&dXp&M*UMTgVKy(<r0sM@UkpsQlb%viz!8yKySxn9#U1tJeJl{ z8Yv&loYd~rcEXpJ%ZL-^<>cFlrfZi->fmT~m4tZhBM6w&Xw{9pbt_EUJ*I7zDlyys z#<bmMeAm5Ky=8xI*&kZ*<B}i4;QGMT0rDBVI{4V@^0KP|)QD%>7Q@k^r`*&@vd3LT z-`|5Bvwa^8{AOUG@6&-#29|?IiZqbey6fZ4m9D{3*Pw;sk<+o8eTW=e*`ntLTVl36 z20r|R>|%K5T+1@Eugv(b`>*<MoSo_WaPa-Xxy}X8GIOvT2(JV>N`a2004_T3*Eiir z-Wt0(wp9OI(QWa)819-odgs;KuikZj#{Q07W{y@DcFjExn5)y>b7$_ndHc<U<ow&q z%%N2Vg`11cYi{7TqjUCTseSKC`+-vXfdzf3{qQ2Qx!i^qnbvas_HU5G+g0o>2SYc) zH?|dXGoGd3)^g{LS$=kSw!akGw(5cnfX3gx=<EC<yv2C&l|LT){LsC=^NXQ3LG*^e zDst2X9<yk7Y^CdDsq19f-)^d;#Oy2vXF5O|jhj{)4wf1Ymi=31hCY1j{kP`mJHFe# zg`rQ+e{%kA26i{HMaI<a+^$l`eoK#4;r;_HR_^;>>FwjrIqlBn+n1NR4lOf>t28VH z&L{5DcN-S>ytK?5Df<G~d#?7(G~DyGm4o5y`K$SvGxvh{e)HBve0Hh%++ye)Xyk74 zv(ev=e!l&$U4QOcY&*LYKDX#U_ho$((SH?v*D|xa9Be51RPxp&Nl399sejFq;{*&y z{a&D_9TJ+N1*$*`m89C<yC$uKiXPH_l6FHSPZwN}fO+PvY8xIMXIv#Yql%%6I8~C} zSE^4B)YR}xO(x<sqk!Q~i|~*Lh7;fhJ*)_mmB0WY41O2`4`)<Skl;rn-3UP)DXKcB zL2b;D$3-QHu|@>2op;*wUiBD&@|!pCTZ_0x&K-g7J8;`Z<ZmdxTyEY}JYL4#aQXfc z(|$kLxZJdJuCWw6Q1*v!9Gz*LnV9n|Y+5{Y66__!g4KChQ<)K0JpO<vaA+vvCB-#) z9iX^oIj-^p5sdvD_fC$NtrZW)2}%;cZY?<iKh2o+sM-f8Ova5mt7cA$vdnQ2sv;&S zc79Y5kCgGIHn+e)I{@8xSI|R;!^ME-1)8RhJ*NGxrf=GMDOcla+<^k&a;UK!sxQ|! zm0R2YQ6F?cz<|!=-$WD%sc!%p!t}+Qo>M^pmB?f;P|{~0XV44}JWeSXsWiYVPZ3hd zg&Q4q0Up()OHuMmo)#s)6G7!K!S7Dy17^?!krD2*egK4L<$MLR8YlR6la9!B8&$X> zQTPdSxT3-%>IIk*4QQvKTXj+t_0U06^tUXcc7BC|U!eA{QPbDxxi8S+FHzkz^KRYG s>Q)_2SDXTsxLO|j+?3;C2zf#`m?d}XwDYk$MN#ZxYxlQ^3{0B;1UZpSP5=M^ diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc deleted file mode 100644 index 9e6004e9e6cc1330f309c568026934ff070c5d59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24472 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 Y%Sw(kS%2EdQ@FY4$X@GD_wWe+FT{&%&;S4c diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-312.pyc deleted file mode 100644 index 0f4bfb203662fb94dfa34ad31493944aa01e768e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35578 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 F|3Ak~`L6%~ diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-312.pyc deleted file mode 100644 index 1218315d6a4ef16a4366cf356d5fc09756112664..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7533 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py deleted file mode 100644 index 8765b90..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py +++ /dev/null @@ -1,36 +0,0 @@ -""" -This module provides means to detect the App Engine environment. -""" - -import os - - -def is_appengine(): - return is_local_appengine() or is_prod_appengine() - - -def is_appengine_sandbox(): - """Reports if the app is running in the first generation sandbox. - - The second generation runtimes are technically still in a sandbox, but it - is much less restrictive, so generally you shouldn't need to check for it. - see https://cloud.google.com/appengine/docs/standard/runtimes - """ - return is_appengine() and os.environ["APPENGINE_RUNTIME"] == "python27" - - -def is_local_appengine(): - return "APPENGINE_RUNTIME" in os.environ and os.environ.get( - "SERVER_SOFTWARE", "" - ).startswith("Development/") - - -def is_prod_appengine(): - return "APPENGINE_RUNTIME" in os.environ and os.environ.get( - "SERVER_SOFTWARE", "" - ).startswith("Google App Engine/") - - -def is_prod_appengine_mvms(): - """Deprecated.""" - return False diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 8cc93b45076179afe4466a24050e55810b7cab70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 237 zcmZ9GF=_)r3`KWr2aLf7NwF4*Tazkvt}u*eg?I4GXwYakEV)AZbm?;zAHydI?p#IN z=7aRV#1rVU-EJC{|NiJ_zs~KyZY$k<HB<9w-hLWh=yaQz`zQ325R#KR!Ylb9VU`Ml z5l`$=TP652a@)~+j^sLI7%`6!!x73PJ>~uG=^1JeY>V?}cftxK6tIeQ#4vDFb`PGi supZfpeqa=KxfWspYeNoV?XFDs^&wF=M10`~ea>jrIs7h-F}&3D2MpRpi~s-t diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-312.pyc deleted file mode 100644 index a0853a542e554eb0a3d88f90b0830a7c27010ef1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17449 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 am&FC)>ioYf&!=*gjmp)mTvs0M%>TcCNZ-}~ diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-312.pyc deleted file mode 100644 index 1f4e5e5f4947bd51d10601d76d96633e9ca14a3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14823 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py deleted file mode 100644 index 264d564..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py +++ /dev/null @@ -1,519 +0,0 @@ -""" -This module uses ctypes to bind a whole bunch of functions and constants from -SecureTransport. The goal here is to provide the low-level API to -SecureTransport. These are essentially the C-level functions and constants, and -they're pretty gross to work with. - -This code is a bastardised version of the code found in Will Bond's oscrypto -library. An enormous debt is owed to him for blazing this trail for us. For -that reason, this code should be considered to be covered both by urllib3's -license and by oscrypto's: - - Copyright (c) 2015-2016 Will Bond <will@wbond.net> - - 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. -""" -from __future__ import absolute_import - -import platform -from ctypes import ( - CDLL, - CFUNCTYPE, - POINTER, - c_bool, - c_byte, - c_char_p, - c_int32, - c_long, - c_size_t, - c_uint32, - c_ulong, - c_void_p, -) -from ctypes.util import find_library - -from ...packages.six import raise_from - -if platform.system() != "Darwin": - raise ImportError("Only macOS is supported") - -version = platform.mac_ver()[0] -version_info = tuple(map(int, version.split("."))) -if version_info < (10, 8): - raise OSError( - "Only OS X 10.8 and newer are supported, not %s.%s" - % (version_info[0], version_info[1]) - ) - - -def load_cdll(name, macos10_16_path): - """Loads a CDLL by name, falling back to known path on 10.16+""" - try: - # Big Sur is technically 11 but we use 10.16 due to the Big Sur - # beta being labeled as 10.16. - if version_info >= (10, 16): - path = macos10_16_path - else: - path = find_library(name) - if not path: - raise OSError # Caught and reraised as 'ImportError' - return CDLL(path, use_errno=True) - except OSError: - raise_from(ImportError("The library %s failed to load" % name), None) - - -Security = load_cdll( - "Security", "/System/Library/Frameworks/Security.framework/Security" -) -CoreFoundation = load_cdll( - "CoreFoundation", - "/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation", -) - - -Boolean = c_bool -CFIndex = c_long -CFStringEncoding = c_uint32 -CFData = c_void_p -CFString = c_void_p -CFArray = c_void_p -CFMutableArray = c_void_p -CFDictionary = c_void_p -CFError = c_void_p -CFType = c_void_p -CFTypeID = c_ulong - -CFTypeRef = POINTER(CFType) -CFAllocatorRef = c_void_p - -OSStatus = c_int32 - -CFDataRef = POINTER(CFData) -CFStringRef = POINTER(CFString) -CFArrayRef = POINTER(CFArray) -CFMutableArrayRef = POINTER(CFMutableArray) -CFDictionaryRef = POINTER(CFDictionary) -CFArrayCallBacks = c_void_p -CFDictionaryKeyCallBacks = c_void_p -CFDictionaryValueCallBacks = c_void_p - -SecCertificateRef = POINTER(c_void_p) -SecExternalFormat = c_uint32 -SecExternalItemType = c_uint32 -SecIdentityRef = POINTER(c_void_p) -SecItemImportExportFlags = c_uint32 -SecItemImportExportKeyParameters = c_void_p -SecKeychainRef = POINTER(c_void_p) -SSLProtocol = c_uint32 -SSLCipherSuite = c_uint32 -SSLContextRef = POINTER(c_void_p) -SecTrustRef = POINTER(c_void_p) -SSLConnectionRef = c_uint32 -SecTrustResultType = c_uint32 -SecTrustOptionFlags = c_uint32 -SSLProtocolSide = c_uint32 -SSLConnectionType = c_uint32 -SSLSessionOption = c_uint32 - - -try: - Security.SecItemImport.argtypes = [ - CFDataRef, - CFStringRef, - POINTER(SecExternalFormat), - POINTER(SecExternalItemType), - SecItemImportExportFlags, - POINTER(SecItemImportExportKeyParameters), - SecKeychainRef, - POINTER(CFArrayRef), - ] - Security.SecItemImport.restype = OSStatus - - Security.SecCertificateGetTypeID.argtypes = [] - Security.SecCertificateGetTypeID.restype = CFTypeID - - Security.SecIdentityGetTypeID.argtypes = [] - Security.SecIdentityGetTypeID.restype = CFTypeID - - Security.SecKeyGetTypeID.argtypes = [] - Security.SecKeyGetTypeID.restype = CFTypeID - - Security.SecCertificateCreateWithData.argtypes = [CFAllocatorRef, CFDataRef] - Security.SecCertificateCreateWithData.restype = SecCertificateRef - - Security.SecCertificateCopyData.argtypes = [SecCertificateRef] - Security.SecCertificateCopyData.restype = CFDataRef - - Security.SecCopyErrorMessageString.argtypes = [OSStatus, c_void_p] - Security.SecCopyErrorMessageString.restype = CFStringRef - - Security.SecIdentityCreateWithCertificate.argtypes = [ - CFTypeRef, - SecCertificateRef, - POINTER(SecIdentityRef), - ] - Security.SecIdentityCreateWithCertificate.restype = OSStatus - - Security.SecKeychainCreate.argtypes = [ - c_char_p, - c_uint32, - c_void_p, - Boolean, - c_void_p, - POINTER(SecKeychainRef), - ] - Security.SecKeychainCreate.restype = OSStatus - - Security.SecKeychainDelete.argtypes = [SecKeychainRef] - Security.SecKeychainDelete.restype = OSStatus - - Security.SecPKCS12Import.argtypes = [ - CFDataRef, - CFDictionaryRef, - POINTER(CFArrayRef), - ] - Security.SecPKCS12Import.restype = OSStatus - - SSLReadFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, c_void_p, POINTER(c_size_t)) - SSLWriteFunc = CFUNCTYPE( - OSStatus, SSLConnectionRef, POINTER(c_byte), POINTER(c_size_t) - ) - - Security.SSLSetIOFuncs.argtypes = [SSLContextRef, SSLReadFunc, SSLWriteFunc] - Security.SSLSetIOFuncs.restype = OSStatus - - Security.SSLSetPeerID.argtypes = [SSLContextRef, c_char_p, c_size_t] - Security.SSLSetPeerID.restype = OSStatus - - Security.SSLSetCertificate.argtypes = [SSLContextRef, CFArrayRef] - Security.SSLSetCertificate.restype = OSStatus - - Security.SSLSetCertificateAuthorities.argtypes = [SSLContextRef, CFTypeRef, Boolean] - Security.SSLSetCertificateAuthorities.restype = OSStatus - - Security.SSLSetConnection.argtypes = [SSLContextRef, SSLConnectionRef] - Security.SSLSetConnection.restype = OSStatus - - Security.SSLSetPeerDomainName.argtypes = [SSLContextRef, c_char_p, c_size_t] - Security.SSLSetPeerDomainName.restype = OSStatus - - Security.SSLHandshake.argtypes = [SSLContextRef] - Security.SSLHandshake.restype = OSStatus - - Security.SSLRead.argtypes = [SSLContextRef, c_char_p, c_size_t, POINTER(c_size_t)] - Security.SSLRead.restype = OSStatus - - Security.SSLWrite.argtypes = [SSLContextRef, c_char_p, c_size_t, POINTER(c_size_t)] - Security.SSLWrite.restype = OSStatus - - Security.SSLClose.argtypes = [SSLContextRef] - Security.SSLClose.restype = OSStatus - - Security.SSLGetNumberSupportedCiphers.argtypes = [SSLContextRef, POINTER(c_size_t)] - Security.SSLGetNumberSupportedCiphers.restype = OSStatus - - Security.SSLGetSupportedCiphers.argtypes = [ - SSLContextRef, - POINTER(SSLCipherSuite), - POINTER(c_size_t), - ] - Security.SSLGetSupportedCiphers.restype = OSStatus - - Security.SSLSetEnabledCiphers.argtypes = [ - SSLContextRef, - POINTER(SSLCipherSuite), - c_size_t, - ] - Security.SSLSetEnabledCiphers.restype = OSStatus - - Security.SSLGetNumberEnabledCiphers.argtype = [SSLContextRef, POINTER(c_size_t)] - Security.SSLGetNumberEnabledCiphers.restype = OSStatus - - Security.SSLGetEnabledCiphers.argtypes = [ - SSLContextRef, - POINTER(SSLCipherSuite), - POINTER(c_size_t), - ] - Security.SSLGetEnabledCiphers.restype = OSStatus - - Security.SSLGetNegotiatedCipher.argtypes = [SSLContextRef, POINTER(SSLCipherSuite)] - Security.SSLGetNegotiatedCipher.restype = OSStatus - - Security.SSLGetNegotiatedProtocolVersion.argtypes = [ - SSLContextRef, - POINTER(SSLProtocol), - ] - Security.SSLGetNegotiatedProtocolVersion.restype = OSStatus - - Security.SSLCopyPeerTrust.argtypes = [SSLContextRef, POINTER(SecTrustRef)] - Security.SSLCopyPeerTrust.restype = OSStatus - - Security.SecTrustSetAnchorCertificates.argtypes = [SecTrustRef, CFArrayRef] - Security.SecTrustSetAnchorCertificates.restype = OSStatus - - Security.SecTrustSetAnchorCertificatesOnly.argstypes = [SecTrustRef, Boolean] - Security.SecTrustSetAnchorCertificatesOnly.restype = OSStatus - - Security.SecTrustEvaluate.argtypes = [SecTrustRef, POINTER(SecTrustResultType)] - Security.SecTrustEvaluate.restype = OSStatus - - Security.SecTrustGetCertificateCount.argtypes = [SecTrustRef] - Security.SecTrustGetCertificateCount.restype = CFIndex - - Security.SecTrustGetCertificateAtIndex.argtypes = [SecTrustRef, CFIndex] - Security.SecTrustGetCertificateAtIndex.restype = SecCertificateRef - - Security.SSLCreateContext.argtypes = [ - CFAllocatorRef, - SSLProtocolSide, - SSLConnectionType, - ] - Security.SSLCreateContext.restype = SSLContextRef - - Security.SSLSetSessionOption.argtypes = [SSLContextRef, SSLSessionOption, Boolean] - Security.SSLSetSessionOption.restype = OSStatus - - Security.SSLSetProtocolVersionMin.argtypes = [SSLContextRef, SSLProtocol] - Security.SSLSetProtocolVersionMin.restype = OSStatus - - Security.SSLSetProtocolVersionMax.argtypes = [SSLContextRef, SSLProtocol] - Security.SSLSetProtocolVersionMax.restype = OSStatus - - try: - Security.SSLSetALPNProtocols.argtypes = [SSLContextRef, CFArrayRef] - Security.SSLSetALPNProtocols.restype = OSStatus - except AttributeError: - # Supported only in 10.12+ - pass - - Security.SecCopyErrorMessageString.argtypes = [OSStatus, c_void_p] - Security.SecCopyErrorMessageString.restype = CFStringRef - - Security.SSLReadFunc = SSLReadFunc - Security.SSLWriteFunc = SSLWriteFunc - Security.SSLContextRef = SSLContextRef - Security.SSLProtocol = SSLProtocol - Security.SSLCipherSuite = SSLCipherSuite - Security.SecIdentityRef = SecIdentityRef - Security.SecKeychainRef = SecKeychainRef - Security.SecTrustRef = SecTrustRef - Security.SecTrustResultType = SecTrustResultType - Security.SecExternalFormat = SecExternalFormat - Security.OSStatus = OSStatus - - Security.kSecImportExportPassphrase = CFStringRef.in_dll( - Security, "kSecImportExportPassphrase" - ) - Security.kSecImportItemIdentity = CFStringRef.in_dll( - Security, "kSecImportItemIdentity" - ) - - # CoreFoundation time! - CoreFoundation.CFRetain.argtypes = [CFTypeRef] - CoreFoundation.CFRetain.restype = CFTypeRef - - CoreFoundation.CFRelease.argtypes = [CFTypeRef] - CoreFoundation.CFRelease.restype = None - - CoreFoundation.CFGetTypeID.argtypes = [CFTypeRef] - CoreFoundation.CFGetTypeID.restype = CFTypeID - - CoreFoundation.CFStringCreateWithCString.argtypes = [ - CFAllocatorRef, - c_char_p, - CFStringEncoding, - ] - CoreFoundation.CFStringCreateWithCString.restype = CFStringRef - - CoreFoundation.CFStringGetCStringPtr.argtypes = [CFStringRef, CFStringEncoding] - CoreFoundation.CFStringGetCStringPtr.restype = c_char_p - - CoreFoundation.CFStringGetCString.argtypes = [ - CFStringRef, - c_char_p, - CFIndex, - CFStringEncoding, - ] - CoreFoundation.CFStringGetCString.restype = c_bool - - CoreFoundation.CFDataCreate.argtypes = [CFAllocatorRef, c_char_p, CFIndex] - CoreFoundation.CFDataCreate.restype = CFDataRef - - CoreFoundation.CFDataGetLength.argtypes = [CFDataRef] - CoreFoundation.CFDataGetLength.restype = CFIndex - - CoreFoundation.CFDataGetBytePtr.argtypes = [CFDataRef] - CoreFoundation.CFDataGetBytePtr.restype = c_void_p - - CoreFoundation.CFDictionaryCreate.argtypes = [ - CFAllocatorRef, - POINTER(CFTypeRef), - POINTER(CFTypeRef), - CFIndex, - CFDictionaryKeyCallBacks, - CFDictionaryValueCallBacks, - ] - CoreFoundation.CFDictionaryCreate.restype = CFDictionaryRef - - CoreFoundation.CFDictionaryGetValue.argtypes = [CFDictionaryRef, CFTypeRef] - CoreFoundation.CFDictionaryGetValue.restype = CFTypeRef - - CoreFoundation.CFArrayCreate.argtypes = [ - CFAllocatorRef, - POINTER(CFTypeRef), - CFIndex, - CFArrayCallBacks, - ] - CoreFoundation.CFArrayCreate.restype = CFArrayRef - - CoreFoundation.CFArrayCreateMutable.argtypes = [ - CFAllocatorRef, - CFIndex, - CFArrayCallBacks, - ] - CoreFoundation.CFArrayCreateMutable.restype = CFMutableArrayRef - - CoreFoundation.CFArrayAppendValue.argtypes = [CFMutableArrayRef, c_void_p] - CoreFoundation.CFArrayAppendValue.restype = None - - CoreFoundation.CFArrayGetCount.argtypes = [CFArrayRef] - CoreFoundation.CFArrayGetCount.restype = CFIndex - - CoreFoundation.CFArrayGetValueAtIndex.argtypes = [CFArrayRef, CFIndex] - CoreFoundation.CFArrayGetValueAtIndex.restype = c_void_p - - CoreFoundation.kCFAllocatorDefault = CFAllocatorRef.in_dll( - CoreFoundation, "kCFAllocatorDefault" - ) - CoreFoundation.kCFTypeArrayCallBacks = c_void_p.in_dll( - CoreFoundation, "kCFTypeArrayCallBacks" - ) - CoreFoundation.kCFTypeDictionaryKeyCallBacks = c_void_p.in_dll( - CoreFoundation, "kCFTypeDictionaryKeyCallBacks" - ) - CoreFoundation.kCFTypeDictionaryValueCallBacks = c_void_p.in_dll( - CoreFoundation, "kCFTypeDictionaryValueCallBacks" - ) - - CoreFoundation.CFTypeRef = CFTypeRef - CoreFoundation.CFArrayRef = CFArrayRef - CoreFoundation.CFStringRef = CFStringRef - CoreFoundation.CFDictionaryRef = CFDictionaryRef - -except (AttributeError): - raise ImportError("Error initializing ctypes") - - -class CFConst(object): - """ - A class object that acts as essentially a namespace for CoreFoundation - constants. - """ - - kCFStringEncodingUTF8 = CFStringEncoding(0x08000100) - - -class SecurityConst(object): - """ - A class object that acts as essentially a namespace for Security constants. - """ - - kSSLSessionOptionBreakOnServerAuth = 0 - - kSSLProtocol2 = 1 - kSSLProtocol3 = 2 - kTLSProtocol1 = 4 - kTLSProtocol11 = 7 - kTLSProtocol12 = 8 - # SecureTransport does not support TLS 1.3 even if there's a constant for it - kTLSProtocol13 = 10 - kTLSProtocolMaxSupported = 999 - - kSSLClientSide = 1 - kSSLStreamType = 0 - - kSecFormatPEMSequence = 10 - - kSecTrustResultInvalid = 0 - kSecTrustResultProceed = 1 - # This gap is present on purpose: this was kSecTrustResultConfirm, which - # is deprecated. - kSecTrustResultDeny = 3 - kSecTrustResultUnspecified = 4 - kSecTrustResultRecoverableTrustFailure = 5 - kSecTrustResultFatalTrustFailure = 6 - kSecTrustResultOtherError = 7 - - errSSLProtocol = -9800 - errSSLWouldBlock = -9803 - errSSLClosedGraceful = -9805 - errSSLClosedNoNotify = -9816 - errSSLClosedAbort = -9806 - - errSSLXCertChainInvalid = -9807 - errSSLCrypto = -9809 - errSSLInternal = -9810 - errSSLCertExpired = -9814 - errSSLCertNotYetValid = -9815 - errSSLUnknownRootCert = -9812 - errSSLNoRootCert = -9813 - errSSLHostNameMismatch = -9843 - errSSLPeerHandshakeFail = -9824 - errSSLPeerUserCancelled = -9839 - errSSLWeakPeerEphemeralDHKey = -9850 - errSSLServerAuthCompleted = -9841 - errSSLRecordOverflow = -9847 - - errSecVerifyFailed = -67808 - errSecNoTrustSettings = -25263 - errSecItemNotFound = -25300 - errSecInvalidTrustSettings = -25262 - - # Cipher suites. We only pick the ones our default cipher string allows. - # Source: https://developer.apple.com/documentation/security/1550981-ssl_cipher_suite_values - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = 0xC02C - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 = 0xC030 - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02B - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 = 0xC02F - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 = 0xCCA9 - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 = 0xCCA8 - TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 = 0x009F - TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 = 0x009E - TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 = 0xC024 - TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 = 0xC028 - TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA = 0xC00A - TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA = 0xC014 - TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 = 0x006B - TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 0x0039 - TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 = 0xC023 - TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 = 0xC027 - TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA = 0xC009 - TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA = 0xC013 - TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 = 0x0067 - TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 0x0033 - TLS_RSA_WITH_AES_256_GCM_SHA384 = 0x009D - TLS_RSA_WITH_AES_128_GCM_SHA256 = 0x009C - TLS_RSA_WITH_AES_256_CBC_SHA256 = 0x003D - TLS_RSA_WITH_AES_128_CBC_SHA256 = 0x003C - TLS_RSA_WITH_AES_256_CBC_SHA = 0x0035 - TLS_RSA_WITH_AES_128_CBC_SHA = 0x002F - TLS_AES_128_GCM_SHA256 = 0x1301 - TLS_AES_256_GCM_SHA384 = 0x1302 - TLS_AES_128_CCM_8_SHA256 = 0x1305 - TLS_AES_128_CCM_SHA256 = 0x1304 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py deleted file mode 100644 index fa0b245..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py +++ /dev/null @@ -1,397 +0,0 @@ -""" -Low-level helpers for the SecureTransport bindings. - -These are Python functions that are not directly related to the high-level APIs -but are necessary to get them to work. They include a whole bunch of low-level -CoreFoundation messing about and memory management. The concerns in this module -are almost entirely about trying to avoid memory leaks and providing -appropriate and useful assistance to the higher-level code. -""" -import base64 -import ctypes -import itertools -import os -import re -import ssl -import struct -import tempfile - -from .bindings import CFConst, CoreFoundation, Security - -# This regular expression is used to grab PEM data out of a PEM bundle. -_PEM_CERTS_RE = re.compile( - b"-----BEGIN CERTIFICATE-----\n(.*?)\n-----END CERTIFICATE-----", re.DOTALL -) - - -def _cf_data_from_bytes(bytestring): - """ - Given a bytestring, create a CFData object from it. This CFData object must - be CFReleased by the caller. - """ - return CoreFoundation.CFDataCreate( - CoreFoundation.kCFAllocatorDefault, bytestring, len(bytestring) - ) - - -def _cf_dictionary_from_tuples(tuples): - """ - Given a list of Python tuples, create an associated CFDictionary. - """ - dictionary_size = len(tuples) - - # We need to get the dictionary keys and values out in the same order. - keys = (t[0] for t in tuples) - values = (t[1] for t in tuples) - cf_keys = (CoreFoundation.CFTypeRef * dictionary_size)(*keys) - cf_values = (CoreFoundation.CFTypeRef * dictionary_size)(*values) - - return CoreFoundation.CFDictionaryCreate( - CoreFoundation.kCFAllocatorDefault, - cf_keys, - cf_values, - dictionary_size, - CoreFoundation.kCFTypeDictionaryKeyCallBacks, - CoreFoundation.kCFTypeDictionaryValueCallBacks, - ) - - -def _cfstr(py_bstr): - """ - Given a Python binary data, create a CFString. - The string must be CFReleased by the caller. - """ - c_str = ctypes.c_char_p(py_bstr) - cf_str = CoreFoundation.CFStringCreateWithCString( - CoreFoundation.kCFAllocatorDefault, - c_str, - CFConst.kCFStringEncodingUTF8, - ) - return cf_str - - -def _create_cfstring_array(lst): - """ - Given a list of Python binary data, create an associated CFMutableArray. - The array must be CFReleased by the caller. - - Raises an ssl.SSLError on failure. - """ - cf_arr = None - try: - cf_arr = CoreFoundation.CFArrayCreateMutable( - CoreFoundation.kCFAllocatorDefault, - 0, - ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks), - ) - if not cf_arr: - raise MemoryError("Unable to allocate memory!") - for item in lst: - cf_str = _cfstr(item) - if not cf_str: - raise MemoryError("Unable to allocate memory!") - try: - CoreFoundation.CFArrayAppendValue(cf_arr, cf_str) - finally: - CoreFoundation.CFRelease(cf_str) - except BaseException as e: - if cf_arr: - CoreFoundation.CFRelease(cf_arr) - raise ssl.SSLError("Unable to allocate array: %s" % (e,)) - return cf_arr - - -def _cf_string_to_unicode(value): - """ - Creates a Unicode string from a CFString object. Used entirely for error - reporting. - - Yes, it annoys me quite a lot that this function is this complex. - """ - value_as_void_p = ctypes.cast(value, ctypes.POINTER(ctypes.c_void_p)) - - string = CoreFoundation.CFStringGetCStringPtr( - value_as_void_p, CFConst.kCFStringEncodingUTF8 - ) - if string is None: - buffer = ctypes.create_string_buffer(1024) - result = CoreFoundation.CFStringGetCString( - value_as_void_p, buffer, 1024, CFConst.kCFStringEncodingUTF8 - ) - if not result: - raise OSError("Error copying C string from CFStringRef") - string = buffer.value - if string is not None: - string = string.decode("utf-8") - return string - - -def _assert_no_error(error, exception_class=None): - """ - Checks the return code and throws an exception if there is an error to - report - """ - if error == 0: - return - - cf_error_string = Security.SecCopyErrorMessageString(error, None) - output = _cf_string_to_unicode(cf_error_string) - CoreFoundation.CFRelease(cf_error_string) - - if output is None or output == u"": - output = u"OSStatus %s" % error - - if exception_class is None: - exception_class = ssl.SSLError - - raise exception_class(output) - - -def _cert_array_from_pem(pem_bundle): - """ - Given a bundle of certs in PEM format, turns them into a CFArray of certs - that can be used to validate a cert chain. - """ - # Normalize the PEM bundle's line endings. - pem_bundle = pem_bundle.replace(b"\r\n", b"\n") - - der_certs = [ - base64.b64decode(match.group(1)) for match in _PEM_CERTS_RE.finditer(pem_bundle) - ] - if not der_certs: - raise ssl.SSLError("No root certificates specified") - - cert_array = CoreFoundation.CFArrayCreateMutable( - CoreFoundation.kCFAllocatorDefault, - 0, - ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks), - ) - if not cert_array: - raise ssl.SSLError("Unable to allocate memory!") - - try: - for der_bytes in der_certs: - certdata = _cf_data_from_bytes(der_bytes) - if not certdata: - raise ssl.SSLError("Unable to allocate memory!") - cert = Security.SecCertificateCreateWithData( - CoreFoundation.kCFAllocatorDefault, certdata - ) - CoreFoundation.CFRelease(certdata) - if not cert: - raise ssl.SSLError("Unable to build cert object!") - - CoreFoundation.CFArrayAppendValue(cert_array, cert) - CoreFoundation.CFRelease(cert) - except Exception: - # We need to free the array before the exception bubbles further. - # We only want to do that if an error occurs: otherwise, the caller - # should free. - CoreFoundation.CFRelease(cert_array) - raise - - return cert_array - - -def _is_cert(item): - """ - Returns True if a given CFTypeRef is a certificate. - """ - expected = Security.SecCertificateGetTypeID() - return CoreFoundation.CFGetTypeID(item) == expected - - -def _is_identity(item): - """ - Returns True if a given CFTypeRef is an identity. - """ - expected = Security.SecIdentityGetTypeID() - return CoreFoundation.CFGetTypeID(item) == expected - - -def _temporary_keychain(): - """ - This function creates a temporary Mac keychain that we can use to work with - credentials. This keychain uses a one-time password and a temporary file to - store the data. We expect to have one keychain per socket. The returned - SecKeychainRef must be freed by the caller, including calling - SecKeychainDelete. - - Returns a tuple of the SecKeychainRef and the path to the temporary - directory that contains it. - """ - # Unfortunately, SecKeychainCreate requires a path to a keychain. This - # means we cannot use mkstemp to use a generic temporary file. Instead, - # we're going to create a temporary directory and a filename to use there. - # This filename will be 8 random bytes expanded into base64. We also need - # some random bytes to password-protect the keychain we're creating, so we - # ask for 40 random bytes. - random_bytes = os.urandom(40) - filename = base64.b16encode(random_bytes[:8]).decode("utf-8") - password = base64.b16encode(random_bytes[8:]) # Must be valid UTF-8 - tempdirectory = tempfile.mkdtemp() - - keychain_path = os.path.join(tempdirectory, filename).encode("utf-8") - - # We now want to create the keychain itself. - keychain = Security.SecKeychainRef() - status = Security.SecKeychainCreate( - keychain_path, len(password), password, False, None, ctypes.byref(keychain) - ) - _assert_no_error(status) - - # Having created the keychain, we want to pass it off to the caller. - return keychain, tempdirectory - - -def _load_items_from_file(keychain, path): - """ - Given a single file, loads all the trust objects from it into arrays and - the keychain. - Returns a tuple of lists: the first list is a list of identities, the - second a list of certs. - """ - certificates = [] - identities = [] - result_array = None - - with open(path, "rb") as f: - raw_filedata = f.read() - - try: - filedata = CoreFoundation.CFDataCreate( - CoreFoundation.kCFAllocatorDefault, raw_filedata, len(raw_filedata) - ) - result_array = CoreFoundation.CFArrayRef() - result = Security.SecItemImport( - filedata, # cert data - None, # Filename, leaving it out for now - None, # What the type of the file is, we don't care - None, # what's in the file, we don't care - 0, # import flags - None, # key params, can include passphrase in the future - keychain, # The keychain to insert into - ctypes.byref(result_array), # Results - ) - _assert_no_error(result) - - # A CFArray is not very useful to us as an intermediary - # representation, so we are going to extract the objects we want - # and then free the array. We don't need to keep hold of keys: the - # keychain already has them! - result_count = CoreFoundation.CFArrayGetCount(result_array) - for index in range(result_count): - item = CoreFoundation.CFArrayGetValueAtIndex(result_array, index) - item = ctypes.cast(item, CoreFoundation.CFTypeRef) - - if _is_cert(item): - CoreFoundation.CFRetain(item) - certificates.append(item) - elif _is_identity(item): - CoreFoundation.CFRetain(item) - identities.append(item) - finally: - if result_array: - CoreFoundation.CFRelease(result_array) - - CoreFoundation.CFRelease(filedata) - - return (identities, certificates) - - -def _load_client_cert_chain(keychain, *paths): - """ - Load certificates and maybe keys from a number of files. Has the end goal - of returning a CFArray containing one SecIdentityRef, and then zero or more - SecCertificateRef objects, suitable for use as a client certificate trust - chain. - """ - # Ok, the strategy. - # - # This relies on knowing that macOS will not give you a SecIdentityRef - # unless you have imported a key into a keychain. This is a somewhat - # artificial limitation of macOS (for example, it doesn't necessarily - # affect iOS), but there is nothing inside Security.framework that lets you - # get a SecIdentityRef without having a key in a keychain. - # - # So the policy here is we take all the files and iterate them in order. - # Each one will use SecItemImport to have one or more objects loaded from - # it. We will also point at a keychain that macOS can use to work with the - # private key. - # - # Once we have all the objects, we'll check what we actually have. If we - # already have a SecIdentityRef in hand, fab: we'll use that. Otherwise, - # we'll take the first certificate (which we assume to be our leaf) and - # ask the keychain to give us a SecIdentityRef with that cert's associated - # key. - # - # We'll then return a CFArray containing the trust chain: one - # SecIdentityRef and then zero-or-more SecCertificateRef objects. The - # responsibility for freeing this CFArray will be with the caller. This - # CFArray must remain alive for the entire connection, so in practice it - # will be stored with a single SSLSocket, along with the reference to the - # keychain. - certificates = [] - identities = [] - - # Filter out bad paths. - paths = (path for path in paths if path) - - try: - for file_path in paths: - new_identities, new_certs = _load_items_from_file(keychain, file_path) - identities.extend(new_identities) - certificates.extend(new_certs) - - # Ok, we have everything. The question is: do we have an identity? If - # not, we want to grab one from the first cert we have. - if not identities: - new_identity = Security.SecIdentityRef() - status = Security.SecIdentityCreateWithCertificate( - keychain, certificates[0], ctypes.byref(new_identity) - ) - _assert_no_error(status) - identities.append(new_identity) - - # We now want to release the original certificate, as we no longer - # need it. - CoreFoundation.CFRelease(certificates.pop(0)) - - # We now need to build a new CFArray that holds the trust chain. - trust_chain = CoreFoundation.CFArrayCreateMutable( - CoreFoundation.kCFAllocatorDefault, - 0, - ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks), - ) - for item in itertools.chain(identities, certificates): - # ArrayAppendValue does a CFRetain on the item. That's fine, - # because the finally block will release our other refs to them. - CoreFoundation.CFArrayAppendValue(trust_chain, item) - - return trust_chain - finally: - for obj in itertools.chain(identities, certificates): - CoreFoundation.CFRelease(obj) - - -TLS_PROTOCOL_VERSIONS = { - "SSLv2": (0, 2), - "SSLv3": (3, 0), - "TLSv1": (3, 1), - "TLSv1.1": (3, 2), - "TLSv1.2": (3, 3), -} - - -def _build_tls_unknown_ca_alert(version): - """ - Builds a TLS alert record for an unknown CA. - """ - ver_maj, ver_min = TLS_PROTOCOL_VERSIONS[version] - severity_fatal = 0x02 - description_unknown_ca = 0x30 - msg = struct.pack(">BB", severity_fatal, description_unknown_ca) - msg_len = len(msg) - record_type_alert = 0x15 - record = struct.pack(">BBBH", record_type_alert, ver_maj, ver_min, msg_len) + msg - return record diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/appengine.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/appengine.py deleted file mode 100644 index 1717ee2..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/appengine.py +++ /dev/null @@ -1,314 +0,0 @@ -""" -This module provides a pool manager that uses Google App Engine's -`URLFetch Service <https://cloud.google.com/appengine/docs/python/urlfetch>`_. - -Example usage:: - - from pip._vendor.urllib3 import PoolManager - from pip._vendor.urllib3.contrib.appengine import AppEngineManager, is_appengine_sandbox - - if is_appengine_sandbox(): - # AppEngineManager uses AppEngine's URLFetch API behind the scenes - http = AppEngineManager() - else: - # PoolManager uses a socket-level API behind the scenes - http = PoolManager() - - r = http.request('GET', 'https://google.com/') - -There are `limitations <https://cloud.google.com/appengine/docs/python/\ -urlfetch/#Python_Quotas_and_limits>`_ to the URLFetch service and it may not be -the best choice for your application. There are three options for using -urllib3 on Google App Engine: - -1. You can use :class:`AppEngineManager` with URLFetch. URLFetch is - cost-effective in many circumstances as long as your usage is within the - limitations. -2. You can use a normal :class:`~urllib3.PoolManager` by enabling sockets. - Sockets also have `limitations and restrictions - <https://cloud.google.com/appengine/docs/python/sockets/\ - #limitations-and-restrictions>`_ and have a lower free quota than URLFetch. - To use sockets, be sure to specify the following in your ``app.yaml``:: - - env_variables: - GAE_USE_SOCKETS_HTTPLIB : 'true' - -3. If you are using `App Engine Flexible -<https://cloud.google.com/appengine/docs/flexible/>`_, you can use the standard -:class:`PoolManager` without any configuration or special environment variables. -""" - -from __future__ import absolute_import - -import io -import logging -import warnings - -from ..exceptions import ( - HTTPError, - HTTPWarning, - MaxRetryError, - ProtocolError, - SSLError, - TimeoutError, -) -from ..packages.six.moves.urllib.parse import urljoin -from ..request import RequestMethods -from ..response import HTTPResponse -from ..util.retry import Retry -from ..util.timeout import Timeout -from . import _appengine_environ - -try: - from google.appengine.api import urlfetch -except ImportError: - urlfetch = None - - -log = logging.getLogger(__name__) - - -class AppEnginePlatformWarning(HTTPWarning): - pass - - -class AppEnginePlatformError(HTTPError): - pass - - -class AppEngineManager(RequestMethods): - """ - Connection manager for Google App Engine sandbox applications. - - This manager uses the URLFetch service directly instead of using the - emulated httplib, and is subject to URLFetch limitations as described in - the App Engine documentation `here - <https://cloud.google.com/appengine/docs/python/urlfetch>`_. - - Notably it will raise an :class:`AppEnginePlatformError` if: - * URLFetch is not available. - * If you attempt to use this on App Engine Flexible, as full socket - support is available. - * If a request size is more than 10 megabytes. - * If a response size is more than 32 megabytes. - * If you use an unsupported request method such as OPTIONS. - - Beyond those cases, it will raise normal urllib3 errors. - """ - - def __init__( - self, - headers=None, - retries=None, - validate_certificate=True, - urlfetch_retries=True, - ): - if not urlfetch: - raise AppEnginePlatformError( - "URLFetch is not available in this environment." - ) - - warnings.warn( - "urllib3 is using URLFetch on Google App Engine sandbox instead " - "of sockets. To use sockets directly instead of URLFetch see " - "https://urllib3.readthedocs.io/en/1.26.x/reference/urllib3.contrib.html.", - AppEnginePlatformWarning, - ) - - RequestMethods.__init__(self, headers) - self.validate_certificate = validate_certificate - self.urlfetch_retries = urlfetch_retries - - self.retries = retries or Retry.DEFAULT - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - # Return False to re-raise any potential exceptions - return False - - def urlopen( - self, - method, - url, - body=None, - headers=None, - retries=None, - redirect=True, - timeout=Timeout.DEFAULT_TIMEOUT, - **response_kw - ): - - retries = self._get_retries(retries, redirect) - - try: - follow_redirects = redirect and retries.redirect != 0 and retries.total - response = urlfetch.fetch( - url, - payload=body, - method=method, - headers=headers or {}, - allow_truncated=False, - follow_redirects=self.urlfetch_retries and follow_redirects, - deadline=self._get_absolute_timeout(timeout), - validate_certificate=self.validate_certificate, - ) - except urlfetch.DeadlineExceededError as e: - raise TimeoutError(self, e) - - except urlfetch.InvalidURLError as e: - if "too large" in str(e): - raise AppEnginePlatformError( - "URLFetch request too large, URLFetch only " - "supports requests up to 10mb in size.", - e, - ) - raise ProtocolError(e) - - except urlfetch.DownloadError as e: - if "Too many redirects" in str(e): - raise MaxRetryError(self, url, reason=e) - raise ProtocolError(e) - - except urlfetch.ResponseTooLargeError as e: - raise AppEnginePlatformError( - "URLFetch response too large, URLFetch only supports" - "responses up to 32mb in size.", - e, - ) - - except urlfetch.SSLCertificateError as e: - raise SSLError(e) - - except urlfetch.InvalidMethodError as e: - raise AppEnginePlatformError( - "URLFetch does not support method: %s" % method, e - ) - - http_response = self._urlfetch_response_to_http_response( - response, retries=retries, **response_kw - ) - - # Handle redirect? - redirect_location = redirect and http_response.get_redirect_location() - if redirect_location: - # Check for redirect response - if self.urlfetch_retries and retries.raise_on_redirect: - raise MaxRetryError(self, url, "too many redirects") - else: - if http_response.status == 303: - method = "GET" - - try: - retries = retries.increment( - method, url, response=http_response, _pool=self - ) - except MaxRetryError: - if retries.raise_on_redirect: - raise MaxRetryError(self, url, "too many redirects") - return http_response - - retries.sleep_for_retry(http_response) - log.debug("Redirecting %s -> %s", url, redirect_location) - redirect_url = urljoin(url, redirect_location) - return self.urlopen( - method, - redirect_url, - body, - headers, - retries=retries, - redirect=redirect, - timeout=timeout, - **response_kw - ) - - # Check if we should retry the HTTP response. - has_retry_after = bool(http_response.headers.get("Retry-After")) - if retries.is_retry(method, http_response.status, has_retry_after): - retries = retries.increment(method, url, response=http_response, _pool=self) - log.debug("Retry: %s", url) - retries.sleep(http_response) - return self.urlopen( - method, - url, - body=body, - headers=headers, - retries=retries, - redirect=redirect, - timeout=timeout, - **response_kw - ) - - return http_response - - def _urlfetch_response_to_http_response(self, urlfetch_resp, **response_kw): - - if is_prod_appengine(): - # Production GAE handles deflate encoding automatically, but does - # not remove the encoding header. - content_encoding = urlfetch_resp.headers.get("content-encoding") - - if content_encoding == "deflate": - del urlfetch_resp.headers["content-encoding"] - - transfer_encoding = urlfetch_resp.headers.get("transfer-encoding") - # We have a full response's content, - # so let's make sure we don't report ourselves as chunked data. - if transfer_encoding == "chunked": - encodings = transfer_encoding.split(",") - encodings.remove("chunked") - urlfetch_resp.headers["transfer-encoding"] = ",".join(encodings) - - original_response = HTTPResponse( - # In order for decoding to work, we must present the content as - # a file-like object. - body=io.BytesIO(urlfetch_resp.content), - msg=urlfetch_resp.header_msg, - headers=urlfetch_resp.headers, - status=urlfetch_resp.status_code, - **response_kw - ) - - return HTTPResponse( - body=io.BytesIO(urlfetch_resp.content), - headers=urlfetch_resp.headers, - status=urlfetch_resp.status_code, - original_response=original_response, - **response_kw - ) - - def _get_absolute_timeout(self, timeout): - if timeout is Timeout.DEFAULT_TIMEOUT: - return None # Defer to URLFetch's default. - if isinstance(timeout, Timeout): - if timeout._read is not None or timeout._connect is not None: - warnings.warn( - "URLFetch does not support granular timeout settings, " - "reverting to total or default URLFetch timeout.", - AppEnginePlatformWarning, - ) - return timeout.total - return timeout - - def _get_retries(self, retries, redirect): - if not isinstance(retries, Retry): - retries = Retry.from_int(retries, redirect=redirect, default=self.retries) - - if retries.connect or retries.read or retries.redirect: - warnings.warn( - "URLFetch only supports total retries and does not " - "recognize connect, read, or redirect retry parameters.", - AppEnginePlatformWarning, - ) - - return retries - - -# Alias methods from _appengine_environ to maintain public API interface. - -is_appengine = _appengine_environ.is_appengine -is_appengine_sandbox = _appengine_environ.is_appengine_sandbox -is_local_appengine = _appengine_environ.is_local_appengine -is_prod_appengine = _appengine_environ.is_prod_appengine -is_prod_appengine_mvms = _appengine_environ.is_prod_appengine_mvms diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py deleted file mode 100644 index 4716657..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py +++ /dev/null @@ -1,130 +0,0 @@ -""" -NTLM authenticating pool, contributed by erikcederstran - -Issue #10, see: http://code.google.com/p/urllib3/issues/detail?id=10 -""" -from __future__ import absolute_import - -import warnings -from logging import getLogger - -from ntlm import ntlm - -from .. import HTTPSConnectionPool -from ..packages.six.moves.http_client import HTTPSConnection - -warnings.warn( - "The 'urllib3.contrib.ntlmpool' module is deprecated and will be removed " - "in urllib3 v2.0 release, urllib3 is not able to support it properly due " - "to reasons listed in issue: https://github.com/urllib3/urllib3/issues/2282. " - "If you are a user of this module please comment in the mentioned issue.", - DeprecationWarning, -) - -log = getLogger(__name__) - - -class NTLMConnectionPool(HTTPSConnectionPool): - """ - Implements an NTLM authentication version of an urllib3 connection pool - """ - - scheme = "https" - - def __init__(self, user, pw, authurl, *args, **kwargs): - """ - authurl is a random URL on the server that is protected by NTLM. - user is the Windows user, probably in the DOMAIN\\username format. - pw is the password for the user. - """ - super(NTLMConnectionPool, self).__init__(*args, **kwargs) - self.authurl = authurl - self.rawuser = user - user_parts = user.split("\\", 1) - self.domain = user_parts[0].upper() - self.user = user_parts[1] - self.pw = pw - - def _new_conn(self): - # Performs the NTLM handshake that secures the connection. The socket - # must be kept open while requests are performed. - self.num_connections += 1 - log.debug( - "Starting NTLM HTTPS connection no. %d: https://%s%s", - self.num_connections, - self.host, - self.authurl, - ) - - headers = {"Connection": "Keep-Alive"} - req_header = "Authorization" - resp_header = "www-authenticate" - - conn = HTTPSConnection(host=self.host, port=self.port) - - # Send negotiation message - headers[req_header] = "NTLM %s" % ntlm.create_NTLM_NEGOTIATE_MESSAGE( - self.rawuser - ) - log.debug("Request headers: %s", headers) - conn.request("GET", self.authurl, None, headers) - res = conn.getresponse() - reshdr = dict(res.headers) - log.debug("Response status: %s %s", res.status, res.reason) - log.debug("Response headers: %s", reshdr) - log.debug("Response data: %s [...]", res.read(100)) - - # Remove the reference to the socket, so that it can not be closed by - # the response object (we want to keep the socket open) - res.fp = None - - # Server should respond with a challenge message - auth_header_values = reshdr[resp_header].split(", ") - auth_header_value = None - for s in auth_header_values: - if s[:5] == "NTLM ": - auth_header_value = s[5:] - if auth_header_value is None: - raise Exception( - "Unexpected %s response header: %s" % (resp_header, reshdr[resp_header]) - ) - - # Send authentication message - ServerChallenge, NegotiateFlags = ntlm.parse_NTLM_CHALLENGE_MESSAGE( - auth_header_value - ) - auth_msg = ntlm.create_NTLM_AUTHENTICATE_MESSAGE( - ServerChallenge, self.user, self.domain, self.pw, NegotiateFlags - ) - headers[req_header] = "NTLM %s" % auth_msg - log.debug("Request headers: %s", headers) - conn.request("GET", self.authurl, None, headers) - res = conn.getresponse() - log.debug("Response status: %s %s", res.status, res.reason) - log.debug("Response headers: %s", dict(res.headers)) - log.debug("Response data: %s [...]", res.read()[:100]) - if res.status != 200: - if res.status == 401: - raise Exception("Server rejected request: wrong username or password") - raise Exception("Wrong server response: %s %s" % (res.status, res.reason)) - - res.fp = None - log.debug("Connection established") - return conn - - def urlopen( - self, - method, - url, - body=None, - headers=None, - retries=3, - redirect=True, - assert_same_host=True, - ): - if headers is None: - headers = {} - headers["Connection"] = "Keep-Alive" - return super(NTLMConnectionPool, self).urlopen( - method, url, body, headers, retries, redirect, assert_same_host - ) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py deleted file mode 100644 index 19e4aa9..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py +++ /dev/null @@ -1,518 +0,0 @@ -""" -TLS with SNI_-support for Python 2. Follow these instructions if you would -like to verify TLS certificates in Python 2. Note, the default libraries do -*not* do certificate checking; you need to do additional work to validate -certificates yourself. - -This needs the following packages installed: - -* `pyOpenSSL`_ (tested with 16.0.0) -* `cryptography`_ (minimum 1.3.4, from pyopenssl) -* `idna`_ (minimum 2.0, from cryptography) - -However, pyopenssl depends on cryptography, which depends on idna, so while we -use all three directly here we end up having relatively few packages required. - -You can install them with the following command: - -.. code-block:: bash - - $ python -m pip install pyopenssl cryptography idna - -To activate certificate checking, call -:func:`~urllib3.contrib.pyopenssl.inject_into_urllib3` from your Python code -before you begin making HTTP requests. This can be done in a ``sitecustomize`` -module, or at any other time before your application begins using ``urllib3``, -like this: - -.. code-block:: python - - try: - import pip._vendor.urllib3.contrib.pyopenssl as pyopenssl - pyopenssl.inject_into_urllib3() - except ImportError: - pass - -Now you can use :mod:`urllib3` as you normally would, and it will support SNI -when the required modules are installed. - -Activating this module also has the positive side effect of disabling SSL/TLS -compression in Python 2 (see `CRIME attack`_). - -.. _sni: https://en.wikipedia.org/wiki/Server_Name_Indication -.. _crime attack: https://en.wikipedia.org/wiki/CRIME_(security_exploit) -.. _pyopenssl: https://www.pyopenssl.org -.. _cryptography: https://cryptography.io -.. _idna: https://github.com/kjd/idna -""" -from __future__ import absolute_import - -import OpenSSL.crypto -import OpenSSL.SSL -from cryptography import x509 -from cryptography.hazmat.backends.openssl import backend as openssl_backend - -try: - from cryptography.x509 import UnsupportedExtension -except ImportError: - # UnsupportedExtension is gone in cryptography >= 2.1.0 - class UnsupportedExtension(Exception): - pass - - -from io import BytesIO -from socket import error as SocketError -from socket import timeout - -try: # Platform-specific: Python 2 - from socket import _fileobject -except ImportError: # Platform-specific: Python 3 - _fileobject = None - from ..packages.backports.makefile import backport_makefile - -import logging -import ssl -import sys -import warnings - -from .. import util -from ..packages import six -from ..util.ssl_ import PROTOCOL_TLS_CLIENT - -warnings.warn( - "'urllib3.contrib.pyopenssl' module is deprecated and will be removed " - "in a future release of urllib3 2.x. Read more in this issue: " - "https://github.com/urllib3/urllib3/issues/2680", - category=DeprecationWarning, - stacklevel=2, -) - -__all__ = ["inject_into_urllib3", "extract_from_urllib3"] - -# SNI always works. -HAS_SNI = True - -# Map from urllib3 to PyOpenSSL compatible parameter-values. -_openssl_versions = { - util.PROTOCOL_TLS: OpenSSL.SSL.SSLv23_METHOD, - PROTOCOL_TLS_CLIENT: OpenSSL.SSL.SSLv23_METHOD, - ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD, -} - -if hasattr(ssl, "PROTOCOL_SSLv3") and hasattr(OpenSSL.SSL, "SSLv3_METHOD"): - _openssl_versions[ssl.PROTOCOL_SSLv3] = OpenSSL.SSL.SSLv3_METHOD - -if hasattr(ssl, "PROTOCOL_TLSv1_1") and hasattr(OpenSSL.SSL, "TLSv1_1_METHOD"): - _openssl_versions[ssl.PROTOCOL_TLSv1_1] = OpenSSL.SSL.TLSv1_1_METHOD - -if hasattr(ssl, "PROTOCOL_TLSv1_2") and hasattr(OpenSSL.SSL, "TLSv1_2_METHOD"): - _openssl_versions[ssl.PROTOCOL_TLSv1_2] = OpenSSL.SSL.TLSv1_2_METHOD - - -_stdlib_to_openssl_verify = { - ssl.CERT_NONE: OpenSSL.SSL.VERIFY_NONE, - ssl.CERT_OPTIONAL: OpenSSL.SSL.VERIFY_PEER, - ssl.CERT_REQUIRED: OpenSSL.SSL.VERIFY_PEER - + OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT, -} -_openssl_to_stdlib_verify = dict((v, k) for k, v in _stdlib_to_openssl_verify.items()) - -# OpenSSL will only write 16K at a time -SSL_WRITE_BLOCKSIZE = 16384 - -orig_util_HAS_SNI = util.HAS_SNI -orig_util_SSLContext = util.ssl_.SSLContext - - -log = logging.getLogger(__name__) - - -def inject_into_urllib3(): - "Monkey-patch urllib3 with PyOpenSSL-backed SSL-support." - - _validate_dependencies_met() - - util.SSLContext = PyOpenSSLContext - util.ssl_.SSLContext = PyOpenSSLContext - util.HAS_SNI = HAS_SNI - util.ssl_.HAS_SNI = HAS_SNI - util.IS_PYOPENSSL = True - util.ssl_.IS_PYOPENSSL = True - - -def extract_from_urllib3(): - "Undo monkey-patching by :func:`inject_into_urllib3`." - - util.SSLContext = orig_util_SSLContext - util.ssl_.SSLContext = orig_util_SSLContext - util.HAS_SNI = orig_util_HAS_SNI - util.ssl_.HAS_SNI = orig_util_HAS_SNI - util.IS_PYOPENSSL = False - util.ssl_.IS_PYOPENSSL = False - - -def _validate_dependencies_met(): - """ - Verifies that PyOpenSSL's package-level dependencies have been met. - Throws `ImportError` if they are not met. - """ - # Method added in `cryptography==1.1`; not available in older versions - from cryptography.x509.extensions import Extensions - - if getattr(Extensions, "get_extension_for_class", None) is None: - raise ImportError( - "'cryptography' module missing required functionality. " - "Try upgrading to v1.3.4 or newer." - ) - - # pyOpenSSL 0.14 and above use cryptography for OpenSSL bindings. The _x509 - # attribute is only present on those versions. - from OpenSSL.crypto import X509 - - x509 = X509() - if getattr(x509, "_x509", None) is None: - raise ImportError( - "'pyOpenSSL' module missing required functionality. " - "Try upgrading to v0.14 or newer." - ) - - -def _dnsname_to_stdlib(name): - """ - Converts a dNSName SubjectAlternativeName field to the form used by the - standard library on the given Python version. - - Cryptography produces a dNSName as a unicode string that was idna-decoded - from ASCII bytes. We need to idna-encode that string to get it back, and - then on Python 3 we also need to convert to unicode via UTF-8 (the stdlib - uses PyUnicode_FromStringAndSize on it, which decodes via UTF-8). - - If the name cannot be idna-encoded then we return None signalling that - the name given should be skipped. - """ - - def idna_encode(name): - """ - Borrowed wholesale from the Python Cryptography Project. It turns out - that we can't just safely call `idna.encode`: it can explode for - wildcard names. This avoids that problem. - """ - from pip._vendor import idna - - try: - for prefix in [u"*.", u"."]: - if name.startswith(prefix): - name = name[len(prefix) :] - return prefix.encode("ascii") + idna.encode(name) - return idna.encode(name) - except idna.core.IDNAError: - return None - - # Don't send IPv6 addresses through the IDNA encoder. - if ":" in name: - return name - - name = idna_encode(name) - if name is None: - return None - elif sys.version_info >= (3, 0): - name = name.decode("utf-8") - return name - - -def get_subj_alt_name(peer_cert): - """ - Given an PyOpenSSL certificate, provides all the subject alternative names. - """ - # Pass the cert to cryptography, which has much better APIs for this. - if hasattr(peer_cert, "to_cryptography"): - cert = peer_cert.to_cryptography() - else: - der = OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_ASN1, peer_cert) - cert = x509.load_der_x509_certificate(der, openssl_backend) - - # We want to find the SAN extension. Ask Cryptography to locate it (it's - # faster than looping in Python) - try: - ext = cert.extensions.get_extension_for_class(x509.SubjectAlternativeName).value - except x509.ExtensionNotFound: - # No such extension, return the empty list. - return [] - except ( - x509.DuplicateExtension, - UnsupportedExtension, - x509.UnsupportedGeneralNameType, - UnicodeError, - ) as e: - # A problem has been found with the quality of the certificate. Assume - # no SAN field is present. - log.warning( - "A problem was encountered with the certificate that prevented " - "urllib3 from finding the SubjectAlternativeName field. This can " - "affect certificate validation. The error was %s", - e, - ) - return [] - - # We want to return dNSName and iPAddress fields. We need to cast the IPs - # back to strings because the match_hostname function wants them as - # strings. - # Sadly the DNS names need to be idna encoded and then, on Python 3, UTF-8 - # decoded. This is pretty frustrating, but that's what the standard library - # does with certificates, and so we need to attempt to do the same. - # We also want to skip over names which cannot be idna encoded. - names = [ - ("DNS", name) - for name in map(_dnsname_to_stdlib, ext.get_values_for_type(x509.DNSName)) - if name is not None - ] - names.extend( - ("IP Address", str(name)) for name in ext.get_values_for_type(x509.IPAddress) - ) - - return names - - -class WrappedSocket(object): - """API-compatibility wrapper for Python OpenSSL's Connection-class. - - Note: _makefile_refs, _drop() and _reuse() are needed for the garbage - collector of pypy. - """ - - def __init__(self, connection, socket, suppress_ragged_eofs=True): - self.connection = connection - self.socket = socket - self.suppress_ragged_eofs = suppress_ragged_eofs - self._makefile_refs = 0 - self._closed = False - - def fileno(self): - return self.socket.fileno() - - # Copy-pasted from Python 3.5 source code - def _decref_socketios(self): - if self._makefile_refs > 0: - self._makefile_refs -= 1 - if self._closed: - self.close() - - def recv(self, *args, **kwargs): - try: - data = self.connection.recv(*args, **kwargs) - except OpenSSL.SSL.SysCallError as e: - if self.suppress_ragged_eofs and e.args == (-1, "Unexpected EOF"): - return b"" - else: - raise SocketError(str(e)) - except OpenSSL.SSL.ZeroReturnError: - if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: - return b"" - else: - raise - except OpenSSL.SSL.WantReadError: - if not util.wait_for_read(self.socket, self.socket.gettimeout()): - raise timeout("The read operation timed out") - else: - return self.recv(*args, **kwargs) - - # TLS 1.3 post-handshake authentication - except OpenSSL.SSL.Error as e: - raise ssl.SSLError("read error: %r" % e) - else: - return data - - def recv_into(self, *args, **kwargs): - try: - return self.connection.recv_into(*args, **kwargs) - except OpenSSL.SSL.SysCallError as e: - if self.suppress_ragged_eofs and e.args == (-1, "Unexpected EOF"): - return 0 - else: - raise SocketError(str(e)) - except OpenSSL.SSL.ZeroReturnError: - if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: - return 0 - else: - raise - except OpenSSL.SSL.WantReadError: - if not util.wait_for_read(self.socket, self.socket.gettimeout()): - raise timeout("The read operation timed out") - else: - return self.recv_into(*args, **kwargs) - - # TLS 1.3 post-handshake authentication - except OpenSSL.SSL.Error as e: - raise ssl.SSLError("read error: %r" % e) - - def settimeout(self, timeout): - return self.socket.settimeout(timeout) - - def _send_until_done(self, data): - while True: - try: - return self.connection.send(data) - except OpenSSL.SSL.WantWriteError: - if not util.wait_for_write(self.socket, self.socket.gettimeout()): - raise timeout() - continue - except OpenSSL.SSL.SysCallError as e: - raise SocketError(str(e)) - - def sendall(self, data): - total_sent = 0 - while total_sent < len(data): - sent = self._send_until_done( - data[total_sent : total_sent + SSL_WRITE_BLOCKSIZE] - ) - total_sent += sent - - def shutdown(self): - # FIXME rethrow compatible exceptions should we ever use this - self.connection.shutdown() - - def close(self): - if self._makefile_refs < 1: - try: - self._closed = True - return self.connection.close() - except OpenSSL.SSL.Error: - return - else: - self._makefile_refs -= 1 - - def getpeercert(self, binary_form=False): - x509 = self.connection.get_peer_certificate() - - if not x509: - return x509 - - if binary_form: - return OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_ASN1, x509) - - return { - "subject": ((("commonName", x509.get_subject().CN),),), - "subjectAltName": get_subj_alt_name(x509), - } - - def version(self): - return self.connection.get_protocol_version_name() - - def _reuse(self): - self._makefile_refs += 1 - - def _drop(self): - if self._makefile_refs < 1: - self.close() - else: - self._makefile_refs -= 1 - - -if _fileobject: # Platform-specific: Python 2 - - def makefile(self, mode, bufsize=-1): - self._makefile_refs += 1 - return _fileobject(self, mode, bufsize, close=True) - -else: # Platform-specific: Python 3 - makefile = backport_makefile - -WrappedSocket.makefile = makefile - - -class PyOpenSSLContext(object): - """ - I am a wrapper class for the PyOpenSSL ``Context`` object. I am responsible - for translating the interface of the standard library ``SSLContext`` object - to calls into PyOpenSSL. - """ - - def __init__(self, protocol): - self.protocol = _openssl_versions[protocol] - self._ctx = OpenSSL.SSL.Context(self.protocol) - self._options = 0 - self.check_hostname = False - - @property - def options(self): - return self._options - - @options.setter - def options(self, value): - self._options = value - self._ctx.set_options(value) - - @property - def verify_mode(self): - return _openssl_to_stdlib_verify[self._ctx.get_verify_mode()] - - @verify_mode.setter - def verify_mode(self, value): - self._ctx.set_verify(_stdlib_to_openssl_verify[value], _verify_callback) - - def set_default_verify_paths(self): - self._ctx.set_default_verify_paths() - - def set_ciphers(self, ciphers): - if isinstance(ciphers, six.text_type): - ciphers = ciphers.encode("utf-8") - self._ctx.set_cipher_list(ciphers) - - def load_verify_locations(self, cafile=None, capath=None, cadata=None): - if cafile is not None: - cafile = cafile.encode("utf-8") - if capath is not None: - capath = capath.encode("utf-8") - try: - self._ctx.load_verify_locations(cafile, capath) - if cadata is not None: - self._ctx.load_verify_locations(BytesIO(cadata)) - except OpenSSL.SSL.Error as e: - raise ssl.SSLError("unable to load trusted certificates: %r" % e) - - def load_cert_chain(self, certfile, keyfile=None, password=None): - self._ctx.use_certificate_chain_file(certfile) - if password is not None: - if not isinstance(password, six.binary_type): - password = password.encode("utf-8") - self._ctx.set_passwd_cb(lambda *_: password) - self._ctx.use_privatekey_file(keyfile or certfile) - - def set_alpn_protocols(self, protocols): - protocols = [six.ensure_binary(p) for p in protocols] - return self._ctx.set_alpn_protos(protocols) - - def wrap_socket( - self, - sock, - server_side=False, - do_handshake_on_connect=True, - suppress_ragged_eofs=True, - server_hostname=None, - ): - cnx = OpenSSL.SSL.Connection(self._ctx, sock) - - if isinstance(server_hostname, six.text_type): # Platform-specific: Python 3 - server_hostname = server_hostname.encode("utf-8") - - if server_hostname is not None: - cnx.set_tlsext_host_name(server_hostname) - - cnx.set_connect_state() - - while True: - try: - cnx.do_handshake() - except OpenSSL.SSL.WantReadError: - if not util.wait_for_read(sock, sock.gettimeout()): - raise timeout("select timed out") - continue - except OpenSSL.SSL.Error as e: - raise ssl.SSLError("bad handshake: %r" % e) - break - - return WrappedSocket(cnx, sock) - - -def _verify_callback(cnx, x509, err_no, err_depth, return_code): - return err_no == 0 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/securetransport.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/securetransport.py deleted file mode 100644 index 4a06bc6..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/securetransport.py +++ /dev/null @@ -1,921 +0,0 @@ -""" -SecureTranport support for urllib3 via ctypes. - -This makes platform-native TLS available to urllib3 users on macOS without the -use of a compiler. This is an important feature because the Python Package -Index is moving to become a TLSv1.2-or-higher server, and the default OpenSSL -that ships with macOS is not capable of doing TLSv1.2. The only way to resolve -this is to give macOS users an alternative solution to the problem, and that -solution is to use SecureTransport. - -We use ctypes here because this solution must not require a compiler. That's -because pip is not allowed to require a compiler either. - -This is not intended to be a seriously long-term solution to this problem. -The hope is that PEP 543 will eventually solve this issue for us, at which -point we can retire this contrib module. But in the short term, we need to -solve the impending tire fire that is Python on Mac without this kind of -contrib module. So...here we are. - -To use this module, simply import and inject it:: - - import pip._vendor.urllib3.contrib.securetransport as securetransport - securetransport.inject_into_urllib3() - -Happy TLSing! - -This code is a bastardised version of the code found in Will Bond's oscrypto -library. An enormous debt is owed to him for blazing this trail for us. For -that reason, this code should be considered to be covered both by urllib3's -license and by oscrypto's: - -.. code-block:: - - Copyright (c) 2015-2016 Will Bond <will@wbond.net> - - 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. -""" -from __future__ import absolute_import - -import contextlib -import ctypes -import errno -import os.path -import shutil -import socket -import ssl -import struct -import threading -import weakref - -from pip._vendor import six - -from .. import util -from ..util.ssl_ import PROTOCOL_TLS_CLIENT -from ._securetransport.bindings import CoreFoundation, Security, SecurityConst -from ._securetransport.low_level import ( - _assert_no_error, - _build_tls_unknown_ca_alert, - _cert_array_from_pem, - _create_cfstring_array, - _load_client_cert_chain, - _temporary_keychain, -) - -try: # Platform-specific: Python 2 - from socket import _fileobject -except ImportError: # Platform-specific: Python 3 - _fileobject = None - from ..packages.backports.makefile import backport_makefile - -__all__ = ["inject_into_urllib3", "extract_from_urllib3"] - -# SNI always works -HAS_SNI = True - -orig_util_HAS_SNI = util.HAS_SNI -orig_util_SSLContext = util.ssl_.SSLContext - -# This dictionary is used by the read callback to obtain a handle to the -# calling wrapped socket. This is a pretty silly approach, but for now it'll -# do. I feel like I should be able to smuggle a handle to the wrapped socket -# directly in the SSLConnectionRef, but for now this approach will work I -# guess. -# -# We need to lock around this structure for inserts, but we don't do it for -# reads/writes in the callbacks. The reasoning here goes as follows: -# -# 1. It is not possible to call into the callbacks before the dictionary is -# populated, so once in the callback the id must be in the dictionary. -# 2. The callbacks don't mutate the dictionary, they only read from it, and -# so cannot conflict with any of the insertions. -# -# This is good: if we had to lock in the callbacks we'd drastically slow down -# the performance of this code. -_connection_refs = weakref.WeakValueDictionary() -_connection_ref_lock = threading.Lock() - -# Limit writes to 16kB. This is OpenSSL's limit, but we'll cargo-cult it over -# for no better reason than we need *a* limit, and this one is right there. -SSL_WRITE_BLOCKSIZE = 16384 - -# This is our equivalent of util.ssl_.DEFAULT_CIPHERS, but expanded out to -# individual cipher suites. We need to do this because this is how -# SecureTransport wants them. -CIPHER_SUITES = [ - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, - SecurityConst.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, - SecurityConst.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, - SecurityConst.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, - SecurityConst.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, - SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, - SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA, - SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, - SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA, - SecurityConst.TLS_AES_256_GCM_SHA384, - SecurityConst.TLS_AES_128_GCM_SHA256, - SecurityConst.TLS_RSA_WITH_AES_256_GCM_SHA384, - SecurityConst.TLS_RSA_WITH_AES_128_GCM_SHA256, - SecurityConst.TLS_AES_128_CCM_8_SHA256, - SecurityConst.TLS_AES_128_CCM_SHA256, - SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA256, - SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA256, - SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA, - SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA, -] - -# Basically this is simple: for PROTOCOL_SSLv23 we turn it into a low of -# TLSv1 and a high of TLSv1.2. For everything else, we pin to that version. -# TLSv1 to 1.2 are supported on macOS 10.8+ -_protocol_to_min_max = { - util.PROTOCOL_TLS: (SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol12), - PROTOCOL_TLS_CLIENT: (SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol12), -} - -if hasattr(ssl, "PROTOCOL_SSLv2"): - _protocol_to_min_max[ssl.PROTOCOL_SSLv2] = ( - SecurityConst.kSSLProtocol2, - SecurityConst.kSSLProtocol2, - ) -if hasattr(ssl, "PROTOCOL_SSLv3"): - _protocol_to_min_max[ssl.PROTOCOL_SSLv3] = ( - SecurityConst.kSSLProtocol3, - SecurityConst.kSSLProtocol3, - ) -if hasattr(ssl, "PROTOCOL_TLSv1"): - _protocol_to_min_max[ssl.PROTOCOL_TLSv1] = ( - SecurityConst.kTLSProtocol1, - SecurityConst.kTLSProtocol1, - ) -if hasattr(ssl, "PROTOCOL_TLSv1_1"): - _protocol_to_min_max[ssl.PROTOCOL_TLSv1_1] = ( - SecurityConst.kTLSProtocol11, - SecurityConst.kTLSProtocol11, - ) -if hasattr(ssl, "PROTOCOL_TLSv1_2"): - _protocol_to_min_max[ssl.PROTOCOL_TLSv1_2] = ( - SecurityConst.kTLSProtocol12, - SecurityConst.kTLSProtocol12, - ) - - -def inject_into_urllib3(): - """ - Monkey-patch urllib3 with SecureTransport-backed SSL-support. - """ - util.SSLContext = SecureTransportContext - util.ssl_.SSLContext = SecureTransportContext - util.HAS_SNI = HAS_SNI - util.ssl_.HAS_SNI = HAS_SNI - util.IS_SECURETRANSPORT = True - util.ssl_.IS_SECURETRANSPORT = True - - -def extract_from_urllib3(): - """ - Undo monkey-patching by :func:`inject_into_urllib3`. - """ - util.SSLContext = orig_util_SSLContext - util.ssl_.SSLContext = orig_util_SSLContext - util.HAS_SNI = orig_util_HAS_SNI - util.ssl_.HAS_SNI = orig_util_HAS_SNI - util.IS_SECURETRANSPORT = False - util.ssl_.IS_SECURETRANSPORT = False - - -def _read_callback(connection_id, data_buffer, data_length_pointer): - """ - SecureTransport read callback. This is called by ST to request that data - be returned from the socket. - """ - wrapped_socket = None - try: - wrapped_socket = _connection_refs.get(connection_id) - if wrapped_socket is None: - return SecurityConst.errSSLInternal - base_socket = wrapped_socket.socket - - requested_length = data_length_pointer[0] - - timeout = wrapped_socket.gettimeout() - error = None - read_count = 0 - - try: - while read_count < requested_length: - if timeout is None or timeout >= 0: - if not util.wait_for_read(base_socket, timeout): - raise socket.error(errno.EAGAIN, "timed out") - - remaining = requested_length - read_count - buffer = (ctypes.c_char * remaining).from_address( - data_buffer + read_count - ) - chunk_size = base_socket.recv_into(buffer, remaining) - read_count += chunk_size - if not chunk_size: - if not read_count: - return SecurityConst.errSSLClosedGraceful - break - except (socket.error) as e: - error = e.errno - - if error is not None and error != errno.EAGAIN: - data_length_pointer[0] = read_count - if error == errno.ECONNRESET or error == errno.EPIPE: - return SecurityConst.errSSLClosedAbort - raise - - data_length_pointer[0] = read_count - - if read_count != requested_length: - return SecurityConst.errSSLWouldBlock - - return 0 - except Exception as e: - if wrapped_socket is not None: - wrapped_socket._exception = e - return SecurityConst.errSSLInternal - - -def _write_callback(connection_id, data_buffer, data_length_pointer): - """ - SecureTransport write callback. This is called by ST to request that data - actually be sent on the network. - """ - wrapped_socket = None - try: - wrapped_socket = _connection_refs.get(connection_id) - if wrapped_socket is None: - return SecurityConst.errSSLInternal - base_socket = wrapped_socket.socket - - bytes_to_write = data_length_pointer[0] - data = ctypes.string_at(data_buffer, bytes_to_write) - - timeout = wrapped_socket.gettimeout() - error = None - sent = 0 - - try: - while sent < bytes_to_write: - if timeout is None or timeout >= 0: - if not util.wait_for_write(base_socket, timeout): - raise socket.error(errno.EAGAIN, "timed out") - chunk_sent = base_socket.send(data) - sent += chunk_sent - - # This has some needless copying here, but I'm not sure there's - # much value in optimising this data path. - data = data[chunk_sent:] - except (socket.error) as e: - error = e.errno - - if error is not None and error != errno.EAGAIN: - data_length_pointer[0] = sent - if error == errno.ECONNRESET or error == errno.EPIPE: - return SecurityConst.errSSLClosedAbort - raise - - data_length_pointer[0] = sent - - if sent != bytes_to_write: - return SecurityConst.errSSLWouldBlock - - return 0 - except Exception as e: - if wrapped_socket is not None: - wrapped_socket._exception = e - return SecurityConst.errSSLInternal - - -# We need to keep these two objects references alive: if they get GC'd while -# in use then SecureTransport could attempt to call a function that is in freed -# memory. That would be...uh...bad. Yeah, that's the word. Bad. -_read_callback_pointer = Security.SSLReadFunc(_read_callback) -_write_callback_pointer = Security.SSLWriteFunc(_write_callback) - - -class WrappedSocket(object): - """ - API-compatibility wrapper for Python's OpenSSL wrapped socket object. - - Note: _makefile_refs, _drop(), and _reuse() are needed for the garbage - collector of PyPy. - """ - - def __init__(self, socket): - self.socket = socket - self.context = None - self._makefile_refs = 0 - self._closed = False - self._exception = None - self._keychain = None - self._keychain_dir = None - self._client_cert_chain = None - - # We save off the previously-configured timeout and then set it to - # zero. This is done because we use select and friends to handle the - # timeouts, but if we leave the timeout set on the lower socket then - # Python will "kindly" call select on that socket again for us. Avoid - # that by forcing the timeout to zero. - self._timeout = self.socket.gettimeout() - self.socket.settimeout(0) - - @contextlib.contextmanager - def _raise_on_error(self): - """ - A context manager that can be used to wrap calls that do I/O from - SecureTransport. If any of the I/O callbacks hit an exception, this - context manager will correctly propagate the exception after the fact. - This avoids silently swallowing those exceptions. - - It also correctly forces the socket closed. - """ - self._exception = None - - # We explicitly don't catch around this yield because in the unlikely - # event that an exception was hit in the block we don't want to swallow - # it. - yield - if self._exception is not None: - exception, self._exception = self._exception, None - self.close() - raise exception - - def _set_ciphers(self): - """ - Sets up the allowed ciphers. By default this matches the set in - util.ssl_.DEFAULT_CIPHERS, at least as supported by macOS. This is done - custom and doesn't allow changing at this time, mostly because parsing - OpenSSL cipher strings is going to be a freaking nightmare. - """ - ciphers = (Security.SSLCipherSuite * len(CIPHER_SUITES))(*CIPHER_SUITES) - result = Security.SSLSetEnabledCiphers( - self.context, ciphers, len(CIPHER_SUITES) - ) - _assert_no_error(result) - - def _set_alpn_protocols(self, protocols): - """ - Sets up the ALPN protocols on the context. - """ - if not protocols: - return - protocols_arr = _create_cfstring_array(protocols) - try: - result = Security.SSLSetALPNProtocols(self.context, protocols_arr) - _assert_no_error(result) - finally: - CoreFoundation.CFRelease(protocols_arr) - - def _custom_validate(self, verify, trust_bundle): - """ - Called when we have set custom validation. We do this in two cases: - first, when cert validation is entirely disabled; and second, when - using a custom trust DB. - Raises an SSLError if the connection is not trusted. - """ - # If we disabled cert validation, just say: cool. - if not verify: - return - - successes = ( - SecurityConst.kSecTrustResultUnspecified, - SecurityConst.kSecTrustResultProceed, - ) - try: - trust_result = self._evaluate_trust(trust_bundle) - if trust_result in successes: - return - reason = "error code: %d" % (trust_result,) - except Exception as e: - # Do not trust on error - reason = "exception: %r" % (e,) - - # SecureTransport does not send an alert nor shuts down the connection. - rec = _build_tls_unknown_ca_alert(self.version()) - self.socket.sendall(rec) - # close the connection immediately - # l_onoff = 1, activate linger - # l_linger = 0, linger for 0 seoncds - opts = struct.pack("ii", 1, 0) - self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, opts) - self.close() - raise ssl.SSLError("certificate verify failed, %s" % reason) - - def _evaluate_trust(self, trust_bundle): - # We want data in memory, so load it up. - if os.path.isfile(trust_bundle): - with open(trust_bundle, "rb") as f: - trust_bundle = f.read() - - cert_array = None - trust = Security.SecTrustRef() - - try: - # Get a CFArray that contains the certs we want. - cert_array = _cert_array_from_pem(trust_bundle) - - # Ok, now the hard part. We want to get the SecTrustRef that ST has - # created for this connection, shove our CAs into it, tell ST to - # ignore everything else it knows, and then ask if it can build a - # chain. This is a buuuunch of code. - result = Security.SSLCopyPeerTrust(self.context, ctypes.byref(trust)) - _assert_no_error(result) - if not trust: - raise ssl.SSLError("Failed to copy trust reference") - - result = Security.SecTrustSetAnchorCertificates(trust, cert_array) - _assert_no_error(result) - - result = Security.SecTrustSetAnchorCertificatesOnly(trust, True) - _assert_no_error(result) - - trust_result = Security.SecTrustResultType() - result = Security.SecTrustEvaluate(trust, ctypes.byref(trust_result)) - _assert_no_error(result) - finally: - if trust: - CoreFoundation.CFRelease(trust) - - if cert_array is not None: - CoreFoundation.CFRelease(cert_array) - - return trust_result.value - - def handshake( - self, - server_hostname, - verify, - trust_bundle, - min_version, - max_version, - client_cert, - client_key, - client_key_passphrase, - alpn_protocols, - ): - """ - Actually performs the TLS handshake. This is run automatically by - wrapped socket, and shouldn't be needed in user code. - """ - # First, we do the initial bits of connection setup. We need to create - # a context, set its I/O funcs, and set the connection reference. - self.context = Security.SSLCreateContext( - None, SecurityConst.kSSLClientSide, SecurityConst.kSSLStreamType - ) - result = Security.SSLSetIOFuncs( - self.context, _read_callback_pointer, _write_callback_pointer - ) - _assert_no_error(result) - - # Here we need to compute the handle to use. We do this by taking the - # id of self modulo 2**31 - 1. If this is already in the dictionary, we - # just keep incrementing by one until we find a free space. - with _connection_ref_lock: - handle = id(self) % 2147483647 - while handle in _connection_refs: - handle = (handle + 1) % 2147483647 - _connection_refs[handle] = self - - result = Security.SSLSetConnection(self.context, handle) - _assert_no_error(result) - - # If we have a server hostname, we should set that too. - if server_hostname: - if not isinstance(server_hostname, bytes): - server_hostname = server_hostname.encode("utf-8") - - result = Security.SSLSetPeerDomainName( - self.context, server_hostname, len(server_hostname) - ) - _assert_no_error(result) - - # Setup the ciphers. - self._set_ciphers() - - # Setup the ALPN protocols. - self._set_alpn_protocols(alpn_protocols) - - # Set the minimum and maximum TLS versions. - result = Security.SSLSetProtocolVersionMin(self.context, min_version) - _assert_no_error(result) - - result = Security.SSLSetProtocolVersionMax(self.context, max_version) - _assert_no_error(result) - - # If there's a trust DB, we need to use it. We do that by telling - # SecureTransport to break on server auth. We also do that if we don't - # want to validate the certs at all: we just won't actually do any - # authing in that case. - if not verify or trust_bundle is not None: - result = Security.SSLSetSessionOption( - self.context, SecurityConst.kSSLSessionOptionBreakOnServerAuth, True - ) - _assert_no_error(result) - - # If there's a client cert, we need to use it. - if client_cert: - self._keychain, self._keychain_dir = _temporary_keychain() - self._client_cert_chain = _load_client_cert_chain( - self._keychain, client_cert, client_key - ) - result = Security.SSLSetCertificate(self.context, self._client_cert_chain) - _assert_no_error(result) - - while True: - with self._raise_on_error(): - result = Security.SSLHandshake(self.context) - - if result == SecurityConst.errSSLWouldBlock: - raise socket.timeout("handshake timed out") - elif result == SecurityConst.errSSLServerAuthCompleted: - self._custom_validate(verify, trust_bundle) - continue - else: - _assert_no_error(result) - break - - def fileno(self): - return self.socket.fileno() - - # Copy-pasted from Python 3.5 source code - def _decref_socketios(self): - if self._makefile_refs > 0: - self._makefile_refs -= 1 - if self._closed: - self.close() - - def recv(self, bufsiz): - buffer = ctypes.create_string_buffer(bufsiz) - bytes_read = self.recv_into(buffer, bufsiz) - data = buffer[:bytes_read] - return data - - def recv_into(self, buffer, nbytes=None): - # Read short on EOF. - if self._closed: - return 0 - - if nbytes is None: - nbytes = len(buffer) - - buffer = (ctypes.c_char * nbytes).from_buffer(buffer) - processed_bytes = ctypes.c_size_t(0) - - with self._raise_on_error(): - result = Security.SSLRead( - self.context, buffer, nbytes, ctypes.byref(processed_bytes) - ) - - # There are some result codes that we want to treat as "not always - # errors". Specifically, those are errSSLWouldBlock, - # errSSLClosedGraceful, and errSSLClosedNoNotify. - if result == SecurityConst.errSSLWouldBlock: - # If we didn't process any bytes, then this was just a time out. - # However, we can get errSSLWouldBlock in situations when we *did* - # read some data, and in those cases we should just read "short" - # and return. - if processed_bytes.value == 0: - # Timed out, no data read. - raise socket.timeout("recv timed out") - elif result in ( - SecurityConst.errSSLClosedGraceful, - SecurityConst.errSSLClosedNoNotify, - ): - # The remote peer has closed this connection. We should do so as - # well. Note that we don't actually return here because in - # principle this could actually be fired along with return data. - # It's unlikely though. - self.close() - else: - _assert_no_error(result) - - # Ok, we read and probably succeeded. We should return whatever data - # was actually read. - return processed_bytes.value - - def settimeout(self, timeout): - self._timeout = timeout - - def gettimeout(self): - return self._timeout - - def send(self, data): - processed_bytes = ctypes.c_size_t(0) - - with self._raise_on_error(): - result = Security.SSLWrite( - self.context, data, len(data), ctypes.byref(processed_bytes) - ) - - if result == SecurityConst.errSSLWouldBlock and processed_bytes.value == 0: - # Timed out - raise socket.timeout("send timed out") - else: - _assert_no_error(result) - - # We sent, and probably succeeded. Tell them how much we sent. - return processed_bytes.value - - def sendall(self, data): - total_sent = 0 - while total_sent < len(data): - sent = self.send(data[total_sent : total_sent + SSL_WRITE_BLOCKSIZE]) - total_sent += sent - - def shutdown(self): - with self._raise_on_error(): - Security.SSLClose(self.context) - - def close(self): - # TODO: should I do clean shutdown here? Do I have to? - if self._makefile_refs < 1: - self._closed = True - if self.context: - CoreFoundation.CFRelease(self.context) - self.context = None - if self._client_cert_chain: - CoreFoundation.CFRelease(self._client_cert_chain) - self._client_cert_chain = None - if self._keychain: - Security.SecKeychainDelete(self._keychain) - CoreFoundation.CFRelease(self._keychain) - shutil.rmtree(self._keychain_dir) - self._keychain = self._keychain_dir = None - return self.socket.close() - else: - self._makefile_refs -= 1 - - def getpeercert(self, binary_form=False): - # Urgh, annoying. - # - # Here's how we do this: - # - # 1. Call SSLCopyPeerTrust to get hold of the trust object for this - # connection. - # 2. Call SecTrustGetCertificateAtIndex for index 0 to get the leaf. - # 3. To get the CN, call SecCertificateCopyCommonName and process that - # string so that it's of the appropriate type. - # 4. To get the SAN, we need to do something a bit more complex: - # a. Call SecCertificateCopyValues to get the data, requesting - # kSecOIDSubjectAltName. - # b. Mess about with this dictionary to try to get the SANs out. - # - # This is gross. Really gross. It's going to be a few hundred LoC extra - # just to repeat something that SecureTransport can *already do*. So my - # operating assumption at this time is that what we want to do is - # instead to just flag to urllib3 that it shouldn't do its own hostname - # validation when using SecureTransport. - if not binary_form: - raise ValueError("SecureTransport only supports dumping binary certs") - trust = Security.SecTrustRef() - certdata = None - der_bytes = None - - try: - # Grab the trust store. - result = Security.SSLCopyPeerTrust(self.context, ctypes.byref(trust)) - _assert_no_error(result) - if not trust: - # Probably we haven't done the handshake yet. No biggie. - return None - - cert_count = Security.SecTrustGetCertificateCount(trust) - if not cert_count: - # Also a case that might happen if we haven't handshaked. - # Handshook? Handshaken? - return None - - leaf = Security.SecTrustGetCertificateAtIndex(trust, 0) - assert leaf - - # Ok, now we want the DER bytes. - certdata = Security.SecCertificateCopyData(leaf) - assert certdata - - data_length = CoreFoundation.CFDataGetLength(certdata) - data_buffer = CoreFoundation.CFDataGetBytePtr(certdata) - der_bytes = ctypes.string_at(data_buffer, data_length) - finally: - if certdata: - CoreFoundation.CFRelease(certdata) - if trust: - CoreFoundation.CFRelease(trust) - - return der_bytes - - def version(self): - protocol = Security.SSLProtocol() - result = Security.SSLGetNegotiatedProtocolVersion( - self.context, ctypes.byref(protocol) - ) - _assert_no_error(result) - if protocol.value == SecurityConst.kTLSProtocol13: - raise ssl.SSLError("SecureTransport does not support TLS 1.3") - elif protocol.value == SecurityConst.kTLSProtocol12: - return "TLSv1.2" - elif protocol.value == SecurityConst.kTLSProtocol11: - return "TLSv1.1" - elif protocol.value == SecurityConst.kTLSProtocol1: - return "TLSv1" - elif protocol.value == SecurityConst.kSSLProtocol3: - return "SSLv3" - elif protocol.value == SecurityConst.kSSLProtocol2: - return "SSLv2" - else: - raise ssl.SSLError("Unknown TLS version: %r" % protocol) - - def _reuse(self): - self._makefile_refs += 1 - - def _drop(self): - if self._makefile_refs < 1: - self.close() - else: - self._makefile_refs -= 1 - - -if _fileobject: # Platform-specific: Python 2 - - def makefile(self, mode, bufsize=-1): - self._makefile_refs += 1 - return _fileobject(self, mode, bufsize, close=True) - -else: # Platform-specific: Python 3 - - def makefile(self, mode="r", buffering=None, *args, **kwargs): - # We disable buffering with SecureTransport because it conflicts with - # the buffering that ST does internally (see issue #1153 for more). - buffering = 0 - return backport_makefile(self, mode, buffering, *args, **kwargs) - - -WrappedSocket.makefile = makefile - - -class SecureTransportContext(object): - """ - I am a wrapper class for the SecureTransport library, to translate the - interface of the standard library ``SSLContext`` object to calls into - SecureTransport. - """ - - def __init__(self, protocol): - self._min_version, self._max_version = _protocol_to_min_max[protocol] - self._options = 0 - self._verify = False - self._trust_bundle = None - self._client_cert = None - self._client_key = None - self._client_key_passphrase = None - self._alpn_protocols = None - - @property - def check_hostname(self): - """ - SecureTransport cannot have its hostname checking disabled. For more, - see the comment on getpeercert() in this file. - """ - return True - - @check_hostname.setter - def check_hostname(self, value): - """ - SecureTransport cannot have its hostname checking disabled. For more, - see the comment on getpeercert() in this file. - """ - pass - - @property - def options(self): - # TODO: Well, crap. - # - # So this is the bit of the code that is the most likely to cause us - # trouble. Essentially we need to enumerate all of the SSL options that - # users might want to use and try to see if we can sensibly translate - # them, or whether we should just ignore them. - return self._options - - @options.setter - def options(self, value): - # TODO: Update in line with above. - self._options = value - - @property - def verify_mode(self): - return ssl.CERT_REQUIRED if self._verify else ssl.CERT_NONE - - @verify_mode.setter - def verify_mode(self, value): - self._verify = True if value == ssl.CERT_REQUIRED else False - - def set_default_verify_paths(self): - # So, this has to do something a bit weird. Specifically, what it does - # is nothing. - # - # This means that, if we had previously had load_verify_locations - # called, this does not undo that. We need to do that because it turns - # out that the rest of the urllib3 code will attempt to load the - # default verify paths if it hasn't been told about any paths, even if - # the context itself was sometime earlier. We resolve that by just - # ignoring it. - pass - - def load_default_certs(self): - return self.set_default_verify_paths() - - def set_ciphers(self, ciphers): - # For now, we just require the default cipher string. - if ciphers != util.ssl_.DEFAULT_CIPHERS: - raise ValueError("SecureTransport doesn't support custom cipher strings") - - def load_verify_locations(self, cafile=None, capath=None, cadata=None): - # OK, we only really support cadata and cafile. - if capath is not None: - raise ValueError("SecureTransport does not support cert directories") - - # Raise if cafile does not exist. - if cafile is not None: - with open(cafile): - pass - - self._trust_bundle = cafile or cadata - - def load_cert_chain(self, certfile, keyfile=None, password=None): - self._client_cert = certfile - self._client_key = keyfile - self._client_cert_passphrase = password - - def set_alpn_protocols(self, protocols): - """ - Sets the ALPN protocols that will later be set on the context. - - Raises a NotImplementedError if ALPN is not supported. - """ - if not hasattr(Security, "SSLSetALPNProtocols"): - raise NotImplementedError( - "SecureTransport supports ALPN only in macOS 10.12+" - ) - self._alpn_protocols = [six.ensure_binary(p) for p in protocols] - - def wrap_socket( - self, - sock, - server_side=False, - do_handshake_on_connect=True, - suppress_ragged_eofs=True, - server_hostname=None, - ): - # So, what do we do here? Firstly, we assert some properties. This is a - # stripped down shim, so there is some functionality we don't support. - # See PEP 543 for the real deal. - assert not server_side - assert do_handshake_on_connect - assert suppress_ragged_eofs - - # Ok, we're good to go. Now we want to create the wrapped socket object - # and store it in the appropriate place. - wrapped_socket = WrappedSocket(sock) - - # Now we can handshake - wrapped_socket.handshake( - server_hostname, - self._verify, - self._trust_bundle, - self._min_version, - self._max_version, - self._client_cert, - self._client_key, - self._client_key_passphrase, - self._alpn_protocols, - ) - return wrapped_socket diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/socks.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/socks.py deleted file mode 100644 index c326e80..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/socks.py +++ /dev/null @@ -1,216 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This module contains provisional support for SOCKS proxies from within -urllib3. This module supports SOCKS4, SOCKS4A (an extension of SOCKS4), and -SOCKS5. To enable its functionality, either install PySocks or install this -module with the ``socks`` extra. - -The SOCKS implementation supports the full range of urllib3 features. It also -supports the following SOCKS features: - -- SOCKS4A (``proxy_url='socks4a://...``) -- SOCKS4 (``proxy_url='socks4://...``) -- SOCKS5 with remote DNS (``proxy_url='socks5h://...``) -- SOCKS5 with local DNS (``proxy_url='socks5://...``) -- Usernames and passwords for the SOCKS proxy - -.. note:: - It is recommended to use ``socks5h://`` or ``socks4a://`` schemes in - your ``proxy_url`` to ensure that DNS resolution is done from the remote - server instead of client-side when connecting to a domain name. - -SOCKS4 supports IPv4 and domain names with the SOCKS4A extension. SOCKS5 -supports IPv4, IPv6, and domain names. - -When connecting to a SOCKS4 proxy the ``username`` portion of the ``proxy_url`` -will be sent as the ``userid`` section of the SOCKS request: - -.. code-block:: python - - proxy_url="socks4a://<userid>@proxy-host" - -When connecting to a SOCKS5 proxy the ``username`` and ``password`` portion -of the ``proxy_url`` will be sent as the username/password to authenticate -with the proxy: - -.. code-block:: python - - proxy_url="socks5h://<username>:<password>@proxy-host" - -""" -from __future__ import absolute_import - -try: - import socks -except ImportError: - import warnings - - from ..exceptions import DependencyWarning - - warnings.warn( - ( - "SOCKS support in urllib3 requires the installation of optional " - "dependencies: specifically, PySocks. For more information, see " - "https://urllib3.readthedocs.io/en/1.26.x/contrib.html#socks-proxies" - ), - DependencyWarning, - ) - raise - -from socket import error as SocketError -from socket import timeout as SocketTimeout - -from ..connection import HTTPConnection, HTTPSConnection -from ..connectionpool import HTTPConnectionPool, HTTPSConnectionPool -from ..exceptions import ConnectTimeoutError, NewConnectionError -from ..poolmanager import PoolManager -from ..util.url import parse_url - -try: - import ssl -except ImportError: - ssl = None - - -class SOCKSConnection(HTTPConnection): - """ - A plain-text HTTP connection that connects via a SOCKS proxy. - """ - - def __init__(self, *args, **kwargs): - self._socks_options = kwargs.pop("_socks_options") - super(SOCKSConnection, self).__init__(*args, **kwargs) - - def _new_conn(self): - """ - Establish a new connection via the SOCKS proxy. - """ - extra_kw = {} - if self.source_address: - extra_kw["source_address"] = self.source_address - - if self.socket_options: - extra_kw["socket_options"] = self.socket_options - - try: - conn = socks.create_connection( - (self.host, self.port), - proxy_type=self._socks_options["socks_version"], - proxy_addr=self._socks_options["proxy_host"], - proxy_port=self._socks_options["proxy_port"], - proxy_username=self._socks_options["username"], - proxy_password=self._socks_options["password"], - proxy_rdns=self._socks_options["rdns"], - timeout=self.timeout, - **extra_kw - ) - - except SocketTimeout: - raise ConnectTimeoutError( - self, - "Connection to %s timed out. (connect timeout=%s)" - % (self.host, self.timeout), - ) - - except socks.ProxyError as e: - # This is fragile as hell, but it seems to be the only way to raise - # useful errors here. - if e.socket_err: - error = e.socket_err - if isinstance(error, SocketTimeout): - raise ConnectTimeoutError( - self, - "Connection to %s timed out. (connect timeout=%s)" - % (self.host, self.timeout), - ) - else: - raise NewConnectionError( - self, "Failed to establish a new connection: %s" % error - ) - else: - raise NewConnectionError( - self, "Failed to establish a new connection: %s" % e - ) - - except SocketError as e: # Defensive: PySocks should catch all these. - raise NewConnectionError( - self, "Failed to establish a new connection: %s" % e - ) - - return conn - - -# We don't need to duplicate the Verified/Unverified distinction from -# urllib3/connection.py here because the HTTPSConnection will already have been -# correctly set to either the Verified or Unverified form by that module. This -# means the SOCKSHTTPSConnection will automatically be the correct type. -class SOCKSHTTPSConnection(SOCKSConnection, HTTPSConnection): - pass - - -class SOCKSHTTPConnectionPool(HTTPConnectionPool): - ConnectionCls = SOCKSConnection - - -class SOCKSHTTPSConnectionPool(HTTPSConnectionPool): - ConnectionCls = SOCKSHTTPSConnection - - -class SOCKSProxyManager(PoolManager): - """ - A version of the urllib3 ProxyManager that routes connections via the - defined SOCKS proxy. - """ - - pool_classes_by_scheme = { - "http": SOCKSHTTPConnectionPool, - "https": SOCKSHTTPSConnectionPool, - } - - def __init__( - self, - proxy_url, - username=None, - password=None, - num_pools=10, - headers=None, - **connection_pool_kw - ): - parsed = parse_url(proxy_url) - - if username is None and password is None and parsed.auth is not None: - split = parsed.auth.split(":") - if len(split) == 2: - username, password = split - if parsed.scheme == "socks5": - socks_version = socks.PROXY_TYPE_SOCKS5 - rdns = False - elif parsed.scheme == "socks5h": - socks_version = socks.PROXY_TYPE_SOCKS5 - rdns = True - elif parsed.scheme == "socks4": - socks_version = socks.PROXY_TYPE_SOCKS4 - rdns = False - elif parsed.scheme == "socks4a": - socks_version = socks.PROXY_TYPE_SOCKS4 - rdns = True - else: - raise ValueError("Unable to determine SOCKS version from %s" % proxy_url) - - self.proxy_url = proxy_url - - socks_options = { - "socks_version": socks_version, - "proxy_host": parsed.host, - "proxy_port": parsed.port, - "username": username, - "password": password, - "rdns": rdns, - } - connection_pool_kw["_socks_options"] = socks_options - - super(SOCKSProxyManager, self).__init__( - num_pools, headers, **connection_pool_kw - ) - - self.pool_classes_by_scheme = SOCKSProxyManager.pool_classes_by_scheme diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/exceptions.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/exceptions.py deleted file mode 100644 index cba6f3f..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/exceptions.py +++ /dev/null @@ -1,323 +0,0 @@ -from __future__ import absolute_import - -from .packages.six.moves.http_client import IncompleteRead as httplib_IncompleteRead - -# Base Exceptions - - -class HTTPError(Exception): - """Base exception used by this module.""" - - pass - - -class HTTPWarning(Warning): - """Base warning used by this module.""" - - pass - - -class PoolError(HTTPError): - """Base exception for errors caused within a pool.""" - - def __init__(self, pool, message): - self.pool = pool - HTTPError.__init__(self, "%s: %s" % (pool, message)) - - def __reduce__(self): - # For pickling purposes. - return self.__class__, (None, None) - - -class RequestError(PoolError): - """Base exception for PoolErrors that have associated URLs.""" - - def __init__(self, pool, url, message): - self.url = url - PoolError.__init__(self, pool, message) - - def __reduce__(self): - # For pickling purposes. - return self.__class__, (None, self.url, None) - - -class SSLError(HTTPError): - """Raised when SSL certificate fails in an HTTPS connection.""" - - pass - - -class ProxyError(HTTPError): - """Raised when the connection to a proxy fails.""" - - def __init__(self, message, error, *args): - super(ProxyError, self).__init__(message, error, *args) - self.original_error = error - - -class DecodeError(HTTPError): - """Raised when automatic decoding based on Content-Type fails.""" - - pass - - -class ProtocolError(HTTPError): - """Raised when something unexpected happens mid-request/response.""" - - pass - - -#: Renamed to ProtocolError but aliased for backwards compatibility. -ConnectionError = ProtocolError - - -# Leaf Exceptions - - -class MaxRetryError(RequestError): - """Raised when the maximum number of retries is exceeded. - - :param pool: The connection pool - :type pool: :class:`~urllib3.connectionpool.HTTPConnectionPool` - :param string url: The requested Url - :param exceptions.Exception reason: The underlying error - - """ - - def __init__(self, pool, url, reason=None): - self.reason = reason - - message = "Max retries exceeded with url: %s (Caused by %r)" % (url, reason) - - RequestError.__init__(self, pool, url, message) - - -class HostChangedError(RequestError): - """Raised when an existing pool gets a request for a foreign host.""" - - def __init__(self, pool, url, retries=3): - message = "Tried to open a foreign host with url: %s" % url - RequestError.__init__(self, pool, url, message) - self.retries = retries - - -class TimeoutStateError(HTTPError): - """Raised when passing an invalid state to a timeout""" - - pass - - -class TimeoutError(HTTPError): - """Raised when a socket timeout error occurs. - - Catching this error will catch both :exc:`ReadTimeoutErrors - <ReadTimeoutError>` and :exc:`ConnectTimeoutErrors <ConnectTimeoutError>`. - """ - - pass - - -class ReadTimeoutError(TimeoutError, RequestError): - """Raised when a socket timeout occurs while receiving data from a server""" - - pass - - -# This timeout error does not have a URL attached and needs to inherit from the -# base HTTPError -class ConnectTimeoutError(TimeoutError): - """Raised when a socket timeout occurs while connecting to a server""" - - pass - - -class NewConnectionError(ConnectTimeoutError, PoolError): - """Raised when we fail to establish a new connection. Usually ECONNREFUSED.""" - - pass - - -class EmptyPoolError(PoolError): - """Raised when a pool runs out of connections and no more are allowed.""" - - pass - - -class ClosedPoolError(PoolError): - """Raised when a request enters a pool after the pool has been closed.""" - - pass - - -class LocationValueError(ValueError, HTTPError): - """Raised when there is something wrong with a given URL input.""" - - pass - - -class LocationParseError(LocationValueError): - """Raised when get_host or similar fails to parse the URL input.""" - - def __init__(self, location): - message = "Failed to parse: %s" % location - HTTPError.__init__(self, message) - - self.location = location - - -class URLSchemeUnknown(LocationValueError): - """Raised when a URL input has an unsupported scheme.""" - - def __init__(self, scheme): - message = "Not supported URL scheme %s" % scheme - super(URLSchemeUnknown, self).__init__(message) - - self.scheme = scheme - - -class ResponseError(HTTPError): - """Used as a container for an error reason supplied in a MaxRetryError.""" - - GENERIC_ERROR = "too many error responses" - SPECIFIC_ERROR = "too many {status_code} error responses" - - -class SecurityWarning(HTTPWarning): - """Warned when performing security reducing actions""" - - pass - - -class SubjectAltNameWarning(SecurityWarning): - """Warned when connecting to a host with a certificate missing a SAN.""" - - pass - - -class InsecureRequestWarning(SecurityWarning): - """Warned when making an unverified HTTPS request.""" - - pass - - -class SystemTimeWarning(SecurityWarning): - """Warned when system time is suspected to be wrong""" - - pass - - -class InsecurePlatformWarning(SecurityWarning): - """Warned when certain TLS/SSL configuration is not available on a platform.""" - - pass - - -class SNIMissingWarning(HTTPWarning): - """Warned when making a HTTPS request without SNI available.""" - - pass - - -class DependencyWarning(HTTPWarning): - """ - Warned when an attempt is made to import a module with missing optional - dependencies. - """ - - pass - - -class ResponseNotChunked(ProtocolError, ValueError): - """Response needs to be chunked in order to read it as chunks.""" - - pass - - -class BodyNotHttplibCompatible(HTTPError): - """ - Body should be :class:`http.client.HTTPResponse` like - (have an fp attribute which returns raw chunks) for read_chunked(). - """ - - pass - - -class IncompleteRead(HTTPError, httplib_IncompleteRead): - """ - Response length doesn't match expected Content-Length - - Subclass of :class:`http.client.IncompleteRead` to allow int value - for ``partial`` to avoid creating large objects on streamed reads. - """ - - def __init__(self, partial, expected): - super(IncompleteRead, self).__init__(partial, expected) - - def __repr__(self): - return "IncompleteRead(%i bytes read, %i more expected)" % ( - self.partial, - self.expected, - ) - - -class InvalidChunkLength(HTTPError, httplib_IncompleteRead): - """Invalid chunk length in a chunked response.""" - - def __init__(self, response, length): - super(InvalidChunkLength, self).__init__( - response.tell(), response.length_remaining - ) - self.response = response - self.length = length - - def __repr__(self): - return "InvalidChunkLength(got length %r, %i bytes read)" % ( - self.length, - self.partial, - ) - - -class InvalidHeader(HTTPError): - """The header provided was somehow invalid.""" - - pass - - -class ProxySchemeUnknown(AssertionError, URLSchemeUnknown): - """ProxyManager does not support the supplied scheme""" - - # TODO(t-8ch): Stop inheriting from AssertionError in v2.0. - - def __init__(self, scheme): - # 'localhost' is here because our URL parser parses - # localhost:8080 -> scheme=localhost, remove if we fix this. - if scheme == "localhost": - scheme = None - if scheme is None: - message = "Proxy URL had no scheme, should start with http:// or https://" - else: - message = ( - "Proxy URL had unsupported scheme %s, should use http:// or https://" - % scheme - ) - super(ProxySchemeUnknown, self).__init__(message) - - -class ProxySchemeUnsupported(ValueError): - """Fetching HTTPS resources through HTTPS proxies is unsupported""" - - pass - - -class HeaderParsingError(HTTPError): - """Raised by assert_header_parsing, but we convert it to a log.warning statement.""" - - def __init__(self, defects, unparsed_data): - message = "%s, unparsed data: %r" % (defects or "Unknown", unparsed_data) - super(HeaderParsingError, self).__init__(message) - - -class UnrewindableBodyError(HTTPError): - """urllib3 encountered an error when trying to rewind a body""" - - pass diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/fields.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/fields.py deleted file mode 100644 index 9d630f4..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/fields.py +++ /dev/null @@ -1,274 +0,0 @@ -from __future__ import absolute_import - -import email.utils -import mimetypes -import re - -from .packages import six - - -def guess_content_type(filename, default="application/octet-stream"): - """ - Guess the "Content-Type" of a file. - - :param filename: - The filename to guess the "Content-Type" of using :mod:`mimetypes`. - :param default: - If no "Content-Type" can be guessed, default to `default`. - """ - if filename: - return mimetypes.guess_type(filename)[0] or default - return default - - -def format_header_param_rfc2231(name, value): - """ - Helper function to format and quote a single header parameter using the - strategy defined in RFC 2231. - - Particularly useful for header parameters which might contain - non-ASCII values, like file names. This follows - `RFC 2388 Section 4.4 <https://tools.ietf.org/html/rfc2388#section-4.4>`_. - - :param name: - The name of the parameter, a string expected to be ASCII only. - :param value: - The value of the parameter, provided as ``bytes`` or `str``. - :ret: - An RFC-2231-formatted unicode string. - """ - if isinstance(value, six.binary_type): - value = value.decode("utf-8") - - if not any(ch in value for ch in '"\\\r\n'): - result = u'%s="%s"' % (name, value) - try: - result.encode("ascii") - except (UnicodeEncodeError, UnicodeDecodeError): - pass - else: - return result - - if six.PY2: # Python 2: - value = value.encode("utf-8") - - # encode_rfc2231 accepts an encoded string and returns an ascii-encoded - # string in Python 2 but accepts and returns unicode strings in Python 3 - value = email.utils.encode_rfc2231(value, "utf-8") - value = "%s*=%s" % (name, value) - - if six.PY2: # Python 2: - value = value.decode("utf-8") - - return value - - -_HTML5_REPLACEMENTS = { - u"\u0022": u"%22", - # Replace "\" with "\\". - u"\u005C": u"\u005C\u005C", -} - -# All control characters from 0x00 to 0x1F *except* 0x1B. -_HTML5_REPLACEMENTS.update( - { - six.unichr(cc): u"%{:02X}".format(cc) - for cc in range(0x00, 0x1F + 1) - if cc not in (0x1B,) - } -) - - -def _replace_multiple(value, needles_and_replacements): - def replacer(match): - return needles_and_replacements[match.group(0)] - - pattern = re.compile( - r"|".join([re.escape(needle) for needle in needles_and_replacements.keys()]) - ) - - result = pattern.sub(replacer, value) - - return result - - -def format_header_param_html5(name, value): - """ - Helper function to format and quote a single header parameter using the - HTML5 strategy. - - Particularly useful for header parameters which might contain - non-ASCII values, like file names. This follows the `HTML5 Working Draft - Section 4.10.22.7`_ and matches the behavior of curl and modern browsers. - - .. _HTML5 Working Draft Section 4.10.22.7: - https://w3c.github.io/html/sec-forms.html#multipart-form-data - - :param name: - The name of the parameter, a string expected to be ASCII only. - :param value: - The value of the parameter, provided as ``bytes`` or `str``. - :ret: - A unicode string, stripped of troublesome characters. - """ - if isinstance(value, six.binary_type): - value = value.decode("utf-8") - - value = _replace_multiple(value, _HTML5_REPLACEMENTS) - - return u'%s="%s"' % (name, value) - - -# For backwards-compatibility. -format_header_param = format_header_param_html5 - - -class RequestField(object): - """ - A data container for request body parameters. - - :param name: - The name of this request field. Must be unicode. - :param data: - The data/value body. - :param filename: - An optional filename of the request field. Must be unicode. - :param headers: - An optional dict-like object of headers to initially use for the field. - :param header_formatter: - An optional callable that is used to encode and format the headers. By - default, this is :func:`format_header_param_html5`. - """ - - def __init__( - self, - name, - data, - filename=None, - headers=None, - header_formatter=format_header_param_html5, - ): - self._name = name - self._filename = filename - self.data = data - self.headers = {} - if headers: - self.headers = dict(headers) - self.header_formatter = header_formatter - - @classmethod - def from_tuples(cls, fieldname, value, header_formatter=format_header_param_html5): - """ - A :class:`~urllib3.fields.RequestField` factory from old-style tuple parameters. - - Supports constructing :class:`~urllib3.fields.RequestField` from - parameter of key/value strings AND key/filetuple. A filetuple is a - (filename, data, MIME type) tuple where the MIME type is optional. - For example:: - - 'foo': 'bar', - 'fakefile': ('foofile.txt', 'contents of foofile'), - 'realfile': ('barfile.txt', open('realfile').read()), - 'typedfile': ('bazfile.bin', open('bazfile').read(), 'image/jpeg'), - 'nonamefile': 'contents of nonamefile field', - - Field names and filenames must be unicode. - """ - if isinstance(value, tuple): - if len(value) == 3: - filename, data, content_type = value - else: - filename, data = value - content_type = guess_content_type(filename) - else: - filename = None - content_type = None - data = value - - request_param = cls( - fieldname, data, filename=filename, header_formatter=header_formatter - ) - request_param.make_multipart(content_type=content_type) - - return request_param - - def _render_part(self, name, value): - """ - Overridable helper function to format a single header parameter. By - default, this calls ``self.header_formatter``. - - :param name: - The name of the parameter, a string expected to be ASCII only. - :param value: - The value of the parameter, provided as a unicode string. - """ - - return self.header_formatter(name, value) - - def _render_parts(self, header_parts): - """ - Helper function to format and quote a single header. - - Useful for single headers that are composed of multiple items. E.g., - 'Content-Disposition' fields. - - :param header_parts: - A sequence of (k, v) tuples or a :class:`dict` of (k, v) to format - as `k1="v1"; k2="v2"; ...`. - """ - parts = [] - iterable = header_parts - if isinstance(header_parts, dict): - iterable = header_parts.items() - - for name, value in iterable: - if value is not None: - parts.append(self._render_part(name, value)) - - return u"; ".join(parts) - - def render_headers(self): - """ - Renders the headers for this request field. - """ - lines = [] - - sort_keys = ["Content-Disposition", "Content-Type", "Content-Location"] - for sort_key in sort_keys: - if self.headers.get(sort_key, False): - lines.append(u"%s: %s" % (sort_key, self.headers[sort_key])) - - for header_name, header_value in self.headers.items(): - if header_name not in sort_keys: - if header_value: - lines.append(u"%s: %s" % (header_name, header_value)) - - lines.append(u"\r\n") - return u"\r\n".join(lines) - - def make_multipart( - self, content_disposition=None, content_type=None, content_location=None - ): - """ - Makes this request field into a multipart request field. - - This method overrides "Content-Disposition", "Content-Type" and - "Content-Location" headers to the request parameter. - - :param content_type: - The 'Content-Type' of the request body. - :param content_location: - The 'Content-Location' of the request body. - - """ - self.headers["Content-Disposition"] = content_disposition or u"form-data" - self.headers["Content-Disposition"] += u"; ".join( - [ - u"", - self._render_parts( - ((u"name", self._name), (u"filename", self._filename)) - ), - ] - ) - self.headers["Content-Type"] = content_type - self.headers["Content-Location"] = content_location diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/filepost.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/filepost.py deleted file mode 100644 index 36c9252..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/filepost.py +++ /dev/null @@ -1,98 +0,0 @@ -from __future__ import absolute_import - -import binascii -import codecs -import os -from io import BytesIO - -from .fields import RequestField -from .packages import six -from .packages.six import b - -writer = codecs.lookup("utf-8")[3] - - -def choose_boundary(): - """ - Our embarrassingly-simple replacement for mimetools.choose_boundary. - """ - boundary = binascii.hexlify(os.urandom(16)) - if not six.PY2: - boundary = boundary.decode("ascii") - return boundary - - -def iter_field_objects(fields): - """ - Iterate over fields. - - Supports list of (k, v) tuples and dicts, and lists of - :class:`~urllib3.fields.RequestField`. - - """ - if isinstance(fields, dict): - i = six.iteritems(fields) - else: - i = iter(fields) - - for field in i: - if isinstance(field, RequestField): - yield field - else: - yield RequestField.from_tuples(*field) - - -def iter_fields(fields): - """ - .. deprecated:: 1.6 - - Iterate over fields. - - The addition of :class:`~urllib3.fields.RequestField` makes this function - obsolete. Instead, use :func:`iter_field_objects`, which returns - :class:`~urllib3.fields.RequestField` objects. - - Supports list of (k, v) tuples and dicts. - """ - if isinstance(fields, dict): - return ((k, v) for k, v in six.iteritems(fields)) - - return ((k, v) for k, v in fields) - - -def encode_multipart_formdata(fields, boundary=None): - """ - Encode a dictionary of ``fields`` using the multipart/form-data MIME format. - - :param fields: - Dictionary of fields or list of (key, :class:`~urllib3.fields.RequestField`). - - :param boundary: - If not specified, then a random boundary will be generated using - :func:`urllib3.filepost.choose_boundary`. - """ - body = BytesIO() - if boundary is None: - boundary = choose_boundary() - - for field in iter_field_objects(fields): - body.write(b("--%s\r\n" % (boundary))) - - writer(body).write(field.render_headers()) - data = field.data - - if isinstance(data, int): - data = str(data) # Backwards compatibility - - if isinstance(data, six.text_type): - writer(body).write(data) - else: - body.write(data) - - body.write(b"\r\n") - - body.write(b("--%s--\r\n" % (boundary))) - - content_type = str("multipart/form-data; boundary=%s" % boundary) - - return body.getvalue(), content_type diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 64268e4e101003e77bb1c477762997b05f4b3eb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 221 zcmZ9GJr2S!422sC5<==h7+MRuA|__85QWBSBl4#tEvn!iZ0wwcV{ii0trO|Oz>{o0 z`+b97S++`|s>ijN=6h=Y8s_nGPx@p{j?cu+;x<goc!S0$1jT~y;9#m&p$;AbN~|4I zxeuZ`qszIuXlWQn2Oa7Tq&R`?Lt}JVY_{M<z}&Lx%xd&tg#{WhZXC2uMz(}sNU6{w cP+Hi2T<(<Nt;D@s#Aiq>KbcQT2ytn2UsioS$N&HU diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-312.pyc deleted file mode 100644 index bf0b63d86f5d46711a6039897203ad1511329e57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41341 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 3ae89b3a7afe2c52bd58056f85c30785f4026227..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 231 zcmZ9GI|>3p42E}nfCwJMVhy^jSXq08VcZSw;JnDpt}OOm!Oq^ZcnnV<c2;H^3x7!R zC;1?G%x2S!Ro>2ZU!Q&Y*L%d1Yu06RvAbt9;O^Zsp9|F9B3PAT3tL|{7F~*v(BOfT z&12H#5h<_y$r-OIBxupKVDuhBmul~d#c~BvC(MH?kLrLCf({@Vt2{wNhS>ss%RN)U i6CaUMJDsFlgzht0TVFK>H#FwA1V`-6Ybb=EA-gXxfI`Xu diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-312.pyc deleted file mode 100644 index a20b9af2d1f103827b9371e523d7f50bbd833289..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1847 zcmZux-EY%Y6u)*HJF)XkA&igd(n&xNB!X^2n<lifwyc8zqGf31A$8)L)~#bl*G@w_ z2So@?srFKys5UVn?WI#+_BZTxFDcd3)G80to_J#_PrPi$cARD(CyMVm_nxocx#yl= z<8cuIm4Enpel?8HAFdD(+hg`m1M?IqXa*^a!fMP618YcQtD%_?gQ7?YE8JsdhFfNH z{K_-2B$pR!2DQw5RbC_&RU_iV|BxtN4b-qTPw?$!Yu?cD2%eoajq)O~`o^=fxJuwq z!4-qzx=C<DwdS#`gN3TkfwgRj4OzELY#F#riEI%p<KYSfAI82jY?KyA*~*KrTue7} zj1!siqD<Z@^F5gE;_@N*?`Ht~Q)Dsjrb{-n+2iM-2tP85#}G1;maFTL!rILDtP*+_ z3iKW^3THD*sL3l~cYVN^P%N8|p{8I9CTH^|`#AzF-qVUGLNjU$G;Bwe@JbvZka$nx ze940A@ySMZbhCFkP0<F=3xgPXT1v#VE3?IZjyBt3m1vW-Sw&m~dz!K$fzJi64Fbtu zdzxoKGigUmX#lNsfYKJH5afLfvOQ`=0}l(afIC=i5q|7uFQ2BQkAPivz$S5^8*rXQ zfK}2VieI$>t5l$Su>RA^j!@Q?rqF;*=0G>#Y{?GUoE_fe{GDdZX6#t8Ul%(zg>tc# zk3<X<^e#3k|J$$?YE=6zo&O;38C`LaJ50%8sKYc?;;OzRYpQ~)hC=X47N0eAZ5h+^ zxN#nru&ilDgD5#FfE9Hwn7SR{pjU1qzWNJ@x`kOeRo6@PN`+9OVAF#3ubQ}8H!WNu zxTNYbUCv2P$Rw5{ekp5pGES*Msh3Nl7`)ITB^A?QRl_+nHa;<W_r`Sb>fMQn@jJz- z$(eB{akUrW&b`~RN(W>jD`Y^vM^y{t_%wN7P2Rdk<ys9y&V`tZJDf?h3LSD`ME#uM z0Xq?*mkq_`c;e<}I)Y9bnyM2=Xn;TWL;zgAiVq1k<c90j2?68qzBh-nAg&30kK9}8 z)7x(f^G1~vs<LG+6~>Hmy-HwS6fB~VIVx8#n3f7Nhh9*OhOQYdq{0%>mkOF%D%8Bm zG?Kq~sbB)Q3pJQq@*FV>HMLeKf|_E`LY-=$J5uN$_J<$@^@m`-w(O*X?SA3uFeK|H zZ06x!Tj)&;#gc97+Yi4>zL3tmOdS1Xy7SKU?Zk~v<VH7<UYl+&wyyP<7m2gav+MU; z*LJ1MlerFevLl`B##3u!?fb2XZXyK-LZTZ<u8piF+QJ~eCuY{(U(arfr&^zOxyTNe zeZghdFK%%se&e!TA=MF%c889%qrk3ReAL_<I<hl#ZfoeAzcc#i;coKqUgkvS<R{yi z(N1i%o6NLD2=L_cUi#2ZdUz{6{Cs31wDHw;`tmBj8%+&vN4L|LR{7tPN7{*Y<KG8u zepiThlZV^!Jt@8;9p93UuTMPxY@_n?+_rS3HP%fHwZ<M#cBN$N`aYBm<-*?MxCxXC zJ3_Ij80BJ-y0gUL{ps&DyI1I+5Pc60=qdQTjeHCZRM*HAdIm)IRhjR?=XHo-m_Iq5 a;r0`V5nrO?uOn!Z`GR>9I?bd!`@aFh8|;t( diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-312.pyc deleted file mode 100644 index 6160dd1a523a709ce3c1f52ee20ac7eba167ef24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7353 zcmcgxYit`=cE0oA@F9w%9=4vbN3YnFEpZh)v6DFV%2v{K9LsH;wustvJmL%`N))NR zGn7n*@+!LqDrenTT5lnFw^-XifyD5lSzwDIKz|gw>5l^aBiSm%%(|$7{MtVSZDoOO z`lsjIAxD%*@5V0B3-HdluXE46_q*qud-!j)wLStV`jhv@|Fe;hFR)Nbt|GDd77)us zBO^rPG(N#i@gqEkw2%-+1ojn2MEHsc*OW9OL7Qug8*%gG4~QmRhLY~NE7;sdycr?v z&T76<H99$+qNdS5tE-b#k14TuQcc9Oy6;j&^7&4dy36LcF8^W198V?XL-K_S#nJtx z(HAbrQ#!P2{k~u0lwr;as-s3Kkv4TDK7~^bL!AIKTA`g&M{ObP+*$uaC@&M8jBv0A zyvD(r`4KTrMqHXOBJo6bPlU<`+VtIG)rc2*`QTT>_CsX*;dl0<7I$bQpw(%f%iKs% z^Fk@4`5>>;>$RH8#NpEbWq(<@QE!~+t(;e@E$^cRfYWZhNeh<MHbXg7R&L3-!}S!` ztA=<&P9;>skYgz-7dKTk<FMPQm|Wa1bu^*NsnH2NY8pNnQfc$|L*+p^mQF?w%DpNb zGvL!ZIg3<Srn;G?NkdlUsG3MH9;I=Vaj`kdv*YpTxI7zAB;-+@_0=_~)IoyL2{~@a zV=5h0$Dk>dNPq~s)-S(3t``NNhAErzDV^cO;g7>`R^SvjWqn3Xq*YUgMS`gNQPMI& z86!2RIRYc%sBWYaX1_cbGj$5Qfge_Hn?Tc5?Vt=J83&v$o*cvZCek2OY5Bvcq~6bZ z{28tZxlGg47*(fa{bJmN{Yhq^^OPD-;&5jM`$X)`fkC#ECJvER)1>iH05~qwq-ovR zJ(^C+@g%UD(WwDvMm3Ng4l+u0cBr->Co{69$5dD#uwopGeC*~s<c)0?gDZk=6H&kY zVr2NR@YU{}*Q#GRos6ZzlI1S8SR!t`B_c2^$p(le*>hX2cv90Z4u?g{qbNyrN>>!i zrzle?EuBExuPEP6tBGQZS5b^a$}|*(x<Q;xl<lhzBjc$lJu;=5#!O@=6-`g+Nz;g! zdP2vI?la7IbW*2%T52|#NU5+Xkr_QX6G_BJBhyT`9O@r<A!5W$y>A*c51`G6Ovk4q z3Ut#_G?J!pxTA+6PNSpFA{C3D&R8zC0n`h!?T4R%l3phH#<#9`DX3jScS9B}sz@LS z5#bkv-{uJH_A<$l39Q|bj9yT>B*D$Oa;}Mzx+?1fqolH8k-S?xKTy-W=_$1<B?9NF zaS9GmQbTi+SzD^iaXE4q6b7c8q~NMp%JEQgIOhZ?;nM9k@girS`M?p(_+Yh$BTBd; zW|Q3)xRQzH620{;tpLVs$s$4D_N_i8Do2h1xoxGmuPkLqSQw_bfVaaTt4X2ySlod7 zt!v6`+#FYIK+*touso$k%d6lOK>#zA$<B`Ac~M*r#l53`%uqH<OzIa+t43j<Rsc|x z;{3qHW=J!Zq-b$!X2NbuH1tHw5<t)GU}MW5#^D+<@SxI#M0X)8xF(=0Ohw7IRDiG4 zbO1UUA3!!w^1+6U;DLL=1Dg`5ZGGskzjp4*xs{=t!#9T4{Ri?#US0RMulo-}w`<ue z+3)8T#0O2SD~E20*Do!ISN-|MX83qZpWW?0NZt~mrY66;6+aJlwXAe+wDzvG_TJxh z0BU^sy<H39wZN6YqPga2&v!n*?rHva&t8W7;b;**AQ~ZvR=fq9e-GJ{P(M+APoN*B z9JnJTB+l_Uo*n@-;F;`5MlVlte6?EvwGLvp2F0<rgVL>f8^dw(cie~Ed6MBWT$s;} zoQ}!h!OSq*la!}aIw`9Ls8&@&t5CE6TQ;ZMI=;&EIi6_>lslb`gSNIUhKvSdI4sfU zV0ufKPE7-LjPbOI%4-Kq!UElky*Pz-z}LW?Du)T$q$j|{Zh8$zorP?k6eJRAymslz zrHx?6TCn3*_s8P>VBdoHc};LdyczgWAm7lwczF5crI%N<oADd*)rJ!v4}Egx&Y61$ zU;FfhwT2U`{u2d(wCr0r%uYJ$TyJ2H%8DIy0f?tN=+fn%<8s_Zj)pjr<Ekk?M_~aR z-hUn705k1O6OPK-YAJ^j-4Cjas|F0HtpW?E#hbq)mB11c9jN@}*MmyAKV`d9MQ7^w z!o^*L%b0H3YN;E9+JTlkHd+`|s0{7f@gixusYb`MO%+PTZWzK5V~|zB%KhNJ1u-9} zzZd9PG?#NrInW(Kz9z76V#U09>Bgmvy#s4|2Y%N5skpxPwR~gKO5@Fz8!fknK01B- z^vC8W@7;OtUgVpfj;=NguKEW7Me^~56TbsR{|Hk2KcL7)Llu+yG#J^A22dMkw_~Ar z>!1DTZB0SLuqV|l679uv+ol=BX<eVp?y5Lvtj5Qm@yC!o)hU0CBlWjc9w^!ZrWW=9 zfd^Xs+Rl*k@UF|Yf&-1pa?3|X|CedtFvsu@AJm5is-B{;bg}kqrH{($-^ShzkQG-8 z;JvhTX*Jlh>glNz7e!^_qHcLs{F#p9mg7pg4fL9y>9s0YV@vO?T)HuyN+-0kCzA>f z9dK0ch-@nu9xQP*l}a#YBFwX`vF!xzd(oR<jaBZv?F+pF9S!s)o`i-6!G^`5?`Q7? z!(bIAZ%nRw!uGzEn|Wv7E&!)z+&47xb=CGR$1BL6r3}fCJKQiGfKtgey72L*SK7zl zy>N7o4ZKqG<RLglWoD77Ixvb4TKBA^e|%tJ=&#R!!t#eI;ey77!Q~*}@fnx>6h?2p zOXEz(z=5Y;G{Du&nTcL2OI!V7d=}t$9)0Kk1DCR~{MVGg=@%1i3BXIwHXrLTiZKUx zq{=;A7hh$b)$wdcl@<(M^w46*<3;CbOC?&OnVHrpzF#dqu2oTq;8Rn5nm)l<vYT`m zZhQ|i=2KT-qMG@8HQ&(p4~;+5e%`t<Ftj!>^e?0T+W6V{>Nn1<HJn@ZpL^Kw(t}Xr z;@j7K8=<bXP}hS{{o>*49;`cm-MbO$Tnlw#-J$F5g4gv*;1O{(1`5Pg8>mE^<4ZpT z37-aSCC6!qT;s0sQDKZk`FG)g`WJA8=Q#APt9sVl)dqME@-cpizuGL4If3;Rs<~Ji zcbWXuIb~3E!nU~pZO&XAaPx}rHlE|>z|)Sx%h9H1x6y!*ZT=-{8&u<)a&hq**8)^E z9}x5@Km2RF8(=N)X$H|j5#DK2Wme-W&#{C$HL9t{vxh3IqympN2tz4=IrcK_KbA;= zH*FjT!X7jOTn&6h&XZf>tv|Z${;2kL?L1*;hOx*=JrlOIGz33z=HheDfM6wrL4;_+ zu(+7T#VzhFLj*qH(-+NIXy@$Nj^8UFMR8D}F(uyh{6~Ga`!+gXT<d)Ce&>-5|IiI- zrEX>L(}90J`cFp})Wy0F{&dwpw7{+Thw>ipHR+19*3h>gt$X_Oa>qunb1Am??Ujxn zaQB0qtDer^Zn{YA>)da@2zDBHzkbp<*e(5Bg6tQK{=r^p+c7!MfB+mAgqXQG&ie$L zPrs}2EY^Yeb4(^oP)sG%(s~V$2Yno!Rq8>UP%1_r<^-5Yct5li0jcKD(>CxxoESqT zr#T3JZ*fo@xpIQRCBr#k!ihCh87q1Tyhg>6<ZutfC-^%MF?o}Gm%I9oCX~(QJT-D0 zt@{o?(Y7^5iQ3|grm%~ccqA-!6S|KhCSDSjCNK`QBbBvcfNDo7@&1r-<Q;NVnI#v6 zcgQT)MV?*CSyJK>7Kh&`hGqixTZSKtT3&b;Coy!aS#B+EAY}((&|#!+VAc(p<$e8P zRG-GMwIvuC!}95@Jf2ETS{|SwU;@{*2fIo(!?25<#9|HA?FwZqO236Q?rDhmK`54< zf|7wpjMvY;f3y{f+1AP{R|*kjaLj)}26xRzn%Wm?3Vge_Js+&UHuu5YuR<*k8+I)p zTRQf`;}92FJd<zSz5M3Vn?HOj-@0ef4H1=m)1JletoOdM(K~prcQD`Cv(fp|TIWmm zJCClo^Di7(Z{EM&9QnMhGvEANzIpG>nj1Agu3a1~@a|nlANfd2>)#6Sj&FbN)~S!q z-afn5Hn7?_u-Z0I*h`w)3f-i)pT&Bf|2){557jSwm%M*d1I|mR?Z3aQCG9<r3AgL$ zgXXrIfg6FJ3ZMAz`0obpHy<eoQ2jr!oF@+d%J>E>`SRe4r@F~6UU8osAiw15fd1t` z->DAavpqb}pUE839Rkwb@{lOd!!Rh^%FHsY1De)DX1NtbOGUvRBUWu+mK~fIgJ~xC zvxeo0rqW51V)&0TBw*0clI%Ye>;PRSw(Z000A_vI!2^MJa0AQ?jbI&%^GSwoVvz1- z>`)WMze4Q)lWcV1d9y$>Q{F88W&;p$fifGPL3Wuu;=L|UVGpTmm_H3$i`g#7>N^(0 z%aNtX{rax?Gx^&3`8V==x>m)uFGbFEmRpp*B=~(Sg<ShKyIrnta*qR&>m>I$gn1!E zq`)JdcRjx;098P$;9+%wtG8GO6r7CY|EqW3fA<kD*nJxcNImw|xB`V%BGo<OMOPON zs4E~<@UyxOS39eF!~<m;Cm+S9ABNv!Y54aB!tWG4Sb82ad>Yy>OteXOPAt4c{{-uC zKXz;sSW!EOf1Lg~w4%v1`XK{6aoi)(#fiW16K>xZB=jrd`w!Ceu;#f{-=2B*m(rU& O*S<LO8-iaZ*#81&QAmUU diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py deleted file mode 100644 index b8fb215..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py +++ /dev/null @@ -1,51 +0,0 @@ -# -*- coding: utf-8 -*- -""" -backports.makefile -~~~~~~~~~~~~~~~~~~ - -Backports the Python 3 ``socket.makefile`` method for use with anything that -wants to create a "fake" socket object. -""" -import io -from socket import SocketIO - - -def backport_makefile( - self, mode="r", buffering=None, encoding=None, errors=None, newline=None -): - """ - Backport of ``socket.makefile`` from Python 3.5. - """ - if not set(mode) <= {"r", "w", "b"}: - raise ValueError("invalid mode %r (only r, w, b allowed)" % (mode,)) - writing = "w" in mode - reading = "r" in mode or not writing - assert reading or writing - binary = "b" in mode - rawmode = "" - if reading: - rawmode += "r" - if writing: - rawmode += "w" - raw = SocketIO(self, rawmode) - self._makefile_refs += 1 - if buffering is None: - buffering = -1 - if buffering < 0: - buffering = io.DEFAULT_BUFFER_SIZE - if buffering == 0: - if not binary: - raise ValueError("unbuffered streams must be binary") - return raw - if reading and writing: - buffer = io.BufferedRWPair(raw, raw, buffering) - elif reading: - buffer = io.BufferedReader(raw, buffering) - else: - assert writing - buffer = io.BufferedWriter(raw, buffering) - if binary: - return buffer - text = io.TextIOWrapper(buffer, encoding, errors, newline) - text.mode = mode - return text diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py deleted file mode 100644 index a2f2966..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py +++ /dev/null @@ -1,155 +0,0 @@ -# -*- coding: utf-8 -*- -""" -backports.weakref_finalize -~~~~~~~~~~~~~~~~~~ - -Backports the Python 3 ``weakref.finalize`` method. -""" -from __future__ import absolute_import - -import itertools -import sys -from weakref import ref - -__all__ = ["weakref_finalize"] - - -class weakref_finalize(object): - """Class for finalization of weakrefable objects - finalize(obj, func, *args, **kwargs) returns a callable finalizer - object which will be called when obj is garbage collected. The - first time the finalizer is called it evaluates func(*arg, **kwargs) - and returns the result. After this the finalizer is dead, and - calling it just returns None. - When the program exits any remaining finalizers for which the - atexit attribute is true will be run in reverse order of creation. - By default atexit is true. - """ - - # Finalizer objects don't have any state of their own. They are - # just used as keys to lookup _Info objects in the registry. This - # ensures that they cannot be part of a ref-cycle. - - __slots__ = () - _registry = {} - _shutdown = False - _index_iter = itertools.count() - _dirty = False - _registered_with_atexit = False - - class _Info(object): - __slots__ = ("weakref", "func", "args", "kwargs", "atexit", "index") - - def __init__(self, obj, func, *args, **kwargs): - if not self._registered_with_atexit: - # We may register the exit function more than once because - # of a thread race, but that is harmless - import atexit - - atexit.register(self._exitfunc) - weakref_finalize._registered_with_atexit = True - info = self._Info() - info.weakref = ref(obj, self) - info.func = func - info.args = args - info.kwargs = kwargs or None - info.atexit = True - info.index = next(self._index_iter) - self._registry[self] = info - weakref_finalize._dirty = True - - def __call__(self, _=None): - """If alive then mark as dead and return func(*args, **kwargs); - otherwise return None""" - info = self._registry.pop(self, None) - if info and not self._shutdown: - return info.func(*info.args, **(info.kwargs or {})) - - def detach(self): - """If alive then mark as dead and return (obj, func, args, kwargs); - otherwise return None""" - info = self._registry.get(self) - obj = info and info.weakref() - if obj is not None and self._registry.pop(self, None): - return (obj, info.func, info.args, info.kwargs or {}) - - def peek(self): - """If alive then return (obj, func, args, kwargs); - otherwise return None""" - info = self._registry.get(self) - obj = info and info.weakref() - if obj is not None: - return (obj, info.func, info.args, info.kwargs or {}) - - @property - def alive(self): - """Whether finalizer is alive""" - return self in self._registry - - @property - def atexit(self): - """Whether finalizer should be called at exit""" - info = self._registry.get(self) - return bool(info) and info.atexit - - @atexit.setter - def atexit(self, value): - info = self._registry.get(self) - if info: - info.atexit = bool(value) - - def __repr__(self): - info = self._registry.get(self) - obj = info and info.weakref() - if obj is None: - return "<%s object at %#x; dead>" % (type(self).__name__, id(self)) - else: - return "<%s object at %#x; for %r at %#x>" % ( - type(self).__name__, - id(self), - type(obj).__name__, - id(obj), - ) - - @classmethod - def _select_for_exit(cls): - # Return live finalizers marked for exit, oldest first - L = [(f, i) for (f, i) in cls._registry.items() if i.atexit] - L.sort(key=lambda item: item[1].index) - return [f for (f, i) in L] - - @classmethod - def _exitfunc(cls): - # At shutdown invoke finalizers for which atexit is true. - # This is called once all other non-daemonic threads have been - # joined. - reenable_gc = False - try: - if cls._registry: - import gc - - if gc.isenabled(): - reenable_gc = True - gc.disable() - pending = None - while True: - if pending is None or weakref_finalize._dirty: - pending = cls._select_for_exit() - weakref_finalize._dirty = False - if not pending: - break - f = pending.pop() - try: - # gc is disabled, so (assuming no daemonic - # threads) the following is the only line in - # this function which might trigger creation - # of a new finalizer - f() - except Exception: - sys.excepthook(*sys.exc_info()) - assert f not in cls._registry - finally: - # prevent any more finalizers from executing during shutdown - weakref_finalize._shutdown = True - if reenable_gc: - gc.enable() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/six.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/six.py deleted file mode 100644 index f099a3d..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/six.py +++ /dev/null @@ -1,1076 +0,0 @@ -# Copyright (c) 2010-2020 Benjamin Peterson -# -# 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. - -"""Utilities for writing code that runs on Python 2 and 3""" - -from __future__ import absolute_import - -import functools -import itertools -import operator -import sys -import types - -__author__ = "Benjamin Peterson <benjamin@python.org>" -__version__ = "1.16.0" - - -# Useful for very coarse version differentiation. -PY2 = sys.version_info[0] == 2 -PY3 = sys.version_info[0] == 3 -PY34 = sys.version_info[0:2] >= (3, 4) - -if PY3: - string_types = (str,) - integer_types = (int,) - class_types = (type,) - text_type = str - binary_type = bytes - - MAXSIZE = sys.maxsize -else: - string_types = (basestring,) - integer_types = (int, long) - class_types = (type, types.ClassType) - text_type = unicode - binary_type = str - - if sys.platform.startswith("java"): - # Jython always uses 32 bits. - MAXSIZE = int((1 << 31) - 1) - else: - # It's possible to have sizeof(long) != sizeof(Py_ssize_t). - class X(object): - def __len__(self): - return 1 << 31 - - try: - len(X()) - except OverflowError: - # 32-bit - MAXSIZE = int((1 << 31) - 1) - else: - # 64-bit - MAXSIZE = int((1 << 63) - 1) - del X - -if PY34: - from importlib.util import spec_from_loader -else: - spec_from_loader = None - - -def _add_doc(func, doc): - """Add documentation to a function.""" - func.__doc__ = doc - - -def _import_module(name): - """Import module, returning the module after the last dot.""" - __import__(name) - return sys.modules[name] - - -class _LazyDescr(object): - def __init__(self, name): - self.name = name - - def __get__(self, obj, tp): - result = self._resolve() - setattr(obj, self.name, result) # Invokes __set__. - try: - # This is a bit ugly, but it avoids running this again by - # removing this descriptor. - delattr(obj.__class__, self.name) - except AttributeError: - pass - return result - - -class MovedModule(_LazyDescr): - def __init__(self, name, old, new=None): - super(MovedModule, self).__init__(name) - if PY3: - if new is None: - new = name - self.mod = new - else: - self.mod = old - - def _resolve(self): - return _import_module(self.mod) - - def __getattr__(self, attr): - _module = self._resolve() - value = getattr(_module, attr) - setattr(self, attr, value) - return value - - -class _LazyModule(types.ModuleType): - def __init__(self, name): - super(_LazyModule, self).__init__(name) - self.__doc__ = self.__class__.__doc__ - - def __dir__(self): - attrs = ["__doc__", "__name__"] - attrs += [attr.name for attr in self._moved_attributes] - return attrs - - # Subclasses should override this - _moved_attributes = [] - - -class MovedAttribute(_LazyDescr): - def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): - super(MovedAttribute, self).__init__(name) - if PY3: - if new_mod is None: - new_mod = name - self.mod = new_mod - if new_attr is None: - if old_attr is None: - new_attr = name - else: - new_attr = old_attr - self.attr = new_attr - else: - self.mod = old_mod - if old_attr is None: - old_attr = name - self.attr = old_attr - - def _resolve(self): - module = _import_module(self.mod) - return getattr(module, self.attr) - - -class _SixMetaPathImporter(object): - - """ - A meta path importer to import six.moves and its submodules. - - This class implements a PEP302 finder and loader. It should be compatible - with Python 2.5 and all existing versions of Python3 - """ - - def __init__(self, six_module_name): - self.name = six_module_name - self.known_modules = {} - - def _add_module(self, mod, *fullnames): - for fullname in fullnames: - self.known_modules[self.name + "." + fullname] = mod - - def _get_module(self, fullname): - return self.known_modules[self.name + "." + fullname] - - def find_module(self, fullname, path=None): - if fullname in self.known_modules: - return self - return None - - def find_spec(self, fullname, path, target=None): - if fullname in self.known_modules: - return spec_from_loader(fullname, self) - return None - - def __get_module(self, fullname): - try: - return self.known_modules[fullname] - except KeyError: - raise ImportError("This loader does not know module " + fullname) - - def load_module(self, fullname): - try: - # in case of a reload - return sys.modules[fullname] - except KeyError: - pass - mod = self.__get_module(fullname) - if isinstance(mod, MovedModule): - mod = mod._resolve() - else: - mod.__loader__ = self - sys.modules[fullname] = mod - return mod - - def is_package(self, fullname): - """ - Return true, if the named module is a package. - - We need this method to get correct spec objects with - Python 3.4 (see PEP451) - """ - return hasattr(self.__get_module(fullname), "__path__") - - def get_code(self, fullname): - """Return None - - Required, if is_package is implemented""" - self.__get_module(fullname) # eventually raises ImportError - return None - - get_source = get_code # same as get_code - - def create_module(self, spec): - return self.load_module(spec.name) - - def exec_module(self, module): - pass - - -_importer = _SixMetaPathImporter(__name__) - - -class _MovedItems(_LazyModule): - - """Lazy loading of moved objects""" - - __path__ = [] # mark as package - - -_moved_attributes = [ - MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), - MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), - MovedAttribute( - "filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse" - ), - MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), - MovedAttribute("intern", "__builtin__", "sys"), - MovedAttribute("map", "itertools", "builtins", "imap", "map"), - MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), - MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), - MovedAttribute("getoutput", "commands", "subprocess"), - MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute( - "reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload" - ), - MovedAttribute("reduce", "__builtin__", "functools"), - MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), - MovedAttribute("StringIO", "StringIO", "io"), - MovedAttribute("UserDict", "UserDict", "collections"), - MovedAttribute("UserList", "UserList", "collections"), - MovedAttribute("UserString", "UserString", "collections"), - MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), - MovedAttribute( - "zip_longest", "itertools", "itertools", "izip_longest", "zip_longest" - ), - MovedModule("builtins", "__builtin__"), - MovedModule("configparser", "ConfigParser"), - MovedModule( - "collections_abc", - "collections", - "collections.abc" if sys.version_info >= (3, 3) else "collections", - ), - MovedModule("copyreg", "copy_reg"), - MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), - MovedModule("dbm_ndbm", "dbm", "dbm.ndbm"), - MovedModule( - "_dummy_thread", - "dummy_thread", - "_dummy_thread" if sys.version_info < (3, 9) else "_thread", - ), - MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), - MovedModule("http_cookies", "Cookie", "http.cookies"), - MovedModule("html_entities", "htmlentitydefs", "html.entities"), - MovedModule("html_parser", "HTMLParser", "html.parser"), - MovedModule("http_client", "httplib", "http.client"), - MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), - MovedModule("email_mime_image", "email.MIMEImage", "email.mime.image"), - MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), - MovedModule( - "email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart" - ), - MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), - MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), - MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), - MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), - MovedModule("cPickle", "cPickle", "pickle"), - MovedModule("queue", "Queue"), - MovedModule("reprlib", "repr"), - MovedModule("socketserver", "SocketServer"), - MovedModule("_thread", "thread", "_thread"), - MovedModule("tkinter", "Tkinter"), - MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), - MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), - MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), - MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), - MovedModule("tkinter_tix", "Tix", "tkinter.tix"), - MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), - MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), - MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), - MovedModule("tkinter_colorchooser", "tkColorChooser", "tkinter.colorchooser"), - MovedModule("tkinter_commondialog", "tkCommonDialog", "tkinter.commondialog"), - MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), - MovedModule("tkinter_font", "tkFont", "tkinter.font"), - MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), - MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", "tkinter.simpledialog"), - MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), - MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), - MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), - MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), - MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), - MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), -] -# Add windows specific modules. -if sys.platform == "win32": - _moved_attributes += [ - MovedModule("winreg", "_winreg"), - ] - -for attr in _moved_attributes: - setattr(_MovedItems, attr.name, attr) - if isinstance(attr, MovedModule): - _importer._add_module(attr, "moves." + attr.name) -del attr - -_MovedItems._moved_attributes = _moved_attributes - -moves = _MovedItems(__name__ + ".moves") -_importer._add_module(moves, "moves") - - -class Module_six_moves_urllib_parse(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_parse""" - - -_urllib_parse_moved_attributes = [ - MovedAttribute("ParseResult", "urlparse", "urllib.parse"), - MovedAttribute("SplitResult", "urlparse", "urllib.parse"), - MovedAttribute("parse_qs", "urlparse", "urllib.parse"), - MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), - MovedAttribute("urldefrag", "urlparse", "urllib.parse"), - MovedAttribute("urljoin", "urlparse", "urllib.parse"), - MovedAttribute("urlparse", "urlparse", "urllib.parse"), - MovedAttribute("urlsplit", "urlparse", "urllib.parse"), - MovedAttribute("urlunparse", "urlparse", "urllib.parse"), - MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), - MovedAttribute("quote", "urllib", "urllib.parse"), - MovedAttribute("quote_plus", "urllib", "urllib.parse"), - MovedAttribute("unquote", "urllib", "urllib.parse"), - MovedAttribute("unquote_plus", "urllib", "urllib.parse"), - MovedAttribute( - "unquote_to_bytes", "urllib", "urllib.parse", "unquote", "unquote_to_bytes" - ), - MovedAttribute("urlencode", "urllib", "urllib.parse"), - MovedAttribute("splitquery", "urllib", "urllib.parse"), - MovedAttribute("splittag", "urllib", "urllib.parse"), - MovedAttribute("splituser", "urllib", "urllib.parse"), - MovedAttribute("splitvalue", "urllib", "urllib.parse"), - MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), - MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), - MovedAttribute("uses_params", "urlparse", "urllib.parse"), - MovedAttribute("uses_query", "urlparse", "urllib.parse"), - MovedAttribute("uses_relative", "urlparse", "urllib.parse"), -] -for attr in _urllib_parse_moved_attributes: - setattr(Module_six_moves_urllib_parse, attr.name, attr) -del attr - -Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes - -_importer._add_module( - Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), - "moves.urllib_parse", - "moves.urllib.parse", -) - - -class Module_six_moves_urllib_error(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_error""" - - -_urllib_error_moved_attributes = [ - MovedAttribute("URLError", "urllib2", "urllib.error"), - MovedAttribute("HTTPError", "urllib2", "urllib.error"), - MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), -] -for attr in _urllib_error_moved_attributes: - setattr(Module_six_moves_urllib_error, attr.name, attr) -del attr - -Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes - -_importer._add_module( - Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), - "moves.urllib_error", - "moves.urllib.error", -) - - -class Module_six_moves_urllib_request(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_request""" - - -_urllib_request_moved_attributes = [ - MovedAttribute("urlopen", "urllib2", "urllib.request"), - MovedAttribute("install_opener", "urllib2", "urllib.request"), - MovedAttribute("build_opener", "urllib2", "urllib.request"), - MovedAttribute("pathname2url", "urllib", "urllib.request"), - MovedAttribute("url2pathname", "urllib", "urllib.request"), - MovedAttribute("getproxies", "urllib", "urllib.request"), - MovedAttribute("Request", "urllib2", "urllib.request"), - MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), - MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), - MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), - MovedAttribute("BaseHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), - MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), - MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), - MovedAttribute("FileHandler", "urllib2", "urllib.request"), - MovedAttribute("FTPHandler", "urllib2", "urllib.request"), - MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), - MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), - MovedAttribute("urlretrieve", "urllib", "urllib.request"), - MovedAttribute("urlcleanup", "urllib", "urllib.request"), - MovedAttribute("URLopener", "urllib", "urllib.request"), - MovedAttribute("FancyURLopener", "urllib", "urllib.request"), - MovedAttribute("proxy_bypass", "urllib", "urllib.request"), - MovedAttribute("parse_http_list", "urllib2", "urllib.request"), - MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"), -] -for attr in _urllib_request_moved_attributes: - setattr(Module_six_moves_urllib_request, attr.name, attr) -del attr - -Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes - -_importer._add_module( - Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), - "moves.urllib_request", - "moves.urllib.request", -) - - -class Module_six_moves_urllib_response(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_response""" - - -_urllib_response_moved_attributes = [ - MovedAttribute("addbase", "urllib", "urllib.response"), - MovedAttribute("addclosehook", "urllib", "urllib.response"), - MovedAttribute("addinfo", "urllib", "urllib.response"), - MovedAttribute("addinfourl", "urllib", "urllib.response"), -] -for attr in _urllib_response_moved_attributes: - setattr(Module_six_moves_urllib_response, attr.name, attr) -del attr - -Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes - -_importer._add_module( - Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), - "moves.urllib_response", - "moves.urllib.response", -) - - -class Module_six_moves_urllib_robotparser(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_robotparser""" - - -_urllib_robotparser_moved_attributes = [ - MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), -] -for attr in _urllib_robotparser_moved_attributes: - setattr(Module_six_moves_urllib_robotparser, attr.name, attr) -del attr - -Module_six_moves_urllib_robotparser._moved_attributes = ( - _urllib_robotparser_moved_attributes -) - -_importer._add_module( - Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), - "moves.urllib_robotparser", - "moves.urllib.robotparser", -) - - -class Module_six_moves_urllib(types.ModuleType): - - """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" - - __path__ = [] # mark as package - parse = _importer._get_module("moves.urllib_parse") - error = _importer._get_module("moves.urllib_error") - request = _importer._get_module("moves.urllib_request") - response = _importer._get_module("moves.urllib_response") - robotparser = _importer._get_module("moves.urllib_robotparser") - - def __dir__(self): - return ["parse", "error", "request", "response", "robotparser"] - - -_importer._add_module( - Module_six_moves_urllib(__name__ + ".moves.urllib"), "moves.urllib" -) - - -def add_move(move): - """Add an item to six.moves.""" - setattr(_MovedItems, move.name, move) - - -def remove_move(name): - """Remove item from six.moves.""" - try: - delattr(_MovedItems, name) - except AttributeError: - try: - del moves.__dict__[name] - except KeyError: - raise AttributeError("no such move, %r" % (name,)) - - -if PY3: - _meth_func = "__func__" - _meth_self = "__self__" - - _func_closure = "__closure__" - _func_code = "__code__" - _func_defaults = "__defaults__" - _func_globals = "__globals__" -else: - _meth_func = "im_func" - _meth_self = "im_self" - - _func_closure = "func_closure" - _func_code = "func_code" - _func_defaults = "func_defaults" - _func_globals = "func_globals" - - -try: - advance_iterator = next -except NameError: - - def advance_iterator(it): - return it.next() - - -next = advance_iterator - - -try: - callable = callable -except NameError: - - def callable(obj): - return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) - - -if PY3: - - def get_unbound_function(unbound): - return unbound - - create_bound_method = types.MethodType - - def create_unbound_method(func, cls): - return func - - Iterator = object -else: - - def get_unbound_function(unbound): - return unbound.im_func - - def create_bound_method(func, obj): - return types.MethodType(func, obj, obj.__class__) - - def create_unbound_method(func, cls): - return types.MethodType(func, None, cls) - - class Iterator(object): - def next(self): - return type(self).__next__(self) - - callable = callable -_add_doc( - get_unbound_function, """Get the function out of a possibly unbound function""" -) - - -get_method_function = operator.attrgetter(_meth_func) -get_method_self = operator.attrgetter(_meth_self) -get_function_closure = operator.attrgetter(_func_closure) -get_function_code = operator.attrgetter(_func_code) -get_function_defaults = operator.attrgetter(_func_defaults) -get_function_globals = operator.attrgetter(_func_globals) - - -if PY3: - - def iterkeys(d, **kw): - return iter(d.keys(**kw)) - - def itervalues(d, **kw): - return iter(d.values(**kw)) - - def iteritems(d, **kw): - return iter(d.items(**kw)) - - def iterlists(d, **kw): - return iter(d.lists(**kw)) - - viewkeys = operator.methodcaller("keys") - - viewvalues = operator.methodcaller("values") - - viewitems = operator.methodcaller("items") -else: - - def iterkeys(d, **kw): - return d.iterkeys(**kw) - - def itervalues(d, **kw): - return d.itervalues(**kw) - - def iteritems(d, **kw): - return d.iteritems(**kw) - - def iterlists(d, **kw): - return d.iterlists(**kw) - - viewkeys = operator.methodcaller("viewkeys") - - viewvalues = operator.methodcaller("viewvalues") - - viewitems = operator.methodcaller("viewitems") - -_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") -_add_doc(itervalues, "Return an iterator over the values of a dictionary.") -_add_doc(iteritems, "Return an iterator over the (key, value) pairs of a dictionary.") -_add_doc( - iterlists, "Return an iterator over the (key, [values]) pairs of a dictionary." -) - - -if PY3: - - def b(s): - return s.encode("latin-1") - - def u(s): - return s - - unichr = chr - import struct - - int2byte = struct.Struct(">B").pack - del struct - byte2int = operator.itemgetter(0) - indexbytes = operator.getitem - iterbytes = iter - import io - - StringIO = io.StringIO - BytesIO = io.BytesIO - del io - _assertCountEqual = "assertCountEqual" - if sys.version_info[1] <= 1: - _assertRaisesRegex = "assertRaisesRegexp" - _assertRegex = "assertRegexpMatches" - _assertNotRegex = "assertNotRegexpMatches" - else: - _assertRaisesRegex = "assertRaisesRegex" - _assertRegex = "assertRegex" - _assertNotRegex = "assertNotRegex" -else: - - def b(s): - return s - - # Workaround for standalone backslash - - def u(s): - return unicode(s.replace(r"\\", r"\\\\"), "unicode_escape") - - unichr = unichr - int2byte = chr - - def byte2int(bs): - return ord(bs[0]) - - def indexbytes(buf, i): - return ord(buf[i]) - - iterbytes = functools.partial(itertools.imap, ord) - import StringIO - - StringIO = BytesIO = StringIO.StringIO - _assertCountEqual = "assertItemsEqual" - _assertRaisesRegex = "assertRaisesRegexp" - _assertRegex = "assertRegexpMatches" - _assertNotRegex = "assertNotRegexpMatches" -_add_doc(b, """Byte literal""") -_add_doc(u, """Text literal""") - - -def assertCountEqual(self, *args, **kwargs): - return getattr(self, _assertCountEqual)(*args, **kwargs) - - -def assertRaisesRegex(self, *args, **kwargs): - return getattr(self, _assertRaisesRegex)(*args, **kwargs) - - -def assertRegex(self, *args, **kwargs): - return getattr(self, _assertRegex)(*args, **kwargs) - - -def assertNotRegex(self, *args, **kwargs): - return getattr(self, _assertNotRegex)(*args, **kwargs) - - -if PY3: - exec_ = getattr(moves.builtins, "exec") - - def reraise(tp, value, tb=None): - try: - if value is None: - value = tp() - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value - finally: - value = None - tb = None - -else: - - def exec_(_code_, _globs_=None, _locs_=None): - """Execute code in a namespace.""" - if _globs_ is None: - frame = sys._getframe(1) - _globs_ = frame.f_globals - if _locs_ is None: - _locs_ = frame.f_locals - del frame - elif _locs_ is None: - _locs_ = _globs_ - exec ("""exec _code_ in _globs_, _locs_""") - - exec_( - """def reraise(tp, value, tb=None): - try: - raise tp, value, tb - finally: - tb = None -""" - ) - - -if sys.version_info[:2] > (3,): - exec_( - """def raise_from(value, from_value): - try: - raise value from from_value - finally: - value = None -""" - ) -else: - - def raise_from(value, from_value): - raise value - - -print_ = getattr(moves.builtins, "print", None) -if print_ is None: - - def print_(*args, **kwargs): - """The new-style print function for Python 2.4 and 2.5.""" - fp = kwargs.pop("file", sys.stdout) - if fp is None: - return - - def write(data): - if not isinstance(data, basestring): - data = str(data) - # If the file has an encoding, encode unicode with it. - if ( - isinstance(fp, file) - and isinstance(data, unicode) - and fp.encoding is not None - ): - errors = getattr(fp, "errors", None) - if errors is None: - errors = "strict" - data = data.encode(fp.encoding, errors) - fp.write(data) - - want_unicode = False - sep = kwargs.pop("sep", None) - if sep is not None: - if isinstance(sep, unicode): - want_unicode = True - elif not isinstance(sep, str): - raise TypeError("sep must be None or a string") - end = kwargs.pop("end", None) - if end is not None: - if isinstance(end, unicode): - want_unicode = True - elif not isinstance(end, str): - raise TypeError("end must be None or a string") - if kwargs: - raise TypeError("invalid keyword arguments to print()") - if not want_unicode: - for arg in args: - if isinstance(arg, unicode): - want_unicode = True - break - if want_unicode: - newline = unicode("\n") - space = unicode(" ") - else: - newline = "\n" - space = " " - if sep is None: - sep = space - if end is None: - end = newline - for i, arg in enumerate(args): - if i: - write(sep) - write(arg) - write(end) - - -if sys.version_info[:2] < (3, 3): - _print = print_ - - def print_(*args, **kwargs): - fp = kwargs.get("file", sys.stdout) - flush = kwargs.pop("flush", False) - _print(*args, **kwargs) - if flush and fp is not None: - fp.flush() - - -_add_doc(reraise, """Reraise an exception.""") - -if sys.version_info[0:2] < (3, 4): - # This does exactly the same what the :func:`py3:functools.update_wrapper` - # function does on Python versions after 3.2. It sets the ``__wrapped__`` - # attribute on ``wrapper`` object and it doesn't raise an error if any of - # the attributes mentioned in ``assigned`` and ``updated`` are missing on - # ``wrapped`` object. - def _update_wrapper( - wrapper, - wrapped, - assigned=functools.WRAPPER_ASSIGNMENTS, - updated=functools.WRAPPER_UPDATES, - ): - for attr in assigned: - try: - value = getattr(wrapped, attr) - except AttributeError: - continue - else: - setattr(wrapper, attr, value) - for attr in updated: - getattr(wrapper, attr).update(getattr(wrapped, attr, {})) - wrapper.__wrapped__ = wrapped - return wrapper - - _update_wrapper.__doc__ = functools.update_wrapper.__doc__ - - def wraps( - wrapped, - assigned=functools.WRAPPER_ASSIGNMENTS, - updated=functools.WRAPPER_UPDATES, - ): - return functools.partial( - _update_wrapper, wrapped=wrapped, assigned=assigned, updated=updated - ) - - wraps.__doc__ = functools.wraps.__doc__ - -else: - wraps = functools.wraps - - -def with_metaclass(meta, *bases): - """Create a base class with a metaclass.""" - # This requires a bit of explanation: the basic idea is to make a dummy - # metaclass for one level of class instantiation that replaces itself with - # the actual metaclass. - class metaclass(type): - def __new__(cls, name, this_bases, d): - if sys.version_info[:2] >= (3, 7): - # This version introduced PEP 560 that requires a bit - # of extra care (we mimic what is done by __build_class__). - resolved_bases = types.resolve_bases(bases) - if resolved_bases is not bases: - d["__orig_bases__"] = bases - else: - resolved_bases = bases - return meta(name, resolved_bases, d) - - @classmethod - def __prepare__(cls, name, this_bases): - return meta.__prepare__(name, bases) - - return type.__new__(metaclass, "temporary_class", (), {}) - - -def add_metaclass(metaclass): - """Class decorator for creating a class with a metaclass.""" - - def wrapper(cls): - orig_vars = cls.__dict__.copy() - slots = orig_vars.get("__slots__") - if slots is not None: - if isinstance(slots, str): - slots = [slots] - for slots_var in slots: - orig_vars.pop(slots_var) - orig_vars.pop("__dict__", None) - orig_vars.pop("__weakref__", None) - if hasattr(cls, "__qualname__"): - orig_vars["__qualname__"] = cls.__qualname__ - return metaclass(cls.__name__, cls.__bases__, orig_vars) - - return wrapper - - -def ensure_binary(s, encoding="utf-8", errors="strict"): - """Coerce **s** to six.binary_type. - - For Python 2: - - `unicode` -> encoded to `str` - - `str` -> `str` - - For Python 3: - - `str` -> encoded to `bytes` - - `bytes` -> `bytes` - """ - if isinstance(s, binary_type): - return s - if isinstance(s, text_type): - return s.encode(encoding, errors) - raise TypeError("not expecting type '%s'" % type(s)) - - -def ensure_str(s, encoding="utf-8", errors="strict"): - """Coerce *s* to `str`. - - For Python 2: - - `unicode` -> encoded to `str` - - `str` -> `str` - - For Python 3: - - `str` -> `str` - - `bytes` -> decoded to `str` - """ - # Optimization: Fast return for the common case. - if type(s) is str: - return s - if PY2 and isinstance(s, text_type): - return s.encode(encoding, errors) - elif PY3 and isinstance(s, binary_type): - return s.decode(encoding, errors) - elif not isinstance(s, (text_type, binary_type)): - raise TypeError("not expecting type '%s'" % type(s)) - return s - - -def ensure_text(s, encoding="utf-8", errors="strict"): - """Coerce *s* to six.text_type. - - For Python 2: - - `unicode` -> `unicode` - - `str` -> `unicode` - - For Python 3: - - `str` -> `str` - - `bytes` -> decoded to `str` - """ - if isinstance(s, binary_type): - return s.decode(encoding, errors) - elif isinstance(s, text_type): - return s - else: - raise TypeError("not expecting type '%s'" % type(s)) - - -def python_2_unicode_compatible(klass): - """ - A class decorator that defines __unicode__ and __str__ methods under Python 2. - Under Python 3 it does nothing. - - To support Python 2 and 3 with a single code base, define a __str__ method - returning text and apply this decorator to the class. - """ - if PY2: - if "__str__" not in klass.__dict__: - raise ValueError( - "@python_2_unicode_compatible cannot be applied " - "to %s because it doesn't define __str__()." % klass.__name__ - ) - klass.__unicode__ = klass.__str__ - klass.__str__ = lambda self: self.__unicode__().encode("utf-8") - return klass - - -# Complete the moves implementation. -# This code is at the end of this module to speed up module loading. -# Turn this module into a package. -__path__ = [] # required for PEP 302 and PEP 451 -__package__ = __name__ # see PEP 366 @ReservedAssignment -if globals().get("__spec__") is not None: - __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable -# Remove other six meta path importers, since they cause problems. This can -# happen if six is removed from sys.modules and then reloaded. (Setuptools does -# this for some reason.) -if sys.meta_path: - for i, importer in enumerate(sys.meta_path): - # Here's some real nastiness: Another "instance" of the six module might - # be floating around. Therefore, we can't use isinstance() to check for - # the six meta path importer, since the other six instance will have - # inserted an importer with different class. - if ( - type(importer).__name__ == "_SixMetaPathImporter" - and importer.name == __name__ - ): - del sys.meta_path[i] - break - del i, importer -# Finally, add the importer to the meta path import hook. -sys.meta_path.append(_importer) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/poolmanager.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/poolmanager.py deleted file mode 100644 index 574b7de..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/poolmanager.py +++ /dev/null @@ -1,553 +0,0 @@ -from __future__ import absolute_import - -import collections -import functools -import logging - -from ._collections import RecentlyUsedContainer -from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool, port_by_scheme -from .exceptions import ( - LocationValueError, - MaxRetryError, - ProxySchemeUnknown, - ProxySchemeUnsupported, - URLSchemeUnknown, -) -from .packages import six -from .packages.six.moves.urllib.parse import urljoin -from .request import RequestMethods -from .util.proxy import connection_requires_http_tunnel -from .util.retry import Retry -from .util.url import parse_url - -__all__ = ["PoolManager", "ProxyManager", "proxy_from_url"] - - -log = logging.getLogger(__name__) - -SSL_KEYWORDS = ( - "key_file", - "cert_file", - "cert_reqs", - "ca_certs", - "ssl_version", - "ca_cert_dir", - "ssl_context", - "key_password", - "server_hostname", -) - -# All known keyword arguments that could be provided to the pool manager, its -# pools, or the underlying connections. This is used to construct a pool key. -_key_fields = ( - "key_scheme", # str - "key_host", # str - "key_port", # int - "key_timeout", # int or float or Timeout - "key_retries", # int or Retry - "key_strict", # bool - "key_block", # bool - "key_source_address", # str - "key_key_file", # str - "key_key_password", # str - "key_cert_file", # str - "key_cert_reqs", # str - "key_ca_certs", # str - "key_ssl_version", # str - "key_ca_cert_dir", # str - "key_ssl_context", # instance of ssl.SSLContext or urllib3.util.ssl_.SSLContext - "key_maxsize", # int - "key_headers", # dict - "key__proxy", # parsed proxy url - "key__proxy_headers", # dict - "key__proxy_config", # class - "key_socket_options", # list of (level (int), optname (int), value (int or str)) tuples - "key__socks_options", # dict - "key_assert_hostname", # bool or string - "key_assert_fingerprint", # str - "key_server_hostname", # str -) - -#: The namedtuple class used to construct keys for the connection pool. -#: All custom key schemes should include the fields in this key at a minimum. -PoolKey = collections.namedtuple("PoolKey", _key_fields) - -_proxy_config_fields = ("ssl_context", "use_forwarding_for_https") -ProxyConfig = collections.namedtuple("ProxyConfig", _proxy_config_fields) - - -def _default_key_normalizer(key_class, request_context): - """ - Create a pool key out of a request context dictionary. - - According to RFC 3986, both the scheme and host are case-insensitive. - Therefore, this function normalizes both before constructing the pool - key for an HTTPS request. If you wish to change this behaviour, provide - alternate callables to ``key_fn_by_scheme``. - - :param key_class: - The class to use when constructing the key. This should be a namedtuple - with the ``scheme`` and ``host`` keys at a minimum. - :type key_class: namedtuple - :param request_context: - A dictionary-like object that contain the context for a request. - :type request_context: dict - - :return: A namedtuple that can be used as a connection pool key. - :rtype: PoolKey - """ - # Since we mutate the dictionary, make a copy first - context = request_context.copy() - context["scheme"] = context["scheme"].lower() - context["host"] = context["host"].lower() - - # These are both dictionaries and need to be transformed into frozensets - for key in ("headers", "_proxy_headers", "_socks_options"): - if key in context and context[key] is not None: - context[key] = frozenset(context[key].items()) - - # The socket_options key may be a list and needs to be transformed into a - # tuple. - socket_opts = context.get("socket_options") - if socket_opts is not None: - context["socket_options"] = tuple(socket_opts) - - # Map the kwargs to the names in the namedtuple - this is necessary since - # namedtuples can't have fields starting with '_'. - for key in list(context.keys()): - context["key_" + key] = context.pop(key) - - # Default to ``None`` for keys missing from the context - for field in key_class._fields: - if field not in context: - context[field] = None - - return key_class(**context) - - -#: A dictionary that maps a scheme to a callable that creates a pool key. -#: This can be used to alter the way pool keys are constructed, if desired. -#: Each PoolManager makes a copy of this dictionary so they can be configured -#: globally here, or individually on the instance. -key_fn_by_scheme = { - "http": functools.partial(_default_key_normalizer, PoolKey), - "https": functools.partial(_default_key_normalizer, PoolKey), -} - -pool_classes_by_scheme = {"http": HTTPConnectionPool, "https": HTTPSConnectionPool} - - -class PoolManager(RequestMethods): - """ - Allows for arbitrary requests while transparently keeping track of - necessary connection pools for you. - - :param num_pools: - Number of connection pools to cache before discarding the least - recently used pool. - - :param headers: - Headers to include with all requests, unless other headers are given - explicitly. - - :param \\**connection_pool_kw: - Additional parameters are used to create fresh - :class:`urllib3.connectionpool.ConnectionPool` instances. - - Example:: - - >>> manager = PoolManager(num_pools=2) - >>> r = manager.request('GET', 'http://google.com/') - >>> r = manager.request('GET', 'http://google.com/mail') - >>> r = manager.request('GET', 'http://yahoo.com/') - >>> len(manager.pools) - 2 - - """ - - proxy = None - proxy_config = None - - def __init__(self, num_pools=10, headers=None, **connection_pool_kw): - RequestMethods.__init__(self, headers) - if "retries" in connection_pool_kw: - retries = connection_pool_kw["retries"] - if not isinstance(retries, Retry): - # When Retry is initialized, raise_on_redirect is based - # on a redirect boolean value. - # But requests made via a pool manager always set - # redirect to False, and raise_on_redirect always ends - # up being False consequently. - # Here we fix the issue by setting raise_on_redirect to - # a value needed by the pool manager without considering - # the redirect boolean. - raise_on_redirect = retries is not False - retries = Retry.from_int(retries, redirect=False) - retries.raise_on_redirect = raise_on_redirect - connection_pool_kw = connection_pool_kw.copy() - connection_pool_kw["retries"] = retries - self.connection_pool_kw = connection_pool_kw - self.pools = RecentlyUsedContainer(num_pools) - - # Locally set the pool classes and keys so other PoolManagers can - # override them. - self.pool_classes_by_scheme = pool_classes_by_scheme - self.key_fn_by_scheme = key_fn_by_scheme.copy() - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - self.clear() - # Return False to re-raise any potential exceptions - return False - - def _new_pool(self, scheme, host, port, request_context=None): - """ - Create a new :class:`urllib3.connectionpool.ConnectionPool` based on host, port, scheme, and - any additional pool keyword arguments. - - If ``request_context`` is provided, it is provided as keyword arguments - to the pool class used. This method is used to actually create the - connection pools handed out by :meth:`connection_from_url` and - companion methods. It is intended to be overridden for customization. - """ - pool_cls = self.pool_classes_by_scheme[scheme] - if request_context is None: - request_context = self.connection_pool_kw.copy() - - # Although the context has everything necessary to create the pool, - # this function has historically only used the scheme, host, and port - # in the positional args. When an API change is acceptable these can - # be removed. - for key in ("scheme", "host", "port"): - request_context.pop(key, None) - - if scheme == "http": - for kw in SSL_KEYWORDS: - request_context.pop(kw, None) - - return pool_cls(host, port, **request_context) - - def clear(self): - """ - Empty our store of pools and direct them all to close. - - This will not affect in-flight connections, but they will not be - re-used after completion. - """ - self.pools.clear() - - def connection_from_host(self, host, port=None, scheme="http", pool_kwargs=None): - """ - Get a :class:`urllib3.connectionpool.ConnectionPool` based on the host, port, and scheme. - - If ``port`` isn't given, it will be derived from the ``scheme`` using - ``urllib3.connectionpool.port_by_scheme``. If ``pool_kwargs`` is - provided, it is merged with the instance's ``connection_pool_kw`` - variable and used to create the new connection pool, if one is - needed. - """ - - if not host: - raise LocationValueError("No host specified.") - - request_context = self._merge_pool_kwargs(pool_kwargs) - request_context["scheme"] = scheme or "http" - if not port: - port = port_by_scheme.get(request_context["scheme"].lower(), 80) - request_context["port"] = port - request_context["host"] = host - - return self.connection_from_context(request_context) - - def connection_from_context(self, request_context): - """ - Get a :class:`urllib3.connectionpool.ConnectionPool` based on the request context. - - ``request_context`` must at least contain the ``scheme`` key and its - value must be a key in ``key_fn_by_scheme`` instance variable. - """ - scheme = request_context["scheme"].lower() - pool_key_constructor = self.key_fn_by_scheme.get(scheme) - if not pool_key_constructor: - raise URLSchemeUnknown(scheme) - pool_key = pool_key_constructor(request_context) - - return self.connection_from_pool_key(pool_key, request_context=request_context) - - def connection_from_pool_key(self, pool_key, request_context=None): - """ - Get a :class:`urllib3.connectionpool.ConnectionPool` based on the provided pool key. - - ``pool_key`` should be a namedtuple that only contains immutable - objects. At a minimum it must have the ``scheme``, ``host``, and - ``port`` fields. - """ - with self.pools.lock: - # If the scheme, host, or port doesn't match existing open - # connections, open a new ConnectionPool. - pool = self.pools.get(pool_key) - if pool: - return pool - - # Make a fresh ConnectionPool of the desired type - scheme = request_context["scheme"] - host = request_context["host"] - port = request_context["port"] - pool = self._new_pool(scheme, host, port, request_context=request_context) - self.pools[pool_key] = pool - - return pool - - def connection_from_url(self, url, pool_kwargs=None): - """ - Similar to :func:`urllib3.connectionpool.connection_from_url`. - - If ``pool_kwargs`` is not provided and a new pool needs to be - constructed, ``self.connection_pool_kw`` is used to initialize - the :class:`urllib3.connectionpool.ConnectionPool`. If ``pool_kwargs`` - is provided, it is used instead. Note that if a new pool does not - need to be created for the request, the provided ``pool_kwargs`` are - not used. - """ - u = parse_url(url) - return self.connection_from_host( - u.host, port=u.port, scheme=u.scheme, pool_kwargs=pool_kwargs - ) - - def _merge_pool_kwargs(self, override): - """ - Merge a dictionary of override values for self.connection_pool_kw. - - This does not modify self.connection_pool_kw and returns a new dict. - Any keys in the override dictionary with a value of ``None`` are - removed from the merged dictionary. - """ - base_pool_kwargs = self.connection_pool_kw.copy() - if override: - for key, value in override.items(): - if value is None: - try: - del base_pool_kwargs[key] - except KeyError: - pass - else: - base_pool_kwargs[key] = value - return base_pool_kwargs - - def _proxy_requires_url_absolute_form(self, parsed_url): - """ - Indicates if the proxy requires the complete destination URL in the - request. Normally this is only needed when not using an HTTP CONNECT - tunnel. - """ - if self.proxy is None: - return False - - return not connection_requires_http_tunnel( - self.proxy, self.proxy_config, parsed_url.scheme - ) - - def _validate_proxy_scheme_url_selection(self, url_scheme): - """ - Validates that were not attempting to do TLS in TLS connections on - Python2 or with unsupported SSL implementations. - """ - if self.proxy is None or url_scheme != "https": - return - - if self.proxy.scheme != "https": - return - - if six.PY2 and not self.proxy_config.use_forwarding_for_https: - raise ProxySchemeUnsupported( - "Contacting HTTPS destinations through HTTPS proxies " - "'via CONNECT tunnels' is not supported in Python 2" - ) - - def urlopen(self, method, url, redirect=True, **kw): - """ - Same as :meth:`urllib3.HTTPConnectionPool.urlopen` - with custom cross-host redirect logic and only sends the request-uri - portion of the ``url``. - - The given ``url`` parameter must be absolute, such that an appropriate - :class:`urllib3.connectionpool.ConnectionPool` can be chosen for it. - """ - u = parse_url(url) - self._validate_proxy_scheme_url_selection(u.scheme) - - conn = self.connection_from_host(u.host, port=u.port, scheme=u.scheme) - - kw["assert_same_host"] = False - kw["redirect"] = False - - if "headers" not in kw: - kw["headers"] = self.headers.copy() - - if self._proxy_requires_url_absolute_form(u): - response = conn.urlopen(method, url, **kw) - else: - response = conn.urlopen(method, u.request_uri, **kw) - - redirect_location = redirect and response.get_redirect_location() - if not redirect_location: - return response - - # Support relative URLs for redirecting. - redirect_location = urljoin(url, redirect_location) - - # RFC 7231, Section 6.4.4 - if response.status == 303: - method = "GET" - - retries = kw.get("retries", response.retries) - if not isinstance(retries, Retry): - retries = Retry.from_int(retries, redirect=redirect) - - # Strip headers marked as unsafe to forward to the redirected location. - # Check remove_headers_on_redirect to avoid a potential network call within - # conn.is_same_host() which may use socket.gethostbyname() in the future. - if retries.remove_headers_on_redirect and not conn.is_same_host( - redirect_location - ): - headers = list(six.iterkeys(kw["headers"])) - for header in headers: - if header.lower() in retries.remove_headers_on_redirect: - kw["headers"].pop(header, None) - - try: - retries = retries.increment(method, url, response=response, _pool=conn) - except MaxRetryError: - if retries.raise_on_redirect: - response.drain_conn() - raise - return response - - kw["retries"] = retries - kw["redirect"] = redirect - - log.info("Redirecting %s -> %s", url, redirect_location) - - response.drain_conn() - return self.urlopen(method, redirect_location, **kw) - - -class ProxyManager(PoolManager): - """ - Behaves just like :class:`PoolManager`, but sends all requests through - the defined proxy, using the CONNECT method for HTTPS URLs. - - :param proxy_url: - The URL of the proxy to be used. - - :param proxy_headers: - A dictionary containing headers that will be sent to the proxy. In case - of HTTP they are being sent with each request, while in the - HTTPS/CONNECT case they are sent only once. Could be used for proxy - authentication. - - :param proxy_ssl_context: - The proxy SSL context is used to establish the TLS connection to the - proxy when using HTTPS proxies. - - :param use_forwarding_for_https: - (Defaults to False) If set to True will forward requests to the HTTPS - proxy to be made on behalf of the client instead of creating a TLS - tunnel via the CONNECT method. **Enabling this flag means that request - and response headers and content will be visible from the HTTPS proxy** - whereas tunneling keeps request and response headers and content - private. IP address, target hostname, SNI, and port are always visible - to an HTTPS proxy even when this flag is disabled. - - Example: - >>> proxy = urllib3.ProxyManager('http://localhost:3128/') - >>> r1 = proxy.request('GET', 'http://google.com/') - >>> r2 = proxy.request('GET', 'http://httpbin.org/') - >>> len(proxy.pools) - 1 - >>> r3 = proxy.request('GET', 'https://httpbin.org/') - >>> r4 = proxy.request('GET', 'https://twitter.com/') - >>> len(proxy.pools) - 3 - - """ - - def __init__( - self, - proxy_url, - num_pools=10, - headers=None, - proxy_headers=None, - proxy_ssl_context=None, - use_forwarding_for_https=False, - **connection_pool_kw - ): - - if isinstance(proxy_url, HTTPConnectionPool): - proxy_url = "%s://%s:%i" % ( - proxy_url.scheme, - proxy_url.host, - proxy_url.port, - ) - proxy = parse_url(proxy_url) - - if proxy.scheme not in ("http", "https"): - raise ProxySchemeUnknown(proxy.scheme) - - if not proxy.port: - port = port_by_scheme.get(proxy.scheme, 80) - proxy = proxy._replace(port=port) - - self.proxy = proxy - self.proxy_headers = proxy_headers or {} - self.proxy_ssl_context = proxy_ssl_context - self.proxy_config = ProxyConfig(proxy_ssl_context, use_forwarding_for_https) - - connection_pool_kw["_proxy"] = self.proxy - connection_pool_kw["_proxy_headers"] = self.proxy_headers - connection_pool_kw["_proxy_config"] = self.proxy_config - - super(ProxyManager, self).__init__(num_pools, headers, **connection_pool_kw) - - def connection_from_host(self, host, port=None, scheme="http", pool_kwargs=None): - if scheme == "https": - return super(ProxyManager, self).connection_from_host( - host, port, scheme, pool_kwargs=pool_kwargs - ) - - return super(ProxyManager, self).connection_from_host( - self.proxy.host, self.proxy.port, self.proxy.scheme, pool_kwargs=pool_kwargs - ) - - def _set_proxy_headers(self, url, headers=None): - """ - Sets headers needed by proxies: specifically, the Accept and Host - headers. Only sets headers not provided by the user. - """ - headers_ = {"Accept": "*/*"} - - netloc = parse_url(url).netloc - if netloc: - headers_["Host"] = netloc - - if headers: - headers_.update(headers) - return headers_ - - def urlopen(self, method, url, redirect=True, **kw): - "Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute." - u = parse_url(url) - if not connection_requires_http_tunnel(self.proxy, self.proxy_config, u.scheme): - # For connections using HTTP CONNECT, httplib sets the necessary - # headers on the CONNECT to the proxy. If we're not using CONNECT, - # we'll definitely need to set 'Host' at the very least. - headers = kw.get("headers", self.headers) - kw["headers"] = self._set_proxy_headers(url, headers) - - return super(ProxyManager, self).urlopen(method, url, redirect=redirect, **kw) - - -def proxy_from_url(url, **kw): - return ProxyManager(proxy_url=url, **kw) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/request.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/request.py deleted file mode 100644 index 3b4cf99..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/request.py +++ /dev/null @@ -1,191 +0,0 @@ -from __future__ import absolute_import - -import sys - -from .filepost import encode_multipart_formdata -from .packages import six -from .packages.six.moves.urllib.parse import urlencode - -__all__ = ["RequestMethods"] - - -class RequestMethods(object): - """ - Convenience mixin for classes who implement a :meth:`urlopen` method, such - as :class:`urllib3.HTTPConnectionPool` and - :class:`urllib3.PoolManager`. - - Provides behavior for making common types of HTTP request methods and - decides which type of request field encoding to use. - - Specifically, - - :meth:`.request_encode_url` is for sending requests whose fields are - encoded in the URL (such as GET, HEAD, DELETE). - - :meth:`.request_encode_body` is for sending requests whose fields are - encoded in the *body* of the request using multipart or www-form-urlencoded - (such as for POST, PUT, PATCH). - - :meth:`.request` is for making any kind of request, it will look up the - appropriate encoding format and use one of the above two methods to make - the request. - - Initializer parameters: - - :param headers: - Headers to include with all requests, unless other headers are given - explicitly. - """ - - _encode_url_methods = {"DELETE", "GET", "HEAD", "OPTIONS"} - - def __init__(self, headers=None): - self.headers = headers or {} - - def urlopen( - self, - method, - url, - body=None, - headers=None, - encode_multipart=True, - multipart_boundary=None, - **kw - ): # Abstract - raise NotImplementedError( - "Classes extending RequestMethods must implement " - "their own ``urlopen`` method." - ) - - def request(self, method, url, fields=None, headers=None, **urlopen_kw): - """ - Make a request using :meth:`urlopen` with the appropriate encoding of - ``fields`` based on the ``method`` used. - - This is a convenience method that requires the least amount of manual - effort. It can be used in most situations, while still having the - option to drop down to more specific methods when necessary, such as - :meth:`request_encode_url`, :meth:`request_encode_body`, - or even the lowest level :meth:`urlopen`. - """ - method = method.upper() - - urlopen_kw["request_url"] = url - - if method in self._encode_url_methods: - return self.request_encode_url( - method, url, fields=fields, headers=headers, **urlopen_kw - ) - else: - return self.request_encode_body( - method, url, fields=fields, headers=headers, **urlopen_kw - ) - - def request_encode_url(self, method, url, fields=None, headers=None, **urlopen_kw): - """ - Make a request using :meth:`urlopen` with the ``fields`` encoded in - the url. This is useful for request methods like GET, HEAD, DELETE, etc. - """ - if headers is None: - headers = self.headers - - extra_kw = {"headers": headers} - extra_kw.update(urlopen_kw) - - if fields: - url += "?" + urlencode(fields) - - return self.urlopen(method, url, **extra_kw) - - def request_encode_body( - self, - method, - url, - fields=None, - headers=None, - encode_multipart=True, - multipart_boundary=None, - **urlopen_kw - ): - """ - Make a request using :meth:`urlopen` with the ``fields`` encoded in - the body. This is useful for request methods like POST, PUT, PATCH, etc. - - When ``encode_multipart=True`` (default), then - :func:`urllib3.encode_multipart_formdata` is used to encode - the payload with the appropriate content type. Otherwise - :func:`urllib.parse.urlencode` is used with the - 'application/x-www-form-urlencoded' content type. - - Multipart encoding must be used when posting files, and it's reasonably - safe to use it in other times too. However, it may break request - signing, such as with OAuth. - - Supports an optional ``fields`` parameter of key/value strings AND - key/filetuple. A filetuple is a (filename, data, MIME type) tuple where - the MIME type is optional. For example:: - - fields = { - 'foo': 'bar', - 'fakefile': ('foofile.txt', 'contents of foofile'), - 'realfile': ('barfile.txt', open('realfile').read()), - 'typedfile': ('bazfile.bin', open('bazfile').read(), - 'image/jpeg'), - 'nonamefile': 'contents of nonamefile field', - } - - When uploading a file, providing a filename (the first parameter of the - tuple) is optional but recommended to best mimic behavior of browsers. - - Note that if ``headers`` are supplied, the 'Content-Type' header will - be overwritten because it depends on the dynamic random boundary string - which is used to compose the body of the request. The random boundary - string can be explicitly set with the ``multipart_boundary`` parameter. - """ - if headers is None: - headers = self.headers - - extra_kw = {"headers": {}} - - if fields: - if "body" in urlopen_kw: - raise TypeError( - "request got values for both 'fields' and 'body', can only specify one." - ) - - if encode_multipart: - body, content_type = encode_multipart_formdata( - fields, boundary=multipart_boundary - ) - else: - body, content_type = ( - urlencode(fields), - "application/x-www-form-urlencoded", - ) - - extra_kw["body"] = body - extra_kw["headers"] = {"Content-Type": content_type} - - extra_kw["headers"].update(headers) - extra_kw.update(urlopen_kw) - - return self.urlopen(method, url, **extra_kw) - - -if not six.PY2: - - class RequestModule(sys.modules[__name__].__class__): - def __call__(self, *args, **kwargs): - """ - If user tries to call this module directly urllib3 v2.x style raise an error to the user - suggesting they may need urllib3 v2 - """ - raise TypeError( - "'module' object is not callable\n" - "urllib3.request() method is not supported in this release, " - "upgrade to urllib3 v2 to use it\n" - "see https://urllib3.readthedocs.io/en/stable/v2-migration-guide.html" - ) - - sys.modules[__name__].__class__ = RequestModule diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/response.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/response.py deleted file mode 100644 index 8909f84..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/response.py +++ /dev/null @@ -1,879 +0,0 @@ -from __future__ import absolute_import - -import io -import logging -import sys -import warnings -import zlib -from contextlib import contextmanager -from socket import error as SocketError -from socket import timeout as SocketTimeout - -brotli = None - -from . import util -from ._collections import HTTPHeaderDict -from .connection import BaseSSLError, HTTPException -from .exceptions import ( - BodyNotHttplibCompatible, - DecodeError, - HTTPError, - IncompleteRead, - InvalidChunkLength, - InvalidHeader, - ProtocolError, - ReadTimeoutError, - ResponseNotChunked, - SSLError, -) -from .packages import six -from .util.response import is_fp_closed, is_response_to_head - -log = logging.getLogger(__name__) - - -class DeflateDecoder(object): - def __init__(self): - self._first_try = True - self._data = b"" - self._obj = zlib.decompressobj() - - def __getattr__(self, name): - return getattr(self._obj, name) - - def decompress(self, data): - if not data: - return data - - if not self._first_try: - return self._obj.decompress(data) - - self._data += data - try: - decompressed = self._obj.decompress(data) - if decompressed: - self._first_try = False - self._data = None - return decompressed - except zlib.error: - self._first_try = False - self._obj = zlib.decompressobj(-zlib.MAX_WBITS) - try: - return self.decompress(self._data) - finally: - self._data = None - - -class GzipDecoderState(object): - - FIRST_MEMBER = 0 - OTHER_MEMBERS = 1 - SWALLOW_DATA = 2 - - -class GzipDecoder(object): - def __init__(self): - self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) - self._state = GzipDecoderState.FIRST_MEMBER - - def __getattr__(self, name): - return getattr(self._obj, name) - - def decompress(self, data): - ret = bytearray() - if self._state == GzipDecoderState.SWALLOW_DATA or not data: - return bytes(ret) - while True: - try: - ret += self._obj.decompress(data) - except zlib.error: - previous_state = self._state - # Ignore data after the first error - self._state = GzipDecoderState.SWALLOW_DATA - if previous_state == GzipDecoderState.OTHER_MEMBERS: - # Allow trailing garbage acceptable in other gzip clients - return bytes(ret) - raise - data = self._obj.unused_data - if not data: - return bytes(ret) - self._state = GzipDecoderState.OTHER_MEMBERS - self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) - - -if brotli is not None: - - class BrotliDecoder(object): - # 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): - self._obj = brotli.Decompressor() - if hasattr(self._obj, "decompress"): - self.decompress = self._obj.decompress - else: - self.decompress = self._obj.process - - def flush(self): - if hasattr(self._obj, "flush"): - return self._obj.flush() - return b"" - - -class MultiDecoder(object): - """ - From RFC7231: - If one or more encodings have been applied to a representation, the - sender that applied the encodings MUST generate a Content-Encoding - header field that lists the content codings in the order in which - they were applied. - """ - - def __init__(self, modes): - self._decoders = [_get_decoder(m.strip()) for m in modes.split(",")] - - def flush(self): - return self._decoders[0].flush() - - def decompress(self, data): - for d in reversed(self._decoders): - data = d.decompress(data) - return data - - -def _get_decoder(mode): - if "," in mode: - return MultiDecoder(mode) - - if mode == "gzip": - return GzipDecoder() - - if brotli is not None and mode == "br": - return BrotliDecoder() - - return DeflateDecoder() - - -class HTTPResponse(io.IOBase): - """ - HTTP Response container. - - Backwards-compatible with :class:`http.client.HTTPResponse` but the response ``body`` is - loaded and decoded on-demand when the ``data`` property is accessed. This - class is also compatible with the Python standard library's :mod:`io` - module, and can hence be treated as a readable object in the context of that - framework. - - Extra parameters for behaviour not present in :class:`http.client.HTTPResponse`: - - :param preload_content: - If True, the response's body will be preloaded during construction. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - - :param original_response: - When this HTTPResponse wrapper is generated from an :class:`http.client.HTTPResponse` - object, it's convenient to include the original for debug purposes. It's - otherwise unused. - - :param retries: - The retries contains the last :class:`~urllib3.util.retry.Retry` that - was used during the request. - - :param enforce_content_length: - Enforce content length checking. Body returned by server must match - value of Content-Length header, if present. Otherwise, raise error. - """ - - CONTENT_DECODERS = ["gzip", "deflate"] - if brotli is not None: - CONTENT_DECODERS += ["br"] - REDIRECT_STATUSES = [301, 302, 303, 307, 308] - - def __init__( - self, - body="", - headers=None, - status=0, - version=0, - reason=None, - strict=0, - preload_content=True, - decode_content=True, - original_response=None, - pool=None, - connection=None, - msg=None, - retries=None, - enforce_content_length=False, - request_method=None, - request_url=None, - auto_close=True, - ): - - if isinstance(headers, HTTPHeaderDict): - self.headers = headers - else: - self.headers = HTTPHeaderDict(headers) - self.status = status - self.version = version - self.reason = reason - self.strict = strict - self.decode_content = decode_content - self.retries = retries - self.enforce_content_length = enforce_content_length - self.auto_close = auto_close - - self._decoder = None - self._body = None - self._fp = None - self._original_response = original_response - self._fp_bytes_read = 0 - self.msg = msg - self._request_url = request_url - - if body and isinstance(body, (six.string_types, bytes)): - self._body = body - - self._pool = pool - self._connection = connection - - if hasattr(body, "read"): - self._fp = body - - # Are we using the chunked-style of transfer encoding? - self.chunked = False - self.chunk_left = None - tr_enc = self.headers.get("transfer-encoding", "").lower() - # Don't incur the penalty of creating a list and then discarding it - encodings = (enc.strip() for enc in tr_enc.split(",")) - if "chunked" in encodings: - self.chunked = True - - # Determine length of response - self.length_remaining = self._init_length(request_method) - - # If requested, preload the body. - if preload_content and not self._body: - self._body = self.read(decode_content=decode_content) - - def get_redirect_location(self): - """ - Should we redirect and where to? - - :returns: Truthy redirect location string if we got a redirect status - code and valid location. ``None`` if redirect status and no - location. ``False`` if not a redirect status code. - """ - if self.status in self.REDIRECT_STATUSES: - return self.headers.get("location") - - return False - - def release_conn(self): - if not self._pool or not self._connection: - return - - self._pool._put_conn(self._connection) - self._connection = None - - def drain_conn(self): - """ - Read and discard any remaining HTTP response data in the response connection. - - Unread data in the HTTPResponse connection blocks the connection from being released back to the pool. - """ - try: - self.read() - except (HTTPError, SocketError, BaseSSLError, HTTPException): - pass - - @property - def data(self): - # For backwards-compat with earlier urllib3 0.4 and earlier. - if self._body: - return self._body - - if self._fp: - return self.read(cache_content=True) - - @property - def connection(self): - return self._connection - - def isclosed(self): - return is_fp_closed(self._fp) - - def tell(self): - """ - Obtain the number of bytes pulled over the wire so far. May differ from - the amount of content returned by :meth:``urllib3.response.HTTPResponse.read`` - if bytes are encoded on the wire (e.g, compressed). - """ - return self._fp_bytes_read - - def _init_length(self, request_method): - """ - Set initial length value for Response content if available. - """ - length = self.headers.get("content-length") - - if length is not None: - if self.chunked: - # This Response will fail with an IncompleteRead if it can't be - # received as chunked. This method falls back to attempt reading - # the response before raising an exception. - log.warning( - "Received response with both Content-Length and " - "Transfer-Encoding set. This is expressly forbidden " - "by RFC 7230 sec 3.3.2. Ignoring Content-Length and " - "attempting to process response as Transfer-Encoding: " - "chunked." - ) - return None - - try: - # RFC 7230 section 3.3.2 specifies multiple content lengths can - # be sent in a single Content-Length header - # (e.g. Content-Length: 42, 42). This line ensures the values - # are all valid ints and that as long as the `set` length is 1, - # all values are the same. Otherwise, the header is invalid. - lengths = set([int(val) for val in length.split(",")]) - if len(lengths) > 1: - raise InvalidHeader( - "Content-Length contained multiple " - "unmatching values (%s)" % length - ) - length = lengths.pop() - except ValueError: - length = None - else: - if length < 0: - length = None - - # Convert status to int for comparison - # In some cases, httplib returns a status of "_UNKNOWN" - try: - status = int(self.status) - except ValueError: - status = 0 - - # Check for responses that shouldn't include a body - if status in (204, 304) or 100 <= status < 200 or request_method == "HEAD": - length = 0 - - return length - - def _init_decoder(self): - """ - Set-up the _decoder attribute if necessary. - """ - # Note: content-encoding value should be case-insensitive, per RFC 7230 - # Section 3.2 - content_encoding = self.headers.get("content-encoding", "").lower() - if self._decoder is None: - if content_encoding in self.CONTENT_DECODERS: - self._decoder = _get_decoder(content_encoding) - elif "," in content_encoding: - encodings = [ - e.strip() - for e in content_encoding.split(",") - if e.strip() in self.CONTENT_DECODERS - ] - if len(encodings): - self._decoder = _get_decoder(content_encoding) - - DECODER_ERROR_CLASSES = (IOError, zlib.error) - if brotli is not None: - DECODER_ERROR_CLASSES += (brotli.error,) - - def _decode(self, data, decode_content, flush_decoder): - """ - Decode the data passed in and potentially flush the decoder. - """ - if not decode_content: - return data - - try: - if self._decoder: - data = self._decoder.decompress(data) - except self.DECODER_ERROR_CLASSES as e: - content_encoding = self.headers.get("content-encoding", "").lower() - raise DecodeError( - "Received response with content-encoding: %s, but " - "failed to decode it." % content_encoding, - e, - ) - if flush_decoder: - data += self._flush_decoder() - - return data - - def _flush_decoder(self): - """ - Flushes the decoder. Should only be called if the decoder is actually - being used. - """ - if self._decoder: - buf = self._decoder.decompress(b"") - return buf + self._decoder.flush() - - return b"" - - @contextmanager - def _error_catcher(self): - """ - Catch low-level python exceptions, instead re-raising urllib3 - variants, so that low-level exceptions are not leaked in the - high-level api. - - On exit, release the connection back to the pool. - """ - clean_exit = False - - try: - try: - yield - - except SocketTimeout: - # FIXME: Ideally we'd like to include the url in the ReadTimeoutError but - # there is yet no clean way to get at it from this context. - raise ReadTimeoutError(self._pool, None, "Read timed out.") - - except BaseSSLError as e: - # FIXME: Is there a better way to differentiate between SSLErrors? - if "read operation timed out" not in str(e): - # SSL errors related to framing/MAC get wrapped and reraised here - raise SSLError(e) - - raise ReadTimeoutError(self._pool, None, "Read timed out.") - - except (HTTPException, SocketError) as e: - # This includes IncompleteRead. - raise ProtocolError("Connection broken: %r" % e, e) - - # If no exception is thrown, we should avoid cleaning up - # unnecessarily. - clean_exit = True - finally: - # If we didn't terminate cleanly, we need to throw away our - # connection. - if not clean_exit: - # The response may not be closed but we're not going to use it - # anymore so close it now to ensure that the connection is - # released back to the pool. - if self._original_response: - self._original_response.close() - - # Closing the response may not actually be sufficient to close - # everything, so if we have a hold of the connection close that - # too. - if self._connection: - self._connection.close() - - # If we hold the original response but it's closed now, we should - # return the connection back to the pool. - if self._original_response and self._original_response.isclosed(): - self.release_conn() - - def _fp_read(self, amt): - """ - Read a response with the thought that reading the number of bytes - larger than can fit in a 32-bit int at a time via SSL in some - known cases leads to an overflow error that has to be prevented - if `amt` or `self.length_remaining` indicate that a problem may - happen. - - The known cases: - * 3.8 <= CPython < 3.9.7 because of a bug - https://github.com/urllib3/urllib3/issues/2513#issuecomment-1152559900. - * urllib3 injected with pyOpenSSL-backed SSL-support. - * CPython < 3.10 only when `amt` does not fit 32-bit int. - """ - assert self._fp - c_int_max = 2 ** 31 - 1 - if ( - ( - (amt and amt > c_int_max) - or (self.length_remaining and self.length_remaining > c_int_max) - ) - and not util.IS_SECURETRANSPORT - and (util.IS_PYOPENSSL or sys.version_info < (3, 10)) - ): - buffer = io.BytesIO() - # Besides `max_chunk_amt` being a maximum chunk size, it - # affects memory overhead of reading a response by this - # method in CPython. - # `c_int_max` equal to 2 GiB - 1 byte is the actual maximum - # chunk size that does not lead to an overflow error, but - # 256 MiB is a compromise. - max_chunk_amt = 2 ** 28 - while amt is None or amt != 0: - if amt is not None: - chunk_amt = min(amt, max_chunk_amt) - amt -= chunk_amt - else: - chunk_amt = max_chunk_amt - data = self._fp.read(chunk_amt) - if not data: - break - buffer.write(data) - del data # to reduce peak memory usage by `max_chunk_amt`. - return buffer.getvalue() - else: - # StringIO doesn't like amt=None - return self._fp.read(amt) if amt is not None else self._fp.read() - - def read(self, amt=None, decode_content=None, cache_content=False): - """ - Similar to :meth:`http.client.HTTPResponse.read`, but with two additional - parameters: ``decode_content`` and ``cache_content``. - - :param amt: - How much of the content to read. If specified, caching is skipped - because it doesn't make sense to cache partial content as the full - response. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - - :param cache_content: - If True, will save the returned data such that the same result is - returned despite of the state of the underlying file object. This - is useful if you want the ``.data`` property to continue working - after having ``.read()`` the file object. (Overridden if ``amt`` is - set.) - """ - self._init_decoder() - if decode_content is None: - decode_content = self.decode_content - - if self._fp is None: - return - - flush_decoder = False - fp_closed = getattr(self._fp, "closed", False) - - with self._error_catcher(): - data = self._fp_read(amt) if not fp_closed else b"" - if amt is None: - flush_decoder = True - else: - cache_content = False - if ( - amt != 0 and not data - ): # Platform-specific: Buggy versions of Python. - # Close the connection when no data is returned - # - # This is redundant to what httplib/http.client _should_ - # already do. However, versions of python released before - # December 15, 2012 (http://bugs.python.org/issue16298) do - # not properly close the connection in all cases. There is - # no harm in redundantly calling close. - self._fp.close() - flush_decoder = True - if self.enforce_content_length and self.length_remaining not in ( - 0, - None, - ): - # This is an edge case that httplib failed to cover due - # to concerns of backward compatibility. We're - # addressing it here to make sure IncompleteRead is - # raised during streaming, so all calls with incorrect - # Content-Length are caught. - raise IncompleteRead(self._fp_bytes_read, self.length_remaining) - - if data: - self._fp_bytes_read += len(data) - if self.length_remaining is not None: - self.length_remaining -= len(data) - - data = self._decode(data, decode_content, flush_decoder) - - if cache_content: - self._body = data - - return data - - def stream(self, amt=2 ** 16, decode_content=None): - """ - A generator wrapper for the read() method. A call will block until - ``amt`` bytes have been read from the connection or until the - connection is closed. - - :param amt: - How much of the content to read. The generator will return up to - much data per iteration, but may return less. This is particularly - likely when using compressed data. However, the empty string will - never be returned. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - """ - if self.chunked and self.supports_chunked_reads(): - for line in self.read_chunked(amt, decode_content=decode_content): - yield line - else: - while not is_fp_closed(self._fp): - data = self.read(amt=amt, decode_content=decode_content) - - if data: - yield data - - @classmethod - def from_httplib(ResponseCls, r, **response_kw): - """ - Given an :class:`http.client.HTTPResponse` instance ``r``, return a - corresponding :class:`urllib3.response.HTTPResponse` object. - - Remaining parameters are passed to the HTTPResponse constructor, along - with ``original_response=r``. - """ - headers = r.msg - - if not isinstance(headers, HTTPHeaderDict): - if six.PY2: - # Python 2.7 - headers = HTTPHeaderDict.from_httplib(headers) - else: - headers = HTTPHeaderDict(headers.items()) - - # HTTPResponse objects in Python 3 don't have a .strict attribute - strict = getattr(r, "strict", 0) - resp = ResponseCls( - body=r, - headers=headers, - status=r.status, - version=r.version, - reason=r.reason, - strict=strict, - original_response=r, - **response_kw - ) - return resp - - # Backwards-compatibility methods for http.client.HTTPResponse - def getheaders(self): - warnings.warn( - "HTTPResponse.getheaders() is deprecated and will be removed " - "in urllib3 v2.1.0. Instead access HTTPResponse.headers directly.", - category=DeprecationWarning, - stacklevel=2, - ) - return self.headers - - def getheader(self, name, default=None): - warnings.warn( - "HTTPResponse.getheader() is deprecated and will be removed " - "in urllib3 v2.1.0. Instead use HTTPResponse.headers.get(name, default).", - category=DeprecationWarning, - stacklevel=2, - ) - return self.headers.get(name, default) - - # Backwards compatibility for http.cookiejar - def info(self): - return self.headers - - # Overrides from io.IOBase - def close(self): - if not self.closed: - self._fp.close() - - if self._connection: - self._connection.close() - - if not self.auto_close: - io.IOBase.close(self) - - @property - def closed(self): - if not self.auto_close: - return io.IOBase.closed.__get__(self) - elif self._fp is None: - return True - elif hasattr(self._fp, "isclosed"): - return self._fp.isclosed() - elif hasattr(self._fp, "closed"): - return self._fp.closed - else: - return True - - def fileno(self): - if self._fp is None: - raise IOError("HTTPResponse has no file to get a fileno from") - elif hasattr(self._fp, "fileno"): - return self._fp.fileno() - else: - raise IOError( - "The file-like object this HTTPResponse is wrapped " - "around has no file descriptor" - ) - - def flush(self): - if ( - self._fp is not None - and hasattr(self._fp, "flush") - and not getattr(self._fp, "closed", False) - ): - return self._fp.flush() - - def readable(self): - # This method is required for `io` module compatibility. - return True - - def readinto(self, b): - # This method is required for `io` module compatibility. - temp = self.read(len(b)) - if len(temp) == 0: - return 0 - else: - b[: len(temp)] = temp - return len(temp) - - def supports_chunked_reads(self): - """ - Checks if the underlying file-like object looks like a - :class:`http.client.HTTPResponse` object. We do this by testing for - the fp attribute. If it is present we assume it returns raw chunks as - processed by read_chunked(). - """ - return hasattr(self._fp, "fp") - - def _update_chunk_length(self): - # First, we'll figure out length of a chunk and then - # we'll try to read it from socket. - if self.chunk_left is not None: - return - line = self._fp.fp.readline() - line = line.split(b";", 1)[0] - try: - self.chunk_left = int(line, 16) - except ValueError: - # Invalid chunked protocol response, abort. - self.close() - raise InvalidChunkLength(self, line) - - def _handle_chunk(self, amt): - returned_chunk = None - if amt is None: - chunk = self._fp._safe_read(self.chunk_left) - returned_chunk = chunk - self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. - self.chunk_left = None - elif amt < self.chunk_left: - value = self._fp._safe_read(amt) - self.chunk_left = self.chunk_left - amt - returned_chunk = value - elif amt == self.chunk_left: - value = self._fp._safe_read(amt) - self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. - self.chunk_left = None - returned_chunk = value - else: # amt > self.chunk_left - returned_chunk = self._fp._safe_read(self.chunk_left) - self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. - self.chunk_left = None - return returned_chunk - - def read_chunked(self, amt=None, decode_content=None): - """ - Similar to :meth:`HTTPResponse.read`, but with an additional - parameter: ``decode_content``. - - :param amt: - How much of the content to read. If specified, caching is skipped - because it doesn't make sense to cache partial content as the full - response. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - """ - self._init_decoder() - # FIXME: Rewrite this method and make it a class with a better structured logic. - if not self.chunked: - raise ResponseNotChunked( - "Response is not chunked. " - "Header 'transfer-encoding: chunked' is missing." - ) - if not self.supports_chunked_reads(): - raise BodyNotHttplibCompatible( - "Body should be http.client.HTTPResponse like. " - "It should have have an fp attribute which returns raw chunks." - ) - - with self._error_catcher(): - # Don't bother reading the body of a HEAD request. - if self._original_response and is_response_to_head(self._original_response): - self._original_response.close() - return - - # If a response is already read and closed - # then return immediately. - if self._fp.fp is None: - return - - while True: - self._update_chunk_length() - if self.chunk_left == 0: - break - chunk = self._handle_chunk(amt) - decoded = self._decode( - chunk, decode_content=decode_content, flush_decoder=False - ) - if decoded: - yield decoded - - if decode_content: - # On CPython and PyPy, we should never need to flush the - # decoder. However, on Jython we *might* need to, so - # lets defensively do it anyway. - decoded = self._flush_decoder() - if decoded: # Platform-specific: Jython. - yield decoded - - # Chunk content ends with \r\n: discard it. - while True: - line = self._fp.fp.readline() - if not line: - # Some sites may not end with '\r\n'. - break - if line == b"\r\n": - break - - # We read everything; close the "file". - if self._original_response: - self._original_response.close() - - def geturl(self): - """ - Returns the URL that was the source of this response. - If the request that generated this response redirected, this method - will return the final redirect location. - """ - if self.retries is not None and len(self.retries.history): - return self.retries.history[-1].redirect_location - else: - return self._request_url - - def __iter__(self): - buffer = [] - for chunk in self.stream(decode_content=True): - if b"\n" in chunk: - chunk = chunk.split(b"\n") - yield b"".join(buffer) + chunk[0] + b"\n" - for x in chunk[1:-1]: - yield x + b"\n" - if chunk[-1]: - buffer = [chunk[-1]] - else: - buffer = [] - else: - buffer.append(chunk) - if buffer: - yield b"".join(buffer) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__init__.py deleted file mode 100644 index 4547fc5..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__init__.py +++ /dev/null @@ -1,49 +0,0 @@ -from __future__ import absolute_import - -# For backwards compatibility, provide imports that used to be here. -from .connection import is_connection_dropped -from .request import SKIP_HEADER, SKIPPABLE_HEADERS, make_headers -from .response import is_fp_closed -from .retry import Retry -from .ssl_ import ( - ALPN_PROTOCOLS, - HAS_SNI, - IS_PYOPENSSL, - IS_SECURETRANSPORT, - PROTOCOL_TLS, - SSLContext, - assert_fingerprint, - resolve_cert_reqs, - resolve_ssl_version, - ssl_wrap_socket, -) -from .timeout import Timeout, current_time -from .url import Url, get_host, parse_url, split_first -from .wait import wait_for_read, wait_for_write - -__all__ = ( - "HAS_SNI", - "IS_PYOPENSSL", - "IS_SECURETRANSPORT", - "SSLContext", - "PROTOCOL_TLS", - "ALPN_PROTOCOLS", - "Retry", - "Timeout", - "Url", - "assert_fingerprint", - "current_time", - "is_connection_dropped", - "is_fp_closed", - "get_host", - "parse_url", - "make_headers", - "resolve_cert_reqs", - "resolve_ssl_version", - "split_first", - "ssl_wrap_socket", - "wait_for_read", - "wait_for_write", - "SKIP_HEADER", - "SKIPPABLE_HEADERS", -) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 17b9f657be7d41267c48194aebfc3608b640d401..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1168 zcmZ9LOK%%D5XZTCt=_WaN95Rf14Y%sUZeqXY73~2fEY0(L8~0X3$fXyt%b?uhUCgI zdMf%Mdh5OSev6)p-Ut{z^psnGAPA6CIO{k9!ov?UvmA2%Gu(e#tva$R{PWkv?<Iu( z2j_YfJ{#};w#FYQLXpD|cd+B2s1OxdffsQxw@a+V%ec%dxWZlR=CLxX@*1w?c7@e> z12=NpWli3~E#Ag$-oYKdhSzu(cX<!@_&Q$a8+e0n;!VDVxAOf}c7ykEpKs&s+^?~l zd<XCFUA)V0;amJRzMaSG><+(+@A7;2p7k5}{&{oIdIJ&$j_Cw1m0+2sB<87*`i*lH z-;5OrMUv1^$08w-6lqGMLD4k)XNObrbToW2nwc&*)8Q{iqt6lFG<k4J$$|zEmC9bw zv<DrhBxFL_e8-e$RLk>0-L!{C(=nOOCiBU`<j6Pf)1goN@u6uR`egcIG98V5|H$;L z=Z_Aa&qnjvaO_Vfv$<(rXOX#0tlMn|BGL4<HoZV8Dm6KdlM^aa87JCwCAAWll!Wj_ z(pSo?Ux$=pWN8bv8cheBGZ~~riSU%_LBY85m{XBy(+o2yX`+d?fkDX>pG#({CsdP# zP}<beKq^Wy8*HeQ#ZZ7$a6;=W08dDJaS)mI7xzrYnhyH1Y5Of(fHq(a&;c|6@CM~3 z;0B-z*aDORH9#M*4X6TofOWu4zy@FkunVXFT#NDGfvFR6oaszbLS)g#Ono)+`~u_J zZe>*IRbGCHsoMUfBC)N85=>dbO!Hz*3A%Vy{8!R)Rk^-g#;Q=L(YVlA+v+Q|pwSd< zKd*GJG=eBof-bI98JCcNF+%=A@9byv@wK-QoO(RaYUw=@VaDy~l&2}9Co<rBO2>A< zaxW5R2@~*Ay(LYS9*bXk>A7Br<k9}aA3S9zw3i0qX>dZ7m&U1Q-%1h*>Dj{U-bY@h zW9AVOCw9hUKRy3g{gI0(WAtbFoh=0ZCH0fV+oIz*7wDV!73Az+qT#=2c!BO;p#FzK g!zp|~U(iR+_m}ALf9UZg^4^xV8-?Fo`K>+S6Y)Jk00000 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-312.pyc deleted file mode 100644 index bc1d20eec0c911aa3a6e2dbf808531f6a7a20091..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4778 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 Z)4sEJKhyF3DHPtba$z&H|GMAe_diCXrYrye diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-312.pyc deleted file mode 100644 index 1b84213c7dd3834536d92b69fa25cf3be8c95752..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1574 zcmZ8h&2Jk;6rb^Wops_gu5E%<LRpAtV=3_}6gU*r9?}m`kQ)WVAwpVhcE|Q6`(b8g z-5M4t2M!#$r6<G@6#f$~Nm?n*DiV=6aSKXLJ@ICComh;tvv1~o{oc&)&7afLlL&_W z%lEy91%&<<i_yqs!ucWyyU0Nf_K=S^u%Fw=`O1cZQ4u++qx^_B@>0r!qz-e9!ao>X z8cH&2Q(|#qM%44%%{!(Y2An+O$#qIt=naTz6Ut3WzGX>uw8fZb4hUs#7_@9<1P1;B zk653t!?cTHw1bB@&N;d51%#-O(H3a_KO9BsXJSmJW4tx0YRpXd4)YDwx(~1?br|b} zM>Jr1n?^);J38+X9k2()<^W3vz>y1hbt}+6Yq!_*l_#y%!<9DJ(J<=vq<x=;&xXxO z8Sif2qL#0Jwf==Jx5a_nl^T&vY=>!*%t`EKK5HV(N*Hw9ZsrR>U~%OxEd)H+ji@CN zc4+A9{V?==E3mqRHv7YIAdFMpA&k3$G&h;uBR;tb*@k-4y%Df6>!!ZoHi_Qjyw4Wp zZ&4@QZpZ|WlDtqPs#LcdxulQ=O6n0KW+$XiE$X;ISBR!G0-h8vPbDd(Vp>j88OxiY zWP$^5KCdIA7y88TEzSnUgV2tA5^!d4;*l<#_7aq5Zxg!Ygiix6v>ZZ>0SN{MFwy7_ zc`pp^G?zaxn9Iph-?F#ioS4yf`v%Z2a6)QitTiI;dWM7r$C$hW&@v(j=1L;SLQEck z!lN^QFApEP2h$EZn?u_5{fYXknc7(aX*ZsKeK;{M78)v6j<ouLR)7BZP@6w4)nAqB zN2TS%((<XaEtSt90<u*xX9JovZGxXb*hO44njHMHRbsT4?ea^{7?1Y;z<XH>{Gi4; zrpF4q8Ryv?pBP1oRVO#Hq2*ZJDvmT)|GiAaC|19OPXF#3dHat^K!AawGk{+mEAn_s zS{=GtP*ilkXs9p%0$D7$&Gk(}0%0_89pdPlL(x1k81RKQr35UR8haL!;?=WJ5jSgQ zx#V-g8Y&fMK}GRYTtqSfsVvSZt--2MpcSF13XNu4sZ%nQNv7k{q;$EkxRvJ4z%y|H zz&;rCnut)(p172@0%c}NZ-DxJ_}C+ucF@H&RBfEpZvQs*qW0lQW&YRCUsReGs!}cN zto~a<({CJ?-#RYOos_CSukOG5(aX}ur&{$$yLF)5dZ{g(PR;J;XK5KiHI!DX)hHx+ zkt{7$RGHQ*$R{)Zj-;^!`C9wb51q&(_vqW87wll~!E~lzjQ>Jw2WSo0_{sfq<t8ql RJ-}!cKfxDD4ZkU4{0D=;u`U1r diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-312.pyc deleted file mode 100644 index 5db7c74260c892f6859dcc1dc946768db908d984..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1374 zcma)6&1>976n~>HE4y|#b+XW;wBAE&tb<oH2@RN#Q=yk)T5_r`V!Jc8wb7SnB)7XY zi7AG}gy7_~J@sz<r}UB#LK3xwLg*p4;B7BC^*w3j+98Jy>`(7&-u~t{Px^Ikt^v6E zzx=py!~kBBQ!jIBOky;~z=5+6Jm4DFLl$YC#>h58Ju*ClfzSqJuX=m+lt#JF@@6#n z61cew+!DrM_H-3_hk6zB>>+bzUXio<N<(y5p{wAB16G)uxyVJos;iI+Xib(7#vs6B z96XJ)UGQ{atTC?bGSB2X`W813XNIO@6=%K*){<|^c6AGCLpJf4e2y@N3^l3N;AGV_ zb~t@*gMXYI!U0=#^rG2M!cg?HAc<9Ba)HdHh4qeB7)pd|1@jec>U7@Z?nV*`H|k|- z%l#th=aGmr<z^xj>#`Rut1Rf>6mpp--^XFn<3hSyBHnVt;5#=RW*bR-x%=5AR|T0^ zPJ8{Ey>+47G)P?^%XlK)T!vVC+0C;cbV~`l>98>UAP%xo>sW|x8K9d{^9Vced%N?j zz4*Aj_@upb*SO!9U=;etM@5IED&<;4V~px;vuzll{q{PX3V8!04T+@Lax^)Ik3tVc zJk>(BC}8=UDj12;*%Q>t2xZk-gdKR%ntyO*yz+46-t9;B$MSs)zMI(!X2$StRs-Vx z*4kz@R|dn1EfS@xE396cqM|i#0|k#x5jXra&qnW^pp8Chsm>$pz;k<czp>YNW?y)0 zU-<cxr}jcc{CLW+isU^pf&ZU)J&jX|Ytnj}qz)^UR`freN@K%c7pJMB-^RQ;hk#UD z=k`Z?qy1ZZx1O{X9!;69I(A|Ee%y<M?-vc<j}o4TWY7BkX5I^{jHEk~)JW37<p%^G zA{;<@;F5y0DN4}9pQ7|G9BIsSUR!YSqX{r`;mBfUXF^czqiW}jqz#2#&$=|oov+<4 zek;0BvL#e?Yx>vUUMkG;RWHu_d7LZ3Yu;tFBC>!@{v-FszE&OWy8ILqB%Goz%xj%7 n_8ZLq1sDH-#XoiH&efl;zBHEpwwkQ-z#KOpHva)M%TE6SGIbhO diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-312.pyc deleted file mode 100644 index a3800d16d6f01fa939974faf179fed6e8c360256..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4205 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 MZ1d0yk}Q_}H!PKRKmY&$ diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-312.pyc deleted file mode 100644 index 401bce7477e41619ab5ca70d78f6a7fc333abba2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3011 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-312.pyc deleted file mode 100644 index 19101bd3524f27ac85591119aa7e740f3e998104..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21740 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 K{EI5KivI^^F+B$W diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-312.pyc deleted file mode 100644 index dcc2474f7509c2233e95e7d49b431b4aba40a361..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15125 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc deleted file mode 100644 index 4d40c7c49937208d80593c21b92cc595ebd2235f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5093 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 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-312.pyc deleted file mode 100644 index 1a383bbbf33f6b2f3ca6801eacd483db19d4ae93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10794 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 DGuc3~ diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-312.pyc deleted file mode 100644 index 7f886a1a599b16d6cbcec568d8fd929bb89e5e90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11161 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 QgaW&+<^M~eUk3kw0Xf&mRR910 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-312.pyc deleted file mode 100644 index 84f1d7d04552d35a356e9ad8da484a323c5ac020..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15817 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 OiMjn3b(RCorvC$6QJ+%) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-312.pyc deleted file mode 100644 index 3f51680adaf7aa7bd983ac4c77c9411c2e61e0d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4425 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 B#0>xd diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/connection.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/connection.py deleted file mode 100644 index 6af1138..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/connection.py +++ /dev/null @@ -1,149 +0,0 @@ -from __future__ import absolute_import - -import socket - -from ..contrib import _appengine_environ -from ..exceptions import LocationParseError -from ..packages import six -from .wait import NoWayToWaitForSocketError, wait_for_read - - -def is_connection_dropped(conn): # Platform-specific - """ - Returns True if the connection is dropped and should be closed. - - :param conn: - :class:`http.client.HTTPConnection` object. - - Note: For platforms like AppEngine, this will always return ``False`` to - let the platform handle connection recycling transparently for us. - """ - sock = getattr(conn, "sock", False) - if sock is False: # Platform-specific: AppEngine - return False - if sock is None: # Connection already closed (such as by httplib). - return True - try: - # Returns True if readable, which here means it's been dropped - return wait_for_read(sock, timeout=0.0) - except NoWayToWaitForSocketError: # Platform-specific: AppEngine - return False - - -# This function is copied from socket.py in the Python 2.7 standard -# library test suite. Added to its signature is only `socket_options`. -# One additional modification is that we avoid binding to IPv6 servers -# discovered in DNS if the system doesn't have IPv6 functionality. -def create_connection( - address, - timeout=socket._GLOBAL_DEFAULT_TIMEOUT, - source_address=None, - socket_options=None, -): - """Connect to *address* and return the socket object. - - Convenience function. Connect to *address* (a 2-tuple ``(host, - port)``) and return the socket object. Passing the optional - *timeout* parameter will set the timeout on the socket instance - before attempting to connect. If no *timeout* is supplied, the - global default timeout setting returned by :func:`socket.getdefaulttimeout` - is used. If *source_address* is set it must be a tuple of (host, port) - for the socket to bind as a source address before making the connection. - An host of '' or port 0 tells the OS to use the default. - """ - - host, port = address - if host.startswith("["): - host = host.strip("[]") - err = None - - # Using the value from allowed_gai_family() in the context of getaddrinfo lets - # us select whether to work with IPv4 DNS records, IPv6 records, or both. - # The original create_connection function always returns all records. - family = allowed_gai_family() - - try: - host.encode("idna") - except UnicodeError: - return six.raise_from( - LocationParseError(u"'%s', label empty or too long" % host), None - ) - - for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM): - af, socktype, proto, canonname, sa = res - sock = None - try: - sock = socket.socket(af, socktype, proto) - - # If provided, set socket level options before connecting. - _set_socket_options(sock, socket_options) - - if timeout is not socket._GLOBAL_DEFAULT_TIMEOUT: - sock.settimeout(timeout) - if source_address: - sock.bind(source_address) - sock.connect(sa) - return sock - - except socket.error as e: - err = e - if sock is not None: - sock.close() - sock = None - - if err is not None: - raise err - - raise socket.error("getaddrinfo returns an empty list") - - -def _set_socket_options(sock, options): - if options is None: - return - - for opt in options: - sock.setsockopt(*opt) - - -def allowed_gai_family(): - """This function is designed to work in the context of - getaddrinfo, where family=socket.AF_UNSPEC is the default and - will perform a DNS search for both IPv6 and IPv4 records.""" - - family = socket.AF_INET - if HAS_IPV6: - family = socket.AF_UNSPEC - return family - - -def _has_ipv6(host): - """Returns True if the system can bind an IPv6 address.""" - sock = None - has_ipv6 = False - - # App Engine doesn't support IPV6 sockets and actually has a quota on the - # number of sockets that can be used, so just early out here instead of - # creating a socket needlessly. - # See https://github.com/urllib3/urllib3/issues/1446 - if _appengine_environ.is_appengine_sandbox(): - return False - - if socket.has_ipv6: - # has_ipv6 returns true if cPython was compiled with IPv6 support. - # It does not tell us if the system has IPv6 support enabled. To - # determine that we must bind to an IPv6 address. - # https://github.com/urllib3/urllib3/pull/611 - # https://bugs.python.org/issue658327 - try: - sock = socket.socket(socket.AF_INET6) - sock.bind((host, 0)) - has_ipv6 = True - except Exception: - pass - - if sock: - sock.close() - return has_ipv6 - - -HAS_IPV6 = _has_ipv6("::1") diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/proxy.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/proxy.py deleted file mode 100644 index 2199cc7..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/proxy.py +++ /dev/null @@ -1,57 +0,0 @@ -from .ssl_ import create_urllib3_context, resolve_cert_reqs, resolve_ssl_version - - -def connection_requires_http_tunnel( - proxy_url=None, proxy_config=None, destination_scheme=None -): - """ - Returns True if the connection requires an HTTP CONNECT through the proxy. - - :param URL proxy_url: - URL of the proxy. - :param ProxyConfig proxy_config: - Proxy configuration from poolmanager.py - :param str destination_scheme: - The scheme of the destination. (i.e https, http, etc) - """ - # If we're not using a proxy, no way to use a tunnel. - if proxy_url is None: - return False - - # HTTP destinations never require tunneling, we always forward. - if destination_scheme == "http": - return False - - # Support for forwarding with HTTPS proxies and HTTPS destinations. - if ( - proxy_url.scheme == "https" - and proxy_config - and proxy_config.use_forwarding_for_https - ): - return False - - # Otherwise always use a tunnel. - return True - - -def create_proxy_ssl_context( - ssl_version, cert_reqs, ca_certs=None, ca_cert_dir=None, ca_cert_data=None -): - """ - Generates a default proxy ssl context if one hasn't been provided by the - user. - """ - ssl_context = create_urllib3_context( - ssl_version=resolve_ssl_version(ssl_version), - cert_reqs=resolve_cert_reqs(cert_reqs), - ) - - if ( - not ca_certs - and not ca_cert_dir - and not ca_cert_data - and hasattr(ssl_context, "load_default_certs") - ): - ssl_context.load_default_certs() - - return ssl_context diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/queue.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/queue.py deleted file mode 100644 index 4178410..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/queue.py +++ /dev/null @@ -1,22 +0,0 @@ -import collections - -from ..packages import six -from ..packages.six.moves import queue - -if six.PY2: - # Queue is imported for side effects on MS Windows. See issue #229. - import Queue as _unused_module_Queue # noqa: F401 - - -class LifoQueue(queue.Queue): - def _init(self, _): - self.queue = collections.deque() - - def _qsize(self, len=len): - return len(self.queue) - - def _put(self, item): - self.queue.append(item) - - def _get(self): - return self.queue.pop() diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/request.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/request.py deleted file mode 100644 index 330766e..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/request.py +++ /dev/null @@ -1,137 +0,0 @@ -from __future__ import absolute_import - -from base64 import b64encode - -from ..exceptions import UnrewindableBodyError -from ..packages.six import b, integer_types - -# Pass as a value within ``headers`` to skip -# emitting some HTTP headers that are added automatically. -# The only headers that are supported are ``Accept-Encoding``, -# ``Host``, and ``User-Agent``. -SKIP_HEADER = "@@@SKIP_HEADER@@@" -SKIPPABLE_HEADERS = frozenset(["accept-encoding", "host", "user-agent"]) - -ACCEPT_ENCODING = "gzip,deflate" - -_FAILEDTELL = object() - - -def make_headers( - keep_alive=None, - accept_encoding=None, - user_agent=None, - basic_auth=None, - proxy_basic_auth=None, - disable_cache=None, -): - """ - Shortcuts for generating request headers. - - :param keep_alive: - If ``True``, adds 'connection: keep-alive' header. - - :param accept_encoding: - Can be a boolean, list, or string. - ``True`` translates to 'gzip,deflate'. - List will get joined by comma. - String will be used as provided. - - :param user_agent: - String representing the user-agent you want, such as - "python-urllib3/0.6" - - :param basic_auth: - Colon-separated username:password string for 'authorization: basic ...' - auth header. - - :param proxy_basic_auth: - Colon-separated username:password string for 'proxy-authorization: basic ...' - auth header. - - :param disable_cache: - If ``True``, adds 'cache-control: no-cache' header. - - Example:: - - >>> make_headers(keep_alive=True, user_agent="Batman/1.0") - {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'} - >>> make_headers(accept_encoding=True) - {'accept-encoding': 'gzip,deflate'} - """ - headers = {} - if accept_encoding: - if isinstance(accept_encoding, str): - pass - elif isinstance(accept_encoding, list): - accept_encoding = ",".join(accept_encoding) - else: - accept_encoding = ACCEPT_ENCODING - headers["accept-encoding"] = accept_encoding - - if user_agent: - headers["user-agent"] = user_agent - - if keep_alive: - headers["connection"] = "keep-alive" - - if basic_auth: - headers["authorization"] = "Basic " + b64encode(b(basic_auth)).decode("utf-8") - - if proxy_basic_auth: - headers["proxy-authorization"] = "Basic " + b64encode( - b(proxy_basic_auth) - ).decode("utf-8") - - if disable_cache: - headers["cache-control"] = "no-cache" - - return headers - - -def set_file_position(body, pos): - """ - If a position is provided, move file to that point. - Otherwise, we'll attempt to record a position for future use. - """ - if pos is not None: - rewind_body(body, pos) - elif getattr(body, "tell", None) is not None: - try: - pos = body.tell() - except (IOError, OSError): - # This differentiates from None, allowing us to catch - # a failed `tell()` later when trying to rewind the body. - pos = _FAILEDTELL - - return pos - - -def rewind_body(body, body_pos): - """ - Attempt to rewind body to a certain position. - Primarily used for request redirects and retries. - - :param body: - File-like object that supports seek. - - :param int pos: - Position to seek to in file. - """ - body_seek = getattr(body, "seek", None) - if body_seek is not None and isinstance(body_pos, integer_types): - try: - body_seek(body_pos) - except (IOError, OSError): - raise UnrewindableBodyError( - "An error occurred when rewinding request body for redirect/retry." - ) - elif body_pos is _FAILEDTELL: - raise UnrewindableBodyError( - "Unable to record file position for rewinding " - "request body during a redirect/retry." - ) - else: - raise ValueError( - "body_pos must be of type integer, instead it was %s." % type(body_pos) - ) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/response.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/response.py deleted file mode 100644 index 5ea609c..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/response.py +++ /dev/null @@ -1,107 +0,0 @@ -from __future__ import absolute_import - -from email.errors import MultipartInvariantViolationDefect, StartBoundaryNotFoundDefect - -from ..exceptions import HeaderParsingError -from ..packages.six.moves import http_client as httplib - - -def is_fp_closed(obj): - """ - Checks whether a given file-like object is closed. - - :param obj: - The file-like object to check. - """ - - try: - # Check `isclosed()` first, in case Python3 doesn't set `closed`. - # GH Issue #928 - return obj.isclosed() - except AttributeError: - pass - - try: - # Check via the official file-like-object way. - return obj.closed - except AttributeError: - pass - - try: - # Check if the object is a container for another file-like object that - # gets released on exhaustion (e.g. HTTPResponse). - return obj.fp is None - except AttributeError: - pass - - raise ValueError("Unable to determine whether fp is closed.") - - -def assert_header_parsing(headers): - """ - Asserts whether all headers have been successfully parsed. - Extracts encountered errors from the result of parsing headers. - - Only works on Python 3. - - :param http.client.HTTPMessage headers: Headers to verify. - - :raises urllib3.exceptions.HeaderParsingError: - If parsing errors are found. - """ - - # This will fail silently if we pass in the wrong kind of parameter. - # To make debugging easier add an explicit check. - if not isinstance(headers, httplib.HTTPMessage): - raise TypeError("expected httplib.Message, got {0}.".format(type(headers))) - - defects = getattr(headers, "defects", None) - get_payload = getattr(headers, "get_payload", None) - - unparsed_data = None - if get_payload: - # get_payload is actually email.message.Message.get_payload; - # we're only interested in the result if it's not a multipart message - if not headers.is_multipart(): - payload = get_payload() - - if isinstance(payload, (bytes, str)): - unparsed_data = payload - if defects: - # httplib is assuming a response body is available - # when parsing headers even when httplib only sends - # header data to parse_headers() This results in - # defects on multipart responses in particular. - # See: https://github.com/urllib3/urllib3/issues/800 - - # So we ignore the following defects: - # - StartBoundaryNotFoundDefect: - # The claimed start boundary was never found. - # - MultipartInvariantViolationDefect: - # A message claimed to be a multipart but no subparts were found. - defects = [ - defect - for defect in defects - if not isinstance( - defect, (StartBoundaryNotFoundDefect, MultipartInvariantViolationDefect) - ) - ] - - if defects or unparsed_data: - raise HeaderParsingError(defects=defects, unparsed_data=unparsed_data) - - -def is_response_to_head(response): - """ - Checks whether the request of a response has been a HEAD-request. - Handles the quirks of AppEngine. - - :param http.client.HTTPResponse response: - Response to check if the originating request - used 'HEAD' as a method. - """ - # FIXME: Can we do this somehow without accessing private httplib _method? - method = response._method - if isinstance(method, int): # Platform-specific: Appengine - return method == 3 - return method.upper() == "HEAD" diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/retry.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/retry.py deleted file mode 100644 index 9a1e90d..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/retry.py +++ /dev/null @@ -1,622 +0,0 @@ -from __future__ import absolute_import - -import email -import logging -import re -import time -import warnings -from collections import namedtuple -from itertools import takewhile - -from ..exceptions import ( - ConnectTimeoutError, - InvalidHeader, - MaxRetryError, - ProtocolError, - ProxyError, - ReadTimeoutError, - ResponseError, -) -from ..packages import six - -log = logging.getLogger(__name__) - - -# Data structure for representing the metadata of requests that result in a retry. -RequestHistory = namedtuple( - "RequestHistory", ["method", "url", "error", "status", "redirect_location"] -) - - -# TODO: In v2 we can remove this sentinel and metaclass with deprecated options. -_Default = object() - - -class _RetryMeta(type): - @property - def DEFAULT_METHOD_WHITELIST(cls): - warnings.warn( - "Using 'Retry.DEFAULT_METHOD_WHITELIST' is deprecated and " - "will be removed in v2.0. Use 'Retry.DEFAULT_ALLOWED_METHODS' instead", - DeprecationWarning, - ) - return cls.DEFAULT_ALLOWED_METHODS - - @DEFAULT_METHOD_WHITELIST.setter - def DEFAULT_METHOD_WHITELIST(cls, value): - warnings.warn( - "Using 'Retry.DEFAULT_METHOD_WHITELIST' is deprecated and " - "will be removed in v2.0. Use 'Retry.DEFAULT_ALLOWED_METHODS' instead", - DeprecationWarning, - ) - cls.DEFAULT_ALLOWED_METHODS = value - - @property - def DEFAULT_REDIRECT_HEADERS_BLACKLIST(cls): - warnings.warn( - "Using 'Retry.DEFAULT_REDIRECT_HEADERS_BLACKLIST' is deprecated and " - "will be removed in v2.0. Use 'Retry.DEFAULT_REMOVE_HEADERS_ON_REDIRECT' instead", - DeprecationWarning, - ) - return cls.DEFAULT_REMOVE_HEADERS_ON_REDIRECT - - @DEFAULT_REDIRECT_HEADERS_BLACKLIST.setter - def DEFAULT_REDIRECT_HEADERS_BLACKLIST(cls, value): - warnings.warn( - "Using 'Retry.DEFAULT_REDIRECT_HEADERS_BLACKLIST' is deprecated and " - "will be removed in v2.0. Use 'Retry.DEFAULT_REMOVE_HEADERS_ON_REDIRECT' instead", - DeprecationWarning, - ) - cls.DEFAULT_REMOVE_HEADERS_ON_REDIRECT = value - - @property - def BACKOFF_MAX(cls): - warnings.warn( - "Using 'Retry.BACKOFF_MAX' is deprecated and " - "will be removed in v2.0. Use 'Retry.DEFAULT_BACKOFF_MAX' instead", - DeprecationWarning, - ) - return cls.DEFAULT_BACKOFF_MAX - - @BACKOFF_MAX.setter - def BACKOFF_MAX(cls, value): - warnings.warn( - "Using 'Retry.BACKOFF_MAX' is deprecated and " - "will be removed in v2.0. Use 'Retry.DEFAULT_BACKOFF_MAX' instead", - DeprecationWarning, - ) - cls.DEFAULT_BACKOFF_MAX = value - - -@six.add_metaclass(_RetryMeta) -class Retry(object): - """Retry configuration. - - Each retry attempt will create a new Retry object with updated values, so - they can be safely reused. - - Retries can be defined as a default for a pool:: - - retries = Retry(connect=5, read=2, redirect=5) - http = PoolManager(retries=retries) - response = http.request('GET', 'http://example.com/') - - Or per-request (which overrides the default for the pool):: - - response = http.request('GET', 'http://example.com/', retries=Retry(10)) - - Retries can be disabled by passing ``False``:: - - response = http.request('GET', 'http://example.com/', retries=False) - - Errors will be wrapped in :class:`~urllib3.exceptions.MaxRetryError` unless - retries are disabled, in which case the causing exception will be raised. - - :param int total: - Total number of retries to allow. Takes precedence over other counts. - - Set to ``None`` to remove this constraint and fall back on other - counts. - - Set to ``0`` to fail on the first retry. - - Set to ``False`` to disable and imply ``raise_on_redirect=False``. - - :param int connect: - How many connection-related errors to retry on. - - These are errors raised before the request is sent to the remote server, - which we assume has not triggered the server to process the request. - - Set to ``0`` to fail on the first retry of this type. - - :param int read: - How many times to retry on read errors. - - These errors are raised after the request was sent to the server, so the - request may have side-effects. - - Set to ``0`` to fail on the first retry of this type. - - :param int redirect: - How many redirects to perform. Limit this to avoid infinite redirect - loops. - - A redirect is a HTTP response with a status code 301, 302, 303, 307 or - 308. - - Set to ``0`` to fail on the first retry of this type. - - Set to ``False`` to disable and imply ``raise_on_redirect=False``. - - :param int status: - How many times to retry on bad status codes. - - These are retries made on responses, where status code matches - ``status_forcelist``. - - Set to ``0`` to fail on the first retry of this type. - - :param int other: - How many times to retry on other errors. - - Other errors are errors that are not connect, read, redirect or status errors. - These errors might be raised after the request was sent to the server, so the - request might have side-effects. - - Set to ``0`` to fail on the first retry of this type. - - If ``total`` is not set, it's a good idea to set this to 0 to account - for unexpected edge cases and avoid infinite retry loops. - - :param iterable allowed_methods: - Set of uppercased HTTP method verbs that we should retry on. - - By default, we only retry on methods which are considered to be - idempotent (multiple requests with the same parameters end with the - same state). See :attr:`Retry.DEFAULT_ALLOWED_METHODS`. - - Set to a ``False`` value to retry on any verb. - - .. warning:: - - Previously this parameter was named ``method_whitelist``, that - usage is deprecated in v1.26.0 and will be removed in v2.0. - - :param iterable status_forcelist: - A set of integer HTTP status codes that we should force a retry on. - A retry is initiated if the request method is in ``allowed_methods`` - and the response status code is in ``status_forcelist``. - - By default, this is disabled with ``None``. - - :param float backoff_factor: - A backoff factor to apply between attempts after the second try - (most errors are resolved immediately by a second try without a - delay). urllib3 will sleep for:: - - {backoff factor} * (2 ** ({number of total retries} - 1)) - - seconds. If the backoff_factor is 0.1, then :func:`.sleep` will sleep - for [0.0s, 0.2s, 0.4s, ...] between retries. It will never be longer - than :attr:`Retry.DEFAULT_BACKOFF_MAX`. - - By default, backoff is disabled (set to 0). - - :param bool raise_on_redirect: Whether, if the number of redirects is - exhausted, to raise a MaxRetryError, or to return a response with a - response code in the 3xx range. - - :param bool raise_on_status: Similar meaning to ``raise_on_redirect``: - whether we should raise an exception, or return a response, - if status falls in ``status_forcelist`` range and retries have - been exhausted. - - :param tuple history: The history of the request encountered during - each call to :meth:`~Retry.increment`. The list is in the order - the requests occurred. Each list item is of class :class:`RequestHistory`. - - :param bool respect_retry_after_header: - Whether to respect Retry-After header on status codes defined as - :attr:`Retry.RETRY_AFTER_STATUS_CODES` or not. - - :param iterable remove_headers_on_redirect: - Sequence of headers to remove from the request when a response - indicating a redirect is returned before firing off the redirected - request. - """ - - #: Default methods to be used for ``allowed_methods`` - DEFAULT_ALLOWED_METHODS = frozenset( - ["HEAD", "GET", "PUT", "DELETE", "OPTIONS", "TRACE"] - ) - - #: Default status codes to be used for ``status_forcelist`` - RETRY_AFTER_STATUS_CODES = frozenset([413, 429, 503]) - - #: Default headers to be used for ``remove_headers_on_redirect`` - DEFAULT_REMOVE_HEADERS_ON_REDIRECT = frozenset( - ["Cookie", "Authorization", "Proxy-Authorization"] - ) - - #: Maximum backoff time. - DEFAULT_BACKOFF_MAX = 120 - - def __init__( - self, - total=10, - connect=None, - read=None, - redirect=None, - status=None, - other=None, - allowed_methods=_Default, - status_forcelist=None, - backoff_factor=0, - raise_on_redirect=True, - raise_on_status=True, - history=None, - respect_retry_after_header=True, - remove_headers_on_redirect=_Default, - # TODO: Deprecated, remove in v2.0 - method_whitelist=_Default, - ): - - if method_whitelist is not _Default: - if allowed_methods is not _Default: - raise ValueError( - "Using both 'allowed_methods' and " - "'method_whitelist' together is not allowed. " - "Instead only use 'allowed_methods'" - ) - warnings.warn( - "Using 'method_whitelist' with Retry is deprecated and " - "will be removed in v2.0. Use 'allowed_methods' instead", - DeprecationWarning, - stacklevel=2, - ) - allowed_methods = method_whitelist - if allowed_methods is _Default: - allowed_methods = self.DEFAULT_ALLOWED_METHODS - if remove_headers_on_redirect is _Default: - remove_headers_on_redirect = self.DEFAULT_REMOVE_HEADERS_ON_REDIRECT - - self.total = total - self.connect = connect - self.read = read - self.status = status - self.other = other - - if redirect is False or total is False: - redirect = 0 - raise_on_redirect = False - - self.redirect = redirect - self.status_forcelist = status_forcelist or set() - self.allowed_methods = allowed_methods - self.backoff_factor = backoff_factor - self.raise_on_redirect = raise_on_redirect - self.raise_on_status = raise_on_status - self.history = history or tuple() - self.respect_retry_after_header = respect_retry_after_header - self.remove_headers_on_redirect = frozenset( - [h.lower() for h in remove_headers_on_redirect] - ) - - def new(self, **kw): - params = dict( - total=self.total, - connect=self.connect, - read=self.read, - redirect=self.redirect, - status=self.status, - other=self.other, - status_forcelist=self.status_forcelist, - backoff_factor=self.backoff_factor, - raise_on_redirect=self.raise_on_redirect, - raise_on_status=self.raise_on_status, - history=self.history, - remove_headers_on_redirect=self.remove_headers_on_redirect, - respect_retry_after_header=self.respect_retry_after_header, - ) - - # TODO: If already given in **kw we use what's given to us - # If not given we need to figure out what to pass. We decide - # based on whether our class has the 'method_whitelist' property - # and if so we pass the deprecated 'method_whitelist' otherwise - # we use 'allowed_methods'. Remove in v2.0 - if "method_whitelist" not in kw and "allowed_methods" not in kw: - if "method_whitelist" in self.__dict__: - warnings.warn( - "Using 'method_whitelist' with Retry is deprecated and " - "will be removed in v2.0. Use 'allowed_methods' instead", - DeprecationWarning, - ) - params["method_whitelist"] = self.allowed_methods - else: - params["allowed_methods"] = self.allowed_methods - - params.update(kw) - return type(self)(**params) - - @classmethod - def from_int(cls, retries, redirect=True, default=None): - """Backwards-compatibility for the old retries format.""" - if retries is None: - retries = default if default is not None else cls.DEFAULT - - if isinstance(retries, Retry): - return retries - - redirect = bool(redirect) and None - new_retries = cls(retries, redirect=redirect) - log.debug("Converted retries value: %r -> %r", retries, new_retries) - return new_retries - - def get_backoff_time(self): - """Formula for computing the current backoff - - :rtype: float - """ - # We want to consider only the last consecutive errors sequence (Ignore redirects). - consecutive_errors_len = len( - list( - takewhile(lambda x: x.redirect_location is None, reversed(self.history)) - ) - ) - if consecutive_errors_len <= 1: - return 0 - - backoff_value = self.backoff_factor * (2 ** (consecutive_errors_len - 1)) - return min(self.DEFAULT_BACKOFF_MAX, backoff_value) - - def parse_retry_after(self, retry_after): - # Whitespace: https://tools.ietf.org/html/rfc7230#section-3.2.4 - if re.match(r"^\s*[0-9]+\s*$", retry_after): - seconds = int(retry_after) - else: - retry_date_tuple = email.utils.parsedate_tz(retry_after) - if retry_date_tuple is None: - raise InvalidHeader("Invalid Retry-After header: %s" % retry_after) - if retry_date_tuple[9] is None: # Python 2 - # Assume UTC if no timezone was specified - # On Python2.7, parsedate_tz returns None for a timezone offset - # instead of 0 if no timezone is given, where mktime_tz treats - # a None timezone offset as local time. - retry_date_tuple = retry_date_tuple[:9] + (0,) + retry_date_tuple[10:] - - retry_date = email.utils.mktime_tz(retry_date_tuple) - seconds = retry_date - time.time() - - if seconds < 0: - seconds = 0 - - return seconds - - def get_retry_after(self, response): - """Get the value of Retry-After in seconds.""" - - retry_after = response.headers.get("Retry-After") - - if retry_after is None: - return None - - return self.parse_retry_after(retry_after) - - def sleep_for_retry(self, response=None): - retry_after = self.get_retry_after(response) - if retry_after: - time.sleep(retry_after) - return True - - return False - - def _sleep_backoff(self): - backoff = self.get_backoff_time() - if backoff <= 0: - return - time.sleep(backoff) - - def sleep(self, response=None): - """Sleep between retry attempts. - - This method will respect a server's ``Retry-After`` response header - and sleep the duration of the time requested. If that is not present, it - will use an exponential backoff. By default, the backoff factor is 0 and - this method will return immediately. - """ - - if self.respect_retry_after_header and response: - slept = self.sleep_for_retry(response) - if slept: - return - - self._sleep_backoff() - - def _is_connection_error(self, err): - """Errors when we're fairly sure that the server did not receive the - request, so it should be safe to retry. - """ - if isinstance(err, ProxyError): - err = err.original_error - return isinstance(err, ConnectTimeoutError) - - def _is_read_error(self, err): - """Errors that occur after the request has been started, so we should - assume that the server began processing it. - """ - return isinstance(err, (ReadTimeoutError, ProtocolError)) - - def _is_method_retryable(self, method): - """Checks if a given HTTP method should be retried upon, depending if - it is included in the allowed_methods - """ - # TODO: For now favor if the Retry implementation sets its own method_whitelist - # property outside of our constructor to avoid breaking custom implementations. - if "method_whitelist" in self.__dict__: - warnings.warn( - "Using 'method_whitelist' with Retry is deprecated and " - "will be removed in v2.0. Use 'allowed_methods' instead", - DeprecationWarning, - ) - allowed_methods = self.method_whitelist - else: - allowed_methods = self.allowed_methods - - if allowed_methods and method.upper() not in allowed_methods: - return False - return True - - def is_retry(self, method, status_code, has_retry_after=False): - """Is this method/status code retryable? (Based on allowlists and control - variables such as the number of total retries to allow, whether to - respect the Retry-After header, whether this header is present, and - whether the returned status code is on the list of status codes to - be retried upon on the presence of the aforementioned header) - """ - if not self._is_method_retryable(method): - return False - - if self.status_forcelist and status_code in self.status_forcelist: - return True - - return ( - self.total - and self.respect_retry_after_header - and has_retry_after - and (status_code in self.RETRY_AFTER_STATUS_CODES) - ) - - def is_exhausted(self): - """Are we out of retries?""" - retry_counts = ( - self.total, - self.connect, - self.read, - self.redirect, - self.status, - self.other, - ) - retry_counts = list(filter(None, retry_counts)) - if not retry_counts: - return False - - return min(retry_counts) < 0 - - def increment( - self, - method=None, - url=None, - response=None, - error=None, - _pool=None, - _stacktrace=None, - ): - """Return a new Retry object with incremented retry counters. - - :param response: A response object, or None, if the server did not - return a response. - :type response: :class:`~urllib3.response.HTTPResponse` - :param Exception error: An error encountered during the request, or - None if the response was received successfully. - - :return: A new ``Retry`` object. - """ - if self.total is False and error: - # Disabled, indicate to re-raise the error. - raise six.reraise(type(error), error, _stacktrace) - - total = self.total - if total is not None: - total -= 1 - - connect = self.connect - read = self.read - redirect = self.redirect - status_count = self.status - other = self.other - cause = "unknown" - status = None - redirect_location = None - - if error and self._is_connection_error(error): - # Connect retry? - if connect is False: - raise six.reraise(type(error), error, _stacktrace) - elif connect is not None: - connect -= 1 - - elif error and self._is_read_error(error): - # Read retry? - if read is False or not self._is_method_retryable(method): - raise six.reraise(type(error), error, _stacktrace) - elif read is not None: - read -= 1 - - elif error: - # Other retry? - if other is not None: - other -= 1 - - elif response and response.get_redirect_location(): - # Redirect retry? - if redirect is not None: - redirect -= 1 - cause = "too many redirects" - redirect_location = response.get_redirect_location() - status = response.status - - else: - # Incrementing because of a server error like a 500 in - # status_forcelist and the given method is in the allowed_methods - cause = ResponseError.GENERIC_ERROR - if response and response.status: - if status_count is not None: - status_count -= 1 - cause = ResponseError.SPECIFIC_ERROR.format(status_code=response.status) - status = response.status - - history = self.history + ( - RequestHistory(method, url, error, status, redirect_location), - ) - - new_retry = self.new( - total=total, - connect=connect, - read=read, - redirect=redirect, - status=status_count, - other=other, - history=history, - ) - - if new_retry.is_exhausted(): - raise MaxRetryError(_pool, url, error or ResponseError(cause)) - - log.debug("Incremented Retry for (url='%s'): %r", url, new_retry) - - return new_retry - - def __repr__(self): - return ( - "{cls.__name__}(total={self.total}, connect={self.connect}, " - "read={self.read}, redirect={self.redirect}, status={self.status})" - ).format(cls=type(self), self=self) - - def __getattr__(self, item): - if item == "method_whitelist": - # TODO: Remove this deprecated alias in v2.0 - warnings.warn( - "Using 'method_whitelist' with Retry is deprecated and " - "will be removed in v2.0. Use 'allowed_methods' instead", - DeprecationWarning, - ) - return self.allowed_methods - try: - return getattr(super(Retry, self), item) - except AttributeError: - return getattr(Retry, item) - - -# For backwards compatibility (equivalent to pre-v1.9): -Retry.DEFAULT = Retry(3) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_.py deleted file mode 100644 index 2b45d39..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_.py +++ /dev/null @@ -1,495 +0,0 @@ -from __future__ import absolute_import - -import hmac -import os -import sys -import warnings -from binascii import hexlify, unhexlify -from hashlib import md5, sha1, sha256 - -from ..exceptions import ( - InsecurePlatformWarning, - ProxySchemeUnsupported, - SNIMissingWarning, - SSLError, -) -from ..packages import six -from .url import BRACELESS_IPV6_ADDRZ_RE, IPV4_RE - -SSLContext = None -SSLTransport = None -HAS_SNI = False -IS_PYOPENSSL = False -IS_SECURETRANSPORT = False -ALPN_PROTOCOLS = ["http/1.1"] - -# Maps the length of a digest to a possible hash function producing this digest -HASHFUNC_MAP = {32: md5, 40: sha1, 64: sha256} - - -def _const_compare_digest_backport(a, b): - """ - Compare two digests of equal length in constant time. - - The digests must be of type str/bytes. - Returns True if the digests match, and False otherwise. - """ - result = abs(len(a) - len(b)) - for left, right in zip(bytearray(a), bytearray(b)): - result |= left ^ right - return result == 0 - - -_const_compare_digest = getattr(hmac, "compare_digest", _const_compare_digest_backport) - -try: # Test for SSL features - import ssl - from ssl import CERT_REQUIRED, wrap_socket -except ImportError: - pass - -try: - from ssl import HAS_SNI # Has SNI? -except ImportError: - pass - -try: - from .ssltransport import SSLTransport -except ImportError: - pass - - -try: # Platform-specific: Python 3.6 - from ssl import PROTOCOL_TLS - - PROTOCOL_SSLv23 = PROTOCOL_TLS -except ImportError: - try: - from ssl import PROTOCOL_SSLv23 as PROTOCOL_TLS - - PROTOCOL_SSLv23 = PROTOCOL_TLS - except ImportError: - PROTOCOL_SSLv23 = PROTOCOL_TLS = 2 - -try: - from ssl import PROTOCOL_TLS_CLIENT -except ImportError: - PROTOCOL_TLS_CLIENT = PROTOCOL_TLS - - -try: - from ssl import OP_NO_COMPRESSION, OP_NO_SSLv2, OP_NO_SSLv3 -except ImportError: - OP_NO_SSLv2, OP_NO_SSLv3 = 0x1000000, 0x2000000 - OP_NO_COMPRESSION = 0x20000 - - -try: # OP_NO_TICKET was added in Python 3.6 - from ssl import OP_NO_TICKET -except ImportError: - OP_NO_TICKET = 0x4000 - - -# A secure default. -# Sources for more information on TLS ciphers: -# -# - https://wiki.mozilla.org/Security/Server_Side_TLS -# - https://www.ssllabs.com/projects/best-practices/index.html -# - https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/ -# -# The general intent is: -# - prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE), -# - prefer ECDHE over DHE for better performance, -# - prefer any AES-GCM and ChaCha20 over any AES-CBC for better performance and -# security, -# - prefer AES-GCM over ChaCha20 because hardware-accelerated AES is common, -# - disable NULL authentication, MD5 MACs, DSS, and other -# insecure ciphers for security reasons. -# - NOTE: TLS 1.3 cipher suites are managed through a different interface -# not exposed by CPython (yet!) and are enabled by default if they're available. -DEFAULT_CIPHERS = ":".join( - [ - "ECDHE+AESGCM", - "ECDHE+CHACHA20", - "DHE+AESGCM", - "DHE+CHACHA20", - "ECDH+AESGCM", - "DH+AESGCM", - "ECDH+AES", - "DH+AES", - "RSA+AESGCM", - "RSA+AES", - "!aNULL", - "!eNULL", - "!MD5", - "!DSS", - ] -) - -try: - from ssl import SSLContext # Modern SSL? -except ImportError: - - class SSLContext(object): # Platform-specific: Python 2 - def __init__(self, protocol_version): - self.protocol = protocol_version - # Use default values from a real SSLContext - self.check_hostname = False - self.verify_mode = ssl.CERT_NONE - self.ca_certs = None - self.options = 0 - self.certfile = None - self.keyfile = None - self.ciphers = None - - def load_cert_chain(self, certfile, keyfile): - self.certfile = certfile - self.keyfile = keyfile - - def load_verify_locations(self, cafile=None, capath=None, cadata=None): - self.ca_certs = cafile - - if capath is not None: - raise SSLError("CA directories not supported in older Pythons") - - if cadata is not None: - raise SSLError("CA data not supported in older Pythons") - - def set_ciphers(self, cipher_suite): - self.ciphers = cipher_suite - - def wrap_socket(self, socket, server_hostname=None, server_side=False): - warnings.warn( - "A true SSLContext object is not available. This prevents " - "urllib3 from configuring SSL appropriately and may cause " - "certain SSL connections to fail. You can upgrade to a newer " - "version of Python to solve this. For more information, see " - "https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html" - "#ssl-warnings", - InsecurePlatformWarning, - ) - kwargs = { - "keyfile": self.keyfile, - "certfile": self.certfile, - "ca_certs": self.ca_certs, - "cert_reqs": self.verify_mode, - "ssl_version": self.protocol, - "server_side": server_side, - } - return wrap_socket(socket, ciphers=self.ciphers, **kwargs) - - -def assert_fingerprint(cert, fingerprint): - """ - Checks if given fingerprint matches the supplied certificate. - - :param cert: - Certificate as bytes object. - :param fingerprint: - Fingerprint as string of hexdigits, can be interspersed by colons. - """ - - fingerprint = fingerprint.replace(":", "").lower() - digest_length = len(fingerprint) - hashfunc = HASHFUNC_MAP.get(digest_length) - if not hashfunc: - raise SSLError("Fingerprint of invalid length: {0}".format(fingerprint)) - - # We need encode() here for py32; works on py2 and p33. - fingerprint_bytes = unhexlify(fingerprint.encode()) - - cert_digest = hashfunc(cert).digest() - - if not _const_compare_digest(cert_digest, fingerprint_bytes): - raise SSLError( - 'Fingerprints did not match. Expected "{0}", got "{1}".'.format( - fingerprint, hexlify(cert_digest) - ) - ) - - -def resolve_cert_reqs(candidate): - """ - Resolves the argument to a numeric constant, which can be passed to - the wrap_socket function/method from the ssl module. - Defaults to :data:`ssl.CERT_REQUIRED`. - If given a string it is assumed to be the name of the constant in the - :mod:`ssl` module or its abbreviation. - (So you can specify `REQUIRED` instead of `CERT_REQUIRED`. - If it's neither `None` nor a string we assume it is already the numeric - constant which can directly be passed to wrap_socket. - """ - if candidate is None: - return CERT_REQUIRED - - if isinstance(candidate, str): - res = getattr(ssl, candidate, None) - if res is None: - res = getattr(ssl, "CERT_" + candidate) - return res - - return candidate - - -def resolve_ssl_version(candidate): - """ - like resolve_cert_reqs - """ - if candidate is None: - return PROTOCOL_TLS - - if isinstance(candidate, str): - res = getattr(ssl, candidate, None) - if res is None: - res = getattr(ssl, "PROTOCOL_" + candidate) - return res - - return candidate - - -def create_urllib3_context( - ssl_version=None, cert_reqs=None, options=None, ciphers=None -): - """All arguments have the same meaning as ``ssl_wrap_socket``. - - By default, this function does a lot of the same work that - ``ssl.create_default_context`` does on Python 3.4+. It: - - - Disables SSLv2, SSLv3, and compression - - Sets a restricted set of server ciphers - - If you wish to enable SSLv3, you can do:: - - from pip._vendor.urllib3.util import ssl_ - context = ssl_.create_urllib3_context() - context.options &= ~ssl_.OP_NO_SSLv3 - - You can do the same to enable compression (substituting ``COMPRESSION`` - for ``SSLv3`` in the last line above). - - :param ssl_version: - The desired protocol version to use. This will default to - PROTOCOL_SSLv23 which will negotiate the highest protocol that both - the server and your installation of OpenSSL support. - :param cert_reqs: - Whether to require the certificate verification. This defaults to - ``ssl.CERT_REQUIRED``. - :param options: - Specific OpenSSL options. These default to ``ssl.OP_NO_SSLv2``, - ``ssl.OP_NO_SSLv3``, ``ssl.OP_NO_COMPRESSION``, and ``ssl.OP_NO_TICKET``. - :param ciphers: - Which cipher suites to allow the server to select. - :returns: - Constructed SSLContext object with specified options - :rtype: SSLContext - """ - # PROTOCOL_TLS is deprecated in Python 3.10 - if not ssl_version or ssl_version == PROTOCOL_TLS: - ssl_version = PROTOCOL_TLS_CLIENT - - context = SSLContext(ssl_version) - - context.set_ciphers(ciphers or DEFAULT_CIPHERS) - - # Setting the default here, as we may have no ssl module on import - cert_reqs = ssl.CERT_REQUIRED if cert_reqs is None else cert_reqs - - if options is None: - options = 0 - # SSLv2 is easily broken and is considered harmful and dangerous - options |= OP_NO_SSLv2 - # SSLv3 has several problems and is now dangerous - options |= OP_NO_SSLv3 - # Disable compression to prevent CRIME attacks for OpenSSL 1.0+ - # (issue #309) - options |= OP_NO_COMPRESSION - # TLSv1.2 only. Unless set explicitly, do not request tickets. - # This may save some bandwidth on wire, and although the ticket is encrypted, - # there is a risk associated with it being on wire, - # if the server is not rotating its ticketing keys properly. - options |= OP_NO_TICKET - - context.options |= options - - # Enable post-handshake authentication for TLS 1.3, see GH #1634. PHA is - # necessary for conditional client cert authentication with TLS 1.3. - # The attribute is None for OpenSSL <= 1.1.0 or does not exist in older - # versions of Python. We only enable on Python 3.7.4+ or if certificate - # verification is enabled to work around Python issue #37428 - # See: https://bugs.python.org/issue37428 - if (cert_reqs == ssl.CERT_REQUIRED or sys.version_info >= (3, 7, 4)) and getattr( - context, "post_handshake_auth", None - ) is not None: - context.post_handshake_auth = True - - def disable_check_hostname(): - if ( - getattr(context, "check_hostname", None) is not None - ): # Platform-specific: Python 3.2 - # We do our own verification, including fingerprints and alternative - # hostnames. So disable it here - context.check_hostname = False - - # The order of the below lines setting verify_mode and check_hostname - # matter due to safe-guards SSLContext has to prevent an SSLContext with - # check_hostname=True, verify_mode=NONE/OPTIONAL. This is made even more - # complex because we don't know whether PROTOCOL_TLS_CLIENT will be used - # or not so we don't know the initial state of the freshly created SSLContext. - if cert_reqs == ssl.CERT_REQUIRED: - context.verify_mode = cert_reqs - disable_check_hostname() - else: - disable_check_hostname() - context.verify_mode = cert_reqs - - # Enable logging of TLS session keys via defacto standard environment variable - # 'SSLKEYLOGFILE', if the feature is available (Python 3.8+). Skip empty values. - if hasattr(context, "keylog_filename"): - sslkeylogfile = os.environ.get("SSLKEYLOGFILE") - if sslkeylogfile: - context.keylog_filename = sslkeylogfile - - return context - - -def ssl_wrap_socket( - sock, - keyfile=None, - certfile=None, - cert_reqs=None, - ca_certs=None, - server_hostname=None, - ssl_version=None, - ciphers=None, - ssl_context=None, - ca_cert_dir=None, - key_password=None, - ca_cert_data=None, - tls_in_tls=False, -): - """ - All arguments except for server_hostname, ssl_context, and ca_cert_dir have - the same meaning as they do when using :func:`ssl.wrap_socket`. - - :param server_hostname: - When SNI is supported, the expected hostname of the certificate - :param ssl_context: - A pre-made :class:`SSLContext` object. If none is provided, one will - be created using :func:`create_urllib3_context`. - :param ciphers: - A string of ciphers we wish the client to support. - :param ca_cert_dir: - A directory containing CA certificates in multiple separate files, as - supported by OpenSSL's -CApath flag or the capath argument to - SSLContext.load_verify_locations(). - :param key_password: - Optional password if the keyfile is encrypted. - :param ca_cert_data: - Optional string containing CA certificates in PEM format suitable for - passing as the cadata parameter to SSLContext.load_verify_locations() - :param tls_in_tls: - Use SSLTransport to wrap the existing socket. - """ - context = ssl_context - if context is None: - # Note: This branch of code and all the variables in it are no longer - # used by urllib3 itself. We should consider deprecating and removing - # this code. - context = create_urllib3_context(ssl_version, cert_reqs, ciphers=ciphers) - - if ca_certs or ca_cert_dir or ca_cert_data: - try: - context.load_verify_locations(ca_certs, ca_cert_dir, ca_cert_data) - except (IOError, OSError) as e: - raise SSLError(e) - - elif ssl_context is None and hasattr(context, "load_default_certs"): - # try to load OS default certs; works well on Windows (require Python3.4+) - context.load_default_certs() - - # Attempt to detect if we get the goofy behavior of the - # keyfile being encrypted and OpenSSL asking for the - # passphrase via the terminal and instead error out. - if keyfile and key_password is None and _is_key_file_encrypted(keyfile): - raise SSLError("Client private key is encrypted, password is required") - - if certfile: - if key_password is None: - context.load_cert_chain(certfile, keyfile) - else: - context.load_cert_chain(certfile, keyfile, key_password) - - try: - if hasattr(context, "set_alpn_protocols"): - context.set_alpn_protocols(ALPN_PROTOCOLS) - except NotImplementedError: # Defensive: in CI, we always have set_alpn_protocols - pass - - # If we detect server_hostname is an IP address then the SNI - # extension should not be used according to RFC3546 Section 3.1 - use_sni_hostname = server_hostname and not is_ipaddress(server_hostname) - # SecureTransport uses server_hostname in certificate verification. - send_sni = (use_sni_hostname and HAS_SNI) or ( - IS_SECURETRANSPORT and server_hostname - ) - # Do not warn the user if server_hostname is an invalid SNI hostname. - if not HAS_SNI and use_sni_hostname: - warnings.warn( - "An HTTPS request has been made, but the SNI (Server Name " - "Indication) extension to TLS is not available on this platform. " - "This may cause the server to present an incorrect TLS " - "certificate, which can cause validation failures. You can upgrade to " - "a newer version of Python to solve this. For more information, see " - "https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html" - "#ssl-warnings", - SNIMissingWarning, - ) - - if send_sni: - ssl_sock = _ssl_wrap_socket_impl( - sock, context, tls_in_tls, server_hostname=server_hostname - ) - else: - ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls) - return ssl_sock - - -def is_ipaddress(hostname): - """Detects whether the hostname given is an IPv4 or IPv6 address. - Also detects IPv6 addresses with Zone IDs. - - :param str hostname: Hostname to examine. - :return: True if the hostname is an IP address, False otherwise. - """ - if not six.PY2 and isinstance(hostname, bytes): - # IDN A-label bytes are ASCII compatible. - hostname = hostname.decode("ascii") - return bool(IPV4_RE.match(hostname) or BRACELESS_IPV6_ADDRZ_RE.match(hostname)) - - -def _is_key_file_encrypted(key_file): - """Detects if a key file is encrypted or not.""" - with open(key_file, "r") as f: - for line in f: - # Look for Proc-Type: 4,ENCRYPTED - if "ENCRYPTED" in line: - return True - - return False - - -def _ssl_wrap_socket_impl(sock, ssl_context, tls_in_tls, server_hostname=None): - if tls_in_tls: - if not SSLTransport: - # Import error, ssl is not available. - raise ProxySchemeUnsupported( - "TLS in TLS requires support for the 'ssl' module" - ) - - SSLTransport._validate_ssl_context_for_tls_in_tls(ssl_context) - return SSLTransport(sock, ssl_context, server_hostname) - - if server_hostname: - return ssl_context.wrap_socket(sock, server_hostname=server_hostname) - else: - return ssl_context.wrap_socket(sock) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py deleted file mode 100644 index 1dd950c..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py +++ /dev/null @@ -1,159 +0,0 @@ -"""The match_hostname() function from Python 3.3.3, essential when using SSL.""" - -# Note: This file is under the PSF license as the code comes from the python -# stdlib. http://docs.python.org/3/license.html - -import re -import sys - -# ipaddress has been backported to 2.6+ in pypi. If it is installed on the -# system, use it to handle IPAddress ServerAltnames (this was added in -# python-3.5) otherwise only do DNS matching. This allows -# util.ssl_match_hostname to continue to be used in Python 2.7. -try: - import ipaddress -except ImportError: - ipaddress = None - -__version__ = "3.5.0.1" - - -class CertificateError(ValueError): - pass - - -def _dnsname_match(dn, hostname, max_wildcards=1): - """Matching according to RFC 6125, section 6.4.3 - - http://tools.ietf.org/html/rfc6125#section-6.4.3 - """ - pats = [] - if not dn: - return False - - # Ported from python3-syntax: - # leftmost, *remainder = dn.split(r'.') - parts = dn.split(r".") - leftmost = parts[0] - remainder = parts[1:] - - wildcards = leftmost.count("*") - if wildcards > max_wildcards: - # Issue #17980: avoid denials of service by refusing more - # than one wildcard per fragment. A survey of established - # policy among SSL implementations showed it to be a - # reasonable choice. - raise CertificateError( - "too many wildcards in certificate DNS name: " + repr(dn) - ) - - # speed up common case w/o wildcards - if not wildcards: - return dn.lower() == hostname.lower() - - # RFC 6125, section 6.4.3, subitem 1. - # The client SHOULD NOT attempt to match a presented identifier in which - # the wildcard character comprises a label other than the left-most label. - if leftmost == "*": - # When '*' is a fragment by itself, it matches a non-empty dotless - # fragment. - pats.append("[^.]+") - elif leftmost.startswith("xn--") or hostname.startswith("xn--"): - # RFC 6125, section 6.4.3, subitem 3. - # The client SHOULD NOT attempt to match a presented identifier - # where the wildcard character is embedded within an A-label or - # U-label of an internationalized domain name. - pats.append(re.escape(leftmost)) - else: - # Otherwise, '*' matches any dotless string, e.g. www* - pats.append(re.escape(leftmost).replace(r"\*", "[^.]*")) - - # add the remaining fragments, ignore any wildcards - for frag in remainder: - pats.append(re.escape(frag)) - - pat = re.compile(r"\A" + r"\.".join(pats) + r"\Z", re.IGNORECASE) - return pat.match(hostname) - - -def _to_unicode(obj): - if isinstance(obj, str) and sys.version_info < (3,): - # ignored flake8 # F821 to support python 2.7 function - obj = unicode(obj, encoding="ascii", errors="strict") # noqa: F821 - return obj - - -def _ipaddress_match(ipname, host_ip): - """Exact matching of IP addresses. - - RFC 6125 explicitly doesn't define an algorithm for this - (section 1.7.2 - "Out of Scope"). - """ - # OpenSSL may add a trailing newline to a subjectAltName's IP address - # Divergence from upstream: ipaddress can't handle byte str - ip = ipaddress.ip_address(_to_unicode(ipname).rstrip()) - return ip == host_ip - - -def match_hostname(cert, hostname): - """Verify that *cert* (in decoded format as returned by - SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 - rules are followed, but IP addresses are not accepted for *hostname*. - - CertificateError is raised on failure. On success, the function - returns nothing. - """ - if not cert: - raise ValueError( - "empty or no certificate, match_hostname needs a " - "SSL socket or SSL context with either " - "CERT_OPTIONAL or CERT_REQUIRED" - ) - try: - # Divergence from upstream: ipaddress can't handle byte str - host_ip = ipaddress.ip_address(_to_unicode(hostname)) - except (UnicodeError, ValueError): - # ValueError: Not an IP address (common case) - # UnicodeError: Divergence from upstream: Have to deal with ipaddress not taking - # byte strings. addresses should be all ascii, so we consider it not - # an ipaddress in this case - host_ip = None - except AttributeError: - # Divergence from upstream: Make ipaddress library optional - if ipaddress is None: - host_ip = None - else: # Defensive - raise - dnsnames = [] - san = cert.get("subjectAltName", ()) - for key, value in san: - if key == "DNS": - if host_ip is None and _dnsname_match(value, hostname): - return - dnsnames.append(value) - elif key == "IP Address": - if host_ip is not None and _ipaddress_match(value, host_ip): - return - dnsnames.append(value) - if not dnsnames: - # The subject is only checked when there is no dNSName entry - # in subjectAltName - for sub in cert.get("subject", ()): - for key, value in sub: - # XXX according to RFC 2818, the most specific Common Name - # must be used. - if key == "commonName": - if _dnsname_match(value, hostname): - return - dnsnames.append(value) - if len(dnsnames) > 1: - raise CertificateError( - "hostname %r " - "doesn't match either of %s" % (hostname, ", ".join(map(repr, dnsnames))) - ) - elif len(dnsnames) == 1: - raise CertificateError("hostname %r doesn't match %r" % (hostname, dnsnames[0])) - else: - raise CertificateError( - "no appropriate commonName or subjectAltName fields were found" - ) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssltransport.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssltransport.py deleted file mode 100644 index 4a7105d..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssltransport.py +++ /dev/null @@ -1,221 +0,0 @@ -import io -import socket -import ssl - -from ..exceptions import ProxySchemeUnsupported -from ..packages import six - -SSL_BLOCKSIZE = 16384 - - -class SSLTransport: - """ - The SSLTransport wraps an existing socket and establishes an SSL connection. - - Contrary to Python's implementation of SSLSocket, it allows you to chain - multiple TLS connections together. It's particularly useful if you need to - implement TLS within TLS. - - The class supports most of the socket API operations. - """ - - @staticmethod - def _validate_ssl_context_for_tls_in_tls(ssl_context): - """ - Raises a ProxySchemeUnsupported if the provided ssl_context can't be used - for TLS in TLS. - - The only requirement is that the ssl_context provides the 'wrap_bio' - methods. - """ - - if not hasattr(ssl_context, "wrap_bio"): - if six.PY2: - raise ProxySchemeUnsupported( - "TLS in TLS requires SSLContext.wrap_bio() which isn't " - "supported on Python 2" - ) - else: - raise ProxySchemeUnsupported( - "TLS in TLS requires SSLContext.wrap_bio() which isn't " - "available on non-native SSLContext" - ) - - def __init__( - self, socket, ssl_context, server_hostname=None, suppress_ragged_eofs=True - ): - """ - Create an SSLTransport around socket using the provided ssl_context. - """ - self.incoming = ssl.MemoryBIO() - self.outgoing = ssl.MemoryBIO() - - self.suppress_ragged_eofs = suppress_ragged_eofs - self.socket = socket - - self.sslobj = ssl_context.wrap_bio( - self.incoming, self.outgoing, server_hostname=server_hostname - ) - - # Perform initial handshake. - self._ssl_io_loop(self.sslobj.do_handshake) - - def __enter__(self): - return self - - def __exit__(self, *_): - self.close() - - def fileno(self): - return self.socket.fileno() - - def read(self, len=1024, buffer=None): - return self._wrap_ssl_read(len, buffer) - - def recv(self, len=1024, flags=0): - if flags != 0: - raise ValueError("non-zero flags not allowed in calls to recv") - return self._wrap_ssl_read(len) - - def recv_into(self, buffer, nbytes=None, flags=0): - if flags != 0: - raise ValueError("non-zero flags not allowed in calls to recv_into") - if buffer and (nbytes is None): - nbytes = len(buffer) - elif nbytes is None: - nbytes = 1024 - return self.read(nbytes, buffer) - - def sendall(self, data, flags=0): - if flags != 0: - raise ValueError("non-zero flags not allowed in calls to sendall") - count = 0 - with memoryview(data) as view, view.cast("B") as byte_view: - amount = len(byte_view) - while count < amount: - v = self.send(byte_view[count:]) - count += v - - def send(self, data, flags=0): - if flags != 0: - raise ValueError("non-zero flags not allowed in calls to send") - response = self._ssl_io_loop(self.sslobj.write, data) - return response - - def makefile( - self, mode="r", buffering=None, encoding=None, errors=None, newline=None - ): - """ - Python's httpclient uses makefile and buffered io when reading HTTP - messages and we need to support it. - - This is unfortunately a copy and paste of socket.py makefile with small - changes to point to the socket directly. - """ - if not set(mode) <= {"r", "w", "b"}: - raise ValueError("invalid mode %r (only r, w, b allowed)" % (mode,)) - - writing = "w" in mode - reading = "r" in mode or not writing - assert reading or writing - binary = "b" in mode - rawmode = "" - if reading: - rawmode += "r" - if writing: - rawmode += "w" - raw = socket.SocketIO(self, rawmode) - self.socket._io_refs += 1 - if buffering is None: - buffering = -1 - if buffering < 0: - buffering = io.DEFAULT_BUFFER_SIZE - if buffering == 0: - if not binary: - raise ValueError("unbuffered streams must be binary") - return raw - if reading and writing: - buffer = io.BufferedRWPair(raw, raw, buffering) - elif reading: - buffer = io.BufferedReader(raw, buffering) - else: - assert writing - buffer = io.BufferedWriter(raw, buffering) - if binary: - return buffer - text = io.TextIOWrapper(buffer, encoding, errors, newline) - text.mode = mode - return text - - def unwrap(self): - self._ssl_io_loop(self.sslobj.unwrap) - - def close(self): - self.socket.close() - - def getpeercert(self, binary_form=False): - return self.sslobj.getpeercert(binary_form) - - def version(self): - return self.sslobj.version() - - def cipher(self): - return self.sslobj.cipher() - - def selected_alpn_protocol(self): - return self.sslobj.selected_alpn_protocol() - - def selected_npn_protocol(self): - return self.sslobj.selected_npn_protocol() - - def shared_ciphers(self): - return self.sslobj.shared_ciphers() - - def compression(self): - return self.sslobj.compression() - - def settimeout(self, value): - self.socket.settimeout(value) - - def gettimeout(self): - return self.socket.gettimeout() - - def _decref_socketios(self): - self.socket._decref_socketios() - - def _wrap_ssl_read(self, len, buffer=None): - try: - return self._ssl_io_loop(self.sslobj.read, len, buffer) - except ssl.SSLError as e: - if e.errno == ssl.SSL_ERROR_EOF and self.suppress_ragged_eofs: - return 0 # eof, return 0. - else: - raise - - def _ssl_io_loop(self, func, *args): - """Performs an I/O loop between incoming/outgoing and the socket.""" - should_loop = True - ret = None - - while should_loop: - errno = None - try: - ret = func(*args) - except ssl.SSLError as e: - if e.errno not in (ssl.SSL_ERROR_WANT_READ, ssl.SSL_ERROR_WANT_WRITE): - # WANT_READ, and WANT_WRITE are expected, others are not. - raise e - errno = e.errno - - buf = self.outgoing.read() - self.socket.sendall(buf) - - if errno is None: - should_loop = False - elif errno == ssl.SSL_ERROR_WANT_READ: - buf = self.socket.recv(SSL_BLOCKSIZE) - if buf: - self.incoming.write(buf) - else: - self.incoming.write_eof() - return ret diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/timeout.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/timeout.py deleted file mode 100644 index 78e18a6..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/timeout.py +++ /dev/null @@ -1,271 +0,0 @@ -from __future__ import absolute_import - -import time - -# The default socket timeout, used by httplib to indicate that no timeout was; specified by the user -from socket import _GLOBAL_DEFAULT_TIMEOUT, getdefaulttimeout - -from ..exceptions import TimeoutStateError - -# A sentinel value to indicate that no timeout was specified by the user in -# urllib3 -_Default = object() - - -# Use time.monotonic if available. -current_time = getattr(time, "monotonic", time.time) - - -class Timeout(object): - """Timeout configuration. - - Timeouts can be defined as a default for a pool: - - .. code-block:: python - - timeout = Timeout(connect=2.0, read=7.0) - http = PoolManager(timeout=timeout) - response = http.request('GET', 'http://example.com/') - - Or per-request (which overrides the default for the pool): - - .. code-block:: python - - response = http.request('GET', 'http://example.com/', timeout=Timeout(10)) - - Timeouts can be disabled by setting all the parameters to ``None``: - - .. code-block:: python - - no_timeout = Timeout(connect=None, read=None) - response = http.request('GET', 'http://example.com/, timeout=no_timeout) - - - :param total: - This combines the connect and read timeouts into one; the read timeout - will be set to the time leftover from the connect attempt. In the - event that both a connect timeout and a total are specified, or a read - timeout and a total are specified, the shorter timeout will be applied. - - Defaults to None. - - :type total: int, float, or None - - :param connect: - The maximum amount of time (in seconds) to wait for a connection - attempt to a server to succeed. Omitting the parameter will default the - connect timeout to the system default, probably `the global default - timeout in socket.py - <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_. - None will set an infinite timeout for connection attempts. - - :type connect: int, float, or None - - :param read: - The maximum amount of time (in seconds) to wait between consecutive - read operations for a response from the server. Omitting the parameter - will default the read timeout to the system default, probably `the - global default timeout in socket.py - <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_. - None will set an infinite timeout. - - :type read: int, float, or None - - .. note:: - - Many factors can affect the total amount of time for urllib3 to return - an HTTP response. - - For example, Python's DNS resolver does not obey the timeout specified - on the socket. Other factors that can affect total request time include - high CPU load, high swap, the program running at a low priority level, - or other behaviors. - - In addition, the read and total timeouts only measure the time between - read operations on the socket connecting the client and the server, - not the total amount of time for the request to return a complete - response. For most requests, the timeout is raised because the server - has not sent the first byte in the specified time. This is not always - the case; if a server streams one byte every fifteen seconds, a timeout - of 20 seconds will not trigger, even though the request will take - several minutes to complete. - - If your goal is to cut off any request after a set amount of wall clock - time, consider having a second "watcher" thread to cut off a slow - request. - """ - - #: A sentinel object representing the default timeout value - DEFAULT_TIMEOUT = _GLOBAL_DEFAULT_TIMEOUT - - def __init__(self, total=None, connect=_Default, read=_Default): - self._connect = self._validate_timeout(connect, "connect") - self._read = self._validate_timeout(read, "read") - self.total = self._validate_timeout(total, "total") - self._start_connect = None - - def __repr__(self): - return "%s(connect=%r, read=%r, total=%r)" % ( - type(self).__name__, - self._connect, - self._read, - self.total, - ) - - # __str__ provided for backwards compatibility - __str__ = __repr__ - - @classmethod - def resolve_default_timeout(cls, timeout): - return getdefaulttimeout() if timeout is cls.DEFAULT_TIMEOUT else timeout - - @classmethod - def _validate_timeout(cls, value, name): - """Check that a timeout attribute is valid. - - :param value: The timeout value to validate - :param name: The name of the timeout attribute to validate. This is - used to specify in error messages. - :return: The validated and casted version of the given value. - :raises ValueError: If it is a numeric value less than or equal to - zero, or the type is not an integer, float, or None. - """ - if value is _Default: - return cls.DEFAULT_TIMEOUT - - if value is None or value is cls.DEFAULT_TIMEOUT: - return value - - if isinstance(value, bool): - raise ValueError( - "Timeout cannot be a boolean value. It must " - "be an int, float or None." - ) - try: - float(value) - except (TypeError, ValueError): - raise ValueError( - "Timeout value %s was %s, but it must be an " - "int, float or None." % (name, value) - ) - - try: - if value <= 0: - raise ValueError( - "Attempted to set %s timeout to %s, but the " - "timeout cannot be set to a value less " - "than or equal to 0." % (name, value) - ) - except TypeError: - # Python 3 - raise ValueError( - "Timeout value %s was %s, but it must be an " - "int, float or None." % (name, value) - ) - - return value - - @classmethod - def from_float(cls, timeout): - """Create a new Timeout from a legacy timeout value. - - The timeout value used by httplib.py sets the same timeout on the - connect(), and recv() socket requests. This creates a :class:`Timeout` - object that sets the individual timeouts to the ``timeout`` value - passed to this function. - - :param timeout: The legacy timeout value. - :type timeout: integer, float, sentinel default object, or None - :return: Timeout object - :rtype: :class:`Timeout` - """ - return Timeout(read=timeout, connect=timeout) - - def clone(self): - """Create a copy of the timeout object - - Timeout properties are stored per-pool but each request needs a fresh - Timeout object to ensure each one has its own start/stop configured. - - :return: a copy of the timeout object - :rtype: :class:`Timeout` - """ - # We can't use copy.deepcopy because that will also create a new object - # for _GLOBAL_DEFAULT_TIMEOUT, which socket.py uses as a sentinel to - # detect the user default. - return Timeout(connect=self._connect, read=self._read, total=self.total) - - def start_connect(self): - """Start the timeout clock, used during a connect() attempt - - :raises urllib3.exceptions.TimeoutStateError: if you attempt - to start a timer that has been started already. - """ - if self._start_connect is not None: - raise TimeoutStateError("Timeout timer has already been started.") - self._start_connect = current_time() - return self._start_connect - - def get_connect_duration(self): - """Gets the time elapsed since the call to :meth:`start_connect`. - - :return: Elapsed time in seconds. - :rtype: float - :raises urllib3.exceptions.TimeoutStateError: if you attempt - to get duration for a timer that hasn't been started. - """ - if self._start_connect is None: - raise TimeoutStateError( - "Can't get connect duration for timer that has not started." - ) - return current_time() - self._start_connect - - @property - def connect_timeout(self): - """Get the value to use when setting a connection timeout. - - This will be a positive float or integer, the value None - (never timeout), or the default system timeout. - - :return: Connect timeout. - :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None - """ - if self.total is None: - return self._connect - - if self._connect is None or self._connect is self.DEFAULT_TIMEOUT: - return self.total - - return min(self._connect, self.total) - - @property - def read_timeout(self): - """Get the value for the read timeout. - - This assumes some time has elapsed in the connection timeout and - computes the read timeout appropriately. - - If self.total is set, the read timeout is dependent on the amount of - time taken by the connect timeout. If the connection time has not been - established, a :exc:`~urllib3.exceptions.TimeoutStateError` will be - raised. - - :return: Value to use for the read timeout. - :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None - :raises urllib3.exceptions.TimeoutStateError: If :meth:`start_connect` - has not yet been called on this object. - """ - if ( - self.total is not None - and self.total is not self.DEFAULT_TIMEOUT - and self._read is not None - and self._read is not self.DEFAULT_TIMEOUT - ): - # In case the connect timeout has not yet been established. - if self._start_connect is None: - return self._read - return max(0, min(self.total - self.get_connect_duration(), self._read)) - elif self.total is not None and self.total is not self.DEFAULT_TIMEOUT: - return max(0, self.total - self.get_connect_duration()) - else: - return self._read diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/url.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/url.py deleted file mode 100644 index a960b2f..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/url.py +++ /dev/null @@ -1,435 +0,0 @@ -from __future__ import absolute_import - -import re -from collections import namedtuple - -from ..exceptions import LocationParseError -from ..packages import six - -url_attrs = ["scheme", "auth", "host", "port", "path", "query", "fragment"] - -# We only want to normalize urls with an HTTP(S) scheme. -# urllib3 infers URLs without a scheme (None) to be http. -NORMALIZABLE_SCHEMES = ("http", "https", None) - -# Almost all of these patterns were derived from the -# 'rfc3986' module: https://github.com/python-hyper/rfc3986 -PERCENT_RE = re.compile(r"%[a-fA-F0-9]{2}") -SCHEME_RE = re.compile(r"^(?:[a-zA-Z][a-zA-Z0-9+-]*:|/)") -URI_RE = re.compile( - r"^(?:([a-zA-Z][a-zA-Z0-9+.-]*):)?" - r"(?://([^\\/?#]*))?" - r"([^?#]*)" - r"(?:\?([^#]*))?" - r"(?:#(.*))?$", - re.UNICODE | re.DOTALL, -) - -IPV4_PAT = r"(?:[0-9]{1,3}\.){3}[0-9]{1,3}" -HEX_PAT = "[0-9A-Fa-f]{1,4}" -LS32_PAT = "(?:{hex}:{hex}|{ipv4})".format(hex=HEX_PAT, ipv4=IPV4_PAT) -_subs = {"hex": HEX_PAT, "ls32": LS32_PAT} -_variations = [ - # 6( h16 ":" ) ls32 - "(?:%(hex)s:){6}%(ls32)s", - # "::" 5( h16 ":" ) ls32 - "::(?:%(hex)s:){5}%(ls32)s", - # [ h16 ] "::" 4( h16 ":" ) ls32 - "(?:%(hex)s)?::(?:%(hex)s:){4}%(ls32)s", - # [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32 - "(?:(?:%(hex)s:)?%(hex)s)?::(?:%(hex)s:){3}%(ls32)s", - # [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32 - "(?:(?:%(hex)s:){0,2}%(hex)s)?::(?:%(hex)s:){2}%(ls32)s", - # [ *3( h16 ":" ) h16 ] "::" h16 ":" ls32 - "(?:(?:%(hex)s:){0,3}%(hex)s)?::%(hex)s:%(ls32)s", - # [ *4( h16 ":" ) h16 ] "::" ls32 - "(?:(?:%(hex)s:){0,4}%(hex)s)?::%(ls32)s", - # [ *5( h16 ":" ) h16 ] "::" h16 - "(?:(?:%(hex)s:){0,5}%(hex)s)?::%(hex)s", - # [ *6( h16 ":" ) h16 ] "::" - "(?:(?:%(hex)s:){0,6}%(hex)s)?::", -] - -UNRESERVED_PAT = r"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._\-~" -IPV6_PAT = "(?:" + "|".join([x % _subs for x in _variations]) + ")" -ZONE_ID_PAT = "(?:%25|%)(?:[" + UNRESERVED_PAT + "]|%[a-fA-F0-9]{2})+" -IPV6_ADDRZ_PAT = r"\[" + IPV6_PAT + r"(?:" + ZONE_ID_PAT + r")?\]" -REG_NAME_PAT = r"(?:[^\[\]%:/?#]|%[a-fA-F0-9]{2})*" -TARGET_RE = re.compile(r"^(/[^?#]*)(?:\?([^#]*))?(?:#.*)?$") - -IPV4_RE = re.compile("^" + IPV4_PAT + "$") -IPV6_RE = re.compile("^" + IPV6_PAT + "$") -IPV6_ADDRZ_RE = re.compile("^" + IPV6_ADDRZ_PAT + "$") -BRACELESS_IPV6_ADDRZ_RE = re.compile("^" + IPV6_ADDRZ_PAT[2:-2] + "$") -ZONE_ID_RE = re.compile("(" + ZONE_ID_PAT + r")\]$") - -_HOST_PORT_PAT = ("^(%s|%s|%s)(?::0*?(|0|[1-9][0-9]{0,4}))?$") % ( - REG_NAME_PAT, - IPV4_PAT, - IPV6_ADDRZ_PAT, -) -_HOST_PORT_RE = re.compile(_HOST_PORT_PAT, re.UNICODE | re.DOTALL) - -UNRESERVED_CHARS = set( - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._-~" -) -SUB_DELIM_CHARS = set("!$&'()*+,;=") -USERINFO_CHARS = UNRESERVED_CHARS | SUB_DELIM_CHARS | {":"} -PATH_CHARS = USERINFO_CHARS | {"@", "/"} -QUERY_CHARS = FRAGMENT_CHARS = PATH_CHARS | {"?"} - - -class Url(namedtuple("Url", url_attrs)): - """ - Data structure for representing an HTTP URL. Used as a return value for - :func:`parse_url`. Both the scheme and host are normalized as they are - both case-insensitive according to RFC 3986. - """ - - __slots__ = () - - def __new__( - cls, - scheme=None, - auth=None, - host=None, - port=None, - path=None, - query=None, - fragment=None, - ): - if path and not path.startswith("/"): - path = "/" + path - if scheme is not None: - scheme = scheme.lower() - return super(Url, cls).__new__( - cls, scheme, auth, host, port, path, query, fragment - ) - - @property - def hostname(self): - """For backwards-compatibility with urlparse. We're nice like that.""" - return self.host - - @property - def request_uri(self): - """Absolute path including the query string.""" - uri = self.path or "/" - - if self.query is not None: - uri += "?" + self.query - - return uri - - @property - def netloc(self): - """Network location including host and port""" - if self.port: - return "%s:%d" % (self.host, self.port) - return self.host - - @property - def url(self): - """ - Convert self into a url - - This function should more or less round-trip with :func:`.parse_url`. The - returned url may not be exactly the same as the url inputted to - :func:`.parse_url`, but it should be equivalent by the RFC (e.g., urls - with a blank port will have : removed). - - Example: :: - - >>> U = parse_url('http://google.com/mail/') - >>> U.url - 'http://google.com/mail/' - >>> Url('http', 'username:password', 'host.com', 80, - ... '/path', 'query', 'fragment').url - 'http://username:password@host.com:80/path?query#fragment' - """ - scheme, auth, host, port, path, query, fragment = self - url = u"" - - # We use "is not None" we want things to happen with empty strings (or 0 port) - if scheme is not None: - url += scheme + u"://" - if auth is not None: - url += auth + u"@" - if host is not None: - url += host - if port is not None: - url += u":" + str(port) - if path is not None: - url += path - if query is not None: - url += u"?" + query - if fragment is not None: - url += u"#" + fragment - - return url - - def __str__(self): - return self.url - - -def split_first(s, delims): - """ - .. deprecated:: 1.25 - - Given a string and an iterable of delimiters, split on the first found - delimiter. Return two split parts and the matched delimiter. - - If not found, then the first part is the full input string. - - Example:: - - >>> split_first('foo/bar?baz', '?/=') - ('foo', 'bar?baz', '/') - >>> split_first('foo/bar?baz', '123') - ('foo/bar?baz', '', None) - - Scales linearly with number of delims. Not ideal for large number of delims. - """ - min_idx = None - min_delim = None - for d in delims: - idx = s.find(d) - if idx < 0: - continue - - if min_idx is None or idx < min_idx: - min_idx = idx - min_delim = d - - if min_idx is None or min_idx < 0: - return s, "", None - - return s[:min_idx], s[min_idx + 1 :], min_delim - - -def _encode_invalid_chars(component, allowed_chars, encoding="utf-8"): - """Percent-encodes a URI component without reapplying - onto an already percent-encoded component. - """ - if component is None: - return component - - component = six.ensure_text(component) - - # Normalize existing percent-encoded bytes. - # Try to see if the component we're encoding is already percent-encoded - # so we can skip all '%' characters but still encode all others. - component, percent_encodings = PERCENT_RE.subn( - lambda match: match.group(0).upper(), component - ) - - uri_bytes = component.encode("utf-8", "surrogatepass") - is_percent_encoded = percent_encodings == uri_bytes.count(b"%") - encoded_component = bytearray() - - for i in range(0, len(uri_bytes)): - # Will return a single character bytestring on both Python 2 & 3 - byte = uri_bytes[i : i + 1] - byte_ord = ord(byte) - if (is_percent_encoded and byte == b"%") or ( - byte_ord < 128 and byte.decode() in allowed_chars - ): - encoded_component += byte - continue - encoded_component.extend(b"%" + (hex(byte_ord)[2:].encode().zfill(2).upper())) - - return encoded_component.decode(encoding) - - -def _remove_path_dot_segments(path): - # See http://tools.ietf.org/html/rfc3986#section-5.2.4 for pseudo-code - segments = path.split("/") # Turn the path into a list of segments - output = [] # Initialize the variable to use to store output - - for segment in segments: - # '.' is the current directory, so ignore it, it is superfluous - if segment == ".": - continue - # Anything other than '..', should be appended to the output - elif segment != "..": - output.append(segment) - # In this case segment == '..', if we can, we should pop the last - # element - elif output: - output.pop() - - # If the path starts with '/' and the output is empty or the first string - # is non-empty - if path.startswith("/") and (not output or output[0]): - output.insert(0, "") - - # If the path starts with '/.' or '/..' ensure we add one more empty - # string to add a trailing '/' - if path.endswith(("/.", "/..")): - output.append("") - - return "/".join(output) - - -def _normalize_host(host, scheme): - if host: - if isinstance(host, six.binary_type): - host = six.ensure_str(host) - - if scheme in NORMALIZABLE_SCHEMES: - is_ipv6 = IPV6_ADDRZ_RE.match(host) - if is_ipv6: - # IPv6 hosts of the form 'a::b%zone' are encoded in a URL as - # such per RFC 6874: 'a::b%25zone'. Unquote the ZoneID - # separator as necessary to return a valid RFC 4007 scoped IP. - match = ZONE_ID_RE.search(host) - if match: - start, end = match.span(1) - zone_id = host[start:end] - - if zone_id.startswith("%25") and zone_id != "%25": - zone_id = zone_id[3:] - else: - zone_id = zone_id[1:] - zone_id = "%" + _encode_invalid_chars(zone_id, UNRESERVED_CHARS) - return host[:start].lower() + zone_id + host[end:] - else: - return host.lower() - elif not IPV4_RE.match(host): - return six.ensure_str( - b".".join([_idna_encode(label) for label in host.split(".")]) - ) - return host - - -def _idna_encode(name): - if name and any(ord(x) >= 128 for x in name): - try: - from pip._vendor import idna - except ImportError: - six.raise_from( - LocationParseError("Unable to parse URL without the 'idna' module"), - None, - ) - try: - return idna.encode(name.lower(), strict=True, std3_rules=True) - except idna.IDNAError: - six.raise_from( - LocationParseError(u"Name '%s' is not a valid IDNA label" % name), None - ) - return name.lower().encode("ascii") - - -def _encode_target(target): - """Percent-encodes a request target so that there are no invalid characters""" - path, query = TARGET_RE.match(target).groups() - target = _encode_invalid_chars(path, PATH_CHARS) - query = _encode_invalid_chars(query, QUERY_CHARS) - if query is not None: - target += "?" + query - return target - - -def parse_url(url): - """ - Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is - performed to parse incomplete urls. Fields not provided will be None. - This parser is RFC 3986 and RFC 6874 compliant. - - The parser logic and helper functions are based heavily on - work done in the ``rfc3986`` module. - - :param str url: URL to parse into a :class:`.Url` namedtuple. - - Partly backwards-compatible with :mod:`urlparse`. - - Example:: - - >>> parse_url('http://google.com/mail/') - Url(scheme='http', host='google.com', port=None, path='/mail/', ...) - >>> parse_url('google.com:80') - Url(scheme=None, host='google.com', port=80, path=None, ...) - >>> parse_url('/foo?bar') - Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...) - """ - if not url: - # Empty - return Url() - - source_url = url - if not SCHEME_RE.search(url): - url = "//" + url - - try: - scheme, authority, path, query, fragment = URI_RE.match(url).groups() - normalize_uri = scheme is None or scheme.lower() in NORMALIZABLE_SCHEMES - - if scheme: - scheme = scheme.lower() - - if authority: - auth, _, host_port = authority.rpartition("@") - auth = auth or None - host, port = _HOST_PORT_RE.match(host_port).groups() - if auth and normalize_uri: - auth = _encode_invalid_chars(auth, USERINFO_CHARS) - if port == "": - port = None - else: - auth, host, port = None, None, None - - if port is not None: - port = int(port) - if not (0 <= port <= 65535): - raise LocationParseError(url) - - host = _normalize_host(host, scheme) - - if normalize_uri and path: - path = _remove_path_dot_segments(path) - path = _encode_invalid_chars(path, PATH_CHARS) - if normalize_uri and query: - query = _encode_invalid_chars(query, QUERY_CHARS) - if normalize_uri and fragment: - fragment = _encode_invalid_chars(fragment, FRAGMENT_CHARS) - - except (ValueError, AttributeError): - return six.raise_from(LocationParseError(source_url), None) - - # For the sake of backwards compatibility we put empty - # string values for path if there are any defined values - # beyond the path in the URL. - # TODO: Remove this when we break backwards compatibility. - if not path: - if query is not None or fragment is not None: - path = "" - else: - path = None - - # Ensure that each part of the URL is a `str` for - # backwards compatibility. - if isinstance(url, six.text_type): - ensure_func = six.ensure_text - else: - ensure_func = six.ensure_str - - def ensure_type(x): - return x if x is None else ensure_func(x) - - return Url( - scheme=ensure_type(scheme), - auth=ensure_type(auth), - host=ensure_type(host), - port=port, - path=ensure_type(path), - query=ensure_type(query), - fragment=ensure_type(fragment), - ) - - -def get_host(url): - """ - Deprecated. Use :func:`parse_url` instead. - """ - p = parse_url(url) - return p.scheme or "http", p.hostname, p.port diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/wait.py b/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/wait.py deleted file mode 100644 index 21b4590..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/wait.py +++ /dev/null @@ -1,152 +0,0 @@ -import errno -import select -import sys -from functools import partial - -try: - from time import monotonic -except ImportError: - from time import time as monotonic - -__all__ = ["NoWayToWaitForSocketError", "wait_for_read", "wait_for_write"] - - -class NoWayToWaitForSocketError(Exception): - pass - - -# How should we wait on sockets? -# -# There are two types of APIs you can use for waiting on sockets: the fancy -# modern stateful APIs like epoll/kqueue, and the older stateless APIs like -# select/poll. The stateful APIs are more efficient when you have a lots of -# sockets to keep track of, because you can set them up once and then use them -# lots of times. But we only ever want to wait on a single socket at a time -# and don't want to keep track of state, so the stateless APIs are actually -# more efficient. So we want to use select() or poll(). -# -# Now, how do we choose between select() and poll()? On traditional Unixes, -# select() has a strange calling convention that makes it slow, or fail -# altogether, for high-numbered file descriptors. The point of poll() is to fix -# that, so on Unixes, we prefer poll(). -# -# On Windows, there is no poll() (or at least Python doesn't provide a wrapper -# for it), but that's OK, because on Windows, select() doesn't have this -# strange calling convention; plain select() works fine. -# -# So: on Windows we use select(), and everywhere else we use poll(). We also -# fall back to select() in case poll() is somehow broken or missing. - -if sys.version_info >= (3, 5): - # Modern Python, that retries syscalls by default - def _retry_on_intr(fn, timeout): - return fn(timeout) - -else: - # Old and broken Pythons. - def _retry_on_intr(fn, timeout): - if timeout is None: - deadline = float("inf") - else: - deadline = monotonic() + timeout - - while True: - try: - return fn(timeout) - # OSError for 3 <= pyver < 3.5, select.error for pyver <= 2.7 - except (OSError, select.error) as e: - # 'e.args[0]' incantation works for both OSError and select.error - if e.args[0] != errno.EINTR: - raise - else: - timeout = deadline - monotonic() - if timeout < 0: - timeout = 0 - if timeout == float("inf"): - timeout = None - continue - - -def select_wait_for_socket(sock, read=False, write=False, timeout=None): - if not read and not write: - raise RuntimeError("must specify at least one of read=True, write=True") - rcheck = [] - wcheck = [] - if read: - rcheck.append(sock) - if write: - wcheck.append(sock) - # When doing a non-blocking connect, most systems signal success by - # marking the socket writable. Windows, though, signals success by marked - # it as "exceptional". We paper over the difference by checking the write - # sockets for both conditions. (The stdlib selectors module does the same - # thing.) - fn = partial(select.select, rcheck, wcheck, wcheck) - rready, wready, xready = _retry_on_intr(fn, timeout) - return bool(rready or wready or xready) - - -def poll_wait_for_socket(sock, read=False, write=False, timeout=None): - if not read and not write: - raise RuntimeError("must specify at least one of read=True, write=True") - mask = 0 - if read: - mask |= select.POLLIN - if write: - mask |= select.POLLOUT - poll_obj = select.poll() - poll_obj.register(sock, mask) - - # For some reason, poll() takes timeout in milliseconds - def do_poll(t): - if t is not None: - t *= 1000 - return poll_obj.poll(t) - - return bool(_retry_on_intr(do_poll, timeout)) - - -def null_wait_for_socket(*args, **kwargs): - raise NoWayToWaitForSocketError("no select-equivalent available") - - -def _have_working_poll(): - # Apparently some systems have a select.poll that fails as soon as you try - # to use it, either due to strange configuration or broken monkeypatching - # from libraries like eventlet/greenlet. - try: - poll_obj = select.poll() - _retry_on_intr(poll_obj.poll, 0) - except (AttributeError, OSError): - return False - else: - return True - - -def wait_for_socket(*args, **kwargs): - # We delay choosing which implementation to use until the first time we're - # called. We could do it at import time, but then we might make the wrong - # decision if someone goes wild with monkeypatching select.poll after - # we're imported. - global wait_for_socket - if _have_working_poll(): - wait_for_socket = poll_wait_for_socket - elif hasattr(select, "select"): - wait_for_socket = select_wait_for_socket - else: # Platform-specific: Appengine. - wait_for_socket = null_wait_for_socket - return wait_for_socket(*args, **kwargs) - - -def wait_for_read(sock, timeout=None): - """Waits for reading to be available on a given socket. - Returns True if the socket is readable, or False if the timeout expired. - """ - return wait_for_socket(sock, read=True, timeout=timeout) - - -def wait_for_write(sock, timeout=None): - """Waits for writing to be available on a given socket. - Returns True if the socket is readable, or False if the timeout expired. - """ - return wait_for_socket(sock, write=True, timeout=timeout) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/vendor.txt b/venv/lib/python3.12/site-packages/pip/_vendor/vendor.txt deleted file mode 100644 index 5554c38..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/vendor.txt +++ /dev/null @@ -1,24 +0,0 @@ -CacheControl==0.13.1 # Make sure to update the license in pyproject.toml for this. -colorama==0.4.6 -distlib==0.3.8 -distro==1.8.0 -msgpack==1.0.5 -packaging==21.3 -platformdirs==3.8.1 -pyparsing==3.1.0 -pyproject-hooks==1.0.0 -requests==2.31.0 - certifi==2023.7.22 - chardet==5.1.0 - idna==3.4 - urllib3==1.26.17 -rich==13.4.2 - pygments==2.15.1 - typing_extensions==4.7.1 -resolvelib==1.0.1 -setuptools==68.0.0 -six==1.16.0 -tenacity==8.2.2 -tomli==2.0.1 -truststore==0.8.0 -webencodings==0.5.1 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__init__.py b/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__init__.py deleted file mode 100644 index d21d697..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__init__.py +++ /dev/null @@ -1,342 +0,0 @@ -# coding: utf-8 -""" - - webencodings - ~~~~~~~~~~~~ - - This is a Python implementation of the `WHATWG Encoding standard - <http://encoding.spec.whatwg.org/>`. See README for details. - - :copyright: Copyright 2012 by Simon Sapin - :license: BSD, see LICENSE for details. - -""" - -from __future__ import unicode_literals - -import codecs - -from .labels import LABELS - - -VERSION = '0.5.1' - - -# Some names in Encoding are not valid Python aliases. Remap these. -PYTHON_NAMES = { - 'iso-8859-8-i': 'iso-8859-8', - 'x-mac-cyrillic': 'mac-cyrillic', - 'macintosh': 'mac-roman', - 'windows-874': 'cp874'} - -CACHE = {} - - -def ascii_lower(string): - r"""Transform (only) ASCII letters to lower case: A-Z is mapped to a-z. - - :param string: An Unicode string. - :returns: A new Unicode string. - - This is used for `ASCII case-insensitive - <http://encoding.spec.whatwg.org/#ascii-case-insensitive>`_ - matching of encoding labels. - The same matching is also used, among other things, - for `CSS keywords <http://dev.w3.org/csswg/css-values/#keywords>`_. - - This is different from the :meth:`~py:str.lower` method of Unicode strings - which also affect non-ASCII characters, - sometimes mapping them into the ASCII range: - - >>> keyword = u'Bac\N{KELVIN SIGN}ground' - >>> assert keyword.lower() == u'background' - >>> assert ascii_lower(keyword) != keyword.lower() - >>> assert ascii_lower(keyword) == u'bac\N{KELVIN SIGN}ground' - - """ - # This turns out to be faster than unicode.translate() - return string.encode('utf8').lower().decode('utf8') - - -def lookup(label): - """ - Look for an encoding by its label. - This is the spec’s `get an encoding - <http://encoding.spec.whatwg.org/#concept-encoding-get>`_ algorithm. - Supported labels are listed there. - - :param label: A string. - :returns: - An :class:`Encoding` object, or :obj:`None` for an unknown label. - - """ - # Only strip ASCII whitespace: U+0009, U+000A, U+000C, U+000D, and U+0020. - label = ascii_lower(label.strip('\t\n\f\r ')) - name = LABELS.get(label) - if name is None: - return None - encoding = CACHE.get(name) - if encoding is None: - if name == 'x-user-defined': - from .x_user_defined import codec_info - else: - python_name = PYTHON_NAMES.get(name, name) - # Any python_name value that gets to here should be valid. - codec_info = codecs.lookup(python_name) - encoding = Encoding(name, codec_info) - CACHE[name] = encoding - return encoding - - -def _get_encoding(encoding_or_label): - """ - Accept either an encoding object or label. - - :param encoding: An :class:`Encoding` object or a label string. - :returns: An :class:`Encoding` object. - :raises: :exc:`~exceptions.LookupError` for an unknown label. - - """ - if hasattr(encoding_or_label, 'codec_info'): - return encoding_or_label - - encoding = lookup(encoding_or_label) - if encoding is None: - raise LookupError('Unknown encoding label: %r' % encoding_or_label) - return encoding - - -class Encoding(object): - """Reresents a character encoding such as UTF-8, - that can be used for decoding or encoding. - - .. attribute:: name - - Canonical name of the encoding - - .. attribute:: codec_info - - The actual implementation of the encoding, - a stdlib :class:`~codecs.CodecInfo` object. - See :func:`codecs.register`. - - """ - def __init__(self, name, codec_info): - self.name = name - self.codec_info = codec_info - - def __repr__(self): - return '<Encoding %s>' % self.name - - -#: The UTF-8 encoding. Should be used for new content and formats. -UTF8 = lookup('utf-8') - -_UTF16LE = lookup('utf-16le') -_UTF16BE = lookup('utf-16be') - - -def decode(input, fallback_encoding, errors='replace'): - """ - Decode a single string. - - :param input: A byte string - :param fallback_encoding: - An :class:`Encoding` object or a label string. - The encoding to use if :obj:`input` does note have a BOM. - :param errors: Type of error handling. See :func:`codecs.register`. - :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. - :return: - A ``(output, encoding)`` tuple of an Unicode string - and an :obj:`Encoding`. - - """ - # Fail early if `encoding` is an invalid label. - fallback_encoding = _get_encoding(fallback_encoding) - bom_encoding, input = _detect_bom(input) - encoding = bom_encoding or fallback_encoding - return encoding.codec_info.decode(input, errors)[0], encoding - - -def _detect_bom(input): - """Return (bom_encoding, input), with any BOM removed from the input.""" - if input.startswith(b'\xFF\xFE'): - return _UTF16LE, input[2:] - if input.startswith(b'\xFE\xFF'): - return _UTF16BE, input[2:] - if input.startswith(b'\xEF\xBB\xBF'): - return UTF8, input[3:] - return None, input - - -def encode(input, encoding=UTF8, errors='strict'): - """ - Encode a single string. - - :param input: An Unicode string. - :param encoding: An :class:`Encoding` object or a label string. - :param errors: Type of error handling. See :func:`codecs.register`. - :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. - :return: A byte string. - - """ - return _get_encoding(encoding).codec_info.encode(input, errors)[0] - - -def iter_decode(input, fallback_encoding, errors='replace'): - """ - "Pull"-based decoder. - - :param input: - An iterable of byte strings. - - The input is first consumed just enough to determine the encoding - based on the precense of a BOM, - then consumed on demand when the return value is. - :param fallback_encoding: - An :class:`Encoding` object or a label string. - The encoding to use if :obj:`input` does note have a BOM. - :param errors: Type of error handling. See :func:`codecs.register`. - :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. - :returns: - An ``(output, encoding)`` tuple. - :obj:`output` is an iterable of Unicode strings, - :obj:`encoding` is the :obj:`Encoding` that is being used. - - """ - - decoder = IncrementalDecoder(fallback_encoding, errors) - generator = _iter_decode_generator(input, decoder) - encoding = next(generator) - return generator, encoding - - -def _iter_decode_generator(input, decoder): - """Return a generator that first yields the :obj:`Encoding`, - then yields output chukns as Unicode strings. - - """ - decode = decoder.decode - input = iter(input) - for chunck in input: - output = decode(chunck) - if output: - assert decoder.encoding is not None - yield decoder.encoding - yield output - break - else: - # Input exhausted without determining the encoding - output = decode(b'', final=True) - assert decoder.encoding is not None - yield decoder.encoding - if output: - yield output - return - - for chunck in input: - output = decode(chunck) - if output: - yield output - output = decode(b'', final=True) - if output: - yield output - - -def iter_encode(input, encoding=UTF8, errors='strict'): - """ - “Pull”-based encoder. - - :param input: An iterable of Unicode strings. - :param encoding: An :class:`Encoding` object or a label string. - :param errors: Type of error handling. See :func:`codecs.register`. - :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. - :returns: An iterable of byte strings. - - """ - # Fail early if `encoding` is an invalid label. - encode = IncrementalEncoder(encoding, errors).encode - return _iter_encode_generator(input, encode) - - -def _iter_encode_generator(input, encode): - for chunck in input: - output = encode(chunck) - if output: - yield output - output = encode('', final=True) - if output: - yield output - - -class IncrementalDecoder(object): - """ - “Push”-based decoder. - - :param fallback_encoding: - An :class:`Encoding` object or a label string. - The encoding to use if :obj:`input` does note have a BOM. - :param errors: Type of error handling. See :func:`codecs.register`. - :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. - - """ - def __init__(self, fallback_encoding, errors='replace'): - # Fail early if `encoding` is an invalid label. - self._fallback_encoding = _get_encoding(fallback_encoding) - self._errors = errors - self._buffer = b'' - self._decoder = None - #: The actual :class:`Encoding` that is being used, - #: or :obj:`None` if that is not determined yet. - #: (Ie. if there is not enough input yet to determine - #: if there is a BOM.) - self.encoding = None # Not known yet. - - def decode(self, input, final=False): - """Decode one chunk of the input. - - :param input: A byte string. - :param final: - Indicate that no more input is available. - Must be :obj:`True` if this is the last call. - :returns: An Unicode string. - - """ - decoder = self._decoder - if decoder is not None: - return decoder(input, final) - - input = self._buffer + input - encoding, input = _detect_bom(input) - if encoding is None: - if len(input) < 3 and not final: # Not enough data yet. - self._buffer = input - return '' - else: # No BOM - encoding = self._fallback_encoding - decoder = encoding.codec_info.incrementaldecoder(self._errors).decode - self._decoder = decoder - self.encoding = encoding - return decoder(input, final) - - -class IncrementalEncoder(object): - """ - “Push”-based encoder. - - :param encoding: An :class:`Encoding` object or a label string. - :param errors: Type of error handling. See :func:`codecs.register`. - :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. - - .. method:: encode(input, final=False) - - :param input: An Unicode string. - :param final: - Indicate that no more input is available. - Must be :obj:`True` if this is the last call. - :returns: A byte string. - - """ - def __init__(self, encoding=UTF8, errors='strict'): - encoding = _get_encoding(encoding) - self.encode = encoding.codec_info.incrementalencoder(errors).encode diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 9b398e1c4d2595ada79a8c9a483bafd1f3e5dd5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12023 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 B{89h_ diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-312.pyc deleted file mode 100644 index 63474f8ea8dda214f97aca3b1af068047b3c8461..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7154 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 R?Qi#Ln&KXH<xPC={~v-ye&YZD diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-312.pyc deleted file mode 100644 index 12fd1c497ea22520ecdfd12f19cadfdb6b952196..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2721 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 J_%%+6{{VDYm)`&Y diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-312.pyc deleted file mode 100644 index 0d540e34373a56d869fb00ec80c339100edec42c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9273 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 CE!T<w diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-312.pyc b/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-312.pyc deleted file mode 100644 index 72482e3650d6571d620d0d430012edc7d12b8714..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3317 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 K<xpG(_CEoBrFA+0 diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/labels.py b/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/labels.py deleted file mode 100644 index 29cbf91..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/labels.py +++ /dev/null @@ -1,231 +0,0 @@ -""" - - webencodings.labels - ~~~~~~~~~~~~~~~~~~~ - - Map encoding labels to their name. - - :copyright: Copyright 2012 by Simon Sapin - :license: BSD, see LICENSE for details. - -""" - -# XXX Do not edit! -# This file is automatically generated by mklabels.py - -LABELS = { - 'unicode-1-1-utf-8': 'utf-8', - 'utf-8': 'utf-8', - 'utf8': 'utf-8', - '866': 'ibm866', - 'cp866': 'ibm866', - 'csibm866': 'ibm866', - 'ibm866': 'ibm866', - 'csisolatin2': 'iso-8859-2', - 'iso-8859-2': 'iso-8859-2', - 'iso-ir-101': 'iso-8859-2', - 'iso8859-2': 'iso-8859-2', - 'iso88592': 'iso-8859-2', - 'iso_8859-2': 'iso-8859-2', - 'iso_8859-2:1987': 'iso-8859-2', - 'l2': 'iso-8859-2', - 'latin2': 'iso-8859-2', - 'csisolatin3': 'iso-8859-3', - 'iso-8859-3': 'iso-8859-3', - 'iso-ir-109': 'iso-8859-3', - 'iso8859-3': 'iso-8859-3', - 'iso88593': 'iso-8859-3', - 'iso_8859-3': 'iso-8859-3', - 'iso_8859-3:1988': 'iso-8859-3', - 'l3': 'iso-8859-3', - 'latin3': 'iso-8859-3', - 'csisolatin4': 'iso-8859-4', - 'iso-8859-4': 'iso-8859-4', - 'iso-ir-110': 'iso-8859-4', - 'iso8859-4': 'iso-8859-4', - 'iso88594': 'iso-8859-4', - 'iso_8859-4': 'iso-8859-4', - 'iso_8859-4:1988': 'iso-8859-4', - 'l4': 'iso-8859-4', - 'latin4': 'iso-8859-4', - 'csisolatincyrillic': 'iso-8859-5', - 'cyrillic': 'iso-8859-5', - 'iso-8859-5': 'iso-8859-5', - 'iso-ir-144': 'iso-8859-5', - 'iso8859-5': 'iso-8859-5', - 'iso88595': 'iso-8859-5', - 'iso_8859-5': 'iso-8859-5', - 'iso_8859-5:1988': 'iso-8859-5', - 'arabic': 'iso-8859-6', - 'asmo-708': 'iso-8859-6', - 'csiso88596e': 'iso-8859-6', - 'csiso88596i': 'iso-8859-6', - 'csisolatinarabic': 'iso-8859-6', - 'ecma-114': 'iso-8859-6', - 'iso-8859-6': 'iso-8859-6', - 'iso-8859-6-e': 'iso-8859-6', - 'iso-8859-6-i': 'iso-8859-6', - 'iso-ir-127': 'iso-8859-6', - 'iso8859-6': 'iso-8859-6', - 'iso88596': 'iso-8859-6', - 'iso_8859-6': 'iso-8859-6', - 'iso_8859-6:1987': 'iso-8859-6', - 'csisolatingreek': 'iso-8859-7', - 'ecma-118': 'iso-8859-7', - 'elot_928': 'iso-8859-7', - 'greek': 'iso-8859-7', - 'greek8': 'iso-8859-7', - 'iso-8859-7': 'iso-8859-7', - 'iso-ir-126': 'iso-8859-7', - 'iso8859-7': 'iso-8859-7', - 'iso88597': 'iso-8859-7', - 'iso_8859-7': 'iso-8859-7', - 'iso_8859-7:1987': 'iso-8859-7', - 'sun_eu_greek': 'iso-8859-7', - 'csiso88598e': 'iso-8859-8', - 'csisolatinhebrew': 'iso-8859-8', - 'hebrew': 'iso-8859-8', - 'iso-8859-8': 'iso-8859-8', - 'iso-8859-8-e': 'iso-8859-8', - 'iso-ir-138': 'iso-8859-8', - 'iso8859-8': 'iso-8859-8', - 'iso88598': 'iso-8859-8', - 'iso_8859-8': 'iso-8859-8', - 'iso_8859-8:1988': 'iso-8859-8', - 'visual': 'iso-8859-8', - 'csiso88598i': 'iso-8859-8-i', - 'iso-8859-8-i': 'iso-8859-8-i', - 'logical': 'iso-8859-8-i', - 'csisolatin6': 'iso-8859-10', - 'iso-8859-10': 'iso-8859-10', - 'iso-ir-157': 'iso-8859-10', - 'iso8859-10': 'iso-8859-10', - 'iso885910': 'iso-8859-10', - 'l6': 'iso-8859-10', - 'latin6': 'iso-8859-10', - 'iso-8859-13': 'iso-8859-13', - 'iso8859-13': 'iso-8859-13', - 'iso885913': 'iso-8859-13', - 'iso-8859-14': 'iso-8859-14', - 'iso8859-14': 'iso-8859-14', - 'iso885914': 'iso-8859-14', - 'csisolatin9': 'iso-8859-15', - 'iso-8859-15': 'iso-8859-15', - 'iso8859-15': 'iso-8859-15', - 'iso885915': 'iso-8859-15', - 'iso_8859-15': 'iso-8859-15', - 'l9': 'iso-8859-15', - 'iso-8859-16': 'iso-8859-16', - 'cskoi8r': 'koi8-r', - 'koi': 'koi8-r', - 'koi8': 'koi8-r', - 'koi8-r': 'koi8-r', - 'koi8_r': 'koi8-r', - 'koi8-u': 'koi8-u', - 'csmacintosh': 'macintosh', - 'mac': 'macintosh', - 'macintosh': 'macintosh', - 'x-mac-roman': 'macintosh', - 'dos-874': 'windows-874', - 'iso-8859-11': 'windows-874', - 'iso8859-11': 'windows-874', - 'iso885911': 'windows-874', - 'tis-620': 'windows-874', - 'windows-874': 'windows-874', - 'cp1250': 'windows-1250', - 'windows-1250': 'windows-1250', - 'x-cp1250': 'windows-1250', - 'cp1251': 'windows-1251', - 'windows-1251': 'windows-1251', - 'x-cp1251': 'windows-1251', - 'ansi_x3.4-1968': 'windows-1252', - 'ascii': 'windows-1252', - 'cp1252': 'windows-1252', - 'cp819': 'windows-1252', - 'csisolatin1': 'windows-1252', - 'ibm819': 'windows-1252', - 'iso-8859-1': 'windows-1252', - 'iso-ir-100': 'windows-1252', - 'iso8859-1': 'windows-1252', - 'iso88591': 'windows-1252', - 'iso_8859-1': 'windows-1252', - 'iso_8859-1:1987': 'windows-1252', - 'l1': 'windows-1252', - 'latin1': 'windows-1252', - 'us-ascii': 'windows-1252', - 'windows-1252': 'windows-1252', - 'x-cp1252': 'windows-1252', - 'cp1253': 'windows-1253', - 'windows-1253': 'windows-1253', - 'x-cp1253': 'windows-1253', - 'cp1254': 'windows-1254', - 'csisolatin5': 'windows-1254', - 'iso-8859-9': 'windows-1254', - 'iso-ir-148': 'windows-1254', - 'iso8859-9': 'windows-1254', - 'iso88599': 'windows-1254', - 'iso_8859-9': 'windows-1254', - 'iso_8859-9:1989': 'windows-1254', - 'l5': 'windows-1254', - 'latin5': 'windows-1254', - 'windows-1254': 'windows-1254', - 'x-cp1254': 'windows-1254', - 'cp1255': 'windows-1255', - 'windows-1255': 'windows-1255', - 'x-cp1255': 'windows-1255', - 'cp1256': 'windows-1256', - 'windows-1256': 'windows-1256', - 'x-cp1256': 'windows-1256', - 'cp1257': 'windows-1257', - 'windows-1257': 'windows-1257', - 'x-cp1257': 'windows-1257', - 'cp1258': 'windows-1258', - 'windows-1258': 'windows-1258', - 'x-cp1258': 'windows-1258', - 'x-mac-cyrillic': 'x-mac-cyrillic', - 'x-mac-ukrainian': 'x-mac-cyrillic', - 'chinese': 'gbk', - 'csgb2312': 'gbk', - 'csiso58gb231280': 'gbk', - 'gb2312': 'gbk', - 'gb_2312': 'gbk', - 'gb_2312-80': 'gbk', - 'gbk': 'gbk', - 'iso-ir-58': 'gbk', - 'x-gbk': 'gbk', - 'gb18030': 'gb18030', - 'hz-gb-2312': 'hz-gb-2312', - 'big5': 'big5', - 'big5-hkscs': 'big5', - 'cn-big5': 'big5', - 'csbig5': 'big5', - 'x-x-big5': 'big5', - 'cseucpkdfmtjapanese': 'euc-jp', - 'euc-jp': 'euc-jp', - 'x-euc-jp': 'euc-jp', - 'csiso2022jp': 'iso-2022-jp', - 'iso-2022-jp': 'iso-2022-jp', - 'csshiftjis': 'shift_jis', - 'ms_kanji': 'shift_jis', - 'shift-jis': 'shift_jis', - 'shift_jis': 'shift_jis', - 'sjis': 'shift_jis', - 'windows-31j': 'shift_jis', - 'x-sjis': 'shift_jis', - 'cseuckr': 'euc-kr', - 'csksc56011987': 'euc-kr', - 'euc-kr': 'euc-kr', - 'iso-ir-149': 'euc-kr', - 'korean': 'euc-kr', - 'ks_c_5601-1987': 'euc-kr', - 'ks_c_5601-1989': 'euc-kr', - 'ksc5601': 'euc-kr', - 'ksc_5601': 'euc-kr', - 'windows-949': 'euc-kr', - 'csiso2022kr': 'iso-2022-kr', - 'iso-2022-kr': 'iso-2022-kr', - 'utf-16be': 'utf-16be', - 'utf-16': 'utf-16le', - 'utf-16le': 'utf-16le', - 'x-user-defined': 'x-user-defined', -} diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/mklabels.py b/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/mklabels.py deleted file mode 100644 index 295dc92..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/mklabels.py +++ /dev/null @@ -1,59 +0,0 @@ -""" - - webencodings.mklabels - ~~~~~~~~~~~~~~~~~~~~~ - - Regenarate the webencodings.labels module. - - :copyright: Copyright 2012 by Simon Sapin - :license: BSD, see LICENSE for details. - -""" - -import json -try: - from urllib import urlopen -except ImportError: - from urllib.request import urlopen - - -def assert_lower(string): - assert string == string.lower() - return string - - -def generate(url): - parts = ['''\ -""" - - webencodings.labels - ~~~~~~~~~~~~~~~~~~~ - - Map encoding labels to their name. - - :copyright: Copyright 2012 by Simon Sapin - :license: BSD, see LICENSE for details. - -""" - -# XXX Do not edit! -# This file is automatically generated by mklabels.py - -LABELS = { -'''] - labels = [ - (repr(assert_lower(label)).lstrip('u'), - repr(encoding['name']).lstrip('u')) - for category in json.loads(urlopen(url).read().decode('ascii')) - for encoding in category['encodings'] - for label in encoding['labels']] - max_len = max(len(label) for label, name in labels) - parts.extend( - ' %s:%s %s,\n' % (label, ' ' * (max_len - len(label)), name) - for label, name in labels) - parts.append('}') - return ''.join(parts) - - -if __name__ == '__main__': - print(generate('http://encoding.spec.whatwg.org/encodings.json')) diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py b/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py deleted file mode 100644 index e12c10d..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py +++ /dev/null @@ -1,153 +0,0 @@ -# coding: utf-8 -""" - - webencodings.tests - ~~~~~~~~~~~~~~~~~~ - - A basic test suite for Encoding. - - :copyright: Copyright 2012 by Simon Sapin - :license: BSD, see LICENSE for details. - -""" - -from __future__ import unicode_literals - -from . import (lookup, LABELS, decode, encode, iter_decode, iter_encode, - IncrementalDecoder, IncrementalEncoder, UTF8) - - -def assert_raises(exception, function, *args, **kwargs): - try: - function(*args, **kwargs) - except exception: - return - else: # pragma: no cover - raise AssertionError('Did not raise %s.' % exception) - - -def test_labels(): - assert lookup('utf-8').name == 'utf-8' - assert lookup('Utf-8').name == 'utf-8' - assert lookup('UTF-8').name == 'utf-8' - assert lookup('utf8').name == 'utf-8' - assert lookup('utf8').name == 'utf-8' - assert lookup('utf8 ').name == 'utf-8' - assert lookup(' \r\nutf8\t').name == 'utf-8' - assert lookup('u8') is None # Python label. - assert lookup('utf-8 ') is None # Non-ASCII white space. - - assert lookup('US-ASCII').name == 'windows-1252' - assert lookup('iso-8859-1').name == 'windows-1252' - assert lookup('latin1').name == 'windows-1252' - assert lookup('LATIN1').name == 'windows-1252' - assert lookup('latin-1') is None - assert lookup('LATİN1') is None # ASCII-only case insensitivity. - - -def test_all_labels(): - for label in LABELS: - assert decode(b'', label) == ('', lookup(label)) - assert encode('', label) == b'' - for repeat in [0, 1, 12]: - output, _ = iter_decode([b''] * repeat, label) - assert list(output) == [] - assert list(iter_encode([''] * repeat, label)) == [] - decoder = IncrementalDecoder(label) - assert decoder.decode(b'') == '' - assert decoder.decode(b'', final=True) == '' - encoder = IncrementalEncoder(label) - assert encoder.encode('') == b'' - assert encoder.encode('', final=True) == b'' - # All encoding names are valid labels too: - for name in set(LABELS.values()): - assert lookup(name).name == name - - -def test_invalid_label(): - assert_raises(LookupError, decode, b'\xEF\xBB\xBF\xc3\xa9', 'invalid') - assert_raises(LookupError, encode, 'é', 'invalid') - assert_raises(LookupError, iter_decode, [], 'invalid') - assert_raises(LookupError, iter_encode, [], 'invalid') - assert_raises(LookupError, IncrementalDecoder, 'invalid') - assert_raises(LookupError, IncrementalEncoder, 'invalid') - - -def test_decode(): - assert decode(b'\x80', 'latin1') == ('€', lookup('latin1')) - assert decode(b'\x80', lookup('latin1')) == ('€', lookup('latin1')) - assert decode(b'\xc3\xa9', 'utf8') == ('é', lookup('utf8')) - assert decode(b'\xc3\xa9', UTF8) == ('é', lookup('utf8')) - assert decode(b'\xc3\xa9', 'ascii') == ('é', lookup('ascii')) - assert decode(b'\xEF\xBB\xBF\xc3\xa9', 'ascii') == ('é', lookup('utf8')) # UTF-8 with BOM - - assert decode(b'\xFE\xFF\x00\xe9', 'ascii') == ('é', lookup('utf-16be')) # UTF-16-BE with BOM - assert decode(b'\xFF\xFE\xe9\x00', 'ascii') == ('é', lookup('utf-16le')) # UTF-16-LE with BOM - assert decode(b'\xFE\xFF\xe9\x00', 'ascii') == ('\ue900', lookup('utf-16be')) - assert decode(b'\xFF\xFE\x00\xe9', 'ascii') == ('\ue900', lookup('utf-16le')) - - assert decode(b'\x00\xe9', 'UTF-16BE') == ('é', lookup('utf-16be')) - assert decode(b'\xe9\x00', 'UTF-16LE') == ('é', lookup('utf-16le')) - assert decode(b'\xe9\x00', 'UTF-16') == ('é', lookup('utf-16le')) - - assert decode(b'\xe9\x00', 'UTF-16BE') == ('\ue900', lookup('utf-16be')) - assert decode(b'\x00\xe9', 'UTF-16LE') == ('\ue900', lookup('utf-16le')) - assert decode(b'\x00\xe9', 'UTF-16') == ('\ue900', lookup('utf-16le')) - - -def test_encode(): - assert encode('é', 'latin1') == b'\xe9' - assert encode('é', 'utf8') == b'\xc3\xa9' - assert encode('é', 'utf8') == b'\xc3\xa9' - assert encode('é', 'utf-16') == b'\xe9\x00' - assert encode('é', 'utf-16le') == b'\xe9\x00' - assert encode('é', 'utf-16be') == b'\x00\xe9' - - -def test_iter_decode(): - def iter_decode_to_string(input, fallback_encoding): - output, _encoding = iter_decode(input, fallback_encoding) - return ''.join(output) - assert iter_decode_to_string([], 'latin1') == '' - assert iter_decode_to_string([b''], 'latin1') == '' - assert iter_decode_to_string([b'\xe9'], 'latin1') == 'é' - assert iter_decode_to_string([b'hello'], 'latin1') == 'hello' - assert iter_decode_to_string([b'he', b'llo'], 'latin1') == 'hello' - assert iter_decode_to_string([b'hell', b'o'], 'latin1') == 'hello' - assert iter_decode_to_string([b'\xc3\xa9'], 'latin1') == 'é' - assert iter_decode_to_string([b'\xEF\xBB\xBF\xc3\xa9'], 'latin1') == 'é' - assert iter_decode_to_string([ - b'\xEF\xBB\xBF', b'\xc3', b'\xa9'], 'latin1') == 'é' - assert iter_decode_to_string([ - b'\xEF\xBB\xBF', b'a', b'\xc3'], 'latin1') == 'a\uFFFD' - assert iter_decode_to_string([ - b'', b'\xEF', b'', b'', b'\xBB\xBF\xc3', b'\xa9'], 'latin1') == 'é' - assert iter_decode_to_string([b'\xEF\xBB\xBF'], 'latin1') == '' - assert iter_decode_to_string([b'\xEF\xBB'], 'latin1') == 'ï»' - assert iter_decode_to_string([b'\xFE\xFF\x00\xe9'], 'latin1') == 'é' - assert iter_decode_to_string([b'\xFF\xFE\xe9\x00'], 'latin1') == 'é' - assert iter_decode_to_string([ - b'', b'\xFF', b'', b'', b'\xFE\xe9', b'\x00'], 'latin1') == 'é' - assert iter_decode_to_string([ - b'', b'h\xe9', b'llo'], 'x-user-defined') == 'h\uF7E9llo' - - -def test_iter_encode(): - assert b''.join(iter_encode([], 'latin1')) == b'' - assert b''.join(iter_encode([''], 'latin1')) == b'' - assert b''.join(iter_encode(['é'], 'latin1')) == b'\xe9' - assert b''.join(iter_encode(['', 'é', '', ''], 'latin1')) == b'\xe9' - assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16')) == b'\xe9\x00' - assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16le')) == b'\xe9\x00' - assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16be')) == b'\x00\xe9' - assert b''.join(iter_encode([ - '', 'h\uF7E9', '', 'llo'], 'x-user-defined')) == b'h\xe9llo' - - -def test_x_user_defined(): - encoded = b'2,\x0c\x0b\x1aO\xd9#\xcb\x0f\xc9\xbbt\xcf\xa8\xca' - decoded = '2,\x0c\x0b\x1aO\uf7d9#\uf7cb\x0f\uf7c9\uf7bbt\uf7cf\uf7a8\uf7ca' - encoded = b'aa' - decoded = 'aa' - assert decode(encoded, 'x-user-defined') == (decoded, lookup('x-user-defined')) - assert encode(decoded, 'x-user-defined') == encoded diff --git a/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/x_user_defined.py b/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/x_user_defined.py deleted file mode 100644 index d16e326..0000000 --- a/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/x_user_defined.py +++ /dev/null @@ -1,325 +0,0 @@ -# coding: utf-8 -""" - - webencodings.x_user_defined - ~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - An implementation of the x-user-defined encoding. - - :copyright: Copyright 2012 by Simon Sapin - :license: BSD, see LICENSE for details. - -""" - -from __future__ import unicode_literals - -import codecs - - -### Codec APIs - -class Codec(codecs.Codec): - - def encode(self, input, errors='strict'): - return codecs.charmap_encode(input, errors, encoding_table) - - def decode(self, input, errors='strict'): - return codecs.charmap_decode(input, errors, decoding_table) - - -class IncrementalEncoder(codecs.IncrementalEncoder): - def encode(self, input, final=False): - return codecs.charmap_encode(input, self.errors, encoding_table)[0] - - -class IncrementalDecoder(codecs.IncrementalDecoder): - def decode(self, input, final=False): - return codecs.charmap_decode(input, self.errors, decoding_table)[0] - - -class StreamWriter(Codec, codecs.StreamWriter): - pass - - -class StreamReader(Codec, codecs.StreamReader): - pass - - -### encodings module API - -codec_info = codecs.CodecInfo( - name='x-user-defined', - encode=Codec().encode, - decode=Codec().decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamreader=StreamReader, - streamwriter=StreamWriter, -) - - -### Decoding Table - -# Python 3: -# for c in range(256): print(' %r' % chr(c if c < 128 else c + 0xF700)) -decoding_table = ( - '\x00' - '\x01' - '\x02' - '\x03' - '\x04' - '\x05' - '\x06' - '\x07' - '\x08' - '\t' - '\n' - '\x0b' - '\x0c' - '\r' - '\x0e' - '\x0f' - '\x10' - '\x11' - '\x12' - '\x13' - '\x14' - '\x15' - '\x16' - '\x17' - '\x18' - '\x19' - '\x1a' - '\x1b' - '\x1c' - '\x1d' - '\x1e' - '\x1f' - ' ' - '!' - '"' - '#' - '$' - '%' - '&' - "'" - '(' - ')' - '*' - '+' - ',' - '-' - '.' - '/' - '0' - '1' - '2' - '3' - '4' - '5' - '6' - '7' - '8' - '9' - ':' - ';' - '<' - '=' - '>' - '?' - '@' - 'A' - 'B' - 'C' - 'D' - 'E' - 'F' - 'G' - 'H' - 'I' - 'J' - 'K' - 'L' - 'M' - 'N' - 'O' - 'P' - 'Q' - 'R' - 'S' - 'T' - 'U' - 'V' - 'W' - 'X' - 'Y' - 'Z' - '[' - '\\' - ']' - '^' - '_' - '`' - 'a' - 'b' - 'c' - 'd' - 'e' - 'f' - 'g' - 'h' - 'i' - 'j' - 'k' - 'l' - 'm' - 'n' - 'o' - 'p' - 'q' - 'r' - 's' - 't' - 'u' - 'v' - 'w' - 'x' - 'y' - 'z' - '{' - '|' - '}' - '~' - '\x7f' - '\uf780' - '\uf781' - '\uf782' - '\uf783' - '\uf784' - '\uf785' - '\uf786' - '\uf787' - '\uf788' - '\uf789' - '\uf78a' - '\uf78b' - '\uf78c' - '\uf78d' - '\uf78e' - '\uf78f' - '\uf790' - '\uf791' - '\uf792' - '\uf793' - '\uf794' - '\uf795' - '\uf796' - '\uf797' - '\uf798' - '\uf799' - '\uf79a' - '\uf79b' - '\uf79c' - '\uf79d' - '\uf79e' - '\uf79f' - '\uf7a0' - '\uf7a1' - '\uf7a2' - '\uf7a3' - '\uf7a4' - '\uf7a5' - '\uf7a6' - '\uf7a7' - '\uf7a8' - '\uf7a9' - '\uf7aa' - '\uf7ab' - '\uf7ac' - '\uf7ad' - '\uf7ae' - '\uf7af' - '\uf7b0' - '\uf7b1' - '\uf7b2' - '\uf7b3' - '\uf7b4' - '\uf7b5' - '\uf7b6' - '\uf7b7' - '\uf7b8' - '\uf7b9' - '\uf7ba' - '\uf7bb' - '\uf7bc' - '\uf7bd' - '\uf7be' - '\uf7bf' - '\uf7c0' - '\uf7c1' - '\uf7c2' - '\uf7c3' - '\uf7c4' - '\uf7c5' - '\uf7c6' - '\uf7c7' - '\uf7c8' - '\uf7c9' - '\uf7ca' - '\uf7cb' - '\uf7cc' - '\uf7cd' - '\uf7ce' - '\uf7cf' - '\uf7d0' - '\uf7d1' - '\uf7d2' - '\uf7d3' - '\uf7d4' - '\uf7d5' - '\uf7d6' - '\uf7d7' - '\uf7d8' - '\uf7d9' - '\uf7da' - '\uf7db' - '\uf7dc' - '\uf7dd' - '\uf7de' - '\uf7df' - '\uf7e0' - '\uf7e1' - '\uf7e2' - '\uf7e3' - '\uf7e4' - '\uf7e5' - '\uf7e6' - '\uf7e7' - '\uf7e8' - '\uf7e9' - '\uf7ea' - '\uf7eb' - '\uf7ec' - '\uf7ed' - '\uf7ee' - '\uf7ef' - '\uf7f0' - '\uf7f1' - '\uf7f2' - '\uf7f3' - '\uf7f4' - '\uf7f5' - '\uf7f6' - '\uf7f7' - '\uf7f8' - '\uf7f9' - '\uf7fa' - '\uf7fb' - '\uf7fc' - '\uf7fd' - '\uf7fe' - '\uf7ff' -) - -### Encoding table -encoding_table = codecs.charmap_build(decoding_table) diff --git a/venv/lib/python3.12/site-packages/pip/py.typed b/venv/lib/python3.12/site-packages/pip/py.typed deleted file mode 100644 index 493b53e..0000000 --- a/venv/lib/python3.12/site-packages/pip/py.typed +++ /dev/null @@ -1,4 +0,0 @@ -pip is a command line program. While it is implemented in Python, and so is -available for import, you must not use pip's internal APIs in this way. Typing -information is provided as a convenience only and is not a guarantee. Expect -unannounced changes to the API and types in releases. diff --git a/venv/lib/python3.12/site-packages/propcache-0.3.2.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/propcache-0.3.2.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.12/site-packages/propcache-0.3.2.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/propcache-0.3.2.dist-info/METADATA b/venv/lib/python3.12/site-packages/propcache-0.3.2.dist-info/METADATA deleted file mode 100644 index 73b1343..0000000 --- a/venv/lib/python3.12/site-packages/propcache-0.3.2.dist-info/METADATA +++ /dev/null @@ -1,373 +0,0 @@ -Metadata-Version: 2.4 -Name: propcache -Version: 0.3.2 -Summary: Accelerated property cache -Home-page: https://github.com/aio-libs/propcache -Author: Andrew Svetlov -Author-email: andrew.svetlov@gmail.com -Maintainer: aiohttp team <team@aiohttp.org> -Maintainer-email: team@aiohttp.org -License: Apache-2.0 -Project-URL: Chat: Matrix, https://matrix.to/#/#aio-libs:matrix.org -Project-URL: Chat: Matrix Space, https://matrix.to/#/#aio-libs-space:matrix.org -Project-URL: CI: GitHub Workflows, https://github.com/aio-libs/propcache/actions?query=branch:master -Project-URL: Code of Conduct, https://github.com/aio-libs/.github/blob/master/CODE_OF_CONDUCT.md -Project-URL: Coverage: codecov, https://codecov.io/github/aio-libs/propcache -Project-URL: Docs: Changelog, https://propcache.readthedocs.io/en/latest/changes/ -Project-URL: Docs: RTD, https://propcache.readthedocs.io -Project-URL: GitHub: issues, https://github.com/aio-libs/propcache/issues -Project-URL: GitHub: repo, https://github.com/aio-libs/propcache -Keywords: cython,cext,propcache -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: Apache Software License -Classifier: Programming Language :: Cython -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -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: Topic :: Internet :: WWW/HTTP -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Requires-Python: >=3.9 -Description-Content-Type: text/x-rst -License-File: LICENSE -License-File: NOTICE -Dynamic: license-file - -propcache -========= - -The module provides a fast implementation of cached properties for Python 3.9+. - -.. image:: https://github.com/aio-libs/propcache/actions/workflows/ci-cd.yml/badge.svg - :target: https://github.com/aio-libs/propcache/actions?query=workflow%3ACI - :align: right - -.. image:: https://codecov.io/gh/aio-libs/propcache/branch/master/graph/badge.svg - :target: https://codecov.io/gh/aio-libs/propcache - -.. image:: https://badge.fury.io/py/propcache.svg - :target: https://badge.fury.io/py/propcache - - -.. image:: https://readthedocs.org/projects/propcache/badge/?version=latest - :target: https://propcache.readthedocs.io - - -.. image:: https://img.shields.io/pypi/pyversions/propcache.svg - :target: https://pypi.python.org/pypi/propcache - -.. image:: https://img.shields.io/matrix/aio-libs:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat - :target: https://matrix.to/#/%23aio-libs:matrix.org - :alt: Matrix Room — #aio-libs:matrix.org - -.. image:: https://img.shields.io/matrix/aio-libs-space:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs-space%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat - :target: https://matrix.to/#/%23aio-libs-space:matrix.org - :alt: Matrix Space — #aio-libs-space:matrix.org - -Introduction ------------- - -The API is designed to be nearly identical to the built-in ``functools.cached_property`` class, -except for the additional ``under_cached_property`` class which uses ``self._cache`` -instead of ``self.__dict__`` to store the cached values and prevents ``__set__`` from being called. - -For full documentation please read https://propcache.readthedocs.io. - -Installation ------------- - -:: - - $ pip install propcache - -The library is Python 3 only! - -PyPI contains binary wheels for Linux, Windows and MacOS. If you want to install -``propcache`` on another operating system where wheels are not provided, -the the tarball will be used to compile the library from -the source code. It requires a C compiler and and Python headers installed. - -To skip the compilation you must explicitly opt-in by using a PEP 517 -configuration setting ``pure-python``, or setting the ``PROPCACHE_NO_EXTENSIONS`` -environment variable to a non-empty value, e.g.: - -.. code-block:: console - - $ pip install propcache --config-settings=pure-python=false - -Please note that the pure-Python (uncompiled) version is much slower. However, -PyPy always uses a pure-Python implementation, and, as such, it is unaffected -by this variable. - - -API documentation ------------------- - -The documentation is located at https://propcache.readthedocs.io. - -Source code ------------ - -The project is hosted on GitHub_ - -Please file an issue on the `bug tracker -<https://github.com/aio-libs/propcache/issues>`_ if you have found a bug -or have some suggestion in order to improve the library. - -Discussion list ---------------- - -*aio-libs* google group: https://groups.google.com/forum/#!forum/aio-libs - -Feel free to post your questions and ideas here. - - -Authors and License -------------------- - -The ``propcache`` package is derived from ``yarl`` which is written by Andrew Svetlov. - -It's *Apache 2* licensed and freely available. - - -.. _GitHub: https://github.com/aio-libs/propcache - -========= -Changelog -========= - -.. - You should *NOT* be adding new change log entries to this file, this - file is managed by towncrier. You *may* edit previous change logs to - fix problems like typo corrections or such. - To add a new change log entry, please see - https://pip.pypa.io/en/latest/development/#adding-a-news-entry - we named the news folder "changes". - - WARNING: Don't drop the next directive! - -.. towncrier release notes start - -0.3.2 -===== - -*(2025-06-09)* - - -Improved documentation ----------------------- - -- Fixed incorrect decorator usage in the ``~propcache.api.under_cached_property`` example code -- by `@meanmail <https://github.com/sponsors/meanmail>`__. - - *Related issues and pull requests on GitHub:* - `#109 <https://github.com/aio-libs/propcache/issues/109>`__. - - -Packaging updates and notes for downstreams -------------------------------------------- - -- Updated to use Cython 3.1 universally across the build path -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__. - - *Related issues and pull requests on GitHub:* - `#117 <https://github.com/aio-libs/propcache/issues/117>`__. - -- Made Cython line tracing opt-in via the ``with-cython-tracing`` build config setting -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - Previously, line tracing was enabled by default in ``pyproject.toml``, which caused build issues for some users and made wheels nearly twice as slow. - - Now line tracing is only enabled when explicitly requested via ``pip install . --config-setting=with-cython-tracing=true`` or by setting the ``PROPCACHE_CYTHON_TRACING`` environment variable. - - *Related issues and pull requests on GitHub:* - `#118 <https://github.com/aio-libs/propcache/issues/118>`__. - - ----- - - -0.3.1 -===== - -*(2025-03-25)* - - -Bug fixes ---------- - -- Improved typing annotations, fixing some type errors under correct usage - and improving typing robustness generally -- by `@Dreamsorcerer <https://github.com/sponsors/Dreamsorcerer>`__. - - *Related issues and pull requests on GitHub:* - `#103 <https://github.com/aio-libs/propcache/issues/103>`__. - - ----- - - -0.3.0 -===== - -*(2025-02-20)* - - -Features --------- - -- Implemented support for the free-threaded build of CPython 3.13 -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__. - - *Related issues and pull requests on GitHub:* - `#84 <https://github.com/aio-libs/propcache/issues/84>`__. - - -Packaging updates and notes for downstreams -------------------------------------------- - -- Started building wheels for the free-threaded build of CPython 3.13 -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__. - - *Related issues and pull requests on GitHub:* - `#84 <https://github.com/aio-libs/propcache/issues/84>`__. - - -Contributor-facing changes --------------------------- - -- GitHub Actions CI/CD is now configured to manage caching pip-ecosystem - dependencies using `re-actors/cache-python-deps`_ -- an action by - `@webknjaz <https://github.com/sponsors/webknjaz>`__ that takes into account ABI stability and the exact - version of Python runtime. - - .. _`re-actors/cache-python-deps`: - https://github.com/marketplace/actions/cache-python-deps - - *Related issues and pull requests on GitHub:* - `#93 <https://github.com/aio-libs/propcache/issues/93>`__. - - ----- - - -0.2.1 -===== - -*(2024-12-01)* - - -Bug fixes ---------- - -- Stopped implicitly allowing the use of Cython pre-release versions when - building the distribution package -- by `@ajsanchezsanz <https://github.com/sponsors/ajsanchezsanz>`__ and - `@markgreene74 <https://github.com/sponsors/markgreene74>`__. - - *Related commits on GitHub:* - `64df0a6 <https://github.com/aio-libs/propcache/commit/64df0a6>`__. - -- Fixed ``wrapped`` and ``func`` not being accessible in the Cython versions of ``propcache.api.cached_property`` and ``propcache.api.under_cached_property`` decorators -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#72 <https://github.com/aio-libs/propcache/issues/72>`__. - - -Removals and backward incompatible breaking changes ---------------------------------------------------- - -- Removed support for Python 3.8 as it has reached end of life -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#57 <https://github.com/aio-libs/propcache/issues/57>`__. - - -Packaging updates and notes for downstreams -------------------------------------------- - -- Stopped implicitly allowing the use of Cython pre-release versions when - building the distribution package -- by `@ajsanchezsanz <https://github.com/sponsors/ajsanchezsanz>`__ and - `@markgreene74 <https://github.com/sponsors/markgreene74>`__. - - *Related commits on GitHub:* - `64df0a6 <https://github.com/aio-libs/propcache/commit/64df0a6>`__. - - ----- - - -0.2.0 -===== - -*(2024-10-07)* - - -Bug fixes ---------- - -- Fixed loading the C-extensions on Python 3.8 -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#26 <https://github.com/aio-libs/propcache/issues/26>`__. - - -Features --------- - -- Improved typing for the ``propcache.api.under_cached_property`` decorator -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#38 <https://github.com/aio-libs/propcache/issues/38>`__. - - -Improved documentation ----------------------- - -- Added API documentation for the ``propcache.api.cached_property`` and ``propcache.api.under_cached_property`` decorators -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#16 <https://github.com/aio-libs/propcache/issues/16>`__. - - -Packaging updates and notes for downstreams -------------------------------------------- - -- Moved ``propcache.api.under_cached_property`` and ``propcache.api.cached_property`` to `propcache.api` -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - Both decorators remain importable from the top-level package, however importing from `propcache.api` is now the recommended way to use them. - - *Related issues and pull requests on GitHub:* - `#19 <https://github.com/aio-libs/propcache/issues/19>`__, `#24 <https://github.com/aio-libs/propcache/issues/24>`__, `#32 <https://github.com/aio-libs/propcache/issues/32>`__. - -- Converted project to use a src layout -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#22 <https://github.com/aio-libs/propcache/issues/22>`__, `#29 <https://github.com/aio-libs/propcache/issues/29>`__, `#37 <https://github.com/aio-libs/propcache/issues/37>`__. - - ----- - - -0.1.0 -===== - -*(2024-10-03)* - - -Features --------- - -- Added ``armv7l`` wheels -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#5 <https://github.com/aio-libs/propcache/issues/5>`__. - - ----- - - -0.0.0 -===== - -*(2024-10-02)* - - -- Initial release. diff --git a/venv/lib/python3.12/site-packages/propcache-0.3.2.dist-info/RECORD b/venv/lib/python3.12/site-packages/propcache-0.3.2.dist-info/RECORD deleted file mode 100644 index 59940fa..0000000 --- a/venv/lib/python3.12/site-packages/propcache-0.3.2.dist-info/RECORD +++ /dev/null @@ -1,18 +0,0 @@ -propcache-0.3.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -propcache-0.3.2.dist-info/METADATA,sha256=Ygo0BOTSAt7RNgbsd75FQSckFQZO3BaMudrbffqWUiI,12028 -propcache-0.3.2.dist-info/RECORD,, -propcache-0.3.2.dist-info/WHEEL,sha256=aSgG0F4rGPZtV0iTEIfy6dtHq6g67Lze3uLfk0vWn88,151 -propcache-0.3.2.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358 -propcache-0.3.2.dist-info/licenses/NOTICE,sha256=VtasbIEFwKUTBMIdsGDjYa-ajqCvmnXCOcKLXRNpODg,609 -propcache-0.3.2.dist-info/top_level.txt,sha256=pVF_GbqSAITPMiX27kfU3QP9-ufhRvkADmudDxWdF3w,10 -propcache/__init__.py,sha256=GYNhDM62wOtvB_-cllzXwLED-c7zf1deB_mkumDbqZ0,965 -propcache/__pycache__/__init__.cpython-312.pyc,, -propcache/__pycache__/_helpers.cpython-312.pyc,, -propcache/__pycache__/_helpers_py.cpython-312.pyc,, -propcache/__pycache__/api.cpython-312.pyc,, -propcache/_helpers.py,sha256=68SQm6kETN8Mnt9Ol26LJYgHgmB0mKy1tp92888zN4k,1553 -propcache/_helpers_c.cpython-312-x86_64-linux-gnu.so,sha256=hHOWRJjicT7MsdlARQwq5AiCqtmjJF1kVA0BXyIqJVw,770704 -propcache/_helpers_c.pyx,sha256=sBA8vSGryIq8OZMHrNZMWhIen00-YENcI9mmyaEEHcc,2569 -propcache/_helpers_py.py,sha256=McTg1siOzGdLE8u0TlG900epqQONuN2pAD1T3xryaNo,1917 -propcache/api.py,sha256=wvgB-ypkkI5uf72VVYl2NFGc_TnzUQA2CxC7dTlL5ak,179 -propcache/py.typed,sha256=ay5OMO475PlcZ_Fbun9maHW7Y6MBTk0UXL4ztHx3Iug,14 diff --git a/venv/lib/python3.12/site-packages/propcache-0.3.2.dist-info/WHEEL b/venv/lib/python3.12/site-packages/propcache-0.3.2.dist-info/WHEEL deleted file mode 100644 index e21e9f2..0000000 --- a/venv/lib/python3.12/site-packages/propcache-0.3.2.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (80.9.0) -Root-Is-Purelib: false -Tag: cp312-cp312-manylinux_2_17_x86_64 -Tag: cp312-cp312-manylinux2014_x86_64 - diff --git a/venv/lib/python3.12/site-packages/propcache-0.3.2.dist-info/licenses/LICENSE b/venv/lib/python3.12/site-packages/propcache-0.3.2.dist-info/licenses/LICENSE deleted file mode 100644 index d645695..0000000 --- a/venv/lib/python3.12/site-packages/propcache-0.3.2.dist-info/licenses/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/venv/lib/python3.12/site-packages/propcache-0.3.2.dist-info/licenses/NOTICE b/venv/lib/python3.12/site-packages/propcache-0.3.2.dist-info/licenses/NOTICE deleted file mode 100644 index fa53b2b..0000000 --- a/venv/lib/python3.12/site-packages/propcache-0.3.2.dist-info/licenses/NOTICE +++ /dev/null @@ -1,13 +0,0 @@ - Copyright 2016-2021, Andrew Svetlov and aio-libs team - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/venv/lib/python3.12/site-packages/propcache-0.3.2.dist-info/top_level.txt b/venv/lib/python3.12/site-packages/propcache-0.3.2.dist-info/top_level.txt deleted file mode 100644 index 8c9accf..0000000 --- a/venv/lib/python3.12/site-packages/propcache-0.3.2.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -propcache diff --git a/venv/lib/python3.12/site-packages/propcache/__init__.py b/venv/lib/python3.12/site-packages/propcache/__init__.py deleted file mode 100644 index 41bcdb8..0000000 --- a/venv/lib/python3.12/site-packages/propcache/__init__.py +++ /dev/null @@ -1,32 +0,0 @@ -"""propcache: An accelerated property cache for Python classes.""" - -from typing import TYPE_CHECKING - -_PUBLIC_API = ("cached_property", "under_cached_property") - -__version__ = "0.3.2" -__all__ = () - -# Imports have moved to `propcache.api` in 0.2.0+. -# This module is now a facade for the API. -if TYPE_CHECKING: - from .api import cached_property as cached_property # noqa: F401 - from .api import under_cached_property as under_cached_property # noqa: F401 - - -def _import_facade(attr: str) -> object: - """Import the public API from the `api` module.""" - if attr in _PUBLIC_API: - from . import api # pylint: disable=import-outside-toplevel - - return getattr(api, attr) - raise AttributeError(f"module '{__package__}' has no attribute '{attr}'") - - -def _dir_facade() -> list[str]: - """Include the public API in the module's dir() output.""" - return [*_PUBLIC_API, *globals().keys()] - - -__getattr__ = _import_facade -__dir__ = _dir_facade diff --git a/venv/lib/python3.12/site-packages/propcache/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/propcache/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 50d7c8dd9a5447b05adea28cab95df95e775ee70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1300 zcmZ8g&1)M+6rYt=D_LtvjT47Bp)hU_>QY;qCM{`0YVcQElf)R}QnEcvRy!kU<JImm zJ5rJ2f?9gaAwAh8{Rp9#;(sESLZKH0U)rSxL()TTD!Td9H!G<WKbSXf-q*bMelx!p z3V8(7`|&~J*EB*e<Y7YUSQyqo*h3Uqh$=MYDb19XQV>mBX{uT(%~%<h;?q>4Sx;+b ztt{9yngcm!<v^ZdQ#8-=HI?e$sFn`$G@F`(oV66422FwKR*@B~Qm0@PyEj4}gpTbr z*mb<@W7~0<$G9yR#nQsK=-|YRYXQew9nlDU?09w*v8eJ&mTV|-Vf*gZI$8Z>ef8$X z=Ep`VE+rw9Oj5+NEuS(@PN}<@%ayB@E5D#uN|K1n85j!Bz!s~v5Ioj66D{sL(qTeb z5MX*}SOvC+c9ED^P#f`?$<)476eOf?Lc7W?I!KM=J4j58)i76)U?R_t5mk33&-{=% z7~lA{Vrbokjb<2dfklJiuvPV32QP1J;2IB_iSC{qy7zE1pe>J8xV#glk_KfrH&Wtq z_gon_><Ie-mW{d9mSDJiqLd9S*2&hVE4MaQ2_%gX*C9U6)|p5qP+Xq4uX7%7a3-Pc z?AUcih>_wsa84p3*&N0vuGt8h%xu~sYMX0;(`qtbM5X{->)dWGM#6P=7+<8p7rqzR z0E^jXe%tiisu?EuUah=y#f)6R7RMJw=6|omB*gVyK}aR+#6{vJb0Ia`k%`Vi1!rJI z?*Z$f<E;Mh!Sn3Jqukuf()mZx{@P(_zMq@_D}Q1C{hx0>`LKU^?b-ITkA9o)&)quA z-|nlohY*My$tEO$PQYFPVGq^+2li7%NJ~No<NdyTJEv%3d#c<4T)OXW_>R}2>@=FL zpJ+yal_N}D{+5A*mIzy-Vx)Ni(gG}AP_?}%R(Dt@;u`4qImu?ERVNTMnZ^asT!a-} z0tVC27ao4z*B8FO_V|OJmcCm$y!1Al`szXwziGS{X9=N!LrAQNPU!k|F1s6D3!t|d zkKDiqGx*t_M@RyD@@GarCLPHS6IAarM<iIps^@}E79yX`_(hE}$U@1f`cHB<M%^#* zHy}p-fao(|gS4V3f1;JY5k4+n@9D?I*`EGKe!7?aCx_HCN9wgBb#<U=%BHe^c7Wvm i<oqz%2Qw*U@zM7Fo8R6YA`l08RC-+o&wiCn8vhsVHdS^2 diff --git a/venv/lib/python3.12/site-packages/propcache/__pycache__/_helpers.cpython-312.pyc b/venv/lib/python3.12/site-packages/propcache/__pycache__/_helpers.cpython-312.pyc deleted file mode 100644 index 1b2102f8016e8e03370414a7fdc854bec55eef8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1043 zcmah|OHUI~6u!4J(@tOX0j1c`gai_86ed0*nkXuzDlxVVu#j0W8D?(UDf7zA08ZR= z=~7m>a&Pz*vUOu&LA|6&6Ibkt#Kf@j4yE!4(X%+O`<-*Xdv5O6Xfy<f)IYteCj0>W z@PeK&r_Rw+2*4(gfecl^cP->0iG8Y1qj(Aenc`_5Knw!4NU!|N)?#OV&y(pb($$lm z<yi!4$!_kvt__@zy1vY;Oafr}WIw5*tb`npSv9Oh_$c8Lkb}hU<6{t@C?7#FzR!h- zwUa^bj8)?VmpH}62`))+34%*{xc_$=1*m@vSp6p*{yB9KxNsf3r53?D%!Lj->ct$y z(S^lwLCC)><X_DeU*vo^CW%rN$%1JaCbAqCr&e_tS;FOXx;$4Z=bw>Ep;!_MZx#y0 z`Pou&9tR}Tb*hHGaNzAU2Q9j5ycf(3V4q=Q%64t+cU)7^D;7oaI3Nh3stN+8mkmS3 z0i>@fmZ4*+f*c&ZIG|6_OciNJcSJ`a7+M!Kgu_A=sf4jDnC{6)oV-NYJMc*0p(}4h zj&bO36A33SmrFQ(b)kgAvzlpGPQkJa>oYhaL%^}ZRSgYsn&{YT+>9ZudW>z(K`N?P zqBd?jinM~PaoJecRYN2@=GMryIaOKax*NPZar+KuD-IerMQKH>Ae-}E<%Ad4V>)5F z$Lu4`kXKbSWo5}^Z|(LLQ5_0GxDSH+Ak+dQ?a=*t;Lr~esSk6T{06_dw6XMU?D1}D zYB&C*9&J+oJu20pQhQXUL1jKFJJj{&z)=15Aq(h4i=J-L#rEKhdZ{^luR&k?9vtlW z!py@KJJVvz?aa;hvF6BRgU$Ym111kIf`50?Ad>zG7!Uuv#m==ew><oV9X8tulkBnW V{k1Qn@o5HZGpXq;wLJ`p{sW4iAO-*c diff --git a/venv/lib/python3.12/site-packages/propcache/__pycache__/_helpers_py.cpython-312.pyc b/venv/lib/python3.12/site-packages/propcache/__pycache__/_helpers_py.cpython-312.pyc deleted file mode 100644 index b70f2ec1ffb45e9902ea282faaf35ca14a4b8a08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3202 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 C-w8MX diff --git a/venv/lib/python3.12/site-packages/propcache/__pycache__/api.cpython-312.pyc b/venv/lib/python3.12/site-packages/propcache/__pycache__/api.cpython-312.pyc deleted file mode 100644 index a9f2aef41b2971cf09542c0916fc05ebc4296f45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 361 zcmZ8cu};G<5Vf747ODyfiH#v^gj%bxR!B%JEU0r9%e9XtsvSqRQxsU>E7;hX`3$~* ztPF^)QnyYxh%Vf4ckk}>-n;kV@BoE)e0j*<LjCN(F34ZAISI`(k|;wGOQNtQ8PQP| zVI)ZwH&GhjpU&#JDnxQQyH3n);&VtUYbvn5Ndy;pQ7#fy%q_Rg_!|ell(dK40wmiV zw#RiT!Lonjn{==3F(!>*tnITLRG@V>3M4iTsatZT7<)yV0MS;`+-RVhd$*!jM${Tg z@2Cd_3(NJ$`9dtgj-<IOmEl2>uAp4e;Ez^~&rNwgo}5uvco<b&EcpT)?M(g}qr57{ nRkQ6+wUM=g3p)s+-AnE$q;-Tb{y>v2G+oEhfIRi=ei;7%fSPR4 diff --git a/venv/lib/python3.12/site-packages/propcache/_helpers.py b/venv/lib/python3.12/site-packages/propcache/_helpers.py deleted file mode 100644 index 1e52895..0000000 --- a/venv/lib/python3.12/site-packages/propcache/_helpers.py +++ /dev/null @@ -1,39 +0,0 @@ -import os -import sys -from typing import TYPE_CHECKING - -__all__ = ("cached_property", "under_cached_property") - - -NO_EXTENSIONS = bool(os.environ.get("PROPCACHE_NO_EXTENSIONS")) # type: bool -if sys.implementation.name != "cpython": - NO_EXTENSIONS = True - - -# isort: off -if TYPE_CHECKING: - from ._helpers_py import cached_property as cached_property_py - from ._helpers_py import under_cached_property as under_cached_property_py - - cached_property = cached_property_py - under_cached_property = under_cached_property_py -elif not NO_EXTENSIONS: # pragma: no branch - try: - from ._helpers_c import cached_property as cached_property_c # type: ignore[attr-defined, unused-ignore] - from ._helpers_c import under_cached_property as under_cached_property_c # type: ignore[attr-defined, unused-ignore] - - cached_property = cached_property_c - under_cached_property = under_cached_property_c - except ImportError: # pragma: no cover - from ._helpers_py import cached_property as cached_property_py - from ._helpers_py import under_cached_property as under_cached_property_py - - cached_property = cached_property_py # type: ignore[assignment, misc] - under_cached_property = under_cached_property_py -else: - from ._helpers_py import cached_property as cached_property_py - from ._helpers_py import under_cached_property as under_cached_property_py - - cached_property = cached_property_py # type: ignore[assignment, misc] - under_cached_property = under_cached_property_py -# isort: on diff --git a/venv/lib/python3.12/site-packages/propcache/_helpers_c.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/propcache/_helpers_c.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index e275d5349ae88c18a6337b021bac263076561d77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 770704 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%0A3R;7hsZC&<4h3w_G9j+Y`P*|oivwqHHBx(9rB+9 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 Q)n9&>)yFi*n$Y_H3yq2HRsaA1 diff --git a/venv/lib/python3.12/site-packages/propcache/_helpers_c.pyx b/venv/lib/python3.12/site-packages/propcache/_helpers_c.pyx deleted file mode 100644 index 84cdd49..0000000 --- a/venv/lib/python3.12/site-packages/propcache/_helpers_c.pyx +++ /dev/null @@ -1,86 +0,0 @@ -# cython: language_level=3, freethreading_compatible=True -from types import GenericAlias - - -cdef _sentinel = object() - -cdef class under_cached_property: - """Use as a class method decorator. It operates almost exactly like - the Python `@property` decorator, but it puts the result of the - method it decorates into the instance dict after the first call, - effectively replacing the function it decorates with an instance - variable. It is, in Python parlance, a data descriptor. - - """ - - cdef readonly object wrapped - cdef object name - - def __init__(self, wrapped): - self.wrapped = wrapped - self.name = wrapped.__name__ - - @property - def __doc__(self): - return self.wrapped.__doc__ - - def __get__(self, inst, owner): - if inst is None: - return self - cdef dict cache = inst._cache - val = cache.get(self.name, _sentinel) - if val is _sentinel: - val = self.wrapped(inst) - cache[self.name] = val - return val - - def __set__(self, inst, value): - raise AttributeError("cached property is read-only") - - __class_getitem__ = classmethod(GenericAlias) - - -cdef class cached_property: - """Use as a class method decorator. It operates almost exactly like - the Python `@property` decorator, but it puts the result of the - method it decorates into the instance dict after the first call, - effectively replacing the function it decorates with an instance - variable. It is, in Python parlance, a data descriptor. - - """ - - cdef readonly object func - cdef object name - - def __init__(self, func): - self.func = func - self.name = None - - @property - def __doc__(self): - return self.func.__doc__ - - def __set_name__(self, owner, name): - if self.name is None: - self.name = name - elif name != self.name: - raise TypeError( - "Cannot assign the same cached_property to two different names " - f"({self.name!r} and {name!r})." - ) - - def __get__(self, inst, owner): - if inst is None: - return self - if self.name is None: - raise TypeError( - "Cannot use cached_property instance" - " without calling __set_name__ on it.") - cdef dict cache = inst.__dict__ - val = cache.get(self.name, _sentinel) - if val is _sentinel: - val = self.func(inst) - cache[self.name] = val - return val - - __class_getitem__ = classmethod(GenericAlias) diff --git a/venv/lib/python3.12/site-packages/propcache/_helpers_py.py b/venv/lib/python3.12/site-packages/propcache/_helpers_py.py deleted file mode 100644 index 90432ca..0000000 --- a/venv/lib/python3.12/site-packages/propcache/_helpers_py.py +++ /dev/null @@ -1,60 +0,0 @@ -"""Various helper functions.""" - -import sys -from collections.abc import Mapping -from functools import cached_property -from typing import Any, Callable, Generic, Optional, Protocol, TypeVar, Union, overload - -__all__ = ("under_cached_property", "cached_property") - - -if sys.version_info >= (3, 11): - from typing import Self -else: - Self = Any - -_T = TypeVar("_T") -# We use Mapping to make it possible to use TypedDict, but this isn't -# technically type safe as we need to assign into the dict. -_Cache = TypeVar("_Cache", bound=Mapping[str, Any]) - - -class _CacheImpl(Protocol[_Cache]): - _cache: _Cache - - -class under_cached_property(Generic[_T]): - """Use as a class method decorator. - - It operates almost exactly like - the Python `@property` decorator, but it puts the result of the - method it decorates into the instance dict after the first call, - effectively replacing the function it decorates with an instance - variable. It is, in Python parlance, a data descriptor. - """ - - def __init__(self, wrapped: Callable[[Any], _T]) -> None: - self.wrapped = wrapped - self.__doc__ = wrapped.__doc__ - self.name = wrapped.__name__ - - @overload - def __get__(self, inst: None, owner: Optional[type[object]] = None) -> Self: ... - - @overload - def __get__(self, inst: _CacheImpl[Any], owner: Optional[type[object]] = None) -> _T: ... # type: ignore[misc] - - def __get__( - self, inst: Optional[_CacheImpl[Any]], owner: Optional[type[object]] = None - ) -> Union[_T, Self]: - if inst is None: - return self - try: - return inst._cache[self.name] # type: ignore[no-any-return] - except KeyError: - val = self.wrapped(inst) - inst._cache[self.name] = val - return val - - def __set__(self, inst: _CacheImpl[Any], value: _T) -> None: - raise AttributeError("cached property is read-only") diff --git a/venv/lib/python3.12/site-packages/propcache/api.py b/venv/lib/python3.12/site-packages/propcache/api.py deleted file mode 100644 index 22389e6..0000000 --- a/venv/lib/python3.12/site-packages/propcache/api.py +++ /dev/null @@ -1,8 +0,0 @@ -"""Public API of the property caching library.""" - -from ._helpers import cached_property, under_cached_property - -__all__ = ( - "cached_property", - "under_cached_property", -) diff --git a/venv/lib/python3.12/site-packages/propcache/py.typed b/venv/lib/python3.12/site-packages/propcache/py.typed deleted file mode 100644 index dcf2c80..0000000 --- a/venv/lib/python3.12/site-packages/propcache/py.typed +++ /dev/null @@ -1 +0,0 @@ -# Placeholder diff --git a/venv/lib/python3.12/site-packages/python_dotenv-1.1.1.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/python_dotenv-1.1.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.12/site-packages/python_dotenv-1.1.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/python_dotenv-1.1.1.dist-info/METADATA b/venv/lib/python3.12/site-packages/python_dotenv-1.1.1.dist-info/METADATA deleted file mode 100644 index 8dcf31d..0000000 --- a/venv/lib/python3.12/site-packages/python_dotenv-1.1.1.dist-info/METADATA +++ /dev/null @@ -1,733 +0,0 @@ -Metadata-Version: 2.4 -Name: python-dotenv -Version: 1.1.1 -Summary: Read key-value pairs from a .env file and set them as environment variables -Home-page: https://github.com/theskumar/python-dotenv -Author: Saurabh Kumar -Author-email: me+github@saurabh-kumar.com -License: BSD-3-Clause -Keywords: environment variables,deployments,settings,env,dotenv,configurations,python -Classifier: Development Status :: 5 - Production/Stable -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -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 :: Implementation :: PyPy -Classifier: Intended Audience :: Developers -Classifier: Intended Audience :: System Administrators -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Topic :: System :: Systems Administration -Classifier: Topic :: Utilities -Classifier: Environment :: Web Environment -Requires-Python: >=3.9 -Description-Content-Type: text/markdown -License-File: LICENSE -Provides-Extra: cli -Requires-Dist: click>=5.0; extra == "cli" -Dynamic: author -Dynamic: author-email -Dynamic: classifier -Dynamic: description -Dynamic: description-content-type -Dynamic: home-page -Dynamic: keywords -Dynamic: license -Dynamic: license-file -Dynamic: provides-extra -Dynamic: requires-python -Dynamic: summary - -# python-dotenv - -[![Build Status][build_status_badge]][build_status_link] -[![PyPI version][pypi_badge]][pypi_link] - -python-dotenv reads key-value pairs from a `.env` file and can set them as environment -variables. It helps in the development of applications following the -[12-factor](https://12factor.net/) principles. - -- [Getting Started](#getting-started) -- [Other Use Cases](#other-use-cases) - * [Load configuration without altering the environment](#load-configuration-without-altering-the-environment) - * [Parse configuration as a stream](#parse-configuration-as-a-stream) - * [Load .env files in IPython](#load-env-files-in-ipython) -- [Command-line Interface](#command-line-interface) -- [File format](#file-format) - * [Multiline values](#multiline-values) - * [Variable expansion](#variable-expansion) -- [Related Projects](#related-projects) -- [Acknowledgements](#acknowledgements) - -## Getting Started - -```shell -pip install python-dotenv -``` - -If your application takes its configuration from environment variables, like a 12-factor -application, launching it in development is not very practical because you have to set -those environment variables yourself. - -To help you with that, you can add python-dotenv to your application to make it load the -configuration from a `.env` file when it is present (e.g. in development) while remaining -configurable via the environment: - -```python -from dotenv import load_dotenv - -load_dotenv() # take environment variables - -# Code of your application, which uses environment variables (e.g. from `os.environ` or -# `os.getenv`) as if they came from the actual environment. -``` - -By default, `load_dotenv` doesn't override existing environment variables and looks for a `.env` file in same directory as python script or searches for it incrementally higher up. - -To configure the development environment, add a `.env` in the root directory of your -project: - -``` -. -├── .env -└── foo.py -``` - -The syntax of `.env` files supported by python-dotenv is similar to that of Bash: - -```bash -# Development settings -DOMAIN=example.org -ADMIN_EMAIL=admin@${DOMAIN} -ROOT_URL=${DOMAIN}/app -``` - -If you use variables in values, ensure they are surrounded with `{` and `}`, like -`${DOMAIN}`, as bare variables such as `$DOMAIN` are not expanded. - -You will probably want to add `.env` to your `.gitignore`, especially if it contains -secrets like a password. - -See the section "File format" below for more information about what you can write in a -`.env` file. - -## Other Use Cases - -### Load configuration without altering the environment - -The function `dotenv_values` works more or less the same way as `load_dotenv`, except it -doesn't touch the environment, it just returns a `dict` with the values parsed from the -`.env` file. - -```python -from dotenv import dotenv_values - -config = dotenv_values(".env") # config = {"USER": "foo", "EMAIL": "foo@example.org"} -``` - -This notably enables advanced configuration management: - -```python -import os -from dotenv import dotenv_values - -config = { - **dotenv_values(".env.shared"), # load shared development variables - **dotenv_values(".env.secret"), # load sensitive variables - **os.environ, # override loaded values with environment variables -} -``` - -### Parse configuration as a stream - -`load_dotenv` and `dotenv_values` accept [streams][python_streams] via their `stream` -argument. It is thus possible to load the variables from sources other than the -filesystem (e.g. the network). - -```python -from io import StringIO - -from dotenv import load_dotenv - -config = StringIO("USER=foo\nEMAIL=foo@example.org") -load_dotenv(stream=config) -``` - -### Load .env files in IPython - -You can use dotenv in IPython. By default, it will use `find_dotenv` to search for a -`.env` file: - -```python -%load_ext dotenv -%dotenv -``` - -You can also specify a path: - -```python -%dotenv relative/or/absolute/path/to/.env -``` - -Optional flags: - -- `-o` to override existing variables. -- `-v` for increased verbosity. - -## Command-line Interface - -A CLI interface `dotenv` is also included, which helps you manipulate the `.env` file -without manually opening it. - -```shell -$ pip install "python-dotenv[cli]" -$ dotenv set USER foo -$ dotenv set EMAIL foo@example.org -$ dotenv list -USER=foo -EMAIL=foo@example.org -$ dotenv list --format=json -{ - "USER": "foo", - "EMAIL": "foo@example.org" -} -$ dotenv run -- python foo.py -``` - -Run `dotenv --help` for more information about the options and subcommands. - -## File format - -The format is not formally specified and still improves over time. That being said, -`.env` files should mostly look like Bash files. - -Keys can be unquoted or single-quoted. Values can be unquoted, single- or double-quoted. -Spaces before and after keys, equal signs, and values are ignored. Values can be followed -by a comment. Lines can start with the `export` directive, which does not affect their -interpretation. - -Allowed escape sequences: - -- in single-quoted values: `\\`, `\'` -- in double-quoted values: `\\`, `\'`, `\"`, `\a`, `\b`, `\f`, `\n`, `\r`, `\t`, `\v` - -### Multiline values - -It is possible for single- or double-quoted values to span multiple lines. The following -examples are equivalent: - -```bash -FOO="first line -second line" -``` - -```bash -FOO="first line\nsecond line" -``` - -### Variable without a value - -A variable can have no value: - -```bash -FOO -``` - -It results in `dotenv_values` associating that variable name with the value `None` (e.g. -`{"FOO": None}`. `load_dotenv`, on the other hand, simply ignores such variables. - -This shouldn't be confused with `FOO=`, in which case the variable is associated with the -empty string. - -### Variable expansion - -python-dotenv can interpolate variables using POSIX variable expansion. - -With `load_dotenv(override=True)` or `dotenv_values()`, the value of a variable is the -first of the values defined in the following list: - -- Value of that variable in the `.env` file. -- Value of that variable in the environment. -- Default value, if provided. -- Empty string. - -With `load_dotenv(override=False)`, the value of a variable is the first of the values -defined in the following list: - -- Value of that variable in the environment. -- Value of that variable in the `.env` file. -- Default value, if provided. -- Empty string. - -## Related Projects - -- [Honcho](https://github.com/nickstenning/honcho) - For managing - Procfile-based applications. -- [django-dotenv](https://github.com/jpadilla/django-dotenv) -- [django-environ](https://github.com/joke2k/django-environ) -- [django-environ-2](https://github.com/sergeyklay/django-environ-2) -- [django-configuration](https://github.com/jezdez/django-configurations) -- [dump-env](https://github.com/sobolevn/dump-env) -- [environs](https://github.com/sloria/environs) -- [dynaconf](https://github.com/rochacbruno/dynaconf) -- [parse_it](https://github.com/naorlivne/parse_it) -- [python-decouple](https://github.com/HBNetwork/python-decouple) - -## Acknowledgements - -This project is currently maintained by [Saurabh Kumar](https://saurabh-kumar.com) and -[Bertrand Bonnefoy-Claudet](https://github.com/bbc2) and would not have been possible -without the support of these [awesome -people](https://github.com/theskumar/python-dotenv/graphs/contributors). - -[build_status_badge]: https://github.com/theskumar/python-dotenv/actions/workflows/test.yml/badge.svg -[build_status_link]: https://github.com/theskumar/python-dotenv/actions/workflows/test.yml -[pypi_badge]: https://badge.fury.io/py/python-dotenv.svg -[pypi_link]: https://badge.fury.io/py/python-dotenv -[python_streams]: https://docs.python.org/3/library/io.html - -# 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/), and this -project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - -## [1.1.1] - 2025-06-24 - -## Fixed - -* CLI: Ensure `find_dotenv` work reliably on python 3.13 by [@theskumar] in [#563](https://github.com/theskumar/python-dotenv/pull/563) -* CLI: revert the use of execvpe on Windows by [@wrongontheinternet] in [#566](https://github.com/theskumar/python-dotenv/pull/566) - - -## [1.1.0] - 2025-03-25 - -**Feature** - -- Add support for python 3.13 -- Enhance `dotenv run`, switch to `execvpe` for better resource management and signal handling ([#523]) by [@eekstunt] - -**Fixed** - -- `find_dotenv` and `load_dotenv` now correctly looks up at the current directory when running in debugger or pdb ([#553] by [@randomseed42]) - -**Misc** - -- Drop support for Python 3.8 - -## [1.0.1] - 2024-01-23 - -**Fixed** - -* Gracefully handle code which has been imported from a zipfile ([#456] by [@samwyma]) -* Allow modules using `load_dotenv` to be reloaded when launched in a separate thread ([#497] by [@freddyaboulton]) -* Fix file not closed after deletion, handle error in the rewrite function ([#469] by [@Qwerty-133]) - -**Misc** -* Use pathlib.Path in tests ([#466] by [@eumiro]) -* Fix year in release date in changelog.md ([#454] by [@jankislinger]) -* Use https in README links ([#474] by [@Nicals]) - -## [1.0.0] - 2023-02-24 - -**Fixed** - -* Drop support for python 3.7, add python 3.12-dev (#449 by [@theskumar]) -* Handle situations where the cwd does not exist. (#446 by [@jctanner]) - -## [0.21.1] - 2023-01-21 - -**Added** - -* Use Python 3.11 non-beta in CI (#438 by [@bbc2]) -* Modernize variables code (#434 by [@Nougat-Waffle]) -* Modernize main.py and parser.py code (#435 by [@Nougat-Waffle]) -* Improve conciseness of cli.py and __init__.py (#439 by [@Nougat-Waffle]) -* Improve error message for `get` and `list` commands when env file can't be opened (#441 by [@bbc2]) -* Updated License to align with BSD OSI template (#433 by [@lsmith77]) - - -**Fixed** - -* Fix Out-of-scope error when "dest" variable is undefined (#413 by [@theGOTOguy]) -* Fix IPython test warning about deprecated `magic` (#440 by [@bbc2]) -* Fix type hint for dotenv_path var, add StrPath alias (#432 by [@eaf]) - -## [0.21.0] - 2022-09-03 - -**Added** - -* CLI: add support for invocations via 'python -m'. (#395 by [@theskumar]) -* `load_dotenv` function now returns `False`. (#388 by [@larsks]) -* CLI: add --format= option to list command. (#407 by [@sammck]) - -**Fixed** - -* Drop Python 3.5 and 3.6 and upgrade GA (#393 by [@eggplants]) -* Use `open` instead of `io.open`. (#389 by [@rabinadk1]) -* Improve documentation for variables without a value (#390 by [@bbc2]) -* Add `parse_it` to Related Projects (#410 by [@naorlivne]) -* Update README.md (#415 by [@harveer07]) -* Improve documentation with direct use of MkDocs (#398 by [@bbc2]) - -## [0.20.0] - 2022-03-24 - -**Added** - -- Add `encoding` (`Optional[str]`) parameter to `get_key`, `set_key` and `unset_key`. - (#379 by [@bbc2]) - -**Fixed** - -- Use dict to specify the `entry_points` parameter of `setuptools.setup` (#376 by - [@mgorny]). -- Don't build universal wheels (#387 by [@bbc2]). - -## [0.19.2] - 2021-11-11 - -**Fixed** - -- In `set_key`, add missing newline character before new entry if necessary. (#361 by - [@bbc2]) - -## [0.19.1] - 2021-08-09 - -**Added** - -- Add support for Python 3.10. (#359 by [@theskumar]) - -## [0.19.0] - 2021-07-24 - -**Changed** - -- Require Python 3.5 or a later version. Python 2 and 3.4 are no longer supported. (#341 - by [@bbc2]). - -**Added** - -- The `dotenv_path` argument of `set_key` and `unset_key` now has a type of `Union[str, - os.PathLike]` instead of just `os.PathLike` (#347 by [@bbc2]). -- The `stream` argument of `load_dotenv` and `dotenv_values` can now be a text stream - (`IO[str]`), which includes values like `io.StringIO("foo")` and `open("file.env", - "r")` (#348 by [@bbc2]). - -## [0.18.0] - 2021-06-20 - -**Changed** - -- Raise `ValueError` if `quote_mode` isn't one of `always`, `auto` or `never` in - `set_key` (#330 by [@bbc2]). -- When writing a value to a .env file with `set_key` or `dotenv set <key> <value>` (#330 - by [@bbc2]): - - Use single quotes instead of double quotes. - - Don't strip surrounding quotes. - - In `auto` mode, don't add quotes if the value is only made of alphanumeric characters - (as determined by `string.isalnum`). - -## [0.17.1] - 2021-04-29 - -**Fixed** - -- Fixed tests for build environments relying on `PYTHONPATH` (#318 by [@befeleme]). - -## [0.17.0] - 2021-04-02 - -**Changed** - -- Make `dotenv get <key>` only show the value, not `key=value` (#313 by [@bbc2]). - -**Added** - -- Add `--override`/`--no-override` option to `dotenv run` (#312 by [@zueve] and [@bbc2]). - -## [0.16.0] - 2021-03-27 - -**Changed** - -- The default value of the `encoding` parameter for `load_dotenv` and `dotenv_values` is - now `"utf-8"` instead of `None` (#306 by [@bbc2]). -- Fix resolution order in variable expansion with `override=False` (#287 by [@bbc2]). - -## [0.15.0] - 2020-10-28 - -**Added** - -- Add `--export` option to `set` to make it prepend the binding with `export` (#270 by - [@jadutter]). - -**Changed** - -- Make `set` command create the `.env` file in the current directory if no `.env` file was - found (#270 by [@jadutter]). - -**Fixed** - -- Fix potentially empty expanded value for duplicate key (#260 by [@bbc2]). -- Fix import error on Python 3.5.0 and 3.5.1 (#267 by [@gongqingkui]). -- Fix parsing of unquoted values containing several adjacent space or tab characters - (#277 by [@bbc2], review by [@x-yuri]). - -## [0.14.0] - 2020-07-03 - -**Changed** - -- Privilege definition in file over the environment in variable expansion (#256 by - [@elbehery95]). - -**Fixed** - -- Improve error message for when file isn't found (#245 by [@snobu]). -- Use HTTPS URL in package meta data (#251 by [@ekohl]). - -## [0.13.0] - 2020-04-16 - -**Added** - -- Add support for a Bash-like default value in variable expansion (#248 by [@bbc2]). - -## [0.12.0] - 2020-02-28 - -**Changed** - -- Use current working directory to find `.env` when bundled by PyInstaller (#213 by - [@gergelyk]). - -**Fixed** - -- Fix escaping of quoted values written by `set_key` (#236 by [@bbc2]). -- Fix `dotenv run` crashing on environment variables without values (#237 by [@yannham]). -- Remove warning when last line is empty (#238 by [@bbc2]). - -## [0.11.0] - 2020-02-07 - -**Added** - -- Add `interpolate` argument to `load_dotenv` and `dotenv_values` to disable interpolation - (#232 by [@ulyssessouza]). - -**Changed** - -- Use logging instead of warnings (#231 by [@bbc2]). - -**Fixed** - -- Fix installation in non-UTF-8 environments (#225 by [@altendky]). -- Fix PyPI classifiers (#228 by [@bbc2]). - -## [0.10.5] - 2020-01-19 - -**Fixed** - -- Fix handling of malformed lines and lines without a value (#222 by [@bbc2]): - - Don't print warning when key has no value. - - Reject more malformed lines (e.g. "A: B", "a='b',c"). -- Fix handling of lines with just a comment (#224 by [@bbc2]). - -## [0.10.4] - 2020-01-17 - -**Added** - -- Make typing optional (#179 by [@techalchemy]). -- Print a warning on malformed line (#211 by [@bbc2]). -- Support keys without a value (#220 by [@ulyssessouza]). - -## 0.10.3 - -- Improve interactive mode detection ([@andrewsmith])([#183]). -- Refactor parser to fix parsing inconsistencies ([@bbc2])([#170]). - - Interpret escapes as control characters only in double-quoted strings. - - Interpret `#` as start of comment only if preceded by whitespace. - -## 0.10.2 - -- Add type hints and expose them to users ([@qnighy])([#172]) -- `load_dotenv` and `dotenv_values` now accept an `encoding` parameter, defaults to `None` - ([@theskumar])([@earlbread])([#161]) -- Fix `str`/`unicode` inconsistency in Python 2: values are always `str` now. ([@bbc2])([#121]) -- Fix Unicode error in Python 2, introduced in 0.10.0. ([@bbc2])([#176]) - -## 0.10.1 -- Fix parsing of variable without a value ([@asyncee])([@bbc2])([#158]) - -## 0.10.0 - -- Add support for UTF-8 in unquoted values ([@bbc2])([#148]) -- Add support for trailing comments ([@bbc2])([#148]) -- Add backslashes support in values ([@bbc2])([#148]) -- Add support for newlines in values ([@bbc2])([#148]) -- Force environment variables to str with Python2 on Windows ([@greyli]) -- Drop Python 3.3 support ([@greyli]) -- Fix stderr/-out/-in redirection ([@venthur]) - - -## 0.9.0 - -- Add `--version` parameter to cli ([@venthur]) -- Enable loading from current directory ([@cjauvin]) -- Add 'dotenv run' command for calling arbitrary shell script with .env ([@venthur]) - -## 0.8.1 - -- Add tests for docs ([@Flimm]) -- Make 'cli' support optional. Use `pip install python-dotenv[cli]`. ([@theskumar]) - -## 0.8.0 - -- `set_key` and `unset_key` only modified the affected file instead of - parsing and re-writing file, this causes comments and other file - entact as it is. -- Add support for `export` prefix in the line. -- Internal refractoring ([@theskumar]) -- Allow `load_dotenv` and `dotenv_values` to work with `StringIO())` ([@alanjds])([@theskumar])([#78]) - -## 0.7.1 - -- Remove hard dependency on iPython ([@theskumar]) - -## 0.7.0 - -- Add support to override system environment variable via .env. - ([@milonimrod](https://github.com/milonimrod)) - ([\#63](https://github.com/theskumar/python-dotenv/issues/63)) -- Disable ".env not found" warning by default - ([@maxkoryukov](https://github.com/maxkoryukov)) - ([\#57](https://github.com/theskumar/python-dotenv/issues/57)) - -## 0.6.5 - -- Add support for special characters `\`. - ([@pjona](https://github.com/pjona)) - ([\#60](https://github.com/theskumar/python-dotenv/issues/60)) - -## 0.6.4 - -- Fix issue with single quotes ([@Flimm]) - ([\#52](https://github.com/theskumar/python-dotenv/issues/52)) - -## 0.6.3 - -- Handle unicode exception in setup.py - ([\#46](https://github.com/theskumar/python-dotenv/issues/46)) - -## 0.6.2 - -- Fix dotenv list command ([@ticosax](https://github.com/ticosax)) -- Add iPython Support - ([@tillahoffmann](https://github.com/tillahoffmann)) - -## 0.6.0 - -- Drop support for Python 2.6 -- Handle escaped characters and newlines in quoted values. (Thanks - [@iameugenejo](https://github.com/iameugenejo)) -- Remove any spaces around unquoted key/value. (Thanks - [@paulochf](https://github.com/paulochf)) -- Added POSIX variable expansion. (Thanks - [@hugochinchilla](https://github.com/hugochinchilla)) - -## 0.5.1 - -- Fix `find_dotenv` - it now start search from the file where this - function is called from. - -## 0.5.0 - -- Add `find_dotenv` method that will try to find a `.env` file. - (Thanks [@isms](https://github.com/isms)) - -## 0.4.0 - -- cli: Added `-q/--quote` option to control the behaviour of quotes - around values in `.env`. (Thanks - [@hugochinchilla](https://github.com/hugochinchilla)). -- Improved test coverage. - -[#78]: https://github.com/theskumar/python-dotenv/issues/78 -[#121]: https://github.com/theskumar/python-dotenv/issues/121 -[#148]: https://github.com/theskumar/python-dotenv/issues/148 -[#158]: https://github.com/theskumar/python-dotenv/issues/158 -[#170]: https://github.com/theskumar/python-dotenv/issues/170 -[#172]: https://github.com/theskumar/python-dotenv/issues/172 -[#176]: https://github.com/theskumar/python-dotenv/issues/176 -[#183]: https://github.com/theskumar/python-dotenv/issues/183 -[#359]: https://github.com/theskumar/python-dotenv/issues/359 -[#469]: https://github.com/theskumar/python-dotenv/issues/469 -[#456]: https://github.com/theskumar/python-dotenv/issues/456 -[#466]: https://github.com/theskumar/python-dotenv/issues/466 -[#454]: https://github.com/theskumar/python-dotenv/issues/454 -[#474]: https://github.com/theskumar/python-dotenv/issues/474 -[#523]: https://github.com/theskumar/python-dotenv/issues/523 -[#553]: https://github.com/theskumar/python-dotenv/issues/553 - -[@alanjds]: https://github.com/alanjds -[@altendky]: https://github.com/altendky -[@andrewsmith]: https://github.com/andrewsmith -[@asyncee]: https://github.com/asyncee -[@bbc2]: https://github.com/bbc2 -[@befeleme]: https://github.com/befeleme -[@cjauvin]: https://github.com/cjauvin -[@eaf]: https://github.com/eaf -[@earlbread]: https://github.com/earlbread -[@eekstunt]: https://github.com/eekstunt -[@eggplants]: https://github.com/@eggplants -[@ekohl]: https://github.com/ekohl -[@elbehery95]: https://github.com/elbehery95 -[@eumiro]: https://github.com/eumiro -[@Flimm]: https://github.com/Flimm -[@freddyaboulton]: https://github.com/freddyaboulton -[@gergelyk]: https://github.com/gergelyk -[@gongqingkui]: https://github.com/gongqingkui -[@greyli]: https://github.com/greyli -[@harveer07]: https://github.com/@harveer07 -[@jadutter]: https://github.com/jadutter -[@jankislinger]: https://github.com/jankislinger -[@jctanner]: https://github.com/jctanner -[@larsks]: https://github.com/@larsks -[@lsmith77]: https://github.com/lsmith77 -[@mgorny]: https://github.com/mgorny -[@naorlivne]: https://github.com/@naorlivne -[@Nicals]: https://github.com/Nicals -[@Nougat-Waffle]: https://github.com/Nougat-Waffle -[@qnighy]: https://github.com/qnighy -[@Qwerty-133]: https://github.com/Qwerty-133 -[@rabinadk1]: https://github.com/@rabinadk1 -[@sammck]: https://github.com/@sammck -[@samwyma]: https://github.com/samwyma -[@snobu]: https://github.com/snobu -[@techalchemy]: https://github.com/techalchemy -[@theGOTOguy]: https://github.com/theGOTOguy -[@theskumar]: https://github.com/theskumar -[@ulyssessouza]: https://github.com/ulyssessouza -[@venthur]: https://github.com/venthur -[@x-yuri]: https://github.com/x-yuri -[@yannham]: https://github.com/yannham -[@zueve]: https://github.com/zueve -[@randomseed42]: https://github.com/zueve -[@wrongontheinternet]: https://github.com/wrongontheinternet - -[Unreleased]: https://github.com/theskumar/python-dotenv/compare/v1.1.1...HEAD -[1.1.1]: https://github.com/theskumar/python-dotenv/compare/v1.1.0...1.1.1 -[1.1.0]: https://github.com/theskumar/python-dotenv/compare/v1.0.1...v1.1.0 -[1.0.1]: https://github.com/theskumar/python-dotenv/compare/v1.0.0...v1.0.1 -[1.0.0]: https://github.com/theskumar/python-dotenv/compare/v0.21.0...v1.0.0 -[0.21.1]: https://github.com/theskumar/python-dotenv/compare/v0.21.0...v0.21.1 -[0.21.0]: https://github.com/theskumar/python-dotenv/compare/v0.20.0...v0.21.0 -[0.20.0]: https://github.com/theskumar/python-dotenv/compare/v0.19.2...v0.20.0 -[0.19.2]: https://github.com/theskumar/python-dotenv/compare/v0.19.1...v0.19.2 -[0.19.1]: https://github.com/theskumar/python-dotenv/compare/v0.19.0...v0.19.1 -[0.19.0]: https://github.com/theskumar/python-dotenv/compare/v0.18.0...v0.19.0 -[0.18.0]: https://github.com/theskumar/python-dotenv/compare/v0.17.1...v0.18.0 -[0.17.1]: https://github.com/theskumar/python-dotenv/compare/v0.17.0...v0.17.1 -[0.17.0]: https://github.com/theskumar/python-dotenv/compare/v0.16.0...v0.17.0 -[0.16.0]: https://github.com/theskumar/python-dotenv/compare/v0.15.0...v0.16.0 -[0.15.0]: https://github.com/theskumar/python-dotenv/compare/v0.14.0...v0.15.0 -[0.14.0]: https://github.com/theskumar/python-dotenv/compare/v0.13.0...v0.14.0 -[0.13.0]: https://github.com/theskumar/python-dotenv/compare/v0.12.0...v0.13.0 -[0.12.0]: https://github.com/theskumar/python-dotenv/compare/v0.11.0...v0.12.0 -[0.11.0]: https://github.com/theskumar/python-dotenv/compare/v0.10.5...v0.11.0 -[0.10.5]: https://github.com/theskumar/python-dotenv/compare/v0.10.4...v0.10.5 -[0.10.4]: https://github.com/theskumar/python-dotenv/compare/v0.10.3...v0.10.4 diff --git a/venv/lib/python3.12/site-packages/python_dotenv-1.1.1.dist-info/RECORD b/venv/lib/python3.12/site-packages/python_dotenv-1.1.1.dist-info/RECORD deleted file mode 100644 index 4d88563..0000000 --- a/venv/lib/python3.12/site-packages/python_dotenv-1.1.1.dist-info/RECORD +++ /dev/null @@ -1,25 +0,0 @@ -../../../bin/dotenv,sha256=cc2Db74ywTmAPrYXb4cnhrVUF7IsrmbyZr9yJE_VEG4,262 -dotenv/__init__.py,sha256=WBU5SfSiKAhS3hzu17ykNuuwbuwyDCX91Szv4vUeOuM,1292 -dotenv/__main__.py,sha256=N0RhLG7nHIqtlJHwwepIo-zbJPNx9sewCCRGY528h_4,129 -dotenv/__pycache__/__init__.cpython-312.pyc,, -dotenv/__pycache__/__main__.cpython-312.pyc,, -dotenv/__pycache__/cli.cpython-312.pyc,, -dotenv/__pycache__/ipython.cpython-312.pyc,, -dotenv/__pycache__/main.cpython-312.pyc,, -dotenv/__pycache__/parser.cpython-312.pyc,, -dotenv/__pycache__/variables.cpython-312.pyc,, -dotenv/__pycache__/version.cpython-312.pyc,, -dotenv/cli.py,sha256=ut83SItbWcmEahAkSOzkHqvRKhqhj0tA53vcXpyleOM,6197 -dotenv/ipython.py,sha256=avI6aez_RxnBptYgchIquF2TSgKI-GOhY3ppiu3VuWE,1303 -dotenv/main.py,sha256=HJgkS0XZcd0f2VZaVGxlUcrOEhqBcmQ6Lz9hQrMfaus,12467 -dotenv/parser.py,sha256=QgU5HwMwM2wMqt0vz6dHTJ4nzPmwqRqvi4MSyeVifgU,5186 -dotenv/py.typed,sha256=8PjyZ1aVoQpRVvt71muvuq5qE-jTFZkK-GLHkhdebmc,26 -dotenv/variables.py,sha256=CD0qXOvvpB3q5RpBQMD9qX6vHX7SyW-SuiwGMFSlt08,2348 -dotenv/version.py,sha256=q8_5C0f-8mHWNb6mMw02zlYPnEGXBqvOmP3z0CEwZKM,22 -python_dotenv-1.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -python_dotenv-1.1.1.dist-info/METADATA,sha256=dELvSKXwZ-NbQKAe-k-uJM8khmVN8ZM92B5tyY801yY,24628 -python_dotenv-1.1.1.dist-info/RECORD,, -python_dotenv-1.1.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91 -python_dotenv-1.1.1.dist-info/entry_points.txt,sha256=yRl1rCbswb1nQTQ_gZRlCw5QfabztUGnfGWLhlXFNdI,47 -python_dotenv-1.1.1.dist-info/licenses/LICENSE,sha256=gGGbcEnwjIFoOtDgHwjyV6hAZS3XHugxRtNmWMfSwrk,1556 -python_dotenv-1.1.1.dist-info/top_level.txt,sha256=eyqUH4SHJNr6ahOYlxIunTr4XinE8Z5ajWLdrK3r0D8,7 diff --git a/venv/lib/python3.12/site-packages/python_dotenv-1.1.1.dist-info/WHEEL b/venv/lib/python3.12/site-packages/python_dotenv-1.1.1.dist-info/WHEEL deleted file mode 100644 index e7fa31b..0000000 --- a/venv/lib/python3.12/site-packages/python_dotenv-1.1.1.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (80.9.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/venv/lib/python3.12/site-packages/python_dotenv-1.1.1.dist-info/entry_points.txt b/venv/lib/python3.12/site-packages/python_dotenv-1.1.1.dist-info/entry_points.txt deleted file mode 100644 index 0a86823..0000000 --- a/venv/lib/python3.12/site-packages/python_dotenv-1.1.1.dist-info/entry_points.txt +++ /dev/null @@ -1,2 +0,0 @@ -[console_scripts] -dotenv = dotenv.__main__:cli diff --git a/venv/lib/python3.12/site-packages/python_dotenv-1.1.1.dist-info/licenses/LICENSE b/venv/lib/python3.12/site-packages/python_dotenv-1.1.1.dist-info/licenses/LICENSE deleted file mode 100644 index 3a97119..0000000 --- a/venv/lib/python3.12/site-packages/python_dotenv-1.1.1.dist-info/licenses/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2014, Saurabh Kumar (python-dotenv), 2013, Ted Tieken (django-dotenv-rw), 2013, Jacob Kaplan-Moss (django-dotenv) - -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 django-dotenv nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/venv/lib/python3.12/site-packages/python_dotenv-1.1.1.dist-info/top_level.txt b/venv/lib/python3.12/site-packages/python_dotenv-1.1.1.dist-info/top_level.txt deleted file mode 100644 index fe7c01a..0000000 --- a/venv/lib/python3.12/site-packages/python_dotenv-1.1.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -dotenv diff --git a/venv/lib/python3.12/site-packages/python_telegram_bot-22.2.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/python_telegram_bot-22.2.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.12/site-packages/python_telegram_bot-22.2.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/python_telegram_bot-22.2.dist-info/METADATA b/venv/lib/python3.12/site-packages/python_telegram_bot-22.2.dist-info/METADATA deleted file mode 100644 index e4524f3..0000000 --- a/venv/lib/python3.12/site-packages/python_telegram_bot-22.2.dist-info/METADATA +++ /dev/null @@ -1,302 +0,0 @@ -Metadata-Version: 2.4 -Name: python-telegram-bot -Version: 22.2 -Summary: We have made you a wrapper you can't refuse -Project-URL: Homepage, https://python-telegram-bot.org -Project-URL: Documentation, https://docs.python-telegram-bot.org -Project-URL: Bug Tracker, https://github.com/python-telegram-bot/python-telegram-bot/issues -Project-URL: Source Code, https://github.com/python-telegram-bot/python-telegram-bot -Project-URL: News, https://t.me/pythontelegrambotchannel -Project-URL: Changelog, https://docs.python-telegram-bot.org/en/stable/changelog.html -Project-URL: Support, https://t.me/pythontelegrambotgroup -Author-email: Leandro Toledo <devs@python-telegram-bot.org> -License-Expression: LGPL-3.0-only -License-File: LICENSE -License-File: LICENSE.dual -License-File: LICENSE.lesser -Keywords: api,bot,python,telegram,wrapper -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3) -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -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: Topic :: Communications :: Chat -Classifier: Topic :: Internet -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Requires-Python: >=3.9 -Requires-Dist: httpx<0.29,>=0.27 -Provides-Extra: all -Requires-Dist: aiolimiter<1.3,>=1.1; extra == 'all' -Requires-Dist: apscheduler<3.12.0,>=3.10.4; extra == 'all' -Requires-Dist: cachetools<6.2.0,>=5.3.3; extra == 'all' -Requires-Dist: cffi>=1.17.0rc1; (python_version > '3.12') and extra == 'all' -Requires-Dist: cryptography!=3.4,!=3.4.1,!=3.4.2,!=3.4.3,>=39.0.1; extra == 'all' -Requires-Dist: httpx[http2]; extra == 'all' -Requires-Dist: httpx[socks]; extra == 'all' -Requires-Dist: tornado~=6.5; extra == 'all' -Provides-Extra: callback-data -Requires-Dist: cachetools<6.2.0,>=5.3.3; extra == 'callback-data' -Provides-Extra: ext -Requires-Dist: aiolimiter<1.3,>=1.1; extra == 'ext' -Requires-Dist: apscheduler<3.12.0,>=3.10.4; extra == 'ext' -Requires-Dist: cachetools<6.2.0,>=5.3.3; extra == 'ext' -Requires-Dist: tornado~=6.5; extra == 'ext' -Provides-Extra: http2 -Requires-Dist: httpx[http2]; extra == 'http2' -Provides-Extra: job-queue -Requires-Dist: apscheduler<3.12.0,>=3.10.4; extra == 'job-queue' -Provides-Extra: passport -Requires-Dist: cffi>=1.17.0rc1; (python_version > '3.12') and extra == 'passport' -Requires-Dist: cryptography!=3.4,!=3.4.1,!=3.4.2,!=3.4.3,>=39.0.1; extra == 'passport' -Provides-Extra: rate-limiter -Requires-Dist: aiolimiter<1.3,>=1.1; extra == 'rate-limiter' -Provides-Extra: socks -Requires-Dist: httpx[socks]; extra == 'socks' -Provides-Extra: webhooks -Requires-Dist: tornado~=6.5; extra == 'webhooks' -Description-Content-Type: text/x-rst - -.. image:: https://raw.githubusercontent.com/python-telegram-bot/logos/master/logo-text/png/ptb-logo-text_768.png - :align: center - :target: https://python-telegram-bot.org - :alt: python-telegram-bot Logo - -.. image:: https://img.shields.io/pypi/v/python-telegram-bot.svg - :target: https://pypi.org/project/python-telegram-bot/ - :alt: PyPi Package Version - -.. image:: https://img.shields.io/pypi/pyversions/python-telegram-bot.svg - :target: https://pypi.org/project/python-telegram-bot/ - :alt: Supported Python versions - -.. image:: https://img.shields.io/badge/Bot%20API-9.0-blue?logo=telegram - :target: https://core.telegram.org/bots/api-changelog - :alt: Supported Bot API version - -.. image:: https://img.shields.io/pypi/dm/python-telegram-bot - :target: https://pypistats.org/packages/python-telegram-bot - :alt: PyPi Package Monthly Download - -.. image:: https://app.readthedocs.org/projects/python-telegram-bot/badge/?version=stable - :target: https://docs.python-telegram-bot.org/en/stable/ - :alt: Documentation Status - -.. image:: https://img.shields.io/pypi/l/python-telegram-bot.svg - :target: https://www.gnu.org/licenses/lgpl-3.0.html - :alt: LGPLv3 License - -.. image:: https://github.com/python-telegram-bot/python-telegram-bot/actions/workflows/unit_tests.yml/badge.svg?branch=master - :target: https://github.com/python-telegram-bot/python-telegram-bot/ - :alt: Github Actions workflow - -.. image:: https://codecov.io/gh/python-telegram-bot/python-telegram-bot/branch/master/graph/badge.svg - :target: https://app.codecov.io/gh/python-telegram-bot/python-telegram-bot - :alt: Code coverage - -.. image:: https://isitmaintained.com/badge/resolution/python-telegram-bot/python-telegram-bot.svg - :target: https://isitmaintained.com/project/python-telegram-bot/python-telegram-bot - :alt: Median time to resolve an issue - -.. image:: https://api.codacy.com/project/badge/Grade/99d901eaa09b44b4819aec05c330c968 - :target: https://app.codacy.com/gh/python-telegram-bot/python-telegram-bot/dashboard - :alt: Code quality: Codacy - -.. image:: https://results.pre-commit.ci/badge/github/python-telegram-bot/python-telegram-bot/master.svg - :target: https://results.pre-commit.ci/latest/github/python-telegram-bot/python-telegram-bot/master - :alt: pre-commit.ci status - -.. image:: https://img.shields.io/badge/code%20style-black-000000.svg - :target: https://github.com/psf/black - :alt: Code Style: Black - -.. image:: https://img.shields.io/badge/Telegram-Channel-blue.svg?logo=telegram - :target: https://t.me/pythontelegrambotchannel - :alt: Telegram Channel - -.. image:: https://img.shields.io/badge/Telegram-Group-blue.svg?logo=telegram - :target: https://telegram.me/pythontelegrambotgroup - :alt: Telegram Group - -We have made you a wrapper you can't refuse - -We have a vibrant community of developers helping each other in our `Telegram group <https://telegram.me/pythontelegrambotgroup>`_. Join us! - -*Stay tuned for library updates and new releases on our* `Telegram Channel <https://telegram.me/pythontelegrambotchannel>`_. - -Introduction ------------- - -This library provides a pure Python, asynchronous interface for the -`Telegram Bot API <https://core.telegram.org/bots/api>`_. -It's compatible with Python versions **3.9+**. - -In addition to the pure API implementation, this library features several convenience methods and shortcuts as well as a number of high-level classes to -make the development of bots easy and straightforward. These classes are contained in the -``telegram.ext`` submodule. - -After installing_ the library, be sure to check out the section on `working with PTB`_. - -Telegram API support -~~~~~~~~~~~~~~~~~~~~ - -All types and methods of the Telegram Bot API **9.0** are natively supported by this library. -In addition, Bot API functionality not yet natively included can still be used as described `in our wiki <https://github.com/python-telegram-bot/python-telegram-bot/wiki/Bot-API-Forward-Compatibility>`_. - -Notable Features -~~~~~~~~~~~~~~~~ - -- `Fully asynchronous <https://github.com/python-telegram-bot/python-telegram-bot/wiki/Concurrency>`_ -- Convenient shortcut methods, e.g. `Message.reply_text <https://docs.python-telegram-bot.org/en/stable/telegram.message.html#telegram.Message.reply_text>`_ -- `Fully annotated with static type hints <https://github.com/python-telegram-bot/python-telegram-bot/wiki/Type-Checking>`_ -- `Customizable and extendable interface <https://github.com/python-telegram-bot/python-telegram-bot/wiki/Architecture>`_ -- Seamless integration with `webhooks <https://github.com/python-telegram-bot/python-telegram-bot/wiki/Webhooks>`_ and `polling <https://docs.python-telegram-bot.org/en/stable/telegram.ext.application.html#telegram.ext.Application.run_polling>`_ -- `Comprehensive documentation and examples <#working-with-ptb>`_ - -Installing ----------- - -You can install or upgrade ``python-telegram-bot`` via - -.. code:: shell - - $ pip install python-telegram-bot --upgrade - -To install a pre-release, use the ``--pre`` `flag <https://pip.pypa.io/en/stable/cli/pip_install/#cmdoption-pre>`_ in addition. - -You can also install ``python-telegram-bot`` from source, though this is usually not necessary. - -.. code:: shell - - $ git clone https://github.com/python-telegram-bot/python-telegram-bot - $ cd python-telegram-bot - $ pip install build - $ python -m build - -You can also use your favored package manager (such as ``uv``, ``hatch``, ``poetry``, etc.) instead of ``pip``. - -Verifying Releases -~~~~~~~~~~~~~~~~~~ - -To enable you to verify that a release file that you downloaded was indeed provided by the ``python-telegram-bot`` team, we have taken the following measures. - -Starting with v21.4, all releases are signed via `sigstore <https://www.sigstore.dev>`_. -The corresponding signature files are uploaded to the `GitHub releases page`_. -To verify the signature, please install the `sigstore Python client <https://pypi.org/project/sigstore/>`_ and follow the instructions for `verifying signatures from GitHub Actions <https://github.com/sigstore/sigstore-python?tab=readme-ov-file>`_. As input for the ``--repository`` parameter, please use the value ``python-telegram-bot/python-telegram-bot``. - -Earlier releases are signed with a GPG key. -The signatures are uploaded to both the `GitHub releases page`_ and the `PyPI project <https://pypi.org/project/python-telegram-bot/>`_ and end with a suffix ``.asc``. -Please find the public keys `here <https://github.com/python-telegram-bot/python-telegram-bot/tree/master/public_keys>`_. -The keys are named in the format ``<first_version>-<last_version>.gpg``. - -In addition, the GitHub release page also contains the sha1 hashes of the release files in the files with the suffix ``.sha1``. - -Dependencies & Their Versions -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -``python-telegram-bot`` tries to use as few 3rd party dependencies as possible. -However, for some features using a 3rd party library is more sane than implementing the functionality again. -As these features are *optional*, the corresponding 3rd party dependencies are not installed by default. -Instead, they are listed as optional dependencies. -This allows to avoid unnecessary dependency conflicts for users who don't need the optional features. - -The only required dependency is `httpx >=0.27,<0.29 <https://www.python-httpx.org>`_ for -``telegram.request.HTTPXRequest``, the default networking backend. - -``python-telegram-bot`` is most useful when used along with additional libraries. -To minimize dependency conflicts, we try to be liberal in terms of version requirements on the (optional) dependencies. -On the other hand, we have to ensure stability of ``python-telegram-bot``, which is why we do apply version bounds. -If you encounter dependency conflicts due to these bounds, feel free to reach out. - -Optional Dependencies -##################### - -PTB can be installed with optional dependencies: - -* ``pip install "python-telegram-bot[passport]"`` installs the `cryptography>=39.0.1 <https://cryptography.io/en/stable>`_ library. Use this, if you want to use Telegram Passport related functionality. -* ``pip install "python-telegram-bot[socks]"`` installs `httpx[socks] <https://www.python-httpx.org/#dependencies>`_. Use this, if you want to work behind a Socks5 server. -* ``pip install "python-telegram-bot[http2]"`` installs `httpx[http2] <https://www.python-httpx.org/#dependencies>`_. Use this, if you want to use HTTP/2. -* ``pip install "python-telegram-bot[rate-limiter]"`` installs `aiolimiter~=1.1,<1.3 <https://aiolimiter.readthedocs.io/en/stable/>`_. Use this, if you want to use ``telegram.ext.AIORateLimiter``. -* ``pip install "python-telegram-bot[webhooks]"`` installs the `tornado~=6.4 <https://www.tornadoweb.org/en/stable/>`_ library. Use this, if you want to use ``telegram.ext.Updater.start_webhook``/``telegram.ext.Application.run_webhook``. -* ``pip install "python-telegram-bot[callback-data]"`` installs the `cachetools>=5.3.3,<6.2.0 <https://cachetools.readthedocs.io/en/latest/>`_ library. Use this, if you want to use `arbitrary callback_data <https://github.com/python-telegram-bot/python-telegram-bot/wiki/Arbitrary-callback_data>`_. -* ``pip install "python-telegram-bot[job-queue]"`` installs the `APScheduler>=3.10.4,<3.12.0 <https://apscheduler.readthedocs.io/en/3.x/>`_ library. Use this, if you want to use the ``telegram.ext.JobQueue``. - -To install multiple optional dependencies, separate them by commas, e.g. ``pip install "python-telegram-bot[socks,webhooks]"``. - -Additionally, two shortcuts are provided: - -* ``pip install "python-telegram-bot[all]"`` installs all optional dependencies. -* ``pip install "python-telegram-bot[ext]"`` installs all optional dependencies that are related to ``telegram.ext``, i.e. ``[rate-limiter, webhooks, callback-data, job-queue]``. - -Working with PTB ----------------- - -Once you have installed the library, you can begin working with it - so let's get started! - -Quick Start -~~~~~~~~~~~ - -Our Wiki contains an `Introduction to the API <https://github.com/python-telegram-bot/python-telegram-bot/wiki/Introduction-to-the-API>`_ explaining how the pure Bot API can be accessed via ``python-telegram-bot``. -Moreover, the `Tutorial: Your first Bot <https://github.com/python-telegram-bot/python-telegram-bot/wiki/Extensions---Your-first-Bot>`_ gives an introduction on how chatbots can be easily programmed with the help of the ``telegram.ext`` module. - -Resources -~~~~~~~~~ - -- The `package documentation <https://docs.python-telegram-bot.org/>`_ is the technical reference for ``python-telegram-bot``. - It contains descriptions of all available classes, modules, methods and arguments as well as the `changelog <https://docs.python-telegram-bot.org/changelog.html>`_. -- The `wiki <https://github.com/python-telegram-bot/python-telegram-bot/wiki/>`_ is home to number of more elaborate introductions of the different features of ``python-telegram-bot`` and other useful resources that go beyond the technical documentation. -- Our `examples section <https://docs.python-telegram-bot.org/examples.html>`_ contains several examples that showcase the different features of both the Bot API and ``python-telegram-bot``. - Even if it is not your approach for learning, please take a look at ``echobot.py``. It is the de facto base for most of the bots out there. - The code for these examples is released to the public domain, so you can start by grabbing the code and building on top of it. -- The `official Telegram Bot API documentation <https://core.telegram.org/bots/api>`_ is of course always worth a read. - -Getting help -~~~~~~~~~~~~ - -If the resources mentioned above don't answer your questions or simply overwhelm you, there are several ways of getting help. - -1. We have a vibrant community of developers helping each other in our `Telegram group <https://telegram.me/pythontelegrambotgroup>`_. Join us! Asking a question here is often the quickest way to get a pointer in the right direction. - -2. Ask questions by opening `a discussion <https://github.com/python-telegram-bot/python-telegram-bot/discussions/new>`_. - -3. You can even ask for help on Stack Overflow using the `python-telegram-bot tag <https://stackoverflow.com/questions/tagged/python-telegram-bot>`_. - -Concurrency -~~~~~~~~~~~ - -Since v20.0, ``python-telegram-bot`` is built on top of Pythons ``asyncio`` module. -Because ``asyncio`` is in general single-threaded, ``python-telegram-bot`` does currently not aim to be thread-safe. -Noteworthy parts of ``python-telegram-bots`` API that are likely to cause issues (e.g. race conditions) when used in a multi-threaded setting include: - -* ``telegram.ext.Application/Updater.update_queue`` -* ``telegram.ext.ConversationHandler.check/handle_update`` -* ``telegram.ext.CallbackDataCache`` -* ``telegram.ext.BasePersistence`` -* all classes in the ``telegram.ext.filters`` module that allow to add/remove allowed users/chats at runtime - -Contributing ------------- - -Contributions of all sizes are welcome. -Please review our `contribution guidelines <https://github.com/python-telegram-bot/python-telegram-bot/blob/master/.github/CONTRIBUTING.rst>`_ to get started. -You can also help by `reporting bugs or feature requests <https://github.com/python-telegram-bot/python-telegram-bot/issues/new/choose>`_. - -Donating --------- -Occasionally we are asked if we accept donations to support the development. -While we appreciate the thought, maintaining PTB is our hobby, and we have almost no running costs for it. We therefore have nothing set up to accept donations. -If you still want to donate, we kindly ask you to donate to another open source project/initiative of your choice instead. - -License -------- - -You may copy, distribute and modify the software provided that modifications are described and licensed for free under `LGPL-3 <https://www.gnu.org/licenses/lgpl-3.0.html>`_. -Derivative works (including modifications or anything statically linked to the library) can only be redistributed under LGPL-3, but applications that use the library don't have to be. - -.. _`GitHub releases page`: https://github.com/python-telegram-bot/python-telegram-bot/releases diff --git a/venv/lib/python3.12/site-packages/python_telegram_bot-22.2.dist-info/RECORD b/venv/lib/python3.12/site-packages/python_telegram_bot-22.2.dist-info/RECORD deleted file mode 100644 index 956ecd1..0000000 --- a/venv/lib/python3.12/site-packages/python_telegram_bot-22.2.dist-info/RECORD +++ /dev/null @@ -1,443 +0,0 @@ -python_telegram_bot-22.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -python_telegram_bot-22.2.dist-info/METADATA,sha256=jApQzWuMqvpuFxTmPAh27TIUycjl5pZMNG0Q-Rv7wU0,17216 -python_telegram_bot-22.2.dist-info/RECORD,, -python_telegram_bot-22.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -python_telegram_bot-22.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87 -python_telegram_bot-22.2.dist-info/licenses/LICENSE,sha256=rY-GA-hD-Jc4hTE-PaXmPl1SLVDDqHaHXUuWu_tJ4RI,32422 -python_telegram_bot-22.2.dist-info/licenses/LICENSE.dual,sha256=eblsAdLmpvSxNh8leJceEVCwU7rNitnIgMs8X_kIEd8,40192 -python_telegram_bot-22.2.dist-info/licenses/LICENSE.lesser,sha256=jhxgj_Bo2unwLKfth30xD0h3N28guEWKtWgVIpcDHvw,7651 -telegram/__init__.py,sha256=aNnDEHWyZphvNthJpyb0THa3rC4_loJLyTfqeN6rXZE,19516 -telegram/__main__.py,sha256=0ejHx4Zy-YWEo9IS93HKE9Smd0iGg4BANp1lrxvQUGg,1857 -telegram/__pycache__/__init__.cpython-312.pyc,, -telegram/__pycache__/__main__.cpython-312.pyc,, -telegram/__pycache__/_birthdate.cpython-312.pyc,, -telegram/__pycache__/_bot.cpython-312.pyc,, -telegram/__pycache__/_botcommand.cpython-312.pyc,, -telegram/__pycache__/_botcommandscope.cpython-312.pyc,, -telegram/__pycache__/_botdescription.cpython-312.pyc,, -telegram/__pycache__/_botname.cpython-312.pyc,, -telegram/__pycache__/_business.cpython-312.pyc,, -telegram/__pycache__/_callbackquery.cpython-312.pyc,, -telegram/__pycache__/_chat.cpython-312.pyc,, -telegram/__pycache__/_chatadministratorrights.cpython-312.pyc,, -telegram/__pycache__/_chatbackground.cpython-312.pyc,, -telegram/__pycache__/_chatboost.cpython-312.pyc,, -telegram/__pycache__/_chatfullinfo.cpython-312.pyc,, -telegram/__pycache__/_chatinvitelink.cpython-312.pyc,, -telegram/__pycache__/_chatjoinrequest.cpython-312.pyc,, -telegram/__pycache__/_chatlocation.cpython-312.pyc,, -telegram/__pycache__/_chatmember.cpython-312.pyc,, -telegram/__pycache__/_chatmemberupdated.cpython-312.pyc,, -telegram/__pycache__/_chatpermissions.cpython-312.pyc,, -telegram/__pycache__/_choseninlineresult.cpython-312.pyc,, -telegram/__pycache__/_copytextbutton.cpython-312.pyc,, -telegram/__pycache__/_dice.cpython-312.pyc,, -telegram/__pycache__/_forcereply.cpython-312.pyc,, -telegram/__pycache__/_forumtopic.cpython-312.pyc,, -telegram/__pycache__/_gifts.cpython-312.pyc,, -telegram/__pycache__/_giveaway.cpython-312.pyc,, -telegram/__pycache__/_keyboardbutton.cpython-312.pyc,, -telegram/__pycache__/_keyboardbuttonpolltype.cpython-312.pyc,, -telegram/__pycache__/_keyboardbuttonrequest.cpython-312.pyc,, -telegram/__pycache__/_linkpreviewoptions.cpython-312.pyc,, -telegram/__pycache__/_loginurl.cpython-312.pyc,, -telegram/__pycache__/_menubutton.cpython-312.pyc,, -telegram/__pycache__/_message.cpython-312.pyc,, -telegram/__pycache__/_messageautodeletetimerchanged.cpython-312.pyc,, -telegram/__pycache__/_messageentity.cpython-312.pyc,, -telegram/__pycache__/_messageid.cpython-312.pyc,, -telegram/__pycache__/_messageorigin.cpython-312.pyc,, -telegram/__pycache__/_messagereactionupdated.cpython-312.pyc,, -telegram/__pycache__/_ownedgift.cpython-312.pyc,, -telegram/__pycache__/_paidmedia.cpython-312.pyc,, -telegram/__pycache__/_paidmessagepricechanged.cpython-312.pyc,, -telegram/__pycache__/_poll.cpython-312.pyc,, -telegram/__pycache__/_proximityalerttriggered.cpython-312.pyc,, -telegram/__pycache__/_reaction.cpython-312.pyc,, -telegram/__pycache__/_reply.cpython-312.pyc,, -telegram/__pycache__/_replykeyboardmarkup.cpython-312.pyc,, -telegram/__pycache__/_replykeyboardremove.cpython-312.pyc,, -telegram/__pycache__/_sentwebappmessage.cpython-312.pyc,, -telegram/__pycache__/_shared.cpython-312.pyc,, -telegram/__pycache__/_story.cpython-312.pyc,, -telegram/__pycache__/_storyarea.cpython-312.pyc,, -telegram/__pycache__/_switchinlinequerychosenchat.cpython-312.pyc,, -telegram/__pycache__/_telegramobject.cpython-312.pyc,, -telegram/__pycache__/_uniquegift.cpython-312.pyc,, -telegram/__pycache__/_update.cpython-312.pyc,, -telegram/__pycache__/_user.cpython-312.pyc,, -telegram/__pycache__/_userprofilephotos.cpython-312.pyc,, -telegram/__pycache__/_version.cpython-312.pyc,, -telegram/__pycache__/_videochat.cpython-312.pyc,, -telegram/__pycache__/_webappdata.cpython-312.pyc,, -telegram/__pycache__/_webappinfo.cpython-312.pyc,, -telegram/__pycache__/_webhookinfo.cpython-312.pyc,, -telegram/__pycache__/_writeaccessallowed.cpython-312.pyc,, -telegram/__pycache__/constants.cpython-312.pyc,, -telegram/__pycache__/error.cpython-312.pyc,, -telegram/__pycache__/helpers.cpython-312.pyc,, -telegram/__pycache__/warnings.cpython-312.pyc,, -telegram/_birthdate.py,sha256=dXURp_xNK7NNMen0jqAsEzLBlgWWDEayvrClslJW4zc,3019 -telegram/_bot.py,sha256=GE16SrACDVpsBBx8J_15l_rT5afAUJKnSN0G66Nn6Ys,474101 -telegram/_botcommand.py,sha256=-cC7_D3MNDg0P1Z0SpogUfe9m5NjZw-70-zJHUJWodc,3273 -telegram/_botcommandscope.py,sha256=4qWBYegLap4CZZOnmHtdKyv9y03VhoH_4s0IeoDyCII,10545 -telegram/_botdescription.py,sha256=Hlql0xjqmDJg6iY10tqCoRY1jX5i1x9k4JnpFmi-2jU,2511 -telegram/_botname.py,sha256=-5ZBG9zCGnFb4V3GufwuxoAen1iwK1IrPhGEU90BTk0,1805 -telegram/_business.py,sha256=eykHnl2zU7M0KNiei8f9tfVf62psnKsi-nv1x984hVQ,25185 -telegram/_callbackquery.py,sha256=yUkCN-bb97j1subz2cTd4IKDvK1Kyp9RohR5JvaHP48,34438 -telegram/_chat.py,sha256=zNcmCuS1lBKQ3mSduq04ePO5M7DPxeW79C21choamrc,138087 -telegram/_chatadministratorrights.py,sha256=atiBFFtwPtTV783pE7_hLYeLALjB0bXuqyRo6Pn131o,11560 -telegram/_chatbackground.py,sha256=69GSt0Psnn5nQ9Gngiv__6mGhT8UhHY3E_Z2gOpjgqg,19535 -telegram/_chatboost.py,sha256=oFC1qbVc-TAJJFzKdzxlsIpxIByf4YeB2ZxwXFhhi1Q,16096 -telegram/_chatfullinfo.py,sha256=gGh_0W4VUJAPYoZcWUTgaH0SAE_iXQ4_LwwAj_x3YGY,30872 -telegram/_chatinvitelink.py,sha256=UyhmNLqsBwSR3qrwWXYV8ReAbzLOy0T5dBKOXg7uGmw,8464 -telegram/_chatjoinrequest.py,sha256=InkTY_WABO7JpMYk1t8sy03nNOTXJCGKYkptOUt_VHU,8785 -telegram/_chatlocation.py,sha256=7OV8Kuqceb3v8EkF8iptFP64Ld-7yWlsVwWESYJbGd4,3318 -telegram/_chatmember.py,sha256=kYDhr007zjiP4s5Rw9fKLv6Gd5ySBEWF7ZmclFGxtfQ,27515 -telegram/_chatmemberupdated.py,sha256=NzXuuJf9jPcX5LZP2qsTI_JNTGvQADooYHhOMPV51-Q,8657 -telegram/_chatpermissions.py,sha256=l3CqJOYrOQ2zPaTIqP3GCGgdRFw6Q4It4WTvo5SwnTo,10868 -telegram/_choseninlineresult.py,sha256=xsEskMH5FYqUEm5rWk0lxZFO7_eJlhav5V7R0VDogOI,4306 -telegram/_copytextbutton.py,sha256=g6AwVFUEYE5Sz0qN6KgDaEMmyAwuCz_rIvBGS5RQEIA,2108 -telegram/_dice.py,sha256=JVB9ogh_VWY0ut7uYvyn4R-Fh11LEtdMyDtp-TaVxk4,6950 -telegram/_files/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -telegram/_files/__pycache__/__init__.cpython-312.pyc,, -telegram/_files/__pycache__/_basemedium.cpython-312.pyc,, -telegram/_files/__pycache__/_basethumbedmedium.cpython-312.pyc,, -telegram/_files/__pycache__/_inputstorycontent.cpython-312.pyc,, -telegram/_files/__pycache__/animation.cpython-312.pyc,, -telegram/_files/__pycache__/audio.cpython-312.pyc,, -telegram/_files/__pycache__/chatphoto.cpython-312.pyc,, -telegram/_files/__pycache__/contact.cpython-312.pyc,, -telegram/_files/__pycache__/document.cpython-312.pyc,, -telegram/_files/__pycache__/file.cpython-312.pyc,, -telegram/_files/__pycache__/inputfile.cpython-312.pyc,, -telegram/_files/__pycache__/inputmedia.cpython-312.pyc,, -telegram/_files/__pycache__/inputprofilephoto.cpython-312.pyc,, -telegram/_files/__pycache__/inputsticker.cpython-312.pyc,, -telegram/_files/__pycache__/location.cpython-312.pyc,, -telegram/_files/__pycache__/photosize.cpython-312.pyc,, -telegram/_files/__pycache__/sticker.cpython-312.pyc,, -telegram/_files/__pycache__/venue.cpython-312.pyc,, -telegram/_files/__pycache__/video.cpython-312.pyc,, -telegram/_files/__pycache__/videonote.cpython-312.pyc,, -telegram/_files/__pycache__/voice.cpython-312.pyc,, -telegram/_files/_basemedium.py,sha256=_zeUgKXNuiC5e4DzLPdPKcy25EbURcSelPIvgfAI9lo,3536 -telegram/_files/_basethumbedmedium.py,sha256=wFuwKVf_SEs8tDY4dd0BQ8nTGXvvttKFfjtq9cABCV8,3860 -telegram/_files/_inputstorycontent.py,sha256=qU-ZgDDXWa4aX6-p5bBUlLNtzg_D4XnylH_CSnE0pmo,7247 -telegram/_files/animation.py,sha256=3dNQAYxcIFz0fQl6t5H8a2gLFaNgNsQql0oAxDlR8GM,4943 -telegram/_files/audio.py,sha256=nitTOwl7gciZx3LihCSSyUw4CYKbPlanOO5_JD5eR9E,5158 -telegram/_files/chatphoto.py,sha256=BMwLG84Gh-5CaxmtdhcmgjRWyVfqQ2Ghz-frRD4Qo7g,7096 -telegram/_files/contact.py,sha256=GEarK_9iNCiJyv4vUmrwMGdAkQ6lE6LA8v5_GMH5Wvs,2720 -telegram/_files/document.py,sha256=Bxd3znFS3KXQpsYubgWHbjzy0Axl5MKOPyQ2Ijmkwpg,3600 -telegram/_files/file.py,sha256=WHeF04pn4TY5kp15kKj60ftv_LUYi9R0cCZmJO7G-kU,15847 -telegram/_files/inputfile.py,sha256=bIUk42XMm9vvb5ui6RJpXr6SQ2ECIXAuuOgTsa8cmL8,5965 -telegram/_files/inputmedia.py,sha256=igpEeoOxW1qqwgxNUtQ-xN4ArexpVdjanF-3y1KCMc0,37610 -telegram/_files/inputprofilephoto.py,sha256=BLFSWWhJrsI2bOWQTAMJ0H7OLUJUhZaH8LU0BP0gS0U,5051 -telegram/_files/inputsticker.py,sha256=RpyK8B818-5AiVWcAQQ0jRcFDoZwEGeXr76Xdgm9khA,5700 -telegram/_files/location.py,sha256=3LYL8QHu9e_pzFpC__YH9YRASFk1oyRHAcT9KYdOtbU,5366 -telegram/_files/photosize.py,sha256=U_xMAdYzB3g3qp-Qw23P-X6xWwehKvv-gyAAgW5CiKU,2826 -telegram/_files/sticker.py,sha256=Jqd1WYbPCIE7xxzBgK23XWkWgPAMAJMKbRjbRLG1hj8,15898 -telegram/_files/venue.py,sha256=9KGurvaYgVic3ZMxSVRFh-aAANlPQjQIYtfQAuHe_0o,4488 -telegram/_files/video.py,sha256=pGWKB_jaxj-65UjNNAd0_nkbGGm5y84T1QfLOubSRtI,6660 -telegram/_files/videonote.py,sha256=InGGls8zKptt1ZPWkLuVTS5102UdZu9zMm1urw_wbYc,4145 -telegram/_files/voice.py,sha256=3rEIrzMWiMGTsKaU0LzOUVNpK_pmzZlUhqosl1CrdUo,3668 -telegram/_forcereply.py,sha256=SBjE2HlTB4eYVgFr9QPufsmLjDNYOwmOaPL-x07q-aA,4535 -telegram/_forumtopic.py,sha256=k74-37dMu8ogh7FuzfIaNEHNHy_9JlRri8GoB9Td2l0,6965 -telegram/_games/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -telegram/_games/__pycache__/__init__.cpython-312.pyc,, -telegram/_games/__pycache__/callbackgame.cpython-312.pyc,, -telegram/_games/__pycache__/game.cpython-312.pyc,, -telegram/_games/__pycache__/gamehighscore.cpython-312.pyc,, -telegram/_games/callbackgame.py,sha256=HYcnymZZEe9P2hdopH4Eo9er-4_Prr11JC-nuyblxJ8,1309 -telegram/_games/game.py,sha256=IkLTaI6pVjdi_5AdheL3rD35P-kbvufeKBAhv2lx1jY,8210 -telegram/_games/gamehighscore.py,sha256=M5g5gHwXsLF4PsaazFG-e065a6s7UgYcVB2KQnUNwMQ,2540 -telegram/_gifts.py,sha256=PcysAdlvJHULTSZNrsAuPTP_yC5vCkAILIOTXUO4hwc,14109 -telegram/_giveaway.py,sha256=6bSEwdx2fllCYXNal39-qKqrf51w10OMDuDnei23tks,17040 -telegram/_inline/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -telegram/_inline/__pycache__/__init__.cpython-312.pyc,, -telegram/_inline/__pycache__/inlinekeyboardbutton.cpython-312.pyc,, -telegram/_inline/__pycache__/inlinekeyboardmarkup.cpython-312.pyc,, -telegram/_inline/__pycache__/inlinequery.cpython-312.pyc,, -telegram/_inline/__pycache__/inlinequeryresult.cpython-312.pyc,, -telegram/_inline/__pycache__/inlinequeryresultarticle.cpython-312.pyc,, -telegram/_inline/__pycache__/inlinequeryresultaudio.cpython-312.pyc,, -telegram/_inline/__pycache__/inlinequeryresultcachedaudio.cpython-312.pyc,, -telegram/_inline/__pycache__/inlinequeryresultcacheddocument.cpython-312.pyc,, -telegram/_inline/__pycache__/inlinequeryresultcachedgif.cpython-312.pyc,, -telegram/_inline/__pycache__/inlinequeryresultcachedmpeg4gif.cpython-312.pyc,, -telegram/_inline/__pycache__/inlinequeryresultcachedphoto.cpython-312.pyc,, -telegram/_inline/__pycache__/inlinequeryresultcachedsticker.cpython-312.pyc,, -telegram/_inline/__pycache__/inlinequeryresultcachedvideo.cpython-312.pyc,, -telegram/_inline/__pycache__/inlinequeryresultcachedvoice.cpython-312.pyc,, -telegram/_inline/__pycache__/inlinequeryresultcontact.cpython-312.pyc,, -telegram/_inline/__pycache__/inlinequeryresultdocument.cpython-312.pyc,, -telegram/_inline/__pycache__/inlinequeryresultgame.cpython-312.pyc,, -telegram/_inline/__pycache__/inlinequeryresultgif.cpython-312.pyc,, -telegram/_inline/__pycache__/inlinequeryresultlocation.cpython-312.pyc,, -telegram/_inline/__pycache__/inlinequeryresultmpeg4gif.cpython-312.pyc,, -telegram/_inline/__pycache__/inlinequeryresultphoto.cpython-312.pyc,, -telegram/_inline/__pycache__/inlinequeryresultsbutton.cpython-312.pyc,, -telegram/_inline/__pycache__/inlinequeryresultvenue.cpython-312.pyc,, -telegram/_inline/__pycache__/inlinequeryresultvideo.cpython-312.pyc,, -telegram/_inline/__pycache__/inlinequeryresultvoice.cpython-312.pyc,, -telegram/_inline/__pycache__/inputcontactmessagecontent.cpython-312.pyc,, -telegram/_inline/__pycache__/inputinvoicemessagecontent.cpython-312.pyc,, -telegram/_inline/__pycache__/inputlocationmessagecontent.cpython-312.pyc,, -telegram/_inline/__pycache__/inputmessagecontent.cpython-312.pyc,, -telegram/_inline/__pycache__/inputtextmessagecontent.cpython-312.pyc,, -telegram/_inline/__pycache__/inputvenuemessagecontent.cpython-312.pyc,, -telegram/_inline/__pycache__/preparedinlinemessage.cpython-312.pyc,, -telegram/_inline/inlinekeyboardbutton.py,sha256=GjLmIiJvbnHgvKNvpk8qgBBV5gWb_mueyw7x2fdbPb8,16312 -telegram/_inline/inlinekeyboardmarkup.py,sha256=Lox3P0-rlx2g1NZDOZlmg7ngSQ_yzh_rLy8pqOFMuwQ,5570 -telegram/_inline/inlinequery.py,sha256=-nGyYiYigY6liTjEvUuEBHqca9q4zypRlWLptzLj5Ao,9199 -telegram/_inline/inlinequeryresult.py,sha256=RLt3d2v6N7ZQBYr2oz9WjJr3w7z2rulfRNHbHEODGHo,2838 -telegram/_inline/inlinequeryresultarticle.py,sha256=fEuYSF-jmaC2GNR5wPhdJGPNB-TndG84BrJ8ov_Ojyw,5123 -telegram/_inline/inlinequeryresultaudio.py,sha256=51t5L879ya7-ViSW8WXKfMPSYz7T7YhQ49sMjJ_UzdU,6269 -telegram/_inline/inlinequeryresultcachedaudio.py,sha256=6X3JfWDriRwftldu9lWCT9PJ-DsSxUs-I307DsWPZys,5158 -telegram/_inline/inlinequeryresultcacheddocument.py,sha256=raTjKftOcEG7pug-Sk8WIRNmqoArLcGpkYIY3Iu_5oI,5686 -telegram/_inline/inlinequeryresultcachedgif.py,sha256=el5BUnn0Cjg5Bde1rSiBXTYfbPSdUv2xvup5N1AUtSI,5856 -telegram/_inline/inlinequeryresultcachedmpeg4gif.py,sha256=n-5_nkkXcOWDY1MDfc2HhPASNY4CcAs39WtVFDYXXEg,5947 -telegram/_inline/inlinequeryresultcachedphoto.py,sha256=V5UY7eAVMKfKJmnR2hNAly2olMAfbVmByYb2-qqnPWI,6112 -telegram/_inline/inlinequeryresultcachedsticker.py,sha256=akPCH9oJbflN-30oTl0JVPvID64omK3ghTDtPlTZd40,3659 -telegram/_inline/inlinequeryresultcachedvideo.py,sha256=7PqKWqo3GmN_8hSagjTsBXX5o61r2ExjmudC391Hgkc,6019 -telegram/_inline/inlinequeryresultcachedvoice.py,sha256=RWtttFdxUbFHvziKHTPf16D9lGpgHTQAG7_uvt3enzo,5371 -telegram/_inline/inlinequeryresultcontact.py,sha256=OJNKBKYAe4Isl5SNpwFMCZhE5KEjo49FnkgI5U5seew,5530 -telegram/_inline/inlinequeryresultdocument.py,sha256=Qxebral6pkTP508hKuR2so2UB8ZNtfiEhXO9aewOFC8,7163 -telegram/_inline/inlinequeryresultgame.py,sha256=obOjS--gze0T_UxVlce2YU66dschSwuBwscXkfftzu0,2735 -telegram/_inline/inlinequeryresultgif.py,sha256=qY9HMqORA-VjUyJrbUSGg0E6Af6pWSuY_x8eztOB76M,8277 -telegram/_inline/inlinequeryresultlocation.py,sha256=TdYu--gs8qBYKcgmgBIRL_4w_jz7_9GgZfuTd4tcheE,10035 -telegram/_inline/inlinequeryresultmpeg4gif.py,sha256=1IcmxY9Qw2MY74Nc1hFn3wKAEyiz_n_DOFsArCMr9kE,8387 -telegram/_inline/inlinequeryresultphoto.py,sha256=Fq80du55njrI5tSZ77z7NaE-P4gtBA2vKGCZJ-yAMUY,7105 -telegram/_inline/inlinequeryresultsbutton.py,sha256=hRAH4qLqYe099g-_5bQHjkyLYrS-iID7Owpve6ydxEs,5426 -telegram/_inline/inlinequeryresultvenue.py,sha256=vcJ545pGSTW0nelFWnSm4hzSsjhdVcqtqIflzq8xA08,7172 -telegram/_inline/inlinequeryresultvideo.py,sha256=gWNB6UY35RcMhMWEEgmLGR4vSfkpSma2KjH7tBUfA50,8676 -telegram/_inline/inlinequeryresultvoice.py,sha256=qhvbRWFhBjme5cJa_UzIsPlTgv7AM3ei2E-rtao9jC8,6161 -telegram/_inline/inputcontactmessagecontent.py,sha256=g5TUu4JZR1x0EfYnAqCIJA0cdHwLHtmsNXwdQnONFP0,2746 -telegram/_inline/inputinvoicemessagecontent.py,sha256=ecSL9_3HJoKEOYBx3D1soMZ-KpTVAOls0eWvt3yQXxk,14051 -telegram/_inline/inputlocationmessagecontent.py,sha256=0LQ-s4sKG0CPvuSnqwUJPoJ1v73CIgj9YTIgGd7Ie2Y,7299 -telegram/_inline/inputmessagecontent.py,sha256=lv845QzFPrFah-tufYetrN2zJR-onneLbquc7cPE4c8,1567 -telegram/_inline/inputtextmessagecontent.py,sha256=mS6YE4voMcZTY8txCTrHvc08rjPZnuydPU-OAZbbpuI,4822 -telegram/_inline/inputvenuemessagecontent.py,sha256=4AyUBDxpBqc2Ph_YNOQMdkegeOeaFg2fYmOQaIOpn8Q,4561 -telegram/_inline/preparedinlinemessage.py,sha256=Vd8-hvjuM1UumE-Plj1Ge_fVpsqjp-Ii1T7icOGSr8k,2944 -telegram/_keyboardbutton.py,sha256=RREyrg0Inx5vCr9apuRKHJVLMFYSHQ1LVVVz-x8Z838,9369 -telegram/_keyboardbuttonpolltype.py,sha256=3Lm4yBtTiCZQ9vse5q4dWpWsWDlyQxAkLaK1VlNMQpI,2547 -telegram/_keyboardbuttonrequest.py,sha256=e_Y2ejBls8fcqwAX-j5kwK8lYjjsZlEvUQ8Y8V7IzMI,12801 -telegram/_linkpreviewoptions.py,sha256=hdtRJw7WAlA7jfIhZXbXi2nwRd39tZF3kpiAEHAGvPY,4498 -telegram/_loginurl.py,sha256=8Ipi_5Yu-OZVTQt2vIGRkCYccjToo7IRUG7IzJBsSjo,5134 -telegram/_menubutton.py,sha256=B6bxRkiIU72opPfWnXEiNqqdIsHjCmNpUI-HpvBpCS4,7400 -telegram/_message.py,sha256=bj8TNQUVGNpBsdrFhJHNFBfBx5ShlYY5_q8IfrTTgg8,218874 -telegram/_messageautodeletetimerchanged.py,sha256=2bsGy57BvhXvv2Vkov-58hhv_wKFB07B_9We8OaYnfs,2660 -telegram/_messageentity.py,sha256=h8WVTaMyW9CdM6xBvzXsBrYCAgQbXm02YELNl_gNw4s,18822 -telegram/_messageid.py,sha256=9eUX0R4zSjPK6KQcf86xXGgkEK2ZJ_jBjrPIBS8l-qA,2318 -telegram/_messageorigin.py,sha256=GNus5vaxTcEnd9TPS-y_aFWtMReB0U24wA0RntVI_Ig,10104 -telegram/_messagereactionupdated.py,sha256=nhdZjTd5gqXZ9saiyUxbMcLXiUwmeNRE_cjWSynsz5Q,7981 -telegram/_ownedgift.py,sha256=fqRpcsbWsfEkDqfHp94BaDT18vdoFGoy57sS0OTHE-U,18385 -telegram/_paidmedia.py,sha256=jpUqAeWd4hKaSu35S6WOyplMe4JTggC9Bj1Il8oahWs,11655 -telegram/_paidmessagepricechanged.py,sha256=01LUjgLX3tCQxr-ldQlb94GNh_3_o7YuImRRDcv_J6c,2142 -telegram/_passport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -telegram/_passport/__pycache__/__init__.cpython-312.pyc,, -telegram/_passport/__pycache__/credentials.cpython-312.pyc,, -telegram/_passport/__pycache__/data.cpython-312.pyc,, -telegram/_passport/__pycache__/encryptedpassportelement.cpython-312.pyc,, -telegram/_passport/__pycache__/passportdata.cpython-312.pyc,, -telegram/_passport/__pycache__/passportelementerrors.cpython-312.pyc,, -telegram/_passport/__pycache__/passportfile.cpython-312.pyc,, -telegram/_passport/credentials.py,sha256=RH_nZNiw6GVE9jb3f_rLvuxotUdjokea2RVsDQA0HN4,22824 -telegram/_passport/data.py,sha256=zZlaWmLPWJ5UOJTnONn6fgjLr6H5_5vj7-EmvejabFY,6373 -telegram/_passport/encryptedpassportelement.py,sha256=UiqtC5S7TkLrrMH8yLn3OfI7LktUBoBd7j9oIgIHLB8,13147 -telegram/_passport/passportdata.py,sha256=L4HtPsstiWAO92d7LRGLBt7Vmi9MOvjwgOgUNGr6Q6k,5198 -telegram/_passport/passportelementerrors.py,sha256=4jWBDJGKucGsvFgwXo9bcUkQVC6yZHs2dFV5arEJhDE,17751 -telegram/_passport/passportfile.py,sha256=4x5qAgpTQxJkZOrunVZKT-aCu18Mt0o5tj_5zzJx5JI,7747 -telegram/_payment/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -telegram/_payment/__pycache__/__init__.cpython-312.pyc,, -telegram/_payment/__pycache__/invoice.cpython-312.pyc,, -telegram/_payment/__pycache__/labeledprice.cpython-312.pyc,, -telegram/_payment/__pycache__/orderinfo.cpython-312.pyc,, -telegram/_payment/__pycache__/precheckoutquery.cpython-312.pyc,, -telegram/_payment/__pycache__/refundedpayment.cpython-312.pyc,, -telegram/_payment/__pycache__/shippingaddress.cpython-312.pyc,, -telegram/_payment/__pycache__/shippingoption.cpython-312.pyc,, -telegram/_payment/__pycache__/shippingquery.cpython-312.pyc,, -telegram/_payment/__pycache__/successfulpayment.cpython-312.pyc,, -telegram/_payment/invoice.py,sha256=Y559SezAzCBTsGnwGTog23rylH9epAv_l93TpARZCJ4,5130 -telegram/_payment/labeledprice.py,sha256=1pux8UP9SupwF4imslvHcESmuHVok-ovE-HIiwgXinU,2719 -telegram/_payment/orderinfo.py,sha256=fYxj25gW8VOimWVsgvGVMVGwRTWJWwqbwiMmsfhPa-E,3161 -telegram/_payment/precheckoutquery.py,sha256=jLgEzSKHgvIPwjuoc9iGu2sjm7gLuUyOnjQ-VZdv1lA,6054 -telegram/_payment/refundedpayment.py,sha256=TnRGpmD7IfjKVmC4JEneGc1I71nCfIHtPrnOOzWnKQQ,4110 -telegram/_payment/shippingaddress.py,sha256=fTP6D-WffrE5NcV2OBTqG-6RFFTXBwCwQ3PQ7q8Ukb0,2977 -telegram/_payment/shippingoption.py,sha256=v7L4WsvIK0o2oihmIZ0-MINW27BLS0dYrCRpvH4962A,2522 -telegram/_payment/shippingquery.py,sha256=08xjqpWswM0GpUDmrPhGhhDcNpuP1mLrRewkKSh39CI,4556 -telegram/_payment/stars/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -telegram/_payment/stars/__pycache__/__init__.cpython-312.pyc,, -telegram/_payment/stars/__pycache__/affiliateinfo.cpython-312.pyc,, -telegram/_payment/stars/__pycache__/revenuewithdrawalstate.cpython-312.pyc,, -telegram/_payment/stars/__pycache__/staramount.cpython-312.pyc,, -telegram/_payment/stars/__pycache__/startransactions.cpython-312.pyc,, -telegram/_payment/stars/__pycache__/transactionpartner.cpython-312.pyc,, -telegram/_payment/stars/affiliateinfo.py,sha256=trXHGCYCTIkigergAdAETB7XeyAKnQZKdrFiaDdt7SU,5155 -telegram/_payment/stars/revenuewithdrawalstate.py,sha256=bsCCn2lj1YPqeR4AB-Sw83JNditSIUlKx_LLl-MYZGA,6421 -telegram/_payment/stars/staramount.py,sha256=V9d9z76A9N3Hk-cVAO5hY2jIix-mdhbHfbnNMywSxR8,2679 -telegram/_payment/stars/startransactions.py,sha256=zlQLw0ufogMyS7p6z-_XYAxvdp-yqHjezMY5B3PntpQ,7235 -telegram/_payment/stars/transactionpartner.py,sha256=wThNRF2ENJ1NzsSOk02BIQ8Yok3AClMqtUgM0PnKXMs,21526 -telegram/_payment/successfulpayment.py,sha256=vi7ea3lD96gi0t_OwJhOG25MS-8sz5qIeBdLTAevq1s,7093 -telegram/_poll.py,sha256=v9C64ekFmgYaFH5L62-5JM0Fkt00bho8QTem2Y2Ha9g,27276 -telegram/_proximityalerttriggered.py,sha256=8D_bk-sYltYTAhejgDkphuj7uOITpJSrAkyv3S5lwf0,2896 -telegram/_reaction.py,sha256=J1qTynQW2QCO0rjpFfbiAo4OKZ1rSlikU7deJ4iXCX0,7332 -telegram/_reply.py,sha256=ddcJQQoPuK9ASrAuaGYD2ngZBWidZYkW_M-ZdBVQKc4,22026 -telegram/_replykeyboardmarkup.py,sha256=4naW1i1EG0gbHDqjwCUHK1ve3-BS3qHvbOu6iNJS2hE,16575 -telegram/_replykeyboardremove.py,sha256=AyNg3twg4srikwnAaHquswJXCDsNRVk1Q5LetsWwwoc,3345 -telegram/_sentwebappmessage.py,sha256=E0uBOAHLRWOJrH0lLWjZHvVKC_yE2KKntkvk_5-sfV4,2199 -telegram/_shared.py,sha256=tbIE_9N3_V0AwwcXSivCFn6jseaJWNhaWNTyY5srLoY,10505 -telegram/_story.py,sha256=cOPUqwYJ7-b84dZwRWnDple__s4Cmv5EJswQambsz1M,2502 -telegram/_storyarea.py,sha256=eOkvBx5ypVH6KpF26ecczTwuVK6PcxuBb3CYbEHCDts,15884 -telegram/_switchinlinequerychosenchat.py,sha256=OmI92dsm6mgZYltDtXZe2SroSY-sM3hB8tBQ37Ff2Oc,4136 -telegram/_telegramobject.py,sha256=4ykwgk7y0ibAV_gWYqeZ8CSrZinjrlfymk0UHPbYPS0,30666 -telegram/_uniquegift.py,sha256=hjzcBavqw5RQ6e6K3lyKyQ_QZUnynKUOrbyeK7R3PG0,14220 -telegram/_update.py,sha256=OotAi9Cj7WaPGoJ28Vyfjm7Mcaho2RXOcKxPhRNCGUg,36055 -telegram/_user.py,sha256=nEe8ELe85Tsm0JvGAc5immuqZcK4N5CvJWm3rUe24JA,92440 -telegram/_userprofilephotos.py,sha256=SbFBjavQO1B80z9ZfIN6stknxcX1vzk9ygd57TMQqJg,2878 -telegram/_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -telegram/_utils/__pycache__/__init__.cpython-312.pyc,, -telegram/_utils/__pycache__/argumentparsing.cpython-312.pyc,, -telegram/_utils/__pycache__/datetime.cpython-312.pyc,, -telegram/_utils/__pycache__/defaultvalue.cpython-312.pyc,, -telegram/_utils/__pycache__/entities.cpython-312.pyc,, -telegram/_utils/__pycache__/enum.cpython-312.pyc,, -telegram/_utils/__pycache__/files.cpython-312.pyc,, -telegram/_utils/__pycache__/logging.cpython-312.pyc,, -telegram/_utils/__pycache__/markup.cpython-312.pyc,, -telegram/_utils/__pycache__/repr.cpython-312.pyc,, -telegram/_utils/__pycache__/strings.cpython-312.pyc,, -telegram/_utils/__pycache__/types.cpython-312.pyc,, -telegram/_utils/__pycache__/warnings.cpython-312.pyc,, -telegram/_utils/__pycache__/warnings_transition.cpython-312.pyc,, -telegram/_utils/argumentparsing.py,sha256=x1evu0m8fRQ0MXuI54Q8Fl95id_YM9LzHBfE3P_EZ00,5355 -telegram/_utils/datetime.py,sha256=cv8Ed9Yz3ZggZYZzdPrL1llBT9zwpBdIPXoFvezbIgg,11253 -telegram/_utils/defaultvalue.py,sha256=8FCBZz-zl_-L4s3Tqdw904QojAOID2mzTJGbMBXc6fw,4305 -telegram/_utils/entities.py,sha256=H7mp3dJqQ2StSXxZyUX90XzffRoQs-J0EIjQsLFcdWI,3043 -telegram/_utils/enum.py,sha256=qzV6F0fGYBBzT7w80QIDCoSIDZnizmBnxKf8ZnjX4Kc,3019 -telegram/_utils/files.py,sha256=XqkWdy5ICM5rWLRVru6X716G6_CyaNgHqeMtM_IU5Yo,5953 -telegram/_utils/logging.py,sha256=NuLXdUpOxZJvCpbsZbyHz9ruq93WbL8RKx2OCQfPHZI,1970 -telegram/_utils/markup.py,sha256=LgJWs6yapn_edgIOjHYbOhCaw_z3uJ5RRnLfQB3s9mk,2100 -telegram/_utils/repr.py,sha256=NSDMURowcODe8PrBaaoPbMWXCKlkMhXg64eTYvx0UBw,1833 -telegram/_utils/strings.py,sha256=4fx4AIQWmCMufpj-pxq8FvRD6XY1bULLERzQ8QLY6as,1802 -telegram/_utils/types.py,sha256=ikyCO-O-pfTRj2fhCZhfted9XmgXR9pq_--oDn5-OpI,3745 -telegram/_utils/warnings.py,sha256=zLtK14_YzhH2JdBsgtdM0n0GxWMoADdV4t3T0Lc3NGw,2170 -telegram/_utils/warnings_transition.py,sha256=Li0-gDmavmi4btEXDV_2CvJWDfjeiNHVHdaBw0t_aH8,4090 -telegram/_version.py,sha256=DYCz6aBKD2Rm3j6vRAR0XZsPQSWuWcXgdNI4L3NescM,1812 -telegram/_videochat.py,sha256=ADWw0ZW3G2QWKkcrgib7c6TyKURuOKu3J8mTv5Y9TxY,6690 -telegram/_webappdata.py,sha256=V3kg4rbzbsc0rDW1P7XIJZeyNb1SA3tSbamz-D_z-kw,2444 -telegram/_webappinfo.py,sha256=TjOOZanSHb4jmziJOVBia4W-IQ-G1rrkcHkc6veVGCo,2124 -telegram/_webhookinfo.py,sha256=i1k-MMl5jfvMzGpzQmdPdC6eN9WU366nsuuLe-SKkcw,7730 -telegram/_writeaccessallowed.py,sha256=u6M26BiVDZWa-nfDeTIpMLmAAV0T95UTypMOZ3QN6J0,3585 -telegram/constants.py,sha256=H7UGZV05SL488ONLWNUMgCYKVz0xEnlZp9VsRrR2jNo,135592 -telegram/error.py,sha256=Qa4T-tZxtuKZ7a5wvmbNe-FSn4OmncH9O_tTDNTIgzQ,8344 -telegram/ext/__init__.py,sha256=GlSkUC2FAD0kxdtjuB8ncp-vSbRkLiRE6GUpcFS9iJI,4052 -telegram/ext/__pycache__/__init__.cpython-312.pyc,, -telegram/ext/__pycache__/_aioratelimiter.cpython-312.pyc,, -telegram/ext/__pycache__/_application.cpython-312.pyc,, -telegram/ext/__pycache__/_applicationbuilder.cpython-312.pyc,, -telegram/ext/__pycache__/_basepersistence.cpython-312.pyc,, -telegram/ext/__pycache__/_baseratelimiter.cpython-312.pyc,, -telegram/ext/__pycache__/_baseupdateprocessor.cpython-312.pyc,, -telegram/ext/__pycache__/_callbackcontext.cpython-312.pyc,, -telegram/ext/__pycache__/_callbackdatacache.cpython-312.pyc,, -telegram/ext/__pycache__/_contexttypes.cpython-312.pyc,, -telegram/ext/__pycache__/_defaults.cpython-312.pyc,, -telegram/ext/__pycache__/_dictpersistence.cpython-312.pyc,, -telegram/ext/__pycache__/_extbot.cpython-312.pyc,, -telegram/ext/__pycache__/_jobqueue.cpython-312.pyc,, -telegram/ext/__pycache__/_picklepersistence.cpython-312.pyc,, -telegram/ext/__pycache__/_updater.cpython-312.pyc,, -telegram/ext/__pycache__/filters.cpython-312.pyc,, -telegram/ext/_aioratelimiter.py,sha256=EMUHZmX4PDsYizZlrl_cS9VVJ4204xuSB8k7ZCa-Jv4,12840 -telegram/ext/_application.py,sha256=va0FrFOQO7SBaoULQe0lXaj6QZjv8zdI3_waHRqMU3s,84834 -telegram/ext/_applicationbuilder.py,sha256=Mmkg2EsSyJrc8GAT8JOLlR8eHQi8keBu5EVlCjh13xY,57150 -telegram/ext/_basepersistence.py,sha256=CPBJHYR_b7vh_BIMLPqBKMc3jnr4OujJpoBQZt2qLmk,18349 -telegram/ext/_baseratelimiter.py,sha256=x6wWSkWnlQY02qQlm91wRgq-bTh7X2a63H9zXHU9_Z8,6496 -telegram/ext/_baseupdateprocessor.py,sha256=bJKckVx-gQYu4BuWM7nyXLbUrTB-mTtGUF6gH2JQkqk,6609 -telegram/ext/_callbackcontext.py,sha256=ZoFDZGBrDq6Wy6cpaTXYH_qzvWaZ4TGr7TXxG8PootA,17882 -telegram/ext/_callbackdatacache.py,sha256=cfSuSgaOs9tqpo71LHC7sF6mW3waOzXHSsmlGdV2NGk,18301 -telegram/ext/_contexttypes.py,sha256=sJpbziSN-kONCb-o2YB17Gkj2vTyNAA1crUBDkIyXZ8,7749 -telegram/ext/_defaults.py,sha256=SSK9jx0MKOPgupOwdiZdb0qMs0j4O_H_3argSPgUHGo,13963 -telegram/ext/_dictpersistence.py,sha256=jtj9kHiCcggppLY9OoGTEIH4fEI1MFSMjIjO5TSAlrE,19071 -telegram/ext/_extbot.py,sha256=lgf9KKHxLMvT-Y0_Xdl57Yu1L1UaM8cK7FGnJp4Ly18,211382 -telegram/ext/_handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -telegram/ext/_handlers/__pycache__/__init__.cpython-312.pyc,, -telegram/ext/_handlers/__pycache__/basehandler.cpython-312.pyc,, -telegram/ext/_handlers/__pycache__/businessconnectionhandler.cpython-312.pyc,, -telegram/ext/_handlers/__pycache__/businessmessagesdeletedhandler.cpython-312.pyc,, -telegram/ext/_handlers/__pycache__/callbackqueryhandler.cpython-312.pyc,, -telegram/ext/_handlers/__pycache__/chatboosthandler.cpython-312.pyc,, -telegram/ext/_handlers/__pycache__/chatjoinrequesthandler.cpython-312.pyc,, -telegram/ext/_handlers/__pycache__/chatmemberhandler.cpython-312.pyc,, -telegram/ext/_handlers/__pycache__/choseninlineresulthandler.cpython-312.pyc,, -telegram/ext/_handlers/__pycache__/commandhandler.cpython-312.pyc,, -telegram/ext/_handlers/__pycache__/conversationhandler.cpython-312.pyc,, -telegram/ext/_handlers/__pycache__/inlinequeryhandler.cpython-312.pyc,, -telegram/ext/_handlers/__pycache__/messagehandler.cpython-312.pyc,, -telegram/ext/_handlers/__pycache__/messagereactionhandler.cpython-312.pyc,, -telegram/ext/_handlers/__pycache__/paidmediapurchasedhandler.cpython-312.pyc,, -telegram/ext/_handlers/__pycache__/pollanswerhandler.cpython-312.pyc,, -telegram/ext/_handlers/__pycache__/pollhandler.cpython-312.pyc,, -telegram/ext/_handlers/__pycache__/precheckoutqueryhandler.cpython-312.pyc,, -telegram/ext/_handlers/__pycache__/prefixhandler.cpython-312.pyc,, -telegram/ext/_handlers/__pycache__/shippingqueryhandler.cpython-312.pyc,, -telegram/ext/_handlers/__pycache__/stringcommandhandler.cpython-312.pyc,, -telegram/ext/_handlers/__pycache__/stringregexhandler.cpython-312.pyc,, -telegram/ext/_handlers/__pycache__/typehandler.cpython-312.pyc,, -telegram/ext/_handlers/basehandler.py,sha256=RiKGlMA0n1yjoXJaGMLxZZvVnjDaaA7nHo_e7Agzn4U,7353 -telegram/ext/_handlers/businessconnectionhandler.py,sha256=lUbF3D1dIrq3GNRYq_IhRTNFV_cnNKgXDyBkrgXCGYY,3844 -telegram/ext/_handlers/businessmessagesdeletedhandler.py,sha256=YATmTqVMfyTg6a0ztPXcCKzkY1dIfvkL0RtXkPe32nw,3888 -telegram/ext/_handlers/callbackqueryhandler.py,sha256=s6zyC6cURmSmfP_OkEe1WZeNL0gH6gWmqKu4F-x2u1o,9309 -telegram/ext/_handlers/chatboosthandler.py,sha256=Pf9GKw8tX5cYl4fOMD7fomD7LRMmzYOvUUuU0ZdWFRM,5542 -telegram/ext/_handlers/chatjoinrequesthandler.py,sha256=M0E0-qEbb6xIKbR2M8teqBMwnMGkvvEC88ht1m17MU4,4486 -telegram/ext/_handlers/chatmemberhandler.py,sha256=C6g2F-lxmVlFL_BSGBkfF6z70azsE7znKXYk2X-VVQw,5284 -telegram/ext/_handlers/choseninlineresulthandler.py,sha256=NUgbeESmXWNfsUejdilo1-3TnrL10VyAdH_83qb8amM,4945 -telegram/ext/_handlers/commandhandler.py,sha256=bppOmocy-hmaZSqMoGWrsmBmn8D4urL8C5hBCMPwqjY,10071 -telegram/ext/_handlers/conversationhandler.py,sha256=SykUXLAzoivnoEy3BcX_W7v52j2d91Vy1_U4_Ndolu0,42544 -telegram/ext/_handlers/inlinequeryhandler.py,sha256=kuLeMb42Gz-a61WWR8oIF-3YYMTHLHf18By__uMxPuI,5843 -telegram/ext/_handlers/messagehandler.py,sha256=u28bnTm_jcIrVMIf96Gt1FKxN9vLJXkQinC0CNxV_xE,4732 -telegram/ext/_handlers/messagereactionhandler.py,sha256=gD_nTG7q3p9g1YlsxHgZGN4F_5fuohXkebQeRHWYIq8,8175 -telegram/ext/_handlers/paidmediapurchasedhandler.py,sha256=xZJ8gK2epxXJcff14gM2ZE1yZLpugE5WqaWeHBQ6Hgs,3818 -telegram/ext/_handlers/pollanswerhandler.py,sha256=F5Za_Fdbmt6HKDyZdsWLj0PREWK__NqNYAK4lfVlblo,2788 -telegram/ext/_handlers/pollhandler.py,sha256=UV4TdWU7PH6iDLH06gvpFyXwddEsGoiLMyJjy86DP4s,2753 -telegram/ext/_handlers/precheckoutqueryhandler.py,sha256=dAV6D6MlPWBe5l0wsDRQbBVvzJSQcXvUMwwxffj7OK8,4047 -telegram/ext/_handlers/prefixhandler.py,sha256=z_SqTNW1RZ0RGqo9T4r9YRq09hdPvEL-6ngdIG8c7Us,7926 -telegram/ext/_handlers/shippingqueryhandler.py,sha256=-iaC3P5J3fazs2U71_qc9LGZbH2pd3Iaykld9Zp7BiU,2763 -telegram/ext/_handlers/stringcommandhandler.py,sha256=8xOmPDJEuVzh8roB3625n8VGfL-ygupNwwonsDBmMEo,4476 -telegram/ext/_handlers/stringregexhandler.py,sha256=5SLRN7ogydttltbdYJ6K_3GRPzuD7O3SKu4l7O1C3uU,4582 -telegram/ext/_handlers/typehandler.py,sha256=neFHvNHAKphpAG4WzobZeNHkdKUNCxmg9rnAq6d1_6w,4124 -telegram/ext/_jobqueue.py,sha256=OcMFJf1B2y-WWyQRgEgxR_bH0ZK7FVP0HapvDR7OxOs,41541 -telegram/ext/_picklepersistence.py,sha256=OddvpVF13omD-Uss6xjkBto76IdlXFwEo_ytdEEcG7U,22920 -telegram/ext/_updater.py,sha256=piHV1I0_fHKvIPAGRVA4SdMfmrbyzx2kfG_9kIYK-z0,32144 -telegram/ext/_utils/__init__.py,sha256=98SxNI18NCwxl9r23FYrCkb83A-POKPo-ksskcZhL5k,800 -telegram/ext/_utils/__pycache__/__init__.cpython-312.pyc,, -telegram/ext/_utils/__pycache__/_update_parsing.cpython-312.pyc,, -telegram/ext/_utils/__pycache__/asyncio.cpython-312.pyc,, -telegram/ext/_utils/__pycache__/networkloop.cpython-312.pyc,, -telegram/ext/_utils/__pycache__/stack.cpython-312.pyc,, -telegram/ext/_utils/__pycache__/trackingdict.cpython-312.pyc,, -telegram/ext/_utils/__pycache__/types.cpython-312.pyc,, -telegram/ext/_utils/__pycache__/webhookhandler.cpython-312.pyc,, -telegram/ext/_utils/_update_parsing.py,sha256=KpQOeDCKjobVamYL_MkcgN3B9dgSqJziu8oxGuC0mlY,1938 -telegram/ext/_utils/asyncio.py,sha256=OoEbL-fFIFRQ5oHpuKx67AkQEmkB6IbykrF9Z8Jyfys,1932 -telegram/ext/_utils/networkloop.py,sha256=XtK7uQJpPvzDlPqPwJhH6HOa_WQzM9vp6mEBHoRupT4,5973 -telegram/ext/_utils/stack.py,sha256=mu95lYJ7HW4OEL49-wcNCViAkGJyIuuAMqBd7oFnchY,2586 -telegram/ext/_utils/trackingdict.py,sha256=owPj4tosQKK2_pqQtzU3Fqrnl3fugTENLya73jClN8g,4597 -telegram/ext/_utils/types.py,sha256=lN_QFfGECJJWh2vKIb1wBXB0UV0XTCA5BNPZ3AE4o0M,3096 -telegram/ext/_utils/webhookhandler.py,sha256=sywQieWYqScTsnqanjVIhX4yuyiAu2b_l_ihmZkX_Gc,8029 -telegram/ext/filters.py,sha256=hofWi9hAXcBn0dyKBxpFZrjuYytUbie8aZ82csYKXVI,99430 -telegram/helpers.py,sha256=HDOoAwWWszF2EZ-O282aHx42uZyM4bNobwMOfjkQo3c,7413 -telegram/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -telegram/request/__init__.py,sha256=raFq4yfvwbI55hGJkHhGEqpyGgitkLQlwfAdl4wkVVk,1081 -telegram/request/__pycache__/__init__.cpython-312.pyc,, -telegram/request/__pycache__/_baserequest.cpython-312.pyc,, -telegram/request/__pycache__/_httpxrequest.cpython-312.pyc,, -telegram/request/__pycache__/_requestdata.cpython-312.pyc,, -telegram/request/__pycache__/_requestparameter.cpython-312.pyc,, -telegram/request/_baserequest.py,sha256=75BGuO8YNlbEa_bauSOJizPjBT0RHnKm2AL05fBKjy0,19642 -telegram/request/_httpxrequest.py,sha256=-DkheckbGXHiuGnd60kTlq6MwmAB9bYPoYRTlwjcdVw,13072 -telegram/request/_requestdata.py,sha256=THgNSR5HgOuTWEQ_vrXmnOEg_X0APnHguME0MII9y3s,5630 -telegram/request/_requestparameter.py,sha256=OIFNIEgfhwiQPX3FF0ySU4zmChq162SzbeNoURELHPU,9194 -telegram/warnings.py,sha256=hxkpKC9RKCvwDssxW0g403hG_DAXAKCvXHpX_jYgeIg,2749 diff --git a/venv/lib/python3.12/site-packages/python_telegram_bot-22.2.dist-info/REQUESTED b/venv/lib/python3.12/site-packages/python_telegram_bot-22.2.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/python_telegram_bot-22.2.dist-info/WHEEL b/venv/lib/python3.12/site-packages/python_telegram_bot-22.2.dist-info/WHEEL deleted file mode 100644 index 12228d4..0000000 --- a/venv/lib/python3.12/site-packages/python_telegram_bot-22.2.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: hatchling 1.27.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/venv/lib/python3.12/site-packages/python_telegram_bot-22.2.dist-info/licenses/LICENSE b/venv/lib/python3.12/site-packages/python_telegram_bot-22.2.dist-info/licenses/LICENSE deleted file mode 100644 index ae6b8d0..0000000 --- a/venv/lib/python3.12/site-packages/python_telegram_bot-22.2.dist-info/licenses/LICENSE +++ /dev/null @@ -1,619 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. [http://fsf.org/] - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. diff --git a/venv/lib/python3.12/site-packages/python_telegram_bot-22.2.dist-info/licenses/LICENSE.dual b/venv/lib/python3.12/site-packages/python_telegram_bot-22.2.dist-info/licenses/LICENSE.dual deleted file mode 100644 index c2730fd..0000000 --- a/venv/lib/python3.12/site-packages/python_telegram_bot-22.2.dist-info/licenses/LICENSE.dual +++ /dev/null @@ -1,792 +0,0 @@ - NOTICE: You can find here the GPLv3 license and after the Lesser GPLv3 license. -You may choose either license. - - - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. [http://fsf.org/] - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. - - - - - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. [http://fsf.org/] - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. diff --git a/venv/lib/python3.12/site-packages/python_telegram_bot-22.2.dist-info/licenses/LICENSE.lesser b/venv/lib/python3.12/site-packages/python_telegram_bot-22.2.dist-info/licenses/LICENSE.lesser deleted file mode 100644 index 5cc63c2..0000000 --- a/venv/lib/python3.12/site-packages/python_telegram_bot-22.2.dist-info/licenses/LICENSE.lesser +++ /dev/null @@ -1,165 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. [http://fsf.org/] - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. diff --git a/venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/LICENSE b/venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/LICENSE deleted file mode 100644 index 51f3442..0000000 --- a/venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/LICENSE +++ /dev/null @@ -1,3 +0,0 @@ -This software is made available under the terms of *either* of the -licenses found in LICENSE.APACHE2 or LICENSE.MIT. Contributions to are -made under the terms of *both* these licenses. diff --git a/venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/LICENSE.APACHE2 b/venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/LICENSE.APACHE2 deleted file mode 100644 index d645695..0000000 --- a/venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/LICENSE.APACHE2 +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/LICENSE.MIT b/venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/LICENSE.MIT deleted file mode 100644 index b8bb971..0000000 --- a/venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/LICENSE.MIT +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -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.12/site-packages/sniffio-1.3.1.dist-info/METADATA b/venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/METADATA deleted file mode 100644 index 75e0057..0000000 --- a/venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/METADATA +++ /dev/null @@ -1,104 +0,0 @@ -Metadata-Version: 2.1 -Name: sniffio -Version: 1.3.1 -Summary: Sniff out which async library your code is running under -Author-email: "Nathaniel J. Smith" <njs@pobox.com> -License: MIT OR Apache-2.0 -Project-URL: Homepage, https://github.com/python-trio/sniffio -Project-URL: Documentation, https://sniffio.readthedocs.io/ -Project-URL: Changelog, https://sniffio.readthedocs.io/en/latest/history.html -Keywords: async,trio,asyncio -Classifier: License :: OSI Approved :: MIT License -Classifier: License :: OSI Approved :: Apache Software License -Classifier: Framework :: Trio -Classifier: Framework :: AsyncIO -Classifier: Operating System :: POSIX :: Linux -Classifier: Operating System :: MacOS :: MacOS X -Classifier: Operating System :: Microsoft :: Windows -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Intended Audience :: Developers -Classifier: Development Status :: 5 - Production/Stable -Requires-Python: >=3.7 -Description-Content-Type: text/x-rst -License-File: LICENSE -License-File: LICENSE.APACHE2 -License-File: LICENSE.MIT - -.. image:: https://img.shields.io/badge/chat-join%20now-blue.svg - :target: https://gitter.im/python-trio/general - :alt: Join chatroom - -.. image:: https://img.shields.io/badge/docs-read%20now-blue.svg - :target: https://sniffio.readthedocs.io/en/latest/?badge=latest - :alt: Documentation Status - -.. image:: https://img.shields.io/pypi/v/sniffio.svg - :target: https://pypi.org/project/sniffio - :alt: Latest PyPi version - -.. image:: https://img.shields.io/conda/vn/conda-forge/sniffio.svg - :target: https://anaconda.org/conda-forge/sniffio - :alt: Latest conda-forge version - -.. image:: https://travis-ci.org/python-trio/sniffio.svg?branch=master - :target: https://travis-ci.org/python-trio/sniffio - :alt: Automated test status - -.. image:: https://codecov.io/gh/python-trio/sniffio/branch/master/graph/badge.svg - :target: https://codecov.io/gh/python-trio/sniffio - :alt: Test coverage - -================================================================= -sniffio: Sniff out which async library your code is running under -================================================================= - -You're writing a library. You've decided to be ambitious, and support -multiple async I/O packages, like `Trio -<https://trio.readthedocs.io>`__, and `asyncio -<https://docs.python.org/3/library/asyncio.html>`__, and ... You've -written a bunch of clever code to handle all the differences. But... -how do you know *which* piece of clever code to run? - -This is a tiny package whose only purpose is to let you detect which -async library your code is running under. - -* Documentation: https://sniffio.readthedocs.io - -* Bug tracker and source code: https://github.com/python-trio/sniffio - -* License: MIT or Apache License 2.0, your choice - -* Contributor guide: https://trio.readthedocs.io/en/latest/contributing.html - -* Code of conduct: Contributors are requested to follow our `code of - conduct - <https://trio.readthedocs.io/en/latest/code-of-conduct.html>`_ - in all project spaces. - -This library is maintained by the Trio project, as a service to the -async Python community as a whole. - - -Quickstart ----------- - -.. code-block:: python3 - - from sniffio import current_async_library - import trio - import asyncio - - async def print_library(): - library = current_async_library() - print("This is:", library) - - # Prints "This is trio" - trio.run(print_library) - - # Prints "This is asyncio" - asyncio.run(print_library()) - -For more details, including how to add support to new async libraries, -`please peruse our fine manual <https://sniffio.readthedocs.io>`__. diff --git a/venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/RECORD b/venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/RECORD deleted file mode 100644 index 2fb1b77..0000000 --- a/venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/RECORD +++ /dev/null @@ -1,19 +0,0 @@ -sniffio-1.3.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -sniffio-1.3.1.dist-info/LICENSE,sha256=ZSyHhIjRRWNh4Iw_hgf9e6WYkqFBA9Fczk_5PIW1zIs,185 -sniffio-1.3.1.dist-info/LICENSE.APACHE2,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358 -sniffio-1.3.1.dist-info/LICENSE.MIT,sha256=Pm2uVV65J4f8gtHUg1Vnf0VMf2Wus40_nnK_mj2vA0s,1046 -sniffio-1.3.1.dist-info/METADATA,sha256=CzGLVwmO3sz1heYKiJprantcQIbzqapi7_dqHTzuEtk,3875 -sniffio-1.3.1.dist-info/RECORD,, -sniffio-1.3.1.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92 -sniffio-1.3.1.dist-info/top_level.txt,sha256=v9UJXGs5CyddCVeAqXkQiWOrpp6Wtx6GeRrPt9-jjHg,8 -sniffio/__init__.py,sha256=9WJEJlXu7yluP0YtI5SQ9M9OTQfbNHkadarK1vXGDPM,335 -sniffio/__pycache__/__init__.cpython-312.pyc,, -sniffio/__pycache__/_impl.cpython-312.pyc,, -sniffio/__pycache__/_version.cpython-312.pyc,, -sniffio/_impl.py,sha256=UmUFMZpiuOrcjnuHhuYiYMxeCNWfqu9kBlaPf0xk6X8,2843 -sniffio/_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -sniffio/_tests/__pycache__/__init__.cpython-312.pyc,, -sniffio/_tests/__pycache__/test_sniffio.cpython-312.pyc,, -sniffio/_tests/test_sniffio.py,sha256=MMJZZJjQrUi95RANNM-a_55BZquA_gv4rHU1pevcTCM,2058 -sniffio/_version.py,sha256=iVes5xwsHeRzQDexBaAhyx_taNt2ucfA7CWAo4QDt6Q,89 -sniffio/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/WHEEL b/venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/WHEEL deleted file mode 100644 index 98c0d20..0000000 --- a/venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/top_level.txt b/venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/top_level.txt deleted file mode 100644 index 01c6502..0000000 --- a/venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -sniffio diff --git a/venv/lib/python3.12/site-packages/sniffio/__init__.py b/venv/lib/python3.12/site-packages/sniffio/__init__.py deleted file mode 100644 index 63f2f19..0000000 --- a/venv/lib/python3.12/site-packages/sniffio/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -"""Top-level package for sniffio.""" - -__all__ = [ - "current_async_library", - "AsyncLibraryNotFoundError", - "current_async_library_cvar", - "thread_local", -] - -from ._version import __version__ - -from ._impl import ( - current_async_library, - AsyncLibraryNotFoundError, - current_async_library_cvar, - thread_local, -) diff --git a/venv/lib/python3.12/site-packages/sniffio/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/sniffio/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 508d460ac2c4f0f8681f93cba10d12fa761ea224..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 476 zcmZvYJ8u&~6oqH@;oT5SsuZD!EJWkN9`PtqB%~x&6dI~+u7;hlJ@PzOcg7nnY4R`V zDCqbt{DN#tMH3+cLQ0ic;dI>M(>c<;x;p3Ec>IXOx%qs#dPfQQKA49|w&M166rYG7 z6<HENztD<`M5H<~X_ZnEHPxBPtK5vLktwRelvPPdmre7Jhwoi8)3TL%((roCmvXXj zIPq337Rt@1S-)Rz5Ty;keP?UX>H~7@`h&NFJ^Sa*T{v|cD^3s{_D}zN0d>o<e;igQ zxd82Iu7AWtWJ>#8fL5Yc&H|iIclrWAxEf#(T<a*xhXpL+NuPr<jmDt>Ob28G@`$hG zHj>;e*~%Ho3=h6#$FAO(7{Rk3wOk@MGappFmN*mc!fMBbMAk~%vKWswU06B$YX0IS z^D4;MwiwU0tuO#(RREYb-Cg;{II+?42>0UOA&@_e_?c2lugUXYS-zWG6@Q)(`s{C( M)8sdaz;Rr;2ZiB~00000 diff --git a/venv/lib/python3.12/site-packages/sniffio/__pycache__/_impl.cpython-312.pyc b/venv/lib/python3.12/site-packages/sniffio/__pycache__/_impl.cpython-312.pyc deleted file mode 100644 index 581d318a0e5b79a98b3f3736095d2dc5df514711..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3187 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 Z2*<_05gQ1Wdh8;{MLxG0h_0;F`x}=X4vGK( diff --git a/venv/lib/python3.12/site-packages/sniffio/__pycache__/_version.cpython-312.pyc b/venv/lib/python3.12/site-packages/sniffio/__pycache__/_version.cpython-312.pyc deleted file mode 100644 index 9b2b1021c00bedb4ad025ab37b25b152de3cf7b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 228 zcmXv|IS#@w5VW}zafpsTP$Vm$MO4)E&_pI#5{uZ5Y!eiycm*9jZ{Y{D^azQL3P*w| zW@lEbnZ5OTZQ}5}9Mh$nkIMW(f8y;qaV9ZYk&+H;hvq1l1f#`}-aBDfpf+5|Fuam? zb^l2qRRTdUYYLdFXeUrw0~Rw(G!wqDJldl6W3`u=VliqcP!^E!HRPpDm2}}_Fx;Y_ vvuMi_G+-p(Y`B7dU67X_Zz@#0%W$S!uD5#DbRE6wl+ss=^arPoZn(u4f&f7L diff --git a/venv/lib/python3.12/site-packages/sniffio/_impl.py b/venv/lib/python3.12/site-packages/sniffio/_impl.py deleted file mode 100644 index c1a7bbf..0000000 --- a/venv/lib/python3.12/site-packages/sniffio/_impl.py +++ /dev/null @@ -1,95 +0,0 @@ -from contextvars import ContextVar -from typing import Optional -import sys -import threading - -current_async_library_cvar = ContextVar( - "current_async_library_cvar", default=None -) # type: ContextVar[Optional[str]] - - -class _ThreadLocal(threading.local): - # Since threading.local provides no explicit mechanism is for setting - # a default for a value, a custom class with a class attribute is used - # instead. - name = None # type: Optional[str] - - -thread_local = _ThreadLocal() - - -class AsyncLibraryNotFoundError(RuntimeError): - pass - - -def current_async_library() -> str: - """Detect which async library is currently running. - - The following libraries are currently supported: - - ================ =========== ============================ - Library Requires Magic string - ================ =========== ============================ - **Trio** Trio v0.6+ ``"trio"`` - **Curio** - ``"curio"`` - **asyncio** ``"asyncio"`` - **Trio-asyncio** v0.8.2+ ``"trio"`` or ``"asyncio"``, - depending on current mode - ================ =========== ============================ - - Returns: - A string like ``"trio"``. - - Raises: - AsyncLibraryNotFoundError: if called from synchronous context, - or if the current async library was not recognized. - - Examples: - - .. code-block:: python3 - - from sniffio import current_async_library - - async def generic_sleep(seconds): - library = current_async_library() - if library == "trio": - import trio - await trio.sleep(seconds) - elif library == "asyncio": - import asyncio - await asyncio.sleep(seconds) - # ... and so on ... - else: - raise RuntimeError(f"Unsupported library {library!r}") - - """ - value = thread_local.name - if value is not None: - return value - - value = current_async_library_cvar.get() - if value is not None: - return value - - # Need to sniff for asyncio - if "asyncio" in sys.modules: - import asyncio - try: - current_task = asyncio.current_task # type: ignore[attr-defined] - except AttributeError: - current_task = asyncio.Task.current_task # type: ignore[attr-defined] - try: - if current_task() is not None: - return "asyncio" - except RuntimeError: - pass - - # Sniff for curio (for now) - if 'curio' in sys.modules: - from curio.meta import curio_running - if curio_running(): - return 'curio' - - raise AsyncLibraryNotFoundError( - "unknown async library, or not in async context" - ) diff --git a/venv/lib/python3.12/site-packages/sniffio/_tests/__init__.py b/venv/lib/python3.12/site-packages/sniffio/_tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/sniffio/_tests/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/sniffio/_tests/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 43f5210328bc0cf6c5882662493c06a30a0dfe19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 207 zcmZ8a%L>9U5KOFs2>lQb?V?`AlV^V+#CF>T^C(GLDSn7I?|zG);a!m4dNR2>usbu$ zGV@B)6$$t}ZcXHOT>lv7;c_PfS<};#*jaF6{FyW~Mj<HfT@Oc7bPBb1;89|2xyqau z#RY9vnyZ$EmuR6!-GdZoXb0aIy~{USaKdBO^5Vj4bl|k8Dq(<mbRmo}p@nBGZ-;5Q WSElSF9_%92(=aZIZ$c@xNl-r?tU5IS diff --git a/venv/lib/python3.12/site-packages/sniffio/_tests/__pycache__/test_sniffio.cpython-312.pyc b/venv/lib/python3.12/site-packages/sniffio/_tests/__pycache__/test_sniffio.cpython-312.pyc deleted file mode 100644 index 96c779f3953d8e5cceba09221623e713de0dc616..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3936 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 F@)zl1?zI2_ diff --git a/venv/lib/python3.12/site-packages/sniffio/_tests/test_sniffio.py b/venv/lib/python3.12/site-packages/sniffio/_tests/test_sniffio.py deleted file mode 100644 index 02945a9..0000000 --- a/venv/lib/python3.12/site-packages/sniffio/_tests/test_sniffio.py +++ /dev/null @@ -1,84 +0,0 @@ -import os -import sys - -import pytest - -from .. import ( - current_async_library, AsyncLibraryNotFoundError, - current_async_library_cvar, thread_local -) - - -def test_basics_cvar(): - with pytest.raises(AsyncLibraryNotFoundError): - current_async_library() - - token = current_async_library_cvar.set("generic-lib") - try: - assert current_async_library() == "generic-lib" - finally: - current_async_library_cvar.reset(token) - - with pytest.raises(AsyncLibraryNotFoundError): - current_async_library() - - -def test_basics_tlocal(): - with pytest.raises(AsyncLibraryNotFoundError): - current_async_library() - - old_name, thread_local.name = thread_local.name, "generic-lib" - try: - assert current_async_library() == "generic-lib" - finally: - thread_local.name = old_name - - with pytest.raises(AsyncLibraryNotFoundError): - current_async_library() - - -def test_asyncio(): - import asyncio - - with pytest.raises(AsyncLibraryNotFoundError): - current_async_library() - - ran = [] - - async def this_is_asyncio(): - assert current_async_library() == "asyncio" - # Call it a second time to exercise the caching logic - assert current_async_library() == "asyncio" - ran.append(True) - - asyncio.run(this_is_asyncio()) - assert ran == [True] - - with pytest.raises(AsyncLibraryNotFoundError): - current_async_library() - - -@pytest.mark.skipif( - sys.version_info >= (3, 12), - reason= - "curio broken on 3.12 (https://github.com/python-trio/sniffio/pull/42)", -) -def test_curio(): - import curio - - with pytest.raises(AsyncLibraryNotFoundError): - current_async_library() - - ran = [] - - async def this_is_curio(): - assert current_async_library() == "curio" - # Call it a second time to exercise the caching logic - assert current_async_library() == "curio" - ran.append(True) - - curio.run(this_is_curio) - assert ran == [True] - - with pytest.raises(AsyncLibraryNotFoundError): - current_async_library() diff --git a/venv/lib/python3.12/site-packages/sniffio/_version.py b/venv/lib/python3.12/site-packages/sniffio/_version.py deleted file mode 100644 index 0495d10..0000000 --- a/venv/lib/python3.12/site-packages/sniffio/_version.py +++ /dev/null @@ -1,3 +0,0 @@ -# This file is imported from __init__.py and exec'd from setup.py - -__version__ = "1.3.1" diff --git a/venv/lib/python3.12/site-packages/sniffio/py.typed b/venv/lib/python3.12/site-packages/sniffio/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/telegram/__init__.py b/venv/lib/python3.12/site-packages/telegram/__init__.py deleted file mode 100644 index 0f20f0b..0000000 --- a/venv/lib/python3.12/site-packages/telegram/__init__.py +++ /dev/null @@ -1,609 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""A library that provides a Python interface to the Telegram Bot API""" - -__author__ = "devs@python-telegram-bot.org" -__all__ = ( - "AcceptedGiftTypes", - "AffiliateInfo", - "Animation", - "Audio", - "BackgroundFill", - "BackgroundFillFreeformGradient", - "BackgroundFillGradient", - "BackgroundFillSolid", - "BackgroundType", - "BackgroundTypeChatTheme", - "BackgroundTypeFill", - "BackgroundTypePattern", - "BackgroundTypeWallpaper", - "Birthdate", - "Bot", - "BotCommand", - "BotCommandScope", - "BotCommandScopeAllChatAdministrators", - "BotCommandScopeAllGroupChats", - "BotCommandScopeAllPrivateChats", - "BotCommandScopeChat", - "BotCommandScopeChatAdministrators", - "BotCommandScopeChatMember", - "BotCommandScopeDefault", - "BotDescription", - "BotName", - "BotShortDescription", - "BusinessBotRights", - "BusinessConnection", - "BusinessIntro", - "BusinessLocation", - "BusinessMessagesDeleted", - "BusinessOpeningHours", - "BusinessOpeningHoursInterval", - "CallbackGame", - "CallbackQuery", - "Chat", - "ChatAdministratorRights", - "ChatBackground", - "ChatBoost", - "ChatBoostAdded", - "ChatBoostRemoved", - "ChatBoostSource", - "ChatBoostSourceGiftCode", - "ChatBoostSourceGiveaway", - "ChatBoostSourcePremium", - "ChatBoostUpdated", - "ChatFullInfo", - "ChatInviteLink", - "ChatJoinRequest", - "ChatLocation", - "ChatMember", - "ChatMemberAdministrator", - "ChatMemberBanned", - "ChatMemberLeft", - "ChatMemberMember", - "ChatMemberOwner", - "ChatMemberRestricted", - "ChatMemberUpdated", - "ChatPermissions", - "ChatPhoto", - "ChatShared", - "ChosenInlineResult", - "Contact", - "CopyTextButton", - "Credentials", - "DataCredentials", - "Dice", - "Document", - "EncryptedCredentials", - "EncryptedPassportElement", - "ExternalReplyInfo", - "File", - "FileCredentials", - "ForceReply", - "ForumTopic", - "ForumTopicClosed", - "ForumTopicCreated", - "ForumTopicEdited", - "ForumTopicReopened", - "Game", - "GameHighScore", - "GeneralForumTopicHidden", - "GeneralForumTopicUnhidden", - "Gift", - "GiftInfo", - "Gifts", - "Giveaway", - "GiveawayCompleted", - "GiveawayCreated", - "GiveawayWinners", - "IdDocumentData", - "InaccessibleMessage", - "InlineKeyboardButton", - "InlineKeyboardMarkup", - "InlineQuery", - "InlineQueryResult", - "InlineQueryResultArticle", - "InlineQueryResultAudio", - "InlineQueryResultCachedAudio", - "InlineQueryResultCachedDocument", - "InlineQueryResultCachedGif", - "InlineQueryResultCachedMpeg4Gif", - "InlineQueryResultCachedPhoto", - "InlineQueryResultCachedSticker", - "InlineQueryResultCachedVideo", - "InlineQueryResultCachedVoice", - "InlineQueryResultContact", - "InlineQueryResultDocument", - "InlineQueryResultGame", - "InlineQueryResultGif", - "InlineQueryResultLocation", - "InlineQueryResultMpeg4Gif", - "InlineQueryResultPhoto", - "InlineQueryResultVenue", - "InlineQueryResultVideo", - "InlineQueryResultVoice", - "InlineQueryResultsButton", - "InputContactMessageContent", - "InputFile", - "InputInvoiceMessageContent", - "InputLocationMessageContent", - "InputMedia", - "InputMediaAnimation", - "InputMediaAudio", - "InputMediaDocument", - "InputMediaPhoto", - "InputMediaVideo", - "InputMessageContent", - "InputPaidMedia", - "InputPaidMediaPhoto", - "InputPaidMediaVideo", - "InputPollOption", - "InputProfilePhoto", - "InputProfilePhotoAnimated", - "InputProfilePhotoStatic", - "InputSticker", - "InputStoryContent", - "InputStoryContentPhoto", - "InputStoryContentVideo", - "InputTextMessageContent", - "InputVenueMessageContent", - "Invoice", - "KeyboardButton", - "KeyboardButtonPollType", - "KeyboardButtonRequestChat", - "KeyboardButtonRequestUsers", - "LabeledPrice", - "LinkPreviewOptions", - "Location", - "LocationAddress", - "LoginUrl", - "MaskPosition", - "MaybeInaccessibleMessage", - "MenuButton", - "MenuButtonCommands", - "MenuButtonDefault", - "MenuButtonWebApp", - "Message", - "MessageAutoDeleteTimerChanged", - "MessageEntity", - "MessageId", - "MessageOrigin", - "MessageOriginChannel", - "MessageOriginChat", - "MessageOriginHiddenUser", - "MessageOriginUser", - "MessageReactionCountUpdated", - "MessageReactionUpdated", - "OrderInfo", - "OwnedGift", - "OwnedGiftRegular", - "OwnedGiftUnique", - "OwnedGifts", - "PaidMedia", - "PaidMediaInfo", - "PaidMediaPhoto", - "PaidMediaPreview", - "PaidMediaPurchased", - "PaidMediaVideo", - "PaidMessagePriceChanged", - "PassportData", - "PassportElementError", - "PassportElementErrorDataField", - "PassportElementErrorFile", - "PassportElementErrorFiles", - "PassportElementErrorFrontSide", - "PassportElementErrorReverseSide", - "PassportElementErrorSelfie", - "PassportElementErrorTranslationFile", - "PassportElementErrorTranslationFiles", - "PassportElementErrorUnspecified", - "PassportFile", - "PersonalDetails", - "PhotoSize", - "Poll", - "PollAnswer", - "PollOption", - "PreCheckoutQuery", - "PreparedInlineMessage", - "ProximityAlertTriggered", - "ReactionCount", - "ReactionType", - "ReactionTypeCustomEmoji", - "ReactionTypeEmoji", - "ReactionTypePaid", - "RefundedPayment", - "ReplyKeyboardMarkup", - "ReplyKeyboardRemove", - "ReplyParameters", - "ResidentialAddress", - "RevenueWithdrawalState", - "RevenueWithdrawalStateFailed", - "RevenueWithdrawalStatePending", - "RevenueWithdrawalStateSucceeded", - "SecureData", - "SecureValue", - "SentWebAppMessage", - "SharedUser", - "ShippingAddress", - "ShippingOption", - "ShippingQuery", - "StarAmount", - "StarTransaction", - "StarTransactions", - "Sticker", - "StickerSet", - "Story", - "StoryArea", - "StoryAreaPosition", - "StoryAreaType", - "StoryAreaTypeLink", - "StoryAreaTypeLocation", - "StoryAreaTypeSuggestedReaction", - "StoryAreaTypeUniqueGift", - "StoryAreaTypeWeather", - "SuccessfulPayment", - "SwitchInlineQueryChosenChat", - "TelegramObject", - "TextQuote", - "TransactionPartner", - "TransactionPartnerAffiliateProgram", - "TransactionPartnerChat", - "TransactionPartnerFragment", - "TransactionPartnerOther", - "TransactionPartnerTelegramAds", - "TransactionPartnerTelegramApi", - "TransactionPartnerUser", - "UniqueGift", - "UniqueGiftBackdrop", - "UniqueGiftBackdropColors", - "UniqueGiftInfo", - "UniqueGiftModel", - "UniqueGiftSymbol", - "Update", - "User", - "UserChatBoosts", - "UserProfilePhotos", - "UsersShared", - "Venue", - "Video", - "VideoChatEnded", - "VideoChatParticipantsInvited", - "VideoChatScheduled", - "VideoChatStarted", - "VideoNote", - "Voice", - "WebAppData", - "WebAppInfo", - "WebhookInfo", - "WriteAccessAllowed", - "__bot_api_version__", - "__bot_api_version_info__", - "__version__", - "__version_info__", - "constants", - "error", - "helpers", - "request", - "warnings", -) - -from telegram._payment.stars.staramount import StarAmount -from telegram._payment.stars.startransactions import StarTransaction, StarTransactions -from telegram._payment.stars.transactionpartner import ( - TransactionPartner, - TransactionPartnerAffiliateProgram, - TransactionPartnerChat, - TransactionPartnerFragment, - TransactionPartnerOther, - TransactionPartnerTelegramAds, - TransactionPartnerTelegramApi, - TransactionPartnerUser, -) - -from . import _version, constants, error, helpers, request, warnings -from ._birthdate import Birthdate -from ._bot import Bot -from ._botcommand import BotCommand -from ._botcommandscope import ( - BotCommandScope, - BotCommandScopeAllChatAdministrators, - BotCommandScopeAllGroupChats, - BotCommandScopeAllPrivateChats, - BotCommandScopeChat, - BotCommandScopeChatAdministrators, - BotCommandScopeChatMember, - BotCommandScopeDefault, -) -from ._botdescription import BotDescription, BotShortDescription -from ._botname import BotName -from ._business import ( - BusinessBotRights, - BusinessConnection, - BusinessIntro, - BusinessLocation, - BusinessMessagesDeleted, - BusinessOpeningHours, - BusinessOpeningHoursInterval, -) -from ._callbackquery import CallbackQuery -from ._chat import Chat -from ._chatadministratorrights import ChatAdministratorRights -from ._chatbackground import ( - BackgroundFill, - BackgroundFillFreeformGradient, - BackgroundFillGradient, - BackgroundFillSolid, - BackgroundType, - BackgroundTypeChatTheme, - BackgroundTypeFill, - BackgroundTypePattern, - BackgroundTypeWallpaper, - ChatBackground, -) -from ._chatboost import ( - ChatBoost, - ChatBoostAdded, - ChatBoostRemoved, - ChatBoostSource, - ChatBoostSourceGiftCode, - ChatBoostSourceGiveaway, - ChatBoostSourcePremium, - ChatBoostUpdated, - UserChatBoosts, -) -from ._chatfullinfo import ChatFullInfo -from ._chatinvitelink import ChatInviteLink -from ._chatjoinrequest import ChatJoinRequest -from ._chatlocation import ChatLocation -from ._chatmember import ( - ChatMember, - ChatMemberAdministrator, - ChatMemberBanned, - ChatMemberLeft, - ChatMemberMember, - ChatMemberOwner, - ChatMemberRestricted, -) -from ._chatmemberupdated import ChatMemberUpdated -from ._chatpermissions import ChatPermissions -from ._choseninlineresult import ChosenInlineResult -from ._copytextbutton import CopyTextButton -from ._dice import Dice -from ._files._inputstorycontent import ( - InputStoryContent, - InputStoryContentPhoto, - InputStoryContentVideo, -) -from ._files.animation import Animation -from ._files.audio import Audio -from ._files.chatphoto import ChatPhoto -from ._files.contact import Contact -from ._files.document import Document -from ._files.file import File -from ._files.inputfile import InputFile -from ._files.inputmedia import ( - InputMedia, - InputMediaAnimation, - InputMediaAudio, - InputMediaDocument, - InputMediaPhoto, - InputMediaVideo, - InputPaidMedia, - InputPaidMediaPhoto, - InputPaidMediaVideo, -) -from ._files.inputprofilephoto import ( - InputProfilePhoto, - InputProfilePhotoAnimated, - InputProfilePhotoStatic, -) -from ._files.inputsticker import InputSticker -from ._files.location import Location -from ._files.photosize import PhotoSize -from ._files.sticker import MaskPosition, Sticker, StickerSet -from ._files.venue import Venue -from ._files.video import Video -from ._files.videonote import VideoNote -from ._files.voice import Voice -from ._forcereply import ForceReply -from ._forumtopic import ( - ForumTopic, - ForumTopicClosed, - ForumTopicCreated, - ForumTopicEdited, - ForumTopicReopened, - GeneralForumTopicHidden, - GeneralForumTopicUnhidden, -) -from ._games.callbackgame import CallbackGame -from ._games.game import Game -from ._games.gamehighscore import GameHighScore -from ._gifts import AcceptedGiftTypes, Gift, GiftInfo, Gifts -from ._giveaway import Giveaway, GiveawayCompleted, GiveawayCreated, GiveawayWinners -from ._inline.inlinekeyboardbutton import InlineKeyboardButton -from ._inline.inlinekeyboardmarkup import InlineKeyboardMarkup -from ._inline.inlinequery import InlineQuery -from ._inline.inlinequeryresult import InlineQueryResult -from ._inline.inlinequeryresultarticle import InlineQueryResultArticle -from ._inline.inlinequeryresultaudio import InlineQueryResultAudio -from ._inline.inlinequeryresultcachedaudio import InlineQueryResultCachedAudio -from ._inline.inlinequeryresultcacheddocument import InlineQueryResultCachedDocument -from ._inline.inlinequeryresultcachedgif import InlineQueryResultCachedGif -from ._inline.inlinequeryresultcachedmpeg4gif import InlineQueryResultCachedMpeg4Gif -from ._inline.inlinequeryresultcachedphoto import InlineQueryResultCachedPhoto -from ._inline.inlinequeryresultcachedsticker import InlineQueryResultCachedSticker -from ._inline.inlinequeryresultcachedvideo import InlineQueryResultCachedVideo -from ._inline.inlinequeryresultcachedvoice import InlineQueryResultCachedVoice -from ._inline.inlinequeryresultcontact import InlineQueryResultContact -from ._inline.inlinequeryresultdocument import InlineQueryResultDocument -from ._inline.inlinequeryresultgame import InlineQueryResultGame -from ._inline.inlinequeryresultgif import InlineQueryResultGif -from ._inline.inlinequeryresultlocation import InlineQueryResultLocation -from ._inline.inlinequeryresultmpeg4gif import InlineQueryResultMpeg4Gif -from ._inline.inlinequeryresultphoto import InlineQueryResultPhoto -from ._inline.inlinequeryresultsbutton import InlineQueryResultsButton -from ._inline.inlinequeryresultvenue import InlineQueryResultVenue -from ._inline.inlinequeryresultvideo import InlineQueryResultVideo -from ._inline.inlinequeryresultvoice import InlineQueryResultVoice -from ._inline.inputcontactmessagecontent import InputContactMessageContent -from ._inline.inputinvoicemessagecontent import InputInvoiceMessageContent -from ._inline.inputlocationmessagecontent import InputLocationMessageContent -from ._inline.inputmessagecontent import InputMessageContent -from ._inline.inputtextmessagecontent import InputTextMessageContent -from ._inline.inputvenuemessagecontent import InputVenueMessageContent -from ._inline.preparedinlinemessage import PreparedInlineMessage -from ._keyboardbutton import KeyboardButton -from ._keyboardbuttonpolltype import KeyboardButtonPollType -from ._keyboardbuttonrequest import KeyboardButtonRequestChat, KeyboardButtonRequestUsers -from ._linkpreviewoptions import LinkPreviewOptions -from ._loginurl import LoginUrl -from ._menubutton import MenuButton, MenuButtonCommands, MenuButtonDefault, MenuButtonWebApp -from ._message import InaccessibleMessage, MaybeInaccessibleMessage, Message -from ._messageautodeletetimerchanged import MessageAutoDeleteTimerChanged -from ._messageentity import MessageEntity -from ._messageid import MessageId -from ._messageorigin import ( - MessageOrigin, - MessageOriginChannel, - MessageOriginChat, - MessageOriginHiddenUser, - MessageOriginUser, -) -from ._messagereactionupdated import MessageReactionCountUpdated, MessageReactionUpdated -from ._ownedgift import OwnedGift, OwnedGiftRegular, OwnedGifts, OwnedGiftUnique -from ._paidmedia import ( - PaidMedia, - PaidMediaInfo, - PaidMediaPhoto, - PaidMediaPreview, - PaidMediaPurchased, - PaidMediaVideo, -) -from ._paidmessagepricechanged import PaidMessagePriceChanged -from ._passport.credentials import ( - Credentials, - DataCredentials, - EncryptedCredentials, - FileCredentials, - SecureData, - SecureValue, -) -from ._passport.data import IdDocumentData, PersonalDetails, ResidentialAddress -from ._passport.encryptedpassportelement import EncryptedPassportElement -from ._passport.passportdata import PassportData -from ._passport.passportelementerrors import ( - PassportElementError, - PassportElementErrorDataField, - PassportElementErrorFile, - PassportElementErrorFiles, - PassportElementErrorFrontSide, - PassportElementErrorReverseSide, - PassportElementErrorSelfie, - PassportElementErrorTranslationFile, - PassportElementErrorTranslationFiles, - PassportElementErrorUnspecified, -) -from ._passport.passportfile import PassportFile -from ._payment.invoice import Invoice -from ._payment.labeledprice import LabeledPrice -from ._payment.orderinfo import OrderInfo -from ._payment.precheckoutquery import PreCheckoutQuery -from ._payment.refundedpayment import RefundedPayment -from ._payment.shippingaddress import ShippingAddress -from ._payment.shippingoption import ShippingOption -from ._payment.shippingquery import ShippingQuery -from ._payment.stars.affiliateinfo import AffiliateInfo -from ._payment.stars.revenuewithdrawalstate import ( - RevenueWithdrawalState, - RevenueWithdrawalStateFailed, - RevenueWithdrawalStatePending, - RevenueWithdrawalStateSucceeded, -) -from ._payment.successfulpayment import SuccessfulPayment -from ._poll import InputPollOption, Poll, PollAnswer, PollOption -from ._proximityalerttriggered import ProximityAlertTriggered -from ._reaction import ( - ReactionCount, - ReactionType, - ReactionTypeCustomEmoji, - ReactionTypeEmoji, - ReactionTypePaid, -) -from ._reply import ExternalReplyInfo, ReplyParameters, TextQuote -from ._replykeyboardmarkup import ReplyKeyboardMarkup -from ._replykeyboardremove import ReplyKeyboardRemove -from ._sentwebappmessage import SentWebAppMessage -from ._shared import ChatShared, SharedUser, UsersShared -from ._story import Story -from ._storyarea import ( - LocationAddress, - StoryArea, - StoryAreaPosition, - StoryAreaType, - StoryAreaTypeLink, - StoryAreaTypeLocation, - StoryAreaTypeSuggestedReaction, - StoryAreaTypeUniqueGift, - StoryAreaTypeWeather, -) -from ._switchinlinequerychosenchat import SwitchInlineQueryChosenChat -from ._telegramobject import TelegramObject -from ._uniquegift import ( - UniqueGift, - UniqueGiftBackdrop, - UniqueGiftBackdropColors, - UniqueGiftInfo, - UniqueGiftModel, - UniqueGiftSymbol, -) -from ._update import Update -from ._user import User -from ._userprofilephotos import UserProfilePhotos -from ._videochat import ( - VideoChatEnded, - VideoChatParticipantsInvited, - VideoChatScheduled, - VideoChatStarted, -) -from ._webappdata import WebAppData -from ._webappinfo import WebAppInfo -from ._webhookinfo import WebhookInfo -from ._writeaccessallowed import WriteAccessAllowed - -#: :obj:`str`: The version of the `python-telegram-bot` library as string. -#: To get detailed information about the version number, please use :data:`__version_info__` -#: instead. -__version__: str = _version.__version__ -#: :class:`typing.NamedTuple`: A tuple containing the five components of the version number: -#: `major`, `minor`, `micro`, `releaselevel`, and `serial`. -#: All values except `releaselevel` are integers. -#: The release level is ``'alpha'``, ``'beta'``, ``'candidate'``, or ``'final'``. -#: The components can also be accessed by name, so ``__version_info__[0]`` is equivalent to -#: ``__version_info__.major`` and so on. -#: -#: .. versionadded:: 20.0 -__version_info__: _version.Version = _version.__version_info__ -#: :obj:`str`: Shortcut for :const:`telegram.constants.BOT_API_VERSION`. -#: -#: .. versionchanged:: 20.0 -#: This constant was previously named ``bot_api_version``. -__bot_api_version__: str = constants.BOT_API_VERSION -#: :class:`typing.NamedTuple`: Shortcut for :const:`telegram.constants.BOT_API_VERSION_INFO`. -#: -#: .. versionadded:: 20.0 -__bot_api_version_info__: constants._BotAPIVersion = constants.BOT_API_VERSION_INFO diff --git a/venv/lib/python3.12/site-packages/telegram/__main__.py b/venv/lib/python3.12/site-packages/telegram/__main__.py deleted file mode 100644 index 7d291b2..0000000 --- a/venv/lib/python3.12/site-packages/telegram/__main__.py +++ /dev/null @@ -1,54 +0,0 @@ -# !/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -# pylint: disable=missing-module-docstring -# ruff: noqa: T201, D100, S603, S607 -import subprocess -import sys -from typing import Optional - -from . import __version__ as telegram_ver -from .constants import BOT_API_VERSION - - -def _git_revision() -> Optional[str]: - try: - output = subprocess.check_output( - ["git", "describe", "--long", "--tags"], stderr=subprocess.STDOUT - ) - except (subprocess.SubprocessError, OSError): - return None - return output.decode().strip() - - -def print_ver_info() -> None: - """Prints version information for python-telegram-bot, the Bot API and Python.""" - git_revision = _git_revision() - print(f"python-telegram-bot {telegram_ver}" + (f" ({git_revision})" if git_revision else "")) - print(f"Bot API {BOT_API_VERSION}") - sys_version = sys.version.replace("\n", " ") - print(f"Python {sys_version}") - - -def main() -> None: - """Prints version information for python-telegram-bot, the Bot API and Python.""" - print_ver_info() - - -if __name__ == "__main__": - main() diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 956c554e839a9b62ecd8761e5390c6aceacc3f6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15801 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 diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/__main__.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/__main__.cpython-312.pyc deleted file mode 100644 index e951048b9046905a686b733d2dd12304ecf762ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1766 zcmZ`)O>7%Q6rR~#@7n84qPUJqD4->2eoS#3$Tgu#Nhu{X2~9xM5?VIiiQ~lHwPwdj zZ4wkAkb*dn3ZxvWqNw5kN)J79;6RTE4t9SOb!kt)p%)b49*|GGS^qRCVWfTU&CGjm z-kbNm*<ae)R0QL%Z$4TaR}lK0Pntt)2vr8cHnNa~vnW~TIEi5{WQClV6fv?yOUg>Q zKvMSQKvu~GlR=PWB9c%y*e?i{@~M<mt*{jY9tIu)u8}rNT^>Y;1_ea4-Num^6>$;A zv`2hC6~kU|I?pnWZDt=~Sb>GGVXP49!kS^gwByY5oH0Ig-gxiq#o6=IQ=Uu-D^NSt zaOg7$C{L>TE0ApzLX11}$CA*Lp71mzd>!-T>tl)AKQ(R$yA8{Aw1$?#Pi@1rnbK0* z|L@JBUUc9b`M;Vh*j!r>P9h3dehC%PD!MFQLaR6?PQ@foOlO!Ew1}IcnR!x@<MFIx zr#WY4+J#G!U1kwVV~VG`h50;nQp9yVEwxBe%Z5{6`2zFg*|~}7cjvs0*_OsxN*(Gc z)3bF!wn)mch!=1f&E&b;x~a=AQ?D&17M&bP<V@zSBqp3xAxCWHCK$<*G&OT^mt|7R zgvKpr)y_I51e91I_DUj~nNQ@4Y|*hthF*C!;bs_#=griznI=!H6NZs9Gf?uOe9>z& zAYp@&l?;ag?SkW<htGW<$OhUM0)gm*&J%l`gO$!fPaFC1t-a9;mC*~2MIoYY%KIwP zB43VuKK8}wy|7*h>vzIEWvS<%#{txKd{67IX#F>oa(MV}gagt09mn=X;5D}soPRO^ zy>d(G9`6-z^<bcfP{yn0qwF>a+Xpb#M8Y~^eBU1yW-U}*Mc0HiL}d%;RcNVeqKz%7 z1bVv-oZ^F)0oK9^w>+TJ!pf50+>N6e>?j;svZb_ej1NQ?T*HTb7eg_%HaSBxP*c6p zfO^JWa3~ZUs-T0U*UK1hm3-b|FY9cP=w}?JLzC*JZRs<9t%pj{BeeCBpbyq?%tNJM z)24>i8rDln-A<p1DSpMhK%NKVY0cC4vq1UHc%oZ$J*5$(r%;m5nkf<!JnbNEyfCOW z-x8NMv#!%9w{Q17^DV>Auoo5w;B!qN8|aT?`d6nn-hLp3%9{S|b35&2HSzQ4&5J*1 zH$VRAoyy3$@&`sm{qU}2g39KbUmN9UUs>(HD-Aq|bZwuya%wNqSBdoPSl_*VCo;S- z$+gaHO>T{q)fewcJykda9Re1Q%?H*qARGlO{%XbqdK|Xl&7?fu?-4x-te%j>dx!EA zhT(HLOdt&@a!-o-T3)c(Uf>1(2H>TgYQX6WKs=ch^BFr$c?^`l=`_Fz?>R4&a%`8G zfQshbGwRpJkHSBbd$-LTF$~(z?OJiwf}=UdDrCuPG!7da>+S>)=s1k4FCiTH4XF>& zi9b>7A?n|k72LaZc}KjmUPT~QqcV_)fV-fhC2g~GTkO6s1wVUZUqsTg{we<gbRe8A diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_birthdate.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_birthdate.cpython-312.pyc deleted file mode 100644 index 5cee3b5fb09f17019a26f77c938d31c9b24dcd62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2980 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 diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_bot.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_bot.cpython-312.pyc deleted file mode 100644 index db2ccca410586c6355bb52df38b111c3f6aaf7a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 410780 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 U$>DYRzgJOwxGnGZT5~}EUmiX6zyJUM diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_botcommand.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_botcommand.cpython-312.pyc deleted file mode 100644 index ef66947703677cba808692553394b2b897682d04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2934 zcmeHJO>7%Q6rT0(+Od=V&^E0qvq~fsw}}n(km6Q|;It?WaZsB|)pD3@b|>*B`(tLt zO<i)xp@>wXB0ZpjR6&oRa^S+9BZy0_R!X&^QYC~C7nBkzRXy=$cOAPSZQ+Q-NIO68 zz3<JwpLsJsX0vGo?f1{$ul|rh=x4ELwRkw$I1Q6)$UrJGBqL%;c0`TXQ8g-wb<~R4 zaW(GGV^+dWs!4wyw`4n|rX&<WZy_Ub2^mR}ycrF2s_BNDPhC7YRW+GnyGGq2itajG zGaaUAj^fVD6P+u(s&R#q8YPT495~7pvB(_NY~@XtD`nTVHODCYCY0tQUi_r#XqG2W z*0|}yEH8N}(8{<5U|4jw(38G;pvb4rOjbrso$JAW1-%?DHjYXNeF&x#q)K3Z<SZDh zMvaIXGonW9x@5#j+(^KeBngt-53t$93YwJ+`BJwklhphRooa*m{NBIQ)Gm@CS%D|r zM(Q|>DfAR{ZX0w@2Ri*sw6YC)M+ds=ndrW4&^tTO8G&9w7bJDp8I;d@X$VpnBW*s0 zP+EcJhdhk$6QP}fi0WZP)4pgBCZ@QvkO`0|x}`Bl0xELFu4z=8fwVClg%fJ~Qslk5 zW|_QEP^K2$Fp0K-`^rUPm<FN5P<+^+Vv22uNtKeuIW0|xKQj#pX|!ktVLCPa`~o`s ziH|J=|2snGSjkr|3=QGRKnbiZO*2lX^Cd{&3p_B$w?gFaF{Q-khWtb=P4h6p3vJ&O zCdMkbJUKBjQW>2d+SD)hcph-%+$K=btKcyme8mb%8O~UE-W1od8j9sE5~^#AJfZ%C zGiRBss#t^z+@NBZbEY_l;E=il&SSa@XS1*g>Tu5%yGPrO+iLzM`kz<?t{6RWrhIzr zovE?O%D;C<C%DrkVFV%Y=1iTF|Kr$7^Z#TV;W9{u=g;fvNXp7rl9$$MCSF+7;ILA0 z`Oz-XWueo<+X+G0M`A9%jqA{TB3(lq#-Lq}EukxLJ1#}PmTn4JXcAhImJp5vE8s<7 z)zXKSkf?uK8&DHlX>f%I<fb&pi2vKtZiZ_KHQ?f_P`J8LKH<e#y+)`fV{AGm$GB~u zm%^rjMO|ZF63<dXE|PrQi!ox&wxxV8fGGAWEyhed0mP|Xe!Nhux;81=8fWK=qpn`J z#f@BSm8&7fO?`pTA;VpCELVftP&`kZ^F_;?Db^ai>N-aXue@4hCMQERO<&OFNE=<m zQ2fJq6>1H-1Gc@myQ2cO3>pRo8-ec8GWto*UQRaU-W#WG$-Q^v;@yM&E3uC<ca_5{ zu{(0_{R6o#20t78GPX8wv^j9}*8bOk+kIcoe4M$QxzfD>N|4vpQCeZqE|*@9;B*uV zAON?6kl!u*>}WQ@*h^y^ykcOU!B|{FAt#Bk;p#vJuQJQ!45m@I3#f=NO^QxfONFPs zp0>$vo3_d6KEV=M<V8(~dp#Iyj^lDoyl+4g?G=3SZlDK*P&SO5PAm)KyhO$OgNY1% zgYFShsaAJTFusNE(Ff>3WN%zve;MsOygYXQUHk`1#`oQbu8ZNDet-C``u&CG$#V|{ zX?+)ZabPVs+{_KH<;u-md3k(w&nmlm;C8IM9*Ke``S}9<gKK@qntjLC`o^1m<I9t) zXFol1RlOY>Z)td{z=qg@iZ_&ROeNn%#goWO@J7va=6q-QzV+l*ZU(;XZ7mD9H49!L zRGdL?Pm5T<b#7X$0Qv|E0wlcl6$&;LZhR~s52F1#Jp@bPU)B%ZdQ_662QMLMLi!c; Z{ep7$(2;xS(4UE6NnXu8L@@YD{sO2%7q0*S diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_botcommandscope.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_botcommandscope.cpython-312.pyc deleted file mode 100644 index 3f329e9185ee1dce8831ad0d971476007b340766..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12722 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 BA0z+( diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_botdescription.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_botdescription.cpython-312.pyc deleted file mode 100644 index 4cfd17cc6f01ad56e3d45c78a0a25598b56d4784..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2572 zcmd5;&1)n@6t9};ndyv~Xk3?ksIf)J?!=@gX8mGV7FPp{0TU$wWdtjo?wU+*dZx#! zntYi<4gnKz(Tl8yMfPZje}Kom@4*BXl*WaCc<>^LiMZ^^_qu12NwN_kf)>o{SM^@K zdhb>Je$3rWCQV@c_Vp*F?^_7@87GaAs4IIPfO3;Kq(B_%#5`J#6=D?ixEC*L1ufJy zFHuewl9a^AHR2>zh?C^nMm&m9NQJ8@Sk;?W^@WyfdU0Z+<VvILJ2j6RwqH?}TakvE z^9_IMI=2<*B}*BCR|S{6q72KJ;2xhAR@s>H!F*Ace4(<2!=)|Us&f5``70irrGY*c z&Mgo0w#K%xFfLk0#>Ym7U0c~vo{>z}CwrGc`4md$q(Gtkm_rM3Csxp$xTD>oPJ$<( z$Rtm7fnQNuB}M9_R@w^sDw(H+mT{8RgSIz)HGG(tHBSi%>y2tVtO~2-SkDD{q>yyl zfDvUZ4ZjF(&@J1uq%<sn4J%hIVNF5r+=`*ND2HDB<C^8UYQZ!nni_dxdl(#gE?tKU z?ik^=e#6CMxGRjjrIg4|Hg$H=fa60qGfK@gjae=vG~IF>?&R~v(4aXK*{+IdnGesv zBATKY7xU17{G?Q3GMhIh{-*S+kbyf@Q~b=4;KCnk%3*Y!25GD6vY9yx@)SDUqChy< zF%UT5t_Z$h{O!$y_>$fv3ck@;i!YHIfRd%yw{!!2VNkL}mk4V_AWP)B7Fn8Q5q&Uf zIKT(6cYJKr7bsaE>#<RRF4;tokhLlofzFs)aTQ}>+Cd9*9fo%$gA^+Y&KG%B3pB~S z;$dCj#lnZfn8c*uN|qn`xsqSzxw56?Y;M@MYh{3#%&9uU2BdQB87>AKf3D*B7Ce*O zEU(PwJa;NrT~H;za>;yYC?{RT2db7mV@>nJ-8lvix~b)6bwRYj$%`FFVPQ6^=?9~H z8N`ES@{^ufOKs_$w?{Vh&U<?9N8`m+?VjGb-QDv;ci&cb-)2|;s`gpiw%+=A>ssrL zwmsNK*3;OVidE)}1!=}2UID$8F~mgOl48v9ZCHk$NDo*9)Hu9Gfwv-%`octmOuc0` z_dLedsdy4h5-<A=aSpvw4bhE;9Eb-iWH**c=sP{6{rTm$x8Hg1caltW+<t2ZKi}zh zI=5aQ`4jbB6ym8y1RIot@o$pQIq3E{a^!Fm6W#hJOcXL}GjQvm|Bv}7Op7%=tTV9E ziCCv{(`n6k6hoaoDzH`ii6{{b2m_wU|CFjkE990<hzzEPSdWr@9JMFVq>1)}Rb<-; zQ4KzdKoxStGmm(+2SjlVcAiQUy{{or^n^q)xYa$l*)?>8C?d$6$HSk+I8AVV4i{0p zf`;R8z5s9@e?NrtH!nnRF5Q{my7KOEIAes-Y>U8u20>CSRNcySNG(BUgIP`1(4xNr z0$UKAZ!DUurd&^&u$Rk-kV2}#$m=Ak014=!emSDJE20;sSc*gz-HB65cY6u_klrUx e|3WU^Cw=?LPTKLsNBaam`>%rd%KQWMFxp>IVyFB7 diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_botname.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_botname.cpython-312.pyc deleted file mode 100644 index c88062607fbd0370e3a8b3cee7cc9cd1a70a25a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1696 zcmbVM&2QX96rb6(*WT@Jk_rlGN+JshQX}GRo7<{Fq}vY~wHt{93HdT{?Afdne=IYz zNjKz>LlKEYMLD1r2?5tC960hna3LyEk)fgz;=l!^gi2LUys^C`hn^V8Z{G9F`}(~% z?}u8gf?)mi)rXy$hS2X)7%Vks4&DXk4)TzVJnR($92V?CShR~+%EdqlRa;GYB`AfO zt);vg=waC|V^ly_kXO2iJdJ9*#muH%>FZ{Bqq)%Wxe>-*FQA4SN5b(VZa9$<FRf5l z7^33{gV8RdoJPWMj0GCdW#)v&QY^R;IU%+FloriGqF(kRCrI?UuJB{vOq`U#Bo|I3 zI0!=n-MQ2@{LyFU=UNwiSGZYF87<|)!3HoNL*5kG7;-PX2ie+1uV5=)(Nn&}o=R1( zL`zgV2{+ryHfm!}yE$a*w7l|SZso|f^3o9@XYDGj(IKf%hduo~?Az!DwnyfXSx&SI zv1mbxP75QHB9+7PA0iwOq7sYA9E?iEfR$y)jkpcx0I(Z49AIS<<FM;6X9?i;BSTOY zrnl$^Jty!*-!c}~;~f0wsHesyroKlR^^8>QO~aRNsLzasBLr(K%CamP;5R+DvY0H( zSfh-~(s&;A8V%#z8EZN_n_<hmks6oLOLgOP19ELFa={kOhOzLxEN8%(ztj`-f9OK> z73rsS4<{9;>yy=W2ZCVoF|aBSw*W*gfF8-FmEXY)AfMwqNWh-0o#H0C1rKGj@Gahz zcVS_)i8m1$SU{U-MafQ%(zd)Kt)>g^ln4CbzMHcc^`XUE>=?+Vny9?jr7Y12@grXl zl7^j>iSH3v0iI~2%_!ZVrjjU}2JOSV;1)^Sfe<c(0=&1Lb?Tisr1j7de64;lc6%Yb zHeMI`W1Hf_cULK!^5XR<h#e??eT_zI^}t`Mcl)9fN7L5Xb9L?uI@NXDRcDzVYS#($ zr^MRo_SrDF+!)FG+8V?^1%LS&AWyf@uX=4q+tWwCnf*~8{YkI?d~$qS`K0`4Y~pM4 z3-j(PAPhaytDjbPs<(y?KnEq2>of0@YnNJA7Tz(BOH`ycLXrw0*=Pa2N{H<7{6r(f zi(U8)Xz&0=39v=zH6|fpFb7c@DU%a0spjEc^Fv=G!_rx6=K7`FBa^S1$vP%QKZ0{Y zoG6NgBd3tGTgw4=X%G-%V)g>u<+4@YW^zg}S@)Ejk_T6TJpBkgF4R<ge*zsJ+q(Mb z^6cNJq`rK2eqV0ijedW6?`-pl<o8F=#N>nV>Amsk2jk7X@#fa-ZS}VMS>?Xc{6)FI zP7G|f%wuc}grp?;T|Zh*BTmyz^g*4obVmoGMFw0pc9@)u$%(;Fi}Zvaa0~2Fo?#|4 zxrZ{RGPP&=`K$nMu}KhR&ipkX`$dfL<JS?M#lN9f|3DKD(ey*~#y_P~xQVx;CrIw8 GnSTMbh`!7K diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_business.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_business.cpython-312.pyc deleted file mode 100644 index dc9388b688b71eac5fe8e8841c6246a435e3adb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26142 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 Tq5InFbtrN3#OG9y_2K^mW6(_~ diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_callbackquery.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_callbackquery.cpython-312.pyc deleted file mode 100644 index 9c6deaef3ee06f87a92a4e8543dcf47e1610bc09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29616 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 N_ox3}pkG$t{|9wu3p@Y- diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_chat.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_chat.cpython-312.pyc deleted file mode 100644 index 5f51bcd6b4172c7c8a409e7eb9fe0aeb9b83aabf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113017 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 Q;!f?WiHE~3@kv(pH<&F?tpET3 diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_chatadministratorrights.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_chatadministratorrights.cpython-312.pyc deleted file mode 100644 index 91fe96b3767594855ae5f8186166e6562cd71570..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10767 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 diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_chatbackground.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_chatbackground.cpython-312.pyc deleted file mode 100644 index 07add755b587a495025881bb33a2eb01f5e09c69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22327 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 L^c9C28~pzT#m4XR diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_chatboost.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_chatboost.cpython-312.pyc deleted file mode 100644 index 356f57de3d4a7bac42bc75e8f641a856c6b81115..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19317 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 L^$QL+)|USRM}E0{ diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_chatfullinfo.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_chatfullinfo.cpython-312.pyc deleted file mode 100644 index 32348a14a585842408e86be87d8d6bebd340c16f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28105 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 diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_chatinvitelink.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_chatinvitelink.cpython-312.pyc deleted file mode 100644 index 67c8f70c80b300c2bef9d9bfdbf818f7aa1258d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8195 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 diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_chatjoinrequest.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_chatjoinrequest.cpython-312.pyc deleted file mode 100644 index 341f8764952de5ff037147dfc51b7aac833d5bba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8853 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 WcE1zb_d%i@kuqPa{D#q2i2r{Zn3i|| diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_chatlocation.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_chatlocation.cpython-312.pyc deleted file mode 100644 index 1d7705ada7a6205dd2d28ee5effe96c916a29ac7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3305 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 b7xu`>54EAa)bU4|^NN1^xsM49Qs=(`F|>V? diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_chatmember.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_chatmember.cpython-312.pyc deleted file mode 100644 index 401d3fd766df89c73b64bf6d341da134a6e902d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27726 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 GG5;U$CEF1I diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_chatmemberupdated.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_chatmemberupdated.cpython-312.pyc deleted file mode 100644 index 5b9018e7d9591f1fa5ebb8affa0277f85fb8c8b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8973 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 Z`%Aw06Ys`{{;zwu&ZX$D3I4Jj{ui2ZVM+i1 diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_chatpermissions.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_chatpermissions.cpython-312.pyc deleted file mode 100644 index 6686a107e12d78245905919f5b82af918a541857..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9933 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 diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_choseninlineresult.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_choseninlineresult.cpython-312.pyc deleted file mode 100644 index e2109790406fbc0ff5108364b171559b07001d5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4226 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 J5&TM%{{j99t=Rwo diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_copytextbutton.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_copytextbutton.cpython-312.pyc deleted file mode 100644 index 18b020e58e5c045eaadfcaccafeaae8ba11d30b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1958 zcmd^A&u<$=6rQoy_QpygwFo5*w9E-*5!of}0m(#&HU*RbNu~Hud|<rZ9mmt`FJ{I` z9CFAZ5{X0w7t|sl;97+PNB##cRN{bEREmT+a6t(HQT4=|U2l^jj@%e&-@NgA^X7fu zn|c0jY^;u8{Px8My*U%1pY@^`m7#KS4U{{`M=j)IzZBrG)GA@EmxFR>w2VwQf=XCz zRWT}|H<4f2MShhT2jx6Qt2U@v=GH>9$0Z44zaKE-#gTG(B#9f5xO0nnim0Beh+v6e zl0^zEq{#xdD%_CF$H}0{Hr2JhQgLMes^eNXHJ1~`<H!v_A1|DjvuN77xU#%-oqNj5 z)5v9YxHy>u<wHQmPzwXPl8;+uztl4PvTuBj{R*o9hAOLF0KcxWhq~CW?T)w1J+z5i zBP+-<)A1+saxVekI)RZP9l|<`C?Y%xc*MvW8+2k<_@t8|%CUQK!kHv8VIJ>t<`V^w ziHgArgatgww%GOTh#aOQaTm<Ms~5NuI1`%MFmZ+30hW0LF+`YovG@CKz}3Je&5d}- z`M+$>f<tvA_nCkkvTZLCu8(0{kcO+2XtZ@|Z35?J_F+!8P1c!^x+K2O{6>RZp0!`j z^SvroWg`o&3CfU7H-Mr>TPo4E8o(KQ47j6F02x5RKhVGOID`(<P^&XKSEUom?~0wR zUARE@LdNx5L#p$;^EMB;vfo))qVvl)-lfggZ#LUA|4q!RH_yZ*UJq*E0sC@@A86xH zZT7!r0iLCyYrk|4r*${sbZx_hiy@%<AfcO)R|262hEMko{he%r_!Qqk3g&$5m$%Vv z=uz9HuknHQg@MsF-bS>DfVR;sBe$HDUG1ZzW&?ai3jK6G7^)ZzkX2d|+Qq7*71>Xi zNKHz4#1*Ak+UW@8KGm;6rZw6XjBPQ?NDaw??kO(tqS+IrRO+PQ^6or}on9O=Cv=ru zcdo}?Kh%xSDX#L2RNPx*V#bd*q9AtRK|1R!T6Y58agu@R#nBae_Oc_nVl#>Bt+}i0 zbhks{2@N#ad5^J^ff$36w<ezKT6TeE7L4*G5D$0IPv+Qu?Y=qr)#CT&<PWCv<AsZR z#z!NEQ<uK9KC|vV3ybkXbM)iU{n6XwC$I-ub<IoUhK$m*PHEofK_8`5cb=i8MyVfr z@H6lsgIGyW%g_OYu87coI$4tG*pM!d1p%cN7U#eub)jDq=e1X@5L4RVfOxozj!Wk& z=Fv1dH?^~H_{QSzs9Kr0yK<zbZzjK;zCSzvm)4K95Kk2mmMl|Dz#^@xLBgZeESGe$ zD1%K4E$`?;*Drm#_|c|)#RF->UM6z{I=6c$KR_q@$ehdRcvU<HON~Mj5JzQ<@$vHr c-@p&hGryoK56}yLR4?L*Pu}|z!IVY#8`0-6WdHyG diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_dice.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_dice.cpython-312.pyc deleted file mode 100644 index 433bd9ac5954d9584c985c6b8c741a8337989a7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6415 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 NLhCoaVem=C{2x*3)%XAa diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_forcereply.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_forcereply.cpython-312.pyc deleted file mode 100644 index 556a3532464c7b228cba94da816e33901d5eed06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4165 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 diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_forumtopic.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_forumtopic.cpython-312.pyc deleted file mode 100644 index f70571f631ab2362a9f43088947a77533a7b7d77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8028 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 Iq$C&fABxn?R{#J2 diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_gifts.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_gifts.cpython-312.pyc deleted file mode 100644 index 63ce3d22335f21c8ce94210936d2cf7533f3080c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14872 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 diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_giveaway.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_giveaway.cpython-312.pyc deleted file mode 100644 index 8c12e2fa39568e8490904ffbe73ceaf3548e95f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16674 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 diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_keyboardbutton.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_keyboardbutton.cpython-312.pyc deleted file mode 100644 index c73e97a104ce954bc64a901d4e33275620e797c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8819 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 diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_keyboardbuttonpolltype.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_keyboardbuttonpolltype.cpython-312.pyc deleted file mode 100644 index d95113295803d9aa8969efb13407eddb194a21e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2421 zcma)8O^g&p6t14%o?%#`@+YEHvIZQo+Y^O@nGg^JanbA|EQ#rZy*<-4GtKrNRW%H= z?tue|Y$DN%0TbiT$sim(c=YZ?qNk3VkQfhM%;I7s#Dniuckd4%Qpvo2RrTuqeDBq( z`C;S6DuMCG=kNEHD}?-tlWY`IX4wShDshNO9L>pjnx8Xs8uEEB?-$I1;tO8UFPSC9 z7rnBto4VplUd6APRgL7xapIIO5l3f*8~H@HxnWqTSLY_Cd#<2<==42C+hHJWHxSeg zXxKW-+LFqiEh%RaXMzP1cBmXijD{WHrkTgO-1h0o(DRJnQEy#~^{Gg@VPJc}k7OcK zN*k;cSkU)T>cr`($)j#tB9G^%L2Wy6EurOfvit@x9{>uBm>M9Fb2KyW<jg_^;&Jj$ z;WN!CvLY)z3vx~gxH58`!e!FYAnHw~ewkd*%*ts}uf$v5V#8KwbLU83$}q?*+y4M8 z3W_xDH6gDC9D$!>bkK9#JqoDVo)-?7LuE)?03K(yWKNaBumgu8ULeZ?z!0J30AUmc zjvI7oOBqKU2&`a^QB~&>m;}NrF)wY;7GQ_tc|Wqb-GVH+ppkK3NwIT%+jHg6pwoje z&DkT4E9H<~;W~_i$LiP^b<qrSIc?ff^5zUiI)h%R{nV#p7i>TBm}n{`7+up2hRqp- zjvfgmJ-|{41Mz8v^59Go&0*eMb4tPZQWNlP&Irk8#%P!oN|R1>Xj68_(M1V<q=jXm z4db0N6Q=Si0x*~}rts_w#_7NX7g}t^F$Mi<Qj(0&Fz|*HT@wmANXEIoJBKyTjK>;2 zb?o?=w-28}+v`kZekjG9b^D&pQv<0-S!oz_3IOH<SFnfO&V-<T)~Qe3wv|eC(}JP8 zb%qi<45@OVfYxT@L2T<yn%zPbqROZEABZ3DaGg(3-)pM<34u+luG90MNzSl_s=#zT z9@TX!pA6yjdP3L2N_ZGmY)y#b<aI5s+L3F`4s0l2jy;;!fV6W!aA@$u{tOL+EPn&! z6YVOI@J+@-ex6)`{rTKY?FP!i(1^@BIyqZP*49#~XR~>2UduZ4Jh4_z&6Bh0waDa> zZ$|@}6@4JHY5hLVZlp^Z8IpQ#l5c={U5|^RA2A;5mgNSnv@DLM;%b*k%V&OzagP00 zg&$We*Rileh`4NZIAe3HUWf~Vd7V{!K+00>%CbZOj>28Mcz@97g+6QewiM?ZN5gjC z$48`*-S2TB-S#Zw<4!mTywHZ`)Hu(A^9|2!HKL*Hg~2}K<yRWQm25n++p~6;t)6aJ zvuQ6++9@U$Q)om(jzG-qdUUThvY7XSkT?Y7-bHe^Mk*r<<y-ppFHiiaZ~s|u{4%=d z>qB21`u5fDroZ3+)99O*3m;Z)?|9*h`lt14J7F?%Td#doTc}+bSq2sG@=eyOh-YB? z%(CLDWhJjF@HNZAKArBAEz1epundR^FO&k%$6|`}&=xtSQ@I~+OaW~(&$Fz$#y7*3 zz><26Z$T;e*N~8%xbZrWdzZ+a+%rXeX)k$d$Hj>yo$MN2DsCul18%SJX9c+1BU?Wf z3x2k`<@syx-rBtTZ``^=fbgxE*2#K}?|?~M0#xDEN}SxDCC{)jE_pIJW<B1NEgDu| zx}HetYRdzw2IfhqSmUQx_Eh(`p+J(_!|<+?#2<|JzJ4G<^dNr`rU-=C4P+^=Y1*CL iL_4W1lIMOS`xXgZBzqUhp1Y+{ZQHf?{vz;Edj18D<Fgt7 diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_keyboardbuttonrequest.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_keyboardbuttonrequest.cpython-312.pyc deleted file mode 100644 index e2af6270a2bce8ef22c8f3c9b32f7fe63a9850c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12019 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 diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_linkpreviewoptions.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_linkpreviewoptions.cpython-312.pyc deleted file mode 100644 index bcbd7bbed51a696b86b36a816718166df9ed0e93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4041 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 Xmb~;GdGU7Yq^51Xyz>sh??BG)4P2Qk diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_loginurl.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_loginurl.cpython-312.pyc deleted file mode 100644 index 0b6ecc6f555c6b162673381225d903c2ac3e8f24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4801 zcmeHL&5Inz6|bI;o!Qau%66nkwn<#ELDI-OGbBn7EXG)|A+``J;aw&1TzY!CYi8Qp zU#hC!@hD5sL68;1gdBop2#Lwf$p1+$G58<`3=1KLT+AwRi1Eq4SKU3kV=q{TkW17; zJyl)r`~BXls{QNoa)aUd>`%WMt(;)&?=&f%YCd@QQw-i?9_upC@=AdfmbxX2#^s<K zR=O24t_0O^p}SzQ68jnRs<)Z9AS(CDnT&32Qft<4zPdT`6%S)C4Fq@NNIQO{xD)ZX z|F&>7*CR)BDH17^h%{FCrU=APIw8Lj5B=!64BG!BiA`%-znW-2j+_AFm4fW5kwdGO zH?FR~=DXU>49MQg`Q%|AgWtd>!MYawDtT77?3KEeMMnR;V_w;-{L%8Nq6#k-MD=OV zd$rl9j#15gTg0eNqd{Yr4J@y5`*?S8m%U?k8yl>-G_4nQI~SqcxS#tv=Vs!-N1=t} z@c>Z}+>Zi35`0Tc`mrND-cPlTBc3YZaUF9f)p6)(-*tju(%^XTWfV*Qra;g@CEI*M z$ZdfbQW%F)WRVRVSA>WyAH>oqDk7H!nE%4}hC=i4NJM6tL~&mk6>c2*(U1>h9M1C6 z=9hxtfHD%oQ)HkQgNth?>9~RKZo!1y11It*^8;UoV1rTccEZO_q>T=+2JsN?w`VH2 zlO&3(G)ZD<$d$;28RrnNZ6Ot)z<<)d*lrjx8%~%2V*OaJ@!l(*uiR8A%=k+qtrNA@ z>F9PSItL3c_w0-_Ly*ey02kcAQP3j^uOX$W54k>qBV=f(#EsMmd_94|<2VQM5$t&c zBjtNSB8i4=mHQ^$zT|6;)^e?v%AiM)Gt0R%>#-JVhMyAsR-E!MRhm1&*qOk<kwAP2 zGb2Zh3j9dn3V$1VJV!f}5X8tIObi`C1rPvusDNgIDKi=LG)fL06|#&7z{nHIm3|*W z{R6JvtE8WBQ6SJrJqWZLOVQSO8Mk9O?2HY@R0oOnqZf?*;BU?G&+>6e4%LD42oFEE zh6-BiDJ^@=HGV1LuWxQ%+u+yVyh48V1&<RE!N{?%N2V0MW?ANr=Ya(D<nfJE$gGMe z!1O>kxil+-9K1*j^(GWyo4=72swogD2KY6=Ph`A}6d$2;brxyTKzdQHh=3Cq+sWKG z)rc)hlWH4)cKY;%NR67Yk6N2K2*6?CkT-dml5~2AO`)q$2RJfyMAUoJ0OgzcBe`=1 z&noBJ5}HBp8yRhpM5MJnlL|k_=xw$Z@94u>T}1}-*1pEq#Tc~)g1j*nnTV)^5j)Zt zA|=jHr~}a`b(=yKk^hGPGbj3bK>*R{PqAJ_!hLrH<YaM%1kW@|5;ZfM!ZwFhYPDi+ zxwj#-rkJKlCi&6JL1mn+G-)|4*hGau8jFYec8HQfO0jze$^bD!XH$uA{edsMRg-x) zl@dih#|v?1m4T9pOW`IOTpALj2~Vgn(0JHg(Bw>?0pJcpiN^Udwx})P&8aX&M<md7 zL|m?bgW@uYQ&~vKix3QRk{%gvWCfv(WVSNPS~_mQh)0UwOsPcA6-wJ<^gdxbt_xHZ z*y+b{(3=C#HQE-kPP8dg(W73HOEBR|us`^UwxyW@N+G4sI1hJ;1?QXt{1*L);FkCP zOV|~BU|u|Kg8yGl5L;Vuz-|ARo8X-2$4xNn^^cpN*<rr53C@A%f7Aq<mFW`t<!ncv zE*(BPOivtT^t6nfZ2d!P+Hexz-oi;?sN^wR)Z`+)>hz+kucSMnTU>Q5Ov?HHhkwD~ z57v83<2QTmEbOp%LAz7^$ht?gcr3PK?J&EP&9GL&jAWQ+r;J%;HmhJ(=wdtU?b%8} zfr}(bTPWtBIbMtpe(&W&i%nRwv@Vx0Z`P+(T#|&G)@|F5d~MrD`8!>-eb1)LhMLyw zffVAVXx63`C4#|G^d>%Fvdu-vwp9(f3{?27Fa6Fa#x)A3RkhuDEp~B?z_q<ooc3D^ zmy9hzyYe^+Vh1;$&bElQJAvQtBomx>qYLdH{-~p{;kFXT-J(O>jJso-3j)&EPA2jR zsJ;1Qahq-zF8&;!)n&ZCxWztyiY>0(seN2O{lVqG)lYv?@9dp^cDM4|`reBdcPpRN zpT1xG{`hs8|6uQ#@BjJS`{(Ww(aK(Z>32(amfl@?2x+WYUSD5t9-~;&S;@Ai4cpHC zaDnlXZPTqUU#Z!)7rXe3D5)UU3d1sP5Ry<Zt<c#)QqqkN)8#yrt_T9#Zdww5c43OZ z^ol%5R1{$IdWIHm;Pu6A_MmjJTHluzd-9rf>y7;eJNx4OGw1JjF6<xsPW9CO3OnEa z*Kv&YmY>+K(w7Bx>bbk>_u+nxX7ysWNV5ie?(7Hp{ixtQ`MtZp{P@I~|B!$O3@`cJ z!iM!`U6LKs1wBb{%F28?U1Ye8!+Z7zn(VI{k^ntDS$u5Usire3c!kPhK;C`GG6m%B zm-Uyju)Zu`z?9;kp2usyY+2TWGt9bdeafEw2fOeoJOBB@Rm(cH`|E!*`ZY4X0(Jhk ASpWb4 diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_menubutton.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_menubutton.cpython-312.pyc deleted file mode 100644 index 0b6b0f1cc53f28b0d7aeab887d2d3a678ac35c19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8812 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 E6T?iq5&!@I diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_message.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_message.cpython-312.pyc deleted file mode 100644 index b39b480adb0c1dea2f8e764d52f2d94f45b4f0ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 193118 zcmeFa3t&{obvM4N=j#1L67K~BNJ3hPH;AVYPXhvj!1fxvT6C|_!an4?D?rL(JBgb> z>clu{Vw|{NoYrlic5B?GHEGi?PMbDP>ozNk7G+CY+NO{6iG%Y`n*aCuotZmx@7=wU zmWN-7*Jd<x@7yzI&YU@O=FH5QKP@RKbl~@&|KmgbKRKA~_y<aeU#=dx`E0hs@w7v6 zcpZvU$qG8XS?q7NHyeMmgE^sGZ?2Qx<plFW`QCgM&kedl1>S;Cp|>zp<ShyndyCog zykJSF)LY8p`N6VKxwo9fUBQY_rMHsB3xZXlYHu}*7Y3(<YP>ZpUKFei)p_e!yf`>D zG|fAW#Y=+ILo>WHSiCeiGc?OPi^a==vqNsLo5jn6b3${yb6LD1I4@N1t!MGd;QY`6 z?*bOD3N8#acpF%}I@lO$@;0&fl;EOJv$r|a;%y0eyq-|2w>8w}Z3`{-E@tm*f=fb6 zy-QiVHn=Rb+`F8`>w+snE4?dOd}?r2Xtj4Wi%$!-ht_!4u=w=g+R!@hIu@T1Tp!xt z-N52AgBwE~-VPR@72Fi+^melN?BM3m7Vj1ocL%qIwt2U)_?+PO&<^ho7M~luC$!VM zlf~x+cZGI)ce8kXuq(93yNAW+2ls~V_1+uW=iSHB3xfMY-QI2%Ul=?PI_N#f;tj$3 zLic;`XYt1110k>1%i>MJ2SbOvheC(FheHo}A7alI1%06&Z%@eY^|N$y@JOiF+Z$56 z3QM;H)li?eFLcy<l%+kv{!qXhVDZ-AvCwhv@lenk428U*P}my|MZA&FfOjDDu=in> zr!A<3qTVQrFAl~+gWkc=3Ga!}N$<(fDeo!vd`WO9H0&K_@uk5Jh2q{gi!TeF4n5+1 zB=o5F(a>Yw$Jn#w!4HQ%;{6DVuLyoL^tktNr$a5!n!w8|gFhGgnD=9$k9$8JI^#VP zI_o_f`h@orp`Z8ueCP@96QNIfKN<Rz_fw%Ky-$YDdC!HO@;(*%wD;4Y&v-u*`UUSV zgg)#2Z0K{|&xM}$J{>ymJ@0g6Ikq{JRgXKA)oRfT=u!0ZKEs~2<LMgppnUpy_H-?t zu2VlRpMHToU5}?5Oi!O3%4*y=ys5iC5Os$l%3x4+_eR1oe;^!n`@`<Ykz;Ca%pL3Z z$K0Aaps7(c9K#!Tw;EKBYW|RWw;GN5kE)*U6GB~$&ZKL<`tYC{?o|=bQ=`590kttF zS<?N$-Yve)?OQr`?&#W<bnO|41tMX8Fj>$&G@vS*1HG|i?tw6#;j^4hl!w2i^mmiL z_xMpQG8k6mlSm{Q>rfPxp5)+DDypC(90>UdC=$6HgGwNRNPZ_(rk8-ZHb;5~LqMP6 zyCS_JZ^7RFNG!5HFicSL_s0Ug$5jo{+=FU(ke=lp3@9oAD`1hXNQ^&?P{Dc0@~shV zFw`9x2=sOaBT-dJR+ye>sy~KDrc7Iu06nQRGVN0%18Nx0YPaE!<_{XLwg*tnaB^ze ziv!_)_6lg_Z1aZ*BiFV-Uu;LXk5H}N5e^2z>P~g&NW`xxyZzen!2vw4+!Y8P->a!7 z0_sWL1W`PlsW)QBU@Wp34I5Lt10hud^}|OQkxTRpTf(tGYzSYJ?DYqf-KrAs>jl>G z2aFf?YM_kqaq(V%G&&H`Vw?RjKfcZ15kA3a=S-IEQ~S`cs<PKVq&H2){=wc}@KoPm z(0G`$Hxdlu)7rgS<WwL896Exk7VFjmM~|u+LlK|`f<t@#;7Q=GMH{n{g~UGl`~Ap} zEIJUyL!JPj-2JhLMinU)jJ$_&Iz0gwf`LuM%%N`^vy<hD>N^&Vgnbdgy!0d(h{lX3 zl>>e)s`{dOAMp9LqrhZ_dMc)Y4SliU02;{Gr$s_OMeXws24m4=DNDvc@@UK-8bJQy z&0Ds19N5+E>)O+`1u35Mpg#zP%u3eqGLW5mo)0V?hy~PWvfAc3)v>r6#cv7sMwCGK zXk&h|tTUo%=+>M8c5F@-Yz+j}9pQn&SkiUR{ykl+H<l68D3O!lgCHEb75ePvgFI6a zqcvx$WFhg&UR4W3Sa&?>*TU%UrL3<|18kx8P0o;MG!gn(V89PS0#4waLB8GJ+pm%o zLYFa~#qbGh<ih*ZBOL<+IwMuyr{U`k#x5PfVB{q7WG4%}TlVeoZSLsalAI#=ItCfg zPYg!FCRqR!qU!F5LcOMpizr`6uPq);+1tHoGYLB`Bkn_uh;UWO>`jqavSQ0A@E1fE zBLcC1vV?lz_Q28p{k;)QrH*()^`G<)B`ZX%6C)AzD<xSbAL*h&KDaLsM(>X%3mK7F z=Sr3taVFA|mBs@h&&-*aEHgh~L`;^luVkOqGf=1EJdiBj<v)UsuduG0EYRt;LrIFB zzXx3{5Kb2FQ^CgI22My~ta}F`5PM1bi=RF^Ic~P$$<q$i;dMg$%Q^rZ&zr60sJUuh zU)EH-Q}dOqwe;78ST@CmavF1!#Xd&bonWP-)Q|If!A8CSSVE&d?gN|aom^A#jn;>t ztFa*I^7+De;qxU6eLg;zAztkBJv`_S>Te2szGyHKi~4+;3!f#kqcJU+9SFygWj>!j z9FD};xIpil@&2OYCPK$g`dj-WA+;3)O!P#nAbhknrjLRxQ9f+6P=5(V{EDizo>0Rl zT7!Wjtph``{z!PKXYrEODEPHy00SEOt?_lMPw&c}fgw#naV!`{Bsv|z&pF1*TOZqT zy`=Ko((~EpR-N^Y=FAwYnSUi`z7`R=Ee%kFr}Vq|n+QH`Y65BiCCi(mWGgw(I+a{C zSIJZJlzcV+SULN`5-2XUKrN((>T{iO^f{G+$4k9MYOzwNmh@#QMUUsapy&6Ns$~U^ z0*6wr6pL?^616}nrLPS*__9E8m>`xtULs+XpK+XWdMoxj8Y_}@yZu8)Ad>v7a|ezD zRh=dMLpct|CVv!aN)W?}yDy@p=^}0}%cGvcLN|V$gOGONSa7JB>oI|FZ*WjiqwaPF zqP<77qDL>I2bzzP{?-PY9=!;?KzF1MML?6{xMARdG8H0rMFre}up5FS6s24k9{fQJ zV;*<+$%w9Hu@~0Q8UE16qR>Dvit*2y-2o~_4QTFme=Mf8_vq|{E~2B(A5*u%17N|5 z<J9nY+$Xp|$7>qi+uPks7JJ%QQJ_{&kI#1`5()ZzJw0wzB^+@FBgm(@Blu1OB4I`z zF?zXU5%*rk;ZZk+udo7j!yO=LNAi|+CY?w|$$rw^sN6QsDvnhLdV0G+!EMyX-Ovsd zw7mx%w5PG%&4*_3-c88F0(}8h^T=-%=v(+oZ(2&x!0HhZf`Z{gB?3w~C;h-3ps0yZ z#3?s@;s$56i6;^~F%$#nhGq$ZK%^4|#xIZ8k3OScT;SmgLIVv3h8cn45<E4TfxTqR zPHIVD&dZFlk1RES@J1s=fr?J-4lqXG$Y4zUfUF?<-5@J9AJmH+f|bmnc1#u;jM{b4 znJn}V1boNYsHH_A_q0I@VicT2&<n}MeollmM$*5VzlPwm&ZixejsMQ(#vPx8^(3D2 zqVomHi=WdGcg7vQES|!<ETqIZ>xgF~C7?Uvj$?TupYaz@We($MAHflp8v3%tcqd{) zKsy~nj>fDm?F3#xi_DD<4yYOpx`A*YhVjx`<zxZGk&gsXG?@>DS5+~=%1h=%)nH#r zRz@A<_pwfk0h-V!a=RbX1`yR~C>)+M-jLuC7<>uYqT3Ms_%X*@<&J{Vv-u;gy65gm zxazLBTF0i%I+OE6!Px9Z{3#ooyMR*Hr_K6e>octvmc6w4;_AfI<#<+l-BtW#@!8@} zma@?`nWw3-K`q>?w*<gDFd5fduK|&#iEi{X<rkB!b$q46fnm)#9AO<e9H8m3n`pzj zsK?EPT(>r;_6X_jCJy5QIA+KpE_)1_GLB4T#6!@S#o2EsP`l{VPU8>EA0RHHYqBH| z^%*1V@PctEY{^GTMYIaRV~!i;j`Hd!ht3W?yJMtme!|5S64pEX$?PMMn6?-BB;zCQ zAZBBX4_gUid=Sq}TFQf8T(bUYFup;`L5H>??o^yiugE$M`fIf@$=Jv8`Pb$U9VhF> z>=*RL*zbsu-p76!<t`Gr<5{9Jp3X_ZpfFY}a{)I}WW%##WyZ5(6(Vl@Rb&m((Q^cT z1ev~%5rNq+?zH_nS6~yXmN~P8u?J9c8I&6FjtP~;L|2H8>=*MyPOxSEPn!3us=FQY z=6;hhWStm$^to@3hjSE>6WsMt{Lvmq0P&Z{C%3F~U(7aMvF_bik}M*{9dlzawqMim zO|r^HrAp@OB_;E9bxd19g%AsC=tof5kE$_kDJ2Ui7@}t`%%<7g93m#WHyBMRJz0q1 zR-b%pkKlte5%VM-P9$P<@L!{EzmDL?ocXJseDv(2=VPN~^=ERf7nNSAY#J$Q8Y`<h zxAkoN{KIdQxv$kWU9DX*QoH1G&a3khwM#~8w<gNBUaOk+^oFN4T*$dJ@7#vbsuhXi z6>sG^YL;A@H#%j-nZg@+j^grjd1u$2U;IYVjBC^D&ul(d^NC&Go8EY#{-uVC4VPAo zHnqRner0+Wy*Rt;d$kKM<h<m%=(<!h+OX<t^{-}+)^0wNbLQaL;%jBqXHSll&3>-? zLiF-*qHOkP8RX$TOtf9h>gsB&)Q+M$T0aE=1Q6Cf1;p}cB-1#FgY-OGiG`9bp}%M( zqqPkbkaSME1~eG4wAfHGhqOoSBlNI{33TGCh@ugNlO?*4?^T1)Fd>pyV^II!$VENz z1!Im6Bf=^DxZ};N>A9{O?T!jegCKI6JU=KY%dNd$T6rTEe?hG&bvN=U=5mx(J{de4 zyiq`@V#k!3=kFh>UhqT8eq*j9uk=P%e(r+vu^%|_=VrEeaHG<ZSAmb+^<#}KZx+<$ z?sQ%+tvPpUq||*Qmr^JKY4xn{Mm|fr1mqhm^Nm7BVP&GSd8DA_ts=@mpex?Wq9~uD zQMG#UPyU1uy15aLGMl2QE;ez>V^c8~reXzb!c>SZT%i3t!1#ZHUdb%E(3#0>i|Mko z*oL9X8nRxfzPh&9-4DYqn<?lT4Kzv8MA_WIbJXKjm{m}DKTmhw&Pm5)`X$lQJmGkU z)%9M?ATc$IMLp6sMze{IAZ%2a2FH%JupB1gZ}){U$0GFtEaS$^E2y}8u}*MAbq~Vy zO;aHy(AS5_Dkf&6z-a2x!JuDbQ${-m#3WrPD|bRff}w@c2e^7_QZSk3Ei`2kG$go~ z0@960isqf8Yu*?n4W$CZrSk<{#eg2}uu~ge04(~EjtsHdm}9~~P5|(f1}i2o`FIvb zvN4zGWu^}ZWiA*=S)!_$_23ycgQir0{|g^P=Oe)Q^j4`*fzK-!hQC>mIM~B9VgHy# z!EG!`83DA<Q2AErpCazHXDG|(sW6l5CK<#8(HOm;vEj!gyDK5P8ypo?klm#uyNg`9 z?8aYRc2lfS$kZQEhBqAuxa=gb7TNg<9?<XR^+oowlT1<Xm;cT=mDN^r+_6$#J#z>X zoy%lKD-dQhGN`F}c3;p~p%me55sQ&ou2?CdI7^qNq|1<IZ<TVyxY@1(u`-ssl5(r% z^6M(3E7+TA#41^A3Sw0(R)bhIi`61l%uR?aU57NsXDVV-*t2Pf)v(xf#A;b=24c+c zsLVu+e=!R&GY+$nu4B2~GB!uX=E~SS#By1_dKsIK*i`mx0b<iwY$0OPS*!suUS^|= zHObf_#AdL3&4|rpu@=N;v6u(3*(}zIn487g5aYF3jMyCZYzbm)JXe+?HkUnHhS)q7 zTaH*gi>*LxK8vkHYypd{LX6jZwT!hRwvfGDBcH8BjMsb}Vh!x=dc+!8Yy)CVEVdD` zMJ(2VSTl=lLac?wIuY}**k;6dxmyrxWzV)E*2ZGnz?0iqYzJcZu-Hz-cCpxQ#JX5) z558E;VtWx=!eaO0?LHRUk61U09YE|Li`^&7xF4~l?AZf|@w#~t<E`}|Vw}#05aXC0 zMr;}T;vt#OC*SrUww%57BesIYjv%&@#d;B2#bOF#t65A%jF;PoSUWxI`wG*@jy_)I zU8Am5`qf+*#{(wg_&WLYnCa<y_Eg6mUmQ2R+n{cQTxeH<YP%8w9m1^ae#OzpwZDkT zY~I1(Y*J^aCF&HIdSQxJr>QmSOwn7^<?1Z8LTyv0tF>ySTCG+o*?p{kqSOIXsh#R( z82KMYy*TYOb&DSB$Fr@hu6auI@m%k=0tdryzgnckBt`nw?O59>K)6F0<SRVv8@ATd zm#3V-m-j%{;XidV%F0#H+Irialu%9~wh3^G3<!#W$y(sV>EEyJ>?>A=0CShbdy`s+ zr>s0iv0(}IL!e@uJu_etzMIq{YA<@DZsmXb3YF7<x|>0L#GFGhm#*^x>h&mccTtT* z&3Ft{E~J_oPg(r2XA2;gi<A$eCY*0SBI!)hV-LeJRbGEo<}q;Ct8P&qXSt2q{Tv{0 zs2@X&x1&J?qwXJ<Z>hag>2?OC?PZY9%Gf7l?B``n_5p=>vq^d4@qF*S<{I<X?kkvp z4nHlmZ%{so+VA_Bt^KD^`~5$&wSN+|?<N_*DS*D8$9bMV6Ldj;IQMLk@)TtACgs!A z!&omf`hZ<OzxCdIclxxUtr@Z^Rd0k0RX#&?=v$!t0%&kR)SCVZT96cgtWKAOpM@-} zg!DP6e2&Xr#VFIDi6Iro$HR_pPfHm$F$E2Mz)n)02NW(*?+#T-QhJnUK&$(>bhM{f zU+FmXDr5BeyiTt#0K5Ac4?QdK{6!hNo7DUtfXel;iK+Qc(Qt|KMbPj8gL)J*IBr~i zD`)h3?iTs&OQ<~`O;dY-9p}B*Xys9U3AFMW{Kn~IrWfm@<>T<&B1W@cPUE@fK^3lz z{fdkkJZJP)yS|(W9gQBGDMjD;zPv*DRnYc9qNtgkeJ;V7^pw&2%g?%$Dn`i*IwkGs zV#iMxL0v9`ZoTi_J*ic%{2FR{h&YASNB%X}Tku#PW*IyeuRn{Eysu^ycp;6K48F0W ziXEpJ{Pp53_0Buts$WM*Tnhe%<oI_=;;mI)0{ssQ`kSe4JJTR)*Dz{dN~8A65_>yp z+wowgJ@B2PMw9ZJpvFT6HO&35uV@_Zo5JYvTWR!|nEMP)%S3A3dLKQH*0|d`Mziu2 z(8nj}Bl@MmHGL&EH2Q7u%<ljjKKpw`#_YJ{GTw6C<Et{??;^%Wgx`}fJ8rsl8chSd z8m8&oJ&EQ~z6Kig2-*mGaGD7j*H<Q<n<Uxqk3%Oz_xhi}m$&KHWz3F>ugbUIkg-3I zvAaXN>43*At9OrfOO!tZ?fjf}hNS0d+y3`W(Cm+7&Hh-%z9nOJ^m$Fby*sopEYEk3 z7EQ{xL5m})d?YxC_c@UgBcq9%NHh2o*o6L+=7sqCI+st3+y4yp=bGoAOG<o4K1(3h z%kquLXLeM4Lw-97>ka42D|p8H?_VHBHaFXq1QRZQiG1c&go#_^sw`<N<-1I+RClk1 z)+*mc3n^)QYOkf)QP9xACa(26U$?nR5_MC_UTNZ~zj`)TxdvV`?1i^s)l=*G%9Xzc z^gf~-=VRjXKJ3>QPxPn6!+(SFEVNVpmht9$k7CzRr=v!HHODxQh$p5x*V@+k7g6WG z!@s}Bzkk5L@1ckMBdhg4f$Mos`)3*Z7a99LVtl0hR~h>^8T)s{c(4Bt8T(He`!5;0 zA!BxQe-m%X!rgD`!#|K;+?27m5aYP~5V2w&e^0jDJ<9)wmJ5hh>C2&*o+6GXd%avc zF!7?914UhbBx`*eJp)#p8s*2p<(S|K{#Wn~9|29+{r9u^DcBi0=lJ@irB(H{0lT^w z`jjyPHdX+Pn%ZgSw^RF{^ff5|KWcy6TzjMEi1FW4f07UXi*cjA-olQb+zlFt6`?z! z!QC2Ze$v;h{BO`DD7ZoAO~_1RJt&1L{|Co#U=ddSFY9rcP{e3sgFg(eFzDa`hx7HM zzekMAB7-aJc;Rl*0joh+A#{KeA<h*TopOjK{68fdZ=KKPrL2SjUwy<#UH>xHx{Q^p z+u&PR-5nUy_=;p5aL59NVQL$WWnZp=p+fS+Xbl6m@q4S$E_aGs4RFf_ZV|rHnu66+ zc$=db7~N@U<$#xq(gtixyL;u7qMSUG^RRVy4xX+_;f;LohTS~Wz-8h&=VkCa*KLh? z<DF7z2JmzNdu)nDtUaYo49xDd9HLSI%83${5MOI82~P^uT!dJ;Mo2w{X$pv!h`4g6 zI8*~#DR79{m3>>#w*w;EP1HyAD}OxCJ7|S{TTtuziUF+x&`!J!tul+@S_wLww9&2& z*?T+Gu4AyP0Q=NkqeC_5Ff=aLOc7%MC{`olw@G!97`4EC_^#nz2i!k&*Pu-WwD?_v zHVx2D-!*8{0qv1-TZ#6*ZBmJ=+1@hx3yqwO-PjY8LplQe!}D2p)Y~z$1B}^d!$<F0 z&D^NjV}LpbJAnELTg2x+p5y&+%CmWR_7Oa5$G>{i;-kENO#kUuA6IvX-9HS%eC)6J zIo`W7%D({lKc;TfDZCEfER@_{Y=(|E4Jv5?jnKeoj}xPEUm>0}J)SG}^m;$ec35FQ z5}q$I?Uy=Zdfse$e%AE7#q|6Wrsp2h^PlIqvKp>O8Ixh#sy>m1Gx1BC3Fl9m%35qH z>r<xZOH9w7G(BHxdVbFIe3|L_Q>N$3P0v4VdcMN+{4=KKD^1UT!SsBU>G@~b*@n;U zcQnACkwg0=INtxiKR5pIhLi&h?~4Q3`e_PsC}W&`-VxT1Q@h)bt3xLvn$q4w{z2Gb zY(MtX!xza3?6jvh9ydIbxZ9aO1WoPZ8GYD@uOT<K{HuO(V#7Emh+XzJr@r^8Asp{k zaL$9fy+9Ps7nr*o@&kmFIII}O32`dH7iErBdT?N|rw6C-aqLxLeogR1Z0WbY@X-eU z^!&p4fe)wGEx@9IqhUXeUaGbbab6o|;+ew-98@P1jne3lQja*BZ(DUbcupJZ>DPp_ z4D!rAJMn(f?RQ59kML9cIIS;EcgyqG;~kVlnH(mEYH6DRa_^yt+V<dJ{Yi0jLJi<> z2u}0sht`c^xQCY>97UIK-RaqE4g^e6`8MMODb=2i{*2q$%vTR<J72U{ch15a%KV1A zXyGkk!nLQzl!;nQZ)4L_aIf?SgQLXEAq?Q0#2FHBJGt$kV<je-CVoEw4*-!=+*)<7 z2(~XJZ=#*X0i;*O4vhY4av;2_HX!&5;@3%QWJ?$ukhb~EC_-io;5ZnZ(vS}f_&C5h zFh~zS9YV%|9XPddckJEaUg2p=W#2w{h>4tp^BZ;&j5t=8NiC6ZaLB|p07_u^Q9qN* z0rDsDAvn5Gn%yVKSx+;07YhTKX7>P&37+<mFNMgUE*6aQ^PItumz;O;#KYug#v}^R zfavjXTtqCwv%vETb56rkaKM7|)ID5C`rVw91fw&@Avl*9Rn3$lF#;Dba9_pGzeVBn z1&G3J3tZm#gQg1WVpP6#!-WKs&hY3YTrk|BPYV*^;BR0;(h0KD<Hq1XO&RD5^fCcY zO&B#XlH1*&;<#S37!8FlH`an~)*-l~3pBgmeI#&{!EGeRC@NlHVA0$m_%XuCKez%T zcWQ7_5gf9VAcOz_=!XTxSVN9YNGwxn0XWkLq3hBiupr!=5axru{g8N3HA>~7PJQh7 z*vUXJi1TBXGJ1O2bfHd&X*hg%0>{^6dHN^r!SG;|xmFp(X|o_J6Rpr2gKrgZCwcTR z7@GOmqJhiCy#_{64MUG`>xH9n`>CJ8<q31NBFbIk4*7@ZsGAxZhz$`3S&)`TC#hiS zSi~b?H5m1{;n2-}1a5z5kmN35Vu2$8asVTb`wLo1UnG&R1^N-S-yiHFjQp(8c$;w& zvVOum_PP7~$EhV5_N=z(nc+ydMaPAGYC3brb215PLzhk(uqUUB`(!_y!mwIL=qMl| zYQbG1%_*Utf|s)(WC7zk@*+Y0{RYr}<Q#(aOe-yq4ADCX%}97C6dAN~yk7~y0R`MR z`Qg$HK6G%_&<)>r$1!Y(N|Tcy3DLsYR2Vf18)FC`3*P$o3!^yH80{U5k{dKP!}V=% zQes!pdr7j~V!JZu5qHB2j>qEX#zGyTu81SyhL0Ux018!T91U!#1sY|3C%oebq{yX( zka0ep3(y6aw;?*gZsmJB2OXlvLXxpANqyZ?B@7(8>rCp@vNR@~Qu$7di(tewUNe+6 zLf)XJIMKX#sb{q;n7c@eMTDYh)2(;wYNe%TZ$%%WZ{bLgcgzU$_=Z7GucskO2@9IE zpugznnstc6T_|Kus({C+D%jcGH>jbfS%qg$Pb%UV0GM=(x>bzi<nxNg6fPnd$=L@6 zRv2qy<Xd7w?@yL0Z>G#7gG5VGGr_A^%uTS+5~v5cgOaqRir<p+r?;yk^!uYeI9!0= zJ)r3$@lQj}ZE-J7Z!e6cj=z#S$E|=Z@1akzVK&m&N8U$o4<RuCTBwc@0H@5!tr%QK zLOWq<UNaji<Y+>D47x4OwDUpWD0~jZNEbOW7zH+P7N@tfS>toFywrn*UZaR?lhz$> z(-uoCnXcnwg9B!=qUsoytb(K)>^8_8jGDZc@ll;Y5QXz$hIJ!Z1hJoBRkH^HdQQI> zyfKbjF!gViL5HCCa;`184|H#BS;gO5bsj6N+FB-d7O<O3mR;nc)w8?feqZ;N`@4O+ zwsdXl-rhsQF*!kn_c>Fq)t#5R8-&~72gSIOIt|`JS%-QKTl%m~wU~zNw~AtP59T8k zngR49QjBOi02&<Fw+kUW6_HvNg8q+`8te6N+2$V@P~p6Q$uo!w(ANXi(5fWpvrWvx z;M<0kGi33?XL<qI+JhD(cPQL*VLxV6P!xfWoBL0Js%&X)W|<%lv*ZbitDO*pW|^f# z;K|S|T}4&LWna>2biaRXhTlKVLI~r+cP+C<V7?TM8v_t2R**c*f3WWKHVT$YHC&{7 z8MgKU?sYWEeMUgoSn5n=fE=t0_fh5%nWkT?vzuzpG-nzTsPmdRn<m#x0~A0k(7BQy z<@N=g6yuUgNIAn%A(2UigA4fbouHTNehLl$gefx#9fX^~Ck{ZpELiHDbaKQNdzKol z17F)jDd`dTPCAtk6Yi5RPPzRS>^gZl=nFI%g^D0}?oPUwr3AeuthWg-m%4EA@D63E zt6h(?WT2jBDPXc*$ZdkR)blLx_0lC}#%;+v>5Wmy51*)~{|GF&(E2dt7K1>#9vc^* z_+)ld?<VF>S1&Ql8LGOU9IM;(c;=nh+R63yVjUFYGW(G1HDrQ9pXbinEkpxOgWORL z<ufE9{82Gev`x9f7w`B*>mnowZSr=?_6xW2Hib)<^W&FJ&Qf*1^qJIKW}bM0$tK(; z6&o@zs=}s5;!zOGLRpik#UG4D$cTXt3<@8`XlPSG@@qYQ-Q4t*rB-gE1?imupE#?X zEm7=-hip9?Wr@1iuXnFyv6dJVw)G|x`T#lRpGbyD&;2P%ftmB%3`(=xf5IOKlCj7_ zmnhu+>wb4J1XFqN$V;}VTk823fcUqDD7JQ`JL=@zwX{v^=yw%N&_KFdYD*hg>Tk4{ zp4DiwD0#@YEfvovC=*><x2P}(;|f00*t%Te#7&gx3dKP(^iNPI`_58LgB2xkY7>^x zs3cp5u&Lxhx}ad9^60%##%;>Alu5nPD$p1fK4@)rosQL&=GWtwZvo%Kppg!!y4Uu{ zVgu3k)>f%JN3^4@M}m=~tt?jydK_IE5N&~y)Iyn}z3|(&zQ<>&gay9ABfKCTgh9lx zictur01Q5%Bhc<A>axt#YE|L8)RUkj|B_i0*wPPU4+|b#P0}Yun9VT%v)pn>8lP!U zG1@-lZXoKDey^JjbQ5j_)6<C6N{Nin!*xs=Z%Yn<63oIXpp47>cOnpkYN1c})25i6 zTsxEcvK&(&1Zfa%mO}&<VQ`HHkcG}*o#^R8lQp=d5kPm=XPVu&G#Bjb*xS8hPuGM~ zL4CEyrZ;x#>p+&7pGC;?#b|C}qQxZ>Gg#0!cv&ya;9_#f&E^^D(ns7DGk%A3>j(%S znP4FD8Yr+8E1UWsWGh+Y*PeZ6DbnZxmg=*Nx35|Vj7=*y7Vx&JMNsXFnZ<)m{g_a& zRIfwtL2j}JY5L{_W)r9G%sRc5VNDHg)SdNy4CcH~i`5&eKxj0`FXb3)1@PBDUjORg zU7Tkk{PfPu=W!_R1l`kO1D18FiG<@`aT8IBKBJe&zc-a=AwCn2vh>^2Vx;_HMZGQ3 zi+d8~451TbJfr)5EJ&J$*><*5fd(3`Z86@Ej!9{7rysY#vEitf->@PYGJQ5=TL2$X zU}1%l47;-q#Ar@q*x{A9y;2M)Zc&t_HAS(!9ra~C-BgPX(W_!LpBbo)Rah9X$l4j} z$70&ie)r%28N<oAg?nts!h}K4T7&>cAZYmIW=IoeY?{GMEE1m`u#~~f%GUoei|C_^ zxgc&Wkad$-nnj<C__U->gRj2UK%K@<H&S3dHK4)HrE3=eiRVgy?kP%HfEENd5H%Wy zx+0cg?xbaO5bw2S5oo>ZZK5M$&|GgZwwwkx+;q(m+t#5`E0CqpM&j#(cZcnTV;E-5 zKg+UwibSAAwH96`TbY4YsK&_XZ%Ad`cne&_#tZ>G-PD1Vv}KZ$u@M4m%BYLJ!^p7r z(QPD_;i_8<N|I}68wGvMT;kGhGO@}n!4nqDwnpQTzN>?}w9TC+0u#2lLKQLD9&K?k zinBq84WoW8C~pTF>qa)a#vSMG9xKh5?GS=ZuD4imf&AqKdG7jJ<GA9<X1y^g<_)yD z2bWJ}HYOUI3k9z+qk`N-iOJeYX3@W;jei_gnz7w}`=2NnJL=e6HC?OKui>+{idm~B zm*M<l%<0L-!7u5{K=BeE8bX55NizWH0J#lFB+|@4*f*qK2#5;=*foJRJePKB;P};o zh+tC0!f#^O;S&Vvu%b{|ZB$B{Ee#!0yuK?{#iWEb$6-zPq<Vxd3lq9a+9Z!8j)EOp zkZ!b+CDs?jXIL&d*&o1uD-tdk{H-f2q;bF`K%zMiwj$nRvd?uxma{uPcSUgb8#B}i z^8(#-=dsurP6ia*%Mfh^+&~!i1OqH&bbkc<g~fK>aqF~S=Frz5*#-*!Ih)Pujf6fK zwltnTBth4qMNZThdv&mV4I={S@wEGh%&_|AA>Dvr**0V#OA}%roTX#%f@UL^Q*EVe zcu;6fl2ZHerS3bQSuxoB8jIIJ%7U@JL(96>O1coefXErokSL92OH5181N!}%>}Cy{ zzG1$9)7mX0-XaU#I^#D{1N%Si0OGL~kXdYiA!)BEwnhennaB#tXB4TB#-A>%=$6+B ziez80(Nu#i2u+_d2Rjk)<5n}ftF_YSo|}+QDABwV3E?2NCK%Xa)t28!>hsfuq(0o} z!*3+Dslr~7*LruUwO0C+#KJ6k@g8>v>&oDM&g3)`G71EPgUd9Q1v}OxW^RTVi39Wn zGE+c1vVh-3jU`MRM%9?@hbz*?)`;|mIY^e-PN1@1ZVtDoMyYcwOVQk*NE(f?{bJk^ zR`R}i)!K|D-<@qkc>_nWf!n&*GexOnFfDj;4Ee{mjUR2ww9|zpc3ar~_z9_}@8KnU zEC@2#w~d+I4)Te}xYx90A6f+MmBJYX{ZiaU<17me`l;>jCL4pfK(I4|pw9$}otS~; z)@p-+&xhR_<B34y-dNl2CT5-OO#YD&#+E2-IdbDW3!QQK?5*L&=fHHiEH=2N_a3`z znynb}9JKGA-Q-LMad4NdYCb-Ioj+^`fv5%U69a+$A-3N3h#aM@Wo;Ua#Uf!38?JqW zTCfM(r05BDQ)t$)3RU2@$bfsHIN;;}F7m*99UqBr45@)FU@^K1+qC`g_O?{AHekj9 zC|!dgODnJvZmk`38R~;z$7zI#=1;bJHw-Ha2S5~OV}lhhs2*ah&^KtUVTy|}9|Qex za^lu-X9Up6DvTfLthCj*hMe2ItbCN(4=sqZ5>O{JoMG^?<Vc?@V^55{G?Xei7!oM5 zThMKo-Gm{_a=Qq!k8huZntt8-gcyoD*>4j^QO50Ksc%7@sGYa4U8=W<A%}l!`0>qH zLE0`YTbo})Z$rzpE9?1P_7-$4ESAclZXE(=E}c7had(dPU^sKc59oRC5Oq=Hts&2j zP3gBZLdj&eoZC=4{VH?|wrRt#h4NyO2vw28rw61ila!-lTSBT~aOlJSP1?6cre>Ii z^^u2<N_68dO~L5clBEE=7;MJY>cMbtKYhpsRyPJyw{DE0J%4QWMpu+Uk)S+bw|Yw7 z@2lYgV-?0>JvT;W`q)y07_$j=zPZctx<?0LqLZ;$o<5sJ<)f|8DWFnB=h6M9*yR=& z23jq2*rbIXvpKG%j7el9ZQAC$grfryDC2Yz={CkjzQYR(J-u`xbBZFslokPAF8tma z$C0@psvqyQ;WU~sMfdZ=zZ2`K3=rRF$(Khh)RMMO(0bD8uKBz!DZk^R*GW^6bnMcE z3qM80){rJaE)(h*`@oL|`s}8e+wgb?>_-##N^}fyVH$%YCY%<+p@WG9pvh4)+X?u- zbKf`^a=j;GJUK8o0kdEyP$oGb(44e+%~&4Abd)yn`^Hyww&__qGf{L>_O2RpSy2$< z0llzEF*P%y1du*R3k<Ez-EGnj(Sglp4g@R<Ep=V;wvh7S*lw6@#z`|63*_$OIjlH# zph<ZH@YRWd!6P_xVL?kkW-HOS-=0={l-olRYnJ?T8$lz`>=b#dh^F^w3zC*v(6&-u z5mbtk<@S+hCPFcv7|>vtnqZ-8FYJlC`JSu2lojHMmc(qUV!>Z8pq-g|SSf5K!3>J} zyC_@SfjDG~Y$mJFq-|mDZ#dLIry+tqHdVE0hb?-BeYF0OF2m@FzM0psirZBMHG!Q6 ze1Alx@tumJ)t?wPB<W^0oZJCJU{RS4KMH#miF*<zOzGrW;N)V@+)dfRahrN|qvrRr zL*<rX46_s+H{FoSzbBK0u(FGzadx%jn{e4T3bS*FkMu^nHQZ5Y=2(N5Xj2KDxAw5Z zdRDHoZ5U8800Vu>@faO9#$kGqXc@s~ld_YU+Kh{6&GZ)bk6K7h`vKUu)?<hkT4%Vk zbg^lMirpX4n2*^IZOBMk!zRknp^%RX3qzy{8q#Z^9wT>(_C>lUvFqe*Y{raC{_teN z5uA9{VFy3^!@tlO%R(5@kUDnKPRwa(ELgDj7=fs^Wa%Qzsam&&xj0xyClG1fiq4)G ztK?~GR<@QEDp|mx{d+nbORbnZ;4*@;i%OCR7b*rk4D_*s?(C2hudc{voRtG>adE=v zXek480P>R&;qD70M&v4k)`5iV3ZSh9sKM||7gIx6>7etMbP$FnO{|1;;}G|&z;sPU z?kFwWnOFNQ=-A99=(M5CBbY`%+L-a;MmLe0EpR}pT3jU%QW88_ZUy<UmS{L1ur!xW z94t(T&Gmd=5JZR@L+;TC$$1?Nolpo{RmC*Ga{1HX2vLMlb3$!0>QEE-$l(HQ<_cp$ zPmRGfMw%kjNxfd?nxxkgObdMs_^4V&eSV4jUe_V`S)J6=b6jV@yY#_!H&-S2MpyFq zpz8z3yhZ{i3I*&&WmE1<I{GpR5td|-5zEr!FTn59v+U(d^j2aDw7Jro!ScH(5E!!+ z|8X|Air1OdhE=CSI<hj>DRdS!$u3&&g&PoEV(ITqy%qHRz&8uYf_KI@3z~u-8TAM0 zNFa@uDQeZvrf-(X=>paI1K%tI*pP4+-R-b(A7fPvyKiU~|AB873^+{du^(bdl6FSI zuvSL-2@4V&LZ%wZnPm}?Hg+=qQ?|ZYEPVe{>6^t;L(}}oIw=xVG)PBdKb;-p3M&y> zjJ+^5Lq*5Hg;yAdO(#OJaYQH-@1}1SOO=0`eY039IuZB2Q@&X;Mo1WUrD90zMr#i5 zSKlm_ns=kO=w@wWUPgKbt^Sj$E@T!zB0}BBLJ0BNPNXph6{ZtKmV&8&n>|=yBO~?P z_l|Ft*dVO5lR9RZtWF;|W??>P#+|HS2%XR|3u^`Ll?9WSyW^I{(q>%8{;6`yVyWM_ z1}M>Uxo4MKcgsSm4UAvRoYvm%W*#%7Xb=uM$V3!_BN7}*zP;|GV+r3iAGl=6%o&nw z0~)8qxoOc3Z$m#6-c^_-6h{ec9kN(h@@;m=Vkv94Zag9@%<Va3vCtDnxTvbqnP0Gc z`^muZKzq-95$!k`{TPRC#U=+TN`Vea!{=K4Z413^VQ-lm0`_*j;h#r%FtM@NNp~;f zR_r$2y}UCulRGkOs@5U=#L#rfuy&+0n#g1^h*^*~j=0OxZvVu$XbMXSrm2JF#J45W z+r}N_E5?R=+wgdN%DqFbYQ_=lrgPonw(Yy?r{?Z<<Wxq`hsWF3Z*=E0Hq9=4;EYe# z+wp;uT7kPu9vY13H}MMT_%*`v%G>2(XZ%9hp$LoA8E3VhWlSGi-yRZ<cee2$^WQT; zZEnwh&pX2xjDnMU2O76_7A)U2??4tT-nP*|`s@%MgvL{@Y1?AYVGGT=K5#t51(6ZP z)8?4sozR}gvtj)7dL6Rxj9DEMPJh@^z}x6`Xi@}(UmlBiw)8(kDHM4Plkvn}hsH1b zr^4%yrFtE(@UbJkd}j&25{a$$kU5T7{W3Vvde^)TrQpU^SZ>?vP)4fhc#ej!?asnZ zYz2WIv3*w^4W&sdiRHv@hAfm#+uucYU`A}i;nJ<T8JfI+yWwVN@=}b0XVMXfBoRq= zecQ9{?2b?D#HxebTSaR|hVlCYH$!Z(6C2ega5FS{%g|&9Al_@uBGCF-a5I#0QrWP% zq)CK#&&`m9kw`G5$c=Z>%}^RHHqyoLd&GA~z8h|aEO>t4W(XGtycgUISz5)cM!&z^ z42@eY7{}k2ZiXxsB8l@;;AY5Dr}wy<Aq%cVe`D9abl3CVcQa(Ig>WR5;%3OAif-Yz z!dWhl<i>|~e|V_9M}E5r+m+VpxBf(N8$=Yl_O%!`wVRfZ$fuBvwRkT%F0!Cz7DR8K z<D&74yhF!D7QjT9chYf@rEpzmvNUOkFF3w$92ePDNNoBsc8e2JG7~MIB+3J&={E1w zZ2@MF8QjQA(@f@W3`dD<`1K%p!|6mG>hR=cXF?1)R+bhZ_*iFPAKx~9%(>7+*lnS+ z0h!>&C}u&B!M<(G%zlK#-N6$fy4S{Wk(s0x)Y4`F@3!Y6Gp1<{9o`e3i!2!aG<hzv zRBWOxo7h`H=bXqd1~!Jj?VgJ)c-d}mG7LBGBhN*aYNhr=ODAO{=BI+CF>BJZVrDta z0Nk?YqT5999ravvdpN$6o{Me|!*|Vdkr`bJ6Q*+Ld(U&xouU3tdoD6#n>Nr{C?CW8 zh#kjH^<2bHHm7?hB2PploULw+ZcPE1*pZI~`H6;#_mU$Y3({%qOcd5{Oq|45P6nda z@QuxtU*@aFMrmVeFL&fKF?R2kC!fi%daro$nG8?;$isWWlg}i$TKc}6c$qxbz$3uh z<;ll_8rfy^*)6|-G#wcWu6o{E>K?*_%`JHHvEcY#_T*zhG)>-EZyObKV4I5Hd!Bsk zs$$pn?@3QS7UXRm#@JPbA1=gH=RN1i$5NlI?_*CsmWtRm%zMR?j|Ec;$=?f}d@R_d z2^yw4zEhrjEU3IkJo(7pEgasA@5;x5zOAW&lyL#)16MwL?E)e8zNQ+2Z`YNNr42|2 z`Pp>kWAA3b<jKcEr?g&A^A5@Q)J#@SK9eeGi#@mH$j5?|Sa*_cB;K=*d~DICBV-vZ zaKC+ye9*1p{GJyd?uR@Uz=nBWNLlQ|rW9Haj58;G{$3S_)Ak3#xKu>H6ozG%_p+0> zd%8N8Zs?-Vm^(DV9Qs93h6{bP78X;&v8V?t2~l--L{UAvJNE6|yyw0ycsyd;BDwQn zcEgkA4@Bt%oP?*I>TT~iNY_Jd(X@!x!@aYpVdi5@rJFfGRx_TuVS?(4OMH8eGrxk9 z)|6#+Q(o?GL!5X_udKifXZYWp%BG-dsxNmWNM6!(r~T#@#qepm<3OKX8P5HCXi`S4 zid#@<p-qw7c3Bgh3}AJb!6#D?4O`3^n{FU)V1Do$g@YmCFj36+Oepf!(61*oqqk4L zu@t`I;Gm9O1Baz5RE3;p_w=yudU`x=97-_PLy7qKE72_E#|vHt{R-c$-FRPeijSXB zhL2XC;dDD$AkX?GbJ-=o$@0`|my$)?!yvPaC2Pb$Z5{BF`T9QpWVs&k3Fb*wLvE(+ zdQ4U^D~=&S$=6!4h&|-CqGSbnjrCS5l)`WHO;)7s(@o~kl6cZ3P97!;$lgo$dZ>u@ z^}&Y;{B$K<60K6J1Jh(>x<x-(WqHQE23s?7qjIv^oKcv<lcjiSa>JP{puKHAQXZ2z zbR01`ZG6x8$r*O<ghdtK!+~<rCFZ!vN)bc5=&o^-<;F7|b>oTd&KBRn)7^mO-pgb~ znxQf|g&v_(#P}^^)C?eGGGD*wEm@8GJJMY5B+KxWRXNhv2T$#4vOM*gk7Rl3HNVMf z^68GU)Dr>R4<2E+!$gxVasD7#%Iu#$jyGC#j_AcyzU@7d$qJE$_f+D8YP-7;la=DB zad%^~JoTthvQ$1{8@)|ww#z<QXn5&MPSfM;_H@+B<n=dM#@^8?I~onnB9kRzQwqC| zCYh^)w_co>%%M#x$*J<9rqnB>lDSM6B+JDZD!lI{i@9v%x606aIOZjnt2%j-rSb_o zVwkKH-XfU~RE}encxLh-nJm&DQuj^Pjdz+onXjLzOy&ys^0qvQW390{)XJ4P<mn_? z#I26Z8F{jp8JKmS?#Wzsuq2tU-`RyU?Se>_n|4gFT?5J4rYCkg0g~0G4AMZCtTaF6 zTO*Q%{27J}73I<4z+^Gp|H~_dlGSX%Amtv0F71TF;m`&th*1!w;4%e&L%~ZF{0jvy zQ!tN$U!~wn6#NDSU!~wG1>d9KKPb3K!4D`%Q1B}hyg<R9Q1EXQyhgzr6pT>tA_d=| z;GZe@G6mnE;Lj--qu`qq{1XMgM8Tg@@M{!2N5NlG@LdZ2nu1@a;NK}oQt<Z_yh*`- zQt)3CyiUOl3jT<KKcwI-3cf|bpHc7?3Vw@%-=W~QDfnFqevg75Qt$^9T%_P1DfoQ~ z_EYdbDd?u)>l7TI;8h9^Qt+=7e4B#bq~Kl({)&Pl6ud$~4+Vcq!7o#Aor32n_&W;z zn1TxwT%zC~C>W*S8U<gY;QJI@q2MnlIEkRwi-3Mk{L90?Z2Y^q6|v7cpLWEM;J>pE z#vPx`bvWYLac4a1QSXb+7jpO;rz7q-hBv7{YF_#+2WWib@DXJ8i{~Jve+`H&NXhTx zSx6BcJZCmi`7*T>DVI#;B2^$$c}Nw?)H0-sWGWx2Vv&kX7qPhO1*$cEcwfq64u|P| zf$4pjcpooB?sAzbMyf)lijb-lDHEg;6QnBfK3<C4)iPCv)D)R2N2*4qDv+v`sVb!E zWU3mesWLSMscAA*gOseV37<+6J~L$QTI8N7Q*}tq5-HQSQ%&E_mhU@6EI!TjevWt= zGu}@(y`O9IeunA&Jn=q03)s}l)NG{Yi<AlWOw+du#QXSS<X$LKZloGyY7SD3GBp>e zCYhR#)FPRhhg7pn)g#p+Qwxyt$kallT4kyMsWzEvLTa&0EkbIEOf@65RHl|7wM?cw zNG+GCR-{(QR2xz&WvUUWRWh|4sns&I0;zVHT8Y#enOcR^TA5mn)H<1JM{2!HtwCyo zOsz#~qfD(s%4qBLNNtkuHXzk0Qjcy$YO_pjL~4snbs)7>rZyq9O{O}L+AdR@k=h|s zTada(rnVuqQ>L~fwM(XUAhlbj?m?<crgkE=N2YcmwO6KgBSpfQ{T}T?YM)H)L5f5@ z`#riBscxCN7pVg>wGSy0`|S7Vex&Y`scxk1m#G6tJs?vDkrEQy@#uX>Jt*JZkJKTV zdH|`zA{8U?&whC7Gvddjq!rId79Nwb(0JNMa=AyO6$kzILKaUu9Yc<Jj>V3s^JJFO z@c`sKJvo*Afa9c7`$gnw#NB%MqYWcS7Wf9k(7cD$FxN6J)0@AifJPgxZ~PI(41MDd zDfurHP!Hgm$FEZCOB8&Sg5RLvDh1!8;6Et1Nx=^&_!SChKr-nY2}-_3!5b8eQ1CPb zFH-Og3jUdb?@;jP6nvS2*C`mI;F}cu69vCU!7owprxZL#!CzAFT?&4kf`6wVNx=;Y z-lX6^Dfll6{+fcfDEJlye@4MqDEKW3euskJrr>ue_&o}KNWmXa@UIkHq~ISZ_<ahP zs_}J-y-LBiDfmqa{)&QEDEM0newl*n6g*GC-%;?#6kMR-5(WQ2!6*gSC?G~k)gwsQ zXkVn@LkJoVX{RYZNP*F$teK4_Wv%%#Wic9(wIOTGaT}5~nq6zAG-OH}vX(O%GNt*9 zmSYY19ARZNA8VVGHe~FY(uRyNSmQG8WjuSEO*(OFvIc*foAe~n;1LATLkP&A{5Jg_ z(*~$0k_^M;yY<cWK5Tr3fyCF40|flp4#$rlbG#MLauk%F%^z{qomValznYV{_rZj# z?uzTs^^%GwA3FQcXvxes9mkyo?bqkEoZ0-up6e|u@TY66wf)TIE5$R$7BnHbV{F!3 z_Gi^DdOCk><u>{|XKeX;mU(p-B^Qh>TtvC9t=#ci!|2NWi0{6(;oii)BcmI7dH$wW zJiKSDp_%fHwXI@V+BUtqe6(!`d*fM-KfA{CeEOfI>+o>TSkq$mPS3(W)^lE4u|2Wl zfzcISUd*!1{O{ro^mq2P)jMD78eRP$Pb^=ZXx}-yoYiFRwH57&HM>VwunNq(wq`?O z<9(xR?x&m$W6N1B=Z&r0N$L65R;^8}yLWWeK9;&(zW7GAqom?W@sb;Pj&05ZP6mEV zN3Zh$CFhMT+d_ZmjxFt^zjMZPl*X2<L1nteR&S-pvjjzS!Yo=sHN9TmsF%>hN_dc! zFn?@QHwV3*AwB1Md8?kS4cR)JyIHoGV=FdMwwYss7y^^c_tEou31%xJngn~jyh#VQ z=!VNt(V{0>EGR5zXwMy6$!axoZ23llIYYFY-Zp{;8}`uKIb-6lC~?DXdOmy1vlP|6 zXKW2vfRal)_}|s66=%q1Sk1sJ99wx0y{{iz$|~p{>tOV#A8RJw=^9(hl8s|40R~(n z3T<vfa>tks)LhFv$I?xVX72Ab0t6WO`mDKMj64&$5PNCp;!tAdYJ&Tt`?9H<{D^fH z-erCgEk+0Ym7R^dYO`Oj&E4hB*B-@#UMB+aqd2;v<E96})1)SdH>SVGvP=m*y5G_0 z9PZ@X2I&$4EMD|uS)vygSiuM>jP&wO-%c26JOSLkY<fw?n;uVN7Sj%rSph}+Fn~u1 zB{vr!Dx$+>LV!?yn9_bo@}m-O9&@14%d4LpIy>}a{A@honyy9g*uH+#@MgUFvAP)d zCr?%>VcbJ?Zf!qiqmz%Hsnz^%s%D|6W<dD~)v%P;u#{@}=-EdTu371|Lq6Vm&x2^= z)y}T<V)P~Z*(r;rw=R*-_}iCt!l`|J98M`T@`;#+>8dSP+2jq^E6!Mn_;Q@@h%zZZ zF+o(al<aAaFF1ZN>$FqJi95gGP+(9vR-Td_N#w~n4fXdJaZ<`p!}R}Hb;?5|qx8Hc z{kc{V&q7HsR@i-olCn`!)_%uOc4NMO7n+K57~MOhJDd*(u(qbsD$szc#fI1=LA2aM zEHBn~bhgu1j0(lj?Z;Pv6IgZ7Giz8+!Zl|>-3<(uk79!wbN?Unz#$<SyHg;J%fu+% z@bkM=mMBWzihiymrQbkCYm{WtCFiktNw!YzmKwc&FvL$kaF@{xjc^1vtmE#TnAJTs z!Pl3&td||>>t1B1H@pH3XZ5yzpV+x;xTHT88;G{Iwo*-7f8uN%c5UF_tZOXhQYI%h z1PT`*doq9Tz8wcUy0;{Ax9!_=U~kez#@#ShNwnj5tx>1s-PO?ENz-l2W}0v^A9if2 zMbdS|A5|$9B|!?@ne0mD(4*mE(W@zyoeLf!r4y2?(otOg<m$7lpIm=-{qyx-ZvIm9 zS8`q{e7P_&XU#~_n(NJNFYUOv<7)HzH=5U<Q=Sey6}Vc{@J3C;t4Ch1dae6A4}AN9 z?;QH}q0t@Q#Dj+t4<1hJcqp;mm)P8MX4}}*1<##)E^y)DOVzK;etCAHts_yp>CASB z%8Dsh%jdsQKL0}f)uxSaG;Msf`|1|&8(X|%vlg89K6mO;&egW9BW+s~t=kgQx1V#3 zRZTy$XRNG>i5=~uM2^QP*o&Z-sw#eYh_Er_N(DDCq92eDPx-~2qL-d_#^m?$EcrA$ z2Kw+{+<7ct#Erj-Q^^w3)0mV@fS^N*JC*FU$ZmmCWPC4TN{%QqMk6HqS)k-FC}r}U z^Ozl!TnR<W7Ymf!jG*LA0wph_8s$qUQl43G$!AceOj0AmbejEQfuJ;~>dFX*LWzTv zkro^ZGlEhiq0~ui%`IG%5tL#Hg$921v*1#k5fo|Qjm@xyQo^82#wVo`msz$@N;ATx zOhR$nLMh7#O1XqG*A_~7Mo=mwlzLkz6&XR1=IYo2TPT$oL8+3sG}uC^$_PregwkXS zr8*-hQzVpTTPRa9f>I-)kW$Wm7T&F4P$uKLS_#EoQr2dKOWh<;>N3JbE-u9Ed%)C; zaFI(8u{K+}Ov?z0T&RdGv4t`{BPen?Beu*I%8ZPl$c2sA3R@^MGlDWpwh`Iv*w4Z* zvoeA*TS95Kg)%!MC~gUbva_EB7k5Tb=13^^ygMf&D03y0^|rXo%?Qdo31y=#lzACJ zsh3bT*+Qw$2+Dj3WwR}m`58f3Afarvg|Z+cC<`T&?Y2-BW(1`{Lb=BlN<&6a8YPrn zwon=~g3=_RblE~_$_UCL35678_OtYWMHxY9mQeQDLTSzjN{fWjZ40F(BPbpT<)AGT zPexE$C6xPZp|oZMrA<Qd+Cpi|2+Cp!<&Z6u#Th|aBB4BF3uQ@0P?kz4J+@GmW&~xK zgmT0d%Cd~0ESFFeTPVvjg0ezF>9d8hA|og(C6s<!C@TqyvPxMUTpn6+Iw!R9bZ%(X z>AcYD)A>$%-X3fZtvT&t@ioD<p>?MVLhDZ#IwzkUt`#L?ON)8tu{I;T*U7JQEnlz8 z=<D_J>paWX>ofX#gZw(*^7V#{zTPOljy+;a@r@Zl=@3xj1r{7SGWvRx{JPNc^`?xz z?v!7<EMIqK^z~-(b<BQlv^gUvTO^dnY^k^<BPd%X6nhP5D?tf3P8TWLHaiYuj(fTo zHWM2wMO@B=PdQJQM4eC6#*5=60q5zWCuZb0VjmGWo-K_#&N)8`%NT71ix<7PU079M z9p9mS4Ed5dw70g4?;HGkJTR@<{|zNyqTu5ce2IeJpx`+QQkH-Jk)Hhr1;%3j3zYm5 z3jU3P1O=~AFharW6r?Qh{v|#8E(Iy;xNL3r2E9mG%w-F=Z1Mdo^!9fs_-zV)mjYu2 z{$DA{mTNCiY}|G7EWB;Z;rjq-faSaYXpn@ZzlZ*0@hyKx=;f`i;r|_h$j25`7$(K0 z(_)xX*%ohVi)4j4#kQ{|Yb}p-`z-B1mU*LrqhUXc!YbQt&VcFLY03JTlqJwscI_<T z(5ZcbYOsQWr3jMQ1CarZ=1<zEC?I>Pwv2*#6nv6`l@ydxP)<P!1+yq11C>@qK`RAh zlhSG_sG)$SwHoY*4y~GkxfEy=ETo{30<sopO%#yzPFqBQn}Tf=Y^Pug1*F|-J18Ja zk~Wos=@g*5IJ6lQ%%tER3Op3FP*6w#*)_BV3T9KVn1cBTl9h5v3tNIusQ#1wAv*?0 z)*AWrHsI$o7+)mIjJIqHw24jTP*K#8`R<x05o;{d&e4O9Qt&thPf@U+0xRD!=q6ya z;-Abut_~%0v3*_};;a8eW7w%pKYhXe3A`}Y+Z5GzEE);d!YUi>bg}h%T5zkP<*4(q z(X#q8IdA1TYL;A@H#%j-nZobQXui<>()}0jztneG8ExtOX7_7LM`!FglXK?55!cjf zvpiU@JazHZ<&x3Xt*__2);l_DAKo1vaZSHAebI%@FKxfL{gQXIdE+-*68CnGPCtN` zUhE6FHgD+|Oy%3pZcj{EI9lBBV$0>Ko7q|Qg=caSC9_9dZs1VA?9%2}w!geRv2M@k zvb|UKJ&<_tq0xChk>lEorVGnnT6J;NrJbXTHoi9P%8YJ-Rb9h{>X+&+)?HdS+SvZJ zEw3&et=ooo_nj?CL8{@k&e7?61x~W6$46T>eRIca(a{<E1<2Zk7jj;5U36Wl8Eshg zwfa}HM{76Z-NCcP*Q}-Ocr`j&w^J`|nm}>K=%V%C%zv$FblPsbdf;qX%2yT~tpGE9 zHM8Y{@>2iB{!8&u&*pCih}<)Y+=oV7)2>Z`h_#ul6qx{%c}uOWb1-rLgQN2f$<~?d z{hY;@>R)MixgoJ;=jf7MuLlwj92%W-m_DC5;+l1B*=ETft451gUs-d1!h0ATvYc^9 z+lXs1IArb;nQ8uL@q#N28(*D=Jabtd0)srL9_NzuCYZlme%?4*+;pXR-Q_4gU%)<} zGvb<y&w*z3D|Ii|U2Yv+e9!B<fW)Z#AyCyf;+lDF0;ZVYm9;H$UhN&7c8|^!&1)q_ zZKK7DuPnXiwN7Bv!Z2zWaWw)XcblH)+(V<q^;Z_OU#2W>WI6NDh-(ING^~<P7L67+ zU-59VG%zUhMqKsCvtWhH!|T5Ga&Kzg>zBzqtdDvw6Ll?pbZMtk=2<aXyz<KG1Bv^* z$hDLe<{5FdGL$dnyyAM<b$Qlk+xFL+5(gg`o$b}}y_VJrHkd42DNAV@Enak`W&Nw! zC}bfkWbTM--d(J<XT2<I@o4dqE6aAiwjX7ASXqrDt|pY#w$Z5e($V5&S61vne?zV| zmTS?7t2slA+-+vkECTUHXFn)NW0kIjiSGMGXWfsNOuU*}kZAJaLzf9n3rX<3NhE|4 z2ksx8`2fCWA|X`*w_aX~?=7v1?r#!$4X<{N)^5k=B=oGPl~U)Qh0f1WYgso534c_W zTTpn@f#8S5Sp|hZ%F8Y&e5=p_0c?yIuUbV>3Y#SCI%^8UUa+ZB23a!cJ}HtX(Xg6P z&mwuIHkwAE%a(D$D*RpxB@XwD&hbm(XMO#;N)0y$4X4Y-32DDz#iiIQr(Qml*mz)c z<-sfWA4)vrA6;;SKBkUxeM;?_!W((6>cSs53JaRfbYjhV>dY^?o^d@_^@Wl|+59tu zBW3f)X3cqS`T0Xn72cSFOmEdW%BP$?`9|67v5G0@mtJVc_N;REO-ELF;SC3xFMSIO zE%Vay?adl28RKjULjJ=dGU?YTKVxf(Se|5?GHi10cf|6<$Cx5PEj;avV{$`kAf`bD zB90x<Mww3In`6*;Qh&#x5o)zD($3h=*s5Y)npU!3%n{hpu4((4?04j_%_*kRZEK9_ zSDyb~=wLWXOj|;9ZIXL)qM3nyktm%A*N;i!w05AkUmPvQ29cm2H=~#@?&e3p3xx(K z_MOltI2OxyUm&i-!*-OIJLDgN8y$BfjDLNG>wzYBJG<$*y+^9F9fL|BV%(BylVdZ^ ztxcGrlOMaCFps=qRaV2MB;&HuiE^<!IVZ}nBh1d)O^DB~2o6x=a^(p#3FqLO{V~5e zV=xenrQcg_x{q@r?DqNt3cH(@{O_2drZo-oD?Sk@aZTmKc_P}-gvIQa$1L~yhv3OD zHev3AaCJB_I~=5gl@r6D99=jSIdLv_+oHj|d(fe@lkk1u<~y>wz}@UfKHoH@;yAk` z1Y8^3-K!zZkSD)*RQGy7XU^fkK~GtZ@Aj}8jKv#rAg{YoIO%4$-=Z@|K_v}x0=uiw zmHlCf0to`+l)kmr>9{TSEVFzm$^;wYXfJM1*4-M6U+}nv8IB0}_2jk%MJ0QQQ@n6c zL9P-|Dc#8dT?N%QNJb6_u4CAXrq?2Bs@rf5?mu5Pd@vmxhZc^wgAr_i(+IAKdUPjs zEava+C(a(XpzqU|)aXnW;=Fb5@t}G_4R*npQy7Sns{}u``|;BitC3BkWvgW6{sWzz zTlVkYdSI7tZ^r|>w{&%Dw9cpPAxK$#+gX`Ww2$_(MX4CE=d9Y!=fdy|u?NlW?N?}a z|9QZ`X8cE-j`C^e>#t5*HZpD5SAti{I>)MNuU55;RJA0ETfR4Y*$*701s=93?A#vA z|HoPuUuqp`*>o=FN_o>*)!Zu!)?8iCHL{@VjjFC|)pghETE=F~y^-adx%_5s&eUl) z3LW+He^`<~rRGMtqoM}ex67-qmNkx)H6~n*H|7BJjTw$658vWkRwZ9CrGXqRaHkW= z>CA^J{5OOZI3j`9!B{`M?fIA?#j-Ii2i0P_#R;Zc#GN0W7I$L&HpY9~5jURoqTFVN zO`A^Bb~1<EwzL;e4E>aBG3skL6E{&#JKaK?f9u~IBU@F<?{s!JOL3mgj%Po%5D>{k zmh!VZ2^J$G9sAjBh&>KtUNkG7ee1Mq%o$z^?=ykEA@^}u8jnWV25{C?^7?i3PQ4A8 zD;PZYbisf+1I>h1SNr^f!C17hP-_N$Y)57?AKoF*542?dQ8ng+Zz*jSGHcT*h*GZq zLjki&{$IpkqdiRz*n0-HL<h?`DoTt(B9QOgEbs|d8?F#tM?P{vsf<30{Mf@;>?p2I z6wUr_S?#sj1!L89Pw#nZPom?{TiIE4l~8vpDsQ;K;%`+s%4^TXo{m2i|I8!L4PPl+ z0<}B-a{RX*xw^9Jjg?(v?)onmf2sJFORu_Dj<{D|b#EMTZ+xocy1V{d$yoW!1Z~)S zsqtdtOP-6KuWkPNuCMNTqiOrM506(Q^(x+Das#;T;FQPGC5R@hOF;V^cgOfCXS8@c zwH2!f+0i1SODJ+z=SQ6JY&)hmc52$O>kE2kJdNGjckngV+JH3<Dk@p0^9;2-My5{o zv)co1dP_#>lwVx#?~F@zUSgXcGxk!-y_cYkE1suh4+GM1$YpIxj11fChu!G3M?9D9 zNzaSB5YPWb`Q=BPCU`lDE1n<EqlwBf3Q~ST+)Q%_Y?Ojwly<tn1ViGkzjI+V&P8~g zE<B1=BM1gEf~WjsyOV7^<%cO$f~_(Y#EXxS9Y5uVr|y(TNHR*GBuu#6<9t_moWF02 z%@f}%S>xm_7>2+TLiTh?j4bl(hvWOVh?Rh1lnM&j!Vo#B?9-+3QYDKp)|^kAMSfa~ zNcnAcJXzM86>#)s9R~NEE{m7NXxW1Ou=Z9a;C&|RiHaP@>2l;KiI*#EcPyL-lq+n9 zYrN>#BJq{+H%2QI?57k59P#q!ou88Z&*^yLjT}e3Al54K#N}REy>Gbsa0;Opy`(qm zblFKqV~PJaF#Jnh?f?{F=69-ZFx*R18B!F<z0V*{7YszA0rt!vRt&FXkv_MdNo|!B zA@lr{O*bQ&1g^VjV!ovM27_!I=!4Qm!vK9J{Z1K&0Zg8=4A*A+$cfBe;iM|+;l8Z| zc1#JDW!?e+sB);D8ttJ23u*JFltPV32D^Sz4rd^jyvD+$XzDjcwHuQO8f>;<`N(`< zDUE@Q5{z;^J#)9K!C<7>eKMj2l{s!pYHknn;--R%$OGR>N6}7-Dl1O#b?0Gp`hydA zyapudM^z}eiaXNVJE&>wEDFewiUUeD)r!i%q=?FGVcyZ8u@4ME7YkeKN%?f6g-2&5 zKJ5BLqxry6(tTHhwcc}^-HRIyfG9B4M`fF5mGQm<Du(q2B*q_b+a5V`ti6Yh+`vyD z*eC5+jkKBY$r1ZZ(eIlL7(7X}p`UtcfVrlkF4FHm0sb|NEJB;XN^A&f3bl@4FXP+_ z0bv8Qz>QAPHM_b0DSr@Hwzbg75=GC2_MnEcwh%qx7396o!T?l)AiR4=ANL*ztOK|{ zSK-HS`T|-MlrUNyMjzOe%=6xT{QQuWsQM+%jHVoK^8`BXwqD|FbY5MZ+CrUe2(|Ti zJckdryZ2aUqWXla8J&p%qRCebCM+Uk045HiDoH1PSvar1;3YN*7Stwtmd#XtA9HtT zt<gUC!wQ7ByTf*(7Lit`9vT>4`o!gwq<E6G>r||Vj#`PixGvw&Lx}F;XZTQ*KsEK@ zK^4yOObyGcphVPYcwr2z1!GW(I5nUSH+A=;T6U;0!9geqS*y|H@cX1;4Oc!883Zjv z(Nw$PsuoBbQ{#ih77ou^*bL{mbU_<RVG#WT11h{o!t@s$au4UbiB3^Zmo^1}lX-Bp zMxONYf@=6E4qJs$SYsXc>+maxCyULLP3DmgNf;q$`%1FlK=)SP;uXGKTj;b@G?vW5 zo&;APdPM*`4>Z!sli7fqEHubSuDsBDO<PYEkk-GDaLEq&Paz0|wPW-tO%B*BA&+Vh zR@ml*WG-W=#tJ?qV6GG95rluCPYMTPeL#q+jcpe!&e|qfX3U*gr%mRA2YdU~C@<M1 z*e_X(f}~($SW=yd-8DiK{s4WPQpp^S8=n?MD^R>(8u^#cN9JW9HHR1JT`Ln2JD27# z{~Op~4ztzim^SN+Q=ggo#?&RxDPInLDVQi<dM*dSwaQtE**ixocO{B<VcoxG+S3m{ z_2Ba}uFhFGGH2!JlvQU6$7-fO9egVI{MxJYR*%eEJzCR#rf6*1?9VqnxA;ui_bO|C zL3{c`Pkre5C0}0srPUX(<h%NE`)KXf(aLRS@~_oQJ-_fX!9?-gGh3gFTy~BuSp7!P z>T8uV#wzQdJMi4L#G>_=2QMGJ;c#ws){WK8I(O>)$s5_uiiVrn*;S=C9N8tMSOu!C zJvW?~yZO0o7xs+Quf1BoX{3JBX#M6y?UvE1t*^})soHtQb*-ZM+=HVPbDq0*q+-FD zys_HZ&n+0KZ8%eWy=uxC*BGi5dMflr&D!T;R~N1wS-AEGj*5cSXSR-&)t+DR#dXiD zyRhP=br;u-OkXuxw(9c1uOI&E;n#wr>%8BaI^+Dk&*go&<Vz)&TqEvPqf=L(%lqE+ zS?A*y4!(5w;$fb3q~)H`={sNV9jl&kzVC~nXF^yv+vBW!(~&i!@|+7)#q)<hy$-Ko z9O-oKa9-WCZ)DTHznr@Na{c-G=kqV*UCJ4CFCUq<JTZ0uxjY18^BT|PojWyB?jD=B zNW{wPo-TW;?D-N*A1~!0_>1yYH|C)lHx@X`>z<u*{?r#{zcID#!sbL-Tf)`$-#;jF zOzU<=X?f(2J=NRR<Ryz3m%~8=CXC5abTFD%_ww`By_8S<Xi+2^|85d9<HT{cf<+bT zZK*%#@V3U4W7Mlteso^9FZ+b!bY479tBU6`nC4RT{5W~+(6Zw>r}LSKBOk_`N|Zu# z+LRydVH0|G7^eac(fr7T8B&qRh>~C?3DZnSJTm>oQyaqxpwc`lAIm#BcJXXEXEJ>) zqDt<w(6_OCL-rmyENmJK1Ql{i3|lS@V{oIx>>q5z!B(9p^e&zBJ=~_-)5A1O7&~>> ztWomG%7y_Gj9!yH7Y0ij#z{G0pHf6>rbcPBgDI>l5Tw@ghGz$fO^Tjz;i;?xNvH!+ z|5260YA0X9rWGJu@aZA*oN)BmlcM@&sy1SGRUk&b!!6JnENBQ}NiuugTt*ZOTz+2f zxzeAm$j1IQHR;2r=Lj_hHy!%G^@C*6jW)2}ux{?Xa7+v$b_4R<#<W6BS}6fdCkJmd z!V8*?oFnMdB<9GMn)!}MBdTE(Wlx+8=_2f2>jd0)g*?<V;6E4BkQigd_aTMSm_@Lk z4QJW2D1Bg+!|PfWx3w)^vUJ(<6)RV*wk=^oCcO(&C(HDNmNJ<V>(;w}25O2iaTWxD zW-Y~<*~RoD89?K6{~nW-B8@7H-p1_9y;(OW(>JCmi=kc<UhE@27>+wRleJGP@)oG! zHrGBK5F-qn>bCb}P7RK>nI^nCY0!nn>dA~IR$erd#U0lvNt0^}hs5<^j5G;y$Q@5Z z!qOakVkL$?Ym-c{<Rfr_*YIFU`4fDVj>~=e3L+*8a9{yj2u*had?LsP(SA0Mh>EG1 z6ya>niD{{DabZPWm!*c&cY$!)gg>5^HEvioZ0F&eg-Hp(5G%S=*H4@qwNFC{Y0T49 z{NY|KXr_}a<*Y5*UZll*nXS2CrLm8`qE8$1IRv(-;-qQPpV6z06qCy_SejwWD{L;+ zL9aGZKnpD_d$P*HJW;IN1^bev#*E4zJ*jD1C_82&jwtM`4pA4eCNsr$BpRN%TX!yI z`#KCQEqWQyFweo-=IoYB)qLsY)rViJ{?62IPrbV1!I2#gCbl0+Y&o20dnhsMAvh8G zyP{c%d9<Gq|6eVhJ5oINMsD`%!Z#h+^@Y&VJv*FdyROfibEfOfJjZV5KDcJOTD)we zc-f@`mv>$%-k!Lx_swia!NN18=S$ymIp(x|*S++aoXgc;pYhchW7B7Ual<nkFmD>0 z-9rC2x4%`AKc^Jyp>+%1s9la-U^6bxc(baIwo4W2+oh6K`sgnGW@9%$Zz5`f-dqIY zN6Pg_@$aSwgxu+Hl8T-a6K@@ZPOT)K{ox|R{f1@vChNngZ>4h%Ebch$RQJ=lfR`7~ zhU%Uh&m;44JnO?1G1}F|emF{!^P*fAHFCwI(jIrlsKMD!sO;LD6s*k{OXnTH$*JVh z3JKsk6}Dgkd;}hjV|3;q<p&jBF6J26{Cf6DXJdZX@UET-B!;ew^Tv>477WJZ^(KV9 z2KaUe#+%+CJe8kNJ;R%OY#Q!Xp`bSoq7JM#4L_IxeoPp&oS?fqAgExvXO{LJq1ug$ zuBFqjq9R+VM=}Azx_T{=?9zjnHWyKd24hk69?Ht32J7|oQF5Bm!Bc4#CH~O6IJa@s z(Bvkn>V{#di4V^b9o+u?x2T8HV(-6@H^CdFj^c$c21kn86C3s<Hatk?gz|?l<tB?k zR!J##92Cz^6g4GUHzZnjvbP5<Z|fVry!K0L&*WobUOXdFv~a9(b)tB|je0ELChC?X z%9bQtOK!|_l+H<%G+%36H8$Nd*1YYl-0Y@O%7(>WBimb39i?^WUC-BFDOosH*7TL; zk+SvIYTVcjF{KGMj9M%ZXJdi5(9yIcv1Ic|;}$>|tC@9vXr!j`%r@E^VZgePi)|4v z&AK@2vMaIa@Mz;h$a}r4MxylJY%2eeO;wwwI9Y>PmV8MjWaHn>=Mh+TSZ2k@KFEHe z=V6tf`mk+Zk2;5#&u=@IVfcbf11Ued1>b&}#FHZ}n+f)Q_@CYHxah=28I9OYW1C~X z1*mqzknV|zzoK!;>VT<EXPLA?b=aN4RB1WT{*LIqfQU^o#n=;*n6~J}Ls!b$$ExZR z#r0VCr;RK1Z(s*ZRV|vTY4N4*R}Q^==+$N4TK$dHS33`kbRI}7J2=vK@J#G#*?jDh zO}Kgzhk6jQmHEa3jdd8d6`@WEMEysCs*l|G4`50yuA*Su73c~Dzv3g4EB3e~OSpG` zkt~B@oNg?U?~4bZ1c?-L1y7elP{#_v>YA(;W#Rq+tOD@;intbn-?KqCtk5kR+8or} zxWj^XV>&@r&7~u|MdFAS@hiQ4=zROAq4rbIO~C;Q4kG9k4NRh*R?FGI^uG|%2PS(j zQDs;oEr^%AKx~WOM;(guLtx*}Wj&q!vD{n-v*b)UO+Mv_sZ)OODe-*4%BS;@$2>Ud zdBys<-EISXPp2PCVdu$?*Wmmw1{18sm&YsOmGP>0wLP0-^|=UJhN^f0sTl8ftaLna z82|FvFq7?{4aCjP65CTIxbBS29)kmPM$cmiTAh<Ux)N<OwM^snb>jj_%W4D8{&t>q zq~XD~f~{`Q&#X81*Z^sQypP&FZ{o)BlvgIh%T_FQ&{BrDgom#S=}TpD6luodoQkD1 z+Q2C$t8%w;nyt!Y`7)-=G=n*+DtuGoVyS8iH8svhIP)b?hURVyWr?TF0wvBhb8$zL z@%2u12rIyfyCZF7Qw-^1KEWnHayG{F0PA#2d|;YYhzb}uvTK*9o|bi0``Jh8&hOn^ z8;4iJJz-o_*4vA8Gqe!C-_Z>sX)5f3Y(><(zJ~b-3~eUDcU^?ii|)kNk?tdr!o<wC z>Dm31WXi^0Q}SgB9-wDzZek;em>}fNu)UP;K?IGtS{KFdrNE6KS!}jgvfPceT*aZK zA&nuyinc42A;xf$B^WZE<IZ-Ujf)+t?QY-^r7c6ESyKLTU8zu4D`8k1uGC5HF`nf> zxr+W4fN-6t&*@mc`s%VhBg^)TVY^yQV`9;o#Jc;T_be~`kt3_MaKyFfOn#zb5eB`P zbFR)<Ju+kU<%NmP?$H?s60WIZQ>H$B=&3`WdFbktwvj1qW7X4fvSX}v&e;5QV{?|% z|1(#PO`ShBW#-t7MPsvCDL!o>#SuZac?+-3TR$>yJ-wQ<{Ki5@&ElJm>KYVXO_QAJ zg2EdGK;p+YTuA@q=3L<Yk-Cnx&d)nLR^@!5gQDM9>g;IG`Npzbinluv_6jq;WoW4b z^(GuzO5;Tk?8OrfE!C%|j5D-U$MfXSLash<b!e%^Oh@WScA62k0l{qph9E3)uz{yc z4m`Hn5{AjbNroM4+?2!4y%<p^8g?=rb;cbp#vOFh29i4(a}0fE-Cj~{ESDRm3>D}< z_M_0PjZotZP))YulWBO`k2Mfli_i(c7fW{gwc|?UWLRuuaWAGBn!ZuQBm;j2#x^>z zVc4xm*tN%wwm=Py#!Rb8EIr<3mi!!4P(AAJ9deVBOG_=ZSp*imBSV%Uwp&Fute~+8 zF<k^mt`D%cBs2iE;Yc8eHF}Smwn^YVvB981D`-Mn;L?@uF{76Aomhes4&uT?S;o)O zNG%4YF6}U+E~abN!Bl$)Pqp0;=1G^hca#mO7i&yI>N_!-l2ZwRto1J+O!X`1MAHt} zSO-+`{9YPVzbXgSfwy5$y;keKTH82M+xWH)t(yulv~J47(7FK8KX5uXxpMv>E0^Lf zC&CYgRx~np(caR~`msr7bUzhCtMA~F_rd5YI;<RBm;B6*t{;p?a&l)HkBY>21b*go zLb@;_I@vf;k){F+PqiN^pdI|Ob+qVzyGD!Vk=o|BXSC2%5aolh;5NpBhku&Kg6-YA zcfAh=0YdWwvHvq*Fccd7<kOHG;)z?3_qvg-KNbq68rkUCn<U|1k@JDKNy0z<|Jr*K z@VKt)Oz;(e!VVPneJKFk0FVFy?jT4BTqIH=L2=PSNfcN_70Dv8`Bgy_p@QVtnQ6(b zj7cXQfpI(n6Dy`-cZZ%VmNS{LkfguX%yc?cqBBIQtu`IIzv-Et<x!y9j(WbH`OmrU zzW1u?RRQ2G3-yr~_uTv5eRn<EJ@?$#F1~gT@q25YMMs%hJ^3!0Dpa6<fLPSY$NX`w z_Bl#FO2P9Kynp~Z*1v&29fMNYManwb8~HN+&;1fXN+n$`RCLZzPD&+R=_KvM0MW+( zut#HV?`PbGlCG5Zf6AaJgqKY01G!ikC-#4Aw>W8k2ue6I-^b5(@8<=J67J|c)FE;2 z2ksQa-Sak<or_n+NmZ0-jdVx4xVxfVb0<-+x$X69Zi|BL?&`>luC^X?Gj~Ro_JH^% zsaS<w>`5<US50S)kK=Gx9}a4%D!d2j+j6u4BzNGg?l|mDWhETM#Ic}JwL@z1b`xaU zl=kCP5AUN4k@m^lCQ7>LV(uEn;x|DjjGdgsy`mz0ugI7&{6=fJP;Qx@H$RYcZ)h=i zSG10IiD*MzQooqLLaimm74pU+&_{x}VrD%8OwIRFi5;UecTHSbA1Pl?J4Pjy=0=fq zb4ctM;Q?$E)vt-)D{4_HHq0p{v{zI@dqpMYUJ>9=1NvT35A79gghH#Lug5XdMf*lG z-A;;c#=emw#@GUf%W(RN?)XaG?c@$1nulY50|8u6HiTIRjh`||?riBt+fKAi#}rLL zPD+Ya3_6mFbKj{f8Y(AoF}p2AtHg!&x|t5V3oL%ysgfyLdZ<d@R4T$IQ?_o+P!1ah zI6|{C-4PTJluh?@U`yF>Ke@5JRJ%yZHg<Y6IJ!jB^tF4BXc~9&5;gM*%Z&$W(E#GW zwCOtVhPb-iBv5Qozy=1yT{Es(h(*H}h|GPH-Y`fN-|U@8uX34Q@oW&3s#;L0xXQ%U z!=zsPr8pAyQ~I!B$0jPB8mn^qnR=1YZVc730)m3&356Tid7?B{)y9c$5!EucWbPi- z>WGwg=u``&$*^z`G%A^$Lsd&0`GVZ0wJQ~!b4mqKunMAJ6($7(Y*;&NCkoaB3Rcs% z-7&KP77iIR8=VyIbs%If>hOd#uCjSkGzT|W(vGoD#bIWDaL5<U37#GwJ~86)4-HB` zPDG-pmzhLm%txY1VQEkhDo#nFswZobkf>@n8j&Q54pchv-MC*$qq}OIL<y^h8YWOV zAW<-@gUKBcsY;M9vKf^krKNNd(m<w&9OGw8raX5*raa`#a*0gcTQbF+yhNrR3NlqG z$kb&lCYAi=splwog#s3m?wD$wr=nu1Rx*Oc^Fk1;T0yWbr>s^|`o-UjqhGg4x@u7a zE47M?#}F^Be?0Nx#E*%1{QyM?k!$3xiCh-q1yWVfNV3<$sTiJ*GuZ275>`bdtcplj zl}W+?OA@w2ArjUL5>|)k%qEbnjG4_&if?xy<U2s34buEvH#BDlmIGd25GL$62!99S zRo)$lSH?xRlOzf)mUfYNRRpU&Az%q3@p33IE7)+H+y&$&p<7TeE<(I&TBLX-Euxo5 z*S#fOvY(fz*F!<QbRp|s5SbvAjV;Zx(+9Hjb&g)cNl`^*In0!Q7DTfOSjdtSB1X>Q z`k3U?q*F;hc6W%?0^}^+08Umr-T+RfcSE4KC(>3|q`ZqL6sQ&cSxHr#B{}4;_PwMg z6k5YXQUz(NJB75Rj?=&vV2Gp6bAE5|bTsp{&wuK4a8Nq`B$<iGJIhSCIWV<auN)Fe zVW>2v%v3vB2kZ~j9sdi}-l5D?8zVDih3cTx6LL~@s0LK0jHM^q#Il!~*tQ(>hh_+V zwsO;;MQ&<YB>nM>_=T6YB?5GB36RmzOBCp#pg`3^ewxOj67tiR2<?2C0ww_FIU+{! zObYA>64N3kLrlj^TEx0I8-kQX^;gJL$(SXAEY%BXY5|qx`o&R0vj%Zg>ZjD`+mx&7 z@ot<f6$=W<$|cl-MtdeIV^xDj#+Qj;{Yw-oBrNr=Nm$*H@@}G2AV45k5U)zB2?TjE zRE2Sr3p5K)3bF+~VFKkMRpC0NV%?llLvmIP$yqg~oCR2JcI`+bIcq!QtOi79wm`PZ znCWpM{+EgaVQaRf`%^1p$sz-{0uGO!@efJ|45VHoV#oyWKOvHGUn?IZCJSUN)xK8A zWN8utSOWjrQfcVKGm90xN|*qaLhurH8f2p(6o~c&526^zovt3WC3nwT$lYSk=mvuR z!LvSfiP+s+VyAcW5~+JANL`U2bw2~5uvlB9rf4P|`zJ&a=hFj<L%I5}3))pCXqWj_ z{$O0WafHdFNvV;dkD9_eRCN1nEd3FXph5+L3hDKlD37H<dh(Bm0{tP%5fte7U86wq zAZ`j_Ne~+lr#N+96Q92=CNfh@WTx08Gk_(T>DxkNW&_AfIifRb9etZJX1bgdhiY$& zgD>rkmITJf#zxg3j3k2aQUSlar=rfmQTXSMx^UuK6>cdI8y*|ftq9n1f^H9B3R5_r zh*gEnA6KX%C5362Y)nF78gSHCQW)AiS}cWWFhs0IDD+6Is)d+E{vb%LR}bn}Y1j!S z_YJ|egP=V6oeH*;=cI-5EY^<VWxDxliSFE6y2G8kM0Fkts#7PZ&i_TInm4H4rC8jy zl$}In3SumS{Zpbp3y`wjqUU}ikys^>w}hz$PZ&Y3+=5=&)t4!kU9}b^aG4b}$sEg! z3#D~#bf6urv!=!DYjNx1_q8~&1)@aY-=I7}^RR7rmz+<;?rSBZd_o$7DAw4e+Z4tL zUU&ecF_tKj__c+%x$227))QT<H|Zi^W1Gtfy12suy4bYCN!A%V(lchZIT8QMbO%Cl zg+2MA{|q}nBJUFwAb6(Jqe7kN*$Y;SbAGgZk$Oa)RRi!><y)e0_kqT7PcIR=hl0@Q zE|5MU^2UUY5X(Xc9TT-Ut)Y#=FwyG5#kxXs$q53cdqJ|RN1W)zA4w{DEs7>pCZ|b) z6hZjJMNk7~Whbg)r7$z+OGK3Jg-4`yk@9uA?hkYZdcb5FK!XY;=>Etf()tu0kyMC{ zxN{o4F-Tii^rLMmI<Cwz6gj_4sih;szT8k@N*StRvNDMb1^aMAhPoZ|hzdi7ssu@q zUi2~{*JVMnBRR^RsNnn+WF`{A@w1hgUb+*RiS7Yjq9^y5p73SM7KcVlC#fVueZRfw zwU!B)X%35NaWa!>7QrG(98sB1d#B4nG!X<TsS>h~T|JnT@aN)$pSwd(s?c=V{qcWe zWgDt(f^0*He@kTK&rpt#ZSLNg--XFGkZSPHx|b9y#%Qf9!<3T@Q%*8WxhcZ{HgtR2 zNVm5IGE8;fHpk3*N8i?rnGH^gZ*?HFo|jVpXPPi6#mH#(5UkRJ<M1w<L$_s%Xx<P! zU=P4f-9PG$mYyC}{S$PB+t7fAu9}0ZE?nUYzqX_?tbq5~SNy|pzBS;%K`Y$jjP&uq z12P88HK-k#?JZVgXgzBsO#zD@0%O3TQQ_)$iR9@^{~jH;lKs3SKs^)!lx_?-MI7{{ z1<Fp0@qULMW-03H6#HEYzCnSx%QPS96UKmYLI~=oAG(UG4--EAV$zQ#C4uwfXF>QE zdgw|w29(u~HwKjH4RGmjuZ;mADcMR>5T#&40ZQm*(W_;PZdegV3>RVy7(?p*<NTy9 z3%-%zz&H>sI5|452EH(kn;*z8y2}Cv&yV?{u2Z9<r{K~Zcft<x6U8wJ^vnY~sC8#M zVu=T}<ngQ$$Z}O|>`tCD>}9%pdr%8E*^MvBbdt5bM+A;Ld5O9`6x2;WsAW<UY_=%s zWeR?eg6Ak;%E1)IZbyu9-tW_MOzgf%v3Dt0IGxi)JX(B$$ms{QQdf&>#2>c%W>RuD zKaRGLyTu&T;(47Q^iiWmiPYW8gIb_xAa&T6!k!j<W7yI>v1<jIC(JrT7)S8tIjE&h zVq9Yg-nZu`c=<SJJ>nY}!Qo;Ub>#AG;RED81F{~j{t!{;%Y*Qv{D3yR?#wraxa}i; z!;7}N%Gk=oo{lYU!)vjYgmgB}GZ<VF)$XmRrg!raEqf?vnZDKa9?_mZq~O~WEP#SB z68jE4%oJ?lbW0c(>a!qbpUbWiOt1Je<`<GusreDBg-X%Rj%3>6{>GRZ>NSlwHPn;; znyA#h*x{0<hT<}hWHK2@7f6&rpW-OfJa>NZ4p%h$3*$c6O^%L4vqs10Z$LeUu8HRR z0|TCs(UJ4RqvHXUcDtgLd<|7#V0e5e=*P`I$Pb+Jsex$m;Haw7by%VV63ue(`ryzg zE~<^@`CfrMHX?jzR9FCcPZ-^hl{Y%(8<C33Tz+$a?pTVJSznO%WkyS7t*vDg8;SC{ zLE5gP9~sy$#{97YTV|Chx9(DzKNcCv%%a;+W}4=Y;u5UvP$L99X$DEYIp}m*Jv&LH z^6h+c=t|H<m_Jr8(mrHtbZBUaR^D4$NqxLTC?5(!sT)6DC5rc53jR9^2ra6AOtC+q z;7=)70P*}YdhUA^yidXRDPS`C=M*z39qT&(drJEY3Jhmci3TJ&!p{`uiy*1G?c+kL z%VgHBR&f<#(rZ(p1s{Gg?fl*7x;VO<0185^djzJ%5bqI~(u#52;XSc@ToWl@L&6~h zMT8*4xPNQeR=Q6s8963jR9kc{DTp#e$~cJ;s#Cl!ZsdaHW5=A5)bdfih#?;&lN0(8 zjwe^QY<hAFk(8z<d7u}Wq1=@8t9Y^mv;#;#{s+o;X9vWJVR}*m&m5*B-y%LBW>2YL z)DJ4<61A{3I5}!DI9V)}!ex9*x=FdN?vZYi`gn;-Jrq<5hjg)!7D9sf5ZEF`H$h}* zxCN0Z6-FgY@R)*dp(goCDyY>GHM7%;a)nG9QHsXM$!qx=Ll&qy@nnJ0#)vF@3k3+H z5!{P)mki=1SxBZZOeT#rGQKY&E0H3y5-BpRL;y=m_rA?!C9)n?B4voqbdrbNnYB)e zZ-j?k2S|Uij*DhOeMRn^BvL0U3dpB|XwZ&jDxyKcGyQByg6*}`ARlnXAOAyYMtmCX zbxM;W5r_ln{e);^OA@~0__j{=Kn~KZcM$W9z8U&$zFr(LOLeVcyhnGwB~kRylH8)N zrh7yYEM0vs34^>bw`*NTw|Q@`y^Y`Ki8DRN`J&#~J92wC<A^%$!_9&Ly25Z=#TAAY z>q+SD86*7-X0`g)DKQuE>-|`vZaftguF5T4A&NOjCD4O#88B%S$%Q9d*a71HB>oe~ zPj@qJDLvlJxFzdP2^F4383GkP>QE|b<lVBuQ+U<e`!4RAZD_vUur<=K_5EEx*!TT? z;U`|W*6<=3SI2o(kXk0Kl>LO~5=P4<jFt<GMzK!=<jdeo@T%J4n5lF0HD%1yI}ykB zJhm_faLXgC&Da^Z8_#`adE7K`x#<R%d-r(UEsNB|P^T_ow0n!usE_X@D#L1(*PMUG zE+{vR%NK)=@7)FFtvV0<A>r8t=wfb*2d3!|!vmXNV@CKs^T1S{cpjM2eiF+ApSbHh zFw`5iZ18RJ!0KNS;mq^;0)wibHzT51W1jOvqaJTG8}`epZv+<1nPV#W`+)iqh)1*# zR?KwZNF4}{p7o7L2MD;U8to5a^E`)rmJf`pL(yCj4frRp-yq_`A02JC2S*2lSGs7< zh|lL0TkORgMXqHto|AmT@cA7r=Xl_>e{2jE)dSK>Ef0GiCx?8m_)ow^c!5ztY-f0) z^+Hi+DG?PPkk3RbIGan4NiQ7syfT1ImjMs9V@86}^1%41Q`ombMa|T}U_H8oe#9_j z;y<g4=$LXU&L7(g_3*LKkWyW=d~!t+b<y%rwdCz5tJ4%bMRG^n&yX&tR&hV?GC%nI z(DL7Oc+*1;gc+eUgw9Yp!pu-6!mLmRLflV<Fej9S5Vut!grW-}{2?JM2<0Ix4CNzq zg$fWBg$fZChg=9tLPZEmL&XToLMsr$jUd8`P$|O7P#Hpay+BwUawDt>H6g4GH6yGG zwIHkyEkoE4szBHnszm4xRUvE&RU>Q;)go*O)%~X9zj4^AvEDV*Sj#>C01;_1vWtJ@ zWjYA)P*VAa;}R*ohaNT>{j5hF0cwc7x~VTfS2FcIwb#9&qubrXxJvb%>^Ux+w-~s~ z-D_Oyv|}{b!KguRXGh$l+s(_Eh!KJ$;~8;_-B`~Mu7Nr=K1{bic}BeM;AtN|Hmdq4 zX567pZ;h(Jqw=;W`A)!n+Jl!y-6wo*olEI(KaCsO&-%`v!y8870eWcIbJph$jC0|h zV8R#7LSez{9`gjSKa7judGmPayhZ4mkE<~AP0k5o;D(s?h<--b$-Z7q6~bqA+7R>b zT^a`JdfD%m_I#eM1U9<0Ur4;K5GVGpDfk--!W8@)3jUUY2n8QeaE*c=Qt)>a{I3*T zr(l+Xzo#HdK^#-}Zz=6Z6nsoUG9g<1ca-~M3QX?I*ilnQK$LK;Vn5}xh|V&+Fjmpm zT<c09u*bE>YznvRHrvB&V_Z}0YJA5!)s<){E%pWcV(eh_PKdXI(UVu<jC6pQV4-4o zG3^eut!pnFks1oJg!x2ismT5NvRW-2e}7U^sX6iYW~NfTOv|EJwo+cF<xnhFscX~n zD3-5OG-w4BD^$vAG#AB+l={_LF~v%hO1D-@u`;EqSu3Yl1(jDxu_~ozg;q_m8hWml zVs%R6TCJX94fIAM#oS8EX03^0&Gc>y#g-|}8@1&WTcI>;)>cw%6_wXYu{Nc4mDWzN z)k^ywhqi{I9m=vEt&?JF>A^0Fb<>0ED7Ky|y@6sIDR&daHd7V0P^^a<yp>|TRGDoQ z+fHvhLNVxiQ0qPi#dmOgC&za=sFu4a{tKmrls7G=IvTJ%w74?^>gb(H#@Bba5&g@p zj-6>4f7$Cq{IAj+2&3iVw12$YG0El;D_DsC%!vLjBB>ZrgGrPMY&<W2P#fDTmX$N| zTk=u-g?gE82FTF;r{FFCD3u`$(J!S^`K^WPUO+<6!Txq&7za~4r|fvMlj`X30PErW z-sHD^>JKE|?rdBcn(A%+>oB>pDPTU<%)r!)4DP-%IIfGV%vnDi%fxa;hy5di%#%O~ zJLL0#!vK?H67LOef6zS$t_FOFe|T&(5Fqi2cn<w5vbzFq>i3wY1xAONc?kvt>q1<B zCm2-yC&q)mfV+p{J;x1ZOS-e5YX~8k(JdK}v&iBPJk)VwqGC#qe|_g^Pw=tvp`pDa zCr3Myl!0mwp7sr%1w-Pu-o;4+0k*~C25WWJqe9m6uBL{AtALT-(2(2O@Nx7}52W1F zJ;w(}$Ic(`aPJvC=YtzS;&c3gm`a}To%X!!$LT353Z;$?GDisZi+I9ea>s7r@Z2ZP zyX9S<7B0qKwSKpBIr=!pD&O;&hlu7|*OEGpWvu>`NHy~UCOuC^{QE)LnV{puSj?&w z914|(JDFJ>&$|A&V);|a$_~&L8!sRc2&$Q-e`vxbXOo`r4pGWuctuc3cn&j_@zSkH zb^SYam+EFKYu|qT;_I``n@mfRSXI1M%|1*D2#FUE5-%VPJYt{D2@QODU%q3;>FCSN zn8|b^-kN2x)JfJLbpW+9oSx7YUnTxC2B+&3?h^(l`w_8GSO9AlIvT*9^PzJu<s$-g z7{Fn<Bs2L&;T$H)0)=f_Mkx@w#O29Rwso3*E>XU<2d(&iQK)0D_jv3so!FLxgbBp0 zucy6UDXBs(4oc*2L00nK$A3?Ff-%Osn7smRnC>okrL+4!=B(@JVdlk?t_~C1{FKUj z0dE-SCEwb73vSU}=Q3{LTEta=zi1ZBRWV8zRW@A=CaYN>wd>prs@p`qL`MW&BV6<f zS|M-|gdY<Z83yPvxCn-DKu1vT!W{-Qzp!URWYtdEB8){%y5-yQZFr2XW9*8*AcQVv zlxQlyuiP<H=;$lWm~lA~S82=)M--&YBsaE<f&K#`sW1?{=goiV@4a`sRG^zUR03B? z=S$`6c1bu`BFh&1Y!!uv4MkzP=RYsp$iX`GY!rnOcMS`6wS(XeTdq-m;%?nkFN*^g zYepYJX4Tq%R?KCmYU=Ll=!#*li1dea-_+Q6(EBcAS|!+)@)_IeyZ<=6zg0h=v;ZW| zNORGsJ3;58{vW_St-8OYxX<1R)?TR1+x-5LbbDw<=Oz2~<t*kNrIkS5wp=QI_q-(; z6k$0LfH+D}ziA#CFwbEmd8vFinZI?w{H?IB+cDGX=v$jH)8?c&oS}C+qPe7LfGmbh zF!e=XP=im6p%SymNl7KJK}1|-$}O+*$qM@|FGEk^Bpe?5gM&S6VnO>r_wm|kCdl+H z3w~a6Eq-3J!QGPEy;M};Nefljv~a2*wi`Wu(o=Z-o;xB8C&mN*5zIFdg-68Ik<dFx ztlnXt{SadMxIVE*_R^XGsD6`)#_z2je^CfFjzuQc*vbi$oG;ks7=hZrsLY1`Kg8}1 zQNXHsGD}nAklaGis==;Gj4I^qxV{!f6S`wl^XqXuF_&e^;AR!Lmc(&e#Mp%*RuW=` zgq{!zkzIFeI%X`Ec*mw@&T+!A@1Q`zIHRfyHZC?fY$@#nlLDU#M+DNg&SbHZAy&az z+c`1KO6$!1rIuM{YH|D82&=9DR?S3orpeK_Dr2VEN%2(<gsqwCA?nm*lEt7zWc1fK zhC&|sQXyFbO{U|)xZk3bxr9zLfi}}w@TZGi^FkS3QV0{$kNeGYm_%9+e+!jbpi%&M zGboh;13}*_b}j<!xNCcztjPl#h|^56L6-Jd)p*xF+ol|$3wF1)orTu=RIGB)efL$r z37uxevWd#yqod=j+#MYmI`5`;r9e+Izt~82pTI^gV>o{>;2S#WUghubbx0+^aTxdN zTjXuWkGoIeR+ORhF)TW?$)qbC^#)q8)6IL?BR*EB1_RKso@C_$eFKOSYG#iY_o}$@ zkH3%c1<4z_=NeX9F`=tty|pF%qvzb7p}?rvKR49Z_A|lS?RP?6&_6UR&=>2ol~vND zd4Z~!Xb*ahx7V#Tm9OYbs+A<Ic8}sM^_(9%?BmDT{yLcfcE2>~V<iqL00fO<l=VLm zn40VVE*^;%`$vYrycp})?-is-H`Xprn6IYxMm(4=)WhcI`J+^}%5_MIKm)Y*WF<R- z;^gpG38hRF>wVN=B)v;CW(e=uC}%cA$~VlG39D^gON_&bpdw5aY&db8VQgqNu3yk_ z7G>j{5_=YfPNhi8?V`SF$4rT%uQFq%)QPx30EpwItK7bf|8swW;64%nas5v^&_5x6 zy1LFD{iEOLXRBM0=>Jb|6a5c**er2@Z1m@a0vKyv-;FYM(slqR$E+;9|EySPi5Pg3 zY_}~DgT&J~{jG47iPde<=qJVgEXlBa_aD$3w}{34DaH8sjgI-t?B=KC6a1{cH^^cN zf6f$=xWHtLv;E#+K7UeQ3KL~9m|su*cZB@?sH+X~-yA959EbeH`SdsqywK7E?Sm*t zxk9T~Dz?liF4{44(T<^ub_@}dnBUb`<(MgU^i^cclsFMrpG75NP84F#K%oDBfyiy6 z|HYYe2xAUDGnj(!r;S+rQX>98yG_Ku812at+K)&3+<SK&=`RTYWI+2M1pr(RMY59M zt)*me&%}T{p{g>`e^SiPNT2b&71fu-pn9H@@rYhOlgTQvl%?C8$;{P@hnm$qjAN!% zz{f@4IPjA|>3gi3ts5id8(9Ms!_p^is#<yYN~L1coRUwNJfARmK4EgiK2`ru5V}GA z0#1cEc9K56jQ?}rL2%nBdolKRq_WYEd8a_wxu_0)DG~Pnc$)}YY={hd)U)GbOYAx{ z9B|l1Ms)$7Y4krYyKe2oyN<q>6gYeU;z8nXR;S%71&-8r^uLE4ODuE2vZutVf=9RF z?CKbtZJm#nGU<i)vV?*rW%&WJX4C5>R4_vEV=dP_NY9_PX6+#qehftj6b>V5Q=7jn zQob#YD^HET%aw}lb4niJ?>xfad4#_alSVOlePxcB0!Lp-#!R6TaVY8e)`4WQ#-P-O zkdmHu5*g$FIU@HB<7Wfs3-vtte$t(Mq`?2Qm4IJL{Qp<CiU0W`9C>fT5&^hP0ua-S zOB7%sM$(^4txZxlDh3f~h07AGbwLECNELI50!C>maklz(dd|EG=6488;O%Q-=tRu4 zwS1Q;OQ9eXW*zwRc3(+}Zv&)fmdz7?1xXQNMobkZYGRZ;F?r{RsHiAQ5Ebkrm_%iJ zq<niEQ4wzI5hhX><6;*0A+$;gElR~Bb4m$Oni8TkB}8culRBT0zFNmjnWL{dW2W4R z_^*uYun5`_2#$^!n?o_<vqU=<PCJtK;u7sxq8%2CB<uF?{Io;;FTnZIuU1X+Nfw9c zRRv0rM3%pV3y4|cCVo!L`;!z*zYTs)M9WrG45lBb*oNs>(@@uF7LIhOP#;H~0i25W zMV&Y_GzcH)UVp%Y({2M+A~#5y9s1E<qD9Q_-_aS%+tly~vmCDjrZ=Q%;;MKZNgen7 zXff7{!2xn)Gr--k2uv(>k?2dqRAyM1%93{8eV?si0zPXymT=)haN)yhtujBlY88hT z1*@Bb*{<eNkVip21<6EsW^3h9#lqN0W8${fT*1IDrsM#rT1{q^8CA6qbun)mjQ!kC z3G0!8wctv7Elg>5q`W(hDaHOH>=*G5XM%tLah(!8Lm`4K$cAP*rMPZRu{ouv{s+SA zY3d<-rz3{zq^&&0XTOceebZkU8f#!O(*<dAO!g`|aDhgIrz8eAjia^#odrG<_$;Mu zhh3|du-k28x8OLG^e^<pAE<sD6mSow&0*pRjvq5dq+hxwWy3f|2MfY1Wp=}6!7sWd zHD!SbY?WF>*rZO%xpto@g5_A?uz^!HT5w8In}#@40+*vOU$AjGsvme(`f?mIX^y_E zjG1&N;)6gi{39lbmNX-kuOV`OkqV9~>%Nkq>`Z=C`9)MWB|@<{HTJ?wLeMa1w8150 z;u^FvKsvnoj+mo+U@IKk5-a|&=K=1(mv5Fi&684L<1}w!Y{kr1-^&yfIN53okP6<a z63P@MO%%%IA>d84Aok-~L1f!33&MuT#u8S|#Z)z$v^v?O)yXEU4q~6qky`yr+xxN{ zGm4|nnK9#VB5qG!|M0%A1X%Lh8*VPl>-T~ANUmjtuq>D4o}#3S!@#a4w`2+qcCv)c z3-+ei#>@8EHa7dI#gu!n5{(|SF2aXEq5TwHgcR!%fX_QYX*ULwbjo(0^9N6}CHhJK z2z=h*zGz%i7J$up%mCROiHf13sa4UWKQ<hE=NP?ZVg@!XwAVYRRYV{SJ8$FVX9x)# zHIP7$1qq0&2IjE|F--eF8*!mba@v^NSL&F_ck~r!%oI2gf4~^Q77OsvNu3Q};5`7x z7l9Grrd2p((wFpNsAkMG63F56gBapFZUOiq))(XA4z0kgQ%rZ;8LFhJ(p~2p^g95U z(IzAy91kU<{|1UEimzlGrhq@5$$3jlV6~&^D0U)G@)7`EPmV*Z4*vC{A`)XHO6$p8 z`m1p5tHf~Aq)}jQ`U)cVg`1uSV*p?1CJ-rk?0N4Ev2YOMBk=>cgfZA}Sj?7?bV3$$ z>?5)3K4&=Nz3jNfo<iWz&mxp0c3ONHWmtv@;)Rpnn<$VNfx#<;6Q04^6vD-33tz$J zrm@Gz44e=rWfZfOX%0ylIV5G|kd%R#v{K6HD{;)^Ir@q+X7ZhgM>F`E@-jbs1Plz0 zgUcBn@C}ci@k0=eIY#h6HGHA01u_?x=M%_1=R7#9N@q`bZwC7{<HPXWKIR`x#1!+& z<H6Ia&*Qa<?2^MUa^%)U40$AO<Q^RCHNIg-e&d^Kzq$=C3Tr#onqCy{5_uL(nA<HG z_`e}i+KdIFwos6qI_u5=i{jfL78?~KFXx%Rv_wO2bveFn`VNTy$lubseA-x->n-cj zN~`HIp7oK2^>piGf>u2Roi4`5W9an5ul4%<g)cI3G4$tWl_j+I0WLFG*s=u|FSB_U zS8+nsEpOXVF?AI!n`%kJ5?=o~t(ybJx>;*kH`e3O#=40kWKfsk$g_>QOs)9rt(b4l zvtmrDr26<`_0P|WNo?=~Tr%oP%q>HoT#{I~`PM`mtqH?;F!B9L=z8bu7loC{OR*?$ zhUiyhQM^0PqOizyx?=zHvnmoB{P3)b#JbJ5D%QlTip2M~U{$E?c<8f;+y94!Ph%l2 zdWMDuEHhbJvD%my{7MNRsT=>$Oz(!&^_*|2chXc}A(^7oWxarDA9%`^L)sB3-yv;w zQV@fkj^xxJ3VnvSK3DbN8_`VMa(2Rh>N6<Rzq;@hMn+Lm2A9oWHSaRAH##)LX(_kH z86n=06E350J6YYX74t5T%?p>;-3LZ+>C+%C<%3>uUi&yHuCp?IEn(>{3g(q4%IumU z)(;gWMfUkiOcdFpxacQ1AP3lV$ze^Mq}63wuUO@F8|xJu&`7vBm!x)k>lHOYYX7Wi z*FRbK+G1Uou@|ndvW08Sj2SPNlU%0@Tz$ru@64NN+#-&t)xBHMwtY9xlJ17jYNLAd zso)m3q}2wjU}M*-+_rY+N)?;rwmN`~MDFS(xw9?j_h}uPdTr}E+!86@BB@;bURRtt z0DA47ImJe=tu_%d>cuoR_Q!!-lnne&$NxF9iG7=Hxy0Z2Um!0?&+yOd_%_O*-<KRg zX{w*(y^urRpm`YPu%6#T4fOG0g9dUC$Cui;J?>NfmwhAd1QS8M$99hd{Xtv=V~%s8 zcdaA18U_|%<Oz`+@{Pezg5CJ}20e74jJ);*?ihy#$A>(0K@QnkjGjCRY{<984EaV* z!Pde*V$3F5f=?fLY)#ij+~()?jg9)@7!dAKRnUWTr~QMc-FyWPuBHk2M@RVj!>7)p z1|x3o=*Y?-t{5Eg;xZr4IJOHsK|elCw*kt9O@CJ%AvchIly_dZio{!Iu)W|84B=u- z_wnO$&QNC^KW<usB-FdZvMT%F2{ZN<B6J0M(7kG&9&YV%A3>++PvbTpd{qT^6gyrW z?!9niiCV@qg_?s)jNms#zD`X$;TswqImMSK(&atUM$a;oDVA&?sKPvkYQ%E|t}bcF z#9R>{v6kb3)5W-EAA&z^|FCbjs*b8X?!DrD9id`$0`8GfF4|JeL@m!Gz2D_SE2#o2 zJ6hA#|A48luEH8nw<7jln%L>4g%!a3R@`oJS~4HkF$Qq5h5Oy4yw=nYX~nO?J6}|^ z6-rUrSI>Xt{Etc+!i~MxO16dbxBbl3GQI0tdoS<3^71v;#&GsVbrcUju;qJYY5Cs% z@|6w(msapSSiySdS{HGH?IPA6<aPWm){?o7)y<gQF$=g%ELHs#xsVM*aJ$?a@e4Zi zl@KrJN3NAT8qR-IEa-ig_g!6a&9x<*y@eNa)EPWKhO5B|d&nOVRwm1jA@a5o)JZOG z094LcpVOa5DiQLyU&w*oV4ZL?0ruk|17%A}?9n9~uYWLj9QYMDd)PAu?=A7>`mwZ_ zZm1I?5g}=lsDU!jjdC78$RQ&?KL{;dABCb#^zT0DAHpr>uyGV#TKuX}ulQ@{Vm{kJ zU4^Ua<Ry1*pm3T{xU_dQ({KWqR&YZg*q_#^kx{;dAn7l^>=_#8Tlwf^(I)N;%X~`B zZUjz`jt}9+xuJ8O^8uoPU^u{pjNl$~+%c?EExlc`Pb`gC?Z*8BAol)PdK$;5=+_BD zAU%N|$K}hiSACMEiiV$nHza&?B!O|keSAcs<?pZ$jTJWpT8R>TOv8)xFx{i<r;Gkf zmMf8|;Cbs_HRKNjUohvwF&u(rZ?c{tuoL@`NnJ4SbfPtY;f$#x)m1bWHyrBJ`}lF5 z1D5`y;!UmtlT4q0JO*OgQ5E^Z!E?B5FyRvzF;%+cbno(=^st33Cb-8<FLL>?#O3C8 zxcg*OUfXz*t}~>Wi0|SWkC9+vBj9g)o(`~dv@JtKGcxfAP0ZprE|nCtB9HaB``q*r z7*mgWp4uR%9<6UOFOD-tj9ogGWrB?1)h6GJHJf6J8J+u{L+u5s0>{(?yd>DB?;>V! zOvsEuxP_K!2&7@2;EPTFB_Y{b6!b;qR)<owV%qyH|7HKxvhUS@xBdg)4_*7h+4~Y1 zrF(-=Uwvp0>PpN$;lug!i&|qyHD-_nMZ_LLkm%N&(}IfJCW<wtJfSN?P6WnULb22% z{98h?)D3qT#j4va2$uO-b_o4QJZ7!1VO9ylHt6J|!#=+lm#qdG1g7m4n0Dy$(A8bn z*YAz2-y1&o%nx19hO?g)Ol<zJ?uLN4uc&ie9rAhA72sP9e-0=}Awy>7Yd^xVL8zM? zUv!*Dc*fvw=^^n8q7~w2$J>5ee`C_=bxdY@(<ZZm`awkS$Z2QvQ_ivk`YW$(@uvT} z@|_H+n3~K!rA+38vUe#L(vSHR1vk7alev?5@W!9>vZ6ZP%BQ@q=6|(dFx?N?`xs8N z@H6?71)=;iq|T1}g>vmu&qBYZZcXw={u$lBgte#%0QO}eHOcd5Yw(q9+%TJab`xUh zh!y;1+FLJVD3gVgRO6g8IR7613xcAGU#Remepi=Fp}(@{WS`5w4kc8mx*>a%Tb~wj zTxC-TuX(n8@g3*4b!lbNHIf&sly8UfWXY2*yh%64#r=Y4pZJ}rlQHw}S?E&Ka&IQy zrCA&I`?})I3b_zwf5SOhbRlh|VBT-I<B9;t-)P61&53zxqZeKR?Q+g6OME)6K8}%p zId6SdB$mSUDF~&jd1yDa&e}%D$k*pBlk`t<KQ1%do6F_peIp&c<rsN+-jdqliUFvX zlpj;l!FfwsowTF^E~!wj)9QIk>PT9Wi%TlfOUjzJq_s&(%JLR-NhMU$$WP}jr#neG zEAi&~#5}dkTWX(UjCC2!=aE0~mUBHSxE}A!TaS&2-{R5A@>X&=Rb0-i^OmzYX*tzg zP7Rmy?7ZcWkP!FN>r>0+)NwiM<}If;t`LA+PMNnJ?`}`bHTtoE`!Ox#nk))sTCfuC zHS{)4K!CvecKAMH0;%GO8s$u1;ujW1$t3Oz6%pp2C;%NIOqTSE$V);6CbKT2zjZo8 zv2TS}xf`|A>z8>LG|_>J6ebHM^Uo=*?*6Ev65%#XwW&KOf#}Md8v$)Hc^%b=ox%V3 z-(kpy{aga%M`9n|!_f=e&omq$f-iLIpJw+Cd4^ATJ=-UiOAcm0urQ~C!$Tdt<Q{b> zupJTc*j6wybL2|ui^>PPJ}jPj{9pCY^nX!d#s!}#LDBHmvJ2JZPfq0YdfYg&aB^Go zL|XIqiHzP(e5%4o44&%g>?Ds?k6=r7BER<pzIXNu<D)^}_KAYtPAgbx$;4jD81{q6 z;nntu^xhL(Fv9d+KSvQ}_LBIpeIl#3Q$$L7v5&Q#Q{AkOLzVCe&g|`^ya^{if>#BY z-aF2vAx!TLa1>#6ZvfwxMFdZ+31Ba4$fu%p_!i}DpD61^I-hBAbGQbrYo5sK?Uc#e z)pF{oCbboRR9a|i8)DJSz^IBFw4zQPC+<RZC1-#Y^o@Acb^<b>qYFgyECZzy7oh$Z z3R)0EbB^qO?#RHtz5P!{)4@MR^BLa1yZ^}E1O3qq>T&fS>B01;5ABQQ?$~!==aUDY zK5%4rw0!q-PxbZh>f5nz_kbliW5<DgyP}zUkM!-^yEB@x^T4j%(e$Sd?T%&-c}7l+ zdrtYHIZyZR+I<M$+#M}AeB{vHCwCv&bLha+kMD_Q9e(P--hI0dMe}z)efY?M{R6xA zA9!MK)D?I5Ckh`3G#u~)dVyN9lV%a=In4PK%^MG%9O&A}m+VDzXpV|#-jF8{91uHs zQJ3gNp=bto9(D1Q_8JMidCPi~sKXa^1fwooT8e%*9*E{ci|m1BN0gok1*A_628g?3 z8O$08Pf3SS*@;q{HME*o|33z&j;*O8CBG`1*Em~Rd84BFdPQrbqV+qgueUuKX?yfq zMc*5Fvt<=;<jhu7zLEE{8uxV7w;C=tTx;rzY&!JAn!|6nW^3x+aNVeDpHm)n<n%e- z-1o*~7k16M%BLD5u2r)|Ra&;v*zpTzW@F(`%4#kgoN~;Tmc70C;^wKB-<iBL`BCZW z*|PGt_gvgF^@Vp{x%5h;Y~_`Wf3)qrZSQaV!M5*ji?r|gsB90On5y{NlUj~aTyml7 zVuqHE(%v|5Q^6mtP${Upp5GkFZ~o@`E3WISdLyfPudUjCt>uv)=0ExqSHo;$^E<C! zdL7&AQ=M1K-+%cBli#1z(iL~-oRa1)xtM<|TX93j^!3n%{2Q+FufF=`tG_#Zy<tP7 zVZ%qR4YRe&rl0xN^Ov8W-gh<aYVXyK4>H2lyT6t>TU_~e?Zw(}7F>7tMBF_e75AXv zSO5Ig+1jqFE56tM-S+Qwe77Uq)%QWk2m3zQ9zOVVxcZrxx4I(ku8)elzU!keyg1!| zwfX9cSNlI$7Os9g=DE!g_vVj^H_z6typlit+SOy>>YXw9J0tF$9~JMMt?lO86@;t% zWAeKr?(UC@yJu?~rb1IAS9XP~yJGU!N8IZ_Dqf#7-*~@idi8X}m2=_hO&6`L*V_S` zp|>CT+9R`#)cnrxc80rle9-*Ciy!od4-JItk6(Q3Mx$uvig5jwi;r2lZ&Sp*>7(LJ z)(XUYU~9y^^`qjgN%J>E+#5bB#z3v-4qO?oej?_5eRyVTJFjM5U;9{O?PKB2$3IX% zT>W7~_}LTT>cNYdH>#Ik$kcM-=<7#C6|-fH(|K1smt9vkes9}%w|%fNvTpB(2P576 z;j#nQ%btmpJ@ccgW!I}ZB2^u8>1pK^bLknyC3v~C`evT9xcX*#Rzcw#d$kg!w&|TU zm)2Za5vf@#ii*@c`jscOzBFDY+GA--PRVaQGxg+^ysMt~T;Ww)!gW2@>-r*feSf|B z`i|!!JD$5%cl28M^O5Z5-^jV)stRXU{o~xuG)#FuS3OhJ*KnXEJBAD!I?(5V5!luP zcsc%;bc2cBj{8Z$kX<B_SdSkzn$kTJz$-gp<w8alAUk`G?BBNr+X}FOpqmyGwlDZH z3sXHU^yz#>rLnhRQI9_jYYyH^!rhHzG;t0ZciN4D3Sag6UZzarHL)dPxX>^(;AUl@ zwx{Y@tv=}e0DM!SWN`=NsOmq(&Np-&2QsjyCEH`E+Or;Y1UoaarWYa7hzt<c51E@O zcFsq-)^&8P&9z|Z!-7bgJ>$Wy%m}W@G`>x{4pe<h9qdZ(UfZ$GTJTOjz$(amV(EeL zu`#CT^Ow5WTIvpi4_a86w)-6BK2nccCrp+>Og?~?x;_S;j+nXk(p4gGV(Z~iiv1cU zsD+V?<`_d`IxsPk{wtz^t#|`85E~6;*Igi4jnf(5%DJ3#W&QQ`?UDBF*V-Tb&>40$ zUUT(_v-`!igLP5eza{t9XKu-v+mXCi&sV>SiEUgRVw}9!XTol_rs)9t2i-nUi~BTo z4OLu#de$=hON&qlBM){F9#OwQD~?3Dgk|S4*4O~+i6<&03mTX4-!5<oX7Cc+AI{$Y zAeZ3fyS@Zhnmft*=9XoiFNzN8ubcLRGQk$38dzN?jZ9LPNFtaQOaCV!wD*T3%Hd<y zMgq2Dsq+Vtt$2*rr6i5-g1o6a?AB<$UMMpzrv0Kd^?S5B+iVDA{^k5D-s>HEBOQCM zbvzk9{2VXOqv7nM4{~|_@vr9c?0|hNY+jbgXAnvgx8#r?Iv!T8(M2y<osgchTcjn{ z<*3tA<5YEGUU;Dk_E}!A&xNy};{_Yd(k<ML`_i%K&Ar@DprigLRS+m~e>v;g|9Oz| z`DbUXXvrlFVBF7=OYTPFewJL?OOE?la#5%FpC#8ubAB>&mvXFMQNB_YH1<f}s5<HJ zru}+$C~a55E@;5<R@IwTXW+dd{+DVG)o!oUo9;FDqpdp+nb@0fek1MMx<v6M2Xy*! z$D9=Calh2Nqq3CAEN|vywl`}sC)g+pz>ay7jGKQA@je?n<~hcWc`kO$u|JL-^NeGU zT6e=kdHRky^1fR5Rae}Oc_DUn3+;ACu`AweepSZw9dr9P3hj1OY2U=YETk@z<(hx# zd40#cFqE(Fm=}gz`i^-K_RL+OyfZ7!H)JeGVj=%RMQ7S&-25whPWHL{iyiYKwF~Pc z_be@E%ig!w*!%txT_L^3EKA04^IQ>j)NT7Jl<}SXZ|e%0$>NcMV5jA+jPDc}V^@s# zZFVv(E2CS!Y5wIkz0+9TWcRS%%$2dpl93gb@7g{S%1HgC?-WXV<;fDSD^!g6Ulb}q zSd6{7Qta8kJ8%7y?Q6E<O`E++?AeR&l-TE=>5=U-|61yEY~K1L+mEcko_(3or)i;r z5l5(avJAB;<5m|~zS1`DS8Vn*dDOD8drZApirrJ{Kj*w9J!-a7#`KcXxukS1$uV+c z-ja66_szdtQj@pLGEZ=yqGe9lyd!4>T2ZEd`}gMk_Ac|AGREJ2F6ozT-muKZa(t0Y z@#B7KF?QW;b5L8_iLV%`2$i4N8}}MOZ>7WuYPz=^&!u^*CM!Y}Uspoqc(+_{>6&?4 zYD3BN@v7$Ws@6+_RnR;u--cpxNm<?+E{S&XOGkb-Z#gz}SudxS%c<pZKA5+h)Vu-k zXZ-JE8tBh%Z=JXP%#-nXpbW)l_9v#sV``!alcn?4&F1Ue#-~H27`@tWq@kw{%v*{L zf5WA$wan7|GvG<$e=%#urWDJ}t@Ji<uQ!G&Q8UJ)BWb`irJ-!gSF%Dm-dwhEu%|Ch zwsGJmU_Ed!zCMbwFx~@n%AiG|QtE5ABcQq2oLFXvzlyvhw0kn=LdIJ=!4uiGgzX&e zN=@}TW*fE+uE|2Sbx@asGmF_`p-qr=_&-Nz|DQRe``BZ!ewcK?&M~o(%A094=D+QD z+u=~&D$h{PEB`$GoI`yIMYlS5cf2({n%1$Fw|}E~EaRUa;IjzyHMjeVyqEiFPVXt- z2uuvr?GtTMou+TL({172(Q_jf%Lw`Ge<qQj2Ic&c-D!SQvG?l93opO@>cv;5&;DIy zSEOR^KL%(ae!05N5p@iF>TpkV$14_bSXJ&A@ZpjD`sdub)Zp$?v7L3Nb|LB>Dq}AN zPav?U@zs5RCtBxkv~CWPiP2E^Q$ci|QthW0SvE{;?&l5l#kUWK91QCbm2S_$$nl>v z{-eH*q)#0$Or#xK^{JzE!gXv_j15WD(e|n1_(b~g<HtXB<bLXSaUuiJ+-TYWI{dYX zv{2|%$M%V|T>Ni(VWLQXn~gNc1f{i=?I+adsUb%xptEG^2?{(EkSp<Mx@Y9P@FMvN z+8Tw^yRjk9pik`t6lc+)(rpClQxuR14jXf*2MKH^@DLT}ikn+1p($a^afF_Hnu2F2 zc$NaP+fbjQ*b5Yp39WjJf|n>5KoHHv*%_ECkboS`ID@0sNEsXQ2ch2g1ypixtojhN zR@)j{P<M;kvTw_iRAPag_-qiNo~B3q6p&PEnp3FEj1N)TFa;wNaQ#OqmO<T>K{g)I zOjz8U^uHo1LxUP1F-)q~;{QG>j4Zy2=S&TET(|x2wEil=y8jZpOeIQw=>^YMdVf|_ zf4yj3q-fobD6%S2w2C8bk)k$^ERPf|=SX{`sGTD#BSkB<f-HC8CrWO?3CD%JTSZD) z<+X~vA7uZqV(;IT?wze&alN)ZQrmvLwkuNGb**;Y_1dkG+O6;J{Gjw&?d}V^epIvU zO2+id;WY!{<;Snpc*12Kt(?lzs^+u*sH%CRU;*|Y#~x1mkJ6f{gJ0W<=7*OLT&p=A zE<1jsvH5yqcchVS1Dh>tnXPG@#cut!OWS7aTC_aHjZ42W*)*gGW+GRD??3y)#@)8o zAt>7Owcgnp_d9Ku+Ai+Am8sOW%~mzMlY1%m%Hw}sf4%RyNZ)g}($i`yF6`7YmAd+= z7pMBKG+#M<W%t$MaP_(vQ;ax6k~)62^ZgY+X#alu4?4cz5#F-*L%j54%uA*nN#lwu zO}`Vm7`$3{A!D|-ZtBR?W7EykN2VXU(iE;<9rKc5)FHl+kZ%};B+1v`zfoKFy8~B_ zT;22+`>*%*M|%6O)gK7gJr#cHV7U5F%m?*a{;YDvbnxo4|9Z{!Ctip=@xl))Uqn@< z<w*1N#&11x`H^t*x~tvc`i(FWDX)He;Nrmaksp?~&DJ-=hNOPkg~w*=nx{5T@0#9t zr8Hc<Cgv-KDM|g*(9}y;y2I5SG5LlmiP@|eQxU_I#C+e(ufN{3CDOFzFScFZ`ch=; zOJVmwq<CPqx^8Oxory~mS70yI7isIe*0%Fn<E}{ct_zveu&o!jesj(B=G~Fz-5-_i zo^`L7dSzOjIu>I9qYpdgP7CH^&GoXjNLd>u;*Z>GgmKZWtc;eD3oh80)HP7U!tGn% zKM>x!@54SA`&g`3YJODIxLE5IOv?IYw{n~?VaX>GmV!(&VabLG%YLmanF-6QX}r?4 zN7Lbl<aZlq^DC$FrahNj;i}efe%tl@u1J2@pRB&#y(iMW=UV>W*|OSO&h(nxn@W04 z?i&SYM^Sw^yAH-IWX8qDEPtKX*YNbZ2W8Ci0oW{yF^lAG?$DqmS5k{{oJKp9cskTL zOWN@iIg;29^3$=u@6eOG4m{g$b%e60T|nAiHMaomw~J)^j0)<8ICp*fPZDQ~RZQYB z>mC@Na#!>mH;e&Nb`AM{!LeQ6DbL_}9AozSR+C{6j-$iy=)`%WQPlf}OBh%k;7se_ z*>fJ%ivxVaWAN2-!VlKte24oeER6K?-7r8kuLOWek8Hre%iYK2Y47>>2V?IK3B{O` zj*Jcrd%Fg7cG}W03)yRQhfK@kfutqfHKQ9jPb@7yWaELQ$M?!$&+%vIh&_8@fj^fx zH!K)V;VuBDsM(kULq;ZIXW`379UVV)8lW(Qiao_iLuj_xjWHDVum<~XshP3sNz7OZ zgP;O7K#&7FQ7&bQnB+0Y57IEGhYf>TB8ID$;PuWOk<K00I(L1zJM3z?<~kJ4K9soa zNkTh`Z>HZRaGCMH+q1><rhO;<+q&`u)_577FxvcZA+UjGx_@PHnB7vnP0K#H#N5wx zTjsLe2Y$s3{A5R%CS#AW#13BqEO)c;_ckr<U&9)*s0N}%F)J6C+PuIZKIf~ntm){P zVegl0S-<ciuk2&t>|=>5`~I2y{p|C}n3$8`z8OA9f?%P@pIKH#m<b$@;e>QoHS;5x zCFbP;FfY0Vh%J6Ajm2WZoU+!IZ4m>1#lpPwreI!nF^W4F&OVrk;_fH&@(-U|=H=nQ zb9UUu5<5e(hxpyjd4)uF<_NPh>hBN>W4q2PV%Pc0-MY1x;ljf{|HB3HG`qsjzrYLr z#c=kEi3|Sz@ic#bPk5R{J8HOSyMJnz7~4NOT_h81H82KcmeT~fg?nRw{aI#fq;;cg z11VvQp0h(*5RpDB+>4wZ3$PWHbHu{BeO9zE??TkFw>>Y4A6!#ti_iH9A-Fanv~9Ms zGvsA++4b)Ik?#H1x(|e(O(nA3Pku(bC;ZIaL2!4XmWi3O4>yjp!wyR<jbv!t7PqeE z5zLt3m4Geza+@eg7Acf9g1ezZQVCj`()eXfiW)<TvB~`ZXxWpgYK*RCHoxer``+9) zwd{J$hDgnZYc-qRAOFyU)BHutaGIa4c}>g7eURKu7SytLUlV(G7XNK4WaVsNYPI;4 ze;?1UNM7Nyq{cCL8d^;HB{((<Lf7j2>TN^C%q|Jchj@%mdw6*vU8!S>4l5D{Sm<>O zVb4Clrp)ApVpKcvyih7p?|$+^X%Dfm_W*gJ2a6GxxFZvLuv753D@E)SJ`yi2N??=R zkyZC&iw>$2mb;<;X_A`Wq>uCvQdkJ56#Vd@9jDa#O#eOk2?OUWy=?Vs;N@D=9%IjM zt?7@kWwij_R!@<jc$xw~1;0rFSyHP*6#Nzi|BQkh3J8Cx)L!*01+>SmlIu5>4(h4o z7gQ~w01PCoekmaTqiO{ObnZ_jcUdYr4T?AlR0`+_m`Z29RJi4XnJEP%bgFI&=m>_| zPQe}uc2n>e1<e#ZP63?&QOQ<RC9kF`xi44A>RPR%pq_#!D4=s+DjnWZJ1A(PAdiAv z3YJj-V{t{LlY43x1<NUTgn|hQewzXx1#EFkwyWwCfp1ZeO+gK%(NQS1j{@59RGTSn z0|hMvK1wk!#r9IHpMrxF>_A%7d2(pf6I2KIAqq}YaF&8m3g|GBN>^5>J1G{T*soFW zUsLcE3NBFaTNJ!a!88R|DEK1^w$W=ppx9qh@UJNNUl2qyM^Bvb4F=VJpp^fOg8xXt z|4jki(5C(;3jUFT|Ca&>2^&rdvMDH}pooHU3aTimqrgo8U2o5qb*pU@qsv&;P72mj zKsR`)TPWB{K|2+{j{<fq!$;`Z*-U_P$0>M)0`i2UK1%Ij%abVrzfQq7D0qj0-=pB0 z6#M}Nbj^->iQf1f1iY868xsEpB~tJyWxR$#|K+bMH!}|8IkPoy#dD70%rEZMUQ1J! zx6ZCzKf8MEY(w+x=HA&ycg;2}pIzBL+t@POxo#G@0P(M_V|K$9iXa8Kh_rXku3Am6 z;N3M{v)vo%dBi)qXSemyV?EpHEj)uKTi4K6Q0Ats6gIDzef-JU6>YOywo$Q%o|%36 zD7}Re@EA(NEBLqd5qbdW2>0xp-S-s5@d^Ax1yE-1qf`O>6CXtcbz8rgzAGAq5Lp0` z)v|JS-6jGz_D~#ID6@6V&GED+)15sUMxd?Zlk*JRD67<*oSLb)O1?Vu=8%@fV7B5a z)p9tRtCZDE?Yg*K%VRKKsco6w5~*3E6);>#**o9acWGawv{iF)T9M+aybySESSx0* zL@BL>{po>7?fOW`2CbA6VJX=%z4^+4NK0>|W}8;di4{sw)s*wi*R@IptN6u8$ug~) z;TkG8_~wXK%U~TnojqM0scMh7R%`W~*r1fuOs$L*H*1XyyJeA03^q%!g~4S?dHvK; zIMCCUGrU67YS-oMk(zF8C8w>T5?e0TYpo2n86Rk8c(qZ<H4MWml4wIGgKMe8^_M!d zE(W`m>Za+^O9k3G2G<i<b)_}Zv_4X`LEFHI8<o0c)4MKh*ETV@S*c$>edJQVwuQkS zrMd0OvdazHRt9^O#+B2-OC#Dg2Dj70hcE5d9$^qT3)z87!&;w%6LvW8#W2irt9rDZ zB59YyXwhzw@|XjqgqLrO)NRrp7fE{@)Q)wR)@XZ0!V^>wx8zBYfOU^*@4U24+b<G; zATc%eMoL#`2Sf^v?^L;`^COjOw1Xn$kV6jXVUcjep;R`88`niD)@x6Tq-Tt0o)rnt zafO#%Y|xI1gy$W~ven_$J0mT-v=>Cuiw>otVaj{)CGD6<cuBNrL!@q_HXxFYbDMai zJtF0VLuu;{clSqH4`_oT$?H&7uMe+37->JG`9#u5>eTScEs=&E?UYCYve$>fFB0Iq z-M#8c#--P^vm#-L8a6c%sc6%NMal?&o~FjANEkDE@CzbAbtnxh!YejK>Njfvkpv1t zL&MD&7fCN$s&h^x;V_Hw)OnFK;ZT;Z39s1|S+-kyRV0B1t?UeU?uo3}t4)fe*DPhd zE|P%C_379r5D3sZy7o+@yj9yNQebYR&-vXV0VkWV<a;6|E40T&3eG7}jW$Q>wrG1r z5)LfYwuD>OLn);_DUxtz$w=BSl5h|S{q}04qFp;6Ql3gPyZ@j_!r>d5)x3rdizJ-4 zL7nm<u4UTOA_eDeFk>4dRbAS%BIP+wDZk{>j*0{v7DCfTBIRqe7eorq<me0Pm`Hdj zO=)VqQhK>S8xRRNN7Mjcn3rDCJR;#lno`p|z3fthHYgHsN(WDjMCvzaK9PchID|DX zZqrVQ1f0TYX}_}ma);&@2{?=c%ycYL)~=luDL9IQ75GS`W}P-HQg9>(`0$lTp<5dj zDPv~+zaUb;E*irg5J~X7jQX`)s@F`4fNwn)DO>S#K^C;<GnLFjEiKJiH&yzHf<JTV zG6AkhDJ#?2cwy%!3jXL>h`}i;WfeQiE}WhUTpa#HK~&F14A=Q(7JriVe3~<NYO|)$ z-z%%GZg{U##6LKCi__?ZVvQfuUdiAR4?3J}H*yMRvx{f53ud!jv)TEx*+m>8jz}58 z3)PYA+S%-KnT!Xk`Ef+Vd->YR(wxGZ>E*eZpE#*Zy>1lMFapmy1|2uktDI%Cz*1$G z3N?=J-v6O@<|U5b$SJ<i8Odp$bK)Uwqtd<clk_JX&aT<=DosQ%HCis$3jj5KBXD8Q z)YH@3u40~Vh}3V4lx+&THbrta&pGKm4YSL=jCcsp@{K!Y+c(`Tc-G;}z2T~yN`G@w za}t2#2AGqB7msOK3}(|TE}sru**X2nWuDDBoSv(!=(ys&{F0W(V7|o0Tp~Qa=2pzP zI46{*Y})C#nYYrp?gl8^hUv2DP`GKGPMw`d#wRgh2QT511ZA6xGKXOEO9bUBxvn?H zFC3m~x$xYZuTQ(eE_Bh_xdO@qre3}IW>$&Q<G4{=aUn3Z^TI0^8#N~-;3GP{;Cy@~ zx8y?0oAq-!oZF!+@0#u0N_-4>nzoJToY_a7q&OI+&UN4jsBh{N;&XNo!-Jev>t|ax z(1R3N^T`@|<VImJSRB!hnB|8r?gxuQAYAMU!kNQhu7PIq7{<{KE7MZIiG^}yyBI8z zEhuKNgz?hWNJB4p9Qp+DI68tW=Y$IRLM4M$vI?>>dau`WZi5`qMh4vyLo_kiO!bQ! zyB5w_MlBh?I0}}ADzSoSuJhvS;ARM1MNL?KsS(@^fo<~Pb_Q1y)*(!wap%FsV{YkO zCuafAtz`z(b~q}ZqS9(o4M#gY!o$JOX3EBAF_>-ie-6X&4r}fIJWkA){a?Ufq3li< zgGFZl7jps}%F6yP<%BZ%LOFvKvI?^HdjHpQZk_D^dIlS0|2Hz|w(0*S&S{oi+QQ&6 z+5gKKTp{~^C4;Nv!>tUq8U4?_rLCs^U&C3T2&wvi-~9bgk8uC<vu6J@Xz723<NKcz z&HiW5?0*KW{m%*3{^ta<{~0v<pTQc5b!r(j`=3Fx{~5IHf6g)cpFy+#88rK!L9_oE zwDdp2qW?JxvcA;+#Gy2Dcii{>2hW857lgo|0s^g8>1Zc`1d#Z=Y%PR+offz%XY-50 zB?FQC<2Tc3?^95QT!{xH>eu-<iS%_kC6T^?R3zHh^Ci;P>58nIj#LDWuaQWlmXT_m z4Hl8uU&rDS`|DU-Vt*ZrCqelVi%XnuNU($@c#;z#lsF%Jr74LUh~M?bYmuA=6Z=D% zA?Pvps6G<VZOFj@5!UJt&<EW5c;JnMA^D_>9=YKvyKr<mFI>)&yOZC_lyY_!gC>1u z&_bUX&L>PsjVNHSkeFk$5iU+FlH{V8!4ir6OBpPa5@I=n6(+H$<b*2ucr}AHa+1_C zSSQJWY_dMgO`O{-hq;BpWi-s|F0Rp*Gq}QL)K_wjiH;a-leD9q!PSy>tYNT2(vD6B z*BZ2gyIAWc+Odwaz}!MN1Z5C(Qdkm+!w4Od97e6_Fpc4|RAab-9uZ@h6)s<iOA9n7 zzm-WXW4SMj;cO}A<S>Y1tX0g}<}sKrN4$W+LfOME28#@ipqSwjIpU=Z#w(CGu|ke` zC4=S=GFW3MBx)J1Gl#sM6B^`@H!|p!6_Q<|kMVNOT_MMKC4;Nv7`HOmW;4d^oU>XE z+ZqNt<QR7{xK@sF7lYmM;dKnIH^!KU05S;1coSzq_Oq@~s1l*$6zI}Ax^lV-zB$DT zEvcN!neGW!t%;O$Xm@3Wwsu`Dd#_NFYcpoS$`z_(Ub#Yb%qmx?)F;UWYG7iyMD^$8 z64f!WZ1cmvM6o_05DKa#R;e+Fz_gZeBxJjs#kp0f7U~vy<VI=LRQ2?e;p)yv=~_dm zG!`nCk}X%J6ef$Sr%Ept7{a7ZK%_9K<6a?965q!v$YL(4#8|hb49722PBa%PgXThI zutuWhS_bQkbz9GHgSl=SIl(R0Z4-mdvO+BkE|aKQc9=d7S~<5(F5`9vS)EI$dJTge zHp{q^bJoh0*~MVDT*m7dTrZdL1_n3Ehc_{}*;vLrKw1wi<E@+p^}Jv+#nQ!uFc5S3 zZbHmSnVnBoQa;Jq=cil4mF<z@)tZxEF<E^EEv!Dnxe{sSF=%QI7%Y@C!^L2c+4seq zU{X~E%Vgin+UlKM&ABG~!=Nqu!#NGI!x|ZM%ie8buvzwQ3xlS_%is#5cezI(@}hTJ zISX1r5JH0lisc4=23s-77aA#OTGwdp$Ef=|QZ2Vf=#e<O$ZuKbBE#8|^5rmSGN26R z8!M=QVRHx=EK>BvS<IkG7a1%gg(Ynllru<djfF9)<isjD;?)e+$mLVZV4Ylj^$a!` ztFMt^w>blvIH6g--ooHAIRln6xI(VJl?<+;>68<3HEXR5w^3C{87aG0pD&%9yH+mF zE(W_Lja|p!dYi?$fpg6D#^7c-eYP;zBd5<+27BdP+s5E_WBTxLYS=@;{ONOW=B{*_ zK)}%gJ15dtsme(~Uzx+cQC2<GI{iYpW^JUb%g|66NSURBY&p<UMWy3eDW*upxRg_L z;wj}6oft|fMG{XbrWnNYZs?|T{#HsS0PnMI%DSwr0*Zk>YxmRgZAi6zJL!?Q<;!nb zmM_ER@@3Fmz6@HHFT;g2p-5D5F-REHvLcH)u|%%OQU*;$34>PIgcD49$)G8lFxVg! zDUA%e<sxcgkTr)y;aV7E*(7eTmUGSuxh_^RxJoXfRt9<Dk|MF4L6fUxu)|nH+^O1H zT0>o&1w{%FD*lNjgiUU2hXW;JqdHEymwcO8OW5*GCQXtW`(mfTrDCS<zW9i?Ksi!w zW=TO32*`J7z+h8#&POt+`sR;hQ1vAz8B~4A-7EfdGwp>xAQ=++7cp!?hQw%y@dHze ze^AQD4W5*l#Nc6k69-R-k#g`@ipeBm!-L15$(AyhE6JvmAE6XUzc{HaP=3@Yjg%jC zu$+rFRr3s*6p}%cLNa)l1xJ1J^Z^Nu*ha))E?Y(V0WqW);kdz!rD~W5iGwMq8Wt0F z{tSAiBR;v~g0ZDd&jpe*T~{E<nZDE{In$TgJ)vfpl59fqfXEpzB+Q9ms03pp7!qM< z#JHf}AsYZ;Lb%_x#~h<ITW0%q>-%DBm`z!$lexrU5-e&-x#r{tS?RWXIvv&?VfV&J z&8A54W-W`eSWF0B9ML3?svGs>ac;geLy;^h#)B+;G#6(V(K;rpA<3iatV=29mKhAL zWK#7lPRX9?SXQ#95=Be?6w~VI>2+7q|0w^xeA-~E-w-L=s7ZDepL*r0E3)#@NJF0{ zc~*V)B;i;MUP$t+Iu|N=Ry1zUm4V2zZIRmT2IH#FK*6}KmRzqK0KEjsxaym;4~%i$ zk*>>?iHo~*Cvip<NvF(m%D;j3keQK_AI>xeFpFUmPcvvrlnj~@C4;1^)we}moM7&w zGD!QV{4H5Ay(=p@w@Pv|)eP3y$N;sRQzzM%dIlRL`_jmuTgm`U44Rup46<Dq?}KvV zv55-yWhH09{A4wjNE^B=SHX6(b;r3BsW*yBH7Dho``hAKU7w#vP`<280YSX2OstfP zAl7@*{%tWqEZuQUsBmm4=N8VDQw#=8KnB1Baj3eK1>F>*N%=Rb>yqmR!i^gu6&tl2 zF32282F;;l&^nZyU=AgN=1?+NAsN$32F;;l&~_*}#~exq&7ow_97+bwp=8i9lnjfZ z<S5K91or~U2P6yh3MCsNz_5gB*AocLi#~=aB~WSC1~T(Z?DDPSw1BoJT|oOC^uP^Q ziRR=dVbM{oWpNaeM7fs3QS7)@Xn7pXC&8})E^f5~h6|;wor^)<*C3g>n86alwM17- z87!0HMmd8O(tM<n!75r6M53!1WR*DK=~@QsNR%hj!+HiAsHh_s`?W>}-O{G5iNR*6 zCum{Nl=~SZ=|P`KD>*^P57UEJHcp?#4ZD%bby_QDv?;6BUd_1tn%2(XYBI1YyIiQP zVX#BCy_3PUREO-VrSBC)8aHZPoYpOcr*#ajm->he3~n^h%_dIREc3T8*dx)697Y}8 zJi@t<{&m#d$D^phf-+IM-6`^5N~y2%-68>&l={Bi<01iel%Pbk*7u48*iq`QJSh@j zM~P176))zE2180<p93O0$atLAJe$E3bYtcf#p9uBq{bNB&{L)skf3bYXE_AHPpYup z%p)kD`Z)a(_-cYod_+)*Y)~mdWwJHp1XakUR1#EWw1cVx+YmIOmSQk`#J+<N(gkB9 znu8SvJ01vwFz>0|h6kmv9%t9nj=Y%G(X;06Awk)44df7%8!K_=QChwn^#Xzlspf2C z=pxYEI3&o_a1vxS>LIv7>bEKhGEI62s*xS3H%FgYjg)6f<ph~Xiy+fxfgsalfgp2> zkRXe}0)ensD4$zHF_>W5bTXSs8J%3O@8k;+Es<C3r2HEdwNpE%OQ-gLB02emOa=CC zSsXPLAq?iqZqH+oZN<$^*#b^9clj8!?D8>eDnb}E6(I~-6(O8ZC40Y`K~oXJV4duL z*;0J~nmE_oq-D@n5yCm9B7{Lx5yGIU2w~7vgfM7PgfI+6NcmhBM`0Ig3=xgVRwCsX z1q=sisIdr`;gG8!aeUTLKHKo~gPBmRhO1UZT&<eq%5>#L4(FSr!(jaAaAKkCPsy3- ztXMJUnuEijbt!NHBLH4Tl2_9!AbB;tG}$n@9{6Q*K`>}*;Kn(ox}QPQz>PuEz>PuE zz>PtRfg8hQ;C8E%qhRb{atP{<j(+4xtzZ*YQIP`6%vkg@SBnfbqoN0}7IdRRf=FbN z+!Mj^MpTqWh$p;~tpxQ?=$605l*^lE#Qc>KR3?#aIYGQ<Mx>*XASUGWWHmuG2C}8< z!7dU;ndhgLz43Y^r}0)jCBaM_vklD?h!^{Z1sjo^NIQ^v1MCN#cyQ7a#Ov#g$|Bgr ztpvs6R!Ym4lSu!9PT-0u&!is&ne>AolYS6np&tZ-eps4ROG#)_&-R;HYY|Ok#gY0G zSFPrxTx%1=(|VQi2r`**f=p(dAd~nJWMRe$1T$`_QaL5zAONc5T!UzKJXJ16>Wzv9 zy)X4=^or!r8@Y10^9W*NI~wi+f|x?laJvX9GKQN9MZK&QDWxPFWdIM0e;9E?zq)$u z&El=dEF=9w+_Y{)#to^9qlZjY96{EpO>i!;@}wutBgnMmAgEB9$h!zCA~una3+Uel z`^1XOa>_NwoS-V%1Jwl8NbaJRAX5k+h*?wSlBnXKrq&*4q9mMUcsPav=S3Kw-^^=A zwF={=#aty)Zxol^bW$#Gc<Ie7im^zY@#bqca|klG7zi>a13^Wy(~1dV98J@vlpxl$ z(6lKhsKS^w^ilM-wbQC83DYK4rkyKZ&ehYL_{+0^ZHsdVGUqEn=6of{tRg{{`AQ(o zS9phx<Se^YN-$3S#D4V?S3Qzx+49%22+Eet%pr*7Qfg)%LA>Qc%`6~@H(Ypba4|)Y znQs+S26%Ux5-Sl+T%Aa@tWNQaT%81&ttH58EkR~$39_`7K(w~-Rw>1Blxc0Rmg4(Z zQ><j6hgttdZGzGLUHLk!@#A}$I^XPNg3Mkf$n0f;%w8tQ(#r&jUZxlhbwSD0(S0*( z8K8K~JXea;8-+Lx@aFJMCq2P}37t{XpO?6q@=V-JkcpcKGI29O7TioADN1gYQw-IK zZ?+rBX0r)0n@y0}Y=X>Y6J%*Nfuh+IgCw`~9bLH1TSUJ>;4LTy$9pr6Mk^6LA{BHA zhPxM5UD_TgX?w5#{XHKX{{H?C*M&>^Bl!nl$y=H$W>PNcP0B77YI;%nOmb1dCYB_~ z#F7M=Sdt(MmLw2ZvhY?l#cXC$3zE&5M36a?2r_39LFP;%$TE`%6f+62n@>0@oSUY% zX$t;aJ$#G)++17X?76~8J@0c;&)nKd=Y9wD(nqegymvIRY?G!?!UyX=EC@gQe0b0E zk)1Ex;v{XovU=@YdbRU8$1K=YFV1oLBju|!PPvg&@W$}e;c%fllGAj{Ne{uS5J#|J zaa)HQjOOy5aX71i8O6p90cde)<%P-V!Ej|O2IOWICxT#=-OS-A#-U8(_t0ehSWf}v z=!d)bAs8&uaj^>67Ea;zAo{Bx$f78Aj74t0W4e@b`_0^bGxvGN)F9<PZ{|L4<{ouS z@1)$LX6{kW)mzuHj2c+5E6rJNG?0LV26CckAV;wg*>p3HqtMlrX<P&bRBx+`a`d+H zL;J)*wmMkJP6g%^`m48<qFS%s)|VX9EmYr^WG+SZo~U;oa!endQ|Pb$E=8es6#aC} zaV4GJJtlK0s=r%{VyI;LtG`Q8*qzb4RnA;07=QFU#4u$js~%-gvGmvYD2f#y#dBBI znJ?a=lGu|NAINY0hVV+kZYbCx#cH?)h`I(xhlb#<z&|<?=<u8vWN#GFjMKs4Ar+p$ z;LiZp_`waS>ZFtX?71R~V&tYFT4>yNGB9`=?iR?qMYJk5kuEJcg*!4vyzC$%3UAQ3 z`9$>$cknwWMn`dx2KkS$mge>2);IE55v?{KKj|Oxp^hW|VcdN(I>LS~qU8zs<6i$L zyVHnP#^>=h9`MaTPBg6b6eW8{2giruwu#+vBxVnd4vOy<+tzFB^k{H2;GgiZ?~cT8 z2ZH{=vp$ubdL-8RW#7oSk6n7$<oUh6QT79p*c&fX-pFXs$KF9~-W{c$B=;fFGD~la zs^i1K(J}v^@b$r7KiJm?d;O@x<LvOm`pzlOFnXUt_D~XanZ=#*p9}`r-$!)0nd%>* zTk$%?pR>O6Cq{8~4Y@ZPA7h^+(K_>4Jb4!P*1hcaof{qFxyXJ+qASfu@b!S_l+QCB z#DzISzMwDYM^!NGMo#&>?8d~}=lav^gzLOY4nwRHZ_MNO4*R@*54$UgHkn@$IsBzD z6<sIGCl@BsM(c9{T==2}JH|XB;`QKWKytcb9iuVNd74n@gO_<6$VW@;*F-*U?4yfi zy!!L(KPB2?{hD|#Fg`elZa6tUB%dUQFV=-KhSkh&Ut&I^j=tg_##KR{A)gw=wKb<s z`BZco`-3Sa2O;EOh3=t{D>HD~Ll3a47xMCA9qmAHR6WlQV61CIzN>pbp$ojNvuAw7 z|AlcMO%!$sW34i-EK=DUj<tWsgZ?3`b@ddl$T3_mML1|3N>$fWuz||AU>fl}20=^< zx?x-0M9)|znf{FLq-T66_%hx0BV5dEu`NsbZ&Q1ytgZBn1)qqr=n9~bQvtP?axIuh z<nsNe!ch#nn_&+)k5XxU6zrgYyw4=I1D8CFaKXDM+k!E9xihNWO>eUYA9mhDUVW_n zea?5nGd9MPlKlEuyWyPb5BfYjkvu~~qvtTr<ku%!B8RZUxV%bzlD@K!g8lS}IYUnS zhQ@qqK&2Zsqs7LXM#T?MdbUhgpQ0iTQgDcZ!xS8$;Ask;q2O5xo}=I>1<zCP0tGKp zaEyYNC>WsNI0YUGPEf#ZfY=MtKP8Zz(2P)Ql!7q?pJw;sqOI{E-*)xKa9)EsuLRa1 z)Y2Ue$IVrWW3S_<O2xlbaz0j;eXLaeSn0i{^!|IL@ndD($4bY?6zTj}S^2Tj{;{%# z{{ciCDfmZOzevk+r2Rrc@be<Yv4YEa>|<r?$I8Kvl`ei|_s7a+j%@o_>Ekky(*9#* z{l`iZe+cC?{#ZE?QBM3=Irw8`C&G`FwZBNqrjildq~PZzilglpX--GloPyxz`HEvT zzVl<{iHP#V#|q->ev)4Fi?lLl<}Z}Q;3lQr>d0`cxUl7xf<Lzkk2oApI;LK`rEuid hNLr(#GF;PrOTph;yBtUNI~=*;!WBPPIL4j&{{w5y(jNc- diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_messageautodeletetimerchanged.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_messageautodeletetimerchanged.cpython-312.pyc deleted file mode 100644 index 350c3268b085d111bfa8469583b268c30c10e81f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2624 zcmd5--D@316rbJuwRdxK6F*|pNbOQFcw@7-O{J}uBGyL4LeoMc=t7-rcIGCV?#Fd@ zZerp^@(?f;i%(J?MEYn+AL^5Tgf9seDvQ#BiufY8O$wz?o|)ZES~0~(hkIwwo;h=7 z&hPxr*&lj)bp+$DZ$6$SApI&{vQbEd%{dURAc8DJ6ry^HrNT4k<@~&r_X}1*5&FDW z^h;Jr$^}pJ%T`&+MNjv8tR5+syo%pz_4-w-svs4;jfl2_NST(_a>-d%-=bR6m+<7Q z8yS8`+8#BWFyOWuM1~z0;q)AJxWQ*_ZZO(nG@=2A6~mdegBfbL0jyDDl6rK8*}mb^ zD6&Csw|S@&&~i5nO#M%B+C)u_wX-duvAwwPZU90}iL2S>v+^v^RCtKF>r>dzZFqlX zhVmT+p0~X=6~0cNKRYq*Iy}}V!TKC!Zb+OYu4FEzFPkk8J_SfAvJ`+7;Iwi?weloK z@?R^YKntWui?p;C?3(#i)Ko}mrD|!kOf;&~9$J|jN_{=@XsXg)CFPa;TB^6ItLP)e z>N}5Wdc5yU0>?=}V_bki#YNdEi5;>3P!W>Arzk%La75X>>(CuUr^7aX40wU@sKl5W z0xo7mlyf(jiA-HLU?hM>M%aWTL4F<2jv#kTq}XrS%$|m9iwsicODp<e+xA?(Xd06X zVVe7Y*)E*}OCpz0Mu{P}9W-2V40V~&usLUqsgw&?+!H7Flv$iI;4X4cdQa0d<|&H= zF9@Ne(J&4lF<(t$ILT(BhCEP2w3|!g<pyBbm~sO?Wps>&jI=RDYz_qUsVOGOrm0%P zn4k-ipO0d<eS$cp8M5r8C}TMAou}6oCSvSdJ1GWn@%gbabL=r^!m=aIA8kp3j=Djs z%{ysy0F*o3=JbCYBN1iq0FwVXJ`Tucd(uFmiudB(vNv%}iFLc>;)@G5q&ptm&5%{0 z${eT~ITV;h8x#M{&tUpexq>)6lW{56L6@PWcGT<2ny`hTAf7c@)Y;Z{5Eee<=%6_* zlXsp?1#EV9qPgCkwM@!7fPxlLO`TxEq*jUxQ5zB;YZ$wM%Q0r6DY1%}`e2I7*d<sL zOca-JlTo@vYxy`IQLiZtWXxcNC8sft@~{gywfyjt`fTXax^MGnzCIp0ZC~`}I!}A? zXvAITB4wi_TnN0-hFY!9(_p^txzqL5BA*R|Bj(|;dgOB8rtMsWzP+=%o@Gl^Z&JLn z$D~v@TZ`;zxX9A*nJ2Y4GmE+bw$TZg9xS7+3MyAGl{U1&tEbns!JAtB=i}q+Z(aED z_y?=`o7(W5p%-oq9orZ>w!ZhZ)%@qxJ6h$7%B9NX>L%<*agkBpW`UEYROpbvMAG08 z2tb1EHArVh7h#tUqFh(kQav>4+=N6LI9e8okOf&&SqZFVqG}2o067v~4Yo(9Me3H0 zJ~{T?Sp2r|^*l_==(oNDKUMl~RYo={BkM=cZRON{y^GYc&IVz<)-Pxi*gnNL)-g`L z&mdPY7M(g>DPc@P2h>24$P0M{BrC&qCJ<qQ%`#Q7)?y)0kuNd<SDb@p8RrQ1<MMWU zOeoo#lFgx>hcQI|9N5d~-$<hG5kAFah=uoIda#1-ssjbBYoe#>%kOk6XvDl%?kViK zbKqdN0MD+52KIgR-o~@T_l3GUgo@R!nk(qvzH}pZ<NWs*zPqq~=*^9hQ}+-kH*>JO zC6*-+@~m1v+YcwjTGrLsi{iD&7hCYnOM;bw4Q3T!;!H|DuuN2NygyT#xXoQJGNI?l z(t$5xBs_@%jURE6SZ$vwXb}(m(+S*yMhVywdx6e1l-yo0=Am{XN#E;i6kY|Dq7j(7 pIYm+K4y#IjQ$xz0+vvdW=*TbVIQ(v-qg%yS6#eSNeFP8b>u)b{+1daA diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_messageentity.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_messageentity.cpython-312.pyc deleted file mode 100644 index 10206e2a3ebb34a26b69ea129f274ab78eb8e1fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19252 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 J&~k<}_dkH>6QlqD diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_messageid.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_messageid.cpython-312.pyc deleted file mode 100644 index cd0ee36c66a0ec4db3c31c25739e17ea53c53d80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2134 zcmeHI&1)n@6tAAo&XA1miX>~mt%Jz6Ceyp-APkGBEJzkN5fU$Rsj2CznW>~dW~-_v znV3Tk0TXc1i!6fZUYB_APw=jXUGN}{LO}N5MG~X9?8#T%)5)&5*F9O#)vvl<z4v~< z_v-ccQ&Tkr<M*#V>enX_`qeD*Q638??}Bg}G1NlLVg=s{3ax@=<f2~;O07~Vm;7>2 zX;my#K<^<|-bJj!O9#cwMyooiI`-DeYF{WEL@f3>_M%Wz5h_eW9Cg;Xr?Ku+jU^vQ zu6U@^9Z=9T^f->XnBrCL^PZ#uzQL8EJ-)~qzZnmXmDtMzEuxV6AlGxf<<zd(y}q)% zbWM2L%L2;g%6M^d6@-rgBS$R@a2A-=DzZYW#EPu+rNzp;3}`C6dI9vhr9ITOSarAF zviH!Y)tXpAj-5=LhD3h=)G5+2tj7`II21Qyj)M#U77UPzuHdp!t6>;f$jac=hAq#h z3Yd_FuwXzX?ErTo#G1<>)#5i}>I*$;;MI+2%;bL@PmKfT3Oq{AaC&SG3*&|hiJMew z*=&#FB7(Iscu%#)k-Z~(s+pQGah@sSOHBaUY>QC0ohJV9sQ~d}h}D350M`QuSz^_x zMPv06Z}b{-x$(S4MA(Dm4<Ygho65jCf^|pqum=_6%ozx<A%|SzK=k?=(^y9V)xx8` zKYGH0^7=fjKYHrLgu*E^l!J9<ya|m(5O5}_<~~qsB9Fa3_Nd~@_ycYrX+Fan!uN59 zKjEX@zT9p@U9&VW2}L`k5OtpO@ewG6Sf%NVp#=QYCuG{wkWYV<0?nC+)QC>3`TzVs zYyM49LjS0pmHX0NSki$Y>l+kqgtVb2NYh2V0!(ID@IVVlpOZ}xKDTZo4exC17q`(Z zXs+9ZZ>$5O3&TR&);1!!1+<OUO4-iibJyq?%jp0eXxaZB2jdSG8X>2!B#nwwPRc4C zaGBVIh)`%k(y)^WxaY)Ne3ev5S8~3^ol;U#-0z;@0xgnuAwrZ13K-dWwC47sfV*(V z)X=>ad2wJmwhOl<ZP4=y?%q0=^DNp3{fI)(afdt{y1wYRgOTn>;X>oe8?F+X&kv}# z4$b`Rv`fZx3)UEn<P<pFI)CG|<>weK!*_KBriVM|XM1YDdf%S8bN!w@^P}zlbkW%> zee&GlOD})ze&OD`@H(vOhxX*Bllzmm>L+jrIW<E^NCQqtQX?e$FM&Ksi0P^0ohl(L z^58Sjp!`TH5R1_3q)CJ{Kgl$}WNOTk$9<m=$CBq@OPTz>EzcXRYCg@H4Hu?|yXd&^ zeAzyF1)ak?i-+%j@CT}tr|&Ernb)_Q-`V%yT>RU}$7Yf*<QA43TTa6wsp!!F`c)cB zGLy64Ai0$Nfuu=W@?!q6L1O4PssU%Y$`F{??xM_r3HFhFHKXG#c@dTdg~Bi$6)np; eeid0Q>j9d5fEIp1ul-q>wWdF-|ApX{TKESb=xU1q diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_messageorigin.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_messageorigin.cpython-312.pyc deleted file mode 100644 index 1f55506cda9584d87c7afdea3ad33c52933fd2b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11606 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 diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_messagereactionupdated.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_messagereactionupdated.cpython-312.pyc deleted file mode 100644 index 449f9c394c6fb5e5603a05b087032ba669fe9f8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8374 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 a4++A)tC<yo^~xi@5vZ;_^AW+CANU_ATX?<z diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_ownedgift.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_ownedgift.cpython-312.pyc deleted file mode 100644 index 6ae60ee688e9961e6ab3101fc9329ac6f4903074..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19830 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 Sk%i&lpbwALKL~VZUHfm8%G#s= diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_paidmedia.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_paidmedia.cpython-312.pyc deleted file mode 100644 index b4bbe29ec45b1adecf1e05247abed298a1068aa7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14595 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 Og@^FU#xL-L#{9paDAkw% diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_paidmessagepricechanged.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_paidmessagepricechanged.cpython-312.pyc deleted file mode 100644 index 3160a6417154e11b0a7e542e0ec3cb1e1824d4fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1923 zcmdT_&ubhv6qfeq>~_7-G{KHbiV7igLw1%pV9HY3v@w(hY8z}y*+XURNV_}n{Mbqw z+w1z^gP}Gw^i+~VDZTU%-2bGP7y=Cgfk5e@m$Hsi8glB>%xvOA@&{C~nkVV$>HEGX zz5Q)!s*0ff{nIytuPlWAFoQ`eX2!`UVBA3*br8oq=V3qB$zfyXy}V!O6cW4O75!4D zgi#KCig<Ak@scPU=F=FR@~GUfwwG21t|ETOBTo<~3^a2CMOZ+>?k(YHq6bV9E|eqP zu7CwHl&%Aw0~YiJ343OSxt#byDb^SEUnY73$JWwNyJ5gQu<NVB6Mf12r6i_Vy}7cq zxZpb4Nx`IjIUAf@2jg4dCr}3i#~jC<JkNCsJkJY1VqO$QU{Vt0^WewJJl`wrqaNng zUcF=Oqb=O2te{3Eo?ZrIpQpf<4eT2UYR-PiA+&IclM-^nu*ygf)(s;K%rcg405XV- zIZ!@LSdmRv55Obw)^@c@pru5W(FYb4aXh9#JZU8MhfK0AsBOXu=_g*|>xg--9@%7d zGt9Jq#r7mPWJ$SPNWn?6?Fw<tF~XIk&9s*7H3N`lWT?_iQYVZ8y+!~^vL%CQ+hjvX zW%9(i;O#b<o3pQ`6h4-H)lSYcgkBSoyw`?%(q3~Rc%w~LL8U-!k|6TCLK^my%##&B zq0-yrM@o|}=xOdvcl6>6b50NjO~!pUaFv!!hmu5)oJ<KpR5TQ_FT-ePa-&HP90YR) zM2SF8(wE@}CERYL#s8IskprH}^lPMFyoci|8@hCTlR>H^lnNwG<%mmC=tu?*T=Jx0 z==0g{WDATR@ExR+CDR?`chGGpEIYYh@uBgBhS3h*L39!U?VwwQbmes4Gd?DA(!i%O zv0r`<GZUi`YUCEBacLCeVv@<&q7+iCDNW$V6$<y(TwxWLX-^8VEgFTmpoG^u#jiqX z@}4MF1{BD&`+Tc42z}A=nN}OEh0uw7xDcwPv%=F<+I7~2Z1Qk3@InT!r?nx1jh5$j zTf>naguylY>Rd~?S~Q2uS%*^ga(9cG9Axh)sefr<;P!AN>i}V!EWf(a*b{zD@KW>8 zJ=;Z3Yp7B`C?8ofKi|A>%{;JL53k(VFFdd=KAwH&_u2WQ+4=kD-`_8MSAS^LzONnB zZr4v>Cu&rUUIFt3rE!(gv}l7}qtuj-Y^6*o4;`2Wos<`91!f)|s5F_9<{u=%98YC3 zI>PfPZD4r@mXx^w*X3Kr%ar4!n>7m`LHBGA9p~yrYfR9a&E3z&HFVj2QmGcFAHREX zT!in~Lgy~r{qpGSrLmbFS5dY8?;BtpBk1JWNyNp5C1+p|m-J}p2K@wEJTpm`O(zyq z7x)*FCeQJ?$)rsq?Rv_Fy+Wmo4Ay%nJ-~o}Zher-^Pwa#G^~^{#(9kK@g;=6z>m<| Wf1+!T(B-G43wZi&@DGAd65&5ec`1Yd diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_poll.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_poll.cpython-312.pyc deleted file mode 100644 index d687ca45441feec57c9b7f82400c65daad8c7a21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28153 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 diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_proximityalerttriggered.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_proximityalerttriggered.cpython-312.pyc deleted file mode 100644 index 20565839fd77ff3d6ae4258bb1239b5e1863a6a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3002 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 diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_reaction.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_reaction.cpython-312.pyc deleted file mode 100644 index 32cd57bc12de1bbbbd67de5e8a175e2276086b8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8712 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 V%M*(PZi}0DLX+N42;BHE{sWa(AiMwo diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_reply.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_reply.cpython-312.pyc deleted file mode 100644 index 38df19301b6c8ed15d18a5fcebbfc5f77f3501c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22550 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 diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_replykeyboardmarkup.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_replykeyboardmarkup.cpython-312.pyc deleted file mode 100644 index 49fc3fda672795072d8c0e69a6c15f39a3822302..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15821 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 b-;hK6|LAYX;M3Uos1U!O{vE+@4)Xs10bwK! diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_replykeyboardremove.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_replykeyboardremove.cpython-312.pyc deleted file mode 100644 index f2ca4dbc958c536756022185d32e9b97ab22ee39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3109 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 diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_sentwebappmessage.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_sentwebappmessage.cpython-312.pyc deleted file mode 100644 index fc9ccc9ed82a65a8e9fc269be5b18d2f4b3d2154..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1977 zcmdT_&1)n@6tAA?nduplXcS2{Vk}YAkxfs`!XAcYHM&HyvXeuC%6O>Mbk}5R(_dEA zB$=2)4gnKz@g(seqBocLhX`Iau%I+71QrioB)eI0*^{sO!x-Yhs|EA=RlQfQ-tYIS z-uyH?TthH^|K`))zJ<_zJ;_HYQ%>FiWgoeyja<Vmc!pnS7YwZzy`pcn%|ti7l3#9@ z4OBqyA-A-H+%hu{ifN2?Wl*VGn+r=lF0miFeUD)$3>4*o#5BNR=O%L$Rz0e)V3A;w z1qv*9iFs^AP#-VC0{)P7@N5*}8%#>N!tCF4^tusS3z6bsKt0e$@+}KVOl`fsxX`-B z9p$9Sq_UDtPUb-Q4Dd13HUMM6HQGhD&^D{cwcMg>er>oVR$}D~;0KsWtfIB9xr@4n zTiJQ4ZSA5Bqg`D@^=dq-^Mo`Z%PdLyuz=9JIaVHYL*Y}MEvB8YuQYldcsyX(Pf=lw z9d`zRKF15r9oC~>7l&O~?n@@@S`EWUK}x-@G`EgNCGaLRy?#Um?Eup}z={b!@nWC! zsmIm8#!KsA#{0i)Pl7{*BzKu$E>5;x#9SZ4xWG-SlxQxenUgGY!rkTM?8H0E(6;d! z6H=GQb(!02;+biCI?aAotjK0^l*V!{7=FD87o)i>l~}%r!@R~#JnsTUyvvzLfwPpe zvpm{(c8zjRGw}Bj`j{~A1{n~b2{?laoPmQ^*`O0r;o>VQyMFe3Qlj@W!wo7{`_WYZ zs}yy5z>f;goB<@|<;-Z91-^Kvuh@SDTyNt1R@?tGz?x-vccbSD+PZDTH5zfUx=x|= z0y+*7x&b-xMv`HGEM~ux4N$%`_K`|VTI?0K&@JdoTZJEt1MLgLKwHKZB6$R~g>IUu z<)5;veRSkxfKN5oPrnD5YM=qC7g|EQ)Jt(m_9G@@ix3`gMM#o%T!q_C^ed2Yg>(gD zo2+ieret3C6c>1r<Vg}Dby7gg_7l<Qg+6OQ7m#a>YoXKk;Wo=ge%Gd?;?61)Q*O8( zcp-%c*jQu1TEpX=Ml?{pFt}vDIn$6_v8jkUtI!EgcQ=S`AM30`qbPfpb~F&faQNoL zx#nc&m>OW0mq9$<Mvuy<I<i+ew8p=^e#aWWYc-ChXLrrJ*5uK|<j)h+hZECxF3jwj zpN||_LthN-4c!_!ft}EZTlJczDWE<hB(4#XwtCQq2+@rvvs4IiLkE_D9_fWj0;#$- zaS@)n(EmG0!trp%p2Iwkkh&p8!6bFv-xkkkFWtlwF`*4_fq1-w9u%G~S;w!S(bu-; zkIQK0@^P_R8vEsA@-X?nRR8|v?_NmP=2|~)9L|08r#3u5AjGqI#8%xBV=#%!Y7p^Y zB~5TVuaZr2E&cBjy1emo`JzqwihI(Ay-cQvbgs8idVo&;iFGBV=c;%SrW%#RAdZWM hVLW&h86Oz;(DT2dOZU(lkIIwA*jFQeAowH^{sIEZH1Plc diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_shared.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_shared.cpython-312.pyc deleted file mode 100644 index 107a6ec9e232f8f9e4a003f1e1b4a4988e8ba109..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10949 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 Hh5h^o6Uv%` diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_story.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_story.cpython-312.pyc deleted file mode 100644 index 9641f759c7115701c93f905da5ce2ebb73fdef63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2539 zcmd5;&2JM&6rbJo$NDpTHh~sc350M&){qDZxd;IX;-gZiniN`JHXF}4-mu;^v*V;m zU4=s=Y^ezKP(dryh7+K0;MikNz4QV~4`@{+s<x_nsZ0|j#Hnv)y>^TE1NtPtc{B6g zoA-Y2&8&aSWReKzuWvrB{E$HCS3U_T+7Z^LLAZ%9Dk3al*_NtuQLZXQMdEYCj#Q(? zsE{LetQs%Ig&eijYND8s5RqvN^kR0hnkuFwB%?D3$CnXSNqkia&M2lA61n8!yOR~m z)2c46+e9n54l^ys(@aNmr)NotX_VL|BUoduW@?kfCNtEmY7@+*3;LhjQ%?3XlOMl- z+88~1di1?><7a&JLXBCjW7;{%kBnAK24glfy&&Aeih6$H!uXg~;=9Tzmz9FB0uHzc zT6bW$21pQ8lmHDGOGO3C#Ryh#<hF#PB#L7shT|ko)E%IURjicNCMrufv79X?ND^mp zlBhUE;yB&WK;@Xw$Sh}8gL6<Z)kL32#q<Qq_4!eeo_S41D5(Jnh`M;xDDjBH03^*5 zFeHUikeH{rWsPx2OSb8O4&|s;YbG_P0bt9~7@<|6MXuCM+hPm4HaYKh;C_R-a1Mp> zEKDdALYN)YEPf2Js8%o;qlKvw;5-F&!{LI3VG5@UeLaX#*R?r9JzgA)2`&`0;Y0e7 z*Z07cGZX9{)(?sEISMDaiN;T}rt6G&;X!Xc83G9t)TT`jEM3UGLaLomPSP2#(DluI zXa@=cv%(bXw3$B2lgbq|K7ui@n(K*ftdJ0V9vUYLg99j1VajrZ(T9$8r4Eo|D3(>W z2-V6i<sk%?q82dWM~5+WbNjzV2A3?t1NCJKkKdR4q*=3!%kw6HNK??lG|gESm>;8r z)u~hJTyrGBBA5AZ{Wh>KrJIPs7*H$HK-b~fX($h*Rjvypp@!5z2DE=b4H;&kKh!|8 zk#MIs!fLEH3#Br*>}rD!5B4<*ub_k$;4vAe8Q9Oo{HRy25$dakVL28vj9#98!mzNx z8`1OQMwt?_NODm>;t{*t(+bc?7=~yn!|?dq${XeCt8%{LR!P2UGH)(F=9cPJexLJU z+YNclDqSXY2)px+?V51!@^i$Q%iGp;zP7+Bt}~(^9?p9fBSST_blIFCJ?p#?yb84i zx&=;L%!<cE57Q{Xns)-&%d2Q3ixSyZ{INQ)a{iGz@ROQ<vU7Jc@_FJ({|*@9&vx$q zHuqI-W%BN&JC`2q7=pFzGc|o9-AZ52u7eNcN3h9EUzv6pRbk$(I^X2=5LN#g1YUK( zzf)np9a5uP_s=BOt@0adEX~G4tKNtu3$1o~r6G4E2}{R7iSe)mwG`+yc-W!0<Of|n zcyN`)gA;^kg(_i{e_j6nelc`Rj9JfhrgTx_oJ{#+PIm%>+NTV7VLf7SG$=2$AMfb< z$_!z2GgpiFO3C(mcJwV+^>}ykuAu!O&|Sb5GeOBZ9?o&C)4-r&?HJm$^~O?b=@wh- z+t-Zz*8ld+#uts1vAbvQoV|DP;RkE`j()dyt^as4(!AJ8|J=8&HQ!oV8M{|%F0J(q zKT?P30C>tt<GBoPZO5z<!|;=a5qyC`P8$aQFm!g}hJoD@EJGuEw#z)Y2qHfPUOCER zr@SPh)%=ubbq=G8MJ9fx)BYu5+lG;of|Pj^oCxyee?=%~d*J6?0rqkkJ(sse)%KvW zId=72dm9?m|4wD1{m-&n+EEw*gUqIOoJ&cxeb=pz9&g*<<_hgJN@ibVxU?I^Hb0l6 z(UDt6+X#kx2Ob`|pBLiymp1syx&kU2Tty%vVgOL+UI@XDv4xuD%uwEqB1u0RUQXTM z?_hwzKyNXWg0D2?t?zFS7j>h~EZft;EAa$gz8da{Ya>p-kAg^eAG}hJ1qC@yb(nI% uyd1E$B1zKo{YW|`{ecF5M|+;4k*8?z7iH7a$U7UcL()id`~`wRxcUc-V3p(m diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_storyarea.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_storyarea.cpython-312.pyc deleted file mode 100644 index e0d16050948967d9e674ee6495a2d75e8be7ad90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18063 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 L|Gxrmtmgj*@;e#^ diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_switchinlinequerychosenchat.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_switchinlinequerychosenchat.cpython-312.pyc deleted file mode 100644 index 2d171c45cdea64156462a8ca094460258006b5d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3758 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 diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_telegramobject.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_telegramobject.cpython-312.pyc deleted file mode 100644 index 340461fcf022d3739e1f95def71667b47aa187e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29725 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 b^}?>}&V~K&gchaUOVxWm6)Hprn~DDm*Refy diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_uniquegift.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_uniquegift.cpython-312.pyc deleted file mode 100644 index c31e6026979e58b30361781082dfb28d6d37d814..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15477 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 OF!{%ya`<Kk&Hn-g8AbL0 diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_update.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_update.cpython-312.pyc deleted file mode 100644 index 29d556990aa29083eb69017eeaaa1f7eecf03f5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34148 zcmeHwX>43qmfkC}NEVmkq7q4w;_|q&xD+>uq9|&iNZOJtQM5?e?ds_+ma3k}l4{|+ zDoUc79SfKahU(0~Qh>lTCX?u2WZ0Ni13}t962J%sNCVS9_(TE4JXo*>=^z*cNvdT} z(3l@VzH{GF?-gIMWLx8DcdKk&-tC-w?*83#m-jbLX9<Vj|Nb{WT2B5M$Ne{QXuks0 z^2Ml)<KE|joR<sQf_Y(EB+r`{$@k_*>|T4Mz*}G=|NL-aq{v&u?DnuDQtT~`lz2;+ zyC7T|Df5;wdtulaDfgB~D!diUT@<d2RC%kI-4Wgwad}<LUL4*ZsrFVgdr7z^QtPc{ z_R{cyNS(Ki*~`N9k%QiYkp^!Ab34P0ktS~wvzLdPBfOVq_KI*zq}AKX?3LlRNV~T^ z(&6o3?y7KSq|4jI?EAvq5x3XP?5=Q6q}SWa?EAxgk$!K#jT7?366CcSdG&Zbkpb^O zWY9Zk<MO!IxnRvtxL~c&^-;c3Zr-7_1Ma%plMBnCI3I}xSHl7yh(#0rP&Cf_qkQbj zH6f7T6U+VtFA6K75Er5egzyVOSXdJM5&rT@(4P=Ie@Fb>cG<b`&fJV|>deg48)s)< zmkVACMg3vfad9OPijl40augP~O)f?<@q{1T+<Ef8)2s1NREWo?V$moPL=?GJ^Sc0l z|B?`&Mv@632wLZqKODZ|4_tq9RS?%eUpWN<Psd{M#3dmTyCDP(K8k=uRzb1O#X`|b z!XK{+@dUi8$m@a-xgv<^c>AW7W60;(Xc#hG65^|2idw3;l_YI)kt!BaKd4$S34SK} zRBSbxP}#{f8G(jm=KP`H1tA#n&#j7qWq+LIt#VEjrj~`k_1J1cOUpUG99mfkMVGYv z+UH{7uv|jsWHf$L5FuZ=RwWl%ox!IvDEO|$V^LpBEq(Yo&dpz(oel*kNA{b3G3w5j z^H0YTvYkpowqK45VnFRv?9XA<@x^~G;<!IW7ZW(I4c#p7GCGtuKbYsW3kBE8j3kQv zTKR52Z;{{-it7*{lmzo9@VA)DLS17)U234V?@4{Yg1XE=U9cy0y#=+?KwY>eb%O<U zxq-T9PwFNM>Iwt3V^3<{g1XW`UA!lCs|9tHfx2W*>UIn2eFo~%J*hh_s9gr?vOTH0 zEvWY!sGWOK_gGL@8>q|or0%nzt}#$o>`CphpsqDgSMEtYXhD6zKwY&b^{@qXoq>Aa zp45jdsOt^Xu05$oEvOF~sQ2$lJ!V1OV4$wvlX~2Oy3s&gvnMqLX8gQO2I|^9sZV5( z!s%@`P#@Tn`jiDVZ=kMIsPj0X#d=)*2r!9$-d0exC}XiY9@i_h#Tb)c{J-E-@L;gv zU)zF>LR+v&Xcsz&Td-NT@w%-=x3$97$>O!a*2Qe?uyr$A2W)O;>x8X`*}7osWwvhE z`k2iPTR*e)=(b+iJj|~TwgG1Ahi#DAJg^Nh+W>6C%r*$y2(t~rrbs`m+eTnJ#6l0j zc9_`?!!}B`tHT@IRa<cMCl%f!!dUQ#&>kFP{&~TpKe2yA#f+c#s1hcO2gfN?jd9En z<Csc4p@tndgiWZ_OtPza!4rnC<HCvHbnv7w8a#!xCy6?EB*<MYWOAMUiBp&1<OX-k z<~=pfxo6};1%mi*p#wAAr-D2qzKimqXdo5=<lt8ofLBt&<ELPYI3K$TObEyr2>auJ zgCe2E$ckU|Ujcv&MfrpvMp!H$Eq^$aSo81;H)ATCv><292@!^Zf+z%eM%KrNC>bFn z^5gzQLL6UIWbuW9i#!r%kvxiEv$2FQ&bW}6lL>&?c!G~b1w~Z+Q85rtQbqtIMMw{X zdqv<?SW9yIqig(9=!OtAXWQf9<AUH1$7AE;{P@k#_0ag@JF!)fe=Q^;8Q>>=V&+yt zfc(fqe}6v(_FtvIegvLaRD_%qm*Qz5^~~_y<EVo1#ZWY{=pN@6mIXESt~kFM4FRk2 zD3)j<bTuT19u;vLyy857w3y(pim?dq*9(CPA|Qx_<@uFZJd{Ab_~<HOUF0)JH7p81 zoyZ!J0DFLHswb+~v(qRTRH=Ycj;{y-7RE1wYz>uSN@6Xx+J*Wj0Kde)EnHcS#jeNu zcsK))JHdl%>}H%tG(HjILrc*ZVxz4IST+RJjG{$|6pHmlf`U=$rZfUEQKWT<Qe>*Y z0RgEj$5z8ZijR5|P~oficNN^wj6D2V)_lN^8fY}eM}?buf>&drDG4la!YB>M%ik1) z>wUx%y+AK_tsO;$Te=)KL*Xzrpa5Gh@FI#Q773$-u(A>SL6De|FqN|&f-<J%4H^OK zOyi3Qb!p{MR}PDPdgDdwm_;7+zNyh7%hYnOhfuBk=zO;leL8<?1}n?4L=2^s2nDVS zVjnLg0v<gARv@SepT_Ge$Z-Rm2o0W!#?Nc?Y^@lI>+C80>(SUv3<@zSRQ?Kj3$?$S zel#wYw%X{_+Ku?vc+^HB1ddd?2{E*^#72cHYba`e6l+27G9{oTjvf*YA{1*GR_Q_r zDT?St{u};Kn2k<oX;G2@OSKyUDr*(%E*_lGKt+-*T`-hZR0#Xfc@kf%dQ=9~`&hHo z>c}LzT3;_zM_*SWQ$-o2GD)J=+{>#i6L(5hsX4u=ywutXvE{lCLz%c{QCo)9`yL%i zVZt*e#)d%p0H2xy1}SI+ERxu*HZZ5OfX1&9vkq%29%IT%`=$P&jx1=Nerl-7z)d<B zwKHLAM7bttQcFZJ<moH}s)i(Md6-lvW;snmjK(OlOya6aB5MLBoy8srXpAxwpmF13 z6de>JHAcJ}u}}d0{w6v!e>E)J3K7y+5#gE6G$wLiK-HaOl`B)fl3g^tFi8~f?$>y$ zqVmvIDVnmYtC$EvQAir`lk$r9U!j>ui*Jw+8XJq2LyDZ;a;#8fOzlvw5yXh2@dN~# z#A8$}%4iAjMM;@NjrgMgU5J9obY%sj8!;kvo@(pkZ!U)d%WQyTZ3)dw9hl9M`ut3} zlto}g^JEr#QfZ}1UuW|&TByRsBqBjA48zfWKa90VY&Fh=%*ZFr*Eay{01qg~498GT z*gyrX7eSY(Iq&JL0DHuR@YQsVB5P<I{sbmE27z|Zb5jU4=>pApqwb6O0icX^IfacW zS5#NX33Xhhb_ir4qZHr6zlL^<273eb$$S8k7=~7-J)kbNegPaPyEh4dpk7Q#(Bz4j zSHdyO<cLUfo90mSPUD1%imBn!5BOD`0{p?C5Cn)F8u1*`8GoZ<nKTv$3MX9%I)4(u zqCnIF<s++@9x>4ajr)UGbA;jv(GMI*g-7j@6*skB7E!ph5)K7IiSU|<KSQZk*R++w z)S1Zz--VeAr)Mr<t)TD;gK;J%8)wS_QMhWrU4T!X$rVb4b!Lya8U+RjLmRy0VQ3a; zN$q`$3TjolC1j18YfFvAcVqRyk7L!bY)A%O+5^n0v+A>q5l4)h3aVZ-gSt$9dx*VA zo!?YkFG8#(>;4+8=^E7RK9Lp{me^?uJ;I=gH+Qs2bOePEh>;lW>IJMtKx2+pgFZro z06|CvTCzs6?8h*P`Y`8NSw!minuM6cLNyd;%Qg>|gP7xQ01f-755-YxrsfD7x{Tgu zXp|W!R2!dJL(m537b(0kWqnBfgtF$lLR%RY!!Ak8wmB}dMR_o@+*r9N#54%8&W<s{ zR0@a#92U$duw31bEzS(h{DpHjJm@jxPE@vMlz}*BF4fJP%v`23sIp@#UsEQvG1t^6 zzNI{>YZ0`5Wjn~C9xo_sK5fG&OKs{5Q26F$y|&y@AR?<zTEZw8@hjG>Hn5t?FFnZe z83XHunfdw2*Jpf}W+tZ=&R(2-HM%Z+)6vzS@xk04?V_z#*42Ux`)bX=yrjmwKvfPr z5YIWnnEPO6`}759zcP0#HEwH~yQJ2R%@R_p)t7n<x2M6Lo+l_<0OP*Om}F|F7-_S@ zgIq1wH+Avy?82+|`!d_Fq6=OUW2?08prJ+8vF-xutU&~YFqA#3D}<u_{8hkxz`s=h z{;$}iuc*fd(3G|F0~YOBJ5Z25WMFQ_+GN2-RfUmYMokbCurwHotLY$*iqe(WB!FIt zbtmZTu<%h<LyD4%;4PM|(7{1ZnwHbloLQkzn?|?JT?9j(p)_vL1o%37JZ(Br^P*?Y zB%79imcy?opQ>flxO^QkO<F8fW|N4S^6#pZuP8H`C!IL)WeOeNqj6m@pH?xqFfGs| zH5&odq_pOwSHU;U!isjZ#J7UeCMb0rH?fd@_fZtH;Oe?w=Vr<PamGMToRwjot?Y%! zN@5L)skLwns_+awgR(9r1pp2GP_nX7{6(r~v_#!Y!G=)i3XK)7c2r*NsL;-p-X^u- zY`2C-?SHh(rkzOh{8R3z?2^N3h{HM-8s0yo9hF_hqHlO<qs6zqqq0jPQ$-o2(pw=d z=Ko-JRCbk*USr06jdT}P_BFoFj*2NILTtaIJ1QnQ_uNr2wV0V({>Vz$IH^%PqTe`n z562fL#Va9bN3q4FZQ$_J{)AsSf*`2G9={e#+r7aVUF;LkK?H>vkDYVnNNLu667&8| z_Uvek{>k=lvWlkXmGb<Lzkjn!j_=0)jY;g^v;7-W-qhvYtNj}@{CTy1V^Z6j28~zy zH!rw<W9n$H_HT0TY-k$)jB*2zgjSbr{`@}e-(=)6ox$I;{hN$@YD#XV-879W+6wj6 z{tX@O_^$7ce;4;}OilIG{>>ls=?+8t{jTlbn40k)%KnWh)1+F^rjyM557V5ZZDM?D z`!~D9H0jJ#nN1>Q%KuF_KVHWEjVTwZ{@A?F{X4pUV-oy#Y5#__G42Mr!Y5q4N_V|) z(4k%2J>F;VP+NywW$?om5^i;v=;)Z1?9y7cVfR<A)IBv;<(e)`(Rj&as@9er@0UwR z1m)b7T*d6h6KrxR^HPp{%KNRfmvUX!)+X0x+5D7UYJf?Ua@A84yi7fJ&JLx^MVfb| zYSGUb$u*fi%E=D7+<fv?wv%E?E+tbv;VbXkeRNvhukZF5_73HJyN__m<(dvqE!tvb z-Hdx$xF)Zh7m~|orq3?SOyf)@J3l0s;e_Vw?96%J+{O6?*`<b>Jj>3`o<BP~<9qY+ z%%yka{ZnTy&d<#HRL@H@^Ow&r$mLU$=g*&>oO(lzRX%^_?A#ol9#Gx;<}Rtv5nQ~y zp!(V8E}lOxmy+q5oSlDr=8{}~;T=3$pdT5POO1{y<~Vop>?}?_K^Vwe!n{sjB-!^} znz?ZCEo9B$SDATC3hw}99Gp^)pUAG$m*<hm`FXfe9_&n&T&a6%#Z{{o(5`^G>6!C0 zRIr&L^YZ?=%a<V2JObw?&r;D(pPiJ8QD8oLrD1;dLz`UUUkUlH;~{{hxOg1*2gMOG zhRAS}K^Kfgx+g65lR@{aMY<;{9wp-l8FUv{r0cvQ-Gml<$)Fq6;xRJlmas^V2#9pU zTkIlZfDF3$EYeL}@og9Zy1Ym~x}Tb_{`=xNT>r}UK9`^n_PblZ&iy$a{aCO2*!Gcn zm(|9t+txW>o)%|44=&=te(U*g*>zVTT-u`{+<FmQg?g9+F1&J}{ML)%a_FuSxQca` z9j+4HRRCA1?ka^#e-B~33@)c0=7dXs7h$~|t_nS@0<KEkRS8#>?y7=opYGZRmrHlK z;M%Xd_QO@JyQ<;RUs71FfvZ*ztA$H{Ct>{nTv{FA85OwnR}h%%phm}B4JKEk=33{j z=_RfC;hrqjj{dFz;+#x}X*TVqs*PLY+<CL&TL^ITazPviiA34q!&Xr!;qzs-(X1^q z-FRP48|{ERBE4`R(jy6C8w|M^1Dub}6vyQv-&Ii%ZVT>%vYl=nWXhQqC#%FSM^5TX z5X{H!68d~`sy3Q%t$%m^VQF9)w>$@MZ6$tVU^*69jo>hKd_X%R-LGC5><{7sA06Zn z!~xuny)h6DT^U$eODxBtBc7q*0o*PX`d9EG3q91LQxB+T+dV65q8EbPu2A$|9<4h6 z0zEj6Cw92s-r>F+=Zeek7D<i+56*2l4m@!TJZtLOu>V>4vz{URDcc!3xnY0eIJh&y z{?_fBev8~KJ4a>|f9>yyIdV7e3>>4sbvvVH=`X+2-VHXzJ3|xXJg{?&c^}*vn^N2p z7wB)(&gdybtJu-FoW4ZfjXM_t^tWwia)JKxJ0py&acBHZa<@M#>qzBu#m*;=&Qu{c zWqaF3-Yw4tM(A(D&WY3Xw`oUnA3jR%=4bUy|JL(?XREG<<<wF3UfJEUKQI3Rg~iE* zqL5e>qhd200d=gS0KDX*jFDgb2lTf0(O0iAZ?hp{<gxOf$Ga^*MvuIvkC$mW5u<>W zzg4gPvF%=76l2ddef-SeW8t5Lk1hItz(*fzGx%8eXXW!Z;G>Vr8GJ1Kv-0_O;G>V> z8GJ1Kv-0^9@X^Qn3_ceAS^4<DN1q!q_*nR7<#P;t^m!zMkA?p=eO^h&MZMdim^-fN z^GZ5Q%;Ik?PxMQ0(Py9xE*Ab-xJcll&s7;*Ec~-@`73bIXSED27XH>H6a5$9qR(_0 zTrB*v$g&JBe41LbvC_5h&%$K}Txhb&_%SXP{#kO=3NAG7W&A{72`hhVSr|UkIjr08 z4n>~-e*vQD%l}=M-!Efnx2Qgb0IPD8hMgibT$<~nTm6{3@R|dz%VF<?-GImCT4ezO zBEzw%P@KI8018?*(k(i?T@l062J{Yrdh!;Y3aNTGkKTfa^UCuKvv^HnQN5~;cyvrR zfaeqREa0&Uy5NmV|GHO?b{);Qz)PRO(1R_Offli7!DivjmZoe^#UgO`YRw{&^}5j_ zV%8<D`oIOD3=|C(lT=fN<DBUWh*T1|euOKC!*qVxh)dYZ6Dwj2hz}=6@nitrj)=$T ztTcNT1ofa?;L?}&>M2=VxW#GJ%s@3$>0D4!bRu1im}O1Am|N=6uO+qBYTB5Xdh#cI znw8}3p*Jj4fwc@7N?2{B>>UbfswTnc$PjxqMFVr%gAyLnv#~2~NS{*Ce#X=c+5udV z(Caia#a(I4p^+*#gFV#Ej5(ZjyF`YgX^klt>ryDo&8)zf)|axKm}Raq+1fI_qGSuq zam04#i9f&}F$g10Fo)+wAO6VYX_XW4yIrl~QM32wgi8Mlj5}Ovf-9>`mNq{wZQgO! zCS6^Ut81&Q>sf_s!~U$a;=PHVPQd^DiTe{tms@hVe>(llS(SA1kDWY=-zm8|ldeI@ zHK>L(J$5#+kao${o^*L6mq!iheC+IGA$^joFX<YUT%$R;WlyL5v9q0V>ycbNN!KCC zbx7sb_}JOVLfRx(Thi4nxw^Bbb63ev22H=@>Q_VB9y{9@H_Cm|H6po2)R5N4&Q=ye zDI{G6nv9TP$u+FfxF0*+jAlS`4J2JhCD&0kq~o!(gN5`;u3n`?)ewtv+n9dV+@|1e zR8*<Bh`L9cARH~yENl&?AECxyCYZiui%&x}VYwtm7#=J|m<32iST_r^0KN#TXJHm# z7GZe36g({e>Mh%k^F-%*o)sAVu`Nna!2(7ys9@oL%>pWd3qb`7z{sG2g})Vm#KOdO zhZZgt@Q=cvNI?B5KNUv&Db_&xC}s^K=q}E#kSX8=Bfvl$nn|+&4Lyb2fCHnYVGc1r zOhqGY4?m69kD@`k2ZX002uCE=R@g&TDr})yio9uz!f~~(OG1Pmani5Pb>TWig6<J1 zqp>cVGLGZ^5uQX+U%tVe*IhZkOye>p%*^+OSc$N*V$V@2cqa{JFcWFmiLh2YCSXH{ zriQN#qjbT+M1xcG=2uo2^&Lh)FJpRFD^)KxrM`2|@~lp?U;$-Uh3&w+1T>(ux*P&# zLIf-E3~}fM5HXj41S_?-n)bpgIYhgl+}`q-OGPJ2!&vPd4HJl+bvqRup_LL{$0>5D zfjiTl%O&YNGKD$R@&P=6!7?oh81CHp4AIDi3Mtdl$4SMFCZIr@$~1;i;@qy?1#Xmp z!$3swr=SJAIl<sf%j41(eG=a)b3gM8Zxlj}<*a(|{N3}<xdLb3PK7I3(JEE6KF@~> z_$OJxOBMX{0=N*fa(}X-ORDI4UPNvObGJ(s?azzJUBcYGQbljdSyWcCaU{jzPpXou zX-rmkOV!<XUt_R|!Hnv<WOavB-I1&wl&S~S5C$12q(`dmNmd`0st<3x_N=sO<HQd6 z5)Zgrpf4mPTSfJTlTG@2%=UkUY2#(i_Fq|b26eyH?9cdEpaScKHB>SG6MQU?f;eXF zZ>8Q7Y38=zVHG#49HcU{KqV|c7XDfJkjl&g!7x4+{#p5u%FIH=#`swHXXQgGGYbsF z_*nR7<wL453*5vomW97HAEq+1z*3Bhg?|<<q%!;F>N`@IS>QA#i-ms{Sx9AOp{8S8 zEc~-@A(fehnvQX?@Xx}9aIl4%j&ZT@&%%Xz6OZvV<Hv9?pWz9oH5W^)JG7_D%z$Xq zNY<b&V-Hhd4xl$|vT4rrsZNEWjGO?if;D*3M*syf{$CUN>8zN(#{m7<d#@^*F`jua zynCdES{=YhtANZ0Jr<Qa)#^PoRf!T$Kc%FyG#_C|GuwSI!VpFZxm}zHq^jpC(owB- zR<tfraG9lcNG~ZA(zm5k)3i+KY*EdtQfAYc^%)gw*_DKbWsxNu{z|$oO{QJiEoz%) zwNsU{Y0K13b_!NBPTlByhEoos<m@A(my8}VGLA6l7>=D@(9}#3#LT8<qSP$ZOynIS z9QL0SHB<MCtC>h~WUa6v)rcYF!9ucQOzId*cAR?Laf;zPMIA*-Cq-4G#?DYm85CI- zY8OKa2A+nrGn7RJ1yhEyh~!{OocDY`^?}#>C-0wBRBWnhCqs!vN+C5QLxp5eE_FY4 zb~Cxsxy(tEp>`r=nM%|9*xAdt4N0ycMJZ>cTrw$?=yVA|^Dp{P!7mkJ;`E3WB!lYZ zzaj*HHuDFSkEK5-K1GNH%oN{Dq))k6#;}rr)Jq8+<b6acSN!66>v?zb*Yl9t-GqJy zCJ0|EU}gof{(=kU|7CvA{&9iE)5b*uklX?=vAkONBlUBjumDGl!onXEL!ht%NK~E{ z{-B_pa|_VJcHu4jEtOe?{@Oj2S?cOk)mo_|H74^wconZY!U8P{rV3^1&N;)=xSlb~ z^B3qT2~0JC5KghI8I}D|B$0|nOB7o#^z^BcsyaKo$kd_7(S~n~gz1I5zKdhEAqF*p zJ|P<Bq|DjAJLJK8sj5i&<S?bahx;Zy5A4yTaA#<{2!WW=zzZen3-WjYm_3;Kt<S?W zwVGtgF&7&q*@e)Gc{_<AE`5iMZ5y$tMwup0Ic;Kkqo350yVQgi6dlRpuKGx84bk=( z%iXm8wJXBeC>}`y6MDioE3-`Hq!m#bl~Q|{TE!#rQM?PPHe2)rmN^lx_}svUrr2X@ zYT;!x8sHc6neG>BKBWAlPQj8P9LFA{(Kjs7IoOk|hCOJKQ!jt^I)wT@R{C38*u4f% zv^G)-8-Vxh?L&)7cf~`M%IB|?<F-uQMNgV9GL3B?PR+B|#+g!i@pjm-XHBuR?Nmj& z#mma)9n#t(t#5evIeHKuU0!=mSgAE-j7jGf`dWOli`oP_*5A?4k55aL;1$@wb(Fgh zhEA*vo`!>^guCRD5WWzASolhSNaq|yTBV6Uq#&I3i{cXvIPI4{Hm4&mRTIY8;aK*S zKh|E7GONR?c4g@Hfoxg*gn-!pL&{Ky^)MjT`nXityQ1B*t+JkH9qx@HZNIOk{{8U% z@ZHzbJAF0v$r`s*<2LyHy0ZRZd$Q-a)N?%9Gb8oPY#p50JoeW&pHyDlaW!qZI-k{d z+%Nid<^Gi2R@bo8(3NZ$k{X7R4dYV7_}0N=DK2lKJC&bb*A49%-|~Me998>L`?>Oc zNhd>Vlw_Aw)1@ZKa2ok}q#BRv$1oE4^-49psvko-<TotU3~#*ttkunqq3u-EY?L#N znQW)0BIJBL79rBH&Hy19?WZG~e+lG3=W;RU0l#Mc*7cLQKei=w`gPkiqR;pR^|%Qg zjjZQ=q*AThg0=}z<m8g~kt#<PE_pA+C12;FE5l5(<i8LXyUs;NL?$lm%VjxpRG@Rw zm0l(;><eZ&xfJSLbd{Hh3;U8;PA)|{7hU0H;!^ZN<>Jt}Sl2ZBvRO`9igR!&ej!;( zbS^q#H06kW=`5!#r8*ZKMVh#<FP`P(Ql@j!k)??X`|?>%F3ucW*cZ@paw*rj=$O?c z3;PmUPA(NX7hQp8;!^QKbyTTyY0w4@6BqVnw4Ab3>0ERLo{0<lLRwBP`*be6r7Y}A zX*s#LbS|xyTwE_yF8g&Z*8PZmIW4Cw)j7CSzmP07I+u3K9I-E{<&>pX=hA7(g?&*i zL9l`S?&jkT$YtCCv90HQd_Y?n;!I)P?Y?=7ht?O=59%l%ukxs0#a#3lAjvQoTi$R< zBaoMJJ|8Nh8<f;d815Rm6gR8HxZtBXSERlo=i^0q1rO0sE7I){k){!m#s-ltc8IlP zQ1=vROc!ZkEz%qzmXhHjg9bH`<}i^K^CFE-;yW<pA~o~)Qfq!798U|wkXM{k2tcTJ z*p{OBBe-sttEfpO{4HUnI!w>M1z5tqpX<GM@4ma4*sf^bu>ZQg=i#BBjeR)w=<Igy ziN7xTrE9w$hw3-pxm)pB%h03tUv&Sxd+XR6+r#I7wY2rNce~~L8}=<{qvUA%ta;#( z{TGg(J3eXJ9z64_UJ7kS=*ABvN5f}bM|R38-#c^n%vN>pc3IyO&#6z_zR1t(E+O(Z z$<h90A=f%=;vd=i!Qys{U+15Zd}eURVLb)+c3IDpzKKr)NTHLZ&>}fnkpe$x6tQb- z{;loiw>1$vM|B20+hx5Uzx{~lyBK||<Y)u^f$oR)pE*8sJgV959{Z2&pXP7ZPJ{fd zyJep>c^)QycI(4ipE$P%Ui($a*23G{P2WS<4<yGyl$_4GW4o;LN%zrDM!>t3@utE9 z@8$smgC}R++4}wux0`$#hxS7{hwkk%_s1tcnF50j#(<X`Enol%f<IgSaQV^twrBdu zYj16R@B7=0e*^}9BsuCody(QXB+|8A*8QYMsibz6O0(qPkxI|FE=d1&ndiyi8^4@~ zBt0xnhveu)97APONj~X6`Kc?jDBBM`n*PO^pP$(}esTNI+>=Wzzir6xmXlKY%#e;} zyKLa!*M36nrI#hsDLJ~3O#g9Rl)>$?p(i8feo2MW&*F4T4maX-kLhu;v^#8cSKqyP z_uU864+9(TZdVL%Ifj+fX0@}{KeuhxJt@YiFP8Xx$`_Y?KDo??wVXe!EPHU9$QO(S z;Ejts@i1Qa#!{$=ktm&U0V_lC1Uy9QuyQ`Wmw{`s*mJ=8j(xI%2u@P?DKaL>I8DYB z8PjCUkntKBuaj|xjI(5%BjXJ+&XaM0j9D@+k}*fdn`B%fW1fr!7_yx{t|4MjhB)|+ zok&psA7>n+8%^vsk?hb`((H(YNVB1Mos1|Mt1z%Yqz@F*hc{wDHlE2&^=?!^z%Gr? zZBqt5T0NXnM!gmyCc}e&@xMhze*4e4-{dXj7dTRviW;j5@0`W4iG%IQdXH4^N!E`_ z^`m!Q-?)5l<gRzyKAOtQD`>*V*xH+HIV`mtPPR--Ez@^q@6Bws-9NW&pVlJq?qu_b z)I5@GJ|#7ux^w<s$7cTho^AUnEkf5|vU6PO98Y%6N}aP?_S((r&G-lP+xA&4Mot#p zL&>gVQrEF$*PPTfw`D)D+3_I%10*u1vB)WA&Ip|Y$&RB^$I)cRd8y<4mc3@PU^DPR z$+rExmd1gWWNoih+ncN%lxhd>OmB4D%fAaD2DJ#y-N~k5scAUbbV6!6ap#SD)%W7} zk<k-cgq%X;<j~<swvS2eW6Ab&Qv10rd-c85&H4Mcx9#V&G@81SjYCr7P_l7CYMi)p z?q0#Yz<p$6LW__)qwW34wj)y8k!0H$sqM^`eg8dSbL#%JZTlIGN6$#oeOz)MPr4T* z_rjLFesktQ+Xv^i?F(9r+_j!NmEJ?io)c2fiDb`PQqNmk_Jf<3AB=o}*7=r}O8;oG z@08ScD%t0i`n+5A#?93S^B<r%yh;oQw^!3aSNKf{*Vgr5O=(`+trK_7Zmiy0KofsQ zs%X{=t(@!Z+36eH>GA9g9p3Q_?;M}p86Ktoj~?G?Zlj>l@tu()J4cRD1b8CCne#gn zrzrB_qdTv^0iV>!X<I>UYLx5oJU>F#XRex50rM;5_SJ88NmZ?>BIb5*buABSr33C% zF>{x2wauG1p(ja|GItr*)cIgZYV@R>%w105KZ1TFRl(eqTyxh}*HNiyJXOU!_7THI z>A*nB#oYUKcQtd@aE%>X9fzfc(Nrz-IKWlZ-b>t#rs|lpo~vovye3t<QwN#50rXof z!_t9~R3r0fLWHfR0UUKoH8T&MYiNIPQ95`i)xzAZTy^7CW52ZDlWJog?dc>tm`5jf zux+dDs8m0m>S7+<T#I|lJuUGwDL3=zLAJL#$E3!isb1#M2a*Rzr25`eKXZGy)}Du5 zQp<2^fVl^`_P(vYDXDEbHN-rI(*>i|Ms?%n_oV%uf6uBUbtaE1EKlXl+Y0tSa6GJ$ z_`&BKIljo({ZrUFqButiY94eyJp8Ch>OCd3PCn=0p+<u(CE8f5*NmLVp++HVYEI#F zyrA~M*u&SQwnNW3*wq-YrT!V1RQ)FJP{GLNSc=1+hux13e>lLbpMLL4@}byOUs4n{ zWwSAV);%n~i*a8rg!U8%Y(-K;u~}A`(P)m59onvfGAZxVoF4t5_%!yGYtx~c+Lk@! zz)-#HGK6AFnBC%0a6BP;xy~F+Pg1C#Mq;pEK4=bC-lteqz751y2Xcck27Sd)IR~LU zn#-0K#wbdlNBN_ONy`wqD$PYz53{*l#-~QZ!V<ox>(R8Z+M8#Z5NstvYZ7Bt>A`sR zUOZcw$gOEEcrKnUAbV&FO8t<ZA_lE|<mTNGwPPDfELtSV<%U=|ijiI~$p_LQnhkpv zc!NZwo9{;UtBFuJj%Re2*nMbPq)}sFE3|5j)Z<fPF+IIVu*8^v5{8ErP~v!7fm9ew zp~{XVDpwH*WPHdejgOAC|AS*f0fZ;Szl4)8Nt_hoseGHw_M1-5cE<KUxUp?+?7wqO zpL6G)azmeUr=N0%pK?c^a>t%>hn{jBpL2^(x#6eWNqBzF^*-fBo^lgUxt^z-`)~6r ZKeu;F_U<nW-z~L`Z2a)=Ir_`e|NqsPOdJ3J diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_user.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_user.cpython-312.pyc deleted file mode 100644 index 3a0b0dae966bc22c00bcff6de2f58f68e47637df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72843 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 diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_userprofilephotos.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_userprofilephotos.cpython-312.pyc deleted file mode 100644 index 9d0d44a1cf5031d1a5e74e18060c268f21b02086..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3166 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 N$JdLWBX}rj{{=sPQ^^1T diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_version.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_version.cpython-312.pyc deleted file mode 100644 index 63e46d22c3712febcf489922e193a3c7761eed61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1710 zcmZux&2Jk;6rcUJy-u8zCTU1gEs+CtOKhMKMWF&AJ|Y2%R6(h*kX9SdINoHvYi2gC z99k(7MRK{2o?@wh+*3i}z_Fb81GqQ@Db}7MamocHawMdjc(c1nm6AF9-kbL|?_*~E z=<7=%SpWR^Rpq>f(BFJ>ykH-$-YSp{bQ58O1qW4yqEHo!qJXeilteU#uyhY$nTVTG z<WQ7FL}aXB6+ASIeo1U9u|^>Rkw;-eRGhpH6f8BOYznbH0eUUgr?|eM=hAyznG*x$ z1KYKnAT@7Q3I24Y<`59-rdcPH*`8~f!NAjv?Up^$EJbl6jMGECFJQlc2r3E~6-6ja zC`v>o3Ksd1At#-1a>%KmRZe6o=dec9vWOG+<f0byN#GNWR89}H&!VJOKY!P&*@PK> zg%}H@V%2Sr8eZ984VFJnoadTP8L$|kw&fT$Gc4z})nLXeMj7mxZ!I{)pu`~-BP_BF zl&ZDlQ6RP(krMTSbZq31I&lIu3K*!A_$$;c#eEL@Ap`Q3^ezExKohWtB`kk0-9byC z!D--A`2^*Z`9QD&VIdG{DJKPr<<u%xATJQ#3X&zu#WuElk`rhe>~lgOGvbsPKi4>_ z6e?bo6snfb>V@~b(n^)MJ}dZ8)*`j4)6BO^%Y;s2@3!lB7ACY%CvLsq*b9YP!>@Sm z)%>fk6`1Xl>6%qqwid}#@51pt$k!S{pGh5)RXplfAf?rzcpCXr;w&V^rU2H^?$Cwq z`H}AE#DOLcr1ld?&+Meewo+pUNqJymAIZsy9vGri4dl%W8yEnyfzEE*Luf2$MDBfh zJw!i9ce#!a;+ciT<!cDh!8=0ie}>J8zxs?bY_Syj8{8jGNdDhqGZuyV@Dn&~6Gs<d z<nsKHkf*$YKq>Plm{Tc_NVyx;Iq+fA3mp0Yav~iD5@_)SXWZ8?=tw9uP3BY6T+N&e zB@$c#Epq_YP<Lo_qxhh>{&8DqXCGgFbh$m=IhSv0T|M*N?ETr+;J0sgM~zmpJ=mUk zJo{+2{c>lx(3}JHjy}GnkGHiy^_L=x?9SxO*5u6g<m;Umu04@|*MHN0z1tanzd5&? z8E*Ddey!(o$sl2xF8nL-iKI-k>fsfK^J&xka>a6Djb@tID}h+DT|dZ}rscYxZ~5@~ zFfN6<q9$B~pg*H9c33n`fFJ~Z9D5Vs8+0IwN&>E0I`j31UA_Mp&JAtLLtPMlv@a{l zM2qzhko|s58EHLth=4?KdB{E9<~`nBIu4Li&YTM$3FViB@^6?ItNM+a?JiP&dnvzK z0hDGrj%h}jhQ?X0<j*5?qc3ufryo{yl(-%>=`G6V#@{!)1+Xs(g7EJpBusTsb~iP> zrX8xI!bo%J5CJ)O17)vtQ|a}0S~q^W_2kB(Bxc198d#rdX%F%}BnskzipDN>F6OtN TFRba!o9kEa7ym+q@ZkRd!f};+ diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_videochat.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_videochat.cpython-312.pyc deleted file mode 100644 index 4db1d30f19d54ae060a394874966f2530e85753b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7951 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 O^v~b-8G#3%$Ugz}?duEx diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_webappdata.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_webappdata.cpython-312.pyc deleted file mode 100644 index c84bc5e24a979090fffbe91a2c9effde0fb4e762..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2266 zcmeHI-D@316ra7Ho7*IyRhn2V^AhQ5vs+tR$`V48rl?htheRqDVeZ_Wxw+fymot-( z8-wH_U;-`rB2_5bM@#%8d=z|Xp`a`Z0qKJ;k{HF(C(rEOn}pz-uMXVVGv{m0`JHpm z{4g+3L$H4T>ZA7UK7@YNhu$i8iTz0+?jnZjh#9O97-6AaFf?5Zieaf<%IH#14lDJF zfePqN#L63pRd{K;nER+#J5|eEy*}6WB@Sb@7;x;xk)nPiF^zECyv03*Rhud-cp|vu zkpc;x;{l%+G{iS~b0SHmsG|07+NWit=1ijeIHCd2gFVHW%#)Vhn4OuP@;&9{A>_N+ zJ?viv;uFY<qq+f^6_`;kvO>MYimY_cU}av0_{*%yE4(@kx~<A4Y8lMj7_6I{XvL`a z%_6HWtsTZi%O!-a^^#%`Db`uwmWV^hqyd^3Qov(vr4s2nju#7Vt8RjJEashNtfaHd zn>0z}c!OXS10);++pg6xtUNo3;}!@2N-v-iU=kY5Frk7r0a!o6ii<GQ;vX*3z*ij` z&n?GYnE%B*a}EWOKI4KjoSB`&zP^V00=rZx;Wl(q4X79EF`A1?#Su|_MFAhe$PBx| zUSFYM5^(8e-gWpcjXJId0uscNvBG1#t7GR`L#E@6JXPDqOI%1@V8%FeU3}rZeLj~> zi1{O4GpNtH&_ixRD$%f9JO`+0wv8t_rpr3AthXp`QU<8`x-cFz9#n`y;7wl%Dms}> zh97`?5VelH<@12q2dpD`<6}1i6nS|#c6CKU!CP+Q<AXZC!#mBG3O1QRr}HL&MguQ& z`3HCCYx8@~<vq0A_Puu25P)FTO3M^#ned21Xqnvvl*tF9qoDr}&jCCdQoU|c5&6;l zVPocO{2#jIXopyZ^u&=4NlUr}(+`ZaMiZYbKs(M$0n-)<J&wc)*u3tbL<Sr*t$+LX zVEf#-ixhnGwN+X}cVIBD6~8sMwJt0Jtr=^G6!H_u3UKQALu=?3%%$TCxRv8P7;@V3 zKpS*)Xvfxe_iUgJvI^5ezaLg5Ez8A(i_|2<k9<YQVSZ^J@fpzrM5a~J5}dDctDKf3 z4_b#>8493EvXMrJ)US^&%lfkgryYmf38|7x&Q$CzhWc@EdjF_VseEsNi%}LYM?p+s zf;me(T5<xv=_DQ1j-!kA>lYm9D?XY~Z-LJ9Lu-fRlP8-NNk<IAwW}xL4+f)pN>7kp zLRUZ_Ct!QJj(#==wyKZJq5C%;nnRCGXJ`23&C>0@pYUs&rN`#b&P!*$w!XCP&;2-Z z>Cwoghr^daI=Ex@f7-v*e`jzXoFJ>Fv5IKO2}x^&<c}iI{e<Y5-IY`cVX+5nKt=}e zJOEjQAt!Wwg~lk0I34H$=kXvQ#4^P5Ad<R4u8NadtJ>R6Yr$pMo^GJM!cf`VeFHsr zcKz+0_doapndMVo%<k&XH!}Ntcjf!H9$kCyZ_V1%n|Pt;XxcKx5FFBq>Ll=Q%0fzq zdS$WURmk7&{Bak$uhJKLOq(n!Kae)qa+xQhLwtbp3v|rS%&{Dmae?8elaZR(EgFWg f_X;xJHJ+f;Pte6*(5rt|MvPORo%svFC-d+REGK<_ diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_webappinfo.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_webappinfo.cpython-312.pyc deleted file mode 100644 index c27bf31fea235be259ead157c50314772fe9b48b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1946 zcmds2&1)n@6t9}k&X5GwRgyKZmI#uOo$k2nX$Zl@UDhm1A|@itrKYC4CR3aKvZ^M@ z#2j)6n1G93WLFUNy2OJ={|7HFcxn^^vIj4c7{z5zzUrP%B6#rZgRXux@71gK`@Mc| zz8@Q_A&}p`{IGY|Lg*K>$)!A0P8UFVfIQSf9`*`84hpRTHhR%72BlUh)k}UksI)2= z70_+umG_WW;ibc37Nb=iRO{CE?bV)8B#6Ae&xsp_nu$;m7LurQkGq=a9@9kfSaQWf z4HmM>eZD4HK;GvaG9SleG3-Y6uO@08C)RSTMHDh0^zqzvIgMqkcUG2{ZVFesSrXY= z8E#HzLHP)9an!<qt>EES(JQn{UePOkfxR*>1A+>#UID*uX&-g5SKS+LS^H=Uw?<Y_ z-AZbZ6(nVHVlM;K8UaZ$4gsBE6yPEQX0j!$6ZJJ<Yv-6|ds@e;={RmAxvhtg?MSXU zok%NZlXqAgtGPC{Yv~mkL`9-5PzH>;K2yM!G^7SGldJ>$ijZh7gVc+E&}Y8T1DmXF zMnks$<#-w#a#q6Ql6xdQc8v&g4HuF$nbxw|?n}R&-j>>jIo;Y~LF{wYOoJFAnk*bN z4M<3yEJT{j@}ZBNAp&r7?F^A^lMODFDW>Ofuh}HmXY85GHZRvMM1{-AbQAb(ww0Fc zdXvnD<n7hfcUH)I@7^_(u(OXvN2J3^6!Q?kYzo~Y5M5-S4Dpy|gejt8?uxG9-dW-% zd0?--7=kbGwk^W7Jf<?nGx?8|dqrG`)CgeL_-8@qfmhM#>x=aL-+&s@peu`jYv~bA zYAhCXeUm|PB}^V9%^-3Muo%JcKtrX^=@uxT;Ri^=JClRr4!RHXX{YcFJ~X}{813L4 zMDqw}2i+@WmWylG_?XD4fX_&-pT7@>Dn<iTFDyypQZFZE)sMMMEJ{r|DNWN(MyT+p z=?j%qX;*T-&FiJ4q`2Qb#|2(AZBj~=NeZageYWoOqJTRv71V}vGjjWZ8G26M{|%*u zyUu09i#9_)V$hP#1`jtJUv!*!pnFkx!+!m`qlD&-n7Qk0jh~-(Xx3w9@YwM{j=`<l zm!TPl^UBUqya5I^1IyE0^piDqP<?DoetqW$Yw}0SIhvf>FMVtsy?FJj>CdMhn$7r; zHTucu!RY<*Q#ga_HN!{90#0dCqcofCppQ~&X3o%3rPPaD_!)RmKFl;wi_pH(R6?3R znl!;=Y)F&KeV@`gmY2Y!Oo88&&l#_3zDyZ|1IyDrbW(V}Y#m=im#*wC9^G2}9aYN{ z58paAuWzmICLhl%{AKhLv&hSNgr&MACt#CQ^dN=~Pjg8obNX$XYuPN9rf$g#`Hwd3 zYvC&!&T^F@Fu6TK*##!qXVz>+$DDi#wg!bFupAdL#wV{Lyo8^isVC^h&*-&3Dg;k_ Ldi75PuQbBnAi^Pt diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_webhookinfo.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_webhookinfo.cpython-312.pyc deleted file mode 100644 index 20bc7fadbdcab62f3387dd74c51ccde783859f2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7132 zcmeHMU2GiH6~427-d*qd-@$=EE(w9GyV*51Kh=r?`2i9j4y}!#TcPoI<~lpc{A};c z+F5r|@({JQRFw9i0;H-6PYn$Z@Wd;RmHJ{Uk!p>IprWnRmuhK@gm~&XcV_mlcB2ZU z3W*!}?zw;Go_o%B&b@Q;r))M&p#1Z9KdVgNN62T`2unO5ZvPyJH;G2dM3c0LA(bQW z8#SV4tQ?cDFJ{EeL^)yhmHR|HZY0fAIVI?Xkv99w{etc@GG?}%H3!NAqMbAb&7ty; zL|B3+fKSR8Hb=@M5{Z!Kh?c%gw0@Sl9`)rYkJcl(%<8lA72Tnxt<?-hRoikE-Eyd6 zQG4+mQ(fv-6qj;V<;-E03nO%%8SE@qO!^92tl0MXQ`VAQ_y;nb%}HKzj{UU8ES2RV zUUvS+FFhk4Kl#k@7f#JS=OxcnUEQ`61EvjxT+WDXpl772aEHlGuv}L7Szxh`U2wUg zy0W{f!#?s7w@q1NOG?df9dAH1UEO4ktC&^X{`t8xvnO=b1v+}nc2)ndetlQaxczq^ zegQUMq%46QK>y{a7AeP4r2S7D*P>eNw~`iTaV^0TS|97vk}Szm=f*mj`t)A-(NZuP z7gQRkK0);Z)$jL;cBVBa3)Jqs24FOUE0)IA$daTDULGuG*?_i38)6x4m?gCl!EaO} zO9?S!>~i*cAXs^Dja-n*Lvti|m)GB6C#5t<h_HBI-aA`1ou*KZhsZ!Ha8p4;Qf1Mu zAwmE+HO>JZ6wKh(9BMBCPF8$)6nqB0oyCxgh*J&40W@(0oe8E_76E^{MP0^CF$-{@ z7`j_8(D@ZRK;sU}g>-;hN7oo<8Wqd(R9`~5bWTf(>+;e<jT;O3uu)MQS*<xPKuKlX z)t7WtaoIv%@Cp`GnWgF0S-Do#U`$r+n&q}R=v7(KH1G+h-3JG9WyZP9Wn9wDu453u z>L_PnJQT-NE&zYa0(S$gc5qY-!(L%pAcM02ZmD(3D405RORaF*(pQC1IwcV56$%NA zP$<x4#vRy2tti%6rj<%`da5ubn1Ypqv)_>~+OMs0#Q|Fz23@HzE3hVLuES&@dtrFD zUfspeK2VPGvrZ{oLBVeHa0$R#T5w#xkSm2zhraxy7xUCq>U5D&W>(!g+C0D<1pzG^ z;K*EBs}@?^b~b#t!J=&&xP!mlJg=dRfT;rTMzGKhu+SAab(P!806UF>OSJYtZwbZd zT%cB%dfsWvvJ=2UNp!#(2r^qU7a2!y@=*x>vZClNDpzBM4yLTP`L!V#azTaVsT~I0 z5<TvFsZpmj2c!<AJoOR{z})86fmZ}GuoMnkTEG?t+(Jm8pkZJy&=bKhszgKv({}Lw zP$4>WsYp1Af4fwaDkuX5LIAnEjt6w@@QipF`RAw0dT&@kZDZL5*)v^x;>1QMw`|xd z1Q_3I8m)O92M-)|S9LyvzD~ng5W6ZhQ?ZV4rf4FX`GGRjL~93>qC+e6>uUlzV(AGa zq2P$7E*zXzF6d^>q(OY4Rtski^c${XF&m=z$@%%0=DNi0h*D@EjQk;p(B6TS{u7%$ zfs7sw9|=EcyY_2cA|3_b_1_U~_)`oWj@We(oLhIgWOHhZj>`2#z>#YM5Q8@Y$_d+t zvI!P>$}Xs^+6~Ac_PN39rtq=|`~?V<u52=N#DyS=`pVuFbFF9^&ZCX+EW(H2VdFIX zScfz25N!XO=XGhU<#`Y;z%X69`5)odzET)fmKEI)a1LY8itbjrxQ9<U3a+J~qr(-m ztEwQ<w6C2mHs6Q~ABEdqU#z+8yF26?yF<DH{C9WA*S$l!)cI|?L%Ib2|KA~Qt!l8& z3#3cFqg0H43vZ9EpollbByEVZ__qfHIJiErzq7y`#aL15j+ogV|L%4PwDgVKF1eI9 z*z=b0_U!yo;icOTa&NHXRf+FUZ=|CmctCpl?_eu$u;+c}jqUUe;YHz_Y4%;oODk1f zKEHy`4Za5w0~|j62_MI57^@MiFqOdvuo}W@6srlSRFTI5LV~{({6*pK_8*}28|h8r zLc=fX{SER4WVRaV_oVAM7m7q0QiI45zXf9vXyJNM8c}G)TCF6s!ps<H#GsXEjm4qW z*J>r8l?+=hN-9dDFWeW#L#at41+D(p9CEI;W7r3Bk#nuRx_Vo?boI7)clBo4t&jq~ zsL`GRy{O`z0=+wAlb{zZ)>D@7Os)N3&OJR7pc!U>BvL22$SlW{S8l+IJGCm~UQ(8I zOLt|t7ZAeuJ*Ys<`_MpLdnsAhWK5<wULU047+Ynzj2Cm5vDC}0htUr30&cPhXR_?z zi8?~rrLT-)#Wq<Hl1$EW@r13`Ow2qM!<YFH$JN#Ij33eL70a*{$omwRnYCOr^u=Pe z?pADTrtt7|(a~LYq^hXrA=%PiU6g|_7EELns&$S^TpfF*BbON}sR1L-AEEm464~BI zQUmLKo5_i*&u=6rZYGPLPTaE=`(<(~e{3ywGkI_;_XGUBznLJDkHEm-*5l7&$G)wH zkK^zDt%8`a@8hXsA3b$rYEBG(n)zNcN>bUI$$T?Svcp$SuAkh>4E;It&}QZ#K^)r5 z90KCXne{WGO*b=C5C=Ci2fKS(LsOfXspe?<?lj0T(3}ANS2F9FHwJFQS%??IXSx@K zPbiKK;w3n9Yur*>9txf4k;3CWAkgChZGm?~N2@eiKL5Jpw$?Wyp+~+Rb=$rzooo4W ziveW2!?}&<dy(rw%xFlO^aM=0<Lc-xtD|Cd%a7L~uDk(}58_hfy;!&lWJlwx`8mdD z$z*P&v=Ab!5Ps44Ny~!9<a3T~EfhrHgv@fn&qj-InTzlPASyoyRW9N6%YGgkmCR89 zj?vSLo@Fk-8>zm4TQ2TJRl{j7_R^4%2=d%~KTLH{cjy_HI0cI5pjsX6L~6k58Vop9 zr~s&dzoF497uPSo<=z;4U@f+tAbY0YKX_yOv9<JH4@|v3_Tj__6C0%$Zan<r#>?`} z0}E@hjqH7!$^9QsKaDs80B(#wb|drnN9pZoWCkF#ku7W{i`z*uG`_yFe(~ywYwFs? z8-vpu$!UH+Y?@2VijtFNbHf;7EX8E9?4@Pd|8E7LGqQ~7++d_nmNhu4j8VWbY}WxY z3fU?zhAB8N3JD92XZNC-YkEn%F)`)D5n&v|uy9(hUqlczovjJwc-bJTsF047<(%ZJ z5rO-(ufi-Y#tKd5G@<(PGWk66f)r0S%aQbO;?k++0W$OWR(@(LcVr8Q2M%u?d$u_~ z8NUl0X|nLIy+D1M9csq0CqeE%)a*klN%kLTrjSaLyANDF`1|}j`OUq>W<Pdi$i0WI z&b@uQnZ?$CnDF+!%|UDpVe9a<nRkwC?wx85W7h~7zxS=VU!QJ{Vrz^{g8e?se~{nI zJrxQ96JFgMd+-aCrunKw62qTIGVz(WzTYJ9bM5f^kG@+J<VUY<W6$j<OxeaM!el}P zxiMZubv%mIBT#vRs%;oS7P_D;szTua_IedEavX0^-z*a?N0CFy|L+8j_o=r(>@3JN zS2vsjJV8VZN6$b`7zex#CjP9JncH47-pfg(Zv+IqWH=_Gm^jh9#6KMc{$C}Z@X_}q ze;S&I0S6D+j7pO9`GZ6{EqzAz+#(NrLMH!4W^R!uKOsN7MJE3e9l90Ux1E@aNHf1G Kd_nM6aQ!!SNB^+^ diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/_writeaccessallowed.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/_writeaccessallowed.cpython-312.pyc deleted file mode 100644 index d0b7fa94563e1703846ec1b1db9695023e5e8c6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3297 zcmdT`-D?#`6ra7Hn|KrZp;aTb(-ySXB)irWTP`9^k+%A9r5I4|LpOVO=jN{2ug=WP zHEAAv5E`LUgcdE7;;Y#Iq%R6WWkC>1ANo>aW2yMmb7psw8>`?4eds24_RP$g^Z7fo z=jV};VFJ$|KYrQOMhW>9C;3y(h_#P^xJ+EqBCh5Zd@U%n3L4TyzZjHSB}JF~a!_ei zG*Td+5Vw4uxD{5qUQA`Qs*BaSzVz8l*Ap~|+@8;<6NS?DLP4YU8RkeqIrDAFTq+|f zyNvd^CmFRJhY3M#-;esRCm3Jw97Y3JwC9-dJIb$XiGCuMUKH9s(4#ZVXLH;RPAI{+ zd;H{y=26d)PHIj%ZpkKVp9Ap~c*sag11}4%)+)M%R%wXfpF8Xp-O>-5TV`ce*#*4d zS(#N8Rb8iapmbd8=qse7xkKl-wuV;7S*<mElGL{(ube`Erj<L>sW*1JO2{yUN5v(L z1B4;wOt26lVn6CHwcAlo!g>z^kp{&J=V0EBB*ra`Sr!~P-;s<f1-9!Vqo=qqy0(<I z(+xlk#4_wnP~Yx_PB)cyinZx<9McYu0ub(d;rs-RKp|KUaYl_HWoKjGb3Cc!bM{4# z37MbB1)v+Wy{PgTFxib<#XXy`4}^ps?n)VphG{wxXNJsDXheL@1m}d=XKg!<#oJ!! zNzeAZB`{+$fY~H2ADOj`VI@0FI-sfpS^;g2ZzFy<0xpPcZnpt@UPvJ_f#L$oL7ZGP z=uAIa2jjnvE8&1y;kk?h64kK@>Y*CuaoT{0^2RKfX@NmjXa{VTf_}x9*=87YfpLLA zbzSB*8uZ`+<A9R9vE_8_a4z3Gq&5K|(|CY7Js}|_xyhMJo`^!)f&Ao^w8{8P_cWgq zja(WXG?Tv5fP;-$A^9w%IWMFJZGsPJ92w0rnme4=W#1MQN-e~??RQzYt^iSuILppa zWK1CjoCCPZtV4EuHo`Cvp{aGLc+kqRmYLm-B7d{psXH^g$6!58(Bte?)uD{UYFgKk zp&ZN{06A3UvjANA@?WC-$-!DjjEb_gQRf!cd7kU%4%+4<V}|kS!R)Gp<(Kz{TD&)~ zX4Ew^nC-`=`cPWL(@;xZyC>OGK(^kX`Q>l?pCG%*?iYkCz#+Yxp9-~uS$I;-Jp+uM z$C1r20wZ1oNl*4c6?MIsY*QD<1}If6B(=foB&iMFiOp+TGHl15HQ%@4;^f#R@gW>^ z9BME)B^dD0;8)CkYu^I#opzZ>c&E>W@-n#yz0`8)C+#}&!lRL8ZJAhwbOw6`n4t{y zEEi#xODD_Z%sQQOK$n5%^9~JpMmF|x>Uu_KWRcVhO^yvuy_%FoFJ?T^EepS;mi35p z$&lr_cyDl#RILtYY>Cw?Nl7rj^9ZYo1MpkwBWqcr0vaG2l%9Ji%x)AgGq9ytFpow~ z4|@$^<{$P+Aw6fF@kux8hkj(kN7Y<l;ezRVZ8KhkRw0}+-aTjvXqqNt+nI-MZ{xIS zsZJ+t4zu3Sh!^=*(7&{MpsmO{EhG2!7%+&BVR&$k+<%D-jb5nU)OTJzena1ROE+(i zzrRwtrSG~u@j?22?^Argd3S8jFJt33$Hs5$np`P;J$hHKeN($oyEwWAl1RPSY&N08 zgMi{!-?EZn%SxMEplg<e4Mw(8wJbMsU>SlYeCTT+{FwKo2w&f%gx501tSV2Eku0(f z^L@*zYy4H%5{RJ>`8MQ&{xKcKaAOXJ2j|JX!v3<pdRikdAJfhqTh+<F@!RlkPOT1Y zE$>*Zk^RP>BS77KZO;{PDOfGzYK820<BGf#u2ylTlQ;HVmEVW?iS4gnIel~6-oNqK zJpu#Yo@;K_b&hRsQjv=>^kk_!JM%mnR!*hO2}dj^+w(=k>PgQR2ApLg^&EY=Mp6an y<U{>%8q6d7EtsPBg2J#`)HLnhUZS1W?vUNTk*Pam|NY7lZO4^8e-U^o3I70dKgKEm diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/constants.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/constants.cpython-312.pyc deleted file mode 100644 index 64600b9d317ca3774af7b299e03faf28c72b3930..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64438 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 diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/error.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/error.cpython-312.pyc deleted file mode 100644 index 82a5f4752df7eb03a2aaec6ccc395a6a731b5e3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10932 zcmdT~TWlLwdY<7$yokD6z9ha(Waq-QMA>q@o3M@>$98O`yRzfRn_VRZIpQ2iW0M^2 znW1DdO4bV)sNL?OE{Y-o7HJirMI|`JF3^YO(T@dM6jU9<E|H=Ex-GCTg<La8un$GQ z|ICFWigKMM5AA?FGjq<Ff6n>O_g~NaT~}9J!toz}`p(>vB1!*BH|`O3E*_?3NqS$> zq$x?0wLo5;3g8^f2MeL8P$4`OmZ?6J?<hp3BH}unj}~H6F>&3Ij~6<pI&mGDN(7`c zk`}!tX))GyD`?Z7>K3(e)ONCNueL|jCQ#eutL+uF-Kg#H)%J<nUexyaYWqcPKWYb9 zzejgK)NVuVps#kDsNIg*9X<+!qIM^0clm0!i`pkp`=qaShp63++C9G7os~dxZ}q2> zbGoS%46U4JO3o-+s$MjeTwXOzW-8X4YAKwRI5Sz%QYKlR&2qJ%FwPBbrsDBbN||Te z)Qw_pPA$$dEuB`z4y6vo6&x2>DX-?3rew1hi)z`LGq_%5S~japSCq7PM>_ke!KZai zW5sML{%d0UL^4p1o-0|Pspjk9i$z={<$A(0GL~Lo8p~TM?gwU>)vU<OtNAiRb$k+i z&NHqXTC%eqe?`?UupgC~Y1I=aF`4h_7{A4|di11GoXP7stKNIMsGT?TqBUVyuNvi| zR*!jOswc*apsZ_?#${HlCnlJ+VDQVQY5MgY=fR|s!L3s)$17sMc0>FEvv}pijKz4p z%jKEf6s6&5=gL;jL9jS^aL(fP_W)=nP00W?z&sVy0#hL^$ig#$>(UIsd@V86p@r#Q z>$n!0ia6I1Tt{&oV{!b$yFh6sV3&Y(XsYwNbVZ&@ydfoHybq149FQcjOs}XWmY!Bz znK5{qMW(f!)Jtj6n{LicUt&4SRE!xQ1n{vcB~Va{$~03<@E#n)IxF+Ks+_N2*^AGb zN*WkTXG?nSa-L;fz^O$|v8yzXxZx0=;YL9*ip&KVz3u$uD~igQQZ~zKK3`GthN`L4 zK(1a?X3AC>O%5E*lycTsV7MDr7R2DZ7ZeRknJueaEn1A(5Erw^8HJK+>C<{%w<^kl zp3f_4enG96G_4Xh=5>u}DdmKv<e6$(imDXUBE~_393g0WZ-5**!?0Pz6iv0Ldxc09 z89=PzDO6kn!^<VKLf8a1nUdG1xymaLE@CwV%w$Z>n+7B+y`W##)7jHka!kO@99G^` zc~LLUnhLS<yT<G+Zj@uq9#4;*9C7=MpwEcY=Xh3-UzO{T0y9l@mhnNLA_q`-2Wdh2 zKfI0NPvrL{3upVd5nPmh2H4(m?qz9FzU0E#?S!)?--3pw<K4hwply%9|JWnw@3AOf z{*EN^UQmnJl>MbU9(voNlnJ?Q6)72-s78bkrj=^!Ephd`xa@+8fTj{UBCRCD^{`nk zL2#p)j9%2OOs1aTtYFNO5}eVm)Z;m|q+0^vf@8^0J!G={jJT->3+8M+mdOZl%4AF$ z09NtpZ`kOZQDCD5)iUQtPZ_y#0SeU|wH%E)Vp@<4#z!<`p-8A^d~}`_=SP8t(UOp% zBdNn<qo!`Lk&>Fbj0I~xJ<3QSrAigP6Yr~T-=K3+?nI8G&HMq1FRx0UM!RlA)}lK< zi9YdJ_u#$mp|$Rz<rnXCk6aJl@9w+Ty?3p9@6tPWx)1vAe|)EV6!)FoH=q6e<Dc~p zzMuM|)SdpJ>nHE;-giCpv&2Ktmg*gxK@f{MXWgkzqHBSqCvfq;v?yJo+Li;VNv_VG z(dUKXfhMsyf!Q-ZkWI)8q=b3+R~+m*!a@QA-HW%IO=X3;G;~Tj3wk!_sT<#hx39|l zNt{d?p2GK{tVghD7SCj=gRM*y)#KE?8^u*=Jt6gO`@_W>i?!&Jd>^Vd%$OEl%y<G9 zTg~{AU)s=*j-Nwjz#k8}cCFJA_#gx>1*-*{OVGIGqFR{NXUj&}+?rw59BVS|tMjTF zc<$M1;Mrs{$oF6%BpP@t%VY%R`4H;-EJQP{8F;t}h<5$!^uRMH1QQ2#5RUHkC)fIu zwZ3ny46RK5;_cP9S0+9ls`b27i@vm(xx_ZX+~;wz6?4JFHtd~|X95CfAD@Ca7Xh_7 zV?nWurrm-?@Nr9+MB7C980Xi@LXQ%poFiSTqzlZNOJ{9M2KnPmE9bzk?C?f2=%d&U zwhnHsatS8Wd(CP<tU`O<$D1#!?rcS{JB%L^|H(A~|N9BV@7;KBIrNu_4--p2uJxp9 z(Uf3$vWq{BPIb_<{X^1)naq!1^6cd&VbP2ns-f}BykVKR3_?zX8shu$FsEg%hs6}? zA@UP=l4`mf6`5oCd?o`qBwz^;y)5KVxG16+rH1dJ`0|?cAP^5n*LO;Nd#;YJhhkx6 zIrzDR)B5&~@b0C7hZ0Wfy&d7>OZ(~i_<C<FJi2sx`M^qeCAS){4UMhsKJo>g7!?x~ z^m8EX9j?xLNZMhu8&(M>Lp*_|>c3x5brVK>VU86AV5Z?z%&DeA&IKzP<=Huf>$7uk zl7KDD8lF`_bmX?F!Lw?P6q<v9(^u32mf5Gb(rU4i&R$R#loRL2l~+Lb7;`$MxViu< zgm=P>3t&9b4<}#>H{W*h7BEa0vw0ml13nb3<z^Q>CCIKy6RTl?0{$&bn;)cNn2Hf9 zNc?P0lI|3o5e37Y(2}%d5iD81)Hm>xal0$=Zv)d^x8dOnXld*HMzjzMvkro+7S@6@ zA>j#kT<e;O2(LB@iH`CvG*|zsbzv;>+!Z*fy6wq3{64{FeY|$ei1J+1QVc7G6N4nv z%86n{Q8i7sgA$OU<+SaQI&GA#jXJ|8*2Mbe+JMBy2uW~o!WLx(!*B0?eH$$;?iZXJ za=#YktC6OQB}*05+;Tuncges+waW=%07P&C+G7XE2?<>d3iD^bUI-v5Rd_452nt_f z&>sMKuEe|OCp3u9l~_5ma&Bqg-RSu39Vo<FugVjvv8~}lZ{sO<H2g4KjS*#<fujd# zQN_w~Y9M7G^gstd)eBHv9e)s#!>`H9(UpM@yVfPT{&?FL;`~6AHt2}V2GBi@q<7+> z>Q7q%)f8Y>)JhaM61qt4XDE71Dd&oiDh|hP9uWrF4<Sm9O>iB)6a+e@85xK%%!BYg z5dgQyvJWpWh$aUwM=`Kg;iJKFDt>~$Cww9BDd7`7>hP8MK>m(817q3}Df;{{t&B*@ zKxiZ4V{+SsOG+sM5`hiTqfkZOv&wT6x#&=oW_emDC}t+T01p`hL^L8i67e9}X5UMu z;R$0E#5?FcWzxyM<idL%yB!{<&Q4CA|G@=^;gE5zs7kJET8K4uQo!VvyN;$u*3DIH zCPy4`sil;0vIPJ`4z<HVCphEJH{CBMPWEW4xg6pz44a~5nqD>w+o)nD@E4j^KdV}B zho{RHQ;yA9R>@3{j>7huaQZ30P8oc5^aw=@6g!T3+%;2kRw2LNyC0zx54!@pk#Uyh z>l+>~KK170#HnYovU$RSvtkY=lw)qgh|@4)gT;wS9|3YgBB$aH@b^I84Uj87kW+`R z4Du)*s=nkGcGrDETCAMcgoGmtK&vIz$w3raIY%}mUr9Y;;6$BM@n`s(aTM32e+r%X zthe7ai`2Mb(BG6<><3}B8~V;aHx&v>C>=<xahVF_Qm|5xVR*&5IoH%h-{kTNg#14+ zy<YT2zRp&r_lj%=D35&0u_dm-jfote0=IyZN5fx4VFpobw5)w@D$uj4e@z`J3*)n@ zOFRB?*XZ)^+>IWx4Otq^{I{rRwUo5ZoQl7|-#myySjrfLW4mW54>t|vVcSj~CNp{1 zCQeVc$KYACv~|rkCnh5-$|5ZZNJ>=3gsT>Zs}|ugkW&rtO#s3VOwxc3G@%n`xlt}D zNG)4R!O7ebL`8<iZX@GCezyuGvtakswZ{PO8x~YE01q=ftXxFWQY6qQMT`tWo>Iih zDazR$b2^T|*`{0?^fDKDG#b<htUPrcq4b{Xif@EBMwOwi8C`R|OLz=f_>_~vlzC%z z(|=-G&IC@lI^XB2el3DXkazkB@K<QT{ZX<9d_rz};3GXD|6KaOOWRTE52-efitTkC zJR_E_{i>yuiRNM<=@xAIq+&>@puCK@wj;yM;xkBV<)-sJ5&By^W-2IrB2;_w)!Xmf zF4T5SeiFTSUpaU^bT_)w20ZoLkhY;&(7PV~Z!-&=1T^V{=)~UE^oWRmt2<go?}p}o zk0(q@l3kVV_YBy9`90;(nsTVNZ>-icR*Q~_ktaL1bgSz@0L+fS$zA4$sGy*`y@O4n zDCF^PaAA^XDbz*+YGb$5_Y?)%f$;G1$<HO6)}wOx$mW0=l{P<#SbGJsh?d7uAdL1i zqO^-~X*(WiIlLVWD3n`H+f)KiU?UFy9*PjXKC~m!E0j*3h!1<wsH#}uO-g4bZx|X9 z?*(#05z=EDfjlNk(>GPg*85y=Jk#W!rL#zV@=8Xfou8~76)ZrnAYQZ>66~b9Xp;fq z!Gdnh2`>WrhvIuz;5S62K5Bm5p)7ivXS8uZI}a%;#Lk$|EV!W^5tG5&)38Y(284;} zIq_04e{z@UfL;?Wsd$;+v2liE_wq-vP-o6g-~8BEYHR~F>b*#V89~kidvGIqu~fDe z?I@s~I{UviM~(9QIa2D_Z+WcwStHG7oQXosCJ@zmSg3dUZZ_y!a`J?}`3GDGed{<A z6x-i&uAyDMTFZ3{DT&^JhguGc{77-!ax^mEYmvVxjvJIWfRKn3bDO7;d=7lzZMTp^ z^A(<z{WbwsAUIKd>Qy0G6m)RI4uXVGQI?)p2&2`g3sblSG&g<*MLn*Y*oU^%Vvce0 zJ@{!Vyv&7bAVkv^nTrAO4zUaCnTKD4iuo1_G7ks8^Ks{$gQu>CK8f!7Rp;PM?cVlh z*0w+MQSg(_;ZGBNH_ogjcGvd3e0$ry6R)qGc)j-Wh1!Lw+Mc)WCf@#4yXMK-o{M)A z-`~Qrc$Ss)F}BjY6>XoV*5r=@?g~PC1t$a>0IZl72*S$H5(<WGvNFV(>UJLsd<cAi zHgh+Mt5Tyw>fL`o(R(kkXDzX3Wltj*=#8&SfmmEjV}ot<usV%Lx5~O(gl2KH-^6&- zrk#s-J4bI@(vY3(7RxV?(PbIfeakqyZPUET&{YS0^KK@@zeJNsX-uTOF>R6d{`27S zse1>Gt{pgf@4(5m11IksIDJQXwYKkUt><hlde*kJ{ae~vPFs+|*4Cql4WaX_3a6D8 zc&!IDt5A=5y4gmuXO!z<*d5h+gl#5^#i^*_ZxY*uZQcgkJS_DMk!|h>zbP-j_BpcM zZ_3Dsb#$)>LgDz*#pNR_!C!Q(cGdPDUEA~R|CCVqFz7a~CxYQ|*|FnnHBlRSer@;B zFC?n9;Y%-VZ^#d!WpienK2TsC_(wLF;1GS3PzfhHIH{oOalfap+7V~Tz&<<DFbiyY zjzUrB3h`YA3^CbA6^S(%WZGl5<7=+a&^+nE4e2?dL%){K#-9V3_HY_F>5K__#C6ny z7=cOp$mghS+CiDXw-!$mSwdZF^4!CLodPA`w&wJRX@YbAg$wfl3d$OsMb?0pUf#U7 z(LgNc>}}Aq?N{&uTDEe<u!a%Wf$}~#X?|8BQt)oO`23{#SxJQVfN-_;2KKp;1w(AL zK;H~4aLOx)wbZ=tWFFJ2dW>BQH%Zg-4Nf*I;yK#tQ0G-WFFq1MhRt(UvRN-RxFrdD z4+J_ll)<*XNRw|c-X!P(c(38&af2nF0rwktq9YDFeA>0ew?zn+LQOMhBj@{gZmT4N zvIQN_BK8rE_k+TQfa&>PzWK}X+OFfDM1T9!Z9A4CfBaqS@5i>VY~PIhxiOQN%@79U z+fue;rlGCp;!5RUJE@F)7+YGb^&G5458C?N-q&m^ltOo>@b-G_wELC8<Hu4Y0744z zt)XPn_ZC85hoP^#rM@TZSn8?e@N#bD#pU9fa+HFqrzofzZWmMy+YBeF$z5XGtsZqf zetsUc^$zT)Lee;)N7$YEJ`dKJvZd$El*(ttw<aYOpXs41S@HVL)?OZ2@+j(qt<AJ? zYYJmWd%pPe3X1TD^v*siXh+Z9qoM5uk)IX0PLYigv86C#LX!#hwCK6tM331U%*S~a z1i(AV{0PN*P?qHf&xGXA!-OR7_!nvD-=r7*nSR6Tp+slkYNWCEh&+08ydmM#$jfng z;AU4t!m05@LViuY`BFoob7OA=E$=oYoEqEuaE%6>8qWoBy}Kdd)JXKmhp#U-B%B%t rw#!GT4^EA-gYvk1b5BE}bK`BfLms^jQaCmGd*tDz!smFzUaJ2Fl1*s^ diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/helpers.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/helpers.cpython-312.pyc deleted file mode 100644 index a44fafbf176aead20ed62d1a88b557887be126e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7442 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 diff --git a/venv/lib/python3.12/site-packages/telegram/__pycache__/warnings.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/__pycache__/warnings.cpython-312.pyc deleted file mode 100644 index ff1307746ff6bca63ba7514a13a8761ee22be546..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2578 zcmds3O>7%Q6rTO@Pn;i`gaEDh8Hw;?5!-DVaafs1&>|FmEC}I8=CI!EjO}gKyJlvc zV3R|TazFwkZmCp(5T`^vz%d*U64zdGtbFB;QerMW@!sy*PE+U5D<k>Mn>Wuh?|bup z_Ri#FhQRpy$1m%@1NRp$`Xd=LCm#c|M;IxS8ez)MN?B3KTZE~*glSy8twnleEtKjY zO>m9txAj<_2<1tTr$C+@$W!ffcC2Hr)g4J2K5Mz0+P)W9jwh+@T2gXJTaq(c^#$Fs zgy(oQNgXL$AX{(K0RQMZ>%tQ4d?u66(@id<<9ilkoEZjPyqv$B$!guX_t)OI&YObU zRsh?dL`QX}LA=`X0;j?IqA3u4B)N#!cI<(0QsTwQ<G}0@PRa_nL}f}@V`^D%Ygt_& z<j$WN3gcQ!27Utp42+LZjl$%e1%oF5Aj!GqN*}NoTh4}KRNnl;=1l}47iesxq?X6% zyMC<({-MR8#tVzra($f~=;UIZ<w_>B@EnKX)d!?>km#mO)3X}fG`ktoj9v)%3Df+% zWx4TA$~2j8gLup|rRxXMGzA9E33}^(y-@cXywI=$xmmdG+pPxo0$B*S%WJ}F<YeI3 z8(id=zva2U#keSJa&NN$uUcrfgSzis&0kq8NGIUAre$wfH9q`zVJnV_e6t;TJ|vgm zUO5G1m)uj6iS+RWGClj%ikJjZsPM>-it*jyryo^BQPU5~M}OB*fr@?)T~`t*v=zM= zS&e7}S`m^Lff)eQ0pP?bfT;BVz(Eo(!Op``3kjTHI{XqWSxvIku3k<;`X;I>O9P*3 zC$nQhg}+*#0zK`6*!eMbOi?yWF-X(%LOO<S*DbF$%u)moW0hlAF}fB9$irDn1D}pe zXQ%*p!t0_YjgZ4td>MV&@Yin`6&Z+1)}U*3KG*>}x9W~vhXmxb%B`R!IJ~PIpy4b& z8PCHpB5khZ7YA21xRem4Bd+Z400QR7rfXr<iq4GaIVVTBf<QRyt$_dE&>{4!+D*mY z>89d06EhHXVj4&{DL6cfSF$m>`vZd#*C!On9@$p5i3waZwpCd53pQz!tWr8qhbKZ$ z&?R@PLy5$rz!HJEhK0}ZoWL|Y&yJ3@{{DNQEiVAsA$OmC{%if)iE#REB1~L+U;$`g zYY6Q%fProb_TB*Q?6?Je6?PEanQ@E!pnpiRTIZY9&>c|sDFieYeSw)Lp|pnmjr!Fv zn&S*zfQExgh6N#HRAN6@uxkvWFW!q?UpW<*=fotw8jjAzeu_fY!Zr3VvpT9l#T<ah zD&h&4BzhxuFmw$t9sK*udHxNzKfu2|2V{ppm795Gf9aRvL2*BSs2(o;QT(lVm_K@K z<tQB$_iS3EK~;<)!LJ%Ij${HzSA*lkleoNy<V<NrXNN`ZDlqa@AlN(RptR=6^h-M{ z$GV!B|4BP0Fzwsn^ea2T)p0tRcw4zS+aowf)f!JLfiZY{7l2x>3+-|I)MrK5hPqP^ zetU$qy*tx)=kPlvwCs$@_tV9wA1@1Z4|-O<2IN>%6y@H$rs)4<$oM<TPO6t2Q)a*a itVdw#J(W^sZ%*w`^$0M%OY;iYUOHM>{+A#dn*Se<@};H# diff --git a/venv/lib/python3.12/site-packages/telegram/_birthdate.py b/venv/lib/python3.12/site-packages/telegram/_birthdate.py deleted file mode 100644 index 643af05..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_birthdate.py +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram Birthday.""" -import datetime as dtm -from typing import Optional - -from telegram._telegramobject import TelegramObject -from telegram._utils.types import JSONDict - - -class Birthdate(TelegramObject): - """ - This object describes the birthdate of a user. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`day`, and :attr:`month` are equal. - - .. versionadded:: 21.1 - - Args: - day (:obj:`int`): Day of the user's birth; 1-31. - month (:obj:`int`): Month of the user's birth; 1-12. - year (:obj:`int`, optional): Year of the user's birth. - - Attributes: - day (:obj:`int`): Day of the user's birth; 1-31. - month (:obj:`int`): Month of the user's birth; 1-12. - year (:obj:`int`): Optional. Year of the user's birth. - - """ - - __slots__ = ("day", "month", "year") - - def __init__( - self, - day: int, - month: int, - year: Optional[int] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - - # Required - self.day: int = day - self.month: int = month - # Optional - self.year: Optional[int] = year - - self._id_attrs = ( - self.day, - self.month, - ) - - self._freeze() - - def to_date(self, year: Optional[int] = None) -> dtm.date: - """Return the birthdate as a date object. - - .. versionchanged:: 21.2 - Now returns a :obj:`datetime.date` object instead of a :obj:`datetime.datetime` object, - as was originally intended. - - Args: - year (:obj:`int`, optional): The year to use. Required, if the :attr:`year` was not - present. - - Returns: - :obj:`datetime.date`: The birthdate as a date object. - """ - if self.year is None and year is None: - raise ValueError( - "The `year` argument is required if the `year` attribute was not present." - ) - - return dtm.date(year or self.year, self.month, self.day) # type: ignore[arg-type] diff --git a/venv/lib/python3.12/site-packages/telegram/_bot.py b/venv/lib/python3.12/site-packages/telegram/_bot.py deleted file mode 100644 index 56072fb..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_bot.py +++ /dev/null @@ -1,11388 +0,0 @@ -#!/usr/bin/env python -# pylint: disable=too-many-arguments -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram Bot.""" - -import asyncio -import contextlib -import copy -import datetime as dtm -import pickle -from collections.abc import Sequence -from types import TracebackType -from typing import ( - TYPE_CHECKING, - Any, - Callable, - NoReturn, - Optional, - TypeVar, - Union, - cast, - no_type_check, -) - -try: - from cryptography.hazmat.backends import default_backend - from cryptography.hazmat.primitives import serialization - - CRYPTO_INSTALLED = True -except ImportError: - default_backend = None # type: ignore[assignment] - serialization = None # type: ignore[assignment] - CRYPTO_INSTALLED = False - -from telegram._botcommand import BotCommand -from telegram._botcommandscope import BotCommandScope -from telegram._botdescription import BotDescription, BotShortDescription -from telegram._botname import BotName -from telegram._business import BusinessConnection -from telegram._chatadministratorrights import ChatAdministratorRights -from telegram._chatboost import UserChatBoosts -from telegram._chatfullinfo import ChatFullInfo -from telegram._chatinvitelink import ChatInviteLink -from telegram._chatmember import ChatMember -from telegram._chatpermissions import ChatPermissions -from telegram._files.animation import Animation -from telegram._files.audio import Audio -from telegram._files.chatphoto import ChatPhoto -from telegram._files.contact import Contact -from telegram._files.document import Document -from telegram._files.file import File -from telegram._files.inputmedia import InputMedia, InputPaidMedia -from telegram._files.location import Location -from telegram._files.photosize import PhotoSize -from telegram._files.sticker import MaskPosition, Sticker, StickerSet -from telegram._files.venue import Venue -from telegram._files.video import Video -from telegram._files.videonote import VideoNote -from telegram._files.voice import Voice -from telegram._forumtopic import ForumTopic -from telegram._games.gamehighscore import GameHighScore -from telegram._gifts import AcceptedGiftTypes, Gift, Gifts -from telegram._inline.inlinequeryresultsbutton import InlineQueryResultsButton -from telegram._inline.preparedinlinemessage import PreparedInlineMessage -from telegram._menubutton import MenuButton -from telegram._message import Message -from telegram._messageid import MessageId -from telegram._ownedgift import OwnedGifts -from telegram._payment.stars.staramount import StarAmount -from telegram._payment.stars.startransactions import StarTransactions -from telegram._poll import InputPollOption, Poll -from telegram._reaction import ReactionType, ReactionTypeCustomEmoji, ReactionTypeEmoji -from telegram._reply import ReplyParameters -from telegram._sentwebappmessage import SentWebAppMessage -from telegram._story import Story -from telegram._telegramobject import TelegramObject -from telegram._update import Update -from telegram._user import User -from telegram._userprofilephotos import UserProfilePhotos -from telegram._utils.argumentparsing import parse_lpo_and_dwpp, parse_sequence_arg -from telegram._utils.defaultvalue import DEFAULT_NONE, DefaultValue -from telegram._utils.files import is_local_file, parse_file_input -from telegram._utils.logging import get_logger -from telegram._utils.repr import build_repr_with_selected_attrs -from telegram._utils.strings import to_camel_case -from telegram._utils.types import ( - BaseUrl, - CorrectOptionID, - FileInput, - JSONDict, - ODVInput, - ReplyMarkup, - TimePeriod, -) -from telegram._utils.warnings import warn -from telegram._webhookinfo import WebhookInfo -from telegram.constants import InlineQueryLimit, ReactionEmoji -from telegram.error import EndPointNotFound, InvalidToken -from telegram.request import BaseRequest, RequestData -from telegram.request._httpxrequest import HTTPXRequest -from telegram.request._requestparameter import RequestParameter -from telegram.warnings import PTBUserWarning - -if TYPE_CHECKING: - from telegram import ( - InlineKeyboardMarkup, - InlineQueryResult, - InputFile, - InputMediaAudio, - InputMediaDocument, - InputMediaPhoto, - InputMediaVideo, - InputProfilePhoto, - InputSticker, - InputStoryContent, - LabeledPrice, - LinkPreviewOptions, - MessageEntity, - PassportElementError, - ShippingOption, - StoryArea, - ) - -BT = TypeVar("BT", bound="Bot") - - -# Even though we document only {token} as supported insertion, we are a bit more flexible -# internally and support additional variants. At the very least, we don't want the insertion -# to be case sensitive. -_SUPPORTED_INSERTIONS = {"token", "TOKEN", "bot_token", "BOT_TOKEN", "bot-token", "BOT-TOKEN"} -_INSERTION_STRINGS = {f"{{{insertion}}}" for insertion in _SUPPORTED_INSERTIONS} - - -class _TokenDict(dict): - __slots__ = ("token",) - - # small helper to make .format_map work without knowing which exact insertion name is used - def __init__(self, token: str): - self.token = token - super().__init__() - - def __missing__(self, key: str) -> str: - if key in _SUPPORTED_INSERTIONS: - return self.token - raise KeyError(f"Base URL string contains unsupported insertion: {key}") - - -def _parse_base_url(value: BaseUrl, token: str) -> str: - if callable(value): - return value(token) - if any(insertion in value for insertion in _INSERTION_STRINGS): - return value.format_map(_TokenDict(token)) - return value + token - - -class Bot(TelegramObject, contextlib.AbstractAsyncContextManager["Bot"]): - """This object represents a Telegram Bot. - - Instances of this class can be used as asyncio context managers, where - - .. code:: python - - async with bot: - # code - - is roughly equivalent to - - .. code:: python - - try: - await bot.initialize() - # code - finally: - await bot.shutdown() - - .. seealso:: :meth:`__aenter__` and :meth:`__aexit__`. - - Note: - * Most bot methods have the argument ``api_kwargs`` which allows passing arbitrary keywords - to the Telegram API. This can be used to access new features of the API before they are - incorporated into PTB. The limitations to this argument are the same as the ones - described in :meth:`do_api_request`. - * Bots should not be serialized since if you for e.g. change the bots token, then your - serialized instance will not reflect that change. Trying to pickle a bot instance will - raise :exc:`pickle.PicklingError`. Trying to deepcopy a bot instance will raise - :exc:`TypeError`. - - Examples: - :any:`Raw API Bot <examples.rawapibot>` - - .. seealso:: :wiki:`Your First Bot <Extensions---Your-first-Bot>`, - :wiki:`Builder Pattern <Builder-Pattern>` - - .. versionadded:: 13.2 - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`bot` is equal. - - .. versionchanged:: 20.0 - - * Removed the deprecated methods ``kick_chat_member``, ``kickChatMember``, - ``get_chat_members_count`` and ``getChatMembersCount``. - * Removed the deprecated property ``commands``. - * Removed the deprecated ``defaults`` parameter. If you want to use - :class:`telegram.ext.Defaults`, please use the subclass :class:`telegram.ext.ExtBot` - instead. - * Attempting to pickle a bot instance will now raise :exc:`pickle.PicklingError`. - * Attempting to deepcopy a bot instance will now raise :exc:`TypeError`. - * The following are now keyword-only arguments in Bot methods: - ``location``, ``filename``, ``venue``, ``contact``, - ``{read, write, connect, pool}_timeout``, ``api_kwargs``. Use a named argument for those, - and notice that some positional arguments changed position as a result. - * For uploading files, file paths are now always accepted. If :paramref:`local_mode` is - :obj:`False`, the file contents will be read in binary mode and uploaded. Otherwise, - the file path will be passed in the - `file URI scheme <https://en.wikipedia.org/wiki/File_URI_scheme>`_. - - .. versionchanged:: 20.5 - Removed deprecated methods ``set_sticker_set_thumb`` and ``setStickerSetThumb``. - Use :meth:`set_sticker_set_thumbnail` and :meth:`setStickerSetThumbnail` instead. - - Args: - token (:obj:`str`): Bot's unique authentication token. - base_url (:obj:`str` | Callable[[:obj:`str`], :obj:`str`], optional): Telegram Bot API - service URL. If the string contains ``{token}``, it will be replaced with the bot's - token. If a callable is passed, it will be called with the bot's token as the only - argument and must return the base URL. Otherwise, the token will be appended to the - string. Defaults to ``"https://api.telegram.org/bot"``. - - Tip: - Customizing the base URL can be used to run a bot against - :wiki:`Local Bot API Server <Local-Bot-API-Server>` or using Telegrams - `test environment \ - <https://core.telegram.org/bots/features#dedicated-test-environment>`_. - - Example: - ``"https://api.telegram.org/bot{token}/test"`` - - .. versionchanged:: 21.11 - Supports callable input and string formatting. - base_file_url (:obj:`str`, optional): Telegram Bot API file URL. - If the string contains ``{token}``, it will be replaced with the bot's - token. If a callable is passed, it will be called with the bot's token as the only - argument and must return the base URL. Otherwise, the token will be appended to the - string. Defaults to ``"https://api.telegram.org/bot"``. - - Tip: - Customizing the base URL can be used to run a bot against - :wiki:`Local Bot API Server <Local-Bot-API-Server>` or using Telegrams - `test environment \ - <https://core.telegram.org/bots/features#dedicated-test-environment>`_. - - Example: - ``"https://api.telegram.org/file/bot{token}/test"`` - - .. versionchanged:: 21.11 - Supports callable input and string formatting. - request (:class:`telegram.request.BaseRequest`, optional): Pre initialized - :class:`telegram.request.BaseRequest` instances. Will be used for all bot methods - *except* for :meth:`get_updates`. If not passed, an instance of - :class:`telegram.request.HTTPXRequest` will be used. - get_updates_request (:class:`telegram.request.BaseRequest`, optional): Pre initialized - :class:`telegram.request.BaseRequest` instances. Will be used exclusively for - :meth:`get_updates`. If not passed, an instance of - :class:`telegram.request.HTTPXRequest` will be used. - private_key (:obj:`bytes`, optional): Private key for decryption of telegram passport data. - private_key_password (:obj:`bytes`, optional): Password for above private key. - local_mode (:obj:`bool`, optional): Set to :obj:`True`, if the :paramref:`base_url` is - the URI of a `Local Bot API Server <https://core.telegram.org/bots/api#using-a-local\ - -bot-api-server>`_ that runs with the ``--local`` flag. Currently, the only effect of - this is that files are uploaded using their local path in the - `file URI scheme <https://en.wikipedia.org/wiki/File_URI_scheme>`_. - Defaults to :obj:`False`. - - .. versionadded:: 20.0. - - .. include:: inclusions/bot_methods.rst - - .. |removed_thumb_arg| replace:: Removed deprecated argument ``thumb``. Use - ``thumbnail`` instead. - - """ - - # This is a class variable since we want to override the logger name in ExtBot - # without having to change all places where this is used - _LOGGER = get_logger(__name__) - - __slots__ = ( - "_base_file_url", - "_base_url", - "_bot_user", - "_initialized", - "_local_mode", - "_private_key", - "_request", - "_token", - ) - - def __init__( - self, - token: str, - base_url: BaseUrl = "https://api.telegram.org/bot", - base_file_url: BaseUrl = "https://api.telegram.org/file/bot", - request: Optional[BaseRequest] = None, - get_updates_request: Optional[BaseRequest] = None, - private_key: Optional[bytes] = None, - private_key_password: Optional[bytes] = None, - local_mode: bool = False, - ): - super().__init__(api_kwargs=None) - if not token: - raise InvalidToken("You must pass the token you received from https://t.me/Botfather!") - self._token: str = token - - self._base_url: str = _parse_base_url(base_url, self._token) - self._base_file_url: str = _parse_base_url(base_file_url, self._token) - self._LOGGER.debug("Set Bot API URL: %s", self._base_url) - self._LOGGER.debug("Set Bot API File URL: %s", self._base_file_url) - - self._local_mode: bool = local_mode - self._bot_user: Optional[User] = None - self._private_key: Optional[bytes] = None - self._initialized: bool = False - - self._request: tuple[BaseRequest, BaseRequest] = ( - HTTPXRequest() if get_updates_request is None else get_updates_request, - HTTPXRequest() if request is None else request, - ) - - # this section is about issuing a warning when using HTTP/2 and connect to a self-hosted - # bot api instance, which currently only supports HTTP/1.1. Checking if a custom base url - # is set is the best way to do that. - - warning_string = "" - - if ( - isinstance(self._request[0], HTTPXRequest) - and self._request[0].http_version == "2" - and not self.base_url.startswith("https://api.telegram.org/bot") - ): - warning_string = "get_updates_request" - - if ( - isinstance(self._request[1], HTTPXRequest) - and self._request[1].http_version == "2" - and not self.base_url.startswith("https://api.telegram.org/bot") - ): - if warning_string: - warning_string += " and request" - else: - warning_string = "request" - - if warning_string: - self._warn( - f"You set the HTTP version for the {warning_string} HTTPXRequest instance to " - "HTTP/2. The self hosted bot api instances only support HTTP/1.1. You should " - "either run a HTTP proxy in front of it which supports HTTP/2 or use HTTP/1.1.", - PTBUserWarning, - stacklevel=2, - ) - - if private_key: - if not CRYPTO_INSTALLED: - raise RuntimeError( - "To use Telegram Passports, PTB must be installed via `pip install " - '"python-telegram-bot[passport]"`.' - ) - self._private_key = serialization.load_pem_private_key( - private_key, password=private_key_password, backend=default_backend() - ) - - self._freeze() - - async def __aenter__(self: BT) -> BT: - """ - |async_context_manager| :meth:`initializes <initialize>` the Bot. - - Returns: - The initialized Bot instance. - - Raises: - :exc:`Exception`: If an exception is raised during initialization, :meth:`shutdown` - is called in this case. - """ - try: - await self.initialize() - except Exception: - await self.shutdown() - raise - return self - - async def __aexit__( - self, - exc_type: Optional[type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - """|async_context_manager| :meth:`shuts down <shutdown>` the Bot.""" - # Make sure not to return `True` so that exceptions are not suppressed - # https://docs.python.org/3/reference/datamodel.html?#object.__aexit__ - await self.shutdown() - - def __reduce__(self) -> NoReturn: - """Customizes how :func:`copy.deepcopy` processes objects of this type. Bots can not - be pickled and this method will always raise an exception. - - .. versionadded:: 20.0 - - Raises: - :exc:`pickle.PicklingError` - """ - raise pickle.PicklingError("Bot objects cannot be pickled!") - - def __deepcopy__(self, memodict: dict[int, object]) -> NoReturn: - """Customizes how :func:`copy.deepcopy` processes objects of this type. Bots can not - be deepcopied and this method will always raise an exception. - - .. versionadded:: 20.0 - - Raises: - :exc:`TypeError` - """ - raise TypeError("Bot objects cannot be deepcopied!") - - def __eq__(self, other: object) -> bool: - """Defines equality condition for the :class:`telegram.Bot` object. - Two objects of this class are considered to be equal if their attributes - :attr:`bot` are equal. - - Returns: - :obj:`True` if both attributes :attr:`bot` are equal. :obj:`False` otherwise. - """ - if isinstance(other, Bot): - return self.bot == other.bot - return super().__eq__(other) - - def __hash__(self) -> int: - """See :meth:`telegram.TelegramObject.__hash__`""" - if self._bot_user is None: - return super().__hash__() - return hash((self.bot, Bot)) - - def __repr__(self) -> str: - """Give a string representation of the bot in the form ``Bot[token=...]``. - - As this class doesn't implement :meth:`object.__str__`, the default implementation - will be used, which is equivalent to :meth:`__repr__`. - - Returns: - :obj:`str` - """ - return build_repr_with_selected_attrs(self, token=self.token) - - @property - def token(self) -> str: - """:obj:`str`: Bot's unique authentication token. - - .. versionadded:: 20.0 - """ - return self._token - - @property - def base_url(self) -> str: - """:obj:`str`: Telegram Bot API service URL, built from :paramref:`Bot.base_url` and - :paramref:`Bot.token`. - - .. versionadded:: 20.0 - """ - return self._base_url - - @property - def base_file_url(self) -> str: - """:obj:`str`: Telegram Bot API file URL, built from :paramref:`Bot.base_file_url` and - :paramref:`Bot.token`. - - .. versionadded:: 20.0 - """ - return self._base_file_url - - @property - def local_mode(self) -> bool: - """:obj:`bool`: Whether this bot is running in local mode. - - .. versionadded:: 20.0 - """ - return self._local_mode - - # Proper type hints are difficult because: - # 1. cryptography doesn't have a nice base class, so it would get lengthy - # 2. we can't import cryptography if it's not installed - @property - def private_key(self) -> Optional[Any]: - """Deserialized private key for decryption of telegram passport data. - - .. versionadded:: 20.0 - """ - return self._private_key - - @property - def request(self) -> BaseRequest: - """The :class:`~telegram.request.BaseRequest` object used by this bot. - - Warning: - Requests to the Bot API are made by the various methods of this class. This attribute - should *not* be used manually. - """ - return self._request[1] - - @property - def bot(self) -> User: - """:class:`telegram.User`: User instance for the bot as returned by :meth:`get_me`. - - Warning: - This value is the cached return value of :meth:`get_me`. If the bots profile is - changed during runtime, this value won't reflect the changes until :meth:`get_me` is - called again. - - .. seealso:: :meth:`initialize` - """ - if self._bot_user is None: - raise RuntimeError( - f"{self.__class__.__name__} is not properly initialized. Call " - f"`{self.__class__.__name__}.initialize` before accessing this property." - ) - return self._bot_user - - @property - def id(self) -> int: - """:obj:`int`: Unique identifier for this bot. Shortcut for the corresponding attribute of - :attr:`bot`. - """ - return self.bot.id - - @property - def first_name(self) -> str: - """:obj:`str`: Bot's first name. Shortcut for the corresponding attribute of - :attr:`bot`. - """ - return self.bot.first_name - - @property - def last_name(self) -> str: - """:obj:`str`: Optional. Bot's last name. Shortcut for the corresponding attribute of - :attr:`bot`. - """ - return self.bot.last_name # type: ignore - - @property - def username(self) -> str: - """:obj:`str`: Bot's username. Shortcut for the corresponding attribute of - :attr:`bot`. - """ - return self.bot.username # type: ignore - - @property - def link(self) -> str: - """:obj:`str`: Convenience property. Returns the t.me link of the bot.""" - return f"https://t.me/{self.username}" - - @property - def can_join_groups(self) -> bool: - """:obj:`bool`: Bot's :attr:`telegram.User.can_join_groups` attribute. Shortcut for the - corresponding attribute of :attr:`bot`. - """ - return self.bot.can_join_groups # type: ignore - - @property - def can_read_all_group_messages(self) -> bool: - """:obj:`bool`: Bot's :attr:`telegram.User.can_read_all_group_messages` attribute. - Shortcut for the corresponding attribute of :attr:`bot`. - """ - return self.bot.can_read_all_group_messages # type: ignore - - @property - def supports_inline_queries(self) -> bool: - """:obj:`bool`: Bot's :attr:`telegram.User.supports_inline_queries` attribute. - Shortcut for the corresponding attribute of :attr:`bot`. - """ - return self.bot.supports_inline_queries # type: ignore - - @property - def name(self) -> str: - """:obj:`str`: Bot's @username. Shortcut for the corresponding attribute of :attr:`bot`.""" - return f"@{self.username}" - - @classmethod - def _warn( - cls, - message: Union[str, PTBUserWarning], - category: type[Warning] = PTBUserWarning, - stacklevel: int = 0, - ) -> None: - """Convenience method to issue a warning. This method is here mostly to make it easier - for ExtBot to add 1 level to all warning calls. - """ - warn(message=message, category=category, stacklevel=stacklevel + 1) - - def _parse_file_input( - self, - file_input: Union[FileInput, "TelegramObject"], - tg_type: Optional[type["TelegramObject"]] = None, - filename: Optional[str] = None, - attach: bool = False, - ) -> Union[str, "InputFile", Any]: - return parse_file_input( - file_input=file_input, - tg_type=tg_type, - filename=filename, - attach=attach, - local_mode=self._local_mode, - ) - - def _insert_defaults(self, data: dict[str, object]) -> None: - """This method is here to make ext.Defaults work. Because we need to be able to tell - e.g. `send_message(chat_id, text)` from `send_message(chat_id, text, parse_mode=None)`, the - default values for `parse_mode` etc are not `None` but `DEFAULT_NONE`. While this *could* - be done in ExtBot instead of Bot, shortcuts like `Message.reply_text` need to work for both - Bot and ExtBot, so they also have the `DEFAULT_NONE` default values. - - This makes it necessary to convert `DefaultValue(obj)` to `obj` at some point between - `Message.reply_text` and the request to TG. Doing this here in a centralized manner is a - rather clean and minimally invasive solution, i.e. the link between tg and tg.ext is as - small as possible. - See also _insert_defaults_for_ilq - ExtBot overrides this method to actually insert default values. - - If in the future we come up with a better way of making `Defaults` work, we can cut this - link as well. - """ - # We - # 1) set the correct parse_mode for all InputMedia objects - # 2) replace all DefaultValue instances with the corresponding normal value. - for key, val in data.items(): - # 1) - if isinstance(val, InputMedia): - # Copy object as not to edit it in-place - new = copy.copy(val) - with new._unfrozen(): - new.parse_mode = DefaultValue.get_value(new.parse_mode) - data[key] = new - elif ( - key == "media" - and isinstance(val, Sequence) - and not isinstance(val[0], InputPaidMedia) - ): - # Copy objects as not to edit them in-place - copy_list = [copy.copy(media) for media in val] - for media in copy_list: - with media._unfrozen(): - media.parse_mode = DefaultValue.get_value(media.parse_mode) - data[key] = copy_list - # 2) - else: - data[key] = DefaultValue.get_value(val) - - async def _post( - self, - endpoint: str, - data: Optional[JSONDict] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Any: - # We know that the return type is Union[bool, JSONDict, list[JSONDict]], but it's hard - # to tell mypy which methods expects which of these return values and `Any` saves us a - # lot of `type: ignore` comments - if data is None: - data = {} - - if api_kwargs: - data.update(api_kwargs) - - # Insert is in-place, so no return value for data - self._insert_defaults(data) - - # Drop any None values because Telegram doesn't handle them well - data = {key: value for key, value in data.items() if value is not None} - - return await self._do_post( - endpoint=endpoint, - data=data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - ) - - async def _do_post( - self, - endpoint: str, - data: JSONDict, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - ) -> Union[bool, JSONDict, list[JSONDict]]: - # This also converts datetimes into timestamps. - # We don't do this earlier so that _insert_defaults (see above) has a chance to convert - # to the default timezone in case this is called by ExtBot - request_data = RequestData( - parameters=[RequestParameter.from_input(key, value) for key, value in data.items()], - ) - - request = self._request[0] if endpoint == "getUpdates" else self._request[1] - - self._LOGGER.debug("Calling Bot API endpoint `%s` with parameters `%s`", endpoint, data) - result = await request.post( - url=f"{self._base_url}/{endpoint}", - request_data=request_data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - ) - self._LOGGER.debug( - "Call to Bot API endpoint `%s` finished with return value `%s`", endpoint, result - ) - - return result - - async def _send_message( - self, - endpoint: str, - data: JSONDict, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - caption: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - link_preview_options: ODVInput["LinkPreviewOptions"] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - reply_to_message_id: Optional[int] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Any: - """Protected method to send or edit messages of any type. - - It is here to reduce repetition of if-else closes in the different bot methods, - i.e. this method takes care of adding its parameters to `data` if appropriate. - - Depending on the bot method, returns either `True` or the message. - However, it's hard to tell mypy which methods expects which of these return values and - using `Any` instead saves us a lot of `type: ignore` comments - """ - # We don't check if (DEFAULT_)None here, so that _post is able to insert the defaults - # correctly, if necessary: - if allow_sending_without_reply is not DEFAULT_NONE and reply_parameters is not None: - raise ValueError( - "`allow_sending_without_reply` and `reply_parameters` are mutually exclusive." - ) - - if reply_to_message_id is not None and reply_parameters is not None: - raise ValueError( - "`reply_to_message_id` and `reply_parameters` are mutually exclusive." - ) - - if reply_to_message_id is not None: - reply_parameters = ReplyParameters( - message_id=reply_to_message_id, - allow_sending_without_reply=allow_sending_without_reply, - ) - - data.update( - { - "allow_paid_broadcast": allow_paid_broadcast, - "business_connection_id": business_connection_id, - "caption": caption, - "caption_entities": caption_entities, - "disable_notification": disable_notification, - "link_preview_options": link_preview_options, - "message_thread_id": message_thread_id, - "message_effect_id": message_effect_id, - "parse_mode": parse_mode, - "protect_content": protect_content, - "reply_markup": reply_markup, - "reply_parameters": reply_parameters, - } - ) - - result = await self._post( - endpoint, - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - if result is True: - return result - - return Message.de_json(result, self) - - async def initialize(self) -> None: - """Initialize resources used by this class. Currently calls :meth:`get_me` to - cache :attr:`bot` and calls :meth:`telegram.request.BaseRequest.initialize` for - the request objects used by this bot. - - .. seealso:: :meth:`shutdown` - - .. versionadded:: 20.0 - """ - if self._initialized: - self._LOGGER.debug("This Bot is already initialized.") - return - - await asyncio.gather(self._request[0].initialize(), self._request[1].initialize()) - # this needs to be set before we call get_me, since this can trigger an error in the - # request backend, which would then NOT lead to a proper shutdown if this flag isn't set - self._initialized = True - # Since the bot is to be initialized only once, we can also use it for - # verifying the token passed and raising an exception if it's invalid. - try: - await self.get_me() - except InvalidToken as exc: - raise InvalidToken(f"The token `{self._token}` was rejected by the server.") from exc - - async def shutdown(self) -> None: - """Stop & clear resources used by this class. Currently just calls - :meth:`telegram.request.BaseRequest.shutdown` for the request objects used by this bot. - - .. seealso:: :meth:`initialize` - - .. versionadded:: 20.0 - """ - if not self._initialized: - self._LOGGER.debug("This Bot is already shut down. Returning.") - return - - await asyncio.gather(self._request[0].shutdown(), self._request[1].shutdown()) - self._initialized = False - - async def do_api_request( - self, - endpoint: str, - api_kwargs: Optional[JSONDict] = None, - return_type: Optional[type[TelegramObject]] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - ) -> Any: - """Do a request to the Telegram API. - - This method is here to make it easier to use new API methods that are not yet supported - by this library. - - Hint: - Since PTB does not know which arguments are passed to this method, some caution is - necessary in terms of PTBs utility functionalities. In particular - - * passing objects of any class defined in the :mod:`telegram` module is supported - * when uploading files, a :class:`telegram.InputFile` must be passed as the value for - the corresponding argument. Passing a file path or file-like object will not work. - File paths will work only in combination with :paramref:`~Bot.local_mode`. - * when uploading files, PTB can still correctly determine that - a special write timeout value should be used instead of the default - :paramref:`telegram.request.HTTPXRequest.write_timeout`. - * insertion of default values specified via :class:`telegram.ext.Defaults` will not - work (only relevant for :class:`telegram.ext.ExtBot`). - * The only exception is :class:`telegram.ext.Defaults.tzinfo`, which will be correctly - applied to :class:`datetime.datetime` objects. - - .. versionadded:: 20.8 - - Args: - endpoint (:obj:`str`): The API endpoint to use, e.g. ``getMe`` or ``get_me``. - api_kwargs (:obj:`dict`, optional): The keyword arguments to pass to the API call. - If not specified, no arguments are passed. - return_type (:class:`telegram.TelegramObject`, optional): If specified, the result of - the API call will be deserialized into an instance of this class or tuple of - instances of this class. If not specified, the raw result of the API call will be - returned. - - Returns: - The result of the API call. If :paramref:`return_type` is not specified, this is a - :obj:`dict` or :obj:`bool`, otherwise an instance of :paramref:`return_type` or a - tuple of :paramref:`return_type`. - - Raises: - :class:`telegram.error.TelegramError` - """ - if hasattr(self, endpoint): - self._warn( - ( - f"Please use 'Bot.{endpoint}' instead of " - f"'Bot.do_api_request(\"{endpoint}\", ...)'" - ), - stacklevel=2, - ) - - camel_case_endpoint = to_camel_case(endpoint) - try: - result = await self._post( - camel_case_endpoint, - api_kwargs=api_kwargs, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - ) - except InvalidToken as exc: - # TG returns 404 Not found for - # 1) malformed tokens - # 2) correct tokens but non-existing method, e.g. api.tg.org/botTOKEN/unkonwnMethod - # 2) is relevant only for Bot.do_api_request, that's why we have special handling for - # that here rather than in BaseRequest._request_wrapper - if self._initialized: - raise EndPointNotFound( - f"Endpoint '{camel_case_endpoint}' not found in Bot API" - ) from exc - - raise InvalidToken( - "Either the bot token was rejected by Telegram or the endpoint " - f"'{camel_case_endpoint}' does not exist." - ) from exc - - if return_type is None or isinstance(result, bool): - return result - - if isinstance(result, list): - return return_type.de_list(result, self) - return return_type.de_json(result, self) - - async def get_me( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> User: - """A simple method for testing your bot's auth token. Requires no parameters. - - Returns: - :class:`telegram.User`: A :class:`telegram.User` instance representing that bot if the - credentials are valid, :obj:`None` otherwise. - - Raises: - :class:`telegram.error.TelegramError` - - """ - result = await self._post( - "getMe", - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - self._bot_user = User.de_json(result, self) - return self._bot_user - - async def send_message( - self, - chat_id: Union[int, str], - text: str, - parse_mode: ODVInput[str] = DEFAULT_NONE, - entities: Optional[Sequence["MessageEntity"]] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - protect_content: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - message_thread_id: Optional[int] = None, - link_preview_options: ODVInput["LinkPreviewOptions"] = DEFAULT_NONE, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - reply_to_message_id: Optional[int] = None, - disable_web_page_preview: Optional[bool] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Message: - """Use this method to send text messages. - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - text (:obj:`str`): Text of the message to be sent. Max - :tg-const:`telegram.constants.MessageLimit.MAX_TEXT_LENGTH` characters after - entities parsing. - parse_mode (:obj:`str`): |parse_mode| - entities (Sequence[:class:`telegram.MessageEntity`], optional): Sequence of special - entities that appear in message text, which can be specified instead of - :paramref:`parse_mode`. - - .. versionchanged:: 20.0 - |sequenceargs| - link_preview_options (:obj:`LinkPreviewOptions`, optional): Link preview generation - options for the message. Mutually exclusive with - :paramref:`disable_web_page_preview`. - - .. versionadded:: 20.8 - - disable_notification (:obj:`bool`, optional): |disable_notification| - protect_content (:obj:`bool`, optional): |protect_content| - - .. versionadded:: 13.10 - - reply_markup (:class:`InlineKeyboardMarkup` | :class:`ReplyKeyboardMarkup` | \ - :class:`ReplyKeyboardRemove` | :class:`ForceReply`, optional): - Additional interface options. An object for an inline keyboard, custom reply - keyboard, instructions to remove reply keyboard or to force a reply from the user. - message_thread_id (:obj:`int`, optional): |message_thread_id_arg| - - .. versionadded:: 20.0 - reply_parameters (:class:`telegram.ReplyParameters`, optional): |reply_parameters| - - .. versionadded:: 20.8 - business_connection_id (:obj:`str`, optional): |business_id_str| - - .. versionadded:: 21.1 - message_effect_id (:obj:`str`, optional): |message_effect_id| - - .. versionadded:: 21.3 - allow_paid_broadcast (:obj:`bool`, optional): |allow_paid_broadcast| - - .. versionadded:: 21.7 - - Keyword Args: - allow_sending_without_reply (:obj:`bool`, optional): |allow_sending_without_reply| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - reply_to_message_id (:obj:`int`, optional): |reply_to_msg_id| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - disable_web_page_preview (:obj:`bool`, optional): Disables link previews for links in - this message. Convenience parameter for setting :paramref:`link_preview_options`. - Mutually exclusive with :paramref:`link_preview_options`. - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`link_preview_options` replacing this - argument. PTB will automatically convert this argument to that one, but - for advanced options, please use :paramref:`link_preview_options` directly. - - .. versionchanged:: 21.0 - |keyword_only_arg| - - Returns: - :class:`telegram.Message`: On success, the sent message is returned. - - Raises: - :exc:`ValueError`: If both :paramref:`disable_web_page_preview` and - :paramref:`link_preview_options` are passed. - :class:`telegram.error.TelegramError`: For other errors. - - """ - data: JSONDict = {"chat_id": chat_id, "text": text, "entities": entities} - link_preview_options = parse_lpo_and_dwpp(disable_web_page_preview, link_preview_options) - - return await self._send_message( - "sendMessage", - data, - reply_to_message_id=reply_to_message_id, - disable_notification=disable_notification, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - business_connection_id=business_connection_id, - parse_mode=parse_mode, - link_preview_options=link_preview_options, - reply_parameters=reply_parameters, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def delete_message( - self, - chat_id: Union[str, int], - message_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to delete a message, including service messages, with the following - limitations: - - - A message can only be deleted if it was sent less than 48 hours ago. - - Service messages about a supergroup, channel, or forum topic creation can't be deleted. - - A dice message in a private chat can only be deleted if it was sent more than 24 - hours ago. - - Bots can delete outgoing messages in private chats, groups, and supergroups. - - Bots can delete incoming messages in private chats. - - Bots granted :attr:`~telegram.ChatMemberAdministrator.can_post_messages` permissions - can delete outgoing messages in channels. - - If the bot is an administrator of a group, it can delete any message there. - - If the bot has :attr:`~telegram.ChatMemberAdministrator.can_delete_messages` - permission in a supergroup or a channel, it can delete any message there. - - .. - The method CallbackQuery.delete_message() will not be found when automatically - generating "Shortcuts" admonitions for Bot methods because it has no calls - to Bot methods in its return statement(s). So it is manually included in "See also". - - .. seealso:: - :meth:`telegram.CallbackQuery.delete_message` (calls :meth:`delete_message` - indirectly, via :meth:`telegram.Message.delete`) - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - message_id (:obj:`int`): Identifier of the message to delete. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"chat_id": chat_id, "message_id": message_id} - return await self._post( - "deleteMessage", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def delete_messages( - self, - chat_id: Union[int, str], - message_ids: Sequence[int], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to delete multiple messages simultaneously. If some of the specified - messages can't be found, they are skipped. - - .. versionadded:: 20.8 - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - message_ids (Sequence[:obj:`int`]): A list of - :tg-const:`telegram.constants.BulkRequestLimit.MIN_LIMIT`- - :tg-const:`telegram.constants.BulkRequestLimit.MAX_LIMIT` identifiers of messages - to delete. See :meth:`delete_message` for limitations on which messages can be - deleted. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = {"chat_id": chat_id, "message_ids": message_ids} - return await self._post( - "deleteMessages", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def forward_message( - self, - chat_id: Union[int, str], - from_chat_id: Union[str, int], - message_id: int, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - video_start_timestamp: Optional[int] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Message: - """ - Use this method to forward messages of any kind. Service messages can't be forwarded. - - Note: - Since the release of Bot API 5.5 it can be impossible to forward messages from - some chats. Use the attributes :attr:`telegram.Message.has_protected_content` and - :attr:`telegram.ChatFullInfo.has_protected_content` to check this. - - As a workaround, it is still possible to use :meth:`copy_message`. However, this - behaviour is undocumented and might be changed by Telegram. - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - from_chat_id (:obj:`int` | :obj:`str`): Unique identifier for the chat where the - original message was sent (or channel username in the format ``@channelusername``). - message_id (:obj:`int`): Message identifier in the chat specified in - :paramref:`from_chat_id`. - video_start_timestamp (:obj:`int`, optional): New start timestamp for the - forwarded video in the message - - .. versionadded:: 21.11 - disable_notification (:obj:`bool`, optional): |disable_notification| - protect_content (:obj:`bool`, optional): |protect_content| - - .. versionadded:: 13.10 - message_thread_id (:obj:`int`, optional): |message_thread_id_arg| - - .. versionadded:: 20.0 - - Returns: - :class:`telegram.Message`: On success, the sent Message is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = { - "chat_id": chat_id, - "from_chat_id": from_chat_id, - "message_id": message_id, - "video_start_timestamp": video_start_timestamp, - } - - return await self._send_message( - "forwardMessage", - data, - disable_notification=disable_notification, - protect_content=protect_content, - message_thread_id=message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def forward_messages( - self, - chat_id: Union[int, str], - from_chat_id: Union[str, int], - message_ids: Sequence[int], - disable_notification: ODVInput[bool] = DEFAULT_NONE, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> tuple[MessageId, ...]: - """ - Use this method to forward messages of any kind. If some of the specified messages can't be - found or forwarded, they are skipped. Service messages and messages with protected content - can't be forwarded. Album grouping is kept for forwarded messages. - - .. versionadded:: 20.8 - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - from_chat_id (:obj:`int` | :obj:`str`): Unique identifier for the chat where the - original message was sent (or channel username in the format ``@channelusername``). - message_ids (Sequence[:obj:`int`]): A list of - :tg-const:`telegram.constants.BulkRequestLimit.MIN_LIMIT`- - :tg-const:`telegram.constants.BulkRequestLimit.MAX_LIMIT` identifiers of messages - in the chat :paramref:`from_chat_id` to forward. The identifiers must be specified - in a strictly increasing order. - disable_notification (:obj:`bool`, optional): |disable_notification| - protect_content (:obj:`bool`, optional): |protect_content| - message_thread_id (:obj:`int`, optional): |message_thread_id_arg| - - Returns: - tuple[:class:`telegram.Message`]: On success, a tuple of ``MessageId`` of sent messages - is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = { - "chat_id": chat_id, - "from_chat_id": from_chat_id, - "message_ids": message_ids, - "disable_notification": disable_notification, - "protect_content": protect_content, - "message_thread_id": message_thread_id, - } - - result = await self._post( - "forwardMessages", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - return MessageId.de_list(result, self) - - async def send_photo( - self, - chat_id: Union[int, str], - photo: Union[FileInput, "PhotoSize"], - caption: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - has_spoiler: Optional[bool] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - show_caption_above_media: Optional[bool] = None, - *, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - reply_to_message_id: Optional[int] = None, - filename: Optional[str] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Message: - """Use this method to send photos. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - photo (:obj:`str` | :term:`file object` | :class:`~telegram.InputFile` | :obj:`bytes` \ - | :class:`pathlib.Path` | :class:`telegram.PhotoSize`): Photo to send. - |fileinput| - Lastly you can pass an existing :class:`telegram.PhotoSize` object to send. - - Caution: - * The photo must be at most 10MB in size. - * The photo's width and height must not exceed 10000 in total. - * Width and height ratio must be at most 20. - - .. versionchanged:: 13.2 - Accept :obj:`bytes` as input. - - .. versionchanged:: 20.0 - File paths as input is also accepted for bots *not* running in - :paramref:`~telegram.Bot.local_mode`. - caption (:obj:`str`, optional): Photo caption (may also be used when resending photos - by file_id), 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` - characters after entities parsing. - parse_mode (:obj:`str`, optional): |parse_mode| - caption_entities (Sequence[:class:`telegram.MessageEntity`], optional): - |caption_entities| - - .. versionchanged:: 20.0 - |sequenceargs| - disable_notification (:obj:`bool`, optional): |disable_notification| - protect_content (:obj:`bool`, optional): |protect_content| - - .. versionadded:: 13.10 - message_thread_id (:obj:`int`, optional): |message_thread_id_arg| - - .. versionadded:: 20.0 - - reply_markup (:class:`InlineKeyboardMarkup` | :class:`ReplyKeyboardMarkup` | \ - :class:`ReplyKeyboardRemove` | :class:`ForceReply`, optional): - Additional interface options. An object for an inline keyboard, custom reply - keyboard, instructions to remove reply keyboard or to force a reply from the user. - has_spoiler (:obj:`bool`, optional): Pass :obj:`True` if the photo needs to be covered - with a spoiler animation. - - .. versionadded:: 20.0 - reply_parameters (:class:`telegram.ReplyParameters`, optional): |reply_parameters| - - .. versionadded:: 20.8 - business_connection_id (:obj:`str`, optional): |business_id_str| - - .. versionadded:: 21.1 - message_effect_id (:obj:`str`, optional): |message_effect_id| - - .. versionadded:: 21.3 - allow_paid_broadcast (:obj:`bool`, optional): |allow_paid_broadcast| - - .. versionadded:: 21.7 - show_caption_above_media (:obj:`bool`, optional): Pass |show_cap_above_med| - - .. versionadded:: 21.3 - - Keyword Args: - allow_sending_without_reply (:obj:`bool`, optional): |allow_sending_without_reply| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - reply_to_message_id (:obj:`int`, optional): |reply_to_msg_id| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - filename (:obj:`str`, optional): Custom file name for the photo, when uploading a - new file. Convenience parameter, useful e.g. when sending files generated by the - :obj:`tempfile` module. - - .. versionadded:: 13.1 - - Returns: - :class:`telegram.Message`: On success, the sent Message is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "chat_id": chat_id, - "photo": self._parse_file_input(photo, PhotoSize, filename=filename), - "has_spoiler": has_spoiler, - "show_caption_above_media": show_caption_above_media, - } - - return await self._send_message( - "sendPhoto", - data, - reply_to_message_id=reply_to_message_id, - disable_notification=disable_notification, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - reply_parameters=reply_parameters, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_audio( - self, - chat_id: Union[int, str], - audio: Union[FileInput, "Audio"], - duration: Optional[TimePeriod] = None, - performer: Optional[str] = None, - title: Optional[str] = None, - caption: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - thumbnail: Optional[FileInput] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - reply_to_message_id: Optional[int] = None, - filename: Optional[str] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Message: - """ - Use this method to send audio files, if you want Telegram clients to display them in the - music player. Your audio must be in the ``.mp3`` or ``.m4a`` format. - - Bots can currently send audio files of up to - :tg-const:`telegram.constants.FileSizeLimit.FILESIZE_UPLOAD` in size, this limit may be - changed in the future. - - For sending voice messages, use the :meth:`send_voice` method instead. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - .. versionchanged:: 20.5 - |removed_thumb_arg| - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - audio (:obj:`str` | :term:`file object` | :class:`~telegram.InputFile` | \ - :obj:`bytes` | :class:`pathlib.Path` | :class:`telegram.Audio`): Audio file to - send. |fileinput| - Lastly you can pass an existing :class:`telegram.Audio` object to send. - - .. versionchanged:: 13.2 - Accept :obj:`bytes` as input. - - .. versionchanged:: 20.0 - File paths as input is also accepted for bots *not* running in - :paramref:`~telegram.Bot.local_mode`. - caption (:obj:`str`, optional): Audio caption, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters after - entities parsing. - parse_mode (:obj:`str`, optional): |parse_mode| - caption_entities (Sequence[:class:`telegram.MessageEntity`], optional): - |caption_entities| - - .. versionchanged:: 20.0 - |sequenceargs| - duration (:obj:`int` | :class:`datetime.timedelta`, optional): Duration of sent audio - in seconds. - - .. versionchanged:: 21.11 - |time-period-input| - performer (:obj:`str`, optional): Performer. - title (:obj:`str`, optional): Track name. - disable_notification (:obj:`bool`, optional): |disable_notification| - protect_content (:obj:`bool`, optional): |protect_content| - - .. versionadded:: 13.10 - message_thread_id (:obj:`int`, optional): |message_thread_id_arg| - - .. versionadded:: 20.0 - - reply_markup (:class:`InlineKeyboardMarkup` | :class:`ReplyKeyboardMarkup` | \ - :class:`ReplyKeyboardRemove` | :class:`ForceReply`, optional): - Additional interface options. An object for an inline keyboard, custom reply - keyboard, instructions to remove reply keyboard or to force a reply from the user. - thumbnail (:term:`file object` | :obj:`bytes` | :class:`pathlib.Path` | :obj:`str`, \ - optional): |thumbdocstring| - - .. versionadded:: 20.2 - reply_parameters (:obj:`ReplyParameters`, optional): |reply_parameters| - - .. versionadded:: 20.8 - business_connection_id (:obj:`str`, optional): |business_id_str| - - .. versionadded:: 21.1 - message_effect_id (:obj:`str`, optional): |message_effect_id| - - .. versionadded:: 21.3 - allow_paid_broadcast (:obj:`bool`, optional): |allow_paid_broadcast| - - .. versionadded:: 21.7 - - Keyword Args: - allow_sending_without_reply (:obj:`bool`, optional): |allow_sending_without_reply| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - reply_to_message_id (:obj:`int`, optional): |reply_to_msg_id| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - filename (:obj:`str`, optional): Custom file name for the audio, when uploading a - new file. Convenience parameter, useful e.g. when sending files generated by the - :obj:`tempfile` module. - - .. versionadded:: 13.1 - - Returns: - :class:`telegram.Message`: On success, the sent Message is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "chat_id": chat_id, - "audio": self._parse_file_input(audio, Audio, filename=filename), - "duration": duration, - "performer": performer, - "title": title, - "thumbnail": self._parse_file_input(thumbnail, attach=True) if thumbnail else None, - } - - return await self._send_message( - "sendAudio", - data, - reply_to_message_id=reply_to_message_id, - disable_notification=disable_notification, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - reply_parameters=reply_parameters, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_document( - self, - chat_id: Union[int, str], - document: Union[FileInput, "Document"], - caption: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - disable_content_type_detection: Optional[bool] = None, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - thumbnail: Optional[FileInput] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - reply_to_message_id: Optional[int] = None, - filename: Optional[str] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Message: - """ - Use this method to send general files. - - Bots can currently send files of any type of up to - :tg-const:`telegram.constants.FileSizeLimit.FILESIZE_UPLOAD` in size, this limit may be - changed in the future. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - .. versionchanged:: 20.5 - |removed_thumb_arg| - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - document (:obj:`str` | :term:`file object` | :class:`~telegram.InputFile` | \ - :obj:`bytes` | :class:`pathlib.Path` | :class:`telegram.Document`): File to send. - |fileinput| - Lastly you can pass an existing :class:`telegram.Document` object to send. - - Note: - Sending by URL will currently only work ``GIF``, ``PDF`` & ``ZIP`` files. - - .. versionchanged:: 13.2 - Accept :obj:`bytes` as input. - - .. versionchanged:: 20.0 - File paths as input is also accepted for bots *not* running in - :paramref:`~telegram.Bot.local_mode`. - caption (:obj:`str`, optional): Document caption (may also be used when resending - documents by file_id), 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` - characters after entities parsing. - disable_content_type_detection (:obj:`bool`, optional): Disables automatic server-side - content type detection for files uploaded using multipart/form-data. - parse_mode (:obj:`str`, optional): |parse_mode| - caption_entities (Sequence[:class:`telegram.MessageEntity`], optional): - |caption_entities| - - .. versionchanged:: 20.0 - |sequenceargs| - disable_notification (:obj:`bool`, optional): |disable_notification| - protect_content (:obj:`bool`, optional): |protect_content| - - .. versionadded:: 13.10 - message_thread_id (:obj:`int`, optional): |message_thread_id_arg| - - .. versionadded:: 20.0 - - reply_markup (:class:`InlineKeyboardMarkup` | :class:`ReplyKeyboardMarkup` | \ - :class:`ReplyKeyboardRemove` | :class:`ForceReply`, optional): - Additional interface options. An object for an inline keyboard, custom reply - keyboard, instructions to remove reply keyboard or to force a reply from the user. - thumbnail (:term:`file object` | :obj:`bytes` | :class:`pathlib.Path` | :obj:`str`, \ - optional): |thumbdocstring| - - .. versionadded:: 20.2 - reply_parameters (:class:`telegram.ReplyParameters`, optional): |reply_parameters| - - .. versionadded:: 20.8 - business_connection_id (:obj:`str`, optional): |business_id_str| - - .. versionadded:: 21.1 - message_effect_id (:obj:`str`, optional): |message_effect_id| - - .. versionadded:: 21.3 - allow_paid_broadcast (:obj:`bool`, optional): |allow_paid_broadcast| - - .. versionadded:: 21.7 - - Keyword Args: - allow_sending_without_reply (:obj:`bool`, optional): |allow_sending_without_reply| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - reply_to_message_id (:obj:`int`, optional): |reply_to_msg_id| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - filename (:obj:`str`, optional): Custom file name for the document, when uploading a - new file. Convenience parameter, useful e.g. when sending files generated by the - :obj:`tempfile` module. - - Returns: - :class:`telegram.Message`: On success, the sent Message is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "chat_id": chat_id, - "document": self._parse_file_input(document, Document, filename=filename), - "disable_content_type_detection": disable_content_type_detection, - "thumbnail": self._parse_file_input(thumbnail, attach=True) if thumbnail else None, - } - - return await self._send_message( - "sendDocument", - data, - reply_to_message_id=reply_to_message_id, - disable_notification=disable_notification, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - reply_parameters=reply_parameters, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_sticker( - self, - chat_id: Union[int, str], - sticker: Union[FileInput, "Sticker"], - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - emoji: Optional[str] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - reply_to_message_id: Optional[int] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Message: - """ - Use this method to send static ``.WEBP``, animated ``.TGS``, or video ``.WEBM`` stickers. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - sticker (:obj:`str` | :term:`file object` | :class:`~telegram.InputFile` | \ - :obj:`bytes` | :class:`pathlib.Path` | :class:`telegram.Sticker`): Sticker to send. - |fileinput| Video stickers can only be sent by a ``file_id``. Video and animated - stickers can't be sent via an HTTP URL. - - Lastly you can pass an existing :class:`telegram.Sticker` object to send. - - .. versionchanged:: 13.2 - Accept :obj:`bytes` as input. - - .. versionchanged:: 20.0 - File paths as input is also accepted for bots *not* running in - :paramref:`~telegram.Bot.local_mode`. - emoji (:obj:`str`, optional): Emoji associated with the sticker; only for just - uploaded stickers - - .. versionadded:: 20.2 - disable_notification (:obj:`bool`, optional): |disable_notification| - protect_content (:obj:`bool`, optional): |protect_content| - - .. versionadded:: 13.10 - message_thread_id (:obj:`int`, optional): |message_thread_id_arg| - - .. versionadded:: 20.0 - - reply_markup (:class:`InlineKeyboardMarkup` | :class:`ReplyKeyboardMarkup` | \ - :class:`ReplyKeyboardRemove` | :class:`ForceReply`, optional): - Additional interface options. An object for an inline keyboard, custom reply - keyboard, instructions to remove reply keyboard or to force a reply from the user. - reply_parameters (:class:`telegram.ReplyParameters`, optional): |reply_parameters| - - .. versionadded:: 20.8 - business_connection_id (:obj:`str`, optional): |business_id_str| - - .. versionadded:: 21.1 - message_effect_id (:obj:`str`, optional): |message_effect_id| - - .. versionadded:: 21.3 - allow_paid_broadcast (:obj:`bool`, optional): |allow_paid_broadcast| - - .. versionadded:: 21.7 - - Keyword Args: - allow_sending_without_reply (:obj:`bool`, optional): |allow_sending_without_reply| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - reply_to_message_id (:obj:`int`, optional): |reply_to_msg_id| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - - Returns: - :class:`telegram.Message`: On success, the sent Message is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "chat_id": chat_id, - "sticker": self._parse_file_input(sticker, Sticker), - "emoji": emoji, - } - return await self._send_message( - "sendSticker", - data, - reply_to_message_id=reply_to_message_id, - disable_notification=disable_notification, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - reply_parameters=reply_parameters, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_video( - self, - chat_id: Union[int, str], - video: Union[FileInput, "Video"], - duration: Optional[TimePeriod] = None, - caption: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - width: Optional[int] = None, - height: Optional[int] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - supports_streaming: Optional[bool] = None, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - has_spoiler: Optional[bool] = None, - thumbnail: Optional[FileInput] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - show_caption_above_media: Optional[bool] = None, - cover: Optional[FileInput] = None, - start_timestamp: Optional[int] = None, - *, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - reply_to_message_id: Optional[int] = None, - filename: Optional[str] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Message: - """Use this method to send video files, Telegram clients support mp4 videos - (other formats may be sent as Document). - - Bots can currently send video files of up to - :tg-const:`telegram.constants.FileSizeLimit.FILESIZE_UPLOAD` in size, this limit may be - changed in the future. - - Note: - :paramref:`thumbnail` will be ignored for small video files, for which Telegram can - easily generate thumbnails. However, this behaviour is undocumented and might be - changed by Telegram. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - .. versionchanged:: 20.5 - |removed_thumb_arg| - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - video (:obj:`str` | :term:`file object` | :class:`~telegram.InputFile` | :obj:`bytes` \ - | :class:`pathlib.Path` | :class:`telegram.Video`): Video file to send. - |fileinput| - Lastly you can pass an existing :class:`telegram.Video` object to send. - - .. versionchanged:: 13.2 - Accept :obj:`bytes` as input. - - .. versionchanged:: 20.0 - File paths as input is also accepted for bots *not* running in - :paramref:`~telegram.Bot.local_mode`. - duration (:obj:`int` | :class:`datetime.timedelta`, optional): Duration of sent video - in seconds. - - .. versionchanged:: 21.11 - |time-period-input| - width (:obj:`int`, optional): Video width. - height (:obj:`int`, optional): Video height. - cover (:term:`file object` | :obj:`bytes` | :class:`pathlib.Path` | :obj:`str`, \ - optional): Cover for the video in the message. |fileinputnopath| - - .. versionadded:: 21.11 - start_timestamp (:obj:`int`, optional): Start timestamp for the video in the message. - - .. versionadded:: 21.11 - caption (:obj:`str`, optional): Video caption (may also be used when resending videos - by file_id), 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` - characters after entities parsing. - parse_mode (:obj:`str`, optional): |parse_mode| - caption_entities (Sequence[:class:`telegram.MessageEntity`], optional): - |caption_entities| - - .. versionchanged:: 20.0 - |sequenceargs| - supports_streaming (:obj:`bool`, optional): Pass :obj:`True`, if the uploaded video is - suitable for streaming. - disable_notification (:obj:`bool`, optional): |disable_notification| - protect_content (:obj:`bool`, optional): |protect_content| - - .. versionadded:: 13.10 - message_thread_id (:obj:`int`, optional): |message_thread_id_arg| - - .. versionadded:: 20.0 - - reply_markup (:class:`InlineKeyboardMarkup` | :class:`ReplyKeyboardMarkup` | \ - :class:`ReplyKeyboardRemove` | :class:`ForceReply`, optional): - Additional interface options. An object for an inline keyboard, custom reply - keyboard, instructions to remove reply keyboard or to force a reply from the user. - has_spoiler (:obj:`bool`, optional): Pass :obj:`True` if the video needs to be covered - with a spoiler animation. - - .. versionadded:: 20.0 - thumbnail (:term:`file object` | :obj:`bytes` | :class:`pathlib.Path` | :obj:`str`, \ - optional): |thumbdocstring| - - .. versionadded:: 20.2 - reply_parameters (:class:`telegram.ReplyParameters`, optional): |reply_parameters| - - .. versionadded:: 20.8 - business_connection_id (:obj:`str`, optional): |business_id_str| - - .. versionadded:: 21.1 - message_effect_id (:obj:`str`, optional): |message_effect_id| - - .. versionadded:: 21.3 - allow_paid_broadcast (:obj:`bool`, optional): |allow_paid_broadcast| - - .. versionadded:: 21.7 - show_caption_above_media (:obj:`bool`, optional): Pass |show_cap_above_med| - - .. versionadded:: 21.3 - - Keyword Args: - allow_sending_without_reply (:obj:`bool`, optional): |allow_sending_without_reply| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - reply_to_message_id (:obj:`int`, optional): |reply_to_msg_id| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - filename (:obj:`str`, optional): Custom file name for the video, when uploading a - new file. Convenience parameter, useful e.g. when sending files generated by the - :obj:`tempfile` module. - - .. versionadded:: 13.1 - - Returns: - :class:`telegram.Message`: On success, the sent Message is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "chat_id": chat_id, - "video": self._parse_file_input(video, Video, filename=filename), - "duration": duration, - "width": width, - "height": height, - "supports_streaming": supports_streaming, - "cover": self._parse_file_input(cover, attach=True) if cover else None, - "start_timestamp": start_timestamp, - "thumbnail": self._parse_file_input(thumbnail, attach=True) if thumbnail else None, - "has_spoiler": has_spoiler, - "show_caption_above_media": show_caption_above_media, - } - - return await self._send_message( - "sendVideo", - data, - reply_to_message_id=reply_to_message_id, - disable_notification=disable_notification, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - reply_parameters=reply_parameters, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_video_note( - self, - chat_id: Union[int, str], - video_note: Union[FileInput, "VideoNote"], - duration: Optional[TimePeriod] = None, - length: Optional[int] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - thumbnail: Optional[FileInput] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - reply_to_message_id: Optional[int] = None, - filename: Optional[str] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Message: - """ - As of v.4.0, Telegram clients support rounded square mp4 videos of up to 1 minute long. - Use this method to send video messages. - - Note: - :paramref:`thumbnail` will be ignored for small video files, for which Telegram can - easily generate thumbnails. However, this behaviour is undocumented and might be - changed by Telegram. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - .. versionchanged:: 20.5 - |removed_thumb_arg| - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - video_note (:obj:`str` | :term:`file object` | :class:`~telegram.InputFile` | \ - :obj:`bytes` | :class:`pathlib.Path` | :class:`telegram.VideoNote`): Video note - to send. - Pass a file_id as String to send a video note that exists on the Telegram - servers (recommended) or upload a new video using multipart/form-data. - |uploadinput| - Lastly you can pass an existing :class:`telegram.VideoNote` object to send. - Sending video notes by a URL is currently unsupported. - - .. versionchanged:: 13.2 - Accept :obj:`bytes` as input. - - .. versionchanged:: 20.0 - File paths as input is also accepted for bots *not* running in - :paramref:`~telegram.Bot.local_mode`. - duration (:obj:`int` | :class:`datetime.timedelta`, optional): Duration of sent video - in seconds. - - .. versionchanged:: 21.11 - |time-period-input| - length (:obj:`int`, optional): Video width and height, i.e. diameter of the video - message. - disable_notification (:obj:`bool`, optional): |disable_notification| - protect_content (:obj:`bool`, optional): |protect_content| - - .. versionadded:: 13.10 - message_thread_id (:obj:`int`, optional): |message_thread_id_arg| - - .. versionadded:: 20.0 - - reply_markup (:class:`InlineKeyboardMarkup` | :class:`ReplyKeyboardMarkup` | \ - :class:`ReplyKeyboardRemove` | :class:`ForceReply`, optional): - Additional interface options. An object for an inline keyboard, custom reply - keyboard, instructions to remove reply keyboard or to force a reply from the user. - thumbnail (:term:`file object` | :obj:`bytes` | :class:`pathlib.Path` | :obj:`str`, \ - optional): |thumbdocstring| - - .. versionadded:: 20.2 - reply_parameters (:class:`telegram.ReplyParameters`, optional): |reply_parameters| - - .. versionadded:: 20.8 - business_connection_id (:obj:`str`, optional): |business_id_str| - - .. versionadded:: 21.1 - message_effect_id (:obj:`str`, optional): |message_effect_id| - - .. versionadded:: 21.3 - allow_paid_broadcast (:obj:`bool`, optional): |allow_paid_broadcast| - - .. versionadded:: 21.7 - - Keyword Args: - allow_sending_without_reply (:obj:`bool`, optional): |allow_sending_without_reply| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - reply_to_message_id (:obj:`int`, optional): |reply_to_msg_id| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - filename (:obj:`str`, optional): Custom file name for the video note, when uploading a - new file. Convenience parameter, useful e.g. when sending files generated by the - :obj:`tempfile` module. - - .. versionadded:: 13.1 - - Returns: - :class:`telegram.Message`: On success, the sent Message is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "chat_id": chat_id, - "video_note": self._parse_file_input(video_note, VideoNote, filename=filename), - "duration": duration, - "length": length, - "thumbnail": self._parse_file_input(thumbnail, attach=True) if thumbnail else None, - } - - return await self._send_message( - "sendVideoNote", - data, - reply_to_message_id=reply_to_message_id, - disable_notification=disable_notification, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - reply_parameters=reply_parameters, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_animation( - self, - chat_id: Union[int, str], - animation: Union[FileInput, "Animation"], - duration: Optional[TimePeriod] = None, - width: Optional[int] = None, - height: Optional[int] = None, - caption: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - has_spoiler: Optional[bool] = None, - thumbnail: Optional[FileInput] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - show_caption_above_media: Optional[bool] = None, - *, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - reply_to_message_id: Optional[int] = None, - filename: Optional[str] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Message: - """ - Use this method to send animation files (GIF or H.264/MPEG-4 AVC video without sound). - Bots can currently send animation files of up to - :tg-const:`telegram.constants.FileSizeLimit.FILESIZE_UPLOAD` in size, this limit may be - changed in the future. - - Note: - :paramref:`thumbnail` will be ignored for small files, for which Telegram can easily - generate thumbnails. However, this behaviour is undocumented and might be changed - by Telegram. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - .. versionchanged:: 20.5 - |removed_thumb_arg| - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - animation (:obj:`str` | :term:`file object` | :class:`~telegram.InputFile` | \ - :obj:`bytes` | :class:`pathlib.Path` | :class:`telegram.Animation`): Animation to - send. |fileinput| - Lastly you can pass an existing :class:`telegram.Animation` object to send. - - .. versionchanged:: 13.2 - Accept :obj:`bytes` as input. - duration (:obj:`int` | :class:`datetime.timedelta`, optional): Duration of sent - animation in seconds. - - .. versionchanged:: 21.11 - |time-period-input| - width (:obj:`int`, optional): Animation width. - height (:obj:`int`, optional): Animation height. - caption (:obj:`str`, optional): Animation caption (may also be used when resending - animations by file_id), - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters after - entities parsing. - parse_mode (:obj:`str`, optional): |parse_mode| - caption_entities (Sequence[:class:`telegram.MessageEntity`], optional): - |caption_entities| - - .. versionchanged:: 20.0 - |sequenceargs| - disable_notification (:obj:`bool`, optional): |disable_notification| - protect_content (:obj:`bool`, optional): |protect_content| - - .. versionadded:: 13.10 - message_thread_id (:obj:`int`, optional): |message_thread_id_arg| - - .. versionadded:: 20.0 - - reply_markup (:class:`InlineKeyboardMarkup` | :class:`ReplyKeyboardMarkup` | \ - :class:`ReplyKeyboardRemove` | :class:`ForceReply`, optional): - Additional interface options. An object for an inline keyboard, custom reply - keyboard, instructions to remove reply keyboard or to force a reply from the user. - has_spoiler (:obj:`bool`, optional): Pass :obj:`True` if the animation needs to be - covered with a spoiler animation. - - .. versionadded:: 20.0 - thumbnail (:term:`file object` | :obj:`bytes` | :class:`pathlib.Path` | :obj:`str`, \ - optional): |thumbdocstring| - - .. versionadded:: 20.2 - reply_parameters (:class:`telegram.ReplyParameters`, optional): |reply_parameters| - - .. versionadded:: 20.8 - business_connection_id (:obj:`str`, optional): |business_id_str| - - .. versionadded:: 21.1 - message_effect_id (:obj:`str`, optional): |message_effect_id| - - .. versionadded:: 21.3 - allow_paid_broadcast (:obj:`bool`, optional): |allow_paid_broadcast| - - .. versionadded:: 21.7 - show_caption_above_media (:obj:`bool`, optional): Pass |show_cap_above_med| - - .. versionadded:: 21.3 - - Keyword Args: - allow_sending_without_reply (:obj:`bool`, optional): |allow_sending_without_reply| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - reply_to_message_id (:obj:`int`, optional): |reply_to_msg_id| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - filename (:obj:`str`, optional): Custom file name for the animation, when uploading a - new file. Convenience parameter, useful e.g. when sending files generated by the - :obj:`tempfile` module. - - .. versionadded:: 13.1 - - Returns: - :class:`telegram.Message`: On success, the sent Message is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "chat_id": chat_id, - "animation": self._parse_file_input(animation, Animation, filename=filename), - "duration": duration, - "width": width, - "height": height, - "thumbnail": self._parse_file_input(thumbnail, attach=True) if thumbnail else None, - "has_spoiler": has_spoiler, - "show_caption_above_media": show_caption_above_media, - } - - return await self._send_message( - "sendAnimation", - data, - reply_to_message_id=reply_to_message_id, - disable_notification=disable_notification, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - reply_parameters=reply_parameters, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_voice( - self, - chat_id: Union[int, str], - voice: Union[FileInput, "Voice"], - duration: Optional[TimePeriod] = None, - caption: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - reply_to_message_id: Optional[int] = None, - filename: Optional[str] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Message: - """ - Use this method to send audio files, if you want Telegram clients to display the file - as a playable voice message. For this to work, your audio must be in an ``.ogg`` file - encoded with OPUS , or in .MP3 format, or in .M4A format (other formats may be sent as - :class:`~telegram.Audio` or :class:`~telegram.Document`). Bots can currently send voice - messages of up to :tg-const:`telegram.constants.FileSizeLimit.FILESIZE_UPLOAD` in size, - this limit may be changed in the future. - - Note: - To use this method, the file must have the type :mimetype:`audio/ogg` and be no more - than :tg-const:`telegram.constants.FileSizeLimit.VOICE_NOTE_FILE_SIZE` in size. - :tg-const:`telegram.constants.FileSizeLimit.VOICE_NOTE_FILE_SIZE`- - :tg-const:`telegram.constants.FileSizeLimit.FILESIZE_DOWNLOAD` voice notes will be - sent as files. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - voice (:obj:`str` | :term:`file object` | :class:`~telegram.InputFile` | :obj:`bytes` \ - | :class:`pathlib.Path` | :class:`telegram.Voice`): Voice file to send. - |fileinput| - Lastly you can pass an existing :class:`telegram.Voice` object to send. - - .. versionchanged:: 13.2 - Accept :obj:`bytes` as input. - - .. versionchanged:: 20.0 - File paths as input is also accepted for bots *not* running in - :paramref:`~telegram.Bot.local_mode`. - caption (:obj:`str`, optional): Voice message caption, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters after - entities parsing. - parse_mode (:obj:`str`, optional): |parse_mode| - caption_entities (Sequence[:class:`telegram.MessageEntity`], optional): - |caption_entities| - - .. versionchanged:: 20.0 - |sequenceargs| - duration (:obj:`int` | :class:`datetime.timedelta`, optional): Duration of the voice - message in seconds. - - .. versionchanged:: 21.11 - |time-period-input| - disable_notification (:obj:`bool`, optional): |disable_notification| - protect_content (:obj:`bool`, optional): |protect_content| - - .. versionadded:: 13.10 - message_thread_id (:obj:`int`, optional): |message_thread_id_arg| - - .. versionadded:: 20.0 - - reply_markup (:class:`InlineKeyboardMarkup` | :class:`ReplyKeyboardMarkup` | \ - :class:`ReplyKeyboardRemove` | :class:`ForceReply`, optional): - Additional interface options. An object for an inline keyboard, custom reply - keyboard, instructions to remove reply keyboard or to force a reply from the user. - reply_parameters (:class:`telegram.ReplyParameters`, optional): |reply_parameters| - - .. versionadded:: 20.8 - business_connection_id (:obj:`str`, optional): |business_id_str| - - .. versionadded:: 21.1 - message_effect_id (:obj:`str`, optional): |message_effect_id| - - .. versionadded:: 21.3 - allow_paid_broadcast (:obj:`bool`, optional): |allow_paid_broadcast| - - .. versionadded:: 21.7 - - Keyword Args: - allow_sending_without_reply (:obj:`bool`, optional): |allow_sending_without_reply| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - reply_to_message_id (:obj:`int`, optional): |reply_to_msg_id| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - filename (:obj:`str`, optional): Custom file name for the voice, when uploading a - new file. Convenience parameter, useful e.g. when sending files generated by the - :obj:`tempfile` module. - - .. versionadded:: 13.1 - - Returns: - :class:`telegram.Message`: On success, the sent Message is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "chat_id": chat_id, - "voice": self._parse_file_input(voice, Voice, filename=filename), - "duration": duration, - } - - return await self._send_message( - "sendVoice", - data, - reply_to_message_id=reply_to_message_id, - disable_notification=disable_notification, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - reply_parameters=reply_parameters, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_media_group( - self, - chat_id: Union[int, str], - media: Sequence[ - Union["InputMediaAudio", "InputMediaDocument", "InputMediaPhoto", "InputMediaVideo"] - ], - disable_notification: ODVInput[bool] = DEFAULT_NONE, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - reply_to_message_id: Optional[int] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - caption: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - ) -> tuple[Message, ...]: - """Use this method to send a group of photos, videos, documents or audios as an album. - Documents and audio files can be only grouped in an album with messages of the same type. - - Note: - If you supply a :paramref:`caption` (along with either :paramref:`parse_mode` or - :paramref:`caption_entities`), then items in :paramref:`media` must have no captions, - and vice versa. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - .. versionchanged:: 20.0 - Returns a tuple instead of a list. - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - media (Sequence[:class:`telegram.InputMediaAudio`,\ - :class:`telegram.InputMediaDocument`, :class:`telegram.InputMediaPhoto`,\ - :class:`telegram.InputMediaVideo`]): An array - describing messages to be sent, must include - :tg-const:`telegram.constants.MediaGroupLimit.MIN_MEDIA_LENGTH`- - :tg-const:`telegram.constants.MediaGroupLimit.MAX_MEDIA_LENGTH` items. - - .. versionchanged:: 20.0 - |sequenceargs| - disable_notification (:obj:`bool`, optional): |disable_notification| - protect_content (:obj:`bool`, optional): |protect_content| - - .. versionadded:: 13.10 - message_thread_id (:obj:`int`, optional): |message_thread_id_arg| - - .. versionadded:: 20.0 - - reply_parameters (:class:`telegram.ReplyParameters`, optional): |reply_parameters| - - .. versionadded:: 20.8 - business_connection_id (:obj:`str`, optional): |business_id_str| - - .. versionadded:: 21.1 - message_effect_id (:obj:`str`, optional): |message_effect_id| - - .. versionadded:: 21.3 - allow_paid_broadcast (:obj:`bool`, optional): |allow_paid_broadcast| - - .. versionadded:: 21.7 - - Keyword Args: - allow_sending_without_reply (:obj:`bool`, optional): |allow_sending_without_reply| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - reply_to_message_id (:obj:`int`, optional): |reply_to_msg_id| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - caption (:obj:`str`, optional): Caption that will be added to the - first element of :paramref:`media`, so that it will be used as caption for the - whole media group. - Defaults to :obj:`None`. - - .. versionadded:: 20.0 - parse_mode (:obj:`str` | :obj:`None`, optional): - Parse mode for :paramref:`caption`. - See the constants in :class:`telegram.constants.ParseMode` for the - available modes. - - .. versionadded:: 20.0 - caption_entities (Sequence[:class:`telegram.MessageEntity`], optional): - List of special entities for :paramref:`caption`, - which can be specified instead of :paramref:`parse_mode`. - Defaults to :obj:`None`. - - .. versionadded:: 20.0 - - Returns: - tuple[:class:`telegram.Message`]: An array of the sent Messages. - - Raises: - :class:`telegram.error.TelegramError` - """ - if caption and any( - [ - any(item.caption for item in media), - any(item.caption_entities for item in media), - # if parse_mode was set explicitly, even to None, error must be raised - any(item.parse_mode is not DEFAULT_NONE for item in media), - ] - ): - raise ValueError("You can only supply either group caption or media with captions.") - - if caption: - # Copy first item (to avoid mutation of original object), apply group caption to it. - # This will lead to the group being shown with this caption. - item_to_get_caption = copy.copy(media[0]) - with item_to_get_caption._unfrozen(): - item_to_get_caption.caption = caption - if parse_mode is not DEFAULT_NONE: - item_to_get_caption.parse_mode = parse_mode - item_to_get_caption.caption_entities = parse_sequence_arg(caption_entities) - - # copy the list (just the references) to avoid mutating the original list - media = list(media) - media[0] = item_to_get_caption - - if allow_sending_without_reply is not DEFAULT_NONE and reply_parameters is not None: - raise ValueError( - "`allow_sending_without_reply` and `reply_parameters` are mutually exclusive." - ) - - if reply_to_message_id is not None and reply_parameters is not None: - raise ValueError( - "`reply_to_message_id` and `reply_parameters` are mutually exclusive." - ) - - if reply_to_message_id is not None: - reply_parameters = ReplyParameters( - message_id=reply_to_message_id, - allow_sending_without_reply=allow_sending_without_reply, - ) - - data: JSONDict = { - "chat_id": chat_id, - "media": media, - "disable_notification": disable_notification, - "protect_content": protect_content, - "message_thread_id": message_thread_id, - "reply_parameters": reply_parameters, - "business_connection_id": business_connection_id, - "message_effect_id": message_effect_id, - "allow_paid_broadcast": allow_paid_broadcast, - } - - result = await self._post( - "sendMediaGroup", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - return Message.de_list(result, self) - - async def send_location( - self, - chat_id: Union[int, str], - latitude: Optional[float] = None, - longitude: Optional[float] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - live_period: Optional[TimePeriod] = None, - horizontal_accuracy: Optional[float] = None, - heading: Optional[int] = None, - proximity_alert_radius: Optional[int] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - reply_to_message_id: Optional[int] = None, - location: Optional[Location] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Message: - """Use this method to send point on the map. - - Note: - You can either supply a :paramref:`latitude` and :paramref:`longitude` or a - :paramref:`location`. - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - latitude (:obj:`float`, optional): Latitude of location. - longitude (:obj:`float`, optional): Longitude of location. - horizontal_accuracy (:obj:`int`, optional): The radius of uncertainty for the location, - measured in meters; - 0-:tg-const:`telegram.constants.LocationLimit.HORIZONTAL_ACCURACY`. - live_period (:obj:`int` | :class:`datetime.timedelta`, optional): Period in seconds for - which the location will be - updated, should be between - :tg-const:`telegram.constants.LocationLimit.MIN_LIVE_PERIOD` and - :tg-const:`telegram.constants.LocationLimit.MAX_LIVE_PERIOD`, or - :tg-const:`telegram.constants.LocationLimit.LIVE_PERIOD_FOREVER` for live - locations that can be edited indefinitely. - - .. versionchanged:: 21.11 - |time-period-input| - heading (:obj:`int`, optional): For live locations, a direction in which the user is - moving, in degrees. Must be between - :tg-const:`telegram.constants.LocationLimit.MIN_HEADING` and - :tg-const:`telegram.constants.LocationLimit.MAX_HEADING` if specified. - proximity_alert_radius (:obj:`int`, optional): For live locations, a maximum distance - for proximity alerts about approaching another chat member, in meters. Must be - between :tg-const:`telegram.constants.LocationLimit.MIN_PROXIMITY_ALERT_RADIUS` - and :tg-const:`telegram.constants.LocationLimit.MAX_PROXIMITY_ALERT_RADIUS` - if specified. - disable_notification (:obj:`bool`, optional): |disable_notification| - protect_content (:obj:`bool`, optional): |protect_content| - - .. versionadded:: 13.10 - message_thread_id (:obj:`int`, optional): |message_thread_id_arg| - - .. versionadded:: 20.0 - - reply_markup (:class:`InlineKeyboardMarkup` | :class:`ReplyKeyboardMarkup` | \ - :class:`ReplyKeyboardRemove` | :class:`ForceReply`, optional): - Additional interface options. An object for an inline keyboard, custom reply - keyboard, instructions to remove reply keyboard or to force a reply from the user. - reply_parameters (:class:`telegram.ReplyParameters`, optional): |reply_parameters| - - .. versionadded:: 20.8 - business_connection_id (:obj:`str`, optional): |business_id_str| - - .. versionadded:: 21.1 - message_effect_id (:obj:`str`, optional): |message_effect_id| - - .. versionadded:: 21.3 - allow_paid_broadcast (:obj:`bool`, optional): |allow_paid_broadcast| - - .. versionadded:: 21.7 - - Keyword Args: - allow_sending_without_reply (:obj:`bool`, optional): |allow_sending_without_reply| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - reply_to_message_id (:obj:`int`, optional): |reply_to_msg_id| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - location (:class:`telegram.Location`, optional): The location to send. - - Returns: - :class:`telegram.Message`: On success, the sent Message is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - if not ((latitude is not None and longitude is not None) or location): - raise ValueError( - "Either location or latitude and longitude must be passed as argument." - ) - - if not (latitude is not None or longitude is not None) ^ bool(location): - raise ValueError( - "Either location or latitude and longitude must be passed as argument. Not both." - ) - - if isinstance(location, Location): - latitude = location.latitude - longitude = location.longitude - - data: JSONDict = { - "chat_id": chat_id, - "latitude": latitude, - "longitude": longitude, - "horizontal_accuracy": horizontal_accuracy, - "live_period": live_period, - "heading": heading, - "proximity_alert_radius": proximity_alert_radius, - } - - return await self._send_message( - "sendLocation", - data, - reply_to_message_id=reply_to_message_id, - disable_notification=disable_notification, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - reply_parameters=reply_parameters, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def edit_message_live_location( - self, - chat_id: Optional[Union[str, int]] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - latitude: Optional[float] = None, - longitude: Optional[float] = None, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - horizontal_accuracy: Optional[float] = None, - heading: Optional[int] = None, - proximity_alert_radius: Optional[int] = None, - live_period: Optional[TimePeriod] = None, - business_connection_id: Optional[str] = None, - *, - location: Optional[Location] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Union[Message, bool]: - """Use this method to edit live location messages sent by the bot or via the bot - (for inline bots). A location can be edited until its :attr:`telegram.Location.live_period` - expires or editing is explicitly disabled by a call to :meth:`stop_message_live_location`. - - Note: - You can either supply a :paramref:`latitude` and :paramref:`longitude` or a - :paramref:`location`. - - Args: - chat_id (:obj:`int` | :obj:`str`, optional): Required if :paramref:`inline_message_id` - is not specified. |chat_id_channel| - message_id (:obj:`int`, optional): Required if :paramref:`inline_message_id` is not - specified. Identifier of the message to edit. - inline_message_id (:obj:`str`, optional): Required if :paramref:`chat_id` and - :paramref:`message_id` are not specified. Identifier of the inline message. - latitude (:obj:`float`, optional): Latitude of location. - longitude (:obj:`float`, optional): Longitude of location. - horizontal_accuracy (:obj:`float`, optional): The radius of uncertainty for the - location, measured in meters; - 0-:tg-const:`telegram.constants.LocationLimit.HORIZONTAL_ACCURACY`. - heading (:obj:`int`, optional): Direction in which the user is moving, in degrees. Must - be between :tg-const:`telegram.constants.LocationLimit.MIN_HEADING` - and :tg-const:`telegram.constants.LocationLimit.MAX_HEADING` if specified. - proximity_alert_radius (:obj:`int`, optional): Maximum distance for proximity alerts - about approaching another chat member, in meters. Must be between - :tg-const:`telegram.constants.LocationLimit.MIN_PROXIMITY_ALERT_RADIUS` - and :tg-const:`telegram.constants.LocationLimit.MAX_PROXIMITY_ALERT_RADIUS` - if specified. - reply_markup (:class:`telegram.InlineKeyboardMarkup`, optional): An object for a new - inline keyboard. - live_period (:obj:`int` | :class:`datetime.timedelta`, optional): New period in seconds - during which the location - can be updated, starting from the message send date. If - :tg-const:`telegram.constants.LocationLimit.LIVE_PERIOD_FOREVER` is specified, - then the location can be updated forever. Otherwise, the new value must not exceed - the current ``live_period`` by more than a day, and the live location expiration - date must remain within the next 90 days. If not specified, then ``live_period`` - remains unchanged - - .. versionadded:: 21.2. - - .. versionchanged:: 21.11 - |time-period-input| - business_connection_id (:obj:`str`, optional): |business_id_str_edit| - - .. versionadded:: 21.4 - - Keyword Args: - location (:class:`telegram.Location`, optional): The location to send. - - Returns: - :class:`telegram.Message`: On success, if edited message is not an inline message, the - edited message is returned, otherwise :obj:`True` is returned. - """ - # The location parameter is a convenience functionality added by us, so enforcing the - # mutual exclusivity here is nothing that Telegram would handle anyway - if not (all([latitude, longitude]) or location): - raise ValueError( - "Either location or latitude and longitude must be passed as argument." - ) - if not (latitude is not None or longitude is not None) ^ bool(location): - raise ValueError( - "Either location or latitude and longitude must be passed as argument. Not both." - ) - - if isinstance(location, Location): - latitude = location.latitude - longitude = location.longitude - - data: JSONDict = { - "latitude": latitude, - "longitude": longitude, - "chat_id": chat_id, - "message_id": message_id, - "inline_message_id": inline_message_id, - "horizontal_accuracy": horizontal_accuracy, - "heading": heading, - "proximity_alert_radius": proximity_alert_radius, - "live_period": live_period, - } - - return await self._send_message( - "editMessageLiveLocation", - data, - reply_markup=reply_markup, - business_connection_id=business_connection_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def stop_message_live_location( - self, - chat_id: Optional[Union[str, int]] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - business_connection_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Union[Message, bool]: - """Use this method to stop updating a live location message sent by the bot or via the bot - (for inline bots) before :paramref:`~telegram.Location.live_period` expires. - - Args: - chat_id (:obj:`int` | :obj:`str`, optional): Required if :paramref:`inline_message_id` - is not specified. |chat_id_channel| - message_id (:obj:`int`, optional): Required if :paramref:`inline_message_id` is not - specified. Identifier of the sent message with live location to stop. - inline_message_id (:obj:`str`, optional): Required if :paramref:`chat_id` and - :paramref:`message_id` are not specified. Identifier of the inline message. - reply_markup (:class:`telegram.InlineKeyboardMarkup`, optional): An object for a new - inline keyboard. - business_connection_id (:obj:`str`, optional): |business_id_str_edit| - - .. versionadded:: 21.4 - - Returns: - :class:`telegram.Message`: On success, if edited message is not an inline message, the - edited message is returned, otherwise :obj:`True` is returned. - """ - data: JSONDict = { - "chat_id": chat_id, - "message_id": message_id, - "inline_message_id": inline_message_id, - } - - return await self._send_message( - "stopMessageLiveLocation", - data, - reply_markup=reply_markup, - business_connection_id=business_connection_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def send_venue( - self, - chat_id: Union[int, str], - latitude: Optional[float] = None, - longitude: Optional[float] = None, - title: Optional[str] = None, - address: Optional[str] = None, - foursquare_id: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - foursquare_type: Optional[str] = None, - google_place_id: Optional[str] = None, - google_place_type: Optional[str] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - reply_to_message_id: Optional[int] = None, - venue: Optional[Venue] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Message: - """Use this method to send information about a venue. - - Note: - * You can either supply :paramref:`venue`, or :paramref:`latitude`, - :paramref:`longitude`, :paramref:`title` and :paramref:`address` and optionally - :paramref:`foursquare_id` and :paramref:`foursquare_type` or optionally - :paramref:`google_place_id` and :paramref:`google_place_type`. - * Foursquare details and Google Place details are mutually exclusive. However, this - behaviour is undocumented and might be changed by Telegram. - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - latitude (:obj:`float`, optional): Latitude of venue. - longitude (:obj:`float`, optional): Longitude of venue. - title (:obj:`str`, optional): Name of the venue. - address (:obj:`str`, optional): Address of the venue. - foursquare_id (:obj:`str`, optional): Foursquare identifier of the venue. - foursquare_type (:obj:`str`, optional): Foursquare type of the venue, if known. - (For example, "arts_entertainment/default", "arts_entertainment/aquarium" or - "food/icecream".) - google_place_id (:obj:`str`, optional): Google Places identifier of the venue. - google_place_type (:obj:`str`, optional): Google Places type of the venue. (See - `supported types \ - <https://developers.google.com/maps/documentation/places/web-service/supported_types>`_.) - disable_notification (:obj:`bool`, optional): |disable_notification| - protect_content (:obj:`bool`, optional): |protect_content| - - .. versionadded:: 13.10 - message_thread_id (:obj:`int`, optional): |message_thread_id_arg| - - .. versionadded:: 20.0 - - reply_markup (:class:`InlineKeyboardMarkup` | :class:`ReplyKeyboardMarkup` | \ - :class:`ReplyKeyboardRemove` | :class:`ForceReply`, optional): - Additional interface options. An object for an inline keyboard, custom reply - keyboard, instructions to remove reply keyboard or to force a reply from the user. - reply_parameters (:class:`telegram.ReplyParameters`, optional): |reply_parameters| - - .. versionadded:: 20.8 - business_connection_id (:obj:`str`, optional): |business_id_str| - - .. versionadded:: 21.1 - message_effect_id (:obj:`str`, optional): |message_effect_id| - - .. versionadded:: 21.3 - allow_paid_broadcast (:obj:`bool`, optional): |allow_paid_broadcast| - - .. versionadded:: 21.7 - - Keyword Args: - allow_sending_without_reply (:obj:`bool`, optional): |allow_sending_without_reply| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - reply_to_message_id (:obj:`int`, optional): |reply_to_msg_id| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - venue (:class:`telegram.Venue`, optional): The venue to send. - - Returns: - :class:`telegram.Message`: On success, the sent Message is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - # The venue parameter is a convenience functionality added by us, so enforcing the - # mutual exclusivity here is nothing that Telegram would handle anyway - if not (venue or all([latitude, longitude, address, title])): - raise ValueError( - "Either venue or latitude, longitude, address and title must be " - "passed as arguments." - ) - if not bool(venue) ^ any([latitude, longitude, address, title]): - raise ValueError( - "Either venue or latitude, longitude, address and title must be " - "passed as arguments. Not both." - ) - - if isinstance(venue, Venue): - latitude = venue.location.latitude - longitude = venue.location.longitude - address = venue.address - title = venue.title - foursquare_id = venue.foursquare_id - foursquare_type = venue.foursquare_type - google_place_id = venue.google_place_id - google_place_type = venue.google_place_type - - data: JSONDict = { - "chat_id": chat_id, - "latitude": latitude, - "longitude": longitude, - "address": address, - "title": title, - "foursquare_id": foursquare_id, - "foursquare_type": foursquare_type, - "google_place_id": google_place_id, - "google_place_type": google_place_type, - } - - return await self._send_message( - "sendVenue", - data, - reply_to_message_id=reply_to_message_id, - disable_notification=disable_notification, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - reply_parameters=reply_parameters, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_contact( - self, - chat_id: Union[int, str], - phone_number: Optional[str] = None, - first_name: Optional[str] = None, - last_name: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - vcard: Optional[str] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - reply_to_message_id: Optional[int] = None, - contact: Optional[Contact] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Message: - """Use this method to send phone contacts. - - Note: - You can either supply :paramref:`contact` or :paramref:`phone_number` and - :paramref:`first_name` with optionally :paramref:`last_name` and optionally - :paramref:`vcard`. - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - phone_number (:obj:`str`, optional): Contact's phone number. - first_name (:obj:`str`, optional): Contact's first name. - last_name (:obj:`str`, optional): Contact's last name. - vcard (:obj:`str`, optional): Additional data about the contact in the form of a vCard, - 0-:tg-const:`telegram.constants.ContactLimit.VCARD` bytes. - disable_notification (:obj:`bool`, optional): |disable_notification| - protect_content (:obj:`bool`, optional): |protect_content| - - .. versionadded:: 13.10 - message_thread_id (:obj:`int`, optional): |message_thread_id_arg| - - .. versionadded:: 20.0 - - reply_markup (:class:`InlineKeyboardMarkup` | :class:`ReplyKeyboardMarkup` | \ - :class:`ReplyKeyboardRemove` | :class:`ForceReply`, optional): - Additional interface options. An object for an inline keyboard, custom reply - keyboard, instructions to remove reply keyboard or to force a reply from the user. - reply_parameters (:class:`telegram.ReplyParameters`, optional): |reply_parameters| - - .. versionadded:: 20.8 - business_connection_id (:obj:`str`, optional): |business_id_str| - - .. versionadded:: 21.1 - message_effect_id (:obj:`str`, optional): |message_effect_id| - - .. versionadded:: 21.3 - allow_paid_broadcast (:obj:`bool`, optional): |allow_paid_broadcast| - - .. versionadded:: 21.7 - - Keyword Args: - allow_sending_without_reply (:obj:`bool`, optional): |allow_sending_without_reply| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - reply_to_message_id (:obj:`int`, optional): |reply_to_msg_id| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - contact (:class:`telegram.Contact`, optional): The contact to send. - - Returns: - :class:`telegram.Message`: On success, the sent Message is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - # The contact parameter is a convenience functionality added by us, so enforcing the - # mutual exclusivity here is nothing that Telegram would handle anyway - if (not contact) and (not all([phone_number, first_name])): - raise ValueError( - "Either contact or phone_number and first_name must be passed as arguments." - ) - if not bool(contact) ^ any([phone_number, first_name]): - raise ValueError( - "Either contact or phone_number and first_name must be passed as arguments. " - "Not both." - ) - - if isinstance(contact, Contact): - phone_number = contact.phone_number - first_name = contact.first_name - last_name = contact.last_name - vcard = contact.vcard - - data: JSONDict = { - "chat_id": chat_id, - "phone_number": phone_number, - "first_name": first_name, - "last_name": last_name, - "vcard": vcard, - } - - return await self._send_message( - "sendContact", - data, - reply_to_message_id=reply_to_message_id, - disable_notification=disable_notification, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - reply_parameters=reply_parameters, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_game( - self, - chat_id: int, - game_short_name: str, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - reply_to_message_id: Optional[int] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Message: - """Use this method to send a game. - - Args: - chat_id (:obj:`int`): Unique identifier for the target chat. - game_short_name (:obj:`str`): Short name of the game, serves as the unique identifier - for the game. Set up your games via `@BotFather <https://t.me/BotFather>`_. - disable_notification (:obj:`bool`, optional): |disable_notification| - protect_content (:obj:`bool`, optional): |protect_content| - - .. versionadded:: 13.10 - message_thread_id (:obj:`int`, optional): |message_thread_id_arg| - - .. versionadded:: 20.0 - - reply_markup (:class:`telegram.InlineKeyboardMarkup`, optional): An object for a new - inline keyboard. If empty, one "Play game_title" button will be - shown. If not empty, the first button must launch the game. - reply_parameters (:class:`telegram.ReplyParameters`, optional): |reply_parameters| - - .. versionadded:: 20.8 - business_connection_id (:obj:`str`, optional): |business_id_str| - - .. versionadded:: 21.1 - message_effect_id (:obj:`str`, optional): |message_effect_id| - - .. versionadded:: 21.3 - allow_paid_broadcast (:obj:`bool`, optional): |allow_paid_broadcast| - - .. versionadded:: 21.7 - - Keyword Args: - allow_sending_without_reply (:obj:`bool`, optional): |allow_sending_without_reply| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - reply_to_message_id (:obj:`int`, optional): |reply_to_msg_id| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - - Returns: - :class:`telegram.Message`: On success, the sent Message is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"chat_id": chat_id, "game_short_name": game_short_name} - - return await self._send_message( - "sendGame", - data, - reply_to_message_id=reply_to_message_id, - disable_notification=disable_notification, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - reply_parameters=reply_parameters, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_chat_action( - self, - chat_id: Union[str, int], - action: str, - message_thread_id: Optional[int] = None, - business_connection_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method when you need to tell the user that something is happening on the bot's - side. The status is set for 5 seconds or less (when a message arrives from your bot, - Telegram clients clear its typing status). Telegram only recommends using this method when - a response from the bot will take a noticeable amount of time to arrive. - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - action(:obj:`str`): Type of action to broadcast. Choose one, depending on what the user - is about to receive. For convenience look at the constants in - :class:`telegram.constants.ChatAction`. - message_thread_id (:obj:`int`, optional): |message_thread_id_arg| - - .. versionadded:: 20.0 - business_connection_id (:obj:`str`, optional): |business_id_str| - - .. versionadded:: 21.1 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "chat_id": chat_id, - "action": action, - "message_thread_id": message_thread_id, - "business_connection_id": business_connection_id, - } - return await self._post( - "sendChatAction", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - def _effective_inline_results( - self, - results: Union[ - Sequence["InlineQueryResult"], Callable[[int], Optional[Sequence["InlineQueryResult"]]] - ], - next_offset: Optional[str] = None, - current_offset: Optional[str] = None, - ) -> tuple[Sequence["InlineQueryResult"], Optional[str]]: - """ - Builds the effective results from the results input. - We make this a stand-alone method so tg.ext.ExtBot can wrap it. - - Returns: - Tuple of 1. the effective results and 2. correct the next_offset - - """ - if current_offset is not None and next_offset is not None: - raise ValueError("`current_offset` and `next_offset` are mutually exclusive!") - - if current_offset is not None: - # Convert the string input to integer - current_offset_int = 0 if not current_offset else int(current_offset) - - # for now set to empty string, stating that there are no more results - # might change later - next_offset = "" - - if callable(results): - callable_output = results(current_offset_int) - if not callable_output: - effective_results: Sequence[InlineQueryResult] = [] - else: - effective_results = callable_output - # the callback *might* return more results on the next call, so we increment - # the page count - next_offset = str(current_offset_int + 1) - - elif len(results) > (current_offset_int + 1) * InlineQueryLimit.RESULTS: - # we expect more results for the next page - next_offset_int = current_offset_int + 1 - next_offset = str(next_offset_int) - effective_results = results[ - current_offset_int - * InlineQueryLimit.RESULTS : next_offset_int - * InlineQueryLimit.RESULTS - ] - else: - effective_results = results[current_offset_int * InlineQueryLimit.RESULTS :] - else: - effective_results = results # type: ignore[assignment] - - return effective_results, next_offset - - @no_type_check # mypy doesn't play too well with hasattr - def _insert_defaults_for_ilq_results(self, res: "InlineQueryResult") -> "InlineQueryResult": - """The reason why this method exists is similar to the description of _insert_defaults - The reason why we do this in rather than in _insert_defaults is because converting - DEFAULT_NONE to NONE *before* calling to_dict() makes it way easier to drop None entries - from the json data. - - Must return the correct object instead of editing in-place! - """ - # Copy the objects that need modification to avoid modifying the original object - copied = False - if hasattr(res, "parse_mode"): - res = copy.copy(res) - copied = True - with res._unfrozen(): - res.parse_mode = DefaultValue.get_value(res.parse_mode) - if hasattr(res, "input_message_content") and res.input_message_content: - if hasattr(res.input_message_content, "parse_mode"): - if not copied: - res = copy.copy(res) - copied = True - - with res._unfrozen(): - res.input_message_content = copy.copy(res.input_message_content) - with res.input_message_content._unfrozen(): - res.input_message_content.parse_mode = DefaultValue.get_value( - res.input_message_content.parse_mode - ) - if hasattr(res.input_message_content, "link_preview_options"): - if not copied: - res = copy.copy(res) - - with res._unfrozen(): - res.input_message_content = copy.copy(res.input_message_content) - with res.input_message_content._unfrozen(): - res.input_message_content.link_preview_options = DefaultValue.get_value( - res.input_message_content.link_preview_options - ) - - return res - - async def answer_inline_query( - self, - inline_query_id: str, - results: Union[ - Sequence["InlineQueryResult"], Callable[[int], Optional[Sequence["InlineQueryResult"]]] - ], - cache_time: Optional[TimePeriod] = None, - is_personal: Optional[bool] = None, - next_offset: Optional[str] = None, - button: Optional[InlineQueryResultsButton] = None, - *, - current_offset: Optional[str] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to send answers to an inline query. No more than - :tg-const:`telegram.InlineQuery.MAX_RESULTS` results per query are allowed. - - Warning: - In most use cases :paramref:`current_offset` should not be passed manually. Instead of - calling this method directly, use the shortcut :meth:`telegram.InlineQuery.answer` with - :paramref:`telegram.InlineQuery.answer.auto_pagination` set to :obj:`True`, which will - take care of passing the correct value. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - - .. versionchanged:: 20.5 - Removed deprecated arguments ``switch_pm_text`` and ``switch_pm_parameter``. - - Args: - inline_query_id (:obj:`str`): Unique identifier for the answered query. - results (list[:class:`telegram.InlineQueryResult`] | Callable): A list of results for - the inline query. In case :paramref:`current_offset` is passed, - :paramref:`results` may also be - a callable that accepts the current page index starting from 0. It must return - either a list of :class:`telegram.InlineQueryResult` instances or :obj:`None` if - there are no more results. - cache_time (:obj:`int` | :class:`datetime.timedelta`, optional): The maximum amount of - time in seconds that the - result of the inline query may be cached on the server. Defaults to ``300``. - - .. versionchanged:: 21.11 - |time-period-input| - is_personal (:obj:`bool`, optional): Pass :obj:`True`, if results may be cached on - the server side only for the user that sent the query. By default, - results may be returned to any user who sends the same query. - next_offset (:obj:`str`, optional): Pass the offset that a client should send in the - next query with the same text to receive more results. Pass an empty string if - there are no more results or if you don't support pagination. Offset length can't - exceed :tg-const:`telegram.InlineQuery.MAX_OFFSET_LENGTH` bytes. - button (:class:`telegram.InlineQueryResultsButton`, optional): A button to be shown - above the inline query results. - - .. versionadded:: 20.3 - - Keyword Args: - current_offset (:obj:`str`, optional): The :attr:`telegram.InlineQuery.offset` of - the inline query to answer. If passed, PTB will automatically take care of - the pagination for you, i.e. pass the correct :paramref:`next_offset` and truncate - the results list/get the results from the callable you passed. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - effective_results, next_offset = self._effective_inline_results( - results=results, next_offset=next_offset, current_offset=current_offset - ) - - # Apply defaults - effective_results = [ - self._insert_defaults_for_ilq_results(result) for result in effective_results - ] - - data: JSONDict = { - "inline_query_id": inline_query_id, - "results": effective_results, - "next_offset": next_offset, - "cache_time": cache_time, - "is_personal": is_personal, - "button": button, - } - - return await self._post( - "answerInlineQuery", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def save_prepared_inline_message( - self, - user_id: int, - result: "InlineQueryResult", - allow_user_chats: Optional[bool] = None, - allow_bot_chats: Optional[bool] = None, - allow_group_chats: Optional[bool] = None, - allow_channel_chats: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> PreparedInlineMessage: - """Stores a message that can be sent by a user of a Mini App. - - .. versionadded:: 21.8 - - Args: - user_id (:obj:`int`): Unique identifier of the target user that can use the prepared - message. - result (:class:`telegram.InlineQueryResult`): The result to store. - allow_user_chats (:obj:`bool`, optional): Pass :obj:`True` if the message can be sent - to private chats with users - allow_bot_chats (:obj:`bool`, optional): Pass :obj:`True` if the message can be sent - to private chats with bots - allow_group_chats (:obj:`bool`, optional): Pass :obj:`True` if the message can be sent - to group and supergroup chats - allow_channel_chats (:obj:`bool`, optional): Pass :obj:`True` if the message can be - sent to channels - - Returns: - :class:`telegram.PreparedInlineMessage`: On success, the prepared message is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = { - "user_id": user_id, - "result": result, - "allow_user_chats": allow_user_chats, - "allow_bot_chats": allow_bot_chats, - "allow_group_chats": allow_group_chats, - "allow_channel_chats": allow_channel_chats, - } - return PreparedInlineMessage.de_json( - await self._post( - "savePreparedInlineMessage", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ), - self, - ) - - async def get_user_profile_photos( - self, - user_id: int, - offset: Optional[int] = None, - limit: Optional[int] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> UserProfilePhotos: - """Use this method to get a list of profile pictures for a user. - - Args: - user_id (:obj:`int`): Unique identifier of the target user. - offset (:obj:`int`, optional): Sequential number of the first photo to be returned. - By default, all photos are returned. - limit (:obj:`int`, optional): Limits the number of photos to be retrieved. Values - between :tg-const:`telegram.constants.UserProfilePhotosLimit.MIN_LIMIT`- - :tg-const:`telegram.constants.UserProfilePhotosLimit.MAX_LIMIT` are accepted. - Defaults to ``100``. - - Returns: - :class:`telegram.UserProfilePhotos` - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"user_id": user_id, "offset": offset, "limit": limit} - - result = await self._post( - "getUserProfilePhotos", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - return UserProfilePhotos.de_json(result, self) - - async def get_file( - self, - file_id: Union[ - str, Animation, Audio, ChatPhoto, Document, PhotoSize, Sticker, Video, VideoNote, Voice - ], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> File: - """ - Use this method to get basic info about a file and prepare it for downloading. For the - moment, bots can download files of up to - :tg-const:`telegram.constants.FileSizeLimit.FILESIZE_DOWNLOAD` in size. The file can then - be e.g. downloaded with :meth:`telegram.File.download_to_drive`. It is guaranteed that - the link will be valid for at least 1 hour. When the link expires, a new one can be - requested by calling get_file again. - - Note: - This function may not preserve the original file name and MIME type. - You should save the file's MIME type and name (if available) when the File object - is received. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - Args: - file_id (:obj:`str` | :class:`telegram.Animation` | :class:`telegram.Audio` | \ - :class:`telegram.ChatPhoto` | :class:`telegram.Document` | \ - :class:`telegram.PhotoSize` | :class:`telegram.Sticker` | \ - :class:`telegram.Video` | :class:`telegram.VideoNote` | \ - :class:`telegram.Voice`): - Either the file identifier or an object that has a file_id attribute - to get file information about. - - Returns: - :class:`telegram.File` - - Raises: - :class:`telegram.error.TelegramError` - - """ - # Try to get the file_id from the object, if it fails, assume it's a string - with contextlib.suppress(AttributeError): - file_id = file_id.file_id # type: ignore[union-attr] - - data: JSONDict = {"file_id": file_id} - - result = await self._post( - "getFile", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - file_path = cast("dict", result).get("file_path") - if file_path and not is_local_file(file_path): - result["file_path"] = f"{self._base_file_url}/{file_path}" - - return File.de_json(result, self) - - async def ban_chat_member( - self, - chat_id: Union[str, int], - user_id: int, - until_date: Optional[Union[int, dtm.datetime]] = None, - revoke_messages: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to ban a user from a group, supergroup or a channel. In the case of - supergroups and channels, the user will not be able to return to the group on their own - using invite links, etc., unless unbanned first. The bot must be an administrator in the - chat for this to work and must have the appropriate admin rights. - - .. versionadded:: 13.7 - - Args: - chat_id (:obj:`int` | :obj:`str`): Unique identifier for the target group or username - of the target supergroup or channel (in the format ``@channelusername``). - user_id (:obj:`int`): Unique identifier of the target user. - until_date (:obj:`int` | :obj:`datetime.datetime`, optional): Date when the user will - be unbanned, unix time. If user is banned for more than 366 days or less than 30 - seconds from the current time they are considered to be banned forever. Applied - for supergroups and channels only. - |tz-naive-dtms| - revoke_messages (:obj:`bool`, optional): Pass :obj:`True` to delete all messages from - the chat for the user that is being removed. If :obj:`False`, the user will be able - to see messages in the group that were sent before the user was removed. - Always :obj:`True` for supergroups and channels. - - .. versionadded:: 13.4 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "chat_id": chat_id, - "user_id": user_id, - "revoke_messages": revoke_messages, - "until_date": until_date, - } - - return await self._post( - "banChatMember", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def ban_chat_sender_chat( - self, - chat_id: Union[str, int], - sender_chat_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to ban a channel chat in a supergroup or a channel. Until the chat is - unbanned, the owner of the banned chat won't be able to send messages on behalf of **any of - their channels**. The bot must be an administrator in the supergroup or channel for this - to work and must have the appropriate administrator rights. - - .. versionadded:: 13.9 - - Args: - chat_id (:obj:`int` | :obj:`str`): Unique identifier for the target group or username - of the target supergroup or channel (in the format ``@channelusername``). - sender_chat_id (:obj:`int`): Unique identifier of the target sender chat. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"chat_id": chat_id, "sender_chat_id": sender_chat_id} - - return await self._post( - "banChatSenderChat", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def unban_chat_member( - self, - chat_id: Union[str, int], - user_id: int, - only_if_banned: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Use this method to unban a previously kicked user in a supergroup or channel. - - The user will *not* return to the group or channel automatically, but will be able to join - via link, etc. The bot must be an administrator for this to work. By default, this method - guarantees that after the call the user is not a member of the chat, but will be able to - join it. So if the user is a member of the chat they will also be *removed* from the chat. - If you don't want this, use the parameter :paramref:`only_if_banned`. - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - user_id (:obj:`int`): Unique identifier of the target user. - only_if_banned (:obj:`bool`, optional): Do nothing if the user is not banned. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"chat_id": chat_id, "user_id": user_id, "only_if_banned": only_if_banned} - - return await self._post( - "unbanChatMember", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def unban_chat_sender_chat( - self, - chat_id: Union[str, int], - sender_chat_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Use this method to unban a previously banned channel in a supergroup or channel. - The bot must be an administrator for this to work and must have the - appropriate administrator rights. - - .. versionadded:: 13.9 - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - sender_chat_id (:obj:`int`): Unique identifier of the target sender chat. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"chat_id": chat_id, "sender_chat_id": sender_chat_id} - - return await self._post( - "unbanChatSenderChat", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def answer_callback_query( - self, - callback_query_id: str, - text: Optional[str] = None, - show_alert: Optional[bool] = None, - url: Optional[str] = None, - cache_time: Optional[TimePeriod] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to send answers to callback queries sent from inline keyboards. The answer - will be displayed to the user as a notification at the top of the chat screen or as an - alert. - Alternatively, the user can be redirected to the specified Game URL. For this option to - work, you must first create a game for your bot via `@BotFather <https://t.me/BotFather>`_ - and accept the terms. Otherwise, you may use links like t.me/your_bot?start=XXXX that open - your bot with a parameter. - - Args: - callback_query_id (:obj:`str`): Unique identifier for the query to be answered. - text (:obj:`str`, optional): Text of the notification. If not specified, nothing will - be shown to the user, 0-:tg-const:`telegram.CallbackQuery.MAX_ANSWER_TEXT_LENGTH` - characters. - show_alert (:obj:`bool`, optional): If :obj:`True`, an alert will be shown by the - client instead of a notification at the top of the chat screen. Defaults to - :obj:`False`. - url (:obj:`str`, optional): URL that will be opened by the user's client. If you have - created a Game and accepted the conditions via - `@BotFather <https://t.me/BotFather>`_, specify the URL that - opens your game - note that this will only work if the query comes from a callback - game button. Otherwise, you may use links like t.me/your_bot?start=XXXX that open - your bot with a parameter. - cache_time (:obj:`int` | :class:`datetime.timedelta`, optional): The maximum amount of - time in seconds that the - result of the callback query may be cached client-side. Defaults to 0. - - .. versionchanged:: 21.11 - |time-period-input| - - Returns: - :obj:`bool` On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "callback_query_id": callback_query_id, - "cache_time": cache_time, - "text": text, - "show_alert": show_alert, - "url": url, - } - - return await self._post( - "answerCallbackQuery", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def edit_message_text( - self, - text: str, - chat_id: Optional[Union[str, int]] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - entities: Optional[Sequence["MessageEntity"]] = None, - link_preview_options: ODVInput["LinkPreviewOptions"] = DEFAULT_NONE, - business_connection_id: Optional[str] = None, - *, - disable_web_page_preview: Optional[bool] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Union[Message, bool]: - """ - Use this method to edit text and game messages. - - Note: - * |editreplymarkup| - * |bcid_edit_time| - - .. seealso:: :attr:`telegram.Game.text` - - Args: - chat_id (:obj:`int` | :obj:`str`, optional): Required if :paramref:`inline_message_id` - is not specified. |chat_id_channel| - message_id (:obj:`int`, optional): Required if :paramref:`inline_message_id` is not - specified. Identifier of the message to edit. - inline_message_id (:obj:`str`, optional): Required if :paramref:`chat_id` and - :paramref:`message_id` are not specified. Identifier of the inline message. - text (:obj:`str`): New text of the message, - :tg-const:`telegram.constants.MessageLimit.MIN_TEXT_LENGTH`- - :tg-const:`telegram.constants.MessageLimit.MAX_TEXT_LENGTH` characters after - entities parsing. - parse_mode (:obj:`str`, optional): |parse_mode| - entities (Sequence[:class:`telegram.MessageEntity`], optional): Sequence of special - entities that appear in message text, which can be specified instead of - :paramref:`parse_mode`. - - .. versionchanged:: 20.0 - |sequenceargs| - - link_preview_options (:obj:`LinkPreviewOptions`, optional): Link preview generation - options for the message. Mutually exclusive with - :paramref:`disable_web_page_preview`. - - .. versionadded:: 20.8 - - reply_markup (:class:`telegram.InlineKeyboardMarkup`, optional): An object for an - inline keyboard. - business_connection_id (:obj:`str`, optional): |business_id_str_edit| - - .. versionadded:: 21.4 - - Keyword Args: - disable_web_page_preview (:obj:`bool`, optional): Disables link previews for links in - this message. Convenience parameter for setting :paramref:`link_preview_options`. - Mutually exclusive with :paramref:`link_preview_options`. - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`link_preview_options` replacing this - argument. PTB will automatically convert this argument to that one, but - for advanced options, please use :paramref:`link_preview_options` directly. - - .. versionchanged:: 21.0 - |keyword_only_arg| - - - Returns: - :class:`telegram.Message`: On success, if edited message is not an inline message, the - edited message is returned, otherwise :obj:`True` is returned. - - Raises: - :exc:`ValueError`: If both :paramref:`disable_web_page_preview` and - :paramref:`link_preview_options` are passed. - :class:`telegram.error.TelegramError`: For other errors. - - """ - data: JSONDict = { - "text": text, - "chat_id": chat_id, - "message_id": message_id, - "inline_message_id": inline_message_id, - "entities": entities, - } - - link_preview_options = parse_lpo_and_dwpp(disable_web_page_preview, link_preview_options) - - return await self._send_message( - "editMessageText", - data, - reply_markup=reply_markup, - parse_mode=parse_mode, - link_preview_options=link_preview_options, - business_connection_id=business_connection_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def edit_message_caption( - self, - chat_id: Optional[Union[str, int]] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - caption: Optional[str] = None, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - show_caption_above_media: Optional[bool] = None, - business_connection_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Union[Message, bool]: - """ - Use this method to edit captions of messages. - - Note: - * |editreplymarkup| - * |bcid_edit_time| - - Args: - chat_id (:obj:`int` | :obj:`str`, optional): Required if inline_message_id is not - specified. |chat_id_channel| - message_id (:obj:`int`, optional): Required if inline_message_id is not specified. - Identifier of the message to edit. - inline_message_id (:obj:`str`, optional): Required if chat_id and message_id are not - specified. Identifier of the inline message. - caption (:obj:`str`, optional): New caption of the message, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters after - entities parsing. - parse_mode (:obj:`str`, optional): |parse_mode| - caption_entities (Sequence[:class:`telegram.MessageEntity`], optional): - |caption_entities| - - .. versionchanged:: 20.0 - |sequenceargs| - reply_markup (:class:`telegram.InlineKeyboardMarkup`, optional): An object for an - inline keyboard. - show_caption_above_media (:obj:`bool`, optional): Pass |show_cap_above_med| - - .. versionadded:: 21.3 - business_connection_id (:obj:`str`, optional): |business_id_str_edit| - - .. versionadded:: 21.4 - - Returns: - :class:`telegram.Message`: On success, if edited message is not an inline message, the - edited message is returned, otherwise :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "chat_id": chat_id, - "message_id": message_id, - "inline_message_id": inline_message_id, - "show_caption_above_media": show_caption_above_media, - } - - return await self._send_message( - "editMessageCaption", - data, - reply_markup=reply_markup, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - business_connection_id=business_connection_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def edit_message_media( - self, - media: "InputMedia", - chat_id: Optional[Union[str, int]] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - business_connection_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Union[Message, bool]: - """ - Use this method to edit animation, audio, document, photo, or video messages, or to add - media to text messages. If a message - is part of a message album, then it can be edited only to an audio for audio albums, only - to a document for document albums and to a photo or a video otherwise. When an inline - message is edited, a new file can't be uploaded; use a previously uploaded file via its - :attr:`~telegram.File.file_id` or specify a URL. - - Note: - * |editreplymarkup| - * |bcid_edit_time| - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - Args: - media (:class:`telegram.InputMedia`): An object for a new media content - of the message. - chat_id (:obj:`int` | :obj:`str`, optional): Required if inline_message_id is not - specified. |chat_id_channel| - message_id (:obj:`int`, optional): Required if inline_message_id is not specified. - Identifier of the message to edit. - inline_message_id (:obj:`str`, optional): Required if chat_id and message_id are not - specified. Identifier of the inline message. - reply_markup (:class:`telegram.InlineKeyboardMarkup`, optional): An object for an - inline keyboard. - business_connection_id (:obj:`str`, optional): |business_id_str_edit| - - .. versionadded:: 21.4 - - Returns: - :class:`telegram.Message`: On success, if edited message is not an inline message, the - edited Message is returned, otherwise :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = { - "media": media, - "chat_id": chat_id, - "message_id": message_id, - "inline_message_id": inline_message_id, - } - - return await self._send_message( - "editMessageMedia", - data, - reply_markup=reply_markup, - business_connection_id=business_connection_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def edit_message_reply_markup( - self, - chat_id: Optional[Union[str, int]] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - business_connection_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Union[Message, bool]: - """ - Use this method to edit only the reply markup of messages sent by the bot or via the bot - (for inline bots). - - Note: - * |editreplymarkup| - * |bcid_edit_time| - - Args: - chat_id (:obj:`int` | :obj:`str`, optional): Required if inline_message_id is not - specified. |chat_id_channel| - message_id (:obj:`int`, optional): Required if inline_message_id is not specified. - Identifier of the message to edit. - inline_message_id (:obj:`str`, optional): Required if chat_id and message_id are not - specified. Identifier of the inline message. - reply_markup (:class:`telegram.InlineKeyboardMarkup`, optional): An object for an - inline keyboard. - business_connection_id (:obj:`str`, optional): |business_id_str_edit| - - .. versionadded:: 21.4 - - Returns: - :class:`telegram.Message`: On success, if edited message is not an inline message, the - edited message is returned, otherwise :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "chat_id": chat_id, - "message_id": message_id, - "inline_message_id": inline_message_id, - } - - return await self._send_message( - "editMessageReplyMarkup", - data, - reply_markup=reply_markup, - business_connection_id=business_connection_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def get_updates( - self, - offset: Optional[int] = None, - limit: Optional[int] = None, - timeout: Optional[TimePeriod] = None, - allowed_updates: Optional[Sequence[str]] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> tuple[Update, ...]: - """Use this method to receive incoming updates using long polling. - - Note: - 1. This method will not work if an outgoing webhook is set up. - 2. In order to avoid getting duplicate updates, recalculate offset after each - server response. - 3. To take full advantage of this library take a look at :class:`telegram.ext.Updater` - - .. seealso:: :meth:`telegram.ext.Application.run_polling`, - :meth:`telegram.ext.Updater.start_polling` - - .. versionchanged:: 20.0 - Returns a tuple instead of a list. - - Args: - offset (:obj:`int`, optional): Identifier of the first update to be returned. Must be - greater by one than the highest among the identifiers of previously received - updates. By default, updates starting with the earliest unconfirmed update are - returned. An update is considered confirmed as soon as this method is called with - an offset higher than its :attr:`telegram.Update.update_id`. The negative offset - can be specified to retrieve updates starting from -offset update from the end of - the updates queue. All previous updates will be forgotten. - limit (:obj:`int`, optional): Limits the number of updates to be retrieved. Values - between :tg-const:`telegram.constants.PollingLimit.MIN_LIMIT`- - :tg-const:`telegram.constants.PollingLimit.MAX_LIMIT` are accepted. - Defaults to ``100``. - timeout (:obj:`int` | :class:`datetime.timedelta`, optional): Timeout in seconds for - long polling. Defaults to ``0``, i.e. usual short polling. Should be positive, - short polling should be used for testing purposes only. - - .. versionchanged:: v22.2 - |time-period-input| - allowed_updates (Sequence[:obj:`str`]), optional): A sequence the types of - updates you want your bot to receive. For example, specify ["message", - "edited_channel_post", "callback_query"] to only receive updates of these types. - See :class:`telegram.Update` for a complete list of available update types. - Specify an empty sequence to receive all updates except - :attr:`telegram.Update.chat_member`, :attr:`telegram.Update.message_reaction` and - :attr:`telegram.Update.message_reaction_count` (default). If not specified, the - previous setting will be used. Please note that this parameter doesn't affect - updates created before the call to the get_updates, so unwanted updates may be - received for a short period of time. - - .. versionchanged:: 20.0 - |sequenceargs| - - Returns: - tuple[:class:`telegram.Update`] - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "timeout": timeout, - "offset": offset, - "limit": limit, - "allowed_updates": allowed_updates, - } - - # The "or 0" is needed for the case where read_timeout is None. - if not isinstance(read_timeout, DefaultValue): - arg_read_timeout: float = read_timeout or 0 - else: - arg_read_timeout = self._request[0].read_timeout or 0 - - read_timeout = ( - (arg_read_timeout + timeout.total_seconds()) - if isinstance(timeout, dtm.timedelta) - else (arg_read_timeout + timeout if timeout else arg_read_timeout) - ) - - # Ideally we'd use an aggressive read timeout for the polling. However, - # * Short polling should return within 2 seconds. - # * Long polling poses a different problem: the connection might have been dropped while - # waiting for the server to return and there's no way of knowing the connection had been - # dropped in real time. - result = cast( - "list[JSONDict]", - await self._post( - "getUpdates", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ), - ) - - if result: - self._LOGGER.debug("Getting updates: %s", [u["update_id"] for u in result]) - else: - self._LOGGER.debug("No new updates found.") - - try: - return Update.de_list(result, self) - except Exception as exc: - # This logging is in place mostly b/c we can't access the raw json data in Updater, - # where the exception is caught and logged again. Still, it might also be beneficial - # for custom usages of `get_updates`. - self._LOGGER.critical( - "Error while parsing updates! Received data was %r", result, exc_info=exc - ) - raise - - async def set_webhook( - self, - url: str, - certificate: Optional[FileInput] = None, - max_connections: Optional[int] = None, - allowed_updates: Optional[Sequence[str]] = None, - ip_address: Optional[str] = None, - drop_pending_updates: Optional[bool] = None, - secret_token: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to specify a url and receive incoming updates via an outgoing webhook. - Whenever there is an update for the bot, Telegram will send an HTTPS POST request to the - specified url, containing An Update. In case of an unsuccessful request - (a request with response - `HTTP status code <https://en.wikipedia.org/wiki/List_of_HTTP_status_codes>`_different - from ``2XY``), - Telegram will repeat the request and give up after a reasonable amount of attempts. - - If you'd like to make sure that the Webhook was set by you, you can specify secret data in - the parameter :paramref:`secret_token`. If specified, the request will contain a header - ``X-Telegram-Bot-Api-Secret-Token`` with the secret token as content. - - Note: - 1. You will not be able to receive updates using :meth:`get_updates` for long as an - outgoing webhook is set up. - 2. To use a self-signed certificate, you need to upload your public key certificate - using :paramref:`certificate` parameter. Please upload as - :class:`~telegram.InputFile`, sending a String will not work. - 3. Ports currently supported for Webhooks: - :attr:`telegram.constants.SUPPORTED_WEBHOOK_PORTS`. - - If you're having any trouble setting up webhooks, please check out this `guide to - Webhooks`_. - - .. seealso:: :meth:`telegram.ext.Application.run_webhook`, - :meth:`telegram.ext.Updater.start_webhook` - - Examples: - :any:`Custom Webhook Bot <examples.customwebhookbot>` - - Args: - url (:obj:`str`): HTTPS url to send updates to. Use an empty string to remove webhook - integration. - certificate (:term:`file object` | :obj:`bytes` | :class:`pathlib.Path` | :obj:`str`): - Upload your public key certificate so that the root - certificate in use can be checked. See our :wiki:`self-signed guide\ - <Webhooks#creating-a-self-signed-certificate-using-openssl>` for details. - |uploadinputnopath| - ip_address (:obj:`str`, optional): The fixed IP address which will be used to send - webhook requests instead of the IP address resolved through DNS. - max_connections (:obj:`int`, optional): Maximum allowed number of simultaneous HTTPS - connections to the webhook for update delivery, - :tg-const:`telegram.constants.WebhookLimit.MIN_CONNECTIONS_LIMIT`- - :tg-const:`telegram.constants.WebhookLimit.MAX_CONNECTIONS_LIMIT`. - Defaults to ``40``. Use lower values to limit the load on your bot's server, - and higher values to increase your bot's throughput. - allowed_updates (Sequence[:obj:`str`], optional): A sequence of the types of - updates you want your bot to receive. For example, specify ["message", - "edited_channel_post", "callback_query"] to only receive updates of these types. - See :class:`telegram.Update` for a complete list of available update types. - Specify an empty sequence to receive all updates except - :attr:`telegram.Update.chat_member`, - :attr:`telegram.Update.message_reaction` - and :attr:`telegram.Update.message_reaction_count` (default). If not - specified, the previous setting will be used. Please note that this - parameter doesn't affect - updates created before the call to the set_webhook, so unwanted update - may be received for a short period of time. - - .. versionchanged:: 20.0 - |sequenceargs| - drop_pending_updates (:obj:`bool`, optional): Pass :obj:`True` to drop all pending - updates. - secret_token (:obj:`str`, optional): A secret token to be sent in a header - ``X-Telegram-Bot-Api-Secret-Token`` in every webhook request, - :tg-const:`telegram.constants.WebhookLimit.MIN_SECRET_TOKEN_LENGTH`- - :tg-const:`telegram.constants.WebhookLimit.MAX_SECRET_TOKEN_LENGTH` characters. - Only characters ``A-Z``, ``a-z``, ``0-9``, ``_`` and ``-`` are allowed. - The header is useful to ensure that the request comes from a webhook set by you. - - .. versionadded:: 20.0 - - Returns: - :obj:`bool` On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - .. _`guide to Webhooks`: https://core.telegram.org/bots/webhooks - - """ - data: JSONDict = { - "url": url, - "max_connections": max_connections, - "allowed_updates": allowed_updates, - "ip_address": ip_address, - "drop_pending_updates": drop_pending_updates, - "secret_token": secret_token, - "certificate": self._parse_file_input(certificate), # type: ignore[arg-type] - } - - return await self._post( - "setWebhook", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def delete_webhook( - self, - drop_pending_updates: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to remove webhook integration if you decide to switch back to - :meth:`get_updates()`. - - Args: - drop_pending_updates (:obj:`bool`, optional): Pass :obj:`True` to drop all pending - updates. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data = {"drop_pending_updates": drop_pending_updates} - - return await self._post( - "deleteWebhook", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def leave_chat( - self, - chat_id: Union[str, int], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Use this method for your bot to leave a group, supergroup or channel. - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"chat_id": chat_id} - - return await self._post( - "leaveChat", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def get_chat( - self, - chat_id: Union[str, int], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> ChatFullInfo: - """ - Use this method to get up to date information about the chat (current name of the user for - one-on-one conversations, current username of a user, group or channel, etc.). - - .. versionchanged:: 21.2 - In accordance to Bot API 7.3, this method now returns a :class:`telegram.ChatFullInfo`. - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - - Returns: - :class:`telegram.ChatFullInfo` - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"chat_id": chat_id} - - result = await self._post( - "getChat", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - return ChatFullInfo.de_json(result, self) - - async def get_chat_administrators( - self, - chat_id: Union[str, int], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> tuple[ChatMember, ...]: - """ - Use this method to get a list of administrators in a chat. - - .. versionchanged:: 20.0 - Returns a tuple instead of a list. - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - - Returns: - tuple[:class:`telegram.ChatMember`]: On success, returns a tuple of ``ChatMember`` - objects that contains information about all chat administrators except - other bots. If the chat is a group or a supergroup and no administrators were - appointed, only the creator will be returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"chat_id": chat_id} - result = await self._post( - "getChatAdministrators", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - return ChatMember.de_list(result, self) - - async def get_chat_member_count( - self, - chat_id: Union[str, int], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> int: - """Use this method to get the number of members in a chat. - - .. versionadded:: 13.7 - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - - Returns: - :obj:`int`: Number of members in the chat. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"chat_id": chat_id} - return await self._post( - "getChatMemberCount", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def get_chat_member( - self, - chat_id: Union[str, int], - user_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> ChatMember: - """Use this method to get information about a member of a chat. The method is only - guaranteed to work for other users if the bot is an administrator in the chat. - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - user_id (:obj:`int`): Unique identifier of the target user. - - Returns: - :class:`telegram.ChatMember` - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"chat_id": chat_id, "user_id": user_id} - result = await self._post( - "getChatMember", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - return ChatMember.de_json(result, self) - - async def set_chat_sticker_set( - self, - chat_id: Union[str, int], - sticker_set_name: str, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Use this method to set a new group sticker set for a supergroup. - The bot must be an administrator in the chat for this to work and must have the appropriate - admin rights. Use the field :attr:`telegram.ChatFullInfo.can_set_sticker_set` optionally - returned in :meth:`get_chat` requests to check if the bot can use this method. - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_group| - sticker_set_name (:obj:`str`): Name of the sticker set to be set as the group - sticker set. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - """ - data: JSONDict = {"chat_id": chat_id, "sticker_set_name": sticker_set_name} - return await self._post( - "setChatStickerSet", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def delete_chat_sticker_set( - self, - chat_id: Union[str, int], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Use this method to delete a group sticker set from a supergroup. The bot must be an - administrator in the chat for this to work and must have the appropriate admin rights. - Use the field :attr:`telegram.ChatFullInfo.can_set_sticker_set` optionally returned in - :meth:`get_chat` requests to check if the bot can use this method. - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_group| - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - """ - data: JSONDict = {"chat_id": chat_id} - return await self._post( - "deleteChatStickerSet", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def get_webhook_info( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> WebhookInfo: - """Use this method to get current webhook status. Requires no parameters. - - If the bot is using :meth:`get_updates`, will return an object with the - :attr:`telegram.WebhookInfo.url` field empty. - - Returns: - :class:`telegram.WebhookInfo` - - """ - result = await self._post( - "getWebhookInfo", - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - return WebhookInfo.de_json(result, self) - - async def set_game_score( - self, - user_id: int, - score: int, - chat_id: Optional[int] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - force: Optional[bool] = None, - disable_edit_message: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Union[Message, bool]: - """ - Use this method to set the score of the specified user in a game message. - - .. seealso:: :attr:`telegram.Game.text` - - Args: - user_id (:obj:`int`): User identifier. - score (:obj:`int`): New score, must be non-negative. - force (:obj:`bool`, optional): Pass :obj:`True`, if the high score is allowed to - decrease. This can be useful when fixing mistakes or banning cheaters. - disable_edit_message (:obj:`bool`, optional): Pass :obj:`True`, if the game message - should not be automatically edited to include the current scoreboard. - chat_id (:obj:`int`, optional): Required if :paramref:`inline_message_id` - is not specified. Unique identifier for the target chat. - message_id (:obj:`int`, optional): Required if :paramref:`inline_message_id` is not - specified. Identifier of the sent message. - inline_message_id (:obj:`str`, optional): Required if :paramref:`chat_id` and - :paramref:`message_id` are not specified. Identifier of the inline message. - - Returns: - :class:`telegram.Message`: The edited message. If the message is not an inline message - , :obj:`True`. - - Raises: - :class:`telegram.error.TelegramError`: If the new score is not greater than the user's - current score in the chat and :paramref:`force` is :obj:`False`. - - """ - data: JSONDict = { - "user_id": user_id, - "score": score, - "force": force, - "disable_edit_message": disable_edit_message, - "chat_id": chat_id, - "message_id": message_id, - "inline_message_id": inline_message_id, - } - - return await self._send_message( - "setGameScore", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def get_game_high_scores( - self, - user_id: int, - chat_id: Optional[int] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> tuple[GameHighScore, ...]: - """ - Use this method to get data for high score tables. Will return the score of the specified - user and several of their neighbors in a game. - - Note: - This method will currently return scores for the target user, plus two of their - closest neighbors on each side. Will also return the top three users if the user and - his neighbors are not among them. Please note that this behavior is subject to change. - - .. versionchanged:: 20.0 - Returns a tuple instead of a list. - - Args: - user_id (:obj:`int`): Target user id. - chat_id (:obj:`int`, optional): Required if :paramref:`inline_message_id` - is not specified. Unique identifier for the target chat. - message_id (:obj:`int`, optional): Required if :paramref:`inline_message_id` is not - specified. Identifier of the sent message. - inline_message_id (:obj:`str`, optional): Required if :paramref:`chat_id` and - :paramref:`message_id` are not specified. Identifier of the inline message. - - Returns: - tuple[:class:`telegram.GameHighScore`] - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "user_id": user_id, - "chat_id": chat_id, - "message_id": message_id, - "inline_message_id": inline_message_id, - } - - result = await self._post( - "getGameHighScores", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - return GameHighScore.de_list(result, self) - - async def send_invoice( - self, - chat_id: Union[int, str], - title: str, - description: str, - payload: str, - currency: str, - prices: Sequence["LabeledPrice"], - provider_token: Optional[str] = None, - start_parameter: Optional[str] = None, - photo_url: Optional[str] = None, - photo_size: Optional[int] = None, - photo_width: Optional[int] = None, - photo_height: Optional[int] = None, - need_name: Optional[bool] = None, - need_phone_number: Optional[bool] = None, - need_email: Optional[bool] = None, - need_shipping_address: Optional[bool] = None, - is_flexible: Optional[bool] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - provider_data: Optional[Union[str, object]] = None, - send_phone_number_to_provider: Optional[bool] = None, - send_email_to_provider: Optional[bool] = None, - max_tip_amount: Optional[int] = None, - suggested_tip_amounts: Optional[Sequence[int]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - reply_to_message_id: Optional[int] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Message: - """Use this method to send invoices. - - Warning: - As of API 5.2 :paramref:`start_parameter` is an optional argument and therefore the - order of the arguments had to be changed. Use keyword arguments to make sure that the - arguments are passed correctly. - - .. versionchanged:: 13.5 - As of Bot API 5.2, the parameter :paramref:`start_parameter` is optional. - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - title (:obj:`str`): Product name. :tg-const:`telegram.Invoice.MIN_TITLE_LENGTH`- - :tg-const:`telegram.Invoice.MAX_TITLE_LENGTH` characters. - description (:obj:`str`): Product description. - :tg-const:`telegram.Invoice.MIN_DESCRIPTION_LENGTH`- - :tg-const:`telegram.Invoice.MAX_DESCRIPTION_LENGTH` characters. - payload (:obj:`str`): Bot-defined invoice payload. - :tg-const:`telegram.Invoice.MIN_PAYLOAD_LENGTH`- - :tg-const:`telegram.Invoice.MAX_PAYLOAD_LENGTH` bytes. This will not be - displayed to the user, use it for your internal processes. - provider_token (:obj:`str`, optional): Payments provider token, obtained via - `@BotFather <https://t.me/BotFather>`_. Pass an empty string for payments in - |tg_stars|. - - .. versionchanged:: 21.11 - Bot API 7.4 made this parameter is optional and this is now reflected in the - function signature. - - currency (:obj:`str`): Three-letter ISO 4217 currency code, see `more on currencies - <https://core.telegram.org/bots/payments#supported-currencies>`_. Pass ``XTR`` for - payment in |tg_stars|. - prices (Sequence[:class:`telegram.LabeledPrice`]): Price breakdown, a sequence - of components (e.g. product price, tax, discount, delivery cost, delivery tax, - bonus, etc.). Must contain exactly one item for payment in |tg_stars|. - - .. versionchanged:: 20.0 - |sequenceargs| - max_tip_amount (:obj:`int`, optional): The maximum accepted amount for tips in the - *smallest units* of the currency (integer, **not** float/double). For example, for - a maximum tip of ``US$ 1.45`` pass ``max_tip_amount = 145``. See the ``exp`` - parameter in `currencies.json - <https://core.telegram.org/bots/payments/currencies.json>`_, it shows the number of - digits past the decimal point for each currency (2 for the majority of currencies). - Defaults to ``0``. Not supported for payment in |tg_stars|. - - .. versionadded:: 13.5 - suggested_tip_amounts (Sequence[:obj:`int`], optional): An array of - suggested amounts of tips in the *smallest units* of the currency (integer, **not** - float/double). At most :tg-const:`telegram.Invoice.MAX_TIP_AMOUNTS` suggested tip - amounts can be specified. The suggested tip amounts must be positive, passed in a - strictly increased order and must not exceed :paramref:`max_tip_amount`. - - .. versionadded:: 13.5 - - .. versionchanged:: 20.0 - |sequenceargs| - start_parameter (:obj:`str`, optional): Unique deep-linking parameter. If left empty, - *forwarded copies* of the sent message will have a *Pay* button, allowing - multiple users to pay directly from the forwarded message, using the same invoice. - If non-empty, forwarded copies of the sent message will have a *URL* button with a - deep link to the bot (instead of a *Pay* button), with the value used as the - start parameter. - - .. versionchanged:: 13.5 - As of Bot API 5.2, this parameter is optional. - provider_data (:obj:`str` | :obj:`object`, optional): data about the - invoice, which will be shared with the payment provider. A detailed description of - required fields should be provided by the payment provider. When an object is - passed, it will be encoded as JSON. - photo_url (:obj:`str`, optional): URL of the product photo for the invoice. Can be a - photo of the goods or a marketing image for a service. People like it better when - they see what they are paying for. - photo_size (:obj:`str`, optional): Photo size. - photo_width (:obj:`int`, optional): Photo width. - photo_height (:obj:`int`, optional): Photo height. - need_name (:obj:`bool`, optional): Pass :obj:`True`, if you require the user's full - name to complete the order. Ignored for payments in |tg_stars|. - need_phone_number (:obj:`bool`, optional): Pass :obj:`True`, if you require the user's - phone number to complete the order. Ignored for payments in |tg_stars|. - need_email (:obj:`bool`, optional): Pass :obj:`True`, if you require the user's email - to complete the order. Ignored for payments in |tg_stars|. - need_shipping_address (:obj:`bool`, optional): Pass :obj:`True`, if you require the - user's shipping address to complete the order. Ignored for payments in - |tg_stars|. - send_phone_number_to_provider (:obj:`bool`, optional): Pass :obj:`True`, if user's - phone number should be sent to provider. Ignored for payments in |tg_stars|. - send_email_to_provider (:obj:`bool`, optional): Pass :obj:`True`, if user's email - address should be sent to provider. Ignored for payments in |tg_stars|. - is_flexible (:obj:`bool`, optional): Pass :obj:`True`, if the final price depends on - the shipping method. Ignored for payments in |tg_stars|. - disable_notification (:obj:`bool`, optional): |disable_notification| - protect_content (:obj:`bool`, optional): |protect_content| - - .. versionadded:: 13.10 - message_thread_id (:obj:`int`, optional): |message_thread_id_arg| - - .. versionadded:: 20.0 - - reply_markup (:class:`telegram.InlineKeyboardMarkup`, optional): An object for an - inline keyboard. If empty, one 'Pay total price' button will be - shown. If not empty, the first button must be a Pay button. - reply_parameters (:class:`telegram.ReplyParameters`, optional): |reply_parameters| - - .. versionadded:: 20.8 - message_effect_id (:obj:`str`, optional): |message_effect_id| - - .. versionadded:: 21.3 - allow_paid_broadcast (:obj:`bool`, optional): |allow_paid_broadcast| - - .. versionadded:: 21.7 - - Keyword Args: - allow_sending_without_reply (:obj:`bool`, optional): |allow_sending_without_reply| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - reply_to_message_id (:obj:`int`, optional): |reply_to_msg_id| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - - Returns: - :class:`telegram.Message`: On success, the sent Message is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "chat_id": chat_id, - "title": title, - "description": description, - "payload": payload, - "provider_token": provider_token, - "currency": currency, - "prices": prices, - "max_tip_amount": max_tip_amount, - "suggested_tip_amounts": suggested_tip_amounts, - "start_parameter": start_parameter, - "provider_data": provider_data, - "photo_url": photo_url, - "photo_size": photo_size, - "photo_width": photo_width, - "photo_height": photo_height, - "need_name": need_name, - "need_phone_number": need_phone_number, - "need_email": need_email, - "need_shipping_address": need_shipping_address, - "is_flexible": is_flexible, - "send_phone_number_to_provider": send_phone_number_to_provider, - "send_email_to_provider": send_email_to_provider, - } - - return await self._send_message( - "sendInvoice", - data, - reply_to_message_id=reply_to_message_id, - disable_notification=disable_notification, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - reply_parameters=reply_parameters, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def answer_shipping_query( - self, - shipping_query_id: str, - ok: bool, - shipping_options: Optional[Sequence["ShippingOption"]] = None, - error_message: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - If you sent an invoice requesting a shipping address and the parameter - :paramref:`send_invoice.is_flexible` was specified, the Bot API will send an - :class:`telegram.Update` with a :attr:`telegram.Update.shipping_query` field to the bot. - Use this method to reply to shipping queries. - - Args: - shipping_query_id (:obj:`str`): Unique identifier for the query to be answered. - ok (:obj:`bool`): Specify :obj:`True` if delivery to the specified address is possible - and :obj:`False` if there are any problems (for example, if delivery to the - specified address is not possible). - shipping_options (Sequence[:class:`telegram.ShippingOption`]), optional): Required if - :paramref:`ok` is :obj:`True`. A sequence of available shipping options. - - .. versionchanged:: 20.0 - |sequenceargs| - error_message (:obj:`str`, optional): Required if :paramref:`ok` is :obj:`False`. - Error message in human readable form that explains why it is impossible to complete - the order (e.g. "Sorry, delivery to your desired address is unavailable"). Telegram - will display this message to the user. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "shipping_query_id": shipping_query_id, - "ok": ok, - "shipping_options": shipping_options, - "error_message": error_message, - } - - return await self._post( - "answerShippingQuery", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def answer_pre_checkout_query( - self, - pre_checkout_query_id: str, - ok: bool, - error_message: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Once the user has confirmed their payment and shipping details, the Bot API sends the final - confirmation in the form of an :class:`telegram.Update` with the field - :attr:`telegram.Update.pre_checkout_query`. Use this method to respond to such pre-checkout - queries. - - Note: - The Bot API must receive an answer within 10 seconds after the pre-checkout - query was sent. - - Args: - pre_checkout_query_id (:obj:`str`): Unique identifier for the query to be answered. - ok (:obj:`bool`): Specify :obj:`True` if everything is alright - (goods are available, etc.) and the bot is ready to proceed with the order. Use - :obj:`False` if there are any problems. - error_message (:obj:`str`, optional): Required if :paramref:`ok` is :obj:`False`. Error - message in human readable form that explains the reason for failure to proceed with - the checkout (e.g. "Sorry, somebody just bought the last of our amazing black - T-shirts while you were busy filling out your payment details. Please choose a - different color or garment!"). Telegram will display this message to the user. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "pre_checkout_query_id": pre_checkout_query_id, - "ok": ok, - "error_message": error_message, - } - - return await self._post( - "answerPreCheckoutQuery", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def answer_web_app_query( - self, - web_app_query_id: str, - result: "InlineQueryResult", - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> SentWebAppMessage: - """Use this method to set the result of an interaction with a Web App and send a - corresponding message on behalf of the user to the chat from which the query originated. - - .. versionadded:: 20.0 - - Args: - web_app_query_id (:obj:`str`): Unique identifier for the query to be answered. - result (:class:`telegram.InlineQueryResult`): An object describing the message to be - sent. - - Returns: - :class:`telegram.SentWebAppMessage`: On success, a sent - :class:`telegram.SentWebAppMessage` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "web_app_query_id": web_app_query_id, - "result": self._insert_defaults_for_ilq_results(result), - } - - api_result = await self._post( - "answerWebAppQuery", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - return SentWebAppMessage.de_json(api_result, self) - - async def restrict_chat_member( - self, - chat_id: Union[str, int], - user_id: int, - permissions: ChatPermissions, - until_date: Optional[Union[int, dtm.datetime]] = None, - use_independent_chat_permissions: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to restrict a user in a supergroup. The bot must be an administrator in - the supergroup for this to work and must have the appropriate admin rights. Pass - :obj:`True` for all boolean parameters to lift restrictions from a user. - - .. seealso:: :meth:`telegram.ChatPermissions.all_permissions` - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_group| - user_id (:obj:`int`): Unique identifier of the target user. - until_date (:obj:`int` | :obj:`datetime.datetime`, optional): Date when restrictions - will be lifted for the user, unix time. If user is restricted for more than 366 - days or less than 30 seconds from the current time, they are considered to be - restricted forever. - |tz-naive-dtms| - permissions (:class:`telegram.ChatPermissions`): An object for new user - permissions. - use_independent_chat_permissions (:obj:`bool`, optional): Pass :obj:`True` if chat - permissions are set independently. Otherwise, the - :attr:`~telegram.ChatPermissions.can_send_other_messages` and - :attr:`~telegram.ChatPermissions.can_add_web_page_previews` permissions will imply - the :attr:`~telegram.ChatPermissions.can_send_messages`, - :attr:`~telegram.ChatPermissions.can_send_audios`, - :attr:`~telegram.ChatPermissions.can_send_documents`, - :attr:`~telegram.ChatPermissions.can_send_photos`, - :attr:`~telegram.ChatPermissions.can_send_videos`, - :attr:`~telegram.ChatPermissions.can_send_video_notes`, and - :attr:`~telegram.ChatPermissions.can_send_voice_notes` permissions; the - :attr:`~telegram.ChatPermissions.can_send_polls` permission will imply the - :attr:`~telegram.ChatPermissions.can_send_messages` permission. - - .. versionadded: 20.1 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = { - "chat_id": chat_id, - "user_id": user_id, - "permissions": permissions, - "until_date": until_date, - "use_independent_chat_permissions": use_independent_chat_permissions, - } - - return await self._post( - "restrictChatMember", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def promote_chat_member( - self, - chat_id: Union[str, int], - user_id: int, - can_change_info: Optional[bool] = None, - can_post_messages: Optional[bool] = None, - can_edit_messages: Optional[bool] = None, - can_delete_messages: Optional[bool] = None, - can_invite_users: Optional[bool] = None, - can_restrict_members: Optional[bool] = None, - can_pin_messages: Optional[bool] = None, - can_promote_members: Optional[bool] = None, - is_anonymous: Optional[bool] = None, - can_manage_chat: Optional[bool] = None, - can_manage_video_chats: Optional[bool] = None, - can_manage_topics: Optional[bool] = None, - can_post_stories: Optional[bool] = None, - can_edit_stories: Optional[bool] = None, - can_delete_stories: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to promote or demote a user in a supergroup or a channel. The bot must be - an administrator in the chat for this to work and must have the appropriate admin rights. - Pass :obj:`False` for all boolean parameters to demote a user. - - .. versionchanged:: 20.0 - The argument ``can_manage_voice_chats`` was renamed to - :paramref:`can_manage_video_chats` in accordance to Bot API 6.0. - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - user_id (:obj:`int`): Unique identifier of the target user. - is_anonymous (:obj:`bool`, optional): Pass :obj:`True`, if the administrator's presence - in the chat is hidden. - can_manage_chat (:obj:`bool`, optional): Pass :obj:`True`, if the administrator can - access the chat event log, get boost list, see hidden supergroup and channel - members, report spam messages and ignore slow mode. Implied by any other - administrator privilege. - - .. versionadded:: 13.4 - - can_manage_video_chats (:obj:`bool`, optional): Pass :obj:`True`, if the administrator - can manage video chats. - - .. versionadded:: 20.0 - - can_change_info (:obj:`bool`, optional): Pass :obj:`True`, if the administrator can - change chat title, photo and other settings. - can_post_messages (:obj:`bool`, optional): Pass :obj:`True`, if the administrator can - post messages in the channel, or access channel statistics; for channels only. - can_edit_messages (:obj:`bool`, optional): Pass :obj:`True`, if the administrator can - edit messages of other users and can pin messages, for channels only. - can_delete_messages (:obj:`bool`, optional): Pass :obj:`True`, if the administrator can - delete messages of other users. - can_invite_users (:obj:`bool`, optional): Pass :obj:`True`, if the administrator can - invite new users to the chat. - can_restrict_members (:obj:`bool`, optional): Pass :obj:`True`, if the administrator - can restrict, ban or unban chat members, or access supergroup statistics. - can_pin_messages (:obj:`bool`, optional): Pass :obj:`True`, if the administrator can - pin messages, for supergroups only. - can_promote_members (:obj:`bool`, optional): Pass :obj:`True`, if the administrator can - add new administrators with a subset of their own privileges or demote - administrators that they have promoted, directly or indirectly - (promoted by administrators that were appointed by the user). - can_manage_topics (:obj:`bool`, optional): Pass :obj:`True`, if the user is - allowed to create, rename, close, and reopen forum topics; for supergroups only. - - .. versionadded:: 20.0 - can_post_stories (:obj:`bool`, optional): Pass :obj:`True`, if the administrator can - post stories to the chat. - - .. versionadded:: 20.6 - can_edit_stories (:obj:`bool`, optional): Pass :obj:`True`, if the administrator can - edit stories posted by other users, post stories to the chat page, pin chat - stories, and access the chat's story archive - - .. versionadded:: 20.6 - can_delete_stories (:obj:`bool`, optional): Pass :obj:`True`, if the administrator can - delete stories posted by other users. - - .. versionadded:: 20.6 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "chat_id": chat_id, - "user_id": user_id, - "is_anonymous": is_anonymous, - "can_change_info": can_change_info, - "can_post_messages": can_post_messages, - "can_edit_messages": can_edit_messages, - "can_delete_messages": can_delete_messages, - "can_invite_users": can_invite_users, - "can_restrict_members": can_restrict_members, - "can_pin_messages": can_pin_messages, - "can_promote_members": can_promote_members, - "can_manage_chat": can_manage_chat, - "can_manage_video_chats": can_manage_video_chats, - "can_manage_topics": can_manage_topics, - "can_post_stories": can_post_stories, - "can_edit_stories": can_edit_stories, - "can_delete_stories": can_delete_stories, - } - - return await self._post( - "promoteChatMember", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def set_chat_permissions( - self, - chat_id: Union[str, int], - permissions: ChatPermissions, - use_independent_chat_permissions: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to set default chat permissions for all members. The bot must be an - administrator in the group or a supergroup for this to work and must have the - :attr:`telegram.ChatMemberAdministrator.can_restrict_members` admin rights. - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_group| - permissions (:class:`telegram.ChatPermissions`): New default chat permissions. - use_independent_chat_permissions (:obj:`bool`, optional): Pass :obj:`True` if chat - permissions are set independently. Otherwise, the - :attr:`~telegram.ChatPermissions.can_send_other_messages` and - :attr:`~telegram.ChatPermissions.can_add_web_page_previews` permissions will imply - the :attr:`~telegram.ChatPermissions.can_send_messages`, - :attr:`~telegram.ChatPermissions.can_send_audios`, - :attr:`~telegram.ChatPermissions.can_send_documents`, - :attr:`~telegram.ChatPermissions.can_send_photos`, - :attr:`~telegram.ChatPermissions.can_send_videos`, - :attr:`~telegram.ChatPermissions.can_send_video_notes`, and - :attr:`~telegram.ChatPermissions.can_send_voice_notes` permissions; the - :attr:`~telegram.ChatPermissions.can_send_polls` permission will imply the - :attr:`~telegram.ChatPermissions.can_send_messages` permission. - - .. versionadded: 20.1 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "chat_id": chat_id, - "permissions": permissions, - "use_independent_chat_permissions": use_independent_chat_permissions, - } - return await self._post( - "setChatPermissions", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def set_chat_administrator_custom_title( - self, - chat_id: Union[int, str], - user_id: int, - custom_title: str, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to set a custom title for administrators promoted by the bot in a - supergroup. The bot must be an administrator for this to work. - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_group| - user_id (:obj:`int`): Unique identifier of the target administrator. - custom_title (:obj:`str`): New custom title for the administrator; - 0-:tg-const:`telegram.constants.ChatLimit.CHAT_ADMINISTRATOR_CUSTOM_TITLE_LENGTH` - characters, emoji are not allowed. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"chat_id": chat_id, "user_id": user_id, "custom_title": custom_title} - - return await self._post( - "setChatAdministratorCustomTitle", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def export_chat_invite_link( - self, - chat_id: Union[str, int], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> str: - """ - Use this method to generate a new primary invite link for a chat; any previously generated - link is revoked. The bot must be an administrator in the chat for this to work and must - have the appropriate admin rights. - - Note: - Each administrator in a chat generates their own invite links. Bots can't use invite - links generated by other administrators. If you want your bot to work with invite - links, it will need to generate its own link using :meth:`export_chat_invite_link` or - by calling the :meth:`get_chat` method. If your bot needs to generate a new primary - invite link replacing its previous one, use :meth:`export_chat_invite_link` again. - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - - Returns: - :obj:`str`: New invite link on success. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"chat_id": chat_id} - return await self._post( - "exportChatInviteLink", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def create_chat_invite_link( - self, - chat_id: Union[str, int], - expire_date: Optional[Union[int, dtm.datetime]] = None, - member_limit: Optional[int] = None, - name: Optional[str] = None, - creates_join_request: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> ChatInviteLink: - """ - Use this method to create an additional invite link for a chat. The bot must be an - administrator in the chat for this to work and must have the appropriate admin rights. - The link can be revoked using the method :meth:`revoke_chat_invite_link`. - - Note: - When joining *public* groups via an invite link, Telegram clients may display the - usual "Join" button, effectively ignoring the invite link. In particular, the parameter - :paramref:`creates_join_request` has no effect in this case. - However, this behavior is undocument and may be subject to change. - See `this GitHub thread <https://github.com/tdlib/telegram-bot-api/issues/429>`_ - for some discussion. - - .. versionadded:: 13.4 - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - expire_date (:obj:`int` | :obj:`datetime.datetime`, optional): Date when the link will - expire. Integer input will be interpreted as Unix timestamp. - |tz-naive-dtms| - member_limit (:obj:`int`, optional): Maximum number of users that can be members of - the chat simultaneously after joining the chat via this invite link; - :tg-const:`telegram.constants.ChatInviteLinkLimit.MIN_MEMBER_LIMIT`- - :tg-const:`telegram.constants.ChatInviteLinkLimit.MAX_MEMBER_LIMIT`. - name (:obj:`str`, optional): Invite link name; - 0-:tg-const:`telegram.constants.ChatInviteLinkLimit.NAME_LENGTH` characters. - - .. versionadded:: 13.8 - creates_join_request (:obj:`bool`, optional): :obj:`True`, if users joining the chat - via the link need to be approved by chat administrators. - If :obj:`True`, :paramref:`member_limit` can't be specified. - - .. versionadded:: 13.8 - - Returns: - :class:`telegram.ChatInviteLink` - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "chat_id": chat_id, - "expire_date": expire_date, - "member_limit": member_limit, - "name": name, - "creates_join_request": creates_join_request, - } - - result = await self._post( - "createChatInviteLink", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - return ChatInviteLink.de_json(result, self) - - async def edit_chat_invite_link( - self, - chat_id: Union[str, int], - invite_link: Union[str, "ChatInviteLink"], - expire_date: Optional[Union[int, dtm.datetime]] = None, - member_limit: Optional[int] = None, - name: Optional[str] = None, - creates_join_request: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> ChatInviteLink: - """ - Use this method to edit a non-primary invite link created by the bot. The bot must be an - administrator in the chat for this to work and must have the appropriate admin rights. - - Note: - Though not stated explicitly in the official docs, Telegram changes not only the - optional parameters that are explicitly passed, but also replaces all other optional - parameters to the default values. However, since not documented, this behaviour may - change unbeknown to PTB. - - .. versionadded:: 13.4 - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - invite_link (:obj:`str` | :class:`telegram.ChatInviteLink`): The invite link to edit. - - .. versionchanged:: 20.0 - Now also accepts :class:`telegram.ChatInviteLink` instances. - expire_date (:obj:`int` | :obj:`datetime.datetime`, optional): Date when the link will - expire. - |tz-naive-dtms| - member_limit (:obj:`int`, optional): Maximum number of users that can be members of - the chat simultaneously after joining the chat via this invite link; - :tg-const:`telegram.constants.ChatInviteLinkLimit.MIN_MEMBER_LIMIT`- - :tg-const:`telegram.constants.ChatInviteLinkLimit.MAX_MEMBER_LIMIT`. - name (:obj:`str`, optional): Invite link name; - 0-:tg-const:`telegram.constants.ChatInviteLinkLimit.NAME_LENGTH` characters. - - .. versionadded:: 13.8 - creates_join_request (:obj:`bool`, optional): :obj:`True`, if users joining the chat - via the link need to be approved by chat administrators. - If :obj:`True`, :paramref:`member_limit` can't be specified. - - .. versionadded:: 13.8 - - Returns: - :class:`telegram.ChatInviteLink` - - Raises: - :class:`telegram.error.TelegramError` - - """ - link = invite_link.invite_link if isinstance(invite_link, ChatInviteLink) else invite_link - data: JSONDict = { - "chat_id": chat_id, - "invite_link": link, - "expire_date": expire_date, - "member_limit": member_limit, - "name": name, - "creates_join_request": creates_join_request, - } - - result = await self._post( - "editChatInviteLink", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - return ChatInviteLink.de_json(result, self) - - async def revoke_chat_invite_link( - self, - chat_id: Union[str, int], - invite_link: Union[str, "ChatInviteLink"], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> ChatInviteLink: - """ - Use this method to revoke an invite link created by the bot. If the primary link is - revoked, a new link is automatically generated. The bot must be an administrator in the - chat for this to work and must have the appropriate admin rights. - - .. versionadded:: 13.4 - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - invite_link (:obj:`str` | :class:`telegram.ChatInviteLink`): The invite link to revoke. - - .. versionchanged:: 20.0 - Now also accepts :class:`telegram.ChatInviteLink` instances. - - Returns: - :class:`telegram.ChatInviteLink` - - Raises: - :class:`telegram.error.TelegramError` - - """ - link = invite_link.invite_link if isinstance(invite_link, ChatInviteLink) else invite_link - data: JSONDict = {"chat_id": chat_id, "invite_link": link} - - result = await self._post( - "revokeChatInviteLink", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - return ChatInviteLink.de_json(result, self) - - async def approve_chat_join_request( - self, - chat_id: Union[str, int], - user_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Use this method to approve a chat join request. - - The bot must be an administrator in the chat for this to work and must have the - :attr:`telegram.ChatPermissions.can_invite_users` administrator right. - - .. versionadded:: 13.8 - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - user_id (:obj:`int`): Unique identifier of the target user. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = {"chat_id": chat_id, "user_id": user_id} - - return await self._post( - "approveChatJoinRequest", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def decline_chat_join_request( - self, - chat_id: Union[str, int], - user_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Use this method to decline a chat join request. - - The bot must be an administrator in the chat for this to work and must have the - :attr:`telegram.ChatPermissions.can_invite_users` administrator right. - - .. versionadded:: 13.8 - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - user_id (:obj:`int`): Unique identifier of the target user. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = {"chat_id": chat_id, "user_id": user_id} - - return await self._post( - "declineChatJoinRequest", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def set_chat_photo( - self, - chat_id: Union[str, int], - photo: FileInput, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Use this method to set a new profile photo for the chat. - - Photos can't be changed for private chats. The bot must be an administrator in the chat - for this to work and must have the appropriate admin rights. - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - photo (:term:`file object` | :obj:`bytes` | :class:`pathlib.Path`): New chat photo. - |uploadinput| - - .. versionchanged:: 13.2 - Accept :obj:`bytes` as input. - - .. versionchanged:: 20.0 - File paths as input is also accepted for bots *not* running in - :paramref:`~telegram.Bot.local_mode`. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"chat_id": chat_id, "photo": self._parse_file_input(photo)} - return await self._post( - "setChatPhoto", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def delete_chat_photo( - self, - chat_id: Union[str, int], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to delete a chat photo. Photos can't be changed for private chats. The bot - must be an administrator in the chat for this to work and must have the appropriate admin - rights. - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"chat_id": chat_id} - return await self._post( - "deleteChatPhoto", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def set_chat_title( - self, - chat_id: Union[str, int], - title: str, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to change the title of a chat. Titles can't be changed for private chats. - The bot must be an administrator in the chat for this to work and must have the appropriate - admin rights. - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - title (:obj:`str`): New chat title, - :tg-const:`telegram.constants.ChatLimit.MIN_CHAT_TITLE_LENGTH`- - :tg-const:`telegram.constants.ChatLimit.MAX_CHAT_TITLE_LENGTH` characters. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"chat_id": chat_id, "title": title} - return await self._post( - "setChatTitle", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def set_chat_description( - self, - chat_id: Union[str, int], - description: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to change the description of a group, a supergroup or a channel. The bot - must be an administrator in the chat for this to work and must have the appropriate admin - rights. - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - description (:obj:`str`, optional): New chat description, - 0-:tg-const:`telegram.constants.ChatLimit.CHAT_DESCRIPTION_LENGTH` - characters. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"chat_id": chat_id, "description": description} - - return await self._post( - "setChatDescription", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def set_user_emoji_status( - self, - user_id: int, - emoji_status_custom_emoji_id: Optional[str] = None, - emoji_status_expiration_date: Optional[Union[int, dtm.datetime]] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Changes the emoji status for a given user that previously allowed the bot to manage - their emoji status via the Mini App method - `requestEmojiStatusAccess <https://core.telegram.org/bots/webapps#initializing-mini-apps>`_ - . - - .. versionadded:: 21.8 - - Args: - user_id (:obj:`int`): Unique identifier of the target user - emoji_status_custom_emoji_id (:obj:`str`, optional): Custom emoji identifier of the - emoji status to set. Pass an empty string to remove the status. - emoji_status_expiration_date (Union[:obj:`int`, :obj:`datetime.datetime`], optional): - Expiration date of the emoji status, if any, as unix timestamp or - :class:`datetime.datetime` object. - |tz-naive-dtms| - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "user_id": user_id, - "emoji_status_custom_emoji_id": emoji_status_custom_emoji_id, - "emoji_status_expiration_date": emoji_status_expiration_date, - } - return await self._post( - "setUserEmojiStatus", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def pin_chat_message( - self, - chat_id: Union[str, int], - message_id: int, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - business_connection_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to add a message to the list of pinned messages in a chat. If the - chat is not a private chat, the bot must be an administrator in the chat for this to work - and must have the :paramref:`~telegram.ChatAdministratorRights.can_pin_messages` admin - right in a supergroup or :attr:`~telegram.ChatMemberAdministrator.can_edit_messages` admin - right in a channel. - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - message_id (:obj:`int`): Identifier of a message to pin. - disable_notification (:obj:`bool`, optional): Pass :obj:`True`, if it is not necessary - to send a notification to all chat members about the new pinned message. - Notifications are always disabled in channels and private chats. - business_connection_id (:obj:`str`, optional): Unique identifier of the business - connection on behalf of which the message will be pinned. - - .. versionadded:: 21.5 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "chat_id": chat_id, - "message_id": message_id, - "disable_notification": disable_notification, - "business_connection_id": business_connection_id, - } - - return await self._post( - "pinChatMessage", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def unpin_chat_message( - self, - chat_id: Union[str, int], - message_id: Optional[int] = None, - business_connection_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to remove a message from the list of pinned messages in a chat. If the - chat is not a private chat, the bot must be an administrator in the chat for this to work - and must have the :paramref:`~telegram.ChatAdministratorRights.can_pin_messages` admin - right in a supergroup or :attr:`~telegram.ChatMemberAdministrator.can_edit_messages` admin - right in a channel. - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - message_id (:obj:`int`, optional): Identifier of the message to unpin. Required if - :paramref:`business_connection_id` is specified. If not specified, - the most recent pinned message (by sending date) will be unpinned. - business_connection_id (:obj:`str`, optional): Unique identifier of the business - connection on behalf of which the message will be unpinned. - - .. versionadded:: 21.5 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "chat_id": chat_id, - "message_id": message_id, - "business_connection_id": business_connection_id, - } - - return await self._post( - "unpinChatMessage", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def unpin_all_chat_messages( - self, - chat_id: Union[str, int], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to clear the list of pinned messages in a chat. If the - chat is not a private chat, the bot must be an administrator in the chat for this - to work and must have the :paramref:`~telegram.ChatAdministratorRights.can_pin_messages` - admin right in a supergroup or :attr:`~telegram.ChatMemberAdministrator.can_edit_messages` - admin right in a channel. - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"chat_id": chat_id} - return await self._post( - "unpinAllChatMessages", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def get_sticker_set( - self, - name: str, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> StickerSet: - """Use this method to get a sticker set. - - Args: - name (:obj:`str`): Name of the sticker set. - - Returns: - :class:`telegram.StickerSet` - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"name": name} - result = await self._post( - "getStickerSet", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - return StickerSet.de_json(result, self) - - async def get_custom_emoji_stickers( - self, - custom_emoji_ids: Sequence[str], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> tuple[Sticker, ...]: - """ - Use this method to get information about emoji stickers by their identifiers. - - .. versionchanged:: 20.0 - Returns a tuple instead of a list. - - Args: - custom_emoji_ids (Sequence[:obj:`str`]): Sequence of custom emoji identifiers. - At most :tg-const:`telegram.constants.CustomEmojiStickerLimit.\ -CUSTOM_EMOJI_IDENTIFIER_LIMIT` custom emoji identifiers can be specified. - - .. versionchanged:: 20.0 - |sequenceargs| - - Returns: - tuple[:class:`telegram.Sticker`] - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"custom_emoji_ids": custom_emoji_ids} - result = await self._post( - "getCustomEmojiStickers", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - return Sticker.de_list(result, self) - - async def upload_sticker_file( - self, - user_id: int, - sticker: FileInput, - sticker_format: str, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> File: - """ - Use this method to upload a file with a sticker for later use in the - :meth:`create_new_sticker_set` and :meth:`add_sticker_to_set` methods (can be used multiple - times). - - .. versionchanged:: 20.5 - Removed deprecated parameter ``png_sticker``. - - Args: - user_id (:obj:`int`): User identifier of sticker file owner. - sticker (:obj:`str` | :term:`file object` | :class:`~telegram.InputFile` | \ - :obj:`bytes` | :class:`pathlib.Path`): A file with the sticker in the - ``".WEBP"``, ``".PNG"``, ``".TGS"`` or ``".WEBM"`` - format. See `here <https://core.telegram.org/stickers>`_ for technical requirements - . |uploadinput| - - .. versionadded:: 20.2 - - sticker_format (:obj:`str`): Format of the sticker. Must be one of - :attr:`telegram.constants.StickerFormat.STATIC`, - :attr:`telegram.constants.StickerFormat.ANIMATED`, - :attr:`telegram.constants.StickerFormat.VIDEO`. - - .. versionadded:: 20.2 - - Returns: - :class:`telegram.File`: On success, the uploaded File is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "user_id": user_id, - "sticker": self._parse_file_input(sticker), - "sticker_format": sticker_format, - } - result = await self._post( - "uploadStickerFile", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - return File.de_json(result, self) - - async def add_sticker_to_set( - self, - user_id: int, - name: str, - sticker: "InputSticker", - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to add a new sticker to a set created by the bot. The format of the added - sticker must match the format of the other stickers in the set. Emoji sticker sets can have - up to :tg-const:`telegram.constants.StickerSetLimit.MAX_EMOJI_STICKERS` stickers. Other - sticker sets can have up to - :tg-const:`telegram.constants.StickerSetLimit.MAX_STATIC_STICKERS` stickers. - - .. versionchanged:: 20.2 - Since Bot API 6.6, the parameter :paramref:`sticker` replace the parameters - ``png_sticker``, ``tgs_sticker``, ``webm_sticker``, ``emojis``, and ``mask_position``. - - .. versionchanged:: 20.5 - Removed deprecated parameters ``png_sticker``, ``tgs_sticker``, ``webm_sticker``, - ``emojis``, and ``mask_position``. - - Args: - user_id (:obj:`int`): User identifier of created sticker set owner. - name (:obj:`str`): Sticker set name. - sticker (:class:`telegram.InputSticker`): An object with information about the added - sticker. If exactly the same sticker had already been added to the set, then the - set isn't changed. - - .. versionadded:: 20.2 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "user_id": user_id, - "name": name, - "sticker": sticker, - } - - return await self._post( - "addStickerToSet", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def set_sticker_position_in_set( - self, - sticker: Union[str, "Sticker"], - position: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Use this method to move a sticker in a set created by the bot to a specific position. - - Args: - sticker (:obj:`str` | :class:`~telegram.Sticker`): File identifier of the sticker or - the sticker object. - - .. versionchanged:: 21.10 - Accepts also :class:`telegram.Sticker` instances. - position (:obj:`int`): New sticker position in the set, zero-based. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "sticker": sticker if isinstance(sticker, str) else sticker.file_id, - "position": position, - } - return await self._post( - "setStickerPositionInSet", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def create_new_sticker_set( - self, - user_id: int, - name: str, - title: str, - stickers: Sequence["InputSticker"], - sticker_type: Optional[str] = None, - needs_repainting: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to create new sticker set owned by a user. - The bot will be able to edit the created sticker set thus created. - - .. versionchanged:: 20.0 - The parameter ``contains_masks`` has been removed. Use :paramref:`sticker_type` - instead. - - .. versionchanged:: 20.2 - Since Bot API 6.6, the parameters :paramref:`stickers` and :paramref:`sticker_format` - replace the parameters ``png_sticker``, ``tgs_sticker``,``webm_sticker``, ``emojis``, - and ``mask_position``. - - .. versionchanged:: 20.5 - Removed the deprecated parameters mentioned above and adjusted the order of the - parameters. - - .. versionremoved:: 21.2 - Removed the deprecated parameter ``sticker_format``. - - Args: - user_id (:obj:`int`): User identifier of created sticker set owner. - name (:obj:`str`): Short name of sticker set, to be used in t.me/addstickers/ URLs - (e.g., animals). Can contain only english letters, digits and underscores. - Must begin with a letter, can't contain consecutive underscores and - must end in "_by_<bot username>". <bot_username> is case insensitive. - :tg-const:`telegram.constants.StickerLimit.MIN_NAME_AND_TITLE`- - :tg-const:`telegram.constants.StickerLimit.MAX_NAME_AND_TITLE` characters. - title (:obj:`str`): Sticker set title, - :tg-const:`telegram.constants.StickerLimit.MIN_NAME_AND_TITLE`- - :tg-const:`telegram.constants.StickerLimit.MAX_NAME_AND_TITLE` characters. - - stickers (Sequence[:class:`telegram.InputSticker`]): A sequence of - :tg-const:`telegram.constants.StickerSetLimit.MIN_INITIAL_STICKERS`- - :tg-const:`telegram.constants.StickerSetLimit.MAX_INITIAL_STICKERS` initial - stickers to be added to the sticker set. - - .. versionadded:: 20.2 - - sticker_type (:obj:`str`, optional): Type of stickers in the set, pass - :attr:`telegram.Sticker.REGULAR` or :attr:`telegram.Sticker.MASK`, or - :attr:`telegram.Sticker.CUSTOM_EMOJI`. By default, a regular sticker set is created - - .. versionadded:: 20.0 - - needs_repainting (:obj:`bool`, optional): Pass :obj:`True` if stickers in the sticker - set must be repainted to the color of text when used in messages, the accent color - if used as emoji status, white on chat photos, or another appropriate color based - on context; for custom emoji sticker sets only. - - .. versionadded:: 20.2 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = { - "user_id": user_id, - "name": name, - "title": title, - "stickers": stickers, - "sticker_type": sticker_type, - "needs_repainting": needs_repainting, - } - - return await self._post( - "createNewStickerSet", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def delete_sticker_from_set( - self, - sticker: Union[str, "Sticker"], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Use this method to delete a sticker from a set created by the bot. - - Args: - sticker (:obj:`str` | :class:`telegram.Sticker`): File identifier of the sticker or - the sticker object. - - .. versionchanged:: 21.10 - Accepts also :class:`telegram.Sticker` instances. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"sticker": sticker if isinstance(sticker, str) else sticker.file_id} - return await self._post( - "deleteStickerFromSet", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def delete_sticker_set( - self, - name: str, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to delete a sticker set that was created by the bot. - - .. versionadded:: 20.2 - - Args: - name (:obj:`str`): Sticker set name. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"name": name} - return await self._post( - "deleteStickerSet", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def set_sticker_set_thumbnail( - self, - name: str, - user_id: int, - format: str, # pylint: disable=redefined-builtin - thumbnail: Optional[FileInput] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Use this method to set the thumbnail of a regular or mask sticker set. The format of the - thumbnail file must match the format of the stickers in the set. - - .. versionadded:: 20.2 - - .. versionchanged:: 21.1 - As per Bot API 7.2, the new argument :paramref:`format` will be required, and thus the - order of the arguments had to be changed. - - Args: - name (:obj:`str`): Sticker set name - user_id (:obj:`int`): User identifier of created sticker set owner. - format (:obj:`str`): Format of the added sticker, must be one of - :tg-const:`telegram.constants.StickerFormat.STATIC` for a - ``.WEBP`` or ``.PNG`` image, :tg-const:`telegram.constants.StickerFormat.ANIMATED` - for a ``.TGS`` animation, :tg-const:`telegram.constants.StickerFormat.VIDEO` for a - ``.WEBM`` video. - - .. versionadded:: 21.1 - - thumbnail (:obj:`str` | :term:`file object` | :class:`~telegram.InputFile` | \ - :obj:`bytes` | :class:`pathlib.Path`, optional): A **.WEBP** or **.PNG** image - with the thumbnail, must - be up to :tg-const:`telegram.constants.StickerSetLimit.MAX_STATIC_THUMBNAIL_SIZE` - kilobytes in size and have width and height of exactly - :tg-const:`telegram.constants.StickerSetLimit.STATIC_THUMB_DIMENSIONS` px, or a - **.TGS** animation with the thumbnail up to - :tg-const:`telegram.constants.StickerSetLimit.MAX_ANIMATED_THUMBNAIL_SIZE` - kilobytes in size; see - `the docs <https://core.telegram.org/stickers#animation-requirements>`_ for - animated sticker technical requirements, or a ``.WEBM`` video with the thumbnail up - to :tg-const:`telegram.constants.StickerSetLimit.MAX_ANIMATED_THUMBNAIL_SIZE` - kilobytes in size; see - `this <https://core.telegram.org/stickers#video-requirements>`_ for video sticker - technical requirements. - - |fileinput| - - Animated and video sticker set thumbnails can't be uploaded via HTTP URL. If - omitted, then the thumbnail is dropped and the first sticker is used as the - thumbnail. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "name": name, - "user_id": user_id, - "thumbnail": self._parse_file_input(thumbnail) if thumbnail else None, - "format": format, - } - - return await self._post( - "setStickerSetThumbnail", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def set_sticker_set_title( - self, - name: str, - title: str, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to set the title of a created sticker set. - - .. versionadded:: 20.2 - - Args: - name (:obj:`str`): Sticker set name. - title (:obj:`str`): Sticker set title, - :tg-const:`telegram.constants.StickerLimit.MIN_NAME_AND_TITLE`- - :tg-const:`telegram.constants.StickerLimit.MAX_NAME_AND_TITLE` characters. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"name": name, "title": title} - return await self._post( - "setStickerSetTitle", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def set_sticker_emoji_list( - self, - sticker: Union[str, "Sticker"], - emoji_list: Sequence[str], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to change the list of emoji assigned to a regular or custom emoji sticker. - The sticker must belong to a sticker set created by the bot. - - .. versionadded:: 20.2 - - Args: - sticker (:obj:`str` | :class:`~telegram.Sticker`): File identifier of the sticker or - the sticker object. - - .. versionchanged:: 21.10 - Accepts also :class:`telegram.Sticker` instances. - emoji_list (Sequence[:obj:`str`]): A sequence of - :tg-const:`telegram.constants.StickerLimit.MIN_STICKER_EMOJI`- - :tg-const:`telegram.constants.StickerLimit.MAX_STICKER_EMOJI` emoji associated with - the sticker. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = { - "sticker": sticker if isinstance(sticker, str) else sticker.file_id, - "emoji_list": emoji_list, - } - return await self._post( - "setStickerEmojiList", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def set_sticker_keywords( - self, - sticker: Union[str, "Sticker"], - keywords: Optional[Sequence[str]] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to change search keywords assigned to a regular or custom emoji sticker. - The sticker must belong to a sticker set created by the bot. - - .. versionadded:: 20.2 - - Args: - sticker (:obj:`str` | :class:`~telegram.Sticker`): File identifier of the sticker or - the sticker object. - - .. versionchanged:: 21.10 - Accepts also :class:`telegram.Sticker` instances. - keywords (Sequence[:obj:`str`]): A sequence of - 0-:tg-const:`telegram.constants.StickerLimit.MAX_SEARCH_KEYWORDS` search keywords - for the sticker with total length up to - :tg-const:`telegram.constants.StickerLimit.MAX_KEYWORD_LENGTH` characters. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = { - "sticker": sticker if isinstance(sticker, str) else sticker.file_id, - "keywords": keywords, - } - return await self._post( - "setStickerKeywords", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def set_sticker_mask_position( - self, - sticker: Union[str, "Sticker"], - mask_position: Optional[MaskPosition] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to change the mask position of a mask sticker. - The sticker must belong to a sticker set that was created by the bot. - - .. versionadded:: 20.2 - - Args: - sticker (:obj:`str` | :class:`~telegram.Sticker`): File identifier of the sticker or - the sticker object. - - .. versionchanged:: 21.10 - Accepts also :class:`telegram.Sticker` instances. - mask_position (:class:`telegram.MaskPosition`, optional): A object with the position - where the mask should be placed on faces. Omit the parameter to remove the mask - position. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = { - "sticker": sticker if isinstance(sticker, str) else sticker.file_id, - "mask_position": mask_position, - } - return await self._post( - "setStickerMaskPosition", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def set_custom_emoji_sticker_set_thumbnail( - self, - name: str, - custom_emoji_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to set the thumbnail of a custom emoji sticker set. - - .. versionadded:: 20.2 - - Args: - name (:obj:`str`): Sticker set name. - custom_emoji_id (:obj:`str`, optional): Custom emoji identifier of a sticker from the - sticker set; pass an empty string to drop the thumbnail and use the first sticker - as the thumbnail. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"name": name, "custom_emoji_id": custom_emoji_id} - - return await self._post( - "setCustomEmojiStickerSetThumbnail", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def set_passport_data_errors( - self, - user_id: int, - errors: Sequence["PassportElementError"], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Informs a user that some of the Telegram Passport elements they provided contains errors. - The user will not be able to re-submit their Passport to you until the errors are fixed - (the contents of the field for which you returned the error must change). - - Use this if the data submitted by the user doesn't satisfy the standards your service - requires for any reason. For example, if a birthday date seems invalid, a submitted - document is blurry, a scan shows evidence of tampering, etc. Supply some details in the - error message to make sure the user knows how to correct the issues. - - Args: - user_id (:obj:`int`): User identifier - errors (Sequence[:class:`PassportElementError`]): A Sequence describing the errors. - - .. versionchanged:: 20.0 - |sequenceargs| - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"user_id": user_id, "errors": errors} - return await self._post( - "setPassportDataErrors", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def send_poll( - self, - chat_id: Union[int, str], - question: str, - options: Sequence[Union[str, "InputPollOption"]], - is_anonymous: Optional[bool] = None, - type: Optional[str] = None, # pylint: disable=redefined-builtin - allows_multiple_answers: Optional[bool] = None, - correct_option_id: Optional[CorrectOptionID] = None, - is_closed: Optional[bool] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - explanation: Optional[str] = None, - explanation_parse_mode: ODVInput[str] = DEFAULT_NONE, - open_period: Optional[TimePeriod] = None, - close_date: Optional[Union[int, dtm.datetime]] = None, - explanation_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - question_parse_mode: ODVInput[str] = DEFAULT_NONE, - question_entities: Optional[Sequence["MessageEntity"]] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - reply_to_message_id: Optional[int] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Message: - """ - Use this method to send a native poll. - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - question (:obj:`str`): Poll question, :tg-const:`telegram.Poll.MIN_QUESTION_LENGTH`- - :tg-const:`telegram.Poll.MAX_QUESTION_LENGTH` characters. - options (Sequence[:obj:`str` | :class:`telegram.InputPollOption`]): Sequence of - :tg-const:`telegram.Poll.MIN_OPTION_NUMBER`- - :tg-const:`telegram.Poll.MAX_OPTION_NUMBER` answer options. Each option may either - be a string with - :tg-const:`telegram.Poll.MIN_OPTION_LENGTH`- - :tg-const:`telegram.Poll.MAX_OPTION_LENGTH` characters or an - :class:`~telegram.InputPollOption` object. Strings are converted to - :class:`~telegram.InputPollOption` objects automatically. - - .. versionchanged:: 20.0 - |sequenceargs| - - .. versionchanged:: 21.2 - Bot API 7.3 adds support for :class:`~telegram.InputPollOption` objects. - is_anonymous (:obj:`bool`, optional): :obj:`True`, if the poll needs to be anonymous, - defaults to :obj:`True`. - type (:obj:`str`, optional): Poll type, :tg-const:`telegram.Poll.QUIZ` or - :tg-const:`telegram.Poll.REGULAR`, defaults to :tg-const:`telegram.Poll.REGULAR`. - allows_multiple_answers (:obj:`bool`, optional): :obj:`True`, if the poll allows - multiple answers, ignored for polls in quiz mode, defaults to :obj:`False`. - correct_option_id (:obj:`int`, optional): 0-based identifier of the correct answer - option, required for polls in quiz mode. - explanation (:obj:`str`, optional): Text that is shown when a user chooses an incorrect - answer or taps on the lamp icon in a quiz-style poll, - 0-:tg-const:`telegram.Poll.MAX_EXPLANATION_LENGTH` characters with at most - :tg-const:`telegram.Poll.MAX_EXPLANATION_LINE_FEEDS` line feeds after entities - parsing. - explanation_parse_mode (:obj:`str`, optional): Mode for parsing entities in the - explanation. See the constants in :class:`telegram.constants.ParseMode` for the - available modes. - explanation_entities (Sequence[:class:`telegram.MessageEntity`], optional): Sequence of - special entities that appear in message text, which can be specified instead of - :paramref:`explanation_parse_mode`. - - .. versionchanged:: 20.0 - |sequenceargs| - open_period (:obj:`int` | :class:`datetime.timedelta`, optional): Amount of time in - seconds the poll will be active - after creation, :tg-const:`telegram.Poll.MIN_OPEN_PERIOD`- - :tg-const:`telegram.Poll.MAX_OPEN_PERIOD`. Can't be used together with - :paramref:`close_date`. - - .. versionchanged:: 21.11 - |time-period-input| - close_date (:obj:`int` | :obj:`datetime.datetime`, optional): Point in time (Unix - timestamp) when the poll will be automatically closed. Must be at least - :tg-const:`telegram.Poll.MIN_OPEN_PERIOD` and no more than - :tg-const:`telegram.Poll.MAX_OPEN_PERIOD` seconds in the future. - Can't be used together with :paramref:`open_period`. - |tz-naive-dtms| - is_closed (:obj:`bool`, optional): Pass :obj:`True`, if the poll needs to be - immediately closed. This can be useful for poll preview. - disable_notification (:obj:`bool`, optional): |disable_notification| - protect_content (:obj:`bool`, optional): |protect_content| - - .. versionadded:: 13.10 - message_thread_id (:obj:`int`, optional): |message_thread_id_arg| - - .. versionadded:: 20.0 - - reply_markup (:class:`InlineKeyboardMarkup` | :class:`ReplyKeyboardMarkup` | \ - :class:`ReplyKeyboardRemove` | :class:`ForceReply`, optional): - Additional interface options. An object for an inline keyboard, custom reply - keyboard, instructions to remove reply keyboard or to force a reply from the user. - reply_parameters (:class:`telegram.ReplyParameters`, optional): |reply_parameters| - - .. versionadded:: 20.8 - business_connection_id (:obj:`str`, optional): |business_id_str| - - .. versionadded:: 21.1 - question_parse_mode (:obj:`str`, optional): Mode for parsing entities in the question. - See the constants in :class:`telegram.constants.ParseMode` for the available modes. - Currently, only custom emoji entities are allowed. - - .. versionadded:: 21.2 - question_entities (Sequence[:class:`telegram.Message`], optional): Special entities - that appear in the poll :paramref:`question`. It can be specified instead of - :paramref:`question_parse_mode`. - - .. versionadded:: 21.2 - message_effect_id (:obj:`str`, optional): |message_effect_id| - - .. versionadded:: 21.3 - allow_paid_broadcast (:obj:`bool`, optional): |allow_paid_broadcast| - - .. versionadded:: 21.7 - - Keyword Args: - allow_sending_without_reply (:obj:`bool`, optional): |allow_sending_without_reply| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - reply_to_message_id (:obj:`int`, optional): |reply_to_msg_id| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - - Returns: - :class:`telegram.Message`: On success, the sent Message is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "chat_id": chat_id, - "question": question, - "options": [ - InputPollOption(option) if isinstance(option, str) else option - for option in options - ], - "explanation_parse_mode": explanation_parse_mode, - "is_anonymous": is_anonymous, - "type": type, - "allows_multiple_answers": allows_multiple_answers, - "correct_option_id": correct_option_id, - "is_closed": is_closed, - "explanation": explanation, - "explanation_entities": explanation_entities, - "open_period": open_period, - "close_date": close_date, - "question_parse_mode": question_parse_mode, - "question_entities": question_entities, - } - - return await self._send_message( - "sendPoll", - data, - reply_to_message_id=reply_to_message_id, - disable_notification=disable_notification, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - reply_parameters=reply_parameters, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def stop_poll( - self, - chat_id: Union[int, str], - message_id: int, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - business_connection_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Poll: - """ - Use this method to stop a poll which was sent by the bot. - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - message_id (:obj:`int`): Identifier of the original message with the poll. - reply_markup (:class:`telegram.InlineKeyboardMarkup`, optional): An object for a new - message inline keyboard. - business_connection_id (:obj:`str`, optional): |business_id_str_edit| - - .. versionadded:: 21.4 - - Returns: - :class:`telegram.Poll`: On success, the stopped Poll is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "chat_id": chat_id, - "message_id": message_id, - "reply_markup": reply_markup, - "business_connection_id": business_connection_id, - } - - result = await self._post( - "stopPoll", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - return Poll.de_json(result, self) - - async def send_dice( - self, - chat_id: Union[int, str], - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - emoji: Optional[str] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - reply_to_message_id: Optional[int] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Message: - """ - Use this method to send an animated emoji that will display a random value. - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - disable_notification (:obj:`bool`, optional): |disable_notification| - reply_markup (:class:`InlineKeyboardMarkup` | :class:`ReplyKeyboardMarkup` | \ - :class:`ReplyKeyboardRemove` | :class:`ForceReply`, optional): - Additional interface options. An object for an inline keyboard, custom reply - keyboard, instructions to remove reply keyboard or to force a reply from the user - emoji (:obj:`str`, optional): Emoji on which the dice throw animation is based. - Currently, must be one of :class:`telegram.constants.DiceEmoji`. Dice can have - values - :tg-const:`telegram.Dice.MIN_VALUE`-:tg-const:`telegram.Dice.MAX_VALUE_BOWLING` - for :tg-const:`telegram.Dice.DICE`, :tg-const:`telegram.Dice.DARTS` and - :tg-const:`telegram.Dice.BOWLING`, values - :tg-const:`telegram.Dice.MIN_VALUE`-:tg-const:`telegram.Dice.MAX_VALUE_BASKETBALL` - for :tg-const:`telegram.Dice.BASKETBALL` and :tg-const:`telegram.Dice.FOOTBALL`, - and values :tg-const:`telegram.Dice.MIN_VALUE`- - :tg-const:`telegram.Dice.MAX_VALUE_SLOT_MACHINE` - for :tg-const:`telegram.Dice.SLOT_MACHINE`. Defaults to - :tg-const:`telegram.Dice.DICE`. - - .. versionchanged:: 13.4 - Added the :tg-const:`telegram.Dice.BOWLING` emoji. - protect_content (:obj:`bool`, optional): |protect_content| - - .. versionadded:: 13.10 - message_thread_id (:obj:`int`, optional): |message_thread_id_arg| - - .. versionadded:: 20.0 - reply_parameters (:class:`telegram.ReplyParameters`, optional): |reply_parameters| - - .. versionadded:: 20.8 - business_connection_id (:obj:`str`, optional): |business_id_str| - - .. versionadded:: 21.1 - message_effect_id (:obj:`str`, optional): |message_effect_id| - - .. versionadded:: 21.3 - allow_paid_broadcast (:obj:`bool`, optional): |allow_paid_broadcast| - - .. versionadded:: 21.7 - - Keyword Args: - allow_sending_without_reply (:obj:`bool`, optional): |allow_sending_without_reply| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - reply_to_message_id (:obj:`int`, optional): |reply_to_msg_id| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - - - Returns: - :class:`telegram.Message`: On success, the sent Message is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"chat_id": chat_id, "emoji": emoji} - - return await self._send_message( - "sendDice", - data, - reply_to_message_id=reply_to_message_id, - disable_notification=disable_notification, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - reply_parameters=reply_parameters, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def get_my_default_administrator_rights( - self, - for_channels: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> ChatAdministratorRights: - """Use this method to get the current default administrator rights of the bot. - - .. seealso:: :meth:`set_my_default_administrator_rights` - - .. versionadded:: 20.0 - - Args: - for_channels (:obj:`bool`, optional): Pass :obj:`True` to get default administrator - rights of the bot in channels. Otherwise, default administrator rights of the bot - for groups and supergroups will be returned. - - Returns: - :class:`telegram.ChatAdministratorRights`: On success. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = {"for_channels": for_channels} - - result = await self._post( - "getMyDefaultAdministratorRights", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - return ChatAdministratorRights.de_json(result, self) - - async def set_my_default_administrator_rights( - self, - rights: Optional[ChatAdministratorRights] = None, - for_channels: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Use this method to change the default administrator rights requested by the bot when - it's added as an administrator to groups or channels. These rights will be suggested to - users, but they are free to modify the list before adding the bot. - - .. seealso:: :meth:`get_my_default_administrator_rights` - - .. versionadded:: 20.0 - - Args: - rights (:class:`telegram.ChatAdministratorRights`, optional): A - :class:`telegram.ChatAdministratorRights` object describing new default - administrator - rights. If not specified, the default administrator rights will be cleared. - for_channels (:obj:`bool`, optional): Pass :obj:`True` to change the default - administrator rights of the bot in channels. Otherwise, the default administrator - rights of the bot for groups and supergroups will be changed. - - Returns: - :obj:`bool`: Returns :obj:`True` on success. - - Raises: - :exc:`telegram.error.TelegramError` - """ - data: JSONDict = {"rights": rights, "for_channels": for_channels} - - return await self._post( - "setMyDefaultAdministratorRights", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def get_my_commands( - self, - scope: Optional[BotCommandScope] = None, - language_code: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> tuple[BotCommand, ...]: - """ - Use this method to get the current list of the bot's commands for the given scope and user - language. - - .. seealso:: :meth:`set_my_commands`, :meth:`delete_my_commands` - - .. versionchanged:: 20.0 - Returns a tuple instead of a list. - - Args: - scope (:class:`telegram.BotCommandScope`, optional): An object, - describing scope of users. Defaults to :class:`telegram.BotCommandScopeDefault`. - - .. versionadded:: 13.7 - - language_code (:obj:`str`, optional): A two-letter ISO 639-1 language code or an empty - string. - - .. versionadded:: 13.7 - - Returns: - tuple[:class:`telegram.BotCommand`]: On success, the commands set for the bot. An empty - tuple is returned if commands are not set. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"scope": scope, "language_code": language_code} - - result = await self._post( - "getMyCommands", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - return BotCommand.de_list(result, self) - - async def set_my_commands( - self, - commands: Sequence[Union[BotCommand, tuple[str, str]]], - scope: Optional[BotCommandScope] = None, - language_code: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to change the list of the bot's commands. See the - `Telegram docs <https://core.telegram.org/bots/features#commands>`_ for more details about - bot commands. - - .. seealso:: :meth:`get_my_commands`, :meth:`delete_my_commands` - - Args: - commands (Sequence[:class:`BotCommand` | (:obj:`str`, :obj:`str`)]): A sequence - of bot commands to be set as the list of the bot's commands. At most - :tg-const:`telegram.constants.BotCommandLimit.MAX_COMMAND_NUMBER` commands can be - specified. - - Note: - If you pass in a sequence of :obj:`tuple`, the order of elements in each - :obj:`tuple` must correspond to the order of positional arguments to create a - :class:`BotCommand` instance. - - .. versionchanged:: 20.0 - |sequenceargs| - scope (:class:`telegram.BotCommandScope`, optional): An object, - describing scope of users for which the commands are relevant. Defaults to - :class:`telegram.BotCommandScopeDefault`. - - .. versionadded:: 13.7 - - language_code (:obj:`str`, optional): A two-letter ISO 639-1 language code. If empty, - commands will be applied to all users from the given scope, for whose language - there are no dedicated commands. - - .. versionadded:: 13.7 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - cmds = [c if isinstance(c, BotCommand) else BotCommand(c[0], c[1]) for c in commands] - data: JSONDict = {"commands": cmds, "scope": scope, "language_code": language_code} - - return await self._post( - "setMyCommands", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def delete_my_commands( - self, - scope: Optional[BotCommandScope] = None, - language_code: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to delete the list of the bot's commands for the given scope and user - language. After deletion, - `higher level commands <https://core.telegram.org/bots/api#determining-list-of-commands>`_ - will be shown to affected users. - - .. versionadded:: 13.7 - - .. seealso:: :meth:`get_my_commands`, :meth:`set_my_commands` - - Args: - scope (:class:`telegram.BotCommandScope`, optional): An object, - describing scope of users for which the commands are relevant. Defaults to - :class:`telegram.BotCommandScopeDefault`. - language_code (:obj:`str`, optional): A two-letter ISO 639-1 language code. If empty, - commands will be applied to all users from the given scope, for whose language - there are no dedicated commands. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = {"scope": scope, "language_code": language_code} - - return await self._post( - "deleteMyCommands", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def log_out( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to log out from the cloud Bot API server before launching the bot locally. - You *must* log out the bot before running it locally, otherwise there is no guarantee that - the bot will receive updates. After a successful call, you can immediately log in on a - local server, but will not be able to log in back to the cloud Bot API server for 10 - minutes. - - Returns: - :obj:`True`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - return await self._post( - "logOut", - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def close( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to close the bot instance before moving it from one local server to - another. You need to delete the webhook before calling this method to ensure that the bot - isn't launched again after server restart. The method will return error 429 in the first - 10 minutes after the bot is launched. - - Returns: - :obj:`True`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - return await self._post( - "close", - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def copy_message( - self, - chat_id: Union[int, str], - from_chat_id: Union[str, int], - message_id: int, - caption: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - show_caption_above_media: Optional[bool] = None, - allow_paid_broadcast: Optional[bool] = None, - video_start_timestamp: Optional[int] = None, - *, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - reply_to_message_id: Optional[int] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> MessageId: - """Use this method to copy messages of any kind. Service messages, paid media messages, - giveaway messages, giveaway winners messages, and invoice messages - can't be copied. The method is analogous to the method :meth:`forward_message`, but the - copied message doesn't have a link to the original message. - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - from_chat_id (:obj:`int` | :obj:`str`): Unique identifier for the chat where the - original message was sent (or channel username in the format ``@channelusername``). - message_id (:obj:`int`): Message identifier in the chat specified in from_chat_id. - video_start_timestamp (:obj:`int`, optional): New start timestamp for the - copied video in the message - - .. versionadded:: 21.11 - caption (:obj:`str`, optional): New caption for media, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters after - entities parsing. If not specified, the original caption is kept. - parse_mode (:obj:`str`, optional): Mode for parsing entities in the new caption. See - the constants in :class:`telegram.constants.ParseMode` for the available modes. - caption_entities (Sequence[:class:`telegram.MessageEntity`], optional): - |caption_entities| - - .. versionchanged:: 20.0 - |sequenceargs| - disable_notification (:obj:`bool`, optional): |disable_notification| - protect_content (:obj:`bool`, optional): |protect_content| - - .. versionadded:: 13.10 - message_thread_id (:obj:`int`, optional): |message_thread_id_arg| - - .. versionadded:: 20.0 - - reply_markup (:class:`InlineKeyboardMarkup` | :class:`ReplyKeyboardMarkup` | \ - :class:`ReplyKeyboardRemove` | :class:`ForceReply`, optional): - Additional interface options. An object for an inline keyboard, custom reply - keyboard, instructions to remove reply keyboard or to force a reply from the user. - reply_parameters (:class:`telegram.ReplyParameters`, optional): |reply_parameters| - - .. versionadded:: 20.8 - show_caption_above_media (:obj:`bool`, optional): Pass |show_cap_above_med| - - .. versionadded:: 21.3 - allow_paid_broadcast (:obj:`bool`, optional): |allow_paid_broadcast| - - .. versionadded:: 21.7 - - Keyword Args: - allow_sending_without_reply (:obj:`bool`, optional): |allow_sending_without_reply| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - reply_to_message_id (:obj:`int`, optional): |reply_to_msg_id| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`reply_parameters` |rtm_aswr_deprecated| - - .. versionchanged:: 21.0 - |keyword_only_arg| - - Returns: - :class:`telegram.MessageId`: On success, the :class:`telegram.MessageId` of the sent - message is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - if allow_sending_without_reply is not DEFAULT_NONE and reply_parameters is not None: - raise ValueError( - "`allow_sending_without_reply` and `reply_parameters` are mutually exclusive." - ) - - if reply_to_message_id is not None and reply_parameters is not None: - raise ValueError( - "`reply_to_message_id` and `reply_parameters` are mutually exclusive." - ) - - if reply_to_message_id is not None: - reply_parameters = ReplyParameters( - message_id=reply_to_message_id, - allow_sending_without_reply=allow_sending_without_reply, - ) - - data: JSONDict = { - "chat_id": chat_id, - "from_chat_id": from_chat_id, - "message_id": message_id, - "parse_mode": parse_mode, - "disable_notification": disable_notification, - "protect_content": protect_content, - "caption": caption, - "caption_entities": caption_entities, - "reply_markup": reply_markup, - "message_thread_id": message_thread_id, - "reply_parameters": reply_parameters, - "show_caption_above_media": show_caption_above_media, - "allow_paid_broadcast": allow_paid_broadcast, - "video_start_timestamp": video_start_timestamp, - } - - result = await self._post( - "copyMessage", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - return MessageId.de_json(result, self) - - async def copy_messages( - self, - chat_id: Union[int, str], - from_chat_id: Union[str, int], - message_ids: Sequence[int], - disable_notification: ODVInput[bool] = DEFAULT_NONE, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - remove_caption: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> tuple["MessageId", ...]: - """ - Use this method to copy messages of any kind. If some of the specified messages can't be - found or copied, they are skipped. Service messages, paid media messages, giveaway - messages, giveaway winners messages, and invoice messages can't be copied. A quiz poll can - be copied only if the value - of the field :attr:`telegram.Poll.correct_option_id` is known to the bot. The method is - analogous to the method :meth:`forward_messages`, but the copied messages don't have a - link to the original message. Album grouping is kept for copied messages. - - .. versionadded:: 20.8 - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - from_chat_id (:obj:`int` | :obj:`str`): Unique identifier for the chat where the - original message was sent (or channel username in the format ``@channelusername``). - message_ids (Sequence[:obj:`int`]): A list of - :tg-const:`telegram.constants.BulkRequestLimit.MIN_LIMIT` - - :tg-const:`telegram.constants.BulkRequestLimit.MAX_LIMIT` identifiers of messages - in the chat :paramref:`from_chat_id` to copy. The identifiers must be - specified in a strictly increasing order. - disable_notification (:obj:`bool`, optional): |disable_notification| - protect_content (:obj:`bool`, optional): |protect_content| - message_thread_id (:obj:`int`, optional): |message_thread_id_arg| - remove_caption (:obj:`bool`, optional): Pass :obj:`True` to copy the messages without - their captions. - - Returns: - tuple[:class:`telegram.MessageId`]: On success, a tuple of :class:`~telegram.MessageId` - of the sent messages is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "chat_id": chat_id, - "from_chat_id": from_chat_id, - "message_ids": message_ids, - "disable_notification": disable_notification, - "protect_content": protect_content, - "message_thread_id": message_thread_id, - "remove_caption": remove_caption, - } - - result = await self._post( - "copyMessages", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - return MessageId.de_list(result, self) - - async def set_chat_menu_button( - self, - chat_id: Optional[int] = None, - menu_button: Optional[MenuButton] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Use this method to change the bot's menu button in a private chat, or the default menu - button. - - .. seealso:: :meth:`get_chat_menu_button`, :meth:`telegram.Chat.get_menu_button` - :meth:`telegram.User.get_menu_button` - - .. versionadded:: 20.0 - - Args: - chat_id (:obj:`int`, optional): Unique identifier for the target private chat. If not - specified, default bot's menu button will be changed - menu_button (:class:`telegram.MenuButton`, optional): An object for the new bot's menu - button. Defaults to :class:`telegram.MenuButtonDefault`. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - data: JSONDict = {"chat_id": chat_id, "menu_button": menu_button} - - return await self._post( - "setChatMenuButton", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def get_chat_menu_button( - self, - chat_id: Optional[int] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> MenuButton: - """Use this method to get the current value of the bot's menu button in a private chat, or - the default menu button. - - .. seealso:: :meth:`set_chat_menu_button`, :meth:`telegram.Chat.set_menu_button`, - :meth:`telegram.User.set_menu_button` - - .. versionadded:: 20.0 - - Args: - chat_id (:obj:`int`, optional): Unique identifier for the target private chat. If not - specified, default bot's menu button will be returned. - - Returns: - :class:`telegram.MenuButton`: On success, the current menu button is returned. - - """ - data = {"chat_id": chat_id} - - result = await self._post( - "getChatMenuButton", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - return MenuButton.de_json(result, bot=self) - - async def create_invoice_link( - self, - title: str, - description: str, - payload: str, - currency: str, - prices: Sequence["LabeledPrice"], - provider_token: Optional[str] = None, - max_tip_amount: Optional[int] = None, - suggested_tip_amounts: Optional[Sequence[int]] = None, - provider_data: Optional[Union[str, object]] = None, - photo_url: Optional[str] = None, - photo_size: Optional[int] = None, - photo_width: Optional[int] = None, - photo_height: Optional[int] = None, - need_name: Optional[bool] = None, - need_phone_number: Optional[bool] = None, - need_email: Optional[bool] = None, - need_shipping_address: Optional[bool] = None, - send_phone_number_to_provider: Optional[bool] = None, - send_email_to_provider: Optional[bool] = None, - is_flexible: Optional[bool] = None, - subscription_period: Optional[TimePeriod] = None, - business_connection_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> str: - """Use this method to create a link for an invoice. - - .. versionadded:: 20.0 - - Args: - business_connection_id (:obj:`str`, optional): |business_id_str| - For payments in |tg_stars| only. - - .. versionadded:: 21.8 - title (:obj:`str`): Product name. :tg-const:`telegram.Invoice.MIN_TITLE_LENGTH`- - :tg-const:`telegram.Invoice.MAX_TITLE_LENGTH` characters. - description (:obj:`str`): Product description. - :tg-const:`telegram.Invoice.MIN_DESCRIPTION_LENGTH`- - :tg-const:`telegram.Invoice.MAX_DESCRIPTION_LENGTH` characters. - payload (:obj:`str`): Bot-defined invoice payload. - :tg-const:`telegram.Invoice.MIN_PAYLOAD_LENGTH`- - :tg-const:`telegram.Invoice.MAX_PAYLOAD_LENGTH` bytes. This will not be - displayed to the user, use it for your internal processes. - provider_token (:obj:`str`, optional): Payments provider token, obtained via - `@BotFather <https://t.me/BotFather>`_. Pass an empty string for payments in - |tg_stars|. - - .. versionchanged:: 21.11 - Bot API 7.4 made this parameter is optional and this is now reflected in the - function signature. - - currency (:obj:`str`): Three-letter ISO 4217 currency code, see `more on currencies - <https://core.telegram.org/bots/payments#supported-currencies>`_. Pass ``XTR`` for - payments in |tg_stars|. - prices (Sequence[:class:`telegram.LabeledPrice`)]: Price breakdown, a sequence - of components (e.g. product price, tax, discount, delivery cost, delivery tax, - bonus, etc.). Must contain exactly one item for payments in |tg_stars|. - - .. versionchanged:: 20.0 - |sequenceargs| - subscription_period (:obj:`int` | :class:`datetime.timedelta`, optional): The time the - subscription will be active for before the next payment, either as number of - seconds or as :class:`datetime.timedelta` object. The currency must be set to - ``“XTR”`` (Telegram Stars) if the parameter is used. Currently, it must always be - :tg-const:`telegram.constants.InvoiceLimit.SUBSCRIPTION_PERIOD` if specified. Any - number of subscriptions can be active for a given bot at the same time, including - multiple concurrent subscriptions from the same user. Subscription price must - not exceed - :tg-const:`telegram.constants.InvoiceLimit.SUBSCRIPTION_MAX_PRICE` - Telegram Stars. - - .. versionadded:: 21.8 - max_tip_amount (:obj:`int`, optional): The maximum accepted amount for tips in the - *smallest units* of the currency (integer, **not** float/double). For example, for - a maximum tip of ``US$ 1.45`` pass ``max_tip_amount = 145``. See the ``exp`` - parameter in `currencies.json - <https://core.telegram.org/bots/payments/currencies.json>`_, it shows the number of - digits past the decimal point for each currency (2 for the majority of currencies). - Defaults to ``0``. Not supported for payments in |tg_stars|. - suggested_tip_amounts (Sequence[:obj:`int`], optional): An array of - suggested amounts of tips in the *smallest units* of the currency (integer, **not** - float/double). At most :tg-const:`telegram.Invoice.MAX_TIP_AMOUNTS` suggested tip - amounts can be specified. The suggested tip amounts must be positive, passed in a - strictly increased order and must not exceed :paramref:`max_tip_amount`. - - .. versionchanged:: 20.0 - |sequenceargs| - provider_data (:obj:`str` | :obj:`object`, optional): Data about the - invoice, which will be shared with the payment provider. A detailed description of - required fields should be provided by the payment provider. When an object is - passed, it will be encoded as JSON. - photo_url (:obj:`str`, optional): URL of the product photo for the invoice. Can be a - photo of the goods or a marketing image for a service. - photo_size (:obj:`int`, optional): Photo size in bytes. - photo_width (:obj:`int`, optional): Photo width. - photo_height (:obj:`int`, optional): Photo height. - need_name (:obj:`bool`, optional): Pass :obj:`True`, if you require the user's full - name to complete the order. Ignored for payments in |tg_stars|. - need_phone_number (:obj:`bool`, optional): Pass :obj:`True`, if you require the user's - phone number to complete the order. Ignored for payments in |tg_stars|. - need_email (:obj:`bool`, optional): Pass :obj:`True`, if you require the user's email - address to complete the order. Ignored for payments in |tg_stars|. - need_shipping_address (:obj:`bool`, optional): Pass :obj:`True`, if you require the - user's shipping address to complete the order. Ignored for payments in - |tg_stars|. - send_phone_number_to_provider (:obj:`bool`, optional): Pass :obj:`True`, if user's - phone number should be sent to provider. Ignored for payments in |tg_stars|. - send_email_to_provider (:obj:`bool`, optional): Pass :obj:`True`, if user's email - address should be sent to provider. Ignored for payments in |tg_stars|. - is_flexible (:obj:`bool`, optional): Pass :obj:`True`, if the final price depends on - the shipping method. Ignored for payments in |tg_stars|. - - Returns: - :class:`str`: On success, the created invoice link is returned. - - """ - data: JSONDict = { - "title": title, - "description": description, - "payload": payload, - "provider_token": provider_token, - "currency": currency, - "prices": prices, - "max_tip_amount": max_tip_amount, - "suggested_tip_amounts": suggested_tip_amounts, - "provider_data": provider_data, - "photo_url": photo_url, - "photo_size": photo_size, - "photo_width": photo_width, - "photo_height": photo_height, - "need_name": need_name, - "need_phone_number": need_phone_number, - "need_email": need_email, - "need_shipping_address": need_shipping_address, - "is_flexible": is_flexible, - "send_phone_number_to_provider": send_phone_number_to_provider, - "send_email_to_provider": send_email_to_provider, - "subscription_period": subscription_period, - "business_connection_id": business_connection_id, - } - - return await self._post( - "createInvoiceLink", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def get_forum_topic_icon_stickers( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> tuple[Sticker, ...]: - """Use this method to get custom emoji stickers, which can be used as a forum topic - icon by any user. Requires no parameters. - - .. versionadded:: 20.0 - - Returns: - tuple[:class:`telegram.Sticker`] - - Raises: - :class:`telegram.error.TelegramError` - - """ - result = await self._post( - "getForumTopicIconStickers", - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - return Sticker.de_list(result, self) - - async def create_forum_topic( - self, - chat_id: Union[str, int], - name: str, - icon_color: Optional[int] = None, - icon_custom_emoji_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> ForumTopic: - """ - Use this method to create a topic in a forum supergroup chat. The bot must be - an administrator in the chat for this to work and must have - :paramref:`~telegram.ChatAdministratorRights.can_manage_topics` administrator rights. - - .. versionadded:: 20.0 - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_group| - name (:obj:`str`): New topic name, - :tg-const:`telegram.constants.ForumTopicLimit.MIN_NAME_LENGTH`- - :tg-const:`telegram.constants.ForumTopicLimit.MAX_NAME_LENGTH` characters. - icon_color (:obj:`int`, optional): Color of the topic icon in RGB format. Currently, - must be one of :attr:`telegram.constants.ForumIconColor.BLUE`, - :attr:`telegram.constants.ForumIconColor.YELLOW`, - :attr:`telegram.constants.ForumIconColor.PURPLE`, - :attr:`telegram.constants.ForumIconColor.GREEN`, - :attr:`telegram.constants.ForumIconColor.PINK`, or - :attr:`telegram.constants.ForumIconColor.RED`. - icon_custom_emoji_id (:obj:`str`, optional): New unique identifier of the custom emoji - shown as the topic icon. Use :meth:`~telegram.Bot.get_forum_topic_icon_stickers` - to get all allowed custom emoji identifiers. - - Returns: - :class:`telegram.ForumTopic` - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = { - "chat_id": chat_id, - "name": name, - "icon_color": icon_color, - "icon_custom_emoji_id": icon_custom_emoji_id, - } - result = await self._post( - "createForumTopic", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - return ForumTopic.de_json(result, self) - - async def edit_forum_topic( - self, - chat_id: Union[str, int], - message_thread_id: int, - name: Optional[str] = None, - icon_custom_emoji_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to edit name and icon of a topic in a forum supergroup chat. The bot must - be an administrator in the chat for this to work and must have the - :paramref:`~telegram.ChatAdministratorRights.can_manage_topics` administrator rights, - unless it is the creator of the topic. - - .. versionadded:: 20.0 - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_group| - message_thread_id (:obj:`int`): |message_thread_id| - name (:obj:`str`, optional): New topic name, - :tg-const:`telegram.constants.ForumTopicLimit.MIN_NAME_LENGTH`- - :tg-const:`telegram.constants.ForumTopicLimit.MAX_NAME_LENGTH` characters. If - not specified or empty, the current name of the topic will be kept. - icon_custom_emoji_id (:obj:`str`, optional): New unique identifier of the custom emoji - shown as the topic icon. Use :meth:`~telegram.Bot.get_forum_topic_icon_stickers` - to get all allowed custom emoji identifiers.Pass an empty string to remove the - icon. If not specified, the current icon will be kept. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "chat_id": chat_id, - "message_thread_id": message_thread_id, - "name": name, - "icon_custom_emoji_id": icon_custom_emoji_id, - } - return await self._post( - "editForumTopic", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def close_forum_topic( - self, - chat_id: Union[str, int], - message_thread_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to close an open topic in a forum supergroup chat. The bot must - be an administrator in the chat for this to work and must have - :paramref:`~telegram.ChatAdministratorRights.can_manage_topics` administrator rights, - unless it is the creator of the topic. - - .. versionadded:: 20.0 - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_group| - message_thread_id (:obj:`int`): |message_thread_id| - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "chat_id": chat_id, - "message_thread_id": message_thread_id, - } - return await self._post( - "closeForumTopic", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def reopen_forum_topic( - self, - chat_id: Union[str, int], - message_thread_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to reopen a closed topic in a forum supergroup chat. The bot must - be an administrator in the chat for this to work and must have - :paramref:`~telegram.ChatAdministratorRights.can_manage_topics` administrator rights, - unless it is the creator of the topic. - - .. versionadded:: 20.0 - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_group| - message_thread_id (:obj:`int`): |message_thread_id| - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "chat_id": chat_id, - "message_thread_id": message_thread_id, - } - return await self._post( - "reopenForumTopic", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def delete_forum_topic( - self, - chat_id: Union[str, int], - message_thread_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to delete a forum topic along with all its messages in a forum supergroup - chat. The bot must be an administrator in the chat for this to work and must have - :paramref:`~telegram.ChatAdministratorRights.can_delete_messages` administrator rights. - - .. versionadded:: 20.0 - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_group| - message_thread_id (:obj:`int`): |message_thread_id| - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "chat_id": chat_id, - "message_thread_id": message_thread_id, - } - return await self._post( - "deleteForumTopic", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def unpin_all_forum_topic_messages( - self, - chat_id: Union[str, int], - message_thread_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to clear the list of pinned messages in a forum topic. The bot must - be an administrator in the chat for this to work and must have - :paramref:`~telegram.ChatAdministratorRights.can_pin_messages` administrator rights - in the supergroup. - - .. versionadded:: 20.0 - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_group| - message_thread_id (:obj:`int`): |message_thread_id| - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "chat_id": chat_id, - "message_thread_id": message_thread_id, - } - return await self._post( - "unpinAllForumTopicMessages", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def unpin_all_general_forum_topic_messages( - self, - chat_id: Union[str, int], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to clear the list of pinned messages in a General forum topic. The bot must - be an administrator in the chat for this to work and must have - :paramref:`~telegram.ChatAdministratorRights.can_pin_messages` administrator rights in the - supergroup. - - .. versionadded:: 20.5 - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_group| - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = {"chat_id": chat_id} - - return await self._post( - "unpinAllGeneralForumTopicMessages", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def edit_general_forum_topic( - self, - chat_id: Union[str, int], - name: str, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to edit the name of the 'General' topic in a forum supergroup chat. The bot - must be an administrator in the chat for this to work and must have the - :attr:`~telegram.ChatAdministratorRights.can_manage_topics` administrator rights. - - .. versionadded:: 20.0 - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_group| - name (:obj:`str`): New topic name, - :tg-const:`telegram.constants.ForumTopicLimit.MIN_NAME_LENGTH`- - :tg-const:`telegram.constants.ForumTopicLimit.MAX_NAME_LENGTH` characters. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"chat_id": chat_id, "name": name} - - return await self._post( - "editGeneralForumTopic", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def close_general_forum_topic( - self, - chat_id: Union[str, int], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to close an open 'General' topic in a forum supergroup chat. The bot must - be an administrator in the chat for this to work and must have - :attr:`~telegram.ChatAdministratorRights.can_manage_topics` administrator rights. - - .. versionadded:: 20.0 - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_group| - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"chat_id": chat_id} - - return await self._post( - "closeGeneralForumTopic", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def reopen_general_forum_topic( - self, - chat_id: Union[str, int], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to reopen a closed 'General' topic in a forum supergroup chat. The bot must - be an administrator in the chat for this to work and must have - :attr:`~telegram.ChatAdministratorRights.can_manage_topics` administrator rights. - The topic will be automatically unhidden if it was hidden. - - .. versionadded:: 20.0 - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_group| - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"chat_id": chat_id} - - return await self._post( - "reopenGeneralForumTopic", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def hide_general_forum_topic( - self, - chat_id: Union[str, int], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to hide the 'General' topic in a forum supergroup chat. The bot must - be an administrator in the chat for this to work and must have - :attr:`~telegram.ChatAdministratorRights.can_manage_topics` administrator rights. - The topic will be automatically closed if it was open. - - .. versionadded:: 20.0 - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_group| - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"chat_id": chat_id} - - return await self._post( - "hideGeneralForumTopic", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def unhide_general_forum_topic( - self, - chat_id: Union[str, int], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to unhide the 'General' topic in a forum supergroup chat. The bot must - be an administrator in the chat for this to work and must have - :attr:`~telegram.ChatAdministratorRights.can_manage_topics` administrator rights. - - .. versionadded:: 20.0 - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_group| - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"chat_id": chat_id} - - return await self._post( - "unhideGeneralForumTopic", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def set_my_description( - self, - description: Optional[str] = None, - language_code: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to change the bot's description, which is shown in the chat with the bot - if the chat is empty. - - .. versionadded:: 20.2 - - Args: - description (:obj:`str`, optional): New bot description; - 0-:tg-const:`telegram.constants.BotDescriptionLimit.MAX_DESCRIPTION_LENGTH` - characters. Pass an empty string to remove the dedicated description for the given - language. - language_code (:obj:`str`, optional): A two-letter ISO 639-1 language code. If empty, - the description will be applied to all users for whose language there is no - dedicated description. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"description": description, "language_code": language_code} - - return await self._post( - "setMyDescription", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def set_my_short_description( - self, - short_description: Optional[str] = None, - language_code: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to change the bot's short description, which is shown on the bot's profile - page and is sent together with the link when users share the bot. - - .. versionadded:: 20.2 - - Args: - short_description (:obj:`str`, optional): New short description for the bot; - 0-:tg-const:`telegram.constants.BotDescriptionLimit.MAX_SHORT_DESCRIPTION_LENGTH` - characters. Pass an empty string to remove the dedicated description for the given - language. - language_code (:obj:`str`, optional): A two-letter ISO 639-1 language code. If empty, - the description will be applied to all users for whose language there is no - dedicated description. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"short_description": short_description, "language_code": language_code} - - return await self._post( - "setMyShortDescription", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def get_my_description( - self, - language_code: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> BotDescription: - """ - Use this method to get the current bot description for the given user language. - - Args: - language_code (:obj:`str`, optional): A two-letter ISO 639-1 language code or an empty - string. - - Returns: - :class:`telegram.BotDescription`: On success, the bot description is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data = {"language_code": language_code} - return BotDescription.de_json( - await self._post( - "getMyDescription", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ), - bot=self, - ) - - async def get_my_short_description( - self, - language_code: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> BotShortDescription: - """ - Use this method to get the current bot short description for the given user language. - - Args: - language_code (:obj:`str`, optional): A two-letter ISO 639-1 language code or an empty - string. - - Returns: - :class:`telegram.BotShortDescription`: On success, the bot short description is - returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data = {"language_code": language_code} - return BotShortDescription.de_json( - await self._post( - "getMyShortDescription", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ), - bot=self, - ) - - async def set_my_name( - self, - name: Optional[str] = None, - language_code: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to change the bot's name. - - .. versionadded:: 20.3 - - Args: - name (:obj:`str`, optional): New bot name; - 0-:tg-const:`telegram.constants.BotNameLimit.MAX_NAME_LENGTH` - characters. Pass an empty string to remove the dedicated name for the given - language. - - Caution: - If :paramref:`language_code` is not specified, a :paramref:`name` *must* - be specified. - language_code (:obj:`str`, optional): A two-letter ISO 639-1 language code. If empty, - the name will be applied to all users for whose language there is no - dedicated name. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = {"name": name, "language_code": language_code} - - return await self._post( - "setMyName", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def get_my_name( - self, - language_code: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> BotName: - """ - Use this method to get the current bot name for the given user language. - - Args: - language_code (:obj:`str`, optional): A two-letter ISO 639-1 language code or an empty - string. - - Returns: - :class:`telegram.BotName`: On success, the bot name is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data = {"language_code": language_code} - return BotName.de_json( - await self._post( - "getMyName", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ), - bot=self, - ) - - async def get_user_chat_boosts( - self, - chat_id: Union[str, int], - user_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> UserChatBoosts: - """ - Use this method to get the list of boosts added to a chat by a user. Requires - administrator rights in the chat. - - .. versionadded:: 20.8 - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - user_id (:obj:`int`): Unique identifier of the target user. - - Returns: - :class:`telegram.UserChatBoosts`: On success, the object containing the list of boosts - is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = {"chat_id": chat_id, "user_id": user_id} - return UserChatBoosts.de_json( - await self._post( - "getUserChatBoosts", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ), - bot=self, - ) - - async def set_message_reaction( - self, - chat_id: Union[str, int], - message_id: int, - reaction: Optional[Union[Sequence[Union[ReactionType, str]], ReactionType, str]] = None, - is_big: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Use this method to change the chosen reactions on a message. Service messages of some types - can't be - reacted to. Automatically forwarded messages from a channel to its discussion group have - the same available reactions as messages in the channel. Bots can't use paid reactions. - - .. versionadded:: 20.8 - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - message_id (:obj:`int`): Identifier of the target message. If the message belongs to a - media group, the reaction is set to the first non-deleted message in the group - instead. - reaction (Sequence[:class:`telegram.ReactionType` | :obj:`str`] | \ - :class:`telegram.ReactionType` | :obj:`str`, optional): A list of reaction - types to set on the message. Currently, as non-premium users, bots can set up to - one reaction per message. A custom emoji reaction can be used if it is either - already present on the message or explicitly allowed by chat administrators. Paid - reactions can't be used by bots. - - Tip: - Passed :obj:`str` values will be converted to either - :class:`telegram.ReactionTypeEmoji` or - :class:`telegram.ReactionTypeCustomEmoji` - depending on whether they are listed in - :class:`~telegram.constants.ReactionEmoji`. - - is_big (:obj:`bool`, optional): Pass :obj:`True` to set the reaction with a big - animation. - - Returns: - :obj:`bool` On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - allowed_reactions: set[str] = set(ReactionEmoji) - parsed_reaction = ( - [ - ( - entry - if isinstance(entry, ReactionType) - else ( - ReactionTypeEmoji(emoji=entry) - if entry in allowed_reactions - else ReactionTypeCustomEmoji(custom_emoji_id=entry) - ) - ) - for entry in ( - [reaction] if isinstance(reaction, (ReactionType, str)) else reaction - ) - ] - if reaction is not None - else None - ) - - data: JSONDict = { - "chat_id": chat_id, - "message_id": message_id, - "reaction": parsed_reaction, - "is_big": is_big, - } - - return await self._post( - "setMessageReaction", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def gift_premium_subscription( - self, - user_id: int, - month_count: int, - star_count: int, - text: Optional[str] = None, - text_parse_mode: ODVInput[str] = DEFAULT_NONE, - text_entities: Optional[Sequence["MessageEntity"]] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Gifts a Telegram Premium subscription to the given user. - - .. versionadded:: 22.1 - - Args: - user_id (:obj:`int`): Unique identifier of the target user who will receive a Telegram - Premium subscription. - month_count (:obj:`int`): Number of months the Telegram Premium subscription will be - active for the user; must be one of - :tg-const:`telegram.constants.PremiumSubscription.MONTH_COUNT_THREE`, - :tg-const:`telegram.constants.PremiumSubscription.MONTH_COUNT_SIX`, - or :tg-const:`telegram.constants.PremiumSubscription.MONTH_COUNT_TWELVE`. - star_count (:obj:`int`): Number of Telegram Stars to pay for the Telegram Premium - subscription; must be - :tg-const:`telegram.constants.PremiumSubscription.STARS_THREE_MONTHS` - for :tg-const:`telegram.constants.PremiumSubscription.MONTH_COUNT_THREE` months, - :tg-const:`telegram.constants.PremiumSubscription.STARS_SIX_MONTHS` - for :tg-const:`telegram.constants.PremiumSubscription.MONTH_COUNT_SIX` months, - and :tg-const:`telegram.constants.PremiumSubscription.STARS_TWELVE_MONTHS` - for :tg-const:`telegram.constants.PremiumSubscription.MONTH_COUNT_TWELVE` months. - text (:obj:`str`, optional): Text that will be shown along with the service message - about the subscription; - 0-:tg-const:`telegram.constants.PremiumSubscription.MAX_TEXT_LENGTH` characters. - text_parse_mode (:obj:`str`, optional): Mode for parsing entities. - See :class:`telegram.constants.ParseMode` and - `formatting options <https://core.telegram.org/bots/api#formatting-options>`__ for - more details. Entities other than :attr:`~MessageEntity.BOLD`, - :attr:`~MessageEntity.ITALIC`, :attr:`~MessageEntity.UNDERLINE`, - :attr:`~MessageEntity.STRIKETHROUGH`, :attr:`~MessageEntity.SPOILER`, and - :attr:`~MessageEntity.CUSTOM_EMOJI` are ignored. - text_entities (Sequence[:class:`telegram.MessageEntity`], optional): A list of special - entities that appear in the gift text. It can be specified instead of - :paramref:`text_parse_mode`. Entities other than :attr:`~MessageEntity.BOLD`, - :attr:`~MessageEntity.ITALIC`, :attr:`~MessageEntity.UNDERLINE`, - :attr:`~MessageEntity.STRIKETHROUGH`, :attr:`~MessageEntity.SPOILER`, and - :attr:`~MessageEntity.CUSTOM_EMOJI` are ignored. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = { - "user_id": user_id, - "month_count": month_count, - "star_count": star_count, - "text": text, - "text_entities": text_entities, - "text_parse_mode": text_parse_mode, - } - return await self._post( - "giftPremiumSubscription", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def get_business_connection( - self, - business_connection_id: str, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> BusinessConnection: - """ - Use this method to get information about the connection of the bot with a business account. - - .. versionadded:: 21.1 - - Args: - business_connection_id (:obj:`str`): Unique identifier of the business connection. - - Returns: - :class:`telegram.BusinessConnection`: On success, the object containing the business - connection information is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = {"business_connection_id": business_connection_id} - return BusinessConnection.de_json( - await self._post( - "getBusinessConnection", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ), - bot=self, - ) - - async def get_business_account_gifts( - self, - business_connection_id: str, - exclude_unsaved: Optional[bool] = None, - exclude_saved: Optional[bool] = None, - exclude_unlimited: Optional[bool] = None, - exclude_limited: Optional[bool] = None, - exclude_unique: Optional[bool] = None, - sort_by_price: Optional[bool] = None, - offset: Optional[str] = None, - limit: Optional[int] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> OwnedGifts: - """ - Returns the gifts received and owned by a managed business account. Requires the - :attr:`~telegram.BusinessBotRights.can_view_gifts_and_stars` business bot right. - - .. versionadded:: 22.1 - - Args: - business_connection_id (:obj:`str`): Unique identifier of the business connection. - exclude_unsaved (:obj:`bool`, optional): Pass :obj:`True` to exclude gifts that aren't - saved to the account's profile page. - exclude_saved (:obj:`bool`, optional): Pass :obj:`True` to exclude gifts that are saved - to the account's profile page. - exclude_unlimited (:obj:`bool`, optional): Pass :obj:`True` to exclude gifts that can - be purchased an unlimited number of times. - exclude_limited (:obj:`bool`, optional): Pass :obj:`True` to exclude gifts that can be - purchased a limited number of times. - exclude_unique (:obj:`bool`, optional): Pass :obj:`True` to exclude unique gifts. - sort_by_price (:obj:`bool`, optional): Pass :obj:`True` to sort results by gift price - instead of send date. Sorting is applied before pagination. - offset (:obj:`str`, optional): Offset of the first entry to return as received from - the previous request; use empty string to get the first chunk of results. - limit (:obj:`int`, optional): The maximum number of gifts to be returned; - :tg-const:`telegram.constants.BusinessLimit.MIN_GIFT_RESULTS`-\ - :tg-const:`telegram.constants.BusinessLimit.MAX_GIFT_RESULTS`. - Defaults to :tg-const:`telegram.constants.BusinessLimit.MAX_GIFT_RESULTS`. - - Returns: - :class:`telegram.OwnedGifts` - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = { - "business_connection_id": business_connection_id, - "exclude_unsaved": exclude_unsaved, - "exclude_saved": exclude_saved, - "exclude_unlimited": exclude_unlimited, - "exclude_limited": exclude_limited, - "exclude_unique": exclude_unique, - "sort_by_price": sort_by_price, - "offset": offset, - "limit": limit, - } - - return OwnedGifts.de_json( - await self._post( - "getBusinessAccountGifts", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - ) - - async def get_business_account_star_balance( - self, - business_connection_id: str, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> StarAmount: - """ - Returns the amount of Telegram Stars owned by a managed business account. Requires the - :attr:`~telegram.BusinessBotRights.can_view_gifts_and_stars` business bot right. - - .. versionadded:: 22.1 - - Args: - business_connection_id (:obj:`str`): Unique identifier of the business connection. - - Returns: - :class:`telegram.StarAmount` - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = {"business_connection_id": business_connection_id} - return StarAmount.de_json( - await self._post( - "getBusinessAccountStarBalance", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ), - bot=self, - ) - - async def read_business_message( - self, - business_connection_id: str, - chat_id: int, - message_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Marks incoming message as read on behalf of a business account. - Requires the :attr:`~telegram.BusinessBotRights.can_read_messages` business bot right. - - .. versionadded:: 22.1 - - Args: - business_connection_id (:obj:`str`): Unique identifier of the business connection on - behalf of which to read the message. - chat_id (:obj:`int`): Unique identifier of the chat in which the message was received. - The chat must have been active in the last - :tg-const:`~telegram.constants.BusinessLimit.\ -CHAT_ACTIVITY_TIMEOUT` seconds. - message_id (:obj:`int`): Unique identifier of the message to mark as read. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = { - "business_connection_id": business_connection_id, - "chat_id": chat_id, - "message_id": message_id, - } - return await self._post( - "readBusinessMessage", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def delete_business_messages( - self, - business_connection_id: str, - message_ids: Sequence[int], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Delete messages on behalf of a business account. Requires the - :attr:`~telegram.BusinessBotRights.can_delete_sent_messages` business bot right to - delete messages sent by the bot itself, or the - :attr:`~telegram.BusinessBotRights.can_delete_all_messages` business bot right to delete - any message. - - .. versionadded:: 22.1 - - Args: - business_connection_id (:obj:`int` | :obj:`str`): Unique identifier of the business - connection on behalf of which to delete the messages - message_ids (Sequence[:obj:`int`]): A list of - :tg-const:`telegram.constants.BulkRequestLimit.MIN_LIMIT`- - :tg-const:`telegram.constants.BulkRequestLimit.MAX_LIMIT` identifiers of messages - to delete. See :meth:`delete_message` for limitations on which messages can be - deleted. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = { - "business_connection_id": business_connection_id, - "message_ids": message_ids, - } - return await self._post( - "deleteBusinessMessages", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def post_story( - self, - business_connection_id: str, - content: "InputStoryContent", - active_period: TimePeriod, - caption: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - areas: Optional[Sequence["StoryArea"]] = None, - post_to_chat_page: Optional[bool] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Story: - """ - Posts a story on behalf of a managed business account. Requires the - :attr:`~telegram.BusinessBotRights.can_manage_stories` business bot right. - - .. versionadded:: 22.1 - - Args: - business_connection_id (:obj:`str`): Unique identifier of the business connection. - content (:class:`telegram.InputStoryContent`): Content of the story. - active_period (:obj:`int` | :class:`datetime.timedelta`, optional): Period after which - the story is moved to the archive, in seconds; must be one of - :tg-const:`~telegram.constants.StoryLimit.ACTIVITY_SIX_HOURS`, - :tg-const:`~telegram.constants.StoryLimit.ACTIVITY_TWELVE_HOURS`, - :tg-const:`~telegram.constants.StoryLimit.ACTIVITY_ONE_DAY`, - or :tg-const:`~telegram.constants.StoryLimit.ACTIVITY_TWO_DAYS`. - caption (:obj:`str`, optional): Caption of the story, - 0-:tg-const:`~telegram.constants.StoryLimit.CAPTION_LENGTH` characters after - entities parsing. - parse_mode (:obj:`str`, optional): Mode for parsing entities in the story caption. - See the constants in :class:`telegram.constants.ParseMode` for the - available modes. - caption_entities (Sequence[:class:`telegram.MessageEntity`], optional): - |caption_entities| - areas (Sequence[:class:`telegram.StoryArea`], optional): Sequence of clickable areas to - be shown on the story. - - Note: - Each type of clickable area in :paramref:`areas` has its own maximum limit: - - * Up to :tg-const:`~telegram.constants.StoryAreaTypeLimit.MAX_LOCATION_AREAS` - of :class:`telegram.StoryAreaTypeLocation`. - * Up to :tg-const:`~telegram.constants.StoryAreaTypeLimit.\ -MAX_SUGGESTED_REACTION_AREAS` of :class:`telegram.StoryAreaTypeSuggestedReaction`. - * Up to :tg-const:`~telegram.constants.StoryAreaTypeLimit.MAX_LINK_AREAS` - of :class:`telegram.StoryAreaTypeLink`. - * Up to :tg-const:`~telegram.constants.StoryAreaTypeLimit.MAX_WEATHER_AREAS` - of :class:`telegram.StoryAreaTypeWeather`. - * Up to :tg-const:`~telegram.constants.StoryAreaTypeLimit.\ -MAX_UNIQUE_GIFT_AREAS` of :class:`telegram.StoryAreaTypeUniqueGift`. - post_to_chat_page (:class:`telegram.InputStoryContent`, optional): Pass :obj:`True` to - keep the story accessible after it expires. - protect_content (:obj:`bool`, optional): Pass :obj:`True` if the content of the story - must be protected from forwarding and screenshotting - - Returns: - :class:`Story` - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = { - "business_connection_id": business_connection_id, - "content": content, - "active_period": active_period, - "caption": caption, - "parse_mode": parse_mode, - "caption_entities": caption_entities, - "areas": areas, - "post_to_chat_page": post_to_chat_page, - "protect_content": protect_content, - } - return Story.de_json( - await self._post( - "postStory", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - ) - - async def edit_story( - self, - business_connection_id: str, - story_id: int, - content: "InputStoryContent", - caption: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - areas: Optional[Sequence["StoryArea"]] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Story: - """ - Edits a story previously posted by the bot on behalf of a managed business account. - Requires the :attr:`~telegram.BusinessBotRights.can_manage_stories` business bot right. - - .. versionadded:: 22.1 - - Args: - business_connection_id (:obj:`str`): Unique identifier of the business connection. - story_id (:obj:`int`): Unique identifier of the story to edit. - content (:class:`telegram.InputStoryContent`): Content of the story. - caption (:obj:`str`, optional): Caption of the story, - 0-:tg-const:`~telegram.constants.StoryLimit.CAPTION_LENGTH` characters after - entities parsing. - parse_mode (:obj:`str`, optional): Mode for parsing entities in the story caption. - See the constants in :class:`telegram.constants.ParseMode` for the - available modes. - caption_entities (Sequence[:class:`telegram.MessageEntity`], optional): - |caption_entities| - areas (Sequence[:class:`telegram.StoryArea`], optional): Sequence of clickable areas to - be shown on the story. - - Note: - Each type of clickable area in :paramref:`areas` has its own maximum limit: - - * Up to :tg-const:`~telegram.constants.StoryAreaTypeLimit.MAX_LOCATION_AREAS` - of :class:`telegram.StoryAreaTypeLocation`. - * Up to :tg-const:`~telegram.constants.StoryAreaTypeLimit.\ -MAX_SUGGESTED_REACTION_AREAS` of :class:`telegram.StoryAreaTypeSuggestedReaction`. - * Up to :tg-const:`~telegram.constants.StoryAreaTypeLimit.MAX_LINK_AREAS` - of :class:`telegram.StoryAreaTypeLink`. - * Up to :tg-const:`~telegram.constants.StoryAreaTypeLimit.MAX_WEATHER_AREAS` - of :class:`telegram.StoryAreaTypeWeather`. - * Up to :tg-const:`~telegram.constants.StoryAreaTypeLimit.\ -MAX_UNIQUE_GIFT_AREAS` of :class:`telegram.StoryAreaTypeUniqueGift`. - - Returns: - :class:`Story` - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = { - "business_connection_id": business_connection_id, - "story_id": story_id, - "content": content, - "caption": caption, - "parse_mode": parse_mode, - "caption_entities": caption_entities, - "areas": areas, - } - return Story.de_json( - await self._post( - "editStory", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - ) - - async def delete_story( - self, - business_connection_id: str, - story_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Deletes a story previously posted by the bot on behalf of a managed business account. - Requires the :attr:`~telegram.BusinessBotRights.can_manage_stories` business bot right. - - .. versionadded:: 22.1 - - Args: - business_connection_id (:obj:`str`): Unique identifier of the business connection. - story_id (:obj:`int`): Unique identifier of the story to delete. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = { - "business_connection_id": business_connection_id, - "story_id": story_id, - } - return await self._post( - "deleteStory", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def set_business_account_name( - self, - business_connection_id: str, - first_name: str, - last_name: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Changes the first and last name of a managed business account. Requires the - :attr:`~telegram.BusinessBotRights.can_edit_name` business bot right. - - .. versionadded:: 22.1 - - Args: - business_connection_id (:obj:`int` | :obj:`str`): Unique identifier of the business - connection - first_name (:obj:`str`): New first name of the business account; - :tg-const:`telegram.constants.BusinessLimit.MIN_NAME_LENGTH`- - :tg-const:`telegram.constants.BusinessLimit.MAX_NAME_LENGTH` characters. - last_name (:obj:`str`, optional): New last name of the business account; - 0-:tg-const:`telegram.constants.BusinessLimit.MAX_NAME_LENGTH` characters. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = { - "business_connection_id": business_connection_id, - "first_name": first_name, - "last_name": last_name, - } - return await self._post( - "setBusinessAccountName", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def set_business_account_username( - self, - business_connection_id: str, - username: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Changes the username of a managed business account. Requires the - :attr:`~telegram.BusinessBotRights.can_edit_username` business bot right. - - .. versionadded:: 22.1 - - Args: - business_connection_id (:obj:`str`): Unique identifier of the business connection. - username (:obj:`str`, optional): New business account username; - 0-:tg-const:`telegram.constants.BusinessLimit.MAX_USERNAME_LENGTH` characters. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = { - "business_connection_id": business_connection_id, - "username": username, - } - return await self._post( - "setBusinessAccountUsername", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def set_business_account_bio( - self, - business_connection_id: str, - bio: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Changes the bio of a managed business account. Requires the - :attr:`~telegram.BusinessBotRights.can_edit_bio` business bot right. - - .. versionadded:: 22.1 - - Args: - business_connection_id (:obj:`str`): Unique identifier of the business connection. - bio (:obj:`str`, optional): The new value of the bio for the business account; - 0-:tg-const:`telegram.constants.BusinessLimit.MAX_BIO_LENGTH` characters. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = { - "business_connection_id": business_connection_id, - "bio": bio, - } - return await self._post( - "setBusinessAccountBio", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def set_business_account_gift_settings( - self, - business_connection_id: str, - show_gift_button: bool, - accepted_gift_types: AcceptedGiftTypes, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Changes the privacy settings pertaining to incoming gifts in a managed business account. - Requires the :attr:`~telegram.BusinessBotRights.can_change_gift_settings` business - bot right. - - .. versionadded:: 22.1 - - Args: - business_connection_id (:obj:`str`): Unique identifier of the business - connection - show_gift_button (:obj:`bool`): Pass :obj:`True`, if a button for sending a gift to the - user or by the business account must always be shown in the input field. - accepted_gift_types (:class:`telegram.AcceptedGiftTypes`): Types of gifts accepted by - the business account. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = { - "business_connection_id": business_connection_id, - "show_gift_button": show_gift_button, - "accepted_gift_types": accepted_gift_types, - } - return await self._post( - "setBusinessAccountGiftSettings", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def set_business_account_profile_photo( - self, - business_connection_id: str, - photo: "InputProfilePhoto", - is_public: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Changes the profile photo of a managed business account. - Requires the :attr:`~telegram.BusinessBotRights.can_edit_profile_photo` business - bot right. - - .. versionadded:: 22.1 - - Args: - business_connection_id (:obj:`str`): Unique identifier of the business connection. - photo (:class:`telegram.InputProfilePhoto`): The new profile photo to set. - is_public (:obj:`bool`, optional): Pass :obj:`True` to set the public photo, which will - be visible even if the main photo is hidden by the business account's privacy - settings. An account can have only one public photo. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "business_connection_id": business_connection_id, - "photo": photo, - "is_public": is_public, - } - return await self._post( - "setBusinessAccountProfilePhoto", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def remove_business_account_profile_photo( - self, - business_connection_id: str, - is_public: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Removes the current profile photo of a managed business account. - Requires the :attr:`~telegram.BusinessBotRights.can_edit_profile_photo` business - bot right. - - .. versionadded:: 22.1 - - Args: - business_connection_id (:obj:`str`): Unique identifier of the business connection. - is_public (:obj:`bool`, optional): Pass :obj:`True` to remove the public photo, which - will be visible even if the main photo is hidden by the business account's privacy - settings. After the main photo is removed, the previous profile photo (if present) - becomes the main photo. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = { - "business_connection_id": business_connection_id, - "is_public": is_public, - } - return await self._post( - "removeBusinessAccountProfilePhoto", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def convert_gift_to_stars( - self, - business_connection_id: str, - owned_gift_id: str, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Converts a given regular gift to Telegram Stars. Requires the - :attr:`~telegram.BusinessBotRights.can_convert_gifts_to_stars` business bot right. - - .. versionadded:: 22.1 - - Args: - business_connection_id (:obj:`str`): Unique identifier of the business - connection - owned_gift_id (:obj:`str`): Unique identifier of the regular gift that should be - converted to Telegram Stars. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = { - "business_connection_id": business_connection_id, - "owned_gift_id": owned_gift_id, - } - return await self._post( - "convertGiftToStars", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def upgrade_gift( - self, - business_connection_id: str, - owned_gift_id: str, - keep_original_details: Optional[bool] = None, - star_count: Optional[int] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Upgrades a given regular gift to a unique gift. Requires the - :attr:`~telegram.BusinessBotRights.can_transfer_and_upgrade_gifts` business bot right. - Additionally requires the :attr:`~telegram.BusinessBotRights.can_transfer_stars` business - bot right if the upgrade is paid. - - .. versionadded:: 22.1 - - Args: - business_connection_id (:obj:`str`): Unique identifier of the business - connection - owned_gift_id (:obj:`str`): Unique identifier of the regular gift that should be - upgraded to a unique one. - keep_original_details (:obj:`bool`, optional): Pass :obj:`True` to keep the original - gift text, sender and receiver in the upgraded gift - star_count (:obj:`int`, optional): The amount of Telegram Stars that will - be paid for the upgrade from the business account balance. If - ``gift.prepaid_upgrade_star_count > 0``, then pass ``0``, otherwise, - the :attr:`~telegram.BusinessBotRights.can_transfer_stars` - business bot right is required and :attr:`telegram.Gift.upgrade_star_count` - must be passed. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = { - "business_connection_id": business_connection_id, - "owned_gift_id": owned_gift_id, - "keep_original_details": keep_original_details, - "star_count": star_count, - } - return await self._post( - "upgradeGift", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def transfer_gift( - self, - business_connection_id: str, - owned_gift_id: str, - new_owner_chat_id: int, - star_count: Optional[int] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Transfers an owned unique gift to another user. Requires the - :attr:`~telegram.BusinessBotRights.can_transfer_and_upgrade_gifts` business bot right. - Requires :attr:`~telegram.BusinessBotRights.can_transfer_stars` business bot right if the - transfer is paid. - - .. versionadded:: 22.1 - - Args: - business_connection_id (:obj:`str`): Unique identifier of the business - connection - owned_gift_id (:obj:`str`): Unique identifier of the regular gift that should be - transferred. - new_owner_chat_id (:obj:`int`): Unique identifier of the chat which will - own the gift. The chat must be active in the last - :tg-const:`~telegram.constants.BusinessLimit.\ -CHAT_ACTIVITY_TIMEOUT` seconds. - star_count (:obj:`int`, optional): The amount of Telegram Stars that will be paid for - the transfer from the business account balance. If positive, then - the :attr:`~telegram.BusinessBotRights.can_transfer_stars` business bot - right is required. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = { - "business_connection_id": business_connection_id, - "owned_gift_id": owned_gift_id, - "new_owner_chat_id": new_owner_chat_id, - "star_count": star_count, - } - return await self._post( - "transferGift", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def transfer_business_account_stars( - self, - business_connection_id: str, - star_count: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """ - Transfers Telegram Stars from the business account balance to the bot's balance. Requires - the :attr:`~telegram.BusinessBotRights.can_transfer_stars` business bot right. - - .. versionadded:: 22.1 - - Args: - business_connection_id (:obj:`str`): Unique identifier of the business - connection - star_count (:obj:`int`): Number of Telegram Stars to transfer; - :tg-const:`~telegram.constants.BusinessLimit.MIN_STAR_COUNT`\ --:tg-const:`~telegram.constants.BusinessLimit.MAX_STAR_COUNT` - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = { - "business_connection_id": business_connection_id, - "star_count": star_count, - } - return await self._post( - "transferBusinessAccountStars", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def replace_sticker_in_set( - self, - user_id: int, - name: str, - old_sticker: Union[str, "Sticker"], - sticker: "InputSticker", - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Use this method to replace an existing sticker in a sticker set with a new one. - The method is equivalent to calling :meth:`delete_sticker_from_set`, - then :meth:`add_sticker_to_set`, then :meth:`set_sticker_position_in_set`. - - .. versionadded:: 21.1 - - Args: - user_id (:obj:`int`): User identifier of the sticker set owner. - name (:obj:`str`): Sticker set name. - old_sticker (:obj:`str` | :class:`~telegram.Sticker`): File identifier of the replaced - sticker or the sticker object itself. - - .. versionchanged:: 21.10 - Accepts also :class:`telegram.Sticker` instances. - sticker (:class:`telegram.InputSticker`): An object with information about the added - sticker. If exactly the same sticker had already been added to the set, then the - set remains unchanged. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = { - "user_id": user_id, - "name": name, - "old_sticker": old_sticker if isinstance(old_sticker, str) else old_sticker.file_id, - "sticker": sticker, - } - - return await self._post( - "replaceStickerInSet", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def refund_star_payment( - self, - user_id: int, - telegram_payment_charge_id: str, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Refunds a successful payment in |tg_stars|. - - .. versionadded:: 21.3 - - Args: - user_id (:obj:`int`): User identifier of the user whose payment will be refunded. - telegram_payment_charge_id (:obj:`str`): Telegram payment identifier. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "user_id": user_id, - "telegram_payment_charge_id": telegram_payment_charge_id, - } - - return await self._post( - "refundStarPayment", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def get_star_transactions( - self, - offset: Optional[int] = None, - limit: Optional[int] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> StarTransactions: - """Returns the bot's Telegram Star transactions in chronological order. - - .. versionadded:: 21.4 - - Args: - offset (:obj:`int`, optional): Number of transactions to skip in the response. - limit (:obj:`int`, optional): The maximum number of transactions to be retrieved. - Values between :tg-const:`telegram.constants.StarTransactionsLimit.MIN_LIMIT`- - :tg-const:`telegram.constants.StarTransactionsLimit.MAX_LIMIT` are accepted. - Defaults to :tg-const:`telegram.constants.StarTransactionsLimit.MAX_LIMIT`. - - Returns: - :class:`telegram.StarTransactions`: On success. - - Raises: - :class:`telegram.error.TelegramError` - """ - - data: JSONDict = {"offset": offset, "limit": limit} - - return StarTransactions.de_json( - await self._post( - "getStarTransactions", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ), - bot=self, - ) - - async def edit_user_star_subscription( - self, - user_id: int, - telegram_payment_charge_id: str, - is_canceled: bool, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Allows the bot to cancel or re-enable extension of a subscription paid in Telegram - Stars. - - .. versionadded:: 21.8 - - Args: - user_id (:obj:`int`): Identifier of the user whose subscription will be edited. - telegram_payment_charge_id (:obj:`str`): Telegram payment identifier for the - subscription. - is_canceled (:obj:`bool`): Pass :obj:`True` to cancel extension of the user - subscription; the subscription must be active up to the end of the current - subscription period. Pass :obj:`False` to allow the user to re-enable a - subscription that was previously canceled by the bot. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = { - "user_id": user_id, - "telegram_payment_charge_id": telegram_payment_charge_id, - "is_canceled": is_canceled, - } - return await self._post( - "editUserStarSubscription", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def send_paid_media( - self, - chat_id: Union[str, int], - star_count: int, - media: Sequence["InputPaidMedia"], - caption: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - show_caption_above_media: Optional[bool] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - protect_content: ODVInput[bool] = DEFAULT_NONE, - reply_parameters: Optional["ReplyParameters"] = None, - reply_markup: Optional[ReplyMarkup] = None, - business_connection_id: Optional[str] = None, - payload: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - reply_to_message_id: Optional[int] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Message: - """Use this method to send paid media. - - .. versionadded:: 21.4 - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| If the chat is a channel, all - Telegram Star proceeds from this media will be credited to the chat's balance. - Otherwise, they will be credited to the bot's balance. - star_count (:obj:`int`): The number of Telegram Stars that must be paid to buy access - to the media; :tg-const:`telegram.constants.InvoiceLimit.MIN_STAR_COUNT` - - :tg-const:`telegram.constants.InvoiceLimit.MAX_STAR_COUNT`. - media (Sequence[:class:`telegram.InputPaidMedia`]): A list describing the media to be - sent; up to :tg-const:`telegram.constants.MediaGroupLimit.MAX_MEDIA_LENGTH` items. - payload (:obj:`str`, optional): Bot-defined paid media payload, - 0-:tg-const:`telegram.constants.InvoiceLimit.MAX_PAYLOAD_LENGTH` bytes. This will - not be displayed to the user, use it for your internal processes. - - .. versionadded:: 21.6 - caption (:obj:`str`, optional): Caption of the media to be sent, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters. - parse_mode (:obj:`str`, optional): |parse_mode| - caption_entities (Sequence[:class:`telegram.MessageEntity`], optional): - |caption_entities| - show_caption_above_media (:obj:`bool`, optional): Pass |show_cap_above_med| - disable_notification (:obj:`bool`, optional): |disable_notification| - protect_content (:obj:`bool`, optional): |protect_content| - reply_parameters (:class:`telegram.ReplyParameters`, optional): |reply_parameters| - reply_markup (:class:`InlineKeyboardMarkup` | :class:`ReplyKeyboardMarkup` | \ - :class:`ReplyKeyboardRemove` | :class:`ForceReply`, optional): - Additional interface options. An object for an inline keyboard, custom reply - keyboard, instructions to remove reply keyboard or to force a reply from the user. - business_connection_id (:obj:`str`, optional): |business_id_str| - - .. versionadded:: 21.5 - allow_paid_broadcast (:obj:`bool`, optional): |allow_paid_broadcast| - - .. versionadded:: 21.7 - - Keyword Args: - allow_sending_without_reply (:obj:`bool`, optional): |allow_sending_without_reply| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - reply_to_message_id (:obj:`int`, optional): |reply_to_msg_id| - Mutually exclusive with :paramref:`reply_parameters`, which this is a convenience - parameter for - - Returns: - :class:`telegram.Message`: On success, the sent message is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - - data: JSONDict = { - "chat_id": chat_id, - "star_count": star_count, - "media": media, - "show_caption_above_media": show_caption_above_media, - "payload": payload, - } - - return await self._send_message( - "sendPaidMedia", - data, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - disable_notification=disable_notification, - protect_content=protect_content, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - business_connection_id=business_connection_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def create_chat_subscription_invite_link( - self, - chat_id: Union[str, int], - subscription_period: TimePeriod, - subscription_price: int, - name: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> ChatInviteLink: - """ - Use this method to create a `subscription invite link <https://telegram.org/blog/\ - superchannels-star-reactions-subscriptions#star-subscriptions>`_ for a channel chat. - The bot must have the :attr:`~telegram.ChatPermissions.can_invite_users` administrator - right. The link can be edited using the :meth:`edit_chat_subscription_invite_link` or - revoked using the :meth:`revoke_chat_invite_link`. - - .. versionadded:: 21.5 - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - subscription_period (:obj:`int` | :class:`datetime.timedelta`): The number of seconds - the subscription will be - active for before the next payment. Currently, it must always be - :tg-const:`telegram.constants.ChatSubscriptionLimit.SUBSCRIPTION_PERIOD` (30 days). - - .. versionchanged:: 21.11 - |time-period-input| - subscription_price (:obj:`int`): The number of Telegram Stars a user must pay initially - and after each subsequent subscription period to be a member of the chat; - :tg-const:`telegram.constants.ChatSubscriptionLimit.MIN_PRICE`- - :tg-const:`telegram.constants.ChatSubscriptionLimit.MAX_PRICE`. - name (:obj:`str`, optional): Invite link name; - 0-:tg-const:`telegram.constants.ChatInviteLinkLimit.NAME_LENGTH` characters. - - Returns: - :class:`telegram.ChatInviteLink` - - Raises: - :class:`telegram.error.TelegramError` - - """ - data: JSONDict = { - "chat_id": chat_id, - "subscription_period": subscription_period, - "subscription_price": subscription_price, - "name": name, - } - - result = await self._post( - "createChatSubscriptionInviteLink", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - return ChatInviteLink.de_json(result, self) - - async def edit_chat_subscription_invite_link( - self, - chat_id: Union[str, int], - invite_link: Union[str, "ChatInviteLink"], - name: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> ChatInviteLink: - """ - Use this method to edit a subscription invite link created by the bot. The bot must have - :attr:`telegram.ChatPermissions.can_invite_users` administrator right. - - .. versionadded:: 21.5 - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - invite_link (:obj:`str` | :obj:`telegram.ChatInviteLink`): The invite link to edit. - name (:obj:`str`, optional): Invite link name; - 0-:tg-const:`telegram.constants.ChatInviteLinkLimit.NAME_LENGTH` characters. - - Tip: - Omitting this argument removes the name of the invite link. - - Returns: - :class:`telegram.ChatInviteLink` - - Raises: - :class:`telegram.error.TelegramError` - - """ - link = invite_link.invite_link if isinstance(invite_link, ChatInviteLink) else invite_link - data: JSONDict = { - "chat_id": chat_id, - "invite_link": link, - "name": name, - } - - result = await self._post( - "editChatSubscriptionInviteLink", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - return ChatInviteLink.de_json(result, self) - - async def get_available_gifts( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Gifts: - """Returns the list of gifts that can be sent by the bot to users and channel chats. - Requires no parameters. - - .. versionadded:: 21.8 - - Returns: - :class:`telegram.Gifts` - - Raises: - :class:`telegram.error.TelegramError` - """ - return Gifts.de_json( - await self._post( - "getAvailableGifts", - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - ) - - async def send_gift( - self, - gift_id: Union[str, Gift], - text: Optional[str] = None, - text_parse_mode: ODVInput[str] = DEFAULT_NONE, - text_entities: Optional[Sequence["MessageEntity"]] = None, - pay_for_upgrade: Optional[bool] = None, - chat_id: Optional[Union[str, int]] = None, - user_id: Optional[int] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Sends a gift to the given user or channel chat. - The gift can't be converted to Telegram Stars by the receiver. - - .. versionadded:: 21.8 - .. versionchanged:: 22.1 - Bot API 8.3 made :paramref:`user_id` optional. In version 22.1, the methods - signature was changed accordingly. - - Args: - gift_id (:obj:`str` | :class:`~telegram.Gift`): Identifier of the gift or a - :class:`~telegram.Gift` object - user_id (:obj:`int`, optional): Required if :paramref:`chat_id` is not specified. - Unique identifier of the target user that will receive the gift. - - .. versionchanged:: 21.11 - Now optional. - chat_id (:obj:`int` | :obj:`str`, optional): Required if :paramref:`user_id` - is not specified. |chat_id_channel| It will receive the gift. - - .. versionadded:: 21.11 - text (:obj:`str`, optional): Text that will be shown along with the gift; - 0- :tg-const:`telegram.constants.GiftLimit.MAX_TEXT_LENGTH` characters - text_parse_mode (:obj:`str`, optional): Mode for parsing entities. - See :class:`telegram.constants.ParseMode` and - `formatting options <https://core.telegram.org/bots/api#formatting-options>`__ for - more details. Entities other than :attr:`~MessageEntity.BOLD`, - :attr:`~MessageEntity.ITALIC`, :attr:`~MessageEntity.UNDERLINE`, - :attr:`~MessageEntity.STRIKETHROUGH`, :attr:`~MessageEntity.SPOILER`, and - :attr:`~MessageEntity.CUSTOM_EMOJI` are ignored. - text_entities (Sequence[:class:`telegram.MessageEntity`], optional): A list of special - entities that appear in the gift text. It can be specified instead of - :paramref:`text_parse_mode`. Entities other than :attr:`~MessageEntity.BOLD`, - :attr:`~MessageEntity.ITALIC`, :attr:`~MessageEntity.UNDERLINE`, - :attr:`~MessageEntity.STRIKETHROUGH`, :attr:`~MessageEntity.SPOILER`, and - :attr:`~MessageEntity.CUSTOM_EMOJI` are ignored. - pay_for_upgrade (:obj:`bool`, optional): Pass :obj:`True` to pay for the gift upgrade - from the bot's balance, thereby making the upgrade free for the receiver. - - .. versionadded:: 21.10 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = { - "user_id": user_id, - "gift_id": gift_id.id if isinstance(gift_id, Gift) else gift_id, - "text": text, - "text_parse_mode": text_parse_mode, - "text_entities": text_entities, - "pay_for_upgrade": pay_for_upgrade, - "chat_id": chat_id, - } - return await self._post( - "sendGift", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def verify_chat( - self, - chat_id: Union[int, str], - custom_description: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Verifies a chat |org-verify| which is represented by the bot. - - .. versionadded:: 21.10 - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - custom_description (:obj:`str`, optional): Custom description for the verification; - 0- :tg-const:`telegram.constants.VerifyLimit.MAX_TEXT_LENGTH` characters. Must be - empty if the organization isn't allowed to provide a custom verification - description. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = { - "chat_id": chat_id, - "custom_description": custom_description, - } - return await self._post( - "verifyChat", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def verify_user( - self, - user_id: int, - custom_description: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Verifies a user |org-verify| which is represented by the bot. - - .. versionadded:: 21.10 - - Args: - user_id (:obj:`int`): Unique identifier of the target user. - custom_description (:obj:`str`, optional): Custom description for the verification; - 0- :tg-const:`telegram.constants.VerifyLimit.MAX_TEXT_LENGTH` characters. Must be - empty if the organization isn't allowed to provide a custom verification - description. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = { - "user_id": user_id, - "custom_description": custom_description, - } - return await self._post( - "verifyUser", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def remove_chat_verification( - self, - chat_id: Union[int, str], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Removes verification from a chat that is currently verified |org-verify| - represented by the bot. - - - - .. versionadded:: 21.10 - - Args: - chat_id (:obj:`int` | :obj:`str`): |chat_id_channel| - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = { - "chat_id": chat_id, - } - return await self._post( - "removeChatVerification", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def remove_user_verification( - self, - user_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Removes verification from a user who is currently verified |org-verify| - represented by the bot. - - - - .. versionadded:: 21.10 - - Args: - user_id (:obj:`int`): Unique identifier of the target user. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :class:`telegram.error.TelegramError` - """ - data: JSONDict = { - "user_id": user_id, - } - return await self._post( - "removeUserVerification", - data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - def to_dict(self, recursive: bool = True) -> JSONDict: # noqa: ARG002 - """See :meth:`telegram.TelegramObject.to_dict`.""" - data: JSONDict = {"id": self.id, "username": self.username, "first_name": self.first_name} - - if self.last_name: - data["last_name"] = self.last_name - - return data - - # camelCase aliases - getMe = get_me - """Alias for :meth:`get_me`""" - sendMessage = send_message - """Alias for :meth:`send_message`""" - deleteMessage = delete_message - """Alias for :meth:`delete_message`""" - deleteMessages = delete_messages - """Alias for :meth:`delete_messages`""" - forwardMessage = forward_message - """Alias for :meth:`forward_message`""" - forwardMessages = forward_messages - """Alias for :meth:`forward_messages`""" - sendPhoto = send_photo - """Alias for :meth:`send_photo`""" - sendAudio = send_audio - """Alias for :meth:`send_audio`""" - sendDocument = send_document - """Alias for :meth:`send_document`""" - sendSticker = send_sticker - """Alias for :meth:`send_sticker`""" - sendVideo = send_video - """Alias for :meth:`send_video`""" - sendAnimation = send_animation - """Alias for :meth:`send_animation`""" - sendVoice = send_voice - """Alias for :meth:`send_voice`""" - sendVideoNote = send_video_note - """Alias for :meth:`send_video_note`""" - sendMediaGroup = send_media_group - """Alias for :meth:`send_media_group`""" - sendLocation = send_location - """Alias for :meth:`send_location`""" - editMessageLiveLocation = edit_message_live_location - """Alias for :meth:`edit_message_live_location`""" - stopMessageLiveLocation = stop_message_live_location - """Alias for :meth:`stop_message_live_location`""" - sendVenue = send_venue - """Alias for :meth:`send_venue`""" - sendContact = send_contact - """Alias for :meth:`send_contact`""" - sendGame = send_game - """Alias for :meth:`send_game`""" - sendChatAction = send_chat_action - """Alias for :meth:`send_chat_action`""" - answerInlineQuery = answer_inline_query - """Alias for :meth:`answer_inline_query`""" - savePreparedInlineMessage = save_prepared_inline_message - """Alias for :meth:`save_prepared_inline_message`""" - getUserProfilePhotos = get_user_profile_photos - """Alias for :meth:`get_user_profile_photos`""" - getFile = get_file - """Alias for :meth:`get_file`""" - banChatMember = ban_chat_member - """Alias for :meth:`ban_chat_member`""" - banChatSenderChat = ban_chat_sender_chat - """Alias for :meth:`ban_chat_sender_chat`""" - unbanChatMember = unban_chat_member - """Alias for :meth:`unban_chat_member`""" - unbanChatSenderChat = unban_chat_sender_chat - """Alias for :meth:`unban_chat_sender_chat`""" - answerCallbackQuery = answer_callback_query - """Alias for :meth:`answer_callback_query`""" - editMessageText = edit_message_text - """Alias for :meth:`edit_message_text`""" - editMessageCaption = edit_message_caption - """Alias for :meth:`edit_message_caption`""" - editMessageMedia = edit_message_media - """Alias for :meth:`edit_message_media`""" - editMessageReplyMarkup = edit_message_reply_markup - """Alias for :meth:`edit_message_reply_markup`""" - getUpdates = get_updates - """Alias for :meth:`get_updates`""" - setWebhook = set_webhook - """Alias for :meth:`set_webhook`""" - deleteWebhook = delete_webhook - """Alias for :meth:`delete_webhook`""" - leaveChat = leave_chat - """Alias for :meth:`leave_chat`""" - getChat = get_chat - """Alias for :meth:`get_chat`""" - getChatAdministrators = get_chat_administrators - """Alias for :meth:`get_chat_administrators`""" - getChatMember = get_chat_member - """Alias for :meth:`get_chat_member`""" - setChatStickerSet = set_chat_sticker_set - """Alias for :meth:`set_chat_sticker_set`""" - deleteChatStickerSet = delete_chat_sticker_set - """Alias for :meth:`delete_chat_sticker_set`""" - getChatMemberCount = get_chat_member_count - """Alias for :meth:`get_chat_member_count`""" - getWebhookInfo = get_webhook_info - """Alias for :meth:`get_webhook_info`""" - setGameScore = set_game_score - """Alias for :meth:`set_game_score`""" - getGameHighScores = get_game_high_scores - """Alias for :meth:`get_game_high_scores`""" - sendInvoice = send_invoice - """Alias for :meth:`send_invoice`""" - answerShippingQuery = answer_shipping_query - """Alias for :meth:`answer_shipping_query`""" - answerPreCheckoutQuery = answer_pre_checkout_query - """Alias for :meth:`answer_pre_checkout_query`""" - answerWebAppQuery = answer_web_app_query - """Alias for :meth:`answer_web_app_query`""" - restrictChatMember = restrict_chat_member - """Alias for :meth:`restrict_chat_member`""" - promoteChatMember = promote_chat_member - """Alias for :meth:`promote_chat_member`""" - setChatPermissions = set_chat_permissions - """Alias for :meth:`set_chat_permissions`""" - setChatAdministratorCustomTitle = set_chat_administrator_custom_title - """Alias for :meth:`set_chat_administrator_custom_title`""" - exportChatInviteLink = export_chat_invite_link - """Alias for :meth:`export_chat_invite_link`""" - createChatInviteLink = create_chat_invite_link - """Alias for :meth:`create_chat_invite_link`""" - editChatInviteLink = edit_chat_invite_link - """Alias for :meth:`edit_chat_invite_link`""" - revokeChatInviteLink = revoke_chat_invite_link - """Alias for :meth:`revoke_chat_invite_link`""" - approveChatJoinRequest = approve_chat_join_request - """Alias for :meth:`approve_chat_join_request`""" - declineChatJoinRequest = decline_chat_join_request - """Alias for :meth:`decline_chat_join_request`""" - setChatPhoto = set_chat_photo - """Alias for :meth:`set_chat_photo`""" - deleteChatPhoto = delete_chat_photo - """Alias for :meth:`delete_chat_photo`""" - setChatTitle = set_chat_title - """Alias for :meth:`set_chat_title`""" - setChatDescription = set_chat_description - """Alias for :meth:`set_chat_description`""" - setUserEmojiStatus = set_user_emoji_status - """Alias for :meth:`set_user_emoji_status`""" - pinChatMessage = pin_chat_message - """Alias for :meth:`pin_chat_message`""" - unpinChatMessage = unpin_chat_message - """Alias for :meth:`unpin_chat_message`""" - unpinAllChatMessages = unpin_all_chat_messages - """Alias for :meth:`unpin_all_chat_messages`""" - getCustomEmojiStickers = get_custom_emoji_stickers - """Alias for :meth:`get_custom_emoji_stickers`""" - getStickerSet = get_sticker_set - """Alias for :meth:`get_sticker_set`""" - uploadStickerFile = upload_sticker_file - """Alias for :meth:`upload_sticker_file`""" - createNewStickerSet = create_new_sticker_set - """Alias for :meth:`create_new_sticker_set`""" - addStickerToSet = add_sticker_to_set - """Alias for :meth:`add_sticker_to_set`""" - setStickerPositionInSet = set_sticker_position_in_set - """Alias for :meth:`set_sticker_position_in_set`""" - deleteStickerFromSet = delete_sticker_from_set - """Alias for :meth:`delete_sticker_from_set`""" - setStickerSetThumbnail = set_sticker_set_thumbnail - """Alias for :meth:`set_sticker_set_thumbnail`""" - setPassportDataErrors = set_passport_data_errors - """Alias for :meth:`set_passport_data_errors`""" - sendPoll = send_poll - """Alias for :meth:`send_poll`""" - stopPoll = stop_poll - """Alias for :meth:`stop_poll`""" - sendDice = send_dice - """Alias for :meth:`send_dice`""" - getMyCommands = get_my_commands - """Alias for :meth:`get_my_commands`""" - setMyCommands = set_my_commands - """Alias for :meth:`set_my_commands`""" - deleteMyCommands = delete_my_commands - """Alias for :meth:`delete_my_commands`""" - logOut = log_out - """Alias for :meth:`log_out`""" - copyMessage = copy_message - """Alias for :meth:`copy_message`""" - copyMessages = copy_messages - """Alias for :meth:`copy_messages`""" - getChatMenuButton = get_chat_menu_button - """Alias for :meth:`get_chat_menu_button`""" - setChatMenuButton = set_chat_menu_button - """Alias for :meth:`set_chat_menu_button`""" - getMyDefaultAdministratorRights = get_my_default_administrator_rights - """Alias for :meth:`get_my_default_administrator_rights`""" - setMyDefaultAdministratorRights = set_my_default_administrator_rights - """Alias for :meth:`set_my_default_administrator_rights`""" - createInvoiceLink = create_invoice_link - """Alias for :meth:`create_invoice_link`""" - getForumTopicIconStickers = get_forum_topic_icon_stickers - """Alias for :meth:`get_forum_topic_icon_stickers`""" - createForumTopic = create_forum_topic - """Alias for :meth:`create_forum_topic`""" - editForumTopic = edit_forum_topic - """Alias for :meth:`edit_forum_topic`""" - closeForumTopic = close_forum_topic - """Alias for :meth:`close_forum_topic`""" - reopenForumTopic = reopen_forum_topic - """Alias for :meth:`reopen_forum_topic`""" - deleteForumTopic = delete_forum_topic - """Alias for :meth:`delete_forum_topic`""" - unpinAllForumTopicMessages = unpin_all_forum_topic_messages - """Alias for :meth:`unpin_all_forum_topic_messages`""" - editGeneralForumTopic = edit_general_forum_topic - """Alias for :meth:`edit_general_forum_topic`""" - closeGeneralForumTopic = close_general_forum_topic - """Alias for :meth:`close_general_forum_topic`""" - reopenGeneralForumTopic = reopen_general_forum_topic - """Alias for :meth:`reopen_general_forum_topic`""" - hideGeneralForumTopic = hide_general_forum_topic - """Alias for :meth:`hide_general_forum_topic`""" - unhideGeneralForumTopic = unhide_general_forum_topic - """Alias for :meth:`unhide_general_forum_topic`""" - setMyDescription = set_my_description - """Alias for :meth:`set_my_description`""" - setMyShortDescription = set_my_short_description - """Alias for :meth:`set_my_short_description`""" - getMyDescription = get_my_description - """Alias for :meth:`get_my_description`""" - getMyShortDescription = get_my_short_description - """Alias for :meth:`get_my_short_description`""" - setCustomEmojiStickerSetThumbnail = set_custom_emoji_sticker_set_thumbnail - """Alias for :meth:`set_custom_emoji_sticker_set_thumbnail`""" - setStickerSetTitle = set_sticker_set_title - """Alias for :meth:`set_sticker_set_title`""" - deleteStickerSet = delete_sticker_set - """Alias for :meth:`delete_sticker_set`""" - setStickerEmojiList = set_sticker_emoji_list - """Alias for :meth:`set_sticker_emoji_list`""" - setStickerKeywords = set_sticker_keywords - """Alias for :meth:`set_sticker_keywords`""" - setStickerMaskPosition = set_sticker_mask_position - """Alias for :meth:`set_sticker_mask_position`""" - setMyName = set_my_name - """Alias for :meth:`set_my_name`""" - getMyName = get_my_name - """Alias for :meth:`get_my_name`""" - unpinAllGeneralForumTopicMessages = unpin_all_general_forum_topic_messages - """Alias for :meth:`unpin_all_general_forum_topic_messages`""" - getUserChatBoosts = get_user_chat_boosts - """Alias for :meth:`get_user_chat_boosts`""" - setMessageReaction = set_message_reaction - """Alias for :meth:`set_message_reaction`""" - giftPremiumSubscription = gift_premium_subscription - """Alias for :meth:`gift_premium_subscription`""" - getBusinessAccountGifts = get_business_account_gifts - """Alias for :meth:`get_business_account_gifts`""" - getBusinessAccountStarBalance = get_business_account_star_balance - """Alias for :meth:`get_business_account_star_balance`""" - getBusinessConnection = get_business_connection - """Alias for :meth:`get_business_connection`""" - readBusinessMessage = read_business_message - """Alias for :meth:`read_business_message`""" - deleteBusinessMessages = delete_business_messages - """Alias for :meth:`delete_business_messages`""" - postStory = post_story - """Alias for :meth:`post_story`""" - editStory = edit_story - """Alias for :meth:`edit_story`""" - deleteStory = delete_story - """Alias for :meth:`delete_story`""" - setBusinessAccountName = set_business_account_name - """Alias for :meth:`set_business_account_name`""" - setBusinessAccountUsername = set_business_account_username - """Alias for :meth:`set_business_account_username`""" - setBusinessAccountBio = set_business_account_bio - """Alias for :meth:`set_business_account_bio`""" - setBusinessAccountGiftSettings = set_business_account_gift_settings - """Alias for :meth:`set_business_account_gift_settings`""" - setBusinessAccountProfilePhoto = set_business_account_profile_photo - """Alias for :meth:`set_business_account_profile_photo`""" - removeBusinessAccountProfilePhoto = remove_business_account_profile_photo - """Alias for :meth:`remove_business_account_profile_photo`""" - convertGiftToStars = convert_gift_to_stars - """Alias for :meth:`convert_gift_to_stars`""" - upgradeGift = upgrade_gift - """Alias for :meth:`upgrade_gift`""" - transferGift = transfer_gift - """Alias for :meth:`transfer_gift`""" - transferBusinessAccountStars = transfer_business_account_stars - """Alias for :meth:`transfer_business_account_stars`""" - replaceStickerInSet = replace_sticker_in_set - """Alias for :meth:`replace_sticker_in_set`""" - refundStarPayment = refund_star_payment - """Alias for :meth:`refund_star_payment`""" - getStarTransactions = get_star_transactions - """Alias for :meth:`get_star_transactions`""" - editUserStarSubscription = edit_user_star_subscription - """Alias for :meth:`edit_user_star_subscription`""" - sendPaidMedia = send_paid_media - """Alias for :meth:`send_paid_media`""" - createChatSubscriptionInviteLink = create_chat_subscription_invite_link - """Alias for :meth:`create_chat_subscription_invite_link`""" - editChatSubscriptionInviteLink = edit_chat_subscription_invite_link - """Alias for :meth:`edit_chat_subscription_invite_link`""" - getAvailableGifts = get_available_gifts - """Alias for :meth:`get_available_gifts`""" - sendGift = send_gift - """Alias for :meth:`send_gift`""" - verifyChat = verify_chat - """Alias for :meth:`verify_chat`""" - verifyUser = verify_user - """Alias for :meth:`verify_user`""" - removeChatVerification = remove_chat_verification - """Alias for :meth:`remove_chat_verification`""" - removeUserVerification = remove_user_verification - """Alias for :meth:`remove_user_verification`""" diff --git a/venv/lib/python3.12/site-packages/telegram/_botcommand.py b/venv/lib/python3.12/site-packages/telegram/_botcommand.py deleted file mode 100644 index 0597408..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_botcommand.py +++ /dev/null @@ -1,83 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram Bot Command.""" - -from typing import Final, Optional - -from telegram import constants -from telegram._telegramobject import TelegramObject -from telegram._utils.types import JSONDict - - -class BotCommand(TelegramObject): - """ - This object represents a bot command. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`command` and :attr:`description` are equal. - - Args: - command (:obj:`str`): Text of the command; :tg-const:`telegram.BotCommand.MIN_COMMAND`- - :tg-const:`telegram.BotCommand.MAX_COMMAND` characters. Can contain only lowercase - English letters, digits and underscores. - description (:obj:`str`): Description of the command; - :tg-const:`telegram.BotCommand.MIN_DESCRIPTION`- - :tg-const:`telegram.BotCommand.MAX_DESCRIPTION` characters. - - Attributes: - command (:obj:`str`): Text of the command; :tg-const:`telegram.BotCommand.MIN_COMMAND`- - :tg-const:`telegram.BotCommand.MAX_COMMAND` characters. Can contain only lowercase - English letters, digits and underscores. - description (:obj:`str`): Description of the command; - :tg-const:`telegram.BotCommand.MIN_DESCRIPTION`- - :tg-const:`telegram.BotCommand.MAX_DESCRIPTION` characters. - - """ - - __slots__ = ("command", "description") - - def __init__(self, command: str, description: str, *, api_kwargs: Optional[JSONDict] = None): - super().__init__(api_kwargs=api_kwargs) - self.command: str = command - self.description: str = description - - self._id_attrs = (self.command, self.description) - - self._freeze() - - MIN_COMMAND: Final[int] = constants.BotCommandLimit.MIN_COMMAND - """:const:`telegram.constants.BotCommandLimit.MIN_COMMAND` - - .. versionadded:: 20.0 - """ - MAX_COMMAND: Final[int] = constants.BotCommandLimit.MAX_COMMAND - """:const:`telegram.constants.BotCommandLimit.MAX_COMMAND` - - .. versionadded:: 20.0 - """ - MIN_DESCRIPTION: Final[int] = constants.BotCommandLimit.MIN_DESCRIPTION - """:const:`telegram.constants.BotCommandLimit.MIN_DESCRIPTION` - - .. versionadded:: 20.0 - """ - MAX_DESCRIPTION: Final[int] = constants.BotCommandLimit.MAX_DESCRIPTION - """:const:`telegram.constants.BotCommandLimit.MAX_DESCRIPTION` - - .. versionadded:: 20.0 - """ diff --git a/venv/lib/python3.12/site-packages/telegram/_botcommandscope.py b/venv/lib/python3.12/site-packages/telegram/_botcommandscope.py deleted file mode 100644 index dbce54c..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_botcommandscope.py +++ /dev/null @@ -1,268 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -# pylint: disable=redefined-builtin -"""This module contains objects representing Telegram bot command scopes.""" -from typing import TYPE_CHECKING, Final, Optional, Union - -from telegram import constants -from telegram._telegramobject import TelegramObject -from telegram._utils import enum -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot - - -class BotCommandScope(TelegramObject): - """Base class for objects that represent the scope to which bot commands are applied. - Currently, the following 7 scopes are supported: - - * :class:`telegram.BotCommandScopeDefault` - * :class:`telegram.BotCommandScopeAllPrivateChats` - * :class:`telegram.BotCommandScopeAllGroupChats` - * :class:`telegram.BotCommandScopeAllChatAdministrators` - * :class:`telegram.BotCommandScopeChat` - * :class:`telegram.BotCommandScopeChatAdministrators` - * :class:`telegram.BotCommandScopeChatMember` - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`type` is equal. For subclasses with additional attributes, - the notion of equality is overridden. - - Note: - Please see the `official docs`_ on how Telegram determines which commands to display. - - .. _`official docs`: https://core.telegram.org/bots/api#determining-list-of-commands - - .. versionadded:: 13.7 - - Args: - type (:obj:`str`): Scope type. - - Attributes: - type (:obj:`str`): Scope type. - """ - - __slots__ = ("type",) - - DEFAULT: Final[str] = constants.BotCommandScopeType.DEFAULT - """:const:`telegram.constants.BotCommandScopeType.DEFAULT`""" - ALL_PRIVATE_CHATS: Final[str] = constants.BotCommandScopeType.ALL_PRIVATE_CHATS - """:const:`telegram.constants.BotCommandScopeType.ALL_PRIVATE_CHATS`""" - ALL_GROUP_CHATS: Final[str] = constants.BotCommandScopeType.ALL_GROUP_CHATS - """:const:`telegram.constants.BotCommandScopeType.ALL_GROUP_CHATS`""" - ALL_CHAT_ADMINISTRATORS: Final[str] = constants.BotCommandScopeType.ALL_CHAT_ADMINISTRATORS - """:const:`telegram.constants.BotCommandScopeType.ALL_CHAT_ADMINISTRATORS`""" - CHAT: Final[str] = constants.BotCommandScopeType.CHAT - """:const:`telegram.constants.BotCommandScopeType.CHAT`""" - CHAT_ADMINISTRATORS: Final[str] = constants.BotCommandScopeType.CHAT_ADMINISTRATORS - """:const:`telegram.constants.BotCommandScopeType.CHAT_ADMINISTRATORS`""" - CHAT_MEMBER: Final[str] = constants.BotCommandScopeType.CHAT_MEMBER - """:const:`telegram.constants.BotCommandScopeType.CHAT_MEMBER`""" - - def __init__(self, type: str, *, api_kwargs: Optional[JSONDict] = None): - super().__init__(api_kwargs=api_kwargs) - self.type: str = enum.get_member(constants.BotCommandScopeType, type, type) - self._id_attrs = (self.type,) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "BotCommandScope": - """Converts JSON data to the appropriate :class:`BotCommandScope` object, i.e. takes - care of selecting the correct subclass. - - Args: - data (dict[:obj:`str`, ...]): The JSON data. - bot (:class:`telegram.Bot`, optional): The bot associated with this object. Defaults to - :obj:`None`, in which case shortcut methods will not be available. - - .. versionchanged:: 21.4 - :paramref:`bot` is now optional and defaults to :obj:`None` - - Returns: - The Telegram object. - - """ - data = cls._parse_data(data) - - _class_mapping: dict[str, type[BotCommandScope]] = { - cls.DEFAULT: BotCommandScopeDefault, - cls.ALL_PRIVATE_CHATS: BotCommandScopeAllPrivateChats, - cls.ALL_GROUP_CHATS: BotCommandScopeAllGroupChats, - cls.ALL_CHAT_ADMINISTRATORS: BotCommandScopeAllChatAdministrators, - cls.CHAT: BotCommandScopeChat, - cls.CHAT_ADMINISTRATORS: BotCommandScopeChatAdministrators, - cls.CHAT_MEMBER: BotCommandScopeChatMember, - } - - if cls is BotCommandScope and data.get("type") in _class_mapping: - return _class_mapping[data.pop("type")].de_json(data=data, bot=bot) - return super().de_json(data=data, bot=bot) - - -class BotCommandScopeDefault(BotCommandScope): - """Represents the default scope of bot commands. Default commands are used if no commands with - a `narrower scope`_ are specified for the user. - - .. _`narrower scope`: https://core.telegram.org/bots/api#determining-list-of-commands - - .. versionadded:: 13.7 - Attributes: - type (:obj:`str`): Scope type :tg-const:`telegram.BotCommandScope.DEFAULT`. - """ - - __slots__ = () - - def __init__(self, *, api_kwargs: Optional[JSONDict] = None): - super().__init__(type=BotCommandScope.DEFAULT, api_kwargs=api_kwargs) - self._freeze() - - -class BotCommandScopeAllPrivateChats(BotCommandScope): - """Represents the scope of bot commands, covering all private chats. - - .. versionadded:: 13.7 - - Attributes: - type (:obj:`str`): Scope type :tg-const:`telegram.BotCommandScope.ALL_PRIVATE_CHATS`. - """ - - __slots__ = () - - def __init__(self, *, api_kwargs: Optional[JSONDict] = None): - super().__init__(type=BotCommandScope.ALL_PRIVATE_CHATS, api_kwargs=api_kwargs) - self._freeze() - - -class BotCommandScopeAllGroupChats(BotCommandScope): - """Represents the scope of bot commands, covering all group and supergroup chats. - - .. versionadded:: 13.7 - Attributes: - type (:obj:`str`): Scope type :tg-const:`telegram.BotCommandScope.ALL_GROUP_CHATS`. - """ - - __slots__ = () - - def __init__(self, *, api_kwargs: Optional[JSONDict] = None): - super().__init__(type=BotCommandScope.ALL_GROUP_CHATS, api_kwargs=api_kwargs) - self._freeze() - - -class BotCommandScopeAllChatAdministrators(BotCommandScope): - """Represents the scope of bot commands, covering all group and supergroup chat administrators. - - .. versionadded:: 13.7 - Attributes: - type (:obj:`str`): Scope type :tg-const:`telegram.BotCommandScope.ALL_CHAT_ADMINISTRATORS`. - """ - - __slots__ = () - - def __init__(self, *, api_kwargs: Optional[JSONDict] = None): - super().__init__(type=BotCommandScope.ALL_CHAT_ADMINISTRATORS, api_kwargs=api_kwargs) - self._freeze() - - -class BotCommandScopeChat(BotCommandScope): - """Represents the scope of bot commands, covering a specific chat. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`type` and :attr:`chat_id` are equal. - - .. versionadded:: 13.7 - - Args: - chat_id (:obj:`str` | :obj:`int`): |chat_id_group| - - Attributes: - type (:obj:`str`): Scope type :tg-const:`telegram.BotCommandScope.CHAT`. - chat_id (:obj:`str` | :obj:`int`): |chat_id_group| - """ - - __slots__ = ("chat_id",) - - def __init__(self, chat_id: Union[str, int], *, api_kwargs: Optional[JSONDict] = None): - super().__init__(type=BotCommandScope.CHAT, api_kwargs=api_kwargs) - with self._unfrozen(): - self.chat_id: Union[str, int] = ( - chat_id if isinstance(chat_id, str) and chat_id.startswith("@") else int(chat_id) - ) - self._id_attrs = (self.type, self.chat_id) - - -class BotCommandScopeChatAdministrators(BotCommandScope): - """Represents the scope of bot commands, covering all administrators of a specific group or - supergroup chat. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`type` and :attr:`chat_id` are equal. - - .. versionadded:: 13.7 - - Args: - chat_id (:obj:`str` | :obj:`int`): |chat_id_group| - Attributes: - type (:obj:`str`): Scope type :tg-const:`telegram.BotCommandScope.CHAT_ADMINISTRATORS`. - chat_id (:obj:`str` | :obj:`int`): |chat_id_group| - """ - - __slots__ = ("chat_id",) - - def __init__(self, chat_id: Union[str, int], *, api_kwargs: Optional[JSONDict] = None): - super().__init__(type=BotCommandScope.CHAT_ADMINISTRATORS, api_kwargs=api_kwargs) - with self._unfrozen(): - self.chat_id: Union[str, int] = ( - chat_id if isinstance(chat_id, str) and chat_id.startswith("@") else int(chat_id) - ) - self._id_attrs = (self.type, self.chat_id) - - -class BotCommandScopeChatMember(BotCommandScope): - """Represents the scope of bot commands, covering a specific member of a group or supergroup - chat. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`type`, :attr:`chat_id` and :attr:`user_id` are equal. - - .. versionadded:: 13.7 - - Args: - chat_id (:obj:`str` | :obj:`int`): |chat_id_group| - user_id (:obj:`int`): Unique identifier of the target user. - - Attributes: - type (:obj:`str`): Scope type :tg-const:`telegram.BotCommandScope.CHAT_MEMBER`. - chat_id (:obj:`str` | :obj:`int`): |chat_id_group| - user_id (:obj:`int`): Unique identifier of the target user. - """ - - __slots__ = ("chat_id", "user_id") - - def __init__( - self, chat_id: Union[str, int], user_id: int, *, api_kwargs: Optional[JSONDict] = None - ): - super().__init__(type=BotCommandScope.CHAT_MEMBER, api_kwargs=api_kwargs) - with self._unfrozen(): - self.chat_id: Union[str, int] = ( - chat_id if isinstance(chat_id, str) and chat_id.startswith("@") else int(chat_id) - ) - self.user_id: int = user_id - self._id_attrs = (self.type, self.chat_id, self.user_id) diff --git a/venv/lib/python3.12/site-packages/telegram/_botdescription.py b/venv/lib/python3.12/site-packages/telegram/_botdescription.py deleted file mode 100644 index 9f53ef1..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_botdescription.py +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains two objects that represent a Telegram bots (short) description.""" -from typing import Optional - -from telegram._telegramobject import TelegramObject -from telegram._utils.types import JSONDict - - -class BotDescription(TelegramObject): - """This object represents the bot's description. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`description` is equal. - - .. versionadded:: 20.2 - - Args: - description (:obj:`str`): The bot's description. - - Attributes: - description (:obj:`str`): The bot's description. - - """ - - __slots__ = ("description",) - - def __init__(self, description: str, *, api_kwargs: Optional[JSONDict] = None): - super().__init__(api_kwargs=api_kwargs) - self.description: str = description - - self._id_attrs = (self.description,) - - self._freeze() - - -class BotShortDescription(TelegramObject): - """This object represents the bot's short description. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`short_description` is equal. - - .. versionadded:: 20.2 - - Args: - short_description (:obj:`str`): The bot's short description. - - Attributes: - short_description (:obj:`str`): The bot's short description. - - """ - - __slots__ = ("short_description",) - - def __init__(self, short_description: str, *, api_kwargs: Optional[JSONDict] = None): - super().__init__(api_kwargs=api_kwargs) - self.short_description: str = short_description - - self._id_attrs = (self.short_description,) - - self._freeze() diff --git a/venv/lib/python3.12/site-packages/telegram/_botname.py b/venv/lib/python3.12/site-packages/telegram/_botname.py deleted file mode 100644 index a297027..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_botname.py +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represent a Telegram bots name.""" -from typing import Final, Optional - -from telegram import constants -from telegram._telegramobject import TelegramObject -from telegram._utils.types import JSONDict - - -class BotName(TelegramObject): - """This object represents the bot's name. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`name` is equal. - - .. versionadded:: 20.3 - - Args: - name (:obj:`str`): The bot's name. - - Attributes: - name (:obj:`str`): The bot's name. - - """ - - __slots__ = ("name",) - - def __init__(self, name: str, *, api_kwargs: Optional[JSONDict] = None): - super().__init__(api_kwargs=api_kwargs) - self.name: str = name - - self._id_attrs = (self.name,) - - self._freeze() - - MAX_LENGTH: Final[int] = constants.BotNameLimit.MAX_NAME_LENGTH - """:const:`telegram.constants.BotNameLimit.MAX_NAME_LENGTH`""" diff --git a/venv/lib/python3.12/site-packages/telegram/_business.py b/venv/lib/python3.12/site-packages/telegram/_business.py deleted file mode 100644 index dd05542..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_business.py +++ /dev/null @@ -1,628 +0,0 @@ -#!/usr/bin/env python -# pylint: disable=redefined-builtin -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/] -"""This module contains the Telegram Business related classes.""" -import datetime as dtm -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional - -from telegram._chat import Chat -from telegram._files.location import Location -from telegram._files.sticker import Sticker -from telegram._telegramobject import TelegramObject -from telegram._user import User -from telegram._utils.argumentparsing import de_json_optional, de_list_optional, parse_sequence_arg -from telegram._utils.datetime import extract_tzinfo_from_defaults, from_timestamp -from telegram._utils.types import JSONDict -from telegram._utils.warnings import warn -from telegram._utils.warnings_transition import ( - build_deprecation_warning_message, - warn_about_deprecated_attr_in_property, -) -from telegram.warnings import PTBDeprecationWarning - -if TYPE_CHECKING: - from telegram import Bot - - -class BusinessBotRights(TelegramObject): - """ - This object represents the rights of a business bot. - - Objects of this class are comparable in terms of equality. - Two objects of this class are considered equal, if all their attributes are equal. - - .. versionadded:: 22.1 - - Args: - can_reply (:obj:`bool`, optional): True, if the bot can send and edit messages in the - private chats that had incoming messages in the last 24 hours. - can_read_messages (:obj:`bool`, optional): True, if the bot can mark incoming private - messages as read. - can_delete_sent_messages (:obj:`bool`, optional): True, if the bot can delete messages - sent by the bot. - can_delete_all_messages (:obj:`bool`, optional): True, if the bot can delete all private - messages in managed chats. - can_edit_name (:obj:`bool`, optional): True, if the bot can edit the first and last name - of the business account. - can_edit_bio (:obj:`bool`, optional): True, if the bot can edit the bio of the - business account. - can_edit_profile_photo (:obj:`bool`, optional): True, if the bot can edit the profile - photo of the business account. - can_edit_username (:obj:`bool`, optional): True, if the bot can edit the username of the - business account. - can_change_gift_settings (:obj:`bool`, optional): True, if the bot can change the privacy - settings pertaining to gifts for the business account. - can_view_gifts_and_stars (:obj:`bool`, optional): True, if the bot can view gifts and the - amount of Telegram Stars owned by the business account. - can_convert_gifts_to_stars (:obj:`bool`, optional): True, if the bot can convert regular - gifts owned by the business account to Telegram Stars. - can_transfer_and_upgrade_gifts (:obj:`bool`, optional): True, if the bot can transfer and - upgrade gifts owned by the business account. - can_transfer_stars (:obj:`bool`, optional): True, if the bot can transfer Telegram Stars - received by the business account to its own account, or use them to upgrade and - transfer gifts. - can_manage_stories (:obj:`bool`, optional): True, if the bot can post, edit and delete - stories on behalf of the business account. - - Attributes: - can_reply (:obj:`bool`): Optional. True, if the bot can send and edit messages in the - private chats that had incoming messages in the last 24 hours. - can_read_messages (:obj:`bool`): Optional. True, if the bot can mark incoming private - messages as read. - can_delete_sent_messages (:obj:`bool`): Optional. True, if the bot can delete messages - sent by the bot. - can_delete_all_messages (:obj:`bool`): Optional. True, if the bot can delete all private - messages in managed chats. - can_edit_name (:obj:`bool`): Optional. True, if the bot can edit the first and last name - of the business account. - can_edit_bio (:obj:`bool`): Optional. True, if the bot can edit the bio of the - business account. - can_edit_profile_photo (:obj:`bool`): Optional. True, if the bot can edit the profile - photo of the business account. - can_edit_username (:obj:`bool`): Optional. True, if the bot can edit the username of the - business account. - can_change_gift_settings (:obj:`bool`): Optional. True, if the bot can change the privacy - settings pertaining to gifts for the business account. - can_view_gifts_and_stars (:obj:`bool`): Optional. True, if the bot can view gifts and the - amount of Telegram Stars owned by the business account. - can_convert_gifts_to_stars (:obj:`bool`): Optional. True, if the bot can convert regular - gifts owned by the business account to Telegram Stars. - can_transfer_and_upgrade_gifts (:obj:`bool`): Optional. True, if the bot can transfer and - upgrade gifts owned by the business account. - can_transfer_stars (:obj:`bool`): Optional. True, if the bot can transfer Telegram Stars - received by the business account to its own account, or use them to upgrade and - transfer gifts. - can_manage_stories (:obj:`bool`): Optional. True, if the bot can post, edit and delete - stories on behalf of the business account. - """ - - __slots__ = ( - "can_change_gift_settings", - "can_convert_gifts_to_stars", - "can_delete_all_messages", - "can_delete_sent_messages", - "can_edit_bio", - "can_edit_name", - "can_edit_profile_photo", - "can_edit_username", - "can_manage_stories", - "can_read_messages", - "can_reply", - "can_transfer_and_upgrade_gifts", - "can_transfer_stars", - "can_view_gifts_and_stars", - ) - - def __init__( - self, - can_reply: Optional[bool] = None, - can_read_messages: Optional[bool] = None, - can_delete_sent_messages: Optional[bool] = None, - can_delete_all_messages: Optional[bool] = None, - can_edit_name: Optional[bool] = None, - can_edit_bio: Optional[bool] = None, - can_edit_profile_photo: Optional[bool] = None, - can_edit_username: Optional[bool] = None, - can_change_gift_settings: Optional[bool] = None, - can_view_gifts_and_stars: Optional[bool] = None, - can_convert_gifts_to_stars: Optional[bool] = None, - can_transfer_and_upgrade_gifts: Optional[bool] = None, - can_transfer_stars: Optional[bool] = None, - can_manage_stories: Optional[bool] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.can_reply: Optional[bool] = can_reply - self.can_read_messages: Optional[bool] = can_read_messages - self.can_delete_sent_messages: Optional[bool] = can_delete_sent_messages - self.can_delete_all_messages: Optional[bool] = can_delete_all_messages - self.can_edit_name: Optional[bool] = can_edit_name - self.can_edit_bio: Optional[bool] = can_edit_bio - self.can_edit_profile_photo: Optional[bool] = can_edit_profile_photo - self.can_edit_username: Optional[bool] = can_edit_username - self.can_change_gift_settings: Optional[bool] = can_change_gift_settings - self.can_view_gifts_and_stars: Optional[bool] = can_view_gifts_and_stars - self.can_convert_gifts_to_stars: Optional[bool] = can_convert_gifts_to_stars - self.can_transfer_and_upgrade_gifts: Optional[bool] = can_transfer_and_upgrade_gifts - self.can_transfer_stars: Optional[bool] = can_transfer_stars - self.can_manage_stories: Optional[bool] = can_manage_stories - - self._id_attrs = ( - self.can_reply, - self.can_read_messages, - self.can_delete_sent_messages, - self.can_delete_all_messages, - self.can_edit_name, - self.can_edit_bio, - self.can_edit_profile_photo, - self.can_edit_username, - self.can_change_gift_settings, - self.can_view_gifts_and_stars, - self.can_convert_gifts_to_stars, - self.can_transfer_and_upgrade_gifts, - self.can_transfer_stars, - self.can_manage_stories, - ) - - self._freeze() - - -class BusinessConnection(TelegramObject): - """ - Describes the connection of the bot with a business account. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal if their :attr:`id`, :attr:`user`, :attr:`user_chat_id`, :attr:`date`, - :attr:`rights`, and :attr:`is_enabled` are equal. - - .. versionadded:: 21.1 - .. versionchanged:: 22.1 - Equality comparison now considers :attr:`rights` instead of :attr:`can_reply`. - - Args: - id (:obj:`str`): Unique identifier of the business connection. - user (:class:`telegram.User`): Business account user that created the business connection. - user_chat_id (:obj:`int`): Identifier of a private chat with the user who created the - business connection. - date (:obj:`datetime.datetime`): Date the connection was established in Unix time. - can_reply (:obj:`bool`, optional): True, if the bot can act on behalf of the business - account in chats that were active in the last 24 hours. - - .. deprecated:: 22.1 - Bot API 9.0 deprecated this argument in favor of :paramref:`rights`. - is_enabled (:obj:`bool`): True, if the connection is active. - rights (:class:`BusinessBotRights`, optional): Rights of the business bot. - - .. versionadded:: 22.1 - - Attributes: - id (:obj:`str`): Unique identifier of the business connection. - user (:class:`telegram.User`): Business account user that created the business connection. - user_chat_id (:obj:`int`): Identifier of a private chat with the user who created the - business connection. - date (:obj:`datetime.datetime`): Date the connection was established in Unix time. - is_enabled (:obj:`bool`): True, if the connection is active. - rights (:class:`BusinessBotRights`): Optional. Rights of the business bot. - - .. versionadded:: 22.1 - """ - - __slots__ = ( - "_can_reply", - "date", - "id", - "is_enabled", - "rights", - "user", - "user_chat_id", - ) - - def __init__( - self, - id: str, - user: "User", - user_chat_id: int, - date: dtm.datetime, - can_reply: Optional[bool] = None, - # temporarily optional to account for changed signature - # tags: deprecated 22.1; bot api 9.0 - is_enabled: Optional[bool] = None, - rights: Optional[BusinessBotRights] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - if is_enabled is None: - raise TypeError("Missing required argument `is_enabled`") - - if can_reply is not None: - warn( - PTBDeprecationWarning( - version="22.1", - message=build_deprecation_warning_message( - deprecated_name="can_reply", - new_name="rights", - bot_api_version="9.0", - object_type="parameter", - ), - ), - stacklevel=2, - ) - - super().__init__(api_kwargs=api_kwargs) - self.id: str = id - self.user: User = user - self.user_chat_id: int = user_chat_id - self.date: dtm.datetime = date - self._can_reply: Optional[bool] = can_reply - self.is_enabled: bool = is_enabled - self.rights: Optional[BusinessBotRights] = rights - - self._id_attrs = ( - self.id, - self.user, - self.user_chat_id, - self.date, - self.rights, - self.is_enabled, - ) - - self._freeze() - - @property - def can_reply(self) -> Optional[bool]: - """:obj:`bool`: Optional. True, if the bot can act on behalf of the business account in - chats that were active in the last 24 hours. - - .. deprecated:: 22.1 - Bot API 9.0 deprecated this argument in favor of :attr:`rights` - """ - warn_about_deprecated_attr_in_property( - deprecated_attr_name="can_reply", - new_attr_name="rights", - bot_api_version="9.0", - ptb_version="22.1", - ) - return self._can_reply - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "BusinessConnection": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - # Get the local timezone from the bot if it has defaults - loc_tzinfo = extract_tzinfo_from_defaults(bot) - - data["date"] = from_timestamp(data.get("date"), tzinfo=loc_tzinfo) - data["user"] = de_json_optional(data.get("user"), User, bot) - data["rights"] = de_json_optional(data.get("rights"), BusinessBotRights, bot) - - return super().de_json(data=data, bot=bot) - - -class BusinessMessagesDeleted(TelegramObject): - """ - This object is received when messages are deleted from a connected business account. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal if their :attr:`business_connection_id`, :attr:`message_ids`, and - :attr:`chat` are equal. - - .. versionadded:: 21.1 - - Args: - business_connection_id (:obj:`str`): Unique identifier of the business connection. - chat (:class:`telegram.Chat`): Information about a chat in the business account. The bot - may not have access to the chat or the corresponding user. - message_ids (Sequence[:obj:`int`]): A list of identifiers of the deleted messages in the - chat of the business account. - - Attributes: - business_connection_id (:obj:`str`): Unique identifier of the business connection. - chat (:class:`telegram.Chat`): Information about a chat in the business account. The bot - may not have access to the chat or the corresponding user. - message_ids (tuple[:obj:`int`]): A list of identifiers of the deleted messages in the - chat of the business account. - """ - - __slots__ = ( - "business_connection_id", - "chat", - "message_ids", - ) - - def __init__( - self, - business_connection_id: str, - chat: Chat, - message_ids: Sequence[int], - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.business_connection_id: str = business_connection_id - self.chat: Chat = chat - self.message_ids: tuple[int, ...] = parse_sequence_arg(message_ids) - - self._id_attrs = ( - self.business_connection_id, - self.chat, - self.message_ids, - ) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "BusinessMessagesDeleted": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["chat"] = de_json_optional(data.get("chat"), Chat, bot) - - return super().de_json(data=data, bot=bot) - - -class BusinessIntro(TelegramObject): - """ - This object contains information about the start page settings of a Telegram Business account. - - Objects of this class are comparable in terms of equality. - Two objects of this class are considered equal, if their - :attr:`title`, :attr:`message` and :attr:`sticker` are equal. - - .. versionadded:: 21.1 - - Args: - title (:obj:`str`, optional): Title text of the business intro. - message (:obj:`str`, optional): Message text of the business intro. - sticker (:class:`telegram.Sticker`, optional): Sticker of the business intro. - - Attributes: - title (:obj:`str`): Optional. Title text of the business intro. - message (:obj:`str`): Optional. Message text of the business intro. - sticker (:class:`telegram.Sticker`): Optional. Sticker of the business intro. - """ - - __slots__ = ( - "message", - "sticker", - "title", - ) - - def __init__( - self, - title: Optional[str] = None, - message: Optional[str] = None, - sticker: Optional[Sticker] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.title: Optional[str] = title - self.message: Optional[str] = message - self.sticker: Optional[Sticker] = sticker - - self._id_attrs = (self.title, self.message, self.sticker) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "BusinessIntro": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["sticker"] = de_json_optional(data.get("sticker"), Sticker, bot) - - return super().de_json(data=data, bot=bot) - - -class BusinessLocation(TelegramObject): - """ - This object contains information about the location of a Telegram Business account. - - Objects of this class are comparable in terms of equality. - Two objects of this class are considered equal, if their - :attr:`address` is equal. - - .. versionadded:: 21.1 - - Args: - address (:obj:`str`): Address of the business. - location (:class:`telegram.Location`, optional): Location of the business. - - Attributes: - address (:obj:`str`): Address of the business. - location (:class:`telegram.Location`): Optional. Location of the business. - """ - - __slots__ = ( - "address", - "location", - ) - - def __init__( - self, - address: str, - location: Optional[Location] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.address: str = address - self.location: Optional[Location] = location - - self._id_attrs = (self.address,) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "BusinessLocation": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["location"] = de_json_optional(data.get("location"), Location, bot) - - return super().de_json(data=data, bot=bot) - - -class BusinessOpeningHoursInterval(TelegramObject): - """ - This object describes an interval of time during which a business is open. - - Objects of this class are comparable in terms of equality. - Two objects of this class are considered equal, if their - :attr:`opening_minute` and :attr:`closing_minute` are equal. - - .. versionadded:: 21.1 - - Examples: - A day has (24 * 60 =) 1440 minutes, a week has (7 * 1440 =) 10080 minutes. - Starting the the minute's sequence from Monday, example values of - :attr:`opening_minute`, :attr:`closing_minute` will map to the following day times: - - * Monday - 8am to 8:30pm: - - ``opening_minute = 480`` :guilabel:`8 * 60` - - ``closing_minute = 1230`` :guilabel:`20 * 60 + 30` - * Tuesday - 24 hours: - - ``opening_minute = 1440`` :guilabel:`24 * 60` - - ``closing_minute = 2879`` :guilabel:`2 * 24 * 60 - 1` - * Sunday - 12am - 11:58pm: - - ``opening_minute = 8640`` :guilabel:`6 * 24 * 60` - - ``closing_minute = 10078`` :guilabel:`7 * 24 * 60 - 2` - - Args: - opening_minute (:obj:`int`): The minute's sequence number in a week, starting on Monday, - marking the start of the time interval during which the business is open; - 0 - 7 * 24 * 60. - closing_minute (:obj:`int`): The minute's - sequence number in a week, starting on Monday, marking the end of the time interval - during which the business is open; 0 - 8 * 24 * 60 - - Attributes: - opening_minute (:obj:`int`): The minute's sequence number in a week, starting on Monday, - marking the start of the time interval during which the business is open; - 0 - 7 * 24 * 60. - closing_minute (:obj:`int`): The minute's - sequence number in a week, starting on Monday, marking the end of the time interval - during which the business is open; 0 - 8 * 24 * 60 - """ - - __slots__ = ("_closing_time", "_opening_time", "closing_minute", "opening_minute") - - def __init__( - self, - opening_minute: int, - closing_minute: int, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.opening_minute: int = opening_minute - self.closing_minute: int = closing_minute - - self._opening_time: Optional[tuple[int, int, int]] = None - self._closing_time: Optional[tuple[int, int, int]] = None - - self._id_attrs = (self.opening_minute, self.closing_minute) - - self._freeze() - - def _parse_minute(self, minute: int) -> tuple[int, int, int]: - return (minute // 1440, minute % 1440 // 60, minute % 1440 % 60) - - @property - def opening_time(self) -> tuple[int, int, int]: - """Convenience attribute. A :obj:`tuple` parsed from :attr:`opening_minute`. It contains - the `weekday`, `hour` and `minute` in the same ranges as :attr:`datetime.datetime.weekday`, - :attr:`datetime.datetime.hour` and :attr:`datetime.datetime.minute` - - Returns: - tuple[:obj:`int`, :obj:`int`, :obj:`int`]: - """ - if self._opening_time is None: - self._opening_time = self._parse_minute(self.opening_minute) - return self._opening_time - - @property - def closing_time(self) -> tuple[int, int, int]: - """Convenience attribute. A :obj:`tuple` parsed from :attr:`closing_minute`. It contains - the `weekday`, `hour` and `minute` in the same ranges as :attr:`datetime.datetime.weekday`, - :attr:`datetime.datetime.hour` and :attr:`datetime.datetime.minute` - - Returns: - tuple[:obj:`int`, :obj:`int`, :obj:`int`]: - """ - if self._closing_time is None: - self._closing_time = self._parse_minute(self.closing_minute) - return self._closing_time - - -class BusinessOpeningHours(TelegramObject): - """ - This object describes the opening hours of a business. - - Objects of this class are comparable in terms of equality. - Two objects of this class are considered equal, if their - :attr:`time_zone_name` and :attr:`opening_hours` are equal. - - .. versionadded:: 21.1 - - Args: - time_zone_name (:obj:`str`): Unique name of the time zone for which the opening - hours are defined. - opening_hours (Sequence[:class:`telegram.BusinessOpeningHoursInterval`]): List of - time intervals describing business opening hours. - - Attributes: - time_zone_name (:obj:`str`): Unique name of the time zone for which the opening - hours are defined. - opening_hours (Sequence[:class:`telegram.BusinessOpeningHoursInterval`]): List of - time intervals describing business opening hours. - """ - - __slots__ = ("opening_hours", "time_zone_name") - - def __init__( - self, - time_zone_name: str, - opening_hours: Sequence[BusinessOpeningHoursInterval], - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.time_zone_name: str = time_zone_name - self.opening_hours: Sequence[BusinessOpeningHoursInterval] = parse_sequence_arg( - opening_hours - ) - - self._id_attrs = (self.time_zone_name, self.opening_hours) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "BusinessOpeningHours": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["opening_hours"] = de_list_optional( - data.get("opening_hours"), BusinessOpeningHoursInterval, bot - ) - - return super().de_json(data=data, bot=bot) diff --git a/venv/lib/python3.12/site-packages/telegram/_callbackquery.py b/venv/lib/python3.12/site-packages/telegram/_callbackquery.py deleted file mode 100644 index 99b4ad1..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_callbackquery.py +++ /dev/null @@ -1,893 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -# pylint: disable=redefined-builtin -"""This module contains an object that represents a Telegram CallbackQuery""" -from collections.abc import Sequence -from typing import TYPE_CHECKING, Final, Optional, Union - -from telegram import constants -from telegram._files.location import Location -from telegram._message import MaybeInaccessibleMessage, Message -from telegram._telegramobject import TelegramObject -from telegram._user import User -from telegram._utils.argumentparsing import de_json_optional -from telegram._utils.defaultvalue import DEFAULT_NONE -from telegram._utils.types import JSONDict, ODVInput, ReplyMarkup, TimePeriod - -if TYPE_CHECKING: - from telegram import ( - Bot, - GameHighScore, - InlineKeyboardMarkup, - InputMedia, - LinkPreviewOptions, - MessageEntity, - MessageId, - ReplyParameters, - ) - - -class CallbackQuery(TelegramObject): - """ - This object represents an incoming callback query from a callback button in an inline keyboard. - - If the button that originated the query was attached to a message sent by the bot, the field - :attr:`message` will be present. If the button was attached to a message sent via the bot (in - inline mode), the field :attr:`inline_message_id` will be present. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`id` is equal. - - Note: - * In Python :keyword:`from` is a reserved word. Use :paramref:`from_user` instead. - * Exactly one of the fields :attr:`data` or :attr:`game_short_name` will be present. - * After the user presses an inline button, Telegram clients will display a progress bar - until you call :attr:`answer`. It is, therefore, necessary to react - by calling :attr:`telegram.Bot.answer_callback_query` even if no notification to the user - is needed (e.g., without specifying any of the optional parameters). - * If you're using :attr:`telegram.ext.ExtBot.callback_data_cache`, :attr:`data` may be - an instance - of :class:`telegram.ext.InvalidCallbackData`. This will be the case, if the data - associated with the button triggering the :class:`telegram.CallbackQuery` was already - deleted or if :attr:`data` was manipulated by a malicious client. - - .. versionadded:: 13.6 - - Args: - id (:obj:`str`): Unique identifier for this query. - from_user (:class:`telegram.User`): Sender. - chat_instance (:obj:`str`): Global identifier, uniquely corresponding to the chat to which - the message with the callback button was sent. Useful for high scores in games. - message (:class:`telegram.MaybeInaccessibleMessage`, optional): Message sent by the bot - with the callback button that originated the query. - - .. versionchanged:: 20.8 - Accept objects of type :class:`telegram.MaybeInaccessibleMessage` since Bot API 7.0. - data (:obj:`str`, optional): Data associated with the callback button. Be aware that the - message, which originated the query, can contain no callback buttons with this data. - inline_message_id (:obj:`str`, optional): Identifier of the message sent via the bot in - inline mode, that originated the query. - game_short_name (:obj:`str`, optional): Short name of a Game to be returned, serves as - the unique identifier for the game. - - Attributes: - id (:obj:`str`): Unique identifier for this query. - from_user (:class:`telegram.User`): Sender. - chat_instance (:obj:`str`): Global identifier, uniquely corresponding to the chat to which - the message with the callback button was sent. Useful for high scores in games. - message (:class:`telegram.MaybeInaccessibleMessage`): Optional. Message sent by the bot - with the callback button that originated the query. - - .. versionchanged:: 20.8 - Objects may be of type :class:`telegram.MaybeInaccessibleMessage` since Bot API - 7.0. - data (:obj:`str` | :obj:`object`): Optional. Data associated with the callback button. - Be aware that the message, which originated the query, can contain no callback buttons - with this data. - - Tip: - The value here is the same as the value passed in - :paramref:`telegram.InlineKeyboardButton.callback_data`. - inline_message_id (:obj:`str`): Optional. Identifier of the message sent via the bot in - inline mode, that originated the query. - game_short_name (:obj:`str`): Optional. Short name of a Game to be returned, serves as - the unique identifier for the game. - - - """ - - __slots__ = ( - "chat_instance", - "data", - "from_user", - "game_short_name", - "id", - "inline_message_id", - "message", - ) - - def __init__( - self, - id: str, - from_user: User, - chat_instance: str, - message: Optional[MaybeInaccessibleMessage] = None, - data: Optional[str] = None, - inline_message_id: Optional[str] = None, - game_short_name: Optional[str] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - # Required - self.id: str = id - self.from_user: User = from_user - self.chat_instance: str = chat_instance - # Optionals - self.message: Optional[MaybeInaccessibleMessage] = message - self.data: Optional[str] = data - self.inline_message_id: Optional[str] = inline_message_id - self.game_short_name: Optional[str] = game_short_name - - self._id_attrs = (self.id,) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "CallbackQuery": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["from_user"] = de_json_optional(data.pop("from", None), User, bot) - data["message"] = de_json_optional(data.get("message"), Message, bot) - - return super().de_json(data=data, bot=bot) - - async def answer( - self, - text: Optional[str] = None, - show_alert: Optional[bool] = None, - url: Optional[str] = None, - cache_time: Optional[TimePeriod] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.answer_callback_query(update.callback_query.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.answer_callback_query`. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().answer_callback_query( - callback_query_id=self.id, - text=text, - show_alert=show_alert, - url=url, - cache_time=cache_time, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - def _get_message(self, action: str = "edit") -> Message: - """Helper method to get the message for the shortcut methods. Must be called only - if :attr:`inline_message_id` is *not* set. - """ - if not isinstance(self.message, Message): - raise TypeError(f"Cannot {action} an inaccessible message") - return self.message - - async def edit_message_text( - self, - text: str, - parse_mode: ODVInput[str] = DEFAULT_NONE, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - entities: Optional[Sequence["MessageEntity"]] = None, - link_preview_options: ODVInput["LinkPreviewOptions"] = DEFAULT_NONE, - *, - disable_web_page_preview: Optional[bool] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Union[Message, bool]: - """Shortcut for either:: - - await update.callback_query.message.edit_text(*args, **kwargs) - - or:: - - await bot.edit_message_text( - inline_message_id=update.callback_query.inline_message_id, *args, **kwargs, - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.edit_message_text` and :meth:`telegram.Message.edit_text`. - - .. versionchanged:: 20.8 - Raises :exc:`TypeError` if :attr:`message` is not accessible. - - Returns: - :class:`telegram.Message`: On success, if edited message is sent by the bot, the - edited Message is returned, otherwise :obj:`True` is returned. - - Raises: - :exc:`TypeError` if :attr:`message` is not accessible. - - """ - if self.inline_message_id: - return await self.get_bot().edit_message_text( - inline_message_id=self.inline_message_id, - text=text, - parse_mode=parse_mode, - disable_web_page_preview=disable_web_page_preview, - link_preview_options=link_preview_options, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - entities=entities, - chat_id=None, - message_id=None, - # inline messages can not be sent on behalf of a bcid - business_connection_id=None, - ) - return await self._get_message().edit_text( - text=text, - parse_mode=parse_mode, - disable_web_page_preview=disable_web_page_preview, - link_preview_options=link_preview_options, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - entities=entities, - ) - - async def edit_message_caption( - self, - caption: Optional[str] = None, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - show_caption_above_media: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Union[Message, bool]: - """Shortcut for either:: - - await update.callback_query.message.edit_caption(*args, **kwargs) - - or:: - - await bot.edit_message_caption( - inline_message_id=update.callback_query.inline_message_id, *args, **kwargs, - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.edit_message_caption` and :meth:`telegram.Message.edit_caption`. - - .. versionchanged:: 20.8 - Raises :exc:`TypeError` if :attr:`message` is not accessible. - - Returns: - :class:`telegram.Message`: On success, if edited message is sent by the bot, the - edited Message is returned, otherwise :obj:`True` is returned. - - Raises: - :exc:`TypeError` if :attr:`message` is not accessible. - - """ - if self.inline_message_id: - return await self.get_bot().edit_message_caption( - caption=caption, - inline_message_id=self.inline_message_id, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - parse_mode=parse_mode, - api_kwargs=api_kwargs, - caption_entities=caption_entities, - chat_id=None, - message_id=None, - show_caption_above_media=show_caption_above_media, - # inline messages can not be sent on behalf of a bcid - business_connection_id=None, - ) - return await self._get_message().edit_caption( - caption=caption, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - parse_mode=parse_mode, - api_kwargs=api_kwargs, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - ) - - async def edit_message_reply_markup( - self, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Union[Message, bool]: - """Shortcut for either:: - - await update.callback_query.message.edit_reply_markup(*args, **kwargs) - - or:: - - await bot.edit_message_reply_markup( - inline_message_id=update.callback_query.inline_message_id, *args, **kwargs - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.edit_message_reply_markup` and - :meth:`telegram.Message.edit_reply_markup`. - - .. versionchanged:: 20.8 - Raises :exc:`TypeError` if :attr:`message` is not accessible. - - Returns: - :class:`telegram.Message`: On success, if edited message is sent by the bot, the - edited Message is returned, otherwise :obj:`True` is returned. - - Raises: - :exc:`TypeError` if :attr:`message` is not accessible. - - """ - if self.inline_message_id: - return await self.get_bot().edit_message_reply_markup( - reply_markup=reply_markup, - inline_message_id=self.inline_message_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - chat_id=None, - message_id=None, - # inline messages can not be sent on behalf of a bcid - business_connection_id=None, - ) - return await self._get_message().edit_reply_markup( - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def edit_message_media( - self, - media: "InputMedia", - reply_markup: Optional["InlineKeyboardMarkup"] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Union[Message, bool]: - """Shortcut for either:: - - await update.callback_query.message.edit_media(*args, **kwargs) - - or:: - - await bot.edit_message_media( - inline_message_id=update.callback_query.inline_message_id, *args, **kwargs - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.edit_message_media` and :meth:`telegram.Message.edit_media`. - - .. versionchanged:: 20.8 - Raises :exc:`TypeError` if :attr:`message` is not accessible. - - Returns: - :class:`telegram.Message`: On success, if edited message is not an inline message, the - edited Message is returned, otherwise :obj:`True` is returned. - - Raises: - :exc:`TypeError` if :attr:`message` is not accessible. - - """ - if self.inline_message_id: - return await self.get_bot().edit_message_media( - inline_message_id=self.inline_message_id, - media=media, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - chat_id=None, - message_id=None, - # inline messages can not be sent on behalf of a bcid - business_connection_id=None, - ) - return await self._get_message().edit_media( - media=media, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def edit_message_live_location( - self, - latitude: Optional[float] = None, - longitude: Optional[float] = None, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - horizontal_accuracy: Optional[float] = None, - heading: Optional[int] = None, - proximity_alert_radius: Optional[int] = None, - live_period: Optional[TimePeriod] = None, - *, - location: Optional[Location] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Union[Message, bool]: - """Shortcut for either:: - - await update.callback_query.message.edit_live_location(*args, **kwargs) - - or:: - - await bot.edit_message_live_location( - inline_message_id=update.callback_query.inline_message_id, *args, **kwargs - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.edit_message_live_location` and - :meth:`telegram.Message.edit_live_location`. - - .. versionchanged:: 20.8 - Raises :exc:`TypeError` if :attr:`message` is not accessible. - - Returns: - :class:`telegram.Message`: On success, if edited message is sent by the bot, the - edited Message is returned, otherwise :obj:`True` is returned. - - Raises: - :exc:`TypeError` if :attr:`message` is not accessible. - - """ - if self.inline_message_id: - return await self.get_bot().edit_message_live_location( - inline_message_id=self.inline_message_id, - latitude=latitude, - longitude=longitude, - location=location, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - horizontal_accuracy=horizontal_accuracy, - heading=heading, - proximity_alert_radius=proximity_alert_radius, - live_period=live_period, - chat_id=None, - message_id=None, - # inline messages can not be sent on behalf of a bcid - business_connection_id=None, - ) - return await self._get_message().edit_live_location( - latitude=latitude, - longitude=longitude, - location=location, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - horizontal_accuracy=horizontal_accuracy, - heading=heading, - proximity_alert_radius=proximity_alert_radius, - live_period=live_period, - ) - - async def stop_message_live_location( - self, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Union[Message, bool]: - """Shortcut for either:: - - await update.callback_query.message.stop_live_location(*args, **kwargs) - - or:: - - await bot.stop_message_live_location( - inline_message_id=update.callback_query.inline_message_id, *args, **kwargs - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.stop_message_live_location` and - :meth:`telegram.Message.stop_live_location`. - - .. versionchanged:: 20.8 - Raises :exc:`TypeError` if :attr:`message` is not accessible. - - Returns: - :class:`telegram.Message`: On success, if edited message is sent by the bot, the - edited Message is returned, otherwise :obj:`True` is returned. - - Raises: - :exc:`TypeError` if :attr:`message` is not accessible. - - """ - if self.inline_message_id: - return await self.get_bot().stop_message_live_location( - inline_message_id=self.inline_message_id, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - chat_id=None, - message_id=None, - # inline messages can not be sent on behalf of a bcid - business_connection_id=None, - ) - return await self._get_message().stop_live_location( - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def set_game_score( - self, - user_id: int, - score: int, - force: Optional[bool] = None, - disable_edit_message: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Union[Message, bool]: - """Shortcut for either:: - - await update.callback_query.message.set_game_score(*args, **kwargs) - - or:: - - await bot.set_game_score( - inline_message_id=update.callback_query.inline_message_id, *args, **kwargs - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.set_game_score` and :meth:`telegram.Message.set_game_score`. - - .. versionchanged:: 20.8 - Raises :exc:`TypeError` if :attr:`message` is not accessible. - - Returns: - :class:`telegram.Message`: On success, if edited message is sent by the bot, the - edited Message is returned, otherwise :obj:`True` is returned. - - Raises: - :exc:`TypeError` if :attr:`message` is not accessible. - - """ - if self.inline_message_id: - return await self.get_bot().set_game_score( - inline_message_id=self.inline_message_id, - user_id=user_id, - score=score, - force=force, - disable_edit_message=disable_edit_message, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - chat_id=None, - message_id=None, - ) - return await self._get_message().set_game_score( - user_id=user_id, - score=score, - force=force, - disable_edit_message=disable_edit_message, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def get_game_high_scores( - self, - user_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> tuple["GameHighScore", ...]: - """Shortcut for either:: - - await update.callback_query.message.get_game_high_score(*args, **kwargs) - - or:: - - await bot.get_game_high_scores( - inline_message_id=update.callback_query.inline_message_id, *args, **kwargs - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.get_game_high_scores` and - :meth:`telegram.Message.get_game_high_scores`. - - .. versionchanged:: 20.8 - Raises :exc:`TypeError` if :attr:`message` is not accessible. - - Returns: - tuple[:class:`telegram.GameHighScore`] - - Raises: - :exc:`TypeError` if :attr:`message` is not accessible. - - """ - if self.inline_message_id: - return await self.get_bot().get_game_high_scores( - inline_message_id=self.inline_message_id, - user_id=user_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - chat_id=None, - message_id=None, - ) - return await self._get_message().get_game_high_scores( - user_id=user_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def delete_message( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await update.callback_query.message.delete(*args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Message.delete`. - - .. versionchanged:: 20.8 - Raises :exc:`TypeError` if :attr:`message` is not accessible. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :exc:`TypeError` if :attr:`message` is not accessible. - - """ - return await self._get_message(action="delete").delete( - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def pin_message( - self, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await update.callback_query.message.pin(*args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Message.pin`. - - .. versionchanged:: 20.8 - Raises :exc:`TypeError` if :attr:`message` is not accessible. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :exc:`TypeError` if :attr:`message` is not accessible. - """ - return await self._get_message(action="pin").pin( - disable_notification=disable_notification, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def unpin_message( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await update.callback_query.message.unpin(*args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Message.unpin`. - - .. versionchanged:: 20.8 - Raises :exc:`TypeError` if :attr:`message` is not accessible. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - Raises: - :exc:`TypeError` if :attr:`message` is not accessible. - """ - return await self._get_message(action="unpin").unpin( - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def copy_message( - self, - chat_id: Union[int, str], - caption: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - show_caption_above_media: Optional[bool] = None, - allow_paid_broadcast: Optional[bool] = None, - video_start_timestamp: Optional[int] = None, - *, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - reply_to_message_id: Optional[int] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "MessageId": - """Shortcut for:: - - await update.callback_query.message.copy( - from_chat_id=update.message.chat_id, - message_id=update.message.message_id, - *args, - **kwargs - ) - - For the documentation of the arguments, please see :meth:`telegram.Message.copy`. - - .. versionchanged:: 20.8 - Raises :exc:`TypeError` if :attr:`message` is not accessible. - - Returns: - :class:`telegram.MessageId`: On success, returns the MessageId of the sent message. - - Raises: - :exc:`TypeError` if :attr:`message` is not accessible. - """ - return await self._get_message(action="copy").copy( - chat_id=chat_id, - caption=caption, - parse_mode=parse_mode, - video_start_timestamp=video_start_timestamp, - caption_entities=caption_entities, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - allow_sending_without_reply=allow_sending_without_reply, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - protect_content=protect_content, - message_thread_id=message_thread_id, - reply_parameters=reply_parameters, - show_caption_above_media=show_caption_above_media, - allow_paid_broadcast=allow_paid_broadcast, - ) - - MAX_ANSWER_TEXT_LENGTH: Final[int] = ( - constants.CallbackQueryLimit.ANSWER_CALLBACK_QUERY_TEXT_LENGTH - ) - """ - :const:`telegram.constants.CallbackQueryLimit.ANSWER_CALLBACK_QUERY_TEXT_LENGTH` - - .. versionadded:: 13.2 - """ diff --git a/venv/lib/python3.12/site-packages/telegram/_chat.py b/venv/lib/python3.12/site-packages/telegram/_chat.py deleted file mode 100644 index 02eb662..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_chat.py +++ /dev/null @@ -1,3695 +0,0 @@ -#!/usr/bin/env python -# pylint: disable=redefined-builtin -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram Chat.""" -import datetime as dtm -from collections.abc import Sequence -from html import escape -from typing import TYPE_CHECKING, Final, Optional, Union - -from telegram import constants -from telegram._chatpermissions import ChatPermissions -from telegram._forumtopic import ForumTopic -from telegram._menubutton import MenuButton -from telegram._reaction import ReactionType -from telegram._telegramobject import TelegramObject -from telegram._utils import enum -from telegram._utils.defaultvalue import DEFAULT_NONE -from telegram._utils.types import ( - CorrectOptionID, - FileInput, - JSONDict, - ODVInput, - ReplyMarkup, - TimePeriod, -) -from telegram.helpers import escape_markdown -from telegram.helpers import mention_html as helpers_mention_html -from telegram.helpers import mention_markdown as helpers_mention_markdown - -if TYPE_CHECKING: - from telegram import ( - Animation, - Audio, - ChatInviteLink, - ChatMember, - Contact, - Document, - Gift, - InlineKeyboardMarkup, - InputMediaAudio, - InputMediaDocument, - InputMediaPhoto, - InputMediaVideo, - InputPaidMedia, - InputPollOption, - LabeledPrice, - LinkPreviewOptions, - Location, - Message, - MessageEntity, - MessageId, - PhotoSize, - ReplyParameters, - Sticker, - UserChatBoosts, - Venue, - Video, - VideoNote, - Voice, - ) - - -class _ChatBase(TelegramObject): - """Base class for :class:`telegram.Chat` and :class:`telegram.ChatFullInfo`. - - .. versionadded:: 21.3 - """ - - __slots__ = ("first_name", "id", "is_forum", "last_name", "title", "type", "username") - - def __init__( - self, - id: int, - type: str, - title: Optional[str] = None, - username: Optional[str] = None, - first_name: Optional[str] = None, - last_name: Optional[str] = None, - is_forum: Optional[bool] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - # Required - self.id: int = id - self.type: str = enum.get_member(constants.ChatType, type, type) - # Optionals - self.title: Optional[str] = title - self.username: Optional[str] = username - self.first_name: Optional[str] = first_name - self.last_name: Optional[str] = last_name - self.is_forum: Optional[bool] = is_forum - - self._id_attrs = (self.id,) - - self._freeze() - - SENDER: Final[str] = constants.ChatType.SENDER - """:const:`telegram.constants.ChatType.SENDER` - - .. versionadded:: 13.5 - """ - PRIVATE: Final[str] = constants.ChatType.PRIVATE - """:const:`telegram.constants.ChatType.PRIVATE`""" - GROUP: Final[str] = constants.ChatType.GROUP - """:const:`telegram.constants.ChatType.GROUP`""" - SUPERGROUP: Final[str] = constants.ChatType.SUPERGROUP - """:const:`telegram.constants.ChatType.SUPERGROUP`""" - CHANNEL: Final[str] = constants.ChatType.CHANNEL - """:const:`telegram.constants.ChatType.CHANNEL`""" - - @property - def effective_name(self) -> Optional[str]: - """ - :obj:`str`: Convenience property. Gives :attr:`~Chat.title` if not :obj:`None`, - else :attr:`~Chat.full_name` if not :obj:`None`. - - .. versionadded:: 20.1 - """ - if self.title is not None: - return self.title - if self.full_name is not None: - return self.full_name - return None - - @property - def full_name(self) -> Optional[str]: - """ - :obj:`str`: Convenience property. If :attr:`~Chat.first_name` is not :obj:`None`, gives - :attr:`~Chat.first_name` followed by (if available) :attr:`~Chat.last_name`. - - Note: - :attr:`full_name` will always be :obj:`None`, if the chat is a (super)group or - channel. - - .. versionadded:: 13.2 - """ - if not self.first_name: - return None - if self.last_name: - return f"{self.first_name} {self.last_name}" - return self.first_name - - @property - def link(self) -> Optional[str]: - """:obj:`str`: Convenience property. If the chat has a :attr:`~Chat.username`, returns a - t.me link of the chat. - """ - if self.username: - return f"https://t.me/{self.username}" - return None - - def mention_markdown(self, name: Optional[str] = None) -> str: - """ - Note: - :tg-const:`telegram.constants.ParseMode.MARKDOWN` is a legacy mode, retained by - Telegram for backward compatibility. You should use :meth:`mention_markdown_v2` - instead. - - .. versionadded:: 20.0 - - Args: - name (:obj:`str`): The name used as a link for the chat. Defaults to - :attr:`~Chat.full_name`. - - Returns: - :obj:`str`: The inline mention for the chat as markdown (version 1). - - Raises: - :exc:`TypeError`: If the chat is a private chat and neither the :paramref:`name` - nor the :attr:`~Chat.first_name` is set, then throw an :exc:`TypeError`. - If the chat is a public chat and neither the :paramref:`name` nor the - :attr:`~Chat.title` is set, then throw an :exc:`TypeError`. If chat is a - private group chat, then throw an :exc:`TypeError`. - - """ - if self.type == self.PRIVATE: - if name: - return helpers_mention_markdown(self.id, name) - if self.full_name: - return helpers_mention_markdown(self.id, self.full_name) - raise TypeError("Can not create a mention to a private chat without first name") - if self.username: - if name: - return f"[{name}]({self.link})" - if self.title: - return f"[{self.title}]({self.link})" - raise TypeError("Can not create a mention to a public chat without title") - raise TypeError("Can not create a mention to a private group chat") - - def mention_markdown_v2(self, name: Optional[str] = None) -> str: - """ - .. versionadded:: 20.0 - - Args: - name (:obj:`str`): The name used as a link for the chat. Defaults to - :attr:`~Chat.full_name`. - - Returns: - :obj:`str`: The inline mention for the chat as markdown (version 2). - - Raises: - :exc:`TypeError`: If the chat is a private chat and neither the :paramref:`name` - nor the :attr:`~Chat.first_name` is set, then throw an :exc:`TypeError`. - If the chat is a public chat and neither the :paramref:`name` nor the - :attr:`~Chat.title` is set, then throw an :exc:`TypeError`. If chat is a - private group chat, then throw an :exc:`TypeError`. - - """ - if self.type == self.PRIVATE: - if name: - return helpers_mention_markdown(self.id, name, version=2) - if self.full_name: - return helpers_mention_markdown(self.id, self.full_name, version=2) - raise TypeError("Can not create a mention to a private chat without first name") - if self.username: - if name: - return f"[{escape_markdown(name, version=2)}]({self.link})" - if self.title: - return f"[{escape_markdown(self.title, version=2)}]({self.link})" - raise TypeError("Can not create a mention to a public chat without title") - raise TypeError("Can not create a mention to a private group chat") - - def mention_html(self, name: Optional[str] = None) -> str: - """ - .. versionadded:: 20.0 - - Args: - name (:obj:`str`): The name used as a link for the chat. Defaults to :attr:`full_name`. - - Returns: - :obj:`str`: The inline mention for the chat as HTML. - - Raises: - :exc:`TypeError`: If the chat is a private chat and neither the :paramref:`name` - nor the :attr:`~Chat.first_name` is set, then throw an :exc:`TypeError`. - If the chat is a public chat and neither the :paramref:`name` nor the - :attr:`~Chat.title` is set, then throw an :exc:`TypeError`. - If chat is a private group chat, then throw an :exc:`TypeError`. - - """ - if self.type == self.PRIVATE: - if name: - return helpers_mention_html(self.id, name) - if self.full_name: - return helpers_mention_html(self.id, self.full_name) - raise TypeError("Can not create a mention to a private chat without first name") - if self.username: - if name: - return f'<a href="{self.link}">{escape(name)}</a>' - if self.title: - return f'<a href="{self.link}">{escape(self.title)}</a>' - raise TypeError("Can not create a mention to a public chat without title") - raise TypeError("Can not create a mention to a private group chat") - - async def leave( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.leave_chat(update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.leave_chat`. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().leave_chat( - chat_id=self.id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def get_administrators( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> tuple["ChatMember", ...]: - """Shortcut for:: - - await bot.get_chat_administrators(update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.get_chat_administrators`. - - Returns: - tuple[:class:`telegram.ChatMember`]: A tuple of administrators in a chat. An Array of - :class:`telegram.ChatMember` objects that contains information about all - chat administrators except other bots. If the chat is a group or a supergroup - and no administrators were appointed, only the creator will be returned. - - """ - return await self.get_bot().get_chat_administrators( - chat_id=self.id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def get_member_count( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> int: - """Shortcut for:: - - await bot.get_chat_member_count(update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.get_chat_member_count`. - - Returns: - :obj:`int` - """ - return await self.get_bot().get_chat_member_count( - chat_id=self.id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def get_member( - self, - user_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "ChatMember": - """Shortcut for:: - - await bot.get_chat_member(update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.get_chat_member`. - - Returns: - :class:`telegram.ChatMember` - - """ - return await self.get_bot().get_chat_member( - chat_id=self.id, - user_id=user_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def ban_member( - self, - user_id: int, - revoke_messages: Optional[bool] = None, - until_date: Optional[Union[int, dtm.datetime]] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.ban_chat_member(update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.ban_chat_member`. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - """ - return await self.get_bot().ban_chat_member( - chat_id=self.id, - user_id=user_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - until_date=until_date, - api_kwargs=api_kwargs, - revoke_messages=revoke_messages, - ) - - async def ban_sender_chat( - self, - sender_chat_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.ban_chat_sender_chat(chat_id=update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.ban_chat_sender_chat`. - - .. versionadded:: 13.9 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().ban_chat_sender_chat( - chat_id=self.id, - sender_chat_id=sender_chat_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def ban_chat( - self, - chat_id: Union[str, int], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.ban_chat_sender_chat( - sender_chat_id=update.effective_chat.id, *args, **kwargs - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.ban_chat_sender_chat`. - - .. versionadded:: 13.9 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().ban_chat_sender_chat( - chat_id=chat_id, - sender_chat_id=self.id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def unban_sender_chat( - self, - sender_chat_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.unban_chat_sender_chat(chat_id=update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.unban_chat_sender_chat`. - - .. versionadded:: 13.9 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().unban_chat_sender_chat( - chat_id=self.id, - sender_chat_id=sender_chat_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def unban_chat( - self, - chat_id: Union[str, int], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.unban_chat_sender_chat( - sender_chat_id=update.effective_chat.id, *args, **kwargs - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.unban_chat_sender_chat`. - - .. versionadded:: 13.9 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().unban_chat_sender_chat( - chat_id=chat_id, - sender_chat_id=self.id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def unban_member( - self, - user_id: int, - only_if_banned: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.unban_chat_member(update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.unban_chat_member`. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().unban_chat_member( - chat_id=self.id, - user_id=user_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - only_if_banned=only_if_banned, - ) - - async def promote_member( - self, - user_id: int, - can_change_info: Optional[bool] = None, - can_post_messages: Optional[bool] = None, - can_edit_messages: Optional[bool] = None, - can_delete_messages: Optional[bool] = None, - can_invite_users: Optional[bool] = None, - can_restrict_members: Optional[bool] = None, - can_pin_messages: Optional[bool] = None, - can_promote_members: Optional[bool] = None, - is_anonymous: Optional[bool] = None, - can_manage_chat: Optional[bool] = None, - can_manage_video_chats: Optional[bool] = None, - can_manage_topics: Optional[bool] = None, - can_post_stories: Optional[bool] = None, - can_edit_stories: Optional[bool] = None, - can_delete_stories: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.promote_chat_member(update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.promote_chat_member`. - - .. versionadded:: 13.2 - .. versionchanged:: 20.0 - The argument ``can_manage_voice_chats`` was renamed to - :paramref:`~telegram.Bot.promote_chat_member.can_manage_video_chats` in accordance to - Bot API 6.0. - .. versionchanged:: 20.6 - The arguments `can_post_stories`, `can_edit_stories` and `can_delete_stories` were - added. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().promote_chat_member( - chat_id=self.id, - user_id=user_id, - can_change_info=can_change_info, - can_post_messages=can_post_messages, - can_edit_messages=can_edit_messages, - can_delete_messages=can_delete_messages, - can_invite_users=can_invite_users, - can_restrict_members=can_restrict_members, - can_pin_messages=can_pin_messages, - can_promote_members=can_promote_members, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - is_anonymous=is_anonymous, - can_manage_chat=can_manage_chat, - can_manage_video_chats=can_manage_video_chats, - can_manage_topics=can_manage_topics, - can_post_stories=can_post_stories, - can_edit_stories=can_edit_stories, - can_delete_stories=can_delete_stories, - ) - - async def restrict_member( - self, - user_id: int, - permissions: ChatPermissions, - until_date: Optional[Union[int, dtm.datetime]] = None, - use_independent_chat_permissions: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.restrict_chat_member(update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.restrict_chat_member`. - - .. versionadded:: 13.2 - - .. versionadded:: 20.1 - Added :paramref:`~telegram.Bot.restrict_chat_member.use_independent_chat_permissions`. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().restrict_chat_member( - chat_id=self.id, - user_id=user_id, - permissions=permissions, - until_date=until_date, - use_independent_chat_permissions=use_independent_chat_permissions, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def set_permissions( - self, - permissions: ChatPermissions, - use_independent_chat_permissions: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.set_chat_permissions(update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.set_chat_permissions`. - - .. versionadded:: 20.1 - Added :paramref:`~telegram.Bot.set_chat_permissions.use_independent_chat_permissions`. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().set_chat_permissions( - chat_id=self.id, - permissions=permissions, - use_independent_chat_permissions=use_independent_chat_permissions, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def set_administrator_custom_title( - self, - user_id: int, - custom_title: str, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.set_chat_administrator_custom_title( - update.effective_chat.id, *args, **kwargs - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.set_chat_administrator_custom_title`. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().set_chat_administrator_custom_title( - chat_id=self.id, - user_id=user_id, - custom_title=custom_title, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def set_photo( - self, - photo: FileInput, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.set_chat_photo( - chat_id=update.effective_chat.id, *args, **kwargs - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.set_chat_photo`. - - .. versionadded:: 20.0 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().set_chat_photo( - chat_id=self.id, - photo=photo, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def delete_photo( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.delete_chat_photo( - chat_id=update.effective_chat.id, *args, **kwargs - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.delete_chat_photo`. - - .. versionadded:: 20.0 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().delete_chat_photo( - chat_id=self.id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def set_title( - self, - title: str, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.set_chat_title( - chat_id=update.effective_chat.id, *args, **kwargs - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.set_chat_title`. - - .. versionadded:: 20.0 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().set_chat_title( - chat_id=self.id, - title=title, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def set_description( - self, - description: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.set_chat_description( - chat_id=update.effective_chat.id, *args, **kwargs - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.set_chat_description`. - - .. versionadded:: 20.0 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().set_chat_description( - chat_id=self.id, - description=description, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def pin_message( - self, - message_id: int, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - business_connection_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.pin_chat_message(chat_id=update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.pin_chat_message`. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().pin_chat_message( - chat_id=self.id, - message_id=message_id, - disable_notification=disable_notification, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - business_connection_id=business_connection_id, - ) - - async def unpin_message( - self, - message_id: Optional[int] = None, - business_connection_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.unpin_chat_message(chat_id=update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.unpin_chat_message`. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().unpin_chat_message( - chat_id=self.id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - message_id=message_id, - business_connection_id=business_connection_id, - ) - - async def unpin_all_messages( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.unpin_all_chat_messages(chat_id=update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.unpin_all_chat_messages`. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().unpin_all_chat_messages( - chat_id=self.id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def send_message( - self, - text: str, - parse_mode: ODVInput[str] = DEFAULT_NONE, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - link_preview_options: ODVInput["LinkPreviewOptions"] = DEFAULT_NONE, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - disable_web_page_preview: Optional[bool] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_message(update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_message`. - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().send_message( - chat_id=self.id, - text=text, - parse_mode=parse_mode, - disable_web_page_preview=disable_web_page_preview, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - link_preview_options=link_preview_options, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - entities=entities, - protect_content=protect_content, - message_thread_id=message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def delete_message( - self, - message_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.delete_message(update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.delete_message`. - - .. versionadded:: 20.8 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().delete_message( - chat_id=self.id, - message_id=message_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def delete_messages( - self, - message_ids: Sequence[int], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.delete_messages(update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.delete_messages`. - - .. versionadded:: 20.8 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().delete_messages( - chat_id=self.id, - message_ids=message_ids, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def send_media_group( - self, - media: Sequence[ - Union["InputMediaAudio", "InputMediaDocument", "InputMediaPhoto", "InputMediaVideo"] - ], - disable_notification: ODVInput[bool] = DEFAULT_NONE, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - caption: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - ) -> tuple["Message", ...]: - """Shortcut for:: - - await bot.send_media_group(update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_media_group`. - - Returns: - tuple[:class:`telegram.Message`]: On success, a tuple of :class:`~telegram.Message` - instances that were sent is returned. - - """ - return await self.get_bot().send_media_group( - chat_id=self.id, - media=media, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - reply_parameters=reply_parameters, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_chat_action( - self, - action: str, - message_thread_id: Optional[int] = None, - business_connection_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.send_chat_action(update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_chat_action`. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().send_chat_action( - chat_id=self.id, - action=action, - message_thread_id=message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - business_connection_id=business_connection_id, - ) - - send_action = send_chat_action - """Alias for :attr:`send_chat_action`""" - - async def send_photo( - self, - photo: Union[FileInput, "PhotoSize"], - caption: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - has_spoiler: Optional[bool] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - show_caption_above_media: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - filename: Optional[str] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_photo(update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_photo`. - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().send_photo( - chat_id=self.id, - photo=photo, - caption=caption, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - parse_mode=parse_mode, - allow_sending_without_reply=allow_sending_without_reply, - caption_entities=caption_entities, - filename=filename, - protect_content=protect_content, - message_thread_id=message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - has_spoiler=has_spoiler, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - show_caption_above_media=show_caption_above_media, - ) - - async def send_contact( - self, - phone_number: Optional[str] = None, - first_name: Optional[str] = None, - last_name: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - vcard: Optional[str] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - contact: Optional["Contact"] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_contact(update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_contact`. - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().send_contact( - chat_id=self.id, - phone_number=phone_number, - first_name=first_name, - last_name=last_name, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - contact=contact, - vcard=vcard, - api_kwargs=api_kwargs, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_audio( - self, - audio: Union[FileInput, "Audio"], - duration: Optional[TimePeriod] = None, - performer: Optional[str] = None, - title: Optional[str] = None, - caption: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - thumbnail: Optional[FileInput] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - filename: Optional[str] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_audio(update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_audio`. - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().send_audio( - chat_id=self.id, - audio=audio, - duration=duration, - performer=performer, - title=title, - caption=caption, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - parse_mode=parse_mode, - allow_sending_without_reply=allow_sending_without_reply, - caption_entities=caption_entities, - filename=filename, - protect_content=protect_content, - message_thread_id=message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - thumbnail=thumbnail, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_document( - self, - document: Union[FileInput, "Document"], - caption: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - disable_content_type_detection: Optional[bool] = None, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - thumbnail: Optional[FileInput] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - filename: Optional[str] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_document(update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_document`. - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().send_document( - chat_id=self.id, - document=document, - filename=filename, - caption=caption, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - parse_mode=parse_mode, - thumbnail=thumbnail, - api_kwargs=api_kwargs, - disable_content_type_detection=disable_content_type_detection, - allow_sending_without_reply=allow_sending_without_reply, - caption_entities=caption_entities, - protect_content=protect_content, - message_thread_id=message_thread_id, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_dice( - self, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - emoji: Optional[str] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_dice(update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_dice`. - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().send_dice( - chat_id=self.id, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - emoji=emoji, - api_kwargs=api_kwargs, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_game( - self, - game_short_name: str, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_game(update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_game`. - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().send_game( - chat_id=self.id, - game_short_name=game_short_name, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_invoice( - self, - title: str, - description: str, - payload: str, - currency: str, - prices: Sequence["LabeledPrice"], - provider_token: Optional[str] = None, - start_parameter: Optional[str] = None, - photo_url: Optional[str] = None, - photo_size: Optional[int] = None, - photo_width: Optional[int] = None, - photo_height: Optional[int] = None, - need_name: Optional[bool] = None, - need_phone_number: Optional[bool] = None, - need_email: Optional[bool] = None, - need_shipping_address: Optional[bool] = None, - is_flexible: Optional[bool] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - provider_data: Optional[Union[str, object]] = None, - send_phone_number_to_provider: Optional[bool] = None, - send_email_to_provider: Optional[bool] = None, - max_tip_amount: Optional[int] = None, - suggested_tip_amounts: Optional[Sequence[int]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_invoice(update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_invoice`. - - Warning: - As of API 5.2 :paramref:`start_parameter <telegram.Bot.send_invoice.start_parameter>` - is an optional argument and therefore the - order of the arguments had to be changed. Use keyword arguments to make sure that the - arguments are passed correctly. - - .. versionchanged:: 13.5 - As of Bot API 5.2, the parameter - :paramref:`start_parameter <telegram.Bot.send_invoice.start_parameter>` is optional. - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().send_invoice( - chat_id=self.id, - title=title, - description=description, - payload=payload, - provider_token=provider_token, - currency=currency, - prices=prices, - start_parameter=start_parameter, - photo_url=photo_url, - photo_size=photo_size, - photo_width=photo_width, - photo_height=photo_height, - need_name=need_name, - need_phone_number=need_phone_number, - need_email=need_email, - need_shipping_address=need_shipping_address, - is_flexible=is_flexible, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_markup=reply_markup, - provider_data=provider_data, - send_phone_number_to_provider=send_phone_number_to_provider, - send_email_to_provider=send_email_to_provider, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - allow_sending_without_reply=allow_sending_without_reply, - max_tip_amount=max_tip_amount, - suggested_tip_amounts=suggested_tip_amounts, - protect_content=protect_content, - message_thread_id=message_thread_id, - reply_parameters=reply_parameters, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_location( - self, - latitude: Optional[float] = None, - longitude: Optional[float] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - live_period: Optional[TimePeriod] = None, - horizontal_accuracy: Optional[float] = None, - heading: Optional[int] = None, - proximity_alert_radius: Optional[int] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - location: Optional["Location"] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_location(update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_location`. - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().send_location( - chat_id=self.id, - latitude=latitude, - longitude=longitude, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - location=location, - live_period=live_period, - api_kwargs=api_kwargs, - horizontal_accuracy=horizontal_accuracy, - heading=heading, - proximity_alert_radius=proximity_alert_radius, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_animation( - self, - animation: Union[FileInput, "Animation"], - duration: Optional[TimePeriod] = None, - width: Optional[int] = None, - height: Optional[int] = None, - caption: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - has_spoiler: Optional[bool] = None, - thumbnail: Optional[FileInput] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - show_caption_above_media: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - filename: Optional[str] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_animation(update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_animation`. - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().send_animation( - chat_id=self.id, - animation=animation, - duration=duration, - width=width, - height=height, - caption=caption, - parse_mode=parse_mode, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - allow_sending_without_reply=allow_sending_without_reply, - caption_entities=caption_entities, - filename=filename, - protect_content=protect_content, - message_thread_id=message_thread_id, - has_spoiler=has_spoiler, - thumbnail=thumbnail, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - show_caption_above_media=show_caption_above_media, - ) - - async def send_sticker( - self, - sticker: Union[FileInput, "Sticker"], - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - emoji: Optional[str] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_sticker(update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_sticker`. - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().send_sticker( - chat_id=self.id, - sticker=sticker, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - emoji=emoji, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_venue( - self, - latitude: Optional[float] = None, - longitude: Optional[float] = None, - title: Optional[str] = None, - address: Optional[str] = None, - foursquare_id: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - foursquare_type: Optional[str] = None, - google_place_id: Optional[str] = None, - google_place_type: Optional[str] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - venue: Optional["Venue"] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_venue(update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_venue`. - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().send_venue( - chat_id=self.id, - latitude=latitude, - longitude=longitude, - title=title, - address=address, - foursquare_id=foursquare_id, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - venue=venue, - foursquare_type=foursquare_type, - api_kwargs=api_kwargs, - google_place_id=google_place_id, - google_place_type=google_place_type, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_video( - self, - video: Union[FileInput, "Video"], - duration: Optional[TimePeriod] = None, - caption: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - width: Optional[int] = None, - height: Optional[int] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - supports_streaming: Optional[bool] = None, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - has_spoiler: Optional[bool] = None, - thumbnail: Optional[FileInput] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - show_caption_above_media: Optional[bool] = None, - cover: Optional[FileInput] = None, - start_timestamp: Optional[int] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - filename: Optional[str] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_video(update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_video`. - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().send_video( - chat_id=self.id, - video=video, - duration=duration, - caption=caption, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - width=width, - height=height, - parse_mode=parse_mode, - supports_streaming=supports_streaming, - thumbnail=thumbnail, - cover=cover, - start_timestamp=start_timestamp, - api_kwargs=api_kwargs, - allow_sending_without_reply=allow_sending_without_reply, - caption_entities=caption_entities, - filename=filename, - protect_content=protect_content, - message_thread_id=message_thread_id, - has_spoiler=has_spoiler, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - show_caption_above_media=show_caption_above_media, - ) - - async def send_video_note( - self, - video_note: Union[FileInput, "VideoNote"], - duration: Optional[TimePeriod] = None, - length: Optional[int] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - thumbnail: Optional[FileInput] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - filename: Optional[str] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_video_note(update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_video_note`. - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().send_video_note( - chat_id=self.id, - video_note=video_note, - duration=duration, - length=length, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - thumbnail=thumbnail, - api_kwargs=api_kwargs, - allow_sending_without_reply=allow_sending_without_reply, - filename=filename, - protect_content=protect_content, - message_thread_id=message_thread_id, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_voice( - self, - voice: Union[FileInput, "Voice"], - duration: Optional[TimePeriod] = None, - caption: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - filename: Optional[str] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_voice(update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_voice`. - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().send_voice( - chat_id=self.id, - voice=voice, - duration=duration, - caption=caption, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - parse_mode=parse_mode, - api_kwargs=api_kwargs, - allow_sending_without_reply=allow_sending_without_reply, - caption_entities=caption_entities, - filename=filename, - protect_content=protect_content, - message_thread_id=message_thread_id, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_poll( - self, - question: str, - options: Sequence[Union[str, "InputPollOption"]], - is_anonymous: Optional[bool] = None, - type: Optional[str] = None, - allows_multiple_answers: Optional[bool] = None, - correct_option_id: Optional[CorrectOptionID] = None, - is_closed: Optional[bool] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - explanation: Optional[str] = None, - explanation_parse_mode: ODVInput[str] = DEFAULT_NONE, - open_period: Optional[TimePeriod] = None, - close_date: Optional[Union[int, dtm.datetime]] = None, - explanation_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - question_parse_mode: ODVInput[str] = DEFAULT_NONE, - question_entities: Optional[Sequence["MessageEntity"]] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_poll(update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_poll`. - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().send_poll( - chat_id=self.id, - question=question, - options=options, - is_anonymous=is_anonymous, - type=type, # pylint=pylint, - allows_multiple_answers=allows_multiple_answers, - correct_option_id=correct_option_id, - is_closed=is_closed, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - explanation=explanation, - explanation_parse_mode=explanation_parse_mode, - open_period=open_period, - close_date=close_date, - api_kwargs=api_kwargs, - allow_sending_without_reply=allow_sending_without_reply, - explanation_entities=explanation_entities, - protect_content=protect_content, - message_thread_id=message_thread_id, - business_connection_id=business_connection_id, - question_parse_mode=question_parse_mode, - question_entities=question_entities, - ) - - async def send_copy( - self, - from_chat_id: Union[str, int], - message_id: int, - caption: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - show_caption_above_media: Optional[bool] = None, - allow_paid_broadcast: Optional[bool] = None, - video_start_timestamp: Optional[int] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "MessageId": - """Shortcut for:: - - await bot.copy_message(chat_id=update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.copy_message`. - - .. seealso:: :meth:`copy_message`, :meth:`send_copies`, :meth:`copy_messages`. - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().copy_message( - chat_id=self.id, - from_chat_id=from_chat_id, - message_id=message_id, - caption=caption, - video_start_timestamp=video_start_timestamp, - parse_mode=parse_mode, - caption_entities=caption_entities, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - allow_sending_without_reply=allow_sending_without_reply, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - protect_content=protect_content, - message_thread_id=message_thread_id, - show_caption_above_media=show_caption_above_media, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def copy_message( - self, - chat_id: Union[int, str], - message_id: int, - caption: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - show_caption_above_media: Optional[bool] = None, - allow_paid_broadcast: Optional[bool] = None, - video_start_timestamp: Optional[int] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "MessageId": - """Shortcut for:: - - await bot.copy_message(from_chat_id=update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.copy_message`. - - .. seealso:: :meth:`send_copy`, :meth:`send_copies`, :meth:`copy_messages`. - - Returns: - :class:`telegram.MessageId`: On success, returns the MessageId of the sent message. - - """ - return await self.get_bot().copy_message( - from_chat_id=self.id, - chat_id=chat_id, - message_id=message_id, - caption=caption, - video_start_timestamp=video_start_timestamp, - parse_mode=parse_mode, - caption_entities=caption_entities, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - allow_sending_without_reply=allow_sending_without_reply, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - protect_content=protect_content, - message_thread_id=message_thread_id, - show_caption_above_media=show_caption_above_media, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_copies( - self, - from_chat_id: Union[str, int], - message_ids: Sequence[int], - disable_notification: ODVInput[bool] = DEFAULT_NONE, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - remove_caption: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> tuple["MessageId", ...]: - """Shortcut for:: - - await bot.copy_messages(chat_id=update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.copy_messages`. - - .. seealso:: :meth:`copy_message`, :meth:`send_copy`, :meth:`copy_messages`. - - .. versionadded:: 20.8 - - Returns: - tuple[:class:`telegram.MessageId`]: On success, a tuple of :class:`~telegram.MessageId` - of the sent messages is returned. - - """ - return await self.get_bot().copy_messages( - chat_id=self.id, - from_chat_id=from_chat_id, - message_ids=message_ids, - disable_notification=disable_notification, - protect_content=protect_content, - message_thread_id=message_thread_id, - remove_caption=remove_caption, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def copy_messages( - self, - chat_id: Union[str, int], - message_ids: Sequence[int], - disable_notification: ODVInput[bool] = DEFAULT_NONE, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - remove_caption: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> tuple["MessageId", ...]: - """Shortcut for:: - - await bot.copy_messages(from_chat_id=update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.copy_messages`. - - .. seealso:: :meth:`copy_message`, :meth:`send_copy`, :meth:`send_copies`. - - .. versionadded:: 20.8 - - Returns: - tuple[:class:`telegram.MessageId`]: On success, a tuple of :class:`~telegram.MessageId` - of the sent messages is returned. - - """ - return await self.get_bot().copy_messages( - from_chat_id=self.id, - chat_id=chat_id, - message_ids=message_ids, - disable_notification=disable_notification, - protect_content=protect_content, - message_thread_id=message_thread_id, - remove_caption=remove_caption, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def forward_from( - self, - from_chat_id: Union[str, int], - message_id: int, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - video_start_timestamp: Optional[int] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.forward_message(chat_id=update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.forward_message`. - - .. seealso:: :meth:`forward_to`, :meth:`forward_messages_from`, :meth:`forward_messages_to` - - .. versionadded:: 20.0 - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().forward_message( - chat_id=self.id, - from_chat_id=from_chat_id, - message_id=message_id, - video_start_timestamp=video_start_timestamp, - disable_notification=disable_notification, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - protect_content=protect_content, - message_thread_id=message_thread_id, - ) - - async def forward_to( - self, - chat_id: Union[int, str], - message_id: int, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - video_start_timestamp: Optional[int] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.forward_message(from_chat_id=update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.forward_message`. - - .. seealso:: :meth:`forward_from`, :meth:`forward_messages_from`, - :meth:`forward_messages_to` - - .. versionadded:: 20.0 - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().forward_message( - from_chat_id=self.id, - chat_id=chat_id, - message_id=message_id, - video_start_timestamp=video_start_timestamp, - disable_notification=disable_notification, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - protect_content=protect_content, - message_thread_id=message_thread_id, - ) - - async def forward_messages_from( - self, - from_chat_id: Union[str, int], - message_ids: Sequence[int], - disable_notification: ODVInput[bool] = DEFAULT_NONE, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> tuple["MessageId", ...]: - """Shortcut for:: - - await bot.forward_messages(chat_id=update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.forward_messages`. - - .. seealso:: :meth:`forward_to`, :meth:`forward_from`, :meth:`forward_messages_to`. - - .. versionadded:: 20.8 - - Returns: - tuple[:class:`telegram.MessageId`]: On success, a tuple of :class:`~telegram.MessageId` - of sent messages is returned. - - """ - return await self.get_bot().forward_messages( - chat_id=self.id, - from_chat_id=from_chat_id, - message_ids=message_ids, - disable_notification=disable_notification, - protect_content=protect_content, - message_thread_id=message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def forward_messages_to( - self, - chat_id: Union[int, str], - message_ids: Sequence[int], - disable_notification: ODVInput[bool] = DEFAULT_NONE, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> tuple["MessageId", ...]: - """Shortcut for:: - - await bot.forward_messages(from_chat_id=update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.forward_messages`. - - .. seealso:: :meth:`forward_from`, :meth:`forward_to`, :meth:`forward_messages_from`. - - .. versionadded:: 20.8 - - Returns: - tuple[:class:`telegram.MessageId`]: On success, a tuple of :class:`~telegram.MessageId` - of sent messages is returned. - - """ - return await self.get_bot().forward_messages( - from_chat_id=self.id, - chat_id=chat_id, - message_ids=message_ids, - disable_notification=disable_notification, - protect_content=protect_content, - message_thread_id=message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def export_invite_link( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> str: - """Shortcut for:: - - await bot.export_chat_invite_link(chat_id=update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.export_chat_invite_link`. - - .. versionadded:: 13.4 - - Returns: - :obj:`str`: New invite link on success. - - """ - return await self.get_bot().export_chat_invite_link( - chat_id=self.id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def create_invite_link( - self, - expire_date: Optional[Union[int, dtm.datetime]] = None, - member_limit: Optional[int] = None, - name: Optional[str] = None, - creates_join_request: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "ChatInviteLink": - """Shortcut for:: - - await bot.create_chat_invite_link(chat_id=update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.create_chat_invite_link`. - - .. versionadded:: 13.4 - - .. versionchanged:: 13.8 - Edited signature according to the changes of - :meth:`telegram.Bot.create_chat_invite_link`. - - Returns: - :class:`telegram.ChatInviteLink` - - """ - return await self.get_bot().create_chat_invite_link( - chat_id=self.id, - expire_date=expire_date, - member_limit=member_limit, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - name=name, - creates_join_request=creates_join_request, - ) - - async def edit_invite_link( - self, - invite_link: Union[str, "ChatInviteLink"], - expire_date: Optional[Union[int, dtm.datetime]] = None, - member_limit: Optional[int] = None, - name: Optional[str] = None, - creates_join_request: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "ChatInviteLink": - """Shortcut for:: - - await bot.edit_chat_invite_link(chat_id=update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.edit_chat_invite_link`. - - .. versionadded:: 13.4 - - .. versionchanged:: 13.8 - Edited signature according to the changes of :meth:`telegram.Bot.edit_chat_invite_link`. - - Returns: - :class:`telegram.ChatInviteLink` - - """ - return await self.get_bot().edit_chat_invite_link( - chat_id=self.id, - invite_link=invite_link, - expire_date=expire_date, - member_limit=member_limit, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - name=name, - creates_join_request=creates_join_request, - ) - - async def revoke_invite_link( - self, - invite_link: Union[str, "ChatInviteLink"], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "ChatInviteLink": - """Shortcut for:: - - await bot.revoke_chat_invite_link(chat_id=update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.revoke_chat_invite_link`. - - .. versionadded:: 13.4 - - Returns: - :class:`telegram.ChatInviteLink` - - """ - return await self.get_bot().revoke_chat_invite_link( - chat_id=self.id, - invite_link=invite_link, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def create_subscription_invite_link( - self, - subscription_period: TimePeriod, - subscription_price: int, - name: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "ChatInviteLink": - """Shortcut for:: - - await bot.create_chat_subscription_invite_link( - chat_id=update.effective_chat.id, *args, **kwargs - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.create_chat_subscription_invite_link`. - - .. versionadded:: 21.5 - - Returns: - :class:`telegram.ChatInviteLink` - """ - return await self.get_bot().create_chat_subscription_invite_link( - chat_id=self.id, - subscription_period=subscription_period, - subscription_price=subscription_price, - name=name, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def edit_subscription_invite_link( - self, - invite_link: Union[str, "ChatInviteLink"], - name: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "ChatInviteLink": - """Shortcut for:: - - await bot.edit_chat_subscription_invite_link( - chat_id=update.effective_chat.id, *args, **kwargs - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.edit_chat_subscription_invite_link`. - - .. versionadded:: 21.5 - - Returns: - :class:`telegram.ChatInviteLink` - - """ - return await self.get_bot().edit_chat_subscription_invite_link( - chat_id=self.id, - invite_link=invite_link, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - name=name, - ) - - async def approve_join_request( - self, - user_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.approve_chat_join_request(chat_id=update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.approve_chat_join_request`. - - .. versionadded:: 13.8 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().approve_chat_join_request( - chat_id=self.id, - user_id=user_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def decline_join_request( - self, - user_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.decline_chat_join_request(chat_id=update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.decline_chat_join_request`. - - .. versionadded:: 13.8 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().decline_chat_join_request( - chat_id=self.id, - user_id=user_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def set_menu_button( - self, - menu_button: Optional[MenuButton] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.set_chat_menu_button(chat_id=update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.set_chat_menu_button`. - - Caution: - Can only work, if the chat is a private chat. - - .. seealso:: :meth:`get_menu_button` - - .. versionadded:: 20.0 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - """ - return await self.get_bot().set_chat_menu_button( - chat_id=self.id, - menu_button=menu_button, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def create_forum_topic( - self, - name: str, - icon_color: Optional[int] = None, - icon_custom_emoji_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> ForumTopic: - """Shortcut for:: - - await bot.create_forum_topic(chat_id=update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.create_forum_topic`. - - .. versionadded:: 20.0 - - Returns: - :class:`telegram.ForumTopic` - """ - return await self.get_bot().create_forum_topic( - chat_id=self.id, - name=name, - icon_color=icon_color, - icon_custom_emoji_id=icon_custom_emoji_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def edit_forum_topic( - self, - message_thread_id: int, - name: Optional[str] = None, - icon_custom_emoji_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.edit_forum_topic(chat_id=update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.edit_forum_topic`. - - .. versionadded:: 20.0 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - """ - return await self.get_bot().edit_forum_topic( - chat_id=self.id, - message_thread_id=message_thread_id, - name=name, - icon_custom_emoji_id=icon_custom_emoji_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def close_forum_topic( - self, - message_thread_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.close_forum_topic(chat_id=update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.close_forum_topic`. - - .. versionadded:: 20.0 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - """ - return await self.get_bot().close_forum_topic( - chat_id=self.id, - message_thread_id=message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def reopen_forum_topic( - self, - message_thread_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.reopen_forum_topic(chat_id=update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.reopen_forum_topic`. - - .. versionadded:: 20.0 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - """ - return await self.get_bot().reopen_forum_topic( - chat_id=self.id, - message_thread_id=message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def delete_forum_topic( - self, - message_thread_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.delete_forum_topic(chat_id=update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.delete_forum_topic`. - - .. versionadded:: 20.0 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - """ - return await self.get_bot().delete_forum_topic( - chat_id=self.id, - message_thread_id=message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def unpin_all_forum_topic_messages( - self, - message_thread_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.unpin_all_forum_topic_messages(chat_id=update.effective_chat.id, - *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.unpin_all_forum_topic_messages`. - - .. versionadded:: 20.0 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - """ - return await self.get_bot().unpin_all_forum_topic_messages( - chat_id=self.id, - message_thread_id=message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def unpin_all_general_forum_topic_messages( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.unpin_all_general_forum_topic_messages(chat_id=update.effective_chat.id, - *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.unpin_all_general_forum_topic_messages`. - - .. versionadded:: 20.5 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - """ - return await self.get_bot().unpin_all_general_forum_topic_messages( - chat_id=self.id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def edit_general_forum_topic( - self, - name: str, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.edit_general_forum_topic( - chat_id=update.effective_chat.id, *args, **kwargs - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.edit_general_forum_topic`. - - .. versionadded:: 20.0 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - """ - return await self.get_bot().edit_general_forum_topic( - chat_id=self.id, - name=name, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def close_general_forum_topic( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.close_general_forum_topic(chat_id=update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.close_general_forum_topic`. - - .. versionadded:: 20.0 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - """ - return await self.get_bot().close_general_forum_topic( - chat_id=self.id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def reopen_general_forum_topic( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.reopen_general_forum_topic( - chat_id=update.effective_chat.id, *args, **kwargs - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.reopen_general_forum_topic`. - - .. versionadded:: 20.0 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - """ - return await self.get_bot().reopen_general_forum_topic( - chat_id=self.id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def hide_general_forum_topic( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.hide_general_forum_topic(chat_id=update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.hide_general_forum_topic`. - - .. versionadded:: 20.0 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - """ - return await self.get_bot().hide_general_forum_topic( - chat_id=self.id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def unhide_general_forum_topic( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.unhide_general_forum_topic ( - chat_id=update.effective_chat.id, *args, **kwargs - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.unhide_general_forum_topic`. - - .. versionadded:: 20.0 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - """ - return await self.get_bot().unhide_general_forum_topic( - chat_id=self.id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def get_menu_button( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> MenuButton: - """Shortcut for:: - - await bot.get_chat_menu_button(chat_id=update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.get_chat_menu_button`. - - Caution: - Can only work, if the chat is a private chat. - - .. seealso:: :meth:`set_menu_button` - - .. versionadded:: 20.0 - - Returns: - :class:`telegram.MenuButton`: On success, the current menu button is returned. - """ - return await self.get_bot().get_chat_menu_button( - chat_id=self.id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def get_user_chat_boosts( - self, - user_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "UserChatBoosts": - """Shortcut for:: - - await bot.get_user_chat_boosts(chat_id=update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.get_user_chat_boosts`. - - .. versionadded:: 20.8 - - Returns: - :class:`telegram.UserChatBoosts`: On success, returns the boosts applied in the chat. - """ - return await self.get_bot().get_user_chat_boosts( - chat_id=self.id, - user_id=user_id, - api_kwargs=api_kwargs, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - ) - - async def set_message_reaction( - self, - message_id: int, - reaction: Optional[Union[Sequence[Union[ReactionType, str]], ReactionType, str]] = None, - is_big: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.set_message_reaction(chat_id=update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.set_message_reaction`. - - .. versionadded:: 20.8 - - Returns: - :obj:`bool` On success, :obj:`True` is returned. - """ - return await self.get_bot().set_message_reaction( - chat_id=self.id, - message_id=message_id, - reaction=reaction, - is_big=is_big, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def send_paid_media( - self, - star_count: int, - media: Sequence["InputPaidMedia"], - caption: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - show_caption_above_media: Optional[bool] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - protect_content: ODVInput[bool] = DEFAULT_NONE, - reply_parameters: Optional["ReplyParameters"] = None, - reply_markup: Optional[ReplyMarkup] = None, - business_connection_id: Optional[str] = None, - payload: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - reply_to_message_id: Optional[int] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_paid_media(chat_id=update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.send_paid_media`. - - .. versionadded:: 21.4 - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - """ - return await self.get_bot().send_paid_media( - chat_id=self.id, - star_count=star_count, - media=media, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - disable_notification=disable_notification, - protect_content=protect_content, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - business_connection_id=business_connection_id, - payload=payload, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_gift( - self, - gift_id: Union[str, "Gift"], - text: Optional[str] = None, - text_parse_mode: ODVInput[str] = DEFAULT_NONE, - text_entities: Optional[Sequence["MessageEntity"]] = None, - pay_for_upgrade: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.send_gift(user_id=update.effective_chat.id, *args, **kwargs ) - - or:: - - await bot.send_gift(chat_id=update.effective_chat.id, *args, **kwargs ) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_gift`. - - Caution: - Will only work if the chat is a private or channel chat, see :attr:`type`. - - .. versionadded:: 21.8 - - .. versionchanged:: 21.11 - - Added support for channel chats. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - """ - return await self.get_bot().send_gift( - gift_id=gift_id, - text=text, - text_parse_mode=text_parse_mode, - text_entities=text_entities, - pay_for_upgrade=pay_for_upgrade, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - **{"chat_id" if self.type == Chat.CHANNEL else "user_id": self.id}, - ) - - async def transfer_gift( - self, - business_connection_id: str, - owned_gift_id: str, - star_count: Optional[int] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.transfer_gift(new_owner_chat_id=update.effective_chat.id, *args, **kwargs ) - - For the documentation of the arguments, please see :meth:`telegram.Bot.transfer_gift`. - - .. versionadded:: 22.1 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - """ - return await self.get_bot().transfer_gift( - new_owner_chat_id=self.id, - business_connection_id=business_connection_id, - owned_gift_id=owned_gift_id, - star_count=star_count, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def verify( - self, - custom_description: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.verify_chat(chat_id=update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.verify_chat`. - - .. versionadded:: 21.10 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - """ - return await self.get_bot().verify_chat( - chat_id=self.id, - custom_description=custom_description, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def remove_verification( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.remove_chat_verification(chat_id=update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.remove_chat_verification`. - - .. versionadded:: 21.10 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - """ - return await self.get_bot().remove_chat_verification( - chat_id=self.id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def read_business_message( - self, - business_connection_id: str, - message_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.read_business_message(chat_id=update.effective_chat.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.read_business_message`. - - .. versionadded:: 22.1 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - """ - return await self.get_bot().read_business_message( - chat_id=self.id, - business_connection_id=business_connection_id, - message_id=message_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - -class Chat(_ChatBase): - """This object represents a chat. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`id` is equal. - - .. versionchanged:: 20.0 - - * Removed the deprecated methods ``kick_member`` and ``get_members_count``. - * The following are now keyword-only arguments in Bot methods: - ``location``, ``filename``, ``contact``, ``{read, write, connect, pool}_timeout``, - ``api_kwargs``. Use a named argument for those, - and notice that some positional arguments changed position as a result. - - .. versionchanged:: 20.0 - Removed the attribute ``all_members_are_administrators``. As long as Telegram provides - this field for backwards compatibility, it is available through - :attr:`~telegram.TelegramObject.api_kwargs`. - - .. versionchanged:: 21.3 - As per Bot API 7.3, most of the arguments and attributes of this class have now moved to - :class:`telegram.ChatFullInfo`. - - Args: - id (:obj:`int`): Unique identifier for this chat. - type (:obj:`str`): Type of chat, can be either :attr:`PRIVATE`, :attr:`GROUP`, - :attr:`SUPERGROUP` or :attr:`CHANNEL`. - title (:obj:`str`, optional): Title, for supergroups, channels and group chats. - username (:obj:`str`, optional): Username, for private chats, supergroups and channels if - available. - first_name (:obj:`str`, optional): First name of the other party in a private chat. - last_name (:obj:`str`, optional): Last name of the other party in a private chat. - is_forum (:obj:`bool`, optional): :obj:`True`, if the supergroup chat is a forum - (has topics_ enabled). - - .. versionadded:: 20.0 - - Attributes: - id (:obj:`int`): Unique identifier for this chat. - type (:obj:`str`): Type of chat, can be either :attr:`PRIVATE`, :attr:`GROUP`, - :attr:`SUPERGROUP` or :attr:`CHANNEL`. - title (:obj:`str`): Optional. Title, for supergroups, channels and group chats. - username (:obj:`str`): Optional. Username, for private chats, supergroups and channels if - available. - first_name (:obj:`str`): Optional. First name of the other party in a private chat. - last_name (:obj:`str`): Optional. Last name of the other party in a private chat. - is_forum (:obj:`bool`): Optional. :obj:`True`, if the supergroup chat is a forum - (has topics_ enabled). - - .. versionadded:: 20.0 - - .. _topics: https://telegram.org/blog/topics-in-groups-collectible-usernames#topics-in-groups - """ - - __slots__ = () diff --git a/venv/lib/python3.12/site-packages/telegram/_chatadministratorrights.py b/venv/lib/python3.12/site-packages/telegram/_chatadministratorrights.py deleted file mode 100644 index 6b6c437..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_chatadministratorrights.py +++ /dev/null @@ -1,247 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the class which represents a Telegram ChatAdministratorRights.""" -from typing import Optional - -from telegram._telegramobject import TelegramObject -from telegram._utils.types import JSONDict - - -class ChatAdministratorRights(TelegramObject): - """Represents the rights of an administrator in a chat. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`is_anonymous`, :attr:`can_manage_chat`, - :attr:`can_delete_messages`, :attr:`can_manage_video_chats`, :attr:`can_restrict_members`, - :attr:`can_promote_members`, :attr:`can_change_info`, :attr:`can_invite_users`, - :attr:`can_post_messages`, :attr:`can_edit_messages`, :attr:`can_pin_messages`, - :attr:`can_manage_topics`, :attr:`can_post_stories`, :attr:`can_delete_stories`, and - :attr:`can_edit_stories` are equal. - - .. versionadded:: 20.0 - - .. versionchanged:: 20.0 - :attr:`can_manage_topics` is considered as well when comparing objects of - this type in terms of equality. - - .. versionchanged:: 20.6 - :attr:`can_post_stories`, :attr:`can_edit_stories`, and :attr:`can_delete_stories` are - considered as well when comparing objects of this type in terms of equality. - - .. versionchanged:: 21.1 - As of this version, :attr:`can_post_stories`, :attr:`can_edit_stories`, - and :attr:`can_delete_stories` is now required. Thus, the order of arguments had to be - changed. - - Args: - is_anonymous (:obj:`bool`): :obj:`True`, if the user's presence in the chat is hidden. - can_manage_chat (:obj:`bool`): :obj:`True`, if the administrator can access the chat event - log, get boost list, see hidden supergroup and channel members, report spam messages - and ignore slow mode. Implied by any other administrator privilege. - can_delete_messages (:obj:`bool`): :obj:`True`, if the administrator can delete messages of - other users. - can_manage_video_chats (:obj:`bool`): :obj:`True`, if the administrator can manage video - chats. - can_restrict_members (:obj:`bool`): :obj:`True`, if the administrator can restrict, ban or - unban chat members, or access supergroup statistics. - can_promote_members (:obj:`bool`): :obj:`True`, if the administrator can add new - administrators with a subset of their own privileges or demote administrators - that they have promoted, directly or indirectly (promoted by administrators that - were appointed by the user). - can_change_info (:obj:`bool`): :obj:`True`, if the user is allowed to change the chat title - , photo and other settings. - can_invite_users (:obj:`bool`): :obj:`True`, if the user is allowed to invite new users to - the chat. - can_post_messages (:obj:`bool`, optional): :obj:`True`, if the administrator can post - messages in the channel, or access channel statistics; for channels only. - can_edit_messages (:obj:`bool`, optional): :obj:`True`, if the administrator can edit - messages of other users and can pin messages; for channels only. - can_pin_messages (:obj:`bool`, optional): :obj:`True`, if the user is allowed to pin - messages; for groups and supergroups only. - can_post_stories (:obj:`bool`): :obj:`True`, if the administrator can post - stories to the chat. - - .. versionadded:: 20.6 - .. versionchanged:: 21.0 - |non_optional_story_argument| - can_edit_stories (:obj:`bool`): :obj:`True`, if the administrator can edit stories posted - by other users, post stories to the chat page, pin chat stories, and access the chat's - story archive - - .. versionadded:: 20.6 - .. versionchanged:: 21.0 - |non_optional_story_argument| - can_delete_stories (:obj:`bool`): :obj:`True`, if the administrator can delete - stories posted by other users. - - .. versionadded:: 20.6 - .. versionchanged:: 21.0 - |non_optional_story_argument| - can_manage_topics (:obj:`bool`, optional): :obj:`True`, if the user is allowed - to create, rename, close, and reopen forum topics; for supergroups only. - - .. versionadded:: 20.0 - - Attributes: - is_anonymous (:obj:`bool`): :obj:`True`, if the user's presence in the chat is hidden. - can_manage_chat (:obj:`bool`): :obj:`True`, if the administrator can access the chat event - log, get boost list, see hidden supergroup and channel members, report spam messages - and ignore slow mode. Implied by any other administrator privilege. - can_delete_messages (:obj:`bool`): :obj:`True`, if the administrator can delete messages of - other users. - can_manage_video_chats (:obj:`bool`): :obj:`True`, if the administrator can manage video - chats. - can_restrict_members (:obj:`bool`): :obj:`True`, if the administrator can restrict, ban or - unban chat members, or access supergroup statistics. - can_promote_members (:obj:`bool`): :obj:`True`, if the administrator can add new - administrators with a subset of their own privileges or demote administrators that he - has promoted, directly or indirectly (promoted by administrators that were appointed by - the user.) - can_change_info (:obj:`bool`): :obj:`True`, if the user is allowed to change the chat title - ,photo and other settings. - can_invite_users (:obj:`bool`): :obj:`True`, if the user is allowed to invite new users to - the chat. - can_post_messages (:obj:`bool`): Optional. :obj:`True`, if the administrator can post - messages in the channel, or access channel statistics; for channels only. - can_edit_messages (:obj:`bool`): Optional. :obj:`True`, if the administrator can edit - messages of other users and can pin messages; for channels only. - can_pin_messages (:obj:`bool`): Optional. :obj:`True`, if the user is allowed to pin - messages; for groups and supergroups only. - can_post_stories (:obj:`bool`): :obj:`True`, if the administrator can post - stories to the chat. - - .. versionadded:: 20.6 - .. versionchanged:: 21.0 - |non_optional_story_argument| - can_edit_stories (:obj:`bool`): :obj:`True`, if the administrator can edit stories posted - by other users, post stories to the chat page, pin chat stories, and access the chat's - story archive - - .. versionadded:: 20.6 - .. versionchanged:: 21.0 - |non_optional_story_argument| - can_delete_stories (:obj:`bool`): :obj:`True`, if the administrator can delete - stories posted by other users. - - .. versionadded:: 20.6 - .. versionchanged:: 21.0 - |non_optional_story_argument| - can_manage_topics (:obj:`bool`): Optional. :obj:`True`, if the user is allowed - to create, rename, close, and reopen forum topics; for supergroups only. - - .. versionadded:: 20.0 - """ - - __slots__ = ( - "can_change_info", - "can_delete_messages", - "can_delete_stories", - "can_edit_messages", - "can_edit_stories", - "can_invite_users", - "can_manage_chat", - "can_manage_topics", - "can_manage_video_chats", - "can_pin_messages", - "can_post_messages", - "can_post_stories", - "can_promote_members", - "can_restrict_members", - "is_anonymous", - ) - - def __init__( - self, - is_anonymous: bool, - can_manage_chat: bool, - can_delete_messages: bool, - can_manage_video_chats: bool, - can_restrict_members: bool, - can_promote_members: bool, - can_change_info: bool, - can_invite_users: bool, - can_post_stories: bool, - can_edit_stories: bool, - can_delete_stories: bool, - can_post_messages: Optional[bool] = None, - can_edit_messages: Optional[bool] = None, - can_pin_messages: Optional[bool] = None, - can_manage_topics: Optional[bool] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(api_kwargs=api_kwargs) - # Required - self.is_anonymous: bool = is_anonymous - self.can_manage_chat: bool = can_manage_chat - self.can_delete_messages: bool = can_delete_messages - self.can_manage_video_chats: bool = can_manage_video_chats - self.can_restrict_members: bool = can_restrict_members - self.can_promote_members: bool = can_promote_members - self.can_change_info: bool = can_change_info - self.can_invite_users: bool = can_invite_users - self.can_post_stories: bool = can_post_stories - self.can_edit_stories: bool = can_edit_stories - self.can_delete_stories: bool = can_delete_stories - # Optionals - self.can_post_messages: Optional[bool] = can_post_messages - self.can_edit_messages: Optional[bool] = can_edit_messages - self.can_pin_messages: Optional[bool] = can_pin_messages - self.can_manage_topics: Optional[bool] = can_manage_topics - - self._id_attrs = ( - self.is_anonymous, - self.can_manage_chat, - self.can_delete_messages, - self.can_manage_video_chats, - self.can_restrict_members, - self.can_promote_members, - self.can_change_info, - self.can_invite_users, - self.can_post_messages, - self.can_edit_messages, - self.can_pin_messages, - self.can_manage_topics, - self.can_post_stories, - self.can_edit_stories, - self.can_delete_stories, - ) - - self._freeze() - - @classmethod - def all_rights(cls) -> "ChatAdministratorRights": - """ - This method returns the :class:`ChatAdministratorRights` object with all attributes set to - :obj:`True`. This is e.g. useful when changing the bot's default administrator rights with - :meth:`telegram.Bot.set_my_default_administrator_rights`. - - .. versionadded:: 20.0 - """ - return cls(*(True,) * len(cls.__slots__)) - - @classmethod - def no_rights(cls) -> "ChatAdministratorRights": - """ - This method returns the :class:`ChatAdministratorRights` object with all attributes set to - :obj:`False`. - - .. versionadded:: 20.0 - """ - return cls(*(False,) * len(cls.__slots__)) diff --git a/venv/lib/python3.12/site-packages/telegram/_chatbackground.py b/venv/lib/python3.12/site-packages/telegram/_chatbackground.py deleted file mode 100644 index a4bbf5b..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_chatbackground.py +++ /dev/null @@ -1,532 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains objects related to chat backgrounds.""" -from collections.abc import Sequence -from typing import TYPE_CHECKING, Final, Optional - -from telegram import constants -from telegram._files.document import Document -from telegram._telegramobject import TelegramObject -from telegram._utils import enum -from telegram._utils.argumentparsing import de_json_optional, parse_sequence_arg -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot - - -class BackgroundFill(TelegramObject): - """Base class for Telegram BackgroundFill Objects. It can be one of: - - * :class:`telegram.BackgroundFillSolid` - * :class:`telegram.BackgroundFillGradient` - * :class:`telegram.BackgroundFillFreeformGradient` - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`type` is equal. - - .. versionadded:: 21.2 - - Args: - type (:obj:`str`): Type of the background fill. Can be one of: - :attr:`~telegram.BackgroundFill.SOLID`, :attr:`~telegram.BackgroundFill.GRADIENT` - or :attr:`~telegram.BackgroundFill.FREEFORM_GRADIENT`. - - Attributes: - type (:obj:`str`): Type of the background fill. Can be one of: - :attr:`~telegram.BackgroundFill.SOLID`, :attr:`~telegram.BackgroundFill.GRADIENT` - or :attr:`~telegram.BackgroundFill.FREEFORM_GRADIENT`. - """ - - __slots__ = ("type",) - - SOLID: Final[constants.BackgroundFillType] = constants.BackgroundFillType.SOLID - """:const:`telegram.constants.BackgroundFillType.SOLID`""" - GRADIENT: Final[constants.BackgroundFillType] = constants.BackgroundFillType.GRADIENT - """:const:`telegram.constants.BackgroundFillType.GRADIENT`""" - FREEFORM_GRADIENT: Final[constants.BackgroundFillType] = ( - constants.BackgroundFillType.FREEFORM_GRADIENT - ) - """:const:`telegram.constants.BackgroundFillType.FREEFORM_GRADIENT`""" - - def __init__( - self, - type: str, # pylint: disable=redefined-builtin - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - # Required by all subclasses - self.type: str = enum.get_member(constants.BackgroundFillType, type, type) - - self._id_attrs = (self.type,) - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "BackgroundFill": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - _class_mapping: dict[str, type[BackgroundFill]] = { - cls.SOLID: BackgroundFillSolid, - cls.GRADIENT: BackgroundFillGradient, - cls.FREEFORM_GRADIENT: BackgroundFillFreeformGradient, - } - - if cls is BackgroundFill and data.get("type") in _class_mapping: - return _class_mapping[data.pop("type")].de_json(data=data, bot=bot) - - return super().de_json(data=data, bot=bot) - - -class BackgroundFillSolid(BackgroundFill): - """ - The background is filled using the selected color. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`color` is equal. - - .. versionadded:: 21.2 - - Args: - color (:obj:`int`): The color of the background fill in the `RGB24` format. - - Attributes: - type (:obj:`str`): Type of the background fill. Always - :attr:`~telegram.BackgroundFill.SOLID`. - color (:obj:`int`): The color of the background fill in the `RGB24` format. - """ - - __slots__ = ("color",) - - def __init__( - self, - color: int, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(type=self.SOLID, api_kwargs=api_kwargs) - - with self._unfrozen(): - self.color: int = color - - self._id_attrs = (self.color,) - - -class BackgroundFillGradient(BackgroundFill): - """ - The background is a gradient fill. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`top_color`, :attr:`bottom_color` - and :attr:`rotation_angle` are equal. - - .. versionadded:: 21.2 - - Args: - top_color (:obj:`int`): Top color of the gradient in the `RGB24` format. - bottom_color (:obj:`int`): Bottom color of the gradient in the `RGB24` format. - rotation_angle (:obj:`int`): Clockwise rotation angle of the background - fill in degrees; - 0-:tg-const:`telegram.constants.BackgroundFillLimit.MAX_ROTATION_ANGLE`. - - - Attributes: - type (:obj:`str`): Type of the background fill. Always - :attr:`~telegram.BackgroundFill.GRADIENT`. - top_color (:obj:`int`): Top color of the gradient in the `RGB24` format. - bottom_color (:obj:`int`): Bottom color of the gradient in the `RGB24` format. - rotation_angle (:obj:`int`): Clockwise rotation angle of the background - fill in degrees; - 0-:tg-const:`telegram.constants.BackgroundFillLimit.MAX_ROTATION_ANGLE`. - """ - - __slots__ = ("bottom_color", "rotation_angle", "top_color") - - def __init__( - self, - top_color: int, - bottom_color: int, - rotation_angle: int, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(type=self.GRADIENT, api_kwargs=api_kwargs) - - with self._unfrozen(): - self.top_color: int = top_color - self.bottom_color: int = bottom_color - self.rotation_angle: int = rotation_angle - - self._id_attrs = (self.top_color, self.bottom_color, self.rotation_angle) - - -class BackgroundFillFreeformGradient(BackgroundFill): - """ - The background is a freeform gradient that rotates after every message in the chat. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`colors` is equal. - - .. versionadded:: 21.2 - - Args: - colors (Sequence[:obj:`int`]): A list of the 3 or 4 base colors that are used to - generate the freeform gradient in the `RGB24` format - - Attributes: - type (:obj:`str`): Type of the background fill. Always - :attr:`~telegram.BackgroundFill.FREEFORM_GRADIENT`. - colors (Sequence[:obj:`int`]): A list of the 3 or 4 base colors that are used to - generate the freeform gradient in the `RGB24` format - """ - - __slots__ = ("colors",) - - def __init__( - self, - colors: Sequence[int], - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(type=self.FREEFORM_GRADIENT, api_kwargs=api_kwargs) - - with self._unfrozen(): - self.colors: tuple[int, ...] = parse_sequence_arg(colors) - - self._id_attrs = (self.colors,) - - -class BackgroundType(TelegramObject): - """Base class for Telegram BackgroundType Objects. It can be one of: - - * :class:`telegram.BackgroundTypeFill` - * :class:`telegram.BackgroundTypeWallpaper` - * :class:`telegram.BackgroundTypePattern` - * :class:`telegram.BackgroundTypeChatTheme`. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`type` is equal. - - .. versionadded:: 21.2 - - Args: - type (:obj:`str`): Type of the background. Can be one of: - :attr:`~telegram.BackgroundType.FILL`, :attr:`~telegram.BackgroundType.WALLPAPER` - :attr:`~telegram.BackgroundType.PATTERN` or - :attr:`~telegram.BackgroundType.CHAT_THEME`. - - Attributes: - type (:obj:`str`): Type of the background. Can be one of: - :attr:`~telegram.BackgroundType.FILL`, :attr:`~telegram.BackgroundType.WALLPAPER` - :attr:`~telegram.BackgroundType.PATTERN` or - :attr:`~telegram.BackgroundType.CHAT_THEME`. - - """ - - __slots__ = ("type",) - - FILL: Final[constants.BackgroundTypeType] = constants.BackgroundTypeType.FILL - """:const:`telegram.constants.BackgroundTypeType.FILL`""" - WALLPAPER: Final[constants.BackgroundTypeType] = constants.BackgroundTypeType.WALLPAPER - """:const:`telegram.constants.BackgroundTypeType.WALLPAPER`""" - PATTERN: Final[constants.BackgroundTypeType] = constants.BackgroundTypeType.PATTERN - """:const:`telegram.constants.BackgroundTypeType.PATTERN`""" - CHAT_THEME: Final[constants.BackgroundTypeType] = constants.BackgroundTypeType.CHAT_THEME - """:const:`telegram.constants.BackgroundTypeType.CHAT_THEME`""" - - def __init__( - self, - type: str, # pylint: disable=redefined-builtin - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - # Required by all subclasses - self.type: str = enum.get_member(constants.BackgroundTypeType, type, type) - - self._id_attrs = (self.type,) - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "BackgroundType": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - _class_mapping: dict[str, type[BackgroundType]] = { - cls.FILL: BackgroundTypeFill, - cls.WALLPAPER: BackgroundTypeWallpaper, - cls.PATTERN: BackgroundTypePattern, - cls.CHAT_THEME: BackgroundTypeChatTheme, - } - - if cls is BackgroundType and data.get("type") in _class_mapping: - return _class_mapping[data.pop("type")].de_json(data=data, bot=bot) - - if "fill" in data: - data["fill"] = de_json_optional(data.get("fill"), BackgroundFill, bot) - - if "document" in data: - data["document"] = de_json_optional(data.get("document"), Document, bot) - - return super().de_json(data=data, bot=bot) - - -class BackgroundTypeFill(BackgroundType): - """ - The background is automatically filled based on the selected colors. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`fill` and :attr:`dark_theme_dimming` are equal. - - .. versionadded:: 21.2 - - Args: - fill (:class:`telegram.BackgroundFill`): The background fill. - dark_theme_dimming (:obj:`int`): Dimming of the background in dark themes, as a - percentage; - 0-:tg-const:`telegram.constants.BackgroundTypeLimit.MAX_DIMMING`. - - Attributes: - type (:obj:`str`): Type of the background. Always - :attr:`~telegram.BackgroundType.FILL`. - fill (:class:`telegram.BackgroundFill`): The background fill. - dark_theme_dimming (:obj:`int`): Dimming of the background in dark themes, as a - percentage; - 0-:tg-const:`telegram.constants.BackgroundTypeLimit.MAX_DIMMING`. - """ - - __slots__ = ("dark_theme_dimming", "fill") - - def __init__( - self, - fill: BackgroundFill, - dark_theme_dimming: int, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(type=self.FILL, api_kwargs=api_kwargs) - - with self._unfrozen(): - self.fill: BackgroundFill = fill - self.dark_theme_dimming: int = dark_theme_dimming - - self._id_attrs = (self.fill, self.dark_theme_dimming) - - -class BackgroundTypeWallpaper(BackgroundType): - """ - The background is a wallpaper in the `JPEG` format. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`document` and :attr:`dark_theme_dimming` are equal. - - .. versionadded:: 21.2 - - Args: - document (:class:`telegram.Document`): Document with the wallpaper - dark_theme_dimming (:obj:`int`): Dimming of the background in dark themes, as a - percentage; - 0-:tg-const:`telegram.constants.BackgroundTypeLimit.MAX_DIMMING`. - is_blurred (:obj:`bool`, optional): :obj:`True`, if the wallpaper is downscaled to fit - in a 450x450 square and then box-blurred with radius 12 - is_moving (:obj:`bool`, optional): :obj:`True`, if the background moves slightly - when the device is tilted - - Attributes: - type (:obj:`str`): Type of the background. Always - :attr:`~telegram.BackgroundType.WALLPAPER`. - document (:class:`telegram.Document`): Document with the wallpaper - dark_theme_dimming (:obj:`int`): Dimming of the background in dark themes, as a - percentage; - 0-:tg-const:`telegram.constants.BackgroundTypeLimit.MAX_DIMMING`. - is_blurred (:obj:`bool`): Optional. :obj:`True`, if the wallpaper is downscaled to fit - in a 450x450 square and then box-blurred with radius 12 - is_moving (:obj:`bool`): Optional. :obj:`True`, if the background moves slightly - when the device is tilted - """ - - __slots__ = ("dark_theme_dimming", "document", "is_blurred", "is_moving") - - def __init__( - self, - document: Document, - dark_theme_dimming: int, - is_blurred: Optional[bool] = None, - is_moving: Optional[bool] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(type=self.WALLPAPER, api_kwargs=api_kwargs) - - with self._unfrozen(): - # Required - self.document: Document = document - self.dark_theme_dimming: int = dark_theme_dimming - # Optionals - self.is_blurred: Optional[bool] = is_blurred - self.is_moving: Optional[bool] = is_moving - - self._id_attrs = (self.document, self.dark_theme_dimming) - - -class BackgroundTypePattern(BackgroundType): - """ - The background is a ``.PNG`` or ``.TGV`` (gzipped subset of ``SVG`` with ``MIME`` type - ``"application/x-tgwallpattern"``) pattern to be combined with the background fill - chosen by the user. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`document` and :attr:`fill` and :attr:`intensity` are equal. - - .. versionadded:: 21.2 - - Args: - document (:class:`telegram.Document`): Document with the pattern. - fill (:class:`telegram.BackgroundFill`): The background fill that is combined with - the pattern. - intensity (:obj:`int`): Intensity of the pattern when it is shown above the filled - background; - 0-:tg-const:`telegram.constants.BackgroundTypeLimit.MAX_INTENSITY`. - is_inverted (:obj:`int`, optional): :obj:`True`, if the background fill must be applied - only to the pattern itself. All other pixels are black in this case. For dark - themes only. - is_moving (:obj:`bool`, optional): :obj:`True`, if the background moves slightly - when the device is tilted. - - Attributes: - type (:obj:`str`): Type of the background. Always - :attr:`~telegram.BackgroundType.PATTERN`. - document (:class:`telegram.Document`): Document with the pattern. - fill (:class:`telegram.BackgroundFill`): The background fill that is combined with - the pattern. - intensity (:obj:`int`): Intensity of the pattern when it is shown above the filled - background; - 0-:tg-const:`telegram.constants.BackgroundTypeLimit.MAX_INTENSITY`. - is_inverted (:obj:`int`): Optional. :obj:`True`, if the background fill must be applied - only to the pattern itself. All other pixels are black in this case. For dark - themes only. - is_moving (:obj:`bool`): Optional. :obj:`True`, if the background moves slightly - when the device is tilted. - """ - - __slots__ = ( - "document", - "fill", - "intensity", - "is_inverted", - "is_moving", - ) - - def __init__( - self, - document: Document, - fill: BackgroundFill, - intensity: int, - is_inverted: Optional[bool] = None, - is_moving: Optional[bool] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(type=self.PATTERN, api_kwargs=api_kwargs) - - with self._unfrozen(): - # Required - self.document: Document = document - self.fill: BackgroundFill = fill - self.intensity: int = intensity - # Optionals - self.is_inverted: Optional[bool] = is_inverted - self.is_moving: Optional[bool] = is_moving - - self._id_attrs = (self.document, self.fill, self.intensity) - - -class BackgroundTypeChatTheme(BackgroundType): - """ - The background is taken directly from a built-in chat theme. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`theme_name` is equal. - - .. versionadded:: 21.2 - - Args: - theme_name (:obj:`str`): Name of the chat theme, which is usually an emoji. - - Attributes: - type (:obj:`str`): Type of the background. Always - :attr:`~telegram.BackgroundType.CHAT_THEME`. - theme_name (:obj:`str`): Name of the chat theme, which is usually an emoji. - """ - - __slots__ = ("theme_name",) - - def __init__( - self, - theme_name: str, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(type=self.CHAT_THEME, api_kwargs=api_kwargs) - - with self._unfrozen(): - self.theme_name: str = theme_name - - self._id_attrs = (self.theme_name,) - - -class ChatBackground(TelegramObject): - """ - This object represents a chat background. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`type` is equal. - - .. versionadded:: 21.2 - - Args: - type (:class:`telegram.BackgroundType`): Type of the background. - - Attributes: - type (:class:`telegram.BackgroundType`): Type of the background. - """ - - __slots__ = ("type",) - - def __init__( - self, - type: BackgroundType, # pylint: disable=redefined-builtin - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.type: BackgroundType = type - - self._id_attrs = (self.type,) - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "ChatBackground": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["type"] = de_json_optional(data.get("type"), BackgroundType, bot) - - return super().de_json(data=data, bot=bot) diff --git a/venv/lib/python3.12/site-packages/telegram/_chatboost.py b/venv/lib/python3.12/site-packages/telegram/_chatboost.py deleted file mode 100644 index 678b713..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_chatboost.py +++ /dev/null @@ -1,439 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the classes that represent Telegram ChatBoosts.""" -import datetime as dtm -from collections.abc import Sequence -from typing import TYPE_CHECKING, Final, Optional - -from telegram import constants -from telegram._chat import Chat -from telegram._telegramobject import TelegramObject -from telegram._user import User -from telegram._utils import enum -from telegram._utils.argumentparsing import de_json_optional, de_list_optional, parse_sequence_arg -from telegram._utils.datetime import extract_tzinfo_from_defaults, from_timestamp -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot - - -class ChatBoostAdded(TelegramObject): - """ - This object represents a service message about a user boosting a chat. - - Objects of this class are comparable in terms of equality. - Two objects of this class are considered equal, if their - :attr:`boost_count` are equal. - - .. versionadded:: 21.0 - - Args: - boost_count (:obj:`int`): Number of boosts added by the user. - - Attributes: - boost_count (:obj:`int`): Number of boosts added by the user. - - """ - - __slots__ = ("boost_count",) - - def __init__( - self, - boost_count: int, - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(api_kwargs=api_kwargs) - self.boost_count: int = boost_count - self._id_attrs = (self.boost_count,) - - self._freeze() - - -class ChatBoostSource(TelegramObject): - """ - Base class for Telegram ChatBoostSource objects. It can be one of: - - * :class:`telegram.ChatBoostSourcePremium` - * :class:`telegram.ChatBoostSourceGiftCode` - * :class:`telegram.ChatBoostSourceGiveaway` - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`source` is equal. - - .. versionadded:: 20.8 - - Args: - source (:obj:`str`): The source of the chat boost. Can be one of: - :attr:`~telegram.ChatBoostSource.PREMIUM`, :attr:`~telegram.ChatBoostSource.GIFT_CODE`, - or :attr:`~telegram.ChatBoostSource.GIVEAWAY`. - - Attributes: - source (:obj:`str`): The source of the chat boost. Can be one of: - :attr:`~telegram.ChatBoostSource.PREMIUM`, :attr:`~telegram.ChatBoostSource.GIFT_CODE`, - or :attr:`~telegram.ChatBoostSource.GIVEAWAY`. - """ - - __slots__ = ("source",) - - PREMIUM: Final[str] = constants.ChatBoostSources.PREMIUM - """:const:`telegram.constants.ChatBoostSources.PREMIUM`""" - GIFT_CODE: Final[str] = constants.ChatBoostSources.GIFT_CODE - """:const:`telegram.constants.ChatBoostSources.GIFT_CODE`""" - GIVEAWAY: Final[str] = constants.ChatBoostSources.GIVEAWAY - """:const:`telegram.constants.ChatBoostSources.GIVEAWAY`""" - - def __init__(self, source: str, *, api_kwargs: Optional[JSONDict] = None): - super().__init__(api_kwargs=api_kwargs) - - # Required by all subclasses: - self.source: str = enum.get_member(constants.ChatBoostSources, source, source) - - self._id_attrs = (self.source,) - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "ChatBoostSource": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - _class_mapping: dict[str, type[ChatBoostSource]] = { - cls.PREMIUM: ChatBoostSourcePremium, - cls.GIFT_CODE: ChatBoostSourceGiftCode, - cls.GIVEAWAY: ChatBoostSourceGiveaway, - } - - if cls is ChatBoostSource and data.get("source") in _class_mapping: - return _class_mapping[data.pop("source")].de_json(data=data, bot=bot) - - if "user" in data: - data["user"] = de_json_optional(data.get("user"), User, bot) - - return super().de_json(data=data, bot=bot) - - -class ChatBoostSourcePremium(ChatBoostSource): - """ - The boost was obtained by subscribing to Telegram Premium or by gifting a Telegram Premium - subscription to another user. - - .. versionadded:: 20.8 - - Args: - user (:class:`telegram.User`): User that boosted the chat. - - Attributes: - source (:obj:`str`): The source of the chat boost. Always - :attr:`~telegram.ChatBoostSource.PREMIUM`. - user (:class:`telegram.User`): User that boosted the chat. - """ - - __slots__ = ("user",) - - def __init__(self, user: User, *, api_kwargs: Optional[JSONDict] = None): - super().__init__(source=self.PREMIUM, api_kwargs=api_kwargs) - - with self._unfrozen(): - self.user: User = user - - -class ChatBoostSourceGiftCode(ChatBoostSource): - """ - The boost was obtained by the creation of Telegram Premium gift codes to boost a chat. Each - such code boosts the chat 4 times for the duration of the corresponding Telegram Premium - subscription. - - .. versionadded:: 20.8 - - Args: - user (:class:`telegram.User`): User for which the gift code was created. - - Attributes: - source (:obj:`str`): The source of the chat boost. Always - :attr:`~telegram.ChatBoostSource.GIFT_CODE`. - user (:class:`telegram.User`): User for which the gift code was created. - """ - - __slots__ = ("user",) - - def __init__(self, user: User, *, api_kwargs: Optional[JSONDict] = None): - super().__init__(source=self.GIFT_CODE, api_kwargs=api_kwargs) - - with self._unfrozen(): - self.user: User = user - - -class ChatBoostSourceGiveaway(ChatBoostSource): - """ - The boost was obtained by the creation of a Telegram Premium giveaway or a Telegram Star. - This boosts the chat 4 times for the duration of the corresponding Telegram Premium - subscription for Telegram Premium giveaways and :attr:`prize_star_count` / 500 times for - one year for Telegram Star giveaways. - - .. versionadded:: 20.8 - - Args: - giveaway_message_id (:obj:`int`): Identifier of a message in the chat with the giveaway; - the message could have been deleted already. May be 0 if the message isn't sent yet. - user (:class:`telegram.User`, optional): User that won the prize in the giveaway if any; - for Telegram Premium giveaways only. - prize_star_count (:obj:`int`, optional): The number of Telegram Stars to be split between - giveaway winners; for Telegram Star giveaways only. - - .. versionadded:: 21.6 - is_unclaimed (:obj:`bool`, optional): :obj:`True`, if the giveaway was completed, but - there was no user to win the prize. - - Attributes: - source (:obj:`str`): Source of the boost. Always - :attr:`~telegram.ChatBoostSource.GIVEAWAY`. - giveaway_message_id (:obj:`int`): Identifier of a message in the chat with the giveaway; - the message could have been deleted already. May be 0 if the message isn't sent yet. - user (:class:`telegram.User`): Optional. User that won the prize in the giveaway if any. - prize_star_count (:obj:`int`): Optional. The number of Telegram Stars to be split between - giveaway winners; for Telegram Star giveaways only. - - .. versionadded:: 21.6 - is_unclaimed (:obj:`bool`): Optional. :obj:`True`, if the giveaway was completed, but - there was no user to win the prize. - """ - - __slots__ = ("giveaway_message_id", "is_unclaimed", "prize_star_count", "user") - - def __init__( - self, - giveaway_message_id: int, - user: Optional[User] = None, - is_unclaimed: Optional[bool] = None, - prize_star_count: Optional[int] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(source=self.GIVEAWAY, api_kwargs=api_kwargs) - - with self._unfrozen(): - self.giveaway_message_id: int = giveaway_message_id - self.user: Optional[User] = user - self.prize_star_count: Optional[int] = prize_star_count - self.is_unclaimed: Optional[bool] = is_unclaimed - - -class ChatBoost(TelegramObject): - """ - This object contains information about a chat boost. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`boost_id`, :attr:`add_date`, :attr:`expiration_date`, - and :attr:`source` are equal. - - .. versionadded:: 20.8 - - Args: - boost_id (:obj:`str`): Unique identifier of the boost. - add_date (:obj:`datetime.datetime`): Point in time when the chat was boosted. - expiration_date (:obj:`datetime.datetime`): Point in time when the boost - will automatically expire, unless the booster's Telegram Premium subscription is - prolonged. - source (:class:`telegram.ChatBoostSource`): Source of the added boost. - - Attributes: - boost_id (:obj:`str`): Unique identifier of the boost. - add_date (:obj:`datetime.datetime`): Point in time when the chat was boosted. - |datetime_localization| - expiration_date (:obj:`datetime.datetime`): Point in time when the boost - will automatically expire, unless the booster's Telegram Premium subscription is - prolonged. |datetime_localization| - source (:class:`telegram.ChatBoostSource`): Source of the added boost. - """ - - __slots__ = ("add_date", "boost_id", "expiration_date", "source") - - def __init__( - self, - boost_id: str, - add_date: dtm.datetime, - expiration_date: dtm.datetime, - source: ChatBoostSource, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - - self.boost_id: str = boost_id - self.add_date: dtm.datetime = add_date - self.expiration_date: dtm.datetime = expiration_date - self.source: ChatBoostSource = source - - self._id_attrs = (self.boost_id, self.add_date, self.expiration_date, self.source) - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "ChatBoost": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["source"] = de_json_optional(data.get("source"), ChatBoostSource, bot) - loc_tzinfo = extract_tzinfo_from_defaults(bot) - data["add_date"] = from_timestamp(data.get("add_date"), tzinfo=loc_tzinfo) - data["expiration_date"] = from_timestamp(data.get("expiration_date"), tzinfo=loc_tzinfo) - - return super().de_json(data=data, bot=bot) - - -class ChatBoostUpdated(TelegramObject): - """This object represents a boost added to a chat or changed. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`chat`, and :attr:`boost` are equal. - - .. versionadded:: 20.8 - - Args: - chat (:class:`telegram.Chat`): Chat which was boosted. - boost (:class:`telegram.ChatBoost`): Information about the chat boost. - - Attributes: - chat (:class:`telegram.Chat`): Chat which was boosted. - boost (:class:`telegram.ChatBoost`): Information about the chat boost. - """ - - __slots__ = ("boost", "chat") - - def __init__( - self, - chat: Chat, - boost: ChatBoost, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - - self.chat: Chat = chat - self.boost: ChatBoost = boost - - self._id_attrs = (self.chat.id, self.boost) - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "ChatBoostUpdated": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["chat"] = de_json_optional(data.get("chat"), Chat, bot) - data["boost"] = de_json_optional(data.get("boost"), ChatBoost, bot) - - return super().de_json(data=data, bot=bot) - - -class ChatBoostRemoved(TelegramObject): - """ - This object represents a boost removed from a chat. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`chat`, :attr:`boost_id`, :attr:`remove_date`, and - :attr:`source` are equal. - - Args: - chat (:class:`telegram.Chat`): Chat which was boosted. - boost_id (:obj:`str`): Unique identifier of the boost. - remove_date (:obj:`datetime.datetime`): Point in time when the boost was removed. - source (:class:`telegram.ChatBoostSource`): Source of the removed boost. - - Attributes: - chat (:class:`telegram.Chat`): Chat which was boosted. - boost_id (:obj:`str`): Unique identifier of the boost. - remove_date (:obj:`datetime.datetime`): Point in time when the boost was removed. - |datetime_localization| - source (:class:`telegram.ChatBoostSource`): Source of the removed boost. - """ - - __slots__ = ("boost_id", "chat", "remove_date", "source") - - def __init__( - self, - chat: Chat, - boost_id: str, - remove_date: dtm.datetime, - source: ChatBoostSource, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - - self.chat: Chat = chat - self.boost_id: str = boost_id - self.remove_date: dtm.datetime = remove_date - self.source: ChatBoostSource = source - - self._id_attrs = (self.chat, self.boost_id, self.remove_date, self.source) - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "ChatBoostRemoved": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["chat"] = de_json_optional(data.get("chat"), Chat, bot) - data["source"] = de_json_optional(data.get("source"), ChatBoostSource, bot) - loc_tzinfo = extract_tzinfo_from_defaults(bot) - data["remove_date"] = from_timestamp(data.get("remove_date"), tzinfo=loc_tzinfo) - - return super().de_json(data=data, bot=bot) - - -class UserChatBoosts(TelegramObject): - """This object represents a list of boosts added to a chat by a user. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`boosts` are equal. - - .. versionadded:: 20.8 - - Args: - boosts (Sequence[:class:`telegram.ChatBoost`]): List of boosts added to the chat by the - user. - - Attributes: - boosts (tuple[:class:`telegram.ChatBoost`]): List of boosts added to the chat by the user. - """ - - __slots__ = ("boosts",) - - def __init__( - self, - boosts: Sequence[ChatBoost], - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - - self.boosts: tuple[ChatBoost, ...] = parse_sequence_arg(boosts) - - self._id_attrs = (self.boosts,) - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "UserChatBoosts": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["boosts"] = de_list_optional(data.get("boosts"), ChatBoost, bot) - - return super().de_json(data=data, bot=bot) diff --git a/venv/lib/python3.12/site-packages/telegram/_chatfullinfo.py b/venv/lib/python3.12/site-packages/telegram/_chatfullinfo.py deleted file mode 100644 index 1850429..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_chatfullinfo.py +++ /dev/null @@ -1,650 +0,0 @@ -#!/usr/bin/env python -# pylint: disable=redefined-builtin -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram ChatFullInfo.""" -import datetime as dtm -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional, Union - -from telegram._birthdate import Birthdate -from telegram._chat import Chat, _ChatBase -from telegram._chatlocation import ChatLocation -from telegram._chatpermissions import ChatPermissions -from telegram._files.chatphoto import ChatPhoto -from telegram._gifts import AcceptedGiftTypes -from telegram._reaction import ReactionType -from telegram._utils.argumentparsing import ( - de_json_optional, - de_list_optional, - parse_sequence_arg, - to_timedelta, -) -from telegram._utils.datetime import ( - extract_tzinfo_from_defaults, - from_timestamp, - get_timedelta_value, -) -from telegram._utils.types import JSONDict, TimePeriod -from telegram._utils.warnings import warn -from telegram._utils.warnings_transition import ( - build_deprecation_warning_message, - warn_about_deprecated_attr_in_property, -) -from telegram.warnings import PTBDeprecationWarning - -if TYPE_CHECKING: - from telegram import Bot, BusinessIntro, BusinessLocation, BusinessOpeningHours, Message - - -class ChatFullInfo(_ChatBase): - """ - This object contains full information about a chat. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`~telegram.Chat.id` is equal. - - .. versionadded:: 21.2 - - .. versionchanged:: 21.3 - Explicit support for all shortcut methods known from :class:`telegram.Chat` on this - object. Previously those were only available because this class inherited from - :class:`telegram.Chat`. - - Args: - id (:obj:`int`): Unique identifier for this chat. - type (:obj:`str`): Type of chat, can be either :attr:`PRIVATE`, :attr:`GROUP`, - :attr:`SUPERGROUP` or :attr:`CHANNEL`. - accent_color_id (:obj:`int`, optional): Identifier of the - :class:`accent color <telegram.constants.AccentColor>` for the chat name and - backgrounds of the chat photo, reply header, and link preview. See `accent colors`_ - for more details. - - .. versionadded:: 20.8 - max_reaction_count (:obj:`int`): The maximum number of reactions that can be set on a - message in the chat. - - .. versionadded:: 21.2 - accepted_gift_types (:class:`telegram.AcceptedGiftTypes`): Information about types of - gifts that are accepted by the chat or by the corresponding user for private chats. - - .. versionadded:: 22.1 - title (:obj:`str`, optional): Title, for supergroups, channels and group chats. - username (:obj:`str`, optional): Username, for private chats, supergroups and channels if - available. - first_name (:obj:`str`, optional): First name of the other party in a private chat. - last_name (:obj:`str`, optional): Last name of the other party in a private chat. - is_forum (:obj:`bool`, optional): :obj:`True`, if the supergroup chat is a forum - (has topics_ enabled). - - .. versionadded:: 20.0 - photo (:class:`telegram.ChatPhoto`, optional): Chat photo. - active_usernames (Sequence[:obj:`str`], optional): If set, the list of all `active chat - usernames <https://telegram.org/blog/topics-in-groups-collectible-usernames\ - #collectible-usernames>`_; for private chats, supergroups and channels. - - .. versionadded:: 20.0 - birthdate (:class:`telegram.Birthdate`, optional): For private chats, - the date of birth of the user. - - .. versionadded:: 21.1 - business_intro (:class:`telegram.BusinessIntro`, optional): For private chats with - business accounts, the intro of the business. - - .. versionadded:: 21.1 - business_location (:class:`telegram.BusinessLocation`, optional): For private chats with - business accounts, the location of the business. - - .. versionadded:: 21.1 - business_opening_hours (:class:`telegram.BusinessOpeningHours`, optional): For private - chats with business accounts, the opening hours of the business. - - .. versionadded:: 21.1 - personal_chat (:class:`telegram.Chat`, optional): For private chats, the personal channel - of the user. - - .. versionadded:: 21.1 - available_reactions (Sequence[:class:`telegram.ReactionType`], optional): List of available - reactions allowed in the chat. If omitted, then all of - :const:`telegram.constants.ReactionEmoji` are allowed. - - .. versionadded:: 20.8 - background_custom_emoji_id (:obj:`str`, optional): Custom emoji identifier of emoji chosen - by the chat for the reply header and link preview background. - - .. versionadded:: 20.8 - profile_accent_color_id (:obj:`int`, optional): Identifier of the - :class:`accent color <telegram.constants.ProfileAccentColor>` for the chat's profile - background. See profile `accent colors`_ for more details. - - .. versionadded:: 20.8 - profile_background_custom_emoji_id (:obj:`str`, optional): Custom emoji identifier of - the emoji chosen by the chat for its profile background. - - .. versionadded:: 20.8 - emoji_status_custom_emoji_id (:obj:`str`, optional): Custom emoji identifier of emoji - status of the chat or the other party in a private chat. - - .. versionadded:: 20.0 - emoji_status_expiration_date (:class:`datetime.datetime`, optional): Expiration date of - emoji status of the chat or the other party in a private chat, as a datetime object, - if any. - - |datetime_localization| - - .. versionadded:: 20.5 - bio (:obj:`str`, optional): Bio of the other party in a private chat. - has_private_forwards (:obj:`bool`, optional): :obj:`True`, if privacy settings of the other - party in the private chat allows to use ``tg://user?id=<user_id>`` links only in chats - with the user. - - .. versionadded:: 13.9 - has_restricted_voice_and_video_messages (:obj:`bool`, optional): :obj:`True`, if the - privacy settings of the other party restrict sending voice and video note messages - in the private chat. - - .. versionadded:: 20.0 - join_to_send_messages (:obj:`bool`, optional): :obj:`True`, if users need to join the - supergroup before they can send messages. - - .. versionadded:: 20.0 - join_by_request (:obj:`bool`, optional): :obj:`True`, if all users directly joining the - supergroup without using an invite link need to be approved by supergroup - administrators. - - .. versionadded:: 20.0 - description (:obj:`str`, optional): Description, for groups, supergroups and channel chats. - invite_link (:obj:`str`, optional): Primary invite link, for groups, supergroups and - channel. - pinned_message (:class:`telegram.Message`, optional): The most recent pinned message - (by sending date). - permissions (:class:`telegram.ChatPermissions`): Optional. Default chat member permissions, - for groups and supergroups. - slow_mode_delay (:obj:`int` | :class:`datetime.timedelta`, optional): For supergroups, - the minimum allowed delay between consecutive messages sent by each unprivileged user. - - .. versionchanged:: v22.2 - |time-period-input| - unrestrict_boost_count (:obj:`int`, optional): For supergroups, the minimum number of - boosts that a non-administrator user needs to add in order to ignore slow mode and chat - permissions. - - .. versionadded:: 21.0 - message_auto_delete_time (:obj:`int` | :class:`datetime.timedelta`, optional): The time - after which all messages sent to the chat will be automatically deleted; in seconds. - - .. versionadded:: 13.4 - - .. versionchanged:: v22.2 - |time-period-input| - has_aggressive_anti_spam_enabled (:obj:`bool`, optional): :obj:`True`, if aggressive - anti-spam checks are enabled in the supergroup. The field is only available to chat - administrators. - - .. versionadded:: 20.0 - has_hidden_members (:obj:`bool`, optional): :obj:`True`, if non-administrators can only - get the list of bots and administrators in the chat. - - .. versionadded:: 20.0 - has_protected_content (:obj:`bool`, optional): :obj:`True`, if messages from the chat can't - be forwarded to other chats. - - .. versionadded:: 13.9 - has_visible_history (:obj:`bool`, optional): :obj:`True`, if new chat members will have - access to old messages; available only to chat administrators. - - .. versionadded:: 20.8 - sticker_set_name (:obj:`str`, optional): For supergroups, name of group sticker set. - can_set_sticker_set (:obj:`bool`, optional): :obj:`True`, if the bot can change group the - sticker set. - custom_emoji_sticker_set_name (:obj:`str`, optional): For supergroups, the name of the - group's custom emoji sticker set. Custom emoji from this set can be used by all users - and bots in the group. - - .. versionadded:: 21.0 - linked_chat_id (:obj:`int`, optional): Unique identifier for the linked chat, i.e. the - discussion group identifier for a channel and vice versa; for supergroups and channel - chats. - location (:class:`telegram.ChatLocation`, optional): For supergroups, the location to which - the supergroup is connected. - can_send_paid_media (:obj:`bool`, optional): :obj:`True`, if paid media messages can be - sent or forwarded to the channel chat. The field is available only for channel chats. - - .. versionadded:: 21.4 - can_send_gift (:obj:`bool`, optional): :obj:`True`, if gifts can be sent to the chat. - - .. versionadded:: 21.11 - - .. deprecated:: 22.1 - Bot API 9.0 introduced :paramref:`accepted_gift_types`, replacing this argument. - Hence, this argument will be removed in future versions. - - Attributes: - id (:obj:`int`): Unique identifier for this chat. - type (:obj:`str`): Type of chat, can be either :attr:`PRIVATE`, :attr:`GROUP`, - :attr:`SUPERGROUP` or :attr:`CHANNEL`. - accent_color_id (:obj:`int`): Optional. Identifier of the - :class:`accent color <telegram.constants.AccentColor>` for the chat name and - backgrounds of the chat photo, reply header, and link preview. See `accent colors`_ - for more details. - - .. versionadded:: 20.8 - max_reaction_count (:obj:`int`): The maximum number of reactions that can be set on a - message in the chat. - - .. versionadded:: 21.2 - accepted_gift_types (:class:`telegram.AcceptedGiftTypes`): Information about types of - gifts that are accepted by the chat or by the corresponding user for private chats. - - .. versionadded:: 22.1 - title (:obj:`str`, optional): Title, for supergroups, channels and group chats. - username (:obj:`str`, optional): Username, for private chats, supergroups and channels if - available. - first_name (:obj:`str`, optional): First name of the other party in a private chat. - last_name (:obj:`str`, optional): Last name of the other party in a private chat. - is_forum (:obj:`bool`, optional): :obj:`True`, if the supergroup chat is a forum - (has topics_ enabled). - - .. versionadded:: 20.0 - photo (:class:`telegram.ChatPhoto`): Optional. Chat photo. - active_usernames (tuple[:obj:`str`]): Optional. If set, the list of all `active chat - usernames <https://telegram.org/blog/topics-in-groups-collectible-usernames\ - #collectible-usernames>`_; for private chats, supergroups and channels. - - This list is empty if the chat has no active usernames or this chat instance was not - obtained via :meth:`~telegram.Bot.get_chat`. - - .. versionadded:: 20.0 - birthdate (:class:`telegram.Birthdate`): Optional. For private chats, - the date of birth of the user. - - .. versionadded:: 21.1 - business_intro (:class:`telegram.BusinessIntro`): Optional. For private chats with - business accounts, the intro of the business. - - .. versionadded:: 21.1 - business_location (:class:`telegram.BusinessLocation`): Optional. For private chats with - business accounts, the location of the business. - - .. versionadded:: 21.1 - business_opening_hours (:class:`telegram.BusinessOpeningHours`): Optional. For private - chats with business accounts, the opening hours of the business. - - .. versionadded:: 21.1 - personal_chat (:class:`telegram.Chat`): Optional. For private chats, the personal channel - of the user. - - .. versionadded:: 21.1 - available_reactions (tuple[:class:`telegram.ReactionType`]): Optional. List of available - reactions allowed in the chat. If omitted, then all of - :const:`telegram.constants.ReactionEmoji` are allowed. - - .. versionadded:: 20.8 - background_custom_emoji_id (:obj:`str`): Optional. Custom emoji identifier of emoji chosen - by the chat for the reply header and link preview background. - - .. versionadded:: 20.8 - profile_accent_color_id (:obj:`int`): Optional. Identifier of the - :class:`accent color <telegram.constants.ProfileAccentColor>` for the chat's profile - background. See profile `accent colors`_ for more details. - - .. versionadded:: 20.8 - profile_background_custom_emoji_id (:obj:`str`): Optional. Custom emoji identifier of - the emoji chosen by the chat for its profile background. - - .. versionadded:: 20.8 - emoji_status_custom_emoji_id (:obj:`str`): Optional. Custom emoji identifier of emoji - status of the chat or the other party in a private chat. - - .. versionadded:: 20.0 - emoji_status_expiration_date (:class:`datetime.datetime`): Optional. Expiration date of - emoji status of the chat or the other party in a private chat, as a datetime object, - if any. - - |datetime_localization| - - .. versionadded:: 20.5 - bio (:obj:`str`): Optional. Bio of the other party in a private chat. - has_private_forwards (:obj:`bool`): Optional. :obj:`True`, if privacy settings of the other - party in the private chat allows to use ``tg://user?id=<user_id>`` links only in chats - with the user. - - .. versionadded:: 13.9 - has_restricted_voice_and_video_messages (:obj:`bool`): Optional. :obj:`True`, if the - privacy settings of the other party restrict sending voice and video note messages - in the private chat. - - .. versionadded:: 20.0 - join_to_send_messages (:obj:`bool`): Optional. :obj:`True`, if users need to join - the supergroup before they can send messages. - - .. versionadded:: 20.0 - join_by_request (:obj:`bool`): Optional. :obj:`True`, if all users directly joining the - supergroup without using an invite link need to be approved by supergroup - administrators. - - .. versionadded:: 20.0 - description (:obj:`str`): Optional. Description, for groups, supergroups and channel chats. - invite_link (:obj:`str`): Optional. Primary invite link, for groups, supergroups and - channel. - pinned_message (:class:`telegram.Message`): Optional. The most recent pinned message - (by sending date). - permissions (:class:`telegram.ChatPermissions`): Optional. Default chat member permissions, - for groups and supergroups. - slow_mode_delay (:obj:`int` | :class:`datetime.timedelta`): Optional. For supergroups, - the minimum allowed delay between consecutive messages sent by each unprivileged user. - - .. deprecated:: v22.2 - |time-period-int-deprecated| - unrestrict_boost_count (:obj:`int`): Optional. For supergroups, the minimum number of - boosts that a non-administrator user needs to add in order to ignore slow mode and chat - permissions. - - .. versionadded:: 21.0 - message_auto_delete_time (:obj:`int` | :class:`datetime.timedelta`): Optional. The time - after which all messages sent to the chat will be automatically deleted; in seconds. - - .. versionadded:: 13.4 - - .. deprecated:: v22.2 - |time-period-int-deprecated| - has_aggressive_anti_spam_enabled (:obj:`bool`): Optional. :obj:`True`, if aggressive - anti-spam checks are enabled in the supergroup. The field is only available to chat - administrators. - - .. versionadded:: 20.0 - has_hidden_members (:obj:`bool`): Optional. :obj:`True`, if non-administrators can only - get the list of bots and administrators in the chat. - - .. versionadded:: 20.0 - has_protected_content (:obj:`bool`): Optional. :obj:`True`, if messages from the chat can't - be forwarded to other chats. - - .. versionadded:: 13.9 - has_visible_history (:obj:`bool`): Optional. :obj:`True`, if new chat members will have - access to old messages; available only to chat administrators. - - .. versionadded:: 20.8 - sticker_set_name (:obj:`str`): Optional. For supergroups, name of Group sticker set. - can_set_sticker_set (:obj:`bool`): Optional. :obj:`True`, if the bot can change group the - sticker set. - custom_emoji_sticker_set_name (:obj:`str`): Optional. For supergroups, the name of the - group's custom emoji sticker set. Custom emoji from this set can be used by all users - and bots in the group. - - .. versionadded:: 21.0 - linked_chat_id (:obj:`int`): Optional. Unique identifier for the linked chat, i.e. the - discussion group identifier for a channel and vice versa; for supergroups and channel - chats. - location (:class:`telegram.ChatLocation`): Optional. For supergroups, the location to which - the supergroup is connected. - can_send_paid_media (:obj:`bool`): Optional. :obj:`True`, if paid media messages can be - sent or forwarded to the channel chat. The field is available only for channel chats. - - .. versionadded:: 21.4 - - .. _accent colors: https://core.telegram.org/bots/api#accent-colors - .. _topics: https://telegram.org/blog/topics-in-groups-collectible-usernames#topics-in-groups - """ - - __slots__ = ( - "_can_send_gift", - "_message_auto_delete_time", - "_slow_mode_delay", - "accent_color_id", - "accepted_gift_types", - "active_usernames", - "available_reactions", - "background_custom_emoji_id", - "bio", - "birthdate", - "business_intro", - "business_location", - "business_opening_hours", - "can_send_paid_media", - "can_set_sticker_set", - "custom_emoji_sticker_set_name", - "description", - "emoji_status_custom_emoji_id", - "emoji_status_expiration_date", - "has_aggressive_anti_spam_enabled", - "has_hidden_members", - "has_private_forwards", - "has_protected_content", - "has_restricted_voice_and_video_messages", - "has_visible_history", - "invite_link", - "join_by_request", - "join_to_send_messages", - "linked_chat_id", - "location", - "max_reaction_count", - "permissions", - "personal_chat", - "photo", - "pinned_message", - "profile_accent_color_id", - "profile_background_custom_emoji_id", - "sticker_set_name", - "unrestrict_boost_count", - ) - - def __init__( - self, - id: int, - type: str, - accent_color_id: int, - max_reaction_count: int, - title: Optional[str] = None, - username: Optional[str] = None, - first_name: Optional[str] = None, - last_name: Optional[str] = None, - is_forum: Optional[bool] = None, - photo: Optional[ChatPhoto] = None, - active_usernames: Optional[Sequence[str]] = None, - birthdate: Optional[Birthdate] = None, - business_intro: Optional["BusinessIntro"] = None, - business_location: Optional["BusinessLocation"] = None, - business_opening_hours: Optional["BusinessOpeningHours"] = None, - personal_chat: Optional["Chat"] = None, - available_reactions: Optional[Sequence[ReactionType]] = None, - background_custom_emoji_id: Optional[str] = None, - profile_accent_color_id: Optional[int] = None, - profile_background_custom_emoji_id: Optional[str] = None, - emoji_status_custom_emoji_id: Optional[str] = None, - emoji_status_expiration_date: Optional[dtm.datetime] = None, - bio: Optional[str] = None, - has_private_forwards: Optional[bool] = None, - has_restricted_voice_and_video_messages: Optional[bool] = None, - join_to_send_messages: Optional[bool] = None, - join_by_request: Optional[bool] = None, - description: Optional[str] = None, - invite_link: Optional[str] = None, - pinned_message: Optional["Message"] = None, - permissions: Optional[ChatPermissions] = None, - slow_mode_delay: Optional[TimePeriod] = None, - unrestrict_boost_count: Optional[int] = None, - message_auto_delete_time: Optional[TimePeriod] = None, - has_aggressive_anti_spam_enabled: Optional[bool] = None, - has_hidden_members: Optional[bool] = None, - has_protected_content: Optional[bool] = None, - has_visible_history: Optional[bool] = None, - sticker_set_name: Optional[str] = None, - can_set_sticker_set: Optional[bool] = None, - custom_emoji_sticker_set_name: Optional[str] = None, - linked_chat_id: Optional[int] = None, - location: Optional[ChatLocation] = None, - can_send_paid_media: Optional[bool] = None, - # tags: deprecated 22.1; bot api 9.0 - can_send_gift: Optional[bool] = None, - # temporarily optional to account for changed signature - accepted_gift_types: Optional[AcceptedGiftTypes] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__( - id=id, - type=type, - title=title, - username=username, - first_name=first_name, - last_name=last_name, - is_forum=is_forum, - api_kwargs=api_kwargs, - ) - if accepted_gift_types is None: - raise TypeError("`accepted_gift_type` is a required argument since Bot API 9.0") - - if can_send_gift is not None: - warn( - PTBDeprecationWarning( - "22.1", - build_deprecation_warning_message( - deprecated_name="can_send_gift", - new_name="accepted_gift_types", - object_type="parameter", - bot_api_version="9.0", - ), - ), - stacklevel=2, - ) - - # Required and unique to this class- - with self._unfrozen(): - self.max_reaction_count: int = max_reaction_count - self.photo: Optional[ChatPhoto] = photo - self.bio: Optional[str] = bio - self.has_private_forwards: Optional[bool] = has_private_forwards - self.description: Optional[str] = description - self.invite_link: Optional[str] = invite_link - self.pinned_message: Optional[Message] = pinned_message - self.permissions: Optional[ChatPermissions] = permissions - self._slow_mode_delay: Optional[dtm.timedelta] = to_timedelta(slow_mode_delay) - self._message_auto_delete_time: Optional[dtm.timedelta] = to_timedelta( - message_auto_delete_time - ) - self.has_protected_content: Optional[bool] = has_protected_content - self.has_visible_history: Optional[bool] = has_visible_history - self.sticker_set_name: Optional[str] = sticker_set_name - self.can_set_sticker_set: Optional[bool] = can_set_sticker_set - self.linked_chat_id: Optional[int] = linked_chat_id - self.location: Optional[ChatLocation] = location - self.join_to_send_messages: Optional[bool] = join_to_send_messages - self.join_by_request: Optional[bool] = join_by_request - self.has_restricted_voice_and_video_messages: Optional[bool] = ( - has_restricted_voice_and_video_messages - ) - self.active_usernames: tuple[str, ...] = parse_sequence_arg(active_usernames) - self.emoji_status_custom_emoji_id: Optional[str] = emoji_status_custom_emoji_id - self.emoji_status_expiration_date: Optional[dtm.datetime] = ( - emoji_status_expiration_date - ) - self.has_aggressive_anti_spam_enabled: Optional[bool] = ( - has_aggressive_anti_spam_enabled - ) - self.has_hidden_members: Optional[bool] = has_hidden_members - self.available_reactions: Optional[tuple[ReactionType, ...]] = parse_sequence_arg( - available_reactions - ) - self.accent_color_id: Optional[int] = accent_color_id - self.background_custom_emoji_id: Optional[str] = background_custom_emoji_id - self.profile_accent_color_id: Optional[int] = profile_accent_color_id - self.profile_background_custom_emoji_id: Optional[str] = ( - profile_background_custom_emoji_id - ) - self.unrestrict_boost_count: Optional[int] = unrestrict_boost_count - self.custom_emoji_sticker_set_name: Optional[str] = custom_emoji_sticker_set_name - self.birthdate: Optional[Birthdate] = birthdate - self.personal_chat: Optional[Chat] = personal_chat - self.business_intro: Optional[BusinessIntro] = business_intro - self.business_location: Optional[BusinessLocation] = business_location - self.business_opening_hours: Optional[BusinessOpeningHours] = business_opening_hours - self.can_send_paid_media: Optional[bool] = can_send_paid_media - self._can_send_gift: Optional[bool] = can_send_gift - self.accepted_gift_types: AcceptedGiftTypes = accepted_gift_types - - @property - def can_send_gift(self) -> Optional[bool]: - """ - :obj:`bool`: Optional. :obj:`True`, if gifts can be sent to the chat. - - .. deprecated:: 22.1 - As Bot API 9.0 replaces this attribute with :attr:`accepted_gift_types`, this attribute - will be removed in future versions. - - """ - warn_about_deprecated_attr_in_property( - deprecated_attr_name="can_send_gift", - new_attr_name="accepted_gift_types", - bot_api_version="9.0", - ptb_version="22.1", - stacklevel=2, - ) - return self._can_send_gift - - @property - def slow_mode_delay(self) -> Optional[Union[int, dtm.timedelta]]: - return get_timedelta_value(self._slow_mode_delay, attribute="slow_mode_delay") - - @property - def message_auto_delete_time(self) -> Optional[Union[int, dtm.timedelta]]: - return get_timedelta_value( - self._message_auto_delete_time, attribute="message_auto_delete_time" - ) - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "ChatFullInfo": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - # Get the local timezone from the bot if it has defaults - loc_tzinfo = extract_tzinfo_from_defaults(bot) - - data["emoji_status_expiration_date"] = from_timestamp( - data.get("emoji_status_expiration_date"), tzinfo=loc_tzinfo - ) - - data["photo"] = de_json_optional(data.get("photo"), ChatPhoto, bot) - data["accepted_gift_types"] = de_json_optional( - data.get("accepted_gift_types"), AcceptedGiftTypes, bot - ) - - from telegram import ( # pylint: disable=import-outside-toplevel - BusinessIntro, - BusinessLocation, - BusinessOpeningHours, - Message, - ) - - data["pinned_message"] = de_json_optional(data.get("pinned_message"), Message, bot) - data["permissions"] = de_json_optional(data.get("permissions"), ChatPermissions, bot) - data["location"] = de_json_optional(data.get("location"), ChatLocation, bot) - data["available_reactions"] = de_list_optional( - data.get("available_reactions"), ReactionType, bot - ) - data["birthdate"] = de_json_optional(data.get("birthdate"), Birthdate, bot) - data["personal_chat"] = de_json_optional(data.get("personal_chat"), Chat, bot) - data["business_intro"] = de_json_optional(data.get("business_intro"), BusinessIntro, bot) - data["business_location"] = de_json_optional( - data.get("business_location"), BusinessLocation, bot - ) - data["business_opening_hours"] = de_json_optional( - data.get("business_opening_hours"), BusinessOpeningHours, bot - ) - - return super().de_json(data=data, bot=bot) diff --git a/venv/lib/python3.12/site-packages/telegram/_chatinvitelink.py b/venv/lib/python3.12/site-packages/telegram/_chatinvitelink.py deleted file mode 100644 index cf973a2..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_chatinvitelink.py +++ /dev/null @@ -1,205 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents an invite link for a chat.""" -import datetime as dtm -from typing import TYPE_CHECKING, Optional, Union - -from telegram._telegramobject import TelegramObject -from telegram._user import User -from telegram._utils.argumentparsing import de_json_optional, to_timedelta -from telegram._utils.datetime import ( - extract_tzinfo_from_defaults, - from_timestamp, - get_timedelta_value, -) -from telegram._utils.types import JSONDict, TimePeriod - -if TYPE_CHECKING: - from telegram import Bot - - -class ChatInviteLink(TelegramObject): - """This object represents an invite link for a chat. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`invite_link`, :attr:`creator`, :attr:`creates_join_request`, - :attr:`is_primary` and :attr:`is_revoked` are equal. - - .. versionadded:: 13.4 - .. versionchanged:: 20.0 - - * The argument & attribute :attr:`creates_join_request` is now required to comply with the - Bot API. - * Comparing objects of this class now also takes :attr:`creates_join_request` into account. - - Args: - invite_link (:obj:`str`): The invite link. - creator (:class:`telegram.User`): Creator of the link. - creates_join_request (:obj:`bool`): :obj:`True`, if users joining the chat via - the link need to be approved by chat administrators. - - .. versionadded:: 13.8 - is_primary (:obj:`bool`): :obj:`True`, if the link is primary. - is_revoked (:obj:`bool`): :obj:`True`, if the link is revoked. - expire_date (:class:`datetime.datetime`, optional): Date when the link will expire or - has been expired. - - .. versionchanged:: 20.3 - |datetime_localization| - member_limit (:obj:`int`, optional): Maximum number of users that can be members of the - chat simultaneously after joining the chat via this invite link; - :tg-const:`telegram.constants.ChatInviteLinkLimit.MIN_MEMBER_LIMIT`- - :tg-const:`telegram.constants.ChatInviteLinkLimit.MAX_MEMBER_LIMIT`. - name (:obj:`str`, optional): Invite link name. - 0-:tg-const:`telegram.constants.ChatInviteLinkLimit.NAME_LENGTH` characters. - - .. versionadded:: 13.8 - pending_join_request_count (:obj:`int`, optional): Number of pending join requests - created using this link. - - .. versionadded:: 13.8 - subscription_period (:obj:`int` | :class:`datetime.timedelta`, optional): The number of - seconds the subscription will be active for before the next payment. - - .. versionadded:: 21.5 - - .. versionchanged:: v22.2 - |time-period-input| - subscription_price (:obj:`int`, optional): The amount of Telegram Stars a user must pay - initially and after each subsequent subscription period to be a member of the chat - using the link. - - .. versionadded:: 21.5 - - Attributes: - invite_link (:obj:`str`): The invite link. If the link was created by another chat - administrator, then the second part of the link will be replaced with ``'…'``. - creator (:class:`telegram.User`): Creator of the link. - creates_join_request (:obj:`bool`): :obj:`True`, if users joining the chat via - the link need to be approved by chat administrators. - - .. versionadded:: 13.8 - is_primary (:obj:`bool`): :obj:`True`, if the link is primary. - is_revoked (:obj:`bool`): :obj:`True`, if the link is revoked. - expire_date (:class:`datetime.datetime`): Optional. Date when the link will expire or - has been expired. - - .. versionchanged:: 20.3 - |datetime_localization| - member_limit (:obj:`int`): Optional. Maximum number of users that can be members - of the chat simultaneously after joining the chat via this invite link; - :tg-const:`telegram.constants.ChatInviteLinkLimit.MIN_MEMBER_LIMIT`- - :tg-const:`telegram.constants.ChatInviteLinkLimit.MAX_MEMBER_LIMIT`. - name (:obj:`str`): Optional. Invite link name. - 0-:tg-const:`telegram.constants.ChatInviteLinkLimit.NAME_LENGTH` characters. - - .. versionadded:: 13.8 - pending_join_request_count (:obj:`int`): Optional. Number of pending join requests - created using this link. - - .. versionadded:: 13.8 - subscription_period (:obj:`int` | :class:`datetime.timedelta`): Optional. The number of - seconds the subscription will be active for before the next payment. - - .. versionadded:: 21.5 - - .. deprecated:: v22.2 - |time-period-int-deprecated| - subscription_price (:obj:`int`): Optional. The amount of Telegram Stars a user must pay - initially and after each subsequent subscription period to be a member of the chat - using the link. - - .. versionadded:: 21.5 - - """ - - __slots__ = ( - "_subscription_period", - "creates_join_request", - "creator", - "expire_date", - "invite_link", - "is_primary", - "is_revoked", - "member_limit", - "name", - "pending_join_request_count", - "subscription_price", - ) - - def __init__( - self, - invite_link: str, - creator: User, - creates_join_request: bool, - is_primary: bool, - is_revoked: bool, - expire_date: Optional[dtm.datetime] = None, - member_limit: Optional[int] = None, - name: Optional[str] = None, - pending_join_request_count: Optional[int] = None, - subscription_period: Optional[TimePeriod] = None, - subscription_price: Optional[int] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - # Required - self.invite_link: str = invite_link - self.creator: User = creator - self.creates_join_request: bool = creates_join_request - self.is_primary: bool = is_primary - self.is_revoked: bool = is_revoked - - # Optionals - self.expire_date: Optional[dtm.datetime] = expire_date - self.member_limit: Optional[int] = member_limit - self.name: Optional[str] = name - self.pending_join_request_count: Optional[int] = ( - int(pending_join_request_count) if pending_join_request_count is not None else None - ) - self._subscription_period: Optional[dtm.timedelta] = to_timedelta(subscription_period) - self.subscription_price: Optional[int] = subscription_price - - self._id_attrs = ( - self.invite_link, - self.creates_join_request, - self.creator, - self.is_primary, - self.is_revoked, - ) - - self._freeze() - - @property - def subscription_period(self) -> Optional[Union[int, dtm.timedelta]]: - return get_timedelta_value(self._subscription_period, attribute="subscription_period") - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "ChatInviteLink": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - # Get the local timezone from the bot if it has defaults - loc_tzinfo = extract_tzinfo_from_defaults(bot) - - data["creator"] = de_json_optional(data.get("creator"), User, bot) - data["expire_date"] = from_timestamp(data.get("expire_date", None), tzinfo=loc_tzinfo) - - return super().de_json(data=data, bot=bot) diff --git a/venv/lib/python3.12/site-packages/telegram/_chatjoinrequest.py b/venv/lib/python3.12/site-packages/telegram/_chatjoinrequest.py deleted file mode 100644 index 048b6a8..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_chatjoinrequest.py +++ /dev/null @@ -1,209 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram ChatJoinRequest.""" -import datetime as dtm -from typing import TYPE_CHECKING, Optional - -from telegram._chat import Chat -from telegram._chatinvitelink import ChatInviteLink -from telegram._telegramobject import TelegramObject -from telegram._user import User -from telegram._utils.argumentparsing import de_json_optional -from telegram._utils.datetime import extract_tzinfo_from_defaults, from_timestamp -from telegram._utils.defaultvalue import DEFAULT_NONE -from telegram._utils.types import JSONDict, ODVInput - -if TYPE_CHECKING: - from telegram import Bot - - -class ChatJoinRequest(TelegramObject): - """This object represents a join request sent to a chat. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`chat`, :attr:`from_user` and :attr:`date` are equal. - - Note: - * Since Bot API 5.5, bots are allowed to contact users who sent a join request to a chat - where the bot is an administrator with the - :attr:`~telegram.ChatMemberAdministrator.can_invite_users` administrator right - even - if the user never interacted with the bot before. - * Telegram does not guarantee that :attr:`from_user.id <from_user>` coincides with the - ``chat_id`` of the user. Please use :attr:`user_chat_id` to contact the user in - response to their join request. - - .. versionadded:: 13.8 - .. versionchanged:: 20.1 - In Bot API 6.5 the argument :paramref:`user_chat_id` was added, which changes the position - of the optional arguments :paramref:`bio` and :paramref:`invite_link`. - - Args: - chat (:class:`telegram.Chat`): Chat to which the request was sent. - from_user (:class:`telegram.User`): User that sent the join request. - date (:class:`datetime.datetime`): Date the request was sent. - - .. versionchanged:: 20.3 - |datetime_localization| - user_chat_id (:obj:`int`): Identifier of a private chat with the user who sent the join - request. This number may have more than 32 significant bits and some programming - languages may have difficulty/silent defects in interpreting it. But it has at most 52 - significant bits, so a 64-bit integer or double-precision float type are safe for - storing this identifier. The bot can use this identifier for 5 minutes to send messages - until the join request is processed, assuming no other administrator contacted the - user. - - .. versionadded:: 20.1 - bio (:obj:`str`, optional): Bio of the user. - invite_link (:class:`telegram.ChatInviteLink`, optional): Chat invite link that was used - by the user to send the join request. - - Attributes: - chat (:class:`telegram.Chat`): Chat to which the request was sent. - from_user (:class:`telegram.User`): User that sent the join request. - date (:class:`datetime.datetime`): Date the request was sent. - - .. versionchanged:: 20.3 - |datetime_localization| - user_chat_id (:obj:`int`): Identifier of a private chat with the user who sent the join - request. This number may have more than 32 significant bits and some programming - languages may have difficulty/silent defects in interpreting it. But it has at most 52 - significant bits, so a 64-bit integer or double-precision float type are safe for - storing this identifier. The bot can use this identifier for 24 hours to send messages - until the join request is processed, assuming no other administrator contacted the - user. - - .. versionadded:: 20.1 - bio (:obj:`str`): Optional. Bio of the user. - invite_link (:class:`telegram.ChatInviteLink`): Optional. Chat invite link that was used - by the user to send the join request. - - Note: - When a user joins a *public* group via an invite link, this attribute may not - be present. However, this behavior is undocument and may be subject to change. - See `this GitHub thread <https://github.com/tdlib/telegram-bot-api/issues/428>`_ - for some discussion. - - """ - - __slots__ = ("bio", "chat", "date", "from_user", "invite_link", "user_chat_id") - - def __init__( - self, - chat: Chat, - from_user: User, - date: dtm.datetime, - user_chat_id: int, - bio: Optional[str] = None, - invite_link: Optional[ChatInviteLink] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - # Required - self.chat: Chat = chat - self.from_user: User = from_user - self.date: dtm.datetime = date - self.user_chat_id: int = user_chat_id - - # Optionals - self.bio: Optional[str] = bio - self.invite_link: Optional[ChatInviteLink] = invite_link - - self._id_attrs = (self.chat, self.from_user, self.date) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "ChatJoinRequest": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - # Get the local timezone from the bot if it has defaults - loc_tzinfo = extract_tzinfo_from_defaults(bot) - - data["chat"] = de_json_optional(data.get("chat"), Chat, bot) - data["from_user"] = de_json_optional(data.pop("from", None), User, bot) - data["date"] = from_timestamp(data.get("date", None), tzinfo=loc_tzinfo) - data["invite_link"] = de_json_optional(data.get("invite_link"), ChatInviteLink, bot) - - return super().de_json(data=data, bot=bot) - - async def approve( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.approve_chat_join_request( - chat_id=update.effective_chat.id, user_id=update.effective_user.id, *args, **kwargs - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.approve_chat_join_request`. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().approve_chat_join_request( - chat_id=self.chat.id, - user_id=self.from_user.id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def decline( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.decline_chat_join_request( - chat_id=update.effective_chat.id, user_id=update.effective_user.id, *args, **kwargs - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.decline_chat_join_request`. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().decline_chat_join_request( - chat_id=self.chat.id, - user_id=self.from_user.id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) diff --git a/venv/lib/python3.12/site-packages/telegram/_chatlocation.py b/venv/lib/python3.12/site-packages/telegram/_chatlocation.py deleted file mode 100644 index 4514b25..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_chatlocation.py +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a location to which a chat is connected.""" - -from typing import TYPE_CHECKING, Final, Optional - -from telegram import constants -from telegram._files.location import Location -from telegram._telegramobject import TelegramObject -from telegram._utils.argumentparsing import de_json_optional -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot - - -class ChatLocation(TelegramObject): - """This object represents a location to which a chat is connected. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`location` is equal. - - Args: - location (:class:`telegram.Location`): The location to which the supergroup is connected. - Can't be a live location. - address (:obj:`str`): Location address; - :tg-const:`telegram.ChatLocation.MIN_ADDRESS`- - :tg-const:`telegram.ChatLocation.MAX_ADDRESS` characters, as defined by the chat owner. - Attributes: - location (:class:`telegram.Location`): The location to which the supergroup is connected. - Can't be a live location. - address (:obj:`str`): Location address; - :tg-const:`telegram.ChatLocation.MIN_ADDRESS`- - :tg-const:`telegram.ChatLocation.MAX_ADDRESS` characters, as defined by the chat owner. - - """ - - __slots__ = ("address", "location") - - def __init__( - self, - location: Location, - address: str, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.location: Location = location - self.address: str = address - - self._id_attrs = (self.location,) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "ChatLocation": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["location"] = de_json_optional(data.get("location"), Location, bot) - - return super().de_json(data=data, bot=bot) - - MIN_ADDRESS: Final[int] = constants.LocationLimit.MIN_CHAT_LOCATION_ADDRESS - """:const:`telegram.constants.LocationLimit.MIN_CHAT_LOCATION_ADDRESS` - - .. versionadded:: 20.0 - """ - MAX_ADDRESS: Final[int] = constants.LocationLimit.MAX_CHAT_LOCATION_ADDRESS - """:const:`telegram.constants.LocationLimit.MAX_CHAT_LOCATION_ADDRESS` - - .. versionadded:: 20.0 - """ diff --git a/venv/lib/python3.12/site-packages/telegram/_chatmember.py b/venv/lib/python3.12/site-packages/telegram/_chatmember.py deleted file mode 100644 index 647c089..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_chatmember.py +++ /dev/null @@ -1,662 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram ChatMember.""" - -import datetime as dtm -from typing import TYPE_CHECKING, Final, Optional - -from telegram import constants -from telegram._telegramobject import TelegramObject -from telegram._user import User -from telegram._utils import enum -from telegram._utils.argumentparsing import de_json_optional -from telegram._utils.datetime import extract_tzinfo_from_defaults, from_timestamp -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot - - -class ChatMember(TelegramObject): - """Base class for Telegram ChatMember Objects. - Currently, the following 6 types of chat members are supported: - - * :class:`telegram.ChatMemberOwner` - * :class:`telegram.ChatMemberAdministrator` - * :class:`telegram.ChatMemberMember` - * :class:`telegram.ChatMemberRestricted` - * :class:`telegram.ChatMemberLeft` - * :class:`telegram.ChatMemberBanned` - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`user` and :attr:`status` are equal. - - Examples: - :any:`Chat Member Bot <examples.chatmemberbot>` - - .. versionchanged:: 20.0 - - * As of Bot API 5.3, :class:`ChatMember` is nothing but the base class for the subclasses - listed above and is no longer returned directly by :meth:`~telegram.Bot.get_chat`. - Therefore, most of the arguments and attributes were removed and you should no longer - use :class:`ChatMember` directly. - * The constant ``ChatMember.CREATOR`` was replaced by :attr:`~telegram.ChatMember.OWNER` - * The constant ``ChatMember.KICKED`` was replaced by :attr:`~telegram.ChatMember.BANNED` - - Args: - user (:class:`telegram.User`): Information about the user. - status (:obj:`str`): The member's status in the chat. Can be - :attr:`~telegram.ChatMember.ADMINISTRATOR`, :attr:`~telegram.ChatMember.OWNER`, - :attr:`~telegram.ChatMember.BANNED`, :attr:`~telegram.ChatMember.LEFT`, - :attr:`~telegram.ChatMember.MEMBER` or :attr:`~telegram.ChatMember.RESTRICTED`. - - Attributes: - user (:class:`telegram.User`): Information about the user. - status (:obj:`str`): The member's status in the chat. Can be - :attr:`~telegram.ChatMember.ADMINISTRATOR`, :attr:`~telegram.ChatMember.OWNER`, - :attr:`~telegram.ChatMember.BANNED`, :attr:`~telegram.ChatMember.LEFT`, - :attr:`~telegram.ChatMember.MEMBER` or :attr:`~telegram.ChatMember.RESTRICTED`. - - """ - - __slots__ = ("status", "user") - - ADMINISTRATOR: Final[str] = constants.ChatMemberStatus.ADMINISTRATOR - """:const:`telegram.constants.ChatMemberStatus.ADMINISTRATOR`""" - OWNER: Final[str] = constants.ChatMemberStatus.OWNER - """:const:`telegram.constants.ChatMemberStatus.OWNER`""" - BANNED: Final[str] = constants.ChatMemberStatus.BANNED - """:const:`telegram.constants.ChatMemberStatus.BANNED`""" - LEFT: Final[str] = constants.ChatMemberStatus.LEFT - """:const:`telegram.constants.ChatMemberStatus.LEFT`""" - MEMBER: Final[str] = constants.ChatMemberStatus.MEMBER - """:const:`telegram.constants.ChatMemberStatus.MEMBER`""" - RESTRICTED: Final[str] = constants.ChatMemberStatus.RESTRICTED - """:const:`telegram.constants.ChatMemberStatus.RESTRICTED`""" - - def __init__( - self, - user: User, - status: str, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - # Required by all subclasses - self.user: User = user - self.status: str = enum.get_member(constants.ChatMemberStatus, status, status) - - self._id_attrs = (self.user, self.status) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "ChatMember": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - _class_mapping: dict[str, type[ChatMember]] = { - cls.OWNER: ChatMemberOwner, - cls.ADMINISTRATOR: ChatMemberAdministrator, - cls.MEMBER: ChatMemberMember, - cls.RESTRICTED: ChatMemberRestricted, - cls.LEFT: ChatMemberLeft, - cls.BANNED: ChatMemberBanned, - } - - if cls is ChatMember and data.get("status") in _class_mapping: - return _class_mapping[data.pop("status")].de_json(data=data, bot=bot) - - data["user"] = de_json_optional(data.get("user"), User, bot) - if "until_date" in data: - # Get the local timezone from the bot if it has defaults - loc_tzinfo = extract_tzinfo_from_defaults(bot) - - data["until_date"] = from_timestamp(data.get("until_date"), tzinfo=loc_tzinfo) - - # This is a deprecated field that TG still returns for backwards compatibility - # Let's filter it out to speed up the de-json process - if cls is ChatMemberRestricted and data.get("can_send_media_messages") is not None: - api_kwargs = {"can_send_media_messages": data.pop("can_send_media_messages")} - return super()._de_json(data=data, bot=bot, api_kwargs=api_kwargs) - - return super().de_json(data=data, bot=bot) - - -class ChatMemberOwner(ChatMember): - """ - Represents a chat member that owns the chat - and has all administrator privileges. - - .. versionadded:: 13.7 - - Args: - user (:class:`telegram.User`): Information about the user. - is_anonymous (:obj:`bool`): :obj:`True`, if the - user's presence in the chat is hidden. - custom_title (:obj:`str`, optional): Custom title for this user. - - Attributes: - status (:obj:`str`): The member's status in the chat, - always :tg-const:`telegram.ChatMember.OWNER`. - user (:class:`telegram.User`): Information about the user. - is_anonymous (:obj:`bool`): :obj:`True`, if the user's - presence in the chat is hidden. - custom_title (:obj:`str`): Optional. Custom title for - this user. - """ - - __slots__ = ("custom_title", "is_anonymous") - - def __init__( - self, - user: User, - is_anonymous: bool, - custom_title: Optional[str] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(status=ChatMember.OWNER, user=user, api_kwargs=api_kwargs) - with self._unfrozen(): - self.is_anonymous: bool = is_anonymous - self.custom_title: Optional[str] = custom_title - - -class ChatMemberAdministrator(ChatMember): - """ - Represents a chat member that has some additional privileges. - - .. versionadded:: 13.7 - .. versionchanged:: 20.0 - - * Argument and attribute ``can_manage_voice_chats`` were renamed to - :paramref:`can_manage_video_chats` and :attr:`can_manage_video_chats` in accordance to - Bot API 6.0. - * The argument :paramref:`can_manage_topics` was added, which changes the position of the - optional argument :paramref:`custom_title`. - - .. versionchanged:: 21.1 - As of this version, :attr:`can_post_stories`, :attr:`can_edit_stories`, - and :attr:`can_delete_stories` is now required. Thus, the order of arguments had to be - changed. - - Args: - user (:class:`telegram.User`): Information about the user. - can_be_edited (:obj:`bool`): :obj:`True`, if the bot - is allowed to edit administrator privileges of that user. - is_anonymous (:obj:`bool`): :obj:`True`, if the user's - presence in the chat is hidden. - can_manage_chat (:obj:`bool`): :obj:`True`, if the administrator can access the chat event - log, get boost list, see hidden supergroup and channel members, report spam messages - and ignore slow mode. Implied by any other administrator privilege. - can_delete_messages (:obj:`bool`): :obj:`True`, if the - administrator can delete messages of other users. - can_manage_video_chats (:obj:`bool`): :obj:`True`, if the - administrator can manage video chats. - - .. versionadded:: 20.0 - can_restrict_members (:obj:`bool`): :obj:`True`, if the - administrator can restrict, ban or unban chat members. - can_promote_members (:obj:`bool`): :obj:`True`, if the administrator - can add new administrators with a subset of his own privileges or demote - administrators that he has promoted, directly or indirectly (promoted by - administrators that were appointed by the user). - can_change_info (:obj:`bool`): :obj:`True`, if the user can change - the chat title, photo and other settings. - can_invite_users (:obj:`bool`): :obj:`True`, if the user can invite - new users to the chat. - can_post_messages (:obj:`bool`, optional): :obj:`True`, if the - administrator can post messages in the channel, or access channel statistics; - for channels only. - can_edit_messages (:obj:`bool`, optional): :obj:`True`, if the - administrator can edit messages of other users and can pin - messages; for channels only. - can_pin_messages (:obj:`bool`, optional): :obj:`True`, if the user is allowed - to pin messages; for groups and supergroups only. - can_post_stories (:obj:`bool`): :obj:`True`, if the administrator can post - stories to the chat. - - .. versionadded:: 20.6 - .. versionchanged:: 21.0 - |non_optional_story_argument| - can_edit_stories (:obj:`bool`): :obj:`True`, if the administrator can edit stories posted - by other users, post stories to the chat page, pin chat stories, and access the chat's - story archive - - .. versionadded:: 20.6 - .. versionchanged:: 21.0 - |non_optional_story_argument| - can_delete_stories (:obj:`bool`): :obj:`True`, if the administrator can delete - stories posted by other users. - - .. versionadded:: 20.6 - .. versionchanged:: 21.0 - |non_optional_story_argument| - can_manage_topics (:obj:`bool`, optional): :obj:`True`, if the user is allowed - to create, rename, close, and reopen forum topics; for supergroups only. - - .. versionadded:: 20.0 - custom_title (:obj:`str`, optional): Custom title for this user. - - Attributes: - status (:obj:`str`): The member's status in the chat, - always :tg-const:`telegram.ChatMember.ADMINISTRATOR`. - user (:class:`telegram.User`): Information about the user. - can_be_edited (:obj:`bool`): :obj:`True`, if the bot - is allowed to edit administrator privileges of that user. - is_anonymous (:obj:`bool`): :obj:`True`, if the user's - presence in the chat is hidden. - can_manage_chat (:obj:`bool`): :obj:`True`, if the administrator can access the chat event - log, get boost list, see hidden supergroup and channel members, report spam messages - and ignore slow mode. Implied by any other administrator privilege. - can_delete_messages (:obj:`bool`): :obj:`True`, if the - administrator can delete messages of other users. - can_manage_video_chats (:obj:`bool`): :obj:`True`, if the - administrator can manage video chats. - - .. versionadded:: 20.0 - can_restrict_members (:obj:`bool`): :obj:`True`, if the - administrator can restrict, ban or unban chat members, or access supergroup statistics. - can_promote_members (:obj:`bool`): :obj:`True`, if the administrator can add new - administrators with a subset of their own privileges or demote administrators - that they have promoted, directly or indirectly (promoted by administrators that - were appointed by the user). - can_change_info (:obj:`bool`): :obj:`True`, if the user can change - the chat title, photo and other settings. - can_invite_users (:obj:`bool`): :obj:`True`, if the user can invite - new users to the chat. - can_post_messages (:obj:`bool`): Optional. :obj:`True`, if the - administrator can post messages in the channel or access channel statistics; - for channels only. - can_edit_messages (:obj:`bool`): Optional. :obj:`True`, if the - administrator can edit messages of other users and can pin - messages; for channels only. - can_pin_messages (:obj:`bool`): Optional. :obj:`True`, if the user is allowed - to pin messages; for groups and supergroups only. - can_post_stories (:obj:`bool`): :obj:`True`, if the administrator can post - stories to the chat. - - .. versionadded:: 20.6 - .. versionchanged:: 21.0 - |non_optional_story_argument| - can_edit_stories (:obj:`bool`): :obj:`True`, if the administrator can edit stories posted - by other users, post stories to the chat page, pin chat stories, and access the chat's - story archive - - .. versionadded:: 20.6 - .. versionchanged:: 21.0 - |non_optional_story_argument| - can_delete_stories (:obj:`bool`): :obj:`True`, if the administrator can delete - stories posted by other users. - - .. versionadded:: 20.6 - .. versionchanged:: 21.0 - |non_optional_story_argument| - can_manage_topics (:obj:`bool`): Optional. :obj:`True`, if the user is allowed - to create, rename, close, and reopen forum topics; for supergroups only - - .. versionadded:: 20.0 - custom_title (:obj:`str`): Optional. Custom title for this user. - """ - - __slots__ = ( - "can_be_edited", - "can_change_info", - "can_delete_messages", - "can_delete_stories", - "can_edit_messages", - "can_edit_stories", - "can_invite_users", - "can_manage_chat", - "can_manage_topics", - "can_manage_video_chats", - "can_pin_messages", - "can_post_messages", - "can_post_stories", - "can_promote_members", - "can_restrict_members", - "custom_title", - "is_anonymous", - ) - - def __init__( - self, - user: User, - can_be_edited: bool, - is_anonymous: bool, - can_manage_chat: bool, - can_delete_messages: bool, - can_manage_video_chats: bool, - can_restrict_members: bool, - can_promote_members: bool, - can_change_info: bool, - can_invite_users: bool, - can_post_stories: bool, - can_edit_stories: bool, - can_delete_stories: bool, - can_post_messages: Optional[bool] = None, - can_edit_messages: Optional[bool] = None, - can_pin_messages: Optional[bool] = None, - can_manage_topics: Optional[bool] = None, - custom_title: Optional[str] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(status=ChatMember.ADMINISTRATOR, user=user, api_kwargs=api_kwargs) - with self._unfrozen(): - self.can_be_edited: bool = can_be_edited - self.is_anonymous: bool = is_anonymous - self.can_manage_chat: bool = can_manage_chat - self.can_delete_messages: bool = can_delete_messages - self.can_manage_video_chats: bool = can_manage_video_chats - self.can_restrict_members: bool = can_restrict_members - self.can_promote_members: bool = can_promote_members - self.can_change_info: bool = can_change_info - self.can_invite_users: bool = can_invite_users - self.can_post_stories: bool = can_post_stories - self.can_edit_stories: bool = can_edit_stories - self.can_delete_stories: bool = can_delete_stories - # Optionals - self.can_post_messages: Optional[bool] = can_post_messages - self.can_edit_messages: Optional[bool] = can_edit_messages - self.can_pin_messages: Optional[bool] = can_pin_messages - self.can_manage_topics: Optional[bool] = can_manage_topics - self.custom_title: Optional[str] = custom_title - - -class ChatMemberMember(ChatMember): - """ - Represents a chat member that has no additional - privileges or restrictions. - - .. versionadded:: 13.7 - - Args: - user (:class:`telegram.User`): Information about the user. - until_date (:class:`datetime.datetime`, optional): Date when the user's subscription will - expire. - - .. versionadded:: 21.5 - - Attributes: - status (:obj:`str`): The member's status in the chat, - always :tg-const:`telegram.ChatMember.MEMBER`. - user (:class:`telegram.User`): Information about the user. - until_date (:class:`datetime.datetime`): Optional. Date when the user's subscription will - expire. - - .. versionadded:: 21.5 - - """ - - __slots__ = ("until_date",) - - def __init__( - self, - user: User, - until_date: Optional[dtm.datetime] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(status=ChatMember.MEMBER, user=user, api_kwargs=api_kwargs) - with self._unfrozen(): - self.until_date: Optional[dtm.datetime] = until_date - - -class ChatMemberRestricted(ChatMember): - """ - Represents a chat member that is under certain restrictions - in the chat. Supergroups only. - - .. versionadded:: 13.7 - .. versionchanged:: 20.0 - All arguments were made positional and their order was changed. - The argument can_manage_topics was added. - - .. versionchanged:: 20.5 - Removed deprecated argument and attribute ``can_send_media_messages``. - - Args: - user (:class:`telegram.User`): Information about the user. - is_member (:obj:`bool`): :obj:`True`, if the user is a - member of the chat at the moment of the request. - can_change_info (:obj:`bool`): :obj:`True`, if the user can change - the chat title, photo and other settings. - can_invite_users (:obj:`bool`): :obj:`True`, if the user can invite - new users to the chat. - can_pin_messages (:obj:`bool`): :obj:`True`, if the user is allowed - to pin messages; groups and supergroups only. - can_send_messages (:obj:`bool`): :obj:`True`, if the user is allowed - to send text messages, contacts, invoices, locations and venues. - can_send_polls (:obj:`bool`): :obj:`True`, if the user is allowed - to send polls. - can_send_other_messages (:obj:`bool`): :obj:`True`, if the user is allowed - to send animations, games, stickers and use inline bots. - can_add_web_page_previews (:obj:`bool`): :obj:`True`, if the user is - allowed to add web page previews to their messages. - can_manage_topics (:obj:`bool`): :obj:`True`, if the user is allowed to create - forum topics. - - .. versionadded:: 20.0 - until_date (:class:`datetime.datetime`): Date when restrictions - will be lifted for this user. - - .. versionchanged:: 20.3 - |datetime_localization| - can_send_audios (:obj:`bool`): :obj:`True`, if the user is allowed to send audios. - - .. versionadded:: 20.1 - can_send_documents (:obj:`bool`): :obj:`True`, if the user is allowed to send documents. - - .. versionadded:: 20.1 - can_send_photos (:obj:`bool`): :obj:`True`, if the user is allowed to send photos. - - .. versionadded:: 20.1 - can_send_videos (:obj:`bool`): :obj:`True`, if the user is allowed to send videos. - - .. versionadded:: 20.1 - can_send_video_notes (:obj:`bool`): :obj:`True`, if the user is allowed to send video - notes. - - .. versionadded:: 20.1 - can_send_voice_notes (:obj:`bool`): :obj:`True`, if the user is allowed to send voice - notes. - - .. versionadded:: 20.1 - - Attributes: - status (:obj:`str`): The member's status in the chat, - always :tg-const:`telegram.ChatMember.RESTRICTED`. - user (:class:`telegram.User`): Information about the user. - is_member (:obj:`bool`): :obj:`True`, if the user is a - member of the chat at the moment of the request. - can_change_info (:obj:`bool`): :obj:`True`, if the user can change - the chat title, photo and other settings. - can_invite_users (:obj:`bool`): :obj:`True`, if the user can invite - new users to the chat. - can_pin_messages (:obj:`bool`): :obj:`True`, if the user is allowed - to pin messages; groups and supergroups only. - can_send_messages (:obj:`bool`): :obj:`True`, if the user is allowed - to send text messages, contacts, locations and venues. - can_send_polls (:obj:`bool`): :obj:`True`, if the user is allowed - to send polls. - can_send_other_messages (:obj:`bool`): :obj:`True`, if the user is allowed - to send animations, games, stickers and use inline bots. - can_add_web_page_previews (:obj:`bool`): :obj:`True`, if the user is - allowed to add web page previews to their messages. - can_manage_topics (:obj:`bool`): :obj:`True`, if the user is allowed to create - forum topics. - - .. versionadded:: 20.0 - until_date (:class:`datetime.datetime`): Date when restrictions - will be lifted for this user. - - .. versionchanged:: 20.3 - |datetime_localization| - can_send_audios (:obj:`bool`): :obj:`True`, if the user is allowed to send audios. - - .. versionadded:: 20.1 - can_send_documents (:obj:`bool`): :obj:`True`, if the user is allowed to send documents. - - .. versionadded:: 20.1 - can_send_photos (:obj:`bool`): :obj:`True`, if the user is allowed to send photos. - - .. versionadded:: 20.1 - can_send_videos (:obj:`bool`): :obj:`True`, if the user is allowed to send videos. - - .. versionadded:: 20.1 - can_send_video_notes (:obj:`bool`): :obj:`True`, if the user is allowed to send video - notes. - - .. versionadded:: 20.1 - can_send_voice_notes (:obj:`bool`): :obj:`True`, if the user is allowed to send voice - notes. - - .. versionadded:: 20.1 - - """ - - __slots__ = ( - "can_add_web_page_previews", - "can_change_info", - "can_invite_users", - "can_manage_topics", - "can_pin_messages", - "can_send_audios", - "can_send_documents", - "can_send_messages", - "can_send_other_messages", - "can_send_photos", - "can_send_polls", - "can_send_video_notes", - "can_send_videos", - "can_send_voice_notes", - "is_member", - "until_date", - ) - - def __init__( - self, - user: User, - is_member: bool, - can_change_info: bool, - can_invite_users: bool, - can_pin_messages: bool, - can_send_messages: bool, - can_send_polls: bool, - can_send_other_messages: bool, - can_add_web_page_previews: bool, - can_manage_topics: bool, - until_date: dtm.datetime, - can_send_audios: bool, - can_send_documents: bool, - can_send_photos: bool, - can_send_videos: bool, - can_send_video_notes: bool, - can_send_voice_notes: bool, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(status=ChatMember.RESTRICTED, user=user, api_kwargs=api_kwargs) - with self._unfrozen(): - self.is_member: bool = is_member - self.can_change_info: bool = can_change_info - self.can_invite_users: bool = can_invite_users - self.can_pin_messages: bool = can_pin_messages - self.can_send_messages: bool = can_send_messages - self.can_send_polls: bool = can_send_polls - self.can_send_other_messages: bool = can_send_other_messages - self.can_add_web_page_previews: bool = can_add_web_page_previews - self.can_manage_topics: bool = can_manage_topics - self.until_date: dtm.datetime = until_date - self.can_send_audios: bool = can_send_audios - self.can_send_documents: bool = can_send_documents - self.can_send_photos: bool = can_send_photos - self.can_send_videos: bool = can_send_videos - self.can_send_video_notes: bool = can_send_video_notes - self.can_send_voice_notes: bool = can_send_voice_notes - - -class ChatMemberLeft(ChatMember): - """ - Represents a chat member that isn't currently a member of the chat, - but may join it themselves. - - .. versionadded:: 13.7 - - Args: - user (:class:`telegram.User`): Information about the user. - - Attributes: - status (:obj:`str`): The member's status in the chat, - always :tg-const:`telegram.ChatMember.LEFT`. - user (:class:`telegram.User`): Information about the user. - """ - - __slots__ = () - - def __init__( - self, - user: User, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(status=ChatMember.LEFT, user=user, api_kwargs=api_kwargs) - self._freeze() - - -class ChatMemberBanned(ChatMember): - """ - Represents a chat member that was banned in the chat and - can't return to the chat or view chat messages. - - .. versionadded:: 13.7 - - Args: - user (:class:`telegram.User`): Information about the user. - until_date (:class:`datetime.datetime`): Date when restrictions - will be lifted for this user. - - .. versionchanged:: 20.3 - |datetime_localization| - - Attributes: - status (:obj:`str`): The member's status in the chat, - always :tg-const:`telegram.ChatMember.BANNED`. - user (:class:`telegram.User`): Information about the user. - until_date (:class:`datetime.datetime`): Date when restrictions - will be lifted for this user. - - .. versionchanged:: 20.3 - |datetime_localization| - - """ - - __slots__ = ("until_date",) - - def __init__( - self, - user: User, - until_date: dtm.datetime, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(status=ChatMember.BANNED, user=user, api_kwargs=api_kwargs) - with self._unfrozen(): - self.until_date: dtm.datetime = until_date diff --git a/venv/lib/python3.12/site-packages/telegram/_chatmemberupdated.py b/venv/lib/python3.12/site-packages/telegram/_chatmemberupdated.py deleted file mode 100644 index 5aeab80..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_chatmemberupdated.py +++ /dev/null @@ -1,213 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram ChatMemberUpdated.""" -import datetime as dtm -from typing import TYPE_CHECKING, Optional, Union - -from telegram._chat import Chat -from telegram._chatinvitelink import ChatInviteLink -from telegram._chatmember import ChatMember -from telegram._telegramobject import TelegramObject -from telegram._user import User -from telegram._utils.argumentparsing import de_json_optional -from telegram._utils.datetime import extract_tzinfo_from_defaults, from_timestamp -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot - - -class ChatMemberUpdated(TelegramObject): - """This object represents changes in the status of a chat member. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`chat`, :attr:`from_user`, :attr:`date`, - :attr:`old_chat_member` and :attr:`new_chat_member` are equal. - - .. versionadded:: 13.4 - - Note: - In Python :keyword:`from` is a reserved word. Use :paramref:`from_user` instead. - - Examples: - :any:`Chat Member Bot <examples.chatmemberbot>` - - Args: - chat (:class:`telegram.Chat`): Chat the user belongs to. - from_user (:class:`telegram.User`): Performer of the action, which resulted in the change. - date (:class:`datetime.datetime`): Date the change was done in Unix time. Converted to - :class:`datetime.datetime`. - - .. versionchanged:: 20.3 - |datetime_localization| - old_chat_member (:class:`telegram.ChatMember`): Previous information about the chat member. - new_chat_member (:class:`telegram.ChatMember`): New information about the chat member. - invite_link (:class:`telegram.ChatInviteLink`, optional): Chat invite link, which was used - by the user to join the chat. For joining by invite link events only. - via_chat_folder_invite_link (:obj:`bool`, optional): :obj:`True`, if the user joined the - chat via a chat folder invite link - - .. versionadded:: 20.3 - via_join_request (:obj:`bool`, optional): :obj:`True`, if the user joined the chat after - sending a direct join request without using an invite link and being approved by - an administrator - - .. versionadded:: 21.2 - - Attributes: - chat (:class:`telegram.Chat`): Chat the user belongs to. - from_user (:class:`telegram.User`): Performer of the action, which resulted in the change. - date (:class:`datetime.datetime`): Date the change was done in Unix time. Converted to - :class:`datetime.datetime`. - - .. versionchanged:: 20.3 - |datetime_localization| - old_chat_member (:class:`telegram.ChatMember`): Previous information about the chat member. - new_chat_member (:class:`telegram.ChatMember`): New information about the chat member. - invite_link (:class:`telegram.ChatInviteLink`): Optional. Chat invite link, which was used - by the user to join the chat. For joining by invite link events only. - via_chat_folder_invite_link (:obj:`bool`): Optional. :obj:`True`, if the user joined the - chat via a chat folder invite link - - .. versionadded:: 20.3 - via_join_request (:obj:`bool`): Optional. :obj:`True`, if the user joined the chat after - sending a direct join request without using an invite link and being approved - by an administrator - - .. versionadded:: 21.2 - - """ - - __slots__ = ( - "chat", - "date", - "from_user", - "invite_link", - "new_chat_member", - "old_chat_member", - "via_chat_folder_invite_link", - "via_join_request", - ) - - def __init__( - self, - chat: Chat, - from_user: User, - date: dtm.datetime, - old_chat_member: ChatMember, - new_chat_member: ChatMember, - invite_link: Optional[ChatInviteLink] = None, - via_chat_folder_invite_link: Optional[bool] = None, - via_join_request: Optional[bool] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - # Required - self.chat: Chat = chat - self.from_user: User = from_user - self.date: dtm.datetime = date - self.old_chat_member: ChatMember = old_chat_member - self.new_chat_member: ChatMember = new_chat_member - self.via_chat_folder_invite_link: Optional[bool] = via_chat_folder_invite_link - - # Optionals - self.invite_link: Optional[ChatInviteLink] = invite_link - self.via_join_request: Optional[bool] = via_join_request - - self._id_attrs = ( - self.chat, - self.from_user, - self.date, - self.old_chat_member, - self.new_chat_member, - ) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "ChatMemberUpdated": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - # Get the local timezone from the bot if it has defaults - loc_tzinfo = extract_tzinfo_from_defaults(bot) - - data["chat"] = de_json_optional(data.get("chat"), Chat, bot) - data["from_user"] = de_json_optional(data.pop("from", None), User, bot) - data["date"] = from_timestamp(data.get("date"), tzinfo=loc_tzinfo) - data["old_chat_member"] = de_json_optional(data.get("old_chat_member"), ChatMember, bot) - data["new_chat_member"] = de_json_optional(data.get("new_chat_member"), ChatMember, bot) - data["invite_link"] = de_json_optional(data.get("invite_link"), ChatInviteLink, bot) - - return super().de_json(data=data, bot=bot) - - def _get_attribute_difference(self, attribute: str) -> tuple[object, object]: - try: - old = self.old_chat_member[attribute] - except KeyError: - old = None - - try: - new = self.new_chat_member[attribute] - except KeyError: - new = None - - return old, new - - def difference( - self, - ) -> dict[ - str, - tuple[Union[str, bool, dtm.datetime, User], Union[str, bool, dtm.datetime, User]], - ]: - """Computes the difference between :attr:`old_chat_member` and :attr:`new_chat_member`. - - Example: - .. code:: pycon - - >>> chat_member_updated.difference() - {'custom_title': ('old title', 'new title')} - - Note: - To determine, if the :attr:`telegram.ChatMember.user` attribute has changed, *every* - attribute of the user will be checked. - - .. versionadded:: 13.5 - - Returns: - dict[:obj:`str`, tuple[:class:`object`, :class:`object`]]: A dictionary mapping - attribute names to tuples of the form ``(old_value, new_value)`` - """ - # we first get the names of the attributes that have changed - # user.to_dict() is unhashable, so that needs some special casing further down - old_dict = self.old_chat_member.to_dict() - old_user_dict = old_dict.pop("user") - new_dict = self.new_chat_member.to_dict() - new_user_dict = new_dict.pop("user") - - # Generator for speed: we only need to iterate over it once - # we can't directly use the values from old_dict ^ new_dict b/c that set is unordered - attributes = (entry[0] for entry in set(old_dict.items()) ^ set(new_dict.items())) - - result = {attribute: self._get_attribute_difference(attribute) for attribute in attributes} - if old_user_dict != new_user_dict: - result["user"] = (self.old_chat_member.user, self.new_chat_member.user) - - return result # type: ignore[return-value] diff --git a/venv/lib/python3.12/site-packages/telegram/_chatpermissions.py b/venv/lib/python3.12/site-packages/telegram/_chatpermissions.py deleted file mode 100644 index e70e858..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_chatpermissions.py +++ /dev/null @@ -1,244 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram ChatPermission.""" -from typing import TYPE_CHECKING, Optional - -from telegram._telegramobject import TelegramObject -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot - - -class ChatPermissions(TelegramObject): - """Describes actions that a non-administrator user is allowed to take in a chat. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`can_send_messages`, - :attr:`can_send_polls`, :attr:`can_send_other_messages`, :attr:`can_add_web_page_previews`, - :attr:`can_change_info`, :attr:`can_invite_users`, :attr:`can_pin_messages`, - :attr:`can_send_audios`, :attr:`can_send_documents`, :attr:`can_send_photos`, - :attr:`can_send_videos`, :attr:`can_send_video_notes`, :attr:`can_send_voice_notes`, and - :attr:`can_manage_topics` are equal. - - .. versionchanged:: 20.0 - :attr:`can_manage_topics` is considered as well when comparing objects of - this type in terms of equality. - .. versionchanged:: 20.5 - - * :attr:`can_send_audios`, :attr:`can_send_documents`, :attr:`can_send_photos`, - :attr:`can_send_videos`, :attr:`can_send_video_notes` and :attr:`can_send_voice_notes` - are considered as well when comparing objects of this type in terms of equality. - * Removed deprecated argument and attribute ``can_send_media_messages``. - - - Note: - Though not stated explicitly in the official docs, Telegram changes not only the - permissions that are set, but also sets all the others to :obj:`False`. However, since not - documented, this behavior may change unbeknown to PTB. - - Args: - can_send_messages (:obj:`bool`, optional): :obj:`True`, if the user is allowed to send text - messages, contacts, locations and venues. - can_send_polls (:obj:`bool`, optional): :obj:`True`, if the user is allowed to send polls. - can_send_other_messages (:obj:`bool`, optional): :obj:`True`, if the user is allowed to - send animations, games, stickers and use inline bots. - can_add_web_page_previews (:obj:`bool`, optional): :obj:`True`, if the user is allowed to - add web page previews to their messages. - can_change_info (:obj:`bool`, optional): :obj:`True`, if the user is allowed to change the - chat title, photo and other settings. Ignored in public supergroups. - can_invite_users (:obj:`bool`, optional): :obj:`True`, if the user is allowed to invite new - users to the chat. - can_pin_messages (:obj:`bool`, optional): :obj:`True`, if the user is allowed to pin - messages. Ignored in public supergroups. - can_manage_topics (:obj:`bool`, optional): :obj:`True`, if the user is allowed - to create forum topics. If omitted defaults to the value of - :attr:`can_pin_messages`. - - .. versionadded:: 20.0 - can_send_audios (:obj:`bool`): :obj:`True`, if the user is allowed to send audios. - - .. versionadded:: 20.1 - can_send_documents (:obj:`bool`): :obj:`True`, if the user is allowed to send documents. - - .. versionadded:: 20.1 - can_send_photos (:obj:`bool`): :obj:`True`, if the user is allowed to send photos. - - .. versionadded:: 20.1 - can_send_videos (:obj:`bool`): :obj:`True`, if the user is allowed to send videos. - - .. versionadded:: 20.1 - can_send_video_notes (:obj:`bool`): :obj:`True`, if the user is allowed to send video - notes. - - .. versionadded:: 20.1 - can_send_voice_notes (:obj:`bool`): :obj:`True`, if the user is allowed to send voice - notes. - - .. versionadded:: 20.1 - - Attributes: - can_send_messages (:obj:`bool`): Optional. :obj:`True`, if the user is allowed to send text - messages, contacts, locations and venues. - can_send_polls (:obj:`bool`): Optional. :obj:`True`, if the user is allowed to send polls, - implies :attr:`can_send_messages`. - can_send_other_messages (:obj:`bool`): Optional. :obj:`True`, if the user is allowed to - send animations, games, stickers and use inline bots. - can_add_web_page_previews (:obj:`bool`): Optional. :obj:`True`, if the user is allowed to - add web page previews to their messages. - can_change_info (:obj:`bool`): Optional. :obj:`True`, if the user is allowed to change the - chat title, photo and other settings. Ignored in public supergroups. - can_invite_users (:obj:`bool`): Optional. :obj:`True`, if the user is allowed to invite - new users to the chat. - can_pin_messages (:obj:`bool`): Optional. :obj:`True`, if the user is allowed to pin - messages. Ignored in public supergroups. - can_manage_topics (:obj:`bool`): Optional. :obj:`True`, if the user is allowed - to create forum topics. If omitted defaults to the value of - :attr:`can_pin_messages`. - - .. versionadded:: 20.0 - can_send_audios (:obj:`bool`): :obj:`True`, if the user is allowed to send audios. - - .. versionadded:: 20.1 - can_send_documents (:obj:`bool`): :obj:`True`, if the user is allowed to send documents. - - .. versionadded:: 20.1 - can_send_photos (:obj:`bool`): :obj:`True`, if the user is allowed to send photos. - - .. versionadded:: 20.1 - can_send_videos (:obj:`bool`): :obj:`True`, if the user is allowed to send videos. - - .. versionadded:: 20.1 - can_send_video_notes (:obj:`bool`): :obj:`True`, if the user is allowed to send video - notes. - - .. versionadded:: 20.1 - can_send_voice_notes (:obj:`bool`): :obj:`True`, if the user is allowed to send voice - notes. - - .. versionadded:: 20.1 - - """ - - __slots__ = ( - "can_add_web_page_previews", - "can_change_info", - "can_invite_users", - "can_manage_topics", - "can_pin_messages", - "can_send_audios", - "can_send_documents", - "can_send_messages", - "can_send_other_messages", - "can_send_photos", - "can_send_polls", - "can_send_video_notes", - "can_send_videos", - "can_send_voice_notes", - ) - - def __init__( - self, - can_send_messages: Optional[bool] = None, - can_send_polls: Optional[bool] = None, - can_send_other_messages: Optional[bool] = None, - can_add_web_page_previews: Optional[bool] = None, - can_change_info: Optional[bool] = None, - can_invite_users: Optional[bool] = None, - can_pin_messages: Optional[bool] = None, - can_manage_topics: Optional[bool] = None, - can_send_audios: Optional[bool] = None, - can_send_documents: Optional[bool] = None, - can_send_photos: Optional[bool] = None, - can_send_videos: Optional[bool] = None, - can_send_video_notes: Optional[bool] = None, - can_send_voice_notes: Optional[bool] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - # Required - self.can_send_messages: Optional[bool] = can_send_messages - self.can_send_polls: Optional[bool] = can_send_polls - self.can_send_other_messages: Optional[bool] = can_send_other_messages - self.can_add_web_page_previews: Optional[bool] = can_add_web_page_previews - self.can_change_info: Optional[bool] = can_change_info - self.can_invite_users: Optional[bool] = can_invite_users - self.can_pin_messages: Optional[bool] = can_pin_messages - self.can_manage_topics: Optional[bool] = can_manage_topics - self.can_send_audios: Optional[bool] = can_send_audios - self.can_send_documents: Optional[bool] = can_send_documents - self.can_send_photos: Optional[bool] = can_send_photos - self.can_send_videos: Optional[bool] = can_send_videos - self.can_send_video_notes: Optional[bool] = can_send_video_notes - self.can_send_voice_notes: Optional[bool] = can_send_voice_notes - - self._id_attrs = ( - self.can_send_messages, - self.can_send_polls, - self.can_send_other_messages, - self.can_add_web_page_previews, - self.can_change_info, - self.can_invite_users, - self.can_pin_messages, - self.can_manage_topics, - self.can_send_audios, - self.can_send_documents, - self.can_send_photos, - self.can_send_videos, - self.can_send_video_notes, - self.can_send_voice_notes, - ) - - self._freeze() - - @classmethod - def all_permissions(cls) -> "ChatPermissions": - """ - This method returns an :class:`ChatPermissions` instance with all attributes - set to :obj:`True`. This is e.g. useful when unrestricting a chat member with - :meth:`telegram.Bot.restrict_chat_member`. - - .. versionadded:: 20.0 - - """ - return cls(*(14 * (True,))) - - @classmethod - def no_permissions(cls) -> "ChatPermissions": - """ - This method returns an :class:`ChatPermissions` instance - with all attributes set to :obj:`False`. - - .. versionadded:: 20.0 - """ - return cls(*(14 * (False,))) - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "ChatPermissions": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - api_kwargs = {} - # This is a deprecated field that TG still returns for backwards compatibility - # Let's filter it out to speed up the de-json process - if data.get("can_send_media_messages") is not None: - api_kwargs["can_send_media_messages"] = data.pop("can_send_media_messages") - - return super()._de_json(data=data, bot=bot, api_kwargs=api_kwargs) diff --git a/venv/lib/python3.12/site-packages/telegram/_choseninlineresult.py b/venv/lib/python3.12/site-packages/telegram/_choseninlineresult.py deleted file mode 100644 index e375403..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_choseninlineresult.py +++ /dev/null @@ -1,105 +0,0 @@ -#!/usr/bin/env python -# pylint: disable=too-many-arguments -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram ChosenInlineResult.""" - -from typing import TYPE_CHECKING, Optional - -from telegram._files.location import Location -from telegram._telegramobject import TelegramObject -from telegram._user import User -from telegram._utils.argumentparsing import de_json_optional -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot - - -class ChosenInlineResult(TelegramObject): - """ - Represents a result of an inline query that was chosen by the user and sent to their chat - partner. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`result_id` is equal. - - Note: - * In Python :keyword:`from` is a reserved word. Use :paramref:`from_user` instead. - * It is necessary to enable inline feedback via `@Botfather <https://t.me/BotFather>`_ in - order to receive these objects in updates. - - Args: - result_id (:obj:`str`): The unique identifier for the result that was chosen. - from_user (:class:`telegram.User`): The user that chose the result. - location (:class:`telegram.Location`, optional): Sender location, only for bots that - require user location. - inline_message_id (:obj:`str`, optional): Identifier of the sent inline message. Available - only if there is an inline keyboard attached to the message. Will be also received in - callback queries and can be used to edit the message. - query (:obj:`str`): The query that was used to obtain the result. - - Attributes: - result_id (:obj:`str`): The unique identifier for the result that was chosen. - from_user (:class:`telegram.User`): The user that chose the result. - location (:class:`telegram.Location`): Optional. Sender location, only for bots that - require user location. - inline_message_id (:obj:`str`): Optional. Identifier of the sent inline message. Available - only if there is an inline keyboard attached to the message. Will be also received in - callback queries and can be used to edit the message. - query (:obj:`str`): The query that was used to obtain the result. - - """ - - __slots__ = ("from_user", "inline_message_id", "location", "query", "result_id") - - def __init__( - self, - result_id: str, - from_user: User, - query: str, - location: Optional[Location] = None, - inline_message_id: Optional[str] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - - # Required - self.result_id: str = result_id - self.from_user: User = from_user - self.query: str = query - # Optionals - self.location: Optional[Location] = location - self.inline_message_id: Optional[str] = inline_message_id - - self._id_attrs = (self.result_id,) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "ChosenInlineResult": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - # Required - data["from_user"] = de_json_optional(data.pop("from", None), User, bot) - # Optionals - data["location"] = de_json_optional(data.get("location"), Location, bot) - - return super().de_json(data=data, bot=bot) diff --git a/venv/lib/python3.12/site-packages/telegram/_copytextbutton.py b/venv/lib/python3.12/site-packages/telegram/_copytextbutton.py deleted file mode 100644 index 4a3cdb9..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_copytextbutton.py +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram CopyTextButton.""" -from typing import Optional - -from telegram._telegramobject import TelegramObject -from telegram._utils.types import JSONDict - - -class CopyTextButton(TelegramObject): - """ - This object represents an inline keyboard button that copies specified text to the clipboard. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`text` is equal. - - .. versionadded:: 21.7 - - Args: - text (:obj:`str`): The text to be copied to the clipboard; - :tg-const:`telegram.constants.InlineKeyboardButtonLimit.MIN_COPY_TEXT`- - :tg-const:`telegram.constants.InlineKeyboardButtonLimit.MAX_COPY_TEXT` characters - - Attributes: - text (:obj:`str`): The text to be copied to the clipboard; - :tg-const:`telegram.constants.InlineKeyboardButtonLimit.MIN_COPY_TEXT`- - :tg-const:`telegram.constants.InlineKeyboardButtonLimit.MAX_COPY_TEXT` characters - - """ - - __slots__ = ("text",) - - def __init__(self, text: str, *, api_kwargs: Optional[JSONDict] = None): - super().__init__(api_kwargs=api_kwargs) - self.text: str = text - - self._id_attrs = (self.text,) - - self._freeze() diff --git a/venv/lib/python3.12/site-packages/telegram/_dice.py b/venv/lib/python3.12/site-packages/telegram/_dice.py deleted file mode 100644 index a549aef..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_dice.py +++ /dev/null @@ -1,160 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram Dice.""" -from typing import Final, Optional - -from telegram import constants -from telegram._telegramobject import TelegramObject -from telegram._utils.types import JSONDict - - -class Dice(TelegramObject): - """ - This object represents an animated emoji with a random value for currently supported base - emoji. (The singular form of "dice" is "die". However, PTB mimics the Telegram API, which uses - the term "dice".) - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`value` and :attr:`emoji` are equal. - - Note: - If :attr:`emoji` is :tg-const:`telegram.Dice.DARTS`, a value of 6 currently - represents a bullseye, while a value of 1 indicates that the dartboard was missed. - However, this behaviour is undocumented and might be changed by Telegram. - - If :attr:`emoji` is :tg-const:`telegram.Dice.BASKETBALL`, a value of 4 or 5 - currently score a basket, while a value of 1 to 3 indicates that the basket was missed. - However, this behaviour is undocumented and might be changed by Telegram. - - If :attr:`emoji` is :tg-const:`telegram.Dice.FOOTBALL`, a value of 4 to 5 - currently scores a goal, while a value of 1 to 3 indicates that the goal was missed. - However, this behaviour is undocumented and might be changed by Telegram. - - If :attr:`emoji` is :tg-const:`telegram.Dice.BOWLING`, a value of 6 knocks - all the pins, while a value of 1 means all the pins were missed. - However, this behaviour is undocumented and might be changed by Telegram. - - If :attr:`emoji` is :tg-const:`telegram.Dice.SLOT_MACHINE`, each value - corresponds to a unique combination of symbols, which - can be found in our - :wiki:`wiki <Code-snippets#map-a-slot-machine-dice-value-to-the-corresponding-symbols>`. - However, this behaviour is undocumented and might be changed by Telegram. - - .. - In args, some links for limits of `value` intentionally point to constants for only - one emoji of a group to avoid duplication. For example, maximum value for Dice, Darts and - Bowling is linked to a constant for Bowling. - - Args: - value (:obj:`int`): Value of the dice. - :tg-const:`telegram.Dice.MIN_VALUE`-:tg-const:`telegram.Dice.MAX_VALUE_BOWLING` - for :tg-const:`telegram.Dice.DICE`, :tg-const:`telegram.Dice.DARTS` and - :tg-const:`telegram.Dice.BOWLING` base emoji, - :tg-const:`telegram.Dice.MIN_VALUE`-:tg-const:`telegram.Dice.MAX_VALUE_BASKETBALL` - for :tg-const:`telegram.Dice.BASKETBALL` and :tg-const:`telegram.Dice.FOOTBALL` - base emoji, - :tg-const:`telegram.Dice.MIN_VALUE`-:tg-const:`telegram.Dice.MAX_VALUE_SLOT_MACHINE` - for :tg-const:`telegram.Dice.SLOT_MACHINE` base emoji. - emoji (:obj:`str`): Emoji on which the dice throw animation is based. - - Attributes: - value (:obj:`int`): Value of the dice. - :tg-const:`telegram.Dice.MIN_VALUE`-:tg-const:`telegram.Dice.MAX_VALUE_BOWLING` - for :tg-const:`telegram.Dice.DICE`, :tg-const:`telegram.Dice.DARTS` and - :tg-const:`telegram.Dice.BOWLING` base emoji, - :tg-const:`telegram.Dice.MIN_VALUE`-:tg-const:`telegram.Dice.MAX_VALUE_BASKETBALL` - for :tg-const:`telegram.Dice.BASKETBALL` and :tg-const:`telegram.Dice.FOOTBALL` - base emoji, - :tg-const:`telegram.Dice.MIN_VALUE`-:tg-const:`telegram.Dice.MAX_VALUE_SLOT_MACHINE` - for :tg-const:`telegram.Dice.SLOT_MACHINE` base emoji. - emoji (:obj:`str`): Emoji on which the dice throw animation is based. - - """ - - __slots__ = ("emoji", "value") - - def __init__(self, value: int, emoji: str, *, api_kwargs: Optional[JSONDict] = None): - super().__init__(api_kwargs=api_kwargs) - self.value: int = value - self.emoji: str = emoji - - self._id_attrs = (self.value, self.emoji) - - self._freeze() - - DICE: Final[str] = constants.DiceEmoji.DICE - """:const:`telegram.constants.DiceEmoji.DICE`""" - DARTS: Final[str] = constants.DiceEmoji.DARTS - """:const:`telegram.constants.DiceEmoji.DARTS`""" - BASKETBALL: Final[str] = constants.DiceEmoji.BASKETBALL - """:const:`telegram.constants.DiceEmoji.BASKETBALL`""" - FOOTBALL: Final[str] = constants.DiceEmoji.FOOTBALL - """:const:`telegram.constants.DiceEmoji.FOOTBALL`""" - SLOT_MACHINE: Final[str] = constants.DiceEmoji.SLOT_MACHINE - """:const:`telegram.constants.DiceEmoji.SLOT_MACHINE`""" - BOWLING: Final[str] = constants.DiceEmoji.BOWLING - """ - :const:`telegram.constants.DiceEmoji.BOWLING` - - .. versionadded:: 13.4 - """ - ALL_EMOJI: Final[list[str]] = list(constants.DiceEmoji) - """list[:obj:`str`]: A list of all available dice emoji.""" - - MIN_VALUE: Final[int] = constants.DiceLimit.MIN_VALUE - """:const:`telegram.constants.DiceLimit.MIN_VALUE` - - .. versionadded:: 20.0 - """ - - MAX_VALUE_BOWLING: Final[int] = constants.DiceLimit.MAX_VALUE_BOWLING - """:const:`telegram.constants.DiceLimit.MAX_VALUE_BOWLING` - - .. versionadded:: 20.0 - """ - - MAX_VALUE_DARTS: Final[int] = constants.DiceLimit.MAX_VALUE_DARTS - """:const:`telegram.constants.DiceLimit.MAX_VALUE_DARTS` - - .. versionadded:: 20.0 - """ - - MAX_VALUE_DICE: Final[int] = constants.DiceLimit.MAX_VALUE_DICE - """:const:`telegram.constants.DiceLimit.MAX_VALUE_DICE` - - .. versionadded:: 20.0 - """ - - MAX_VALUE_BASKETBALL: Final[int] = constants.DiceLimit.MAX_VALUE_BASKETBALL - """:const:`telegram.constants.DiceLimit.MAX_VALUE_BASKETBALL` - - .. versionadded:: 20.0 - """ - - MAX_VALUE_FOOTBALL: Final[int] = constants.DiceLimit.MAX_VALUE_FOOTBALL - """:const:`telegram.constants.DiceLimit.MAX_VALUE_FOOTBALL` - - .. versionadded:: 20.0 - """ - - MAX_VALUE_SLOT_MACHINE: Final[int] = constants.DiceLimit.MAX_VALUE_SLOT_MACHINE - """:const:`telegram.constants.DiceLimit.MAX_VALUE_SLOT_MACHINE` - - .. versionadded:: 20.0 - """ diff --git a/venv/lib/python3.12/site-packages/telegram/_files/__init__.py b/venv/lib/python3.12/site-packages/telegram/_files/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index b952e9dff6f83a1a7f2f5bb00ac6b30395ac28b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208 zcmZ8a%L>9U5KOFs2>lQb?V?`AlV^V+#CC0id6Xor6hFk9cfZBY@GeMiJ(-*Y2WEF> znPH!4x*!4X`?Zey6~{k@X}H`-PnPuXAa)Ym5Hq8J+9(9Yz3X6aidLca4m?V%ELWNH zqBx_?N^{ZD@DeR_s5_A22u<&6qc{0#4NiE>8eW`vg}*kilaRqPCbaO3<xM}%x5|{Q T#GRdm|1{7=@kuD9HVNtrT6#Kp diff --git a/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/_basemedium.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/_basemedium.cpython-312.pyc deleted file mode 100644 index 102ba3489c59602a5b02c9dbe57ebfcff0952a6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3349 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 F^*=_VhqM3y diff --git a/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/_basethumbedmedium.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/_basethumbedmedium.cpython-312.pyc deleted file mode 100644 index b73955a8514323d8aa0d809cf31edcdb9fd8f4b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3642 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 diff --git a/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/_inputstorycontent.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/_inputstorycontent.cpython-312.pyc deleted file mode 100644 index dce4ce80ae71e453ea0f83183910d061550d47b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7917 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 diff --git a/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/animation.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/animation.cpython-312.pyc deleted file mode 100644 index 4016320f187ba070ffe0f0fb6c5d261a48063dd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4790 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 Sz4T>G%iS$ZeL;{=0{;#04N;{4 diff --git a/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/audio.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/audio.cpython-312.pyc deleted file mode 100644 index 399ef1cc1010cc7e6c4de0c5a0c4f9ac51c9f12c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4962 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 be3v{A-w(-|{qzqFBX@i3$xjIan&CeHxN3_A diff --git a/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/chatphoto.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/chatphoto.cpython-312.pyc deleted file mode 100644 index 29f76405c175f100328fc541c4a46cea49be2e46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6651 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 H<|h9QvWQP+ diff --git a/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/contact.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/contact.cpython-312.pyc deleted file mode 100644 index c3ef498bfc9bf6188482e7baeaf96f8ebd078ba2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2427 zcmd5-&2Jk;6rZuZ_S$jM&$LNs=~NA++cvh^-XcKsLqhGrMQSCGg*4ghj+1Hk!_1CT z5{%SCB@&4W^?;fKLcMUP%3r~iODm9wR;m;UIB-EODWd9$_jbKb3PeJ1VJyFW@6CH} z=Kbc)n{S4PD+I<bUwk-!54ayt$cE8pHqHTam$;-!T<YdL>gSp{ihSP7`-Ns9;R~MO z7n?;&a^x-I8n=jB6om)*G)A+uShCEeb64kO#Qf0hc!D`$plumM%nn#Mdrdf+>3Lf- zCE7|vBG53yt_n}gDcfh~(c00qpE00CWAk!b%P_D#;72m6%SjlVy>#Vr<AQXwldhlA z9erV=1<c2gk|0eAY2{qn%)7Z}p-k}SR^7Z?_?)_iFdzxTEeW9G;NzOWl@hKz&{cpl zQP-+2lNNP{ZtZB6m&pgTS-C>2;keY_y8R`9kpR%o_Ju^-^I_1(1hTAD7>qQXh=nac z27q%sI|5J?+WBo;*|Pwn444+mPpriI9ov(7vBs|62>YP^je8Ot;E$v$lyF(%c9Kb4 zMo7h`ZLQVxOtK{&bo^PNW*DrW*!A~zR?S7zNg&+mR#SFt8WNnIiL{!rrn7^4HA;<G z8m~5RZAler9@xIv)-f?*XtL=BQ2f>FBnz{u*t#&<{>i-)3B{$GEhz&%vyC%aG5{*j zvL%rX21U8Kn+3;KgJ78W3&GC1u1t%Sxwf{MJsWng*azpG93qIVQ2BV;Hd{Ck0W+xK zG~{eYi~k?saK70+tZg~ze+KwA&i@YZ7lQpqz%3)LY?ftQ9@JV~-CF2zsb590k(__y zK8-7OTk`8SY`7f?JF7C0l#vV}sUjHx;uL}4pzw#rko-5k2Iez*muUE=W2Mw3x1kev zi(k<PXbXc9o%LqY9ca6RW1M7kb08H4QXZsDj{->9>ZEIcR2o>4YlE3g2aSz_4JML| zF1fZR<2Sz#`Ya`j#L6|)FvwOVHlj{jsMzFO22yh#=izp2i%eXGJIS&8L~)6?ln_h8 zGUGxdyw<i(37p``llI7YggeEi1mouOpgte^qVC%|TBu(LosN$$OI`Qhm8nQe=ekf+ zZg?Z`LK_-leL(~Zbx+RL+lv~y@|oJH)AdMdG1a!6>-L=3^se)k^gvFYGHBcFMYRhS zU)q_yR$1DoK^wgT<k?N~bT287tdt&^WA`pSG{?R(>pvczy!YO>hfgmTzB9+y4q3~E zPj;*yI|ZMSwWCw;sjf|;va&w$^7j)b9!;EhIF9O(b+h_ub)|ZHWCKDIE8l1|tRVy& zdnJHf;XHk8fv<9ouS0*P#JL+fpa$F`FVqp|YB$7CSVD0g`k}&tNz#dj``9|d^EkJt z+6Pk+7UP?0KU!h^BxC|7mVi9FMV{pL7-sJ{+4VNPd9ha|lgHK$zp{4dNN;%5*x%bp zj@N$O1>E|+@t%R2A{ia)m5?*Z-UF-W@4VhCqf{ZgCsvQ#IoKOQsY-T^t>#xg%A$-O zTz&V^-lM-`s3!!78p}4*uuOFTgt({|+cKC-a~sQ!zQ!{yeUBC1mv}T&)_6xtFRFpB zh*B^x&HE%>0P}uszLvuKhMEKs0f`upUY=6=<S3yR>0|QJPvp#Fa{Os=itb+yek1Tn GBK!fDPMs$J diff --git a/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/document.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/document.cpython-312.pyc deleted file mode 100644 index 876485534e8041fb5f96a46f9310dfd0fc6a4c3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3318 zcmeHJ&5smC6tAA|p8ax{U36Utg&@$l+ank_OoWJwnk8Y^ge8$V(AzUrvs2I?Lsic% zv(AA7iI8B7i3SeFqlv-4!GFMuL=T%zNJxwaFJ{)oKsfoTx_g!Zm4k4zcBlHis#mYx z`@L6H?}wqGB7*k&*B>`t8b;_B$s{cs6Pxou+(ZOb5Yb4=(cDxerAa#Nq}@y<qv(v2 zb#s-RqO(rkEmR5`N}&%B$z4SxPcygEk-m!FE*SdS>|%on?E0kTP+ar9z-FGnwuk-d z1zHPm(69r{X_Heyy#QwLB6a98w_SYFueDqlG=GyC4J|AzGy~>)wgdE-^{y@GVx#3& zDLG9EYq>D0f7tK?{|sBBQvB4Jh53`L7Stk(qJA`HHaQTVfWs73G;lgav`U(!Dj6L` ze`JWHN#-k!WNDV<;FqV+Pr@ov=utXQc{Nr9s-UO=pma&qhp(Z!Mh35rREpQoWvw!B z1{uR)A#u$9IfszKCkCSrhh^$fZacWn99qQC4%h<w&89CX!GVvP(p52ySA15Z*rh_) z%Tz*3u-zieR||z<7S-Yf1ve<D1LP2qnqvzP<}xU5)8=*+;=?=~Q0^)zdZ}eQENGi} zan+Bb^*76va)_&7gmN%UEt|$nZbKQzWjhFXc}Y59wLEsIMJ+~_Fj$}@W9v*4uTU-^ zxV47uEmKl1<HK*7N0fGqJDj@y3MEz`<866<Ks%9JC-|}`$5L2%4C?WLG5}g$5&>T_ z%6N`I60tg?9M^pwxi9UR#;XlhYv3AWW0m4oj4Sb1J;%36PpiZp)^Q3F(kr!%*_-Zn z?TNk5Dwi>U^RFfV9HO-q+G-SVxv^|=Phq<h0|sC}14>3&Izw2!4!C;(uKIy6@vQCb z2l{Dmp6P)nH+T%VX~?zsw3YD!XUhx@o^oADLM{?oXC8#S+Kw!w9;Cn)E-u(<1?}cP zYdt-8`aP^9R8~g7;%94ChzmI6iM`AVmip{{AHs{31f+De9Z<1lm&zf}W)7@Yr=YwP z#8-~lyFU8WB?lJ#g#1%$pR%%-4>DqKmnkgz2Dg&jCL~Gm!*L$NDPh$X82W!Uzldyx zYan?%%;%TQeOjMuHuq`%@7dg^?!{-bkqUKnNaa-#>b;v_9$w|5-DK9qRU0nuFt3Cd z35ONYdmp$CuP2u!ORPs8<xuaPK0W|bwLEmPY4DS@EIc;9fbL7}CJNviwd;ir`V@+s zj@C(avYlKf|DAR_E_yW7K^Kw&C|LmC+cA9vly@>6WW_}dXh{Q?Nkj>hO9b6cMZAXE zXb(DsgtiKW(>YixM=qz&p;gUD%^O)h2!eb_c2I>OJ|a8mi;)ep@BmOA7A%W-EU>Il zhxfA1{Wa<-Borow9%ck}>W?YvLG^@6SZ}H8&9a1)k=K%JS04GLhVRmnYX@Sblq7>F zC70lg2w3eR<ul1cNO@_6dMhP|RZGow(D1#t%tMDuf(3M@Y1b~wvZJ@UWXVv95=n}; zW}A<}_G_cbPG;iaEDVdY&^^3@?r%r>@b&zi!Yk|JQ|nX4`u1J&|K;7?0i;jfM>)ON z9Y(`rpPj#c{->dx8z`+Gy*GX2+Q}R9>(S>y9)=#saW(l!IsMJZ@$~oE6ZyQ6nTKW! zN_=Hf0=`Adipo-;2Q5pMJMm23vcP;50!ujXt^%2cVuH&o2-EP|aG5h4syC#Z3x{H? zYt(Tp%h31)ObMBo@9^zXs*rS3a^ePb53iz))ShgidrCv2Z(Nz{4x+sW*7xj}|He#r zWFmXCJBALLe{2Kl-spHYD@Sr@az{5WsRA0`aclPTV_jWx#e^G>++e~DNp4tjb9c7w zOO#IRy!FwY@qG`Z<_!ehCfF0%IByjBtH6Xgc$b;C9J%~jk{f0eUDK*U@vV*{C9W#I zxjYl$<dcF?kqW0*Ar?+-&9?&P2vffPA_7uE^ey7Mq$v`!M}@be_#Ef211rH4d!g&5 lHBH;thqP1LT{QJ8I&l}3?xKVDbH}u!KaTAF6Tw$$`3pxd!<7I4 diff --git a/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/file.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/file.cpython-312.pyc deleted file mode 100644 index 85994f5051f4ec65ba653bb7ad512150577cfbcd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16498 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 J;OLii@?QvbZxH|h diff --git a/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/inputfile.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/inputfile.cpython-312.pyc deleted file mode 100644 index 7c63e6376849b5483ba0095b1ad941bcc2c46f6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6096 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 diff --git a/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/inputmedia.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/inputmedia.cpython-312.pyc deleted file mode 100644 index 153b01fb0ae94a6f9943e70142b69061532fc6c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37794 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 diff --git a/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/inputprofilephoto.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/inputprofilephoto.cpython-312.pyc deleted file mode 100644 index 03c6405e85221d017d826563e65edb145e2e0419..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5261 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 diff --git a/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/inputsticker.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/inputsticker.cpython-312.pyc deleted file mode 100644 index 23ab9bc91523980048f325613d51a5afc98cf7b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5270 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 L3x7xaUkLsuzULeo diff --git a/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/location.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/location.cpython-312.pyc deleted file mode 100644 index edea983bb8a9a0162cd6e59c9c7e890cfc9bfbe9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5018 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 QgdzyywO@Qi@XJO12YM=cJOBUy diff --git a/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/photosize.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/photosize.cpython-312.pyc deleted file mode 100644 index bf90935ff0496dad395e9f5cf69a664a43f286e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2598 zcmeHJ&5u+?5brlLZ@zYi&qcunX$4mvftdg?F%vNY8x0T_BWPp}ynQp>v(xPR7`l6Q znRN~vNQ6Y=M`GY$ym>I|$-94nC*o!E5)%@`!Hb!7F%V8x^_ve=<Zfb5re5_|RsE{! zRlOfer6Pgx+t(kqiW7wVf|KE}2h7GvU~UmcYJ^!V<y%3jma>pf`{^K4%NRc6+d;OL zwMdG*MVNh^uq@B4rV|;pTsP<BS7tA?grY&jIzFe3DAb+^74<?I)i3jgrn=>6DtTLS z#X}7{^aA(!g7gCVPAk&Ud9lLFzoJOTiu32%T127e13%%O^b~)aGtmif>&*FcbF-qM z8;SaaZXQfF-UsF*K*UMS0#qqx)zU0g%M=KkWNDW9%3?OR!G4?Nc$VeiU*N#)f_tn8 zTpqdR<PFla*u?eCwZaW@)v6WG6Q>jxMwWWtX9zKf2k;(47KNNDKtrP@pll;J8cATA z!sivGMPrdm@JA=8ho11u#Uh1q&bUe8C5@hJ_?`kUNpxn=_M}$_zlxA*E(3FlU+H+h z(A_e<unY?R?Ya>T@lb+s$r&}*4pD(>xRA8!X)UYsXq(#!#gz_s1)HZ}fjK#_?u1-W zRU-;*HHQVG2dbd9I<K^xcdGO>gTRWW0B}vfYf#|HLv*<%8ZFv@WT<o6QD6nQghk7t zA9-vf6(z$x$>9VVXVjEO+kdt2Z@S+zmQ%p^G!sU$P!%9lopw7Km;;ufPUQs<xFrmb z0L}}U0mDSI3GNFutw&mojY2`EyzpgM|0lAip;;D8w}v1@sL_EYyQtY2Yk(jvwDc2C zCR^j9#zQ9a27y7jhiEi>m#Xwl2uG5ekV*Bf<^aVw<pd;wsCQuD|0w?#qYT+IEScpe zN7;ngNyXVDYhv5v*&I~VqSqGg;<5*?c$_miBv`!ZudkadKvk4^AaP-oW)k~LBMStF z1%Kqz@Zb0X$d}eFqT!j0o4FqO1lmr|>ZN*iFZ-Rf3MCYWMSA4&upuQ&hOQ3ySMWr- zM_iO_MlS=i!EGqp=C_(k_AJsR`^XWZtYv6q7vV0hTuomj%a)Uxb21WoA(4|vN=Oid zW5+fW11{sd>xxil*NqEM4x2Js;o%s(laDis`_0E>j2ttT23K8EzFk+L%dkkmxb~=B zX+;6A1fEt)mD#A#2_V;0MGqR`;X!XWJS>e|R+f0URPjZ<((dY36do%dIa*Od^TTbg zvFI)E@$HI>fl(FHaIgxL+g-T@)URwCwXO0HT@}{VyFeaZBlo9BVbjgro&3(Vsp++8 zXYHB2YtO#WFOb5n`@}93`;%nTwofnJy!2CP&pJsLX6`<}@5b!MXV&(<1dp>1a<KFO z*Ujc5g&z54^YQc#_K9rHvF4l!^lAu&6}(z>-Q*hq_(|8r9yZv?xh{(u#__K5p~?cA zhSn0Np^Qn4y~HFjkmAz7!wv5HuIpHGJ8UUT!8ha-p2`i$G;S;cd3c?yr=GL({a4A> z{nt+Sw~+k@`lapm3~&d_zi$QZ?$)WkjVoEQYj;0~T%K&%-Y+0mB(OVy+$5RWef!ks z$A`Cf?798HovE1zC}N!e*#LEk33E<f?u1F4)!nuT7YvSgdKmF?60@>fhfkcqeBwyV z>v+fbL`Mr>mEk&9i31SYw?yti9f<W&{<XxVuge!<icU}zNIz{^*7^*w&RX}#^gVLy TXL9g<_NX=U*~A|N9!A2S6_?zv diff --git a/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/sticker.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/sticker.cpython-312.pyc deleted file mode 100644 index d32d7157a0b4f3ba3af55777cc50fb93652bcdb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15974 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 J;_zaV_#Y`8_}u^i diff --git a/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/venue.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/venue.cpython-312.pyc deleted file mode 100644 index 8fdb1fafb459ee6ede4784ffd7ce4f00cc0304fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4260 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 diff --git a/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/video.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/video.cpython-312.pyc deleted file mode 100644 index a422f3eba4b87ac4cd7a8942c213d3b8bf7be28c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6759 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 G<^K!j8b62t diff --git a/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/videonote.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/videonote.cpython-312.pyc deleted file mode 100644 index b266799396a520549d90dcdb24bc04340518c1de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4093 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 diff --git a/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/voice.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_files/__pycache__/voice.cpython-312.pyc deleted file mode 100644 index e8a2db1bef435bf28dae63cc883d2210841bccab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3560 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 K>X!t+TG=<q!QN;9 diff --git a/venv/lib/python3.12/site-packages/telegram/_files/_basemedium.py b/venv/lib/python3.12/site-packages/telegram/_files/_basemedium.py deleted file mode 100644 index 4dd76b1..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_files/_basemedium.py +++ /dev/null @@ -1,100 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""Common base class for media objects""" -from typing import TYPE_CHECKING, Optional - -from telegram._telegramobject import TelegramObject -from telegram._utils.defaultvalue import DEFAULT_NONE -from telegram._utils.types import JSONDict, ODVInput - -if TYPE_CHECKING: - from telegram import File - - -class _BaseMedium(TelegramObject): - """Base class for objects representing the various media file types. - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`file_unique_id` is equal. - - Args: - file_id (:obj:`str`): Identifier for this file, which can be used to download - or reuse the file. - file_unique_id (:obj:`str`): Unique identifier for this file, which - is supposed to be the same over time and for different bots. - Can't be used to download or reuse the file. - file_size (:obj:`int`, optional): File size. - - Attributes: - file_id (:obj:`str`): File identifier. - file_unique_id (:obj:`str`): Unique identifier for this file, which - is supposed to be the same over time and for different bots. - Can't be used to download or reuse the file. - file_size (:obj:`int`): Optional. File size. - - - """ - - __slots__ = ("file_id", "file_size", "file_unique_id") - - def __init__( - self, - file_id: str, - file_unique_id: str, - file_size: Optional[int] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - - # Required - self.file_id: str = str(file_id) - self.file_unique_id: str = str(file_unique_id) - # Optionals - self.file_size: Optional[int] = file_size - - self._id_attrs = (self.file_unique_id,) - - async def get_file( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "File": - """Convenience wrapper over :meth:`telegram.Bot.get_file` - - For the documentation of the arguments, please see :meth:`telegram.Bot.get_file`. - - Returns: - :class:`telegram.File` - - Raises: - :class:`telegram.error.TelegramError` - - """ - return await self.get_bot().get_file( - file_id=self.file_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) diff --git a/venv/lib/python3.12/site-packages/telegram/_files/_basethumbedmedium.py b/venv/lib/python3.12/site-packages/telegram/_files/_basethumbedmedium.py deleted file mode 100644 index 2008475..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_files/_basethumbedmedium.py +++ /dev/null @@ -1,101 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""Common base class for media objects with thumbnails""" -from typing import TYPE_CHECKING, Optional, TypeVar - -from telegram._files._basemedium import _BaseMedium -from telegram._files.photosize import PhotoSize -from telegram._utils.argumentparsing import de_json_optional -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot - -# pylint: disable=invalid-name -ThumbedMT_co = TypeVar("ThumbedMT_co", bound="_BaseThumbedMedium", covariant=True) - - -class _BaseThumbedMedium(_BaseMedium): - """ - Base class for objects representing the various media file types that may include a thumbnail. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`file_unique_id` is equal. - - Args: - file_id (:obj:`str`): Identifier for this file, which can be used to download - or reuse the file. - file_unique_id (:obj:`str`): Unique identifier for this file, which - is supposed to be the same over time and for different bots. - Can't be used to download or reuse the file. - file_size (:obj:`int`, optional): File size. - thumbnail (:class:`telegram.PhotoSize`, optional): Thumbnail as defined by the sender. - - .. versionadded:: 20.2 - - Attributes: - file_id (:obj:`str`): File identifier. - file_unique_id (:obj:`str`): Unique identifier for this file, which - is supposed to be the same over time and for different bots. - Can't be used to download or reuse the file. - file_size (:obj:`int`): Optional. File size. - thumbnail (:class:`telegram.PhotoSize`): Optional. Thumbnail as defined by the sender. - - .. versionadded:: 20.2 - - """ - - __slots__ = ("thumbnail",) - - def __init__( - self, - file_id: str, - file_unique_id: str, - file_size: Optional[int] = None, - thumbnail: Optional[PhotoSize] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__( - file_id=file_id, - file_unique_id=file_unique_id, - file_size=file_size, - api_kwargs=api_kwargs, - ) - - self.thumbnail: Optional[PhotoSize] = thumbnail - - @classmethod - def de_json( - cls: type[ThumbedMT_co], data: JSONDict, bot: Optional["Bot"] = None - ) -> ThumbedMT_co: - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - # In case this wasn't already done by the subclass - if not isinstance(data.get("thumbnail"), PhotoSize): - data["thumbnail"] = de_json_optional(data.get("thumbnail"), PhotoSize, bot) - - api_kwargs = {} - # This is a deprecated field that TG still returns for backwards compatibility - # Let's filter it out to speed up the de-json process - if data.get("thumb") is not None: - api_kwargs["thumb"] = data.pop("thumb") - - return super()._de_json(data=data, bot=bot, api_kwargs=api_kwargs) diff --git a/venv/lib/python3.12/site-packages/telegram/_files/_inputstorycontent.py b/venv/lib/python3.12/site-packages/telegram/_files/_inputstorycontent.py deleted file mode 100644 index dd8f25c..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_files/_inputstorycontent.py +++ /dev/null @@ -1,166 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains objects that represent paid media in Telegram.""" - -import datetime as dtm -from typing import Final, Optional, Union - -from telegram import constants -from telegram._files.inputfile import InputFile -from telegram._telegramobject import TelegramObject -from telegram._utils import enum -from telegram._utils.argumentparsing import to_timedelta -from telegram._utils.files import parse_file_input -from telegram._utils.types import FileInput, JSONDict - - -class InputStoryContent(TelegramObject): - """This object describes the content of a story to post. Currently, it can be one of: - - * :class:`telegram.InputStoryContentPhoto` - * :class:`telegram.InputStoryContentVideo` - - .. versionadded:: 22.1 - - Args: - type (:obj:`str`): Type of the content. - - Attributes: - type (:obj:`str`): Type of the content. - """ - - __slots__ = ("type",) - - PHOTO: Final[str] = constants.InputStoryContentType.PHOTO - """:const:`telegram.constants.InputStoryContentType.PHOTO`""" - VIDEO: Final[str] = constants.InputStoryContentType.VIDEO - """:const:`telegram.constants.InputStoryContentType.VIDEO`""" - - def __init__( - self, - type: str, # pylint: disable=redefined-builtin - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(api_kwargs=api_kwargs) - self.type: str = enum.get_member(constants.InputStoryContentType, type, type) - - self._freeze() - - @staticmethod - def _parse_file_input(file_input: FileInput) -> Union[str, InputFile]: - # We use local_mode=True because we don't have access to the actual setting and want - # things to work in local mode. - return parse_file_input(file_input, attach=True, local_mode=True) - - -class InputStoryContentPhoto(InputStoryContent): - """Describes a photo to post as a story. - - .. versionadded:: 22.1 - - Args: - photo (:term:`file object` | :obj:`bytes` | :class:`pathlib.Path` | :obj:`str`, \ - optional): The photo to post as a story. The photo must be of the - size :tg-const:`telegram.constants.InputStoryContentLimit.PHOTO_WIDTH` - x :tg-const:`telegram.constants.InputStoryContentLimit.PHOTO_HEIGHT` and must not - exceed :tg-const:`telegram.constants.InputStoryContentLimit.PHOTOSIZE_UPLOAD` MB. - |uploadinputnopath|. - - Attributes: - type (:obj:`str`): Type of the content, must be :attr:`~telegram.InputStoryContent.PHOTO`. - photo (:class:`telegram.InputFile`): The photo to post as a story. The photo must be of the - size :tg-const:`telegram.constants.InputStoryContentLimit.PHOTO_WIDTH` - x :tg-const:`telegram.constants.InputStoryContentLimit.PHOTO_HEIGHT` and must not - exceed :tg-const:`telegram.constants.InputStoryContentLimit.PHOTOSIZE_UPLOAD` MB. - - """ - - __slots__ = ("photo",) - - def __init__( - self, - photo: FileInput, - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(type=InputStoryContent.PHOTO, api_kwargs=api_kwargs) - - with self._unfrozen(): - self.photo: Union[str, InputFile] = self._parse_file_input(photo) - - -class InputStoryContentVideo(InputStoryContent): - """ - Describes a video to post as a story. - - .. versionadded:: 22.1 - - Args: - video (:term:`file object` | :obj:`bytes` | :class:`pathlib.Path` | :obj:`str`, \ - optional): The video to post as a story. The video must be of - the size :tg-const:`telegram.constants.InputStoryContentLimit.VIDEO_WIDTH` - x :tg-const:`telegram.constants.InputStoryContentLimit.VIDEO_HEIGHT`, - streamable, encoded with ``H.265`` codec, with key frames added - each second in the ``MPEG4`` format, and must not exceed - :tg-const:`telegram.constants.InputStoryContentLimit.VIDEOSIZE_UPLOAD` MB. - |uploadinputnopath|. - duration (:class:`datetime.timedelta` | :obj:`int` | :obj:`float`, optional): Precise - duration of the video in seconds; - 0-:tg-const:`telegram.constants.InputStoryContentLimit.MAX_VIDEO_DURATION` - cover_frame_timestamp (:class:`datetime.timedelta` | :obj:`int` | :obj:`float`, optional): - Timestamp in seconds of the frame that will be used as the static cover for the story. - Defaults to ``0.0``. - is_animation (:obj:`bool`, optional): Pass :obj:`True` if the video has no sound - - Attributes: - type (:obj:`str`): Type of the content, must be :attr:`~telegram.InputStoryContent.VIDEO`. - video (:class:`telegram.InputFile`): The video to post as a story. The video must be of - the size :tg-const:`telegram.constants.InputStoryContentLimit.VIDEO_WIDTH` - x :tg-const:`telegram.constants.InputStoryContentLimit.VIDEO_HEIGHT`, - streamable, encoded with ``H.265`` codec, with key frames added - each second in the ``MPEG4`` format, and must not exceed - :tg-const:`telegram.constants.InputStoryContentLimit.VIDEOSIZE_UPLOAD` MB. - duration (:class:`datetime.timedelta`): Optional. Precise duration of the video in seconds; - 0-:tg-const:`telegram.constants.InputStoryContentLimit.MAX_VIDEO_DURATION` - cover_frame_timestamp (:class:`datetime.timedelta`): Optional. Timestamp in seconds of the - frame that will be used as the static cover for the story. Defaults to ``0.0``. - is_animation (:obj:`bool`): Optional. Pass :obj:`True` if the video has no sound - """ - - __slots__ = ("cover_frame_timestamp", "duration", "is_animation", "video") - - def __init__( - self, - video: FileInput, - duration: Optional[Union[float, dtm.timedelta]] = None, - cover_frame_timestamp: Optional[Union[float, dtm.timedelta]] = None, - is_animation: Optional[bool] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(type=InputStoryContent.VIDEO, api_kwargs=api_kwargs) - - with self._unfrozen(): - self.video: Union[str, InputFile] = self._parse_file_input(video) - self.duration: Optional[dtm.timedelta] = to_timedelta(duration) - self.cover_frame_timestamp: Optional[dtm.timedelta] = to_timedelta( - cover_frame_timestamp - ) - self.is_animation: Optional[bool] = is_animation diff --git a/venv/lib/python3.12/site-packages/telegram/_files/animation.py b/venv/lib/python3.12/site-packages/telegram/_files/animation.py deleted file mode 100644 index e2f0315..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_files/animation.py +++ /dev/null @@ -1,119 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram Animation.""" -import datetime as dtm -from typing import Optional, Union - -from telegram._files._basethumbedmedium import _BaseThumbedMedium -from telegram._files.photosize import PhotoSize -from telegram._utils.argumentparsing import to_timedelta -from telegram._utils.datetime import get_timedelta_value -from telegram._utils.types import JSONDict, TimePeriod - - -class Animation(_BaseThumbedMedium): - """This object represents an animation file (GIF or H.264/MPEG-4 AVC video without sound). - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`file_unique_id` is equal. - - .. versionchanged:: 20.5 - |removed_thumb_note| - - Args: - file_id (:obj:`str`): Identifier for this file, which can be used to download - or reuse the file. - file_unique_id (:obj:`str`): Unique identifier for this file, which - is supposed to be the same over time and for different bots. - Can't be used to download or reuse the file. - width (:obj:`int`): Video width as defined by the sender. - height (:obj:`int`): Video height as defined by the sender. - duration (:obj:`int` | :class:`datetime.timedelta`, optional): Duration of the video - in seconds as defined by the sender. - - .. versionchanged:: v22.2 - |time-period-input| - file_name (:obj:`str`, optional): Original animation filename as defined by the sender. - mime_type (:obj:`str`, optional): MIME type of the file as defined by the sender. - file_size (:obj:`int`, optional): File size in bytes. - thumbnail (:class:`telegram.PhotoSize`, optional): Animation thumbnail as defined by - sender. - - .. versionadded:: 20.2 - - Attributes: - file_id (:obj:`str`): Identifier for this file, which can be used to download - or reuse the file. - file_unique_id (:obj:`str`): Unique identifier for this file, which - is supposed to be the same over time and for different bots. - Can't be used to download or reuse the file. - width (:obj:`int`): Video width as defined by the sender. - height (:obj:`int`): Video height as defined by the sender. - duration (:obj:`int` | :class:`datetime.timedelta`): Duration of the video in seconds - as defined by the sender. - - .. deprecated:: v22.2 - |time-period-int-deprecated| - file_name (:obj:`str`): Optional. Original animation filename as defined by the sender. - mime_type (:obj:`str`): Optional. MIME type of the file as defined by the sender. - file_size (:obj:`int`): Optional. File size in bytes. - thumbnail (:class:`telegram.PhotoSize`): Optional. Animation thumbnail as defined by - sender. - - .. versionadded:: 20.2 - - """ - - __slots__ = ("_duration", "file_name", "height", "mime_type", "width") - - def __init__( - self, - file_id: str, - file_unique_id: str, - width: int, - height: int, - duration: TimePeriod, - file_name: Optional[str] = None, - mime_type: Optional[str] = None, - file_size: Optional[int] = None, - thumbnail: Optional[PhotoSize] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__( - file_id=file_id, - file_unique_id=file_unique_id, - file_size=file_size, - api_kwargs=api_kwargs, - thumbnail=thumbnail, - ) - with self._unfrozen(): - # Required - self.width: int = width - self.height: int = height - self._duration: dtm.timedelta = to_timedelta(duration) - # Optional - self.mime_type: Optional[str] = mime_type - self.file_name: Optional[str] = file_name - - @property - def duration(self) -> Union[int, dtm.timedelta]: - return get_timedelta_value( # type: ignore[return-value] - self._duration, attribute="duration" - ) diff --git a/venv/lib/python3.12/site-packages/telegram/_files/audio.py b/venv/lib/python3.12/site-packages/telegram/_files/audio.py deleted file mode 100644 index 0ae3588..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_files/audio.py +++ /dev/null @@ -1,121 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram Audio.""" -import datetime as dtm -from typing import Optional, Union - -from telegram._files._basethumbedmedium import _BaseThumbedMedium -from telegram._files.photosize import PhotoSize -from telegram._utils.argumentparsing import to_timedelta -from telegram._utils.datetime import get_timedelta_value -from telegram._utils.types import JSONDict, TimePeriod - - -class Audio(_BaseThumbedMedium): - """This object represents an audio file to be treated as music by the Telegram clients. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`file_unique_id` is equal. - - .. versionchanged:: 20.5 - |removed_thumb_note| - - - Args: - file_id (:obj:`str`): Identifier for this file, which can be used to download - or reuse the file. - file_unique_id (:obj:`str`): Unique identifier for this file, which is supposed to be - the same over time and for different bots. Can't be used to download or reuse the file. - duration (:obj:`int` | :class:`datetime.timedelta`): Duration of the audio in - seconds as defined by the sender. - - .. versionchanged:: v22.2 - |time-period-input| - performer (:obj:`str`, optional): Performer of the audio as defined by the sender or by - audio tags. - title (:obj:`str`, optional): Title of the audio as defined by the sender or by audio tags. - file_name (:obj:`str`, optional): Original filename as defined by the sender. - mime_type (:obj:`str`, optional): MIME type of the file as defined by the sender. - file_size (:obj:`int`, optional): File size in bytes. - thumbnail (:class:`telegram.PhotoSize`, optional): Thumbnail of the album cover to - which the music file belongs. - - .. versionadded:: 20.2 - - Attributes: - file_id (:obj:`str`): Identifier for this file, which can be used to download - or reuse the file. - file_unique_id (:obj:`str`): Unique identifier for this file, which is supposed to be - the same over time and for different bots. Can't be used to download or reuse the file. - duration (:obj:`int` | :class:`datetime.timedelta`): Duration of the audio in seconds as - defined by the sender. - - .. deprecated:: v22.2 - |time-period-int-deprecated| - performer (:obj:`str`): Optional. Performer of the audio as defined by the sender or by - audio tags. - title (:obj:`str`): Optional. Title of the audio as defined by the sender or by audio tags. - file_name (:obj:`str`): Optional. Original filename as defined by the sender. - mime_type (:obj:`str`): Optional. MIME type of the file as defined by the sender. - file_size (:obj:`int`): Optional. File size in bytes. - thumbnail (:class:`telegram.PhotoSize`): Optional. Thumbnail of the album cover to - which the music file belongs. - - .. versionadded:: 20.2 - - - """ - - __slots__ = ("_duration", "file_name", "mime_type", "performer", "title") - - def __init__( - self, - file_id: str, - file_unique_id: str, - duration: TimePeriod, - performer: Optional[str] = None, - title: Optional[str] = None, - mime_type: Optional[str] = None, - file_size: Optional[int] = None, - file_name: Optional[str] = None, - thumbnail: Optional[PhotoSize] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__( - file_id=file_id, - file_unique_id=file_unique_id, - file_size=file_size, - thumbnail=thumbnail, - api_kwargs=api_kwargs, - ) - with self._unfrozen(): - # Required - self._duration: dtm.timedelta = to_timedelta(duration) - # Optional - self.performer: Optional[str] = performer - self.title: Optional[str] = title - self.mime_type: Optional[str] = mime_type - self.file_name: Optional[str] = file_name - - @property - def duration(self) -> Union[int, dtm.timedelta]: - return get_timedelta_value( # type: ignore[return-value] - self._duration, attribute="duration" - ) diff --git a/venv/lib/python3.12/site-packages/telegram/_files/chatphoto.py b/venv/lib/python3.12/site-packages/telegram/_files/chatphoto.py deleted file mode 100644 index 5d6e914..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_files/chatphoto.py +++ /dev/null @@ -1,176 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram ChatPhoto.""" -from typing import TYPE_CHECKING, Final, Optional - -from telegram import constants -from telegram._telegramobject import TelegramObject -from telegram._utils.defaultvalue import DEFAULT_NONE -from telegram._utils.types import JSONDict, ODVInput - -if TYPE_CHECKING: - from telegram import File - - -class ChatPhoto(TelegramObject): - """This object represents a chat photo. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`small_file_unique_id` and :attr:`big_file_unique_id` are - equal. - - Args: - small_file_id (:obj:`str`): File identifier of small - (:tg-const:`telegram.ChatPhoto.SIZE_SMALL` x :tg-const:`telegram.ChatPhoto.SIZE_SMALL`) - chat photo. This file_id can be used only for photo download and only for as long - as the photo is not changed. - small_file_unique_id (:obj:`str`): Unique file identifier of small - (:tg-const:`telegram.ChatPhoto.SIZE_SMALL` x :tg-const:`telegram.ChatPhoto.SIZE_SMALL`) - chat photo, which is supposed to be the same over time and for different bots. - Can't be used to download or reuse the file. - big_file_id (:obj:`str`): File identifier of big - (:tg-const:`telegram.ChatPhoto.SIZE_BIG` x :tg-const:`telegram.ChatPhoto.SIZE_BIG`) - chat photo. This file_id can be used only for photo download and only for as long as - the photo is not changed. - big_file_unique_id (:obj:`str`): Unique file identifier of big - (:tg-const:`telegram.ChatPhoto.SIZE_BIG` x :tg-const:`telegram.ChatPhoto.SIZE_BIG`) - chat photo, which is supposed to be the same over time and for different bots. - Can't be used to download or reuse the file. - - Attributes: - small_file_id (:obj:`str`): File identifier of small - (:tg-const:`telegram.ChatPhoto.SIZE_SMALL` x :tg-const:`telegram.ChatPhoto.SIZE_SMALL`) - chat photo. This file_id can be used only for photo download and only for as long - as the photo is not changed. - small_file_unique_id (:obj:`str`): Unique file identifier of small - (:tg-const:`telegram.ChatPhoto.SIZE_SMALL` x :tg-const:`telegram.ChatPhoto.SIZE_SMALL`) - chat photo, which is supposed to be the same over time and for different bots. - Can't be used to download or reuse the file. - big_file_id (:obj:`str`): File identifier of big - (:tg-const:`telegram.ChatPhoto.SIZE_BIG` x :tg-const:`telegram.ChatPhoto.SIZE_BIG`) - chat photo. This file_id can be used only for photo download and only for as long as - the photo is not changed. - big_file_unique_id (:obj:`str`): Unique file identifier of big - (:tg-const:`telegram.ChatPhoto.SIZE_BIG` x :tg-const:`telegram.ChatPhoto.SIZE_BIG`) - chat photo, which is supposed to be the same over time and for different bots. - Can't be used to download or reuse the file. - - """ - - __slots__ = ( - "big_file_id", - "big_file_unique_id", - "small_file_id", - "small_file_unique_id", - ) - - def __init__( - self, - small_file_id: str, - small_file_unique_id: str, - big_file_id: str, - big_file_unique_id: str, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.small_file_id: str = small_file_id - self.small_file_unique_id: str = small_file_unique_id - self.big_file_id: str = big_file_id - self.big_file_unique_id: str = big_file_unique_id - - self._id_attrs = ( - self.small_file_unique_id, - self.big_file_unique_id, - ) - - self._freeze() - - async def get_small_file( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "File": - """Convenience wrapper over :meth:`telegram.Bot.get_file` for getting the small - (:tg-const:`telegram.ChatPhoto.SIZE_SMALL` x :tg-const:`telegram.ChatPhoto.SIZE_SMALL`) - chat photo - - For the documentation of the arguments, please see :meth:`telegram.Bot.get_file`. - - Returns: - :class:`telegram.File` - - Raises: - :class:`telegram.error.TelegramError` - - """ - return await self.get_bot().get_file( - file_id=self.small_file_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def get_big_file( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "File": - """Convenience wrapper over :meth:`telegram.Bot.get_file` for getting the - big (:tg-const:`telegram.ChatPhoto.SIZE_BIG` x :tg-const:`telegram.ChatPhoto.SIZE_BIG`) - chat photo - - For the documentation of the arguments, please see :meth:`telegram.Bot.get_file`. - - Returns: - :class:`telegram.File` - - Raises: - :class:`telegram.error.TelegramError` - - """ - return await self.get_bot().get_file( - file_id=self.big_file_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - SIZE_SMALL: Final[int] = constants.ChatPhotoSize.SMALL - """:const:`telegram.constants.ChatPhotoSize.SMALL` - - .. versionadded:: 20.0 - """ - SIZE_BIG: Final[int] = constants.ChatPhotoSize.BIG - """:const:`telegram.constants.ChatPhotoSize.BIG` - - .. versionadded:: 20.0 - """ diff --git a/venv/lib/python3.12/site-packages/telegram/_files/contact.py b/venv/lib/python3.12/site-packages/telegram/_files/contact.py deleted file mode 100644 index 1ff05b3..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_files/contact.py +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram Contact.""" -from typing import Optional - -from telegram._telegramobject import TelegramObject -from telegram._utils.types import JSONDict - - -class Contact(TelegramObject): - """This object represents a phone contact. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`phone_number` is equal. - - Args: - phone_number (:obj:`str`): Contact's phone number. - first_name (:obj:`str`): Contact's first name. - last_name (:obj:`str`, optional): Contact's last name. - user_id (:obj:`int`, optional): Contact's user identifier in Telegram. - vcard (:obj:`str`, optional): Additional data about the contact in the form of a vCard. - - Attributes: - phone_number (:obj:`str`): Contact's phone number. - first_name (:obj:`str`): Contact's first name. - last_name (:obj:`str`): Optional. Contact's last name. - user_id (:obj:`int`): Optional. Contact's user identifier in Telegram. - vcard (:obj:`str`): Optional. Additional data about the contact in the form of a vCard. - - """ - - __slots__ = ("first_name", "last_name", "phone_number", "user_id", "vcard") - - def __init__( - self, - phone_number: str, - first_name: str, - last_name: Optional[str] = None, - user_id: Optional[int] = None, - vcard: Optional[str] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - # Required - self.phone_number: str = str(phone_number) - self.first_name: str = first_name - # Optionals - self.last_name: Optional[str] = last_name - self.user_id: Optional[int] = user_id - self.vcard: Optional[str] = vcard - - self._id_attrs = (self.phone_number,) - - self._freeze() diff --git a/venv/lib/python3.12/site-packages/telegram/_files/document.py b/venv/lib/python3.12/site-packages/telegram/_files/document.py deleted file mode 100644 index 7ddaeaf..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_files/document.py +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram Document.""" -from typing import Optional - -from telegram._files._basethumbedmedium import _BaseThumbedMedium -from telegram._files.photosize import PhotoSize -from telegram._utils.types import JSONDict - - -class Document(_BaseThumbedMedium): - """This object represents a general file - (as opposed to photos, voice messages and audio files). - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`file_unique_id` is equal. - - .. versionchanged:: 20.5 - |removed_thumb_note| - - Args: - file_id (:obj:`str`): Identifier for this file, which can be used to download - or reuse the file. - file_unique_id (:obj:`str`): Unique identifier for this file, which is supposed to be - the same over time and for different bots. Can't be used to download or reuse the file. - file_name (:obj:`str`, optional): Original filename as defined by the sender. - mime_type (:obj:`str`, optional): MIME type of the file as defined by the sender. - file_size (:obj:`int`, optional): File size in bytes. - thumbnail (:class:`telegram.PhotoSize`, optional): Document thumbnail as defined by the - sender. - - .. versionadded:: 20.2 - - Attributes: - file_id (:obj:`str`): Identifier for this file, which can be used to download - or reuse the file. - file_unique_id (:obj:`str`): Unique identifier for this file, which is supposed to be - the same over time and for different bots. Can't be used to download or reuse the file. - file_name (:obj:`str`): Optional. Original filename as defined by the sender. - mime_type (:obj:`str`): Optional. MIME type of the file as defined by the sender. - file_size (:obj:`int`): Optional. File size in bytes. - thumbnail (:class:`telegram.PhotoSize`): Optional. Document thumbnail as defined by the - sender. - - .. versionadded:: 20.2 - - """ - - __slots__ = ("file_name", "mime_type") - - def __init__( - self, - file_id: str, - file_unique_id: str, - file_name: Optional[str] = None, - mime_type: Optional[str] = None, - file_size: Optional[int] = None, - thumbnail: Optional[PhotoSize] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__( - file_id=file_id, - file_unique_id=file_unique_id, - file_size=file_size, - thumbnail=thumbnail, - api_kwargs=api_kwargs, - ) - with self._unfrozen(): - # Optional - self.mime_type: Optional[str] = mime_type - self.file_name: Optional[str] = file_name diff --git a/venv/lib/python3.12/site-packages/telegram/_files/file.py b/venv/lib/python3.12/site-packages/telegram/_files/file.py deleted file mode 100644 index 38fdac7..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_files/file.py +++ /dev/null @@ -1,371 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram File.""" -import shutil -import urllib.parse as urllib_parse -from base64 import b64decode -from pathlib import Path -from typing import TYPE_CHECKING, BinaryIO, Optional - -from telegram._passport.credentials import decrypt -from telegram._telegramobject import TelegramObject -from telegram._utils.defaultvalue import DEFAULT_NONE -from telegram._utils.files import is_local_file -from telegram._utils.types import FilePathInput, JSONDict, ODVInput - -if TYPE_CHECKING: - from telegram import FileCredentials - - -class File(TelegramObject): - """ - This object represents a file ready to be downloaded. The file can be e.g. downloaded with - :attr:`download_to_drive`. It is guaranteed that the link will be valid for at least 1 hour. - When the link expires, a new one can be requested by calling :meth:`telegram.Bot.get_file`. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`file_unique_id` is equal. - - .. versionchanged:: 20.0 - ``download`` was split into :meth:`download_to_drive` and :meth:`download_to_memory`. - - Note: - * Maximum file size to download is - :tg-const:`telegram.constants.FileSizeLimit.FILESIZE_DOWNLOAD`. - * If you obtain an instance of this class from :attr:`telegram.PassportFile.get_file`, - then it will automatically be decrypted as it downloads when you call e.g. - :meth:`download_to_drive`. - - Args: - file_id (:obj:`str`): Identifier for this file, which can be used to download - or reuse the file. - file_unique_id (:obj:`str`): Unique identifier for this file, which - is supposed to be the same over time and for different bots. - Can't be used to download or reuse the file. - file_size (:obj:`int`, optional): File size in bytes, if known. - file_path (:obj:`str`, optional): File path. Use e.g. :meth:`download_to_drive` to get the - file. - - Attributes: - file_id (:obj:`str`): Identifier for this file, which can be used to download - or reuse the file. - file_unique_id (:obj:`str`): Unique identifier for this file, which - is supposed to be the same over time and for different bots. - Can't be used to download or reuse the file. - file_size (:obj:`int`): Optional. File size in bytes, if known. - file_path (:obj:`str`): Optional. File path. Use e.g. :meth:`download_to_drive` to get the - file. - """ - - __slots__ = ( - "_credentials", - "file_id", - "file_path", - "file_size", - "file_unique_id", - ) - - def __init__( - self, - file_id: str, - file_unique_id: str, - file_size: Optional[int] = None, - file_path: Optional[str] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - - # Required - self.file_id: str = str(file_id) - self.file_unique_id: str = str(file_unique_id) - # Optionals - self.file_size: Optional[int] = file_size - self.file_path: Optional[str] = file_path - - self._credentials: Optional[FileCredentials] = None - - self._id_attrs = (self.file_unique_id,) - - self._freeze() - - def _get_encoded_url(self) -> str: - """Convert any UTF-8 char in :obj:`File.file_path` into a url encoded ASCII string.""" - sres = urllib_parse.urlsplit(str(self.file_path)) - return urllib_parse.urlunsplit( - urllib_parse.SplitResult( - sres.scheme, sres.netloc, urllib_parse.quote(sres.path), sres.query, sres.fragment - ) - ) - - def _prepare_decrypt(self, buf: bytes) -> bytes: - return decrypt(b64decode(self._credentials.secret), b64decode(self._credentials.hash), buf) - - async def download_to_drive( - self, - custom_path: Optional[FilePathInput] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - ) -> Path: - """ - Download this file. By default, the file is saved in the current working directory with - :attr:`file_path` as file name. If :paramref:`custom_path` is supplied as a :obj:`str` or - :obj:`pathlib.Path`, it will be saved to that path. - - Note: - If :paramref:`custom_path` isn't provided and :attr:`file_path` is the path of a - local file (which is the case when a Bot API Server is running in local mode), this - method will just return the path. - - The only exception to this are encrypted files (e.g. a passport file). For these, a - file with the prefix `decrypted_` will be created in the same directory as the - original file in order to decrypt the file without changing the existing one - in-place. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - .. versionchanged:: 20.0 - - * :paramref:`custom_path` parameter now also accepts :class:`pathlib.Path` as argument. - * Returns :class:`pathlib.Path` object in cases where previously a :obj:`str` was - returned. - * This method was previously called ``download``. It was split into - :meth:`download_to_drive` and :meth:`download_to_memory`. - - .. versionchanged:: 21.7 - Raises :exc:`RuntimeError` if :attr:`file_path` is not set. Note that files without - a :attr:`file_path` could never be downloaded, as this attribute is mandatory for that - operation. - - Args: - custom_path (:class:`pathlib.Path` | :obj:`str` , optional): The path where the file - will be saved to. If not specified, will be saved in the current working directory - with :attr:`file_path` as file name or the :attr:`file_id` if :attr:`file_path` - is not set. - - Keyword Args: - read_timeout (:obj:`float` | :obj:`None`, optional): Value to pass to - :paramref:`telegram.request.BaseRequest.post.read_timeout`. Defaults to - :attr:`~telegram.request.BaseRequest.DEFAULT_NONE`. - write_timeout (:obj:`float` | :obj:`None`, optional): Value to pass to - :paramref:`telegram.request.BaseRequest.post.write_timeout`. Defaults to - :attr:`~telegram.request.BaseRequest.DEFAULT_NONE`. - connect_timeout (:obj:`float` | :obj:`None`, optional): Value to pass to - :paramref:`telegram.request.BaseRequest.post.connect_timeout`. Defaults to - :attr:`~telegram.request.BaseRequest.DEFAULT_NONE`. - pool_timeout (:obj:`float` | :obj:`None`, optional): Value to pass to - :paramref:`telegram.request.BaseRequest.post.pool_timeout`. Defaults to - :attr:`~telegram.request.BaseRequest.DEFAULT_NONE`. - - Returns: - :class:`pathlib.Path`: Returns the Path object the file was downloaded to. - - Raises: - RuntimeError: If :attr:`file_path` is not set. - - """ - if not self.file_path: - raise RuntimeError("No `file_path` available for this file. Can not download.") - - local_file = is_local_file(self.file_path) - url = None if local_file else self._get_encoded_url() - - # if _credentials exists we want to decrypt the file - if local_file and self._credentials: - file_to_decrypt = Path(self.file_path) - buf = self._prepare_decrypt(file_to_decrypt.read_bytes()) - if custom_path is not None: - path = Path(custom_path) - else: - path = Path(str(file_to_decrypt.parent) + "/decrypted_" + file_to_decrypt.name) - path.write_bytes(buf) - return path - - if custom_path is not None and local_file: - shutil.copyfile(self.file_path, str(custom_path)) - return Path(custom_path) - - if custom_path: - filename = Path(custom_path) - elif local_file: - return Path(self.file_path) - else: - filename = Path(Path(self.file_path).name) - - buf = await self.get_bot().request.retrieve( - url, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - ) - if self._credentials: - buf = self._prepare_decrypt(buf) - filename.write_bytes(buf) - return filename - - async def download_to_memory( - self, - out: BinaryIO, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - ) -> None: - """ - Download this file into memory. :paramref:`out` needs to be supplied with a - :obj:`io.BufferedIOBase`, the file contents will be saved to that object using the - :obj:`out.write<io.BufferedIOBase.write>` method. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - Hint: - If you want to immediately read the data from ``out`` after calling this method, you - should call ``out.seek(0)`` first. See also :meth:`io.IOBase.seek`. - - .. versionadded:: 20.0 - - .. versionchanged:: 21.7 - Raises :exc:`RuntimeError` if :attr:`file_path` is not set. Note that files without - a :attr:`file_path` could never be downloaded, as this attribute is mandatory for that - operation. - - Args: - out (:obj:`io.BufferedIOBase`): A file-like object. Must be opened for writing in - binary mode. - - Keyword Args: - read_timeout (:obj:`float` | :obj:`None`, optional): Value to pass to - :paramref:`telegram.request.BaseRequest.post.read_timeout`. Defaults to - :attr:`~telegram.request.BaseRequest.DEFAULT_NONE`. - write_timeout (:obj:`float` | :obj:`None`, optional): Value to pass to - :paramref:`telegram.request.BaseRequest.post.write_timeout`. Defaults to - :attr:`~telegram.request.BaseRequest.DEFAULT_NONE`. - connect_timeout (:obj:`float` | :obj:`None`, optional): Value to pass to - :paramref:`telegram.request.BaseRequest.post.connect_timeout`. Defaults to - :attr:`~telegram.request.BaseRequest.DEFAULT_NONE`. - pool_timeout (:obj:`float` | :obj:`None`, optional): Value to pass to - :paramref:`telegram.request.BaseRequest.post.pool_timeout`. Defaults to - :attr:`~telegram.request.BaseRequest.DEFAULT_NONE`. - - Raises: - RuntimeError: If :attr:`file_path` is not set. - """ - if not self.file_path: - raise RuntimeError("No `file_path` available for this file. Can not download.") - - local_file = is_local_file(self.file_path) - url = None if local_file else self._get_encoded_url() - path = Path(self.file_path) if local_file else None - if local_file: - buf = path.read_bytes() - else: - buf = await self.get_bot().request.retrieve( - url, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - ) - if self._credentials: - buf = self._prepare_decrypt(buf) - out.write(buf) - - async def download_as_bytearray( - self, - buf: Optional[bytearray] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - ) -> bytearray: - """Download this file and return it as a bytearray. - - .. versionchanged:: 21.7 - Raises :exc:`RuntimeError` if :attr:`file_path` is not set. Note that files without - a :attr:`file_path` could never be downloaded, as this attribute is mandatory for that - operation. - - Args: - buf (:obj:`bytearray`, optional): Extend the given bytearray with the downloaded data. - - Keyword Args: - read_timeout (:obj:`float` | :obj:`None`, optional): Value to pass to - :paramref:`telegram.request.BaseRequest.post.read_timeout`. Defaults to - :attr:`~telegram.request.BaseRequest.DEFAULT_NONE`. - - .. versionadded:: 20.0 - write_timeout (:obj:`float` | :obj:`None`, optional): Value to pass to - :paramref:`telegram.request.BaseRequest.post.write_timeout`. Defaults to - :attr:`~telegram.request.BaseRequest.DEFAULT_NONE`. - - .. versionadded:: 20.0 - connect_timeout (:obj:`float` | :obj:`None`, optional): Value to pass to - :paramref:`telegram.request.BaseRequest.post.connect_timeout`. Defaults to - :attr:`~telegram.request.BaseRequest.DEFAULT_NONE`. - - .. versionadded:: 20.0 - pool_timeout (:obj:`float` | :obj:`None`, optional): Value to pass to - :paramref:`telegram.request.BaseRequest.post.pool_timeout`. Defaults to - :attr:`~telegram.request.BaseRequest.DEFAULT_NONE`. - - .. versionadded:: 20.0 - - Returns: - :obj:`bytearray`: The same object as :paramref:`buf` if it was specified. Otherwise a - newly allocated :obj:`bytearray`. - - Raises: - RuntimeError: If :attr:`file_path` is not set. - - """ - if not self.file_path: - raise RuntimeError("No `file_path` available for this file. Can not download.") - - if buf is None: - buf = bytearray() - - if is_local_file(self.file_path): - bytes_data = Path(self.file_path).read_bytes() - else: - bytes_data = await self.get_bot().request.retrieve( - self._get_encoded_url(), - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - ) - if self._credentials: - buf.extend(self._prepare_decrypt(bytes_data)) - else: - buf.extend(bytes_data) - return buf - - def set_credentials(self, credentials: "FileCredentials") -> None: - """Sets the passport credentials for the file. - - Args: - credentials (:class:`telegram.FileCredentials`): The credentials. - """ - self._credentials = credentials diff --git a/venv/lib/python3.12/site-packages/telegram/_files/inputfile.py b/venv/lib/python3.12/site-packages/telegram/_files/inputfile.py deleted file mode 100644 index 8c88a9d..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_files/inputfile.py +++ /dev/null @@ -1,142 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram InputFile.""" - -import mimetypes -from typing import IO, Optional, Union -from uuid import uuid4 - -from telegram._utils.files import guess_file_name, load_file -from telegram._utils.strings import TextEncoding -from telegram._utils.types import FieldTuple - -_DEFAULT_MIME_TYPE = "application/octet-stream" - - -class InputFile: - """This object represents a Telegram InputFile. - - .. versionchanged:: 20.0 - - * The former attribute ``attach`` was renamed to :attr:`attach_name`. - * Method ``is_image`` was removed. If you pass :obj:`bytes` to :paramref:`obj` and would - like to have the mime type automatically guessed, please pass :paramref:`filename` - in addition. - - Args: - obj (:term:`file object` | :obj:`bytes` | :obj:`str`): An open file descriptor or the files - content as bytes or string. - - Note: - If :paramref:`obj` is a string, it will be encoded as bytes via - :external:obj:`obj.encode('utf-8') <str.encode>`. - - .. versionchanged:: 20.0 - Accept string input. - filename (:obj:`str`, optional): Filename for this InputFile. - attach (:obj:`bool`, optional): Pass :obj:`True` if the parameter this file belongs to in - the request to Telegram should point to the multipart data via an ``attach://`` URI. - Defaults to `False`. - read_file_handle (:obj:`bool`, optional): If :obj:`True` and :paramref:`obj` is a file - handle, the data will be read from the file handle on initialization of this object. - If :obj:`False`, the file handle will be passed on to the - :attr:`networking backend <telegram.request.BaseRequest.do_request>` which will have - to handle the reading. Defaults to :obj:`True`. - - Tip: - If you upload extremely large files, you may want to set this to :obj:`False` to - avoid reading the complete file into memory. Additionally, this may be supported - better by the networking backend (in particular it is handled better by - the default :class:`~telegram.request.HTTPXRequest`). - - Important: - If you set this to :obj:`False`, you have to ensure that the file handle is still - open when the request is made. In particular, the following snippet can *not* work - as expected. - - .. code-block:: python - - with open('file.txt', 'rb') as file: - input_file = InputFile(file, read_file_handle=False) - - # here the file handle is already closed and the upload will fail - await bot.send_document(chat_id, input_file) - - .. versionadded:: 21.5 - - - Attributes: - input_file_content (:obj:`bytes` | :class:`IO`): The binary content of the file to send. - attach_name (:obj:`str`): Optional. If present, the parameter this file belongs to in - the request to Telegram should point to the multipart data via a an URI of the form - ``attach://<attach_name>`` URI. - filename (:obj:`str`): Filename for the file to be sent. - mimetype (:obj:`str`): The mimetype inferred from the file to be sent. - - """ - - __slots__ = ("attach_name", "filename", "input_file_content", "mimetype") - - def __init__( - self, - obj: Union[IO[bytes], bytes, str], - filename: Optional[str] = None, - attach: bool = False, - read_file_handle: bool = True, - ): - if isinstance(obj, bytes): - self.input_file_content: Union[bytes, IO[bytes]] = obj - elif isinstance(obj, str): - self.input_file_content = obj.encode(TextEncoding.UTF_8) - elif read_file_handle: - reported_filename, self.input_file_content = load_file(obj) - filename = filename or reported_filename - else: - self.input_file_content = obj - filename = filename or guess_file_name(obj) - - self.attach_name: Optional[str] = "attached" + uuid4().hex if attach else None - - if filename: - self.mimetype: str = ( - mimetypes.guess_type(filename, strict=False)[0] or _DEFAULT_MIME_TYPE - ) - else: - self.mimetype = _DEFAULT_MIME_TYPE - - self.filename: str = filename or self.mimetype.replace("/", ".") - - @property - def field_tuple(self) -> FieldTuple: - """Field tuple representing the contents of the file for upload to the Telegram servers. - - .. versionchanged:: 21.5 - Content may now be a file handle. - - Returns: - tuple[:obj:`str`, :obj:`bytes` | :class:`IO`, :obj:`str`]: - """ - return self.filename, self.input_file_content, self.mimetype - - @property - def attach_uri(self) -> Optional[str]: - """URI to insert into the JSON data for uploading the file. Returns :obj:`None`, if - :attr:`attach_name` is :obj:`None`. - """ - return f"attach://{self.attach_name}" if self.attach_name else None diff --git a/venv/lib/python3.12/site-packages/telegram/_files/inputmedia.py b/venv/lib/python3.12/site-packages/telegram/_files/inputmedia.py deleted file mode 100644 index 7c831a8..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_files/inputmedia.py +++ /dev/null @@ -1,915 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""Base class for Telegram InputMedia Objects.""" -import datetime as dtm -from collections.abc import Sequence -from typing import Final, Optional, Union - -from telegram import constants -from telegram._files.animation import Animation -from telegram._files.audio import Audio -from telegram._files.document import Document -from telegram._files.inputfile import InputFile -from telegram._files.photosize import PhotoSize -from telegram._files.video import Video -from telegram._messageentity import MessageEntity -from telegram._telegramobject import TelegramObject -from telegram._utils import enum -from telegram._utils.argumentparsing import parse_sequence_arg, to_timedelta -from telegram._utils.datetime import get_timedelta_value -from telegram._utils.defaultvalue import DEFAULT_NONE -from telegram._utils.files import parse_file_input -from telegram._utils.types import FileInput, JSONDict, ODVInput, TimePeriod -from telegram.constants import InputMediaType - -MediaType = Union[Animation, Audio, Document, PhotoSize, Video] - - -class InputMedia(TelegramObject): - """ - Base class for Telegram InputMedia Objects. - - .. versionchanged:: 20.0 - Added arguments and attributes :attr:`type`, :attr:`media`, :attr:`caption`, - :attr:`caption_entities`, :paramref:`parse_mode`. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - Args: - media_type (:obj:`str`): Type of media that the instance represents. - media (:obj:`str` | :class:`~telegram.InputFile`): File to send. - |fileinputnopath| - caption (:obj:`str`, optional): Caption of the media to be sent, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters after entities - parsing. - caption_entities (Sequence[:class:`telegram.MessageEntity`], optional): |caption_entities| - - .. versionchanged:: 20.0 - |sequenceclassargs| - - parse_mode (:obj:`str`, optional): |parse_mode| - - Attributes: - type (:obj:`str`): Type of the input media. - media (:obj:`str` | :class:`telegram.InputFile`): Media to send. - caption (:obj:`str`): Optional. Caption of the media to be sent, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters after entities - parsing. - parse_mode (:obj:`str`): Optional. |parse_mode| - caption_entities (tuple[:class:`telegram.MessageEntity`]): Optional. |captionentitiesattr| - - .. versionchanged:: 20.0 - - * |tupleclassattrs| - * |alwaystuple| - - """ - - __slots__ = ("caption", "caption_entities", "media", "parse_mode", "type") - - def __init__( - self, - media_type: str, - media: Union[str, InputFile], - caption: Optional[str] = None, - caption_entities: Optional[Sequence[MessageEntity]] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.type: str = enum.get_member(constants.InputMediaType, media_type, media_type) - self.media: Union[str, InputFile] = media - self.caption: Optional[str] = caption - self.caption_entities: tuple[MessageEntity, ...] = parse_sequence_arg(caption_entities) - self.parse_mode: ODVInput[str] = parse_mode - - self._freeze() - - @staticmethod - def _parse_thumbnail_input(thumbnail: Optional[FileInput]) -> Optional[Union[str, InputFile]]: - # We use local_mode=True because we don't have access to the actual setting and want - # things to work in local mode. - return ( - parse_file_input(thumbnail, attach=True, local_mode=True) - if thumbnail is not None - else thumbnail - ) - - -class InputPaidMedia(TelegramObject): - """ - Base class for Telegram InputPaidMedia Objects. Currently, it can be one of: - - * :class:`telegram.InputPaidMediaPhoto` - * :class:`telegram.InputPaidMediaVideo` - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - .. versionadded:: 21.4 - - Args: - type (:obj:`str`): Type of media that the instance represents. - media (:obj:`str` | :class:`~telegram.InputFile`): File - to send. |fileinputnopath| - - Attributes: - type (:obj:`str`): Type of the input media. - media (:obj:`str` | :class:`telegram.InputFile`): Media to send. - """ - - PHOTO: Final[str] = constants.InputPaidMediaType.PHOTO - """:const:`telegram.constants.InputPaidMediaType.PHOTO`""" - VIDEO: Final[str] = constants.InputPaidMediaType.VIDEO - """:const:`telegram.constants.InputPaidMediaType.VIDEO`""" - - __slots__ = ("media", "type") - - def __init__( - self, - type: str, # pylint: disable=redefined-builtin - media: Union[str, InputFile], - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.type: str = enum.get_member(constants.InputPaidMediaType, type, type) - self.media: Union[str, InputFile] = media - - self._freeze() - - -class InputPaidMediaPhoto(InputPaidMedia): - """The paid media to send is a photo. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - .. versionadded:: 21.4 - - Args: - media (:obj:`str` | :term:`file object` | :class:`~telegram.InputFile` | :obj:`bytes` | \ - :class:`pathlib.Path` | :class:`telegram.PhotoSize`): File to send. |fileinputnopath| - Lastly you can pass an existing :class:`telegram.PhotoSize` object to send. - - Attributes: - type (:obj:`str`): Type of the media, always - :tg-const:`telegram.constants.InputPaidMediaType.PHOTO`. - media (:obj:`str` | :class:`telegram.InputFile`): Photo to send. - """ - - __slots__ = () - - def __init__( - self, - media: Union[FileInput, PhotoSize], - *, - api_kwargs: Optional[JSONDict] = None, - ): - media = parse_file_input(media, PhotoSize, attach=True, local_mode=True) - super().__init__(type=InputPaidMedia.PHOTO, media=media, api_kwargs=api_kwargs) - self._freeze() - - -class InputPaidMediaVideo(InputPaidMedia): - """ - The paid media to send is a video. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - .. versionadded:: 21.4 - - Note: - * When using a :class:`telegram.Video` for the :attr:`media` attribute, it will take the - width, height and duration from that video, unless otherwise specified with the optional - arguments. - * :paramref:`thumbnail` will be ignored for small video files, for which Telegram can - easily generate thumbnails. However, this behaviour is undocumented and might be - changed by Telegram. - - Args: - media (:obj:`str` | :term:`file object` | :class:`~telegram.InputFile` | :obj:`bytes` | \ - :class:`pathlib.Path` | :class:`telegram.Video`): File to send. |fileinputnopath| - Lastly you can pass an existing :class:`telegram.Video` object to send. - thumbnail (:term:`file object` | :obj:`bytes` | :class:`pathlib.Path` | :obj:`str`, \ - optional): |thumbdocstringnopath| - cover (:term:`file object` | :obj:`bytes` | :class:`pathlib.Path` | :obj:`str`, \ - optional): Cover for the video in the message. |fileinputnopath| - - .. versionchanged:: 21.11 - start_timestamp (:obj:`int`, optional): Start timestamp for the video in the message - - .. versionchanged:: 21.11 - width (:obj:`int`, optional): Video width. - height (:obj:`int`, optional): Video height. - duration (:obj:`int` | :class:`datetime.timedelta`, optional): Video duration in seconds. - - .. versionchanged:: v22.2 - |time-period-input| - supports_streaming (:obj:`bool`, optional): Pass :obj:`True`, if the uploaded video is - suitable for streaming. - - Attributes: - type (:obj:`str`): Type of the media, always - :tg-const:`telegram.constants.InputPaidMediaType.VIDEO`. - media (:obj:`str` | :class:`telegram.InputFile`): Video to send. - thumbnail (:class:`telegram.InputFile`): Optional. |thumbdocstringbase| - cover (:class:`telegram.InputFile`): Optional. Cover for the video in the message. - |fileinputnopath| - - .. versionchanged:: 21.11 - start_timestamp (:obj:`int`): Optional. Start timestamp for the video in the message - - .. versionchanged:: 21.11 - width (:obj:`int`): Optional. Video width. - height (:obj:`int`): Optional. Video height. - duration (:obj:`int` | :class:`datetime.timedelta`): Optional. Video duration in seconds. - - .. deprecated:: v22.2 - |time-period-int-deprecated| - supports_streaming (:obj:`bool`): Optional. :obj:`True`, if the uploaded video is - suitable for streaming. - """ - - __slots__ = ( - "_duration", - "cover", - "height", - "start_timestamp", - "supports_streaming", - "thumbnail", - "width", - ) - - def __init__( - self, - media: Union[FileInput, Video], - thumbnail: Optional[FileInput] = None, - width: Optional[int] = None, - height: Optional[int] = None, - duration: Optional[TimePeriod] = None, - supports_streaming: Optional[bool] = None, - cover: Optional[FileInput] = None, - start_timestamp: Optional[int] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - if isinstance(media, Video): - width = width if width is not None else media.width - height = height if height is not None else media.height - duration = duration if duration is not None else media._duration - media = media.file_id - else: - # We use local_mode=True because we don't have access to the actual setting and want - # things to work in local mode. - media = parse_file_input(media, attach=True, local_mode=True) - - super().__init__(type=InputPaidMedia.VIDEO, media=media, api_kwargs=api_kwargs) - with self._unfrozen(): - self.thumbnail: Optional[Union[str, InputFile]] = InputMedia._parse_thumbnail_input( - thumbnail - ) - self.width: Optional[int] = width - self.height: Optional[int] = height - self._duration: Optional[dtm.timedelta] = to_timedelta(duration) - self.supports_streaming: Optional[bool] = supports_streaming - self.cover: Optional[Union[InputFile, str]] = ( - parse_file_input(cover, attach=True, local_mode=True) if cover else None - ) - self.start_timestamp: Optional[int] = start_timestamp - - @property - def duration(self) -> Optional[Union[int, dtm.timedelta]]: - return get_timedelta_value(self._duration, attribute="duration") - - -class InputMediaAnimation(InputMedia): - """Represents an animation file (GIF or H.264/MPEG-4 AVC video without sound) to be sent. - - Note: - When using a :class:`telegram.Animation` for the :attr:`media` attribute, it will take the - width, height and duration from that animation, unless otherwise specified with the - optional arguments. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - .. versionchanged:: 20.5 - |removed_thumb_note| - - Args: - media (:obj:`str` | :term:`file object` | :class:`~telegram.InputFile` | :obj:`bytes` | \ - :class:`pathlib.Path` | :class:`telegram.Animation`): File to send. |fileinputnopath| - Lastly you can pass an existing :class:`telegram.Animation` object to send. - - .. versionchanged:: 13.2 - Accept :obj:`bytes` as input. - filename (:obj:`str`, optional): Custom file name for the animation, when uploading a - new file. Convenience parameter, useful e.g. when sending files generated by the - :obj:`tempfile` module. - - .. versionadded:: 13.1 - caption (:obj:`str`, optional): Caption of the animation to be sent, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters - after entities parsing. - parse_mode (:obj:`str`, optional): |parse_mode| - caption_entities (Sequence[:class:`telegram.MessageEntity`], optional): |caption_entities| - - .. versionchanged:: 20.0 - |sequenceclassargs| - - width (:obj:`int`, optional): Animation width. - height (:obj:`int`, optional): Animation height. - duration (:obj:`int` | :class:`datetime.timedelta`, optional): Animation duration - in seconds. - - .. versionchanged:: v22.2 - |time-period-input| - has_spoiler (:obj:`bool`, optional): Pass :obj:`True`, if the animation needs to be covered - with a spoiler animation. - - .. versionadded:: 20.0 - thumbnail (:term:`file object` | :obj:`bytes` | :class:`pathlib.Path` | :obj:`str`, \ - optional): |thumbdocstringnopath| - - .. versionadded:: 20.2 - show_caption_above_media (:obj:`bool`, optional): Pass |show_cap_above_med| - - .. versionadded:: 21.3 - - Attributes: - type (:obj:`str`): :tg-const:`telegram.constants.InputMediaType.ANIMATION`. - media (:obj:`str` | :class:`telegram.InputFile`): Animation to send. - caption (:obj:`str`): Optional. Caption of the animation to be sent, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters - after entities parsing. - parse_mode (:obj:`str`): Optional. The parse mode to use for text formatting. - caption_entities (tuple[:class:`telegram.MessageEntity`]): Optional. |captionentitiesattr| - - .. versionchanged:: 20.0 - - * |tupleclassattrs| - * |alwaystuple| - width (:obj:`int`): Optional. Animation width. - height (:obj:`int`): Optional. Animation height. - duration (:obj:`int` | :class:`datetime.timedelta`): Optional. Animation duration - in seconds. - - .. deprecated:: v22.2 - |time-period-int-deprecated| - has_spoiler (:obj:`bool`): Optional. :obj:`True`, if the animation is covered with a - spoiler animation. - - .. versionadded:: 20.0 - thumbnail (:class:`telegram.InputFile`): Optional. |thumbdocstringbase| - - .. versionadded:: 20.2 - show_caption_above_media (:obj:`bool`): Optional. |show_cap_above_med| - - .. versionadded:: 21.3 - """ - - __slots__ = ( - "_duration", - "has_spoiler", - "height", - "show_caption_above_media", - "thumbnail", - "width", - ) - - def __init__( - self, - media: Union[FileInput, Animation], - caption: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - width: Optional[int] = None, - height: Optional[int] = None, - duration: Optional[TimePeriod] = None, - caption_entities: Optional[Sequence[MessageEntity]] = None, - filename: Optional[str] = None, - has_spoiler: Optional[bool] = None, - thumbnail: Optional[FileInput] = None, - show_caption_above_media: Optional[bool] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - if isinstance(media, Animation): - width = media.width if width is None else width - height = media.height if height is None else height - duration = duration if duration is not None else media._duration - media = media.file_id - else: - # We use local_mode=True because we don't have access to the actual setting and want - # things to work in local mode. - media = parse_file_input(media, filename=filename, attach=True, local_mode=True) - - super().__init__( - InputMediaType.ANIMATION, - media, - caption, - caption_entities, - parse_mode, - api_kwargs=api_kwargs, - ) - with self._unfrozen(): - self.thumbnail: Optional[Union[str, InputFile]] = self._parse_thumbnail_input( - thumbnail - ) - self.width: Optional[int] = width - self.height: Optional[int] = height - self._duration: Optional[dtm.timedelta] = to_timedelta(duration) - self.has_spoiler: Optional[bool] = has_spoiler - self.show_caption_above_media: Optional[bool] = show_caption_above_media - - @property - def duration(self) -> Optional[Union[int, dtm.timedelta]]: - return get_timedelta_value(self._duration, attribute="duration") - - -class InputMediaPhoto(InputMedia): - """Represents a photo to be sent. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - Args: - media (:obj:`str` | :term:`file object` | :class:`~telegram.InputFile` | :obj:`bytes` | \ - :class:`pathlib.Path` | :class:`telegram.PhotoSize`): File to send. |fileinputnopath| - Lastly you can pass an existing :class:`telegram.PhotoSize` object to send. - - .. versionchanged:: 13.2 - Accept :obj:`bytes` as input. - filename (:obj:`str`, optional): Custom file name for the photo, when uploading a - new file. Convenience parameter, useful e.g. when sending files generated by the - :obj:`tempfile` module. - - .. versionadded:: 13.1 - caption (:obj:`str`, optional ): Caption of the photo to be sent, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters after - entities parsing. - parse_mode (:obj:`str`, optional): |parse_mode| - caption_entities (Sequence[:class:`telegram.MessageEntity`], optional): |caption_entities| - - .. versionchanged:: 20.0 - |sequenceclassargs| - has_spoiler (:obj:`bool`, optional): Pass :obj:`True`, if the photo needs to be covered - with a spoiler animation. - - .. versionadded:: 20.0 - show_caption_above_media (:obj:`bool`, optional): Pass |show_cap_above_med| - - .. versionadded:: 21.3 - - Attributes: - type (:obj:`str`): :tg-const:`telegram.constants.InputMediaType.PHOTO`. - media (:obj:`str` | :class:`telegram.InputFile`): Photo to send. - caption (:obj:`str`): Optional. Caption of the photo to be sent, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters - after entities parsing. - parse_mode (:obj:`str`): Optional. |parse_mode| - caption_entities (tuple[:class:`telegram.MessageEntity`]): Optional. |captionentitiesattr| - - .. versionchanged:: 20.0 - - * |tupleclassattrs| - * |alwaystuple| - has_spoiler (:obj:`bool`): Optional. :obj:`True`, if the photo is covered with a - spoiler animation. - - .. versionadded:: 20.0 - show_caption_above_media (:obj:`bool`): Optional. |show_cap_above_med| - - .. versionadded:: 21.3 - """ - - __slots__ = ( - "has_spoiler", - "show_caption_above_media", - ) - - def __init__( - self, - media: Union[FileInput, PhotoSize], - caption: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence[MessageEntity]] = None, - filename: Optional[str] = None, - has_spoiler: Optional[bool] = None, - show_caption_above_media: Optional[bool] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - # We use local_mode=True because we don't have access to the actual setting and want - # things to work in local mode. - media = parse_file_input(media, PhotoSize, filename=filename, attach=True, local_mode=True) - super().__init__( - InputMediaType.PHOTO, - media, - caption, - caption_entities, - parse_mode, - api_kwargs=api_kwargs, - ) - - with self._unfrozen(): - self.has_spoiler: Optional[bool] = has_spoiler - self.show_caption_above_media: Optional[bool] = show_caption_above_media - - -class InputMediaVideo(InputMedia): - """Represents a video to be sent. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - Note: - * When using a :class:`telegram.Video` for the :attr:`media` attribute, it will take the - width, height and duration from that video, unless otherwise specified with the optional - arguments. - * :paramref:`thumbnail` will be ignored for small video files, for which Telegram can - easily generate thumbnails. However, this behaviour is undocumented and might be - changed by Telegram. - - .. versionchanged:: 20.5 - |removed_thumb_note| - - Args: - media (:obj:`str` | :term:`file object` | :class:`~telegram.InputFile` | :obj:`bytes` | \ - :class:`pathlib.Path` | :class:`telegram.Video`): File to send. |fileinputnopath| - Lastly you can pass an existing :class:`telegram.Video` object to send. - - .. versionchanged:: 13.2 - Accept :obj:`bytes` as input. - filename (:obj:`str`, optional): Custom file name for the video, when uploading a - new file. Convenience parameter, useful e.g. when sending files generated by the - :obj:`tempfile` module. - - .. versionadded:: 13.1 - caption (:obj:`str`, optional): Caption of the video to be sent, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters after - entities parsing. - parse_mode (:obj:`str`, optional): |parse_mode| - caption_entities (Sequence[:class:`telegram.MessageEntity`], optional): |caption_entities| - - .. versionchanged:: 20.0 - |sequenceclassargs| - - width (:obj:`int`, optional): Video width. - height (:obj:`int`, optional): Video height. - duration (:obj:`int` | :class:`datetime.timedelta`, optional): Video duration in seconds. - - .. versionchanged:: v22.2 - |time-period-input| - supports_streaming (:obj:`bool`, optional): Pass :obj:`True`, if the uploaded video is - suitable for streaming. - has_spoiler (:obj:`bool`, optional): Pass :obj:`True`, if the video needs to be covered - with a spoiler animation. - - .. versionadded:: 20.0 - thumbnail (:term:`file object` | :obj:`bytes` | :class:`pathlib.Path` | :obj:`str`, \ - optional): |thumbdocstringnopath| - - .. versionadded:: 20.2 - cover (:term:`file object` | :obj:`bytes` | :class:`pathlib.Path` | :obj:`str`, \ - optional): Cover for the video in the message. |fileinputnopath| - - .. versionchanged:: 21.11 - start_timestamp (:obj:`int`, optional): Start timestamp for the video in the message - - .. versionchanged:: 21.11 - show_caption_above_media (:obj:`bool`, optional): Pass |show_cap_above_med| - - .. versionadded:: 21.3 - - Attributes: - type (:obj:`str`): :tg-const:`telegram.constants.InputMediaType.VIDEO`. - media (:obj:`str` | :class:`telegram.InputFile`): Video file to send. - caption (:obj:`str`): Optional. Caption of the video to be sent, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters - after entities parsing. - parse_mode (:obj:`str`): Optional. |parse_mode| - caption_entities (tuple[:class:`telegram.MessageEntity`]): Optional. |captionentitiesattr| - - .. versionchanged:: 20.0 - - * |tupleclassattrs| - * |alwaystuple| - width (:obj:`int`): Optional. Video width. - height (:obj:`int`): Optional. Video height. - duration (:obj:`int` | :class:`datetime.timedelta`): Optional. Video duration in seconds. - - .. deprecated:: v22.2 - |time-period-int-deprecated| - supports_streaming (:obj:`bool`): Optional. :obj:`True`, if the uploaded video is - suitable for streaming. - has_spoiler (:obj:`bool`): Optional. :obj:`True`, if the video is covered with a - spoiler animation. - - .. versionadded:: 20.0 - thumbnail (:class:`telegram.InputFile`): Optional. |thumbdocstringbase| - - .. versionadded:: 20.2 - show_caption_above_media (:obj:`bool`): Optional. |show_cap_above_med| - - .. versionadded:: 21.3 - cover (:class:`telegram.InputFile`): Optional. Cover for the video in the message. - |fileinputnopath| - - .. versionchanged:: 21.11 - start_timestamp (:obj:`int`): Optional. Start timestamp for the video in the message - - .. versionchanged:: 21.11 - """ - - __slots__ = ( - "_duration", - "cover", - "has_spoiler", - "height", - "show_caption_above_media", - "start_timestamp", - "supports_streaming", - "thumbnail", - "width", - ) - - def __init__( - self, - media: Union[FileInput, Video], - caption: Optional[str] = None, - width: Optional[int] = None, - height: Optional[int] = None, - duration: Optional[TimePeriod] = None, - supports_streaming: Optional[bool] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence[MessageEntity]] = None, - filename: Optional[str] = None, - has_spoiler: Optional[bool] = None, - thumbnail: Optional[FileInput] = None, - show_caption_above_media: Optional[bool] = None, - cover: Optional[FileInput] = None, - start_timestamp: Optional[int] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - if isinstance(media, Video): - width = width if width is not None else media.width - height = height if height is not None else media.height - duration = duration if duration is not None else media._duration - media = media.file_id - else: - # We use local_mode=True because we don't have access to the actual setting and want - # things to work in local mode. - media = parse_file_input(media, filename=filename, attach=True, local_mode=True) - - super().__init__( - InputMediaType.VIDEO, - media, - caption, - caption_entities, - parse_mode, - api_kwargs=api_kwargs, - ) - with self._unfrozen(): - self.width: Optional[int] = width - self.height: Optional[int] = height - self._duration: Optional[dtm.timedelta] = to_timedelta(duration) - self.thumbnail: Optional[Union[str, InputFile]] = self._parse_thumbnail_input( - thumbnail - ) - self.supports_streaming: Optional[bool] = supports_streaming - self.has_spoiler: Optional[bool] = has_spoiler - self.show_caption_above_media: Optional[bool] = show_caption_above_media - self.cover: Optional[Union[InputFile, str]] = ( - parse_file_input(cover, attach=True, local_mode=True) if cover else None - ) - self.start_timestamp: Optional[int] = start_timestamp - - @property - def duration(self) -> Optional[Union[int, dtm.timedelta]]: - return get_timedelta_value(self._duration, attribute="duration") - - -class InputMediaAudio(InputMedia): - """Represents an audio file to be treated as music to be sent. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - Note: - When using a :class:`telegram.Audio` for the :attr:`media` attribute, it will take the - duration, performer and title from that video, unless otherwise specified with the - optional arguments. - - .. versionchanged:: 20.5 - |removed_thumb_note| - - Args: - media (:obj:`str` | :term:`file object` | :class:`~telegram.InputFile` | :obj:`bytes` | \ - :class:`pathlib.Path` | :class:`telegram.Audio`): File to send. |fileinputnopath| - Lastly you can pass an existing :class:`telegram.Audio` object to send. - - .. versionchanged:: 13.2 - Accept :obj:`bytes` as input. - filename (:obj:`str`, optional): Custom file name for the audio, when uploading a - new file. Convenience parameter, useful e.g. when sending files generated by the - :obj:`tempfile` module. - - .. versionadded:: 13.1 - caption (:obj:`str`, optional): Caption of the audio to be sent, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters after - entities parsing. - parse_mode (:obj:`str`, optional): |parse_mode| - caption_entities (Sequence[:class:`telegram.MessageEntity`], optional): |caption_entities| - - .. versionchanged:: 20.0 - |sequenceclassargs| - - duration (:obj:`int` | :class:`datetime.timedelta`, optional): Duration of the audio - in seconds as defined by the sender. - - .. versionchanged:: v22.2 - |time-period-input| - performer (:obj:`str`, optional): Performer of the audio as defined by the sender or by - audio tags. - title (:obj:`str`, optional): Title of the audio as defined by the sender or by audio tags. - thumbnail (:term:`file object` | :obj:`bytes` | :class:`pathlib.Path` | :obj:`str`, \ - optional): |thumbdocstringnopath| - - .. versionadded:: 20.2 - - Attributes: - type (:obj:`str`): :tg-const:`telegram.constants.InputMediaType.AUDIO`. - media (:obj:`str` | :class:`telegram.InputFile`): Audio file to send. - caption (:obj:`str`): Optional. Caption of the audio to be sent, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters - after entities parsing. - parse_mode (:obj:`str`): Optional. |parse_mode| - caption_entities (tuple[:class:`telegram.MessageEntity`]): Optional. |captionentitiesattr| - - .. versionchanged:: 20.0 - - * |tupleclassattrs| - * |alwaystuple| - duration (:obj:`int` | :class:`datetime.timedelta`): Optional. Duration of the audio - in seconds. - - .. deprecated:: v22.2 - |time-period-int-deprecated| - performer (:obj:`str`): Optional. Performer of the audio as defined by the sender or by - audio tags. - title (:obj:`str`): Optional. Title of the audio as defined by the sender or by audio tags. - thumbnail (:class:`telegram.InputFile`): Optional. |thumbdocstringbase| - - .. versionadded:: 20.2 - - """ - - __slots__ = ("_duration", "performer", "thumbnail", "title") - - def __init__( - self, - media: Union[FileInput, Audio], - caption: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - duration: Optional[TimePeriod] = None, - performer: Optional[str] = None, - title: Optional[str] = None, - caption_entities: Optional[Sequence[MessageEntity]] = None, - filename: Optional[str] = None, - thumbnail: Optional[FileInput] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - if isinstance(media, Audio): - duration = duration if duration is not None else media._duration - performer = media.performer if performer is None else performer - title = media.title if title is None else title - media = media.file_id - else: - # We use local_mode=True because we don't have access to the actual setting and want - # things to work in local mode. - media = parse_file_input(media, filename=filename, attach=True, local_mode=True) - - super().__init__( - InputMediaType.AUDIO, - media, - caption, - caption_entities, - parse_mode, - api_kwargs=api_kwargs, - ) - with self._unfrozen(): - self.thumbnail: Optional[Union[str, InputFile]] = self._parse_thumbnail_input( - thumbnail - ) - self._duration: Optional[dtm.timedelta] = to_timedelta(duration) - self.title: Optional[str] = title - self.performer: Optional[str] = performer - - @property - def duration(self) -> Optional[Union[int, dtm.timedelta]]: - return get_timedelta_value(self._duration, attribute="duration") - - -class InputMediaDocument(InputMedia): - """Represents a general file to be sent. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - .. versionchanged:: 20.5 - |removed_thumb_note| - - Args: - media (:obj:`str` | :term:`file object` | :class:`~telegram.InputFile` | :obj:`bytes` \ - | :class:`pathlib.Path` | :class:`telegram.Document`): File to send. |fileinputnopath| - Lastly you can pass an existing :class:`telegram.Document` object to send. - - .. versionchanged:: 13.2 - Accept :obj:`bytes` as input. - filename (:obj:`str`, optional): Custom file name for the document, when uploading a - new file. Convenience parameter, useful e.g. when sending files generated by the - :obj:`tempfile` module. - - .. versionadded:: 13.1 - caption (:obj:`str`, optional): Caption of the document to be sent, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters after - entities parsing. - parse_mode (:obj:`str`, optional): |parse_mode| - caption_entities (Sequence[:class:`telegram.MessageEntity`], optional): |caption_entities| - - .. versionchanged:: 20.0 - |sequenceclassargs| - - disable_content_type_detection (:obj:`bool`, optional): Disables automatic server-side - content type detection for files uploaded using multipart/form-data. Always - :obj:`True`, if the document is sent as part of an album. - thumbnail (:term:`file object` | :obj:`bytes` | :class:`pathlib.Path` | :obj:`str`, \ - optional): |thumbdocstringnopath| - - .. versionadded:: 20.2 - - Attributes: - type (:obj:`str`): :tg-const:`telegram.constants.InputMediaType.DOCUMENT`. - media (:obj:`str` | :class:`telegram.InputFile`): File to send. - caption (:obj:`str`): Optional. Caption of the document to be sent, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters - after entities parsing. - parse_mode (:obj:`str`): Optional. |parse_mode| - caption_entities (tuple[:class:`telegram.MessageEntity`]): Optional. |captionentitiesattr| - - .. versionchanged:: 20.0 - - * |tupleclassattrs| - * |alwaystuple| - disable_content_type_detection (:obj:`bool`): Optional. Disables automatic server-side - content type detection for files uploaded using multipart/form-data. Always - :obj:`True`, if the document is sent as part of an album. - thumbnail (:class:`telegram.InputFile`): Optional. |thumbdocstringbase| - - .. versionadded:: 20.2 - """ - - __slots__ = ("disable_content_type_detection", "thumbnail") - - def __init__( - self, - media: Union[FileInput, Document], - caption: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - disable_content_type_detection: Optional[bool] = None, - caption_entities: Optional[Sequence[MessageEntity]] = None, - filename: Optional[str] = None, - thumbnail: Optional[FileInput] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - # We use local_mode=True because we don't have access to the actual setting and want - # things to work in local mode. - media = parse_file_input(media, Document, filename=filename, attach=True, local_mode=True) - - super().__init__( - InputMediaType.DOCUMENT, - media, - caption, - caption_entities, - parse_mode, - api_kwargs=api_kwargs, - ) - with self._unfrozen(): - self.thumbnail: Optional[Union[str, InputFile]] = self._parse_thumbnail_input( - thumbnail - ) - self.disable_content_type_detection: Optional[bool] = disable_content_type_detection diff --git a/venv/lib/python3.12/site-packages/telegram/_files/inputprofilephoto.py b/venv/lib/python3.12/site-packages/telegram/_files/inputprofilephoto.py deleted file mode 100644 index 5a37ab6..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_files/inputprofilephoto.py +++ /dev/null @@ -1,138 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an objects that represents a InputProfilePhoto and subclasses.""" - -import datetime as dtm -from typing import TYPE_CHECKING, Optional, Union - -from telegram import constants -from telegram._telegramobject import TelegramObject -from telegram._utils import enum -from telegram._utils.argumentparsing import to_timedelta -from telegram._utils.files import parse_file_input -from telegram._utils.types import FileInput, JSONDict - -if TYPE_CHECKING: - from telegram import InputFile - - -class InputProfilePhoto(TelegramObject): - """This object describes a profile photo to set. Currently, it can be one of - - * :class:`InputProfilePhotoStatic` - * :class:`InputProfilePhotoAnimated` - - .. versionadded:: 22.1 - - Args: - type (:obj:`str`): Type of the profile photo. - - Attributes: - type (:obj:`str`): Type of the profile photo. - - """ - - STATIC = constants.InputProfilePhotoType.STATIC - """:obj:`str`: :tg-const:`telegram.constants.InputProfilePhotoType.STATIC`.""" - ANIMATED = constants.InputProfilePhotoType.ANIMATED - """:obj:`str`: :tg-const:`telegram.constants.InputProfilePhotoType.ANIMATED`.""" - - __slots__ = ("type",) - - def __init__( - self, - type: str, # pylint: disable=redefined-builtin - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.type: str = enum.get_member(constants.InputProfilePhotoType, type, type) - - self._freeze() - - -class InputProfilePhotoStatic(InputProfilePhoto): - """A static profile photo in the .JPG format. - - .. versionadded:: 22.1 - - Args: - photo (:term:`file object` | :class:`~telegram.InputFile` | :obj:`bytes` | \ - :class:`pathlib.Path`): The static profile photo. |uploadinputnopath| - - Attributes: - type (:obj:`str`): :tg-const:`telegram.constants.InputProfilePhotoType.STATIC`. - photo (:class:`telegram.InputFile` | :obj:`str`): The static profile photo. - - """ - - __slots__ = ("photo",) - - def __init__( - self, - photo: FileInput, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(type=constants.InputProfilePhotoType.STATIC, api_kwargs=api_kwargs) - with self._unfrozen(): - # We use local_mode=True because we don't have access to the actual setting and want - # things to work in local mode. - self.photo: Union[str, InputFile] = parse_file_input( - photo, attach=True, local_mode=True - ) - - -class InputProfilePhotoAnimated(InputProfilePhoto): - """An animated profile photo in the MPEG4 format. - - .. versionadded:: 22.1 - - Args: - animation (:term:`file object` | :class:`~telegram.InputFile` | :obj:`bytes` | \ - :class:`pathlib.Path`): The animated profile photo. |uploadinputnopath| - main_frame_timestamp (:class:`datetime.timedelta` | :obj:`int` | :obj:`float`, optional): - Timestamp in seconds of the frame that will be used as the static profile photo. - Defaults to ``0.0``. - - Attributes: - type (:obj:`str`): :tg-const:`telegram.constants.InputProfilePhotoType.ANIMATED`. - animation (:class:`telegram.InputFile` | :obj:`str`): The animated profile photo. - main_frame_timestamp (:class:`datetime.timedelta`): Optional. Timestamp in seconds of the - frame that will be used as the static profile photo. Defaults to ``0.0``. - """ - - __slots__ = ("animation", "main_frame_timestamp") - - def __init__( - self, - animation: FileInput, - main_frame_timestamp: Union[float, dtm.timedelta, None] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(type=constants.InputProfilePhotoType.ANIMATED, api_kwargs=api_kwargs) - with self._unfrozen(): - # We use local_mode=True because we don't have access to the actual setting and want - # things to work in local mode. - self.animation: Union[str, InputFile] = parse_file_input( - animation, attach=True, local_mode=True - ) - - self.main_frame_timestamp: Optional[dtm.timedelta] = to_timedelta(main_frame_timestamp) diff --git a/venv/lib/python3.12/site-packages/telegram/_files/inputsticker.py b/venv/lib/python3.12/site-packages/telegram/_files/inputsticker.py deleted file mode 100644 index 0043463..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_files/inputsticker.py +++ /dev/null @@ -1,119 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram InputSticker.""" - -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional, Union - -from telegram._files.sticker import MaskPosition -from telegram._telegramobject import TelegramObject -from telegram._utils.argumentparsing import parse_sequence_arg -from telegram._utils.files import parse_file_input -from telegram._utils.types import FileInput, JSONDict - -if TYPE_CHECKING: - from telegram._files.inputfile import InputFile - - -class InputSticker(TelegramObject): - """ - This object describes a sticker to be added to a sticker set. - - .. versionadded:: 20.2 - - .. versionchanged:: 21.1 - As of Bot API 7.2, the new argument :paramref:`format` is a required argument, and thus the - order of the arguments has changed. - - Args: - sticker (:obj:`str` | :term:`file object` | :class:`~telegram.InputFile` | :obj:`bytes` \ - | :class:`pathlib.Path`): The - added sticker. |uploadinputnopath| Animated and video stickers can't be uploaded via - HTTP URL. - emoji_list (Sequence[:obj:`str`]): Sequence of - :tg-const:`telegram.constants.StickerLimit.MIN_STICKER_EMOJI` - - :tg-const:`telegram.constants.StickerLimit.MAX_STICKER_EMOJI` emoji associated with the - sticker. - mask_position (:class:`telegram.MaskPosition`, optional): Position where the mask should be - placed on faces. For ":tg-const:`telegram.constants.StickerType.MASK`" stickers only. - keywords (Sequence[:obj:`str`], optional): Sequence of - 0-:tg-const:`telegram.constants.StickerLimit.MAX_SEARCH_KEYWORDS` search keywords - for the sticker with the total length of up to - :tg-const:`telegram.constants.StickerLimit.MAX_KEYWORD_LENGTH` characters. For - ":tg-const:`telegram.constants.StickerType.REGULAR`" and - ":tg-const:`telegram.constants.StickerType.CUSTOM_EMOJI`" stickers only. - format (:obj:`str`): Format of the added sticker, must be one of - :tg-const:`telegram.constants.StickerFormat.STATIC` for a - ``.WEBP`` or ``.PNG`` image, :tg-const:`telegram.constants.StickerFormat.ANIMATED` - for a ``.TGS`` animation, :tg-const:`telegram.constants.StickerFormat.VIDEO` for a - ``.WEBM`` video. - - .. versionadded:: 21.1 - - Attributes: - sticker (:obj:`str` | :class:`telegram.InputFile`): The added sticker. - emoji_list (tuple[:obj:`str`]): Tuple of - :tg-const:`telegram.constants.StickerLimit.MIN_STICKER_EMOJI` - - :tg-const:`telegram.constants.StickerLimit.MAX_STICKER_EMOJI` emoji associated with the - sticker. - mask_position (:class:`telegram.MaskPosition`): Optional. Position where the mask should be - placed on faces. For ":tg-const:`telegram.constants.StickerType.MASK`" stickers only. - keywords (tuple[:obj:`str`]): Optional. Tuple of - 0-:tg-const:`telegram.constants.StickerLimit.MAX_SEARCH_KEYWORDS` search keywords - for the sticker with the total length of up to - :tg-const:`telegram.constants.StickerLimit.MAX_KEYWORD_LENGTH` characters. For - ":tg-const:`telegram.constants.StickerType.REGULAR`" and - ":tg-const:`telegram.constants.StickerType.CUSTOM_EMOJI`" stickers only. - ":tg-const:`telegram.constants.StickerType.CUSTOM_EMOJI`" stickers only. - format (:obj:`str`): Format of the added sticker, must be one of - :tg-const:`telegram.constants.StickerFormat.STATIC` for a - ``.WEBP`` or ``.PNG`` image, :tg-const:`telegram.constants.StickerFormat.ANIMATED` - for a ``.TGS`` animation, :tg-const:`telegram.constants.StickerFormat.VIDEO` for a - ``.WEBM`` video. - - .. versionadded:: 21.1 - """ - - __slots__ = ("emoji_list", "format", "keywords", "mask_position", "sticker") - - def __init__( - self, - sticker: FileInput, - emoji_list: Sequence[str], - format: str, # pylint: disable=redefined-builtin - mask_position: Optional[MaskPosition] = None, - keywords: Optional[Sequence[str]] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - - # We use local_mode=True because we don't have access to the actual setting and want - # things to work in local mode. - self.sticker: Union[str, InputFile] = parse_file_input( - sticker, - local_mode=True, - attach=True, - ) - self.emoji_list: tuple[str, ...] = parse_sequence_arg(emoji_list) - self.format: str = format - self.mask_position: Optional[MaskPosition] = mask_position - self.keywords: tuple[str, ...] = parse_sequence_arg(keywords) - - self._freeze() diff --git a/venv/lib/python3.12/site-packages/telegram/_files/location.py b/venv/lib/python3.12/site-packages/telegram/_files/location.py deleted file mode 100644 index e0bea45..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_files/location.py +++ /dev/null @@ -1,128 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram Location.""" - -import datetime as dtm -from typing import Final, Optional, Union - -from telegram import constants -from telegram._telegramobject import TelegramObject -from telegram._utils.argumentparsing import to_timedelta -from telegram._utils.datetime import get_timedelta_value -from telegram._utils.types import JSONDict, TimePeriod - - -class Location(TelegramObject): - """This object represents a point on the map. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`longitude` and :attr:`latitude` are equal. - - Args: - longitude (:obj:`float`): Longitude as defined by the sender. - latitude (:obj:`float`): Latitude as defined by the sender. - horizontal_accuracy (:obj:`float`, optional): The radius of uncertainty for the location, - measured in meters; 0-:tg-const:`telegram.Location.HORIZONTAL_ACCURACY`. - live_period (:obj:`int` | :class:`datetime.timedelta`, optional): Time relative to the - message sending date, during which the location can be updated, in seconds. For active - live locations only. - - .. versionchanged:: v22.2 - |time-period-input| - heading (:obj:`int`, optional): The direction in which user is moving, in degrees; - :tg-const:`telegram.Location.MIN_HEADING`-:tg-const:`telegram.Location.MAX_HEADING`. - For active live locations only. - proximity_alert_radius (:obj:`int`, optional): Maximum distance for proximity alerts about - approaching another chat member, in meters. For sent live locations only. - - Attributes: - longitude (:obj:`float`): Longitude as defined by the sender. - latitude (:obj:`float`): Latitude as defined by the sender. - horizontal_accuracy (:obj:`float`): Optional. The radius of uncertainty for the location, - measured in meters; 0-:tg-const:`telegram.Location.HORIZONTAL_ACCURACY`. - live_period (:obj:`int` | :class:`datetime.timedelta`): Optional. Time relative to the - message sending date, during which the location can be updated, in seconds. For active - live locations only. - - .. deprecated:: v22.2 - |time-period-int-deprecated| - heading (:obj:`int`): Optional. The direction in which user is moving, in degrees; - :tg-const:`telegram.Location.MIN_HEADING`-:tg-const:`telegram.Location.MAX_HEADING`. - For active live locations only. - proximity_alert_radius (:obj:`int`): Optional. Maximum distance for proximity alerts about - approaching another chat member, in meters. For sent live locations only. - - """ - - __slots__ = ( - "_live_period", - "heading", - "horizontal_accuracy", - "latitude", - "longitude", - "proximity_alert_radius", - ) - - def __init__( - self, - longitude: float, - latitude: float, - horizontal_accuracy: Optional[float] = None, - live_period: Optional[TimePeriod] = None, - heading: Optional[int] = None, - proximity_alert_radius: Optional[int] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - # Required - self.longitude: float = longitude - self.latitude: float = latitude - - # Optionals - self.horizontal_accuracy: Optional[float] = horizontal_accuracy - self._live_period: Optional[dtm.timedelta] = to_timedelta(live_period) - self.heading: Optional[int] = heading - self.proximity_alert_radius: Optional[int] = ( - int(proximity_alert_radius) if proximity_alert_radius else None - ) - - self._id_attrs = (self.longitude, self.latitude) - - self._freeze() - - @property - def live_period(self) -> Optional[Union[int, dtm.timedelta]]: - return get_timedelta_value(self._live_period, attribute="live_period") - - HORIZONTAL_ACCURACY: Final[int] = constants.LocationLimit.HORIZONTAL_ACCURACY - """:const:`telegram.constants.LocationLimit.HORIZONTAL_ACCURACY` - - .. versionadded:: 20.0 - """ - MIN_HEADING: Final[int] = constants.LocationLimit.MIN_HEADING - """:const:`telegram.constants.LocationLimit.MIN_HEADING` - - .. versionadded:: 20.0 - """ - MAX_HEADING: Final[int] = constants.LocationLimit.MAX_HEADING - """:const:`telegram.constants.LocationLimit.MAX_HEADING` - - .. versionadded:: 20.0 - """ diff --git a/venv/lib/python3.12/site-packages/telegram/_files/photosize.py b/venv/lib/python3.12/site-packages/telegram/_files/photosize.py deleted file mode 100644 index e06dc3b..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_files/photosize.py +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram PhotoSize.""" - -from typing import Optional - -from telegram._files._basemedium import _BaseMedium -from telegram._utils.types import JSONDict - - -class PhotoSize(_BaseMedium): - """This object represents one size of a photo or a file/sticker thumbnail. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`file_unique_id` is equal. - - Args: - file_id (:obj:`str`): Identifier for this file, which can be used to download - or reuse the file. - file_unique_id (:obj:`str`): Unique identifier for this file, which - is supposed to be the same over time and for different bots. - Can't be used to download or reuse the file. - width (:obj:`int`): Photo width. - height (:obj:`int`): Photo height. - file_size (:obj:`int`, optional): File size in bytes. - - Attributes: - file_id (:obj:`str`): Identifier for this file, which can be used to download - or reuse the file. - file_unique_id (:obj:`str`): Unique identifier for this file, which - is supposed to be the same over time and for different bots. - Can't be used to download or reuse the file. - width (:obj:`int`): Photo width. - height (:obj:`int`): Photo height. - file_size (:obj:`int`): Optional. File size in bytes. - - - """ - - __slots__ = ("height", "width") - - def __init__( - self, - file_id: str, - file_unique_id: str, - width: int, - height: int, - file_size: Optional[int] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__( - file_id=file_id, - file_unique_id=file_unique_id, - file_size=file_size, - api_kwargs=api_kwargs, - ) - with self._unfrozen(): - # Required - self.width: int = width - self.height: int = height diff --git a/venv/lib/python3.12/site-packages/telegram/_files/sticker.py b/venv/lib/python3.12/site-packages/telegram/_files/sticker.py deleted file mode 100644 index 0bf63d4..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_files/sticker.py +++ /dev/null @@ -1,382 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains objects that represent stickers.""" -from collections.abc import Sequence -from typing import TYPE_CHECKING, Final, Optional - -from telegram import constants -from telegram._files._basethumbedmedium import _BaseThumbedMedium -from telegram._files.file import File -from telegram._files.photosize import PhotoSize -from telegram._telegramobject import TelegramObject -from telegram._utils import enum -from telegram._utils.argumentparsing import de_json_optional, de_list_optional, parse_sequence_arg -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot - - -class Sticker(_BaseThumbedMedium): - """This object represents a sticker. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`file_unique_id` is equal. - - Note: - As of v13.11 :paramref:`is_video` is a required argument and therefore the order of the - arguments had to be changed. Use keyword arguments to make sure that the arguments are - passed correctly. - - .. versionchanged:: 20.5 - |removed_thumb_note| - - Args: - file_id (:obj:`str`): Identifier for this file, which can be used to download - or reuse the file. - file_unique_id (:obj:`str`): Unique identifier for this file, which - is supposed to be the same over time and for different bots. - Can't be used to download or reuse the file. - width (:obj:`int`): Sticker width. - height (:obj:`int`): Sticker height. - is_animated (:obj:`bool`): :obj:`True`, if the sticker is animated. - is_video (:obj:`bool`): :obj:`True`, if the sticker is a video sticker. - - .. versionadded:: 13.11 - type (:obj:`str`): Type of the sticker. Currently one of :attr:`REGULAR`, - :attr:`MASK`, :attr:`CUSTOM_EMOJI`. The type of the sticker is independent from its - format, which is determined by the fields :attr:`is_animated` and :attr:`is_video`. - - .. versionadded:: 20.0 - emoji (:obj:`str`, optional): Emoji associated with the sticker - set_name (:obj:`str`, optional): Name of the sticker set to which the sticker belongs. - mask_position (:class:`telegram.MaskPosition`, optional): For mask stickers, the position - where the mask should be placed. - file_size (:obj:`int`, optional): File size in bytes. - - premium_animation (:class:`telegram.File`, optional): For premium regular stickers, - premium animation for the sticker. - - .. versionadded:: 20.0 - custom_emoji_id (:obj:`str`, optional): For custom emoji stickers, unique identifier of the - custom emoji. - - .. versionadded:: 20.0 - thumbnail (:class:`telegram.PhotoSize`, optional): Sticker thumbnail in the ``.WEBP`` or - ``.JPG`` format. - - .. versionadded:: 20.2 - needs_repainting (:obj:`bool`, optional): :obj:`True`, if the sticker must be repainted to - a text color in messages, the color of the Telegram Premium badge in emoji status, - white color on chat photos, or another appropriate color in other places. - - .. versionadded:: 20.2 - - Attributes: - file_id (:obj:`str`): Identifier for this file, which can be used to download - or reuse the file. - file_unique_id (:obj:`str`): Unique identifier for this file, which - is supposed to be the same over time and for different bots. - Can't be used to download or reuse the file. - width (:obj:`int`): Sticker width. - height (:obj:`int`): Sticker height. - is_animated (:obj:`bool`): :obj:`True`, if the sticker is animated. - is_video (:obj:`bool`): :obj:`True`, if the sticker is a video sticker. - - .. versionadded:: 13.11 - type (:obj:`str`): Type of the sticker. Currently one of :attr:`REGULAR`, - :attr:`MASK`, :attr:`CUSTOM_EMOJI`. The type of the sticker is independent from its - format, which is determined by the fields :attr:`is_animated` and :attr:`is_video`. - - .. versionadded:: 20.0 - emoji (:obj:`str`): Optional. Emoji associated with the sticker. - set_name (:obj:`str`): Optional. Name of the sticker set to which the sticker belongs. - mask_position (:class:`telegram.MaskPosition`): Optional. For mask stickers, the position - where the mask should be placed. - file_size (:obj:`int`): Optional. File size in bytes. - - premium_animation (:class:`telegram.File`): Optional. For premium regular stickers, - premium animation for the sticker. - - .. versionadded:: 20.0 - custom_emoji_id (:obj:`str`): Optional. For custom emoji stickers, unique identifier of the - custom emoji. - - .. versionadded:: 20.0 - thumbnail (:class:`telegram.PhotoSize`): Optional. Sticker thumbnail in the ``.WEBP`` or - ``.JPG`` format. - - .. versionadded:: 20.2 - needs_repainting (:obj:`bool`): Optional. :obj:`True`, if the sticker must be repainted to - a text color in messages, the color of the Telegram Premium badge in emoji status, - white color on chat photos, or another appropriate color in other places. - - .. versionadded:: 20.2 - """ - - __slots__ = ( - "custom_emoji_id", - "emoji", - "height", - "is_animated", - "is_video", - "mask_position", - "needs_repainting", - "premium_animation", - "set_name", - "type", - "width", - ) - - def __init__( - self, - file_id: str, - file_unique_id: str, - width: int, - height: int, - is_animated: bool, - is_video: bool, - type: str, # pylint: disable=redefined-builtin - emoji: Optional[str] = None, - file_size: Optional[int] = None, - set_name: Optional[str] = None, - mask_position: Optional["MaskPosition"] = None, - premium_animation: Optional["File"] = None, - custom_emoji_id: Optional[str] = None, - thumbnail: Optional[PhotoSize] = None, - needs_repainting: Optional[bool] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__( - file_id=file_id, - file_unique_id=file_unique_id, - file_size=file_size, - thumbnail=thumbnail, - api_kwargs=api_kwargs, - ) - with self._unfrozen(): - # Required - self.width: int = width - self.height: int = height - self.is_animated: bool = is_animated - self.is_video: bool = is_video - self.type: str = enum.get_member(constants.StickerType, type, type) - # Optional - self.emoji: Optional[str] = emoji - self.set_name: Optional[str] = set_name - self.mask_position: Optional[MaskPosition] = mask_position - self.premium_animation: Optional[File] = premium_animation - self.custom_emoji_id: Optional[str] = custom_emoji_id - self.needs_repainting: Optional[bool] = needs_repainting - - REGULAR: Final[str] = constants.StickerType.REGULAR - """:const:`telegram.constants.StickerType.REGULAR`""" - MASK: Final[str] = constants.StickerType.MASK - """:const:`telegram.constants.StickerType.MASK`""" - CUSTOM_EMOJI: Final[str] = constants.StickerType.CUSTOM_EMOJI - """:const:`telegram.constants.StickerType.CUSTOM_EMOJI`""" - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "Sticker": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["thumbnail"] = de_json_optional(data.get("thumbnail"), PhotoSize, bot) - data["mask_position"] = de_json_optional(data.get("mask_position"), MaskPosition, bot) - data["premium_animation"] = de_json_optional(data.get("premium_animation"), File, bot) - - api_kwargs = {} - # This is a deprecated field that TG still returns for backwards compatibility - # Let's filter it out to speed up the de-json process - if data.get("thumb") is not None: - api_kwargs["thumb"] = data.pop("thumb") - - return super()._de_json(data=data, bot=bot, api_kwargs=api_kwargs) - - -class StickerSet(TelegramObject): - """This object represents a sticker set. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`name` is equal. - - Note: - As of v13.11 :paramref:`is_video` is a required argument and therefore the order of the - arguments had to be changed. Use keyword arguments to make sure that the arguments are - passed correctly. - - .. versionchanged:: 20.0 - The parameter ``contains_masks`` has been removed. Use :paramref:`sticker_type` instead. - - - .. versionchanged:: 21.1 - The parameters ``is_video`` and ``is_animated`` are deprecated and now made optional. Thus, - the order of the arguments had to be changed. - - .. versionchanged:: 20.5 - |removed_thumb_note| - - .. versionremoved:: 21.2 - Removed the deprecated arguments and attributes ``is_animated`` and ``is_video``. - - Args: - name (:obj:`str`): Sticker set name. - title (:obj:`str`): Sticker set title. - stickers (Sequence[:class:`telegram.Sticker`]): List of all set stickers. - - .. versionchanged:: 20.0 - |sequenceclassargs| - - sticker_type (:obj:`str`): Type of stickers in the set, currently one of - :attr:`telegram.Sticker.REGULAR`, :attr:`telegram.Sticker.MASK`, - :attr:`telegram.Sticker.CUSTOM_EMOJI`. - - .. versionadded:: 20.0 - thumbnail (:class:`telegram.PhotoSize`, optional): Sticker set thumbnail in the ``.WEBP``, - ``.TGS``, or ``.WEBM`` format. - - .. versionadded:: 20.2 - - Attributes: - name (:obj:`str`): Sticker set name. - title (:obj:`str`): Sticker set title. - stickers (tuple[:class:`telegram.Sticker`]): List of all set stickers. - - .. versionchanged:: 20.0 - |tupleclassattrs| - - sticker_type (:obj:`str`): Type of stickers in the set, currently one of - :attr:`telegram.Sticker.REGULAR`, :attr:`telegram.Sticker.MASK`, - :attr:`telegram.Sticker.CUSTOM_EMOJI`. - - .. versionadded:: 20.0 - thumbnail (:class:`telegram.PhotoSize`): Optional. Sticker set thumbnail in the ``.WEBP``, - ``.TGS``, or ``.WEBM`` format. - - .. versionadded:: 20.2 - """ - - __slots__ = ( - "name", - "sticker_type", - "stickers", - "thumbnail", - "title", - ) - - def __init__( - self, - name: str, - title: str, - stickers: Sequence[Sticker], - sticker_type: str, - thumbnail: Optional[PhotoSize] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.name: str = name - self.title: str = title - self.stickers: tuple[Sticker, ...] = parse_sequence_arg(stickers) - self.sticker_type: str = sticker_type - # Optional - self.thumbnail: Optional[PhotoSize] = thumbnail - self._id_attrs = (self.name,) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "StickerSet": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["thumbnail"] = de_json_optional(data.get("thumbnail"), PhotoSize, bot) - data["stickers"] = de_list_optional(data.get("stickers"), Sticker, bot) - - api_kwargs = {} - # These are deprecated fields that TG still returns for backwards compatibility - # Let's filter them out to speed up the de-json process - for deprecated_field in ("contains_masks", "thumb", "is_animated", "is_video"): - if deprecated_field in data: - api_kwargs[deprecated_field] = data.pop(deprecated_field) - - return super()._de_json(data=data, bot=bot, api_kwargs=api_kwargs) - - -class MaskPosition(TelegramObject): - """This object describes the position on faces where a mask should be placed by default. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`point`, :attr:`x_shift`, :attr:`y_shift` and, :attr:`scale` - are equal. - - Args: - point (:obj:`str`): The part of the face relative to which the mask should be placed. - One of :attr:`FOREHEAD`, :attr:`EYES`, :attr:`MOUTH`, or :attr:`CHIN`. - x_shift (:obj:`float`): Shift by X-axis measured in widths of the mask scaled to the face - size, from left to right. For example, choosing ``-1.0`` will place mask just to the - left of the default mask position. - y_shift (:obj:`float`): Shift by Y-axis measured in heights of the mask scaled to the face - size, from top to bottom. For example, ``1.0`` will place the mask just below the - default mask position. - scale (:obj:`float`): Mask scaling coefficient. For example, ``2.0`` means double size. - - Attributes: - point (:obj:`str`): The part of the face relative to which the mask should be placed. - One of :attr:`FOREHEAD`, :attr:`EYES`, :attr:`MOUTH`, or :attr:`CHIN`. - x_shift (:obj:`float`): Shift by X-axis measured in widths of the mask scaled to the face - size, from left to right. For example, choosing ``-1.0`` will place mask just to the - left of the default mask position. - y_shift (:obj:`float`): Shift by Y-axis measured in heights of the mask scaled to the face - size, from top to bottom. For example, ``1.0`` will place the mask just below the - default mask position. - scale (:obj:`float`): Mask scaling coefficient. For example, ``2.0`` means double size. - - """ - - __slots__ = ("point", "scale", "x_shift", "y_shift") - - FOREHEAD: Final[str] = constants.MaskPosition.FOREHEAD - """:const:`telegram.constants.MaskPosition.FOREHEAD`""" - EYES: Final[str] = constants.MaskPosition.EYES - """:const:`telegram.constants.MaskPosition.EYES`""" - MOUTH: Final[str] = constants.MaskPosition.MOUTH - """:const:`telegram.constants.MaskPosition.MOUTH`""" - CHIN: Final[str] = constants.MaskPosition.CHIN - """:const:`telegram.constants.MaskPosition.CHIN`""" - - def __init__( - self, - point: str, - x_shift: float, - y_shift: float, - scale: float, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.point: str = point - self.x_shift: float = x_shift - self.y_shift: float = y_shift - self.scale: float = scale - - self._id_attrs = (self.point, self.x_shift, self.y_shift, self.scale) - - self._freeze() diff --git a/venv/lib/python3.12/site-packages/telegram/_files/venue.py b/venv/lib/python3.12/site-packages/telegram/_files/venue.py deleted file mode 100644 index fd9cbdf..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_files/venue.py +++ /dev/null @@ -1,113 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram Venue.""" - -from typing import TYPE_CHECKING, Optional - -from telegram._files.location import Location -from telegram._telegramobject import TelegramObject -from telegram._utils.argumentparsing import de_json_optional -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot - - -class Venue(TelegramObject): - """This object represents a venue. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`location` and :attr:`title` are equal. - - Note: - Foursquare details and Google Place details are mutually exclusive. However, this - behaviour is undocumented and might be changed by Telegram. - - Args: - location (:class:`telegram.Location`): Venue location. - title (:obj:`str`): Name of the venue. - address (:obj:`str`): Address of the venue. - foursquare_id (:obj:`str`, optional): Foursquare identifier of the venue. - foursquare_type (:obj:`str`, optional): Foursquare type of the venue. (For example, - "arts_entertainment/default", "arts_entertainment/aquarium" or "food/icecream".) - google_place_id (:obj:`str`, optional): Google Places identifier of the venue. - google_place_type (:obj:`str`, optional): Google Places type of the venue. (See - `supported types <https://developers.google.com/maps/documentation/places/web-service\ - /supported_types>`_.) - - Attributes: - location (:class:`telegram.Location`): Venue location. - title (:obj:`str`): Name of the venue. - address (:obj:`str`): Address of the venue. - foursquare_id (:obj:`str`): Optional. Foursquare identifier of the venue. - foursquare_type (:obj:`str`): Optional. Foursquare type of the venue. (For example, - "arts_entertainment/default", "arts_entertainment/aquarium" or "food/icecream".) - google_place_id (:obj:`str`): Optional. Google Places identifier of the venue. - google_place_type (:obj:`str`): Optional. Google Places type of the venue. (See - `supported types <https://developers.google.com/maps/documentation/places/web-service\ - /supported_types>`_.) - - """ - - __slots__ = ( - "address", - "foursquare_id", - "foursquare_type", - "google_place_id", - "google_place_type", - "location", - "title", - ) - - def __init__( - self, - location: Location, - title: str, - address: str, - foursquare_id: Optional[str] = None, - foursquare_type: Optional[str] = None, - google_place_id: Optional[str] = None, - google_place_type: Optional[str] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - - # Required - self.location: Location = location - self.title: str = title - self.address: str = address - # Optionals - self.foursquare_id: Optional[str] = foursquare_id - self.foursquare_type: Optional[str] = foursquare_type - self.google_place_id: Optional[str] = google_place_id - self.google_place_type: Optional[str] = google_place_type - - self._id_attrs = (self.location, self.title) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "Venue": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["location"] = de_json_optional(data.get("location"), Location, bot) - - return super().de_json(data=data, bot=bot) diff --git a/venv/lib/python3.12/site-packages/telegram/_files/video.py b/venv/lib/python3.12/site-packages/telegram/_files/video.py deleted file mode 100644 index 7c838d5..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_files/video.py +++ /dev/null @@ -1,165 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram Video.""" -import datetime as dtm -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional, Union - -from telegram._files._basethumbedmedium import _BaseThumbedMedium -from telegram._files.photosize import PhotoSize -from telegram._utils.argumentparsing import de_list_optional, parse_sequence_arg, to_timedelta -from telegram._utils.datetime import get_timedelta_value -from telegram._utils.types import JSONDict, TimePeriod - -if TYPE_CHECKING: - from telegram import Bot - - -class Video(_BaseThumbedMedium): - """This object represents a video file. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`file_unique_id` is equal. - - .. versionchanged:: 20.5 - |removed_thumb_note| - - Args: - file_id (:obj:`str`): Identifier for this file, which can be used to download - or reuse the file. - file_unique_id (:obj:`str`): Unique identifier for this file, which - is supposed to be the same over time and for different bots. - Can't be used to download or reuse the file. - width (:obj:`int`): Video width as defined by the sender. - height (:obj:`int`): Video height as defined by the sender. - duration (:obj:`int` | :class:`datetime.timedelta`): Duration of the video - in seconds as defined by the sender. - - .. versionchanged:: v22.2 - |time-period-input| - file_name (:obj:`str`, optional): Original filename as defined by the sender. - mime_type (:obj:`str`, optional): MIME type of a file as defined by the sender. - file_size (:obj:`int`, optional): File size in bytes. - thumbnail (:class:`telegram.PhotoSize`, optional): Video thumbnail. - - .. versionadded:: 20.2 - cover (Sequence[:class:`telegram.PhotoSize`], optional): Available sizes of the cover of - the video in the message. - - .. versionadded:: 21.11 - start_timestamp (:obj:`int` | :class:`datetime.timedelta`, optional): Timestamp in seconds - from which the video will play in the message - .. versionadded:: 21.11 - - .. versionchanged:: v22.2 - |time-period-input| - - Attributes: - file_id (:obj:`str`): Identifier for this file, which can be used to download - or reuse the file. - file_unique_id (:obj:`str`): Unique identifier for this file, which - is supposed to be the same over time and for different bots. - Can't be used to download or reuse the file. - width (:obj:`int`): Video width as defined by the sender. - height (:obj:`int`): Video height as defined by the sender. - duration (:obj:`int` | :class:`datetime.timedelta`): Duration of the video in seconds - as defined by the sender. - - .. deprecated:: v22.2 - |time-period-int-deprecated| - file_name (:obj:`str`): Optional. Original filename as defined by the sender. - mime_type (:obj:`str`): Optional. MIME type of a file as defined by the sender. - file_size (:obj:`int`): Optional. File size in bytes. - thumbnail (:class:`telegram.PhotoSize`): Optional. Video thumbnail. - - .. versionadded:: 20.2 - cover (tuple[:class:`telegram.PhotoSize`]): Optional, Available sizes of the cover of - the video in the message. - - .. versionadded:: 21.11 - start_timestamp (:obj:`int` | :class:`datetime.timedelta`): Optional. Timestamp in seconds - from which the video will play in the message - .. versionadded:: 21.11 - - .. deprecated:: v22.2 - |time-period-int-deprecated| - """ - - __slots__ = ( - "_duration", - "_start_timestamp", - "cover", - "file_name", - "height", - "mime_type", - "width", - ) - - def __init__( - self, - file_id: str, - file_unique_id: str, - width: int, - height: int, - duration: TimePeriod, - mime_type: Optional[str] = None, - file_size: Optional[int] = None, - file_name: Optional[str] = None, - thumbnail: Optional[PhotoSize] = None, - cover: Optional[Sequence[PhotoSize]] = None, - start_timestamp: Optional[TimePeriod] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__( - file_id=file_id, - file_unique_id=file_unique_id, - file_size=file_size, - thumbnail=thumbnail, - api_kwargs=api_kwargs, - ) - with self._unfrozen(): - # Required - self.width: int = width - self.height: int = height - self._duration: dtm.timedelta = to_timedelta(duration) - # Optional - self.mime_type: Optional[str] = mime_type - self.file_name: Optional[str] = file_name - self.cover: Optional[Sequence[PhotoSize]] = parse_sequence_arg(cover) - self._start_timestamp: Optional[dtm.timedelta] = to_timedelta(start_timestamp) - - @property - def duration(self) -> Union[int, dtm.timedelta]: - return get_timedelta_value( # type: ignore[return-value] - self._duration, attribute="duration" - ) - - @property - def start_timestamp(self) -> Optional[Union[int, dtm.timedelta]]: - return get_timedelta_value(self._start_timestamp, attribute="start_timestamp") - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "Video": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["cover"] = de_list_optional(data.get("cover"), PhotoSize, bot) - - return super().de_json(data=data, bot=bot) diff --git a/venv/lib/python3.12/site-packages/telegram/_files/videonote.py b/venv/lib/python3.12/site-packages/telegram/_files/videonote.py deleted file mode 100644 index 2eb8619..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_files/videonote.py +++ /dev/null @@ -1,107 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram VideoNote.""" - -import datetime as dtm -from typing import Optional, Union - -from telegram._files._basethumbedmedium import _BaseThumbedMedium -from telegram._files.photosize import PhotoSize -from telegram._utils.argumentparsing import to_timedelta -from telegram._utils.datetime import get_timedelta_value -from telegram._utils.types import JSONDict, TimePeriod - - -class VideoNote(_BaseThumbedMedium): - """This object represents a video message (available in Telegram apps as of v.4.0). - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`file_unique_id` is equal. - - .. versionchanged:: 20.5 - |removed_thumb_note| - - Args: - file_id (:obj:`str`): Identifier for this file, which can be used to download - or reuse the file. - file_unique_id (:obj:`str`): Unique identifier for this file, which - is supposed to be the same over time and for different bots. - Can't be used to download or reuse the file. - length (:obj:`int`): Video width and height (diameter of the video message) as defined - by sender. - duration (:obj:`int` | :class:`datetime.timedelta`): Duration of the video in - seconds as defined by the sender. - - .. versionchanged:: v22.2 - |time-period-input| - file_size (:obj:`int`, optional): File size in bytes. - thumbnail (:class:`telegram.PhotoSize`, optional): Video thumbnail. - - .. versionadded:: 20.2 - - Attributes: - file_id (:obj:`str`): Identifier for this file, which can be used to download - or reuse the file. - file_unique_id (:obj:`str`): Unique identifier for this file, which - is supposed to be the same over time and for different bots. - Can't be used to download or reuse the file. - length (:obj:`int`): Video width and height (diameter of the video message) as defined - by sender. - duration (:obj:`int` | :class:`datetime.timedelta`): Duration of the video in seconds as - defined by the sender. - - .. deprecated:: v22.2 - |time-period-int-deprecated| - file_size (:obj:`int`): Optional. File size in bytes. - thumbnail (:class:`telegram.PhotoSize`): Optional. Video thumbnail. - - .. versionadded:: 20.2 - - """ - - __slots__ = ("_duration", "length") - - def __init__( - self, - file_id: str, - file_unique_id: str, - length: int, - duration: TimePeriod, - file_size: Optional[int] = None, - thumbnail: Optional[PhotoSize] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__( - file_id=file_id, - file_unique_id=file_unique_id, - file_size=file_size, - thumbnail=thumbnail, - api_kwargs=api_kwargs, - ) - with self._unfrozen(): - # Required - self.length: int = length - self._duration: dtm.timedelta = to_timedelta(duration) - - @property - def duration(self) -> Union[int, dtm.timedelta]: - return get_timedelta_value( # type: ignore[return-value] - self._duration, attribute="duration" - ) diff --git a/venv/lib/python3.12/site-packages/telegram/_files/voice.py b/venv/lib/python3.12/site-packages/telegram/_files/voice.py deleted file mode 100644 index d77cdc6..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_files/voice.py +++ /dev/null @@ -1,93 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram Voice.""" -import datetime as dtm -from typing import Optional, Union - -from telegram._files._basemedium import _BaseMedium -from telegram._utils.argumentparsing import to_timedelta -from telegram._utils.datetime import get_timedelta_value -from telegram._utils.types import JSONDict, TimePeriod - - -class Voice(_BaseMedium): - """This object represents a voice note. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`file_unique_id` is equal. - - Args: - file_id (:obj:`str`): Identifier for this file, which can be used to download - or reuse the file. - file_unique_id (:obj:`str`): Unique identifier for this file, which - is supposed to be the same over time and for different bots. - Can't be used to download or reuse the file. - duration (:obj:`int` | :class:`datetime.timedelta`): Duration of the audio in - seconds as defined by the sender. - - .. versionchanged:: v22.2 - |time-period-input| - mime_type (:obj:`str`, optional): MIME type of the file as defined by the sender. - file_size (:obj:`int`, optional): File size in bytes. - - Attributes: - file_id (:obj:`str`): Identifier for this file, which can be used to download - or reuse the file. - file_unique_id (:obj:`str`): Unique identifier for this file, which - is supposed to be the same over time and for different bots. - Can't be used to download or reuse the file. - duration (:obj:`int` | :class:`datetime.timedelta`): Duration of the audio in seconds as - defined by the sender. - - .. deprecated:: v22.2 - |time-period-int-deprecated| - mime_type (:obj:`str`): Optional. MIME type of the file as defined by the sender. - file_size (:obj:`int`): Optional. File size in bytes. - - """ - - __slots__ = ("_duration", "mime_type") - - def __init__( - self, - file_id: str, - file_unique_id: str, - duration: TimePeriod, - mime_type: Optional[str] = None, - file_size: Optional[int] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__( - file_id=file_id, - file_unique_id=file_unique_id, - file_size=file_size, - api_kwargs=api_kwargs, - ) - with self._unfrozen(): - # Required - self._duration: dtm.timedelta = to_timedelta(duration) - # Optional - self.mime_type: Optional[str] = mime_type - - @property - def duration(self) -> Union[int, dtm.timedelta]: - return get_timedelta_value( # type: ignore[return-value] - self._duration, attribute="duration" - ) diff --git a/venv/lib/python3.12/site-packages/telegram/_forcereply.py b/venv/lib/python3.12/site-packages/telegram/_forcereply.py deleted file mode 100644 index b24b271..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_forcereply.py +++ /dev/null @@ -1,106 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram ForceReply.""" - -from typing import Final, Optional - -from telegram import constants -from telegram._telegramobject import TelegramObject -from telegram._utils.types import JSONDict - - -class ForceReply(TelegramObject): - """ - Upon receiving a message with this object, Telegram clients will display a reply interface to - the user (act as if the user has selected the bot's message and tapped 'Reply'). This can be - extremely useful if you want to create user-friendly step-by-step interfaces without having - to sacrifice `privacy mode <https://core.telegram.org/bots/features#privacy-mode>`_. Not - supported in channels and for messages sent on behalf of a Telegram Business account. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`selective` is equal. - - .. versionchanged:: 20.0 - The (undocumented) argument ``force_reply`` was removed and instead :attr:`force_reply` - is now always set to :obj:`True` as expected by the Bot API. - - Args: - selective (:obj:`bool`, optional): Use this parameter if you want to force reply from - specific users only. Targets: - - 1) Users that are @mentioned in the :attr:`~telegram.Message.text` of the - :class:`telegram.Message` object. - 2) If the bot's message is a reply to a message in the same chat and forum topic, - sender of the original message. - - input_field_placeholder (:obj:`str`, optional): The placeholder to be shown in the input - field when the reply is active; - :tg-const:`telegram.ForceReply.MIN_INPUT_FIELD_PLACEHOLDER`- - :tg-const:`telegram.ForceReply.MAX_INPUT_FIELD_PLACEHOLDER` - characters. - - .. versionadded:: 13.7 - - Attributes: - force_reply (:obj:`True`): Shows reply interface to the user, as if they manually selected - the bots message and tapped 'Reply'. - selective (:obj:`bool`): Optional. Force reply from specific users only. Targets: - - 1) Users that are @mentioned in the :attr:`~telegram.Message.text` of the - :class:`telegram.Message` object. - 2) If the bot's message is a reply to a message in the same chat and forum topic, - sender of the original message. - input_field_placeholder (:obj:`str`): Optional. The placeholder to be shown in the input - field when the reply is active; - :tg-const:`telegram.ForceReply.MIN_INPUT_FIELD_PLACEHOLDER`- - :tg-const:`telegram.ForceReply.MAX_INPUT_FIELD_PLACEHOLDER` - characters. - - .. versionadded:: 13.7 - - """ - - __slots__ = ("force_reply", "input_field_placeholder", "selective") - - def __init__( - self, - selective: Optional[bool] = None, - input_field_placeholder: Optional[str] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.force_reply: bool = True - self.selective: Optional[bool] = selective - self.input_field_placeholder: Optional[str] = input_field_placeholder - - self._id_attrs = (self.selective,) - - self._freeze() - - MIN_INPUT_FIELD_PLACEHOLDER: Final[int] = constants.ReplyLimit.MIN_INPUT_FIELD_PLACEHOLDER - """:const:`telegram.constants.ReplyLimit.MIN_INPUT_FIELD_PLACEHOLDER` - - .. versionadded:: 20.0 - """ - MAX_INPUT_FIELD_PLACEHOLDER: Final[int] = constants.ReplyLimit.MAX_INPUT_FIELD_PLACEHOLDER - """:const:`telegram.constants.ReplyLimit.MAX_INPUT_FIELD_PLACEHOLDER` - - .. versionadded:: 20.0 - """ diff --git a/venv/lib/python3.12/site-packages/telegram/_forumtopic.py b/venv/lib/python3.12/site-packages/telegram/_forumtopic.py deleted file mode 100644 index 81b64e2..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_forumtopic.py +++ /dev/null @@ -1,215 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains objects related to Telegram forum topics.""" -from typing import Optional - -from telegram._telegramobject import TelegramObject -from telegram._utils.types import JSONDict - - -class ForumTopic(TelegramObject): - """ - This object represents a forum topic. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`message_thread_id`, :attr:`name` and :attr:`icon_color` - are equal. - - .. versionadded:: 20.0 - - Args: - message_thread_id (:obj:`int`): Unique identifier of the forum topic - name (:obj:`str`): Name of the topic - icon_color (:obj:`int`): Color of the topic icon in RGB format - icon_custom_emoji_id (:obj:`str`, optional): Unique identifier of the custom emoji shown - as the topic icon. - - Attributes: - message_thread_id (:obj:`int`): Unique identifier of the forum topic - name (:obj:`str`): Name of the topic - icon_color (:obj:`int`): Color of the topic icon in RGB format - icon_custom_emoji_id (:obj:`str`): Optional. Unique identifier of the custom emoji shown - as the topic icon. - """ - - __slots__ = ("icon_color", "icon_custom_emoji_id", "message_thread_id", "name") - - def __init__( - self, - message_thread_id: int, - name: str, - icon_color: int, - icon_custom_emoji_id: Optional[str] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.message_thread_id: int = message_thread_id - self.name: str = name - self.icon_color: int = icon_color - self.icon_custom_emoji_id: Optional[str] = icon_custom_emoji_id - - self._id_attrs = (self.message_thread_id, self.name, self.icon_color) - - self._freeze() - - -class ForumTopicCreated(TelegramObject): - """ - This object represents the content of a service message about a new forum topic created in - the chat. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`name` and :attr:`icon_color` are equal. - - .. versionadded:: 20.0 - - Args: - name (:obj:`str`): Name of the topic - icon_color (:obj:`int`): Color of the topic icon in RGB format - icon_custom_emoji_id (:obj:`str`, optional): Unique identifier of the custom emoji shown - as the topic icon. - - Attributes: - name (:obj:`str`): Name of the topic - icon_color (:obj:`int`): Color of the topic icon in RGB format - icon_custom_emoji_id (:obj:`str`): Optional. Unique identifier of the custom emoji shown - as the topic icon. - """ - - __slots__ = ("icon_color", "icon_custom_emoji_id", "name") - - def __init__( - self, - name: str, - icon_color: int, - icon_custom_emoji_id: Optional[str] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.name: str = name - self.icon_color: int = icon_color - self.icon_custom_emoji_id: Optional[str] = icon_custom_emoji_id - - self._id_attrs = (self.name, self.icon_color) - - self._freeze() - - -class ForumTopicClosed(TelegramObject): - """ - This object represents a service message about a forum topic closed in the chat. - Currently holds no information. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - def __init__(self, *, api_kwargs: Optional[JSONDict] = None) -> None: - super().__init__(api_kwargs=api_kwargs) - - self._freeze() - - -class ForumTopicReopened(TelegramObject): - """ - This object represents a service message about a forum topic reopened in the chat. - Currently holds no information. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - def __init__(self, *, api_kwargs: Optional[JSONDict] = None) -> None: - super().__init__(api_kwargs=api_kwargs) - - self._freeze() - - -class ForumTopicEdited(TelegramObject): - """ - This object represents a service message about an edited forum topic. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`name` and :attr:`icon_custom_emoji_id` are equal. - - .. versionadded:: 20.0 - - Args: - name (:obj:`str`, optional): New name of the topic, if it was edited. - icon_custom_emoji_id (:obj:`str`, optional): New identifier of the custom emoji shown as - the topic icon, if it was edited; an empty string if the icon was removed. - - Attributes: - name (:obj:`str`): Optional. New name of the topic, if it was edited. - icon_custom_emoji_id (:obj:`str`): Optional. New identifier of the custom emoji shown as - the topic icon, if it was edited; an empty string if the icon was removed. - """ - - __slots__ = ("icon_custom_emoji_id", "name") - - def __init__( - self, - name: Optional[str] = None, - icon_custom_emoji_id: Optional[str] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.name: Optional[str] = name - self.icon_custom_emoji_id: Optional[str] = icon_custom_emoji_id - - self._id_attrs = (self.name, self.icon_custom_emoji_id) - - self._freeze() - - -class GeneralForumTopicHidden(TelegramObject): - """ - This object represents a service message about General forum topic hidden in the chat. - Currently holds no information. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - def __init__(self, *, api_kwargs: Optional[JSONDict] = None): - super().__init__(api_kwargs=api_kwargs) - - self._freeze() - - -class GeneralForumTopicUnhidden(TelegramObject): - """ - This object represents a service message about General forum topic unhidden in the chat. - Currently holds no information. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - def __init__(self, *, api_kwargs: Optional[JSONDict] = None): - super().__init__(api_kwargs=api_kwargs) - - self._freeze() diff --git a/venv/lib/python3.12/site-packages/telegram/_games/__init__.py b/venv/lib/python3.12/site-packages/telegram/_games/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/telegram/_games/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_games/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 532788bb12ecd40cd260721015ce195465a48c9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208 zcmZ8a%L>9U5KOFs2>lQb?V?`AlV^V+#CB;z^C(GLDSn7I?|zG);a!m4dNMf)4$SV% zGQ&R8bVUN*_iG*ZD~^AR^KiM5fvoB2LF_EJF=i$MwNVI)d)LF!6rDot9e9*jS*|kY zMbV(mN^{ZD@DeTbsC$s&4DH}+qj&jc3r={<T3$4~!e1L$#Z~Z(2`xNhc{@zYy)tDd T@n9F>KMizId=g5jO@jIYSx!20 diff --git a/venv/lib/python3.12/site-packages/telegram/_games/__pycache__/callbackgame.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_games/__pycache__/callbackgame.cpython-312.pyc deleted file mode 100644 index 074b594b9dee29951ee22f12c9fec57e0c4c8587..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1135 zcmYjQ&u<hr6t;I}cPG&%DpV*z6v-!~ZJQmnTq+e&3K0<;HbTH<da#_acXx<qJheT6 z4LRfxspNp#OU0$CID*nYqW4~k#HFJmMXEUTQbE(Ih!f8<I}}Uve)v5<f8TqaUltbT z5v;#{ygNDFM(7XcGz<J{9bE+V0C5x{j(JPsv=z0mvpwmhe&koSFWYG+>R{ADYlye^ z5bp^8z^h9{-D$TUY_HvzB!;Al7gCT|WtJtGAuJ<m<Ccgmu@h#A7P%HiWELXihLB>c zSxPQ3DK}WWxyDj4_|sMG<1$#!ZK5(J!Cq`q*Q;7CdiDDHa5af-T!X0PTUO`5{|0yo z6k*`j;yChnEAqL={U0!Ii?-;TgdE=C-pId)MwoZ^7NhPxbO%Slb<_{a-n*!_uYE~! z$zm~4k_-JYi3_cPhMW?&V@Re*l8uy3nFBo_H;o_{mA%aDL}+3aF~X7}CsS2uGIl&4 zqv2y*&a*tBo41)B8||i5cC@gC&SG3MLQcCzyYJ{Si0|<OWI@+!zqNzz1MMCB6F!)o z!Dt8FYFg1Gf<Bnp7)?>XHPmz9_r0=hid^V2pft%6OKI7qBQ3<XfS7ND9M!<)D2*jE zhEn6O5VHH)gcFsD5ICEya8<=c>Lwf7*<4qQP2x?VSGc;JNyVUX;g-m@LYZuY`P5ES zc6RW|r=dx#Sjl1jY%Kmi9a7gO6UMX0Q8g`}>P5JG`^3A$88pZVgv<vZUhSgagN6O> zlVJJb)n9|<r$Kla^uF!w_wFwqK^*nx9N!Es0KW5-*3TB~9;IIwOwJ-*O1X+*8^{}} zERffZymsBKkdzCvw!}h8O8ZzJgOG8PxS)@_tZpMtxxhytUhSdZ{I3q*JHC76@bfSJ zMqYdA;pEYsCucr;;q0GR|8wf46Z-w;^spc3C2-1)o#sh4u5gsgO|J*EvFhJV`!4rH zvpJxJO{5vXSz&7Q6|TUQukLVIUkB&vMx58D!F41I0rA4a7{5G&@DM*or=Fv;&(Mee PbOOBe-T8kJsH(yn#C<W` diff --git a/venv/lib/python3.12/site-packages/telegram/_games/__pycache__/game.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_games/__pycache__/game.cpython-312.pyc deleted file mode 100644 index 4d5e61a75d490547d3ccf3e3fd9decf314433bfe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8660 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 E-^C4dV*mgE diff --git a/venv/lib/python3.12/site-packages/telegram/_games/__pycache__/gamehighscore.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_games/__pycache__/gamehighscore.cpython-312.pyc deleted file mode 100644 index 0aaa4297ee0e506d3ff891c2578bd24ffc160a1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2673 zcmd5-&2Jk;6rb^~?e%9;`jL-9yMmV1RbtZyq$;YQrK!>eNGeh)@PW<7JB~Nq4>LPy zNH9tck%%Qqxu6yaL63=2spZ6lLyt&YT7^TjQluh^5E4QuNu{bM-pqQP5Ag>u(!O~+ zGw;oNzxSJ&pEH>xg7){fpH%)zAoLsm30t(GtUI9GKn5xz0~-+w+mT|#mWmSQ|B@x! z(PC8SvK6!A#kkO;mSQK038BZVq@60JFd`8e1Dm*&wll>HMiJDH3}p@(2@+kBg8how zsbnrSeg0C#^i<n5CM=?sT!-nV<Egr%x})Qy#8g(%nMz5O5|20xX4Ff>B4bpy)qdS3 z=gqOoaLJ`4|0j2wi};yKA6z`Aojrf<>{}NG`+a4o%1qbMtsM5Vq3MwD4I}b<9-+{; z8bllSTt{;^S1SX<LxX*0iNU<|rprn}+<_Euf+|4!3}7Ruhyl8Yfs2w6DawXq$lqWi zN}@)L#Edxf3W*b?1B}YbJSt-&F_$eSNYZFAl0-35ByObntdTKLIVM(Q=Q2ydeyEt5 zM<3&2dKl$e{mi!1^>-r(2^brgZGp>mh)Uf_)hz>(M6Cc^s>kv2RHlyt<YkuvregqQ zKABXZ1=x6j1(c>_=^nsNd3EfnPKA}}sEklstRf#x=$6T*^6I5Yw^6qLFc;3Dz@BLk zN(@z)b*ZKZ%%p0s&KT_-sk)xY3pUafj!Zy_Mt~7UI3VJO5eP{*X#{?Tj(NRe7oJAw zM?KmLsPvAQ4jak!suvsXRmflyj4fDjlmaxk7vA{(;6>ojJHi_5%X8*%kG#(}w-vGN z*fZc~fbJPc(j1*&<o_RPPV$uyML#MM^JNak;3D>udezjfOzMC+O#?+~mWvD*tsqJ= z2;MM!{J`^X{T_&~@D0SE4_ZB1L)YK}s>!$U5?>1qqZ+Ou4LBXNS_J;My=XNF{zC7l zhQ^zExB|SP@z~~HsKKZb>YII;`wOo?Zpm}l(ZVx`(G=V;gR}+ab8*0AqDrW*XqxGm zOw)D%;U_fH&^W6-KdzN2A=4xm^JR}%<sC}}X0TopB-1pHhcC!C`-~MTu1yNI&b+II zKDRVs^Lwxm^03=uX6Xu{-G)2qSgsC-t8kS#R|}RoTBuI3itF^`kDn;OsUqD~y>vw% zBb(L*jdR^AaLJE@sB*qKMR!90)BF0j-LPSvufm-74v43-Xd{La*?Rne(tc~;zS91S zQdoK6@VxwaW~K80bcvPDgU}@(b{_by`|Iw7J$E`5JMQ-VF!24r{f;+aCi_rHUr*Q5 z*Rt#25c#s9Gu@X)T}I)ZLVk=AHbI?Iv;Hv1t0nmK1t^?PP_+hkV4&G*O-6l+S<}9T z$D7q|E`<j!WFKoXrxppHsv0)%DOk*!{HX(LuI&Y;;acQ&WU0YbxSOTvu3<vdUYoGW zmdj%M!;^2kHY0g)Y;qCW3Et^`5I~TW2Dhw7G>!y~!<a9P5k`4j^f~?;Z<yy~Un*JN zrZH`UX^$TW;La><=N2l6>Al+v*|0wiQ{EX6P{*|xYTbQ(rap6%Ew>z+mmjqqS&;82 zi^|=7%STWCc<7$A+}1ZQ&tI;mAGPeMPu6E{^(~a<XO>$|+*eLe{%+;)U@pT?g9EJ5 zG(V|n!Ltr}TGRL|(U^&An&FmU7#QzaF7rT@;DQcv<ndFEv>>6M5@&+r=^7#%KhroT zC1P2cmcv2XoB^kUoKxJG3l%=k2Jv(bJ&v?Qm9-bquKer;$hL?-#Q#XiXxmEr{x#9R zbR_6s=?VJ2w|{#7LEq&kd~&TF#dbZ8#G*YnPp%>87LMM1ZLuKKd)fvcS(jkR245o3 z5c?12TIgZe-jA`Vs_BeTPD9EQ^xMM&oYz7vc)cm7r=JZ6^BTW$1v37@ErZOoygXdL z;yU1j;qC=n_U>E-dlOF}>MP-#I9(#fMHIx#+44*|6_o6CdK`W^q+S<@H3?(<_+^BL l@E_>d@2F=L9b84HR?)FvrPfvX`Hk2S-1Ft&69k>`_Ak*6zuN!+ diff --git a/venv/lib/python3.12/site-packages/telegram/_games/callbackgame.py b/venv/lib/python3.12/site-packages/telegram/_games/callbackgame.py deleted file mode 100644 index 0917a11..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_games/callbackgame.py +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram CallbackGame.""" - -from typing import Optional - -from telegram._telegramobject import TelegramObject -from telegram._utils.types import JSONDict - - -class CallbackGame(TelegramObject): - """A placeholder, currently holds no information. Use BotFather to set up your game.""" - - __slots__ = () - - def __init__(self, *, api_kwargs: Optional[JSONDict] = None) -> None: - super().__init__(api_kwargs=api_kwargs) - - self._freeze() diff --git a/venv/lib/python3.12/site-packages/telegram/_games/game.py b/venv/lib/python3.12/site-packages/telegram/_games/game.py deleted file mode 100644 index bd8cf19..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_games/game.py +++ /dev/null @@ -1,194 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram Game.""" -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional - -from telegram._files.animation import Animation -from telegram._files.photosize import PhotoSize -from telegram._messageentity import MessageEntity -from telegram._telegramobject import TelegramObject -from telegram._utils.argumentparsing import de_json_optional, de_list_optional, parse_sequence_arg -from telegram._utils.strings import TextEncoding -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot - - -class Game(TelegramObject): - """ - This object represents a game. Use `BotFather <https://t.me/BotFather>`_ to create and edit - games, their short names will act as unique identifiers. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`title`, :attr:`description` and :attr:`photo` are equal. - - Args: - title (:obj:`str`): Title of the game. - description (:obj:`str`): Description of the game. - photo (Sequence[:class:`telegram.PhotoSize`]): Photo that will be displayed in the game - message in chats. - - .. versionchanged:: 20.0 - |sequenceclassargs| - - text (:obj:`str`, optional): Brief description of the game or high scores included in the - game message. Can be automatically edited to include current high scores for the game - when the bot calls :meth:`telegram.Bot.set_game_score`, or manually edited - using :meth:`telegram.Bot.edit_message_text`. - 0-:tg-const:`telegram.constants.MessageLimit.MAX_TEXT_LENGTH` characters. - text_entities (Sequence[:class:`telegram.MessageEntity`], optional): Special entities that - appear in text, such as usernames, URLs, bot commands, etc. - - .. versionchanged:: 20.0 - |sequenceclassargs| - - animation (:class:`telegram.Animation`, optional): Animation that will be displayed in the - game message in chats. Upload via `BotFather <https://t.me/BotFather>`_. - - Attributes: - title (:obj:`str`): Title of the game. - description (:obj:`str`): Description of the game. - photo (tuple[:class:`telegram.PhotoSize`]): Photo that will be displayed in the game - message in chats. - - .. versionchanged:: 20.0 - |tupleclassattrs| - - text (:obj:`str`): Optional. Brief description of the game or high scores included in the - game message. Can be automatically edited to include current high scores for the game - when the bot calls :meth:`telegram.Bot.set_game_score`, or manually edited - using :meth:`telegram.Bot.edit_message_text`. - 0-:tg-const:`telegram.constants.MessageLimit.MAX_TEXT_LENGTH` characters. - text_entities (tuple[:class:`telegram.MessageEntity`]): Optional. Special entities that - appear in text, such as usernames, URLs, bot commands, etc. - This tuple is empty if the message does not contain text entities. - - .. versionchanged:: 20.0 - |tupleclassattrs| - - animation (:class:`telegram.Animation`): Optional. Animation that will be displayed in the - game message in chats. Upload via `BotFather <https://t.me/BotFather>`_. - - """ - - __slots__ = ( - "animation", - "description", - "photo", - "text", - "text_entities", - "title", - ) - - def __init__( - self, - title: str, - description: str, - photo: Sequence[PhotoSize], - text: Optional[str] = None, - text_entities: Optional[Sequence[MessageEntity]] = None, - animation: Optional[Animation] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - # Required - self.title: str = title - self.description: str = description - self.photo: tuple[PhotoSize, ...] = parse_sequence_arg(photo) - # Optionals - self.text: Optional[str] = text - self.text_entities: tuple[MessageEntity, ...] = parse_sequence_arg(text_entities) - self.animation: Optional[Animation] = animation - - self._id_attrs = (self.title, self.description, self.photo) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "Game": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["photo"] = de_list_optional(data.get("photo"), PhotoSize, bot) - data["text_entities"] = de_list_optional(data.get("text_entities"), MessageEntity, bot) - data["animation"] = de_json_optional(data.get("animation"), Animation, bot) - - return super().de_json(data=data, bot=bot) - - def parse_text_entity(self, entity: MessageEntity) -> str: - """Returns the text from a given :class:`telegram.MessageEntity`. - - Note: - This method is present because Telegram calculates the offset and length in - UTF-16 codepoint pairs, which some versions of Python don't handle automatically. - (That is, you can't just slice ``Message.text`` with the offset and length.) - - Args: - entity (:class:`telegram.MessageEntity`): The entity to extract the text from. It must - be an entity that belongs to this message. - - Returns: - :obj:`str`: The text of the given entity. - - Raises: - RuntimeError: If this game has no text. - - """ - if not self.text: - raise RuntimeError("This Game has no 'text'.") - - entity_text = self.text.encode(TextEncoding.UTF_16_LE) - entity_text = entity_text[entity.offset * 2 : (entity.offset + entity.length) * 2] - - return entity_text.decode(TextEncoding.UTF_16_LE) - - def parse_text_entities(self, types: Optional[list[str]] = None) -> dict[MessageEntity, str]: - """ - Returns a :obj:`dict` that maps :class:`telegram.MessageEntity` to :obj:`str`. - It contains entities from this message filtered by their - :attr:`~telegram.MessageEntity.type` attribute as the key, and the text that each entity - belongs to as the value of the :obj:`dict`. - - Note: - This method should always be used instead of the :attr:`text_entities` attribute, since - it calculates the correct substring from the message text based on UTF-16 codepoints. - See :attr:`parse_text_entity` for more info. - - Args: - types (list[:obj:`str`], optional): List of :class:`telegram.MessageEntity` types as - strings. If the :attr:`~telegram.MessageEntity.type` attribute of an entity is - contained in this list, it will be returned. Defaults to - :attr:`telegram.MessageEntity.ALL_TYPES`. - - Returns: - dict[:class:`telegram.MessageEntity`, :obj:`str`]: A dictionary of entities mapped to - the text that belongs to them, calculated based on UTF-16 codepoints. - - """ - if types is None: - types = MessageEntity.ALL_TYPES - - return { - entity: self.parse_text_entity(entity) - for entity in self.text_entities - if entity.type in types - } diff --git a/venv/lib/python3.12/site-packages/telegram/_games/gamehighscore.py b/venv/lib/python3.12/site-packages/telegram/_games/gamehighscore.py deleted file mode 100644 index 2866b59..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_games/gamehighscore.py +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram GameHighScore.""" - -from typing import TYPE_CHECKING, Optional - -from telegram._telegramobject import TelegramObject -from telegram._user import User -from telegram._utils.argumentparsing import de_json_optional -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot - - -class GameHighScore(TelegramObject): - """This object represents one row of the high scores table for a game. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`position`, :attr:`user` and :attr:`score` are equal. - - Args: - position (:obj:`int`): Position in high score table for the game. - user (:class:`telegram.User`): User. - score (:obj:`int`): Score. - - Attributes: - position (:obj:`int`): Position in high score table for the game. - user (:class:`telegram.User`): User. - score (:obj:`int`): Score. - - """ - - __slots__ = ("position", "score", "user") - - def __init__( - self, position: int, user: User, score: int, *, api_kwargs: Optional[JSONDict] = None - ): - super().__init__(api_kwargs=api_kwargs) - self.position: int = position - self.user: User = user - self.score: int = score - - self._id_attrs = (self.position, self.user, self.score) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "GameHighScore": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["user"] = de_json_optional(data.get("user"), User, bot) - - return super().de_json(data=data, bot=bot) diff --git a/venv/lib/python3.12/site-packages/telegram/_gifts.py b/venv/lib/python3.12/site-packages/telegram/_gifts.py deleted file mode 100644 index 42ec1c4..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_gifts.py +++ /dev/null @@ -1,357 +0,0 @@ -#!/usr/bin/env python -# pylint: disable=redefined-builtin -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/] -"""This module contains classes related to gifs sent by bots.""" -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional - -from telegram._files.sticker import Sticker -from telegram._messageentity import MessageEntity -from telegram._telegramobject import TelegramObject -from telegram._utils.argumentparsing import de_json_optional, de_list_optional, parse_sequence_arg -from telegram._utils.entities import parse_message_entities, parse_message_entity -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot - - -class Gift(TelegramObject): - """This object represents a gift that can be sent by the bot. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal if their :attr:`id` is equal. - - .. versionadded:: 21.8 - - Args: - id (:obj:`str`): Unique identifier of the gift - sticker (:class:`~telegram.Sticker`): The sticker that represents the gift - star_count (:obj:`int`): The number of Telegram Stars that must be paid to send the sticker - total_count (:obj:`int`, optional): The total number of the gifts of this type that can be - sent; for limited gifts only - remaining_count (:obj:`int`, optional): The number of remaining gifts of this type that can - be sent; for limited gifts only - upgrade_star_count (:obj:`int`, optional): The number of Telegram Stars that must be paid - to upgrade the gift to a unique one - - .. versionadded:: 21.10 - - Attributes: - id (:obj:`str`): Unique identifier of the gift - sticker (:class:`~telegram.Sticker`): The sticker that represents the gift - star_count (:obj:`int`): The number of Telegram Stars that must be paid to send the sticker - total_count (:obj:`int`): Optional. The total number of the gifts of this type that can be - sent; for limited gifts only - remaining_count (:obj:`int`): Optional. The number of remaining gifts of this type that can - be sent; for limited gifts only - upgrade_star_count (:obj:`int`): Optional. The number of Telegram Stars that must be paid - to upgrade the gift to a unique one - - .. versionadded:: 21.10 - - """ - - __slots__ = ( - "id", - "remaining_count", - "star_count", - "sticker", - "total_count", - "upgrade_star_count", - ) - - def __init__( - self, - id: str, - sticker: Sticker, - star_count: int, - total_count: Optional[int] = None, - remaining_count: Optional[int] = None, - upgrade_star_count: Optional[int] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.id: str = id - self.sticker: Sticker = sticker - self.star_count: int = star_count - self.total_count: Optional[int] = total_count - self.remaining_count: Optional[int] = remaining_count - self.upgrade_star_count: Optional[int] = upgrade_star_count - - self._id_attrs = (self.id,) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "Gift": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["sticker"] = de_json_optional(data.get("sticker"), Sticker, bot) - return super().de_json(data=data, bot=bot) - - -class Gifts(TelegramObject): - """This object represent a list of gifts. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal if their :attr:`gifts` are equal. - - .. versionadded:: 21.8 - - Args: - gifts (Sequence[:class:`Gift`]): The sequence of gifts - - Attributes: - gifts (tuple[:class:`Gift`]): The sequence of gifts - - """ - - __slots__ = ("gifts",) - - def __init__( - self, - gifts: Sequence[Gift], - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.gifts: tuple[Gift, ...] = parse_sequence_arg(gifts) - - self._id_attrs = (self.gifts,) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "Gifts": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["gifts"] = de_list_optional(data.get("gifts"), Gift, bot) - return super().de_json(data=data, bot=bot) - - -class GiftInfo(TelegramObject): - """Describes a service message about a regular gift that was sent or received. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal if their :attr:`gift` is equal. - - .. versionadded:: 22.1 - - Args: - gift (:class:`Gift`): Information about the gift. - owned_gift_id (:obj:`str`, optional): Unique identifier of the received gift for the bot; - only present for gifts received on behalf of business accounts - convert_star_count (:obj:`int`, optional) Number of Telegram Stars that can be claimed by - the receiver by converting the gift; omitted if conversion to Telegram Stars - is impossible - prepaid_upgrade_star_count (:obj:`int`, optional): Number of Telegram Stars that were - prepaid by the sender for the ability to upgrade the gift - can_be_upgraded (:obj:`bool`, optional): :obj:`True`, if the gift can be upgraded - to a unique gift. - text (:obj:`str`, optional): Text of the message that was added to the gift. - entities (Sequence[:class:`telegram.MessageEntity`], optional): Special entities that - appear in the text. - is_private (:obj:`bool`, optional): :obj:`True`, if the sender and gift text are - shown only to the gift receiver; otherwise, everyone will be able to see them. - - Attributes: - gift (:class:`Gift`): Information about the gift. - owned_gift_id (:obj:`str`): Optional. Unique identifier of the received gift for the bot; - only present for gifts received on behalf of business accounts - convert_star_count (:obj:`int`): Optional. Number of Telegram Stars that can be claimed by - the receiver by converting the gift; omitted if conversion to Telegram Stars - is impossible - prepaid_upgrade_star_count (:obj:`int`): Optional. Number of Telegram Stars that were - prepaid by the sender for the ability to upgrade the gift - can_be_upgraded (:obj:`bool`): Optional. :obj:`True`, if the gift can be upgraded - to a unique gift. - text (:obj:`str`): Optional. Text of the message that was added to the gift. - entities (Sequence[:class:`telegram.MessageEntity`]): Optional. Special entities that - appear in the text. - is_private (:obj:`bool`): Optional. :obj:`True`, if the sender and gift text are - shown only to the gift receiver; otherwise, everyone will be able to see them. - - """ - - __slots__ = ( - "can_be_upgraded", - "convert_star_count", - "entities", - "gift", - "is_private", - "owned_gift_id", - "prepaid_upgrade_star_count", - "text", - ) - - def __init__( - self, - gift: Gift, - owned_gift_id: Optional[str] = None, - convert_star_count: Optional[int] = None, - prepaid_upgrade_star_count: Optional[int] = None, - can_be_upgraded: Optional[bool] = None, - text: Optional[str] = None, - entities: Optional[Sequence[MessageEntity]] = None, - is_private: Optional[bool] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - # Required - self.gift: Gift = gift - # Optional - self.owned_gift_id: Optional[str] = owned_gift_id - self.convert_star_count: Optional[int] = convert_star_count - self.prepaid_upgrade_star_count: Optional[int] = prepaid_upgrade_star_count - self.can_be_upgraded: Optional[bool] = can_be_upgraded - self.text: Optional[str] = text - self.entities: tuple[MessageEntity, ...] = parse_sequence_arg(entities) - self.is_private: Optional[bool] = is_private - - self._id_attrs = (self.gift,) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "GiftInfo": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["gift"] = de_json_optional(data.get("gift"), Gift, bot) - data["entities"] = de_list_optional(data.get("entities"), MessageEntity, bot) - - return super().de_json(data=data, bot=bot) - - def parse_entity(self, entity: MessageEntity) -> str: - """Returns the text in :attr:`text` - from a given :class:`telegram.MessageEntity` of :attr:`entities`. - - Note: - This method is present because Telegram calculates the offset and length in - UTF-16 codepoint pairs, which some versions of Python don't handle automatically. - (That is, you can't just slice ``Message.text`` with the offset and length.) - - Args: - entity (:class:`telegram.MessageEntity`): The entity to extract the text from. It must - be an entity that belongs to :attr:`entities`. - - Returns: - :obj:`str`: The text of the given entity. - - Raises: - RuntimeError: If the gift info has no text. - - """ - if not self.text: - raise RuntimeError("This GiftInfo has no 'text'.") - - return parse_message_entity(self.text, entity) - - def parse_entities(self, types: Optional[list[str]] = None) -> dict[MessageEntity, str]: - """ - Returns a :obj:`dict` that maps :class:`telegram.MessageEntity` to :obj:`str`. - It contains entities from this gift info's text filtered by their ``type`` attribute as - the key, and the text that each entity belongs to as the value of the :obj:`dict`. - - Note: - This method should always be used instead of the :attr:`entities` - attribute, since it calculates the correct substring from the message text based on - UTF-16 codepoints. See :attr:`parse_entity` for more info. - - Args: - types (list[:obj:`str`], optional): List of ``MessageEntity`` types as strings. If the - ``type`` attribute of an entity is contained in this list, it will be returned. - Defaults to :attr:`telegram.MessageEntity.ALL_TYPES`. - - Returns: - dict[:class:`telegram.MessageEntity`, :obj:`str`]: A dictionary of entities mapped to - the text that belongs to them, calculated based on UTF-16 codepoints. - - Raises: - RuntimeError: If the gift info has no text. - - """ - if not self.text: - raise RuntimeError("This GiftInfo has no 'text'.") - - return parse_message_entities(self.text, self.entities, types) - - -class AcceptedGiftTypes(TelegramObject): - """This object describes the types of gifts that can be gifted to a user or a chat. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal if their :attr:`unlimited_gifts`, :attr:`limited_gifts`, - :attr:`unique_gifts` and :attr:`premium_subscription` are equal. - - .. versionadded:: 22.1 - - Args: - unlimited_gifts (:class:`bool`): :obj:`True`, if unlimited regular gifts are accepted. - limited_gifts (:class:`bool`): :obj:`True`, if limited regular gifts are accepted. - unique_gifts (:class:`bool`): :obj:`True`, if unique gifts or gifts that can be upgraded - to unique for free are accepted. - premium_subscription (:class:`bool`): :obj:`True`, if a Telegram Premium subscription - is accepted. - - Attributes: - unlimited_gifts (:class:`bool`): :obj:`True`, if unlimited regular gifts are accepted. - limited_gifts (:class:`bool`): :obj:`True`, if limited regular gifts are accepted. - unique_gifts (:class:`bool`): :obj:`True`, if unique gifts or gifts that can be upgraded - to unique for free are accepted. - premium_subscription (:class:`bool`): :obj:`True`, if a Telegram Premium subscription - is accepted. - - """ - - __slots__ = ( - "limited_gifts", - "premium_subscription", - "unique_gifts", - "unlimited_gifts", - ) - - def __init__( - self, - unlimited_gifts: bool, - limited_gifts: bool, - unique_gifts: bool, - premium_subscription: bool, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.unlimited_gifts: bool = unlimited_gifts - self.limited_gifts: bool = limited_gifts - self.unique_gifts: bool = unique_gifts - self.premium_subscription: bool = premium_subscription - - self._id_attrs = ( - self.unlimited_gifts, - self.limited_gifts, - self.unique_gifts, - self.premium_subscription, - ) - - self._freeze() diff --git a/venv/lib/python3.12/site-packages/telegram/_giveaway.py b/venv/lib/python3.12/site-packages/telegram/_giveaway.py deleted file mode 100644 index d7d086e..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_giveaway.py +++ /dev/null @@ -1,378 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an objects that are related to Telegram giveaways.""" -import datetime as dtm -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional - -from telegram._chat import Chat -from telegram._telegramobject import TelegramObject -from telegram._user import User -from telegram._utils.argumentparsing import de_json_optional, de_list_optional, parse_sequence_arg -from telegram._utils.datetime import extract_tzinfo_from_defaults, from_timestamp -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot, Message - - -class Giveaway(TelegramObject): - """This object represents a message about a scheduled giveaway. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`chats`, :attr:`winners_selection_date` and - :attr:`winner_count` are equal. - - .. versionadded:: 20.8 - - Args: - chats (tuple[:class:`telegram.Chat`]): The list of chats which the user must join to - participate in the giveaway. - winners_selection_date (:class:`datetime.datetime`): The date when the giveaway winner will - be selected. |datetime_localization| - winner_count (:obj:`int`): The number of users which are supposed to be selected as winners - of the giveaway. - only_new_members (:obj:`True`, optional): If :obj:`True`, only users who join the chats - after the giveaway started should be eligible to win. - has_public_winners (:obj:`True`, optional): :obj:`True`, if the list of giveaway winners - will be visible to everyone - prize_description (:obj:`str`, optional): Description of additional giveaway prize - country_codes (Sequence[:obj:`str`]): A list of two-letter ISO 3166-1 alpha-2 - country codes indicating the countries from which eligible users for the giveaway must - come. If empty, then all users can participate in the giveaway. Users with a phone - number that was bought on Fragment can always participate in giveaways. - prize_star_count (:obj:`int`, optional): The number of Telegram Stars to be split between - giveaway winners; for Telegram Star giveaways only. - - .. versionadded:: 21.6 - premium_subscription_month_count (:obj:`int`, optional): The number of months the Telegram - Premium subscription won from the giveaway will be active for; for Telegram Premium - giveaways only. - - Attributes: - chats (Sequence[:class:`telegram.Chat`]): The list of chats which the user must join to - participate in the giveaway. - winners_selection_date (:class:`datetime.datetime`): The date when the giveaway winner will - be selected. |datetime_localization| - winner_count (:obj:`int`): The number of users which are supposed to be selected as winners - of the giveaway. - only_new_members (:obj:`True`): Optional. If :obj:`True`, only users who join the chats - after the giveaway started should be eligible to win. - has_public_winners (:obj:`True`): Optional. :obj:`True`, if the list of giveaway winners - will be visible to everyone - prize_description (:obj:`str`): Optional. Description of additional giveaway prize - country_codes (tuple[:obj:`str`]): Optional. A tuple of two-letter ISO 3166-1 alpha-2 - country codes indicating the countries from which eligible users for the giveaway must - come. If empty, then all users can participate in the giveaway. Users with a phone - number that was bought on Fragment can always participate in giveaways. - prize_star_count (:obj:`int`): Optional. The number of Telegram Stars to be split between - giveaway winners; for Telegram Star giveaways only. - - .. versionadded:: 21.6 - premium_subscription_month_count (:obj:`int`): Optional. The number of months the Telegram - Premium subscription won from the giveaway will be active for; for Telegram Premium - giveaways only. - """ - - __slots__ = ( - "chats", - "country_codes", - "has_public_winners", - "only_new_members", - "premium_subscription_month_count", - "prize_description", - "prize_star_count", - "winner_count", - "winners_selection_date", - ) - - def __init__( - self, - chats: Sequence[Chat], - winners_selection_date: dtm.datetime, - winner_count: int, - only_new_members: Optional[bool] = None, - has_public_winners: Optional[bool] = None, - prize_description: Optional[str] = None, - country_codes: Optional[Sequence[str]] = None, - premium_subscription_month_count: Optional[int] = None, - prize_star_count: Optional[int] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - - self.chats: tuple[Chat, ...] = tuple(chats) - self.winners_selection_date: dtm.datetime = winners_selection_date - self.winner_count: int = winner_count - self.only_new_members: Optional[bool] = only_new_members - self.has_public_winners: Optional[bool] = has_public_winners - self.prize_description: Optional[str] = prize_description - self.country_codes: tuple[str, ...] = parse_sequence_arg(country_codes) - self.premium_subscription_month_count: Optional[int] = premium_subscription_month_count - self.prize_star_count: Optional[int] = prize_star_count - - self._id_attrs = ( - self.chats, - self.winners_selection_date, - self.winner_count, - ) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "Giveaway": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - # Get the local timezone from the bot if it has defaults - loc_tzinfo = extract_tzinfo_from_defaults(bot) - - data["chats"] = de_list_optional(data.get("chats"), Chat, bot) - data["winners_selection_date"] = from_timestamp( - data.get("winners_selection_date"), tzinfo=loc_tzinfo - ) - - return super().de_json(data=data, bot=bot) - - -class GiveawayCreated(TelegramObject): - """This object represents a service message about the creation of a scheduled giveaway. - - Args: - prize_star_count (:obj:`int`, optional): The number of Telegram Stars to be - split between giveaway winners; for Telegram Star giveaways only. - - .. versionadded:: 21.6 - - Attributes: - prize_star_count (:obj:`int`): Optional. The number of Telegram Stars to be - split between giveaway winners; for Telegram Star giveaways only. - - .. versionadded:: 21.6 - - """ - - __slots__ = ("prize_star_count",) - - def __init__( - self, prize_star_count: Optional[int] = None, *, api_kwargs: Optional[JSONDict] = None - ): - super().__init__(api_kwargs=api_kwargs) - self.prize_star_count: Optional[int] = prize_star_count - - self._freeze() - - -class GiveawayWinners(TelegramObject): - """This object represents a message about the completion of a giveaway with public winners. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`chat`, :attr:`giveaway_message_id`, - :attr:`winners_selection_date`, :attr:`winner_count` and :attr:`winners` are equal. - - .. versionadded:: 20.8 - - Args: - chat (:class:`telegram.Chat`): The chat that created the giveaway - giveaway_message_id (:obj:`int`): Identifier of the message with the giveaway in the chat - winners_selection_date (:class:`datetime.datetime`): Point in time when winners of the - giveaway were selected. |datetime_localization| - winner_count (:obj:`int`): Total number of winners in the giveaway - winners (Sequence[:class:`telegram.User`]): List of up to - :tg-const:`telegram.constants.GiveawayLimit.MAX_WINNERS` winners of the giveaway - prize_star_count (:obj:`int`, optional): The number of Telegram Stars to be split between - giveaway winners; for Telegram Star giveaways only. - - .. versionadded:: 21.6 - additional_chat_count (:obj:`int`, optional): The number of other chats the user had to - join in order to be eligible for the giveaway - premium_subscription_month_count (:obj:`int`, optional): The number of months the Telegram - Premium subscription won from the giveaway will be active for - unclaimed_prize_count (:obj:`int`, optional): Number of undistributed prizes - only_new_members (:obj:`True`, optional): :obj:`True`, if only users who had joined the - chats after the giveaway started were eligible to win - was_refunded (:obj:`True`, optional): :obj:`True`, if the giveaway was canceled because the - payment for it was refunded - prize_description (:obj:`str`, optional): Description of additional giveaway prize - - Attributes: - chat (:class:`telegram.Chat`): The chat that created the giveaway - giveaway_message_id (:obj:`int`): Identifier of the message with the giveaway in the chat - winners_selection_date (:class:`datetime.datetime`): Point in time when winners of the - giveaway were selected. |datetime_localization| - winner_count (:obj:`int`): Total number of winners in the giveaway - winners (tuple[:class:`telegram.User`]): tuple of up to - :tg-const:`telegram.constants.GiveawayLimit.MAX_WINNERS` winners of the giveaway - additional_chat_count (:obj:`int`): Optional. The number of other chats the user had to - join in order to be eligible for the giveaway - prize_star_count (:obj:`int`): Optional. The number of Telegram Stars to be split between - giveaway winners; for Telegram Star giveaways only. - - .. versionadded:: 21.6 - premium_subscription_month_count (:obj:`int`): Optional. The number of months the Telegram - Premium subscription won from the giveaway will be active for - unclaimed_prize_count (:obj:`int`): Optional. Number of undistributed prizes - only_new_members (:obj:`True`): Optional. :obj:`True`, if only users who had joined the - chats after the giveaway started were eligible to win - was_refunded (:obj:`True`): Optional. :obj:`True`, if the giveaway was canceled because the - payment for it was refunded - prize_description (:obj:`str`): Optional. Description of additional giveaway prize - """ - - __slots__ = ( - "additional_chat_count", - "chat", - "giveaway_message_id", - "only_new_members", - "premium_subscription_month_count", - "prize_description", - "prize_star_count", - "unclaimed_prize_count", - "was_refunded", - "winner_count", - "winners", - "winners_selection_date", - ) - - def __init__( - self, - chat: Chat, - giveaway_message_id: int, - winners_selection_date: dtm.datetime, - winner_count: int, - winners: Sequence[User], - additional_chat_count: Optional[int] = None, - premium_subscription_month_count: Optional[int] = None, - unclaimed_prize_count: Optional[int] = None, - only_new_members: Optional[bool] = None, - was_refunded: Optional[bool] = None, - prize_description: Optional[str] = None, - prize_star_count: Optional[int] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - - self.chat: Chat = chat - self.giveaway_message_id: int = giveaway_message_id - self.winners_selection_date: dtm.datetime = winners_selection_date - self.winner_count: int = winner_count - self.winners: tuple[User, ...] = tuple(winners) - self.additional_chat_count: Optional[int] = additional_chat_count - self.premium_subscription_month_count: Optional[int] = premium_subscription_month_count - self.unclaimed_prize_count: Optional[int] = unclaimed_prize_count - self.only_new_members: Optional[bool] = only_new_members - self.was_refunded: Optional[bool] = was_refunded - self.prize_description: Optional[str] = prize_description - self.prize_star_count: Optional[int] = prize_star_count - - self._id_attrs = ( - self.chat, - self.giveaway_message_id, - self.winners_selection_date, - self.winner_count, - self.winners, - ) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "GiveawayWinners": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - # Get the local timezone from the bot if it has defaults - loc_tzinfo = extract_tzinfo_from_defaults(bot) - - data["chat"] = de_json_optional(data.get("chat"), Chat, bot) - data["winners"] = de_list_optional(data.get("winners"), User, bot) - data["winners_selection_date"] = from_timestamp( - data.get("winners_selection_date"), tzinfo=loc_tzinfo - ) - - return super().de_json(data=data, bot=bot) - - -class GiveawayCompleted(TelegramObject): - """This object represents a service message about the completion of a giveaway without public - winners. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`winner_count` and :attr:`unclaimed_prize_count` are equal. - - .. versionadded:: 20.8 - - - Args: - winner_count (:obj:`int`): Number of winners in the giveaway - unclaimed_prize_count (:obj:`int`, optional): Number of undistributed prizes - giveaway_message (:class:`telegram.Message`, optional): Message with the giveaway that was - completed, if it wasn't deleted - is_star_giveaway (:obj:`bool`, optional): :obj:`True`, if the giveaway is a Telegram Star - giveaway. Otherwise, currently, the giveaway is a Telegram Premium giveaway. - - .. versionadded:: 21.6 - Attributes: - winner_count (:obj:`int`): Number of winners in the giveaway - unclaimed_prize_count (:obj:`int`): Optional. Number of undistributed prizes - giveaway_message (:class:`telegram.Message`): Optional. Message with the giveaway that was - completed, if it wasn't deleted - is_star_giveaway (:obj:`bool`): Optional. :obj:`True`, if the giveaway is a Telegram Star - giveaway. Otherwise, currently, the giveaway is a Telegram Premium giveaway. - - .. versionadded:: 21.6 - """ - - __slots__ = ("giveaway_message", "is_star_giveaway", "unclaimed_prize_count", "winner_count") - - def __init__( - self, - winner_count: int, - unclaimed_prize_count: Optional[int] = None, - giveaway_message: Optional["Message"] = None, - is_star_giveaway: Optional[bool] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - - self.winner_count: int = winner_count - self.unclaimed_prize_count: Optional[int] = unclaimed_prize_count - self.giveaway_message: Optional[Message] = giveaway_message - self.is_star_giveaway: Optional[bool] = is_star_giveaway - - self._id_attrs = ( - self.winner_count, - self.unclaimed_prize_count, - ) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "GiveawayCompleted": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - # Unfortunately, this needs to be here due to cyclic imports - from telegram._message import Message # pylint: disable=import-outside-toplevel - - data["giveaway_message"] = de_json_optional(data.get("giveaway_message"), Message, bot) - - return super().de_json(data=data, bot=bot) diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/__init__.py b/venv/lib/python3.12/site-packages/telegram/_inline/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index d5c96a9214ea5f9c2448c27c26fb4ac960676eee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 209 zcmZ9GO$x#=5QQ77AVLq~q8-$&xN_|kLTraNG=C&%rFal`?mdgga4$%AU74%|AH11w zhBq+JEL$Z(@B6ih{T0i<#(CJ>k|9}>(<8C7FpV)Y8ECXbkj%Rtj=Jn5D(}Ffz}hmI zJI~7&ZC>e%5}H+Lp-0t&;Ab#{Z?xJKn=Lr*F*mGiS&hGIpj-*A5NH7IDJ{$}E%#Da Uoxp=#ga=5li||PaAvO*41)i)r<^TWy diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinekeyboardbutton.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinekeyboardbutton.cpython-312.pyc deleted file mode 100644 index 6dd759a77c380f1f03c88a4abceb4c98fa76dc76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16094 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 diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinekeyboardmarkup.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinekeyboardmarkup.cpython-312.pyc deleted file mode 100644 index d42bc8f5a531e44666214d1590697aba0b27b649..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5880 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 K@iC$$oATe80$I5L diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequery.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequery.cpython-312.pyc deleted file mode 100644 index afc3a319ae92de7dec4b4d971875f52b0d528bd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9066 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 Wnm+T7ei2;udcrpoe<1kfNd5=z9t*Aj diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresult.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresult.cpython-312.pyc deleted file mode 100644 index 0f09c0a79f2cb37cc40a5c6c4ce0bf7938519d44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2700 zcmd^B-EUMy6ra1FcelGOjZ#WAFd8FlLw5scVpc*Z0ijs7LfgdbgR^({&bCwT$1*e9 zve<_{V1z`X#u!Rslvh&z03Uqt(Zm-TOh|6PkQifpF~vecc=F8sXjcj^zIv0LIcMga zGiQG1WA^8KK8xV{>)VfK2YL|tO)=4z42kuRfVhTCR7Iv{#w^W_RbzI%8rKvbw-R=; zn)K;}m9o>-v`;53-Of}qKAp0%c2BiOLosv$ndwW&)M<Jp9@wwuI+;TD;`>vxOkmqJ z+ZM$Q*O3Nu1eUYFScVW((T2pFwm22kk$8$)bcP!?9&;?_&@*kyJ7=kATeA44vRsIH z$@iFJSe`!7lFS9Fpm`ZEEu`T{0ZeaXW1>Ds8xmF$)M?u=>!&6sD#utuHUcMuQ4g8* zAAtB2Frlcb0WPs=K%yEqW7UKiHxu7zW|Ah&6#UXOMbkS$x|zC+nwqI!>aFTDGxu_6 zscV`W=wd>$+Cy_Ruk>lJnK=Y=2E9Og*K@S{y0o)O`!c$qRkux|LXX$K1vcY4MC7O; zs1G=9y4;6<i`;M&kzzKB;S0bM*lmJ5#4u1dxC*1)GPqHPh%yID%57hYo^Kl#lbs@- zT5z%JWB(j=-?$1FGbyJg_SN=brjDVE<FX+oFV~n^!*Hs<8+uf6B`y2v%D+*|!qaER z1#YQ4GL<XLPZ@k(<qV{hN*aL|7zoxWHs%dx`A$n0Q^&+@LAk&NP;fA(01U-;TgZ(Q zl#&o_8;pYraKo*3-C~X5(4XTM47+7fvFTIUa608$04+Z1N_>chGR45Rx+@RY0(?jL zOqZtYv?$(N2Gq(mA$hG(##3s^N1uk5DQ>vN%x8qB9R}CNfT<%{lTjW98XydS*temp zz$?p{5x->0H5nFMaZ5%NPmfi|*fBDGymDgdWNqZXSQ!1V%K|>ykyM1}jY61Ny$uVS z`2GJ-fOZyRrk7ARuiVtUtkGiR+=2ng!E;dB9NIVHy)ZPw#)>pxR1;VH`mZp2tzAPB z=HR=MSVUK0e=&YbTT!y`X-GzGAI+tLweC?yEfCH54@dVNSke}?sI4y|vY{{gBDuv_ zbQ0`u*jhw$+aih0xv7CnCgMS6dqi)}D<P?&4mA7<&jSz5Eh*Y9$~~PB<}gVJPs6&G zouQK0)UH#`)h)g4TQXUdk`JdBhvM=v^)iH+MD-fsrAd=hdXW~AUP4f-`3&+PO8o9e zh)@Tp0$O_7Db2bzE!l<?^QB{M1NsC!Kc%RgMucRIbCi#m?t){v1~j|UJay(v7OR(9 z9Xabd2aEd;lmwG>q-8YD88dWKy975>&tEB+{EimXak16m{ousKp)I#8M!38S`{E1? zPnOU<J%1&=st?{cbz2|&MK3){p`l&h?Y_SI*3P?yldFZ3KfQ7LgQ+_^r!OZy%iP;B zw0z*J1t8N8Kx)tRJ<CJD^ghsYpXaXRuJ*2jQRL<S)fj;7uJS^^3Xo&iln^gVNbvRp zog+lO5aCXm5YuhIGJq>AR|*KHdOmqV4JwEHYX%V=*mBo#W;4lOQDUkNyf|~D*GGuq zIIc9*{{m(3Rkf85qt~F8MMy#8gRm-8WgOw^4dyE4{XsppLcs9k6Z9}PnAF$aLjAj! z#vV*e{*5xp9m|tzYP!+zr|<Xv_|9s1{IObE8$hoO-^E8(@sYc@vWhE9r@wf6`K2$* zcM_GgSR5?rFBVu=0(>a)qEg6n42+k8rofyT|AIa&o*rda0Lx&+7D+?}&n{Or>h(p7 zMbehc5<$6ae`d9)T8{`2S4iAMfh!7{r~08Fe24iyU=?QKO&HeVnx;M6i?p-aAL#Yp a(XRXG;C+Peqv1!X{hGeq`xwFG+xZ9eh1`h% diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultarticle.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultarticle.cpython-312.pyc deleted file mode 100644 index 833f2325a67faaadef1b24c71c1953dfe1cfad3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4625 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 diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultaudio.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultaudio.cpython-312.pyc deleted file mode 100644 index 4536875631525da20d518bea1f37ad5a8bafe685..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6026 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 A<p2Nx diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultcachedaudio.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultcachedaudio.cpython-312.pyc deleted file mode 100644 index d12624368032ceafa01e664a3331f2d567431094..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4772 zcmeHK%WoUU8J{J^r%1gl$&c9eB#H&oHJ5(KNWdhD8A-O)=;4Q)#w@Jma(5`LwGU=? zDTOW%J{YJCG$?W?l0#7xJvDF-ZU2Jy+>3++sIaJz7DW%e6m*@|flvKrc9#!Haf_fp zd*~3Hotf{OZ@&2+znS@MI-NvN{`%wZu8t2Q^e5H{O2ltG`6)C$LMkdERZv5^V1$Yx zfwjYW*yt(t7?EOx_j~lH5i7=cJEF&pL@~kJQ9Wt&7JGR+rl*W_G0od?z0c?`_Vac^ zA20@sgT_#Ci1(BF0b{s0EFjWDqp()5K4Od(M+Fo@myw#fkJL0tJPLa{77y0@GW~bo zSz6U>Y*=bdCs?seN7hUmJFC#qW!omKEjyT!DkU~C9lS(zvO;A8&zibsl4~_W>(_~0 z)14_<StV+rrfQb>7q&=7aN{?~do^MzBolJeOSi7hNK;p4rrw@ixa`IktBz)wvJPy+ zp0Kw`y==);otNoatqS9VdlrGg^gOX`d4<fFj^@;1V5llnn@G05lqAy?7)?#jTq@k0 zTap$Q7iM7j__uB>E=+5R11nFzGiz3B4sea^Sz)POB|td9IsB!jz%a0R#WS5(AMiU* z?nC2y;BA760(d;63dOJ*D)y*h_9GEBT!FvZ^CLlxkf<7ke~iRP^f1g*<IsxpR)WOT zByaVSgilQYHA#BeD5s>MpJJ`bzynkf)V}-u#q<O8zEJGDfinH>(LKBAaEh!Z5K3Yw z*8^|bSjOPRHSAbeHnCAXk7edRT+tvLY{#NR#g@tAq2+j+&~-v>5x-T(Dyhie`qRJx zVZ`V175MxOP1kW5<gmCY*SVA$%ocG$cL+6QM_VU){WPvyHLSq;K*V|3acI7zG5<)0 z=V^%rCI~5ko?JXgR6%v0j5joAl}op)MA0f5DDBU{5X}yeVG|Y3z%>+;T!<)wW<=I) zE1$>t4Q)-!m%eS$HO*Y{Bwhj|z@}iSd7^4Ee%+^L*?L({%>p&csgos7YJslUc`lz> zT2t}Kyj8xFFWC+)W%Br@sX;=(IBbV$N^!-ap7kKXm?>Lx+5Eh-l7+3<PQK*$i6`#y zu{b}wAk9uob2AH<m#&nuUq?dW-3|%hS%=tSOAfc1#C$64*-!zm%Q}p5kMG$Q>4>Mc zJVoZI-)WlD*b3kvkEc9(w<*qK_cI1Jj%+%%=%?zOW@wH$Rk*q|ySNaT1S_jDl@$m& z@Mi@+n3><vh~3&Fvo^yK@P1oS4_E*l$ye&yX!A5$!u$<N!7BJ<fP>%3b6o9kr?2-6 zN3+uHE<-eS3u<^l#*}3RLYSo@z$k3cTp=n%^0_nOnU*3R8^(<Q9Qo=1kamY80C&AE z860$BpSu<G;;kE-OI>Pu9C*!#Zwx8S&w?&B0Akp&;^%DJ#`|XazG?s>_{N&@@t{i! zf6!0$uC@I|8O#NE^c-L)00L>{8l*rwksUY{I%5D*`T60vCrjD6A{K5=&n}iaHvfNo zXq`80tL%dhVDI3*ApWo8Lzk}qCO$Z|s!skTICM+)%@lwPJ2*SC`nmYfl^u-p6mD=8 zJbVC201yFq1Yh8h^$odhbIvyX>)=P%PX257(WS+I3_mhaH{Eq)x-s8X?!az9cSrWc zKR4MvR@_vlffqgz+@xI9q_qtO<8DY(=^)$)=@6?%Sp}~WMEh7Z!YX!ArH7zW;!v?7 zz&{Fq_7r&X52$`9e1shMdgWoFfj)qzjMEd0++p0iN<(PGe=Y>i2>~_G9k^faE|2_y z3$SP-)Id`3L_&=)^jdNoQRu~j*$&$gFOAqErY#hpx8yf^pvRwKoDzXvFK2>E<-bQE zuP>lF8bfE1Eo{I8>=tOjM&1wKLK{LRv_KC6TPEd3>{^vjH!ew<sX3BF(=hHvI9$64 zsb*HFb(feOmgc5q3VHTz89tMAdu*atD7&V2@V6LtIR&IkJn1CKW;+U!4c~iqKeuWb zBxlHuy`G!4l$rslZs&rFVAggtWsT6RYHgUhC98zy)`_{E)3tK0T6b10^SpTWT+Y@U zlC8?h8oZg>vvaUh_JGTIAGnm#x_1Lr_}T5<l&f`m6qLGqV$X5b@vsmBt1SboU5Dz+ zd+3WJDAD&YwiQ40*<tZ_hbOiUPyC|%>*6N#<5#!SgFje)xcq7Q*kcq=EDPJ?=O0Xe zmik6BioSX7!Swg%wzIFmXYu!MUfaB0{`5_SQD5A?ILE%nwy)e~-|?q|Z0=Jo!ISgM zW?}HFi9#;?n_Q&uY7E{);8RmJh$Oj5N%9`L&`wFxdo@}2DKSY>Ed_?b8MbaYHbek( zh8u=!J7pnDS)|ewt60`hmP(W@#_i*#eJ3hJ*Ci<<Pz)rSMearVBI6nesxe0RB~)MD zM~_3fNW57VVuR6pv&|#urSa`oUfV9rY`=VFd-AR3;Amu7Xbz)O;@?JC^AD;1W`vJL z(V-WbG2V=$p(7uUeR!;y;N2uTczpBt`K{53W-lK|A$)T4<QrSZC!1+L(1%8jeSG7? z`DQ=w4xkste)8(i=C{W3TSs1NtqDBuZVit=<qJPXjP(g9?QLWsbBLaRj@z$Tx=s}K zj<-d*tZ>`7QMfF@HJUQ`;Kp-L1Tic6Q73v)7u*=VyC=7?`_fnNc0?#;K;a&2Gy3;C zeiGKXZ`|W;YR%DfP>-(g1oAKWl;y5_bT^m(poKRLBm@tEk=-opDrkGYXYt?;wHR8D z5f47%0l@=f76P9jnt>0GiD&WGy>OhQ7hsG9i~R;v&9EQ{kH?X4Ti8J_e~wQ58C}{z p7kALv9W=RvE_{wAcF@Eh!vi}#r@x3^6NF`9b8O=8h_|@-e*(5{hW`Kn diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultcacheddocument.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultcacheddocument.cpython-312.pyc deleted file mode 100644 index 48a96101dda29f09b3b27e5d300d22e1eb162e6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5241 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 D#9tL= diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultcachedgif.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultcachedgif.cpython-312.pyc deleted file mode 100644 index 8eda37a3b8076b8d8c22304c58bb2cc29beed73c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5369 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 W3Qc|)DGI`M;lci?zan1a>i-7!4mF_w diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultcachedmpeg4gif.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultcachedmpeg4gif.cpython-312.pyc deleted file mode 100644 index 22d90d04a31e8b548ede619dc02454c616b746e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5464 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 ML!*C3yu{W21MG`Y&;S4c diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultcachedphoto.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultcachedphoto.cpython-312.pyc deleted file mode 100644 index 7393fe1f5a0b8c1a3412e9cabe01051797c34bb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5580 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 U$3Bl>j=RD=8k_tFVl}4zpZh3!t^fc4 diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultcachedsticker.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultcachedsticker.cpython-312.pyc deleted file mode 100644 index 848da6b10340858fb79bcd42466988c921037178..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3378 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 Ai~s-t diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultcachedvideo.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultcachedvideo.cpython-312.pyc deleted file mode 100644 index cc6c688e804fff2effbda4763be9a51930f2ab1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5499 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 diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultcachedvoice.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultcachedvoice.cpython-312.pyc deleted file mode 100644 index 454f640cbf78fb19e8d2c89c6c837a7e5909e1a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4971 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 diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultcontact.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultcontact.cpython-312.pyc deleted file mode 100644 index bb7b41868576282ff1283ef987a6d33a7a87a6f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4971 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 bm;MwSyFYaF^Ke;F7L>a)^Zz6gk}UrPlj5wV diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultdocument.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultdocument.cpython-312.pyc deleted file mode 100644 index 30544cac502e65315fa7a6e3f2c7ac5f6dc3deee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6536 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 WEk{3Ty%69s+++UO-w=Zs`+orA&x7Xx diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultgame.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultgame.cpython-312.pyc deleted file mode 100644 index 415743bf0e32496876b413e08d9ec9866329528e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2538 zcmeHIPiS047@yg{Z@0TGsZBI((>|1zZfM?86H%5TjikoZW`k{%_8mI=vTru~lJ{pj zGn;g4gdPf}pm>sc5b;_nC>}lO*-L{3%Y#5cJb01BR9brSn|ZsNu&D?2>cE@#`)0oH zo0;GD%{M>h^H~J#_b=YBe+}ptDRf%04Yo`Gw~>uZWMez#VlQUKu*7jU?j_8G!U;F& zrOcGVNjL3jrlxSp&3IWei%|?sB0GH(*&0pVjYq!CJ*`Y3dwpiM?r_};?50cgYTygY z@wqPQAh;IiRANi$j5ZkM)ED|Jb?H2_JblV{9iP6_q^xy;@}?^$Esq+%N$&+5YBLSt z1is}0J`kzCO<Qw;#q4Q|EjAl4-nYwzG(2~4raa+P1>pW&3bU;Stwslk`aNx7s|?^n z;EEy>179&4n{hj4CNjv*+HpJaIkuBDX{X>z(-ch)g1+Q~Y7*77RaC=v=H@;#vx=@^ zGkXyg_B>+)@{rb-z~O}sBV4!ik|L{A5p8k|sa7$vSsmIqo988kq~zH8iBd4PP^xgj zDut5%uJ2rJQWytzoti_LUJDqo4q*Yxf!C8=TWMbs^CJ)^E_ST8izZ`ws!XOP$oaG7 z$=SCmBmc(3_@x~l^fy|9a--{K9?nO2Jz#?P0DF#fQBLS;BB-fklKR`$kWFrjcq$LT zw3obRrAy_c9&|FQ)XqJ9v7J%6C4^P2Q@guA$&?7x(jMj9nupcZ<hT&bnQOvfwnHKy zsd`TEES44PmM^%mi*K2h#^m_)S%|q@TDJcKt;@3Uj{^-?qEkDJ{}AXxEZo<VrD1O8 ze#&=nn6(-XSzNZ@hK4c6X0jqPSyEUYx@rPC*)V)5_+;ta`VP8J@ogmFAGKS_74$Kb zY|+t23sSqMt>Bf!SGZGtF<L<jnI07o@3x0tfknXrk<L?qR$?G^{jS78N_XsScp_|c zHx|hlwa`oG6ykUp9*fK1Nse5LUq;Kg5G%7Bs1>v@$(s$zLX8l|cLX6!x(gFBjl&FS z`ZX3@r#{;Yquaz3QelEqx7IVP_yQ}U?lK`<Zd6@^8&5wd)&q|gJxlPV;zUqwdQj<j zu~REYxNxeAl#STIvhN0#O<8e?`b$OEnJYG0q8|98#;KQ!+!1u7VO1C5GH+WKVe|4G zDn>u3q^uQ{O;vIlE!GD+xqf8Vm7SCosdMx((Bbl}eR2am+K)1OZ>86?7w!)lKM#(s z4UT?u;rny<K-Oj+<oiCka_h=Z`Jqje$V}r0hlW-sKAL=R;?>oO`#JsLne*~L^f)6Y zA1jqe@hO*S_3glTU;Kx@<oLmK0hi%{0rF*;BqYod61~EJbA()NT5fwLO^6*-VHoJ; zZXh_oI6NLqrX!O%$0Xb8pkclpf+}@gLJFAm!xWbZe1;83EtzwwJ1i$E&^@_{He=5v zwT)raH+ExcBZpo)y^-0QoW=l$jX&}dKFsagNUE_EIykhER!~FFAH8>UbZua)tKUEL z*`>7u#~&-BO(fN}V2x<Wav{eKf)J*l<U0PmIzf1>lL<yUmPQoIPIZso33br$#lO+r z5qBnUOxVAz*c6V-4O!&5A}ZY9o$Ho#mHUd8JBS^T`;}xp)lNq-d7T{tQL@Mj&~3yq m#+%0xeh;ssL%*Uo*U_1EG`x<+9;J@sX?*YS$e&08<?1i}LeVDx diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultgif.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultgif.cpython-312.pyc deleted file mode 100644 index 5362fb2d3232c4ec2add2f1d6abca9b0d4e8927d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7808 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 diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultlocation.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultlocation.cpython-312.pyc deleted file mode 100644 index 53db94e50c7d1967fa7d7b535322ff8a5df5e9e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9160 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 LAO4JB#bEw#ZNftW diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultmpeg4gif.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultmpeg4gif.cpython-312.pyc deleted file mode 100644 index 6ab1ec131e8b6e4e06b38ee41092d26caff5805a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7911 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 E8^Uz?xBvhE diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultphoto.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultphoto.cpython-312.pyc deleted file mode 100644 index d3ecab372ae6a6818f68ff834e21f4e15290b227..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6452 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 PZh?E+pZGgsH75QaeJXSN diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultsbutton.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultsbutton.cpython-312.pyc deleted file mode 100644 index 9eed4c5192703d323610eaeeeb33c6db80c17dd2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5320 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 diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultvenue.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultvenue.cpython-312.pyc deleted file mode 100644 index a604c38fb41f9268849dc142c81def93322018bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6432 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 diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultvideo.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultvideo.cpython-312.pyc deleted file mode 100644 index 7d2c5e8f243670e6ff2faf2f941b6d71d178bb04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8201 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 diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultvoice.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inlinequeryresultvoice.cpython-312.pyc deleted file mode 100644 index b1b68724948f28c1220bfee492f8ca3130663e41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5958 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 diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inputcontactmessagecontent.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inputcontactmessagecontent.cpython-312.pyc deleted file mode 100644 index e5a78786e051260c4b4430d4051cd1fb486e4eeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2522 zcmd5--D_M$6rb78yW6DSku;h*ZEEd?<X#)?%c5dTL|SwMZ4kRcZ|?4$O>TQXwllLy zw?-&ZFoBBrAnk*Q_*T-tz&Brf(T5fbh6{y&_~46dOr@nyo^$W+Cea3b?7*HqXYTKu zne#E{{M6f<C$Rqf=Ht2Vf%^@G&PunLjkkfhNo-OkHnkHj^%CU-MLy{!y;M0B@hLa$ zWy%>!669TCr>_$`!&58C*hV?q%oen()6;W~WL{u5T+XV2uPn!xOwEDdT2gZ4EyV<{ z3of~@*fe+ftgt+G+OId%1Zq^(`&>$EmZJn1{SQ2%KtpY+uAIQPT;LBx`0YT1oH;jD znslnF8ec1>y=`Hm49sWXDJNwL-X?5XPTGlbDo1j}-eo84)YsHb^E7ytwzC}QA<(e3 zE|&u?i+i>F5~)!;e|=9`TOwCzId_f}dcuL7-LQUyP@U~K-VRFaAq#5Eio;b^%!|Ee zDqt1Pq9|E09AegRRfP7L<GYT}+2sZoO+BAyu%;>(c~waSD9l3?b7l!lg;%$PRe`KH zK2uzH5sF`KSgxa*I-6bySg@0NWE`?79h(bovq)`(Id}|r1S?ufiQ-IsF7UbOH@pfL zGYrm;aP7N|i&<HW4B<_;LfMHToLrodO3W0BtX%^y%NWFBdwN&3<_M`w-}3m5iV=h% zWK#{w@4s3jEa;Tf)`JoIFZKDVCG4#SZc`n%Z6_{GW?RZ)RwZbtxa{MKj-n2)pcV)( z&i4ES7#!((g+X~`w5VoBG0v(uquLKck7UbNQg27*J;!sD{=vlf*~uAJX(}!|A%-kC zl?H4)bAg7ub{?<3CBy$G(A!j>jX)PtVScj=!(6wv!k(>#9j2qIDcz=F-l{w1r3DKf zfxvz&G$c7ByO3aqs&?8j1t9}JY^@tV1Nn;HBntlHwVYWbp96L=eTS|f78WIo<YGrZ z-iqi-n?HpJx=2j48Lh<xNU5%r1gWdPm;woJ5G}CW<vV-O0MS~uBik@MY_gJwWlEZ4 zh@2#nF2EQ$4`<`fmE?J{KnsbI=mA(k3)8Yu=OWZh)A1c;nqkgt_%#t+<^I!x1fLz- z#8x8<*)S!!TYDNTiX~vpsQa0w#7pAyV(i+JPmQ_2<A!G`Id4n`)rJQHMjD;RHY$}< zy~M?+9W3~6U_rYx=D9y_xK72WHx)FvSM`%)hIAAkty|SgFr_xN4e$edvf<z?gLjLw ztliB~!dX^tioI~3t3x{v3cVALF#t*n$m46|;eL|ay_~(L^?!TjuGW8FGgf=|eQ{y= z!Y{pp>qN_qt-W+|Y4U#0;Ofxm(&UY)wUJZsS6V%R(wVixM}IwR+&gUC9R$>k(xZK# z@d(u--6s-@@H=CCAo;^UdVDAgNh%fcm>F!MkeR$`#zP(W9@E6J(f*P(O*^PY$up%J zC<$y5TDibV6IfD_!(nebAyw|WrdgokAbgTozHf;>L}8jDGJqc(Adjz;^~8a+)*2@J z-l5k{w|dC26RR%{wRY`KkF|D_Vg0W?z^y%ZsFlW@4C(7{Ws%d!!53~#eECKzhf<#G z?Z1^={-mSVH+bvAdk2p{LgjS=WCIS1&n^`-f#W^QsAk>qXCp7dW1afY+ZooQ3~x`Z zz{eE!Z9*H$aitD+xQyd~9^NKm5D!C_pJ=bgL48vk1rcK*j{s>UDW&Vj3H^vZAkY6! WCLfUDhnZnIcK66@e-rqRO#B1;Ud*@v diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inputinvoicemessagecontent.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inputinvoicemessagecontent.cpython-312.pyc deleted file mode 100644 index f4574dbd026ece6c1fab1a4264427e10a864031d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13215 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 diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inputlocationmessagecontent.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inputlocationmessagecontent.cpython-312.pyc deleted file mode 100644 index 420953f197a757f7a0b5606d491b61da2b8e20b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6729 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 diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inputmessagecontent.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inputmessagecontent.cpython-312.pyc deleted file mode 100644 index 766502a88c13019cbacdd349be39f46c2ed5d6f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1415 zcmaJ>&u`sC5Z-<Evz@0TsEts9T7*wU50Pg<FDO)iN>r4JCWk~EeA#Zj^YYyI7rXn? zyflX#BGDWwPN*CZ>X9n^5!|^@iIW9VCDa2Kln@YAPt4lSphjs%^6ZRfXZ_8$GyZXE zszXrz`1bDL4Tq55jMGSaY#d)j;{g#QB!Y@oLeo~*qQ<roE44$rvhAduI-x^Ji+n;v zdyfbQ>;tPlBXmb@*W13aHi(s<=3<zDALW_mai)AdKqui!fw8&vB@_}AWZGYY1lA=_ z{iUoJ>KmXGUx$w|5re(o&DmXAdMkyF^Nc5GPd6DWw{AnEP4xQe%JO0y>8OTM>;G!I zg8mm+9gvV>g)KotOSD2;Si=5>iZ-;tc@6gnM_7IP9_drz?oEg8J+ehZZ<Tbta^@6p z{2C?XDp%vm{C+OaEXJ?#s$Qq#qpSif_zM*&3pe$cgkJR>Q$3GPaB=hPD(&=)rED{g zBY2U$Gc!KTBW@@?neq}yYp`_^kIyr42Bgm*8=eGIag^o~d;!=PNyEh>viyja9bUw2 z;|`bWN}84}9SM3Uvj};v#H^;<%yWDV)mQWZ(YV&K-`XMf@z!_f_w-<#L&*-g-E=~; z5!ZvUP05IKTg!3+{jOEE)vy3rdW^+ctQjj^)|UX=fH7M^(yxI{Fjie0W6EIh{oUtx zgF&7`kaDdygT*`=rr5tKXfAeM={VW|IWO`%S(0-BGT4M{Gf3iFK{3*UJiFX`=iNZX z8s-ZgZQv06pB*5aB+ej+&5We=jF{mvGg6G?G=kW^cuJ4<nnK>h9qJ;gXS?JVZ))Ft z?9DyA{*yQNvll$^Ccm8ApS(YPjB(PPFy&`F1uVbASUt*UPcruTkSF7a%b3U`e2rYF zB-e^DX}FMv><UmhHD)P-Bw?&e<v9!~b1@&u^JbUZs0$_#pnA4Pj#_TpJ3LR$&Fn5c zdH=&diPfHcIQVYs@ul|;js3&oKV~^HO3pMVEO$LQi%#k2Q4weB6_#?Yp})r(E3bYU z(l&cvZC>`+P@8VVTu^ld6*kWtUwy;ieePYU$@oCNj;<+0`KS&pO6k!hLf7b1a^Wet U{406uFXt6H`*rVcf=hM6ztljMT>t<8 diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inputtextmessagecontent.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inputtextmessagecontent.cpython-312.pyc deleted file mode 100644 index 858e316b8b8ec5b2a93891be43b3c3f7f469da98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4556 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 Dp|3zj diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inputvenuemessagecontent.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/inputvenuemessagecontent.cpython-312.pyc deleted file mode 100644 index 64d53817c9655652b2df2069a045f1f58edda151..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4088 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 T>%v)0t9|n0lm8+JC?@{~_;;u3 diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/preparedinlinemessage.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_inline/__pycache__/preparedinlinemessage.cpython-312.pyc deleted file mode 100644 index f4687633a0df5e0fbbebdf98b2d10bf31b7261c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2898 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 O7M0QY@#hEzY3*NWM;kl< diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/inlinekeyboardbutton.py b/venv/lib/python3.12/site-packages/telegram/_inline/inlinekeyboardbutton.py deleted file mode 100644 index 07d0eed..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_inline/inlinekeyboardbutton.py +++ /dev/null @@ -1,337 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram InlineKeyboardButton.""" - -from typing import TYPE_CHECKING, Final, Optional, Union - -from telegram import constants -from telegram._copytextbutton import CopyTextButton -from telegram._games.callbackgame import CallbackGame -from telegram._loginurl import LoginUrl -from telegram._switchinlinequerychosenchat import SwitchInlineQueryChosenChat -from telegram._telegramobject import TelegramObject -from telegram._utils.argumentparsing import de_json_optional -from telegram._utils.types import JSONDict -from telegram._webappinfo import WebAppInfo - -if TYPE_CHECKING: - from telegram import Bot - - -class InlineKeyboardButton(TelegramObject): - """This object represents one button of an inline keyboard. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`text`, :attr:`url`, :attr:`login_url`, :attr:`callback_data`, - :attr:`switch_inline_query`, :attr:`switch_inline_query_current_chat`, :attr:`callback_game`, - :attr:`web_app` and :attr:`pay` are equal. - - Note: - * Exactly one of the optional fields must be used to specify type of the button. - * Mind that :attr:`callback_game` is not - working as expected. Putting a game short name in it might, but is not guaranteed to - work. - * If your bot allows for arbitrary callback data, in keyboards returned in a response - from telegram, :attr:`callback_data` may be an instance of - :class:`telegram.ext.InvalidCallbackData`. This will be the case, if the data - associated with the button was already deleted. - - .. versionadded:: 13.6 - - * Since Bot API 5.5, it's now allowed to mention users by their ID in inline keyboards. - This will only work in Telegram versions released after December 7, 2021. - Older clients will display *unsupported message*. - - Warning: - * If your bot allows your arbitrary callback data, buttons whose callback data is a - non-hashable object will become unhashable. Trying to evaluate ``hash(button)`` will - result in a :class:`TypeError`. - - .. versionchanged:: 13.6 - - * After Bot API 6.1, only ``HTTPS`` links will be allowed in :paramref:`login_url`. - - Examples: - * :any:`Inline Keyboard 1 <examples.inlinekeyboard>` - * :any:`Inline Keyboard 2 <examples.inlinekeyboard2>` - - .. seealso:: :class:`telegram.InlineKeyboardMarkup` - - .. versionchanged:: 20.0 - :attr:`web_app` is considered as well when comparing objects of this type in terms of - equality. - - Args: - text (:obj:`str`): Label text on the button. - url (:obj:`str`, optional): HTTP or tg:// url to be opened when the button is pressed. - Links ``tg://user?id=<user_id>`` can be used to mention a user by - their ID without using a username, if this is allowed by their privacy settings. - - .. versionchanged:: 13.9 - You can now mention a user using ``tg://user?id=<user_id>``. - login_url (:class:`telegram.LoginUrl`, optional): An ``HTTPS`` URL used to automatically - authorize the user. Can be used as a replacement for the Telegram Login Widget. - - Caution: - Only ``HTTPS`` links are allowed after Bot API 6.1. - callback_data (:obj:`str` | :obj:`object`, optional): Data to be sent in a callback query - to the bot when the button is pressed, UTF-8 - :tg-const:`telegram.InlineKeyboardButton.MIN_CALLBACK_DATA`- - :tg-const:`telegram.InlineKeyboardButton.MAX_CALLBACK_DATA` bytes. - If the bot instance allows arbitrary callback data, anything can be passed. - - Tip: - The value entered here will be available in :attr:`telegram.CallbackQuery.data`. - - .. seealso:: :wiki:`Arbitrary callback_data <Arbitrary-callback_data>` - - web_app (:class:`telegram.WebAppInfo`, optional): Description of the `Web App - <https://core.telegram.org/bots/webapps>`_ that will be launched when the user presses - the button. The Web App will be able to send an arbitrary message on behalf of the user - using the method :meth:`~telegram.Bot.answer_web_app_query`. Available only in - private chats between a user and the bot. Not supported for messages sent on behalf of - a Telegram Business account. - - .. versionadded:: 20.0 - switch_inline_query (:obj:`str`, optional): If set, pressing the button will prompt the - user to select one of their chats, open that chat and insert the bot's username and the - specified inline query in the input field. May be empty, in which case just the bot's - username will be inserted. Not supported for messages sent on behalf of a Telegram - Business account. - - Tip: - This is similar to the parameter :paramref:`switch_inline_query_chosen_chat`, - but gives no control over which chats can be selected. - switch_inline_query_current_chat (:obj:`str`, optional): If set, pressing the button will - insert the bot's username and the specified inline query in the current chat's input - field. May be empty, in which case only the bot's username will be inserted. - - This offers a quick way for the user to open your bot in inline mode in the same chat - - good for selecting something from multiple options. Not supported in channels and for - messages sent on behalf of a Telegram Business account. - copy_text (:class:`telegram.CopyTextButton`, optional): Description of the button that - copies the specified text to the clipboard. - - .. versionadded:: 21.7 - callback_game (:class:`telegram.CallbackGame`, optional): Description of the game that will - be launched when the user presses the button - - Note: - This type of button **must** always be the first button in the first row. - pay (:obj:`bool`, optional): Specify :obj:`True`, to send a Pay button. - Substrings ``“⭐️”`` and ``“XTR”`` in the buttons's text will be replaced with a - Telegram Star icon. - - Note: - This type of button **must** always be the first button in the first row and can - only be used in invoice messages. - switch_inline_query_chosen_chat (:class:`telegram.SwitchInlineQueryChosenChat`, optional): - If set, pressing the button will prompt the user to select one of their chats of the - specified type, open that chat and insert the bot's username and the specified inline - query in the input field. Not supported for messages sent on behalf of a Telegram - Business account. - - .. versionadded:: 20.3 - - Tip: - This is similar to :paramref:`switch_inline_query`, but gives more control on - which chats can be selected. - - Caution: - The PTB team has discovered that this field works correctly only if your Telegram - client is released after April 20th 2023. - - Attributes: - text (:obj:`str`): Label text on the button. - url (:obj:`str`): Optional. HTTP or tg:// url to be opened when the button is pressed. - Links ``tg://user?id=<user_id>`` can be used to mention a user by - their ID without using a username, if this is allowed by their privacy settings. - - .. versionchanged:: 13.9 - You can now mention a user using ``tg://user?id=<user_id>``. - login_url (:class:`telegram.LoginUrl`): Optional. An ``HTTPS`` URL used to automatically - authorize the user. Can be used as a replacement for the Telegram Login Widget. - - Caution: - Only ``HTTPS`` links are allowed after Bot API 6.1. - callback_data (:obj:`str` | :obj:`object`): Optional. Data to be sent in a callback query - to the bot when the button is pressed, UTF-8 - :tg-const:`telegram.InlineKeyboardButton.MIN_CALLBACK_DATA`- - :tg-const:`telegram.InlineKeyboardButton.MAX_CALLBACK_DATA` bytes. - web_app (:class:`telegram.WebAppInfo`): Optional. Description of the `Web App - <https://core.telegram.org/bots/webapps>`_ that will be launched when the user presses - the button. The Web App will be able to send an arbitrary message on behalf of the user - using the method :meth:`~telegram.Bot.answer_web_app_query`. Available only in - private chats between a user and the bot. Not supported for messages sent on behalf of - a Telegram Business account. - - .. versionadded:: 20.0 - switch_inline_query (:obj:`str`): Optional. If set, pressing the button will prompt the - user to select one of their chats, open that chat and insert the bot's username and the - specified inline query in the input field. May be empty, in which case just the bot's - username will be inserted. Not supported for messages sent on behalf of a Telegram - Business account. - - Tip: - This is similar to the parameter :paramref:`switch_inline_query_chosen_chat`, - but gives no control over which chats can be selected. - switch_inline_query_current_chat (:obj:`str`): Optional. If set, pressing the button will - insert the bot's username and the specified inline query in the current chat's input - field. May be empty, in which case only the bot's username will be inserted. - - This offers a quick way for the user to open your bot in inline mode in the same chat - - good for selecting something from multiple options. Not supported in channels and for - messages sent on behalf of a Telegram Business account. - copy_text (:class:`telegram.CopyTextButton`): Optional. Description of the button that - copies the specified text to the clipboard. - - .. versionadded:: 21.7 - callback_game (:class:`telegram.CallbackGame`): Optional. Description of the game that will - be launched when the user presses the button. - - Note: - This type of button **must** always be the first button in the first row. - pay (:obj:`bool`): Optional. Specify :obj:`True`, to send a Pay button. - Substrings ``“⭐️”`` and ``“XTR”`` in the buttons's text will be replaced with a - Telegram Star icon. - - Note: - This type of button **must** always be the first button in the first row and can - only be used in invoice messages. - switch_inline_query_chosen_chat (:class:`telegram.SwitchInlineQueryChosenChat`): Optional. - If set, pressing the button will prompt the user to select one of their chats of the - specified type, open that chat and insert the bot's username and the specified inline - query in the input field. Not supported for messages sent on behalf of a Telegram - Business account. - - .. versionadded:: 20.3 - - Tip: - This is similar to :attr:`switch_inline_query`, but gives more control on - which chats can be selected. - - Caution: - The PTB team has discovered that this field works correctly only if your Telegram - client is released after April 20th 2023. - """ - - __slots__ = ( - "callback_data", - "callback_game", - "copy_text", - "login_url", - "pay", - "switch_inline_query", - "switch_inline_query_chosen_chat", - "switch_inline_query_current_chat", - "text", - "url", - "web_app", - ) - - def __init__( - self, - text: str, - url: Optional[str] = None, - callback_data: Optional[Union[str, object]] = None, - switch_inline_query: Optional[str] = None, - switch_inline_query_current_chat: Optional[str] = None, - callback_game: Optional[CallbackGame] = None, - pay: Optional[bool] = None, - login_url: Optional[LoginUrl] = None, - web_app: Optional[WebAppInfo] = None, - switch_inline_query_chosen_chat: Optional[SwitchInlineQueryChosenChat] = None, - copy_text: Optional[CopyTextButton] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - # Required - self.text: str = text - - # Optionals - self.url: Optional[str] = url - self.login_url: Optional[LoginUrl] = login_url - self.callback_data: Optional[Union[str, object]] = callback_data - self.switch_inline_query: Optional[str] = switch_inline_query - self.switch_inline_query_current_chat: Optional[str] = switch_inline_query_current_chat - self.callback_game: Optional[CallbackGame] = callback_game - self.pay: Optional[bool] = pay - self.web_app: Optional[WebAppInfo] = web_app - self.switch_inline_query_chosen_chat: Optional[SwitchInlineQueryChosenChat] = ( - switch_inline_query_chosen_chat - ) - self.copy_text: Optional[CopyTextButton] = copy_text - self._id_attrs = () - self._set_id_attrs() - - self._freeze() - - def _set_id_attrs(self) -> None: - self._id_attrs = ( - self.text, - self.url, - self.login_url, - self.callback_data, - self.web_app, - self.switch_inline_query, - self.switch_inline_query_current_chat, - self.callback_game, - self.pay, - ) - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "InlineKeyboardButton": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["login_url"] = de_json_optional(data.get("login_url"), LoginUrl, bot) - data["web_app"] = de_json_optional(data.get("web_app"), WebAppInfo, bot) - data["callback_game"] = de_json_optional(data.get("callback_game"), CallbackGame, bot) - data["switch_inline_query_chosen_chat"] = de_json_optional( - data.get("switch_inline_query_chosen_chat"), SwitchInlineQueryChosenChat, bot - ) - data["copy_text"] = de_json_optional(data.get("copy_text"), CopyTextButton, bot) - - return super().de_json(data=data, bot=bot) - - def update_callback_data(self, callback_data: Union[str, object]) -> None: - """ - Sets :attr:`callback_data` to the passed object. Intended to be used by - :class:`telegram.ext.CallbackDataCache`. - - .. versionadded:: 13.6 - - Args: - callback_data (:class:`object`): The new callback data. - """ - with self._unfrozen(): - self.callback_data = callback_data - self._set_id_attrs() - - MIN_CALLBACK_DATA: Final[int] = constants.InlineKeyboardButtonLimit.MIN_CALLBACK_DATA - """:const:`telegram.constants.InlineKeyboardButtonLimit.MIN_CALLBACK_DATA` - - .. versionadded:: 20.0 - """ - MAX_CALLBACK_DATA: Final[int] = constants.InlineKeyboardButtonLimit.MAX_CALLBACK_DATA - """:const:`telegram.constants.InlineKeyboardButtonLimit.MAX_CALLBACK_DATA` - - .. versionadded:: 20.0 - """ diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/inlinekeyboardmarkup.py b/venv/lib/python3.12/site-packages/telegram/_inline/inlinekeyboardmarkup.py deleted file mode 100644 index 64fd8b4..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_inline/inlinekeyboardmarkup.py +++ /dev/null @@ -1,161 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram InlineKeyboardMarkup.""" -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional - -from telegram._inline.inlinekeyboardbutton import InlineKeyboardButton -from telegram._telegramobject import TelegramObject -from telegram._utils.markup import check_keyboard_type -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot - - -class InlineKeyboardMarkup(TelegramObject): - """ - This object represents an inline keyboard that appears right next to the message it belongs to. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their size of :attr:`inline_keyboard` and all the buttons are equal. - - .. figure:: https://core.telegram.org/file/464001863/110f3/I47qTXAD9Z4.120010/e0\ - ea04f66357b640ec - :align: center - - An inline keyboard on a message - - .. seealso:: - Another kind of keyboard would be the :class:`telegram.ReplyKeyboardMarkup`. - - Examples: - * :any:`Inline Keyboard 1 <examples.inlinekeyboard>` - * :any:`Inline Keyboard 2 <examples.inlinekeyboard2>` - - Args: - inline_keyboard (Sequence[Sequence[:class:`telegram.InlineKeyboardButton`]]): Sequence of - button rows, each represented by a sequence of :class:`~telegram.InlineKeyboardButton` - objects. - - .. versionchanged:: 20.0 - |sequenceclassargs| - - Attributes: - inline_keyboard (tuple[tuple[:class:`telegram.InlineKeyboardButton`]]): Tuple of - button rows, each represented by a tuple of :class:`~telegram.InlineKeyboardButton` - objects. - - .. versionchanged:: 20.0 - |tupleclassattrs| - - """ - - __slots__ = ("inline_keyboard",) - - def __init__( - self, - inline_keyboard: Sequence[Sequence[InlineKeyboardButton]], - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - if not check_keyboard_type(inline_keyboard): - raise ValueError( - "The parameter `inline_keyboard` should be a sequence of sequences of " - "InlineKeyboardButtons" - ) - # Required - self.inline_keyboard: tuple[tuple[InlineKeyboardButton, ...], ...] = tuple( - tuple(row) for row in inline_keyboard - ) - - self._id_attrs = (self.inline_keyboard,) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "InlineKeyboardMarkup": - """See :meth:`telegram.TelegramObject.de_json`.""" - - keyboard = [] - for row in data["inline_keyboard"]: - tmp = [] - for col in row: - btn = InlineKeyboardButton.de_json(col, bot) - if btn: - tmp.append(btn) - keyboard.append(tmp) - - return cls(keyboard) - - @classmethod - def from_button(cls, button: InlineKeyboardButton, **kwargs: object) -> "InlineKeyboardMarkup": - """Shortcut for:: - - InlineKeyboardMarkup([[button]], **kwargs) - - Return an InlineKeyboardMarkup from a single InlineKeyboardButton - - Args: - button (:class:`telegram.InlineKeyboardButton`): The button to use in the markup - - """ - return cls([[button]], **kwargs) # type: ignore[arg-type] - - @classmethod - def from_row( - cls, button_row: Sequence[InlineKeyboardButton], **kwargs: object - ) -> "InlineKeyboardMarkup": - """Shortcut for:: - - InlineKeyboardMarkup([button_row], **kwargs) - - Return an InlineKeyboardMarkup from a single row of InlineKeyboardButtons - - Args: - button_row (Sequence[:class:`telegram.InlineKeyboardButton`]): The button to use - in the markup - - .. versionchanged:: 20.0 - |sequenceargs| - - """ - return cls([button_row], **kwargs) # type: ignore[arg-type] - - @classmethod - def from_column( - cls, button_column: Sequence[InlineKeyboardButton], **kwargs: object - ) -> "InlineKeyboardMarkup": - """Shortcut for:: - - InlineKeyboardMarkup([[button] for button in button_column], **kwargs) - - Return an InlineKeyboardMarkup from a single column of InlineKeyboardButtons - - Args: - button_column (Sequence[:class:`telegram.InlineKeyboardButton`]): The button to use - in the markup - - .. versionchanged:: 20.0 - |sequenceargs| - - """ - button_grid = [[button] for button in button_column] - return cls(button_grid, **kwargs) # type: ignore[arg-type] diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequery.py b/venv/lib/python3.12/site-packages/telegram/_inline/inlinequery.py deleted file mode 100644 index 73bb3b4..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequery.py +++ /dev/null @@ -1,220 +0,0 @@ -#!/usr/bin/env python -# pylint: disable=too-many-arguments -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram InlineQuery.""" - -from collections.abc import Sequence -from typing import TYPE_CHECKING, Callable, Final, Optional, Union - -from telegram import constants -from telegram._files.location import Location -from telegram._inline.inlinequeryresultsbutton import InlineQueryResultsButton -from telegram._telegramobject import TelegramObject -from telegram._user import User -from telegram._utils.argumentparsing import de_json_optional -from telegram._utils.defaultvalue import DEFAULT_NONE -from telegram._utils.types import JSONDict, ODVInput, TimePeriod - -if TYPE_CHECKING: - from telegram import Bot, InlineQueryResult - - -class InlineQuery(TelegramObject): - """ - This object represents an incoming inline query. When the user sends an empty query, your bot - could return some default or trending results. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`id` is equal. - - .. figure:: https://core.telegram.org/file/464001466/10e4a/r4FKyQ7gw5g.134366/f2\ - 606a53d683374703 - :align: center - - Inline queries on Telegram - - .. seealso:: - The :class:`telegram.InlineQueryResult` classes represent the media the user can choose - from (see above figure). - - Note: - In Python :keyword:`from` is a reserved word. Use :paramref:`from_user` instead. - - .. versionchanged:: 20.0 - The following are now keyword-only arguments in Bot methods: - ``{read, write, connect, pool}_timeout``, :paramref:`answer.api_kwargs`, - ``auto_pagination``. Use a named argument for those, - and notice that some positional arguments changed position as a result. - - .. versionchanged:: 22.0 - Removed constants ``MIN_START_PARAMETER_LENGTH`` and ``MAX_START_PARAMETER_LENGTH``. - Use :attr:`telegram.constants.InlineQueryResultsButtonLimit.MIN_START_PARAMETER_LENGTH` and - :attr:`telegram.constants.InlineQueryResultsButtonLimit.MAX_START_PARAMETER_LENGTH` - instead. - - Args: - id (:obj:`str`): Unique identifier for this query. - from_user (:class:`telegram.User`): Sender. - query (:obj:`str`): Text of the query (up to - :tg-const:`telegram.InlineQuery.MAX_QUERY_LENGTH` characters). - offset (:obj:`str`): Offset of the results to be returned, can be controlled by the bot. - chat_type (:obj:`str`, optional): Type of the chat, from which the inline query was sent. - Can be either :tg-const:`telegram.Chat.SENDER` for a private chat with the inline query - sender, :tg-const:`telegram.Chat.PRIVATE`, :tg-const:`telegram.Chat.GROUP`, - :tg-const:`telegram.Chat.SUPERGROUP` or :tg-const:`telegram.Chat.CHANNEL`. The chat - type should be always known for requests sent from official clients and most - third-party clients, unless the request was sent from a secret chat. - - .. versionadded:: 13.5 - location (:class:`telegram.Location`, optional): Sender location, only for bots that - request user location. - - Attributes: - id (:obj:`str`): Unique identifier for this query. - from_user (:class:`telegram.User`): Sender. - query (:obj:`str`): Text of the query (up to - :tg-const:`telegram.InlineQuery.MAX_QUERY_LENGTH` characters). - offset (:obj:`str`): Offset of the results to be returned, can be controlled by the bot. - chat_type (:obj:`str`): Optional. Type of the chat, from which the inline query was sent. - Can be either :tg-const:`telegram.Chat.SENDER` for a private chat with the inline query - sender, :tg-const:`telegram.Chat.PRIVATE`, :tg-const:`telegram.Chat.GROUP`, - :tg-const:`telegram.Chat.SUPERGROUP` or :tg-const:`telegram.Chat.CHANNEL`. The chat - type should be always known for requests sent from official clients and most - third-party clients, unless the request was sent from a secret chat. - - .. versionadded:: 13.5 - location (:class:`telegram.Location`): Optional. Sender location, only for bots that - request user location. - - """ - - __slots__ = ("chat_type", "from_user", "id", "location", "offset", "query") - - def __init__( - self, - id: str, # pylint: disable=redefined-builtin - from_user: User, - query: str, - offset: str, - location: Optional[Location] = None, - chat_type: Optional[str] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - # Required - self.id: str = id - self.from_user: User = from_user - self.query: str = query - self.offset: str = offset - - # Optional - self.location: Optional[Location] = location - self.chat_type: Optional[str] = chat_type - - self._id_attrs = (self.id,) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "InlineQuery": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["from_user"] = de_json_optional(data.pop("from", None), User, bot) - data["location"] = de_json_optional(data.get("location"), Location, bot) - - return super().de_json(data=data, bot=bot) - - async def answer( - self, - results: Union[ - Sequence["InlineQueryResult"], Callable[[int], Optional[Sequence["InlineQueryResult"]]] - ], - cache_time: Optional[TimePeriod] = None, - is_personal: Optional[bool] = None, - next_offset: Optional[str] = None, - button: Optional[InlineQueryResultsButton] = None, - *, - current_offset: Optional[str] = None, - auto_pagination: bool = False, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.answer_inline_query( - update.inline_query.id, - *args, - current_offset=self.offset if auto_pagination else None, - **kwargs - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.answer_inline_query`. - - .. versionchanged:: 20.0 - Raises :class:`ValueError` instead of :class:`TypeError`. - - Keyword Args: - auto_pagination (:obj:`bool`, optional): If set to :obj:`True`, :attr:`offset` will be - passed as - :paramref:`current_offset <telegram.Bot.answer_inline_query.current_offset>` to - :meth:`telegram.Bot.answer_inline_query`. - Defaults to :obj:`False`. - - Raises: - ValueError: If both :paramref:`~telegram.Bot.answer_inline_query.current_offset` and - :paramref:`auto_pagination` are supplied. - """ - if current_offset and auto_pagination: - raise ValueError("current_offset and auto_pagination are mutually exclusive!") - return await self.get_bot().answer_inline_query( - inline_query_id=self.id, - current_offset=self.offset if auto_pagination else current_offset, - results=results, - cache_time=cache_time, - is_personal=is_personal, - next_offset=next_offset, - button=button, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - MAX_RESULTS: Final[int] = constants.InlineQueryLimit.RESULTS - """:const:`telegram.constants.InlineQueryLimit.RESULTS` - - .. versionadded:: 13.2 - """ - MAX_OFFSET_LENGTH: Final[int] = constants.InlineQueryLimit.MAX_OFFSET_LENGTH - """:const:`telegram.constants.InlineQueryLimit.MAX_OFFSET_LENGTH` - - .. versionadded:: 20.0 - """ - MAX_QUERY_LENGTH: Final[int] = constants.InlineQueryLimit.MAX_QUERY_LENGTH - """:const:`telegram.constants.InlineQueryLimit.MAX_QUERY_LENGTH` - - .. versionadded:: 20.0 - """ diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresult.py b/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresult.py deleted file mode 100644 index 67ce6e4..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresult.py +++ /dev/null @@ -1,79 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -# pylint: disable=redefined-builtin -"""This module contains the classes that represent Telegram InlineQueryResult.""" - -from typing import Final, Optional - -from telegram import constants -from telegram._telegramobject import TelegramObject -from telegram._utils import enum -from telegram._utils.types import JSONDict - - -class InlineQueryResult(TelegramObject): - """Baseclass for the InlineQueryResult* classes. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`id` is equal. - - Note: - All URLs passed in inline query results will be available to end users and therefore must - be assumed to be *public*. - - Examples: - :any:`Inline Bot <examples.inlinebot>` - - Args: - type (:obj:`str`): Type of the result. - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - - Attributes: - type (:obj:`str`): Type of the result. - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - - """ - - __slots__ = ("id", "type") - - def __init__(self, type: str, id: str, *, api_kwargs: Optional[JSONDict] = None): - super().__init__(api_kwargs=api_kwargs) - - # Required - self.type: str = enum.get_member(constants.InlineQueryResultType, type, type) - self.id: str = str(id) - - self._id_attrs = (self.id,) - - self._freeze() - - MIN_ID_LENGTH: Final[int] = constants.InlineQueryResultLimit.MIN_ID_LENGTH - """:const:`telegram.constants.InlineQueryResultLimit.MIN_ID_LENGTH` - - .. versionadded:: 20.0 - """ - MAX_ID_LENGTH: Final[int] = constants.InlineQueryResultLimit.MAX_ID_LENGTH - """:const:`telegram.constants.InlineQueryResultLimit.MAX_ID_LENGTH` - - .. versionadded:: 20.0 - """ diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultarticle.py b/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultarticle.py deleted file mode 100644 index 784fc8f..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultarticle.py +++ /dev/null @@ -1,129 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the classes that represent Telegram InlineQueryResultArticle.""" - -from typing import TYPE_CHECKING, Optional - -from telegram._inline.inlinekeyboardmarkup import InlineKeyboardMarkup -from telegram._inline.inlinequeryresult import InlineQueryResult -from telegram._utils.types import JSONDict -from telegram.constants import InlineQueryResultType - -if TYPE_CHECKING: - from telegram import InputMessageContent - - -class InlineQueryResultArticle(InlineQueryResult): - """This object represents a Telegram InlineQueryResultArticle. - - Examples: - :any:`Inline Bot <examples.inlinebot>` - - .. versionchanged:: 20.5 - Removed the deprecated arguments and attributes ``thumb_*``. - - .. versionchanged:: 21.11 - Removed the deprecated argument and attribute ``hide_url``. - - Args: - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - title (:obj:`str`): Title of the result. - input_message_content (:class:`telegram.InputMessageContent`): Content of the message to - be sent. - reply_markup (:class:`telegram.InlineKeyboardMarkup`, optional): Inline keyboard attached - to the message. - url (:obj:`str`, optional): URL of the result. - - Tip: - Pass an empty string as URL if you don't want the URL to be shown in the message. - description (:obj:`str`, optional): Short description of the result. - thumbnail_url (:obj:`str`, optional): Url of the thumbnail for the result. - - .. versionadded:: 20.2 - thumbnail_width (:obj:`int`, optional): Thumbnail width. - - .. versionadded:: 20.2 - thumbnail_height (:obj:`int`, optional): Thumbnail height. - - .. versionadded:: 20.2 - - Attributes: - type (:obj:`str`): :tg-const:`telegram.constants.InlineQueryResultType.ARTICLE`. - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - title (:obj:`str`): Title of the result. - input_message_content (:class:`telegram.InputMessageContent`): Content of the message to - be sent. - reply_markup (:class:`telegram.InlineKeyboardMarkup`): Optional. Inline keyboard attached - to the message. - url (:obj:`str`): Optional. URL of the result. - description (:obj:`str`): Optional. Short description of the result. - thumbnail_url (:obj:`str`): Optional. Url of the thumbnail for the result. - - .. versionadded:: 20.2 - thumbnail_width (:obj:`int`): Optional. Thumbnail width. - - .. versionadded:: 20.2 - thumbnail_height (:obj:`int`): Optional. Thumbnail height. - - .. versionadded:: 20.2 - - """ - - __slots__ = ( - "description", - "input_message_content", - "reply_markup", - "thumbnail_height", - "thumbnail_url", - "thumbnail_width", - "title", - "url", - ) - - def __init__( - self, - id: str, # pylint: disable=redefined-builtin - title: str, - input_message_content: "InputMessageContent", - reply_markup: Optional[InlineKeyboardMarkup] = None, - url: Optional[str] = None, - description: Optional[str] = None, - thumbnail_url: Optional[str] = None, - thumbnail_width: Optional[int] = None, - thumbnail_height: Optional[int] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - # Required - super().__init__(InlineQueryResultType.ARTICLE, id, api_kwargs=api_kwargs) - with self._unfrozen(): - self.title: str = title - self.input_message_content: InputMessageContent = input_message_content - - # Optional - self.reply_markup: Optional[InlineKeyboardMarkup] = reply_markup - self.url: Optional[str] = url - self.description: Optional[str] = description - self.thumbnail_url: Optional[str] = thumbnail_url - self.thumbnail_width: Optional[int] = thumbnail_width - self.thumbnail_height: Optional[int] = thumbnail_height diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultaudio.py b/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultaudio.py deleted file mode 100644 index 9fcffd0..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultaudio.py +++ /dev/null @@ -1,144 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the classes that represent Telegram InlineQueryResultAudio.""" -import datetime as dtm -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional, Union - -from telegram._inline.inlinekeyboardmarkup import InlineKeyboardMarkup -from telegram._inline.inlinequeryresult import InlineQueryResult -from telegram._messageentity import MessageEntity -from telegram._utils.argumentparsing import parse_sequence_arg, to_timedelta -from telegram._utils.datetime import get_timedelta_value -from telegram._utils.defaultvalue import DEFAULT_NONE -from telegram._utils.types import JSONDict, ODVInput, TimePeriod -from telegram.constants import InlineQueryResultType - -if TYPE_CHECKING: - from telegram import InputMessageContent - - -class InlineQueryResultAudio(InlineQueryResult): - """ - Represents a link to an mp3 audio file. By default, this audio file will be sent by the user. - Alternatively, you can use :attr:`input_message_content` to send a message with the specified - content instead of the audio. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - Args: - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - audio_url (:obj:`str`): A valid URL for the audio file. - title (:obj:`str`): Title. - performer (:obj:`str`, optional): Performer. - audio_duration (:obj:`int` | :class:`datetime.timedelta`, optional): Audio duration - in seconds. - - .. versionchanged:: v22.2 - |time-period-input| - caption (:obj:`str`, optional): Caption, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters after entities - parsing. - parse_mode (:obj:`str`, optional): |parse_mode| - caption_entities (Sequence[:class:`telegram.MessageEntity`], optional): |caption_entities| - - .. versionchanged:: 20.0 - |sequenceclassargs| - reply_markup (:class:`telegram.InlineKeyboardMarkup`, optional): Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`, optional): Content of the - message to be sent instead of the audio. - - Attributes: - type (:obj:`str`): :tg-const:`telegram.constants.InlineQueryResultType.AUDIO`. - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - audio_url (:obj:`str`): A valid URL for the audio file. - title (:obj:`str`): Title. - performer (:obj:`str`): Optional. Performer. - audio_duration (:obj:`int` | :class:`datetime.timedelta`): Optional. Audio duration - in seconds. - - .. deprecated:: v22.2 - |time-period-int-deprecated| - caption (:obj:`str`): Optional. Caption, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters after entities - parsing. - parse_mode (:obj:`str`): Optional. |parse_mode| - caption_entities (tuple[:class:`telegram.MessageEntity`]): Optional. |captionentitiesattr| - - .. versionchanged:: 20.0 - - * |tupleclassattrs| - * |alwaystuple| - reply_markup (:class:`telegram.InlineKeyboardMarkup`): Optional. Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`): Optional. Content of the - message to be sent instead of the audio. - - """ - - __slots__ = ( - "_audio_duration", - "audio_url", - "caption", - "caption_entities", - "input_message_content", - "parse_mode", - "performer", - "reply_markup", - "title", - ) - - def __init__( - self, - id: str, # pylint: disable=redefined-builtin - audio_url: str, - title: str, - performer: Optional[str] = None, - audio_duration: Optional[TimePeriod] = None, - caption: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional["InputMessageContent"] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence[MessageEntity]] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - # Required - super().__init__(InlineQueryResultType.AUDIO, id, api_kwargs=api_kwargs) - with self._unfrozen(): - self.audio_url: str = audio_url - self.title: str = title - - # Optionals - self.performer: Optional[str] = performer - self._audio_duration: Optional[dtm.timedelta] = to_timedelta(audio_duration) - self.caption: Optional[str] = caption - self.parse_mode: ODVInput[str] = parse_mode - self.caption_entities: tuple[MessageEntity, ...] = parse_sequence_arg(caption_entities) - self.reply_markup: Optional[InlineKeyboardMarkup] = reply_markup - self.input_message_content: Optional[InputMessageContent] = input_message_content - - @property - def audio_duration(self) -> Optional[Union[int, dtm.timedelta]]: - return get_timedelta_value(self._audio_duration, attribute="audio_duration") diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcachedaudio.py b/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcachedaudio.py deleted file mode 100644 index f1f75a1..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcachedaudio.py +++ /dev/null @@ -1,116 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the classes that represent Telegram InlineQueryResultCachedAudio.""" -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional - -from telegram._inline.inlinekeyboardmarkup import InlineKeyboardMarkup -from telegram._inline.inlinequeryresult import InlineQueryResult -from telegram._messageentity import MessageEntity -from telegram._utils.argumentparsing import parse_sequence_arg -from telegram._utils.defaultvalue import DEFAULT_NONE -from telegram._utils.types import JSONDict, ODVInput -from telegram.constants import InlineQueryResultType - -if TYPE_CHECKING: - from telegram import InputMessageContent - - -class InlineQueryResultCachedAudio(InlineQueryResult): - """ - Represents a link to an mp3 audio file stored on the Telegram servers. By default, this audio - file will be sent by the user. Alternatively, you can use :attr:`input_message_content` to - send a message with the specified content instead of the audio. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - Args: - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - audio_file_id (:obj:`str`): A valid file identifier for the audio file. - caption (:obj:`str`, optional): Caption, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters after entities - parsing. - parse_mode (:obj:`str`, optional): |parse_mode| - caption_entities (Sequence[:class:`telegram.MessageEntity`], optional): |caption_entities| - - .. versionchanged:: 20.0 - |sequenceclassargs| - - reply_markup (:class:`telegram.InlineKeyboardMarkup`, optional): Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`, optional): Content of the - message to be sent instead of the audio. - - Attributes: - type (:obj:`str`): :tg-const:`telegram.constants.InlineQueryResultType.AUDIO`. - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - audio_file_id (:obj:`str`): A valid file identifier for the audio file. - caption (:obj:`str`): Optional. Caption, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters after entities - parsing. - parse_mode (:obj:`str`): Optional. |parse_mode| - caption_entities (tuple[:class:`telegram.MessageEntity`]): Optional. |captionentitiesattr| - - .. versionchanged:: 20.0 - - * |tupleclassattrs| - * |alwaystuple| - reply_markup (:class:`telegram.InlineKeyboardMarkup`): Optional. Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`): Optional. Content of the - message to be sent instead of the audio. - - """ - - __slots__ = ( - "audio_file_id", - "caption", - "caption_entities", - "input_message_content", - "parse_mode", - "reply_markup", - ) - - def __init__( - self, - id: str, # pylint: disable=redefined-builtin - audio_file_id: str, - caption: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional["InputMessageContent"] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence[MessageEntity]] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - # Required - super().__init__(InlineQueryResultType.AUDIO, id, api_kwargs=api_kwargs) - with self._unfrozen(): - self.audio_file_id: str = audio_file_id - - # Optionals - self.caption: Optional[str] = caption - self.parse_mode: ODVInput[str] = parse_mode - self.caption_entities: tuple[MessageEntity, ...] = parse_sequence_arg(caption_entities) - self.reply_markup: Optional[InlineKeyboardMarkup] = reply_markup - self.input_message_content: Optional[InputMessageContent] = input_message_content diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcacheddocument.py b/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcacheddocument.py deleted file mode 100644 index af2e6ef..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcacheddocument.py +++ /dev/null @@ -1,126 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the classes that represent Telegram InlineQueryResultCachedDocument.""" -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional - -from telegram._inline.inlinekeyboardmarkup import InlineKeyboardMarkup -from telegram._inline.inlinequeryresult import InlineQueryResult -from telegram._messageentity import MessageEntity -from telegram._utils.argumentparsing import parse_sequence_arg -from telegram._utils.defaultvalue import DEFAULT_NONE -from telegram._utils.types import JSONDict, ODVInput -from telegram.constants import InlineQueryResultType - -if TYPE_CHECKING: - from telegram import InputMessageContent - - -class InlineQueryResultCachedDocument(InlineQueryResult): - """ - Represents a link to a file stored on the Telegram servers. By default, this file will be sent - by the user with an optional caption. Alternatively, you can use :attr:`input_message_content` - to send a message with the specified content instead of the file. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - Args: - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - title (:obj:`str`): Title for the result. - document_file_id (:obj:`str`): A valid file identifier for the file. - description (:obj:`str`, optional): Short description of the result. - caption (:obj:`str`, optional): Caption of the document to be sent, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters - after entities parsing. - parse_mode (:obj:`str`, optional): |parse_mode| - caption_entities (Sequence[:class:`telegram.MessageEntity`], optional): |caption_entities| - - .. versionchanged:: 20.0 - |sequenceclassargs| - - reply_markup (:class:`telegram.InlineKeyboardMarkup`, optional): Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`, optional): Content of the - message to be sent instead of the file. - - Attributes: - type (:obj:`str`): :tg-const:`telegram.constants.InlineQueryResultType.DOCUMENT`. - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - title (:obj:`str`): Title for the result. - document_file_id (:obj:`str`): A valid file identifier for the file. - description (:obj:`str`): Optional. Short description of the result. - caption (:obj:`str`): Optional. Caption of the document to be sent, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters - after entities parsing. - parse_mode (:obj:`str`): Optional. |parse_mode| - caption_entities (tuple[:class:`telegram.MessageEntity`]): Optional. |captionentitiesattr| - - .. versionchanged:: 20.0 - - * |tupleclassattrs| - * |alwaystuple| - reply_markup (:class:`telegram.InlineKeyboardMarkup`): Optional. Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`): Optional. Content of the - message to be sent instead of the file. - - """ - - __slots__ = ( - "caption", - "caption_entities", - "description", - "document_file_id", - "input_message_content", - "parse_mode", - "reply_markup", - "title", - ) - - def __init__( - self, - id: str, # pylint: disable=redefined-builtin - title: str, - document_file_id: str, - description: Optional[str] = None, - caption: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional["InputMessageContent"] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence[MessageEntity]] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - # Required - super().__init__(InlineQueryResultType.DOCUMENT, id, api_kwargs=api_kwargs) - with self._unfrozen(): - self.title: str = title - self.document_file_id: str = document_file_id - - # Optionals - self.description: Optional[str] = description - self.caption: Optional[str] = caption - self.parse_mode: ODVInput[str] = parse_mode - self.caption_entities: tuple[MessageEntity, ...] = parse_sequence_arg(caption_entities) - self.reply_markup: Optional[InlineKeyboardMarkup] = reply_markup - self.input_message_content: Optional[InputMessageContent] = input_message_content diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcachedgif.py b/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcachedgif.py deleted file mode 100644 index f682ec0..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcachedgif.py +++ /dev/null @@ -1,131 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the classes that represent Telegram InlineQueryResultCachedGif.""" -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional - -from telegram._inline.inlinekeyboardmarkup import InlineKeyboardMarkup -from telegram._inline.inlinequeryresult import InlineQueryResult -from telegram._messageentity import MessageEntity -from telegram._utils.argumentparsing import parse_sequence_arg -from telegram._utils.defaultvalue import DEFAULT_NONE -from telegram._utils.types import JSONDict, ODVInput -from telegram.constants import InlineQueryResultType - -if TYPE_CHECKING: - from telegram import InputMessageContent - - -class InlineQueryResultCachedGif(InlineQueryResult): - """ - Represents a link to an animated GIF file stored on the Telegram servers. By default, this - animated GIF file will be sent by the user with an optional caption. Alternatively, you can - use :attr:`input_message_content` to send a message with specified content instead of - the animation. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - Args: - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - gif_file_id (:obj:`str`): A valid file identifier for the GIF file. - title (:obj:`str`, optional): Title for the result. - caption (:obj:`str`, optional): Caption of the GIF file to be sent, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters - after entities parsing. - parse_mode (:obj:`str`, optional): |parse_mode| - caption_entities (Sequence[:class:`telegram.MessageEntity`], optional): |caption_entities| - - .. versionchanged:: 20.0 - |sequenceclassargs| - - reply_markup (:class:`telegram.InlineKeyboardMarkup`, optional): Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`, optional): Content of the - message to be sent instead of the gif. - show_caption_above_media (:obj:`bool`, optional): Pass |show_cap_above_med| - - .. versionadded:: 21.3 - - Attributes: - type (:obj:`str`): :tg-const:`telegram.constants.InlineQueryResultType.GIF`. - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - gif_file_id (:obj:`str`): A valid file identifier for the GIF file. - title (:obj:`str`): Optional. Title for the result. - caption (:obj:`str`): Optional. Caption of the GIF file to be sent, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters - after entities parsing. - parse_mode (:obj:`str`): Optional. |parse_mode| - caption_entities (tuple[:class:`telegram.MessageEntity`]): Optional. |captionentitiesattr| - - .. versionchanged:: 20.0 - - * |tupleclassattrs| - * |alwaystuple| - reply_markup (:class:`telegram.InlineKeyboardMarkup`): Optional. Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`): Optional. Content of the - message to be sent instead of the gif. - show_caption_above_media (:obj:`bool`): Optional. |show_cap_above_med| - - .. versionadded:: 21.3 - - """ - - __slots__ = ( - "caption", - "caption_entities", - "gif_file_id", - "input_message_content", - "parse_mode", - "reply_markup", - "show_caption_above_media", - "title", - ) - - def __init__( - self, - id: str, # pylint: disable=redefined-builtin - gif_file_id: str, - title: Optional[str] = None, - caption: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional["InputMessageContent"] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence[MessageEntity]] = None, - show_caption_above_media: Optional[bool] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - # Required - super().__init__(InlineQueryResultType.GIF, id, api_kwargs=api_kwargs) - with self._unfrozen(): - self.gif_file_id: str = gif_file_id - - # Optionals - self.title: Optional[str] = title - self.caption: Optional[str] = caption - self.parse_mode: ODVInput[str] = parse_mode - self.caption_entities: tuple[MessageEntity, ...] = parse_sequence_arg(caption_entities) - self.reply_markup: Optional[InlineKeyboardMarkup] = reply_markup - self.input_message_content: Optional[InputMessageContent] = input_message_content - self.show_caption_above_media: Optional[bool] = show_caption_above_media diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcachedmpeg4gif.py b/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcachedmpeg4gif.py deleted file mode 100644 index 6dc7e55..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcachedmpeg4gif.py +++ /dev/null @@ -1,131 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the classes that represent Telegram InlineQueryResultMpeg4Gif.""" -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional - -from telegram._inline.inlinekeyboardmarkup import InlineKeyboardMarkup -from telegram._inline.inlinequeryresult import InlineQueryResult -from telegram._messageentity import MessageEntity -from telegram._utils.argumentparsing import parse_sequence_arg -from telegram._utils.defaultvalue import DEFAULT_NONE -from telegram._utils.types import JSONDict, ODVInput -from telegram.constants import InlineQueryResultType - -if TYPE_CHECKING: - from telegram import InputMessageContent - - -class InlineQueryResultCachedMpeg4Gif(InlineQueryResult): - """ - Represents a link to a video animation (H.264/MPEG-4 AVC video without sound) stored on the - Telegram servers. By default, this animated MPEG-4 file will be sent by the user with an - optional caption. Alternatively, you can use :attr:`input_message_content` to send a message - with the specified content instead of the animation. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - Args: - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - mpeg4_file_id (:obj:`str`): A valid file identifier for the MP4 file. - title (:obj:`str`, optional): Title for the result. - caption (:obj:`str`, optional): Caption of the MPEG-4 file to be sent, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters - after entities parsing. - parse_mode (:obj:`str`, optional): |parse_mode| - caption_entities (Sequence[:class:`telegram.MessageEntity`], optional): |caption_entities| - - .. versionchanged:: 20.0 - |sequenceclassargs| - - reply_markup (:class:`telegram.InlineKeyboardMarkup`, optional): Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`, optional): Content of the - message to be sent instead of the MPEG-4 file. - show_caption_above_media (:obj:`bool`, optional): Pass |show_cap_above_med| - - .. versionadded:: 21.3 - - Attributes: - type (:obj:`str`): :tg-const:`telegram.constants.InlineQueryResultType.MPEG4GIF`. - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - mpeg4_file_id (:obj:`str`): A valid file identifier for the MP4 file. - title (:obj:`str`): Optional. Title for the result. - caption (:obj:`str`): Optional. Caption of the MPEG-4 file to be sent, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters - after entities parsing. - parse_mode (:obj:`str`): Optional. |parse_mode| - caption_entities (tuple[:class:`telegram.MessageEntity`]): Optional. |captionentitiesattr| - - .. versionchanged:: 20.0 - - * |tupleclassattrs| - * |alwaystuple| - reply_markup (:class:`telegram.InlineKeyboardMarkup`): Optional. Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`): Optional. Content of the - message to be sent instead of the MPEG-4 file. - show_caption_above_media (:obj:`bool`): Optional. |show_cap_above_med| - - .. versionadded:: 21.3 - - """ - - __slots__ = ( - "caption", - "caption_entities", - "input_message_content", - "mpeg4_file_id", - "parse_mode", - "reply_markup", - "show_caption_above_media", - "title", - ) - - def __init__( - self, - id: str, # pylint: disable=redefined-builtin - mpeg4_file_id: str, - title: Optional[str] = None, - caption: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional["InputMessageContent"] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence[MessageEntity]] = None, - show_caption_above_media: Optional[bool] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - # Required - super().__init__(InlineQueryResultType.MPEG4GIF, id, api_kwargs=api_kwargs) - with self._unfrozen(): - self.mpeg4_file_id: str = mpeg4_file_id - - # Optionals - self.title: Optional[str] = title - self.caption: Optional[str] = caption - self.parse_mode: ODVInput[str] = parse_mode - self.caption_entities: tuple[MessageEntity, ...] = parse_sequence_arg(caption_entities) - self.reply_markup: Optional[InlineKeyboardMarkup] = reply_markup - self.input_message_content: Optional[InputMessageContent] = input_message_content - self.show_caption_above_media: Optional[bool] = show_caption_above_media diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcachedphoto.py b/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcachedphoto.py deleted file mode 100644 index adf8ea6..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcachedphoto.py +++ /dev/null @@ -1,136 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the classes that represent Telegram InlineQueryResultPhoto""" -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional - -from telegram._inline.inlinekeyboardmarkup import InlineKeyboardMarkup -from telegram._inline.inlinequeryresult import InlineQueryResult -from telegram._messageentity import MessageEntity -from telegram._utils.argumentparsing import parse_sequence_arg -from telegram._utils.defaultvalue import DEFAULT_NONE -from telegram._utils.types import JSONDict, ODVInput -from telegram.constants import InlineQueryResultType - -if TYPE_CHECKING: - from telegram import InputMessageContent - - -class InlineQueryResultCachedPhoto(InlineQueryResult): - """ - Represents a link to a photo stored on the Telegram servers. By default, this photo will be - sent by the user with an optional caption. Alternatively, you can use - :attr:`input_message_content` to send a message with the specified content instead - of the photo. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - Args: - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - photo_file_id (:obj:`str`): A valid file identifier of the photo. - title (:obj:`str`, optional): Title for the result. - description (:obj:`str`, optional): Short description of the result. - caption (:obj:`str`, optional): Caption of the photo to be sent, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters after - entities parsing. - parse_mode (:obj:`str`, optional): |parse_mode| - caption_entities (Sequence[:class:`telegram.MessageEntity`], optional): |caption_entities| - - .. versionchanged:: 20.0 - |sequenceclassargs| - - reply_markup (:class:`telegram.InlineKeyboardMarkup`, optional): Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`, optional): Content of the - message to be sent instead of the photo. - show_caption_above_media (:obj:`bool`, optional): Pass |show_cap_above_med| - - .. versionadded:: 21.3 - - Attributes: - type (:obj:`str`): :tg-const:`telegram.constants.InlineQueryResultType.PHOTO`. - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - photo_file_id (:obj:`str`): A valid file identifier of the photo. - title (:obj:`str`): Optional. Title for the result. - description (:obj:`str`): Optional. Short description of the result. - caption (:obj:`str`): Optional. Caption of the photo to be sent, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters after - entities parsing. - parse_mode (:obj:`str`): Optional. |parse_mode| - caption_entities (tuple[:class:`telegram.MessageEntity`]): Optional. |captionentitiesattr| - - .. versionchanged:: 20.0 - - * |tupleclassattrs| - * |alwaystuple| - reply_markup (:class:`telegram.InlineKeyboardMarkup`): Optional. Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`): Optional. Content of the - message to be sent instead of the photo. - show_caption_above_media (:obj:`bool`): Optional. |show_cap_above_med| - - .. versionadded:: 21.3 - - """ - - __slots__ = ( - "caption", - "caption_entities", - "description", - "input_message_content", - "parse_mode", - "photo_file_id", - "reply_markup", - "show_caption_above_media", - "title", - ) - - def __init__( - self, - id: str, # pylint: disable=redefined-builtin - photo_file_id: str, - title: Optional[str] = None, - description: Optional[str] = None, - caption: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional["InputMessageContent"] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence[MessageEntity]] = None, - show_caption_above_media: Optional[bool] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - # Required - super().__init__(InlineQueryResultType.PHOTO, id, api_kwargs=api_kwargs) - with self._unfrozen(): - self.photo_file_id: str = photo_file_id - - # Optionals - self.title: Optional[str] = title - self.description: Optional[str] = description - self.caption: Optional[str] = caption - self.parse_mode: ODVInput[str] = parse_mode - self.caption_entities: tuple[MessageEntity, ...] = parse_sequence_arg(caption_entities) - self.reply_markup: Optional[InlineKeyboardMarkup] = reply_markup - self.input_message_content: Optional[InputMessageContent] = input_message_content - self.show_caption_above_media: Optional[bool] = show_caption_above_media diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcachedsticker.py b/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcachedsticker.py deleted file mode 100644 index 0dd8c55..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcachedsticker.py +++ /dev/null @@ -1,81 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the classes that represent Telegram InlineQueryResultCachedSticker.""" - -from typing import TYPE_CHECKING, Optional - -from telegram._inline.inlinekeyboardmarkup import InlineKeyboardMarkup -from telegram._inline.inlinequeryresult import InlineQueryResult -from telegram._utils.types import JSONDict -from telegram.constants import InlineQueryResultType - -if TYPE_CHECKING: - from telegram import InputMessageContent - - -class InlineQueryResultCachedSticker(InlineQueryResult): - """ - Represents a link to a sticker stored on the Telegram servers. By default, this sticker will - be sent by the user. Alternatively, you can use :attr:`input_message_content` to send a - message with the specified content instead of the sticker. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - Args: - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - sticker_file_id (:obj:`str`): A valid file identifier of the sticker. - reply_markup (:class:`telegram.InlineKeyboardMarkup`, optional): Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`, optional): Content of the - message to be sent instead of the sticker. - - Attributes: - type (:obj:`str`): :tg-const:`telegram.constants.InlineQueryResultType.STICKER`. - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - sticker_file_id (:obj:`str`): A valid file identifier of the sticker. - reply_markup (:class:`telegram.InlineKeyboardMarkup`): Optional. Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`): Optional. Content of the - message to be sent instead of the sticker. - - """ - - __slots__ = ("input_message_content", "reply_markup", "sticker_file_id") - - def __init__( - self, - id: str, # pylint: disable=redefined-builtin - sticker_file_id: str, - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional["InputMessageContent"] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - # Required - super().__init__(InlineQueryResultType.STICKER, id, api_kwargs=api_kwargs) - with self._unfrozen(): - self.sticker_file_id: str = sticker_file_id - - # Optionals - self.reply_markup: Optional[InlineKeyboardMarkup] = reply_markup - self.input_message_content: Optional[InputMessageContent] = input_message_content diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcachedvideo.py b/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcachedvideo.py deleted file mode 100644 index 3595330..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcachedvideo.py +++ /dev/null @@ -1,132 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the classes that represent Telegram InlineQueryResultCachedVideo.""" -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional - -from telegram._inline.inlinekeyboardmarkup import InlineKeyboardMarkup -from telegram._inline.inlinequeryresult import InlineQueryResult -from telegram._messageentity import MessageEntity -from telegram._utils.argumentparsing import parse_sequence_arg -from telegram._utils.defaultvalue import DEFAULT_NONE -from telegram._utils.types import JSONDict, ODVInput -from telegram.constants import InlineQueryResultType - -if TYPE_CHECKING: - from telegram import InputMessageContent - - -class InlineQueryResultCachedVideo(InlineQueryResult): - """ - Represents a link to a video file stored on the Telegram servers. By default, this video file - will be sent by the user with an optional caption. Alternatively, you can use - :attr:`input_message_content` to send a message with the specified content instead - of the video. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - Args: - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - video_file_id (:obj:`str`): A valid file identifier for the video file. - title (:obj:`str`): Title for the result. - description (:obj:`str`, optional): Short description of the result. - caption (:obj:`str`, optional): Caption of the video to be sent, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters after - entities parsing. - parse_mode (:obj:`str`, optional): |parse_mode| - caption_entities (Sequence[:class:`telegram.MessageEntity`], optional): |caption_entities| - reply_markup (:class:`telegram.InlineKeyboardMarkup`, optional): Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`, optional): Content of the - message to be sent instead of the video. - show_caption_above_media (:obj:`bool`, optional): Pass |show_cap_above_med| - - .. versionadded:: 21.3 - - Attributes: - type (:obj:`str`): :tg-const:`telegram.constants.InlineQueryResultType.VIDEO`. - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - video_file_id (:obj:`str`): A valid file identifier for the video file. - title (:obj:`str`): Title for the result. - description (:obj:`str`): Optional. Short description of the result. - caption (:obj:`str`): Optional. Caption of the video to be sent, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters after - entities parsing. - parse_mode (:obj:`str`): Optional. |parse_mode| - caption_entities (tuple[:class:`telegram.MessageEntity`]): Optional. |captionentitiesattr| - - .. versionchanged:: 20.0 - - * |tupleclassattrs| - * |alwaystuple| - reply_markup (:class:`telegram.InlineKeyboardMarkup`): Optional. Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`): Optional. Content of the - message to be sent instead of the video. - show_caption_above_media (:obj:`bool`): Optional. |show_cap_above_med| - - .. versionadded:: 21.3 - - """ - - __slots__ = ( - "caption", - "caption_entities", - "description", - "input_message_content", - "parse_mode", - "reply_markup", - "show_caption_above_media", - "title", - "video_file_id", - ) - - def __init__( - self, - id: str, # pylint: disable=redefined-builtin - video_file_id: str, - title: str, - description: Optional[str] = None, - caption: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional["InputMessageContent"] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence[MessageEntity]] = None, - show_caption_above_media: Optional[bool] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - # Required - super().__init__(InlineQueryResultType.VIDEO, id, api_kwargs=api_kwargs) - with self._unfrozen(): - self.video_file_id: str = video_file_id - self.title: str = title - - # Optionals - self.description: Optional[str] = description - self.caption: Optional[str] = caption - self.parse_mode: ODVInput[str] = parse_mode - self.caption_entities: tuple[MessageEntity, ...] = parse_sequence_arg(caption_entities) - self.reply_markup: Optional[InlineKeyboardMarkup] = reply_markup - self.input_message_content: Optional[InputMessageContent] = input_message_content - self.show_caption_above_media: Optional[bool] = show_caption_above_media diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcachedvoice.py b/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcachedvoice.py deleted file mode 100644 index 139fdab..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcachedvoice.py +++ /dev/null @@ -1,121 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the classes that represent Telegram InlineQueryResultCachedVoice.""" -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional - -from telegram._inline.inlinekeyboardmarkup import InlineKeyboardMarkup -from telegram._inline.inlinequeryresult import InlineQueryResult -from telegram._messageentity import MessageEntity -from telegram._utils.argumentparsing import parse_sequence_arg -from telegram._utils.defaultvalue import DEFAULT_NONE -from telegram._utils.types import JSONDict, ODVInput -from telegram.constants import InlineQueryResultType - -if TYPE_CHECKING: - from telegram import InputMessageContent - - -class InlineQueryResultCachedVoice(InlineQueryResult): - """ - Represents a link to a voice message stored on the Telegram servers. By default, this voice - message will be sent by the user. Alternatively, you can use :attr:`input_message_content` to - send a message with the specified content instead of the voice message. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - Args: - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - voice_file_id (:obj:`str`): A valid file identifier for the voice message. - title (:obj:`str`): Voice message title. - caption (:obj:`str`, optional): Caption, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters after entities - parsing. - parse_mode (:obj:`str`, optional): |parse_mode| - caption_entities (Sequence[:class:`telegram.MessageEntity`], optional): - |captionentitiesattr| - - .. versionchanged:: 20.0 - |sequenceclassargs| - reply_markup (:class:`telegram.InlineKeyboardMarkup`, optional): Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`, optional): Content of the - message to be sent instead of the voice message. - - Attributes: - type (:obj:`str`): :tg-const:`telegram.constants.InlineQueryResultType.VOICE`. - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - voice_file_id (:obj:`str`): A valid file identifier for the voice message. - title (:obj:`str`): Voice message title. - caption (:obj:`str`): Optional. Caption, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters after entities - parsing. - parse_mode (:obj:`str`): Optional. |parse_mode| - caption_entities (tuple[:class:`telegram.MessageEntity`]): Optional. |caption_entities| - - .. versionchanged:: 20.0 - - * |tupleclassattrs| - * |alwaystuple| - reply_markup (:class:`telegram.InlineKeyboardMarkup`): Optional. Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`): Optional. Content of the - message to be sent instead of the voice message. - - """ - - __slots__ = ( - "caption", - "caption_entities", - "input_message_content", - "parse_mode", - "reply_markup", - "title", - "voice_file_id", - ) - - def __init__( - self, - id: str, # pylint: disable=redefined-builtin - voice_file_id: str, - title: str, - caption: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional["InputMessageContent"] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence[MessageEntity]] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - # Required - super().__init__(InlineQueryResultType.VOICE, id, api_kwargs=api_kwargs) - with self._unfrozen(): - self.voice_file_id: str = voice_file_id - self.title: str = title - - # Optionals - self.caption: Optional[str] = caption - self.parse_mode: ODVInput[str] = parse_mode - self.caption_entities: tuple[MessageEntity, ...] = parse_sequence_arg(caption_entities) - self.reply_markup: Optional[InlineKeyboardMarkup] = reply_markup - self.input_message_content: Optional[InputMessageContent] = input_message_content diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcontact.py b/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcontact.py deleted file mode 100644 index 7ededbb..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultcontact.py +++ /dev/null @@ -1,130 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the classes that represent Telegram InlineQueryResultContact.""" - -from typing import TYPE_CHECKING, Optional - -from telegram._inline.inlinekeyboardmarkup import InlineKeyboardMarkup -from telegram._inline.inlinequeryresult import InlineQueryResult -from telegram._utils.types import JSONDict -from telegram.constants import InlineQueryResultType - -if TYPE_CHECKING: - from telegram import InputMessageContent - - -class InlineQueryResultContact(InlineQueryResult): - """ - Represents a contact with a phone number. By default, this contact will be sent by the user. - Alternatively, you can use :attr:`input_message_content` to send a message with the specified - content instead of the contact. - - .. versionchanged:: 20.5 - |removed_thumb_wildcard_note| - - Args: - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - phone_number (:obj:`str`): Contact's phone number. - first_name (:obj:`str`): Contact's first name. - last_name (:obj:`str`, optional): Contact's last name. - vcard (:obj:`str`, optional): Additional data about the contact in the form of a vCard, - 0-:tg-const:`telegram.constants.ContactLimit.VCARD` bytes. - reply_markup (:class:`telegram.InlineKeyboardMarkup`, optional): Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`, optional): Content of the - message to be sent instead of the contact. - thumbnail_url (:obj:`str`, optional): Url of the thumbnail for the result. - - .. versionadded:: 20.2 - thumbnail_width (:obj:`int`, optional): Thumbnail width. - - .. versionadded:: 20.2 - thumbnail_height (:obj:`int`, optional): Thumbnail height. - - .. versionadded:: 20.2 - - Attributes: - type (:obj:`str`): :tg-const:`telegram.constants.InlineQueryResultType.CONTACT`. - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - phone_number (:obj:`str`): Contact's phone number. - first_name (:obj:`str`): Contact's first name. - last_name (:obj:`str`): Optional. Contact's last name. - vcard (:obj:`str`): Optional. Additional data about the contact in the form of a vCard, - 0-:tg-const:`telegram.constants.ContactLimit.VCARD` bytes. - reply_markup (:class:`telegram.InlineKeyboardMarkup`): Optional. Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`): Optional. Content of the - message to be sent instead of the contact. - thumbnail_url (:obj:`str`): Optional. Url of the thumbnail for the result. - - .. versionadded:: 20.2 - thumbnail_width (:obj:`int`): Optional. Thumbnail width. - - .. versionadded:: 20.2 - thumbnail_height (:obj:`int`): Optional. Thumbnail height. - - .. versionadded:: 20.2 - - """ - - __slots__ = ( - "first_name", - "input_message_content", - "last_name", - "phone_number", - "reply_markup", - "thumbnail_height", - "thumbnail_url", - "thumbnail_width", - "vcard", - ) - - def __init__( - self, - id: str, # pylint: disable=redefined-builtin - phone_number: str, - first_name: str, - last_name: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional["InputMessageContent"] = None, - vcard: Optional[str] = None, - thumbnail_url: Optional[str] = None, - thumbnail_width: Optional[int] = None, - thumbnail_height: Optional[int] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - # Required - super().__init__(InlineQueryResultType.CONTACT, id, api_kwargs=api_kwargs) - with self._unfrozen(): - self.phone_number: str = phone_number - self.first_name: str = first_name - - # Optionals - self.last_name: Optional[str] = last_name - self.vcard: Optional[str] = vcard - self.reply_markup: Optional[InlineKeyboardMarkup] = reply_markup - self.input_message_content: Optional[InputMessageContent] = input_message_content - self.thumbnail_url: Optional[str] = thumbnail_url - self.thumbnail_width: Optional[int] = thumbnail_width - self.thumbnail_height: Optional[int] = thumbnail_height diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultdocument.py b/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultdocument.py deleted file mode 100644 index e7114ef..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultdocument.py +++ /dev/null @@ -1,165 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the classes that represent Telegram InlineQueryResultDocument""" -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional - -from telegram._inline.inlinekeyboardmarkup import InlineKeyboardMarkup -from telegram._inline.inlinequeryresult import InlineQueryResult -from telegram._messageentity import MessageEntity -from telegram._utils.argumentparsing import parse_sequence_arg -from telegram._utils.defaultvalue import DEFAULT_NONE -from telegram._utils.types import JSONDict, ODVInput -from telegram.constants import InlineQueryResultType - -if TYPE_CHECKING: - from telegram import InputMessageContent - - -class InlineQueryResultDocument(InlineQueryResult): - """ - Represents a link to a file. By default, this file will be sent by the user with an optional - caption. Alternatively, you can use :attr:`input_message_content` to send a message with the - specified content instead of the file. Currently, only .PDF and .ZIP files can be sent - using this method. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - .. versionchanged:: 20.5 - |removed_thumb_wildcard_note| - - Args: - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - title (:obj:`str`): Title for the result. - caption (:obj:`str`, optional): Caption of the document to be sent, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters - after entities parsing. - parse_mode (:obj:`str`, optional): |parse_mode| - caption_entities (Sequence[:class:`telegram.MessageEntity`], optional): |caption_entities| - - .. versionchanged:: 20.0 - |sequenceclassargs| - - document_url (:obj:`str`): A valid URL for the file. - mime_type (:obj:`str`): Mime type of the content of the file, either "application/pdf" - or "application/zip". - description (:obj:`str`, optional): Short description of the result. - reply_markup (:class:`telegram.InlineKeyboardMarkup`, optional): Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`, optional): Content of the - message to be sent instead of the file. - thumbnail_url (:obj:`str`, optional): URL of the thumbnail (JPEG only) for the file. - - .. versionadded:: 20.2 - thumbnail_width (:obj:`int`, optional): Thumbnail width. - - .. versionadded:: 20.2 - thumbnail_height (:obj:`int`, optional): Thumbnail height. - - .. versionadded:: 20.2 - - - Attributes: - type (:obj:`str`): :tg-const:`telegram.constants.InlineQueryResultType.DOCUMENT`. - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - title (:obj:`str`): Title for the result. - caption (:obj:`str`): Optional. Caption of the document to be sent, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters - after entities parsing. - parse_mode (:obj:`str`): Optional. |parse_mode| - caption_entities (tuple[:class:`telegram.MessageEntity`]): Optional. |captionentitiesattr| - - .. versionchanged:: 20.0 - - * |tupleclassattrs| - * |alwaystuple| - document_url (:obj:`str`): A valid URL for the file. - mime_type (:obj:`str`): Mime type of the content of the file, either "application/pdf" - or "application/zip". - description (:obj:`str`): Optional. Short description of the result. - reply_markup (:class:`telegram.InlineKeyboardMarkup`): Optional. Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`): Optional. Content of the - message to be sent instead of the file. - thumbnail_url (:obj:`str`): Optional. URL of the thumbnail (JPEG only) for the file. - - .. versionadded:: 20.2 - thumbnail_width (:obj:`int`): Optional. Thumbnail width. - - .. versionadded:: 20.2 - thumbnail_height (:obj:`int`): Optional. Thumbnail height. - - .. versionadded:: 20.2 - - """ - - __slots__ = ( - "caption", - "caption_entities", - "description", - "document_url", - "input_message_content", - "mime_type", - "parse_mode", - "reply_markup", - "thumbnail_height", - "thumbnail_url", - "thumbnail_width", - "title", - ) - - def __init__( - self, - id: str, # pylint: disable=redefined-builtin - document_url: str, - title: str, - mime_type: str, - caption: Optional[str] = None, - description: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional["InputMessageContent"] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence[MessageEntity]] = None, - thumbnail_url: Optional[str] = None, - thumbnail_width: Optional[int] = None, - thumbnail_height: Optional[int] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - # Required - super().__init__(InlineQueryResultType.DOCUMENT, id, api_kwargs=api_kwargs) - with self._unfrozen(): - self.document_url: str = document_url - self.title: str = title - self.mime_type: str = mime_type - - # Optionals - self.caption: Optional[str] = caption - self.parse_mode: ODVInput[str] = parse_mode - self.caption_entities: tuple[MessageEntity, ...] = parse_sequence_arg(caption_entities) - self.description: Optional[str] = description - self.reply_markup: Optional[InlineKeyboardMarkup] = reply_markup - self.input_message_content: Optional[InputMessageContent] = input_message_content - self.thumbnail_url: Optional[str] = thumbnail_url - self.thumbnail_width: Optional[int] = thumbnail_width - self.thumbnail_height: Optional[int] = thumbnail_height diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultgame.py b/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultgame.py deleted file mode 100644 index 27b12c8..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultgame.py +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the classes that represent Telegram InlineQueryResultGame.""" -from typing import Optional - -from telegram._inline.inlinekeyboardmarkup import InlineKeyboardMarkup -from telegram._inline.inlinequeryresult import InlineQueryResult -from telegram._utils.types import JSONDict -from telegram.constants import InlineQueryResultType - - -class InlineQueryResultGame(InlineQueryResult): - """Represents a :class:`telegram.Game`. - - Args: - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - game_short_name (:obj:`str`): Short name of the game. - reply_markup (:class:`telegram.InlineKeyboardMarkup`, optional): Inline keyboard attached - to the message. - - Attributes: - type (:obj:`str`): :tg-const:`telegram.constants.InlineQueryResultType.GAME`. - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - game_short_name (:obj:`str`): Short name of the game. - reply_markup (:class:`telegram.InlineKeyboardMarkup`): Optional. Inline keyboard attached - to the message. - - """ - - __slots__ = ("game_short_name", "reply_markup") - - def __init__( - self, - id: str, # pylint: disable=redefined-builtin - game_short_name: str, - reply_markup: Optional[InlineKeyboardMarkup] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - # Required - super().__init__(InlineQueryResultType.GAME, id, api_kwargs=api_kwargs) - with self._unfrozen(): - self.id: str = id - self.game_short_name: str = game_short_name - - self.reply_markup: Optional[InlineKeyboardMarkup] = reply_markup diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultgif.py b/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultgif.py deleted file mode 100644 index cbd1f25..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultgif.py +++ /dev/null @@ -1,188 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the classes that represent Telegram InlineQueryResultGif.""" -import datetime as dtm -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional, Union - -from telegram._inline.inlinekeyboardmarkup import InlineKeyboardMarkup -from telegram._inline.inlinequeryresult import InlineQueryResult -from telegram._messageentity import MessageEntity -from telegram._utils.argumentparsing import parse_sequence_arg, to_timedelta -from telegram._utils.datetime import get_timedelta_value -from telegram._utils.defaultvalue import DEFAULT_NONE -from telegram._utils.types import JSONDict, ODVInput, TimePeriod -from telegram.constants import InlineQueryResultType - -if TYPE_CHECKING: - from telegram import InputMessageContent - - -class InlineQueryResultGif(InlineQueryResult): - """ - Represents a link to an animated GIF file. By default, this animated GIF file will be sent by - the user with optional caption. Alternatively, you can use :attr:`input_message_content` to - send a message with the specified content instead of the animation. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - .. versionchanged:: 20.5 - |removed_thumb_wildcard_note| - - Args: - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - gif_url (:obj:`str`): A valid URL for the GIF file. - gif_width (:obj:`int`, optional): Width of the GIF. - gif_height (:obj:`int`, optional): Height of the GIF. - gif_duration (:obj:`int` | :class:`datetime.timedelta`, optional): Duration of the GIF - in seconds. - - .. versionchanged:: v22.2 - |time-period-input| - thumbnail_url (:obj:`str`): URL of the static (JPEG or GIF) or animated (MPEG4) - thumbnail for the result. - - .. versionadded:: 20.2 - - ..versionchanged:: 20.5 - |thumbnail_url_mandatory| - - thumbnail_mime_type (:obj:`str`, optional): MIME type of the thumbnail, must be one of - ``'image/jpeg'``, ``'image/gif'``, or ``'video/mp4'``. Defaults to ``'image/jpeg'``. - - .. versionadded:: 20.2 - title (:obj:`str`, optional): Title for the result. - caption (:obj:`str`, optional): Caption of the GIF file to be sent, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters - after entities parsing. - parse_mode (:obj:`str`, optional): |parse_mode| - caption_entities (Sequence[:class:`telegram.MessageEntity`], optional): |caption_entities| - - .. versionchanged:: 20.0 - |sequenceclassargs| - - reply_markup (:class:`telegram.InlineKeyboardMarkup`, optional): Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`, optional): Content of the - message to be sent instead of the GIF animation. - show_caption_above_media (:obj:`bool`, optional): Pass |show_cap_above_med| - - .. versionadded:: 21.3 - - Attributes: - type (:obj:`str`): :tg-const:`telegram.constants.InlineQueryResultType.GIF`. - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - gif_url (:obj:`str`): A valid URL for the GIF file. - gif_width (:obj:`int`): Optional. Width of the GIF. - gif_height (:obj:`int`): Optional. Height of the GIF. - gif_duration (:obj:`int` | :class:`datetime.timedelta`): Optional. Duration of the GIF - in seconds. - - .. deprecated:: v22.2 - |time-period-int-deprecated| - thumbnail_url (:obj:`str`): URL of the static (JPEG or GIF) or animated (MPEG4) thumbnail - for the result. - - .. versionadded:: 20.2 - thumbnail_mime_type (:obj:`str`): Optional. MIME type of the thumbnail, must be one of - ``'image/jpeg'``, ``'image/gif'``, or ``'video/mp4'``. Defaults to ``'image/jpeg'``. - - .. versionadded:: 20.2 - title (:obj:`str`): Optional. Title for the result. - caption (:obj:`str`): Optional. Caption of the GIF file to be sent, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters - after entities parsing. - parse_mode (:obj:`str`): Optional. |parse_mode| - caption_entities (tuple[:class:`telegram.MessageEntity`]): Optional. |captionentitiesattr| - - .. versionchanged:: 20.0 - - * |tupleclassattrs| - * |alwaystuple| - reply_markup (:class:`telegram.InlineKeyboardMarkup`): Optional. Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`): Optional. Content of the - message to be sent instead of the GIF animation. - show_caption_above_media (:obj:`bool`): Optional. |show_cap_above_med| - - .. versionadded:: 21.3 - - """ - - __slots__ = ( - "_gif_duration", - "caption", - "caption_entities", - "gif_height", - "gif_url", - "gif_width", - "input_message_content", - "parse_mode", - "reply_markup", - "show_caption_above_media", - "thumbnail_mime_type", - "thumbnail_url", - "title", - ) - - def __init__( - self, - id: str, # pylint: disable=redefined-builtin - gif_url: str, - thumbnail_url: str, - gif_width: Optional[int] = None, - gif_height: Optional[int] = None, - title: Optional[str] = None, - caption: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional["InputMessageContent"] = None, - gif_duration: Optional[TimePeriod] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence[MessageEntity]] = None, - thumbnail_mime_type: Optional[str] = None, - show_caption_above_media: Optional[bool] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - # Required - super().__init__(InlineQueryResultType.GIF, id, api_kwargs=api_kwargs) - with self._unfrozen(): - self.gif_url: str = gif_url - self.thumbnail_url: str = thumbnail_url - - # Optionals - self.gif_width: Optional[int] = gif_width - self.gif_height: Optional[int] = gif_height - self._gif_duration: Optional[dtm.timedelta] = to_timedelta(gif_duration) - self.title: Optional[str] = title - self.caption: Optional[str] = caption - self.parse_mode: ODVInput[str] = parse_mode - self.caption_entities: tuple[MessageEntity, ...] = parse_sequence_arg(caption_entities) - self.reply_markup: Optional[InlineKeyboardMarkup] = reply_markup - self.input_message_content: Optional[InputMessageContent] = input_message_content - self.thumbnail_mime_type: Optional[str] = thumbnail_mime_type - self.show_caption_above_media: Optional[bool] = show_caption_above_media - - @property - def gif_duration(self) -> Optional[Union[int, dtm.timedelta]]: - return get_timedelta_value(self._gif_duration, attribute="gif_duration") diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultlocation.py b/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultlocation.py deleted file mode 100644 index 6407c45..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultlocation.py +++ /dev/null @@ -1,220 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the classes that represent Telegram InlineQueryResultLocation.""" - -import datetime as dtm -from typing import TYPE_CHECKING, Final, Optional, Union - -from telegram import constants -from telegram._inline.inlinekeyboardmarkup import InlineKeyboardMarkup -from telegram._inline.inlinequeryresult import InlineQueryResult -from telegram._utils.argumentparsing import to_timedelta -from telegram._utils.datetime import get_timedelta_value -from telegram._utils.types import JSONDict, TimePeriod - -if TYPE_CHECKING: - from telegram import InputMessageContent - - -class InlineQueryResultLocation(InlineQueryResult): - """ - Represents a location on a map. By default, the location will be sent by the user. - Alternatively, you can use :attr:`input_message_content` to send a message with the specified - content instead of the location. - - .. versionchanged:: 20.5 - |removed_thumb_wildcard_note| - - Args: - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - latitude (:obj:`float`): Location latitude in degrees. - longitude (:obj:`float`): Location longitude in degrees. - title (:obj:`str`): Location title. - horizontal_accuracy (:obj:`float`, optional): The radius of uncertainty for the location, - measured in meters; 0- - :tg-const:`telegram.InlineQueryResultLocation.HORIZONTAL_ACCURACY`. - live_period (:obj:`int` | :class:`datetime.timedelta`, optional): Period in seconds for - which the location will be updated, should be between - :tg-const:`telegram.InlineQueryResultLocation.MIN_LIVE_PERIOD` and - :tg-const:`telegram.InlineQueryResultLocation.MAX_LIVE_PERIOD`. - - .. versionchanged:: v22.2 - |time-period-input| - heading (:obj:`int`, optional): For live locations, a direction in which the user is - moving, in degrees. Must be between - :tg-const:`telegram.InlineQueryResultLocation.MIN_HEADING` and - :tg-const:`telegram.InlineQueryResultLocation.MAX_HEADING` if specified. - proximity_alert_radius (:obj:`int`, optional): For live locations, a maximum distance - for proximity alerts about approaching another chat member, in meters. Must be - between :tg-const:`telegram.InlineQueryResultLocation.MIN_PROXIMITY_ALERT_RADIUS` - and :tg-const:`telegram.InlineQueryResultLocation.MAX_PROXIMITY_ALERT_RADIUS` - if specified. - reply_markup (:class:`telegram.InlineKeyboardMarkup`, optional): Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`, optional): Content of the - message to be sent instead of the location. - thumbnail_url (:obj:`str`, optional): Url of the thumbnail for the result. - - .. versionadded:: 20.2 - thumbnail_width (:obj:`int`, optional): Thumbnail width. - - .. versionadded:: 20.2 - thumbnail_height (:obj:`int`, optional): Thumbnail height. - - .. versionadded:: 20.2 - - Attributes: - type (:obj:`str`): :tg-const:`telegram.constants.InlineQueryResultType.LOCATION`. - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - latitude (:obj:`float`): Location latitude in degrees. - longitude (:obj:`float`): Location longitude in degrees. - title (:obj:`str`): Location title. - horizontal_accuracy (:obj:`float`): Optional. The radius of uncertainty for the location, - measured in meters; 0- - :tg-const:`telegram.InlineQueryResultLocation.HORIZONTAL_ACCURACY`. - live_period (:obj:`int` | :class:`datetime.timedelta`): Optional. Period in seconds for - which the location will be updated, should be between - :tg-const:`telegram.InlineQueryResultLocation.MIN_LIVE_PERIOD` and - :tg-const:`telegram.InlineQueryResultLocation.MAX_LIVE_PERIOD` or - :tg-const:`telegram.constants.LocationLimit.LIVE_PERIOD_FOREVER` for live - locations that can be edited indefinitely. - - .. deprecated:: v22.2 - |time-period-int-deprecated| - heading (:obj:`int`): Optional. For live locations, a direction in which the user is - moving, in degrees. Must be between - :tg-const:`telegram.InlineQueryResultLocation.MIN_HEADING` and - :tg-const:`telegram.InlineQueryResultLocation.MAX_HEADING` if specified. - proximity_alert_radius (:obj:`int`): Optional. For live locations, a maximum distance - for proximity alerts about approaching another chat member, in meters. Must be - between :tg-const:`telegram.InlineQueryResultLocation.MIN_PROXIMITY_ALERT_RADIUS` - and :tg-const:`telegram.InlineQueryResultLocation.MAX_PROXIMITY_ALERT_RADIUS` - if specified. - reply_markup (:class:`telegram.InlineKeyboardMarkup`): Optional. Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`): Optional. Content of the - message to be sent instead of the location. - thumbnail_url (:obj:`str`): Optional. Url of the thumbnail for the result. - - .. versionadded:: 20.2 - thumbnail_width (:obj:`int`): Optional. Thumbnail width. - - .. versionadded:: 20.2 - thumbnail_height (:obj:`int`): Optional. Thumbnail height. - - .. versionadded:: 20.2 - - """ - - __slots__ = ( - "_live_period", - "heading", - "horizontal_accuracy", - "input_message_content", - "latitude", - "longitude", - "proximity_alert_radius", - "reply_markup", - "thumbnail_height", - "thumbnail_url", - "thumbnail_width", - "title", - ) - - def __init__( - self, - id: str, # pylint: disable=redefined-builtin - latitude: float, - longitude: float, - title: str, - live_period: Optional[TimePeriod] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional["InputMessageContent"] = None, - horizontal_accuracy: Optional[float] = None, - heading: Optional[int] = None, - proximity_alert_radius: Optional[int] = None, - thumbnail_url: Optional[str] = None, - thumbnail_width: Optional[int] = None, - thumbnail_height: Optional[int] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - # Required - super().__init__(constants.InlineQueryResultType.LOCATION, id, api_kwargs=api_kwargs) - with self._unfrozen(): - self.latitude: float = latitude - self.longitude: float = longitude - self.title: str = title - - # Optionals - self._live_period: Optional[dtm.timedelta] = to_timedelta(live_period) - self.reply_markup: Optional[InlineKeyboardMarkup] = reply_markup - self.input_message_content: Optional[InputMessageContent] = input_message_content - self.thumbnail_url: Optional[str] = thumbnail_url - self.thumbnail_width: Optional[int] = thumbnail_width - self.thumbnail_height: Optional[int] = thumbnail_height - self.horizontal_accuracy: Optional[float] = horizontal_accuracy - self.heading: Optional[int] = heading - self.proximity_alert_radius: Optional[int] = ( - int(proximity_alert_radius) if proximity_alert_radius else None - ) - - @property - def live_period(self) -> Optional[Union[int, dtm.timedelta]]: - return get_timedelta_value(self._live_period, attribute="live_period") - - HORIZONTAL_ACCURACY: Final[int] = constants.LocationLimit.HORIZONTAL_ACCURACY - """:const:`telegram.constants.LocationLimit.HORIZONTAL_ACCURACY` - - .. versionadded:: 20.0 - """ - MIN_HEADING: Final[int] = constants.LocationLimit.MIN_HEADING - """:const:`telegram.constants.LocationLimit.MIN_HEADING` - - .. versionadded:: 20.0 - """ - MAX_HEADING: Final[int] = constants.LocationLimit.MAX_HEADING - """:const:`telegram.constants.LocationLimit.MAX_HEADING` - - .. versionadded:: 20.0 - """ - MIN_LIVE_PERIOD: Final[int] = constants.LocationLimit.MIN_LIVE_PERIOD - """:const:`telegram.constants.LocationLimit.MIN_LIVE_PERIOD` - - .. versionadded:: 20.0 - """ - MAX_LIVE_PERIOD: Final[int] = constants.LocationLimit.MAX_LIVE_PERIOD - """:const:`telegram.constants.LocationLimit.MAX_LIVE_PERIOD` - - .. versionadded:: 20.0 - """ - MIN_PROXIMITY_ALERT_RADIUS: Final[int] = constants.LocationLimit.MIN_PROXIMITY_ALERT_RADIUS - """:const:`telegram.constants.LocationLimit.MIN_PROXIMITY_ALERT_RADIUS` - - .. versionadded:: 20.0 - """ - MAX_PROXIMITY_ALERT_RADIUS: Final[int] = constants.LocationLimit.MAX_PROXIMITY_ALERT_RADIUS - """:const:`telegram.constants.LocationLimit.MAX_PROXIMITY_ALERT_RADIUS` - - .. versionadded:: 20.0 - """ diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultmpeg4gif.py b/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultmpeg4gif.py deleted file mode 100644 index 9ca96e1..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultmpeg4gif.py +++ /dev/null @@ -1,190 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the classes that represent Telegram InlineQueryResultMpeg4Gif.""" -import datetime as dtm -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional, Union - -from telegram._inline.inlinekeyboardmarkup import InlineKeyboardMarkup -from telegram._inline.inlinequeryresult import InlineQueryResult -from telegram._messageentity import MessageEntity -from telegram._utils.argumentparsing import parse_sequence_arg, to_timedelta -from telegram._utils.datetime import get_timedelta_value -from telegram._utils.defaultvalue import DEFAULT_NONE -from telegram._utils.types import JSONDict, ODVInput, TimePeriod -from telegram.constants import InlineQueryResultType - -if TYPE_CHECKING: - from telegram import InputMessageContent - - -class InlineQueryResultMpeg4Gif(InlineQueryResult): - """ - Represents a link to a video animation (H.264/MPEG-4 AVC video without sound). By default, this - animated MPEG-4 file will be sent by the user with optional caption. Alternatively, you can - use :attr:`input_message_content` to send a message with the specified content instead of the - animation. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - .. versionchanged:: 20.5 - |removed_thumb_wildcard_note| - - Args: - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - mpeg4_url (:obj:`str`): A valid URL for the MP4 file. - mpeg4_width (:obj:`int`, optional): Video width. - mpeg4_height (:obj:`int`, optional): Video height. - mpeg4_duration (:obj:`int` | :class:`datetime.timedelta`, optional): Video duration - in seconds. - - .. versionchanged:: v22.2 - |time-period-input| - thumbnail_url (:obj:`str`): URL of the static (JPEG or GIF) or animated (MPEG4) - thumbnail for the result. - - .. versionadded:: 20.2 - - ..versionchanged:: 20.5 - |thumbnail_url_mandatory| - - thumbnail_mime_type (:obj:`str`, optional): MIME type of the thumbnail, must be one of - ``'image/jpeg'``, ``'image/gif'``, or ``'video/mp4'``. Defaults to ``'image/jpeg'``. - - .. versionadded:: 20.2 - title (:obj:`str`, optional): Title for the result. - caption (:obj:`str`, optional): Caption of the MPEG-4 file to be sent, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters - after entities parsing. - parse_mode (:obj:`str`, optional): |parse_mode| - caption_entities (Sequence[:class:`telegram.MessageEntity`], optional): - |captionentitiesattr| - - .. versionchanged:: 20.0 - |sequenceclassargs| - - reply_markup (:class:`telegram.InlineKeyboardMarkup`, optional): Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`, optional): Content of the - message to be sent instead of the video animation. - show_caption_above_media (:obj:`bool`, optional): Pass |show_cap_above_med| - - .. versionadded:: 21.3 - - Attributes: - type (:obj:`str`): :tg-const:`telegram.constants.InlineQueryResultType.MPEG4GIF`. - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - mpeg4_url (:obj:`str`): A valid URL for the MP4 file. - mpeg4_width (:obj:`int`): Optional. Video width. - mpeg4_height (:obj:`int`): Optional. Video height. - mpeg4_duration (:obj:`int` | :class:`datetime.timedelta`): Optional. Video duration - in seconds. - - .. deprecated:: v22.2 - |time-period-int-deprecated| - thumbnail_url (:obj:`str`): URL of the static (JPEG or GIF) or animated (MPEG4) thumbnail - for the result. - - .. versionadded:: 20.2 - thumbnail_mime_type (:obj:`str`): Optional. MIME type of the thumbnail, must be one of - ``'image/jpeg'``, ``'image/gif'``, or ``'video/mp4'``. Defaults to ``'image/jpeg'``. - - .. versionadded:: 20.2 - title (:obj:`str`): Optional. Title for the result. - caption (:obj:`str`): Optional. Caption of the MPEG-4 file to be sent, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters - after entities parsing. - parse_mode (:obj:`str`): Optional. |parse_mode| - caption_entities (tuple[:class:`telegram.MessageEntity`]): Optional. |caption_entities| - - .. versionchanged:: 20.0 - - * |tupleclassattrs| - * |alwaystuple| - - reply_markup (:class:`telegram.InlineKeyboardMarkup`): Optional. Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`): Optional. Content of the - message to be sent instead of the video animation. - show_caption_above_media (:obj:`bool`): Optional. |show_cap_above_med| - - .. versionadded:: 21.3 - """ - - __slots__ = ( - "_mpeg4_duration", - "caption", - "caption_entities", - "input_message_content", - "mpeg4_height", - "mpeg4_url", - "mpeg4_width", - "parse_mode", - "reply_markup", - "show_caption_above_media", - "thumbnail_mime_type", - "thumbnail_url", - "title", - ) - - def __init__( - self, - id: str, # pylint: disable=redefined-builtin - mpeg4_url: str, - thumbnail_url: str, - mpeg4_width: Optional[int] = None, - mpeg4_height: Optional[int] = None, - title: Optional[str] = None, - caption: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional["InputMessageContent"] = None, - mpeg4_duration: Optional[TimePeriod] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence[MessageEntity]] = None, - thumbnail_mime_type: Optional[str] = None, - show_caption_above_media: Optional[bool] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - # Required - super().__init__(InlineQueryResultType.MPEG4GIF, id, api_kwargs=api_kwargs) - with self._unfrozen(): - self.mpeg4_url: str = mpeg4_url - self.thumbnail_url: str = thumbnail_url - - # Optional - self.mpeg4_width: Optional[int] = mpeg4_width - self.mpeg4_height: Optional[int] = mpeg4_height - self._mpeg4_duration: Optional[dtm.timedelta] = to_timedelta(mpeg4_duration) - self.title: Optional[str] = title - self.caption: Optional[str] = caption - self.parse_mode: ODVInput[str] = parse_mode - self.caption_entities: tuple[MessageEntity, ...] = parse_sequence_arg(caption_entities) - self.reply_markup: Optional[InlineKeyboardMarkup] = reply_markup - self.input_message_content: Optional[InputMessageContent] = input_message_content - self.thumbnail_mime_type: Optional[str] = thumbnail_mime_type - self.show_caption_above_media: Optional[bool] = show_caption_above_media - - @property - def mpeg4_duration(self) -> Optional[Union[int, dtm.timedelta]]: - return get_timedelta_value(self._mpeg4_duration, attribute="mpeg4_duration") diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultphoto.py b/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultphoto.py deleted file mode 100644 index e4556d6..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultphoto.py +++ /dev/null @@ -1,161 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the classes that represent Telegram InlineQueryResultPhoto.""" -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional - -from telegram._inline.inlinekeyboardmarkup import InlineKeyboardMarkup -from telegram._inline.inlinequeryresult import InlineQueryResult -from telegram._messageentity import MessageEntity -from telegram._utils.argumentparsing import parse_sequence_arg -from telegram._utils.defaultvalue import DEFAULT_NONE -from telegram._utils.types import JSONDict, ODVInput -from telegram.constants import InlineQueryResultType - -if TYPE_CHECKING: - from telegram import InputMessageContent - - -class InlineQueryResultPhoto(InlineQueryResult): - """ - Represents a link to a photo. By default, this photo will be sent by the user with optional - caption. Alternatively, you can use :attr:`input_message_content` to send a message with the - specified content instead of the photo. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - .. versionchanged:: 20.5 - |removed_thumb_url_note| - - Args: - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - photo_url (:obj:`str`): A valid URL of the photo. Photo must be in JPEG format. Photo size - must not exceed 5MB. - thumbnail_url (:obj:`str`): URL of the thumbnail for the photo. - - .. versionadded:: 20.2 - - ..versionchanged:: 20.5 - |thumbnail_url_mandatory| - - photo_width (:obj:`int`, optional): Width of the photo. - photo_height (:obj:`int`, optional): Height of the photo. - title (:obj:`str`, optional): Title for the result. - description (:obj:`str`, optional): Short description of the result. - caption (:obj:`str`, optional): Caption of the photo to be sent, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters after - entities parsing. - parse_mode (:obj:`str`, optional): |parse_mode| - caption_entities (Sequence[:class:`telegram.MessageEntity`], optional): |caption_entities| - - .. versionchanged:: 20.0 - |sequenceclassargs| - - reply_markup (:class:`telegram.InlineKeyboardMarkup`, optional): Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`, optional): Content of the - message to be sent instead of the photo. - show_caption_above_media (:obj:`bool`, optional): Pass |show_cap_above_med| - - .. versionadded:: 21.3 - - Attributes: - type (:obj:`str`): :tg-const:`telegram.constants.InlineQueryResultType.PHOTO`. - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - photo_url (:obj:`str`): A valid URL of the photo. Photo must be in JPEG format. Photo size - must not exceed 5MB. - thumbnail_url (:obj:`str`): URL of the thumbnail for the photo. - photo_width (:obj:`int`): Optional. Width of the photo. - photo_height (:obj:`int`): Optional. Height of the photo. - title (:obj:`str`): Optional. Title for the result. - description (:obj:`str`): Optional. Short description of the result. - caption (:obj:`str`): Optional. Caption of the photo to be sent, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters after - entities parsing. - parse_mode (:obj:`str`): Optional. |parse_mode| - caption_entities (tuple[:class:`telegram.MessageEntity`]): Optional. |captionentitiesattr| - - .. versionchanged:: 20.0 - - * |tupleclassattrs| - * |alwaystuple| - reply_markup (:class:`telegram.InlineKeyboardMarkup`): Optional. Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`): Optional. Content of the - message to be sent instead of the photo. - show_caption_above_media (:obj:`bool`): Optional. |show_cap_above_med| - - .. versionadded:: 21.3 - - """ - - __slots__ = ( - "caption", - "caption_entities", - "description", - "input_message_content", - "parse_mode", - "photo_height", - "photo_url", - "photo_width", - "reply_markup", - "show_caption_above_media", - "thumbnail_url", - "title", - ) - - def __init__( - self, - id: str, # pylint: disable=redefined-builtin - photo_url: str, - thumbnail_url: str, - photo_width: Optional[int] = None, - photo_height: Optional[int] = None, - title: Optional[str] = None, - description: Optional[str] = None, - caption: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional["InputMessageContent"] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence[MessageEntity]] = None, - show_caption_above_media: Optional[bool] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - # Required - super().__init__(InlineQueryResultType.PHOTO, id, api_kwargs=api_kwargs) - with self._unfrozen(): - self.photo_url: str = photo_url - self.thumbnail_url: str = thumbnail_url - - # Optionals - self.photo_width: Optional[int] = photo_width - self.photo_height: Optional[int] = photo_height - self.title: Optional[str] = title - self.description: Optional[str] = description - self.caption: Optional[str] = caption - self.parse_mode: ODVInput[str] = parse_mode - self.caption_entities: tuple[MessageEntity, ...] = parse_sequence_arg(caption_entities) - self.reply_markup: Optional[InlineKeyboardMarkup] = reply_markup - self.input_message_content: Optional[InputMessageContent] = input_message_content - self.show_caption_above_media: Optional[bool] = show_caption_above_media diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultsbutton.py b/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultsbutton.py deleted file mode 100644 index dd48253..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultsbutton.py +++ /dev/null @@ -1,116 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the class that represent a Telegram InlineQueryResultsButton.""" - -from typing import TYPE_CHECKING, Final, Optional - -from telegram import constants -from telegram._telegramobject import TelegramObject -from telegram._utils.argumentparsing import de_json_optional -from telegram._utils.types import JSONDict -from telegram._webappinfo import WebAppInfo - -if TYPE_CHECKING: - from telegram import Bot - - -class InlineQueryResultsButton(TelegramObject): - """This object represents a button to be shown above inline query results. You **must** use - exactly one of the optional fields. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`text`, :attr:`web_app` and :attr:`start_parameter` are equal. - - Args: - text (:obj:`str`): Label text on the button. - web_app (:class:`telegram.WebAppInfo`, optional): Description of the - `Web App <https://core.telegram.org/bots/webapps>`_ that will be launched when the - user presses the button. The Web App will be able to switch back to the inline mode - using the method - `switchInlineQuery <https://core.telegram.org/bots/webapps#initializing-mini-apps>`_ - inside the Web App. - start_parameter (:obj:`str`, optional): Deep-linking parameter for the - :guilabel:`/start` message sent to the bot when user presses the switch button. - :tg-const:`telegram.constants.InlineQueryResultsButtonLimit.MIN_START_PARAMETER_LENGTH` - - - :tg-const:`telegram.constants.InlineQueryResultsButtonLimit.MAX_START_PARAMETER_LENGTH` - characters, only ``A-Z``, ``a-z``, ``0-9``, ``_`` and ``-`` are allowed. - - Example: - An inline bot that sends YouTube videos can ask the user to connect the bot to - their YouTube account to adapt search results accordingly. To do this, it displays - a 'Connect your YouTube account' button above the results, or even before showing - any. The user presses the button, switches to a private chat with the bot and, in - doing so, passes a start parameter that instructs the bot to return an OAuth link. - Once done, the bot can offer a switch_inline button so that the user can easily - return to the chat where they wanted to use the bot's inline capabilities. - - Attributes: - text (:obj:`str`): Label text on the button. - web_app (:class:`telegram.WebAppInfo`): Optional. Description of the - `Web App <https://core.telegram.org/bots/webapps>`_ that will be launched when the - user presses the button. The Web App will be able to switch back to the inline mode - using the method ``web_app_switch_inline_query`` inside the Web App. - start_parameter (:obj:`str`): Optional. Deep-linking parameter for the - :tg-const:`telegram.constants.InlineQueryResultsButtonLimit.MIN_START_PARAMETER_LENGTH` - - - :tg-const:`telegram.constants.InlineQueryResultsButtonLimit.MAX_START_PARAMETER_LENGTH` - characters, only ``A-Z``, ``a-z``, ``0-9``, ``_`` and ``-`` are allowed. - - """ - - __slots__ = ("start_parameter", "text", "web_app") - - def __init__( - self, - text: str, - web_app: Optional[WebAppInfo] = None, - start_parameter: Optional[str] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - - # Required - self.text: str = text - - # Optional - self.web_app: Optional[WebAppInfo] = web_app - self.start_parameter: Optional[str] = start_parameter - - self._id_attrs = (self.text, self.web_app, self.start_parameter) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "InlineQueryResultsButton": - """See :meth:`telegram.TelegramObject.de_json`.""" - - data["web_app"] = de_json_optional(data.get("web_app"), WebAppInfo, bot) - - return super().de_json(data=data, bot=bot) - - MIN_START_PARAMETER_LENGTH: Final[int] = ( - constants.InlineQueryResultsButtonLimit.MIN_START_PARAMETER_LENGTH - ) - """:const:`telegram.constants.InlineQueryResultsButtonLimit.MIN_START_PARAMETER_LENGTH`""" - MAX_START_PARAMETER_LENGTH: Final[int] = ( - constants.InlineQueryResultsButtonLimit.MAX_START_PARAMETER_LENGTH - ) - """:const:`telegram.constants.InlineQueryResultsButtonLimit.MAX_START_PARAMETER_LENGTH`""" diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultvenue.py b/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultvenue.py deleted file mode 100644 index 639b0da..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultvenue.py +++ /dev/null @@ -1,160 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the classes that represent Telegram InlineQueryResultVenue.""" - -from typing import TYPE_CHECKING, Optional - -from telegram._inline.inlinekeyboardmarkup import InlineKeyboardMarkup -from telegram._inline.inlinequeryresult import InlineQueryResult -from telegram._utils.types import JSONDict -from telegram.constants import InlineQueryResultType - -if TYPE_CHECKING: - from telegram import InputMessageContent - - -class InlineQueryResultVenue(InlineQueryResult): - """ - Represents a venue. By default, the venue will be sent by the user. Alternatively, you can - use :attr:`input_message_content` to send a message with the specified content instead of the - venue. - - Note: - Foursquare details and Google Pace details are mutually exclusive. However, this - behaviour is undocumented and might be changed by Telegram. - - .. versionchanged:: 20.5 - |removed_thumb_wildcard_note| - - Args: - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - latitude (:obj:`float`): Latitude of the venue location in degrees. - longitude (:obj:`float`): Longitude of the venue location in degrees. - title (:obj:`str`): Title of the venue. - address (:obj:`str`): Address of the venue. - foursquare_id (:obj:`str`, optional): Foursquare identifier of the venue if known. - foursquare_type (:obj:`str`, optional): Foursquare type of the venue, if known. - (For example, "arts_entertainment/default", "arts_entertainment/aquarium" or - "food/icecream".) - google_place_id (:obj:`str`, optional): Google Places identifier of the venue. - google_place_type (:obj:`str`, optional): Google Places type of the venue. (See - `supported types <https://developers.google.com/maps/documentation/places/web-service\ - /supported_types>`_.) - reply_markup (:class:`telegram.InlineKeyboardMarkup`, optional): Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`, optional): Content of the - message to be sent instead of the venue. - thumbnail_url (:obj:`str`, optional): Url of the thumbnail for the result. - - .. versionadded:: 20.2 - thumbnail_width (:obj:`int`, optional): Thumbnail width. - - .. versionadded:: 20.2 - thumbnail_height (:obj:`int`, optional): Thumbnail height. - - .. versionadded:: 20.2 - - Attributes: - type (:obj:`str`): :tg-const:`telegram.constants.InlineQueryResultType.VENUE`. - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - latitude (:obj:`float`): Latitude of the venue location in degrees. - longitude (:obj:`float`): Longitude of the venue location in degrees. - title (:obj:`str`): Title of the venue. - address (:obj:`str`): Address of the venue. - foursquare_id (:obj:`str`): Optional. Foursquare identifier of the venue if known. - foursquare_type (:obj:`str`): Optional. Foursquare type of the venue, if known. - (For example, "arts_entertainment/default", "arts_entertainment/aquarium" or - "food/icecream".) - google_place_id (:obj:`str`): Optional. Google Places identifier of the venue. - google_place_type (:obj:`str`): Optional. Google Places type of the venue. (See - `supported types <https://developers.google.com/maps/documentation/places/web-service\ - /supported_types>`_.) - reply_markup (:class:`telegram.InlineKeyboardMarkup`): Optional. Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`): Optional. Content of the - message to be sent instead of the venue. - thumbnail_url (:obj:`str`): Optional. Url of the thumbnail for the result. - - .. versionadded:: 20.2 - thumbnail_width (:obj:`int`): Optional. Thumbnail width. - - .. versionadded:: 20.2 - thumbnail_height (:obj:`int`): Optional. Thumbnail height. - - .. versionadded:: 20.2 - - """ - - __slots__ = ( - "address", - "foursquare_id", - "foursquare_type", - "google_place_id", - "google_place_type", - "input_message_content", - "latitude", - "longitude", - "reply_markup", - "thumbnail_height", - "thumbnail_url", - "thumbnail_width", - "title", - ) - - def __init__( - self, - id: str, # pylint: disable=redefined-builtin - latitude: float, - longitude: float, - title: str, - address: str, - foursquare_id: Optional[str] = None, - foursquare_type: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional["InputMessageContent"] = None, - google_place_id: Optional[str] = None, - google_place_type: Optional[str] = None, - thumbnail_url: Optional[str] = None, - thumbnail_width: Optional[int] = None, - thumbnail_height: Optional[int] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - # Required - super().__init__(InlineQueryResultType.VENUE, id, api_kwargs=api_kwargs) - with self._unfrozen(): - self.latitude: float = latitude - self.longitude: float = longitude - self.title: str = title - self.address: str = address - - # Optional - self.foursquare_id: Optional[str] = foursquare_id - self.foursquare_type: Optional[str] = foursquare_type - self.google_place_id: Optional[str] = google_place_id - self.google_place_type: Optional[str] = google_place_type - self.reply_markup: Optional[InlineKeyboardMarkup] = reply_markup - self.input_message_content: Optional[InputMessageContent] = input_message_content - self.thumbnail_url: Optional[str] = thumbnail_url - self.thumbnail_width: Optional[int] = thumbnail_width - self.thumbnail_height: Optional[int] = thumbnail_height diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultvideo.py b/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultvideo.py deleted file mode 100644 index 1764816..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultvideo.py +++ /dev/null @@ -1,196 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the classes that represent Telegram InlineQueryResultVideo.""" -import datetime as dtm -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional, Union - -from telegram._inline.inlinekeyboardmarkup import InlineKeyboardMarkup -from telegram._inline.inlinequeryresult import InlineQueryResult -from telegram._messageentity import MessageEntity -from telegram._utils.argumentparsing import parse_sequence_arg, to_timedelta -from telegram._utils.datetime import get_timedelta_value -from telegram._utils.defaultvalue import DEFAULT_NONE -from telegram._utils.types import JSONDict, ODVInput, TimePeriod -from telegram.constants import InlineQueryResultType - -if TYPE_CHECKING: - from telegram import InputMessageContent - - -class InlineQueryResultVideo(InlineQueryResult): - """ - Represents a link to a page containing an embedded video player or a video file. By default, - this video file will be sent by the user with an optional caption. Alternatively, you can use - :attr:`input_message_content` to send a message with the specified content instead of - the video. - - Note: - If an InlineQueryResultVideo message contains an embedded video (e.g., YouTube), you must - replace its content using :attr:`input_message_content`. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - .. versionchanged:: 20.5 - |removed_thumb_url_note| - - Args: - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - video_url (:obj:`str`): A valid URL for the embedded video player or video file. - mime_type (:obj:`str`): Mime type of the content of video url, "text/html" or "video/mp4". - thumbnail_url (:obj:`str`, optional): URL of the thumbnail (JPEG only) for the video. - - .. versionadded:: 20.2 - - ..versionchanged:: 20.5 - |thumbnail_url_mandatory| - - title (:obj:`str`): Title for the result. - caption (:obj:`str`, optional): Caption of the video to be sent, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters after entities - parsing. - parse_mode (:obj:`str`, optional): |parse_mode| - caption_entities (Sequence[:class:`telegram.MessageEntity`], optional): |caption_entities| - - .. versionchanged:: 20.0 - |sequenceclassargs| - - video_width (:obj:`int`, optional): Video width. - video_height (:obj:`int`, optional): Video height. - video_duration (:obj:`int` | :class:`datetime.timedelta`, optional): Video duration - in seconds. - - .. versionchanged:: v22.2 - |time-period-input| - description (:obj:`str`, optional): Short description of the result. - reply_markup (:class:`telegram.InlineKeyboardMarkup`, optional): Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`, optional): Content of the - message to be sent instead of the video. This field is required if - ``InlineQueryResultVideo`` is used to send an HTML-page as a result - (e.g., a YouTube video). - show_caption_above_media (:obj:`bool`, optional): Pass |show_cap_above_med| - - .. versionadded:: 21.3 - - Attributes: - type (:obj:`str`): :tg-const:`telegram.constants.InlineQueryResultType.VIDEO`. - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - video_url (:obj:`str`): A valid URL for the embedded video player or video file. - mime_type (:obj:`str`): Mime type of the content of video url, "text/html" or "video/mp4". - thumbnail_url (:obj:`str`): URL of the thumbnail (JPEG only) for the video. - - .. versionadded:: 20.2 - title (:obj:`str`): Title for the result. - caption (:obj:`str`): Optional. Caption of the video to be sent, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters after entities - parsing. - parse_mode (:obj:`str`): Optional. |parse_mode| - caption_entities (tuple[:class:`telegram.MessageEntity`]): Optional. - |captionentitiesattr| - - .. versionchanged:: 20.0 - - * |tupleclassattrs| - * |alwaystuple| - - video_width (:obj:`int`): Optional. Video width. - video_height (:obj:`int`): Optional. Video height. - video_duration (:obj:`int` | :class:`datetime.timedelta`): Optional. Video duration - in seconds. - - .. deprecated:: v22.2 - |time-period-int-deprecated| - description (:obj:`str`): Optional. Short description of the result. - reply_markup (:class:`telegram.InlineKeyboardMarkup`): Optional. Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`): Optional. Content of the - message to be sent instead of the video. This field is required if - ``InlineQueryResultVideo`` is used to send an HTML-page as a result - (e.g., a YouTube video). - show_caption_above_media (:obj:`bool`): Optional. |show_cap_above_med| - - .. versionadded:: 21.3 - - """ - - __slots__ = ( - "_video_duration", - "caption", - "caption_entities", - "description", - "input_message_content", - "mime_type", - "parse_mode", - "reply_markup", - "show_caption_above_media", - "thumbnail_url", - "title", - "video_height", - "video_url", - "video_width", - ) - - def __init__( - self, - id: str, # pylint: disable=redefined-builtin - video_url: str, - mime_type: str, - thumbnail_url: str, - title: str, - caption: Optional[str] = None, - video_width: Optional[int] = None, - video_height: Optional[int] = None, - video_duration: Optional[TimePeriod] = None, - description: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional["InputMessageContent"] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence[MessageEntity]] = None, - show_caption_above_media: Optional[bool] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - # Required - super().__init__(InlineQueryResultType.VIDEO, id, api_kwargs=api_kwargs) - with self._unfrozen(): - self.video_url: str = video_url - self.mime_type: str = mime_type - self.thumbnail_url: str = thumbnail_url - self.title: str = title - - # Optional - self.caption: Optional[str] = caption - self.parse_mode: ODVInput[str] = parse_mode - self.caption_entities: tuple[MessageEntity, ...] = parse_sequence_arg(caption_entities) - self.video_width: Optional[int] = video_width - self.video_height: Optional[int] = video_height - self._video_duration: Optional[dtm.timedelta] = to_timedelta(video_duration) - self.description: Optional[str] = description - self.reply_markup: Optional[InlineKeyboardMarkup] = reply_markup - self.input_message_content: Optional[InputMessageContent] = input_message_content - self.show_caption_above_media: Optional[bool] = show_caption_above_media - - @property - def video_duration(self) -> Optional[Union[int, dtm.timedelta]]: - return get_timedelta_value(self._video_duration, attribute="video_duration") diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultvoice.py b/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultvoice.py deleted file mode 100644 index 6f9ef6c..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_inline/inlinequeryresultvoice.py +++ /dev/null @@ -1,141 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the classes that represent Telegram InlineQueryResultVoice.""" -import datetime as dtm -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional, Union - -from telegram._inline.inlinekeyboardmarkup import InlineKeyboardMarkup -from telegram._inline.inlinequeryresult import InlineQueryResult -from telegram._messageentity import MessageEntity -from telegram._utils.argumentparsing import parse_sequence_arg, to_timedelta -from telegram._utils.datetime import get_timedelta_value -from telegram._utils.defaultvalue import DEFAULT_NONE -from telegram._utils.types import JSONDict, ODVInput, TimePeriod -from telegram.constants import InlineQueryResultType - -if TYPE_CHECKING: - from telegram import InputMessageContent - - -class InlineQueryResultVoice(InlineQueryResult): - """ - Represents a link to a voice recording in an .ogg container encoded with OPUS. By default, - this voice recording will be sent by the user. Alternatively, you can use - :attr:`input_message_content` to send a message with the specified content instead of - the voice message. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - Args: - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - voice_url (:obj:`str`): A valid URL for the voice recording. - title (:obj:`str`): Recording title. - caption (:obj:`str`, optional): Caption, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters after entities - parsing. - parse_mode (:obj:`str`, optional): |parse_mode| - caption_entities (Sequence[:class:`telegram.MessageEntity`], optional): |caption_entities| - - .. versionchanged:: 20.0 - |sequenceclassargs| - - voice_duration (:obj:`int` | :class:`datetime.timedelta`, optional): Recording duration - in seconds. - - .. versionchanged:: v22.2 - |time-period-input| - reply_markup (:class:`telegram.InlineKeyboardMarkup`, optional): Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`, optional): Content of the - message to be sent instead of the voice recording. - - Attributes: - type (:obj:`str`): :tg-const:`telegram.constants.InlineQueryResultType.VOICE`. - id (:obj:`str`): Unique identifier for this result, - :tg-const:`telegram.InlineQueryResult.MIN_ID_LENGTH`- - :tg-const:`telegram.InlineQueryResult.MAX_ID_LENGTH` Bytes. - voice_url (:obj:`str`): A valid URL for the voice recording. - title (:obj:`str`): Recording title. - caption (:obj:`str`): Optional. Caption, - 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters after entities - parsing. - parse_mode (:obj:`str`): Optional. |parse_mode| - caption_entities (tuple[:class:`telegram.MessageEntity`]): Optional. |captionentitiesattr| - - .. versionchanged:: 20.0 - - * |tupleclassattrs| - * |alwaystuple| - voice_duration (:obj:`int` | :class:`datetime.timedelta`): Optional. Recording duration - in seconds. - - .. deprecated:: v22.2 - |time-period-int-deprecated| - reply_markup (:class:`telegram.InlineKeyboardMarkup`): Optional. Inline keyboard attached - to the message. - input_message_content (:class:`telegram.InputMessageContent`): Optional. Content of the - message to be sent instead of the voice recording. - - """ - - __slots__ = ( - "_voice_duration", - "caption", - "caption_entities", - "input_message_content", - "parse_mode", - "reply_markup", - "title", - "voice_url", - ) - - def __init__( - self, - id: str, # pylint: disable=redefined-builtin - voice_url: str, - title: str, - voice_duration: Optional[TimePeriod] = None, - caption: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional["InputMessageContent"] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence[MessageEntity]] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - # Required - super().__init__(InlineQueryResultType.VOICE, id, api_kwargs=api_kwargs) - with self._unfrozen(): - self.voice_url: str = voice_url - self.title: str = title - - # Optional - self._voice_duration: Optional[dtm.timedelta] = to_timedelta(voice_duration) - self.caption: Optional[str] = caption - self.parse_mode: ODVInput[str] = parse_mode - self.caption_entities: tuple[MessageEntity, ...] = parse_sequence_arg(caption_entities) - self.reply_markup: Optional[InlineKeyboardMarkup] = reply_markup - self.input_message_content: Optional[InputMessageContent] = input_message_content - - @property - def voice_duration(self) -> Optional[Union[int, dtm.timedelta]]: - return get_timedelta_value(self._voice_duration, attribute="voice_duration") diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/inputcontactmessagecontent.py b/venv/lib/python3.12/site-packages/telegram/_inline/inputcontactmessagecontent.py deleted file mode 100644 index f7a76df..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_inline/inputcontactmessagecontent.py +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the classes that represent Telegram InputContactMessageContent.""" -from typing import Optional - -from telegram._inline.inputmessagecontent import InputMessageContent -from telegram._utils.types import JSONDict - - -class InputContactMessageContent(InputMessageContent): - """Represents the content of a contact message to be sent as the result of an inline query. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`phone_number` is equal. - - Args: - phone_number (:obj:`str`): Contact's phone number. - first_name (:obj:`str`): Contact's first name. - last_name (:obj:`str`, optional): Contact's last name. - vcard (:obj:`str`, optional): Additional data about the contact in the form of a vCard, - 0-:tg-const:`telegram.constants.ContactLimit.VCARD` bytes. - - Attributes: - phone_number (:obj:`str`): Contact's phone number. - first_name (:obj:`str`): Contact's first name. - last_name (:obj:`str`): Optional. Contact's last name. - vcard (:obj:`str`): Optional. Additional data about the contact in the form of a vCard, - 0-:tg-const:`telegram.constants.ContactLimit.VCARD` bytes. - - """ - - __slots__ = ("first_name", "last_name", "phone_number", "vcard") - - def __init__( - self, - phone_number: str, - first_name: str, - last_name: Optional[str] = None, - vcard: Optional[str] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - with self._unfrozen(): - # Required - self.phone_number: str = phone_number - self.first_name: str = first_name - # Optionals - self.last_name: Optional[str] = last_name - self.vcard: Optional[str] = vcard - - self._id_attrs = (self.phone_number,) diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/inputinvoicemessagecontent.py b/venv/lib/python3.12/site-packages/telegram/_inline/inputinvoicemessagecontent.py deleted file mode 100644 index ad486b5..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_inline/inputinvoicemessagecontent.py +++ /dev/null @@ -1,264 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains a class that represents a Telegram InputInvoiceMessageContent.""" -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional - -from telegram._inline.inputmessagecontent import InputMessageContent -from telegram._payment.labeledprice import LabeledPrice -from telegram._utils.argumentparsing import de_list_optional, parse_sequence_arg -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot - - -class InputInvoiceMessageContent(InputMessageContent): - """ - Represents the content of a invoice message to be sent as the result of an inline query. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`title`, :attr:`description`, :attr:`payload`, - :attr:`currency` and :attr:`prices` are equal. - - .. versionadded:: 13.5 - .. versionchanged:: 21.11 - :attr:`provider_token` is no longer considered for equality comparison. - - Args: - title (:obj:`str`): Product name. :tg-const:`telegram.Invoice.MIN_TITLE_LENGTH`- - :tg-const:`telegram.Invoice.MAX_TITLE_LENGTH` characters. - description (:obj:`str`): Product description. - :tg-const:`telegram.Invoice.MIN_DESCRIPTION_LENGTH`- - :tg-const:`telegram.Invoice.MAX_DESCRIPTION_LENGTH` characters. - payload (:obj:`str`): Bot-defined invoice payload. - :tg-const:`telegram.Invoice.MIN_PAYLOAD_LENGTH`- - :tg-const:`telegram.Invoice.MAX_PAYLOAD_LENGTH` bytes. This will not be displayed - to the user, use it for your internal processes. - provider_token (:obj:`str`, optional): Payment provider token, obtained via - `@Botfather <https://t.me/Botfather>`_. Pass an empty string for payments in - |tg_stars|. - - .. versionchanged:: 21.11 - Bot API 7.4 made this parameter is optional and this is now reflected in the - class signature. - currency (:obj:`str`): Three-letter ISO 4217 currency code, see more on - `currencies <https://core.telegram.org/bots/payments#supported-currencies>`_. - Pass ``XTR`` for payments in |tg_stars|. - prices (Sequence[:class:`telegram.LabeledPrice`]): Price breakdown, a list of - components (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, - etc.). Must contain exactly one item for payments in |tg_stars|. - - .. versionchanged:: 20.0 - |sequenceclassargs| - - max_tip_amount (:obj:`int`, optional): The maximum accepted amount for tips in the - *smallest units* of the currency (integer, **not** float/double). For example, for a - maximum tip of ``US$ 1.45`` pass ``max_tip_amount = 145``. See the ``exp`` parameter in - `currencies.json <https://core.telegram.org/bots/payments/currencies.json>`_, it - shows the number of digits past the decimal point for each currency (2 for the majority - of currencies). Defaults to ``0``. Not supported for payments in |tg_stars|. - suggested_tip_amounts (Sequence[:obj:`int`], optional): An array of suggested - amounts of tip in the *smallest units* of the currency (integer, **not** float/double). - At most 4 suggested tip amounts can be specified. The suggested tip amounts must be - positive, passed in a strictly increased order and must not exceed - :attr:`max_tip_amount`. - - .. versionchanged:: 20.0 - - * |tupleclassattrs| - * |alwaystuple| - - provider_data (:obj:`str`, optional): An object for data about the invoice, - which will be shared with the payment provider. A detailed description of the required - fields should be provided by the payment provider. - photo_url (:obj:`str`, optional): URL of the product photo for the invoice. Can be a photo - of the goods or a marketing image for a service. People like it better when they see - what they are paying for. - photo_size (:obj:`int`, optional): Photo size. - photo_width (:obj:`int`, optional): Photo width. - photo_height (:obj:`int`, optional): Photo height. - need_name (:obj:`bool`, optional): Pass :obj:`True`, if you require the user's full - name to complete the order. Ignored for payments in |tg_stars|. - need_phone_number (:obj:`bool`, optional): Pass :obj:`True`, if you require the user's - phone number to complete the order. Ignored for payments in |tg_stars|. - need_email (:obj:`bool`, optional): Pass :obj:`True`, if you require the user's email - address to complete the order. Ignored for payments in |tg_stars|. - need_shipping_address (:obj:`bool`, optional): Pass :obj:`True`, if you require the - user's shipping address to complete the order. Ignored for payments in |tg_stars| - send_phone_number_to_provider (:obj:`bool`, optional): Pass :obj:`True`, if user's - phone number should be sent to provider. Ignored for payments in |tg_stars|. - send_email_to_provider (:obj:`bool`, optional): Pass :obj:`True`, if user's email - address should be sent to provider. Ignored for payments in |tg_stars|. - is_flexible (:obj:`bool`, optional): Pass :obj:`True`, if the final price depends on - the shipping method. Ignored for payments in |tg_stars|. - - Attributes: - title (:obj:`str`): Product name. :tg-const:`telegram.Invoice.MIN_TITLE_LENGTH`- - :tg-const:`telegram.Invoice.MAX_TITLE_LENGTH` characters. - description (:obj:`str`): Product description. - :tg-const:`telegram.Invoice.MIN_DESCRIPTION_LENGTH`- - :tg-const:`telegram.Invoice.MAX_DESCRIPTION_LENGTH` characters. - payload (:obj:`str`): Bot-defined invoice payload. - :tg-const:`telegram.Invoice.MIN_PAYLOAD_LENGTH`- - :tg-const:`telegram.Invoice.MAX_PAYLOAD_LENGTH` bytes. This will not be displayed - to the user, use it for your internal processes. - provider_token (:obj:`str`): Payment provider token, obtained via - `@Botfather <https://t.me/Botfather>`_. Pass an empty string for payments in `Telegram - Stars <https://t.me/BotNews/90>`_. - currency (:obj:`str`): Three-letter ISO 4217 currency code, see more on - `currencies <https://core.telegram.org/bots/payments#supported-currencies>`_. - Pass ``XTR`` for payments in |tg_stars|. - prices (tuple[:class:`telegram.LabeledPrice`]): Price breakdown, a list of - components (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, - etc.). Must contain exactly one item for payments in |tg_stars|. - - .. versionchanged:: 20.0 - |tupleclassattrs| - - max_tip_amount (:obj:`int`): Optional. The maximum accepted amount for tips in the - *smallest units* of the currency (integer, **not** float/double). For example, for a - maximum tip of ``US$ 1.45`` ``max_tip_amount`` is ``145``. See the ``exp`` parameter in - `currencies.json <https://core.telegram.org/bots/payments/currencies.json>`_, it - shows the number of digits past the decimal point for each currency (2 for the majority - of currencies). Defaults to ``0``. Not supported for payments in |tg_stars|. - suggested_tip_amounts (tuple[:obj:`int`]): Optional. An array of suggested - amounts of tip in the *smallest units* of the currency (integer, **not** float/double). - At most 4 suggested tip amounts can be specified. The suggested tip amounts must be - positive, passed in a strictly increased order and must not exceed - :attr:`max_tip_amount`. - - .. versionchanged:: 20.0 - |tupleclassattrs| - - provider_data (:obj:`str`): Optional. An object for data about the invoice, - which will be shared with the payment provider. A detailed description of the required - fields should be provided by the payment provider. - photo_url (:obj:`str`): Optional. URL of the product photo for the invoice. Can be a photo - of the goods or a marketing image for a service. People like it better when they see - what they are paying for. - photo_size (:obj:`int`): Optional. Photo size. - photo_width (:obj:`int`): Optional. Photo width. - photo_height (:obj:`int`): Optional. Photo height. - need_name (:obj:`bool`): Optional. Pass :obj:`True`, if you require the user's full name to - complete the order. Ignored for payments in |tg_stars|. - need_phone_number (:obj:`bool`): Optional. Pass :obj:`True`, if you require the user's - phone number to complete the order. Ignored for payments in |tg_stars|. - need_email (:obj:`bool`): Optional. Pass :obj:`True`, if you require the user's email - address to complete the order. Ignored for payments in |tg_stars|. - need_shipping_address (:obj:`bool`): Optional. Pass :obj:`True`, if you require the user's - shipping address to complete the order. Ignored for payments in |tg_stars|. - send_phone_number_to_provider (:obj:`bool`): Optional. Pass :obj:`True`, if user's phone - number should be sent to provider. Ignored for payments in |tg_stars|. - send_email_to_provider (:obj:`bool`): Optional. Pass :obj:`True`, if user's email address - should be sent to provider. Ignored for payments in |tg_stars|. - is_flexible (:obj:`bool`): Optional. Pass :obj:`True`, if the final price depends on the - shipping method. Ignored for payments in |tg_stars|. - - """ - - __slots__ = ( - "currency", - "description", - "is_flexible", - "max_tip_amount", - "need_email", - "need_name", - "need_phone_number", - "need_shipping_address", - "payload", - "photo_height", - "photo_size", - "photo_url", - "photo_width", - "prices", - "provider_data", - "provider_token", - "send_email_to_provider", - "send_phone_number_to_provider", - "suggested_tip_amounts", - "title", - ) - - def __init__( - self, - title: str, - description: str, - payload: str, - currency: str, - prices: Sequence[LabeledPrice], - provider_token: Optional[str] = None, - max_tip_amount: Optional[int] = None, - suggested_tip_amounts: Optional[Sequence[int]] = None, - provider_data: Optional[str] = None, - photo_url: Optional[str] = None, - photo_size: Optional[int] = None, - photo_width: Optional[int] = None, - photo_height: Optional[int] = None, - need_name: Optional[bool] = None, - need_phone_number: Optional[bool] = None, - need_email: Optional[bool] = None, - need_shipping_address: Optional[bool] = None, - send_phone_number_to_provider: Optional[bool] = None, - send_email_to_provider: Optional[bool] = None, - is_flexible: Optional[bool] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - with self._unfrozen(): - # Required - self.title: str = title - self.description: str = description - self.payload: str = payload - self.currency: str = currency - self.prices: tuple[LabeledPrice, ...] = parse_sequence_arg(prices) - # Optionals - self.provider_token: Optional[str] = provider_token - self.max_tip_amount: Optional[int] = max_tip_amount - self.suggested_tip_amounts: tuple[int, ...] = parse_sequence_arg(suggested_tip_amounts) - self.provider_data: Optional[str] = provider_data - self.photo_url: Optional[str] = photo_url - self.photo_size: Optional[int] = photo_size - self.photo_width: Optional[int] = photo_width - self.photo_height: Optional[int] = photo_height - self.need_name: Optional[bool] = need_name - self.need_phone_number: Optional[bool] = need_phone_number - self.need_email: Optional[bool] = need_email - self.need_shipping_address: Optional[bool] = need_shipping_address - self.send_phone_number_to_provider: Optional[bool] = send_phone_number_to_provider - self.send_email_to_provider: Optional[bool] = send_email_to_provider - self.is_flexible: Optional[bool] = is_flexible - - self._id_attrs = ( - self.title, - self.description, - self.payload, - self.currency, - self.prices, - ) - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "InputInvoiceMessageContent": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["prices"] = de_list_optional(data.get("prices"), LabeledPrice, bot) - - return super().de_json(data=data, bot=bot) diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/inputlocationmessagecontent.py b/venv/lib/python3.12/site-packages/telegram/_inline/inputlocationmessagecontent.py deleted file mode 100644 index 5d7e3eb..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_inline/inputlocationmessagecontent.py +++ /dev/null @@ -1,164 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the classes that represent Telegram InputLocationMessageContent.""" - -import datetime as dtm -from typing import Final, Optional, Union - -from telegram import constants -from telegram._inline.inputmessagecontent import InputMessageContent -from telegram._utils.argumentparsing import to_timedelta -from telegram._utils.datetime import get_timedelta_value -from telegram._utils.types import JSONDict, TimePeriod - - -class InputLocationMessageContent(InputMessageContent): - # fmt: off - """ - Represents the content of a location message to be sent as the result of an inline query. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`latitude` and :attr:`longitude` are equal. - - Args: - latitude (:obj:`float`): Latitude of the location in degrees. - longitude (:obj:`float`): Longitude of the location in degrees. - horizontal_accuracy (:obj:`float`, optional): The radius of uncertainty for the location, - measured in meters; 0- - :tg-const:`telegram.InputLocationMessageContent.HORIZONTAL_ACCURACY`. - live_period (:obj:`int` | :class:`datetime.timedelta`, optional): Period in seconds for - which the location will be updated, should be between - :tg-const:`telegram.InputLocationMessageContent.MIN_LIVE_PERIOD` and - :tg-const:`telegram.InputLocationMessageContent.MAX_LIVE_PERIOD` or - :tg-const:`telegram.constants.LocationLimit.LIVE_PERIOD_FOREVER` for live - locations that can be edited indefinitely. - - .. versionchanged:: v22.2 - |time-period-input| - heading (:obj:`int`, optional): For live locations, a direction in which the user is - moving, in degrees. Must be between - :tg-const:`telegram.InputLocationMessageContent.MIN_HEADING` and - :tg-const:`telegram.InputLocationMessageContent.MAX_HEADING` if specified. - proximity_alert_radius (:obj:`int`, optional): For live locations, a maximum distance - for proximity alerts about approaching another chat member, in meters. Must be - between :tg-const:`telegram.InputLocationMessageContent.MIN_PROXIMITY_ALERT_RADIUS` - and :tg-const:`telegram.InputLocationMessageContent.MAX_PROXIMITY_ALERT_RADIUS` - if specified. - - Attributes: - latitude (:obj:`float`): Latitude of the location in degrees. - longitude (:obj:`float`): Longitude of the location in degrees. - horizontal_accuracy (:obj:`float`): Optional. The radius of uncertainty for the location, - measured in meters; 0- - :tg-const:`telegram.InputLocationMessageContent.HORIZONTAL_ACCURACY`. - live_period (:obj:`int` | :class:`datetime.timedelta`): Optional. Period in seconds for - which the location can be updated, should be between - :tg-const:`telegram.InputLocationMessageContent.MIN_LIVE_PERIOD` and - :tg-const:`telegram.InputLocationMessageContent.MAX_LIVE_PERIOD`. - - .. deprecated:: v22.2 - |time-period-int-deprecated| - heading (:obj:`int`): Optional. For live locations, a direction in which the user is - moving, in degrees. Must be between - :tg-const:`telegram.InputLocationMessageContent.MIN_HEADING` and - :tg-const:`telegram.InputLocationMessageContent.MAX_HEADING` if specified. - proximity_alert_radius (:obj:`int`): Optional. For live locations, a maximum distance - for proximity alerts about approaching another chat member, in meters. Must be - between :tg-const:`telegram.InputLocationMessageContent.MIN_PROXIMITY_ALERT_RADIUS` - and :tg-const:`telegram.InputLocationMessageContent.MAX_PROXIMITY_ALERT_RADIUS` - if specified. - - """ - - __slots__ = ( - "_live_period", - "heading", - "horizontal_accuracy", - "latitude", - "longitude", - "proximity_alert_radius", - ) - # fmt: on - - def __init__( - self, - latitude: float, - longitude: float, - live_period: Optional[TimePeriod] = None, - horizontal_accuracy: Optional[float] = None, - heading: Optional[int] = None, - proximity_alert_radius: Optional[int] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - with self._unfrozen(): - # Required - self.latitude: float = latitude - self.longitude: float = longitude - - # Optionals - self._live_period: Optional[dtm.timedelta] = to_timedelta(live_period) - self.horizontal_accuracy: Optional[float] = horizontal_accuracy - self.heading: Optional[int] = heading - self.proximity_alert_radius: Optional[int] = ( - int(proximity_alert_radius) if proximity_alert_radius else None - ) - - self._id_attrs = (self.latitude, self.longitude) - - @property - def live_period(self) -> Optional[Union[int, dtm.timedelta]]: - return get_timedelta_value(self._live_period, attribute="live_period") - - HORIZONTAL_ACCURACY: Final[int] = constants.LocationLimit.HORIZONTAL_ACCURACY - """:const:`telegram.constants.LocationLimit.HORIZONTAL_ACCURACY` - - .. versionadded:: 20.0 - """ - MIN_HEADING: Final[int] = constants.LocationLimit.MIN_HEADING - """:const:`telegram.constants.LocationLimit.MIN_HEADING` - - .. versionadded:: 20.0 - """ - MAX_HEADING: Final[int] = constants.LocationLimit.MAX_HEADING - """:const:`telegram.constants.LocationLimit.MAX_HEADING` - - .. versionadded:: 20.0 - """ - MIN_LIVE_PERIOD: Final[int] = constants.LocationLimit.MIN_LIVE_PERIOD - """:const:`telegram.constants.LocationLimit.MIN_LIVE_PERIOD` - - .. versionadded:: 20.0 - """ - MAX_LIVE_PERIOD: Final[int] = constants.LocationLimit.MAX_LIVE_PERIOD - """:const:`telegram.constants.LocationLimit.MAX_LIVE_PERIOD` - - .. versionadded:: 20.0 - """ - MIN_PROXIMITY_ALERT_RADIUS: Final[int] = constants.LocationLimit.MIN_PROXIMITY_ALERT_RADIUS - """:const:`telegram.constants.LocationLimit.MIN_PROXIMITY_ALERT_RADIUS` - - .. versionadded:: 20.0 - """ - MAX_PROXIMITY_ALERT_RADIUS: Final[int] = constants.LocationLimit.MAX_PROXIMITY_ALERT_RADIUS - """:const:`telegram.constants.LocationLimit.MAX_PROXIMITY_ALERT_RADIUS` - - .. versionadded:: 20.0 - """ diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/inputmessagecontent.py b/venv/lib/python3.12/site-packages/telegram/_inline/inputmessagecontent.py deleted file mode 100644 index e37fa12..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_inline/inputmessagecontent.py +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the classes that represent Telegram InputMessageContent.""" - -from typing import Optional - -from telegram._telegramobject import TelegramObject -from telegram._utils.types import JSONDict - - -class InputMessageContent(TelegramObject): - """Base class for Telegram InputMessageContent Objects. - - See: :class:`telegram.InputContactMessageContent`, - :class:`telegram.InputInvoiceMessageContent`, - :class:`telegram.InputLocationMessageContent`, :class:`telegram.InputTextMessageContent` and - :class:`telegram.InputVenueMessageContent` for more details. - - """ - - __slots__ = () - - def __init__(self, *, api_kwargs: Optional[JSONDict] = None) -> None: - super().__init__(api_kwargs=api_kwargs) - - self._freeze() diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/inputtextmessagecontent.py b/venv/lib/python3.12/site-packages/telegram/_inline/inputtextmessagecontent.py deleted file mode 100644 index 11a2373..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_inline/inputtextmessagecontent.py +++ /dev/null @@ -1,116 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the classes that represent Telegram InputTextMessageContent.""" -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional - -from telegram._inline.inputmessagecontent import InputMessageContent -from telegram._messageentity import MessageEntity -from telegram._utils.argumentparsing import parse_lpo_and_dwpp, parse_sequence_arg -from telegram._utils.defaultvalue import DEFAULT_NONE -from telegram._utils.types import JSONDict, ODVInput - -if TYPE_CHECKING: - from telegram._linkpreviewoptions import LinkPreviewOptions - - -class InputTextMessageContent(InputMessageContent): - """ - Represents the content of a text message to be sent as the result of an inline query. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`message_text` is equal. - - Examples: - :any:`Inline Bot <examples.inlinebot>` - - Args: - message_text (:obj:`str`): Text of the message to be sent, - :tg-const:`telegram.constants.MessageLimit.MIN_TEXT_LENGTH`- - :tg-const:`telegram.constants.MessageLimit.MAX_TEXT_LENGTH` characters after entities - parsing. - parse_mode (:obj:`str`, optional): |parse_mode| - entities (Sequence[:class:`telegram.MessageEntity`], optional): |caption_entities| - - .. versionchanged:: 20.0 - |sequenceclassargs| - - link_preview_options (:obj:`LinkPreviewOptions`, optional): Link preview generation - options for the message. Mutually exclusive with - :paramref:`disable_web_page_preview`. - - .. versionadded:: 20.8 - - Keyword Args: - disable_web_page_preview (:obj:`bool`, optional): Disables link previews for links in the - sent message. Convenience parameter for setting :paramref:`link_preview_options`. - Mutually exclusive with :paramref:`link_preview_options`. - - .. versionchanged:: 20.8 - Bot API 7.0 introduced :paramref:`link_preview_options` replacing this - argument. PTB will automatically convert this argument to that one, but - for advanced options, please use :paramref:`link_preview_options` directly. - - .. versionchanged:: 21.0 - |keyword_only_arg| - - Attributes: - message_text (:obj:`str`): Text of the message to be sent, - :tg-const:`telegram.constants.MessageLimit.MIN_TEXT_LENGTH`- - :tg-const:`telegram.constants.MessageLimit.MAX_TEXT_LENGTH` characters after entities - parsing. - parse_mode (:obj:`str`): Optional. |parse_mode| - entities (tuple[:class:`telegram.MessageEntity`]): Optional. |captionentitiesattr| - - .. versionchanged:: 20.0 - - * |tupleclassattrs| - * |alwaystuple| - link_preview_options (:obj:`LinkPreviewOptions`): Optional. Link preview generation - options for the message. - - .. versionadded:: 20.8 - - """ - - __slots__ = ("entities", "link_preview_options", "message_text", "parse_mode") - - def __init__( - self, - message_text: str, - parse_mode: ODVInput[str] = DEFAULT_NONE, - entities: Optional[Sequence[MessageEntity]] = None, - link_preview_options: ODVInput["LinkPreviewOptions"] = DEFAULT_NONE, - *, - disable_web_page_preview: Optional[bool] = None, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - - with self._unfrozen(): - # Required - self.message_text: str = message_text - # Optionals - self.parse_mode: ODVInput[str] = parse_mode - self.entities: tuple[MessageEntity, ...] = parse_sequence_arg(entities) - self.link_preview_options: ODVInput[LinkPreviewOptions] = parse_lpo_and_dwpp( - disable_web_page_preview, link_preview_options - ) - - self._id_attrs = (self.message_text,) diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/inputvenuemessagecontent.py b/venv/lib/python3.12/site-packages/telegram/_inline/inputvenuemessagecontent.py deleted file mode 100644 index c836ea1..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_inline/inputvenuemessagecontent.py +++ /dev/null @@ -1,108 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the classes that represent Telegram InputVenueMessageContent.""" -from typing import Optional - -from telegram._inline.inputmessagecontent import InputMessageContent -from telegram._utils.types import JSONDict - - -class InputVenueMessageContent(InputMessageContent): - """Represents the content of a venue message to be sent as the result of an inline query. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`latitude`, :attr:`longitude` and :attr:`title` - are equal. - - Note: - Foursquare details and Google Pace details are mutually exclusive. However, this - behaviour is undocumented and might be changed by Telegram. - - Args: - latitude (:obj:`float`): Latitude of the location in degrees. - longitude (:obj:`float`): Longitude of the location in degrees. - title (:obj:`str`): Name of the venue. - address (:obj:`str`): Address of the venue. - foursquare_id (:obj:`str`, optional): Foursquare identifier of the venue, if known. - foursquare_type (:obj:`str`, optional): Foursquare type of the venue, if known. - (For example, "arts_entertainment/default", "arts_entertainment/aquarium" or - "food/icecream".) - google_place_id (:obj:`str`, optional): Google Places identifier of the venue. - google_place_type (:obj:`str`, optional): Google Places type of the venue. (See - `supported types <https://developers.google.com/maps/documentation/places/web-service\ - /supported_types>`_.) - - Attributes: - latitude (:obj:`float`): Latitude of the location in degrees. - longitude (:obj:`float`): Longitude of the location in degrees. - title (:obj:`str`): Name of the venue. - address (:obj:`str`): Address of the venue. - foursquare_id (:obj:`str`): Optional. Foursquare identifier of the venue, if known. - foursquare_type (:obj:`str`): Optional. Foursquare type of the venue, if known. - (For example, "arts_entertainment/default", "arts_entertainment/aquarium" or - "food/icecream".) - google_place_id (:obj:`str`): Optional. Google Places identifier of the venue. - google_place_type (:obj:`str`): Optional. Google Places type of the venue. (See - `supported types <https://developers.google.com/maps/documentation/places/web-service\ - /supported_types>`_.) - - """ - - __slots__ = ( - "address", - "foursquare_id", - "foursquare_type", - "google_place_id", - "google_place_type", - "latitude", - "longitude", - "title", - ) - - def __init__( - self, - latitude: float, - longitude: float, - title: str, - address: str, - foursquare_id: Optional[str] = None, - foursquare_type: Optional[str] = None, - google_place_id: Optional[str] = None, - google_place_type: Optional[str] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - with self._unfrozen(): - # Required - self.latitude: float = latitude - self.longitude: float = longitude - self.title: str = title - self.address: str = address - # Optionals - self.foursquare_id: Optional[str] = foursquare_id - self.foursquare_type: Optional[str] = foursquare_type - self.google_place_id: Optional[str] = google_place_id - self.google_place_type: Optional[str] = google_place_type - - self._id_attrs = ( - self.latitude, - self.longitude, - self.title, - ) diff --git a/venv/lib/python3.12/site-packages/telegram/_inline/preparedinlinemessage.py b/venv/lib/python3.12/site-packages/telegram/_inline/preparedinlinemessage.py deleted file mode 100644 index ec2f49b..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_inline/preparedinlinemessage.py +++ /dev/null @@ -1,78 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram Prepared inline Message.""" -import datetime as dtm -from typing import TYPE_CHECKING, Optional - -from telegram._telegramobject import TelegramObject -from telegram._utils.datetime import extract_tzinfo_from_defaults, from_timestamp -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot - - -class PreparedInlineMessage(TelegramObject): - """Describes an inline message to be sent by a user of a Mini App. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`id` is equal. - - .. versionadded:: 21.8 - - Args: - id (:obj:`str`): Unique identifier of the prepared message - expiration_date (:class:`datetime.datetime`): Expiration date of the prepared message. - Expired prepared messages can no longer be used. - |datetime_localization| - - Attributes: - id (:obj:`str`): Unique identifier of the prepared message - expiration_date (:class:`datetime.datetime`): Expiration date of the prepared message. - Expired prepared messages can no longer be used. - |datetime_localization| - """ - - __slots__ = ("expiration_date", "id") - - def __init__( - self, - id: str, # pylint: disable=redefined-builtin - expiration_date: dtm.datetime, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.id: str = id - self.expiration_date: dtm.datetime = expiration_date - - self._id_attrs = (self.id,) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "PreparedInlineMessage": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - # Get the local timezone from the bot if it has defaults - loc_tzinfo = extract_tzinfo_from_defaults(bot) - data["expiration_date"] = from_timestamp(data.get("expiration_date"), tzinfo=loc_tzinfo) - - return super().de_json(data=data, bot=bot) diff --git a/venv/lib/python3.12/site-packages/telegram/_keyboardbutton.py b/venv/lib/python3.12/site-packages/telegram/_keyboardbutton.py deleted file mode 100644 index 8fd2984..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_keyboardbutton.py +++ /dev/null @@ -1,193 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram KeyboardButton.""" - -from typing import TYPE_CHECKING, Optional - -from telegram._keyboardbuttonpolltype import KeyboardButtonPollType -from telegram._keyboardbuttonrequest import KeyboardButtonRequestChat, KeyboardButtonRequestUsers -from telegram._telegramobject import TelegramObject -from telegram._utils.argumentparsing import de_json_optional -from telegram._utils.types import JSONDict -from telegram._webappinfo import WebAppInfo - -if TYPE_CHECKING: - from telegram import Bot - - -class KeyboardButton(TelegramObject): - """ - This object represents one button of the reply keyboard. At most one of the optional fields - must be used to specify type of the button. For simple text buttons, :obj:`str` - can be used instead of this object to specify text of the button. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`text`, :attr:`request_contact`, :attr:`request_location`, - :attr:`request_poll`, :attr:`web_app`, :attr:`request_users` and :attr:`request_chat` are - equal. - - Note: - * Optional fields are mutually exclusive. - * :attr:`request_contact` and :attr:`request_location` options will only work in Telegram - versions released after 9 April, 2016. Older clients will display unsupported message. - * :attr:`request_poll` option will only work in Telegram versions released after 23 - January, 2020. Older clients will display unsupported message. - * :attr:`web_app` option will only work in Telegram versions released after 16 April, 2022. - Older clients will display unsupported message. - * :attr:`request_users` and :attr:`request_chat` options will only work in Telegram - versions released after 3 February, 2023. Older clients will display unsupported - message. - - .. versionchanged:: 21.0 - Removed deprecated argument and attribute ``request_user``. - .. versionchanged:: 20.0 - :attr:`web_app` is considered as well when comparing objects of this type in terms of - equality. - .. versionchanged:: 20.5 - :attr:`request_users` and :attr:`request_chat` are considered as well when - comparing objects of this type in terms of equality. - - Args: - text (:obj:`str`): Text of the button. If none of the optional fields are used, it will be - sent to the bot as a message when the button is pressed. - request_contact (:obj:`bool`, optional): If :obj:`True`, the user's phone number will be - sent as a contact when the button is pressed. Available in private chats only. - request_location (:obj:`bool`, optional): If :obj:`True`, the user's current location will - be sent when the button is pressed. Available in private chats only. - request_poll (:class:`~telegram.KeyboardButtonPollType`, optional): If specified, the user - will be asked to create a poll and send it to the bot when the button is pressed. - Available in private chats only. - web_app (:class:`~telegram.WebAppInfo`, optional): If specified, the described `Web App - <https://core.telegram.org/bots/webapps>`_ will be launched when the button is pressed. - The Web App will be able to send a :attr:`Message.web_app_data` service message. - Available in private chats only. - - .. versionadded:: 20.0 - - request_users (:class:`KeyboardButtonRequestUsers`, optional): If specified, pressing the - button will open a list of suitable users. Tapping on any user will send its - identifier to the bot in a :attr:`telegram.Message.users_shared` service message. - Available in private chats only. - - .. versionadded:: 20.8 - request_chat (:class:`KeyboardButtonRequestChat`, optional): If specified, pressing the - button will open a list of suitable chats. Tapping on a chat will send its - identifier to the bot in a :attr:`telegram.Message.chat_shared` service message. - Available in private chats only. - - .. versionadded:: 20.1 - Attributes: - text (:obj:`str`): Text of the button. If none of the optional fields are used, it will be - sent to the bot as a message when the button is pressed. - request_contact (:obj:`bool`): Optional. If :obj:`True`, the user's phone number will be - sent as a contact when the button is pressed. Available in private chats only. - request_location (:obj:`bool`): Optional. If :obj:`True`, the user's current location will - be sent when the button is pressed. Available in private chats only. - request_poll (:class:`~telegram.KeyboardButtonPollType`): Optional. If specified, - the user will be asked to create a poll and send it to the bot when the button is - pressed. Available in private chats only. - web_app (:class:`~telegram.WebAppInfo`): Optional. If specified, the described `Web App - <https://core.telegram.org/bots/webapps>`_ will be launched when the button is pressed. - The Web App will be able to send a :attr:`Message.web_app_data` service message. - Available in private chats only. - - .. versionadded:: 20.0 - request_users (:class:`KeyboardButtonRequestUsers`): Optional. If specified, pressing the - button will open a list of suitable users. Tapping on any user will send its - identifier to the bot in a :attr:`telegram.Message.users_shared` service message. - Available in private chats only. - - .. versionadded:: 20.8 - request_chat (:class:`KeyboardButtonRequestChat`): Optional. If specified, pressing the - button will open a list of suitable chats. Tapping on a chat will send its - identifier to the bot in a :attr:`telegram.Message.chat_shared` service message. - Available in private chats only. - - .. versionadded:: 20.1 - """ - - __slots__ = ( - "request_chat", - "request_contact", - "request_location", - "request_poll", - "request_users", - "text", - "web_app", - ) - - def __init__( - self, - text: str, - request_contact: Optional[bool] = None, - request_location: Optional[bool] = None, - request_poll: Optional[KeyboardButtonPollType] = None, - web_app: Optional[WebAppInfo] = None, - request_chat: Optional[KeyboardButtonRequestChat] = None, - request_users: Optional[KeyboardButtonRequestUsers] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - - # Required - self.text: str = text - # Optionals - self.request_contact: Optional[bool] = request_contact - self.request_location: Optional[bool] = request_location - self.request_poll: Optional[KeyboardButtonPollType] = request_poll - self.web_app: Optional[WebAppInfo] = web_app - self.request_users: Optional[KeyboardButtonRequestUsers] = request_users - self.request_chat: Optional[KeyboardButtonRequestChat] = request_chat - - self._id_attrs = ( - self.text, - self.request_contact, - self.request_location, - self.request_poll, - self.web_app, - self.request_users, - self.request_chat, - ) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "KeyboardButton": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["request_poll"] = de_json_optional( - data.get("request_poll"), KeyboardButtonPollType, bot - ) - data["request_users"] = de_json_optional( - data.get("request_users"), KeyboardButtonRequestUsers, bot - ) - data["request_chat"] = de_json_optional( - data.get("request_chat"), KeyboardButtonRequestChat, bot - ) - data["web_app"] = de_json_optional(data.get("web_app"), WebAppInfo, bot) - - api_kwargs = {} - # This is a deprecated field that TG still returns for backwards compatibility - # Let's filter it out to speed up the de-json process - if request_user := data.get("request_user"): - api_kwargs = {"request_user": request_user} - - return super()._de_json(data=data, bot=bot, api_kwargs=api_kwargs) diff --git a/venv/lib/python3.12/site-packages/telegram/_keyboardbuttonpolltype.py b/venv/lib/python3.12/site-packages/telegram/_keyboardbuttonpolltype.py deleted file mode 100644 index fb21cfe..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_keyboardbuttonpolltype.py +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a type of a Telegram Poll.""" -from typing import Optional - -from telegram._telegramobject import TelegramObject -from telegram._utils import enum -from telegram._utils.types import JSONDict -from telegram.constants import PollType - - -class KeyboardButtonPollType(TelegramObject): - """This object represents type of a poll, which is allowed to be created - and sent when the corresponding button is pressed. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`type` is equal. - - Examples: - :any:`Poll Bot <examples.pollbot>` - - Args: - type (:obj:`str`, optional): If :tg-const:`telegram.Poll.QUIZ` is passed, the user will be - allowed to create only polls in the quiz mode. If :tg-const:`telegram.Poll.REGULAR` is - passed, only regular polls will be allowed. Otherwise, the user will be allowed to - create a poll of any type. - Attributes: - type (:obj:`str`): Optional. If equals :tg-const:`telegram.Poll.QUIZ`, the user will - be allowed to create only polls in the quiz mode. If equals - :tg-const:`telegram.Poll.REGULAR`, only regular polls will be allowed. - Otherwise, the user will be allowed to create a poll of any type. - """ - - __slots__ = ("type",) - - def __init__( - self, - type: Optional[str] = None, # pylint: disable=redefined-builtin - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.type: Optional[str] = enum.get_member(PollType, type, type) - - self._id_attrs = (self.type,) - - self._freeze() diff --git a/venv/lib/python3.12/site-packages/telegram/_keyboardbuttonrequest.py b/venv/lib/python3.12/site-packages/telegram/_keyboardbuttonrequest.py deleted file mode 100644 index 620e6e1..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_keyboardbuttonrequest.py +++ /dev/null @@ -1,272 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains two objects to request chats/users.""" - -from typing import TYPE_CHECKING, Optional - -from telegram._chatadministratorrights import ChatAdministratorRights -from telegram._telegramobject import TelegramObject -from telegram._utils.argumentparsing import de_json_optional -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot - - -class KeyboardButtonRequestUsers(TelegramObject): - """This object defines the criteria used to request a suitable user. The identifier of the - selected user will be shared with the bot when the corresponding button is pressed. `More - about requesting users » <https://core.telegram.org/bots/features#chat-and-user-selection>`_. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`request_id` is equal. - - .. versionadded:: 20.8 - This class was previously named ``KeyboardButtonRequestUser``. - - Args: - request_id (:obj:`int`): Signed 32-bit identifier of the request, which will be received - back in the :class:`telegram.UsersShared` object. Must be unique within the message. - user_is_bot (:obj:`bool`, optional): Pass :obj:`True` to request a bot, pass :obj:`False` - to request a regular user. If not specified, no additional restrictions are applied. - user_is_premium (:obj:`bool`, optional): Pass :obj:`True` to request a premium user, pass - :obj:`False` to request a non-premium user. If not specified, no additional - restrictions are applied. - max_quantity (:obj:`int`, optional): The maximum number of users to be selected; - :tg-const:`telegram.constants.KeyboardButtonRequestUsersLimit.MIN_QUANTITY` - - :tg-const:`telegram.constants.KeyboardButtonRequestUsersLimit.MAX_QUANTITY`. - Defaults to :tg-const:`telegram.constants.KeyboardButtonRequestUsersLimit.MIN_QUANTITY` - . - - .. versionadded:: 20.8 - request_name (:obj:`bool`, optional): Pass :obj:`True` to request the users' first and last - name. - - .. versionadded:: 21.1 - request_username (:obj:`bool`, optional): Pass :obj:`True` to request the users' username. - - .. versionadded:: 21.1 - request_photo (:obj:`bool`, optional): Pass :obj:`True` to request the users' photo. - - .. versionadded:: 21.1 - - Attributes: - request_id (:obj:`int`): Identifier of the request. - user_is_bot (:obj:`bool`): Optional. Pass :obj:`True` to request a bot, pass :obj:`False` - to request a regular user. If not specified, no additional restrictions are applied. - user_is_premium (:obj:`bool`): Optional. Pass :obj:`True` to request a premium user, pass - :obj:`False` to request a non-premium user. If not specified, no additional - restrictions are applied. - max_quantity (:obj:`int`): Optional. The maximum number of users to be selected; - :tg-const:`telegram.constants.KeyboardButtonRequestUsersLimit.MIN_QUANTITY` - - :tg-const:`telegram.constants.KeyboardButtonRequestUsersLimit.MAX_QUANTITY`. - Defaults to :tg-const:`telegram.constants.KeyboardButtonRequestUsersLimit.MIN_QUANTITY` - . - - .. versionadded:: 20.8 - request_name (:obj:`bool`): Optional. Pass :obj:`True` to request the users' first and last - name. - - .. versionadded:: 21.1 - request_username (:obj:`bool`): Optional. Pass :obj:`True` to request the users' username. - - .. versionadded:: 21.1 - request_photo (:obj:`bool`): Optional. Pass :obj:`True` to request the users' photo. - - .. versionadded:: 21.1 - - """ - - __slots__ = ( - "max_quantity", - "request_id", - "request_name", - "request_photo", - "request_username", - "user_is_bot", - "user_is_premium", - ) - - def __init__( - self, - request_id: int, - user_is_bot: Optional[bool] = None, - user_is_premium: Optional[bool] = None, - max_quantity: Optional[int] = None, - request_name: Optional[bool] = None, - request_username: Optional[bool] = None, - request_photo: Optional[bool] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - # Required - self.request_id: int = request_id - - # Optionals - self.user_is_bot: Optional[bool] = user_is_bot - self.user_is_premium: Optional[bool] = user_is_premium - self.max_quantity: Optional[int] = max_quantity - self.request_name: Optional[bool] = request_name - self.request_username: Optional[bool] = request_username - self.request_photo: Optional[bool] = request_photo - - self._id_attrs = (self.request_id,) - - self._freeze() - - -class KeyboardButtonRequestChat(TelegramObject): - """This object defines the criteria used to request a suitable chat. The identifier of the - selected user will be shared with the bot when the corresponding button is pressed. `More - about requesting users » <https://core.telegram.org/bots/features#chat-and-user-selection>`_. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`request_id` is equal. - - .. versionadded:: 20.1 - - Args: - request_id (:obj:`int`): Signed 32-bit identifier of the request, which will be received - back in the :class:`telegram.ChatShared` object. Must be unique within the message. - chat_is_channel (:obj:`bool`): Pass :obj:`True` to request a channel chat, pass - :obj:`False` to request a group or a supergroup chat. - chat_is_forum (:obj:`bool`, optional): Pass :obj:`True` to request a forum supergroup, pass - :obj:`False` to request a non-forum chat. If not specified, no additional - restrictions are applied. - chat_has_username (:obj:`bool`, optional): Pass :obj:`True` to request a supergroup or a - channel with a username, pass :obj:`False` to request a chat without a username. If - not specified, no additional restrictions are applied. - chat_is_created (:obj:`bool`, optional): Pass :obj:`True` to request a chat owned by the - user. Otherwise, no additional restrictions are applied. - user_administrator_rights (:class:`ChatAdministratorRights`, optional): Specifies the - required administrator rights of the user in the chat. If not specified, no additional - restrictions are applied. - bot_administrator_rights (:class:`ChatAdministratorRights`, optional): Specifies the - required administrator rights of the bot in the chat. The rights must be a subset of - :paramref:`user_administrator_rights`. If not specified, no additional restrictions are - applied. - bot_is_member (:obj:`bool`, optional): Pass :obj:`True` to request a chat with the bot - as a member. Otherwise, no additional restrictions are applied. - request_title (:obj:`bool`, optional): Pass :obj:`True` to request the chat's title. - - .. versionadded:: 21.1 - request_username (:obj:`bool`, optional): Pass :obj:`True` to request the chat's username. - - .. versionadded:: 21.1 - request_photo (:obj:`bool`, optional): Pass :obj:`True` to request the chat's photo. - - .. versionadded:: 21.1 - Attributes: - request_id (:obj:`int`): Identifier of the request. - chat_is_channel (:obj:`bool`): Pass :obj:`True` to request a channel chat, pass - :obj:`False` to request a group or a supergroup chat. - chat_is_forum (:obj:`bool`): Optional. Pass :obj:`True` to request a forum supergroup, pass - :obj:`False` to request a non-forum chat. If not specified, no additional - restrictions are applied. - chat_has_username (:obj:`bool`): Optional. Pass :obj:`True` to request a supergroup or a - channel with a username, pass :obj:`False` to request a chat without a username. If - not specified, no additional restrictions are applied. - chat_is_created (:obj:`bool`) Optional. Pass :obj:`True` to request a chat owned by the - user. Otherwise, no additional restrictions are applied. - user_administrator_rights (:class:`ChatAdministratorRights`) Optional. Specifies the - required administrator rights of the user in the chat. If not specified, no additional - restrictions are applied. - bot_administrator_rights (:class:`ChatAdministratorRights`) Optional. Specifies the - required administrator rights of the bot in the chat. The rights must be a subset of - :attr:`user_administrator_rights`. If not specified, no additional restrictions are - applied. - bot_is_member (:obj:`bool`) Optional. Pass :obj:`True` to request a chat with the bot - as a member. Otherwise, no additional restrictions are applied. - request_title (:obj:`bool`): Optional. Pass :obj:`True` to request the chat's title. - - .. versionadded:: 21.1 - request_username (:obj:`bool`): Optional. Pass :obj:`True` to request the chat's username. - - .. versionadded:: 21.1 - request_photo (:obj:`bool`): Optional. Pass :obj:`True` to request the chat's photo. - - .. versionadded:: 21.1 - """ - - __slots__ = ( - "bot_administrator_rights", - "bot_is_member", - "chat_has_username", - "chat_is_channel", - "chat_is_created", - "chat_is_forum", - "request_id", - "request_photo", - "request_title", - "request_username", - "user_administrator_rights", - ) - - def __init__( - self, - request_id: int, - chat_is_channel: bool, - chat_is_forum: Optional[bool] = None, - chat_has_username: Optional[bool] = None, - chat_is_created: Optional[bool] = None, - user_administrator_rights: Optional[ChatAdministratorRights] = None, - bot_administrator_rights: Optional[ChatAdministratorRights] = None, - bot_is_member: Optional[bool] = None, - request_title: Optional[bool] = None, - request_username: Optional[bool] = None, - request_photo: Optional[bool] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - # required - self.request_id: int = request_id - self.chat_is_channel: bool = chat_is_channel - - # optional - self.chat_is_forum: Optional[bool] = chat_is_forum - self.chat_has_username: Optional[bool] = chat_has_username - self.chat_is_created: Optional[bool] = chat_is_created - self.user_administrator_rights: Optional[ChatAdministratorRights] = ( - user_administrator_rights - ) - self.bot_administrator_rights: Optional[ChatAdministratorRights] = bot_administrator_rights - self.bot_is_member: Optional[bool] = bot_is_member - self.request_title: Optional[bool] = request_title - self.request_username: Optional[bool] = request_username - self.request_photo: Optional[bool] = request_photo - - self._id_attrs = (self.request_id,) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "KeyboardButtonRequestChat": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["user_administrator_rights"] = de_json_optional( - data.get("user_administrator_rights"), ChatAdministratorRights, bot - ) - data["bot_administrator_rights"] = de_json_optional( - data.get("bot_administrator_rights"), ChatAdministratorRights, bot - ) - - return super().de_json(data=data, bot=bot) diff --git a/venv/lib/python3.12/site-packages/telegram/_linkpreviewoptions.py b/venv/lib/python3.12/site-packages/telegram/_linkpreviewoptions.py deleted file mode 100644 index 6e28c92..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_linkpreviewoptions.py +++ /dev/null @@ -1,103 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the LinkPreviewOptions class.""" - - -from typing import Optional - -from telegram._telegramobject import TelegramObject -from telegram._utils.defaultvalue import DEFAULT_NONE -from telegram._utils.types import JSONDict, ODVInput - - -class LinkPreviewOptions(TelegramObject): - """ - Describes the options used for link preview generation. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`is_disabled`, :attr:`url`, :attr:`prefer_small_media`, - :attr:`prefer_large_media`, and :attr:`show_above_text` are equal. - - .. versionadded:: 20.8 - - Args: - is_disabled (:obj:`bool`, optional): :obj:`True`, if the link preview is disabled. - url (:obj:`str`, optional): The URL to use for the link preview. If empty, then the first - URL found in the message text will be used. - prefer_small_media (:obj:`bool`, optional): :obj:`True`, if the media in the link preview - is supposed to be shrunk; ignored if the URL isn't explicitly specified or media size - change isn't supported for the preview. - prefer_large_media (:obj:`bool`, optional): :obj:`True`, if the media in the link preview - is supposed to be enlarged; ignored if the URL isn't explicitly specified or media - size change isn't supported for the preview. - show_above_text (:obj:`bool`, optional): :obj:`True`, if the link preview must be shown - above the message text; otherwise, the link preview will be shown below the message - text. - - Attributes: - is_disabled (:obj:`bool`): Optional. :obj:`True`, if the link preview is disabled. - url (:obj:`str`): Optional. The URL to use for the link preview. If empty, then the first - URL found in the message text will be used. - prefer_small_media (:obj:`bool`): Optional. :obj:`True`, if the media in the link preview - is supposed to be shrunk; ignored if the URL isn't explicitly specified or media size - change isn't supported for the preview. - prefer_large_media (:obj:`bool`): Optional. :obj:`True`, if the media in the link preview - is supposed to be enlarged; ignored if the URL isn't explicitly specified or media size - change isn't supported for the preview. - show_above_text (:obj:`bool`): Optional. :obj:`True`, if the link preview must be shown - above the message text; otherwise, the link preview will be shown below the message - text. - """ - - __slots__ = ( - "is_disabled", - "prefer_large_media", - "prefer_small_media", - "show_above_text", - "url", - ) - - def __init__( - self, - is_disabled: ODVInput[bool] = DEFAULT_NONE, - url: ODVInput[str] = DEFAULT_NONE, - prefer_small_media: ODVInput[bool] = DEFAULT_NONE, - prefer_large_media: ODVInput[bool] = DEFAULT_NONE, - show_above_text: ODVInput[bool] = DEFAULT_NONE, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - - # Optionals - - self.is_disabled: ODVInput[bool] = is_disabled - self.url: ODVInput[str] = url - self.prefer_small_media: ODVInput[bool] = prefer_small_media - self.prefer_large_media: ODVInput[bool] = prefer_large_media - self.show_above_text: ODVInput[bool] = show_above_text - - self._id_attrs = ( - self.is_disabled, - self.url, - self.prefer_small_media, - self.prefer_large_media, - self.show_above_text, - ) - self._freeze() diff --git a/venv/lib/python3.12/site-packages/telegram/_loginurl.py b/venv/lib/python3.12/site-packages/telegram/_loginurl.py deleted file mode 100644 index 3400542..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_loginurl.py +++ /dev/null @@ -1,105 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram LoginUrl.""" -from typing import Optional - -from telegram._telegramobject import TelegramObject -from telegram._utils.types import JSONDict - - -class LoginUrl(TelegramObject): - """This object represents a parameter of the inline keyboard button used to automatically - authorize a user. Serves as a great replacement for the Telegram Login Widget when the user is - coming from Telegram. All the user needs to do is tap/click a button and confirm that they want - to log in. Telegram apps support these buttons as of version 5.7. - - Sample bot: `@discussbot <https://t.me/discussbot>`_ - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`url` is equal. - - Note: - You must always check the hash of the received data to verify the authentication - and the integrity of the data as described in - `Checking authorization <https://core.telegram.org/widgets/login#checking-authorization>`_ - - Args: - url (:obj:`str`): An HTTPS URL to be opened with user authorization data added to the query - string when the button is pressed. If the user refuses to provide authorization data, - the original URL without information about the user will be opened. The data added is - the same as described in - `Receiving authorization data - <https://core.telegram.org/widgets/login#receiving-authorization-data>`_. - forward_text (:obj:`str`, optional): New text of the button in forwarded messages. - bot_username (:obj:`str`, optional): Username of a bot, which will be used for user - authorization. See - `Setting up a bot <https://core.telegram.org/widgets/login#setting-up-a-bot>`_ - for more details. If not specified, the current - bot's username will be assumed. The url's domain must be the same as the domain linked - with the bot. See - `Linking your domain to the bot - <https://core.telegram.org/widgets/login#linking-your-domain-to-the-bot>`_ - for more details. - request_write_access (:obj:`bool`, optional): Pass :obj:`True` to request the permission - for your bot to send messages to the user. - - Attributes: - url (:obj:`str`): An HTTPS URL to be opened with user authorization data added to the query - string when the button is pressed. If the user refuses to provide authorization data, - the original URL without information about the user will be opened. The data added is - the same as described in - `Receiving authorization data - <https://core.telegram.org/widgets/login#receiving-authorization-data>`_. - forward_text (:obj:`str`): Optional. New text of the button in forwarded messages. - bot_username (:obj:`str`): Optional. Username of a bot, which will be used for user - authorization. See - `Setting up a bot <https://core.telegram.org/widgets/login#setting-up-a-bot>`_ - for more details. If not specified, the current - bot's username will be assumed. The url's domain must be the same as the domain linked - with the bot. See - `Linking your domain to the bot - <https://core.telegram.org/widgets/login#linking-your-domain-to-the-bot>`_ - for more details. - request_write_access (:obj:`bool`): Optional. Pass :obj:`True` to request the permission - for your bot to send messages to the user. - - """ - - __slots__ = ("bot_username", "forward_text", "request_write_access", "url") - - def __init__( - self, - url: str, - forward_text: Optional[str] = None, - bot_username: Optional[str] = None, - request_write_access: Optional[bool] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - # Required - self.url: str = url - # Optional - self.forward_text: Optional[str] = forward_text - self.bot_username: Optional[str] = bot_username - self.request_write_access: Optional[bool] = request_write_access - - self._id_attrs = (self.url,) - - self._freeze() diff --git a/venv/lib/python3.12/site-packages/telegram/_menubutton.py b/venv/lib/python3.12/site-packages/telegram/_menubutton.py deleted file mode 100644 index fb59a56..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_menubutton.py +++ /dev/null @@ -1,189 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains objects related to Telegram menu buttons.""" -from typing import TYPE_CHECKING, Final, Optional - -from telegram import constants -from telegram._telegramobject import TelegramObject -from telegram._utils import enum -from telegram._utils.argumentparsing import de_json_optional -from telegram._utils.types import JSONDict -from telegram._webappinfo import WebAppInfo - -if TYPE_CHECKING: - from telegram import Bot - - -class MenuButton(TelegramObject): - """This object describes the bot's menu button in a private chat. It should be one of - - * :class:`telegram.MenuButtonCommands` - * :class:`telegram.MenuButtonWebApp` - * :class:`telegram.MenuButtonDefault` - - If a menu button other than :class:`telegram.MenuButtonDefault` is set for a private chat, - then it is applied in the chat. Otherwise the default menu button is applied. By default, the - menu button opens the list of bot commands. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`type` is equal. For subclasses with additional attributes, - the notion of equality is overridden. - - .. versionadded:: 20.0 - - Args: - type (:obj:`str`): Type of menu button that the instance represents. - - Attributes: - type (:obj:`str`): Type of menu button that the instance represents. - """ - - __slots__ = ("type",) - - def __init__( - self, - type: str, - *, - api_kwargs: Optional[JSONDict] = None, - ): # pylint: disable=redefined-builtin - super().__init__(api_kwargs=api_kwargs) - self.type: str = enum.get_member(constants.MenuButtonType, type, type) - - self._id_attrs = (self.type,) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "MenuButton": - """Converts JSON data to the appropriate :class:`MenuButton` object, i.e. takes - care of selecting the correct subclass. - - Args: - data (dict[:obj:`str`, ...]): The JSON data. - bot (:class:`telegram.Bot`, optional): The bot associated with this object. Defaults to - :obj:`None`, in which case shortcut methods will not be available. - - .. versionchanged:: 21.4 - :paramref:`bot` is now optional and defaults to :obj:`None` - - Returns: - The Telegram object. - - """ - data = cls._parse_data(data) - - _class_mapping: dict[str, type[MenuButton]] = { - cls.COMMANDS: MenuButtonCommands, - cls.WEB_APP: MenuButtonWebApp, - cls.DEFAULT: MenuButtonDefault, - } - - if cls is MenuButton and data.get("type") in _class_mapping: - return _class_mapping[data.pop("type")].de_json(data, bot=bot) - return super().de_json(data=data, bot=bot) - - COMMANDS: Final[str] = constants.MenuButtonType.COMMANDS - """:const:`telegram.constants.MenuButtonType.COMMANDS`""" - WEB_APP: Final[str] = constants.MenuButtonType.WEB_APP - """:const:`telegram.constants.MenuButtonType.WEB_APP`""" - DEFAULT: Final[str] = constants.MenuButtonType.DEFAULT - """:const:`telegram.constants.MenuButtonType.DEFAULT`""" - - -class MenuButtonCommands(MenuButton): - """Represents a menu button, which opens the bot's list of commands. - - .. include:: inclusions/menu_button_command_video.rst - - .. versionadded:: 20.0 - Attributes: - type (:obj:`str`): :tg-const:`telegram.constants.MenuButtonType.COMMANDS`. - """ - - __slots__ = () - - def __init__(self, *, api_kwargs: Optional[JSONDict] = None): - super().__init__(type=constants.MenuButtonType.COMMANDS, api_kwargs=api_kwargs) - self._freeze() - - -class MenuButtonWebApp(MenuButton): - """Represents a menu button, which launches a - `Web App <https://core.telegram.org/bots/webapps>`_. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`type`, :attr:`text` and :attr:`web_app` - are equal. - - .. versionadded:: 20.0 - - Args: - text (:obj:`str`): Text of the button. - web_app (:class:`telegram.WebAppInfo`): Description of the Web App that will be launched - when the user presses the button. The Web App will be able to send an arbitrary - message on behalf of the user using the method :meth:`~telegram.Bot.answerWebAppQuery` - of :class:`~telegram.Bot`. Alternatively, a ``t.me`` link to a Web App of the bot can - be specified in the object instead of the Web App's URL, in which case the Web App - will be opened as if the user pressed the link. - - - Attributes: - type (:obj:`str`): :tg-const:`telegram.constants.MenuButtonType.WEB_APP`. - text (:obj:`str`): Text of the button. - web_app (:class:`telegram.WebAppInfo`): Description of the Web App that will be launched - when the user presses the button. The Web App will be able to send an arbitrary - message on behalf of the user using the method :meth:`~telegram.Bot.answerWebAppQuery` - of :class:`~telegram.Bot`. Alternatively, a ``t.me`` link to a Web App of the bot can - be specified in the object instead of the Web App's URL, in which case the Web App - will be opened as if the user pressed the link. - """ - - __slots__ = ("text", "web_app") - - def __init__(self, text: str, web_app: WebAppInfo, *, api_kwargs: Optional[JSONDict] = None): - super().__init__(type=constants.MenuButtonType.WEB_APP, api_kwargs=api_kwargs) - with self._unfrozen(): - self.text: str = text - self.web_app: WebAppInfo = web_app - - self._id_attrs = (self.type, self.text, self.web_app) - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "MenuButtonWebApp": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["web_app"] = de_json_optional(data.get("web_app"), WebAppInfo, bot) - - return super().de_json(data=data, bot=bot) # type: ignore[return-value] - - -class MenuButtonDefault(MenuButton): - """Describes that no specific value for the menu button was set. - - .. versionadded:: 20.0 - Attributes: - type (:obj:`str`): :tg-const:`telegram.constants.MenuButtonType.DEFAULT`. - """ - - __slots__ = () - - def __init__(self, *, api_kwargs: Optional[JSONDict] = None): - super().__init__(type=constants.MenuButtonType.DEFAULT, api_kwargs=api_kwargs) - self._freeze() diff --git a/venv/lib/python3.12/site-packages/telegram/_message.py b/venv/lib/python3.12/site-packages/telegram/_message.py deleted file mode 100644 index 274089b..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_message.py +++ /dev/null @@ -1,5203 +0,0 @@ -#!/usr/bin/env python -# pylint: disable=too-many-instance-attributes, too-many-arguments -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram Message.""" - -import datetime as dtm -import re -from collections.abc import Sequence -from html import escape -from typing import TYPE_CHECKING, Optional, TypedDict, Union - -from telegram._chat import Chat -from telegram._chatbackground import ChatBackground -from telegram._chatboost import ChatBoostAdded -from telegram._dice import Dice -from telegram._files.animation import Animation -from telegram._files.audio import Audio -from telegram._files.contact import Contact -from telegram._files.document import Document -from telegram._files.location import Location -from telegram._files.photosize import PhotoSize -from telegram._files.sticker import Sticker -from telegram._files.venue import Venue -from telegram._files.video import Video -from telegram._files.videonote import VideoNote -from telegram._files.voice import Voice -from telegram._forumtopic import ( - ForumTopicClosed, - ForumTopicCreated, - ForumTopicEdited, - ForumTopicReopened, - GeneralForumTopicHidden, - GeneralForumTopicUnhidden, -) -from telegram._games.game import Game -from telegram._gifts import GiftInfo -from telegram._inline.inlinekeyboardmarkup import InlineKeyboardMarkup -from telegram._linkpreviewoptions import LinkPreviewOptions -from telegram._messageautodeletetimerchanged import MessageAutoDeleteTimerChanged -from telegram._messageentity import MessageEntity -from telegram._paidmedia import PaidMediaInfo -from telegram._paidmessagepricechanged import PaidMessagePriceChanged -from telegram._passport.passportdata import PassportData -from telegram._payment.invoice import Invoice -from telegram._payment.refundedpayment import RefundedPayment -from telegram._payment.successfulpayment import SuccessfulPayment -from telegram._poll import Poll -from telegram._proximityalerttriggered import ProximityAlertTriggered -from telegram._reply import ReplyParameters -from telegram._shared import ChatShared, UsersShared -from telegram._story import Story -from telegram._telegramobject import TelegramObject -from telegram._uniquegift import UniqueGiftInfo -from telegram._user import User -from telegram._utils.argumentparsing import de_json_optional, de_list_optional, parse_sequence_arg -from telegram._utils.datetime import extract_tzinfo_from_defaults, from_timestamp -from telegram._utils.defaultvalue import DEFAULT_NONE, DefaultValue -from telegram._utils.entities import parse_message_entities, parse_message_entity -from telegram._utils.strings import TextEncoding -from telegram._utils.types import ( - CorrectOptionID, - FileInput, - JSONDict, - MarkdownVersion, - ODVInput, - ReplyMarkup, - TimePeriod, -) -from telegram._utils.warnings import warn -from telegram._videochat import ( - VideoChatEnded, - VideoChatParticipantsInvited, - VideoChatScheduled, - VideoChatStarted, -) -from telegram._webappdata import WebAppData -from telegram._writeaccessallowed import WriteAccessAllowed -from telegram.constants import ZERO_DATE, MessageAttachmentType, ParseMode -from telegram.helpers import escape_markdown -from telegram.warnings import PTBDeprecationWarning - -if TYPE_CHECKING: - from telegram import ( - Bot, - ExternalReplyInfo, - GameHighScore, - Giveaway, - GiveawayCompleted, - GiveawayCreated, - GiveawayWinners, - InputMedia, - InputMediaAudio, - InputMediaDocument, - InputMediaPhoto, - InputMediaVideo, - InputPaidMedia, - InputPollOption, - LabeledPrice, - MessageId, - MessageOrigin, - ReactionType, - TextQuote, - ) - - -class _ReplyKwargs(TypedDict): - __slots__ = ("chat_id", "reply_parameters") # type: ignore[misc] - - chat_id: Union[str, int] - reply_parameters: ReplyParameters - - -class MaybeInaccessibleMessage(TelegramObject): - """Base class for Telegram Message Objects. - - Currently, that includes :class:`telegram.Message` and :class:`telegram.InaccessibleMessage`. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`message_id` and :attr:`chat` are equal - - .. versionchanged:: 21.0 - ``__bool__`` is no longer overriden and defaults to Pythons standard implementation. - - .. versionadded:: 20.8 - - Args: - message_id (:obj:`int`): Unique message identifier. - date (:class:`datetime.datetime`): Date the message was sent in Unix time or 0 in Unix - time. Converted to :class:`datetime.datetime` - - |datetime_localization| - chat (:class:`telegram.Chat`): Conversation the message belongs to. - - Attributes: - message_id (:obj:`int`): Unique message identifier. - date (:class:`datetime.datetime`): Date the message was sent in Unix time or 0 in Unix - time. Converted to :class:`datetime.datetime` - - |datetime_localization| - chat (:class:`telegram.Chat`): Conversation the message belongs to. - """ - - __slots__ = ("chat", "date", "message_id") - - def __init__( - self, - chat: Chat, - message_id: int, - date: dtm.datetime, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.chat: Chat = chat - self.message_id: int = message_id - self.date: dtm.datetime = date - - self._id_attrs = (self.message_id, self.chat) - - self._freeze() - - @property - def is_accessible(self) -> bool: - """Convenience attribute. :obj:`True`, if the date is not 0 in Unix time. - - .. versionadded:: 20.8 - """ - # Once we drop support for python 3.9, this can be made a TypeGuard function: - # def is_accessible(self) -> TypeGuard[Message]: - return self.date != ZERO_DATE - - @classmethod - def _de_json( - cls, - data: Optional[JSONDict], - bot: Optional["Bot"] = None, - api_kwargs: Optional[JSONDict] = None, - ) -> Optional["MaybeInaccessibleMessage"]: - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - if cls is MaybeInaccessibleMessage: - if data["date"] == 0: - return InaccessibleMessage.de_json(data=data, bot=bot) - return Message.de_json(data=data, bot=bot) - - # Get the local timezone from the bot if it has defaults - loc_tzinfo = extract_tzinfo_from_defaults(bot) - - # this is to include the Literal from InaccessibleMessage - if data["date"] == 0: - data["date"] = ZERO_DATE - else: - data["date"] = from_timestamp(data.get("date"), tzinfo=loc_tzinfo) - - data["chat"] = de_json_optional(data.get("chat"), Chat, bot) - return super()._de_json(data=data, bot=bot, api_kwargs=api_kwargs) - - -class InaccessibleMessage(MaybeInaccessibleMessage): - """This object represents an inaccessible message. - - These are messages that are e.g. deleted. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`message_id` and :attr:`chat` are equal - - .. versionadded:: 20.8 - - Args: - message_id (:obj:`int`): Unique message identifier. - chat (:class:`telegram.Chat`): Chat the message belongs to. - - Attributes: - message_id (:obj:`int`): Unique message identifier. - date (:class:`constants.ZERO_DATE`): Always :tg-const:`telegram.constants.ZERO_DATE`. - The field can be used to differentiate regular and inaccessible messages. - chat (:class:`telegram.Chat`): Chat the message belongs to. - """ - - __slots__ = () - - def __init__( - self, - chat: Chat, - message_id: int, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(chat=chat, message_id=message_id, date=ZERO_DATE, api_kwargs=api_kwargs) - self._freeze() - - -class Message(MaybeInaccessibleMessage): - # fmt: off - """This object represents a message. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`message_id` and :attr:`chat` are equal. - - Note: - In Python :keyword:`from` is a reserved word. Use :paramref:`from_user` instead. - - .. versionchanged:: 21.0 - Removed deprecated arguments and attributes ``user_shared``, ``forward_from``, - ``forward_from_chat``, ``forward_from_message_id``, ``forward_signature``, - ``forward_sender_name`` and ``forward_date``. - - .. versionchanged:: 20.8 - * This class is now a subclass of :class:`telegram.MaybeInaccessibleMessage`. - * The :paramref:`pinned_message` now can be either :class:`telegram.Message` or - :class:`telegram.InaccessibleMessage`. - - .. versionchanged:: 20.0 - - * The arguments and attributes ``voice_chat_scheduled``, ``voice_chat_started`` and - ``voice_chat_ended``, ``voice_chat_participants_invited`` were renamed to - :paramref:`video_chat_scheduled`/:attr:`video_chat_scheduled`, - :paramref:`video_chat_started`/:attr:`video_chat_started`, - :paramref:`video_chat_ended`/:attr:`video_chat_ended` and - :paramref:`video_chat_participants_invited`/:attr:`video_chat_participants_invited`, - respectively, in accordance to Bot API 6.0. - * The following are now keyword-only arguments in Bot methods: - ``{read, write, connect, pool}_timeout``, ``api_kwargs``, ``contact``, ``quote``, - ``filename``, ``loaction``, ``venue``. Use a named argument for those, - and notice that some positional arguments changed position as a result. - - Args: - message_id (:obj:`int`): Unique message identifier inside this chat. In specific instances - (e.g., message containing a video sent to a big chat), the server might automatically - schedule a message instead of sending it immediately. In such cases, this field will be - ``0`` and the relevant message will be unusable until it is actually sent. - from_user (:class:`telegram.User`, optional): Sender of the message; may be empty for - messages sent to channels. For backward compatibility, if the message was sent on - behalf of a chat, the field contains a fake sender user in non-channel chats. - sender_chat (:class:`telegram.Chat`, optional): Sender of the message when sent on behalf - of a chat. For example, the supergroup itself for messages sent by its anonymous - administrators or a linked channel for messages automatically forwarded to the - channel's discussion group. For backward compatibility, if the message was sent on - behalf of a chat, the field from contains a fake sender user in non-channel chats. - date (:class:`datetime.datetime`): Date the message was sent in Unix time. Converted to - :class:`datetime.datetime`. - - .. versionchanged:: 20.3 - |datetime_localization| - chat (:class:`telegram.Chat`): Conversation the message belongs to. - is_automatic_forward (:obj:`bool`, optional): :obj:`True`, if the message is a channel - post that was automatically forwarded to the connected discussion group. - - .. versionadded:: 13.9 - reply_to_message (:class:`telegram.Message`, optional): For replies, the original message. - Note that the Message object in this field will not contain further - ``reply_to_message`` fields even if it itself is a reply. - edit_date (:class:`datetime.datetime`, optional): Date the message was last edited in Unix - time. Converted to :class:`datetime.datetime`. - - .. versionchanged:: 20.3 - |datetime_localization| - has_protected_content (:obj:`bool`, optional): :obj:`True`, if the message can't be - forwarded. - - .. versionadded:: 13.9 - is_from_offline (:obj:`bool`, optional): :obj:`True`, if the message was sent - by an implicit action, for example, as an away or a greeting business message, - or as a scheduled message. - - .. versionadded:: 21.1 - media_group_id (:obj:`str`, optional): The unique identifier of a media message group this - message belongs to. - text (:obj:`str`, optional): For text messages, the actual UTF-8 text of the message, - 0-:tg-const:`telegram.constants.MessageLimit.MAX_TEXT_LENGTH` characters. - entities (Sequence[:class:`telegram.MessageEntity`], optional): For text messages, special - entities like usernames, URLs, bot commands, etc. that appear in the text. See - :attr:`parse_entity` and :attr:`parse_entities` methods for how to use properly. - This list is empty if the message does not contain entities. - - .. versionchanged:: 20.0 - |sequenceclassargs| - - link_preview_options (:class:`telegram.LinkPreviewOptions`, optional): Options used for - link preview generation for the message, if it is a text message and link preview - options were changed. - - .. versionadded:: 20.8 - - effect_id (:obj:`str`, optional): Unique identifier of the message effect added to the - message. - - .. versionadded:: 21.3 - - caption_entities (Sequence[:class:`telegram.MessageEntity`], optional): For messages with a - Caption. Special entities like usernames, URLs, bot commands, etc. that appear in the - caption. See :attr:`Message.parse_caption_entity` and :attr:`parse_caption_entities` - methods for how to use properly. This list is empty if the message does not contain - caption entities. - - .. versionchanged:: 20.0 - |sequenceclassargs| - - show_caption_above_media (:obj:`bool`, optional): |show_cap_above_med| - - .. versionadded:: 21.3 - audio (:class:`telegram.Audio`, optional): Message is an audio file, information - about the file. - document (:class:`telegram.Document`, optional): Message is a general file, information - about the file. - animation (:class:`telegram.Animation`, optional): Message is an animation, information - about the animation. For backward compatibility, when this field is set, the document - field will also be set. - game (:class:`telegram.Game`, optional): Message is a game, information about the game. - :ref:`More about games >> <games-tree>`. - photo (Sequence[:class:`telegram.PhotoSize`], optional): Message is a photo, available - sizes of the photo. This list is empty if the message does not contain a photo. - - .. versionchanged:: 20.0 - |sequenceclassargs| - - sticker (:class:`telegram.Sticker`, optional): Message is a sticker, information - about the sticker. - story (:class:`telegram.Story`, optional): Message is a forwarded story. - - .. versionadded:: 20.5 - video (:class:`telegram.Video`, optional): Message is a video, information about the - video. - voice (:class:`telegram.Voice`, optional): Message is a voice message, information about - the file. - video_note (:class:`telegram.VideoNote`, optional): Message is a - `video note <https://telegram.org/blog/video-messages-and-telescope>`_, information - about the video message. - new_chat_members (Sequence[:class:`telegram.User`], optional): New members that were added - to the group or supergroup and information about them (the bot itself may be one of - these members). This list is empty if the message does not contain new chat members. - - .. versionchanged:: 20.0 - |sequenceclassargs| - - caption (:obj:`str`, optional): Caption for the animation, audio, document, paid media, - photo, video - or voice, 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters. - contact (:class:`telegram.Contact`, optional): Message is a shared contact, information - about the contact. - location (:class:`telegram.Location`, optional): Message is a shared location, information - about the location. - venue (:class:`telegram.Venue`, optional): Message is a venue, information about the - venue. For backward compatibility, when this field is set, the location field will - also be set. - left_chat_member (:class:`telegram.User`, optional): A member was removed from the group, - information about them (this member may be the bot itself). - new_chat_title (:obj:`str`, optional): A chat title was changed to this value. - new_chat_photo (Sequence[:class:`telegram.PhotoSize`], optional): A chat photo was changed - to this value. This list is empty if the message does not contain a new chat photo. - - .. versionchanged:: 20.0 - |sequenceclassargs| - - delete_chat_photo (:obj:`bool`, optional): Service message: The chat photo was deleted. - group_chat_created (:obj:`bool`, optional): Service message: The group has been created. - supergroup_chat_created (:obj:`bool`, optional): Service message: The supergroup has been - created. This field can't be received in a message coming through updates, because bot - can't be a member of a supergroup when it is created. It can only be found in - :attr:`reply_to_message` if someone replies to a very first message in a directly - created supergroup. - channel_chat_created (:obj:`bool`, optional): Service message: The channel has been - created. This field can't be received in a message coming through updates, because bot - can't be a member of a channel when it is created. It can only be found in - :attr:`reply_to_message` if someone replies to a very first message in a channel. - message_auto_delete_timer_changed (:class:`telegram.MessageAutoDeleteTimerChanged`, \ - optional): Service message: auto-delete timer settings changed in the chat. - - .. versionadded:: 13.4 - migrate_to_chat_id (:obj:`int`, optional): The group has been migrated to a supergroup - with the specified identifier. - migrate_from_chat_id (:obj:`int`, optional): The supergroup has been migrated from a group - with the specified identifier. - pinned_message (:class:`telegram.MaybeInaccessibleMessage`, optional): Specified message - was pinned. Note that the Message object in this field will not contain further - :attr:`reply_to_message` fields even if it is itself a reply. - - .. versionchanged:: 20.8 - This attribute now is either :class:`telegram.Message` or - :class:`telegram.InaccessibleMessage`. - invoice (:class:`telegram.Invoice`, optional): Message is an invoice for a payment, - information about the invoice. - :ref:`More about payments >> <payments-tree>`. - successful_payment (:class:`telegram.SuccessfulPayment`, optional): Message is a service - message about a successful payment, information about the payment. - :ref:`More about payments >> <payments-tree>`. - connected_website (:obj:`str`, optional): The domain name of the website on which the user - has logged in. - `More about Telegram Login >> <https://core.telegram.org/widgets/login>`_. - author_signature (:obj:`str`, optional): Signature of the post author for messages in - channels, or the custom title of an anonymous group administrator. - paid_star_count (:obj:`int`, optional): The number of Telegram Stars that were paid by the - sender of the message to send it - - .. versionadded:: 22.1 - passport_data (:class:`telegram.PassportData`, optional): Telegram Passport data. - poll (:class:`telegram.Poll`, optional): Message is a native poll, - information about the poll. - dice (:class:`telegram.Dice`, optional): Message is a dice with random value. - via_bot (:class:`telegram.User`, optional): Bot through which message was sent. - proximity_alert_triggered (:class:`telegram.ProximityAlertTriggered`, optional): Service - message. A user in the chat triggered another user's proximity alert while sharing - Live Location. - video_chat_scheduled (:class:`telegram.VideoChatScheduled`, optional): Service message: - video chat scheduled. - - .. versionadded:: 20.0 - video_chat_started (:class:`telegram.VideoChatStarted`, optional): Service message: video - chat started. - - .. versionadded:: 20.0 - video_chat_ended (:class:`telegram.VideoChatEnded`, optional): Service message: video chat - ended. - - .. versionadded:: 20.0 - video_chat_participants_invited (:class:`telegram.VideoChatParticipantsInvited` optional): - Service message: new participants invited to a video chat. - - .. versionadded:: 20.0 - web_app_data (:class:`telegram.WebAppData`, optional): Service message: data sent by a Web - App. - - .. versionadded:: 20.0 - reply_markup (:class:`telegram.InlineKeyboardMarkup`, optional): Inline keyboard attached - to the message. :paramref:`~telegram.InlineKeyboardButton.login_url` buttons are - represented as ordinary url buttons. - is_topic_message (:obj:`bool`, optional): :obj:`True`, if the message is sent to a forum - topic. - - .. versionadded:: 20.0 - message_thread_id (:obj:`int`, optional): Unique identifier of a message thread to which - the message belongs; for supergroups only. - - .. versionadded:: 20.0 - forum_topic_created (:class:`telegram.ForumTopicCreated`, optional): Service message: - forum topic created. - - .. versionadded:: 20.0 - forum_topic_closed (:class:`telegram.ForumTopicClosed`, optional): Service message: - forum topic closed. - - .. versionadded:: 20.0 - forum_topic_reopened (:class:`telegram.ForumTopicReopened`, optional): Service message: - forum topic reopened. - - .. versionadded:: 20.0 - forum_topic_edited (:class:`telegram.ForumTopicEdited`, optional): Service message: - forum topic edited. - - .. versionadded:: 20.0 - general_forum_topic_hidden (:class:`telegram.GeneralForumTopicHidden`, optional): - Service message: General forum topic hidden. - - .. versionadded:: 20.0 - general_forum_topic_unhidden (:class:`telegram.GeneralForumTopicUnhidden`, optional): - Service message: General forum topic unhidden. - - .. versionadded:: 20.0 - write_access_allowed (:class:`telegram.WriteAccessAllowed`, optional): Service message: - the user allowed the bot to write messages after adding it to the attachment or side - menu, launching a Web App from a link, or accepting an explicit request from a Web App - sent by the method - `requestWriteAccess <https://core.telegram.org/bots/webapps#initializing-mini-apps>`_. - - .. versionadded:: 20.0 - has_media_spoiler (:obj:`bool`, optional): :obj:`True`, if the message media is covered - by a spoiler animation. - - .. versionadded:: 20.0 - users_shared (:class:`telegram.UsersShared`, optional): Service message: users were shared - with the bot - - .. versionadded:: 20.8 - chat_shared (:class:`telegram.ChatShared`, optional):Service message: a chat was shared - with the bot. - - .. versionadded:: 20.1 - gift (:class:`telegram.GiftInfo`, optional): Service message: a regular gift was sent - or received. - - .. versionadded:: 22.1 - unique_gift (:class:`telegram.UniqueGiftInfo`, optional): Service message: a unique gift - was sent or received - - .. versionadded:: 22.1 - giveaway_created (:class:`telegram.GiveawayCreated`, optional): Service message: a - scheduled giveaway was created - - .. versionadded:: 20.8 - giveaway (:class:`telegram.Giveaway`, optional): The message is a scheduled giveaway - message - - .. versionadded:: 20.8 - giveaway_winners (:class:`telegram.GiveawayWinners`, optional): A giveaway with public - winners was completed - - .. versionadded:: 20.8 - giveaway_completed (:class:`telegram.GiveawayCompleted`, optional): Service message: a - giveaway without public winners was completed - - .. versionadded:: 20.8 - paid_message_price_changed (:class:`telegram.PaidMessagePriceChanged`, optional): Service - message: the price for paid messages has changed in the chat - - .. versionadded:: 22.1 - external_reply (:class:`telegram.ExternalReplyInfo`, optional): Information about the - message that is being replied to, which may come from another chat or forum topic. - - .. versionadded:: 20.8 - quote (:class:`telegram.TextQuote`, optional): For replies that quote part of the original - message, the quoted part of the message. - - .. versionadded:: 20.8 - forward_origin (:class:`telegram.MessageOrigin`, optional): Information about the original - message for forwarded messages - - .. versionadded:: 20.8 - reply_to_story (:class:`telegram.Story`, optional): For replies to a story, the original - story. - - .. versionadded:: 21.0 - boost_added (:class:`telegram.ChatBoostAdded`, optional): Service message: user boosted - the chat. - - .. versionadded:: 21.0 - sender_boost_count (:obj:`int`, optional): If the sender of the - message boosted the chat, the number of boosts added by the user. - - .. versionadded:: 21.0 - business_connection_id (:obj:`str`, optional): Unique identifier of the business connection - from which the message was received. If non-empty, the message belongs to a chat of the - corresponding business account that is independent from any potential bot chat which - might share the same identifier. - - .. versionadded:: 21.1 - - sender_business_bot (:class:`telegram.User`, optional): The bot that actually sent the - message on behalf of the business account. Available only for outgoing messages sent - on behalf of the connected business account. - - .. versionadded:: 21.1 - - chat_background_set (:class:`telegram.ChatBackground`, optional): Service message: chat - background set. - - .. versionadded:: 21.2 - paid_media (:class:`telegram.PaidMediaInfo`, optional): Message contains paid media; - information about the paid media. - - .. versionadded:: 21.4 - refunded_payment (:class:`telegram.RefundedPayment`, optional): Message is a service - message about a refunded payment, information about the payment. - - .. versionadded:: 21.4 - - Attributes: - message_id (:obj:`int`): Unique message identifier inside this chat. In specific instances - (e.g., message containing a video sent to a big chat), the server might automatically - schedule a message instead of sending it immediately. In such cases, this field will be - ``0`` and the relevant message will be unusable until it is actually sent. - from_user (:class:`telegram.User`): Optional. Sender of the message; may be empty for - messages sent to channels. For backward compatibility, if the message was sent on - behalf of a chat, the field contains a fake sender user in non-channel chats. - sender_chat (:class:`telegram.Chat`): Optional. Sender of the message when sent on behalf - of a chat. For example, the supergroup itself for messages sent by its anonymous - administrators or a linked channel for messages automatically forwarded to the - channel's discussion group. For backward compatibility, if the message was sent on - behalf of a chat, the field from contains a fake sender user in non-channel chats. - date (:class:`datetime.datetime`): Date the message was sent in Unix time. Converted to - :class:`datetime.datetime`. - - .. versionchanged:: 20.3 - |datetime_localization| - chat (:class:`telegram.Chat`): Conversation the message belongs to. - is_automatic_forward (:obj:`bool`): Optional. :obj:`True`, if the message is a channel - post that was automatically forwarded to the connected discussion group. - - .. versionadded:: 13.9 - reply_to_message (:class:`telegram.Message`): Optional. For replies, the original message. - Note that the Message object in this field will not contain further - ``reply_to_message`` fields even if it itself is a reply. - edit_date (:class:`datetime.datetime`): Optional. Date the message was last edited in Unix - time. Converted to :class:`datetime.datetime`. - - .. versionchanged:: 20.3 - |datetime_localization| - has_protected_content (:obj:`bool`): Optional. :obj:`True`, if the message can't be - forwarded. - - .. versionadded:: 13.9 - is_from_offline (:obj:`bool`): Optional. :obj:`True`, if the message was sent - by an implicit action, for example, as an away or a greeting business message, - or as a scheduled message. - - .. versionadded:: 21.1 - media_group_id (:obj:`str`): Optional. The unique identifier of a media message group this - message belongs to. - text (:obj:`str`): Optional. For text messages, the actual UTF-8 text of the message, - 0-:tg-const:`telegram.constants.MessageLimit.MAX_TEXT_LENGTH` characters. - entities (tuple[:class:`telegram.MessageEntity`]): Optional. For text messages, special - entities like usernames, URLs, bot commands, etc. that appear in the text. See - :attr:`parse_entity` and :attr:`parse_entities` methods for how to use properly. - This list is empty if the message does not contain entities. - - .. versionchanged:: 20.0 - |tupleclassattrs| - - link_preview_options (:class:`telegram.LinkPreviewOptions`): Optional. Options used for - link preview generation for the message, if it is a text message and link preview - options were changed. - - .. versionadded:: 20.8 - - effect_id (:obj:`str`): Optional. Unique identifier of the message effect added to the - message. - - ..versionadded:: 21.3 - - caption_entities (tuple[:class:`telegram.MessageEntity`]): Optional. For messages with a - Caption. Special entities like usernames, URLs, bot commands, etc. that appear in the - caption. See :attr:`Message.parse_caption_entity` and :attr:`parse_caption_entities` - methods for how to use properly. This list is empty if the message does not contain - caption entities. - - .. versionchanged:: 20.0 - |tupleclassattrs| - - show_caption_above_media (:obj:`bool`): Optional. |show_cap_above_med| - - .. versionadded:: 21.3 - audio (:class:`telegram.Audio`): Optional. Message is an audio file, information - about the file. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - document (:class:`telegram.Document`): Optional. Message is a general file, information - about the file. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - animation (:class:`telegram.Animation`): Optional. Message is an animation, information - about the animation. For backward compatibility, when this field is set, the document - field will also be set. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - game (:class:`telegram.Game`): Optional. Message is a game, information about the game. - :ref:`More about games >> <games-tree>`. - photo (tuple[:class:`telegram.PhotoSize`]): Optional. Message is a photo, available - sizes of the photo. This list is empty if the message does not contain a photo. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - .. versionchanged:: 20.0 - |tupleclassattrs| - - sticker (:class:`telegram.Sticker`): Optional. Message is a sticker, information - about the sticker. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - story (:class:`telegram.Story`): Optional. Message is a forwarded story. - - .. versionadded:: 20.5 - video (:class:`telegram.Video`): Optional. Message is a video, information about the - video. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - voice (:class:`telegram.Voice`): Optional. Message is a voice message, information about - the file. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - video_note (:class:`telegram.VideoNote`): Optional. Message is a - `video note <https://telegram.org/blog/video-messages-and-telescope>`_, information - about the video message. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - new_chat_members (tuple[:class:`telegram.User`]): Optional. New members that were added - to the group or supergroup and information about them (the bot itself may be one of - these members). This list is empty if the message does not contain new chat members. - - .. versionchanged:: 20.0 - |tupleclassattrs| - caption (:obj:`str`): Optional. Caption for the animation, audio, document, paid media, - photo, video - or voice, 0-:tg-const:`telegram.constants.MessageLimit.CAPTION_LENGTH` characters. - contact (:class:`telegram.Contact`): Optional. Message is a shared contact, information - about the contact. - location (:class:`telegram.Location`): Optional. Message is a shared location, information - about the location. - venue (:class:`telegram.Venue`): Optional. Message is a venue, information about the - venue. For backward compatibility, when this field is set, the location field will - also be set. - left_chat_member (:class:`telegram.User`): Optional. A member was removed from the group, - information about them (this member may be the bot itself). - new_chat_title (:obj:`str`): Optional. A chat title was changed to this value. - new_chat_photo (tuple[:class:`telegram.PhotoSize`]): A chat photo was changed to - this value. This list is empty if the message does not contain a new chat photo. - - .. versionchanged:: 20.0 - |tupleclassattrs| - - delete_chat_photo (:obj:`bool`): Optional. Service message: The chat photo was deleted. - group_chat_created (:obj:`bool`): Optional. Service message: The group has been created. - supergroup_chat_created (:obj:`bool`): Optional. Service message: The supergroup has been - created. This field can't be received in a message coming through updates, because bot - can't be a member of a supergroup when it is created. It can only be found in - :attr:`reply_to_message` if someone replies to a very first message in a directly - created supergroup. - channel_chat_created (:obj:`bool`): Optional. Service message: The channel has been - created. This field can't be received in a message coming through updates, because bot - can't be a member of a channel when it is created. It can only be found in - :attr:`reply_to_message` if someone replies to a very first message in a channel. - message_auto_delete_timer_changed (:class:`telegram.MessageAutoDeleteTimerChanged`): - Optional. Service message: auto-delete timer settings changed in the chat. - - .. versionadded:: 13.4 - migrate_to_chat_id (:obj:`int`): Optional. The group has been migrated to a supergroup - with the specified identifier. - migrate_from_chat_id (:obj:`int`): Optional. The supergroup has been migrated from a group - with the specified identifier. - pinned_message (:class:`telegram.MaybeInaccessibleMessage`): Optional. Specified message - was pinned. Note that the Message object in this field will not contain further - :attr:`reply_to_message` fields even if it is itself a reply. - - .. versionchanged:: 20.8 - This attribute now is either :class:`telegram.Message` or - :class:`telegram.InaccessibleMessage`. - invoice (:class:`telegram.Invoice`): Optional. Message is an invoice for a payment, - information about the invoice. - :ref:`More about payments >> <payments-tree>`. - successful_payment (:class:`telegram.SuccessfulPayment`): Optional. Message is a service - message about a successful payment, information about the payment. - :ref:`More about payments >> <payments-tree>`. - connected_website (:obj:`str`): Optional. The domain name of the website on which the user - has logged in. - `More about Telegram Login >> <https://core.telegram.org/widgets/login>`_. - author_signature (:obj:`str`): Optional. Signature of the post author for messages in - channels, or the custom title of an anonymous group administrator. - paid_star_count (:obj:`int`): Optional. The number of Telegram Stars that were paid by the - sender of the message to send it - - .. versionadded:: 22.1 - passport_data (:class:`telegram.PassportData`): Optional. Telegram Passport data. - - Examples: - :any:`Passport Bot <examples.passportbot>` - poll (:class:`telegram.Poll`): Optional. Message is a native poll, - information about the poll. - dice (:class:`telegram.Dice`): Optional. Message is a dice with random value. - via_bot (:class:`telegram.User`): Optional. Bot through which message was sent. - proximity_alert_triggered (:class:`telegram.ProximityAlertTriggered`): Optional. Service - message. A user in the chat triggered another user's proximity alert while sharing - Live Location. - video_chat_scheduled (:class:`telegram.VideoChatScheduled`): Optional. Service message: - video chat scheduled. - - .. versionadded:: 20.0 - video_chat_started (:class:`telegram.VideoChatStarted`): Optional. Service message: video - chat started. - - .. versionadded:: 20.0 - video_chat_ended (:class:`telegram.VideoChatEnded`): Optional. Service message: video chat - ended. - - .. versionadded:: 20.0 - video_chat_participants_invited (:class:`telegram.VideoChatParticipantsInvited`): Optional. - Service message: new participants invited to a video chat. - - .. versionadded:: 20.0 - web_app_data (:class:`telegram.WebAppData`): Optional. Service message: data sent by a Web - App. - - .. versionadded:: 20.0 - reply_markup (:class:`telegram.InlineKeyboardMarkup`): Optional. Inline keyboard attached - to the message. :paramref:`~telegram.InlineKeyboardButton.login_url` buttons are - represented as ordinary url buttons. - is_topic_message (:obj:`bool`): Optional. :obj:`True`, if the message is sent to a forum - topic. - - .. versionadded:: 20.0 - message_thread_id (:obj:`int`): Optional. Unique identifier of a message thread to which - the message belongs; for supergroups only. - - .. versionadded:: 20.0 - forum_topic_created (:class:`telegram.ForumTopicCreated`): Optional. Service message: - forum topic created. - - .. versionadded:: 20.0 - forum_topic_closed (:class:`telegram.ForumTopicClosed`): Optional. Service message: - forum topic closed. - - .. versionadded:: 20.0 - forum_topic_reopened (:class:`telegram.ForumTopicReopened`): Optional. Service message: - forum topic reopened. - - .. versionadded:: 20.0 - forum_topic_edited (:class:`telegram.ForumTopicEdited`): Optional. Service message: - forum topic edited. - - .. versionadded:: 20.0 - general_forum_topic_hidden (:class:`telegram.GeneralForumTopicHidden`): Optional. - Service message: General forum topic hidden. - - .. versionadded:: 20.0 - general_forum_topic_unhidden (:class:`telegram.GeneralForumTopicUnhidden`): Optional. - Service message: General forum topic unhidden. - - .. versionadded:: 20.0 - write_access_allowed (:class:`telegram.WriteAccessAllowed`): Optional. Service message: - the user allowed the bot added to the attachment menu to write messages. - - .. versionadded:: 20.0 - has_media_spoiler (:obj:`bool`): Optional. :obj:`True`, if the message media is covered - by a spoiler animation. - - .. versionadded:: 20.0 - users_shared (:class:`telegram.UsersShared`): Optional. Service message: users were shared - with the bot - - .. versionadded:: 20.8 - chat_shared (:class:`telegram.ChatShared`): Optional. Service message: a chat was shared - with the bot. - - .. versionadded:: 20.1 - gift (:class:`telegram.GiftInfo`): Optional. Service message: a regular gift was sent - or received. - - .. versionadded:: 22.1 - unique_gift (:class:`telegram.UniqueGiftInfo`): Optional. Service message: a unique gift - was sent or received - - .. versionadded:: 22.1 - giveaway_created (:class:`telegram.GiveawayCreated`): Optional. Service message: a - scheduled giveaway was created - - .. versionadded:: 20.8 - giveaway (:class:`telegram.Giveaway`): Optional. The message is a scheduled giveaway - message - - .. versionadded:: 20.8 - giveaway_winners (:class:`telegram.GiveawayWinners`): Optional. A giveaway with public - winners was completed - - .. versionadded:: 20.8 - giveaway_completed (:class:`telegram.GiveawayCompleted`): Optional. Service message: a - giveaway without public winners was completed - - .. versionadded:: 20.8 - paid_message_price_changed (:class:`telegram.PaidMessagePriceChanged`): Optional. Service - message: the price for paid messages has changed in the chat - - .. versionadded:: 22.1 - external_reply (:class:`telegram.ExternalReplyInfo`): Optional. Information about the - message that is being replied to, which may come from another chat or forum topic. - - .. versionadded:: 20.8 - quote (:class:`telegram.TextQuote`): Optional. For replies that quote part of the original - message, the quoted part of the message. - - .. versionadded:: 20.8 - forward_origin (:class:`telegram.MessageOrigin`): Optional. Information about the original - message for forwarded messages - - .. versionadded:: 20.8 - reply_to_story (:class:`telegram.Story`): Optional. For replies to a story, the original - story. - - .. versionadded:: 21.0 - boost_added (:class:`telegram.ChatBoostAdded`): Optional. Service message: user boosted - the chat. - - .. versionadded:: 21.0 - sender_boost_count (:obj:`int`): Optional. If the sender of the - message boosted the chat, the number of boosts added by the user. - - .. versionadded:: 21.0 - - business_connection_id (:obj:`str`): Optional. Unique identifier of the business connection - from which the message was received. If non-empty, the message belongs to a chat of the - corresponding business account that is independent from any potential bot chat which - might share the same identifier. - - .. versionadded:: 21.1 - - sender_business_bot (:class:`telegram.User`): Optional. The bot that actually sent the - message on behalf of the business account. Available only for outgoing messages sent - on behalf of the connected business account. - - .. versionadded:: 21.1 - - chat_background_set (:class:`telegram.ChatBackground`): Optional. Service message: chat - background set - - .. versionadded:: 21.2 - paid_media (:class:`telegram.PaidMediaInfo`): Optional. Message contains paid media; - information about the paid media. - - .. versionadded:: 21.4 - refunded_payment (:class:`telegram.RefundedPayment`): Optional. Message is a service - message about a refunded payment, information about the payment. - - .. versionadded:: 21.4 - - .. |custom_emoji_no_md1_support| replace:: Since custom emoji entities are not supported by - :attr:`~telegram.constants.ParseMode.MARKDOWN`, this method now raises a - :exc:`ValueError` when encountering a custom emoji. - - .. |blockquote_no_md1_support| replace:: Since block quotation entities are not supported - by :attr:`~telegram.constants.ParseMode.MARKDOWN`, this method now raises a - :exc:`ValueError` when encountering a block quotation. - - .. |reply_same_thread| replace:: If :paramref:`message_thread_id` is not provided, - this will reply to the same thread (topic) of the original message. - - .. |quote_removed| replace:: Removed deprecated parameter ``quote``. Use :paramref:`do_quote` - instead. - """ - - # fmt: on - __slots__ = ( - "_effective_attachment", - "animation", - "audio", - "author_signature", - "boost_added", - "business_connection_id", - "caption", - "caption_entities", - "channel_chat_created", - "chat_background_set", - "chat_shared", - "connected_website", - "contact", - "delete_chat_photo", - "dice", - "document", - "edit_date", - "effect_id", - "entities", - "external_reply", - "forum_topic_closed", - "forum_topic_created", - "forum_topic_edited", - "forum_topic_reopened", - "forward_origin", - "from_user", - "game", - "general_forum_topic_hidden", - "general_forum_topic_unhidden", - "gift", - "giveaway", - "giveaway_completed", - "giveaway_created", - "giveaway_winners", - "group_chat_created", - "has_media_spoiler", - "has_protected_content", - "invoice", - "is_automatic_forward", - "is_from_offline", - "is_topic_message", - "left_chat_member", - "link_preview_options", - "location", - "media_group_id", - "message_auto_delete_timer_changed", - "message_thread_id", - "migrate_from_chat_id", - "migrate_to_chat_id", - "new_chat_members", - "new_chat_photo", - "new_chat_title", - "paid_media", - "paid_message_price_changed", - "paid_star_count", - "passport_data", - "photo", - "pinned_message", - "poll", - "proximity_alert_triggered", - "quote", - "refunded_payment", - "reply_markup", - "reply_to_message", - "reply_to_story", - "sender_boost_count", - "sender_business_bot", - "sender_chat", - "show_caption_above_media", - "sticker", - "story", - "successful_payment", - "supergroup_chat_created", - "text", - "unique_gift", - "users_shared", - "venue", - "via_bot", - "video", - "video_chat_ended", - "video_chat_participants_invited", - "video_chat_scheduled", - "video_chat_started", - "video_note", - "voice", - "web_app_data", - "write_access_allowed", - ) - - def __init__( - self, - message_id: int, - date: dtm.datetime, - chat: Chat, - from_user: Optional[User] = None, - reply_to_message: Optional["Message"] = None, - edit_date: Optional[dtm.datetime] = None, - text: Optional[str] = None, - entities: Optional[Sequence["MessageEntity"]] = None, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - audio: Optional[Audio] = None, - document: Optional[Document] = None, - game: Optional[Game] = None, - photo: Optional[Sequence[PhotoSize]] = None, - sticker: Optional[Sticker] = None, - video: Optional[Video] = None, - voice: Optional[Voice] = None, - video_note: Optional[VideoNote] = None, - new_chat_members: Optional[Sequence[User]] = None, - caption: Optional[str] = None, - contact: Optional[Contact] = None, - location: Optional[Location] = None, - venue: Optional[Venue] = None, - left_chat_member: Optional[User] = None, - new_chat_title: Optional[str] = None, - new_chat_photo: Optional[Sequence[PhotoSize]] = None, - delete_chat_photo: Optional[bool] = None, - group_chat_created: Optional[bool] = None, - supergroup_chat_created: Optional[bool] = None, - channel_chat_created: Optional[bool] = None, - migrate_to_chat_id: Optional[int] = None, - migrate_from_chat_id: Optional[int] = None, - pinned_message: Optional[MaybeInaccessibleMessage] = None, - invoice: Optional[Invoice] = None, - successful_payment: Optional[SuccessfulPayment] = None, - author_signature: Optional[str] = None, - media_group_id: Optional[str] = None, - connected_website: Optional[str] = None, - animation: Optional[Animation] = None, - passport_data: Optional[PassportData] = None, - poll: Optional[Poll] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - dice: Optional[Dice] = None, - via_bot: Optional[User] = None, - proximity_alert_triggered: Optional[ProximityAlertTriggered] = None, - sender_chat: Optional[Chat] = None, - video_chat_started: Optional[VideoChatStarted] = None, - video_chat_ended: Optional[VideoChatEnded] = None, - video_chat_participants_invited: Optional[VideoChatParticipantsInvited] = None, - message_auto_delete_timer_changed: Optional[MessageAutoDeleteTimerChanged] = None, - video_chat_scheduled: Optional[VideoChatScheduled] = None, - is_automatic_forward: Optional[bool] = None, - has_protected_content: Optional[bool] = None, - web_app_data: Optional[WebAppData] = None, - is_topic_message: Optional[bool] = None, - message_thread_id: Optional[int] = None, - forum_topic_created: Optional[ForumTopicCreated] = None, - forum_topic_closed: Optional[ForumTopicClosed] = None, - forum_topic_reopened: Optional[ForumTopicReopened] = None, - forum_topic_edited: Optional[ForumTopicEdited] = None, - general_forum_topic_hidden: Optional[GeneralForumTopicHidden] = None, - general_forum_topic_unhidden: Optional[GeneralForumTopicUnhidden] = None, - write_access_allowed: Optional[WriteAccessAllowed] = None, - has_media_spoiler: Optional[bool] = None, - chat_shared: Optional[ChatShared] = None, - story: Optional[Story] = None, - giveaway: Optional["Giveaway"] = None, - giveaway_completed: Optional["GiveawayCompleted"] = None, - giveaway_created: Optional["GiveawayCreated"] = None, - giveaway_winners: Optional["GiveawayWinners"] = None, - users_shared: Optional[UsersShared] = None, - link_preview_options: Optional[LinkPreviewOptions] = None, - external_reply: Optional["ExternalReplyInfo"] = None, - quote: Optional["TextQuote"] = None, - forward_origin: Optional["MessageOrigin"] = None, - reply_to_story: Optional[Story] = None, - boost_added: Optional[ChatBoostAdded] = None, - sender_boost_count: Optional[int] = None, - business_connection_id: Optional[str] = None, - sender_business_bot: Optional[User] = None, - is_from_offline: Optional[bool] = None, - chat_background_set: Optional[ChatBackground] = None, - effect_id: Optional[str] = None, - show_caption_above_media: Optional[bool] = None, - paid_media: Optional[PaidMediaInfo] = None, - refunded_payment: Optional[RefundedPayment] = None, - gift: Optional[GiftInfo] = None, - unique_gift: Optional[UniqueGiftInfo] = None, - paid_message_price_changed: Optional[PaidMessagePriceChanged] = None, - paid_star_count: Optional[int] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(chat=chat, message_id=message_id, date=date, api_kwargs=api_kwargs) - - with self._unfrozen(): - # Required - self.message_id: int = message_id - # Optionals - self.from_user: Optional[User] = from_user - self.sender_chat: Optional[Chat] = sender_chat - self.date: dtm.datetime = date - self.chat: Chat = chat - self.is_automatic_forward: Optional[bool] = is_automatic_forward - self.reply_to_message: Optional[Message] = reply_to_message - self.edit_date: Optional[dtm.datetime] = edit_date - self.has_protected_content: Optional[bool] = has_protected_content - self.text: Optional[str] = text - self.entities: tuple[MessageEntity, ...] = parse_sequence_arg(entities) - self.caption_entities: tuple[MessageEntity, ...] = parse_sequence_arg(caption_entities) - self.audio: Optional[Audio] = audio - self.game: Optional[Game] = game - self.document: Optional[Document] = document - self.photo: tuple[PhotoSize, ...] = parse_sequence_arg(photo) - self.sticker: Optional[Sticker] = sticker - self.video: Optional[Video] = video - self.voice: Optional[Voice] = voice - self.video_note: Optional[VideoNote] = video_note - self.caption: Optional[str] = caption - self.contact: Optional[Contact] = contact - self.location: Optional[Location] = location - self.venue: Optional[Venue] = venue - self.new_chat_members: tuple[User, ...] = parse_sequence_arg(new_chat_members) - self.left_chat_member: Optional[User] = left_chat_member - self.new_chat_title: Optional[str] = new_chat_title - self.new_chat_photo: tuple[PhotoSize, ...] = parse_sequence_arg(new_chat_photo) - self.delete_chat_photo: Optional[bool] = bool(delete_chat_photo) - self.group_chat_created: Optional[bool] = bool(group_chat_created) - self.supergroup_chat_created: Optional[bool] = bool(supergroup_chat_created) - self.migrate_to_chat_id: Optional[int] = migrate_to_chat_id - self.migrate_from_chat_id: Optional[int] = migrate_from_chat_id - self.channel_chat_created: Optional[bool] = bool(channel_chat_created) - self.message_auto_delete_timer_changed: Optional[MessageAutoDeleteTimerChanged] = ( - message_auto_delete_timer_changed - ) - self.pinned_message: Optional[MaybeInaccessibleMessage] = pinned_message - self.invoice: Optional[Invoice] = invoice - self.successful_payment: Optional[SuccessfulPayment] = successful_payment - self.connected_website: Optional[str] = connected_website - self.author_signature: Optional[str] = author_signature - self.media_group_id: Optional[str] = media_group_id - self.animation: Optional[Animation] = animation - self.passport_data: Optional[PassportData] = passport_data - self.poll: Optional[Poll] = poll - self.dice: Optional[Dice] = dice - self.via_bot: Optional[User] = via_bot - self.proximity_alert_triggered: Optional[ProximityAlertTriggered] = ( - proximity_alert_triggered - ) - self.video_chat_scheduled: Optional[VideoChatScheduled] = video_chat_scheduled - self.video_chat_started: Optional[VideoChatStarted] = video_chat_started - self.video_chat_ended: Optional[VideoChatEnded] = video_chat_ended - self.video_chat_participants_invited: Optional[VideoChatParticipantsInvited] = ( - video_chat_participants_invited - ) - self.reply_markup: Optional[InlineKeyboardMarkup] = reply_markup - self.web_app_data: Optional[WebAppData] = web_app_data - self.is_topic_message: Optional[bool] = is_topic_message - self.message_thread_id: Optional[int] = message_thread_id - self.forum_topic_created: Optional[ForumTopicCreated] = forum_topic_created - self.forum_topic_closed: Optional[ForumTopicClosed] = forum_topic_closed - self.forum_topic_reopened: Optional[ForumTopicReopened] = forum_topic_reopened - self.forum_topic_edited: Optional[ForumTopicEdited] = forum_topic_edited - self.general_forum_topic_hidden: Optional[GeneralForumTopicHidden] = ( - general_forum_topic_hidden - ) - self.general_forum_topic_unhidden: Optional[GeneralForumTopicUnhidden] = ( - general_forum_topic_unhidden - ) - self.write_access_allowed: Optional[WriteAccessAllowed] = write_access_allowed - self.has_media_spoiler: Optional[bool] = has_media_spoiler - self.users_shared: Optional[UsersShared] = users_shared - self.chat_shared: Optional[ChatShared] = chat_shared - self.story: Optional[Story] = story - self.giveaway: Optional[Giveaway] = giveaway - self.giveaway_completed: Optional[GiveawayCompleted] = giveaway_completed - self.giveaway_created: Optional[GiveawayCreated] = giveaway_created - self.giveaway_winners: Optional[GiveawayWinners] = giveaway_winners - self.link_preview_options: Optional[LinkPreviewOptions] = link_preview_options - self.external_reply: Optional[ExternalReplyInfo] = external_reply - self.quote: Optional[TextQuote] = quote - self.forward_origin: Optional[MessageOrigin] = forward_origin - self.reply_to_story: Optional[Story] = reply_to_story - self.boost_added: Optional[ChatBoostAdded] = boost_added - self.sender_boost_count: Optional[int] = sender_boost_count - self.business_connection_id: Optional[str] = business_connection_id - self.sender_business_bot: Optional[User] = sender_business_bot - self.is_from_offline: Optional[bool] = is_from_offline - self.chat_background_set: Optional[ChatBackground] = chat_background_set - self.effect_id: Optional[str] = effect_id - self.show_caption_above_media: Optional[bool] = show_caption_above_media - self.paid_media: Optional[PaidMediaInfo] = paid_media - self.refunded_payment: Optional[RefundedPayment] = refunded_payment - self.gift: Optional[GiftInfo] = gift - self.unique_gift: Optional[UniqueGiftInfo] = unique_gift - self.paid_message_price_changed: Optional[PaidMessagePriceChanged] = ( - paid_message_price_changed - ) - self.paid_star_count: Optional[int] = paid_star_count - - self._effective_attachment = DEFAULT_NONE - - self._id_attrs = (self.message_id, self.chat) - - @property - def chat_id(self) -> int: - """:obj:`int`: Shortcut for :attr:`telegram.Chat.id` for :attr:`chat`.""" - return self.chat.id - - @property - def id(self) -> int: - """ - :obj:`int`: Shortcut for :attr:`message_id`. - - .. versionadded:: 20.0 - """ - return self.message_id - - @property - def link(self) -> Optional[str]: - """:obj:`str`: Convenience property. If the chat of the message is not - a private chat or normal group, returns a t.me link of the message. - - .. versionchanged:: 20.3 - For messages that are replies or part of a forum topic, the link now points - to the corresponding thread view. - """ - if self.chat.type not in [Chat.PRIVATE, Chat.GROUP]: - # the else block gets rid of leading -100 for supergroups: - to_link = self.chat.username if self.chat.username else f"c/{str(self.chat.id)[4:]}" - baselink = f"https://t.me/{to_link}/{self.message_id}" - - # adds the thread for topics and replies - if (self.is_topic_message and self.message_thread_id) or self.reply_to_message: - baselink = f"{baselink}?thread={self.message_thread_id}" - return baselink - return None - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "Message": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - # Get the local timezone from the bot if it has defaults - loc_tzinfo = extract_tzinfo_from_defaults(bot) - - data["from_user"] = de_json_optional(data.pop("from", None), User, bot) - data["sender_chat"] = de_json_optional(data.get("sender_chat"), Chat, bot) - data["entities"] = de_list_optional(data.get("entities"), MessageEntity, bot) - data["caption_entities"] = de_list_optional( - data.get("caption_entities"), MessageEntity, bot - ) - data["reply_to_message"] = de_json_optional(data.get("reply_to_message"), Message, bot) - data["edit_date"] = from_timestamp(data.get("edit_date"), tzinfo=loc_tzinfo) - data["audio"] = de_json_optional(data.get("audio"), Audio, bot) - data["document"] = de_json_optional(data.get("document"), Document, bot) - data["animation"] = de_json_optional(data.get("animation"), Animation, bot) - data["game"] = de_json_optional(data.get("game"), Game, bot) - data["photo"] = de_list_optional(data.get("photo"), PhotoSize, bot) - data["sticker"] = de_json_optional(data.get("sticker"), Sticker, bot) - data["story"] = de_json_optional(data.get("story"), Story, bot) - data["video"] = de_json_optional(data.get("video"), Video, bot) - data["voice"] = de_json_optional(data.get("voice"), Voice, bot) - data["video_note"] = de_json_optional(data.get("video_note"), VideoNote, bot) - data["contact"] = de_json_optional(data.get("contact"), Contact, bot) - data["location"] = de_json_optional(data.get("location"), Location, bot) - data["venue"] = de_json_optional(data.get("venue"), Venue, bot) - data["new_chat_members"] = de_list_optional(data.get("new_chat_members"), User, bot) - data["left_chat_member"] = de_json_optional(data.get("left_chat_member"), User, bot) - data["new_chat_photo"] = de_list_optional(data.get("new_chat_photo"), PhotoSize, bot) - data["message_auto_delete_timer_changed"] = de_json_optional( - data.get("message_auto_delete_timer_changed"), MessageAutoDeleteTimerChanged, bot - ) - data["pinned_message"] = de_json_optional( - data.get("pinned_message"), MaybeInaccessibleMessage, bot - ) - data["invoice"] = de_json_optional(data.get("invoice"), Invoice, bot) - data["successful_payment"] = de_json_optional( - data.get("successful_payment"), SuccessfulPayment, bot - ) - data["passport_data"] = de_json_optional(data.get("passport_data"), PassportData, bot) - data["poll"] = de_json_optional(data.get("poll"), Poll, bot) - data["dice"] = de_json_optional(data.get("dice"), Dice, bot) - data["via_bot"] = de_json_optional(data.get("via_bot"), User, bot) - data["proximity_alert_triggered"] = de_json_optional( - data.get("proximity_alert_triggered"), ProximityAlertTriggered, bot - ) - data["reply_markup"] = de_json_optional( - data.get("reply_markup"), InlineKeyboardMarkup, bot - ) - data["video_chat_scheduled"] = de_json_optional( - data.get("video_chat_scheduled"), VideoChatScheduled, bot - ) - data["video_chat_started"] = de_json_optional( - data.get("video_chat_started"), VideoChatStarted, bot - ) - data["video_chat_ended"] = de_json_optional( - data.get("video_chat_ended"), VideoChatEnded, bot - ) - data["video_chat_participants_invited"] = de_json_optional( - data.get("video_chat_participants_invited"), VideoChatParticipantsInvited, bot - ) - data["web_app_data"] = de_json_optional(data.get("web_app_data"), WebAppData, bot) - data["forum_topic_closed"] = de_json_optional( - data.get("forum_topic_closed"), ForumTopicClosed, bot - ) - data["forum_topic_created"] = de_json_optional( - data.get("forum_topic_created"), ForumTopicCreated, bot - ) - data["forum_topic_reopened"] = de_json_optional( - data.get("forum_topic_reopened"), ForumTopicReopened, bot - ) - data["forum_topic_edited"] = de_json_optional( - data.get("forum_topic_edited"), ForumTopicEdited, bot - ) - data["general_forum_topic_hidden"] = de_json_optional( - data.get("general_forum_topic_hidden"), GeneralForumTopicHidden, bot - ) - data["general_forum_topic_unhidden"] = de_json_optional( - data.get("general_forum_topic_unhidden"), GeneralForumTopicUnhidden, bot - ) - data["write_access_allowed"] = de_json_optional( - data.get("write_access_allowed"), WriteAccessAllowed, bot - ) - data["users_shared"] = de_json_optional(data.get("users_shared"), UsersShared, bot) - data["chat_shared"] = de_json_optional(data.get("chat_shared"), ChatShared, bot) - data["chat_background_set"] = de_json_optional( - data.get("chat_background_set"), ChatBackground, bot - ) - data["paid_media"] = de_json_optional(data.get("paid_media"), PaidMediaInfo, bot) - data["refunded_payment"] = de_json_optional( - data.get("refunded_payment"), RefundedPayment, bot - ) - data["gift"] = de_json_optional(data.get("gift"), GiftInfo, bot) - data["unique_gift"] = de_json_optional(data.get("unique_gift"), UniqueGiftInfo, bot) - data["paid_message_price_changed"] = de_json_optional( - data.get("paid_message_price_changed"), PaidMessagePriceChanged, bot - ) - - # Unfortunately, this needs to be here due to cyclic imports - from telegram._giveaway import ( # pylint: disable=import-outside-toplevel - Giveaway, - GiveawayCompleted, - GiveawayCreated, - GiveawayWinners, - ) - from telegram._messageorigin import ( # pylint: disable=import-outside-toplevel - MessageOrigin, - ) - from telegram._reply import ( # pylint: disable=import-outside-toplevel - ExternalReplyInfo, - TextQuote, - ) - - data["giveaway"] = de_json_optional(data.get("giveaway"), Giveaway, bot) - data["giveaway_completed"] = de_json_optional( - data.get("giveaway_completed"), GiveawayCompleted, bot - ) - data["giveaway_created"] = de_json_optional( - data.get("giveaway_created"), GiveawayCreated, bot - ) - data["giveaway_winners"] = de_json_optional( - data.get("giveaway_winners"), GiveawayWinners, bot - ) - data["link_preview_options"] = de_json_optional( - data.get("link_preview_options"), LinkPreviewOptions, bot - ) - data["external_reply"] = de_json_optional( - data.get("external_reply"), ExternalReplyInfo, bot - ) - data["quote"] = de_json_optional(data.get("quote"), TextQuote, bot) - data["forward_origin"] = de_json_optional(data.get("forward_origin"), MessageOrigin, bot) - data["reply_to_story"] = de_json_optional(data.get("reply_to_story"), Story, bot) - data["boost_added"] = de_json_optional(data.get("boost_added"), ChatBoostAdded, bot) - data["sender_business_bot"] = de_json_optional(data.get("sender_business_bot"), User, bot) - - api_kwargs = {} - # This is a deprecated field that TG still returns for backwards compatibility - # Let's filter it out to speed up the de-json process - for key in ( - "user_shared", - "forward_from", - "forward_from_chat", - "forward_from_message_id", - "forward_signature", - "forward_sender_name", - "forward_date", - ): - if entry := data.get(key): - api_kwargs = {key: entry} - - return super()._de_json( # type: ignore[return-value] - data=data, bot=bot, api_kwargs=api_kwargs - ) - - @property - def effective_attachment( - self, - ) -> Union[ - Animation, - Audio, - Contact, - Dice, - Document, - Game, - Invoice, - Location, - PassportData, - Sequence[PhotoSize], - PaidMediaInfo, - Poll, - Sticker, - Story, - SuccessfulPayment, - Venue, - Video, - VideoNote, - Voice, - None, - ]: - """If the message is a user generated content which is not a plain text message, this - property is set to this content. It may be one of - - * :class:`telegram.Audio` - * :class:`telegram.Dice` - * :class:`telegram.Contact` - * :class:`telegram.Document` - * :class:`telegram.Animation` - * :class:`telegram.Game` - * :class:`telegram.Invoice` - * :class:`telegram.Location` - * :class:`telegram.PassportData` - * list[:class:`telegram.PhotoSize`] - * :class:`telegram.PaidMediaInfo` - * :class:`telegram.Poll` - * :class:`telegram.Sticker` - * :class:`telegram.Story` - * :class:`telegram.SuccessfulPayment` - * :class:`telegram.Venue` - * :class:`telegram.Video` - * :class:`telegram.VideoNote` - * :class:`telegram.Voice` - - Otherwise :obj:`None` is returned. - - .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>` - - .. versionchanged:: 20.0 - :attr:`dice`, :attr:`passport_data` and :attr:`poll` are now also considered to be an - attachment. - - .. versionchanged:: 21.4 - :attr:`paid_media` is now also considered to be an attachment. - - .. deprecated:: 21.4 - :attr:`successful_payment` will be removed in future major versions. - - """ - if not isinstance(self._effective_attachment, DefaultValue): - return self._effective_attachment - - for attachment_type in MessageAttachmentType: - if self[attachment_type]: - self._effective_attachment = self[attachment_type] # type: ignore[assignment] - if attachment_type == MessageAttachmentType.SUCCESSFUL_PAYMENT: - warn( - PTBDeprecationWarning( - "21.4", - "successful_payment will no longer be considered an attachment in" - " future major versions", - ), - stacklevel=2, - ) - break - else: - self._effective_attachment = None - - return self._effective_attachment # type: ignore[return-value] - - def _do_quote( - self, do_quote: Optional[bool], allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE - ) -> Optional[ReplyParameters]: - """Modify kwargs for replying with or without quoting.""" - # `Defaults` handling for allow_sending_without_reply is not necessary, as - # `ReplyParameters` have special defaults handling in (ExtBot)._insert_defaults - if do_quote is not None: - if do_quote: - return ReplyParameters( - self.message_id, allow_sending_without_reply=allow_sending_without_reply - ) - - else: - # Unfortunately we need some ExtBot logic here because it's hard to move shortcut - # logic into ExtBot - if hasattr(self.get_bot(), "defaults") and self.get_bot().defaults: # type: ignore - default_quote = self.get_bot().defaults.do_quote # type: ignore[attr-defined] - else: - default_quote = None - if (default_quote is None and self.chat.type != Chat.PRIVATE) or default_quote: - return ReplyParameters( - self.message_id, allow_sending_without_reply=allow_sending_without_reply - ) - - return None - - def compute_quote_position_and_entities( - self, quote: str, index: Optional[int] = None - ) -> tuple[int, Optional[tuple[MessageEntity, ...]]]: - """ - Use this function to compute position and entities of a quote in the message text or - caption. Useful for filling the parameters - :paramref:`~telegram.ReplyParameters.quote_position` and - :paramref:`~telegram.ReplyParameters.quote_entities` of :class:`telegram.ReplyParameters` - when replying to a message. - - Example: - - Given a message with the text ``"Hello, world! Hello, world!"``, the following code - will return the position and entities of the second occurrence of ``"Hello, world!"``. - - .. code-block:: python - - message.compute_quote_position_and_entities("Hello, world!", 1) - - .. versionadded:: 20.8 - - Args: - quote (:obj:`str`): Part of the message which is to be quoted. This is - expected to have plain text without formatting entities. - index (:obj:`int`, optional): 0-based index of the occurrence of the quote in the - message. If not specified, the first occurrence is used. - - Returns: - tuple[:obj:`int`, :obj:`None` | tuple[:class:`~telegram.MessageEntity`, ...]]: On - success, a tuple containing information about quote position and entities is returned. - - Raises: - RuntimeError: If the message has neither :attr:`text` nor :attr:`caption`. - ValueError: If the requested index of quote doesn't exist in the message. - """ - if not (text := (self.text or self.caption)): - raise RuntimeError("This message has neither text nor caption.") - - # Telegram wants the position in UTF-16 code units, so we have to calculate in that space - utf16_text = text.encode(TextEncoding.UTF_16_LE) - utf16_quote = quote.encode(TextEncoding.UTF_16_LE) - effective_index = index or 0 - - matches = list(re.finditer(re.escape(utf16_quote), utf16_text)) - if (length := len(matches)) < effective_index + 1: - raise ValueError( - f"You requested the {index}-th occurrence of '{quote}', but this text appears " - f"only {length} times." - ) - - position = len(utf16_text[: matches[effective_index].start()]) // 2 - length = len(utf16_quote) // 2 - end_position = position + length - - entities = [] - for entity in self.entities or self.caption_entities: - if position <= entity.offset + entity.length and entity.offset <= end_position: - # shift the offset by the position of the quote - offset = max(0, entity.offset - position) - # trim the entity length to the length of the overlap with the quote - e_length = min(end_position, entity.offset + entity.length) - max( - position, entity.offset - ) - if e_length <= 0: - continue - - # create a new entity with the correct offset and length - # looping over slots rather manually accessing the attributes - # is more future-proof - kwargs = {attr: getattr(entity, attr) for attr in entity.__slots__} - kwargs["offset"] = offset - kwargs["length"] = e_length - entities.append(MessageEntity(**kwargs)) - - return position, tuple(entities) or None - - def build_reply_arguments( - self, - quote: Optional[str] = None, - quote_index: Optional[int] = None, - target_chat_id: Optional[Union[int, str]] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: ODVInput[int] = DEFAULT_NONE, - ) -> _ReplyKwargs: - """ - Builds a dictionary with the keys ``chat_id`` and ``reply_parameters``. This dictionary can - be used to reply to a message with the given quote and target chat. - - Examples: - - Usage with :meth:`telegram.Bot.send_message`: - - .. code-block:: python - - await bot.send_message( - text="This is a reply", - **message.build_reply_arguments(quote="Quoted Text") - ) - - Usage with :meth:`reply_text`, replying in the same chat: - - .. code-block:: python - - await message.reply_text( - "This is a reply", - do_quote=message.build_reply_arguments(quote="Quoted Text") - ) - - Usage with :meth:`reply_text`, replying in a different chat: - - .. code-block:: python - - await message.reply_text( - "This is a reply", - do_quote=message.build_reply_arguments( - quote="Quoted Text", - target_chat_id=-100123456789 - ) - ) - - .. versionadded:: 20.8 - - Args: - quote (:obj:`str`, optional): Passed in :meth:`compute_quote_position_and_entities` - as parameter :paramref:`~compute_quote_position_and_entities.quote` to compute - quote entities. Defaults to :obj:`None`. - quote_index (:obj:`int`, optional): Passed in - :meth:`compute_quote_position_and_entities` as parameter - :paramref:`~compute_quote_position_and_entities.quote_index` to compute quote - position. Defaults to :obj:`None`. - target_chat_id (:obj:`int` | :obj:`str`, optional): |chat_id_channel| - Defaults to :attr:`chat_id`. - allow_sending_without_reply (:obj:`bool`, optional): |allow_sending_without_reply| - Will be applied only if the reply happens in the same chat and forum topic. - message_thread_id (:obj:`int`, optional): |message_thread_id| - - Returns: - :obj:`dict`: - """ - target_chat_is_self = target_chat_id in (None, self.chat_id, f"@{self.chat.username}") - - if target_chat_is_self and message_thread_id in ( - None, - self.message_thread_id, - ): - # defaults handling will take place in `Bot._insert_defaults` - effective_aswr: ODVInput[bool] = allow_sending_without_reply - else: - effective_aswr = None - - quote_position, quote_entities = ( - self.compute_quote_position_and_entities(quote, quote_index) if quote else (None, None) - ) - return { # type: ignore[typeddict-item] - "reply_parameters": ReplyParameters( - chat_id=None if target_chat_is_self else self.chat_id, - message_id=self.message_id, - quote=quote, - quote_position=quote_position, - quote_entities=quote_entities, - allow_sending_without_reply=effective_aswr, - ), - "chat_id": target_chat_id or self.chat_id, - } - - async def _parse_quote_arguments( - self, - do_quote: Optional[Union[bool, _ReplyKwargs]], - reply_to_message_id: Optional[int], - reply_parameters: Optional["ReplyParameters"], - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - ) -> tuple[Union[str, int], ReplyParameters]: - if allow_sending_without_reply is not DEFAULT_NONE and reply_parameters is not None: - raise ValueError( - "`allow_sending_without_reply` and `reply_parameters` are mutually exclusive." - ) - - if reply_to_message_id is not None and reply_parameters is not None: - raise ValueError( - "`reply_to_message_id` and `reply_parameters` are mutually exclusive." - ) - - chat_id: Union[str, int] = self.chat_id - - # reply_parameters and reply_to_message_id overrule the do_quote parameter - if reply_parameters is not None: - effective_reply_parameters = reply_parameters - elif reply_to_message_id is not None: - effective_reply_parameters = ReplyParameters( - message_id=reply_to_message_id, - allow_sending_without_reply=allow_sending_without_reply, - ) - elif isinstance(do_quote, dict): - if allow_sending_without_reply is not DEFAULT_NONE: - raise ValueError( - "`allow_sending_without_reply` and `dict`-value input for `do_quote` are " - "mutually exclusive." - ) - - effective_reply_parameters = do_quote["reply_parameters"] - chat_id = do_quote["chat_id"] - else: - effective_reply_parameters = self._do_quote(do_quote, allow_sending_without_reply) - - return chat_id, effective_reply_parameters - - def _parse_message_thread_id( - self, - chat_id: Union[str, int], - message_thread_id: ODVInput[int] = DEFAULT_NONE, - ) -> Optional[int]: - # values set by user have the highest priority - if not isinstance(message_thread_id, DefaultValue): - return message_thread_id - - # self.message_thread_id can be used for send_*.param.message_thread_id only if the - # thread is a forum topic. It does not work if the thread is a chain of replies to a - # message in a normal group. In that case, self.message_thread_id is just the message_id - # of the first message in the chain. - if not self.is_topic_message: - return None - - # Setting message_thread_id=self.message_thread_id only makes sense if we're replying in - # the same chat. - return self.message_thread_id if chat_id in {self.chat_id, self.chat.username} else None - - async def reply_text( - self, - text: str, - parse_mode: ODVInput[str] = DEFAULT_NONE, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: ODVInput[int] = DEFAULT_NONE, - link_preview_options: ODVInput["LinkPreviewOptions"] = DEFAULT_NONE, - reply_parameters: Optional["ReplyParameters"] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - disable_web_page_preview: Optional[bool] = None, - do_quote: Optional[Union[bool, _ReplyKwargs]] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_message( - update.effective_message.chat_id, - message_thread_id=update.effective_message.message_thread_id, - business_connection_id=self.business_connection_id, - *args, - **kwargs, - ) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_message`. - - .. versionchanged:: 21.1 - |reply_same_thread| - - .. versionchanged:: 22.0 - |quote_removed| - - Keyword Args: - do_quote (:obj:`bool` | :obj:`dict`, optional): |do_quote| - - .. versionadded:: 20.8 - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - chat_id, effective_reply_parameters = await self._parse_quote_arguments( - do_quote, reply_to_message_id, reply_parameters, allow_sending_without_reply - ) - message_thread_id = self._parse_message_thread_id(chat_id, message_thread_id) - return await self.get_bot().send_message( - chat_id=chat_id, - text=text, - parse_mode=parse_mode, - disable_web_page_preview=disable_web_page_preview, - link_preview_options=link_preview_options, - disable_notification=disable_notification, - reply_parameters=effective_reply_parameters, - reply_markup=reply_markup, - entities=entities, - protect_content=protect_content, - message_thread_id=message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - business_connection_id=self.business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def reply_markdown( - self, - text: str, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: ODVInput[int] = DEFAULT_NONE, - link_preview_options: ODVInput["LinkPreviewOptions"] = DEFAULT_NONE, - reply_parameters: Optional["ReplyParameters"] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - disable_web_page_preview: Optional[bool] = None, - do_quote: Optional[Union[bool, _ReplyKwargs]] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_message( - update.effective_message.chat_id, - message_thread_id=update.effective_message.message_thread_id, - parse_mode=ParseMode.MARKDOWN, - business_connection_id=self.business_connection_id, - *args, - **kwargs, - ) - - Sends a message with Markdown version 1 formatting. - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_message`. - - .. versionchanged:: 21.1 - |reply_same_thread| - - .. versionchanged:: 22.0 - |quote_removed| - - Note: - :tg-const:`telegram.constants.ParseMode.MARKDOWN` is a legacy mode, retained by - Telegram for backward compatibility. You should use :meth:`reply_markdown_v2` instead. - - Keyword Args: - do_quote (:obj:`bool` | :obj:`dict`, optional): |do_quote| - - .. versionadded:: 20.8 - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - """ - chat_id, effective_reply_parameters = await self._parse_quote_arguments( - do_quote, reply_to_message_id, reply_parameters, allow_sending_without_reply - ) - message_thread_id = self._parse_message_thread_id(chat_id, message_thread_id) - return await self.get_bot().send_message( - chat_id=chat_id, - text=text, - parse_mode=ParseMode.MARKDOWN, - disable_web_page_preview=disable_web_page_preview, - link_preview_options=link_preview_options, - disable_notification=disable_notification, - reply_parameters=effective_reply_parameters, - reply_markup=reply_markup, - entities=entities, - protect_content=protect_content, - message_thread_id=message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - business_connection_id=self.business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def reply_markdown_v2( - self, - text: str, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: ODVInput[int] = DEFAULT_NONE, - link_preview_options: ODVInput["LinkPreviewOptions"] = DEFAULT_NONE, - reply_parameters: Optional["ReplyParameters"] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - disable_web_page_preview: Optional[bool] = None, - do_quote: Optional[Union[bool, _ReplyKwargs]] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_message( - update.effective_message.chat_id, - message_thread_id=update.effective_message.message_thread_id, - parse_mode=ParseMode.MARKDOWN_V2, - business_connection_id=self.business_connection_id, - *args, - **kwargs, - ) - - Sends a message with markdown version 2 formatting. - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_message`. - - .. versionchanged:: 21.1 - |reply_same_thread| - - .. versionchanged:: 22.0 - |quote_removed| - - Keyword Args: - do_quote (:obj:`bool` | :obj:`dict`, optional): |do_quote| - - .. versionadded:: 20.8 - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - """ - chat_id, effective_reply_parameters = await self._parse_quote_arguments( - do_quote, reply_to_message_id, reply_parameters, allow_sending_without_reply - ) - message_thread_id = self._parse_message_thread_id(chat_id, message_thread_id) - return await self.get_bot().send_message( - chat_id=chat_id, - text=text, - parse_mode=ParseMode.MARKDOWN_V2, - disable_web_page_preview=disable_web_page_preview, - link_preview_options=link_preview_options, - disable_notification=disable_notification, - reply_parameters=effective_reply_parameters, - reply_markup=reply_markup, - entities=entities, - protect_content=protect_content, - message_thread_id=message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - business_connection_id=self.business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def reply_html( - self, - text: str, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: ODVInput[int] = DEFAULT_NONE, - link_preview_options: ODVInput["LinkPreviewOptions"] = DEFAULT_NONE, - reply_parameters: Optional["ReplyParameters"] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - disable_web_page_preview: Optional[bool] = None, - do_quote: Optional[Union[bool, _ReplyKwargs]] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_message( - update.effective_message.chat_id, - message_thread_id=update.effective_message.message_thread_id, - parse_mode=ParseMode.HTML, - business_connection_id=self.business_connection_id, - *args, - **kwargs, - ) - - Sends a message with HTML formatting. - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_message`. - - .. versionchanged:: 21.1 - |reply_same_thread| - - .. versionchanged:: 22.0 - |quote_removed| - - Keyword Args: - do_quote (:obj:`bool` | :obj:`dict`, optional): |do_quote| - - .. versionadded:: 20.8 - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - """ - chat_id, effective_reply_parameters = await self._parse_quote_arguments( - do_quote, reply_to_message_id, reply_parameters, allow_sending_without_reply - ) - message_thread_id = self._parse_message_thread_id(chat_id, message_thread_id) - return await self.get_bot().send_message( - chat_id=chat_id, - text=text, - parse_mode=ParseMode.HTML, - disable_web_page_preview=disable_web_page_preview, - link_preview_options=link_preview_options, - disable_notification=disable_notification, - reply_parameters=effective_reply_parameters, - reply_markup=reply_markup, - entities=entities, - protect_content=protect_content, - message_thread_id=message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - business_connection_id=self.business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def reply_media_group( - self, - media: Sequence[ - Union["InputMediaAudio", "InputMediaDocument", "InputMediaPhoto", "InputMediaVideo"] - ], - disable_notification: ODVInput[bool] = DEFAULT_NONE, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: ODVInput[int] = DEFAULT_NONE, - reply_parameters: Optional["ReplyParameters"] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - do_quote: Optional[Union[bool, _ReplyKwargs]] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - caption: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - ) -> tuple["Message", ...]: - """Shortcut for:: - - await bot.send_media_group( - update.effective_message.chat_id, - message_thread_id=update.effective_message.message_thread_id, - business_connection_id=self.business_connection_id, - *args, - **kwargs, - ) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_media_group`. - - .. versionchanged:: 21.1 - |reply_same_thread| - - .. versionchanged:: 22.0 - |quote_removed| - - Keyword Args: - do_quote (:obj:`bool` | :obj:`dict`, optional): |do_quote| - - .. versionadded:: 20.8 - - Returns: - tuple[:class:`telegram.Message`]: An array of the sent Messages. - - Raises: - :class:`telegram.error.TelegramError` - """ - chat_id, effective_reply_parameters = await self._parse_quote_arguments( - do_quote, reply_to_message_id, reply_parameters, allow_sending_without_reply - ) - message_thread_id = self._parse_message_thread_id(chat_id, message_thread_id) - return await self.get_bot().send_media_group( - chat_id=chat_id, - media=media, - disable_notification=disable_notification, - reply_parameters=effective_reply_parameters, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - protect_content=protect_content, - message_thread_id=message_thread_id, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - business_connection_id=self.business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def reply_photo( - self, - photo: Union[FileInput, "PhotoSize"], - caption: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: ODVInput[int] = DEFAULT_NONE, - has_spoiler: Optional[bool] = None, - reply_parameters: Optional["ReplyParameters"] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - show_caption_above_media: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - filename: Optional[str] = None, - do_quote: Optional[Union[bool, _ReplyKwargs]] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_photo( - update.effective_message.chat_id, - message_thread_id=update.effective_message.message_thread_id, - business_connection_id=self.business_connection_id, - *args, - **kwargs, - ) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_photo`. - - .. versionchanged:: 21.1 - |reply_same_thread| - - .. versionchanged:: 22.0 - |quote_removed| - - Keyword Args: - do_quote (:obj:`bool` | :obj:`dict`, optional): |do_quote| - - .. versionadded:: 20.8 - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - chat_id, effective_reply_parameters = await self._parse_quote_arguments( - do_quote, reply_to_message_id, reply_parameters, allow_sending_without_reply - ) - message_thread_id = self._parse_message_thread_id(chat_id, message_thread_id) - return await self.get_bot().send_photo( - chat_id=chat_id, - photo=photo, - caption=caption, - disable_notification=disable_notification, - reply_parameters=effective_reply_parameters, - reply_markup=reply_markup, - parse_mode=parse_mode, - caption_entities=caption_entities, - filename=filename, - protect_content=protect_content, - message_thread_id=message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - has_spoiler=has_spoiler, - business_connection_id=self.business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - show_caption_above_media=show_caption_above_media, - ) - - async def reply_audio( - self, - audio: Union[FileInput, "Audio"], - duration: Optional[TimePeriod] = None, - performer: Optional[str] = None, - title: Optional[str] = None, - caption: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: ODVInput[int] = DEFAULT_NONE, - thumbnail: Optional[FileInput] = None, - reply_parameters: Optional["ReplyParameters"] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - filename: Optional[str] = None, - do_quote: Optional[Union[bool, _ReplyKwargs]] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_audio( - update.effective_message.chat_id, - message_thread_id=update.effective_message.message_thread_id, - business_connection_id=self.business_connection_id, - *args, - **kwargs, - ) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_audio`. - - .. versionchanged:: 21.1 - |reply_same_thread| - - .. versionchanged:: 22.0 - |quote_removed| - - Keyword Args: - do_quote (:obj:`bool` | :obj:`dict`, optional): |do_quote| - - .. versionadded:: 20.8 - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - chat_id, effective_reply_parameters = await self._parse_quote_arguments( - do_quote, reply_to_message_id, reply_parameters, allow_sending_without_reply - ) - message_thread_id = self._parse_message_thread_id(chat_id, message_thread_id) - return await self.get_bot().send_audio( - chat_id=chat_id, - audio=audio, - duration=duration, - performer=performer, - title=title, - caption=caption, - disable_notification=disable_notification, - reply_parameters=effective_reply_parameters, - reply_markup=reply_markup, - parse_mode=parse_mode, - caption_entities=caption_entities, - filename=filename, - protect_content=protect_content, - message_thread_id=message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - thumbnail=thumbnail, - business_connection_id=self.business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def reply_document( - self, - document: Union[FileInput, "Document"], - caption: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - disable_content_type_detection: Optional[bool] = None, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: ODVInput[int] = DEFAULT_NONE, - thumbnail: Optional[FileInput] = None, - reply_parameters: Optional["ReplyParameters"] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - filename: Optional[str] = None, - do_quote: Optional[Union[bool, _ReplyKwargs]] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_document( - update.effective_message.chat_id, - message_thread_id=update.effective_message.message_thread_id, - business_connection_id=self.business_connection_id, - *args, - **kwargs, - ) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_document`. - - .. versionchanged:: 21.1 - |reply_same_thread| - - .. versionchanged:: 22.0 - |quote_removed| - - Keyword Args: - do_quote (:obj:`bool` | :obj:`dict`, optional): |do_quote| - - .. versionadded:: 20.8 - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - chat_id, effective_reply_parameters = await self._parse_quote_arguments( - do_quote, reply_to_message_id, reply_parameters, allow_sending_without_reply - ) - message_thread_id = self._parse_message_thread_id(chat_id, message_thread_id) - return await self.get_bot().send_document( - chat_id=chat_id, - document=document, - filename=filename, - caption=caption, - disable_notification=disable_notification, - reply_parameters=effective_reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - parse_mode=parse_mode, - api_kwargs=api_kwargs, - disable_content_type_detection=disable_content_type_detection, - caption_entities=caption_entities, - protect_content=protect_content, - message_thread_id=message_thread_id, - thumbnail=thumbnail, - business_connection_id=self.business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def reply_animation( - self, - animation: Union[FileInput, "Animation"], - duration: Optional[TimePeriod] = None, - width: Optional[int] = None, - height: Optional[int] = None, - caption: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: ODVInput[int] = DEFAULT_NONE, - has_spoiler: Optional[bool] = None, - thumbnail: Optional[FileInput] = None, - reply_parameters: Optional["ReplyParameters"] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - show_caption_above_media: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - filename: Optional[str] = None, - do_quote: Optional[Union[bool, _ReplyKwargs]] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_animation( - update.effective_message.chat_id, - message_thread_id=update.effective_message.message_thread_id, - business_connection_id=self.business_connection_id, - *args, - **kwargs, - ) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_animation`. - - .. versionchanged:: 21.1 - |reply_same_thread| - - .. versionchanged:: 22.0 - |quote_removed| - - Keyword Args: - do_quote (:obj:`bool` | :obj:`dict`, optional): |do_quote| - - .. versionadded:: 20.8 - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - chat_id, effective_reply_parameters = await self._parse_quote_arguments( - do_quote, reply_to_message_id, reply_parameters, allow_sending_without_reply - ) - message_thread_id = self._parse_message_thread_id(chat_id, message_thread_id) - return await self.get_bot().send_animation( - chat_id=chat_id, - animation=animation, - duration=duration, - width=width, - height=height, - caption=caption, - parse_mode=parse_mode, - disable_notification=disable_notification, - reply_parameters=effective_reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - caption_entities=caption_entities, - filename=filename, - protect_content=protect_content, - message_thread_id=message_thread_id, - has_spoiler=has_spoiler, - thumbnail=thumbnail, - business_connection_id=self.business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - show_caption_above_media=show_caption_above_media, - ) - - async def reply_sticker( - self, - sticker: Union[FileInput, "Sticker"], - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: ODVInput[int] = DEFAULT_NONE, - emoji: Optional[str] = None, - reply_parameters: Optional["ReplyParameters"] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - do_quote: Optional[Union[bool, _ReplyKwargs]] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_sticker( - update.effective_message.chat_id, - message_thread_id=update.effective_message.message_thread_id, - business_connection_id=self.business_connection_id, - *args, - **kwargs, - ) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_sticker`. - - .. versionchanged:: 21.1 - |reply_same_thread| - - .. versionchanged:: 22.0 - |quote_removed| - - Keyword Args: - do_quote (:obj:`bool` | :obj:`dict`, optional): |do_quote| - - .. versionadded:: 20.8 - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - chat_id, effective_reply_parameters = await self._parse_quote_arguments( - do_quote, reply_to_message_id, reply_parameters, allow_sending_without_reply - ) - message_thread_id = self._parse_message_thread_id(chat_id, message_thread_id) - return await self.get_bot().send_sticker( - chat_id=chat_id, - sticker=sticker, - disable_notification=disable_notification, - reply_parameters=effective_reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - protect_content=protect_content, - message_thread_id=message_thread_id, - emoji=emoji, - business_connection_id=self.business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def reply_video( - self, - video: Union[FileInput, "Video"], - duration: Optional[TimePeriod] = None, - caption: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - width: Optional[int] = None, - height: Optional[int] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - supports_streaming: Optional[bool] = None, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: ODVInput[int] = DEFAULT_NONE, - has_spoiler: Optional[bool] = None, - thumbnail: Optional[FileInput] = None, - reply_parameters: Optional["ReplyParameters"] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - show_caption_above_media: Optional[bool] = None, - cover: Optional[FileInput] = None, - start_timestamp: Optional[int] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - filename: Optional[str] = None, - do_quote: Optional[Union[bool, _ReplyKwargs]] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_video( - update.effective_message.chat_id, - message_thread_id=update.effective_message.message_thread_id, - business_connection_id=self.business_connection_id, - *args, - **kwargs, - ) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_video`. - - .. versionchanged:: 21.1 - |reply_same_thread| - - .. versionchanged:: 22.0 - |quote_removed| - - Keyword Args: - do_quote (:obj:`bool` | :obj:`dict`, optional): |do_quote| - - .. versionadded:: 20.8 - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - chat_id, effective_reply_parameters = await self._parse_quote_arguments( - do_quote, reply_to_message_id, reply_parameters, allow_sending_without_reply - ) - message_thread_id = self._parse_message_thread_id(chat_id, message_thread_id) - return await self.get_bot().send_video( - chat_id=chat_id, - video=video, - duration=duration, - caption=caption, - disable_notification=disable_notification, - reply_parameters=effective_reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - width=width, - height=height, - parse_mode=parse_mode, - supports_streaming=supports_streaming, - api_kwargs=api_kwargs, - caption_entities=caption_entities, - filename=filename, - protect_content=protect_content, - message_thread_id=message_thread_id, - has_spoiler=has_spoiler, - thumbnail=thumbnail, - cover=cover, - start_timestamp=start_timestamp, - business_connection_id=self.business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - show_caption_above_media=show_caption_above_media, - ) - - async def reply_video_note( - self, - video_note: Union[FileInput, "VideoNote"], - duration: Optional[TimePeriod] = None, - length: Optional[int] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: ODVInput[int] = DEFAULT_NONE, - thumbnail: Optional[FileInput] = None, - reply_parameters: Optional["ReplyParameters"] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - filename: Optional[str] = None, - do_quote: Optional[Union[bool, _ReplyKwargs]] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_video_note( - update.effective_message.chat_id, - message_thread_id=update.effective_message.message_thread_id, - business_connection_id=self.business_connection_id, - *args, - **kwargs, - ) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_video_note`. - - .. versionchanged:: 21.1 - |reply_same_thread| - - .. versionchanged:: 22.0 - |quote_removed| - - Keyword Args: - do_quote (:obj:`bool` | :obj:`dict`, optional): |do_quote| - - .. versionadded:: 20.8 - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - chat_id, effective_reply_parameters = await self._parse_quote_arguments( - do_quote, reply_to_message_id, reply_parameters, allow_sending_without_reply - ) - message_thread_id = self._parse_message_thread_id(chat_id, message_thread_id) - return await self.get_bot().send_video_note( - chat_id=chat_id, - video_note=video_note, - duration=duration, - length=length, - disable_notification=disable_notification, - reply_parameters=effective_reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - filename=filename, - protect_content=protect_content, - message_thread_id=message_thread_id, - thumbnail=thumbnail, - business_connection_id=self.business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def reply_voice( - self, - voice: Union[FileInput, "Voice"], - duration: Optional[TimePeriod] = None, - caption: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: ODVInput[int] = DEFAULT_NONE, - reply_parameters: Optional["ReplyParameters"] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - filename: Optional[str] = None, - do_quote: Optional[Union[bool, _ReplyKwargs]] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_voice( - update.effective_message.chat_id, - message_thread_id=update.effective_message.message_thread_id, - business_connection_id=self.business_connection_id, - *args, - **kwargs, - ) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_voice`. - - .. versionchanged:: 21.1 - |reply_same_thread| - - .. versionchanged:: 22.0 - |quote_removed| - - Keyword Args: - do_quote (:obj:`bool` | :obj:`dict`, optional): |do_quote| - - .. versionadded:: 20.8 - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - chat_id, effective_reply_parameters = await self._parse_quote_arguments( - do_quote, reply_to_message_id, reply_parameters, allow_sending_without_reply - ) - message_thread_id = self._parse_message_thread_id(chat_id, message_thread_id) - return await self.get_bot().send_voice( - chat_id=chat_id, - voice=voice, - duration=duration, - caption=caption, - disable_notification=disable_notification, - reply_parameters=effective_reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - parse_mode=parse_mode, - api_kwargs=api_kwargs, - caption_entities=caption_entities, - filename=filename, - protect_content=protect_content, - message_thread_id=message_thread_id, - business_connection_id=self.business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def reply_location( - self, - latitude: Optional[float] = None, - longitude: Optional[float] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - live_period: Optional[TimePeriod] = None, - horizontal_accuracy: Optional[float] = None, - heading: Optional[int] = None, - proximity_alert_radius: Optional[int] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: ODVInput[int] = DEFAULT_NONE, - reply_parameters: Optional["ReplyParameters"] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - location: Optional[Location] = None, - do_quote: Optional[Union[bool, _ReplyKwargs]] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_location( - update.effective_message.chat_id, - message_thread_id=update.effective_message.message_thread_id, - business_connection_id=self.business_connection_id, - *args, - **kwargs, - ) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_location`. - - .. versionchanged:: 21.1 - |reply_same_thread| - - .. versionchanged:: 22.0 - |quote_removed| - - Keyword Args: - do_quote (:obj:`bool` | :obj:`dict`, optional): |do_quote| - - .. versionadded:: 20.8 - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - chat_id, effective_reply_parameters = await self._parse_quote_arguments( - do_quote, reply_to_message_id, reply_parameters, allow_sending_without_reply - ) - message_thread_id = self._parse_message_thread_id(chat_id, message_thread_id) - return await self.get_bot().send_location( - chat_id=chat_id, - latitude=latitude, - longitude=longitude, - disable_notification=disable_notification, - reply_parameters=effective_reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - location=location, - live_period=live_period, - api_kwargs=api_kwargs, - horizontal_accuracy=horizontal_accuracy, - heading=heading, - proximity_alert_radius=proximity_alert_radius, - protect_content=protect_content, - message_thread_id=message_thread_id, - business_connection_id=self.business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def reply_venue( - self, - latitude: Optional[float] = None, - longitude: Optional[float] = None, - title: Optional[str] = None, - address: Optional[str] = None, - foursquare_id: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - foursquare_type: Optional[str] = None, - google_place_id: Optional[str] = None, - google_place_type: Optional[str] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: ODVInput[int] = DEFAULT_NONE, - reply_parameters: Optional["ReplyParameters"] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - venue: Optional[Venue] = None, - do_quote: Optional[Union[bool, _ReplyKwargs]] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_venue( - update.effective_message.chat_id, - message_thread_id=update.effective_message.message_thread_id, - business_connection_id=self.business_connection_id, - *args, - **kwargs, - ) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_venue`. - - .. versionchanged:: 21.1 - |reply_same_thread| - - .. versionchanged:: 22.0 - |quote_removed| - - Keyword Args: - do_quote (:obj:`bool` | :obj:`dict`, optional): |do_quote| - - .. versionadded:: 20.8 - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - chat_id, effective_reply_parameters = await self._parse_quote_arguments( - do_quote, reply_to_message_id, reply_parameters, allow_sending_without_reply - ) - message_thread_id = self._parse_message_thread_id(chat_id, message_thread_id) - return await self.get_bot().send_venue( - chat_id=chat_id, - latitude=latitude, - longitude=longitude, - title=title, - address=address, - foursquare_id=foursquare_id, - disable_notification=disable_notification, - reply_parameters=effective_reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - venue=venue, - foursquare_type=foursquare_type, - api_kwargs=api_kwargs, - google_place_id=google_place_id, - google_place_type=google_place_type, - protect_content=protect_content, - message_thread_id=message_thread_id, - business_connection_id=self.business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def reply_contact( - self, - phone_number: Optional[str] = None, - first_name: Optional[str] = None, - last_name: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - vcard: Optional[str] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: ODVInput[int] = DEFAULT_NONE, - reply_parameters: Optional["ReplyParameters"] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - contact: Optional[Contact] = None, - do_quote: Optional[Union[bool, _ReplyKwargs]] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_contact( - update.effective_message.chat_id, - message_thread_id=update.effective_message.message_thread_id, - business_connection_id=self.business_connection_id, - *args, - **kwargs, - ) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_contact`. - - .. versionchanged:: 21.1 - |reply_same_thread| - - .. versionchanged:: 22.0 - |quote_removed| - - Keyword Args: - do_quote (:obj:`bool` | :obj:`dict`, optional): |do_quote| - - .. versionadded:: 20.8 - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - chat_id, effective_reply_parameters = await self._parse_quote_arguments( - do_quote, reply_to_message_id, reply_parameters, allow_sending_without_reply - ) - message_thread_id = self._parse_message_thread_id(chat_id, message_thread_id) - return await self.get_bot().send_contact( - chat_id=chat_id, - phone_number=phone_number, - first_name=first_name, - last_name=last_name, - disable_notification=disable_notification, - reply_parameters=effective_reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - contact=contact, - vcard=vcard, - api_kwargs=api_kwargs, - protect_content=protect_content, - message_thread_id=message_thread_id, - business_connection_id=self.business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def reply_poll( - self, - question: str, - options: Sequence[Union[str, "InputPollOption"]], - is_anonymous: Optional[bool] = None, - type: Optional[str] = None, # pylint: disable=redefined-builtin - allows_multiple_answers: Optional[bool] = None, - correct_option_id: Optional[CorrectOptionID] = None, - is_closed: Optional[bool] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - explanation: Optional[str] = None, - explanation_parse_mode: ODVInput[str] = DEFAULT_NONE, - open_period: Optional[TimePeriod] = None, - close_date: Optional[Union[int, dtm.datetime]] = None, - explanation_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: ODVInput[int] = DEFAULT_NONE, - reply_parameters: Optional["ReplyParameters"] = None, - question_parse_mode: ODVInput[str] = DEFAULT_NONE, - question_entities: Optional[Sequence["MessageEntity"]] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - do_quote: Optional[Union[bool, _ReplyKwargs]] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_poll( - update.effective_message.chat_id, - message_thread_id=update.effective_message.message_thread_id, - business_connection_id=self.business_connection_id, - *args, - **kwargs, - ) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_poll`. - - .. versionchanged:: 21.1 - |reply_same_thread| - - .. versionchanged:: 22.0 - |quote_removed| - - Keyword Args: - do_quote (:obj:`bool` | :obj:`dict`, optional): |do_quote| - - .. versionadded:: 20.8 - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - chat_id, effective_reply_parameters = await self._parse_quote_arguments( - do_quote, reply_to_message_id, reply_parameters, allow_sending_without_reply - ) - message_thread_id = self._parse_message_thread_id(chat_id, message_thread_id) - return await self.get_bot().send_poll( - chat_id=chat_id, - question=question, - options=options, - is_anonymous=is_anonymous, - type=type, - allows_multiple_answers=allows_multiple_answers, - correct_option_id=correct_option_id, - is_closed=is_closed, - disable_notification=disable_notification, - reply_parameters=effective_reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - explanation=explanation, - explanation_parse_mode=explanation_parse_mode, - open_period=open_period, - close_date=close_date, - api_kwargs=api_kwargs, - explanation_entities=explanation_entities, - protect_content=protect_content, - message_thread_id=message_thread_id, - business_connection_id=self.business_connection_id, - question_parse_mode=question_parse_mode, - question_entities=question_entities, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def reply_dice( - self, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - emoji: Optional[str] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: ODVInput[int] = DEFAULT_NONE, - reply_parameters: Optional["ReplyParameters"] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - do_quote: Optional[Union[bool, _ReplyKwargs]] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_dice( - update.effective_message.chat_id, - message_thread_id=update.effective_message.message_thread_id, - business_connection_id=self.business_connection_id, - *args, - **kwargs, - ) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_dice`. - - .. versionchanged:: 21.1 - |reply_same_thread| - - .. versionchanged:: 22.0 - |quote_removed| - - Keyword Args: - do_quote (:obj:`bool` | :obj:`dict`, optional): |do_quote| - - .. versionadded:: 20.8 - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - chat_id, effective_reply_parameters = await self._parse_quote_arguments( - do_quote, reply_to_message_id, reply_parameters, allow_sending_without_reply - ) - message_thread_id = self._parse_message_thread_id(chat_id, message_thread_id) - return await self.get_bot().send_dice( - chat_id=chat_id, - disable_notification=disable_notification, - reply_parameters=effective_reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - emoji=emoji, - api_kwargs=api_kwargs, - protect_content=protect_content, - message_thread_id=message_thread_id, - business_connection_id=self.business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def reply_chat_action( - self, - action: str, - message_thread_id: ODVInput[int] = DEFAULT_NONE, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.send_chat_action( - update.effective_message.chat_id, - message_thread_id=update.effective_message.message_thread_id, - business_connection_id=self.business_connection_id, - *args, - **kwargs, - ) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_chat_action`. - - .. versionchanged:: 21.1 - |reply_same_thread| - - .. versionadded:: 13.2 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().send_chat_action( - chat_id=self.chat_id, - message_thread_id=self._parse_message_thread_id(self.chat_id, message_thread_id), - action=action, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - business_connection_id=self.business_connection_id, - ) - - async def reply_game( - self, - game_short_name: str, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: ODVInput[int] = DEFAULT_NONE, - reply_parameters: Optional["ReplyParameters"] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - do_quote: Optional[Union[bool, _ReplyKwargs]] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_game( - update.effective_message.chat_id, - message_thread_id=update.effective_message.message_thread_id, - business_connection_id=self.business_connection_id, - *args, - **kwargs, - ) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_game`. - - .. versionchanged:: 21.1 - |reply_same_thread| - - .. versionchanged:: 22.0 - |quote_removed| - - Keyword Args: - do_quote (:obj:`bool` | :obj:`dict`, optional): |do_quote| - - .. versionadded:: 20.8 - - .. versionadded:: 13.2 - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - chat_id, effective_reply_parameters = await self._parse_quote_arguments( - do_quote, reply_to_message_id, reply_parameters, allow_sending_without_reply - ) - message_thread_id = self._parse_message_thread_id(chat_id, message_thread_id) - return await self.get_bot().send_game( - chat_id=chat_id, # type: ignore[arg-type] - game_short_name=game_short_name, - disable_notification=disable_notification, - reply_parameters=effective_reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - protect_content=protect_content, - message_thread_id=message_thread_id, - business_connection_id=self.business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def reply_invoice( - self, - title: str, - description: str, - payload: str, - currency: str, - prices: Sequence["LabeledPrice"], - provider_token: Optional[str] = None, - start_parameter: Optional[str] = None, - photo_url: Optional[str] = None, - photo_size: Optional[int] = None, - photo_width: Optional[int] = None, - photo_height: Optional[int] = None, - need_name: Optional[bool] = None, - need_phone_number: Optional[bool] = None, - need_email: Optional[bool] = None, - need_shipping_address: Optional[bool] = None, - is_flexible: Optional[bool] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - provider_data: Optional[Union[str, object]] = None, - send_phone_number_to_provider: Optional[bool] = None, - send_email_to_provider: Optional[bool] = None, - max_tip_amount: Optional[int] = None, - suggested_tip_amounts: Optional[Sequence[int]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: ODVInput[int] = DEFAULT_NONE, - reply_parameters: Optional["ReplyParameters"] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - do_quote: Optional[Union[bool, _ReplyKwargs]] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_invoice( - update.effective_message.chat_id, - message_thread_id=update.effective_message.message_thread_id, - *args, - **kwargs, - ) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_invoice`. - - .. versionchanged:: 21.1 - |reply_same_thread| - - .. versionchanged:: 22.0 - |quote_removed| - - Warning: - As of API 5.2 :paramref:`start_parameter <telegram.Bot.send_invoice.start_parameter>` - is an optional argument and therefore the - order of the arguments had to be changed. Use keyword arguments to make sure that the - arguments are passed correctly. - - .. versionadded:: 13.2 - - .. versionchanged:: 13.5 - As of Bot API 5.2, the parameter - :paramref:`start_parameter <telegram.Bot.send_invoice.start_parameter>` is optional. - - Keyword Args: - do_quote (:obj:`bool` | :obj:`dict`, optional): |do_quote| - - .. versionadded:: 20.8 - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - chat_id, effective_reply_parameters = await self._parse_quote_arguments( - do_quote, reply_to_message_id, reply_parameters, allow_sending_without_reply - ) - message_thread_id = self._parse_message_thread_id(chat_id, message_thread_id) - return await self.get_bot().send_invoice( - chat_id=chat_id, - title=title, - description=description, - payload=payload, - provider_token=provider_token, - currency=currency, - prices=prices, - start_parameter=start_parameter, - photo_url=photo_url, - photo_size=photo_size, - photo_width=photo_width, - photo_height=photo_height, - need_name=need_name, - need_phone_number=need_phone_number, - need_email=need_email, - need_shipping_address=need_shipping_address, - is_flexible=is_flexible, - disable_notification=disable_notification, - reply_parameters=effective_reply_parameters, - reply_markup=reply_markup, - provider_data=provider_data, - send_phone_number_to_provider=send_phone_number_to_provider, - send_email_to_provider=send_email_to_provider, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - max_tip_amount=max_tip_amount, - suggested_tip_amounts=suggested_tip_amounts, - protect_content=protect_content, - message_thread_id=message_thread_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def forward( - self, - chat_id: Union[int, str], - disable_notification: ODVInput[bool] = DEFAULT_NONE, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - video_start_timestamp: Optional[int] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.forward_message( - from_chat_id=update.effective_message.chat_id, - message_id=update.effective_message.message_id, - *args, - **kwargs - ) - - For the documentation of the arguments, please see :meth:`telegram.Bot.forward_message`. - - Note: - Since the release of Bot API 5.5 it can be impossible to forward messages from - some chats. Use the attributes :attr:`telegram.Message.has_protected_content` and - :attr:`telegram.ChatFullInfo.has_protected_content` to check this. - - As a workaround, it is still possible to use :meth:`copy`. However, this - behaviour is undocumented and might be changed by Telegram. - - Returns: - :class:`telegram.Message`: On success, instance representing the message forwarded. - - """ - return await self.get_bot().forward_message( - chat_id=chat_id, - from_chat_id=self.chat_id, - message_id=self.message_id, - video_start_timestamp=video_start_timestamp, - disable_notification=disable_notification, - protect_content=protect_content, - message_thread_id=message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def copy( - self, - chat_id: Union[int, str], - caption: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - show_caption_above_media: Optional[bool] = None, - allow_paid_broadcast: Optional[bool] = None, - video_start_timestamp: Optional[int] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "MessageId": - """Shortcut for:: - - await bot.copy_message( - chat_id=chat_id, - from_chat_id=update.effective_message.chat_id, - message_id=update.effective_message.message_id, - *args, - **kwargs - ) - - For the documentation of the arguments, please see :meth:`telegram.Bot.copy_message`. - - Returns: - :class:`telegram.MessageId`: On success, returns the MessageId of the sent message. - - """ - return await self.get_bot().copy_message( - chat_id=chat_id, - from_chat_id=self.chat_id, - message_id=self.message_id, - caption=caption, - video_start_timestamp=video_start_timestamp, - parse_mode=parse_mode, - caption_entities=caption_entities, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - allow_sending_without_reply=allow_sending_without_reply, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - protect_content=protect_content, - message_thread_id=message_thread_id, - show_caption_above_media=show_caption_above_media, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def reply_copy( - self, - from_chat_id: Union[str, int], - message_id: int, - caption: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: ODVInput[int] = DEFAULT_NONE, - reply_parameters: Optional["ReplyParameters"] = None, - show_caption_above_media: Optional[bool] = None, - allow_paid_broadcast: Optional[bool] = None, - video_start_timestamp: Optional[int] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - do_quote: Optional[Union[bool, _ReplyKwargs]] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "MessageId": - """Shortcut for:: - - await bot.copy_message( - chat_id=message.chat.id, - message_thread_id=update.effective_message.message_thread_id, - message_id=message_id, - *args, - **kwargs - ) - - For the documentation of the arguments, please see :meth:`telegram.Bot.copy_message`. - - .. versionchanged:: 21.1 - |reply_same_thread| - - .. versionchanged:: 22.0 - |quote_removed| - - Keyword Args: - do_quote (:obj:`bool` | :obj:`dict`, optional): |do_quote| - - .. versionadded:: 20.8 - - Returns: - :class:`telegram.MessageId`: On success, returns the MessageId of the sent message. - - """ - chat_id, effective_reply_parameters = await self._parse_quote_arguments( - do_quote, reply_to_message_id, reply_parameters, allow_sending_without_reply - ) - message_thread_id = self._parse_message_thread_id(chat_id, message_thread_id) - return await self.get_bot().copy_message( - chat_id=chat_id, - from_chat_id=from_chat_id, - message_id=message_id, - caption=caption, - video_start_timestamp=video_start_timestamp, - parse_mode=parse_mode, - caption_entities=caption_entities, - disable_notification=disable_notification, - reply_parameters=effective_reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - protect_content=protect_content, - message_thread_id=message_thread_id, - show_caption_above_media=show_caption_above_media, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def reply_paid_media( - self, - star_count: int, - media: Sequence["InputPaidMedia"], - caption: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - show_caption_above_media: Optional[bool] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - protect_content: ODVInput[bool] = DEFAULT_NONE, - reply_parameters: Optional["ReplyParameters"] = None, - reply_markup: Optional[ReplyMarkup] = None, - payload: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - do_quote: Optional[Union[bool, _ReplyKwargs]] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_paid_media( - chat_id=message.chat.id, - business_connection_id=message.business_connection_id, - *args, - **kwargs - ) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_paid_media`. - - .. versionadded:: 21.7 - - Keyword Args: - do_quote (:obj:`bool` | :obj:`dict`, optional): |do_quote| - - Returns: - :class:`telegram.Message`: On success, the sent message is returned. - - """ - chat_id, effective_reply_parameters = await self._parse_quote_arguments( - do_quote, reply_to_message_id, reply_parameters, allow_sending_without_reply - ) - return await self.get_bot().send_paid_media( - chat_id=chat_id, - caption=caption, - star_count=star_count, - media=media, - payload=payload, - business_connection_id=self.business_connection_id, - parse_mode=parse_mode, - caption_entities=caption_entities, - disable_notification=disable_notification, - reply_parameters=effective_reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - protect_content=protect_content, - show_caption_above_media=show_caption_above_media, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def edit_text( - self, - text: str, - parse_mode: ODVInput[str] = DEFAULT_NONE, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - entities: Optional[Sequence["MessageEntity"]] = None, - link_preview_options: ODVInput["LinkPreviewOptions"] = DEFAULT_NONE, - *, - disable_web_page_preview: Optional[bool] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Union["Message", bool]: - """Shortcut for:: - - await bot.edit_message_text( - chat_id=message.chat_id, - message_id=message.message_id, - business_connection_id=message.business_connection_id, - *args, **kwargs - ) - - For the documentation of the arguments, please see :meth:`telegram.Bot.edit_message_text`. - - Note: - You can only edit messages that the bot sent itself (i.e. of the ``bot.send_*`` family - of methods) or channel posts, if the bot is an admin in that channel. However, this - behaviour is undocumented and might be changed by Telegram. - - .. versionchanged:: 21.4 - Now also passes :attr:`business_connection_id`. - - Returns: - :class:`telegram.Message`: On success, if edited message is sent by the bot, the - edited Message is returned, otherwise ``True`` is returned. - - """ - return await self.get_bot().edit_message_text( - chat_id=self.chat_id, - message_id=self.message_id, - text=text, - parse_mode=parse_mode, - disable_web_page_preview=disable_web_page_preview, - link_preview_options=link_preview_options, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - entities=entities, - inline_message_id=None, - business_connection_id=self.business_connection_id, - ) - - async def edit_caption( - self, - caption: Optional[str] = None, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - show_caption_above_media: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Union["Message", bool]: - """Shortcut for:: - - await bot.edit_message_caption( - chat_id=message.chat_id, - message_id=message.message_id, - business_connection_id=message.business_connection_id, - *args, **kwargs - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.edit_message_caption`. - - Note: - You can only edit messages that the bot sent itself (i.e. of the ``bot.send_*`` family - of methods) or channel posts, if the bot is an admin in that channel. However, this - behaviour is undocumented and might be changed by Telegram. - - .. versionchanged:: 21.4 - Now also passes :attr:`business_connection_id`. - - Returns: - :class:`telegram.Message`: On success, if edited message is sent by the bot, the - edited Message is returned, otherwise ``True`` is returned. - - """ - return await self.get_bot().edit_message_caption( - chat_id=self.chat_id, - message_id=self.message_id, - caption=caption, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - parse_mode=parse_mode, - api_kwargs=api_kwargs, - caption_entities=caption_entities, - inline_message_id=None, - show_caption_above_media=show_caption_above_media, - business_connection_id=self.business_connection_id, - ) - - async def edit_media( - self, - media: "InputMedia", - reply_markup: Optional["InlineKeyboardMarkup"] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Union["Message", bool]: - """Shortcut for:: - - await bot.edit_message_media( - chat_id=message.chat_id, - message_id=message.message_id, - business_connection_id=message.business_connection_id, - *args, **kwargs - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.edit_message_media`. - - Note: - You can only edit messages that the bot sent itself(i.e. of the ``bot.send_*`` family - of methods) or channel posts, if the bot is an admin in that channel. However, this - behaviour is undocumented and might be changed by Telegram. - - .. versionchanged:: 21.4 - Now also passes :attr:`business_connection_id`. - - Returns: - :class:`telegram.Message`: On success, if edited message is not an inline message, the - edited Message is returned, otherwise ``True`` is returned. - - """ - return await self.get_bot().edit_message_media( - media=media, - chat_id=self.chat_id, - message_id=self.message_id, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - inline_message_id=None, - business_connection_id=self.business_connection_id, - ) - - async def edit_reply_markup( - self, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Union["Message", bool]: - """Shortcut for:: - - await bot.edit_message_reply_markup( - chat_id=message.chat_id, - message_id=message.message_id, - business_connection_id=message.business_connection_id, - *args, **kwargs - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.edit_message_reply_markup`. - - Note: - You can only edit messages that the bot sent itself (i.e. of the ``bot.send_*`` family - of methods) or channel posts, if the bot is an admin in that channel. However, this - behaviour is undocumented and might be changed by Telegram. - - .. versionchanged:: 21.4 - Now also passes :attr:`business_connection_id`. - - Returns: - :class:`telegram.Message`: On success, if edited message is sent by the bot, the - edited Message is returned, otherwise ``True`` is returned. - """ - return await self.get_bot().edit_message_reply_markup( - chat_id=self.chat_id, - message_id=self.message_id, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - inline_message_id=None, - business_connection_id=self.business_connection_id, - ) - - async def edit_live_location( - self, - latitude: Optional[float] = None, - longitude: Optional[float] = None, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - horizontal_accuracy: Optional[float] = None, - heading: Optional[int] = None, - proximity_alert_radius: Optional[int] = None, - live_period: Optional[TimePeriod] = None, - *, - location: Optional[Location] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Union["Message", bool]: - """Shortcut for:: - - await bot.edit_message_live_location( - chat_id=message.chat_id, - message_id=message.message_id, - business_connection_id=message.business_connection_id, - *args, **kwargs - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.edit_message_live_location`. - - Note: - You can only edit messages that the bot sent itself (i.e. of the ``bot.send_*`` family - of methods) or channel posts, if the bot is an admin in that channel. However, this - behaviour is undocumented and might be changed by Telegram. - - .. versionchanged:: 21.4 - Now also passes :attr:`business_connection_id`. - - Returns: - :class:`telegram.Message`: On success, if edited message is sent by the bot, the - edited Message is returned, otherwise :obj:`True` is returned. - """ - return await self.get_bot().edit_message_live_location( - chat_id=self.chat_id, - message_id=self.message_id, - latitude=latitude, - longitude=longitude, - location=location, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - horizontal_accuracy=horizontal_accuracy, - heading=heading, - proximity_alert_radius=proximity_alert_radius, - live_period=live_period, - inline_message_id=None, - business_connection_id=self.business_connection_id, - ) - - async def stop_live_location( - self, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Union["Message", bool]: - """Shortcut for:: - - await bot.stop_message_live_location( - chat_id=message.chat_id, - message_id=message.message_id, - business_connection_id=message.business_connection_id, - *args, **kwargs - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.stop_message_live_location`. - - Note: - You can only edit messages that the bot sent itself (i.e. of the ``bot.send_*`` family - of methods) or channel posts, if the bot is an admin in that channel. However, this - behaviour is undocumented and might be changed by Telegram. - - .. versionchanged:: 21.4 - Now also passes :attr:`business_connection_id`. - - Returns: - :class:`telegram.Message`: On success, if edited message is sent by the bot, the - edited Message is returned, otherwise :obj:`True` is returned. - """ - return await self.get_bot().stop_message_live_location( - chat_id=self.chat_id, - message_id=self.message_id, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - inline_message_id=None, - business_connection_id=self.business_connection_id, - ) - - async def set_game_score( - self, - user_id: int, - score: int, - force: Optional[bool] = None, - disable_edit_message: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Union["Message", bool]: - """Shortcut for:: - - await bot.set_game_score( - chat_id=message.chat_id, message_id=message.message_id, *args, **kwargs - ) - - For the documentation of the arguments, please see :meth:`telegram.Bot.set_game_score`. - - Note: - You can only edit messages that the bot sent itself (i.e. of the ``bot.send_*`` family - of methods) or channel posts, if the bot is an admin in that channel. However, this - behaviour is undocumented and might be changed by Telegram. - - Returns: - :class:`telegram.Message`: On success, if edited message is sent by the bot, the - edited Message is returned, otherwise :obj:`True` is returned. - """ - return await self.get_bot().set_game_score( - chat_id=self.chat_id, - message_id=self.message_id, - user_id=user_id, - score=score, - force=force, - disable_edit_message=disable_edit_message, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - inline_message_id=None, - ) - - async def get_game_high_scores( - self, - user_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> tuple["GameHighScore", ...]: - """Shortcut for:: - - await bot.get_game_high_scores( - chat_id=message.chat_id, message_id=message.message_id, *args, **kwargs - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.get_game_high_scores`. - - Note: - You can only edit messages that the bot sent itself (i.e. of the ``bot.send_*`` family - of methods) or channel posts, if the bot is an admin in that channel. However, this - behaviour is undocumented and might be changed by Telegram. - - Returns: - tuple[:class:`telegram.GameHighScore`] - """ - return await self.get_bot().get_game_high_scores( - chat_id=self.chat_id, - message_id=self.message_id, - user_id=user_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - inline_message_id=None, - ) - - async def delete( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.delete_message( - chat_id=message.chat_id, message_id=message.message_id, *args, **kwargs - ) - - For the documentation of the arguments, please see :meth:`telegram.Bot.delete_message`. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().delete_message( - chat_id=self.chat_id, - message_id=self.message_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def stop_poll( - self, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Poll: - """Shortcut for:: - - await bot.stop_poll( - chat_id=message.chat_id, - message_id=message.message_id, - business_connection_id=message.business_connection_id, - *args, **kwargs - ) - - For the documentation of the arguments, please see :meth:`telegram.Bot.stop_poll`. - - .. versionchanged:: 21.4 - Now also passes :attr:`business_connection_id`. - - Returns: - :class:`telegram.Poll`: On success, the stopped Poll with the final results is - returned. - - """ - return await self.get_bot().stop_poll( - chat_id=self.chat_id, - message_id=self.message_id, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - business_connection_id=self.business_connection_id, - ) - - async def pin( - self, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.pin_chat_message( - chat_id=message.chat_id, - message_id=message.message_id, - business_connection_id=message.business_connection_id, - *args, **kwargs - ) - - For the documentation of the arguments, please see :meth:`telegram.Bot.pin_chat_message`. - - .. versionchanged:: 21.5 - Now also passes :attr:`business_connection_id` to - :meth:`telegram.Bot.pin_chat_message`. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().pin_chat_message( - chat_id=self.chat_id, - message_id=self.message_id, - business_connection_id=self.business_connection_id, - disable_notification=disable_notification, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def unpin( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.unpin_chat_message( - chat_id=message.chat_id, - message_id=message.message_id, - business_connection_id=message.business_connection_id, - *args, **kwargs - ) - - For the documentation of the arguments, please see :meth:`telegram.Bot.unpin_chat_message`. - - .. versionchanged:: 21.5 - Now also passes :attr:`business_connection_id` to - :meth:`telegram.Bot.pin_chat_message`. - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().unpin_chat_message( - chat_id=self.chat_id, - message_id=self.message_id, - business_connection_id=self.business_connection_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def edit_forum_topic( - self, - name: Optional[str] = None, - icon_custom_emoji_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.edit_forum_topic( - chat_id=message.chat_id, message_thread_id=message.message_thread_id, *args, - **kwargs - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.edit_forum_topic`. - - .. versionadded:: 20.0 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - """ - return await self.get_bot().edit_forum_topic( - chat_id=self.chat_id, - message_thread_id=self.message_thread_id, - name=name, - icon_custom_emoji_id=icon_custom_emoji_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def close_forum_topic( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.close_forum_topic( - chat_id=message.chat_id, message_thread_id=message.message_thread_id, *args, - **kwargs - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.close_forum_topic`. - - .. versionadded:: 20.0 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - """ - return await self.get_bot().close_forum_topic( - chat_id=self.chat_id, - message_thread_id=self.message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def reopen_forum_topic( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.reopen_forum_topic( - chat_id=message.chat_id, message_thread_id=message.message_thread_id, *args, - **kwargs - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.reopen_forum_topic`. - - .. versionadded:: 20.0 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - """ - return await self.get_bot().reopen_forum_topic( - chat_id=self.chat_id, - message_thread_id=self.message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def delete_forum_topic( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.delete_forum_topic( - chat_id=message.chat_id, message_thread_id=message.message_thread_id, *args, - **kwargs - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.delete_forum_topic`. - - .. versionadded:: 20.0 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - """ - return await self.get_bot().delete_forum_topic( - chat_id=self.chat_id, - message_thread_id=self.message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def unpin_all_forum_topic_messages( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.unpin_all_forum_topic_messages( - chat_id=message.chat_id, message_thread_id=message.message_thread_id, *args, - **kwargs - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.unpin_all_forum_topic_messages`. - - .. versionadded:: 20.0 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - """ - return await self.get_bot().unpin_all_forum_topic_messages( - chat_id=self.chat_id, - message_thread_id=self.message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def set_reaction( - self, - reaction: Optional[ - Union[Sequence["ReactionType"], "ReactionType", Sequence[str], str] - ] = None, - is_big: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.set_message_reaction(chat_id=message.chat_id, message_id=message.message_id, - *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.set_message_reaction`. - - .. versionadded:: 20.8 - - Returns: - :obj:`bool` On success, :obj:`True` is returned. - """ - return await self.get_bot().set_message_reaction( - chat_id=self.chat_id, - message_id=self.message_id, - reaction=reaction, - is_big=is_big, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def read_business_message( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.read_business_message( - chat_id=message.chat_id, - message_id=message.message_id, - business_connection_id=message.business_connection_id, - *args, **kwargs - ) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.read_business_message`. - - .. versionadded:: 22.1 - - Returns: - :obj:`bool` On success, :obj:`True` is returned. - """ - return await self.get_bot().read_business_message( - chat_id=self.chat_id, - message_id=self.message_id, - business_connection_id=self.business_connection_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - def parse_entity(self, entity: MessageEntity) -> str: - """Returns the text from a given :class:`telegram.MessageEntity`. - - Note: - This method is present because Telegram calculates the offset and length in - UTF-16 codepoint pairs, which some versions of Python don't handle automatically. - (That is, you can't just slice ``Message.text`` with the offset and length.) - - Args: - entity (:class:`telegram.MessageEntity`): The entity to extract the text from. It must - be an entity that belongs to this message. - - Returns: - :obj:`str`: The text of the given entity. - - Raises: - RuntimeError: If the message has no text. - - """ - if not self.text: - raise RuntimeError("This Message has no 'text'.") - - return parse_message_entity(self.text, entity) - - def parse_caption_entity(self, entity: MessageEntity) -> str: - """Returns the text from a given :class:`telegram.MessageEntity`. - - Note: - This method is present because Telegram calculates the offset and length in - UTF-16 codepoint pairs, which some versions of Python don't handle automatically. - (That is, you can't just slice ``Message.caption`` with the offset and length.) - - Args: - entity (:class:`telegram.MessageEntity`): The entity to extract the text from. It must - be an entity that belongs to this message. - - Returns: - :obj:`str`: The text of the given entity. - - Raises: - RuntimeError: If the message has no caption. - - """ - if not self.caption: - raise RuntimeError("This Message has no 'caption'.") - - return parse_message_entity(self.caption, entity) - - def parse_entities(self, types: Optional[list[str]] = None) -> dict[MessageEntity, str]: - """ - Returns a :obj:`dict` that maps :class:`telegram.MessageEntity` to :obj:`str`. - It contains entities from this message filtered by their - :attr:`telegram.MessageEntity.type` attribute as the key, and the text that each entity - belongs to as the value of the :obj:`dict`. - - Note: - This method should always be used instead of the :attr:`entities` attribute, since it - calculates the correct substring from the message text based on UTF-16 codepoints. - See :attr:`parse_entity` for more info. - - Args: - types (list[:obj:`str`], optional): List of :class:`telegram.MessageEntity` types as - strings. If the ``type`` attribute of an entity is contained in this list, it will - be returned. Defaults to a list of all types. All types can be found as constants - in :class:`telegram.MessageEntity`. - - Returns: - dict[:class:`telegram.MessageEntity`, :obj:`str`]: A dictionary of entities mapped to - the text that belongs to them, calculated based on UTF-16 codepoints. - - """ - return parse_message_entities(self.text, self.entities, types=types) - - def parse_caption_entities( - self, types: Optional[list[str]] = None - ) -> dict[MessageEntity, str]: - """ - Returns a :obj:`dict` that maps :class:`telegram.MessageEntity` to :obj:`str`. - It contains entities from this message's caption filtered by their - :attr:`telegram.MessageEntity.type` attribute as the key, and the text that each entity - belongs to as the value of the :obj:`dict`. - - Note: - This method should always be used instead of the :attr:`caption_entities` attribute, - since it calculates the correct substring from the message text based on UTF-16 - codepoints. See :attr:`parse_entity` for more info. - - Args: - types (list[:obj:`str`], optional): List of :class:`telegram.MessageEntity` types as - strings. If the ``type`` attribute of an entity is contained in this list, it will - be returned. Defaults to a list of all types. All types can be found as constants - in :class:`telegram.MessageEntity`. - - Returns: - dict[:class:`telegram.MessageEntity`, :obj:`str`]: A dictionary of entities mapped to - the text that belongs to them, calculated based on UTF-16 codepoints. - - """ - return parse_message_entities(self.caption, self.caption_entities, types=types) - - @classmethod - def _parse_html( - cls, - message_text: Optional[str], - entities: dict[MessageEntity, str], - urled: bool = False, - offset: int = 0, - ) -> Optional[str]: - if message_text is None: - return None - - utf_16_text = message_text.encode(TextEncoding.UTF_16_LE) - html_text = "" - last_offset = 0 - - sorted_entities = sorted(entities.items(), key=lambda item: item[0].offset) - parsed_entities = [] - - for entity, text in sorted_entities: - if entity in parsed_entities: - continue - - nested_entities = { - e: t - for (e, t) in sorted_entities - if e.offset >= entity.offset - and e.offset + e.length <= entity.offset + entity.length - and e != entity - } - parsed_entities.extend(list(nested_entities.keys())) - - if nested_entities: - escaped_text = cls._parse_html( - text, nested_entities, urled=urled, offset=entity.offset - ) - else: - escaped_text = escape(text) - - if entity.type == MessageEntity.TEXT_LINK: - insert = f'<a href="{entity.url}">{escaped_text}</a>' - elif entity.type == MessageEntity.TEXT_MENTION and entity.user: - insert = f'<a href="tg://user?id={entity.user.id}">{escaped_text}</a>' - elif entity.type == MessageEntity.URL and urled: - insert = f'<a href="{escaped_text}">{escaped_text}</a>' - elif entity.type == MessageEntity.BLOCKQUOTE: - insert = f"<blockquote>{escaped_text}</blockquote>" - elif entity.type == MessageEntity.EXPANDABLE_BLOCKQUOTE: - insert = f"<blockquote expandable>{escaped_text}</blockquote>" - elif entity.type == MessageEntity.BOLD: - insert = f"<b>{escaped_text}</b>" - elif entity.type == MessageEntity.ITALIC: - insert = f"<i>{escaped_text}</i>" - elif entity.type == MessageEntity.CODE: - insert = f"<code>{escaped_text}</code>" - elif entity.type == MessageEntity.PRE: - if entity.language: - insert = f'<pre><code class="{entity.language}">{escaped_text}</code></pre>' - else: - insert = f"<pre>{escaped_text}</pre>" - elif entity.type == MessageEntity.UNDERLINE: - insert = f"<u>{escaped_text}</u>" - elif entity.type == MessageEntity.STRIKETHROUGH: - insert = f"<s>{escaped_text}</s>" - elif entity.type == MessageEntity.SPOILER: - insert = f'<span class="tg-spoiler">{escaped_text}</span>' - elif entity.type == MessageEntity.CUSTOM_EMOJI: - insert = f'<tg-emoji emoji-id="{entity.custom_emoji_id}">{escaped_text}</tg-emoji>' - else: - insert = escaped_text - - # Make sure to escape the text that is not part of the entity - # if we're in a nested entity, this is still required, since in that case this - # text is part of the parent entity - html_text += ( - escape( - utf_16_text[last_offset * 2 : (entity.offset - offset) * 2].decode( - TextEncoding.UTF_16_LE - ) - ) - + insert - ) - - last_offset = entity.offset - offset + entity.length - - # see comment above - html_text += escape(utf_16_text[last_offset * 2 :].decode(TextEncoding.UTF_16_LE)) - - return html_text - - @property - def text_html(self) -> str: - """Creates an HTML-formatted string from the markup entities found in the message. - - Use this if you want to retrieve the message text with the entities formatted as HTML in - the same way the original message was formatted. - - Warning: - |text_html| - - .. versionchanged:: 13.10 - Spoiler entities are now formatted as HTML. - - .. versionchanged:: 20.3 - Custom emoji entities are now supported. - - .. versionchanged:: 20.8 - Blockquote entities are now supported. - - Returns: - :obj:`str`: Message text with entities formatted as HTML. - - """ - return self._parse_html(self.text, self.parse_entities(), urled=False) - - @property - def text_html_urled(self) -> str: - """Creates an HTML-formatted string from the markup entities found in the message. - - Use this if you want to retrieve the message text with the entities formatted as HTML. - This also formats :attr:`telegram.MessageEntity.URL` as a hyperlink. - - Warning: - |text_html| - - .. versionchanged:: 13.10 - Spoiler entities are now formatted as HTML. - - .. versionchanged:: 20.3 - Custom emoji entities are now supported. - - .. versionchanged:: 20.8 - Blockquote entities are now supported. - - Returns: - :obj:`str`: Message text with entities formatted as HTML. - - """ - return self._parse_html(self.text, self.parse_entities(), urled=True) - - @property - def caption_html(self) -> str: - """Creates an HTML-formatted string from the markup entities found in the message's - caption. - - Use this if you want to retrieve the message caption with the caption entities formatted as - HTML in the same way the original message was formatted. - - Warning: - |text_html| - - .. versionchanged:: 13.10 - Spoiler entities are now formatted as HTML. - - .. versionchanged:: 20.3 - Custom emoji entities are now supported. - - .. versionchanged:: 20.8 - Blockquote entities are now supported. - - Returns: - :obj:`str`: Message caption with caption entities formatted as HTML. - """ - return self._parse_html(self.caption, self.parse_caption_entities(), urled=False) - - @property - def caption_html_urled(self) -> str: - """Creates an HTML-formatted string from the markup entities found in the message's - caption. - - Use this if you want to retrieve the message caption with the caption entities formatted as - HTML. This also formats :attr:`telegram.MessageEntity.URL` as a hyperlink. - - Warning: - |text_html| - - .. versionchanged:: 13.10 - Spoiler entities are now formatted as HTML. - - .. versionchanged:: 20.3 - Custom emoji entities are now supported. - - .. versionchanged:: 20.8 - Blockquote entities are now supported. - - Returns: - :obj:`str`: Message caption with caption entities formatted as HTML. - """ - return self._parse_html(self.caption, self.parse_caption_entities(), urled=True) - - @classmethod - def _parse_markdown( - cls, - message_text: Optional[str], - entities: dict[MessageEntity, str], - urled: bool = False, - version: MarkdownVersion = 1, - offset: int = 0, - ) -> Optional[str]: - if version == 1: - for entity_type in ( - MessageEntity.EXPANDABLE_BLOCKQUOTE, - MessageEntity.BLOCKQUOTE, - MessageEntity.CUSTOM_EMOJI, - MessageEntity.SPOILER, - MessageEntity.STRIKETHROUGH, - MessageEntity.UNDERLINE, - ): - if any(entity.type == entity_type for entity in entities): - name = entity_type.name.title().replace("_", " ") # type:ignore[attr-defined] - raise ValueError(f"{name} entities are not supported for Markdown version 1") - - if message_text is None: - return None - - utf_16_text = message_text.encode(TextEncoding.UTF_16_LE) - markdown_text = "" - last_offset = 0 - - sorted_entities = sorted(entities.items(), key=lambda item: item[0].offset) - parsed_entities = [] - - for entity, text in sorted_entities: - if entity in parsed_entities: - continue - - nested_entities = { - e: t - for (e, t) in sorted_entities - if e.offset >= entity.offset - and e.offset + e.length <= entity.offset + entity.length - and e != entity - } - parsed_entities.extend(list(nested_entities.keys())) - - if nested_entities: - if version < 2: - raise ValueError("Nested entities are not supported for Markdown version 1") - - escaped_text = cls._parse_markdown( - text, - nested_entities, - urled=urled, - offset=entity.offset, - version=version, - ) - else: - escaped_text = escape_markdown(text, version=version) - - if entity.type == MessageEntity.TEXT_LINK: - if version == 1: - url = entity.url - else: - # Links need special escaping. Also can't have entities nested within - url = escape_markdown( - entity.url, version=version, entity_type=MessageEntity.TEXT_LINK - ) - insert = f"[{escaped_text}]({url})" - elif entity.type == MessageEntity.TEXT_MENTION and entity.user: - insert = f"[{escaped_text}](tg://user?id={entity.user.id})" - elif entity.type == MessageEntity.URL and urled: - link = text if version == 1 else escaped_text - insert = f"[{link}]({text})" - elif entity.type == MessageEntity.BOLD: - insert = f"*{escaped_text}*" - elif entity.type == MessageEntity.ITALIC: - insert = f"_{escaped_text}_" - elif entity.type == MessageEntity.CODE: - # Monospace needs special escaping. Also can't have entities nested within - insert = f"`{escape_markdown(text, version, MessageEntity.CODE)}`" - elif entity.type == MessageEntity.PRE: - # Monospace needs special escaping. Also can't have entities nested within - code = escape_markdown(text, version=version, entity_type=MessageEntity.PRE) - if entity.language: - prefix = f"```{entity.language}\n" - elif code.startswith("\\"): - prefix = "```" - else: - prefix = "```\n" - insert = f"{prefix}{code}```" - elif entity.type == MessageEntity.UNDERLINE: - insert = f"__{escaped_text}__" - elif entity.type == MessageEntity.STRIKETHROUGH: - insert = f"~{escaped_text}~" - elif entity.type == MessageEntity.SPOILER: - insert = f"||{escaped_text}||" - elif entity.type in (MessageEntity.BLOCKQUOTE, MessageEntity.EXPANDABLE_BLOCKQUOTE): - insert = ">" + "\n>".join(escaped_text.splitlines()) - if entity.type == MessageEntity.EXPANDABLE_BLOCKQUOTE: - insert = f"{insert}||" - elif entity.type == MessageEntity.CUSTOM_EMOJI: - # This should never be needed because ids are numeric but the documentation - # specifically mentions it so here we are - custom_emoji_id = escape_markdown( - entity.custom_emoji_id, - version=version, - entity_type=MessageEntity.CUSTOM_EMOJI, - ) - insert = f"![{escaped_text}](tg://emoji?id={custom_emoji_id})" - else: - insert = escaped_text - - # Make sure to escape the text that is not part of the entity - # if we're in a nested entity, this is still required, since in that case this - # text is part of the parent entity - markdown_text += ( - escape_markdown( - utf_16_text[last_offset * 2 : (entity.offset - offset) * 2].decode( - TextEncoding.UTF_16_LE - ), - version=version, - ) - + insert - ) - - last_offset = entity.offset - offset + entity.length - - # see comment above - markdown_text += escape_markdown( - utf_16_text[last_offset * 2 :].decode(TextEncoding.UTF_16_LE), - version=version, - ) - - return markdown_text - - @property - def text_markdown(self) -> str: - """Creates an Markdown-formatted string from the markup entities found in the message - using :class:`telegram.constants.ParseMode.MARKDOWN`. - - Use this if you want to retrieve the message text with the entities formatted as Markdown - in the same way the original message was formatted. - - Warning: - |text_markdown| - - Note: - :tg-const:`telegram.constants.ParseMode.MARKDOWN` is a legacy mode, retained by - Telegram for backward compatibility. You should use :meth:`text_markdown_v2` instead. - - .. versionchanged:: 20.5 - |custom_emoji_no_md1_support| - - .. versionchanged:: 20.8 - |blockquote_no_md1_support| - - Returns: - :obj:`str`: Message text with entities formatted as Markdown. - - Raises: - :exc:`ValueError`: If the message contains underline, strikethrough, spoiler, - blockquote or nested entities. - - """ - return self._parse_markdown(self.text, self.parse_entities(), urled=False) - - @property - def text_markdown_v2(self) -> str: - """Creates an Markdown-formatted string from the markup entities found in the message - using :class:`telegram.constants.ParseMode.MARKDOWN_V2`. - - Use this if you want to retrieve the message text with the entities formatted as Markdown - in the same way the original message was formatted. - - Warning: - |text_markdown| - - .. versionchanged:: 13.10 - Spoiler entities are now formatted as Markdown V2. - - .. versionchanged:: 20.3 - Custom emoji entities are now supported. - - .. versionchanged:: 20.8 - Blockquote entities are now supported. - - Returns: - :obj:`str`: Message text with entities formatted as Markdown. - """ - return self._parse_markdown(self.text, self.parse_entities(), urled=False, version=2) - - @property - def text_markdown_urled(self) -> str: - """Creates an Markdown-formatted string from the markup entities found in the message - using :class:`telegram.constants.ParseMode.MARKDOWN`. - - Use this if you want to retrieve the message text with the entities formatted as Markdown. - This also formats :attr:`telegram.MessageEntity.URL` as a hyperlink. - - Warning: - |text_markdown| - - Note: - :tg-const:`telegram.constants.ParseMode.MARKDOWN` is a legacy mode, retained by - Telegram for backward compatibility. You should use :meth:`text_markdown_v2_urled` - instead. - - .. versionchanged:: 20.5 - |custom_emoji_no_md1_support| - - .. versionchanged:: 20.8 - |blockquote_no_md1_support| - - Returns: - :obj:`str`: Message text with entities formatted as Markdown. - - Raises: - :exc:`ValueError`: If the message contains underline, strikethrough, spoiler, - blockquote or nested entities. - - """ - return self._parse_markdown(self.text, self.parse_entities(), urled=True) - - @property - def text_markdown_v2_urled(self) -> str: - """Creates an Markdown-formatted string from the markup entities found in the message - using :class:`telegram.constants.ParseMode.MARKDOWN_V2`. - - Use this if you want to retrieve the message text with the entities formatted as Markdown. - This also formats :attr:`telegram.MessageEntity.URL` as a hyperlink. - - Warning: - |text_markdown| - - .. versionchanged:: 13.10 - Spoiler entities are now formatted as Markdown V2. - - .. versionchanged:: 20.3 - Custom emoji entities are now supported. - - .. versionchanged:: 20.8 - Blockquote entities are now supported. - - Returns: - :obj:`str`: Message text with entities formatted as Markdown. - """ - return self._parse_markdown(self.text, self.parse_entities(), urled=True, version=2) - - @property - def caption_markdown(self) -> str: - """Creates an Markdown-formatted string from the markup entities found in the message's - caption using :class:`telegram.constants.ParseMode.MARKDOWN`. - - Use this if you want to retrieve the message caption with the caption entities formatted as - Markdown in the same way the original message was formatted. - - Warning: - |text_markdown| - - Note: - :tg-const:`telegram.constants.ParseMode.MARKDOWN` is a legacy mode, retained by - Telegram for backward compatibility. You should use :meth:`caption_markdown_v2` - .. versionchanged:: 20.5 - |custom_emoji_no_md1_support| - - .. versionchanged:: 20.8 - |blockquote_no_md1_support| - - Returns: - :obj:`str`: Message caption with caption entities formatted as Markdown. - - Raises: - :exc:`ValueError`: If the message contains underline, strikethrough, spoiler, - blockquote or nested entities. - - """ - return self._parse_markdown(self.caption, self.parse_caption_entities(), urled=False) - - @property - def caption_markdown_v2(self) -> str: - """Creates an Markdown-formatted string from the markup entities found in the message's - caption using :class:`telegram.constants.ParseMode.MARKDOWN_V2`. - - Use this if you want to retrieve the message caption with the caption entities formatted as - Markdown in the same way the original message was formatted. - - Warning: - |text_markdown| - - .. versionchanged:: 13.10 - Spoiler entities are now formatted as Markdown V2. - - .. versionchanged:: 20.3 - Custom emoji entities are now supported. - - .. versionchanged:: 20.8 - Blockquote entities are now supported. - - Returns: - :obj:`str`: Message caption with caption entities formatted as Markdown. - """ - return self._parse_markdown( - self.caption, self.parse_caption_entities(), urled=False, version=2 - ) - - @property - def caption_markdown_urled(self) -> str: - """Creates an Markdown-formatted string from the markup entities found in the message's - caption using :class:`telegram.constants.ParseMode.MARKDOWN`. - - Use this if you want to retrieve the message caption with the caption entities formatted as - Markdown. This also formats :attr:`telegram.MessageEntity.URL` as a hyperlink. - - Warning: - |text_markdown| - - Note: - :tg-const:`telegram.constants.ParseMode.MARKDOWN` is a legacy mode, retained by - Telegram for backward compatibility. You should use - :meth:`caption_markdown_v2_urled` instead. - - .. versionchanged:: 20.5 - |custom_emoji_no_md1_support| - - .. versionchanged:: 20.8 - |blockquote_no_md1_support| - - Returns: - :obj:`str`: Message caption with caption entities formatted as Markdown. - - Raises: - :exc:`ValueError`: If the message contains underline, strikethrough, spoiler, - blockquote or nested entities. - - """ - return self._parse_markdown(self.caption, self.parse_caption_entities(), urled=True) - - @property - def caption_markdown_v2_urled(self) -> str: - """Creates an Markdown-formatted string from the markup entities found in the message's - caption using :class:`telegram.constants.ParseMode.MARKDOWN_V2`. - - Use this if you want to retrieve the message caption with the caption entities formatted as - Markdown. This also formats :attr:`telegram.MessageEntity.URL` as a hyperlink. - - Warning: - |text_markdown| - - .. versionchanged:: 13.10 - Spoiler entities are now formatted as Markdown V2. - - .. versionchanged:: 20.3 - Custom emoji entities are now supported. - - .. versionchanged:: 20.8 - Blockquote entities are now supported. - - Returns: - :obj:`str`: Message caption with caption entities formatted as Markdown. - """ - return self._parse_markdown( - self.caption, self.parse_caption_entities(), urled=True, version=2 - ) diff --git a/venv/lib/python3.12/site-packages/telegram/_messageautodeletetimerchanged.py b/venv/lib/python3.12/site-packages/telegram/_messageautodeletetimerchanged.py deleted file mode 100644 index 0fb37f2..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_messageautodeletetimerchanged.py +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a change in the Telegram message auto -deletion. -""" - -import datetime as dtm -from typing import Optional, Union - -from telegram._telegramobject import TelegramObject -from telegram._utils.argumentparsing import to_timedelta -from telegram._utils.datetime import get_timedelta_value -from telegram._utils.types import JSONDict, TimePeriod - - -class MessageAutoDeleteTimerChanged(TelegramObject): - """This object represents a service message about a change in auto-delete timer settings. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`message_auto_delete_time` is equal. - - .. versionadded:: 13.4 - - Args: - message_auto_delete_time (:obj:`int` | :class:`datetime.timedelta`): New auto-delete time - for messages in the chat. - - .. versionchanged:: v22.2 - |time-period-input| - - Attributes: - message_auto_delete_time (:obj:`int` | :class:`datetime.timedelta`): New auto-delete time - for messages in the chat. - - .. deprecated:: v22.2 - |time-period-int-deprecated| - - """ - - __slots__ = ("_message_auto_delete_time",) - - def __init__( - self, - message_auto_delete_time: TimePeriod, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self._message_auto_delete_time: dtm.timedelta = to_timedelta(message_auto_delete_time) - - self._id_attrs = (self.message_auto_delete_time,) - - self._freeze() - - @property - def message_auto_delete_time(self) -> Union[int, dtm.timedelta]: - return get_timedelta_value( # type: ignore[return-value] - self._message_auto_delete_time, attribute="message_auto_delete_time" - ) diff --git a/venv/lib/python3.12/site-packages/telegram/_messageentity.py b/venv/lib/python3.12/site-packages/telegram/_messageentity.py deleted file mode 100644 index 10c9009..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_messageentity.py +++ /dev/null @@ -1,410 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram MessageEntity.""" - -import copy -import itertools -from collections.abc import Sequence -from typing import TYPE_CHECKING, Final, Optional, Union - -from telegram import constants -from telegram._telegramobject import TelegramObject -from telegram._user import User -from telegram._utils import enum -from telegram._utils.argumentparsing import de_json_optional -from telegram._utils.strings import TextEncoding -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot - -_SEM = Sequence["MessageEntity"] - - -class MessageEntity(TelegramObject): - """ - This object represents one special entity in a text message. For example, hashtags, - usernames, URLs, etc. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`type`, :attr:`offset` and :attr:`length` are equal. - - Args: - type (:obj:`str`): Type of the entity. Can be :attr:`MENTION` (``@username``), - :attr:`HASHTAG` (``#hashtag`` or ``#hashtag@chatusername``), :attr:`CASHTAG` (``$USD`` - or ``USD@chatusername``), :attr:`BOT_COMMAND` (``/start@jobs_bot``), :attr:`URL` - (``https://telegram.org``), :attr:`EMAIL` (``do-not-reply@telegram.org``), - :attr:`PHONE_NUMBER` (``+1-212-555-0123``), - :attr:`BOLD` (**bold text**), :attr:`ITALIC` (*italic text*), :attr:`UNDERLINE` - (underlined text), :attr:`STRIKETHROUGH`, :attr:`SPOILER` (spoiler message), - :attr:`BLOCKQUOTE` (block quotation), :attr:`CODE` (monowidth string), :attr:`PRE` - (monowidth block), :attr:`TEXT_LINK` (for clickable text URLs), :attr:`TEXT_MENTION` - (for users without usernames), :attr:`CUSTOM_EMOJI` (for inline custom emoji stickers). - - .. versionadded:: 20.0 - Added inline custom emoji - - .. versionadded:: 20.8 - Added block quotation - offset (:obj:`int`): Offset in UTF-16 code units to the start of the entity. - length (:obj:`int`): Length of the entity in UTF-16 code units. - url (:obj:`str`, optional): For :attr:`TEXT_LINK` only, url that will be opened after - user taps on the text. - user (:class:`telegram.User`, optional): For :attr:`TEXT_MENTION` only, the mentioned - user. - language (:obj:`str`, optional): For :attr:`PRE` only, the programming language of - the entity text. - custom_emoji_id (:obj:`str`, optional): For :attr:`CUSTOM_EMOJI` only, unique identifier - of the custom emoji. Use :meth:`telegram.Bot.get_custom_emoji_stickers` to get full - information about the sticker. - - .. versionadded:: 20.0 - Attributes: - type (:obj:`str`): Type of the entity. Can be :attr:`MENTION` (``@username``), - :attr:`HASHTAG` (``#hashtag`` or ``#hashtag@chatusername``), :attr:`CASHTAG` (``$USD`` - or ``USD@chatusername``), :attr:`BOT_COMMAND` (``/start@jobs_bot``), :attr:`URL` - (``https://telegram.org``), :attr:`EMAIL` (``do-not-reply@telegram.org``), - :attr:`PHONE_NUMBER` (``+1-212-555-0123``), - :attr:`BOLD` (**bold text**), :attr:`ITALIC` (*italic text*), :attr:`UNDERLINE` - (underlined text), :attr:`STRIKETHROUGH`, :attr:`SPOILER` (spoiler message), - :attr:`BLOCKQUOTE` (block quotation), :attr:`CODE` (monowidth string), :attr:`PRE` - (monowidth block), :attr:`TEXT_LINK` (for clickable text URLs), :attr:`TEXT_MENTION` - (for users without usernames), :attr:`CUSTOM_EMOJI` (for inline custom emoji stickers). - - .. versionadded:: 20.0 - Added inline custom emoji - - .. versionadded:: 20.8 - Added block quotation - offset (:obj:`int`): Offset in UTF-16 code units to the start of the entity. - length (:obj:`int`): Length of the entity in UTF-16 code units. - url (:obj:`str`): Optional. For :attr:`TEXT_LINK` only, url that will be opened after - user taps on the text. - user (:class:`telegram.User`): Optional. For :attr:`TEXT_MENTION` only, the mentioned - user. - language (:obj:`str`): Optional. For :attr:`PRE` only, the programming language of - the entity text. - custom_emoji_id (:obj:`str`): Optional. For :attr:`CUSTOM_EMOJI` only, unique identifier - of the custom emoji. Use :meth:`telegram.Bot.get_custom_emoji_stickers` to get full - information about the sticker. - - .. versionadded:: 20.0 - - """ - - __slots__ = ("custom_emoji_id", "language", "length", "offset", "type", "url", "user") - - def __init__( - self, - type: str, # pylint: disable=redefined-builtin - offset: int, - length: int, - url: Optional[str] = None, - user: Optional[User] = None, - language: Optional[str] = None, - custom_emoji_id: Optional[str] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - # Required - self.type: str = enum.get_member(constants.MessageEntityType, type, type) - self.offset: int = offset - self.length: int = length - # Optionals - self.url: Optional[str] = url - self.user: Optional[User] = user - self.language: Optional[str] = language - self.custom_emoji_id: Optional[str] = custom_emoji_id - - self._id_attrs = (self.type, self.offset, self.length) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "MessageEntity": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["user"] = de_json_optional(data.get("user"), User, bot) - - return super().de_json(data=data, bot=bot) - - @staticmethod - def adjust_message_entities_to_utf_16(text: str, entities: _SEM) -> _SEM: - """Utility functionality for converting the offset and length of entities from - Unicode (:obj:`str`) to UTF-16 (``utf-16-le`` encoded :obj:`bytes`). - - Tip: - Only the offsets and lengths calulated in UTF-16 is acceptable by the Telegram Bot API. - If they are calculated using the Unicode string (:obj:`str` object), errors may occur - when the text contains characters that are not in the Basic Multilingual Plane (BMP). - For more information, see `Unicode <https://en.wikipedia.org/wiki/Unicode>`_ and - `Plane (Unicode) <https://en.wikipedia.org/wiki/Plane_(Unicode)>`_. - - .. versionadded:: 21.4 - - Examples: - Below is a snippet of code that demonstrates how to use this function to convert - entities from Unicode to UTF-16 space. The ``unicode_entities`` are calculated in - Unicode and the `utf_16_entities` are calculated in UTF-16. - - .. code-block:: python - - text = "𠌕 bold 𝄢 italic underlined: 𝛙𝌢𑁍" - unicode_entities = [ - MessageEntity(offset=2, length=4, type=MessageEntity.BOLD), - MessageEntity(offset=9, length=6, type=MessageEntity.ITALIC), - MessageEntity(offset=28, length=3, type=MessageEntity.UNDERLINE), - ] - utf_16_entities = MessageEntity.adjust_message_entities_to_utf_16( - text, unicode_entities - ) - await bot.send_message( - chat_id=123, - text=text, - entities=utf_16_entities, - ) - # utf_16_entities[0]: offset=3, length=4 - # utf_16_entities[1]: offset=11, length=6 - # utf_16_entities[2]: offset=30, length=6 - - Args: - text (:obj:`str`): The text that the entities belong to - entities (Sequence[:class:`telegram.MessageEntity`]): Sequence of entities - with offset and length calculated in Unicode - - Returns: - Sequence[:class:`telegram.MessageEntity`]: Sequence of entities - with offset and length calculated in UTF-16 encoding - """ - # get sorted positions - positions = sorted(itertools.chain(*((x.offset, x.offset + x.length) for x in entities))) - accumulated_length = 0 - # calculate the length of each slice text[:position] in utf-16 accordingly, - # store the position translations - position_translation: dict[int, int] = {} - for i, position in enumerate(positions): - last_position = positions[i - 1] if i > 0 else 0 - text_slice = text[last_position:position] - accumulated_length += len(text_slice.encode(TextEncoding.UTF_16_LE)) // 2 - position_translation[position] = accumulated_length - # get the final output entities - out = [] - for entity in entities: - translated_positions = position_translation[entity.offset] - translated_length = ( - position_translation[entity.offset + entity.length] - translated_positions - ) - new_entity = copy.copy(entity) - with new_entity._unfrozen(): - new_entity.offset = translated_positions - new_entity.length = translated_length - out.append(new_entity) - return out - - @staticmethod - def shift_entities(by: Union[str, int], entities: _SEM) -> _SEM: - """Utility functionality for shifting the offset of entities by a given amount. - - Examples: - Shifting by an integer amount: - - .. code-block:: python - - text = "Hello, world!" - entities = [ - MessageEntity(offset=0, length=5, type=MessageEntity.BOLD), - MessageEntity(offset=7, length=5, type=MessageEntity.ITALIC), - ] - shifted_entities = MessageEntity.shift_entities(1, entities) - await bot.send_message( - chat_id=123, - text="!" + text, - entities=shifted_entities, - ) - - Shifting using a string: - - .. code-block:: python - - text = "Hello, world!" - prefix = "𝄢" - entities = [ - MessageEntity(offset=0, length=5, type=MessageEntity.BOLD), - MessageEntity(offset=7, length=5, type=MessageEntity.ITALIC), - ] - shifted_entities = MessageEntity.shift_entities(prefix, entities) - await bot.send_message( - chat_id=123, - text=prefix + text, - entities=shifted_entities, - ) - - Tip: - The :paramref:`entities` are *not* modified in place. The function returns a sequence - of new objects. - - .. versionadded:: 21.5 - - Args: - by (:obj:`str` | :obj:`int`): Either the amount to shift the offset by or - a string whose length will be used as the amount to shift the offset by. In this - case, UTF-16 encoding will be used to calculate the length. - entities (Sequence[:class:`telegram.MessageEntity`]): Sequence of entities - - Returns: - Sequence[:class:`telegram.MessageEntity`]: Sequence of entities with the offset shifted - """ - effective_shift = by if isinstance(by, int) else len(by.encode("utf-16-le")) // 2 - - out = [] - for entity in entities: - new_entity = copy.copy(entity) - with new_entity._unfrozen(): - new_entity.offset += effective_shift - out.append(new_entity) - return out - - @classmethod - def concatenate( - cls, - *args: Union[tuple[str, _SEM], tuple[str, _SEM, bool]], - ) -> tuple[str, _SEM]: - """Utility functionality for concatenating two text along with their formatting entities. - - Tip: - This function is useful for prefixing an already formatted text with a new text and its - formatting entities. In particular, it automatically correctly handles UTF-16 encoding. - - Examples: - This example shows a callback function that can be used to add a prefix and suffix to - the message in a :class:`~telegram.ext.CallbackQueryHandler`: - - .. code-block:: python - - async def prefix_message(update: Update, context: ContextTypes.DEFAULT_TYPE): - prefix = "𠌕 bold 𝄢 italic underlined: 𝛙𝌢𑁍 | " - prefix_entities = [ - MessageEntity(offset=2, length=4, type=MessageEntity.BOLD), - MessageEntity(offset=9, length=6, type=MessageEntity.ITALIC), - MessageEntity(offset=28, length=3, type=MessageEntity.UNDERLINE), - ] - suffix = " | 𠌕 bold 𝄢 italic underlined: 𝛙𝌢𑁍" - suffix_entities = [ - MessageEntity(offset=5, length=4, type=MessageEntity.BOLD), - MessageEntity(offset=12, length=6, type=MessageEntity.ITALIC), - MessageEntity(offset=31, length=3, type=MessageEntity.UNDERLINE), - ] - - message = update.effective_message - first = (prefix, prefix_entities, True) - second = (message.text, message.entities) - third = (suffix, suffix_entities, True) - - new_text, new_entities = MessageEntity.concatenate(first, second, third) - await update.callback_query.edit_message_text( - text=new_text, - entities=new_entities, - ) - - Hint: - The entities are *not* modified in place. The function returns a - new sequence of objects. - - .. versionadded:: 21.5 - - Args: - *args (tuple[:obj:`str`, Sequence[:class:`telegram.MessageEntity`]] | \ - tuple[:obj:`str`, Sequence[:class:`telegram.MessageEntity`], :obj:`bool`]): - Arbitrary number of tuples containing the text and its entities to concatenate. - If the last element of the tuple is a :obj:`bool`, it is used to determine whether - to adjust the entities to UTF-16 via - :meth:`adjust_message_entities_to_utf_16`. UTF-16 adjustment is disabled by - default. - - Returns: - tuple[:obj:`str`, Sequence[:class:`telegram.MessageEntity`]]: The concatenated text - and its entities - """ - output_text = "" - output_entities: list[MessageEntity] = [] - for arg in args: - text, entities = arg[0], arg[1] - - if len(arg) > 2 and arg[2] is True: - entities = cls.adjust_message_entities_to_utf_16(text, entities) - - output_entities.extend(cls.shift_entities(output_text, entities)) - output_text += text - - return output_text, output_entities - - ALL_TYPES: Final[list[str]] = list(constants.MessageEntityType) - """list[:obj:`str`]: A list of all available message entity types.""" - BLOCKQUOTE: Final[str] = constants.MessageEntityType.BLOCKQUOTE - """:const:`telegram.constants.MessageEntityType.BLOCKQUOTE` - - .. versionadded:: 20.8 - """ - BOLD: Final[str] = constants.MessageEntityType.BOLD - """:const:`telegram.constants.MessageEntityType.BOLD`""" - BOT_COMMAND: Final[str] = constants.MessageEntityType.BOT_COMMAND - """:const:`telegram.constants.MessageEntityType.BOT_COMMAND`""" - CASHTAG: Final[str] = constants.MessageEntityType.CASHTAG - """:const:`telegram.constants.MessageEntityType.CASHTAG`""" - CODE: Final[str] = constants.MessageEntityType.CODE - """:const:`telegram.constants.MessageEntityType.CODE`""" - CUSTOM_EMOJI: Final[str] = constants.MessageEntityType.CUSTOM_EMOJI - """:const:`telegram.constants.MessageEntityType.CUSTOM_EMOJI` - - .. versionadded:: 20.0 - """ - EMAIL: Final[str] = constants.MessageEntityType.EMAIL - """:const:`telegram.constants.MessageEntityType.EMAIL`""" - EXPANDABLE_BLOCKQUOTE: Final[str] = constants.MessageEntityType.EXPANDABLE_BLOCKQUOTE - """:const:`telegram.constants.MessageEntityType.EXPANDABLE_BLOCKQUOTE` - - .. versionadded:: 21.3 - """ - HASHTAG: Final[str] = constants.MessageEntityType.HASHTAG - """:const:`telegram.constants.MessageEntityType.HASHTAG`""" - ITALIC: Final[str] = constants.MessageEntityType.ITALIC - """:const:`telegram.constants.MessageEntityType.ITALIC`""" - MENTION: Final[str] = constants.MessageEntityType.MENTION - """:const:`telegram.constants.MessageEntityType.MENTION`""" - PHONE_NUMBER: Final[str] = constants.MessageEntityType.PHONE_NUMBER - """:const:`telegram.constants.MessageEntityType.PHONE_NUMBER`""" - PRE: Final[str] = constants.MessageEntityType.PRE - """:const:`telegram.constants.MessageEntityType.PRE`""" - SPOILER: Final[str] = constants.MessageEntityType.SPOILER - """:const:`telegram.constants.MessageEntityType.SPOILER` - - .. versionadded:: 13.10 - """ - STRIKETHROUGH: Final[str] = constants.MessageEntityType.STRIKETHROUGH - """:const:`telegram.constants.MessageEntityType.STRIKETHROUGH`""" - TEXT_LINK: Final[str] = constants.MessageEntityType.TEXT_LINK - """:const:`telegram.constants.MessageEntityType.TEXT_LINK`""" - TEXT_MENTION: Final[str] = constants.MessageEntityType.TEXT_MENTION - """:const:`telegram.constants.MessageEntityType.TEXT_MENTION`""" - UNDERLINE: Final[str] = constants.MessageEntityType.UNDERLINE - """:const:`telegram.constants.MessageEntityType.UNDERLINE`""" - URL: Final[str] = constants.MessageEntityType.URL - """:const:`telegram.constants.MessageEntityType.URL`""" diff --git a/venv/lib/python3.12/site-packages/telegram/_messageid.py b/venv/lib/python3.12/site-packages/telegram/_messageid.py deleted file mode 100644 index ac550fc..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_messageid.py +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents an instance of a Telegram MessageId.""" - -from typing import Optional - -from telegram._telegramobject import TelegramObject -from telegram._utils.types import JSONDict - - -class MessageId(TelegramObject): - """This object represents a unique message identifier. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`message_id` is equal. - - Args: - message_id (:obj:`int`): Unique message identifier. In specific instances - (e.g., message containing a video sent to a big chat), the server might automatically - schedule a message instead of sending it immediately. In such cases, this field will be - ``0`` and the relevant message will be unusable until it is actually sent. - - Attributes: - message_id (:obj:`int`): Unique message identifier. In specific instances - (e.g., message containing a video sent to a big chat), the server might automatically - schedule a message instead of sending it immediately. In such cases, this field will be - ``0`` and the relevant message will be unusable until it is actually sent. - """ - - __slots__ = ("message_id",) - - def __init__(self, message_id: int, *, api_kwargs: Optional[JSONDict] = None): - super().__init__(api_kwargs=api_kwargs) - self.message_id: int = message_id - - self._id_attrs = (self.message_id,) - - self._freeze() diff --git a/venv/lib/python3.12/site-packages/telegram/_messageorigin.py b/venv/lib/python3.12/site-packages/telegram/_messageorigin.py deleted file mode 100644 index 9838d6b..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_messageorigin.py +++ /dev/null @@ -1,282 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the classes that represent Telegram MessageOigin.""" -import datetime as dtm -from typing import TYPE_CHECKING, Final, Optional - -from telegram import constants -from telegram._chat import Chat -from telegram._telegramobject import TelegramObject -from telegram._user import User -from telegram._utils import enum -from telegram._utils.argumentparsing import de_json_optional -from telegram._utils.datetime import extract_tzinfo_from_defaults, from_timestamp -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot - - -class MessageOrigin(TelegramObject): - """ - Base class for telegram MessageOrigin object, it can be one of: - - * :class:`MessageOriginUser` - * :class:`MessageOriginHiddenUser` - * :class:`MessageOriginChat` - * :class:`MessageOriginChannel` - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`type` and :attr:`date` are equal. - - .. versionadded:: 20.8 - - Args: - type (:obj:`str`): Type of the message origin, can be on of: - :attr:`~telegram.MessageOrigin.USER`, :attr:`~telegram.MessageOrigin.HIDDEN_USER`, - :attr:`~telegram.MessageOrigin.CHAT`, or :attr:`~telegram.MessageOrigin.CHANNEL`. - date (:obj:`datetime.datetime`): Date the message was sent originally. - |datetime_localization| - - Attributes: - type (:obj:`str`): Type of the message origin, can be on of: - :attr:`~telegram.MessageOrigin.USER`, :attr:`~telegram.MessageOrigin.HIDDEN_USER`, - :attr:`~telegram.MessageOrigin.CHAT`, or :attr:`~telegram.MessageOrigin.CHANNEL`. - date (:obj:`datetime.datetime`): Date the message was sent originally. - |datetime_localization| - """ - - __slots__ = ( - "date", - "type", - ) - - USER: Final[str] = constants.MessageOriginType.USER - """:const:`telegram.constants.MessageOriginType.USER`""" - HIDDEN_USER: Final[str] = constants.MessageOriginType.HIDDEN_USER - """:const:`telegram.constants.MessageOriginType.HIDDEN_USER`""" - CHAT: Final[str] = constants.MessageOriginType.CHAT - """:const:`telegram.constants.MessageOriginType.CHAT`""" - CHANNEL: Final[str] = constants.MessageOriginType.CHANNEL - """:const:`telegram.constants.MessageOriginType.CHANNEL`""" - - def __init__( - self, - type: str, # pylint: disable=W0622 - date: dtm.datetime, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - # Required by all subclasses - self.type: str = enum.get_member(constants.MessageOriginType, type, type) - self.date: dtm.datetime = date - - self._id_attrs = ( - self.type, - self.date, - ) - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "MessageOrigin": - """Converts JSON data to the appropriate :class:`MessageOrigin` object, i.e. takes - care of selecting the correct subclass. - """ - data = cls._parse_data(data) - - _class_mapping: dict[str, type[MessageOrigin]] = { - cls.USER: MessageOriginUser, - cls.HIDDEN_USER: MessageOriginHiddenUser, - cls.CHAT: MessageOriginChat, - cls.CHANNEL: MessageOriginChannel, - } - if cls is MessageOrigin and data.get("type") in _class_mapping: - return _class_mapping[data.pop("type")].de_json(data=data, bot=bot) - - loc_tzinfo = extract_tzinfo_from_defaults(bot) - data["date"] = from_timestamp(data.get("date"), tzinfo=loc_tzinfo) - - if "sender_user" in data: - data["sender_user"] = de_json_optional(data.get("sender_user"), User, bot) - - if "sender_chat" in data: - data["sender_chat"] = de_json_optional(data.get("sender_chat"), Chat, bot) - - if "chat" in data: - data["chat"] = de_json_optional(data.get("chat"), Chat, bot) - - return super().de_json(data=data, bot=bot) - - -class MessageOriginUser(MessageOrigin): - """ - The message was originally sent by a known user. - - .. versionadded:: 20.8 - - Args: - date (:obj:`datetime.datetime`): Date the message was sent originally. - |datetime_localization| - sender_user (:class:`telegram.User`): User that sent the message originally. - - Attributes: - type (:obj:`str`): Type of the message origin. Always - :tg-const:`~telegram.MessageOrigin.USER`. - date (:obj:`datetime.datetime`): Date the message was sent originally. - |datetime_localization| - sender_user (:class:`telegram.User`): User that sent the message originally. - """ - - __slots__ = ("sender_user",) - - def __init__( - self, - date: dtm.datetime, - sender_user: User, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(type=self.USER, date=date, api_kwargs=api_kwargs) - - with self._unfrozen(): - self.sender_user: User = sender_user - - -class MessageOriginHiddenUser(MessageOrigin): - """ - The message was originally sent by an unknown user. - - .. versionadded:: 20.8 - - Args: - date (:obj:`datetime.datetime`): Date the message was sent originally. - |datetime_localization| - sender_user_name (:obj:`str`): Name of the user that sent the message originally. - - Attributes: - type (:obj:`str`): Type of the message origin. Always - :tg-const:`~telegram.MessageOrigin.HIDDEN_USER`. - date (:obj:`datetime.datetime`): Date the message was sent originally. - |datetime_localization| - sender_user_name (:obj:`str`): Name of the user that sent the message originally. - """ - - __slots__ = ("sender_user_name",) - - def __init__( - self, - date: dtm.datetime, - sender_user_name: str, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(type=self.HIDDEN_USER, date=date, api_kwargs=api_kwargs) - - with self._unfrozen(): - self.sender_user_name: str = sender_user_name - - -class MessageOriginChat(MessageOrigin): - """ - The message was originally sent on behalf of a chat to a group chat. - - .. versionadded:: 20.8 - - Args: - date (:obj:`datetime.datetime`): Date the message was sent originally. - |datetime_localization| - sender_chat (:class:`telegram.Chat`): Chat that sent the message originally. - author_signature (:obj:`str`, optional): For messages originally sent by an anonymous chat - administrator, original message author signature - - Attributes: - type (:obj:`str`): Type of the message origin. Always - :tg-const:`~telegram.MessageOrigin.CHAT`. - date (:obj:`datetime.datetime`): Date the message was sent originally. - |datetime_localization| - sender_chat (:class:`telegram.Chat`): Chat that sent the message originally. - author_signature (:obj:`str`): Optional. For messages originally sent by an anonymous chat - administrator, original message author signature - """ - - __slots__ = ( - "author_signature", - "sender_chat", - ) - - def __init__( - self, - date: dtm.datetime, - sender_chat: Chat, - author_signature: Optional[str] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(type=self.CHAT, date=date, api_kwargs=api_kwargs) - - with self._unfrozen(): - self.sender_chat: Chat = sender_chat - self.author_signature: Optional[str] = author_signature - - -class MessageOriginChannel(MessageOrigin): - """ - The message was originally sent to a channel chat. - - .. versionadded:: 20.8 - - Args: - date (:obj:`datetime.datetime`): Date the message was sent originally. - |datetime_localization| - chat (:class:`telegram.Chat`): Channel chat to which the message was originally sent. - message_id (:obj:`int`): Unique message identifier inside the chat. - author_signature (:obj:`str`, optional): Signature of the original post author. - - Attributes: - type (:obj:`str`): Type of the message origin. Always - :tg-const:`~telegram.MessageOrigin.CHANNEL`. - date (:obj:`datetime.datetime`): Date the message was sent originally. - |datetime_localization| - chat (:class:`telegram.Chat`): Channel chat to which the message was originally sent. - message_id (:obj:`int`): Unique message identifier inside the chat. - author_signature (:obj:`str`): Optional. Signature of the original post author. - """ - - __slots__ = ( - "author_signature", - "chat", - "message_id", - ) - - def __init__( - self, - date: dtm.datetime, - chat: Chat, - message_id: int, - author_signature: Optional[str] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(type=self.CHANNEL, date=date, api_kwargs=api_kwargs) - - with self._unfrozen(): - self.chat: Chat = chat - self.message_id: int = message_id - self.author_signature: Optional[str] = author_signature diff --git a/venv/lib/python3.12/site-packages/telegram/_messagereactionupdated.py b/venv/lib/python3.12/site-packages/telegram/_messagereactionupdated.py deleted file mode 100644 index b1b3385..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_messagereactionupdated.py +++ /dev/null @@ -1,199 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram MessageReaction Update.""" -import datetime as dtm -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional - -from telegram._chat import Chat -from telegram._reaction import ReactionCount, ReactionType -from telegram._telegramobject import TelegramObject -from telegram._user import User -from telegram._utils.argumentparsing import de_json_optional, de_list_optional, parse_sequence_arg -from telegram._utils.datetime import extract_tzinfo_from_defaults, from_timestamp -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot - - -class MessageReactionCountUpdated(TelegramObject): - """This class represents reaction changes on a message with anonymous reactions. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if the :attr:`chat`, :attr:`message_id`, :attr:`date` and :attr:`reactions` - is equal. - - .. versionadded:: 20.8 - - Args: - chat (:class:`telegram.Chat`): The chat containing the message. - message_id (:obj:`int`): Unique message identifier inside the chat. - date (:class:`datetime.datetime`): Date of the change in Unix time - |datetime_localization| - reactions (Sequence[:class:`telegram.ReactionCount`]): List of reactions that are present - on the message - - Attributes: - chat (:class:`telegram.Chat`): The chat containing the message. - message_id (:obj:`int`): Unique message identifier inside the chat. - date (:class:`datetime.datetime`): Date of the change in Unix time - |datetime_localization| - reactions (tuple[:class:`telegram.ReactionCount`]): List of reactions that are present on - the message - """ - - __slots__ = ( - "chat", - "date", - "message_id", - "reactions", - ) - - def __init__( - self, - chat: Chat, - message_id: int, - date: dtm.datetime, - reactions: Sequence[ReactionCount], - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - # Required - self.chat: Chat = chat - self.message_id: int = message_id - self.date: dtm.datetime = date - self.reactions: tuple[ReactionCount, ...] = parse_sequence_arg(reactions) - - self._id_attrs = (self.chat, self.message_id, self.date, self.reactions) - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "MessageReactionCountUpdated": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - # Get the local timezone from the bot if it has defaults - loc_tzinfo = extract_tzinfo_from_defaults(bot) - - data["date"] = from_timestamp(data.get("date"), tzinfo=loc_tzinfo) - data["chat"] = de_json_optional(data.get("chat"), Chat, bot) - data["reactions"] = de_list_optional(data.get("reactions"), ReactionCount, bot) - - return super().de_json(data=data, bot=bot) - - -class MessageReactionUpdated(TelegramObject): - """This class represents a change of a reaction on a message performed by a user. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if the :attr:`chat`, :attr:`message_id`, :attr:`date`, :attr:`old_reaction` - and :attr:`new_reaction` is equal. - - .. versionadded:: 20.8 - - Args: - chat (:class:`telegram.Chat`): The chat containing the message. - message_id (:obj:`int`): Unique message identifier inside the chat. - date (:class:`datetime.datetime`): Date of the change in Unix time. - |datetime_localization| - old_reaction (Sequence[:class:`telegram.ReactionType`]): Previous list of reaction types - that were set by the user. - new_reaction (Sequence[:class:`telegram.ReactionType`]): New list of reaction types that - were set by the user. - user (:class:`telegram.User`, optional): The user that changed the reaction, if the user - isn't anonymous. - actor_chat (:class:`telegram.Chat`, optional): The chat on behalf of which the reaction was - changed, if the user is anonymous. - - Attributes: - chat (:class:`telegram.Chat`): The chat containing the message. - message_id (:obj:`int`): Unique message identifier inside the chat. - date (:class:`datetime.datetime`): Date of the change in Unix time. - |datetime_localization| - old_reaction (tuple[:class:`telegram.ReactionType`]): Previous list of reaction types - that were set by the user. - new_reaction (tuple[:class:`telegram.ReactionType`]): New list of reaction types that - were set by the user. - user (:class:`telegram.User`): Optional. The user that changed the reaction, if the user - isn't anonymous. - actor_chat (:class:`telegram.Chat`): Optional. The chat on behalf of which the reaction was - changed, if the user is anonymous. - """ - - __slots__ = ( - "actor_chat", - "chat", - "date", - "message_id", - "new_reaction", - "old_reaction", - "user", - ) - - def __init__( - self, - chat: Chat, - message_id: int, - date: dtm.datetime, - old_reaction: Sequence[ReactionType], - new_reaction: Sequence[ReactionType], - user: Optional[User] = None, - actor_chat: Optional[Chat] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - # Required - self.chat: Chat = chat - self.message_id: int = message_id - self.date: dtm.datetime = date - self.old_reaction: tuple[ReactionType, ...] = parse_sequence_arg(old_reaction) - self.new_reaction: tuple[ReactionType, ...] = parse_sequence_arg(new_reaction) - - # Optional - self.user: Optional[User] = user - self.actor_chat: Optional[Chat] = actor_chat - - self._id_attrs = ( - self.chat, - self.message_id, - self.date, - self.old_reaction, - self.new_reaction, - ) - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "MessageReactionUpdated": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - # Get the local timezone from the bot if it has defaults - loc_tzinfo = extract_tzinfo_from_defaults(bot) - - data["date"] = from_timestamp(data.get("date"), tzinfo=loc_tzinfo) - data["chat"] = de_json_optional(data.get("chat"), Chat, bot) - data["old_reaction"] = de_list_optional(data.get("old_reaction"), ReactionType, bot) - data["new_reaction"] = de_list_optional(data.get("new_reaction"), ReactionType, bot) - data["user"] = de_json_optional(data.get("user"), User, bot) - data["actor_chat"] = de_json_optional(data.get("actor_chat"), Chat, bot) - - return super().de_json(data=data, bot=bot) diff --git a/venv/lib/python3.12/site-packages/telegram/_ownedgift.py b/venv/lib/python3.12/site-packages/telegram/_ownedgift.py deleted file mode 100644 index 875a015..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_ownedgift.py +++ /dev/null @@ -1,419 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains objects that represent owned gifts.""" - -import datetime as dtm -from collections.abc import Sequence -from typing import TYPE_CHECKING, Final, Optional - -from telegram import constants -from telegram._gifts import Gift -from telegram._messageentity import MessageEntity -from telegram._telegramobject import TelegramObject -from telegram._uniquegift import UniqueGift -from telegram._user import User -from telegram._utils import enum -from telegram._utils.argumentparsing import de_json_optional, de_list_optional, parse_sequence_arg -from telegram._utils.datetime import extract_tzinfo_from_defaults, from_timestamp -from telegram._utils.entities import parse_message_entities, parse_message_entity -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot - - -class OwnedGift(TelegramObject): - """This object describes a gift received and owned by a user or a chat. Currently, it - can be one of: - - * :class:`telegram.OwnedGiftRegular` - * :class:`telegram.OwnedGiftUnique` - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`type` is equal. - - .. versionadded:: 22.1 - - Args: - type (:obj:`str`): Type of the owned gift. - - Attributes: - type (:obj:`str`): Type of the owned gift. - """ - - __slots__ = ("type",) - - REGULAR: Final[str] = constants.OwnedGiftType.REGULAR - """:const:`telegram.constants.OwnedGiftType.REGULAR`""" - UNIQUE: Final[str] = constants.OwnedGiftType.UNIQUE - """:const:`telegram.constants.OwnedGiftType.UNIQUE`""" - - def __init__( - self, - type: str, # pylint: disable=redefined-builtin - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(api_kwargs=api_kwargs) - self.type: str = enum.get_member(constants.OwnedGiftType, type, type) - - self._id_attrs = (self.type,) - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "OwnedGift": - """Converts JSON data to the appropriate :class:`OwnedGift` object, i.e. takes - care of selecting the correct subclass. - - Args: - data (dict[:obj:`str`, ...]): The JSON data. - bot (:class:`telegram.Bot`, optional): The bot associated with this object. - - Returns: - The Telegram object. - - """ - data = cls._parse_data(data) - - _class_mapping: dict[str, type[OwnedGift]] = { - cls.REGULAR: OwnedGiftRegular, - cls.UNIQUE: OwnedGiftUnique, - } - - if cls is OwnedGift and data.get("type") in _class_mapping: - return _class_mapping[data.pop("type")].de_json(data=data, bot=bot) - - return super().de_json(data=data, bot=bot) - - -class OwnedGifts(TelegramObject): - """Contains the list of gifts received and owned by a user or a chat. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`total_count` and :attr:`gifts` are equal. - - .. versionadded:: 22.1 - - Args: - total_count (:obj:`int`): The total number of gifts owned by the user or the chat. - gifts (Sequence[:class:`telegram.OwnedGift`]): The list of gifts. - next_offset (:obj:`str`, optional): Offset for the next request. If empty, - then there are no more results. - - Attributes: - total_count (:obj:`int`): The total number of gifts owned by the user or the chat. - gifts (Sequence[:class:`telegram.OwnedGift`]): The list of gifts. - next_offset (:obj:`str`): Optional. Offset for the next request. If empty, - then there are no more results. - """ - - __slots__ = ( - "gifts", - "next_offset", - "total_count", - ) - - def __init__( - self, - total_count: int, - gifts: Sequence[OwnedGift], - next_offset: Optional[str] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.total_count: int = total_count - self.gifts: tuple[OwnedGift, ...] = parse_sequence_arg(gifts) - self.next_offset: Optional[str] = next_offset - - self._id_attrs = (self.total_count, self.gifts) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "OwnedGifts": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["gifts"] = de_list_optional(data.get("gifts"), OwnedGift, bot) - return super().de_json(data=data, bot=bot) - - -class OwnedGiftRegular(OwnedGift): - """Describes a regular gift owned by a user or a chat. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`gift` and :attr:`send_date` are equal. - - .. versionadded:: 22.1 - - Args: - gift (:class:`telegram.Gift`): Information about the regular gift. - owned_gift_id (:obj:`str`, optional): Unique identifier of the gift for the bot; for - gifts received on behalf of business accounts only. - sender_user (:class:`telegram.User`, optional): Sender of the gift if it is a known user. - send_date (:obj:`datetime.datetime`): Date the gift was sent as :class:`datetime.datetime`. - |datetime_localization|. - text (:obj:`str`, optional): Text of the message that was added to the gift. - entities (Sequence[:class:`telegram.MessageEntity`], optional): Special entities that - appear in the text. - is_private (:obj:`bool`, optional): :obj:`True`, if the sender and gift text are shown - only to the gift receiver; otherwise, everyone will be able to see them. - is_saved (:obj:`bool`, optional): :obj:`True`, if the gift is displayed on the account's - profile page; for gifts received on behalf of business accounts only. - can_be_upgraded (:obj:`bool`, optional): :obj:`True`, if the gift can be upgraded to a - unique gift; for gifts received on behalf of business accounts only. - was_refunded (:obj:`bool`, optional): :obj:`True`, if the gift was refunded and isn't - available anymore. - convert_star_count (:obj:`int`, optional): Number of Telegram Stars that can be - claimed by the receiver instead of the gift; omitted if the gift cannot be converted - to Telegram Stars. - prepaid_upgrade_star_count (:obj:`int`, optional): Number of Telegram Stars that were - paid by the sender for the ability to upgrade the gift. - - Attributes: - type (:obj:`str`): Type of the gift, always :attr:`~telegram.OwnedGift.REGULAR`. - gift (:class:`telegram.Gift`): Information about the regular gift. - owned_gift_id (:obj:`str`): Optional. Unique identifier of the gift for the bot; for - gifts received on behalf of business accounts only. - sender_user (:class:`telegram.User`): Optional. Sender of the gift if it is a known user. - send_date (:obj:`datetime.datetime`): Date the gift was sent as :class:`datetime.datetime`. - |datetime_localization|. - text (:obj:`str`): Optional. Text of the message that was added to the gift. - entities (Sequence[:class:`telegram.MessageEntity`]): Optional. Special entities that - appear in the text. - is_private (:obj:`bool`): Optional. :obj:`True`, if the sender and gift text are shown - only to the gift receiver; otherwise, everyone will be able to see them. - is_saved (:obj:`bool`): Optional. :obj:`True`, if the gift is displayed on the account's - profile page; for gifts received on behalf of business accounts only. - can_be_upgraded (:obj:`bool`): Optional. :obj:`True`, if the gift can be upgraded to a - unique gift; for gifts received on behalf of business accounts only. - was_refunded (:obj:`bool`): Optional. :obj:`True`, if the gift was refunded and isn't - available anymore. - convert_star_count (:obj:`int`): Optional. Number of Telegram Stars that can be - claimed by the receiver instead of the gift; omitted if the gift cannot be converted - to Telegram Stars. - prepaid_upgrade_star_count (:obj:`int`): Optional. Number of Telegram Stars that were - paid by the sender for the ability to upgrade the gift. - - """ - - __slots__ = ( - "can_be_upgraded", - "convert_star_count", - "entities", - "gift", - "is_private", - "is_saved", - "owned_gift_id", - "prepaid_upgrade_star_count", - "send_date", - "sender_user", - "text", - "was_refunded", - ) - - def __init__( - self, - gift: Gift, - send_date: dtm.datetime, - owned_gift_id: Optional[str] = None, - sender_user: Optional[User] = None, - text: Optional[str] = None, - entities: Optional[Sequence[MessageEntity]] = None, - is_private: Optional[bool] = None, - is_saved: Optional[bool] = None, - can_be_upgraded: Optional[bool] = None, - was_refunded: Optional[bool] = None, - convert_star_count: Optional[int] = None, - prepaid_upgrade_star_count: Optional[int] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(type=OwnedGift.REGULAR, api_kwargs=api_kwargs) - - with self._unfrozen(): - self.gift: Gift = gift - self.send_date: dtm.datetime = send_date - self.owned_gift_id: Optional[str] = owned_gift_id - self.sender_user: Optional[User] = sender_user - self.text: Optional[str] = text - self.entities: tuple[MessageEntity, ...] = parse_sequence_arg(entities) - self.is_private: Optional[bool] = is_private - self.is_saved: Optional[bool] = is_saved - self.can_be_upgraded: Optional[bool] = can_be_upgraded - self.was_refunded: Optional[bool] = was_refunded - self.convert_star_count: Optional[int] = convert_star_count - self.prepaid_upgrade_star_count: Optional[int] = prepaid_upgrade_star_count - - self._id_attrs = (self.type, self.gift, self.send_date) - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "OwnedGiftRegular": - """See :meth:`telegram.OwnedGift.de_json`.""" - data = cls._parse_data(data) - - loc_tzinfo = extract_tzinfo_from_defaults(bot) - data["send_date"] = from_timestamp(data.get("send_date"), tzinfo=loc_tzinfo) - data["sender_user"] = de_json_optional(data.get("sender_user"), User, bot) - data["gift"] = de_json_optional(data.get("gift"), Gift, bot) - data["entities"] = de_list_optional(data.get("entities"), MessageEntity, bot) - - return super().de_json(data=data, bot=bot) # type: ignore[return-value] - - def parse_entity(self, entity: MessageEntity) -> str: - """Returns the text in :attr:`text` - from a given :class:`telegram.MessageEntity` of :attr:`entities`. - - Note: - This method is present because Telegram calculates the offset and length in - UTF-16 codepoint pairs, which some versions of Python don't handle automatically. - (That is, you can't just slice ``OwnedGiftRegular.text`` with the offset and length.) - - Args: - entity (:class:`telegram.MessageEntity`): The entity to extract the text from. It must - be an entity that belongs to :attr:`entities`. - - Returns: - :obj:`str`: The text of the given entity. - - Raises: - RuntimeError: If the owned gift has no text. - - """ - if not self.text: - raise RuntimeError("This OwnedGiftRegular has no 'text'.") - - return parse_message_entity(self.text, entity) - - def parse_entities(self, types: Optional[list[str]] = None) -> dict[MessageEntity, str]: - """ - Returns a :obj:`dict` that maps :class:`telegram.MessageEntity` to :obj:`str`. - It contains entities from this owned gift's text filtered by their ``type`` attribute as - the key, and the text that each entity belongs to as the value of the :obj:`dict`. - - Note: - This method should always be used instead of the :attr:`entities` - attribute, since it calculates the correct substring from the message text based on - UTF-16 codepoints. See :attr:`parse_entity` for more info. - - Args: - types (list[:obj:`str`], optional): List of ``MessageEntity`` types as strings. If the - ``type`` attribute of an entity is contained in this list, it will be returned. - Defaults to :attr:`telegram.MessageEntity.ALL_TYPES`. - - Returns: - dict[:class:`telegram.MessageEntity`, :obj:`str`]: A dictionary of entities mapped to - the text that belongs to them, calculated based on UTF-16 codepoints. - - Raises: - RuntimeError: If the owned gift has no text. - - """ - if not self.text: - raise RuntimeError("This OwnedGiftRegular has no 'text'.") - - return parse_message_entities(self.text, self.entities, types) - - -class OwnedGiftUnique(OwnedGift): - """ - Describes a unique gift received and owned by a user or a chat. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`gift` and :attr:`send_date` are equal. - - .. versionadded:: 22.1 - - Args: - gift (:class:`telegram.UniqueGift`): Information about the unique gift. - owned_gift_id (:obj:`str`, optional): Unique identifier of the received gift for the - bot; for gifts received on behalf of business accounts only. - sender_user (:class:`telegram.User`, optional): Sender of the gift if it is a known user. - send_date (:obj:`datetime.datetime`): Date the gift was sent as :class:`datetime.datetime`. - |datetime_localization|. - is_saved (:obj:`bool`, optional): :obj:`True`, if the gift is displayed on the account's - profile page; for gifts received on behalf of business accounts only. - can_be_transferred (:obj:`bool`, optional): :obj:`True`, if the gift can be transferred to - another owner; for gifts received on behalf of business accounts only. - transfer_star_count (:obj:`int`, optional): Number of Telegram Stars that must be paid - to transfer the gift; omitted if the bot cannot transfer the gift. - - Attributes: - type (:obj:`str`): Type of the owned gift, always :tg-const:`~telegram.OwnedGift.UNIQUE`. - gift (:class:`telegram.UniqueGift`): Information about the unique gift. - owned_gift_id (:obj:`str`): Optional. Unique identifier of the received gift for the - bot; for gifts received on behalf of business accounts only. - sender_user (:class:`telegram.User`): Optional. Sender of the gift if it is a known user. - send_date (:obj:`datetime.datetime`): Date the gift was sent as :class:`datetime.datetime`. - |datetime_localization|. - is_saved (:obj:`bool`): Optional. :obj:`True`, if the gift is displayed on the account's - profile page; for gifts received on behalf of business accounts only. - can_be_transferred (:obj:`bool`): Optional. :obj:`True`, if the gift can be transferred to - another owner; for gifts received on behalf of business accounts only. - transfer_star_count (:obj:`int`): Optional. Number of Telegram Stars that must be paid - to transfer the gift; omitted if the bot cannot transfer the gift. - """ - - __slots__ = ( - "can_be_transferred", - "gift", - "is_saved", - "owned_gift_id", - "send_date", - "sender_user", - "transfer_star_count", - ) - - def __init__( - self, - gift: UniqueGift, - send_date: dtm.datetime, - owned_gift_id: Optional[str] = None, - sender_user: Optional[User] = None, - is_saved: Optional[bool] = None, - can_be_transferred: Optional[bool] = None, - transfer_star_count: Optional[int] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(type=OwnedGift.UNIQUE, api_kwargs=api_kwargs) - - with self._unfrozen(): - self.gift: UniqueGift = gift - self.send_date: dtm.datetime = send_date - self.owned_gift_id: Optional[str] = owned_gift_id - self.sender_user: Optional[User] = sender_user - self.is_saved: Optional[bool] = is_saved - self.can_be_transferred: Optional[bool] = can_be_transferred - self.transfer_star_count: Optional[int] = transfer_star_count - - self._id_attrs = (self.type, self.gift, self.send_date) - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "OwnedGiftUnique": - """See :meth:`telegram.OwnedGift.de_json`.""" - data = cls._parse_data(data) - - loc_tzinfo = extract_tzinfo_from_defaults(bot) - data["send_date"] = from_timestamp(data.get("send_date"), tzinfo=loc_tzinfo) - data["sender_user"] = de_json_optional(data.get("sender_user"), User, bot) - data["gift"] = de_json_optional(data.get("gift"), UniqueGift, bot) - - return super().de_json(data=data, bot=bot) # type: ignore[return-value] diff --git a/venv/lib/python3.12/site-packages/telegram/_paidmedia.py b/venv/lib/python3.12/site-packages/telegram/_paidmedia.py deleted file mode 100644 index 3940da0..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_paidmedia.py +++ /dev/null @@ -1,339 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains objects that represent paid media in Telegram.""" - -import datetime as dtm -from collections.abc import Sequence -from typing import TYPE_CHECKING, Final, Optional, Union - -from telegram import constants -from telegram._files.photosize import PhotoSize -from telegram._files.video import Video -from telegram._telegramobject import TelegramObject -from telegram._user import User -from telegram._utils import enum -from telegram._utils.argumentparsing import ( - de_json_optional, - de_list_optional, - parse_sequence_arg, - to_timedelta, -) -from telegram._utils.datetime import get_timedelta_value -from telegram._utils.types import JSONDict, TimePeriod - -if TYPE_CHECKING: - from telegram import Bot - - -class PaidMedia(TelegramObject): - """Describes the paid media added to a message. Currently, it can be one of: - - * :class:`telegram.PaidMediaPreview` - * :class:`telegram.PaidMediaPhoto` - * :class:`telegram.PaidMediaVideo` - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`type` is equal. - - .. versionadded:: 21.4 - - Args: - type (:obj:`str`): Type of the paid media. - - Attributes: - type (:obj:`str`): Type of the paid media. - """ - - __slots__ = ("type",) - - PREVIEW: Final[str] = constants.PaidMediaType.PREVIEW - """:const:`telegram.constants.PaidMediaType.PREVIEW`""" - PHOTO: Final[str] = constants.PaidMediaType.PHOTO - """:const:`telegram.constants.PaidMediaType.PHOTO`""" - VIDEO: Final[str] = constants.PaidMediaType.VIDEO - """:const:`telegram.constants.PaidMediaType.VIDEO`""" - - def __init__( - self, - type: str, # pylint: disable=redefined-builtin - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(api_kwargs=api_kwargs) - self.type: str = enum.get_member(constants.PaidMediaType, type, type) - - self._id_attrs = (self.type,) - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "PaidMedia": - """Converts JSON data to the appropriate :class:`PaidMedia` object, i.e. takes - care of selecting the correct subclass. - - Args: - data (dict[:obj:`str`, ...]): The JSON data. - bot (:class:`telegram.Bot`, optional): The bot associated with this object. - - Returns: - The Telegram object. - - """ - data = cls._parse_data(data) - - _class_mapping: dict[str, type[PaidMedia]] = { - cls.PREVIEW: PaidMediaPreview, - cls.PHOTO: PaidMediaPhoto, - cls.VIDEO: PaidMediaVideo, - } - - if cls is PaidMedia and data.get("type") in _class_mapping: - return _class_mapping[data.pop("type")].de_json(data=data, bot=bot) - - if "duration" in data: - data["duration"] = dtm.timedelta(seconds=s) if (s := data.get("duration")) else None - - return super().de_json(data=data, bot=bot) - - -class PaidMediaPreview(PaidMedia): - """The paid media isn't available before the payment. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`width`, :attr:`height`, and :attr:`duration` - are equal. - - .. versionadded:: 21.4 - - .. versionchanged:: v22.2 - As part of the migration to representing time periods using ``datetime.timedelta``, - equality comparison now considers integer durations and equivalent timedeltas as equal. - - Args: - type (:obj:`str`): Type of the paid media, always :tg-const:`telegram.PaidMedia.PREVIEW`. - width (:obj:`int`, optional): Media width as defined by the sender. - height (:obj:`int`, optional): Media height as defined by the sender. - duration (:obj:`int` | :class:`datetime.timedelta`, optional): Duration of the media in - seconds as defined by the sender. - - .. versionchanged:: v22.2 - |time-period-input| - - Attributes: - type (:obj:`str`): Type of the paid media, always :tg-const:`telegram.PaidMedia.PREVIEW`. - width (:obj:`int`): Optional. Media width as defined by the sender. - height (:obj:`int`): Optional. Media height as defined by the sender. - duration (:obj:`int` | :class:`datetime.timedelta`): Optional. Duration of the media in - seconds as defined by the sender. - - .. deprecated:: v22.2 - |time-period-int-deprecated| - """ - - __slots__ = ("_duration", "height", "width") - - def __init__( - self, - width: Optional[int] = None, - height: Optional[int] = None, - duration: Optional[TimePeriod] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(type=PaidMedia.PREVIEW, api_kwargs=api_kwargs) - - with self._unfrozen(): - self.width: Optional[int] = width - self.height: Optional[int] = height - self._duration: Optional[dtm.timedelta] = to_timedelta(duration) - - self._id_attrs = (self.type, self.width, self.height, self._duration) - - @property - def duration(self) -> Optional[Union[int, dtm.timedelta]]: - return get_timedelta_value(self._duration, attribute="duration") - - -class PaidMediaPhoto(PaidMedia): - """ - The paid media is a photo. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`photo` are equal. - - .. versionadded:: 21.4 - - Args: - type (:obj:`str`): Type of the paid media, always :tg-const:`telegram.PaidMedia.PHOTO`. - photo (Sequence[:class:`telegram.PhotoSize`]): The photo. - - Attributes: - type (:obj:`str`): Type of the paid media, always :tg-const:`telegram.PaidMedia.PHOTO`. - photo (tuple[:class:`telegram.PhotoSize`]): The photo. - """ - - __slots__ = ("photo",) - - def __init__( - self, - photo: Sequence["PhotoSize"], - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(type=PaidMedia.PHOTO, api_kwargs=api_kwargs) - - with self._unfrozen(): - self.photo: tuple[PhotoSize, ...] = parse_sequence_arg(photo) - - self._id_attrs = (self.type, self.photo) - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "PaidMediaPhoto": - data = cls._parse_data(data) - - data["photo"] = de_list_optional(data.get("photo"), PhotoSize, bot) - return super().de_json(data=data, bot=bot) # type: ignore[return-value] - - -class PaidMediaVideo(PaidMedia): - """ - The paid media is a video. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`video` are equal. - - .. versionadded:: 21.4 - - Args: - type (:obj:`str`): Type of the paid media, always :tg-const:`telegram.PaidMedia.VIDEO`. - video (:class:`telegram.Video`): The video. - - Attributes: - type (:obj:`str`): Type of the paid media, always :tg-const:`telegram.PaidMedia.VIDEO`. - video (:class:`telegram.Video`): The video. - """ - - __slots__ = ("video",) - - def __init__( - self, - video: Video, - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(type=PaidMedia.VIDEO, api_kwargs=api_kwargs) - - with self._unfrozen(): - self.video: Video = video - - self._id_attrs = (self.type, self.video) - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "PaidMediaVideo": - data = cls._parse_data(data) - - data["video"] = de_json_optional(data.get("video"), Video, bot) - return super().de_json(data=data, bot=bot) # type: ignore[return-value] - - -class PaidMediaInfo(TelegramObject): - """ - Describes the paid media added to a message. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`star_count` and :attr:`paid_media` are equal. - - .. versionadded:: 21.4 - - Args: - star_count (:obj:`int`): The number of Telegram Stars that must be paid to buy access to - the media. - paid_media (Sequence[:class:`telegram.PaidMedia`]): Information about the paid media. - - Attributes: - star_count (:obj:`int`): The number of Telegram Stars that must be paid to buy access to - the media. - paid_media (tuple[:class:`telegram.PaidMedia`]): Information about the paid media. - """ - - __slots__ = ("paid_media", "star_count") - - def __init__( - self, - star_count: int, - paid_media: Sequence[PaidMedia], - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(api_kwargs=api_kwargs) - self.star_count: int = star_count - self.paid_media: tuple[PaidMedia, ...] = parse_sequence_arg(paid_media) - - self._id_attrs = (self.star_count, self.paid_media) - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "PaidMediaInfo": - data = cls._parse_data(data) - - data["paid_media"] = de_list_optional(data.get("paid_media"), PaidMedia, bot) - return super().de_json(data=data, bot=bot) - - -class PaidMediaPurchased(TelegramObject): - """This object contains information about a paid media purchase. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`from_user` and :attr:`paid_media_payload` are equal. - - Note: - In Python :keyword:`from` is a reserved word. Use :paramref:`from_user` instead. - - .. versionadded:: 21.6 - - Args: - from_user (:class:`telegram.User`): User who purchased the media. - paid_media_payload (:obj:`str`): Bot-specified paid media payload. - - Attributes: - from_user (:class:`telegram.User`): User who purchased the media. - paid_media_payload (:obj:`str`): Bot-specified paid media payload. - """ - - __slots__ = ("from_user", "paid_media_payload") - - def __init__( - self, - from_user: "User", - paid_media_payload: str, - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(api_kwargs=api_kwargs) - self.from_user: User = from_user - self.paid_media_payload: str = paid_media_payload - - self._id_attrs = (self.from_user, self.paid_media_payload) - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "PaidMediaPurchased": - data = cls._parse_data(data) - - data["from_user"] = User.de_json(data=data.pop("from"), bot=bot) - return super().de_json(data=data, bot=bot) diff --git a/venv/lib/python3.12/site-packages/telegram/_paidmessagepricechanged.py b/venv/lib/python3.12/site-packages/telegram/_paidmessagepricechanged.py deleted file mode 100644 index d77cb6d..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_paidmessagepricechanged.py +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that describes a price change of a paid message.""" -from typing import Optional - -from telegram._telegramobject import TelegramObject -from telegram._utils.types import JSONDict - - -class PaidMessagePriceChanged(TelegramObject): - """Describes a service message about a change in the price of paid messages within a chat. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`paid_message_star_count` is equal. - - .. versionadded:: 22.1 - - Args: - paid_message_star_count (:obj:`int`): The new number of Telegram Stars that must be paid by - non-administrator users of the supergroup chat for each sent message - - Attributes: - paid_message_star_count (:obj:`int`): The new number of Telegram Stars that must be paid by - non-administrator users of the supergroup chat for each sent message - """ - - __slots__ = ("paid_message_star_count",) - - def __init__( - self, - paid_message_star_count: int, - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(api_kwargs=api_kwargs) - self.paid_message_star_count: int = paid_message_star_count - - self._id_attrs = (self.paid_message_star_count,) - self._freeze() diff --git a/venv/lib/python3.12/site-packages/telegram/_passport/__init__.py b/venv/lib/python3.12/site-packages/telegram/_passport/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/telegram/_passport/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_passport/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index c1120db7eec9c5b8be33b6ffa25baefdfbb267d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211 zcmZ8b%L>9U5KOFs2>lQb?V?`AlV^V+#CB;zn+Hi+DSn7I?|zG);a!m4dNMf)4(!g% zvIFx>(-jGL->-G#S6u%X=izcA16kA4gV<ScWBi#c)LJ4)?p+T@U33zaci^$b%5s@G zFNy|jR_cptH80UZkE(}OoWTsf)@qk;w%~-v%<!V&75>t|40q0G>wz($gl8-_!?fH> VU3M)V>>^a4VO$iSgi>mgpuR6QJLLcX diff --git a/venv/lib/python3.12/site-packages/telegram/_passport/__pycache__/credentials.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_passport/__pycache__/credentials.cpython-312.pyc deleted file mode 100644 index 5906b64636c6664aec7e545e1a35696faf3bb984..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23631 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 N80)wEbsr7p{{n9WD@OnT diff --git a/venv/lib/python3.12/site-packages/telegram/_passport/__pycache__/data.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_passport/__pycache__/data.cpython-312.pyc deleted file mode 100644 index 7b703d7b52f34d90eea295382e3d217f27fb26a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5980 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 RI@}Rvq3CB{5{P)u{{iPGB|QKD diff --git a/venv/lib/python3.12/site-packages/telegram/_passport/__pycache__/encryptedpassportelement.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_passport/__pycache__/encryptedpassportelement.cpython-312.pyc deleted file mode 100644 index c5e8a485ddfba366c5e933133e2f75090ede940a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12871 zcmeG?TWlLwb~Aj5Z&I=zv|>pUO7WVOMB1_)D~c2NAt$zz$aefnXeXl~XC%@dlIqMz zj=W6cEeuow8pJM8M8Fn>7wCr#8?Xy3S_KH&d=!O&?uTd^kUCJ16iq)06a^DI*kHeU z&Yc%2QITVBwk?_~Xm}szo_p`P=XLKr{~QQ-DM<hIS3l33-9b_Rh6N)z^~}S+hs?(m zPbDdy=4~RKvn6db=Ix?A=SVt8-XS`3uB0p1kZj1glWtPy6g@d_(o6C#(U<cl{kcFg zkP9Y*q^>~><-*A@$-BkITvM`%<UQhsTywHH*OF|>wI*A0ZOOJ=BpD%XUU6ftJ=soE zf=hD49DL$4xlPGUxsGH9P1&edDc*mD;sZj{ExR`VWao4+7P@reWF{*!xdJ~a3QW3? zSGa6mX1F|4NSznb3ZrB=g^`2_NsxuS0xir*K@`R%F2@|qr={r$Mc|KdvOH0cl!Ky> z1EBbS;0Q5V^`xHP$qVTMFF?V4LinReA)gjvb~SMF?PCYo1BVVCc<u1WtE&6xgpw`f zIZ<_<%0mXA{m>7Qv*%?f+tuJ<ez=gHMD)X)!l|KSf&?v`I4r=7MOkfnQ;@SfG-o++ zAJ4;dWkh34?Uk&ElL#7<KT1{?bE@sUK*nJ80R^5d7_$i*ZDtKZi&<G&3!1c<&`lGZ zBnzypFP!D1aU{f%6GumevuPz}Q|<c;it0Nc3Hr?Cw6;0gccWf-2&_Q;De#&=C28O{ z8&4<gye;YQP_=)2gtzmKzodDm;N)HK-ypbz2Ei?O1n-y~(cwSuhFT}ddCZ&_az4Rt z!uX&}O1$691<YJ<1#}3?0qi^0Izx@oeE3Qz85BbNMwmf>Zxmd76B%y<PmQ?<MDvxv zEq!^(FhJJAweYPx!nz4;+ZDeF+c-nLM<<(3P_cG3vK9w&zigu@F9Yd-!O_|LSV78h z$Y%_fDoiR2uk(}46eOmgWCY1#ZG&wX;C19VnUOOb>=JV^t7JeX1SVBb$N;HnQk;|p zDbAdP1|Hax$#6205(F4(QYql5X-*WU8I#8t=r%E}WD5CyMHi=jz!>)uoEme&yv6`G zNM~9E0b^i%5YQa(6qf>7&E^?Jka7eH7>pCM$~4U2VnLVOI^79!kZ}|gTny>f$7FFB zAuBOMoT5lWqssJzFxqF7a6MLO0;Vjm`N>>LkgQrE2QoO?NAT-N#z5d?3t~)yjbL$L zt4<Q8K!`y;uohGfZwx65;#d}|V8vvPI$cHziZDb5!L22VOV?6BB#X9%JdpZg2B=?< zvg6r2kUu}pzzlL`Ut^^@?c>INqi%_tm{_uQeeiwKxNHrMG-9?4!SF+)vLcPfh8SJ@ zG1wGmj^+j2zvzUnr$A#6MHTIXI$d94o|m#f1yCw!AukJ2jfS{9Oi@jvDbsA4lXwKr z=3&!8?XlH3I8EPS`=pXZMqpD}QN(hJ%U@t+g;NL{uS72aYXdHBToUwlYjUh4jDx0= zh{zx+Kmkgglcra-R5QiOAqZ<k<0j=nGBPU&x1W=R=XdslZ2(IFT&am1%20*@p=Bmz z+`nwz#DSz4B0>Sox^fHkZ8#`N1?f~?o)FSmU?zUlngWr~EvpgKT9i?yxO$LUD}*4` zX%))VHi=+0xu%aXY(>msEyOsiSwEl#tRD!Y*;%4nUSzl_kT#+N2&W^7)?u?6%B^C# z$6_-gpHYL;2$RbeNvk=adUvZA$eaQl`7@aTb|*W+kWP%IOX{tvcGlHHL^UBZ0SJ>l z_P83fzLa_cGf|CeP5iheM6AskqTZM-hEH>L)z%vt1s#vkcWUUcPm;K4R1W6GCQOxM z4uC^ygAkKr8LJ7YFa>IXM-zgE2rW<jMbzqo8qBNo0uz0FU4X1mi){_nU~owda6FD2 zAcGxFXSn>hzz+>E1KZ-;YJhO{MZ<3*k`BI;T-3}XA&qHIVB6PH1%&oBq&FP~i{gaJ zrd_X@1u<F-nkUT^gK^h=hCZhLHtee>nx?j|LB6gSY7)0v;agHyZ9soSGU&rRB_Y0d z@%mbc7i?HNYn_@u@FT8JAAtB<nnW>~g2<!U;nv-AOC5tFC84h`!<h&zSM8FkE%r*Q zzfuLSzxQC6^RlS<vrngnYGzqSB~_~-V^mn5F2uymG{i!#FBUZ;tU<0C!dYGjIv(p0 zYo*Ur&qb=$g{%Fddit+s+NRT1>-}gO^@r7e`@l=jrY05PCx7%Oe{{I&R^+Mu(G_0k zQT-w${`>Gp>r2yP$#=bDk0y9O)E|Xonzg7upg;P(<NhA~QDt&M6xMS_YbNuPGg{Xf zt>IR5IJYuILR`%m1q}?|DArdefZ@c8+_X#}pU7LS*_$8RTeVDa)j{%qg}3??WOx#9 zwH_f>cpWvHjdxWm?q+_dxB3(-{J-w4KDm;r*@XWwS5>=kG3Dg{je}Z4ebjqTtP^8i z)q%Hgs*~70)k$tTRIhbQtUB=ePxV*d`l$Zu1F!1R<UsWqhZ49_P#t(pGjfwwz1&2W zy>Jn)4Wwt`p+VY&p9p?B@Pp40QagU0!A~cCy70r`ryD+LAAB&u;|t}6e>?m?{56#R zg8rCNprEB$f06nS9tDfO+w?7jg+x<Dx=67$tpsg$C}Dq+iVi3_%#ssI#-k#o1k8Gu zfeqRl%-RMh;cQ4Mx}oGTOCBhZhfA!f!sM;OWUPuR+5p;b_NC67GcxL6-qd-QRWfo= zYtF!^Be3S!HMK#jWaI!t*vMPIP}^jcj2zT98+q$@3|DT^iaL+Gx*{2mMl>}|#cU%| z6xw4U)hSQHt-R`H*=#<mu&l-(D_8?3vNnGpGpQan%d_}oBC8GT7+j%W5@G?>fo%DN zEC(oA;$X0>jBBfQE-wG>PZF6zPDsFWl020#{C+uM+<^DX@XT~Ukox(;#k^SH;Eg9S zCFG|PVm6h~9-DT=w+|%btRnPJaOn%&xM1~8m@f(mQ?VL17W$2Rd}3PK470lQtm&8- zx19Q=d)y%DF9A&c6h7ZwrXF=tp5Sal$sM_VWWgPI;7(LrRD0))<Ig-_Cf~)MrQY2$ zjtB0IOFc0tdY2RXK6|d5IE4A7fj#gOTH3i+gNW~hqHlTEtM`26T_>?Fvb3=S>O6on z(D>2e*~3fzu>P~??<n~@uzY0pNY&5L*`rXhT3?%et<vae_X3(=rIqpoKJw4{KMX#E z`BSPL-sL1@K-DD)%A}M}n{o`5D7Qo}{H?ARfLnDP04-)JnwsH#S~2?<>GP)Co1hRt zU`VTC%3jfCJlnrV%NS%}E7Cl@2RbR1^w-B`|2}Mh#r{}W9P40lJQfz`I#`?p%X;)N z_2N48aS?2$PMQTB{2{1)(9E{m4YzdN3=hffOMNE<ff>pPN~Y>TsWwyqUIj^<z-XLk zg^_w@<EBkBF#WJEu?E!#B8BgpXz8Rzs8j9Zf+C^Hl|uM=4(l3p#4(3zPm8jJLD~w< zGAd<I1DB;<>;bVT)TOlpFLYG@gdP6@KHpuYKrF%=KKfwxgE^%f>X~tT71?s5`A+0! z<nGVPv7t|2zt>%kjNFf$UU>8LjAQ1^Y+$*g{|0|2b2D?dSdI_>qquPLOu6GNXggPO zw=Z`k?mGU?{WtFU&hoZHzv)|e>ukB}95lXLa&KDR7`xGPXUokkcL&Q`_k1eeJ5b(u z4BFnB4K8=aZzy-(yZPRHpqzN+H~xjwZ<jlh_d8Py@1_9aos#>RuR_hU7iT}XK71oR z^FcW@u;3n$`d|&JFKvZKNG(v4t~OMrVGcqq8fFv>5^G?aqOa1@e=4Rp7VYOvgA8c& zWWXB?@xG(zsAmd)@h^&HglXP^V<@H>G<wUY71O|08Q{7Y&(|@Grhr(ct$yD+=Ce*; zeV#^(p+sQKL|~1z^Ue!ffV(=C4F*-}nOy9Js|N9L8S6DL<&T)S8m15v1Yl_C2V;89 z#N;Nk>QHb{l71*I1${e`K-Jc95O|M483i3c4blet&*+7!pIbWD=?d5mv-A)J(`^8) zF^1`Utr(-n=x6;JV*qaNW8wC#F@H4ED^eA1-(%tSuYnslWo4?u?I*a`qkCWt+^F(a zBm;L9-2-F{R1PG~f&=|wOjqndgEK*~hd3YDlGB`&<?;$X;XS5`hj&#7dgDa7z$n}W zL5A1^rND6MbYU{DMg5>-W_U+Tm44D=MX<RxUIc5jxC0&{zs_2LBYjLf9)AaJ12A?7 zBf|)ob(?@4!2_xD__e>FSkVL{5SD{MD2N5Y;dEL^XCdsv3R#lj6_Z50)gs3M-hlV$ z6j(qKm_SfLR8SsbXtL=HlZNmN2!De3zBEKlp^+@`GCY`yB9n)apr3htQnh?Ui>dB& z@Amjkuhv}i9m3eAoFt45jlvp68Hno17cQDH66DI47sj|r5dyMcN2=y)y$l-|VPGD^ z7Sl)sd}Cf?P!dK2$3zlas4WYY1W{7(z=h<)org#w{VE({l5|L*&)6jRgM#@IR!i3^ zuBfwl_%vM=_GfHeRVQmjZxXk&>ahoxxa!e+EuVaJ$ihU9B{7?I0v;jmh8kWOr4*wj z;>0*qx54IW<Ep1<HCTH|rUq)_mDC3PdVcM5)HV>{Sex1aei0s|RG%!Qfux$tgeNl9 zn}z5f2w;N1QMfYz*^$uZO6Viv4FC{K(T?`$=Mn!%LXTKND=eXrlm_raoGx<QN26QM zc_ZFf%q8u_c5)a*3P`)~^D=&jJBA)P;V{i1QyX=c%L)j+v~{hWFkDCrwhY+h--3hk z9XM*+D1Z2>Yj)2<*Wi8M;Bx!3*LxSEFO;G$%<ufn^~s)c`=OcFz6`Z5hPq0ju7yzV zS8dN;@3}tptG-`59<=RR?oKR6NSA?9bU^D^jtte*?Jh-kmm`B%M>>`xiH8l2p4O|w zbFJ52uXw5E$eioio`vpR_cs8-fyM5jQumNH{Jj$ox{o8^pTEA;vT<(nwR089xw+|U z%GuiV$WQeE@C&8x7v_8Br#|Vsci=(yu^Qm(Z{Kf;FL&=+?0%`#{n9-D+4G->3&#NG zNp0{)E~>Hj#?Cu~HwW*&TJ9y@<HGTCi^o%?<Ee5u{S8GoMwT|TRh)3jyV^GU#v?Zs z-Ln*K{@8uZJ-4YG-hA7CH$DI2;)};iFCKqrw?%_9!&f(z{GEWg=Vb%1vmD-XyKmk; ze|GVuQ>B+q0bmaTc9#4M0Co-<fRS=I`q!`D?Y{f-#odQXyAK0kCjv%hM_}Z}-lgWq z$A_*RntP|*+<W`n{Ep9ji+j(M_MQQ_#-?v5dt(F~@8(FwgVTjmXxF146>h2P;Ktk| zdWz8_u?=`Hk>_#(%c@?M)dI62?`K&I^3+=zSQg&gp&Bj>WU-*gkhMdwo`n1<p`R)d zd9XwQy%$Xi(8nX^c<`(-uvF9Nn&|9@HZ`DMLZk&zWLZ!Jg!9pj-m9HL(6^KD14fsU z&mjL^p}w}IXs5e!$nI-&T|QiiQm5%8y|j7jQdjrV!1GJ}+m{kMmSX)&gL^7%F=tz) zo!T1z<{8L+8EmXLvBpJ(nko&Lb5o(VtCMr=jr_vP#}+z{mD-M%f^Swl*yg3$y5{6- zxrz@<ekvT9v(LU?31A6m9GP=p-&BgkOQA$1gmq!6rDN_~sd;Oq5sOXOy;y4Pt8Bnx zGu60pZc{0|xzd8gR;smgE_1zD>fBjs*=0-=5WH1t-ux}jwsM-LT#aAbyv`kSgB1#X zZfv=`>t=#v7Y?$Iu<D^5U@8bxiICiW+PPzC!!s2-$war_*!8P~UfBDFmif}t{m6;U zr1K*iX2}7FP<kZRCA|XFR$VC)EvYHMP`V(B5Ty?{pK_c_r6t^D)dhE;5V|7a-Gaps zYNv5g6gRJW;#KyB=vB3?4iGuN5>6sKg_>3Essm?O3cSoEtfodRC?lu2AQB#Ls*zxP z1}s50u6S<76%bubj><%n;~84Qi#fH$Ko@7Vo_OsmOUT-)+h`-VHsr)eNO+Ud$k_`( zzjN==B<p4AG!&7y<-_o)*lC*ndNT#A`#H7gbE@YHYI}*={_oW8FQ_vm>dfcV;OEqi k-`ZTX?OO^zL5lAES9|yiN9>U+XQy|}{qeUH{*s~o8yA25jQ{`u diff --git a/venv/lib/python3.12/site-packages/telegram/_passport/__pycache__/passportdata.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_passport/__pycache__/passportdata.cpython-312.pyc deleted file mode 100644 index 1223e125e295c20d331651ca96af996fffea8f42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5732 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 diff --git a/venv/lib/python3.12/site-packages/telegram/_passport/__pycache__/passportelementerrors.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_passport/__pycache__/passportelementerrors.cpython-312.pyc deleted file mode 100644 index a30d4d73f51d75dc87282461def1beae397de0c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20477 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 diff --git a/venv/lib/python3.12/site-packages/telegram/_passport/__pycache__/passportfile.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_passport/__pycache__/passportfile.cpython-312.pyc deleted file mode 100644 index 0e955d7ae1d3f378c224fa4983744b2f36dc678d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8303 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 A5dZ)H diff --git a/venv/lib/python3.12/site-packages/telegram/_passport/credentials.py b/venv/lib/python3.12/site-packages/telegram/_passport/credentials.py deleted file mode 100644 index 11bd2d9..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_passport/credentials.py +++ /dev/null @@ -1,524 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -# pylint: disable=missing-module-docstring, redefined-builtin -import json -from base64 import b64decode -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional, no_type_check - -try: - from cryptography.hazmat.backends import default_backend - from cryptography.hazmat.primitives.asymmetric.padding import MGF1, OAEP - from cryptography.hazmat.primitives.ciphers import Cipher - from cryptography.hazmat.primitives.ciphers.algorithms import AES - from cryptography.hazmat.primitives.ciphers.modes import CBC - from cryptography.hazmat.primitives.hashes import SHA1, SHA256, SHA512, Hash - - CRYPTO_INSTALLED = True -except ImportError: - default_backend = None # type: ignore[assignment] - MGF1, OAEP, Cipher, AES, CBC = (None, None, None, None, None) # type: ignore[misc,assignment] - SHA1, SHA256, SHA512, Hash = (None, None, None, None) # type: ignore[misc,assignment] - - CRYPTO_INSTALLED = False - -from telegram._telegramobject import TelegramObject -from telegram._utils.argumentparsing import de_json_optional, de_list_optional, parse_sequence_arg -from telegram._utils.strings import TextEncoding -from telegram._utils.types import JSONDict -from telegram.error import PassportDecryptionError - -if TYPE_CHECKING: - from telegram import Bot - - -@no_type_check -def decrypt(secret, hash, data): - """ - Decrypt per telegram docs at https://core.telegram.org/passport. - - Args: - secret (:obj:`str` or :obj:`bytes`): The encryption secret, either as bytes or as a - base64 encoded string. - hash (:obj:`str` or :obj:`bytes`): The hash, either as bytes or as a - base64 encoded string. - data (:obj:`str` or :obj:`bytes`): The data to decrypt, either as bytes or as a - base64 encoded string. - file (:obj:`bool`): Force data to be treated as raw data, instead of trying to - b64decode it. - - Raises: - :class:`PassportDecryptionError`: Given hash does not match hash of decrypted data. - - Returns: - :obj:`bytes`: The decrypted data as bytes. - - """ - if not CRYPTO_INSTALLED: - raise RuntimeError( - "To use Telegram Passports, PTB must be installed via `pip install " - '"python-telegram-bot[passport]"`.' - ) - # Make a SHA512 hash of secret + update - digest = Hash(SHA512(), backend=default_backend()) - digest.update(secret + hash) - secret_hash_hash = digest.finalize() - # First 32 chars is our key, next 16 is the initialisation vector - key, init_vector = secret_hash_hash[:32], secret_hash_hash[32 : 32 + 16] - # Init a AES-CBC cipher and decrypt the data - cipher = Cipher(AES(key), CBC(init_vector), backend=default_backend()) - decryptor = cipher.decryptor() - data = decryptor.update(data) + decryptor.finalize() - # Calculate SHA256 hash of the decrypted data - digest = Hash(SHA256(), backend=default_backend()) - digest.update(data) - data_hash = digest.finalize() - # If the newly calculated hash did not match the one telegram gave us - if data_hash != hash: - # Raise a error that is caught inside telegram.PassportData and transformed into a warning - raise PassportDecryptionError(f"Hashes are not equal! {data_hash} != {hash}") - # Return data without padding - return data[data[0] :] - - -@no_type_check -def decrypt_json(secret, hash, data): - """Decrypts data using secret and hash and then decodes utf-8 string and loads json""" - return json.loads(decrypt(secret, hash, data).decode(TextEncoding.UTF_8)) - - -class EncryptedCredentials(TelegramObject): - """Contains data required for decrypting and authenticating EncryptedPassportElement. See the - Telegram Passport Documentation for a complete description of the data decryption and - authentication processes. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`data`, :attr:`hash` and :attr:`secret` are equal. - - Note: - This object is decrypted only when originating from - :attr:`telegram.PassportData.decrypted_credentials`. - - Args: - data (:class:`telegram.Credentials` | :obj:`str`): Decrypted data with unique user's - nonce, data hashes and secrets used for EncryptedPassportElement decryption and - authentication or base64 encrypted data. - hash (:obj:`str`): Base64-encoded data hash for data authentication. - secret (:obj:`str`): Decrypted or encrypted secret used for decryption. - - Attributes: - data (:class:`telegram.Credentials` | :obj:`str`): Decrypted data with unique user's - nonce, data hashes and secrets used for EncryptedPassportElement decryption and - authentication or base64 encrypted data. - hash (:obj:`str`): Base64-encoded data hash for data authentication. - secret (:obj:`str`): Decrypted or encrypted secret used for decryption. - - """ - - __slots__ = ( - "_decrypted_data", - "_decrypted_secret", - "data", - "hash", - "secret", - ) - - def __init__( - self, - data: str, - hash: str, - secret: str, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - # Required - self.data: str = data - self.hash: str = hash - self.secret: str = secret - - self._id_attrs = (self.data, self.hash, self.secret) - - self._decrypted_secret: Optional[bytes] = None - self._decrypted_data: Optional[Credentials] = None - - self._freeze() - - @property - def decrypted_secret(self) -> bytes: - """ - :obj:`bytes`: Lazily decrypt and return secret. - - Raises: - telegram.error.PassportDecryptionError: Decryption failed. Usually due to bad - private/public key but can also suggest malformed/tampered data. - """ - if self._decrypted_secret is None: - if not CRYPTO_INSTALLED: - raise RuntimeError( - "To use Telegram Passports, PTB must be installed via `pip install " - '"python-telegram-bot[passport]"`.' - ) - # Try decrypting according to step 1 at - # https://core.telegram.org/passport#decrypting-data - # We make sure to base64 decode the secret first. - # Telegram says to use OAEP padding so we do that. The Mask Generation Function - # is the default for OAEP, the algorithm is the default for PHP which is what - # Telegram's backend servers run. - try: - self._decrypted_secret = self.get_bot().private_key.decrypt( # type: ignore - b64decode(self.secret), - OAEP(mgf=MGF1(algorithm=SHA1()), algorithm=SHA1(), label=None), # skipcq - ) - except ValueError as exception: - # If decryption fails raise exception - raise PassportDecryptionError(exception) from exception - return self._decrypted_secret - - @property - def decrypted_data(self) -> "Credentials": - """ - :class:`telegram.Credentials`: Lazily decrypt and return credentials data. This object - also contains the user specified nonce as - `decrypted_data.nonce`. - - Raises: - telegram.error.PassportDecryptionError: Decryption failed. Usually due to bad - private/public key but can also suggest malformed/tampered data. - """ - if self._decrypted_data is None: - self._decrypted_data = Credentials.de_json( - decrypt_json(self.decrypted_secret, b64decode(self.hash), b64decode(self.data)), - self.get_bot(), - ) - return self._decrypted_data - - -class Credentials(TelegramObject): - """ - Attributes: - secure_data (:class:`telegram.SecureData`): Credentials for encrypted data - nonce (:obj:`str`): Bot-specified nonce - """ - - __slots__ = ("nonce", "secure_data") - - def __init__( - self, - secure_data: "SecureData", - nonce: str, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - # Required - self.secure_data: SecureData = secure_data - self.nonce: str = nonce - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "Credentials": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["secure_data"] = de_json_optional(data.get("secure_data"), SecureData, bot) - - return super().de_json(data=data, bot=bot) - - -class SecureData(TelegramObject): - """ - This object represents the credentials that were used to decrypt the encrypted data. - All fields are optional and depend on fields that were requested. - - Args: - personal_details (:class:`telegram.SecureValue`, optional): Credentials for encrypted - personal details. - passport (:class:`telegram.SecureValue`, optional): Credentials for encrypted passport. - internal_passport (:class:`telegram.SecureValue`, optional): Credentials for encrypted - internal passport. - driver_license (:class:`telegram.SecureValue`, optional): Credentials for encrypted - driver license. - identity_card (:class:`telegram.SecureValue`, optional): Credentials for encrypted ID card - address (:class:`telegram.SecureValue`, optional): Credentials for encrypted - residential address. - utility_bill (:class:`telegram.SecureValue`, optional): Credentials for encrypted - utility bill. - bank_statement (:class:`telegram.SecureValue`, optional): Credentials for encrypted - bank statement. - rental_agreement (:class:`telegram.SecureValue`, optional): Credentials for encrypted - rental agreement. - passport_registration (:class:`telegram.SecureValue`, optional): Credentials for encrypted - registration from internal passport. - temporary_registration (:class:`telegram.SecureValue`, optional): Credentials for encrypted - temporary registration. - - Attributes: - personal_details (:class:`telegram.SecureValue`): Optional. Credentials for encrypted - personal details. - passport (:class:`telegram.SecureValue`): Optional. Credentials for encrypted passport. - internal_passport (:class:`telegram.SecureValue`): Optional. Credentials for encrypted - internal passport. - driver_license (:class:`telegram.SecureValue`): Optional. Credentials for encrypted - driver license. - identity_card (:class:`telegram.SecureValue`): Optional. Credentials for encrypted ID card - address (:class:`telegram.SecureValue`): Optional. Credentials for encrypted - residential address. - utility_bill (:class:`telegram.SecureValue`): Optional. Credentials for encrypted - utility bill. - bank_statement (:class:`telegram.SecureValue`): Optional. Credentials for encrypted - bank statement. - rental_agreement (:class:`telegram.SecureValue`): Optional. Credentials for encrypted - rental agreement. - passport_registration (:class:`telegram.SecureValue`): Optional. Credentials for encrypted - registration from internal passport. - temporary_registration (:class:`telegram.SecureValue`): Optional. Credentials for encrypted - temporary registration. - """ - - __slots__ = ( - "address", - "bank_statement", - "driver_license", - "identity_card", - "internal_passport", - "passport", - "passport_registration", - "personal_details", - "rental_agreement", - "temporary_registration", - "utility_bill", - ) - - def __init__( - self, - personal_details: Optional["SecureValue"] = None, - passport: Optional["SecureValue"] = None, - internal_passport: Optional["SecureValue"] = None, - driver_license: Optional["SecureValue"] = None, - identity_card: Optional["SecureValue"] = None, - address: Optional["SecureValue"] = None, - utility_bill: Optional["SecureValue"] = None, - bank_statement: Optional["SecureValue"] = None, - rental_agreement: Optional["SecureValue"] = None, - passport_registration: Optional["SecureValue"] = None, - temporary_registration: Optional["SecureValue"] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - - # Optionals - self.temporary_registration: Optional[SecureValue] = temporary_registration - self.passport_registration: Optional[SecureValue] = passport_registration - self.rental_agreement: Optional[SecureValue] = rental_agreement - self.bank_statement: Optional[SecureValue] = bank_statement - self.utility_bill: Optional[SecureValue] = utility_bill - self.address: Optional[SecureValue] = address - self.identity_card: Optional[SecureValue] = identity_card - self.driver_license: Optional[SecureValue] = driver_license - self.internal_passport: Optional[SecureValue] = internal_passport - self.passport: Optional[SecureValue] = passport - self.personal_details: Optional[SecureValue] = personal_details - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "SecureData": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["temporary_registration"] = de_json_optional( - data.get("temporary_registration"), SecureValue, bot - ) - data["passport_registration"] = de_json_optional( - data.get("passport_registration"), SecureValue, bot - ) - data["rental_agreement"] = de_json_optional(data.get("rental_agreement"), SecureValue, bot) - data["bank_statement"] = de_json_optional(data.get("bank_statement"), SecureValue, bot) - data["utility_bill"] = de_json_optional(data.get("utility_bill"), SecureValue, bot) - data["address"] = de_json_optional(data.get("address"), SecureValue, bot) - data["identity_card"] = de_json_optional(data.get("identity_card"), SecureValue, bot) - data["driver_license"] = de_json_optional(data.get("driver_license"), SecureValue, bot) - data["internal_passport"] = de_json_optional( - data.get("internal_passport"), SecureValue, bot - ) - data["passport"] = de_json_optional(data.get("passport"), SecureValue, bot) - data["personal_details"] = de_json_optional(data.get("personal_details"), SecureValue, bot) - - return super().de_json(data=data, bot=bot) - - -class SecureValue(TelegramObject): - """ - This object represents the credentials that were used to decrypt the encrypted value. - All fields are optional and depend on the type of field. - - Args: - data (:class:`telegram.DataCredentials`, optional): Credentials for encrypted Telegram - Passport data. Available for "personal_details", "passport", "driver_license", - "identity_card", "identity_passport" and "address" types. - front_side (:class:`telegram.FileCredentials`, optional): Credentials for encrypted - document's front side. Available for "passport", "driver_license", "identity_card" - and "internal_passport". - reverse_side (:class:`telegram.FileCredentials`, optional): Credentials for encrypted - document's reverse side. Available for "driver_license" and "identity_card". - selfie (:class:`telegram.FileCredentials`, optional): Credentials for encrypted selfie - of the user with a document. Can be available for "passport", "driver_license", - "identity_card" and "internal_passport". - translation (list[:class:`telegram.FileCredentials`], optional): Credentials for an - encrypted translation of the document. Available for "passport", "driver_license", - "identity_card", "internal_passport", "utility_bill", "bank_statement", - "rental_agreement", "passport_registration" and "temporary_registration". - files (list[:class:`telegram.FileCredentials`], optional): Credentials for encrypted - files. Available for "utility_bill", "bank_statement", "rental_agreement", - "passport_registration" and "temporary_registration" types. - - Attributes: - data (:class:`telegram.DataCredentials`): Optional. Credentials for encrypted Telegram - Passport data. Available for "personal_details", "passport", "driver_license", - "identity_card", "identity_passport" and "address" types. - front_side (:class:`telegram.FileCredentials`): Optional. Credentials for encrypted - document's front side. Available for "passport", "driver_license", "identity_card" - and "internal_passport". - reverse_side (:class:`telegram.FileCredentials`): Optional. Credentials for encrypted - document's reverse side. Available for "driver_license" and "identity_card". - selfie (:class:`telegram.FileCredentials`): Optional. Credentials for encrypted selfie - of the user with a document. Can be available for "passport", "driver_license", - "identity_card" and "internal_passport". - translation (tuple[:class:`telegram.FileCredentials`]): Optional. Credentials for an - encrypted translation of the document. Available for "passport", "driver_license", - "identity_card", "internal_passport", "utility_bill", "bank_statement", - "rental_agreement", "passport_registration" and "temporary_registration". - - .. versionchanged:: 20.0 - |tupleclassattrs| - - files (tuple[:class:`telegram.FileCredentials`]): Optional. Credentials for encrypted - files. Available for "utility_bill", "bank_statement", "rental_agreement", - "passport_registration" and "temporary_registration" types. - - .. versionchanged:: 20.0 - - * |tupleclassattrs| - * |alwaystuple| - - """ - - __slots__ = ("data", "files", "front_side", "reverse_side", "selfie", "translation") - - def __init__( - self, - data: Optional["DataCredentials"] = None, - front_side: Optional["FileCredentials"] = None, - reverse_side: Optional["FileCredentials"] = None, - selfie: Optional["FileCredentials"] = None, - files: Optional[Sequence["FileCredentials"]] = None, - translation: Optional[Sequence["FileCredentials"]] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.data: Optional[DataCredentials] = data - self.front_side: Optional[FileCredentials] = front_side - self.reverse_side: Optional[FileCredentials] = reverse_side - self.selfie: Optional[FileCredentials] = selfie - self.files: tuple[FileCredentials, ...] = parse_sequence_arg(files) - self.translation: tuple[FileCredentials, ...] = parse_sequence_arg(translation) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "SecureValue": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["data"] = de_json_optional(data.get("data"), DataCredentials, bot) - data["front_side"] = de_json_optional(data.get("front_side"), FileCredentials, bot) - data["reverse_side"] = de_json_optional(data.get("reverse_side"), FileCredentials, bot) - data["selfie"] = de_json_optional(data.get("selfie"), FileCredentials, bot) - data["files"] = de_list_optional(data.get("files"), FileCredentials, bot) - data["translation"] = de_list_optional(data.get("translation"), FileCredentials, bot) - - return super().de_json(data=data, bot=bot) - - -class _CredentialsBase(TelegramObject): - """Base class for DataCredentials and FileCredentials.""" - - __slots__ = ("data_hash", "file_hash", "hash", "secret") - - def __init__( - self, - hash: str, - secret: str, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - with self._unfrozen(): - self.hash: str = hash - self.secret: str = secret - - # Aliases just to be sure - self.file_hash: str = self.hash - self.data_hash: str = self.hash - - -class DataCredentials(_CredentialsBase): - """ - These credentials can be used to decrypt encrypted data from the data field in - EncryptedPassportData. - - Args: - data_hash (:obj:`str`): Checksum of encrypted data - secret (:obj:`str`): Secret of encrypted data - - Attributes: - hash (:obj:`str`): Checksum of encrypted data - secret (:obj:`str`): Secret of encrypted data - """ - - __slots__ = () - - def __init__(self, data_hash: str, secret: str, *, api_kwargs: Optional[JSONDict] = None): - super().__init__(hash=data_hash, secret=secret, api_kwargs=api_kwargs) - self._freeze() - - -class FileCredentials(_CredentialsBase): - """ - These credentials can be used to decrypt encrypted files from the front_side, - reverse_side, selfie and files fields in EncryptedPassportData. - - Args: - file_hash (:obj:`str`): Checksum of encrypted file - secret (:obj:`str`): Secret of encrypted file - - Attributes: - hash (:obj:`str`): Checksum of encrypted file - secret (:obj:`str`): Secret of encrypted file - """ - - __slots__ = () - - def __init__(self, file_hash: str, secret: str, *, api_kwargs: Optional[JSONDict] = None): - super().__init__(hash=file_hash, secret=secret, api_kwargs=api_kwargs) - self._freeze() diff --git a/venv/lib/python3.12/site-packages/telegram/_passport/data.py b/venv/lib/python3.12/site-packages/telegram/_passport/data.py deleted file mode 100644 index 5cbd5c7..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_passport/data.py +++ /dev/null @@ -1,186 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -# pylint: disable=missing-module-docstring -from typing import Optional - -from telegram._telegramobject import TelegramObject -from telegram._utils.types import JSONDict - - -class PersonalDetails(TelegramObject): - """ - This object represents personal details. - - Args: - first_name (:obj:`str`): First Name. - middle_name (:obj:`str`): Optional. First Name. - last_name (:obj:`str`): Last Name. - birth_date (:obj:`str`): Date of birth in DD.MM.YYYY format. - gender (:obj:`str`): Gender, male or female. - country_code (:obj:`str`): Citizenship (ISO 3166-1 alpha-2 country code). - residence_country_code (:obj:`str`): Country of residence (ISO 3166-1 alpha-2 country - code). - first_name_native (:obj:`str`): First Name in the language of the user's country of - residence. - middle_name_native (:obj:`str`): Optional. Middle Name in the language of the user's - country of residence. - last_name_native (:obj:`str`): Last Name in the language of the user's country of - residence. - - Attributes: - first_name (:obj:`str`): First Name. - middle_name (:obj:`str`): Optional. First Name. - last_name (:obj:`str`): Last Name. - birth_date (:obj:`str`): Date of birth in DD.MM.YYYY format. - gender (:obj:`str`): Gender, male or female. - country_code (:obj:`str`): Citizenship (ISO 3166-1 alpha-2 country code). - residence_country_code (:obj:`str`): Country of residence (ISO 3166-1 alpha-2 country - code). - first_name_native (:obj:`str`): First Name in the language of the user's country of - residence. - middle_name_native (:obj:`str`): Optional. Middle Name in the language of the user's - country of residence. - last_name_native (:obj:`str`): Last Name in the language of the user's country of - residence. - """ - - __slots__ = ( - "birth_date", - "country_code", - "first_name", - "first_name_native", - "gender", - "last_name", - "last_name_native", - "middle_name", - "middle_name_native", - "residence_country_code", - ) - - def __init__( - self, - first_name: str, - last_name: str, - birth_date: str, - gender: str, - country_code: str, - residence_country_code: str, - first_name_native: Optional[str] = None, - last_name_native: Optional[str] = None, - middle_name: Optional[str] = None, - middle_name_native: Optional[str] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - # Required - self.first_name: str = first_name - self.last_name: str = last_name - self.middle_name: Optional[str] = middle_name - self.birth_date: str = birth_date - self.gender: str = gender - self.country_code: str = country_code - self.residence_country_code: str = residence_country_code - self.first_name_native: Optional[str] = first_name_native - self.last_name_native: Optional[str] = last_name_native - self.middle_name_native: Optional[str] = middle_name_native - - self._freeze() - - -class ResidentialAddress(TelegramObject): - """ - This object represents a residential address. - - Args: - street_line1 (:obj:`str`): First line for the address. - street_line2 (:obj:`str`): Optional. Second line for the address. - city (:obj:`str`): City. - state (:obj:`str`): Optional. State. - country_code (:obj:`str`): ISO 3166-1 alpha-2 country code. - post_code (:obj:`str`): Address post code. - - Attributes: - street_line1 (:obj:`str`): First line for the address. - street_line2 (:obj:`str`): Optional. Second line for the address. - city (:obj:`str`): City. - state (:obj:`str`): Optional. State. - country_code (:obj:`str`): ISO 3166-1 alpha-2 country code. - post_code (:obj:`str`): Address post code. - """ - - __slots__ = ( - "city", - "country_code", - "post_code", - "state", - "street_line1", - "street_line2", - ) - - def __init__( - self, - street_line1: str, - street_line2: str, - city: str, - state: str, - country_code: str, - post_code: str, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - # Required - self.street_line1: str = street_line1 - self.street_line2: str = street_line2 - self.city: str = city - self.state: str = state - self.country_code: str = country_code - self.post_code: str = post_code - - self._freeze() - - -class IdDocumentData(TelegramObject): - """ - This object represents the data of an identity document. - - Args: - document_no (:obj:`str`): Document number. - expiry_date (:obj:`str`): Optional. Date of expiry, in DD.MM.YYYY format. - - Attributes: - document_no (:obj:`str`): Document number. - expiry_date (:obj:`str`): Optional. Date of expiry, in DD.MM.YYYY format. - """ - - __slots__ = ("document_no", "expiry_date") - - def __init__( - self, - document_no: str, - expiry_date: str, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.document_no: str = document_no - self.expiry_date: str = expiry_date - - self._freeze() diff --git a/venv/lib/python3.12/site-packages/telegram/_passport/encryptedpassportelement.py b/venv/lib/python3.12/site-packages/telegram/_passport/encryptedpassportelement.py deleted file mode 100644 index c231c51..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_passport/encryptedpassportelement.py +++ /dev/null @@ -1,278 +0,0 @@ -#!/usr/bin/env python -# flake8: noqa: E501 -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram EncryptedPassportElement.""" -from base64 import b64decode -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional, Union - -from telegram._passport.credentials import decrypt_json -from telegram._passport.data import IdDocumentData, PersonalDetails, ResidentialAddress -from telegram._passport.passportfile import PassportFile -from telegram._telegramobject import TelegramObject -from telegram._utils.argumentparsing import ( - de_json_decrypted_optional, - de_json_optional, - de_list_decrypted_optional, - de_list_optional, - parse_sequence_arg, -) -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot, Credentials - - -class EncryptedPassportElement(TelegramObject): - """ - Contains information about documents or other Telegram Passport elements shared with the bot - by the user. The data has been automatically decrypted by python-telegram-bot. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`type`, :attr:`data`, :attr:`phone_number`, :attr:`email`, - :attr:`files`, :attr:`front_side`, :attr:`reverse_side` and :attr:`selfie` are equal. - - Note: - This object is decrypted only when originating from - :attr:`telegram.PassportData.decrypted_data`. - - Args: - type (:obj:`str`): Element type. One of "personal_details", "passport", "driver_license", - "identity_card", "internal_passport", "address", "utility_bill", "bank_statement", - "rental_agreement", "passport_registration", "temporary_registration", "phone_number", - "email". - hash (:obj:`str`): Base64-encoded element hash for using in - :class:`telegram.PassportElementErrorUnspecified`. - data (:class:`telegram.PersonalDetails` | :class:`telegram.IdDocumentData` | \ - :class:`telegram.ResidentialAddress` | :obj:`str`, optional): - Decrypted or encrypted data; available only for "personal_details", "passport", - "driver_license", "identity_card", "internal_passport" and "address" types. - phone_number (:obj:`str`, optional): User's verified phone number; available only for - "phone_number" type. - email (:obj:`str`, optional): User's verified email address; available only for "email" - type. - files (Sequence[:class:`telegram.PassportFile`], optional): Array of encrypted/decrypted - files with documents provided by the user; available only for "utility_bill", - "bank_statement", "rental_agreement", "passport_registration" and - "temporary_registration" types. - - .. versionchanged:: 20.0 - |sequenceclassargs| - - front_side (:class:`telegram.PassportFile`, optional): Encrypted/decrypted file with the - front side of the document, provided by the user; Available only for "passport", - "driver_license", "identity_card" and "internal_passport". - reverse_side (:class:`telegram.PassportFile`, optional): Encrypted/decrypted file with the - reverse side of the document, provided by the user; Available only for - "driver_license" and "identity_card". - selfie (:class:`telegram.PassportFile`, optional): Encrypted/decrypted file with the - selfie of the user holding a document, provided by the user; available if requested for - "passport", "driver_license", "identity_card" and "internal_passport". - translation (Sequence[:class:`telegram.PassportFile`], optional): Array of - encrypted/decrypted files with translated versions of documents provided by the user; - available if requested requested for "passport", "driver_license", "identity_card", - "internal_passport", "utility_bill", "bank_statement", "rental_agreement", - "passport_registration" and "temporary_registration" types. - - .. versionchanged:: 20.0 - |sequenceclassargs| - - Attributes: - type (:obj:`str`): Element type. One of "personal_details", "passport", "driver_license", - "identity_card", "internal_passport", "address", "utility_bill", "bank_statement", - "rental_agreement", "passport_registration", "temporary_registration", "phone_number", - "email". - hash (:obj:`str`): Base64-encoded element hash for using in - :class:`telegram.PassportElementErrorUnspecified`. - data (:class:`telegram.PersonalDetails` | :class:`telegram.IdDocumentData` | \ - :class:`telegram.ResidentialAddress` | :obj:`str`): - Optional. Decrypted or encrypted data; available only for "personal_details", - "passport", "driver_license", "identity_card", "internal_passport" and "address" types. - phone_number (:obj:`str`): Optional. User's verified phone number; available only for - "phone_number" type. - email (:obj:`str`): Optional. User's verified email address; available only for "email" - type. - files (tuple[:class:`telegram.PassportFile`]): Optional. Array of encrypted/decrypted - files with documents provided by the user; available only for "utility_bill", - "bank_statement", "rental_agreement", "passport_registration" and - "temporary_registration" types. - - .. versionchanged:: 20.0 - - * |tupleclassattrs| - * |alwaystuple| - - front_side (:class:`telegram.PassportFile`): Optional. Encrypted/decrypted file with the - front side of the document, provided by the user; available only for "passport", - "driver_license", "identity_card" and "internal_passport". - reverse_side (:class:`telegram.PassportFile`): Optional. Encrypted/decrypted file with the - reverse side of the document, provided by the user; available only for "driver_license" - and "identity_card". - selfie (:class:`telegram.PassportFile`): Optional. Encrypted/decrypted file with the - selfie of the user holding a document, provided by the user; available if requested for - "passport", "driver_license", "identity_card" and "internal_passport". - translation (tuple[:class:`telegram.PassportFile`]): Optional. Array of - encrypted/decrypted files with translated versions of documents provided by the user; - available if requested for "passport", "driver_license", "identity_card", - "internal_passport", "utility_bill", "bank_statement", "rental_agreement", - "passport_registration" and "temporary_registration" types. - - .. versionchanged:: 20.0 - - * |tupleclassattrs| - * |alwaystuple| - - """ - - __slots__ = ( - "data", - "email", - "files", - "front_side", - "hash", - "phone_number", - "reverse_side", - "selfie", - "translation", - "type", - ) - - def __init__( - self, - type: str, # pylint: disable=redefined-builtin - hash: str, # pylint: disable=redefined-builtin - data: Optional[Union[PersonalDetails, IdDocumentData, ResidentialAddress]] = None, - phone_number: Optional[str] = None, - email: Optional[str] = None, - files: Optional[Sequence[PassportFile]] = None, - front_side: Optional[PassportFile] = None, - reverse_side: Optional[PassportFile] = None, - selfie: Optional[PassportFile] = None, - translation: Optional[Sequence[PassportFile]] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - - # Required - self.type: str = type - # Optionals - self.data: Optional[Union[PersonalDetails, IdDocumentData, ResidentialAddress]] = data - self.phone_number: Optional[str] = phone_number - self.email: Optional[str] = email - self.files: tuple[PassportFile, ...] = parse_sequence_arg(files) - self.front_side: Optional[PassportFile] = front_side - self.reverse_side: Optional[PassportFile] = reverse_side - self.selfie: Optional[PassportFile] = selfie - self.translation: tuple[PassportFile, ...] = parse_sequence_arg(translation) - self.hash: str = hash - - self._id_attrs = ( - self.type, - self.data, - self.phone_number, - self.email, - self.files, - self.front_side, - self.reverse_side, - self.selfie, - ) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "EncryptedPassportElement": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["files"] = de_list_optional(data.get("files"), PassportFile, bot) or None - data["front_side"] = de_json_optional(data.get("front_side"), PassportFile, bot) - data["reverse_side"] = de_json_optional(data.get("reverse_side"), PassportFile, bot) - data["selfie"] = de_json_optional(data.get("selfie"), PassportFile, bot) - data["translation"] = de_list_optional(data.get("translation"), PassportFile, bot) or None - - return super().de_json(data=data, bot=bot) - - @classmethod - def de_json_decrypted( - cls, data: JSONDict, bot: Optional["Bot"], credentials: "Credentials" - ) -> "EncryptedPassportElement": - """Variant of :meth:`telegram.TelegramObject.de_json` that also takes into account - passport credentials. - - Args: - data (dict[:obj:`str`, ...]): The JSON data. - bot (:class:`telegram.Bot` | :obj:`None`): The bot associated with these object. - May be :obj:`None`, in which case shortcut methods will not be available. - - .. versionchanged:: 21.4 - :paramref:`bot` is now optional and defaults to :obj:`None` - - .. deprecated:: 21.4 - This argument will be converted to an optional argument in future versions. - credentials (:class:`telegram.FileCredentials`): The credentials - - Returns: - :class:`telegram.EncryptedPassportElement`: - - """ - - if data["type"] not in ("phone_number", "email"): - secure_data = getattr(credentials.secure_data, data["type"]) - - if secure_data.data is not None: - # If not already decrypted - if not isinstance(data["data"], dict): - data["data"] = decrypt_json( - b64decode(secure_data.data.secret), - b64decode(secure_data.data.hash), - b64decode(data["data"]), - ) - if data["type"] == "personal_details": - data["data"] = PersonalDetails.de_json(data["data"], bot=bot) - elif data["type"] in ( - "passport", - "internal_passport", - "driver_license", - "identity_card", - ): - data["data"] = IdDocumentData.de_json(data["data"], bot=bot) - elif data["type"] == "address": - data["data"] = ResidentialAddress.de_json(data["data"], bot=bot) - - data["files"] = ( - de_list_decrypted_optional(data.get("files"), PassportFile, bot, secure_data.files) - or None - ) - data["front_side"] = de_json_decrypted_optional( - data.get("front_side"), PassportFile, bot, secure_data.front_side - ) - data["reverse_side"] = de_json_decrypted_optional( - data.get("reverse_side"), PassportFile, bot, secure_data.reverse_side - ) - data["selfie"] = de_json_decrypted_optional( - data.get("selfie"), PassportFile, bot, secure_data.selfie - ) - data["translation"] = ( - de_list_decrypted_optional( - data.get("translation"), PassportFile, bot, secure_data.translation - ) - or None - ) - - return super().de_json(data=data, bot=bot) diff --git a/venv/lib/python3.12/site-packages/telegram/_passport/passportdata.py b/venv/lib/python3.12/site-packages/telegram/_passport/passportdata.py deleted file mode 100644 index fff227a..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_passport/passportdata.py +++ /dev/null @@ -1,127 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""Contains information about Telegram Passport data shared with the bot by the user.""" -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional - -from telegram._passport.credentials import EncryptedCredentials -from telegram._passport.encryptedpassportelement import EncryptedPassportElement -from telegram._telegramobject import TelegramObject -from telegram._utils.argumentparsing import de_json_optional, de_list_optional, parse_sequence_arg -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot, Credentials - - -class PassportData(TelegramObject): - """Contains information about Telegram Passport data shared with the bot by the user. - - Note: - To be able to decrypt this object, you must pass your ``private_key`` to either - :class:`telegram.ext.Updater` or :class:`telegram.Bot`. Decrypted data is then found in - :attr:`decrypted_data` and the payload can be found in :attr:`decrypted_credentials`'s - attribute :attr:`telegram.Credentials.nonce`. - - Args: - data (Sequence[:class:`telegram.EncryptedPassportElement`]): Array with encrypted - information about documents and other Telegram Passport elements that was shared with - the bot. - - .. versionchanged:: 20.0 - |sequenceclassargs| - - credentials (:class:`telegram.EncryptedCredentials`)): Encrypted credentials. - - Attributes: - data (tuple[:class:`telegram.EncryptedPassportElement`]): Array with encrypted - information about documents and other Telegram Passport elements that was shared with - the bot. - - .. versionchanged:: 20.0 - |tupleclassattrs| - - credentials (:class:`telegram.EncryptedCredentials`): Encrypted credentials. - - - """ - - __slots__ = ("_decrypted_data", "credentials", "data") - - def __init__( - self, - data: Sequence[EncryptedPassportElement], - credentials: EncryptedCredentials, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - - self.data: tuple[EncryptedPassportElement, ...] = parse_sequence_arg(data) - self.credentials: EncryptedCredentials = credentials - - self._decrypted_data: Optional[tuple[EncryptedPassportElement]] = None - self._id_attrs = tuple([x.type for x in data] + [credentials.hash]) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "PassportData": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["data"] = de_list_optional(data.get("data"), EncryptedPassportElement, bot) - data["credentials"] = de_json_optional(data.get("credentials"), EncryptedCredentials, bot) - - return super().de_json(data=data, bot=bot) - - @property - def decrypted_data(self) -> tuple[EncryptedPassportElement, ...]: - """ - tuple[:class:`telegram.EncryptedPassportElement`]: Lazily decrypt and return information - about documents and other Telegram Passport elements which were shared with the bot. - - .. versionchanged:: 20.0 - Returns a tuple instead of a list. - - Raises: - telegram.error.PassportDecryptionError: Decryption failed. Usually due to bad - private/public key but can also suggest malformed/tampered data. - """ - if self._decrypted_data is None: - self._decrypted_data = tuple( # type: ignore[assignment] - EncryptedPassportElement.de_json_decrypted( - element.to_dict(), self.get_bot(), self.decrypted_credentials - ) - for element in self.data - ) - return self._decrypted_data # type: ignore[return-value] - - @property - def decrypted_credentials(self) -> "Credentials": - """ - :class:`telegram.Credentials`: Lazily decrypt and return credentials that were used - to decrypt the data. This object also contains the user specified payload as - `decrypted_data.payload`. - - Raises: - telegram.error.PassportDecryptionError: Decryption failed. Usually due to bad - private/public key but can also suggest malformed/tampered data. - """ - return self.credentials.decrypted_data diff --git a/venv/lib/python3.12/site-packages/telegram/_passport/passportelementerrors.py b/venv/lib/python3.12/site-packages/telegram/_passport/passportelementerrors.py deleted file mode 100644 index 00c5bd5..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_passport/passportelementerrors.py +++ /dev/null @@ -1,441 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -# pylint: disable=redefined-builtin -"""This module contains the classes that represent Telegram PassportElementError.""" - -from collections.abc import Sequence -from typing import Optional - -from telegram._telegramobject import TelegramObject -from telegram._utils.argumentparsing import parse_sequence_arg -from telegram._utils.types import JSONDict - - -class PassportElementError(TelegramObject): - """Baseclass for the PassportElementError* classes. - - This object represents an error in the Telegram Passport element which was submitted that - should be resolved by the user. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`source` and :attr:`type` are equal. - - Args: - source (:obj:`str`): Error source. - type (:obj:`str`): The section of the user's Telegram Passport which has the error. - message (:obj:`str`): Error message. - - Attributes: - source (:obj:`str`): Error source. - type (:obj:`str`): The section of the user's Telegram Passport which has the error. - message (:obj:`str`): Error message. - - """ - - __slots__ = ("message", "source", "type") - - def __init__( - self, source: str, type: str, message: str, *, api_kwargs: Optional[JSONDict] = None - ): - super().__init__(api_kwargs=api_kwargs) - # Required - self.source: str = str(source) - self.type: str = str(type) - self.message: str = str(message) - - self._id_attrs = (self.source, self.type) - - self._freeze() - - -class PassportElementErrorDataField(PassportElementError): - """ - Represents an issue in one of the data fields that was provided by the user. The error is - considered resolved when the field's value changes. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`~telegram.PassportElementError.source`, :attr:`type`, - :attr:`field_name`, :attr:`data_hash` and :attr:`message` are equal. - - Args: - type (:obj:`str`): The section of the user's Telegram Passport which has the error, one of - ``"personal_details"``, ``"passport"``, ``"driver_license"``, ``"identity_card"``, - ``"internal_passport"``, ``"address"``. - field_name (:obj:`str`): Name of the data field which has the error. - data_hash (:obj:`str`): Base64-encoded data hash. - message (:obj:`str`): Error message. - - Attributes: - type (:obj:`str`): The section of the user's Telegram Passport which has the error, one of - ``"personal_details"``, ``"passport"``, ``"driver_license"``, ``"identity_card"``, - ``"internal_passport"``, ``"address"``. - field_name (:obj:`str`): Name of the data field which has the error. - data_hash (:obj:`str`): Base64-encoded data hash. - message (:obj:`str`): Error message. - - """ - - __slots__ = ("data_hash", "field_name") - - def __init__( - self, - type: str, - field_name: str, - data_hash: str, - message: str, - *, - api_kwargs: Optional[JSONDict] = None, - ): - # Required - super().__init__("data", type, message, api_kwargs=api_kwargs) - with self._unfrozen(): - self.field_name: str = field_name - self.data_hash: str = data_hash - - self._id_attrs = ( - self.source, - self.type, - self.field_name, - self.data_hash, - self.message, - ) - - -class PassportElementErrorFile(PassportElementError): - """ - Represents an issue with a document scan. The error is considered resolved when the file with - the document scan changes. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`~telegram.PassportElementError.source`, :attr:`type`, - :attr:`file_hash`, and :attr:`message` are equal. - - Args: - type (:obj:`str`): The section of the user's Telegram Passport which has the issue, one of - ``"utility_bill"``, ``"bank_statement"``, ``"rental_agreement"``, - ``"passport_registration"``, ``"temporary_registration"``. - file_hash (:obj:`str`): Base64-encoded file hash. - message (:obj:`str`): Error message. - - Attributes: - type (:obj:`str`): The section of the user's Telegram Passport which has the issue, one of - ``"utility_bill"``, ``"bank_statement"``, ``"rental_agreement"``, - ``"passport_registration"``, ``"temporary_registration"``. - file_hash (:obj:`str`): Base64-encoded file hash. - message (:obj:`str`): Error message. - - """ - - __slots__ = ("file_hash",) - - def __init__( - self, type: str, file_hash: str, message: str, *, api_kwargs: Optional[JSONDict] = None - ): - # Required - super().__init__("file", type, message, api_kwargs=api_kwargs) - with self._unfrozen(): - self.file_hash: str = file_hash - - self._id_attrs = (self.source, self.type, self.file_hash, self.message) - - -class PassportElementErrorFiles(PassportElementError): - """ - Represents an issue with a list of scans. The error is considered resolved when the list of - files with the document scans changes. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`~telegram.PassportElementError.source`, :attr:`type`, - :attr:`file_hashes`, and :attr:`message` are equal. - - Args: - type (:obj:`str`): The section of the user's Telegram Passport which has the issue, one of - ``"utility_bill"``, ``"bank_statement"``, ``"rental_agreement"``, - ``"passport_registration"``, ``"temporary_registration"``. - file_hashes (Sequence[:obj:`str`]): List of base64-encoded file hashes. - - .. versionchanged:: 22.0 - |sequenceargs| - message (:obj:`str`): Error message. - - Attributes: - type (:obj:`str`): The section of the user's Telegram Passport which has the issue, one of - ``"utility_bill"``, ``"bank_statement"``, ``"rental_agreement"``, - ``"passport_registration"``, ``"temporary_registration"``. - file_hashes (tuple[:obj:`str`]): List of base64-encoded file hashes. - - .. versionchanged:: 22.0 - |tupleclassattrs| - message (:obj:`str`): Error message. - - """ - - __slots__ = ("file_hashes",) - - def __init__( - self, - type: str, - file_hashes: Sequence[str], - message: str, - *, - api_kwargs: Optional[JSONDict] = None, - ): - # Required - super().__init__("files", type, message, api_kwargs=api_kwargs) - with self._unfrozen(): - self.file_hashes: tuple[str, ...] = parse_sequence_arg(file_hashes) - - self._id_attrs = (self.source, self.type, self.message, self.file_hashes) - - -class PassportElementErrorFrontSide(PassportElementError): - """ - Represents an issue with the front side of a document. The error is considered resolved when - the file with the front side of the document changes. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`~telegram.PassportElementError.source`, :attr:`type`, - :attr:`file_hash`, and :attr:`message` are equal. - - Args: - type (:obj:`str`): The section of the user's Telegram Passport which has the issue, one of - ``"passport"``, ``"driver_license"``, ``"identity_card"``, ``"internal_passport"``. - file_hash (:obj:`str`): Base64-encoded hash of the file with the front side of the - document. - message (:obj:`str`): Error message. - - Attributes: - type (:obj:`str`): The section of the user's Telegram Passport which has the issue, one of - ``"passport"``, ``"driver_license"``, ``"identity_card"``, ``"internal_passport"``. - file_hash (:obj:`str`): Base64-encoded hash of the file with the front side of the - document. - message (:obj:`str`): Error message. - - """ - - __slots__ = ("file_hash",) - - def __init__( - self, type: str, file_hash: str, message: str, *, api_kwargs: Optional[JSONDict] = None - ): - # Required - super().__init__("front_side", type, message, api_kwargs=api_kwargs) - with self._unfrozen(): - self.file_hash: str = file_hash - - self._id_attrs = (self.source, self.type, self.file_hash, self.message) - - -class PassportElementErrorReverseSide(PassportElementError): - """ - Represents an issue with the reverse side of a document. The error is considered resolved when - the file with the reverse side of the document changes. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`~telegram.PassportElementError.source`, :attr:`type`, - :attr:`file_hash`, and :attr:`message` are equal. - - Args: - type (:obj:`str`): The section of the user's Telegram Passport which has the issue, one of - ``"driver_license"``, ``"identity_card"``. - file_hash (:obj:`str`): Base64-encoded hash of the file with the reverse side of the - document. - message (:obj:`str`): Error message. - - Attributes: - type (:obj:`str`): The section of the user's Telegram Passport which has the issue, one of - ``"driver_license"``, ``"identity_card"``. - file_hash (:obj:`str`): Base64-encoded hash of the file with the reverse side of the - document. - message (:obj:`str`): Error message. - - """ - - __slots__ = ("file_hash",) - - def __init__( - self, type: str, file_hash: str, message: str, *, api_kwargs: Optional[JSONDict] = None - ): - # Required - super().__init__("reverse_side", type, message, api_kwargs=api_kwargs) - with self._unfrozen(): - self.file_hash: str = file_hash - - self._id_attrs = (self.source, self.type, self.file_hash, self.message) - - -class PassportElementErrorSelfie(PassportElementError): - """ - Represents an issue with the selfie with a document. The error is considered resolved when - the file with the selfie changes. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`~telegram.PassportElementError.source`, :attr:`type`, - :attr:`file_hash`, and :attr:`message` are equal. - - Args: - type (:obj:`str`): The section of the user's Telegram Passport which has the issue, one of - ``"passport"``, ``"driver_license"``, ``"identity_card"``, ``"internal_passport"``. - file_hash (:obj:`str`): Base64-encoded hash of the file with the selfie. - message (:obj:`str`): Error message. - - Attributes: - type (:obj:`str`): The section of the user's Telegram Passport which has the issue, one of - ``"passport"``, ``"driver_license"``, ``"identity_card"``, ``"internal_passport"``. - file_hash (:obj:`str`): Base64-encoded hash of the file with the selfie. - message (:obj:`str`): Error message. - - """ - - __slots__ = ("file_hash",) - - def __init__( - self, type: str, file_hash: str, message: str, *, api_kwargs: Optional[JSONDict] = None - ): - # Required - super().__init__("selfie", type, message, api_kwargs=api_kwargs) - with self._unfrozen(): - self.file_hash: str = file_hash - - self._id_attrs = (self.source, self.type, self.file_hash, self.message) - - -class PassportElementErrorTranslationFile(PassportElementError): - """ - Represents an issue with one of the files that constitute the translation of a document. - The error is considered resolved when the file changes. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`~telegram.PassportElementError.source`, :attr:`type`, - :attr:`file_hash`, and :attr:`message` are equal. - - Args: - type (:obj:`str`): Type of element of the user's Telegram Passport which has the issue, - one of ``"passport"``, ``"driver_license"``, ``"identity_card"``, - ``"internal_passport"``, ``"utility_bill"``, ``"bank_statement"``, - ``"rental_agreement"``, ``"passport_registration"``, ``"temporary_registration"``. - file_hash (:obj:`str`): Base64-encoded hash of the file. - message (:obj:`str`): Error message. - - Attributes: - type (:obj:`str`): Type of element of the user's Telegram Passport which has the issue, - one of ``"passport"``, ``"driver_license"``, ``"identity_card"``, - ``"internal_passport"``, ``"utility_bill"``, ``"bank_statement"``, - ``"rental_agreement"``, ``"passport_registration"``, ``"temporary_registration"``. - file_hash (:obj:`str`): Base64-encoded hash of the file. - message (:obj:`str`): Error message. - - """ - - __slots__ = ("file_hash",) - - def __init__( - self, type: str, file_hash: str, message: str, *, api_kwargs: Optional[JSONDict] = None - ): - # Required - super().__init__("translation_file", type, message, api_kwargs=api_kwargs) - with self._unfrozen(): - self.file_hash: str = file_hash - - self._id_attrs = (self.source, self.type, self.file_hash, self.message) - - -class PassportElementErrorTranslationFiles(PassportElementError): - """ - Represents an issue with the translated version of a document. The error is considered - resolved when a file with the document translation changes. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`~telegram.PassportElementError.source`, :attr:`type`, - :attr:`file_hashes`, and :attr:`message` are equal. - - Args: - type (:obj:`str`): Type of element of the user's Telegram Passport which has the issue, - one of ``"passport"``, ``"driver_license"``, ``"identity_card"``, - ``"internal_passport"``, ``"utility_bill"``, ``"bank_statement"``, - ``"rental_agreement"``, ``"passport_registration"``, ``"temporary_registration"``. - file_hashes (Sequence[:obj:`str`]): List of base64-encoded file hashes. - - .. versionchanged:: 22.0 - |sequenceargs| - message (:obj:`str`): Error message. - - Attributes: - type (:obj:`str`): Type of element of the user's Telegram Passport which has the issue, - one of ``"passport"``, ``"driver_license"``, ``"identity_card"``, - ``"internal_passport"``, ``"utility_bill"``, ``"bank_statement"``, - ``"rental_agreement"``, ``"passport_registration"``, ``"temporary_registration"``. - file_hashes (tuple[:obj:`str`]): List of base64-encoded file hashes. - - .. versionchanged:: 22.0 - |tupleclassattrs| - message (:obj:`str`): Error message. - - """ - - __slots__ = ("file_hashes",) - - def __init__( - self, - type: str, - file_hashes: Sequence[str], - message: str, - *, - api_kwargs: Optional[JSONDict] = None, - ): - # Required - super().__init__("translation_files", type, message, api_kwargs=api_kwargs) - with self._unfrozen(): - self.file_hashes: tuple[str, ...] = parse_sequence_arg(file_hashes) - - self._id_attrs = (self.source, self.type, self.message, self.file_hashes) - - -class PassportElementErrorUnspecified(PassportElementError): - """ - Represents an issue in an unspecified place. The error is considered resolved when new - data is added. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`~telegram.PassportElementError.source`, :attr:`type`, - :attr:`element_hash`, and :attr:`message` are equal. - - Args: - type (:obj:`str`): Type of element of the user's Telegram Passport which has the issue. - element_hash (:obj:`str`): Base64-encoded element hash. - message (:obj:`str`): Error message. - - Attributes: - type (:obj:`str`): Type of element of the user's Telegram Passport which has the issue. - element_hash (:obj:`str`): Base64-encoded element hash. - message (:obj:`str`): Error message. - - """ - - __slots__ = ("element_hash",) - - def __init__( - self, type: str, element_hash: str, message: str, *, api_kwargs: Optional[JSONDict] = None - ): - # Required - super().__init__("unspecified", type, message, api_kwargs=api_kwargs) - with self._unfrozen(): - self.element_hash: str = element_hash - - self._id_attrs = (self.source, self.type, self.element_hash, self.message) diff --git a/venv/lib/python3.12/site-packages/telegram/_passport/passportfile.py b/venv/lib/python3.12/site-packages/telegram/_passport/passportfile.py deleted file mode 100644 index 1f944a2..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_passport/passportfile.py +++ /dev/null @@ -1,213 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Encrypted PassportFile.""" - -import datetime as dtm -from typing import TYPE_CHECKING, Optional - -from telegram._telegramobject import TelegramObject -from telegram._utils.datetime import extract_tzinfo_from_defaults, from_timestamp -from telegram._utils.defaultvalue import DEFAULT_NONE -from telegram._utils.types import JSONDict, ODVInput - -if TYPE_CHECKING: - from telegram import Bot, File, FileCredentials - - -class PassportFile(TelegramObject): - """ - This object represents a file uploaded to Telegram Passport. Currently all Telegram Passport - files are in JPEG format when decrypted and don't exceed 10MB. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`file_unique_id` is equal. - - Args: - file_id (:obj:`str`): Identifier for this file, which can be used to download - or reuse the file. - file_unique_id (:obj:`str`): Unique identifier for this file, which - is supposed to be the same over time and for different bots. - Can't be used to download or reuse the file. - file_size (:obj:`int`): File size in bytes. - file_date (:class:`datetime.datetime`): Time when the file was uploaded. - - .. versionchanged:: 22.0 - Accepts only :class:`datetime.datetime` instead of :obj:`int`. - |datetime_localization| - - Attributes: - file_id (:obj:`str`): Identifier for this file, which can be used to download - or reuse the file. - file_unique_id (:obj:`str`): Unique identifier for this file, which - is supposed to be the same over time and for different bots. - Can't be used to download or reuse the file. - file_size (:obj:`int`): File size in bytes. - file_date (:class:`datetime.datetime`): Time when the file was uploaded. - - .. versionchanged:: 22.0 - Returns :class:`datetime.datetime` instead of :obj:`int`. - |datetime_localization| - """ - - __slots__ = ( - "_credentials", - "file_date", - "file_id", - "file_size", - "file_unique_id", - ) - - def __init__( - self, - file_id: str, - file_unique_id: str, - file_date: dtm.datetime, - file_size: int, - credentials: Optional["FileCredentials"] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - - # Required - self.file_id: str = file_id - self.file_unique_id: str = file_unique_id - self.file_size: int = file_size - self.file_date: dtm.datetime = file_date - # Optionals - - self._credentials: Optional[FileCredentials] = credentials - - self._id_attrs = (self.file_unique_id,) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "PassportFile": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - # Get the local timezone from the bot if it has defaults - loc_tzinfo = extract_tzinfo_from_defaults(bot) - data["file_date"] = from_timestamp(data.get("file_date"), tzinfo=loc_tzinfo) - - return super().de_json(data=data, bot=bot) - - @classmethod - def de_json_decrypted( - cls, data: JSONDict, bot: Optional["Bot"], credentials: "FileCredentials" - ) -> "PassportFile": - """Variant of :meth:`telegram.TelegramObject.de_json` that also takes into account - passport credentials. - - Args: - data (dict[:obj:`str`, ...]): The JSON data. - bot (:class:`telegram.Bot` | :obj:`None`): The bot associated with these object. - May be :obj:`None`, in which case shortcut methods will not be available. - - .. versionchanged:: 21.4 - :paramref:`bot` is now optional and defaults to :obj:`None` - - .. deprecated:: 21.4 - This argument will be converted to an optional argument in future versions. - credentials (:class:`telegram.FileCredentials`): The credentials - - Returns: - :class:`telegram.PassportFile`: - - """ - data = cls._parse_data(data) - - data["credentials"] = credentials - - return super().de_json(data=data, bot=bot) - - @classmethod - def de_list_decrypted( - cls, - data: list[JSONDict], - bot: Optional["Bot"], - credentials: list["FileCredentials"], - ) -> tuple["PassportFile", ...]: - """Variant of :meth:`telegram.TelegramObject.de_list` that also takes into account - passport credentials. - - .. versionchanged:: 20.0 - - * Returns a tuple instead of a list. - * Filters out any :obj:`None` values - - Args: - data (list[dict[:obj:`str`, ...]]): The JSON data. - bot (:class:`telegram.Bot` | :obj:`None`): The bot associated with these object. - May be :obj:`None`, in which case shortcut methods will not be available. - - .. versionchanged:: 21.4 - :paramref:`bot` is now optional and defaults to :obj:`None` - - .. deprecated:: 21.4 - This argument will be converted to an optional argument in future versions. - credentials (:class:`telegram.FileCredentials`): The credentials - - Returns: - tuple[:class:`telegram.PassportFile`]: - - """ - return tuple( - obj - for obj in ( - cls.de_json_decrypted(passport_file, bot, credentials[i]) - for i, passport_file in enumerate(data) - ) - ) - - async def get_file( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "File": - """ - Wrapper over :meth:`telegram.Bot.get_file`. Will automatically assign the correct - credentials to the returned :class:`telegram.File` if originating from - :attr:`telegram.PassportData.decrypted_data`. - - For the documentation of the arguments, please see :meth:`telegram.Bot.get_file`. - - Returns: - :class:`telegram.File` - - Raises: - :class:`telegram.error.TelegramError` - - """ - file = await self.get_bot().get_file( - file_id=self.file_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - if self._credentials: - file.set_credentials(self._credentials) - return file diff --git a/venv/lib/python3.12/site-packages/telegram/_payment/__init__.py b/venv/lib/python3.12/site-packages/telegram/_payment/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/telegram/_payment/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_payment/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index e9a4c60db7feb5b61b7592981fce6c18dbd4c6c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 210 zcmX@j%ge<81n=fmXMpI(AOanHW&w&!XQ*V*Wb|9fP{ah}eFmxdRj8klpPQ<mn^;m@ zrtgxUT$-DjS5mBBlA4p6UX+-tTU?TvoSj;vo04Cimy@5El3Ju+mYP?lpOcxSUr<?+ zk)LO*XK18foLQ2pTacKXotU1A(5)X|kXQ*aP(MCCGcU6wK3=b&@)w6qZhlH>PO4oI VE6@duKwJ!Bd}L;1WGrF^vH<48J7xd? diff --git a/venv/lib/python3.12/site-packages/telegram/_payment/__pycache__/invoice.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_payment/__pycache__/invoice.cpython-312.pyc deleted file mode 100644 index fbe4c73d5293fb6100cd53f785aca414300371d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4424 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 diff --git a/venv/lib/python3.12/site-packages/telegram/_payment/__pycache__/labeledprice.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_payment/__pycache__/labeledprice.cpython-312.pyc deleted file mode 100644 index 0c4a82f28c262b0915c9e81e9b11f9842eb9e023..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2590 zcmeHJPm3Hy6tAAYy_4Mq|AcH3&<cc*8Fsr#q9S8llMoGtu!-ynGMDO}?wXn2?e1!; zYIb+x9&!knfI%-3g<#@IL;L`K1i?!J9zvrKkQ}^7;wpxmd{y1Ovm5*dS};|ws$RYN zz2AHNYJQxWY9MI8fA!JeCP=@kNztmguz3oE>&QnP<Qsk|G@??cWGJ~DmZM6iqUB0h zjcT2mflBBM@~fATU!#>f<;+H>KB_m(i)WSwfxr>-hatrti=`XH0=qG0-DT=YEC;T{ zoF<$K8cW#0OEjc??nd~W+Xd0Tzypt3zbUItBQ?(_GGMVAf;?TQp4Yb2?%Boj3#S85 zdKrkUH}lEn2@pO8zbNV$;9JQzI%U7qsrY5Ta>MYev<e>7{5q{ub1&%jYFALt@XgE9 zorx=G-RLwHQF9`l+>XqB14z?O<{s^ECShE`#jFROQk*DXaF21^XUrEE1VQ;KEDEd9 zz|b;RU`HJQ=Dg4qzzSF7MTyJZF7Oz{SW+HoE&Acm4Ffr{@X{K~S^bye+Bonp0-ti~ zV|{EE2O3wvaod%Wx1CUN?m&F}V#STvFqW_c5cHuO=-caVl!R2YwPgjp?Z%_FbHN=& z5J`NBNqn5<N>-AscA1=aGDlDH{<gFFUVOL>9JU=HxzlXp3psas&)T{s161e+fKBOY zVz*d^bc5VdGy&-%azg+r@h}b`!*V5W$T^L@5k3qiXrJ=gts9gxtyaurtA%?ZbEWOG zA@JU`@H-H(+^Ja|M>mftSaqED7Z2hi)+?_%4o+0q9480+CO)E8$4;m#7Ae*E9EYwa z`Uqq_g}?&v9ax+kYXDiYEFhbX52Q>)+qON%sU`Cd#$vp01H;13*%tOQ2j?BK)5}0& zF<@&#<A{e*7cK`+{GhLx0w2@|O0iG907%3M1Fp2&)b$3qpl}D+!$-A(Iu^Ohj6-TF zlVc>!Jb_L^!Uf%-+@3=Jr-90x|5O?@OKC0pO46zh|H5q}ZMaE5R@Pjo5qts)F;^v= z?}E<DpBH4nM9J#6c>}u7jq6Cln6;~w4Rj4E^G5kQ<BrmWW}ppY1CdfTgS`^W3VUb+ zEmw-2@d&H6@vM+~>g1L-=qPB<v^)9SKqJ&FEpYYfHfw2B3=_&zlaK()5g}v$(g_my zMAc!D)=7_3dXYA(X+_YmH`dZDfGW{110h1a*{YmedOEZRETVSgO0jC6X5LU0Vqq8c zVNS@vTcLc;XKOK(HFyZ@RT{6_VbHacksPr2n04f+EdojB64zUC`*eKTCV5q{b(E;D z-!dy1@o4~Xare3HuXW*E8@9webWbj!pUtVO^?T;bt+RK{nV(Gi{=S#5R6c3k-+usx zT@UuXbhGtk>z4n`%GWD*_a23{=?CWIr;}GFuT5`)1=QT7NQ<FF5|TCu$^KJ-JV}Up z1M{6aAwKh987LAVR6`KU@S>z;s9jt|n=8gN>U1in(W7BVNYmiY!<JC#a)Q60wCY8- zUv0bw-IL4cacN)GeDpec?%<_&A1r<F2dY>1eBnJ(!?(xu@csG^=DoMx`&%tNRvmw_ zFtpG#`3y|bnj9rT+}DuOnIcFQDWvT01Xo#>?k*NBGL%6mEI3O==7@rL8)X+L%umhZ u88!3#08EuL0z>zxY#7GlL&#V#9-{pZ(Xn4p>(AODW6x*ve<2vOg?|9q7wA*~ diff --git a/venv/lib/python3.12/site-packages/telegram/_payment/__pycache__/orderinfo.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_payment/__pycache__/orderinfo.cpython-312.pyc deleted file mode 100644 index 1bf625222c4cabbf1d24437ccfed93f4abc90362..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3108 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 diff --git a/venv/lib/python3.12/site-packages/telegram/_payment/__pycache__/precheckoutquery.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_payment/__pycache__/precheckoutquery.cpython-312.pyc deleted file mode 100644 index b2b5ef5cb6bf8445129b04903dc2c1c852a191c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6000 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 diff --git a/venv/lib/python3.12/site-packages/telegram/_payment/__pycache__/refundedpayment.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_payment/__pycache__/refundedpayment.cpython-312.pyc deleted file mode 100644 index d8fcd2793d9f2a430db3de6170933075448998dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3665 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 WfKL2|N{=$<Bx&?Z=Wis&K*qlWW<zZN diff --git a/venv/lib/python3.12/site-packages/telegram/_payment/__pycache__/shippingaddress.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_payment/__pycache__/shippingaddress.cpython-312.pyc deleted file mode 100644 index 93c3c412a8d85b97035616fb604261f263db4732..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2655 zcmeGeO>Y}j@U1`BuI;30n~%1Ehg20@B{oT<9wMkHRG{RLfYJl<<z=(`9B;ecUEX_c z>f%EWl}IG2azW*Q5FD%WPq<L2646RXNT@<wkVA^7dSYfj+{9Fc14l-B^JeDF%zHEQ zcHVwhE*A;FZ(n`f`sN5BKO>VsHYWDp2I4NUNP}3Km2$Lps*%!=PCMy#rjZHhjFWBW z8aa)m$a}=f-Xd0xXYQvXAB}uBU)66cUvAlwwmqxkaB6z4GHh2;!=>KF6>ci3T85&6 z`+`gEDp;YHxx+Vw(WYxH+xKmE^P*+Js;vErj;mUrulmaNT*Cpnl4!4n?r?Q^ZFS|6 zZ7MT5M}$XXX8(O4K7r6UX=o5$%F-HXE7izYX)E)kW@UL6g2-BV7&?psj3SI9Jje4> zVB4&0lcr{sZdDrkHo2}f3TvcV4n~F!Yy1Lf2t$wK{C6Q1ixeP=MN+Q`>4EH-jv*m4 z0u$Kw4Pk6RE^U`8F500M|EOa)w(8dC<t;DH>~qXR=THM_TU>C9hGsL=#%;JQC|xv^ z5{v7m*Kw8TGSjp8`b;8~%1{Sb6ZTu530=l!QVGr#b8MH-9W)zA=hva|R^re1q>8o( zLkka6ixO~AY|6#ZHKya>ap-G{kkG|-*lWGINSD@D>B8Lk^Rsi*aQv1rJD+I7Z1LK_ zM|k)l<24K@4Bzm5$2Kvo&nz&$A%k}?#Rpst0-GCBeAgCIQA`AFdIGacjrbBj&wPH! ze2qhqtbec{q;JSL{#q!m$4LnHya=VWH#&;{pV|L7v(;RX!P^p)4&KzDFsM+F4X<BN zI{1Yg;^tTGX+hEOZFY6bfXgom&}sy9XCib&B}8RJ*t^9DATtjLL4%Qlfqi#>2Ds0) zyF>vK!H(V|x1q21^51IrQ5QfXJ*`JrD&k-*1svLk&`SfC8E_fkl6QghvcTbPA@p*< zCFdYLa%EtZXn=2WWuSjZih&IQ=!S38VKGQC{viNqWk>{U6Hheo3_8dDu5&*YX{1Z4 zsTF~4szoSL$LAu@8M9qmG4|pb1O;YW4Ev=F@~jE1;0CW2f{f%&^Tn27^}w8kZJjZR zwZ=Y&aP#T)ddq9`dfQO)TK$q|cG~zZ)>Zr}&PrvQSGkzAye-%94Cv(bYuvq7ckGS2 z-&HNoU8v2?*QKratZ$fCjZOZ{y3Tx~iw^5Deq58j<afmwoa4si&_h;B((xv&%56YT zZj#62q)^$(KhP(?UjAO6e5luVUzy#`Jk+OlPrkgJ`Lwt@H4Rf?AWc?ZdKJW#evXun z{!p5JP@3K?jow+_S;lE;X9=c(ctG4)*;(nA^Cyd;=@==L@04~*w=4T_7OWc-%r)Aa zv7pFU^rHcEi7|W><CQ#PmS=(((k>lONg&hkH441+0&jO1eNc|8Vsgh}tg4A|Sd#eF zyd@@33om<!PT|5PpeMJ;UTQq6_g~K+&D~t;pCRXJzaKlDo%m^ds-J}!q8&Zf&m*Oi zk+FUOsUn#;**}6*38^wt6>@x{KZ4X4IWhgkhYyaQ{SzJS5kO)x*?Fa^i_^daIn~AA zqcDbGGPxi%mQc~3hrn+#IFSfztfOp4*1(p_C~}PH9*H)<AfM`QL}|Pr&H#(iOA4r; h)--MJEYUvD9+6Xz$ik20+~eE@ZQ?Wc4+2x@;V%vn$JhV> diff --git a/venv/lib/python3.12/site-packages/telegram/_payment/__pycache__/shippingoption.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_payment/__pycache__/shippingoption.cpython-312.pyc deleted file mode 100644 index 8a6519bd4c9b6f20f39de80d27a793f5a4d03021..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2327 zcmcgt&5smC6tAAop4pk%0VKPS0CiB<*|0q;7!MOd6xbjuSvJ`{XdCV6>8{x+=#R0g zW|zS^a3B#9iCzqt81-aA@Q?8BMWP4OapM}}!Hb!7F%nL`s_urxc&3tm^{U@{_3HiJ zt5@Gut7Qb^&o4gcMJ0rOlZ$lZ6J{p><_>a^iCoRic$%LvGn(YHUe?c<IX`da)jH=D z{GwS@eBRUjl37xG!7KX{=7fewjupVJ=vDlxS=CSmoky;I1Gyzqyq}HznYCfLF>&p} zYL9a4hwi{5*a-t+(|}_;z+vYyaRe4UTVO`|jBpYNkl<C~ku_%fc%?`CeHyG?>I)hM z#vgLuh8F27<oy8&9MZ@{)z!C`7p${yES!Dw!qWLjk5z3C)N1KImy{#;v$t<EPAs07 zTQ*yh+bynKS~^D^0et16-2w0JGNTT0;y7Ze;01PP5y*!CBSEGHP-a}s%(@vf=Vsm9 z=bD=*dA9&xkrZ700O(3ch~m2XP1M!g@{O8Vx{0o8W_blQCZgK2VcL5EKZRKW&@ODk zfMA}0g2Nb<av8&jW8^sO0-%7m<JlarWD;^8!nQkrJ`J!S%vV}~f$dQ-H1O(1nB?Mr z%+=<QHBMc^h>MlkaZIHfLK$w^La<hwx@`<zmDGq&v~bn-`ySyfwS_!m%MOOE_Od<n zA<_6uDDWwgC>j0uZzmL|+p+!YY;Bh<b@5CK0BN<kVC_chNo^!BU^rhOXqOUZJaH(f zfT*9fiwguR(NoR7%s0m~X=T0BQUJEvBB@1VcVV>Og#%oqTu8W;Dei|%)+kScm*L7` z7<ip94icwl2W!M_weX2~WB$nzV>OINX;CV_P?&s_zySEt&Oq!2@;QMa29Uq!kA!j? z!vL|TI5e_RhPqK9&Qz3F30%6TMP<8Btt%T6GFE~6#%hvOC4okWSRIIy10sh8pKMR^ z+xZ&Er`jDPV2;PF{0QBKb~(y@qurOfFf=sMM###<E0ASiCGFJ^(uW$OY-$1WwB@1^ zx}5q>6=Ckm9Si9X(3wp6r}O=U)zA<%GD}RVH1sIX2YtdK-Lhyvg=OuExd<96@Tg=_ z*OE7rM@6g42)RZYg($~~*WIPBFp}_qzNG-SEG|!_it_s7jb<<ONz=ClUvHiZoq@c! zyqR8!IWDMkg|Im{+z7nTh6d4GC&7Btqn&1dD0*RV(s=nqlT$(F`nGe$UL#Mfn^tn= zn`uK!`dNR-_Q4shO+DKdjWpm>Amj@`9$iNd>!?(_ReYdNf3^6%KK-NK+?qOYGxt&P zr-MgeD*rrx=G#|)m|p~bV(Z}HFOPk8?CwEW)VB1>$CX=^+qE6oNH$@>Gq8PPSy9=t z;>Qa3ie<?*nMjJ3<%SOY2DrEv3Jz=*+7Xl0z+}pqE{QyTR81gti04^WLt|6$m&=-Z zjZI6fiIg0Xf+Zl2ZlLYVbY367g7(Z_zc8+&S>vy2JwLTonH=X~9v4u3-?%6_9ql=A z_wa-I%(x_%6}11*-M1dRaP%Lkzm0$}`S>U=ON~i(2o}+#6M7!JxvEjw9Y-BJDu|(c zWSOi}6-6|irr5AjE`E!ctd8hN`qQumf_mJ5yQgYHKCf~oS%}g8|7w97!WBZ1p334Y zDxtWC;sZ-;9_y##6r5%=u#}+j<3Pq)P1ClIB5hgQL@)k=W`9Q~H__=$H2Z6|zL|UJ RVPQ_2`sBU85lm{ge*uH-fdv2n diff --git a/venv/lib/python3.12/site-packages/telegram/_payment/__pycache__/shippingquery.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_payment/__pycache__/shippingquery.cpython-312.pyc deleted file mode 100644 index 50af135e1738c41af67a49dcc515950b2be0daeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4567 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 S-HLu&5E4Hwe?hS4vi}9wW84e? diff --git a/venv/lib/python3.12/site-packages/telegram/_payment/__pycache__/successfulpayment.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_payment/__pycache__/successfulpayment.cpython-312.pyc deleted file mode 100644 index eae3bfc8abdfa7f90948b791da2b091b180d20a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6568 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 diff --git a/venv/lib/python3.12/site-packages/telegram/_payment/invoice.py b/venv/lib/python3.12/site-packages/telegram/_payment/invoice.py deleted file mode 100644 index b6ec5d9..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_payment/invoice.py +++ /dev/null @@ -1,134 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram Invoice.""" - -from typing import Final, Optional - -from telegram import constants -from telegram._telegramobject import TelegramObject -from telegram._utils.types import JSONDict - - -class Invoice(TelegramObject): - """This object contains basic information about an invoice. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`title`, :attr:`description`, :paramref:`start_parameter`, - :attr:`currency` and :attr:`total_amount` are equal. - - Args: - title (:obj:`str`): Product name. - description (:obj:`str`): Product description. - start_parameter (:obj:`str`): Unique bot deep-linking parameter that can be used to - generate this invoice. - currency (:obj:`str`): Three-letter ISO 4217 currency code, or ``XTR`` for payments in - |tg_stars|. - total_amount (:obj:`int`): Total price in the smallest units of the currency (integer, - **not** float/double). For example, for a price of ``US$ 1.45`` pass ``amount = 145``. - See the ``exp`` parameter in - `currencies.json <https://core.telegram.org/bots/payments/currencies.json>`_, - it shows the number of digits past the decimal point for each currency - (2 for the majority of currencies). - - Attributes: - title (:obj:`str`): Product name. - description (:obj:`str`): Product description. - start_parameter (:obj:`str`): Unique bot deep-linking parameter that can be used to - generate this invoice. - currency (:obj:`str`): Three-letter ISO 4217 currency code, or ``XTR`` for payments in - |tg_stars|. - total_amount (:obj:`int`): Total price in the smallest units of the currency (integer, - **not** float/double). For example, for a price of ``US$ 1.45`` pass ``amount = 145``. - See the ``exp`` parameter in - `currencies.json <https://core.telegram.org/bots/payments/currencies.json>`_, - it shows the number of digits past the decimal point for each currency - (2 for the majority of currencies). - - """ - - __slots__ = ( - "currency", - "description", - "start_parameter", - "title", - "total_amount", - ) - - def __init__( - self, - title: str, - description: str, - start_parameter: str, - currency: str, - total_amount: int, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.title: str = title - self.description: str = description - self.start_parameter: str = start_parameter - self.currency: str = currency - self.total_amount: int = total_amount - - self._id_attrs = ( - self.title, - self.description, - self.start_parameter, - self.currency, - self.total_amount, - ) - - self._freeze() - - MIN_TITLE_LENGTH: Final[int] = constants.InvoiceLimit.MIN_TITLE_LENGTH - """:const:`telegram.constants.InvoiceLimit.MIN_TITLE_LENGTH` - - .. versionadded:: 20.0 - """ - MAX_TITLE_LENGTH: Final[int] = constants.InvoiceLimit.MAX_TITLE_LENGTH - """:const:`telegram.constants.InvoiceLimit.MAX_TITLE_LENGTH` - - .. versionadded:: 20.0 - """ - MIN_DESCRIPTION_LENGTH: Final[int] = constants.InvoiceLimit.MIN_DESCRIPTION_LENGTH - """:const:`telegram.constants.InvoiceLimit.MIN_DESCRIPTION_LENGTH` - - .. versionadded:: 20.0 - """ - MAX_DESCRIPTION_LENGTH: Final[int] = constants.InvoiceLimit.MAX_DESCRIPTION_LENGTH - """:const:`telegram.constants.InvoiceLimit.MAX_DESCRIPTION_LENGTH` - - .. versionadded:: 20.0 - """ - MIN_PAYLOAD_LENGTH: Final[int] = constants.InvoiceLimit.MIN_PAYLOAD_LENGTH - """:const:`telegram.constants.InvoiceLimit.MIN_PAYLOAD_LENGTH` - - .. versionadded:: 20.0 - """ - MAX_PAYLOAD_LENGTH: Final[int] = constants.InvoiceLimit.MAX_PAYLOAD_LENGTH - """:const:`telegram.constants.InvoiceLimit.MAX_PAYLOAD_LENGTH` - - .. versionadded:: 20.0 - """ - MAX_TIP_AMOUNTS: Final[int] = constants.InvoiceLimit.MAX_TIP_AMOUNTS - """:const:`telegram.constants.InvoiceLimit.MAX_TIP_AMOUNTS` - - .. versionadded:: 20.0 - """ diff --git a/venv/lib/python3.12/site-packages/telegram/_payment/labeledprice.py b/venv/lib/python3.12/site-packages/telegram/_payment/labeledprice.py deleted file mode 100644 index 3aa7091..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_payment/labeledprice.py +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram LabeledPrice.""" - -from typing import Optional - -from telegram._telegramobject import TelegramObject -from telegram._utils.types import JSONDict - - -class LabeledPrice(TelegramObject): - """This object represents a portion of the price for goods or services. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`label` and :attr:`amount` are equal. - - Examples: - :any:`Payment Bot <examples.paymentbot>` - - Args: - label (:obj:`str`): Portion label. - amount (:obj:`int`): Price of the product in the smallest units of the currency (integer, - **not** float/double). For example, for a price of ``US$ 1.45`` pass ``amount = 145``. - See the ``exp`` parameter in - `currencies.json <https://core.telegram.org/bots/payments/currencies.json>`_, - it shows the number of digits past the decimal point for each currency - (2 for the majority of currencies). - - Attributes: - label (:obj:`str`): Portion label. - amount (:obj:`int`): Price of the product in the smallest units of the currency (integer, - **not** float/double). For example, for a price of ``US$ 1.45`` pass ``amount = 145``. - See the ``exp`` parameter in - `currencies.json <https://core.telegram.org/bots/payments/currencies.json>`_, - it shows the number of digits past the decimal point for each currency - (2 for the majority of currencies). - - """ - - __slots__ = ("amount", "label") - - def __init__(self, label: str, amount: int, *, api_kwargs: Optional[JSONDict] = None): - super().__init__(api_kwargs=api_kwargs) - self.label: str = label - self.amount: int = amount - - self._id_attrs = (self.label, self.amount) - - self._freeze() diff --git a/venv/lib/python3.12/site-packages/telegram/_payment/orderinfo.py b/venv/lib/python3.12/site-packages/telegram/_payment/orderinfo.py deleted file mode 100644 index ac963ca..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_payment/orderinfo.py +++ /dev/null @@ -1,83 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram OrderInfo.""" - -from typing import TYPE_CHECKING, Optional - -from telegram._payment.shippingaddress import ShippingAddress -from telegram._telegramobject import TelegramObject -from telegram._utils.argumentparsing import de_json_optional -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot - - -class OrderInfo(TelegramObject): - """This object represents information about an order. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`name`, :attr:`phone_number`, :attr:`email` and - :attr:`shipping_address` are equal. - - Args: - name (:obj:`str`, optional): User name. - phone_number (:obj:`str`, optional): User's phone number. - email (:obj:`str`, optional): User email. - shipping_address (:class:`telegram.ShippingAddress`, optional): User shipping address. - - Attributes: - name (:obj:`str`): Optional. User name. - phone_number (:obj:`str`): Optional. User's phone number. - email (:obj:`str`): Optional. User email. - shipping_address (:class:`telegram.ShippingAddress`): Optional. User shipping address. - - """ - - __slots__ = ("email", "name", "phone_number", "shipping_address") - - def __init__( - self, - name: Optional[str] = None, - phone_number: Optional[str] = None, - email: Optional[str] = None, - shipping_address: Optional[ShippingAddress] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.name: Optional[str] = name - self.phone_number: Optional[str] = phone_number - self.email: Optional[str] = email - self.shipping_address: Optional[ShippingAddress] = shipping_address - - self._id_attrs = (self.name, self.phone_number, self.email, self.shipping_address) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "OrderInfo": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["shipping_address"] = de_json_optional( - data.get("shipping_address"), ShippingAddress, bot - ) - - return super().de_json(data=data, bot=bot) diff --git a/venv/lib/python3.12/site-packages/telegram/_payment/precheckoutquery.py b/venv/lib/python3.12/site-packages/telegram/_payment/precheckoutquery.py deleted file mode 100644 index b3d2c02..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_payment/precheckoutquery.py +++ /dev/null @@ -1,151 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram PreCheckoutQuery.""" - -from typing import TYPE_CHECKING, Optional - -from telegram._payment.orderinfo import OrderInfo -from telegram._telegramobject import TelegramObject -from telegram._user import User -from telegram._utils.argumentparsing import de_json_optional -from telegram._utils.defaultvalue import DEFAULT_NONE -from telegram._utils.types import JSONDict, ODVInput - -if TYPE_CHECKING: - from telegram import Bot - - -class PreCheckoutQuery(TelegramObject): - """This object contains information about an incoming pre-checkout query. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`id` is equal. - - Note: - In Python :keyword:`from` is a reserved word. Use :paramref:`from_user` instead. - - Args: - id (:obj:`str`): Unique query identifier. - from_user (:class:`telegram.User`): User who sent the query. - currency (:obj:`str`): Three-letter ISO 4217 currency code, or ``XTR`` for payments in - |tg_stars|. - total_amount (:obj:`int`): Total price in the smallest units of the currency (integer, - **not** float/double). For example, for a price of ``US$ 1.45`` pass ``amount = 145``. - See the ``exp`` parameter in - `currencies.json <https://core.telegram.org/bots/payments/currencies.json>`_, - it shows the number of digits past the decimal point for each currency - (2 for the majority of currencies). - invoice_payload (:obj:`str`): Bot-specified invoice payload. - shipping_option_id (:obj:`str`, optional): Identifier of the shipping option chosen by the - user. - order_info (:class:`telegram.OrderInfo`, optional): Order info provided by the user. - - Attributes: - id (:obj:`str`): Unique query identifier. - from_user (:class:`telegram.User`): User who sent the query. - currency (:obj:`str`): Three-letter ISO 4217 currency code, or ``XTR`` for payments in - |tg_stars|. - total_amount (:obj:`int`): Total price in the smallest units of the currency (integer, - **not** float/double). For example, for a price of ``US$ 1.45`` pass ``amount = 145``. - See the ``exp`` parameter in - `currencies.json <https://core.telegram.org/bots/payments/currencies.json>`_, - it shows the number of digits past the decimal point for each currency - (2 for the majority of currencies). - invoice_payload (:obj:`str`): Bot-specified invoice payload. - shipping_option_id (:obj:`str`): Optional. Identifier of the shipping option chosen by the - user. - order_info (:class:`telegram.OrderInfo`): Optional. Order info provided by the user. - - - """ - - __slots__ = ( - "currency", - "from_user", - "id", - "invoice_payload", - "order_info", - "shipping_option_id", - "total_amount", - ) - - def __init__( - self, - id: str, # pylint: disable=redefined-builtin - from_user: User, - currency: str, - total_amount: int, - invoice_payload: str, - shipping_option_id: Optional[str] = None, - order_info: Optional[OrderInfo] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.id: str = id - self.from_user: User = from_user - self.currency: str = currency - self.total_amount: int = total_amount - self.invoice_payload: str = invoice_payload - self.shipping_option_id: Optional[str] = shipping_option_id - self.order_info: Optional[OrderInfo] = order_info - - self._id_attrs = (self.id,) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "PreCheckoutQuery": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["from_user"] = de_json_optional(data.pop("from", None), User, bot) - data["order_info"] = de_json_optional(data.get("order_info"), OrderInfo, bot) - - return super().de_json(data=data, bot=bot) - - async def answer( - self, - ok: bool, - error_message: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.answer_pre_checkout_query(update.pre_checkout_query.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.answer_pre_checkout_query`. - - """ - return await self.get_bot().answer_pre_checkout_query( - pre_checkout_query_id=self.id, - ok=ok, - error_message=error_message, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) diff --git a/venv/lib/python3.12/site-packages/telegram/_payment/refundedpayment.py b/venv/lib/python3.12/site-packages/telegram/_payment/refundedpayment.py deleted file mode 100644 index 46ef4e3..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_payment/refundedpayment.py +++ /dev/null @@ -1,93 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram RefundedPayment.""" - -from typing import Optional - -from telegram._telegramobject import TelegramObject -from telegram._utils.types import JSONDict - - -class RefundedPayment(TelegramObject): - """This object contains basic information about a refunded payment. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`telegram_payment_charge_id` is equal. - - .. versionadded:: 21.4 - - Args: - currency (:obj:`str`): Three-letter ISO 4217 `currency - <https://core.telegram.org/bots/payments#supported-currencies>`_ code, or ``XTR`` for - payments in |tg_stars|. Currently, always ``XTR``. - total_amount (:obj:`int`): Total refunded price in the *smallest units* of the currency - (integer, **not** float/double). For example, for a price of ``US$ 1.45``, - ``total_amount = 145``. See the *exp* parameter in - `currencies.json <https://core.telegram.org/bots/payments/currencies.json>`_, - it shows the number of digits past the decimal point for each currency - (2 for the majority of currencies). - invoice_payload (:obj:`str`): Bot-specified invoice payload. - telegram_payment_charge_id (:obj:`str`): Telegram payment identifier. - provider_payment_charge_id (:obj:`str`, optional): Provider payment identifier. - - Attributes: - currency (:obj:`str`): Three-letter ISO 4217 `currency - <https://core.telegram.org/bots/payments#supported-currencies>`_ code, or ``XTR`` for - payments in |tg_stars|. Currently, always ``XTR``. - total_amount (:obj:`int`): Total refunded price in the *smallest units* of the currency - (integer, **not** float/double). For example, for a price of ``US$ 1.45``, - ``total_amount = 145``. See the *exp* parameter in - `currencies.json <https://core.telegram.org/bots/payments/currencies.json>`_, - it shows the number of digits past the decimal point for each currency - (2 for the majority of currencies). - invoice_payload (:obj:`str`): Bot-specified invoice payload. - telegram_payment_charge_id (:obj:`str`): Telegram payment identifier. - provider_payment_charge_id (:obj:`str`): Optional. Provider payment identifier. - - """ - - __slots__ = ( - "currency", - "invoice_payload", - "provider_payment_charge_id", - "telegram_payment_charge_id", - "total_amount", - ) - - def __init__( - self, - currency: str, - total_amount: int, - invoice_payload: str, - telegram_payment_charge_id: str, - provider_payment_charge_id: Optional[str] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.currency: str = currency - self.total_amount: int = total_amount - self.invoice_payload: str = invoice_payload - self.telegram_payment_charge_id: str = telegram_payment_charge_id - # Optional - self.provider_payment_charge_id: Optional[str] = provider_payment_charge_id - - self._id_attrs = (self.telegram_payment_charge_id,) - - self._freeze() diff --git a/venv/lib/python3.12/site-packages/telegram/_payment/shippingaddress.py b/venv/lib/python3.12/site-packages/telegram/_payment/shippingaddress.py deleted file mode 100644 index ed97e02..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_payment/shippingaddress.py +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram ShippingAddress.""" - -from typing import Optional - -from telegram._telegramobject import TelegramObject -from telegram._utils.types import JSONDict - - -class ShippingAddress(TelegramObject): - """This object represents a Telegram ShippingAddress. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`country_code`, :attr:`state`, :attr:`city`, - :attr:`street_line1`, :attr:`street_line2` and :attr:`post_code` are equal. - - Args: - country_code (:obj:`str`): ISO 3166-1 alpha-2 country code. - state (:obj:`str`): State, if applicable. - city (:obj:`str`): City. - street_line1 (:obj:`str`): First line for the address. - street_line2 (:obj:`str`): Second line for the address. - post_code (:obj:`str`): Address post code. - - Attributes: - country_code (:obj:`str`): ISO 3166-1 alpha-2 country code. - state (:obj:`str`): State, if applicable. - city (:obj:`str`): City. - street_line1 (:obj:`str`): First line for the address. - street_line2 (:obj:`str`): Second line for the address. - post_code (:obj:`str`): Address post code. - - """ - - __slots__ = ( - "city", - "country_code", - "post_code", - "state", - "street_line1", - "street_line2", - ) - - def __init__( - self, - country_code: str, - state: str, - city: str, - street_line1: str, - street_line2: str, - post_code: str, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.country_code: str = country_code - self.state: str = state - self.city: str = city - self.street_line1: str = street_line1 - self.street_line2: str = street_line2 - self.post_code: str = post_code - - self._id_attrs = ( - self.country_code, - self.state, - self.city, - self.street_line1, - self.street_line2, - self.post_code, - ) - - self._freeze() diff --git a/venv/lib/python3.12/site-packages/telegram/_payment/shippingoption.py b/venv/lib/python3.12/site-packages/telegram/_payment/shippingoption.py deleted file mode 100644 index 341dbbe..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_payment/shippingoption.py +++ /dev/null @@ -1,76 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram ShippingOption.""" -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional - -from telegram._telegramobject import TelegramObject -from telegram._utils.argumentparsing import parse_sequence_arg -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import LabeledPrice - - -class ShippingOption(TelegramObject): - """This object represents one shipping option. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`id` is equal. - - Examples: - :any:`Payment Bot <examples.paymentbot>` - - Args: - id (:obj:`str`): Shipping option identifier. - title (:obj:`str`): Option title. - prices (Sequence[:class:`telegram.LabeledPrice`]): List of price portions. - - .. versionchanged:: 20.0 - |sequenceclassargs| - - Attributes: - id (:obj:`str`): Shipping option identifier. - title (:obj:`str`): Option title. - prices (tuple[:class:`telegram.LabeledPrice`]): List of price portions. - - .. versionchanged:: 20.0 - |tupleclassattrs| - - """ - - __slots__ = ("id", "prices", "title") - - def __init__( - self, - id: str, # pylint: disable=redefined-builtin - title: str, - prices: Sequence["LabeledPrice"], - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - - self.id: str = id - self.title: str = title - self.prices: tuple[LabeledPrice, ...] = parse_sequence_arg(prices) - - self._id_attrs = (self.id,) - - self._freeze() diff --git a/venv/lib/python3.12/site-packages/telegram/_payment/shippingquery.py b/venv/lib/python3.12/site-packages/telegram/_payment/shippingquery.py deleted file mode 100644 index a31f763..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_payment/shippingquery.py +++ /dev/null @@ -1,123 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram ShippingQuery.""" - -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional - -from telegram._payment.shippingaddress import ShippingAddress -from telegram._telegramobject import TelegramObject -from telegram._user import User -from telegram._utils.argumentparsing import de_json_optional -from telegram._utils.defaultvalue import DEFAULT_NONE -from telegram._utils.types import JSONDict, ODVInput - -if TYPE_CHECKING: - from telegram import Bot - from telegram._payment.shippingoption import ShippingOption - - -class ShippingQuery(TelegramObject): - """This object contains information about an incoming shipping query. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`id` is equal. - - Note: - In Python :keyword:`from` is a reserved word. Use :paramref:`from_user` instead. - - Args: - id (:obj:`str`): Unique query identifier. - from_user (:class:`telegram.User`): User who sent the query. - invoice_payload (:obj:`str`): Bot-specified invoice payload. - shipping_address (:class:`telegram.ShippingAddress`): User specified shipping address. - - Attributes: - id (:obj:`str`): Unique query identifier. - from_user (:class:`telegram.User`): User who sent the query. - invoice_payload (:obj:`str`): Bot-specified invoice payload. - shipping_address (:class:`telegram.ShippingAddress`): User specified shipping address. - - - """ - - __slots__ = ("from_user", "id", "invoice_payload", "shipping_address") - - def __init__( - self, - id: str, # pylint: disable=redefined-builtin - from_user: User, - invoice_payload: str, - shipping_address: ShippingAddress, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.id: str = id - self.from_user: User = from_user - self.invoice_payload: str = invoice_payload - self.shipping_address: ShippingAddress = shipping_address - - self._id_attrs = (self.id,) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "ShippingQuery": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["from_user"] = de_json_optional(data.pop("from", None), User, bot) - data["shipping_address"] = de_json_optional( - data.get("shipping_address"), ShippingAddress, bot - ) - - return super().de_json(data=data, bot=bot) - - async def answer( - self, - ok: bool, - shipping_options: Optional[Sequence["ShippingOption"]] = None, - error_message: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.answer_shipping_query(update.shipping_query.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.answer_shipping_query`. - - """ - return await self.get_bot().answer_shipping_query( - shipping_query_id=self.id, - ok=ok, - shipping_options=shipping_options, - error_message=error_message, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) diff --git a/venv/lib/python3.12/site-packages/telegram/_payment/stars/__init__.py b/venv/lib/python3.12/site-packages/telegram/_payment/stars/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/telegram/_payment/stars/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_payment/stars/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 30f7a8630a7ae91c474a46163f35dd6db9b8471b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 216 zcmZ8bOA5j;5N)i22tA04c2KwC%C%Pru^rlA^C3xFf(LQu-m`cN_kwiSmB~u*!JBzA zyf@4<%T`Ii`+jX=f5q~TaUM3e#3yTVdL(8RrZIY^0U9L`1ar2BqbfUr(phlWVr`hn zt>fhdO<t)%wu)6~phww5%g>;_Yn0p-n=M%GFxRZSuo{19pqlx35UgXy0;ODXM`@w` YwA>3-buAvuBK$!DZ4{rB5Mt7xzJe4z$N&HU diff --git a/venv/lib/python3.12/site-packages/telegram/_payment/stars/__pycache__/affiliateinfo.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_payment/stars/__pycache__/affiliateinfo.cpython-312.pyc deleted file mode 100644 index 767bbeb7d93266b728d4009c4613f3bacc9fe079..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5030 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 diff --git a/venv/lib/python3.12/site-packages/telegram/_payment/stars/__pycache__/revenuewithdrawalstate.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_payment/stars/__pycache__/revenuewithdrawalstate.cpython-312.pyc deleted file mode 100644 index 3306ae0f95d6991793d0214921c95b78f8a35474..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7516 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 F{}+qvFLwX{ diff --git a/venv/lib/python3.12/site-packages/telegram/_payment/stars/__pycache__/staramount.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_payment/stars/__pycache__/staramount.cpython-312.pyc deleted file mode 100644 index 31018b488e79b079faf39dcc4fb39adadcd12748..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2476 zcmeHJ&2Jk;6rb_u#z|ZtjhdFU8j955HdzCeI5-6nNQDw5&LJtPd>OBI$M!b+VP?h& z4msoyiA17;3n~>A<XVOQgi9k;YPAwlB*cLWN=PfJo_MqCO-SHSi3<lt^6Z;=Z{EE3 zdvD(JkNy2Q1mm~wK5H%m^|M;UBi$tqJ^<nlvQPzC*h)CqO;i$C(Mc!irYfnBPC02e zQ^{bIKp!D1y^gF5OKm439hGb+ThLanFEnjIT;FOtjF`SB4cimM@Q7c##Y{<L(~yL- z7H5Ka5;$amIjq4Am&{9pPq=>DllrepX8{M=Tua)%XE;FTW5Kyllj2U#&y^=_Q<{+p z(cIHr983f8Ie5iT1%qb^3s;g>qLS)CR*#jmQunZxW@+#t!_sF#*2)5vRa8B*f$G@O z)=yQm4fH9l^vt6|F325OXndPOXp#w&+cg&YXM~m$zkb{yq33c0Mr5>5e5nvJ9Yer5 zu0V2I1~+Pem+cYBxEo5bPuhlK%Z^SKmi;bz|8P814mb<jVw_ndJT^*fbq%vQDH&4o zQZ=%!3W2cVEzj_L0g%%}9vBlI@0vWp8=@5IR}OUjd!qz_ELCk!RtqIE<w@3HJZApQ z`BB0lo)*|8eNwHyS*?x}6Oy6Eh{qa+w3nEEc*6;U$X~7+C4QU;C9=?j(`~l~_xkn2 z)5^w@Y>X)^WT`5<S*3?-15!;dcOBM0o|w6Dy-GwA;13~<GwYZ#6>Kq1>fCo<Q1OiI z+ESmLD$|MCxf|t$>M?zQz>C?}RWorjRuf}(OkIqh3bl%=?>QYsp9naln&*3CEnnCX z+M$vOND8~wmh8V0V92HTsYAm5A7Du4e-+?DBFIE9HaK<SU6t?SAZN5}y0~n>3+EaX zJg$l+?}f?imUDz*p=k9xxChhM_zsfrjmBnb72SsRv6}n=Z!1|C7_H(}L=({pcnMg= z`p_!61vT^JfZfc=Jt)BH<e@akDAP`i?d}?*4k{$dTy?oZCP<5Ri}66C)b?yi>5+dy z54A0->Y)g-w9Xk@VTE*%63nR|NrfnYC=Dw#r9$;cRb1AdcZyBlWkuJJVyQUkn{8LM zuwq<l#)P!ZMaIW0f7x?<0}66+iFr#!$F3Dy9oh7~tNL4S7vUwcv6f*j8Vz=Ix=33_ zM=30-qAbEWilE-=@H`l?GH}#?^w_<3fFVAF>Dd~3l1DxH&Fqdgv^D)e8+xb}AHVwA zM(T^+$NIY)sfXI|?zs!!U%7i_OFkMI-x(QyaP}H-^SfH#mwlUkxAO;}2D)w;S{=aW z87`wV$Wa<~bD;YuRb8pe$x>?hCTs&(!ttd5G6{`=tB`XATWEIB-^J2ojzehy^H+c+ zRL;E52b5Gco`w};7N%$GXg@KS*7kJtvc5L8mqVBJy=;H_Oi2CS3)JpQ1AA$;lR@V$ zZoPi@e9Rv_|IN*v)0h5GLi-3Nemd4)E@*rR7C}aKTDI2+Ee(d^0O~ZRqCYEKWneHE zZ|bxyZAa*EmWjweW%+#+U7%cfu3d}3dXE!WDj&r~nD&ww<NZqr&)}ySgol4YSARm6 RpJYbxnXfK9MeqrA{0W9t$NB&O diff --git a/venv/lib/python3.12/site-packages/telegram/_payment/stars/__pycache__/startransactions.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_payment/stars/__pycache__/startransactions.cpython-312.pyc deleted file mode 100644 index 007a1942afc02da2947da192cc02e9cb17657232..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7618 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 diff --git a/venv/lib/python3.12/site-packages/telegram/_payment/stars/__pycache__/transactionpartner.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_payment/stars/__pycache__/transactionpartner.cpython-312.pyc deleted file mode 100644 index a5426eabefaf12d7004365fd101f0ca60ae2f465..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23717 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 diff --git a/venv/lib/python3.12/site-packages/telegram/_payment/stars/affiliateinfo.py b/venv/lib/python3.12/site-packages/telegram/_payment/stars/affiliateinfo.py deleted file mode 100644 index 64fd722..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_payment/stars/affiliateinfo.py +++ /dev/null @@ -1,116 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the classes for Telegram Stars affiliates.""" -from typing import TYPE_CHECKING, Optional - -from telegram._chat import Chat -from telegram._telegramobject import TelegramObject -from telegram._user import User -from telegram._utils.argumentparsing import de_json_optional -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot - - -class AffiliateInfo(TelegramObject): - """Contains information about the affiliate that received a commission via this transaction. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`affiliate_user`, :attr:`affiliate_chat`, - :attr:`commission_per_mille`, :attr:`amount`, and :attr:`nanostar_amount` are equal. - - .. versionadded:: 21.9 - - Args: - affiliate_user (:class:`telegram.User`, optional): The bot or the user that received an - affiliate commission if it was received by a bot or a user - affiliate_chat (:class:`telegram.Chat`, optional): The chat that received an affiliate - commission if it was received by a chat - commission_per_mille (:obj:`int`): The number of Telegram Stars received by the affiliate - for each 1000 Telegram Stars received by the bot from referred users - amount (:obj:`int`): Integer amount of Telegram Stars received by the affiliate from the - transaction, rounded to 0; can be negative for refunds - nanostar_amount (:obj:`int`, optional): The number of - :tg-const:`~telegram.constants.Nanostar.VALUE` shares of Telegram - Stars received by the affiliate; from - :tg-const:`~telegram.constants.NanostarLimit.MIN_AMOUNT` to - :tg-const:`~telegram.constants.NanostarLimit.MAX_AMOUNT`; - can be negative for refunds - - Attributes: - affiliate_user (:class:`telegram.User`): Optional. The bot or the user that received an - affiliate commission if it was received by a bot or a user - affiliate_chat (:class:`telegram.Chat`): Optional. The chat that received an affiliate - commission if it was received by a chat - commission_per_mille (:obj:`int`): The number of Telegram Stars received by the affiliate - for each 1000 Telegram Stars received by the bot from referred users - amount (:obj:`int`): Integer amount of Telegram Stars received by the affiliate from the - transaction, rounded to 0; can be negative for refunds - nanostar_amount (:obj:`int`): Optional. The number of - :tg-const:`~telegram.constants.Nanostar.VALUE` shares of Telegram - Stars received by the affiliate; from - :tg-const:`~telegram.constants.NanostarLimit.MIN_AMOUNT` to - :tg-const:`~telegram.constants.NanostarLimit.MAX_AMOUNT`; - can be negative for refunds - """ - - __slots__ = ( - "affiliate_chat", - "affiliate_user", - "amount", - "commission_per_mille", - "nanostar_amount", - ) - - def __init__( - self, - commission_per_mille: int, - amount: int, - affiliate_user: Optional["User"] = None, - affiliate_chat: Optional["Chat"] = None, - nanostar_amount: Optional[int] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(api_kwargs=api_kwargs) - self.affiliate_user: Optional[User] = affiliate_user - self.affiliate_chat: Optional[Chat] = affiliate_chat - self.commission_per_mille: int = commission_per_mille - self.amount: int = amount - self.nanostar_amount: Optional[int] = nanostar_amount - - self._id_attrs = ( - self.affiliate_user, - self.affiliate_chat, - self.commission_per_mille, - self.amount, - self.nanostar_amount, - ) - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "AffiliateInfo": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["affiliate_user"] = de_json_optional(data.get("affiliate_user"), User, bot) - data["affiliate_chat"] = de_json_optional(data.get("affiliate_chat"), Chat, bot) - - return super().de_json(data=data, bot=bot) diff --git a/venv/lib/python3.12/site-packages/telegram/_payment/stars/revenuewithdrawalstate.py b/venv/lib/python3.12/site-packages/telegram/_payment/stars/revenuewithdrawalstate.py deleted file mode 100644 index db4f252..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_payment/stars/revenuewithdrawalstate.py +++ /dev/null @@ -1,180 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -# pylint: disable=redefined-builtin -"""This module contains the classes for Telegram Stars Revenue Withdrawals.""" -import datetime as dtm -from typing import TYPE_CHECKING, Final, Optional - -from telegram import constants -from telegram._telegramobject import TelegramObject -from telegram._utils import enum -from telegram._utils.datetime import extract_tzinfo_from_defaults, from_timestamp -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot - - -class RevenueWithdrawalState(TelegramObject): - """This object describes the state of a revenue withdrawal operation. Currently, it can be one - of: - - * :class:`telegram.RevenueWithdrawalStatePending` - * :class:`telegram.RevenueWithdrawalStateSucceeded` - * :class:`telegram.RevenueWithdrawalStateFailed` - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`type` is equal. - - .. versionadded:: 21.4 - - Args: - type (:obj:`str`): The type of the state. - - Attributes: - type (:obj:`str`): The type of the state. - """ - - __slots__ = ("type",) - - PENDING: Final[str] = constants.RevenueWithdrawalStateType.PENDING - """:const:`telegram.constants.RevenueWithdrawalStateType.PENDING`""" - SUCCEEDED: Final[str] = constants.RevenueWithdrawalStateType.SUCCEEDED - """:const:`telegram.constants.RevenueWithdrawalStateType.SUCCEEDED`""" - FAILED: Final[str] = constants.RevenueWithdrawalStateType.FAILED - """:const:`telegram.constants.RevenueWithdrawalStateType.FAILED`""" - - def __init__(self, type: str, *, api_kwargs: Optional[JSONDict] = None) -> None: - super().__init__(api_kwargs=api_kwargs) - self.type: str = enum.get_member(constants.RevenueWithdrawalStateType, type, type) - - self._id_attrs = (self.type,) - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "RevenueWithdrawalState": - """Converts JSON data to the appropriate :class:`RevenueWithdrawalState` object, i.e. takes - care of selecting the correct subclass. - - Args: - data (dict[:obj:`str`, ...]): The JSON data. - bot (:class:`telegram.Bot`): The bot associated with this object. - - Returns: - The Telegram object. - - """ - data = cls._parse_data(data) - - _class_mapping: dict[str, type[RevenueWithdrawalState]] = { - cls.PENDING: RevenueWithdrawalStatePending, - cls.SUCCEEDED: RevenueWithdrawalStateSucceeded, - cls.FAILED: RevenueWithdrawalStateFailed, - } - - if cls is RevenueWithdrawalState and data.get("type") in _class_mapping: - return _class_mapping[data.pop("type")].de_json(data=data, bot=bot) - - return super().de_json(data=data, bot=bot) - - -class RevenueWithdrawalStatePending(RevenueWithdrawalState): - """The withdrawal is in progress. - - .. versionadded:: 21.4 - - Attributes: - type (:obj:`str`): The type of the state, always - :tg-const:`telegram.RevenueWithdrawalState.PENDING`. - """ - - __slots__ = () - - def __init__(self, *, api_kwargs: Optional[JSONDict] = None) -> None: - super().__init__(type=RevenueWithdrawalState.PENDING, api_kwargs=api_kwargs) - self._freeze() - - -class RevenueWithdrawalStateSucceeded(RevenueWithdrawalState): - """The withdrawal succeeded. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`date` are equal. - - .. versionadded:: 21.4 - - Args: - date (:obj:`datetime.datetime`): Date the withdrawal was completed as a datetime object. - url (:obj:`str`): An HTTPS URL that can be used to see transaction details. - - Attributes: - type (:obj:`str`): The type of the state, always - :tg-const:`telegram.RevenueWithdrawalState.SUCCEEDED`. - date (:obj:`datetime.datetime`): Date the withdrawal was completed as a datetime object. - url (:obj:`str`): An HTTPS URL that can be used to see transaction details. - """ - - __slots__ = ("date", "url") - - def __init__( - self, - date: dtm.datetime, - url: str, - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(type=RevenueWithdrawalState.SUCCEEDED, api_kwargs=api_kwargs) - - with self._unfrozen(): - self.date: dtm.datetime = date - self.url: str = url - self._id_attrs = ( - self.type, - self.date, - ) - - @classmethod - def de_json( - cls, data: JSONDict, bot: Optional["Bot"] = None - ) -> "RevenueWithdrawalStateSucceeded": - """See :meth:`telegram.RevenueWithdrawalState.de_json`.""" - data = cls._parse_data(data) - - # Get the local timezone from the bot if it has defaults - loc_tzinfo = extract_tzinfo_from_defaults(bot) - data["date"] = from_timestamp(data.get("date", None), tzinfo=loc_tzinfo) - - return super().de_json(data=data, bot=bot) # type: ignore[return-value] - - -class RevenueWithdrawalStateFailed(RevenueWithdrawalState): - """The withdrawal failed and the transaction was refunded. - - .. versionadded:: 21.4 - - Attributes: - type (:obj:`str`): The type of the state, always - :tg-const:`telegram.RevenueWithdrawalState.FAILED`. - """ - - __slots__ = () - - def __init__(self, *, api_kwargs: Optional[JSONDict] = None) -> None: - super().__init__(type=RevenueWithdrawalState.FAILED, api_kwargs=api_kwargs) - self._freeze() diff --git a/venv/lib/python3.12/site-packages/telegram/_payment/stars/staramount.py b/venv/lib/python3.12/site-packages/telegram/_payment/stars/staramount.py deleted file mode 100644 index c78a4aa..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_payment/stars/staramount.py +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram StarAmount.""" - - -from typing import Optional - -from telegram._telegramobject import TelegramObject -from telegram._utils.types import JSONDict - - -class StarAmount(TelegramObject): - """Describes an amount of Telegram Stars. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`amount` and :attr:`nanostar_amount` are equal. - - Args: - amount (:obj:`int`): Integer amount of Telegram Stars, rounded to ``0``; can be negative. - nanostar_amount (:obj:`int`, optional): The number of - :tg-const:`telegram.constants.Nanostar.VALUE` shares of Telegram - Stars; from :tg-const:`telegram.constants.NanostarLimit.MIN_AMOUNT` - to :tg-const:`telegram.constants.NanostarLimit.MAX_AMOUNT`; can be - negative if and only if :attr:`amount` is non-positive. - - Attributes: - amount (:obj:`int`): Integer amount of Telegram Stars, rounded to ``0``; can be negative. - nanostar_amount (:obj:`int`): Optional. The number of - :tg-const:`telegram.constants.Nanostar.VALUE` shares of Telegram - Stars; from :tg-const:`telegram.constants.NanostarLimit.MIN_AMOUNT` - to :tg-const:`telegram.constants.NanostarLimit.MAX_AMOUNT`; can be - negative if and only if :attr:`amount` is non-positive. - - """ - - __slots__ = ("amount", "nanostar_amount") - - def __init__( - self, - amount: int, - nanostar_amount: Optional[int] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.amount: int = amount - self.nanostar_amount: Optional[int] = nanostar_amount - - self._id_attrs = (self.amount, self.nanostar_amount) - - self._freeze() diff --git a/venv/lib/python3.12/site-packages/telegram/_payment/stars/startransactions.py b/venv/lib/python3.12/site-packages/telegram/_payment/stars/startransactions.py deleted file mode 100644 index 09f3149..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_payment/stars/startransactions.py +++ /dev/null @@ -1,165 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -# pylint: disable=redefined-builtin -"""This module contains the classes for Telegram Stars transactions.""" - -import datetime as dtm -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional - -from telegram._telegramobject import TelegramObject -from telegram._utils.argumentparsing import de_json_optional, de_list_optional, parse_sequence_arg -from telegram._utils.datetime import extract_tzinfo_from_defaults, from_timestamp -from telegram._utils.types import JSONDict - -from .transactionpartner import TransactionPartner - -if TYPE_CHECKING: - from telegram import Bot - - -class StarTransaction(TelegramObject): - """Describes a Telegram Star transaction. - Note that if the buyer initiates a chargeback with the payment provider from whom they - acquired Stars (e.g., Apple, Google) following this transaction, the refunded Stars will be - deducted from the bot's balance. This is outside of Telegram's control. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`id`, :attr:`source`, and :attr:`receiver` are equal. - - .. versionadded:: 21.4 - - Args: - id (:obj:`str`): Unique identifier of the transaction. Coincides with the identifer - of the original transaction for refund transactions. - Coincides with :attr:`SuccessfulPayment.telegram_payment_charge_id` for - successful incoming payments from users. - amount (:obj:`int`): Integer amount of Telegram Stars transferred by the transaction. - nanostar_amount (:obj:`int`, optional): The number of - :tg-const:`~telegram.constants.Nanostar.VALUE` shares of Telegram - Stars transferred by the transaction; from 0 to - :tg-const:`~telegram.constants.NanostarLimit.MAX_AMOUNT` - - .. versionadded:: 21.9 - date (:obj:`datetime.datetime`): Date the transaction was created as a datetime object. - source (:class:`telegram.TransactionPartner`, optional): Source of an incoming transaction - (e.g., a user purchasing goods or services, Fragment refunding a failed withdrawal). - Only for incoming transactions. - receiver (:class:`telegram.TransactionPartner`, optional): Receiver of an outgoing - transaction (e.g., a user for a purchase refund, Fragment for a withdrawal). Only for - outgoing transactions. - - Attributes: - id (:obj:`str`): Unique identifier of the transaction. Coincides with the identifer - of the original transaction for refund transactions. - Coincides with :attr:`SuccessfulPayment.telegram_payment_charge_id` for - successful incoming payments from users. - amount (:obj:`int`): Integer amount of Telegram Stars transferred by the transaction. - nanostar_amount (:obj:`int`): Optional. The number of - :tg-const:`~telegram.constants.Nanostar.VALUE` shares of Telegram - Stars transferred by the transaction; from 0 to - :tg-const:`~telegram.constants.NanostarLimit.MAX_AMOUNT` - - .. versionadded:: 21.9 - date (:obj:`datetime.datetime`): Date the transaction was created as a datetime object. - source (:class:`telegram.TransactionPartner`): Optional. Source of an incoming transaction - (e.g., a user purchasing goods or services, Fragment refunding a failed withdrawal). - Only for incoming transactions. - receiver (:class:`telegram.TransactionPartner`): Optional. Receiver of an outgoing - transaction (e.g., a user for a purchase refund, Fragment for a withdrawal). Only for - outgoing transactions. - """ - - __slots__ = ("amount", "date", "id", "nanostar_amount", "receiver", "source") - - def __init__( - self, - id: str, - amount: int, - date: dtm.datetime, - source: Optional[TransactionPartner] = None, - receiver: Optional[TransactionPartner] = None, - nanostar_amount: Optional[int] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(api_kwargs=api_kwargs) - self.id: str = id - self.amount: int = amount - self.date: dtm.datetime = date - self.source: Optional[TransactionPartner] = source - self.receiver: Optional[TransactionPartner] = receiver - self.nanostar_amount: Optional[int] = nanostar_amount - - self._id_attrs = ( - self.id, - self.source, - self.receiver, - ) - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "StarTransaction": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - # Get the local timezone from the bot if it has defaults - loc_tzinfo = extract_tzinfo_from_defaults(bot) - data["date"] = from_timestamp(data.get("date", None), tzinfo=loc_tzinfo) - - data["source"] = de_json_optional(data.get("source"), TransactionPartner, bot) - data["receiver"] = de_json_optional(data.get("receiver"), TransactionPartner, bot) - - return super().de_json(data=data, bot=bot) - - -class StarTransactions(TelegramObject): - """ - Contains a list of Telegram Star transactions. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`transactions` are equal. - - .. versionadded:: 21.4 - - Args: - transactions (Sequence[:class:`telegram.StarTransaction`]): The list of transactions. - - Attributes: - transactions (tuple[:class:`telegram.StarTransaction`]): The list of transactions. - """ - - __slots__ = ("transactions",) - - def __init__( - self, transactions: Sequence[StarTransaction], *, api_kwargs: Optional[JSONDict] = None - ): - super().__init__(api_kwargs=api_kwargs) - self.transactions: tuple[StarTransaction, ...] = parse_sequence_arg(transactions) - - self._id_attrs = (self.transactions,) - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "StarTransactions": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["transactions"] = de_list_optional(data.get("transactions"), StarTransaction, bot) - return super().de_json(data=data, bot=bot) diff --git a/venv/lib/python3.12/site-packages/telegram/_payment/stars/transactionpartner.py b/venv/lib/python3.12/site-packages/telegram/_payment/stars/transactionpartner.py deleted file mode 100644 index ffe970b..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_payment/stars/transactionpartner.py +++ /dev/null @@ -1,528 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -# pylint: disable=redefined-builtin -"""This module contains the classes for Telegram Stars transaction partners.""" -from collections.abc import Sequence -from typing import TYPE_CHECKING, Final, Optional - -from telegram import constants -from telegram._chat import Chat -from telegram._gifts import Gift -from telegram._paidmedia import PaidMedia -from telegram._telegramobject import TelegramObject -from telegram._user import User -from telegram._utils import enum -from telegram._utils.argumentparsing import ( - de_json_optional, - de_list_optional, - parse_sequence_arg, - to_timedelta, -) -from telegram._utils.types import JSONDict, TimePeriod - -from .affiliateinfo import AffiliateInfo -from .revenuewithdrawalstate import RevenueWithdrawalState - -if TYPE_CHECKING: - import datetime as dtm - - from telegram import Bot - - -class TransactionPartner(TelegramObject): - """This object describes the source of a transaction, or its recipient for outgoing - transactions. Currently, it can be one of: - - * :class:`TransactionPartnerUser` - * :class:`TransactionPartnerChat` - * :class:`TransactionPartnerAffiliateProgram` - * :class:`TransactionPartnerFragment` - * :class:`TransactionPartnerTelegramAds` - * :class:`TransactionPartnerTelegramApi` - * :class:`TransactionPartnerOther` - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`type` is equal. - - .. versionadded:: 21.4 - - .. versionchanged:: 21.11 - Added :class:`TransactionPartnerChat` - - Args: - type (:obj:`str`): The type of the transaction partner. - - Attributes: - type (:obj:`str`): The type of the transaction partner. - """ - - __slots__ = ("type",) - - AFFILIATE_PROGRAM: Final[str] = constants.TransactionPartnerType.AFFILIATE_PROGRAM - """:const:`telegram.constants.TransactionPartnerType.AFFILIATE_PROGRAM` - - .. versionadded:: 21.9 - """ - CHAT: Final[str] = constants.TransactionPartnerType.CHAT - """:const:`telegram.constants.TransactionPartnerType.CHAT` - - .. versionadded:: 21.11 - """ - FRAGMENT: Final[str] = constants.TransactionPartnerType.FRAGMENT - """:const:`telegram.constants.TransactionPartnerType.FRAGMENT`""" - OTHER: Final[str] = constants.TransactionPartnerType.OTHER - """:const:`telegram.constants.TransactionPartnerType.OTHER`""" - TELEGRAM_ADS: Final[str] = constants.TransactionPartnerType.TELEGRAM_ADS - """:const:`telegram.constants.TransactionPartnerType.TELEGRAM_ADS`""" - TELEGRAM_API: Final[str] = constants.TransactionPartnerType.TELEGRAM_API - """:const:`telegram.constants.TransactionPartnerType.TELEGRAM_API`""" - USER: Final[str] = constants.TransactionPartnerType.USER - """:const:`telegram.constants.TransactionPartnerType.USER`""" - - def __init__(self, type: str, *, api_kwargs: Optional[JSONDict] = None) -> None: - super().__init__(api_kwargs=api_kwargs) - self.type: str = enum.get_member(constants.TransactionPartnerType, type, type) - - self._id_attrs = (self.type,) - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "TransactionPartner": - """Converts JSON data to the appropriate :class:`TransactionPartner` object, i.e. takes - care of selecting the correct subclass. - - Args: - data (dict[:obj:`str`, ...]): The JSON data. - bot (:class:`telegram.Bot`): The bot associated with this object. - - Returns: - The Telegram object. - - """ - data = cls._parse_data(data) - - _class_mapping: dict[str, type[TransactionPartner]] = { - cls.AFFILIATE_PROGRAM: TransactionPartnerAffiliateProgram, - cls.CHAT: TransactionPartnerChat, - cls.FRAGMENT: TransactionPartnerFragment, - cls.USER: TransactionPartnerUser, - cls.TELEGRAM_ADS: TransactionPartnerTelegramAds, - cls.TELEGRAM_API: TransactionPartnerTelegramApi, - cls.OTHER: TransactionPartnerOther, - } - - if cls is TransactionPartner and data.get("type") in _class_mapping: - return _class_mapping[data.pop("type")].de_json(data=data, bot=bot) - - return super().de_json(data=data, bot=bot) - - -class TransactionPartnerAffiliateProgram(TransactionPartner): - """Describes the affiliate program that issued the affiliate commission received via this - transaction. - - This object is comparable in terms of equality. Two objects of this class are considered equal, - if their :attr:`commission_per_mille` are equal. - - .. versionadded:: 21.9 - - Args: - sponsor_user (:class:`telegram.User`, optional): Information about the bot that sponsored - the affiliate program - commission_per_mille (:obj:`int`): The number of Telegram Stars received by the bot for - each 1000 Telegram Stars received by the affiliate program sponsor from referred users. - - Attributes: - type (:obj:`str`): The type of the transaction partner, - always :tg-const:`telegram.TransactionPartner.AFFILIATE_PROGRAM`. - sponsor_user (:class:`telegram.User`): Optional. Information about the bot that sponsored - the affiliate program - commission_per_mille (:obj:`int`): The number of Telegram Stars received by the bot for - each 1000 Telegram Stars received by the affiliate program sponsor from referred users. - """ - - __slots__ = ("commission_per_mille", "sponsor_user") - - def __init__( - self, - commission_per_mille: int, - sponsor_user: Optional["User"] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(type=TransactionPartner.AFFILIATE_PROGRAM, api_kwargs=api_kwargs) - - with self._unfrozen(): - self.sponsor_user: Optional[User] = sponsor_user - self.commission_per_mille: int = commission_per_mille - self._id_attrs = ( - self.type, - self.commission_per_mille, - ) - - @classmethod - def de_json( - cls, data: JSONDict, bot: Optional["Bot"] = None - ) -> "TransactionPartnerAffiliateProgram": - """See :meth:`telegram.TransactionPartner.de_json`.""" - data = cls._parse_data(data) - - data["sponsor_user"] = de_json_optional(data.get("sponsor_user"), User, bot) - - return super().de_json(data=data, bot=bot) # type: ignore[return-value] - - -class TransactionPartnerChat(TransactionPartner): - """Describes a transaction with a chat. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`chat` are equal. - - .. versionadded:: 21.11 - - Args: - chat (:class:`telegram.Chat`): Information about the chat. - gift (:class:`telegram.Gift`, optional): The gift sent to the chat by the bot. - - Attributes: - type (:obj:`str`): The type of the transaction partner, - always :tg-const:`telegram.TransactionPartner.CHAT`. - chat (:class:`telegram.Chat`): Information about the chat. - gift (:class:`telegram.Gift`): Optional. The gift sent to the user by the bot. - - """ - - __slots__ = ( - "chat", - "gift", - ) - - def __init__( - self, - chat: Chat, - gift: Optional[Gift] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(type=TransactionPartner.CHAT, api_kwargs=api_kwargs) - - with self._unfrozen(): - self.chat: Chat = chat - self.gift: Optional[Gift] = gift - - self._id_attrs = ( - self.type, - self.chat, - ) - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "TransactionPartnerChat": - """See :meth:`telegram.TransactionPartner.de_json`.""" - data = cls._parse_data(data) - - data["chat"] = de_json_optional(data.get("chat"), Chat, bot) - data["gift"] = de_json_optional(data.get("gift"), Gift, bot) - - return super().de_json(data=data, bot=bot) # type: ignore[return-value] - - -class TransactionPartnerFragment(TransactionPartner): - """Describes a withdrawal transaction with Fragment. - - .. versionadded:: 21.4 - - Args: - withdrawal_state (:class:`telegram.RevenueWithdrawalState`, optional): State of the - transaction if the transaction is outgoing. - - Attributes: - type (:obj:`str`): The type of the transaction partner, - always :tg-const:`telegram.TransactionPartner.FRAGMENT`. - withdrawal_state (:class:`telegram.RevenueWithdrawalState`): Optional. State of the - transaction if the transaction is outgoing. - """ - - __slots__ = ("withdrawal_state",) - - def __init__( - self, - withdrawal_state: Optional["RevenueWithdrawalState"] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(type=TransactionPartner.FRAGMENT, api_kwargs=api_kwargs) - - with self._unfrozen(): - self.withdrawal_state: Optional[RevenueWithdrawalState] = withdrawal_state - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "TransactionPartnerFragment": - """See :meth:`telegram.TransactionPartner.de_json`.""" - data = cls._parse_data(data) - - data["withdrawal_state"] = de_json_optional( - data.get("withdrawal_state"), RevenueWithdrawalState, bot - ) - - return super().de_json(data=data, bot=bot) # type: ignore[return-value] - - -class TransactionPartnerUser(TransactionPartner): - """Describes a transaction with a user. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`user` and :attr:`transaction_type` are equal. - - .. versionadded:: 21.4 - - .. versionchanged:: 22.1 - Equality comparison now includes the new required argument :paramref:`transaction_type`, - introduced in Bot API 9.0. - - Args: - transaction_type (:obj:`str`): Type of the transaction, currently one of - :tg-const:`telegram.constants.TransactionPartnerUser.INVOICE_PAYMENT` for payments via - invoices, :tg-const:`telegram.constants.TransactionPartnerUser.PAID_MEDIA_PAYMENT` - for payments for paid media, - :tg-const:`telegram.constants.TransactionPartnerUser.GIFT_PURCHASE` for gifts sent by - the bot, :tg-const:`telegram.constants.TransactionPartnerUser.PREMIUM_PURCHASE` - for Telegram Premium subscriptions gifted by the bot, - :tg-const:`telegram.constants.TransactionPartnerUser.BUSINESS_ACCOUNT_TRANSFER` for - direct transfers from managed business accounts. - - .. versionadded:: 22.1 - user (:class:`telegram.User`): Information about the user. - affiliate (:class:`telegram.AffiliateInfo`, optional): Information about the affiliate that - received a commission via this transaction. Can be available only for - :tg-const:`telegram.constants.TransactionPartnerUser.INVOICE_PAYMENT` - and :tg-const:`telegram.constants.TransactionPartnerUser.PAID_MEDIA_PAYMENT` - transactions. - - .. versionadded:: 21.9 - invoice_payload (:obj:`str`, optional): Bot-specified invoice payload. Can be available - only for :tg-const:`telegram.constants.TransactionPartnerUser.INVOICE_PAYMENT` - transactions. - subscription_period (:obj:`int` | :class:`datetime.timedelta`, optional): The duration of - the paid subscription. Can be available only for - :tg-const:`telegram.constants.TransactionPartnerUser.INVOICE_PAYMENT` transactions. - - .. versionadded:: 21.8 - - .. versionchanged:: v22.2 - Accepts :obj:`int` objects as well as :class:`datetime.timedelta`. - paid_media (Sequence[:class:`telegram.PaidMedia`], optional): Information about the paid - media bought by the user. for - :tg-const:`telegram.constants.TransactionPartnerUser.PAID_MEDIA_PAYMENT` - transactions only. - - .. versionadded:: 21.5 - paid_media_payload (:obj:`str`, optional): Bot-specified paid media payload. Can be - available only for - :tg-const:`telegram.constants.TransactionPartnerUser.PAID_MEDIA_PAYMENT` transactions. - - .. versionadded:: 21.6 - gift (:class:`telegram.Gift`, optional): The gift sent to the user by the bot; for - :tg-const:`telegram.constants.TransactionPartnerUser.GIFT_PURCHASE` transactions only. - - .. versionadded:: 21.8 - premium_subscription_duration (:obj:`int`, optional): Number of months the gifted Telegram - Premium subscription will be active for; for - :tg-const:`telegram.constants.TransactionPartnerUser.PREMIUM_PURCHASE` - transactions only. - - .. versionadded:: 22.1 - - Attributes: - type (:obj:`str`): The type of the transaction partner, - always :tg-const:`telegram.TransactionPartner.USER`. - transaction_type (:obj:`str`): Type of the transaction, currently one of - :tg-const:`telegram.constants.TransactionPartnerUser.INVOICE_PAYMENT` for payments via - invoices, :tg-const:`telegram.constants.TransactionPartnerUser.PAID_MEDIA_PAYMENT` - for payments for paid media, - :tg-const:`telegram.constants.TransactionPartnerUser.GIFT_PURCHASE` for gifts sent by - the bot, :tg-const:`telegram.constants.TransactionPartnerUser.PREMIUM_PURCHASE` - for Telegram Premium subscriptions gifted by the bot, - :tg-const:`telegram.constants.TransactionPartnerUser.BUSINESS_ACCOUNT_TRANSFER` for - direct transfers from managed business accounts. - - .. versionadded:: 22.1 - user (:class:`telegram.User`): Information about the user. - affiliate (:class:`telegram.AffiliateInfo`): Optional. Information about the affiliate that - received a commission via this transaction. Can be available only for - :tg-const:`telegram.constants.TransactionPartnerUser.INVOICE_PAYMENT` - and :tg-const:`telegram.constants.TransactionPartnerUser.PAID_MEDIA_PAYMENT` - transactions. - - .. versionadded:: 21.9 - invoice_payload (:obj:`str`): Optional. Bot-specified invoice payload. Can be available - only for :tg-const:`telegram.constants.TransactionPartnerUser.INVOICE_PAYMENT` - transactions. - subscription_period (:class:`datetime.timedelta`): Optional. The duration of the paid - subscription. Can be available only for - :tg-const:`telegram.constants.TransactionPartnerUser.INVOICE_PAYMENT` transactions. - - .. versionadded:: 21.8 - paid_media (tuple[:class:`telegram.PaidMedia`]): Optional. Information about the paid - media bought by the user. for - :tg-const:`telegram.constants.TransactionPartnerUser.PAID_MEDIA_PAYMENT` - transactions only. - - .. versionadded:: 21.5 - paid_media_payload (:obj:`str`): Optional. Bot-specified paid media payload. Can be - available only for - :tg-const:`telegram.constants.TransactionPartnerUser.PAID_MEDIA_PAYMENT` transactions. - - .. versionadded:: 21.6 - gift (:class:`telegram.Gift`): Optional. The gift sent to the user by the bot; for - :tg-const:`telegram.constants.TransactionPartnerUser.GIFT_PURCHASE` transactions only. - - .. versionadded:: 21.8 - premium_subscription_duration (:obj:`int`): Optional. Number of months the gifted Telegram - Premium subscription will be active for; for - :tg-const:`telegram.constants.TransactionPartnerUser.PREMIUM_PURCHASE` - transactions only. - - .. versionadded:: 22.1 - - """ - - __slots__ = ( - "affiliate", - "gift", - "invoice_payload", - "paid_media", - "paid_media_payload", - "premium_subscription_duration", - "subscription_period", - "transaction_type", - "user", - ) - - def __init__( - self, - user: "User", - invoice_payload: Optional[str] = None, - paid_media: Optional[Sequence[PaidMedia]] = None, - paid_media_payload: Optional[str] = None, - subscription_period: Optional[TimePeriod] = None, - gift: Optional[Gift] = None, - affiliate: Optional[AffiliateInfo] = None, - premium_subscription_duration: Optional[int] = None, - # temporarily optional to account for changed signature - transaction_type: Optional[str] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(type=TransactionPartner.USER, api_kwargs=api_kwargs) - - # tags: deprecated 22.1, bot api 9.0 - if transaction_type is None: - raise TypeError("`transaction_type` is a required argument since Bot API 9.0") - - with self._unfrozen(): - self.user: User = user - self.affiliate: Optional[AffiliateInfo] = affiliate - self.invoice_payload: Optional[str] = invoice_payload - self.paid_media: Optional[tuple[PaidMedia, ...]] = parse_sequence_arg(paid_media) - self.paid_media_payload: Optional[str] = paid_media_payload - self.subscription_period: Optional[dtm.timedelta] = to_timedelta(subscription_period) - self.gift: Optional[Gift] = gift - self.premium_subscription_duration: Optional[int] = premium_subscription_duration - self.transaction_type: str = transaction_type - - self._id_attrs = ( - self.type, - self.user, - self.transaction_type, - ) - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "TransactionPartnerUser": - """See :meth:`telegram.TransactionPartner.de_json`.""" - data = cls._parse_data(data) - - data["user"] = de_json_optional(data.get("user"), User, bot) - data["affiliate"] = de_json_optional(data.get("affiliate"), AffiliateInfo, bot) - data["paid_media"] = de_list_optional(data.get("paid_media"), PaidMedia, bot) - data["gift"] = de_json_optional(data.get("gift"), Gift, bot) - - return super().de_json(data=data, bot=bot) # type: ignore[return-value] - - -class TransactionPartnerOther(TransactionPartner): - """Describes a transaction with an unknown partner. - - .. versionadded:: 21.4 - - Attributes: - type (:obj:`str`): The type of the transaction partner, - always :tg-const:`telegram.TransactionPartner.OTHER`. - """ - - __slots__ = () - - def __init__(self, *, api_kwargs: Optional[JSONDict] = None) -> None: - super().__init__(type=TransactionPartner.OTHER, api_kwargs=api_kwargs) - self._freeze() - - -class TransactionPartnerTelegramAds(TransactionPartner): - """Describes a withdrawal transaction to the Telegram Ads platform. - - .. versionadded:: 21.4 - - Attributes: - type (:obj:`str`): The type of the transaction partner, - always :tg-const:`telegram.TransactionPartner.TELEGRAM_ADS`. - """ - - __slots__ = () - - def __init__(self, *, api_kwargs: Optional[JSONDict] = None) -> None: - super().__init__(type=TransactionPartner.TELEGRAM_ADS, api_kwargs=api_kwargs) - self._freeze() - - -class TransactionPartnerTelegramApi(TransactionPartner): - """Describes a transaction with payment for - `paid broadcasting <https://core.telegram.org/bots/api#paid-broadcasts>`_. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`request_count` is equal. - - .. versionadded:: 21.7 - - Args: - request_count (:obj:`int`): The number of successful requests that exceeded regular limits - and were therefore billed. - - Attributes: - type (:obj:`str`): The type of the transaction partner, - always :tg-const:`telegram.TransactionPartner.TELEGRAM_API`. - request_count (:obj:`int`): The number of successful requests that exceeded regular limits - and were therefore billed. - """ - - __slots__ = ("request_count",) - - def __init__(self, request_count: int, *, api_kwargs: Optional[JSONDict] = None) -> None: - super().__init__(type=TransactionPartner.TELEGRAM_API, api_kwargs=api_kwargs) - with self._unfrozen(): - self.request_count: int = request_count - self._id_attrs = (self.request_count,) diff --git a/venv/lib/python3.12/site-packages/telegram/_payment/successfulpayment.py b/venv/lib/python3.12/site-packages/telegram/_payment/successfulpayment.py deleted file mode 100644 index 5e129d1..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_payment/successfulpayment.py +++ /dev/null @@ -1,158 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram SuccessfulPayment.""" - -import datetime as dtm -from typing import TYPE_CHECKING, Optional - -from telegram._payment.orderinfo import OrderInfo -from telegram._telegramobject import TelegramObject -from telegram._utils.argumentparsing import de_json_optional -from telegram._utils.datetime import extract_tzinfo_from_defaults, from_timestamp -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot - - -class SuccessfulPayment(TelegramObject): - """This object contains basic information about a successful payment. - Note that if the buyer initiates a chargeback with the relevant payment provider following - this transaction, the funds may be debited from your balance. This is outside of - Telegram's control. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`telegram_payment_charge_id` and - :attr:`provider_payment_charge_id` are equal. - - Args: - currency (:obj:`str`): Three-letter ISO 4217 currency code, or ``XTR`` for payments in - |tg_stars|. - total_amount (:obj:`int`): Total price in the smallest units of the currency (integer, - **not** float/double). For example, for a price of ``US$ 1.45`` pass ``amount = 145``. - See the ``exp`` parameter in - `currencies.json <https://core.telegram.org/bots/payments/currencies.json>`_, - it shows the number of digits past the decimal point for each currency - (2 for the majority of currencies). - invoice_payload (:obj:`str`): Bot-specified invoice payload. - subscription_expiration_date (:class:`datetime.datetime`, optional): Expiration date of the - subscription; for recurring payments only. - - .. versionadded:: 21.8 - is_recurring (:obj:`bool`, optional): True, if the payment is for a subscription. - - .. versionadded:: 21.8 - is_first_recurring (:obj:`bool`, optional): True, if the payment is the first payment of a - subscription. - - .. versionadded:: 21.8 - shipping_option_id (:obj:`str`, optional): Identifier of the shipping option chosen by the - user. - order_info (:class:`telegram.OrderInfo`, optional): Order info provided by the user. - telegram_payment_charge_id (:obj:`str`): Telegram payment identifier. - provider_payment_charge_id (:obj:`str`): Provider payment identifier. - - Attributes: - currency (:obj:`str`): Three-letter ISO 4217 currency code, or ``XTR`` for payments in - |tg_stars|. - total_amount (:obj:`int`): Total price in the smallest units of the currency (integer, - **not** float/double). For example, for a price of ``US$ 1.45`` pass ``amount = 145``. - See the ``exp`` parameter in - `currencies.json <https://core.telegram.org/bots/payments/currencies.json>`_, - it shows the number of digits past the decimal point for each currency - (2 for the majority of currencies). - invoice_payload (:obj:`str`): Bot-specified invoice payload. - subscription_expiration_date (:class:`datetime.datetime`): Optional. Expiration - date of the subscription; for recurring payments only. - - .. versionadded:: 21.8 - is_recurring (:obj:`bool`): Optional. True, if the payment is for a subscription. - - .. versionadded:: 21.8 - is_first_recurring (:obj:`bool`): Optional. True, if the payment is the first payment of a - subscription. - - .. versionadded:: 21.8 - shipping_option_id (:obj:`str`): Optional. Identifier of the shipping option chosen by the - user. - order_info (:class:`telegram.OrderInfo`): Optional. Order info provided by the user. - telegram_payment_charge_id (:obj:`str`): Telegram payment identifier. - provider_payment_charge_id (:obj:`str`): Provider payment identifier. - - """ - - __slots__ = ( - "currency", - "invoice_payload", - "is_first_recurring", - "is_recurring", - "order_info", - "provider_payment_charge_id", - "shipping_option_id", - "subscription_expiration_date", - "telegram_payment_charge_id", - "total_amount", - ) - - def __init__( - self, - currency: str, - total_amount: int, - invoice_payload: str, - telegram_payment_charge_id: str, - provider_payment_charge_id: str, - shipping_option_id: Optional[str] = None, - order_info: Optional[OrderInfo] = None, - subscription_expiration_date: Optional[dtm.datetime] = None, - is_recurring: Optional[bool] = None, - is_first_recurring: Optional[bool] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.currency: str = currency - self.total_amount: int = total_amount - self.invoice_payload: str = invoice_payload - self.shipping_option_id: Optional[str] = shipping_option_id - self.order_info: Optional[OrderInfo] = order_info - self.telegram_payment_charge_id: str = telegram_payment_charge_id - self.provider_payment_charge_id: str = provider_payment_charge_id - self.subscription_expiration_date: Optional[dtm.datetime] = subscription_expiration_date - self.is_recurring: Optional[bool] = is_recurring - self.is_first_recurring: Optional[bool] = is_first_recurring - - self._id_attrs = (self.telegram_payment_charge_id, self.provider_payment_charge_id) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "SuccessfulPayment": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["order_info"] = de_json_optional(data.get("order_info"), OrderInfo, bot) - - # Get the local timezone from the bot if it has defaults - loc_tzinfo = extract_tzinfo_from_defaults(bot) - - data["subscription_expiration_date"] = from_timestamp( - data.get("subscription_expiration_date"), tzinfo=loc_tzinfo - ) - - return super().de_json(data=data, bot=bot) diff --git a/venv/lib/python3.12/site-packages/telegram/_poll.py b/venv/lib/python3.12/site-packages/telegram/_poll.py deleted file mode 100644 index d8c6338..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_poll.py +++ /dev/null @@ -1,655 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram Poll.""" -import datetime as dtm -from collections.abc import Sequence -from typing import TYPE_CHECKING, Final, Optional, Union - -from telegram import constants -from telegram._chat import Chat -from telegram._messageentity import MessageEntity -from telegram._telegramobject import TelegramObject -from telegram._user import User -from telegram._utils import enum -from telegram._utils.argumentparsing import ( - de_json_optional, - de_list_optional, - parse_sequence_arg, - to_timedelta, -) -from telegram._utils.datetime import ( - extract_tzinfo_from_defaults, - from_timestamp, - get_timedelta_value, -) -from telegram._utils.defaultvalue import DEFAULT_NONE -from telegram._utils.entities import parse_message_entities, parse_message_entity -from telegram._utils.types import JSONDict, ODVInput, TimePeriod - -if TYPE_CHECKING: - from telegram import Bot - - -class InputPollOption(TelegramObject): - """ - This object contains information about one answer option in a poll to be sent. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`text` is equal. - - .. versionadded:: 21.2 - - Args: - text (:obj:`str`): Option text, - :tg-const:`telegram.PollOption.MIN_LENGTH`-:tg-const:`telegram.PollOption.MAX_LENGTH` - characters. - text_parse_mode (:obj:`str`, optional): |parse_mode| - Currently, only custom emoji entities are allowed. - text_entities (Sequence[:class:`telegram.MessageEntity`], optional): Special entities - that appear in the option :paramref:`text`. It can be specified instead of - :paramref:`text_parse_mode`. - Currently, only custom emoji entities are allowed. - This list is empty if the text does not contain entities. - - Attributes: - text (:obj:`str`): Option text, - :tg-const:`telegram.PollOption.MIN_LENGTH`-:tg-const:`telegram.PollOption.MAX_LENGTH` - characters. - text_parse_mode (:obj:`str`): Optional. |parse_mode| - Currently, only custom emoji entities are allowed. - text_entities (Sequence[:class:`telegram.MessageEntity`]): Special entities - that appear in the option :paramref:`text`. It can be specified instead of - :paramref:`text_parse_mode`. - Currently, only custom emoji entities are allowed. - This list is empty if the text does not contain entities. - """ - - __slots__ = ("text", "text_entities", "text_parse_mode") - - def __init__( - self, - text: str, - text_parse_mode: ODVInput[str] = DEFAULT_NONE, - text_entities: Optional[Sequence[MessageEntity]] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.text: str = text - self.text_parse_mode: ODVInput[str] = text_parse_mode - self.text_entities: tuple[MessageEntity, ...] = parse_sequence_arg(text_entities) - - self._id_attrs = (self.text,) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "InputPollOption": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["text_entities"] = de_list_optional(data.get("text_entities"), MessageEntity, bot) - - return super().de_json(data=data, bot=bot) - - -class PollOption(TelegramObject): - """ - This object contains information about one answer option in a poll. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`text` and :attr:`voter_count` are equal. - - Args: - text (:obj:`str`): Option text, - :tg-const:`telegram.PollOption.MIN_LENGTH`-:tg-const:`telegram.PollOption.MAX_LENGTH` - characters. - voter_count (:obj:`int`): Number of users that voted for this option. - text_entities (Sequence[:class:`telegram.MessageEntity`], optional): Special entities - that appear in the option text. Currently, only custom emoji entities are allowed in - poll option texts. - - .. versionadded:: 21.2 - - Attributes: - text (:obj:`str`): Option text, - :tg-const:`telegram.PollOption.MIN_LENGTH`-:tg-const:`telegram.PollOption.MAX_LENGTH` - characters. - voter_count (:obj:`int`): Number of users that voted for this option. - text_entities (tuple[:class:`telegram.MessageEntity`]): Special entities - that appear in the option text. Currently, only custom emoji entities are allowed in - poll option texts. - This list is empty if the question does not contain entities. - - .. versionadded:: 21.2 - - """ - - __slots__ = ("text", "text_entities", "voter_count") - - def __init__( - self, - text: str, - voter_count: int, - text_entities: Optional[Sequence[MessageEntity]] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.text: str = text - self.voter_count: int = voter_count - self.text_entities: tuple[MessageEntity, ...] = parse_sequence_arg(text_entities) - - self._id_attrs = (self.text, self.voter_count) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "PollOption": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["text_entities"] = de_list_optional(data.get("text_entities"), MessageEntity, bot) - - return super().de_json(data=data, bot=bot) - - def parse_entity(self, entity: MessageEntity) -> str: - """Returns the text in :attr:`text` - from a given :class:`telegram.MessageEntity` of :attr:`text_entities`. - - Note: - This method is present because Telegram calculates the offset and length in - UTF-16 codepoint pairs, which some versions of Python don't handle automatically. - (That is, you can't just slice ``Message.text`` with the offset and length.) - - .. versionadded:: 21.2 - - Args: - entity (:class:`telegram.MessageEntity`): The entity to extract the text from. It must - be an entity that belongs to :attr:`text_entities`. - - Returns: - :obj:`str`: The text of the given entity. - """ - return parse_message_entity(self.text, entity) - - def parse_entities(self, types: Optional[list[str]] = None) -> dict[MessageEntity, str]: - """ - Returns a :obj:`dict` that maps :class:`telegram.MessageEntity` to :obj:`str`. - It contains entities from this polls question filtered by their ``type`` attribute as - the key, and the text that each entity belongs to as the value of the :obj:`dict`. - - Note: - This method should always be used instead of the :attr:`text_entities` - attribute, since it calculates the correct substring from the message text based on - UTF-16 codepoints. See :attr:`parse_entity` for more info. - - .. versionadded:: 21.2 - - Args: - types (list[:obj:`str`], optional): List of ``MessageEntity`` types as strings. If the - ``type`` attribute of an entity is contained in this list, it will be returned. - Defaults to :attr:`telegram.MessageEntity.ALL_TYPES`. - - Returns: - dict[:class:`telegram.MessageEntity`, :obj:`str`]: A dictionary of entities mapped to - the text that belongs to them, calculated based on UTF-16 codepoints. - """ - return parse_message_entities(self.text, self.text_entities, types) - - MIN_LENGTH: Final[int] = constants.PollLimit.MIN_OPTION_LENGTH - """:const:`telegram.constants.PollLimit.MIN_OPTION_LENGTH` - - .. versionadded:: 20.0 - """ - MAX_LENGTH: Final[int] = constants.PollLimit.MAX_OPTION_LENGTH - """:const:`telegram.constants.PollLimit.MAX_OPTION_LENGTH` - - .. versionadded:: 20.0 - """ - - -class PollAnswer(TelegramObject): - """ - This object represents an answer of a user in a non-anonymous poll. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`poll_id`, :attr:`user` and :attr:`option_ids` are equal. - - .. versionchanged:: 20.5 - The order of :paramref:`option_ids` and :paramref:`user` is changed in - 20.5 as the latter one became optional. - - .. versionchanged:: 20.6 - Backward compatiblity for changed order of :paramref:`option_ids` and :paramref:`user` - was removed. - - Args: - poll_id (:obj:`str`): Unique poll identifier. - option_ids (Sequence[:obj:`int`]): Identifiers of answer options, chosen by the user. May - be empty if the user retracted their vote. - - .. versionchanged:: 20.0 - |sequenceclassargs| - user (:class:`telegram.User`, optional): The user that changed the answer to the poll, - if the voter isn't anonymous. If the voter is anonymous, this field will contain the - user :tg-const:`telegram.constants.ChatID.FAKE_CHANNEL` for backwards compatibility. - - .. versionchanged:: 20.5 - :paramref:`user` became optional. - voter_chat (:class:`telegram.Chat`, optional): The chat that changed the answer to the - poll, if the voter is anonymous. - - .. versionadded:: 20.5 - - Attributes: - poll_id (:obj:`str`): Unique poll identifier. - option_ids (tuple[:obj:`int`]): Identifiers of answer options, chosen by the user. May - be empty if the user retracted their vote. - - .. versionchanged:: 20.0 - |tupleclassattrs| - user (:class:`telegram.User`): Optional. The user, who changed the answer to the - poll, if the voter isn't anonymous. If the voter is anonymous, this field will contain - the user :tg-const:`telegram.constants.ChatID.FAKE_CHANNEL` for backwards compatibility - - .. versionchanged:: 20.5 - :paramref:`user` became optional. - voter_chat (:class:`telegram.Chat`): Optional. The chat that changed the answer to the - poll, if the voter is anonymous. - - .. versionadded:: 20.5 - - """ - - __slots__ = ("option_ids", "poll_id", "user", "voter_chat") - - def __init__( - self, - poll_id: str, - option_ids: Sequence[int], - user: Optional[User] = None, - voter_chat: Optional[Chat] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.poll_id: str = poll_id - self.voter_chat: Optional[Chat] = voter_chat - self.option_ids: tuple[int, ...] = parse_sequence_arg(option_ids) - self.user: Optional[User] = user - - self._id_attrs = ( - self.poll_id, - self.option_ids, - self.user, - self.voter_chat, - ) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "PollAnswer": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["user"] = de_json_optional(data.get("user"), User, bot) - data["voter_chat"] = de_json_optional(data.get("voter_chat"), Chat, bot) - - return super().de_json(data=data, bot=bot) - - -class Poll(TelegramObject): - """ - This object contains information about a poll. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`id` is equal. - - Examples: - :any:`Poll Bot <examples.pollbot>` - - Args: - id (:obj:`str`): Unique poll identifier. - question (:obj:`str`): Poll question, :tg-const:`telegram.Poll.MIN_QUESTION_LENGTH`- - :tg-const:`telegram.Poll.MAX_QUESTION_LENGTH` characters. - options (Sequence[:class:`~telegram.PollOption`]): List of poll options. - - .. versionchanged:: 20.0 - |sequenceclassargs| - is_closed (:obj:`bool`): :obj:`True`, if the poll is closed. - is_anonymous (:obj:`bool`): :obj:`True`, if the poll is anonymous. - type (:obj:`str`): Poll type, currently can be :attr:`REGULAR` or :attr:`QUIZ`. - allows_multiple_answers (:obj:`bool`): :obj:`True`, if the poll allows multiple answers. - correct_option_id (:obj:`int`, optional): A zero based identifier of the correct answer - option. Available only for closed polls in the quiz mode, which were sent - (not forwarded), by the bot or to a private chat with the bot. - explanation (:obj:`str`, optional): Text that is shown when a user chooses an incorrect - answer or taps on the lamp icon in a quiz-style poll, - 0-:tg-const:`telegram.Poll.MAX_EXPLANATION_LENGTH` characters. - explanation_entities (Sequence[:class:`telegram.MessageEntity`], optional): Special - entities like usernames, URLs, bot commands, etc. that appear in the - :attr:`explanation`. This list is empty if the message does not contain explanation - entities. - - .. versionchanged:: 20.0 - - * This attribute is now always a (possibly empty) list and never :obj:`None`. - * |sequenceclassargs| - open_period (:obj:`int` | :class:`datetime.timedelta`, optional): Amount of time in seconds - the poll will be active after creation. - - .. versionchanged:: v22.2 - |time-period-input| - close_date (:obj:`datetime.datetime`, optional): Point in time (Unix timestamp) when the - poll will be automatically closed. Converted to :obj:`datetime.datetime`. - - .. versionchanged:: 20.3 - |datetime_localization| - question_entities (Sequence[:class:`telegram.MessageEntity`], optional): Special entities - that appear in the :attr:`question`. Currently, only custom emoji entities are allowed - in poll questions. - - .. versionadded:: 21.2 - - Attributes: - id (:obj:`str`): Unique poll identifier. - question (:obj:`str`): Poll question, :tg-const:`telegram.Poll.MIN_QUESTION_LENGTH`- - :tg-const:`telegram.Poll.MAX_QUESTION_LENGTH` characters. - options (tuple[:class:`~telegram.PollOption`]): List of poll options. - - .. versionchanged:: 20.0 - |tupleclassattrs| - total_voter_count (:obj:`int`): Total number of users that voted in the poll. - is_closed (:obj:`bool`): :obj:`True`, if the poll is closed. - is_anonymous (:obj:`bool`): :obj:`True`, if the poll is anonymous. - type (:obj:`str`): Poll type, currently can be :attr:`REGULAR` or :attr:`QUIZ`. - allows_multiple_answers (:obj:`bool`): :obj:`True`, if the poll allows multiple answers. - correct_option_id (:obj:`int`): Optional. A zero based identifier of the correct answer - option. Available only for closed polls in the quiz mode, which were sent - (not forwarded), by the bot or to a private chat with the bot. - explanation (:obj:`str`): Optional. Text that is shown when a user chooses an incorrect - answer or taps on the lamp icon in a quiz-style poll, - 0-:tg-const:`telegram.Poll.MAX_EXPLANATION_LENGTH` characters. - explanation_entities (tuple[:class:`telegram.MessageEntity`]): Special entities - like usernames, URLs, bot commands, etc. that appear in the :attr:`explanation`. - This list is empty if the message does not contain explanation entities. - - .. versionchanged:: 20.0 - |tupleclassattrs| - - .. versionchanged:: 20.0 - This attribute is now always a (possibly empty) list and never :obj:`None`. - open_period (:obj:`int` | :class:`datetime.timedelta`): Optional. Amount of time in seconds - the poll will be active after creation. - - .. deprecated:: v22.2 - |time-period-int-deprecated| - close_date (:obj:`datetime.datetime`): Optional. Point in time when the poll will be - automatically closed. - - .. versionchanged:: 20.3 - |datetime_localization| - question_entities (tuple[:class:`telegram.MessageEntity`]): Special entities - that appear in the :attr:`question`. Currently, only custom emoji entities are allowed - in poll questions. - This list is empty if the question does not contain entities. - - .. versionadded:: 21.2 - - """ - - __slots__ = ( - "_open_period", - "allows_multiple_answers", - "close_date", - "correct_option_id", - "explanation", - "explanation_entities", - "id", - "is_anonymous", - "is_closed", - "options", - "question", - "question_entities", - "total_voter_count", - "type", - ) - - def __init__( - self, - id: str, # pylint: disable=redefined-builtin - question: str, - options: Sequence[PollOption], - total_voter_count: int, - is_closed: bool, - is_anonymous: bool, - type: str, # pylint: disable=redefined-builtin - allows_multiple_answers: bool, - correct_option_id: Optional[int] = None, - explanation: Optional[str] = None, - explanation_entities: Optional[Sequence[MessageEntity]] = None, - open_period: Optional[TimePeriod] = None, - close_date: Optional[dtm.datetime] = None, - question_entities: Optional[Sequence[MessageEntity]] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.id: str = id - self.question: str = question - self.options: tuple[PollOption, ...] = parse_sequence_arg(options) - self.total_voter_count: int = total_voter_count - self.is_closed: bool = is_closed - self.is_anonymous: bool = is_anonymous - self.type: str = enum.get_member(constants.PollType, type, type) - self.allows_multiple_answers: bool = allows_multiple_answers - self.correct_option_id: Optional[int] = correct_option_id - self.explanation: Optional[str] = explanation - self.explanation_entities: tuple[MessageEntity, ...] = parse_sequence_arg( - explanation_entities - ) - self._open_period: Optional[dtm.timedelta] = to_timedelta(open_period) - self.close_date: Optional[dtm.datetime] = close_date - self.question_entities: tuple[MessageEntity, ...] = parse_sequence_arg(question_entities) - - self._id_attrs = (self.id,) - - self._freeze() - - @property - def open_period(self) -> Optional[Union[int, dtm.timedelta]]: - return get_timedelta_value(self._open_period, attribute="open_period") - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "Poll": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - # Get the local timezone from the bot if it has defaults - loc_tzinfo = extract_tzinfo_from_defaults(bot) - - data["options"] = de_list_optional(data.get("options"), PollOption, bot) - data["explanation_entities"] = de_list_optional( - data.get("explanation_entities"), MessageEntity, bot - ) - data["close_date"] = from_timestamp(data.get("close_date"), tzinfo=loc_tzinfo) - data["question_entities"] = de_list_optional( - data.get("question_entities"), MessageEntity, bot - ) - - return super().de_json(data=data, bot=bot) - - def parse_explanation_entity(self, entity: MessageEntity) -> str: - """Returns the text in :attr:`explanation` from a given :class:`telegram.MessageEntity` of - :attr:`explanation_entities`. - - Note: - This method is present because Telegram calculates the offset and length in - UTF-16 codepoint pairs, which some versions of Python don't handle automatically. - (That is, you can't just slice ``Message.text`` with the offset and length.) - - Args: - entity (:class:`telegram.MessageEntity`): The entity to extract the text from. It must - be an entity that belongs to :attr:`explanation_entities`. - - Returns: - :obj:`str`: The text of the given entity. - - Raises: - RuntimeError: If the poll has no explanation. - - """ - if not self.explanation: - raise RuntimeError("This Poll has no 'explanation'.") - - return parse_message_entity(self.explanation, entity) - - def parse_explanation_entities( - self, types: Optional[list[str]] = None - ) -> dict[MessageEntity, str]: - """ - Returns a :obj:`dict` that maps :class:`telegram.MessageEntity` to :obj:`str`. - It contains entities from this polls explanation filtered by their ``type`` attribute as - the key, and the text that each entity belongs to as the value of the :obj:`dict`. - - Note: - This method should always be used instead of the :attr:`explanation_entities` - attribute, since it calculates the correct substring from the message text based on - UTF-16 codepoints. See :attr:`parse_explanation_entity` for more info. - - Args: - types (list[:obj:`str`], optional): List of ``MessageEntity`` types as strings. If the - ``type`` attribute of an entity is contained in this list, it will be returned. - Defaults to :attr:`telegram.MessageEntity.ALL_TYPES`. - - Returns: - dict[:class:`telegram.MessageEntity`, :obj:`str`]: A dictionary of entities mapped to - the text that belongs to them, calculated based on UTF-16 codepoints. - - Raises: - RuntimeError: If the poll has no explanation. - - """ - if not self.explanation: - raise RuntimeError("This Poll has no 'explanation'.") - - return parse_message_entities(self.explanation, self.explanation_entities, types) - - def parse_question_entity(self, entity: MessageEntity) -> str: - """Returns the text in :attr:`question` from a given :class:`telegram.MessageEntity` of - :attr:`question_entities`. - - .. versionadded:: 21.2 - - Note: - This method is present because Telegram calculates the offset and length in - UTF-16 codepoint pairs, which some versions of Python don't handle automatically. - (That is, you can't just slice ``Message.text`` with the offset and length.) - - Args: - entity (:class:`telegram.MessageEntity`): The entity to extract the text from. It must - be an entity that belongs to :attr:`question_entities`. - - Returns: - :obj:`str`: The text of the given entity. - """ - return parse_message_entity(self.question, entity) - - def parse_question_entities( - self, types: Optional[list[str]] = None - ) -> dict[MessageEntity, str]: - """ - Returns a :obj:`dict` that maps :class:`telegram.MessageEntity` to :obj:`str`. - It contains entities from this polls question filtered by their ``type`` attribute as - the key, and the text that each entity belongs to as the value of the :obj:`dict`. - - .. versionadded:: 21.2 - - Note: - This method should always be used instead of the :attr:`question_entities` - attribute, since it calculates the correct substring from the message text based on - UTF-16 codepoints. See :attr:`parse_question_entity` for more info. - - Args: - types (list[:obj:`str`], optional): List of ``MessageEntity`` types as strings. If the - ``type`` attribute of an entity is contained in this list, it will be returned. - Defaults to :attr:`telegram.MessageEntity.ALL_TYPES`. - - Returns: - dict[:class:`telegram.MessageEntity`, :obj:`str`]: A dictionary of entities mapped to - the text that belongs to them, calculated based on UTF-16 codepoints. - - """ - return parse_message_entities(self.question, self.question_entities, types) - - REGULAR: Final[str] = constants.PollType.REGULAR - """:const:`telegram.constants.PollType.REGULAR`""" - QUIZ: Final[str] = constants.PollType.QUIZ - """:const:`telegram.constants.PollType.QUIZ`""" - MAX_EXPLANATION_LENGTH: Final[int] = constants.PollLimit.MAX_EXPLANATION_LENGTH - """:const:`telegram.constants.PollLimit.MAX_EXPLANATION_LENGTH` - - .. versionadded:: 20.0 - """ - MAX_EXPLANATION_LINE_FEEDS: Final[int] = constants.PollLimit.MAX_EXPLANATION_LINE_FEEDS - """:const:`telegram.constants.PollLimit.MAX_EXPLANATION_LINE_FEEDS` - - .. versionadded:: 20.0 - """ - MIN_OPEN_PERIOD: Final[int] = constants.PollLimit.MIN_OPEN_PERIOD - """:const:`telegram.constants.PollLimit.MIN_OPEN_PERIOD` - - .. versionadded:: 20.0 - """ - MAX_OPEN_PERIOD: Final[int] = constants.PollLimit.MAX_OPEN_PERIOD - """:const:`telegram.constants.PollLimit.MAX_OPEN_PERIOD` - - .. versionadded:: 20.0 - """ - MIN_QUESTION_LENGTH: Final[int] = constants.PollLimit.MIN_QUESTION_LENGTH - """:const:`telegram.constants.PollLimit.MIN_QUESTION_LENGTH` - - .. versionadded:: 20.0 - """ - MAX_QUESTION_LENGTH: Final[int] = constants.PollLimit.MAX_QUESTION_LENGTH - """:const:`telegram.constants.PollLimit.MAX_QUESTION_LENGTH` - - .. versionadded:: 20.0 - """ - MIN_OPTION_LENGTH: Final[int] = constants.PollLimit.MIN_OPTION_LENGTH - """:const:`telegram.constants.PollLimit.MIN_OPTION_LENGTH` - - .. versionadded:: 20.0 - """ - MAX_OPTION_LENGTH: Final[int] = constants.PollLimit.MAX_OPTION_LENGTH - """:const:`telegram.constants.PollLimit.MAX_OPTION_LENGTH` - - .. versionadded:: 20.0 - """ - MIN_OPTION_NUMBER: Final[int] = constants.PollLimit.MIN_OPTION_NUMBER - """:const:`telegram.constants.PollLimit.MIN_OPTION_NUMBER` - - .. versionadded:: 20.0 - """ - MAX_OPTION_NUMBER: Final[int] = constants.PollLimit.MAX_OPTION_NUMBER - """:const:`telegram.constants.PollLimit.MAX_OPTION_NUMBER` - - .. versionadded:: 20.0 - """ diff --git a/venv/lib/python3.12/site-packages/telegram/_proximityalerttriggered.py b/venv/lib/python3.12/site-packages/telegram/_proximityalerttriggered.py deleted file mode 100644 index c9e00ef..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_proximityalerttriggered.py +++ /dev/null @@ -1,78 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram Proximity Alert.""" -from typing import TYPE_CHECKING, Optional - -from telegram._telegramobject import TelegramObject -from telegram._user import User -from telegram._utils.argumentparsing import de_json_optional -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot - - -class ProximityAlertTriggered(TelegramObject): - """ - This object represents the content of a service message, sent whenever a user in the chat - triggers a proximity alert set by another user. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`traveler`, :attr:`watcher` and :attr:`distance` are equal. - - Args: - traveler (:class:`telegram.User`): User that triggered the alert - watcher (:class:`telegram.User`): User that set the alert - distance (:obj:`int`): The distance between the users - - Attributes: - traveler (:class:`telegram.User`): User that triggered the alert - watcher (:class:`telegram.User`): User that set the alert - distance (:obj:`int`): The distance between the users - - """ - - __slots__ = ("distance", "traveler", "watcher") - - def __init__( - self, - traveler: User, - watcher: User, - distance: int, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.traveler: User = traveler - self.watcher: User = watcher - self.distance: int = distance - - self._id_attrs = (self.traveler, self.watcher, self.distance) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "ProximityAlertTriggered": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["traveler"] = de_json_optional(data.get("traveler"), User, bot) - data["watcher"] = de_json_optional(data.get("watcher"), User, bot) - - return super().de_json(data=data, bot=bot) diff --git a/venv/lib/python3.12/site-packages/telegram/_reaction.py b/venv/lib/python3.12/site-packages/telegram/_reaction.py deleted file mode 100644 index 6e1e3fb..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_reaction.py +++ /dev/null @@ -1,232 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains objects that represents a Telegram ReactionType.""" - -from typing import TYPE_CHECKING, Final, Literal, Optional, Union - -from telegram import constants -from telegram._telegramobject import TelegramObject -from telegram._utils import enum -from telegram._utils.argumentparsing import de_json_optional -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot - - -class ReactionType(TelegramObject): - """Base class for Telegram ReactionType Objects. - There exist :class:`telegram.ReactionTypeEmoji`, :class:`telegram.ReactionTypeCustomEmoji` - and :class:`telegram.ReactionTypePaid`. - - .. versionadded:: 20.8 - .. versionchanged:: 21.5 - - Added paid reaction. - - Args: - type (:obj:`str`): Type of the reaction. Can be - :attr:`~telegram.ReactionType.EMOJI`, :attr:`~telegram.ReactionType.CUSTOM_EMOJI` or - :attr:`~telegram.ReactionType.PAID`. - Attributes: - type (:obj:`str`): Type of the reaction. Can be - :attr:`~telegram.ReactionType.EMOJI`, :attr:`~telegram.ReactionType.CUSTOM_EMOJI` or - :attr:`~telegram.ReactionType.PAID`. - - """ - - __slots__ = ("type",) - - EMOJI: Final[constants.ReactionType] = constants.ReactionType.EMOJI - """:const:`telegram.constants.ReactionType.EMOJI`""" - CUSTOM_EMOJI: Final[constants.ReactionType] = constants.ReactionType.CUSTOM_EMOJI - """:const:`telegram.constants.ReactionType.CUSTOM_EMOJI`""" - PAID: Final[constants.ReactionType] = constants.ReactionType.PAID - """:const:`telegram.constants.ReactionType.PAID` - - .. versionadded:: 21.5 - """ - - def __init__( - self, - type: Union[ # pylint: disable=redefined-builtin - Literal["emoji", "custom_emoji", "paid"], constants.ReactionType - ], - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - # Required by all subclasses - self.type: str = enum.get_member(constants.ReactionType, type, type) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "ReactionType": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - _class_mapping: dict[str, type[ReactionType]] = { - cls.EMOJI: ReactionTypeEmoji, - cls.CUSTOM_EMOJI: ReactionTypeCustomEmoji, - cls.PAID: ReactionTypePaid, - } - - if cls is ReactionType and data.get("type") in _class_mapping: - return _class_mapping[data.pop("type")].de_json(data, bot) - - return super().de_json(data=data, bot=bot) - - -class ReactionTypeEmoji(ReactionType): - """ - Represents a reaction with a normal emoji. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if the :attr:`emoji` is equal. - - .. versionadded:: 20.8 - - Args: - emoji (:obj:`str`): Reaction emoji. It can be one of - :const:`telegram.constants.ReactionEmoji`. - - Attributes: - type (:obj:`str`): Type of the reaction, - always :tg-const:`telegram.ReactionType.EMOJI`. - emoji (:obj:`str`): Reaction emoji. It can be one of - :const:`telegram.constants.ReactionEmoji`. - """ - - __slots__ = ("emoji",) - - def __init__( - self, - emoji: str, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(type=ReactionType.EMOJI, api_kwargs=api_kwargs) - - with self._unfrozen(): - self.emoji: str = emoji - self._id_attrs = (self.emoji,) - - -class ReactionTypeCustomEmoji(ReactionType): - """ - Represents a reaction with a custom emoji. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if the :attr:`custom_emoji_id` is equal. - - .. versionadded:: 20.8 - - Args: - custom_emoji_id (:obj:`str`): Custom emoji identifier. - - Attributes: - type (:obj:`str`): Type of the reaction, - always :tg-const:`telegram.ReactionType.CUSTOM_EMOJI`. - custom_emoji_id (:obj:`str`): Custom emoji identifier. - - """ - - __slots__ = ("custom_emoji_id",) - - def __init__( - self, - custom_emoji_id: str, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(type=ReactionType.CUSTOM_EMOJI, api_kwargs=api_kwargs) - - with self._unfrozen(): - self.custom_emoji_id: str = custom_emoji_id - self._id_attrs = (self.custom_emoji_id,) - - -class ReactionTypePaid(ReactionType): - """ - The reaction is paid. - - .. versionadded:: 21.5 - - Attributes: - type (:obj:`str`): Type of the reaction, - always :tg-const:`telegram.ReactionType.PAID`. - """ - - __slots__ = () - - def __init__(self, *, api_kwargs: Optional[JSONDict] = None): - super().__init__(type=ReactionType.PAID, api_kwargs=api_kwargs) - self._freeze() - - -class ReactionCount(TelegramObject): - """This class represents a reaction added to a message along with the number of times it was - added. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if the :attr:`type` and :attr:`total_count` is equal. - - .. versionadded:: 20.8 - - Args: - type (:class:`telegram.ReactionType`): Type of the reaction. - total_count (:obj:`int`): Number of times the reaction was added. - - Attributes: - type (:class:`telegram.ReactionType`): Type of the reaction. - total_count (:obj:`int`): Number of times the reaction was added. - """ - - __slots__ = ( - "total_count", - "type", - ) - - def __init__( - self, - type: ReactionType, # pylint: disable=redefined-builtin - total_count: int, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - # Required - self.type: ReactionType = type - self.total_count: int = total_count - - self._id_attrs = ( - self.type, - self.total_count, - ) - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "ReactionCount": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["type"] = de_json_optional(data.get("type"), ReactionType, bot) - - return super().de_json(data=data, bot=bot) diff --git a/venv/lib/python3.12/site-packages/telegram/_reply.py b/venv/lib/python3.12/site-packages/telegram/_reply.py deleted file mode 100644 index ca6b23b..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_reply.py +++ /dev/null @@ -1,461 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This modules contains objects that represents Telegram Replies""" -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional, Union - -from telegram._chat import Chat -from telegram._dice import Dice -from telegram._files.animation import Animation -from telegram._files.audio import Audio -from telegram._files.contact import Contact -from telegram._files.document import Document -from telegram._files.location import Location -from telegram._files.photosize import PhotoSize -from telegram._files.sticker import Sticker -from telegram._files.venue import Venue -from telegram._files.video import Video -from telegram._files.videonote import VideoNote -from telegram._files.voice import Voice -from telegram._games.game import Game -from telegram._giveaway import Giveaway, GiveawayWinners -from telegram._linkpreviewoptions import LinkPreviewOptions -from telegram._messageentity import MessageEntity -from telegram._messageorigin import MessageOrigin -from telegram._paidmedia import PaidMediaInfo -from telegram._payment.invoice import Invoice -from telegram._poll import Poll -from telegram._story import Story -from telegram._telegramobject import TelegramObject -from telegram._utils.argumentparsing import de_json_optional, de_list_optional, parse_sequence_arg -from telegram._utils.defaultvalue import DEFAULT_NONE -from telegram._utils.types import JSONDict, ODVInput - -if TYPE_CHECKING: - from telegram import Bot - - -class ExternalReplyInfo(TelegramObject): - """ - This object contains information about a message that is being replied to, which may - come from another chat or forum topic. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`origin` is equal. - - .. versionadded:: 20.8 - - Args: - origin (:class:`telegram.MessageOrigin`): Origin of the message replied to by the given - message. - chat (:class:`telegram.Chat`, optional): Chat the original message belongs to. Available - only if the chat is a supergroup or a channel. - message_id (:obj:`int`, optional): Unique message identifier inside the original chat. - Available only if the original chat is a supergroup or a channel. - link_preview_options (:class:`telegram.LinkPreviewOptions`, optional): Options used for - link preview generation for the original message, if it is a text message - animation (:class:`telegram.Animation`, optional): Message is an animation, information - about the animation. - audio (:class:`telegram.Audio`, optional): Message is an audio file, information about the - file. - document (:class:`telegram.Document`, optional): Message is a general file, information - about the file. - photo (Sequence[:class:`telegram.PhotoSize`], optional): Message is a photo, available - sizes of the photo. - sticker (:class:`telegram.Sticker`, optional): Message is a sticker, information about the - sticker. - story (:class:`telegram.Story`, optional): Message is a forwarded story. - video (:class:`telegram.Video`, optional): Message is a video, information about the video. - video_note (:class:`telegram.VideoNote`, optional): Message is a `video note - <https://telegram.org/blog/video-messages-and-telescope>`_, information about the video - message. - voice (:class:`telegram.Voice`, optional): Message is a voice message, information about - the file. - has_media_spoiler (:obj:`bool`, optional): :obj:`True`, if the message media is covered by - a spoiler animation. - contact (:class:`telegram.Contact`, optional): Message is a shared contact, information - about the contact. - dice (:class:`telegram.Dice`, optional): Message is a dice with random value. - game (:Class:`telegram.Game`. optional): Message is a game, information about the game. - :ref:`More about games >> <games-tree>`. - giveaway (:class:`telegram.Giveaway`, optional): Message is a scheduled giveaway, - information about the giveaway. - giveaway_winners (:class:`telegram.GiveawayWinners`, optional): A giveaway with public - winners was completed. - invoice (:class:`telegram.Invoice`, optional): Message is an invoice for a payment, - information about the invoice. :ref:`More about payments >> <payments-tree>`. - location (:class:`telegram.Location`, optional): Message is a shared location, information - about the location. - poll (:class:`telegram.Poll`, optional): Message is a native poll, information about the - poll. - venue (:class:`telegram.Venue`, optional): Message is a venue, information about the venue. - paid_media (:class:`telegram.PaidMedia`, optional): Message contains paid media; - information about the paid media. - - .. versionadded:: 21.4 - - Attributes: - origin (:class:`telegram.MessageOrigin`): Origin of the message replied to by the given - message. - chat (:class:`telegram.Chat`): Optional. Chat the original message belongs to. Available - only if the chat is a supergroup or a channel. - message_id (:obj:`int`): Optional. Unique message identifier inside the original chat. - Available only if the original chat is a supergroup or a channel. - link_preview_options (:class:`telegram.LinkPreviewOptions`): Optional. Options used for - link preview generation for the original message, if it is a text message. - animation (:class:`telegram.Animation`): Optional. Message is an animation, information - about the animation. - audio (:class:`telegram.Audio`): Optional. Message is an audio file, information about the - file. - document (:class:`telegram.Document`): Optional. Message is a general file, information - about the file. - photo (tuple[:class:`telegram.PhotoSize`]): Optional. Message is a photo, available sizes - of the photo. - sticker (:class:`telegram.Sticker`): Optional. Message is a sticker, information about the - sticker. - story (:class:`telegram.Story`): Optional. Message is a forwarded story. - video (:class:`telegram.Video`): Optional. Message is a video, information about the video. - video_note (:class:`telegram.VideoNote`): Optional. Message is a `video note - <https://telegram.org/blog/video-messages-and-telescope>`_, information about the video - message. - voice (:class:`telegram.Voice`): Optional. Message is a voice message, information about - the file. - has_media_spoiler (:obj:`bool`): Optional. :obj:`True`, if the message media is covered by - a spoiler animation. - contact (:class:`telegram.Contact`): Optional. Message is a shared contact, information - about the contact. - dice (:class:`telegram.Dice`): Optional. Message is a dice with random value. - game (:Class:`telegram.Game`): Optional. Message is a game, information about the game. - :ref:`More about games >> <games-tree>`. - giveaway (:class:`telegram.Giveaway`): Optional. Message is a scheduled giveaway, - information about the giveaway. - giveaway_winners (:class:`telegram.GiveawayWinners`): Optional. A giveaway with public - winners was completed. - invoice (:class:`telegram.Invoice`): Optional. Message is an invoice for a payment, - information about the invoice. :ref:`More about payments >> <payments-tree>`. - location (:class:`telegram.Location`): Optional. Message is a shared location, information - about the location. - poll (:class:`telegram.Poll`): Optional. Message is a native poll, information about the - poll. - venue (:class:`telegram.Venue`): Optional. Message is a venue, information about the venue. - paid_media (:class:`telegram.PaidMedia`): Optional. Message contains paid media; - information about the paid media. - - .. versionadded:: 21.4 - """ - - __slots__ = ( - "animation", - "audio", - "chat", - "contact", - "dice", - "document", - "game", - "giveaway", - "giveaway_winners", - "has_media_spoiler", - "invoice", - "link_preview_options", - "location", - "message_id", - "origin", - "paid_media", - "photo", - "poll", - "sticker", - "story", - "venue", - "video", - "video_note", - "voice", - ) - - def __init__( - self, - origin: MessageOrigin, - chat: Optional[Chat] = None, - message_id: Optional[int] = None, - link_preview_options: Optional[LinkPreviewOptions] = None, - animation: Optional[Animation] = None, - audio: Optional[Audio] = None, - document: Optional[Document] = None, - photo: Optional[Sequence[PhotoSize]] = None, - sticker: Optional[Sticker] = None, - story: Optional[Story] = None, - video: Optional[Video] = None, - video_note: Optional[VideoNote] = None, - voice: Optional[Voice] = None, - has_media_spoiler: Optional[bool] = None, - contact: Optional[Contact] = None, - dice: Optional[Dice] = None, - game: Optional[Game] = None, - giveaway: Optional[Giveaway] = None, - giveaway_winners: Optional[GiveawayWinners] = None, - invoice: Optional[Invoice] = None, - location: Optional[Location] = None, - poll: Optional[Poll] = None, - venue: Optional[Venue] = None, - paid_media: Optional[PaidMediaInfo] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - - self.origin: MessageOrigin = origin - self.chat: Optional[Chat] = chat - self.message_id: Optional[int] = message_id - self.link_preview_options: Optional[LinkPreviewOptions] = link_preview_options - self.animation: Optional[Animation] = animation - self.audio: Optional[Audio] = audio - self.document: Optional[Document] = document - self.photo: Optional[tuple[PhotoSize, ...]] = parse_sequence_arg(photo) - self.sticker: Optional[Sticker] = sticker - self.story: Optional[Story] = story - self.video: Optional[Video] = video - self.video_note: Optional[VideoNote] = video_note - self.voice: Optional[Voice] = voice - self.has_media_spoiler: Optional[bool] = has_media_spoiler - self.contact: Optional[Contact] = contact - self.dice: Optional[Dice] = dice - self.game: Optional[Game] = game - self.giveaway: Optional[Giveaway] = giveaway - self.giveaway_winners: Optional[GiveawayWinners] = giveaway_winners - self.invoice: Optional[Invoice] = invoice - self.location: Optional[Location] = location - self.poll: Optional[Poll] = poll - self.venue: Optional[Venue] = venue - self.paid_media: Optional[PaidMediaInfo] = paid_media - - self._id_attrs = (self.origin,) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "ExternalReplyInfo": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["origin"] = de_json_optional(data.get("origin"), MessageOrigin, bot) - data["chat"] = de_json_optional(data.get("chat"), Chat, bot) - data["link_preview_options"] = de_json_optional( - data.get("link_preview_options"), LinkPreviewOptions, bot - ) - data["animation"] = de_json_optional(data.get("animation"), Animation, bot) - data["audio"] = de_json_optional(data.get("audio"), Audio, bot) - data["document"] = de_json_optional(data.get("document"), Document, bot) - data["photo"] = de_list_optional(data.get("photo"), PhotoSize, bot) - data["sticker"] = de_json_optional(data.get("sticker"), Sticker, bot) - data["story"] = de_json_optional(data.get("story"), Story, bot) - data["video"] = de_json_optional(data.get("video"), Video, bot) - data["video_note"] = de_json_optional(data.get("video_note"), VideoNote, bot) - data["voice"] = de_json_optional(data.get("voice"), Voice, bot) - data["contact"] = de_json_optional(data.get("contact"), Contact, bot) - data["dice"] = de_json_optional(data.get("dice"), Dice, bot) - data["game"] = de_json_optional(data.get("game"), Game, bot) - data["giveaway"] = de_json_optional(data.get("giveaway"), Giveaway, bot) - data["giveaway_winners"] = de_json_optional( - data.get("giveaway_winners"), GiveawayWinners, bot - ) - data["invoice"] = de_json_optional(data.get("invoice"), Invoice, bot) - data["location"] = de_json_optional(data.get("location"), Location, bot) - data["poll"] = de_json_optional(data.get("poll"), Poll, bot) - data["venue"] = de_json_optional(data.get("venue"), Venue, bot) - data["paid_media"] = de_json_optional(data.get("paid_media"), PaidMediaInfo, bot) - - return super().de_json(data=data, bot=bot) - - -class TextQuote(TelegramObject): - """ - This object contains information about the quoted part of a message that is replied to - by the given message. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`text` and :attr:`position` are equal. - - .. versionadded:: 20.8 - - Args: - text (:obj:`str`): Text of the quoted part of a message that is replied to by the given - message. - position (:obj:`int`): Approximate quote position in the original message in UTF-16 code - units as specified by the sender. - entities (Sequence[:class:`telegram.MessageEntity`], optional): Special entities that - appear - in the quote. Currently, only bold, italic, underline, strikethrough, spoiler, and - custom_emoji entities are kept in quotes. - is_manual (:obj:`bool`, optional): :obj:`True`, if the quote was chosen manually by the - message sender. Otherwise, the quote was added automatically by the server. - - Attributes: - text (:obj:`str`): Text of the quoted part of a message that is replied to by the given - message. - position (:obj:`int`): Approximate quote position in the original message in UTF-16 code - units as specified by the sender. - entities (tuple[:class:`telegram.MessageEntity`]): Optional. Special entities that appear - in the quote. Currently, only bold, italic, underline, strikethrough, spoiler, and - custom_emoji entities are kept in quotes. - is_manual (:obj:`bool`): Optional. :obj:`True`, if the quote was chosen manually by the - message sender. Otherwise, the quote was added automatically by the server. - """ - - __slots__ = ( - "entities", - "is_manual", - "position", - "text", - ) - - def __init__( - self, - text: str, - position: int, - entities: Optional[Sequence[MessageEntity]] = None, - is_manual: Optional[bool] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - - self.text: str = text - self.position: int = position - self.entities: Optional[tuple[MessageEntity, ...]] = parse_sequence_arg(entities) - self.is_manual: Optional[bool] = is_manual - - self._id_attrs = ( - self.text, - self.position, - ) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "TextQuote": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["entities"] = de_list_optional(data.get("entities"), MessageEntity, bot) - - return super().de_json(data=data, bot=bot) - - -class ReplyParameters(TelegramObject): - """ - Describes reply parameters for the message that is being sent. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`message_id` is equal. - - .. versionadded:: 20.8 - - Args: - message_id (:obj:`int`): Identifier of the message that will be replied to in the current - chat, or in the chat :paramref:`chat_id` if it is specified. - chat_id (:obj:`int` | :obj:`str`, optional): If the message to be replied to is from a - different chat, |chat_id_channel| - Not supported for messages sent on behalf of a business account. - allow_sending_without_reply (:obj:`bool`, optional): |allow_sending_without_reply| Can be - used only for replies in the same chat and forum topic. - quote (:obj:`str`, optional): Quoted part of the message to be replied to; 0-1024 - characters after entities parsing. The quote must be an exact substring of the message - to be replied to, including bold, italic, underline, strikethrough, spoiler, and - custom_emoji entities. The message will fail to send if the quote isn't found in the - original message. - quote_parse_mode (:obj:`str`, optional): Mode for parsing entities in the quote. See - :wiki:`formatting options <Code-snippets#message-formatting-bold-italic-code->` for - more details. - quote_entities (Sequence[:class:`telegram.MessageEntity`], optional): A JSON-serialized - list - of special entities that appear in the quote. It can be specified instead of - :paramref:`quote_parse_mode`. - quote_position (:obj:`int`, optional): Position of the quote in the original message in - UTF-16 code units. - - Attributes: - message_id (:obj:`int`): Identifier of the message that will be replied to in the current - chat, or in the chat :paramref:`chat_id` if it is specified. - chat_id (:obj:`int` | :obj:`str`): Optional. If the message to be replied to is from a - different chat, |chat_id_channel| - Not supported for messages sent on behalf of a business account. - allow_sending_without_reply (:obj:`bool`): Optional. |allow_sending_without_reply| Can be - used only for replies in the same chat and forum topic. - quote (:obj:`str`): Optional. Quoted part of the message to be replied to; 0-1024 - characters after entities parsing. The quote must be an exact substring of the message - to be replied to, including bold, italic, underline, strikethrough, spoiler, and - custom_emoji entities. The message will fail to send if the quote isn't found in the - original message. - quote_parse_mode (:obj:`str`): Optional. Mode for parsing entities in the quote. See - :wiki:`formatting options <Code-snippets#message-formatting-bold-italic-code->` for - more details. - quote_entities (tuple[:class:`telegram.MessageEntity`]): Optional. A JSON-serialized list - of special entities that appear in the quote. It can be specified instead of - :paramref:`quote_parse_mode`. - quote_position (:obj:`int`): Optional. Position of the quote in the original message in - UTF-16 code units. - """ - - __slots__ = ( - "allow_sending_without_reply", - "chat_id", - "message_id", - "quote", - "quote_entities", - "quote_parse_mode", - "quote_position", - ) - - def __init__( - self, - message_id: int, - chat_id: Optional[Union[int, str]] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - quote: Optional[str] = None, - quote_parse_mode: ODVInput[str] = DEFAULT_NONE, - quote_entities: Optional[Sequence[MessageEntity]] = None, - quote_position: Optional[int] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - - self.message_id: int = message_id - self.chat_id: Optional[Union[int, str]] = chat_id - self.allow_sending_without_reply: ODVInput[bool] = allow_sending_without_reply - self.quote: Optional[str] = quote - self.quote_parse_mode: ODVInput[str] = quote_parse_mode - self.quote_entities: Optional[tuple[MessageEntity, ...]] = parse_sequence_arg( - quote_entities - ) - self.quote_position: Optional[int] = quote_position - - self._id_attrs = (self.message_id,) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "ReplyParameters": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["quote_entities"] = tuple( - de_list_optional(data.get("quote_entities"), MessageEntity, bot) - ) - - return super().de_json(data=data, bot=bot) diff --git a/venv/lib/python3.12/site-packages/telegram/_replykeyboardmarkup.py b/venv/lib/python3.12/site-packages/telegram/_replykeyboardmarkup.py deleted file mode 100644 index 3928f82..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_replykeyboardmarkup.py +++ /dev/null @@ -1,360 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram ReplyKeyboardMarkup.""" - -from collections.abc import Sequence -from typing import Final, Optional, Union - -from telegram import constants -from telegram._keyboardbutton import KeyboardButton -from telegram._telegramobject import TelegramObject -from telegram._utils.markup import check_keyboard_type -from telegram._utils.types import JSONDict - - -class ReplyKeyboardMarkup(TelegramObject): - """This object represents a custom keyboard with reply options. Not supported in channels and - for messages sent on behalf of a Telegram Business account. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their size of :attr:`keyboard` and all the buttons are equal. - - .. figure:: https://core.telegram.org/file/464001950/1191a/2RwpmgU-swU.123554/b5\ - 0478c124d5914c23 - :align: center - - A reply keyboard with reply options. - - .. seealso:: - Another kind of keyboard would be the :class:`telegram.InlineKeyboardMarkup`. - - Examples: - * Example usage: A user requests to change the bot's language, bot replies to the request - with a keyboard to select the new language. Other users in the group don't see - the keyboard. - * :any:`Conversation Bot <examples.conversationbot>` - * :any:`Conversation Bot 2 <examples.conversationbot2>` - - Args: - keyboard (Sequence[Sequence[:obj:`str` | :class:`telegram.KeyboardButton`]]): Array of - button rows, each represented by an Array of :class:`telegram.KeyboardButton` objects. - resize_keyboard (:obj:`bool`, optional): Requests clients to resize the keyboard vertically - for optimal fit (e.g., make the keyboard smaller if there are just two rows of - buttons). Defaults to :obj:`False`, in which case the custom keyboard is always of the - same height as the app's standard keyboard. - one_time_keyboard (:obj:`bool`, optional): Requests clients to hide the keyboard as soon as - it's been used. The keyboard will still be available, but clients will automatically - display the usual letter-keyboard in the chat - the user can press a special button in - the input field to see the custom keyboard again. Defaults to :obj:`False`. - selective (:obj:`bool`, optional): Use this parameter if you want to show the keyboard to - specific users only. Targets: - - 1) Users that are @mentioned in the :attr:`~telegram.Message.text` of the - :class:`telegram.Message` object. - 2) If the bot's message is a reply to a message in the same chat and forum topic, - sender of the original message. - - Defaults to :obj:`False`. - - input_field_placeholder (:obj:`str`, optional): The placeholder to be shown in the input - field when the keyboard is active; - :tg-const:`telegram.ReplyKeyboardMarkup.MIN_INPUT_FIELD_PLACEHOLDER`- - :tg-const:`telegram.ReplyKeyboardMarkup.MAX_INPUT_FIELD_PLACEHOLDER` - characters. - - .. versionadded:: 13.7 - is_persistent (:obj:`bool`, optional): Requests clients to always show the keyboard when - the regular keyboard is hidden. Defaults to :obj:`False`, in which case the custom - keyboard can be hidden and opened with a keyboard icon. - - .. versionadded:: 20.0 - - Attributes: - keyboard (tuple[tuple[:class:`telegram.KeyboardButton`]]): Array of button rows, - each represented by an Array of :class:`telegram.KeyboardButton` objects. - resize_keyboard (:obj:`bool`): Optional. Requests clients to resize the keyboard vertically - for optimal fit (e.g., make the keyboard smaller if there are just two rows of - buttons). Defaults to :obj:`False`, in which case the custom keyboard is always of the - same height as the app's standard keyboard. - one_time_keyboard (:obj:`bool`): Optional. Requests clients to hide the keyboard as soon as - it's been used. The keyboard will still be available, but clients will automatically - display the usual letter-keyboard in the chat - the user can press a special button in - the input field to see the custom keyboard again. Defaults to :obj:`False`. - selective (:obj:`bool`): Optional. Show the keyboard to specific users only. - Targets: - - 1) Users that are @mentioned in the :attr:`~telegram.Message.text` of the - :class:`telegram.Message` object. - 2) If the bot's message is a reply to a message in the same chat and forum topic, - sender of the original message. - - Defaults to :obj:`False`. - - input_field_placeholder (:obj:`str`): Optional. The placeholder to be shown in the input - field when the keyboard is active; - :tg-const:`telegram.ReplyKeyboardMarkup.MIN_INPUT_FIELD_PLACEHOLDER`- - :tg-const:`telegram.ReplyKeyboardMarkup.MAX_INPUT_FIELD_PLACEHOLDER` - characters. - - .. versionadded:: 13.7 - is_persistent (:obj:`bool`): Optional. Requests clients to always show the keyboard when - the regular keyboard is hidden. If :obj:`False`, the custom keyboard can be hidden and - opened with a keyboard icon. - - .. versionadded:: 20.0 - - """ - - __slots__ = ( - "input_field_placeholder", - "is_persistent", - "keyboard", - "one_time_keyboard", - "resize_keyboard", - "selective", - ) - - def __init__( - self, - keyboard: Sequence[Sequence[Union[str, KeyboardButton]]], - resize_keyboard: Optional[bool] = None, - one_time_keyboard: Optional[bool] = None, - selective: Optional[bool] = None, - input_field_placeholder: Optional[str] = None, - is_persistent: Optional[bool] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - if not check_keyboard_type(keyboard): - raise ValueError( - "The parameter `keyboard` should be a sequence of sequences of " - "strings or KeyboardButtons" - ) - - # Required - self.keyboard: tuple[tuple[KeyboardButton, ...], ...] = tuple( - tuple(KeyboardButton(button) if isinstance(button, str) else button for button in row) - for row in keyboard - ) - - # Optionals - self.resize_keyboard: Optional[bool] = resize_keyboard - self.one_time_keyboard: Optional[bool] = one_time_keyboard - self.selective: Optional[bool] = selective - self.input_field_placeholder: Optional[str] = input_field_placeholder - self.is_persistent: Optional[bool] = is_persistent - - self._id_attrs = (self.keyboard,) - - self._freeze() - - @classmethod - def from_button( - cls, - button: Union[KeyboardButton, str], - resize_keyboard: bool = False, - one_time_keyboard: bool = False, - selective: bool = False, - input_field_placeholder: Optional[str] = None, - is_persistent: Optional[bool] = None, - **kwargs: object, - ) -> "ReplyKeyboardMarkup": - """Shortcut for:: - - ReplyKeyboardMarkup([[button]], **kwargs) - - Return a ReplyKeyboardMarkup from a single KeyboardButton. - - Args: - button (:class:`telegram.KeyboardButton` | :obj:`str`): The button to use in - the markup. - resize_keyboard (:obj:`bool`, optional): Requests clients to resize the keyboard - vertically for optimal fit (e.g., make the keyboard smaller if there are just two - rows of buttons). Defaults to :obj:`False`, in which case the custom keyboard is - always of the same height as the app's standard keyboard. - one_time_keyboard (:obj:`bool`, optional): Requests clients to hide the keyboard as - soon as it's been used. The keyboard will still be available, but clients will - automatically display the usual letter-keyboard in the chat - the user can press - a special button in the input field to see the custom keyboard again. - Defaults to :obj:`False`. - selective (:obj:`bool`, optional): Use this parameter if you want to show the keyboard - to specific users only. Targets: - - 1) Users that are @mentioned in the text of the Message object. - 2) If the bot's message is a reply to a message in the same chat and forum topic, - sender of the original message. - - Defaults to :obj:`False`. - - input_field_placeholder (:obj:`str`): Optional. The placeholder shown in the input - field when the reply is active. - - .. versionadded:: 13.7 - is_persistent (:obj:`bool`): Optional. Requests clients to always show the keyboard - when the regular keyboard is hidden. Defaults to :obj:`False`, in which case the - custom keyboard can be hidden and opened with a keyboard icon. - - .. versionadded:: 20.0 - """ - return cls( - [[button]], - resize_keyboard=resize_keyboard, - one_time_keyboard=one_time_keyboard, - selective=selective, - input_field_placeholder=input_field_placeholder, - is_persistent=is_persistent, - **kwargs, # type: ignore[arg-type] - ) - - @classmethod - def from_row( - cls, - button_row: Sequence[Union[str, KeyboardButton]], - resize_keyboard: bool = False, - one_time_keyboard: bool = False, - selective: bool = False, - input_field_placeholder: Optional[str] = None, - is_persistent: Optional[bool] = None, - **kwargs: object, - ) -> "ReplyKeyboardMarkup": - """Shortcut for:: - - ReplyKeyboardMarkup([button_row], **kwargs) - - Return a ReplyKeyboardMarkup from a single row of KeyboardButtons. - - Args: - button_row (Sequence[:class:`telegram.KeyboardButton` | :obj:`str`]): The button to - use in the markup. - - .. versionchanged:: 20.0 - |sequenceargs| - resize_keyboard (:obj:`bool`, optional): Requests clients to resize the keyboard - vertically for optimal fit (e.g., make the keyboard smaller if there are just two - rows of buttons). Defaults to :obj:`False`, in which case the custom keyboard is - always of the same height as the app's standard keyboard. - one_time_keyboard (:obj:`bool`, optional): Requests clients to hide the keyboard as - soon as it's been used. The keyboard will still be available, but clients will - automatically display the usual letter-keyboard in the chat - the user can press - a special button in the input field to see the custom keyboard again. - Defaults to :obj:`False`. - selective (:obj:`bool`, optional): Use this parameter if you want to show the keyboard - to specific users only. Targets: - - 1) Users that are @mentioned in the text of the Message object. - 2) If the bot's message is a reply to a message in the same chat and forum topic, - sender of the original message. - - Defaults to :obj:`False`. - - input_field_placeholder (:obj:`str`): Optional. The placeholder shown in the input - field when the reply is active. - - .. versionadded:: 13.7 - is_persistent (:obj:`bool`): Optional. Requests clients to always show the keyboard - when the regular keyboard is hidden. Defaults to :obj:`False`, in which case the - custom keyboard can be hidden and opened with a keyboard icon. - - .. versionadded:: 20.0 - - """ - return cls( - [button_row], - resize_keyboard=resize_keyboard, - one_time_keyboard=one_time_keyboard, - selective=selective, - input_field_placeholder=input_field_placeholder, - is_persistent=is_persistent, - **kwargs, # type: ignore[arg-type] - ) - - @classmethod - def from_column( - cls, - button_column: Sequence[Union[str, KeyboardButton]], - resize_keyboard: bool = False, - one_time_keyboard: bool = False, - selective: bool = False, - input_field_placeholder: Optional[str] = None, - is_persistent: Optional[bool] = None, - **kwargs: object, - ) -> "ReplyKeyboardMarkup": - """Shortcut for:: - - ReplyKeyboardMarkup([[button] for button in button_column], **kwargs) - - Return a ReplyKeyboardMarkup from a single column of KeyboardButtons. - - Args: - button_column (Sequence[:class:`telegram.KeyboardButton` | :obj:`str`]): The button - to use in the markup. - - .. versionchanged:: 20.0 - |sequenceargs| - resize_keyboard (:obj:`bool`, optional): Requests clients to resize the keyboard - vertically for optimal fit (e.g., make the keyboard smaller if there are just two - rows of buttons). Defaults to :obj:`False`, in which case the custom keyboard is - always of the same height as the app's standard keyboard. - one_time_keyboard (:obj:`bool`, optional): Requests clients to hide the keyboard as - soon as it's been used. The keyboard will still be available, but clients will - automatically display the usual letter-keyboard in the chat - the user can press - a special button in the input field to see the custom keyboard again. - Defaults to :obj:`False`. - selective (:obj:`bool`, optional): Use this parameter if you want to show the keyboard - to specific users only. Targets: - - 1) Users that are @mentioned in the text of the Message object. - 2) If the bot's message is a reply to a message in the same chat and forum topic, - sender of the original message. - - Defaults to :obj:`False`. - - input_field_placeholder (:obj:`str`): Optional. The placeholder shown in the input - field when the reply is active. - - .. versionadded:: 13.7 - is_persistent (:obj:`bool`): Optional. Requests clients to always show the keyboard - when the regular keyboard is hidden. Defaults to :obj:`False`, in which case the - custom keyboard can be hidden and opened with a keyboard icon. - - .. versionadded:: 20.0 - - """ - button_grid = [[button] for button in button_column] - return cls( - button_grid, - resize_keyboard=resize_keyboard, - one_time_keyboard=one_time_keyboard, - selective=selective, - input_field_placeholder=input_field_placeholder, - is_persistent=is_persistent, - **kwargs, # type: ignore[arg-type] - ) - - MIN_INPUT_FIELD_PLACEHOLDER: Final[int] = constants.ReplyLimit.MIN_INPUT_FIELD_PLACEHOLDER - """:const:`telegram.constants.ReplyLimit.MIN_INPUT_FIELD_PLACEHOLDER` - - .. versionadded:: 20.0 - """ - MAX_INPUT_FIELD_PLACEHOLDER: Final[int] = constants.ReplyLimit.MAX_INPUT_FIELD_PLACEHOLDER - """:const:`telegram.constants.ReplyLimit.MAX_INPUT_FIELD_PLACEHOLDER` - - .. versionadded:: 20.0 - """ diff --git a/venv/lib/python3.12/site-packages/telegram/_replykeyboardremove.py b/venv/lib/python3.12/site-packages/telegram/_replykeyboardremove.py deleted file mode 100644 index 808bee2..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_replykeyboardremove.py +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram ReplyKeyboardRemove.""" -from typing import Optional - -from telegram._telegramobject import TelegramObject -from telegram._utils.types import JSONDict - - -class ReplyKeyboardRemove(TelegramObject): - """ - Upon receiving a message with this object, Telegram clients will remove the current custom - keyboard and display the default letter-keyboard. By default, custom keyboards are displayed - until a new keyboard is sent by a bot. An exception is made for one-time keyboards that are - hidden immediately after the user presses a button (see :class:`telegram.ReplyKeyboardMarkup`). - Not supported in channels and for messages sent on behalf of a Telegram Business account. - - Note: - User will not be able to summon this keyboard; if you want to hide the keyboard from - sight but keep it accessible, use :attr:`telegram.ReplyKeyboardMarkup.one_time_keyboard`. - - Examples: - * Example usage: A user votes in a poll, bot returns confirmation message in reply to - the vote and removes the keyboard for that user, while still showing the keyboard with - poll options to users who haven't voted yet. - * :any:`Conversation Bot <examples.conversationbot>` - * :any:`Conversation Bot 2 <examples.conversationbot2>` - - Args: - selective (:obj:`bool`, optional): Use this parameter if you want to remove the keyboard - for specific users only. Targets: - - 1) Users that are @mentioned in the text of the :class:`telegram.Message` object. - 2) If the bot's message is a reply to a message in the same chat and forum topic, - sender of the original message. - - Attributes: - remove_keyboard (:obj:`True`): Requests clients to remove the custom keyboard. - selective (:obj:`bool`): Optional. Remove the keyboard for specific users only. - Targets: - - 1) Users that are @mentioned in the text of the :class:`telegram.Message` object. - 2) If the bot's message is a reply to a message in the same chat and forum topic, - sender of the original message. - - """ - - __slots__ = ("remove_keyboard", "selective") - - def __init__(self, selective: Optional[bool] = None, *, api_kwargs: Optional[JSONDict] = None): - super().__init__(api_kwargs=api_kwargs) - # Required - self.remove_keyboard: bool = True - # Optionals - self.selective: Optional[bool] = selective - - self._freeze() diff --git a/venv/lib/python3.12/site-packages/telegram/_sentwebappmessage.py b/venv/lib/python3.12/site-packages/telegram/_sentwebappmessage.py deleted file mode 100644 index 492f440..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_sentwebappmessage.py +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram Sent Web App Message.""" -from typing import Optional - -from telegram._telegramobject import TelegramObject -from telegram._utils.types import JSONDict - - -class SentWebAppMessage(TelegramObject): - """Contains information about an inline message sent by a Web App on behalf of a user. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`inline_message_id` are equal. - - .. versionadded:: 20.0 - - Args: - inline_message_id (:obj:`str`, optional): Identifier of the sent inline message. Available - only if there is an :attr:`inline keyboard <telegram.InlineKeyboardMarkup>` attached to - the message. - - Attributes: - inline_message_id (:obj:`str`): Optional. Identifier of the sent inline message. Available - only if there is an :attr:`inline keyboard <telegram.InlineKeyboardMarkup>` attached to - the message. - """ - - __slots__ = ("inline_message_id",) - - def __init__( - self, inline_message_id: Optional[str] = None, *, api_kwargs: Optional[JSONDict] = None - ): - super().__init__(api_kwargs=api_kwargs) - # Optionals - self.inline_message_id: Optional[str] = inline_message_id - - self._id_attrs = (self.inline_message_id,) - - self._freeze() diff --git a/venv/lib/python3.12/site-packages/telegram/_shared.py b/venv/lib/python3.12/site-packages/telegram/_shared.py deleted file mode 100644 index 9c0d368..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_shared.py +++ /dev/null @@ -1,253 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains two objects used for request chats/users service messages.""" -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional - -from telegram._files.photosize import PhotoSize -from telegram._telegramobject import TelegramObject -from telegram._utils.argumentparsing import de_list_optional, parse_sequence_arg -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram._bot import Bot - - -class UsersShared(TelegramObject): - """ - This object contains information about the user whose identifier was shared with the bot - using a :class:`telegram.KeyboardButtonRequestUsers` button. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`request_id` and :attr:`users` are equal. - - .. versionadded:: 20.8 - Bot API 7.0 replaces ``UserShared`` with this class. The only difference is that now - the ``user_ids`` is a sequence instead of a single integer. - - .. versionchanged:: 21.1 - The argument :attr:`users` is now considered for the equality comparison instead of - ``user_ids``. - - .. versionremoved:: 21.2 - Removed the deprecated argument and attribute ``user_ids``. - - Args: - request_id (:obj:`int`): Identifier of the request. - users (Sequence[:class:`telegram.SharedUser`]): Information about users shared with the - bot. - - .. versionadded:: 21.1 - - .. versionchanged:: 21.2 - This argument is now required. - - Attributes: - request_id (:obj:`int`): Identifier of the request. - users (tuple[:class:`telegram.SharedUser`]): Information about users shared with the - bot. - - .. versionadded:: 21.1 - """ - - __slots__ = ("request_id", "users") - - def __init__( - self, - request_id: int, - users: Sequence["SharedUser"], - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.request_id: int = request_id - self.users: tuple[SharedUser, ...] = parse_sequence_arg(users) - - self._id_attrs = (self.request_id, self.users) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "UsersShared": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["users"] = de_list_optional(data.get("users"), SharedUser, bot) - - api_kwargs = {} - # This is a deprecated field that TG still returns for backwards compatibility - # Let's filter it out to speed up the de-json process - if user_ids := data.get("user_ids"): - api_kwargs = {"user_ids": user_ids} - - return super()._de_json(data=data, bot=bot, api_kwargs=api_kwargs) - - -class ChatShared(TelegramObject): - """ - This object contains information about the chat whose identifier was shared with the bot - using a :class:`telegram.KeyboardButtonRequestChat` button. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`request_id` and :attr:`chat_id` are equal. - - .. versionadded:: 20.1 - - Args: - request_id (:obj:`int`): Identifier of the request. - chat_id (:obj:`int`): Identifier of the shared user. This number may be greater than 32 - bits and some programming languages may have difficulty/silent defects in interpreting - it. But it is smaller than 52 bits, so a signed 64-bit integer or double-precision - float type are safe for storing this identifier. - title (:obj:`str`, optional): Title of the chat, if the title was requested by the bot. - - .. versionadded:: 21.1 - username (:obj:`str`, optional): Username of the chat, if the username was requested by - the bot and available. - - .. versionadded:: 21.1 - photo (Sequence[:class:`telegram.PhotoSize`], optional): Available sizes of the chat photo, - if the photo was requested by the bot - - .. versionadded:: 21.1 - - Attributes: - request_id (:obj:`int`): Identifier of the request. - chat_id (:obj:`int`): Identifier of the shared user. This number may be greater than 32 - bits and some programming languages may have difficulty/silent defects in interpreting - it. But it is smaller than 52 bits, so a signed 64-bit integer or double-precision - float type are safe for storing this identifier. - title (:obj:`str`): Optional. Title of the chat, if the title was requested by the bot. - - .. versionadded:: 21.1 - username (:obj:`str`): Optional. Username of the chat, if the username was requested by - the bot and available. - - .. versionadded:: 21.1 - photo (tuple[:class:`telegram.PhotoSize`]): Optional. Available sizes of the chat photo, - if the photo was requested by the bot - - .. versionadded:: 21.1 - """ - - __slots__ = ("chat_id", "photo", "request_id", "title", "username") - - def __init__( - self, - request_id: int, - chat_id: int, - title: Optional[str] = None, - username: Optional[str] = None, - photo: Optional[Sequence[PhotoSize]] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.request_id: int = request_id - self.chat_id: int = chat_id - self.title: Optional[str] = title - self.username: Optional[str] = username - self.photo: Optional[tuple[PhotoSize, ...]] = parse_sequence_arg(photo) - - self._id_attrs = (self.request_id, self.chat_id) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "ChatShared": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["photo"] = de_list_optional(data.get("photo"), PhotoSize, bot) - return super().de_json(data=data, bot=bot) - - -class SharedUser(TelegramObject): - """ - This object contains information about a user that was shared with the bot using a - :class:`telegram.KeyboardButtonRequestUsers` button. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`user_id` is equal. - - .. versionadded:: 21.1 - - Args: - user_id (:obj:`int`): Identifier of the shared user. This number may have 32 significant - bits and some programming languages may have difficulty/silent defects in interpreting - it. But it has atmost 52 significant bits, so 64-bit integers or double-precision - float types are safe for storing these identifiers. The bot may not have access to the - user and could be unable to use this identifier, unless the user is already known to - the bot by some other means. - first_name (:obj:`str`, optional): First name of the user, if the name was requested by the - bot. - last_name (:obj:`str`, optional): Last name of the user, if the name was requested by the - bot. - username (:obj:`str`, optional): Username of the user, if the username was requested by the - bot. - photo (Sequence[:class:`telegram.PhotoSize`], optional): Available sizes of the chat photo, - if the photo was requested by the bot. - - Attributes: - user_id (:obj:`int`): Identifier of the shared user. This number may have 32 significant - bits and some programming languages may have difficulty/silent defects in interpreting - it. But it has atmost 52 significant bits, so 64-bit integers or double-precision - float types are safe for storing these identifiers. The bot may not have access to the - user and could be unable to use this identifier, unless the user is already known to - the bot by some other means. - first_name (:obj:`str`): Optional. First name of the user, if the name was requested by the - bot. - last_name (:obj:`str`): Optional. Last name of the user, if the name was requested by the - bot. - username (:obj:`str`): Optional. Username of the user, if the username was requested by the - bot. - photo (tuple[:class:`telegram.PhotoSize`]): Available sizes of the chat photo, if - the photo was requested by the bot. This list is empty if the photo was not requsted. - """ - - __slots__ = ("first_name", "last_name", "photo", "user_id", "username") - - def __init__( - self, - user_id: int, - first_name: Optional[str] = None, - last_name: Optional[str] = None, - username: Optional[str] = None, - photo: Optional[Sequence[PhotoSize]] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.user_id: int = user_id - self.first_name: Optional[str] = first_name - self.last_name: Optional[str] = last_name - self.username: Optional[str] = username - self.photo: Optional[tuple[PhotoSize, ...]] = parse_sequence_arg(photo) - - self._id_attrs = (self.user_id,) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "SharedUser": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["photo"] = de_list_optional(data.get("photo"), PhotoSize, bot) - return super().de_json(data=data, bot=bot) diff --git a/venv/lib/python3.12/site-packages/telegram/_story.py b/venv/lib/python3.12/site-packages/telegram/_story.py deleted file mode 100644 index 8d14b55..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_story.py +++ /dev/null @@ -1,79 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object related to a Telegram Story.""" - -from typing import TYPE_CHECKING, Optional - -from telegram._chat import Chat -from telegram._telegramobject import TelegramObject -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot - - -class Story(TelegramObject): - """ - This object represents a story. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`chat` and :attr:`id` are equal. - - .. versionadded:: 20.5 - - .. versionchanged:: 21.0 - Added attributes :attr:`chat` and :attr:`id` and equality based on them. - - Args: - chat (:class:`telegram.Chat`): Chat that posted the story. - id (:obj:`int`): Unique identifier for the story in the chat. - - Attributes: - chat (:class:`telegram.Chat`): Chat that posted the story. - id (:obj:`int`): Unique identifier for the story in the chat. - - """ - - __slots__ = ( - "chat", - "id", - ) - - def __init__( - self, - chat: Chat, - id: int, # pylint: disable=redefined-builtin - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(api_kwargs=api_kwargs) - self.chat: Chat = chat - self.id: int = id - - self._id_attrs = (self.chat, self.id) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "Story": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["chat"] = Chat.de_json(data.get("chat", {}), bot) - return super().de_json(data=data, bot=bot) diff --git a/venv/lib/python3.12/site-packages/telegram/_storyarea.py b/venv/lib/python3.12/site-packages/telegram/_storyarea.py deleted file mode 100644 index 7335be6..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_storyarea.py +++ /dev/null @@ -1,438 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains objects that represent story areas.""" - -from typing import Final, Optional - -from telegram import constants -from telegram._reaction import ReactionType -from telegram._telegramobject import TelegramObject -from telegram._utils import enum -from telegram._utils.types import JSONDict - - -class StoryAreaPosition(TelegramObject): - """Describes the position of a clickable area within a story. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if all of their attributes are equal. - - .. versionadded:: 22.1 - - Args: - x_percentage (:obj:`float`): The abscissa of the area's center, as a percentage of the - media width. - y_percentage (:obj:`float`): The ordinate of the area's center, as a percentage of the - media height. - width_percentage (:obj:`float`): The width of the area's rectangle, as a percentage of the - media width. - height_percentage (:obj:`float`): The height of the area's rectangle, as a percentage of - the media height. - rotation_angle (:obj:`float`): The clockwise rotation angle of the rectangle, in degrees; - 0-:tg-const:`~telegram.constants.StoryAreaPositionLimit.MAX_ROTATION_ANGLE`. - corner_radius_percentage (:obj:`float`): The radius of the rectangle corner rounding, as a - percentage of the media width. - - Attributes: - x_percentage (:obj:`float`): The abscissa of the area's center, as a percentage of the - media width. - y_percentage (:obj:`float`): The ordinate of the area's center, as a percentage of the - media height. - width_percentage (:obj:`float`): The width of the area's rectangle, as a percentage of the - media width. - height_percentage (:obj:`float`): The height of the area's rectangle, as a percentage of - the media height. - rotation_angle (:obj:`float`): The clockwise rotation angle of the rectangle, in degrees; - 0-:tg-const:`~telegram.constants.StoryAreaPositionLimit.MAX_ROTATION_ANGLE`. - corner_radius_percentage (:obj:`float`): The radius of the rectangle corner rounding, as a - percentage of the media width. - - """ - - __slots__ = ( - "corner_radius_percentage", - "height_percentage", - "rotation_angle", - "width_percentage", - "x_percentage", - "y_percentage", - ) - - def __init__( - self, - x_percentage: float, - y_percentage: float, - width_percentage: float, - height_percentage: float, - rotation_angle: float, - corner_radius_percentage: float, - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(api_kwargs=api_kwargs) - self.x_percentage: float = x_percentage - self.y_percentage: float = y_percentage - self.width_percentage: float = width_percentage - self.height_percentage: float = height_percentage - self.rotation_angle: float = rotation_angle - self.corner_radius_percentage: float = corner_radius_percentage - - self._id_attrs = ( - self.x_percentage, - self.y_percentage, - self.width_percentage, - self.height_percentage, - self.rotation_angle, - self.corner_radius_percentage, - ) - self._freeze() - - -class LocationAddress(TelegramObject): - """Describes the physical address of a location. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`country_code`, :attr:`state`, :attr:`city` and :attr:`street` - are equal. - - .. versionadded:: 22.1 - - Args: - country_code (:obj:`str`): The two-letter ``ISO 3166-1 alpha-2`` country code of the - country where the location is located. - state (:obj:`str`, optional): State of the location. - city (:obj:`str`, optional): City of the location. - street (:obj:`str`, optional): Street address of the location. - - Attributes: - country_code (:obj:`str`): The two-letter ``ISO 3166-1 alpha-2`` country code of the - country where the location is located. - state (:obj:`str`): Optional. State of the location. - city (:obj:`str`): Optional. City of the location. - street (:obj:`str`): Optional. Street address of the location. - - """ - - __slots__ = ("city", "country_code", "state", "street") - - def __init__( - self, - country_code: str, - state: Optional[str] = None, - city: Optional[str] = None, - street: Optional[str] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(api_kwargs=api_kwargs) - self.country_code: str = country_code - self.state: Optional[str] = state - self.city: Optional[str] = city - self.street: Optional[str] = street - - self._id_attrs = (self.country_code, self.state, self.city, self.street) - self._freeze() - - -class StoryAreaType(TelegramObject): - """Describes the type of a clickable area on a story. Currently, it can be one of: - - * :class:`telegram.StoryAreaTypeLocation` - * :class:`telegram.StoryAreaTypeSuggestedReaction` - * :class:`telegram.StoryAreaTypeLink` - * :class:`telegram.StoryAreaTypeWeather` - * :class:`telegram.StoryAreaTypeUniqueGift` - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`type` is equal. - - .. versionadded:: 22.1 - - Args: - type (:obj:`str`): Type of the area. - - Attributes: - type (:obj:`str`): Type of the area. - - """ - - __slots__ = ("type",) - - LOCATION: Final[str] = constants.StoryAreaTypeType.LOCATION - """:const:`telegram.constants.StoryAreaTypeType.LOCATION`""" - SUGGESTED_REACTION: Final[str] = constants.StoryAreaTypeType.SUGGESTED_REACTION - """:const:`telegram.constants.StoryAreaTypeType.SUGGESTED_REACTION`""" - LINK: Final[str] = constants.StoryAreaTypeType.LINK - """:const:`telegram.constants.StoryAreaTypeType.LINK`""" - WEATHER: Final[str] = constants.StoryAreaTypeType.WEATHER - """:const:`telegram.constants.StoryAreaTypeType.WEATHER`""" - UNIQUE_GIFT: Final[str] = constants.StoryAreaTypeType.UNIQUE_GIFT - """:const:`telegram.constants.StoryAreaTypeType.UNIQUE_GIFT`""" - - def __init__( - self, - type: str, # pylint: disable=redefined-builtin - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(api_kwargs=api_kwargs) - self.type: str = enum.get_member(constants.StoryAreaTypeType, type, type) - - self._id_attrs = (self.type,) - self._freeze() - - -class StoryAreaTypeLocation(StoryAreaType): - """Describes a story area pointing to a location. Currently, a story can have up to - :tg-const:`~telegram.constants.StoryAreaTypeLimit.MAX_LOCATION_AREAS` location areas. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`latitude` and :attr:`longitude` are equal. - - .. versionadded:: 22.1 - - Args: - latitude (:obj:`float`): Location latitude in degrees. - longitude (:obj:`float`): Location longitude in degrees. - address (:class:`telegram.LocationAddress`, optional): Address of the location. - - Attributes: - type (:obj:`str`): Type of the area, always :attr:`~telegram.StoryAreaType.LOCATION`. - latitude (:obj:`float`): Location latitude in degrees. - longitude (:obj:`float`): Location longitude in degrees. - address (:class:`telegram.LocationAddress`): Optional. Address of the location. - - """ - - __slots__ = ("address", "latitude", "longitude") - - def __init__( - self, - latitude: float, - longitude: float, - address: Optional[LocationAddress] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(type=StoryAreaType.LOCATION, api_kwargs=api_kwargs) - - with self._unfrozen(): - self.latitude: float = latitude - self.longitude: float = longitude - self.address: Optional[LocationAddress] = address - - self._id_attrs = (self.type, self.latitude, self.longitude) - - -class StoryAreaTypeSuggestedReaction(StoryAreaType): - """ - Describes a story area pointing to a suggested reaction. Currently, a story can have up to - :tg-const:`~telegram.constants.StoryAreaTypeLimit.MAX_SUGGESTED_REACTION_AREAS` - suggested reaction areas. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`reaction_type`, :attr:`is_dark` and :attr:`is_flipped` - are equal. - - .. versionadded:: 22.1 - - Args: - reaction_type (:class:`ReactionType`): Type of the reaction. - is_dark (:obj:`bool`, optional): Pass :obj:`True` if the reaction area has a dark - background. - is_flipped (:obj:`bool`, optional): Pass :obj:`True` if reaction area corner is flipped. - - Attributes: - type (:obj:`str`): Type of the area, always - :tg-const:`~telegram.StoryAreaType.SUGGESTED_REACTION`. - reaction_type (:class:`ReactionType`): Type of the reaction. - is_dark (:obj:`bool`): Optional. Pass :obj:`True` if the reaction area has a dark - background. - is_flipped (:obj:`bool`): Optional. Pass :obj:`True` if reaction area corner is flipped. - - """ - - __slots__ = ("is_dark", "is_flipped", "reaction_type") - - def __init__( - self, - reaction_type: ReactionType, - is_dark: Optional[bool] = None, - is_flipped: Optional[bool] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(type=StoryAreaType.SUGGESTED_REACTION, api_kwargs=api_kwargs) - - with self._unfrozen(): - self.reaction_type: ReactionType = reaction_type - self.is_dark: Optional[bool] = is_dark - self.is_flipped: Optional[bool] = is_flipped - - self._id_attrs = (self.type, self.reaction_type, self.is_dark, self.is_flipped) - - -class StoryAreaTypeLink(StoryAreaType): - """Describes a story area pointing to an ``HTTP`` or ``tg://`` link. Currently, a story can - have up to :tg-const:`~telegram.constants.StoryAreaTypeLimit.MAX_LINK_AREAS` link areas. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`url` is equal. - - .. versionadded:: 22.1 - - Args: - url (:obj:`str`): ``HTTP`` or ``tg://`` URL to be opened when the area is clicked. - - Attributes: - type (:obj:`str`): Type of the area, always :attr:`~telegram.StoryAreaType.LINK`. - url (:obj:`str`): ``HTTP`` or ``tg://`` URL to be opened when the area is clicked. - - """ - - __slots__ = ("url",) - - def __init__( - self, - url: str, - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(type=StoryAreaType.LINK, api_kwargs=api_kwargs) - - with self._unfrozen(): - self.url: str = url - - self._id_attrs = (self.type, self.url) - - -class StoryAreaTypeWeather(StoryAreaType): - """ - Describes a story area containing weather information. Currently, a story can have up to - :tg-const:`~telegram.constants.StoryAreaTypeLimit.MAX_WEATHER_AREAS` weather areas. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`temperature`, :attr:`emoji` and - :attr:`background_color` are equal. - - .. versionadded:: 22.1 - - Args: - temperature (:obj:`float`): Temperature, in degree Celsius. - emoji (:obj:`str`): Emoji representing the weather. - background_color (:obj:`int`): A color of the area background in the ``ARGB`` format. - - Attributes: - type (:obj:`str`): Type of the area, always - :tg-const:`~telegram.StoryAreaType.WEATHER`. - temperature (:obj:`float`): Temperature, in degree Celsius. - emoji (:obj:`str`): Emoji representing the weather. - background_color (:obj:`int`): A color of the area background in the ``ARGB`` format. - - """ - - __slots__ = ("background_color", "emoji", "temperature") - - def __init__( - self, - temperature: float, - emoji: str, - background_color: int, - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(type=StoryAreaType.WEATHER, api_kwargs=api_kwargs) - - with self._unfrozen(): - self.temperature: float = temperature - self.emoji: str = emoji - self.background_color: int = background_color - - self._id_attrs = (self.type, self.temperature, self.emoji, self.background_color) - - -class StoryAreaTypeUniqueGift(StoryAreaType): - """ - Describes a story area pointing to a unique gift. Currently, a story can have at most - :tg-const:`~telegram.constants.StoryAreaTypeLimit.MAX_UNIQUE_GIFT_AREAS` unique gift area. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`name` is equal. - - .. versionadded:: 22.1 - - Args: - name (:obj:`str`): Unique name of the gift. - - Attributes: - type (:obj:`str`): Type of the area, always - :tg-const:`~telegram.StoryAreaType.UNIQUE_GIFT`. - name (:obj:`str`): Unique name of the gift. - - """ - - __slots__ = ("name",) - - def __init__( - self, - name: str, - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(type=StoryAreaType.UNIQUE_GIFT, api_kwargs=api_kwargs) - - with self._unfrozen(): - self.name: str = name - - self._id_attrs = (self.type, self.name) - - -class StoryArea(TelegramObject): - """Describes a clickable area on a story media. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`position` and :attr:`type` are equal. - - .. versionadded:: 22.1 - - Args: - position (:class:`telegram.StoryAreaPosition`): Position of the area. - type (:class:`telegram.StoryAreaType`): Type of the area. - - Attributes: - position (:class:`telegram.StoryAreaPosition`): Position of the area. - type (:class:`telegram.StoryAreaType`): Type of the area. - - """ - - __slots__ = ("position", "type") - - def __init__( - self, - position: StoryAreaPosition, - type: StoryAreaType, # pylint: disable=redefined-builtin - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(api_kwargs=api_kwargs) - self.position: StoryAreaPosition = position - self.type: StoryAreaType = type - self._id_attrs = (self.position, self.type) - - self._freeze() diff --git a/venv/lib/python3.12/site-packages/telegram/_switchinlinequerychosenchat.py b/venv/lib/python3.12/site-packages/telegram/_switchinlinequerychosenchat.py deleted file mode 100644 index 7fca5a9..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_switchinlinequerychosenchat.py +++ /dev/null @@ -1,100 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -"""This module contains a class that represents a Telegram SwitchInlineQueryChosenChat.""" -from typing import Optional - -from telegram._telegramobject import TelegramObject -from telegram._utils.types import JSONDict - - -class SwitchInlineQueryChosenChat(TelegramObject): - """ - This object represents an inline button that switches the current user to inline mode in a - chosen chat, with an optional default inline query. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`query`, :attr:`allow_user_chats`, :attr:`allow_bot_chats`, - :attr:`allow_group_chats`, and :attr:`allow_channel_chats` are equal. - - .. versionadded:: 20.3 - - Caution: - The PTB team has discovered that you must pass at least one of - :paramref:`allow_user_chats`, :paramref:`allow_bot_chats`, :paramref:`allow_group_chats`, - or :paramref:`allow_channel_chats` to Telegram. Otherwise, an error will be raised. - - Args: - query (:obj:`str`, optional): The default inline query to be inserted in the input field. - If left empty, only the bot's username will be inserted. - allow_user_chats (:obj:`bool`, optional): Pass :obj:`True`, if private chats with users - can be chosen. - allow_bot_chats (:obj:`bool`, optional): Pass :obj:`True`, if private chats with bots can - be chosen. - allow_group_chats (:obj:`bool`, optional): Pass :obj:`True`, if group and supergroup chats - can be chosen. - allow_channel_chats (:obj:`bool`, optional): Pass :obj:`True`, if channel chats can be - chosen. - - Attributes: - query (:obj:`str`): Optional. The default inline query to be inserted in the input field. - If left empty, only the bot's username will be inserted. - allow_user_chats (:obj:`bool`): Optional. :obj:`True`, if private chats with users can be - chosen. - allow_bot_chats (:obj:`bool`): Optional. :obj:`True`, if private chats with bots can be - chosen. - allow_group_chats (:obj:`bool`): Optional. :obj:`True`, if group and supergroup chats can - be chosen. - allow_channel_chats (:obj:`bool`): Optional. :obj:`True`, if channel chats can be chosen. - - """ - - __slots__ = ( - "allow_bot_chats", - "allow_channel_chats", - "allow_group_chats", - "allow_user_chats", - "query", - ) - - def __init__( - self, - query: Optional[str] = None, - allow_user_chats: Optional[bool] = None, - allow_bot_chats: Optional[bool] = None, - allow_group_chats: Optional[bool] = None, - allow_channel_chats: Optional[bool] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - # Optional - self.query: Optional[str] = query - self.allow_user_chats: Optional[bool] = allow_user_chats - self.allow_bot_chats: Optional[bool] = allow_bot_chats - self.allow_group_chats: Optional[bool] = allow_group_chats - self.allow_channel_chats: Optional[bool] = allow_channel_chats - - self._id_attrs = ( - self.query, - self.allow_user_chats, - self.allow_bot_chats, - self.allow_group_chats, - self.allow_channel_chats, - ) - - self._freeze() diff --git a/venv/lib/python3.12/site-packages/telegram/_telegramobject.py b/venv/lib/python3.12/site-packages/telegram/_telegramobject.py deleted file mode 100644 index 7096882..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_telegramobject.py +++ /dev/null @@ -1,721 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""Base class for Telegram Objects.""" -import contextlib -import datetime as dtm -import inspect -import json -from collections.abc import Iterator, Mapping, Sized -from contextlib import contextmanager -from copy import deepcopy -from itertools import chain -from types import MappingProxyType -from typing import TYPE_CHECKING, Any, ClassVar, Optional, TypeVar, Union, cast - -from telegram._utils.datetime import to_timestamp -from telegram._utils.defaultvalue import DefaultValue -from telegram._utils.types import JSONDict -from telegram._utils.warnings import warn - -if TYPE_CHECKING: - from telegram import Bot - -Tele_co = TypeVar("Tele_co", bound="TelegramObject", covariant=True) - - -class TelegramObject: - """Base class for most Telegram objects. - - Objects of this type are subscriptable with strings. See :meth:`__getitem__` for more details. - The :mod:`pickle` and :func:`~copy.deepcopy` behavior of objects of this type are defined by - :meth:`__getstate__`, :meth:`__setstate__` and :meth:`__deepcopy__`. - - Tip: - Objects of this type can be serialized via Python's :mod:`pickle` module and pickled - objects from one version of PTB are usually loadable in future versions. However, we can - not guarantee that this compatibility will always be provided. At least a manual one-time - conversion of the data may be needed on major updates of the library. - - .. versionchanged:: 20.0 - - * Removed argument and attribute ``bot`` for several subclasses. Use - :meth:`set_bot` and :meth:`get_bot` instead. - * Removed the possibility to pass arbitrary keyword arguments for several subclasses. - * String representations objects of this type was overhauled. See :meth:`__repr__` for - details. As this class doesn't implement :meth:`object.__str__`, the default - implementation will be used, which is equivalent to :meth:`__repr__`. - * Objects of this class (or subclasses) are now immutable. This means that you can't set - or delete attributes anymore. Moreover, attributes that were formerly of type - :obj:`list` are now of type :obj:`tuple`. - - Arguments: - api_kwargs (dict[:obj:`str`, any], optional): |toapikwargsarg| - - .. versionadded:: 20.0 - - Attributes: - api_kwargs (:obj:`types.MappingProxyType` [:obj:`str`, any]): |toapikwargsattr| - - .. versionadded:: 20.0 - - """ - - __slots__ = ("_bot", "_frozen", "_id_attrs", "api_kwargs") - - # Used to cache the names of the parameters of the __init__ method of the class - # Must be a private attribute to avoid name clashes between subclasses - __INIT_PARAMS: ClassVar[set[str]] = set() - # Used to check if __INIT_PARAMS has been set for the current class. Unfortunately, we can't - # just check if `__INIT_PARAMS is None`, since subclasses use the parent class' __INIT_PARAMS - # unless it's overridden - __INIT_PARAMS_CHECK: Optional[type["TelegramObject"]] = None - - def __init__(self, *, api_kwargs: Optional[JSONDict] = None) -> None: - # Setting _frozen to `False` here means that classes without arguments still need to - # implement __init__. However, with `True` would mean increased usage of - # `with self._unfrozen()` in the `__init__` of subclasses and we have fewer empty - # classes than classes with arguments. - self._frozen: bool = False - self._id_attrs: tuple[object, ...] = () - self._bot: Optional[Bot] = None - # We don't do anything with api_kwargs here - see docstring of _apply_api_kwargs - self.api_kwargs: Mapping[str, Any] = MappingProxyType(api_kwargs or {}) - - def __eq__(self, other: object) -> bool: - """Compares this object with :paramref:`other` in terms of equality. - If this object and :paramref:`other` are `not` objects of the same class, - this comparison will fall back to Python's default implementation of :meth:`object.__eq__`. - Otherwise, both objects may be compared in terms of equality, if the corresponding - subclass of :class:`TelegramObject` has defined a set of attributes to compare and - the objects are considered to be equal, if all of these attributes are equal. - If the subclass has not defined a set of attributes to compare, a warning will be issued. - - Tip: - If instances of a class in the :mod:`telegram` module are comparable in terms of - equality, the documentation of the class will state the attributes that will be used - for this comparison. - - Args: - other (:obj:`object`): The object to compare with. - - Returns: - :obj:`bool` - - """ - if isinstance(other, self.__class__): - if not self._id_attrs: - warn( - f"Objects of type {self.__class__.__name__} can not be meaningfully tested for" - " equivalence.", - stacklevel=2, - ) - if not other._id_attrs: - warn( - f"Objects of type {other.__class__.__name__} can not be meaningfully tested" - " for equivalence.", - stacklevel=2, - ) - return self._id_attrs == other._id_attrs - return super().__eq__(other) - - def __hash__(self) -> int: - """Builds a hash value for this object such that the hash of two objects is equal if and - only if the objects are equal in terms of :meth:`__eq__`. - - Returns: - :obj:`int` - """ - if self._id_attrs: - return hash((self.__class__, self._id_attrs)) - return super().__hash__() - - def __setattr__(self, key: str, value: object) -> None: - """Overrides :meth:`object.__setattr__` to prevent the overriding of attributes. - - Raises: - :exc:`AttributeError` - """ - # protected attributes can always be set for convenient internal use - if key[0] == "_" or not getattr(self, "_frozen", True): - super().__setattr__(key, value) - return - - raise AttributeError( - f"Attribute `{key}` of class `{self.__class__.__name__}` can't be set!" - ) - - def __delattr__(self, key: str) -> None: - """Overrides :meth:`object.__delattr__` to prevent the deletion of attributes. - - Raises: - :exc:`AttributeError` - """ - # protected attributes can always be set for convenient internal use - if key[0] == "_" or not getattr(self, "_frozen", True): - super().__delattr__(key) - return - - raise AttributeError( - f"Attribute `{key}` of class `{self.__class__.__name__}` can't be deleted!" - ) - - def __repr__(self) -> str: - """Gives a string representation of this object in the form - ``ClassName(attr_1=value_1, attr_2=value_2, ...)``, where attributes are omitted if they - have the value :obj:`None` or are empty instances of :class:`collections.abc.Sized` (e.g. - :class:`list`, :class:`dict`, :class:`set`, :class:`str`, etc.). - - As this class doesn't implement :meth:`object.__str__`, the default implementation - will be used, which is equivalent to :meth:`__repr__`. - - Returns: - :obj:`str` - """ - # * `__repr__` goal is to be unambiguous - # * `__str__` goal is to be readable - # * `str()` calls `__repr__`, if `__str__` is not defined - # In our case "unambiguous" and "readable" largely coincide, so we can use the same logic. - as_dict = self._get_attrs(recursive=False, include_private=False) - - if not self.api_kwargs: - # Drop api_kwargs from the representation, if empty - as_dict.pop("api_kwargs", None) - else: - # Otherwise, we want to skip the "mappingproxy" part of the repr - as_dict["api_kwargs"] = dict(self.api_kwargs) - - contents = ", ".join( - f"{k}={as_dict[k]!r}" - for k in sorted(as_dict.keys()) - if ( - as_dict[k] is not None - and not ( - isinstance(as_dict[k], Sized) - and len(as_dict[k]) == 0 # type: ignore[arg-type] - ) - ) - ) - return f"{self.__class__.__name__}({contents})" - - def __getitem__(self, item: str) -> object: - """ - Objects of this type are subscriptable with strings, where - ``telegram_object["attribute_name"]`` is equivalent to ``telegram_object.attribute_name``. - - Tip: - This is useful for dynamic attribute lookup, i.e. ``telegram_object[arg]`` where the - value of ``arg`` is determined at runtime. - In all other cases, it's recommended to use the dot notation instead, i.e. - ``telegram_object.attribute_name``. - - .. versionchanged:: 20.0 - - ``telegram_object['from']`` will look up the key ``from_user``. This is to account for - special cases like :attr:`Message.from_user` that deviate from the official Bot API. - - Args: - item (:obj:`str`): The name of the attribute to look up. - - Returns: - :obj:`object` - - Raises: - :exc:`KeyError`: If the object does not have an attribute with the appropriate name. - """ - if item == "from": - item = "from_user" - try: - return getattr(self, item) - except AttributeError as exc: - raise KeyError( - f"Objects of type {self.__class__.__name__} don't have an attribute called " - f"`{item}`." - ) from exc - - def __getstate__(self) -> dict[str, Union[str, object]]: - """ - Overrides :meth:`object.__getstate__` to customize the pickling process of objects of this - type. - The returned state does `not` contain the :class:`telegram.Bot` instance set with - :meth:`set_bot` (if any), as it can't be pickled. - - Returns: - state (dict[:obj:`str`, :obj:`object`]): The state of the object. - """ - out = self._get_attrs( - include_private=True, recursive=False, remove_bot=True, convert_default_value=False - ) - # MappingProxyType is not pickable, so we convert it to a dict and revert in - # __setstate__ - out["api_kwargs"] = dict(self.api_kwargs) - return out - - def __setstate__(self, state: dict[str, object]) -> None: - """ - Overrides :meth:`object.__setstate__` to customize the unpickling process of objects of - this type. Modifies the object in-place. - - If any data was stored in the :attr:`api_kwargs` of the pickled object, this method checks - if the class now has dedicated attributes for those keys and moves the values from - :attr:`api_kwargs` to the dedicated attributes. - This can happen, if serialized data is loaded with a new version of this library, where - the new version was updated to account for updates of the Telegram Bot API. - - If on the contrary an attribute was removed from the class, the value is not discarded but - made available via :attr:`api_kwargs`. - - Args: - state (:obj:`dict`): The data to set as attributes of this object. - """ - self._unfreeze() - - # Make sure that we have a `_bot` attribute. This is necessary, since __getstate__ omits - # this as Bots are not pickable. - self._bot = None - - # get api_kwargs first because we may need to add entries to it (see try-except below) - api_kwargs = cast("dict[str, object]", state.pop("api_kwargs", {})) - # get _frozen before the loop to avoid setting it to True in the loop - frozen = state.pop("_frozen", False) - - for key, val in state.items(): - try: - setattr(self, key, val) - except AttributeError: - # So an attribute was deprecated and removed from the class. Let's handle this: - # 1) Is the attribute now a property with no setter? Let's check that: - if isinstance(getattr(self.__class__, key, None), property): - # It is, so let's try to set the "private attribute" instead - try: - setattr(self, f"_{key}", val) - # If this fails as well, guess we've completely removed it. Let's add it to - # api_kwargs as fallback - except AttributeError: - api_kwargs[key] = val - - # 2) The attribute is a private attribute, i.e. it went through case 1) in the past - elif key.startswith("_"): - continue # skip adding this to api_kwargs, the attribute is lost forever. - api_kwargs[key] = val # add it to api_kwargs as fallback - - # For api_kwargs we first apply any kwargs that are already attributes of the object - # and then set the rest as MappingProxyType attribute. Converting to MappingProxyType - # is necessary, since __getstate__ converts it to a dict as MPT is not pickable. - self._apply_api_kwargs(api_kwargs) - self.api_kwargs = MappingProxyType(api_kwargs) - - # Apply freezing if necessary - # we .get(…) the setting for backwards compatibility with objects that were pickled - # before the freeze feature was introduced - if frozen: - self._freeze() - - def __deepcopy__(self: Tele_co, memodict: dict[int, object]) -> Tele_co: - """ - Customizes how :func:`copy.deepcopy` processes objects of this type. - The only difference to the default implementation is that the :class:`telegram.Bot` - instance set via :meth:`set_bot` (if any) is not copied, but shared between the original - and the copy, i.e.:: - - assert telegram_object.get_bot() is copy.deepcopy(telegram_object).get_bot() - - Args: - memodict (:obj:`dict`): A dictionary that maps objects to their copies. - - Returns: - :class:`telegram.TelegramObject`: The copied object. - """ - bot = self._bot # Save bot so we can set it after copying - self.set_bot(None) # set to None so it is not deepcopied - cls = self.__class__ - result = cls.__new__(cls) # create a new instance - memodict[id(self)] = result # save the id of the object in the dict - - result._frozen = False # unfreeze the new object for setting the attributes - - # now we set the attributes in the deepcopied object - for k in self._get_attrs_names(include_private=True): - if k == "_frozen": - # Setting the frozen status to True would prevent the attributes from being set - continue - if k == "api_kwargs": - # Need to copy api_kwargs manually, since it's a MappingProxyType is not - # pickable and deepcopy uses the pickle interface - setattr(result, k, MappingProxyType(deepcopy(dict(self.api_kwargs), memodict))) - continue - - try: - setattr(result, k, deepcopy(getattr(self, k), memodict)) - except AttributeError: - # Skip missing attributes. This can happen if the object was loaded from a pickle - # file that was created with an older version of the library, where the class - # did not have the attribute yet. - continue - - # Apply freezing if necessary - if self._frozen: - result._freeze() - - result.set_bot(bot) # Assign the bots back - self.set_bot(bot) - return result - - @staticmethod - def _parse_data(data: JSONDict) -> JSONDict: - """Should be called by subclasses that override de_json to ensure that the input - is not altered. Whoever calls de_json might still want to use the original input - for something else. - """ - return data.copy() - - @classmethod - def _de_json( - cls: type[Tele_co], - data: JSONDict, - bot: Optional["Bot"], - api_kwargs: Optional[JSONDict] = None, - ) -> Tele_co: - # try-except is significantly faster in case we already have a correct argument set - try: - obj = cls(**data, api_kwargs=api_kwargs) - except TypeError as exc: - if "__init__() got an unexpected keyword argument" not in str(exc): - raise - - if cls.__INIT_PARAMS_CHECK is not cls: - signature = inspect.signature(cls) - cls.__INIT_PARAMS = set(signature.parameters.keys()) - cls.__INIT_PARAMS_CHECK = cls - - api_kwargs = api_kwargs or {} - existing_kwargs: JSONDict = {} - for key, value in data.items(): - (existing_kwargs if key in cls.__INIT_PARAMS else api_kwargs)[key] = value - - obj = cls(api_kwargs=api_kwargs, **existing_kwargs) - - obj.set_bot(bot=bot) - return obj - - @classmethod - def de_json(cls: type[Tele_co], data: JSONDict, bot: Optional["Bot"] = None) -> Tele_co: - """Converts JSON data to a Telegram object. - - Args: - data (dict[:obj:`str`, ...]): The JSON data. - bot (:class:`telegram.Bot`, optional): The bot associated with this object. Defaults to - :obj:`None`, in which case shortcut methods will not be available. - - .. versionchanged:: 21.4 - :paramref:`bot` is now optional and defaults to :obj:`None` - - Returns: - The Telegram object. - - """ - return cls._de_json(data=data, bot=bot) - - @classmethod - def de_list( - cls: type[Tele_co], data: list[JSONDict], bot: Optional["Bot"] = None - ) -> tuple[Tele_co, ...]: - """Converts a list of JSON objects to a tuple of Telegram objects. - - .. versionchanged:: 20.0 - - * Returns a tuple instead of a list. - * Filters out any :obj:`None` values. - - Args: - data (list[dict[:obj:`str`, ...]]): The JSON data. - bot (:class:`telegram.Bot`, optional): The bot associated with these object. Defaults - to :obj:`None`, in which case shortcut methods will not be available. - - .. versionchanged:: 21.4 - :paramref:`bot` is now optional and defaults to :obj:`None` - - Returns: - A tuple of Telegram objects. - - """ - return tuple(cls.de_json(d, bot) for d in data) - - @contextmanager - def _unfrozen(self: Tele_co) -> Iterator[Tele_co]: - """Context manager to temporarily unfreeze the object. For internal use only. - - Note: - with to._unfrozen() as other_to: - assert to is other_to - """ - self._unfreeze() - yield self - self._freeze() - - def _freeze(self) -> None: - self._frozen = True - - def _unfreeze(self) -> None: - self._frozen = False - - def _apply_api_kwargs(self, api_kwargs: JSONDict) -> None: - """Loops through the api kwargs and for every key that exists as attribute of the - object (and is None), it moves the value from `api_kwargs` to the attribute. - *Edits `api_kwargs` in place!* - - This method is currently only called in the unpickling process, i.e. not on "normal" init. - This is because - * automating this is tricky to get right: It should be called at the *end* of the __init__, - preferably only once at the end of the __init__ of the last child class. This could be - done via __init_subclass__, but it's hard to not destroy the signature of __init__ in the - process. - * calling it manually in every __init__ is tedious - * There probably is no use case for it anyway. If you manually initialize a TO subclass, - then you can pass everything as proper argument. - """ - # we convert to list to ensure that the list doesn't change length while we loop - for key in list(api_kwargs.keys()): - # property attributes are not settable, so we need to set the private attribute - if isinstance(getattr(self.__class__, key, None), property): - # if setattr fails, we'll just leave the value in api_kwargs: - with contextlib.suppress(AttributeError): - setattr(self, f"_{key}", api_kwargs.pop(key)) - elif getattr(self, key, True) is None: - setattr(self, key, api_kwargs.pop(key)) - - def _is_deprecated_attr(self, attr: str) -> bool: - """Checks whether `attr` is in the list of deprecated time period attributes.""" - return ( - class_name := self.__class__.__name__ - ) in _TIME_PERIOD_DEPRECATIONS and attr in _TIME_PERIOD_DEPRECATIONS[class_name] - - def _get_attrs_names(self, include_private: bool) -> Iterator[str]: - """ - Returns the names of the attributes of this object. This is used to determine which - attributes should be serialized when pickling the object. - - Args: - include_private (:obj:`bool`): Whether to include private attributes. - - Returns: - Iterator[:obj:`str`]: An iterator over the names of the attributes of this object. - """ - # We want to get all attributes for the class, using self.__slots__ only includes the - # attributes used by that class itself, and not its superclass(es). Hence, we get its MRO - # and then get their attributes. The `[:-1]` slice excludes the `object` class - all_slots = (s for c in self.__class__.__mro__[:-1] for s in c.__slots__) # type: ignore - # chain the class's slots with the user defined subclass __dict__ (class has no slots) - all_attrs = ( - chain(all_slots, self.__dict__.keys()) if hasattr(self, "__dict__") else all_slots - ) - - if include_private: - return all_attrs - return ( - attr - for attr in all_attrs - # Include deprecated private attributes, which are exposed via properties - if not attr.startswith("_") or self._is_deprecated_attr(attr) - ) - - def _get_attrs( - self, - include_private: bool = False, - recursive: bool = False, - remove_bot: bool = False, - convert_default_value: bool = True, - ) -> dict[str, Union[str, object]]: - """This method is used for obtaining the attributes of the object. - - Args: - include_private (:obj:`bool`): Whether the result should include private variables. - recursive (:obj:`bool`): If :obj:`True`, will convert any ``TelegramObjects`` (if - found) in the attributes to a dictionary. Else, preserves it as an object itself. - remove_bot (:obj:`bool`): Whether the bot should be included in the result. - convert_default_value (:obj:`bool`): Whether :class:`telegram.DefaultValue` should be - converted to its true value. This is necessary when converting to a dictionary for - end users since DefaultValue is used in some classes that work with - `tg.ext.defaults` (like `LinkPreviewOptions`) - - Returns: - :obj:`dict`: A dict where the keys are attribute names and values are their values. - """ - data = {} - - for key in self._get_attrs_names(include_private=include_private): - value = ( - DefaultValue.get_value(getattr(self, key, None)) - if convert_default_value - else getattr(self, key, None) - ) - - if value is not None: - if recursive and hasattr(value, "to_dict"): - data[key] = value.to_dict(recursive=True) - else: - data[key] = value - elif not recursive: - data[key] = value - - if recursive and data.get("from_user"): - data["from"] = data.pop("from_user", None) - if remove_bot: - data.pop("_bot", None) - return data - - def to_json(self) -> str: - """Gives a JSON representation of object. - - .. versionchanged:: 20.0 - Now includes all entries of :attr:`api_kwargs`. - - Returns: - :obj:`str` - """ - return json.dumps(self.to_dict()) - - def to_dict(self, recursive: bool = True) -> JSONDict: - """Gives representation of object as :obj:`dict`. - - .. versionchanged:: 20.0 - - * Now includes all entries of :attr:`api_kwargs`. - * Attributes whose values are empty sequences are no longer included. - - Args: - recursive (:obj:`bool`, optional): If :obj:`True`, will convert any TelegramObjects - (if found) in the attributes to a dictionary. Else, preserves it as an object - itself. Defaults to :obj:`True`. - - .. versionadded:: 20.0 - - Returns: - :obj:`dict` - """ - out = self._get_attrs(recursive=recursive) - - # Now we should convert TGObjects to dicts inside objects such as sequences, and convert - # datetimes to timestamps. This mostly eliminates the need for subclasses to override - # `to_dict` - pop_keys: set[str] = set() - timedelta_dict: dict = {} - for key, value in out.items(): - if isinstance(value, (tuple, list)): - if not value: - # not popping directly to avoid changing the dict size during iteration - pop_keys.add(key) - continue - - val = [] # empty list to append our converted values to - for item in value: - if hasattr(item, "to_dict"): - val.append(item.to_dict(recursive=recursive)) - # This branch is useful for e.g. tuple[tuple[PhotoSize|KeyboardButton]] - elif isinstance(item, (tuple, list)): - val.append( - [ - i.to_dict(recursive=recursive) if hasattr(i, "to_dict") else i - for i in item - ] - ) - else: # if it's not a TGObject, just append it. E.g. [TGObject, 2] - val.append(item) - out[key] = val - - elif isinstance(value, dtm.datetime): - out[key] = to_timestamp(value) - elif isinstance(value, dtm.timedelta): - # Converting to int here is neccassry in some cases where Bot API returns - # 'BadRquest' when expecting integers (e.g. InputMediaVideo.duration). - # Other times, floats are accepted but the Bot API handles ints just as well - # (e.g. InputStoryContentVideo.duration). - # Not updating `out` directly to avoid changing the dict size during iteration - timedelta_dict[key.removeprefix("_")] = ( - int(seconds) if (seconds := value.total_seconds()).is_integer() else seconds - ) - # This will sometimes add non-deprecated timedelta attributes to pop_keys. - # We'll restore them shortly. - pop_keys.add(key) - - for key in pop_keys: - out.pop(key) - - # `out.update` must to be called *after* we pop deprecated time period attributes - # this ensures that we restore attributes that were already using datetime.timdelta - out.update(timedelta_dict) - - # Effectively "unpack" api_kwargs into `out`: - out.update(out.pop("api_kwargs", {})) # type: ignore[call-overload] - return out - - def get_bot(self) -> "Bot": - """Returns the :class:`telegram.Bot` instance associated with this object. - - .. seealso:: :meth:`set_bot` - - .. versionadded: 20.0 - - Raises: - RuntimeError: If no :class:`telegram.Bot` instance was set for this object. - """ - if self._bot is None: - raise RuntimeError( - "This object has no bot associated with it. Shortcuts cannot be used." - ) - return self._bot - - def set_bot(self, bot: Optional["Bot"]) -> None: - """Sets the :class:`telegram.Bot` instance associated with this object. - - .. seealso:: :meth:`get_bot` - - .. versionadded: 20.0 - - Arguments: - bot (:class:`telegram.Bot` | :obj:`None`): The bot instance. - """ - self._bot = bot - - -# We use str keys to avoid importing which causes circular dependencies -_TIME_PERIOD_DEPRECATIONS: dict[str, tuple[str, ...]] = { - "ChatFullInfo": ("_message_auto_delete_time", "_slow_mode_delay"), - "Animation": ("_duration",), - "Audio": ("_duration",), - "Video": ("_duration", "_start_timestamp"), - "VideoNote": ("_duration",), - "Voice": ("_duration",), - "PaidMediaPreview": ("_duration",), - "VideoChatEnded": ("_duration",), - "InputMediaVideo": ("_duration",), - "InputMediaAnimation": ("_duration",), - "InputMediaAudio": ("_duration",), - "InputPaidMediaVideo": ("_duration",), - "InlineQueryResultGif": ("_gif_duration",), - "InlineQueryResultMpeg4Gif": ("_mpeg4_duration",), - "InlineQueryResultVideo": ("_video_duration",), - "InlineQueryResultAudio": ("_audio_duration",), - "InlineQueryResultVoice": ("_voice_duration",), - "InlineQueryResultLocation": ("_live_period",), - "Poll": ("_open_period",), - "Location": ("_live_period",), - "MessageAutoDeleteTimerChanged": ("_message_auto_delete_time",), - "ChatInviteLink": ("_subscription_period",), - "InputLocationMessageContent": ("_live_period",), -} diff --git a/venv/lib/python3.12/site-packages/telegram/_uniquegift.py b/venv/lib/python3.12/site-packages/telegram/_uniquegift.py deleted file mode 100644 index fa494a8..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_uniquegift.py +++ /dev/null @@ -1,401 +0,0 @@ -#!/usr/bin/env python -# -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/] -"""This module contains classes related to unique gifs.""" -from typing import TYPE_CHECKING, Final, Optional - -from telegram import constants -from telegram._files.sticker import Sticker -from telegram._telegramobject import TelegramObject -from telegram._utils import enum -from telegram._utils.argumentparsing import de_json_optional -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot - - -class UniqueGiftModel(TelegramObject): - """This object describes the model of a unique gift. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal if their :attr:`name`, :attr:`sticker` and :attr:`rarity_per_mille` are equal. - - .. versionadded:: 22.1 - - Args: - name (:obj:`str`): Name of the model. - sticker (:class:`telegram.Sticker`): The sticker that represents the unique gift. - rarity_per_mille (:obj:`int`): The number of unique gifts that receive this - model for every ``1000`` gifts upgraded. - - Attributes: - name (:obj:`str`): Name of the model. - sticker (:class:`telegram.Sticker`): The sticker that represents the unique gift. - rarity_per_mille (:obj:`int`): The number of unique gifts that receive this - model for every ``1000`` gifts upgraded. - - """ - - __slots__ = ( - "name", - "rarity_per_mille", - "sticker", - ) - - def __init__( - self, - name: str, - sticker: Sticker, - rarity_per_mille: int, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.name: str = name - self.sticker: Sticker = sticker - self.rarity_per_mille: int = rarity_per_mille - - self._id_attrs = (self.name, self.sticker, self.rarity_per_mille) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "UniqueGiftModel": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["sticker"] = de_json_optional(data.get("sticker"), Sticker, bot) - - return super().de_json(data=data, bot=bot) - - -class UniqueGiftSymbol(TelegramObject): - """This object describes the symbol shown on the pattern of a unique gift. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal if their :attr:`name`, :attr:`sticker` and :attr:`rarity_per_mille` are equal. - - .. versionadded:: 22.1 - - Args: - name (:obj:`str`): Name of the symbol. - sticker (:class:`telegram.Sticker`): The sticker that represents the unique gift. - rarity_per_mille (:obj:`int`): The number of unique gifts that receive this - model for every ``1000`` gifts upgraded. - - Attributes: - name (:obj:`str`): Name of the symbol. - sticker (:class:`telegram.Sticker`): The sticker that represents the unique gift. - rarity_per_mille (:obj:`int`): The number of unique gifts that receive this - model for every ``1000`` gifts upgraded. - - """ - - __slots__ = ( - "name", - "rarity_per_mille", - "sticker", - ) - - def __init__( - self, - name: str, - sticker: Sticker, - rarity_per_mille: int, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.name: str = name - self.sticker: Sticker = sticker - self.rarity_per_mille: int = rarity_per_mille - - self._id_attrs = (self.name, self.sticker, self.rarity_per_mille) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "UniqueGiftSymbol": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["sticker"] = de_json_optional(data.get("sticker"), Sticker, bot) - - return super().de_json(data=data, bot=bot) - - -class UniqueGiftBackdropColors(TelegramObject): - """This object describes the colors of the backdrop of a unique gift. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal if their :attr:`center_color`, :attr:`edge_color`, :attr:`symbol_color`, - and :attr:`text_color` are equal. - - .. versionadded:: 22.1 - - Args: - center_color (:obj:`int`): The color in the center of the backdrop in RGB format. - edge_color (:obj:`int`): The color on the edges of the backdrop in RGB format. - symbol_color (:obj:`int`): The color to be applied to the symbol in RGB format. - text_color (:obj:`int`): The color for the text on the backdrop in RGB format. - - Attributes: - center_color (:obj:`int`): The color in the center of the backdrop in RGB format. - edge_color (:obj:`int`): The color on the edges of the backdrop in RGB format. - symbol_color (:obj:`int`): The color to be applied to the symbol in RGB format. - text_color (:obj:`int`): The color for the text on the backdrop in RGB format. - - """ - - __slots__ = ( - "center_color", - "edge_color", - "symbol_color", - "text_color", - ) - - def __init__( - self, - center_color: int, - edge_color: int, - symbol_color: int, - text_color: int, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.center_color: int = center_color - self.edge_color: int = edge_color - self.symbol_color: int = symbol_color - self.text_color: int = text_color - - self._id_attrs = (self.center_color, self.edge_color, self.symbol_color, self.text_color) - - self._freeze() - - -class UniqueGiftBackdrop(TelegramObject): - """This object describes the backdrop of a unique gift. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal if their :attr:`name`, :attr:`colors`, and :attr:`rarity_per_mille` are equal. - - .. versionadded:: 22.1 - - Args: - name (:obj:`str`): Name of the backdrop. - colors (:class:`telegram.UniqueGiftBackdropColors`): Colors of the backdrop. - rarity_per_mille (:obj:`int`): The number of unique gifts that receive this backdrop - for every ``1000`` gifts upgraded. - - Attributes: - name (:obj:`str`): Name of the backdrop. - colors (:class:`telegram.UniqueGiftBackdropColors`): Colors of the backdrop. - rarity_per_mille (:obj:`int`): The number of unique gifts that receive this backdrop - for every ``1000`` gifts upgraded. - - """ - - __slots__ = ( - "colors", - "name", - "rarity_per_mille", - ) - - def __init__( - self, - name: str, - colors: UniqueGiftBackdropColors, - rarity_per_mille: int, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.name: str = name - self.colors: UniqueGiftBackdropColors = colors - self.rarity_per_mille: int = rarity_per_mille - - self._id_attrs = (self.name, self.colors, self.rarity_per_mille) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "UniqueGiftBackdrop": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["colors"] = de_json_optional(data.get("colors"), UniqueGiftBackdropColors, bot) - - return super().de_json(data=data, bot=bot) - - -class UniqueGift(TelegramObject): - """This object describes a unique gift that was upgraded from a regular gift. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal if their :attr:`base_name`, :attr:`name`, :attr:`number`, :class:`model`, - :attr:`symbol`, and :attr:`backdrop` are equal. - - .. versionadded:: 22.1 - - Args: - base_name (:obj:`str`): Human-readable name of the regular gift from which this unique - gift was upgraded. - name (:obj:`str`): Unique name of the gift. This name can be used - in ``https://t.me/nft/...`` links and story areas. - number (:obj:`int`): Unique number of the upgraded gift among gifts upgraded from the - same regular gift. - model (:class:`UniqueGiftModel`): Model of the gift. - symbol (:class:`UniqueGiftSymbol`): Symbol of the gift. - backdrop (:class:`UniqueGiftBackdrop`): Backdrop of the gift. - - Attributes: - base_name (:obj:`str`): Human-readable name of the regular gift from which this unique - gift was upgraded. - name (:obj:`str`): Unique name of the gift. This name can be used - in ``https://t.me/nft/...`` links and story areas. - number (:obj:`int`): Unique number of the upgraded gift among gifts upgraded from the - same regular gift. - model (:class:`telegram.UniqueGiftModel`): Model of the gift. - symbol (:class:`telegram.UniqueGiftSymbol`): Symbol of the gift. - backdrop (:class:`telegram.UniqueGiftBackdrop`): Backdrop of the gift. - - """ - - __slots__ = ( - "backdrop", - "base_name", - "model", - "name", - "number", - "symbol", - ) - - def __init__( - self, - base_name: str, - name: str, - number: int, - model: UniqueGiftModel, - symbol: UniqueGiftSymbol, - backdrop: UniqueGiftBackdrop, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.base_name: str = base_name - self.name: str = name - self.number: int = number - self.model: UniqueGiftModel = model - self.symbol: UniqueGiftSymbol = symbol - self.backdrop: UniqueGiftBackdrop = backdrop - - self._id_attrs = ( - self.base_name, - self.name, - self.number, - self.model, - self.symbol, - self.backdrop, - ) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "UniqueGift": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["model"] = de_json_optional(data.get("model"), UniqueGiftModel, bot) - data["symbol"] = de_json_optional(data.get("symbol"), UniqueGiftSymbol, bot) - data["backdrop"] = de_json_optional(data.get("backdrop"), UniqueGiftBackdrop, bot) - - return super().de_json(data=data, bot=bot) - - -class UniqueGiftInfo(TelegramObject): - """Describes a service message about a unique gift that was sent or received. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal if their :attr:`gift`, and :attr:`origin` are equal. - - .. versionadded:: 22.1 - - Args: - gift (:class:`UniqueGift`): Information about the gift. - origin (:obj:`str`): Origin of the gift. Currently, either :attr:`UPGRADE` - or :attr:`TRANSFER`. - owned_gift_id (:obj:`str`, optional) Unique identifier of the received gift for the - bot; only present for gifts received on behalf of business accounts. - transfer_star_count (:obj:`int`, optional): Number of Telegram Stars that must be paid - to transfer the gift; omitted if the bot cannot transfer the gift. - - Attributes: - gift (:class:`UniqueGift`): Information about the gift. - origin (:obj:`str`): Origin of the gift. Currently, either :attr:`UPGRADE` - or :attr:`TRANSFER`. - owned_gift_id (:obj:`str`) Optional. Unique identifier of the received gift for the - bot; only present for gifts received on behalf of business accounts. - transfer_star_count (:obj:`int`): Optional. Number of Telegram Stars that must be paid - to transfer the gift; omitted if the bot cannot transfer the gift. - - """ - - UPGRADE: Final[str] = constants.UniqueGiftInfoOrigin.UPGRADE - """:const:`telegram.constants.UniqueGiftInfoOrigin.UPGRADE`""" - TRANSFER: Final[str] = constants.UniqueGiftInfoOrigin.TRANSFER - """:const:`telegram.constants.UniqueGiftInfoOrigin.TRANSFER`""" - - __slots__ = ( - "gift", - "origin", - "owned_gift_id", - "transfer_star_count", - ) - - def __init__( - self, - gift: UniqueGift, - origin: str, - owned_gift_id: Optional[str] = None, - transfer_star_count: Optional[int] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - # Required - self.gift: UniqueGift = gift - self.origin: str = enum.get_member(constants.UniqueGiftInfoOrigin, origin, origin) - # Optional - self.owned_gift_id: Optional[str] = owned_gift_id - self.transfer_star_count: Optional[int] = transfer_star_count - - self._id_attrs = (self.gift, self.origin) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "UniqueGiftInfo": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["gift"] = de_json_optional(data.get("gift"), UniqueGift, bot) - - return super().de_json(data=data, bot=bot) diff --git a/venv/lib/python3.12/site-packages/telegram/_update.py b/venv/lib/python3.12/site-packages/telegram/_update.py deleted file mode 100644 index d1627ff..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_update.py +++ /dev/null @@ -1,813 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram Update.""" - -from typing import TYPE_CHECKING, Final, Optional, Union - -from telegram import constants -from telegram._business import BusinessConnection, BusinessMessagesDeleted -from telegram._callbackquery import CallbackQuery -from telegram._chatboost import ChatBoostRemoved, ChatBoostUpdated -from telegram._chatjoinrequest import ChatJoinRequest -from telegram._chatmemberupdated import ChatMemberUpdated -from telegram._choseninlineresult import ChosenInlineResult -from telegram._inline.inlinequery import InlineQuery -from telegram._message import Message -from telegram._messagereactionupdated import MessageReactionCountUpdated, MessageReactionUpdated -from telegram._paidmedia import PaidMediaPurchased -from telegram._payment.precheckoutquery import PreCheckoutQuery -from telegram._payment.shippingquery import ShippingQuery -from telegram._poll import Poll, PollAnswer -from telegram._telegramobject import TelegramObject -from telegram._utils.argumentparsing import de_json_optional -from telegram._utils.types import JSONDict -from telegram._utils.warnings import warn - -if TYPE_CHECKING: - from telegram import Bot, Chat, User - - -class Update(TelegramObject): - """This object represents an incoming update. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`update_id` is equal. - - Note: - At most one of the optional parameters can be present in any given update. - - .. seealso:: :wiki:`Your First Bot <Extensions---Your-first-Bot>` - - Args: - update_id (:obj:`int`): The update's unique identifier. Update identifiers start from a - certain positive number and increase sequentially. This ID becomes especially handy if - you're using Webhooks, since it allows you to ignore repeated updates or to restore the - correct update sequence, should they get out of order. If there are no new updates for - at least a week, then identifier of the next update will be chosen randomly instead of - sequentially. - message (:class:`telegram.Message`, optional): New incoming message of any kind - text, - photo, sticker, etc. - edited_message (:class:`telegram.Message`, optional): New version of a message that is - known to the bot and was edited. This update may at times be triggered by changes to - message fields that are either unavailable or not actively used by your bot. - channel_post (:class:`telegram.Message`, optional): New incoming channel post of any kind - - text, photo, sticker, etc. - edited_channel_post (:class:`telegram.Message`, optional): New version of a channel post - that is known to the bot and was edited. This update may at times be triggered by - changes to message fields that are either unavailable or not actively used by your bot. - inline_query (:class:`telegram.InlineQuery`, optional): New incoming inline query. - chosen_inline_result (:class:`telegram.ChosenInlineResult`, optional): The result of an - inline query that was chosen by a user and sent to their chat partner. - callback_query (:class:`telegram.CallbackQuery`, optional): New incoming callback query. - shipping_query (:class:`telegram.ShippingQuery`, optional): New incoming shipping query. - Only for invoices with flexible price. - pre_checkout_query (:class:`telegram.PreCheckoutQuery`, optional): New incoming - pre-checkout query. Contains full information about checkout. - poll (:class:`telegram.Poll`, optional): New poll state. Bots receive only updates about - manually stopped polls and polls, which are sent by the bot. - poll_answer (:class:`telegram.PollAnswer`, optional): A user changed their answer - in a non-anonymous poll. Bots receive new votes only in polls that were sent - by the bot itself. - my_chat_member (:class:`telegram.ChatMemberUpdated`, optional): The bot's chat member - status was updated in a chat. For private chats, this update is received only when the - bot is blocked or unblocked by the user. - - .. versionadded:: 13.4 - chat_member (:class:`telegram.ChatMemberUpdated`, optional): A chat member's status was - updated in a chat. The bot must be an administrator in the chat and must explicitly - specify :attr:`CHAT_MEMBER` in the list of - :paramref:`telegram.ext.Application.run_polling.allowed_updates` to receive these - updates (see :meth:`telegram.Bot.get_updates`, :meth:`telegram.Bot.set_webhook`, - :meth:`telegram.ext.Application.run_polling` and - :meth:`telegram.ext.Application.run_webhook`). - - .. versionadded:: 13.4 - chat_join_request (:class:`telegram.ChatJoinRequest`, optional): A request to join the - chat has been sent. The bot must have the - :attr:`telegram.ChatPermissions.can_invite_users` administrator right in the chat to - receive these updates. - - .. versionadded:: 13.8 - - chat_boost (:class:`telegram.ChatBoostUpdated`, optional): A chat boost was added or - changed. The bot must be an administrator in the chat to receive these updates. - - .. versionadded:: 20.8 - - removed_chat_boost (:class:`telegram.ChatBoostRemoved`, optional): A boost was removed from - a chat. The bot must be an administrator in the chat to receive these updates. - - .. versionadded:: 20.8 - - message_reaction (:class:`telegram.MessageReactionUpdated`, optional): A reaction to a - message was changed by a user. The bot must be an administrator in the chat and must - explicitly specify :attr:`MESSAGE_REACTION` in the list of - :paramref:`telegram.ext.Application.run_polling.allowed_updates` to receive these - updates (see :meth:`telegram.Bot.get_updates`, :meth:`telegram.Bot.set_webhook`, - :meth:`telegram.ext.Application.run_polling` and - :meth:`telegram.ext.Application.run_webhook`). The update isn't received for reactions - set by bots. - - .. versionadded:: 20.8 - - message_reaction_count (:class:`telegram.MessageReactionCountUpdated`, optional): Reactions - to a message with anonymous reactions were changed. The bot must be an administrator in - the chat and must explicitly specify :attr:`MESSAGE_REACTION_COUNT` in the list of - :paramref:`telegram.ext.Application.run_polling.allowed_updates` to receive these - updates (see :meth:`telegram.Bot.get_updates`, :meth:`telegram.Bot.set_webhook`, - :meth:`telegram.ext.Application.run_polling` and - :meth:`telegram.ext.Application.run_webhook`). The updates are grouped and can be sent - with delay up to a few minutes. - - .. versionadded:: 20.8 - - business_connection (:class:`telegram.BusinessConnection`, optional): The bot was connected - to or disconnected from a business account, or a user edited an existing connection - with the bot. - - .. versionadded:: 21.1 - - business_message (:class:`telegram.Message`, optional): New message from a connected - business account. - - .. versionadded:: 21.1 - - edited_business_message (:class:`telegram.Message`, optional): New version of a message - from a connected business account. - - .. versionadded:: 21.1 - - deleted_business_messages (:class:`telegram.BusinessMessagesDeleted`, optional): Messages - were deleted from a connected business account. - - .. versionadded:: 21.1 - - purchased_paid_media (:class:`telegram.PaidMediaPurchased`, optional): A user purchased - paid media with a non-empty payload sent by the bot in a non-channel chat. - - .. versionadded:: 21.6 - - - Attributes: - update_id (:obj:`int`): The update's unique identifier. Update identifiers start from a - certain positive number and increase sequentially. This ID becomes especially handy if - you're using Webhooks, since it allows you to ignore repeated updates or to restore the - correct update sequence, should they get out of order. If there are no new updates for - at least a week, then identifier of the next update will be chosen randomly instead of - sequentially. - message (:class:`telegram.Message`): Optional. New incoming message of any kind - text, - photo, sticker, etc. - edited_message (:class:`telegram.Message`): Optional. New version of a message that is - known to the bot and was edited. This update may at times be triggered by changes to - message fields that are either unavailable or not actively used by your bot. - channel_post (:class:`telegram.Message`): Optional. New incoming channel post of any kind - - text, photo, sticker, etc. - edited_channel_post (:class:`telegram.Message`): Optional. New version of a channel post - that is known to the bot and was edited. This update may at times be triggered by - changes to message fields that are either unavailable or not actively used by your bot. - inline_query (:class:`telegram.InlineQuery`): Optional. New incoming inline query. - chosen_inline_result (:class:`telegram.ChosenInlineResult`): Optional. The result of an - inline query that was chosen by a user and sent to their chat partner. - callback_query (:class:`telegram.CallbackQuery`): Optional. New incoming callback query. - - Examples: - :any:`Arbitrary Callback Data Bot <examples.arbitrarycallbackdatabot>` - shipping_query (:class:`telegram.ShippingQuery`): Optional. New incoming shipping query. - Only for invoices with flexible price. - pre_checkout_query (:class:`telegram.PreCheckoutQuery`): Optional. New incoming - pre-checkout query. Contains full information about checkout. - poll (:class:`telegram.Poll`): Optional. New poll state. Bots receive only updates about - manually stopped polls and polls, which are sent by the bot. - poll_answer (:class:`telegram.PollAnswer`): Optional. A user changed their answer - in a non-anonymous poll. Bots receive new votes only in polls that were sent - by the bot itself. - my_chat_member (:class:`telegram.ChatMemberUpdated`): Optional. The bot's chat member - status was updated in a chat. For private chats, this update is received only when the - bot is blocked or unblocked by the user. - - .. versionadded:: 13.4 - chat_member (:class:`telegram.ChatMemberUpdated`): Optional. A chat member's status was - updated in a chat. The bot must be an administrator in the chat and must explicitly - specify :attr:`CHAT_MEMBER` in the list of - :paramref:`telegram.ext.Application.run_polling.allowed_updates` to receive these - updates (see :meth:`telegram.Bot.get_updates`, :meth:`telegram.Bot.set_webhook`, - :meth:`telegram.ext.Application.run_polling` and - :meth:`telegram.ext.Application.run_webhook`). - - .. versionadded:: 13.4 - chat_join_request (:class:`telegram.ChatJoinRequest`): Optional. A request to join the - chat has been sent. The bot must have the - :attr:`telegram.ChatPermissions.can_invite_users` administrator right in the chat to - receive these updates. - - .. versionadded:: 13.8 - - chat_boost (:class:`telegram.ChatBoostUpdated`): Optional. A chat boost was added or - changed. The bot must be an administrator in the chat to receive these updates. - - .. versionadded:: 20.8 - - removed_chat_boost (:class:`telegram.ChatBoostRemoved`): Optional. A boost was removed from - a chat. The bot must be an administrator in the chat to receive these updates. - - .. versionadded:: 20.8 - - message_reaction (:class:`telegram.MessageReactionUpdated`): Optional. A reaction to a - message was changed by a user. The bot must be an administrator in the chat and must - explicitly specify :attr:`MESSAGE_REACTION` in the list of - :paramref:`telegram.ext.Application.run_polling.allowed_updates` to receive these - updates (see :meth:`telegram.Bot.get_updates`, :meth:`telegram.Bot.set_webhook`, - :meth:`telegram.ext.Application.run_polling` and - :meth:`telegram.ext.Application.run_webhook`). The update isn't received for reactions - set by bots. - - .. versionadded:: 20.8 - - message_reaction_count (:class:`telegram.MessageReactionCountUpdated`): Optional. Reactions - to a message with anonymous reactions were changed. The bot must be an administrator in - the chat and must explicitly specify :attr:`MESSAGE_REACTION_COUNT` in the list of - :paramref:`telegram.ext.Application.run_polling.allowed_updates` to receive these - updates (see :meth:`telegram.Bot.get_updates`, :meth:`telegram.Bot.set_webhook`, - :meth:`telegram.ext.Application.run_polling` and - :meth:`telegram.ext.Application.run_webhook`). The updates are grouped and can be sent - with delay up to a few minutes. - - .. versionadded:: 20.8 - - business_connection (:class:`telegram.BusinessConnection`): Optional. The bot was connected - to or disconnected from a business account, or a user edited an existing connection - with the bot. - - .. versionadded:: 21.1 - - business_message (:class:`telegram.Message`): Optional. New message from a connected - business account. - - .. versionadded:: 21.1 - - edited_business_message (:class:`telegram.Message`): Optional. New version of a message - from a connected business account. - - .. versionadded:: 21.1 - - deleted_business_messages (:class:`telegram.BusinessMessagesDeleted`): Optional. Messages - were deleted from a connected business account. - - .. versionadded:: 21.1 - - purchased_paid_media (:class:`telegram.PaidMediaPurchased`): Optional. A user purchased - paid media with a non-empty payload sent by the bot in a non-channel chat. - - .. versionadded:: 21.6 - """ - - __slots__ = ( - "_effective_chat", - "_effective_message", - "_effective_sender", - "_effective_user", - "business_connection", - "business_message", - "callback_query", - "channel_post", - "chat_boost", - "chat_join_request", - "chat_member", - "chosen_inline_result", - "deleted_business_messages", - "edited_business_message", - "edited_channel_post", - "edited_message", - "inline_query", - "message", - "message_reaction", - "message_reaction_count", - "my_chat_member", - "poll", - "poll_answer", - "pre_checkout_query", - "purchased_paid_media", - "removed_chat_boost", - "shipping_query", - "update_id", - ) - - MESSAGE: Final[str] = constants.UpdateType.MESSAGE - """:const:`telegram.constants.UpdateType.MESSAGE` - - .. versionadded:: 13.5""" - EDITED_MESSAGE: Final[str] = constants.UpdateType.EDITED_MESSAGE - """:const:`telegram.constants.UpdateType.EDITED_MESSAGE` - - .. versionadded:: 13.5""" - CHANNEL_POST: Final[str] = constants.UpdateType.CHANNEL_POST - """:const:`telegram.constants.UpdateType.CHANNEL_POST` - - .. versionadded:: 13.5""" - EDITED_CHANNEL_POST: Final[str] = constants.UpdateType.EDITED_CHANNEL_POST - """:const:`telegram.constants.UpdateType.EDITED_CHANNEL_POST` - - .. versionadded:: 13.5""" - INLINE_QUERY: Final[str] = constants.UpdateType.INLINE_QUERY - """:const:`telegram.constants.UpdateType.INLINE_QUERY` - - .. versionadded:: 13.5""" - CHOSEN_INLINE_RESULT: Final[str] = constants.UpdateType.CHOSEN_INLINE_RESULT - """:const:`telegram.constants.UpdateType.CHOSEN_INLINE_RESULT` - - .. versionadded:: 13.5""" - CALLBACK_QUERY: Final[str] = constants.UpdateType.CALLBACK_QUERY - """:const:`telegram.constants.UpdateType.CALLBACK_QUERY` - - .. versionadded:: 13.5""" - SHIPPING_QUERY: Final[str] = constants.UpdateType.SHIPPING_QUERY - """:const:`telegram.constants.UpdateType.SHIPPING_QUERY` - - .. versionadded:: 13.5""" - PRE_CHECKOUT_QUERY: Final[str] = constants.UpdateType.PRE_CHECKOUT_QUERY - """:const:`telegram.constants.UpdateType.PRE_CHECKOUT_QUERY` - - .. versionadded:: 13.5""" - POLL: Final[str] = constants.UpdateType.POLL - """:const:`telegram.constants.UpdateType.POLL` - - .. versionadded:: 13.5""" - POLL_ANSWER: Final[str] = constants.UpdateType.POLL_ANSWER - """:const:`telegram.constants.UpdateType.POLL_ANSWER` - - .. versionadded:: 13.5""" - MY_CHAT_MEMBER: Final[str] = constants.UpdateType.MY_CHAT_MEMBER - """:const:`telegram.constants.UpdateType.MY_CHAT_MEMBER` - - .. versionadded:: 13.5""" - CHAT_MEMBER: Final[str] = constants.UpdateType.CHAT_MEMBER - """:const:`telegram.constants.UpdateType.CHAT_MEMBER` - - .. versionadded:: 13.5""" - CHAT_JOIN_REQUEST: Final[str] = constants.UpdateType.CHAT_JOIN_REQUEST - """:const:`telegram.constants.UpdateType.CHAT_JOIN_REQUEST` - - .. versionadded:: 13.8""" - CHAT_BOOST: Final[str] = constants.UpdateType.CHAT_BOOST - """:const:`telegram.constants.UpdateType.CHAT_BOOST` - - .. versionadded:: 20.8""" - REMOVED_CHAT_BOOST: Final[str] = constants.UpdateType.REMOVED_CHAT_BOOST - """:const:`telegram.constants.UpdateType.REMOVED_CHAT_BOOST` - - .. versionadded:: 20.8""" - MESSAGE_REACTION: Final[str] = constants.UpdateType.MESSAGE_REACTION - """:const:`telegram.constants.UpdateType.MESSAGE_REACTION` - - .. versionadded:: 20.8""" - MESSAGE_REACTION_COUNT: Final[str] = constants.UpdateType.MESSAGE_REACTION_COUNT - """:const:`telegram.constants.UpdateType.MESSAGE_REACTION_COUNT` - - .. versionadded:: 20.8""" - BUSINESS_CONNECTION: Final[str] = constants.UpdateType.BUSINESS_CONNECTION - """:const:`telegram.constants.UpdateType.BUSINESS_CONNECTION` - - .. versionadded:: 21.1""" - BUSINESS_MESSAGE: Final[str] = constants.UpdateType.BUSINESS_MESSAGE - """:const:`telegram.constants.UpdateType.BUSINESS_MESSAGE` - - .. versionadded:: 21.1""" - EDITED_BUSINESS_MESSAGE: Final[str] = constants.UpdateType.EDITED_BUSINESS_MESSAGE - """:const:`telegram.constants.UpdateType.EDITED_BUSINESS_MESSAGE` - - .. versionadded:: 21.1""" - DELETED_BUSINESS_MESSAGES: Final[str] = constants.UpdateType.DELETED_BUSINESS_MESSAGES - """:const:`telegram.constants.UpdateType.DELETED_BUSINESS_MESSAGES` - - .. versionadded:: 21.1""" - - PURCHASED_PAID_MEDIA: Final[str] = constants.UpdateType.PURCHASED_PAID_MEDIA - """:const:`telegram.constants.UpdateType.PURCHASED_PAID_MEDIA` - - .. versionadded:: 21.6 - """ - - ALL_TYPES: Final[list[str]] = list(constants.UpdateType) - """list[:obj:`str`]: A list of all available update types. - - .. versionadded:: 13.5""" - - def __init__( - self, - update_id: int, - message: Optional[Message] = None, - edited_message: Optional[Message] = None, - channel_post: Optional[Message] = None, - edited_channel_post: Optional[Message] = None, - inline_query: Optional[InlineQuery] = None, - chosen_inline_result: Optional[ChosenInlineResult] = None, - callback_query: Optional[CallbackQuery] = None, - shipping_query: Optional[ShippingQuery] = None, - pre_checkout_query: Optional[PreCheckoutQuery] = None, - poll: Optional[Poll] = None, - poll_answer: Optional[PollAnswer] = None, - my_chat_member: Optional[ChatMemberUpdated] = None, - chat_member: Optional[ChatMemberUpdated] = None, - chat_join_request: Optional[ChatJoinRequest] = None, - chat_boost: Optional[ChatBoostUpdated] = None, - removed_chat_boost: Optional[ChatBoostRemoved] = None, - message_reaction: Optional[MessageReactionUpdated] = None, - message_reaction_count: Optional[MessageReactionCountUpdated] = None, - business_connection: Optional[BusinessConnection] = None, - business_message: Optional[Message] = None, - edited_business_message: Optional[Message] = None, - deleted_business_messages: Optional[BusinessMessagesDeleted] = None, - purchased_paid_media: Optional[PaidMediaPurchased] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - # Required - self.update_id: int = update_id - # Optionals - self.message: Optional[Message] = message - self.edited_message: Optional[Message] = edited_message - self.inline_query: Optional[InlineQuery] = inline_query - self.chosen_inline_result: Optional[ChosenInlineResult] = chosen_inline_result - self.callback_query: Optional[CallbackQuery] = callback_query - self.shipping_query: Optional[ShippingQuery] = shipping_query - self.pre_checkout_query: Optional[PreCheckoutQuery] = pre_checkout_query - self.channel_post: Optional[Message] = channel_post - self.edited_channel_post: Optional[Message] = edited_channel_post - self.poll: Optional[Poll] = poll - self.poll_answer: Optional[PollAnswer] = poll_answer - self.my_chat_member: Optional[ChatMemberUpdated] = my_chat_member - self.chat_member: Optional[ChatMemberUpdated] = chat_member - self.chat_join_request: Optional[ChatJoinRequest] = chat_join_request - self.chat_boost: Optional[ChatBoostUpdated] = chat_boost - self.removed_chat_boost: Optional[ChatBoostRemoved] = removed_chat_boost - self.message_reaction: Optional[MessageReactionUpdated] = message_reaction - self.message_reaction_count: Optional[MessageReactionCountUpdated] = message_reaction_count - self.business_connection: Optional[BusinessConnection] = business_connection - self.business_message: Optional[Message] = business_message - self.edited_business_message: Optional[Message] = edited_business_message - self.deleted_business_messages: Optional[BusinessMessagesDeleted] = ( - deleted_business_messages - ) - self.purchased_paid_media: Optional[PaidMediaPurchased] = purchased_paid_media - - self._effective_user: Optional[User] = None - self._effective_sender: Optional[Union[User, Chat]] = None - self._effective_chat: Optional[Chat] = None - self._effective_message: Optional[Message] = None - - self._id_attrs = (self.update_id,) - - self._freeze() - - @property - def effective_user(self) -> Optional["User"]: - """ - :class:`telegram.User`: The user that sent this update, no matter what kind of update this - is. If no user is associated with this update, this gives :obj:`None`. This is the case - if any of - - * :attr:`channel_post` - * :attr:`edited_channel_post` - * :attr:`poll` - * :attr:`chat_boost` - * :attr:`removed_chat_boost` - * :attr:`message_reaction_count` - * :attr:`deleted_business_messages` - - is present. - - .. versionchanged:: 21.1 - This property now also considers :attr:`business_connection`, :attr:`business_message` - and :attr:`edited_business_message`. - - .. versionchanged:: 21.6 - This property now also considers :attr:`purchased_paid_media`. - - Example: - * If :attr:`message` is present, this will give - :attr:`telegram.Message.from_user`. - * If :attr:`poll_answer` is present, this will give :attr:`telegram.PollAnswer.user`. - - """ - if self._effective_user: - return self._effective_user - - user = None - - if self.message: - user = self.message.from_user - - elif self.edited_message: - user = self.edited_message.from_user - - elif self.inline_query: - user = self.inline_query.from_user - - elif self.chosen_inline_result: - user = self.chosen_inline_result.from_user - - elif self.callback_query: - user = self.callback_query.from_user - - elif self.shipping_query: - user = self.shipping_query.from_user - - elif self.pre_checkout_query: - user = self.pre_checkout_query.from_user - - elif self.poll_answer: - user = self.poll_answer.user - - elif self.my_chat_member: - user = self.my_chat_member.from_user - - elif self.chat_member: - user = self.chat_member.from_user - - elif self.chat_join_request: - user = self.chat_join_request.from_user - - elif self.message_reaction: - user = self.message_reaction.user - - elif self.business_message: - user = self.business_message.from_user - - elif self.edited_business_message: - user = self.edited_business_message.from_user - - elif self.business_connection: - user = self.business_connection.user - - elif self.purchased_paid_media: - user = self.purchased_paid_media.from_user - - self._effective_user = user - return user - - @property - def effective_sender(self) -> Optional[Union["User", "Chat"]]: - """ - :class:`telegram.User` or :class:`telegram.Chat`: The user or chat that sent this update, - no matter what kind of update this is. - - Note: - * Depending on the type of update and the user's 'Remain anonymous' setting, this - could either be :class:`telegram.User`, :class:`telegram.Chat` or :obj:`None`. - - If no user whatsoever is associated with this update, this gives :obj:`None`. This - is the case if any of - - * :attr:`poll` - * :attr:`chat_boost` - * :attr:`removed_chat_boost` - * :attr:`message_reaction_count` - * :attr:`deleted_business_messages` - - is present. - - Example: - * If :attr:`message` is present, this will give either - :attr:`telegram.Message.from_user` or :attr:`telegram.Message.sender_chat`. - * If :attr:`poll_answer` is present, this will give either - :attr:`telegram.PollAnswer.user` or :attr:`telegram.PollAnswer.voter_chat`. - * If :attr:`channel_post` is present, this will give - :attr:`telegram.Message.sender_chat`. - - .. versionadded:: 21.1 - """ - if self._effective_sender: - return self._effective_sender - - sender: Optional[Union[User, Chat]] = None - - if message := ( - self.message - or self.edited_message - or self.channel_post - or self.edited_channel_post - or self.business_message - or self.edited_business_message - ): - sender = message.sender_chat - - elif self.poll_answer: - sender = self.poll_answer.voter_chat - - elif self.message_reaction: - sender = self.message_reaction.actor_chat - - if sender is None: - sender = self.effective_user - - self._effective_sender = sender - return sender - - @property - def effective_chat(self) -> Optional["Chat"]: - """ - :class:`telegram.Chat`: The chat that this update was sent in, no matter what kind of - update this is. - If no chat is associated with this update, this gives :obj:`None`. - This is the case, if :attr:`inline_query`, - :attr:`chosen_inline_result`, :attr:`callback_query` from inline messages, - :attr:`shipping_query`, :attr:`pre_checkout_query`, :attr:`poll`, - :attr:`poll_answer`, :attr:`business_connection`, or :attr:`purchased_paid_media` - is present. - - .. versionchanged:: 21.1 - This property now also considers :attr:`business_message`, - :attr:`edited_business_message`, and :attr:`deleted_business_messages`. - - Example: - If :attr:`message` is present, this will give :attr:`telegram.Message.chat`. - - """ - if self._effective_chat: - return self._effective_chat - - chat = None - - if self.message: - chat = self.message.chat - - elif self.edited_message: - chat = self.edited_message.chat - - elif self.callback_query and self.callback_query.message: - chat = self.callback_query.message.chat - - elif self.channel_post: - chat = self.channel_post.chat - - elif self.edited_channel_post: - chat = self.edited_channel_post.chat - - elif self.my_chat_member: - chat = self.my_chat_member.chat - - elif self.chat_member: - chat = self.chat_member.chat - - elif self.chat_join_request: - chat = self.chat_join_request.chat - - elif self.chat_boost: - chat = self.chat_boost.chat - - elif self.removed_chat_boost: - chat = self.removed_chat_boost.chat - - elif self.message_reaction: - chat = self.message_reaction.chat - - elif self.message_reaction_count: - chat = self.message_reaction_count.chat - - elif self.business_message: - chat = self.business_message.chat - - elif self.edited_business_message: - chat = self.edited_business_message.chat - - elif self.deleted_business_messages: - chat = self.deleted_business_messages.chat - - self._effective_chat = chat - return chat - - @property - def effective_message(self) -> Optional[Message]: - """ - :class:`telegram.Message`: The message included in this update, no matter what kind of - update this is. More precisely, this will be the message contained in :attr:`message`, - :attr:`edited_message`, :attr:`channel_post`, :attr:`edited_channel_post` or - :attr:`callback_query` (i.e. :attr:`telegram.CallbackQuery.message`) or :obj:`None`, if - none of those are present. - - .. versionchanged:: 21.1 - This property now also considers :attr:`business_message`, and - :attr:`edited_business_message`. - - Tip: - This property will only ever return objects of type :class:`telegram.Message` or - :obj:`None`, never :class:`telegram.MaybeInaccessibleMessage` or - :class:`telegram.InaccessibleMessage`. - Currently, this is only relevant for :attr:`callback_query`, as - :attr:`telegram.CallbackQuery.message` is the only attribute considered by this - property that can be an object of these types. - """ - if self._effective_message: - return self._effective_message - - message: Optional[Message] = None - - if self.message: - message = self.message - - elif self.edited_message: - message = self.edited_message - - elif self.callback_query: - if ( - isinstance(cbq_message := self.callback_query.message, Message) - or cbq_message is None - ): - message = cbq_message - else: - warn( - ( - "`update.callback_query` is not `None`, but of type " - f"`{cbq_message.__class__.__name__}`. This is not considered by " - "`Update.effective_message`. Please manually access this attribute " - "if necessary." - ), - stacklevel=2, - ) - - elif self.channel_post: - message = self.channel_post - - elif self.edited_channel_post: - message = self.edited_channel_post - - elif self.business_message: - message = self.business_message - - elif self.edited_business_message: - message = self.edited_business_message - - self._effective_message = message - return message - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "Update": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["message"] = de_json_optional(data.get("message"), Message, bot) - data["edited_message"] = de_json_optional(data.get("edited_message"), Message, bot) - data["inline_query"] = de_json_optional(data.get("inline_query"), InlineQuery, bot) - data["chosen_inline_result"] = de_json_optional( - data.get("chosen_inline_result"), ChosenInlineResult, bot - ) - data["callback_query"] = de_json_optional(data.get("callback_query"), CallbackQuery, bot) - data["shipping_query"] = de_json_optional(data.get("shipping_query"), ShippingQuery, bot) - data["pre_checkout_query"] = de_json_optional( - data.get("pre_checkout_query"), PreCheckoutQuery, bot - ) - data["channel_post"] = de_json_optional(data.get("channel_post"), Message, bot) - data["edited_channel_post"] = de_json_optional( - data.get("edited_channel_post"), Message, bot - ) - data["poll"] = de_json_optional(data.get("poll"), Poll, bot) - data["poll_answer"] = de_json_optional(data.get("poll_answer"), PollAnswer, bot) - data["my_chat_member"] = de_json_optional( - data.get("my_chat_member"), ChatMemberUpdated, bot - ) - data["chat_member"] = de_json_optional(data.get("chat_member"), ChatMemberUpdated, bot) - data["chat_join_request"] = de_json_optional( - data.get("chat_join_request"), ChatJoinRequest, bot - ) - data["chat_boost"] = de_json_optional(data.get("chat_boost"), ChatBoostUpdated, bot) - data["removed_chat_boost"] = de_json_optional( - data.get("removed_chat_boost"), ChatBoostRemoved, bot - ) - data["message_reaction"] = de_json_optional( - data.get("message_reaction"), MessageReactionUpdated, bot - ) - data["message_reaction_count"] = de_json_optional( - data.get("message_reaction_count"), MessageReactionCountUpdated, bot - ) - data["business_connection"] = de_json_optional( - data.get("business_connection"), BusinessConnection, bot - ) - data["business_message"] = de_json_optional(data.get("business_message"), Message, bot) - data["edited_business_message"] = de_json_optional( - data.get("edited_business_message"), Message, bot - ) - data["deleted_business_messages"] = de_json_optional( - data.get("deleted_business_messages"), BusinessMessagesDeleted, bot - ) - data["purchased_paid_media"] = de_json_optional( - data.get("purchased_paid_media"), PaidMediaPurchased, bot - ) - - return super().de_json(data=data, bot=bot) diff --git a/venv/lib/python3.12/site-packages/telegram/_user.py b/venv/lib/python3.12/site-packages/telegram/_user.py deleted file mode 100644 index ce6c3bb..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_user.py +++ /dev/null @@ -1,2399 +0,0 @@ -#!/usr/bin/env python -# pylint: disable=redefined-builtin -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram User.""" -import datetime as dtm -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional, Union - -from telegram._inline.inlinekeyboardbutton import InlineKeyboardButton -from telegram._menubutton import MenuButton -from telegram._telegramobject import TelegramObject -from telegram._utils.defaultvalue import DEFAULT_NONE -from telegram._utils.types import ( - CorrectOptionID, - FileInput, - JSONDict, - ODVInput, - ReplyMarkup, - TimePeriod, -) -from telegram.helpers import mention_html as helpers_mention_html -from telegram.helpers import mention_markdown as helpers_mention_markdown - -if TYPE_CHECKING: - from telegram import ( - Animation, - Audio, - Contact, - Document, - Gift, - InlineKeyboardMarkup, - InputMediaAudio, - InputMediaDocument, - InputMediaPhoto, - InputMediaVideo, - InputPollOption, - LabeledPrice, - LinkPreviewOptions, - Location, - Message, - MessageEntity, - MessageId, - PhotoSize, - ReplyParameters, - Sticker, - UserChatBoosts, - UserProfilePhotos, - Venue, - Video, - VideoNote, - Voice, - ) - - -class User(TelegramObject): - """This object represents a Telegram user or bot. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`id` is equal. - - .. versionchanged:: 20.0 - The following are now keyword-only arguments in Bot methods: - ``location``, ``filename``, ``venue``, ``contact``, - ``{read, write, connect, pool}_timeout`` ``api_kwargs``. Use a named argument for those, - and notice that some positional arguments changed position as a result. - - Args: - id (:obj:`int`): Unique identifier for this user or bot. - is_bot (:obj:`bool`): :obj:`True`, if this user is a bot. - first_name (:obj:`str`): User's or bot's first name. - last_name (:obj:`str`, optional): User's or bot's last name. - username (:obj:`str`, optional): User's or bot's username. - language_code (:obj:`str`, optional): IETF language tag of the user's language. - can_join_groups (:obj:`str`, optional): :obj:`True`, if the bot can be invited to groups. - Returned only in :meth:`telegram.Bot.get_me`. - can_read_all_group_messages (:obj:`str`, optional): :obj:`True`, if privacy mode is - disabled for the bot. Returned only in :meth:`telegram.Bot.get_me`. - supports_inline_queries (:obj:`str`, optional): :obj:`True`, if the bot supports inline - queries. Returned only in :meth:`telegram.Bot.get_me`. - - is_premium (:obj:`bool`, optional): :obj:`True`, if this user is a Telegram Premium user. - - .. versionadded:: 20.0 - added_to_attachment_menu (:obj:`bool`, optional): :obj:`True`, if this user added - the bot to the attachment menu. - - .. versionadded:: 20.0 - can_connect_to_business (:obj:`bool`, optional): :obj:`True`, if the bot can be connected - to a Telegram Business account to receive its messages. Returned only in - :meth:`telegram.Bot.get_me`. - - .. versionadded:: 21.1 - has_main_web_app (:obj:`bool`, optional): :obj:`True`, if the bot has the main Web App. - Returned only in :meth:`telegram.Bot.get_me`. - - .. versionadded:: 21.5 - - Attributes: - id (:obj:`int`): Unique identifier for this user or bot. - is_bot (:obj:`bool`): :obj:`True`, if this user is a bot. - first_name (:obj:`str`): User's or bot's first name. - last_name (:obj:`str`): Optional. User's or bot's last name. - username (:obj:`str`): Optional. User's or bot's username. - language_code (:obj:`str`): Optional. IETF language tag of the user's language. - can_join_groups (:obj:`str`): Optional. :obj:`True`, if the bot can be invited to groups. - Returned only in :attr:`telegram.Bot.get_me` requests. - can_read_all_group_messages (:obj:`str`): Optional. :obj:`True`, if privacy mode is - disabled for the bot. Returned only in :attr:`telegram.Bot.get_me` requests. - supports_inline_queries (:obj:`str`): Optional. :obj:`True`, if the bot supports inline - queries. Returned only in :attr:`telegram.Bot.get_me` requests. - is_premium (:obj:`bool`): Optional. :obj:`True`, if this user is a Telegram - Premium user. - - .. versionadded:: 20.0 - added_to_attachment_menu (:obj:`bool`): Optional. :obj:`True`, if this user added - the bot to the attachment menu. - - .. versionadded:: 20.0 - can_connect_to_business (:obj:`bool`): Optional. :obj:`True`, if the bot can be connected - to a Telegram Business account to receive its messages. Returned only in - :meth:`telegram.Bot.get_me`. - - .. versionadded:: 21.1 - has_main_web_app (:obj:`bool`) Optional. :obj:`True`, if the bot has the main Web App. - Returned only in :meth:`telegram.Bot.get_me`. - - .. versionadded:: 21.5 - - .. |user_chat_id_note| replace:: This shortcuts build on the assumption that :attr:`User.id` - coincides with the :attr:`Chat.id` of the private chat with the user. This has been the - case so far, but Telegram does not guarantee that this stays this way. - """ - - __slots__ = ( - "added_to_attachment_menu", - "can_connect_to_business", - "can_join_groups", - "can_read_all_group_messages", - "first_name", - "has_main_web_app", - "id", - "is_bot", - "is_premium", - "language_code", - "last_name", - "supports_inline_queries", - "username", - ) - - def __init__( - self, - id: int, - first_name: str, - is_bot: bool, - last_name: Optional[str] = None, - username: Optional[str] = None, - language_code: Optional[str] = None, - can_join_groups: Optional[bool] = None, - can_read_all_group_messages: Optional[bool] = None, - supports_inline_queries: Optional[bool] = None, - is_premium: Optional[bool] = None, - added_to_attachment_menu: Optional[bool] = None, - can_connect_to_business: Optional[bool] = None, - has_main_web_app: Optional[bool] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - # Required - self.id: int = id - self.first_name: str = first_name - self.is_bot: bool = is_bot - # Optionals - self.last_name: Optional[str] = last_name - self.username: Optional[str] = username - self.language_code: Optional[str] = language_code - self.can_join_groups: Optional[bool] = can_join_groups - self.can_read_all_group_messages: Optional[bool] = can_read_all_group_messages - self.supports_inline_queries: Optional[bool] = supports_inline_queries - self.is_premium: Optional[bool] = is_premium - self.added_to_attachment_menu: Optional[bool] = added_to_attachment_menu - self.can_connect_to_business: Optional[bool] = can_connect_to_business - self.has_main_web_app: Optional[bool] = has_main_web_app - - self._id_attrs = (self.id,) - - self._freeze() - - @property - def name(self) -> str: - """:obj:`str`: Convenience property. If available, returns the user's :attr:`username` - prefixed with "@". If :attr:`username` is not available, returns :attr:`full_name`. - """ - if self.username: - return f"@{self.username}" - return self.full_name - - @property - def full_name(self) -> str: - """:obj:`str`: Convenience property. The user's :attr:`first_name`, followed by (if - available) :attr:`last_name`. - """ - if self.last_name: - return f"{self.first_name} {self.last_name}" - return self.first_name - - @property - def link(self) -> Optional[str]: - """:obj:`str`: Convenience property. If :attr:`username` is available, returns a t.me link - of the user. - """ - if self.username: - return f"https://t.me/{self.username}" - return None - - async def get_profile_photos( - self, - offset: Optional[int] = None, - limit: Optional[int] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Optional["UserProfilePhotos"]: - """Shortcut for:: - - await bot.get_user_profile_photos(update.effective_user.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.get_user_profile_photos`. - - Returns: - :class:`telegram.UserProfilePhotos` - - """ - return await self.get_bot().get_user_profile_photos( - user_id=self.id, - offset=offset, - limit=limit, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - def mention_markdown(self, name: Optional[str] = None) -> str: - """ - Note: - :tg-const:`telegram.constants.ParseMode.MARKDOWN` is a legacy mode, retained by - Telegram for backward compatibility. You should use :meth:`mention_markdown_v2` - instead. - - Args: - name (:obj:`str`): The name used as a link for the user. Defaults to :attr:`full_name`. - - Returns: - :obj:`str`: The inline mention for the user as markdown (version 1). - - """ - if name: - return helpers_mention_markdown(self.id, name) - return helpers_mention_markdown(self.id, self.full_name) - - def mention_markdown_v2(self, name: Optional[str] = None) -> str: - """ - Args: - name (:obj:`str`): The name used as a link for the user. Defaults to :attr:`full_name`. - - Returns: - :obj:`str`: The inline mention for the user as markdown (version 2). - - """ - if name: - return helpers_mention_markdown(self.id, name, version=2) - return helpers_mention_markdown(self.id, self.full_name, version=2) - - def mention_html(self, name: Optional[str] = None) -> str: - """ - Args: - name (:obj:`str`): The name used as a link for the user. Defaults to :attr:`full_name`. - - Returns: - :obj:`str`: The inline mention for the user as HTML. - - """ - if name: - return helpers_mention_html(self.id, name) - return helpers_mention_html(self.id, self.full_name) - - def mention_button(self, name: Optional[str] = None) -> InlineKeyboardButton: - """Shortcut for:: - - InlineKeyboardButton(text=name, url=f"tg://user?id={update.effective_user.id}") - - .. versionadded:: 13.9 - - Args: - name (:obj:`str`): The name used as a link for the user. Defaults to :attr:`full_name`. - - Returns: - :class:`telegram.InlineKeyboardButton`: InlineButton with url set to the user mention - """ - return InlineKeyboardButton(text=name or self.full_name, url=f"tg://user?id={self.id}") - - async def pin_message( - self, - message_id: int, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - business_connection_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.pin_chat_message(chat_id=update.effective_user.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.pin_chat_message`. - - Note: - |user_chat_id_note| - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().pin_chat_message( - chat_id=self.id, - message_id=message_id, - disable_notification=disable_notification, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - business_connection_id=business_connection_id, - api_kwargs=api_kwargs, - ) - - async def unpin_message( - self, - message_id: Optional[int] = None, - business_connection_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.unpin_chat_message(chat_id=update.effective_user.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.unpin_chat_message`. - - Note: - |user_chat_id_note| - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().unpin_chat_message( - chat_id=self.id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - message_id=message_id, - business_connection_id=business_connection_id, - ) - - async def unpin_all_messages( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.unpin_all_chat_messages(chat_id=update.effective_user.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.unpin_all_chat_messages`. - - Note: - |user_chat_id_note| - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().unpin_all_chat_messages( - chat_id=self.id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def send_message( - self, - text: str, - parse_mode: ODVInput[str] = DEFAULT_NONE, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - link_preview_options: ODVInput["LinkPreviewOptions"] = DEFAULT_NONE, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - disable_web_page_preview: Optional[bool] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_message(update.effective_user.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_message`. - - Note: - |user_chat_id_note| - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().send_message( - chat_id=self.id, - text=text, - parse_mode=parse_mode, - disable_web_page_preview=disable_web_page_preview, - link_preview_options=link_preview_options, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - entities=entities, - protect_content=protect_content, - message_thread_id=message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def delete_message( - self, - message_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.delete_message(update.effective_user.id, *argss, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.delete_message`. - - .. versionadded:: 20.8 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().delete_message( - chat_id=self.id, - message_id=message_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def delete_messages( - self, - message_ids: Sequence[int], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.delete_messages(update.effective_user.id, *argss, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.delete_messages`. - - .. versionadded:: 20.8 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().delete_messages( - chat_id=self.id, - message_ids=message_ids, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def send_photo( - self, - photo: Union[FileInput, "PhotoSize"], - caption: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - has_spoiler: Optional[bool] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - show_caption_above_media: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - filename: Optional[str] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_photo(update.effective_user.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_photo`. - - Note: - |user_chat_id_note| - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().send_photo( - chat_id=self.id, - photo=photo, - caption=caption, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - parse_mode=parse_mode, - allow_sending_without_reply=allow_sending_without_reply, - caption_entities=caption_entities, - filename=filename, - protect_content=protect_content, - message_thread_id=message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - has_spoiler=has_spoiler, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - show_caption_above_media=show_caption_above_media, - ) - - async def send_media_group( - self, - media: Sequence[ - Union["InputMediaAudio", "InputMediaDocument", "InputMediaPhoto", "InputMediaVideo"] - ], - disable_notification: ODVInput[bool] = DEFAULT_NONE, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - caption: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - ) -> tuple["Message", ...]: - """Shortcut for:: - - await bot.send_media_group(update.effective_user.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_media_group`. - - Note: - |user_chat_id_note| - - Returns: - tuple[:class:`telegram.Message`:] On success, a tuple of :class:`~telegram.Message` - instances that were sent is returned. - - """ - return await self.get_bot().send_media_group( - chat_id=self.id, - media=media, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_audio( - self, - audio: Union[FileInput, "Audio"], - duration: Optional[TimePeriod] = None, - performer: Optional[str] = None, - title: Optional[str] = None, - caption: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - thumbnail: Optional[FileInput] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - filename: Optional[str] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_audio(update.effective_user.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_audio`. - - Note: - |user_chat_id_note| - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().send_audio( - chat_id=self.id, - audio=audio, - duration=duration, - performer=performer, - title=title, - caption=caption, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - parse_mode=parse_mode, - allow_sending_without_reply=allow_sending_without_reply, - caption_entities=caption_entities, - filename=filename, - protect_content=protect_content, - message_thread_id=message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - thumbnail=thumbnail, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_chat_action( - self, - action: str, - message_thread_id: Optional[int] = None, - business_connection_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.send_chat_action(update.effective_user.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_chat_action`. - - Note: - |user_chat_id_note| - - Returns: - :obj:`True`: On success. - - """ - return await self.get_bot().send_chat_action( - chat_id=self.id, - action=action, - message_thread_id=message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - business_connection_id=business_connection_id, - ) - - send_action = send_chat_action - """Alias for :attr:`send_chat_action`""" - - async def send_contact( - self, - phone_number: Optional[str] = None, - first_name: Optional[str] = None, - last_name: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - vcard: Optional[str] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - contact: Optional["Contact"] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_contact(update.effective_user.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_contact`. - - Note: - |user_chat_id_note| - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().send_contact( - chat_id=self.id, - phone_number=phone_number, - first_name=first_name, - last_name=last_name, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - contact=contact, - vcard=vcard, - api_kwargs=api_kwargs, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_dice( - self, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - emoji: Optional[str] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_dice(update.effective_user.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_dice`. - - Note: - |user_chat_id_note| - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().send_dice( - chat_id=self.id, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - emoji=emoji, - api_kwargs=api_kwargs, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_document( - self, - document: Union[FileInput, "Document"], - caption: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - disable_content_type_detection: Optional[bool] = None, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - thumbnail: Optional[FileInput] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - filename: Optional[str] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_document(update.effective_user.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_document`. - - Note: - |user_chat_id_note| - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().send_document( - chat_id=self.id, - document=document, - filename=filename, - caption=caption, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - parse_mode=parse_mode, - thumbnail=thumbnail, - api_kwargs=api_kwargs, - disable_content_type_detection=disable_content_type_detection, - allow_sending_without_reply=allow_sending_without_reply, - caption_entities=caption_entities, - protect_content=protect_content, - message_thread_id=message_thread_id, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_game( - self, - game_short_name: str, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_game(update.effective_user.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_game`. - - Note: - |user_chat_id_note| - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().send_game( - chat_id=self.id, - game_short_name=game_short_name, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_invoice( - self, - title: str, - description: str, - payload: str, - currency: str, - prices: Sequence["LabeledPrice"], - provider_token: Optional[str] = None, - start_parameter: Optional[str] = None, - photo_url: Optional[str] = None, - photo_size: Optional[int] = None, - photo_width: Optional[int] = None, - photo_height: Optional[int] = None, - need_name: Optional[bool] = None, - need_phone_number: Optional[bool] = None, - need_email: Optional[bool] = None, - need_shipping_address: Optional[bool] = None, - is_flexible: Optional[bool] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - provider_data: Optional[Union[str, object]] = None, - send_phone_number_to_provider: Optional[bool] = None, - send_email_to_provider: Optional[bool] = None, - max_tip_amount: Optional[int] = None, - suggested_tip_amounts: Optional[Sequence[int]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_invoice(update.effective_user.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_invoice`. - - Warning: - As of API 5.2 :paramref:`start_parameter <telegram.Bot.send_invoice.start_parameter>` - is an optional argument and therefore the - order of the arguments had to be changed. Use keyword arguments to make sure that the - arguments are passed correctly. - - Note: - |user_chat_id_note| - - .. versionchanged:: 13.5 - As of Bot API 5.2, the parameter - :paramref:`start_parameter <telegram.Bot.send_invoice.start_parameter>` is optional. - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().send_invoice( - chat_id=self.id, - title=title, - description=description, - payload=payload, - provider_token=provider_token, - currency=currency, - prices=prices, - start_parameter=start_parameter, - photo_url=photo_url, - photo_size=photo_size, - photo_width=photo_width, - photo_height=photo_height, - need_name=need_name, - need_phone_number=need_phone_number, - need_email=need_email, - need_shipping_address=need_shipping_address, - is_flexible=is_flexible, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - provider_data=provider_data, - send_phone_number_to_provider=send_phone_number_to_provider, - send_email_to_provider=send_email_to_provider, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - allow_sending_without_reply=allow_sending_without_reply, - max_tip_amount=max_tip_amount, - suggested_tip_amounts=suggested_tip_amounts, - protect_content=protect_content, - message_thread_id=message_thread_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_location( - self, - latitude: Optional[float] = None, - longitude: Optional[float] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - live_period: Optional[TimePeriod] = None, - horizontal_accuracy: Optional[float] = None, - heading: Optional[int] = None, - proximity_alert_radius: Optional[int] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - location: Optional["Location"] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_location(update.effective_user.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_location`. - - Note: - |user_chat_id_note| - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().send_location( - chat_id=self.id, - latitude=latitude, - longitude=longitude, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - location=location, - live_period=live_period, - api_kwargs=api_kwargs, - horizontal_accuracy=horizontal_accuracy, - heading=heading, - proximity_alert_radius=proximity_alert_radius, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_animation( - self, - animation: Union[FileInput, "Animation"], - duration: Optional[TimePeriod] = None, - width: Optional[int] = None, - height: Optional[int] = None, - caption: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - has_spoiler: Optional[bool] = None, - thumbnail: Optional[FileInput] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - show_caption_above_media: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - filename: Optional[str] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_animation(update.effective_user.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_animation`. - - Note: - |user_chat_id_note| - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().send_animation( - chat_id=self.id, - animation=animation, - duration=duration, - width=width, - height=height, - caption=caption, - parse_mode=parse_mode, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - allow_sending_without_reply=allow_sending_without_reply, - caption_entities=caption_entities, - filename=filename, - protect_content=protect_content, - message_thread_id=message_thread_id, - has_spoiler=has_spoiler, - thumbnail=thumbnail, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - show_caption_above_media=show_caption_above_media, - ) - - async def send_sticker( - self, - sticker: Union[FileInput, "Sticker"], - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - emoji: Optional[str] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_sticker(update.effective_user.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_sticker`. - - Note: - |user_chat_id_note| - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().send_sticker( - chat_id=self.id, - sticker=sticker, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - emoji=emoji, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_video( - self, - video: Union[FileInput, "Video"], - duration: Optional[TimePeriod] = None, - caption: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - width: Optional[int] = None, - height: Optional[int] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - supports_streaming: Optional[bool] = None, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - has_spoiler: Optional[bool] = None, - thumbnail: Optional[FileInput] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - show_caption_above_media: Optional[bool] = None, - cover: Optional[FileInput] = None, - start_timestamp: Optional[int] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - filename: Optional[str] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_video(update.effective_user.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_video`. - - Note: - |user_chat_id_note| - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().send_video( - chat_id=self.id, - video=video, - duration=duration, - caption=caption, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - width=width, - height=height, - parse_mode=parse_mode, - supports_streaming=supports_streaming, - thumbnail=thumbnail, - cover=cover, - start_timestamp=start_timestamp, - api_kwargs=api_kwargs, - allow_sending_without_reply=allow_sending_without_reply, - caption_entities=caption_entities, - filename=filename, - protect_content=protect_content, - message_thread_id=message_thread_id, - has_spoiler=has_spoiler, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - show_caption_above_media=show_caption_above_media, - ) - - async def send_venue( - self, - latitude: Optional[float] = None, - longitude: Optional[float] = None, - title: Optional[str] = None, - address: Optional[str] = None, - foursquare_id: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - foursquare_type: Optional[str] = None, - google_place_id: Optional[str] = None, - google_place_type: Optional[str] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - venue: Optional["Venue"] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_venue(update.effective_user.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_venue`. - - Note: - |user_chat_id_note| - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().send_venue( - chat_id=self.id, - latitude=latitude, - longitude=longitude, - title=title, - address=address, - foursquare_id=foursquare_id, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - venue=venue, - foursquare_type=foursquare_type, - api_kwargs=api_kwargs, - google_place_id=google_place_id, - google_place_type=google_place_type, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_video_note( - self, - video_note: Union[FileInput, "VideoNote"], - duration: Optional[TimePeriod] = None, - length: Optional[int] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - thumbnail: Optional[FileInput] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - filename: Optional[str] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_video_note(update.effective_user.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_video_note`. - - Note: - |user_chat_id_note| - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().send_video_note( - chat_id=self.id, - video_note=video_note, - duration=duration, - length=length, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - allow_sending_without_reply=allow_sending_without_reply, - filename=filename, - protect_content=protect_content, - message_thread_id=message_thread_id, - thumbnail=thumbnail, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_voice( - self, - voice: Union[FileInput, "Voice"], - duration: Optional[TimePeriod] = None, - caption: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - filename: Optional[str] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_voice(update.effective_user.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_voice`. - - Note: - |user_chat_id_note| - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().send_voice( - chat_id=self.id, - voice=voice, - duration=duration, - caption=caption, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - parse_mode=parse_mode, - api_kwargs=api_kwargs, - allow_sending_without_reply=allow_sending_without_reply, - caption_entities=caption_entities, - filename=filename, - protect_content=protect_content, - message_thread_id=message_thread_id, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_poll( - self, - question: str, - options: Sequence[Union[str, "InputPollOption"]], - is_anonymous: Optional[bool] = None, - type: Optional[str] = None, - allows_multiple_answers: Optional[bool] = None, - correct_option_id: Optional[CorrectOptionID] = None, - is_closed: Optional[bool] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - explanation: Optional[str] = None, - explanation_parse_mode: ODVInput[str] = DEFAULT_NONE, - open_period: Optional[TimePeriod] = None, - close_date: Optional[Union[int, dtm.datetime]] = None, - explanation_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - question_parse_mode: ODVInput[str] = DEFAULT_NONE, - question_entities: Optional[Sequence["MessageEntity"]] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.send_poll(update.effective_user.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_poll`. - - Note: - |user_chat_id_note| - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().send_poll( - chat_id=self.id, - question=question, - options=options, - is_anonymous=is_anonymous, - type=type, # pylint=pylint, - allows_multiple_answers=allows_multiple_answers, - correct_option_id=correct_option_id, - is_closed=is_closed, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - explanation=explanation, - explanation_parse_mode=explanation_parse_mode, - open_period=open_period, - close_date=close_date, - api_kwargs=api_kwargs, - allow_sending_without_reply=allow_sending_without_reply, - explanation_entities=explanation_entities, - protect_content=protect_content, - message_thread_id=message_thread_id, - business_connection_id=business_connection_id, - question_parse_mode=question_parse_mode, - question_entities=question_entities, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_gift( - self, - gift_id: Union[str, "Gift"], - text: Optional[str] = None, - text_parse_mode: ODVInput[str] = DEFAULT_NONE, - text_entities: Optional[Sequence["MessageEntity"]] = None, - pay_for_upgrade: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.send_gift(user_id=update.effective_user.id, *args, **kwargs ) - - For the documentation of the arguments, please see :meth:`telegram.Bot.send_gift`. - - .. versionadded:: 21.8 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - """ - return await self.get_bot().send_gift( - chat_id=None, - user_id=self.id, - gift_id=gift_id, - text=text, - text_parse_mode=text_parse_mode, - text_entities=text_entities, - pay_for_upgrade=pay_for_upgrade, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def gift_premium_subscription( - self, - month_count: int, - star_count: int, - text: Optional[str] = None, - text_parse_mode: ODVInput[str] = DEFAULT_NONE, - text_entities: Optional[Sequence["MessageEntity"]] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.gift_premium_subscription(user_id=update.effective_user.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.gift_premium_subscription`. - - .. versionadded:: 22.1 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - """ - return await self.get_bot().gift_premium_subscription( - user_id=self.id, - month_count=month_count, - star_count=star_count, - text=text, - text_parse_mode=text_parse_mode, - text_entities=text_entities, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def send_copy( - self, - from_chat_id: Union[str, int], - message_id: int, - caption: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - show_caption_above_media: Optional[bool] = None, - allow_paid_broadcast: Optional[bool] = None, - video_start_timestamp: Optional[int] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "MessageId": - """Shortcut for:: - - await bot.copy_message(chat_id=update.effective_user.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.copy_message`. - - Note: - |user_chat_id_note| - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().copy_message( - chat_id=self.id, - from_chat_id=from_chat_id, - message_id=message_id, - caption=caption, - video_start_timestamp=video_start_timestamp, - parse_mode=parse_mode, - caption_entities=caption_entities, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - allow_sending_without_reply=allow_sending_without_reply, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - protect_content=protect_content, - message_thread_id=message_thread_id, - show_caption_above_media=show_caption_above_media, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def copy_message( - self, - chat_id: Union[int, str], - message_id: int, - caption: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - show_caption_above_media: Optional[bool] = None, - allow_paid_broadcast: Optional[bool] = None, - video_start_timestamp: Optional[int] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "MessageId": - """Shortcut for:: - - await bot.copy_message(from_chat_id=update.effective_user.id, *args, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.copy_message`. - - Note: - |user_chat_id_note| - - Returns: - :class:`telegram.MessageId`: On success, returns the MessageId of the sent message. - - """ - return await self.get_bot().copy_message( - from_chat_id=self.id, - chat_id=chat_id, - message_id=message_id, - caption=caption, - video_start_timestamp=video_start_timestamp, - parse_mode=parse_mode, - caption_entities=caption_entities, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_parameters=reply_parameters, - allow_sending_without_reply=allow_sending_without_reply, - reply_markup=reply_markup, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - protect_content=protect_content, - message_thread_id=message_thread_id, - show_caption_above_media=show_caption_above_media, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_copies( - self, - from_chat_id: Union[str, int], - message_ids: Sequence[int], - disable_notification: ODVInput[bool] = DEFAULT_NONE, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - remove_caption: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> tuple["MessageId", ...]: - """Shortcut for:: - - await bot.copy_messages(chat_id=update.effective_user.id, *argss, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.copy_messages`. - - .. seealso:: :meth:`copy_message`, :meth:`send_copy`, :meth:`copy_messages`. - - .. versionadded:: 20.8 - - Returns: - tuple[:class:`telegram.MessageId`]: On success, a tuple of :class:`~telegram.MessageId` - of the sent messages is returned. - - """ - return await self.get_bot().copy_messages( - chat_id=self.id, - from_chat_id=from_chat_id, - message_ids=message_ids, - disable_notification=disable_notification, - protect_content=protect_content, - message_thread_id=message_thread_id, - remove_caption=remove_caption, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def copy_messages( - self, - chat_id: Union[str, int], - message_ids: Sequence[int], - disable_notification: ODVInput[bool] = DEFAULT_NONE, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - remove_caption: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> tuple["MessageId", ...]: - """Shortcut for:: - - await bot.copy_messages(from_chat_id=update.effective_user.id, *argss, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.copy_messages`. - - .. seealso:: :meth:`copy_message`, :meth:`send_copy`, :meth:`send_copies`. - - .. versionadded:: 20.8 - - Returns: - tuple[:class:`telegram.MessageId`]: On success, a tuple of :class:`~telegram.MessageId` - of the sent messages is returned. - - """ - return await self.get_bot().copy_messages( - from_chat_id=self.id, - chat_id=chat_id, - message_ids=message_ids, - disable_notification=disable_notification, - protect_content=protect_content, - message_thread_id=message_thread_id, - remove_caption=remove_caption, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def forward_from( - self, - from_chat_id: Union[str, int], - message_id: int, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - video_start_timestamp: Optional[int] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.forward_message(chat_id=update.effective_user.id, *argss, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.forward_message`. - - .. seealso:: :meth:`forward_to`, :meth:`forward_messages_from`, :meth:`forward_messages_to` - - .. versionadded:: 20.0 - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().forward_message( - chat_id=self.id, - from_chat_id=from_chat_id, - message_id=message_id, - video_start_timestamp=video_start_timestamp, - disable_notification=disable_notification, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - protect_content=protect_content, - message_thread_id=message_thread_id, - ) - - async def forward_to( - self, - chat_id: Union[int, str], - message_id: int, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - video_start_timestamp: Optional[int] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "Message": - """Shortcut for:: - - await bot.forward_message(from_chat_id=update.effective_user.id, *argss, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.forward_message`. - - .. seealso:: :meth:`forward_from`, :meth:`forward_messages_from`, - :meth:`forward_messages_to` - - .. versionadded:: 20.0 - - Returns: - :class:`telegram.Message`: On success, instance representing the message posted. - - """ - return await self.get_bot().forward_message( - from_chat_id=self.id, - chat_id=chat_id, - message_id=message_id, - video_start_timestamp=video_start_timestamp, - disable_notification=disable_notification, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - protect_content=protect_content, - message_thread_id=message_thread_id, - ) - - async def forward_messages_from( - self, - from_chat_id: Union[str, int], - message_ids: Sequence[int], - disable_notification: ODVInput[bool] = DEFAULT_NONE, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> tuple["MessageId", ...]: - """Shortcut for:: - - await bot.forward_messages(chat_id=update.effective_user.id, *argss, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.forward_messages`. - - .. seealso:: :meth:`forward_to`, :meth:`forward_from`, :meth:`forward_messages_to`. - - .. versionadded:: 20.8 - - Returns: - tuple[:class:`telegram.MessageId`]: On success, a tuple of :class:`~telegram.MessageId` - of sent messages is returned. - - """ - return await self.get_bot().forward_messages( - chat_id=self.id, - from_chat_id=from_chat_id, - message_ids=message_ids, - disable_notification=disable_notification, - protect_content=protect_content, - message_thread_id=message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def forward_messages_to( - self, - chat_id: Union[int, str], - message_ids: Sequence[int], - disable_notification: ODVInput[bool] = DEFAULT_NONE, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> tuple["MessageId", ...]: - """Shortcut for:: - - await bot.forward_messages(from_chat_id=update.effective_user.id, *argss, **kwargs) - - For the documentation of the arguments, please see :meth:`telegram.Bot.forward_messages`. - - .. seealso:: :meth:`forward_from`, :meth:`forward_to`, :meth:`forward_messages_from`. - - .. versionadded:: 20.8 - - Returns: - tuple[:class:`telegram.MessageId`]: On success, a tuple of :class:`~telegram.MessageId` - of sent messages is returned. - - """ - return await self.get_bot().forward_messages( - from_chat_id=self.id, - chat_id=chat_id, - message_ids=message_ids, - disable_notification=disable_notification, - protect_content=protect_content, - message_thread_id=message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def approve_join_request( - self, - chat_id: Union[int, str], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.approve_chat_join_request(user_id=update.effective_user.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.approve_chat_join_request`. - - Note: - |user_chat_id_note| - - .. versionadded:: 13.8 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().approve_chat_join_request( - user_id=self.id, - chat_id=chat_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def decline_join_request( - self, - chat_id: Union[int, str], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.decline_chat_join_request(user_id=update.effective_user.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.decline_chat_join_request`. - - Note: - |user_chat_id_note| - - .. versionadded:: 13.8 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - - """ - return await self.get_bot().decline_chat_join_request( - user_id=self.id, - chat_id=chat_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def set_menu_button( - self, - menu_button: Optional[MenuButton] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.set_chat_menu_button(chat_id=update.effective_user.id, *argss, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.set_chat_menu_button`. - - .. seealso:: :meth:`get_menu_button` - - Note: - |user_chat_id_note| - - .. versionadded:: 20.0 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - """ - return await self.get_bot().set_chat_menu_button( - chat_id=self.id, - menu_button=menu_button, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def get_menu_button( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> MenuButton: - """Shortcut for:: - - await bot.get_chat_menu_button(chat_id=update.effective_user.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.get_chat_menu_button`. - - .. seealso:: :meth:`set_menu_button` - - Note: - |user_chat_id_note| - - .. versionadded:: 20.0 - - Returns: - :class:`telegram.MenuButton`: On success, the current menu button is returned. - """ - return await self.get_bot().get_chat_menu_button( - chat_id=self.id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def get_chat_boosts( - self, - chat_id: Union[int, str], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> "UserChatBoosts": - """Shortcut for:: - - await bot.get_user_chat_boosts(user_id=update.effective_user.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.get_user_chat_boosts`. - - .. versionadded:: 20.8 - - Returns: - :class:`telegram.UserChatBoosts`: On success, returns the boosts applied by the user. - """ - return await self.get_bot().get_user_chat_boosts( - chat_id=chat_id, - user_id=self.id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def refund_star_payment( - self, - telegram_payment_charge_id: str, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.refund_star_payment(user_id=update.effective_user.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.refund_star_payment`. - - .. versionadded:: 21.3 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - """ - return await self.get_bot().refund_star_payment( - user_id=self.id, - telegram_payment_charge_id=telegram_payment_charge_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def verify( - self, - custom_description: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.verify_user(user_id=update.effective_user.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.verify_user`. - - .. versionadded:: 21.10 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - """ - return await self.get_bot().verify_user( - user_id=self.id, - custom_description=custom_description, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - async def remove_verification( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> bool: - """Shortcut for:: - - await bot.remove_user_verification(user_id=update.effective_user.id, *args, **kwargs) - - For the documentation of the arguments, please see - :meth:`telegram.Bot.remove_user_verification`. - - .. versionadded:: 21.10 - - Returns: - :obj:`bool`: On success, :obj:`True` is returned. - """ - return await self.get_bot().remove_user_verification( - user_id=self.id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) diff --git a/venv/lib/python3.12/site-packages/telegram/_userprofilephotos.py b/venv/lib/python3.12/site-packages/telegram/_userprofilephotos.py deleted file mode 100644 index 95344c1..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_userprofilephotos.py +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram UserProfilePhotos.""" -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional - -from telegram._files.photosize import PhotoSize -from telegram._telegramobject import TelegramObject -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot - - -class UserProfilePhotos(TelegramObject): - """This object represents a user's profile pictures. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`total_count` and :attr:`photos` are equal. - - Args: - total_count (:obj:`int`): Total number of profile pictures the target user has. - photos (Sequence[Sequence[:class:`telegram.PhotoSize`]]): Requested profile pictures (in up - to 4 sizes each). - - .. versionchanged:: 20.0 - |sequenceclassargs| - - Attributes: - total_count (:obj:`int`): Total number of profile pictures. - photos (tuple[tuple[:class:`telegram.PhotoSize`]]): Requested profile pictures (in up to 4 - sizes each). - - .. versionchanged:: 20.0 - |tupleclassattrs| - - """ - - __slots__ = ("photos", "total_count") - - def __init__( - self, - total_count: int, - photos: Sequence[Sequence[PhotoSize]], - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - # Required - self.total_count: int = total_count - self.photos: tuple[tuple[PhotoSize, ...], ...] = tuple(tuple(sizes) for sizes in photos) - - self._id_attrs = (self.total_count, self.photos) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "UserProfilePhotos": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["photos"] = [PhotoSize.de_list(photo, bot) for photo in data["photos"]] - - return super().de_json(data=data, bot=bot) diff --git a/venv/lib/python3.12/site-packages/telegram/_utils/__init__.py b/venv/lib/python3.12/site-packages/telegram/_utils/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index e65138062505cb841e9042492c791ea56f398fbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208 zcmZ8a%L>9U5KOFs2>lQb?V?`AlV^V+#CB;z^C(GLDSn7I?|zG);a!m4dNMf)4(!g% zvco*nbVUN*_iG*b71uw;dAQujK-Tp1Aa)kq7=I=MwNVI)d)LF!6rDot9e9*jS*|kY zMbV(mN^{ZD@DeTbsC$s&4DH}+qj&jc3r={<T3$4~!e1I#=Y@2@n9#yAmbb&S+$&Rd T5)XC}`e_&!#V4VZ+9aqiU|Kqt diff --git a/venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/argumentparsing.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/argumentparsing.cpython-312.pyc deleted file mode 100644 index ac1abef54d591d10c8b42c5b2e723c9c6d7ded8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5894 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 diff --git a/venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/datetime.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/datetime.cpython-312.pyc deleted file mode 100644 index 89fe21bba62146a0c278b5f9994a4e734e2bd4b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11836 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 diff --git a/venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/defaultvalue.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/defaultvalue.cpython-312.pyc deleted file mode 100644 index b9e1fb7242db392dc6e9275db154ff0f714662df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4479 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 diff --git a/venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/entities.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/entities.cpython-312.pyc deleted file mode 100644 index dee428213efc6859019da599ffc51cad9bac78cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2953 zcmcImO>9(E6uxhMUZ+zkO^YCC$wdV^(9TePYG|xUg_<A*i7lYTX6DX&cc!m>^WOOG zox<QW>4F6d5@TF|iBXmqHoDR!ti-smBSy%JBqYQI8&jy7$jWo>o0<MlQa9dY-rT=) z?m6dv=R5bu*48+I_Qw|=O+08J<N*%q4aTZ1T!6pJ#3W<H)Xb2r6+&Yn4f|m`T!@TC zR6k-z3;LL@`cb>75F3j@U+2wc6W7fcZ_epv^M%M*yqTEKsreQj;`(OLZLZ@H=r?0u zjbprpgJdp*qg>2vy$~H+SB@vvv!q7I=!7L`!8J=Zr-tiDW;ueg(mBhvm{+E`l4D5A zb(n2Q7`YxTGEZ1eo*v^uusk1fB(AvGNp47yjK@zi&w=&+IE8iyG;&7@>gK3iauV}6 zwQ$MgCY3JDa#|A5#W@cSv&%GF1_@4WE9;>l%rWUM$CbNk3rao6cu9I_f;o9EP|wOU zKmffGmdQO(pY=GKLgS5^2x={`GR1vhgXtQj0@$l8Q751Y!DiddC*uzxge0N)u@U}Z zi8}_z{yW7WLeOtr78RISH_Fe+A;)k{IM$Cy82LJ!05S7*kIRzh7$H<zYZ3Sl!*AhN z_*^CxG6{FIvdM<TB<^3)uGb`HLX}WOo77h<!_d^uM+sSd4Q69cOPp^=Z6T<4vJU4Z zTmPF?BP0=G+rh+lmGf|G5Mc}p&3SHtGMcxhxkLL6n+egMk=*8aj}?;30-FJxA-o2? zya<4XBc-LQAE4Nu5z@;f`srw0IbZ|M@R%Xhfx!)^Ba=!K%GV~l);PPSwzhkP;)W+R z3u|638o6lR66;iU@S5v^;=rtjc+&|TAp;QN9$u#3d~)=ybZ=jJc*xh?TuyL+l+B&I zobYv%<Gw`LYl58~-lX3WC`_Yi0<i_IK5<hMZh@x?Op58$;Tr5ksvhnhAuVHydp)Lm z*0Eg%N2lOgrc;oPsbX19xX!+0@7|QKB=0FQV+xpHQ96|_Ny`=~b+E-nvRL*vAaC$= zAz+PkV3XGY=4^wXI1Qg!GQWXzY`VPrlii=&ced`YZry*o{lM(eyX~D<a$gocD_mpM zt*Nj3z8&~x;6~r~12+e%`%cV_o~-UYIoEz__UQeVjdxl)t1X=k>6Qa?kpl~$njH6I zb!+^nEEl;jFckHMfl_G~uyZ9e+a~L4WU`TNjVVk5?J)T`Y=kUggvPfLG83+ZS4+oA zXqpJ^QhOyV@lI5$kV^P^P3xzjOEdyHX2K)z)l}~+a10v(gA_LFnZjrQ9@8>p24Ku2 za92^Rl`F`Li>M25bwtr(K=$>x(41uh`yx#$>a{$Y$zZ558Oo&etZYeg%7n5Bvv!J? zyA>}tQdrr<nK4n%r7X8yC$FfP1*tyG>=F;k0blCR|CiAKK-y(nLY`S8vB#HYHcCA^ zw;_d8Q%I_7ZxGLTH+AbZp`Q-J(dcj{vz)`=3K548Q3`AY<v}Fr5iFCu!AN+<Dt7?N zm{Siil<!*IR#gk+VFumprk12<E!)P*7L*!pF0vi!KFo8hWJ7sIh~OPRi*S>J!^7#( z_fHIs)T#F=VnbA}72)nBKpgL<gA|4EbpZt)oN6EuU|j@nq}zzZa)>Q~6)Y6GsljZc zWHT(>S%wb@*P+0YJ-vMp9FrGacv!&W1bt3KJScv^q79dzEW<@8E`mixoX^7!ZzFz? z83a~Yl=a%7<8NGr$^b6j7Fg`X?Z@E*WVVCET4!f|YwNtzwzJx{^I~*fCvR$RYk!AB z>-4*?4ct2Q)0rR6%zeOqKE^KUzqGx2b@W=_?Y6zu*xtvuWuAnh`ah2ebOoAmxnm%5 zef>Zrp&d`O`c3IHJXg|bf4$+_Haxx{jv~pjhKEGv>);b$%0turO?6&R)(N=AzbX<- zRuyk2Yj6yzO&CThHhu(eOL_Sf@iu^76^<vd*MsNd8{R80hmQ|24WIe2rfH9M=vw5j z=ZLob9(nP1(tD5Wnb%vjzAIv$z~8lF>hC*a0Y~#MlTqzG?NRszO}`s&omc;xw_WY2 pZr&3N4i4Vvy0!0SPxaslHE}=Me6i<B$6WlSYP9puD99<h{ssR4OoIRb diff --git a/venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/enum.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/enum.cpython-312.pyc deleted file mode 100644 index 660566887f9f1eaa3816ab57745a232e7fdb0334..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3615 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 diff --git a/venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/files.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/files.cpython-312.pyc deleted file mode 100644 index ea504b7b6655605ea5848d7e4d6d65be5a4bf770..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6141 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 diff --git a/venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/logging.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/logging.cpython-312.pyc deleted file mode 100644 index 7c9bdc58cd31eb23c1b7a9503179e3ebd92e8778..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1722 zcmZux&1)M+6yMRu%9i80Bu>&g#tbnnmWfyN16o9!w5X-D1e>%D1z%QU%}82%w7Z=d z*;Z>47kY?KNly`k_H2_&=wHyDdg#Tj3l2*Qfu3>+4(`dPzM0*%6O)16`FbC}_ulW# zAA^HM3&yjbzia(cu&jUeCLORh<M0Md_bqD8TNKd@NAn2gEYGyF^I2rkKAK}WnrB&- zdlMw7&CsH;8mp)OhD{4U<mc^frqoZ~K$bPv@+58tw8I&$2fiYnFL8_UkO|!A_;uw4 za3B~biczcr%!6jr^P5hw_%#tetSUteqYAprR}u#etX{B51jC-bqOtk{!yO4reI|Uu zc^5BqL4#rLEeImInD`V=`hl8EE{u855e}}lh~H#V!#M2&6f}P6Q6|9rf?#9`z~OqL zqOG<`7i&4dK!bXx4R{R_<3U4+g&{(x_*7?Xri7xt*-+<z@TkAxapwA@&7xwR6Di}h zEtu*Ezn)2R40AU54xhl{zO`m8LaI*>iXJAX>zTC-&FH!<YRyxFW>YzFaSd&p2U%0& z#r!Ej*wTC|yPoyOQppF_8d^p29I}r6q`Z2;#KUC$!1^h(o>l$n)vI{4c8uvOt7MaB z5XhG%4H6SW5uneCr&>@=Ou|qEq40n~SZB{M`MxC?CK5LS&Vv<MsT9qrrjlkDs88c2 zQ*OMOa80gVw-k$g-T*~`*(zy=K-^k-UBkfUnqr(a1!+5MRXJ`aq~KZ9uEZ>hjjwo| zYaVDk)Odbb>sF%VU~pACskU(tLhTvV_Q0F5B$(`Q1*Cq3sjDa2*J=)ixEmdgnbUMk z3{^nDs|2!P<P0JS-K8@DzBMg1@60(41LzyWe}X&8<7w-@6q}AIh9x~n4>TBLD9y=) zPD-hkI7n(1x3KnDF(4|nw99Xpbk!<&PIsu;#N~^S`&6?x${QR)v;PP=B|FN?kb5dB zN=1Z{ngo$8q!L~TZ9_s&5$=7<qC(;#>W4DNZb~_k12aPNI?9JyJ<925q(0X0j{I^f zXtQ#gD7jqzBxzz<PNSQW%BwFiF-3zFp9cgUgYq)-m&@?Dl*6uS1^#=^JMWgIr`S|T z>PrNklVk0&Yho!U$egen6;C)Q&I5=s_~bY6+prGCticO+XE$ei)x9%#<I~55Gk0!& zzq(%-*)5FpKKQFJzE#|rs5~ATzIStT_3rJ>+da8AG`^X8a`s{m{Wx)Nr1!<2qu00I zdW5zo_9v%zC#Ux&ukT#?XlLl-JGs9H&h8J4?hcIh=Jp0I@8m8Yf>W!6W=e&q;JWaB zxvqE}jv`xiLwM<gemSBnBs#L=bQ-|hmbd^HVi<l$eOKd`{+bwttuCK@AASc}gwXT1 sZInBF%|b)}SeKsL!)UxWeqh10_2HxH_Ox04`q}R@zs>xoPmR_80SWl*P5=M^ diff --git a/venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/markup.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/markup.cpython-312.pyc deleted file mode 100644 index 4c98d4e079403d95ab306ed3f2dd5947e4e6d042..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1466 zcmah}O>7%Q6rQ!$jxk9csc9M{Dh)pgbri2l!zn^YC<Q6}iv(4QRN1q;WAD`C8FyyZ z>C#r>z@dj6xRnD!AoT#E2M!#9#DPO@a7?9k#Q}*Em&$F*r6=C3?Icwz7-?tU%)Ix# zH}8FKew&&qBN+F-z7oAwLg+8M7!P+O?7s}c4HTkH6gpv!JKfx7&Ou?G=0lgdEjKKD z?rs*6Vs(Q2>>#ueF^#)2j5)=D6oxRNF~Je#J*sdk7J*?>;FeT)gL2wdr2C4-AJZOB z-Y2RP_jI}JdALuN2E8C6qD{k<6@2!LcczRn{z%b2ld<N>5;oD$2NgzR*@E?<?=7k* zCVj#<@gWowDH*q;%;dC?m`lJ_m|kYuFww4B=ztTgakFVgad}6gYBs%c`8-hqlvk`W zUWLm&%`pML%pQd_#71JD;#h-d_mm)<C)iK2I5_haQ3)m@#EU|j#nC|q4>roftJ(dv z#W{L8>jMmIf;9`_rXltfB^?M34^sv?2h=V}GChbPltJ8uc(X_{4_Wpyd@kEw`EOhB zs*{%1>7|&8fTpDmO?*jIm=+Z^u@V8)_h1x3%EPx`gxwp+9GqQ6CO6jlVI-;9$Ii#( zLdK$Gqm?_*brR<)I)^TNg3vYRh@JC4xQ_X6T%au=JAk|Z$hjlPxhIjevpw^e#sT(W zoZIsbvY0N~KJTI=SIvL=?P^4Wj>gQgk>YU%aZkxUR0?P?Vyb1XQZz8wBt432_)V-w ziMLc9%i7Cowbt!%7BB<kF;owWm^omAnVQ|oV4GLg1ZRRS4IAp(yQ2aQJFA&Ny}eO& z(=yZ0mxe%@l`UeL*G8oUKLMy}UfH{*c_p{f0uusS(dq!_A9d@I?9zId7~QX*8&OKv z#~o9HW(qn~)k3)?xFkT$dY_7Z9jIRKB_@($*?aYDT{A;#JrZ<Cn;u%%8?j+r1G;?& zyk3$X4{SCY<1998s?-$3@&bJN5=@_=hsV(5>=)6^(%!SxTbnzj-R0j4zb@_7KD<+z z`LlBJ0V)(uUC;kfdG5=XzPh|uIeqJ$AN4QmyYoBm?Jcd{JwA8m#M}dvd*;;jx2(?m z&AHo^#h+Go=<fRM<+b$W^Y;sIIG6yG!6cfT-Up}XgK9CIXf&Xw8jZ9PNY0^<@LXw+ z_`xutMd@FJ&D8a!<XOz$BXtaH)g(-hO0N&!$T!psEN$=T7hxLY9ml!9P<GsZW|1>L UC{8=m-z*Fe{Jz_GXnz^Tzp;m##{d8T diff --git a/venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/repr.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/repr.cpython-312.pyc deleted file mode 100644 index 7e6f0c622da496cf707266ea8d36dbc4be1dbb20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1787 zcmaJ?O>7%Q6rR~#ZxTBRg8UTJ5>46&;Wn{JA}&>uHY5_NkfM|ZA*Dp?@$T4OXT57? z#z`GgDXMyCC8Xwn2vSv)BPc~Gw;YQ&aNv>vQqZ1|xWEM&1tjo^H|w9IJus5zz4>`R z^L_8FzwhaZBN%^t{!t;>fzYpN(Hdq`Ii3P#2RUdNIoQ!WT+)^`j2xZmj=?l1#*Ccl zn0JlknA5=wr?b7+1$$;So=ng;F+xiPSCCTRR6IuPz?anZ1)-H&uIEx-CAo@kOE>VT z=So-woMbDm=eT~J2+2W+Xw$MdD|5>tB_<1jlZwaRr`(6*%W(o@4jeOI3KHaqJQa{~ zMqG8|Fo(#1WErUlP}LrXm|m4+t6;&1=VrOehx!h==m+v*^B{5$Hatb<3e?Xtq5M1_ z0}RyTgzGR4?z5cHRrLhBX`;NAXqBjYkb@K0l@jC|WfDbDDKsv7K|U4#U6GK)p+4(Z zLp{hALvwYV^1KL5&SZuAHXz#`Kp{%N@AwW(J7^OX+ear#Q9IFF+QW$2Vyv}3k&b>B zZQ`Qx{M^`UuIEup+iT_m-i$}a4U~*g1GeS>1j$Gy)8a0ZX;KRCN0<v)g`&u0<~%Bd zPfP43JaK$_e3XEkn4Vb4WPoVJ?-IZxKCCD@fhK#E0oANjE>Piau*g@A+7c8hfk6U* zF<9EvZvqZAC#f%8NXUsC=6FzQu-K@wW}I0GHJ7bO#d72e0zOkVQ7l!8OaOmWRj$gG zkup31=%j))h)P9a>iFh{HcFmhOQAgpzvIg=y@PPX*h(Kl9{@wQ@oi1Ex!uH@+Fp~l zPw@`M=;HwcRnb@aI!@vRD3G|-$luLXlX|G7-Utl^WEfkcUWExALI8aA)pQ{!v2=+_ zv6h~1R-Z^q=CM4dr7<C00F{q9!Mg7S6skDA#{9K3bVa&cg^u$lQ{xk9;Yv1E2K*`X zLEAcQRix{Qw1Op7uGYJz^2}$q%6w*HJZk1f@2<PDU<rt50|^!dq(y4V3vB9%nN-{4 zb;wwph3Pl+&ldV&VDalqPe%4*pA>idcPmGOV}}Ea{|W=n@4Rvr*YQfy2)iuHRuyDf zVW(xO=YwVx1J@5@kZ?&PHLfhULS8613E{mU!lD09j}O45SC!Efn6^;uCDi@GgX#Oz zM~UIX#PC7<{4epuz4-^%?q7qno(_I@?wfPp4*fK+_+$6tLE`$s^>=GAt!oL_bR%XS zg9{Yus|*?%$gxkiqe@Isb^I1gs)1Ewo-Tt{i}7A)%F~u`UyX<8k$wXjwjq<+LLE;h zwXhSw^=Q^(VYg*L`*;m-0FN_Z#9xN#G#*_2D@4<%I=KYX7W%pO#e45<4?pgF()YM$ zd+w-z<gkC_pzq2-;_88Mb$_z0@<F)2kn9LMEDJtxz=0{NW%vqm^|a7zG-aqm!A8JF zfxbkMSwu&@bE@$_F~iS;h3W$FHcT}gWBli9CN}==Mfgn3?8fF7W(|SZzYvM17mn4c YHiYpk-kz%=B|ozpa@YPVT1SEY1D;mte*gdg diff --git a/venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/strings.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/strings.cpython-312.pyc deleted file mode 100644 index d084fe93d32134210293d236e1960673e3e274ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1659 zcmZux&2Jk;6rWkIo!CtvAEhcyM5mFcaD~@66-lu|B$T?SfN~%~NS4rcvNN_f*_|~r z>ohh+3MdyO4&_411;VMSBBcBYy>n?PhiXqqT-r;ODnWvtc(c1sQ^ZJqGk)Li_ukuI zhldLY&XXU%XcYz!`cwbupKSU#sKR3#F;qtkGsDBaQ8zF$(EEsGwh%M9v71SB>lv2i zCd+ZNVX}cOv!3k^7W4ExMrgU^D&hyM<8k5yBBZWRgpwBb+FX)GM>wGy084U@hMbWw zAS#ruXcC_ax7`6Q$gM)*Qz`|ps|5mQ0X%ULDiSnEcq{^yoVZ%V5?3pnbQC-_PYUXJ zU9!>z3r;+DMN-)%R4{Tu1mT5L5W5E(X_18%6-};mO8<=k2D%#MGA_aWisW=n=j@~= z+N)2yMC(BgEO0tL<Qr!aN6;xG%3jd43Xe68MI05D;@WGX<2wno2?ZeIb1(_lHsYv` zp)Ur*fV@#RS*D(4W<A%<7IV?iGT#Vm!U-5;)LV=jz`@~j_<1TM%4u;QDr^LjgkS|Q zYjiD(taGUVcgg_BYL!e^thZy)9n{Nq!ba&*FR!o4Ov&Sm#erzhwgvUMZAS&$PTCFc zA>01EL%mcoVA}u$u=BR9ydYHY%zm<b#l95f^;Ma%KdQ+bRCu6^eJ0ASz~^P3hHAZh zIfYP_L+<gWq<%?-uCvBvi3Qh%7f@(Ld7X>(GPJhb?uM;ET(m0FW#xvv)TYiFg=QXE zm+emIda9fZo3h$nsRutM=is4E1KC1PjZAiMzko)^H?RING`?ATI5P3oRryk1HOebN z*SHOCqMYPmM+&FkEYLx)Tu3j;K?BG(x`9@YOM#~k!@DW>OMC-X?N!aotftEqtE7aP zTL?6=EO!Q7M!PAuZ{36cOQ<-|y94_H9fbX$B+1XAiuV@_=GlQ>c?-ZxJN}+*s${ct z|Bp%{Z&ZVo)#^2<?pm=*mSJcUy!1}M{OcI0hmYghk2!g6nHZ+(umXt-E1sta+tPrv zBlH4ny7Y_iJD3CVA;K|qpPfWV1N46o_M!M5Z)1$UJ!PUU`XzH67x5yjRW@`(j~9)| zu-=OBhSCuUkuSsbEI-%ef^W3td=IL!V`P8=G;?0yP*2TUM;fzWpiTjKg#O+{zfINl zMt3T=XMdi({m%WV+CRz!(bs1t@nhZ2MTnPGZO;uOb2V^9(U2p+jtWlTw*#R+U&j-P zhF^#-Ujy9|{L~DPO|(CT#wNDUes^|f{K4q!n;$$p@ybp5&AYdzf13Sa7J~1s-W|O= zwkLj{sy&#f-9J&gXV&5|T`cCL{@6z+`-@{Gqi^Ytg49UILmy?JFLBg(1(Okv5gMFJ z7J6Qu17%&BssP!~V2q!h&tdbg5rp479LnR#o7F=E*Z%1OzJhNp?IV5fEFH#o?DAiu CqQi>- diff --git a/venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/types.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/types.cpython-312.pyc deleted file mode 100644 index 4cfaa849ab9dd406135e9808a65d49e7e9a3764b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2312 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 Rt%Rj>kuv{xnY<4p{sq|Sq7?uD diff --git a/venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/warnings.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/warnings.cpython-312.pyc deleted file mode 100644 index ead66276fae1bd8c918bd4bf20a5d53ceddd069a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1781 zcma)6&5ImG6tC`{ukARCStW@cwD6G4gx#La<{%6rXacT>ECCb64KiKZRWsAs?yjM# zdX|oRP!Po1-r`BTiv9t5^X|o5Bs2(uc*sR2Y)(1(UVrQt8?d0OU%h(YzxV35Zr3HS z{{8Or$%76df8(KE3l(wjF%S<4CtHMD+>Wd*3;s@I$Ig~xA+HfN;^tP<BBIHyk<FXJ z5iQXi*{^{nZ;7_(6jWO*@D8^}9lr2YbIZ-_p36S42)Q!}HH{@tBS8b17#1d)PDC^n zijLAGFrfs75)m_kQzPjvQ%RVNH4U{+fwi4cGZ8cjw-r;F=enLpXF_SvW1I^<7|``K zZ_RZ-DHR7Ug>?g5iNt6sN1%Qb0#ky9cm<m1ZClV(1BpD9uqet-IixJ%^lBo_)#{=! z4?4=DHzq6@3ypS8`v3(@SBG3EOhO5^16k3aQbDUR%P7i03|t0j4Dl9`6do|=QaF-h z&wYY`ZT76Zc{hQ~fmpnK=l#17MwNEnj)m52Eb>kOr5sC@<*qg?*onkUM0raIld2?e z&``Bn@W=DP0Jew309@s|Z`ah(e~;{0dp5To0P83F$I6aHGN;#Ik3gXad*dXsWpSCN zjOvM0CP)n(NmYYPcSAFwT#Q&689HN8Dl{OB0KN!iyn9cLbqO<`s=Voyf!w}7@U>As z-J|8<WR3jZfPOR;K{zUV>af*n69D9tX#}*00j=Zm{aVsP;!4l=t0>F+<I$Fw6<vAF zTR&k2g*W9cWs#PY1%a4Cf3mY9g@y$1l0Y1DRO4D_YO<-gSHb_8ze42{hlxd}vaBR% z5S6L@?-c3H5}2aF2Zj2;HzE>a#p0q8IH%sJ8heL1A9Y_HF-+Nu<2)vQgu~gjugi}A z+eKC|Et<um>>&ybm&tUQm#OkliNL^QgW0p7JdvmGuOYf<`3cTL&sI1lstwy_&(1q_ zE94ENdX8%1^`VT$!2spwvOkfr=*P_HS^s7=-@0GdZ&jNx*b!=#%iScB4Bm<UOeC{D zJaqkOW+pPZ?p<5&>(GeRDU30U_K|jfn3^!s{W=(LnyHsC4&2^?PhW!V3-WA*G`nBl z`tsKP^7k7*zy2%x<&8fY8wYSldgt=?a0n02aH!6~Id4Hf0iX&K$j{et9^$MT$ai48 z@&<NZ-mV%ecL3JH@ef2Tf{^OM_Pp~>`Rc!`F2WH@sXv8n?pT)f^m4~)94ry*<v+=# zf5^(*C2y`izHsqr`-1hM^|-sVfBoCV-(R`>sJlFOkoDK%(*E1u#PcQ|<}Gsm)p;R0 O?~s=JYyr82>;C|D$q#@4 diff --git a/venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/warnings_transition.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/_utils/__pycache__/warnings_transition.cpython-312.pyc deleted file mode 100644 index 931f8533ac27fab19a222e0141d981f7690518c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3419 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 Vv=v86MO(-X_7(L-3Mdh={{X4u>)ikV diff --git a/venv/lib/python3.12/site-packages/telegram/_utils/argumentparsing.py b/venv/lib/python3.12/site-packages/telegram/_utils/argumentparsing.py deleted file mode 100644 index acebbf0..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_utils/argumentparsing.py +++ /dev/null @@ -1,169 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains helper functions related to parsing arguments for classes and methods. - -Warning: - Contents of this module are intended to be used internally by the library and *not* by the - user. Changes to this module are not considered breaking changes and may not be documented in - the changelog. -""" -import datetime as dtm -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional, Protocol, TypeVar, Union, overload - -from telegram._linkpreviewoptions import LinkPreviewOptions -from telegram._telegramobject import TelegramObject -from telegram._utils.types import JSONDict, ODVInput - -if TYPE_CHECKING: - from typing import type_check_only - - from telegram import Bot, FileCredentials - -T = TypeVar("T") - - -def parse_sequence_arg(arg: Optional[Sequence[T]]) -> tuple[T, ...]: - """Parses an optional sequence into a tuple - - Args: - arg (:obj:`Sequence`): The sequence to parse. - - Returns: - :obj:`Tuple`: The sequence converted to a tuple or an empty tuple. - """ - return tuple(arg) if arg else () - - -@overload -def to_timedelta(arg: None) -> None: ... - - -@overload -def to_timedelta( - arg: Union[ # noqa: PYI041 (be more explicit about `int` and `float` arguments) - int, float, dtm.timedelta - ], -) -> dtm.timedelta: ... - - -def to_timedelta(arg: Optional[Union[int, float, dtm.timedelta]]) -> Optional[dtm.timedelta]: - """Parses an optional time period in seconds into a timedelta - - Args: - arg (:obj:`int` | :class:`datetime.timedelta`, optional): The time period to parse. - - Returns: - :obj:`timedelta`: The time period converted to a timedelta object or :obj:`None`. - """ - if arg is None: - return None - if isinstance(arg, (int, float)): - return dtm.timedelta(seconds=arg) - return arg - - -def parse_lpo_and_dwpp( - disable_web_page_preview: Optional[bool], link_preview_options: ODVInput[LinkPreviewOptions] -) -> ODVInput[LinkPreviewOptions]: - """Wrapper around warn_about_deprecated_arg_return_new_arg. Takes care of converting - disable_web_page_preview to LinkPreviewOptions. - """ - if disable_web_page_preview and link_preview_options: - raise ValueError( - "Parameters `disable_web_page_preview` and `link_preview_options` are mutually " - "exclusive." - ) - - if disable_web_page_preview is not None: - link_preview_options = LinkPreviewOptions(is_disabled=disable_web_page_preview) - - return link_preview_options - - -Tele_co = TypeVar("Tele_co", bound=TelegramObject, covariant=True) -TeleCrypto_co = TypeVar("TeleCrypto_co", bound="HasDecryptMethod", covariant=True) - -if TYPE_CHECKING: - - @type_check_only - class HasDecryptMethod(Protocol): - __slots__ = () - - @classmethod - def de_json_decrypted( - cls: type[TeleCrypto_co], - data: JSONDict, - bot: Optional["Bot"], - credentials: list["FileCredentials"], - ) -> TeleCrypto_co: ... - - @classmethod - def de_list_decrypted( - cls: type[TeleCrypto_co], - data: list[JSONDict], - bot: Optional["Bot"], - credentials: list["FileCredentials"], - ) -> tuple[TeleCrypto_co, ...]: ... - - -def de_json_optional( - data: Optional[JSONDict], cls: type[Tele_co], bot: Optional["Bot"] -) -> Optional[Tele_co]: - """Wrapper around TO.de_json that returns None if data is None.""" - if data is None: - return None - - return cls.de_json(data, bot) - - -def de_json_decrypted_optional( - data: Optional[JSONDict], - cls: type[TeleCrypto_co], - bot: Optional["Bot"], - credentials: list["FileCredentials"], -) -> Optional[TeleCrypto_co]: - """Wrapper around TO.de_json_decrypted that returns None if data is None.""" - if data is None: - return None - - return cls.de_json_decrypted(data, bot, credentials) - - -def de_list_optional( - data: Optional[list[JSONDict]], cls: type[Tele_co], bot: Optional["Bot"] -) -> tuple[Tele_co, ...]: - """Wrapper around TO.de_list that returns an empty list if data is None.""" - if data is None: - return () - - return cls.de_list(data, bot) - - -def de_list_decrypted_optional( - data: Optional[list[JSONDict]], - cls: type[TeleCrypto_co], - bot: Optional["Bot"], - credentials: list["FileCredentials"], -) -> tuple[TeleCrypto_co, ...]: - """Wrapper around TO.de_list_decrypted that returns an empty list if data is None.""" - if data is None: - return () - - return cls.de_list_decrypted(data, bot, credentials) diff --git a/venv/lib/python3.12/site-packages/telegram/_utils/datetime.py b/venv/lib/python3.12/site-packages/telegram/_utils/datetime.py deleted file mode 100644 index a0cc126..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_utils/datetime.py +++ /dev/null @@ -1,274 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains helper functions related to datetime and timestamp conversations. - -.. versionchanged:: 20.0 - Previously, the contents of this module were available through the (no longer existing) - module ``telegram._utils.helpers``. - -Warning: - Contents of this module are intended to be used internally by the library and *not* by the - user. Changes to this module are not considered breaking changes and may not be documented in - the changelog. -""" -import contextlib -import datetime as dtm -import os -import time -from typing import TYPE_CHECKING, Optional, Union - -from telegram._utils.warnings import warn -from telegram.warnings import PTBDeprecationWarning - -if TYPE_CHECKING: - from telegram import Bot - -UTC = dtm.timezone.utc -try: - import pytz -except ImportError: - pytz = None # type: ignore[assignment] - - -def localize(datetime: dtm.datetime, tzinfo: dtm.tzinfo) -> dtm.datetime: - """Localize the datetime, both for pytz and zoneinfo timezones.""" - if tzinfo is UTC: - return datetime.replace(tzinfo=UTC) - - with contextlib.suppress(AttributeError): - # Since pytz might not be available, we need the suppress context manager - if isinstance(tzinfo, pytz.BaseTzInfo): - return tzinfo.localize(datetime) - - if datetime.tzinfo is None: - return datetime.replace(tzinfo=tzinfo) - return datetime.astimezone(tzinfo) - - -def to_float_timestamp( - time_object: Union[float, dtm.timedelta, dtm.datetime, dtm.time], - reference_timestamp: Optional[float] = None, - tzinfo: Optional[dtm.tzinfo] = None, -) -> float: - """ - Converts a given time object to a float POSIX timestamp. - Used to convert different time specifications to a common format. The time object - can be relative (i.e. indicate a time increment, or a time of day) or absolute. - Objects from the :class:`datetime` module that are timezone-naive will be assumed - to be in UTC, if ``bot`` is not passed or ``bot.defaults`` is :obj:`None`. - - Args: - time_object (:obj:`float` | :obj:`datetime.timedelta` | \ - :obj:`datetime.datetime` | :obj:`datetime.time`): - Time value to convert. The semantics of this parameter will depend on its type: - - * :obj:`float` will be interpreted as "seconds from :paramref:`reference_t`" - * :obj:`datetime.timedelta` will be interpreted as - "time increment from :paramref:`reference_timestamp`" - * :obj:`datetime.datetime` will be interpreted as an absolute date/time value - * :obj:`datetime.time` will be interpreted as a specific time of day - - reference_timestamp (:obj:`float`, optional): POSIX timestamp that indicates the absolute - time from which relative calculations are to be performed (e.g. when - :paramref:`time_object` is given as an :obj:`int`, indicating "seconds from - :paramref:`reference_time`"). Defaults to now (the time at which this function is - called). - - If :paramref:`time_object` is given as an absolute representation of date & time (i.e. - a :obj:`datetime.datetime` object), :paramref:`reference_timestamp` is not relevant - and so its value should be :obj:`None`. If this is not the case, a :exc:`ValueError` - will be raised. - tzinfo (:class:`datetime.tzinfo`, optional): If :paramref:`time_object` is a naive object - from the :mod:`datetime` module, it will be interpreted as this timezone. Defaults to - :attr:`datetime.timezone.utc` otherwise. - - Note: - Only to be used by ``telegram.ext``. - - Returns: - :obj:`float` | :obj:`None`: - The return value depends on the type of argument :paramref:`time_object`. - If :paramref:`time_object` is given as a time increment (i.e. as a :obj:`int`, - :obj:`float` or :obj:`datetime.timedelta`), then the return value will be - :paramref:`reference_timestamp` + :paramref:`time_object`. - - Else if it is given as an absolute date/time value (i.e. a :obj:`datetime.datetime` - object), the equivalent value as a POSIX timestamp will be returned. - - Finally, if it is a time of the day without date (i.e. a :obj:`datetime.time` - object), the return value is the nearest future occurrence of that time of day. - - Raises: - TypeError: If :paramref:`time_object` s type is not one of those described above. - ValueError: If :paramref:`time_object` is a :obj:`datetime.datetime` and - :paramref:`reference_timestamp` is not :obj:`None`. - """ - if reference_timestamp is None: - reference_timestamp = time.time() - elif isinstance(time_object, dtm.datetime): - raise ValueError("t is an (absolute) datetime while reference_timestamp is not None") - - if isinstance(time_object, dtm.timedelta): - return reference_timestamp + time_object.total_seconds() - if isinstance(time_object, (int, float)): - return reference_timestamp + time_object - - if tzinfo is None: - # We do this here rather than in the signature to ensure that we can make calls like - # to_float_timestamp( - # time, tzinfo=bot.defaults.tzinfo if bot.defaults else None - # ) - # This ensures clean separation of concerns, i.e. the default timezone should not be - # the responsibility of the caller - tzinfo = UTC - - if isinstance(time_object, dtm.time): - reference_dt = dtm.datetime.fromtimestamp( - reference_timestamp, tz=time_object.tzinfo or tzinfo - ) - reference_date = reference_dt.date() - reference_time = reference_dt.timetz() - - aware_datetime = dtm.datetime.combine(reference_date, time_object) - if aware_datetime.tzinfo is None: - # datetime.combine uses the tzinfo of `time_object`, which might be None - # so we still need to localize - aware_datetime = localize(aware_datetime, tzinfo) - - # if the time of day has passed today, use tomorrow - if reference_time > aware_datetime.timetz(): - aware_datetime += dtm.timedelta(days=1) - return _datetime_to_float_timestamp(aware_datetime) - if isinstance(time_object, dtm.datetime): - if time_object.tzinfo is None: - time_object = localize(time_object, tzinfo) - return _datetime_to_float_timestamp(time_object) - - raise TypeError(f"Unable to convert {type(time_object).__name__} object to timestamp") - - -def to_timestamp( - dt_obj: Union[float, dtm.timedelta, dtm.datetime, dtm.time, None], - reference_timestamp: Optional[float] = None, - tzinfo: Optional[dtm.tzinfo] = None, -) -> Optional[int]: - """ - Wrapper over :func:`to_float_timestamp` which returns an integer (the float value truncated - down to the nearest integer). - - See the documentation for :func:`to_float_timestamp` for more details. - """ - return ( - int(to_float_timestamp(dt_obj, reference_timestamp, tzinfo)) - if dt_obj is not None - else None - ) - - -def from_timestamp( - unixtime: Optional[int], - tzinfo: Optional[dtm.tzinfo] = None, -) -> Optional[dtm.datetime]: - """ - Converts an (integer) unix timestamp to a timezone aware datetime object. - :obj:`None` s are left alone (i.e. ``from_timestamp(None)`` is :obj:`None`). - - Args: - unixtime (:obj:`int`): Integer POSIX timestamp. - tzinfo (:obj:`datetime.tzinfo`, optional): The timezone to which the timestamp is to be - converted to. Defaults to :obj:`None`, in which case the returned datetime object will - be timezone aware and in UTC. - - Returns: - Timezone aware equivalent :obj:`datetime.datetime` value if :paramref:`unixtime` is not - :obj:`None`; else :obj:`None`. - """ - if unixtime is None: - return None - - return dtm.datetime.fromtimestamp(unixtime, tz=UTC if tzinfo is None else tzinfo) - - -def extract_tzinfo_from_defaults(bot: Optional["Bot"]) -> Union[dtm.tzinfo, None]: - """ - Extracts the timezone info from the default values of the bot. - If the bot has no default values, :obj:`None` is returned. - """ - # We don't use `ininstance(bot, ExtBot)` here so that this works - # without the job-queue extra dependencies as well - if bot is None: - return None - - if hasattr(bot, "defaults") and bot.defaults: - return bot.defaults.tzinfo - return None - - -def _datetime_to_float_timestamp(dt_obj: dtm.datetime) -> float: - """ - Converts a datetime object to a float timestamp (with sub-second precision). - If the datetime object is timezone-naive, it is assumed to be in UTC. - """ - if dt_obj.tzinfo is None: - dt_obj = dt_obj.replace(tzinfo=dtm.timezone.utc) - return dt_obj.timestamp() - - -def get_timedelta_value( - value: Optional[dtm.timedelta], attribute: str -) -> Optional[Union[int, dtm.timedelta]]: - """ - Convert a `datetime.timedelta` to seconds or return it as-is, based on environment config. - - This utility is part of the migration process from integer-based time representations - to using `datetime.timedelta`. The behavior is controlled by the `PTB_TIMEDELTA` - environment variable. - - Note: - When `PTB_TIMEDELTA` is not enabled, the function will issue a deprecation warning. - - Args: - value (:obj:`datetime.timedelta`): The timedelta value to process. - attribute (:obj:`str`): The name of the attribute at the caller scope, used for - warning messages. - - Returns: - - :obj:`None` if :paramref:`value` is None. - - :obj:`datetime.timedelta` if `PTB_TIMEDELTA=true` or ``PTB_TIMEDELTA=1``. - - :obj:`int` if the total seconds is a whole number. - - float: otherwise. - """ - if value is None: - return None - if os.getenv("PTB_TIMEDELTA", "false").lower().strip() in ["true", "1"]: - return value - warn( - PTBDeprecationWarning( - "v22.2", - f"In a future major version attribute `{attribute}` will be of type" - " `datetime.timedelta`. You can opt-in early by setting `PTB_TIMEDELTA=true`" - " or ``PTB_TIMEDELTA=1`` as an environment variable.", - ), - stacklevel=2, - ) - return ( - int(seconds) - if (seconds := value.total_seconds()).is_integer() - else seconds # type: ignore[return-value] - ) diff --git a/venv/lib/python3.12/site-packages/telegram/_utils/defaultvalue.py b/venv/lib/python3.12/site-packages/telegram/_utils/defaultvalue.py deleted file mode 100644 index f9374c5..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_utils/defaultvalue.py +++ /dev/null @@ -1,148 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the DefaultValue class. - -.. versionchanged:: 20.0 - Previously, the contents of this module were available through the (no longer existing) - module ``telegram._utils.helpers``. - -Warning: - Contents of this module are intended to be used internally by the library and *not* by the - user. Changes to this module are not considered breaking changes and may not be documented in - the changelog. -""" -from typing import Generic, TypeVar, Union, overload - -DVType = TypeVar("DVType", bound=object) # pylint: disable=invalid-name -OT = TypeVar("OT", bound=object) - - -class DefaultValue(Generic[DVType]): - """Wrapper for immutable default arguments that allows to check, if the default value was set - explicitly. Usage:: - - default_one = DefaultValue(1) - def f(arg=default_one): - if arg is default_one: - print('`arg` is the default') - arg = arg.value - else: - print('`arg` was set explicitly') - print(f'`arg` = {str(arg)}') - - This yields:: - - >>> f() - `arg` is the default - `arg` = 1 - >>> f(1) - `arg` was set explicitly - `arg` = 1 - >>> f(2) - `arg` was set explicitly - `arg` = 2 - - Also allows to evaluate truthiness:: - - default = DefaultValue(value) - if default: - ... - - is equivalent to:: - - default = DefaultValue(value) - if value: - ... - - ``repr(DefaultValue(value))`` returns ``repr(value)`` and ``str(DefaultValue(value))`` returns - ``f'DefaultValue({value})'``. - - Args: - value (:class:`object`): The value of the default argument - Attributes: - value (:class:`object`): The value of the default argument - - """ - - __slots__ = ("value",) - - def __init__(self, value: DVType): - self.value: DVType = value - - def __bool__(self) -> bool: - return bool(self.value) - - # This is mostly here for readability during debugging - def __str__(self) -> str: - return f"DefaultValue({self.value})" - - # This is here to have the default instances nicely rendered in the docs - def __repr__(self) -> str: - return repr(self.value) - - @overload - @staticmethod - def get_value(obj: "DefaultValue[OT]") -> OT: ... - - @overload - @staticmethod - def get_value(obj: OT) -> OT: ... - - @staticmethod - def get_value(obj: Union[OT, "DefaultValue[OT]"]) -> OT: - """Shortcut for:: - - return obj.value if isinstance(obj, DefaultValue) else obj - - Args: - obj (:obj:`object`): The object to process - - Returns: - Same type as input, or the value of the input: The value - """ - return obj.value if isinstance(obj, DefaultValue) else obj - - -DEFAULT_NONE: DefaultValue[None] = DefaultValue(None) -""":class:`DefaultValue`: Default :obj:`None`""" - -DEFAULT_FALSE: DefaultValue[bool] = DefaultValue(False) -""":class:`DefaultValue`: Default :obj:`False`""" - -DEFAULT_TRUE: DefaultValue[bool] = DefaultValue(True) -""":class:`DefaultValue`: Default :obj:`True` - -.. versionadded:: 20.0 -""" - - -DEFAULT_20: DefaultValue[int] = DefaultValue(20) -""":class:`DefaultValue`: Default :obj:`20`""" - -DEFAULT_IP: DefaultValue[str] = DefaultValue("127.0.0.1") -""":class:`DefaultValue`: Default :obj:`127.0.0.1` - -.. versionadded:: 20.8 -""" - -DEFAULT_80: DefaultValue[int] = DefaultValue(80) -""":class:`DefaultValue`: Default :obj:`80` - -.. versionadded:: 20.8 -""" diff --git a/venv/lib/python3.12/site-packages/telegram/_utils/entities.py b/venv/lib/python3.12/site-packages/telegram/_utils/entities.py deleted file mode 100644 index 7ca3eff..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_utils/entities.py +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains auxiliary functionality for parsing MessageEntity objects. - -Warning: - Contents of this module are intended to be used internally by the library and *not* by the - user. Changes to this module are not considered breaking changes and may not be documented in - the changelog. -""" -from collections.abc import Sequence -from typing import Optional - -from telegram._messageentity import MessageEntity -from telegram._utils.strings import TextEncoding - - -def parse_message_entity(text: str, entity: MessageEntity) -> str: - """Returns the text from a given :class:`telegram.MessageEntity`. - - Args: - text (:obj:`str`): The text to extract the entity from. - entity (:class:`telegram.MessageEntity`): The entity to extract the text from. - - Returns: - :obj:`str`: The text of the given entity. - """ - entity_text = text.encode(TextEncoding.UTF_16_LE) - entity_text = entity_text[entity.offset * 2 : (entity.offset + entity.length) * 2] - - return entity_text.decode(TextEncoding.UTF_16_LE) - - -def parse_message_entities( - text: str, entities: Sequence[MessageEntity], types: Optional[Sequence[str]] = None -) -> dict[MessageEntity, str]: - """ - Returns a :obj:`dict` that maps :class:`telegram.MessageEntity` to :obj:`str`. - It contains entities filtered by their ``type`` attribute as - the key, and the text that each entity belongs to as the value of the :obj:`dict`. - - Args: - text (:obj:`str`): The text to extract the entity from. - entities (list[:class:`telegram.MessageEntity`]): The entities to extract the text from. - types (list[:obj:`str`], optional): List of ``MessageEntity`` types as strings. If the - ``type`` attribute of an entity is contained in this list, it will be returned. - Defaults to :attr:`telegram.MessageEntity.ALL_TYPES`. - - Returns: - dict[:class:`telegram.MessageEntity`, :obj:`str`]: A dictionary of entities mapped to - the text that belongs to them, calculated based on UTF-16 codepoints. - """ - if types is None: - types = MessageEntity.ALL_TYPES - - return { - entity: parse_message_entity(text, entity) for entity in entities if entity.type in types - } diff --git a/venv/lib/python3.12/site-packages/telegram/_utils/enum.py b/venv/lib/python3.12/site-packages/telegram/_utils/enum.py deleted file mode 100644 index 5836287..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_utils/enum.py +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains helper functions related to enums. - -Warning: - Contents of this module are intended to be used internally by the library and *not* by the - user. Changes to this module are not considered breaking changes and may not be documented in - the changelog. -""" -import enum as _enum -import sys -from typing import TypeVar, Union - -_A = TypeVar("_A") -_B = TypeVar("_B") -_Enum = TypeVar("_Enum", bound=_enum.Enum) - - -def get_member(enum_cls: type[_Enum], value: _A, default: _B) -> Union[_Enum, _A, _B]: - """Tries to call ``enum_cls(value)`` to convert the value into an enumeration member. - If that fails, the ``default`` is returned. - """ - try: - return enum_cls(value) - except ValueError: - return default - - -# Python 3.11 and above has a different output for mixin classes for IntEnum, StrEnum and IntFlag -# see https://docs.python.org/3.11/library/enum.html#notes. We want e.g. str(StrEnumTest.FOO) to -# return "foo" instead of "StrEnumTest.FOO", which is not the case < py3.11 -class StringEnum(str, _enum.Enum): - """Helper class for string enums where ``str(member)`` prints the value, but ``repr(member)`` - gives ``EnumName.MEMBER_NAME``. - """ - - __slots__ = () - - def __repr__(self) -> str: - return f"<{self.__class__.__name__}.{self.name}>" - - def __str__(self) -> str: - return str.__str__(self) - - -# Apply the __repr__ modification and __str__ fix to IntEnum -class IntEnum(_enum.IntEnum): # pylint: disable=invalid-slots - """Helper class for int enums where ``str(member)`` prints the value, but ``repr(member)`` - gives ``EnumName.MEMBER_NAME``. - """ - - __slots__ = () - - def __repr__(self) -> str: - return f"<{self.__class__.__name__}.{self.name}>" - - if sys.version_info < (3, 11): - - def __str__(self) -> str: - return str(self.value) - - -class FloatEnum(float, _enum.Enum): - """Helper class for float enums where ``str(member)`` prints the value, but ``repr(member)`` - gives ``EnumName.MEMBER_NAME``. - """ - - __slots__ = () - - def __repr__(self) -> str: - return f"<{self.__class__.__name__}.{self.name}>" - - def __str__(self) -> str: - return str(self.value) diff --git a/venv/lib/python3.12/site-packages/telegram/_utils/files.py b/venv/lib/python3.12/site-packages/telegram/_utils/files.py deleted file mode 100644 index a750e15..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_utils/files.py +++ /dev/null @@ -1,157 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains helper functions related to handling of files. - -.. versionchanged:: 20.0 - Previously, the contents of this module were available through the (no longer existing) - module ``telegram._utils.helpers``. - -Warning: - Contents of this module are intended to be used internally by the library and *not* by the - user. Changes to this module are not considered breaking changes and may not be documented in - the changelog. -""" - -from pathlib import Path -from typing import IO, TYPE_CHECKING, Any, Optional, TypeVar, Union, cast, overload - -from telegram._utils.types import FileInput, FilePathInput - -if TYPE_CHECKING: - from telegram import InputFile, TelegramObject - -_T = TypeVar("_T", bound=Union[bytes, "InputFile", str, Path, None]) - - -@overload -def load_file(obj: IO[bytes]) -> tuple[Optional[str], bytes]: ... - - -@overload -def load_file(obj: _T) -> tuple[None, _T]: ... - - -def load_file( - obj: Optional[FileInput], -) -> tuple[Optional[str], Union[bytes, "InputFile", str, Path, None]]: - """If the input is a file handle, read the data and name and return it. Otherwise, return - the input unchanged. - """ - if obj is None: - return None, None - - try: - contents = obj.read() # type: ignore[union-attr] - except AttributeError: - return None, cast("Union[bytes, InputFile, str, Path]", obj) - - filename = guess_file_name(obj) - - return filename, contents - - -def guess_file_name(obj: FileInput) -> Optional[str]: - """If the input is a file handle, read name and return it. Otherwise, return - the input unchanged. - """ - if hasattr(obj, "name") and not isinstance(obj.name, int): - return Path(obj.name).name - - return None - - -def is_local_file(obj: Optional[FilePathInput]) -> bool: - """ - Checks if a given string is a file on local system. - - Args: - obj (:obj:`str`): The string to check. - """ - if obj is None: - return False - - path = Path(obj) - try: - return path.is_file() - except Exception: - return False - - -def parse_file_input( # pylint: disable=too-many-return-statements - file_input: Union[FileInput, "TelegramObject"], - tg_type: Optional[type["TelegramObject"]] = None, - filename: Optional[str] = None, - attach: bool = False, - local_mode: bool = False, -) -> Union[str, "InputFile", Any]: - """ - Parses input for sending files: - - * For string input, if the input is an absolute path of a local file: - - * if ``local_mode`` is ``True``, adds the ``file://`` prefix. If the input is a relative - path of a local file, computes the absolute path and adds the ``file://`` prefix. - * if ``local_mode`` is ``False``, loads the file as binary data and builds an - :class:`InputFile` from that - - Returns the input unchanged, otherwise. - * :class:`pathlib.Path` objects are treated the same way as strings. - * For IO and bytes input, returns an :class:`telegram.InputFile`. - * If :attr:`tg_type` is specified and the input is of that type, returns the ``file_id`` - attribute. - - Args: - file_input (:obj:`str` | :obj:`bytes` | :term:`file object` | :class:`~telegram.InputFile`\ - | Telegram media object): The input to parse. - tg_type (:obj:`type`, optional): The Telegram media type the input can be. E.g. - :class:`telegram.Animation`. - filename (:obj:`str`, optional): The filename. Only relevant in case an - :class:`telegram.InputFile` is returned. - attach (:obj:`bool`, optional): Pass :obj:`True` if the parameter this file belongs to in - the request to Telegram should point to the multipart data via an ``attach://`` URI. - Defaults to `False`. Only relevant if an :class:`telegram.InputFile` is returned. - local_mode (:obj:`bool`, optional): Pass :obj:`True` if the bot is running an api server - in ``--local`` mode. - - Returns: - :obj:`str` | :class:`telegram.InputFile` | :obj:`object`: The parsed input or the untouched - :attr:`file_input`, in case it's no valid file input. - """ - # Importing on file-level yields cyclic Import Errors - from telegram import InputFile # pylint: disable=import-outside-toplevel - - if isinstance(file_input, str) and file_input.startswith("file://"): - if not local_mode: - raise ValueError("Specified file input is a file URI, but local mode is not enabled.") - return file_input - if isinstance(file_input, (str, Path)): - if is_local_file(file_input): - path = Path(file_input) - if local_mode: - return path.absolute().as_uri() - return InputFile(path.open(mode="rb"), filename=filename, attach=attach) - - return file_input - if isinstance(file_input, bytes): - return InputFile(file_input, filename=filename, attach=attach) - if hasattr(file_input, "read"): - return InputFile(cast("IO", file_input), filename=filename, attach=attach) - if tg_type and isinstance(file_input, tg_type): - return file_input.file_id # type: ignore[attr-defined] - return file_input diff --git a/venv/lib/python3.12/site-packages/telegram/_utils/logging.py b/venv/lib/python3.12/site-packages/telegram/_utils/logging.py deleted file mode 100644 index 0bd778b..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_utils/logging.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains helper functions related to logging. - -Warning: - Contents of this module are intended to be used internally by the library and *not* by the - user. Changes to this module are not considered breaking changes and may not be documented in - the changelog. -""" -import logging -from typing import Optional - - -def get_logger(file_name: str, class_name: Optional[str] = None) -> logging.Logger: - """Returns a logger with an appropriate name. - Use as follows:: - - logger = get_logger(__name__) - - If for example `__name__` is `telegram.ext._updater`, the logger will be named - `telegram.ext.Updater`. If `class_name` is passed, this will result in - `telegram.ext.<class_name>`. Useful e.g. for CamelCase class names. - - If the file name points to a utils module, the logger name will simply be `telegram(.ext)`. - - Returns: - :class:`logging.Logger`: The logger. - """ - parts = file_name.split("_") - if parts[1].startswith("utils") and class_name is None: - name = parts[0].rstrip(".") - else: - name = f"{parts[0]}{class_name or parts[1].capitalize()}" - return logging.getLogger(name) diff --git a/venv/lib/python3.12/site-packages/telegram/_utils/markup.py b/venv/lib/python3.12/site-packages/telegram/_utils/markup.py deleted file mode 100644 index eed70b3..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_utils/markup.py +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains a helper function for Telegram's ReplyMarkups - -.. versionchanged:: 20.0 - Previously, the contents of this module were available through the (no longer existing) - class ``telegram.ReplyMarkup``. - -Warning: - Contents of this module are intended to be used internally by the library and *not* by the - user. Changes to this module are not considered breaking changes and may not be documented in - the changelog. -""" -from collections.abc import Sequence - - -def check_keyboard_type(keyboard: object) -> bool: - """Checks if the keyboard provided is of the correct type - A sequence of sequences. - Implicitly tested in the init-tests of `{Inline, Reply}KeyboardMarkup` - """ - # string and bytes may actually be used for ReplyKeyboardMarkup in which case each button - # would contain a single character. But that use case should be discouraged and we don't - # allow it here. - if not isinstance(keyboard, Sequence) or isinstance(keyboard, (str, bytes)): - return False - - for row in keyboard: - if not isinstance(row, Sequence) or isinstance(row, (str, bytes)): - return False - for inner in row: - if isinstance(inner, Sequence) and not isinstance(inner, str): - return False - return True diff --git a/venv/lib/python3.12/site-packages/telegram/_utils/repr.py b/venv/lib/python3.12/site-packages/telegram/_utils/repr.py deleted file mode 100644 index 38d9834..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_utils/repr.py +++ /dev/null @@ -1,45 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains auxiliary functionality for building strings for __repr__ method. - -Warning: - Contents of this module are intended to be used internally by the library and *not* by the - user. Changes to this module are not considered breaking changes and may not be documented in - the changelog. -""" -from typing import Any - - -def build_repr_with_selected_attrs(obj: object, **kwargs: Any) -> str: - """Create ``__repr__`` string in the style ``Classname[arg1=1, arg2=2]``. - - The square brackets emphasize the fact that an object cannot be instantiated - from this string. - - Attributes that are to be used in the representation, are passed as kwargs. - """ - return ( - f"{obj.__class__.__name__}" - # square brackets emphasize that an object cannot be instantiated with these params - f"[{', '.join(_stringify(name, value) for name, value in kwargs.items())}]" - ) - - -def _stringify(key: str, val: Any) -> str: - return f"{key}={val.__qualname__ if callable(val) else val}" diff --git a/venv/lib/python3.12/site-packages/telegram/_utils/strings.py b/venv/lib/python3.12/site-packages/telegram/_utils/strings.py deleted file mode 100644 index 76a8bcd..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_utils/strings.py +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains a helper functions related to string manipulation. - -Warning: - Contents of this module are intended to be used internally by the library and *not* by the - user. Changes to this module are not considered breaking changes and may not be documented in - the changelog. -""" - -from telegram._utils.enum import StringEnum - -# TODO: Remove this when https://github.com/PyCQA/pylint/issues/6887 is resolved. -# pylint: disable=invalid-enum-extension - - -class TextEncoding(StringEnum): - """This enum contains encoding schemes for text. - - .. versionadded:: 21.5 - """ - - __slots__ = () - - UTF_8 = "utf-8" - UTF_16_LE = "utf-16-le" - - -def to_camel_case(snake_str: str) -> str: - """Converts a snake_case string to camelCase. - - Args: - snake_str (:obj:`str`): The string to convert. - - Returns: - :obj:`str`: The converted string. - """ - components = snake_str.split("_") - return components[0] + "".join(x.title() for x in components[1:]) diff --git a/venv/lib/python3.12/site-packages/telegram/_utils/types.py b/venv/lib/python3.12/site-packages/telegram/_utils/types.py deleted file mode 100644 index 925fba9..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_utils/types.py +++ /dev/null @@ -1,98 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains custom typing aliases for internal use within the library. - -Warning: - Contents of this module are intended to be used internally by the library and *not* by the - user. Changes to this module are not considered breaking changes and may not be documented in - the changelog. -""" -import datetime as dtm -from collections.abc import Collection -from pathlib import Path -from typing import IO, TYPE_CHECKING, Any, Callable, Literal, Optional, TypeVar, Union - -if TYPE_CHECKING: - from telegram import ( - ForceReply, - InlineKeyboardMarkup, - InputFile, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ) - from telegram._utils.defaultvalue import DefaultValue - -FileLike = Union[IO[bytes], "InputFile"] -"""Either a bytes-stream (e.g. open file handler) or a :class:`telegram.InputFile`.""" - -FilePathInput = Union[str, Path] -"""A filepath either as string or as :obj:`pathlib.Path` object.""" - -FileInput = Union[FilePathInput, FileLike, bytes, str] -"""Valid input for passing files to Telegram. Either a file id as string, a file like object, -a local file path as string, :class:`pathlib.Path` or the file contents as :obj:`bytes`.""" - -JSONDict = dict[str, Any] -"""Dictionary containing response from Telegram or data to send to the API.""" - -DVValueType = TypeVar("DVValueType") # pylint: disable=invalid-name -DVType = Union[DVValueType, "DefaultValue[DVValueType]"] -"""Generic type for a variable which can be either `type` or `DefaultVaule[type]`.""" -ODVInput = Optional[Union["DefaultValue[DVValueType]", DVValueType, "DefaultValue[None]"]] -"""Generic type for bot method parameters which can have defaults. ``ODVInput[type]`` is the same -as ``Optional[Union[DefaultValue[type], type, DefaultValue[None]]``.""" -DVInput = Union["DefaultValue[DVValueType]", DVValueType, "DefaultValue[None]"] -"""Generic type for bot method parameters which can have defaults. ``DVInput[type]`` is the same -as ``Union[DefaultValue[type], type, DefaultValue[None]]``.""" - -RT = TypeVar("RT") -SCT = Union[RT, Collection[RT]] # pylint: disable=invalid-name -"""Single instance or collection of instances.""" - -ReplyMarkup = Union[ - "InlineKeyboardMarkup", "ReplyKeyboardMarkup", "ReplyKeyboardRemove", "ForceReply" -] -"""Type alias for reply markup objects. - -.. versionadded:: 20.0 -""" - -FieldTuple = tuple[str, Union[bytes, IO[bytes]], str] -"""Alias for return type of `InputFile.field_tuple`.""" -UploadFileDict = dict[str, FieldTuple] -"""Dictionary containing file data to be uploaded to the API.""" - -HTTPVersion = Literal["1.1", "2.0", "2"] -"""Allowed HTTP versions. - -.. versionadded:: 20.4""" - -CorrectOptionID = Literal[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] - -MarkdownVersion = Literal[1, 2] - -SocketOpt = Union[ - tuple[int, int, int], - tuple[int, int, Union[bytes, bytearray]], - tuple[int, int, None, int], -] - -BaseUrl = Union[str, Callable[[str], str]] - -TimePeriod = Union[int, dtm.timedelta] diff --git a/venv/lib/python3.12/site-packages/telegram/_utils/warnings.py b/venv/lib/python3.12/site-packages/telegram/_utils/warnings.py deleted file mode 100644 index 2aa79db..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_utils/warnings.py +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains helper functions related to warnings issued by the library. - -.. versionadded:: 20.0 - -Warning: - Contents of this module are intended to be used internally by the library and *not* by the - user. Changes to this module are not considered breaking changes and may not be documented in - the changelog. -""" -import warnings -from typing import Union - -from telegram.warnings import PTBUserWarning - - -def warn( - message: Union[str, PTBUserWarning], - category: type[Warning] = PTBUserWarning, - stacklevel: int = 0, -) -> None: - """ - Helper function used as a shortcut for warning with default values. - - .. versionadded:: 20.0 - - Args: - message (:obj:`str` | :obj:`PTBUserWarning`): Specify the warnings message to pass to - ``warnings.warn()``. - - .. versionchanged:: 21.2 - Now also accepts a :obj:`PTBUserWarning` instance. - - category (:obj:`type[Warning]`, optional): Specify the Warning class to pass to - ``warnings.warn()``. Defaults to :class:`telegram.warnings.PTBUserWarning`. - stacklevel (:obj:`int`, optional): Specify the stacklevel to pass to ``warnings.warn()``. - Pass the same value as you'd pass directly to ``warnings.warn()``. Defaults to ``0``. - """ - warnings.warn(message, category=category, stacklevel=stacklevel + 1) diff --git a/venv/lib/python3.12/site-packages/telegram/_utils/warnings_transition.py b/venv/lib/python3.12/site-packages/telegram/_utils/warnings_transition.py deleted file mode 100644 index 7aca62c..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_utils/warnings_transition.py +++ /dev/null @@ -1,114 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains functionality used for transition warnings issued by this library. - -It was created to prevent circular imports that would be caused by creating the warnings -inside warnings.py. - -.. versionadded:: 20.2 -""" -from typing import Any, Callable, Union - -from telegram._utils.warnings import warn -from telegram.warnings import PTBDeprecationWarning, PTBUserWarning - - -def build_deprecation_warning_message( - deprecated_name: str, - new_name: str, - object_type: str, - bot_api_version: str, -) -> str: - """Builds a warning message for the transition in API when an object is renamed/replaced. - - Returns a warning message that can be used in `warn` function. - """ - return ( - f"The {object_type} '{deprecated_name}' was replaced by '{new_name}' in Bot API " - f"{bot_api_version}. We recommend using '{new_name}' instead of " - f"'{deprecated_name}'." - ) - - -# Narrower type hints will cause linting errors and/or circular imports. -# We'll use `Any` here and put type hints in the calling code. -def warn_about_deprecated_arg_return_new_arg( - deprecated_arg: Any, - new_arg: Any, - deprecated_arg_name: str, - new_arg_name: str, - bot_api_version: str, - ptb_version: str, - stacklevel: int = 2, - warn_callback: Callable[[Union[str, PTBUserWarning], type[Warning], int], None] = warn, -) -> Any: - """A helper function for the transition in API when argument is renamed. - - Checks the `deprecated_arg` and `new_arg` objects; warns if non-None `deprecated_arg` object - was passed. Returns `new_arg` object (either the one originally passed by the user or the one - that user passed as `deprecated_arg`). - - Raises `ValueError` if both `deprecated_arg` and `new_arg` objects were passed, and they are - different. - """ - if deprecated_arg and new_arg and deprecated_arg != new_arg: - base_message = build_deprecation_warning_message( - deprecated_name=deprecated_arg_name, - new_name=new_arg_name, - object_type="parameter", - bot_api_version=bot_api_version, - ) - raise ValueError( - f"You passed different entities as '{deprecated_arg_name}' and '{new_arg_name}'. " - f"{base_message}" - ) - - if deprecated_arg: - warn_callback( - PTBDeprecationWarning( - ptb_version, - f"Bot API {bot_api_version} renamed the argument '{deprecated_arg_name}' to " - f"'{new_arg_name}'.", - ), - stacklevel=stacklevel + 1, # type: ignore[call-arg] - ) - return deprecated_arg - - return new_arg - - -def warn_about_deprecated_attr_in_property( - deprecated_attr_name: str, - new_attr_name: str, - bot_api_version: str, - ptb_version: str, - stacklevel: int = 2, -) -> None: - """A helper function for the transition in API when attribute is renamed. Call from properties. - - The properties replace deprecated attributes in classes and issue these deprecation warnings. - """ - warn( - PTBDeprecationWarning( - ptb_version, - f"Bot API {bot_api_version} renamed the attribute '{deprecated_attr_name}' to " - f"'{new_attr_name}'.", - ), - stacklevel=stacklevel + 1, - ) diff --git a/venv/lib/python3.12/site-packages/telegram/_version.py b/venv/lib/python3.12/site-packages/telegram/_version.py deleted file mode 100644 index 64654ba..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_version.py +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -# pylint: disable=missing-module-docstring -from typing import Final, NamedTuple - -__all__ = ("__version__", "__version_info__") - - -class Version(NamedTuple): - """Copies the behavior of sys.version_info. - serial is always 0 for stable releases. - """ - - major: int - minor: int - micro: int - releaselevel: str # Literal['alpha', 'beta', 'candidate', 'final'] - serial: int - - def _rl_shorthand(self) -> str: - return { - "alpha": "a", - "beta": "b", - "candidate": "rc", - }[self.releaselevel] - - def __str__(self) -> str: - version = f"{self.major}.{self.minor}" - if self.micro != 0: - version = f"{version}.{self.micro}" - if self.releaselevel != "final": - version = f"{version}{self._rl_shorthand()}{self.serial}" - - return version - - -__version_info__: Final[Version] = Version( - major=22, minor=2, micro=0, releaselevel="final", serial=0 -) -__version__: Final[str] = str(__version_info__) diff --git a/venv/lib/python3.12/site-packages/telegram/_videochat.py b/venv/lib/python3.12/site-packages/telegram/_videochat.py deleted file mode 100644 index 97f5150..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_videochat.py +++ /dev/null @@ -1,208 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains objects related to Telegram video chats.""" -import datetime as dtm -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional, Union - -from telegram._telegramobject import TelegramObject -from telegram._user import User -from telegram._utils.argumentparsing import parse_sequence_arg, to_timedelta -from telegram._utils.datetime import ( - extract_tzinfo_from_defaults, - from_timestamp, - get_timedelta_value, -) -from telegram._utils.types import JSONDict, TimePeriod - -if TYPE_CHECKING: - from telegram import Bot - - -class VideoChatStarted(TelegramObject): - """ - This object represents a service message about a video - chat started in the chat. Currently holds no information. - - .. versionadded:: 13.4 - .. versionchanged:: 20.0 - This class was renamed from ``VoiceChatStarted`` in accordance to Bot API 6.0. - """ - - __slots__ = () - - def __init__(self, *, api_kwargs: Optional[JSONDict] = None) -> None: - super().__init__(api_kwargs=api_kwargs) - - self._freeze() - - -class VideoChatEnded(TelegramObject): - """ - This object represents a service message about a - video chat ended in the chat. - - Objects of this class are comparable in terms of equality. - Two objects of this class are considered equal, if their - :attr:`duration` are equal. - - .. versionadded:: 13.4 - .. versionchanged:: 20.0 - This class was renamed from ``VoiceChatEnded`` in accordance to Bot API 6.0. - - .. versionchanged:: v22.2 - As part of the migration to representing time periods using ``datetime.timedelta``, - equality comparison now considers integer durations and equivalent timedeltas as equal. - - Args: - duration (:obj:`int` | :class:`datetime.timedelta`): Voice chat duration - in seconds. - - .. versionchanged:: v22.2 - |time-period-input| - - Attributes: - duration (:obj:`int` | :class:`datetime.timedelta`): Voice chat duration in seconds. - - .. deprecated:: v22.2 - |time-period-int-deprecated| - - """ - - __slots__ = ("_duration",) - - def __init__( - self, - duration: TimePeriod, - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(api_kwargs=api_kwargs) - self._duration: dtm.timedelta = to_timedelta(duration) - self._id_attrs = (self._duration,) - - self._freeze() - - @property - def duration(self) -> Union[int, dtm.timedelta]: - return get_timedelta_value( # type: ignore[return-value] - self._duration, attribute="duration" - ) - - -class VideoChatParticipantsInvited(TelegramObject): - """ - This object represents a service message about new members invited to a video chat. - - Objects of this class are comparable in terms of equality. - Two objects of this class are considered equal, if their :attr:`users` are equal. - - .. versionadded:: 13.4 - .. versionchanged:: 20.0 - This class was renamed from ``VoiceChatParticipantsInvited`` in accordance to Bot API 6.0. - - Args: - users (Sequence[:class:`telegram.User`]): New members that were invited to the video chat. - - .. versionchanged:: 20.0 - |sequenceclassargs| - - Attributes: - users (tuple[:class:`telegram.User`]): New members that were invited to the video chat. - - .. versionchanged:: 20.0 - |tupleclassattrs| - - """ - - __slots__ = ("users",) - - def __init__( - self, - users: Sequence[User], - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(api_kwargs=api_kwargs) - self.users: tuple[User, ...] = parse_sequence_arg(users) - self._id_attrs = (self.users,) - - self._freeze() - - @classmethod - def de_json( - cls, data: JSONDict, bot: Optional["Bot"] = None - ) -> "VideoChatParticipantsInvited": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - data["users"] = User.de_list(data.get("users", []), bot) - return super().de_json(data=data, bot=bot) - - -class VideoChatScheduled(TelegramObject): - """This object represents a service message about a video chat scheduled in the chat. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`start_date` are equal. - - .. versionchanged:: 20.0 - This class was renamed from ``VoiceChatScheduled`` in accordance to Bot API 6.0. - - Args: - start_date (:obj:`datetime.datetime`): Point in time (Unix timestamp) when the video - chat is supposed to be started by a chat administrator - - .. versionchanged:: 20.3 - |datetime_localization| - Attributes: - start_date (:obj:`datetime.datetime`): Point in time (Unix timestamp) when the video - chat is supposed to be started by a chat administrator - - .. versionchanged:: 20.3 - |datetime_localization| - - """ - - __slots__ = ("start_date",) - - def __init__( - self, - start_date: dtm.datetime, - *, - api_kwargs: Optional[JSONDict] = None, - ) -> None: - super().__init__(api_kwargs=api_kwargs) - self.start_date: dtm.datetime = start_date - - self._id_attrs = (self.start_date,) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "VideoChatScheduled": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - # Get the local timezone from the bot if it has defaults - loc_tzinfo = extract_tzinfo_from_defaults(bot) - - data["start_date"] = from_timestamp(data.get("start_date"), tzinfo=loc_tzinfo) - - return super().de_json(data=data, bot=bot) diff --git a/venv/lib/python3.12/site-packages/telegram/_webappdata.py b/venv/lib/python3.12/site-packages/telegram/_webappdata.py deleted file mode 100644 index 2b1a8fd..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_webappdata.py +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram WebAppData.""" - -from typing import Optional - -from telegram._telegramobject import TelegramObject -from telegram._utils.types import JSONDict - - -class WebAppData(TelegramObject): - """Contains data sent from a `Web App <https://core.telegram.org/bots/webapps>`_ to the bot. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`data` and :attr:`button_text` are equal. - - Examples: - :any:`Webapp Bot <examples.webappbot>` - - .. versionadded:: 20.0 - - Args: - data (:obj:`str`): The data. Be aware that a bad client can send arbitrary data in this - field. - button_text (:obj:`str`): Text of the :paramref:`~telegram.KeyboardButton.web_app` keyboard - button, from which the Web App was opened. - - Attributes: - data (:obj:`str`): The data. Be aware that a bad client can send arbitrary data in this - field. - button_text (:obj:`str`): Text of the :paramref:`~telegram.KeyboardButton.web_app` keyboard - button, from which the Web App was opened. - - Warning: - Be aware that a bad client can send arbitrary data in this field. - """ - - __slots__ = ("button_text", "data") - - def __init__(self, data: str, button_text: str, *, api_kwargs: Optional[JSONDict] = None): - super().__init__(api_kwargs=api_kwargs) - # Required - self.data: str = data - self.button_text: str = button_text - - self._id_attrs = (self.data, self.button_text) - - self._freeze() diff --git a/venv/lib/python3.12/site-packages/telegram/_webappinfo.py b/venv/lib/python3.12/site-packages/telegram/_webappinfo.py deleted file mode 100644 index 11a6bf3..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_webappinfo.py +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram Web App Info.""" - -from typing import Optional - -from telegram._telegramobject import TelegramObject -from telegram._utils.types import JSONDict - - -class WebAppInfo(TelegramObject): - """ - This object contains information about a `Web App <https://core.telegram.org/bots/webapps>`_. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`url` are equal. - - Examples: - :any:`Webapp Bot <examples.webappbot>` - - .. versionadded:: 20.0 - - Args: - url (:obj:`str`): An HTTPS URL of a Web App to be opened with additional data as specified - in `Initializing Web Apps \ - <https://core.telegram.org/bots/webapps#initializing-mini-apps>`_. - - Attributes: - url (:obj:`str`): An HTTPS URL of a Web App to be opened with additional data as specified - in `Initializing Web Apps \ - <https://core.telegram.org/bots/webapps#initializing-mini-apps>`_. - """ - - __slots__ = ("url",) - - def __init__(self, url: str, *, api_kwargs: Optional[JSONDict] = None): - super().__init__(api_kwargs=api_kwargs) - # Required - self.url: str = url - - self._id_attrs = (self.url,) - - self._freeze() diff --git a/venv/lib/python3.12/site-packages/telegram/_webhookinfo.py b/venv/lib/python3.12/site-packages/telegram/_webhookinfo.py deleted file mode 100644 index b2cca87..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_webhookinfo.py +++ /dev/null @@ -1,181 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram WebhookInfo.""" - -import datetime as dtm -from collections.abc import Sequence -from typing import TYPE_CHECKING, Optional - -from telegram._telegramobject import TelegramObject -from telegram._utils.argumentparsing import parse_sequence_arg -from telegram._utils.datetime import extract_tzinfo_from_defaults, from_timestamp -from telegram._utils.types import JSONDict - -if TYPE_CHECKING: - from telegram import Bot - - -class WebhookInfo(TelegramObject): - """This object represents a Telegram WebhookInfo. - - Contains information about the current status of a webhook. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`url`, :attr:`has_custom_certificate`, - :attr:`pending_update_count`, :attr:`ip_address`, :attr:`last_error_date`, - :attr:`last_error_message`, :attr:`max_connections`, :attr:`allowed_updates` and - :attr:`last_synchronization_error_date` are equal. - - .. versionchanged:: 20.0 - :attr:`last_synchronization_error_date` is considered as well when comparing objects of - this type in terms of equality. - - Args: - url (:obj:`str`): Webhook URL, may be empty if webhook is not set up. - has_custom_certificate (:obj:`bool`): :obj:`True`, if a custom certificate was provided for - webhook certificate checks. - pending_update_count (:obj:`int`): Number of updates awaiting delivery. - ip_address (:obj:`str`, optional): Currently used webhook IP address. - last_error_date (:class:`datetime.datetime`): Optional. Datetime for the most recent - error that happened when trying to deliver an update via webhook. - - .. versionchanged:: 20.3 - |datetime_localization| - last_error_message (:obj:`str`, optional): Error message in human-readable format for the - most recent error that happened when trying to deliver an update via webhook. - max_connections (:obj:`int`, optional): Maximum allowed number of simultaneous HTTPS - connections to the webhook for update delivery. - allowed_updates (Sequence[:obj:`str`], optional): A sequence of update types the bot is - subscribed to. Defaults to all update types, except - :attr:`telegram.Update.chat_member`. - - .. versionchanged:: 20.0 - |sequenceclassargs| - - last_synchronization_error_date (:class:`datetime.datetime`, optional): Datetime of the - most recent error that happened when trying to synchronize available updates with - Telegram datacenters. - - .. versionadded:: 20.0 - - .. versionchanged:: 20.3 - |datetime_localization| - Attributes: - url (:obj:`str`): Webhook URL, may be empty if webhook is not set up. - has_custom_certificate (:obj:`bool`): :obj:`True`, if a custom certificate was provided for - webhook certificate checks. - pending_update_count (:obj:`int`): Number of updates awaiting delivery. - ip_address (:obj:`str`): Optional. Currently used webhook IP address. - last_error_date (:class:`datetime.datetime`): Optional. Datetime for the most recent - error that happened when trying to deliver an update via webhook. - - .. versionchanged:: 20.3 - |datetime_localization| - last_error_message (:obj:`str`): Optional. Error message in human-readable format for the - most recent error that happened when trying to deliver an update via webhook. - max_connections (:obj:`int`): Optional. Maximum allowed number of simultaneous HTTPS - connections to the webhook for update delivery. - allowed_updates (tuple[:obj:`str`]): Optional. A tuple of update types the bot is - subscribed to. Defaults to all update types, except - :attr:`telegram.Update.chat_member`. - - .. versionchanged:: 20.0 - - * |tupleclassattrs| - * |alwaystuple| - last_synchronization_error_date (:class:`datetime.datetime`, optional): Datetime of the - most recent error that happened when trying to synchronize available updates with - Telegram datacenters. - - .. versionadded:: 20.0 - - .. versionchanged:: 20.3 - |datetime_localization| - """ - - __slots__ = ( - "allowed_updates", - "has_custom_certificate", - "ip_address", - "last_error_date", - "last_error_message", - "last_synchronization_error_date", - "max_connections", - "pending_update_count", - "url", - ) - - def __init__( - self, - url: str, - has_custom_certificate: bool, - pending_update_count: int, - last_error_date: Optional[dtm.datetime] = None, - last_error_message: Optional[str] = None, - max_connections: Optional[int] = None, - allowed_updates: Optional[Sequence[str]] = None, - ip_address: Optional[str] = None, - last_synchronization_error_date: Optional[dtm.datetime] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - # Required - self.url: str = url - self.has_custom_certificate: bool = has_custom_certificate - self.pending_update_count: int = pending_update_count - - # Optional - self.ip_address: Optional[str] = ip_address - self.last_error_date: Optional[dtm.datetime] = last_error_date - self.last_error_message: Optional[str] = last_error_message - self.max_connections: Optional[int] = max_connections - self.allowed_updates: tuple[str, ...] = parse_sequence_arg(allowed_updates) - self.last_synchronization_error_date: Optional[dtm.datetime] = ( - last_synchronization_error_date - ) - - self._id_attrs = ( - self.url, - self.has_custom_certificate, - self.pending_update_count, - self.ip_address, - self.last_error_date, - self.last_error_message, - self.max_connections, - self.allowed_updates, - self.last_synchronization_error_date, - ) - - self._freeze() - - @classmethod - def de_json(cls, data: JSONDict, bot: Optional["Bot"] = None) -> "WebhookInfo": - """See :meth:`telegram.TelegramObject.de_json`.""" - data = cls._parse_data(data) - - # Get the local timezone from the bot if it has defaults - loc_tzinfo = extract_tzinfo_from_defaults(bot) - - data["last_error_date"] = from_timestamp(data.get("last_error_date"), tzinfo=loc_tzinfo) - data["last_synchronization_error_date"] = from_timestamp( - data.get("last_synchronization_error_date"), tzinfo=loc_tzinfo - ) - - return super().de_json(data=data, bot=bot) diff --git a/venv/lib/python3.12/site-packages/telegram/_writeaccessallowed.py b/venv/lib/python3.12/site-packages/telegram/_writeaccessallowed.py deleted file mode 100644 index 07fdd6b..0000000 --- a/venv/lib/python3.12/site-packages/telegram/_writeaccessallowed.py +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains objects related to the write access allowed service message.""" -from typing import Optional - -from telegram._telegramobject import TelegramObject -from telegram._utils.types import JSONDict - - -class WriteAccessAllowed(TelegramObject): - """ - This object represents a service message about a user allowing a bot to write messages after - adding it to the attachment menu, launching a Web App from a link, or accepting an explicit - request from a Web App sent by the method - `requestWriteAccess <https://core.telegram.org/bots/webapps#initializing-mini-apps>`_. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :attr:`web_app_name` is equal. - - .. versionadded:: 20.0 - .. versionchanged:: 20.6 - Added custom equality comparison for objects of this class. - - Args: - web_app_name (:obj:`str`, optional): Name of the Web App, if the access was granted when - the Web App was launched from a link. - - .. versionadded:: 20.3 - from_request (:obj:`bool`, optional): :obj:`True`, if the access was granted after the user - accepted an explicit request from a Web App sent by the method - `requestWriteAccess <https://core.telegram.org/bots/webapps#initializing-mini-apps>`_. - - .. versionadded:: 20.6 - from_attachment_menu (:obj:`bool`, optional): :obj:`True`, if the access was granted when - the bot was added to the attachment or side menu. - - .. versionadded:: 20.6 - - Attributes: - web_app_name (:obj:`str`): Optional. Name of the Web App, if the access was granted when - the Web App was launched from a link. - - .. versionadded:: 20.3 - from_request (:obj:`bool`): Optional. :obj:`True`, if the access was granted after the user - accepted an explicit request from a Web App. - - .. versionadded:: 20.6 - from_attachment_menu (:obj:`bool`): Optional. :obj:`True`, if the access was granted when - the bot was added to the attachment or side menu. - - .. versionadded:: 20.6 - - """ - - __slots__ = ("from_attachment_menu", "from_request", "web_app_name") - - def __init__( - self, - web_app_name: Optional[str] = None, - from_request: Optional[bool] = None, - from_attachment_menu: Optional[bool] = None, - *, - api_kwargs: Optional[JSONDict] = None, - ): - super().__init__(api_kwargs=api_kwargs) - self.web_app_name: Optional[str] = web_app_name - self.from_request: Optional[bool] = from_request - self.from_attachment_menu: Optional[bool] = from_attachment_menu - - self._id_attrs = (self.web_app_name,) - - self._freeze() diff --git a/venv/lib/python3.12/site-packages/telegram/constants.py b/venv/lib/python3.12/site-packages/telegram/constants.py deleted file mode 100644 index 3e57778..0000000 --- a/venv/lib/python3.12/site-packages/telegram/constants.py +++ /dev/null @@ -1,3688 +0,0 @@ -# python-telegram-bot - a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# by the python-telegram-bot contributors <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains several constants that are relevant for working with the Bot API. - -Unless noted otherwise, all constants in this module were extracted from the -`Telegram Bots FAQ <https://core.telegram.org/bots/faq>`_ and -`Telegram Bots API <https://core.telegram.org/bots/api>`_. - -Most of the following constants are related to specific classes or topics and are grouped into -enums. If they are related to a specific class, then they are also available as attributes of -those classes. - -.. versionchanged:: 20.0 - - * Most of the constants in this module are grouped into enums. -""" -# TODO: Remove this when https://github.com/PyCQA/pylint/issues/6887 is resolved. -# pylint: disable=invalid-enum-extension,invalid-slots - -__all__ = [ - "BOT_API_VERSION", - "BOT_API_VERSION_INFO", - "SUPPORTED_WEBHOOK_PORTS", - "ZERO_DATE", - "AccentColor", - "BackgroundFillLimit", - "BackgroundFillType", - "BackgroundTypeLimit", - "BackgroundTypeType", - "BotCommandLimit", - "BotCommandScopeType", - "BotDescriptionLimit", - "BotNameLimit", - "BulkRequestLimit", - "BusinessLimit", - "CallbackQueryLimit", - "ChatAction", - "ChatBoostSources", - "ChatID", - "ChatInviteLinkLimit", - "ChatLimit", - "ChatMemberStatus", - "ChatPhotoSize", - "ChatSubscriptionLimit", - "ChatType", - "ContactLimit", - "CustomEmojiStickerLimit", - "DiceEmoji", - "DiceLimit", - "FileSizeLimit", - "FloodLimit", - "ForumIconColor", - "ForumTopicLimit", - "GiftLimit", - "GiveawayLimit", - "InlineKeyboardButtonLimit", - "InlineKeyboardMarkupLimit", - "InlineQueryLimit", - "InlineQueryResultLimit", - "InlineQueryResultType", - "InlineQueryResultsButtonLimit", - "InputMediaType", - "InputPaidMediaType", - "InputProfilePhotoType", - "InputStoryContentLimit", - "InputStoryContentType", - "InvoiceLimit", - "KeyboardButtonRequestUsersLimit", - "LocationLimit", - "MaskPosition", - "MediaGroupLimit", - "MenuButtonType", - "MessageAttachmentType", - "MessageEntityType", - "MessageLimit", - "MessageOriginType", - "MessageType", - "Nanostar", - "NanostarLimit", - "OwnedGiftType", - "PaidMediaType", - "ParseMode", - "PollLimit", - "PollType", - "PollingLimit", - "PremiumSubscription", - "ProfileAccentColor", - "ReactionEmoji", - "ReactionType", - "ReplyLimit", - "RevenueWithdrawalStateType", - "StarTransactions", - "StarTransactionsLimit", - "StickerFormat", - "StickerLimit", - "StickerSetLimit", - "StickerType", - "StoryAreaPositionLimit", - "StoryAreaTypeLimit", - "StoryAreaTypeType", - "StoryLimit", - "TransactionPartnerType", - "TransactionPartnerUser", - "UniqueGiftInfoOrigin", - "UpdateType", - "UserProfilePhotosLimit", - "VerifyLimit", - "WebhookLimit", -] - -import datetime as dtm -import sys -from enum import Enum -from typing import Final, NamedTuple, Optional - -from telegram._utils.datetime import UTC -from telegram._utils.enum import FloatEnum, IntEnum, StringEnum - - -class _BotAPIVersion(NamedTuple): - """Similar behavior to sys.version_info. - So far TG has only published X.Y releases. We can add X.Y.Z(a(S)) if needed. - """ - - major: int - minor: int - - def __repr__(self) -> str: - """Unfortunately calling super().__repr__ doesn't work with typing.NamedTuple, so we - do this manually. - """ - return f"BotAPIVersion(major={self.major}, minor={self.minor})" - - def __str__(self) -> str: - return f"{self.major}.{self.minor}" - - -class _AccentColor(NamedTuple): - """A helper class for (profile) accent colors. Since TG doesn't define a class for this and - the behavior is quite different for the different accent colors, we don't make this a public - class. This gives us more flexibility to change the implementation if necessary for future - versions. - """ - - identifier: int - name: Optional[str] = None - light_colors: tuple[int, ...] = () - dark_colors: tuple[int, ...] = () - - -#: :class:`typing.NamedTuple`: A tuple containing the two components of the version number: -# ``major`` and ``minor``. Both values are integers. -#: The components can also be accessed by name, so ``BOT_API_VERSION_INFO[0]`` is equivalent -#: to ``BOT_API_VERSION_INFO.major`` and so on. Also available as -#: :data:`telegram.__bot_api_version_info__`. -#: -#: .. versionadded:: 20.0 -BOT_API_VERSION_INFO: Final[_BotAPIVersion] = _BotAPIVersion(major=9, minor=0) -#: :obj:`str`: Telegram Bot API -#: version supported by this version of `python-telegram-bot`. Also available as -#: :data:`telegram.__bot_api_version__`. -#: -#: .. versionadded:: 13.4 -BOT_API_VERSION: Final[str] = str(BOT_API_VERSION_INFO) - -# constants above this line are tested - -#: list[:obj:`int`]: Ports supported by -#: :paramref:`telegram.Bot.set_webhook.url`. -SUPPORTED_WEBHOOK_PORTS: Final[list[int]] = [443, 80, 88, 8443] - -#: :obj:`datetime.datetime`, value of unix 0. -#: This date literal is used in :class:`telegram.InaccessibleMessage` -#: -#: .. versionadded:: 20.8 -ZERO_DATE: Final[dtm.datetime] = dtm.datetime(1970, 1, 1, tzinfo=UTC) - - -class AccentColor(Enum): - """This enum contains the available accent colors for - :class:`telegram.ChatFullInfo.accent_color_id`. - The members of this enum are named tuples with the following attributes: - - - ``identifier`` (:obj:`int`): The identifier of the accent color. - - ``name`` (:obj:`str`): Optional. The name of the accent color. - - ``light_colors`` (tuple[:obj:`str`]): Optional. The light colors of the accent color as HEX - value. - - ``dark_colors`` (tuple[:obj:`str`]): Optional. The dark colors of the accent color as HEX - value. - - Since Telegram gives no exact specification for the accent colors, future accent colors might - have a different data type. - - .. versionadded:: 20.8 - """ - - __slots__ = () - - COLOR_000 = _AccentColor(identifier=0, name="red") - """Accent color 0. This color can be customized by app themes.""" - COLOR_001 = _AccentColor(identifier=1, name="orange") - """Accent color 1. This color can be customized by app themes.""" - COLOR_002 = _AccentColor(identifier=2, name="purple/violet") - """Accent color 2. This color can be customized by app themes.""" - COLOR_003 = _AccentColor(identifier=3, name="green") - """Accent color 3. This color can be customized by app themes.""" - COLOR_004 = _AccentColor(identifier=4, name="cyan") - """Accent color 4. This color can be customized by app themes.""" - COLOR_005 = _AccentColor(identifier=5, name="blue") - """Accent color 5. This color can be customized by app themes.""" - COLOR_006 = _AccentColor(identifier=6, name="pink") - """Accent color 6. This color can be customized by app themes.""" - COLOR_007 = _AccentColor( - identifier=7, light_colors=(0xE15052, 0xF9AE63), dark_colors=(0xFF9380, 0x992F37) - ) - """Accent color 7. This contains two light colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#E15052;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#F9AE63;"> - </div><br> - - and two dark colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#FF9380;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#992F37;"> - </div><br> - """ - COLOR_008 = _AccentColor( - identifier=8, light_colors=(0xE0802B, 0xFAC534), dark_colors=(0xECB04E, 0xC35714) - ) - """Accent color 8. This contains two light colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#E0802B;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#FAC534;"> - </div><br> - - and two dark colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#ECB04E;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#C35714;"> - </div><br> - """ - COLOR_009 = _AccentColor( - identifier=9, light_colors=(0xA05FF3, 0xF48FFF), dark_colors=(0xC697FF, 0x5E31C8) - ) - """Accent color 9. This contains two light colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#A05FF3;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#F48FFF;"> - </div><br> - - and two dark colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#C697FF;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#5E31C8;"> - </div><br> - """ - COLOR_010 = _AccentColor( - identifier=10, light_colors=(0x27A910, 0xA7DC57), dark_colors=(0xA7EB6E, 0x167E2D) - ) - """Accent color 10. This contains two light colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#27A910;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#A7DC57;"> - </div><br> - - and two dark colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#A7EB6E;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#167E2D;"> - </div><br> - """ - COLOR_011 = _AccentColor( - identifier=11, light_colors=(0x27ACCE, 0x82E8D6), dark_colors=(0x40D8D0, 0x045C7F) - ) - """Accent color 11. This contains two light colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#27ACCE;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#82E8D6;"> - </div><br> - - and two dark colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#40D8D0;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#045C7F;"> - </div><br> - """ - - COLOR_012 = _AccentColor( - identifier=12, light_colors=(0x3391D4, 0x7DD3F0), dark_colors=(0x52BFFF, 0x0B5494) - ) - """Accent color 12. This contains two light colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#3391D4;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#7DD3F0;"> - </div><br> - - and two dark colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#52BFFF;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#0B5494;"> - </div><br> - """ - COLOR_013 = _AccentColor( - identifier=13, light_colors=(0xDD4371, 0xFFBE9F), dark_colors=(0xFF86A6, 0x8E366E) - ) - """Accent color 13. This contains two light colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#DD4371;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#FFBE9F;"> - </div><br> - - and two dark colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#FF86A6;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#8E366E;"> - </div><br> - """ - COLOR_014 = _AccentColor( - identifier=14, - light_colors=(0x247BED, 0xF04856, 0xFFFFFF), - dark_colors=(0x3FA2FE, 0xE5424F, 0xFFFFFF), - ) - """Accent color 14. This contains three light colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#247BED;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#F04856;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#FFFFFF;"> - </div><br> - - and three dark colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#3FA2FE;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#E5424F;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#FFFFFF;"> - </div><br> - """ - - COLOR_015 = _AccentColor( - identifier=15, - light_colors=(0xD67722, 0x1EA011, 0xFFFFFF), - dark_colors=(0xFF905E, 0x32A527, 0xFFFFFF), - ) - """Accent color 15. This contains three light colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#D67722;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#1EA011;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#FFFFFF;"> - </div><br> - - and three dark colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#FF905E;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#32A527;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#FFFFFF;"> - </div><br> - """ - - COLOR_016 = _AccentColor( - identifier=16, - light_colors=(0x179E42, 0xE84A3F, 0xFFFFFF), - dark_colors=(0x66D364, 0xD5444F, 0xFFFFFF), - ) - """Accent color 16. This contains three light colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#179E42;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#E84A3F;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#FFFFFF;"> - </div><br> - - and three dark colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#66D364;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#D5444F;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#FFFFFF;"> - </div><br> - """ - - COLOR_017 = _AccentColor( - identifier=17, - light_colors=(0x2894AF, 0x6FC456, 0xFFFFFF), - dark_colors=(0x22BCE2, 0x3DA240, 0xFFFFFF), - ) - """Accent color 17. This contains three light colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#2894AF;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#6FC456;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#FFFFFF;"> - </div><br> - - and three dark colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#22BCE2;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#3DA240;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#FFFFFF;"> - </div><br> - """ - - COLOR_018 = _AccentColor( - identifier=18, - light_colors=(0x0C9AB3, 0xFFAD95, 0xFFE6B5), - dark_colors=(0x22BCE2, 0xFF9778, 0xFFDA6B), - ) - """Accent color 18. This contains three light colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#0C9AB3;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#FFAD95;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#FFE6B5;"> - </div><br> - - and three dark colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#22BCE2;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#FF9778;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#FFDA6B;"> - </div><br> - """ - - COLOR_019 = _AccentColor( - identifier=19, - light_colors=(0x7757D6, 0xF79610, 0xFFDE8E), - dark_colors=(0x9791FF, 0xF2731D, 0xFFDB59), - ) - """Accent color 19. This contains three light colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#7757D6;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#F79610;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#FFDE8E;"> - </div><br> - - and three dark colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#9791FF;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#F2731D;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#FFDB59;"> - </div><br> - """ - - COLOR_020 = _AccentColor( - identifier=20, - light_colors=(0x1585CF, 0xF2AB1D, 0xFFFFFF), - dark_colors=(0x3DA6EB, 0xEEA51D, 0xFFFFFF), - ) - """Accent color 20. This contains three light colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#1585CF;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#F2AB1D;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#FFFFFF;"> - </div><br> - - and three dark colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#3DA6EB;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#EEA51D;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#FFFFFF;"> - </div><br> - """ - - -class BackgroundTypeType(StringEnum): - """This enum contains the available types of :class:`telegram.BackgroundType`. The enum - members of this enumeration are instances of :class:`str` and can be treated as such. - - .. versionadded:: 21.2 - """ - - __slots__ = () - - FILL = "fill" - """:obj:`str`: A :class:`telegram.BackgroundType` with fill background.""" - WALLPAPER = "wallpaper" - """:obj:`str`: A :class:`telegram.BackgroundType` with wallpaper background.""" - PATTERN = "pattern" - """:obj:`str`: A :class:`telegram.BackgroundType` with pattern background.""" - CHAT_THEME = "chat_theme" - """:obj:`str`: A :class:`telegram.BackgroundType` with chat_theme background.""" - - -class BackgroundFillType(StringEnum): - """This enum contains the available types of :class:`telegram.BackgroundFill`. The enum - members of this enumeration are instances of :class:`str` and can be treated as such. - - .. versionadded:: 21.2 - """ - - __slots__ = () - - SOLID = "solid" - """:obj:`str`: A :class:`telegram.BackgroundFill` with solid fill.""" - GRADIENT = "gradient" - """:obj:`str`: A :class:`telegram.BackgroundFill` with gradient fill.""" - FREEFORM_GRADIENT = "freeform_gradient" - """:obj:`str`: A :class:`telegram.BackgroundFill` with freeform_gradient fill.""" - - -class BotCommandLimit(IntEnum): - """This enum contains limitations for :class:`telegram.BotCommand` and - :meth:`telegram.Bot.set_my_commands`. - The enum members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - MIN_COMMAND = 1 - """:obj:`int`: Minimum value allowed for :paramref:`~telegram.BotCommand.command` parameter of - :class:`telegram.BotCommand`. - """ - MAX_COMMAND = 32 - """:obj:`int`: Maximum value allowed for :paramref:`~telegram.BotCommand.command` parameter of - :class:`telegram.BotCommand`. - """ - MIN_DESCRIPTION = 1 - """:obj:`int`: Minimum value allowed for :paramref:`~telegram.BotCommand.description` - parameter of :class:`telegram.BotCommand`. - """ - MAX_DESCRIPTION = 256 - """:obj:`int`: Maximum value allowed for :paramref:`~telegram.BotCommand.description` - parameter of :class:`telegram.BotCommand`. - """ - MAX_COMMAND_NUMBER = 100 - """:obj:`int`: Maximum number of bot commands passed in a :obj:`list` to the - :paramref:`~telegram.Bot.set_my_commands.commands` - parameter of :meth:`telegram.Bot.set_my_commands`. - """ - - -class BotCommandScopeType(StringEnum): - """This enum contains the available types of :class:`telegram.BotCommandScope`. The enum - members of this enumeration are instances of :class:`str` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - DEFAULT = "default" - """:obj:`str`: The type of :class:`telegram.BotCommandScopeDefault`.""" - ALL_PRIVATE_CHATS = "all_private_chats" - """:obj:`str`: The type of :class:`telegram.BotCommandScopeAllPrivateChats`.""" - ALL_GROUP_CHATS = "all_group_chats" - """:obj:`str`: The type of :class:`telegram.BotCommandScopeAllGroupChats`.""" - ALL_CHAT_ADMINISTRATORS = "all_chat_administrators" - """:obj:`str`: The type of :class:`telegram.BotCommandScopeAllChatAdministrators`.""" - CHAT = "chat" - """:obj:`str`: The type of :class:`telegram.BotCommandScopeChat`.""" - CHAT_ADMINISTRATORS = "chat_administrators" - """:obj:`str`: The type of :class:`telegram.BotCommandScopeChatAdministrators`.""" - CHAT_MEMBER = "chat_member" - """:obj:`str`: The type of :class:`telegram.BotCommandScopeChatMember`.""" - - -class BotDescriptionLimit(IntEnum): - """This enum contains limitations for the methods :meth:`telegram.Bot.set_my_description` and - :meth:`telegram.Bot.set_my_short_description`. The enum members of this enumeration are - instances of :class:`int` and can be treated as such. - - .. versionadded:: 20.2 - """ - - __slots__ = () - - MAX_DESCRIPTION_LENGTH = 512 - """:obj:`int`: Maximum length for the parameter - :paramref:`~telegram.Bot.set_my_description.description` of - :meth:`telegram.Bot.set_my_description` - """ - MAX_SHORT_DESCRIPTION_LENGTH = 120 - """:obj:`int`: Maximum length for the parameter - :paramref:`~telegram.Bot.set_my_short_description.short_description` of - :meth:`telegram.Bot.set_my_short_description` - """ - - -class BotNameLimit(IntEnum): - """This enum contains limitations for the methods :meth:`telegram.Bot.set_my_name`. - The enum members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 20.3 - """ - - __slots__ = () - - MAX_NAME_LENGTH = 64 - """:obj:`int`: Maximum length for the parameter :paramref:`~telegram.Bot.set_my_name.name` of - :meth:`telegram.Bot.set_my_name` - """ - - -class BulkRequestLimit(IntEnum): - """This enum contains limitations for :meth:`telegram.Bot.delete_messages`, - :meth:`telegram.Bot.forward_messages` and :meth:`telegram.Bot.copy_messages`. The enum members - of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 20.8 - """ - - __slots__ = () - - MIN_LIMIT = 1 - """:obj:`int`: Minimum number of messages required for bulk actions.""" - MAX_LIMIT = 100 - """:obj:`int`: Maximum number of messages required for bulk actions.""" - - -class BusinessLimit(IntEnum): - """This enum contains limitations related to handling business accounts. The enum members - of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 22.1 - """ - - __slots__ = () - - CHAT_ACTIVITY_TIMEOUT = int(dtm.timedelta(hours=24).total_seconds()) - """:obj:`int`: Time in seconds in which the chat must have been active for. Relevant for - :paramref:`~telegram.Bot.read_business_message.chat_id` - of :meth:`~telegram.Bot.read_business_message` and - :paramref:`~telegram.Bot.transfer_gift.new_owner_chat_id` - of :meth:`~telegram.Bot.transfer_gift`. - """ - MIN_NAME_LENGTH = 1 - """:obj:`int`: Minimum length of the name of a business account. Relevant only for - :paramref:`~telegram.Bot.set_business_account_name.first_name` of - :meth:`telegram.Bot.set_business_account_name`. - """ - MAX_NAME_LENGTH = 64 - """:obj:`int`: Maximum length of the name of a business account. Relevant for the parameters - of :meth:`telegram.Bot.set_business_account_name`. - """ - MAX_USERNAME_LENGTH = 32 - """::obj:`int`: Maximum length of the username of a business account. Relevant for - :paramref:`~telegram.Bot.set_business_account_username.username` of - :meth:`telegram.Bot.set_business_account_username`. - """ - MAX_BIO_LENGTH = 140 - """:obj:`int`: Maximum length of the bio of a business account. Relevant for - :paramref:`~telegram.Bot.set_business_account_bio.bio` of - :meth:`telegram.Bot.set_business_account_bio`. - """ - MIN_GIFT_RESULTS = 1 - """:obj:`int`: Minimum number of gifts to be returned. Relevant for - :paramref:`~telegram.Bot.get_business_account_gifts.limit` of - :meth:`telegram.Bot.get_business_account_gifts`. - """ - MAX_GIFT_RESULTS = 100 - """:obj:`int`: Maximum number of gifts to be returned. Relevant for - :paramref:`~telegram.Bot.get_business_account_gifts.limit` of - :meth:`telegram.Bot.get_business_account_gifts`. - """ - MIN_STAR_COUNT = 1 - """:obj:`int`: Minimum number of Telegram Stars to be transfered. Relevant for - :paramref:`~telegram.Bot.transfer_business_account_stars.star_count` of - :meth:`telegram.Bot.transfer_business_account_stars`. - """ - MAX_STAR_COUNT = 10000 - """:obj:`int`: Maximum number of Telegram Stars to be transfered. Relevant for - :paramref:`~telegram.Bot.transfer_business_account_stars.star_count` of - :meth:`telegram.Bot.transfer_business_account_stars`. - """ - - -class CallbackQueryLimit(IntEnum): - """This enum contains limitations for :class:`telegram.CallbackQuery`/ - :meth:`telegram.Bot.answer_callback_query`. The enum members of this enumeration are instances - of :class:`int` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - ANSWER_CALLBACK_QUERY_TEXT_LENGTH = 200 - """:obj:`int`: Maximum number of characters in a :obj:`str` passed as the - :paramref:`~telegram.Bot.answer_callback_query.text` parameter of - :meth:`telegram.Bot.answer_callback_query`.""" - - -class ChatAction(StringEnum): - """This enum contains the available chat actions for :meth:`telegram.Bot.send_chat_action`. - The enum members of this enumeration are instances of :class:`str` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - CHOOSE_STICKER = "choose_sticker" - """:obj:`str`: Chat action indicating that the bot is selecting a sticker.""" - FIND_LOCATION = "find_location" - """:obj:`str`: Chat action indicating that the bot is selecting a location.""" - RECORD_VOICE = "record_voice" - """:obj:`str`: Chat action indicating that the bot is recording a voice message.""" - RECORD_VIDEO = "record_video" - """:obj:`str`: Chat action indicating that the bot is recording a video.""" - RECORD_VIDEO_NOTE = "record_video_note" - """:obj:`str`: Chat action indicating that the bot is recording a video note.""" - TYPING = "typing" - """:obj:`str`: A chat indicating the bot is typing.""" - UPLOAD_VOICE = "upload_voice" - """:obj:`str`: Chat action indicating that the bot is uploading a voice message.""" - UPLOAD_DOCUMENT = "upload_document" - """:obj:`str`: Chat action indicating that the bot is uploading a document.""" - UPLOAD_PHOTO = "upload_photo" - """:obj:`str`: Chat action indicating that the bot is uploading a photo.""" - UPLOAD_VIDEO = "upload_video" - """:obj:`str`: Chat action indicating that the bot is uploading a video.""" - UPLOAD_VIDEO_NOTE = "upload_video_note" - """:obj:`str`: Chat action indicating that the bot is uploading a video note.""" - - -class ChatBoostSources(StringEnum): - """This enum contains the available sources for a - :class:`Telegram chat boost <telegram.ChatBoostSource>`. - The enum members of this enumeration are instances of :class:`str` and can be treated as such. - - .. versionadded:: 20.8 - """ - - __slots__ = () - - GIFT_CODE = "gift_code" - """:obj:`str`: The source of the chat boost was a Telegram Premium gift code.""" - GIVEAWAY = "giveaway" - """:obj:`str`: The source of the chat boost was a Telegram Premium giveaway.""" - PREMIUM = "premium" - """:obj:`str`: The source of the chat boost was a Telegram Premium subscription/gift.""" - - -class ChatID(IntEnum): - """This enum contains some special chat IDs. The enum - members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - ANONYMOUS_ADMIN = 1087968824 - """:obj:`int`: User ID in groups for messages sent by anonymous admins. Telegram chat: - `@GroupAnonymousBot <https://t.me/GroupAnonymousBot>`_. - - Note: - :attr:`telegram.Message.from_user` will contain this ID for backwards compatibility only. - It's recommended to use :attr:`telegram.Message.sender_chat` instead. - """ - SERVICE_CHAT = 777000 - """:obj:`int`: Telegram service chat, that also acts as sender of channel posts forwarded to - discussion groups. Telegram chat: `Telegram <https://t.me/+42777>`_. - - Note: - :attr:`telegram.Message.from_user` will contain this ID for backwards compatibility only. - It's recommended to use :attr:`telegram.Message.sender_chat` instead. - """ - FAKE_CHANNEL = 136817688 - """:obj:`int`: User ID in groups when message is sent on behalf of a channel, or when a channel - votes on a poll. Telegram chat: `@Channel_Bot <https://t.me/Channel_Bot>`_. - - Note: - * :attr:`telegram.Message.from_user` will contain this ID for backwards compatibility only. - It's recommended to use :attr:`telegram.Message.sender_chat` instead. - * :attr:`telegram.PollAnswer.user` will contain this ID for backwards compatibility only. - It's recommended to use :attr:`telegram.PollAnswer.voter_chat` instead. - """ - - -class ChatInviteLinkLimit(IntEnum): - """This enum contains limitations for :class:`telegram.ChatInviteLink`/ - :meth:`telegram.Bot.create_chat_invite_link`/:meth:`telegram.Bot.edit_chat_invite_link`. The - enum members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - MIN_MEMBER_LIMIT = 1 - """:obj:`int`: Minimum value allowed for the - :paramref:`~telegram.Bot.create_chat_invite_link.member_limit` parameter of - :meth:`telegram.Bot.create_chat_invite_link` and - :paramref:`~telegram.Bot.edit_chat_invite_link.member_limit` of - :meth:`telegram.Bot.edit_chat_invite_link`. - """ - MAX_MEMBER_LIMIT = 99999 - """:obj:`int`: Maximum value allowed for the - :paramref:`~telegram.Bot.create_chat_invite_link.member_limit` parameter of - :meth:`telegram.Bot.create_chat_invite_link` and - :paramref:`~telegram.Bot.edit_chat_invite_link.member_limit` of - :meth:`telegram.Bot.edit_chat_invite_link`. - """ - NAME_LENGTH = 32 - """:obj:`int`: Maximum number of characters in a :obj:`str` passed as the - :paramref:`~telegram.Bot.create_chat_invite_link.name` parameter of - :meth:`telegram.Bot.create_chat_invite_link` and - :paramref:`~telegram.Bot.edit_chat_invite_link.name` of - :meth:`telegram.Bot.edit_chat_invite_link`. - """ - - -class ChatLimit(IntEnum): - """This enum contains limitations for - :meth:`telegram.Bot.set_chat_administrator_custom_title`, - :meth:`telegram.Bot.set_chat_description`, and :meth:`telegram.Bot.set_chat_title`. - The enum members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - CHAT_ADMINISTRATOR_CUSTOM_TITLE_LENGTH = 16 - """:obj:`int`: Maximum length of a :obj:`str` passed as the - :paramref:`~telegram.Bot.set_chat_administrator_custom_title.custom_title` parameter of - :meth:`telegram.Bot.set_chat_administrator_custom_title`. - """ - CHAT_DESCRIPTION_LENGTH = 255 - """:obj:`int`: Maximum number of characters in a :obj:`str` passed as the - :paramref:`~telegram.Bot.set_chat_description.description` parameter of - :meth:`telegram.Bot.set_chat_description`. - """ - MIN_CHAT_TITLE_LENGTH = 1 - """:obj:`int`: Minimum length of a :obj:`str` passed as the - :paramref:`~telegram.Bot.set_chat_title.title` parameter of - :meth:`telegram.Bot.set_chat_title`. - """ - MAX_CHAT_TITLE_LENGTH = 128 - """:obj:`int`: Maximum length of a :obj:`str` passed as the - :paramref:`~telegram.Bot.set_chat_title.title` parameter of - :meth:`telegram.Bot.set_chat_title`. - """ - - -class ChatSubscriptionLimit(IntEnum): - """This enum contains limitations for - :paramref:`telegram.Bot.create_chat_subscription_invite_link.subscription_period` and - :paramref:`telegram.Bot.create_chat_subscription_invite_link.subscription_price`. - The enum members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 21.5 - """ - - __slots__ = () - - SUBSCRIPTION_PERIOD = 2592000 - """:obj:`int`: The number of seconds the subscription will be active.""" - MIN_PRICE = 1 - """:obj:`int`: Amount of stars a user pays, minimum amount the subscription can be set to.""" - MAX_PRICE = 10000 - """:obj:`int`: Amount of stars a user pays, maximum amount the subscription can be set to. - - .. versionchanged:: 22.1 - Bot API 9.0 changed the value to 10000. - """ - - -class BackgroundTypeLimit(IntEnum): - """This enum contains limitations for :class:`telegram.BackgroundTypeFill`, - :class:`telegram.BackgroundTypeWallpaper` and :class:`telegram.BackgroundTypePattern`. - The enum members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 21.2 - """ - - __slots__ = () - - MAX_DIMMING = 100 - """:obj:`int`: Maximum value allowed for: - - * :paramref:`~telegram.BackgroundTypeFill.dark_theme_dimming` parameter of - :class:`telegram.BackgroundTypeFill` - * :paramref:`~telegram.BackgroundTypeWallpaper.dark_theme_dimming` parameter of - :class:`telegram.BackgroundTypeWallpaper` - """ - MAX_INTENSITY = 100 - """:obj:`int`: Maximum value allowed for :paramref:`~telegram.BackgroundTypePattern.intensity` - parameter of :class:`telegram.BackgroundTypePattern` - """ - - -class BackgroundFillLimit(IntEnum): - """This enum contains limitations for :class:`telegram.BackgroundFillGradient`. - The enum members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 21.2 - """ - - __slots__ = () - - MAX_ROTATION_ANGLE = 359 - """:obj:`int`: Maximum value allowed for: - :paramref:`~telegram.BackgroundFillGradient.rotation_angle` parameter of - :class:`telegram.BackgroundFillGradient` - """ - - -class ChatMemberStatus(StringEnum): - """This enum contains the available states for :class:`telegram.ChatMember`. The enum - members of this enumeration are instances of :class:`str` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - ADMINISTRATOR = "administrator" - """:obj:`str`: A :class:`telegram.ChatMember` who is administrator of the chat.""" - OWNER = "creator" - """:obj:`str`: A :class:`telegram.ChatMember` who is the owner of the chat.""" - BANNED = "kicked" - """:obj:`str`: A :class:`telegram.ChatMember` who was banned in the chat.""" - LEFT = "left" - """:obj:`str`: A :class:`telegram.ChatMember` who has left the chat.""" - MEMBER = "member" - """:obj:`str`: A :class:`telegram.ChatMember` who is a member of the chat.""" - RESTRICTED = "restricted" - """:obj:`str`: A :class:`telegram.ChatMember` who was restricted in this chat.""" - - -class ChatPhotoSize(IntEnum): - """This enum contains limitations for :class:`telegram.ChatPhoto`. - The enum members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - SMALL = 160 - """:obj:`int`: Width and height of a small chat photo, ID of which is passed in - :paramref:`~telegram.ChatPhoto.small_file_id` and - :paramref:`~telegram.ChatPhoto.small_file_unique_id` parameters of - :class:`telegram.ChatPhoto`. - """ - BIG = 640 - """:obj:`int`: Width and height of a big chat photo, ID of which is passed in - :paramref:`~telegram.ChatPhoto.big_file_id` and - :paramref:`~telegram.ChatPhoto.big_file_unique_id` parameters of - :class:`telegram.ChatPhoto`. - """ - - -class ChatType(StringEnum): - """This enum contains the available types of :class:`telegram.Chat`. The enum - members of this enumeration are instances of :class:`str` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - SENDER = "sender" - """:obj:`str`: A :class:`telegram.Chat` that represents the chat of a :class:`telegram.User` - sending an :class:`telegram.InlineQuery`. """ - PRIVATE = "private" - """:obj:`str`: A :class:`telegram.Chat` that is private.""" - GROUP = "group" - """:obj:`str`: A :class:`telegram.Chat` that is a group.""" - SUPERGROUP = "supergroup" - """:obj:`str`: A :class:`telegram.Chat` that is a supergroup.""" - CHANNEL = "channel" - """:obj:`str`: A :class:`telegram.Chat` that is a channel.""" - - -class ContactLimit(IntEnum): - """This enum contains limitations for :class:`telegram.InlineQueryResultContact`, - :class:`telegram.InputContactMessageContent`, and :meth:`telegram.Bot.send_contact`. - The enum members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - VCARD = 2048 - """:obj:`int`: Maximum value allowed for: - - * :paramref:`~telegram.Bot.send_contact.vcard` parameter of :meth:`~telegram.Bot.send_contact` - * :paramref:`~telegram.InlineQueryResultContact.vcard` parameter of - :class:`~telegram.InlineQueryResultContact` - * :paramref:`~telegram.InputContactMessageContent.vcard` parameter of - :class:`~telegram.InputContactMessageContent` - """ - - -class CustomEmojiStickerLimit(IntEnum): - """This enum contains limitations for :meth:`telegram.Bot.get_custom_emoji_stickers`. - The enum members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - CUSTOM_EMOJI_IDENTIFIER_LIMIT = 200 - """:obj:`int`: Maximum amount of custom emoji identifiers which can be specified for the - :paramref:`~telegram.Bot.get_custom_emoji_stickers.custom_emoji_ids` parameter of - :meth:`telegram.Bot.get_custom_emoji_stickers`. - """ - - -class DiceEmoji(StringEnum): - """This enum contains the available emoji for :class:`telegram.Dice`/ - :meth:`telegram.Bot.send_dice`. The enum - members of this enumeration are instances of :class:`str` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - DICE = "🎲" - """:obj:`str`: A :class:`telegram.Dice` with the emoji ``🎲``.""" - DARTS = "🎯" - """:obj:`str`: A :class:`telegram.Dice` with the emoji ``🎯``.""" - BASKETBALL = "🏀" - """:obj:`str`: A :class:`telegram.Dice` with the emoji ``🏀``.""" - FOOTBALL = "⚽" - """:obj:`str`: A :class:`telegram.Dice` with the emoji ``⚽``.""" - SLOT_MACHINE = "🎰" - """:obj:`str`: A :class:`telegram.Dice` with the emoji ``🎰``.""" - BOWLING = "🎳" - """:obj:`str`: A :class:`telegram.Dice` with the emoji ``🎳``.""" - - -class DiceLimit(IntEnum): - """This enum contains limitations for :class:`telegram.Dice`. - The enum members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - MIN_VALUE = 1 - """:obj:`int`: Minimum value allowed for :paramref:`~telegram.Dice.value` parameter of - :class:`telegram.Dice` (any emoji). - """ - - MAX_VALUE_BASKETBALL = 5 - """:obj:`int`: Maximum value allowed for :paramref:`~telegram.Dice.value` parameter of - :class:`telegram.Dice` if :paramref:`~telegram.Dice.emoji` is - :tg-const:`telegram.constants.DiceEmoji.BASKETBALL`. - """ - MAX_VALUE_BOWLING = 6 - """:obj:`int`: Maximum value allowed for :paramref:`~telegram.Dice.value` parameter of - :class:`telegram.Dice` if :paramref:`~telegram.Dice.emoji` is - :tg-const:`telegram.constants.DiceEmoji.BOWLING`. - """ - MAX_VALUE_DARTS = 6 - """:obj:`int`: Maximum value allowed for :paramref:`~telegram.Dice.value` parameter of - :class:`telegram.Dice` if :paramref:`~telegram.Dice.emoji` is - :tg-const:`telegram.constants.DiceEmoji.DARTS`. - """ - MAX_VALUE_DICE = 6 - """:obj:`int`: Maximum value allowed for :paramref:`~telegram.Dice.value` parameter of - :class:`telegram.Dice` if :paramref:`~telegram.Dice.emoji` is - :tg-const:`telegram.constants.DiceEmoji.DICE`. - """ - MAX_VALUE_FOOTBALL = 5 - """:obj:`int`: Maximum value allowed for :paramref:`~telegram.Dice.value` parameter of - :class:`telegram.Dice` if :paramref:`~telegram.Dice.emoji` is - :tg-const:`telegram.constants.DiceEmoji.FOOTBALL`. - """ - MAX_VALUE_SLOT_MACHINE = 64 - """:obj:`int`: Maximum value allowed for :paramref:`~telegram.Dice.value` parameter of - :class:`telegram.Dice` if :paramref:`~telegram.Dice.emoji` is - :tg-const:`telegram.constants.DiceEmoji.SLOT_MACHINE`. - """ - - -class FileSizeLimit(IntEnum): - """This enum contains limitations regarding the upload and download of files. The enum - members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - FILESIZE_DOWNLOAD = int(20e6) # (20MB) - """:obj:`int`: Bots can download files of up to 20MB in size.""" - FILESIZE_UPLOAD = int(50e6) # (50MB) - """:obj:`int`: Bots can upload non-photo files of up to 50MB in size.""" - FILESIZE_UPLOAD_LOCAL_MODE = int(2e9) # (2000MB) - """:obj:`int`: Bots can upload non-photo files of up to 2000MB in size when using a local bot - API server. - """ - FILESIZE_DOWNLOAD_LOCAL_MODE = sys.maxsize - """:obj:`int`: Bots can download files without a size limit when using a local bot API server. - """ - PHOTOSIZE_UPLOAD = int(10e6) # (10MB) - """:obj:`int`: Bots can upload photo files of up to 10MB in size.""" - VOICE_NOTE_FILE_SIZE = int(1e6) # (1MB) - """:obj:`int`: File size limit for the :meth:`~telegram.Bot.send_voice` method of - :class:`telegram.Bot`. Bots can send :mimetype:`audio/ogg` files of up to 1MB in size as - a voice note. Larger voice notes (up to 20MB) will be sent as files.""" - # It seems OK to link 20MB limit to FILESIZE_DOWNLOAD rather than creating a new constant - - -class FloodLimit(IntEnum): - """This enum contains limitations regarding flood limits. The enum - members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - MESSAGES_PER_SECOND_PER_CHAT = 1 - """:obj:`int`: The number of messages that can be sent per second in a particular chat. - Telegram may allow short bursts that go over this limit, but eventually you'll begin - receiving 429 errors. - """ - MESSAGES_PER_SECOND = 30 - """:obj:`int`: The number of messages that can roughly be sent in an interval of 30 seconds - across all chats. - """ - MESSAGES_PER_MINUTE_PER_GROUP = 20 - """:obj:`int`: The number of messages that can roughly be sent to a particular group within one - minute. - """ - PAID_MESSAGES_PER_SECOND = 1000 - """:obj:`int`: The number of messages that can be sent per second when paying with the bot's - Telegram Star balance. See e.g. parameter - :paramref:`~telegram.Bot.send_message.allow_paid_broadcast` of - :meth:`~telegram.Bot.send_message`. - - .. versionadded:: 21.7 - """ - - -class ForumIconColor(IntEnum): - """This enum contains the available colors for use in - :paramref:`telegram.Bot.create_forum_topic.icon_color`. The enum members of this enumeration - are instances of :class:`int` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - BLUE = 0x6FB9F0 - """:obj:`int`: An icon with a color which corresponds to blue (``0x6FB9F0``). - - .. raw:: html - - <div style="height:15px; width:15px; background-color:#6FB9F0;"></div> - - """ - YELLOW = 0xFFD67E - """:obj:`int`: An icon with a color which corresponds to yellow (``0xFFD67E``). - - .. raw:: html - - <div style="height:15px; width:15px; background-color:#FFD67E;"></div> - - """ - PURPLE = 0xCB86DB - """:obj:`int`: An icon with a color which corresponds to purple (``0xCB86DB``). - - .. raw:: html - - <div style="height:15px; width:15px; background-color:#CB86DB;"></div> - - """ - GREEN = 0x8EEE98 - """:obj:`int`: An icon with a color which corresponds to green (``0x8EEE98``). - - .. raw:: html - - <div style="height:15px; width:15px; background-color:#8EEE98;"></div> - - """ - PINK = 0xFF93B2 - """:obj:`int`: An icon with a color which corresponds to pink (``0xFF93B2``). - - .. raw:: html - - <div style="height:15px; width:15px; background-color:#FF93B2;"></div> - - """ - RED = 0xFB6F5F - """:obj:`int`: An icon with a color which corresponds to red (``0xFB6F5F``). - - .. raw:: html - - <div style="height:15px; width:15px; background-color:#FB6F5F;"></div> - - """ - - -class GiftLimit(IntEnum): - """This enum contains limitations for :meth:`~telegram.Bot.send_gift`. - The enum members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 21.8 - """ - - __slots__ = () - - MAX_TEXT_LENGTH = 128 - """:obj:`int`: Maximum number of characters in a :obj:`str` passed as the - :paramref:`~telegram.Bot.send_gift.text` parameter of :meth:`~telegram.Bot.send_gift`. - - .. versionchanged:: 21.11 - Updated Value to 128 based on Bot API 8.3 - """ - - -class GiveawayLimit(IntEnum): - """This enum contains limitations for :class:`telegram.Giveaway` and related classes. - The enum members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 20.8 - """ - - __slots__ = () - - MAX_WINNERS = 100 - """:obj:`int`: Maximum number of winners allowed for :class:`telegram.GiveawayWinners.winners`. - """ - - -class KeyboardButtonRequestUsersLimit(IntEnum): - """This enum contains limitations for :class:`telegram.KeyboardButtonRequestUsers`. - The enum members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 20.8 - """ - - __slots__ = () - - MIN_QUANTITY = 1 - """:obj:`int`: Minimum value allowed for - :paramref:`~telegram.KeyboardButtonRequestUsers.max_quantity` parameter of - :class:`telegram.KeyboardButtonRequestUsers`. - """ - MAX_QUANTITY = 10 - """:obj:`int`: Maximum value allowed for - :paramref:`~telegram.KeyboardButtonRequestUsers.max_quantity` parameter of - :class:`telegram.KeyboardButtonRequestUsers`. - """ - - -class InlineKeyboardButtonLimit(IntEnum): - """This enum contains limitations for :class:`telegram.InlineKeyboardButton`. - The enum members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - MIN_CALLBACK_DATA = 1 - """:obj:`int`: Minimum length allowed for - :paramref:`~telegram.InlineKeyboardButton.callback_data` parameter of - :class:`telegram.InlineKeyboardButton` - """ - MAX_CALLBACK_DATA = 64 - """:obj:`int`: Maximum length allowed for - :paramref:`~telegram.InlineKeyboardButton.callback_data` parameter of - :class:`telegram.InlineKeyboardButton` - """ - MIN_COPY_TEXT = 1 - """:obj:`int`: Minimum length allowed for - :paramref:`~telegram.CopyTextButton.text` parameter of :class:`telegram.CopyTextButton` - """ - MAX_COPY_TEXT = 256 - """:obj:`int`: Maximum length allowed for - :paramref:`~telegram.CopyTextButton.text` parameter of :class:`telegram.CopyTextButton` - """ - - -class InlineKeyboardMarkupLimit(IntEnum): - """This enum contains limitations for :class:`telegram.InlineKeyboardMarkup`/ - :meth:`telegram.Bot.send_message` & friends. The enum - members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - TOTAL_BUTTON_NUMBER = 100 - """:obj:`int`: Maximum number of buttons that can be attached to a message. - - Note: - This value is undocumented and might be changed by Telegram. - """ - BUTTONS_PER_ROW = 8 - """:obj:`int`: Maximum number of buttons that can be attached to a message per row. - - Note: - This value is undocumented and might be changed by Telegram. - """ - - -class InputMediaType(StringEnum): - """This enum contains the available types of :class:`telegram.InputMedia`. The enum - members of this enumeration are instances of :class:`str` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - ANIMATION = "animation" - """:obj:`str`: Type of :class:`telegram.InputMediaAnimation`.""" - DOCUMENT = "document" - """:obj:`str`: Type of :class:`telegram.InputMediaDocument`.""" - AUDIO = "audio" - """:obj:`str`: Type of :class:`telegram.InputMediaAudio`.""" - PHOTO = "photo" - """:obj:`str`: Type of :class:`telegram.InputMediaPhoto`.""" - VIDEO = "video" - """:obj:`str`: Type of :class:`telegram.InputMediaVideo`.""" - - -class InputPaidMediaType(StringEnum): - """This enum contains the available types of :class:`telegram.InputPaidMedia`. The enum - members of this enumeration are instances of :class:`str` and can be treated as such. - - .. versionadded:: 21.4 - """ - - __slots__ = () - - PHOTO = "photo" - """:obj:`str`: Type of :class:`telegram.InputMediaPhoto`.""" - VIDEO = "video" - """:obj:`str`: Type of :class:`telegram.InputMediaVideo`.""" - - -class InputProfilePhotoType(StringEnum): - """This enum contains the available types of :class:`telegram.InputProfilePhoto`. The enum - members of this enumeration are instances of :class:`str` and can be treated as such. - - .. versionadded:: 22.1 - """ - - __slots__ = () - - STATIC = "static" - """:obj:`str`: Type of :class:`telegram.InputProfilePhotoStatic`.""" - ANIMATED = "animated" - """:obj:`str`: Type of :class:`telegram.InputProfilePhotoAnimated`.""" - - -class InputStoryContentLimit(StringEnum): - """This enum contains limitations for :class:`telegram.InputStoryContentPhoto`/ - :class:`telegram.InputStoryContentVideo`. The enum members of this enumeration are instances - of :class:`int` and can be treated as such. - - .. versionadded:: 22.1 - """ - - __slots__ = () - - PHOTOSIZE_UPLOAD = FileSizeLimit.PHOTOSIZE_UPLOAD # (10MB) - """:obj:`int`: Maximum file size of the photo to be passed to - :paramref:`~telegram.InputStoryContentPhoto.photo` parameter of - :class:`telegram.InputStoryContentPhoto` in Bytes. - """ - PHOTO_WIDTH = 1080 - """:obj:`int`: Horizontal resolution of the photo to be passed to - :paramref:`~telegram.InputStoryContentPhoto.photo` parameter of - :class:`telegram.InputStoryContentPhoto`. - """ - PHOTO_HEIGHT = 1920 - """:obj:`int`: Vertical resolution of the video to be passed to - :paramref:`~telegram.InputStoryContentPhoto.photo` parameter of - :class:`telegram.InputStoryContentPhoto`. - """ - VIDEOSIZE_UPLOAD = int(30e6) # (30MB) - """:obj:`int`: Maximum file size of the video to be passed to - :paramref:`~telegram.InputStoryContentVideo.video` parameter of - :class:`telegram.InputStoryContentVideo` in Bytes. - """ - VIDEO_WIDTH = 720 - """:obj:`int`: Horizontal resolution of the video to be passed to - :paramref:`~telegram.InputStoryContentVideo.video` parameter of - :class:`telegram.InputStoryContentVideo`. - """ - VIDEO_HEIGHT = 1080 - """:obj:`int`: Vertical resolution of the video to be passed to - :paramref:`~telegram.InputStoryContentVideo.video` parameter of - :class:`telegram.InputStoryContentVideo`. - """ - MAX_VIDEO_DURATION = int(dtm.timedelta(seconds=60).total_seconds()) - """:obj:`int`: Maximum duration of the video to be passed to - :paramref:`~telegram.InputStoryContentVideo.duration` parameter of - :class:`telegram.InputStoryContentVideo`. - """ - - -class InputStoryContentType(StringEnum): - """This enum contains the available types of :class:`telegram.InputStoryContent`. The enum - members of this enumeration are instances of :class:`str` and can be treated as such. - - .. versionadded:: 22.1 - """ - - __slots__ = () - - PHOTO = "photo" - """:obj:`str`: Type of :class:`telegram.InputStoryContentPhoto`.""" - VIDEO = "video" - """:obj:`str`: Type of :class:`telegram.InputStoryContentVideo`.""" - - -class InlineQueryLimit(IntEnum): - """This enum contains limitations for :class:`telegram.InlineQuery`/ - :meth:`telegram.Bot.answer_inline_query`. The enum members of this enumeration are instances - of :class:`int` and can be treated as such. - - .. versionadded:: 20.0 - - .. versionchanged:: 22.0 - Removed deprecated attributes ``InlineQueryLimit.MIN_SWITCH_PM_TEXT_LENGTH`` and - ``InlineQueryLimit.MAX_SWITCH_PM_TEXT_LENGTH``. Please instead use - :attr:`InlineQueryResultsButtonLimit.MIN_START_PARAMETER_LENGTH` and - :attr:`InlineQueryResultsButtonLimit.MAX_START_PARAMETER_LENGTH`. - """ - - __slots__ = () - - RESULTS = 50 - """:obj:`int`: Maximum number of results that can be passed to - :meth:`telegram.Bot.answer_inline_query`.""" - MAX_OFFSET_LENGTH = 64 - """:obj:`int`: Maximum number of bytes in a :obj:`str` passed as the - :paramref:`~telegram.Bot.answer_inline_query.next_offset` parameter of - :meth:`telegram.Bot.answer_inline_query`.""" - MAX_QUERY_LENGTH = 256 - """:obj:`int`: Maximum number of characters in a :obj:`str` passed as the - :paramref:`~telegram.InlineQuery.query` parameter of :class:`telegram.InlineQuery`.""" - - -class InlineQueryResultLimit(IntEnum): - """This enum contains limitations for :class:`telegram.InlineQueryResult` and its subclasses. - The enum members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - MIN_ID_LENGTH = 1 - """:obj:`int`: Minimum number of bytes in a :obj:`str` passed as the - :paramref:`~telegram.InlineQueryResult.id` parameter of - :class:`telegram.InlineQueryResult` and its subclasses - """ - MAX_ID_LENGTH = 64 - """:obj:`int`: Maximum number of bytes in a :obj:`str` passed as the - :paramref:`~telegram.InlineQueryResult.id` parameter of - :class:`telegram.InlineQueryResult` and its subclasses - """ - - -class InlineQueryResultsButtonLimit(IntEnum): - """This enum contains limitations for :class:`telegram.InlineQueryResultsButton`. - The enum members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 20.3 - """ - - __slots__ = () - - MIN_START_PARAMETER_LENGTH = 1 - """:obj:`int`: Minimum number of characters in a :obj:`str` passed as the - :paramref:`~telegram.InlineQueryResultsButton.start_parameter` parameter of - :meth:`telegram.InlineQueryResultsButton`.""" - - MAX_START_PARAMETER_LENGTH = 64 - """:obj:`int`: Maximum number of characters in a :obj:`str` passed as the - :paramref:`~telegram.InlineQueryResultsButton.start_parameter` parameter of - :meth:`telegram.InlineQueryResultsButton`.""" - - -class InlineQueryResultType(StringEnum): - """This enum contains the available types of :class:`telegram.InlineQueryResult`. The enum - members of this enumeration are instances of :class:`str` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - AUDIO = "audio" - """:obj:`str`: Type of :class:`telegram.InlineQueryResultAudio` and - :class:`telegram.InlineQueryResultCachedAudio`. - """ - DOCUMENT = "document" - """:obj:`str`: Type of :class:`telegram.InlineQueryResultDocument` and - :class:`telegram.InlineQueryResultCachedDocument`. - """ - GIF = "gif" - """:obj:`str`: Type of :class:`telegram.InlineQueryResultGif` and - :class:`telegram.InlineQueryResultCachedGif`. - """ - MPEG4GIF = "mpeg4_gif" - """:obj:`str`: Type of :class:`telegram.InlineQueryResultMpeg4Gif` and - :class:`telegram.InlineQueryResultCachedMpeg4Gif`. - """ - PHOTO = "photo" - """:obj:`str`: Type of :class:`telegram.InlineQueryResultPhoto` and - :class:`telegram.InlineQueryResultCachedPhoto`. - """ - STICKER = "sticker" - """:obj:`str`: Type of and :class:`telegram.InlineQueryResultCachedSticker`.""" - VIDEO = "video" - """:obj:`str`: Type of :class:`telegram.InlineQueryResultVideo` and - :class:`telegram.InlineQueryResultCachedVideo`. - """ - VOICE = "voice" - """:obj:`str`: Type of :class:`telegram.InlineQueryResultVoice` and - :class:`telegram.InlineQueryResultCachedVoice`. - """ - ARTICLE = "article" - """:obj:`str`: Type of :class:`telegram.InlineQueryResultArticle`.""" - CONTACT = "contact" - """:obj:`str`: Type of :class:`telegram.InlineQueryResultContact`.""" - GAME = "game" - """:obj:`str`: Type of :class:`telegram.InlineQueryResultGame`.""" - LOCATION = "location" - """:obj:`str`: Type of :class:`telegram.InlineQueryResultLocation`.""" - VENUE = "venue" - """:obj:`str`: Type of :class:`telegram.InlineQueryResultVenue`.""" - - -class LocationLimit(IntEnum): - """This enum contains limitations for - :class:`telegram.Location`/:class:`telegram.ChatLocation`/ - :meth:`telegram.Bot.edit_message_live_location`/:meth:`telegram.Bot.send_location`. - The enum members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - MIN_CHAT_LOCATION_ADDRESS = 1 - """:obj:`int`: Minimum value allowed for :paramref:`~telegram.ChatLocation.address` parameter - of :class:`telegram.ChatLocation` - """ - MAX_CHAT_LOCATION_ADDRESS = 64 - """:obj:`int`: Minimum value allowed for :paramref:`~telegram.ChatLocation.address` parameter - of :class:`telegram.ChatLocation` - """ - - HORIZONTAL_ACCURACY = 1500 - """:obj:`int`: Maximum value allowed for: - - * :paramref:`~telegram.Location.horizontal_accuracy` parameter of :class:`telegram.Location` - * :paramref:`~telegram.InlineQueryResultLocation.horizontal_accuracy` parameter of - :class:`telegram.InlineQueryResultLocation` - * :paramref:`~telegram.InputLocationMessageContent.horizontal_accuracy` parameter of - :class:`telegram.InputLocationMessageContent` - * :paramref:`~telegram.Bot.edit_message_live_location.horizontal_accuracy` parameter of - :meth:`telegram.Bot.edit_message_live_location` - * :paramref:`~telegram.Bot.send_location.horizontal_accuracy` parameter of - :meth:`telegram.Bot.send_location` - """ - - MIN_HEADING = 1 - """:obj:`int`: Minimum value allowed for: - - * :paramref:`~telegram.Location.heading` parameter of :class:`telegram.Location` - * :paramref:`~telegram.InlineQueryResultLocation.heading` parameter of - :class:`telegram.InlineQueryResultLocation` - * :paramref:`~telegram.InputLocationMessageContent.heading` parameter of - :class:`telegram.InputLocationMessageContent` - * :paramref:`~telegram.Bot.edit_message_live_location.heading` parameter of - :meth:`telegram.Bot.edit_message_live_location` - * :paramref:`~telegram.Bot.send_location.heading` parameter of - :meth:`telegram.Bot.send_location` - """ - MAX_HEADING = 360 - """:obj:`int`: Maximum value allowed for: - - * :paramref:`~telegram.Location.heading` parameter of :class:`telegram.Location` - * :paramref:`~telegram.InlineQueryResultLocation.heading` parameter of - :class:`telegram.InlineQueryResultLocation` - * :paramref:`~telegram.InputLocationMessageContent.heading` parameter of - :class:`telegram.InputLocationMessageContent` - * :paramref:`~telegram.Bot.edit_message_live_location.heading` parameter of - :meth:`telegram.Bot.edit_message_live_location` - * :paramref:`~telegram.Bot.send_location.heading` parameter of - :meth:`telegram.Bot.send_location` - """ - - MIN_LIVE_PERIOD = 60 - """:obj:`int`: Minimum value allowed for: - - * :paramref:`~telegram.InlineQueryResultLocation.live_period` parameter of - :class:`telegram.InlineQueryResultLocation` - * :paramref:`~telegram.InputLocationMessageContent.live_period` parameter of - :class:`telegram.InputLocationMessageContent` - * :paramref:`~telegram.Bot.edit_message_live_location.live_period` parameter of - :meth:`telegram.Bot.edit_message_live_location` - * :paramref:`~telegram.Bot.send_location.live_period` parameter of - :meth:`telegram.Bot.send_location` - """ - MAX_LIVE_PERIOD = 86400 - """:obj:`int`: Maximum value allowed for: - - * :paramref:`~telegram.InlineQueryResultLocation.live_period` parameter of - :class:`telegram.InlineQueryResultLocation` - * :paramref:`~telegram.InputLocationMessageContent.live_period` parameter of - :class:`telegram.InputLocationMessageContent` - * :paramref:`~telegram.Bot.edit_message_live_location.live_period` parameter of - :meth:`telegram.Bot.edit_message_live_location` - * :paramref:`~telegram.Bot.send_location.live_period` parameter of - :meth:`telegram.Bot.send_location` - """ - - LIVE_PERIOD_FOREVER = int(hex(0x7FFFFFFF), 16) - """:obj:`int`: Value for live locations that can be edited indefinitely. Passed in: - - * :paramref:`~telegram.InlineQueryResultLocation.live_period` parameter of - :class:`telegram.InlineQueryResultLocation` - * :paramref:`~telegram.InputLocationMessageContent.live_period` parameter of - :class:`telegram.InputLocationMessageContent` - * :paramref:`~telegram.Bot.edit_message_live_location.live_period` parameter of - :meth:`telegram.Bot.edit_message_live_location` - * :paramref:`~telegram.Bot.send_location.live_period` parameter of - :meth:`telegram.Bot.send_location` - - .. versionadded:: 21.2 - """ - - MIN_PROXIMITY_ALERT_RADIUS = 1 - """:obj:`int`: Minimum value allowed for: - - * :paramref:`~telegram.InlineQueryResultLocation.proximity_alert_radius` parameter of - :class:`telegram.InlineQueryResultLocation` - * :paramref:`~telegram.InputLocationMessageContent.proximity_alert_radius` parameter of - :class:`telegram.InputLocationMessageContent` - * :paramref:`~telegram.Bot.edit_message_live_location.proximity_alert_radius` parameter of - :meth:`telegram.Bot.edit_message_live_location` - * :paramref:`~telegram.Bot.send_location.proximity_alert_radius` parameter of - :meth:`telegram.Bot.send_location` - """ - MAX_PROXIMITY_ALERT_RADIUS = 100000 - """:obj:`int`: Maximum value allowed for: - - * :paramref:`~telegram.InlineQueryResultLocation.proximity_alert_radius` parameter of - :class:`telegram.InlineQueryResultLocation` - * :paramref:`~telegram.InputLocationMessageContent.proximity_alert_radius` parameter of - :class:`telegram.InputLocationMessageContent` - * :paramref:`~telegram.Bot.edit_message_live_location.proximity_alert_radius` parameter of - :meth:`telegram.Bot.edit_message_live_location` - * :paramref:`~telegram.Bot.send_location.proximity_alert_radius` parameter of - :meth:`telegram.Bot.send_location` - """ - - -class MaskPosition(StringEnum): - """This enum contains the available positions for :class:`telegram.MaskPosition`. The enum - members of this enumeration are instances of :class:`str` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - FOREHEAD = "forehead" - """:obj:`str`: Mask position for a sticker on the forehead.""" - EYES = "eyes" - """:obj:`str`: Mask position for a sticker on the eyes.""" - MOUTH = "mouth" - """:obj:`str`: Mask position for a sticker on the mouth.""" - CHIN = "chin" - """:obj:`str`: Mask position for a sticker on the chin.""" - - -class MediaGroupLimit(IntEnum): - """This enum contains limitations for :meth:`telegram.Bot.send_media_group`. - The enum members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - MIN_MEDIA_LENGTH = 2 - """:obj:`int`: Minimum length of a :obj:`list` passed as the - :paramref:`~telegram.Bot.send_media_group.media` parameter of - :meth:`telegram.Bot.send_media_group`. - """ - MAX_MEDIA_LENGTH = 10 - """:obj:`int`: Maximum length of a :obj:`list` passed as the - :paramref:`~telegram.Bot.send_media_group.media` parameter of - :meth:`telegram.Bot.send_media_group`. - """ - - -class MenuButtonType(StringEnum): - """This enum contains the available types of :class:`telegram.MenuButton`. The enum - members of this enumeration are instances of :class:`str` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - COMMANDS = "commands" - """:obj:`str`: The type of :class:`telegram.MenuButtonCommands`.""" - WEB_APP = "web_app" - """:obj:`str`: The type of :class:`telegram.MenuButtonWebApp`.""" - DEFAULT = "default" - """:obj:`str`: The type of :class:`telegram.MenuButtonDefault`.""" - - -class MessageAttachmentType(StringEnum): - """This enum contains the available types of :class:`telegram.Message` that can be seen - as attachment. The enum - members of this enumeration are instances of :class:`str` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - # Make sure that all constants here are also listed in the MessageType Enum! - # (Enums are not extendable) - - ANIMATION = "animation" - """:obj:`str`: Messages with :attr:`telegram.Message.animation`.""" - AUDIO = "audio" - """:obj:`str`: Messages with :attr:`telegram.Message.audio`.""" - CONTACT = "contact" - """:obj:`str`: Messages with :attr:`telegram.Message.contact`.""" - DICE = "dice" - """:obj:`str`: Messages with :attr:`telegram.Message.dice`.""" - DOCUMENT = "document" - """:obj:`str`: Messages with :attr:`telegram.Message.document`.""" - GAME = "game" - """:obj:`str`: Messages with :attr:`telegram.Message.game`.""" - INVOICE = "invoice" - """:obj:`str`: Messages with :attr:`telegram.Message.invoice`.""" - LOCATION = "location" - """:obj:`str`: Messages with :attr:`telegram.Message.location`.""" - PAID_MEDIA = "paid_media" - """:obj:`str`: Messages with :attr:`telegram.Message.paid_media`. - - .. versionadded:: 21.4 - """ - PASSPORT_DATA = "passport_data" - """:obj:`str`: Messages with :attr:`telegram.Message.passport_data`.""" - PHOTO = "photo" - """:obj:`str`: Messages with :attr:`telegram.Message.photo`.""" - POLL = "poll" - """:obj:`str`: Messages with :attr:`telegram.Message.poll`.""" - STICKER = "sticker" - """:obj:`str`: Messages with :attr:`telegram.Message.sticker`.""" - STORY = "story" - """:obj:`str`: Messages with :attr:`telegram.Message.story`.""" - SUCCESSFUL_PAYMENT = "successful_payment" - """:obj:`str`: Messages with :attr:`telegram.Message.successful_payment`.""" - VIDEO = "video" - """:obj:`str`: Messages with :attr:`telegram.Message.video`.""" - VIDEO_NOTE = "video_note" - """:obj:`str`: Messages with :attr:`telegram.Message.video_note`.""" - VOICE = "voice" - """:obj:`str`: Messages with :attr:`telegram.Message.voice`.""" - VENUE = "venue" - """:obj:`str`: Messages with :attr:`telegram.Message.venue`.""" - - -class MessageEntityType(StringEnum): - """This enum contains the available types of :class:`telegram.MessageEntity`. The enum - members of this enumeration are instances of :class:`str` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - BLOCKQUOTE = "blockquote" - """:obj:`str`: Message entities representing a block quotation. - - .. versionadded:: 20.8 - """ - BOLD = "bold" - """:obj:`str`: Message entities representing bold text.""" - BOT_COMMAND = "bot_command" - """:obj:`str`: Message entities representing a bot command.""" - CASHTAG = "cashtag" - """:obj:`str`: Message entities representing a cashtag.""" - CODE = "code" - """:obj:`str`: Message entities representing monowidth string.""" - CUSTOM_EMOJI = "custom_emoji" - """:obj:`str`: Message entities representing inline custom emoji stickers. - - .. versionadded:: 20.0 - """ - EMAIL = "email" - """:obj:`str`: Message entities representing a email.""" - EXPANDABLE_BLOCKQUOTE = "expandable_blockquote" - """:obj:`str`: Message entities representing collapsed-by-default block quotation. - - .. versionadded:: 21.3 - """ - HASHTAG = "hashtag" - """:obj:`str`: Message entities representing a hashtag.""" - ITALIC = "italic" - """:obj:`str`: Message entities representing italic text.""" - MENTION = "mention" - """:obj:`str`: Message entities representing a mention.""" - PHONE_NUMBER = "phone_number" - """:obj:`str`: Message entities representing a phone number.""" - PRE = "pre" - """:obj:`str`: Message entities representing monowidth block.""" - SPOILER = "spoiler" - """:obj:`str`: Message entities representing spoiler text.""" - STRIKETHROUGH = "strikethrough" - """:obj:`str`: Message entities representing strikethrough text.""" - TEXT_LINK = "text_link" - """:obj:`str`: Message entities representing clickable text URLs.""" - TEXT_MENTION = "text_mention" - """:obj:`str`: Message entities representing text mention for users without usernames.""" - UNDERLINE = "underline" - """:obj:`str`: Message entities representing underline text.""" - URL = "url" - """:obj:`str`: Message entities representing a url.""" - - -class MessageLimit(IntEnum): - """This enum contains limitations for :class:`telegram.Message`/ - :class:`telegram.InputTextMessageContent`/ - :meth:`telegram.Bot.send_message` & friends. The enum - members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - # TODO add links to params? - MAX_TEXT_LENGTH = 4096 - """:obj:`int`: Maximum number of characters in a :obj:`str` passed as: - - * :paramref:`~telegram.Game.text` parameter of :class:`telegram.Game` - * :paramref:`~telegram.Message.text` parameter of :class:`telegram.Message` - * :paramref:`~telegram.InputTextMessageContent.message_text` parameter of - :class:`telegram.InputTextMessageContent` - * :paramref:`~telegram.Bot.send_message.text` parameter of :meth:`telegram.Bot.send_message` - * :paramref:`~telegram.Bot.edit_message_text.text` parameter of - :meth:`telegram.Bot.edit_message_text` - """ - CAPTION_LENGTH = 1024 - """:obj:`int`: Maximum number of characters in a :obj:`str` passed as: - - * :paramref:`~telegram.Message.caption` parameter of :class:`telegram.Message` - * :paramref:`~telegram.InputMedia.caption` parameter of :class:`telegram.InputMedia` - and its subclasses - * ``caption`` parameter of subclasses of :class:`telegram.InlineQueryResult` - * ``caption`` parameter of :meth:`telegram.Bot.send_photo`, :meth:`telegram.Bot.send_audio`, - :meth:`telegram.Bot.send_document`, :meth:`telegram.Bot.send_video`, - :meth:`telegram.Bot.send_animation`, :meth:`telegram.Bot.send_voice`, - :meth:`telegram.Bot.edit_message_caption`, :meth:`telegram.Bot.copy_message` - """ - # constants above this line are tested - MIN_TEXT_LENGTH = 1 - """:obj:`int`: Minimum number of characters in a :obj:`str` passed as the - :paramref:`~telegram.InputTextMessageContent.message_text` parameter of - :class:`telegram.InputTextMessageContent` and the - :paramref:`~telegram.Bot.edit_message_text.text` parameter of - :meth:`telegram.Bot.edit_message_text`. - """ - DEEP_LINK_LENGTH = 64 - """:obj:`int`: Maximum number of characters for a deep link.""" - # TODO this constant is not used anywhere - MESSAGE_ENTITIES = 100 - """:obj:`int`: Maximum number of entities that can be displayed in a message. Further entities - will simply be ignored by Telegram. - - Note: - This value is undocumented and might be changed by Telegram. - """ - - -class MessageOriginType(StringEnum): - """This enum contains the available types of :class:`telegram.MessageOrigin`. The enum - members of this enumeration are instances of :class:`str` and can be treated as such. - - .. versionadded:: 20.8 - """ - - __slots__ = () - - USER = "user" - """:obj:`str`: A :class:`telegram.MessageOrigin` who is sent by an user.""" - HIDDEN_USER = "hidden_user" - """:obj:`str`: A :class:`telegram.MessageOrigin` who is sent by a hidden user.""" - CHAT = "chat" - """:obj:`str`: A :class:`telegram.MessageOrigin` who is sent by a chat.""" - CHANNEL = "channel" - """:obj:`str`: A :class:`telegram.MessageOrigin` who is sent by a channel.""" - - -class MessageType(StringEnum): - """This enum contains the available types of :class:`telegram.Message`. Here, a "type" means - a kind of message that is visually distinct from other kinds of messages in the Telegram app. - In particular, auxiliary attributes that can be present for multiple types of messages are - not considered in this enumeration. - - The enum members of this enumeration are instances of :class:`str` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - # Make sure that all attachment type constants are also listed in the - # MessageAttachmentType Enum! (Enums are not extendable) - - ANIMATION = "animation" - """:obj:`str`: Messages with :attr:`telegram.Message.animation`.""" - AUDIO = "audio" - """:obj:`str`: Messages with :attr:`telegram.Message.audio`.""" - BOOST_ADDED = "boost_added" - """:obj:`str`: Messages with :attr:`telegram.Message.boost_added`. - - .. versionadded:: 21.0 - """ - BUSINESS_CONNECTION_ID = "business_connection_id" - """:obj:`str`: Messages with :attr:`telegram.Message.business_connection_id`. - - .. versionadded:: 21.1 - """ - CHANNEL_CHAT_CREATED = "channel_chat_created" - """:obj:`str`: Messages with :attr:`telegram.Message.channel_chat_created`.""" - CHAT_SHARED = "chat_shared" - """:obj:`str`: Messages with :attr:`telegram.Message.chat_shared`. - - .. versionadded:: 20.8 - """ - CHAT_BACKGROUND_SET = "chat_background_set" - """:obj:`str`: Messages with :attr:`telegram.Message.chat_background_set`. - - .. versionadded:: 21.2 - """ - CONNECTED_WEBSITE = "connected_website" - """:obj:`str`: Messages with :attr:`telegram.Message.connected_website`.""" - CONTACT = "contact" - """:obj:`str`: Messages with :attr:`telegram.Message.contact`.""" - DELETE_CHAT_PHOTO = "delete_chat_photo" - """:obj:`str`: Messages with :attr:`telegram.Message.delete_chat_photo`.""" - DICE = "dice" - """:obj:`str`: Messages with :attr:`telegram.Message.dice`.""" - DOCUMENT = "document" - """:obj:`str`: Messages with :attr:`telegram.Message.document`.""" - EFFECT_ID = "effect_id" - """:obj:`str`: Messages with :attr:`telegram.Message.effect_id`. - - .. versionadded:: 21.3""" - FORUM_TOPIC_CREATED = "forum_topic_created" - """:obj:`str`: Messages with :attr:`telegram.Message.forum_topic_created`. - - .. versionadded:: 20.8 - """ - FORUM_TOPIC_CLOSED = "forum_topic_closed" - """:obj:`str`: Messages with :attr:`telegram.Message.forum_topic_closed`. - - .. versionadded:: 20.8 - """ - FORUM_TOPIC_EDITED = "forum_topic_edited" - """:obj:`str`: Messages with :attr:`telegram.Message.forum_topic_edited`. - - .. versionadded:: 20.8 - """ - FORUM_TOPIC_REOPENED = "forum_topic_reopened" - """:obj:`str`: Messages with :attr:`telegram.Message.forum_topic_reopened`. - - .. versionadded:: 20.8 - """ - GAME = "game" - """:obj:`str`: Messages with :attr:`telegram.Message.game`.""" - GENERAL_FORUM_TOPIC_HIDDEN = "general_forum_topic_hidden" - """:obj:`str`: Messages with :attr:`telegram.Message.general_forum_topic_hidden`. - - .. versionadded:: 20.8 - """ - GENERAL_FORUM_TOPIC_UNHIDDEN = "general_forum_topic_unhidden" - """:obj:`str`: Messages with :attr:`telegram.Message.general_forum_topic_unhidden`. - - .. versionadded:: 20.8 - """ - GIFT = "gift" - """:obj:`str`: Messages with :attr:`telegram.Message.gift`. - - .. versionadded:: 22.1 - """ - GIVEAWAY = "giveaway" - """:obj:`str`: Messages with :attr:`telegram.Message.giveaway`. - - .. versionadded:: 20.8 - """ - GIVEAWAY_CREATED = "giveaway_created" - """:obj:`str`: Messages with :attr:`telegram.Message.giveaway_created`. - - .. versionadded:: 20.8 - """ - GIVEAWAY_WINNERS = "giveaway_winners" - """:obj:`str`: Messages with :attr:`telegram.Message.giveaway_winners`. - - .. versionadded:: 20.8 - """ - GIVEAWAY_COMPLETED = "giveaway_completed" - """:obj:`str`: Messages with :attr:`telegram.Message.giveaway_completed`. - - .. versionadded:: 20.8 - """ - GROUP_CHAT_CREATED = "group_chat_created" - """:obj:`str`: Messages with :attr:`telegram.Message.group_chat_created`.""" - INVOICE = "invoice" - """:obj:`str`: Messages with :attr:`telegram.Message.invoice`.""" - LEFT_CHAT_MEMBER = "left_chat_member" - """:obj:`str`: Messages with :attr:`telegram.Message.left_chat_member`.""" - LOCATION = "location" - """:obj:`str`: Messages with :attr:`telegram.Message.location`.""" - MESSAGE_AUTO_DELETE_TIMER_CHANGED = "message_auto_delete_timer_changed" - """:obj:`str`: Messages with :attr:`telegram.Message.message_auto_delete_timer_changed`.""" - MIGRATE_TO_CHAT_ID = "migrate_to_chat_id" - """:obj:`str`: Messages with :attr:`telegram.Message.migrate_to_chat_id`.""" - NEW_CHAT_MEMBERS = "new_chat_members" - """:obj:`str`: Messages with :attr:`telegram.Message.new_chat_members`.""" - NEW_CHAT_TITLE = "new_chat_title" - """:obj:`str`: Messages with :attr:`telegram.Message.new_chat_title`.""" - NEW_CHAT_PHOTO = "new_chat_photo" - """:obj:`str`: Messages with :attr:`telegram.Message.new_chat_photo`.""" - PAID_MEDIA = "paid_media" - """:obj:`str`: Messages with :attr:`telegram.Message.paid_media`. - - .. versionadded:: 21.4 - """ - PAID_MESSAGE_PRICE_CHANGED = "paid_message_price_changed" - """:obj:`str`: Messages with :attr:`telegram.Message.paid_message_price_changed`. - - .. versionadded:: v22.2 - """ - PASSPORT_DATA = "passport_data" - """:obj:`str`: Messages with :attr:`telegram.Message.passport_data`.""" - PHOTO = "photo" - """:obj:`str`: Messages with :attr:`telegram.Message.photo`.""" - PINNED_MESSAGE = "pinned_message" - """:obj:`str`: Messages with :attr:`telegram.Message.pinned_message`.""" - POLL = "poll" - """:obj:`str`: Messages with :attr:`telegram.Message.poll`.""" - PROXIMITY_ALERT_TRIGGERED = "proximity_alert_triggered" - """:obj:`str`: Messages with :attr:`telegram.Message.proximity_alert_triggered`.""" - REFUNDED_PAYMENT = "refunded_payment" - """:obj:`str`: Messages with :attr:`telegram.Message.refunded_payment`. - - .. versionadded:: 21.4 - """ - REPLY_TO_STORY = "reply_to_story" - """:obj:`str`: Messages with :attr:`telegram.Message.reply_to_story`. - - .. versionadded:: 21.0 - """ - SENDER_BOOST_COUNT = "sender_boost_count" - """:obj:`str`: Messages with :attr:`telegram.Message.sender_boost_count`. - - .. versionadded:: 21.0 - """ - SENDER_BUSINESS_BOT = "sender_business_bot" - """:obj:`str`: Messages with :attr:`telegram.Message.sender_business_bot`. - - .. versionadded:: 21.1 - """ - STICKER = "sticker" - """:obj:`str`: Messages with :attr:`telegram.Message.sticker`.""" - STORY = "story" - """:obj:`str`: Messages with :attr:`telegram.Message.story`.""" - SUPERGROUP_CHAT_CREATED = "supergroup_chat_created" - """:obj:`str`: Messages with :attr:`telegram.Message.supergroup_chat_created`.""" - SUCCESSFUL_PAYMENT = "successful_payment" - """:obj:`str`: Messages with :attr:`telegram.Message.successful_payment`.""" - TEXT = "text" - """:obj:`str`: Messages with :attr:`telegram.Message.text`.""" - UNIQUE_GIFT = "unique_gift" - """:obj:`str`: Messages with :attr:`telegram.Message.unique_gift`. - - .. versionadded:: 22.1 - """ - USERS_SHARED = "users_shared" - """:obj:`str`: Messages with :attr:`telegram.Message.users_shared`. - - .. versionadded:: 20.8 - """ - VENUE = "venue" - """:obj:`str`: Messages with :attr:`telegram.Message.venue`.""" - VIDEO = "video" - """:obj:`str`: Messages with :attr:`telegram.Message.video`.""" - VIDEO_CHAT_SCHEDULED = "video_chat_scheduled" - """:obj:`str`: Messages with :attr:`telegram.Message.video_chat_scheduled`.""" - VIDEO_CHAT_STARTED = "video_chat_started" - """:obj:`str`: Messages with :attr:`telegram.Message.video_chat_started`.""" - VIDEO_CHAT_ENDED = "video_chat_ended" - """:obj:`str`: Messages with :attr:`telegram.Message.video_chat_ended`.""" - VIDEO_CHAT_PARTICIPANTS_INVITED = "video_chat_participants_invited" - """:obj:`str`: Messages with :attr:`telegram.Message.video_chat_participants_invited`.""" - VIDEO_NOTE = "video_note" - """:obj:`str`: Messages with :attr:`telegram.Message.video_note`.""" - VOICE = "voice" - """:obj:`str`: Messages with :attr:`telegram.Message.voice`.""" - WEB_APP_DATA = "web_app_data" - """:obj:`str`: Messages with :attr:`telegram.Message.web_app_data`. - - .. versionadded:: 20.8 - """ - WRITE_ACCESS_ALLOWED = "write_access_allowed" - """:obj:`str`: Messages with :attr:`telegram.Message.write_access_allowed`. - - .. versionadded:: 20.8 - """ - - -class Nanostar(FloatEnum): - """This enum contains constants for ``nanostar_amount`` parameter of - :class:`telegram.StarAmount`, :class:`telegram.StarTransaction` - and :class:`telegram.AffiliateInfo`. - The enum members of this enumeration are instances of :class:`float` and can be treated as - such. - - .. versionadded:: 22.1 - """ - - __slots__ = () - - VALUE = 1 / 1000000000 - """:obj:`float`: The value of one nanostar as used in - :paramref:`telegram.StarTransaction.nanostar_amount` - parameter of :class:`telegram.StarTransaction`, - :paramref:`telegram.StarAmount.nanostar_amount` parameter of :class:`telegram.StarAmount` - and :paramref:`telegram.AffiliateInfo.nanostar_amount` - parameter of :class:`telegram.AffiliateInfo` - """ - - -class NanostarLimit(IntEnum): - """This enum contains limitations for ``nanostar_amount`` parameter of - :class:`telegram.AffiliateInfo`, :class:`telegram.StarTransaction` - and :class:`telegram.StarAmount`. - The enum members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 22.1 - """ - - __slots__ = () - - MIN_AMOUNT = -999999999 - """:obj:`int`: Minimum value allowed for :paramref:`~telegram.AffiliateInfo.nanostar_amount` - parameter of :class:`telegram.AffiliateInfo` - and :paramref:`~telegram.StarAmount.nanostar_amount` - parameter of :class:`telegram.StarAmount`. - """ - MAX_AMOUNT = 999999999 - """:obj:`int`: Maximum value allowed for :paramref:`~telegram.StarTransaction.nanostar_amount` - parameter of :class:`telegram.StarTransaction`, - :paramref:`~telegram.AffiliateInfo.nanostar_amount` parameter of - :class:`telegram.AffiliateInfo` and :paramref:`~telegram.StarAmount.nanostar_amount` - parameter of :class:`telegram.StarAmount`. - """ - - -class OwnedGiftType(StringEnum): - """This enum contains the available types of :class:`telegram.OwnedGift`. The enum - members of this enumeration are instances of :class:`str` and can be treated as such. - - .. versionadded:: 22.1 - """ - - __slots__ = () - - REGULAR = "regular" - """:obj:`str`: a regular owned gift.""" - UNIQUE = "unique" - """:obj:`str`: a unique owned gift.""" - - -class PaidMediaType(StringEnum): - """ - This enum contains the available types of :class:`telegram.PaidMedia`. The enum - members of this enumeration are instances of :class:`str` and can be treated as such. - - .. versionadded:: 21.4 - """ - - __slots__ = () - - PREVIEW = "preview" - """:obj:`str`: The type of :class:`telegram.PaidMediaPreview`.""" - VIDEO = "video" - """:obj:`str`: The type of :class:`telegram.PaidMediaVideo`.""" - PHOTO = "photo" - """:obj:`str`: The type of :class:`telegram.PaidMediaPhoto`.""" - - -class PollingLimit(IntEnum): - """This enum contains limitations for :paramref:`telegram.Bot.get_updates.limit`. - The enum members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - MIN_LIMIT = 1 - """:obj:`int`: Minimum value allowed for the :paramref:`~telegram.Bot.get_updates.limit` - parameter of :meth:`telegram.Bot.get_updates`. - """ - MAX_LIMIT = 100 - """:obj:`int`: Maximum value allowed for the :paramref:`~telegram.Bot.get_updates.limit` - parameter of :meth:`telegram.Bot.get_updates`. - """ - - -class PremiumSubscription(IntEnum): - """This enum contains limitations for :meth:`~telegram.Bot.gift_premium_subscription`. - The enum members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 22.1 - """ - - __slots__ = () - - MAX_TEXT_LENGTH = 128 - """:obj:`int`: Maximum number of characters in a :obj:`str` passed as the - :paramref:`~telegram.Bot.gift_premium_subscription.text` - parameter of :meth:`~telegram.Bot.gift_premium_subscription`. - """ - MONTH_COUNT_THREE = 3 - """:obj:`int`: Possible value for - :paramref:`~telegram.Bot.gift_premium_subscription.month_count` parameter - of :meth:`~telegram.Bot.gift_premium_subscription`; number of months the Premium - subscription will be active for. - """ - MONTH_COUNT_SIX = 6 - """:obj:`int`: Possible value for - :paramref:`~telegram.Bot.gift_premium_subscription.month_count` parameter - of :meth:`~telegram.Bot.gift_premium_subscription`; number of months the Premium - subscription will be active for. - """ - MONTH_COUNT_TWELVE = 12 - """:obj:`int`: Possible value for - :paramref:`~telegram.Bot.gift_premium_subscription.month_count` parameter - of :meth:`~telegram.Bot.gift_premium_subscription`; number of months the Premium - subscription will be active for. - """ - STARS_THREE_MONTHS = 1000 - """:obj:`int`: Number of Telegram Stars to pay for a Premium subscription of - :tg-const:`telegram.constants.PremiumSubscription.MONTH_COUNT_THREE` months period. - Relevant for :paramref:`~telegram.Bot.gift_premium_subscription.star_count` parameter - of :meth:`~telegram.Bot.gift_premium_subscription`. - """ - STARS_SIX_MONTHS = 1500 - """:obj:`int`: Number of Telegram Stars to pay for a Premium subscription of - :tg-const:`telegram.constants.PremiumSubscription.MONTH_COUNT_SIX` months period. - Relevant for :paramref:`~telegram.Bot.gift_premium_subscription.star_count` parameter - of :meth:`~telegram.Bot.gift_premium_subscription`. - """ - STARS_TWELVE_MONTHS = 2500 - """:obj:`int`: Number of Telegram Stars to pay for a Premium subscription of - :tg-const:`telegram.constants.PremiumSubscription.MONTH_COUNT_TWELVE` months period. - Relevant for :paramref:`~telegram.Bot.gift_premium_subscription.star_count` parameter - of :meth:`~telegram.Bot.gift_premium_subscription`. - """ - - -class ProfileAccentColor(Enum): - """This enum contains the available accent colors for - :class:`telegram.ChatFullInfo.profile_accent_color_id`. - The members of this enum are named tuples with the following attributes: - - - ``identifier`` (:obj:`int`): The identifier of the accent color. - - ``name`` (:obj:`str`): Optional. The name of the accent color. - - ``light_colors`` (tuple[:obj:`str`]): Optional. The light colors of the accent color as HEX - value. - - ``dark_colors`` (tuple[:obj:`str`]): Optional. The dark colors of the accent color as HEX - value. - - Since Telegram gives no exact specification for the accent colors, future accent colors might - have a different data type. - - .. versionadded:: 20.8 - """ - - __slots__ = () - - COLOR_000 = _AccentColor(identifier=0, light_colors=(0xBA5650,), dark_colors=(0x9C4540,)) - """Accent color 0. This contains one light color - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#BA5650;"> - </div> - - and one dark color - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#9C4540;"> - </div> - """ - COLOR_001 = _AccentColor(identifier=1, light_colors=(0xC27C3E,), dark_colors=(0x945E2C,)) - """Accent color 1. This contains one light color - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#C27C3E;"> - </div> - - and one dark color - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#945E2C;"> - </div> - """ - COLOR_002 = _AccentColor(identifier=2, light_colors=(0x956AC8,), dark_colors=(0x715099,)) - """Accent color 2. This contains one light color - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#956AC8;"> - </div> - - and one dark color - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#715099;"> - </div> - """ - COLOR_003 = _AccentColor(identifier=3, light_colors=(0x49A355,), dark_colors=(0x33713B,)) - """Accent color 3. This contains one light color - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#49A355;"> - </div> - - and one dark color - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#33713B;"> - </div> - """ - COLOR_004 = _AccentColor(identifier=4, light_colors=(0x3E97AD,), dark_colors=(0x387E87,)) - """Accent color 4. This contains one light color - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#3E97AD;"> - </div> - - and one dark color - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#387E87;"> - </div> - """ - COLOR_005 = _AccentColor(identifier=5, light_colors=(0x5A8FBB,), dark_colors=(0x477194,)) - """Accent color 5. This contains one light color - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#5A8FBB;"> - </div> - - and one dark color - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#477194;"> - </div> - """ - COLOR_006 = _AccentColor(identifier=6, light_colors=(0xB85378,), dark_colors=(0x944763,)) - """Accent color 6. This contains one light color - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#B85378;"> - </div> - - and one dark color - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#944763;"> - </div> - """ - COLOR_007 = _AccentColor(identifier=7, light_colors=(0x7F8B95,), dark_colors=(0x435261,)) - """Accent color 7. This contains one light color - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#7F8B95;"> - </div> - - and one dark color - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#435261;"> - </div> - """ - COLOR_008 = _AccentColor( - identifier=8, light_colors=(0xC9565D, 0xD97C57), dark_colors=(0x994343, 0xAC583E) - ) - """Accent color 8. This contains two light colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#C9565D;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#D97C57;"> - </div><br> - - and two dark colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#994343;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#AC583E;"> - </div><br> - """ - COLOR_009 = _AccentColor( - identifier=9, light_colors=(0xCF7244, 0xCC9433), dark_colors=(0x8F552F, 0xA17232) - ) - """Accent color 9. This contains two light colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#CF7244;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#CC9433;"> - </div><br> - - and two dark colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#8F552F;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#A17232;"> - </div><br> - """ - COLOR_010 = _AccentColor( - identifier=10, light_colors=(0x9662D4, 0xB966B6), dark_colors=(0x634691, 0x9250A2) - ) - """Accent color 10. This contains two light colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#9662D4;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#B966B6;"> - </div><br> - - and two dark colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#634691;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#9250A2;"> - </div><br> - """ - COLOR_011 = _AccentColor( - identifier=11, light_colors=(0x3D9755, 0x89A650), dark_colors=(0x296A43, 0x5F8F44) - ) - """Accent color 11. This contains two light colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#3D9755;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#89A650;"> - </div><br> - - and two dark colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#296A43;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#5F8F44;"> - </div><br> - """ - COLOR_012 = _AccentColor( - identifier=12, light_colors=(0x3D95BA, 0x50AD98), dark_colors=(0x306C7C, 0x3E987E) - ) - """Accent color 12. This contains two light colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#3D95BA;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#50AD98;"> - </div><br> - - and two dark colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#306C7C;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#3E987E;"> - </div><br> - """ - COLOR_013 = _AccentColor( - identifier=13, light_colors=(0x538BC2, 0x4DA8BD), dark_colors=(0x38618C, 0x458BA1) - ) - """Accent color 13. This contains two light colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#538BC2;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#4DA8BD;"> - </div><br> - - and two dark colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#38618C;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#458BA1;"> - </div><br> - """ - COLOR_014 = _AccentColor( - identifier=14, light_colors=(0xB04F74, 0xD1666D), dark_colors=(0x884160, 0xA65259) - ) - """Accent color 14. This contains two light colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#B04F74;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#D1666D;"> - </div><br> - - and two dark colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color:#884160;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color:#A65259;"> - </div><br> - """ - COLOR_015 = _AccentColor( - identifier=15, light_colors=(0x637482, 0x7B8A97), dark_colors=(0x53606E, 0x384654) - ) - """Accent color 15. This contains two light colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color: #637482;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color: #7B8A97;"> - </div><br> - - and two dark colors - - .. raw:: html - - <div style="height:15px; width:15px; display: inline-block; background-color: #53606E;"> - </div> - <div style="height:15px; width:15px; display: inline-block; background-color: #384654;"> - </div><br> - """ - - -class ReplyLimit(IntEnum): - """This enum contains limitations for :class:`telegram.ForceReply` - and :class:`telegram.ReplyKeyboardMarkup`. - The enum members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - MIN_INPUT_FIELD_PLACEHOLDER = 1 - """:obj:`int`: Minimum value allowed for - :paramref:`~telegram.ForceReply.input_field_placeholder` parameter of - :class:`telegram.ForceReply` and - :paramref:`~telegram.ReplyKeyboardMarkup.input_field_placeholder` parameter of - :class:`telegram.ReplyKeyboardMarkup` - """ - MAX_INPUT_FIELD_PLACEHOLDER = 64 - """:obj:`int`: Maximum value allowed for - :paramref:`~telegram.ForceReply.input_field_placeholder` parameter of - :class:`telegram.ForceReply` and - :paramref:`~telegram.ReplyKeyboardMarkup.input_field_placeholder` parameter of - :class:`telegram.ReplyKeyboardMarkup` - """ - - -class RevenueWithdrawalStateType(StringEnum): - """This enum contains the available types of :class:`telegram.RevenueWithdrawalState`. - The enum members of this enumeration are instances of :class:`str` and can be treated as such. - - .. versionadded:: 21.4 - """ - - __slots__ = () - - PENDING = "pending" - """:obj:`str`: A withdrawal in progress.""" - SUCCEEDED = "succeeded" - """:obj:`str`: A withdrawal succeeded.""" - FAILED = "failed" - """:obj:`str`: A withdrawal failed and the transaction was refunded.""" - - -# tags: deprecated 22.1, bot api 9.0 -class StarTransactions(FloatEnum): - """This enum contains constants for :class:`telegram.StarTransaction`. - The enum members of this enumeration are instances of :class:`float` and can be treated as - such. - - .. versionadded:: 21.9 - - .. deprecated:: 22.1 - This class will be removed as its only member :attr:`NANOSTAR_VALUE` will be replaced - by :attr:`telegram.constants.Nanostar.VALUE`. - """ - - __slots__ = () - - NANOSTAR_VALUE = Nanostar.VALUE - """:obj:`float`: The value of one nanostar as used in - :attr:`telegram.StarTransaction.nanostar_amount`. - - .. deprecated:: 22.1 - This member will be replaced by :attr:`telegram.constants.Nanostar.VALUE`. - """ - - -class StarTransactionsLimit(IntEnum): - """This enum contains limitations for :class:`telegram.Bot.get_star_transactions` and - :class:`telegram.StarTransaction`. - The enum members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 21.4 - """ - - __slots__ = () - - MIN_LIMIT = 1 - """:obj:`int`: Minimum value allowed for the - :paramref:`~telegram.Bot.get_star_transactions.limit` parameter of - :meth:`telegram.Bot.get_star_transactions`.""" - MAX_LIMIT = 100 - """:obj:`int`: Maximum value allowed for the - :paramref:`~telegram.Bot.get_star_transactions.limit` parameter of - :meth:`telegram.Bot.get_star_transactions`.""" - # tags: deprecated 22.1, bot api 9.0 - NANOSTAR_MIN_AMOUNT = NanostarLimit.MIN_AMOUNT - """:obj:`int`: Minimum value allowed for :paramref:`~telegram.AffiliateInfo.nanostar_amount` - parameter of :class:`telegram.AffiliateInfo`. - - .. versionadded:: 21.9 - - .. deprecated:: 22.1 - This member will be replaced by :attr:`telegram.constants.NanostarLimit.MIN_AMOUNT`. - """ - # tags: deprecated 22.1, bot api 9.0 - NANOSTAR_MAX_AMOUNT = NanostarLimit.MAX_AMOUNT - """:obj:`int`: Maximum value allowed for :paramref:`~telegram.StarTransaction.nanostar_amount` - parameter of :class:`telegram.StarTransaction` and - :paramref:`~telegram.AffiliateInfo.nanostar_amount` parameter of - :class:`telegram.AffiliateInfo`. - - .. versionadded:: 21.9 - - .. deprecated:: 22.1 - This member will be replaced by :attr:`telegram.constants.NanostarLimit.MAX_AMOUNT`. - """ - - -class StickerFormat(StringEnum): - """This enum contains the available formats of :class:`telegram.Sticker` in the set. The enum - members of this enumeration are instances of :class:`str` and can be treated as such. - - .. versionadded:: 20.2 - """ - - __slots__ = () - - STATIC = "static" - """:obj:`str`: Static sticker.""" - ANIMATED = "animated" - """:obj:`str`: Animated sticker.""" - VIDEO = "video" - """:obj:`str`: Video sticker.""" - - -class StickerLimit(IntEnum): - """This enum contains limitations for various sticker methods, such as - :meth:`telegram.Bot.create_new_sticker_set`. - The enum members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - MIN_NAME_AND_TITLE = 1 - """:obj:`int`: Minimum number of characters in a :obj:`str` passed as the - :paramref:`~telegram.Bot.create_new_sticker_set.name` parameter or the - :paramref:`~telegram.Bot.create_new_sticker_set.title` parameter of - :meth:`telegram.Bot.create_new_sticker_set`. - """ - MAX_NAME_AND_TITLE = 64 - """:obj:`int`: Maximum number of characters in a :obj:`str` passed as the - :paramref:`~telegram.Bot.create_new_sticker_set.name` parameter or the - :paramref:`~telegram.Bot.create_new_sticker_set.title` parameter of - :meth:`telegram.Bot.create_new_sticker_set`. - """ - MIN_STICKER_EMOJI = 1 - """:obj:`int`: Minimum number of emojis associated with a sticker, passed as the - :paramref:`~telegram.Bot.setStickerEmojiList.emoji_list` parameter of - :meth:`telegram.Bot.set_sticker_emoji_list`. - - .. versionadded:: 20.2 - """ - MAX_STICKER_EMOJI = 20 - """:obj:`int`: Maximum number of emojis associated with a sticker, passed as the - :paramref:`~telegram.Bot.setStickerEmojiList.emoji_list` parameter of - :meth:`telegram.Bot.set_sticker_emoji_list`. - - .. versionadded:: 20.2 - """ - MAX_SEARCH_KEYWORDS = 20 - """:obj:`int`: Maximum number of search keywords for a sticker, passed as the - :paramref:`~telegram.Bot.set_sticker_keywords.keywords` parameter of - :meth:`telegram.Bot.set_sticker_keywords`. - - .. versionadded:: 20.2 - """ - MAX_KEYWORD_LENGTH = 64 - """:obj:`int`: Maximum number of characters in a search keyword for a sticker, for each item in - :paramref:`~telegram.Bot.set_sticker_keywords.keywords` sequence of - :meth:`telegram.Bot.set_sticker_keywords`. - - .. versionadded:: 20.2 - """ - - -class StickerSetLimit(IntEnum): - """This enum contains limitations for various sticker set methods, such as - :meth:`telegram.Bot.create_new_sticker_set` and :meth:`telegram.Bot.add_sticker_to_set`. - - The enum members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 20.2 - """ - - __slots__ = () - - MIN_INITIAL_STICKERS = 1 - """:obj:`int`: Minimum number of stickers needed to create a sticker set, passed as the - :paramref:`~telegram.Bot.create_new_sticker_set.stickers` parameter of - :meth:`telegram.Bot.create_new_sticker_set`. - """ - MAX_INITIAL_STICKERS = 50 - """:obj:`int`: Maximum number of stickers allowed while creating a sticker set, passed as the - :paramref:`~telegram.Bot.create_new_sticker_set.stickers` parameter of - :meth:`telegram.Bot.create_new_sticker_set`. - """ - MAX_EMOJI_STICKERS = 200 - """:obj:`int`: Maximum number of stickers allowed in an emoji sticker set, as given in - :meth:`telegram.Bot.add_sticker_to_set`. - """ - MAX_ANIMATED_STICKERS = 50 - """:obj:`int`: Maximum number of stickers allowed in an animated or video sticker set, as given - in :meth:`telegram.Bot.add_sticker_to_set`. - - .. deprecated:: 21.1 - The animated sticker limit is now 120, the same as :attr:`MAX_STATIC_STICKERS`. - """ - MAX_STATIC_STICKERS = 120 - """:obj:`int`: Maximum number of stickers allowed in a static sticker set, as given in - :meth:`telegram.Bot.add_sticker_to_set`. - """ - MAX_STATIC_THUMBNAIL_SIZE = 128 - """:obj:`int`: Maximum size of the thumbnail if it is a ``.WEBP`` or ``.PNG`` in kilobytes, - as given in :meth:`telegram.Bot.set_sticker_set_thumbnail`.""" - MAX_ANIMATED_THUMBNAIL_SIZE = 32 - """:obj:`int`: Maximum size of the thumbnail if it is a ``.TGS`` or ``.WEBM`` in kilobytes, - as given in :meth:`telegram.Bot.set_sticker_set_thumbnail`.""" - STATIC_THUMB_DIMENSIONS = 100 - """:obj:`int`: Exact height and width of the thumbnail if it is a ``.WEBP`` or ``.PNG`` in - pixels, as given in :meth:`telegram.Bot.set_sticker_set_thumbnail`.""" - - -class StickerType(StringEnum): - """This enum contains the available types of :class:`telegram.Sticker`. The enum - members of this enumeration are instances of :class:`str` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - REGULAR = "regular" - """:obj:`str`: Regular sticker.""" - MASK = "mask" - """:obj:`str`: Mask sticker.""" - CUSTOM_EMOJI = "custom_emoji" - """:obj:`str`: Custom emoji sticker.""" - - -class StoryAreaPositionLimit(IntEnum): - """This enum contains limitations for :class:`telegram.StoryAreaPosition`. - The enum members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 22.1 - """ - - __slots__ = () - - MAX_ROTATION_ANGLE = 360 - """:obj:`int`: Maximum value allowed for: - :paramref:`~telegram.StoryAreaPosition.rotation_angle` parameter of - :class:`telegram.StoryAreaPosition` - """ - - -class StoryAreaTypeLimit(IntEnum): - """This enum contains limitations for subclasses of :class:`telegram.StoryAreaType`. - The enum members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 22.1 - """ - - __slots__ = () - - MAX_LOCATION_AREAS = 10 - """:obj:`int`: Maximum number of location areas that a story can have. - """ - MAX_SUGGESTED_REACTION_AREAS = 5 - """:obj:`int`: Maximum number of suggested reaction areas that a story can have. - """ - MAX_LINK_AREAS = 3 - """:obj:`int`: Maximum number of link areas that a story can have. - """ - MAX_WEATHER_AREAS = 3 - """:obj:`int`: Maximum number of weather areas that a story can have. - """ - MAX_UNIQUE_GIFT_AREAS = 1 - """:obj:`int`: Maximum number of unique gift areas that a story can have. - """ - - -class StoryAreaTypeType(StringEnum): - """This enum contains the available types of :class:`telegram.StoryAreaType`. The enum - members of this enumeration are instances of :class:`str` and can be treated as such. - - .. versionadded:: 22.1 - """ - - __slots__ = () - - LOCATION = "location" - """:obj:`str`: Type of :class:`telegram.StoryAreaTypeLocation`.""" - SUGGESTED_REACTION = "suggested_reaction" - """:obj:`str`: Type of :class:`telegram.StoryAreaTypeSuggestedReaction`.""" - LINK = "link" - """:obj:`str`: Type of :class:`telegram.StoryAreaTypeLink`.""" - WEATHER = "weather" - """:obj:`str`: Type of :class:`telegram.StoryAreaTypeWeather`.""" - UNIQUE_GIFT = "unique_gift" - """:obj:`str`: Type of :class:`telegram.StoryAreaTypeUniqueGift`.""" - - -class StoryLimit(StringEnum): - """This enum contains limitations for :meth:`~telegram.Bot.post_story` and - :meth:`~telegram.Bot.edit_story`. - The enum members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 22.1 - """ - - __slots__ = () - - CAPTION_LENGTH = 2048 - """:obj:`int`: Maximum number of characters in :paramref:`telegram.Bot.post_story.caption` - parameter of :meth:`telegram.Bot.post_story` and :paramref:`telegram.Bot.edit_story.caption` of - :meth:`telegram.Bot.edit_story`. - """ - ACTIVITY_SIX_HOURS = 6 * 3600 - """:obj:`int`: Possible value for :paramref:`~telegram.Bot.post_story.caption`` parameter of - :meth:`telegram.Bot.post_story`.""" - ACTIVITY_TWELVE_HOURS = 12 * 3600 - """:obj:`int`: Possible value for :paramref:`~telegram.Bot.post_story.caption`` parameter of - :meth:`telegram.Bot.post_story`.""" - ACTIVITY_ONE_DAY = 86400 - """:obj:`int`: Possible value for :paramref:`~telegram.Bot.post_story.caption`` parameter of - :meth:`telegram.Bot.post_story`.""" - ACTIVITY_TWO_DAYS = 2 * 86400 - """:obj:`int`: Possible value for :paramref:`~telegram.Bot.post_story.caption`` parameter of - :meth:`telegram.Bot.post_story`.""" - - -class TransactionPartnerType(StringEnum): - """This enum contains the available types of :class:`telegram.TransactionPartner`. The enum - members of this enumeration are instances of :class:`str` and can be treated as such. - - .. versionadded:: 21.4 - """ - - __slots__ = () - - AFFILIATE_PROGRAM = "affiliate_program" - """:obj:`str`: Transaction with Affiliate Program. - - .. versionadded:: 21.9 - """ - CHAT = "chat" - """:obj:`str`: Transaction with a chat. - - .. versionadded:: 21.11 - """ - FRAGMENT = "fragment" - """:obj:`str`: Withdrawal transaction with Fragment.""" - OTHER = "other" - """:obj:`str`: Transaction with unknown source or recipient.""" - TELEGRAM_ADS = "telegram_ads" - """:obj:`str`: Transaction with Telegram Ads.""" - TELEGRAM_API = "telegram_api" - """:obj:`str`: Transaction with with payment for - `paid broadcasting <https://core.telegram.org/bots/api#paid-broadcasts>`_. - - ..versionadded:: 21.7 - """ - USER = "user" - """:obj:`str`: Transaction with a user.""" - - -class TransactionPartnerUser(StringEnum): - """This enum contains constants for :class:`telegram.TransactionPartnerUser`. - The enum members of this enumeration are instances of :class:`str` and can be treated as - such. - - .. versionadded:: 22.1 - """ - - __slots__ = () - - INVOICE_PAYMENT = "invoice_payment" - """:obj:`str`: Possible value for - :paramref:`telegram.TransactionPartnerUser.transaction_type`. - """ - PAID_MEDIA_PAYMENT = "paid_media_payment" - """:obj:`str`: Possible value for - :paramref:`telegram.TransactionPartnerUser.transaction_type`. - """ - GIFT_PURCHASE = "gift_purchase" - """:obj:`str`: Possible value for - :paramref:`telegram.TransactionPartnerUser.transaction_type`. - """ - PREMIUM_PURCHASE = "premium_purchase" - """:obj:`str`: Possible value for - :paramref:`telegram.TransactionPartnerUser.transaction_type`. - """ - BUSINESS_ACCOUNT_TRANSFER = "business_account_transfer" - """:obj:`str`: Possible value for - :paramref:`telegram.TransactionPartnerUser.transaction_type`. - """ - - -class ParseMode(StringEnum): - """This enum contains the available parse modes. The enum - members of this enumeration are instances of :class:`str` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - MARKDOWN = "Markdown" - """:obj:`str`: Markdown parse mode. - - Note: - :attr:`MARKDOWN` is a legacy mode, retained by Telegram for backward compatibility. - You should use :attr:`MARKDOWN_V2` instead. - """ - MARKDOWN_V2 = "MarkdownV2" - """:obj:`str`: Markdown parse mode version 2.""" - HTML = "HTML" - """:obj:`str`: HTML parse mode.""" - - -class PollLimit(IntEnum): - """This enum contains limitations for :class:`telegram.Poll`/:class:`telegram.PollOption`/ - :meth:`telegram.Bot.send_poll`. The enum - members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - MIN_QUESTION_LENGTH = 1 - """:obj:`int`: Minimum value allowed for the :paramref:`~telegram.Poll.question` - parameter of :class:`telegram.Poll` and the :paramref:`~telegram.Bot.send_poll.question` - parameter of :meth:`telegram.Bot.send_poll`. - """ - MAX_QUESTION_LENGTH = 300 - """:obj:`int`: Maximum value allowed for the :paramref:`~telegram.Poll.question` - parameter of :class:`telegram.Poll` and the :paramref:`~telegram.Bot.send_poll.question` - parameter of :meth:`telegram.Bot.send_poll`. - """ - MIN_OPTION_LENGTH = 1 - """:obj:`int`: Minimum length of each :obj:`str` passed in a :obj:`list` - to the :paramref:`~telegram.Bot.send_poll.options` parameter of - :meth:`telegram.Bot.send_poll`. - """ - MAX_OPTION_LENGTH = 100 - """:obj:`int`: Maximum length of each :obj:`str` passed in a :obj:`list` - to the :paramref:`~telegram.Bot.send_poll.options` parameter of - :meth:`telegram.Bot.send_poll`. - """ - MIN_OPTION_NUMBER = 2 - """:obj:`int`: Minimum number of strings passed in a :obj:`list` - to the :paramref:`~telegram.Bot.send_poll.options` parameter of - :meth:`telegram.Bot.send_poll`. - """ - MAX_OPTION_NUMBER = 10 - """:obj:`int`: Maximum number of strings passed in a :obj:`list` - to the :paramref:`~telegram.Bot.send_poll.options` parameter of - :meth:`telegram.Bot.send_poll`. - """ - MAX_EXPLANATION_LENGTH = 200 - """:obj:`int`: Maximum number of characters in a :obj:`str` passed as the - :paramref:`~telegram.Poll.explanation` parameter of :class:`telegram.Poll` and the - :paramref:`~telegram.Bot.send_poll.explanation` parameter of :meth:`telegram.Bot.send_poll`. - """ - MAX_EXPLANATION_LINE_FEEDS = 2 - """:obj:`int`: Maximum number of line feeds in a :obj:`str` passed as the - :paramref:`~telegram.Bot.send_poll.explanation` parameter of :meth:`telegram.Bot.send_poll` - after entities parsing. - """ - MIN_OPEN_PERIOD = 5 - """:obj:`int`: Minimum value allowed for the - :paramref:`~telegram.Bot.send_poll.open_period` parameter of :meth:`telegram.Bot.send_poll`. - Also used in the :paramref:`~telegram.Bot.send_poll.close_date` parameter of - :meth:`telegram.Bot.send_poll`. - """ - MAX_OPEN_PERIOD = 600 - """:obj:`int`: Maximum value allowed for the - :paramref:`~telegram.Bot.send_poll.open_period` parameter of :meth:`telegram.Bot.send_poll`. - Also used in the :paramref:`~telegram.Bot.send_poll.close_date` parameter of - :meth:`telegram.Bot.send_poll`. - """ - - -class PollType(StringEnum): - """This enum contains the available types for :class:`telegram.Poll`/ - :meth:`telegram.Bot.send_poll`. The enum - members of this enumeration are instances of :class:`str` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - REGULAR = "regular" - """:obj:`str`: regular polls.""" - QUIZ = "quiz" - """:obj:`str`: quiz polls.""" - - -class UniqueGiftInfoOrigin(StringEnum): - """This enum contains the available origins for :class:`telegram.UniqueGiftInfo`. The enum - members of this enumeration are instances of :class:`str` and can be treated as such. - - .. versionadded:: 22.1 - """ - - __slots__ = () - - UPGRADE = "upgrade" - """:obj:`str` gift upgraded""" - TRANSFER = "transfer" - """:obj:`str` gift transfered""" - - -class UpdateType(StringEnum): - """This enum contains the available types of :class:`telegram.Update`. The enum - members of this enumeration are instances of :class:`str` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - MESSAGE = "message" - """:obj:`str`: Updates with :attr:`telegram.Update.message`.""" - EDITED_MESSAGE = "edited_message" - """:obj:`str`: Updates with :attr:`telegram.Update.edited_message`.""" - CHANNEL_POST = "channel_post" - """:obj:`str`: Updates with :attr:`telegram.Update.channel_post`.""" - EDITED_CHANNEL_POST = "edited_channel_post" - """:obj:`str`: Updates with :attr:`telegram.Update.edited_channel_post`.""" - INLINE_QUERY = "inline_query" - """:obj:`str`: Updates with :attr:`telegram.Update.inline_query`.""" - CHOSEN_INLINE_RESULT = "chosen_inline_result" - """:obj:`str`: Updates with :attr:`telegram.Update.chosen_inline_result`.""" - CALLBACK_QUERY = "callback_query" - """:obj:`str`: Updates with :attr:`telegram.Update.callback_query`.""" - SHIPPING_QUERY = "shipping_query" - """:obj:`str`: Updates with :attr:`telegram.Update.shipping_query`.""" - PRE_CHECKOUT_QUERY = "pre_checkout_query" - """:obj:`str`: Updates with :attr:`telegram.Update.pre_checkout_query`.""" - POLL = "poll" - """:obj:`str`: Updates with :attr:`telegram.Update.poll`.""" - POLL_ANSWER = "poll_answer" - """:obj:`str`: Updates with :attr:`telegram.Update.poll_answer`.""" - MY_CHAT_MEMBER = "my_chat_member" - """:obj:`str`: Updates with :attr:`telegram.Update.my_chat_member`.""" - CHAT_MEMBER = "chat_member" - """:obj:`str`: Updates with :attr:`telegram.Update.chat_member`.""" - CHAT_JOIN_REQUEST = "chat_join_request" - """:obj:`str`: Updates with :attr:`telegram.Update.chat_join_request`.""" - CHAT_BOOST = "chat_boost" - """:obj:`str`: Updates with :attr:`telegram.Update.chat_boost`. - - .. versionadded:: 20.8 - """ - REMOVED_CHAT_BOOST = "removed_chat_boost" - """:obj:`str`: Updates with :attr:`telegram.Update.removed_chat_boost`. - - .. versionadded:: 20.8 - """ - MESSAGE_REACTION = "message_reaction" - """:obj:`str`: Updates with :attr:`telegram.Update.message_reaction`. - - .. versionadded:: 20.8 - """ - MESSAGE_REACTION_COUNT = "message_reaction_count" - """:obj:`str`: Updates with :attr:`telegram.Update.message_reaction_count`. - - .. versionadded:: 20.8 - """ - BUSINESS_CONNECTION = "business_connection" - """:obj:`str`: Updates with :attr:`telegram.Update.business_connection`. - - .. versionadded:: 21.1 - """ - BUSINESS_MESSAGE = "business_message" - """:obj:`str`: Updates with :attr:`telegram.Update.business_message`. - - .. versionadded:: 21.1 - """ - EDITED_BUSINESS_MESSAGE = "edited_business_message" - """:obj:`str`: Updates with :attr:`telegram.Update.edited_business_message`. - - .. versionadded:: 21.1 - """ - DELETED_BUSINESS_MESSAGES = "deleted_business_messages" - """:obj:`str`: Updates with :attr:`telegram.Update.deleted_business_messages`. - - .. versionadded:: 21.1 - """ - PURCHASED_PAID_MEDIA = "purchased_paid_media" - """:obj:`str`: Updates with :attr:`telegram.Update.purchased_paid_media`. - - .. versionadded:: 21.6 - """ - - -class InvoiceLimit(IntEnum): - """This enum contains limitations for :class:`telegram.InputInvoiceMessageContent`, - :meth:`telegram.Bot.send_invoice`, and :meth:`telegram.Bot.create_invoice_link`. - The enum members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - MIN_TITLE_LENGTH = 1 - """:obj:`int`: Minimum number of characters in a :obj:`str` passed as: - - * :paramref:`~telegram.InputInvoiceMessageContent.title` parameter of - :class:`telegram.InputInvoiceMessageContent` - * :paramref:`~telegram.Bot.send_invoice.title` parameter of - :meth:`telegram.Bot.send_invoice`. - * :paramref:`~telegram.Bot.create_invoice_link.title` parameter of - :meth:`telegram.Bot.create_invoice_link`. - """ - MAX_TITLE_LENGTH = 32 - """:obj:`int`: Maximum number of characters in a :obj:`str` passed as: - - * :paramref:`~telegram.InputInvoiceMessageContent.title` parameter of - :class:`telegram.InputInvoiceMessageContent` - * :paramref:`~telegram.Bot.send_invoice.title` parameter of - :meth:`telegram.Bot.send_invoice`. - * :paramref:`~telegram.Bot.create_invoice_link.title` parameter of - :meth:`telegram.Bot.create_invoice_link`. - """ - MIN_DESCRIPTION_LENGTH = 1 - """:obj:`int`: Minimum number of characters in a :obj:`str` passed as: - - * :paramref:`~telegram.InputInvoiceMessageContent.description` parameter of - :class:`telegram.InputInvoiceMessageContent` - * :paramref:`~telegram.Bot.send_invoice.description` parameter of - :meth:`telegram.Bot.send_invoice`. - * :paramref:`~telegram.Bot.create_invoice_link.description` parameter of - :meth:`telegram.Bot.create_invoice_link`. - """ - MAX_DESCRIPTION_LENGTH = 255 - """:obj:`int`: Maximum number of characters in a :obj:`str` passed as: - - * :paramref:`~telegram.InputInvoiceMessageContent.description` parameter of - :class:`telegram.InputInvoiceMessageContent` - * :paramref:`~telegram.Bot.send_invoice.description` parameter of - :meth:`telegram.Bot.send_invoice`. - * :paramref:`~telegram.Bot.create_invoice_link.description` parameter of - :meth:`telegram.Bot.create_invoice_link`. - """ - MIN_PAYLOAD_LENGTH = 1 - """:obj:`int`: Minimum amount of bytes in a :obj:`str` passed as: - - * :paramref:`~telegram.InputInvoiceMessageContent.payload` parameter of - :class:`telegram.InputInvoiceMessageContent` - * :paramref:`~telegram.Bot.send_invoice.payload` parameter of - :meth:`telegram.Bot.send_invoice`. - * :paramref:`~telegram.Bot.create_invoice_link.payload` parameter of - :meth:`telegram.Bot.create_invoice_link`. - """ - MAX_PAYLOAD_LENGTH = 128 - """:obj:`int`: Maximum amount of bytes in a :obj:`str` passed as: - - * :paramref:`~telegram.InputInvoiceMessageContent.payload` parameter of - :class:`telegram.InputInvoiceMessageContent` - * :paramref:`~telegram.Bot.send_invoice.payload` parameter of - :meth:`telegram.Bot.send_invoice`. - * :paramref:`~telegram.Bot.create_invoice_link.payload` parameter of - :meth:`telegram.Bot.create_invoice_link`. - * :paramref:`~telegram.Bot.send_paid_media.payload` parameter of - :meth:`telegram.Bot.send_paid_media`. - """ - MAX_TIP_AMOUNTS = 4 - """:obj:`int`: Maximum length of a :obj:`Sequence` passed as: - - * :paramref:`~telegram.Bot.send_invoice.suggested_tip_amounts` parameter of - :meth:`telegram.Bot.send_invoice`. - * :paramref:`~telegram.Bot.create_invoice_link.suggested_tip_amounts` parameter of - :meth:`telegram.Bot.create_invoice_link`. - """ - MIN_STAR_COUNT = 1 - """:obj:`int`: Minimum amount of starts that must be paid to buy access to a paid media - passed as :paramref:`~telegram.Bot.send_paid_media.star_count` parameter of - :meth:`telegram.Bot.send_paid_media`. - - .. versionadded:: 21.6 - """ - MAX_STAR_COUNT = 10000 - """:obj:`int`: Maximum amount of starts that must be paid to buy access to a paid media - passed as :paramref:`~telegram.Bot.send_paid_media.star_count` parameter of - :meth:`telegram.Bot.send_paid_media`. - - .. versionadded:: 21.6 - .. versionchanged:: 22.1 - Bot API 9.0 changed the value to 10000. - """ - SUBSCRIPTION_PERIOD = dtm.timedelta(days=30).total_seconds() - """:obj:`int`: The period of time for which the subscription is active before - the next payment, passed as :paramref:`~telegram.Bot.create_invoice_link.subscription_period` - parameter of :meth:`telegram.Bot.create_invoice_link`. - - .. versionadded:: 21.8 - """ - SUBSCRIPTION_MAX_PRICE = 10000 - """:obj:`int`: The maximum price of a subscription created wtih - :meth:`telegram.Bot.create_invoice_link`. - - .. versionadded:: 21.9 - .. versionchanged:: 22.1 - Bot API 9.0 changed the value to 10000. - """ - - -class UserProfilePhotosLimit(IntEnum): - """This enum contains limitations for :paramref:`telegram.Bot.get_user_profile_photos.limit`. - The enum members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - MIN_LIMIT = 1 - """:obj:`int`: Minimum value allowed for - :paramref:`~telegram.Bot.get_user_profile_photos.limit` parameter of - :meth:`telegram.Bot.get_user_profile_photos`. - """ - MAX_LIMIT = 100 - """:obj:`int`: Maximum value allowed for - :paramref:`~telegram.Bot.get_user_profile_photos.limit` parameter of - :meth:`telegram.Bot.get_user_profile_photos`. - """ - - -class WebhookLimit(IntEnum): - """This enum contains limitations for :paramref:`telegram.Bot.set_webhook.max_connections` and - :paramref:`telegram.Bot.set_webhook.secret_token`. The enum members of this enumeration are - instances of :class:`int` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - MIN_CONNECTIONS_LIMIT = 1 - """:obj:`int`: Minimum value allowed for the - :paramref:`~telegram.Bot.set_webhook.max_connections` parameter of - :meth:`telegram.Bot.set_webhook`. - """ - MAX_CONNECTIONS_LIMIT = 100 - """:obj:`int`: Maximum value allowed for the - :paramref:`~telegram.Bot.set_webhook.max_connections` parameter of - :meth:`telegram.Bot.set_webhook`. - """ - MIN_SECRET_TOKEN_LENGTH = 1 - """:obj:`int`: Minimum length of the secret token for the - :paramref:`~telegram.Bot.set_webhook.secret_token` parameter of - :meth:`telegram.Bot.set_webhook`. - """ - MAX_SECRET_TOKEN_LENGTH = 256 - """:obj:`int`: Maximum length of the secret token for the - :paramref:`~telegram.Bot.set_webhook.secret_token` parameter of - :meth:`telegram.Bot.set_webhook`. - """ - - -class ForumTopicLimit(IntEnum): - """This enum contains limitations for :paramref:`telegram.Bot.create_forum_topic.name` and - :paramref:`telegram.Bot.edit_forum_topic.name`. - The enum members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - MIN_NAME_LENGTH = 1 - """:obj:`int`: Minimum length of a :obj:`str` passed as: - - * :paramref:`~telegram.Bot.create_forum_topic.name` parameter of - :meth:`telegram.Bot.create_forum_topic` - * :paramref:`~telegram.Bot.edit_forum_topic.name` parameter of - :meth:`telegram.Bot.edit_forum_topic` - * :paramref:`~telegram.Bot.edit_general_forum_topic.name` parameter of - :meth:`telegram.Bot.edit_general_forum_topic` - """ - MAX_NAME_LENGTH = 128 - """:obj:`int`: Maximum length of a :obj:`str` passed as: - - * :paramref:`~telegram.Bot.create_forum_topic.name` parameter of - :meth:`telegram.Bot.create_forum_topic` - * :paramref:`~telegram.Bot.edit_forum_topic.name` parameter of - :meth:`telegram.Bot.edit_forum_topic` - * :paramref:`~telegram.Bot.edit_general_forum_topic.name` parameter of - :meth:`telegram.Bot.edit_general_forum_topic` - """ - - -class ReactionType(StringEnum): - """This enum contains the available types of :class:`telegram.ReactionType`. The enum - members of this enumeration are instances of :class:`str` and can be treated as such. - - .. versionadded:: 20.8 - """ - - __slots__ = () - - EMOJI = "emoji" - """:obj:`str`: A :class:`telegram.ReactionType` with a normal emoji.""" - CUSTOM_EMOJI = "custom_emoji" - """:obj:`str`: A :class:`telegram.ReactionType` with a custom emoji.""" - PAID = "paid" - """:obj:`str`: A :class:`telegram.ReactionType` with a paid reaction. - - .. versionadded:: 21.5 - """ - - -class ReactionEmoji(StringEnum): - """This enum contains the available emojis of :class:`telegram.ReactionTypeEmoji`. The enum - members of this enumeration are instances of :class:`str` and can be treated as such. - - .. versionadded:: 20.8 - """ - - __slots__ = () - - THUMBS_UP = "👍" - """:obj:`str`: Thumbs Up""" - THUMBS_DOWN = "👎" - """:obj:`str`: Thumbs Down""" - RED_HEART = "❤" - """:obj:`str`: Red Heart""" - FIRE = "🔥" - """:obj:`str`: Fire""" - SMILING_FACE_WITH_HEARTS = "🥰" - """:obj:`str`: Smiling Face with Hearts""" - CLAPPING_HANDS = "👏" - """:obj:`str`: Clapping Hands""" - GRINNING_FACE_WITH_SMILING_EYES = "😁" - """:obj:`str`: Grinning face with smiling eyes""" - THINKING_FACE = "🤔" - """:obj:`str`: Thinking face""" - SHOCKED_FACE_WITH_EXPLODING_HEAD = "🤯" - """:obj:`str`: Shocked face with exploding head""" - FACE_SCREAMING_IN_FEAR = "😱" - """:obj:`str`: Face screaming in fear""" - SERIOUS_FACE_WITH_SYMBOLS_COVERING_MOUTH = "🤬" - """:obj:`str`: Serious face with symbols covering mouth""" - CRYING_FACE = "😢" - """:obj:`str`: Crying face""" - PARTY_POPPER = "🎉" - """:obj:`str`: Party popper""" - GRINNING_FACE_WITH_STAR_EYES = "🤩" - """:obj:`str`: Grinning face with star eyes""" - FACE_WITH_OPEN_MOUTH_VOMITING = "🤮" - """:obj:`str`: Face with open mouth vomiting""" - PILE_OF_POO = "💩" - """:obj:`str`: Pile of poo""" - PERSON_WITH_FOLDED_HANDS = "🙏" - """:obj:`str`: Person with folded hands""" - OK_HAND_SIGN = "👌" - """:obj:`str`: Ok hand sign""" - DOVE_OF_PEACE = "🕊" - """:obj:`str`: Dove of peace""" - CLOWN_FACE = "🤡" - """:obj:`str`: Clown face""" - YAWNING_FACE = "🥱" - """:obj:`str`: Yawning face""" - FACE_WITH_UNEVEN_EYES_AND_WAVY_MOUTH = "🥴" - """:obj:`str`: Face with uneven eyes and wavy mouth""" - SMILING_FACE_WITH_HEART_SHAPED_EYES = "😍" - """:obj:`str`: Smiling face with heart-shaped eyes""" - SPOUTING_WHALE = "🐳" - """:obj:`str`: Spouting whale""" - HEART_ON_FIRE = "❤️‍🔥" - """:obj:`str`: Heart on fire""" - NEW_MOON_WITH_FACE = "🌚" - """:obj:`str`: New moon with face""" - HOT_DOG = "🌭" - """:obj:`str`: Hot dog""" - HUNDRED_POINTS_SYMBOL = "💯" - """:obj:`str`: Hundred points symbol""" - ROLLING_ON_THE_FLOOR_LAUGHING = "🤣" - """:obj:`str`: Rolling on the floor laughing""" - HIGH_VOLTAGE_SIGN = "⚡" - """:obj:`str`: High voltage sign""" - BANANA = "🍌" - """:obj:`str`: Banana""" - TROPHY = "🏆" - """:obj:`str`: Trophy""" - BROKEN_HEART = "💔" - """:obj:`str`: Broken heart""" - FACE_WITH_ONE_EYEBROW_RAISED = "🤨" - """:obj:`str`: Face with one eyebrow raised""" - NEUTRAL_FACE = "😐" - """:obj:`str`: Neutral face""" - STRAWBERRY = "🍓" - """:obj:`str`: Strawberry""" - BOTTLE_WITH_POPPING_CORK = "🍾" - """:obj:`str`: Bottle with popping cork""" - KISS_MARK = "💋" - """:obj:`str`: Kiss mark""" - REVERSED_HAND_WITH_MIDDLE_FINGER_EXTENDED = "🖕" - """:obj:`str`: Reversed hand with middle finger extended""" - SMILING_FACE_WITH_HORNS = "😈" - """:obj:`str`: Smiling face with horns""" - SLEEPING_FACE = "😴" - """:obj:`str`: Sleeping face""" - LOUDLY_CRYING_FACE = "😭" - """:obj:`str`: Loudly crying face""" - NERD_FACE = "🤓" - """:obj:`str`: Nerd face""" - GHOST = "👻" - """:obj:`str`: Ghost""" - MAN_TECHNOLOGIST = "👨‍💻" - """:obj:`str`: Man Technologist""" - EYES = "👀" - """:obj:`str`: Eyes""" - JACK_O_LANTERN = "🎃" - """:obj:`str`: Jack-o-lantern""" - SEE_NO_EVIL_MONKEY = "🙈" - """:obj:`str`: See-no-evil monkey""" - SMILING_FACE_WITH_HALO = "😇" - """:obj:`str`: Smiling face with halo""" - FEARFUL_FACE = "😨" - """:obj:`str`: Fearful face""" - HANDSHAKE = "🤝" - """:obj:`str`: Handshake""" - WRITING_HAND = "✍" - """:obj:`str`: Writing hand""" - HUGGING_FACE = "🤗" - """:obj:`str`: Hugging face""" - SALUTING_FACE = "🫡" - """:obj:`str`: Saluting face""" - FATHER_CHRISTMAS = "🎅" - """:obj:`str`: Father christmas""" - CHRISTMAS_TREE = "🎄" - """:obj:`str`: Christmas tree""" - SNOWMAN = "☃" - """:obj:`str`: Snowman""" - NAIL_POLISH = "💅" - """:obj:`str`: Nail polish""" - GRINNING_FACE_WITH_ONE_LARGE_AND_ONE_SMALL_EYE = "🤪" - """:obj:`str`: Grinning face with one large and one small eye""" - MOYAI = "🗿" - """:obj:`str`: Moyai""" - SQUARED_COOL = "🆒" - """:obj:`str`: Squared cool""" - HEART_WITH_ARROW = "💘" - """:obj:`str`: Heart with arrow""" - HEAR_NO_EVIL_MONKEY = "🙉" - """:obj:`str`: Hear-no-evil monkey""" - UNICORN_FACE = "🦄" - """:obj:`str`: Unicorn face""" - FACE_THROWING_A_KISS = "😘" - """:obj:`str`: Face throwing a kiss""" - PILL = "💊" - """:obj:`str`: Pill""" - SPEAK_NO_EVIL_MONKEY = "🙊" - """:obj:`str`: Speak-no-evil monkey""" - SMILING_FACE_WITH_SUNGLASSES = "😎" - """:obj:`str`: Smiling face with sunglasses""" - ALIEN_MONSTER = "👾" - """:obj:`str`: Alien monster""" - MAN_SHRUGGING = "🤷‍♂️" - """:obj:`str`: Man Shrugging""" - SHRUG = "🤷" - """:obj:`str`: Shrug""" - WOMAN_SHRUGGING = "🤷‍♀️" - """:obj:`str`: Woman Shrugging""" - POUTING_FACE = "😡" - """:obj:`str`: Pouting face""" - - -class VerifyLimit(IntEnum): - """This enum contains limitations for :meth:`~telegram.Bot.verify_chat` and - :meth:`~telegram.Bot.verify_user`. - The enum members of this enumeration are instances of :class:`int` and can be treated as such. - - .. versionadded:: 21.10 - """ - - __slots__ = () - - MAX_TEXT_LENGTH = 70 - """:obj:`int`: Maximum number of characters in a :obj:`str` passed as the - :paramref:`~telegram.Bot.verify_chat.custom_description` or - :paramref:`~telegram.Bot.verify_user.custom_description` parameter. - """ diff --git a/venv/lib/python3.12/site-packages/telegram/error.py b/venv/lib/python3.12/site-packages/telegram/error.py deleted file mode 100644 index 5deb00f..0000000 --- a/venv/lib/python3.12/site-packages/telegram/error.py +++ /dev/null @@ -1,278 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains classes that represent Telegram errors. - -.. versionchanged:: 20.0 - Replaced ``Unauthorized`` by :class:`Forbidden`. -""" - -import datetime as dtm -from typing import Optional, Union - -from telegram._utils.argumentparsing import to_timedelta -from telegram._utils.datetime import get_timedelta_value -from telegram._utils.types import TimePeriod - -__all__ = ( - "BadRequest", - "ChatMigrated", - "Conflict", - "EndPointNotFound", - "Forbidden", - "InvalidToken", - "NetworkError", - "PassportDecryptionError", - "RetryAfter", - "TelegramError", - "TimedOut", -) - - -class TelegramError(Exception): - """ - Base class for Telegram errors. - - Tip: - Objects of this type can be serialized via Python's :mod:`pickle` module and pickled - objects from one version of PTB are usually loadable in future versions. However, we can - not guarantee that this compatibility will always be provided. At least a manual one-time - conversion of the data may be needed on major updates of the library. - - .. seealso:: :wiki:`Exceptions, Warnings and Logging <Exceptions%2C-Warnings-and-Logging>` - """ - - __slots__ = ("message",) - - def __init__(self, message: str): - super().__init__() - - msg = message.removeprefix("Error: ") - msg = msg.removeprefix("[Error]: ") - msg = msg.removeprefix("Bad Request: ") - if msg != message: - # api_error - capitalize the msg... - msg = msg.capitalize() - self.message: str = msg - - def __str__(self) -> str: - """Gives the string representation of exceptions message. - - Returns: - :obj:`str` - """ - return self.message - - def __repr__(self) -> str: - """Gives an unambiguous string representation of the exception. - - Returns: - :obj:`str` - """ - return f"{self.__class__.__name__}('{self.message}')" - - def __reduce__(self) -> tuple[type, tuple[str]]: - """Defines how to serialize the exception for pickle. - - .. seealso:: - :py:meth:`object.__reduce__`, :mod:`pickle`. - - Returns: - :obj:`tuple` - """ - return self.__class__, (self.message,) - - -class Forbidden(TelegramError): - """Raised when the bot has not enough rights to perform the requested action. - - Examples: - :any:`Raw API Bot <examples.rawapibot>` - - .. versionchanged:: 20.0 - This class was previously named ``Unauthorized``. - """ - - __slots__ = () - - -class InvalidToken(TelegramError): - """Raised when the token is invalid. - - Args: - message (:obj:`str`, optional): Any additional information about the exception. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - def __init__(self, message: Optional[str] = None) -> None: - super().__init__("Invalid token" if message is None else message) - - -class EndPointNotFound(TelegramError): - """Raised when the requested endpoint is not found. Only relevant for - :meth:`telegram.Bot.do_api_request`. - - .. versionadded:: 20.8 - """ - - __slots__ = () - - -class NetworkError(TelegramError): - """Base class for exceptions due to networking errors. - - Tip: - This exception (and its subclasses) usually originates from the networking backend - used by :class:`~telegram.request.HTTPXRequest`, or a custom implementation of - :class:`~telegram.request.BaseRequest`. In this case, the original exception can be - accessed via the ``__cause__`` - `attribute <https://docs.python.org/3/library/exceptions.html#exception-context>`_. - - Examples: - :any:`Raw API Bot <examples.rawapibot>` - - .. seealso:: - :wiki:`Handling network errors <Handling-network-errors>` - """ - - __slots__ = () - - -class BadRequest(NetworkError): - """Raised when Telegram could not process the request correctly.""" - - __slots__ = () - - -class TimedOut(NetworkError): - """Raised when a request took too long to finish. - - .. seealso:: - :wiki:`Handling network errors <Handling-network-errors>` - - Args: - message (:obj:`str`, optional): Any additional information about the exception. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - def __init__(self, message: Optional[str] = None) -> None: - super().__init__(message or "Timed out") - - -class ChatMigrated(TelegramError): - """ - Raised when the requested group chat migrated to supergroup and has a new chat id. - - .. seealso:: - :wiki:`Storing Bot, User and Chat Related Data <Storing-bot%2C-user-and-chat-related-data>` - - Args: - new_chat_id (:obj:`int`): The new chat id of the group. - - Attributes: - new_chat_id (:obj:`int`): The new chat id of the group. - - """ - - __slots__ = ("new_chat_id",) - - def __init__(self, new_chat_id: int): - super().__init__(f"Group migrated to supergroup. New chat id: {new_chat_id}") - self.new_chat_id: int = new_chat_id - - def __reduce__(self) -> tuple[type, tuple[int]]: # type: ignore[override] - return self.__class__, (self.new_chat_id,) - - -class RetryAfter(TelegramError): - """ - Raised when flood limits where exceeded. - - .. versionchanged:: 20.0 - :attr:`retry_after` is now an integer to comply with the Bot API. - - Args: - retry_after (:obj:`int` | :class:`datetime.timedelta`): Time in seconds, after which the - bot can retry the request. - - .. versionchanged:: v22.2 - |time-period-input| - - Attributes: - retry_after (:obj:`int` | :class:`datetime.timedelta`): Time in seconds, after which the - bot can retry the request. - - .. deprecated:: v22.2 - |time-period-int-deprecated| - - """ - - __slots__ = ("_retry_after",) - - def __init__(self, retry_after: TimePeriod): - self._retry_after: dtm.timedelta = to_timedelta(retry_after) - - if isinstance(self.retry_after, int): - super().__init__(f"Flood control exceeded. Retry in {self.retry_after} seconds") - else: - super().__init__(f"Flood control exceeded. Retry in {self.retry_after!s}") - - @property - def retry_after(self) -> Union[int, dtm.timedelta]: # noqa: D102 - # Diableing D102 because docstring for `retry_after` is present at the class's level - return get_timedelta_value( # type: ignore[return-value] - self._retry_after, attribute="retry_after" - ) - - def __reduce__(self) -> tuple[type, tuple[float]]: # type: ignore[override] - # Until support for `int` time periods is lifted, leave pickle behaviour the same - # tag: deprecated: v22.2 - return self.__class__, (int(self._retry_after.total_seconds()),) - - -class Conflict(TelegramError): - """Raised when a long poll or webhook conflicts with another one.""" - - __slots__ = () - - def __reduce__(self) -> tuple[type, tuple[str]]: - return self.__class__, (self.message,) - - -class PassportDecryptionError(TelegramError): - """Something went wrong with decryption. - - .. versionchanged:: 20.0 - This class was previously named ``TelegramDecryptionError`` and was available via - ``telegram.TelegramDecryptionError``. - """ - - __slots__ = ("_msg",) - - def __init__(self, message: Union[str, Exception]): - super().__init__(f"PassportDecryptionError: {message}") - self._msg = str(message) - - def __reduce__(self) -> tuple[type, tuple[str]]: - return self.__class__, (self._msg,) diff --git a/venv/lib/python3.12/site-packages/telegram/ext/__init__.py b/venv/lib/python3.12/site-packages/telegram/ext/__init__.py deleted file mode 100644 index 7cd6578..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/__init__.py +++ /dev/null @@ -1,104 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""Extensions over the Telegram Bot API to facilitate bot making""" - -__all__ = ( - "AIORateLimiter", - "Application", - "ApplicationBuilder", - "ApplicationHandlerStop", - "BaseHandler", - "BasePersistence", - "BaseRateLimiter", - "BaseUpdateProcessor", - "BusinessConnectionHandler", - "BusinessMessagesDeletedHandler", - "CallbackContext", - "CallbackDataCache", - "CallbackQueryHandler", - "ChatBoostHandler", - "ChatJoinRequestHandler", - "ChatMemberHandler", - "ChosenInlineResultHandler", - "CommandHandler", - "ContextTypes", - "ConversationHandler", - "Defaults", - "DictPersistence", - "ExtBot", - "InlineQueryHandler", - "InvalidCallbackData", - "Job", - "JobQueue", - "MessageHandler", - "MessageReactionHandler", - "PaidMediaPurchasedHandler", - "PersistenceInput", - "PicklePersistence", - "PollAnswerHandler", - "PollHandler", - "PreCheckoutQueryHandler", - "PrefixHandler", - "ShippingQueryHandler", - "SimpleUpdateProcessor", - "StringCommandHandler", - "StringRegexHandler", - "TypeHandler", - "Updater", - "filters", -) - -from . import filters -from ._aioratelimiter import AIORateLimiter -from ._application import Application, ApplicationHandlerStop -from ._applicationbuilder import ApplicationBuilder -from ._basepersistence import BasePersistence, PersistenceInput -from ._baseratelimiter import BaseRateLimiter -from ._baseupdateprocessor import BaseUpdateProcessor, SimpleUpdateProcessor -from ._callbackcontext import CallbackContext -from ._callbackdatacache import CallbackDataCache, InvalidCallbackData -from ._contexttypes import ContextTypes -from ._defaults import Defaults -from ._dictpersistence import DictPersistence -from ._extbot import ExtBot -from ._handlers.basehandler import BaseHandler -from ._handlers.businessconnectionhandler import BusinessConnectionHandler -from ._handlers.businessmessagesdeletedhandler import BusinessMessagesDeletedHandler -from ._handlers.callbackqueryhandler import CallbackQueryHandler -from ._handlers.chatboosthandler import ChatBoostHandler -from ._handlers.chatjoinrequesthandler import ChatJoinRequestHandler -from ._handlers.chatmemberhandler import ChatMemberHandler -from ._handlers.choseninlineresulthandler import ChosenInlineResultHandler -from ._handlers.commandhandler import CommandHandler -from ._handlers.conversationhandler import ConversationHandler -from ._handlers.inlinequeryhandler import InlineQueryHandler -from ._handlers.messagehandler import MessageHandler -from ._handlers.messagereactionhandler import MessageReactionHandler -from ._handlers.paidmediapurchasedhandler import PaidMediaPurchasedHandler -from ._handlers.pollanswerhandler import PollAnswerHandler -from ._handlers.pollhandler import PollHandler -from ._handlers.precheckoutqueryhandler import PreCheckoutQueryHandler -from ._handlers.prefixhandler import PrefixHandler -from ._handlers.shippingqueryhandler import ShippingQueryHandler -from ._handlers.stringcommandhandler import StringCommandHandler -from ._handlers.stringregexhandler import StringRegexHandler -from ._handlers.typehandler import TypeHandler -from ._jobqueue import Job, JobQueue -from ._picklepersistence import PicklePersistence -from ._updater import Updater diff --git a/venv/lib/python3.12/site-packages/telegram/ext/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 9b551465840854529163b95606f6ac07d34d1dff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3111 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 aAj9hy6&d(2yZIh1#puHCXqJBsXZa7Ye%%xR diff --git a/venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_aioratelimiter.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_aioratelimiter.cpython-312.pyc deleted file mode 100644 index b8fa018cabee50cfc39e7e82d01dc9560a2950e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13528 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 Ezi4Xg3jhEB diff --git a/venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_application.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_application.cpython-312.pyc deleted file mode 100644 index 1379058038f4d49d9f93b9e2f8e04466f8b9e2c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90090 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 diff --git a/venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_applicationbuilder.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_applicationbuilder.cpython-312.pyc deleted file mode 100644 index 5b077106c2c734fb7c39193f3f2e11cf4d1704d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56692 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 diff --git a/venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_basepersistence.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_basepersistence.cpython-312.pyc deleted file mode 100644 index 004aff19c5ccbadff357c83854c3daa7ba61c8cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20570 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 diff --git a/venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_baseratelimiter.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_baseratelimiter.cpython-312.pyc deleted file mode 100644 index 7addcd2d76517f6937d9244515e8f1c4970b085c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6600 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 XER~inJ6FDP^~-O5<6j2-QcM09^?<;v diff --git a/venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_baseupdateprocessor.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_baseupdateprocessor.cpython-312.pyc deleted file mode 100644 index bdddcbc85367f774d452b66b1732c216a8924348..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8079 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 Cre~r6 diff --git a/venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_callbackcontext.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_callbackcontext.cpython-312.pyc deleted file mode 100644 index d8861a0a11a797c87be6e590a8dcead6c086563a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19632 zcmds9du$xXdEa~TNFI44k0Pm;wW36cCzD6(VacFn$rMT3vSZq&C_6qyy<6T6$&>EE z?B0nYEwyqYq!OAUa{q{AByH3O3LA2f^gkB`S{p%-0_`8XNCBCJ4Lfa$G(}OIqy#nm zSAXBk?%v*mmYmq>V+HQb&f}YzZ@$-j^Ns$orKL&2^Phk6%A7GSN&iA0*3)Pv?n*96 zx+<wsOj2E{JMGH2WA2P6=5f)tC+*GnVm_Ysru~_QSVJZd3uGE&jhUucQ>HoAoC(H) znU+`!uj5O%W<s$LPy5qtnf6#aPdB7HGT~U5rvvHE%(~b*o^DKcWx8YCnVwirW_@gZ zW<zX)OJWUL5BhFOZ_I3pZOUwpZRT~G(+^~}#I|JQn4H-f+sgBTXx|&_MY<)n%`LH@ z+Ny@$YP;bUvx{waOHWE_`$b9ZV2!MYZD8wJ_l$Qvif?$#I(>`bNaxbf)LcrJGdZ=8 zW^yu@%`2&_F6ZZ%JgTJA(@OI6C^FgEyqrucx*q)nwT`%r#*qajl~<<I%xHX)Wtpbr zb6Uh@_?}hr$+<{_(K7Y&^W*W+r^ZL0IXdyA;Tg#;8V$T=Drp2Ja+54y(6UD0x%qr5 zmsQe6!_?wDdr{F0-|;MR0IS6s!V3kaEh58zd|p-Z3@Pt|qEQw9_}ToCTt4D8+(*Xn zH)Xg-@q2s>L-apUKo`vLp?QHtJVx`#{Cql<RH#G4^K@?72;e13U500LbZRLzm(S1Z z!$U)}sr+1FI-1O7hUORZbGhtbo~7BWrep@EbNRY?3#rqop<_TpDmzP+`u2<t7IdZ! zDp_?fIj7_YHI~Nk)j>=`G2F+dmbO_lG?9D)SQ?NkUMDe2-*m2!Rg+@j#5-($+&zmm zzbY{)<^nCdRaeZTx?|o(sZmlNRK3in`c%K#!2GO%R$mQRshNP<c+nRNuts%2ZNBKe zVFHXbA*YEo&$!i~BR9x`r#6^X96xFcYentQj8|=~s7)~Ztd05vq>!VmoweTsQd>oB z0ja};)b1z?v+zA2bvSDS@8OHySf|>_)~QXZ2V-7`?=IGDVylbwsNEb(J($&cwjQ|K zpl)P-bra9sj2UfU^!)(;_OMMe9!jyzjMtcP(-$vmQoCnb)h!o&HeMfK-D+hIK2^pz zy0H>l9pl_mQE#K#i&0qhwmIs_>UOr3^|Dsct2v`S%xD{5!R^5N4oCeyp6ge4()du; z?<m`WvZxwy<m?o+SwHKw=7cu895o_~p2(09s-j@!-$RnrB;(<N1+qoqVud6~Zu%5U z=H+?F5vI!d92YZ5Q_RSeK=$;aJj_MSaKhraC>lqPC^~xzoRnr-g2T^gRF@=G-TDq* zPspjPtYl@TX=pSjfXIrf^6ogWVI`l}s(N%lh@x_wH;<dm6EZ+mPa!uWD*{}-89>$~ zqD{PfB9~{wJVltg_xKl5>9m~G7^DaAsYAe+(wfjZgOSkeviX$8<N_CwQI3AQhYVA= zR9EtHYDQkn73A4mUfyHjLMH^NshJt30g61U<qGpyxGWZFjxEZNWpnZ@g9_kFG$3+m zOm+tvOS04%#+O4^GUYX?A`hTV5J5k1mCO}1oyiLjweq}{n`f8@mLWA=$TM9|r%p2) zzPUabQZ7tSn1cl#B4Va8MwVO9`P8r~SS~qP(DS*B6CzQ8jB4n|Ttyo`pE92xsk{Me z?pawcOzZ5+1)wFpC@aY%(@8t#Fl@(AIpDd}>|7bLK%x!bqVlLrOAiQG2_jtwkX+U# zgc_t}02}DXsAn0i6*ZmV+HJt@LeI$=<ut>HK?T48R1c;*qog#9ypT;{5^|Q7hUlfT zZ<8utf=&fW%Y-S9<>V{~1zK=Am4$s!gHpbB!}ALCqQ+*b7|6l0(dl$9c{(BMprU-v z9<w|Qau`lLp`>-jIqF_~2n!`y(1=Rog3v(=^<hqF1(t})W0*CNF_&AwoN3t>avIh* zl?T~@r<8Oir(=RlBf|%XVrN+r<i`<YEt+n!Sb5l@Z#h?hP@91yP?=`ajB`!-IupC) z=Th0zoH~Wr;hhs|rx{3}>6nnY2wZG(@gZ~JX$gnl%`eVlaiXRPl@RtACsZQK`8<uX zfR%+6C7)5W6xn9_u#h*qiAyjkD#L(HEQ7Csp=YtEGz_aFTk0M`F-bWHoWisi5!&)8 z@vkVy$DX>N$?l1hnUj$FA#uzO9l4krO<%14L@vt`5dm*+U3g?Z)xvY+t_g2nU3i#! zEx2-KU1)r|<7bu3JVz`^ZhCfMcG<<@gk>j_8LP`co_vs*m0?D58=CO1qnATMgH^N^ zto0I`p3CJ<S2yQ{3!+T4=YxqxLHrENlN%nkaBMFhDNS=sd`Qu;@h3)(e_<+4hIyha zH-^b>9Zo<y$=no{500PBv#bsySsxr6v@B$dnfE!O&4Q}<%<)pn7PZ`8LqRkIhZapl zhB+BJ8^IRHB~xS-3q1fv(QW9|i-|fx96W<aA*G@_E;~}$d}2V(nY#$HhofUe<|O2Z zMC5v%n2IPWABQng(IdnKw9%QA3Z4*VL7C1>CZ%!Eg9SLlG(r_;YplYahoTSJ&^W!{ z_fV<!Z#>j8i{1ZFM{K2AUf5&~MnIl~e*bWuX_?`KVr}?n8LeGgRDO=6rYXWmHB}f{ zFf8~o*cc(Ci5d%v4t<N^a+44Ciw$4a3Ryu6!x@&J8%{V#C@PGgcwW(=O}KEXR^`-% zCAm#7VimaxdW`ED`CyH1It1H{n$lyM8FGI*rRPtWqtIBC?``FSRtk3MJdC76iIWu= zIVvd6L3Bc0*x;!P>=I{FSx)ye8ks4!{GCaqfp9%K$!6JEkT!9IP*%hW&{AZ?U|dAu ze4r*Jb1hZT2Lo+lZ7_SL0i&=^n4Cyp^g2_t<Xpd5G9c?Px?oBr60*j3<yaF%z;@az z=D;et(C2a*)MrXd7E*Zt%2~F83Q!ooY&H@TAc?P}7nDVv6b?J1qzi<BGU62o7Ypm0 zyD_pV>_Yw&GEkSgV;@0Vj7)~?RY7h}E~<lj;8PII+PjTW0q-fXSHLRNm2J<%=1HBk zDpeo`q*=GgF^=jg@KO0F8Cj<DrM$c(z+kVa+&;%gMGxF5qs(A!g`g879)R74wS--; zh!s!4ke*kPFba9MzzY^uW$9D~C0ZHpf+hQh+1cc9V*D(b6Od_@j7|oGsK-qJ;$KZk zfq$!H0O%}hu1)25VU|~k2ci*BGU(Ej{`WHfYPVtKIh=w5tFMA+<5j_-G!?221SRL3 ztjKxI5*}sH#IO}|&N0V&o4~p&Pop4-Wy#12<d{Otl9wi;L8uN9Nkd*!s6$0zZ=hCd zAR0M6CSm~rn_)7&7Ql$$)_V!=dkrMgXawSMHI>ZA<3=#<(Co<PYBQxGWhz3$OAKx_ z+RDZ7af&iL7?{yuiroprtF!cs(d>Zs@pgw2IB{fZKt6`Q<6{HzDE^M%4^Fd_MuXL5 zgV|%!3ulM*kayIBzq@(7u1e=z=cKq*CY^KR3qE1-ob%wz^rpgVCgF=(@`r!faQT<7 zqRe0M)nI)sN)gvYB%sO2(6-X6mtNcGwUb_b^x8qM?RZ7JT0f;D^m>q919<7wF|Fvw z`JuU7h7AE}`kA4zTvABIA<O<7)bpw2X?P#i+(I^;Q?NxDI>WMOhSI5N(|x%&x_i%% z4oNTw8F5;fWxCyZ2&UUm+~New2Af}`)lOwoSnZ{rQPXoXDvaBxRdRubIfmB-sT7n( zT@$WL-dln7t2?8YykBpzej<bTYFyoW06)RiT~yYzy7NK&1WJCXrM={n8e9Ib^)BE@ zhF|EVq`f}Kq%>bma!X=0rBnE=evSd>OV8KkM+ZSA?$0i@ZPAE}FXEdnzCt>UMAo8s z^Tk@)SdAG6A-{%NdK+Fqj$dl)TnWj=kh~m_wTF;de}V*gtqGp8i4>L0hbFCzU{u0F zHrGdN0_;7G(}o+#T5cJ!yMvsDe&)6rjN#La&2xQ1`#FfOvRr%u;*2Q}q2_+r+Et@5 zsV?CN62@2kL12H*W|Tr2+8iB;;gT@1{A5Jvm75%~Suwrrv`vB(;C3^V|0vn|lfuU? zkI`Tq&%yil%sX~x5jS5^BVeIT+Y1~!7yMy-*Rq0D{hL&~3oop88(-}$#n6_OP=7Jh zzZ~f2Yi_vWN#`PZQJvE@NrJ0V-llogmAC7COZsE?4YTAcu84bL>7ke5W=LY?xRIsn zsaY}<vupv*fV6OeSfhfS#+dx3+i0~d|8a7S8XfUtQ_oG}xF$X}GBpx^>F6^@-*gKp zw4Y`|-ODDWfAYkyQ}vB_U66j(x@oob(5=HSEFYR&4j#Mfafg~plDn~~mf{IMpZYWs zYf=2G+ra8JB2dwMP7&g&p87(89NNdEMW9Xj4*;seC0vbg_r>SICfwk+8HD<hu}Q4U zJlqJb;GOc&%6xclCaQJqfi+$tOHC1;O0iLfpAiRna9@BM6}WxilI5OJa+tvuF-I!A z(cIwR{wGYO!k9@U%7aXR1Q`ri03@lP!4C~DGYr0{OwvPT*wLhQPLS|kRe&)a6U6bb zC*k;Xvhcts9Ib7m?gzzOV8+tU&IbHHAx)f}o9+UPa4mC<j8l$jA#Oh#W6ctT6A_Ov zJ!J3z3^5>z`@w4D+G8kRT3@Zm?D~I+Vx8;}2)14+*!GRbE<d*1ynQv?y%OGD3~yfv zM~mU;8~N{^fAf4X{Md5vvDHvmFuap>e@$7p``)t79;py^+9MdN_9%^-`nQDGJ!bj0 zsCw5S#SY(kd~*5lvE|^@|1K%^VSQcCZQ$RM6r;ZGSA><v^=U-d{|(ONc=)_Hx0i@m z#>;55aahB-BPg%sT)Y0eD7HAa=YJ#T+9Ul$&b`Mhi<qT$m|itzHOZW>;_vPqNP=f1 z*P4b#JtO0aOM9`tQBkjUJ(J{=y*tDh%tt%$DPUR=Ojcw3qIDgpHy{=0`6?osUV&Nl zP4`vL*L*(A_*3*&$EZ5RqpJjL>#aQpm_h5S{QK(Yr|1ij1JzG`sK~7|hPT{S{L^PX zW7@D)J=zNxMMqU8K3^UC6f<5|+rB<j<klI(Tb{LNyyz1D4oF}B7=K^IU+}Ly3$BP) z`56cUPHNL9<k*}hXwL`7DjjLSEtgHQ0q#mKpU9ZLaLdVHM`k=<ZW4u46epT<acjE) zuNRKCO&`2<?&dgu5>Ed60%>b?Crn2s+_ko`^=XD`%N!@%awg2*85=I}g;)igujZM< zu6&73lVRbK%S0S$)a&2jbBF>8MH86k*a@<v?LO+Yh5s;$laVT8w(9t4_ulA!8_EQ> zuiSA&W)9M1uW2MWBh6x4+w53rqY2>>8WYwaZSIV=>V?z@4mTf-cB{-rJ_pP_TIE6; zgVjpP2wLq)RW5C+wlkfjE9g{@f@J?q`Uuu0>8zFJjm74TE6qD^Ht&R8xe^k)>IaLV z2UkM-i=q81p~F849bWC)u+p`o*tKJ&YfrIj&q~*5v1|05u^&GB?z1<$CRf@fm)j=S zX#V(*LXW>Q^~00zo?IUPof<e}#jdf{P4ai1ef`<h2YSDgeLV|rRrk2-uH@<N_%F%R z-cjPOfMd(=9NcdT{Wgd0k)CkHUCW`zOYKsy|HHP)k4j#2{ZXk2?~iq|c)v2TZ~TDk z-Tkid-QIT(j68ym?+>}g_j<qo5dZi=zia$q?++r4DEPr%7rh^*x6w*;OrbDwgpFv6 z^&J!jdT=@@Af%keJxb}x+bYBoR@#&GYt~a@7n<|7!c!eCkNbyks#%P~`99~mVJb%# z`~Z#~JXSuODqiKEFddtl#t{F>x5l(TgVPIK&h0!aoJOB#$<#~=*%t0(jys2ts68&` z{AzbGQ4tnKdp0gscEP2yOB}W!KE*to;b%fg1jTVzTiN2IcrXNuT2VrLq-8UkVD2KI z7Cdp}^9)<$9v~hmX9KOA2c{*QOOSH)y0B+a&rl!Hrc>Db<2cd+$_0&l&@LFPD6pap zXuOpX2b5!1<p{2G>N9FmF9I60MJw#UYE`o=lXQ&b2x_1%ER4wK<jDde>oSZZ2w@id zjLa&=$)I`USP8uzvTOtqe0s<Q#Mg&=Q3POTXJz0}rLvl1dUhurpdy4#L?l^At$}P0 zhUlWa`V&h}^6;VxU5jXsBLI)E@4Nzy&->v{L`ZL0vAVEv&WS#{^oR|E8q?T><FR&d zRV^caqbY?WO3|C)!PGP|ZH%xrXigb8djN|WK_@<pMirWu7ekxz!;z=a(z&BII(U@| zP)og|COKFq6}5G46Pz#MbwT=NzZC4cqF$YQZSF7px444&#@WkfS3)GgmqUBs>*`(Y zJP8LtH>A89qMlAGzVX!Mr&faf#bEzRa8EI~=X-~K96a)~jt5rTo<_}ZD{8j13U{w3 znbtKrvoQR^ZO+eqmiipF0YBhEIC|{~7e5|aqOf%e6+g)jik4bMp!*3p3lU#?GU?n4 zknn}=FWvnbUUcU5Y8ax^6n@CEADo8S*5rAAcJnzeuSspIo^#%cngKWV6UZ@Pp7-M< z&0jt{JLkif4dtAlA5QGVftgLTSQQ*k7n1NWLc&;-!Q<5Gh0#_mX2NtWRz?-W#h5F5 z6Rp$LN>S_xovLGkI+mkO^lybj@!meYNtVf-fo8z*ry0DENGSSZHW{Y_QN&$P?1Ghb z8h0Bg(=pmw5on&cm_blt<r5HAHAh{?c|5Qs1I=cR*c2YYS?$3k>BLcp@IVCtz=(w6 zo@gGZHz2d<Y?MnNUWaQU9N^lFu9qc_4af@Dst7J1SEuO4CI)H%3){M;QAf6a7C~jy zOVT{HtmvAiv33waO`I83uY*f#QWc=7&sqbZB3?`kYwf_Rn*Pf%Q{_?AbZV|Jj{P~V zErlgMs=}~<6{~yfHF)?`4Loym;$)CDqq1z8SOb)~E2QAyPmIi}8N?cx{DgYgsgzyr zdul2Y?nlf(T8oJ|i>7i>AzuZT&RUn92B%?s!Pv7AHdDwZDQw0;{^F8Tm1$u?w>2nH zbhT8o$A_y;&2(U7?h}mw{{Z2MaDnX*&XERf5<l88dhs9v9y73mKB-)sQd1lPO%e}3 zt2UZABu)lP8>;$`mdn~8*!5@87@MytmlW(+Zr;2a?z(#TwZqr<zwzkJ@PW%?t1WGp z;*@#twS(6^*H7FG@4h_t({R_7S8j&4T^jpv-3ETVzrGhgt=Mv1YUa9dDdHd^arcR9 zJ*c+oTTn?`g<vEUZo!q>+elRGKpaP;_HJYJoU5KA?z{*2PE`q5^qhx!(}L$brvl>J z`Odmj*LmMLFUq}ZmixIvbd%zPOUfMgF-hd!Fx4c~phvlh4|}0M2Q_HJ{wx%r3BwEn zCNlbrwNj<l_$?~|8&#hH%TD0X+z!}@__Qy8gtS(?j8=v_HV_hL7!Qteev_}naHrG? zW+py1yyRmsyi}nKR<CAf?KtYzhMqV?$2c+a7g5Wyac90gbE~;;HN1W$++Pg$Um9~H zf4a2~Ht_5p&Azek(vv@NesH#a<H@&Qx)mN@4vzmM)N$p}o1rbsfh~fkxp4|MK3Sh- zNm5-knE?!luj&W6b=(MVxhz&9#y#h8SePC#lUw=g&y$(NwJsuhr=jDp&?+~*b?nKf z&6}p5$Ug*pZS%tnZbzm6H>{$)jMc}Pw9PJjgM-jFuF$v!<GPGCdv@rX2(@|<S+$Wj zmUg5_DxKP2kZ$)&ZQ(1AzTx?9^PA0YAN%_ge{<qi=;$Rc^c6*$mDQ2qrR{QsuZ#2p z*EADI(Dtd`*69Yy=oynv;y~a_Al~!t^Paq|v9LXIV}oRVyQHsodU^E8($|D>uEX@F zh(|=w>FHcvkH@hiu<UY#KJe?3Vkd8lsan~~T|oU5J#|7D>l8bUz-4Z@n;QfQR41dm z$}ND)(msR%W^|(gm#N4mvw{y3n3mx=%@z$G4<o8t1F|@lx~gplvB`LaR)7`{c0*9w zxaB*$Uf=btfjg3`amVGSFO6PV_g*l3W$fCvYlR;N`)+%XU3*ps5CZ+bP6*u6!5T{o zz6vwe4{nD#mOBO9n%e?+7-aOWk>ykEzUG-r;p%w<=0%#c8SqsO?^_9NFNU@+2eu0d z8MI`<iDQtGG)L?4BEiYcj8Lr`(^yYBUTDdaQN$nm{|w3}L!aif4|3GI^mjIm)u4|I zRcq`f9<4fdwg?*(H*-H3lEe0M?sY3A>3v^LBH2vO(w8T4GTml^?+-Ts5m}T+cp@%= zi5rpSk^z1lFGIKAxX%ISH_uNUk<X+QIWeD_w=;X|-2XpuDmOg{=VO7L>`g>}LFx+E z^l^d$k9iu`F47QbGBS;(IBJp)9gavk-mIo1qtPy}J+rrqE)!Kz@CsO|jh}yPDmHJz z`A4yN=W_GVd%?Dn+tq%=_2I@%ziRNdw3eFe$Wqg76?pKoX0Cs(SzK$kBoHqIjYS@n zWo0K1j2eCkquK#swX4`8ISGb)O!^CY0j|Bp2zRB{Z6hSCd1YKs2pkM`E}hwoUv}-7 zBESd=fo3k_UaW&N0yKl~+7m2ilh++WK}3O4%<oEQuoxO#4h+_=j4cMpa=eQF$^kAr zq^cj)B_bKON#(%M@@dPAd%L80T+++ZqI*F)>v>ti;jd@Ov2Majv2HWfxz{Ata3-aJ zN5oYlQm@uot{JWm-nH;bzsGepQ%IAOf$qI3xN?-E8)D)f5Zz2M@26O|*qzseDj}Jc zxYPASV9k?ct9QE2z%ujs#d2ef_>m&rD5~CQI+|74*>N7=+DJjrJXyntJ`QkcUA0i> z*?&$eNXMsOz*bLV58~YTR@e2~;pJfONAI<5`1aA|&<;{=JwFL|m!QphKGuV1@Rinf z>9x={&!4%rc@U;cN3y$-t?k0gOj~(NEu3>KH*RDX1>4h&ZCtHripRzO(Za7;fD)Co zS<-;(7r7*|8*S@BqmVVN2`|Hg>yg?Jr2^uHeST3~C}^iD{Fv7d35hE>hF{nSS|gQ& z>BWzGJ1I3nucP#8q1Ov|8O_`|OEi>I4KH17H5zU2o<?)mh>kVdsA#0rw3p~b+Z2s# zH&|P+RSXZz6ydpm?PRLk)085<(nzUkU&iZA5y>M=zXvFnUSt;NA7HsJO1IskE?=PZ zw7aR@f8l890jYP#>ejy7jUiwAYHM4`gWnI=JzDbN7aseL4cE54wz<?mUjg&$F4aXe zqrdfz+wI$W*Mn4vQm8?x24Cb_?;Qz0W)V`Q4ix=<{MC5L?eR5T+ktamU(@w3-k~3= zwT|aQ9ut5LU+1+)t{-{*;2jA`69`hJe#swN@vSTRMD=U?1(-P-OqUZ(OBoE3CK#kJ z=lcS4x2eb1QQEiJ*ZRH9B?&+8?7K@pr9+ax9j01egdb_#Zr|hUTy1H;(s%hp$%FKV zZCxcFe(B!A`cea>0#eswrAA6MNv&O1P8D0WmYV4^D0OaH4Yps2TzhJ{@8RO6{cn5U zPA+d6DRvxr=jcBq-<??Qm@Ed5-S)UUn@TOzqC;v5-3cQ_6KXHHDR0ijlN)`qJr1P# zIPi;cbd9)54U`N}>qex^)|5BQ8?SRr0_hK1x=TL%T8$|w8Y5*kro3o_Z^yNL@MXPt zy}7t?poC@L@x9Kw^uyPj2&3=H<Q)k=<`N)fQc8<&01G`)+_?9SgtS?X6fF^`tHBpF z^N=#ZHTrt4oW1V5p8V6MV)ui0Bz*Hax7|o_6~QTfBC<m(fa;A<GKWYL)8VL0Ck2ZU z#~E&oamF$H;7W*Gjdn4D56Pz`IGn_T)=V#ARioS1wDzqZSS{KjXLzHnTq+csaA)*5 zvhxVzj?(|igbsCX>lmGOF&U0=yzIli^_4}qX^hq+Lv)QxCN2xO5F+_wG??~-wvGl& z_O%goLeRP?zlUC=68Z6(HcTll3c0+vK%W#1$YsdKfrCPz9@72*d64gtp2Z8I+vU2w zLvro^x%ANcQs)QK<cc&|lqUaG+Wo$??R_cozO?fLY2Qt0-%mYlA9(wI?mbZS9(dn7 zSn|7k`%50l6}}ym{4JNJme(J;<vV=A{Y(Gv`CL6$X0J_O@4Y_#M(?$3v1{;G5@qu7 F{5O#d)Or8_ diff --git a/venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_callbackdatacache.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_callbackdatacache.cpython-312.pyc deleted file mode 100644 index f1c8059cd9ae9a1d6f12293b0576746451456660..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19991 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 diff --git a/venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_contexttypes.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_contexttypes.cpython-312.pyc deleted file mode 100644 index eac7d21c0d45dfeff11fec69d8059d6036afa106..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8742 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 QX6@9Yj^qEOu#$}OKdtG4b^rhX diff --git a/venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_defaults.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_defaults.cpython-312.pyc deleted file mode 100644 index e69c50688920e373ec0a02a02e99a4c34f9c5e08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15601 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 diff --git a/venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_dictpersistence.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_dictpersistence.cpython-312.pyc deleted file mode 100644 index 0fbd14af790d38cdb59a0c84fa1a62bbba355c18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22288 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 R(L~G9WaY8nGFX_j{6E>s2>Ad2 diff --git a/venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_extbot.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_extbot.cpython-312.pyc deleted file mode 100644 index 4f2240321638e38fd14812ed20e3eb90be75c62d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160675 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 diff --git a/venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_jobqueue.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_jobqueue.cpython-312.pyc deleted file mode 100644 index d702f0735d1c4e4aca01abe946163eb524105457..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46303 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 A>Hq)$ diff --git a/venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_picklepersistence.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_picklepersistence.cpython-312.pyc deleted file mode 100644 index 58fd14ff2bfd1bbe21e04835b9663a14ff923cb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28024 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 diff --git a/venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_updater.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/__pycache__/_updater.cpython-312.pyc deleted file mode 100644 index a35fa005d0fd0473286dbd92931b26da8b816afc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32273 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 diff --git a/venv/lib/python3.12/site-packages/telegram/ext/__pycache__/filters.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/__pycache__/filters.cpython-312.pyc deleted file mode 100644 index 7e388a5d3c11b14497b22f2d4edcb43ac549005b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 130053 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 diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_aioratelimiter.py b/venv/lib/python3.12/site-packages/telegram/ext/_aioratelimiter.py deleted file mode 100644 index d2d537e..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_aioratelimiter.py +++ /dev/null @@ -1,299 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an implementation of the BaseRateLimiter class based on the aiolimiter -library. -""" -import asyncio -import contextlib -import sys -from collections.abc import AsyncIterator, Coroutine -from typing import Any, Callable, Optional, Union - -try: - from aiolimiter import AsyncLimiter - - AIO_LIMITER_AVAILABLE = True -except ImportError: - AIO_LIMITER_AVAILABLE = False - -from telegram import constants -from telegram._utils.logging import get_logger -from telegram._utils.types import JSONDict -from telegram.error import RetryAfter -from telegram.ext._baseratelimiter import BaseRateLimiter - -# Useful for something like: -# async with group_limiter if group else null_context(): -# so we don't have to differentiate between "I'm using a context manager" and "I'm not" -if sys.version_info >= (3, 10): - null_context = contextlib.nullcontext # pylint: disable=invalid-name -else: - - @contextlib.asynccontextmanager - async def null_context() -> AsyncIterator[None]: - yield None - - -_LOGGER = get_logger(__name__, class_name="AIORateLimiter") - - -class AIORateLimiter(BaseRateLimiter[int]): - """ - Implementation of :class:`~telegram.ext.BaseRateLimiter` using the library - `aiolimiter <https://aiolimiter.readthedocs.io/en/stable>`_. - - Important: - If you want to use this class, you must install PTB with the optional requirement - ``rate-limiter``, i.e. - - .. code-block:: bash - - pip install "python-telegram-bot[rate-limiter]" - - The rate limiting is applied by combining two levels of throttling and :meth:`process_request` - roughly boils down to:: - - async with group_limiter(group_id): - async with overall_limiter: - await callback(*args, **kwargs) - - Here, ``group_id`` is determined by checking if there is a ``chat_id`` parameter in the - :paramref:`~telegram.ext.BaseRateLimiter.process_request.data`. - The ``overall_limiter`` is applied only if a ``chat_id`` argument is present at all. - - Attention: - * Some bot methods accept a ``chat_id`` parameter in form of a ``@username`` for - supergroups and channels. As we can't know which ``@username`` corresponds to which - integer ``chat_id``, these will be treated as different groups, which may lead to - exceeding the rate limit. - * As channels can't be differentiated from supergroups by the ``@username`` or integer - ``chat_id``, this also applies the group related rate limits to channels. - * A :exc:`~telegram.error.RetryAfter` exception will halt *all* requests for - :attr:`~telegram.error.RetryAfter.retry_after` + 0.1 seconds. This may be stricter than - necessary in some cases, e.g. the bot may hit a rate limit in one group but might still - be allowed to send messages in another group or with - :paramref:`~telegram.Bot.send_message.allow_paid_broadcast` set to :obj:`True`. - - Tip: - With `Bot API 7.1 <https://core.telegram.org/bots/api-changelog#october-31-2024>`_ - (PTB v27.1), Telegram introduced the parameter - :paramref:`~telegram.Bot.send_message.allow_paid_broadcast`. - This allows bots to send up to - :tg-const:`telegram.constants.FloodLimit.PAID_MESSAGES_PER_SECOND` messages per second by - paying a fee in Telegram Stars. - - .. versionchanged:: 21.11 - This class automatically takes the - :paramref:`~telegram.Bot.send_message.allow_paid_broadcast` parameter into account and - throttles the requests accordingly. - - Note: - This class is to be understood as minimal effort reference implementation. - If you would like to handle rate limiting in a more sophisticated, fine-tuned way, we - welcome you to implement your own subclass of :class:`~telegram.ext.BaseRateLimiter`. - Feel free to check out the source code of this class for inspiration. - - .. seealso:: :wiki:`Avoiding Flood Limits <Avoiding-flood-limits>` - - .. versionadded:: 20.0 - - Args: - overall_max_rate (:obj:`float`): The maximum number of requests allowed for the entire bot - per :paramref:`overall_time_period`. When set to 0, no rate limiting will be applied. - Defaults to :tg-const:`telegram.constants.FloodLimit.MESSAGES_PER_SECOND`. - overall_time_period (:obj:`float`): The time period (in seconds) during which the - :paramref:`overall_max_rate` is enforced. When set to 0, no rate limiting will be - applied. Defaults to ``1``. - group_max_rate (:obj:`float`): The maximum number of requests allowed for requests related - to groups and channels per :paramref:`group_time_period`. When set to 0, no rate - limiting will be applied. Defaults to - :tg-const:`telegram.constants.FloodLimit.MESSAGES_PER_MINUTE_PER_GROUP`. - group_time_period (:obj:`float`): The time period (in seconds) during which the - :paramref:`group_max_rate` is enforced. When set to 0, no rate limiting will be - applied. Defaults to ``60``. - max_retries (:obj:`int`): The maximum number of retries to be made in case of a - :exc:`~telegram.error.RetryAfter` exception. - If set to 0, no retries will be made. Defaults to ``0``. - - """ - - __slots__ = ( - "_apb_limiter", - "_base_limiter", - "_group_limiters", - "_group_max_rate", - "_group_time_period", - "_max_retries", - "_retry_after_event", - ) - - def __init__( - self, - overall_max_rate: float = constants.FloodLimit.MESSAGES_PER_SECOND, - overall_time_period: float = 1, - group_max_rate: float = constants.FloodLimit.MESSAGES_PER_MINUTE_PER_GROUP, - group_time_period: float = 60, - max_retries: int = 0, - ) -> None: - if not AIO_LIMITER_AVAILABLE: - raise RuntimeError( - "To use `AIORateLimiter`, PTB must be installed via `pip install " - '"python-telegram-bot[rate-limiter]"`.' - ) - if overall_max_rate and overall_time_period: - self._base_limiter: Optional[AsyncLimiter] = AsyncLimiter( - max_rate=overall_max_rate, time_period=overall_time_period - ) - else: - self._base_limiter = None - - if group_max_rate and group_time_period: - self._group_max_rate: float = group_max_rate - self._group_time_period: float = group_time_period - else: - self._group_max_rate = 0 - self._group_time_period = 0 - - self._group_limiters: dict[Union[str, int], AsyncLimiter] = {} - self._apb_limiter: AsyncLimiter = AsyncLimiter( - max_rate=constants.FloodLimit.PAID_MESSAGES_PER_SECOND, time_period=1 - ) - self._max_retries: int = max_retries - self._retry_after_event = asyncio.Event() - self._retry_after_event.set() - - async def initialize(self) -> None: - """Does nothing.""" - - async def shutdown(self) -> None: - """Does nothing.""" - - def _get_group_limiter(self, group_id: Union[str, int, bool]) -> "AsyncLimiter": - # Remove limiters that haven't been used for so long that all their capacity is unused - # We only do that if we have a lot of limiters lying around to avoid looping on every call - # This is a minimal effort approach - a full-fledged cache could use a TTL approach - # or at least adapt the threshold dynamically depending on the number of active limiters - if len(self._group_limiters) > 512: - # We copy to avoid modifying the dict while we iterate over it - for key, limiter in self._group_limiters.copy().items(): - if key == group_id: - continue - if limiter.has_capacity(limiter.max_rate): - del self._group_limiters[key] - - if group_id not in self._group_limiters: - self._group_limiters[group_id] = AsyncLimiter( - max_rate=self._group_max_rate, - time_period=self._group_time_period, - ) - return self._group_limiters[group_id] - - async def _run_request( - self, - chat: bool, - group: Union[str, int, bool], - allow_paid_broadcast: bool, - callback: Callable[..., Coroutine[Any, Any, Union[bool, JSONDict, list[JSONDict]]]], - args: Any, - kwargs: dict[str, Any], - ) -> Union[bool, JSONDict, list[JSONDict]]: - async def inner() -> Union[bool, JSONDict, list[JSONDict]]: - # In case a retry_after was hit, we wait with processing the request - await self._retry_after_event.wait() - return await callback(*args, **kwargs) - - if allow_paid_broadcast: - async with self._apb_limiter: - return await inner() - else: - base_context = self._base_limiter if (chat and self._base_limiter) else null_context() - group_context = ( - self._get_group_limiter(group) - if group and self._group_max_rate - else null_context() - ) - - async with group_context, base_context: - return await inner() - - # mypy doesn't understand that the last run of the for loop raises an exception - async def process_request( - self, - callback: Callable[..., Coroutine[Any, Any, Union[bool, JSONDict, list[JSONDict]]]], - args: Any, - kwargs: dict[str, Any], - endpoint: str, # noqa: ARG002 - data: dict[str, Any], - rate_limit_args: Optional[int], - ) -> Union[bool, JSONDict, list[JSONDict]]: - """ - Processes a request by applying rate limiting. - - See :meth:`telegram.ext.BaseRateLimiter.process_request` for detailed information on the - arguments. - - Args: - rate_limit_args (:obj:`None` | :obj:`int`): If set, specifies the maximum number of - retries to be made in case of a :exc:`~telegram.error.RetryAfter` exception. - Defaults to :paramref:`AIORateLimiter.max_retries`. - """ - max_retries = rate_limit_args or self._max_retries - - group: Union[int, str, bool] = False - chat: bool = False - chat_id = data.get("chat_id") - allow_paid_broadcast = data.get("allow_paid_broadcast", False) - if chat_id is not None: - chat = True - - # In case user passes integer chat id as string - with contextlib.suppress(ValueError, TypeError): - chat_id = int(chat_id) # type: ignore[arg-type] - - if (isinstance(chat_id, int) and chat_id < 0) or isinstance(chat_id, str): - # string chat_id only works for channels and supergroups - # We can't really tell channels from groups though ... - group = chat_id - - for i in range(max_retries + 1): - try: - return await self._run_request( - chat=chat, - group=group, - allow_paid_broadcast=allow_paid_broadcast, - callback=callback, - args=args, - kwargs=kwargs, - ) - except RetryAfter as exc: - if i == max_retries: - _LOGGER.exception( - "Rate limit hit after maximum of %d retries", max_retries, exc_info=exc - ) - raise - - sleep = exc._retry_after.total_seconds() + 0.1 # pylint: disable=protected-access - _LOGGER.info("Rate limit hit. Retrying after %f seconds", sleep) - # Make sure we don't allow other requests to be processed - self._retry_after_event.clear() - await asyncio.sleep(sleep) - finally: - # Allow other requests to be processed - self._retry_after_event.set() - return None # type: ignore[return-value] diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_application.py b/venv/lib/python3.12/site-packages/telegram/ext/_application.py deleted file mode 100644 index d287b3a..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_application.py +++ /dev/null @@ -1,1935 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the Application class.""" - -import asyncio -import contextlib -import datetime as dtm -import inspect -import itertools -import platform -import signal -import sys -from collections import defaultdict -from collections.abc import Awaitable, Coroutine, Generator, Mapping, Sequence -from copy import deepcopy -from pathlib import Path -from types import MappingProxyType, TracebackType -from typing import TYPE_CHECKING, Any, Callable, Generic, NoReturn, Optional, TypeVar, Union - -from telegram._update import Update -from telegram._utils.defaultvalue import ( - DEFAULT_80, - DEFAULT_IP, - DEFAULT_NONE, - DEFAULT_TRUE, - DefaultValue, -) -from telegram._utils.logging import get_logger -from telegram._utils.repr import build_repr_with_selected_attrs -from telegram._utils.types import SCT, DVType, ODVInput, TimePeriod -from telegram._utils.warnings import warn -from telegram.error import TelegramError -from telegram.ext._basepersistence import BasePersistence -from telegram.ext._contexttypes import ContextTypes -from telegram.ext._extbot import ExtBot -from telegram.ext._handlers.basehandler import BaseHandler -from telegram.ext._updater import Updater -from telegram.ext._utils.networkloop import network_retry_loop -from telegram.ext._utils.stack import was_called_by -from telegram.ext._utils.trackingdict import TrackingDict -from telegram.ext._utils.types import BD, BT, CCT, CD, JQ, RT, UD, ConversationKey, HandlerCallback -from telegram.warnings import PTBDeprecationWarning - -if TYPE_CHECKING: - from socket import socket - - from telegram import Message - from telegram.ext import ConversationHandler, JobQueue - from telegram.ext._applicationbuilder import InitApplicationBuilder - from telegram.ext._baseupdateprocessor import BaseUpdateProcessor - from telegram.ext._jobqueue import Job - -DEFAULT_GROUP: int = 0 - -_AppType = TypeVar("_AppType", bound="Application") # pylint: disable=invalid-name -_STOP_SIGNAL = object() -_DEFAULT_0 = DefaultValue(0) - -# Since python 3.12, the coroutine passed to create_task should not be an (async) generator. Remove -# this check when we drop support for python 3.11. -if sys.version_info >= (3, 12): - _CoroType = Awaitable[RT] -else: - _CoroType = Union[Generator["asyncio.Future[object]", None, RT], Awaitable[RT]] - -_ErrorCoroType = Optional[_CoroType[RT]] - -_LOGGER = get_logger(__name__) - - -class ApplicationHandlerStop(Exception): - """ - Raise this in a handler or an error handler to prevent execution of any other handler (even in - different groups). - - In order to use this exception in a :class:`telegram.ext.ConversationHandler`, pass the - optional :paramref:`state` parameter instead of returning the next state: - - .. code-block:: python - - async def conversation_callback(update, context): - ... - raise ApplicationHandlerStop(next_state) - - Note: - Has no effect, if the handler or error handler is run in a non-blocking way. - - Args: - state (:obj:`object`, optional): The next state of the conversation. - - Attributes: - state (:obj:`object`): Optional. The next state of the conversation. - """ - - __slots__ = ("state",) - - def __init__(self, state: Optional[object] = None) -> None: - super().__init__() - self.state: Optional[object] = state - - -class Application( - Generic[BT, CCT, UD, CD, BD, JQ], - contextlib.AbstractAsyncContextManager["Application"], -): - """This class dispatches all kinds of updates to its registered handlers, and is the entry - point to a PTB application. - - Tip: - This class may not be initialized directly. Use :class:`telegram.ext.ApplicationBuilder` - or :meth:`builder` (for convenience). - - Instances of this class can be used as asyncio context managers, where - - .. code:: python - - async with application: - # code - - is roughly equivalent to - - .. code:: python - - try: - await application.initialize() - # code - finally: - await application.shutdown() - - .. seealso:: :meth:`__aenter__` and :meth:`__aexit__`. - - This class is a :class:`~typing.Generic` class and accepts six type variables: - - 1. The type of :attr:`bot`. Must be :class:`telegram.Bot` or a subclass of that class. - 2. The type of the argument ``context`` of callback functions for (error) handlers and jobs. - Must be :class:`telegram.ext.CallbackContext` or a subclass of that class. This must be - consistent with the following types. - 3. The type of the values of :attr:`user_data`. - 4. The type of the values of :attr:`chat_data`. - 5. The type of :attr:`bot_data`. - 6. The type of :attr:`job_queue`. Must either be :class:`telegram.ext.JobQueue` or a subclass - of that or :obj:`None`. - - Examples: - :any:`Echo Bot <examples.echobot>` - - .. seealso:: :wiki:`Your First Bot <Extensions---Your-first-Bot>`, - :wiki:`Architecture Overview <Architecture>` - - .. versionchanged:: 20.0 - - * Initialization is now done through the :class:`telegram.ext.ApplicationBuilder`. - * Removed the attribute ``groups``. - - Attributes: - bot (:class:`telegram.Bot`): The bot object that should be passed to the handlers. - update_queue (:class:`asyncio.Queue`): The synchronized queue that will contain the - updates. - updater (:class:`telegram.ext.Updater`): Optional. The updater used by this application. - chat_data (:obj:`types.MappingProxyType`): A dictionary handlers can use to store data for - the chat. For each integer chat id, the corresponding value of this mapping is - available as :attr:`telegram.ext.CallbackContext.chat_data` in handler callbacks for - updates from that chat. - - .. versionchanged:: 20.0 - :attr:`chat_data` is now read-only. Note that the values of the mapping are still - mutable, i.e. editing ``context.chat_data`` within a handler callback is possible - (and encouraged), but editing the mapping ``application.chat_data`` itself is not. - - .. tip:: - - * Manually modifying :attr:`chat_data` is almost never needed and unadvisable. - * Entries are never deleted automatically from this mapping. If you want to delete - the data associated with a specific chat, e.g. if the bot got removed from that - chat, please use :meth:`drop_chat_data`. - - user_data (:obj:`types.MappingProxyType`): A dictionary handlers can use to store data for - the user. For each integer user id, the corresponding value of this mapping is - available as :attr:`telegram.ext.CallbackContext.user_data` in handler callbacks for - updates from that user. - - .. versionchanged:: 20.0 - :attr:`user_data` is now read-only. Note that the values of the mapping are still - mutable, i.e. editing ``context.user_data`` within a handler callback is possible - (and encouraged), but editing the mapping ``application.user_data`` itself is not. - - .. tip:: - - * Manually modifying :attr:`user_data` is almost never needed and unadvisable. - * Entries are never deleted automatically from this mapping. If you want to delete - the data associated with a specific user, e.g. if that user blocked the bot, - please use :meth:`drop_user_data`. - - bot_data (:obj:`dict`): A dictionary handlers can use to store data for the bot. - persistence (:class:`telegram.ext.BasePersistence`): The persistence class to - store data that should be persistent over restarts. - handlers (dict[:obj:`int`, list[:class:`telegram.ext.BaseHandler`]]): A dictionary mapping - each handler group to the list of handlers registered to that group. - - .. seealso:: - :meth:`add_handler`, :meth:`add_handlers`. - error_handlers (dict[:term:`coroutine function`, :obj:`bool`]): A dictionary where the keys - are error handlers and the values indicate whether they are to be run blocking. - - .. seealso:: - :meth:`add_error_handler` - context_types (:class:`telegram.ext.ContextTypes`): Specifies the types used by this - dispatcher for the ``context`` argument of handler and job callbacks. - post_init (:term:`coroutine function`): Optional. A callback that will be executed by - :meth:`Application.run_polling` and :meth:`Application.run_webhook` after initializing - the application via :meth:`initialize`. - post_shutdown (:term:`coroutine function`): Optional. A callback that will be executed by - :meth:`Application.run_polling` and :meth:`Application.run_webhook` after shutting down - the application via :meth:`shutdown`. - post_stop (:term:`coroutine function`): Optional. A callback that will be executed by - :meth:`Application.run_polling` and :meth:`Application.run_webhook` after stopping - the application via :meth:`stop`. - - .. versionadded:: 20.1 - - """ - - __slots__ = ( - ( - "__create_task_tasks", - "__update_fetcher_task", - "__update_persistence_event", - "__update_persistence_lock", - "__update_persistence_task", - "__stop_running_marker", - "_chat_data", - "_chat_ids_to_be_deleted_in_persistence", - "_chat_ids_to_be_updated_in_persistence", - "_conversation_handler_conversations", - "_initialized", - "_job_queue", - "_running", - "_update_processor", - "_user_data", - "_user_ids_to_be_deleted_in_persistence", - "_user_ids_to_be_updated_in_persistence", - "bot", - "bot_data", - "chat_data", - "context_types", - "error_handlers", - "handlers", - "persistence", - "post_init", - "post_shutdown", - "post_stop", - "update_queue", - "updater", - "user_data", - ) - # Allowing '__weakref__' creation here since we need it for the JobQueue - # Currently the __weakref__ slot is already created - # in the AsyncContextManager base class for pythons < 3.13 - + (("__weakref__",) if sys.version_info >= (3, 13) else ()) - ) - - def __init__( - self: "Application[BT, CCT, UD, CD, BD, JQ]", - *, - bot: BT, - update_queue: "asyncio.Queue[object]", - updater: Optional[Updater], - job_queue: JQ, - update_processor: "BaseUpdateProcessor", - persistence: Optional[BasePersistence[UD, CD, BD]], - context_types: ContextTypes[CCT, UD, CD, BD], - post_init: Optional[ - Callable[["Application[BT, CCT, UD, CD, BD, JQ]"], Coroutine[Any, Any, None]] - ], - post_shutdown: Optional[ - Callable[["Application[BT, CCT, UD, CD, BD, JQ]"], Coroutine[Any, Any, None]] - ], - post_stop: Optional[ - Callable[["Application[BT, CCT, UD, CD, BD, JQ]"], Coroutine[Any, Any, None]] - ], - ): - if not was_called_by( - inspect.currentframe(), Path(__file__).parent.resolve() / "_applicationbuilder.py" - ): - warn( - "`Application` instances should be built via the `ApplicationBuilder`.", - stacklevel=2, - ) - - self.bot: BT = bot - self.update_queue: asyncio.Queue[object] = update_queue - self.context_types: ContextTypes[CCT, UD, CD, BD] = context_types - self.updater: Optional[Updater] = updater - self.handlers: dict[int, list[BaseHandler[Any, CCT, Any]]] = {} - self.error_handlers: dict[ - HandlerCallback[object, CCT, None], Union[bool, DefaultValue[bool]] - ] = {} - self.post_init: Optional[ - Callable[[Application[BT, CCT, UD, CD, BD, JQ]], Coroutine[Any, Any, None]] - ] = post_init - self.post_shutdown: Optional[ - Callable[[Application[BT, CCT, UD, CD, BD, JQ]], Coroutine[Any, Any, None]] - ] = post_shutdown - self.post_stop: Optional[ - Callable[[Application[BT, CCT, UD, CD, BD, JQ]], Coroutine[Any, Any, None]] - ] = post_stop - self._update_processor = update_processor - self.bot_data: BD = self.context_types.bot_data() - self._user_data: defaultdict[int, UD] = defaultdict(self.context_types.user_data) - self._chat_data: defaultdict[int, CD] = defaultdict(self.context_types.chat_data) - # Read only mapping - self.user_data: Mapping[int, UD] = MappingProxyType(self._user_data) - self.chat_data: Mapping[int, CD] = MappingProxyType(self._chat_data) - - self.persistence: Optional[BasePersistence[UD, CD, BD]] = None - if persistence and not isinstance(persistence, BasePersistence): - raise TypeError("persistence must be based on telegram.ext.BasePersistence") - self.persistence = persistence - - # Some bookkeeping for persistence logic - self._chat_ids_to_be_updated_in_persistence: set[int] = set() - self._user_ids_to_be_updated_in_persistence: set[int] = set() - self._chat_ids_to_be_deleted_in_persistence: set[int] = set() - self._user_ids_to_be_deleted_in_persistence: set[int] = set() - - # This attribute will hold references to the conversation dicts of all conversation - # handlers so that we can extract the changed states during `update_persistence` - self._conversation_handler_conversations: dict[ - str, TrackingDict[ConversationKey, object] - ] = {} - - # A number of low-level helpers for the internal logic - self._initialized = False - self._running = False - self._job_queue: JQ = job_queue - self.__update_fetcher_task: Optional[asyncio.Task] = None - self.__update_persistence_task: Optional[asyncio.Task] = None - self.__update_persistence_event = asyncio.Event() - self.__update_persistence_lock = asyncio.Lock() - self.__create_task_tasks: set[asyncio.Task] = set() # Used for awaiting tasks upon exit - self.__stop_running_marker = asyncio.Event() - - async def __aenter__(self: _AppType) -> _AppType: - """|async_context_manager| :meth:`initializes <initialize>` the App. - - Returns: - The initialized App instance. - - Raises: - :exc:`Exception`: If an exception is raised during initialization, :meth:`shutdown` - is called in this case. - """ - try: - await self.initialize() - except Exception: - await self.shutdown() - raise - return self - - async def __aexit__( - self, - exc_type: Optional[type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - """|async_context_manager| :meth:`shuts down <shutdown>` the App.""" - # Make sure not to return `True` so that exceptions are not suppressed - # https://docs.python.org/3/reference/datamodel.html?#object.__aexit__ - await self.shutdown() - - def __repr__(self) -> str: - """Give a string representation of the application in the form ``Application[bot=...]``. - - As this class doesn't implement :meth:`object.__str__`, the default implementation - will be used, which is equivalent to :meth:`__repr__`. - - Returns: - :obj:`str` - """ - return build_repr_with_selected_attrs(self, bot=self.bot) - - @property - def running(self) -> bool: - """:obj:`bool`: Indicates if this application is running. - - .. seealso:: - :meth:`start`, :meth:`stop` - """ - return self._running - - @property - def concurrent_updates(self) -> int: - """:obj:`int`: The number of concurrent updates that will be processed in parallel. A - value of ``0`` indicates updates are *not* being processed concurrently. - - .. versionchanged:: 20.4 - This is now just a shortcut to :attr:`update_processor.max_concurrent_updates - <telegram.ext.BaseUpdateProcessor.max_concurrent_updates>`. - - .. seealso:: :wiki:`Concurrency` - """ - return self._update_processor.max_concurrent_updates - - @property - def job_queue(self) -> Optional["JobQueue[CCT]"]: - """ - :class:`telegram.ext.JobQueue`: The :class:`JobQueue` used by the - :class:`telegram.ext.Application`. - - .. seealso:: :wiki:`Job Queue <Extensions---JobQueue>` - """ - if self._job_queue is None: - warn( - "No `JobQueue` set up. To use `JobQueue`, you must install PTB via " - '`pip install "python-telegram-bot[job-queue]"`.', - stacklevel=2, - ) - return self._job_queue - - @property - def update_processor(self) -> "BaseUpdateProcessor": - """:class:`telegram.ext.BaseUpdateProcessor`: The update processor used by this - application. - - .. seealso:: :wiki:`Concurrency` - - .. versionadded:: 20.4 - """ - return self._update_processor - - @staticmethod - def _raise_system_exit() -> NoReturn: - raise SystemExit - - @staticmethod - def builder() -> "InitApplicationBuilder": - """Convenience method. Returns a new :class:`telegram.ext.ApplicationBuilder`. - - .. versionadded:: 20.0 - """ - # Unfortunately this needs to be here due to cyclical imports - from telegram.ext import ApplicationBuilder # pylint: disable=import-outside-toplevel - - return ApplicationBuilder() - - def _check_initialized(self) -> None: - if not self._initialized: - raise RuntimeError( - "This Application was not initialized via `Application.initialize`!" - ) - - async def initialize(self) -> None: - """Initializes the Application by initializing: - - * The :attr:`bot`, by calling :meth:`telegram.Bot.initialize`. - * The :attr:`updater`, by calling :meth:`telegram.ext.Updater.initialize`. - * The :attr:`persistence`, by loading persistent conversations and data. - * The :attr:`update_processor` by calling - :meth:`telegram.ext.BaseUpdateProcessor.initialize`. - - Does *not* call :attr:`post_init` - that is only done by :meth:`run_polling` and - :meth:`run_webhook`. - - .. seealso:: - :meth:`shutdown` - """ - if self._initialized: - _LOGGER.debug("This Application is already initialized.") - return - - await self.bot.initialize() - await self._update_processor.initialize() - - if self.updater: - await self.updater.initialize() - - if not self.persistence: - self._initialized = True - return - - await self._initialize_persistence() - - # Unfortunately due to circular imports this has to be here - # pylint: disable=import-outside-toplevel - from telegram.ext._handlers.conversationhandler import ConversationHandler - - # Initialize the persistent conversation handlers with the stored states - for handler in itertools.chain.from_iterable(self.handlers.values()): - if isinstance(handler, ConversationHandler) and handler.persistent and handler.name: - await self._add_ch_to_persistence(handler) - - self._initialized = True - self.__stop_running_marker.clear() - - async def _add_ch_to_persistence(self, handler: "ConversationHandler") -> None: - self._conversation_handler_conversations.update( - await handler._initialize_persistence(self) # pylint: disable=protected-access - ) - - async def shutdown(self) -> None: - """Shuts down the Application by shutting down: - - * :attr:`bot` by calling :meth:`telegram.Bot.shutdown` - * :attr:`updater` by calling :meth:`telegram.ext.Updater.shutdown` - * :attr:`persistence` by calling :meth:`update_persistence` and - :meth:`BasePersistence.flush` - * :attr:`update_processor` by calling :meth:`telegram.ext.BaseUpdateProcessor.shutdown` - - Does *not* call :attr:`post_shutdown` - that is only done by :meth:`run_polling` and - :meth:`run_webhook`. - - .. seealso:: - :meth:`initialize` - - Raises: - :exc:`RuntimeError`: If the application is still :attr:`running`. - """ - if self.running: - raise RuntimeError("This Application is still running!") - - if not self._initialized: - _LOGGER.debug("This Application is already shut down. Returning.") - return - - await self.bot.shutdown() - await self._update_processor.shutdown() - - if self.updater: - await self.updater.shutdown() - - if self.persistence: - _LOGGER.debug("Updating & flushing persistence before shutdown") - await self.update_persistence() - await self.persistence.flush() - _LOGGER.debug("Updated and flushed persistence") - - self._initialized = False - - async def _initialize_persistence(self) -> None: - """This method basically just loads all the data by awaiting the BP methods""" - if not self.persistence: - return - - if self.persistence.store_data.user_data: - self._user_data.update(await self.persistence.get_user_data()) - if self.persistence.store_data.chat_data: - self._chat_data.update(await self.persistence.get_chat_data()) - if self.persistence.store_data.bot_data: - self.bot_data = await self.persistence.get_bot_data() - if not isinstance(self.bot_data, self.context_types.bot_data): - raise ValueError( - f"bot_data must be of type {self.context_types.bot_data.__name__}" - ) - - # Mypy doesn't know that persistence.set_bot (see above) already checks that - # self.bot is an instance of ExtBot if callback_data should be stored ... - if self.persistence.store_data.callback_data and ( - self.bot.callback_data_cache is not None # type: ignore[attr-defined] - ): - persistent_data = await self.persistence.get_callback_data() - if persistent_data is not None: - if not isinstance(persistent_data, tuple) or len(persistent_data) != 2: - raise ValueError("callback_data must be a tuple of length 2") - self.bot.callback_data_cache.load_persistence_data( # type: ignore[attr-defined] - persistent_data - ) - - async def start(self) -> None: - """Starts - - * a background task that fetches updates from :attr:`update_queue` and processes them via - :meth:`process_update`. - * :attr:`job_queue`, if set. - * a background task that calls :meth:`update_persistence` in regular intervals, if - :attr:`persistence` is set. - - Note: - This does *not* start fetching updates from Telegram. To fetch updates, you need to - either start :attr:`updater` manually or use one of :meth:`run_polling` or - :meth:`run_webhook`. - - Tip: - When using a custom logic for startup and shutdown of the application, eventual - cancellation of pending tasks should happen only `after` :meth:`stop` has been called - in order to ensure that the tasks mentioned above are not cancelled prematurely. - - .. seealso:: - :meth:`stop` - - Raises: - :exc:`RuntimeError`: If the application is already running or was not initialized. - """ - if self.running: - raise RuntimeError("This Application is already running!") - self._check_initialized() - - self._running = True - self.__update_persistence_event.clear() - - try: - if self.persistence: - self.__update_persistence_task = asyncio.create_task( - self._persistence_updater(), - name=f"Application:{self.bot.id}:persistence_updater", - ) - _LOGGER.debug("Loop for updating persistence started") - - if self._job_queue: - await self._job_queue.start() # type: ignore[union-attr] - _LOGGER.debug("JobQueue started") - - self.__update_fetcher_task = asyncio.create_task( - self._update_fetcher(), name=f"Application:{self.bot.id}:update_fetcher" - ) - _LOGGER.info("Application started") - - except Exception: - self._running = False - raise - - async def stop(self) -> None: - """Stops the process after processing any pending updates or tasks created by - :meth:`create_task`. Also stops :attr:`job_queue`, if set. - Finally, calls :meth:`update_persistence` and :meth:`BasePersistence.flush` on - :attr:`persistence`, if set. - - Warning: - Once this method is called, no more updates will be fetched from :attr:`update_queue`, - even if it's not empty. - - .. seealso:: - :meth:`start` - - Note: - * This does *not* stop :attr:`updater`. You need to either manually call - :meth:`telegram.ext.Updater.stop` or use one of :meth:`run_polling` or - :meth:`run_webhook`. - * Does *not* call :attr:`post_stop` - that is only done by - :meth:`run_polling` and :meth:`run_webhook`. - - Raises: - :exc:`RuntimeError`: If the application is not running. - """ - if not self.running: - raise RuntimeError("This Application is not running!") - - self._running = False - self.__stop_running_marker.clear() - _LOGGER.info("Application is stopping. This might take a moment.") - - # Stop listening for new updates and handle all pending ones - if self.__update_fetcher_task: - if self.__update_fetcher_task.done(): - try: - self.__update_fetcher_task.result() - except BaseException as exc: - _LOGGER.critical( - "Fetching updates was aborted due to %r. Suppressing " - "exception to ensure graceful shutdown.", - exc, - exc_info=True, - ) - else: - await self.update_queue.put(_STOP_SIGNAL) - _LOGGER.debug("Waiting for update_queue to join") - await self.update_queue.join() - await self.__update_fetcher_task - _LOGGER.debug("Application stopped fetching of updates.") - - if self._job_queue: - _LOGGER.debug("Waiting for running jobs to finish") - await self._job_queue.stop(wait=True) # type: ignore[union-attr] - _LOGGER.debug("JobQueue stopped") - - _LOGGER.debug("Waiting for `create_task` calls to be processed") - await asyncio.gather(*self.__create_task_tasks, return_exceptions=True) - - # Make sure that this is the *last* step of stopping the application! - if self.persistence and self.__update_persistence_task: - _LOGGER.debug("Waiting for persistence loop to finish") - self.__update_persistence_event.set() - await self.__update_persistence_task - self.__update_persistence_event.clear() - - _LOGGER.info("Application.stop() complete") - - def stop_running(self) -> None: - """This method can be used to stop the execution of :meth:`run_polling` or - :meth:`run_webhook` from within a handler, job or error callback. This allows a graceful - shutdown of the application, i.e. the methods listed in :attr:`run_polling` and - :attr:`run_webhook` will still be executed. - - This method can also be called within :meth:`post_init`. This allows for a graceful, - early shutdown of the application if some condition is met (e.g., a database connection - could not be established). - - Note: - If the application is not running and this method is not called within - :meth:`post_init`, this method does nothing. - - Warning: - This method is designed to for use in combination with :meth:`run_polling` or - :meth:`run_webhook`. Using this method in combination with a custom logic for starting - and stopping the application is not guaranteed to work as expected. Use at your own - risk. - - .. versionadded:: 20.5 - - .. versionchanged:: 21.2 - Added support for calling within :meth:`post_init`. - """ - if self.running: - # This works because `__run` is using `loop.run_forever()`. If that changes, this - # method needs to be adapted. - asyncio.get_running_loop().stop() - else: - self.__stop_running_marker.set() - if not self._initialized: - _LOGGER.debug( - "Application is not running and not initialized. `stop_running()` likely has " - "no effect." - ) - - def run_polling( - self, - poll_interval: float = 0.0, - timeout: TimePeriod = dtm.timedelta(seconds=10), - bootstrap_retries: int = 0, - allowed_updates: Optional[Sequence[str]] = None, - drop_pending_updates: Optional[bool] = None, - close_loop: bool = True, - stop_signals: ODVInput[Sequence[int]] = DEFAULT_NONE, - ) -> None: - """Convenience method that takes care of initializing and starting the app, - polling updates from Telegram using :meth:`telegram.ext.Updater.start_polling` and - a graceful shutdown of the app on exit. - - |app_run_shutdown| :paramref:`stop_signals`. - - The order of execution by :meth:`run_polling` is roughly as follows: - - - :meth:`initialize` - - :meth:`post_init` - - :meth:`telegram.ext.Updater.start_polling` - - :meth:`start` - - Run the application until the users stops it - - :meth:`telegram.ext.Updater.stop` - - :meth:`stop` - - :meth:`post_stop` - - :meth:`shutdown` - - :meth:`post_shutdown` - - A small wrapper is passed to :paramref:`telegram.ext.Updater.start_polling.error_callback` - which forwards errors occurring during polling to - :meth:`registered error handlers <add_error_handler>`. The update parameter of the callback - will be set to :obj:`None`. - - .. include:: inclusions/application_run_tip.rst - - .. versionchanged:: - Removed the deprecated parameters ``read_timeout``, ``write_timeout``, - ``connect_timeout``, and ``pool_timeout``. Use the corresponding methods in - :class:`telegram.ext.ApplicationBuilder` instead. - - Args: - poll_interval (:obj:`float`, optional): Time to wait between polling updates from - Telegram in seconds. Default is ``0.0``. - timeout (:obj:`int` | :class:`datetime.timedelta`, optional): Passed to - :paramref:`telegram.Bot.get_updates.timeout`. - Default is :obj:`timedelta(seconds=10)<datetime.timedelta>`. - - .. versionchanged:: v22.2 - |time-period-input| - bootstrap_retries (:obj:`int`, optional): Whether the bootstrapping phase - (calling :meth:`initialize` and the boostrapping of - :meth:`telegram.ext.Updater.start_polling`) - will retry on failures on the Telegram server. - - * < 0 - retry indefinitely - * 0 - no retries (default) - * > 0 - retry up to X times - - .. versionchanged:: 21.11 - The default value will be changed to from ``-1`` to ``0``. Indefinite retries - during bootstrapping are not recommended. - - drop_pending_updates (:obj:`bool`, optional): Whether to clean any pending updates on - Telegram servers before actually starting to poll. Default is :obj:`False`. - allowed_updates (Sequence[:obj:`str`], optional): Passed to - :meth:`telegram.Bot.get_updates`. - - .. versionchanged:: 21.9 - Accepts any :class:`collections.abc.Sequence` as input instead of just a list - close_loop (:obj:`bool`, optional): If :obj:`True`, the current event loop will be - closed upon shutdown. Defaults to :obj:`True`. - - .. seealso:: - :meth:`asyncio.loop.close` - stop_signals (Sequence[:obj:`int`] | :obj:`None`, optional): Signals that will shut - down the app. Pass :obj:`None` to not use stop signals. - Defaults to :data:`signal.SIGINT`, :data:`signal.SIGTERM` and - :data:`signal.SIGABRT` on non Windows platforms. - - Caution: - Not every :class:`asyncio.AbstractEventLoop` implements - :meth:`asyncio.loop.add_signal_handler`. Most notably, the standard event loop - on Windows, :class:`asyncio.ProactorEventLoop`, does not implement this method. - If this method is not available, stop signals can not be set. - - Raises: - :exc:`RuntimeError`: If the Application does not have an :class:`telegram.ext.Updater`. - """ - if not self.updater: - raise RuntimeError( - "Application.run_polling is only available if the application has an Updater." - ) - - def error_callback(exc: TelegramError) -> None: - self.create_task(self.process_error(error=exc, update=None)) - - return self.__run( - updater_coroutine=self.updater.start_polling( - poll_interval=poll_interval, - timeout=timeout, - bootstrap_retries=bootstrap_retries, - allowed_updates=allowed_updates, - drop_pending_updates=drop_pending_updates, - error_callback=error_callback, # if there is an error in fetching updates - ), - stop_signals=stop_signals, - bootstrap_retries=bootstrap_retries, - close_loop=close_loop, - ) - - def run_webhook( - self, - listen: DVType[str] = DEFAULT_IP, - port: DVType[int] = DEFAULT_80, - url_path: str = "", - cert: Optional[Union[str, Path]] = None, - key: Optional[Union[str, Path]] = None, - bootstrap_retries: int = 0, - webhook_url: Optional[str] = None, - allowed_updates: Optional[Sequence[str]] = None, - drop_pending_updates: Optional[bool] = None, - ip_address: Optional[str] = None, - max_connections: int = 40, - close_loop: bool = True, - stop_signals: ODVInput[Sequence[int]] = DEFAULT_NONE, - secret_token: Optional[str] = None, - unix: Optional[Union[str, Path, "socket"]] = None, - ) -> None: - """Convenience method that takes care of initializing and starting the app, - listening for updates from Telegram using :meth:`telegram.ext.Updater.start_webhook` and - a graceful shutdown of the app on exit. - - |app_run_shutdown| :paramref:`stop_signals`. - - If :paramref:`cert` - and :paramref:`key` are not provided, the webhook will be started directly on - ``http://listen:port/url_path``, so SSL can be handled by another - application. Else, the webhook will be started on - ``https://listen:port/url_path``. Also calls :meth:`telegram.Bot.set_webhook` as - required. - - The order of execution by :meth:`run_webhook` is roughly as follows: - - - :meth:`initialize` - - :meth:`post_init` - - :meth:`telegram.ext.Updater.start_webhook` - - :meth:`start` - - Run the application until the users stops it - - :meth:`telegram.ext.Updater.stop` - - :meth:`stop` - - :meth:`post_stop` - - :meth:`shutdown` - - :meth:`post_shutdown` - - Important: - If you want to use this method, you must install PTB with the optional requirement - ``webhooks``, i.e. - - .. code-block:: bash - - pip install "python-telegram-bot[webhooks]" - - .. include:: inclusions/application_run_tip.rst - - .. seealso:: - :wiki:`Webhooks` - - Args: - listen (:obj:`str`, optional): IP-Address to listen on. Defaults to - `127.0.0.1 <https://en.wikipedia.org/wiki/Localhost>`_. - port (:obj:`int`, optional): Port the bot should be listening on. Must be one of - :attr:`telegram.constants.SUPPORTED_WEBHOOK_PORTS` unless the bot is running - behind a proxy. Defaults to ``80``. - url_path (:obj:`str`, optional): Path inside url. Defaults to `` '' `` - cert (:class:`pathlib.Path` | :obj:`str`, optional): Path to the SSL certificate file. - key (:class:`pathlib.Path` | :obj:`str`, optional): Path to the SSL key file. - bootstrap_retries (:obj:`int`, optional): Whether the bootstrapping phase - (calling :meth:`initialize` and the boostrapping of - :meth:`telegram.ext.Updater.start_polling`) - will retry on failures on the Telegram server. - - * < 0 - retry indefinitely - * 0 - no retries (default) - * > 0 - retry up to X times - webhook_url (:obj:`str`, optional): Explicitly specify the webhook url. Useful behind - NAT, reverse proxy, etc. Default is derived from :paramref:`listen`, - :paramref:`port`, :paramref:`url_path`, :paramref:`cert`, and :paramref:`key`. - allowed_updates (Sequence[:obj:`str`], optional): Passed to - :meth:`telegram.Bot.set_webhook`. - - .. versionchanged:: 21.9 - Accepts any :class:`collections.abc.Sequence` as input instead of just a list - drop_pending_updates (:obj:`bool`, optional): Whether to clean any pending updates on - Telegram servers before actually starting to poll. Default is :obj:`False`. - ip_address (:obj:`str`, optional): Passed to :meth:`telegram.Bot.set_webhook`. - max_connections (:obj:`int`, optional): Passed to - :meth:`telegram.Bot.set_webhook`. Defaults to ``40``. - close_loop (:obj:`bool`, optional): If :obj:`True`, the current event loop will be - closed upon shutdown. Defaults to :obj:`True`. - - .. seealso:: - :meth:`asyncio.loop.close` - stop_signals (Sequence[:obj:`int`] | :obj:`None`, optional): Signals that will shut - down the app. Pass :obj:`None` to not use stop signals. - Defaults to :data:`signal.SIGINT`, :data:`signal.SIGTERM` and - :data:`signal.SIGABRT`. - - Caution: - Not every :class:`asyncio.AbstractEventLoop` implements - :meth:`asyncio.loop.add_signal_handler`. Most notably, the standard event loop - on Windows, :class:`asyncio.ProactorEventLoop`, does not implement this method. - If this method is not available, stop signals can not be set. - secret_token (:obj:`str`, optional): Secret token to ensure webhook requests originate - from Telegram. See :paramref:`telegram.Bot.set_webhook.secret_token` for more - details. - - When added, the web server started by this call will expect the token to be set in - the ``X-Telegram-Bot-Api-Secret-Token`` header of an incoming request and will - raise a :class:`http.HTTPStatus.FORBIDDEN <http.HTTPStatus>` error if either the - header isn't set or it is set to a wrong token. - - .. versionadded:: 20.0 - unix (:class:`pathlib.Path` | :obj:`str` | :class:`socket.socket`, optional): Can be - either: - - * the path to the unix socket file as :class:`pathlib.Path` or :obj:`str`. This - will be passed to `tornado.netutil.bind_unix_socket <https://www.tornadoweb.org/ - en/stable/netutil.html#tornado.netutil.bind_unix_socket>`_ to create the socket. - If the Path does not exist, the file will be created. - - * or the socket itself. This option allows you to e.g. restrict the permissions of - the socket for improved security. Note that you need to pass the correct family, - type and socket options yourself. - - Caution: - This parameter is a replacement for the default TCP bind. Therefore, it is - mutually exclusive with :paramref:`listen` and :paramref:`port`. When using - this param, you must also run a reverse proxy to the unix socket and set the - appropriate :paramref:`webhook_url`. - - .. versionadded:: 20.8 - .. versionchanged:: 21.1 - Added support to pass a socket instance itself. - """ - if not self.updater: - raise RuntimeError( - "Application.run_webhook is only available if the application has an Updater." - ) - - return self.__run( - updater_coroutine=self.updater.start_webhook( - listen=listen, - port=port, - url_path=url_path, - cert=cert, - key=key, - bootstrap_retries=bootstrap_retries, - drop_pending_updates=drop_pending_updates, - webhook_url=webhook_url, - allowed_updates=allowed_updates, - ip_address=ip_address, - max_connections=max_connections, - secret_token=secret_token, - unix=unix, - ), - stop_signals=stop_signals, - bootstrap_retries=bootstrap_retries, - close_loop=close_loop, - ) - - async def _bootstrap_initialize(self, max_retries: int) -> None: - await network_retry_loop( - action_cb=self.initialize, - description="Bootstrap Initialize Application", - max_retries=max_retries, - interval=1, - ) - - def __run( - self, - updater_coroutine: Coroutine, - stop_signals: ODVInput[Sequence[int]], - bootstrap_retries: int, - close_loop: bool = True, - ) -> None: - # Calling get_event_loop() should still be okay even in py3.10+ as long as there is a - # running event loop, or we are in the main thread, which are the intended use cases. - # See the docs of get_event_loop() and get_running_loop() for more info - loop = asyncio.get_event_loop() - - if stop_signals is DEFAULT_NONE and platform.system() != "Windows": - stop_signals = (signal.SIGINT, signal.SIGTERM, signal.SIGABRT) - - try: - if not isinstance(stop_signals, DefaultValue): - for sig in stop_signals or []: - loop.add_signal_handler(sig, self._raise_system_exit) - except NotImplementedError as exc: - warn( - f"Could not add signal handlers for the stop signals {stop_signals} due to " - f"exception `{exc!r}`. If your event loop does not implement `add_signal_handler`," - " please pass `stop_signals=None`.", - stacklevel=3, - ) - - try: - loop.run_until_complete(self._bootstrap_initialize(max_retries=bootstrap_retries)) - if self.post_init: - loop.run_until_complete(self.post_init(self)) - if self.__stop_running_marker.is_set(): - _LOGGER.info("Application received stop signal via `stop_running`. Shutting down.") - return - loop.run_until_complete(updater_coroutine) # one of updater.start_webhook/polling - loop.run_until_complete(self.start()) - loop.run_forever() - except (KeyboardInterrupt, SystemExit): - _LOGGER.debug("Application received stop signal. Shutting down.") - finally: - # We arrive here either by catching the exceptions above or if the loop gets stopped - # In case the coroutine wasn't awaited, we don't need to bother the user with a warning - updater_coroutine.close() - - try: - # Mypy doesn't know that we already check if updater is None - if self.updater.running: # type: ignore[union-attr] - loop.run_until_complete(self.updater.stop()) # type: ignore[union-attr] - if self.running: - loop.run_until_complete(self.stop()) - # post_stop should be called only if stop was called! - if self.post_stop: - loop.run_until_complete(self.post_stop(self)) - loop.run_until_complete(self.shutdown()) - if self.post_shutdown: - loop.run_until_complete(self.post_shutdown(self)) - finally: - if close_loop: - loop.close() - - def create_task( - self, - coroutine: _CoroType[RT], - update: Optional[object] = None, - *, - name: Optional[str] = None, - ) -> "asyncio.Task[RT]": - """Thin wrapper around :func:`asyncio.create_task` that handles exceptions raised by - the :paramref:`coroutine` with :meth:`process_error`. - - Note: - * If :paramref:`coroutine` raises an exception, it will be set on the task created by - this method even though it's handled by :meth:`process_error`. - * If the application is currently running, tasks created by this method will be - awaited with :meth:`stop`. - - .. seealso:: :wiki:`Concurrency` - - Args: - coroutine (:term:`awaitable`): The awaitable to run as task. - - .. versionchanged:: 20.2 - Accepts :class:`asyncio.Future` and generator-based coroutine functions. - .. deprecated:: 20.4 - Since Python 3.12, generator-based coroutine functions are no longer accepted. - update (:obj:`object`, optional): If set, will be passed to :meth:`process_error` - as additional information for the error handlers. Moreover, the corresponding - :attr:`chat_data` and :attr:`user_data` entries will be updated in the next run of - :meth:`update_persistence` after the :paramref:`coroutine` is finished. - - Keyword Args: - name (:obj:`str`, optional): The name of the task. - - .. versionadded:: 20.4 - - Returns: - :class:`asyncio.Task`: The created task. - """ - return self.__create_task(coroutine=coroutine, update=update, name=name) - - def __create_task( - self, - coroutine: _CoroType[RT], - update: Optional[object] = None, - is_error_handler: bool = False, - name: Optional[str] = None, - ) -> "asyncio.Task[RT]": - # Unfortunately, we can't know if `coroutine` runs one of the error handler functions - # but by passing `is_error_handler=True` from `process_error`, we can make sure that we - # get at most one recursion of the user calls `create_task` manually with an error handler - # function - task: asyncio.Task[RT] = asyncio.create_task( - self.__create_task_callback( - coroutine=coroutine, update=update, is_error_handler=is_error_handler - ), - name=name, - ) - - if self.running: - self.__create_task_tasks.add(task) - task.add_done_callback(self.__create_task_done_callback) - else: - warn( - "Tasks created via `Application.create_task` while the application is not " - "running won't be automatically awaited!", - stacklevel=3, - ) - - return task - - def __create_task_done_callback(self, task: asyncio.Task) -> None: - self.__create_task_tasks.discard(task) # Discard from our set since we are done with it - # We just retrieve the eventual exception so that asyncio doesn't complain in case - # it's not retrieved somewhere else - with contextlib.suppress(asyncio.CancelledError, asyncio.InvalidStateError): - task.exception() - - async def __create_task_callback( - self, - coroutine: _CoroType[RT], - update: Optional[object] = None, - is_error_handler: bool = False, - ) -> RT: - try: - # Generator-based coroutines are not supported in Python 3.12+ - if sys.version_info < (3, 12) and isinstance(coroutine, Generator): - warn( - PTBDeprecationWarning( - "20.4", - "Generator-based coroutines are deprecated in create_task and will not" - " work in Python 3.12+", - ), - ) - return await asyncio.create_task(coroutine) - # If user uses generator in python 3.12+, Exception will happen and we cannot do - # anything about it. (hence the type ignore if mypy is run on python 3.12-) - return await coroutine # type: ignore[misc] - except Exception as exception: - if isinstance(exception, ApplicationHandlerStop): - warn( - "ApplicationHandlerStop is not supported with handlers running non-blocking.", - stacklevel=1, - ) - - # Avoid infinite recursion of error handlers. - elif is_error_handler: - _LOGGER.exception( - "An error was raised and an uncaught error was raised while " - "handling the error with an error_handler.", - exc_info=exception, - ) - - else: - # If we arrive here, an exception happened in the task and was neither - # ApplicationHandlerStop nor raised by an error handler. - # So we can and must handle it - await self.process_error(update=update, error=exception, coroutine=coroutine) - - # Raise exception so that it can be set on the task and retrieved by task.exception() - raise - finally: - self._mark_for_persistence_update(update=update) - - async def __update_fetcher(self) -> None: - # Continuously fetch updates from the queue. Exit only once the signal object is found. - while True: - update = await self.update_queue.get() - - if update is _STOP_SIGNAL: - # For the _STOP_SIGNAL - self.update_queue.task_done() - return - - _LOGGER.debug("Processing update %s", update) - - if self._update_processor.max_concurrent_updates > 1: - # We don't await the below because it has to be run concurrently - self.create_task( - self.__process_update_wrapper(update), - update=update, - name=f"Application:{self.bot.id}:process_concurrent_update", - ) - else: - await self.__process_update_wrapper(update) - - async def _update_fetcher(self) -> None: - try: - await self.__update_fetcher() - finally: - while not self.update_queue.empty(): - _LOGGER.debug("Dropping pending update: %s", self.update_queue.get_nowait()) - with contextlib.suppress(ValueError): - # Since we're shutting down here, it's not too bad if we call task_done - # on an empty queue - self.update_queue.task_done() - - async def __process_update_wrapper(self, update: object) -> None: - try: - await self._update_processor.process_update(update, self.process_update(update)) - finally: - self.update_queue.task_done() - - async def process_update(self, update: object) -> None: - """Processes a single update and marks the update to be updated by the persistence later. - Exceptions raised by handler callbacks will be processed by :meth:`process_error`. - - .. seealso:: :wiki:`Concurrency` - - .. versionchanged:: 20.0 - Persistence is now updated in an interval set by - :attr:`telegram.ext.BasePersistence.update_interval`. - - Args: - update (:class:`telegram.Update` | :obj:`object` | \ - :class:`telegram.error.TelegramError`): The update to process. - - Raises: - :exc:`RuntimeError`: If the application was not initialized. - """ - # Processing updates before initialize() is a problem e.g. if persistence is used - self._check_initialized() - - context = None - any_blocking = False # Flag which is set to True if any handler specifies block=True - - # We copy the lists to avoid issues with concurrent modification of the - # handlers (groups or handlers in groups) while iterating over it via add/remove_handler. - # Currently considered implementation detail as described in docstrings of - # add/remove_handler - # do *not* use `copy.deepcopy` here, as we don't want to deepcopy the handlers themselves - for handlers in [v.copy() for v in self.handlers.values()]: - try: - # no copy needed b/c we copy above - for handler in handlers: - check = handler.check_update(update) # Should the handler handle this update? - if check is None or check is False: - continue - - if not context: # build a context if not already built - try: - context = self.context_types.context.from_update(update, self) - except Exception as exc: - _LOGGER.critical( - ( - "Error while building CallbackContext for update %s. " - "Update will not be processed." - ), - update, - exc_info=exc, - ) - return - await context.refresh_data() - coroutine: Coroutine = handler.handle_update(update, self, check, context) - - if not handler.block or ( # if handler is running with block=False, - handler.block is DEFAULT_TRUE - and isinstance(self.bot, ExtBot) - and self.bot.defaults - and not self.bot.defaults.block - ): - self.create_task( - coroutine, - update=update, - name=( - f"Application:{self.bot.id}:process_update_non_blocking" - f":{handler}" - ), - ) - else: - any_blocking = True - await coroutine - break # Only a max of 1 handler per group is handled - - # Stop processing with any other handler. - except ApplicationHandlerStop: - _LOGGER.debug("Stopping further handlers due to ApplicationHandlerStop") - break - - # Dispatch any error. - except Exception as exc: - if await self.process_error(update=update, error=exc): - _LOGGER.debug("Error handler stopped further handlers.") - break - - if any_blocking: - # Only need to mark the update for persistence if there was at least one - # blocking handler - the non-blocking handlers mark the update again when finished - # (in __create_task_callback) - self._mark_for_persistence_update(update=update) - - def add_handler(self, handler: BaseHandler[Any, CCT, Any], group: int = DEFAULT_GROUP) -> None: - """Register a handler. - - TL;DR: Order and priority counts. 0 or 1 handlers per group will be used. End handling of - update with :class:`telegram.ext.ApplicationHandlerStop`. - - A handler must be an instance of a subclass of :class:`telegram.ext.BaseHandler`. All - handlers - are organized in groups with a numeric value. The default group is 0. All groups will be - evaluated for handling an update, but only 0 or 1 handler per group will be used. If - :class:`telegram.ext.ApplicationHandlerStop` is raised from one of the handlers, no further - handlers (regardless of the group) will be called. - - The priority/order of handlers is determined as follows: - - * Priority of the group (lower group number == higher priority) - * The first handler in a group which can handle an update (see - :attr:`telegram.ext.BaseHandler.check_update`) will be used. Other handlers from the - group will not be used. The order in which handlers were added to the group defines the - priority. - - Warning: - Adding persistent :class:`telegram.ext.ConversationHandler` after the application has - been initialized is discouraged. This is because the persisted conversation states need - to be loaded into memory while the application is already processing updates, which - might lead to race conditions and undesired behavior. In particular, current - conversation states may be overridden by the loaded data. - - Hint: - This method currently has no influence on calls to :meth:`process_update` that are - already in progress. - - .. warning:: - This behavior should currently be considered an implementation detail and not as - guaranteed behavior. - - Args: - handler (:class:`telegram.ext.BaseHandler`): A BaseHandler instance. - group (:obj:`int`, optional): The group identifier. Default is ``0``. - - """ - # Unfortunately due to circular imports this has to be here - # pylint: disable=import-outside-toplevel - from telegram.ext._handlers.conversationhandler import ConversationHandler - - if not isinstance(handler, BaseHandler): - raise TypeError(f"handler is not an instance of {BaseHandler.__name__}") - if not isinstance(group, int): - raise TypeError("group is not int") - if isinstance(handler, ConversationHandler) and handler.persistent and handler.name: - if not self.persistence: - raise ValueError( - f"ConversationHandler {handler.name} " - "can not be persistent if application has no persistence" - ) - if self._initialized: - self.create_task( - self._add_ch_to_persistence(handler), - name=f"Application:{self.bot.id}:add_handler:conversation_handler_after_init", - ) - warn( - "A persistent `ConversationHandler` was passed to `add_handler`, " - "after `Application.initialize` was called. This is discouraged." - "See the docs of `Application.add_handler` for details.", - stacklevel=2, - ) - - if group not in self.handlers: - self.handlers[group] = [] - self.handlers = dict(sorted(self.handlers.items())) # lower -> higher groups - - self.handlers[group].append(handler) - - def add_handlers( - self, - handlers: Union[ - Sequence[BaseHandler[Any, CCT, Any]], - dict[int, Sequence[BaseHandler[Any, CCT, Any]]], - ], - group: Union[int, DefaultValue[int]] = _DEFAULT_0, - ) -> None: - """Registers multiple handlers at once. The order of the handlers in the passed - sequence(s) matters. See :meth:`add_handler` for details. - - .. versionadded:: 20.0 - - Args: - handlers (Sequence[:class:`telegram.ext.BaseHandler`] | \ - dict[int, Sequence[:class:`telegram.ext.BaseHandler`]]): - Specify a sequence of handlers *or* a dictionary where the keys are groups and - values are handlers. - - .. versionchanged:: 21.7 - Accepts any :class:`collections.abc.Sequence` as input instead of just a list - or tuple. - - group (:obj:`int`, optional): Specify which group the sequence of :paramref:`handlers` - should be added to. Defaults to ``0``. - - Example:: - - app.add_handlers(handlers={ - -1: [MessageHandler(...)], - 1: [CallbackQueryHandler(...), CommandHandler(...)] - } - - Raises: - :exc:`TypeError`: If the combination of arguments is invalid. - """ - if isinstance(handlers, dict) and not isinstance(group, DefaultValue): - raise TypeError("The `group` argument can only be used with a sequence of handlers.") - - if isinstance(handlers, dict): - for handler_group, grp_handlers in handlers.items(): - if not isinstance(grp_handlers, Sequence): - raise TypeError( - f"Handlers for group {handler_group} must be a sequence of handlers." - ) - - for handler in grp_handlers: - self.add_handler(handler, handler_group) - - elif isinstance(handlers, Sequence): - for handler in handlers: - self.add_handler(handler, DefaultValue.get_value(group)) - - else: - raise TypeError( - "The `handlers` argument must be a sequence of handlers or a " - "dictionary where the keys are groups and values are sequences of handlers." - ) - - def remove_handler( - self, handler: BaseHandler[Any, CCT, Any], group: int = DEFAULT_GROUP - ) -> None: - """Remove a handler from the specified group. - - Hint: - This method currently has no influence on calls to :meth:`process_update` that are - already in progress. - - .. warning:: - This behavior should currently be considered an implementation detail and not as - guaranteed behavior. - - Args: - handler (:class:`telegram.ext.BaseHandler`): A :class:`telegram.ext.BaseHandler` - instance. - group (:obj:`object`, optional): The group identifier. Default is ``0``. - - """ - if handler in self.handlers[group]: - self.handlers[group].remove(handler) - if not self.handlers[group]: - del self.handlers[group] - - def drop_chat_data(self, chat_id: int) -> None: - """Drops the corresponding entry from the :attr:`chat_data`. Will also be deleted from - the persistence on the next run of :meth:`update_persistence`, if applicable. - - Warning: - When using :attr:`concurrent_updates` or the :attr:`job_queue`, - :meth:`process_update` or :meth:`telegram.ext.Job.run` may re-create this entry due to - the asynchronous nature of these features. Please make sure that your program can - avoid or handle such situations. - - .. versionadded:: 20.0 - - Args: - chat_id (:obj:`int`): The chat id to delete. The entry will be deleted even if it is - not empty. - """ - self._chat_data.pop(chat_id, None) - self._chat_ids_to_be_deleted_in_persistence.add(chat_id) - - def drop_user_data(self, user_id: int) -> None: - """Drops the corresponding entry from the :attr:`user_data`. Will also be deleted from - the persistence on the next run of :meth:`update_persistence`, if applicable. - - Warning: - When using :attr:`concurrent_updates` or the :attr:`job_queue`, - :meth:`process_update` or :meth:`telegram.ext.Job.run` may re-create this entry due to - the asynchronous nature of these features. Please make sure that your program can - avoid or handle such situations. - - .. versionadded:: 20.0 - - Args: - user_id (:obj:`int`): The user id to delete. The entry will be deleted even if it is - not empty. - """ - self._user_data.pop(user_id, None) - self._user_ids_to_be_deleted_in_persistence.add(user_id) - - def migrate_chat_data( - self, - message: Optional["Message"] = None, - old_chat_id: Optional[int] = None, - new_chat_id: Optional[int] = None, - ) -> None: - """Moves the contents of :attr:`chat_data` at key :paramref:`old_chat_id` to the key - :paramref:`new_chat_id`. Also marks the entries to be updated accordingly in the next run - of :meth:`update_persistence`. - - Warning: - * Any data stored in :attr:`chat_data` at key :paramref:`new_chat_id` will be - overridden - * The key :paramref:`old_chat_id` of :attr:`chat_data` will be deleted - * This does not update the :attr:`~telegram.ext.Job.chat_id` attribute of any scheduled - :class:`telegram.ext.Job`. - - When using :attr:`concurrent_updates` or the :attr:`job_queue`, - :meth:`process_update` or :meth:`telegram.ext.Job.run` may re-create the old entry due - to the asynchronous nature of these features. Please make sure that your program can - avoid or handle such situations. - - .. seealso:: :wiki:`Storing Bot, User and Chat Related Data\ - <Storing-bot%2C-user-and-chat-related-data>` - - Args: - message (:class:`telegram.Message`, optional): A message with either - :attr:`~telegram.Message.migrate_from_chat_id` or - :attr:`~telegram.Message.migrate_to_chat_id`. - Mutually exclusive with passing :paramref:`old_chat_id` and - :paramref:`new_chat_id`. - - .. seealso:: - :attr:`telegram.ext.filters.StatusUpdate.MIGRATE` - - old_chat_id (:obj:`int`, optional): The old chat ID. - Mutually exclusive with passing :paramref:`message` - new_chat_id (:obj:`int`, optional): The new chat ID. - Mutually exclusive with passing :paramref:`message` - - Raises: - ValueError: Raised if the input is invalid. - """ - if message and (old_chat_id or new_chat_id): - raise ValueError("Message and chat_id pair are mutually exclusive") - if not any((message, old_chat_id, new_chat_id)): - raise ValueError("chat_id pair or message must be passed") - - if message: - if message.migrate_from_chat_id is None and message.migrate_to_chat_id is None: - raise ValueError( - "Invalid message instance. The message must have either " - "`Message.migrate_from_chat_id` or `Message.migrate_to_chat_id`." - ) - - old_chat_id = message.migrate_from_chat_id or message.chat.id - new_chat_id = message.migrate_to_chat_id or message.chat.id - - elif not (isinstance(old_chat_id, int) and isinstance(new_chat_id, int)): - raise ValueError("old_chat_id and new_chat_id must be integers") - - self._chat_data[new_chat_id] = self._chat_data[old_chat_id] - self.drop_chat_data(old_chat_id) - - self._chat_ids_to_be_updated_in_persistence.add(new_chat_id) - # old_chat_id is marked for deletion by drop_chat_data above - - def _mark_for_persistence_update( - self, *, update: Optional[object] = None, job: Optional["Job"] = None - ) -> None: - if isinstance(update, Update): - if update.effective_chat: - self._chat_ids_to_be_updated_in_persistence.add(update.effective_chat.id) - if update.effective_user: - self._user_ids_to_be_updated_in_persistence.add(update.effective_user.id) - - if job: - if job.chat_id: - self._chat_ids_to_be_updated_in_persistence.add(job.chat_id) - if job.user_id: - self._user_ids_to_be_updated_in_persistence.add(job.user_id) - - def mark_data_for_update_persistence( - self, chat_ids: Optional[SCT[int]] = None, user_ids: Optional[SCT[int]] = None - ) -> None: - """Mark entries of :attr:`chat_data` and :attr:`user_data` to be updated on the next - run of :meth:`update_persistence`. - - Tip: - Use this method sparingly. If you have to use this method, it likely means that you - access and modify ``context.application.chat/user_data[some_id]`` within a callback. - Note that for data which should be available globally in all handler callbacks - independent of the chat/user, it is recommended to use :attr:`bot_data` instead. - - .. versionadded:: 20.3 - - Args: - chat_ids (:obj:`int` | Collection[:obj:`int`], optional): Chat IDs to mark. - user_ids (:obj:`int` | Collection[:obj:`int`], optional): User IDs to mark. - - """ - if chat_ids: - if isinstance(chat_ids, int): - self._chat_ids_to_be_updated_in_persistence.add(chat_ids) - else: - self._chat_ids_to_be_updated_in_persistence.update(chat_ids) - if user_ids: - if isinstance(user_ids, int): - self._user_ids_to_be_updated_in_persistence.add(user_ids) - else: - self._user_ids_to_be_updated_in_persistence.update(user_ids) - - async def _persistence_updater(self) -> None: - # Update the persistence in regular intervals. Exit only when the stop event has been set - while not self.__update_persistence_event.is_set(): - if not self.persistence: - return - - # asyncio synchronization primitives don't accept a timeout argument, it is recommended - # to use wait_for instead - try: - await asyncio.wait_for( - self.__update_persistence_event.wait(), - timeout=self.persistence.update_interval, - ) - except asyncio.TimeoutError: - pass - else: - return - - # putting this *after* the wait_for so we don't immediately update on startup as - # that would make little sense - await self.update_persistence() - - async def update_persistence(self) -> None: - """Updates :attr:`user_data`, :attr:`chat_data`, :attr:`bot_data` in :attr:`persistence` - along with :attr:`~telegram.ext.ExtBot.callback_data_cache` and the conversation states of - any persistent :class:`~telegram.ext.ConversationHandler` registered for this application. - - For :attr:`user_data` and :attr:`chat_data`, only those entries are updated which either - were used or have been manually marked via :meth:`mark_data_for_update_persistence` since - the last run of this method. - - Tip: - This method will be called in regular intervals by the application. There is usually - no need to call it manually. - - Note: - Any data is deep copied with :func:`copy.deepcopy` before handing it over to the - persistence in order to avoid race conditions, so all persisted data must be copyable. - - .. seealso:: :attr:`telegram.ext.BasePersistence.update_interval`, - :meth:`mark_data_for_update_persistence` - """ - async with self.__update_persistence_lock: - await self.__update_persistence() - - async def __update_persistence(self) -> None: - if not self.persistence: - return - - _LOGGER.debug("Starting next run of updating the persistence.") - - coroutines: set[Coroutine] = set() - - # Mypy doesn't know that persistence.set_bot (see above) already checks that - # self.bot is an instance of ExtBot if callback_data should be stored ... - if self.persistence.store_data.callback_data and ( - self.bot.callback_data_cache is not None # type: ignore[attr-defined] - ): - coroutines.add( - self.persistence.update_callback_data( - deepcopy( - self.bot.callback_data_cache.persistence_data # type: ignore[attr-defined] - ) - ) - ) - - if self.persistence.store_data.bot_data: - coroutines.add(self.persistence.update_bot_data(deepcopy(self.bot_data))) - - if self.persistence.store_data.chat_data: - update_ids = self._chat_ids_to_be_updated_in_persistence - self._chat_ids_to_be_updated_in_persistence = set() - delete_ids = self._chat_ids_to_be_deleted_in_persistence - self._chat_ids_to_be_deleted_in_persistence = set() - - # We don't want to update any data that has been deleted! - update_ids -= delete_ids - - for chat_id in update_ids: - coroutines.add( - self.persistence.update_chat_data(chat_id, deepcopy(self.chat_data[chat_id])) - ) - for chat_id in delete_ids: - coroutines.add(self.persistence.drop_chat_data(chat_id)) - - if self.persistence.store_data.user_data: - update_ids = self._user_ids_to_be_updated_in_persistence - self._user_ids_to_be_updated_in_persistence = set() - delete_ids = self._user_ids_to_be_deleted_in_persistence - self._user_ids_to_be_deleted_in_persistence = set() - - # We don't want to update any data that has been deleted! - update_ids -= delete_ids - - for user_id in update_ids: - coroutines.add( - self.persistence.update_user_data(user_id, deepcopy(self.user_data[user_id])) - ) - for user_id in delete_ids: - coroutines.add(self.persistence.drop_user_data(user_id)) - - # Unfortunately due to circular imports this has to be here - # pylint: disable=import-outside-toplevel - from telegram.ext._handlers.conversationhandler import PendingState - - for name, (key, new_state) in itertools.chain.from_iterable( - zip(itertools.repeat(name), states_dict.pop_accessed_write_items()) - for name, states_dict in self._conversation_handler_conversations.items() - ): - if isinstance(new_state, PendingState): - # If the handler was running non-blocking, we check if the new state is already - # available. Otherwise, we update with the old state, which is the next best - # guess. - # Note that when updating the persistence one last time during self.stop(), - # *all* tasks will be done. - if not new_state.done(): - if self.running: - _LOGGER.debug( - "A ConversationHandlers state was not yet resolved. Updating the " - "persistence with the current state. Will check again on next run of " - "Application.update_persistence." - ) - else: - _LOGGER.warning( - "A ConversationHandlers state was not yet resolved. Updating the " - "persistence with the current state." - ) - result = new_state.old_state - # We need to check again on the next run if the state is done - self._conversation_handler_conversations[name].mark_as_accessed(key) - else: - result = new_state.resolve() - else: - result = new_state - - effective_new_state = None if result is TrackingDict.DELETED else result - coroutines.add( - self.persistence.update_conversation( - name=name, key=key, new_state=effective_new_state - ) - ) - - results = await asyncio.gather(*coroutines, return_exceptions=True) - _LOGGER.debug("Finished updating persistence.") - - # dispatch any errors - await asyncio.gather( - *( - self.process_error(error=result, update=None) - for result in results - if isinstance(result, Exception) - ) - ) - - def add_error_handler( - self, - callback: HandlerCallback[object, CCT, None], - block: DVType[bool] = DEFAULT_TRUE, - ) -> None: - """Registers an error handler in the Application. This handler will receive every error - which happens in your bot. See the docs of :meth:`process_error` for more details on how - errors are handled. - - Note: - Attempts to add the same callback multiple times will be ignored. - - Examples: - :any:`Errorhandler Bot <examples.errorhandlerbot>` - - Hint: - This method currently has no influence on calls to :meth:`process_error` that are - already in progress. - - .. warning:: - This behavior should currently be considered an implementation detail and not as - guaranteed behavior. - - .. seealso:: :wiki:`Exceptions, Warnings and Logging <Exceptions%2C-Warnings-and-Logging>` - - Args: - callback (:term:`coroutine function`): The callback function for this error handler. - Will be called when an error is raised. Callback signature:: - - async def callback(update: Optional[object], context: CallbackContext) - - The error that happened will be present in - :attr:`telegram.ext.CallbackContext.error`. - block (:obj:`bool`, optional): Determines whether the return value of the callback - should be awaited before processing the next error handler in - :meth:`process_error`. Defaults to :obj:`True`. - """ - if callback in self.error_handlers: - _LOGGER.warning("The callback is already registered as an error handler. Ignoring.") - return - - self.error_handlers[callback] = block - - def remove_error_handler(self, callback: HandlerCallback[object, CCT, None]) -> None: - """Removes an error handler. - - Hint: - This method currently has no influence on calls to :meth:`process_error` that are - already in progress. - - .. warning:: - This behavior should currently be considered an implementation detail and not as - guaranteed behavior. - - Args: - callback (:term:`coroutine function`): The error handler to remove. - - """ - self.error_handlers.pop(callback, None) - - async def process_error( - self, - update: Optional[object], - error: Exception, - job: Optional["Job[CCT]"] = None, - coroutine: Optional[_ErrorCoroType[RT]] = None, - ) -> bool: - """Processes an error by passing it to all error handlers registered with - :meth:`add_error_handler`. If one of the error handlers raises - :class:`telegram.ext.ApplicationHandlerStop`, the error will not be handled by other error - handlers. Raising :class:`telegram.ext.ApplicationHandlerStop` also stops processing of - the update when this method is called by :meth:`process_update`, i.e. no further handlers - (even in other groups) will handle the update. All other exceptions raised by an error - handler will just be logged. - - .. versionchanged:: 20.0 - - * ``dispatch_error`` was renamed to :meth:`process_error`. - * Exceptions raised by error handlers are now properly logged. - * :class:`telegram.ext.ApplicationHandlerStop` is no longer reraised but converted into - the return value. - - Args: - update (:obj:`object` | :class:`telegram.Update`): The update that caused the error. - error (:obj:`Exception`): The error that was raised. - job (:class:`telegram.ext.Job`, optional): The job that caused the error. - - .. versionadded:: 20.0 - coroutine (:term:`coroutine function`, optional): The coroutine that caused the error. - - Returns: - :obj:`bool`: :obj:`True`, if one of the error handlers raised - :class:`telegram.ext.ApplicationHandlerStop`. :obj:`False`, otherwise. - """ - if self.error_handlers: - # We copy the list to avoid issues with concurrent modification of the - # error handlers while iterating over it via add/remove_error_handler. - # Currently considered implementation detail as described in docstrings of - # add/remove_error_handler - error_handler_items = list(self.error_handlers.items()) - for callback, block in error_handler_items: - try: - context = self.context_types.context.from_error( - update=update, - error=error, - application=self, - job=job, - coroutine=coroutine, - ) - except Exception as exc: - _LOGGER.critical( - ( - "Error while building CallbackContext for exception %s. " - "Exception will not be processed by error handlers." - ), - error, - exc_info=exc, - ) - return False - - if not block or ( # If error handler has `block=False`, create a Task to run cb - block is DEFAULT_TRUE - and isinstance(self.bot, ExtBot) - and self.bot.defaults - and not self.bot.defaults.block - ): - self.__create_task( - callback(update, context), - update=update, - is_error_handler=True, - name=f"Application:{self.bot.id}:process_error:non_blocking", - ) - else: - try: - await callback(update, context) - except ApplicationHandlerStop: - return True - except Exception as exc: - _LOGGER.exception( - "An error was raised and an uncaught error was raised while " - "handling the error with an error_handler.", - exc_info=exc, - ) - return False - - _LOGGER.exception("No error handlers are registered, logging exception.", exc_info=error) - return False diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_applicationbuilder.py b/venv/lib/python3.12/site-packages/telegram/ext/_applicationbuilder.py deleted file mode 100644 index 0b25858..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_applicationbuilder.py +++ /dev/null @@ -1,1363 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the Builder classes for the telegram.ext module.""" -from asyncio import Queue -from collections.abc import Collection, Coroutine -from pathlib import Path -from typing import TYPE_CHECKING, Any, Callable, Generic, Optional, TypeVar, Union - -import httpx - -from telegram._bot import Bot -from telegram._utils.defaultvalue import DEFAULT_FALSE, DEFAULT_NONE, DefaultValue -from telegram._utils.types import ( - BaseUrl, - DVInput, - DVType, - FilePathInput, - HTTPVersion, - ODVInput, - SocketOpt, -) -from telegram.ext._application import Application -from telegram.ext._baseupdateprocessor import BaseUpdateProcessor, SimpleUpdateProcessor -from telegram.ext._contexttypes import ContextTypes -from telegram.ext._extbot import ExtBot -from telegram.ext._jobqueue import JobQueue -from telegram.ext._updater import Updater -from telegram.ext._utils.types import BD, BT, CCT, CD, JQ, UD -from telegram.request import BaseRequest -from telegram.request._httpxrequest import HTTPXRequest - -if TYPE_CHECKING: - from telegram import Update - from telegram.ext import BasePersistence, BaseRateLimiter, CallbackContext, Defaults - from telegram.ext._utils.types import RLARGS - -# Type hinting is a bit complicated here because we try to get to a sane level of -# leveraging generics and therefore need a number of type variables. -# 'In' stands for input - used in parameters of methods below -# pylint: disable=invalid-name -InBT = TypeVar("InBT", bound=Bot) -InJQ = TypeVar("InJQ", bound=Union[None, JobQueue]) -InCCT = TypeVar("InCCT", bound="CallbackContext") -InUD = TypeVar("InUD") -InCD = TypeVar("InCD") -InBD = TypeVar("InBD") -BuilderType = TypeVar("BuilderType", bound="ApplicationBuilder") - - -_BOT_CHECKS = [ - ("request", "request instance"), - ("get_updates_request", "get_updates_request instance"), - ("connection_pool_size", "connection_pool_size"), - ("proxy", "proxy"), - ("socket_options", "socket_options"), - ("pool_timeout", "pool_timeout"), - ("connect_timeout", "connect_timeout"), - ("read_timeout", "read_timeout"), - ("write_timeout", "write_timeout"), - ("media_write_timeout", "media_write_timeout"), - ("http_version", "http_version"), - ("get_updates_connection_pool_size", "get_updates_connection_pool_size"), - ("get_updates_proxy", "get_updates_proxy"), - ("get_updates_socket_options", "get_updates_socket_options"), - ("get_updates_pool_timeout", "get_updates_pool_timeout"), - ("get_updates_connect_timeout", "get_updates_connect_timeout"), - ("get_updates_read_timeout", "get_updates_read_timeout"), - ("get_updates_write_timeout", "get_updates_write_timeout"), - ("get_updates_http_version", "get_updates_http_version"), - ("base_file_url", "base_file_url"), - ("base_url", "base_url"), - ("token", "token"), - ("defaults", "defaults"), - ("arbitrary_callback_data", "arbitrary_callback_data"), - ("private_key", "private_key"), - ("rate_limiter", "rate_limiter instance"), - ("local_mode", "local_mode setting"), -] - -_TWO_ARGS_REQ = "The parameter `{}` may only be set, if no {} was set." - - -class ApplicationBuilder(Generic[BT, CCT, UD, CD, BD, JQ]): - """This class serves as initializer for :class:`telegram.ext.Application` via the so called - `builder pattern`_. To build a :class:`telegram.ext.Application`, one first initializes an - instance of this class. Arguments for the :class:`telegram.ext.Application` to build are then - added by subsequently calling the methods of the builder. Finally, the - :class:`telegram.ext.Application` is built by calling :meth:`build`. In the simplest case this - can look like the following example. - - Example: - .. code:: python - - application = ApplicationBuilder().token("TOKEN").build() - - Please see the description of the individual methods for information on which arguments can be - set and what the defaults are when not called. When no default is mentioned, the argument will - not be used by default. - - Note: - * Some arguments are mutually exclusive. E.g. after calling :meth:`token`, you can't set - a custom bot with :meth:`bot` and vice versa. - * Unless a custom :class:`telegram.Bot` instance is set via :meth:`bot`, :meth:`build` will - use :class:`telegram.ext.ExtBot` for the bot. - - .. seealso:: :wiki:`Your First Bot <Extensions---Your-first-Bot>`, - :wiki:`Builder Pattern <Builder-Pattern>` - - .. versionchanged:: 22.0 - Removed deprecated methods ``proxy_url`` and ``get_updates_proxy_url``. - - .. _`builder pattern`: https://en.wikipedia.org/wiki/Builder_pattern - """ - - __slots__ = ( - "_application_class", - "_application_kwargs", - "_arbitrary_callback_data", - "_base_file_url", - "_base_url", - "_bot", - "_connect_timeout", - "_connection_pool_size", - "_context_types", - "_defaults", - "_get_updates_connect_timeout", - "_get_updates_connection_pool_size", - "_get_updates_http_version", - "_get_updates_pool_timeout", - "_get_updates_proxy", - "_get_updates_read_timeout", - "_get_updates_request", - "_get_updates_socket_options", - "_get_updates_write_timeout", - "_http_version", - "_job_queue", - "_local_mode", - "_media_write_timeout", - "_persistence", - "_pool_timeout", - "_post_init", - "_post_shutdown", - "_post_stop", - "_private_key", - "_private_key_password", - "_proxy", - "_rate_limiter", - "_read_timeout", - "_request", - "_socket_options", - "_token", - "_update_processor", - "_update_queue", - "_updater", - "_write_timeout", - ) - - def __init__(self: "InitApplicationBuilder"): - self._token: DVType[str] = DefaultValue("") - self._base_url: DVType[BaseUrl] = DefaultValue("https://api.telegram.org/bot") - self._base_file_url: DVType[BaseUrl] = DefaultValue("https://api.telegram.org/file/bot") - self._connection_pool_size: DVInput[int] = DEFAULT_NONE - self._proxy: DVInput[Union[str, httpx.Proxy, httpx.URL]] = DEFAULT_NONE - self._socket_options: DVInput[Collection[SocketOpt]] = DEFAULT_NONE - self._connect_timeout: ODVInput[float] = DEFAULT_NONE - self._read_timeout: ODVInput[float] = DEFAULT_NONE - self._write_timeout: ODVInput[float] = DEFAULT_NONE - self._media_write_timeout: ODVInput[float] = DEFAULT_NONE - self._pool_timeout: ODVInput[float] = DEFAULT_NONE - self._request: DVInput[BaseRequest] = DEFAULT_NONE - self._get_updates_connection_pool_size: DVInput[int] = DEFAULT_NONE - self._get_updates_proxy: DVInput[Union[str, httpx.Proxy, httpx.URL]] = DEFAULT_NONE - self._get_updates_socket_options: DVInput[Collection[SocketOpt]] = DEFAULT_NONE - self._get_updates_connect_timeout: ODVInput[float] = DEFAULT_NONE - self._get_updates_read_timeout: ODVInput[float] = DEFAULT_NONE - self._get_updates_write_timeout: ODVInput[float] = DEFAULT_NONE - self._get_updates_pool_timeout: ODVInput[float] = DEFAULT_NONE - self._get_updates_request: DVInput[BaseRequest] = DEFAULT_NONE - self._get_updates_http_version: DVInput[str] = DefaultValue("1.1") - self._private_key: ODVInput[bytes] = DEFAULT_NONE - self._private_key_password: ODVInput[bytes] = DEFAULT_NONE - self._defaults: ODVInput[Defaults] = DEFAULT_NONE - self._arbitrary_callback_data: Union[DefaultValue[bool], int] = DEFAULT_FALSE - self._local_mode: DVType[bool] = DEFAULT_FALSE - self._bot: DVInput[Bot] = DEFAULT_NONE - self._update_queue: DVType[Queue[Union[Update, object]]] = DefaultValue(Queue()) - - try: - self._job_queue: ODVInput[JobQueue] = DefaultValue(JobQueue()) - except RuntimeError as exc: - if "PTB must be installed via" not in str(exc): - raise - self._job_queue = DEFAULT_NONE - - self._persistence: ODVInput[BasePersistence] = DEFAULT_NONE - self._context_types: DVType[ContextTypes] = DefaultValue(ContextTypes()) - self._application_class: DVType[type[Application]] = DefaultValue(Application) - self._application_kwargs: dict[str, object] = {} - self._update_processor: BaseUpdateProcessor = SimpleUpdateProcessor( - max_concurrent_updates=1 - ) - self._updater: ODVInput[Updater] = DEFAULT_NONE - self._post_init: Optional[Callable[[Application], Coroutine[Any, Any, None]]] = None - self._post_shutdown: Optional[Callable[[Application], Coroutine[Any, Any, None]]] = None - self._post_stop: Optional[Callable[[Application], Coroutine[Any, Any, None]]] = None - self._rate_limiter: ODVInput[BaseRateLimiter] = DEFAULT_NONE - self._http_version: DVInput[str] = DefaultValue("1.1") - - def _build_request(self, get_updates: bool) -> BaseRequest: - prefix = "_get_updates_" if get_updates else "_" - if not isinstance(getattr(self, f"{prefix}request"), DefaultValue): - return getattr(self, f"{prefix}request") - - proxy = DefaultValue.get_value(getattr(self, f"{prefix}proxy")) - socket_options = DefaultValue.get_value(getattr(self, f"{prefix}socket_options")) - if get_updates: - connection_pool_size = ( - DefaultValue.get_value(getattr(self, f"{prefix}connection_pool_size")) or 1 - ) - else: - connection_pool_size = ( - DefaultValue.get_value(getattr(self, f"{prefix}connection_pool_size")) or 256 - ) - - timeouts = { - "connect_timeout": getattr(self, f"{prefix}connect_timeout"), - "read_timeout": getattr(self, f"{prefix}read_timeout"), - "write_timeout": getattr(self, f"{prefix}write_timeout"), - "pool_timeout": getattr(self, f"{prefix}pool_timeout"), - } - - if not get_updates: - timeouts["media_write_timeout"] = self._media_write_timeout - - # Get timeouts that were actually set- - effective_timeouts = { - key: value for key, value in timeouts.items() if not isinstance(value, DefaultValue) - } - - http_version = DefaultValue.get_value(getattr(self, f"{prefix}http_version")) or "1.1" - - return HTTPXRequest( - connection_pool_size=connection_pool_size, - proxy=proxy, - http_version=http_version, # type: ignore[arg-type] - socket_options=socket_options, - **effective_timeouts, - ) - - def _build_ext_bot(self) -> ExtBot: - if isinstance(self._token, DefaultValue): - raise RuntimeError("No bot token was set.") - - return ExtBot( - token=self._token, - base_url=DefaultValue.get_value(self._base_url), - base_file_url=DefaultValue.get_value(self._base_file_url), - private_key=DefaultValue.get_value(self._private_key), - private_key_password=DefaultValue.get_value(self._private_key_password), - defaults=DefaultValue.get_value(self._defaults), - arbitrary_callback_data=DefaultValue.get_value(self._arbitrary_callback_data), - request=self._build_request(get_updates=False), - get_updates_request=self._build_request(get_updates=True), - rate_limiter=DefaultValue.get_value(self._rate_limiter), - local_mode=DefaultValue.get_value(self._local_mode), - ) - - def _bot_check(self, name: str) -> None: - if self._bot is not DEFAULT_NONE: - raise RuntimeError(_TWO_ARGS_REQ.format(name, "bot instance")) - - def _updater_check(self, name: str) -> None: - if self._updater not in (DEFAULT_NONE, None): - raise RuntimeError(_TWO_ARGS_REQ.format(name, "updater")) - - def build( - self: "ApplicationBuilder[BT, CCT, UD, CD, BD, JQ]", - ) -> Application[BT, CCT, UD, CD, BD, JQ]: - """Builds a :class:`telegram.ext.Application` with the provided arguments. - - Calls :meth:`telegram.ext.JobQueue.set_application` and - :meth:`telegram.ext.BasePersistence.set_bot` if appropriate. - - Returns: - :class:`telegram.ext.Application` - """ - job_queue = DefaultValue.get_value(self._job_queue) - persistence = DefaultValue.get_value(self._persistence) - # If user didn't set updater - if isinstance(self._updater, DefaultValue) or self._updater is None: - if isinstance(self._bot, DefaultValue): # and didn't set a bot - bot: Bot = self._build_ext_bot() # build a bot - else: - bot = self._bot - # now also build an updater/update_queue for them - update_queue = DefaultValue.get_value(self._update_queue) - - if self._updater is None: - updater = None - else: - updater = Updater(bot=bot, update_queue=update_queue) - else: # if they set an updater, get all necessary attributes for Application from Updater: - updater = self._updater - bot = self._updater.bot - update_queue = self._updater.update_queue - - application: Application[BT, CCT, UD, CD, BD, JQ] = DefaultValue.get_value( - self._application_class - )( - bot=bot, - update_queue=update_queue, - updater=updater, - update_processor=self._update_processor, - job_queue=job_queue, - persistence=persistence, - context_types=DefaultValue.get_value(self._context_types), - post_init=self._post_init, - post_shutdown=self._post_shutdown, - post_stop=self._post_stop, - **self._application_kwargs, # For custom Application subclasses - ) - - if job_queue is not None: - job_queue.set_application(application) # type: ignore[arg-type] - - if persistence is not None: - # This raises an exception if persistence.store_data.callback_data is True - # but self.bot is not an instance of ExtBot - so no need to check that later on - persistence.set_bot(bot) - - return application - - def application_class( - self: BuilderType, - application_class: type[Application[Any, Any, Any, Any, Any, Any]], - kwargs: Optional[dict[str, object]] = None, - ) -> BuilderType: - """Sets a custom subclass instead of :class:`telegram.ext.Application`. The - subclass's ``__init__`` should look like this - - .. code:: python - - def __init__(self, custom_arg_1, custom_arg_2, ..., **kwargs): - super().__init__(**kwargs) - self.custom_arg_1 = custom_arg_1 - self.custom_arg_2 = custom_arg_2 - - Args: - application_class (:obj:`type`): A subclass of :class:`telegram.ext.Application` - kwargs (dict[:obj:`str`, :obj:`object`], optional): Keyword arguments for the - initialization. Defaults to an empty dict. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._application_class = application_class - self._application_kwargs = kwargs or {} - return self - - def token(self: BuilderType, token: str) -> BuilderType: - """Sets the token for :attr:`telegram.ext.Application.bot`. - - Args: - token (:obj:`str`): The token. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._bot_check("token") - self._updater_check("token") - self._token = token - return self - - def base_url(self: BuilderType, base_url: BaseUrl) -> BuilderType: - """Sets the base URL for :attr:`telegram.ext.Application.bot`. If not called, - will default to ``'https://api.telegram.org/bot'``. - - .. seealso:: :paramref:`telegram.Bot.base_url`, - :wiki:`Local Bot API Server <Local-Bot-API-Server>`, :meth:`base_file_url` - - .. versionchanged:: 21.11 - Supports callable input and string formatting. - - Args: - base_url (:obj:`str` | Callable[[:obj:`str`], :obj:`str`]): The URL or - input for the URL as accepted by :paramref:`telegram.Bot.base_url`. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._bot_check("base_url") - self._updater_check("base_url") - self._base_url = base_url - return self - - def base_file_url(self: BuilderType, base_file_url: BaseUrl) -> BuilderType: - """Sets the base file URL for :attr:`telegram.ext.Application.bot`. If not - called, will default to ``'https://api.telegram.org/file/bot'``. - - .. seealso:: :paramref:`telegram.Bot.base_file_url`, - :wiki:`Local Bot API Server <Local-Bot-API-Server>`, :meth:`base_url` - - .. versionchanged:: 21.11 - Supports callable input and string formatting. - - Args: - base_file_url (:obj:`str` | Callable[[:obj:`str`], :obj:`str`]): The URL or - input for the URL as accepted by :paramref:`telegram.Bot.base_file_url`. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._bot_check("base_file_url") - self._updater_check("base_file_url") - self._base_file_url = base_file_url - return self - - def _request_check(self, get_updates: bool) -> None: - prefix = "get_updates_" if get_updates else "" - name = prefix + "request" - - timeouts = ["connect_timeout", "read_timeout", "write_timeout", "pool_timeout"] - if not get_updates: - timeouts.append("media_write_timeout") - - # Code below tests if it's okay to set a Request object. Only okay if no other request args - # or instances containing a Request were set previously - for attr in timeouts: - if not isinstance(getattr(self, f"_{prefix}{attr}"), DefaultValue): - raise RuntimeError(_TWO_ARGS_REQ.format(name, attr)) - - if not isinstance(getattr(self, f"_{prefix}connection_pool_size"), DefaultValue): - raise RuntimeError(_TWO_ARGS_REQ.format(name, "connection_pool_size")) - - if not isinstance(getattr(self, f"_{prefix}proxy"), DefaultValue): - raise RuntimeError(_TWO_ARGS_REQ.format(name, "proxy")) - - if not isinstance(getattr(self, f"_{prefix}socket_options"), DefaultValue): - raise RuntimeError(_TWO_ARGS_REQ.format(name, "socket_options")) - - if not isinstance(getattr(self, f"_{prefix}http_version"), DefaultValue): - raise RuntimeError(_TWO_ARGS_REQ.format(name, "http_version")) - - self._bot_check(name) - - if self._updater not in (DEFAULT_NONE, None): - raise RuntimeError(_TWO_ARGS_REQ.format(name, "updater instance")) - - def _request_param_check(self, name: str, get_updates: bool) -> None: - if get_updates and self._get_updates_request is not DEFAULT_NONE: - raise RuntimeError( # disallow request args for get_updates if Request for that is set - _TWO_ARGS_REQ.format(f"get_updates_{name}", "get_updates_request instance") - ) - if self._request is not DEFAULT_NONE: # disallow request args if request is set - raise RuntimeError(_TWO_ARGS_REQ.format(name, "request instance")) - - if self._bot is not DEFAULT_NONE: # disallow request args if bot is set (has Request) - raise RuntimeError( - _TWO_ARGS_REQ.format( - f"get_updates_{name}" if get_updates else name, "bot instance" - ) - ) - - if self._updater not in (DEFAULT_NONE, None): # disallow request args for updater(has bot) - raise RuntimeError( - _TWO_ARGS_REQ.format(f"get_updates_{name}" if get_updates else name, "updater") - ) - - def request(self: BuilderType, request: BaseRequest) -> BuilderType: - """Sets a :class:`telegram.request.BaseRequest` instance for the - :paramref:`telegram.Bot.request` parameter of :attr:`telegram.ext.Application.bot`. - - .. seealso:: :meth:`get_updates_request` - - Args: - request (:class:`telegram.request.BaseRequest`): The request instance. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._request_check(get_updates=False) - self._request = request - return self - - def connection_pool_size(self: BuilderType, connection_pool_size: int) -> BuilderType: - """Sets the size of the connection pool for the - :paramref:`~telegram.request.HTTPXRequest.connection_pool_size` parameter of - :attr:`telegram.Bot.request`. Defaults to ``256``. - - .. include:: inclusions/pool_size_tip.rst - - .. seealso:: :meth:`get_updates_connection_pool_size` - - Args: - connection_pool_size (:obj:`int`): The size of the connection pool. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._request_param_check(name="connection_pool_size", get_updates=False) - self._connection_pool_size = connection_pool_size - return self - - def proxy(self: BuilderType, proxy: Union[str, httpx.Proxy, httpx.URL]) -> BuilderType: - """Sets the proxy for the :paramref:`~telegram.request.HTTPXRequest.proxy` - parameter of :attr:`telegram.Bot.request`. Defaults to :obj:`None`. - - .. seealso:: :meth:`get_updates_proxy` - - .. versionadded:: 20.7 - - Args: - proxy (:obj:`str` | ``httpx.Proxy`` | ``httpx.URL``): The URL to a proxy - server, a ``httpx.Proxy`` object or a ``httpx.URL`` object. See - :paramref:`telegram.request.HTTPXRequest.proxy` for more information. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._request_param_check(name="proxy", get_updates=False) - self._proxy = proxy - return self - - def socket_options(self: BuilderType, socket_options: Collection[SocketOpt]) -> BuilderType: - """Sets the options for the :paramref:`~telegram.request.HTTPXRequest.socket_options` - parameter of :attr:`telegram.Bot.request`. Defaults to :obj:`None`. - - .. seealso:: :meth:`get_updates_socket_options` - - .. versionadded:: 20.7 - - Args: - socket_options (Collection[:obj:`tuple`], optional): Socket options. See - :paramref:`telegram.request.HTTPXRequest.socket_options` for more information. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._request_param_check(name="socket_options", get_updates=False) - self._socket_options = socket_options - return self - - def connect_timeout(self: BuilderType, connect_timeout: Optional[float]) -> BuilderType: - """Sets the connection attempt timeout for the - :paramref:`~telegram.request.HTTPXRequest.connect_timeout` parameter of - :attr:`telegram.Bot.request`. Defaults to ``5.0``. - - .. seealso:: :meth:`get_updates_connect_timeout` - - Args: - connect_timeout (:obj:`float`): See - :paramref:`telegram.request.HTTPXRequest.connect_timeout` for more information. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._request_param_check(name="connect_timeout", get_updates=False) - self._connect_timeout = connect_timeout - return self - - def read_timeout(self: BuilderType, read_timeout: Optional[float]) -> BuilderType: - """Sets the waiting timeout for the - :paramref:`~telegram.request.HTTPXRequest.read_timeout` parameter of - :attr:`telegram.Bot.request`. Defaults to ``5.0``. - - .. seealso:: :meth:`get_updates_read_timeout` - - Args: - read_timeout (:obj:`float`): See - :paramref:`telegram.request.HTTPXRequest.read_timeout` for more information. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._request_param_check(name="read_timeout", get_updates=False) - self._read_timeout = read_timeout - return self - - def write_timeout(self: BuilderType, write_timeout: Optional[float]) -> BuilderType: - """Sets the write operation timeout for the - :paramref:`~telegram.request.HTTPXRequest.write_timeout` parameter of - :attr:`telegram.Bot.request`. Defaults to ``5.0``. - - .. seealso:: :meth:`get_updates_write_timeout` - - Args: - write_timeout (:obj:`float`): See - :paramref:`telegram.request.HTTPXRequest.write_timeout` for more information. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._request_param_check(name="write_timeout", get_updates=False) - self._write_timeout = write_timeout - return self - - def media_write_timeout( - self: BuilderType, media_write_timeout: Optional[float] - ) -> BuilderType: - """Sets the media write operation timeout for the - :paramref:`~telegram.request.HTTPXRequest.media_write_timeout` parameter of - :attr:`telegram.Bot.request`. Defaults to ``20``. - - .. versionadded:: 21.0 - - Args: - media_write_timeout (:obj:`float`): See - :paramref:`telegram.request.HTTPXRequest.media_write_timeout` for more information. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._request_param_check(name="media_write_timeout", get_updates=False) - self._media_write_timeout = media_write_timeout - return self - - def pool_timeout(self: BuilderType, pool_timeout: Optional[float]) -> BuilderType: - """Sets the connection pool's connection freeing timeout for the - :paramref:`~telegram.request.HTTPXRequest.pool_timeout` parameter of - :attr:`telegram.Bot.request`. Defaults to ``1.0``. - - .. include:: inclusions/pool_size_tip.rst - - .. seealso:: :meth:`get_updates_pool_timeout` - - Args: - pool_timeout (:obj:`float`): See - :paramref:`telegram.request.HTTPXRequest.pool_timeout` for more information. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._request_param_check(name="pool_timeout", get_updates=False) - self._pool_timeout = pool_timeout - return self - - def http_version(self: BuilderType, http_version: HTTPVersion) -> BuilderType: - """Sets the HTTP protocol version which is used for the - :paramref:`~telegram.request.HTTPXRequest.http_version` parameter of - :attr:`telegram.Bot.request`. By default, HTTP/1.1 is used. - - .. seealso:: :meth:`get_updates_http_version` - - Note: - Users have observed stability issues with HTTP/2, which happen due to how the `h2 - library handles <https://github.com/python-hyper/h2/issues/1181>`_ cancellations of - keepalive connections. See `#3556 <https://github.com/python-telegram-bot/ - python-telegram-bot/issues/3556>`_ for a discussion. - - If you want to use HTTP/2, you must install PTB with the optional requirement - ``http2``, i.e. - - .. code-block:: bash - - pip install "python-telegram-bot[http2]" - - Keep in mind that the HTTP/1.1 implementation may be considered the `"more - robust option at this time" <https://www.python-httpx.org/http2#enabling-http2>`_. - - .. versionadded:: 20.1 - .. versionchanged:: 20.2 - Reset the default version to 1.1. - - Args: - http_version (:obj:`str`): Pass ``"2"`` or ``"2.0"`` if you'd like to use HTTP/2 for - making requests to Telegram. Defaults to ``"1.1"``, in which case HTTP/1.1 is used. - - .. versionchanged:: 20.5 - Accept ``"2"`` as a valid value. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._request_param_check(name="http_version", get_updates=False) - self._http_version = http_version - return self - - def get_updates_request(self: BuilderType, get_updates_request: BaseRequest) -> BuilderType: - """Sets a :class:`telegram.request.BaseRequest` instance for the - :paramref:`~telegram.Bot.get_updates_request` parameter of - :attr:`telegram.ext.Application.bot`. - - .. seealso:: :meth:`request` - - Args: - get_updates_request (:class:`telegram.request.BaseRequest`): The request instance. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._request_check(get_updates=True) - self._get_updates_request = get_updates_request - return self - - def get_updates_connection_pool_size( - self: BuilderType, get_updates_connection_pool_size: int - ) -> BuilderType: - """Sets the size of the connection pool for the - :paramref:`telegram.request.HTTPXRequest.connection_pool_size` parameter which is used - for the :meth:`telegram.Bot.get_updates` request. Defaults to ``1``. - - .. seealso:: :meth:`connection_pool_size` - - Args: - get_updates_connection_pool_size (:obj:`int`): The size of the connection pool. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._request_param_check(name="connection_pool_size", get_updates=True) - self._get_updates_connection_pool_size = get_updates_connection_pool_size - return self - - def get_updates_proxy( - self: BuilderType, get_updates_proxy: Union[str, httpx.Proxy, httpx.URL] - ) -> BuilderType: - """Sets the proxy for the :paramref:`telegram.request.HTTPXRequest.proxy` - parameter which is used for :meth:`telegram.Bot.get_updates`. Defaults to :obj:`None`. - - .. seealso:: :meth:`proxy` - - .. versionadded:: 20.7 - - Args: - proxy (:obj:`str` | ``httpx.Proxy`` | ``httpx.URL``): The URL to a proxy server, - a ``httpx.Proxy`` object or a ``httpx.URL`` object. See - :paramref:`telegram.request.HTTPXRequest.proxy` for more information. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._request_param_check(name="proxy", get_updates=True) - self._get_updates_proxy = get_updates_proxy - return self - - def get_updates_socket_options( - self: BuilderType, get_updates_socket_options: Collection[SocketOpt] - ) -> BuilderType: - """Sets the options for the :paramref:`~telegram.request.HTTPXRequest.socket_options` - parameter of :paramref:`telegram.Bot.get_updates_request`. Defaults to :obj:`None`. - - .. seealso:: :meth:`socket_options` - - .. versionadded:: 20.7 - - Args: - get_updates_socket_options (Collection[:obj:`tuple`], optional): Socket options. See - :paramref:`telegram.request.HTTPXRequest.socket_options` for more information. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._request_param_check(name="socket_options", get_updates=True) - self._get_updates_socket_options = get_updates_socket_options - return self - - def get_updates_connect_timeout( - self: BuilderType, get_updates_connect_timeout: Optional[float] - ) -> BuilderType: - """Sets the connection attempt timeout for the - :paramref:`telegram.request.HTTPXRequest.connect_timeout` parameter which is used for - the :meth:`telegram.Bot.get_updates` request. Defaults to ``5.0``. - - .. seealso:: :meth:`connect_timeout` - - Args: - get_updates_connect_timeout (:obj:`float`): See - :paramref:`telegram.request.HTTPXRequest.connect_timeout` for more information. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._request_param_check(name="connect_timeout", get_updates=True) - self._get_updates_connect_timeout = get_updates_connect_timeout - return self - - def get_updates_read_timeout( - self: BuilderType, get_updates_read_timeout: Optional[float] - ) -> BuilderType: - """Sets the waiting timeout for the - :paramref:`telegram.request.HTTPXRequest.read_timeout` parameter which is used for the - :meth:`telegram.Bot.get_updates` request. Defaults to ``5.0``. - - .. seealso:: :meth:`read_timeout` - - Args: - get_updates_read_timeout (:obj:`float`): See - :paramref:`telegram.request.HTTPXRequest.read_timeout` for more information. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._request_param_check(name="read_timeout", get_updates=True) - self._get_updates_read_timeout = get_updates_read_timeout - return self - - def get_updates_write_timeout( - self: BuilderType, get_updates_write_timeout: Optional[float] - ) -> BuilderType: - """Sets the write operation timeout for the - :paramref:`telegram.request.HTTPXRequest.write_timeout` parameter which is used for - the :meth:`telegram.Bot.get_updates` request. Defaults to ``5.0``. - - .. seealso:: :meth:`write_timeout` - - Args: - get_updates_write_timeout (:obj:`float`): See - :paramref:`telegram.request.HTTPXRequest.write_timeout` for more information. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._request_param_check(name="write_timeout", get_updates=True) - self._get_updates_write_timeout = get_updates_write_timeout - return self - - def get_updates_pool_timeout( - self: BuilderType, get_updates_pool_timeout: Optional[float] - ) -> BuilderType: - """Sets the connection pool's connection freeing timeout for the - :paramref:`~telegram.request.HTTPXRequest.pool_timeout` parameter which is used for the - :meth:`telegram.Bot.get_updates` request. Defaults to ``1.0``. - - .. seealso:: :meth:`pool_timeout` - - Args: - get_updates_pool_timeout (:obj:`float`): See - :paramref:`telegram.request.HTTPXRequest.pool_timeout` for more information. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._request_param_check(name="pool_timeout", get_updates=True) - self._get_updates_pool_timeout = get_updates_pool_timeout - return self - - def get_updates_http_version( - self: BuilderType, get_updates_http_version: HTTPVersion - ) -> BuilderType: - """Sets the HTTP protocol version which is used for the - :paramref:`~telegram.request.HTTPXRequest.http_version` parameter which is used in the - :meth:`telegram.Bot.get_updates` request. By default, HTTP/1.1 is used. - - .. seealso:: :meth:`http_version` - - Note: - Users have observed stability issues with HTTP/2, which happen due to how the `h2 - library handles <https://github.com/python-hyper/h2/issues/1181>`_ cancellations of - keepalive connections. See `#3556 <https://github.com/python-telegram-bot/ - python-telegram-bot/issues/3556>`_ for a discussion. - - You will also need to install the http2 dependency. Keep in mind that the HTTP/1.1 - implementation may be considered the `"more robust option at this time" - <https://www.python-httpx.org/http2#enabling-http2>`_. - - .. code-block:: bash - - pip install httpx[http2] - - .. versionadded:: 20.1 - .. versionchanged:: 20.2 - Reset the default version to 1.1. - - Args: - get_updates_http_version (:obj:`str`): Pass ``"2"`` or ``"2.0"`` if you'd like to use - HTTP/2 for making requests to Telegram. Defaults to ``"1.1"``, in which case - HTTP/1.1 is used. - - .. versionchanged:: 20.5 - Accept ``"2"`` as a valid value. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._request_param_check(name="http_version", get_updates=True) - self._get_updates_http_version = get_updates_http_version - return self - - def private_key( - self: BuilderType, - private_key: Union[bytes, FilePathInput], - password: Optional[Union[bytes, FilePathInput]] = None, - ) -> BuilderType: - """Sets the private key and corresponding password for decryption of telegram passport data - for :attr:`telegram.ext.Application.bot`. - - Examples: - :any:`Passport Bot <examples.passportbot>` - - .. seealso:: :wiki:`Telegram Passports <Telegram-Passport>` - - Args: - private_key (:obj:`bytes` | :obj:`str` | :obj:`pathlib.Path`): The private key or the - file path of a file that contains the key. In the latter case, the file's content - will be read automatically. - password (:obj:`bytes` | :obj:`str` | :obj:`pathlib.Path`, optional): The corresponding - password or the file path of a file that contains the password. In the latter case, - the file's content will be read automatically. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._bot_check("private_key") - self._updater_check("private_key") - - self._private_key = ( - private_key if isinstance(private_key, bytes) else Path(private_key).read_bytes() - ) - if password is None or isinstance(password, bytes): - self._private_key_password = password - else: - self._private_key_password = Path(password).read_bytes() - - return self - - def defaults(self: BuilderType, defaults: "Defaults") -> BuilderType: - """Sets the :class:`telegram.ext.Defaults` instance for - :attr:`telegram.ext.Application.bot`. - - .. seealso:: :wiki:`Adding Defaults to Your Bot <Adding-defaults-to-your-bot>` - - Args: - defaults (:class:`telegram.ext.Defaults`): The defaults instance. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._bot_check("defaults") - self._updater_check("defaults") - self._defaults = defaults - return self - - def arbitrary_callback_data( - self: BuilderType, arbitrary_callback_data: Union[bool, int] - ) -> BuilderType: - """Specifies whether :attr:`telegram.ext.Application.bot` should allow arbitrary objects as - callback data for :class:`telegram.InlineKeyboardButton` and how many keyboards should be - cached in memory. If not called, only strings can be used as callback data and no data will - be stored in memory. - - Important: - If you want to use this feature, you must install PTB with the optional requirement - ``callback-data``, i.e. - - .. code-block:: bash - - pip install "python-telegram-bot[callback-data]" - - Examples: - :any:`Arbitrary callback_data Bot <examples.arbitrarycallbackdatabot>` - - .. seealso:: :wiki:`Arbitrary callback_data <Arbitrary-callback_data>` - - Args: - arbitrary_callback_data (:obj:`bool` | :obj:`int`): If :obj:`True` is passed, the - default cache size of ``1024`` will be used. Pass an integer to specify a different - cache size. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._bot_check("arbitrary_callback_data") - self._updater_check("arbitrary_callback_data") - self._arbitrary_callback_data = arbitrary_callback_data - return self - - def local_mode(self: BuilderType, local_mode: bool) -> BuilderType: - """Specifies the value for :paramref:`~telegram.Bot.local_mode` for the - :attr:`telegram.ext.Application.bot`. - If not called, will default to :obj:`False`. - - .. seealso:: :wiki:`Local Bot API Server <Local-Bot-API-Server>` - - Args: - local_mode (:obj:`bool`): Whether the bot should run in local mode. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._bot_check("local_mode") - self._updater_check("local_mode") - self._local_mode = local_mode - return self - - def bot( - self: "ApplicationBuilder[BT, CCT, UD, CD, BD, JQ]", - bot: InBT, - ) -> "ApplicationBuilder[InBT, CCT, UD, CD, BD, JQ]": - """Sets a :class:`telegram.Bot` instance for - :attr:`telegram.ext.Application.bot`. Instances of subclasses like - :class:`telegram.ext.ExtBot` are also valid. - - Args: - bot (:class:`telegram.Bot`): The bot. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._updater_check("bot") - for attr, error in _BOT_CHECKS: - if not isinstance(getattr(self, f"_{attr}"), DefaultValue): - raise RuntimeError(_TWO_ARGS_REQ.format("bot", error)) - self._bot = bot - return self # type: ignore[return-value] - - def update_queue(self: BuilderType, update_queue: "Queue[object]") -> BuilderType: - """Sets a :class:`asyncio.Queue` instance for - :attr:`telegram.ext.Application.update_queue`, i.e. the queue that the application will - fetch updates from. Will also be used for the :attr:`telegram.ext.Application.updater`. - If not called, a queue will be instantiated. - - .. seealso:: :attr:`telegram.ext.Updater.update_queue` - - Args: - update_queue (:class:`asyncio.Queue`): The queue. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - if self._updater not in (DEFAULT_NONE, None): - raise RuntimeError(_TWO_ARGS_REQ.format("update_queue", "updater instance")) - self._update_queue = update_queue - return self - - def concurrent_updates( - self: BuilderType, concurrent_updates: Union[bool, int, "BaseUpdateProcessor"] - ) -> BuilderType: - """Specifies if and how many updates may be processed concurrently instead of one by one. - If not called, updates will be processed one by one. - - Warning: - Processing updates concurrently is not recommended when stateful handlers like - :class:`telegram.ext.ConversationHandler` are used. Only use this if you are sure - that your bot does not (explicitly or implicitly) rely on updates being processed - sequentially. - - .. include:: inclusions/pool_size_tip.rst - - .. seealso:: :attr:`telegram.ext.Application.concurrent_updates` - - Args: - concurrent_updates (:obj:`bool` | :obj:`int` | :class:`BaseUpdateProcessor`): Passing - :obj:`True` will allow for ``256`` updates to be processed concurrently using - :class:`telegram.ext.SimpleUpdateProcessor`. Pass an integer to specify a different - number of updates that may be processed concurrently. Pass an instance of - :class:`telegram.ext.BaseUpdateProcessor` to use that instance for handling updates - concurrently. - - .. versionchanged:: 20.4 - Now accepts :class:`BaseUpdateProcessor` instances. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - # Check if concurrent updates is bool and convert to integer - if concurrent_updates is True: - concurrent_updates = 256 - elif concurrent_updates is False: - concurrent_updates = 1 - - # If `concurrent_updates` is an integer, create a `SimpleUpdateProcessor` - # instance with that integer value; otherwise, raise an error if the value - # is negative - if isinstance(concurrent_updates, int): - concurrent_updates = SimpleUpdateProcessor(concurrent_updates) - - # Assign default value of concurrent_updates if it is instance of - # `BaseUpdateProcessor` - self._update_processor: BaseUpdateProcessor = concurrent_updates # type: ignore[no-redef] - return self - - def job_queue( - self: "ApplicationBuilder[BT, CCT, UD, CD, BD, JQ]", - job_queue: InJQ, - ) -> "ApplicationBuilder[BT, CCT, UD, CD, BD, InJQ]": - """Sets a :class:`telegram.ext.JobQueue` instance for - :attr:`telegram.ext.Application.job_queue`. If not called, a job queue will be - instantiated if the requirements of :class:`telegram.ext.JobQueue` are installed. - - Examples: - :any:`Timer Bot <examples.timerbot>` - - .. seealso:: :wiki:`Job Queue <Extensions---JobQueue>` - - Note: - * :meth:`telegram.ext.JobQueue.set_application` will be called automatically by - :meth:`build`. - * The job queue will be automatically started and stopped by - :meth:`telegram.ext.Application.start` and :meth:`telegram.ext.Application.stop`, - respectively. - * When passing :obj:`None` or when the requirements of :class:`telegram.ext.JobQueue` - are not installed, :attr:`telegram.ext.ConversationHandler.conversation_timeout` - can not be used, as this uses :attr:`telegram.ext.Application.job_queue` internally. - - Args: - job_queue (:class:`telegram.ext.JobQueue`): The job queue. Pass :obj:`None` if you - don't want to use a job queue. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._job_queue = job_queue - return self # type: ignore[return-value] - - def persistence( - self: BuilderType, persistence: "BasePersistence[Any, Any, Any]" - ) -> BuilderType: - """Sets a :class:`telegram.ext.BasePersistence` instance for - :attr:`telegram.ext.Application.persistence`. - - Note: - When using a persistence, note that all - data stored in :attr:`context.user_data <telegram.ext.CallbackContext.user_data>`, - :attr:`context.chat_data <telegram.ext.CallbackContext.chat_data>`, - :attr:`context.bot_data <telegram.ext.CallbackContext.bot_data>` and - in :attr:`telegram.ext.ExtBot.callback_data_cache` must be copyable with - :func:`copy.deepcopy`. This is due to the data being deep copied before handing it over - to the persistence in order to avoid race conditions. - - Examples: - :any:`Persistent Conversation Bot <examples.persistentconversationbot>` - - .. seealso:: :wiki:`Making Your Bot Persistent <Making-your-bot-persistent>` - - Warning: - If a :class:`telegram.ext.ContextTypes` instance is set via :meth:`context_types`, - the persistence instance must use the same types! - - Args: - persistence (:class:`telegram.ext.BasePersistence`): The persistence instance. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._persistence = persistence - return self - - def context_types( - self: "ApplicationBuilder[BT, CCT, UD, CD, BD, JQ]", - context_types: "ContextTypes[InCCT, InUD, InCD, InBD]", - ) -> "ApplicationBuilder[BT, InCCT, InUD, InCD, InBD, JQ]": - """Sets a :class:`telegram.ext.ContextTypes` instance for - :attr:`telegram.ext.Application.context_types`. - - Examples: - :any:`Context Types Bot <examples.contexttypesbot>` - - Args: - context_types (:class:`telegram.ext.ContextTypes`): The context types. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._context_types = context_types - return self # type: ignore[return-value] - - def updater(self: BuilderType, updater: Optional[Updater]) -> BuilderType: - """Sets a :class:`telegram.ext.Updater` instance for - :attr:`telegram.ext.Application.updater`. The :attr:`telegram.ext.Updater.bot` and - :attr:`telegram.ext.Updater.update_queue` will be used for - :attr:`telegram.ext.Application.bot` and :attr:`telegram.ext.Application.update_queue`, - respectively. - - Args: - updater (:class:`telegram.ext.Updater` | :obj:`None`): The updater instance or - :obj:`None` if no updater should be used. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - if updater is None: - self._updater = updater - return self - - for attr, error in ( - (self._bot, "bot instance"), - (self._update_queue, "update_queue"), - ): - if not isinstance(attr, DefaultValue): - raise RuntimeError(_TWO_ARGS_REQ.format("updater", error)) - - for attr_name, error in _BOT_CHECKS: - if not isinstance(getattr(self, f"_{attr_name}"), DefaultValue): - raise RuntimeError(_TWO_ARGS_REQ.format("updater", error)) - - self._updater = updater - return self - - def post_init( - self: BuilderType, post_init: Callable[[Application], Coroutine[Any, Any, None]] - ) -> BuilderType: - """ - Sets a callback to be executed by :meth:`Application.run_polling` and - :meth:`Application.run_webhook` *after* executing :meth:`Application.initialize` but - *before* executing :meth:`Updater.start_polling` or :meth:`Updater.start_webhook`, - respectively. - - Tip: - This can be used for custom startup logic that requires to await coroutines, e.g. - setting up the bots commands via :meth:`~telegram.Bot.set_my_commands`. - - Example: - .. code:: - - async def post_init(application: Application) -> None: - await application.bot.set_my_commands([('start', 'Starts the bot')]) - - application = Application.builder().token("TOKEN").post_init(post_init).build() - - Note: - |post_methods_note| - - .. seealso:: :meth:`post_stop`, :meth:`post_shutdown` - - Args: - post_init (:term:`coroutine function`): The custom callback. Must be a - :term:`coroutine function` and must accept exactly one positional argument, which - is the :class:`~telegram.ext.Application`:: - - async def post_init(application: Application) -> None: - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._post_init = post_init - return self - - def post_shutdown( - self: BuilderType, post_shutdown: Callable[[Application], Coroutine[Any, Any, None]] - ) -> BuilderType: - """ - Sets a callback to be executed by :meth:`Application.run_polling` and - :meth:`Application.run_webhook` *after* executing :meth:`Updater.shutdown` - and :meth:`Application.shutdown`. - - Tip: - This can be used for custom shutdown logic that requires to await coroutines, e.g. - closing a database connection - - Example: - .. code:: - - async def post_shutdown(application: Application) -> None: - await application.bot_data['database'].close() - - application = Application.builder() - .token("TOKEN") - .post_shutdown(post_shutdown) - .build() - - Note: - |post_methods_note| - - .. seealso:: :meth:`post_init`, :meth:`post_stop` - - Args: - post_shutdown (:term:`coroutine function`): The custom callback. Must be a - :term:`coroutine function` and must accept exactly one positional argument, which - is the :class:`~telegram.ext.Application`:: - - async def post_shutdown(application: Application) -> None: - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._post_shutdown = post_shutdown - return self - - def post_stop( - self: BuilderType, post_stop: Callable[[Application], Coroutine[Any, Any, None]] - ) -> BuilderType: - """ - Sets a callback to be executed by :meth:`Application.run_polling` and - :meth:`Application.run_webhook` *after* executing :meth:`Updater.stop` - and :meth:`Application.stop`. - - .. versionadded:: 20.1 - - Tip: - This can be used for custom stop logic that requires to await coroutines, e.g. - sending message to a chat before shutting down the bot. - - Hint: - The callback will be called only, if :meth:`Application.stop` was indeed called - successfully. For example, if the application is stopped early by calling - :meth:`Application.stop_running` within :meth:`post_init`, then the set callback will - *not* be called. - - Example: - .. code:: - - async def post_stop(application: Application) -> None: - await application.bot.send_message(123456, "Shutting down...") - - application = Application.builder() - .token("TOKEN") - .post_stop(post_stop) - .build() - - Note: - |post_methods_note| - - .. seealso:: :meth:`post_init`, :meth:`post_shutdown` - - Args: - post_stop (:term:`coroutine function`): The custom callback. Must be a - :term:`coroutine function` and must accept exactly one positional argument, which - is the :class:`~telegram.ext.Application`:: - - async def post_stop(application: Application) -> None: - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._post_stop = post_stop - return self - - def rate_limiter( - self: "ApplicationBuilder[BT, CCT, UD, CD, BD, JQ]", - rate_limiter: "BaseRateLimiter[RLARGS]", - ) -> "ApplicationBuilder[ExtBot[RLARGS], CCT, UD, CD, BD, JQ]": - """Sets a :class:`telegram.ext.BaseRateLimiter` instance for the - :paramref:`telegram.ext.ExtBot.rate_limiter` parameter of - :attr:`telegram.ext.Application.bot`. - - Args: - rate_limiter (:class:`telegram.ext.BaseRateLimiter`): The rate limiter. - - Returns: - :class:`ApplicationBuilder`: The same builder with the updated argument. - """ - self._bot_check("rate_limiter") - self._updater_check("rate_limiter") - self._rate_limiter = rate_limiter - return self # type: ignore[return-value] - - -InitApplicationBuilder = ( # This is defined all the way down here so that its type is inferred - ApplicationBuilder[ # by Pylance correctly. - ExtBot[None], - ContextTypes.DEFAULT_TYPE, - dict[Any, Any], - dict[Any, Any], - dict[Any, Any], - JobQueue[ContextTypes.DEFAULT_TYPE], - ] -) diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_basepersistence.py b/venv/lib/python3.12/site-packages/telegram/ext/_basepersistence.py deleted file mode 100644 index 3571f6d..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_basepersistence.py +++ /dev/null @@ -1,440 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the BasePersistence class.""" -from abc import ABC, abstractmethod -from typing import Generic, NamedTuple, NoReturn, Optional - -from telegram._bot import Bot -from telegram.ext._extbot import ExtBot -from telegram.ext._utils.types import BD, CD, UD, CDCData, ConversationDict, ConversationKey - - -class PersistenceInput(NamedTuple): - """Convenience wrapper to group boolean input for the :paramref:`~BasePersistence.store_data` - parameter for :class:`BasePersistence`. - - Args: - bot_data (:obj:`bool`, optional): Whether the setting should be applied for ``bot_data``. - Defaults to :obj:`True`. - chat_data (:obj:`bool`, optional): Whether the setting should be applied for ``chat_data``. - Defaults to :obj:`True`. - user_data (:obj:`bool`, optional): Whether the setting should be applied for ``user_data``. - Defaults to :obj:`True`. - callback_data (:obj:`bool`, optional): Whether the setting should be applied for - ``callback_data``. Defaults to :obj:`True`. - - Attributes: - bot_data (:obj:`bool`): Whether the setting should be applied for ``bot_data``. - chat_data (:obj:`bool`): Whether the setting should be applied for ``chat_data``. - user_data (:obj:`bool`): Whether the setting should be applied for ``user_data``. - callback_data (:obj:`bool`): Whether the setting should be applied for ``callback_data``. - - """ - - bot_data: bool = True - chat_data: bool = True - user_data: bool = True - callback_data: bool = True - - -class BasePersistence(Generic[UD, CD, BD], ABC): - """Interface class for adding persistence to your bot. - Subclass this object for different implementations of a persistent bot. - - Attention: - The interface provided by this class is intended to be accessed exclusively by - :class:`~telegram.ext.Application`. Calling any of the methods below manually might - interfere with the integration of persistence into :class:`~telegram.ext.Application`. - - All relevant methods must be overwritten. This includes: - - * :meth:`get_bot_data` - * :meth:`update_bot_data` - * :meth:`refresh_bot_data` - * :meth:`get_chat_data` - * :meth:`update_chat_data` - * :meth:`refresh_chat_data` - * :meth:`drop_chat_data` - * :meth:`get_user_data` - * :meth:`update_user_data` - * :meth:`refresh_user_data` - * :meth:`drop_user_data` - * :meth:`get_callback_data` - * :meth:`update_callback_data` - * :meth:`get_conversations` - * :meth:`update_conversation` - * :meth:`flush` - - If you don't actually need one of those methods, a simple :keyword:`pass` is enough. - For example, if you don't store ``bot_data``, you don't need :meth:`get_bot_data`, - :meth:`update_bot_data` or :meth:`refresh_bot_data`. - - Note: - You should avoid saving :class:`telegram.Bot` instances. This is because if you change e.g. - the bots token, this won't propagate to the serialized instances and may lead to exceptions. - - To prevent this, the implementation may use :attr:`bot` to replace bot instances with a - placeholder before serialization and insert :attr:`bot` back when loading the data. - Since :attr:`bot` will be set when the process starts, this will be the up-to-date bot - instance. - - If the persistence implementation does not take care of this, you should make sure not to - store any bot instances in the data that will be persisted. E.g. in case of - :class:`telegram.TelegramObject`, one may call :meth:`set_bot` to ensure that shortcuts like - :meth:`telegram.Message.reply_text` are available. - - This class is a :class:`~typing.Generic` class and accepts three type variables: - - 1. The type of the second argument of :meth:`update_user_data`, which must coincide with the - type of the second argument of :meth:`refresh_user_data` and the values in the dictionary - returned by :meth:`get_user_data`. - 2. The type of the second argument of :meth:`update_chat_data`, which must coincide with the - type of the second argument of :meth:`refresh_chat_data` and the values in the dictionary - returned by :meth:`get_chat_data`. - 3. The type of the argument of :meth:`update_bot_data`, which must coincide with the - type of the argument of :meth:`refresh_bot_data` and the return value of - :meth:`get_bot_data`. - - .. seealso:: :wiki:`Architecture Overview <Architecture>`, - :wiki:`Making Your Bot Persistent <Making-your-bot-persistent>` - - .. versionchanged:: 20.0 - - * The parameters and attributes ``store_*_data`` were replaced by :attr:`store_data`. - * ``insert/replace_bot`` was dropped. Serialization of bot instances now needs to be - handled by the specific implementation - see above note. - - Args: - store_data (:class:`~telegram.ext.PersistenceInput`, optional): Specifies which kinds of - data will be saved by this persistence instance. By default, all available kinds of - data will be saved. - update_interval (:obj:`int` | :obj:`float`, optional): The - :class:`~telegram.ext.Application` will update - the persistence in regular intervals. This parameter specifies the time (in seconds) to - wait between two consecutive runs of updating the persistence. Defaults to ``60`` - seconds. - - .. versionadded:: 20.0 - Attributes: - store_data (:class:`~telegram.ext.PersistenceInput`): Specifies which kinds of data will - be saved by this persistence instance. - bot (:class:`telegram.Bot`): The bot associated with the persistence. - """ - - __slots__ = ( - "_update_interval", - "bot", - "store_data", - ) - - def __init__( - self, - store_data: Optional[PersistenceInput] = None, - update_interval: float = 60, - ): - self.store_data: PersistenceInput = store_data or PersistenceInput() - self._update_interval: float = update_interval - - self.bot: Bot = None # type: ignore[assignment] - - @property - def update_interval(self) -> float: - """:obj:`float`: Time (in seconds) that the :class:`~telegram.ext.Application` - will wait between two consecutive runs of updating the persistence. - - .. versionadded:: 20.0 - """ - return self._update_interval - - @update_interval.setter - def update_interval(self, _: object) -> NoReturn: - raise AttributeError( - "You can not assign a new value to update_interval after initialization." - ) - - def set_bot(self, bot: Bot) -> None: - """Set the Bot to be used by this persistence instance. - - Args: - bot (:class:`telegram.Bot`): The bot. - - Raises: - :exc:`TypeError`: If :attr:`PersistenceInput.callback_data` is :obj:`True` and the - :paramref:`bot` is not an instance of :class:`telegram.ext.ExtBot`. - """ - if self.store_data.callback_data and (not isinstance(bot, ExtBot)): - raise TypeError("callback_data can only be stored when using telegram.ext.ExtBot.") - - self.bot = bot - - @abstractmethod - async def get_user_data(self) -> dict[int, UD]: - """Will be called by :class:`telegram.ext.Application` upon creation with a - persistence object. It should return the ``user_data`` if stored, or an empty - :obj:`dict`. In the latter case, the dictionary should produce values - corresponding to one of the following: - - - :obj:`dict` - - The type from :attr:`telegram.ext.ContextTypes.user_data` - if :class:`telegram.ext.ContextTypes` is used. - - .. versionchanged:: 20.0 - This method may now return a :obj:`dict` instead of a :obj:`collections.defaultdict` - - Returns: - dict[:obj:`int`, :obj:`dict` | :attr:`telegram.ext.ContextTypes.user_data`]: - The restored user data. - """ - - @abstractmethod - async def get_chat_data(self) -> dict[int, CD]: - """Will be called by :class:`telegram.ext.Application` upon creation with a - persistence object. It should return the ``chat_data`` if stored, or an empty - :obj:`dict`. In the latter case, the dictionary should produce values - corresponding to one of the following: - - - :obj:`dict` - - The type from :attr:`telegram.ext.ContextTypes.chat_data` - if :class:`telegram.ext.ContextTypes` is used. - - .. versionchanged:: 20.0 - This method may now return a :obj:`dict` instead of a :obj:`collections.defaultdict` - - Returns: - dict[:obj:`int`, :obj:`dict` | :attr:`telegram.ext.ContextTypes.chat_data`]: - The restored chat data. - """ - - @abstractmethod - async def get_bot_data(self) -> BD: - """Will be called by :class:`telegram.ext.Application` upon creation with a - persistence object. It should return the ``bot_data`` if stored, or an empty - :obj:`dict`. In the latter case, the :obj:`dict` should produce values - corresponding to one of the following: - - - :obj:`dict` - - The type from :attr:`telegram.ext.ContextTypes.bot_data` - if :class:`telegram.ext.ContextTypes` are used. - - Returns: - dict[:obj:`int`, :obj:`dict` | :attr:`telegram.ext.ContextTypes.bot_data`]: - The restored bot data. - """ - - @abstractmethod - async def get_callback_data(self) -> Optional[CDCData]: - """Will be called by :class:`telegram.ext.Application` upon creation with a - persistence object. If callback data was stored, it should be returned. - - .. versionadded:: 13.6 - - .. versionchanged:: 20.0 - Changed this method into an :external:func:`~abc.abstractmethod`. - - Returns: - tuple[list[tuple[:obj:`str`, :obj:`float`, dict[:obj:`str`, :class:`object`]]], - dict[:obj:`str`, :obj:`str`]] | :obj:`None`: The restored metadata or :obj:`None`, - if no data was stored. - """ - - @abstractmethod - async def get_conversations(self, name: str) -> ConversationDict: - """Will be called by :class:`telegram.ext.Application` when a - :class:`telegram.ext.ConversationHandler` is added if - :attr:`telegram.ext.ConversationHandler.persistent` is :obj:`True`. - It should return the conversations for the handler with :paramref:`name` or an empty - :obj:`dict`. - - Args: - name (:obj:`str`): The handlers name. - - Returns: - :obj:`dict`: The restored conversations for the handler. - """ - - @abstractmethod - async def update_conversation( - self, name: str, key: ConversationKey, new_state: Optional[object] - ) -> None: - """Will be called when a :class:`telegram.ext.ConversationHandler` changes states. - This allows the storage of the new state in the persistence. - - Args: - name (:obj:`str`): The handler's name. - key (:obj:`tuple`): The key the state is changed for. - new_state (:class:`object`): The new state for the given key. - """ - - @abstractmethod - async def update_user_data(self, user_id: int, data: UD) -> None: - """Will be called by the :class:`telegram.ext.Application` after a handler has - handled an update. - - Args: - user_id (:obj:`int`): The user the data might have been changed for. - data (:obj:`dict` | :attr:`telegram.ext.ContextTypes.user_data`): - The :attr:`telegram.ext.Application.user_data` ``[user_id]``. - """ - - @abstractmethod - async def update_chat_data(self, chat_id: int, data: CD) -> None: - """Will be called by the :class:`telegram.ext.Application` after a handler has - handled an update. - - Args: - chat_id (:obj:`int`): The chat the data might have been changed for. - data (:obj:`dict` | :attr:`telegram.ext.ContextTypes.chat_data`): - The :attr:`telegram.ext.Application.chat_data` ``[chat_id]``. - """ - - @abstractmethod - async def update_bot_data(self, data: BD) -> None: - """Will be called by the :class:`telegram.ext.Application` after a handler has - handled an update. - - Args: - data (:obj:`dict` | :attr:`telegram.ext.ContextTypes.bot_data`): - The :attr:`telegram.ext.Application.bot_data`. - """ - - @abstractmethod - async def update_callback_data(self, data: CDCData) -> None: - """Will be called by the :class:`telegram.ext.Application` after a handler has - handled an update. - - .. versionadded:: 13.6 - - .. versionchanged:: 20.0 - Changed this method into an :external:func:`~abc.abstractmethod`. - - Args: - data (tuple[list[tuple[:obj:`str`, :obj:`float`, \ - dict[:obj:`str`, :obj:`Any`]]], dict[:obj:`str`, :obj:`str`]] | :obj:`None`): - The relevant data to restore :class:`telegram.ext.CallbackDataCache`. - """ - - @abstractmethod - async def drop_chat_data(self, chat_id: int) -> None: - """Will be called by the :class:`telegram.ext.Application`, when using - :meth:`~telegram.ext.Application.drop_chat_data`. - - .. versionadded:: 20.0 - - Args: - chat_id (:obj:`int`): The chat id to delete from the persistence. - """ - - @abstractmethod - async def drop_user_data(self, user_id: int) -> None: - """Will be called by the :class:`telegram.ext.Application`, when using - :meth:`~telegram.ext.Application.drop_user_data`. - - .. versionadded:: 20.0 - - Args: - user_id (:obj:`int`): The user id to delete from the persistence. - """ - - @abstractmethod - async def refresh_user_data(self, user_id: int, user_data: UD) -> None: - """Will be called by the :class:`telegram.ext.Application` before passing the - :attr:`~telegram.ext.Application.user_data` to a callback. Can be used to update data - stored in :attr:`~telegram.ext.Application.user_data` from an external source. - - Tip: - This method is expected to edit the object :paramref:`user_data` in-place instead of - returning a new object. - - Warning: - When using :meth:`~telegram.ext.ApplicationBuilder.concurrent_updates`, this method - may be called while a handler callback is still running. This might lead to race - conditions. - - .. versionadded:: 13.6 - - .. versionchanged:: 20.0 - Changed this method into an :external:func:`~abc.abstractmethod`. - - Args: - user_id (:obj:`int`): The user ID this :attr:`~telegram.ext.Application.user_data` is - associated with. - user_data (:obj:`dict` | :attr:`telegram.ext.ContextTypes.user_data`): - The ``user_data`` of a single user. - """ - - @abstractmethod - async def refresh_chat_data(self, chat_id: int, chat_data: CD) -> None: - """Will be called by the :class:`telegram.ext.Application` before passing the - :attr:`~telegram.ext.Application.chat_data` to a callback. Can be used to update data - stored in :attr:`~telegram.ext.Application.chat_data` from an external source. - - Tip: - This method is expected to edit the object :paramref:`chat_data` in-place instead of - returning a new object. - - Warning: - When using :meth:`~telegram.ext.ApplicationBuilder.concurrent_updates`, this method - may be called while a handler callback is still running. This might lead to race - conditions. - - .. versionadded:: 13.6 - - .. versionchanged:: 20.0 - Changed this method into an :external:func:`~abc.abstractmethod`. - - Args: - chat_id (:obj:`int`): The chat ID this :attr:`~telegram.ext.Application.chat_data` is - associated with. - chat_data (:obj:`dict` | :attr:`telegram.ext.ContextTypes.chat_data`): - The ``chat_data`` of a single chat. - """ - - @abstractmethod - async def refresh_bot_data(self, bot_data: BD) -> None: - """Will be called by the :class:`telegram.ext.Application` before passing the - :attr:`~telegram.ext.Application.bot_data` to a callback. Can be used to update data stored - in :attr:`~telegram.ext.Application.bot_data` from an external source. - - Tip: - This method is expected to edit the object :paramref:`bot_data` in-place instead of - returning a new object. - - Warning: - When using :meth:`~telegram.ext.ApplicationBuilder.concurrent_updates`, this method - may be called while a handler callback is still running. This might lead to race - conditions. - - .. versionadded:: 13.6 - - .. versionchanged:: 20.0 - Changed this method into an :external:func:`~abc.abstractmethod`. - - Args: - bot_data (:obj:`dict` | :attr:`telegram.ext.ContextTypes.bot_data`): - The ``bot_data``. - """ - - @abstractmethod - async def flush(self) -> None: - """Will be called by :meth:`telegram.ext.Application.stop`. Gives the - persistence a chance to finish up saving or close a database connection gracefully. - - .. versionchanged:: 20.0 - Changed this method into an :external:func:`~abc.abstractmethod`. - """ diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_baseratelimiter.py b/venv/lib/python3.12/site-packages/telegram/ext/_baseratelimiter.py deleted file mode 100644 index ad11e44..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_baseratelimiter.py +++ /dev/null @@ -1,142 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains a class that allows to rate limit requests to the Bot API.""" -from abc import ABC, abstractmethod -from collections.abc import Coroutine -from typing import Any, Callable, Generic, Optional, Union - -from telegram._utils.types import JSONDict -from telegram.ext._utils.types import RLARGS - - -class BaseRateLimiter(ABC, Generic[RLARGS]): - """ - Abstract interface class that allows to rate limit the requests that python-telegram-bot - sends to the Telegram Bot API. An implementation of this class - must implement all abstract methods and properties. - - This class is a :class:`~typing.Generic` class and accepts one type variable that specifies - the type of the argument :paramref:`~process_request.rate_limit_args` of - :meth:`process_request` and the methods of :class:`~telegram.ext.ExtBot`. - - Hint: - Requests to :meth:`~telegram.Bot.get_updates` are never rate limited. - - .. seealso:: :wiki:`Architecture Overview <Architecture>`, - :wiki:`Avoiding Flood Limits <Avoiding-flood-limits>` - - .. versionadded:: 20.0 - """ - - __slots__ = () - - @abstractmethod - async def initialize(self) -> None: - """Initialize resources used by this class. Must be implemented by a subclass.""" - - @abstractmethod - async def shutdown(self) -> None: - """Stop & clear resources used by this class. Must be implemented by a subclass.""" - - @abstractmethod - async def process_request( - self, - callback: Callable[..., Coroutine[Any, Any, Union[bool, JSONDict, list[JSONDict]]]], - args: Any, - kwargs: dict[str, Any], - endpoint: str, - data: dict[str, Any], - rate_limit_args: Optional[RLARGS], - ) -> Union[bool, JSONDict, list[JSONDict]]: - """ - Process a request. Must be implemented by a subclass. - - This method must call :paramref:`callback` and return the result of the call. - `When` the callback is called is up to the implementation. - - Important: - This method must only return once the result of :paramref:`callback` is known! - - If a :exc:`~telegram.error.RetryAfter` error is raised, this method may try to make - a new request by calling the callback again. - - Warning: - This method *should not* handle any other exception raised by :paramref:`callback`! - - There are basically two different approaches how a rate limiter can be implemented: - - 1. React only if necessary. In this case, the :paramref:`callback` is called without any - precautions. If a :exc:`~telegram.error.RetryAfter` error is raised, processing requests - is halted for the :attr:`~telegram.error.RetryAfter.retry_after` and finally the - :paramref:`callback` is called again. This approach is often amendable for bots that - don't have a large user base and/or don't send more messages than they get updates. - 2. Throttle all outgoing requests. In this case the implementation makes sure that the - requests are spread out over a longer time interval in order to stay below the rate - limits. This approach is often amendable for bots that have a large user base and/or - send more messages than they get updates. - - An implementation can use the information provided by :paramref:`data`, - :paramref:`endpoint` and :paramref:`rate_limit_args` to handle each request differently. - - Examples: - * It is usually desirable to call :meth:`telegram.Bot.answer_inline_query` - as quickly as possible, while delaying :meth:`telegram.Bot.send_message` - is acceptable. - * There are `different <https://core.telegram.org/bots/faq\ - #my-bot-is-hitting-limits-how-do-i-avoid-this>`_ rate limits for group chats and - private chats. - * When sending broadcast messages to a large number of users, these requests can - typically be delayed for a longer time than messages that are direct replies to a - user input. - - Args: - callback (Callable[..., :term:`coroutine`]): The coroutine function that must be called - to make the request. - args (tuple[:obj:`object`]): The positional arguments for the :paramref:`callback` - function. - kwargs (dict[:obj:`str`, :obj:`object`]): The keyword arguments for the - :paramref:`callback` function. - endpoint (:obj:`str`): The endpoint that the request is made for, e.g. - ``"sendMessage"``. - data (dict[:obj:`str`, :obj:`object`]): The parameters that were passed to the method - of :class:`~telegram.ext.ExtBot`. Any ``api_kwargs`` are included in this and - any :paramref:`~telegram.ext.ExtBot.defaults` are already applied. - - Example: - - When calling:: - - await ext_bot.send_message( - chat_id=1, - text="Hello world!", - api_kwargs={"custom": "arg"} - ) - - then :paramref:`data` will be:: - - {"chat_id": 1, "text": "Hello world!", "custom": "arg"} - - rate_limit_args (:obj:`None` | :class:`object`): Custom arguments passed to the methods - of :class:`~telegram.ext.ExtBot`. Can e.g. be used to specify the priority of - the request. - - Returns: - :obj:`bool` | dict[:obj:`str`, :obj:`object`] | :obj:`None`: The result of the - callback function. - """ diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_baseupdateprocessor.py b/venv/lib/python3.12/site-packages/telegram/ext/_baseupdateprocessor.py deleted file mode 100644 index c08afec..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_baseupdateprocessor.py +++ /dev/null @@ -1,201 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the BaseProcessor class.""" -from abc import ABC, abstractmethod -from contextlib import AbstractAsyncContextManager -from types import TracebackType -from typing import TYPE_CHECKING, Any, Optional, TypeVar, final - -from telegram.ext._utils.asyncio import TrackedBoundedSemaphore - -if TYPE_CHECKING: - from collections.abc import Awaitable - -_BUPT = TypeVar("_BUPT", bound="BaseUpdateProcessor") - - -class BaseUpdateProcessor(AbstractAsyncContextManager["BaseUpdateProcessor"], ABC): - """An abstract base class for update processors. You can use this class to implement - your own update processor. - - Instances of this class can be used as asyncio context managers, where - - .. code:: python - - async with processor: - # code - - is roughly equivalent to - - .. code:: python - - try: - await processor.initialize() - # code - finally: - await processor.shutdown() - - .. seealso:: :meth:`__aenter__` and :meth:`__aexit__`. - - .. seealso:: :wiki:`Concurrency` - - .. versionadded:: 20.4 - - Args: - max_concurrent_updates (:obj:`int`): The maximum number of updates to be processed - concurrently. If this number is exceeded, new updates will be queued until the number - of currently processed updates decreases. - - Raises: - :exc:`ValueError`: If :paramref:`max_concurrent_updates` is a non-positive integer. - """ - - __slots__ = ("_max_concurrent_updates", "_semaphore") - - def __init__(self, max_concurrent_updates: int): - self._max_concurrent_updates = max_concurrent_updates - if self.max_concurrent_updates < 1: - raise ValueError("`max_concurrent_updates` must be a positive integer!") - self._semaphore = TrackedBoundedSemaphore(self.max_concurrent_updates) - - async def __aenter__(self: _BUPT) -> _BUPT: - """|async_context_manager| :meth:`initializes <initialize>` the Processor. - - Returns: - The initialized Processor instance. - - Raises: - :exc:`Exception`: If an exception is raised during initialization, :meth:`shutdown` - is called in this case. - """ - try: - await self.initialize() - except Exception: - await self.shutdown() - raise - return self - - async def __aexit__( - self, - exc_type: Optional[type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - """|async_context_manager| :meth:`shuts down <shutdown>` the Processor.""" - await self.shutdown() - - @property - def max_concurrent_updates(self) -> int: - """:obj:`int`: The maximum number of updates that can be processed concurrently.""" - return self._max_concurrent_updates - - @property - def current_concurrent_updates(self) -> int: - """:obj:`int`: The number of updates currently being processed. - - Caution: - This value is a snapshot of the current number of updates being processed. It may - change immediately after being read. - - .. versionadded:: 21.11 - """ - return self.max_concurrent_updates - self._semaphore.current_value - - @abstractmethod - async def do_process_update( - self, - update: object, - coroutine: "Awaitable[Any]", - ) -> None: - """Custom implementation of how to process an update. Must be implemented by a subclass. - - Warning: - This method will be called by :meth:`process_update`. It should *not* be called - manually. - - Args: - update (:obj:`object`): The update to be processed. - coroutine (:term:`Awaitable`): The coroutine that will be awaited to process the - update. - """ - - @abstractmethod - async def initialize(self) -> None: - """Initializes the processor so resources can be allocated. Must be implemented by a - subclass. - - .. seealso:: - :meth:`shutdown` - """ - - @abstractmethod - async def shutdown(self) -> None: - """Shutdown the processor so resources can be freed. Must be implemented by a subclass. - - .. seealso:: - :meth:`initialize` - """ - - @final - async def process_update( - self, - update: object, - coroutine: "Awaitable[Any]", - ) -> None: - """Calls :meth:`do_process_update` with a semaphore to limit the number of concurrent - updates. - - Args: - update (:obj:`object`): The update to be processed. - coroutine (:term:`Awaitable`): The coroutine that will be awaited to process the - update. - """ - async with self._semaphore: - await self.do_process_update(update, coroutine) - - -class SimpleUpdateProcessor(BaseUpdateProcessor): - """Instance of :class:`telegram.ext.BaseUpdateProcessor` that immediately awaits the - coroutine, i.e. does not apply any additional processing. This is used by default when - :attr:`telegram.ext.ApplicationBuilder.concurrent_updates` is :obj:`int`. - - .. versionadded:: 20.4 - """ - - __slots__ = () - - async def do_process_update( - self, - update: object, # noqa: ARG002 - coroutine: "Awaitable[Any]", - ) -> None: - """Immediately awaits the coroutine, i.e. does not apply any additional processing. - - Args: - update (:obj:`object`): The update to be processed. - coroutine (:term:`Awaitable`): The coroutine that will be awaited to process the - update. - """ - await coroutine - - async def initialize(self) -> None: - """Does nothing.""" - - async def shutdown(self) -> None: - """Does nothing.""" diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_callbackcontext.py b/venv/lib/python3.12/site-packages/telegram/ext/_callbackcontext.py deleted file mode 100644 index 66901be..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_callbackcontext.py +++ /dev/null @@ -1,429 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the CallbackContext class.""" - -from collections.abc import Awaitable, Generator -from re import Match -from typing import TYPE_CHECKING, Any, Generic, NoReturn, Optional, TypeVar, Union - -from telegram._callbackquery import CallbackQuery -from telegram._update import Update -from telegram._utils.warnings import warn -from telegram.ext._extbot import ExtBot -from telegram.ext._utils.types import BD, BT, CD, UD - -if TYPE_CHECKING: - from asyncio import Future, Queue - - from telegram.ext import Application, Job, JobQueue - from telegram.ext._utils.types import CCT - -_STORING_DATA_WIKI = ( - "https://github.com/python-telegram-bot/python-telegram-bot" - "/wiki/Storing-bot%2C-user-and-chat-related-data" -) - -# something like poor mans "typing.Self" for py<3.11 -ST = TypeVar("ST", bound="CallbackContext[Any, Any, Any, Any]") - - -class CallbackContext(Generic[BT, UD, CD, BD]): - """ - This is a context object passed to the callback called by :class:`telegram.ext.BaseHandler` - or by the :class:`telegram.ext.Application` in an error handler added by - :attr:`telegram.ext.Application.add_error_handler` or to the callback of a - :class:`telegram.ext.Job`. - - Note: - :class:`telegram.ext.Application` will create a single context for an entire update. This - means that if you got 2 handlers in different groups and they both get called, they will - receive the same :class:`CallbackContext` object (of course with proper attributes like - :attr:`matches` differing). This allows you to add custom attributes in a lower handler - group callback, and then subsequently access those attributes in a higher handler group - callback. Note that the attributes on :class:`CallbackContext` might change in the future, - so make sure to use a fairly unique name for the attributes. - - Warning: - Do not combine custom attributes with :paramref:`telegram.ext.BaseHandler.block` set to - :obj:`False` or :attr:`telegram.ext.Application.concurrent_updates` set to - :obj:`True`. Due to how those work, it will almost certainly execute the callbacks for an - update out of order, and the attributes that you think you added will not be present. - - This class is a :class:`~typing.Generic` class and accepts four type variables: - - 1. The type of :attr:`bot`. Must be :class:`telegram.Bot` or a subclass of that class. - 2. The type of :attr:`user_data` (if :attr:`user_data` is not :obj:`None`). - 3. The type of :attr:`chat_data` (if :attr:`chat_data` is not :obj:`None`). - 4. The type of :attr:`bot_data` (if :attr:`bot_data` is not :obj:`None`). - - Examples: - * :any:`Context Types Bot <examples.contexttypesbot>` - * :any:`Custom Webhook Bot <examples.customwebhookbot>` - - .. seealso:: :attr:`telegram.ext.ContextTypes.DEFAULT_TYPE`, - :wiki:`Job Queue <Extensions---JobQueue>` - - Args: - application (:class:`telegram.ext.Application`): The application associated with this - context. - chat_id (:obj:`int`, optional): The ID of the chat associated with this object. Used - to provide :attr:`chat_data`. - - .. versionadded:: 20.0 - user_id (:obj:`int`, optional): The ID of the user associated with this object. Used - to provide :attr:`user_data`. - - .. versionadded:: 20.0 - Attributes: - coroutine (:term:`awaitable`): Optional. Only present in error handlers if the - error was caused by an awaitable run with :meth:`Application.create_task` or a handler - callback with :attr:`block=False <BaseHandler.block>`. - matches (list[:meth:`re.Match <re.Match.expand>`]): Optional. If the associated update - originated from a :class:`filters.Regex`, this will contain a list of match objects for - every pattern where ``re.search(pattern, string)`` returned a match. Note that filters - short circuit, so combined regex filters will not always be evaluated. - args (list[:obj:`str`]): Optional. Arguments passed to a command if the associated update - is handled by :class:`telegram.ext.CommandHandler`, :class:`telegram.ext.PrefixHandler` - or :class:`telegram.ext.StringCommandHandler`. It contains a list of the words in the - text after the command, using any whitespace string as a delimiter. - error (:exc:`Exception`): Optional. The error that was raised. Only present when passed - to an error handler registered with :attr:`telegram.ext.Application.add_error_handler`. - job (:class:`telegram.ext.Job`): Optional. The job which originated this callback. - Only present when passed to the callback of :class:`telegram.ext.Job` or in error - handlers if the error is caused by a job. - - .. versionchanged:: 20.0 - :attr:`job` is now also present in error handlers if the error is caused by a job. - - """ - - __slots__ = ( - "__dict__", - "_application", - "_chat_id", - "_user_id", - "args", - "coroutine", - "error", - "job", - "matches", - ) - - def __init__( - self: ST, - application: "Application[BT, ST, UD, CD, BD, Any]", - chat_id: Optional[int] = None, - user_id: Optional[int] = None, - ): - self._application: Application[BT, ST, UD, CD, BD, Any] = application - self._chat_id: Optional[int] = chat_id - self._user_id: Optional[int] = user_id - self.args: Optional[list[str]] = None - self.matches: Optional[list[Match[str]]] = None - self.error: Optional[Exception] = None - self.job: Optional[Job[Any]] = None - self.coroutine: Optional[ - Union[Generator[Optional[Future[object]], None, Any], Awaitable[Any]] - ] = None - - @property - def application(self) -> "Application[BT, ST, UD, CD, BD, Any]": - """:class:`telegram.ext.Application`: The application associated with this context.""" - return self._application # type: ignore[return-value] - - @property - def bot_data(self) -> BD: - """:obj:`ContextTypes.bot_data`: Optional. An object that can be used to keep any data in. - For each update it will be the same :attr:`ContextTypes.bot_data`. Defaults to :obj:`dict`. - - .. seealso:: :wiki:`Storing Bot, User and Chat Related Data\ - <Storing-bot%2C-user-and-chat-related-data>` - """ - return self.application.bot_data - - @bot_data.setter - def bot_data(self, _: object) -> NoReturn: - raise AttributeError( - f"You can not assign a new value to bot_data, see {_STORING_DATA_WIKI}" - ) - - @property - def chat_data(self) -> Optional[CD]: - """:obj:`ContextTypes.chat_data`: Optional. An object that can be used to keep any data in. - For each update from the same chat id it will be the same :obj:`ContextTypes.chat_data`. - Defaults to :obj:`dict`. - - Warning: - When a group chat migrates to a supergroup, its chat id will change and the - ``chat_data`` needs to be transferred. For details see our - :wiki:`wiki page <Storing-bot,-user-and-chat-related-data#chat-migration>`. - - .. seealso:: :wiki:`Storing Bot, User and Chat Related Data\ - <Storing-bot%2C-user-and-chat-related-data>` - - .. versionchanged:: 20.0 - The chat data is now also present in error handlers if the error is caused by a job. - """ - if self._chat_id is not None: - return self._application.chat_data[self._chat_id] - return None - - @chat_data.setter - def chat_data(self, _: object) -> NoReturn: - raise AttributeError( - f"You can not assign a new value to chat_data, see {_STORING_DATA_WIKI}" - ) - - @property - def user_data(self) -> Optional[UD]: - """:obj:`ContextTypes.user_data`: Optional. An object that can be used to keep any data in. - For each update from the same user it will be the same :obj:`ContextTypes.user_data`. - Defaults to :obj:`dict`. - - .. seealso:: :wiki:`Storing Bot, User and Chat Related Data\ - <Storing-bot%2C-user-and-chat-related-data>` - - .. versionchanged:: 20.0 - The user data is now also present in error handlers if the error is caused by a job. - """ - if self._user_id is not None: - return self._application.user_data[self._user_id] - return None - - @user_data.setter - def user_data(self, _: object) -> NoReturn: - raise AttributeError( - f"You can not assign a new value to user_data, see {_STORING_DATA_WIKI}" - ) - - async def refresh_data(self) -> None: - """If :attr:`application` uses persistence, calls - :meth:`telegram.ext.BasePersistence.refresh_bot_data` on :attr:`bot_data`, - :meth:`telegram.ext.BasePersistence.refresh_chat_data` on :attr:`chat_data` and - :meth:`telegram.ext.BasePersistence.refresh_user_data` on :attr:`user_data`, if - appropriate. - - Will be called by :meth:`telegram.ext.Application.process_update` and - :meth:`telegram.ext.Job.run`. - - .. versionadded:: 13.6 - """ - if self.application.persistence: - if self.application.persistence.store_data.bot_data: - await self.application.persistence.refresh_bot_data(self.bot_data) - if self.application.persistence.store_data.chat_data and self._chat_id is not None: - await self.application.persistence.refresh_chat_data( - chat_id=self._chat_id, - chat_data=self.chat_data, # type: ignore[arg-type] - ) - if self.application.persistence.store_data.user_data and self._user_id is not None: - await self.application.persistence.refresh_user_data( - user_id=self._user_id, - user_data=self.user_data, # type: ignore[arg-type] - ) - - def drop_callback_data(self, callback_query: CallbackQuery) -> None: - """ - Deletes the cached data for the specified callback query. - - .. versionadded:: 13.6 - - Note: - Will *not* raise exceptions in case the data is not found in the cache. - *Will* raise :exc:`KeyError` in case the callback query can not be found in the cache. - - .. seealso:: :wiki:`Arbitrary callback_data <Arbitrary-callback_data>` - - Args: - callback_query (:class:`telegram.CallbackQuery`): The callback query. - - Raises: - KeyError | RuntimeError: :exc:`KeyError`, if the callback query can not be found in - the cache and :exc:`RuntimeError`, if the bot doesn't allow for arbitrary - callback data. - """ - if isinstance(self.bot, ExtBot): - if self.bot.callback_data_cache is None: - raise RuntimeError( - "This telegram.ext.ExtBot instance does not use arbitrary callback data." - ) - self.bot.callback_data_cache.drop_data(callback_query) - else: - raise RuntimeError( # noqa: TRY004 - "telegram.Bot does not allow for arbitrary callback data." - ) - - @classmethod - def from_error( - cls: type["CCT"], - update: object, - error: Exception, - application: "Application[BT, CCT, UD, CD, BD, Any]", - job: Optional["Job[Any]"] = None, - coroutine: Optional[ - Union[Generator[Optional["Future[object]"], None, Any], Awaitable[Any]] - ] = None, - ) -> "CCT": - """ - Constructs an instance of :class:`telegram.ext.CallbackContext` to be passed to the error - handlers. - - .. seealso:: :meth:`telegram.ext.Application.add_error_handler` - - .. versionchanged:: 20.0 - Removed arguments ``async_args`` and ``async_kwargs``. - - Args: - update (:obj:`object` | :class:`telegram.Update`): The update associated with the - error. May be :obj:`None`, e.g. for errors in job callbacks. - error (:obj:`Exception`): The error. - application (:class:`telegram.ext.Application`): The application associated with this - context. - job (:class:`telegram.ext.Job`, optional): The job associated with the error. - - .. versionadded:: 20.0 - coroutine (:term:`awaitable`, optional): The awaitable associated - with this error if the error was caused by a coroutine run with - :meth:`Application.create_task` or a handler callback with - :attr:`block=False <BaseHandler.block>`. - - .. versionadded:: 20.0 - - .. versionchanged:: 20.2 - Accepts :class:`asyncio.Future` and generator-based coroutine functions. - Returns: - :class:`telegram.ext.CallbackContext` - """ - # update and job will never be present at the same time - if update is not None: - self = cls.from_update(update, application) - elif job is not None: - self = cls.from_job(job, application) - else: - self = cls(application) # type: ignore - - self.error = error - self.coroutine = coroutine - return self - - @classmethod - def from_update( - cls: type["CCT"], - update: object, - application: "Application[Any, CCT, Any, Any, Any, Any]", - ) -> "CCT": - """ - Constructs an instance of :class:`telegram.ext.CallbackContext` to be passed to the - handlers. - - .. seealso:: :meth:`telegram.ext.Application.add_handler` - - Args: - update (:obj:`object` | :class:`telegram.Update`): The update. - application (:class:`telegram.ext.Application`): The application associated with this - context. - - Returns: - :class:`telegram.ext.CallbackContext` - """ - if isinstance(update, Update): - chat = update.effective_chat - user = update.effective_user - - chat_id = chat.id if chat else None - user_id = user.id if user else None - - return cls(application, chat_id=chat_id, user_id=user_id) # type: ignore - return cls(application) # type: ignore - - @classmethod - def from_job( - cls: type["CCT"], - job: "Job[CCT]", - application: "Application[Any, CCT, Any, Any, Any, Any]", - ) -> "CCT": - """ - Constructs an instance of :class:`telegram.ext.CallbackContext` to be passed to a - job callback. - - .. seealso:: :meth:`telegram.ext.JobQueue` - - Args: - job (:class:`telegram.ext.Job`): The job. - application (:class:`telegram.ext.Application`): The application associated with this - context. - - Returns: - :class:`telegram.ext.CallbackContext` - """ - self = cls(application, chat_id=job.chat_id, user_id=job.user_id) # type: ignore - self.job = job - return self - - def update(self, data: dict[str, object]) -> None: - """Updates ``self.__slots__`` with the passed data. - - Args: - data (dict[:obj:`str`, :obj:`object`]): The data. - """ - for key, value in data.items(): - setattr(self, key, value) - - @property - def bot(self) -> BT: - """:class:`telegram.Bot`: The bot associated with this context.""" - return self._application.bot - - @property - def job_queue(self) -> Optional["JobQueue[ST]"]: - """ - :class:`telegram.ext.JobQueue`: The :class:`JobQueue` used by the - :class:`telegram.ext.Application`. - - .. seealso:: :wiki:`Job Queue <Extensions---JobQueue>` - """ - if self._application._job_queue is None: # pylint: disable=protected-access - warn( - "No `JobQueue` set up. To use `JobQueue`, you must install PTB via " - '`pip install "python-telegram-bot[job-queue]"`.', - stacklevel=2, - ) - return self._application._job_queue # pylint: disable=protected-access - - @property - def update_queue(self) -> "Queue[object]": - """ - :class:`asyncio.Queue`: The :class:`asyncio.Queue` instance used by the - :class:`telegram.ext.Application` and (usually) the :class:`telegram.ext.Updater` - associated with this context. - - """ - return self._application.update_queue - - @property - def match(self) -> Optional[Match[str]]: - """ - :meth:`re.Match <re.Match.expand>`: The first match from :attr:`matches`. - Useful if you are only filtering using a single regex filter. - Returns :obj:`None` if :attr:`matches` is empty. - """ - try: - return self.matches[0] # type: ignore[index] # pylint: disable=unsubscriptable-object - except (IndexError, TypeError): - return None diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_callbackdatacache.py b/venv/lib/python3.12/site-packages/telegram/ext/_callbackdatacache.py deleted file mode 100644 index a24befd..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_callbackdatacache.py +++ /dev/null @@ -1,469 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the CallbackDataCache class.""" -import datetime as dtm -import time -from collections.abc import MutableMapping -from typing import TYPE_CHECKING, Any, Optional, Union, cast -from uuid import uuid4 - -try: - from cachetools import LRUCache - - CACHE_TOOLS_AVAILABLE = True -except ImportError: - CACHE_TOOLS_AVAILABLE = False - - -import contextlib - -from telegram import CallbackQuery, InlineKeyboardButton, InlineKeyboardMarkup, Message, User -from telegram._utils.datetime import to_float_timestamp -from telegram.error import TelegramError -from telegram.ext._utils.types import CDCData - -if TYPE_CHECKING: - from telegram.ext import ExtBot - - -class InvalidCallbackData(TelegramError): - """ - Raised when the received callback data has been tampered with or deleted from cache. - - Examples: - :any:`Arbitrary Callback Data Bot <examples.arbitrarycallbackdatabot>` - - .. seealso:: :wiki:`Arbitrary callback_data <Arbitrary-callback_data>` - - .. versionadded:: 13.6 - - Args: - callback_data (:obj:`int`, optional): The button data of which the callback data could not - be found. - - Attributes: - callback_data (:obj:`int`): Optional. The button data of which the callback data could not - be found. - """ - - __slots__ = ("callback_data",) - - def __init__(self, callback_data: Optional[str] = None) -> None: - super().__init__( - "The object belonging to this callback_data was deleted or the callback_data was " - "manipulated." - ) - self.callback_data: Optional[str] = callback_data - - def __reduce__(self) -> tuple[type, tuple[Optional[str]]]: # type: ignore[override] - """Defines how to serialize the exception for pickle. See - :py:meth:`object.__reduce__` for more info. - - Returns: - :obj:`tuple` - """ - return self.__class__, (self.callback_data,) - - -class _KeyboardData: - __slots__ = ("access_time", "button_data", "keyboard_uuid") - - def __init__( - self, - keyboard_uuid: str, - access_time: Optional[float] = None, - button_data: Optional[dict[str, object]] = None, - ): - self.keyboard_uuid = keyboard_uuid - self.button_data = button_data or {} - self.access_time = access_time or time.time() - - def update_access_time(self) -> None: - """Updates the access time with the current time.""" - self.access_time = time.time() - - def to_tuple(self) -> tuple[str, float, dict[str, object]]: - """Gives a tuple representation consisting of the keyboard uuid, the access time and the - button data. - """ - return self.keyboard_uuid, self.access_time, self.button_data - - -class CallbackDataCache: - """A custom cache for storing the callback data of a :class:`telegram.ext.ExtBot`. Internally, - it keeps two mappings with fixed maximum size: - - * One for mapping the data received in callback queries to the cached objects - * One for mapping the IDs of received callback queries to the cached objects - - The second mapping allows to manually drop data that has been cached for keyboards of messages - sent via inline mode. - If necessary, will drop the least recently used items. - - Important: - If you want to use this class, you must install PTB with the optional requirement - ``callback-data``, i.e. - - .. code-block:: bash - - pip install "python-telegram-bot[callback-data]" - - Examples: - :any:`Arbitrary Callback Data Bot <examples.arbitrarycallbackdatabot>` - - .. seealso:: :wiki:`Architecture Overview <Architecture>`, - :wiki:`Arbitrary callback_data <Arbitrary-callback_data>` - - .. versionadded:: 13.6 - - .. versionchanged:: 20.0 - To use this class, PTB must be installed via - ``pip install "python-telegram-bot[callback-data]"``. - - Args: - bot (:class:`telegram.ext.ExtBot`): The bot this cache is for. - maxsize (:obj:`int`, optional): Maximum number of items in each of the internal mappings. - Defaults to ``1024``. - - persistent_data (tuple[list[tuple[:obj:`str`, :obj:`float`, \ - dict[:obj:`str`, :class:`object`]]], dict[:obj:`str`, :obj:`str`]], optional): \ - Data to initialize the cache with, as returned by \ - :meth:`telegram.ext.BasePersistence.get_callback_data`. - - Attributes: - bot (:class:`telegram.ext.ExtBot`): The bot this cache is for. - - """ - - __slots__ = ("_callback_queries", "_keyboard_data", "_maxsize", "bot") - - def __init__( - self, - bot: "ExtBot[Any]", - maxsize: int = 1024, - persistent_data: Optional[CDCData] = None, - ): - if not CACHE_TOOLS_AVAILABLE: - raise RuntimeError( - "To use `CallbackDataCache`, PTB must be installed via `pip install " - '"python-telegram-bot[callback-data]"`.' - ) - - self.bot: ExtBot[Any] = bot - self._maxsize: int = maxsize - self._keyboard_data: MutableMapping[str, _KeyboardData] = LRUCache(maxsize=maxsize) - self._callback_queries: MutableMapping[str, str] = LRUCache(maxsize=maxsize) - - if persistent_data: - self.load_persistence_data(persistent_data) - - def load_persistence_data(self, persistent_data: CDCData) -> None: - """Loads data into the cache. - - Warning: - This method is not intended to be called by users directly. - - .. versionadded:: 20.0 - - Args: - persistent_data (tuple[list[tuple[:obj:`str`, :obj:`float`, \ - dict[:obj:`str`, :class:`object`]]], dict[:obj:`str`, :obj:`str`]], optional): \ - Data to load, as returned by \ - :meth:`telegram.ext.BasePersistence.get_callback_data`. - """ - keyboard_data, callback_queries = persistent_data - for key, value in callback_queries.items(): - self._callback_queries[key] = value - for uuid, access_time, data in keyboard_data: - self._keyboard_data[uuid] = _KeyboardData( - keyboard_uuid=uuid, access_time=access_time, button_data=data - ) - - @property - def maxsize(self) -> int: - """:obj:`int`: The maximum size of the cache. - - .. versionchanged:: 20.0 - This property is now read-only. - """ - return self._maxsize - - @property - def persistence_data(self) -> CDCData: - """tuple[list[tuple[:obj:`str`, :obj:`float`, dict[:obj:`str`, :class:`object`]]], - dict[:obj:`str`, :obj:`str`]]: The data that needs to be persisted to allow - caching callback data across bot reboots. - """ - # While building a list/dict from the LRUCaches has linear runtime (in the number of - # entries), the runtime is bounded by maxsize and it has the big upside of not throwing a - # highly customized data structure at users trying to implement a custom persistence class - return [data.to_tuple() for data in self._keyboard_data.values()], dict( - self._callback_queries.items() - ) - - def process_keyboard(self, reply_markup: InlineKeyboardMarkup) -> InlineKeyboardMarkup: - """Registers the reply markup to the cache. If any of the buttons have - :attr:`~telegram.InlineKeyboardButton.callback_data`, stores that data and builds a new - keyboard with the correspondingly replaced buttons. Otherwise, does nothing and returns - the original reply markup. - - Args: - reply_markup (:class:`telegram.InlineKeyboardMarkup`): The keyboard. - - Returns: - :class:`telegram.InlineKeyboardMarkup`: The keyboard to be passed to Telegram. - - """ - keyboard_uuid = uuid4().hex - keyboard_data = _KeyboardData(keyboard_uuid) - - # Built a new nested list of buttons by replacing the callback data if needed - buttons = [ - [ - ( - # We create a new button instead of replacing callback_data in case the - # same object is used elsewhere - InlineKeyboardButton( - btn.text, - callback_data=self.__put_button(btn.callback_data, keyboard_data), - ) - if btn.callback_data - else btn - ) - for btn in column - ] - for column in reply_markup.inline_keyboard - ] - - if not keyboard_data.button_data: - # If we arrive here, no data had to be replaced and we can return the input - return reply_markup - - self._keyboard_data[keyboard_uuid] = keyboard_data - return InlineKeyboardMarkup(buttons) - - @staticmethod - def __put_button(callback_data: object, keyboard_data: _KeyboardData) -> str: - """Stores the data for a single button in :attr:`keyboard_data`. - Returns the string that should be passed instead of the callback_data, which is - ``keyboard_uuid + button_uuids``. - """ - uuid = uuid4().hex - keyboard_data.button_data[uuid] = callback_data - return f"{keyboard_data.keyboard_uuid}{uuid}" - - def __get_keyboard_uuid_and_button_data( - self, callback_data: str - ) -> Union[tuple[str, object], tuple[None, InvalidCallbackData]]: - keyboard, button = self.extract_uuids(callback_data) - try: - # we get the values before calling update() in case KeyErrors are raised - # we don't want to update in that case - keyboard_data = self._keyboard_data[keyboard] - button_data = keyboard_data.button_data[button] - # Update the timestamp for the LRU - keyboard_data.update_access_time() - except KeyError: - return None, InvalidCallbackData(callback_data) - return keyboard, button_data - - @staticmethod - def extract_uuids(callback_data: str) -> tuple[str, str]: - """Extracts the keyboard uuid and the button uuid from the given :paramref:`callback_data`. - - Args: - callback_data (:obj:`str`): The - :paramref:`~telegram.InlineKeyboardButton.callback_data` as present in the button. - - Returns: - (:obj:`str`, :obj:`str`): Tuple of keyboard and button uuid - - """ - # Extract the uuids as put in __put_button - return callback_data[:32], callback_data[32:] - - def process_message(self, message: Message) -> None: - """Replaces the data in the inline keyboard attached to the message with the cached - objects, if necessary. If the data could not be found, - :class:`telegram.ext.InvalidCallbackData` will be inserted. - - Note: - Checks :attr:`telegram.Message.via_bot` and :attr:`telegram.Message.from_user` to check - if the reply markup (if any) was actually sent by this cache's bot. If it was not, the - message will be returned unchanged. - - Note that this will fail for channel posts, as :attr:`telegram.Message.from_user` is - :obj:`None` for those! In the corresponding reply markups the callback data will be - replaced by :class:`telegram.ext.InvalidCallbackData`. - - Warning: - * Does *not* consider :attr:`telegram.Message.reply_to_message` and - :attr:`telegram.Message.pinned_message`. Pass them to this method separately. - * *In place*, i.e. the passed :class:`telegram.Message` will be changed! - - Args: - message (:class:`telegram.Message`): The message. - - """ - self.__process_message(message) - - def __process_message(self, message: Message) -> Optional[str]: - """As documented in process_message, but returns the uuid of the attached keyboard, if any, - which is relevant for process_callback_query. - - **IN PLACE** - """ - if not message.reply_markup: - return None - - if message.via_bot: - sender: Optional[User] = message.via_bot - elif message.from_user: - sender = message.from_user - else: - sender = None - - if sender is not None and sender != self.bot.bot: - return None - - keyboard_uuid = None - - for row in message.reply_markup.inline_keyboard: - for button in row: - if button.callback_data: - button_data = cast("str", button.callback_data) - keyboard_id, callback_data = self.__get_keyboard_uuid_and_button_data( - button_data - ) - # update_callback_data makes sure that the _id_attrs are updated - button.update_callback_data(callback_data) - - # This is lazy loaded. The firsts time we find a button - # we load the associated keyboard - afterwards, there is - if not keyboard_uuid and not isinstance(callback_data, InvalidCallbackData): - keyboard_uuid = keyboard_id - - return keyboard_uuid - - def process_callback_query(self, callback_query: CallbackQuery) -> None: - """Replaces the data in the callback query and the attached messages keyboard with the - cached objects, if necessary. If the data could not be found, - :class:`telegram.ext.InvalidCallbackData` will be inserted. - If :attr:`telegram.CallbackQuery.data` or :attr:`telegram.CallbackQuery.message` is - present, this also saves the callback queries ID in order to be able to resolve it to the - stored data. - - Note: - Also considers inserts data into the buttons of - :attr:`telegram.Message.reply_to_message` and :attr:`telegram.Message.pinned_message` - if necessary. - - Warning: - *In place*, i.e. the passed :class:`telegram.CallbackQuery` will be changed! - - Args: - callback_query (:class:`telegram.CallbackQuery`): The callback query. - - """ - mapped = False - - if callback_query.data: - data = callback_query.data - - # Get the cached callback data for the CallbackQuery - keyboard_uuid, button_data = self.__get_keyboard_uuid_and_button_data(data) - with callback_query._unfrozen(): - callback_query.data = button_data # type: ignore[assignment] - - # Map the callback queries ID to the keyboards UUID for later use - if not mapped and not isinstance(button_data, InvalidCallbackData): - self._callback_queries[callback_query.id] = keyboard_uuid # type: ignore - mapped = True - - # Get the cached callback data for the inline keyboard attached to the - # CallbackQuery. - if isinstance(callback_query.message, Message): - self.__process_message(callback_query.message) - for maybe_message in ( - callback_query.message.pinned_message, - callback_query.message.reply_to_message, - ): - if isinstance(maybe_message, Message): - self.__process_message(maybe_message) - - def drop_data(self, callback_query: CallbackQuery) -> None: - """Deletes the data for the specified callback query. - - Note: - Will *not* raise exceptions in case the callback data is not found in the cache. - *Will* raise :exc:`KeyError` in case the callback query can not be found in the - cache. - - Args: - callback_query (:class:`telegram.CallbackQuery`): The callback query. - - Raises: - KeyError: If the callback query can not be found in the cache - """ - try: - keyboard_uuid = self._callback_queries.pop(callback_query.id) - self.__drop_keyboard(keyboard_uuid) - except KeyError as exc: - raise KeyError("CallbackQuery was not found in cache.") from exc - - def __drop_keyboard(self, keyboard_uuid: str) -> None: - with contextlib.suppress(KeyError): - self._keyboard_data.pop(keyboard_uuid) - - def clear_callback_data( - self, time_cutoff: Optional[Union[float, dtm.datetime]] = None - ) -> None: - """Clears the stored callback data. - - Args: - time_cutoff (:obj:`float` | :obj:`datetime.datetime`, optional): Pass a UNIX timestamp - or a :obj:`datetime.datetime` to clear only entries which are older. - |tz-naive-dtms| - - """ - self.__clear(self._keyboard_data, time_cutoff=time_cutoff) - - def clear_callback_queries(self) -> None: - """Clears the stored callback query IDs.""" - self.__clear(self._callback_queries) - - def __clear( - self, mapping: MutableMapping, time_cutoff: Optional[Union[float, dtm.datetime]] = None - ) -> None: - if not time_cutoff: - mapping.clear() - return - - if isinstance(time_cutoff, dtm.datetime): - effective_cutoff = to_float_timestamp( - time_cutoff, tzinfo=self.bot.defaults.tzinfo if self.bot.defaults else None - ) - else: - effective_cutoff = time_cutoff - - # We need a list instead of a generator here, as the list doesn't change it's size - # during the iteration - to_drop = [key for key, data in mapping.items() if data.access_time < effective_cutoff] - for key in to_drop: - mapping.pop(key) diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_contexttypes.py b/venv/lib/python3.12/site-packages/telegram/ext/_contexttypes.py deleted file mode 100644 index 2d3a8b3..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_contexttypes.py +++ /dev/null @@ -1,226 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the auxiliary class ContextTypes.""" -from typing import Any, Generic, overload - -from telegram.ext._callbackcontext import CallbackContext -from telegram.ext._extbot import ExtBot -from telegram.ext._utils.types import BD, CCT, CD, UD - -ADict = dict[Any, Any] - - -class ContextTypes(Generic[CCT, UD, CD, BD]): - """ - Convenience class to gather customizable types of the :class:`telegram.ext.CallbackContext` - interface. - - Examples: - :any:`ContextTypes Bot <examples.contexttypesbot>` - - .. seealso:: :wiki:`Architecture Overview <Architecture>`, - :wiki:`Storing Bot, User and Chat Related Data <Storing-bot%2C-user-and-chat-related-data>` - - .. versionadded:: 13.6 - - Args: - context (:obj:`type`, optional): Determines the type of the ``context`` argument of all - (error-)handler callbacks and job callbacks. Must be a subclass of - :class:`telegram.ext.CallbackContext`. Defaults to - :class:`telegram.ext.CallbackContext`. - bot_data (:obj:`type`, optional): Determines the type of - :attr:`context.bot_data <CallbackContext.bot_data>` of all (error-)handler callbacks - and job callbacks. Defaults to :obj:`dict`. Must support instantiating without - arguments. - chat_data (:obj:`type`, optional): Determines the type of - :attr:`context.chat_data <CallbackContext.chat_data>` of all (error-)handler callbacks - and job callbacks. Defaults to :obj:`dict`. Must support instantiating without - arguments. - user_data (:obj:`type`, optional): Determines the type of - :attr:`context.user_data <CallbackContext.user_data>` of all (error-)handler callbacks - and job callbacks. Defaults to :obj:`dict`. Must support instantiating without - arguments. - - """ - - DEFAULT_TYPE = CallbackContext[ExtBot[None], ADict, ADict, ADict] - """Shortcut for the type annotation for the ``context`` argument that's correct for the - default settings, i.e. if :class:`telegram.ext.ContextTypes` is not used. - - Example: - .. code:: python - - async def callback(update: Update, context: ContextTypes.DEFAULT_TYPE): - ... - - .. versionadded: 20.0 - """ - - __slots__ = ("_bot_data", "_chat_data", "_context", "_user_data") - - # overload signatures generated with - # https://gist.github.com/Bibo-Joshi/399382cda537fb01bd86b13c3d03a956 - - @overload - def __init__( - self: "ContextTypes[CallbackContext[ExtBot[Any], ADict, ADict, ADict], ADict, ADict, ADict]", # pylint: disable=line-too-long # noqa: E501 - ): ... - - @overload - def __init__(self: "ContextTypes[CCT, ADict, ADict, ADict]", context: type[CCT]): ... - - @overload - def __init__( - self: "ContextTypes[CallbackContext[ExtBot[Any], UD, ADict, ADict], UD, ADict, ADict]", - user_data: type[UD], - ): ... - - @overload - def __init__( - self: "ContextTypes[CallbackContext[ExtBot[Any], ADict, CD, ADict], ADict, CD, ADict]", - chat_data: type[CD], - ): ... - - @overload - def __init__( - self: "ContextTypes[CallbackContext[ExtBot[Any], ADict, ADict, BD], ADict, ADict, BD]", - bot_data: type[BD], - ): ... - - @overload - def __init__( - self: "ContextTypes[CCT, UD, ADict, ADict]", context: type[CCT], user_data: type[UD] - ): ... - - @overload - def __init__( - self: "ContextTypes[CCT, ADict, CD, ADict]", context: type[CCT], chat_data: type[CD] - ): ... - - @overload - def __init__( - self: "ContextTypes[CCT, ADict, ADict, BD]", context: type[CCT], bot_data: type[BD] - ): ... - - @overload - def __init__( - self: "ContextTypes[CallbackContext[ExtBot[Any], UD, CD, ADict], UD, CD, ADict]", - user_data: type[UD], - chat_data: type[CD], - ): ... - - @overload - def __init__( - self: "ContextTypes[CallbackContext[ExtBot[Any], UD, ADict, BD], UD, ADict, BD]", - user_data: type[UD], - bot_data: type[BD], - ): ... - - @overload - def __init__( - self: "ContextTypes[CallbackContext[ExtBot[Any], ADict, CD, BD], ADict, CD, BD]", - chat_data: type[CD], - bot_data: type[BD], - ): ... - - @overload - def __init__( - self: "ContextTypes[CCT, UD, CD, ADict]", - context: type[CCT], - user_data: type[UD], - chat_data: type[CD], - ): ... - - @overload - def __init__( - self: "ContextTypes[CCT, UD, ADict, BD]", - context: type[CCT], - user_data: type[UD], - bot_data: type[BD], - ): ... - - @overload - def __init__( - self: "ContextTypes[CCT, ADict, CD, BD]", - context: type[CCT], - chat_data: type[CD], - bot_data: type[BD], - ): ... - - @overload - def __init__( - self: "ContextTypes[CallbackContext[ExtBot[Any], UD, CD, BD], UD, CD, BD]", - user_data: type[UD], - chat_data: type[CD], - bot_data: type[BD], - ): ... - - @overload - def __init__( - self: "ContextTypes[CCT, UD, CD, BD]", - context: type[CCT], - user_data: type[UD], - chat_data: type[CD], - bot_data: type[BD], - ): ... - - def __init__( # type: ignore[misc] - self, - context: "type[CallbackContext[ExtBot[Any], ADict, ADict, ADict]]" = CallbackContext, - bot_data: type[ADict] = dict, - chat_data: type[ADict] = dict, - user_data: type[ADict] = dict, - ): - if not issubclass(context, CallbackContext): - raise TypeError("context must be a subclass of CallbackContext.") - - # We make all those only accessible via properties because we don't currently support - # changing this at runtime, so overriding the attributes doesn't make sense - self._context = context - self._bot_data = bot_data - self._chat_data = chat_data - self._user_data = user_data - - @property - def context(self) -> type[CCT]: - """The type of the ``context`` argument of all (error-)handler callbacks and job - callbacks. - """ - return self._context # type: ignore[return-value] - - @property - def bot_data(self) -> type[BD]: - """The type of :attr:`context.bot_data <CallbackContext.bot_data>` of all (error-)handler - callbacks and job callbacks. - """ - return self._bot_data # type: ignore[return-value] - - @property - def chat_data(self) -> type[CD]: - """The type of :attr:`context.chat_data <CallbackContext.chat_data>` of all (error-)handler - callbacks and job callbacks. - """ - return self._chat_data # type: ignore[return-value] - - @property - def user_data(self) -> type[UD]: - """The type of :attr:`context.user_data <CallbackContext.user_data>` of all (error-)handler - callbacks and job callbacks. - """ - return self._user_data # type: ignore[return-value] diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_defaults.py b/venv/lib/python3.12/site-packages/telegram/ext/_defaults.py deleted file mode 100644 index d713476..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_defaults.py +++ /dev/null @@ -1,361 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the class Defaults, which allows passing default values to Application.""" -import datetime as dtm -from typing import TYPE_CHECKING, Any, NoReturn, Optional, final - -from telegram._utils.datetime import UTC -from telegram._utils.warnings import warn -from telegram.warnings import PTBDeprecationWarning - -if TYPE_CHECKING: - from telegram import LinkPreviewOptions - - -@final -class Defaults: - """Convenience Class to gather all parameters with a (user defined) default value - - .. seealso:: :wiki:`Architecture Overview <Architecture>`, - :wiki:`Adding Defaults to Your Bot <Adding-defaults-to-your-bot>` - - .. versionchanged:: 20.0 - Removed the argument and attribute ``timeout``. Specify default timeout behavior for the - networking backend directly via :class:`telegram.ext.ApplicationBuilder` instead. - - .. versionchanged:: 22.0 - Removed deprecated arguments and properties ``disable_web_page_preview`` and ``quote``. - Use :paramref:`link_preview_options` and :paramref:`do_quote` instead. - - Parameters: - parse_mode (:obj:`str`, optional): |parse_mode| - disable_notification (:obj:`bool`, optional): |disable_notification| - allow_sending_without_reply (:obj:`bool`, optional): |allow_sending_without_reply|. - Will be used for :attr:`telegram.ReplyParameters.allow_sending_without_reply`. - tzinfo (:class:`datetime.tzinfo`, optional): A timezone to be used for all date(time) - inputs appearing throughout PTB, i.e. if a timezone naive date(time) object is passed - somewhere, it will be assumed to be in :paramref:`tzinfo`. Defaults to - :attr:`datetime.timezone.utc` otherwise. - - .. deprecated:: 21.10 - Support for ``pytz`` timezones is deprecated and will be removed in future - versions. - - block (:obj:`bool`, optional): Default setting for the :paramref:`BaseHandler.block` - parameter - of handlers and error handlers registered through :meth:`Application.add_handler` and - :meth:`Application.add_error_handler`. Defaults to :obj:`True`. - protect_content (:obj:`bool`, optional): |protect_content| - - .. versionadded:: 20.0 - link_preview_options (:class:`telegram.LinkPreviewOptions`, optional): - Link preview generation options for all outgoing messages. Mutually exclusive with - :paramref:`disable_web_page_preview`. - This object is used for the corresponding parameter of - :meth:`telegram.Bot.send_message`, :meth:`telegram.Bot.edit_message_text`, - and :class:`telegram.InputTextMessageContent` if not specified. If a value is specified - for the corresponding parameter, only those parameters of - :class:`telegram.LinkPreviewOptions` will be overridden that are not - explicitly set. - - Example: - - .. code-block:: python - - from telegram import LinkPreviewOptions - from telegram.ext import Defaults, ExtBot - - defaults = Defaults( - link_preview_options=LinkPreviewOptions(show_above_text=True) - ) - chat_id = 123 - - async def main(): - async with ExtBot("Token", defaults=defaults) as bot: - # The link preview will be shown above the text. - await bot.send_message(chat_id, "https://python-telegram-bot.org") - - # The link preview will be shown below the text. - await bot.send_message( - chat_id, - "https://python-telegram-bot.org", - link_preview_options=LinkPreviewOptions(show_above_text=False) - ) - - # The link preview will be shown above the text, but the preview will - # show Telegram. - await bot.send_message( - chat_id, - "https://python-telegram-bot.org", - link_preview_options=LinkPreviewOptions(url="https://telegram.org") - ) - - .. versionadded:: 20.8 - do_quote(:obj:`bool`, optional): |reply_quote| - - .. versionadded:: 20.8 - """ - - __slots__ = ( - "_allow_sending_without_reply", - "_api_defaults", - "_block", - "_disable_notification", - "_do_quote", - "_link_preview_options", - "_parse_mode", - "_protect_content", - "_tzinfo", - ) - - def __init__( - self, - parse_mode: Optional[str] = None, - disable_notification: Optional[bool] = None, - tzinfo: dtm.tzinfo = UTC, - block: bool = True, - allow_sending_without_reply: Optional[bool] = None, - protect_content: Optional[bool] = None, - link_preview_options: Optional["LinkPreviewOptions"] = None, - do_quote: Optional[bool] = None, - ): - self._parse_mode: Optional[str] = parse_mode - self._disable_notification: Optional[bool] = disable_notification - self._allow_sending_without_reply: Optional[bool] = allow_sending_without_reply - self._tzinfo: dtm.tzinfo = tzinfo - self._block: bool = block - self._protect_content: Optional[bool] = protect_content - - if "pytz" in str(self._tzinfo.__class__): - # TODO: When dropping support, make sure to update _utils.datetime accordingly - warn( - message=PTBDeprecationWarning( - version="21.10", - message=( - "Support for pytz timezones is deprecated and will be removed in " - "future versions." - ), - ), - stacklevel=2, - ) - - self._link_preview_options = link_preview_options - self._do_quote = do_quote - - # Gather all defaults that actually have a default value - self._api_defaults = {} - for kwarg in ( - "allow_sending_without_reply", - "disable_notification", - "do_quote", - "explanation_parse_mode", - "link_preview_options", - "parse_mode", - "text_parse_mode", - "protect_content", - "question_parse_mode", - ): - value = getattr(self, kwarg) - if value is not None: - self._api_defaults[kwarg] = value - - def __hash__(self) -> int: - """Builds a hash value for this object such that the hash of two objects is equal if and - only if the objects are equal in terms of :meth:`__eq__`. - - Returns: - :obj:`int` The hash value of the object. - """ - return hash( - ( - self._parse_mode, - self._disable_notification, - self._link_preview_options, - self._allow_sending_without_reply, - self._do_quote, - self._tzinfo, - self._block, - self._protect_content, - ) - ) - - def __eq__(self, other: object) -> bool: - """Defines equality condition for the :class:`Defaults` object. - Two objects of this class are considered to be equal if all their parameters - are identical. - - Returns: - :obj:`True` if both objects have all parameters identical. :obj:`False` otherwise. - """ - if isinstance(other, Defaults): - return all(getattr(self, attr) == getattr(other, attr) for attr in self.__slots__) - return False - - @property - def api_defaults(self) -> dict[str, Any]: # skip-cq: PY-D0003 - return self._api_defaults - - @property - def parse_mode(self) -> Optional[str]: - """:obj:`str`: Optional. Send Markdown or HTML, if you want Telegram apps to show - bold, italic, fixed-width text or URLs in your bot's message. - """ - return self._parse_mode - - @parse_mode.setter - def parse_mode(self, _: object) -> NoReturn: - raise AttributeError("You can not assign a new value to parse_mode after initialization.") - - @property - def explanation_parse_mode(self) -> Optional[str]: - """:obj:`str`: Optional. Alias for :attr:`parse_mode`, used for - the corresponding parameter of :meth:`telegram.Bot.send_poll`. - """ - return self._parse_mode - - @explanation_parse_mode.setter - def explanation_parse_mode(self, _: object) -> NoReturn: - raise AttributeError( - "You can not assign a new value to explanation_parse_mode after initialization." - ) - - @property - def quote_parse_mode(self) -> Optional[str]: - """:obj:`str`: Optional. Alias for :attr:`parse_mode`, used for - the corresponding parameter of :meth:`telegram.ReplyParameters`. - """ - return self._parse_mode - - @quote_parse_mode.setter - def quote_parse_mode(self, _: object) -> NoReturn: - raise AttributeError( - "You can not assign a new value to quote_parse_mode after initialization." - ) - - @property - def text_parse_mode(self) -> Optional[str]: - """:obj:`str`: Optional. Alias for :attr:`parse_mode`, used for - the corresponding parameter of :class:`telegram.InputPollOption` and - :meth:`telegram.Bot.send_gift`. - - .. versionadded:: 21.2 - """ - return self._parse_mode - - @text_parse_mode.setter - def text_parse_mode(self, _: object) -> NoReturn: - raise AttributeError( - "You can not assign a new value to text_parse_mode after initialization." - ) - - @property - def question_parse_mode(self) -> Optional[str]: - """:obj:`str`: Optional. Alias for :attr:`parse_mode`, used for - the corresponding parameter of :meth:`telegram.Bot.send_poll`. - - .. versionadded:: 21.2 - """ - return self._parse_mode - - @question_parse_mode.setter - def question_parse_mode(self, _: object) -> NoReturn: - raise AttributeError( - "You can not assign a new value to question_parse_mode after initialization." - ) - - @property - def disable_notification(self) -> Optional[bool]: - """:obj:`bool`: Optional. Sends the message silently. Users will - receive a notification with no sound. - """ - return self._disable_notification - - @disable_notification.setter - def disable_notification(self, _: object) -> NoReturn: - raise AttributeError( - "You can not assign a new value to disable_notification after initialization." - ) - - @property - def allow_sending_without_reply(self) -> Optional[bool]: - """:obj:`bool`: Optional. Pass :obj:`True`, if the message - should be sent even if the specified replied-to message is not found. - """ - return self._allow_sending_without_reply - - @allow_sending_without_reply.setter - def allow_sending_without_reply(self, _: object) -> NoReturn: - raise AttributeError( - "You can not assign a new value to allow_sending_without_reply after initialization." - ) - - @property - def tzinfo(self) -> dtm.tzinfo: - """:obj:`tzinfo`: A timezone to be used for all date(time) objects appearing - throughout PTB. - """ - return self._tzinfo - - @tzinfo.setter - def tzinfo(self, _: object) -> NoReturn: - raise AttributeError("You can not assign a new value to tzinfo after initialization.") - - @property - def block(self) -> bool: - """:obj:`bool`: Optional. Default setting for the :paramref:`BaseHandler.block` parameter - of handlers and error handlers registered through :meth:`Application.add_handler` and - :meth:`Application.add_error_handler`. - """ - return self._block - - @block.setter - def block(self, _: object) -> NoReturn: - raise AttributeError("You can not assign a new value to block after initialization.") - - @property - def protect_content(self) -> Optional[bool]: - """:obj:`bool`: Optional. Protects the contents of the sent message from forwarding and - saving. - - .. versionadded:: 20.0 - """ - return self._protect_content - - @protect_content.setter - def protect_content(self, _: object) -> NoReturn: - raise AttributeError( - "You can't assign a new value to protect_content after initialization." - ) - - @property - def link_preview_options(self) -> Optional["LinkPreviewOptions"]: - """:class:`telegram.LinkPreviewOptions`: Optional. Link preview generation options for all - outgoing messages. - - .. versionadded:: 20.8 - """ - return self._link_preview_options - - @property - def do_quote(self) -> Optional[bool]: - """:obj:`bool`: Optional. |reply_quote| - - .. versionadded:: 20.8 - """ - return self._do_quote diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_dictpersistence.py b/venv/lib/python3.12/site-packages/telegram/ext/_dictpersistence.py deleted file mode 100644 index 758a8dd..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_dictpersistence.py +++ /dev/null @@ -1,481 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the DictPersistence class.""" -import json -from copy import deepcopy -from typing import TYPE_CHECKING, Any, Optional, cast - -from telegram.ext import BasePersistence, PersistenceInput -from telegram.ext._utils.types import CDCData, ConversationDict, ConversationKey - -if TYPE_CHECKING: - from telegram._utils.types import JSONDict - - -class DictPersistence(BasePersistence[dict[Any, Any], dict[Any, Any], dict[Any, Any]]): - """Using Python's :obj:`dict` and :mod:`json` for making your bot persistent. - - Attention: - The interface provided by this class is intended to be accessed exclusively by - :class:`~telegram.ext.Application`. Calling any of the methods below manually might - interfere with the integration of persistence into :class:`~telegram.ext.Application`. - - Note: - * Data managed by :class:`DictPersistence` is in-memory only and will be lost when the bot - shuts down. This is, because :class:`DictPersistence` is mainly intended as starting - point for custom persistence classes that need to JSON-serialize the stored data before - writing them to file/database. - - * This implementation of :class:`BasePersistence` does not handle data that cannot be - serialized by :func:`json.dumps`. - - .. seealso:: :wiki:`Making Your Bot Persistent <Making-your-bot-persistent>` - - .. versionchanged:: 20.0 - The parameters and attributes ``store_*_data`` were replaced by :attr:`store_data`. - - Args: - store_data (:class:`~telegram.ext.PersistenceInput`, optional): Specifies which kinds of - data will be saved by this persistence instance. By default, all available kinds of - data will be saved. - user_data_json (:obj:`str`, optional): JSON string that will be used to reconstruct - user_data on creating this persistence. Default is ``""``. - chat_data_json (:obj:`str`, optional): JSON string that will be used to reconstruct - chat_data on creating this persistence. Default is ``""``. - bot_data_json (:obj:`str`, optional): JSON string that will be used to reconstruct - bot_data on creating this persistence. Default is ``""``. - conversations_json (:obj:`str`, optional): JSON string that will be used to reconstruct - conversation on creating this persistence. Default is ``""``. - callback_data_json (:obj:`str`, optional): JSON string that will be used to reconstruct - callback_data on creating this persistence. Default is ``""``. - - .. versionadded:: 13.6 - update_interval (:obj:`int` | :obj:`float`, optional): The - :class:`~telegram.ext.Application` will update - the persistence in regular intervals. This parameter specifies the time (in seconds) to - wait between two consecutive runs of updating the persistence. Defaults to 60 seconds. - - .. versionadded:: 20.0 - Attributes: - store_data (:class:`~telegram.ext.PersistenceInput`): Specifies which kinds of data will - be saved by this persistence instance. - """ - - __slots__ = ( - "_bot_data", - "_bot_data_json", - "_callback_data", - "_callback_data_json", - "_chat_data", - "_chat_data_json", - "_conversations", - "_conversations_json", - "_user_data", - "_user_data_json", - ) - - def __init__( - self, - store_data: Optional[PersistenceInput] = None, - user_data_json: str = "", - chat_data_json: str = "", - bot_data_json: str = "", - conversations_json: str = "", - callback_data_json: str = "", - update_interval: float = 60, - ): - super().__init__(store_data=store_data, update_interval=update_interval) - self._user_data = None - self._chat_data = None - self._bot_data = None - self._callback_data = None - self._conversations = None - self._user_data_json: Optional[str] = None - self._chat_data_json: Optional[str] = None - self._bot_data_json: Optional[str] = None - self._callback_data_json: Optional[str] = None - self._conversations_json: Optional[str] = None - if user_data_json: - try: - self._user_data = self._decode_user_chat_data_from_json(user_data_json) - self._user_data_json = user_data_json - except (ValueError, AttributeError) as exc: - raise TypeError("Unable to deserialize user_data_json. Not valid JSON") from exc - if chat_data_json: - try: - self._chat_data = self._decode_user_chat_data_from_json(chat_data_json) - self._chat_data_json = chat_data_json - except (ValueError, AttributeError) as exc: - raise TypeError("Unable to deserialize chat_data_json. Not valid JSON") from exc - if bot_data_json: - try: - self._bot_data = json.loads(bot_data_json) - self._bot_data_json = bot_data_json - except (ValueError, AttributeError) as exc: - raise TypeError("Unable to deserialize bot_data_json. Not valid JSON") from exc - if not isinstance(self._bot_data, dict): - raise TypeError("bot_data_json must be serialized dict") - if callback_data_json: - try: - data = json.loads(callback_data_json) - except (ValueError, AttributeError) as exc: - raise TypeError( - "Unable to deserialize callback_data_json. Not valid JSON" - ) from exc - # We are a bit more thorough with the checking of the format here, because it's - # more complicated than for the other things - try: - if data is None: - self._callback_data = None - else: - self._callback_data = cast( - "CDCData", - ([(one, float(two), three) for one, two, three in data[0]], data[1]), - ) - self._callback_data_json = callback_data_json - except (ValueError, IndexError) as exc: - raise TypeError("callback_data_json is not in the required format") from exc - if self._callback_data is not None and ( - not all( - isinstance(entry[2], dict) and isinstance(entry[0], str) - for entry in self._callback_data[0] - ) - or not isinstance(self._callback_data[1], dict) - ): - raise TypeError("callback_data_json is not in the required format") - - if conversations_json: - try: - self._conversations = self._decode_conversations_from_json(conversations_json) - self._conversations_json = conversations_json - except (ValueError, AttributeError) as exc: - raise TypeError( - "Unable to deserialize conversations_json. Not valid JSON" - ) from exc - - @property - def user_data(self) -> Optional[dict[int, dict[Any, Any]]]: - """:obj:`dict`: The user_data as a dict.""" - return self._user_data - - @property - def user_data_json(self) -> str: - """:obj:`str`: The user_data serialized as a JSON-string.""" - if self._user_data_json: - return self._user_data_json - return json.dumps(self.user_data) - - @property - def chat_data(self) -> Optional[dict[int, dict[Any, Any]]]: - """:obj:`dict`: The chat_data as a dict.""" - return self._chat_data - - @property - def chat_data_json(self) -> str: - """:obj:`str`: The chat_data serialized as a JSON-string.""" - if self._chat_data_json: - return self._chat_data_json - return json.dumps(self.chat_data) - - @property - def bot_data(self) -> Optional[dict[Any, Any]]: - """:obj:`dict`: The bot_data as a dict.""" - return self._bot_data - - @property - def bot_data_json(self) -> str: - """:obj:`str`: The bot_data serialized as a JSON-string.""" - if self._bot_data_json: - return self._bot_data_json - return json.dumps(self.bot_data) - - @property - def callback_data(self) -> Optional[CDCData]: - """tuple[list[tuple[:obj:`str`, :obj:`float`, dict[:obj:`str`, :class:`object`]]], \ - dict[:obj:`str`, :obj:`str`]]: The metadata on the stored callback data. - - .. versionadded:: 13.6 - """ - return self._callback_data - - @property - def callback_data_json(self) -> str: - """:obj:`str`: The metadata on the stored callback data as a JSON-string. - - .. versionadded:: 13.6 - """ - if self._callback_data_json: - return self._callback_data_json - return json.dumps(self.callback_data) - - @property - def conversations(self) -> Optional[dict[str, ConversationDict]]: - """:obj:`dict`: The conversations as a dict.""" - return self._conversations - - @property - def conversations_json(self) -> str: - """:obj:`str`: The conversations serialized as a JSON-string.""" - if self._conversations_json: - return self._conversations_json - if self.conversations: - return self._encode_conversations_to_json(self.conversations) - return json.dumps(self.conversations) - - async def get_user_data(self) -> dict[int, dict[object, object]]: - """Returns the user_data created from the ``user_data_json`` or an empty :obj:`dict`. - - Returns: - :obj:`dict`: The restored user data. - """ - if self.user_data is None: - self._user_data = {} - return deepcopy(self.user_data) # type: ignore[arg-type] - - async def get_chat_data(self) -> dict[int, dict[object, object]]: - """Returns the chat_data created from the ``chat_data_json`` or an empty :obj:`dict`. - - Returns: - :obj:`dict`: The restored chat data. - """ - if self.chat_data is None: - self._chat_data = {} - return deepcopy(self.chat_data) # type: ignore[arg-type] - - async def get_bot_data(self) -> dict[object, object]: - """Returns the bot_data created from the ``bot_data_json`` or an empty :obj:`dict`. - - Returns: - :obj:`dict`: The restored bot data. - """ - if self.bot_data is None: - self._bot_data = {} - return deepcopy(self.bot_data) # type: ignore[arg-type] - - async def get_callback_data(self) -> Optional[CDCData]: - """Returns the callback_data created from the ``callback_data_json`` or :obj:`None`. - - .. versionadded:: 13.6 - - Returns: - tuple[list[tuple[:obj:`str`, :obj:`float`, dict[:obj:`str`, :class:`object`]]], \ - dict[:obj:`str`, :obj:`str`]]: The restored metadata or :obj:`None`, \ - if no data was stored. - """ - if self.callback_data is None: - self._callback_data = None - return None - return deepcopy(self.callback_data) - - async def get_conversations(self, name: str) -> ConversationDict: - """Returns the conversations created from the ``conversations_json`` or an empty - :obj:`dict`. - - Returns: - :obj:`dict`: The restored conversations data. - """ - if self.conversations is None: - self._conversations = {} - return self.conversations.get(name, {}).copy() # type: ignore[union-attr] - - async def update_conversation( - self, name: str, key: ConversationKey, new_state: Optional[object] - ) -> None: - """Will update the conversations for the given handler. - - Args: - name (:obj:`str`): The handler's name. - key (:obj:`tuple`): The key the state is changed for. - new_state (:obj:`tuple` | :class:`object`): The new state for the given key. - """ - if not self._conversations: - self._conversations = {} - if self._conversations.setdefault(name, {}).get(key) == new_state: - return - self._conversations[name][key] = new_state - self._conversations_json = None - - async def update_user_data(self, user_id: int, data: dict[Any, Any]) -> None: - """Will update the user_data (if changed). - - Args: - user_id (:obj:`int`): The user the data might have been changed for. - data (:obj:`dict`): The :attr:`telegram.ext.Application.user_data` ``[user_id]``. - """ - if self._user_data is None: - self._user_data = {} - if self._user_data.get(user_id) == data: - return - self._user_data[user_id] = data - self._user_data_json = None - - async def update_chat_data(self, chat_id: int, data: dict[Any, Any]) -> None: - """Will update the chat_data (if changed). - - Args: - chat_id (:obj:`int`): The chat the data might have been changed for. - data (:obj:`dict`): The :attr:`telegram.ext.Application.chat_data` ``[chat_id]``. - """ - if self._chat_data is None: - self._chat_data = {} - if self._chat_data.get(chat_id) == data: - return - self._chat_data[chat_id] = data - self._chat_data_json = None - - async def update_bot_data(self, data: dict[Any, Any]) -> None: - """Will update the bot_data (if changed). - - Args: - data (:obj:`dict`): The :attr:`telegram.ext.Application.bot_data`. - """ - if self._bot_data == data: - return - self._bot_data = data - self._bot_data_json = None - - async def update_callback_data(self, data: CDCData) -> None: - """Will update the callback_data (if changed). - - .. versionadded:: 13.6 - - Args: - data (tuple[list[tuple[:obj:`str`, :obj:`float`, dict[:obj:`str`, :class:`object`]]], \ - dict[:obj:`str`, :obj:`str`]]): The relevant data to restore - :class:`telegram.ext.CallbackDataCache`. - """ - if self._callback_data == data: - return - self._callback_data = data - self._callback_data_json = None - - async def drop_chat_data(self, chat_id: int) -> None: - """Will delete the specified key from the :attr:`chat_data`. - - .. versionadded:: 20.0 - - Args: - chat_id (:obj:`int`): The chat id to delete from the persistence. - """ - if self._chat_data is None: - return - self._chat_data.pop(chat_id, None) - self._chat_data_json = None - - async def drop_user_data(self, user_id: int) -> None: - """Will delete the specified key from the :attr:`user_data`. - - .. versionadded:: 20.0 - - Args: - user_id (:obj:`int`): The user id to delete from the persistence. - """ - if self._user_data is None: - return - self._user_data.pop(user_id, None) - self._user_data_json = None - - async def refresh_user_data(self, user_id: int, user_data: dict[Any, Any]) -> None: - """Does nothing. - - .. versionadded:: 13.6 - .. seealso:: :meth:`telegram.ext.BasePersistence.refresh_user_data` - """ - - async def refresh_chat_data(self, chat_id: int, chat_data: dict[Any, Any]) -> None: - """Does nothing. - - .. versionadded:: 13.6 - .. seealso:: :meth:`telegram.ext.BasePersistence.refresh_chat_data` - """ - - async def refresh_bot_data(self, bot_data: dict[Any, Any]) -> None: - """Does nothing. - - .. versionadded:: 13.6 - .. seealso:: :meth:`telegram.ext.BasePersistence.refresh_bot_data` - """ - - async def flush(self) -> None: - """Does nothing. - - .. versionadded:: 20.0 - .. seealso:: :meth:`telegram.ext.BasePersistence.flush` - """ - - @staticmethod - def _encode_conversations_to_json(conversations: dict[str, ConversationDict]) -> str: - """Helper method to encode a conversations dict (that uses tuples as keys) to a - JSON-serializable way. Use :meth:`self._decode_conversations_from_json` to decode. - - Args: - conversations (:obj:`dict`): The conversations dict to transform to JSON. - - Returns: - :obj:`str`: The JSON-serialized conversations dict - """ - tmp: dict[str, JSONDict] = {} - for handler, states in conversations.items(): - tmp[handler] = {} - for key, state in states.items(): - tmp[handler][json.dumps(key)] = state - return json.dumps(tmp) - - @staticmethod - def _decode_conversations_from_json(json_string: str) -> dict[str, ConversationDict]: - """Helper method to decode a conversations dict (that uses tuples as keys) from a - JSON-string created with :meth:`self._encode_conversations_to_json`. - - Args: - json_string (:obj:`str`): The conversations dict as JSON string. - - Returns: - :obj:`dict`: The conversations dict after decoding - """ - tmp = json.loads(json_string) - conversations: dict[str, ConversationDict] = {} - for handler, states in tmp.items(): - conversations[handler] = {} - for key, state in states.items(): - conversations[handler][tuple(json.loads(key))] = state - return conversations - - @staticmethod - def _decode_user_chat_data_from_json(data: str) -> dict[int, dict[object, object]]: - """Helper method to decode chat or user data (that uses ints as keys) from a - JSON-string. - - Args: - data (:obj:`str`): The user/chat_data dict as JSON string. - - Returns: - :obj:`dict`: The user/chat_data defaultdict after decoding - """ - tmp: dict[int, dict[object, object]] = {} - decoded_data = json.loads(data) - for user, user_data in decoded_data.items(): - int_user_id = int(user) - tmp[int_user_id] = {} - for key, value in user_data.items(): - try: - _id = int(key) - except ValueError: - _id = key - tmp[int_user_id][_id] = value - return tmp diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_extbot.py b/venv/lib/python3.12/site-packages/telegram/ext/_extbot.py deleted file mode 100644 index 5781cf8..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_extbot.py +++ /dev/null @@ -1,5212 +0,0 @@ -#!/usr/bin/env python -# pylint: disable=too-many-arguments -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an object that represents a Telegram Bot with convenience extensions.""" -import datetime as dtm -from collections.abc import Sequence -from copy import copy -from typing import ( - TYPE_CHECKING, - Any, - Callable, - Generic, - Optional, - TypeVar, - Union, - cast, - no_type_check, - overload, -) -from uuid import uuid4 - -from telegram import ( - AcceptedGiftTypes, - Animation, - Audio, - Bot, - BotCommand, - BotCommandScope, - BotDescription, - BotName, - BotShortDescription, - BusinessConnection, - CallbackQuery, - ChatAdministratorRights, - ChatFullInfo, - ChatInviteLink, - ChatMember, - ChatPermissions, - ChatPhoto, - Contact, - Document, - File, - ForumTopic, - GameHighScore, - Gift, - Gifts, - InlineKeyboardMarkup, - InlineQueryResultsButton, - InputMedia, - InputPaidMedia, - InputPollOption, - InputProfilePhoto, - LinkPreviewOptions, - Location, - MaskPosition, - MenuButton, - Message, - MessageId, - OwnedGifts, - PhotoSize, - Poll, - PreparedInlineMessage, - ReactionType, - ReplyParameters, - SentWebAppMessage, - StarAmount, - StarTransactions, - Sticker, - StickerSet, - Story, - TelegramObject, - Update, - User, - UserChatBoosts, - UserProfilePhotos, - Venue, - Video, - VideoNote, - Voice, - WebhookInfo, -) -from telegram._utils.datetime import to_timestamp -from telegram._utils.defaultvalue import DEFAULT_NONE, DefaultValue -from telegram._utils.logging import get_logger -from telegram._utils.repr import build_repr_with_selected_attrs -from telegram._utils.types import ( - BaseUrl, - CorrectOptionID, - FileInput, - JSONDict, - ODVInput, - ReplyMarkup, - TimePeriod, -) -from telegram.ext._callbackdatacache import CallbackDataCache -from telegram.ext._utils.types import RLARGS -from telegram.request import BaseRequest -from telegram.warnings import PTBUserWarning - -if TYPE_CHECKING: - from telegram import ( - InlineQueryResult, - InputMediaAudio, - InputMediaDocument, - InputMediaPhoto, - InputMediaVideo, - InputSticker, - InputStoryContent, - LabeledPrice, - MessageEntity, - PassportElementError, - ShippingOption, - StoryArea, - ) - from telegram.ext import BaseRateLimiter, Defaults - -HandledTypes = TypeVar("HandledTypes", bound=Union[Message, CallbackQuery, ChatFullInfo]) -KT = TypeVar("KT", bound=ReplyMarkup) - - -class ExtBot(Bot, Generic[RLARGS]): - """This object represents a Telegram Bot with convenience extensions. - - Warning: - Not to be confused with :class:`telegram.Bot`. - - For the documentation of the arguments, methods and attributes, please see - :class:`telegram.Bot`. - - All API methods of this class have an additional keyword argument ``rate_limit_args``. - This can be used to pass additional information to the rate limiter, specifically to - :paramref:`telegram.ext.BaseRateLimiter.process_request.rate_limit_args`. - - This class is a :class:`~typing.Generic` class and accepts one type variable that specifies - the generic type of the :attr:`rate_limiter` used by the bot. Use :obj:`None` if no rate - limiter is used. - - Warning: - * The keyword argument ``rate_limit_args`` can `not` be used, if :attr:`rate_limiter` - is :obj:`None`. - * The method :meth:`~telegram.Bot.get_updates` is the only method that does not have the - additional argument, as this method will never be rate limited. - - Examples: - :any:`Arbitrary Callback Data Bot <examples.arbitrarycallbackdatabot>` - - .. seealso:: :wiki:`Arbitrary callback_data <Arbitrary-callback_data>` - - .. versionadded:: 13.6 - - .. versionchanged:: 20.0 - Removed the attribute ``arbitrary_callback_data``. You can instead use - :attr:`bot.callback_data_cache.maxsize <telegram.ext.CallbackDataCache.maxsize>` to - access the size of the cache. - - .. versionchanged:: 20.5 - Removed deprecated methods ``set_sticker_set_thumb`` and ``setStickerSetThumb``. - - Args: - defaults (:class:`telegram.ext.Defaults`, optional): An object containing default values to - be used if not set explicitly in the bot methods. - arbitrary_callback_data (:obj:`bool` | :obj:`int`, optional): Whether to - allow arbitrary objects as callback data for :class:`telegram.InlineKeyboardButton`. - Pass an integer to specify the maximum number of objects cached in memory. - Defaults to :obj:`False`. - - .. seealso:: :wiki:`Arbitrary callback_data <Arbitrary-callback_data>` - rate_limiter (:class:`telegram.ext.BaseRateLimiter`, optional): A rate limiter to use for - limiting the number of requests made by the bot per time interval. - - .. versionadded:: 20.0 - - """ - - __slots__ = ("_callback_data_cache", "_defaults", "_rate_limiter") - - _LOGGER = get_logger(__name__, class_name="ExtBot") - - # using object() would be a tiny bit safer, but a string plays better with the typing setup - __RL_KEY = uuid4().hex - - @overload - def __init__( - self: "ExtBot[None]", - token: str, - base_url: BaseUrl = "https://api.telegram.org/bot", - base_file_url: BaseUrl = "https://api.telegram.org/file/bot", - request: Optional[BaseRequest] = None, - get_updates_request: Optional[BaseRequest] = None, - private_key: Optional[bytes] = None, - private_key_password: Optional[bytes] = None, - defaults: Optional["Defaults"] = None, - arbitrary_callback_data: Union[bool, int] = False, - local_mode: bool = False, - ): ... - - @overload - def __init__( - self: "ExtBot[RLARGS]", - token: str, - base_url: BaseUrl = "https://api.telegram.org/bot", - base_file_url: BaseUrl = "https://api.telegram.org/file/bot", - request: Optional[BaseRequest] = None, - get_updates_request: Optional[BaseRequest] = None, - private_key: Optional[bytes] = None, - private_key_password: Optional[bytes] = None, - defaults: Optional["Defaults"] = None, - arbitrary_callback_data: Union[bool, int] = False, - local_mode: bool = False, - rate_limiter: Optional["BaseRateLimiter[RLARGS]"] = None, - ): ... - - def __init__( - self, - token: str, - base_url: BaseUrl = "https://api.telegram.org/bot", - base_file_url: BaseUrl = "https://api.telegram.org/file/bot", - request: Optional[BaseRequest] = None, - get_updates_request: Optional[BaseRequest] = None, - private_key: Optional[bytes] = None, - private_key_password: Optional[bytes] = None, - defaults: Optional["Defaults"] = None, - arbitrary_callback_data: Union[bool, int] = False, - local_mode: bool = False, - rate_limiter: Optional["BaseRateLimiter[RLARGS]"] = None, - ): - super().__init__( - token=token, - base_url=base_url, - base_file_url=base_file_url, - request=request, - get_updates_request=get_updates_request, - private_key=private_key, - private_key_password=private_key_password, - local_mode=local_mode, - ) - with self._unfrozen(): - self._defaults: Optional[Defaults] = defaults - self._rate_limiter: Optional[BaseRateLimiter] = rate_limiter - self._callback_data_cache: Optional[CallbackDataCache] = None - - # set up callback_data - if arbitrary_callback_data is False: - return - - if not isinstance(arbitrary_callback_data, bool): - maxsize = cast("int", arbitrary_callback_data) - else: - maxsize = 1024 - - self._callback_data_cache = CallbackDataCache(bot=self, maxsize=maxsize) - - def __repr__(self) -> str: - """Give a string representation of the bot in the form ``ExtBot[token=...]``. - - As this class doesn't implement :meth:`object.__str__`, the default implementation - will be used, which is equivalent to :meth:`__repr__`. - - Returns: - :obj:`str` - """ - return build_repr_with_selected_attrs(self, token=self.token) - - @classmethod - def _warn( - cls, - message: Union[str, PTBUserWarning], - category: type[Warning] = PTBUserWarning, - stacklevel: int = 0, - ) -> None: - """We override this method to add one more level to the stacklevel, so that the warning - points to the user's code, not to the PTB code. - """ - super()._warn(message=message, category=category, stacklevel=stacklevel + 2) - - @property - def callback_data_cache(self) -> Optional[CallbackDataCache]: - """:class:`telegram.ext.CallbackDataCache`: Optional. The cache for - objects passed as callback data for :class:`telegram.InlineKeyboardButton`. - - Examples: - :any:`Arbitrary Callback Data Bot <examples.arbitrarycallbackdatabot>` - - .. versionchanged:: 20.0 - * This property is now read-only. - * This property is now optional and can be :obj:`None` if - :paramref:`~telegram.ext.ExtBot.arbitrary_callback_data` is set to :obj:`False`. - """ - return self._callback_data_cache - - async def initialize(self) -> None: - """See :meth:`telegram.Bot.initialize`. Also initializes the - :paramref:`ExtBot.rate_limiter` (if set) - by calling :meth:`telegram.ext.BaseRateLimiter.initialize`. - """ - # Initialize before calling super, because super calls get_me - if self.rate_limiter: - await self.rate_limiter.initialize() - await super().initialize() - - async def shutdown(self) -> None: - """See :meth:`telegram.Bot.shutdown`. Also shuts down the - :paramref:`ExtBot.rate_limiter` (if set) by - calling :meth:`telegram.ext.BaseRateLimiter.shutdown`. - """ - # Shut down the rate limiter before shutting down the request objects! - if self.rate_limiter: - await self.rate_limiter.shutdown() - await super().shutdown() - - @classmethod - def _merge_api_rl_kwargs( - cls, api_kwargs: Optional[JSONDict], rate_limit_args: Optional[RLARGS] - ) -> Optional[JSONDict]: - """Inserts the `rate_limit_args` into `api_kwargs` with the special key `__RL_KEY` so - that we can extract them later without having to modify the `telegram.Bot` class. - """ - if not rate_limit_args: - return api_kwargs - if api_kwargs is None: - api_kwargs = {} - api_kwargs[cls.__RL_KEY] = rate_limit_args - return api_kwargs - - @classmethod - def _extract_rl_kwargs(cls, data: Optional[JSONDict]) -> Optional[RLARGS]: - """Extracts the `rate_limit_args` from `data` if it exists.""" - if not data: - return None - return data.pop(cls.__RL_KEY, None) - - async def _do_post( - self, - endpoint: str, - data: JSONDict, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - ) -> Union[bool, JSONDict, list[JSONDict]]: - """Order of method calls is: Bot.some_method -> Bot._post -> Bot._do_post. - So we can override Bot._do_post to add rate limiting. - """ - rate_limit_args = self._extract_rl_kwargs(data) - if not self.rate_limiter and rate_limit_args is not None: - raise ValueError( - "`rate_limit_args` can only be used if a `ExtBot.rate_limiter` is set." - ) - - # getting updates should not be rate limited! - if endpoint == "getUpdates" or not self.rate_limiter: - return await super()._do_post( - endpoint=endpoint, - data=data, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - read_timeout=read_timeout, - ) - - kwargs = { - "read_timeout": read_timeout, - "write_timeout": write_timeout, - "connect_timeout": connect_timeout, - "pool_timeout": pool_timeout, - } - self._LOGGER.debug( - "Passing request through rate limiter of type %s with rate_limit_args %s", - type(self.rate_limiter), - rate_limit_args, - ) - return await self.rate_limiter.process_request( - callback=super()._do_post, - args=(endpoint, data), - kwargs=kwargs, - endpoint=endpoint, - data=data, - rate_limit_args=rate_limit_args, - ) - - @property - def defaults(self) -> Optional["Defaults"]: - """The :class:`telegram.ext.Defaults` used by this bot, if any.""" - # This is a property because defaults shouldn't be changed at runtime - return self._defaults - - @property - def rate_limiter(self) -> Optional["BaseRateLimiter[RLARGS]"]: - """The :class:`telegram.ext.BaseRateLimiter` used by this bot, if any. - - .. versionadded:: 20.0 - """ - # This is a property because the rate limiter shouldn't be changed at runtime - return self._rate_limiter - - def _merge_lpo_defaults( - self, lpo: ODVInput[LinkPreviewOptions] - ) -> Optional[LinkPreviewOptions]: - # This is a standalone method because both _insert_defaults and - # _insert_defaults_for_ilq_results need this logic - # - # If Defaults.LPO is set, and LPO is passed in the bot method we should fuse - # them, giving precedence to passed values. - # Defaults.LPO(True, "google.com", True) & LPO=LPO(True, ..., False) -> - # LPO(True, "google.com", False) - if self.defaults is None or (defaults_lpo := self.defaults.link_preview_options) is None: - return DefaultValue.get_value(lpo) - return LinkPreviewOptions( - **{ - attr: ( - getattr(defaults_lpo, attr) - # only use the default value - # if the value was explicitly passed to the LPO object - if isinstance(orig_attr := getattr(lpo, attr), DefaultValue) - else orig_attr - ) - for attr in defaults_lpo.__slots__ - } - ) - - def _insert_defaults(self, data: dict[str, object]) -> None: - """Inserts the defaults values for optional kwargs for which tg.ext.Defaults provides - convenience functionality, i.e. the kwargs with a tg.utils.helpers.DefaultValue default - - data is edited in-place. As timeout is not passed via the kwargs, it needs to be passed - separately and gets returned. - - This can only work, if all kwargs that may have defaults are passed in data! - """ - if self.defaults is None: - # If we have no defaults to insert, the behavior is the same as in `tg.Bot` - super()._insert_defaults(data) - return - - # if we have Defaults, we - # 1) replace all DefaultValue instances with the relevant Defaults value. If there is none, - # we fall back to the default value of the bot method - # 2) convert all datetime.datetime objects to timestamps wrt the correct default timezone - # 3) set the correct parse_mode for all InputMedia objects - # 4) handle the LinkPreviewOptions case (see below) - # 5) handle the ReplyParameters case (see below) - # 6) handle text_parse_mode in InputPollOption - for key, val in data.items(): - # 1) - if isinstance(val, DefaultValue): - data[key] = self.defaults.api_defaults.get(key, val.value) - - # 2) - elif isinstance(val, dtm.datetime): - data[key] = to_timestamp(val, tzinfo=self.defaults.tzinfo) - - # 3) - elif isinstance(val, InputMedia) and val.parse_mode is DEFAULT_NONE: - # Copy object as not to edit it in-place - copied_val = copy(val) - with copied_val._unfrozen(): - copied_val.parse_mode = self.defaults.parse_mode - data[key] = copied_val - elif ( - key == "media" - and isinstance(val, Sequence) - and not isinstance(val[0], InputPaidMedia) - ): - # Copy objects as not to edit them in-place - copy_list = [copy(media) for media in val] - for media in copy_list: - if media.parse_mode is DEFAULT_NONE: - with media._unfrozen(): - media.parse_mode = self.defaults.parse_mode - - data[key] = copy_list - - # 4) LinkPreviewOptions: - elif isinstance(val, LinkPreviewOptions): - data[key] = self._merge_lpo_defaults(val) - - # 5) - # Similar to LinkPreviewOptions, but only two of the arguments of RPs have a default - elif isinstance(val, ReplyParameters) and ( - (defaults_aswr := self.defaults.allow_sending_without_reply) is not None - or self.defaults.quote_parse_mode is not None - ): - new_value = copy(val) - with new_value._unfrozen(): - new_value.allow_sending_without_reply = ( - defaults_aswr - if isinstance(val.allow_sending_without_reply, DefaultValue) - else val.allow_sending_without_reply - ) - new_value.quote_parse_mode = ( - self.defaults.quote_parse_mode - if isinstance(val.quote_parse_mode, DefaultValue) - else val.quote_parse_mode - ) - - data[key] = new_value - - # 6) - elif isinstance(val, Sequence) and all( - isinstance(obj, InputPollOption) for obj in val - ): - new_val = [] - for option in val: - if not isinstance(option.text_parse_mode, DefaultValue): - new_val.append(option) - else: - new_option = copy(option) - with new_option._unfrozen(): - new_option.text_parse_mode = self.defaults.text_parse_mode - new_val.append(new_option) - data[key] = new_val - - def _replace_keyboard(self, reply_markup: Optional[KT]) -> Optional[KT]: - # If the reply_markup is an inline keyboard and we allow arbitrary callback data, let the - # CallbackDataCache build a new keyboard with the data replaced. Otherwise return the input - if isinstance(reply_markup, InlineKeyboardMarkup) and self.callback_data_cache is not None: - # for some reason mypy doesn't understand that IKB is a subtype of Optional[KT] - return self.callback_data_cache.process_keyboard( # type: ignore[return-value] - reply_markup - ) - - return reply_markup - - def insert_callback_data(self, update: Update) -> None: - """If this bot allows for arbitrary callback data, this inserts the cached data into all - corresponding buttons within this update. - - Note: - Checks :attr:`telegram.Message.via_bot` and :attr:`telegram.Message.from_user` - to figure out if a) a reply markup exists and b) it was actually sent by this - bot. If not, the message will be returned unchanged. - - Note that this will fail for channel posts, as :attr:`telegram.Message.from_user` is - :obj:`None` for those! In the corresponding reply markups, the callback data will be - replaced by :class:`telegram.ext.InvalidCallbackData`. - - Warning: - *In place*, i.e. the passed :class:`telegram.Message` will be changed! - - Args: - update (:class:`telegram.Update`): The update. - - """ - # The only incoming updates that can directly contain a message sent by the bot itself are: - # * CallbackQueries - # * Messages where the pinned_message is sent by the bot - # * Messages where the reply_to_message is sent by the bot - # * Messages where via_bot is the bot - # Finally there is effective_chat.pinned message, but that's only returned in get_chat - if update.callback_query: - self._insert_callback_data(update.callback_query) - # elif instead of if, as effective_message includes callback_query.message - # and that has already been processed - elif update.effective_message: - self._insert_callback_data(update.effective_message) - - def _insert_callback_data(self, obj: HandledTypes) -> HandledTypes: - if self.callback_data_cache is None: - return obj - - if isinstance(obj, CallbackQuery): - self.callback_data_cache.process_callback_query(obj) - return obj # type: ignore[return-value] - - if isinstance(obj, Message): - if obj.reply_to_message: - # reply_to_message can't contain further reply_to_messages, so no need to check - self.callback_data_cache.process_message(obj.reply_to_message) - if isinstance(obj.reply_to_message.pinned_message, Message): - # pinned messages can't contain reply_to_message, no need to check - self.callback_data_cache.process_message(obj.reply_to_message.pinned_message) - if isinstance(obj.pinned_message, Message): - # pinned messages can't contain reply_to_message, no need to check - self.callback_data_cache.process_message(obj.pinned_message) - - # Finally, handle the message itself - self.callback_data_cache.process_message(message=obj) - return obj # type: ignore[return-value] - - if isinstance(obj, ChatFullInfo) and obj.pinned_message: - self.callback_data_cache.process_message(obj.pinned_message) - - return obj - - async def _send_message( - self, - endpoint: str, - data: JSONDict, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - caption: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - link_preview_options: ODVInput["LinkPreviewOptions"] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> Any: - # We override this method to call self._replace_keyboard and self._insert_callback_data. - # This covers most methods that have a reply_markup - result = await super()._send_message( - endpoint=endpoint, - data=data, - reply_to_message_id=reply_to_message_id, - disable_notification=disable_notification, - reply_markup=self._replace_keyboard(reply_markup), - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - link_preview_options=link_preview_options, - reply_parameters=reply_parameters, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - if isinstance(result, Message): - self._insert_callback_data(result) - return result - - async def get_updates( - self, - offset: Optional[int] = None, - limit: Optional[int] = None, - timeout: Optional[TimePeriod] = None, - allowed_updates: Optional[Sequence[str]] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - ) -> tuple[Update, ...]: - updates = await super().get_updates( - offset=offset, - limit=limit, - timeout=timeout, - allowed_updates=allowed_updates, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=api_kwargs, - ) - - for update in updates: - self.insert_callback_data(update) - - return updates - - def _effective_inline_results( - self, - results: Union[ - Sequence["InlineQueryResult"], Callable[[int], Optional[Sequence["InlineQueryResult"]]] - ], - next_offset: Optional[str] = None, - current_offset: Optional[str] = None, - ) -> tuple[Sequence["InlineQueryResult"], Optional[str]]: - """This method is called by Bot.answer_inline_query to build the actual results list. - Overriding this to call self._replace_keyboard suffices - """ - effective_results, next_offset = super()._effective_inline_results( - results=results, next_offset=next_offset, current_offset=current_offset - ) - - # Process arbitrary callback - if self.callback_data_cache is None: - return effective_results, next_offset - results = [] - for result in effective_results: - # All currently existingInlineQueryResults have a reply_markup, but future ones - # might not have. Better be save than sorry - if not hasattr(result, "reply_markup"): - results.append(result) - else: - # We build a new result in case the user wants to use the same object in - # different places - new_result = copy(result) - with new_result._unfrozen(): - markup = self._replace_keyboard(result.reply_markup) - new_result.reply_markup = markup - - results.append(new_result) - - return results, next_offset - - @no_type_check # mypy doesn't play too well with hasattr - def _insert_defaults_for_ilq_results(self, res: "InlineQueryResult") -> "InlineQueryResult": - """This method is called by Bot.answer_inline_query to replace `DefaultValue(obj)` with - `obj`. - Overriding this to call insert the actual desired default values. - """ - if self.defaults is None: - # If we have no defaults to insert, the behavior is the same as in `tg.Bot` - return super()._insert_defaults_for_ilq_results(res) - - # Copy the objects that need modification to avoid modifying the original object - copied = False - if hasattr(res, "parse_mode") and res.parse_mode is DEFAULT_NONE: - res = copy(res) - with res._unfrozen(): - copied = True - res.parse_mode = self.defaults.parse_mode - if hasattr(res, "input_message_content") and res.input_message_content: - if ( - hasattr(res.input_message_content, "parse_mode") - and res.input_message_content.parse_mode is DEFAULT_NONE - ): - if not copied: - res = copy(res) - copied = True - with res.input_message_content._unfrozen(): - res.input_message_content.parse_mode = self.defaults.parse_mode - if hasattr(res.input_message_content, "link_preview_options"): - if not copied: - res = copy(res) - with res.input_message_content._unfrozen(): - if res.input_message_content.link_preview_options is DEFAULT_NONE: - res.input_message_content.link_preview_options = ( - self.defaults.link_preview_options - ) - else: - # merge the existing options with the defaults - res.input_message_content.link_preview_options = self._merge_lpo_defaults( - res.input_message_content.link_preview_options - ) - - return res - - async def do_api_request( - self, - endpoint: str, - api_kwargs: Optional[JSONDict] = None, - return_type: Optional[type[TelegramObject]] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - rate_limit_args: Optional[RLARGS] = None, - ) -> Any: - return await super().do_api_request( - endpoint=endpoint, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - return_type=return_type, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - ) - - async def stop_poll( - self, - chat_id: Union[int, str], - message_id: int, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - business_connection_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> Poll: - # We override this method to call self._replace_keyboard - return await super().stop_poll( - chat_id=chat_id, - message_id=message_id, - reply_markup=self._replace_keyboard(reply_markup), - business_connection_id=business_connection_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def copy_message( - self, - chat_id: Union[int, str], - from_chat_id: Union[str, int], - message_id: int, - caption: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - show_caption_above_media: Optional[bool] = None, - allow_paid_broadcast: Optional[bool] = None, - video_start_timestamp: Optional[int] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> MessageId: - # We override this method to call self._replace_keyboard - return await super().copy_message( - chat_id=chat_id, - from_chat_id=from_chat_id, - message_id=message_id, - caption=caption, - video_start_timestamp=video_start_timestamp, - parse_mode=parse_mode, - caption_entities=caption_entities, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - allow_sending_without_reply=allow_sending_without_reply, - reply_markup=self._replace_keyboard(reply_markup), - protect_content=protect_content, - message_thread_id=message_thread_id, - reply_parameters=reply_parameters, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - show_caption_above_media=show_caption_above_media, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def copy_messages( - self, - chat_id: Union[int, str], - from_chat_id: Union[str, int], - message_ids: Sequence[int], - disable_notification: ODVInput[bool] = DEFAULT_NONE, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - remove_caption: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> tuple["MessageId", ...]: - # We override this method to call self._replace_keyboard - return await super().copy_messages( - chat_id=chat_id, - from_chat_id=from_chat_id, - message_ids=message_ids, - disable_notification=disable_notification, - protect_content=protect_content, - message_thread_id=message_thread_id, - remove_caption=remove_caption, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def get_chat( - self, - chat_id: Union[str, int], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> ChatFullInfo: - # We override this method to call self._insert_callback_data - result = await super().get_chat( - chat_id=chat_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - return self._insert_callback_data(result) - - async def add_sticker_to_set( - self, - user_id: int, - name: str, - sticker: "InputSticker", - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().add_sticker_to_set( - user_id=user_id, - name=name, - sticker=sticker, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def answer_callback_query( - self, - callback_query_id: str, - text: Optional[str] = None, - show_alert: Optional[bool] = None, - url: Optional[str] = None, - cache_time: Optional[TimePeriod] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().answer_callback_query( - callback_query_id=callback_query_id, - text=text, - show_alert=show_alert, - url=url, - cache_time=cache_time, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def answer_inline_query( - self, - inline_query_id: str, - results: Union[ - Sequence["InlineQueryResult"], Callable[[int], Optional[Sequence["InlineQueryResult"]]] - ], - cache_time: Optional[TimePeriod] = None, - is_personal: Optional[bool] = None, - next_offset: Optional[str] = None, - button: Optional[InlineQueryResultsButton] = None, - *, - current_offset: Optional[str] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().answer_inline_query( - inline_query_id=inline_query_id, - results=results, - cache_time=cache_time, - is_personal=is_personal, - next_offset=next_offset, - current_offset=current_offset, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - button=button, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def save_prepared_inline_message( - self, - user_id: int, - result: "InlineQueryResult", - allow_user_chats: Optional[bool] = None, - allow_bot_chats: Optional[bool] = None, - allow_group_chats: Optional[bool] = None, - allow_channel_chats: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> PreparedInlineMessage: - return await super().save_prepared_inline_message( - user_id=user_id, - result=result, - allow_user_chats=allow_user_chats, - allow_bot_chats=allow_bot_chats, - allow_group_chats=allow_group_chats, - allow_channel_chats=allow_channel_chats, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def answer_pre_checkout_query( - self, - pre_checkout_query_id: str, - ok: bool, - error_message: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().answer_pre_checkout_query( - pre_checkout_query_id=pre_checkout_query_id, - ok=ok, - error_message=error_message, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def answer_shipping_query( - self, - shipping_query_id: str, - ok: bool, - shipping_options: Optional[Sequence["ShippingOption"]] = None, - error_message: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().answer_shipping_query( - shipping_query_id=shipping_query_id, - ok=ok, - shipping_options=shipping_options, - error_message=error_message, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def answer_web_app_query( - self, - web_app_query_id: str, - result: "InlineQueryResult", - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> SentWebAppMessage: - return await super().answer_web_app_query( - web_app_query_id=web_app_query_id, - result=result, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def approve_chat_join_request( - self, - chat_id: Union[str, int], - user_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().approve_chat_join_request( - chat_id=chat_id, - user_id=user_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def ban_chat_member( - self, - chat_id: Union[str, int], - user_id: int, - until_date: Optional[Union[int, dtm.datetime]] = None, - revoke_messages: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().ban_chat_member( - chat_id=chat_id, - user_id=user_id, - until_date=until_date, - revoke_messages=revoke_messages, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def ban_chat_sender_chat( - self, - chat_id: Union[str, int], - sender_chat_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().ban_chat_sender_chat( - chat_id=chat_id, - sender_chat_id=sender_chat_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def create_chat_invite_link( - self, - chat_id: Union[str, int], - expire_date: Optional[Union[int, dtm.datetime]] = None, - member_limit: Optional[int] = None, - name: Optional[str] = None, - creates_join_request: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> ChatInviteLink: - return await super().create_chat_invite_link( - chat_id=chat_id, - expire_date=expire_date, - member_limit=member_limit, - name=name, - creates_join_request=creates_join_request, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def create_invoice_link( - self, - title: str, - description: str, - payload: str, - currency: str, - prices: Sequence["LabeledPrice"], - provider_token: Optional[str] = None, - max_tip_amount: Optional[int] = None, - suggested_tip_amounts: Optional[Sequence[int]] = None, - provider_data: Optional[Union[str, object]] = None, - photo_url: Optional[str] = None, - photo_size: Optional[int] = None, - photo_width: Optional[int] = None, - photo_height: Optional[int] = None, - need_name: Optional[bool] = None, - need_phone_number: Optional[bool] = None, - need_email: Optional[bool] = None, - need_shipping_address: Optional[bool] = None, - send_phone_number_to_provider: Optional[bool] = None, - send_email_to_provider: Optional[bool] = None, - is_flexible: Optional[bool] = None, - subscription_period: Optional[TimePeriod] = None, - business_connection_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> str: - return await super().create_invoice_link( - title=title, - description=description, - payload=payload, - provider_token=provider_token, - currency=currency, - prices=prices, - max_tip_amount=max_tip_amount, - suggested_tip_amounts=suggested_tip_amounts, - provider_data=provider_data, - photo_url=photo_url, - photo_size=photo_size, - photo_width=photo_width, - photo_height=photo_height, - need_name=need_name, - need_phone_number=need_phone_number, - need_email=need_email, - need_shipping_address=need_shipping_address, - send_phone_number_to_provider=send_phone_number_to_provider, - send_email_to_provider=send_email_to_provider, - is_flexible=is_flexible, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - subscription_period=subscription_period, - business_connection_id=business_connection_id, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def create_new_sticker_set( - self, - user_id: int, - name: str, - title: str, - stickers: Sequence["InputSticker"], - sticker_type: Optional[str] = None, - needs_repainting: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().create_new_sticker_set( - user_id=user_id, - name=name, - title=title, - stickers=stickers, - sticker_type=sticker_type, - needs_repainting=needs_repainting, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def decline_chat_join_request( - self, - chat_id: Union[str, int], - user_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().decline_chat_join_request( - chat_id=chat_id, - user_id=user_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def delete_chat_photo( - self, - chat_id: Union[str, int], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().delete_chat_photo( - chat_id=chat_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def delete_chat_sticker_set( - self, - chat_id: Union[str, int], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().delete_chat_sticker_set( - chat_id=chat_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def delete_forum_topic( - self, - chat_id: Union[str, int], - message_thread_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().delete_forum_topic( - chat_id=chat_id, - message_thread_id=message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def delete_message( - self, - chat_id: Union[str, int], - message_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().delete_message( - chat_id=chat_id, - message_id=message_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def delete_messages( - self, - chat_id: Union[str, int], - message_ids: Sequence[int], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().delete_messages( - chat_id=chat_id, - message_ids=message_ids, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def delete_my_commands( - self, - scope: Optional[BotCommandScope] = None, - language_code: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().delete_my_commands( - scope=scope, - language_code=language_code, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def delete_sticker_from_set( - self, - sticker: Union[str, "Sticker"], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().delete_sticker_from_set( - sticker=sticker, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def delete_webhook( - self, - drop_pending_updates: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().delete_webhook( - drop_pending_updates=drop_pending_updates, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def edit_chat_invite_link( - self, - chat_id: Union[str, int], - invite_link: Union[str, "ChatInviteLink"], - expire_date: Optional[Union[int, dtm.datetime]] = None, - member_limit: Optional[int] = None, - name: Optional[str] = None, - creates_join_request: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> ChatInviteLink: - return await super().edit_chat_invite_link( - chat_id=chat_id, - invite_link=invite_link, - expire_date=expire_date, - member_limit=member_limit, - name=name, - creates_join_request=creates_join_request, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def edit_forum_topic( - self, - chat_id: Union[str, int], - message_thread_id: int, - name: Optional[str] = None, - icon_custom_emoji_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().edit_forum_topic( - chat_id=chat_id, - message_thread_id=message_thread_id, - name=name, - icon_custom_emoji_id=icon_custom_emoji_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def edit_general_forum_topic( - self, - chat_id: Union[str, int], - name: str, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().edit_general_forum_topic( - chat_id=chat_id, - name=name, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def edit_message_caption( - self, - chat_id: Optional[Union[str, int]] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - caption: Optional[str] = None, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - show_caption_above_media: Optional[bool] = None, - business_connection_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> Union[Message, bool]: - return await super().edit_message_caption( - chat_id=chat_id, - message_id=message_id, - inline_message_id=inline_message_id, - caption=caption, - reply_markup=reply_markup, - parse_mode=parse_mode, - caption_entities=caption_entities, - business_connection_id=business_connection_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - show_caption_above_media=show_caption_above_media, - ) - - async def edit_message_live_location( - self, - chat_id: Optional[Union[str, int]] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - latitude: Optional[float] = None, - longitude: Optional[float] = None, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - horizontal_accuracy: Optional[float] = None, - heading: Optional[int] = None, - proximity_alert_radius: Optional[int] = None, - live_period: Optional[TimePeriod] = None, - business_connection_id: Optional[str] = None, - *, - location: Optional[Location] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> Union[Message, bool]: - return await super().edit_message_live_location( - chat_id=chat_id, - message_id=message_id, - inline_message_id=inline_message_id, - latitude=latitude, - longitude=longitude, - reply_markup=reply_markup, - horizontal_accuracy=horizontal_accuracy, - heading=heading, - proximity_alert_radius=proximity_alert_radius, - live_period=live_period, - location=location, - business_connection_id=business_connection_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def edit_message_media( - self, - media: "InputMedia", - chat_id: Optional[Union[str, int]] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - business_connection_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> Union[Message, bool]: - return await super().edit_message_media( - media=media, - chat_id=chat_id, - message_id=message_id, - inline_message_id=inline_message_id, - reply_markup=reply_markup, - business_connection_id=business_connection_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def edit_message_reply_markup( - self, - chat_id: Optional[Union[str, int]] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - business_connection_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> Union[Message, bool]: - return await super().edit_message_reply_markup( - chat_id=chat_id, - message_id=message_id, - inline_message_id=inline_message_id, - reply_markup=reply_markup, - business_connection_id=business_connection_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def edit_message_text( - self, - text: str, - chat_id: Optional[Union[str, int]] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - entities: Optional[Sequence["MessageEntity"]] = None, - link_preview_options: ODVInput["LinkPreviewOptions"] = DEFAULT_NONE, - business_connection_id: Optional[str] = None, - *, - disable_web_page_preview: Optional[bool] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> Union[Message, bool]: - return await super().edit_message_text( - text=text, - chat_id=chat_id, - message_id=message_id, - inline_message_id=inline_message_id, - parse_mode=parse_mode, - disable_web_page_preview=disable_web_page_preview, - reply_markup=reply_markup, - entities=entities, - business_connection_id=business_connection_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - link_preview_options=link_preview_options, - ) - - async def export_chat_invite_link( - self, - chat_id: Union[str, int], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> str: - return await super().export_chat_invite_link( - chat_id=chat_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def forward_message( - self, - chat_id: Union[int, str], - from_chat_id: Union[str, int], - message_id: int, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - video_start_timestamp: Optional[int] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> Message: - return await super().forward_message( - chat_id=chat_id, - from_chat_id=from_chat_id, - message_id=message_id, - video_start_timestamp=video_start_timestamp, - disable_notification=disable_notification, - protect_content=protect_content, - message_thread_id=message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def forward_messages( - self, - chat_id: Union[int, str], - from_chat_id: Union[str, int], - message_ids: Sequence[int], - disable_notification: ODVInput[bool] = DEFAULT_NONE, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> tuple[MessageId, ...]: - return await super().forward_messages( - chat_id=chat_id, - from_chat_id=from_chat_id, - message_ids=message_ids, - disable_notification=disable_notification, - protect_content=protect_content, - message_thread_id=message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def get_chat_administrators( - self, - chat_id: Union[str, int], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> tuple[ChatMember, ...]: - return await super().get_chat_administrators( - chat_id=chat_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def get_chat_member( - self, - chat_id: Union[str, int], - user_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> ChatMember: - return await super().get_chat_member( - chat_id=chat_id, - user_id=user_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def get_chat_member_count( - self, - chat_id: Union[str, int], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> int: - return await super().get_chat_member_count( - chat_id=chat_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def get_chat_menu_button( - self, - chat_id: Optional[int] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> MenuButton: - return await super().get_chat_menu_button( - chat_id=chat_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def get_file( - self, - file_id: Union[ - str, Animation, Audio, ChatPhoto, Document, PhotoSize, Sticker, Video, VideoNote, Voice - ], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> File: - return await super().get_file( - file_id=file_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def get_forum_topic_icon_stickers( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> tuple[Sticker, ...]: - return await super().get_forum_topic_icon_stickers( - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def get_game_high_scores( - self, - user_id: int, - chat_id: Optional[int] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> tuple[GameHighScore, ...]: - return await super().get_game_high_scores( - user_id=user_id, - chat_id=chat_id, - message_id=message_id, - inline_message_id=inline_message_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def get_me( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> User: - return await super().get_me( - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def get_my_commands( - self, - scope: Optional[BotCommandScope] = None, - language_code: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> tuple[BotCommand, ...]: - return await super().get_my_commands( - scope=scope, - language_code=language_code, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def get_my_default_administrator_rights( - self, - for_channels: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> ChatAdministratorRights: - return await super().get_my_default_administrator_rights( - for_channels=for_channels, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def get_sticker_set( - self, - name: str, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> StickerSet: - return await super().get_sticker_set( - name=name, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def get_custom_emoji_stickers( - self, - custom_emoji_ids: Sequence[str], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> tuple[Sticker, ...]: - return await super().get_custom_emoji_stickers( - custom_emoji_ids=custom_emoji_ids, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def get_user_profile_photos( - self, - user_id: int, - offset: Optional[int] = None, - limit: Optional[int] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> UserProfilePhotos: - return await super().get_user_profile_photos( - user_id=user_id, - offset=offset, - limit=limit, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def get_webhook_info( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> WebhookInfo: - return await super().get_webhook_info( - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def leave_chat( - self, - chat_id: Union[str, int], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().leave_chat( - chat_id=chat_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def log_out( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().log_out( - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def close( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().close( - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def close_forum_topic( - self, - chat_id: Union[str, int], - message_thread_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().close_forum_topic( - chat_id=chat_id, - message_thread_id=message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def close_general_forum_topic( - self, - chat_id: Union[str, int], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().close_general_forum_topic( - chat_id=chat_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def create_forum_topic( - self, - chat_id: Union[str, int], - name: str, - icon_color: Optional[int] = None, - icon_custom_emoji_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> ForumTopic: - return await super().create_forum_topic( - chat_id=chat_id, - name=name, - icon_color=icon_color, - icon_custom_emoji_id=icon_custom_emoji_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def reopen_general_forum_topic( - self, - chat_id: Union[str, int], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().reopen_general_forum_topic( - chat_id=chat_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def hide_general_forum_topic( - self, - chat_id: Union[str, int], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().hide_general_forum_topic( - chat_id=chat_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def unhide_general_forum_topic( - self, - chat_id: Union[str, int], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().unhide_general_forum_topic( - chat_id=chat_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def pin_chat_message( - self, - chat_id: Union[str, int], - message_id: int, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - business_connection_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().pin_chat_message( - chat_id=chat_id, - message_id=message_id, - disable_notification=disable_notification, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - business_connection_id=business_connection_id, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def promote_chat_member( - self, - chat_id: Union[str, int], - user_id: int, - can_change_info: Optional[bool] = None, - can_post_messages: Optional[bool] = None, - can_edit_messages: Optional[bool] = None, - can_delete_messages: Optional[bool] = None, - can_invite_users: Optional[bool] = None, - can_restrict_members: Optional[bool] = None, - can_pin_messages: Optional[bool] = None, - can_promote_members: Optional[bool] = None, - is_anonymous: Optional[bool] = None, - can_manage_chat: Optional[bool] = None, - can_manage_video_chats: Optional[bool] = None, - can_manage_topics: Optional[bool] = None, - can_post_stories: Optional[bool] = None, - can_edit_stories: Optional[bool] = None, - can_delete_stories: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().promote_chat_member( - chat_id=chat_id, - user_id=user_id, - can_change_info=can_change_info, - can_post_messages=can_post_messages, - can_edit_messages=can_edit_messages, - can_delete_messages=can_delete_messages, - can_invite_users=can_invite_users, - can_restrict_members=can_restrict_members, - can_pin_messages=can_pin_messages, - can_promote_members=can_promote_members, - is_anonymous=is_anonymous, - can_manage_chat=can_manage_chat, - can_manage_video_chats=can_manage_video_chats, - can_manage_topics=can_manage_topics, - can_post_stories=can_post_stories, - can_edit_stories=can_edit_stories, - can_delete_stories=can_delete_stories, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def reopen_forum_topic( - self, - chat_id: Union[str, int], - message_thread_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().reopen_forum_topic( - chat_id=chat_id, - message_thread_id=message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def restrict_chat_member( - self, - chat_id: Union[str, int], - user_id: int, - permissions: ChatPermissions, - until_date: Optional[Union[int, dtm.datetime]] = None, - use_independent_chat_permissions: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().restrict_chat_member( - chat_id=chat_id, - user_id=user_id, - permissions=permissions, - until_date=until_date, - use_independent_chat_permissions=use_independent_chat_permissions, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def revoke_chat_invite_link( - self, - chat_id: Union[str, int], - invite_link: Union[str, "ChatInviteLink"], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> ChatInviteLink: - return await super().revoke_chat_invite_link( - chat_id=chat_id, - invite_link=invite_link, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def send_animation( - self, - chat_id: Union[int, str], - animation: Union[FileInput, "Animation"], - duration: Optional[TimePeriod] = None, - width: Optional[int] = None, - height: Optional[int] = None, - caption: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - has_spoiler: Optional[bool] = None, - thumbnail: Optional[FileInput] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - show_caption_above_media: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - filename: Optional[str] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> Message: - return await super().send_animation( - chat_id=chat_id, - animation=animation, - duration=duration, - width=width, - height=height, - caption=caption, - parse_mode=parse_mode, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - caption_entities=caption_entities, - protect_content=protect_content, - message_thread_id=message_thread_id, - has_spoiler=has_spoiler, - thumbnail=thumbnail, - reply_parameters=reply_parameters, - filename=filename, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - business_connection_id=business_connection_id, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - show_caption_above_media=show_caption_above_media, - ) - - async def send_audio( - self, - chat_id: Union[int, str], - audio: Union[FileInput, "Audio"], - duration: Optional[TimePeriod] = None, - performer: Optional[str] = None, - title: Optional[str] = None, - caption: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - thumbnail: Optional[FileInput] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - filename: Optional[str] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> Message: - return await super().send_audio( - chat_id=chat_id, - audio=audio, - duration=duration, - performer=performer, - business_connection_id=business_connection_id, - title=title, - caption=caption, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_markup=reply_markup, - parse_mode=parse_mode, - allow_sending_without_reply=allow_sending_without_reply, - caption_entities=caption_entities, - protect_content=protect_content, - message_thread_id=message_thread_id, - thumbnail=thumbnail, - reply_parameters=reply_parameters, - filename=filename, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_chat_action( - self, - chat_id: Union[str, int], - action: str, - message_thread_id: Optional[int] = None, - business_connection_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().send_chat_action( - chat_id=chat_id, - business_connection_id=business_connection_id, - action=action, - message_thread_id=message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def send_contact( - self, - chat_id: Union[int, str], - phone_number: Optional[str] = None, - first_name: Optional[str] = None, - last_name: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - vcard: Optional[str] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - contact: Optional[Contact] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> Message: - return await super().send_contact( - chat_id=chat_id, - phone_number=phone_number, - first_name=first_name, - last_name=last_name, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_markup=reply_markup, - vcard=vcard, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - reply_parameters=reply_parameters, - contact=contact, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - business_connection_id=business_connection_id, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_dice( - self, - chat_id: Union[int, str], - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - emoji: Optional[str] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> Message: - return await super().send_dice( - chat_id=chat_id, - disable_notification=disable_notification, - business_connection_id=business_connection_id, - reply_to_message_id=reply_to_message_id, - reply_markup=reply_markup, - emoji=emoji, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - reply_parameters=reply_parameters, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_document( - self, - chat_id: Union[int, str], - document: Union[FileInput, "Document"], - caption: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - disable_content_type_detection: Optional[bool] = None, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - thumbnail: Optional[FileInput] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - filename: Optional[str] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> Message: - return await super().send_document( - chat_id=chat_id, - document=document, - caption=caption, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_markup=reply_markup, - parse_mode=parse_mode, - disable_content_type_detection=disable_content_type_detection, - allow_sending_without_reply=allow_sending_without_reply, - caption_entities=caption_entities, - protect_content=protect_content, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - thumbnail=thumbnail, - reply_parameters=reply_parameters, - filename=filename, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_game( - self, - chat_id: int, - game_short_name: str, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> Message: - return await super().send_game( - chat_id=chat_id, - game_short_name=game_short_name, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_markup=reply_markup, - business_connection_id=business_connection_id, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - reply_parameters=reply_parameters, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_invoice( - self, - chat_id: Union[int, str], - title: str, - description: str, - payload: str, - currency: str, - prices: Sequence["LabeledPrice"], - provider_token: Optional[str] = None, - start_parameter: Optional[str] = None, - photo_url: Optional[str] = None, - photo_size: Optional[int] = None, - photo_width: Optional[int] = None, - photo_height: Optional[int] = None, - need_name: Optional[bool] = None, - need_phone_number: Optional[bool] = None, - need_email: Optional[bool] = None, - need_shipping_address: Optional[bool] = None, - is_flexible: Optional[bool] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - provider_data: Optional[Union[str, object]] = None, - send_phone_number_to_provider: Optional[bool] = None, - send_email_to_provider: Optional[bool] = None, - max_tip_amount: Optional[int] = None, - suggested_tip_amounts: Optional[Sequence[int]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> Message: - return await super().send_invoice( - chat_id=chat_id, - title=title, - description=description, - payload=payload, - provider_token=provider_token, - currency=currency, - prices=prices, - start_parameter=start_parameter, - photo_url=photo_url, - photo_size=photo_size, - photo_width=photo_width, - photo_height=photo_height, - need_name=need_name, - need_phone_number=need_phone_number, - need_email=need_email, - need_shipping_address=need_shipping_address, - is_flexible=is_flexible, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_markup=reply_markup, - provider_data=provider_data, - send_phone_number_to_provider=send_phone_number_to_provider, - send_email_to_provider=send_email_to_provider, - allow_sending_without_reply=allow_sending_without_reply, - max_tip_amount=max_tip_amount, - suggested_tip_amounts=suggested_tip_amounts, - protect_content=protect_content, - message_thread_id=message_thread_id, - reply_parameters=reply_parameters, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_location( - self, - chat_id: Union[int, str], - latitude: Optional[float] = None, - longitude: Optional[float] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - live_period: Optional[TimePeriod] = None, - horizontal_accuracy: Optional[float] = None, - heading: Optional[int] = None, - proximity_alert_radius: Optional[int] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - location: Optional[Location] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> Message: - return await super().send_location( - chat_id=chat_id, - latitude=latitude, - longitude=longitude, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_markup=reply_markup, - live_period=live_period, - horizontal_accuracy=horizontal_accuracy, - heading=heading, - proximity_alert_radius=proximity_alert_radius, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - reply_parameters=reply_parameters, - location=location, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - business_connection_id=business_connection_id, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_media_group( - self, - chat_id: Union[int, str], - media: Sequence[ - Union["InputMediaAudio", "InputMediaDocument", "InputMediaPhoto", "InputMediaVideo"] - ], - disable_notification: ODVInput[bool] = DEFAULT_NONE, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - caption: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - ) -> tuple[Message, ...]: - return await super().send_media_group( - chat_id=chat_id, - media=media, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - reply_parameters=reply_parameters, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - caption=caption, - business_connection_id=business_connection_id, - parse_mode=parse_mode, - caption_entities=caption_entities, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_message( - self, - chat_id: Union[int, str], - text: str, - parse_mode: ODVInput[str] = DEFAULT_NONE, - entities: Optional[Sequence["MessageEntity"]] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - protect_content: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - message_thread_id: Optional[int] = None, - link_preview_options: ODVInput["LinkPreviewOptions"] = DEFAULT_NONE, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - disable_web_page_preview: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> Message: - return await super().send_message( - chat_id=chat_id, - text=text, - parse_mode=parse_mode, - entities=entities, - disable_web_page_preview=disable_web_page_preview, - disable_notification=disable_notification, - business_connection_id=business_connection_id, - protect_content=protect_content, - message_thread_id=message_thread_id, - reply_to_message_id=reply_to_message_id, - allow_sending_without_reply=allow_sending_without_reply, - reply_markup=reply_markup, - reply_parameters=reply_parameters, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - link_preview_options=link_preview_options, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_photo( - self, - chat_id: Union[int, str], - photo: Union[FileInput, "PhotoSize"], - caption: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - has_spoiler: Optional[bool] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - show_caption_above_media: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - filename: Optional[str] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> Message: - return await super().send_photo( - chat_id=chat_id, - photo=photo, - caption=caption, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_markup=reply_markup, - parse_mode=parse_mode, - allow_sending_without_reply=allow_sending_without_reply, - caption_entities=caption_entities, - protect_content=protect_content, - message_thread_id=message_thread_id, - has_spoiler=has_spoiler, - reply_parameters=reply_parameters, - filename=filename, - business_connection_id=business_connection_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - show_caption_above_media=show_caption_above_media, - ) - - async def send_poll( - self, - chat_id: Union[int, str], - question: str, - options: Sequence[Union[str, "InputPollOption"]], - is_anonymous: Optional[bool] = None, - type: Optional[str] = None, # pylint: disable=redefined-builtin - allows_multiple_answers: Optional[bool] = None, - correct_option_id: Optional[CorrectOptionID] = None, - is_closed: Optional[bool] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - explanation: Optional[str] = None, - explanation_parse_mode: ODVInput[str] = DEFAULT_NONE, - open_period: Optional[TimePeriod] = None, - close_date: Optional[Union[int, dtm.datetime]] = None, - explanation_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - question_parse_mode: ODVInput[str] = DEFAULT_NONE, - question_entities: Optional[Sequence["MessageEntity"]] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> Message: - return await super().send_poll( - chat_id=chat_id, - question=question, - options=options, - is_anonymous=is_anonymous, - type=type, - allows_multiple_answers=allows_multiple_answers, - correct_option_id=correct_option_id, - is_closed=is_closed, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_markup=reply_markup, - explanation=explanation, - explanation_parse_mode=explanation_parse_mode, - open_period=open_period, - close_date=close_date, - allow_sending_without_reply=allow_sending_without_reply, - explanation_entities=explanation_entities, - business_connection_id=business_connection_id, - protect_content=protect_content, - message_thread_id=message_thread_id, - reply_parameters=reply_parameters, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - question_parse_mode=question_parse_mode, - question_entities=question_entities, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_sticker( - self, - chat_id: Union[int, str], - sticker: Union[FileInput, "Sticker"], - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - emoji: Optional[str] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> Message: - return await super().send_sticker( - chat_id=chat_id, - sticker=sticker, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_markup=reply_markup, - business_connection_id=business_connection_id, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - reply_parameters=reply_parameters, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - emoji=emoji, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_venue( - self, - chat_id: Union[int, str], - latitude: Optional[float] = None, - longitude: Optional[float] = None, - title: Optional[str] = None, - address: Optional[str] = None, - foursquare_id: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - foursquare_type: Optional[str] = None, - google_place_id: Optional[str] = None, - google_place_type: Optional[str] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - venue: Optional[Venue] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> Message: - return await super().send_venue( - chat_id=chat_id, - latitude=latitude, - longitude=longitude, - title=title, - address=address, - foursquare_id=foursquare_id, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_markup=reply_markup, - foursquare_type=foursquare_type, - google_place_id=google_place_id, - google_place_type=google_place_type, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - reply_parameters=reply_parameters, - venue=venue, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_video( - self, - chat_id: Union[int, str], - video: Union[FileInput, "Video"], - duration: Optional[TimePeriod] = None, - caption: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - width: Optional[int] = None, - height: Optional[int] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - supports_streaming: Optional[bool] = None, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - has_spoiler: Optional[bool] = None, - thumbnail: Optional[FileInput] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - show_caption_above_media: Optional[bool] = None, - cover: Optional[FileInput] = None, - start_timestamp: Optional[int] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - filename: Optional[str] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> Message: - return await super().send_video( - chat_id=chat_id, - video=video, - duration=duration, - caption=caption, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_markup=reply_markup, - width=width, - height=height, - parse_mode=parse_mode, - supports_streaming=supports_streaming, - allow_sending_without_reply=allow_sending_without_reply, - caption_entities=caption_entities, - protect_content=protect_content, - message_thread_id=message_thread_id, - business_connection_id=business_connection_id, - has_spoiler=has_spoiler, - thumbnail=thumbnail, - cover=cover, - start_timestamp=start_timestamp, - filename=filename, - reply_parameters=reply_parameters, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - show_caption_above_media=show_caption_above_media, - ) - - async def send_video_note( - self, - chat_id: Union[int, str], - video_note: Union[FileInput, "VideoNote"], - duration: Optional[TimePeriod] = None, - length: Optional[int] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - thumbnail: Optional[FileInput] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - filename: Optional[str] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> Message: - return await super().send_video_note( - chat_id=chat_id, - video_note=video_note, - duration=duration, - length=length, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - protect_content=protect_content, - message_thread_id=message_thread_id, - thumbnail=thumbnail, - reply_parameters=reply_parameters, - filename=filename, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def send_voice( - self, - chat_id: Union[int, str], - voice: Union[FileInput, "Voice"], - duration: Optional[TimePeriod] = None, - caption: Optional[str] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - reply_markup: Optional[ReplyMarkup] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - message_thread_id: Optional[int] = None, - reply_parameters: Optional["ReplyParameters"] = None, - business_connection_id: Optional[str] = None, - message_effect_id: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - reply_to_message_id: Optional[int] = None, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - filename: Optional[str] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> Message: - return await super().send_voice( - chat_id=chat_id, - voice=voice, - duration=duration, - caption=caption, - disable_notification=disable_notification, - reply_to_message_id=reply_to_message_id, - reply_markup=reply_markup, - parse_mode=parse_mode, - allow_sending_without_reply=allow_sending_without_reply, - caption_entities=caption_entities, - protect_content=protect_content, - message_thread_id=message_thread_id, - reply_parameters=reply_parameters, - filename=filename, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - business_connection_id=business_connection_id, - message_effect_id=message_effect_id, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def set_chat_administrator_custom_title( - self, - chat_id: Union[int, str], - user_id: int, - custom_title: str, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().set_chat_administrator_custom_title( - chat_id=chat_id, - user_id=user_id, - custom_title=custom_title, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def set_chat_description( - self, - chat_id: Union[str, int], - description: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().set_chat_description( - chat_id=chat_id, - description=description, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def set_user_emoji_status( - self, - user_id: int, - emoji_status_custom_emoji_id: Optional[str] = None, - emoji_status_expiration_date: Optional[Union[int, dtm.datetime]] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().set_user_emoji_status( - user_id=user_id, - emoji_status_custom_emoji_id=emoji_status_custom_emoji_id, - emoji_status_expiration_date=emoji_status_expiration_date, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def set_chat_menu_button( - self, - chat_id: Optional[int] = None, - menu_button: Optional[MenuButton] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().set_chat_menu_button( - chat_id=chat_id, - menu_button=menu_button, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def set_chat_permissions( - self, - chat_id: Union[str, int], - permissions: ChatPermissions, - use_independent_chat_permissions: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().set_chat_permissions( - chat_id=chat_id, - permissions=permissions, - use_independent_chat_permissions=use_independent_chat_permissions, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def set_chat_photo( - self, - chat_id: Union[str, int], - photo: FileInput, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().set_chat_photo( - chat_id=chat_id, - photo=photo, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def set_chat_sticker_set( - self, - chat_id: Union[str, int], - sticker_set_name: str, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().set_chat_sticker_set( - chat_id=chat_id, - sticker_set_name=sticker_set_name, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def set_chat_title( - self, - chat_id: Union[str, int], - title: str, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().set_chat_title( - chat_id=chat_id, - title=title, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def set_game_score( - self, - user_id: int, - score: int, - chat_id: Optional[int] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - force: Optional[bool] = None, - disable_edit_message: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> Union[Message, bool]: - return await super().set_game_score( - user_id=user_id, - score=score, - chat_id=chat_id, - message_id=message_id, - inline_message_id=inline_message_id, - force=force, - disable_edit_message=disable_edit_message, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def set_my_commands( - self, - commands: Sequence[Union[BotCommand, tuple[str, str]]], - scope: Optional[BotCommandScope] = None, - language_code: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().set_my_commands( - commands=commands, - scope=scope, - language_code=language_code, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def set_my_default_administrator_rights( - self, - rights: Optional[ChatAdministratorRights] = None, - for_channels: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().set_my_default_administrator_rights( - rights=rights, - for_channels=for_channels, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def set_passport_data_errors( - self, - user_id: int, - errors: Sequence["PassportElementError"], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().set_passport_data_errors( - user_id=user_id, - errors=errors, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def set_sticker_position_in_set( - self, - sticker: Union[str, "Sticker"], - position: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().set_sticker_position_in_set( - sticker=sticker, - position=position, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def set_sticker_set_thumbnail( - self, - name: str, - user_id: int, - format: str, # pylint: disable=redefined-builtin - thumbnail: Optional[FileInput] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().set_sticker_set_thumbnail( - name=name, - user_id=user_id, - thumbnail=thumbnail, - format=format, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def set_webhook( - self, - url: str, - certificate: Optional[FileInput] = None, - max_connections: Optional[int] = None, - allowed_updates: Optional[Sequence[str]] = None, - ip_address: Optional[str] = None, - drop_pending_updates: Optional[bool] = None, - secret_token: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().set_webhook( - url=url, - certificate=certificate, - max_connections=max_connections, - allowed_updates=allowed_updates, - ip_address=ip_address, - drop_pending_updates=drop_pending_updates, - secret_token=secret_token, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def stop_message_live_location( - self, - chat_id: Optional[Union[str, int]] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - reply_markup: Optional["InlineKeyboardMarkup"] = None, - business_connection_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> Union[Message, bool]: - return await super().stop_message_live_location( - chat_id=chat_id, - message_id=message_id, - inline_message_id=inline_message_id, - reply_markup=reply_markup, - business_connection_id=business_connection_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def unban_chat_member( - self, - chat_id: Union[str, int], - user_id: int, - only_if_banned: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().unban_chat_member( - chat_id=chat_id, - user_id=user_id, - only_if_banned=only_if_banned, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def unban_chat_sender_chat( - self, - chat_id: Union[str, int], - sender_chat_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().unban_chat_sender_chat( - chat_id=chat_id, - sender_chat_id=sender_chat_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def unpin_all_chat_messages( - self, - chat_id: Union[str, int], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().unpin_all_chat_messages( - chat_id=chat_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def unpin_chat_message( - self, - chat_id: Union[str, int], - message_id: Optional[int] = None, - business_connection_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().unpin_chat_message( - chat_id=chat_id, - message_id=message_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - business_connection_id=business_connection_id, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def unpin_all_forum_topic_messages( - self, - chat_id: Union[str, int], - message_thread_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().unpin_all_forum_topic_messages( - chat_id=chat_id, - message_thread_id=message_thread_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def unpin_all_general_forum_topic_messages( - self, - chat_id: Union[str, int], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().unpin_all_general_forum_topic_messages( - chat_id=chat_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def upload_sticker_file( - self, - user_id: int, - sticker: FileInput, - sticker_format: str, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> File: - return await super().upload_sticker_file( - user_id=user_id, - sticker=sticker, - sticker_format=sticker_format, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def set_my_description( - self, - description: Optional[str] = None, - language_code: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().set_my_description( - description=description, - language_code=language_code, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def set_my_short_description( - self, - short_description: Optional[str] = None, - language_code: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().set_my_short_description( - short_description=short_description, - language_code=language_code, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def get_my_description( - self, - language_code: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> BotDescription: - return await super().get_my_description( - language_code=language_code, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def get_my_short_description( - self, - language_code: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> BotShortDescription: - return await super().get_my_short_description( - language_code=language_code, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def set_my_name( - self, - name: Optional[str] = None, - language_code: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().set_my_name( - name=name, - language_code=language_code, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def get_my_name( - self, - language_code: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> BotName: - return await super().get_my_name( - language_code=language_code, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def set_custom_emoji_sticker_set_thumbnail( - self, - name: str, - custom_emoji_id: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().set_custom_emoji_sticker_set_thumbnail( - name=name, - custom_emoji_id=custom_emoji_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def set_sticker_set_title( - self, - name: str, - title: str, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().set_sticker_set_title( - name=name, - title=title, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def delete_sticker_set( - self, - name: str, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().delete_sticker_set( - name=name, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def set_sticker_emoji_list( - self, - sticker: Union[str, "Sticker"], - emoji_list: Sequence[str], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().set_sticker_emoji_list( - sticker=sticker, - emoji_list=emoji_list, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def set_sticker_keywords( - self, - sticker: Union[str, "Sticker"], - keywords: Optional[Sequence[str]] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().set_sticker_keywords( - sticker=sticker, - keywords=keywords, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def set_sticker_mask_position( - self, - sticker: Union[str, "Sticker"], - mask_position: Optional[MaskPosition] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().set_sticker_mask_position( - sticker=sticker, - mask_position=mask_position, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def get_user_chat_boosts( - self, - chat_id: Union[str, int], - user_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> UserChatBoosts: - return await super().get_user_chat_boosts( - chat_id=chat_id, - user_id=user_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def set_message_reaction( - self, - chat_id: Union[str, int], - message_id: int, - reaction: Optional[Union[Sequence[Union[ReactionType, str]], ReactionType, str]] = None, - is_big: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().set_message_reaction( - chat_id=chat_id, - message_id=message_id, - reaction=reaction, - is_big=is_big, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def gift_premium_subscription( - self, - user_id: int, - month_count: int, - star_count: int, - text: Optional[str] = None, - text_parse_mode: ODVInput[str] = DEFAULT_NONE, - text_entities: Optional[Sequence["MessageEntity"]] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().gift_premium_subscription( - user_id=user_id, - month_count=month_count, - star_count=star_count, - text=text, - text_parse_mode=text_parse_mode, - text_entities=text_entities, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def get_business_connection( - self, - business_connection_id: str, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> BusinessConnection: - return await super().get_business_connection( - business_connection_id=business_connection_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def get_business_account_gifts( - self, - business_connection_id: str, - exclude_unsaved: Optional[bool] = None, - exclude_saved: Optional[bool] = None, - exclude_unlimited: Optional[bool] = None, - exclude_limited: Optional[bool] = None, - exclude_unique: Optional[bool] = None, - sort_by_price: Optional[bool] = None, - offset: Optional[str] = None, - limit: Optional[int] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> OwnedGifts: - return await super().get_business_account_gifts( - business_connection_id=business_connection_id, - exclude_unsaved=exclude_unsaved, - exclude_saved=exclude_saved, - exclude_unlimited=exclude_unlimited, - exclude_limited=exclude_limited, - exclude_unique=exclude_unique, - sort_by_price=sort_by_price, - offset=offset, - limit=limit, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def get_business_account_star_balance( - self, - business_connection_id: str, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> StarAmount: - return await super().get_business_account_star_balance( - business_connection_id=business_connection_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def read_business_message( - self, - business_connection_id: str, - chat_id: int, - message_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().read_business_message( - business_connection_id=business_connection_id, - chat_id=chat_id, - message_id=message_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def delete_business_messages( - self, - business_connection_id: str, - message_ids: Sequence[int], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().delete_business_messages( - business_connection_id=business_connection_id, - message_ids=message_ids, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def post_story( - self, - business_connection_id: str, - content: "InputStoryContent", - active_period: TimePeriod, - caption: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - areas: Optional[Sequence["StoryArea"]] = None, - post_to_chat_page: Optional[bool] = None, - protect_content: ODVInput[bool] = DEFAULT_NONE, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> Story: - return await super().post_story( - business_connection_id=business_connection_id, - content=content, - active_period=active_period, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - areas=areas, - post_to_chat_page=post_to_chat_page, - protect_content=protect_content, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def edit_story( - self, - business_connection_id: str, - story_id: int, - content: "InputStoryContent", - caption: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - areas: Optional[Sequence["StoryArea"]] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> Story: - return await super().edit_story( - business_connection_id=business_connection_id, - story_id=story_id, - content=content, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - areas=areas, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def delete_story( - self, - business_connection_id: str, - story_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().delete_story( - business_connection_id=business_connection_id, - story_id=story_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def set_business_account_name( - self, - business_connection_id: str, - first_name: str, - last_name: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().set_business_account_name( - business_connection_id=business_connection_id, - first_name=first_name, - last_name=last_name, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def set_business_account_username( - self, - business_connection_id: str, - username: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().set_business_account_username( - business_connection_id=business_connection_id, - username=username, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def set_business_account_bio( - self, - business_connection_id: str, - bio: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().set_business_account_bio( - business_connection_id=business_connection_id, - bio=bio, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def set_business_account_gift_settings( - self, - business_connection_id: str, - show_gift_button: bool, - accepted_gift_types: AcceptedGiftTypes, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().set_business_account_gift_settings( - business_connection_id=business_connection_id, - show_gift_button=show_gift_button, - accepted_gift_types=accepted_gift_types, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def set_business_account_profile_photo( - self, - business_connection_id: str, - photo: "InputProfilePhoto", - is_public: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().set_business_account_profile_photo( - business_connection_id=business_connection_id, - photo=photo, - is_public=is_public, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def remove_business_account_profile_photo( - self, - business_connection_id: str, - is_public: Optional[bool] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().remove_business_account_profile_photo( - business_connection_id=business_connection_id, - is_public=is_public, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def convert_gift_to_stars( - self, - business_connection_id: str, - owned_gift_id: str, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().convert_gift_to_stars( - business_connection_id=business_connection_id, - owned_gift_id=owned_gift_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def upgrade_gift( - self, - business_connection_id: str, - owned_gift_id: str, - keep_original_details: Optional[bool] = None, - star_count: Optional[int] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().upgrade_gift( - business_connection_id=business_connection_id, - owned_gift_id=owned_gift_id, - keep_original_details=keep_original_details, - star_count=star_count, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def transfer_gift( - self, - business_connection_id: str, - owned_gift_id: str, - new_owner_chat_id: int, - star_count: Optional[int] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().transfer_gift( - business_connection_id=business_connection_id, - owned_gift_id=owned_gift_id, - new_owner_chat_id=new_owner_chat_id, - star_count=star_count, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def transfer_business_account_stars( - self, - business_connection_id: str, - star_count: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().transfer_business_account_stars( - business_connection_id=business_connection_id, - star_count=star_count, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def replace_sticker_in_set( - self, - user_id: int, - name: str, - old_sticker: Union[str, "Sticker"], - sticker: "InputSticker", - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().replace_sticker_in_set( - user_id=user_id, - name=name, - old_sticker=old_sticker, - sticker=sticker, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def refund_star_payment( - self, - user_id: int, - telegram_payment_charge_id: str, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().refund_star_payment( - user_id=user_id, - telegram_payment_charge_id=telegram_payment_charge_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def get_star_transactions( - self, - offset: Optional[int] = None, - limit: Optional[int] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> StarTransactions: - return await super().get_star_transactions( - offset=offset, - limit=limit, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def edit_user_star_subscription( - self, - user_id: int, - telegram_payment_charge_id: str, - is_canceled: bool, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().edit_user_star_subscription( - user_id=user_id, - telegram_payment_charge_id=telegram_payment_charge_id, - is_canceled=is_canceled, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def send_paid_media( - self, - chat_id: Union[str, int], - star_count: int, - media: Sequence["InputPaidMedia"], - caption: Optional[str] = None, - parse_mode: ODVInput[str] = DEFAULT_NONE, - caption_entities: Optional[Sequence["MessageEntity"]] = None, - show_caption_above_media: Optional[bool] = None, - disable_notification: ODVInput[bool] = DEFAULT_NONE, - protect_content: ODVInput[bool] = DEFAULT_NONE, - reply_parameters: Optional["ReplyParameters"] = None, - reply_markup: Optional[ReplyMarkup] = None, - business_connection_id: Optional[str] = None, - payload: Optional[str] = None, - allow_paid_broadcast: Optional[bool] = None, - *, - allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, - reply_to_message_id: Optional[int] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> Message: - return await super().send_paid_media( - chat_id=chat_id, - star_count=star_count, - media=media, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - disable_notification=disable_notification, - protect_content=protect_content, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - business_connection_id=business_connection_id, - payload=payload, - allow_paid_broadcast=allow_paid_broadcast, - ) - - async def create_chat_subscription_invite_link( - self, - chat_id: Union[str, int], - subscription_period: TimePeriod, - subscription_price: int, - name: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> ChatInviteLink: - return await super().create_chat_subscription_invite_link( - chat_id=chat_id, - subscription_period=subscription_period, - subscription_price=subscription_price, - name=name, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def edit_chat_subscription_invite_link( - self, - chat_id: Union[str, int], - invite_link: Union[str, "ChatInviteLink"], - name: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> ChatInviteLink: - return await super().edit_chat_subscription_invite_link( - chat_id=chat_id, - invite_link=invite_link, - name=name, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def get_available_gifts( - self, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> Gifts: - return await super().get_available_gifts( - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def send_gift( - self, - gift_id: Union[str, Gift], - text: Optional[str] = None, - text_parse_mode: ODVInput[str] = DEFAULT_NONE, - text_entities: Optional[Sequence["MessageEntity"]] = None, - pay_for_upgrade: Optional[bool] = None, - chat_id: Optional[Union[str, int]] = None, - user_id: Optional[int] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().send_gift( - user_id=user_id, - chat_id=chat_id, - gift_id=gift_id, - text=text, - text_parse_mode=text_parse_mode, - text_entities=text_entities, - pay_for_upgrade=pay_for_upgrade, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def verify_chat( - self, - chat_id: Union[int, str], - custom_description: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().verify_chat( - chat_id=chat_id, - custom_description=custom_description, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def verify_user( - self, - user_id: int, - custom_description: Optional[str] = None, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().verify_user( - user_id=user_id, - custom_description=custom_description, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def remove_chat_verification( - self, - chat_id: Union[int, str], - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().remove_chat_verification( - chat_id=chat_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - async def remove_user_verification( - self, - user_id: int, - *, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - api_kwargs: Optional[JSONDict] = None, - rate_limit_args: Optional[RLARGS] = None, - ) -> bool: - return await super().remove_user_verification( - user_id=user_id, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - api_kwargs=self._merge_api_rl_kwargs(api_kwargs, rate_limit_args), - ) - - # updated camelCase aliases - getMe = get_me - sendMessage = send_message - deleteMessage = delete_message - deleteMessages = delete_messages - forwardMessage = forward_message - forwardMessages = forward_messages - sendPhoto = send_photo - sendAudio = send_audio - sendDocument = send_document - sendSticker = send_sticker - sendVideo = send_video - sendAnimation = send_animation - sendVoice = send_voice - sendVideoNote = send_video_note - sendMediaGroup = send_media_group - sendLocation = send_location - editMessageLiveLocation = edit_message_live_location - stopMessageLiveLocation = stop_message_live_location - sendVenue = send_venue - sendContact = send_contact - sendGame = send_game - sendChatAction = send_chat_action - answerInlineQuery = answer_inline_query - savePreparedInlineMessage = save_prepared_inline_message - getUserProfilePhotos = get_user_profile_photos - getFile = get_file - banChatMember = ban_chat_member - banChatSenderChat = ban_chat_sender_chat - unbanChatMember = unban_chat_member - unbanChatSenderChat = unban_chat_sender_chat - answerCallbackQuery = answer_callback_query - editMessageText = edit_message_text - editMessageCaption = edit_message_caption - editMessageMedia = edit_message_media - editMessageReplyMarkup = edit_message_reply_markup - getUpdates = get_updates - setWebhook = set_webhook - deleteWebhook = delete_webhook - leaveChat = leave_chat - getChat = get_chat - getChatAdministrators = get_chat_administrators - getChatMember = get_chat_member - setChatStickerSet = set_chat_sticker_set - deleteChatStickerSet = delete_chat_sticker_set - getChatMemberCount = get_chat_member_count - getWebhookInfo = get_webhook_info - setGameScore = set_game_score - getGameHighScores = get_game_high_scores - sendInvoice = send_invoice - answerShippingQuery = answer_shipping_query - answerPreCheckoutQuery = answer_pre_checkout_query - answerWebAppQuery = answer_web_app_query - restrictChatMember = restrict_chat_member - promoteChatMember = promote_chat_member - setChatPermissions = set_chat_permissions - setChatAdministratorCustomTitle = set_chat_administrator_custom_title - exportChatInviteLink = export_chat_invite_link - createChatInviteLink = create_chat_invite_link - editChatInviteLink = edit_chat_invite_link - revokeChatInviteLink = revoke_chat_invite_link - approveChatJoinRequest = approve_chat_join_request - declineChatJoinRequest = decline_chat_join_request - setChatPhoto = set_chat_photo - deleteChatPhoto = delete_chat_photo - setChatTitle = set_chat_title - setChatDescription = set_chat_description - setUserEmojiStatus = set_user_emoji_status - pinChatMessage = pin_chat_message - unpinChatMessage = unpin_chat_message - unpinAllChatMessages = unpin_all_chat_messages - getStickerSet = get_sticker_set - getCustomEmojiStickers = get_custom_emoji_stickers - uploadStickerFile = upload_sticker_file - createNewStickerSet = create_new_sticker_set - addStickerToSet = add_sticker_to_set - setStickerPositionInSet = set_sticker_position_in_set - deleteStickerFromSet = delete_sticker_from_set - setStickerSetThumbnail = set_sticker_set_thumbnail - setPassportDataErrors = set_passport_data_errors - sendPoll = send_poll - stopPoll = stop_poll - sendDice = send_dice - getMyCommands = get_my_commands - setMyCommands = set_my_commands - deleteMyCommands = delete_my_commands - logOut = log_out - copyMessage = copy_message - copyMessages = copy_messages - getChatMenuButton = get_chat_menu_button - setChatMenuButton = set_chat_menu_button - getMyDefaultAdministratorRights = get_my_default_administrator_rights - setMyDefaultAdministratorRights = set_my_default_administrator_rights - createInvoiceLink = create_invoice_link - getForumTopicIconStickers = get_forum_topic_icon_stickers - createForumTopic = create_forum_topic - editForumTopic = edit_forum_topic - closeForumTopic = close_forum_topic - reopenForumTopic = reopen_forum_topic - deleteForumTopic = delete_forum_topic - unpinAllForumTopicMessages = unpin_all_forum_topic_messages - editGeneralForumTopic = edit_general_forum_topic - closeGeneralForumTopic = close_general_forum_topic - reopenGeneralForumTopic = reopen_general_forum_topic - hideGeneralForumTopic = hide_general_forum_topic - unhideGeneralForumTopic = unhide_general_forum_topic - setMyDescription = set_my_description - getMyDescription = get_my_description - setMyShortDescription = set_my_short_description - getMyShortDescription = get_my_short_description - setCustomEmojiStickerSetThumbnail = set_custom_emoji_sticker_set_thumbnail - setStickerSetTitle = set_sticker_set_title - deleteStickerSet = delete_sticker_set - setStickerEmojiList = set_sticker_emoji_list - setStickerKeywords = set_sticker_keywords - setStickerMaskPosition = set_sticker_mask_position - setMyName = set_my_name - getMyName = get_my_name - unpinAllGeneralForumTopicMessages = unpin_all_general_forum_topic_messages - getUserChatBoosts = get_user_chat_boosts - setMessageReaction = set_message_reaction - giftPremiumSubscription = gift_premium_subscription - getBusinessConnection = get_business_connection - getBusinessAccountGifts = get_business_account_gifts - getBusinessAccountStarBalance = get_business_account_star_balance - readBusinessMessage = read_business_message - deleteBusinessMessages = delete_business_messages - postStory = post_story - editStory = edit_story - deleteStory = delete_story - setBusinessAccountName = set_business_account_name - setBusinessAccountUsername = set_business_account_username - setBusinessAccountBio = set_business_account_bio - setBusinessAccountGiftSettings = set_business_account_gift_settings - setBusinessAccountProfilePhoto = set_business_account_profile_photo - removeBusinessAccountProfilePhoto = remove_business_account_profile_photo - convertGiftToStars = convert_gift_to_stars - upgradeGift = upgrade_gift - transferGift = transfer_gift - transferBusinessAccountStars = transfer_business_account_stars - replaceStickerInSet = replace_sticker_in_set - refundStarPayment = refund_star_payment - getStarTransactions = get_star_transactions - editUserStarSubscription = edit_user_star_subscription - createChatSubscriptionInviteLink = create_chat_subscription_invite_link - editChatSubscriptionInviteLink = edit_chat_subscription_invite_link - sendPaidMedia = send_paid_media - getAvailableGifts = get_available_gifts - sendGift = send_gift - verifyChat = verify_chat - verifyUser = verify_user - removeChatVerification = remove_chat_verification - removeUserVerification = remove_user_verification diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__init__.py b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 3bf489d0f963abe313233dba9db49dfc2b4530c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 215 zcmZ8b%L>9U5Nxc12>lQb?V?`AlV^V+#Aa!Od6XoL7C*$BcfZBY@GeMiJ(->a2X<#> z*@1ax*&>N}->>z^uW|jOpT^5A>5?TmJQ6#Jt{;Df0JTvFig_1cZ^~Ao_6|HstSnQx z^P)VV&AB;iX&6Tf0d)W=j?i?zHhNR6*5HK4ykX^uRrpH-UOdp6X)e(^pj2q#DJ`0A Ym~WNgt;C(3#Tq1z8^tFjgxEByFEoNZJ^%m! diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/basehandler.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/basehandler.cpython-312.pyc deleted file mode 100644 index 5da37cf53b587a98705e796ee516cce7f061f3ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7639 zcmcIpTZ|k>6|H&h?EB$YoH(WugY60H+1Lw?GzuWIb{;r3C?10{!J6squG#6hr+ZS} zvzu`i6i5UC1u5`>!w;Abgpq^9XZRv~^AiiCgcebP5E4iTP1qozd~t47cTdmSPJ$v@ z+M4cq+`4t|xv$#aO;1lSJpcUh)9qjHW9%>V5kIBqW$RVETxJ%lGb>|dolGZN&vtV4 zT!y}LPQFv97dpjyu`^a5>y+xH&Uk&iGf|&V<9TPYGgY5b?*(VNGgF^Y??q>}GgqHe z?_<t<XQ95(*-_t-VWJ?5pj&cwc6QZwWmuMpaclfqMsri&t-dFc?>$-eAhRZ)W7d=y z6MMvh*xkzQ#blAamXFrl)}JoVTzaI|wte35tezvd>A8VnyFL%vg0C7rdK|;|dCQZ$ zZMc>rq|XhX_k3aT)xMf`qT6+B(+F(Ot^A!xm$PB+#OGJS8DrHCq+tdf5wtz4Tnwjc zkA3M>W96Y!E2kem`yghy{c!9-;R<P+Vd;xqqG34USgqd`Up8b|IPapToC&8+o_gTK z`A2Gv+N0-B;d}pT&vvYa6kXZau!DBP7mhFkVKs~(kUnM<Pkx!G5HBk$wQ%+!&Haku zIID(v5i=%JjEC7rYhm_$&D5gNt-=6aw_ZkbnF&_UK-*a>Q_or1dR`P-(6g1d3Ze)Z zm&CZ1uvHWjVv=OtDq3UD73xz~Nldr0*7$Sz`iz*hCd3?i=An~GG1tn{Of@?XedVv= zi=O%p%p0?&tZ8co^Jhf~YsOm>)*PtpRNuq#T~^7O$JheKcK7GYJHpA&LwV7ejo*wj zR=ZK55C!jbEh7+#ZYz963hFR>e&BVIe$ut=wxOrMcGq}IV$2RI6B8WIR}AT*x2ir= zM_ahu7lE2v?HbbPNYSb`R~^s1*yMr7tKRAp)#d|+<BR4Z?|VIN8m{XFTneYpJ(nAn zMH^{062hchd$kt`02D+NHml75x?jT{74cM1i50v8B;&hT;pc<^uRgatQv<o<N%Xia zFXCSrfW|p2!AR(SJ?MAAL?r@fGqME$i5sRVx}X`fC8%Sb;OmC8ja5hZRV|gH6;3i& zV_r*HiWWAlG6FQ%EV3!SVM7=Cqr%TX_OL|THEl~^C}^wIDN3<GTDHVgL$38Y!VNgK zNlDv`pbimK$pWiQvn|Yv4b4T9cW4{Wg}n7?VxlpZifQmj`&QK8u^W%%3%Cr(;{#dv z@P|@(5dnFc)M>PEBIYaPr%1aT%82<+O*TD;+(Cm-q<u;wT9I1m^9=#1!<&(_yYV15 zqdOF-I?t-$0_qVmg_-vQBZnI`xZhh<Xp1*cf(9Z~XM{<ZQKiBIyIUQa75W|k0R@~9 z$Sp#RI6>R%ITl=V4_x+nS9<G&pBwR9)7}+^NI10pm=7{tSfr=DJGp!k3?U0n82(<n z@kG}?p#cOojQ%2aQ5-3RK^(AVuHN}Z8_*Lny~hahTV$HFk0n~RtF%Qprk>cozn*f` zO^w85jYKJeo^(fSERBL#TfEhCO*%w`^f-164KR{AMD7bgGN@L0b;G`BSDPd)pIC~# zsn73MT}Qmuk+|!#O>Og7zYg4DClh#G6BfuEySH+$9wqtSqntwG$9S_Tdv3$<`>xq+ zLKociHqx-yE>j;mUXNMYTWtWlT`AUWujfPKuF=8Cn$3u-CS;|=enPInDbZ?rVz<B# zS7Bovcm+>-J-BL-h^bkwDmIg;iTpGuQgY*8A<wlc67umD-~_67Z|-{9VB8`T?_gU? z;}D36f>8uy7#A>X3SZ|MBRixagqRg6n)~*eYXA}gRx>i6xKctUm?a`OtT(Lk^C}81 zs`LkLrJ7KTqDXm^S`FZgpto)~JrM&okrxCMn;|$txUsl+iXw(eqzK!7SD3cpfEDCe zUTcKe826)b&2tG_D$R-&JcNaU2{fw0>Z<2Ch^k(cPC=O`V_C!JX?s)#_P%G(S{Pvr z8ZkBu8)+6a4k#oFqEJnzav{7VrrGYu;wT1<94ckll}Oidc&dQumeF&_JH+`yP4+|# zYSJh@H#1pi&Fo1jT(ch;=7}V6_<tEfa@HGFacc!6fKl-uo&aeHT&W^KGKFi6Y#4cL zL3M|vcu|-~(%ZUpTPo9g{CsVZBi&u(kJc{8-AE(lE;MG2GRo-5;+MX+IGW3BGqcGW zc+<~j7GF_K!C0S_GiS@$A)#_k?!m-ihfkECh4=bPZLcGiI!55HFP-#Em5}&Lv9^!+ zfo)zC@`&YaxQ=I7LN2WfcYVpRSC_hdln3r|<>;{`AK*IDMSgCqiQ(!cz-p-hkE-gA zC8|rJk4m>6mKqHT9F4}MoheaN;@+=<Lw^CyGi)%y?)%*H`4^_&IB@v+{P!ld(96Q2 zHUl#`Hae+9QbPIxUM{n7w#lBr+xF)P66Ut&YncG)wthAt-j_4iqFLwI0Tx8X7h@l1 z^0o{M#)flmw!^iEtFL7qV=o-pU{B>9V;h-r*0>7;58CS#-%(@{Sg05hKBBeq5wTB- z1Vz9i3x(Bo5F%EnsymB#@pz1;&r~Xv3rWa;O8E(j%So)UJmI^CkS=t(j!@ZVWYBOq zNVOntu+eD1@6a~zvSho%*@~ycMikuPO{k1qgiEr`HpM>iWY2~}rBs$|UMH;$UF9{> zhX1IF`>CKt{A%Y1E}F?c<&1)AxuAZ+sYc^TBu5k{8;x)#aSErT^kkSP0m>=p1CS?} zhtsie8nnbGHF7SgRwK}<;`0X3>0S$S{F7(^x`o{My>IN}KRNTGGq3MEetqBZ=g+)b zWOJ3P)+-nOFnjv7(&_)aTVQkh|HU%n_x@=gzq0e^cmDLw-|t)c?wLUjUGMp`AoR`M zpI|@Rf1;TCZ6Sj;Eb7>0ZbzU(ErIMZ>l031#e_s2HC5`XYMkUv$D{D;4TCYaTga(z zjKms7RP!gq(lHqD@&m&)MTI{c#F?n!z<>D&72HGUlD1_DcbMMtvtA&E-k3DFqKi&_ zGN4aoUX)6L#E=06Fe7#8K)DL)OT;7Op>UxwLSs8fIHo-m*HI=LB^nW*I$tI9s#F#k zUn-Z>Jf$%>npF{LJtvOB+Af-WGs$CPXIMF}(v3LFik3kOI3`M4gx8dmZVL5NQPH8o z{aGaEO{y%?MK$S>juH`%PD&N_P?i<`MNE+!Hc}8{G+1lqL4opno#F8=T!uzVWSLqe zallTOVkC{&es5iiHFbuVVslL(+((*D$>8iSVw02y$gt9eIF&AHM}lD`J>p~C7OndR zlXu`JoJ=9;QaP1~JdR7LD2S@Jk>)}e?FUZ_{}zr#Wu;jF&G;$e<yrh~kwZVtG8ARm z6Y200&D_i*`erwC*T`P+WN024@U{oD@^KJ(7PpH}W6lq=mvi4L6xca-AA2GH%bW@d zw_zYb`^}9VxUi{a`w$7Z?OH-4<#h@;`sNP~WN7s(a3!eMsjxvskrZBr<53zzR~S_1 zL2Af*gI3Q;xQuTOsG9Wnh9@r$Z#+J9B1}OC>}a!2Nb9(+t4p1y>mGnuU0`kJc9>3+ zYtrC{tRe?A^kHOME+j)~u)YF~D|!mU8on|G-w*N>6tezDH<8$gvb3m4AsS9dm5AFe z$5Jqly$|V%*iJ1T%7F-LE7Eu$l8wAuR47KHTB<s1r;QJ8GtFmYGecsDV?>^J!v$Vk zi|QL6x~_?CHb#O`OrM;|$WfA=k;sO(-`W|)iGs>+55NHBVQR|M+=Ip^3s<}71Yml^ z`(4_bPCZA4zD<jl(fp152id?P8=ro?bm)5N(ABYD?SAEsSDinU&b_f~@8t{Mzi{RF z)%$+GYx(ur<=0BfugxyM=TkQF&3l%SL>|rmvap;vJK|_CsI$~myuS)R^Ccu926Uos zQT6@T@YW_NK_fLF3h3yJJJA@|?+f0Kq&|(CQ9LAZb30^j6(`pWid#UY5iB8vl-$-9 zJxVqOgIhrDqnd-hC5cT#I~Uvo<3^wyd6=8p!Vr@36VM>CQw2IgnTl^i<ZT0;T*Q=1 z2h&iyHK4B$xkJ=Yyesdalr_qHCmId?{~jc<`!N`fH5#}bM@~GBG~V$79|M!Llrm3A z#gm+&W}cd9G+~}D8RYHsnuGt6chd;LFf3{nOZq>VoS^0)HAkqS$fypX4z3te)+Be* z05xQJ{y)$>$KJ^vEtCeWOm4pT%)^5@_OVaCGgd5=-<UZ($l>?xg}biYeZ{<b?8+yv zFH{BvbPbSJ?|#wx&gK?P9L!A@9?86PV2jc3U_UGF9AxJUQ&)};7=Es{f7N@X_UiFh zzIy$>FI=yj{ugy_<>Fa`gL?{}dV6kRP{1z;?>><kjL~a}?YVO>PHz)zVb@@i-lo{Z z)Yde;9h)soy*<BkP{1!%&F>hD(OXHaAE(y|w&(W2B)wtP%)8Tg(}JMmpDpi|NAVlx zj8#)2n#V##N(wJ6$q8vGQr)O!Ox30mbhs~Zqzzo?IesN7!xSWyLc^WgrzAyBxNG~6 z%D=U`_a<ZHq9f{hTmge{5>BNj$vI+60Y>3RX_(+X)cSj+`!x(dD?ft)N|5|>Xi)WJ zGVdH@nRA)9*nzj$L$9-k{>nc6Ci~o*?C@Kx`sdu-oB6|kE=)aNd-lRJ*+0fF?-n1) cW~N>|^wQlgnOBaz1Xvurn)^4SPPOTO0a{|zy8r+H diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/businessconnectionhandler.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/businessconnectionhandler.cpython-312.pyc deleted file mode 100644 index 29a21a932b1672f5acfaf1107986aff25cd425cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4045 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 BZ)*Sm diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/businessmessagesdeletedhandler.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/businessmessagesdeletedhandler.cpython-312.pyc deleted file mode 100644 index f70d84fcf2a6ae6101c85109790ee088fd09eeb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4092 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 FKLM3hfgb<> diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/callbackqueryhandler.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/callbackqueryhandler.cpython-312.pyc deleted file mode 100644 index f5f8d8535e487b1b5cc9075e7a458205043dea01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9324 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 Vx~boLYvWI9qp$r^z*l_I{|5T7ZDRlc diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/chatboosthandler.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/chatboosthandler.cpython-312.pyc deleted file mode 100644 index 8474a769571321f094c5ee404b3c7dd561b35ac7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5350 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 diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/chatjoinrequesthandler.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/chatjoinrequesthandler.cpython-312.pyc deleted file mode 100644 index 95e55caa4a20b56a3eab23c7831a6ac4ac3fccfa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4678 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 diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/chatmemberhandler.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/chatmemberhandler.cpython-312.pyc deleted file mode 100644 index 6bda169dae3c6ad91f47413036e7721d161ae6d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5154 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 P{gu|l^Pdr{60`gZCX1_h diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/choseninlineresulthandler.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/choseninlineresulthandler.cpython-312.pyc deleted file mode 100644 index bb89c696908f16ad114cb78643801eb33db279ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5261 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 alC)<zvvT<3=}(4Nj<3@FUlJS==lu%_INU@4 diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/commandhandler.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/commandhandler.cpython-312.pyc deleted file mode 100644 index 8c064693773a35e2c44493d078154f87404116d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11230 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 diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/conversationhandler.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/conversationhandler.cpython-312.pyc deleted file mode 100644 index b6065a222643949e964cc224dbe25a7424f145a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43842 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 diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/inlinequeryhandler.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/inlinequeryhandler.cpython-312.pyc deleted file mode 100644 index 2d825bfeb89abcd8ec268c3e8e26364cecca8b19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6125 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 UrInM{cP%T;tp~r5@D<<gKXJv<K>z>% diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/messagehandler.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/messagehandler.cpython-312.pyc deleted file mode 100644 index 5c268b0644066cbba3c72b966d2ab4e61d287d97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4984 zcmcgwOKcm*8J^`!6h+CBsfV4H22Sm06KUx<P6`mRQ$?1Yw2l(kw4E?8mdo9tx$-{P znWbc^MB$<VY9E58hax@{g%3R_a1TaLIrf;MKw-5>Z7gcULEA$w1q~-?kVDabW*;JD zr3jFs3t{xn>z{xA?|%({KRld6@cr|bKWKDzBlK6^iN0(|JopU|?;!(KkRcffOR^J{ zgq^G;?NlXYrz>eYQ^`ntE@=(e*-BQ>DQnQqRdRw(TSIofk{5Kw8n#C&y97O8joM?C zF+pdo-FBf;u*WOo5+Vtj0e*w9cA_#Np#&mnBX>gzB&tj%&<SJ=y^V}K86#OzAd~gv zUYNX*3|CCGhvkuVrQ9$Xwq2uT5v;q8r<o4JUW4FQ31iv?^0MX_7NJ<TG{%&F@Xd1C zA1=T7`jWc%^3vk>URgfjCl{QypM9<AnXaQ*{y@3iBxg11r_VSrB1?YeOw-Uj0#yFk z((#2eC(CO2)R`qdbL=c%{l4T6)J@AHl)>Q8OB#z#mJ@z*ak1?03ME<8EUTvJ7x}V< zX45itjUVeLPL=iGYC$_3b{_lzh@SvD1XUzJC}BvIq>-qkNV*Pq7%3x7GGt(7w0Cnr zbA1^ZGDvb{h~xwP83SaPjPRLy_6h<H*|&!)yNp3HYUF^=7#ShELEGbGLaa$_wSr0k zCaKCKpfUt|a>lSRV(jYKH(KAe!^jz<^_(#VyQZ$7OHyUeX(aFVNBZH>{yl(DA5_?L zaYJB-%fuoVsAgk3fRrh?+#qdin->~h1UmM}C2tm%7^a3@ikYW*EtbRZwFGud$%)=M zjXI`tp(Hwd`douJm=Vu|QCw<ja1tf;QnhBe`o$`jqvY0BO4Z|<#YlA)x7`-jHOFy1 zOo`RTu7fqh;G6Xp^ISV-ta%<aYb}p}K>`zDfu*V!-bMj=mB<(t!E&KrRq$y-u<0>u zxH`jixQOji7;)-uDE|Vzz_x@BZ4S@u$UdA^xH%pd)>)NHcmW6Fz_mfBDehgTJ%V$s zd|iGZu?H||)CjpUt{hw=AbiU);EY%wf-Sh}HXVdQ!rcQAV+Oiw*Gz{PxW%}3Yo@nm zGSbJ+Z4#<^E@gP;fY26*GK)Kcbm=Vqp`ZXNS;4PE01yxhG?!h6R58R34YP(zJ-y}i zaR$Vi(T1In3#C>TPM)lW$ng8|Pf@^}2w00-D&f+adC@FY7mQWS(cv!99p{%WdBkDh z`D|`(E}EVTr;k=+Ve~Lw0K^bo>{3;CsoMh3K*KFZ=dpu>3LXK94?;^kA#U&S2pPB% zRq#2}vH+c!Jr|ho1JTyFBb037HQ<m2(J!ij=Tu=g7$o7x3p~7r=3xLinCALxSq6u^ zNnIU$6nNFzeJAwG5LrED<^>1bl#)^@a852w^l7Z^=x}U3zSm4}U<scQ9z833AKa#d zBaWdT$^G28ZYY6s9K5PoErQ*;ND;BVKtV0m0xh&LNCXaNU~)+(O)pd+!K_JiQ?o!6 z#<%xfZbw%ENmd~lh}a$mHn5ZEZX&h-qQVqwu4_SDal`ZjU>=Kf%{VBK&8U#~zuqB0 zAwGeh1c+#Bn(1*o2*i>YAnpdh6+583$TS}IRAC5x;i@NJDIwO8jVK^=U29noy5fjg zrY-VyoC9>Fw<sl!-mV77EySVon}xd99Do#Xb=RUSfY(f~!7mRuhR(JH3s)Ksz@@K_ zQo<rM@Gx*A%VZw6B{%?UtD0$PHK;<O$Phyjo7w-wgJZT2+t4?%ob5s3|7SS?<a7vX z5<kU=RbQX#uMXaV`e_!QDxar$z9t(f)K3c?=qVVDK2Gxz@j)G$pG)r{FPcGDQyuh9 z8lg_2ll--GBN0qUs3ZL-+mSj*jrp{Z7t<@5m_bbRuay(avP36g7Ang$Ye7!(v#M%3 zrl+d@NN5jgP^3bwdGe&Vhn%M4ut(5zf>WG@Kd7oA->51BSrIqM%U^bi4c8_`Tl3gz z@tCW(Y~pyV7&+%0^Gy9Bp>u}2=2)&~5L#R%&T7#zYsF^UYq-vH%Cm=x3}V4t6N*nL zjJI|dAqo`LFhj6nSY<^SquHjs^4pGy5?%0Bm}D<N^TlQKSso3JTpifV?zy&SW8zkJ z&qvwfy{RW|O+9_(L^p{Bhu_Kn<>1lV2VdGe_)^$^06USN2_n0n2|}D6V#DW9jA#uy zfM@tb030PRUKgQBr#omR#!l=P%?i|)+rN%<Bjj~SVhR34IgQ#0Il2C~9pdkf=?)46 zh^-Lsdh^>;43~K62T2qH126S^V_<*z#?cM4=))CUkmagS&IEY^k_FK{p6p+7pf=(` zJlNY)f1DC&uBSlcC-kJ5t;BeISx)&m6G|c|m7z4D{4p3fSiU#=%Zb2Dr(v3LePc`? z=S!c2X8qBAPgQz%zQK1q0}U9)ILc4HTmMD<qoMtG3RCaR|7`wtVRo}HyK(kUg~NX= z9Qh!9D}Ut9t^$1m*82l`P!Ib<+SUtcUG7OgZ^4Ug7K^wbsJ`aBAKrix1{rBt=Z+M8 zu{pgABYozS+QFQ5cchix-65AwDl#1jwWYQsC)Sr141?jO3q>Z+0#KqgTOvEa!x8dD z@HPx=1rkhHQZ9xT64otMWm!(reQ=1MGECj0T<KAq_!iJ&fbQqi0chd~5kTTUqPtMZ z>7L3TB*9}=4OO`=Z%67Ym-5KT_{o6VD96qE)v=F;<U9GoPnWMQUz`6pKLgI2e_CKA z@8z-1(QE>-E~kc34(Pn9ejiGzaArVN;Y9<(5Z;*OdQ4U6AioAzE`0<VKezQtp}Y8~ zFvt;3jq!&6jNzwvu_OYLp9%bda?hqSd@{*A>Zf>CrW|Eqp;YEG!(mX>iDjuOMC-?3 zlyUF>PGHOhzMePSs@b2R`QmMKKe0cZ?Ji4b?D5O5bn|HXnfrr->D-->r@Be_e{XE> zHRbjr&uzlr*x_y(hPoM4*mwQF#*-WLdU132q3!@5%%aiBca5u^&-w1|WIjE9{e>=q ze;bXPtq;n-J^W$v!}6_DXMXqQha;Pd=WZQ2xB2ZiHkCIY@HO4X2GjDrv2o5{2L5AH zoT&^<Cl{nHaFn|_G&Oy#b-lcC_-69v*_%U~&&=Q2KfgJBWOMRpcZjdZquj{9hJg~8 ziHk1Fd*~e8)6aPACd3lTvu2<-feBB0LbrZ4N;3ix|FNj6sPGK2m;xm_FZ@JlEkN}r zwl9Gr2n!I*$8(T&g5)RQ-`6{?#OX+>LB$>BBFcXg@%Q#G3}grn5XK^GhyNN9m<<Q@ zeH7fA$E`23^Fby)N{>L7+W`A6G~J{mN%s#R>G@C4iyxyG|BfELi=MxWX6~XxcTwpR uRQfbIdN(!mX*z$U{NwYN6Q5;HN|OBUTh}Ky3LCZS)0-2|evbH%IO{)E<C$mx diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/messagereactionhandler.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/messagereactionhandler.cpython-312.pyc deleted file mode 100644 index e11eb86f3fcb0bd81858a01d262af0736e93a949..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7941 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 diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/paidmediapurchasedhandler.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/paidmediapurchasedhandler.cpython-312.pyc deleted file mode 100644 index 41ae8c63cc9cb875d2038ce30afa18c5bc36182b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4015 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 diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/pollanswerhandler.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/pollanswerhandler.cpython-312.pyc deleted file mode 100644 index 94267c1903e188eaa314f3cdc648594a387bcc9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2626 zcmb_e&yN&E6z-mxof#Go0ga+!N@I{o*q-1TVmi19EG%+C0&7U-(p}U2W~bTes<x_n zcLz!2!2bXz!@&av5BwiqL=GmM7!Pvs<dTI8Ctvlioe}h8AF5w>*L(He``-6n|FnPq zyoJ|a-+eQFg3=%6p}M-IuyX~4J6327tk4b{%#Is_hHc~~YsRfXE0<erE^ZInac9u6 zt%h~M3g>QHVH;Y|fHrhS%_C^#L9?(q=uSGl?v0bH<4BQMgee0O2(D?w713iLmjz>I zxY`8y1?3?FNdiWda{e^>Jv(cEm4s9SN_)>z1?8q*BWo@%uV#%at3h#4v9`*GosUqs zV}UiWF`7nb51L_P&<dL{7q*~1YN5}qL1)tLb+Usmxj+}^ENjLcq6Hb}{*hH+uqJ6t z(%dl<1=Uqdgw7MZT&lHn{RCqpG!KrP)}@|P1mu{HUh#3scjj}wYgF=xueteyF?4MV zoG8#5-x4>Wc&>zz>kpX-)_voZD~8uye}ysy{s}S>DG4a&LK6vWLIfu?42^P-DlOvL zuyHUNrW(+HG?M4s^=lttOFPSyu^|oCmk};}_8oE+fJ9o6Py~vMghW6kzTqQL`hR|l z#t8$p8-Pps#Pv;v$ys#jG?Y8?@P|S#`9<Vs<l2;0P##T=yBcKd`hk!l#Uub3r99A) z;C{~~t5`qv*6Ks<m^S5B045!BEyCl6PzP@^YxE!_n<l|-40?=*j3HR}3Rr#A#z4Uw zkH>}u%9NL=6Ezko3(+V^qzFJM+%lZZoG|M{l})0eHBNOZ!F7w!jW^Xr)r1Fl?5K|G zc;Syrin2M8R~o|MlFDL<PjA+m$&Ca&hm#G;QXpcK^R3PoCMZ=YW?@3mBLp%euoXa} z%LD>Z2?P;k=!!DxGr_&OVg%m+si?uHqz_hh6<c1jh-hB0Lm?Q}t4PdV$`H(RRj!o* z1zUs6{r%4v3KZ%S%t?p{-K3E=cmURD4Ui#$X*e8{SCt0V?u>F-2s1P|lO!w(@|c_w z>#9Z^bb3TnhLot8xGGbq=v+naILKi@iVD{y?q;+exjv#6q*4M8CKUy0O77C9M(cke zLLKYNQ2aXpwF{euMKa}>G(t&k!sK+5PMnhdKUi72DA%lA;1)Edy0dA{W-RPn&YQEg zt8X`LUGIBPN?W#k)3!7=;^Mk#UvF3P?)^b&<0_7d8&6(QLa$^j&KJXIf%UN4CO%eG z+pZ#>hH<t(8DNV*v7Z0gI}4)v<Yw8MvECujre9s;fxvFER_c~nGsdpuOr7e0=H(Pq zcDdbaW%H53>8U9XK$?7JEyJd4@6<%W`PfpxM$!y@Wl~DWi*Ng55ko(wT5a^ti6D)E zYt^r+eL?9cSO>WficQW04MFxdfN%6!H0&o6Jr;b?Ir&LnA-NV391L^~cD4IRtG-vZ zT-7(e6vM6R!pS7tH{D@xyl<w$%;<NfzkhB#{{WX;*0VRP*WbB&?E7Pn5A=RHu<~R0 z@YJu1=N~Pef9$OM++EqhP1dDeH|u&Hr!jb5Ht%`G&j!l-Jnw7lbLE$g=i&Im*Lyrq zF`*TT?E)hC8rqSE%(BNUhs|=(EanF(U*1JQnSYDh*3-t(x$gFob@1@5i`%XFxeNBa zQ`?rg-w&VV_rieDz0}(y-@<#=t&&{;_hI$uVD_9kd(IF$Zkab}Sd$%@-H4-*DMwEd zP|`3&8fp|?&U*f$d%DQOl01rA3|o|g%XZVY?We~q`?Ke5%YN@S%l+M2c-B5)U$F1) Xy|;3I`Qf2^Up{*K)903Xl?U=SpWqX* diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/pollhandler.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/pollhandler.cpython-312.pyc deleted file mode 100644 index d9cbce5d1fb20b379622f9dcfc29fce105cc4ded..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2579 zcmb_ey^q{P6t{PMyPHcwNCJWY5hDa4tK4}-kWx6|@^RrKO%x@EB5h;O+HY^2vuDiA z`0gB1q{tsYmsBVPMNlZ9qNb(+(pf?j(4^v`OPW-?@z?FbL4}L)vpw(g_kM5u<Np2g z23~)D`T67rlz!I__0_9{?W-u<H3DO31ZL2R%(yjdnObf~?bsSxg=|H0ac9_xyTh(& zw2Y69VD63)bijfZbf7zKA3-Y*+ojE6FYESuH&3igLP=sCq!AFGGetutiJAbp!lURD z%7O?4@gpjw{a9=E&Ajtz5>N#w?Y%%HRGa#(yuG}<lDDp|_@#?-wW^2hw^6ujfH5>N zk5*s~+d*q+1#OrMEa;3ajMf@<vrfO8@11f^-<dOvnLvo*WKu*%Rv>~^L1U5@A?e7e zs`DUpp5WzBrG(=pm=8IlDh0dD!Pak=JbS*_d7TOtvQ?*e(5lxbz=#B;@GWr?ik<|F z9d8tIf6dczIDB-&@jjxF1aE<4JS9G5j4L7_$_QtK27y-gQ>l2|7}g<$qf`M#j7Ez3 zI$jeTY$|)1M$w4+Ys&}<K6^H~20%h3Nx*$c##|t50^hJPuj2o3lg3E|awh?Yvdr;x zHOU1G>I_snio8c$EqP_;=f&!jmS4Fh#~lSCc08X8o?;Pzj8o>TkTb9EkQMBbW^4VS z2u$gwDj^a!xgMhX5j4r`%4$6b$c8Sk6N8$dlL`21ZV9A^+L$P4_vkh#aiy%nnaBxG zqX3PPL~tLZ#4V$2#=~q3bv20$R~c2Q0LLj)*U{7$l^OHV?YPP7co~mF%6?fWdJExj zNNusgr$1{=*G2&PVPu^~DG)v`Sk=@E3zW(ftB?_l2!RX;Z2FL>s(?Ub0)9v%3`J`7 zndElw7|zx~NUHIv2!own=T`JAB3d-;i1P^hl_z>HjS$R>b*-fa1qXmA;{DGYN)#Fo z+7lu|H)yCd9)LaC0HjHv#|p#Z)vbZOJEL4R!VC@0CrK3gMNW2wb=@O220f-}gp_EQ zxFS-h>0D=S+sI)+igL#x&PKQvIv%3tr$PYpvzh`8C3oo4p!L5Hp~>~1Q2aXpO$ZyB zMIvQbG(t&XLf3SIW_CsYuZ_G@wrk!gar0YKlUNU8J^Z(?6oXiq^|xE5YW6*>q)k)2 zY#ItjZ+YD^Z**#T=l-y=aSe}!n}6)mLc1~+&l1gOj{UGRCf=3xpsq8XhH-X2X<*Al zv7i4wJ4>Q^<W@DCvERX0dR|>(KF4XYTIp6*)5fkAOr4s5`sEZ;cDUWQ^7&BW8L24q zLFjtsmS$6K>7xV>K}$k37Wzz=x|W1I&ju47!yu+gt`9D9KaGJYIjGxwQL4~i1F;zJ z4Hj`4fEcU;TOUN>Xpm%T!rA-wdnX4HS+$tpi9lCjM|*&L8o1T0l>;3_J$REW-#0x} zZ@#Jzf@(6@(_cQ&(Y}exZR6=n#*44rJNDJFM+f@9960+;@a?JZPk(p%k$v{3-q~&3 zVqEU`@}BE58iVWR^R8R|J)peLbw9(AR(<KZE}m5QdXMYMh%1R=r$j@%fOf<oz3kD; zVZ9vGi~i#&me)~``j_F3@uYQhuD7*h96Wsc(v~$pch0<jYRk~~2f@?gUK-H4m-~Cf zD|pX)b$LsS-l`vMte4%?%O2ryt?DH-LGmNB8}ZbOq^+_9q|js#ngwN)vyngVohj?E zB#z=1O$=${veh<C^T{#8Jo&6+m~Z@QIKLT-Pdf|dIrEDX_r~}A2Pg0GpAXs34E?G| F<S(XH0A&CG diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/precheckoutqueryhandler.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/precheckoutqueryhandler.cpython-312.pyc deleted file mode 100644 index b65447482e09284bce2bd25269fd1b51aae1a5f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4178 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 diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/prefixhandler.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/prefixhandler.cpython-312.pyc deleted file mode 100644 index 51ba42b7a4928ee9bd9f1a52d355472c1e065e0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8637 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 diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/shippingqueryhandler.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/shippingqueryhandler.cpython-312.pyc deleted file mode 100644 index dcd2b5bf9d74b8165e46a0c9b222478f22f26a15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2609 zcmb_e&5smC6z`syof%d>L@)-yq%a1V$o51rm^2#_SX7n+QCLGVm+6}BH#^N%SG85u zyW2=2G5im3G8{Z$@WB7UMdV=8iSeKpPcB)waPn1u?Mzrb*@x;^)m5+Fd%yR4uOIK* zH*ewd_xImS9;5V!nN&}=6t=ITaMuc~ffd+6gV|AI(6Ei%WX-5GXytN?%|-1&JL(KN zw$-pcw}QDlR?vnPG@uQgaq|djdDtv;4!UWl*S-1i$|O`I5<$X%_=0O1az*q6$hAor z$01++G69)hqC8+AiO;A~&R<4F&(7Lk#R1iT(rXu}f^t)@ku{f=R<g#`6~DNv7+d9J z`#luyT3`)qbf^*7gJ#eew1Otg1ubZgTWEG`&`I09PIh=VE9jv)%bKx>Xh9~qiDU&B ztV$XYmuf9tPnUD2u+>qeTf?u7U!F5RPw=@;B}ZS~e3CCrfD;8;<0^4uiW()1U2nvM zzvh|yTrs-gdY@6Iz&k}!kr1D9E;NzAQX)8^L0}I1iP9pf6&tI<QKA8(j7su=PFV?? z+F7EEji|r2gmB>8bI3IS5^6;P;VUv05&@IA!pEYt|I<wx#SGMr11{yM>wQ7f2)HH} z(5^)&H#u>!IuiPvSNMNku1=lxO9RMBSA&dP&lgf87z!Zcg!?)a-0Qhy1+%2yT7AgP z(<Z43K%_&ihm4UC)FCkOHRm888z#(d1bTv(Ou%0oCV5JEcpBXWb3I-gU`A3+C?~~d zq9!6?0V*Z26h0`0TSn>34YM{>F(oQo<y0pUT(@xDSW`VzrQFAB$F*N4iwj*+q|d3G zBM6F1Dvc#dy;*H0HWKh2PSz<)fQWI<sybd6phP7Yg_NL02xmZG(}!4>0R*CA@I%Vb z6lIRjIJbM=2)+(dQG-uO56th%w>)zZ(L8NOLNLr)5u3e~A($7dSStex766&s`=34( zDAYHYn-CGYK|^iu0L;`HAVURHRyYQ)N)625nZsow)RZ-3I3LF>^mCt_66-2Q95i}N z6Nbd7`M4qzs7PIT?l{O~K%xrQCGJMJ7P=my<|k4D_tT03H8FQcRHOC35TW+<RVe-) zfZBu&!y=h*3>u*%S7BnhK~twJ0zX<=yGYlpUEt<7rV6mBzoz(af05T;ZCBrJ*}C5M zu#`4!`KE1YEVRXQ%f8XB<em4!QpYvy1~>oQC53inEVdBCXo2~#QzqV5RmHA6o`!L@ zJ{e%kLU8gGCKN>V$gQ$MW4?p0O}$#?zQAg-TAnSVW|UpcnL1Sg&EgbOcDUVZW%HrJ z9;qq!L7I4GEyJd4|7>T$F4$7Q#?o|mWui*R%kTOV5kWtqTCMjl3O_N$S@o-gUr;*q z*FY`=VuLe51Caf7;Ol)Bj{0$`CxV}LKK!V!kY5Wib_lu(JE!|dm;SJ<x~gB9llQr* z7RPC}ce>8rJic3lb*8s08vBpqaNBx**n0i#dnbN4@$^9NmjlZ`1&_}Bdiv6n)0dt) z%RhIQw{eqorPs~6!y%^;42RkLa9I3XpuBg8J(sfbOJ_L5ZidTyhC{`KRw%X$tmJ;w zBi}H?9y1&=!$C8c|Dk+1ih?r#5qGR-jbn4&twrnLq1($_t@*jj_Wd(kmU%x2p6BmE zfjN7nw@1E(@2p#eyg=~XYU-GhQ^(L5Vd*VHCk=hFBeNT^Co<*eGzKLNRixoaVdbpl zFT0CH9L~viaEqaha&Xvc+P3}dgk_(7(YEYkzgh0@*244l2li$A-r4)>57eUz_rHB| M^ph8sS;`&x2iVXNEdT%j diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/stringcommandhandler.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/stringcommandhandler.cpython-312.pyc deleted file mode 100644 index e1e4ed0bfdf70de459a0f9f21e539dcf598980dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4709 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 ZQKmQE0et2^ncVDdz5M2v1eYZLe*;JuZX^Hz diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/stringregexhandler.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/stringregexhandler.cpython-312.pyc deleted file mode 100644 index 023f42696401b7a942d5e83d66733868da195b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4857 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 diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/typehandler.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/__pycache__/typehandler.cpython-312.pyc deleted file mode 100644 index 7c08a819f30ce2b5d423808a3eab4e3234bb6250..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3917 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 Xcg`L34wn!4!PdjY7e68}5+3(2^r&nY diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/basehandler.py b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/basehandler.py deleted file mode 100644 index b6353f2..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/basehandler.py +++ /dev/null @@ -1,175 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the base class for handlers as used by the Application.""" -from abc import ABC, abstractmethod -from typing import TYPE_CHECKING, Any, Generic, Optional, TypeVar, Union - -from telegram._utils.defaultvalue import DEFAULT_TRUE -from telegram._utils.repr import build_repr_with_selected_attrs -from telegram._utils.types import DVType -from telegram.ext._utils.types import CCT, HandlerCallback - -if TYPE_CHECKING: - from telegram.ext import Application - -RT = TypeVar("RT") -UT = TypeVar("UT") - - -class BaseHandler(Generic[UT, CCT, RT], ABC): - """The base class for all update handlers. Create custom handlers by inheriting from it. - - Warning: - When setting :paramref:`block` to :obj:`False`, you cannot rely on adding custom - attributes to :class:`telegram.ext.CallbackContext`. See its docs for more info. - - This class is a :class:`~typing.Generic` class and accepts three type variables: - - 1. The type of the updates that this handler will handle. Must coincide with the type of the - first argument of :paramref:`callback`. :meth:`check_update` must only accept - updates of this type. - 2. The type of the second argument of :paramref:`callback`. Must coincide with the type of the - parameters :paramref:`handle_update.context` and - :paramref:`collect_additional_context.context` as well as the second argument of - :paramref:`callback`. Must be either :class:`~telegram.ext.CallbackContext` or a subclass - of that class. - - .. tip:: - For this type variable, one should usually provide a :class:`~typing.TypeVar` that is - also used for the mentioned method arguments. That way, a type checker can check whether - this handler fits the definition of the :class:`~Application`. - 3. The return type of the :paramref:`callback` function accepted by this handler. - - .. seealso:: :wiki:`Types of Handlers <Types-of-Handlers>` - - .. versionchanged:: 20.0 - - * The attribute ``run_async`` is now :paramref:`block`. - * This class was previously named ``Handler``. - - Args: - callback (:term:`coroutine function`): The callback function for this handler. Will be - called when :meth:`check_update` has determined that an update should be processed by - this handler. Callback signature:: - - async def callback(update: Update, context: CallbackContext) - - The return value of the callback is usually ignored except for the special case of - :class:`telegram.ext.ConversationHandler`. - block (:obj:`bool`, optional): Determines whether the return value of the callback should - be awaited before processing the next handler in - :meth:`telegram.ext.Application.process_update`. Defaults to :obj:`True`. - - .. seealso:: :wiki:`Concurrency` - - Attributes: - callback (:term:`coroutine function`): The callback function for this handler. - block (:obj:`bool`): Determines whether the callback will run in a blocking way. - - """ - - __slots__ = ( - "block", - "callback", - ) - - def __init__( - self: "BaseHandler[UT, CCT, RT]", - callback: HandlerCallback[UT, CCT, RT], - block: DVType[bool] = DEFAULT_TRUE, - ): - self.callback: HandlerCallback[UT, CCT, RT] = callback - self.block: DVType[bool] = block - - def __repr__(self) -> str: - """Give a string representation of the handler in the form ``ClassName[callback=...]``. - - As this class doesn't implement :meth:`object.__str__`, the default implementation - will be used, which is equivalent to :meth:`__repr__`. - - Returns: - :obj:`str` - """ - try: - callback_name = self.callback.__qualname__ - except AttributeError: - callback_name = repr(self.callback) - return build_repr_with_selected_attrs(self, callback=callback_name) - - @abstractmethod - def check_update(self, update: object) -> Optional[Union[bool, object]]: - """ - This method is called to determine if an update should be handled by - this handler instance. It should always be overridden. - - Note: - Custom updates types can be handled by the application. Therefore, an implementation of - this method should always check the type of :paramref:`update`. - - Args: - update (:obj:`object` | :class:`telegram.Update`): The update to be tested. - - Returns: - Either :obj:`None` or :obj:`False` if the update should not be handled. Otherwise an - object that will be passed to :meth:`handle_update` and - :meth:`collect_additional_context` when the update gets handled. - - """ - - async def handle_update( - self, - update: UT, - application: "Application[Any, CCT, Any, Any, Any, Any]", - check_result: object, - context: CCT, - ) -> RT: - """ - This method is called if it was determined that an update should indeed - be handled by this instance. Calls :attr:`callback` along with its respectful - arguments. To work with the :class:`telegram.ext.ConversationHandler`, this method - returns the value returned from :attr:`callback`. - Note that it can be overridden if needed by the subclassing handler. - - Args: - update (:obj:`str` | :class:`telegram.Update`): The update to be handled. - application (:class:`telegram.ext.Application`): The calling application. - check_result (:class:`object`): The result from :meth:`check_update`. - context (:class:`telegram.ext.CallbackContext`): The context as provided by - the application. - - """ - self.collect_additional_context(context, update, application, check_result) - return await self.callback(update, context) - - def collect_additional_context( - self, - context: CCT, - update: UT, - application: "Application[Any, CCT, Any, Any, Any, Any]", - check_result: Any, - ) -> None: - """Prepares additional arguments for the context. Override if needed. - - Args: - context (:class:`telegram.ext.CallbackContext`): The context object. - update (:class:`telegram.Update`): The update to gather chat/user id from. - application (:class:`telegram.ext.Application`): The calling application. - check_result: The result (return value) from :meth:`check_update`. - - """ diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/businessconnectionhandler.py b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/businessconnectionhandler.py deleted file mode 100644 index 975bb47..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/businessconnectionhandler.py +++ /dev/null @@ -1,95 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the BusinessConnectionHandler class.""" -from typing import Optional, TypeVar - -from telegram import Update -from telegram._utils.defaultvalue import DEFAULT_TRUE -from telegram._utils.types import SCT, DVType -from telegram.ext._handlers.basehandler import BaseHandler -from telegram.ext._utils._update_parsing import parse_chat_id, parse_username -from telegram.ext._utils.types import CCT, HandlerCallback - -RT = TypeVar("RT") - - -class BusinessConnectionHandler(BaseHandler[Update, CCT, RT]): - """Handler class to handle Telegram - :attr:`Business Connections <telegram.Update.business_connection>`. - - .. versionadded:: 21.1 - - Args: - callback (:term:`coroutine function`): The callback function for this handler. Will be - called when :meth:`check_update` has determined that an update should be processed by - this handler. Callback signature:: - - async def callback(update: Update, context: CallbackContext) - user_id (:obj:`int` | Collection[:obj:`int`], optional): Filters requests to allow only - those which are from the specified user ID(s). - - username (:obj:`str` | Collection[:obj:`str`], optional): Filters requests to allow only - those which are from the specified username(s). - - block (:obj:`bool`, optional): Determines whether the return value of the callback should - be awaited before processing the next handler in - :meth:`telegram.ext.Application.process_update`. Defaults to :obj:`True`. - - .. seealso:: :wiki:`Concurrency` - Attributes: - callback (:term:`coroutine function`): The callback function for this handler. - block (:obj:`bool`): Determines whether the return value of the callback should be - awaited before processing the next handler in - :meth:`telegram.ext.Application.process_update`. - """ - - __slots__ = ( - "_user_ids", - "_usernames", - ) - - def __init__( - self: "BusinessConnectionHandler[CCT, RT]", - callback: HandlerCallback[Update, CCT, RT], - user_id: Optional[SCT[int]] = None, - username: Optional[SCT[str]] = None, - block: DVType[bool] = DEFAULT_TRUE, - ): - super().__init__(callback, block=block) - - self._user_ids = parse_chat_id(user_id) - self._usernames = parse_username(username) - - def check_update(self, update: object) -> bool: - """Determines whether an update should be passed to this handler's :attr:`callback`. - - Args: - update (:class:`telegram.Update` | :obj:`object`): Incoming update. - - Returns: - :obj:`bool` - - """ - if isinstance(update, Update) and update.business_connection: - if not self._user_ids and not self._usernames: - return True - if update.business_connection.user.id in self._user_ids: - return True - return update.business_connection.user.username in self._usernames - return False diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/businessmessagesdeletedhandler.py b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/businessmessagesdeletedhandler.py deleted file mode 100644 index c2df450..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/businessmessagesdeletedhandler.py +++ /dev/null @@ -1,95 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the BusinessMessagesDeletedHandler class.""" -from typing import Optional, TypeVar - -from telegram import Update -from telegram._utils.defaultvalue import DEFAULT_TRUE -from telegram._utils.types import SCT, DVType -from telegram.ext._handlers.basehandler import BaseHandler -from telegram.ext._utils._update_parsing import parse_chat_id, parse_username -from telegram.ext._utils.types import CCT, HandlerCallback - -RT = TypeVar("RT") - - -class BusinessMessagesDeletedHandler(BaseHandler[Update, CCT, RT]): - """Handler class to handle - :attr:`deleted Telegram Business messages <telegram.Update.deleted_business_messages>`. - - .. versionadded:: 21.1 - - Args: - callback (:term:`coroutine function`): The callback function for this handler. Will be - called when :meth:`check_update` has determined that an update should be processed by - this handler. Callback signature:: - - async def callback(update: Update, context: CallbackContext) - chat_id (:obj:`int` | Collection[:obj:`int`], optional): Filters requests to allow only - those which are from the specified chat ID(s). - - username (:obj:`str` | Collection[:obj:`str`], optional): Filters requests to allow only - those which are from the specified username(s). - - block (:obj:`bool`, optional): Determines whether the return value of the callback should - be awaited before processing the next handler in - :meth:`telegram.ext.Application.process_update`. Defaults to :obj:`True`. - - .. seealso:: :wiki:`Concurrency` - Attributes: - callback (:term:`coroutine function`): The callback function for this handler. - block (:obj:`bool`): Determines whether the return value of the callback should be - awaited before processing the next handler in - :meth:`telegram.ext.Application.process_update`. - """ - - __slots__ = ( - "_chat_ids", - "_usernames", - ) - - def __init__( - self: "BusinessMessagesDeletedHandler[CCT, RT]", - callback: HandlerCallback[Update, CCT, RT], - chat_id: Optional[SCT[int]] = None, - username: Optional[SCT[str]] = None, - block: DVType[bool] = DEFAULT_TRUE, - ): - super().__init__(callback, block=block) - - self._chat_ids = parse_chat_id(chat_id) - self._usernames = parse_username(username) - - def check_update(self, update: object) -> bool: - """Determines whether an update should be passed to this handler's :attr:`callback`. - - Args: - update (:class:`telegram.Update` | :obj:`object`): Incoming update. - - Returns: - :obj:`bool` - - """ - if isinstance(update, Update) and update.deleted_business_messages: - if not self._chat_ids and not self._usernames: - return True - if update.deleted_business_messages.chat.id in self._chat_ids: - return True - return update.deleted_business_messages.chat.username in self._usernames - return False diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/callbackqueryhandler.py b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/callbackqueryhandler.py deleted file mode 100644 index 27ddc5b..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/callbackqueryhandler.py +++ /dev/null @@ -1,208 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the CallbackQueryHandler class.""" -import asyncio -import re -from re import Match, Pattern -from typing import TYPE_CHECKING, Any, Callable, Optional, TypeVar, Union, cast - -from telegram import Update -from telegram._utils.defaultvalue import DEFAULT_TRUE -from telegram._utils.types import DVType -from telegram.ext._handlers.basehandler import BaseHandler -from telegram.ext._utils.types import CCT, HandlerCallback - -if TYPE_CHECKING: - from telegram.ext import Application - -RT = TypeVar("RT") - - -class CallbackQueryHandler(BaseHandler[Update, CCT, RT]): - """Handler class to handle Telegram - :attr:`callback queries <telegram.Update.callback_query>`. Optionally based on a regex. - - Read the documentation of the :mod:`re` module for more information. - - Note: - * If your bot allows arbitrary objects as - :paramref:`~telegram.InlineKeyboardButton.callback_data`, it may happen that the - original :attr:`~telegram.InlineKeyboardButton.callback_data` for the incoming - :class:`telegram.CallbackQuery` can not be found. This is the case when either a - malicious client tempered with the :attr:`telegram.CallbackQuery.data` or the data was - simply dropped from cache or not persisted. In these - cases, an instance of :class:`telegram.ext.InvalidCallbackData` will be set as - :attr:`telegram.CallbackQuery.data`. - - .. versionadded:: 13.6 - - * If neither :paramref:`pattern` nor :paramref:`game_pattern` is set, `any` - ``CallbackQuery`` will be handled. If only :paramref:`pattern` is set, queries with - :attr:`~telegram.CallbackQuery.game_short_name` will `not` be considered and vice versa. - If both patterns are set, queries with either :attr: - `~telegram.CallbackQuery.game_short_name` or :attr:`~telegram.CallbackQuery.data` - matching the defined pattern will be handled - - .. versionadded:: 21.5 - - Warning: - When setting :paramref:`block` to :obj:`False`, you cannot rely on adding custom - attributes to :class:`telegram.ext.CallbackContext`. See its docs for more info. - - Args: - callback (:term:`coroutine function`): The callback function for this handler. Will be - called when :meth:`check_update` has determined that an update should be processed by - this handler. Callback signature:: - - async def callback(update: Update, context: CallbackContext) - - The return value of the callback is usually ignored except for the special case of - :class:`telegram.ext.ConversationHandler`. - pattern (:obj:`str` | :func:`re.Pattern <re.compile>` | :obj:`callable` | :obj:`type`, \ - optional): - Pattern to test :attr:`telegram.CallbackQuery.data` against. If a string or a regex - pattern is passed, :func:`re.match` is used on :attr:`telegram.CallbackQuery.data` to - determine if an update should be handled by this handler. If your bot allows arbitrary - objects as :paramref:`~telegram.InlineKeyboardButton.callback_data`, non-strings will - be accepted. To filter arbitrary objects you may pass: - - - a callable, accepting exactly one argument, namely the - :attr:`telegram.CallbackQuery.data`. It must return :obj:`True` or - :obj:`False`/:obj:`None` to indicate, whether the update should be handled. - - a :obj:`type`. If :attr:`telegram.CallbackQuery.data` is an instance of that type - (or a subclass), the update will be handled. - - If :attr:`telegram.CallbackQuery.data` is :obj:`None`, the - :class:`telegram.CallbackQuery` update will not be handled. - - .. seealso:: :wiki:`Arbitrary callback_data <Arbitrary-callback_data>` - - .. versionchanged:: 13.6 - Added support for arbitrary callback data. - game_pattern (:obj:`str` | :func:`re.Pattern <re.compile>` | optional) - Pattern to test :attr:`telegram.CallbackQuery.game_short_name` against. If a string or - a regex pattern is passed, :func:`re.match` is used on - :attr:`telegram.CallbackQuery.game_short_name` to determine if an update should be - handled by this handler. - - .. versionadded:: 21.5 - block (:obj:`bool`, optional): Determines whether the return value of the callback should - be awaited before processing the next handler in - :meth:`telegram.ext.Application.process_update`. Defaults to :obj:`True`. - - .. seealso:: :wiki:`Concurrency` - - Attributes: - callback (:term:`coroutine function`): The callback function for this handler. - pattern (:func:`re.Pattern <re.compile>` | :obj:`callable` | :obj:`type`): Optional. - Regex pattern, callback or type to test :attr:`telegram.CallbackQuery.data` against. - - .. versionchanged:: 13.6 - Added support for arbitrary callback data. - game_pattern (:func:`re.Pattern <re.compile>`): Optional. - Regex pattern to test :attr:`telegram.CallbackQuery.game_short_name` - block (:obj:`bool`): Determines whether the return value of the callback should be - awaited before processing the next handler in - :meth:`telegram.ext.Application.process_update`. - - """ - - __slots__ = ("game_pattern", "pattern") - - def __init__( - self: "CallbackQueryHandler[CCT, RT]", - callback: HandlerCallback[Update, CCT, RT], - pattern: Optional[ - Union[str, Pattern[str], type, Callable[[object], Optional[bool]]] - ] = None, - game_pattern: Optional[Union[str, Pattern[str]]] = None, - block: DVType[bool] = DEFAULT_TRUE, - ): - super().__init__(callback, block=block) - - if callable(pattern) and asyncio.iscoroutinefunction(pattern): - raise TypeError( - "The `pattern` must not be a coroutine function! Use an ordinary function instead." - ) - if isinstance(pattern, str): - pattern = re.compile(pattern) - - if isinstance(game_pattern, str): - game_pattern = re.compile(game_pattern) - self.pattern: Optional[ - Union[str, Pattern[str], type, Callable[[object], Optional[bool]]] - ] = pattern - self.game_pattern: Optional[Union[str, Pattern[str]]] = game_pattern - - def check_update(self, update: object) -> Optional[Union[bool, object]]: - """Determines whether an update should be passed to this handler's :attr:`callback`. - - Args: - update (:class:`telegram.Update` | :obj:`object`): Incoming update. - - Returns: - :obj:`bool` - - """ - # pylint: disable=too-many-return-statements - if not (isinstance(update, Update) and update.callback_query): - return None - - callback_data = update.callback_query.data - game_short_name = update.callback_query.game_short_name - - if not any([self.pattern, self.game_pattern]): - return True - - # we check for .data or .game_short_name from update to filter based on whats coming - # this gives xor-like behavior - if callback_data: - if not self.pattern: - return False - if isinstance(self.pattern, type): - return isinstance(callback_data, self.pattern) - if callable(self.pattern): - return self.pattern(callback_data) - if not isinstance(callback_data, str): - return False - if match := re.match(self.pattern, callback_data): - return match - - elif game_short_name: - if not self.game_pattern: - return False - if match := re.match(self.game_pattern, game_short_name): - return match - else: - return True - return False - - def collect_additional_context( - self, - context: CCT, - update: Update, # noqa: ARG002 - application: "Application[Any, CCT, Any, Any, Any, Any]", # noqa: ARG002 - check_result: Union[bool, Match[str]], - ) -> None: - """Add the result of ``re.match(pattern, update.callback_query.data)`` to - :attr:`CallbackContext.matches` as list with one element. - """ - if self.pattern: - check_result = cast("Match", check_result) - context.matches = [check_result] diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/chatboosthandler.py b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/chatboosthandler.py deleted file mode 100644 index 2fce8c4..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/chatboosthandler.py +++ /dev/null @@ -1,130 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the ChatBoostHandler class.""" - -from typing import Final, Optional - -from telegram import Update -from telegram.ext._handlers.basehandler import BaseHandler -from telegram.ext._utils._update_parsing import parse_chat_id, parse_username -from telegram.ext._utils.types import CCT, RT, HandlerCallback - - -class ChatBoostHandler(BaseHandler[Update, CCT, RT]): - """ - Handler class to handle Telegram updates that contain a chat boost. - - Warning: - When setting :paramref:`block` to :obj:`False`, you cannot rely on adding custom - attributes to :class:`telegram.ext.CallbackContext`. See its docs for more info. - - .. versionadded:: 20.8 - - Args: - callback (:term:`coroutine function`): The callback function for this handler. Will be - called when :meth:`check_update` has determined that an update should be processed by - this handler. Callback signature:: - - async def callback(update: Update, context: CallbackContext) - - The return value of the callback is usually ignored except for the special case of - :class:`telegram.ext.ConversationHandler`. - chat_boost_types (:obj:`int`, optional): Pass one of - :attr:`CHAT_BOOST`, :attr:`REMOVED_CHAT_BOOST` or - :attr:`ANY_CHAT_BOOST` to specify if this handler should handle only updates with - :attr:`telegram.Update.chat_boost`, - :attr:`telegram.Update.removed_chat_boost` or both. Defaults to - :attr:`CHAT_BOOST`. - chat_id (:obj:`int` | Collection[:obj:`int`], optional): Filters reactions to allow - only those which happen in the specified chat ID(s). - chat_username (:obj:`str` | Collection[:obj:`str`], optional): Filters reactions to allow - only those which happen in the specified username(s). - block (:obj:`bool`, optional): Determines whether the return value of the callback should - be awaited before processing the next handler in - :meth:`telegram.ext.Application.process_update`. Defaults to :obj:`True`. - - .. seealso:: :wiki:`Concurrency` - - Attributes: - callback (:term:`coroutine function`): The callback function for this handler. - chat_boost_types (:obj:`int`): Optional. Specifies if this handler should handle only - updates with :attr:`telegram.Update.chat_boost`, - :attr:`telegram.Update.removed_chat_boost` or both. - block (:obj:`bool`): Determines whether the callback will run in a blocking way. - """ - - __slots__ = ( - "_chat_ids", - "_chat_usernames", - "chat_boost_types", - ) - - CHAT_BOOST: Final[int] = -1 - """ :obj:`int`: Used as a constant to handle only :attr:`telegram.Update.chat_boost`.""" - REMOVED_CHAT_BOOST: Final[int] = 0 - """:obj:`int`: Used as a constant to handle only :attr:`telegram.Update.removed_chat_boost`.""" - ANY_CHAT_BOOST: Final[int] = 1 - """:obj:`int`: Used as a constant to handle both :attr:`telegram.Update.chat_boost` - and :attr:`telegram.Update.removed_chat_boost`.""" - - def __init__( - self: "ChatBoostHandler[CCT, RT]", - callback: HandlerCallback[Update, CCT, RT], - chat_boost_types: int = CHAT_BOOST, - chat_id: Optional[int] = None, - chat_username: Optional[str] = None, - block: bool = True, - ): - super().__init__(callback, block=block) - self.chat_boost_types: int = chat_boost_types - self._chat_ids = parse_chat_id(chat_id) - self._chat_usernames = parse_username(chat_username) - - def check_update(self, update: object) -> bool: - """Determines whether an update should be passed to this handler's :attr:`callback`. - - Args: - update (:class:`telegram.Update` | :obj:`object`): Incoming update. - - Returns: - :obj:`bool` - - """ - if not isinstance(update, Update): - return False - - if not (update.chat_boost or update.removed_chat_boost): - return False - - if self.chat_boost_types == self.CHAT_BOOST and not update.chat_boost: - return False - - if self.chat_boost_types == self.REMOVED_CHAT_BOOST and not update.removed_chat_boost: - return False - - if not any((self._chat_ids, self._chat_usernames)): - return True - - # Extract chat and user IDs and usernames from the update for comparison - chat_id = chat.id if (chat := update.effective_chat) else None - chat_username = chat.username if chat else None - - return bool(self._chat_ids and (chat_id in self._chat_ids)) or bool( - self._chat_usernames and (chat_username in self._chat_usernames) - ) diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/chatjoinrequesthandler.py b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/chatjoinrequesthandler.py deleted file mode 100644 index 849020f..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/chatjoinrequesthandler.py +++ /dev/null @@ -1,111 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the ChatJoinRequestHandler class.""" - -from typing import Optional - -from telegram import Update -from telegram._utils.defaultvalue import DEFAULT_TRUE -from telegram._utils.types import RT, SCT, DVType -from telegram.ext._handlers.basehandler import BaseHandler -from telegram.ext._utils._update_parsing import parse_chat_id, parse_username -from telegram.ext._utils.types import CCT, HandlerCallback - - -class ChatJoinRequestHandler(BaseHandler[Update, CCT, RT]): - """Handler class to handle Telegram updates that contain - :attr:`telegram.Update.chat_join_request`. - - Note: - If neither of :paramref:`username` and the :paramref:`chat_id` are passed, this handler - accepts *any* join request. Otherwise, this handler accepts all requests to join chats - for which the chat ID is listed in :paramref:`chat_id` or the username is listed in - :paramref:`username`, or both. - - .. versionadded:: 20.0 - - Warning: - When setting :paramref:`block` to :obj:`False`, you cannot rely on adding custom - attributes to :class:`telegram.ext.CallbackContext`. See its docs for more info. - - .. versionadded:: 13.8 - - Args: - callback (:term:`coroutine function`): The callback function for this handler. Will be - called when :meth:`check_update` has determined that an update should be processed by - this handler. Callback signature:: - - async def callback(update: Update, context: CallbackContext) - - The return value of the callback is usually ignored except for the special case of - :class:`telegram.ext.ConversationHandler`. - chat_id (:obj:`int` | Collection[:obj:`int`], optional): Filters requests to allow only - those which are asking to join the specified chat ID(s). - - .. versionadded:: 20.0 - username (:obj:`str` | Collection[:obj:`str`], optional): Filters requests to allow only - those which are asking to join the specified username(s). - - .. versionadded:: 20.0 - block (:obj:`bool`, optional): Determines whether the return value of the callback should - be awaited before processing the next handler in - :meth:`telegram.ext.Application.process_update`. Defaults to :obj:`True`. - - .. seealso:: :wiki:`Concurrency` - - Attributes: - callback (:term:`coroutine function`): The callback function for this handler. - block (:obj:`bool`): Determines whether the callback will run in a blocking way.. - - """ - - __slots__ = ( - "_chat_ids", - "_usernames", - ) - - def __init__( - self: "ChatJoinRequestHandler[CCT, RT]", - callback: HandlerCallback[Update, CCT, RT], - chat_id: Optional[SCT[int]] = None, - username: Optional[SCT[str]] = None, - block: DVType[bool] = DEFAULT_TRUE, - ): - super().__init__(callback, block=block) - - self._chat_ids = parse_chat_id(chat_id) - self._usernames = parse_username(username) - - def check_update(self, update: object) -> bool: - """Determines whether an update should be passed to this handler's :attr:`callback`. - - Args: - update (:class:`telegram.Update` | :obj:`object`): Incoming update. - - Returns: - :obj:`bool` - - """ - if isinstance(update, Update) and update.chat_join_request: - if not self._chat_ids and not self._usernames: - return True - if update.chat_join_request.chat.id in self._chat_ids: - return True - return update.chat_join_request.from_user.username in self._usernames - return False diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/chatmemberhandler.py b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/chatmemberhandler.py deleted file mode 100644 index a2b281c..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/chatmemberhandler.py +++ /dev/null @@ -1,125 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the ChatMemberHandler class.""" -from typing import Final, Optional, TypeVar - -from telegram import Update -from telegram._utils.defaultvalue import DEFAULT_TRUE -from telegram._utils.types import SCT, DVType -from telegram.ext._handlers.basehandler import BaseHandler -from telegram.ext._utils._update_parsing import parse_chat_id -from telegram.ext._utils.types import CCT, HandlerCallback - -RT = TypeVar("RT") - - -class ChatMemberHandler(BaseHandler[Update, CCT, RT]): - """Handler class to handle Telegram updates that contain a chat member update. - - Warning: - When setting :paramref:`block` to :obj:`False`, you cannot rely on adding custom - attributes to :class:`telegram.ext.CallbackContext`. See its docs for more info. - - Examples: - :any:`Chat Member Bot <examples.chatmemberbot>` - - .. versionadded:: 13.4 - - Args: - callback (:term:`coroutine function`): The callback function for this handler. Will be - called when :meth:`check_update` has determined that an update should be processed by - this handler. Callback signature:: - - async def callback(update: Update, context: CallbackContext) - - The return value of the callback is usually ignored except for the special case of - :class:`telegram.ext.ConversationHandler`. - chat_member_types (:obj:`int`, optional): Pass one of :attr:`MY_CHAT_MEMBER`, - :attr:`CHAT_MEMBER` or :attr:`ANY_CHAT_MEMBER` to specify if this handler should handle - only updates with :attr:`telegram.Update.my_chat_member`, - :attr:`telegram.Update.chat_member` or both. Defaults to :attr:`MY_CHAT_MEMBER`. - block (:obj:`bool`, optional): Determines whether the return value of the callback should - be awaited before processing the next handler in - :meth:`telegram.ext.Application.process_update`. Defaults to :obj:`True`. - - .. seealso:: :wiki:`Concurrency` - chat_id (:obj:`int` | Collection[:obj:`int`], optional): Filters chat member updates from - specified chat ID(s) only. - .. versionadded:: 21.3 - - Attributes: - callback (:term:`coroutine function`): The callback function for this handler. - chat_member_types (:obj:`int`): Optional. Specifies if this handler should handle - only updates with :attr:`telegram.Update.my_chat_member`, - :attr:`telegram.Update.chat_member` or both. - block (:obj:`bool`): Determines whether the return value of the callback should be - awaited before processing the next handler in - :meth:`telegram.ext.Application.process_update`. - - """ - - __slots__ = ( - "_chat_ids", - "chat_member_types", - ) - MY_CHAT_MEMBER: Final[int] = -1 - """:obj:`int`: Used as a constant to handle only :attr:`telegram.Update.my_chat_member`.""" - CHAT_MEMBER: Final[int] = 0 - """:obj:`int`: Used as a constant to handle only :attr:`telegram.Update.chat_member`.""" - ANY_CHAT_MEMBER: Final[int] = 1 - """:obj:`int`: Used as a constant to handle both :attr:`telegram.Update.my_chat_member` - and :attr:`telegram.Update.chat_member`.""" - - def __init__( - self: "ChatMemberHandler[CCT, RT]", - callback: HandlerCallback[Update, CCT, RT], - chat_member_types: int = MY_CHAT_MEMBER, - block: DVType[bool] = DEFAULT_TRUE, - chat_id: Optional[SCT[int]] = None, - ): - super().__init__(callback, block=block) - - self.chat_member_types: Optional[int] = chat_member_types - self._chat_ids = parse_chat_id(chat_id) - - def check_update(self, update: object) -> bool: - """Determines whether an update should be passed to this handler's :attr:`callback`. - - Args: - update (:class:`telegram.Update` | :obj:`object`): Incoming update. - - Returns: - :obj:`bool` - - """ - if not isinstance(update, Update): - return False - if not (update.my_chat_member or update.chat_member): - return False - if ( - self._chat_ids - and update.effective_chat - and update.effective_chat.id not in self._chat_ids - ): - return False - if self.chat_member_types == self.ANY_CHAT_MEMBER: - return True - if self.chat_member_types == self.CHAT_MEMBER: - return bool(update.chat_member) - return bool(update.my_chat_member) diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/choseninlineresulthandler.py b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/choseninlineresulthandler.py deleted file mode 100644 index 2faa0bc..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/choseninlineresulthandler.py +++ /dev/null @@ -1,122 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the ChosenInlineResultHandler class.""" -import re -from re import Match, Pattern -from typing import TYPE_CHECKING, Any, Optional, TypeVar, Union, cast - -from telegram import Update -from telegram._utils.defaultvalue import DEFAULT_TRUE -from telegram._utils.types import DVType -from telegram.ext._handlers.basehandler import BaseHandler -from telegram.ext._utils.types import CCT, HandlerCallback - -RT = TypeVar("RT") - -if TYPE_CHECKING: - from telegram.ext import Application - - -class ChosenInlineResultHandler(BaseHandler[Update, CCT, RT]): - """Handler class to handle Telegram updates that contain - :attr:`telegram.Update.chosen_inline_result`. - - Warning: - When setting :paramref:`block` to :obj:`False`, you cannot rely on adding custom - attributes to :class:`telegram.ext.CallbackContext`. See its docs for more info. - - Args: - callback (:term:`coroutine function`): The callback function for this handler. Will be - called when :meth:`check_update` has determined that an update should be processed by - this handler. Callback signature:: - - async def callback(update: Update, context: CallbackContext) - - The return value of the callback is usually ignored except for the special case of - :class:`telegram.ext.ConversationHandler`. - block (:obj:`bool`, optional): Determines whether the return value of the callback should - be awaited before processing the next handler in - :meth:`telegram.ext.Application.process_update`. Defaults to :obj:`True`. - - .. seealso:: :wiki:`Concurrency` - pattern (:obj:`str` | :func:`re.Pattern <re.compile>`, optional): Regex pattern. If not - :obj:`None`, :func:`re.match` - is used on :attr:`telegram.ChosenInlineResult.result_id` to determine if an update - should be handled by this handler. This is accessible in the callback as - :attr:`telegram.ext.CallbackContext.matches`. - - .. versionadded:: 13.6 - Attributes: - callback (:term:`coroutine function`): The callback function for this handler. - block (:obj:`bool`): Determines whether the return value of the callback should be - awaited before processing the next handler in - :meth:`telegram.ext.Application.process_update`. - pattern (`Pattern`): Optional. Regex pattern to test - :attr:`telegram.ChosenInlineResult.result_id` against. - - .. versionadded:: 13.6 - - """ - - __slots__ = ("pattern",) - - def __init__( - self: "ChosenInlineResultHandler[CCT, RT]", - callback: HandlerCallback[Update, CCT, RT], - block: DVType[bool] = DEFAULT_TRUE, - pattern: Optional[Union[str, Pattern[str]]] = None, - ): - super().__init__(callback, block=block) - - if isinstance(pattern, str): - pattern = re.compile(pattern) - - self.pattern: Optional[Union[str, Pattern[str]]] = pattern - - def check_update(self, update: object) -> Optional[Union[bool, object]]: - """Determines whether an update should be passed to this handler's :attr:`callback`. - - Args: - update (:class:`telegram.Update` | :obj:`object`): Incoming update. - - Returns: - :obj:`bool` | :obj:`re.match` - - """ - if isinstance(update, Update) and update.chosen_inline_result: - if self.pattern: - if match := re.match(self.pattern, update.chosen_inline_result.result_id): - return match - else: - return True - return None - - def collect_additional_context( - self, - context: CCT, - update: Update, # noqa: ARG002 - application: "Application[Any, CCT, Any, Any, Any, Any]", # noqa: ARG002 - check_result: Union[bool, Match[str]], - ) -> None: - """This function adds the matched regex pattern result to - :attr:`telegram.ext.CallbackContext.matches`. - """ - if self.pattern: - check_result = cast("Match", check_result) - context.matches = [check_result] diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/commandhandler.py b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/commandhandler.py deleted file mode 100644 index 27f7a42..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/commandhandler.py +++ /dev/null @@ -1,223 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the CommandHandler class.""" -import re -from typing import TYPE_CHECKING, Any, Optional, TypeVar, Union - -from telegram import MessageEntity, Update -from telegram._utils.defaultvalue import DEFAULT_TRUE -from telegram._utils.types import SCT, DVType -from telegram.ext import filters as filters_module -from telegram.ext._handlers.basehandler import BaseHandler -from telegram.ext._utils.types import CCT, FilterDataDict, HandlerCallback - -if TYPE_CHECKING: - from telegram.ext import Application - -RT = TypeVar("RT") - - -class CommandHandler(BaseHandler[Update, CCT, RT]): - """Handler class to handle Telegram commands. - - Commands are Telegram messages that start with a :attr:`telegram.MessageEntity.BOT_COMMAND` - (so with ``/``, optionally followed by an ``@`` and the bot's name and/or some additional - text). The handler will add a :obj:`list` to the :class:`CallbackContext` named - :attr:`CallbackContext.args`. It will contain a list of strings, which is the text following - the command split on single or consecutive whitespace characters. - - By default, the handler listens to messages as well as edited messages. To change this behavior - use :attr:`~filters.UpdateType.EDITED_MESSAGE <telegram.ext.filters.UpdateType.EDITED_MESSAGE>` - in the filter argument. - - Note: - :class:`CommandHandler` does *not* handle (edited) channel posts and does *not* handle - commands that are part of a caption. Please use :class:`~telegram.ext.MessageHandler` - with a suitable combination of filters (e.g. - :attr:`telegram.ext.filters.UpdateType.CHANNEL_POSTS`, - :attr:`telegram.ext.filters.CAPTION` and :class:`telegram.ext.filters.Regex`) to handle - those messages. - - Note: - If you want to support a different entity in the beginning, e.g. if a command message is - wrapped in a :attr:`telegram.MessageEntity.CODE`, use the - :class:`telegram.ext.PrefixHandler`. - - Warning: - When setting :paramref:`block` to :obj:`False`, you cannot rely on adding custom - attributes to :class:`telegram.ext.CallbackContext`. See its docs for more info. - - Examples: - * :any:`Timer Bot <examples.timerbot>` - * :any:`Error Handler Bot <examples.errorhandlerbot>` - - .. versionchanged:: 20.0 - - * Renamed the attribute ``command`` to :attr:`commands`, which now is always a - :class:`frozenset` - * Updating the commands this handler listens to is no longer possible. - - Args: - command (:obj:`str` | Collection[:obj:`str`]): - The command or list of commands this handler should listen for. Case-insensitive. - Limitations are the same as for :attr:`telegram.BotCommand.command`. - callback (:term:`coroutine function`): The callback function for this handler. Will be - called when :meth:`check_update` has determined that an update should be processed by - this handler. Callback signature:: - - async def callback(update: Update, context: CallbackContext) - - The return value of the callback is usually ignored except for the special case of - :class:`telegram.ext.ConversationHandler`. - filters (:class:`telegram.ext.filters.BaseFilter`, optional): A filter inheriting from - :class:`telegram.ext.filters.BaseFilter`. Standard filters can be found in - :mod:`telegram.ext.filters`. Filters can be combined using bitwise - operators (``&`` for :keyword:`and`, ``|`` for :keyword:`or`, ``~`` for :keyword:`not`) - block (:obj:`bool`, optional): Determines whether the return value of the callback should - be awaited before processing the next handler in - :meth:`telegram.ext.Application.process_update`. Defaults to :obj:`True`. - - .. seealso:: :wiki:`Concurrency` - has_args (:obj:`bool` | :obj:`int`, optional): - Determines whether the command handler should process the update or not. - If :obj:`True`, the handler will process any non-zero number of args. - If :obj:`False`, the handler will only process if there are no args. - if :obj:`int`, the handler will only process if there are exactly that many args. - Defaults to :obj:`None`, which means the handler will process any or no args. - - .. versionadded:: 20.5 - - Raises: - :exc:`ValueError`: When the command is too long or has illegal chars. - - Attributes: - commands (frozenset[:obj:`str`]): The set of commands this handler should listen for. - callback (:term:`coroutine function`): The callback function for this handler. - filters (:class:`telegram.ext.filters.BaseFilter`): Optional. Only allow updates with these - filters. - block (:obj:`bool`): Determines whether the return value of the callback should be - awaited before processing the next handler in - :meth:`telegram.ext.Application.process_update`. - has_args (:obj:`bool` | :obj:`int` | None): - Optional argument, otherwise all implementations of :class:`CommandHandler` will break. - Defaults to :obj:`None`, which means the handler will process any args or no args. - - .. versionadded:: 20.5 - """ - - __slots__ = ("commands", "filters", "has_args") - - def __init__( - self: "CommandHandler[CCT, RT]", - command: SCT[str], - callback: HandlerCallback[Update, CCT, RT], - filters: Optional[filters_module.BaseFilter] = None, - block: DVType[bool] = DEFAULT_TRUE, - has_args: Optional[Union[bool, int]] = None, - ): - super().__init__(callback, block=block) - - if isinstance(command, str): - commands = frozenset({command.lower()}) - else: - commands = frozenset(x.lower() for x in command) - for comm in commands: - if not re.match(r"^[\da-z_]{1,32}$", comm): - raise ValueError(f"Command `{comm}` is not a valid bot command") - self.commands: frozenset[str] = commands - - self.filters: filters_module.BaseFilter = ( - filters if filters is not None else filters_module.UpdateType.MESSAGES - ) - - self.has_args: Optional[Union[bool, int]] = has_args - - if (isinstance(self.has_args, int)) and (self.has_args < 0): - raise ValueError("CommandHandler argument has_args cannot be a negative integer") - - def _check_correct_args(self, args: list[str]) -> Optional[bool]: - """Determines whether the args are correct for this handler. Implemented in check_update(). - Args: - args (:obj:`list`): The args for the handler. - Returns: - :obj:`bool`: Whether the args are valid for this handler. - """ - return bool( - (self.has_args is None) - or (self.has_args is True and args) - or (self.has_args is False and not args) - or (isinstance(self.has_args, int) and len(args) == self.has_args) - ) - - def check_update( - self, update: object - ) -> Optional[Union[bool, tuple[list[str], Optional[Union[bool, FilterDataDict]]]]]: - """Determines whether an update should be passed to this handler's :attr:`callback`. - - Args: - update (:class:`telegram.Update` | :obj:`object`): Incoming update. - - Returns: - :obj:`list`: The list of args for the handler. - - """ - if isinstance(update, Update) and update.effective_message: - message = update.effective_message - - if ( - message.entities - and message.entities[0].type == MessageEntity.BOT_COMMAND - and message.entities[0].offset == 0 - and message.text - and message.get_bot() - ): - command = message.text[1 : message.entities[0].length] - args = message.text.split()[1:] - command_parts = command.split("@") - command_parts.append(message.get_bot().username) - - if not ( - command_parts[0].lower() in self.commands - and command_parts[1].lower() == message.get_bot().username.lower() - ): - return None - - if not self._check_correct_args(args): - return None - - filter_result = self.filters.check_update(update) - if filter_result: - return args, filter_result - return False - return None - - def collect_additional_context( - self, - context: CCT, - update: Update, # noqa: ARG002 - application: "Application[Any, CCT, Any, Any, Any, Any]", # noqa: ARG002 - check_result: Optional[Union[bool, tuple[list[str], Optional[bool]]]], - ) -> None: - """Add text after the command to :attr:`CallbackContext.args` as list, split on single - whitespaces and add output of data filters to :attr:`CallbackContext` as well. - """ - if isinstance(check_result, tuple): - context.args = check_result[0] - if isinstance(check_result[1], dict): - context.update(check_result[1]) diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/conversationhandler.py b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/conversationhandler.py deleted file mode 100644 index dd824bf..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/conversationhandler.py +++ /dev/null @@ -1,958 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the ConversationHandler.""" -import asyncio -import datetime as dtm -from dataclasses import dataclass -from typing import TYPE_CHECKING, Any, Final, Generic, NoReturn, Optional, Union, cast - -from telegram import Update -from telegram._utils.defaultvalue import DEFAULT_TRUE, DefaultValue -from telegram._utils.logging import get_logger -from telegram._utils.repr import build_repr_with_selected_attrs -from telegram._utils.types import DVType -from telegram._utils.warnings import warn -from telegram.ext._application import ApplicationHandlerStop -from telegram.ext._extbot import ExtBot -from telegram.ext._handlers.basehandler import BaseHandler -from telegram.ext._handlers.callbackqueryhandler import CallbackQueryHandler -from telegram.ext._handlers.choseninlineresulthandler import ChosenInlineResultHandler -from telegram.ext._handlers.inlinequeryhandler import InlineQueryHandler -from telegram.ext._handlers.stringcommandhandler import StringCommandHandler -from telegram.ext._handlers.stringregexhandler import StringRegexHandler -from telegram.ext._handlers.typehandler import TypeHandler -from telegram.ext._utils.trackingdict import TrackingDict -from telegram.ext._utils.types import CCT, ConversationDict, ConversationKey - -if TYPE_CHECKING: - from telegram.ext import Application, Job, JobQueue -_CheckUpdateType = tuple[object, ConversationKey, BaseHandler[Update, CCT, object], object] - -_LOGGER = get_logger(__name__, class_name="ConversationHandler") - - -@dataclass -class _ConversationTimeoutContext(Generic[CCT]): - """Used as a datastore for conversation timeouts. Passed in the - :paramref:`JobQueue.run_once.data` parameter. See :meth:`_trigger_timeout`. - """ - - __slots__ = ("application", "callback_context", "conversation_key", "update") - - conversation_key: ConversationKey - update: Update - application: "Application[Any, CCT, Any, Any, Any, JobQueue]" - callback_context: CCT - - -@dataclass -class PendingState: - """Thin wrapper around :class:`asyncio.Task` to handle block=False handlers. Note that this is - a public class of this module, since :meth:`Application.update_persistence` needs to access it. - It's still hidden from users, since this module itself is private. - """ - - __slots__ = ("old_state", "task") - - task: asyncio.Task - old_state: object - - def done(self) -> bool: - return self.task.done() - - def resolve(self) -> object: - """Returns the new state of the :class:`ConversationHandler` if available. If there was an - exception during the task execution, then return the old state. If both the new and old - state are :obj:`None`, return `CH.END`. If only the new state is :obj:`None`, return the - old state. - - Raises: - :exc:`RuntimeError`: If the current task has not yet finished. - """ - if not self.task.done(): - raise RuntimeError("New state is not yet available") - - exc = self.task.exception() - if exc: - _LOGGER.exception( - "Task function raised exception. Falling back to old state %s", - self.old_state, - ) - return self.old_state - - res = self.task.result() - if res is None and self.old_state is None: - res = ConversationHandler.END - elif res is None: - # returning None from a callback means that we want to stay in the old state - return self.old_state - - return res - - -class ConversationHandler(BaseHandler[Update, CCT, object]): - """ - A handler to hold a conversation with a single or multiple users through Telegram updates by - managing three collections of other handlers. - - Warning: - :class:`ConversationHandler` heavily relies on incoming updates being processed one by one. - When using this handler, :attr:`telegram.ext.ApplicationBuilder.concurrent_updates` should - be set to :obj:`False`. - - Note: - :class:`ConversationHandler` will only accept updates that are (subclass-)instances of - :class:`telegram.Update`. This is, because depending on the :attr:`per_user` and - :attr:`per_chat`, :class:`ConversationHandler` relies on - :attr:`telegram.Update.effective_user` and/or :attr:`telegram.Update.effective_chat` in - order to determine which conversation an update should belong to. For - :attr:`per_message=True <per_message>`, :class:`ConversationHandler` uses - :attr:`update.callback_query.message.message_id <telegram.Message.message_id>` when - :attr:`per_chat=True <per_chat>` and - :attr:`update.callback_query.inline_message_id <.CallbackQuery.inline_message_id>` when - :attr:`per_chat=False <per_chat>`. For a more detailed explanation, please see our `FAQ`_. - - Finally, :class:`ConversationHandler`, does *not* handle (edited) channel posts. - - .. _`FAQ`: https://github.com/python-telegram-bot/python-telegram-bot/wiki\ - /Frequently-Asked-Questions#what-do-the-per_-settings-in-conversation handler-do - - The first collection, a :obj:`list` named :attr:`entry_points`, is used to initiate the - conversation, for example with a :class:`telegram.ext.CommandHandler` or - :class:`telegram.ext.MessageHandler`. - - The second collection, a :obj:`dict` named :attr:`states`, contains the different conversation - steps and one or more associated handlers that should be used if the user sends a message when - the conversation with them is currently in that state. Here you can also define a state for - :attr:`TIMEOUT` to define the behavior when :attr:`conversation_timeout` is exceeded, and a - state for :attr:`WAITING` to define behavior when a new update is received while the previous - :attr:`block=False <block>` handler is not finished. - - The third collection, a :obj:`list` named :attr:`fallbacks`, is used if the user is currently - in a conversation but the state has either no associated handler or the handler that is - associated to the state is inappropriate for the update, for example if the update contains a - command, but a regular text message is expected. You could use this for a ``/cancel`` command - or to let the user know their message was not recognized. - - To change the state of conversation, the callback function of a handler must return the new - state after responding to the user. If it does not return anything (returning :obj:`None` by - default), the state will not change. If an entry point callback function returns :obj:`None`, - the conversation ends immediately after the execution of this callback function. - To end the conversation, the callback function must return :attr:`END` or ``-1``. To - handle the conversation timeout, use handler :attr:`TIMEOUT` or ``-2``. - Finally, :class:`telegram.ext.ApplicationHandlerStop` can be used in conversations as described - in its documentation. - - Note: - In each of the described collections of handlers, a handler may in turn be a - :class:`ConversationHandler`. In that case, the child :class:`ConversationHandler` should - have the attribute :attr:`map_to_parent` which allows returning to the parent conversation - at specified states within the child conversation. - - Note that the keys in :attr:`map_to_parent` must not appear as keys in :attr:`states` - attribute or else the latter will be ignored. You may map :attr:`END` to one of the parents - states to continue the parent conversation after the child conversation has ended or even - map a state to :attr:`END` to end the *parent* conversation from within the child - conversation. For an example on nested :class:`ConversationHandler` s, see - :any:`examples.nestedconversationbot`. - - Examples: - * :any:`Conversation Bot <examples.conversationbot>` - * :any:`Conversation Bot 2 <examples.conversationbot2>` - * :any:`Nested Conversation Bot <examples.nestedconversationbot>` - * :any:`Persistent Conversation Bot <examples.persistentconversationbot>` - - Args: - entry_points (list[:class:`telegram.ext.BaseHandler`]): A list of :obj:`BaseHandler` - objects that - can trigger the start of the conversation. The first handler whose :meth:`check_update` - method returns :obj:`True` will be used. If all return :obj:`False`, the update is not - handled. - states (dict[:obj:`object`, list[:class:`telegram.ext.BaseHandler`]]): A :obj:`dict` that - defines the different states of conversation a user can be in and one or more - associated :obj:`BaseHandler` objects that should be used in that state. The first - handler whose :meth:`check_update` method returns :obj:`True` will be used. - fallbacks (list[:class:`telegram.ext.BaseHandler`]): A list of handlers that might be used - if the user is in a conversation, but every handler for their current state returned - :obj:`False` on :meth:`check_update`. The first handler which :meth:`check_update` - method returns :obj:`True` will be used. If all return :obj:`False`, the update is not - handled. - allow_reentry (:obj:`bool`, optional): If set to :obj:`True`, a user that is currently in a - conversation can restart the conversation by triggering one of the entry points. - Default is :obj:`False`. - per_chat (:obj:`bool`, optional): If the conversation key should contain the Chat's ID. - Default is :obj:`True`. - per_user (:obj:`bool`, optional): If the conversation key should contain the User's ID. - Default is :obj:`True`. - per_message (:obj:`bool`, optional): If the conversation key should contain the Message's - ID. Default is :obj:`False`. - conversation_timeout (:obj:`float` | :obj:`datetime.timedelta`, optional): When this - handler is inactive more than this timeout (in seconds), it will be automatically - ended. If this value is ``0`` or :obj:`None` (default), there will be no timeout. The - last received update and the corresponding :class:`context <.CallbackContext>` will be - handled by *ALL* the handler's whose :meth:`check_update` method returns :obj:`True` - that are in the state :attr:`ConversationHandler.TIMEOUT`. - - Caution: - * This feature relies on the :attr:`telegram.ext.Application.job_queue` being set - and hence requires that the dependencies that :class:`telegram.ext.JobQueue` - relies on are installed. - * Using :paramref:`conversation_timeout` with nested conversations is currently - not supported. You can still try to use it, but it will likely behave - differently from what you expect. - - name (:obj:`str`, optional): The name for this conversation handler. Required for - persistence. - persistent (:obj:`bool`, optional): If the conversation's dict for this handler should be - saved. :paramref:`name` is required and persistence has to be set in - :attr:`Application <.Application.persistence>`. - - .. versionchanged:: 20.0 - Was previously named as ``persistence``. - map_to_parent (dict[:obj:`object`, :obj:`object`], optional): A :obj:`dict` that can be - used to instruct a child conversation handler to transition into a mapped state on - its parent conversation handler in place of a specified nested state. - block (:obj:`bool`, optional): Pass :obj:`False` or :obj:`True` to set a default value for - the :attr:`BaseHandler.block` setting of all handlers (in :attr:`entry_points`, - :attr:`states` and :attr:`fallbacks`). The resolution order for checking if a handler - should be run non-blocking is: - - 1. :attr:`telegram.ext.BaseHandler.block` (if set) - 2. the value passed to this parameter (if any) - 3. :attr:`telegram.ext.Defaults.block` (if defaults are used) - - .. seealso:: :wiki:`Concurrency` - - .. versionchanged:: 20.0 - No longer overrides the handlers settings. Resolution order was changed. - - Raises: - :exc:`ValueError`: If :paramref:`persistent` is used but :paramref:`name` was not set, or - when :attr:`per_message`, :attr:`per_chat`, :attr:`per_user` are all :obj:`False`. - - Attributes: - block (:obj:`bool`): Determines whether the callback will run in a blocking way. Always - :obj:`True` since conversation handlers handle any non-blocking callbacks internally. - - """ - - __slots__ = ( - "_allow_reentry", - "_block", - "_child_conversations", - "_conversation_timeout", - "_conversations", - "_entry_points", - "_fallbacks", - "_map_to_parent", - "_name", - "_per_chat", - "_per_message", - "_per_user", - "_persistent", - "_states", - "_timeout_jobs_lock", - "timeout_jobs", - ) - - END: Final[int] = -1 - """:obj:`int`: Used as a constant to return when a conversation is ended.""" - TIMEOUT: Final[int] = -2 - """:obj:`int`: Used as a constant to handle state when a conversation is timed out - (exceeded :attr:`conversation_timeout`). - """ - WAITING: Final[int] = -3 - """:obj:`int`: Used as a constant to handle state when a conversation is still waiting on the - previous :attr:`block=False <block>` handler to finish.""" - - # pylint: disable=super-init-not-called - def __init__( - self: "ConversationHandler[CCT]", - entry_points: list[BaseHandler[Update, CCT, object]], - states: dict[object, list[BaseHandler[Update, CCT, object]]], - fallbacks: list[BaseHandler[Update, CCT, object]], - allow_reentry: bool = False, - per_chat: bool = True, - per_user: bool = True, - per_message: bool = False, - conversation_timeout: Optional[Union[float, dtm.timedelta]] = None, - name: Optional[str] = None, - persistent: bool = False, - map_to_parent: Optional[dict[object, object]] = None, - block: DVType[bool] = DEFAULT_TRUE, - ): - # these imports need to be here because of circular import error otherwise - from telegram.ext import ( # pylint: disable=import-outside-toplevel - PollAnswerHandler, - PollHandler, - PreCheckoutQueryHandler, - ShippingQueryHandler, - ) - - # self.block is what the Application checks and we want it to always run CH in a blocking - # way so that CH can take care of any non-blocking logic internally - self.block: DVType[bool] = True - # Store the actual setting in a protected variable instead - self._block: DVType[bool] = block - - self._entry_points: list[BaseHandler[Update, CCT, object]] = entry_points - self._states: dict[object, list[BaseHandler[Update, CCT, object]]] = states - self._fallbacks: list[BaseHandler[Update, CCT, object]] = fallbacks - - self._allow_reentry: bool = allow_reentry - self._per_user: bool = per_user - self._per_chat: bool = per_chat - self._per_message: bool = per_message - self._conversation_timeout: Optional[Union[float, dtm.timedelta]] = conversation_timeout - self._name: Optional[str] = name - self._map_to_parent: Optional[dict[object, object]] = map_to_parent - - # if conversation_timeout is used, this dict is used to schedule a job which runs when the - # conv has timed out. - self.timeout_jobs: dict[ConversationKey, Job[Any]] = {} - self._timeout_jobs_lock = asyncio.Lock() - self._conversations: ConversationDict = {} - self._child_conversations: set[ConversationHandler] = set() - - if persistent and not self.name: - raise ValueError("Conversations can't be persistent when handler is unnamed.") - self._persistent: bool = persistent - - if not any((self.per_user, self.per_chat, self.per_message)): - raise ValueError("'per_user', 'per_chat' and 'per_message' can't all be 'False'") - - if self.per_message and not self.per_chat: - warn( - "If 'per_message=True' is used, 'per_chat=True' should also be used, " - "since message IDs are not globally unique.", - stacklevel=2, - ) - - all_handlers: list[BaseHandler[Update, CCT, object]] = [] - all_handlers.extend(entry_points) - all_handlers.extend(fallbacks) - - for state_handlers in states.values(): - all_handlers.extend(state_handlers) - - self._child_conversations.update( - handler for handler in all_handlers if isinstance(handler, ConversationHandler) - ) - - # this link will be added to all warnings tied to per_* setting - per_faq_link = ( - " Read this FAQ entry to learn more about the per_* settings: " - "https://github.com/python-telegram-bot/python-telegram-bot/wiki" - "/Frequently-Asked-Questions#what-do-the-per_-settings-in-conversationhandler-do." - ) - - # this loop is going to warn the user about handlers which can work unexpectedly - # in conversations - for handler in all_handlers: - if isinstance(handler, (StringCommandHandler, StringRegexHandler)): - warn( - "The `ConversationHandler` only handles updates of type `telegram.Update`. " - f"{handler.__class__.__name__} handles updates of type `str`.", - stacklevel=2, - ) - elif isinstance(handler, TypeHandler) and not issubclass(handler.type, Update): - warn( - "The `ConversationHandler` only handles updates of type `telegram.Update`." - f" The TypeHandler is set to handle {handler.type.__name__}.", - stacklevel=2, - ) - elif isinstance(handler, PollHandler): - warn( - "PollHandler will never trigger in a conversation since it has no information " - "about the chat or the user who voted in it. Do you mean the " - "`PollAnswerHandler`?", - stacklevel=2, - ) - - elif self.per_chat and ( - isinstance( - handler, - ( - ShippingQueryHandler, - InlineQueryHandler, - ChosenInlineResultHandler, - PreCheckoutQueryHandler, - PollAnswerHandler, - ), - ) - ): - warn( - f"Updates handled by {handler.__class__.__name__} only have information about " - "the user, so this handler won't ever be triggered if `per_chat=True`." - f"{per_faq_link}", - stacklevel=2, - ) - - elif self.per_message and not isinstance(handler, CallbackQueryHandler): - warn( - "If 'per_message=True', all entry points, state handlers, and fallbacks" - " must be 'CallbackQueryHandler', since no other handlers " - f"have a message context.{per_faq_link}", - stacklevel=2, - ) - elif not self.per_message and isinstance(handler, CallbackQueryHandler): - warn( - "If 'per_message=False', 'CallbackQueryHandler' will not be " - f"tracked for every message.{per_faq_link}", - stacklevel=2, - ) - - if self.conversation_timeout and isinstance(handler, self.__class__): - warn( - "Using `conversation_timeout` with nested conversations is currently not " - "supported. You can still try to use it, but it will likely behave " - "differently from what you expect.", - stacklevel=2, - ) - - def __repr__(self) -> str: - """Give a string representation of the ConversationHandler in the form - ``ConversationHandler[name=..., states={...}]``. - - If there are more than 3 states, only the first 3 states are listed. - - As this class doesn't implement :meth:`object.__str__`, the default implementation - will be used, which is equivalent to :meth:`__repr__`. - - Returns: - :obj:`str` - """ - truncation_threshold = 3 - states = dict(list(self.states.items())[:truncation_threshold]) - states_string = str(states) - if len(self.states) > truncation_threshold: - states_string = states_string[:-1] + ", ...}" - - return build_repr_with_selected_attrs( - self, - name=self.name, - states=states_string, - ) - - @property - def entry_points(self) -> list[BaseHandler[Update, CCT, object]]: - """list[:class:`telegram.ext.BaseHandler`]: A list of :obj:`BaseHandler` objects that can - trigger the start of the conversation. - """ - return self._entry_points - - @entry_points.setter - def entry_points(self, _: object) -> NoReturn: - raise AttributeError( - "You can not assign a new value to entry_points after initialization." - ) - - @property - def states(self) -> dict[object, list[BaseHandler[Update, CCT, object]]]: - """dict[:obj:`object`, list[:class:`telegram.ext.BaseHandler`]]: A :obj:`dict` that - defines the different states of conversation a user can be in and one or more - associated :obj:`BaseHandler` objects that should be used in that state. - """ - return self._states - - @states.setter - def states(self, _: object) -> NoReturn: - raise AttributeError("You can not assign a new value to states after initialization.") - - @property - def fallbacks(self) -> list[BaseHandler[Update, CCT, object]]: - """list[:class:`telegram.ext.BaseHandler`]: A list of handlers that might be used if - the user is in a conversation, but every handler for their current state returned - :obj:`False` on :meth:`check_update`. - """ - return self._fallbacks - - @fallbacks.setter - def fallbacks(self, _: object) -> NoReturn: - raise AttributeError("You can not assign a new value to fallbacks after initialization.") - - @property - def allow_reentry(self) -> bool: - """:obj:`bool`: Determines if a user can restart a conversation with an entry point.""" - return self._allow_reentry - - @allow_reentry.setter - def allow_reentry(self, _: object) -> NoReturn: - raise AttributeError( - "You can not assign a new value to allow_reentry after initialization." - ) - - @property - def per_user(self) -> bool: - """:obj:`bool`: If the conversation key should contain the User's ID.""" - return self._per_user - - @per_user.setter - def per_user(self, _: object) -> NoReturn: - raise AttributeError("You can not assign a new value to per_user after initialization.") - - @property - def per_chat(self) -> bool: - """:obj:`bool`: If the conversation key should contain the Chat's ID.""" - return self._per_chat - - @per_chat.setter - def per_chat(self, _: object) -> NoReturn: - raise AttributeError("You can not assign a new value to per_chat after initialization.") - - @property - def per_message(self) -> bool: - """:obj:`bool`: If the conversation key should contain the message's ID.""" - return self._per_message - - @per_message.setter - def per_message(self, _: object) -> NoReturn: - raise AttributeError("You can not assign a new value to per_message after initialization.") - - @property - def conversation_timeout( - self, - ) -> Optional[Union[float, dtm.timedelta]]: - """:obj:`float` | :obj:`datetime.timedelta`: Optional. When this - handler is inactive more than this timeout (in seconds), it will be automatically - ended. - """ - return self._conversation_timeout - - @conversation_timeout.setter - def conversation_timeout(self, _: object) -> NoReturn: - raise AttributeError( - "You can not assign a new value to conversation_timeout after initialization." - ) - - @property - def name(self) -> Optional[str]: - """:obj:`str`: Optional. The name for this :class:`ConversationHandler`.""" - return self._name - - @name.setter - def name(self, _: object) -> NoReturn: - raise AttributeError("You can not assign a new value to name after initialization.") - - @property - def persistent(self) -> bool: - """:obj:`bool`: Optional. If the conversations dict for this handler should be - saved. :attr:`name` is required and persistence has to be set in - :attr:`Application <.Application.persistence>`. - """ - return self._persistent - - @persistent.setter - def persistent(self, _: object) -> NoReturn: - raise AttributeError("You can not assign a new value to persistent after initialization.") - - @property - def map_to_parent(self) -> Optional[dict[object, object]]: - """dict[:obj:`object`, :obj:`object`]: Optional. A :obj:`dict` that can be - used to instruct a nested :class:`ConversationHandler` to transition into a mapped state on - its parent :class:`ConversationHandler` in place of a specified nested state. - """ - return self._map_to_parent - - @map_to_parent.setter - def map_to_parent(self, _: object) -> NoReturn: - raise AttributeError( - "You can not assign a new value to map_to_parent after initialization." - ) - - async def _initialize_persistence( - self, application: "Application" - ) -> dict[str, TrackingDict[ConversationKey, object]]: - """Initializes the persistence for this handler and its child conversations. - While this method is marked as protected, we expect it to be called by the - Application/parent conversations. It's just protected to hide it from users. - - Args: - application (:class:`telegram.ext.Application`): The application. - - Returns: - A dict {conversation.name -> TrackingDict}, which contains all dict of this - conversation and possible child conversations. - - """ - if not (self.persistent and self.name and application.persistence): - raise RuntimeError( - "This handler is not persistent, has no name or the application has no " - "persistence!" - ) - - current_conversations = self._conversations - self._conversations = cast( - "TrackingDict[ConversationKey, object]", - TrackingDict(), - ) - # In the conversation already processed updates - self._conversations.update(current_conversations) - # above might be partly overridden but that's okay since we warn about that in - # add_handler - stored_data = await application.persistence.get_conversations(self.name) - self._conversations.update_no_track(stored_data) - - # Since CH.END is stored as normal state, we need to properly parse it here in order to - # actually end the conversation, i.e. delete the key from the _conversations dict - # This also makes sure that these entries are deleted from the persisted data on the next - # run of Application.update_persistence - for key, state in stored_data.items(): - if state == self.END: - self._update_state(new_state=self.END, key=key) - - out = {self.name: self._conversations} - - for handler in self._child_conversations: - out.update( - await handler._initialize_persistence( # pylint: disable=protected-access - application=application - ) - ) - - return out - - def _get_key(self, update: Update) -> ConversationKey: - """Builds the conversation key associated with the update.""" - chat = update.effective_chat - user = update.effective_user - - key: list[Union[int, str]] = [] - - if self.per_chat: - if chat is None: - raise RuntimeError("Can't build key for update without effective chat!") - key.append(chat.id) - - if self.per_user: - if user is None: - raise RuntimeError("Can't build key for update without effective user!") - key.append(user.id) - - if self.per_message: - if update.callback_query is None: - raise RuntimeError("Can't build key for update without CallbackQuery!") - if update.callback_query.inline_message_id: - key.append(update.callback_query.inline_message_id) - else: - key.append(update.callback_query.message.message_id) # type: ignore[union-attr] - - return tuple(key) - - async def _schedule_job_delayed( - self, - new_state: asyncio.Task, - application: "Application[Any, CCT, Any, Any, Any, JobQueue]", - update: Update, - context: CCT, - conversation_key: ConversationKey, - ) -> None: - try: - effective_new_state = await new_state - except Exception as exc: - _LOGGER.debug( - "Non-blocking handler callback raised exception. Not scheduling conversation " - "timeout.", - exc_info=exc, - ) - return None - return self._schedule_job( - new_state=effective_new_state, - application=application, - update=update, - context=context, - conversation_key=conversation_key, - ) - - def _schedule_job( - self, - new_state: object, - application: "Application[Any, CCT, Any, Any, Any, JobQueue]", - update: Update, - context: CCT, - conversation_key: ConversationKey, - ) -> None: - """Schedules a job which executes :meth:`_trigger_timeout` upon conversation timeout.""" - if new_state == self.END: - return - - try: - # both job_queue & conversation_timeout are checked before calling _schedule_job - j_queue = application.job_queue - self.timeout_jobs[conversation_key] = j_queue.run_once( # type: ignore[union-attr] - self._trigger_timeout, - self.conversation_timeout, # type: ignore[arg-type] - data=_ConversationTimeoutContext(conversation_key, update, application, context), - ) - except Exception as exc: - _LOGGER.exception("Failed to schedule timeout.", exc_info=exc) - - # pylint: disable=too-many-return-statements - def check_update(self, update: object) -> Optional[_CheckUpdateType[CCT]]: - """ - Determines whether an update should be handled by this conversation handler, and if so in - which state the conversation currently is. - - Args: - update (:class:`telegram.Update` | :obj:`object`): Incoming update. - - Returns: - :obj:`bool` - - """ - if not isinstance(update, Update): - return None - # Ignore messages in channels - if update.channel_post or update.edited_channel_post: - return None - if self.per_chat and not update.effective_chat: - return None - if self.per_user and not update.effective_user: - return None - if self.per_message and not update.callback_query: - return None - if update.callback_query and self.per_chat and not update.callback_query.message: - return None - - key = self._get_key(update) - state = self._conversations.get(key) - check: Optional[object] = None - - # Resolve futures - if isinstance(state, PendingState): - _LOGGER.debug("Waiting for asyncio Task to finish ...") - - # check if future is finished or not - if state.done(): - res = state.resolve() - # Special case if an error was raised in a non-blocking entry-point - if state.old_state is None and state.task.exception(): - self._conversations.pop(key, None) - state = None - else: - self._update_state(res, key) - state = self._conversations.get(key) - - # if not then handle WAITING state instead - else: - handlers = self.states.get(self.WAITING, []) - for handler_ in handlers: - check = handler_.check_update(update) - if check is not None and check is not False: - return self.WAITING, key, handler_, check - return None - - _LOGGER.debug("Selecting conversation %s with state %s", str(key), str(state)) - - handler: Optional[BaseHandler] = None - - # Search entry points for a match - if state is None or self.allow_reentry: - for entry_point in self.entry_points: - check = entry_point.check_update(update) - if check is not None and check is not False: - handler = entry_point - break - - else: - if state is None: - return None - - # Get the handler list for current state, if we didn't find one yet and we're still here - if state is not None and handler is None: - for candidate in self.states.get(state, []): - check = candidate.check_update(update) - if check is not None and check is not False: - handler = candidate - break - - # Find a fallback handler if all other handlers fail - else: - for fallback in self.fallbacks: - check = fallback.check_update(update) - if check is not None and check is not False: - handler = fallback - break - - else: - return None - - return state, key, handler, check # type: ignore[return-value] - - async def handle_update( # type: ignore[override] - self, - update: Update, - application: "Application[Any, CCT, Any, Any, Any, Any]", - check_result: _CheckUpdateType[CCT], - context: CCT, - ) -> Optional[object]: - """Send the update to the callback for the current state and BaseHandler - - Args: - check_result: The result from :meth:`check_update`. For this handler it's a tuple of - the conversation state, key, handler, and the handler's check result. - update (:class:`telegram.Update`): Incoming telegram update. - application (:class:`telegram.ext.Application`): Application that originated the - update. - context (:class:`telegram.ext.CallbackContext`): The context as provided by - the application. - - """ - current_state, conversation_key, handler, handler_check_result = check_result - raise_dp_handler_stop = False - - async with self._timeout_jobs_lock: - # Remove the old timeout job (if present) - timeout_job = self.timeout_jobs.pop(conversation_key, None) - - if timeout_job is not None: - timeout_job.schedule_removal() - - # Resolution order of "block": - # 1. Setting of the selected handler - # 2. Setting of the ConversationHandler - # 3. Default values of the bot - if handler.block is not DEFAULT_TRUE: - block = handler.block - elif self._block is not DEFAULT_TRUE: - block = self._block - elif isinstance(application.bot, ExtBot) and application.bot.defaults is not None: - block = application.bot.defaults.block - else: - block = DefaultValue.get_value(handler.block) - - try: # Now create task or await the callback - if block: - new_state: object = await handler.handle_update( - update, application, handler_check_result, context - ) - else: - new_state = application.create_task( - coroutine=handler.handle_update( - update, application, handler_check_result, context - ), - update=update, - name=f"ConversationHandler:{update.update_id}:handle_update:non_blocking_cb", - ) - except ApplicationHandlerStop as exception: - new_state = exception.state - raise_dp_handler_stop = True - async with self._timeout_jobs_lock: - if self.conversation_timeout: - if application.job_queue is None: - warn( - "Ignoring `conversation_timeout` because the Application has no JobQueue.", - stacklevel=1, - ) - elif not application.job_queue.scheduler.running: - warn( - "Ignoring `conversation_timeout` because the Applications JobQueue is " - "not running.", - stacklevel=1, - ) - elif isinstance(new_state, asyncio.Task): - # Add the new timeout job - # checking if the new state is self.END is done in _schedule_job - application.create_task( - self._schedule_job_delayed( - new_state, application, update, context, conversation_key - ), - update=update, - name=f"ConversationHandler:{update.update_id}:handle_update:timeout_job", - ) - else: - self._schedule_job(new_state, application, update, context, conversation_key) - - if isinstance(self.map_to_parent, dict) and new_state in self.map_to_parent: - self._update_state(self.END, conversation_key, handler) - if raise_dp_handler_stop: - raise ApplicationHandlerStop(self.map_to_parent.get(new_state)) - return self.map_to_parent.get(new_state) - - if current_state != self.WAITING: - self._update_state(new_state, conversation_key, handler) - - if raise_dp_handler_stop: - # Don't pass the new state here. If we're in a nested conversation, the parent is - # expecting None as return value. - raise ApplicationHandlerStop - # Signals a possible parent conversation to stay in the current state - return None - - def _update_state( - self, new_state: object, key: ConversationKey, handler: Optional[BaseHandler] = None - ) -> None: - if new_state == self.END: - if key in self._conversations: - # If there is no key in conversations, nothing is done. - del self._conversations[key] - - elif isinstance(new_state, asyncio.Task): - self._conversations[key] = PendingState( - old_state=self._conversations.get(key), task=new_state - ) - - elif new_state is not None: - if new_state not in self.states: - warn( - f"{repr(handler.callback.__name__) if handler is not None else 'BaseHandler'} " - f"returned state {new_state} which is unknown to the " - f"ConversationHandler{' ' + self.name if self.name is not None else ''}.", - stacklevel=2, - ) - self._conversations[key] = new_state - - async def _trigger_timeout(self, context: CCT) -> None: - """This is run whenever a conversation has timed out. Also makes sure that all handlers - which are in the :attr:`TIMEOUT` state and whose :meth:`BaseHandler.check_update` returns - :obj:`True` is handled. - """ - job = cast("Job", context.job) - ctxt = cast("_ConversationTimeoutContext", job.data) - - _LOGGER.debug( - "Conversation timeout was triggered for conversation %s!", ctxt.conversation_key - ) - - callback_context = ctxt.callback_context - - async with self._timeout_jobs_lock: - found_job = self.timeout_jobs.get(ctxt.conversation_key) - if found_job is not job: - # The timeout has been cancelled in handle_update - return - del self.timeout_jobs[ctxt.conversation_key] - - # Now run all handlers which are in TIMEOUT state - handlers = self.states.get(self.TIMEOUT, []) - for handler in handlers: - check = handler.check_update(ctxt.update) - if check is not None and check is not False: - try: - await handler.handle_update( - ctxt.update, ctxt.application, check, callback_context - ) - except ApplicationHandlerStop: - warn( - "ApplicationHandlerStop in TIMEOUT state of " - "ConversationHandler has no effect. Ignoring.", - stacklevel=2, - ) - - self._update_state(self.END, ctxt.conversation_key) diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/inlinequeryhandler.py b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/inlinequeryhandler.py deleted file mode 100644 index 3e7b7c4..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/inlinequeryhandler.py +++ /dev/null @@ -1,139 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the InlineQueryHandler class.""" -import re -from re import Match, Pattern -from typing import TYPE_CHECKING, Any, Optional, TypeVar, Union, cast - -from telegram import Update -from telegram._utils.defaultvalue import DEFAULT_TRUE -from telegram._utils.types import DVType -from telegram.ext._handlers.basehandler import BaseHandler -from telegram.ext._utils.types import CCT, HandlerCallback - -if TYPE_CHECKING: - from telegram.ext import Application - -RT = TypeVar("RT") - - -class InlineQueryHandler(BaseHandler[Update, CCT, RT]): - """ - BaseHandler class to handle Telegram updates that contain a - :attr:`telegram.Update.inline_query`. - Optionally based on a regex. Read the documentation of the :mod:`re` module for more - information. - - Warning: - * When setting :paramref:`block` to :obj:`False`, you cannot rely on adding custom - attributes to :class:`telegram.ext.CallbackContext`. See its docs for more info. - * :attr:`telegram.InlineQuery.chat_type` will not be set for inline queries from secret - chats and may not be set for inline queries coming from third-party clients. These - updates won't be handled, if :attr:`chat_types` is passed. - - Examples: - :any:`Inline Bot <examples.inlinebot>` - - - Args: - callback (:term:`coroutine function`): The callback function for this handler. Will be - called when :meth:`check_update` has determined that an update should be processed by - this handler. Callback signature:: - - async def callback(update: Update, context: CallbackContext) - - The return value of the callback is usually ignored except for the special case of - :class:`telegram.ext.ConversationHandler`. - pattern (:obj:`str` | :func:`re.Pattern <re.compile>`, optional): Regex pattern. - If not :obj:`None`, :func:`re.match` is used on :attr:`telegram.InlineQuery.query` - to determine if an update should be handled by this handler. - block (:obj:`bool`, optional): Determines whether the return value of the callback should - be awaited before processing the next handler in - :meth:`telegram.ext.Application.process_update`. Defaults to :obj:`True`. - - .. seealso:: :wiki:`Concurrency` - chat_types (list[:obj:`str`], optional): List of allowed chat types. If passed, will only - handle inline queries with the appropriate :attr:`telegram.InlineQuery.chat_type`. - - .. versionadded:: 13.5 - Attributes: - callback (:term:`coroutine function`): The callback function for this handler. - pattern (:obj:`str` | :func:`re.Pattern <re.compile>`): Optional. Regex pattern to test - :attr:`telegram.InlineQuery.query` against. - chat_types (list[:obj:`str`]): Optional. List of allowed chat types. - - .. versionadded:: 13.5 - block (:obj:`bool`): Determines whether the return value of the callback should be - awaited before processing the next handler in - :meth:`telegram.ext.Application.process_update`. - - """ - - __slots__ = ("chat_types", "pattern") - - def __init__( - self: "InlineQueryHandler[CCT, RT]", - callback: HandlerCallback[Update, CCT, RT], - pattern: Optional[Union[str, Pattern[str]]] = None, - block: DVType[bool] = DEFAULT_TRUE, - chat_types: Optional[list[str]] = None, - ): - super().__init__(callback, block=block) - - if isinstance(pattern, str): - pattern = re.compile(pattern) - - self.pattern: Optional[Union[str, Pattern[str]]] = pattern - self.chat_types: Optional[list[str]] = chat_types - - def check_update(self, update: object) -> Optional[Union[bool, Match[str]]]: - """ - Determines whether an update should be passed to this handler's :attr:`callback`. - - Args: - update (:class:`telegram.Update` | :obj:`object`): Incoming update. - - Returns: - :obj:`bool` | :obj:`re.match` - - """ - if isinstance(update, Update) and update.inline_query: - if (self.chat_types is not None) and ( - update.inline_query.chat_type not in self.chat_types - ): - return False - if self.pattern and (match := re.match(self.pattern, update.inline_query.query)): - return match - if not self.pattern: - return True - return None - - def collect_additional_context( - self, - context: CCT, - update: Update, # noqa: ARG002 - application: "Application[Any, CCT, Any, Any, Any, Any]", # noqa: ARG002 - check_result: Optional[Union[bool, Match[str]]], - ) -> None: - """Add the result of ``re.match(pattern, update.inline_query.query)`` to - :attr:`CallbackContext.matches` as list with one element. - """ - if self.pattern: - check_result = cast("Match", check_result) - context.matches = [check_result] diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/messagehandler.py b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/messagehandler.py deleted file mode 100644 index 625531a..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/messagehandler.py +++ /dev/null @@ -1,111 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the MessageHandler class.""" -from typing import TYPE_CHECKING, Any, Optional, TypeVar, Union - -from telegram import Update -from telegram._utils.defaultvalue import DEFAULT_TRUE -from telegram._utils.types import DVType -from telegram.ext import filters as filters_module -from telegram.ext._handlers.basehandler import BaseHandler -from telegram.ext._utils.types import CCT, HandlerCallback - -if TYPE_CHECKING: - from telegram.ext import Application - -RT = TypeVar("RT") - - -class MessageHandler(BaseHandler[Update, CCT, RT]): - """Handler class to handle Telegram messages. They might contain text, media or status - updates. - - Warning: - When setting :paramref:`block` to :obj:`False`, you cannot rely on adding custom - attributes to :class:`telegram.ext.CallbackContext`. See its docs for more info. - - Args: - filters (:class:`telegram.ext.filters.BaseFilter`): A filter inheriting from - :class:`telegram.ext.filters.BaseFilter`. Standard filters can be found in - :mod:`telegram.ext.filters`. Filters can be combined using bitwise - operators (& for and, | for or, ~ for not). Passing :obj:`None` is a shortcut - to passing :class:`telegram.ext.filters.ALL`. - - .. seealso:: :wiki:`Advanced Filters <Extensions---Advanced-Filters>` - callback (:term:`coroutine function`): The callback function for this handler. Will be - called when :meth:`check_update` has determined that an update should be processed by - this handler. Callback signature:: - - async def callback(update: Update, context: CallbackContext) - - The return value of the callback is usually ignored except for the special case of - :class:`telegram.ext.ConversationHandler`. - block (:obj:`bool`, optional): Determines whether the return value of the callback should - be awaited before processing the next handler in - :meth:`telegram.ext.Application.process_update`. Defaults to :obj:`True`. - - .. seealso:: :wiki:`Concurrency` - - Attributes: - filters (:class:`telegram.ext.filters.BaseFilter`): Only allow updates with these Filters. - See :mod:`telegram.ext.filters` for a full list of all available filters. - callback (:term:`coroutine function`): The callback function for this handler. - block (:obj:`bool`): Determines whether the return value of the callback should be - awaited before processing the next handler in - :meth:`telegram.ext.Application.process_update`. - - """ - - __slots__ = ("filters",) - - def __init__( - self: "MessageHandler[CCT, RT]", - filters: Optional[filters_module.BaseFilter], - callback: HandlerCallback[Update, CCT, RT], - block: DVType[bool] = DEFAULT_TRUE, - ): - super().__init__(callback, block=block) - self.filters: filters_module.BaseFilter = ( - filters if filters is not None else filters_module.ALL - ) - - def check_update(self, update: object) -> Optional[Union[bool, dict[str, list[Any]]]]: - """Determines whether an update should be passed to this handler's :attr:`callback`. - - Args: - update (:class:`telegram.Update` | :obj:`object`): Incoming update. - - Returns: - :obj:`bool` - - """ - if isinstance(update, Update): - return self.filters.check_update(update) or False - return None - - def collect_additional_context( - self, - context: CCT, - update: Update, # noqa: ARG002 - application: "Application[Any, CCT, Any, Any, Any, Any]", # noqa: ARG002 - check_result: Optional[Union[bool, dict[str, object]]], - ) -> None: - """Adds possible output of data filters to the :class:`CallbackContext`.""" - if isinstance(check_result, dict): - context.update(check_result) diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/messagereactionhandler.py b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/messagereactionhandler.py deleted file mode 100644 index 15f4f3d..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/messagereactionhandler.py +++ /dev/null @@ -1,180 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the MessageReactionHandler class.""" - -from typing import Final, Optional - -from telegram import Update -from telegram._utils.defaultvalue import DEFAULT_TRUE -from telegram._utils.types import RT, SCT, DVType -from telegram.ext._handlers.basehandler import BaseHandler -from telegram.ext._utils._update_parsing import parse_chat_id, parse_username -from telegram.ext._utils.types import CCT, HandlerCallback - - -class MessageReactionHandler(BaseHandler[Update, CCT, RT]): - """Handler class to handle Telegram updates that contain a message reaction. - - Note: - The following rules apply to both ``username`` and the ``chat_id`` param groups, - respectively: - - * If none of them are passed, the handler does not filter the update for that specific - attribute. - * If a chat ID **or** a username is passed, the updates will be filtered with that - specific attribute. - * If a chat ID **and** a username are passed, an update containing **any** of them will be - filtered. - * :attr:`telegram.MessageReactionUpdated.actor_chat` is *not* considered for - :paramref:`user_id` and :paramref:`user_username` filtering. - - Warning: - When setting :paramref:`block` to :obj:`False`, you cannot rely on adding custom - attributes to :class:`telegram.ext.CallbackContext`. See its docs for more info. - - .. versionadded:: 20.8 - - Args: - callback (:term:`coroutine function`): The callback function for this handler. Will be - called when :meth:`check_update` has determined that an update should be processed by - this handler. Callback signature:: - - async def callback(update: Update, context: CallbackContext) - - The return value of the callback is usually ignored except for the special case of - :class:`telegram.ext.ConversationHandler`. - message_reaction_types (:obj:`int`, optional): Pass one of - :attr:`MESSAGE_REACTION_UPDATED`, :attr:`MESSAGE_REACTION_COUNT_UPDATED` or - :attr:`MESSAGE_REACTION` to specify if this handler should handle only updates with - :attr:`telegram.Update.message_reaction`, - :attr:`telegram.Update.message_reaction_count` or both. Defaults to - :attr:`MESSAGE_REACTION`. - chat_id (:obj:`int` | Collection[:obj:`int`], optional): Filters reactions to allow - only those which happen in the specified chat ID(s). - chat_username (:obj:`str` | Collection[:obj:`str`], optional): Filters reactions to allow - only those which happen in the specified username(s). - user_id (:obj:`int` | Collection[:obj:`int`], optional): Filters reactions to allow - only those which are set by the specified chat ID(s) (this can be the chat itself in - the case of anonymous users, see the - :paramref:`telegram.MessageReactionUpdated.actor_chat`). - user_username (:obj:`str` | Collection[:obj:`str`], optional): Filters reactions to allow - only those which are set by the specified username(s) (this can be the chat itself in - the case of anonymous users, see the - :paramref:`telegram.MessageReactionUpdated.actor_chat`). - block (:obj:`bool`, optional): Determines whether the return value of the callback should - be awaited before processing the next handler in - :meth:`telegram.ext.Application.process_update`. Defaults to :obj:`True`. - - .. seealso:: :wiki:`Concurrency` - - Attributes: - callback (:term:`coroutine function`): The callback function for this handler. - message_reaction_types (:obj:`int`): Optional. Specifies if this handler should handle only - updates with :attr:`telegram.Update.message_reaction`, - :attr:`telegram.Update.message_reaction_count` or both. - block (:obj:`bool`): Determines whether the callback will run in a blocking way. - - """ - - __slots__ = ( - "_chat_ids", - "_chat_usernames", - "_user_ids", - "_user_usernames", - "message_reaction_types", - ) - - MESSAGE_REACTION_UPDATED: Final[int] = -1 - """:obj:`int`: Used as a constant to handle only :attr:`telegram.Update.message_reaction`.""" - MESSAGE_REACTION_COUNT_UPDATED: Final[int] = 0 - """:obj:`int`: Used as a constant to handle only - :attr:`telegram.Update.message_reaction_count`.""" - MESSAGE_REACTION: Final[int] = 1 - """:obj:`int`: Used as a constant to handle both :attr:`telegram.Update.message_reaction` - and :attr:`telegram.Update.message_reaction_count`.""" - - def __init__( - self: "MessageReactionHandler[CCT, RT]", - callback: HandlerCallback[Update, CCT, RT], - chat_id: Optional[SCT[int]] = None, - chat_username: Optional[SCT[str]] = None, - user_id: Optional[SCT[int]] = None, - user_username: Optional[SCT[str]] = None, - message_reaction_types: int = MESSAGE_REACTION, - block: DVType[bool] = DEFAULT_TRUE, - ): - super().__init__(callback, block=block) - self.message_reaction_types: int = message_reaction_types - - self._chat_ids = parse_chat_id(chat_id) - self._chat_usernames = parse_username(chat_username) - if (user_id or user_username) and message_reaction_types in ( - self.MESSAGE_REACTION, - self.MESSAGE_REACTION_COUNT_UPDATED, - ): - raise ValueError( - "You can not filter for users and include anonymous reactions. Set " - "`message_reaction_types` to MESSAGE_REACTION_UPDATED." - ) - self._user_ids = parse_chat_id(user_id) - self._user_usernames = parse_username(user_username) - - def check_update(self, update: object) -> bool: - """Determines whether an update should be passed to this handler's :attr:`callback`. - - Args: - update (:class:`telegram.Update` | :obj:`object`): Incoming update. - - Returns: - :obj:`bool` - - """ - if not isinstance(update, Update): - return False - - if not (update.message_reaction or update.message_reaction_count): - return False - - if ( - self.message_reaction_types == self.MESSAGE_REACTION_UPDATED - and update.message_reaction_count - ): - return False - - if ( - self.message_reaction_types == self.MESSAGE_REACTION_COUNT_UPDATED - and update.message_reaction - ): - return False - - if not any((self._chat_ids, self._chat_usernames, self._user_ids, self._user_usernames)): - return True - - # Extract chat and user IDs and usernames from the update for comparison - chat_id = chat.id if (chat := update.effective_chat) else None - chat_username = chat.username if chat else None - user_id = user.id if (user := update.effective_user) else None - user_username = user.username if user else None - - return ( - bool(self._chat_ids and (chat_id in self._chat_ids)) - or bool(self._chat_usernames and (chat_username in self._chat_usernames)) - or bool(self._user_ids and (user_id in self._user_ids)) - or bool(self._user_usernames and (user_username in self._user_usernames)) - ) diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/paidmediapurchasedhandler.py b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/paidmediapurchasedhandler.py deleted file mode 100644 index 2f273e9..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/paidmediapurchasedhandler.py +++ /dev/null @@ -1,95 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the PaidMediaPurchased class.""" - -from typing import Optional - -from telegram import Update -from telegram._utils.defaultvalue import DEFAULT_TRUE -from telegram._utils.types import SCT, DVType -from telegram.ext._handlers.basehandler import BaseHandler -from telegram.ext._utils._update_parsing import parse_chat_id, parse_username -from telegram.ext._utils.types import CCT, RT, HandlerCallback - - -class PaidMediaPurchasedHandler(BaseHandler[Update, CCT, RT]): - """Handler class to handle Telegram - :attr:`purchased paid media <telegram.Update.purchased_paid_media>`. - - .. versionadded:: 21.6 - - Args: - callback (:term:`coroutine function`): The callback function for this handler. Will be - called when :meth:`check_update` has determined that an update should be processed by - this handler. Callback signature:: - - async def callback(update: Update, context: CallbackContext) - user_id (:obj:`int` | Collection[:obj:`int`], optional): Filters requests to allow only - those which are from the specified user ID(s). - - username (:obj:`str` | Collection[:obj:`str`], optional): Filters requests to allow only - those which are from the specified username(s). - - block (:obj:`bool`, optional): Determines whether the return value of the callback should - be awaited before processing the next handler in - :meth:`telegram.ext.Application.process_update`. Defaults to :obj:`True`. - - .. seealso:: :wiki:`Concurrency` - Attributes: - callback (:term:`coroutine function`): The callback function for this handler. - block (:obj:`bool`): Determines whether the return value of the callback should be - awaited before processing the next handler in - :meth:`telegram.ext.Application.process_update`. - """ - - __slots__ = ( - "_user_ids", - "_usernames", - ) - - def __init__( - self: "PaidMediaPurchasedHandler[CCT, RT]", - callback: HandlerCallback[Update, CCT, RT], - user_id: Optional[SCT[int]] = None, - username: Optional[SCT[str]] = None, - block: DVType[bool] = DEFAULT_TRUE, - ): - super().__init__(callback, block=block) - - self._user_ids = parse_chat_id(user_id) - self._usernames = parse_username(username) - - def check_update(self, update: object) -> bool: - """Determines whether an update should be passed to this handler's :attr:`callback`. - - Args: - update (:class:`telegram.Update` | :obj:`object`): Incoming update. - - Returns: - :obj:`bool` - - """ - if not isinstance(update, Update) or not update.purchased_paid_media: - return False - - if not self._user_ids and not self._usernames: - return True - if update.purchased_paid_media.from_user.id in self._user_ids: - return True - return update.purchased_paid_media.from_user.username in self._usernames diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/pollanswerhandler.py b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/pollanswerhandler.py deleted file mode 100644 index 69f1893..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/pollanswerhandler.py +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the PollAnswerHandler class.""" - - -from telegram import Update -from telegram.ext._handlers.basehandler import BaseHandler -from telegram.ext._utils.types import CCT, RT - - -class PollAnswerHandler(BaseHandler[Update, CCT, RT]): - """Handler class to handle Telegram updates that contain a - :attr:`poll answer <telegram.Update.poll_answer>`. - - Warning: - When setting :paramref:`block` to :obj:`False`, you cannot rely on adding custom - attributes to :class:`telegram.ext.CallbackContext`. See its docs for more info. - - Examples: - :any:`Poll Bot <examples.pollbot>` - - Args: - callback (:term:`coroutine function`): The callback function for this handler. Will be - called when :meth:`check_update` has determined that an update should be processed by - this handler. Callback signature:: - - async def callback(update: Update, context: CallbackContext) - - The return value of the callback is usually ignored except for the special case of - :class:`telegram.ext.ConversationHandler`. - block (:obj:`bool`, optional): Determines whether the return value of the callback should - be awaited before processing the next handler in - :meth:`telegram.ext.Application.process_update`. Defaults to :obj:`True`. - - .. seealso:: :wiki:`Concurrency` - - Attributes: - callback (:term:`coroutine function`): The callback function for this handler. - block (:obj:`bool`): Determines whether the callback will run in a blocking way.. - - """ - - __slots__ = () - - def check_update(self, update: object) -> bool: - """Determines whether an update should be passed to this handler's :attr:`callback`. - - Args: - update (:class:`telegram.Update` | :obj:`object`): Incoming update. - - Returns: - :obj:`bool` - - """ - return isinstance(update, Update) and bool(update.poll_answer) diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/pollhandler.py b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/pollhandler.py deleted file mode 100644 index 36fc9bc..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/pollhandler.py +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the PollHandler class.""" - - -from telegram import Update -from telegram.ext._handlers.basehandler import BaseHandler -from telegram.ext._utils.types import CCT, RT - - -class PollHandler(BaseHandler[Update, CCT, RT]): - """Handler class to handle Telegram updates that contain a - :attr:`poll <telegram.Update.poll>`. - - Warning: - When setting :paramref:`block` to :obj:`False`, you cannot rely on adding custom - attributes to :class:`telegram.ext.CallbackContext`. See its docs for more info. - - Examples: - :any:`Poll Bot <examples.pollbot>` - - Args: - callback (:term:`coroutine function`): The callback function for this handler. Will be - called when :meth:`check_update` has determined that an update should be processed by - this handler. Callback signature:: - - async def callback(update: Update, context: CallbackContext) - - The return value of the callback is usually ignored except for the special case of - :class:`telegram.ext.ConversationHandler`. - block (:obj:`bool`, optional): Determines whether the return value of the callback should - be awaited before processing the next handler in - :meth:`telegram.ext.Application.process_update`. Defaults to :obj:`True`. - - .. seealso:: :wiki:`Concurrency` - - Attributes: - callback (:term:`coroutine function`): The callback function for this handler. - block (:obj:`bool`): Determines whether the callback will run in a blocking way.. - - """ - - __slots__ = () - - def check_update(self, update: object) -> bool: - """Determines whether an update should be passed to this handler's :attr:`callback`. - - Args: - update (:class:`telegram.Update` | :obj:`object`): Incoming update. - - Returns: - :obj:`bool` - - """ - return isinstance(update, Update) and bool(update.poll) diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/precheckoutqueryhandler.py b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/precheckoutqueryhandler.py deleted file mode 100644 index 04bf395..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/precheckoutqueryhandler.py +++ /dev/null @@ -1,103 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the PreCheckoutQueryHandler class.""" - - -import re -from re import Pattern -from typing import Optional, TypeVar, Union - -from telegram import Update -from telegram._utils.defaultvalue import DEFAULT_TRUE -from telegram._utils.types import DVType -from telegram.ext._handlers.basehandler import BaseHandler -from telegram.ext._utils.types import CCT, HandlerCallback - -RT = TypeVar("RT") - - -class PreCheckoutQueryHandler(BaseHandler[Update, CCT, RT]): - """Handler class to handle Telegram :attr:`telegram.Update.pre_checkout_query`. - - Warning: - When setting :paramref:`block` to :obj:`False`, you cannot rely on adding custom - attributes to :class:`telegram.ext.CallbackContext`. See its docs for more info. - - Examples: - :any:`Payment Bot <examples.paymentbot>` - - Args: - callback (:term:`coroutine function`): The callback function for this handler. Will be - called when :meth:`check_update` has determined that an update should be processed by - this handler. Callback signature:: - - async def callback(update: Update, context: CallbackContext) - - The return value of the callback is usually ignored except for the special case of - :class:`telegram.ext.ConversationHandler`. - block (:obj:`bool`, optional): Determines whether the return value of the callback should - be awaited before processing the next handler in - :meth:`telegram.ext.Application.process_update`. Defaults to :obj:`True`. - - .. seealso:: :wiki:`Concurrency` - pattern (:obj:`str` | :func:`re.Pattern <re.compile>`, optional): Optional. Regex pattern - to test :attr:`telegram.PreCheckoutQuery.invoice_payload` against. - - .. versionadded:: 20.8 - - Attributes: - callback (:term:`coroutine function`): The callback function for this handler. - block (:obj:`bool`): Determines whether the callback will run in a blocking way.. - pattern (:obj:`str` | :func:`re.Pattern <re.compile>`, optional): Optional. Regex pattern - to test :attr:`telegram.PreCheckoutQuery.invoice_payload` against. - - .. versionadded:: 20.8 - - """ - - __slots__ = ("pattern",) - - def __init__( - self: "PreCheckoutQueryHandler[CCT, RT]", - callback: HandlerCallback[Update, CCT, RT], - block: DVType[bool] = DEFAULT_TRUE, - pattern: Optional[Union[str, Pattern[str]]] = None, - ): - super().__init__(callback, block=block) - - self.pattern: Optional[Pattern[str]] = re.compile(pattern) if pattern is not None else None - - def check_update(self, update: object) -> bool: - """Determines whether an update should be passed to this handler's :attr:`callback`. - - Args: - update (:class:`telegram.Update` | :obj:`object`): Incoming update. - - Returns: - :obj:`bool` - - """ - if isinstance(update, Update) and update.pre_checkout_query: - invoice_payload = update.pre_checkout_query.invoice_payload - if self.pattern: - if self.pattern.match(invoice_payload): - return True - else: - return True - return False diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/prefixhandler.py b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/prefixhandler.py deleted file mode 100644 index a6e4f38..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/prefixhandler.py +++ /dev/null @@ -1,184 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the PrefixHandler class.""" -import itertools -from typing import TYPE_CHECKING, Any, Optional, TypeVar, Union - -from telegram import Update -from telegram._utils.defaultvalue import DEFAULT_TRUE -from telegram._utils.types import SCT, DVType -from telegram.ext import filters as filters_module -from telegram.ext._handlers.basehandler import BaseHandler -from telegram.ext._utils.types import CCT, HandlerCallback - -if TYPE_CHECKING: - from telegram.ext import Application - -RT = TypeVar("RT") - - -class PrefixHandler(BaseHandler[Update, CCT, RT]): - """Handler class to handle custom prefix commands. - - This is an intermediate handler between :class:`MessageHandler` and :class:`CommandHandler`. - It supports configurable commands with the same options as :class:`CommandHandler`. It will - respond to every combination of :paramref:`prefix` and :paramref:`command`. - It will add a :obj:`list` to the :class:`CallbackContext` named :attr:`CallbackContext.args`, - containing a list of strings, which is the text following the command split on single or - consecutive whitespace characters. - - Examples: - - Single prefix and command: - - .. code:: python - - PrefixHandler("!", "test", callback) # will respond to '!test'. - - Multiple prefixes, single command: - - .. code:: python - - PrefixHandler(["!", "#"], "test", callback) # will respond to '!test' and '#test'. - - Multiple prefixes and commands: - - .. code:: python - - PrefixHandler( - ["!", "#"], ["test", "help"], callback - ) # will respond to '!test', '#test', '!help' and '#help'. - - - By default, the handler listens to messages as well as edited messages. To change this behavior - use :attr:`~filters.UpdateType.EDITED_MESSAGE <telegram.ext.filters.UpdateType.EDITED_MESSAGE>` - - Note: - * :class:`PrefixHandler` does *not* handle (edited) channel posts. - - Warning: - When setting :paramref:`block` to :obj:`False`, you cannot rely on adding custom - attributes to :class:`telegram.ext.CallbackContext`. See its docs for more info. - - .. versionchanged:: 20.0 - - * :class:`PrefixHandler` is no longer a subclass of :class:`CommandHandler`. - * Removed the attributes ``command`` and ``prefix``. Instead, the new :attr:`commands` - contains all commands that this handler listens to as a :class:`frozenset`, which - includes the prefixes. - * Updating the prefixes and commands this handler listens to is no longer possible. - - Args: - prefix (:obj:`str` | Collection[:obj:`str`]): - The prefix(es) that will precede :paramref:`command`. - command (:obj:`str` | Collection[:obj:`str`]): - The command or list of commands this handler should listen for. Case-insensitive. - callback (:term:`coroutine function`): The callback function for this handler. Will be - called when :meth:`check_update` has determined that an update should be processed by - this handler. Callback signature:: - - async def callback(update: Update, context: CallbackContext) - - The return value of the callback is usually ignored except for the special case of - :class:`telegram.ext.ConversationHandler`. - filters (:class:`telegram.ext.filters.BaseFilter`, optional): A filter inheriting from - :class:`telegram.ext.filters.BaseFilter`. Standard filters can be found in - :mod:`telegram.ext.filters`. Filters can be combined using bitwise - operators (``&`` for :keyword:`and`, ``|`` for :keyword:`or`, ``~`` for :keyword:`not`) - block (:obj:`bool`, optional): Determines whether the return value of the callback should - be awaited before processing the next handler in - :meth:`telegram.ext.Application.process_update`. Defaults to :obj:`True`. - - .. seealso:: :wiki:`Concurrency` - - Attributes: - commands (frozenset[:obj:`str`]): The commands that this handler will listen for, i.e. the - combinations of :paramref:`prefix` and :paramref:`command`. - callback (:term:`coroutine function`): The callback function for this handler. - filters (:class:`telegram.ext.filters.BaseFilter`): Optional. Only allow updates with these - Filters. - block (:obj:`bool`): Determines whether the return value of the callback should be - awaited before processing the next handler in - :meth:`telegram.ext.Application.process_update`. - - """ - - # 'prefix' is a class property, & 'command' is included in the superclass, so they're left out. - __slots__ = ("commands", "filters") - - def __init__( - self: "PrefixHandler[CCT, RT]", - prefix: SCT[str], - command: SCT[str], - callback: HandlerCallback[Update, CCT, RT], - filters: Optional[filters_module.BaseFilter] = None, - block: DVType[bool] = DEFAULT_TRUE, - ): - super().__init__(callback=callback, block=block) - - prefixes = {prefix.lower()} if isinstance(prefix, str) else {x.lower() for x in prefix} - - commands = {command.lower()} if isinstance(command, str) else {x.lower() for x in command} - - self.commands: frozenset[str] = frozenset( - p + c for p, c in itertools.product(prefixes, commands) - ) - self.filters: filters_module.BaseFilter = ( - filters if filters is not None else filters_module.UpdateType.MESSAGES - ) - - def check_update( - self, update: object - ) -> Optional[Union[bool, tuple[list[str], Optional[Union[bool, dict[Any, Any]]]]]]: - """Determines whether an update should be passed to this handler's :attr:`callback`. - - Args: - update (:class:`telegram.Update` | :obj:`object`): Incoming update. - - Returns: - :obj:`list`: The list of args for the handler. - - """ - if isinstance(update, Update) and update.effective_message: - message = update.effective_message - - if message.text: - text_list = message.text.split() - if text_list[0].lower() not in self.commands: - return None - filter_result = self.filters.check_update(update) - if filter_result: - return text_list[1:], filter_result - return False - return None - - def collect_additional_context( - self, - context: CCT, - update: Update, # noqa: ARG002 - application: "Application[Any, CCT, Any, Any, Any, Any]", # noqa: ARG002 - check_result: Optional[Union[bool, tuple[list[str], Optional[bool]]]], - ) -> None: - """Add text after the command to :attr:`CallbackContext.args` as list, split on single - whitespaces and add output of data filters to :attr:`CallbackContext` as well. - """ - if isinstance(check_result, tuple): - context.args = check_result[0] - if isinstance(check_result[1], dict): - context.update(check_result[1]) diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/shippingqueryhandler.py b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/shippingqueryhandler.py deleted file mode 100644 index 1795a93..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/shippingqueryhandler.py +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the ShippingQueryHandler class.""" - - -from telegram import Update -from telegram.ext._handlers.basehandler import BaseHandler -from telegram.ext._utils.types import CCT, RT - - -class ShippingQueryHandler(BaseHandler[Update, CCT, RT]): - """Handler class to handle Telegram :attr:`telegram.Update.shipping_query`. - - Warning: - When setting :paramref:`block` to :obj:`False`, you cannot rely on adding custom - attributes to :class:`telegram.ext.CallbackContext`. See its docs for more info. - - Examples: - :any:`Payment Bot <examples.paymentbot>` - - Args: - callback (:term:`coroutine function`): The callback function for this handler. Will be - called when :meth:`check_update` has determined that an update should be processed by - this handler. Callback signature:: - - async def callback(update: Update, context: CallbackContext) - - The return value of the callback is usually ignored except for the special case of - :class:`telegram.ext.ConversationHandler`. - block (:obj:`bool`, optional): Determines whether the return value of the callback should - be awaited before processing the next handler in - :meth:`telegram.ext.Application.process_update`. Defaults to :obj:`True`. - - .. seealso:: :wiki:`Concurrency` - - Attributes: - callback (:term:`coroutine function`): The callback function for this handler. - block (:obj:`bool`): Determines whether the callback will run in a blocking way.. - - """ - - __slots__ = () - - def check_update(self, update: object) -> bool: - """Determines whether an update should be passed to this handler's :attr:`callback`. - - Args: - update (:class:`telegram.Update` | :obj:`object`): Incoming update. - - Returns: - :obj:`bool` - - """ - return isinstance(update, Update) and bool(update.shipping_query) diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/stringcommandhandler.py b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/stringcommandhandler.py deleted file mode 100644 index 4ce7a9b..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/stringcommandhandler.py +++ /dev/null @@ -1,108 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the StringCommandHandler class.""" - -from typing import TYPE_CHECKING, Any, Optional - -from telegram._utils.defaultvalue import DEFAULT_TRUE -from telegram._utils.types import DVType -from telegram.ext._handlers.basehandler import BaseHandler -from telegram.ext._utils.types import CCT, RT, HandlerCallback - -if TYPE_CHECKING: - from telegram.ext import Application - - -class StringCommandHandler(BaseHandler[str, CCT, RT]): - """Handler class to handle string commands. Commands are string updates that start with - ``/``. The handler will add a :obj:`list` to the - :class:`CallbackContext` named :attr:`CallbackContext.args`. It will contain a list of strings, - which is the text following the command split on single whitespace characters. - - Note: - This handler is not used to handle Telegram :class:`telegram.Update`, but strings manually - put in the queue. For example to send messages with the bot using command line or API. - - Warning: - When setting :paramref:`block` to :obj:`False`, you cannot rely on adding custom - attributes to :class:`telegram.ext.CallbackContext`. See its docs for more info. - - Args: - command (:obj:`str`): The command this handler should listen for. - callback (:term:`coroutine function`): The callback function for this handler. Will be - called when :meth:`check_update` has determined that an update should be processed by - this handler. Callback signature:: - - async def callback(update: str, context: CallbackContext) - - The return value of the callback is usually ignored except for the special case of - :class:`telegram.ext.ConversationHandler`. - block (:obj:`bool`, optional): Determines whether the return value of the callback should - be awaited before processing the next handler in - :meth:`telegram.ext.Application.process_update`. Defaults to :obj:`True`. - - .. seealso:: :wiki:`Concurrency` - - Attributes: - command (:obj:`str`): The command this handler should listen for. - callback (:term:`coroutine function`): The callback function for this handler. - block (:obj:`bool`): Determines whether the return value of the callback should be - awaited before processing the next handler in - :meth:`telegram.ext.Application.process_update`. - - """ - - __slots__ = ("command",) - - def __init__( - self: "StringCommandHandler[CCT, RT]", - command: str, - callback: HandlerCallback[str, CCT, RT], - block: DVType[bool] = DEFAULT_TRUE, - ): - super().__init__(callback, block=block) - self.command: str = command - - def check_update(self, update: object) -> Optional[list[str]]: - """Determines whether an update should be passed to this handler's :attr:`callback`. - - Args: - update (:obj:`object`): The incoming update. - - Returns: - list[:obj:`str`]: List containing the text command split on whitespace. - - """ - if isinstance(update, str) and update.startswith("/"): - args = update[1:].split(" ") - if args[0] == self.command: - return args[1:] - return None - - def collect_additional_context( - self, - context: CCT, - update: str, # noqa: ARG002 - application: "Application[Any, CCT, Any, Any, Any, Any]", # noqa: ARG002 - check_result: Optional[list[str]], - ) -> None: - """Add text after the command to :attr:`CallbackContext.args` as list, split on single - whitespaces. - """ - context.args = check_result diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/stringregexhandler.py b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/stringregexhandler.py deleted file mode 100644 index dda0052..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/stringregexhandler.py +++ /dev/null @@ -1,115 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the StringRegexHandler class.""" - -import re -from re import Match, Pattern -from typing import TYPE_CHECKING, Any, Optional, TypeVar, Union - -from telegram._utils.defaultvalue import DEFAULT_TRUE -from telegram._utils.types import DVType -from telegram.ext._handlers.basehandler import BaseHandler -from telegram.ext._utils.types import CCT, HandlerCallback - -if TYPE_CHECKING: - from telegram.ext import Application - -RT = TypeVar("RT") - - -class StringRegexHandler(BaseHandler[str, CCT, RT]): - """Handler class to handle string updates based on a regex which checks the update content. - - Read the documentation of the :mod:`re` module for more information. The :func:`re.match` - function is used to determine if an update should be handled by this handler. - - Note: - This handler is not used to handle Telegram :class:`telegram.Update`, but strings manually - put in the queue. For example to send messages with the bot using command line or API. - - Warning: - When setting :paramref:`block` to :obj:`False`, you cannot rely on adding custom - attributes to :class:`telegram.ext.CallbackContext`. See its docs for more info. - - Args: - pattern (:obj:`str` | :func:`re.Pattern <re.compile>`): The regex pattern. - callback (:term:`coroutine function`): The callback function for this handler. Will be - called when :meth:`check_update` has determined that an update should be processed by - this handler. Callback signature:: - - async def callback(update: str, context: CallbackContext) - - The return value of the callback is usually ignored except for the special case of - :class:`telegram.ext.ConversationHandler`. - block (:obj:`bool`, optional): Determines whether the return value of the callback should - be awaited before processing the next handler in - :meth:`telegram.ext.Application.process_update`. Defaults to :obj:`True`. - - .. seealso:: :wiki:`Concurrency` - - Attributes: - pattern (:obj:`str` | :func:`re.Pattern <re.compile>`): The regex pattern. - callback (:term:`coroutine function`): The callback function for this handler. - block (:obj:`bool`): Determines whether the return value of the callback should be - awaited before processing the next handler in - :meth:`telegram.ext.Application.process_update`. - - """ - - __slots__ = ("pattern",) - - def __init__( - self: "StringRegexHandler[CCT, RT]", - pattern: Union[str, Pattern[str]], - callback: HandlerCallback[str, CCT, RT], - block: DVType[bool] = DEFAULT_TRUE, - ): - super().__init__(callback, block=block) - - if isinstance(pattern, str): - pattern = re.compile(pattern) - - self.pattern: Union[str, Pattern[str]] = pattern - - def check_update(self, update: object) -> Optional[Match[str]]: - """Determines whether an update should be passed to this handler's :attr:`callback`. - - Args: - update (:obj:`object`): The incoming update. - - Returns: - :obj:`None` | :obj:`re.match` - - """ - if isinstance(update, str) and (match := re.match(self.pattern, update)): - return match - return None - - def collect_additional_context( - self, - context: CCT, - update: str, # noqa: ARG002 - application: "Application[Any, CCT, Any, Any, Any, Any]", # noqa: ARG002 - check_result: Optional[Match[str]], - ) -> None: - """Add the result of ``re.match(pattern, update)`` to :attr:`CallbackContext.matches` as - list with one element. - """ - if self.pattern and check_result: - context.matches = [check_result] diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/typehandler.py b/venv/lib/python3.12/site-packages/telegram/ext/_handlers/typehandler.py deleted file mode 100644 index 0d6ce78..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_handlers/typehandler.py +++ /dev/null @@ -1,98 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the TypeHandler class.""" - -from typing import Optional, TypeVar - -from telegram._utils.defaultvalue import DEFAULT_TRUE -from telegram._utils.types import DVType -from telegram.ext._handlers.basehandler import BaseHandler -from telegram.ext._utils.types import CCT, HandlerCallback - -RT = TypeVar("RT") -UT = TypeVar("UT") -# If this is written directly next to the type variable mypy gets confused with [valid-type]. This -# could be reported to them, but I doubt they would change this since we override a builtin type -GenericUT = type[UT] - - -class TypeHandler(BaseHandler[UT, CCT, RT]): - """Handler class to handle updates of custom types. - - Warning: - When setting :paramref:`block` to :obj:`False`, you cannot rely on adding custom - attributes to :class:`telegram.ext.CallbackContext`. See its docs for more info. - - Args: - type (:external:class:`type`): The :external:class:`type` of updates this handler should - process, as determined by :obj:`isinstance` - callback (:term:`coroutine function`): The callback function for this handler. Will be - called when :meth:`check_update` has determined that an update should be processed by - this handler. Callback signature:: - - async def callback(update: object, context: CallbackContext) - - The return value of the callback is usually ignored except for the special case of - :class:`telegram.ext.ConversationHandler`. - strict (:obj:`bool`, optional): Use ``type`` instead of :obj:`isinstance`. - Default is :obj:`False`. - block (:obj:`bool`, optional): Determines whether the return value of the callback should - be awaited before processing the next handler in - :meth:`telegram.ext.Application.process_update`. Defaults to :obj:`True`. - - .. seealso:: :wiki:`Concurrency` - - Attributes: - type (:external:class:`type`): The :external:class:`type` of updates this handler should - process. - callback (:term:`coroutine function`): The callback function for this handler. - strict (:obj:`bool`): Use :external:class:`type` instead of :obj:`isinstance`. Default is - :obj:`False`. - block (:obj:`bool`): Determines whether the return value of the callback should be - awaited before processing the next handler in - :meth:`telegram.ext.Application.process_update`. - - """ - - __slots__ = ("strict", "type") - - def __init__( - self: "TypeHandler[UT, CCT, RT]", - type: GenericUT[UT], # pylint: disable=redefined-builtin - callback: HandlerCallback[UT, CCT, RT], - strict: bool = False, - block: DVType[bool] = DEFAULT_TRUE, - ): - super().__init__(callback, block=block) - self.type: GenericUT[UT] = type - self.strict: Optional[bool] = strict - - def check_update(self, update: object) -> bool: - """Determines whether an update should be passed to this handler's :attr:`callback`. - - Args: - update (:obj:`object`): Incoming update. - - Returns: - :obj:`bool` - - """ - if not self.strict: - return isinstance(update, self.type) - return type(update) is self.type # pylint: disable=unidiomatic-typecheck diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_jobqueue.py b/venv/lib/python3.12/site-packages/telegram/ext/_jobqueue.py deleted file mode 100644 index 70c6405..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_jobqueue.py +++ /dev/null @@ -1,1013 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the classes JobQueue and Job.""" -import asyncio -import datetime as dtm -import re -import weakref -from typing import TYPE_CHECKING, Any, Generic, Optional, Union, cast, overload - -try: - from apscheduler.executors.asyncio import AsyncIOExecutor - from apscheduler.schedulers.asyncio import AsyncIOScheduler - - APS_AVAILABLE = True -except ImportError: - APS_AVAILABLE = False - -from telegram._utils.datetime import UTC, localize -from telegram._utils.logging import get_logger -from telegram._utils.repr import build_repr_with_selected_attrs -from telegram._utils.types import JSONDict -from telegram.ext._extbot import ExtBot -from telegram.ext._utils.types import CCT, JobCallback - -if TYPE_CHECKING: - from collections.abc import Iterable - - if APS_AVAILABLE: - from apscheduler.job import Job as APSJob - - from telegram.ext import Application - - -_ALL_DAYS = tuple(range(7)) -_LOGGER = get_logger(__name__, class_name="JobQueue") - - -class JobQueue(Generic[CCT]): - """This class allows you to periodically perform tasks with the bot. It is a convenience - wrapper for the APScheduler library. - - This class is a :class:`~typing.Generic` class and accepts one type variable that specifies - the type of the argument ``context`` of the job callbacks (:paramref:`~run_once.callback`) of - :meth:`run_once` and the other scheduling methods. - - Important: - If you want to use this class, you must install PTB with the optional requirement - ``job-queue``, i.e. - - .. code-block:: bash - - pip install "python-telegram-bot[job-queue]" - - Examples: - :any:`Timer Bot <examples.timerbot>` - - .. seealso:: :wiki:`Architecture Overview <Architecture>`, - :wiki:`Job Queue <Extensions---JobQueue>` - - .. versionchanged:: 20.0 - To use this class, PTB must be installed via - ``pip install "python-telegram-bot[job-queue]"``. - - Attributes: - scheduler (:class:`apscheduler.schedulers.asyncio.AsyncIOScheduler`): The scheduler. - - Warning: - This scheduler is configured by :meth:`set_application`. Additional configuration - settings can be made by users. However, calling - :meth:`~apscheduler.schedulers.base.BaseScheduler.configure` will delete any - previous configuration settings. Therefore, please make sure to pass the values - returned by :attr:`scheduler_configuration` to the method call in addition to your - custom values. - Alternatively, you can also use methods like - :meth:`~apscheduler.schedulers.base.BaseScheduler.add_jobstore` to avoid using - :meth:`~apscheduler.schedulers.base.BaseScheduler.configure` altogether. - - .. versionchanged:: 20.0 - Uses :class:`~apscheduler.schedulers.asyncio.AsyncIOScheduler` instead of - :class:`~apscheduler.schedulers.background.BackgroundScheduler` - - """ - - __slots__ = ("_application", "_executor", "scheduler") - _CRON_MAPPING = ("sun", "mon", "tue", "wed", "thu", "fri", "sat") - - def __init__(self) -> None: - if not APS_AVAILABLE: - raise RuntimeError( - "To use `JobQueue`, PTB must be installed via `pip install " - '"python-telegram-bot[job-queue]"`.' - ) - - self._application: Optional[weakref.ReferenceType[Application]] = None - self._executor = AsyncIOExecutor() - self.scheduler: "AsyncIOScheduler" = AsyncIOScheduler( # noqa: UP037 - **self.scheduler_configuration - ) - - def __repr__(self) -> str: - """Give a string representation of the JobQueue in the form ``JobQueue[application=...]``. - - As this class doesn't implement :meth:`object.__str__`, the default implementation - will be used, which is equivalent to :meth:`__repr__`. - - Returns: - :obj:`str` - """ - return build_repr_with_selected_attrs(self, application=self.application) - - @property - def application(self) -> "Application[Any, CCT, Any, Any, Any, JobQueue[CCT]]": - """The application this JobQueue is associated with.""" - if self._application is None: - raise RuntimeError("No application was set for this JobQueue.") - application = self._application() - if application is not None: - return application - raise RuntimeError("The application instance is no longer alive.") - - @property - def scheduler_configuration(self) -> JSONDict: - """Provides configuration values that are used by :class:`JobQueue` for :attr:`scheduler`. - - Tip: - Since calling - :meth:`scheduler.configure() <apscheduler.schedulers.base.BaseScheduler.configure>` - deletes any previous setting, please make sure to pass these values to the method call - in addition to your custom values: - - .. code-block:: python - - scheduler.configure(..., **job_queue.scheduler_configuration) - - Alternatively, you can also use methods like - :meth:`~apscheduler.schedulers.base.BaseScheduler.add_jobstore` to avoid using - :meth:`~apscheduler.schedulers.base.BaseScheduler.configure` altogether. - - .. versionadded:: 20.7 - - Returns: - dict[:obj:`str`, :obj:`object`]: The configuration values as dictionary. - - """ - timezone: dtm.tzinfo = UTC - if ( - self._application - and isinstance(self.application.bot, ExtBot) - and self.application.bot.defaults - ): - timezone = self.application.bot.defaults.tzinfo or UTC - - return { - "timezone": timezone, - "executors": {"default": self._executor}, - } - - def _tz_now(self) -> dtm.datetime: - return dtm.datetime.now(self.scheduler.timezone) - - @overload - def _parse_time_input(self, time: None, shift_day: bool = False) -> None: ... - - @overload - def _parse_time_input( - self, - time: Union[float, dtm.timedelta, dtm.datetime, dtm.time], - shift_day: bool = False, - ) -> dtm.datetime: ... - - def _parse_time_input( - self, - time: Union[float, dtm.timedelta, dtm.datetime, dtm.time, None], - shift_day: bool = False, - ) -> Optional[dtm.datetime]: - if time is None: - return None - if isinstance(time, (int, float)): - return self._tz_now() + dtm.timedelta(seconds=time) - if isinstance(time, dtm.timedelta): - return self._tz_now() + time - if isinstance(time, dtm.time): - date_time = dtm.datetime.combine( - dtm.datetime.now(tz=time.tzinfo or self.scheduler.timezone).date(), time - ) - if date_time.tzinfo is None: - # dtm.combine uses the tzinfo of `time`, which might be None, so we still have - # to localize it - date_time = localize(date_time, self.scheduler.timezone) - if shift_day and date_time <= dtm.datetime.now(UTC): - date_time += dtm.timedelta(days=1) - return date_time - return time - - def set_application( - self, application: "Application[Any, CCT, Any, Any, Any, JobQueue[CCT]]" - ) -> None: - """Set the application to be used by this JobQueue. - - Args: - application (:class:`telegram.ext.Application`): The application. - - """ - self._application = weakref.ref(application) - self.scheduler.configure(**self.scheduler_configuration) - - @staticmethod - async def job_callback(job_queue: "JobQueue[CCT]", job: "Job[CCT]") -> None: - """This method is used as a callback for the APScheduler jobs. - - More precisely, the ``func`` argument of :class:`apscheduler.job.Job` is set to this method - and the ``arg`` argument (representing positional arguments to ``func``) is set to a tuple - containing the :class:`JobQueue` itself and the :class:`~telegram.ext.Job` instance. - - Tip: - This method is a static method rather than a bound method. This makes the arguments - more transparent and allows for easier handling of PTBs integration of APScheduler - when utilizing advanced features of APScheduler. - - Hint: - This method is effectively a wrapper for :meth:`telegram.ext.Job.run`. - - .. versionadded:: 20.4 - - Args: - job_queue (:class:`JobQueue`): The job queue that created the job. - job (:class:`~telegram.ext.Job`): The job to run. - """ - await job.run(job_queue.application) - - def run_once( - self, - callback: JobCallback[CCT], - when: Union[float, dtm.timedelta, dtm.datetime, dtm.time], - data: Optional[object] = None, - name: Optional[str] = None, - chat_id: Optional[int] = None, - user_id: Optional[int] = None, - job_kwargs: Optional[JSONDict] = None, - ) -> "Job[CCT]": - """Creates a new :class:`Job` instance that runs once and adds it to the queue. - - Args: - callback (:term:`coroutine function`): The callback function that should be executed by - the new job. Callback signature:: - - async def callback(context: CallbackContext) - - when (:obj:`int` | :obj:`float` | :obj:`datetime.timedelta` | \ - :obj:`datetime.datetime` | :obj:`datetime.time`): - Time in or at which the job should run. This parameter will be interpreted - depending on its type. - - * :obj:`int` or :obj:`float` will be interpreted as "seconds from now" in which the - job should run. - * :obj:`datetime.timedelta` will be interpreted as "time from now" in which the - job should run. - * :obj:`datetime.datetime` will be interpreted as a specific date and time at - which the job should run. If the timezone (:attr:`datetime.datetime.tzinfo`) is - :obj:`None`, the default timezone of the bot will be used, which is UTC unless - :attr:`telegram.ext.Defaults.tzinfo` is used. - * :obj:`datetime.time` will be interpreted as a specific time of day at which the - job should run. This could be either today or, if the time has already passed, - tomorrow. If the timezone (:attr:`datetime.time.tzinfo`) is :obj:`None`, the - default timezone of the bot will be used, which is UTC unless - :attr:`telegram.ext.Defaults.tzinfo` is used. - - chat_id (:obj:`int`, optional): Chat id of the chat associated with this job. If - passed, the corresponding :attr:`~telegram.ext.CallbackContext.chat_data` will - be available in the callback. - - .. versionadded:: 20.0 - - user_id (:obj:`int`, optional): User id of the user associated with this job. If - passed, the corresponding :attr:`~telegram.ext.CallbackContext.user_data` will - be available in the callback. - - .. versionadded:: 20.0 - data (:obj:`object`, optional): Additional data needed for the callback function. - Can be accessed through :attr:`Job.data` in the callback. Defaults to - :obj:`None`. - - .. versionchanged:: 20.0 - Renamed the parameter ``context`` to :paramref:`data`. - name (:obj:`str`, optional): The name of the new job. Defaults to - :external:attr:`callback.__name__ <definition.__name__>`. - job_kwargs (:obj:`dict`, optional): Arbitrary keyword arguments to pass to the - :meth:`apscheduler.schedulers.base.BaseScheduler.add_job()`. - - Returns: - :class:`telegram.ext.Job`: The new :class:`Job` instance that has been added to the job - queue. - - """ - if not job_kwargs: - job_kwargs = {} - - name = name or callback.__name__ - job = Job(callback=callback, data=data, name=name, chat_id=chat_id, user_id=user_id) - date_time = self._parse_time_input(when, shift_day=True) - - j = self.scheduler.add_job( - self.job_callback, - name=name, - trigger="date", - run_date=date_time, - args=(self, job), - timezone=date_time.tzinfo or self.scheduler.timezone, - **job_kwargs, - ) - - job._job = j # pylint: disable=protected-access - return job - - def run_repeating( - self, - callback: JobCallback[CCT], - interval: Union[float, dtm.timedelta], - first: Optional[Union[float, dtm.timedelta, dtm.datetime, dtm.time]] = None, - last: Optional[Union[float, dtm.timedelta, dtm.datetime, dtm.time]] = None, - data: Optional[object] = None, - name: Optional[str] = None, - chat_id: Optional[int] = None, - user_id: Optional[int] = None, - job_kwargs: Optional[JSONDict] = None, - ) -> "Job[CCT]": - """Creates a new :class:`Job` instance that runs at specified intervals and adds it to the - queue. - - Note: - For a note about DST, please see the documentation of `APScheduler`_. - - .. _`APScheduler`: https://apscheduler.readthedocs.io/en/stable/modules/triggers/cron.html - #daylight-saving-time-behavior - - Args: - callback (:term:`coroutine function`): The callback function that should be executed by - the new job. Callback signature:: - - async def callback(context: CallbackContext) - - interval (:obj:`int` | :obj:`float` | :obj:`datetime.timedelta`): The interval in which - the job will run. If it is an :obj:`int` or a :obj:`float`, it will be interpreted - as seconds. - first (:obj:`int` | :obj:`float` | :obj:`datetime.timedelta` | \ - :obj:`datetime.datetime` | :obj:`datetime.time`, optional): - Time in or at which the job should run. This parameter will be interpreted - depending on its type. - - * :obj:`int` or :obj:`float` will be interpreted as "seconds from now" in which the - job should run. - * :obj:`datetime.timedelta` will be interpreted as "time from now" in which the - job should run. - * :obj:`datetime.datetime` will be interpreted as a specific date and time at - which the job should run. If the timezone (:attr:`datetime.datetime.tzinfo`) is - :obj:`None`, the default timezone of the bot will be used. - * :obj:`datetime.time` will be interpreted as a specific time of day at which the - job should run. This could be either today or, if the time has already passed, - tomorrow. If the timezone (:attr:`datetime.time.tzinfo`) is :obj:`None`, the - default timezone of the bot will be used, which is UTC unless - :attr:`telegram.ext.Defaults.tzinfo` is used. - - Defaults to :paramref:`interval` - - Note: - Setting :paramref:`first` to ``0``, ``datetime.datetime.now()`` or another - value that indicates that the job should run immediately will not work due - to how the APScheduler library works. If you want to run a job immediately, - we recommend to use an approach along the lines of:: - - job = context.job_queue.run_repeating(callback, interval=5) - await job.run(context.application) - - .. seealso:: :meth:`telegram.ext.Job.run` - - last (:obj:`int` | :obj:`float` | :obj:`datetime.timedelta` | \ - :obj:`datetime.datetime` | :obj:`datetime.time`, optional): - Latest possible time for the job to run. This parameter will be interpreted - depending on its type. See :paramref:`first` for details. - - If :paramref:`last` is :obj:`datetime.datetime` or :obj:`datetime.time` type - and ``last.tzinfo`` is :obj:`None`, the default timezone of the bot will be - assumed, which is UTC unless :attr:`telegram.ext.Defaults.tzinfo` is used. - - Defaults to :obj:`None`. - data (:obj:`object`, optional): Additional data needed for the callback function. - Can be accessed through :attr:`Job.data` in the callback. Defaults to - :obj:`None`. - - .. versionchanged:: 20.0 - Renamed the parameter ``context`` to :paramref:`data`. - name (:obj:`str`, optional): The name of the new job. Defaults to - :external:attr:`callback.__name__ <definition.__name__>`. - chat_id (:obj:`int`, optional): Chat id of the chat associated with this job. If - passed, the corresponding :attr:`~telegram.ext.CallbackContext.chat_data` will - be available in the callback. - - .. versionadded:: 20.0 - - user_id (:obj:`int`, optional): User id of the user associated with this job. If - passed, the corresponding :attr:`~telegram.ext.CallbackContext.user_data` will - be available in the callback. - - .. versionadded:: 20.0 - job_kwargs (:obj:`dict`, optional): Arbitrary keyword arguments to pass to the - :meth:`apscheduler.schedulers.base.BaseScheduler.add_job()`. - - Returns: - :class:`telegram.ext.Job`: The new :class:`Job` instance that has been added to the job - queue. - - """ - if not job_kwargs: - job_kwargs = {} - - name = name or callback.__name__ - job = Job(callback=callback, data=data, name=name, chat_id=chat_id, user_id=user_id) - - dt_first = self._parse_time_input(first) - dt_last = self._parse_time_input(last) - - if dt_last and dt_first and dt_last < dt_first: - raise ValueError("'last' must not be before 'first'!") - - if isinstance(interval, dtm.timedelta): - interval = interval.total_seconds() - - j = self.scheduler.add_job( - self.job_callback, - trigger="interval", - args=(self, job), - start_date=dt_first, - end_date=dt_last, - seconds=interval, - name=name, - **job_kwargs, - ) - - job._job = j # pylint: disable=protected-access - return job - - def run_monthly( - self, - callback: JobCallback[CCT], - when: dtm.time, - day: int, - data: Optional[object] = None, - name: Optional[str] = None, - chat_id: Optional[int] = None, - user_id: Optional[int] = None, - job_kwargs: Optional[JSONDict] = None, - ) -> "Job[CCT]": - """Creates a new :class:`Job` that runs on a monthly basis and adds it to the queue. - - .. versionchanged:: 20.0 - The ``day_is_strict`` argument was removed. Instead one can now pass ``-1`` to the - :paramref:`day` parameter to have the job run on the last day of the month. - - Args: - callback (:term:`coroutine function`): The callback function that should be executed by - the new job. Callback signature:: - - async def callback(context: CallbackContext) - - when (:obj:`datetime.time`): Time of day at which the job should run. If the timezone - (``when.tzinfo``) is :obj:`None`, the default timezone of the bot will be used, - which is UTC unless :attr:`telegram.ext.Defaults.tzinfo` is used. - day (:obj:`int`): Defines the day of the month whereby the job would run. It should - be within the range of ``1`` and ``31``, inclusive. If a month has fewer days than - this number, the job will not run in this month. Passing ``-1`` leads to the job - running on the last day of the month. - data (:obj:`object`, optional): Additional data needed for the callback function. - Can be accessed through :attr:`Job.data` in the callback. Defaults to - :obj:`None`. - - .. versionchanged:: 20.0 - Renamed the parameter ``context`` to :paramref:`data`. - name (:obj:`str`, optional): The name of the new job. Defaults to - :external:attr:`callback.__name__ <definition.__name__>`. - chat_id (:obj:`int`, optional): Chat id of the chat associated with this job. If - passed, the corresponding :attr:`~telegram.ext.CallbackContext.chat_data` will - be available in the callback. - - .. versionadded:: 20.0 - - user_id (:obj:`int`, optional): User id of the user associated with this job. If - passed, the corresponding :attr:`~telegram.ext.CallbackContext.user_data` will - be available in the callback. - - .. versionadded:: 20.0 - job_kwargs (:obj:`dict`, optional): Arbitrary keyword arguments to pass to the - :meth:`apscheduler.schedulers.base.BaseScheduler.add_job()`. - - Returns: - :class:`telegram.ext.Job`: The new :class:`Job` instance that has been added to the job - queue. - - """ - if not job_kwargs: - job_kwargs = {} - - name = name or callback.__name__ - job = Job(callback=callback, data=data, name=name, chat_id=chat_id, user_id=user_id) - - j = self.scheduler.add_job( - self.job_callback, - trigger="cron", - args=(self, job), - name=name, - day="last" if day == -1 else day, - hour=when.hour, - minute=when.minute, - second=when.second, - timezone=when.tzinfo or self.scheduler.timezone, - **job_kwargs, - ) - job._job = j # pylint: disable=protected-access - return job - - def run_daily( - self, - callback: JobCallback[CCT], - time: dtm.time, - days: tuple[int, ...] = _ALL_DAYS, - data: Optional[object] = None, - name: Optional[str] = None, - chat_id: Optional[int] = None, - user_id: Optional[int] = None, - job_kwargs: Optional[JSONDict] = None, - ) -> "Job[CCT]": - """Creates a new :class:`Job` that runs on a daily basis and adds it to the queue. - - Note: - For a note about DST, please see the documentation of `APScheduler`_. - - .. _`APScheduler`: https://apscheduler.readthedocs.io/en/stable/modules/triggers/cron.html - #daylight-saving-time-behavior - - Args: - callback (:term:`coroutine function`): The callback function that should be executed by - the new job. Callback signature:: - - async def callback(context: CallbackContext) - - time (:obj:`datetime.time`): Time of day at which the job should run. If the timezone - (:obj:`datetime.time.tzinfo`) is :obj:`None`, the default timezone of the bot will - be used, which is UTC unless :attr:`telegram.ext.Defaults.tzinfo` is used. - days (tuple[:obj:`int`], optional): Defines on which days of the week the job should - run (where ``0-6`` correspond to sunday - saturday). By default, the job will run - every day. - - .. versionchanged:: 20.0 - Changed day of the week mapping of 0-6 from monday-sunday to sunday-saturday. - - data (:obj:`object`, optional): Additional data needed for the callback function. - Can be accessed through :attr:`Job.data` in the callback. Defaults to - :obj:`None`. - - .. versionchanged:: 20.0 - Renamed the parameter ``context`` to :paramref:`data`. - name (:obj:`str`, optional): The name of the new job. Defaults to - :external:attr:`callback.__name__ <definition.__name__>`. - chat_id (:obj:`int`, optional): Chat id of the chat associated with this job. If - passed, the corresponding :attr:`~telegram.ext.CallbackContext.chat_data` will - be available in the callback. - - .. versionadded:: 20.0 - - user_id (:obj:`int`, optional): User id of the user associated with this job. If - passed, the corresponding :attr:`~telegram.ext.CallbackContext.user_data` will - be available in the callback. - - .. versionadded:: 20.0 - job_kwargs (:obj:`dict`, optional): Arbitrary keyword arguments to pass to the - :meth:`apscheduler.schedulers.base.BaseScheduler.add_job()`. - - Returns: - :class:`telegram.ext.Job`: The new :class:`Job` instance that has been added to the job - queue. - - """ - if not job_kwargs: - job_kwargs = {} - - name = name or callback.__name__ - job = Job(callback=callback, data=data, name=name, chat_id=chat_id, user_id=user_id) - - j = self.scheduler.add_job( - self.job_callback, - name=name, - args=(self, job), - trigger="cron", - day_of_week=",".join([self._CRON_MAPPING[d] for d in days]), - hour=time.hour, - minute=time.minute, - second=time.second, - timezone=time.tzinfo or self.scheduler.timezone, - **job_kwargs, - ) - - job._job = j # pylint: disable=protected-access - return job - - def run_custom( - self, - callback: JobCallback[CCT], - job_kwargs: JSONDict, - data: Optional[object] = None, - name: Optional[str] = None, - chat_id: Optional[int] = None, - user_id: Optional[int] = None, - ) -> "Job[CCT]": - """Creates a new custom defined :class:`Job`. - - Args: - callback (:term:`coroutine function`): The callback function that should be executed by - the new job. Callback signature:: - - async def callback(context: CallbackContext) - - job_kwargs (:obj:`dict`): Arbitrary keyword arguments. Used as arguments for - :meth:`apscheduler.schedulers.base.BaseScheduler.add_job`. - data (:obj:`object`, optional): Additional data needed for the callback function. - Can be accessed through :attr:`Job.data` in the callback. Defaults to - :obj:`None`. - - .. versionchanged:: 20.0 - Renamed the parameter ``context`` to :paramref:`data`. - name (:obj:`str`, optional): The name of the new job. Defaults to - :external:attr:`callback.__name__ <definition.__name__>`. - chat_id (:obj:`int`, optional): Chat id of the chat associated with this job. If - passed, the corresponding :attr:`~telegram.ext.CallbackContext.chat_data` will - be available in the callback. - - .. versionadded:: 20.0 - - user_id (:obj:`int`, optional): User id of the user associated with this job. If - passed, the corresponding :attr:`~telegram.ext.CallbackContext.user_data` will - be available in the callback. - - .. versionadded:: 20.0 - - Returns: - :class:`telegram.ext.Job`: The new :class:`Job` instance that has been added to the job - queue. - - """ - name = name or callback.__name__ - job = Job(callback=callback, data=data, name=name, chat_id=chat_id, user_id=user_id) - - j = self.scheduler.add_job(self.job_callback, args=(self, job), name=name, **job_kwargs) - - job._job = j # pylint: disable=protected-access - return job - - async def start(self) -> None: - # this method async just in case future versions need that - """Starts the :class:`~telegram.ext.JobQueue`.""" - if not self.scheduler.running: - self.scheduler.start() - - async def stop(self, wait: bool = True) -> None: - """Shuts down the :class:`~telegram.ext.JobQueue`. - - Args: - wait (:obj:`bool`, optional): Whether to wait until all currently running jobs - have finished. Defaults to :obj:`True`. - - """ - # the interface methods of AsyncIOExecutor are currently not really asyncio-compatible - # so we apply some small tweaks here to try and smoothen the integration into PTB - # TODO: When APS 4.0 hits, we should be able to remove the tweaks - if wait: - # Unfortunately AsyncIOExecutor just cancels them all ... - await asyncio.gather( - *self._executor._pending_futures, # pylint: disable=protected-access - return_exceptions=True, - ) - if self.scheduler.running: - self.scheduler.shutdown(wait=wait) - # scheduler.shutdown schedules a task in the event loop but immediately returns - # so give it a tiny bit of time to actually shut down. - await asyncio.sleep(0.01) - - def jobs(self, pattern: Union[str, re.Pattern[str], None] = None) -> tuple["Job[CCT]", ...]: - """Returns a tuple of all *scheduled* jobs that are currently in the :class:`JobQueue`. - - Args: - pattern (:obj:`str` | :obj:`re.Pattern`, optional): A regular expression pattern. If - passed, only jobs whose name matches the pattern will be returned. - Defaults to :obj:`None`. - - Hint: - This uses :func:`re.search` and not :func:`re.match`. - - .. versionadded:: 21.10 - - Returns: - tuple[:class:`Job`]: Tuple of all *scheduled* jobs. - """ - jobs_generator: Iterable[Job] = ( - Job.from_aps_job(job) for job in self.scheduler.get_jobs() - ) - if pattern is None: - return tuple(jobs_generator) - return tuple( - job for job in jobs_generator if (job.name and re.compile(pattern).search(job.name)) - ) - - def get_jobs_by_name(self, name: str) -> tuple["Job[CCT]", ...]: - """Returns a tuple of all *scheduled* jobs with the given name that are currently - in the :class:`JobQueue`. - - Hint: - This method is a convenience wrapper for :meth:`jobs` with a pattern that matches the - given name. - - Returns: - tuple[:class:`Job`]: Tuple of all *scheduled* jobs matching the name. - """ - return self.jobs(f"^{re.escape(name)}$") - - -class Job(Generic[CCT]): - """This class is a convenience wrapper for the jobs held in a :class:`telegram.ext.JobQueue`. - With the current backend APScheduler, :attr:`job` holds a :class:`apscheduler.job.Job` - instance. - - Objects of this class are comparable in terms of equality. Two objects of this class are - considered equal, if their :class:`id <apscheduler.job.Job>` is equal. - - This class is a :class:`~typing.Generic` class and accepts one type variable that specifies - the type of the argument ``context`` of :paramref:`callback`. - - Important: - If you want to use this class, you must install PTB with the optional requirement - ``job-queue``, i.e. - - .. code-block:: bash - - pip install "python-telegram-bot[job-queue]" - - Note: - All attributes and instance methods of :attr:`job` are also directly available as - attributes/methods of the corresponding :class:`telegram.ext.Job` object. - - Warning: - This class should not be instantiated manually. - Use the methods of :class:`telegram.ext.JobQueue` to schedule jobs. - - .. seealso:: :wiki:`Job Queue <Extensions---JobQueue>` - - .. versionchanged:: 20.0 - - * Removed argument and attribute ``job_queue``. - * Renamed ``Job.context`` to :attr:`Job.data`. - * Removed argument ``job`` - * To use this class, PTB must be installed via - ``pip install "python-telegram-bot[job-queue]"``. - - Args: - callback (:term:`coroutine function`): The callback function that should be executed by the - new job. Callback signature:: - - async def callback(context: CallbackContext) - - data (:obj:`object`, optional): Additional data needed for the :paramref:`callback` - function. Can be accessed through :attr:`Job.data` in the callback. Defaults to - :obj:`None`. - name (:obj:`str`, optional): The name of the new job. Defaults to - :external:obj:`callback.__name__ <definition.__name__>`. - chat_id (:obj:`int`, optional): Chat id of the chat that this job is associated with. - - .. versionadded:: 20.0 - user_id (:obj:`int`, optional): User id of the user that this job is associated with. - - .. versionadded:: 20.0 - Attributes: - callback (:term:`coroutine function`): The callback function that should be executed by the - new job. - data (:obj:`object`): Optional. Additional data needed for the :attr:`callback` function. - name (:obj:`str`): Optional. The name of the new job. - chat_id (:obj:`int`): Optional. Chat id of the chat that this job is associated with. - - .. versionadded:: 20.0 - user_id (:obj:`int`): Optional. User id of the user that this job is associated with. - - .. versionadded:: 20.0 - """ - - __slots__ = ( - "_enabled", - "_job", - "_removed", - "callback", - "chat_id", - "data", - "name", - "user_id", - ) - - def __init__( - self, - callback: JobCallback[CCT], - data: Optional[object] = None, - name: Optional[str] = None, - chat_id: Optional[int] = None, - user_id: Optional[int] = None, - ): - if not APS_AVAILABLE: - raise RuntimeError( - "To use `Job`, PTB must be installed via `pip install " - '"python-telegram-bot[job-queue]"`.' - ) - - self.callback: JobCallback[CCT] = callback - self.data: Optional[object] = data - self.name: Optional[str] = name or callback.__name__ - self.chat_id: Optional[int] = chat_id - self.user_id: Optional[int] = user_id - - self._removed = False - self._enabled = False - - self._job = cast("APSJob", None) - - def __getattr__(self, item: str) -> object: - """Overrides :py:meth:`object.__getattr__` to get specific attribute of the - :class:`telegram.ext.Job` object or of its attribute :class:`apscheduler.job.Job`, - if exists. - - Args: - item (:obj:`str`): The name of the attribute. - - Returns: - :object: The value of the attribute. - - Raises: - :exc:`AttributeError`: If the attribute does not exist in both - :class:`telegram.ext.Job` and :class:`apscheduler.job.Job` objects. - """ - try: - return getattr(self.job, item) - except AttributeError as exc: - raise AttributeError( - f"Neither 'telegram.ext.Job' nor 'apscheduler.job.Job' has attribute '{item}'" - ) from exc - - def __eq__(self, other: object) -> bool: - """Defines equality condition for the :class:`telegram.ext.Job` object. - Two objects of this class are considered to be equal if their - :class:`id <apscheduler.job.Job>` are equal. - - Returns: - :obj:`True` if both objects have :paramref:`id` parameters identical. - :obj:`False` otherwise. - """ - if isinstance(other, self.__class__): - return self.id == other.id - return False - - def __hash__(self) -> int: - """Builds a hash value for this object such that the hash of two objects is - equal if and only if the objects are equal in terms of :meth:`__eq__`. - - Returns: - :obj:`int`: The hash value of the object. - """ - return hash(self.id) - - def __repr__(self) -> str: - """Give a string representation of the job in the form - ``Job[id=..., name=..., callback=..., trigger=...]``. - - As this class doesn't implement :meth:`object.__str__`, the default implementation - will be used, which is equivalent to :meth:`__repr__`. - - Returns: - :obj:`str` - """ - return build_repr_with_selected_attrs( - self, - id=self.job.id, - name=self.name, - callback=self.callback.__name__, - trigger=self.job.trigger, - ) - - @property - def job(self) -> "APSJob": - """:class:`apscheduler.job.Job`: The APS Job this job is a wrapper for. - - .. versionchanged:: 20.0 - This property is now read-only. - """ - return self._job - - @property - def removed(self) -> bool: - """:obj:`bool`: Whether this job is due to be removed.""" - return self._removed - - @property - def enabled(self) -> bool: - """:obj:`bool`: Whether this job is enabled.""" - return self._enabled - - @enabled.setter - def enabled(self, status: bool) -> None: - if status: - self.job.resume() - else: - self.job.pause() - self._enabled = status - - @property - def next_t(self) -> Optional[dtm.datetime]: - """ - :class:`datetime.datetime`: Datetime for the next job execution. - Datetime is localized according to :attr:`datetime.datetime.tzinfo`. - If job is removed or already ran it equals to :obj:`None`. - - Warning: - This attribute is only available, if the :class:`telegram.ext.JobQueue` this job - belongs to is already started. Otherwise APScheduler raises an :exc:`AttributeError`. - """ - return self.job.next_run_time - - @classmethod - def from_aps_job(cls, aps_job: "APSJob") -> "Job[CCT]": - """Provides the :class:`telegram.ext.Job` that is associated with the given APScheduler - job. - - Tip: - This method can be useful when using advanced APScheduler features along with - :class:`telegram.ext.JobQueue`. - - .. versionadded:: 20.4 - - Args: - aps_job (:class:`apscheduler.job.Job`): The APScheduler job - - Returns: - :class:`telegram.ext.Job` - """ - ext_job = aps_job.args[1] - ext_job._job = aps_job # pylint: disable=protected-access - return ext_job - - async def run( - self, application: "Application[Any, CCT, Any, Any, Any, JobQueue[CCT]]" - ) -> None: - """Executes the callback function independently of the jobs schedule. Also calls - :meth:`telegram.ext.Application.update_persistence`. - - .. versionchanged:: 20.0 - Calls :meth:`telegram.ext.Application.update_persistence`. - - Args: - application (:class:`telegram.ext.Application`): The application this job is associated - with. - """ - # We shield the task such that the job isn't cancelled mid-run - await asyncio.shield(self._run(application)) - - async def _run( - self, application: "Application[Any, CCT, Any, Any, Any, JobQueue[CCT]]" - ) -> None: - try: - try: - context = application.context_types.context.from_job(self, application) - except Exception as exc: - _LOGGER.critical( - "Error while building CallbackContext for job %s. Job will not be run.", - self._job, - exc_info=exc, - ) - return - - await context.refresh_data() - await self.callback(context) - except Exception as exc: - await application.create_task( - application.process_error(None, exc, job=self), - name=f"Job:{self.id}:run:process_error", - ) - finally: - # This is internal logic of application - let's keep it private for now - application._mark_for_persistence_update(job=self) # pylint: disable=protected-access - - def schedule_removal(self) -> None: - """ - Schedules this job for removal from the :class:`JobQueue`. It will be removed without - executing its callback function again. - """ - self.job.remove() - self._removed = True diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_picklepersistence.py b/venv/lib/python3.12/site-packages/telegram/ext/_picklepersistence.py deleted file mode 100644 index 1602eab..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_picklepersistence.py +++ /dev/null @@ -1,562 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the PicklePersistence class.""" -import pickle -from copy import deepcopy -from pathlib import Path -from typing import Any, Callable, Optional, TypeVar, Union, cast, overload - -from telegram import Bot, TelegramObject -from telegram._utils.types import FilePathInput -from telegram._utils.warnings import warn -from telegram.ext import BasePersistence, PersistenceInput -from telegram.ext._contexttypes import ContextTypes -from telegram.ext._utils.types import BD, CD, UD, CDCData, ConversationDict, ConversationKey - -_REPLACED_KNOWN_BOT = "a known bot replaced by PTB's PicklePersistence" -_REPLACED_UNKNOWN_BOT = "an unknown bot replaced by PTB's PicklePersistence" - -TelegramObj = TypeVar("TelegramObj", bound=TelegramObject) - - -def _all_subclasses(cls: type[TelegramObj]) -> set[type[TelegramObj]]: - """Gets all subclasses of the specified object, recursively. from - https://stackoverflow.com/a/3862957/9706202 - """ - subclasses = cls.__subclasses__() - return set(subclasses).union([s for c in subclasses for s in _all_subclasses(c)]) - - -def _reconstruct_to(cls: type[TelegramObj], kwargs: dict) -> TelegramObj: - """ - This method is used for unpickling. The data, which is in the form a dictionary, is - converted back into a class. Works mostly the same as :meth:`TelegramObject.__setstate__`. - This function should be kept in place for backwards compatibility even if the pickling logic - is changed, since `_custom_reduction` places references to this function into the pickled data. - """ - obj = cls.__new__(cls) - obj.__setstate__(kwargs) - return obj - - -def _custom_reduction(cls: TelegramObj) -> tuple[Callable, tuple[type[TelegramObj], dict]]: - """ - This method is used for pickling. The bot attribute is preserved so _BotPickler().persistent_id - works as intended. - """ - data = cls._get_attrs(include_private=True) # pylint: disable=protected-access - # MappingProxyType is not pickable, so we convert it to a dict - # no need to convert back to MPT in _reconstruct_to, since it's done in __setstate__ - data["api_kwargs"] = dict(data["api_kwargs"]) # type: ignore[arg-type] - return _reconstruct_to, (cls.__class__, data) - - -class _BotPickler(pickle.Pickler): - __slots__ = ("_bot",) - - def __init__(self, bot: Bot, *args: Any, **kwargs: Any): - self._bot = bot - super().__init__(*args, **kwargs) - - def reducer_override( - self, obj: TelegramObj - ) -> tuple[Callable, tuple[type[TelegramObj], dict]]: - """ - This method is used for pickling. The bot attribute is preserved so - _BotPickler().persistent_id works as intended. - """ - if not isinstance(obj, TelegramObject): - return NotImplemented - - return _custom_reduction(obj) - - def persistent_id(self, obj: object) -> Optional[str]: - """Used to 'mark' the Bot, so it can be replaced later. See - https://docs.python.org/3/library/pickle.html#pickle.Pickler.persistent_id for more info - """ - if obj is self._bot: - return _REPLACED_KNOWN_BOT - if isinstance(obj, Bot): - warn( - "Unknown bot instance found. Will be replaced by `None` during unpickling", - stacklevel=2, - ) - return _REPLACED_UNKNOWN_BOT - return None # pickles as usual - - -class _BotUnpickler(pickle.Unpickler): - __slots__ = ("_bot",) - - def __init__(self, bot: Bot, *args: Any, **kwargs: Any): - self._bot = bot - super().__init__(*args, **kwargs) - - def persistent_load(self, pid: str) -> Optional[Bot]: - """Replaces the bot with the current bot if known, else it is replaced by :obj:`None`.""" - if pid == _REPLACED_KNOWN_BOT: - return self._bot - if pid == _REPLACED_UNKNOWN_BOT: - return None - raise pickle.UnpicklingError("Found unknown persistent id when unpickling!") - - -class PicklePersistence(BasePersistence[UD, CD, BD]): - """Using python's builtin :mod:`pickle` for making your bot persistent. - - Attention: - The interface provided by this class is intended to be accessed exclusively by - :class:`~telegram.ext.Application`. Calling any of the methods below manually might - interfere with the integration of persistence into :class:`~telegram.ext.Application`. - - Note: - This implementation of :class:`BasePersistence` uses the functionality of the pickle module - to support serialization of bot instances. Specifically any reference to - :attr:`~BasePersistence.bot` will be replaced by a placeholder before pickling and - :attr:`~BasePersistence.bot` will be inserted back when loading the data. - - Examples: - :any:`Persistent Conversation Bot <examples.persistentconversationbot>` - - .. seealso:: :wiki:`Making Your Bot Persistent <Making-your-bot-persistent>` - - .. versionchanged:: 20.0 - - * The parameters and attributes ``store_*_data`` were replaced by :attr:`store_data`. - * The parameter and attribute ``filename`` were replaced by :attr:`filepath`. - * :attr:`filepath` now also accepts :obj:`pathlib.Path` as argument. - - Args: - filepath (:obj:`str` | :obj:`pathlib.Path`): The filepath for storing the pickle files. - When :attr:`single_file` is :obj:`False` this will be used as a prefix. - store_data (:class:`~telegram.ext.PersistenceInput`, optional): Specifies which kinds of - data will be saved by this persistence instance. By default, all available kinds of - data will be saved. - single_file (:obj:`bool`, optional): When :obj:`False` will store 5 separate files of - `filename_user_data`, `filename_bot_data`, `filename_chat_data`, - `filename_callback_data` and `filename_conversations`. Default is :obj:`True`. - on_flush (:obj:`bool`, optional): When :obj:`True` will only save to file when - :meth:`flush` is called and keep data in memory until that happens. When - :obj:`False` will store data on any transaction *and* on call to :meth:`flush`. - Default is :obj:`False`. - context_types (:class:`telegram.ext.ContextTypes`, optional): Pass an instance - of :class:`telegram.ext.ContextTypes` to customize the types used in the - ``context`` interface. If not passed, the defaults documented in - :class:`telegram.ext.ContextTypes` will be used. - - .. versionadded:: 13.6 - update_interval (:obj:`int` | :obj:`float`, optional): The - :class:`~telegram.ext.Application` will update - the persistence in regular intervals. This parameter specifies the time (in seconds) to - wait between two consecutive runs of updating the persistence. Defaults to 60 seconds. - - .. versionadded:: 20.0 - Attributes: - filepath (:obj:`str` | :obj:`pathlib.Path`): The filepath for storing the pickle files. - When :attr:`single_file` is :obj:`False` this will be used as a prefix. - store_data (:class:`~telegram.ext.PersistenceInput`): Specifies which kinds of data will - be saved by this persistence instance. - single_file (:obj:`bool`): Optional. When :obj:`False` will store 5 separate files of - `filename_user_data`, `filename_bot_data`, `filename_chat_data`, - `filename_callback_data` and `filename_conversations`. Default is :obj:`True`. - on_flush (:obj:`bool`): Optional. When :obj:`True` will only save to file when - :meth:`flush` is called and keep data in memory until that happens. When - :obj:`False` will store data on any transaction *and* on call to :meth:`flush`. - Default is :obj:`False`. - context_types (:class:`telegram.ext.ContextTypes`): Container for the types used - in the ``context`` interface. - - .. versionadded:: 13.6 - """ - - __slots__ = ( - "bot_data", - "callback_data", - "chat_data", - "context_types", - "conversations", - "filepath", - "on_flush", - "single_file", - "user_data", - ) - - @overload - def __init__( - self: "PicklePersistence[dict[Any, Any], dict[Any, Any], dict[Any, Any]]", - filepath: FilePathInput, - store_data: Optional[PersistenceInput] = None, - single_file: bool = True, - on_flush: bool = False, - update_interval: float = 60, - ): ... - - @overload - def __init__( - self: "PicklePersistence[UD, CD, BD]", - filepath: FilePathInput, - store_data: Optional[PersistenceInput] = None, - single_file: bool = True, - on_flush: bool = False, - update_interval: float = 60, - context_types: Optional[ContextTypes[Any, UD, CD, BD]] = None, - ): ... - - def __init__( - self, - filepath: FilePathInput, - store_data: Optional[PersistenceInput] = None, - single_file: bool = True, - on_flush: bool = False, - update_interval: float = 60, - context_types: Optional[ContextTypes[Any, UD, CD, BD]] = None, - ): - super().__init__(store_data=store_data, update_interval=update_interval) - self.filepath: Path = Path(filepath) - self.single_file: Optional[bool] = single_file - self.on_flush: Optional[bool] = on_flush - self.user_data: Optional[dict[int, UD]] = None - self.chat_data: Optional[dict[int, CD]] = None - self.bot_data: Optional[BD] = None - self.callback_data: Optional[CDCData] = None - self.conversations: Optional[dict[str, dict[tuple[Union[int, str], ...], object]]] = None - self.context_types: ContextTypes[Any, UD, CD, BD] = cast( - "ContextTypes[Any, UD, CD, BD]", context_types or ContextTypes() - ) - - def _load_singlefile(self) -> None: - try: - with self.filepath.open("rb") as file: - data = _BotUnpickler(self.bot, file).load() - - self.user_data = data["user_data"] - self.chat_data = data["chat_data"] - # For backwards compatibility with files not containing bot data - self.bot_data = data.get("bot_data", self.context_types.bot_data()) - self.callback_data = data.get("callback_data", {}) - self.conversations = data["conversations"] - except OSError: - self.conversations = {} - self.user_data = {} - self.chat_data = {} - self.bot_data = self.context_types.bot_data() - self.callback_data = None - except pickle.UnpicklingError as exc: - filename = self.filepath.name - raise TypeError(f"File {filename} does not contain valid pickle data") from exc - except Exception as exc: - raise TypeError(f"Something went wrong unpickling {self.filepath.name}") from exc - - def _load_file(self, filepath: Path) -> Any: - try: - with filepath.open("rb") as file: - return _BotUnpickler(self.bot, file).load() - - except OSError: - return None - except pickle.UnpicklingError as exc: - raise TypeError(f"File {filepath.name} does not contain valid pickle data") from exc - except Exception as exc: - raise TypeError(f"Something went wrong unpickling {filepath.name}") from exc - - def _dump_singlefile(self) -> None: - data = { - "conversations": self.conversations, - "user_data": self.user_data, - "chat_data": self.chat_data, - "bot_data": self.bot_data, - "callback_data": self.callback_data, - } - with self.filepath.open("wb") as file: - _BotPickler(self.bot, file, protocol=pickle.HIGHEST_PROTOCOL).dump(data) - - def _dump_file(self, filepath: Path, data: object) -> None: - with filepath.open("wb") as file: - _BotPickler(self.bot, file, protocol=pickle.HIGHEST_PROTOCOL).dump(data) - - async def get_user_data(self) -> dict[int, UD]: - """Returns the user_data from the pickle file if it exists or an empty :obj:`dict`. - - Returns: - dict[:obj:`int`, :obj:`dict`]: The restored user data. - """ - if self.user_data: - pass - elif not self.single_file: - data = self._load_file(Path(f"{self.filepath}_user_data")) - if not data: - data = {} - self.user_data = data - else: - self._load_singlefile() - return deepcopy(self.user_data) # type: ignore[arg-type] - - async def get_chat_data(self) -> dict[int, CD]: - """Returns the chat_data from the pickle file if it exists or an empty :obj:`dict`. - - Returns: - dict[:obj:`int`, :obj:`dict`]: The restored chat data. - """ - if self.chat_data: - pass - elif not self.single_file: - data = self._load_file(Path(f"{self.filepath}_chat_data")) - if not data: - data = {} - self.chat_data = data - else: - self._load_singlefile() - return deepcopy(self.chat_data) # type: ignore[arg-type] - - async def get_bot_data(self) -> BD: - """Returns the bot_data from the pickle file if it exists or an empty object of type - :obj:`dict` | :attr:`telegram.ext.ContextTypes.bot_data`. - - Returns: - :obj:`dict` | :attr:`telegram.ext.ContextTypes.bot_data`: The restored bot data. - """ - if self.bot_data: - pass - elif not self.single_file: - data = self._load_file(Path(f"{self.filepath}_bot_data")) - if not data: - data = self.context_types.bot_data() - self.bot_data = data - else: - self._load_singlefile() - return deepcopy(self.bot_data) # type: ignore[return-value] - - async def get_callback_data(self) -> Optional[CDCData]: - """Returns the callback data from the pickle file if it exists or :obj:`None`. - - .. versionadded:: 13.6 - - Returns: - tuple[list[tuple[:obj:`str`, :obj:`float`, dict[:obj:`str`, :class:`object`]]], - dict[:obj:`str`, :obj:`str`]] | :obj:`None`: The restored metadata or :obj:`None`, - if no data was stored. - """ - if self.callback_data: - pass - elif not self.single_file: - data = self._load_file(Path(f"{self.filepath}_callback_data")) - if not data: - data = None - self.callback_data = data - else: - self._load_singlefile() - if self.callback_data is None: - return None - return deepcopy(self.callback_data) - - async def get_conversations(self, name: str) -> ConversationDict: - """Returns the conversations from the pickle file if it exists or an empty dict. - - Args: - name (:obj:`str`): The handlers name. - - Returns: - :obj:`dict`: The restored conversations for the handler. - """ - if self.conversations: - pass - elif not self.single_file: - data = self._load_file(Path(f"{self.filepath}_conversations")) - if not data: - data = {name: {}} - self.conversations = data - else: - self._load_singlefile() - return self.conversations.get(name, {}).copy() # type: ignore[union-attr] - - async def update_conversation( - self, name: str, key: ConversationKey, new_state: Optional[object] - ) -> None: - """Will update the conversations for the given handler and depending on :attr:`on_flush` - save the pickle file. - - Args: - name (:obj:`str`): The handler's name. - key (:obj:`tuple`): The key the state is changed for. - new_state (:class:`object`): The new state for the given key. - """ - if not self.conversations: - self.conversations = {} - if self.conversations.setdefault(name, {}).get(key) == new_state: - return - self.conversations[name][key] = new_state - if not self.on_flush: - if not self.single_file: - self._dump_file(Path(f"{self.filepath}_conversations"), self.conversations) - else: - self._dump_singlefile() - - async def update_user_data(self, user_id: int, data: UD) -> None: - """Will update the user_data and depending on :attr:`on_flush` save the pickle file. - - Args: - user_id (:obj:`int`): The user the data might have been changed for. - data (:obj:`dict`): The :attr:`telegram.ext.Application.user_data` ``[user_id]``. - """ - if self.user_data is None: - self.user_data = {} - if self.user_data.get(user_id) == data: - return - self.user_data[user_id] = data - if not self.on_flush: - if not self.single_file: - self._dump_file(Path(f"{self.filepath}_user_data"), self.user_data) - else: - self._dump_singlefile() - - async def update_chat_data(self, chat_id: int, data: CD) -> None: - """Will update the chat_data and depending on :attr:`on_flush` save the pickle file. - - Args: - chat_id (:obj:`int`): The chat the data might have been changed for. - data (:obj:`dict`): The :attr:`telegram.ext.Application.chat_data` ``[chat_id]``. - """ - if self.chat_data is None: - self.chat_data = {} - if self.chat_data.get(chat_id) == data: - return - self.chat_data[chat_id] = data - if not self.on_flush: - if not self.single_file: - self._dump_file(Path(f"{self.filepath}_chat_data"), self.chat_data) - else: - self._dump_singlefile() - - async def update_bot_data(self, data: BD) -> None: - """Will update the bot_data and depending on :attr:`on_flush` save the pickle file. - - Args: - data (:obj:`dict` | :attr:`telegram.ext.ContextTypes.bot_data`): The - :attr:`telegram.ext.Application.bot_data`. - """ - if self.bot_data == data: - return - self.bot_data = data - if not self.on_flush: - if not self.single_file: - self._dump_file(Path(f"{self.filepath}_bot_data"), self.bot_data) - else: - self._dump_singlefile() - - async def update_callback_data(self, data: CDCData) -> None: - """Will update the callback_data (if changed) and depending on :attr:`on_flush` save the - pickle file. - - .. versionadded:: 13.6 - - Args: - data (tuple[list[tuple[:obj:`str`, :obj:`float`, \ - dict[:obj:`str`, :class:`object`]]], dict[:obj:`str`, :obj:`str`]]): - The relevant data to restore :class:`telegram.ext.CallbackDataCache`. - """ - if self.callback_data == data: - return - self.callback_data = data - if not self.on_flush: - if not self.single_file: - self._dump_file(Path(f"{self.filepath}_callback_data"), self.callback_data) - else: - self._dump_singlefile() - - async def drop_chat_data(self, chat_id: int) -> None: - """Will delete the specified key from the ``chat_data`` and depending on - :attr:`on_flush` save the pickle file. - - .. versionadded:: 20.0 - - Args: - chat_id (:obj:`int`): The chat id to delete from the persistence. - """ - if self.chat_data is None: - return - self.chat_data.pop(chat_id, None) - - if not self.on_flush: - if not self.single_file: - self._dump_file(Path(f"{self.filepath}_chat_data"), self.chat_data) - else: - self._dump_singlefile() - - async def drop_user_data(self, user_id: int) -> None: - """Will delete the specified key from the ``user_data`` and depending on - :attr:`on_flush` save the pickle file. - - .. versionadded:: 20.0 - - Args: - user_id (:obj:`int`): The user id to delete from the persistence. - """ - if self.user_data is None: - return - self.user_data.pop(user_id, None) - - if not self.on_flush: - if not self.single_file: - self._dump_file(Path(f"{self.filepath}_user_data"), self.user_data) - else: - self._dump_singlefile() - - async def refresh_user_data(self, user_id: int, user_data: UD) -> None: - """Does nothing. - - .. versionadded:: 13.6 - .. seealso:: :meth:`telegram.ext.BasePersistence.refresh_user_data` - """ - - async def refresh_chat_data(self, chat_id: int, chat_data: CD) -> None: - """Does nothing. - - .. versionadded:: 13.6 - .. seealso:: :meth:`telegram.ext.BasePersistence.refresh_chat_data` - """ - - async def refresh_bot_data(self, bot_data: BD) -> None: - """Does nothing. - - .. versionadded:: 13.6 - .. seealso:: :meth:`telegram.ext.BasePersistence.refresh_bot_data` - """ - - async def flush(self) -> None: - """Will save all data in memory to pickle file(s).""" - if self.single_file: - if ( - self.user_data - or self.chat_data - or self.bot_data - or self.callback_data - or self.conversations - ): - self._dump_singlefile() - else: - if self.user_data: - self._dump_file(Path(f"{self.filepath}_user_data"), self.user_data) - if self.chat_data: - self._dump_file(Path(f"{self.filepath}_chat_data"), self.chat_data) - if self.bot_data: - self._dump_file(Path(f"{self.filepath}_bot_data"), self.bot_data) - if self.callback_data: - self._dump_file(Path(f"{self.filepath}_callback_data"), self.callback_data) - if self.conversations: - self._dump_file(Path(f"{self.filepath}_conversations"), self.conversations) diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_updater.py b/venv/lib/python3.12/site-packages/telegram/ext/_updater.py deleted file mode 100644 index c67d147..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_updater.py +++ /dev/null @@ -1,779 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains the class Updater, which tries to make creating Telegram bots intuitive.""" - -import asyncio -import contextlib -import datetime as dtm -import ssl -from collections.abc import Coroutine, Sequence -from pathlib import Path -from types import TracebackType -from typing import TYPE_CHECKING, Any, Callable, Optional, TypeVar, Union - -from telegram._utils.defaultvalue import DEFAULT_80, DEFAULT_IP, DefaultValue -from telegram._utils.logging import get_logger -from telegram._utils.repr import build_repr_with_selected_attrs -from telegram._utils.types import DVType, TimePeriod -from telegram.error import TelegramError -from telegram.ext._utils.networkloop import network_retry_loop - -try: - from telegram.ext._utils.webhookhandler import WebhookAppClass, WebhookServer - - WEBHOOKS_AVAILABLE = True -except ImportError: - WEBHOOKS_AVAILABLE = False - -if TYPE_CHECKING: - from socket import socket - - from telegram import Bot - - -_UpdaterType = TypeVar("_UpdaterType", bound="Updater") # pylint: disable=invalid-name -_LOGGER = get_logger(__name__) - - -class Updater(contextlib.AbstractAsyncContextManager["Updater"]): - """This class fetches updates for the bot either via long polling or by starting a webhook - server. Received updates are enqueued into the :attr:`update_queue` and may be fetched from - there to handle them appropriately. - - Instances of this class can be used as asyncio context managers, where - - .. code:: python - - async with updater: - # code - - is roughly equivalent to - - .. code:: python - - try: - await updater.initialize() - # code - finally: - await updater.shutdown() - - .. seealso:: :meth:`__aenter__` and :meth:`__aexit__`. - - .. seealso:: :wiki:`Architecture Overview <Architecture>`, - :wiki:`Builder Pattern <Builder-Pattern>` - - .. versionchanged:: 20.0 - - * Removed argument and attribute ``user_sig_handler`` - * The only arguments and attributes are now :attr:`bot` and :attr:`update_queue` as now - the sole purpose of this class is to fetch updates. The entry point to a PTB application - is now :class:`telegram.ext.Application`. - - Args: - bot (:class:`telegram.Bot`): The bot used with this Updater. - update_queue (:class:`asyncio.Queue`): Queue for the updates. - - Attributes: - bot (:class:`telegram.Bot`): The bot used with this Updater. - update_queue (:class:`asyncio.Queue`): Queue for the updates. - - """ - - __slots__ = ( - "__lock", - "__polling_cleanup_cb", - "__polling_task", - "__polling_task_stop_event", - "_httpd", - "_initialized", - "_last_update_id", - "_running", - "bot", - "update_queue", - ) - - def __init__( - self, - bot: "Bot", - update_queue: "asyncio.Queue[object]", - ): - self.bot: Bot = bot - self.update_queue: asyncio.Queue[object] = update_queue - - self._last_update_id = 0 - self._running = False - self._initialized = False - self._httpd: Optional[WebhookServer] = None - self.__lock = asyncio.Lock() - self.__polling_task: Optional[asyncio.Task] = None - self.__polling_task_stop_event: asyncio.Event = asyncio.Event() - self.__polling_cleanup_cb: Optional[Callable[[], Coroutine[Any, Any, None]]] = None - - async def __aenter__(self: _UpdaterType) -> _UpdaterType: - """ - |async_context_manager| :meth:`initializes <initialize>` the Updater. - - Returns: - The initialized Updater instance. - - Raises: - :exc:`Exception`: If an exception is raised during initialization, :meth:`shutdown` - is called in this case. - """ - try: - await self.initialize() - except Exception: - await self.shutdown() - raise - return self - - async def __aexit__( - self, - exc_type: Optional[type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - """|async_context_manager| :meth:`shuts down <shutdown>` the Updater.""" - # Make sure not to return `True` so that exceptions are not suppressed - # https://docs.python.org/3/reference/datamodel.html?#object.__aexit__ - await self.shutdown() - - def __repr__(self) -> str: - """Give a string representation of the updater in the form ``Updater[bot=...]``. - - As this class doesn't implement :meth:`object.__str__`, the default implementation - will be used, which is equivalent to :meth:`__repr__`. - - Returns: - :obj:`str` - """ - return build_repr_with_selected_attrs(self, bot=self.bot) - - @property - def running(self) -> bool: - return self._running - - async def initialize(self) -> None: - """Initializes the Updater & the associated :attr:`bot` by calling - :meth:`telegram.Bot.initialize`. - - .. seealso:: - :meth:`shutdown` - """ - if self._initialized: - _LOGGER.debug("This Updater is already initialized.") - return - - await self.bot.initialize() - self._initialized = True - - async def shutdown(self) -> None: - """ - Shutdown the Updater & the associated :attr:`bot` by calling :meth:`telegram.Bot.shutdown`. - - .. seealso:: - :meth:`initialize` - - Raises: - :exc:`RuntimeError`: If the updater is still running. - """ - if self.running: - raise RuntimeError("This Updater is still running!") - - if not self._initialized: - _LOGGER.debug("This Updater is already shut down. Returning.") - return - - await self.bot.shutdown() - self._initialized = False - _LOGGER.debug("Shut down of Updater complete") - - async def start_polling( - self, - poll_interval: float = 0.0, - timeout: TimePeriod = dtm.timedelta(seconds=10), - bootstrap_retries: int = 0, - allowed_updates: Optional[Sequence[str]] = None, - drop_pending_updates: Optional[bool] = None, - error_callback: Optional[Callable[[TelegramError], None]] = None, - ) -> "asyncio.Queue[object]": - """Starts polling updates from Telegram. - - .. versionchanged:: 20.0 - Removed the ``clean`` argument in favor of :paramref:`drop_pending_updates`. - - .. versionchanged:: 22.0 - Removed the deprecated arguments ``read_timeout``, ``write_timeout``, - ``connect_timeout``, and ``pool_timeout`` in favor of setting the timeouts via - the corresponding methods of :class:`telegram.ext.ApplicationBuilder`. or - by specifying the timeout via :paramref:`telegram.Bot.get_updates_request`. - - Args: - poll_interval (:obj:`float`, optional): Time to wait between polling updates from - Telegram in seconds. Default is ``0.0``. - timeout (:obj:`int` | :class:`datetime.timedelta`, optional): Passed to - :paramref:`telegram.Bot.get_updates.timeout`. Defaults to - ``timedelta(seconds=10)``. - - .. versionchanged:: v22.2 - |time-period-input| - bootstrap_retries (:obj:`int`, optional): Whether the bootstrapping phase of - will retry on failures on the Telegram server. - - * < 0 - retry indefinitely - * 0 - no retries (default) - * > 0 - retry up to X times - - .. versionchanged:: 21.11 - The default value will be changed to from ``-1`` to ``0``. Indefinite retries - during bootstrapping are not recommended. - allowed_updates (Sequence[:obj:`str`], optional): Passed to - :meth:`telegram.Bot.get_updates`. - - .. versionchanged:: 21.9 - Accepts any :class:`collections.abc.Sequence` as input instead of just a list - drop_pending_updates (:obj:`bool`, optional): Whether to clean any pending updates on - Telegram servers before actually starting to poll. Default is :obj:`False`. - - .. versionadded :: 13.4 - error_callback (Callable[[:exc:`telegram.error.TelegramError`], :obj:`None`], \ - optional): Callback to handle :exc:`telegram.error.TelegramError` s that occur - while calling :meth:`telegram.Bot.get_updates` during polling. Defaults to - :obj:`None`, in which case errors will be logged. Callback signature:: - - def callback(error: telegram.error.TelegramError) - - Note: - The :paramref:`error_callback` must *not* be a :term:`coroutine function`! If - asynchronous behavior of the callback is wanted, please schedule a task from - within the callback. - - Returns: - :class:`asyncio.Queue`: The update queue that can be filled from the main thread. - - Raises: - :exc:`RuntimeError`: If the updater is already running or was not initialized. - - """ - # We refrain from issuing deprecation warnings for the timeout parameters here, as we - # already issue them in `Application`. This means that there are no warnings when using - # `Updater` without `Application`, but this is a rather special use case. - - if error_callback and asyncio.iscoroutinefunction(error_callback): - raise TypeError( - "The `error_callback` must not be a coroutine function! Use an ordinary function " - "instead. " - ) - - async with self.__lock: - if self.running: - raise RuntimeError("This Updater is already running!") - if not self._initialized: - raise RuntimeError("This Updater was not initialized via `Updater.initialize`!") - - self._running = True - - try: - # Create & start tasks - polling_ready = asyncio.Event() - - await self._start_polling( - poll_interval=poll_interval, - timeout=timeout, - bootstrap_retries=bootstrap_retries, - drop_pending_updates=drop_pending_updates, - allowed_updates=allowed_updates, - ready=polling_ready, - error_callback=error_callback, - ) - - _LOGGER.debug("Waiting for polling to start") - await polling_ready.wait() - _LOGGER.debug("Polling updates from Telegram started") - except Exception: - self._running = False - raise - return self.update_queue - - async def _start_polling( - self, - poll_interval: float, - timeout: TimePeriod, - bootstrap_retries: int, - drop_pending_updates: Optional[bool], - allowed_updates: Optional[Sequence[str]], - ready: asyncio.Event, - error_callback: Optional[Callable[[TelegramError], None]], - ) -> None: - _LOGGER.debug("Updater started (polling)") - - # the bootstrapping phase does two things: - # 1) make sure there is no webhook set - # 2) apply drop_pending_updates - await self._bootstrap( - bootstrap_retries, - drop_pending_updates=drop_pending_updates, - webhook_url="", - allowed_updates=None, - ) - - _LOGGER.debug("Bootstrap done") - - async def polling_action_cb() -> bool: - try: - updates = await self.bot.get_updates( - offset=self._last_update_id, - timeout=timeout, - allowed_updates=allowed_updates, - ) - except TelegramError: - # TelegramErrors should be processed by the network retry loop - raise - except Exception as exc: - # Other exceptions should not. Let's log them for now. - _LOGGER.critical( - "Something went wrong processing the data received from Telegram. " - "Received data was *not* processed!", - exc_info=exc, - ) - return True - - if updates: - if not self.running: - _LOGGER.critical( - "Updater stopped unexpectedly. Pulled updates will be ignored and pulled " - "again on restart." - ) - else: - for update in updates: - await self.update_queue.put(update) - self._last_update_id = updates[-1].update_id + 1 # Add one to 'confirm' it - - return True # Keep fetching updates & don't quit. Polls with poll_interval. - - def default_error_callback(exc: TelegramError) -> None: - _LOGGER.exception("Exception happened while polling for updates.", exc_info=exc) - - # Start task that runs in background, pulls - # updates from Telegram and inserts them in the update queue of the - # Application. - self.__polling_task = asyncio.create_task( - network_retry_loop( - is_running=lambda: self.running, - action_cb=polling_action_cb, - on_err_cb=error_callback or default_error_callback, - description="Polling Updates", - interval=poll_interval, - stop_event=self.__polling_task_stop_event, - max_retries=-1, - ), - name="Updater:start_polling:polling_task", - ) - - # Prepare a cleanup callback to await on _stop_polling - # Calling get_updates one more time with the latest `offset` parameter ensures that - # all updates that where put into the update queue are also marked as "read" to TG, - # so we do not receive them again on the next startup - # We define this here so that we can use the same parameters as in the polling task - async def _get_updates_cleanup() -> None: - _LOGGER.debug( - "Calling `get_updates` one more time to mark all fetched updates as read." - ) - try: - await self.bot.get_updates( - offset=self._last_update_id, - # We don't want to do long polling here! - timeout=dtm.timedelta(seconds=0), - allowed_updates=allowed_updates, - ) - except TelegramError: - _LOGGER.exception( - "Error while calling `get_updates` one more time to mark all fetched updates " - "as read: %s. Suppressing error to ensure graceful shutdown. When polling for " - "updates is restarted, updates may be fetched again. Please adjust timeouts " - "via `ApplicationBuilder` or the parameter `get_updates_request` of `Bot`.", - ) - - self.__polling_cleanup_cb = _get_updates_cleanup - - if ready is not None: - ready.set() - - async def start_webhook( - self, - listen: DVType[str] = DEFAULT_IP, - port: DVType[int] = DEFAULT_80, - url_path: str = "", - cert: Optional[Union[str, Path]] = None, - key: Optional[Union[str, Path]] = None, - bootstrap_retries: int = 0, - webhook_url: Optional[str] = None, - allowed_updates: Optional[Sequence[str]] = None, - drop_pending_updates: Optional[bool] = None, - ip_address: Optional[str] = None, - max_connections: int = 40, - secret_token: Optional[str] = None, - unix: Optional[Union[str, Path, "socket"]] = None, - ) -> "asyncio.Queue[object]": - """ - Starts a small http server to listen for updates via webhook. If :paramref:`cert` - and :paramref:`key` are not provided, the webhook will be started directly on - ``http://listen:port/url_path``, so SSL can be handled by another - application. Else, the webhook will be started on - ``https://listen:port/url_path``. Also calls :meth:`telegram.Bot.set_webhook` as required. - - Important: - If you want to use this method, you must install PTB with the optional requirement - ``webhooks``, i.e. - - .. code-block:: bash - - pip install "python-telegram-bot[webhooks]" - - .. seealso:: :wiki:`Webhooks` - - .. versionchanged:: 13.4 - :meth:`start_webhook` now *always* calls :meth:`telegram.Bot.set_webhook`, so pass - ``webhook_url`` instead of calling ``updater.bot.set_webhook(webhook_url)`` manually. - .. versionchanged:: 20.0 - - * Removed the ``clean`` argument in favor of :paramref:`drop_pending_updates` and - removed the deprecated argument ``force_event_loop``. - - Args: - listen (:obj:`str`, optional): IP-Address to listen on. Defaults to - `127.0.0.1 <https://en.wikipedia.org/wiki/Localhost>`_. - port (:obj:`int`, optional): Port the bot should be listening on. Must be one of - :attr:`telegram.constants.SUPPORTED_WEBHOOK_PORTS` unless the bot is running - behind a proxy. Defaults to ``80``. - url_path (:obj:`str`, optional): Path inside url (http(s)://listen:port/<url_path>). - Defaults to ``''``. - cert (:class:`pathlib.Path` | :obj:`str`, optional): Path to the SSL certificate file. - key (:class:`pathlib.Path` | :obj:`str`, optional): Path to the SSL key file. - drop_pending_updates (:obj:`bool`, optional): Whether to clean any pending updates on - Telegram servers before actually starting to poll. Default is :obj:`False`. - - .. versionadded :: 13.4 - bootstrap_retries (:obj:`int`, optional): Whether the bootstrapping phase of - will retry on failures on the Telegram server. - - * < 0 - retry indefinitely - * 0 - no retries (default) - * > 0 - retry up to X times - webhook_url (:obj:`str`, optional): Explicitly specify the webhook url. Useful behind - NAT, reverse proxy, etc. Default is derived from :paramref:`listen`, - :paramref:`port`, :paramref:`url_path`, :paramref:`cert`, and :paramref:`key`. - ip_address (:obj:`str`, optional): Passed to :meth:`telegram.Bot.set_webhook`. - Defaults to :obj:`None`. - - .. versionadded :: 13.4 - allowed_updates (Sequence[:obj:`str`], optional): Passed to - :meth:`telegram.Bot.set_webhook`. Defaults to :obj:`None`. - - .. versionchanged:: 21.9 - Accepts any :class:`collections.abc.Sequence` as input instead of just a list - max_connections (:obj:`int`, optional): Passed to - :meth:`telegram.Bot.set_webhook`. Defaults to ``40``. - - .. versionadded:: 13.6 - secret_token (:obj:`str`, optional): Passed to :meth:`telegram.Bot.set_webhook`. - Defaults to :obj:`None`. - - When added, the web server started by this call will expect the token to be set in - the ``X-Telegram-Bot-Api-Secret-Token`` header of an incoming request and will - raise a :class:`http.HTTPStatus.FORBIDDEN <http.HTTPStatus>` error if either the - header isn't set or it is set to a wrong token. - - .. versionadded:: 20.0 - unix (:class:`pathlib.Path` | :obj:`str` | :class:`socket.socket`, optional): Can be - either: - - * the path to the unix socket file as :class:`pathlib.Path` or :obj:`str`. This - will be passed to `tornado.netutil.bind_unix_socket <https://www.tornadoweb.org/ - en/stable/netutil.html#tornado.netutil.bind_unix_socket>`_ to create the socket. - If the Path does not exist, the file will be created. - - * or the socket itself. This option allows you to e.g. restrict the permissions of - the socket for improved security. Note that you need to pass the correct family, - type and socket options yourself. - - Caution: - This parameter is a replacement for the default TCP bind. Therefore, it is - mutually exclusive with :paramref:`listen` and :paramref:`port`. When using - this param, you must also run a reverse proxy to the unix socket and set the - appropriate :paramref:`webhook_url`. - - .. versionadded:: 20.8 - .. versionchanged:: 21.1 - Added support to pass a socket instance itself. - Returns: - :class:`queue.Queue`: The update queue that can be filled from the main thread. - - Raises: - :exc:`RuntimeError`: If the updater is already running or was not initialized. - """ - if not WEBHOOKS_AVAILABLE: - raise RuntimeError( - "To use `start_webhook`, PTB must be installed via `pip install " - '"python-telegram-bot[webhooks]"`.' - ) - # unix has special requirements what must and mustn't be set when using it - if unix: - error_msg = ( - "You can not pass unix and {0}, only use one. Unix if you want to " - "initialize a unix socket, or {0} for a standard TCP server." - ) - if not isinstance(listen, DefaultValue): - raise RuntimeError(error_msg.format("listen")) - if not isinstance(port, DefaultValue): - raise RuntimeError(error_msg.format("port")) - if not webhook_url: - raise RuntimeError( - "Since you set unix, you also need to set the URL to the webhook " - "of the proxy you run in front of the unix socket." - ) - - async with self.__lock: - if self.running: - raise RuntimeError("This Updater is already running!") - if not self._initialized: - raise RuntimeError("This Updater was not initialized via `Updater.initialize`!") - - self._running = True - - try: - # Create & start tasks - webhook_ready = asyncio.Event() - - await self._start_webhook( - listen=DefaultValue.get_value(listen), - port=DefaultValue.get_value(port), - url_path=url_path, - cert=cert, - key=key, - bootstrap_retries=bootstrap_retries, - drop_pending_updates=drop_pending_updates, - webhook_url=webhook_url, - allowed_updates=allowed_updates, - ready=webhook_ready, - ip_address=ip_address, - max_connections=max_connections, - secret_token=secret_token, - unix=unix, - ) - - _LOGGER.debug("Waiting for webhook server to start") - await webhook_ready.wait() - _LOGGER.debug("Webhook server started") - except Exception: - self._running = False - raise - - # Return the update queue so the main thread can insert updates - return self.update_queue - - async def _start_webhook( - self, - listen: str, - port: int, - url_path: str, - bootstrap_retries: int, - allowed_updates: Optional[Sequence[str]], - cert: Optional[Union[str, Path]] = None, - key: Optional[Union[str, Path]] = None, - drop_pending_updates: Optional[bool] = None, - webhook_url: Optional[str] = None, - ready: Optional[asyncio.Event] = None, - ip_address: Optional[str] = None, - max_connections: int = 40, - secret_token: Optional[str] = None, - unix: Optional[Union[str, Path, "socket"]] = None, - ) -> None: - _LOGGER.debug("Updater thread started (webhook)") - - if not url_path.startswith("/"): - url_path = f"/{url_path}" - - # Create Tornado app instance - app = WebhookAppClass(url_path, self.bot, self.update_queue, secret_token) - - # Form SSL Context - # An SSLError is raised if the private key does not match with the certificate - # Note that we only use the SSL certificate for the WebhookServer, if the key is also - # present. This is because the WebhookServer may not actually be in charge of performing - # the SSL handshake, e.g. in case a reverse proxy is used - if cert is not None and key is not None: - try: - ssl_ctx: Optional[ssl.SSLContext] = ssl.create_default_context( - ssl.Purpose.CLIENT_AUTH - ) - ssl_ctx.load_cert_chain(cert, key) # type: ignore[union-attr] - except ssl.SSLError as exc: - raise TelegramError("Invalid SSL Certificate") from exc - else: - ssl_ctx = None - # Create and start server - self._httpd = WebhookServer(listen, port, app, ssl_ctx, unix) - - if not webhook_url: - webhook_url = self._gen_webhook_url( - protocol="https" if ssl_ctx else "http", - listen=DefaultValue.get_value(listen), - port=port, - url_path=url_path, - ) - - # We pass along the cert to the webhook if present. - await self._bootstrap( - # Passing a Path or string only works if the bot is running against a local bot API - # server, so let's read the contents - cert=Path(cert).read_bytes() if cert else None, - max_retries=bootstrap_retries, - drop_pending_updates=drop_pending_updates, - webhook_url=webhook_url, - allowed_updates=allowed_updates, - ip_address=ip_address, - max_connections=max_connections, - secret_token=secret_token, - ) - - await self._httpd.serve_forever(ready=ready) - - @staticmethod - def _gen_webhook_url(protocol: str, listen: str, port: int, url_path: str) -> str: - # TODO: double check if this should be https in any case - the docs of start_webhook - # say differently! - return f"{protocol}://{listen}:{port}{url_path}" - - async def _bootstrap( - self, - max_retries: int, - webhook_url: Optional[str], - allowed_updates: Optional[Sequence[str]], - drop_pending_updates: Optional[bool] = None, - cert: Optional[bytes] = None, - bootstrap_interval: float = 1, - ip_address: Optional[str] = None, - max_connections: int = 40, - secret_token: Optional[str] = None, - ) -> None: - """Prepares the setup for fetching updates: delete or set the webhook and drop pending - updates if appropriate. If there are unsuccessful attempts, this will retry as specified by - :paramref:`max_retries`. - """ - - async def bootstrap_del_webhook() -> bool: - _LOGGER.debug("Deleting webhook") - if drop_pending_updates: - _LOGGER.debug("Dropping pending updates from Telegram server") - await self.bot.delete_webhook(drop_pending_updates=drop_pending_updates) - return False - - async def bootstrap_set_webhook() -> bool: - _LOGGER.debug("Setting webhook") - if drop_pending_updates: - _LOGGER.debug("Dropping pending updates from Telegram server") - await self.bot.set_webhook( - url=webhook_url, # type: ignore[arg-type] - certificate=cert, - allowed_updates=allowed_updates, - ip_address=ip_address, - drop_pending_updates=drop_pending_updates, - max_connections=max_connections, - secret_token=secret_token, - ) - return False - - # Dropping pending updates from TG can be efficiently done with the drop_pending_updates - # parameter of delete/start_webhook, even in the case of polling. Also, we want to make - # sure that no webhook is configured in case of polling, so we just always call - # delete_webhook for polling - if drop_pending_updates or not webhook_url: - await network_retry_loop( - is_running=lambda: self.running, - action_cb=bootstrap_del_webhook, - description="Bootstrap delete Webhook", - interval=bootstrap_interval, - stop_event=None, - max_retries=max_retries, - ) - - # Restore/set webhook settings, if needed. Again, we don't know ahead if a webhook is set, - # so we set it anyhow. - if webhook_url: - await network_retry_loop( - is_running=lambda: self.running, - action_cb=bootstrap_set_webhook, - description="Bootstrap Set Webhook", - interval=bootstrap_interval, - stop_event=None, - max_retries=max_retries, - ) - - async def stop(self) -> None: - """Stops the polling/webhook. - - .. seealso:: - :meth:`start_polling`, :meth:`start_webhook` - - Raises: - :exc:`RuntimeError`: If the updater is not running. - """ - async with self.__lock: - if not self.running: - raise RuntimeError("This Updater is not running!") - - _LOGGER.debug("Stopping Updater") - - self._running = False - - await self._stop_httpd() - await self._stop_polling() - - _LOGGER.debug("Updater.stop() is complete") - - async def _stop_httpd(self) -> None: - """Stops the Webhook server by calling ``WebhookServer.shutdown()``""" - if self._httpd: - _LOGGER.debug("Waiting for current webhook connection to be closed.") - await self._httpd.shutdown() - self._httpd = None - - async def _stop_polling(self) -> None: - """Stops the polling task by awaiting it.""" - if self.__polling_task: - _LOGGER.debug("Waiting background polling task to finish up.") - self.__polling_task_stop_event.set() - - with contextlib.suppress(asyncio.CancelledError): - await self.__polling_task - # It only fails in rare edge-cases, e.g. when `stop()` is called directly - # after start_polling(), but lets better be safe than sorry ... - - self.__polling_task = None - self.__polling_task_stop_event.clear() - - if self.__polling_cleanup_cb: - await self.__polling_cleanup_cb() - self.__polling_cleanup_cb = None - else: - _LOGGER.warning( - "No polling cleanup callback defined. The last fetched updates may be " - "fetched again on the next polling start." - ) diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_utils/__init__.py b/venv/lib/python3.12/site-packages/telegram/ext/_utils/__init__.py deleted file mode 100644 index da47adb..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_utils/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_utils/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/_utils/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 7e82044ab0a97d4bb992a04a75967c053586ad9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212 zcmZ9HJqp4=5QTS*f(W^TtwkKvR;;YO!m=iVS=^tnJBbDlVrTDJJcb7lNoVDz68vCb z-tY$Ad!*@vMP9c{IZYUQ_Tryz7%x}WvKimqnIA;e^`1|F(isFJDKxNkd2P^A078ui zFHIIm<wx{c;Z9aNS)hjoZ39~Ep=zmgb~RrtAt=JElKD{{@b?XPCJ;3#9Y6?W6$vq~ a+Ru1xTv2P>_)*Nj<Ai>BC!BL1E3hwx!8|_z diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_utils/__pycache__/_update_parsing.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/_utils/__pycache__/_update_parsing.cpython-312.pyc deleted file mode 100644 index cdae3dcb4052c0b882503178ebe24281e02a7a57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1880 zcmbVN-%A`v9G|&e@7D8IDq5??c7oXC1a}i{Ll9BRh0+qR1yfRla*n%m-p0M%WoFNK z#!_4I);>rn)rU~bn?(xdE&oGa&MF9t4~0@_pL)d>TA%uz-MdrM(uWT0?04t;`ObX5 z^Z9)5p0~B75sY8Id06-|h0u@kqduBy#)$>SCbG~RvapqKa4|8Lz|vM6rKrxSV5=;_ zRMylBNcmVzEE#|0RV(>Ool9A%2%%j-L|=f=0MT4-&ZOxbjL_YJElAO`N)98Y=LXbv z1t~DcXPo3qt{K=KEO6$~fLSE)h)=n&-9=LJEm#tSy0BbeHjl!Y8wfp})^)PX0Oz^X zvY0hKPDZcmx6<i*l)Df-o+dD|aGb;wFAqDMr9n9(wsb+HJaK`Mk^ob#ahEzynJkp$ znZ&UdIOXLihhf(XhHH*!dx+sW$rh-)2x-DTFP;GbGG}31jKlT|oY5s&nOO^wl@)23 zNF3x~d1k2y`9_&UC&(0Hu;VT2>0cy;860Zw`SRAN1GX}oy&I+g6y$6xOmY^KxNE|_ zH--w90?$bSrcJbl*3&`5zgvUNqCjGzv4#Q}6OG+O{N}A^F>9!RcWXO9Tw|{_bheto ztM9*Mn#_mWr?Q5C*cS05hmOM{(j_Z3M@({@yTs?Yx5`|>g7X+XqlC>3PnfnrB_g1% z$wCE~%U~`gE@V37bk!($MP?LfAeN2WwTl%-z#O*7X>mjZwz<Ukh~+(S9ghM*#xir4 z4Itd`%R#|&$MhSchOh%R;!|^p0>zDJgRKNct`yjgfLA2bTursQUk=-(&2lwPcq=4y zMP_ybrgii~s(t;F<BnH8e^}A_j#DpfTzx!tn0gIXwytjV9&`*=w87(+u8n&KEdv#G z-~@tDs7bB4w8$<nE9;Gz{R)i#&20a92Jgeq#*4#hu>J46TZu=Ys@tfprE@A!RzE#c zLA{25%AoG~PaQNsdej@U0k?f<JK3d-TC%U^=cniAiJd1tX95~22A<;S3%4e<JqFLo zBusY@j&AOwZiGI@YxsUc&1bh@HFW(o-ozMv(W9a={!V#-GYNhPa5K<{t(+CTWd<kb z?UhU-Oz77`r6jnJ4MYfUf!AsC#3FOqiq9ukuf!s$7o|@)o=F`ssW%{_5Fz?u`WgMX zj=t}j+7TPGN8LmF-9y{vQTOnE*VJD^7V}yE0M4jf1Cuwy6e=R%yb~<wiFSC!JrSi4 zwqHD#_ke#`V%~;n9aS}?U8<yd&I|O~<LqIINP%8E>NEEHj6LO`?~O|Dn+F{?E80yE zE2OelIP97_Xql?0Q@jnfn#rWYR4xa<X}MgO49Y$b#HCon?s^mIaSQ3-WP-~|xcvKy z3z1#JUzU^1@LLpZ8sDNe5&xY`^2^|ogozJeswx=c-(J_S`bQ_imw!S-)npRCx^-(i zyQ4gLXTN`>ir{-M^DO&RKapm&Q^V7E>%(nxXYfg3f550Bxv=-{GxO=p?~xrH`!{vH B?au%J diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_utils/__pycache__/asyncio.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/_utils/__pycache__/asyncio.cpython-312.pyc deleted file mode 100644 index 90de5fd42c138b2b6d8261a2c1315be33a793ebb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2280 zcmaJ?&2Jk;6rb7k+8Z~H+lJDQh-BJ^7FUhk1W}|2Aw(+>qRJ(aD*3XRc*gOz>s@zd zH>uMgMQQ|%RE}-J1#u**_)EAn(2}wO35g3m;b1DNo_I4}r*%*mY2Un^nfI~3-+Qy) z=W<yD<Ik^e)$V2x`dz(rhm|Ppk3d;R43!bX%<ym-!)$s+-7K3J8R%ogQmcqr9AC4$ z#xLgwW=AhuO{0*emoY*!HCK{)z#@;6O5lgo^(CosufYYWMt&u916UB;qakM`3`khx zM22k4bLR+^O~2v>iG4AfEf&cF7ZPkJW1LM+l8N!+_;@yZl?vbW=O?oS#wCcu{ZNvi z3hrLUr-Bn#ZGou@HOEOLK~-zQr=Hg&b4{H91Q%2^3H2E{=Lg}rWJ9|L8&M>eYSf?S zvXgRe3@}jNDqY3}xStc8UWepJB{5N6>$FMKImm$pm8cH+>P&P5g+b@A7t9y4PZg?D z1srFtxR5FJDlZ{NXqUTdu=)kC#}TlG$_B$_lNsd{JHSkCu@tkasXM5OS$Z{BPV)>) zajR;u%xdaE;;(GOS|78I!+X`xXZu$B%URa1^(^QI?x35v+&_&9x%lXepq1;KeHcUv z(rI3&janf1($CXwy#a*FXs+T>sfn1>+T?7)X>qU7EC5eK5-OK~szM+V0$?Ev)QfnB zORnLO-9SZhwdO(`IIXCaz!#xmDBQUy<Yac%(WbMrz_9ixBPcta$9dw0XC-L}cL54d z^Ssz`&I12zNERssh7y6oY?8o-(?uP66UPHil32%kZ0R6zTJSIu{#3<yg&frn>S<4a zxQEwKxVyP#ETb=hyJh?U+C&Wu`Z98M?VD&5PZiAA(rL%G<G8*XI*x$uMX;Wd+^Y)J zhH;<c=+AN-slpMm@<NnqL7kWCG?WXa%SnmJQpi0%FKB&ChAwa?##pfEdjW+~EiG_= zp#-I0YBa-I;J;lQpD0PFxUmLsLZR4qtxNo7SaPD!^<=3_Xrn1|5POO2Qx(N-{%^r4 zc?`t!74(apTgz<O$2N{UvPYf_pT3iNY!9_z4^<LWln&4&IGzAy9W5hO>wCvE5(i*S zq(Kz07=TGCLn01>jB`D-Exoy4nmxzPD<{g+3i>TSxSc<>l|S{+J|zyp(o9c^3isRa zv}+*l;ZGsw9=d^AMR&K=Zo?&e3vBKi>*nW{1*eyxv96`Sc+X&X=_tTqyiyp(yXfwT z@61J9FsGiXPn;>3q95isLn}8TS8!b;n}!BK<Y7muvLY)Q3h_GVOC$RMkhr*@tdw~E zhh}PEaBY4q_;Fxl+a7rcWZC`O_RtUZ(8i4|n*eK1@`Ei4^^q4+WpexQ1iptar0x$* z;Q!#Huxeicv8N^WVD!J3K&|y)f(pizI08O*p@81y6z*!(E&?Fz#X#M0`(u#UzN4&$ zL3B%XE&s?q-uvl4*+aS<pyYITL-c{c6x@%{u|BPH$BDC!)A<L2-tRa!BI+eO8OMS9 zAC{qor5A(}R1<zkx|d?RAp*Fv!loDmpF-iL$rCF3IG1#Ng?pakKzvQKs)r9cJgZ-W zP=dfCuY!2KigpasvRhenXmsV1os?mXZd6(brf)}|si|e7^gzqN*69uT7lNs6b{AS{ z(|T=V@tg3g&z>Pr|H&HG$sI5{sR7WD3Tg2M#DPNW{JZ0H*lfVhPv;&V+<WV5n@!ZQ zS8e*jey@Yn`{E3|s*jPQAX+BIc;}3bQ|-eD=YK^f{!SmoCpYG|hc9joUwnq(MSJ-d DVth?8 diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_utils/__pycache__/networkloop.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/_utils/__pycache__/networkloop.cpython-312.pyc deleted file mode 100644 index d96f90e6d3991d80364cee2762848353f91c61c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6434 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 diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_utils/__pycache__/stack.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/_utils/__pycache__/stack.cpython-312.pyc deleted file mode 100644 index eefd1d2f4e087ba83f0cd744572478017e634d38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2421 zcmc&$&2Jk;6rZ)d-t||Vv<+?f(p03#Tby-2q)Ma^scI8MRHdjyv^9tIdUtGZvfj03 z)=mrw$^oPnkkXz~aX>wS!XYQb|G<SbheWG#K)`_$h7<{v3vXtfq^TltWR%Rjc{A_( zH*fuYE|*3ye*f~r#`8e^%r`qD*(bI;K&&7em60vkF;{BF$}x%4aW~#floNtZxN<XD zP6}Ffm8M!&B@{zMC8<>@(o{~{Ns=Uq6R@=v60=p3sU_{y$BA+lP7+V?(!k4gGg{Uh z2jS_4!*J8L+b+SD?**pgG29?-i%?u^dsg81z@Wr617hRA$8g>v!1n4mXb{|@ew~_4 z%mUMz)zfKR#~nf$NSU@x?9owt?u>pWoxWjG4`fEu7{+BVM7)4uzXnS7955*X{cr@5 z+*Xy~HUpCLsAsxv7gxK&tm{;%NxRteY<$}DgVX&3p&n$YjxRS%uTB`(^Q;XJ;K4G- zCKS|HDKTexKvrLbYi*ic%<q8@wr{nY;IHsRSm2RImtDWEr+?!`(4;W&ju|vyO-(>b z$aJ?wV544Z@g$lq(CIn}3=pXk8p<_(DNI@r7i^Q11a0bBv8bS8mSK*=|Mmh*D`){N zN!?fq1^uEU;4Db1eTjF`D=65N9!B)!Vk}4qJuuBEJJjB4#}{JXBzEK_bPIsD82c#J zjYaF6G>7Knx6quV$>wXI`f`I<vkW`DYEXKU@#2Uu@SMr8hy>CZm59T{sX6?H;}U=d zul)GD*=)Haf&pg$UM$}xfRk1iN)p}T2Yif;jd8_Bq}Zr-3w`wIR-00&h_GGIikK(9 zU>MwzVQ8AL73siunzl)#_Y$p(Lb5&kk@tmBzdAEonb;{?MH|J_5Mp#X0w`<?^zpEx zI^mA#wg~`upQ%daU<WG|9lu?}k(DXmBNYs&j}llE$=s)P&T(A;-agfR4^5YmioSai zfd}{fZ$TE|W#~K`JcJ2I2WU3~%o={%h0^dXKvzJnUy|zrcTc4xvQ+hbw=#-vGzdsg zAr@uhzbnlXKQ-~e<b(<K#Y46@a5!!bQc;QAffQY0tlf+{3;65=0#)z`b^eUVyk$6E z&DRp)A!8pZ!qoV@MZ_x$731o)x854R9?CYUw(DA)a^O=HrZ5gF7=KUT-;-9U;WtUC zX$GuQy3&8)tP~KJ@P;<R0>_#qbj0@OJl8j&Q<OTy>y#kBrB*j+_}+Q_?70$i0y5Hq z-e*Fu*_AGl`JiO91IJ~hs57>@VQ!z(^e{Mb3jWz7OiQRYjMUuH;#U4>FQLdokMb|w zClB7+$QOT5i+?}L9Q_l?z*Y0hxjVV7?9HvA<2@Oro_mbqsq|wN4GjI$%fO8%Yyi}K zk{LwzQWxW29J>(zR=ybD*Hw51L{~WsePm@{H<{V(A8@BXW_EkX4hNyteg`_JtE~2~ zEl9Hk$h_2*7SIgO|1*P59?W0-|2&dDpX|o8_|)`-CR3iGFj+HrdkQm_FPe+TTed<8 z^W6^g?wV1B(rd9jkTIS?jOidOG`llh0fN<FT0*}lncL&bSMOZi%nq+-hc}c{o65+# zGP0qR)-F6$Uf;?e*-Gb^i=P&^28LF$_p-O;N16OxnUk9Xh4q2LMn>DroL$eH-N>9@ z>paZ7xpm}NPeGZ1<>F_>o{F-A+h7SzX@}r781V5jj8N&fhA1jIfKL;nys%*sXn1mz ze`~^HJMh;d@ap_q#ZUPUmQXbe9=~DGLwuXyEkeLp1o}0i$AK*(f1<t-{iYbBCxOS& z!rq6e7ndaIk5^SG@z-G_o%j*G0Dr$C{ipQNyEiw|FE1&*<creK{o@a`^%KP&0(#9B d%Xh&x-}S~+Y4E<*L$G``EtWO=G2aQ}{{kudc(MQh diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_utils/__pycache__/trackingdict.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/_utils/__pycache__/trackingdict.cpython-312.pyc deleted file mode 100644 index 1049645c2d8d4b56c3560e6df4fbca2c9b8c2e2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5761 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 X>GbleE2FDjD_1uThjus=u?7DJ3ypR4 diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_utils/__pycache__/types.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/_utils/__pycache__/types.cpython-312.pyc deleted file mode 100644 index 1d818f589bcbd6a98a33cf83f6985fd8bc8d3fa7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1941 zcmb7EO>7%Q6y6{2dcE<#^W!9?*`~DMs<A0)Q#GP3jZ+f(6KLv!*s6-w-buW4f2`Sc zsEdS*xFAls;a-q?3o3^k!;L!^TLh_$gsKX0;DoClkb2_HdSlYwSj(U0eeY-9d-G;~ zj>TjKzQ4cwyqb+N%pX+P|D<5?oUjb@Eu%9kqq90^vKFUu7O(Owm3cE{394X;s%VAP zuqCOI6;UHBg9JPZ`Vi=4RrYNKbI6LSQGYF(F)Oadt%RDel4_D=I0i|2SeJf?JmUI0 ztEotzl^;O{^i$Km)zCoBpfJjy)CPw*B*HJf&X0rLI!93*jxeB4ZLon>d`UY3+EEli zV<_9V*Q0^oIO5Sbnh2yx-|i6DX3=ZtFre7i^rO+8d^U&@cufVl$MpDtij;s&3@SJh zFv$Tk9Wbc@b2MPmD57WReg`7H9_WVkkpt|pfE^vgI1W|N+z%n~K!@IFjODW0G_<!= zHC)AV^ty?Zier14VY^DD?s|@;c#WE2Zz!5+XfAT|vYgK=n+UsxV{5vO^!a(^)NFoE zmOs|84VLq=0$&lLAlq{lXI=3QMAtA<45|W8#dDN0QtB=&DTi&%G#g5}0Uk&(jWX77 zL(yzqIbl2Ai9q3p2OpeQidD_tKrW5*>K@=gD{&1SVF+KwNV`kRs01!Fs--m)Y6m&! zPNi-^zJ4bD4m5?nvFU8&<-efuOpYUwqJy2fXV{3uuh%`TY@+L0jdmy}kXY%H4==A3 zmoFEuzQ3|W_)B(!NJS`$nvrm+Q9~bTm<YFQXkLyb(g!t<w$X$&zu<T|o+K8a%d47) zt{IjAEg=c&U)Cyj{f^%Ah;+p%->9QHB7Ct}x_|T){cYIvr1BEnf$&1vsoOf?R!fAt zRmu}?p@fH^B#;&fSA_op{IA@|aVt3P^Q+hHkMHMq`<1Nj5OMX|rPZaIE4epGcx?^Z zx3)$S6~{DDg_h*zwQ>dX5D158G_gNLSfGqZAxwe3GB`qkzC=Xwkcl?1X7y8x?u&VJ z&%^LSF*rtn=7$p$QWVkvB(V%9Y9hSf4Kf668VG_{ufYlMFlB^yJ=#^rrbDdJWUrzI z5uNg<kUB{oR4f|6giOQrh_G%t8VEY2!o|hnqULEhL-!x1FhXIJ!We}t1$xy;{5`{j zbEM`p-1p3LV3`-SLe;TQ!O}c;v#=OUpIg|kc*gaN%3XwKbmuc0c7`b~Y$AKJ0Jox0 zYj{=1p3R?nyWql%%+z2yG`I%??*jCzum)3V0tZ9q=4*`?(mVYNegPLC0s5x8-vIV_ zmSvwEm)OuhX@;G9!d(27x%iY%{vMk8Gj!-lXsH`odMd`gMxDub_ryz0zQ^%w=$Xs_ zSNiHsllx7G_7{)S6Rm|d-#XVecKDr}yVE<-?(y@T$@AUxg=WHc>q$&vti^BDTgEoO zeRJpNcC34Nt}`~*jh}4}^-W|ZlWhsDN_)0deURABbh0PA>6vEYapp+7urt@0KG)66 zcbH_43$dYIlo?8Hg|=?BX4^vB+b-^8wwE7%(V0Bc9hvJU&+ZQIR(_h@t^RnplU(Y` z%gu0)6CnM#pMGm(Pnc?Q{feYPMgK=`jdZ38-SM~fgi|yS$4)%!2kMNU-V@IJ$H}R! i>@Sgtrsx~>L?%7DRcW1W^AFB#+1=E!FXMOy&g5S;10UA_ diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_utils/__pycache__/webhookhandler.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/ext/_utils/__pycache__/webhookhandler.cpython-312.pyc deleted file mode 100644 index e919163a9e74a31968e0dce8a07bef8fd3702be1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10446 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 diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_utils/_update_parsing.py b/venv/lib/python3.12/site-packages/telegram/ext/_utils/_update_parsing.py deleted file mode 100644 index 2d62a6b..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_utils/_update_parsing.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains helper functions related to parsing updates and their contents. - -.. versionadded:: 20.8 - -Warning: - Contents of this module are intended to be used internally by the library and *not* by the - user. Changes to this module are not considered breaking changes and may not be documented in - the changelog. -""" -from typing import Optional - -from telegram._utils.types import SCT - - -def parse_chat_id(chat_id: Optional[SCT[int]]) -> frozenset[int]: - """Accepts a chat id or collection of chat ids and returns a frozenset of chat ids.""" - if chat_id is None: - return frozenset() - if isinstance(chat_id, int): - return frozenset({chat_id}) - return frozenset(chat_id) - - -def parse_username(username: Optional[SCT[str]]) -> frozenset[str]: - """Accepts a username or collection of usernames and returns a frozenset of usernames. - Strips the leading ``@`` if present. - """ - if username is None: - return frozenset() - if isinstance(username, str): - return frozenset({username.removeprefix("@")}) - return frozenset(usr.removeprefix("@") for usr in username) diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_utils/asyncio.py b/venv/lib/python3.12/site-packages/telegram/ext/_utils/asyncio.py deleted file mode 100644 index 722c1c3..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_utils/asyncio.py +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains helper functions related to the std-lib asyncio module. - -.. versionadded:: 21.11 - -Warning: - Contents of this module are intended to be used internally by the library and *not* by the - user. Changes to this module are not considered breaking changes and may not be documented in - the changelog. -""" -import asyncio -from typing import Literal - - -class TrackedBoundedSemaphore(asyncio.BoundedSemaphore): - """Simple subclass of :class:`asyncio.BoundedSemaphore` that tracks the current value of the - semaphore. While there is an attribute ``_value`` in the superclass, it's private and we - don't want to rely on it. - """ - - __slots__ = ("_current_value",) - - def __init__(self, value: int = 1) -> None: - super().__init__(value) - self._current_value = value - - @property - def current_value(self) -> int: - return self._current_value - - async def acquire(self) -> Literal[True]: - await super().acquire() - self._current_value -= 1 - return True - - def release(self) -> None: - super().release() - self._current_value += 1 diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_utils/networkloop.py b/venv/lib/python3.12/site-packages/telegram/ext/_utils/networkloop.py deleted file mode 100644 index 2cc9311..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_utils/networkloop.py +++ /dev/null @@ -1,153 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains a network retry loop implementation. -Its specifically tailored to handling the Telegram API and its errors. - -.. versionadded:: 21.11 - -Hint: - It was originally part of the `Updater` class, but as part of #4657 it was extracted into its - own module to be used by other parts of the library. - -Warning: - Contents of this module are intended to be used internally by the library and *not* by the - user. Changes to this module are not considered breaking changes and may not be documented in - the changelog. -""" -import asyncio -import contextlib -from collections.abc import Coroutine -from typing import Callable, Optional - -from telegram._utils.logging import get_logger -from telegram.error import InvalidToken, RetryAfter, TelegramError, TimedOut - -_LOGGER = get_logger(__name__) - - -async def network_retry_loop( - *, - action_cb: Callable[..., Coroutine], - on_err_cb: Optional[Callable[[TelegramError], None]] = None, - description: str, - interval: float, - stop_event: Optional[asyncio.Event] = None, - is_running: Optional[Callable[[], bool]] = None, - max_retries: int, -) -> None: - """Perform a loop calling `action_cb`, retrying after network errors. - - Stop condition for loop: - * `is_running()` evaluates :obj:`False` or - * return value of `action_cb` evaluates :obj:`False` - * or `stop_event` is set. - * or `max_retries` is reached. - - Args: - action_cb (:term:`coroutine function`): Network oriented callback function to call. - on_err_cb (:obj:`callable`): Optional. Callback to call when TelegramError is caught. - Receives the exception object as a parameter. - - Hint: - Only required if you want to handle the error in a special way. Logging about - the error is already handled by the loop. - - Important: - Must not raise exceptions! If it does, the loop will be aborted. - description (:obj:`str`): Description text to use for logs and exception raised. - interval (:obj:`float` | :obj:`int`): Interval to sleep between each call to - `action_cb`. - stop_event (:class:`asyncio.Event` | :obj:`None`): Event to wait on for stopping the - loop. Setting the event will make the loop exit even if `action_cb` is currently - running. Defaults to :obj:`None`. - is_running (:obj:`callable`): Function to check if the loop should continue running. - Must return a boolean value. Defaults to `lambda: True`. - max_retries (:obj:`int`): Maximum number of retries before stopping the loop. - - * < 0: Retry indefinitely. - * 0: No retries. - * > 0: Number of retries. - - """ - log_prefix = f"Network Retry Loop ({description}):" - effective_is_running = is_running or (lambda: True) - - async def do_action() -> bool: - if not stop_event: - return await action_cb() - - action_cb_task = asyncio.create_task(action_cb()) - stop_task = asyncio.create_task(stop_event.wait()) - done, pending = await asyncio.wait( - (action_cb_task, stop_task), return_when=asyncio.FIRST_COMPLETED - ) - with contextlib.suppress(asyncio.CancelledError): - for task in pending: - task.cancel() - - if stop_task in done: - _LOGGER.debug("%s Cancelled", log_prefix) - return False - - return action_cb_task.result() - - _LOGGER.debug("%s Starting", log_prefix) - cur_interval = interval - retries = 0 - while effective_is_running(): - try: - if not await do_action(): - break - except RetryAfter as exc: - slack_time = 0.5 - _LOGGER.info( - "%s %s. Adding %s seconds to the specified time.", log_prefix, exc, slack_time - ) - # pylint: disable=protected-access - cur_interval = slack_time + exc._retry_after.total_seconds() - except TimedOut as toe: - _LOGGER.debug("%s Timed out: %s. Retrying immediately.", log_prefix, toe) - # If failure is due to timeout, we should retry asap. - cur_interval = 0 - except InvalidToken: - _LOGGER.exception("%s Invalid token. Aborting retry loop.", log_prefix) - raise - except TelegramError as telegram_exc: - if on_err_cb: - on_err_cb(telegram_exc) - - if max_retries < 0 or retries < max_retries: - _LOGGER.debug( - "%s Failed run number %s of %s. Retrying.", log_prefix, retries, max_retries - ) - else: - _LOGGER.exception( - "%s Failed run number %s of %s. Aborting.", log_prefix, retries, max_retries - ) - raise - - # increase waiting times on subsequent errors up to 30secs - cur_interval = 1 if cur_interval == 0 else min(30, 1.5 * cur_interval) - else: - cur_interval = interval - finally: - retries += 1 - - if cur_interval: - await asyncio.sleep(cur_interval) diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_utils/stack.py b/venv/lib/python3.12/site-packages/telegram/ext/_utils/stack.py deleted file mode 100644 index e4eef2b..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_utils/stack.py +++ /dev/null @@ -1,76 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains helper functions related to inspecting the program stack. - -.. versionadded:: 20.0 - -Warning: - Contents of this module are intended to be used internally by the library and *not* by the - user. Changes to this module are not considered breaking changes and may not be documented in - the changelog. -""" -from pathlib import Path -from types import FrameType -from typing import Optional - -from telegram._utils.logging import get_logger - -_LOGGER = get_logger(__name__) - - -def was_called_by(frame: Optional[FrameType], caller: Path) -> bool: - """Checks if the passed frame was called by the specified file. - - Example: - .. code:: pycon - - >>> was_called_by(inspect.currentframe(), Path(__file__)) - True - - Arguments: - frame (:obj:`FrameType`): The frame - usually the return value of - ``inspect.currentframe()``. If :obj:`None` is passed, the return value will be - :obj:`False`. - caller (:obj:`pathlib.Path`): File that should be the caller. - - Returns: - :obj:`bool`: Whether the frame was called by the specified file. - """ - if frame is None: - return False - - try: - return _was_called_by(frame, caller) - except Exception as exc: - _LOGGER.debug( - "Failed to check if frame was called by `caller`. Assuming that it was not.", - exc_info=exc, - ) - return False - - -def _was_called_by(frame: FrameType, caller: Path) -> bool: - # https://stackoverflow.com/a/57712700/10606962 - if Path(frame.f_code.co_filename).resolve() == caller: - return True - while frame.f_back: - frame = frame.f_back - if Path(frame.f_code.co_filename).resolve() == caller: - return True - return False diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_utils/trackingdict.py b/venv/lib/python3.12/site-packages/telegram/ext/_utils/trackingdict.py deleted file mode 100644 index 810ecc6..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_utils/trackingdict.py +++ /dev/null @@ -1,125 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains a mutable mapping that keeps track of the keys that where accessed. - -.. versionadded:: 20.0 - -Warning: - Contents of this module are intended to be used internally by the library and *not* by the - user. Changes to this module are not considered breaking changes and may not be documented in - the changelog. -""" -from collections import UserDict -from collections.abc import Mapping -from typing import Final, Generic, Optional, TypeVar, Union - -from telegram._utils.defaultvalue import DEFAULT_NONE, DefaultValue - -_VT = TypeVar("_VT") -_KT = TypeVar("_KT") -_T = TypeVar("_T") - - -class TrackingDict(UserDict, Generic[_KT, _VT]): - """Mutable mapping that keeps track of which keys where accessed with write access. - Read-access is not tracked. - - Note: - * ``setdefault()`` and ``pop`` are considered writing only depending on whether the - key is present - * deleting values is considered writing - """ - - DELETED: Final = object() - """Special marker indicating that an entry was deleted.""" - - __slots__ = ("_write_access_keys",) - - def __init__(self) -> None: - super().__init__() - self._write_access_keys: set[_KT] = set() - - def __setitem__(self, key: _KT, value: _VT) -> None: - self.__track_write(key) - super().__setitem__(key, value) - - def __delitem__(self, key: _KT) -> None: - self.__track_write(key) - super().__delitem__(key) - - def __track_write(self, key: Union[_KT, set[_KT]]) -> None: - if isinstance(key, set): - self._write_access_keys |= key - else: - self._write_access_keys.add(key) - - def pop_accessed_keys(self) -> set[_KT]: - """Returns all keys that were write-accessed since the last time this method was called.""" - out = self._write_access_keys - self._write_access_keys = set() - return out - - def pop_accessed_write_items(self) -> list[tuple[_KT, _VT]]: - """ - Returns all keys & corresponding values as set of tuples that were write-accessed since - the last time this method was called. If a key was deleted, the value will be - :attr:`DELETED`. - """ - keys = self.pop_accessed_keys() - return [(key, self.get(key, self.DELETED)) for key in keys] - - def mark_as_accessed(self, key: _KT) -> None: - """Use this method have the key returned again in the next call to - :meth:`pop_accessed_write_items` or :meth:`pop_accessed_keys` - """ - self._write_access_keys.add(key) - - # Override methods to track access - - def update_no_track(self, mapping: Mapping[_KT, _VT]) -> None: - """Like ``update``, but doesn't count towards write access.""" - for key, value in mapping.items(): - self.data[key] = value - - # Mypy seems a bit inconsistent about what it wants as types for `default` and return value - # so we just ignore a bit - def pop( # type: ignore[override] - self, - key: _KT, - default: _VT = DEFAULT_NONE, # type: ignore[assignment] - ) -> _VT: - if key in self: - self.__track_write(key) - if isinstance(default, DefaultValue): - return super().pop(key) - return super().pop(key, default=default) - - def clear(self) -> None: - self.__track_write(set(super().keys())) - super().clear() - - # Mypy seems a bit inconsistent about what it wants as types for `default` and return value - # so we just ignore a bit - def setdefault(self: "TrackingDict[_KT, _T]", key: _KT, default: Optional[_T] = None) -> _T: - if key in self: - return self[key] - - self.__track_write(key) - self[key] = default # type: ignore[assignment] - return default # type: ignore[return-value] diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_utils/types.py b/venv/lib/python3.12/site-packages/telegram/ext/_utils/types.py deleted file mode 100644 index 6aa35c8..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_utils/types.py +++ /dev/null @@ -1,106 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains custom typing aliases. - -.. versionadded:: 13.6 - -Warning: - Contents of this module are intended to be used internally by the library and *not* by the - user. Changes to this module are not considered breaking changes and may not be documented in - the changelog. -""" -from collections.abc import Coroutine, MutableMapping -from typing import TYPE_CHECKING, Any, Callable, TypeVar, Union - -if TYPE_CHECKING: - from typing import Optional - - from telegram import Bot - from telegram.ext import BaseRateLimiter, CallbackContext, JobQueue - -CCT = TypeVar("CCT", bound="CallbackContext[Any, Any, Any, Any]") -"""An instance of :class:`telegram.ext.CallbackContext` or a custom subclass. - -.. versionadded:: 13.6 -""" - -RT = TypeVar("RT") -UT = TypeVar("UT") -HandlerCallback = Callable[[UT, CCT], Coroutine[Any, Any, RT]] -"""Type of a handler callback - - .. versionadded:: 20.0 -""" -JobCallback = Callable[[CCT], Coroutine[Any, Any, Any]] -"""Type of a job callback - - .. versionadded:: 20.0 -""" - -ConversationKey = tuple[Union[int, str], ...] -ConversationDict = MutableMapping[ConversationKey, object] -"""dict[tuple[:obj:`int` | :obj:`str`, ...], Optional[:obj:`object`]]: - Dicts as maintained by the :class:`telegram.ext.ConversationHandler`. - - .. versionadded:: 13.6 -""" - -CDCData = tuple[list[tuple[str, float, dict[str, Any]]], dict[str, str]] -"""tuple[list[tuple[:obj:`str`, :obj:`float`, dict[:obj:`str`, :class:`object`]]], \ - dict[:obj:`str`, :obj:`str`]]: Data returned by - :attr:`telegram.ext.CallbackDataCache.persistence_data`. - - .. versionadded:: 13.6 -""" - -BT = TypeVar("BT", bound="Bot") -"""Type of the bot. - -.. versionadded:: 20.0 -""" -UD = TypeVar("UD") -"""Type of the user data for a single user. - -.. versionadded:: 13.6 -""" -CD = TypeVar("CD") -"""Type of the chat data for a single user. - -.. versionadded:: 13.6 -""" -BD = TypeVar("BD") -"""Type of the bot data. - -.. versionadded:: 13.6 -""" -JQ = TypeVar("JQ", bound=Union[None, "JobQueue"]) -"""Type of the job queue. - -.. versionadded:: 20.0""" - -RL = TypeVar("RL", bound="Optional[BaseRateLimiter]") -"""Type of the rate limiter. - -.. versionadded:: 20.0""" - -RLARGS = TypeVar("RLARGS") -"""Type of the rate limiter arguments. - -.. versionadded:: 20.0""" -FilterDataDict = dict[str, list[Any]] diff --git a/venv/lib/python3.12/site-packages/telegram/ext/_utils/webhookhandler.py b/venv/lib/python3.12/site-packages/telegram/ext/_utils/webhookhandler.py deleted file mode 100644 index 0c101c8..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/_utils/webhookhandler.py +++ /dev/null @@ -1,223 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -# pylint: disable=missing-module-docstring -import asyncio -import json -from http import HTTPStatus -from pathlib import Path -from socket import socket -from ssl import SSLContext -from types import TracebackType -from typing import TYPE_CHECKING, Optional, Union - -# Instead of checking for ImportError here, we do that in `updater.py`, where we import from -# this module. Doing it here would be tricky, as the classes below subclass tornado classes -import tornado.web -from tornado.httpserver import HTTPServer - -try: - from tornado.netutil import bind_unix_socket - - UNIX_AVAILABLE = True -except ImportError: - UNIX_AVAILABLE = False - -from telegram import Update -from telegram._utils.logging import get_logger -from telegram.ext._extbot import ExtBot - -if TYPE_CHECKING: - from telegram import Bot - -# This module is not visible to users, so we log as Updater -_LOGGER = get_logger(__name__, class_name="Updater") - - -class WebhookServer: - """Thin wrapper around ``tornado.httpserver.HTTPServer``.""" - - __slots__ = ( - "_http_server", - "_server_lock", - "_shutdown_lock", - "is_running", - "listen", - "port", - "unix", - ) - - def __init__( - self, - listen: str, - port: int, - webhook_app: "WebhookAppClass", - ssl_ctx: Optional[SSLContext], - unix: Optional[Union[str, Path, socket]] = None, - ): - if unix and not UNIX_AVAILABLE: - raise RuntimeError("This OS does not support binding unix sockets.") - self._http_server = HTTPServer(webhook_app, ssl_options=ssl_ctx) - self.listen = listen - self.port = port - self.is_running = False - self.unix = None - if unix and isinstance(unix, socket): - self.unix = unix - elif unix: - self.unix = bind_unix_socket(str(unix)) - self._server_lock = asyncio.Lock() - self._shutdown_lock = asyncio.Lock() - - async def serve_forever(self, ready: Optional[asyncio.Event] = None) -> None: - async with self._server_lock: - if self.unix: - self._http_server.add_socket(self.unix) - else: - self._http_server.listen(self.port, address=self.listen) - - self.is_running = True - if ready is not None: - ready.set() - - _LOGGER.debug("Webhook Server started.") - - async def shutdown(self) -> None: - async with self._shutdown_lock: - if not self.is_running: - _LOGGER.debug("Webhook Server is already shut down. Returning") - return - self.is_running = False - self._http_server.stop() - await self._http_server.close_all_connections() - _LOGGER.debug("Webhook Server stopped") - - -class WebhookAppClass(tornado.web.Application): - """Application used in the Webserver""" - - def __init__( - self, - webhook_path: str, - bot: "Bot", - update_queue: asyncio.Queue, - secret_token: Optional[str] = None, - ): - self.shared_objects = { - "bot": bot, - "update_queue": update_queue, - "secret_token": secret_token, - } - handlers = [(rf"{webhook_path}/?", TelegramHandler, self.shared_objects)] - tornado.web.Application.__init__(self, handlers) # type: ignore - - def log_request(self, handler: tornado.web.RequestHandler) -> None: - """Overrides the default implementation since we have our own logging setup.""" - - -# pylint: disable=abstract-method -class TelegramHandler(tornado.web.RequestHandler): - """BaseHandler that processes incoming requests from Telegram""" - - __slots__ = ("bot", "secret_token", "update_queue") - - SUPPORTED_METHODS = ("POST",) # type: ignore[assignment] - - def initialize(self, bot: "Bot", update_queue: asyncio.Queue, secret_token: str) -> None: - """Initialize for each request - that's the interface provided by tornado""" - # pylint: disable=attribute-defined-outside-init - self.bot = bot - self.update_queue = update_queue - self.secret_token = secret_token - if secret_token: - _LOGGER.debug( - "The webhook server has a secret token, expecting it in incoming requests now" - ) - - def set_default_headers(self) -> None: - """Sets default headers""" - self.set_header("Content-Type", 'application/json; charset="utf-8"') - - async def post(self) -> None: - """Handle incoming POST request""" - _LOGGER.debug("Webhook triggered") - self._validate_post() - - json_string = self.request.body.decode() - data = json.loads(json_string) - self.set_status(HTTPStatus.OK) - _LOGGER.debug("Webhook received data: %s", json_string) - - try: - update = Update.de_json(data, self.bot) - except Exception as exc: - _LOGGER.critical( - "Something went wrong processing the data received from Telegram. " - "Received data was *not* processed! Received data was: %r", - data, - exc_info=exc, - ) - raise tornado.web.HTTPError( - HTTPStatus.BAD_REQUEST, reason="Update could not be processed" - ) from exc - - if update: - _LOGGER.debug( - "Received Update with ID %d on Webhook", - # For some reason pylint thinks update is a general TelegramObject - update.update_id, # pylint: disable=no-member - ) - - # handle arbitrary callback data, if necessary - if isinstance(self.bot, ExtBot): - self.bot.insert_callback_data(update) - - await self.update_queue.put(update) - - def _validate_post(self) -> None: - """Only accept requests with content type JSON""" - ct_header = self.request.headers.get("Content-Type", None) - if ct_header != "application/json": - raise tornado.web.HTTPError(HTTPStatus.FORBIDDEN) - # verifying that the secret token is the one the user set when the user set one - if self.secret_token is not None: - token = self.request.headers.get("X-Telegram-Bot-Api-Secret-Token") - if not token: - _LOGGER.debug("Request did not include the secret token") - raise tornado.web.HTTPError( - HTTPStatus.FORBIDDEN, reason="Request did not include the secret token" - ) - if token != self.secret_token: - _LOGGER.debug("Request had the wrong secret token: %s", token) - raise tornado.web.HTTPError( - HTTPStatus.FORBIDDEN, reason="Request had the wrong secret token" - ) - - def log_exception( - self, - typ: Optional[type[BaseException]], - value: Optional[BaseException], - tb: Optional[TracebackType], - ) -> None: - """Override the default logging and instead use our custom logging.""" - _LOGGER.debug( - "%s - %s", - self.request.remote_ip, - "Exception in TelegramHandler", - exc_info=(typ, value, tb) if typ and value and tb else value, - ) diff --git a/venv/lib/python3.12/site-packages/telegram/ext/filters.py b/venv/lib/python3.12/site-packages/telegram/ext/filters.py deleted file mode 100644 index 6322daf..0000000 --- a/venv/lib/python3.12/site-packages/telegram/ext/filters.py +++ /dev/null @@ -1,2947 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -""" -This module contains filters for use with :class:`telegram.ext.MessageHandler`, -:class:`telegram.ext.CommandHandler`, or :class:`telegram.ext.PrefixHandler`. - -.. versionchanged:: 20.0 - - #. Filters are no longer callable, if you're using a custom filter and are calling an existing - filter, then switch to the new syntax: ``filters.{filter}.check_update(update)``. - #. Removed the ``Filters`` class. The filters are now directly attributes/classes of the - :mod:`~telegram.ext.filters` module. - #. The names of all filters has been updated: - - * Filter classes which are ready for use, e.g ``Filters.all`` are now capitalized, e.g - ``filters.ALL``. - * Filters which need to be initialized are now in CamelCase. E.g. ``filters.User(...)``. - * Filters which do both (like ``Filters.text``) are now split as ready-to-use version - ``filters.TEXT`` and class version ``filters.Text(...)``. - -.. versionchanged:: 22.0 - Removed deprecated attribute `CHAT`. - -""" - -__all__ = ( - "ALL", - "ANIMATION", - "ATTACHMENT", - "AUDIO", - "BOOST_ADDED", - "CAPTION", - "COMMAND", - "CONTACT", - "EFFECT_ID", - "FORWARDED", - "GAME", - "GIVEAWAY", - "GIVEAWAY_WINNERS", - "HAS_MEDIA_SPOILER", - "HAS_PROTECTED_CONTENT", - "INVOICE", - "IS_AUTOMATIC_FORWARD", - "IS_FROM_OFFLINE", - "IS_TOPIC_MESSAGE", - "LOCATION", - "PAID_MEDIA", - "PASSPORT_DATA", - "PHOTO", - "POLL", - "PREMIUM_USER", - "REPLY", - "REPLY_TO_STORY", - "SENDER_BOOST_COUNT", - "STORY", - "SUCCESSFUL_PAYMENT", - "TEXT", - "USER", - "USER_ATTACHMENT", - "VENUE", - "VIA_BOT", - "VIDEO", - "VIDEO_NOTE", - "VOICE", - "BaseFilter", - "Caption", - "CaptionEntity", - "CaptionRegex", - "Chat", - "ChatType", - "Command", - "Dice", - "Document", - "Entity", - "ForwardedFrom", - "Language", - "Mention", - "MessageFilter", - "Regex", - "SenderChat", - "StatusUpdate", - "Sticker", - "SuccessfulPayment", - "Text", - "UpdateFilter", - "UpdateType", - "User", - "ViaBot", -) -import mimetypes -import re -from abc import ABC, abstractmethod -from collections.abc import Collection, Iterable, Sequence -from re import Match, Pattern -from typing import NoReturn, Optional, Union, cast - -from telegram import Chat as TGChat -from telegram import ( - Message, - MessageEntity, - MessageOriginChannel, - MessageOriginChat, - MessageOriginUser, - Update, -) -from telegram import User as TGUser -from telegram._utils.types import SCT -from telegram.constants import DiceEmoji as DiceEmojiEnum -from telegram.ext._utils._update_parsing import parse_chat_id, parse_username -from telegram.ext._utils.types import FilterDataDict - - -class BaseFilter: - """Base class for all Filters. - - Filters subclassing from this class can combined using bitwise operators: - - And:: - - filters.TEXT & filters.Entity(MENTION) - - Or:: - - filters.AUDIO | filters.VIDEO - - Exclusive Or:: - - filters.Regex('To Be') ^ filters.Regex('Not 2B') - - Not:: - - ~ filters.COMMAND - - Also works with more than two filters:: - - filters.TEXT & (filters.Entity("url") | filters.Entity("text_link")) - filters.TEXT & (~ filters.FORWARDED) - - Note: - Filters use the same short circuiting logic as python's :keyword:`and`, :keyword:`or` and - :keyword:`not`. This means that for example:: - - filters.Regex(r'(a?x)') | filters.Regex(r'(b?x)') - - With ``message.text == 'x'``, will only ever return the matches for the first filter, - since the second one is never evaluated. - - If you want to create your own filters create a class inheriting from either - :class:`MessageFilter` or :class:`UpdateFilter` and implement a ``filter()`` - method that returns a boolean: :obj:`True` if the message should be - handled, :obj:`False` otherwise. - Note that the filters work only as class instances, not actual class objects (so remember to - initialize your filter classes). - - By default, the filters name (what will get printed when converted to a string for display) - will be the class name. If you want to overwrite this assign a better name to the :attr:`name` - class variable. - - .. versionadded:: 20.0 - Added the arguments :attr:`name` and :attr:`data_filter`. - - Args: - name (:obj:`str`): Name for this filter. Defaults to the type of filter. - data_filter (:obj:`bool`): Whether this filter is a data filter. A data filter should - return a dict with lists. The dict will be merged with - :class:`telegram.ext.CallbackContext`'s internal dict in most cases - (depends on the handler). - """ - - __slots__ = ("_data_filter", "_name") - - def __init__(self, name: Optional[str] = None, data_filter: bool = False): - self._name = self.__class__.__name__ if name is None else name - self._data_filter = data_filter - - def __and__(self, other: "BaseFilter") -> "BaseFilter": - """Defines `AND` bitwise operator for :class:`BaseFilter` object. - The combined filter accepts an update only if it is accepted by both filters. - For example, ``filters.PHOTO & filters.CAPTION`` will only accept messages that contain - both a photo and a caption. - - Returns: - :obj:`BaseFilter` - """ - return _MergedFilter(self, and_filter=other) - - def __or__(self, other: "BaseFilter") -> "BaseFilter": - """Defines `OR` bitwise operator for :class:`BaseFilter` object. - The combined filter accepts an update only if it is accepted by any of the filters. - For example, ``filters.PHOTO | filters.CAPTION`` will only accept messages that contain - photo or caption or both. - - Returns: - :obj:`BaseFilter` - """ - return _MergedFilter(self, or_filter=other) - - def __xor__(self, other: "BaseFilter") -> "BaseFilter": - """Defines `XOR` bitwise operator for :class:`BaseFilter` object. - The combined filter accepts an update only if it is accepted by any of the filters and - not both of them. For example, ``filters.PHOTO ^ filters.CAPTION`` will only accept - messages that contain photo or caption, not both of them. - - Returns: - :obj:`BaseFilter` - """ - return _XORFilter(self, other) - - def __invert__(self) -> "BaseFilter": - """Defines `NOT` bitwise operator for :class:`BaseFilter` object. - The combined filter accepts an update only if it is accepted by any of the filters. - For example, ``~ filters.PHOTO`` will only accept messages that do not contain photo. - - Returns: - :obj:`BaseFilter` - """ - return _InvertedFilter(self) - - def __repr__(self) -> str: - """Gives name for this filter. - - .. seealso:: - :meth:`name` - - Returns: - :obj:`str`: - """ - return self.name - - @property - def data_filter(self) -> bool: - """:obj:`bool`: Whether this filter is a data filter.""" - return self._data_filter - - @data_filter.setter - def data_filter(self, value: bool) -> None: - self._data_filter = value - - @property - def name(self) -> str: - """:obj:`str`: Name for this filter.""" - return self._name - - @name.setter - def name(self, name: str) -> None: - self._name = name - - def check_update(self, update: Update) -> Optional[Union[bool, FilterDataDict]]: - """Checks if the specified update should be handled by this filter. - - .. versionchanged:: 21.1 - This filter now also returns :obj:`True` if the update contains - :attr:`~telegram.Update.business_message` - or :attr:`~telegram.Update.edited_business_message`. - - Args: - update (:class:`telegram.Update`): The update to check. - - Returns: - :obj:`bool`: :obj:`True` if the update contains one of - :attr:`~telegram.Update.channel_post`, :attr:`~telegram.Update.message`, - :attr:`~telegram.Update.edited_channel_post`, - :attr:`~telegram.Update.edited_message`, :attr:`telegram.Update.business_message`, - :attr:`telegram.Update.edited_business_message`, or :obj:`False` otherwise. - """ - return bool( # Only message updates should be handled. - update.channel_post - or update.message - or update.edited_channel_post - or update.edited_message - or update.business_message - or update.edited_business_message - ) - - -class MessageFilter(BaseFilter): - """Base class for all Message Filters. In contrast to :class:`UpdateFilter`, the object passed - to :meth:`filter` is :attr:`telegram.Update.effective_message`. - - Please see :class:`BaseFilter` for details on how to create custom filters. - - .. seealso:: :wiki:`Advanced Filters <Extensions---Advanced-Filters>` - - """ - - __slots__ = () - - def check_update(self, update: Update) -> Optional[Union[bool, FilterDataDict]]: - """Checks if the specified update should be handled by this filter by passing - :attr:`~telegram.Update.effective_message` to :meth:`filter`. - - Args: - update (:class:`telegram.Update`): The update to check. - - Returns: - :obj:`bool` | dict[:obj:`str`, :obj:`list`] | :obj:`None`: If the update should be - handled by this filter, returns :obj:`True` or a dict with lists, in case the filter - is a data filter. If the update should not be handled by this filter, :obj:`False` or - :obj:`None`. - """ - if super().check_update(update): - return self.filter(update.effective_message) # type: ignore[arg-type] - return False - - @abstractmethod - def filter(self, message: Message) -> Optional[Union[bool, FilterDataDict]]: - """This method must be overwritten. - - Args: - message (:class:`telegram.Message`): The message that is tested. - - Returns: - :obj:`dict` or :obj:`bool` - - """ - - -class UpdateFilter(BaseFilter): - """Base class for all Update Filters. In contrast to :class:`MessageFilter`, the object - passed to :meth:`filter` is an instance of :class:`telegram.Update`, which allows to create - filters like :attr:`telegram.ext.filters.UpdateType.EDITED_MESSAGE`. - - Please see :class:`telegram.ext.filters.BaseFilter` for details on how to create custom - filters. - - """ - - __slots__ = () - - def check_update(self, update: Update) -> Optional[Union[bool, FilterDataDict]]: - """Checks if the specified update should be handled by this filter. - - Args: - update (:class:`telegram.Update`): The update to check. - - Returns: - :obj:`bool` | dict[:obj:`str`, :obj:`list`] | :obj:`None`: If the update should be - handled by this filter, returns :obj:`True` or a dict with lists, in case the filter - is a data filter. If the update should not be handled by this filter, :obj:`False` or - :obj:`None`. - """ - return self.filter(update) if super().check_update(update) else False - - @abstractmethod - def filter(self, update: Update) -> Optional[Union[bool, FilterDataDict]]: - """This method must be overwritten. - - Args: - update (:class:`telegram.Update`): The update that is tested. - - Returns: - :obj:`dict` or :obj:`bool`. - - """ - - -class _InvertedFilter(UpdateFilter): - """Represents a filter that has been inverted. - - Args: - f: The filter to invert. - - """ - - __slots__ = ("inv_filter",) - - def __init__(self, f: BaseFilter): - super().__init__() - self.inv_filter = f - - def filter(self, update: Update) -> bool: - return not bool(self.inv_filter.check_update(update)) - - @property - def name(self) -> str: - return f"<inverted {self.inv_filter}>" - - @name.setter - def name(self, _: str) -> NoReturn: - raise RuntimeError("Cannot set name for combined filters.") - - -class _MergedFilter(UpdateFilter): - """Represents a filter consisting of two other filters. - - Args: - base_filter: Filter 1 of the merged filter. - and_filter: Optional filter to "and" with base_filter. Mutually exclusive with or_filter. - or_filter: Optional filter to "or" with base_filter. Mutually exclusive with and_filter. - - """ - - __slots__ = ("and_filter", "base_filter", "or_filter") - - def __init__( - self, - base_filter: BaseFilter, - and_filter: Optional[BaseFilter] = None, - or_filter: Optional[BaseFilter] = None, - ): - super().__init__() - self.base_filter = base_filter - if self.base_filter.data_filter: - self.data_filter = True - self.and_filter = and_filter - if ( - self.and_filter - and not isinstance(self.and_filter, bool) - and self.and_filter.data_filter - ): - self.data_filter = True - self.or_filter = or_filter - if self.or_filter and not isinstance(self.and_filter, bool) and self.or_filter.data_filter: - self.data_filter = True - - @staticmethod - def _merge(base_output: Union[bool, dict], comp_output: Union[bool, dict]) -> FilterDataDict: - base = base_output if isinstance(base_output, dict) else {} - comp = comp_output if isinstance(comp_output, dict) else {} - for k in comp: - # Make sure comp values are lists - comp_value = comp[k] if isinstance(comp[k], list) else [] - try: - # If base is a list then merge - if isinstance(base[k], list): - base[k] += comp_value - else: - base[k] = [base[k], *comp_value] - except KeyError: - base[k] = comp_value - return base - - # pylint: disable=too-many-return-statements - def filter(self, update: Update) -> Union[bool, FilterDataDict]: - base_output = self.base_filter.check_update(update) - # We need to check if the filters are data filters and if so return the merged data. - # If it's not a data filter or an or_filter but no matches return bool - if self.and_filter: - # And filter needs to short circuit if base is falsy - if base_output: - comp_output = self.and_filter.check_update(update) - if comp_output: - if self.data_filter: - merged = self._merge(base_output, comp_output) - if merged: - return merged - return True - elif self.or_filter: - # Or filter needs to short circuit if base is truthy - if base_output: - if self.data_filter: - return base_output - return True - - comp_output = self.or_filter.check_update(update) - if comp_output: - if self.data_filter: - return comp_output - return True - return False - - @property - def name(self) -> str: - return ( - f"<{self.base_filter} {'and' if self.and_filter else 'or'} " - f"{self.and_filter or self.or_filter}>" - ) - - @name.setter - def name(self, _: str) -> NoReturn: - raise RuntimeError("Cannot set name for combined filters.") - - -class _XORFilter(UpdateFilter): - """Convenience filter acting as wrapper for :class:`MergedFilter` representing the an XOR gate - for two filters. - - Args: - base_filter: Filter 1 of the merged filter. - xor_filter: Filter 2 of the merged filter. - - """ - - __slots__ = ("base_filter", "merged_filter", "xor_filter") - - def __init__(self, base_filter: BaseFilter, xor_filter: BaseFilter): - super().__init__() - self.base_filter = base_filter - self.xor_filter = xor_filter - self.merged_filter = (base_filter & ~xor_filter) | (~base_filter & xor_filter) - - def filter(self, update: Update) -> Optional[Union[bool, FilterDataDict]]: - return self.merged_filter.check_update(update) - - @property - def name(self) -> str: - return f"<{self.base_filter} xor {self.xor_filter}>" - - @name.setter - def name(self, _: str) -> NoReturn: - raise RuntimeError("Cannot set name for combined filters.") - - -class _All(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: # noqa: ARG002 - return True - - -ALL = _All(name="filters.ALL") -"""All Messages.""" - - -class _Animation(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.animation) - - -ANIMATION = _Animation(name="filters.ANIMATION") -"""Messages that contain :attr:`telegram.Message.animation`.""" - - -class _Attachment(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.effective_attachment) - - -ATTACHMENT = _Attachment(name="filters.ATTACHMENT") -"""Messages that contain :meth:`telegram.Message.effective_attachment`. - -.. versionadded:: 13.6""" - - -class _Audio(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.audio) - - -AUDIO = _Audio(name="filters.AUDIO") -"""Messages that contain :attr:`telegram.Message.audio`.""" - - -class Caption(MessageFilter): - """Messages with a caption. If a list of strings is passed, it filters messages to only - allow those whose caption is appearing in the given list. - - Examples: - ``MessageHandler(filters.Caption(['PTB rocks!', 'PTB']), callback_method_2)`` - - .. seealso:: - :attr:`telegram.ext.filters.CAPTION` - - Args: - strings (list[:obj:`str`] | tuple[:obj:`str`], optional): Which captions to allow. Only - exact matches are allowed. If not specified, will allow any message with a caption. - """ - - __slots__ = ("strings",) - - def __init__(self, strings: Optional[Union[list[str], tuple[str, ...]]] = None): - self.strings: Optional[Sequence[str]] = strings - super().__init__(name=f"filters.Caption({strings})" if strings else "filters.CAPTION") - - def filter(self, message: Message) -> bool: - if self.strings is None: - return bool(message.caption) - return message.caption in self.strings if message.caption else False - - -CAPTION = Caption() -"""Shortcut for :class:`telegram.ext.filters.Caption()`. - -Examples: - To allow any caption, simply use ``MessageHandler(filters.CAPTION, callback_method)``. -""" - - -class CaptionEntity(MessageFilter): - """ - Filters media messages to only allow those which have a :class:`telegram.MessageEntity` - where their :class:`~telegram.MessageEntity.type` matches `entity_type`. - - Examples: - ``MessageHandler(filters.CaptionEntity("hashtag"), callback_method)`` - - Args: - entity_type (:obj:`str`): Caption Entity type to check for. All types can be found as - constants in :class:`telegram.MessageEntity`. - - """ - - __slots__ = ("entity_type",) - - def __init__(self, entity_type: str): - self.entity_type: str = entity_type - super().__init__(name=f"filters.CaptionEntity({self.entity_type})") - - def filter(self, message: Message) -> bool: - return any(entity.type == self.entity_type for entity in message.caption_entities) - - -class CaptionRegex(MessageFilter): - """ - Filters updates by searching for an occurrence of :paramref:`~CaptionRegex.pattern` in the - message caption. - - This filter works similarly to :class:`Regex`, with the only exception being that - it applies to the message caption instead of the text. - - Examples: - Use ``MessageHandler(filters.PHOTO & filters.CaptionRegex(r'help'), callback)`` - to capture all photos with caption containing the word 'help'. - - Note: - This filter will not work on simple text messages, but only on media with caption. - - Args: - pattern (:obj:`str` | :func:`re.Pattern <re.compile>`): The regex pattern. - """ - - __slots__ = ("pattern",) - - def __init__(self, pattern: Union[str, Pattern[str]]): - if isinstance(pattern, str): - pattern = re.compile(pattern) - self.pattern: Pattern[str] = pattern - super().__init__(name=f"filters.CaptionRegex({self.pattern})", data_filter=True) - - def filter(self, message: Message) -> Optional[dict[str, list[Match[str]]]]: - if message.caption and (match := self.pattern.search(message.caption)): - return {"matches": [match]} - return {} - - -class _ChatUserBaseFilter(MessageFilter, ABC): - __slots__ = ( - "_chat_id_name", - "_chat_ids", - "_username_name", - "_usernames", - "allow_empty", - ) - - def __init__( - self, - chat_id: Optional[SCT[int]] = None, - username: Optional[SCT[str]] = None, - allow_empty: bool = False, - ): - super().__init__() - self._chat_id_name: str = "chat_id" - self._username_name: str = "username" - self.allow_empty: bool = allow_empty - - self._chat_ids: set[int] = set() - self._usernames: set[str] = set() - - self._set_chat_ids(chat_id) - self._set_usernames(username) - - @abstractmethod - def _get_chat_or_user(self, message: Message) -> Union[TGChat, TGUser, None]: ... - - def _set_chat_ids(self, chat_id: Optional[SCT[int]]) -> None: - if chat_id and self._usernames: - raise RuntimeError( - f"Can't set {self._chat_id_name} in conjunction with (already set) " - f"{self._username_name}s." - ) - self._chat_ids = set(parse_chat_id(chat_id)) - - def _set_usernames(self, username: Optional[SCT[str]]) -> None: - if username and self._chat_ids: - raise RuntimeError( - f"Can't set {self._username_name} in conjunction with (already set) " - f"{self._chat_id_name}s." - ) - self._usernames = set(parse_username(username)) - - @property - def chat_ids(self) -> frozenset[int]: - return frozenset(self._chat_ids) - - @chat_ids.setter - def chat_ids(self, chat_id: SCT[int]) -> None: - self._set_chat_ids(chat_id) - - @property - def usernames(self) -> frozenset[str]: - """Which username(s) to allow through. - - Warning: - :attr:`usernames` will give a *copy* of the saved usernames as :obj:`frozenset`. This - is to ensure thread safety. To add/remove a user, you should use :meth:`add_usernames`, - and :meth:`remove_usernames`. Only update the entire set by - ``filter.usernames = new_set``, if you are entirely sure that it is not causing race - conditions, as this will complete replace the current set of allowed users. - - Returns: - frozenset(:obj:`str`) - """ - return frozenset(self._usernames) - - @usernames.setter - def usernames(self, username: SCT[str]) -> None: - self._set_usernames(username) - - def add_usernames(self, username: SCT[str]) -> None: - """ - Add one or more chats to the allowed usernames. - - Args: - username(:obj:`str` | Collection[:obj:`str`]): Which username(s) to - allow through. Leading ``'@'`` s in usernames will be discarded. - """ - if self._chat_ids: - raise RuntimeError( - f"Can't set {self._username_name} in conjunction with (already set) " - f"{self._chat_id_name}s." - ) - - parsed_username = set(parse_username(username)) - self._usernames |= parsed_username - - def _add_chat_ids(self, chat_id: SCT[int]) -> None: - if self._usernames: - raise RuntimeError( - f"Can't set {self._chat_id_name} in conjunction with (already set) " - f"{self._username_name}s." - ) - - parsed_chat_id = set(parse_chat_id(chat_id)) - - self._chat_ids |= parsed_chat_id - - def remove_usernames(self, username: SCT[str]) -> None: - """ - Remove one or more chats from allowed usernames. - - Args: - username(:obj:`str` | Collection[:obj:`str`]): Which username(s) to - disallow through. Leading ``'@'`` s in usernames will be discarded. - """ - if self._chat_ids: - raise RuntimeError( - f"Can't set {self._username_name} in conjunction with (already set) " - f"{self._chat_id_name}s." - ) - - parsed_username = set(parse_username(username)) - self._usernames -= parsed_username - - def _remove_chat_ids(self, chat_id: SCT[int]) -> None: - if self._usernames: - raise RuntimeError( - f"Can't set {self._chat_id_name} in conjunction with (already set) " - f"{self._username_name}s." - ) - parsed_chat_id = set(parse_chat_id(chat_id)) - self._chat_ids -= parsed_chat_id - - def filter(self, message: Message) -> bool: - chat_or_user = self._get_chat_or_user(message) - if chat_or_user: - if self.chat_ids: - return chat_or_user.id in self.chat_ids - if self.usernames: - return bool(chat_or_user.username and chat_or_user.username in self.usernames) - return self.allow_empty - return False - - @property - def name(self) -> str: - return ( - f"filters.{self.__class__.__name__}(" - f"{', '.join(str(s) for s in (self.usernames or self.chat_ids))})" - ) - - @name.setter - def name(self, _: str) -> NoReturn: - raise RuntimeError(f"Cannot set name for filters.{self.__class__.__name__}") - - -class Chat(_ChatUserBaseFilter): - """Filters messages to allow only those which are from a specified chat ID or username. - - Examples: - ``MessageHandler(filters.Chat(-1234), callback_method)`` - - Warning: - :attr:`chat_ids` will give a *copy* of the saved chat ids as :class:`frozenset`. This - is to ensure thread safety. To add/remove a chat, you should use :meth:`add_chat_ids`, and - :meth:`remove_chat_ids`. Only update the entire set by ``filter.chat_ids = new_set``, - if you are entirely sure that it is not causing race conditions, as this will complete - replace the current set of allowed chats. - - Args: - chat_id(:obj:`int` | Collection[:obj:`int`], optional): - Which chat ID(s) to allow through. - username(:obj:`str` | Collection[:obj:`str`], optional): - Which username(s) to allow through. - Leading ``'@'`` s in usernames will be discarded. - allow_empty(:obj:`bool`, optional): Whether updates should be processed, if no chat - is specified in :attr:`chat_ids` and :attr:`usernames`. Defaults to :obj:`False`. - - Attributes: - chat_ids (set(:obj:`int`)): Which chat ID(s) to allow through. - allow_empty (:obj:`bool`): Whether updates should be processed, if no chat - is specified in :attr:`chat_ids` and :attr:`usernames`. - - Raises: - RuntimeError: If ``chat_id`` and ``username`` are both present. - """ - - __slots__ = () - - def _get_chat_or_user(self, message: Message) -> Optional[TGChat]: - return message.chat - - def add_chat_ids(self, chat_id: SCT[int]) -> None: - """ - Add one or more chats to the allowed chat ids. - - Args: - chat_id(:obj:`int` | Collection[:obj:`int`]): Which chat ID(s) to allow - through. - """ - return super()._add_chat_ids(chat_id) - - def remove_chat_ids(self, chat_id: SCT[int]) -> None: - """ - Remove one or more chats from allowed chat ids. - - Args: - chat_id(:obj:`int` | Collection[:obj:`int`]): Which chat ID(s) to - disallow through. - """ - return super()._remove_chat_ids(chat_id) - - -class ChatType: # A convenience namespace for Chat types. - """Subset for filtering the type of chat. - - Examples: - Use these filters like: ``filters.ChatType.CHANNEL`` or - ``filters.ChatType.SUPERGROUP`` etc. - - Caution: - ``filters.ChatType`` itself is *not* a filter, but just a convenience namespace. - """ - - __slots__ = () - - class _Channel(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return message.chat.type == TGChat.CHANNEL - - CHANNEL = _Channel(name="filters.ChatType.CHANNEL") - """Updates from channel.""" - - class _Group(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return message.chat.type == TGChat.GROUP - - GROUP = _Group(name="filters.ChatType.GROUP") - """Updates from group.""" - - class _Groups(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return message.chat.type in [TGChat.GROUP, TGChat.SUPERGROUP] - - GROUPS = _Groups(name="filters.ChatType.GROUPS") - """Update from group *or* supergroup.""" - - class _Private(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return message.chat.type == TGChat.PRIVATE - - PRIVATE = _Private(name="filters.ChatType.PRIVATE") - """Update from private chats.""" - - class _SuperGroup(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return message.chat.type == TGChat.SUPERGROUP - - SUPERGROUP = _SuperGroup(name="filters.ChatType.SUPERGROUP") - """Updates from supergroup.""" - - -class Command(MessageFilter): - """ - Messages with a :attr:`telegram.MessageEntity.BOT_COMMAND`. By default, only allows - messages `starting` with a bot command. Pass :obj:`False` to also allow messages that contain a - bot command `anywhere` in the text. - - Examples: - ``MessageHandler(filters.Command(False), command_anywhere_callback)`` - - .. seealso:: - :attr:`telegram.ext.filters.COMMAND`. - - Note: - :attr:`telegram.ext.filters.TEXT` also accepts messages containing a command. - - Args: - only_start (:obj:`bool`, optional): Whether to only allow messages that `start` with a bot - command. Defaults to :obj:`True`. - """ - - __slots__ = ("only_start",) - - def __init__(self, only_start: bool = True): - self.only_start: bool = only_start - super().__init__(f"filters.Command({only_start})" if not only_start else "filters.COMMAND") - - def filter(self, message: Message) -> bool: - if not message.entities: - return False - - first = message.entities[0] - - if self.only_start: - return bool(first.type == MessageEntity.BOT_COMMAND and first.offset == 0) - return bool(any(e.type == MessageEntity.BOT_COMMAND for e in message.entities)) - - -COMMAND = Command() -"""Shortcut for :class:`telegram.ext.filters.Command()`. - -Examples: - To allow messages starting with a command use - ``MessageHandler(filters.COMMAND, command_at_start_callback)``. -""" - - -class _Contact(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.contact) - - -CONTACT = _Contact(name="filters.CONTACT") -"""Messages that contain :attr:`telegram.Message.contact`.""" - - -class _Dice(MessageFilter): - __slots__ = ("emoji", "values") - - def __init__(self, values: Optional[SCT[int]] = None, emoji: Optional[DiceEmojiEnum] = None): - super().__init__() - self.emoji: Optional[DiceEmojiEnum] = emoji - self.values: Optional[Collection[int]] = [values] if isinstance(values, int) else values - - if emoji: # for filters.Dice.BASKETBALL - self.name = f"filters.Dice.{emoji.name}" - if self.values and emoji: # for filters.Dice.Dice(4) SLOT_MACHINE -> SlotMachine - self.name = f"filters.Dice.{emoji.name.title().replace('_', '')}({self.values})" - elif values: # for filters.Dice(4) - self.name = f"filters.Dice({self.values})" - else: - self.name = "filters.Dice.ALL" - - def filter(self, message: Message) -> bool: - if not (dice := message.dice): # no dice - return False - - if self.emoji: - emoji_match = dice.emoji == self.emoji - if self.values: - return dice.value in self.values and emoji_match # emoji and value - return emoji_match # emoji, no value - return dice.value in self.values if self.values else True # no emoji, only value - - -class Dice(_Dice): - """Dice Messages. If an integer or a list of integers is passed, it filters messages to only - allow those whose dice value is appearing in the given list. - - .. versionadded:: 13.4 - - Examples: - To allow any dice message, simply use - ``MessageHandler(filters.Dice.ALL, callback_method)``. - - To allow any dice message, but with value 3 `or` 4, use - ``MessageHandler(filters.Dice([3, 4]), callback_method)`` - - To allow only dice messages with the emoji 🎲, but any value, use - ``MessageHandler(filters.Dice.DICE, callback_method)``. - - To allow only dice messages with the emoji 🎯 and with value 6, use - ``MessageHandler(filters.Dice.Darts(6), callback_method)``. - - To allow only dice messages with the emoji ⚽ and with value 5 `or` 6, use - ``MessageHandler(filters.Dice.Football([5, 6]), callback_method)``. - - Note: - Dice messages don't have text. If you want to filter either text or dice messages, use - ``filters.TEXT | filters.Dice.ALL``. - - Args: - values (:obj:`int` | Collection[:obj:`int`], optional): - Which values to allow. If not specified, will allow the specified dice message. - """ - - __slots__ = () - - ALL = _Dice() - """Dice messages with any value and any emoji.""" - - class Basketball(_Dice): - """Dice messages with the emoji 🏀. Supports passing a list of integers. - - Args: - values (:obj:`int` | Collection[:obj:`int`]): Which values to allow. - """ - - __slots__ = () - - def __init__(self, values: SCT[int]): - super().__init__(values, emoji=DiceEmojiEnum.BASKETBALL) - - BASKETBALL = _Dice(emoji=DiceEmojiEnum.BASKETBALL) - """Dice messages with the emoji 🏀. Matches any dice value.""" - - class Bowling(_Dice): - """Dice messages with the emoji 🎳. Supports passing a list of integers. - - Args: - values (:obj:`int` | Collection[:obj:`int`]): Which values to allow. - """ - - __slots__ = () - - def __init__(self, values: SCT[int]): - super().__init__(values, emoji=DiceEmojiEnum.BOWLING) - - BOWLING = _Dice(emoji=DiceEmojiEnum.BOWLING) - """Dice messages with the emoji 🎳. Matches any dice value.""" - - class Darts(_Dice): - """Dice messages with the emoji 🎯. Supports passing a list of integers. - - Args: - values (:obj:`int` | Collection[:obj:`int`]): Which values to allow. - """ - - __slots__ = () - - def __init__(self, values: SCT[int]): - super().__init__(values, emoji=DiceEmojiEnum.DARTS) - - DARTS = _Dice(emoji=DiceEmojiEnum.DARTS) - """Dice messages with the emoji 🎯. Matches any dice value.""" - - class Dice(_Dice): - """Dice messages with the emoji 🎲. Supports passing a list of integers. - - Args: - values (:obj:`int` | Collection[:obj:`int`]): Which values to allow. - """ - - __slots__ = () - - def __init__(self, values: SCT[int]): - super().__init__(values, emoji=DiceEmojiEnum.DICE) - - DICE = _Dice(emoji=DiceEmojiEnum.DICE) - """Dice messages with the emoji 🎲. Matches any dice value.""" - - class Football(_Dice): - """Dice messages with the emoji ⚽. Supports passing a list of integers. - - Args: - values (:obj:`int` | Collection[:obj:`int`]): Which values to allow. - """ - - __slots__ = () - - def __init__(self, values: SCT[int]): - super().__init__(values, emoji=DiceEmojiEnum.FOOTBALL) - - FOOTBALL = _Dice(emoji=DiceEmojiEnum.FOOTBALL) - """Dice messages with the emoji ⚽. Matches any dice value.""" - - class SlotMachine(_Dice): - """Dice messages with the emoji 🎰. Supports passing a list of integers. - - Args: - values (:obj:`int` | Collection[:obj:`int`]): Which values to allow. - """ - - __slots__ = () - - def __init__(self, values: SCT[int]): - super().__init__(values, emoji=DiceEmojiEnum.SLOT_MACHINE) - - SLOT_MACHINE = _Dice(emoji=DiceEmojiEnum.SLOT_MACHINE) - """Dice messages with the emoji 🎰. Matches any dice value.""" - - -class Document: - """ - Subset for messages containing a document/file. - - Examples: - Use these filters like: ``filters.Document.MP3``, - ``filters.Document.MimeType("text/plain")`` etc. Or just use ``filters.Document.ALL`` for - all document messages. - - Caution: - ``filters.Document`` itself is *not* a filter, but just a convenience namespace. - """ - - __slots__ = () - - class _All(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.document) - - ALL = _All(name="filters.Document.ALL") - """Messages that contain a :attr:`telegram.Message.document`.""" - - class Category(MessageFilter): - """Filters documents by their category in the mime-type attribute. - - Args: - category (:obj:`str`): Category of the media you want to filter. - - Example: - ``filters.Document.Category('audio/')`` returns :obj:`True` for all types - of audio sent as a file, for example ``'audio/mpeg'`` or ``'audio/x-wav'``. - - Note: - This Filter only filters by the mime_type of the document, it doesn't check the - validity of the document. The user can manipulate the mime-type of a message and - send media with wrong types that don't fit to this handler. - """ - - __slots__ = ("_category",) - - def __init__(self, category: str): - self._category = category - super().__init__(name=f"filters.Document.Category('{self._category}')") - - def filter(self, message: Message) -> bool: - if message.document and message.document.mime_type: - return message.document.mime_type.startswith(self._category) - return False - - APPLICATION = Category("application/") - """Use as ``filters.Document.APPLICATION``.""" - AUDIO = Category("audio/") - """Use as ``filters.Document.AUDIO``.""" - IMAGE = Category("image/") - """Use as ``filters.Document.IMAGE``.""" - VIDEO = Category("video/") - """Use as ``filters.Document.VIDEO``.""" - TEXT = Category("text/") - """Use as ``filters.Document.TEXT``.""" - - class FileExtension(MessageFilter): - """This filter filters documents by their file ending/extension. - - Args: - file_extension (:obj:`str` | :obj:`None`): Media file extension you want to filter. - case_sensitive (:obj:`bool`, optional): Pass :obj:`True` to make the filter case - sensitive. Default: :obj:`False`. - - Example: - * ``filters.Document.FileExtension("jpg")`` - filters files with extension ``".jpg"``. - * ``filters.Document.FileExtension(".jpg")`` - filters files with extension ``"..jpg"``. - * ``filters.Document.FileExtension("Dockerfile", case_sensitive=True)`` - filters files with extension ``".Dockerfile"`` minding the case. - * ``filters.Document.FileExtension(None)`` - filters files without a dot in the filename. - - Note: - * This Filter only filters by the file ending/extension of the document, - it doesn't check the validity of document. - * The user can manipulate the file extension of a document and - send media with wrong types that don't fit to this handler. - * Case insensitive by default, - you may change this with the flag ``case_sensitive=True``. - * Extension should be passed without leading dot - unless it's a part of the extension. - * Pass :obj:`None` to filter files with no extension, - i.e. without a dot in the filename. - """ - - __slots__ = ("_file_extension", "is_case_sensitive") - - def __init__(self, file_extension: Optional[str], case_sensitive: bool = False): - super().__init__() - self.is_case_sensitive: bool = case_sensitive - if file_extension is None: - self._file_extension = None - self.name = "filters.Document.FileExtension(None)" - elif self.is_case_sensitive: - self._file_extension = f".{file_extension}" - self.name = ( - f"filters.Document.FileExtension({file_extension!r}, case_sensitive=True)" - ) - else: - self._file_extension = f".{file_extension}".lower() - self.name = f"filters.Document.FileExtension({file_extension.lower()!r})" - - def filter(self, message: Message) -> bool: - if message.document is None or message.document.file_name is None: - return False - if self._file_extension is None: - return "." not in message.document.file_name - if self.is_case_sensitive: - filename = message.document.file_name - else: - filename = message.document.file_name.lower() - return filename.endswith(self._file_extension) - - class MimeType(MessageFilter): - """This Filter filters documents by their mime-type attribute. - - Args: - mimetype (:obj:`str`): The mimetype to filter. - - Example: - ``filters.Document.MimeType('audio/mpeg')`` filters all audio in `.mp3` format. - - Note: - This Filter only filters by the mime_type of the document, it doesn't check the - validity of document. The user can manipulate the mime-type of a message and - send media with wrong types that don't fit to this handler. - """ - - __slots__ = ("mimetype",) - - def __init__(self, mimetype: str): - self.mimetype: str = mimetype - super().__init__(name=f"filters.Document.MimeType('{self.mimetype}')") - - def filter(self, message: Message) -> bool: - if message.document: - return message.document.mime_type == self.mimetype - return False - - APK = MimeType("application/vnd.android.package-archive") - """Use as ``filters.Document.APK``.""" - DOC = MimeType(mimetypes.types_map[".doc"]) - """Use as ``filters.Document.DOC``.""" - DOCX = MimeType("application/vnd.openxmlformats-officedocument.wordprocessingml.document") - """Use as ``filters.Document.DOCX``.""" - EXE = MimeType(mimetypes.types_map[".exe"]) - """Use as ``filters.Document.EXE``.""" - MP4 = MimeType(mimetypes.types_map[".mp4"]) - """Use as ``filters.Document.MP4``.""" - GIF = MimeType(mimetypes.types_map[".gif"]) - """Use as ``filters.Document.GIF``.""" - JPG = MimeType(mimetypes.types_map[".jpg"]) - """Use as ``filters.Document.JPG``.""" - MP3 = MimeType(mimetypes.types_map[".mp3"]) - """Use as ``filters.Document.MP3``.""" - PDF = MimeType(mimetypes.types_map[".pdf"]) - """Use as ``filters.Document.PDF``.""" - PY = MimeType(mimetypes.types_map[".py"]) - """Use as ``filters.Document.PY``.""" - SVG = MimeType(mimetypes.types_map[".svg"]) - """Use as ``filters.Document.SVG``.""" - TXT = MimeType(mimetypes.types_map[".txt"]) - """Use as ``filters.Document.TXT``.""" - TARGZ = MimeType("application/x-compressed-tar") - """Use as ``filters.Document.TARGZ``.""" - WAV = MimeType(mimetypes.types_map[".wav"]) - """Use as ``filters.Document.WAV``.""" - XML = MimeType(mimetypes.types_map[".xml"]) - """Use as ``filters.Document.XML``.""" - ZIP = MimeType(mimetypes.types_map[".zip"]) - """Use as ``filters.Document.ZIP``.""" - - -class _EffectId(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.effect_id) - - -EFFECT_ID = _EffectId(name="filters.EFFECT_ID") -"""Messages that contain :attr:`telegram.Message.effect_id`. - -.. versionadded:: 21.3""" - - -class Entity(MessageFilter): - """ - Filters messages to only allow those which have a :class:`telegram.MessageEntity` - where their :class:`~telegram.MessageEntity.type` matches `entity_type`. - - Examples: - ``MessageHandler(filters.Entity("hashtag"), callback_method)`` - - Args: - entity_type (:obj:`str`): Entity type to check for. All types can be found as constants - in :class:`telegram.MessageEntity`. - - """ - - __slots__ = ("entity_type",) - - def __init__(self, entity_type: str): - self.entity_type: str = entity_type - super().__init__(name=f"filters.Entity({self.entity_type})") - - def filter(self, message: Message) -> bool: - return any(entity.type == self.entity_type for entity in message.entities) - - -class _Forwarded(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.forward_origin) - - -FORWARDED = _Forwarded(name="filters.FORWARDED") -"""Messages that contain :attr:`telegram.Message.forward_origin`. - -.. versionchanged:: 20.8 - Now based on :attr:`telegram.Message.forward_origin` instead of - ``telegram.Message.forward_date``. -""" - - -class ForwardedFrom(_ChatUserBaseFilter): - """Filters messages to allow only those which are forwarded from the specified chat ID(s) - or username(s) based on :attr:`telegram.Message.forward_origin` and in particular - - * :attr:`telegram.MessageOriginUser.sender_user` - * :attr:`telegram.MessageOriginChat.sender_chat` - * :attr:`telegram.MessageOriginChannel.chat` - - .. versionadded:: 13.5 - - .. versionchanged:: 20.8 - Was previously based on ``telegram.Message.forward_from`` and - ``telegram.Message.forward_from_chat``. - - Examples: - ``MessageHandler(filters.ForwardedFrom(chat_id=1234), callback_method)`` - - Note: - When a user has disallowed adding a link to their account while forwarding their - messages, this filter will *not* work since - :attr:`telegram.Message.forward_origin` will be of type - :class:`telegram.MessageOriginHiddenUser`. However, this behaviour - is undocumented and might be changed by Telegram. - - Warning: - :attr:`chat_ids` will give a *copy* of the saved chat ids as :class:`frozenset`. This - is to ensure thread safety. To add/remove a chat, you should use :meth:`add_chat_ids`, and - :meth:`remove_chat_ids`. Only update the entire set by ``filter.chat_ids = new_set``, if - you are entirely sure that it is not causing race conditions, as this will complete replace - the current set of allowed chats. - - Args: - chat_id(:obj:`int` | Collection[:obj:`int`], optional): - Which chat/user ID(s) to allow through. - username(:obj:`str` | Collection[:obj:`str`], optional): - Which username(s) to allow through. Leading ``'@'`` s in usernames will be - discarded. - allow_empty(:obj:`bool`, optional): Whether updates should be processed, if no chat - is specified in :attr:`chat_ids` and :attr:`usernames`. Defaults to :obj:`False`. - - Attributes: - chat_ids (set(:obj:`int`)): Which chat/user ID(s) to allow through. - allow_empty (:obj:`bool`): Whether updates should be processed, if no chat - is specified in :attr:`chat_ids` and :attr:`usernames`. - - Raises: - RuntimeError: If both ``chat_id`` and ``username`` are present. - """ - - __slots__ = () - - def _get_chat_or_user(self, message: Message) -> Union[TGUser, TGChat, None]: - if (forward_origin := message.forward_origin) is None: - return None - - if isinstance(forward_origin, MessageOriginUser): - return forward_origin.sender_user - if isinstance(forward_origin, MessageOriginChat): - return forward_origin.sender_chat - if isinstance(forward_origin, MessageOriginChannel): - return forward_origin.chat - - return None - - def add_chat_ids(self, chat_id: SCT[int]) -> None: - """ - Add one or more chats to the allowed chat ids. - - Args: - chat_id(:obj:`int` | Collection[:obj:`int`]): Which chat/user ID(s) to - allow through. - """ - return super()._add_chat_ids(chat_id) - - def remove_chat_ids(self, chat_id: SCT[int]) -> None: - """ - Remove one or more chats from allowed chat ids. - - Args: - chat_id(:obj:`int` | Collection[:obj:`int`]): Which chat/user ID(s) to - disallow through. - """ - return super()._remove_chat_ids(chat_id) - - -class _Game(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.game) - - -GAME = _Game(name="filters.GAME") -"""Messages that contain :attr:`telegram.Message.game`.""" - - -class _Giveaway(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.giveaway) - - -GIVEAWAY = _Giveaway(name="filters.GIVEAWAY") -"""Messages that contain :attr:`telegram.Message.giveaway`.""" - - -class _GiveawayWinners(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.giveaway_winners) - - -GIVEAWAY_WINNERS = _GiveawayWinners(name="filters.GIVEAWAY_WINNERS") -"""Messages that contain :attr:`telegram.Message.giveaway_winners`.""" - - -class _HasMediaSpoiler(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.has_media_spoiler) - - -HAS_MEDIA_SPOILER = _HasMediaSpoiler(name="filters.HAS_MEDIA_SPOILER") -"""Messages that contain :attr:`telegram.Message.has_media_spoiler`. - - .. versionadded:: 20.0 -""" - - -class _HasProtectedContent(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.has_protected_content) - - -HAS_PROTECTED_CONTENT = _HasProtectedContent(name="filters.HAS_PROTECTED_CONTENT") -"""Messages that contain :attr:`telegram.Message.has_protected_content`. - - .. versionadded:: 13.9 -""" - - -class _Invoice(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.invoice) - - -INVOICE = _Invoice(name="filters.INVOICE") -"""Messages that contain :attr:`telegram.Message.invoice`.""" - - -class _IsAutomaticForward(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.is_automatic_forward) - - -IS_AUTOMATIC_FORWARD = _IsAutomaticForward(name="filters.IS_AUTOMATIC_FORWARD") -"""Messages that contain :attr:`telegram.Message.is_automatic_forward`. - - .. versionadded:: 13.9 -""" - - -class _IsTopicMessage(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.is_topic_message) - - -IS_TOPIC_MESSAGE = _IsTopicMessage(name="filters.IS_TOPIC_MESSAGE") -"""Messages that contain :attr:`telegram.Message.is_topic_message`. - - .. versionadded:: 20.0 -""" - - -class _IsFromOffline(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.is_from_offline) - - -IS_FROM_OFFLINE = _IsFromOffline(name="filters.IS_FROM_OFFLINE") -"""Messages that contain :attr:`telegram.Message.is_from_offline`. - - .. versionadded:: 21.1 -""" - - -class Language(MessageFilter): - """Filters messages to only allow those which are from users with a certain language code. - - Note: - According to official Telegram Bot API documentation, not every single user has the - `language_code` attribute. Do not count on this filter working on all users. - - Examples: - ``MessageHandler(filters.Language("en"), callback_method)`` - - Args: - lang (:obj:`str` | Collection[:obj:`str`]): - Which language code(s) to allow through. - This will be matched using :obj:`str.startswith` meaning that - 'en' will match both 'en_US' and 'en_GB'. - - """ - - __slots__ = ("lang",) - - def __init__(self, lang: SCT[str]): - if isinstance(lang, str): - lang = cast("str", lang) - self.lang: Sequence[str] = [lang] - else: - lang = cast("list[str]", lang) - self.lang = lang - super().__init__(name=f"filters.Language({self.lang})") - - def filter(self, message: Message) -> bool: - return bool( - message.from_user - and message.from_user.language_code - and any(message.from_user.language_code.startswith(x) for x in self.lang) - ) - - -class _Location(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.location) - - -LOCATION = _Location(name="filters.LOCATION") -"""Messages that contain :attr:`telegram.Message.location`.""" - - -class Mention(MessageFilter): - """Messages containing mentions of specified users or chats. - - Examples: - .. code-block:: python - - MessageHandler(filters.Mention("username"), callback) - MessageHandler(filters.Mention(["@username", 123456]), callback) - - .. versionadded:: 20.7 - - Args: - mentions (:obj:`int` | :obj:`str` | :class:`telegram.User` | Collection[:obj:`int` | \ - :obj:`str` | :class:`telegram.User`]): - Specifies the users and chats to filter for. Messages that do not mention at least one - of the specified users or chats will not be handled. Leading ``'@'`` s in usernames - will be discarded. - """ - - __slots__ = ("_mentions",) - - def __init__(self, mentions: SCT[Union[int, str, TGUser]]): - super().__init__(name=f"filters.Mention({mentions})") - if isinstance(mentions, Iterable) and not isinstance(mentions, str): - self._mentions = {self._fix_mention_username(mention) for mention in mentions} - else: - self._mentions = {self._fix_mention_username(mentions)} - - @staticmethod - def _fix_mention_username(mention: Union[int, str, TGUser]) -> Union[int, str, TGUser]: - if not isinstance(mention, str): - return mention - return mention.lstrip("@") - - @classmethod - def _check_mention(cls, message: Message, mention: Union[int, str, TGUser]) -> bool: - if not message.entities: - return False - - entity_texts = message.parse_entities( - types=[MessageEntity.MENTION, MessageEntity.TEXT_MENTION] - ) - - if isinstance(mention, TGUser): - return any( - mention.id == entity.user.id - or mention.username == entity.user.username - or mention.username == cls._fix_mention_username(entity_texts[entity]) - for entity in message.entities - if entity.user - ) or any( - mention.username == cls._fix_mention_username(entity_text) - for entity_text in entity_texts.values() - ) - if isinstance(mention, int): - return bool( - any(mention == entity.user.id for entity in message.entities if entity.user) - ) - return any( - mention == cls._fix_mention_username(entity_text) - for entity_text in entity_texts.values() - ) - - def filter(self, message: Message) -> bool: - return any(self._check_mention(message, mention) for mention in self._mentions) - - -class _PaidMedia(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.paid_media) - - -PAID_MEDIA = _PaidMedia(name="filters.PAID_MEDIA") -"""Messages that contain :attr:`telegram.Message.paid_media`. - -.. versionadded:: 21.4 -""" - - -class _PassportData(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.passport_data) - - -PASSPORT_DATA = _PassportData(name="filters.PASSPORT_DATA") -"""Messages that contain :attr:`telegram.Message.passport_data`.""" - - -class _Photo(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.photo) - - -PHOTO = _Photo("filters.PHOTO") -"""Messages that contain :attr:`telegram.Message.photo`.""" - - -class _Poll(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.poll) - - -POLL = _Poll(name="filters.POLL") -"""Messages that contain :attr:`telegram.Message.poll`.""" - - -class Regex(MessageFilter): - """ - Filters updates by searching for an occurrence of :paramref:`~Regex.pattern` in the message - text. - The :func:`re.search` function is used to determine whether an update should be filtered. - - Refer to the documentation of the :obj:`re` module for more information. - - To get the groups and groupdict matched, see :attr:`telegram.ext.CallbackContext.matches`. - - Examples: - Use ``MessageHandler(filters.Regex(r'help'), callback)`` to capture all messages that - contain the word 'help'. You can also use - ``MessageHandler(filters.Regex(re.compile(r'help', re.IGNORECASE)), callback)`` if - you want your pattern to be case insensitive. This approach is recommended - if you need to specify flags on your pattern. - - Note: - Filters use the same short circuiting logic as python's :keyword:`and`, :keyword:`or` and - :keyword:`not`. - This means that for example: - - >>> filters.Regex(r'(a?x)') | filters.Regex(r'(b?x)') - - With a :attr:`telegram.Message.text` of `x`, will only ever return the matches for the - first filter, since the second one is never evaluated. - - .. seealso:: :wiki:`Types of Handlers <Types-of-Handlers>` - - Args: - pattern (:obj:`str` | :func:`re.Pattern <re.compile>`): The regex pattern. - """ - - __slots__ = ("pattern",) - - def __init__(self, pattern: Union[str, Pattern[str]]): - if isinstance(pattern, str): - pattern = re.compile(pattern) - self.pattern: Pattern[str] = pattern - super().__init__(name=f"filters.Regex({self.pattern})", data_filter=True) - - def filter(self, message: Message) -> Optional[dict[str, list[Match[str]]]]: - if message.text and (match := self.pattern.search(message.text)): - return {"matches": [match]} - return {} - - -class _Reply(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.reply_to_message) - - -REPLY = _Reply(name="filters.REPLY") -"""Messages that contain :attr:`telegram.Message.reply_to_message`.""" - - -class _SenderChat(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.sender_chat) - - -class SenderChat(_ChatUserBaseFilter): - """Filters messages to allow only those which are from a specified sender chat's chat ID or - username. - - Examples: - * To filter for messages sent to a group by a channel with ID - ``-1234``, use ``MessageHandler(filters.SenderChat(-1234), callback_method)``. - * To filter for messages of anonymous admins in a super group with username - ``@anonymous``, use - ``MessageHandler(filters.SenderChat(username='anonymous'), callback_method)``. - * To filter for messages sent to a group by *any* channel, use - ``MessageHandler(filters.SenderChat.CHANNEL, callback_method)``. - * To filter for messages of anonymous admins in *any* super group, use - ``MessageHandler(filters.SenderChat.SUPERGROUP, callback_method)``. - * To filter for messages forwarded to a discussion group from *any* channel or of anonymous - admins in *any* super group, use ``MessageHandler(filters.SenderChat.ALL, callback)`` - - Note: - Remember, ``sender_chat`` is also set for messages in a channel as the channel itself, - so when your bot is an admin in a channel and the linked discussion group, you would - receive the message twice (once from inside the channel, once inside the discussion - group). Since v13.9, the field :attr:`telegram.Message.is_automatic_forward` will be - :obj:`True` for the discussion group message. - - .. seealso:: :attr:`telegram.ext.filters.IS_AUTOMATIC_FORWARD` - - Warning: - :attr:`chat_ids` will return a *copy* of the saved chat ids as :obj:`frozenset`. This - is to ensure thread safety. To add/remove a chat, you should use :meth:`add_chat_ids`, and - :meth:`remove_chat_ids`. Only update the entire set by ``filter.chat_ids = new_set``, if - you are entirely sure that it is not causing race conditions, as this will complete replace - the current set of allowed chats. - - Args: - chat_id(:obj:`int` | Collection[:obj:`int`], optional): - Which sender chat chat ID(s) to allow through. - username(:obj:`str` | Collection[:obj:`str`], optional): - Which sender chat username(s) to allow through. - Leading ``'@'`` s in usernames will be discarded. - allow_empty(:obj:`bool`, optional): Whether updates should be processed, if no sender - chat is specified in :attr:`chat_ids` and :attr:`usernames`. Defaults to :obj:`False`. - - Attributes: - chat_ids (set(:obj:`int`)): Which sender chat chat ID(s) to allow through. - allow_empty (:obj:`bool`): Whether updates should be processed, if no sender chat is - specified in :attr:`chat_ids` and :attr:`usernames`. - - Raises: - RuntimeError: If both ``chat_id`` and ``username`` are present. - """ - - __slots__ = () - - class _CHANNEL(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - if message.sender_chat: - return message.sender_chat.type == TGChat.CHANNEL - return False - - class _SUPERGROUP(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - if message.sender_chat: - return message.sender_chat.type == TGChat.SUPERGROUP - return False - - ALL = _SenderChat(name="filters.SenderChat.ALL") - """All messages with a :attr:`telegram.Message.sender_chat`.""" - SUPER_GROUP = _SUPERGROUP(name="filters.SenderChat.SUPER_GROUP") - """Messages whose sender chat is a super group.""" - CHANNEL = _CHANNEL(name="filters.SenderChat.CHANNEL") - """Messages whose sender chat is a channel.""" - - def add_chat_ids(self, chat_id: SCT[int]) -> None: - """ - Add one or more sender chats to the allowed chat ids. - - Args: - chat_id(:obj:`int` | Collection[:obj:`int`]): Which sender chat ID(s) to - allow through. - """ - return super()._add_chat_ids(chat_id) - - def _get_chat_or_user(self, message: Message) -> Optional[TGChat]: - return message.sender_chat - - def remove_chat_ids(self, chat_id: SCT[int]) -> None: - """ - Remove one or more sender chats from allowed chat ids. - - Args: - chat_id(:obj:`int` | Collection[:obj:`int`]): Which sender chat ID(s) to - disallow through. - """ - return super()._remove_chat_ids(chat_id) - - -class StatusUpdate: - """Subset for messages containing a status update. - - Examples: - Use these filters like: ``filters.StatusUpdate.NEW_CHAT_MEMBERS`` etc. Or use just - ``filters.StatusUpdate.ALL`` for all status update messages. - - Caution: - ``filters.StatusUpdate`` itself is *not* a filter, but just a convenience namespace. - - .. versionchanged:: 22.0 - Removed deprecated attribute `USER_SHARED`. - """ - - __slots__ = () - - class _All(UpdateFilter): - __slots__ = () - - def filter(self, update: Update) -> bool: - return bool( - # keep this alphabetically sorted for easier maintenance - StatusUpdate.CHAT_BACKGROUND_SET.check_update(update) - or StatusUpdate.CHAT_CREATED.check_update(update) - or StatusUpdate.CHAT_SHARED.check_update(update) - or StatusUpdate.CONNECTED_WEBSITE.check_update(update) - or StatusUpdate.DELETE_CHAT_PHOTO.check_update(update) - or StatusUpdate.FORUM_TOPIC_CLOSED.check_update(update) - or StatusUpdate.FORUM_TOPIC_CREATED.check_update(update) - or StatusUpdate.FORUM_TOPIC_EDITED.check_update(update) - or StatusUpdate.FORUM_TOPIC_REOPENED.check_update(update) - or StatusUpdate.GENERAL_FORUM_TOPIC_HIDDEN.check_update(update) - or StatusUpdate.GENERAL_FORUM_TOPIC_UNHIDDEN.check_update(update) - or StatusUpdate.GIFT.check_update(update) - or StatusUpdate.GIVEAWAY_COMPLETED.check_update(update) - or StatusUpdate.GIVEAWAY_CREATED.check_update(update) - or StatusUpdate.LEFT_CHAT_MEMBER.check_update(update) - or StatusUpdate.MESSAGE_AUTO_DELETE_TIMER_CHANGED.check_update(update) - or StatusUpdate.MIGRATE.check_update(update) - or StatusUpdate.NEW_CHAT_MEMBERS.check_update(update) - or StatusUpdate.NEW_CHAT_PHOTO.check_update(update) - or StatusUpdate.NEW_CHAT_TITLE.check_update(update) - or StatusUpdate.PAID_MESSAGE_PRICE_CHANGED.check_update(update) - or StatusUpdate.PINNED_MESSAGE.check_update(update) - or StatusUpdate.PROXIMITY_ALERT_TRIGGERED.check_update(update) - or StatusUpdate.REFUNDED_PAYMENT.check_update(update) - or StatusUpdate.UNIQUE_GIFT.check_update(update) - or StatusUpdate.USERS_SHARED.check_update(update) - or StatusUpdate.VIDEO_CHAT_ENDED.check_update(update) - or StatusUpdate.VIDEO_CHAT_PARTICIPANTS_INVITED.check_update(update) - or StatusUpdate.VIDEO_CHAT_SCHEDULED.check_update(update) - or StatusUpdate.VIDEO_CHAT_STARTED.check_update(update) - or StatusUpdate.WEB_APP_DATA.check_update(update) - or StatusUpdate.WRITE_ACCESS_ALLOWED.check_update(update) - ) - - ALL = _All(name="filters.StatusUpdate.ALL") - """Messages that contain any of the below.""" - - class _ChatBackgroundSet(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.chat_background_set) - - CHAT_BACKGROUND_SET = _ChatBackgroundSet(name="filters.StatusUpdate.CHAT_BACKGROUND_SET") - """Messages that contain :attr:`telegram.Message.chat_background_set`.""" - - class _ChatCreated(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool( - message.group_chat_created - or message.supergroup_chat_created - or message.channel_chat_created - ) - - CHAT_CREATED = _ChatCreated(name="filters.StatusUpdate.CHAT_CREATED") - """Messages that contain :attr:`telegram.Message.group_chat_created`, - :attr:`telegram.Message.supergroup_chat_created` or - :attr:`telegram.Message.channel_chat_created`.""" - - class _ChatShared(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.chat_shared) - - CHAT_SHARED = _ChatShared(name="filters.StatusUpdate.CHAT_SHARED") - """Messages that contain :attr:`telegram.Message.chat_shared`. - - .. versionadded:: 20.1 - """ - - class _ConnectedWebsite(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.connected_website) - - CONNECTED_WEBSITE = _ConnectedWebsite(name="filters.StatusUpdate.CONNECTED_WEBSITE") - """Messages that contain :attr:`telegram.Message.connected_website`.""" - - class _DeleteChatPhoto(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.delete_chat_photo) - - DELETE_CHAT_PHOTO = _DeleteChatPhoto(name="filters.StatusUpdate.DELETE_CHAT_PHOTO") - """Messages that contain :attr:`telegram.Message.delete_chat_photo`.""" - - class _ForumTopicClosed(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.forum_topic_closed) - - FORUM_TOPIC_CLOSED = _ForumTopicClosed(name="filters.StatusUpdate.FORUM_TOPIC_CLOSED") - """Messages that contain :attr:`telegram.Message.forum_topic_closed`. - - .. versionadded:: 20.0 - """ - - class _ForumTopicCreated(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.forum_topic_created) - - FORUM_TOPIC_CREATED = _ForumTopicCreated(name="filters.StatusUpdate.FORUM_TOPIC_CREATED") - """Messages that contain :attr:`telegram.Message.forum_topic_created`. - - .. versionadded:: 20.0 - """ - - class _ForumTopicEdited(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.forum_topic_edited) - - FORUM_TOPIC_EDITED = _ForumTopicEdited(name="filters.StatusUpdate.FORUM_TOPIC_EDITED") - """Messages that contain :attr:`telegram.Message.forum_topic_edited`. - - .. versionadded:: 20.0 - """ - - class _ForumTopicReopened(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.forum_topic_reopened) - - FORUM_TOPIC_REOPENED = _ForumTopicReopened(name="filters.StatusUpdate.FORUM_TOPIC_REOPENED") - """Messages that contain :attr:`telegram.Message.forum_topic_reopened`. - - .. versionadded:: 20.0 - """ - - class _GeneralForumTopicHidden(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.general_forum_topic_hidden) - - GENERAL_FORUM_TOPIC_HIDDEN = _GeneralForumTopicHidden( - name="filters.StatusUpdate.GENERAL_FORUM_TOPIC_HIDDEN" - ) - """Messages that contain :attr:`telegram.Message.general_forum_topic_hidden`. - - .. versionadded:: 20.0 - """ - - class _GeneralForumTopicUnhidden(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.general_forum_topic_unhidden) - - GENERAL_FORUM_TOPIC_UNHIDDEN = _GeneralForumTopicUnhidden( - name="filters.StatusUpdate.GENERAL_FORUM_TOPIC_UNHIDDEN" - ) - """Messages that contain :attr:`telegram.Message.general_forum_topic_unhidden`. - - .. versionadded:: 20.0 - """ - - class _Gift(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.gift) - - GIFT = _Gift(name="filters.StatusUpdate.GIFT") - """Messages that contain :attr:`telegram.Message.gift`. - - .. versionadded:: 22.1 - """ - - class _GiveawayCreated(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.giveaway_created) - - GIVEAWAY_CREATED = _GiveawayCreated(name="filters.StatusUpdate.GIVEAWAY_CREATED") - """Messages that contain :attr:`telegram.Message.giveaway_created`. - - .. versionadded:: 20.8 - """ - - class _GiveawayCompleted(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.giveaway_completed) - - GIVEAWAY_COMPLETED = _GiveawayCompleted(name="filters.StatusUpdate.GIVEAWAY_COMPLETED") - """Messages that contain :attr:`telegram.Message.giveaway_completed`. - .. versionadded:: 20.8 - """ - - class _LeftChatMember(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.left_chat_member) - - LEFT_CHAT_MEMBER = _LeftChatMember(name="filters.StatusUpdate.LEFT_CHAT_MEMBER") - """Messages that contain :attr:`telegram.Message.left_chat_member`.""" - - class _MessageAutoDeleteTimerChanged(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.message_auto_delete_timer_changed) - - MESSAGE_AUTO_DELETE_TIMER_CHANGED = _MessageAutoDeleteTimerChanged( - "filters.StatusUpdate.MESSAGE_AUTO_DELETE_TIMER_CHANGED" - ) - """Messages that contain :attr:`telegram.Message.message_auto_delete_timer_changed` - - .. versionadded:: 13.4 - """ - - class _Migrate(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.migrate_from_chat_id or message.migrate_to_chat_id) - - MIGRATE = _Migrate(name="filters.StatusUpdate.MIGRATE") - """Messages that contain :attr:`telegram.Message.migrate_from_chat_id` or - :attr:`telegram.Message.migrate_to_chat_id`.""" - - class _NewChatMembers(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.new_chat_members) - - NEW_CHAT_MEMBERS = _NewChatMembers(name="filters.StatusUpdate.NEW_CHAT_MEMBERS") - """Messages that contain :attr:`telegram.Message.new_chat_members`.""" - - class _NewChatPhoto(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.new_chat_photo) - - NEW_CHAT_PHOTO = _NewChatPhoto(name="filters.StatusUpdate.NEW_CHAT_PHOTO") - """Messages that contain :attr:`telegram.Message.new_chat_photo`.""" - - class _NewChatTitle(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.new_chat_title) - - NEW_CHAT_TITLE = _NewChatTitle(name="filters.StatusUpdate.NEW_CHAT_TITLE") - """Messages that contain :attr:`telegram.Message.new_chat_title`.""" - - class _PaidMessagePriceChanged(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.paid_message_price_changed) - - PAID_MESSAGE_PRICE_CHANGED = _PaidMessagePriceChanged( - name="filters.StatusUpdate.PAID_MESSAGE_PRICE_CHANGED" - ) - """Messages that contain :attr:`telegram.Message.paid_message_price_changed`. - - .. versionadded:: 22.1 - """ - - class _PinnedMessage(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.pinned_message) - - PINNED_MESSAGE = _PinnedMessage(name="filters.StatusUpdate.PINNED_MESSAGE") - """Messages that contain :attr:`telegram.Message.pinned_message`.""" - - class _ProximityAlertTriggered(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.proximity_alert_triggered) - - PROXIMITY_ALERT_TRIGGERED = _ProximityAlertTriggered( - "filters.StatusUpdate.PROXIMITY_ALERT_TRIGGERED" - ) - """Messages that contain :attr:`telegram.Message.proximity_alert_triggered`.""" - - class _RefundedPayment(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.refunded_payment) - - REFUNDED_PAYMENT = _RefundedPayment("filters.StatusUpdate.REFUNDED_PAYMENT") - """Messages that contain :attr:`telegram.Message.refunded_payment`. - .. versionadded:: 21.4 - """ - - class _UniqueGift(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.unique_gift) - - UNIQUE_GIFT = _UniqueGift(name="filters.StatusUpdate.UNIQUE_GIFT") - """Messages that contain :attr:`telegram.Message.unique_gift`. - - .. versionadded:: 22.1 - """ - - class _UsersShared(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.users_shared) - - USERS_SHARED = _UsersShared(name="filters.StatusUpdate.USERS_SHARED") - """Messages that contain :attr:`telegram.Message.users_shared`. - - .. versionadded:: 20.8 - """ - - class _VideoChatEnded(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.video_chat_ended) - - VIDEO_CHAT_ENDED = _VideoChatEnded(name="filters.StatusUpdate.VIDEO_CHAT_ENDED") - """Messages that contain :attr:`telegram.Message.video_chat_ended`. - - .. versionadded:: 13.4 - .. versionchanged:: 20.0 - This filter was formerly named ``VOICE_CHAT_ENDED`` - """ - - class _VideoChatScheduled(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.video_chat_scheduled) - - VIDEO_CHAT_SCHEDULED = _VideoChatScheduled(name="filters.StatusUpdate.VIDEO_CHAT_SCHEDULED") - """Messages that contain :attr:`telegram.Message.video_chat_scheduled`. - - .. versionadded:: 13.5 - .. versionchanged:: 20.0 - This filter was formerly named ``VOICE_CHAT_SCHEDULED`` - """ - - class _VideoChatStarted(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.video_chat_started) - - VIDEO_CHAT_STARTED = _VideoChatStarted(name="filters.StatusUpdate.VIDEO_CHAT_STARTED") - """Messages that contain :attr:`telegram.Message.video_chat_started`. - - .. versionadded:: 13.4 - .. versionchanged:: 20.0 - This filter was formerly named ``VOICE_CHAT_STARTED`` - """ - - class _VideoChatParticipantsInvited(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.video_chat_participants_invited) - - VIDEO_CHAT_PARTICIPANTS_INVITED = _VideoChatParticipantsInvited( - "filters.StatusUpdate.VIDEO_CHAT_PARTICIPANTS_INVITED" - ) - """Messages that contain :attr:`telegram.Message.video_chat_participants_invited`. - - .. versionadded:: 13.4 - .. versionchanged:: 20.0 - This filter was formerly named ``VOICE_CHAT_PARTICIPANTS_INVITED`` - """ - - class _WebAppData(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.web_app_data) - - WEB_APP_DATA = _WebAppData(name="filters.StatusUpdate.WEB_APP_DATA") - """Messages that contain :attr:`telegram.Message.web_app_data`. - - .. versionadded:: 20.0 - """ - - class _WriteAccessAllowed(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.write_access_allowed) - - WRITE_ACCESS_ALLOWED = _WriteAccessAllowed(name="filters.StatusUpdate.WRITE_ACCESS_ALLOWED") - """Messages that contain :attr:`telegram.Message.write_access_allowed`. - - .. versionadded:: 20.0 - """ - - -class Sticker: - """Filters messages which contain a sticker. - - Examples: - Use this filter like: ``filters.Sticker.VIDEO``. Or, just use ``filters.Sticker.ALL`` for - any type of sticker. - - Caution: - ``filters.Sticker`` itself is *not* a filter, but just a convenience namespace. - """ - - __slots__ = () - - class _All(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.sticker) - - ALL = _All(name="filters.Sticker.ALL") - """Messages that contain :attr:`telegram.Message.sticker`.""" - - class _Animated(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.sticker) and bool(message.sticker.is_animated) # type: ignore - - ANIMATED = _Animated(name="filters.Sticker.ANIMATED") - """Messages that contain :attr:`telegram.Message.sticker` and - :attr:`is animated <telegram.Sticker.is_animated>`. - - .. versionadded:: 20.0 - """ - - class _Static(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.sticker) and ( - not bool(message.sticker.is_animated) # type: ignore[union-attr] - and not bool(message.sticker.is_video) # type: ignore[union-attr] - ) - - STATIC = _Static(name="filters.Sticker.STATIC") - """Messages that contain :attr:`telegram.Message.sticker` and is a static sticker, i.e. does - not contain :attr:`telegram.Sticker.is_animated` or :attr:`telegram.Sticker.is_video`. - - .. versionadded:: 20.0 - """ - - class _Video(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.sticker) and bool(message.sticker.is_video) # type: ignore - - VIDEO = _Video(name="filters.Sticker.VIDEO") - """Messages that contain :attr:`telegram.Message.sticker` and is a - :attr:`video sticker <telegram.Sticker.is_video>`. - - .. versionadded:: 20.0 - """ - - class _Premium(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.sticker) and bool( - message.sticker.premium_animation # type: ignore - ) - - PREMIUM = _Premium(name="filters.Sticker.PREMIUM") - """Messages that contain :attr:`telegram.Message.sticker` and have a - :attr:`premium animation <telegram.Sticker.premium_animation>`. - - .. versionadded:: 20.0 - """ - # neither mask nor emoji can be a message.sticker, so no filters for them - - -class _Story(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.story) - - -STORY = _Story(name="filters.STORY") -"""Messages that contain :attr:`telegram.Message.story`. - -.. versionadded:: 20.5 -""" - - -class SuccessfulPayment(MessageFilter): - """Successful Payment Messages. If a list of invoice payloads is passed, it filters - messages to only allow those whose `invoice_payload` is appearing in the given list. - - Examples: - `MessageHandler(filters.SuccessfulPayment(['Custom-Payload']), callback_method)` - - .. seealso:: - :attr:`telegram.ext.filters.SUCCESSFUL_PAYMENT` - - Args: - invoice_payloads (list[:obj:`str`] | tuple[:obj:`str`], optional): Which - invoice payloads to allow. Only exact matches are allowed. If not - specified, will allow any invoice payload. - - .. versionadded:: 20.8 - """ - - __slots__ = ("invoice_payloads",) - - def __init__(self, invoice_payloads: Optional[Union[list[str], tuple[str, ...]]] = None): - self.invoice_payloads: Optional[Sequence[str]] = invoice_payloads - super().__init__( - name=( - f"filters.SuccessfulPayment({invoice_payloads})" - if invoice_payloads - else "filters.SUCCESSFUL_PAYMENT" - ) - ) - - def filter(self, message: Message) -> bool: - if self.invoice_payloads is None: - return bool(message.successful_payment) - return ( - payment.invoice_payload in self.invoice_payloads - if (payment := message.successful_payment) - else False - ) - - -SUCCESSFUL_PAYMENT = SuccessfulPayment() -"""Messages that contain :attr:`telegram.Message.successful_payment`.""" - - -class Text(MessageFilter): - """Text Messages. If a list of strings is passed, it filters messages to only allow those - whose text is appearing in the given list. - - Examples: - A simple use case for passing a list is to allow only messages that were sent by a - custom :class:`telegram.ReplyKeyboardMarkup`:: - - buttons = ['Start', 'Settings', 'Back'] - markup = ReplyKeyboardMarkup.from_column(buttons) - ... - MessageHandler(filters.Text(buttons), callback_method) - - .. seealso:: - :attr:`telegram.ext.filters.TEXT` - - - Note: - * Dice messages don't have text. If you want to filter either text or dice messages, use - ``filters.TEXT | filters.Dice.ALL``. - * Messages containing a command are accepted by this filter. Use - ``filters.TEXT & (~filters.COMMAND)``, if you want to filter only text messages without - commands. - - Args: - strings (list[:obj:`str`] | tuple[:obj:`str`], optional): Which messages to allow. Only - exact matches are allowed. If not specified, will allow any text message. - """ - - __slots__ = ("strings",) - - def __init__(self, strings: Optional[Union[list[str], tuple[str, ...]]] = None): - self.strings: Optional[Sequence[str]] = strings - super().__init__(name=f"filters.Text({strings})" if strings else "filters.TEXT") - - def filter(self, message: Message) -> bool: - if self.strings is None: - return bool(message.text) - return message.text in self.strings if message.text else False - - -TEXT = Text() -""" -Shortcut for :class:`telegram.ext.filters.Text()`. - -Examples: - To allow any text message, simply use ``MessageHandler(filters.TEXT, callback_method)``. -""" - - -class UpdateType: - """ - Subset for filtering the type of update. - - Examples: - Use these filters like: ``filters.UpdateType.MESSAGE`` or - ``filters.UpdateType.CHANNEL_POSTS`` etc. - - Caution: - ``filters.UpdateType`` itself is *not* a filter, but just a convenience namespace. - """ - - __slots__ = () - - class _ChannelPost(UpdateFilter): - __slots__ = () - - def filter(self, update: Update) -> bool: - return update.channel_post is not None - - CHANNEL_POST = _ChannelPost(name="filters.UpdateType.CHANNEL_POST") - """Updates with :attr:`telegram.Update.channel_post`.""" - - class _ChannelPosts(UpdateFilter): - __slots__ = () - - def filter(self, update: Update) -> bool: - return update.channel_post is not None or update.edited_channel_post is not None - - CHANNEL_POSTS = _ChannelPosts(name="filters.UpdateType.CHANNEL_POSTS") - """Updates with either :attr:`telegram.Update.channel_post` or - :attr:`telegram.Update.edited_channel_post`.""" - - class _Edited(UpdateFilter): - __slots__ = () - - def filter(self, update: Update) -> bool: - return ( - update.edited_message is not None - or update.edited_channel_post is not None - or update.edited_business_message is not None - ) - - EDITED = _Edited(name="filters.UpdateType.EDITED") - """Updates with :attr:`telegram.Update.edited_message`, - :attr:`telegram.Update.edited_channel_post`, or - :attr:`telegram.Update.edited_business_message`. - - .. versionadded:: 20.0 - - .. versionchanged:: 21.1 - Added :attr:`telegram.Update.edited_business_message` to the filter. - """ - - class _EditedChannelPost(UpdateFilter): - __slots__ = () - - def filter(self, update: Update) -> bool: - return update.edited_channel_post is not None - - EDITED_CHANNEL_POST = _EditedChannelPost(name="filters.UpdateType.EDITED_CHANNEL_POST") - """Updates with :attr:`telegram.Update.edited_channel_post`.""" - - class _EditedMessage(UpdateFilter): - __slots__ = () - - def filter(self, update: Update) -> bool: - return update.edited_message is not None - - EDITED_MESSAGE = _EditedMessage(name="filters.UpdateType.EDITED_MESSAGE") - """Updates with :attr:`telegram.Update.edited_message`.""" - - class _Message(UpdateFilter): - __slots__ = () - - def filter(self, update: Update) -> bool: - return update.message is not None - - MESSAGE = _Message(name="filters.UpdateType.MESSAGE") - """Updates with :attr:`telegram.Update.message`.""" - - class _Messages(UpdateFilter): - __slots__ = () - - def filter(self, update: Update) -> bool: - return update.message is not None or update.edited_message is not None - - MESSAGES = _Messages(name="filters.UpdateType.MESSAGES") - """Updates with either :attr:`telegram.Update.message` or - :attr:`telegram.Update.edited_message`. - """ - - class _BusinessMessage(UpdateFilter): - __slots__ = () - - def filter(self, update: Update) -> bool: - return update.business_message is not None - - BUSINESS_MESSAGE = _BusinessMessage(name="filters.UpdateType.BUSINESS_MESSAGE") - """Updates with :attr:`telegram.Update.business_message`. - - .. versionadded:: 21.1""" - - class _EditedBusinessMessage(UpdateFilter): - __slots__ = () - - def filter(self, update: Update) -> bool: - return update.edited_business_message is not None - - EDITED_BUSINESS_MESSAGE = _EditedBusinessMessage( - name="filters.UpdateType.EDITED_BUSINESS_MESSAGE" - ) - """Updates with :attr:`telegram.Update.edited_business_message`. - - .. versionadded:: 21.1 - """ - - class _BusinessMessages(UpdateFilter): - __slots__ = () - - def filter(self, update: Update) -> bool: - return ( - update.business_message is not None or update.edited_business_message is not None - ) - - BUSINESS_MESSAGES = _BusinessMessages(name="filters.UpdateType.BUSINESS_MESSAGES") - """Updates with either :attr:`telegram.Update.business_message` or - :attr:`telegram.Update.edited_business_message`. - - .. versionadded:: 21.1 - """ - - -class User(_ChatUserBaseFilter): - """Filters messages to allow only those which are from specified user ID(s) or - username(s). - - Examples: - ``MessageHandler(filters.User(1234), callback_method)`` - - Args: - user_id(:obj:`int` | Collection[:obj:`int`], optional): Which user ID(s) to - allow through. - username(:obj:`str` | Collection[:obj:`str`], optional): - Which username(s) to allow through. Leading ``'@'`` s in usernames will be discarded. - allow_empty(:obj:`bool`, optional): Whether updates should be processed, if no user is - specified in :attr:`user_ids` and :attr:`usernames`. Defaults to :obj:`False`. - - Raises: - RuntimeError: If ``user_id`` and ``username`` are both present. - - Attributes: - allow_empty (:obj:`bool`): Whether updates should be processed, if no user is specified in - :attr:`user_ids` and :attr:`usernames`. - """ - - __slots__ = () - - def __init__( - self, - user_id: Optional[SCT[int]] = None, - username: Optional[SCT[str]] = None, - allow_empty: bool = False, - ): - super().__init__(chat_id=user_id, username=username, allow_empty=allow_empty) - self._chat_id_name = "user_id" - - def _get_chat_or_user(self, message: Message) -> Optional[TGUser]: - return message.from_user - - @property - def user_ids(self) -> frozenset[int]: - """ - Which user ID(s) to allow through. - - Warning: - :attr:`user_ids` will give a *copy* of the saved user ids as :obj:`frozenset`. This - is to ensure thread safety. To add/remove a user, you should use :meth:`add_user_ids`, - and :meth:`remove_user_ids`. Only update the entire set by - ``filter.user_ids = new_set``, if you are entirely sure that it is not causing race - conditions, as this will complete replace the current set of allowed users. - - Returns: - frozenset(:obj:`int`) - """ - return self.chat_ids - - @user_ids.setter - def user_ids(self, user_id: SCT[int]) -> None: - self.chat_ids = user_id # type: ignore[assignment] - - def add_user_ids(self, user_id: SCT[int]) -> None: - """ - Add one or more users to the allowed user ids. - - Args: - user_id(:obj:`int` | Collection[:obj:`int`]): Which user ID(s) to allow - through. - """ - return super()._add_chat_ids(user_id) - - def remove_user_ids(self, user_id: SCT[int]) -> None: - """ - Remove one or more users from allowed user ids. - - Args: - user_id(:obj:`int` | Collection[:obj:`int`]): Which user ID(s) to - disallow through. - """ - return super()._remove_chat_ids(user_id) - - -class _User(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.from_user) - - -USER = _User(name="filters.USER") -"""This filter filters *any* message that has a :attr:`telegram.Message.from_user`.""" - - -class _UserAttachment(UpdateFilter): - __slots__ = () - - def filter(self, update: Update) -> bool: - return bool(update.effective_user) and bool( - update.effective_user.added_to_attachment_menu # type: ignore - ) - - -USER_ATTACHMENT = _UserAttachment(name="filters.USER_ATTACHMENT") -"""This filter filters *any* message that have a user who added the bot to their -:attr:`attachment menu <telegram.User.added_to_attachment_menu>` as -:attr:`telegram.Update.effective_user`. - -.. versionadded:: 20.0 -""" - - -class _UserPremium(UpdateFilter): - __slots__ = () - - def filter(self, update: Update) -> bool: - return bool(update.effective_user) and bool( - update.effective_user.is_premium # type: ignore - ) - - -PREMIUM_USER = _UserPremium(name="filters.PREMIUM_USER") -"""This filter filters *any* message from a -:attr:`Telegram Premium user <telegram.User.is_premium>` as :attr:`telegram.Update.effective_user`. - -.. versionadded:: 20.0 -""" - - -class _Venue(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.venue) - - -VENUE = _Venue(name="filters.VENUE") -"""Messages that contain :attr:`telegram.Message.venue`.""" - - -class ViaBot(_ChatUserBaseFilter): - """Filters messages to allow only those which are from specified via_bot ID(s) or username(s). - - Examples: - ``MessageHandler(filters.ViaBot(1234), callback_method)`` - - .. seealso:: :attr:`~telegram.ext.filters.VIA_BOT` - - Args: - bot_id(:obj:`int` | Collection[:obj:`int`], optional): Which bot ID(s) to - allow through. - username(:obj:`str` | Collection[:obj:`str`], optional): - Which username(s) to allow through. Leading ``'@'`` s in usernames will be - discarded. - allow_empty(:obj:`bool`, optional): Whether updates should be processed, if no user - is specified in :attr:`bot_ids` and :attr:`usernames`. Defaults to :obj:`False`. - - Raises: - RuntimeError: If ``bot_id`` and ``username`` are both present. - - Attributes: - allow_empty (:obj:`bool`): Whether updates should be processed, if no bot is specified in - :attr:`bot_ids` and :attr:`usernames`. - """ - - __slots__ = () - - def __init__( - self, - bot_id: Optional[SCT[int]] = None, - username: Optional[SCT[str]] = None, - allow_empty: bool = False, - ): - super().__init__(chat_id=bot_id, username=username, allow_empty=allow_empty) - self._chat_id_name = "bot_id" - - def _get_chat_or_user(self, message: Message) -> Optional[TGUser]: - return message.via_bot - - @property - def bot_ids(self) -> frozenset[int]: - """ - Which bot ID(s) to allow through. - - Warning: - :attr:`bot_ids` will give a *copy* of the saved bot ids as :obj:`frozenset`. This - is to ensure thread safety. To add/remove a bot, you should use :meth:`add_bot_ids`, - and :meth:`remove_bot_ids`. Only update the entire set by ``filter.bot_ids = new_set``, - if you are entirely sure that it is not causing race conditions, as this will complete - replace the current set of allowed bots. - - Returns: - frozenset(:obj:`int`) - """ - return self.chat_ids - - @bot_ids.setter - def bot_ids(self, bot_id: SCT[int]) -> None: - self.chat_ids = bot_id # type: ignore[assignment] - - def add_bot_ids(self, bot_id: SCT[int]) -> None: - """ - Add one or more bots to the allowed bot ids. - - Args: - bot_id(:obj:`int` | Collection[:obj:`int`]): Which bot ID(s) to allow - through. - """ - return super()._add_chat_ids(bot_id) - - def remove_bot_ids(self, bot_id: SCT[int]) -> None: - """ - Remove one or more bots from allowed bot ids. - - Args: - bot_id(:obj:`int` | Collection[:obj:`int`], optional): Which bot ID(s) to - disallow through. - """ - return super()._remove_chat_ids(bot_id) - - -class _ViaBot(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.via_bot) - - -VIA_BOT = _ViaBot(name="filters.VIA_BOT") -"""This filter filters for message that were sent via *any* bot. - -.. seealso:: :class:`~telegram.ext.filters.ViaBot`""" - - -class _Video(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.video) - - -VIDEO = _Video(name="filters.VIDEO") -"""Messages that contain :attr:`telegram.Message.video`.""" - - -class _VideoNote(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.video_note) - - -VIDEO_NOTE = _VideoNote(name="filters.VIDEO_NOTE") -"""Messages that contain :attr:`telegram.Message.video_note`.""" - - -class _Voice(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.voice) - - -VOICE = _Voice("filters.VOICE") -"""Messages that contain :attr:`telegram.Message.voice`.""" - - -class _ReplyToStory(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.reply_to_story) - - -REPLY_TO_STORY = _ReplyToStory(name="filters.REPLY_TO_STORY") -"""Messages that contain :attr:`telegram.Message.reply_to_story`.""" - - -class _BoostAdded(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.boost_added) - - -BOOST_ADDED = _BoostAdded(name="filters.BOOST_ADDED") -"""Messages that contain :attr:`telegram.Message.boost_added`.""" - - -class _SenderBoostCount(MessageFilter): - __slots__ = () - - def filter(self, message: Message) -> bool: - return bool(message.sender_boost_count) - - -SENDER_BOOST_COUNT = _SenderBoostCount(name="filters.SENDER_BOOST_COUNT") -"""Messages that contain :attr:`telegram.Message.sender_boost_count`.""" diff --git a/venv/lib/python3.12/site-packages/telegram/helpers.py b/venv/lib/python3.12/site-packages/telegram/helpers.py deleted file mode 100644 index 81dd4b6..0000000 --- a/venv/lib/python3.12/site-packages/telegram/helpers.py +++ /dev/null @@ -1,201 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains convenience helper functions. - -.. versionchanged:: 20.0 - Previously, the contents of this module were available through the (no longer existing) - module ``telegram.utils.helpers``. -""" - -__all__ = ( - "create_deep_linked_url", - "effective_message_type", - "escape_markdown", - "mention_html", - "mention_markdown", -) - -import re -from html import escape -from typing import TYPE_CHECKING, Optional, Union - -from telegram._utils.types import MarkdownVersion -from telegram.constants import MessageLimit, MessageType - -if TYPE_CHECKING: - from telegram import Message, Update - - -def escape_markdown( - text: str, version: MarkdownVersion = 1, entity_type: Optional[str] = None -) -> str: - """Helper function to escape telegram markup symbols. - - .. versionchanged:: 20.3 - Custom emoji entity escaping is now supported. - - Args: - text (:obj:`str`): The text. - version (:obj:`int` | :obj:`str`): Use to specify the version of telegrams Markdown. - Either ``1`` or ``2``. Defaults to ``1``. - entity_type (:obj:`str`, optional): For the entity types - :tg-const:`telegram.MessageEntity.PRE`, :tg-const:`telegram.MessageEntity.CODE` and - the link part of :tg-const:`telegram.MessageEntity.TEXT_LINK` and - :tg-const:`telegram.MessageEntity.CUSTOM_EMOJI`, only certain characters need to be - escaped in :tg-const:`telegram.constants.ParseMode.MARKDOWN_V2`. See the `official API - documentation <https://core.telegram.org/bots/api#formatting-options>`_ for details. - Only valid in combination with ``version=2``, will be ignored else. - """ - if int(version) == 1: - escape_chars = r"_*`[" - elif int(version) == 2: - if entity_type in ["pre", "code"]: - escape_chars = r"\`" - elif entity_type in ["text_link", "custom_emoji"]: - escape_chars = r"\)" - else: - escape_chars = r"\_*[]()~`>#+-=|{}.!" - else: - raise ValueError("Markdown version must be either 1 or 2!") - - return re.sub(f"([{re.escape(escape_chars)}])", r"\\\1", text) - - -def mention_html(user_id: Union[int, str], name: str) -> str: - """ - Helper function to create a user mention as HTML tag. - - Args: - user_id (:obj:`int`): The user's id which you want to mention. - name (:obj:`str`): The name the mention is showing. - - Returns: - :obj:`str`: The inline mention for the user as HTML. - """ - return f'<a href="tg://user?id={user_id}">{escape(name)}</a>' - - -def mention_markdown(user_id: Union[int, str], name: str, version: MarkdownVersion = 1) -> str: - """ - Helper function to create a user mention in Markdown syntax. - - Args: - user_id (:obj:`int`): The user's id which you want to mention. - name (:obj:`str`): The name the mention is showing. - version (:obj:`int` | :obj:`str`): Use to specify the version of Telegram's Markdown. - Either ``1`` or ``2``. Defaults to ``1``. - - Returns: - :obj:`str`: The inline mention for the user as Markdown. - """ - tg_link = f"tg://user?id={user_id}" - if version == 1: - return f"[{name}]({tg_link})" - return f"[{escape_markdown(name, version=version)}]({tg_link})" - - -def effective_message_type(entity: Union["Message", "Update"]) -> Optional[str]: - """ - Extracts the type of message as a string identifier from a :class:`telegram.Message` or a - :class:`telegram.Update`. - - Args: - entity (:class:`telegram.Update` | :class:`telegram.Message`): The ``update`` or - ``message`` to extract from. - - Returns: - :obj:`str` | :obj:`None`: One of :class:`telegram.constants.MessageType` if the entity - contains a message that matches one of those types. :obj:`None` otherwise. - - """ - # Importing on file-level yields cyclic Import Errors - from telegram import Message, Update # pylint: disable=import-outside-toplevel - - if isinstance(entity, Message): - message = entity - elif isinstance(entity, Update): - if not entity.effective_message: - return None - message = entity.effective_message - else: - raise TypeError(f"The entity is neither Message nor Update (got: {type(entity)})") - - for message_type in MessageType: - if message[message_type]: - return message_type - - return None - - -def create_deep_linked_url( - bot_username: str, payload: Optional[str] = None, group: bool = False -) -> str: - """ - Creates a deep-linked URL for this :paramref:`~create_deep_linked_url.bot_username` with the - specified :paramref:`~create_deep_linked_url.payload`. See - https://core.telegram.org/bots/features#deep-linking to learn more. - - The :paramref:`~create_deep_linked_url.payload` may consist of the following characters: - ``A-Z, a-z, 0-9, _, -`` - - Note: - Works well in conjunction with - ``CommandHandler("start", callback, filters=filters.Regex('payload'))`` - - Examples: - * ``create_deep_linked_url(bot.get_me().username, "some-params")`` - * :any:`Deep Linking <examples.deeplinking>` - - Args: - bot_username (:obj:`str`): The username to link to. - payload (:obj:`str`, optional): Parameters to encode in the created URL. - group (:obj:`bool`, optional): If :obj:`True` the user is prompted to select a group to - add the bot to. If :obj:`False`, opens a one-on-one conversation with the bot. - Defaults to :obj:`False`. - - Returns: - :obj:`str`: An URL to start the bot with specific parameters. - - Raises: - :exc:`ValueError`: If the length of the :paramref:`payload` exceeds \ - :tg-const:`telegram.constants.MessageLimit.DEEP_LINK_LENGTH` characters, - contains invalid characters, or if the :paramref:`bot_username` is less than 4 - characters. - """ - if bot_username is None or len(bot_username) <= 3: - raise ValueError("You must provide a valid bot_username.") - - base_url = f"https://t.me/{bot_username}" - if not payload: - return base_url - - if len(payload) > MessageLimit.DEEP_LINK_LENGTH: - raise ValueError( - f"The deep-linking payload must not exceed {MessageLimit.DEEP_LINK_LENGTH} characters." - ) - - if not re.match(r"^[A-Za-z0-9_-]+$", payload): - raise ValueError( - "Only the following characters are allowed for deep-linked " - "URLs: A-Z, a-z, 0-9, _ and -" - ) - - key = "startgroup" if group else "start" - - return f"{base_url}?{key}={payload}" diff --git a/venv/lib/python3.12/site-packages/telegram/py.typed b/venv/lib/python3.12/site-packages/telegram/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/telegram/request/__init__.py b/venv/lib/python3.12/site-packages/telegram/request/__init__.py deleted file mode 100644 index 87040d7..0000000 --- a/venv/lib/python3.12/site-packages/telegram/request/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -# !/usr/bin/env python -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains classes that handle the networking backend of ``python-telegram-bot``.""" - -from ._baserequest import BaseRequest -from ._httpxrequest import HTTPXRequest -from ._requestdata import RequestData - -__all__ = ("BaseRequest", "HTTPXRequest", "RequestData") diff --git a/venv/lib/python3.12/site-packages/telegram/request/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/request/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 84f08e992a393661e5e98a519ee701d63a03a3b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 507 zcmYLFJx?1!5Z(3p0~tGgx-Eht7xo5dK#EdC6jTTy7w9O~d$$|kiM`!pcWmOM;#bh6 z=eO_=EFmEwid2B;TxHHSVT#dvJ2P+R&26{aCKykDerNl2LLMse7PU2a{es|{C=wGz zRn5?%7T0KnBNG+%xW2@7(<qv86LBMM&6>T|ud`v62Ua*WF`A{$g3N7TsgWV*z#x;r zGHDeSA=AuixODzJw_}#b^jurT+z&Pyl{3hk?SnRY>}AnU9E?VTzZ7@s(fQ_g8T5(1 znCJjVJBP#J@##C?T*CtivKRRXhdkOOzJckew=r)Cp<F7&ydx4+@++lf<Gd>}fb!?t zTQ!GmYpPIjsZvQuV}!UNuh>BrCC^-;c_AT8`GHF(g|-m*e**z>wCDTEU0UO$(w<MX zopO^Wd}Vfbu)V`W4!U3BCFEGYPxJNnT!`G}AjF`YEjGTcj{MDkzy+$ygpZh>BTDJZ YCqfhYNVe|C=R2}>-`=}w`3_e90an188vp<R diff --git a/venv/lib/python3.12/site-packages/telegram/request/__pycache__/_baserequest.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/request/__pycache__/_baserequest.cpython-312.pyc deleted file mode 100644 index 3df98696bada6a6db16d294332bf1600031e0e1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18631 zcmeG^Yiu0Hd9(L^^7wu~R-`2I_&D0KY{@6t2_;fAZHba4%C0YtkIUPoc+x$X**#ID zkBOrwDcuB!)CQ3Z$Bt4IhyuHS&_4}|2C)Cc1^VaCbW3I<BM$mN`=>pN4wBgU(eInt zy$4Cfik&tMpq02g@A+oto9{K>+&}vL9s<vQzxw>#-yJ37Uoc`m4kNI!M<C=Xkx7Ke zf^10$5rKUz5es~+32V|8u?d)GOW2c+h=Yag31`w3aj~!?;ZAxYo}@S8P5L6fq(9<M zRz<2<o-+|hR!3@B*ahL*NG%Jy6Lrb@NIeUC5)H}5NFxh-6HUqHNOQ6!(!%1tL~F7w z($2#EL`SkS(wXdvbS1@znA{QBk?f9iCwn42$(@m%$z73MtXx%Mcd|FqD-a7&d~!gp ze!b>33m<Ky57O$DAf(k6)A}uBoXB;Th+M7M<mwhEst9MFGAF9^ea&XHGPr07)-R1s z&BawQnU*sNMU16WniNl|qLdP)8C9cFOcP@XNmWHHEheRNig@DqsVT^o#qqHzkt$!v zD5|E0{uA4r3<`SNh*51sT};IeLwm{v?U<C3&L|YJJ&#RIoj9dQT1JJKe+oKKW~A7; zsl|CEXxHsW;wdSiyN=Im@ic~<nDLZEb^GZQr0DipEC5w~qhm)#P9L3$P9C2eV{v6x z$|SU>q(nx+j?O4rG?6~TyY)>06l1AaT8^jA1TDJj@l(eqN8>RKx*C0IA~m1UppG{h zJ+Dv|`iVw^F5PoTl27sh>b}Esl6EY9hDw?u>n<4AYyzvhkEH2LT$YuT?wd%RmlAP# zDt!)PlZv*Grsu{eO;g=-Qqkz*$gHMN7_^d5prIto!fuUDMkP(sEhndR?;%N5j6}${ z&!jUc8OOv{BASwtO02Y=gwz|6jlTf|xk?lQ$WJ1c(}3;~t89tbWUFF-naH+RtPzLe zR9p->+_L>3RCE)?6Y)Z-Pj+Csk>})jvP<#HZpA-qlRcMgkt*4%1e9u}#w;oOAkJd4 zA40X5F1uyNtV^zf@^yfw4QB@p_{u)eW<Y7e(z6yhaLM+Xk!OA*&3CBRC0Cb9M_TS! zs-~<|tI{Sr6fgfbYnN*kms|(^w=-z#l@1Px+)xZP7DG+NkXz|gx)f3A!dl9XSu2CS zN^ZVnFGAg|v=#fYv3~Bp^`2Ru+)~!o&Mh#venPl=W~=44OZLbvWw+d}^uXMA!FqO- z%~0<h=5h0^eNqVel%UcxYhg21Eq9iUvVYML6lpt5sq`5jOeXaZ<3Kp*EKmoN{J{Pb zr9>jVpo;U0+FUv{q#65YXeO-{$&*QuFhQGB#6yrba$+Ln5#c!uWNk(f<H`Ail2o7v zSv((?L^(b?t5ArG5)!R=T0|-(CgL+xqH#qHi6f~}B?(EBn4X2^fpD@d$r?{)RIOAB zVJ(r+qyiAjNLFQWo~Gv&s$shxR&gSwYEmkusFjV1F%E4;1u!M3Yruvy8mJjiV@6cf zL2+RYpyzFcLO{c1B^)*;iKpV&S#@zCuFaWLJDQ$3tHiW00|JZS)5GfXYA`&S&YYP` zEQ&w|<3QbTj<od0bp@oZvQcS4iffy?4aHM&Ee-^8N$Cr22Lgvj6dA=&+)az>Tt<`A z3n^%iH3*ZTDvFd)(=Z=lT!Zj*G%Df3(`a;>twve$g}4T(#-dEc=SyQiZXqfL`(V{% zh4T^-=15Mb6h5(taJZJTL}deg7JF6bIxUB%&#LLvv^cXU%A8Yil*Ca^rA1g|Q4(W- zLg}PgQ=CmxhGc`{VmianAr1VA#%0AE&AdcaC5kOa=cUC&T9WywiWpv;ShMN$nRpEM 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 L{1<jiWT5>IIQU%e diff --git a/venv/lib/python3.12/site-packages/telegram/request/__pycache__/_httpxrequest.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/request/__pycache__/_httpxrequest.cpython-312.pyc deleted file mode 100644 index 2d4575dbd9953107cb4be2f50f3c51b547ab0fc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13208 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 diff --git a/venv/lib/python3.12/site-packages/telegram/request/__pycache__/_requestdata.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/request/__pycache__/_requestdata.cpython-312.pyc deleted file mode 100644 index 3656b9f88ecb057b742559a463065db64408343d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6546 zcmeHMU2GKB6~427UVH6b2W-HEI1>V~H?`ONH6a#B1UL{#L`X1#ZsM-TJJ<HW?9ArQ ztj#)(L=g`}ib|wPg(_<6N_`-rk*HKvRO*BKR;e%EkjQA8sFkWp?Ne=BwG9tdzjJ4H zc5R$CRbN`EBk!F%_vhT7^PTUUd;P1nwibrxPv3iM^6#CD{f<6rPt?z>Od)fP=`721 zMGu)uR>3=Lh6>?qxDd%k3ejw|5X;6Cs*jjWg?KhD^HH<8(2{MD`Iwm~v}RjnzR7GW zB(q6{@mPo*WqSNF)0=OGyzy@O!)8<EP`YL2)bOO?s0CXunOx1=ma7?-qiSm2)Eq~3 zCpA}{v`w9|TrFxsD{z+!N43Y%NbomH+;LUcmeq%BS3P+0Smuv3#EEpI8a`;1tMONg zu3=l6S&g2ykf}z;4Sc1QYI8}L+{)WJ$4Bchzu>+=Uxqb-@8s#CX>0ls!{kFo-bG3K zYu<1tYqQAvOOdaH|FOap+D^`}jVv3|m26lKWg~h@kMJmu@un^`q~CZ*k6w;u<Gfjq z@fM!ot@yQ}MUrY!lH|$pkZc+8+WWnlE=TH{81zo~Z9~}ZdVM>_ZN|7H-<L*GFk)gn zqPJlDhtMLy6JOXWrnjQi206|~%(<;WdWS6SL}{|2bW=H;Zm%Z%-5SzdO?w{7KV~_u zX63omol9Exbey+MljosCC|E~h)#6;|x;kzP)wcK-D7jBHth`wwWwoeyG}CN^hh{+l zR0rJH>KIoYZn<b<TNCQE;ZDlIeDq{mq<~CDodU23DLRH998~x0%Ixy$&S=8IK!dU& zjrO8Ft?~<6-ZjgZ$J%vi0#FuQbFm6%(k_`gO#$F`44n%UYL;pgiY6~$RvLj*)j5D~ z2J&h87SIg9y9D)<!-pKTSQ;~pyhONq+94zGh4Ty83CEb?n2n$W0_ASn`4SDm^}1l! z6~<V}<xZbk6n2pd*T5#xcrdI<TX+2JI2bgnuexTQId5ls2ko(QgQH`%ZH}e~)iaY2 zzy(HzYEeTvt@T)?i;^@fY{QhH1rwuP9UU!{OxK`A4?z2ceuBg3Xht?lhpLHOodBxI znrv@2C#o&=%Dm4tKssX){KELHyn*Bzn^i6-PDo)BY?kFv;yo_4kdLlhM$Ng}XTy7l z)y(cDOq?D_2u3Qibm&ChuaLD=wHLpYeMnvcEnsjq($3i1%B-^90N+-wDGGacLxh#t zhv8}E1LXv0Ct+B{lIyJ!n-I$Esz&8f9U4GY@4Ew&c7YERG}oCL81i-Q47l9n6X45! z$2Icjx#-vJX^SY0i-9R_O%0gF*g&xirCWP5yY~z@hRgelTK>E?!Rx&Td@C8q`5Dql zrdYn;d|-lG{6bMYH`CK#>X}^5unaes%N#K6yk<JjWrBu#FkfdAl0UG&U1T5ioW0F& zL>GIX`K0%mO3&HP9n#dLO<R<7ShOKq4Qp0eB$30iBMvvmMG7DOvIPmM#%sgPbgVat zUDUo8$whW|@3SB6Jv_hRO624CmQQ!|V8nTM@#vY#(K8?SoV~N-?3KtT@rPH?mQ`bd zyCq?*(k8h}38PEMkS5pD;1Ij2<U<C_heme#dJX_WlD+2}o1uSN?3xFq>$Lt>=-r+O zB)+YjLaNBzG)pVmPXV^0u=)plqXvhn6^mdj;*P*9R140t<}2%^Q<_=ged_e2k)Kra zpr$b%Sf!>qkOI%_+cU(u<sw%-%Qq}{w9n6v16lPi#}%V0_`882=o9)3ME4eL$1%ph zRu)`1*V7=20?G`@hZx8-92YF*f-Zc9(&2}Rp9Lt3CJZiBxrSMT<3zbnJ<sdniP7ZB zRAQrX=}Bnza56-R5Ca0DwbTfY2<SDbcBjsGR7j(~?k$9t)u+lRVpU1wcF?q6$3jQ? zyq?JR(ZWYYMuN5103MYytVT#NAA|&XW`Qtm6~raxXErsWJJ6j&%;FqGa*-`<VOzTw zyV8}e^k1Tp_Lkqaciv5PTz%`Ew-!=QEJaz{hO5WlIetC*{ls??mDb1ah0$h-MVeba zzsHbWAv|7v@<8Oj9P~f`Pe3oYQ-oWB&8Wvuy>bG$q2RCX9i=*a2S}<PHj1mUaHtGV zJ+8q^0hr|Hd>>j?OO9`c6b$H^(1G7Ep^0*jqYjRjto-2UImfm#dZ|!!e3wQ;&@*gP zcNIZz$#LyMt*4BD>hpvl_NisNByChT1Qr70@s=QQ4fqq(1C){IK@EO<aI}t?QMI2U z3-ADi)&MlIgj}~y_7lVu6n!9QsSnTfhK>1hhEg}02ch3WyOEOvi$?)Hp(0sD?J3!! zKJ%G}8*N}s<q-9L0SOGDdp$!~Og&mjJ-U$kN`omZZt1PyueEorF^I<?soLi4ZSMTE zCMKL!F-71EYB7b_<N}!91J|$)jgKn^Vvipx-vo{StF||NS*M8RH{(N|OCBV88Or+T z!dV80%V578o(T>%Kw5x@gIL9CIImiu+WP?0c{FDG=O@H?2X$TYvt|-lrft9+dn1EP z8EF@BXbZ+8{L$lu-H5}#^i0=<R~=2k2<eb$!k&vANRXHO3BS7<N1L!2Id7$ULjXCm zy%A39w>d+yGDt46<qp=`_36fK*M}D$*<Hck#>2NpkSw$w{xr4addFf{f2FJcPAany z&xnW7r5c9Jd=OTmgz_?iAl8-<L;x8S_|I(UM@mioZ--}<_n97=4ZqL68wMD{+EsKp zHE9bsUvecsz`o%D$%x6dd2x&H_~7maDX1SDU4M0>ek>4d=b$t;!N+Bfe-0gpRQ&@0 zc|~Aj7~`LQ?PWQSy4B*ig_9YW#G5ENUE2%jJ#eT#gZWnWzX(D_5a#YH&!-j9gIqe| zA(7%vSyfGv0_uAr16^9a7sIyuHNu$TdJauzwlzX?Z7qjbCygZV`THte`{tir=-PLu z>(wjCyBj*+>wHhUo?O`6vykdti1$i7uJY>v6lWmkS_2=g$6VmE2%4>VY9KvF7P#hd z<F$fw^8Tsz<-Kb?CA(b$pb0taI4Xp(r-zU9@2|OO&lwf9G96+Xc<ujQ`rq-=9*vHb zaRo3MSbjQIjgUvJMrC{=3AGyYNK=q9ad$R+B)1<3Cz5rDxP0`s`kq*7WoAnwavN)0 z>h>g(i|o%^SbN9SnRjNc?^xWLscg;MNewKfo~opt`pN9#)5j`LAG?z}z7RkDAZ!VS zl0i*mt}%m7(qC{68`+NYS7<i09-zUiVMlp)1I}CI$k#lx;Tk}37T*zp(<Y$Kd{{qf zdDkEQ{R0@ypzD_UrN;xuFE==O`EE$wi{KQ}0OI=fQ+`sjCcF!%-I=cjDk8o(jQde^ z!|4vECR{-gt;(wv6@7G**NL@u!bk=;Dmgm1S7W6j-n>Rp<cZ{oqZ%v72CJz_Q2or- zMxCyfcM0{*Atd0UBzv+C?9<t`*txUPx$_<iH)pQAaJO^oVrRP2nZ9zQn(DmU-o4nq zv(mnEZv2z>{-q`~S&Fmv?uGaxQrlt!WTiLLv7XLExm>j+m-8-%k#EiA-YjXRU(=M! z>2@B)&AFUo+OCt!2?9tpLPsz`#3Q!Scf1y)S0fbRRKuthr1)wWCs;v%l7}pbddc9T zk7}dRNCe$lh-OM?H$GtAMCtZHwAPYGkZ}^Qipy*{(iV*)27PGH#be8nQ1olc-2NLw z3%d_i`VLhdKfJ=I2#by-mqKmPmg_@v8|V0q!?!lx(r@qmu`%B<pa13F`N>~&FZ8`q zdE(^4V<#)yUcJZAbR}Ht1o70pJ=!wYF_*uwcW&|r-S-$i{U*pQ?`Vw<+<Ni$@ciTR z&V29BzFyh)@)ASY!r9kX=)JtHEt;M?yadVV+wuCamHj7W*}@yS6{_>cN<?2$uJe10 z-u@_*UD_&Vl8AQCC8@Go)-8vS^Y)3hDBUgwX{RWXs>X2WM!4c_JLyZRLd2-970xdR zVr6Jo-CVoI%H&F}VLBP_$l`dc)Va1+p6I2vs@sD);oaM3YFAi+C-y)hwMZbYYxaKp zfQP#0#EYmPx^oU7SqdwPvit<Y|44q#62D=YJ1p}V+x~mD>ofX$eksO6O@9p)6{UNL OQHt#dH7&~mDg7U1_tG-} diff --git a/venv/lib/python3.12/site-packages/telegram/request/__pycache__/_requestparameter.cpython-312.pyc b/venv/lib/python3.12/site-packages/telegram/request/__pycache__/_requestparameter.cpython-312.pyc deleted file mode 100644 index 91e1189a2a4a13c8abfe34e25ce56cfabfd0f37c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8856 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 b)%NUvvGc4A6c*ng7i=6~EnhgWPqFwP`@+@w diff --git a/venv/lib/python3.12/site-packages/telegram/request/_baserequest.py b/venv/lib/python3.12/site-packages/telegram/request/_baserequest.py deleted file mode 100644 index 879d79d..0000000 --- a/venv/lib/python3.12/site-packages/telegram/request/_baserequest.py +++ /dev/null @@ -1,443 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains an abstract class to make POST and GET requests.""" -import abc -import json -from contextlib import AbstractAsyncContextManager -from http import HTTPStatus -from types import TracebackType -from typing import Final, Optional, TypeVar, Union, final - -from telegram._utils.defaultvalue import DEFAULT_NONE as _DEFAULT_NONE -from telegram._utils.defaultvalue import DefaultValue -from telegram._utils.logging import get_logger -from telegram._utils.strings import TextEncoding -from telegram._utils.types import JSONDict, ODVInput -from telegram._version import __version__ as ptb_ver -from telegram.error import ( - BadRequest, - ChatMigrated, - Conflict, - Forbidden, - InvalidToken, - NetworkError, - RetryAfter, - TelegramError, -) -from telegram.request._requestdata import RequestData - -RT = TypeVar("RT", bound="BaseRequest") - -_LOGGER = get_logger(__name__, class_name="BaseRequest") - - -class BaseRequest( - AbstractAsyncContextManager["BaseRequest"], - abc.ABC, -): - """Abstract interface class that allows python-telegram-bot to make requests to the Bot API. - Can be implemented via different asyncio HTTP libraries. An implementation of this class - must implement all abstract methods and properties. - - Instances of this class can be used as asyncio context managers, where - - .. code:: python - - async with request_object: - # code - - is roughly equivalent to - - .. code:: python - - try: - await request_object.initialize() - # code - finally: - await request_object.shutdown() - - .. seealso:: :meth:`__aenter__` and :meth:`__aexit__`. - - Tip: - JSON encoding and decoding is done with the standard library's :mod:`json` by default. - To use a custom library for this, you can override :meth:`parse_json_payload` and implement - custom logic to encode the keys of :attr:`telegram.request.RequestData.parameters`. - - .. seealso:: :wiki:`Architecture Overview <Architecture>`, - :wiki:`Builder Pattern <Builder-Pattern>` - - .. versionadded:: 20.0 - """ - - __slots__ = () - - USER_AGENT: Final[str] = f"python-telegram-bot v{ptb_ver} (https://python-telegram-bot.org)" - """:obj:`str`: A description that can be used as user agent for requests made to the Bot API. - """ - DEFAULT_NONE: Final[DefaultValue[None]] = _DEFAULT_NONE - """:class:`object`: A special object that indicates that an argument of a function was not - explicitly passed. Used for the timeout parameters of :meth:`post` and :meth:`do_request`. - - Example: - When calling ``request.post(url)``, ``request`` should use the default timeouts set on - initialization. When calling ``request.post(url, connect_timeout=5, read_timeout=None)``, - ``request`` should use ``5`` for the connect timeout and :obj:`None` for the read timeout. - - Use ``if parameter is (not) BaseRequest.DEFAULT_NONE:`` to check if the parameter was set. - """ - - async def __aenter__(self: RT) -> RT: - """|async_context_manager| :meth:`initializes <initialize>` the Request. - - Returns: - The initialized Request instance. - - Raises: - :exc:`Exception`: If an exception is raised during initialization, :meth:`shutdown` - is called in this case. - """ - try: - await self.initialize() - except Exception: - await self.shutdown() - raise - return self - - async def __aexit__( - self, - exc_type: Optional[type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - """|async_context_manager| :meth:`shuts down <shutdown>` the Request.""" - # Make sure not to return `True` so that exceptions are not suppressed - # https://docs.python.org/3/reference/datamodel.html?#object.__aexit__ - await self.shutdown() - - @property - @abc.abstractmethod - def read_timeout(self) -> Optional[float]: - """This property must return the default read timeout in seconds used by this class. - More precisely, the returned value should be the one used when - :paramref:`post.read_timeout` of :meth:post` is not passed/equal to :attr:`DEFAULT_NONE`. - - .. versionadded:: 20.7 - .. versionchanged:: 22.0 - This property is now required to be implemented by subclasses. - - Returns: - :obj:`float` | :obj:`None`: The read timeout in seconds. - """ - - @abc.abstractmethod - async def initialize(self) -> None: - """Initialize resources used by this class. Must be implemented by a subclass.""" - - @abc.abstractmethod - async def shutdown(self) -> None: - """Stop & clear resources used by this class. Must be implemented by a subclass.""" - - @final - async def post( - self, - url: str, - request_data: Optional[RequestData] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - ) -> Union[JSONDict, list[JSONDict], bool]: - """Makes a request to the Bot API handles the return code and parses the answer. - - Warning: - This method will be called by the methods of :class:`telegram.Bot` and should *not* be - called manually. - - Args: - url (:obj:`str`): The URL to request. - request_data (:class:`telegram.request.RequestData`, optional): An object containing - information about parameters and files to upload for the request. - read_timeout (:obj:`float` | :obj:`None`, optional): If passed, specifies the maximum - amount of time (in seconds) to wait for a response from Telegram's server instead - of the time specified during creating of this object. Defaults to - :attr:`DEFAULT_NONE`. - write_timeout (:obj:`float` | :obj:`None`, optional): If passed, specifies the maximum - amount of time (in seconds) to wait for a write operation to complete (in terms of - a network socket; i.e. POSTing a request or uploading a file) instead of the time - specified during creating of this object. Defaults to :attr:`DEFAULT_NONE`. - connect_timeout (:obj:`float` | :obj:`None`, optional): If passed, specifies the - maximum amount of time (in seconds) to wait for a connection attempt to a server - to succeed instead of the time specified during creating of this object. Defaults - to :attr:`DEFAULT_NONE`. - pool_timeout (:obj:`float` | :obj:`None`, optional): If passed, specifies the maximum - amount of time (in seconds) to wait for a connection to become available instead - of the time specified during creating of this object. Defaults to - :attr:`DEFAULT_NONE`. - - Returns: - The JSON response of the Bot API. - - """ - result = await self._request_wrapper( - url=url, - method="POST", - request_data=request_data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - ) - json_data = self.parse_json_payload(result) - # For successful requests, the results are in the 'result' entry - # see https://core.telegram.org/bots/api#making-requests - return json_data["result"] - - @final - async def retrieve( - self, - url: str, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - ) -> bytes: - """Retrieve the contents of a file by its URL. - - Warning: - This method will be called by the methods of :class:`telegram.Bot` and should *not* be - called manually. - - Args: - url (:obj:`str`): The web location we want to retrieve. - read_timeout (:obj:`float` | :obj:`None`, optional): If passed, specifies the maximum - amount of time (in seconds) to wait for a response from Telegram's server instead - of the time specified during creating of this object. Defaults to - :attr:`DEFAULT_NONE`. - write_timeout (:obj:`float` | :obj:`None`, optional): If passed, specifies the maximum - amount of time (in seconds) to wait for a write operation to complete (in terms of - a network socket; i.e. POSTing a request or uploading a file) instead of the time - specified during creating of this object. Defaults to :attr:`DEFAULT_NONE`. - connect_timeout (:obj:`float` | :obj:`None`, optional): If passed, specifies the - maximum amount of time (in seconds) to wait for a connection attempt to a server - to succeed instead of the time specified during creating of this object. Defaults - to :attr:`DEFAULT_NONE`. - pool_timeout (:obj:`float` | :obj:`None`, optional): If passed, specifies the maximum - amount of time (in seconds) to wait for a connection to become available instead - of the time specified during creating of this object. Defaults to - :attr:`DEFAULT_NONE`. - - Returns: - :obj:`bytes`: The files contents. - - """ - return await self._request_wrapper( - url=url, - method="GET", - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - ) - - async def _request_wrapper( - self, - url: str, - method: str, - request_data: Optional[RequestData] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - ) -> bytes: - """Wraps the real implementation request method. - - Performs the following tasks: - * Handle the various HTTP response codes. - * Parse the Telegram server response. - - Args: - url (:obj:`str`): The URL to request. - method (:obj:`str`): HTTP method (i.e. 'POST', 'GET', etc.). - request_data (:class:`telegram.request.RequestData`, optional): An object containing - information about parameters and files to upload for the request. - read_timeout (:obj:`float` | :obj:`None`, optional): If passed, specifies the maximum - amount of time (in seconds) to wait for a response from Telegram's server instead - of the time specified during creating of this object. Defaults to - :attr:`DEFAULT_NONE`. - write_timeout (:obj:`float` | :obj:`None`, optional): If passed, specifies the maximum - amount of time (in seconds) to wait for a write operation to complete (in terms of - a network socket; i.e. POSTing a request or uploading a file) instead of the time - specified during creating of this object. Defaults to :attr:`DEFAULT_NONE`. - connect_timeout (:obj:`float` | :obj:`None`, optional): If passed, specifies the - maximum amount of time (in seconds) to wait for a connection attempt to a server - to succeed instead of the time specified during creating of this object. Defaults - to :attr:`DEFAULT_NONE`. - pool_timeout (:obj:`float` | :obj:`None`, optional): If passed, specifies the maximum - amount of time (in seconds) to wait for a connection to become available instead - of the time specified during creating of this object. Defaults to - :attr:`DEFAULT_NONE`. - - Returns: - bytes: The payload part of the HTTP server response. - - Raises: - TelegramError - - """ - try: - code, payload = await self.do_request( - url=url, - method=method, - request_data=request_data, - read_timeout=read_timeout, - write_timeout=write_timeout, - connect_timeout=connect_timeout, - pool_timeout=pool_timeout, - ) - except TelegramError: - raise - except Exception as exc: - raise NetworkError(f"Unknown error in HTTP implementation: {exc!r}") from exc - - if HTTPStatus.OK <= code <= 299: - # 200-299 range are HTTP success statuses - # starting with Py 3.12 we can use `HTTPStatus.is_success` - return payload - - try: - message = f"{HTTPStatus(code).phrase} ({code})" - except ValueError: - message = f"Unknown HTTPError ({code})" - - parsing_exception: Optional[TelegramError] = None - - try: - response_data = self.parse_json_payload(payload) - except TelegramError as exc: - message += f". Parsing the server response {payload!r} failed" - parsing_exception = exc - else: - message = response_data.get("description") or message - - # In some special cases, we can raise more informative exceptions: - # see https://core.telegram.org/bots/api#responseparameters and - # https://core.telegram.org/bots/api#making-requests - # TGs response also has the fields 'ok' and 'error_code'. - # However, we rather rely on the HTTP status code for now. - parameters = response_data.get("parameters") - if parameters: - migrate_to_chat_id = parameters.get("migrate_to_chat_id") - if migrate_to_chat_id: - raise ChatMigrated(migrate_to_chat_id) - retry_after = parameters.get("retry_after") - if retry_after: - raise RetryAfter(retry_after) - - message += f". The server response contained unknown parameters: {parameters}" - - if code == HTTPStatus.FORBIDDEN: # 403 - exception: TelegramError = Forbidden(message) - elif code in (HTTPStatus.NOT_FOUND, HTTPStatus.UNAUTHORIZED): # 404 and 401 - # TG returns 404 Not found for - # 1) malformed tokens - # 2) correct tokens but non-existing method, e.g. api.tg.org/botTOKEN/unkonwnMethod - # 2) is relevant only for Bot.do_api_request, where we have special handing for it. - # TG returns 401 Unauthorized for correctly formatted tokens that are not valid - exception = InvalidToken(message) - elif code == HTTPStatus.BAD_REQUEST: # 400 - exception = BadRequest(message) - elif code == HTTPStatus.CONFLICT: # 409 - exception = Conflict(message) - elif code == HTTPStatus.BAD_GATEWAY: # 502 - exception = NetworkError(message) - else: - exception = NetworkError(message) - - if parsing_exception: - raise exception from parsing_exception - raise exception - - @staticmethod - def parse_json_payload(payload: bytes) -> JSONDict: - """Parse the JSON returned from Telegram. - - Tip: - By default, this method uses the standard library's :func:`json.loads` and - ``errors="replace"`` in :meth:`bytes.decode`. - You can override it to customize either of these behaviors. - - Args: - payload (:obj:`bytes`): The UTF-8 encoded JSON payload as returned by Telegram. - - Returns: - dict: A JSON parsed as Python dict with results. - - Raises: - TelegramError: If loading the JSON data failed - """ - decoded_s = payload.decode(TextEncoding.UTF_8, "replace") - try: - return json.loads(decoded_s) - except ValueError as exc: - _LOGGER.exception('Can not load invalid JSON data: "%s"', decoded_s) - raise TelegramError("Invalid server response") from exc - - @abc.abstractmethod - async def do_request( - self, - url: str, - method: str, - request_data: Optional[RequestData] = None, - read_timeout: ODVInput[float] = DEFAULT_NONE, - write_timeout: ODVInput[float] = DEFAULT_NONE, - connect_timeout: ODVInput[float] = DEFAULT_NONE, - pool_timeout: ODVInput[float] = DEFAULT_NONE, - ) -> tuple[int, bytes]: - """Makes a request to the Bot API. Must be implemented by a subclass. - - Warning: - This method will be called by :meth:`post` and :meth:`retrieve`. It should *not* be - called manually. - - Args: - url (:obj:`str`): The URL to request. - method (:obj:`str`): HTTP method (i.e. ``'POST'``, ``'GET'``, etc.). - request_data (:class:`telegram.request.RequestData`, optional): An object containing - information about parameters and files to upload for the request. - read_timeout (:obj:`float` | :obj:`None`, optional): If passed, specifies the maximum - amount of time (in seconds) to wait for a response from Telegram's server instead - of the time specified during creating of this object. Defaults to - :attr:`DEFAULT_NONE`. - write_timeout (:obj:`float` | :obj:`None`, optional): If passed, specifies the maximum - amount of time (in seconds) to wait for a write operation to complete (in terms of - a network socket; i.e. POSTing a request or uploading a file) instead of the time - specified during creating of this object. Defaults to :attr:`DEFAULT_NONE`. - connect_timeout (:obj:`float` | :obj:`None`, optional): If passed, specifies the - maximum amount of time (in seconds) to wait for a connection attempt to a server - to succeed instead of the time specified during creating of this object. Defaults - to :attr:`DEFAULT_NONE`. - pool_timeout (:obj:`float` | :obj:`None`, optional): If passed, specifies the maximum - amount of time (in seconds) to wait for a connection to become available instead - of the time specified during creating of this object. Defaults to - :attr:`DEFAULT_NONE`. - - Returns: - tuple[:obj:`int`, :obj:`bytes`]: The HTTP return code & the payload part of the server - response. - """ diff --git a/venv/lib/python3.12/site-packages/telegram/request/_httpxrequest.py b/venv/lib/python3.12/site-packages/telegram/request/_httpxrequest.py deleted file mode 100644 index bb35501..0000000 --- a/venv/lib/python3.12/site-packages/telegram/request/_httpxrequest.py +++ /dev/null @@ -1,299 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains methods to make POST and GET requests using the httpx library.""" -from collections.abc import Collection -from typing import Any, Optional, Union - -import httpx - -from telegram._utils.defaultvalue import DefaultValue -from telegram._utils.logging import get_logger -from telegram._utils.types import HTTPVersion, ODVInput, SocketOpt -from telegram.error import NetworkError, TimedOut -from telegram.request._baserequest import BaseRequest -from telegram.request._requestdata import RequestData - -# Note to future devs: -# Proxies are currently only tested manually. The httpx development docs have a nice guide on that: -# https://www.python-httpx.org/contributing/#development-proxy-setup (also saved on archive.org) -# That also works with socks5. Just pass `--mode socks5` to mitmproxy - -_LOGGER = get_logger(__name__, "HTTPXRequest") - - -class HTTPXRequest(BaseRequest): - """Implementation of :class:`~telegram.request.BaseRequest` using the library - `httpx <https://www.python-httpx.org>`_. - - .. versionadded:: 20.0 - - .. versionchanged:: 22.0 - Removed the deprecated parameter ``proxy_url``. Use :paramref:`proxy` instead. - - Args: - connection_pool_size (:obj:`int`, optional): Number of connections to keep in the - connection pool. Defaults to ``1``. - read_timeout (:obj:`float` | :obj:`None`, optional): If passed, specifies the maximum - amount of time (in seconds) to wait for a response from Telegram's server. - This value is used unless a different value is passed to :meth:`do_request`. - Defaults to ``5``. - write_timeout (:obj:`float` | :obj:`None`, optional): If passed, specifies the maximum - amount of time (in seconds) to wait for a write operation to complete (in terms of - a network socket; i.e. POSTing a request or uploading a file). - This value is used unless a different value is passed to :meth:`do_request`. - Defaults to ``5``. - - Hint: - This timeout is used for all requests except for those that upload media/files. - For the latter, :paramref:`media_write_timeout` is used. - connect_timeout (:obj:`float` | :obj:`None`, optional): If passed, specifies the - maximum amount of time (in seconds) to wait for a connection attempt to a server - to succeed. This value is used unless a different value is passed to - :meth:`do_request`. Defaults to ``5``. - pool_timeout (:obj:`float` | :obj:`None`, optional): If passed, specifies the maximum - amount of time (in seconds) to wait for a connection to become available. - This value is used unless a different value is passed to :meth:`do_request`. - Defaults to ``1``. - - Warning: - With a finite pool timeout, you must expect :exc:`telegram.error.TimedOut` - exceptions to be thrown when more requests are made simultaneously than there are - connections in the connection pool! - http_version (:obj:`str`, optional): If ``"2"`` or ``"2.0"``, HTTP/2 will be used instead - of HTTP/1.1. Defaults to ``"1.1"``. - - .. versionadded:: 20.1 - .. versionchanged:: 20.2 - Reset the default version to 1.1. - - .. versionchanged:: 20.5 - Accept ``"2"`` as a valid value. - socket_options (Collection[:obj:`tuple`], optional): Socket options to be passed to the - underlying `library \ - <https://www.encode.io/httpcore/async/#httpcore.AsyncConnectionPool.__init__>`_. - - Note: - The values accepted by this parameter depend on the operating system. - This is a low-level parameter and should only be used if you are familiar with - these concepts. - - .. versionadded:: 20.7 - proxy (:obj:`str` | ``httpx.Proxy`` | ``httpx.URL``, optional): The URL to a proxy server, - a ``httpx.Proxy`` object or a ``httpx.URL`` object. For example - ``'http://127.0.0.1:3128'`` or ``'socks5://127.0.0.1:3128'``. Defaults to :obj:`None`. - - Note: - * The proxy URL can also be set via the environment variables ``HTTPS_PROXY`` or - ``ALL_PROXY``. See `the docs of httpx`_ for more info. - * HTTPS proxies can be configured by passing a ``httpx.Proxy`` object with - a corresponding ``ssl_context``. - * For Socks5 support, additional dependencies are required. Make sure to install - PTB via :command:`pip install "python-telegram-bot[socks]"` in this case. - * Socks5 proxies can not be set via environment variables. - - .. _the docs of httpx: https://www.python-httpx.org/environment_variables/#proxies - - .. versionadded:: 20.7 - media_write_timeout (:obj:`float` | :obj:`None`, optional): Like :paramref:`write_timeout`, - but used only for requests that upload media/files. This value is used unless a - different value is passed to :paramref:`do_request.write_timeout` of - :meth:`do_request`. Defaults to ``20`` seconds. - - .. versionadded:: 21.0 - httpx_kwargs (dict[:obj:`str`, Any], optional): Additional keyword arguments to be passed - to the `httpx.AsyncClient <https://www.python-httpx.org/api/#asyncclient>`_ - constructor. - - Warning: - This parameter is intended for advanced users that want to fine-tune the behavior - of the underlying ``httpx`` client. The values passed here will override all the - defaults set by ``python-telegram-bot`` and all other parameters passed to - :class:`HTTPXRequest`. The only exception is the :paramref:`media_write_timeout` - parameter, which is not passed to the client constructor. - No runtime warnings will be issued about parameters that are overridden in this - way. - - .. versionadded:: 21.6 - - """ - - __slots__ = ("_client", "_client_kwargs", "_http_version", "_media_write_timeout") - - def __init__( - self, - connection_pool_size: int = 1, - read_timeout: Optional[float] = 5.0, - write_timeout: Optional[float] = 5.0, - connect_timeout: Optional[float] = 5.0, - pool_timeout: Optional[float] = 1.0, - http_version: HTTPVersion = "1.1", - socket_options: Optional[Collection[SocketOpt]] = None, - proxy: Optional[Union[str, httpx.Proxy, httpx.URL]] = None, - media_write_timeout: Optional[float] = 20.0, - httpx_kwargs: Optional[dict[str, Any]] = None, - ): - self._http_version = http_version - self._media_write_timeout = media_write_timeout - timeout = httpx.Timeout( - connect=connect_timeout, - read=read_timeout, - write=write_timeout, - pool=pool_timeout, - ) - limits = httpx.Limits( - max_connections=connection_pool_size, - max_keepalive_connections=connection_pool_size, - ) - - if http_version not in ("1.1", "2", "2.0"): - raise ValueError("`http_version` must be either '1.1', '2.0' or '2'.") - - http1 = http_version == "1.1" - http_kwargs = {"http1": http1, "http2": not http1} - transport = ( - httpx.AsyncHTTPTransport( - socket_options=socket_options, - ) - if socket_options - else None - ) - self._client_kwargs = { - "timeout": timeout, - "proxy": proxy, - "limits": limits, - "transport": transport, - **http_kwargs, - **(httpx_kwargs or {}), - } - - try: - self._client = self._build_client() - except ImportError as exc: - if "httpx[http2]" not in str(exc) and "httpx[socks]" not in str(exc): - raise - - if "httpx[socks]" in str(exc): - raise RuntimeError( - "To use Socks5 proxies, PTB must be installed via `pip install " - '"python-telegram-bot[socks]"`.' - ) from exc - raise RuntimeError( - "To use HTTP/2, PTB must be installed via `pip install " - '"python-telegram-bot[http2]"`.' - ) from exc - - @property - def http_version(self) -> str: - """ - :obj:`str`: Used HTTP version, see :paramref:`http_version`. - - .. versionadded:: 20.2 - """ - return self._http_version - - @property - def read_timeout(self) -> Optional[float]: - """See :attr:`BaseRequest.read_timeout`. - - Returns: - :obj:`float` | :obj:`None`: The default read timeout in seconds as passed to - :paramref:`HTTPXRequest.read_timeout`. - """ - return self._client.timeout.read - - def _build_client(self) -> httpx.AsyncClient: - return httpx.AsyncClient(**self._client_kwargs) - - async def initialize(self) -> None: - """See :meth:`BaseRequest.initialize`.""" - if self._client.is_closed: - self._client = self._build_client() - - async def shutdown(self) -> None: - """See :meth:`BaseRequest.shutdown`.""" - if self._client.is_closed: - _LOGGER.debug("This HTTPXRequest is already shut down. Returning.") - return - - await self._client.aclose() - - async def do_request( - self, - url: str, - method: str, - request_data: Optional[RequestData] = None, - read_timeout: ODVInput[float] = BaseRequest.DEFAULT_NONE, - write_timeout: ODVInput[float] = BaseRequest.DEFAULT_NONE, - connect_timeout: ODVInput[float] = BaseRequest.DEFAULT_NONE, - pool_timeout: ODVInput[float] = BaseRequest.DEFAULT_NONE, - ) -> tuple[int, bytes]: - """See :meth:`BaseRequest.do_request`.""" - if self._client.is_closed: - raise RuntimeError("This HTTPXRequest is not initialized!") - - files = request_data.multipart_data if request_data else None - data = request_data.json_parameters if request_data else None - - # If user did not specify timeouts (for e.g. in a bot method), use the default ones when we - # created this instance. - if isinstance(read_timeout, DefaultValue): - read_timeout = self._client.timeout.read - if isinstance(connect_timeout, DefaultValue): - connect_timeout = self._client.timeout.connect - if isinstance(pool_timeout, DefaultValue): - pool_timeout = self._client.timeout.pool - - if isinstance(write_timeout, DefaultValue): - write_timeout = self._client.timeout.write if not files else self._media_write_timeout - - timeout = httpx.Timeout( - connect=connect_timeout, - read=read_timeout, - write=write_timeout, - pool=pool_timeout, - ) - - try: - res = await self._client.request( - method=method, - url=url, - headers={"User-Agent": self.USER_AGENT}, - timeout=timeout, - files=files, - data=data, - ) - except httpx.TimeoutException as err: - if isinstance(err, httpx.PoolTimeout): - raise TimedOut( - message=( - "Pool timeout: All connections in the connection pool are occupied. " - "Request was *not* sent to Telegram. Consider adjusting the connection " - "pool size or the pool timeout." - ) - ) from err - raise TimedOut from err - except httpx.HTTPError as err: - # HTTPError must come last as its the base httpx exception class - # TODO p4: do something smart here; for now just raise NetworkError - - # We include the class name for easier debugging. Especially useful if the error - # message of `err` is empty. - raise NetworkError(f"httpx.{err.__class__.__name__}: {err}") from err - - return res.status_code, res.content diff --git a/venv/lib/python3.12/site-packages/telegram/request/_requestdata.py b/venv/lib/python3.12/site-packages/telegram/request/_requestdata.py deleted file mode 100644 index b8da33c..0000000 --- a/venv/lib/python3.12/site-packages/telegram/request/_requestdata.py +++ /dev/null @@ -1,142 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains a class that holds the parameters of a request to the Bot API.""" -import json -from typing import Any, Optional, Union, final -from urllib.parse import urlencode - -from telegram._utils.strings import TextEncoding -from telegram._utils.types import UploadFileDict -from telegram.request._requestparameter import RequestParameter - - -@final -class RequestData: - """Instances of this class collect the data needed for one request to the Bot API, including - all parameters and files to be sent along with the request. - - .. versionadded:: 20.0 - - Warning: - How exactly instances of this are created should be considered an implementation detail - and not part of PTBs public API. Users should exclusively rely on the documented - attributes, properties and methods. - - Attributes: - contains_files (:obj:`bool`): Whether this object contains files to be uploaded via - ``multipart/form-data``. - """ - - __slots__ = ("_parameters", "contains_files") - - def __init__(self, parameters: Optional[list[RequestParameter]] = None): - self._parameters: list[RequestParameter] = parameters or [] - self.contains_files: bool = any(param.input_files for param in self._parameters) - - @property - def parameters(self) -> dict[str, Union[str, int, list[Any], dict[Any, Any]]]: - """Gives the parameters as mapping of parameter name to the parameter value, which can be - a single object of type :obj:`int`, :obj:`float`, :obj:`str` or :obj:`bool` or any - (possibly nested) composition of lists, tuples and dictionaries, where each entry, key - and value is of one of the mentioned types. - - Returns: - dict[:obj:`str`, Union[:obj:`str`, :obj:`int`, list[any], dict[any, any]]] - """ - return { - param.name: param.value # type: ignore[misc] - for param in self._parameters - if param.value is not None - } - - @property - def json_parameters(self) -> dict[str, str]: - """Gives the parameters as mapping of parameter name to the respective JSON encoded - value. - - Tip: - By default, this property uses the standard library's :func:`json.dumps`. - To use a custom library for JSON encoding, you can directly encode the keys of - :attr:`parameters` - note that string valued keys should not be JSON encoded. - - Returns: - dict[:obj:`str`, :obj:`str`] - """ - return { - param.name: param.json_value - for param in self._parameters - if param.json_value is not None - } - - def url_encoded_parameters(self, encode_kwargs: Optional[dict[str, Any]] = None) -> str: - """Encodes the parameters with :func:`urllib.parse.urlencode`. - - Args: - encode_kwargs (dict[:obj:`str`, any], optional): Additional keyword arguments to pass - along to :func:`urllib.parse.urlencode`. - - Returns: - :obj:`str` - """ - if encode_kwargs: - return urlencode(self.json_parameters, **encode_kwargs) - return urlencode(self.json_parameters) - - def parametrized_url(self, url: str, encode_kwargs: Optional[dict[str, Any]] = None) -> str: - """Shortcut for attaching the return value of :meth:`url_encoded_parameters` to the - :paramref:`url`. - - Args: - url (:obj:`str`): The URL the parameters will be attached to. - encode_kwargs (dict[:obj:`str`, any], optional): Additional keyword arguments to pass - along to :func:`urllib.parse.urlencode`. - - Returns: - :obj:`str` - """ - url_parameters = self.url_encoded_parameters(encode_kwargs=encode_kwargs) - return f"{url}?{url_parameters}" - - @property - def json_payload(self) -> bytes: - """The :attr:`parameters` as UTF-8 encoded JSON payload. - - Tip: - By default, this property uses the standard library's :func:`json.dumps`. - To use a custom library for JSON encoding, you can directly encode the keys of - :attr:`parameters` - note that string valued keys should not be JSON encoded. - - Returns: - :obj:`bytes` - """ - return json.dumps(self.json_parameters).encode(TextEncoding.UTF_8) - - @property - def multipart_data(self) -> UploadFileDict: - """Gives the files contained in this object as mapping of part name to encoded content. - - .. versionchanged:: 21.5 - Content may now be a file handle. - """ - multipart_data: UploadFileDict = {} - for param in self._parameters: - m_data = param.multipart_data - if m_data: - multipart_data.update(m_data) - return multipart_data diff --git a/venv/lib/python3.12/site-packages/telegram/request/_requestparameter.py b/venv/lib/python3.12/site-packages/telegram/request/_requestparameter.py deleted file mode 100644 index f0664c7..0000000 --- a/venv/lib/python3.12/site-packages/telegram/request/_requestparameter.py +++ /dev/null @@ -1,210 +0,0 @@ -#!/usr/bin/env python -# -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains a class that describes a single parameter of a request to the Bot API.""" -import datetime as dtm -import json -from collections.abc import Sequence -from dataclasses import dataclass -from typing import Optional, final - -from telegram._files._inputstorycontent import InputStoryContent -from telegram._files.inputfile import InputFile -from telegram._files.inputmedia import InputMedia, InputPaidMedia -from telegram._files.inputprofilephoto import InputProfilePhoto, InputProfilePhotoStatic -from telegram._files.inputsticker import InputSticker -from telegram._telegramobject import TelegramObject -from telegram._utils.datetime import to_timestamp -from telegram._utils.enum import StringEnum -from telegram._utils.types import UploadFileDict - - -@final -@dataclass(repr=True, eq=False, order=False, frozen=True) -class RequestParameter: - """Instances of this class represent a single parameter to be sent along with a request to - the Bot API. - - .. versionadded:: 20.0 - - Warning: - This class intended is to be used internally by the library and *not* by the user. Changes - to this class are not considered breaking changes and may not be documented in the - changelog. - - Args: - name (:obj:`str`): The name of the parameter. - value (:obj:`object` | :obj:`None`): The value of the parameter. Must be JSON-dumpable. - input_files (list[:class:`telegram.InputFile`], optional): A list of files that should be - uploaded along with this parameter. - - Attributes: - name (:obj:`str`): The name of the parameter. - value (:obj:`object` | :obj:`None`): The value of the parameter. - input_files (list[:class:`telegram.InputFile` | :obj:`None`): A list of files that should - be uploaded along with this parameter. - """ - - __slots__ = ("input_files", "name", "value") - - name: str - value: object - input_files: Optional[list[InputFile]] - - @property - def json_value(self) -> Optional[str]: - """The JSON dumped :attr:`value` or :obj:`None` if :attr:`value` is :obj:`None`. - The latter can currently only happen if :attr:`input_files` has exactly one element that - must not be uploaded via an attach:// URI. - """ - if isinstance(self.value, str): - return self.value - if self.value is None: - return None - return json.dumps(self.value) - - @property - def multipart_data(self) -> Optional[UploadFileDict]: - """A dict with the file data to upload, if any. - - .. versionchanged:: 21.5 - Content may now be a file handle. - """ - if not self.input_files: - return None - return { - (input_file.attach_name or self.name): input_file.field_tuple - for input_file in self.input_files - } - - @staticmethod - def _value_and_input_files_from_input( # pylint: disable=too-many-return-statements - value: object, - ) -> tuple[object, list[InputFile]]: - """Converts `value` into something that we can json-dump. Returns two values: - 1. the JSON-dumpable value. May be `None` in case the value is an InputFile which must - not be uploaded via an attach:// URI - 2. A list of InputFiles that should be uploaded for this value - - Note that we handle files differently depending on whether attaching them via an URI of the - form attach://<name> is documented to be allowed or not. - There was some confusion whether this worked for all files, so that we stick to the - documented ways for now. - See https://github.com/tdlib/telegram-bot-api/issues/167 and - https://github.com/tdlib/telegram-bot-api/issues/259 - - This method only does some special casing for our own helper class StringEnum, but not - for general enums. This is because: - * tg.constants currently only uses IntEnum as second enum type and json dumping that - is no problem - * if a user passes a custom enum, it's unlikely that we can actually properly handle it - even with some special casing. - """ - if isinstance(value, dtm.datetime): - return to_timestamp(value), [] - if isinstance(value, dtm.timedelta): - seconds = value.total_seconds() - # We convert to int for completeness for whole seconds - if seconds.is_integer(): - return int(seconds), [] - # The Bot API doesn't document behavior for fractions of seconds so far, but we don't - # want to silently drop them - return seconds, [] - if isinstance(value, StringEnum): - return value.value, [] - if isinstance(value, InputFile): - if value.attach_uri: - return value.attach_uri, [value] - return None, [value] - - if isinstance(value, (InputMedia, InputPaidMedia)) and isinstance(value.media, InputFile): - # We call to_dict and change the returned dict instead of overriding - # value.media in case the same value is reused for another request - data = value.to_dict() - if value.media.attach_uri: - data["media"] = value.media.attach_uri - else: - data.pop("media", None) - - thumbnail = data.get("thumbnail", None) - if isinstance(thumbnail, InputFile): - if thumbnail.attach_uri: - data["thumbnail"] = thumbnail.attach_uri - else: - data.pop("thumbnail", None) - return data, [value.media, thumbnail] - - return data, [value.media] - - if isinstance(value, InputProfilePhoto): - attr = "photo" if isinstance(value, InputProfilePhotoStatic) else "animation" - if not isinstance(media := getattr(value, attr), InputFile): - # We don't have to upload anything - return value.to_dict(), [] - - # We call to_dict and change the returned dict instead of overriding - # value.photo in case the same value is reused for another request - data = value.to_dict() - data[attr] = media.attach_uri - return data, [media] - - if isinstance(value, InputStoryContent): - attr = value.type - if not isinstance(media := getattr(value, attr), InputFile): - # We don't have to upload anything - return value.to_dict(), [] - - # We call to_dict and change the returned dict instead of overriding - # value.photo in case the same value is reused for another request - data = value.to_dict() - data[attr] = media.attach_uri - return data, [media] - - if isinstance(value, InputSticker) and isinstance(value.sticker, InputFile): - # We call to_dict and change the returned dict instead of overriding - # value.sticker in case the same value is reused for another request - data = value.to_dict() - data["sticker"] = value.sticker.attach_uri - return data, [value.sticker] - - if isinstance(value, TelegramObject): - # Needs to be last, because InputMedia is a subclass of TelegramObject - return value.to_dict(), [] - return value, [] - - @classmethod - def from_input(cls, key: str, value: object) -> "RequestParameter": - """Builds an instance of this class for a given key-value pair that represents the raw - input as passed along from a method of :class:`telegram.Bot`. - """ - if not isinstance(value, (str, bytes)) and isinstance(value, Sequence): - param_values = [] - input_files = [] - for obj in value: - param_value, input_file = cls._value_and_input_files_from_input(obj) - if param_value is not None: - param_values.append(param_value) - input_files.extend(input_file) - return RequestParameter( - name=key, value=param_values, input_files=input_files if input_files else None - ) - - param_value, input_files = cls._value_and_input_files_from_input(value) - return RequestParameter( - name=key, value=param_value, input_files=input_files if input_files else None - ) diff --git a/venv/lib/python3.12/site-packages/telegram/warnings.py b/venv/lib/python3.12/site-packages/telegram/warnings.py deleted file mode 100644 index d475eeb..0000000 --- a/venv/lib/python3.12/site-packages/telegram/warnings.py +++ /dev/null @@ -1,87 +0,0 @@ -#! /usr/bin/env python -# A library that provides a Python interface to the Telegram Bot API -# Copyright (C) 2015-2025 -# Leandro Toledo de Souza <devs@python-telegram-bot.org> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser Public License for more details. -# -# You should have received a copy of the GNU Lesser Public License -# along with this program. If not, see [http://www.gnu.org/licenses/]. -"""This module contains classes used for warnings issued by this library. - -.. versionadded:: 20.0 -""" - -__all__ = ["PTBDeprecationWarning", "PTBRuntimeWarning", "PTBUserWarning"] - - -class PTBUserWarning(UserWarning): - """ - Custom user warning class used for warnings in this library. - - .. seealso:: :wiki:`Exceptions, Warnings and Logging <Exceptions%2C-Warnings-and-Logging>` - - .. versionadded:: 20.0 - """ - - __slots__ = () - - -class PTBRuntimeWarning(PTBUserWarning, RuntimeWarning): - """ - Custom runtime warning class used for warnings in this library. - - .. versionadded:: 20.0 - """ - - __slots__ = () - - -# https://www.python.org/dev/peps/pep-0565/ recommends using a custom warning class derived from -# DeprecationWarning. We also subclass from PTBUserWarning so users can easily 'switch off' -# warnings -class PTBDeprecationWarning(PTBUserWarning, DeprecationWarning): - """ - Custom warning class for deprecations in this library. - - .. versionchanged:: 20.0 - Renamed TelegramDeprecationWarning to PTBDeprecationWarning. - - Args: - version (:obj:`str`): The version in which the feature was deprecated. - - .. versionadded:: 21.2 - message (:obj:`str`): The message to display. - - .. versionadded:: 21.2 - - Attributes: - version (:obj:`str`): The version in which the feature was deprecated. - - .. versionadded:: 21.2 - message (:obj:`str`): The message to display. - - .. versionadded:: 21.2 - """ - - __slots__ = ("message", "version") - - def __init__(self, version: str, message: str) -> None: - self.version: str = version - self.message: str = message - - def __str__(self) -> str: - """Returns a string representation of the warning, using :attr:`message` and - :attr:`version`. - - .. versionadded:: 21.2 - """ - return f"Deprecated since version {self.version}: {self.message}" diff --git a/venv/lib/python3.12/site-packages/typing_extensions-4.14.1.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/typing_extensions-4.14.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.12/site-packages/typing_extensions-4.14.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/typing_extensions-4.14.1.dist-info/METADATA b/venv/lib/python3.12/site-packages/typing_extensions-4.14.1.dist-info/METADATA deleted file mode 100644 index b1fe93f..0000000 --- a/venv/lib/python3.12/site-packages/typing_extensions-4.14.1.dist-info/METADATA +++ /dev/null @@ -1,68 +0,0 @@ -Metadata-Version: 2.4 -Name: typing_extensions -Version: 4.14.1 -Summary: Backported and Experimental Type Hints for Python 3.9+ -Keywords: annotations,backport,checker,checking,function,hinting,hints,type,typechecking,typehinting,typehints,typing -Author-email: "Guido van Rossum, Jukka Lehtosalo, Łukasz Langa, Michael Lee" <levkivskyi@gmail.com> -Requires-Python: >=3.9 -Description-Content-Type: text/markdown -License-Expression: PSF-2.0 -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Console -Classifier: Intended Audience :: Developers -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -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: Topic :: Software Development -License-File: LICENSE -Project-URL: Bug Tracker, https://github.com/python/typing_extensions/issues -Project-URL: Changes, https://github.com/python/typing_extensions/blob/main/CHANGELOG.md -Project-URL: Documentation, https://typing-extensions.readthedocs.io/ -Project-URL: Home, https://github.com/python/typing_extensions -Project-URL: Q & A, https://github.com/python/typing/discussions -Project-URL: Repository, https://github.com/python/typing_extensions - -# Typing Extensions - -[![Chat at https://gitter.im/python/typing](https://badges.gitter.im/python/typing.svg)](https://gitter.im/python/typing) - -[Documentation](https://typing-extensions.readthedocs.io/en/latest/#) – -[PyPI](https://pypi.org/project/typing-extensions/) - -## Overview - -The `typing_extensions` module serves two related purposes: - -- Enable use of new type system features on older Python versions. For example, - `typing.TypeGuard` is new in Python 3.10, but `typing_extensions` allows - users on previous Python versions to use it too. -- Enable experimentation with new type system PEPs before they are accepted and - added to the `typing` module. - -`typing_extensions` is treated specially by static type checkers such as -mypy and pyright. Objects defined in `typing_extensions` are treated the same -way as equivalent forms in `typing`. - -`typing_extensions` uses -[Semantic Versioning](https://semver.org/). The -major version will be incremented only for backwards-incompatible changes. -Therefore, it's safe to depend -on `typing_extensions` like this: `typing_extensions >=x.y, <(x+1)`, -where `x.y` is the first version that includes all features you need. - -## Included items - -See [the documentation](https://typing-extensions.readthedocs.io/en/latest/#) for a -complete listing of module contents. - -## Contributing - -See [CONTRIBUTING.md](https://github.com/python/typing_extensions/blob/main/CONTRIBUTING.md) -for how to contribute to `typing_extensions`. - diff --git a/venv/lib/python3.12/site-packages/typing_extensions-4.14.1.dist-info/RECORD b/venv/lib/python3.12/site-packages/typing_extensions-4.14.1.dist-info/RECORD deleted file mode 100644 index 944ae23..0000000 --- a/venv/lib/python3.12/site-packages/typing_extensions-4.14.1.dist-info/RECORD +++ /dev/null @@ -1,7 +0,0 @@ -__pycache__/typing_extensions.cpython-312.pyc,, -typing_extensions-4.14.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -typing_extensions-4.14.1.dist-info/METADATA,sha256=8LS3enF0w3KyL4WYimlFfskcnkARg-sv_L6tHbPMS5s,2995 -typing_extensions-4.14.1.dist-info/RECORD,, -typing_extensions-4.14.1.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82 -typing_extensions-4.14.1.dist-info/licenses/LICENSE,sha256=Oy-B_iHRgcSZxZolbI4ZaEVdZonSaaqFNzv7avQdo78,13936 -typing_extensions.py,sha256=Fh0lt5ZCgnzs7tyAhHOAfL0Zr829KYUxiR543ClwVgw,157408 diff --git a/venv/lib/python3.12/site-packages/typing_extensions-4.14.1.dist-info/WHEEL b/venv/lib/python3.12/site-packages/typing_extensions-4.14.1.dist-info/WHEEL deleted file mode 100644 index d8b9936..0000000 --- a/venv/lib/python3.12/site-packages/typing_extensions-4.14.1.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: flit 3.12.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/venv/lib/python3.12/site-packages/typing_extensions-4.14.1.dist-info/licenses/LICENSE b/venv/lib/python3.12/site-packages/typing_extensions-4.14.1.dist-info/licenses/LICENSE deleted file mode 100644 index f26bcf4..0000000 --- a/venv/lib/python3.12/site-packages/typing_extensions-4.14.1.dist-info/licenses/LICENSE +++ /dev/null @@ -1,279 +0,0 @@ -A. HISTORY OF THE SOFTWARE -========================== - -Python was created in the early 1990s by Guido van Rossum at Stichting -Mathematisch Centrum (CWI, see https://www.cwi.nl) in the Netherlands -as a successor of a language called ABC. Guido remains Python's -principal author, although it includes many contributions from others. - -In 1995, Guido continued his work on Python at the Corporation for -National Research Initiatives (CNRI, see https://www.cnri.reston.va.us) -in Reston, Virginia where he released several versions of the -software. - -In May 2000, Guido and the Python core development team moved to -BeOpen.com to form the BeOpen PythonLabs team. In October of the same -year, the PythonLabs team moved to Digital Creations, which became -Zope Corporation. In 2001, the Python Software Foundation (PSF, see -https://www.python.org/psf/) was formed, a non-profit organization -created specifically to own Python-related Intellectual Property. -Zope Corporation was a sponsoring member of the PSF. - -All Python releases are Open Source (see https://opensource.org for -the Open Source Definition). Historically, most, but not all, Python -releases have also been GPL-compatible; the table below summarizes -the various releases. - - Release Derived Year Owner GPL- - from compatible? (1) - - 0.9.0 thru 1.2 1991-1995 CWI yes - 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes - 1.6 1.5.2 2000 CNRI no - 2.0 1.6 2000 BeOpen.com no - 1.6.1 1.6 2001 CNRI yes (2) - 2.1 2.0+1.6.1 2001 PSF no - 2.0.1 2.0+1.6.1 2001 PSF yes - 2.1.1 2.1+2.0.1 2001 PSF yes - 2.1.2 2.1.1 2002 PSF yes - 2.1.3 2.1.2 2002 PSF yes - 2.2 and above 2.1.1 2001-now PSF yes - -Footnotes: - -(1) GPL-compatible doesn't mean that we're distributing Python under - the GPL. All Python licenses, unlike the GPL, let you distribute - a modified version without making your changes open source. The - GPL-compatible licenses make it possible to combine Python with - other software that is released under the GPL; the others don't. - -(2) According to Richard Stallman, 1.6.1 is not GPL-compatible, - because its license has a choice of law clause. According to - CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 - is "not incompatible" with the GPL. - -Thanks to the many outside volunteers who have worked under Guido's -direction to make these releases possible. - - -B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON -=============================================================== - -Python software and documentation are licensed under the -Python Software Foundation License Version 2. - -Starting with Python 3.8.6, examples, recipes, and other code in -the documentation are dual licensed under the PSF License Version 2 -and the Zero-Clause BSD license. - -Some software incorporated into Python is under different licenses. -The licenses are listed with code falling under that license. - - -PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 --------------------------------------------- - -1. This LICENSE AGREEMENT is between the Python Software Foundation -("PSF"), and the Individual or Organization ("Licensee") accessing and -otherwise using this software ("Python") in source or binary form and -its associated documentation. - -2. Subject to the terms and conditions of this License Agreement, PSF hereby -grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, -analyze, test, perform and/or display publicly, prepare derivative works, -distribute, and otherwise use Python alone or in any derivative version, -provided, however, that PSF's License Agreement and PSF's notice of copyright, -i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Python Software Foundation; -All Rights Reserved" are retained in Python alone or in any derivative version -prepared by Licensee. - -3. In the event Licensee prepares a derivative work that is based on -or incorporates Python or any part thereof, and wants to make -the derivative work available to others as provided herein, then -Licensee hereby agrees to include in any such work a brief summary of -the changes made to Python. - -4. PSF is making Python available to Licensee on an "AS IS" -basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON -FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS -A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, -OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -6. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -7. Nothing in this License Agreement shall be deemed to create any -relationship of agency, partnership, or joint venture between PSF and -Licensee. This License Agreement does not grant permission to use PSF -trademarks or trade name in a trademark sense to endorse or promote -products or services of Licensee, or any third party. - -8. By copying, installing or otherwise using Python, Licensee -agrees to be bound by the terms and conditions of this License -Agreement. - - -BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 -------------------------------------------- - -BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 - -1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an -office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the -Individual or Organization ("Licensee") accessing and otherwise using -this software in source or binary form and its associated -documentation ("the Software"). - -2. Subject to the terms and conditions of this BeOpen Python License -Agreement, BeOpen hereby grants Licensee a non-exclusive, -royalty-free, world-wide license to reproduce, analyze, test, perform -and/or display publicly, prepare derivative works, distribute, and -otherwise use the Software alone or in any derivative version, -provided, however, that the BeOpen Python License is retained in the -Software, alone or in any derivative version prepared by Licensee. - -3. BeOpen is making the Software available to Licensee on an "AS IS" -basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE -SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS -AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY -DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -5. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -6. This License Agreement shall be governed by and interpreted in all -respects by the law of the State of California, excluding conflict of -law provisions. Nothing in this License Agreement shall be deemed to -create any relationship of agency, partnership, or joint venture -between BeOpen and Licensee. This License Agreement does not grant -permission to use BeOpen trademarks or trade names in a trademark -sense to endorse or promote products or services of Licensee, or any -third party. As an exception, the "BeOpen Python" logos available at -http://www.pythonlabs.com/logos.html may be used according to the -permissions granted on that web page. - -7. By copying, installing or otherwise using the software, Licensee -agrees to be bound by the terms and conditions of this License -Agreement. - - -CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 ---------------------------------------- - -1. This LICENSE AGREEMENT is between the Corporation for National -Research Initiatives, having an office at 1895 Preston White Drive, -Reston, VA 20191 ("CNRI"), and the Individual or Organization -("Licensee") accessing and otherwise using Python 1.6.1 software in -source or binary form and its associated documentation. - -2. Subject to the terms and conditions of this License Agreement, CNRI -hereby grants Licensee a nonexclusive, royalty-free, world-wide -license to reproduce, analyze, test, perform and/or display publicly, -prepare derivative works, distribute, and otherwise use Python 1.6.1 -alone or in any derivative version, provided, however, that CNRI's -License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) -1995-2001 Corporation for National Research Initiatives; All Rights -Reserved" are retained in Python 1.6.1 alone or in any derivative -version prepared by Licensee. Alternately, in lieu of CNRI's License -Agreement, Licensee may substitute the following text (omitting the -quotes): "Python 1.6.1 is made available subject to the terms and -conditions in CNRI's License Agreement. This Agreement together with -Python 1.6.1 may be located on the internet using the following -unique, persistent identifier (known as a handle): 1895.22/1013. This -Agreement may also be obtained from a proxy server on the internet -using the following URL: http://hdl.handle.net/1895.22/1013". - -3. In the event Licensee prepares a derivative work that is based on -or incorporates Python 1.6.1 or any part thereof, and wants to make -the derivative work available to others as provided herein, then -Licensee hereby agrees to include in any such work a brief summary of -the changes made to Python 1.6.1. - -4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" -basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON -1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS -A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, -OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -6. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -7. This License Agreement shall be governed by the federal -intellectual property law of the United States, including without -limitation the federal copyright law, and, to the extent such -U.S. federal law does not apply, by the law of the Commonwealth of -Virginia, excluding Virginia's conflict of law provisions. -Notwithstanding the foregoing, with regard to derivative works based -on Python 1.6.1 that incorporate non-separable material that was -previously distributed under the GNU General Public License (GPL), the -law of the Commonwealth of Virginia shall govern this License -Agreement only as to issues arising under or with respect to -Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this -License Agreement shall be deemed to create any relationship of -agency, partnership, or joint venture between CNRI and Licensee. This -License Agreement does not grant permission to use CNRI trademarks or -trade name in a trademark sense to endorse or promote products or -services of Licensee, or any third party. - -8. By clicking on the "ACCEPT" button where indicated, or by copying, -installing or otherwise using Python 1.6.1, Licensee agrees to be -bound by the terms and conditions of this License Agreement. - - ACCEPT - - -CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 --------------------------------------------------- - -Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, -The Netherlands. All rights reserved. - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the name of Stichting Mathematisch -Centrum or CWI not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. - -STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO -THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE -FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION ----------------------------------------------------------------------- - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. diff --git a/venv/lib/python3.12/site-packages/typing_extensions.py b/venv/lib/python3.12/site-packages/typing_extensions.py deleted file mode 100644 index efa09d5..0000000 --- a/venv/lib/python3.12/site-packages/typing_extensions.py +++ /dev/null @@ -1,4244 +0,0 @@ -import abc -import builtins -import collections -import collections.abc -import contextlib -import enum -import functools -import inspect -import io -import keyword -import operator -import sys -import types as _types -import typing -import warnings - -if sys.version_info >= (3, 14): - import annotationlib - -__all__ = [ - # Super-special typing primitives. - 'Any', - 'ClassVar', - 'Concatenate', - 'Final', - 'LiteralString', - 'ParamSpec', - 'ParamSpecArgs', - 'ParamSpecKwargs', - 'Self', - 'Type', - 'TypeVar', - 'TypeVarTuple', - 'Unpack', - - # ABCs (from collections.abc). - 'Awaitable', - 'AsyncIterator', - 'AsyncIterable', - 'Coroutine', - 'AsyncGenerator', - 'AsyncContextManager', - 'Buffer', - 'ChainMap', - - # Concrete collection types. - 'ContextManager', - 'Counter', - 'Deque', - 'DefaultDict', - 'NamedTuple', - 'OrderedDict', - 'TypedDict', - - # Structural checks, a.k.a. protocols. - 'SupportsAbs', - 'SupportsBytes', - 'SupportsComplex', - 'SupportsFloat', - 'SupportsIndex', - 'SupportsInt', - 'SupportsRound', - 'Reader', - 'Writer', - - # One-off things. - 'Annotated', - 'assert_never', - 'assert_type', - 'clear_overloads', - 'dataclass_transform', - 'deprecated', - 'Doc', - 'evaluate_forward_ref', - 'get_overloads', - 'final', - 'Format', - 'get_annotations', - 'get_args', - 'get_origin', - 'get_original_bases', - 'get_protocol_members', - 'get_type_hints', - 'IntVar', - 'is_protocol', - 'is_typeddict', - 'Literal', - 'NewType', - 'overload', - 'override', - 'Protocol', - 'Sentinel', - 'reveal_type', - 'runtime', - 'runtime_checkable', - 'Text', - 'TypeAlias', - 'TypeAliasType', - 'TypeForm', - 'TypeGuard', - 'TypeIs', - 'TYPE_CHECKING', - 'Never', - 'NoReturn', - 'ReadOnly', - 'Required', - 'NotRequired', - 'NoDefault', - 'NoExtraItems', - - # Pure aliases, have always been in typing - 'AbstractSet', - 'AnyStr', - 'BinaryIO', - 'Callable', - 'Collection', - 'Container', - 'Dict', - 'ForwardRef', - 'FrozenSet', - 'Generator', - 'Generic', - 'Hashable', - 'IO', - 'ItemsView', - 'Iterable', - 'Iterator', - 'KeysView', - 'List', - 'Mapping', - 'MappingView', - 'Match', - 'MutableMapping', - 'MutableSequence', - 'MutableSet', - 'Optional', - 'Pattern', - 'Reversible', - 'Sequence', - 'Set', - 'Sized', - 'TextIO', - 'Tuple', - 'Union', - 'ValuesView', - 'cast', - 'no_type_check', - 'no_type_check_decorator', -] - -# for backward compatibility -PEP_560 = True -GenericMeta = type -_PEP_696_IMPLEMENTED = sys.version_info >= (3, 13, 0, "beta") - -# Added with bpo-45166 to 3.10.1+ and some 3.9 versions -_FORWARD_REF_HAS_CLASS = "__forward_is_class__" in typing.ForwardRef.__slots__ - -# The functions below are modified copies of typing internal helpers. -# They are needed by _ProtocolMeta and they provide support for PEP 646. - - -class _Sentinel: - def __repr__(self): - return "<sentinel>" - - -_marker = _Sentinel() - - -if sys.version_info >= (3, 10): - def _should_collect_from_parameters(t): - return isinstance( - t, (typing._GenericAlias, _types.GenericAlias, _types.UnionType) - ) -else: - def _should_collect_from_parameters(t): - return isinstance(t, (typing._GenericAlias, _types.GenericAlias)) - - -NoReturn = typing.NoReturn - -# Some unconstrained type variables. These are used by the container types. -# (These are not for export.) -T = typing.TypeVar('T') # Any type. -KT = typing.TypeVar('KT') # Key type. -VT = typing.TypeVar('VT') # Value type. -T_co = typing.TypeVar('T_co', covariant=True) # Any type covariant containers. -T_contra = typing.TypeVar('T_contra', contravariant=True) # Ditto contravariant. - - -if sys.version_info >= (3, 11): - from typing import Any -else: - - class _AnyMeta(type): - def __instancecheck__(self, obj): - if self is Any: - raise TypeError("typing_extensions.Any cannot be used with isinstance()") - return super().__instancecheck__(obj) - - def __repr__(self): - if self is Any: - return "typing_extensions.Any" - return super().__repr__() - - class Any(metaclass=_AnyMeta): - """Special type indicating an unconstrained type. - - Any is compatible with every type. - - Any assumed to have all methods. - - All values assumed to be instances of Any. - Note that all the above statements are true from the point of view of - static type checkers. At runtime, Any should not be used with instance - checks. - """ - def __new__(cls, *args, **kwargs): - if cls is Any: - raise TypeError("Any cannot be instantiated") - return super().__new__(cls, *args, **kwargs) - - -ClassVar = typing.ClassVar - -# Vendored from cpython typing._SpecialFrom -# Having a separate class means that instances will not be rejected by -# typing._type_check. -class _SpecialForm(typing._Final, _root=True): - __slots__ = ('_name', '__doc__', '_getitem') - - def __init__(self, getitem): - self._getitem = getitem - self._name = getitem.__name__ - self.__doc__ = getitem.__doc__ - - def __getattr__(self, item): - if item in {'__name__', '__qualname__'}: - return self._name - - raise AttributeError(item) - - def __mro_entries__(self, bases): - raise TypeError(f"Cannot subclass {self!r}") - - def __repr__(self): - return f'typing_extensions.{self._name}' - - def __reduce__(self): - return self._name - - def __call__(self, *args, **kwds): - raise TypeError(f"Cannot instantiate {self!r}") - - def __or__(self, other): - return typing.Union[self, other] - - def __ror__(self, other): - return typing.Union[other, self] - - def __instancecheck__(self, obj): - raise TypeError(f"{self} cannot be used with isinstance()") - - def __subclasscheck__(self, cls): - raise TypeError(f"{self} cannot be used with issubclass()") - - @typing._tp_cache - def __getitem__(self, parameters): - return self._getitem(self, parameters) - - -# Note that inheriting from this class means that the object will be -# rejected by typing._type_check, so do not use it if the special form -# is arguably valid as a type by itself. -class _ExtensionsSpecialForm(typing._SpecialForm, _root=True): - def __repr__(self): - return 'typing_extensions.' + self._name - - -Final = typing.Final - -if sys.version_info >= (3, 11): - final = typing.final -else: - # @final exists in 3.8+, but we backport it for all versions - # before 3.11 to keep support for the __final__ attribute. - # See https://bugs.python.org/issue46342 - def final(f): - """This decorator can be used to indicate to type checkers that - the decorated method cannot be overridden, and decorated class - cannot be subclassed. For example: - - class Base: - @final - def done(self) -> None: - ... - class Sub(Base): - def done(self) -> None: # Error reported by type checker - ... - @final - class Leaf: - ... - class Other(Leaf): # Error reported by type checker - ... - - There is no runtime checking of these properties. The decorator - sets the ``__final__`` attribute to ``True`` on the decorated object - to allow runtime introspection. - """ - try: - f.__final__ = True - except (AttributeError, TypeError): - # Skip the attribute silently if it is not writable. - # AttributeError happens if the object has __slots__ or a - # read-only property, TypeError if it's a builtin class. - pass - return f - - -def IntVar(name): - return typing.TypeVar(name) - - -# A Literal bug was fixed in 3.11.0, 3.10.1 and 3.9.8 -if sys.version_info >= (3, 10, 1): - Literal = typing.Literal -else: - def _flatten_literal_params(parameters): - """An internal helper for Literal creation: flatten Literals among parameters""" - params = [] - for p in parameters: - if isinstance(p, _LiteralGenericAlias): - params.extend(p.__args__) - else: - params.append(p) - return tuple(params) - - def _value_and_type_iter(params): - for p in params: - yield p, type(p) - - class _LiteralGenericAlias(typing._GenericAlias, _root=True): - def __eq__(self, other): - if not isinstance(other, _LiteralGenericAlias): - return NotImplemented - these_args_deduped = set(_value_and_type_iter(self.__args__)) - other_args_deduped = set(_value_and_type_iter(other.__args__)) - return these_args_deduped == other_args_deduped - - def __hash__(self): - return hash(frozenset(_value_and_type_iter(self.__args__))) - - class _LiteralForm(_ExtensionsSpecialForm, _root=True): - def __init__(self, doc: str): - self._name = 'Literal' - self._doc = self.__doc__ = doc - - def __getitem__(self, parameters): - if not isinstance(parameters, tuple): - parameters = (parameters,) - - parameters = _flatten_literal_params(parameters) - - val_type_pairs = list(_value_and_type_iter(parameters)) - try: - deduped_pairs = set(val_type_pairs) - except TypeError: - # unhashable parameters - pass - else: - # similar logic to typing._deduplicate on Python 3.9+ - if len(deduped_pairs) < len(val_type_pairs): - new_parameters = [] - for pair in val_type_pairs: - if pair in deduped_pairs: - new_parameters.append(pair[0]) - deduped_pairs.remove(pair) - assert not deduped_pairs, deduped_pairs - parameters = tuple(new_parameters) - - return _LiteralGenericAlias(self, parameters) - - Literal = _LiteralForm(doc="""\ - A type that can be used to indicate to type checkers - that the corresponding value has a value literally equivalent - to the provided parameter. For example: - - var: Literal[4] = 4 - - The type checker understands that 'var' is literally equal to - the value 4 and no other value. - - Literal[...] cannot be subclassed. There is no runtime - checking verifying that the parameter is actually a value - instead of a type.""") - - -_overload_dummy = typing._overload_dummy - - -if hasattr(typing, "get_overloads"): # 3.11+ - overload = typing.overload - get_overloads = typing.get_overloads - clear_overloads = typing.clear_overloads -else: - # {module: {qualname: {firstlineno: func}}} - _overload_registry = collections.defaultdict( - functools.partial(collections.defaultdict, dict) - ) - - def overload(func): - """Decorator for overloaded functions/methods. - - In a stub file, place two or more stub definitions for the same - function in a row, each decorated with @overload. For example: - - @overload - def utf8(value: None) -> None: ... - @overload - def utf8(value: bytes) -> bytes: ... - @overload - def utf8(value: str) -> bytes: ... - - In a non-stub file (i.e. a regular .py file), do the same but - follow it with an implementation. The implementation should *not* - be decorated with @overload. For example: - - @overload - def utf8(value: None) -> None: ... - @overload - def utf8(value: bytes) -> bytes: ... - @overload - def utf8(value: str) -> bytes: ... - def utf8(value): - # implementation goes here - - The overloads for a function can be retrieved at runtime using the - get_overloads() function. - """ - # classmethod and staticmethod - f = getattr(func, "__func__", func) - try: - _overload_registry[f.__module__][f.__qualname__][ - f.__code__.co_firstlineno - ] = func - except AttributeError: - # Not a normal function; ignore. - pass - return _overload_dummy - - def get_overloads(func): - """Return all defined overloads for *func* as a sequence.""" - # classmethod and staticmethod - f = getattr(func, "__func__", func) - if f.__module__ not in _overload_registry: - return [] - mod_dict = _overload_registry[f.__module__] - if f.__qualname__ not in mod_dict: - return [] - return list(mod_dict[f.__qualname__].values()) - - def clear_overloads(): - """Clear all overloads in the registry.""" - _overload_registry.clear() - - -# This is not a real generic class. Don't use outside annotations. -Type = typing.Type - -# Various ABCs mimicking those in collections.abc. -# A few are simply re-exported for completeness. -Awaitable = typing.Awaitable -Coroutine = typing.Coroutine -AsyncIterable = typing.AsyncIterable -AsyncIterator = typing.AsyncIterator -Deque = typing.Deque -DefaultDict = typing.DefaultDict -OrderedDict = typing.OrderedDict -Counter = typing.Counter -ChainMap = typing.ChainMap -Text = typing.Text -TYPE_CHECKING = typing.TYPE_CHECKING - - -if sys.version_info >= (3, 13, 0, "beta"): - from typing import AsyncContextManager, AsyncGenerator, ContextManager, Generator -else: - def _is_dunder(attr): - return attr.startswith('__') and attr.endswith('__') - - - class _SpecialGenericAlias(typing._SpecialGenericAlias, _root=True): - def __init__(self, origin, nparams, *, inst=True, name=None, defaults=()): - super().__init__(origin, nparams, inst=inst, name=name) - self._defaults = defaults - - def __setattr__(self, attr, val): - allowed_attrs = {'_name', '_inst', '_nparams', '_defaults'} - if _is_dunder(attr) or attr in allowed_attrs: - object.__setattr__(self, attr, val) - else: - setattr(self.__origin__, attr, val) - - @typing._tp_cache - def __getitem__(self, params): - if not isinstance(params, tuple): - params = (params,) - msg = "Parameters to generic types must be types." - params = tuple(typing._type_check(p, msg) for p in params) - if ( - self._defaults - and len(params) < self._nparams - and len(params) + len(self._defaults) >= self._nparams - ): - params = (*params, *self._defaults[len(params) - self._nparams:]) - actual_len = len(params) - - if actual_len != self._nparams: - if self._defaults: - expected = f"at least {self._nparams - len(self._defaults)}" - else: - expected = str(self._nparams) - if not self._nparams: - raise TypeError(f"{self} is not a generic class") - raise TypeError( - f"Too {'many' if actual_len > self._nparams else 'few'}" - f" arguments for {self};" - f" actual {actual_len}, expected {expected}" - ) - return self.copy_with(params) - - _NoneType = type(None) - Generator = _SpecialGenericAlias( - collections.abc.Generator, 3, defaults=(_NoneType, _NoneType) - ) - AsyncGenerator = _SpecialGenericAlias( - collections.abc.AsyncGenerator, 2, defaults=(_NoneType,) - ) - ContextManager = _SpecialGenericAlias( - contextlib.AbstractContextManager, - 2, - name="ContextManager", - defaults=(typing.Optional[bool],) - ) - AsyncContextManager = _SpecialGenericAlias( - contextlib.AbstractAsyncContextManager, - 2, - name="AsyncContextManager", - defaults=(typing.Optional[bool],) - ) - - -_PROTO_ALLOWLIST = { - 'collections.abc': [ - 'Callable', 'Awaitable', 'Iterable', 'Iterator', 'AsyncIterable', - 'Hashable', 'Sized', 'Container', 'Collection', 'Reversible', 'Buffer', - ], - 'contextlib': ['AbstractContextManager', 'AbstractAsyncContextManager'], - 'typing_extensions': ['Buffer'], -} - - -_EXCLUDED_ATTRS = frozenset(typing.EXCLUDED_ATTRIBUTES) | { - "__match_args__", "__protocol_attrs__", "__non_callable_proto_members__", - "__final__", -} - - -def _get_protocol_attrs(cls): - attrs = set() - for base in cls.__mro__[:-1]: # without object - if base.__name__ in {'Protocol', 'Generic'}: - continue - annotations = getattr(base, '__annotations__', {}) - for attr in (*base.__dict__, *annotations): - if (not attr.startswith('_abc_') and attr not in _EXCLUDED_ATTRS): - attrs.add(attr) - return attrs - - -def _caller(depth=1, default='__main__'): - try: - return sys._getframemodulename(depth + 1) or default - except AttributeError: # For platforms without _getframemodulename() - pass - try: - return sys._getframe(depth + 1).f_globals.get('__name__', default) - except (AttributeError, ValueError): # For platforms without _getframe() - pass - return None - - -# `__match_args__` attribute was removed from protocol members in 3.13, -# we want to backport this change to older Python versions. -if sys.version_info >= (3, 13): - Protocol = typing.Protocol -else: - def _allow_reckless_class_checks(depth=2): - """Allow instance and class checks for special stdlib modules. - The abc and functools modules indiscriminately call isinstance() and - issubclass() on the whole MRO of a user class, which may contain protocols. - """ - return _caller(depth) in {'abc', 'functools', None} - - def _no_init(self, *args, **kwargs): - if type(self)._is_protocol: - raise TypeError('Protocols cannot be instantiated') - - def _type_check_issubclass_arg_1(arg): - """Raise TypeError if `arg` is not an instance of `type` - in `issubclass(arg, <protocol>)`. - - In most cases, this is verified by type.__subclasscheck__. - Checking it again unnecessarily would slow down issubclass() checks, - so, we don't perform this check unless we absolutely have to. - - For various error paths, however, - we want to ensure that *this* error message is shown to the user - where relevant, rather than a typing.py-specific error message. - """ - if not isinstance(arg, type): - # Same error message as for issubclass(1, int). - raise TypeError('issubclass() arg 1 must be a class') - - # Inheriting from typing._ProtocolMeta isn't actually desirable, - # but is necessary to allow typing.Protocol and typing_extensions.Protocol - # to mix without getting TypeErrors about "metaclass conflict" - class _ProtocolMeta(type(typing.Protocol)): - # This metaclass is somewhat unfortunate, - # but is necessary for several reasons... - # - # NOTE: DO NOT call super() in any methods in this class - # That would call the methods on typing._ProtocolMeta on Python <=3.11 - # and those are slow - def __new__(mcls, name, bases, namespace, **kwargs): - if name == "Protocol" and len(bases) < 2: - pass - elif {Protocol, typing.Protocol} & set(bases): - for base in bases: - if not ( - base in {object, typing.Generic, Protocol, typing.Protocol} - or base.__name__ in _PROTO_ALLOWLIST.get(base.__module__, []) - or is_protocol(base) - ): - raise TypeError( - f"Protocols can only inherit from other protocols, " - f"got {base!r}" - ) - return abc.ABCMeta.__new__(mcls, name, bases, namespace, **kwargs) - - def __init__(cls, *args, **kwargs): - abc.ABCMeta.__init__(cls, *args, **kwargs) - if getattr(cls, "_is_protocol", False): - cls.__protocol_attrs__ = _get_protocol_attrs(cls) - - def __subclasscheck__(cls, other): - if cls is Protocol: - return type.__subclasscheck__(cls, other) - if ( - getattr(cls, '_is_protocol', False) - and not _allow_reckless_class_checks() - ): - if not getattr(cls, '_is_runtime_protocol', False): - _type_check_issubclass_arg_1(other) - raise TypeError( - "Instance and class checks can only be used with " - "@runtime_checkable protocols" - ) - if ( - # this attribute is set by @runtime_checkable: - cls.__non_callable_proto_members__ - and cls.__dict__.get("__subclasshook__") is _proto_hook - ): - _type_check_issubclass_arg_1(other) - non_method_attrs = sorted(cls.__non_callable_proto_members__) - raise TypeError( - "Protocols with non-method members don't support issubclass()." - f" Non-method members: {str(non_method_attrs)[1:-1]}." - ) - return abc.ABCMeta.__subclasscheck__(cls, other) - - def __instancecheck__(cls, instance): - # We need this method for situations where attributes are - # assigned in __init__. - if cls is Protocol: - return type.__instancecheck__(cls, instance) - if not getattr(cls, "_is_protocol", False): - # i.e., it's a concrete subclass of a protocol - return abc.ABCMeta.__instancecheck__(cls, instance) - - if ( - not getattr(cls, '_is_runtime_protocol', False) and - not _allow_reckless_class_checks() - ): - raise TypeError("Instance and class checks can only be used with" - " @runtime_checkable protocols") - - if abc.ABCMeta.__instancecheck__(cls, instance): - return True - - for attr in cls.__protocol_attrs__: - try: - val = inspect.getattr_static(instance, attr) - except AttributeError: - break - # this attribute is set by @runtime_checkable: - if val is None and attr not in cls.__non_callable_proto_members__: - break - else: - return True - - return False - - def __eq__(cls, other): - # Hack so that typing.Generic.__class_getitem__ - # treats typing_extensions.Protocol - # as equivalent to typing.Protocol - if abc.ABCMeta.__eq__(cls, other) is True: - return True - return cls is Protocol and other is typing.Protocol - - # This has to be defined, or the abc-module cache - # complains about classes with this metaclass being unhashable, - # if we define only __eq__! - def __hash__(cls) -> int: - return type.__hash__(cls) - - @classmethod - def _proto_hook(cls, other): - if not cls.__dict__.get('_is_protocol', False): - return NotImplemented - - for attr in cls.__protocol_attrs__: - for base in other.__mro__: - # Check if the members appears in the class dictionary... - if attr in base.__dict__: - if base.__dict__[attr] is None: - return NotImplemented - break - - # ...or in annotations, if it is a sub-protocol. - annotations = getattr(base, '__annotations__', {}) - if ( - isinstance(annotations, collections.abc.Mapping) - and attr in annotations - and is_protocol(other) - ): - break - else: - return NotImplemented - return True - - class Protocol(typing.Generic, metaclass=_ProtocolMeta): - __doc__ = typing.Protocol.__doc__ - __slots__ = () - _is_protocol = True - _is_runtime_protocol = False - - def __init_subclass__(cls, *args, **kwargs): - super().__init_subclass__(*args, **kwargs) - - # Determine if this is a protocol or a concrete subclass. - if not cls.__dict__.get('_is_protocol', False): - cls._is_protocol = any(b is Protocol for b in cls.__bases__) - - # Set (or override) the protocol subclass hook. - if '__subclasshook__' not in cls.__dict__: - cls.__subclasshook__ = _proto_hook - - # Prohibit instantiation for protocol classes - if cls._is_protocol and cls.__init__ is Protocol.__init__: - cls.__init__ = _no_init - - -if sys.version_info >= (3, 13): - runtime_checkable = typing.runtime_checkable -else: - def runtime_checkable(cls): - """Mark a protocol class as a runtime protocol. - - Such protocol can be used with isinstance() and issubclass(). - Raise TypeError if applied to a non-protocol class. - This allows a simple-minded structural check very similar to - one trick ponies in collections.abc such as Iterable. - - For example:: - - @runtime_checkable - class Closable(Protocol): - def close(self): ... - - assert isinstance(open('/some/file'), Closable) - - Warning: this will check only the presence of the required methods, - not their type signatures! - """ - if not issubclass(cls, typing.Generic) or not getattr(cls, '_is_protocol', False): - raise TypeError(f'@runtime_checkable can be only applied to protocol classes,' - f' got {cls!r}') - cls._is_runtime_protocol = True - - # typing.Protocol classes on <=3.11 break if we execute this block, - # because typing.Protocol classes on <=3.11 don't have a - # `__protocol_attrs__` attribute, and this block relies on the - # `__protocol_attrs__` attribute. Meanwhile, typing.Protocol classes on 3.12.2+ - # break if we *don't* execute this block, because *they* assume that all - # protocol classes have a `__non_callable_proto_members__` attribute - # (which this block sets) - if isinstance(cls, _ProtocolMeta) or sys.version_info >= (3, 12, 2): - # PEP 544 prohibits using issubclass() - # with protocols that have non-method members. - # See gh-113320 for why we compute this attribute here, - # rather than in `_ProtocolMeta.__init__` - cls.__non_callable_proto_members__ = set() - for attr in cls.__protocol_attrs__: - try: - is_callable = callable(getattr(cls, attr, None)) - except Exception as e: - raise TypeError( - f"Failed to determine whether protocol member {attr!r} " - "is a method member" - ) from e - else: - if not is_callable: - cls.__non_callable_proto_members__.add(attr) - - return cls - - -# The "runtime" alias exists for backwards compatibility. -runtime = runtime_checkable - - -# Our version of runtime-checkable protocols is faster on Python <=3.11 -if sys.version_info >= (3, 12): - SupportsInt = typing.SupportsInt - SupportsFloat = typing.SupportsFloat - SupportsComplex = typing.SupportsComplex - SupportsBytes = typing.SupportsBytes - SupportsIndex = typing.SupportsIndex - SupportsAbs = typing.SupportsAbs - SupportsRound = typing.SupportsRound -else: - @runtime_checkable - class SupportsInt(Protocol): - """An ABC with one abstract method __int__.""" - __slots__ = () - - @abc.abstractmethod - def __int__(self) -> int: - pass - - @runtime_checkable - class SupportsFloat(Protocol): - """An ABC with one abstract method __float__.""" - __slots__ = () - - @abc.abstractmethod - def __float__(self) -> float: - pass - - @runtime_checkable - class SupportsComplex(Protocol): - """An ABC with one abstract method __complex__.""" - __slots__ = () - - @abc.abstractmethod - def __complex__(self) -> complex: - pass - - @runtime_checkable - class SupportsBytes(Protocol): - """An ABC with one abstract method __bytes__.""" - __slots__ = () - - @abc.abstractmethod - def __bytes__(self) -> bytes: - pass - - @runtime_checkable - class SupportsIndex(Protocol): - __slots__ = () - - @abc.abstractmethod - def __index__(self) -> int: - pass - - @runtime_checkable - class SupportsAbs(Protocol[T_co]): - """ - An ABC with one abstract method __abs__ that is covariant in its return type. - """ - __slots__ = () - - @abc.abstractmethod - def __abs__(self) -> T_co: - pass - - @runtime_checkable - class SupportsRound(Protocol[T_co]): - """ - An ABC with one abstract method __round__ that is covariant in its return type. - """ - __slots__ = () - - @abc.abstractmethod - def __round__(self, ndigits: int = 0) -> T_co: - pass - - -if hasattr(io, "Reader") and hasattr(io, "Writer"): - Reader = io.Reader - Writer = io.Writer -else: - @runtime_checkable - class Reader(Protocol[T_co]): - """Protocol for simple I/O reader instances. - - This protocol only supports blocking I/O. - """ - - __slots__ = () - - @abc.abstractmethod - def read(self, size: int = ..., /) -> T_co: - """Read data from the input stream and return it. - - If *size* is specified, at most *size* items (bytes/characters) will be - read. - """ - - @runtime_checkable - class Writer(Protocol[T_contra]): - """Protocol for simple I/O writer instances. - - This protocol only supports blocking I/O. - """ - - __slots__ = () - - @abc.abstractmethod - def write(self, data: T_contra, /) -> int: - """Write *data* to the output stream and return the number of items written.""" # noqa: E501 - - -_NEEDS_SINGLETONMETA = ( - not hasattr(typing, "NoDefault") or not hasattr(typing, "NoExtraItems") -) - -if _NEEDS_SINGLETONMETA: - class SingletonMeta(type): - def __setattr__(cls, attr, value): - # TypeError is consistent with the behavior of NoneType - raise TypeError( - f"cannot set {attr!r} attribute of immutable type {cls.__name__!r}" - ) - - -if hasattr(typing, "NoDefault"): - NoDefault = typing.NoDefault -else: - class NoDefaultType(metaclass=SingletonMeta): - """The type of the NoDefault singleton.""" - - __slots__ = () - - def __new__(cls): - return globals().get("NoDefault") or object.__new__(cls) - - def __repr__(self): - return "typing_extensions.NoDefault" - - def __reduce__(self): - return "NoDefault" - - NoDefault = NoDefaultType() - del NoDefaultType - -if hasattr(typing, "NoExtraItems"): - NoExtraItems = typing.NoExtraItems -else: - class NoExtraItemsType(metaclass=SingletonMeta): - """The type of the NoExtraItems singleton.""" - - __slots__ = () - - def __new__(cls): - return globals().get("NoExtraItems") or object.__new__(cls) - - def __repr__(self): - return "typing_extensions.NoExtraItems" - - def __reduce__(self): - return "NoExtraItems" - - NoExtraItems = NoExtraItemsType() - del NoExtraItemsType - -if _NEEDS_SINGLETONMETA: - del SingletonMeta - - -# Update this to something like >=3.13.0b1 if and when -# PEP 728 is implemented in CPython -_PEP_728_IMPLEMENTED = False - -if _PEP_728_IMPLEMENTED: - # The standard library TypedDict in Python 3.9.0/1 does not honour the "total" - # keyword with old-style TypedDict(). See https://bugs.python.org/issue42059 - # The standard library TypedDict below Python 3.11 does not store runtime - # information about optional and required keys when using Required or NotRequired. - # Generic TypedDicts are also impossible using typing.TypedDict on Python <3.11. - # Aaaand on 3.12 we add __orig_bases__ to TypedDict - # to enable better runtime introspection. - # On 3.13 we deprecate some odd ways of creating TypedDicts. - # Also on 3.13, PEP 705 adds the ReadOnly[] qualifier. - # PEP 728 (still pending) makes more changes. - TypedDict = typing.TypedDict - _TypedDictMeta = typing._TypedDictMeta - is_typeddict = typing.is_typeddict -else: - # 3.10.0 and later - _TAKES_MODULE = "module" in inspect.signature(typing._type_check).parameters - - def _get_typeddict_qualifiers(annotation_type): - while True: - annotation_origin = get_origin(annotation_type) - if annotation_origin is Annotated: - annotation_args = get_args(annotation_type) - if annotation_args: - annotation_type = annotation_args[0] - else: - break - elif annotation_origin is Required: - yield Required - annotation_type, = get_args(annotation_type) - elif annotation_origin is NotRequired: - yield NotRequired - annotation_type, = get_args(annotation_type) - elif annotation_origin is ReadOnly: - yield ReadOnly - annotation_type, = get_args(annotation_type) - else: - break - - class _TypedDictMeta(type): - - def __new__(cls, name, bases, ns, *, total=True, closed=None, - extra_items=NoExtraItems): - """Create new typed dict class object. - - This method is called when TypedDict is subclassed, - or when TypedDict is instantiated. This way - TypedDict supports all three syntax forms described in its docstring. - Subclasses and instances of TypedDict return actual dictionaries. - """ - for base in bases: - if type(base) is not _TypedDictMeta and base is not typing.Generic: - raise TypeError('cannot inherit from both a TypedDict type ' - 'and a non-TypedDict base class') - if closed is not None and extra_items is not NoExtraItems: - raise TypeError(f"Cannot combine closed={closed!r} and extra_items") - - if any(issubclass(b, typing.Generic) for b in bases): - generic_base = (typing.Generic,) - else: - generic_base = () - - ns_annotations = ns.pop('__annotations__', None) - - # typing.py generally doesn't let you inherit from plain Generic, unless - # the name of the class happens to be "Protocol" - tp_dict = type.__new__(_TypedDictMeta, "Protocol", (*generic_base, dict), ns) - tp_dict.__name__ = name - if tp_dict.__qualname__ == "Protocol": - tp_dict.__qualname__ = name - - if not hasattr(tp_dict, '__orig_bases__'): - tp_dict.__orig_bases__ = bases - - annotations = {} - own_annotate = None - if ns_annotations is not None: - own_annotations = ns_annotations - elif sys.version_info >= (3, 14): - if hasattr(annotationlib, "get_annotate_from_class_namespace"): - own_annotate = annotationlib.get_annotate_from_class_namespace(ns) - else: - # 3.14.0a7 and earlier - own_annotate = ns.get("__annotate__") - if own_annotate is not None: - own_annotations = annotationlib.call_annotate_function( - own_annotate, Format.FORWARDREF, owner=tp_dict - ) - else: - own_annotations = {} - else: - own_annotations = {} - msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type" - if _TAKES_MODULE: - own_checked_annotations = { - n: typing._type_check(tp, msg, module=tp_dict.__module__) - for n, tp in own_annotations.items() - } - else: - own_checked_annotations = { - n: typing._type_check(tp, msg) - for n, tp in own_annotations.items() - } - required_keys = set() - optional_keys = set() - readonly_keys = set() - mutable_keys = set() - extra_items_type = extra_items - - for base in bases: - base_dict = base.__dict__ - - if sys.version_info <= (3, 14): - annotations.update(base_dict.get('__annotations__', {})) - required_keys.update(base_dict.get('__required_keys__', ())) - optional_keys.update(base_dict.get('__optional_keys__', ())) - readonly_keys.update(base_dict.get('__readonly_keys__', ())) - mutable_keys.update(base_dict.get('__mutable_keys__', ())) - - # This was specified in an earlier version of PEP 728. Support - # is retained for backwards compatibility, but only for Python - # 3.13 and lower. - if (closed and sys.version_info < (3, 14) - and "__extra_items__" in own_checked_annotations): - annotation_type = own_checked_annotations.pop("__extra_items__") - qualifiers = set(_get_typeddict_qualifiers(annotation_type)) - if Required in qualifiers: - raise TypeError( - "Special key __extra_items__ does not support " - "Required" - ) - if NotRequired in qualifiers: - raise TypeError( - "Special key __extra_items__ does not support " - "NotRequired" - ) - extra_items_type = annotation_type - - annotations.update(own_checked_annotations) - for annotation_key, annotation_type in own_checked_annotations.items(): - qualifiers = set(_get_typeddict_qualifiers(annotation_type)) - - if Required in qualifiers: - required_keys.add(annotation_key) - elif NotRequired in qualifiers: - optional_keys.add(annotation_key) - elif total: - required_keys.add(annotation_key) - else: - optional_keys.add(annotation_key) - if ReadOnly in qualifiers: - mutable_keys.discard(annotation_key) - readonly_keys.add(annotation_key) - else: - mutable_keys.add(annotation_key) - readonly_keys.discard(annotation_key) - - if sys.version_info >= (3, 14): - def __annotate__(format): - annos = {} - for base in bases: - if base is Generic: - continue - base_annotate = base.__annotate__ - if base_annotate is None: - continue - base_annos = annotationlib.call_annotate_function( - base_annotate, format, owner=base) - annos.update(base_annos) - if own_annotate is not None: - own = annotationlib.call_annotate_function( - own_annotate, format, owner=tp_dict) - if format != Format.STRING: - own = { - n: typing._type_check(tp, msg, module=tp_dict.__module__) - for n, tp in own.items() - } - elif format == Format.STRING: - own = annotationlib.annotations_to_string(own_annotations) - elif format in (Format.FORWARDREF, Format.VALUE): - own = own_checked_annotations - else: - raise NotImplementedError(format) - annos.update(own) - return annos - - tp_dict.__annotate__ = __annotate__ - else: - tp_dict.__annotations__ = annotations - tp_dict.__required_keys__ = frozenset(required_keys) - tp_dict.__optional_keys__ = frozenset(optional_keys) - tp_dict.__readonly_keys__ = frozenset(readonly_keys) - tp_dict.__mutable_keys__ = frozenset(mutable_keys) - tp_dict.__total__ = total - tp_dict.__closed__ = closed - tp_dict.__extra_items__ = extra_items_type - return tp_dict - - __call__ = dict # static method - - def __subclasscheck__(cls, other): - # Typed dicts are only for static structural subtyping. - raise TypeError('TypedDict does not support instance and class checks') - - __instancecheck__ = __subclasscheck__ - - _TypedDict = type.__new__(_TypedDictMeta, 'TypedDict', (), {}) - - def _create_typeddict( - typename, - fields, - /, - *, - typing_is_inline, - total, - closed, - extra_items, - **kwargs, - ): - if fields is _marker or fields is None: - if fields is _marker: - deprecated_thing = ( - "Failing to pass a value for the 'fields' parameter" - ) - else: - deprecated_thing = "Passing `None` as the 'fields' parameter" - - example = f"`{typename} = TypedDict({typename!r}, {{}})`" - deprecation_msg = ( - f"{deprecated_thing} is deprecated and will be disallowed in " - "Python 3.15. To create a TypedDict class with 0 fields " - "using the functional syntax, pass an empty dictionary, e.g. " - ) + example + "." - warnings.warn(deprecation_msg, DeprecationWarning, stacklevel=2) - # Support a field called "closed" - if closed is not False and closed is not True and closed is not None: - kwargs["closed"] = closed - closed = None - # Or "extra_items" - if extra_items is not NoExtraItems: - kwargs["extra_items"] = extra_items - extra_items = NoExtraItems - fields = kwargs - elif kwargs: - raise TypeError("TypedDict takes either a dict or keyword arguments," - " but not both") - if kwargs: - if sys.version_info >= (3, 13): - raise TypeError("TypedDict takes no keyword arguments") - warnings.warn( - "The kwargs-based syntax for TypedDict definitions is deprecated " - "in Python 3.11, will be removed in Python 3.13, and may not be " - "understood by third-party type checkers.", - DeprecationWarning, - stacklevel=2, - ) - - ns = {'__annotations__': dict(fields)} - module = _caller(depth=4 if typing_is_inline else 2) - if module is not None: - # Setting correct module is necessary to make typed dict classes - # pickleable. - ns['__module__'] = module - - td = _TypedDictMeta(typename, (), ns, total=total, closed=closed, - extra_items=extra_items) - td.__orig_bases__ = (TypedDict,) - return td - - class _TypedDictSpecialForm(_SpecialForm, _root=True): - def __call__( - self, - typename, - fields=_marker, - /, - *, - total=True, - closed=None, - extra_items=NoExtraItems, - **kwargs - ): - return _create_typeddict( - typename, - fields, - typing_is_inline=False, - total=total, - closed=closed, - extra_items=extra_items, - **kwargs, - ) - - def __mro_entries__(self, bases): - return (_TypedDict,) - - @_TypedDictSpecialForm - def TypedDict(self, args): - """A simple typed namespace. At runtime it is equivalent to a plain dict. - - TypedDict creates a dictionary type such that a type checker will expect all - instances to have a certain set of keys, where each key is - associated with a value of a consistent type. This expectation - is not checked at runtime. - - Usage:: - - class Point2D(TypedDict): - x: int - y: int - label: str - - a: Point2D = {'x': 1, 'y': 2, 'label': 'good'} # OK - b: Point2D = {'z': 3, 'label': 'bad'} # Fails type check - - assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first') - - The type info can be accessed via the Point2D.__annotations__ dict, and - the Point2D.__required_keys__ and Point2D.__optional_keys__ frozensets. - TypedDict supports an additional equivalent form:: - - Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str}) - - By default, all keys must be present in a TypedDict. It is possible - to override this by specifying totality:: - - class Point2D(TypedDict, total=False): - x: int - y: int - - This means that a Point2D TypedDict can have any of the keys omitted. A type - checker is only expected to support a literal False or True as the value of - the total argument. True is the default, and makes all items defined in the - class body be required. - - The Required and NotRequired special forms can also be used to mark - individual keys as being required or not required:: - - class Point2D(TypedDict): - x: int # the "x" key must always be present (Required is the default) - y: NotRequired[int] # the "y" key can be omitted - - See PEP 655 for more details on Required and NotRequired. - """ - # This runs when creating inline TypedDicts: - if not isinstance(args, dict): - raise TypeError( - "TypedDict[...] should be used with a single dict argument" - ) - - return _create_typeddict( - "<inline TypedDict>", - args, - typing_is_inline=True, - total=True, - closed=True, - extra_items=NoExtraItems, - ) - - _TYPEDDICT_TYPES = (typing._TypedDictMeta, _TypedDictMeta) - - def is_typeddict(tp): - """Check if an annotation is a TypedDict class - - For example:: - class Film(TypedDict): - title: str - year: int - - is_typeddict(Film) # => True - is_typeddict(Union[list, str]) # => False - """ - return isinstance(tp, _TYPEDDICT_TYPES) - - -if hasattr(typing, "assert_type"): - assert_type = typing.assert_type - -else: - def assert_type(val, typ, /): - """Assert (to the type checker) that the value is of the given type. - - When the type checker encounters a call to assert_type(), it - emits an error if the value is not of the specified type:: - - def greet(name: str) -> None: - assert_type(name, str) # ok - assert_type(name, int) # type checker error - - At runtime this returns the first argument unchanged and otherwise - does nothing. - """ - return val - - -if hasattr(typing, "ReadOnly"): # 3.13+ - get_type_hints = typing.get_type_hints -else: # <=3.13 - # replaces _strip_annotations() - def _strip_extras(t): - """Strips Annotated, Required and NotRequired from a given type.""" - if isinstance(t, typing._AnnotatedAlias): - return _strip_extras(t.__origin__) - if hasattr(t, "__origin__") and t.__origin__ in (Required, NotRequired, ReadOnly): - return _strip_extras(t.__args__[0]) - if isinstance(t, typing._GenericAlias): - stripped_args = tuple(_strip_extras(a) for a in t.__args__) - if stripped_args == t.__args__: - return t - return t.copy_with(stripped_args) - if hasattr(_types, "GenericAlias") and isinstance(t, _types.GenericAlias): - stripped_args = tuple(_strip_extras(a) for a in t.__args__) - if stripped_args == t.__args__: - return t - return _types.GenericAlias(t.__origin__, stripped_args) - if hasattr(_types, "UnionType") and isinstance(t, _types.UnionType): - stripped_args = tuple(_strip_extras(a) for a in t.__args__) - if stripped_args == t.__args__: - return t - return functools.reduce(operator.or_, stripped_args) - - return t - - def get_type_hints(obj, globalns=None, localns=None, include_extras=False): - """Return type hints for an object. - - This is often the same as obj.__annotations__, but it handles - forward references encoded as string literals, adds Optional[t] if a - default value equal to None is set and recursively replaces all - 'Annotated[T, ...]', 'Required[T]' or 'NotRequired[T]' with 'T' - (unless 'include_extras=True'). - - The argument may be a module, class, method, or function. The annotations - are returned as a dictionary. For classes, annotations include also - inherited members. - - TypeError is raised if the argument is not of a type that can contain - annotations, and an empty dictionary is returned if no annotations are - present. - - BEWARE -- the behavior of globalns and localns is counterintuitive - (unless you are familiar with how eval() and exec() work). The - search order is locals first, then globals. - - - If no dict arguments are passed, an attempt is made to use the - globals from obj (or the respective module's globals for classes), - and these are also used as the locals. If the object does not appear - to have globals, an empty dictionary is used. - - - If one dict argument is passed, it is used for both globals and - locals. - - - If two dict arguments are passed, they specify globals and - locals, respectively. - """ - hint = typing.get_type_hints( - obj, globalns=globalns, localns=localns, include_extras=True - ) - if sys.version_info < (3, 11): - _clean_optional(obj, hint, globalns, localns) - if include_extras: - return hint - return {k: _strip_extras(t) for k, t in hint.items()} - - _NoneType = type(None) - - def _could_be_inserted_optional(t): - """detects Union[..., None] pattern""" - if not isinstance(t, typing._UnionGenericAlias): - return False - # Assume if last argument is not None they are user defined - if t.__args__[-1] is not _NoneType: - return False - return True - - # < 3.11 - def _clean_optional(obj, hints, globalns=None, localns=None): - # reverts injected Union[..., None] cases from typing.get_type_hints - # when a None default value is used. - # see https://github.com/python/typing_extensions/issues/310 - if not hints or isinstance(obj, type): - return - defaults = typing._get_defaults(obj) # avoid accessing __annotations___ - if not defaults: - return - original_hints = obj.__annotations__ - for name, value in hints.items(): - # Not a Union[..., None] or replacement conditions not fullfilled - if (not _could_be_inserted_optional(value) - or name not in defaults - or defaults[name] is not None - ): - continue - original_value = original_hints[name] - # value=NoneType should have caused a skip above but check for safety - if original_value is None: - original_value = _NoneType - # Forward reference - if isinstance(original_value, str): - if globalns is None: - if isinstance(obj, _types.ModuleType): - globalns = obj.__dict__ - else: - nsobj = obj - # Find globalns for the unwrapped object. - while hasattr(nsobj, '__wrapped__'): - nsobj = nsobj.__wrapped__ - globalns = getattr(nsobj, '__globals__', {}) - if localns is None: - localns = globalns - elif localns is None: - localns = globalns - - original_value = ForwardRef( - original_value, - is_argument=not isinstance(obj, _types.ModuleType) - ) - original_evaluated = typing._eval_type(original_value, globalns, localns) - # Compare if values differ. Note that even if equal - # value might be cached by typing._tp_cache contrary to original_evaluated - if original_evaluated != value or ( - # 3.10: ForwardRefs of UnionType might be turned into _UnionGenericAlias - hasattr(_types, "UnionType") - and isinstance(original_evaluated, _types.UnionType) - and not isinstance(value, _types.UnionType) - ): - hints[name] = original_evaluated - -# Python 3.9 has get_origin() and get_args() but those implementations don't support -# ParamSpecArgs and ParamSpecKwargs, so only Python 3.10's versions will do. -if sys.version_info[:2] >= (3, 10): - get_origin = typing.get_origin - get_args = typing.get_args -# 3.9 -else: - def get_origin(tp): - """Get the unsubscripted version of a type. - - This supports generic types, Callable, Tuple, Union, Literal, Final, ClassVar - and Annotated. Return None for unsupported types. Examples:: - - get_origin(Literal[42]) is Literal - get_origin(int) is None - get_origin(ClassVar[int]) is ClassVar - get_origin(Generic) is Generic - get_origin(Generic[T]) is Generic - get_origin(Union[T, int]) is Union - get_origin(List[Tuple[T, T]][int]) == list - get_origin(P.args) is P - """ - if isinstance(tp, typing._AnnotatedAlias): - return Annotated - if isinstance(tp, (typing._BaseGenericAlias, _types.GenericAlias, - ParamSpecArgs, ParamSpecKwargs)): - return tp.__origin__ - if tp is typing.Generic: - return typing.Generic - return None - - def get_args(tp): - """Get type arguments with all substitutions performed. - - For unions, basic simplifications used by Union constructor are performed. - Examples:: - get_args(Dict[str, int]) == (str, int) - get_args(int) == () - get_args(Union[int, Union[T, int], str][int]) == (int, str) - get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int]) - get_args(Callable[[], T][int]) == ([], int) - """ - if isinstance(tp, typing._AnnotatedAlias): - return (tp.__origin__, *tp.__metadata__) - if isinstance(tp, (typing._GenericAlias, _types.GenericAlias)): - res = tp.__args__ - if get_origin(tp) is collections.abc.Callable and res[0] is not Ellipsis: - res = (list(res[:-1]), res[-1]) - return res - return () - - -# 3.10+ -if hasattr(typing, 'TypeAlias'): - TypeAlias = typing.TypeAlias -# 3.9 -else: - @_ExtensionsSpecialForm - def TypeAlias(self, parameters): - """Special marker indicating that an assignment should - be recognized as a proper type alias definition by type - checkers. - - For example:: - - Predicate: TypeAlias = Callable[..., bool] - - It's invalid when used anywhere except as in the example above. - """ - raise TypeError(f"{self} is not subscriptable") - - -def _set_default(type_param, default): - type_param.has_default = lambda: default is not NoDefault - type_param.__default__ = default - - -def _set_module(typevarlike): - # for pickling: - def_mod = _caller(depth=2) - if def_mod != 'typing_extensions': - typevarlike.__module__ = def_mod - - -class _DefaultMixin: - """Mixin for TypeVarLike defaults.""" - - __slots__ = () - __init__ = _set_default - - -# Classes using this metaclass must provide a _backported_typevarlike ClassVar -class _TypeVarLikeMeta(type): - def __instancecheck__(cls, __instance: Any) -> bool: - return isinstance(__instance, cls._backported_typevarlike) - - -if _PEP_696_IMPLEMENTED: - from typing import TypeVar -else: - # Add default and infer_variance parameters from PEP 696 and 695 - class TypeVar(metaclass=_TypeVarLikeMeta): - """Type variable.""" - - _backported_typevarlike = typing.TypeVar - - def __new__(cls, name, *constraints, bound=None, - covariant=False, contravariant=False, - default=NoDefault, infer_variance=False): - if hasattr(typing, "TypeAliasType"): - # PEP 695 implemented (3.12+), can pass infer_variance to typing.TypeVar - typevar = typing.TypeVar(name, *constraints, bound=bound, - covariant=covariant, contravariant=contravariant, - infer_variance=infer_variance) - else: - typevar = typing.TypeVar(name, *constraints, bound=bound, - covariant=covariant, contravariant=contravariant) - if infer_variance and (covariant or contravariant): - raise ValueError("Variance cannot be specified with infer_variance.") - typevar.__infer_variance__ = infer_variance - - _set_default(typevar, default) - _set_module(typevar) - - def _tvar_prepare_subst(alias, args): - if ( - typevar.has_default() - and alias.__parameters__.index(typevar) == len(args) - ): - args += (typevar.__default__,) - return args - - typevar.__typing_prepare_subst__ = _tvar_prepare_subst - return typevar - - def __init_subclass__(cls) -> None: - raise TypeError(f"type '{__name__}.TypeVar' is not an acceptable base type") - - -# Python 3.10+ has PEP 612 -if hasattr(typing, 'ParamSpecArgs'): - ParamSpecArgs = typing.ParamSpecArgs - ParamSpecKwargs = typing.ParamSpecKwargs -# 3.9 -else: - class _Immutable: - """Mixin to indicate that object should not be copied.""" - __slots__ = () - - def __copy__(self): - return self - - def __deepcopy__(self, memo): - return self - - class ParamSpecArgs(_Immutable): - """The args for a ParamSpec object. - - Given a ParamSpec object P, P.args is an instance of ParamSpecArgs. - - ParamSpecArgs objects have a reference back to their ParamSpec: - - P.args.__origin__ is P - - This type is meant for runtime introspection and has no special meaning to - static type checkers. - """ - def __init__(self, origin): - self.__origin__ = origin - - def __repr__(self): - return f"{self.__origin__.__name__}.args" - - def __eq__(self, other): - if not isinstance(other, ParamSpecArgs): - return NotImplemented - return self.__origin__ == other.__origin__ - - class ParamSpecKwargs(_Immutable): - """The kwargs for a ParamSpec object. - - Given a ParamSpec object P, P.kwargs is an instance of ParamSpecKwargs. - - ParamSpecKwargs objects have a reference back to their ParamSpec: - - P.kwargs.__origin__ is P - - This type is meant for runtime introspection and has no special meaning to - static type checkers. - """ - def __init__(self, origin): - self.__origin__ = origin - - def __repr__(self): - return f"{self.__origin__.__name__}.kwargs" - - def __eq__(self, other): - if not isinstance(other, ParamSpecKwargs): - return NotImplemented - return self.__origin__ == other.__origin__ - - -if _PEP_696_IMPLEMENTED: - from typing import ParamSpec - -# 3.10+ -elif hasattr(typing, 'ParamSpec'): - - # Add default parameter - PEP 696 - class ParamSpec(metaclass=_TypeVarLikeMeta): - """Parameter specification.""" - - _backported_typevarlike = typing.ParamSpec - - def __new__(cls, name, *, bound=None, - covariant=False, contravariant=False, - infer_variance=False, default=NoDefault): - if hasattr(typing, "TypeAliasType"): - # PEP 695 implemented, can pass infer_variance to typing.TypeVar - paramspec = typing.ParamSpec(name, bound=bound, - covariant=covariant, - contravariant=contravariant, - infer_variance=infer_variance) - else: - paramspec = typing.ParamSpec(name, bound=bound, - covariant=covariant, - contravariant=contravariant) - paramspec.__infer_variance__ = infer_variance - - _set_default(paramspec, default) - _set_module(paramspec) - - def _paramspec_prepare_subst(alias, args): - params = alias.__parameters__ - i = params.index(paramspec) - if i == len(args) and paramspec.has_default(): - args = [*args, paramspec.__default__] - if i >= len(args): - raise TypeError(f"Too few arguments for {alias}") - # Special case where Z[[int, str, bool]] == Z[int, str, bool] in PEP 612. - if len(params) == 1 and not typing._is_param_expr(args[0]): - assert i == 0 - args = (args,) - # Convert lists to tuples to help other libraries cache the results. - elif isinstance(args[i], list): - args = (*args[:i], tuple(args[i]), *args[i + 1:]) - return args - - paramspec.__typing_prepare_subst__ = _paramspec_prepare_subst - return paramspec - - def __init_subclass__(cls) -> None: - raise TypeError(f"type '{__name__}.ParamSpec' is not an acceptable base type") - -# 3.9 -else: - - # Inherits from list as a workaround for Callable checks in Python < 3.9.2. - class ParamSpec(list, _DefaultMixin): - """Parameter specification variable. - - Usage:: - - P = ParamSpec('P') - - Parameter specification variables exist primarily for the benefit of static - type checkers. They are used to forward the parameter types of one - callable to another callable, a pattern commonly found in higher order - functions and decorators. They are only valid when used in ``Concatenate``, - or s the first argument to ``Callable``. In Python 3.10 and higher, - they are also supported in user-defined Generics at runtime. - See class Generic for more information on generic types. An - example for annotating a decorator:: - - T = TypeVar('T') - P = ParamSpec('P') - - def add_logging(f: Callable[P, T]) -> Callable[P, T]: - '''A type-safe decorator to add logging to a function.''' - def inner(*args: P.args, **kwargs: P.kwargs) -> T: - logging.info(f'{f.__name__} was called') - return f(*args, **kwargs) - return inner - - @add_logging - def add_two(x: float, y: float) -> float: - '''Add two numbers together.''' - return x + y - - Parameter specification variables defined with covariant=True or - contravariant=True can be used to declare covariant or contravariant - generic types. These keyword arguments are valid, but their actual semantics - are yet to be decided. See PEP 612 for details. - - Parameter specification variables can be introspected. e.g.: - - P.__name__ == 'T' - P.__bound__ == None - P.__covariant__ == False - P.__contravariant__ == False - - Note that only parameter specification variables defined in global scope can - be pickled. - """ - - # Trick Generic __parameters__. - __class__ = typing.TypeVar - - @property - def args(self): - return ParamSpecArgs(self) - - @property - def kwargs(self): - return ParamSpecKwargs(self) - - def __init__(self, name, *, bound=None, covariant=False, contravariant=False, - infer_variance=False, default=NoDefault): - list.__init__(self, [self]) - self.__name__ = name - self.__covariant__ = bool(covariant) - self.__contravariant__ = bool(contravariant) - self.__infer_variance__ = bool(infer_variance) - if bound: - self.__bound__ = typing._type_check(bound, 'Bound must be a type.') - else: - self.__bound__ = None - _DefaultMixin.__init__(self, default) - - # for pickling: - def_mod = _caller() - if def_mod != 'typing_extensions': - self.__module__ = def_mod - - def __repr__(self): - if self.__infer_variance__: - prefix = '' - elif self.__covariant__: - prefix = '+' - elif self.__contravariant__: - prefix = '-' - else: - prefix = '~' - return prefix + self.__name__ - - def __hash__(self): - return object.__hash__(self) - - def __eq__(self, other): - return self is other - - def __reduce__(self): - return self.__name__ - - # Hack to get typing._type_check to pass. - def __call__(self, *args, **kwargs): - pass - - -# 3.9 -if not hasattr(typing, 'Concatenate'): - # Inherits from list as a workaround for Callable checks in Python < 3.9.2. - - # 3.9.0-1 - if not hasattr(typing, '_type_convert'): - def _type_convert(arg, module=None, *, allow_special_forms=False): - """For converting None to type(None), and strings to ForwardRef.""" - if arg is None: - return type(None) - if isinstance(arg, str): - if sys.version_info <= (3, 9, 6): - return ForwardRef(arg) - if sys.version_info <= (3, 9, 7): - return ForwardRef(arg, module=module) - return ForwardRef(arg, module=module, is_class=allow_special_forms) - return arg - else: - _type_convert = typing._type_convert - - class _ConcatenateGenericAlias(list): - - # Trick Generic into looking into this for __parameters__. - __class__ = typing._GenericAlias - - def __init__(self, origin, args): - super().__init__(args) - self.__origin__ = origin - self.__args__ = args - - def __repr__(self): - _type_repr = typing._type_repr - return (f'{_type_repr(self.__origin__)}' - f'[{", ".join(_type_repr(arg) for arg in self.__args__)}]') - - def __hash__(self): - return hash((self.__origin__, self.__args__)) - - # Hack to get typing._type_check to pass in Generic. - def __call__(self, *args, **kwargs): - pass - - @property - def __parameters__(self): - return tuple( - tp for tp in self.__args__ if isinstance(tp, (typing.TypeVar, ParamSpec)) - ) - - # 3.9 used by __getitem__ below - def copy_with(self, params): - if isinstance(params[-1], _ConcatenateGenericAlias): - params = (*params[:-1], *params[-1].__args__) - elif isinstance(params[-1], (list, tuple)): - return (*params[:-1], *params[-1]) - elif (not (params[-1] is ... or isinstance(params[-1], ParamSpec))): - raise TypeError("The last parameter to Concatenate should be a " - "ParamSpec variable or ellipsis.") - return self.__class__(self.__origin__, params) - - # 3.9; accessed during GenericAlias.__getitem__ when substituting - def __getitem__(self, args): - if self.__origin__ in (Generic, Protocol): - # Can't subscript Generic[...] or Protocol[...]. - raise TypeError(f"Cannot subscript already-subscripted {self}") - if not self.__parameters__: - raise TypeError(f"{self} is not a generic class") - - if not isinstance(args, tuple): - args = (args,) - args = _unpack_args(*(_type_convert(p) for p in args)) - params = self.__parameters__ - for param in params: - prepare = getattr(param, "__typing_prepare_subst__", None) - if prepare is not None: - args = prepare(self, args) - # 3.9 & typing.ParamSpec - elif isinstance(param, ParamSpec): - i = params.index(param) - if ( - i == len(args) - and getattr(param, '__default__', NoDefault) is not NoDefault - ): - args = [*args, param.__default__] - if i >= len(args): - raise TypeError(f"Too few arguments for {self}") - # Special case for Z[[int, str, bool]] == Z[int, str, bool] - if len(params) == 1 and not _is_param_expr(args[0]): - assert i == 0 - args = (args,) - elif ( - isinstance(args[i], list) - # 3.9 - # This class inherits from list do not convert - and not isinstance(args[i], _ConcatenateGenericAlias) - ): - args = (*args[:i], tuple(args[i]), *args[i + 1:]) - - alen = len(args) - plen = len(params) - if alen != plen: - raise TypeError( - f"Too {'many' if alen > plen else 'few'} arguments for {self};" - f" actual {alen}, expected {plen}" - ) - - subst = dict(zip(self.__parameters__, args)) - # determine new args - new_args = [] - for arg in self.__args__: - if isinstance(arg, type): - new_args.append(arg) - continue - if isinstance(arg, TypeVar): - arg = subst[arg] - if ( - (isinstance(arg, typing._GenericAlias) and _is_unpack(arg)) - or ( - hasattr(_types, "GenericAlias") - and isinstance(arg, _types.GenericAlias) - and getattr(arg, "__unpacked__", False) - ) - ): - raise TypeError(f"{arg} is not valid as type argument") - - elif isinstance(arg, - typing._GenericAlias - if not hasattr(_types, "GenericAlias") else - (typing._GenericAlias, _types.GenericAlias) - ): - subparams = arg.__parameters__ - if subparams: - subargs = tuple(subst[x] for x in subparams) - arg = arg[subargs] - new_args.append(arg) - return self.copy_with(tuple(new_args)) - -# 3.10+ -else: - _ConcatenateGenericAlias = typing._ConcatenateGenericAlias - - # 3.10 - if sys.version_info < (3, 11): - - class _ConcatenateGenericAlias(typing._ConcatenateGenericAlias, _root=True): - # needed for checks in collections.abc.Callable to accept this class - __module__ = "typing" - - def copy_with(self, params): - if isinstance(params[-1], (list, tuple)): - return (*params[:-1], *params[-1]) - if isinstance(params[-1], typing._ConcatenateGenericAlias): - params = (*params[:-1], *params[-1].__args__) - elif not (params[-1] is ... or isinstance(params[-1], ParamSpec)): - raise TypeError("The last parameter to Concatenate should be a " - "ParamSpec variable or ellipsis.") - return super(typing._ConcatenateGenericAlias, self).copy_with(params) - - def __getitem__(self, args): - value = super().__getitem__(args) - if isinstance(value, tuple) and any(_is_unpack(t) for t in value): - return tuple(_unpack_args(*(n for n in value))) - return value - - -# 3.9.2 -class _EllipsisDummy: ... - - -# <=3.10 -def _create_concatenate_alias(origin, parameters): - if parameters[-1] is ... and sys.version_info < (3, 9, 2): - # Hack: Arguments must be types, replace it with one. - parameters = (*parameters[:-1], _EllipsisDummy) - if sys.version_info >= (3, 10, 3): - concatenate = _ConcatenateGenericAlias(origin, parameters, - _typevar_types=(TypeVar, ParamSpec), - _paramspec_tvars=True) - else: - concatenate = _ConcatenateGenericAlias(origin, parameters) - if parameters[-1] is not _EllipsisDummy: - return concatenate - # Remove dummy again - concatenate.__args__ = tuple(p if p is not _EllipsisDummy else ... - for p in concatenate.__args__) - if sys.version_info < (3, 10): - # backport needs __args__ adjustment only - return concatenate - concatenate.__parameters__ = tuple(p for p in concatenate.__parameters__ - if p is not _EllipsisDummy) - return concatenate - - -# <=3.10 -@typing._tp_cache -def _concatenate_getitem(self, parameters): - if parameters == (): - raise TypeError("Cannot take a Concatenate of no types.") - if not isinstance(parameters, tuple): - parameters = (parameters,) - if not (parameters[-1] is ... or isinstance(parameters[-1], ParamSpec)): - raise TypeError("The last parameter to Concatenate should be a " - "ParamSpec variable or ellipsis.") - msg = "Concatenate[arg, ...]: each arg must be a type." - parameters = (*(typing._type_check(p, msg) for p in parameters[:-1]), - parameters[-1]) - return _create_concatenate_alias(self, parameters) - - -# 3.11+; Concatenate does not accept ellipsis in 3.10 -if sys.version_info >= (3, 11): - Concatenate = typing.Concatenate -# <=3.10 -else: - @_ExtensionsSpecialForm - def Concatenate(self, parameters): - """Used in conjunction with ``ParamSpec`` and ``Callable`` to represent a - higher order function which adds, removes or transforms parameters of a - callable. - - For example:: - - Callable[Concatenate[int, P], int] - - See PEP 612 for detailed information. - """ - return _concatenate_getitem(self, parameters) - - -# 3.10+ -if hasattr(typing, 'TypeGuard'): - TypeGuard = typing.TypeGuard -# 3.9 -else: - @_ExtensionsSpecialForm - def TypeGuard(self, parameters): - """Special typing form used to annotate the return type of a user-defined - type guard function. ``TypeGuard`` only accepts a single type argument. - At runtime, functions marked this way should return a boolean. - - ``TypeGuard`` aims to benefit *type narrowing* -- a technique used by static - type checkers to determine a more precise type of an expression within a - program's code flow. Usually type narrowing is done by analyzing - conditional code flow and applying the narrowing to a block of code. The - conditional expression here is sometimes referred to as a "type guard". - - Sometimes it would be convenient to use a user-defined boolean function - as a type guard. Such a function should use ``TypeGuard[...]`` as its - return type to alert static type checkers to this intention. - - Using ``-> TypeGuard`` tells the static type checker that for a given - function: - - 1. The return value is a boolean. - 2. If the return value is ``True``, the type of its argument - is the type inside ``TypeGuard``. - - For example:: - - def is_str(val: Union[str, float]): - # "isinstance" type guard - if isinstance(val, str): - # Type of ``val`` is narrowed to ``str`` - ... - else: - # Else, type of ``val`` is narrowed to ``float``. - ... - - Strict type narrowing is not enforced -- ``TypeB`` need not be a narrower - form of ``TypeA`` (it can even be a wider form) and this may lead to - type-unsafe results. The main reason is to allow for things like - narrowing ``List[object]`` to ``List[str]`` even though the latter is not - a subtype of the former, since ``List`` is invariant. The responsibility of - writing type-safe type guards is left to the user. - - ``TypeGuard`` also works with type variables. For more information, see - PEP 647 (User-Defined Type Guards). - """ - item = typing._type_check(parameters, f'{self} accepts only a single type.') - return typing._GenericAlias(self, (item,)) - - -# 3.13+ -if hasattr(typing, 'TypeIs'): - TypeIs = typing.TypeIs -# <=3.12 -else: - @_ExtensionsSpecialForm - def TypeIs(self, parameters): - """Special typing form used to annotate the return type of a user-defined - type narrower function. ``TypeIs`` only accepts a single type argument. - At runtime, functions marked this way should return a boolean. - - ``TypeIs`` aims to benefit *type narrowing* -- a technique used by static - type checkers to determine a more precise type of an expression within a - program's code flow. Usually type narrowing is done by analyzing - conditional code flow and applying the narrowing to a block of code. The - conditional expression here is sometimes referred to as a "type guard". - - Sometimes it would be convenient to use a user-defined boolean function - as a type guard. Such a function should use ``TypeIs[...]`` as its - return type to alert static type checkers to this intention. - - Using ``-> TypeIs`` tells the static type checker that for a given - function: - - 1. The return value is a boolean. - 2. If the return value is ``True``, the type of its argument - is the intersection of the type inside ``TypeIs`` and the argument's - previously known type. - - For example:: - - def is_awaitable(val: object) -> TypeIs[Awaitable[Any]]: - return hasattr(val, '__await__') - - def f(val: Union[int, Awaitable[int]]) -> int: - if is_awaitable(val): - assert_type(val, Awaitable[int]) - else: - assert_type(val, int) - - ``TypeIs`` also works with type variables. For more information, see - PEP 742 (Narrowing types with TypeIs). - """ - item = typing._type_check(parameters, f'{self} accepts only a single type.') - return typing._GenericAlias(self, (item,)) - - -# 3.14+? -if hasattr(typing, 'TypeForm'): - TypeForm = typing.TypeForm -# <=3.13 -else: - class _TypeFormForm(_ExtensionsSpecialForm, _root=True): - # TypeForm(X) is equivalent to X but indicates to the type checker - # that the object is a TypeForm. - def __call__(self, obj, /): - return obj - - @_TypeFormForm - def TypeForm(self, parameters): - """A special form representing the value that results from the evaluation - of a type expression. This value encodes the information supplied in the - type expression, and it represents the type described by that type expression. - - When used in a type expression, TypeForm describes a set of type form objects. - It accepts a single type argument, which must be a valid type expression. - ``TypeForm[T]`` describes the set of all type form objects that represent - the type T or types that are assignable to T. - - Usage: - - def cast[T](typ: TypeForm[T], value: Any) -> T: ... - - reveal_type(cast(int, "x")) # int - - See PEP 747 for more information. - """ - item = typing._type_check(parameters, f'{self} accepts only a single type.') - return typing._GenericAlias(self, (item,)) - - - - -if hasattr(typing, "LiteralString"): # 3.11+ - LiteralString = typing.LiteralString -else: - @_SpecialForm - def LiteralString(self, params): - """Represents an arbitrary literal string. - - Example:: - - from typing_extensions import LiteralString - - def query(sql: LiteralString) -> ...: - ... - - query("SELECT * FROM table") # ok - query(f"SELECT * FROM {input()}") # not ok - - See PEP 675 for details. - - """ - raise TypeError(f"{self} is not subscriptable") - - -if hasattr(typing, "Self"): # 3.11+ - Self = typing.Self -else: - @_SpecialForm - def Self(self, params): - """Used to spell the type of "self" in classes. - - Example:: - - from typing import Self - - class ReturnsSelf: - def parse(self, data: bytes) -> Self: - ... - return self - - """ - - raise TypeError(f"{self} is not subscriptable") - - -if hasattr(typing, "Never"): # 3.11+ - Never = typing.Never -else: - @_SpecialForm - def Never(self, params): - """The bottom type, a type that has no members. - - This can be used to define a function that should never be - called, or a function that never returns:: - - from typing_extensions import Never - - def never_call_me(arg: Never) -> None: - pass - - def int_or_str(arg: int | str) -> None: - never_call_me(arg) # type checker error - match arg: - case int(): - print("It's an int") - case str(): - print("It's a str") - case _: - never_call_me(arg) # ok, arg is of type Never - - """ - - raise TypeError(f"{self} is not subscriptable") - - -if hasattr(typing, 'Required'): # 3.11+ - Required = typing.Required - NotRequired = typing.NotRequired -else: # <=3.10 - @_ExtensionsSpecialForm - def Required(self, parameters): - """A special typing construct to mark a key of a total=False TypedDict - as required. For example: - - class Movie(TypedDict, total=False): - title: Required[str] - year: int - - m = Movie( - title='The Matrix', # typechecker error if key is omitted - year=1999, - ) - - There is no runtime checking that a required key is actually provided - when instantiating a related TypedDict. - """ - item = typing._type_check(parameters, f'{self._name} accepts only a single type.') - return typing._GenericAlias(self, (item,)) - - @_ExtensionsSpecialForm - def NotRequired(self, parameters): - """A special typing construct to mark a key of a TypedDict as - potentially missing. For example: - - class Movie(TypedDict): - title: str - year: NotRequired[int] - - m = Movie( - title='The Matrix', # typechecker error if key is omitted - year=1999, - ) - """ - item = typing._type_check(parameters, f'{self._name} accepts only a single type.') - return typing._GenericAlias(self, (item,)) - - -if hasattr(typing, 'ReadOnly'): - ReadOnly = typing.ReadOnly -else: # <=3.12 - @_ExtensionsSpecialForm - def ReadOnly(self, parameters): - """A special typing construct to mark an item of a TypedDict as read-only. - - For example: - - class Movie(TypedDict): - title: ReadOnly[str] - year: int - - def mutate_movie(m: Movie) -> None: - m["year"] = 1992 # allowed - m["title"] = "The Matrix" # typechecker error - - There is no runtime checking for this property. - """ - item = typing._type_check(parameters, f'{self._name} accepts only a single type.') - return typing._GenericAlias(self, (item,)) - - -_UNPACK_DOC = """\ -Type unpack operator. - -The type unpack operator takes the child types from some container type, -such as `tuple[int, str]` or a `TypeVarTuple`, and 'pulls them out'. For -example: - - # For some generic class `Foo`: - Foo[Unpack[tuple[int, str]]] # Equivalent to Foo[int, str] - - Ts = TypeVarTuple('Ts') - # Specifies that `Bar` is generic in an arbitrary number of types. - # (Think of `Ts` as a tuple of an arbitrary number of individual - # `TypeVar`s, which the `Unpack` is 'pulling out' directly into the - # `Generic[]`.) - class Bar(Generic[Unpack[Ts]]): ... - Bar[int] # Valid - Bar[int, str] # Also valid - -From Python 3.11, this can also be done using the `*` operator: - - Foo[*tuple[int, str]] - class Bar(Generic[*Ts]): ... - -The operator can also be used along with a `TypedDict` to annotate -`**kwargs` in a function signature. For instance: - - class Movie(TypedDict): - name: str - year: int - - # This function expects two keyword arguments - *name* of type `str` and - # *year* of type `int`. - def foo(**kwargs: Unpack[Movie]): ... - -Note that there is only some runtime checking of this operator. Not -everything the runtime allows may be accepted by static type checkers. - -For more information, see PEP 646 and PEP 692. -""" - - -if sys.version_info >= (3, 12): # PEP 692 changed the repr of Unpack[] - Unpack = typing.Unpack - - def _is_unpack(obj): - return get_origin(obj) is Unpack - -else: # <=3.11 - class _UnpackSpecialForm(_ExtensionsSpecialForm, _root=True): - def __init__(self, getitem): - super().__init__(getitem) - self.__doc__ = _UNPACK_DOC - - class _UnpackAlias(typing._GenericAlias, _root=True): - if sys.version_info < (3, 11): - # needed for compatibility with Generic[Unpack[Ts]] - __class__ = typing.TypeVar - - @property - def __typing_unpacked_tuple_args__(self): - assert self.__origin__ is Unpack - assert len(self.__args__) == 1 - arg, = self.__args__ - if isinstance(arg, (typing._GenericAlias, _types.GenericAlias)): - if arg.__origin__ is not tuple: - raise TypeError("Unpack[...] must be used with a tuple type") - return arg.__args__ - return None - - @property - def __typing_is_unpacked_typevartuple__(self): - assert self.__origin__ is Unpack - assert len(self.__args__) == 1 - return isinstance(self.__args__[0], TypeVarTuple) - - def __getitem__(self, args): - if self.__typing_is_unpacked_typevartuple__: - return args - return super().__getitem__(args) - - @_UnpackSpecialForm - def Unpack(self, parameters): - item = typing._type_check(parameters, f'{self._name} accepts only a single type.') - return _UnpackAlias(self, (item,)) - - def _is_unpack(obj): - return isinstance(obj, _UnpackAlias) - - -def _unpack_args(*args): - newargs = [] - for arg in args: - subargs = getattr(arg, '__typing_unpacked_tuple_args__', None) - if subargs is not None and (not (subargs and subargs[-1] is ...)): - newargs.extend(subargs) - else: - newargs.append(arg) - return newargs - - -if _PEP_696_IMPLEMENTED: - from typing import TypeVarTuple - -elif hasattr(typing, "TypeVarTuple"): # 3.11+ - - # Add default parameter - PEP 696 - class TypeVarTuple(metaclass=_TypeVarLikeMeta): - """Type variable tuple.""" - - _backported_typevarlike = typing.TypeVarTuple - - def __new__(cls, name, *, default=NoDefault): - tvt = typing.TypeVarTuple(name) - _set_default(tvt, default) - _set_module(tvt) - - def _typevartuple_prepare_subst(alias, args): - params = alias.__parameters__ - typevartuple_index = params.index(tvt) - for param in params[typevartuple_index + 1:]: - if isinstance(param, TypeVarTuple): - raise TypeError( - f"More than one TypeVarTuple parameter in {alias}" - ) - - alen = len(args) - plen = len(params) - left = typevartuple_index - right = plen - typevartuple_index - 1 - var_tuple_index = None - fillarg = None - for k, arg in enumerate(args): - if not isinstance(arg, type): - subargs = getattr(arg, '__typing_unpacked_tuple_args__', None) - if subargs and len(subargs) == 2 and subargs[-1] is ...: - if var_tuple_index is not None: - raise TypeError( - "More than one unpacked " - "arbitrary-length tuple argument" - ) - var_tuple_index = k - fillarg = subargs[0] - if var_tuple_index is not None: - left = min(left, var_tuple_index) - right = min(right, alen - var_tuple_index - 1) - elif left + right > alen: - raise TypeError(f"Too few arguments for {alias};" - f" actual {alen}, expected at least {plen - 1}") - if left == alen - right and tvt.has_default(): - replacement = _unpack_args(tvt.__default__) - else: - replacement = args[left: alen - right] - - return ( - *args[:left], - *([fillarg] * (typevartuple_index - left)), - replacement, - *([fillarg] * (plen - right - left - typevartuple_index - 1)), - *args[alen - right:], - ) - - tvt.__typing_prepare_subst__ = _typevartuple_prepare_subst - return tvt - - def __init_subclass__(self, *args, **kwds): - raise TypeError("Cannot subclass special typing classes") - -else: # <=3.10 - class TypeVarTuple(_DefaultMixin): - """Type variable tuple. - - Usage:: - - Ts = TypeVarTuple('Ts') - - In the same way that a normal type variable is a stand-in for a single - type such as ``int``, a type variable *tuple* is a stand-in for a *tuple* - type such as ``Tuple[int, str]``. - - Type variable tuples can be used in ``Generic`` declarations. - Consider the following example:: - - class Array(Generic[*Ts]): ... - - The ``Ts`` type variable tuple here behaves like ``tuple[T1, T2]``, - where ``T1`` and ``T2`` are type variables. To use these type variables - as type parameters of ``Array``, we must *unpack* the type variable tuple using - the star operator: ``*Ts``. The signature of ``Array`` then behaves - as if we had simply written ``class Array(Generic[T1, T2]): ...``. - In contrast to ``Generic[T1, T2]``, however, ``Generic[*Shape]`` allows - us to parameterise the class with an *arbitrary* number of type parameters. - - Type variable tuples can be used anywhere a normal ``TypeVar`` can. - This includes class definitions, as shown above, as well as function - signatures and variable annotations:: - - class Array(Generic[*Ts]): - - def __init__(self, shape: Tuple[*Ts]): - self._shape: Tuple[*Ts] = shape - - def get_shape(self) -> Tuple[*Ts]: - return self._shape - - shape = (Height(480), Width(640)) - x: Array[Height, Width] = Array(shape) - y = abs(x) # Inferred type is Array[Height, Width] - z = x + x # ... is Array[Height, Width] - x.get_shape() # ... is tuple[Height, Width] - - """ - - # Trick Generic __parameters__. - __class__ = typing.TypeVar - - def __iter__(self): - yield self.__unpacked__ - - def __init__(self, name, *, default=NoDefault): - self.__name__ = name - _DefaultMixin.__init__(self, default) - - # for pickling: - def_mod = _caller() - if def_mod != 'typing_extensions': - self.__module__ = def_mod - - self.__unpacked__ = Unpack[self] - - def __repr__(self): - return self.__name__ - - def __hash__(self): - return object.__hash__(self) - - def __eq__(self, other): - return self is other - - def __reduce__(self): - return self.__name__ - - def __init_subclass__(self, *args, **kwds): - if '_root' not in kwds: - raise TypeError("Cannot subclass special typing classes") - - -if hasattr(typing, "reveal_type"): # 3.11+ - reveal_type = typing.reveal_type -else: # <=3.10 - def reveal_type(obj: T, /) -> T: - """Reveal the inferred type of a variable. - - When a static type checker encounters a call to ``reveal_type()``, - it will emit the inferred type of the argument:: - - x: int = 1 - reveal_type(x) - - Running a static type checker (e.g., ``mypy``) on this example - will produce output similar to 'Revealed type is "builtins.int"'. - - At runtime, the function prints the runtime type of the - argument and returns it unchanged. - - """ - print(f"Runtime type is {type(obj).__name__!r}", file=sys.stderr) - return obj - - -if hasattr(typing, "_ASSERT_NEVER_REPR_MAX_LENGTH"): # 3.11+ - _ASSERT_NEVER_REPR_MAX_LENGTH = typing._ASSERT_NEVER_REPR_MAX_LENGTH -else: # <=3.10 - _ASSERT_NEVER_REPR_MAX_LENGTH = 100 - - -if hasattr(typing, "assert_never"): # 3.11+ - assert_never = typing.assert_never -else: # <=3.10 - def assert_never(arg: Never, /) -> Never: - """Assert to the type checker that a line of code is unreachable. - - Example:: - - def int_or_str(arg: int | str) -> None: - match arg: - case int(): - print("It's an int") - case str(): - print("It's a str") - case _: - assert_never(arg) - - If a type checker finds that a call to assert_never() is - reachable, it will emit an error. - - At runtime, this throws an exception when called. - - """ - value = repr(arg) - if len(value) > _ASSERT_NEVER_REPR_MAX_LENGTH: - value = value[:_ASSERT_NEVER_REPR_MAX_LENGTH] + '...' - raise AssertionError(f"Expected code to be unreachable, but got: {value}") - - -if sys.version_info >= (3, 12): # 3.12+ - # dataclass_transform exists in 3.11 but lacks the frozen_default parameter - dataclass_transform = typing.dataclass_transform -else: # <=3.11 - def dataclass_transform( - *, - eq_default: bool = True, - order_default: bool = False, - kw_only_default: bool = False, - frozen_default: bool = False, - field_specifiers: typing.Tuple[ - typing.Union[typing.Type[typing.Any], typing.Callable[..., typing.Any]], - ... - ] = (), - **kwargs: typing.Any, - ) -> typing.Callable[[T], T]: - """Decorator that marks a function, class, or metaclass as providing - dataclass-like behavior. - - Example: - - from typing_extensions import dataclass_transform - - _T = TypeVar("_T") - - # Used on a decorator function - @dataclass_transform() - def create_model(cls: type[_T]) -> type[_T]: - ... - return cls - - @create_model - class CustomerModel: - id: int - name: str - - # Used on a base class - @dataclass_transform() - class ModelBase: ... - - class CustomerModel(ModelBase): - id: int - name: str - - # Used on a metaclass - @dataclass_transform() - class ModelMeta(type): ... - - class ModelBase(metaclass=ModelMeta): ... - - class CustomerModel(ModelBase): - id: int - name: str - - Each of the ``CustomerModel`` classes defined in this example will now - behave similarly to a dataclass created with the ``@dataclasses.dataclass`` - decorator. For example, the type checker will synthesize an ``__init__`` - method. - - The arguments to this decorator can be used to customize this behavior: - - ``eq_default`` indicates whether the ``eq`` parameter is assumed to be - True or False if it is omitted by the caller. - - ``order_default`` indicates whether the ``order`` parameter is - assumed to be True or False if it is omitted by the caller. - - ``kw_only_default`` indicates whether the ``kw_only`` parameter is - assumed to be True or False if it is omitted by the caller. - - ``frozen_default`` indicates whether the ``frozen`` parameter is - assumed to be True or False if it is omitted by the caller. - - ``field_specifiers`` specifies a static list of supported classes - or functions that describe fields, similar to ``dataclasses.field()``. - - At runtime, this decorator records its arguments in the - ``__dataclass_transform__`` attribute on the decorated object. - - See PEP 681 for details. - - """ - def decorator(cls_or_fn): - cls_or_fn.__dataclass_transform__ = { - "eq_default": eq_default, - "order_default": order_default, - "kw_only_default": kw_only_default, - "frozen_default": frozen_default, - "field_specifiers": field_specifiers, - "kwargs": kwargs, - } - return cls_or_fn - return decorator - - -if hasattr(typing, "override"): # 3.12+ - override = typing.override -else: # <=3.11 - _F = typing.TypeVar("_F", bound=typing.Callable[..., typing.Any]) - - def override(arg: _F, /) -> _F: - """Indicate that a method is intended to override a method in a base class. - - Usage: - - class Base: - def method(self) -> None: - pass - - class Child(Base): - @override - def method(self) -> None: - super().method() - - When this decorator is applied to a method, the type checker will - validate that it overrides a method with the same name on a base class. - This helps prevent bugs that may occur when a base class is changed - without an equivalent change to a child class. - - There is no runtime checking of these properties. The decorator - sets the ``__override__`` attribute to ``True`` on the decorated object - to allow runtime introspection. - - See PEP 698 for details. - - """ - try: - arg.__override__ = True - except (AttributeError, TypeError): - # Skip the attribute silently if it is not writable. - # AttributeError happens if the object has __slots__ or a - # read-only property, TypeError if it's a builtin class. - pass - return arg - - -# Python 3.13.3+ contains a fix for the wrapped __new__ -if sys.version_info >= (3, 13, 3): - deprecated = warnings.deprecated -else: - _T = typing.TypeVar("_T") - - class deprecated: - """Indicate that a class, function or overload is deprecated. - - When this decorator is applied to an object, the type checker - will generate a diagnostic on usage of the deprecated object. - - Usage: - - @deprecated("Use B instead") - class A: - pass - - @deprecated("Use g instead") - def f(): - pass - - @overload - @deprecated("int support is deprecated") - def g(x: int) -> int: ... - @overload - def g(x: str) -> int: ... - - The warning specified by *category* will be emitted at runtime - on use of deprecated objects. For functions, that happens on calls; - for classes, on instantiation and on creation of subclasses. - If the *category* is ``None``, no warning is emitted at runtime. - The *stacklevel* determines where the - warning is emitted. If it is ``1`` (the default), the warning - is emitted at the direct caller of the deprecated object; if it - is higher, it is emitted further up the stack. - Static type checker behavior is not affected by the *category* - and *stacklevel* arguments. - - The deprecation message passed to the decorator is saved in the - ``__deprecated__`` attribute on the decorated object. - If applied to an overload, the decorator - must be after the ``@overload`` decorator for the attribute to - exist on the overload as returned by ``get_overloads()``. - - See PEP 702 for details. - - """ - def __init__( - self, - message: str, - /, - *, - category: typing.Optional[typing.Type[Warning]] = DeprecationWarning, - stacklevel: int = 1, - ) -> None: - if not isinstance(message, str): - raise TypeError( - "Expected an object of type str for 'message', not " - f"{type(message).__name__!r}" - ) - self.message = message - self.category = category - self.stacklevel = stacklevel - - def __call__(self, arg: _T, /) -> _T: - # Make sure the inner functions created below don't - # retain a reference to self. - msg = self.message - category = self.category - stacklevel = self.stacklevel - if category is None: - arg.__deprecated__ = msg - return arg - elif isinstance(arg, type): - import functools - from types import MethodType - - original_new = arg.__new__ - - @functools.wraps(original_new) - def __new__(cls, /, *args, **kwargs): - if cls is arg: - warnings.warn(msg, category=category, stacklevel=stacklevel + 1) - if original_new is not object.__new__: - return original_new(cls, *args, **kwargs) - # Mirrors a similar check in object.__new__. - elif cls.__init__ is object.__init__ and (args or kwargs): - raise TypeError(f"{cls.__name__}() takes no arguments") - else: - return original_new(cls) - - arg.__new__ = staticmethod(__new__) - - original_init_subclass = arg.__init_subclass__ - # We need slightly different behavior if __init_subclass__ - # is a bound method (likely if it was implemented in Python) - if isinstance(original_init_subclass, MethodType): - original_init_subclass = original_init_subclass.__func__ - - @functools.wraps(original_init_subclass) - def __init_subclass__(*args, **kwargs): - warnings.warn(msg, category=category, stacklevel=stacklevel + 1) - return original_init_subclass(*args, **kwargs) - - arg.__init_subclass__ = classmethod(__init_subclass__) - # Or otherwise, which likely means it's a builtin such as - # object's implementation of __init_subclass__. - else: - @functools.wraps(original_init_subclass) - def __init_subclass__(*args, **kwargs): - warnings.warn(msg, category=category, stacklevel=stacklevel + 1) - return original_init_subclass(*args, **kwargs) - - arg.__init_subclass__ = __init_subclass__ - - arg.__deprecated__ = __new__.__deprecated__ = msg - __init_subclass__.__deprecated__ = msg - return arg - elif callable(arg): - import asyncio.coroutines - import functools - import inspect - - @functools.wraps(arg) - def wrapper(*args, **kwargs): - warnings.warn(msg, category=category, stacklevel=stacklevel + 1) - return arg(*args, **kwargs) - - if asyncio.coroutines.iscoroutinefunction(arg): - if sys.version_info >= (3, 12): - wrapper = inspect.markcoroutinefunction(wrapper) - else: - wrapper._is_coroutine = asyncio.coroutines._is_coroutine - - arg.__deprecated__ = wrapper.__deprecated__ = msg - return wrapper - else: - raise TypeError( - "@deprecated decorator with non-None category must be applied to " - f"a class or callable, not {arg!r}" - ) - -if sys.version_info < (3, 10): - def _is_param_expr(arg): - return arg is ... or isinstance( - arg, (tuple, list, ParamSpec, _ConcatenateGenericAlias) - ) -else: - def _is_param_expr(arg): - return arg is ... or isinstance( - arg, - ( - tuple, - list, - ParamSpec, - _ConcatenateGenericAlias, - typing._ConcatenateGenericAlias, - ), - ) - - -# We have to do some monkey patching to deal with the dual nature of -# Unpack/TypeVarTuple: -# - We want Unpack to be a kind of TypeVar so it gets accepted in -# Generic[Unpack[Ts]] -# - We want it to *not* be treated as a TypeVar for the purposes of -# counting generic parameters, so that when we subscript a generic, -# the runtime doesn't try to substitute the Unpack with the subscripted type. -if not hasattr(typing, "TypeVarTuple"): - def _check_generic(cls, parameters, elen=_marker): - """Check correct count for parameters of a generic cls (internal helper). - - This gives a nice error message in case of count mismatch. - """ - # If substituting a single ParamSpec with multiple arguments - # we do not check the count - if (inspect.isclass(cls) and issubclass(cls, typing.Generic) - and len(cls.__parameters__) == 1 - and isinstance(cls.__parameters__[0], ParamSpec) - and parameters - and not _is_param_expr(parameters[0]) - ): - # Generic modifies parameters variable, but here we cannot do this - return - - if not elen: - raise TypeError(f"{cls} is not a generic class") - if elen is _marker: - if not hasattr(cls, "__parameters__") or not cls.__parameters__: - raise TypeError(f"{cls} is not a generic class") - elen = len(cls.__parameters__) - alen = len(parameters) - if alen != elen: - expect_val = elen - if hasattr(cls, "__parameters__"): - parameters = [p for p in cls.__parameters__ if not _is_unpack(p)] - num_tv_tuples = sum(isinstance(p, TypeVarTuple) for p in parameters) - if (num_tv_tuples > 0) and (alen >= elen - num_tv_tuples): - return - - # deal with TypeVarLike defaults - # required TypeVarLikes cannot appear after a defaulted one. - if alen < elen: - # since we validate TypeVarLike default in _collect_type_vars - # or _collect_parameters we can safely check parameters[alen] - if ( - getattr(parameters[alen], '__default__', NoDefault) - is not NoDefault - ): - return - - num_default_tv = sum(getattr(p, '__default__', NoDefault) - is not NoDefault for p in parameters) - - elen -= num_default_tv - - expect_val = f"at least {elen}" - - things = "arguments" if sys.version_info >= (3, 10) else "parameters" - raise TypeError(f"Too {'many' if alen > elen else 'few'} {things}" - f" for {cls}; actual {alen}, expected {expect_val}") -else: - # Python 3.11+ - - def _check_generic(cls, parameters, elen): - """Check correct count for parameters of a generic cls (internal helper). - - This gives a nice error message in case of count mismatch. - """ - if not elen: - raise TypeError(f"{cls} is not a generic class") - alen = len(parameters) - if alen != elen: - expect_val = elen - if hasattr(cls, "__parameters__"): - parameters = [p for p in cls.__parameters__ if not _is_unpack(p)] - - # deal with TypeVarLike defaults - # required TypeVarLikes cannot appear after a defaulted one. - if alen < elen: - # since we validate TypeVarLike default in _collect_type_vars - # or _collect_parameters we can safely check parameters[alen] - if ( - getattr(parameters[alen], '__default__', NoDefault) - is not NoDefault - ): - return - - num_default_tv = sum(getattr(p, '__default__', NoDefault) - is not NoDefault for p in parameters) - - elen -= num_default_tv - - expect_val = f"at least {elen}" - - raise TypeError(f"Too {'many' if alen > elen else 'few'} arguments" - f" for {cls}; actual {alen}, expected {expect_val}") - -if not _PEP_696_IMPLEMENTED: - typing._check_generic = _check_generic - - -def _has_generic_or_protocol_as_origin() -> bool: - try: - frame = sys._getframe(2) - # - Catch AttributeError: not all Python implementations have sys._getframe() - # - Catch ValueError: maybe we're called from an unexpected module - # and the call stack isn't deep enough - except (AttributeError, ValueError): - return False # err on the side of leniency - else: - # If we somehow get invoked from outside typing.py, - # also err on the side of leniency - if frame.f_globals.get("__name__") != "typing": - return False - origin = frame.f_locals.get("origin") - # Cannot use "in" because origin may be an object with a buggy __eq__ that - # throws an error. - return origin is typing.Generic or origin is Protocol or origin is typing.Protocol - - -_TYPEVARTUPLE_TYPES = {TypeVarTuple, getattr(typing, "TypeVarTuple", None)} - - -def _is_unpacked_typevartuple(x) -> bool: - if get_origin(x) is not Unpack: - return False - args = get_args(x) - return ( - bool(args) - and len(args) == 1 - and type(args[0]) in _TYPEVARTUPLE_TYPES - ) - - -# Python 3.11+ _collect_type_vars was renamed to _collect_parameters -if hasattr(typing, '_collect_type_vars'): - def _collect_type_vars(types, typevar_types=None): - """Collect all type variable contained in types in order of - first appearance (lexicographic order). For example:: - - _collect_type_vars((T, List[S, T])) == (T, S) - """ - if typevar_types is None: - typevar_types = typing.TypeVar - tvars = [] - - # A required TypeVarLike cannot appear after a TypeVarLike with a default - # if it was a direct call to `Generic[]` or `Protocol[]` - enforce_default_ordering = _has_generic_or_protocol_as_origin() - default_encountered = False - - # Also, a TypeVarLike with a default cannot appear after a TypeVarTuple - type_var_tuple_encountered = False - - for t in types: - if _is_unpacked_typevartuple(t): - type_var_tuple_encountered = True - elif ( - isinstance(t, typevar_types) and not isinstance(t, _UnpackAlias) - and t not in tvars - ): - if enforce_default_ordering: - has_default = getattr(t, '__default__', NoDefault) is not NoDefault - if has_default: - if type_var_tuple_encountered: - raise TypeError('Type parameter with a default' - ' follows TypeVarTuple') - default_encountered = True - elif default_encountered: - raise TypeError(f'Type parameter {t!r} without a default' - ' follows type parameter with a default') - - tvars.append(t) - if _should_collect_from_parameters(t): - tvars.extend([t for t in t.__parameters__ if t not in tvars]) - elif isinstance(t, tuple): - # Collect nested type_vars - # tuple wrapped by _prepare_paramspec_params(cls, params) - for x in t: - for collected in _collect_type_vars([x]): - if collected not in tvars: - tvars.append(collected) - return tuple(tvars) - - typing._collect_type_vars = _collect_type_vars -else: - def _collect_parameters(args): - """Collect all type variables and parameter specifications in args - in order of first appearance (lexicographic order). - - For example:: - - assert _collect_parameters((T, Callable[P, T])) == (T, P) - """ - parameters = [] - - # A required TypeVarLike cannot appear after a TypeVarLike with default - # if it was a direct call to `Generic[]` or `Protocol[]` - enforce_default_ordering = _has_generic_or_protocol_as_origin() - default_encountered = False - - # Also, a TypeVarLike with a default cannot appear after a TypeVarTuple - type_var_tuple_encountered = False - - for t in args: - if isinstance(t, type): - # We don't want __parameters__ descriptor of a bare Python class. - pass - elif isinstance(t, tuple): - # `t` might be a tuple, when `ParamSpec` is substituted with - # `[T, int]`, or `[int, *Ts]`, etc. - for x in t: - for collected in _collect_parameters([x]): - if collected not in parameters: - parameters.append(collected) - elif hasattr(t, '__typing_subst__'): - if t not in parameters: - if enforce_default_ordering: - has_default = ( - getattr(t, '__default__', NoDefault) is not NoDefault - ) - - if type_var_tuple_encountered and has_default: - raise TypeError('Type parameter with a default' - ' follows TypeVarTuple') - - if has_default: - default_encountered = True - elif default_encountered: - raise TypeError(f'Type parameter {t!r} without a default' - ' follows type parameter with a default') - - parameters.append(t) - else: - if _is_unpacked_typevartuple(t): - type_var_tuple_encountered = True - for x in getattr(t, '__parameters__', ()): - if x not in parameters: - parameters.append(x) - - return tuple(parameters) - - if not _PEP_696_IMPLEMENTED: - typing._collect_parameters = _collect_parameters - -# Backport typing.NamedTuple as it exists in Python 3.13. -# In 3.11, the ability to define generic `NamedTuple`s was supported. -# This was explicitly disallowed in 3.9-3.10, and only half-worked in <=3.8. -# On 3.12, we added __orig_bases__ to call-based NamedTuples -# On 3.13, we deprecated kwargs-based NamedTuples -if sys.version_info >= (3, 13): - NamedTuple = typing.NamedTuple -else: - def _make_nmtuple(name, types, module, defaults=()): - fields = [n for n, t in types] - annotations = {n: typing._type_check(t, f"field {n} annotation must be a type") - for n, t in types} - nm_tpl = collections.namedtuple(name, fields, - defaults=defaults, module=module) - nm_tpl.__annotations__ = nm_tpl.__new__.__annotations__ = annotations - return nm_tpl - - _prohibited_namedtuple_fields = typing._prohibited - _special_namedtuple_fields = frozenset({'__module__', '__name__', '__annotations__'}) - - class _NamedTupleMeta(type): - def __new__(cls, typename, bases, ns): - assert _NamedTuple in bases - for base in bases: - if base is not _NamedTuple and base is not typing.Generic: - raise TypeError( - 'can only inherit from a NamedTuple type and Generic') - bases = tuple(tuple if base is _NamedTuple else base for base in bases) - if "__annotations__" in ns: - types = ns["__annotations__"] - elif "__annotate__" in ns: - # TODO: Use inspect.VALUE here, and make the annotations lazily evaluated - types = ns["__annotate__"](1) - else: - types = {} - default_names = [] - for field_name in types: - if field_name in ns: - default_names.append(field_name) - elif default_names: - raise TypeError(f"Non-default namedtuple field {field_name} " - f"cannot follow default field" - f"{'s' if len(default_names) > 1 else ''} " - f"{', '.join(default_names)}") - nm_tpl = _make_nmtuple( - typename, types.items(), - defaults=[ns[n] for n in default_names], - module=ns['__module__'] - ) - nm_tpl.__bases__ = bases - if typing.Generic in bases: - if hasattr(typing, '_generic_class_getitem'): # 3.12+ - nm_tpl.__class_getitem__ = classmethod(typing._generic_class_getitem) - else: - class_getitem = typing.Generic.__class_getitem__.__func__ - nm_tpl.__class_getitem__ = classmethod(class_getitem) - # update from user namespace without overriding special namedtuple attributes - for key, val in ns.items(): - if key in _prohibited_namedtuple_fields: - raise AttributeError("Cannot overwrite NamedTuple attribute " + key) - elif key not in _special_namedtuple_fields: - if key not in nm_tpl._fields: - setattr(nm_tpl, key, ns[key]) - try: - set_name = type(val).__set_name__ - except AttributeError: - pass - else: - try: - set_name(val, nm_tpl, key) - except BaseException as e: - msg = ( - f"Error calling __set_name__ on {type(val).__name__!r} " - f"instance {key!r} in {typename!r}" - ) - # BaseException.add_note() existed on py311, - # but the __set_name__ machinery didn't start - # using add_note() until py312. - # Making sure exceptions are raised in the same way - # as in "normal" classes seems most important here. - if sys.version_info >= (3, 12): - e.add_note(msg) - raise - else: - raise RuntimeError(msg) from e - - if typing.Generic in bases: - nm_tpl.__init_subclass__() - return nm_tpl - - _NamedTuple = type.__new__(_NamedTupleMeta, 'NamedTuple', (), {}) - - def _namedtuple_mro_entries(bases): - assert NamedTuple in bases - return (_NamedTuple,) - - def NamedTuple(typename, fields=_marker, /, **kwargs): - """Typed version of namedtuple. - - Usage:: - - class Employee(NamedTuple): - name: str - id: int - - This is equivalent to:: - - Employee = collections.namedtuple('Employee', ['name', 'id']) - - The resulting class has an extra __annotations__ attribute, giving a - dict that maps field names to types. (The field names are also in - the _fields attribute, which is part of the namedtuple API.) - An alternative equivalent functional syntax is also accepted:: - - Employee = NamedTuple('Employee', [('name', str), ('id', int)]) - """ - if fields is _marker: - if kwargs: - deprecated_thing = "Creating NamedTuple classes using keyword arguments" - deprecation_msg = ( - "{name} is deprecated and will be disallowed in Python {remove}. " - "Use the class-based or functional syntax instead." - ) - else: - deprecated_thing = "Failing to pass a value for the 'fields' parameter" - example = f"`{typename} = NamedTuple({typename!r}, [])`" - deprecation_msg = ( - "{name} is deprecated and will be disallowed in Python {remove}. " - "To create a NamedTuple class with 0 fields " - "using the functional syntax, " - "pass an empty list, e.g. " - ) + example + "." - elif fields is None: - if kwargs: - raise TypeError( - "Cannot pass `None` as the 'fields' parameter " - "and also specify fields using keyword arguments" - ) - else: - deprecated_thing = "Passing `None` as the 'fields' parameter" - example = f"`{typename} = NamedTuple({typename!r}, [])`" - deprecation_msg = ( - "{name} is deprecated and will be disallowed in Python {remove}. " - "To create a NamedTuple class with 0 fields " - "using the functional syntax, " - "pass an empty list, e.g. " - ) + example + "." - elif kwargs: - raise TypeError("Either list of fields or keywords" - " can be provided to NamedTuple, not both") - if fields is _marker or fields is None: - warnings.warn( - deprecation_msg.format(name=deprecated_thing, remove="3.15"), - DeprecationWarning, - stacklevel=2, - ) - fields = kwargs.items() - nt = _make_nmtuple(typename, fields, module=_caller()) - nt.__orig_bases__ = (NamedTuple,) - return nt - - NamedTuple.__mro_entries__ = _namedtuple_mro_entries - - -if hasattr(collections.abc, "Buffer"): - Buffer = collections.abc.Buffer -else: - class Buffer(abc.ABC): # noqa: B024 - """Base class for classes that implement the buffer protocol. - - The buffer protocol allows Python objects to expose a low-level - memory buffer interface. Before Python 3.12, it is not possible - to implement the buffer protocol in pure Python code, or even - to check whether a class implements the buffer protocol. In - Python 3.12 and higher, the ``__buffer__`` method allows access - to the buffer protocol from Python code, and the - ``collections.abc.Buffer`` ABC allows checking whether a class - implements the buffer protocol. - - To indicate support for the buffer protocol in earlier versions, - inherit from this ABC, either in a stub file or at runtime, - or use ABC registration. This ABC provides no methods, because - there is no Python-accessible methods shared by pre-3.12 buffer - classes. It is useful primarily for static checks. - - """ - - # As a courtesy, register the most common stdlib buffer classes. - Buffer.register(memoryview) - Buffer.register(bytearray) - Buffer.register(bytes) - - -# Backport of types.get_original_bases, available on 3.12+ in CPython -if hasattr(_types, "get_original_bases"): - get_original_bases = _types.get_original_bases -else: - def get_original_bases(cls, /): - """Return the class's "original" bases prior to modification by `__mro_entries__`. - - Examples:: - - from typing import TypeVar, Generic - from typing_extensions import NamedTuple, TypedDict - - T = TypeVar("T") - class Foo(Generic[T]): ... - class Bar(Foo[int], float): ... - class Baz(list[str]): ... - Eggs = NamedTuple("Eggs", [("a", int), ("b", str)]) - Spam = TypedDict("Spam", {"a": int, "b": str}) - - assert get_original_bases(Bar) == (Foo[int], float) - assert get_original_bases(Baz) == (list[str],) - assert get_original_bases(Eggs) == (NamedTuple,) - assert get_original_bases(Spam) == (TypedDict,) - assert get_original_bases(int) == (object,) - """ - try: - return cls.__dict__.get("__orig_bases__", cls.__bases__) - except AttributeError: - raise TypeError( - f'Expected an instance of type, not {type(cls).__name__!r}' - ) from None - - -# NewType is a class on Python 3.10+, making it pickleable -# The error message for subclassing instances of NewType was improved on 3.11+ -if sys.version_info >= (3, 11): - NewType = typing.NewType -else: - class NewType: - """NewType creates simple unique types with almost zero - runtime overhead. NewType(name, tp) is considered a subtype of tp - by static type checkers. At runtime, NewType(name, tp) returns - a dummy callable that simply returns its argument. Usage:: - UserId = NewType('UserId', int) - def name_by_id(user_id: UserId) -> str: - ... - UserId('user') # Fails type check - name_by_id(42) # Fails type check - name_by_id(UserId(42)) # OK - num = UserId(5) + 1 # type: int - """ - - def __call__(self, obj, /): - return obj - - def __init__(self, name, tp): - self.__qualname__ = name - if '.' in name: - name = name.rpartition('.')[-1] - self.__name__ = name - self.__supertype__ = tp - def_mod = _caller() - if def_mod != 'typing_extensions': - self.__module__ = def_mod - - def __mro_entries__(self, bases): - # We defined __mro_entries__ to get a better error message - # if a user attempts to subclass a NewType instance. bpo-46170 - supercls_name = self.__name__ - - class Dummy: - def __init_subclass__(cls): - subcls_name = cls.__name__ - raise TypeError( - f"Cannot subclass an instance of NewType. " - f"Perhaps you were looking for: " - f"`{subcls_name} = NewType({subcls_name!r}, {supercls_name})`" - ) - - return (Dummy,) - - def __repr__(self): - return f'{self.__module__}.{self.__qualname__}' - - def __reduce__(self): - return self.__qualname__ - - if sys.version_info >= (3, 10): - # PEP 604 methods - # It doesn't make sense to have these methods on Python <3.10 - - def __or__(self, other): - return typing.Union[self, other] - - def __ror__(self, other): - return typing.Union[other, self] - - -if sys.version_info >= (3, 14): - TypeAliasType = typing.TypeAliasType -# <=3.13 -else: - if sys.version_info >= (3, 12): - # 3.12-3.13 - def _is_unionable(obj): - """Corresponds to is_unionable() in unionobject.c in CPython.""" - return obj is None or isinstance(obj, ( - type, - _types.GenericAlias, - _types.UnionType, - typing.TypeAliasType, - TypeAliasType, - )) - else: - # <=3.11 - def _is_unionable(obj): - """Corresponds to is_unionable() in unionobject.c in CPython.""" - return obj is None or isinstance(obj, ( - type, - _types.GenericAlias, - _types.UnionType, - TypeAliasType, - )) - - if sys.version_info < (3, 10): - # Copied and pasted from https://github.com/python/cpython/blob/986a4e1b6fcae7fe7a1d0a26aea446107dd58dd2/Objects/genericaliasobject.c#L568-L582, - # so that we emulate the behaviour of `types.GenericAlias` - # on the latest versions of CPython - _ATTRIBUTE_DELEGATION_EXCLUSIONS = frozenset({ - "__class__", - "__bases__", - "__origin__", - "__args__", - "__unpacked__", - "__parameters__", - "__typing_unpacked_tuple_args__", - "__mro_entries__", - "__reduce_ex__", - "__reduce__", - "__copy__", - "__deepcopy__", - }) - - class _TypeAliasGenericAlias(typing._GenericAlias, _root=True): - def __getattr__(self, attr): - if attr in _ATTRIBUTE_DELEGATION_EXCLUSIONS: - return object.__getattr__(self, attr) - return getattr(self.__origin__, attr) - - - class TypeAliasType: - """Create named, parameterized type aliases. - - This provides a backport of the new `type` statement in Python 3.12: - - type ListOrSet[T] = list[T] | set[T] - - is equivalent to: - - T = TypeVar("T") - ListOrSet = TypeAliasType("ListOrSet", list[T] | set[T], type_params=(T,)) - - The name ListOrSet can then be used as an alias for the type it refers to. - - The type_params argument should contain all the type parameters used - in the value of the type alias. If the alias is not generic, this - argument is omitted. - - Static type checkers should only support type aliases declared using - TypeAliasType that follow these rules: - - - The first argument (the name) must be a string literal. - - The TypeAliasType instance must be immediately assigned to a variable - of the same name. (For example, 'X = TypeAliasType("Y", int)' is invalid, - as is 'X, Y = TypeAliasType("X", int), TypeAliasType("Y", int)'). - - """ - - def __init__(self, name: str, value, *, type_params=()): - if not isinstance(name, str): - raise TypeError("TypeAliasType name must be a string") - if not isinstance(type_params, tuple): - raise TypeError("type_params must be a tuple") - self.__value__ = value - self.__type_params__ = type_params - - default_value_encountered = False - parameters = [] - for type_param in type_params: - if ( - not isinstance(type_param, (TypeVar, TypeVarTuple, ParamSpec)) - # <=3.11 - # Unpack Backport passes isinstance(type_param, TypeVar) - or _is_unpack(type_param) - ): - raise TypeError(f"Expected a type param, got {type_param!r}") - has_default = ( - getattr(type_param, '__default__', NoDefault) is not NoDefault - ) - if default_value_encountered and not has_default: - raise TypeError(f"non-default type parameter '{type_param!r}'" - " follows default type parameter") - if has_default: - default_value_encountered = True - if isinstance(type_param, TypeVarTuple): - parameters.extend(type_param) - else: - parameters.append(type_param) - self.__parameters__ = tuple(parameters) - def_mod = _caller() - if def_mod != 'typing_extensions': - self.__module__ = def_mod - # Setting this attribute closes the TypeAliasType from further modification - self.__name__ = name - - def __setattr__(self, name: str, value: object, /) -> None: - if hasattr(self, "__name__"): - self._raise_attribute_error(name) - super().__setattr__(name, value) - - def __delattr__(self, name: str, /) -> Never: - self._raise_attribute_error(name) - - def _raise_attribute_error(self, name: str) -> Never: - # Match the Python 3.12 error messages exactly - if name == "__name__": - raise AttributeError("readonly attribute") - elif name in {"__value__", "__type_params__", "__parameters__", "__module__"}: - raise AttributeError( - f"attribute '{name}' of 'typing.TypeAliasType' objects " - "is not writable" - ) - else: - raise AttributeError( - f"'typing.TypeAliasType' object has no attribute '{name}'" - ) - - def __repr__(self) -> str: - return self.__name__ - - if sys.version_info < (3, 11): - def _check_single_param(self, param, recursion=0): - # Allow [], [int], [int, str], [int, ...], [int, T] - if param is ...: - return ... - if param is None: - return None - # Note in <= 3.9 _ConcatenateGenericAlias inherits from list - if isinstance(param, list) and recursion == 0: - return [self._check_single_param(arg, recursion+1) - for arg in param] - return typing._type_check( - param, f'Subscripting {self.__name__} requires a type.' - ) - - def _check_parameters(self, parameters): - if sys.version_info < (3, 11): - return tuple( - self._check_single_param(item) - for item in parameters - ) - return tuple(typing._type_check( - item, f'Subscripting {self.__name__} requires a type.' - ) - for item in parameters - ) - - def __getitem__(self, parameters): - if not self.__type_params__: - raise TypeError("Only generic type aliases are subscriptable") - if not isinstance(parameters, tuple): - parameters = (parameters,) - # Using 3.9 here will create problems with Concatenate - if sys.version_info >= (3, 10): - return _types.GenericAlias(self, parameters) - type_vars = _collect_type_vars(parameters) - parameters = self._check_parameters(parameters) - alias = _TypeAliasGenericAlias(self, parameters) - # alias.__parameters__ is not complete if Concatenate is present - # as it is converted to a list from which no parameters are extracted. - if alias.__parameters__ != type_vars: - alias.__parameters__ = type_vars - return alias - - def __reduce__(self): - return self.__name__ - - def __init_subclass__(cls, *args, **kwargs): - raise TypeError( - "type 'typing_extensions.TypeAliasType' is not an acceptable base type" - ) - - # The presence of this method convinces typing._type_check - # that TypeAliasTypes are types. - def __call__(self): - raise TypeError("Type alias is not callable") - - if sys.version_info >= (3, 10): - def __or__(self, right): - # For forward compatibility with 3.12, reject Unions - # that are not accepted by the built-in Union. - if not _is_unionable(right): - return NotImplemented - return typing.Union[self, right] - - def __ror__(self, left): - if not _is_unionable(left): - return NotImplemented - return typing.Union[left, self] - - -if hasattr(typing, "is_protocol"): - is_protocol = typing.is_protocol - get_protocol_members = typing.get_protocol_members -else: - def is_protocol(tp: type, /) -> bool: - """Return True if the given type is a Protocol. - - Example:: - - >>> from typing_extensions import Protocol, is_protocol - >>> class P(Protocol): - ... def a(self) -> str: ... - ... b: int - >>> is_protocol(P) - True - >>> is_protocol(int) - False - """ - return ( - isinstance(tp, type) - and getattr(tp, '_is_protocol', False) - and tp is not Protocol - and tp is not typing.Protocol - ) - - def get_protocol_members(tp: type, /) -> typing.FrozenSet[str]: - """Return the set of members defined in a Protocol. - - Example:: - - >>> from typing_extensions import Protocol, get_protocol_members - >>> class P(Protocol): - ... def a(self) -> str: ... - ... b: int - >>> get_protocol_members(P) - frozenset({'a', 'b'}) - - Raise a TypeError for arguments that are not Protocols. - """ - if not is_protocol(tp): - raise TypeError(f'{tp!r} is not a Protocol') - if hasattr(tp, '__protocol_attrs__'): - return frozenset(tp.__protocol_attrs__) - return frozenset(_get_protocol_attrs(tp)) - - -if hasattr(typing, "Doc"): - Doc = typing.Doc -else: - 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:: - - >>> from typing_extensions import Annotated, Doc - >>> def hi(to: Annotated[str, Doc("Who to say hi to")]) -> None: ... - """ - 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 - - -_CapsuleType = getattr(_types, "CapsuleType", None) - -if _CapsuleType is None: - try: - import _socket - except ImportError: - pass - else: - _CAPI = getattr(_socket, "CAPI", None) - if _CAPI is not None: - _CapsuleType = type(_CAPI) - -if _CapsuleType is not None: - CapsuleType = _CapsuleType - __all__.append("CapsuleType") - - -if sys.version_info >= (3,14): - from annotationlib import Format, get_annotations -else: - class Format(enum.IntEnum): - VALUE = 1 - VALUE_WITH_FAKE_GLOBALS = 2 - FORWARDREF = 3 - STRING = 4 - - def get_annotations(obj, *, globals=None, locals=None, eval_str=False, - format=Format.VALUE): - """Compute the annotations dict for an object. - - obj may be a callable, class, or module. - Passing in an object of any other type raises TypeError. - - Returns a dict. get_annotations() returns a new dict every time - it's called; calling it twice on the same object will return two - different but equivalent dicts. - - This is a backport of `inspect.get_annotations`, which has been - in the standard library since Python 3.10. See the standard library - documentation for more: - - https://docs.python.org/3/library/inspect.html#inspect.get_annotations - - This backport adds the *format* argument introduced by PEP 649. The - three formats supported are: - * VALUE: the annotations are returned as-is. This is the default and - it is compatible with the behavior on previous Python versions. - * FORWARDREF: return annotations as-is if possible, but replace any - undefined names with ForwardRef objects. The implementation proposed by - PEP 649 relies on language changes that cannot be backported; the - typing-extensions implementation simply returns the same result as VALUE. - * STRING: return annotations as strings, in a format close to the original - source. Again, this behavior cannot be replicated directly in a backport. - As an approximation, typing-extensions retrieves the annotations under - VALUE semantics and then stringifies them. - - The purpose of this backport is to allow users who would like to use - FORWARDREF or STRING semantics once PEP 649 is implemented, but who also - want to support earlier Python versions, to simply write: - - typing_extensions.get_annotations(obj, format=Format.FORWARDREF) - - """ - format = Format(format) - if format is Format.VALUE_WITH_FAKE_GLOBALS: - raise ValueError( - "The VALUE_WITH_FAKE_GLOBALS format is for internal use only" - ) - - if eval_str and format is not Format.VALUE: - raise ValueError("eval_str=True is only supported with format=Format.VALUE") - - if isinstance(obj, type): - # class - obj_dict = getattr(obj, '__dict__', None) - if obj_dict and hasattr(obj_dict, 'get'): - ann = obj_dict.get('__annotations__', None) - if isinstance(ann, _types.GetSetDescriptorType): - ann = None - else: - ann = None - - obj_globals = None - module_name = getattr(obj, '__module__', None) - if module_name: - module = sys.modules.get(module_name, None) - if module: - obj_globals = getattr(module, '__dict__', None) - obj_locals = dict(vars(obj)) - unwrap = obj - elif isinstance(obj, _types.ModuleType): - # module - ann = getattr(obj, '__annotations__', None) - obj_globals = obj.__dict__ - obj_locals = None - unwrap = None - elif callable(obj): - # this includes types.Function, types.BuiltinFunctionType, - # types.BuiltinMethodType, functools.partial, functools.singledispatch, - # "class funclike" from Lib/test/test_inspect... on and on it goes. - ann = getattr(obj, '__annotations__', None) - obj_globals = getattr(obj, '__globals__', None) - obj_locals = None - unwrap = obj - elif hasattr(obj, '__annotations__'): - ann = obj.__annotations__ - obj_globals = obj_locals = unwrap = None - else: - raise TypeError(f"{obj!r} is not a module, class, or callable.") - - if ann is None: - return {} - - if not isinstance(ann, dict): - raise ValueError(f"{obj!r}.__annotations__ is neither a dict nor None") - - if not ann: - return {} - - if not eval_str: - if format is Format.STRING: - return { - key: value if isinstance(value, str) else typing._type_repr(value) - for key, value in ann.items() - } - return dict(ann) - - if unwrap is not None: - while True: - if hasattr(unwrap, '__wrapped__'): - unwrap = unwrap.__wrapped__ - continue - if isinstance(unwrap, functools.partial): - unwrap = unwrap.func - continue - break - if hasattr(unwrap, "__globals__"): - obj_globals = unwrap.__globals__ - - if globals is None: - globals = obj_globals - if locals is None: - locals = obj_locals or {} - - # "Inject" type parameters into the local namespace - # (unless they are shadowed by assignments *in* the local namespace), - # as a way of emulating annotation scopes when calling `eval()` - if type_params := getattr(obj, "__type_params__", ()): - locals = {param.__name__: param for param in type_params} | locals - - return_value = {key: - value if not isinstance(value, str) else eval(value, globals, locals) - for key, value in ann.items() } - return return_value - - -if hasattr(typing, "evaluate_forward_ref"): - evaluate_forward_ref = typing.evaluate_forward_ref -else: - # Implements annotationlib.ForwardRef.evaluate - def _eval_with_owner( - forward_ref, *, owner=None, globals=None, locals=None, type_params=None - ): - if forward_ref.__forward_evaluated__: - return forward_ref.__forward_value__ - if getattr(forward_ref, "__cell__", None) is not None: - try: - value = forward_ref.__cell__.cell_contents - except ValueError: - pass - else: - forward_ref.__forward_evaluated__ = True - forward_ref.__forward_value__ = value - return value - if owner is None: - owner = getattr(forward_ref, "__owner__", None) - - if ( - globals is None - and getattr(forward_ref, "__forward_module__", None) is not None - ): - globals = getattr( - sys.modules.get(forward_ref.__forward_module__, None), "__dict__", None - ) - if globals is None: - globals = getattr(forward_ref, "__globals__", None) - if globals is None: - if isinstance(owner, type): - module_name = getattr(owner, "__module__", None) - if module_name: - module = sys.modules.get(module_name, None) - if module: - globals = getattr(module, "__dict__", None) - elif isinstance(owner, _types.ModuleType): - globals = getattr(owner, "__dict__", None) - elif callable(owner): - globals = getattr(owner, "__globals__", None) - - # If we pass None to eval() below, the globals of this module are used. - if globals is None: - globals = {} - - if locals is None: - locals = {} - if isinstance(owner, type): - locals.update(vars(owner)) - - if type_params is None and owner is not None: - # "Inject" type parameters into the local namespace - # (unless they are shadowed by assignments *in* the local namespace), - # as a way of emulating annotation scopes when calling `eval()` - type_params = getattr(owner, "__type_params__", None) - - # type parameters require some special handling, - # as they exist in their own scope - # but `eval()` does not have a dedicated parameter for that scope. - # For classes, names in type parameter scopes should override - # names in the global scope (which here are called `localns`!), - # but should in turn be overridden by names in the class scope - # (which here are called `globalns`!) - if type_params is not None: - globals = dict(globals) - locals = dict(locals) - for param in type_params: - param_name = param.__name__ - if ( - _FORWARD_REF_HAS_CLASS and not forward_ref.__forward_is_class__ - ) or param_name not in globals: - globals[param_name] = param - locals.pop(param_name, None) - - arg = forward_ref.__forward_arg__ - if arg.isidentifier() and not keyword.iskeyword(arg): - if arg in locals: - value = locals[arg] - elif arg in globals: - value = globals[arg] - elif hasattr(builtins, arg): - return getattr(builtins, arg) - else: - raise NameError(arg) - else: - code = forward_ref.__forward_code__ - value = eval(code, globals, locals) - forward_ref.__forward_evaluated__ = True - forward_ref.__forward_value__ = value - return value - - def evaluate_forward_ref( - forward_ref, - *, - owner=None, - globals=None, - locals=None, - type_params=None, - format=None, - _recursive_guard=frozenset(), - ): - """Evaluate a forward reference as a type hint. - - This is similar to calling the ForwardRef.evaluate() method, - but unlike that method, evaluate_forward_ref() also: - - * Recursively evaluates forward references nested within the type hint. - * Rejects certain objects that are not valid type hints. - * Replaces type hints that evaluate to None with types.NoneType. - * Supports the *FORWARDREF* and *STRING* formats. - - *forward_ref* must be an instance of ForwardRef. *owner*, if given, - should be the object that holds the annotations that the forward reference - derived from, such as a module, class object, or function. It is used to - infer the namespaces to use for looking up names. *globals* and *locals* - can also be explicitly given to provide the global and local namespaces. - *type_params* is a tuple of type parameters that are in scope when - evaluating the forward reference. This parameter must be provided (though - it may be an empty tuple) if *owner* is not given and the forward reference - does not already have an owner set. *format* specifies the format of the - annotation and is a member of the annotationlib.Format enum. - - """ - if format == Format.STRING: - return forward_ref.__forward_arg__ - if forward_ref.__forward_arg__ in _recursive_guard: - return forward_ref - - # Evaluate the forward reference - try: - value = _eval_with_owner( - forward_ref, - owner=owner, - globals=globals, - locals=locals, - type_params=type_params, - ) - except NameError: - if format == Format.FORWARDREF: - return forward_ref - else: - raise - - if isinstance(value, str): - value = ForwardRef(value) - - # Recursively evaluate the type - if isinstance(value, ForwardRef): - if getattr(value, "__forward_module__", True) is not None: - globals = None - return evaluate_forward_ref( - value, - globals=globals, - locals=locals, - type_params=type_params, owner=owner, - _recursive_guard=_recursive_guard, format=format - ) - if sys.version_info < (3, 12, 5) and type_params: - # Make use of type_params - locals = dict(locals) if locals else {} - for tvar in type_params: - if tvar.__name__ not in locals: # lets not overwrite something present - locals[tvar.__name__] = tvar - if sys.version_info < (3, 12, 5): - return typing._eval_type( - value, - globals, - locals, - recursive_guard=_recursive_guard | {forward_ref.__forward_arg__}, - ) - else: - return typing._eval_type( - value, - globals, - locals, - type_params, - recursive_guard=_recursive_guard | {forward_ref.__forward_arg__}, - ) - - -class Sentinel: - """Create a unique sentinel object. - - *name* should be the name of the variable to which the return value shall be assigned. - - *repr*, if supplied, will be used for the repr of the sentinel object. - If not provided, "<name>" will be used. - """ - - def __init__( - self, - name: str, - repr: typing.Optional[str] = None, - ): - self._name = name - self._repr = repr if repr is not None else f'<{name}>' - - def __repr__(self): - return self._repr - - if sys.version_info < (3, 11): - # The presence of this method convinces typing._type_check - # that Sentinels are types. - def __call__(self, *args, **kwargs): - raise TypeError(f"{type(self).__name__!r} object is not callable") - - if sys.version_info >= (3, 10): - def __or__(self, other): - return typing.Union[self, other] - - def __ror__(self, other): - return typing.Union[other, self] - - def __getstate__(self): - raise TypeError(f"Cannot pickle {type(self).__name__!r} object") - - -# Aliases for items that are in typing in all supported versions. -# We use hasattr() checks so this library will continue to import on -# future versions of Python that may remove these names. -_typing_names = [ - "AbstractSet", - "AnyStr", - "BinaryIO", - "Callable", - "Collection", - "Container", - "Dict", - "FrozenSet", - "Hashable", - "IO", - "ItemsView", - "Iterable", - "Iterator", - "KeysView", - "List", - "Mapping", - "MappingView", - "Match", - "MutableMapping", - "MutableSequence", - "MutableSet", - "Optional", - "Pattern", - "Reversible", - "Sequence", - "Set", - "Sized", - "TextIO", - "Tuple", - "Union", - "ValuesView", - "cast", - "no_type_check", - "no_type_check_decorator", - # This is private, but it was defined by typing_extensions for a long time - # and some users rely on it. - "_AnnotatedAlias", -] -globals().update( - {name: getattr(typing, name) for name in _typing_names if hasattr(typing, name)} -) -# These are defined unconditionally because they are used in -# typing-extensions itself. -Generic = typing.Generic -ForwardRef = typing.ForwardRef -Annotated = typing.Annotated diff --git a/venv/lib/python3.12/site-packages/yarl-1.20.1.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/yarl-1.20.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.12/site-packages/yarl-1.20.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/yarl-1.20.1.dist-info/METADATA b/venv/lib/python3.12/site-packages/yarl-1.20.1.dist-info/METADATA deleted file mode 100644 index 1e411d8..0000000 --- a/venv/lib/python3.12/site-packages/yarl-1.20.1.dist-info/METADATA +++ /dev/null @@ -1,2427 +0,0 @@ -Metadata-Version: 2.4 -Name: yarl -Version: 1.20.1 -Summary: Yet another URL library -Home-page: https://github.com/aio-libs/yarl -Author: Andrew Svetlov -Author-email: andrew.svetlov@gmail.com -Maintainer: aiohttp team <team@aiohttp.org> -Maintainer-email: team@aiohttp.org -License: Apache-2.0 -Project-URL: Chat: Matrix, https://matrix.to/#/#aio-libs:matrix.org -Project-URL: Chat: Matrix Space, https://matrix.to/#/#aio-libs-space:matrix.org -Project-URL: CI: GitHub Workflows, https://github.com/aio-libs/yarl/actions?query=branch:master -Project-URL: Code of Conduct, https://github.com/aio-libs/.github/blob/master/CODE_OF_CONDUCT.md -Project-URL: Coverage: codecov, https://codecov.io/github/aio-libs/yarl -Project-URL: Docs: Changelog, https://yarl.aio-libs.org/en/latest/changes/ -Project-URL: Docs: RTD, https://yarl.aio-libs.org -Project-URL: GitHub: issues, https://github.com/aio-libs/yarl/issues -Project-URL: GitHub: repo, https://github.com/aio-libs/yarl -Keywords: cython,cext,yarl -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: Apache Software License -Classifier: Programming Language :: Cython -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -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: Topic :: Internet :: WWW/HTTP -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Requires-Python: >=3.9 -Description-Content-Type: text/x-rst -License-File: LICENSE -License-File: NOTICE -Requires-Dist: idna>=2.0 -Requires-Dist: multidict>=4.0 -Requires-Dist: propcache>=0.2.1 -Dynamic: license-file - -yarl -==== - -The module provides handy URL class for URL parsing and changing. - -.. image:: https://github.com/aio-libs/yarl/workflows/CI/badge.svg - :target: https://github.com/aio-libs/yarl/actions?query=workflow%3ACI - :align: right - -.. image:: https://codecov.io/gh/aio-libs/yarl/graph/badge.svg?flag=pytest - :target: https://app.codecov.io/gh/aio-libs/yarl?flags[]=pytest - :alt: Codecov coverage for the pytest-driven measurements - -.. image:: https://img.shields.io/endpoint?url=https://codspeed.io/badge.json - :target: https://codspeed.io/aio-libs/yarl - -.. image:: https://badge.fury.io/py/yarl.svg - :target: https://badge.fury.io/py/yarl - -.. image:: https://readthedocs.org/projects/yarl/badge/?version=latest - :target: https://yarl.aio-libs.org - -.. image:: https://img.shields.io/pypi/pyversions/yarl.svg - :target: https://pypi.python.org/pypi/yarl - -.. image:: https://img.shields.io/matrix/aio-libs:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat - :target: https://matrix.to/#/%23aio-libs:matrix.org - :alt: Matrix Room — #aio-libs:matrix.org - -.. image:: https://img.shields.io/matrix/aio-libs-space:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs-space%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat - :target: https://matrix.to/#/%23aio-libs-space:matrix.org - :alt: Matrix Space — #aio-libs-space:matrix.org - - -Introduction ------------- - -Url is constructed from ``str``: - -.. code-block:: pycon - - >>> from yarl import URL - >>> url = URL('https://www.python.org/~guido?arg=1#frag') - >>> url - URL('https://www.python.org/~guido?arg=1#frag') - -All url parts: *scheme*, *user*, *password*, *host*, *port*, *path*, -*query* and *fragment* are accessible by properties: - -.. code-block:: pycon - - >>> url.scheme - 'https' - >>> url.host - 'www.python.org' - >>> url.path - '/~guido' - >>> url.query_string - 'arg=1' - >>> url.query - <MultiDictProxy('arg': '1')> - >>> url.fragment - 'frag' - -All url manipulations produce a new url object: - -.. code-block:: pycon - - >>> url = URL('https://www.python.org') - >>> url / 'foo' / 'bar' - URL('https://www.python.org/foo/bar') - >>> url / 'foo' % {'bar': 'baz'} - URL('https://www.python.org/foo?bar=baz') - -Strings passed to constructor and modification methods are -automatically encoded giving canonical representation as result: - -.. code-block:: pycon - - >>> url = URL('https://www.python.org/шлях') - >>> url - URL('https://www.python.org/%D1%88%D0%BB%D1%8F%D1%85') - -Regular properties are *percent-decoded*, use ``raw_`` versions for -getting *encoded* strings: - -.. code-block:: pycon - - >>> url.path - '/шлях' - - >>> url.raw_path - '/%D1%88%D0%BB%D1%8F%D1%85' - -Human readable representation of URL is available as ``.human_repr()``: - -.. code-block:: pycon - - >>> url.human_repr() - 'https://www.python.org/шлях' - -For full documentation please read https://yarl.aio-libs.org. - - -Installation ------------- - -:: - - $ pip install yarl - -The library is Python 3 only! - -PyPI contains binary wheels for Linux, Windows and MacOS. If you want to install -``yarl`` on another operating system where wheels are not provided, -the tarball will be used to compile the library from -the source code. It requires a C compiler and and Python headers installed. - -To skip the compilation you must explicitly opt-in by using a PEP 517 -configuration setting ``pure-python``, or setting the ``YARL_NO_EXTENSIONS`` -environment variable to a non-empty value, e.g.: - -.. code-block:: console - - $ pip install yarl --config-settings=pure-python=false - -Please note that the pure-Python (uncompiled) version is much slower. However, -PyPy always uses a pure-Python implementation, and, as such, it is unaffected -by this variable. - -Dependencies ------------- - -YARL requires multidict_ and propcache_ libraries. - - -API documentation ------------------- - -The documentation is located at https://yarl.aio-libs.org. - - -Why isn't boolean supported by the URL query API? -------------------------------------------------- - -There is no standard for boolean representation of boolean values. - -Some systems prefer ``true``/``false``, others like ``yes``/``no``, ``on``/``off``, -``Y``/``N``, ``1``/``0``, etc. - -``yarl`` cannot make an unambiguous decision on how to serialize ``bool`` values because -it is specific to how the end-user's application is built and would be different for -different apps. The library doesn't accept booleans in the API; a user should convert -bools into strings using own preferred translation protocol. - - -Comparison with other URL libraries ------------------------------------- - -* furl (https://pypi.python.org/pypi/furl) - - The library has rich functionality but the ``furl`` object is mutable. - - I'm afraid to pass this object into foreign code: who knows if the - code will modify my url in a terrible way while I just want to send URL - with handy helpers for accessing URL properties. - - ``furl`` has other non-obvious tricky things but the main objection - is mutability. - -* URLObject (https://pypi.python.org/pypi/URLObject) - - URLObject is immutable, that's pretty good. - - Every URL change generates a new URL object. - - But the library doesn't do any decode/encode transformations leaving the - end user to cope with these gory details. - - -Source code ------------ - -The project is hosted on GitHub_ - -Please file an issue on the `bug tracker -<https://github.com/aio-libs/yarl/issues>`_ if you have found a bug -or have some suggestion in order to improve the library. - -Discussion list ---------------- - -*aio-libs* google group: https://groups.google.com/forum/#!forum/aio-libs - -Feel free to post your questions and ideas here. - - -Authors and License -------------------- - -The ``yarl`` package is written by Andrew Svetlov. - -It's *Apache 2* licensed and freely available. - - -.. _GitHub: https://github.com/aio-libs/yarl - -.. _multidict: https://github.com/aio-libs/multidict - -.. _propcache: https://github.com/aio-libs/propcache - -========= -Changelog -========= - -.. - You should *NOT* be adding new change log entries to this file, this - file is managed by towncrier. You *may* edit previous change logs to - fix problems like typo corrections or such. - To add a new change log entry, please see - https://pip.pypa.io/en/latest/development/#adding-a-news-entry - we named the news folder "changes". - - WARNING: Don't drop the next directive! - -.. towncrier release notes start - -1.20.1 -====== - -*(2025-06-09)* - - -Bug fixes ---------- - -- Started raising a ``ValueError`` exception raised for corrupted - IPv6 URL values. - - These fixes the issue where exception ``IndexError`` was - leaking from the internal code because of not being handled and - transformed into a user-facing error. The problem was happening - under the following conditions: empty IPv6 URL, brackets in - reverse order. - - -- by `@MaelPic <https://github.com/sponsors/MaelPic>`__. - - *Related issues and pull requests on GitHub:* - `#1512 <https://github.com/aio-libs/yarl/issues/1512>`__. - - -Packaging updates and notes for downstreams -------------------------------------------- - -- Updated to use Cython 3.1 universally across the build path -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__. - - *Related issues and pull requests on GitHub:* - `#1514 <https://github.com/aio-libs/yarl/issues/1514>`__. - -- Made Cython line tracing opt-in via the ``with-cython-tracing`` build config setting -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - Previously, line tracing was enabled by default in ``pyproject.toml``, which caused build issues for some users and made wheels nearly twice as slow. - Now line tracing is only enabled when explicitly requested via ``pip install . --config-setting=with-cython-tracing=true`` or by setting the ``YARL_CYTHON_TRACING`` environment variable. - - *Related issues and pull requests on GitHub:* - `#1521 <https://github.com/aio-libs/yarl/issues/1521>`__. - - ----- - - -1.20.0 -====== - -*(2025-04-16)* - - -Features --------- - -- Implemented support for the free-threaded build of CPython 3.13 -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__. - - *Related issues and pull requests on GitHub:* - `#1456 <https://github.com/aio-libs/yarl/issues/1456>`__. - - -Packaging updates and notes for downstreams -------------------------------------------- - -- Started building wheels for the free-threaded build of CPython 3.13 -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__. - - *Related issues and pull requests on GitHub:* - `#1456 <https://github.com/aio-libs/yarl/issues/1456>`__. - - ----- - - -1.19.0 -====== - -*(2025-04-05)* - - -Bug fixes ---------- - -- Fixed entire name being re-encoded when using ``yarl.URL.with_suffix()`` -- by `@NTFSvolume <https://github.com/sponsors/NTFSvolume>`__. - - *Related issues and pull requests on GitHub:* - `#1468 <https://github.com/aio-libs/yarl/issues/1468>`__. - - -Features --------- - -- Started building armv7l wheels for manylinux -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1495 <https://github.com/aio-libs/yarl/issues/1495>`__. - - -Contributor-facing changes --------------------------- - -- GitHub Actions CI/CD is now configured to manage caching pip-ecosystem - dependencies using `re-actors/cache-python-deps`_ -- an action by - `@webknjaz <https://github.com/sponsors/webknjaz>`__ that takes into account ABI stability and the exact - version of Python runtime. - - .. _`re-actors/cache-python-deps`: - https://github.com/marketplace/actions/cache-python-deps - - *Related issues and pull requests on GitHub:* - `#1471 <https://github.com/aio-libs/yarl/issues/1471>`__. - -- Increased minimum `propcache`_ version to 0.2.1 to fix failing tests -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - .. _`propcache`: - https://github.com/aio-libs/propcache - - *Related issues and pull requests on GitHub:* - `#1479 <https://github.com/aio-libs/yarl/issues/1479>`__. - -- Added all hidden folders to pytest's ``norecursedirs`` to prevent it - from trying to collect tests there -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__. - - *Related issues and pull requests on GitHub:* - `#1480 <https://github.com/aio-libs/yarl/issues/1480>`__. - - -Miscellaneous internal changes ------------------------------- - -- Improved accuracy of type annotations -- by `@Dreamsorcerer <https://github.com/sponsors/Dreamsorcerer>`__. - - *Related issues and pull requests on GitHub:* - `#1484 <https://github.com/aio-libs/yarl/issues/1484>`__. - -- Improved performance of parsing query strings -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1493 <https://github.com/aio-libs/yarl/issues/1493>`__, `#1497 <https://github.com/aio-libs/yarl/issues/1497>`__. - -- Improved performance of the C unquoter -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1496 <https://github.com/aio-libs/yarl/issues/1496>`__, `#1498 <https://github.com/aio-libs/yarl/issues/1498>`__. - - ----- - - -1.18.3 -====== - -*(2024-12-01)* - - -Bug fixes ---------- - -- Fixed uppercase ASCII hosts being rejected by ``URL.build()()`` and ``yarl.URL.with_host()`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#954 <https://github.com/aio-libs/yarl/issues/954>`__, `#1442 <https://github.com/aio-libs/yarl/issues/1442>`__. - - -Miscellaneous internal changes ------------------------------- - -- Improved performances of multiple path properties on cache miss -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1443 <https://github.com/aio-libs/yarl/issues/1443>`__. - - ----- - - -1.18.2 -====== - -*(2024-11-29)* - - -No significant changes. - - ----- - - -1.18.1 -====== - -*(2024-11-29)* - - -Miscellaneous internal changes ------------------------------- - -- Improved cache performance when ``~yarl.URL`` objects are constructed from ``yarl.URL.build()`` with ``encoded=True`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1432 <https://github.com/aio-libs/yarl/issues/1432>`__. - -- Improved cache performance for operations that produce a new ``~yarl.URL`` object -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1434 <https://github.com/aio-libs/yarl/issues/1434>`__, `#1436 <https://github.com/aio-libs/yarl/issues/1436>`__. - - ----- - - -1.18.0 -====== - -*(2024-11-21)* - - -Features --------- - -- Added ``keep_query`` and ``keep_fragment`` flags in the ``yarl.URL.with_path()``, ``yarl.URL.with_name()`` and ``yarl.URL.with_suffix()`` methods, allowing users to optionally retain the query string and fragment in the resulting URL when replacing the path -- by `@paul-nameless <https://github.com/sponsors/paul-nameless>`__. - - *Related issues and pull requests on GitHub:* - `#111 <https://github.com/aio-libs/yarl/issues/111>`__, `#1421 <https://github.com/aio-libs/yarl/issues/1421>`__. - - -Contributor-facing changes --------------------------- - -- Started running downstream ``aiohttp`` tests in CI -- by `@Cycloctane <https://github.com/sponsors/Cycloctane>`__. - - *Related issues and pull requests on GitHub:* - `#1415 <https://github.com/aio-libs/yarl/issues/1415>`__. - - -Miscellaneous internal changes ------------------------------- - -- Improved performance of converting ``~yarl.URL`` to a string -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1422 <https://github.com/aio-libs/yarl/issues/1422>`__. - - ----- - - -1.17.2 -====== - -*(2024-11-17)* - - -Bug fixes ---------- - -- Stopped implicitly allowing the use of Cython pre-release versions when - building the distribution package -- by `@ajsanchezsanz <https://github.com/sponsors/ajsanchezsanz>`__ and - `@markgreene74 <https://github.com/sponsors/markgreene74>`__. - - *Related issues and pull requests on GitHub:* - `#1411 <https://github.com/aio-libs/yarl/issues/1411>`__, `#1412 <https://github.com/aio-libs/yarl/issues/1412>`__. - -- Fixed a bug causing ``~yarl.URL.port`` to return the default port when the given port was zero - -- by `@gmacon <https://github.com/sponsors/gmacon>`__. - - *Related issues and pull requests on GitHub:* - `#1413 <https://github.com/aio-libs/yarl/issues/1413>`__. - - -Features --------- - -- Make error messages include details of incorrect type when ``port`` is not int in ``yarl.URL.build()``. - -- by `@Cycloctane <https://github.com/sponsors/Cycloctane>`__. - - *Related issues and pull requests on GitHub:* - `#1414 <https://github.com/aio-libs/yarl/issues/1414>`__. - - -Packaging updates and notes for downstreams -------------------------------------------- - -- Stopped implicitly allowing the use of Cython pre-release versions when - building the distribution package -- by `@ajsanchezsanz <https://github.com/sponsors/ajsanchezsanz>`__ and - `@markgreene74 <https://github.com/sponsors/markgreene74>`__. - - *Related issues and pull requests on GitHub:* - `#1411 <https://github.com/aio-libs/yarl/issues/1411>`__, `#1412 <https://github.com/aio-libs/yarl/issues/1412>`__. - - -Miscellaneous internal changes ------------------------------- - -- Improved performance of the ``yarl.URL.joinpath()`` method -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1418 <https://github.com/aio-libs/yarl/issues/1418>`__. - - ----- - - -1.17.1 -====== - -*(2024-10-30)* - - -Miscellaneous internal changes ------------------------------- - -- Improved performance of many ``~yarl.URL`` methods -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1396 <https://github.com/aio-libs/yarl/issues/1396>`__, `#1397 <https://github.com/aio-libs/yarl/issues/1397>`__, `#1398 <https://github.com/aio-libs/yarl/issues/1398>`__. - -- Improved performance of passing a `dict` or `str` to ``yarl.URL.extend_query()`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1401 <https://github.com/aio-libs/yarl/issues/1401>`__. - - ----- - - -1.17.0 -====== - -*(2024-10-28)* - - -Features --------- - -- Added ``~yarl.URL.host_port_subcomponent`` which returns the ``3986#section-3.2.2`` host and ``3986#section-3.2.3`` port subcomponent -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1375 <https://github.com/aio-libs/yarl/issues/1375>`__. - - ----- - - -1.16.0 -====== - -*(2024-10-21)* - - -Bug fixes ---------- - -- Fixed blocking I/O to load Python code when creating a new ``~yarl.URL`` with non-ascii characters in the network location part -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1342 <https://github.com/aio-libs/yarl/issues/1342>`__. - - -Removals and backward incompatible breaking changes ---------------------------------------------------- - -- Migrated to using a single cache for encoding hosts -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - Passing ``ip_address_size`` and ``host_validate_size`` to ``yarl.cache_configure()`` is deprecated in favor of the new ``encode_host_size`` parameter and will be removed in a future release. For backwards compatibility, the old parameters affect the ``encode_host`` cache size. - - *Related issues and pull requests on GitHub:* - `#1348 <https://github.com/aio-libs/yarl/issues/1348>`__, `#1357 <https://github.com/aio-libs/yarl/issues/1357>`__, `#1363 <https://github.com/aio-libs/yarl/issues/1363>`__. - - -Miscellaneous internal changes ------------------------------- - -- Improved performance of constructing ``~yarl.URL`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1336 <https://github.com/aio-libs/yarl/issues/1336>`__. - -- Improved performance of calling ``yarl.URL.build()`` and constructing unencoded ``~yarl.URL`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1345 <https://github.com/aio-libs/yarl/issues/1345>`__. - -- Reworked the internal encoding cache to improve performance on cache hit -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1369 <https://github.com/aio-libs/yarl/issues/1369>`__. - - ----- - - -1.15.5 -====== - -*(2024-10-18)* - - -Miscellaneous internal changes ------------------------------- - -- Improved performance of the ``yarl.URL.joinpath()`` method -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1304 <https://github.com/aio-libs/yarl/issues/1304>`__. - -- Improved performance of the ``yarl.URL.extend_query()`` method -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1305 <https://github.com/aio-libs/yarl/issues/1305>`__. - -- Improved performance of the ``yarl.URL.origin()`` method -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1306 <https://github.com/aio-libs/yarl/issues/1306>`__. - -- Improved performance of the ``yarl.URL.with_path()`` method -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1307 <https://github.com/aio-libs/yarl/issues/1307>`__. - -- Improved performance of the ``yarl.URL.with_query()`` method -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1308 <https://github.com/aio-libs/yarl/issues/1308>`__, `#1328 <https://github.com/aio-libs/yarl/issues/1328>`__. - -- Improved performance of the ``yarl.URL.update_query()`` method -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1309 <https://github.com/aio-libs/yarl/issues/1309>`__, `#1327 <https://github.com/aio-libs/yarl/issues/1327>`__. - -- Improved performance of the ``yarl.URL.join()`` method -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1313 <https://github.com/aio-libs/yarl/issues/1313>`__. - -- Improved performance of ``~yarl.URL`` equality checks -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1315 <https://github.com/aio-libs/yarl/issues/1315>`__. - -- Improved performance of ``~yarl.URL`` methods that modify the network location -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1316 <https://github.com/aio-libs/yarl/issues/1316>`__. - -- Improved performance of the ``yarl.URL.with_fragment()`` method -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1317 <https://github.com/aio-libs/yarl/issues/1317>`__. - -- Improved performance of calculating the hash of ``~yarl.URL`` objects -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1318 <https://github.com/aio-libs/yarl/issues/1318>`__. - -- Improved performance of the ``yarl.URL.relative()`` method -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1319 <https://github.com/aio-libs/yarl/issues/1319>`__. - -- Improved performance of the ``yarl.URL.with_name()`` method -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1320 <https://github.com/aio-libs/yarl/issues/1320>`__. - -- Improved performance of ``~yarl.URL.parent`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1321 <https://github.com/aio-libs/yarl/issues/1321>`__. - -- Improved performance of the ``yarl.URL.with_scheme()`` method -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1322 <https://github.com/aio-libs/yarl/issues/1322>`__. - - ----- - - -1.15.4 -====== - -*(2024-10-16)* - - -Miscellaneous internal changes ------------------------------- - -- Improved performance of the quoter when all characters are safe -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1288 <https://github.com/aio-libs/yarl/issues/1288>`__. - -- Improved performance of unquoting strings -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1292 <https://github.com/aio-libs/yarl/issues/1292>`__, `#1293 <https://github.com/aio-libs/yarl/issues/1293>`__. - -- Improved performance of calling ``yarl.URL.build()`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1297 <https://github.com/aio-libs/yarl/issues/1297>`__. - - ----- - - -1.15.3 -====== - -*(2024-10-15)* - - -Bug fixes ---------- - -- Fixed ``yarl.URL.build()`` failing to validate paths must start with a ``/`` when passing ``authority`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - The validation only worked correctly when passing ``host``. - - *Related issues and pull requests on GitHub:* - `#1265 <https://github.com/aio-libs/yarl/issues/1265>`__. - - -Removals and backward incompatible breaking changes ---------------------------------------------------- - -- Removed support for Python 3.8 as it has reached end of life -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1203 <https://github.com/aio-libs/yarl/issues/1203>`__. - - -Miscellaneous internal changes ------------------------------- - -- Improved performance of constructing ``~yarl.URL`` when the net location is only the host -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1271 <https://github.com/aio-libs/yarl/issues/1271>`__. - - ----- - - -1.15.2 -====== - -*(2024-10-13)* - - -Miscellaneous internal changes ------------------------------- - -- Improved performance of converting ``~yarl.URL`` to a string -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1234 <https://github.com/aio-libs/yarl/issues/1234>`__. - -- Improved performance of ``yarl.URL.joinpath()`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1248 <https://github.com/aio-libs/yarl/issues/1248>`__, `#1250 <https://github.com/aio-libs/yarl/issues/1250>`__. - -- Improved performance of constructing query strings from ``~multidict.MultiDict`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1256 <https://github.com/aio-libs/yarl/issues/1256>`__. - -- Improved performance of constructing query strings with ``int`` values -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1259 <https://github.com/aio-libs/yarl/issues/1259>`__. - - ----- - - -1.15.1 -====== - -*(2024-10-12)* - - -Miscellaneous internal changes ------------------------------- - -- Improved performance of calling ``yarl.URL.build()`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1222 <https://github.com/aio-libs/yarl/issues/1222>`__. - -- Improved performance of all ``~yarl.URL`` methods that create new ``~yarl.URL`` objects -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1226 <https://github.com/aio-libs/yarl/issues/1226>`__. - -- Improved performance of ``~yarl.URL`` methods that modify the network location -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1229 <https://github.com/aio-libs/yarl/issues/1229>`__. - - ----- - - -1.15.0 -====== - -*(2024-10-11)* - - -Bug fixes ---------- - -- Fixed validation with ``yarl.URL.with_scheme()`` when passed scheme is not lowercase -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1189 <https://github.com/aio-libs/yarl/issues/1189>`__. - - -Features --------- - -- Started building ``armv7l`` wheels -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1204 <https://github.com/aio-libs/yarl/issues/1204>`__. - - -Miscellaneous internal changes ------------------------------- - -- Improved performance of constructing unencoded ``~yarl.URL`` objects -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1188 <https://github.com/aio-libs/yarl/issues/1188>`__. - -- Added a cache for parsing hosts to reduce overhead of encoding ``~yarl.URL`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1190 <https://github.com/aio-libs/yarl/issues/1190>`__. - -- Improved performance of constructing query strings from ``~collections.abc.Mapping`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1193 <https://github.com/aio-libs/yarl/issues/1193>`__. - -- Improved performance of converting ``~yarl.URL`` objects to strings -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1198 <https://github.com/aio-libs/yarl/issues/1198>`__. - - ----- - - -1.14.0 -====== - -*(2024-10-08)* - - -Packaging updates and notes for downstreams -------------------------------------------- - -- Switched to using the ``propcache`` package for property caching - -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - The ``propcache`` package is derived from the property caching - code in ``yarl`` and has been broken out to avoid maintaining it for multiple - projects. - - *Related issues and pull requests on GitHub:* - `#1169 <https://github.com/aio-libs/yarl/issues/1169>`__. - - -Contributor-facing changes --------------------------- - -- Started testing with Hypothesis -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__ and `@bdraco <https://github.com/sponsors/bdraco>`__. - - Special thanks to `@Zac-HD <https://github.com/sponsors/Zac-HD>`__ for helping us get started with this framework. - - *Related issues and pull requests on GitHub:* - `#860 <https://github.com/aio-libs/yarl/issues/860>`__. - - -Miscellaneous internal changes ------------------------------- - -- Improved performance of ``yarl.URL.is_default_port()`` when no explicit port is set -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1168 <https://github.com/aio-libs/yarl/issues/1168>`__. - -- Improved performance of converting ``~yarl.URL`` to a string when no explicit port is set -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1170 <https://github.com/aio-libs/yarl/issues/1170>`__. - -- Improved performance of the ``yarl.URL.origin()`` method -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1175 <https://github.com/aio-libs/yarl/issues/1175>`__. - -- Improved performance of encoding hosts -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1176 <https://github.com/aio-libs/yarl/issues/1176>`__. - - ----- - - -1.13.1 -====== - -*(2024-09-27)* - - -Miscellaneous internal changes ------------------------------- - -- Improved performance of calling ``yarl.URL.build()`` with ``authority`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1163 <https://github.com/aio-libs/yarl/issues/1163>`__. - - ----- - - -1.13.0 -====== - -*(2024-09-26)* - - -Bug fixes ---------- - -- Started rejecting ASCII hostnames with invalid characters. For host strings that - look like authority strings, the exception message includes advice on what to do - instead -- by `@mjpieters <https://github.com/sponsors/mjpieters>`__. - - *Related issues and pull requests on GitHub:* - `#880 <https://github.com/aio-libs/yarl/issues/880>`__, `#954 <https://github.com/aio-libs/yarl/issues/954>`__. - -- Fixed IPv6 addresses missing brackets when the ``~yarl.URL`` was converted to a string -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1157 <https://github.com/aio-libs/yarl/issues/1157>`__, `#1158 <https://github.com/aio-libs/yarl/issues/1158>`__. - - -Features --------- - -- Added ``~yarl.URL.host_subcomponent`` which returns the ``3986#section-3.2.2`` host subcomponent -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - The only current practical difference between ``~yarl.URL.raw_host`` and ``~yarl.URL.host_subcomponent`` is that IPv6 addresses are returned bracketed. - - *Related issues and pull requests on GitHub:* - `#1159 <https://github.com/aio-libs/yarl/issues/1159>`__. - - ----- - - -1.12.1 -====== - -*(2024-09-23)* - - -No significant changes. - - ----- - - -1.12.0 -====== - -*(2024-09-23)* - - -Features --------- - -- Added ``~yarl.URL.path_safe`` to be able to fetch the path without ``%2F`` and ``%25`` decoded -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1150 <https://github.com/aio-libs/yarl/issues/1150>`__. - - -Removals and backward incompatible breaking changes ---------------------------------------------------- - -- Restore decoding ``%2F`` (``/``) in ``URL.path`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - This change restored the behavior before `#1057 <https://github.com/aio-libs/yarl/issues/1057>`__. - - *Related issues and pull requests on GitHub:* - `#1151 <https://github.com/aio-libs/yarl/issues/1151>`__. - - -Miscellaneous internal changes ------------------------------- - -- Improved performance of processing paths -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1143 <https://github.com/aio-libs/yarl/issues/1143>`__. - - ----- - - -1.11.1 -====== - -*(2024-09-09)* - - -Bug fixes ---------- - -- Allowed scheme replacement for relative URLs if the scheme does not require a host -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#280 <https://github.com/aio-libs/yarl/issues/280>`__, `#1138 <https://github.com/aio-libs/yarl/issues/1138>`__. - -- Allowed empty host for URL schemes other than the special schemes listed in the WHATWG URL spec -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1136 <https://github.com/aio-libs/yarl/issues/1136>`__. - - -Features --------- - -- Loosened restriction on integers as query string values to allow classes that implement ``__int__`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1139 <https://github.com/aio-libs/yarl/issues/1139>`__. - - -Miscellaneous internal changes ------------------------------- - -- Improved performance of normalizing paths -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1137 <https://github.com/aio-libs/yarl/issues/1137>`__. - - ----- - - -1.11.0 -====== - -*(2024-09-08)* - - -Features --------- - -- Added ``URL.extend_query()()`` method, which can be used to extend parameters without replacing same named keys -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - This method was primarily added to replace the inefficient hand rolled method currently used in ``aiohttp``. - - *Related issues and pull requests on GitHub:* - `#1128 <https://github.com/aio-libs/yarl/issues/1128>`__. - - -Miscellaneous internal changes ------------------------------- - -- Improved performance of the Cython ``cached_property`` implementation -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1122 <https://github.com/aio-libs/yarl/issues/1122>`__. - -- Simplified computing ports by removing unnecessary code -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1123 <https://github.com/aio-libs/yarl/issues/1123>`__. - -- Improved performance of encoding non IPv6 hosts -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1125 <https://github.com/aio-libs/yarl/issues/1125>`__. - -- Improved performance of ``URL.build()()`` when the path, query string, or fragment is an empty string -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1126 <https://github.com/aio-libs/yarl/issues/1126>`__. - -- Improved performance of the ``URL.update_query()()`` method -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1130 <https://github.com/aio-libs/yarl/issues/1130>`__. - -- Improved performance of processing query string changes when arguments are ``str`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1131 <https://github.com/aio-libs/yarl/issues/1131>`__. - - ----- - - -1.10.0 -====== - -*(2024-09-06)* - - -Bug fixes ---------- - -- Fixed joining a path when the existing path was empty -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - A regression in ``URL.join()()`` was introduced in `#1082 <https://github.com/aio-libs/yarl/issues/1082>`__. - - *Related issues and pull requests on GitHub:* - `#1118 <https://github.com/aio-libs/yarl/issues/1118>`__. - - -Features --------- - -- Added ``URL.without_query_params()()`` method, to drop some parameters from query string -- by `@hongquan <https://github.com/sponsors/hongquan>`__. - - *Related issues and pull requests on GitHub:* - `#774 <https://github.com/aio-libs/yarl/issues/774>`__, `#898 <https://github.com/aio-libs/yarl/issues/898>`__, `#1010 <https://github.com/aio-libs/yarl/issues/1010>`__. - -- The previously protected types ``_SimpleQuery``, ``_QueryVariable``, and ``_Query`` are now available for use externally as ``SimpleQuery``, ``QueryVariable``, and ``Query`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1050 <https://github.com/aio-libs/yarl/issues/1050>`__, `#1113 <https://github.com/aio-libs/yarl/issues/1113>`__. - - -Contributor-facing changes --------------------------- - -- Replaced all ``~typing.Optional`` with ``~typing.Union`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1095 <https://github.com/aio-libs/yarl/issues/1095>`__. - - -Miscellaneous internal changes ------------------------------- - -- Significantly improved performance of parsing the network location -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1112 <https://github.com/aio-libs/yarl/issues/1112>`__. - -- Added internal types to the cache to prevent future refactoring errors -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1117 <https://github.com/aio-libs/yarl/issues/1117>`__. - - ----- - - -1.9.11 -====== - -*(2024-09-04)* - - -Bug fixes ---------- - -- Fixed a ``TypeError`` with ``MultiDictProxy`` and Python 3.8 -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1084 <https://github.com/aio-libs/yarl/issues/1084>`__, `#1105 <https://github.com/aio-libs/yarl/issues/1105>`__, `#1107 <https://github.com/aio-libs/yarl/issues/1107>`__. - - -Miscellaneous internal changes ------------------------------- - -- Improved performance of encoding hosts -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - Previously, the library would unconditionally try to parse a host as an IP Address. The library now avoids trying to parse a host as an IP Address if the string is not in one of the formats described in ``3986#section-3.2.2``. - - *Related issues and pull requests on GitHub:* - `#1104 <https://github.com/aio-libs/yarl/issues/1104>`__. - - ----- - - -1.9.10 -====== - -*(2024-09-04)* - - -Bug fixes ---------- - -- ``URL.join()()`` has been changed to match - ``3986`` and align with - ``/ operation()`` and ``URL.joinpath()()`` - when joining URLs with empty segments. - Previously ``urllib.parse.urljoin`` was used, - which has known issues with empty segments - (`python/cpython#84774 <https://github.com/python/cpython/issues/84774>`_). - - Due to the semantics of ``URL.join()()``, joining an - URL with scheme requires making it relative, prefixing with ``./``. - - .. code-block:: pycon - - >>> URL("https://web.archive.org/web/").join(URL("./https://github.com/aio-libs/yarl")) - URL('https://web.archive.org/web/https://github.com/aio-libs/yarl') - - - Empty segments are honored in the base as well as the joined part. - - .. code-block:: pycon - - >>> URL("https://web.archive.org/web/https://").join(URL("github.com/aio-libs/yarl")) - URL('https://web.archive.org/web/https://github.com/aio-libs/yarl') - - - - -- by `@commonism <https://github.com/sponsors/commonism>`__ - - This change initially appeared in 1.9.5 but was reverted in 1.9.6 to resolve a problem with query string handling. - - *Related issues and pull requests on GitHub:* - `#1039 <https://github.com/aio-libs/yarl/issues/1039>`__, `#1082 <https://github.com/aio-libs/yarl/issues/1082>`__. - - -Features --------- - -- Added ``~yarl.URL.absolute`` which is now preferred over ``URL.is_absolute()`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1100 <https://github.com/aio-libs/yarl/issues/1100>`__. - - ----- - - -1.9.9 -===== - -*(2024-09-04)* - - -Bug fixes ---------- - -- Added missing type on ``~yarl.URL.port`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1097 <https://github.com/aio-libs/yarl/issues/1097>`__. - - ----- - - -1.9.8 -===== - -*(2024-09-03)* - - -Features --------- - -- Covered the ``~yarl.URL`` object with types -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1084 <https://github.com/aio-libs/yarl/issues/1084>`__. - -- Cache parsing of IP Addresses when encoding hosts -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1086 <https://github.com/aio-libs/yarl/issues/1086>`__. - - -Contributor-facing changes --------------------------- - -- Covered the ``~yarl.URL`` object with types -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1084 <https://github.com/aio-libs/yarl/issues/1084>`__. - - -Miscellaneous internal changes ------------------------------- - -- Improved performance of handling ports -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - *Related issues and pull requests on GitHub:* - `#1081 <https://github.com/aio-libs/yarl/issues/1081>`__. - - ----- - - -1.9.7 -===== - -*(2024-09-01)* - - -Removals and backward incompatible breaking changes ---------------------------------------------------- - -- Removed support ``3986#section-3.2.3`` port normalization when the scheme is not one of ``http``, ``https``, ``wss``, or ``ws`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - Support for port normalization was recently added in `#1033 <https://github.com/aio-libs/yarl/issues/1033>`__ and contained code that would do blocking I/O if the scheme was not one of the four listed above. The code has been removed because this library is intended to be safe for usage with ``asyncio``. - - *Related issues and pull requests on GitHub:* - `#1076 <https://github.com/aio-libs/yarl/issues/1076>`__. - - -Miscellaneous internal changes ------------------------------- - -- Improved performance of property caching -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - The ``reify`` implementation from ``aiohttp`` was adapted to replace the internal ``cached_property`` implementation. - - *Related issues and pull requests on GitHub:* - `#1070 <https://github.com/aio-libs/yarl/issues/1070>`__. - - ----- - - -1.9.6 -===== - -*(2024-08-30)* - - -Bug fixes ---------- - -- Reverted ``3986`` compatible ``URL.join()()`` honoring empty segments which was introduced in `#1039 <https://github.com/aio-libs/yarl/issues/1039>`__. - - This change introduced a regression handling query string parameters with joined URLs. The change was reverted to maintain compatibility with the previous behavior. - - *Related issues and pull requests on GitHub:* - `#1067 <https://github.com/aio-libs/yarl/issues/1067>`__. - - ----- - - -1.9.5 -===== - -*(2024-08-30)* - - -Bug fixes ---------- - -- Joining URLs with empty segments has been changed - to match ``3986``. - - Previously empty segments would be removed from path, - breaking use-cases such as - - .. code-block:: python - - URL("https://web.archive.org/web/") / "https://github.com/" - - Now ``/ operation()`` and ``URL.joinpath()()`` - keep empty segments, but do not introduce new empty segments. - e.g. - - .. code-block:: python - - URL("https://example.org/") / "" - - does not introduce an empty segment. - - -- by `@commonism <https://github.com/sponsors/commonism>`__ and `@youtux <https://github.com/sponsors/youtux>`__ - - *Related issues and pull requests on GitHub:* - `#1026 <https://github.com/aio-libs/yarl/issues/1026>`__. - -- The default protocol ports of well-known URI schemes are now taken into account - during the normalization of the URL string representation in accordance with - ``3986#section-3.2.3``. - - Specified ports are removed from the ``str`` representation of a ``~yarl.URL`` - if the port matches the scheme's default port -- by `@commonism <https://github.com/sponsors/commonism>`__. - - *Related issues and pull requests on GitHub:* - `#1033 <https://github.com/aio-libs/yarl/issues/1033>`__. - -- ``URL.join()()`` has been changed to match - ``3986`` and align with - ``/ operation()`` and ``URL.joinpath()()`` - when joining URLs with empty segments. - Previously ``urllib.parse.urljoin`` was used, - which has known issues with empty segments - (`python/cpython#84774 <https://github.com/python/cpython/issues/84774>`_). - - Due to the semantics of ``URL.join()()``, joining an - URL with scheme requires making it relative, prefixing with ``./``. - - .. code-block:: pycon - - >>> URL("https://web.archive.org/web/").join(URL("./https://github.com/aio-libs/yarl")) - URL('https://web.archive.org/web/https://github.com/aio-libs/yarl') - - - Empty segments are honored in the base as well as the joined part. - - .. code-block:: pycon - - >>> URL("https://web.archive.org/web/https://").join(URL("github.com/aio-libs/yarl")) - URL('https://web.archive.org/web/https://github.com/aio-libs/yarl') - - - - -- by `@commonism <https://github.com/sponsors/commonism>`__ - - *Related issues and pull requests on GitHub:* - `#1039 <https://github.com/aio-libs/yarl/issues/1039>`__. - - -Removals and backward incompatible breaking changes ---------------------------------------------------- - -- Stopped decoding ``%2F`` (``/``) in ``URL.path``, as this could lead to code incorrectly treating it as a path separator - -- by `@Dreamsorcerer <https://github.com/sponsors/Dreamsorcerer>`__. - - *Related issues and pull requests on GitHub:* - `#1057 <https://github.com/aio-libs/yarl/issues/1057>`__. - -- Dropped support for Python 3.7 -- by `@Dreamsorcerer <https://github.com/sponsors/Dreamsorcerer>`__. - - *Related issues and pull requests on GitHub:* - `#1016 <https://github.com/aio-libs/yarl/issues/1016>`__. - - -Improved documentation ----------------------- - -- On the ``Contributing docs`` page, - a link to the ``Towncrier philosophy`` has been fixed. - - *Related issues and pull requests on GitHub:* - `#981 <https://github.com/aio-libs/yarl/issues/981>`__. - -- The pre-existing ``/ magic method()`` - has been documented in the API reference -- by `@commonism <https://github.com/sponsors/commonism>`__. - - *Related issues and pull requests on GitHub:* - `#1026 <https://github.com/aio-libs/yarl/issues/1026>`__. - - -Packaging updates and notes for downstreams -------------------------------------------- - -- A flaw in the logic for copying the project directory into a - temporary folder that led to infinite recursion when ``TMPDIR`` - was set to a project subdirectory path. This was happening in Fedora - and its downstream due to the use of `pyproject-rpm-macros - <https://src.fedoraproject.org/rpms/pyproject-rpm-macros>`__. It was - only reproducible with ``pip wheel`` and was not affecting the - ``pyproject-build`` users. - - -- by `@hroncok <https://github.com/sponsors/hroncok>`__ and `@webknjaz <https://github.com/sponsors/webknjaz>`__ - - *Related issues and pull requests on GitHub:* - `#992 <https://github.com/aio-libs/yarl/issues/992>`__, `#1014 <https://github.com/aio-libs/yarl/issues/1014>`__. - -- Support Python 3.13 and publish non-free-threaded wheels - - *Related issues and pull requests on GitHub:* - `#1054 <https://github.com/aio-libs/yarl/issues/1054>`__. - - -Contributor-facing changes --------------------------- - -- The CI/CD setup has been updated to test ``arm64`` wheels - under macOS 14, except for Python 3.7 that is unsupported - in that environment -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__. - - *Related issues and pull requests on GitHub:* - `#1015 <https://github.com/aio-libs/yarl/issues/1015>`__. - -- Removed unused type ignores and casts -- by `@hauntsaninja <https://github.com/sponsors/hauntsaninja>`__. - - *Related issues and pull requests on GitHub:* - `#1031 <https://github.com/aio-libs/yarl/issues/1031>`__. - - -Miscellaneous internal changes ------------------------------- - -- ``port``, ``scheme``, and ``raw_host`` are now ``cached_property`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__. - - ``aiohttp`` accesses these properties quite often, which cause ``urllib`` to build the ``_hostinfo`` property every time. ``port``, ``scheme``, and ``raw_host`` are now cached properties, which will improve performance. - - *Related issues and pull requests on GitHub:* - `#1044 <https://github.com/aio-libs/yarl/issues/1044>`__, `#1058 <https://github.com/aio-libs/yarl/issues/1058>`__. - - ----- - - -1.9.4 (2023-12-06) -================== - -Bug fixes ---------- - -- Started raising ``TypeError`` when a string value is passed into - ``yarl.URL.build()`` as the ``port`` argument -- by `@commonism <https://github.com/sponsors/commonism>`__. - - Previously the empty string as port would create malformed URLs when rendered as string representations. (`#883 <https://github.com/aio-libs/yarl/issues/883>`__) - - -Packaging updates and notes for downstreams -------------------------------------------- - -- The leading ``--`` has been dropped from the `PEP 517 <https://peps.python.org/pep-517>`__ in-tree build - backend config setting names. ``--pure-python`` is now just ``pure-python`` - -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__. - - The usage now looks as follows: - - .. code-block:: console - - $ python -m build \ - --config-setting=pure-python=true \ - --config-setting=with-cython-tracing=true - - (`#963 <https://github.com/aio-libs/yarl/issues/963>`__) - - -Contributor-facing changes --------------------------- - -- A step-by-step ``Release Guide`` guide has - been added, describing how to release *yarl* -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__. - - This is primarily targeting maintainers. (`#960 <https://github.com/aio-libs/yarl/issues/960>`__) -- Coverage collection has been implemented for the Cython modules - -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__. - - It will also be reported to Codecov from any non-release CI jobs. - - To measure coverage in a development environment, *yarl* can be - installed in editable mode: - - .. code-block:: console - - $ python -Im pip install -e . - - Editable install produces C-files required for the Cython coverage - plugin to map the measurements back to the PYX-files. - - `#961 <https://github.com/aio-libs/yarl/issues/961>`__ - -- It is now possible to request line tracing in Cython builds using the - ``with-cython-tracing`` `PEP 517 <https://peps.python.org/pep-517>`__ config setting - -- `@webknjaz <https://github.com/sponsors/webknjaz>`__. - - This can be used in CI and development environment to measure coverage - on Cython modules, but is not normally useful to the end-users or - downstream packagers. - - Here's a usage example: - - .. code-block:: console - - $ python -Im pip install . --config-settings=with-cython-tracing=true - - For editable installs, this setting is on by default. Otherwise, it's - off unless requested explicitly. - - The following produces C-files required for the Cython coverage - plugin to map the measurements back to the PYX-files: - - .. code-block:: console - - $ python -Im pip install -e . - - Alternatively, the ``YARL_CYTHON_TRACING=1`` environment variable - can be set to do the same as the `PEP 517 <https://peps.python.org/pep-517>`__ config setting. - - `#962 <https://github.com/aio-libs/yarl/issues/962>`__ - - -1.9.3 (2023-11-20) -================== - -Bug fixes ---------- - -- Stopped dropping trailing slashes in ``yarl.URL.joinpath()`` -- by `@gmacon <https://github.com/sponsors/gmacon>`__. (`#862 <https://github.com/aio-libs/yarl/issues/862>`__, `#866 <https://github.com/aio-libs/yarl/issues/866>`__) -- Started accepting string subclasses in ``yarl.URL.__truediv__()`` operations (``URL / segment``) -- by `@mjpieters <https://github.com/sponsors/mjpieters>`__. (`#871 <https://github.com/aio-libs/yarl/issues/871>`__, `#884 <https://github.com/aio-libs/yarl/issues/884>`__) -- Fixed the human representation of URLs with square brackets in usernames and passwords -- by `@mjpieters <https://github.com/sponsors/mjpieters>`__. (`#876 <https://github.com/aio-libs/yarl/issues/876>`__, `#882 <https://github.com/aio-libs/yarl/issues/882>`__) -- Updated type hints to include ``URL.missing_port()``, ``URL.__bytes__()`` - and the ``encoding`` argument to ``yarl.URL.joinpath()`` - -- by `@mjpieters <https://github.com/sponsors/mjpieters>`__. (`#891 <https://github.com/aio-libs/yarl/issues/891>`__) - - -Packaging updates and notes for downstreams -------------------------------------------- - -- Integrated Cython 3 to enable building *yarl* under Python 3.12 -- by `@mjpieters <https://github.com/sponsors/mjpieters>`__. (`#829 <https://github.com/aio-libs/yarl/issues/829>`__, `#881 <https://github.com/aio-libs/yarl/issues/881>`__) -- Declared modern ``setuptools.build_meta`` as the `PEP 517 <https://peps.python.org/pep-517>`__ build - backend in ``pyproject.toml`` explicitly -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__. (`#886 <https://github.com/aio-libs/yarl/issues/886>`__) -- Converted most of the packaging setup into a declarative ``setup.cfg`` - config -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__. (`#890 <https://github.com/aio-libs/yarl/issues/890>`__) -- The packaging is replaced from an old-fashioned ``setup.py`` to an - in-tree `PEP 517 <https://peps.python.org/pep-517>`__ build backend -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__. - - Whenever the end-users or downstream packagers need to build ``yarl`` from - source (a Git checkout or an sdist), they may pass a ``config_settings`` - flag ``--pure-python``. If this flag is not set, a C-extension will be built - and included into the distribution. - - Here is how this can be done with ``pip``: - - .. code-block:: console - - $ python -m pip install . --config-settings=--pure-python=false - - This will also work with ``-e | --editable``. - - The same can be achieved via ``pypa/build``: - - .. code-block:: console - - $ python -m build --config-setting=--pure-python=false - - Adding ``-w | --wheel`` can force ``pypa/build`` produce a wheel from source - directly, as opposed to building an ``sdist`` and then building from it. (`#893 <https://github.com/aio-libs/yarl/issues/893>`__) - - .. attention:: - - v1.9.3 was the only version using the ``--pure-python`` setting name. - Later versions dropped the ``--`` prefix, making it just ``pure-python``. - -- Declared Python 3.12 supported officially in the distribution package metadata - -- by `@edgarrmondragon <https://github.com/sponsors/edgarrmondragon>`__. (`#942 <https://github.com/aio-libs/yarl/issues/942>`__) - - -Contributor-facing changes --------------------------- - -- A regression test for no-host URLs was added per `#821 <https://github.com/aio-libs/yarl/issues/821>`__ - and ``3986`` -- by `@kenballus <https://github.com/sponsors/kenballus>`__. (`#821 <https://github.com/aio-libs/yarl/issues/821>`__, `#822 <https://github.com/aio-libs/yarl/issues/822>`__) -- Started testing *yarl* against Python 3.12 in CI -- by `@mjpieters <https://github.com/sponsors/mjpieters>`__. (`#881 <https://github.com/aio-libs/yarl/issues/881>`__) -- All Python 3.12 jobs are now marked as required to pass in CI - -- by `@edgarrmondragon <https://github.com/sponsors/edgarrmondragon>`__. (`#942 <https://github.com/aio-libs/yarl/issues/942>`__) -- MyST is now integrated in Sphinx -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__. - - This allows the contributors to author new documents in Markdown - when they have difficulties with going straight RST. (`#953 <https://github.com/aio-libs/yarl/issues/953>`__) - - -1.9.2 (2023-04-25) -================== - -Bugfixes --------- - -- Fix regression with ``yarl.URL.__truediv__()`` and absolute URLs with empty paths causing the raw path to lack the leading ``/``. - (`#854 <https://github.com/aio-libs/yarl/issues/854>`_) - - -1.9.1 (2023-04-21) -================== - -Bugfixes --------- - -- Marked tests that fail on older Python patch releases (< 3.7.10, < 3.8.8 and < 3.9.2) as expected to fail due to missing a security fix for CVE-2021-23336. (`#850 <https://github.com/aio-libs/yarl/issues/850>`_) - - -1.9.0 (2023-04-19) -================== - -This release was never published to PyPI, due to issues with the build process. - -Features --------- - -- Added ``URL.joinpath(*elements)``, to create a new URL appending multiple path elements. (`#704 <https://github.com/aio-libs/yarl/issues/704>`_) -- Made ``URL.__truediv__()()`` return ``NotImplemented`` if called with an - unsupported type — by `@michaeljpeters <https://github.com/sponsors/michaeljpeters>`__. - (`#832 <https://github.com/aio-libs/yarl/issues/832>`_) - - -Bugfixes --------- - -- Path normalization for absolute URLs no longer raises a ValueError exception - when ``..`` segments would otherwise go beyond the URL path root. - (`#536 <https://github.com/aio-libs/yarl/issues/536>`_) -- Fixed an issue with update_query() not getting rid of the query when argument is None. (`#792 <https://github.com/aio-libs/yarl/issues/792>`_) -- Added some input restrictions on with_port() function to prevent invalid boolean inputs or out of valid port inputs; handled incorrect 0 port representation. (`#793 <https://github.com/aio-libs/yarl/issues/793>`_) -- Made ``yarl.URL.build()`` raise a ``TypeError`` if the ``host`` argument is ``None`` — by `@paulpapacz <https://github.com/sponsors/paulpapacz>`__. (`#808 <https://github.com/aio-libs/yarl/issues/808>`_) -- Fixed an issue with ``update_query()`` getting rid of the query when the argument - is empty but not ``None``. (`#845 <https://github.com/aio-libs/yarl/issues/845>`_) - - -Misc ----- - -- `#220 <https://github.com/aio-libs/yarl/issues/220>`_ - - -1.8.2 (2022-12-03) -================== - -This is the first release that started shipping wheels for Python 3.11. - - -1.8.1 (2022-08-01) -================== - -Misc ----- - -- `#694 <https://github.com/aio-libs/yarl/issues/694>`_, `#699 <https://github.com/aio-libs/yarl/issues/699>`_, `#700 <https://github.com/aio-libs/yarl/issues/700>`_, `#701 <https://github.com/aio-libs/yarl/issues/701>`_, `#702 <https://github.com/aio-libs/yarl/issues/702>`_, `#703 <https://github.com/aio-libs/yarl/issues/703>`_, `#739 <https://github.com/aio-libs/yarl/issues/739>`_ - - -1.8.0 (2022-08-01) -================== - -Features --------- - -- Added ``URL.raw_suffix``, ``URL.suffix``, ``URL.raw_suffixes``, ``URL.suffixes``, ``URL.with_suffix``. (`#613 <https://github.com/aio-libs/yarl/issues/613>`_) - - -Improved Documentation ----------------------- - -- Fixed broken internal references to ``yarl.URL.human_repr()``. - (`#665 <https://github.com/aio-libs/yarl/issues/665>`_) -- Fixed broken external references to ``multidict:index`` docs. (`#665 <https://github.com/aio-libs/yarl/issues/665>`_) - - -Deprecations and Removals -------------------------- - -- Dropped Python 3.6 support. (`#672 <https://github.com/aio-libs/yarl/issues/672>`_) - - -Misc ----- - -- `#646 <https://github.com/aio-libs/yarl/issues/646>`_, `#699 <https://github.com/aio-libs/yarl/issues/699>`_, `#701 <https://github.com/aio-libs/yarl/issues/701>`_ - - -1.7.2 (2021-11-01) -================== - -Bugfixes --------- - -- Changed call in ``with_port()`` to stop reencoding parts of the URL that were already encoded. (`#623 <https://github.com/aio-libs/yarl/issues/623>`_) - - -1.7.1 (2021-10-07) -================== - -Bugfixes --------- - -- Fix 1.7.0 build error - -1.7.0 (2021-10-06) -================== - -Features --------- - -- Add ``__bytes__()`` magic method so that ``bytes(url)`` will work and use optimal ASCII encoding. - (`#582 <https://github.com/aio-libs/yarl/issues/582>`_) -- Started shipping platform-specific arm64 wheels for Apple Silicon. (`#622 <https://github.com/aio-libs/yarl/issues/622>`_) -- Started shipping platform-specific wheels with the ``musl`` tag targeting typical Alpine Linux runtimes. (`#622 <https://github.com/aio-libs/yarl/issues/622>`_) -- Added support for Python 3.10. (`#622 <https://github.com/aio-libs/yarl/issues/622>`_) - - -1.6.3 (2020-11-14) -================== - -Bugfixes --------- - -- No longer loose characters when decoding incorrect percent-sequences (like ``%e2%82%f8``). All non-decodable percent-sequences are now preserved. - `#517 <https://github.com/aio-libs/yarl/issues/517>`_ -- Provide x86 Windows wheels. - `#535 <https://github.com/aio-libs/yarl/issues/535>`_ - - ----- - - -1.6.2 (2020-10-12) -================== - - -Bugfixes --------- - -- Provide generated ``.c`` files in TarBall distribution. - `#530 <https://github.com/aio-libs/multidict/issues/530>`_ - -1.6.1 (2020-10-12) -================== - -Features --------- - -- Provide wheels for ``aarch64``, ``i686``, ``ppc64le``, ``s390x`` architectures on - Linux as well as ``x86_64``. - `#507 <https://github.com/aio-libs/yarl/issues/507>`_ -- Provide wheels for Python 3.9. - `#526 <https://github.com/aio-libs/yarl/issues/526>`_ - -Bugfixes --------- - -- ``human_repr()`` now always produces valid representation equivalent to the original URL (if the original URL is valid). - `#511 <https://github.com/aio-libs/yarl/issues/511>`_ -- Fixed requoting a single percent followed by a percent-encoded character in the Cython implementation. - `#514 <https://github.com/aio-libs/yarl/issues/514>`_ -- Fix ValueError when decoding ``%`` which is not followed by two hexadecimal digits. - `#516 <https://github.com/aio-libs/yarl/issues/516>`_ -- Fix decoding ``%`` followed by a space and hexadecimal digit. - `#520 <https://github.com/aio-libs/yarl/issues/520>`_ -- Fix annotation of ``with_query()``/``update_query()`` methods for ``key=[val1, val2]`` case. - `#528 <https://github.com/aio-libs/yarl/issues/528>`_ - -Removal -------- - -- Drop Python 3.5 support; Python 3.6 is the minimal supported Python version. - - ----- - - -1.6.0 (2020-09-23) -================== - -Features --------- - -- Allow for int and float subclasses in query, while still denying bool. - `#492 <https://github.com/aio-libs/yarl/issues/492>`_ - - -Bugfixes --------- - -- Do not requote arguments in ``URL.build()``, ``with_xxx()`` and in ``/`` operator. - `#502 <https://github.com/aio-libs/yarl/issues/502>`_ -- Keep IPv6 brackets in ``origin()``. - `#504 <https://github.com/aio-libs/yarl/issues/504>`_ - - ----- - - -1.5.1 (2020-08-01) -================== - -Bugfixes --------- - -- Fix including relocated internal ``yarl._quoting_c`` C-extension into published PyPI dists. - `#485 <https://github.com/aio-libs/yarl/issues/485>`_ - - -Misc ----- - -- `#484 <https://github.com/aio-libs/yarl/issues/484>`_ - - ----- - - -1.5.0 (2020-07-26) -================== - -Features --------- - -- Convert host to lowercase on URL building. - `#386 <https://github.com/aio-libs/yarl/issues/386>`_ -- Allow using ``mod`` operator (``%``) for updating query string (an alias for ``update_query()`` method). - `#435 <https://github.com/aio-libs/yarl/issues/435>`_ -- Allow use of sequences such as ``list`` and ``tuple`` in the values - of a mapping such as ``dict`` to represent that a key has many values:: - - url = URL("http://example.com") - assert url.with_query({"a": [1, 2]}) == URL("http://example.com/?a=1&a=2") - - `#443 <https://github.com/aio-libs/yarl/issues/443>`_ -- Support ``URL.build()`` with scheme and path (creates a relative URL). - `#464 <https://github.com/aio-libs/yarl/issues/464>`_ -- Cache slow IDNA encode/decode calls. - `#476 <https://github.com/aio-libs/yarl/issues/476>`_ -- Add ``@final`` / ``Final`` type hints - `#477 <https://github.com/aio-libs/yarl/issues/477>`_ -- Support URL authority/raw_authority properties and authority argument of ``URL.build()`` method. - `#478 <https://github.com/aio-libs/yarl/issues/478>`_ -- Hide the library implementation details, make the exposed public list very clean. - `#483 <https://github.com/aio-libs/yarl/issues/483>`_ - - -Bugfixes --------- - -- Fix tests with newer Python (3.7.6, 3.8.1 and 3.9.0+). - `#409 <https://github.com/aio-libs/yarl/issues/409>`_ -- Fix a bug where query component, passed in a form of mapping or sequence, is unquoted in unexpected way. - `#426 <https://github.com/aio-libs/yarl/issues/426>`_ -- Hide ``Query`` and ``QueryVariable`` type aliases in ``__init__.pyi``, now they are prefixed with underscore. - `#431 <https://github.com/aio-libs/yarl/issues/431>`_ -- Keep IPv6 brackets after updating port/user/password. - `#451 <https://github.com/aio-libs/yarl/issues/451>`_ - - ----- - - -1.4.2 (2019-12-05) -================== - -Features --------- - -- Workaround for missing ``str.isascii()`` in Python 3.6 - `#389 <https://github.com/aio-libs/yarl/issues/389>`_ - - ----- - - -1.4.1 (2019-11-29) -================== - -* Fix regression, make the library work on Python 3.5 and 3.6 again. - -1.4.0 (2019-11-29) -================== - -* Distinguish an empty password in URL from a password not provided at all (#262) - -* Fixed annotations for optional parameters of ``URL.build`` (#309) - -* Use None as default value of ``user`` parameter of ``URL.build`` (#309) - -* Enforce building C Accelerated modules when installing from source tarball, use - ``YARL_NO_EXTENSIONS`` environment variable for falling back to (slower) Pure Python - implementation (#329) - -* Drop Python 3.5 support - -* Fix quoting of plus in path by pure python version (#339) - -* Don't create a new URL if fragment is unchanged (#292) - -* Included in error message the path that produces starting slash forbidden error (#376) - -* Skip slow IDNA encoding for ASCII-only strings (#387) - - -1.3.0 (2018-12-11) -================== - -* Fix annotations for ``query`` parameter (#207) - -* An incoming query sequence can have int variables (the same as for - Mapping type) (#208) - -* Add ``URL.explicit_port`` property (#218) - -* Give a friendlier error when port can't be converted to int (#168) - -* ``bool(URL())`` now returns ``False`` (#272) - -1.2.6 (2018-06-14) -================== - -* Drop Python 3.4 trove classifier (#205) - -1.2.5 (2018-05-23) -================== - -* Fix annotations for ``build`` (#199) - -1.2.4 (2018-05-08) -================== - -* Fix annotations for ``cached_property`` (#195) - -1.2.3 (2018-05-03) -================== - -* Accept ``str`` subclasses in ``URL`` constructor (#190) - -1.2.2 (2018-05-01) -================== - -* Fix build - -1.2.1 (2018-04-30) -================== - -* Pin minimal required Python to 3.5.3 (#189) - -1.2.0 (2018-04-30) -================== - -* Forbid inheritance, replace ``__init__`` with ``__new__`` (#171) - -* Support PEP-561 (provide type hinting marker) (#182) - -1.1.1 (2018-02-17) -================== - -* Fix performance regression: don't encode empty ``netloc`` (#170) - -1.1.0 (2018-01-21) -================== - -* Make pure Python quoter consistent with Cython version (#162) - -1.0.0 (2018-01-15) -================== - -* Use fast path if quoted string does not need requoting (#154) - -* Speed up quoting/unquoting by ``_Quoter`` and ``_Unquoter`` classes (#155) - -* Drop ``yarl.quote`` and ``yarl.unquote`` public functions (#155) - -* Add custom string writer, reuse static buffer if available (#157) - Code is 50-80 times faster than Pure Python version (was 4-5 times faster) - -* Don't recode IP zone (#144) - -* Support ``encoded=True`` in ``yarl.URL.build()`` (#158) - -* Fix updating query with multiple keys (#160) - -0.18.0 (2018-01-10) -=================== - -* Fallback to IDNA 2003 if domain name is not IDNA 2008 compatible (#152) - -0.17.0 (2017-12-30) -=================== - -* Use IDNA 2008 for domain name processing (#149) - -0.16.0 (2017-12-07) -=================== - -* Fix raising ``TypeError`` by ``url.query_string()`` after - ``url.with_query({})`` (empty mapping) (#141) - -0.15.0 (2017-11-23) -=================== - -* Add ``raw_path_qs`` attribute (#137) - -0.14.2 (2017-11-14) -=================== - -* Restore ``strict`` parameter as no-op in ``quote`` / ``unquote`` - -0.14.1 (2017-11-13) -=================== - -* Restore ``strict`` parameter as no-op for sake of compatibility with - aiohttp 2.2 - -0.14.0 (2017-11-11) -=================== - -* Drop strict mode (#123) - -* Fix ``"ValueError: Unallowed PCT %"`` when there's a ``"%"`` in the URL (#124) - -0.13.0 (2017-10-01) -=================== - -* Document ``encoded`` parameter (#102) - -* Support relative URLs like ``'?key=value'`` (#100) - -* Unsafe encoding for QS fixed. Encode ``;`` character in value parameter (#104) - -* Process passwords without user names (#95) - -0.12.0 (2017-06-26) -=================== - -* Properly support paths without leading slash in ``URL.with_path()`` (#90) - -* Enable type annotation checks - -0.11.0 (2017-06-26) -=================== - -* Normalize path (#86) - -* Clear query and fragment parts in ``.with_path()`` (#85) - -0.10.3 (2017-06-13) -=================== - -* Prevent double URL arguments unquoting (#83) - -0.10.2 (2017-05-05) -=================== - -* Unexpected hash behavior (#75) - - -0.10.1 (2017-05-03) -=================== - -* Unexpected compare behavior (#73) - -* Do not quote or unquote + if not a query string. (#74) - - -0.10.0 (2017-03-14) -=================== - -* Added ``URL.build`` class method (#58) - -* Added ``path_qs`` attribute (#42) - - -0.9.8 (2017-02-16) -================== - -* Do not quote ``:`` in path - - -0.9.7 (2017-02-16) -================== - -* Load from pickle without _cache (#56) - -* Percent-encoded pluses in path variables become spaces (#59) - - -0.9.6 (2017-02-15) -================== - -* Revert backward incompatible change (BaseURL) - - -0.9.5 (2017-02-14) -================== - -* Fix BaseURL rich comparison support - - -0.9.4 (2017-02-14) -================== - -* Use BaseURL - - -0.9.3 (2017-02-14) -================== - -* Added BaseURL - - -0.9.2 (2017-02-08) -================== - -* Remove debug print - - -0.9.1 (2017-02-07) -================== - -* Do not lose tail chars (#45) - - -0.9.0 (2017-02-07) -================== - -* Allow to quote ``%`` in non strict mode (#21) - -* Incorrect parsing of query parameters with %3B (;) inside (#34) - -* Fix core dumps (#41) - -* ``tmpbuf`` - compiling error (#43) - -* Added ``URL.update_path()`` method - -* Added ``URL.update_query()`` method (#47) - - -0.8.1 (2016-12-03) -================== - -* Fix broken aiohttp: revert back ``quote`` / ``unquote``. - - -0.8.0 (2016-12-03) -================== - -* Support more verbose error messages in ``.with_query()`` (#24) - -* Don't percent-encode ``@`` and ``:`` in path (#32) - -* Don't expose ``yarl.quote`` and ``yarl.unquote``, these functions are - part of private API - -0.7.1 (2016-11-18) -================== - -* Accept not only ``str`` but all classes inherited from ``str`` also (#25) - -0.7.0 (2016-11-07) -================== - -* Accept ``int`` as value for ``.with_query()`` - -0.6.0 (2016-11-07) -================== - -* Explicitly use UTF8 encoding in ``setup.py`` (#20) -* Properly unquote non-UTF8 strings (#19) - -0.5.3 (2016-11-02) -================== - -* Don't use ``typing.NamedTuple`` fields but indexes on URL construction - -0.5.2 (2016-11-02) -================== - -* Inline ``_encode`` class method - -0.5.1 (2016-11-02) -================== - -* Make URL construction faster by removing extra classmethod calls - -0.5.0 (2016-11-02) -================== - -* Add Cython optimization for quoting/unquoting -* Provide binary wheels - -0.4.3 (2016-09-29) -================== - -* Fix typing stubs - -0.4.2 (2016-09-29) -================== - -* Expose ``quote()`` and ``unquote()`` as public API - -0.4.1 (2016-09-28) -================== - -* Support empty values in query (``'/path?arg'``) - -0.4.0 (2016-09-27) -================== - -* Introduce ``relative()`` (#16) - -0.3.2 (2016-09-27) -================== - -* Typo fixes #15 - -0.3.1 (2016-09-26) -================== - -* Support sequence of pairs as ``with_query()`` parameter - -0.3.0 (2016-09-26) -================== - -* Introduce ``is_default_port()`` - -0.2.1 (2016-09-26) -================== - -* Raise ValueError for URLs like 'http://:8080/' - -0.2.0 (2016-09-18) -================== - -* Avoid doubling slashes when joining paths (#13) - -* Appending path starting from slash is forbidden (#12) - -0.1.4 (2016-09-09) -================== - -* Add ``kwargs`` support for ``with_query()`` (#10) - -0.1.3 (2016-09-07) -================== - -* Document ``with_query()``, ``with_fragment()`` and ``origin()`` - -* Allow ``None`` for ``with_query()`` and ``with_fragment()`` - -0.1.2 (2016-09-07) -================== - -* Fix links, tune docs theme. - -0.1.1 (2016-09-06) -================== - -* Update README, old version used obsolete API - -0.1.0 (2016-09-06) -================== - -* The library was deeply refactored, bytes are gone away but all - accepted strings are encoded if needed. - -0.0.1 (2016-08-30) -================== - -* The first release. diff --git a/venv/lib/python3.12/site-packages/yarl-1.20.1.dist-info/RECORD b/venv/lib/python3.12/site-packages/yarl-1.20.1.dist-info/RECORD deleted file mode 100644 index a37b4d9..0000000 --- a/venv/lib/python3.12/site-packages/yarl-1.20.1.dist-info/RECORD +++ /dev/null @@ -1,26 +0,0 @@ -yarl-1.20.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -yarl-1.20.1.dist-info/METADATA,sha256=K0Ly6Viwwz6MHtOCAIKJqkwQuDjjt9IydAitWzRQYvU,73903 -yarl-1.20.1.dist-info/RECORD,, -yarl-1.20.1.dist-info/WHEEL,sha256=aSgG0F4rGPZtV0iTEIfy6dtHq6g67Lze3uLfk0vWn88,151 -yarl-1.20.1.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358 -yarl-1.20.1.dist-info/licenses/NOTICE,sha256=VtasbIEFwKUTBMIdsGDjYa-ajqCvmnXCOcKLXRNpODg,609 -yarl-1.20.1.dist-info/top_level.txt,sha256=vf3SJuQh-k7YtvsUrV_OPOrT9Kqn0COlk7IPYyhtGkQ,5 -yarl/__init__.py,sha256=FmDW8W3VgBfoaLs4K0k3YLdvtu6eTRG39PjdZ20COf0,281 -yarl/__pycache__/__init__.cpython-312.pyc,, -yarl/__pycache__/_parse.cpython-312.pyc,, -yarl/__pycache__/_path.cpython-312.pyc,, -yarl/__pycache__/_query.cpython-312.pyc,, -yarl/__pycache__/_quoters.cpython-312.pyc,, -yarl/__pycache__/_quoting.cpython-312.pyc,, -yarl/__pycache__/_quoting_py.cpython-312.pyc,, -yarl/__pycache__/_url.cpython-312.pyc,, -yarl/_parse.py,sha256=gNt8zxVFGr95ufUQpSMiiZ9vDrvg4zq6MEtT3f6_8J0,7185 -yarl/_path.py,sha256=A0FJUylZyzmlT0a3UDOBbK-EzZXCAYuQQBvG9eAC9hs,1291 -yarl/_query.py,sha256=2l76j4_2qQ6vnwKRyGwhI5AXUpdlKGmmC4yp3ZjjevI,3883 -yarl/_quoters.py,sha256=z-BzsXfLnJK-bd-HrGaoKGri9L3GpDv6vxFEtmu-uCM,1154 -yarl/_quoting.py,sha256=yKIqFTzFzWLVb08xy1DSxKNjFwo4f-oLlzxTuKwC57M,506 -yarl/_quoting_c.cpython-312-x86_64-linux-gnu.so,sha256=kjAmisZBizo1YmiHrC6oO9iJKqBTkoYg56EztVsUmRU,1092184 -yarl/_quoting_c.pyx,sha256=Rk-98-kf1OwXTeU50UV8QjYks0wAQHpyPZk6McruIqk,14356 -yarl/_quoting_py.py,sha256=oVxVuDWMCjuvTViBiDzhYBFMI-YfDCNGGUbfnQpkOgQ,6830 -yarl/_url.py,sha256=7_9EhA9LbXjmK3zsAS4-WuMZgle7RovVK1pQGYVCL8k,55323 -yarl/py.typed,sha256=ay5OMO475PlcZ_Fbun9maHW7Y6MBTk0UXL4ztHx3Iug,14 diff --git a/venv/lib/python3.12/site-packages/yarl-1.20.1.dist-info/WHEEL b/venv/lib/python3.12/site-packages/yarl-1.20.1.dist-info/WHEEL deleted file mode 100644 index e21e9f2..0000000 --- a/venv/lib/python3.12/site-packages/yarl-1.20.1.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (80.9.0) -Root-Is-Purelib: false -Tag: cp312-cp312-manylinux_2_17_x86_64 -Tag: cp312-cp312-manylinux2014_x86_64 - diff --git a/venv/lib/python3.12/site-packages/yarl-1.20.1.dist-info/licenses/LICENSE b/venv/lib/python3.12/site-packages/yarl-1.20.1.dist-info/licenses/LICENSE deleted file mode 100644 index d645695..0000000 --- a/venv/lib/python3.12/site-packages/yarl-1.20.1.dist-info/licenses/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/venv/lib/python3.12/site-packages/yarl-1.20.1.dist-info/licenses/NOTICE b/venv/lib/python3.12/site-packages/yarl-1.20.1.dist-info/licenses/NOTICE deleted file mode 100644 index fa53b2b..0000000 --- a/venv/lib/python3.12/site-packages/yarl-1.20.1.dist-info/licenses/NOTICE +++ /dev/null @@ -1,13 +0,0 @@ - Copyright 2016-2021, Andrew Svetlov and aio-libs team - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/venv/lib/python3.12/site-packages/yarl-1.20.1.dist-info/top_level.txt b/venv/lib/python3.12/site-packages/yarl-1.20.1.dist-info/top_level.txt deleted file mode 100644 index e93e8bd..0000000 --- a/venv/lib/python3.12/site-packages/yarl-1.20.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -yarl diff --git a/venv/lib/python3.12/site-packages/yarl/__init__.py b/venv/lib/python3.12/site-packages/yarl/__init__.py deleted file mode 100644 index 8579787..0000000 --- a/venv/lib/python3.12/site-packages/yarl/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -from ._query import Query, QueryVariable, SimpleQuery -from ._url import URL, cache_clear, cache_configure, cache_info - -__version__ = "1.20.1" - -__all__ = ( - "URL", - "SimpleQuery", - "QueryVariable", - "Query", - "cache_clear", - "cache_configure", - "cache_info", -) diff --git a/venv/lib/python3.12/site-packages/yarl/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/yarl/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index ce9b078d4982bd905acd9165343a735797606b69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 477 zcmY+AzfT)66vutPkDOA}r4j>wzzvBB2&n@iOGi|xMRf3DId_l5!afJzUC^~l_$%1h z`?qwex_Jo_Q#T|wChQ~(yy4^bzJA~LEdS~Ed&tJ}{?}~JL+H^JZ{cr~=g&5|LnSIb zfuu(~=@VZDB=DT(i%>=+k}-*8LK2yh)an7*DMQlhqCEa@=b}6?(YF?KXZq{o2h*HQ z1eolc%ejEHn1?2~_<m-xf)z8Mg#f0_?zT|XC7-q$Om8Fb>QeoTN5jK|;V4gZY?tWB zA#?~F5{J}b$Kq?AnV4R?M{KUwjm~01+G?>G@!n%HN*ADOt}04RLMao1(%<OWy3k9B zXG#K=tf?3Hiz-?PRa4^z1WYxPgSz3x73e{!ZYrTz2^ue;T42E^c-}QLRUHjShq&eq z4Cbu3VpFJb$F#td@`^W<4(HuVdLmWX3OLmt?Naxd^}fYZ;CbE(9sfngD>VLx#t$Dp PEwiUE&HUR$@7j)6Gsl5L diff --git a/venv/lib/python3.12/site-packages/yarl/__pycache__/_parse.cpython-312.pyc b/venv/lib/python3.12/site-packages/yarl/__pycache__/_parse.cpython-312.pyc deleted file mode 100644 index e9526351c56becbe3b05139bee44f06799e9b961..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6989 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 diff --git a/venv/lib/python3.12/site-packages/yarl/__pycache__/_path.cpython-312.pyc b/venv/lib/python3.12/site-packages/yarl/__pycache__/_path.cpython-312.pyc deleted file mode 100644 index 74c6f8b6d6adbfd53e1ad0e5ecc800fbe891b10d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1431 zcmZuwO-vg{6n?Y2w$~VA8<X<Wpe%uuIuYK|q{^XHC=G3injkf(QiD`k8}EP@*1Ox; z<<B*$4>`~zQcW*#h$?zZ#ihse*mEyIP(fCzgjDswrE*H7NWQdh7Mmzh-fHLl%)Fm@ z@0;J_@fJX;{P;~F76SN-D@{T@prh-^)<K6U(1|XXq$o@Ygv+8S7Nsc(Wr+$j)Q#u# z5Dgzo(~=&(BTYs02o0e%gu0Bnyd2H6l={B#4Abxo>MGMVQx<JDXIL}JqTv-3NAn79 z_K@e!5MQ38U(Zu3Pr2;QI}W3+ixQnFQp<DwFr(f)v+{(WZ%_oei2u<)xU9nrtdKH{ z!B?LGtO#X6Cv$HDu#9)&;|UE<*lO6`0|I3-+w4Je8~Ij4##;;g+iLg{xIc`s#ktD> zF1ddhy?Gt4P+4eZ!1LE6C<E&%WB-nOw*V~ldOtn<!mmswp&y1Z%OcL<7FLR}>?QFQ zERsy5G(5&^M;XixDw?GuM`4=TMMYEGMk^J2T5&yw`f(HMLN+^5C)vaQkTL>`V$n>- z#fOZ<BrddEvvj)jF=ICKMaOphu;w__(la9CJ@Vr?7Ta8)dXA6J7csQUN1!N5T~iBo zk*Y<_a~ISxJ3k*xPW7lsXP8zTay=tIN7;~WFIuLp>6EDp)LKwY<F@K7dj;FNm>qss zbq$XWIa+>Bo1w0{tT9s!l4YG`ztgf=Q8SGa4NSS_%~(6uz{lX;#iatZFeqm$Hx3e= z|AHKPYgOEjwN(f1zW+>y_MQjlcT(q`0*MdoCwupjecQ>t-DLlB5e+qNJ%}f(SMN>j zw|4KfD%-8fX8MoTbF~!4dD;PTvO2zTbM5-(XWJcWO@`<jd-CaR`SixkU0FGZbv>54 zo_97Q)!i7D^B^^PA@tjY(CDS8FY&g$1mZBB2ta%X1$=&lgP0`{EJ6SlF#vHy7r9-R zbm)N<gwyN^sL`!Ky4VB{!XKaQERXvNc_&bR0nw&c3C~VKCN#l#*^C3ePSiu5DI@wJ z*TJXkOS86N1^q@$q;bm+<6E6JmI8n@!N5{{r|so&u^u#@!QZ`sO9c+%iOMHWBC)De z{d_I5aq)*XoLl>;)$o2IT^+4{w7Rq^9VF7<m%b})^xyloGQJ;6Rj;m(uZ{2aUi#(B zo!%=u9V6SZk;l@=5e9^bOw^C$a=M+*<@`k6HcguM4BK+E+U-2!&G1|Dw&l?!4>5NP zco83nFPR21j-jB$pMkx}Wqyac{6W#y=S_Nrokf-R!X3e-CK5uPz~J97@F$$9g-?<0 m&B8<Xr(z9Id?Y=Z{55*S#o9Y9<U_KNt^wzp>1P2C68sPMnOBYg diff --git a/venv/lib/python3.12/site-packages/yarl/__pycache__/_query.cpython-312.pyc b/venv/lib/python3.12/site-packages/yarl/__pycache__/_query.cpython-312.pyc deleted file mode 100644 index 89f5d785bc8259b4d459977b4076c898181828ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4798 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 N@}r+VBFprO{tH_(h}8f9 diff --git a/venv/lib/python3.12/site-packages/yarl/__pycache__/_quoters.cpython-312.pyc b/venv/lib/python3.12/site-packages/yarl/__pycache__/_quoters.cpython-312.pyc deleted file mode 100644 index 7ad0bf01554fc8b25a82c1de2537a40936407f46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2012 zcmZuxOKclO7@k?L*LK$LM;<LrU6qttRqVD&TJ=F2qa+~FhUQ^ZEGo<OtP`i}U1xTk z65|L{RicGTv=_37S0p$X#Yj0?oO<VyQXk@#I244Sw}^0noS0eLn^a;XkN^Mszxf~Y z|Fb{2TwQ>y%GdAD-(dmxjVhgGZwosJ0<a1YNCE^ABf>nBWFVC-q9xBJSt7H@Dq8bg zlFQqYHV7CXaEPnf*2zh_l6H!$w-k_c7<M~y5Kh;+r3ELuI%thwXWAHVU{2&hZo>7f zlN{+vI`{CJ*Yx0Oqm=72QFj~VYJStNr-ju5W`<sZ*vt%lR71g9$h7+nq?=$prk8+$ zxof>9E7(T*OeBO32#nB;4rZA?k~w;b$cOeLSq}BzWs^P22P20|(W#=W=A^lBT0-HX zwAj{)YEI0lIY9|$WgJdSUkMk|SXH9W>19NqZcRuzS)u|xAv~wo9$|D_in<f9?nosJ zUjm*WBpVhCT8SAwUt(e>A{L!h(pf=w6fmJ@Q~_by{0M^`<PXykDY2Jh=SNHIt0#_K zn2oS|2Ax?{T5QW6h<SRv4N&<7e}->puy^4Jk`PyvXnc~(0Lhxm%}FvAu#5VDEmu%y z3t~~xp)zUUI)??dh^0(>PzV(O>X#1F&W~hU1!bTxWiUeqwG2xH83Q+t0kFc93AzLn z_`qHU3+(|VW^<Jp1l9IX0#If;twhWh>{m>u`77YTahAkbu$l)=p)*Ff72mR8Gfk#| z*t_KP80c_2QD#8II=Kr6bj!)p*L9HDpCFz7A@bXKn{00aXcT$l2q}t`_<yBzoRdVL z)U~fD*a`O;T!j!kILd-$@Pp+xjKE3K0zRh{a86RwH$?%{s03r8Cv})n=!J*FyC^m< z=Y?24ttv~gF*#Gr3zDkDR6!Kxa5_JzsJYB70S_Yiwj|1FB;eSRAT7nj+|5{FS)G@q zq3Eg8F(s!8gN1bFR(eiQV#{eP#!|*?VkKHw-gR7@6C~li0=`u0pD*UqQp*^<D9V|% zs9cJgc5(?oq1&I}p9=WdAFm(L;5V+%U0-@0ovI}^POV>m8W?%vkN>OCdhWauff1Iz zgo2pP2)aea2=@?!&MwF~iHxq7D8{H^`fL?C58-eaAD|q5UoQACK@3Wk2o=!eom(F7 zJ^Pl+`|!;DcmD#6HFghf@y>_v<1<@c->T!0Lp!1^eivAq`nJ1jS#xe48hq-F-j8ov z33ZzTcE?96AFkZ}pyh^leR}r(S(12tvEh$D<>Q-de1}8=kzVq?Q%KIFQaYzD7syuw z(=2so5sT!SqvR8zw7RF;jeDaEjxaDCN1dBWyfr&Mt=p%^+Y)~*KKn+ht+))uv^l2| z<J0eSjP90ZT7513T6}u8L-9;Z$6voXK4}6z6EKh26O%7QGgZG4d?r3Io-#3hYGzMy zb>P&sD~TE1qNvzt#P<M)X@#^+yY`ED85Kq05*{HceMri$WZSkt2%BK|chLI_=>G#8 zf9CLNp@!pdg=_NuPtH~BO?OBet`65j4fo{=-}Lrqv(?##_jJY8^mJ<z)oeZZxY+Pq ztvH*$UM;)9)rT9t(TcknJh;|f9jgyCf}@+j*Yx*kOVwh-KT`1+rbh5MfuHfgPcD!k z-oCX!!#hBnhWgjg#!w@4b`$uU?jCKp;SSTdeVW?vzFcu_b9VR|d^n;7G^F)C2^`%9 a6sXR${x=f!p~r0f+>?><zYT+N2mb+;eee$e diff --git a/venv/lib/python3.12/site-packages/yarl/__pycache__/_quoting.cpython-312.pyc b/venv/lib/python3.12/site-packages/yarl/__pycache__/_quoting.cpython-312.pyc deleted file mode 100644 index 359db17c7b0caa58267b3138700d2a76dc7ee64f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 771 zcmZ8fO>fgc5S{fpiIdd*QiGse5JW;bv=&VzK7^2>5<vw`p)FG5LoGL6rA}?HSvv_9 zm;3~BDktuUU(qv{mL6Jdg^I+f7gXp4<;0p08kob(o9CVPW^I2|)eMN}ynDUXLjYgn zW)O)#;QX5aJ79r@9MJm}=}7dFBe__|2rR725|9Le#>im&qBh1Z@Bmrz2jLgTpy~=i zjmbVYoEuZaT_0PC?b`rMvXWv72NF?O+Dcj2$+{!@h^y)<f(WJIH#a)W-2gI{2bL8( z|98GBCfe`{SD}px%4uv=DIl({RiBlOg~#QECySLw1&ODO=S><C#?!_N?`0oOR!b{S zjmol7USBI$Ru`8mt2|Znqi~CQYp3x=3*%g(0mnfU@MIYIwpV9Z@IuZo9mg=Zyh*9U zQ^af8jCvf`NyycIB}Z-7cZf^8&<t&HM)pjX@T?JUAp{LSVzSU=@t5P7zjTdf7hRvS zu*?``@8MiLhMuKuQI}}083rxwA+0rI-9QV8L+Z?QXM)hKZ4)+Q(YEJM(;`f3iRCoM z-qiXxE6(1U(*iprGrn2dHtQtNB9l4Vz<Ab=ddhv5T1|&MU{{1`{3e1xq%({VI)?Ny zWIn^SFPZC|)b}Jz<le08=v{qhqr0(}zjKhgdoX^lqaNYpA<pgN+##Oc$J1}^Px$81 z)aA~S7?CHsODD3nCu?UiPRySub9>6%&!g<6AAsVvxUUq2Sz^8y#Q)arRi%`N-Mm_w J$Gb%&@-Kv_%b@@O diff --git a/venv/lib/python3.12/site-packages/yarl/__pycache__/_quoting_py.cpython-312.pyc b/venv/lib/python3.12/site-packages/yarl/__pycache__/_quoting_py.cpython-312.pyc deleted file mode 100644 index 09ae5a7b46f19e1a816e3c7c6e19576f0bea58b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8944 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 TdML2O(Zwi${ul1<gWUfBq1-~^ diff --git a/venv/lib/python3.12/site-packages/yarl/__pycache__/_url.cpython-312.pyc b/venv/lib/python3.12/site-packages/yarl/__pycache__/_url.cpython-312.pyc deleted file mode 100644 index 085c009222d7cc832e30cdb31b2f80eb7c9ca29c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60584 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 diff --git a/venv/lib/python3.12/site-packages/yarl/_parse.py b/venv/lib/python3.12/site-packages/yarl/_parse.py deleted file mode 100644 index 115d772..0000000 --- a/venv/lib/python3.12/site-packages/yarl/_parse.py +++ /dev/null @@ -1,203 +0,0 @@ -"""URL parsing utilities.""" - -import re -import unicodedata -from functools import lru_cache -from typing import Union -from urllib.parse import scheme_chars, uses_netloc - -from ._quoters import QUOTER, UNQUOTER_PLUS - -# Leading and trailing C0 control and space to be stripped per WHATWG spec. -# == "".join([chr(i) for i in range(0, 0x20 + 1)]) -WHATWG_C0_CONTROL_OR_SPACE = ( - "\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10" - "\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f " -) - -# Unsafe bytes to be removed per WHATWG spec -UNSAFE_URL_BYTES_TO_REMOVE = ["\t", "\r", "\n"] -USES_AUTHORITY = frozenset(uses_netloc) - -SplitURLType = tuple[str, str, str, str, str] - - -def split_url(url: str) -> SplitURLType: - """Split URL into parts.""" - # Adapted from urllib.parse.urlsplit - # Only lstrip url as some applications rely on preserving trailing space. - # (https://url.spec.whatwg.org/#concept-basic-url-parser would strip both) - url = url.lstrip(WHATWG_C0_CONTROL_OR_SPACE) - for b in UNSAFE_URL_BYTES_TO_REMOVE: - if b in url: - url = url.replace(b, "") - - scheme = netloc = query = fragment = "" - i = url.find(":") - if i > 0 and url[0] in scheme_chars: - for c in url[1:i]: - if c not in scheme_chars: - break - else: - scheme, url = url[:i].lower(), url[i + 1 :] - has_hash = "#" in url - has_question_mark = "?" in url - if url[:2] == "//": - delim = len(url) # position of end of domain part of url, default is end - if has_hash and has_question_mark: - delim_chars = "/?#" - elif has_question_mark: - delim_chars = "/?" - elif has_hash: - delim_chars = "/#" - else: - delim_chars = "/" - for c in delim_chars: # look for delimiters; the order is NOT important - wdelim = url.find(c, 2) # find first of this delim - if wdelim >= 0 and wdelim < delim: # if found - delim = wdelim # use earliest delim position - netloc = url[2:delim] - url = url[delim:] - has_left_bracket = "[" in netloc - has_right_bracket = "]" in netloc - if (has_left_bracket and not has_right_bracket) or ( - has_right_bracket and not has_left_bracket - ): - raise ValueError("Invalid IPv6 URL") - if has_left_bracket: - bracketed_host = netloc.partition("[")[2].partition("]")[0] - # Valid bracketed hosts are defined in - # https://www.rfc-editor.org/rfc/rfc3986#page-49 - # https://url.spec.whatwg.org/ - if bracketed_host and bracketed_host[0] == "v": - if not re.match(r"\Av[a-fA-F0-9]+\..+\Z", bracketed_host): - raise ValueError("IPvFuture address is invalid") - elif ":" not in bracketed_host: - raise ValueError("The IPv6 content between brackets is not valid") - if has_hash: - url, _, fragment = url.partition("#") - if has_question_mark: - url, _, query = url.partition("?") - if netloc and not netloc.isascii(): - _check_netloc(netloc) - return scheme, netloc, url, query, fragment - - -def _check_netloc(netloc: str) -> None: - # Adapted from urllib.parse._checknetloc - # looking for characters like \u2100 that expand to 'a/c' - # IDNA uses NFKC equivalence, so normalize for this check - - # ignore characters already included - # but not the surrounding text - n = netloc.replace("@", "").replace(":", "").replace("#", "").replace("?", "") - normalized_netloc = unicodedata.normalize("NFKC", n) - if n == normalized_netloc: - return - # Note that there are no unicode decompositions for the character '@' so - # its currently impossible to have test coverage for this branch, however if the - # one should be added in the future we want to make sure its still checked. - for c in "/?#@:": # pragma: no branch - if c in normalized_netloc: - raise ValueError( - f"netloc '{netloc}' contains invalid " - "characters under NFKC normalization" - ) - - -@lru_cache # match the same size as urlsplit -def split_netloc( - netloc: str, -) -> tuple[Union[str, None], Union[str, None], Union[str, None], Union[int, None]]: - """Split netloc into username, password, host and port.""" - if "@" not in netloc: - username: Union[str, None] = None - password: Union[str, None] = None - hostinfo = netloc - else: - userinfo, _, hostinfo = netloc.rpartition("@") - username, have_password, password = userinfo.partition(":") - if not have_password: - password = None - - if "[" in hostinfo: - _, _, bracketed = hostinfo.partition("[") - hostname, _, port_str = bracketed.partition("]") - _, _, port_str = port_str.partition(":") - else: - hostname, _, port_str = hostinfo.partition(":") - - if not port_str: - return username or None, password, hostname or None, None - - try: - port = int(port_str) - except ValueError: - raise ValueError("Invalid URL: port can't be converted to integer") - if not (0 <= port <= 65535): - raise ValueError("Port out of range 0-65535") - return username or None, password, hostname or None, port - - -def unsplit_result( - scheme: str, netloc: str, url: str, query: str, fragment: str -) -> str: - """Unsplit a URL without any normalization.""" - if netloc or (scheme and scheme in USES_AUTHORITY) or url[:2] == "//": - if url and url[:1] != "/": - url = f"{scheme}://{netloc}/{url}" if scheme else f"{scheme}:{url}" - else: - url = f"{scheme}://{netloc}{url}" if scheme else f"//{netloc}{url}" - elif scheme: - url = f"{scheme}:{url}" - if query: - url = f"{url}?{query}" - return f"{url}#{fragment}" if fragment else url - - -@lru_cache # match the same size as urlsplit -def make_netloc( - user: Union[str, None], - password: Union[str, None], - host: Union[str, None], - port: Union[int, None], - encode: bool = False, -) -> str: - """Make netloc from parts. - - The user and password are encoded if encode is True. - - The host must already be encoded with _encode_host. - """ - if host is None: - return "" - ret = host - if port is not None: - ret = f"{ret}:{port}" - if user is None and password is None: - return ret - if password is not None: - if not user: - user = "" - elif encode: - user = QUOTER(user) - if encode: - password = QUOTER(password) - user = f"{user}:{password}" - elif user and encode: - user = QUOTER(user) - return f"{user}@{ret}" if user else ret - - -def query_to_pairs(query_string: str) -> list[tuple[str, str]]: - """Parse a query given as a string argument. - - Works like urllib.parse.parse_qsl with keep empty values. - """ - pairs: list[tuple[str, str]] = [] - if not query_string: - return pairs - for k_v in query_string.split("&"): - k, _, v = k_v.partition("=") - pairs.append((UNQUOTER_PLUS(k), UNQUOTER_PLUS(v))) - return pairs diff --git a/venv/lib/python3.12/site-packages/yarl/_path.py b/venv/lib/python3.12/site-packages/yarl/_path.py deleted file mode 100644 index c22f0b4..0000000 --- a/venv/lib/python3.12/site-packages/yarl/_path.py +++ /dev/null @@ -1,41 +0,0 @@ -"""Utilities for working with paths.""" - -from collections.abc import Sequence -from contextlib import suppress - - -def normalize_path_segments(segments: Sequence[str]) -> list[str]: - """Drop '.' and '..' from a sequence of str segments""" - - resolved_path: list[str] = [] - - for seg in segments: - if seg == "..": - # ignore any .. segments that would otherwise cause an - # IndexError when popped from resolved_path if - # resolving for rfc3986 - with suppress(IndexError): - resolved_path.pop() - elif seg != ".": - resolved_path.append(seg) - - if segments and segments[-1] in (".", ".."): - # do some post-processing here. - # if the last segment was a relative dir, - # then we need to append the trailing '/' - resolved_path.append("") - - return resolved_path - - -def normalize_path(path: str) -> str: - # Drop '.' and '..' from str path - prefix = "" - if path and path[0] == "/": - # preserve the "/" root element of absolute paths, copying it to the - # normalised output as per sections 5.2.4 and 6.2.2.3 of rfc3986. - prefix = "/" - path = path[1:] - - segments = path.split("/") - return prefix + "/".join(normalize_path_segments(segments)) diff --git a/venv/lib/python3.12/site-packages/yarl/_query.py b/venv/lib/python3.12/site-packages/yarl/_query.py deleted file mode 100644 index 910bc87..0000000 --- a/venv/lib/python3.12/site-packages/yarl/_query.py +++ /dev/null @@ -1,114 +0,0 @@ -"""Query string handling.""" - -import math -from collections.abc import Iterable, Mapping, Sequence -from typing import Any, SupportsInt, Union - -from multidict import istr - -from ._quoters import QUERY_PART_QUOTER, QUERY_QUOTER - -SimpleQuery = Union[str, SupportsInt, float] -QueryVariable = Union[SimpleQuery, Sequence[SimpleQuery]] -Query = Union[ - None, str, Mapping[str, QueryVariable], Sequence[tuple[str, QueryVariable]] -] - - -def query_var(v: SimpleQuery) -> str: - """Convert a query variable to a string.""" - cls = type(v) - if cls is int: # Fast path for non-subclassed int - return str(v) - if isinstance(v, str): - return v - if isinstance(v, float): - if math.isinf(v): - raise ValueError("float('inf') is not supported") - if math.isnan(v): - raise ValueError("float('nan') is not supported") - return str(float(v)) - if cls is not bool and isinstance(v, SupportsInt): - return str(int(v)) - raise TypeError( - "Invalid variable type: value " - "should be str, int or float, got {!r} " - "of type {}".format(v, cls) - ) - - -def get_str_query_from_sequence_iterable( - items: Iterable[tuple[Union[str, istr], QueryVariable]], -) -> str: - """Return a query string from a sequence of (key, value) pairs. - - value is a single value or a sequence of values for the key - - The sequence of values must be a list or tuple. - """ - quoter = QUERY_PART_QUOTER - pairs = [ - f"{quoter(k)}={quoter(v if type(v) is str else query_var(v))}" - for k, val in items - for v in ( - val if type(val) is not str and isinstance(val, (list, tuple)) else (val,) - ) - ] - return "&".join(pairs) - - -def get_str_query_from_iterable( - items: Iterable[tuple[Union[str, istr], SimpleQuery]], -) -> str: - """Return a query string from an iterable. - - The iterable must contain (key, value) pairs. - - The values are not allowed to be sequences, only single values are - allowed. For sequences, use `_get_str_query_from_sequence_iterable`. - """ - quoter = QUERY_PART_QUOTER - # A listcomp is used since listcomps are inlined on CPython 3.12+ and - # they are a bit faster than a generator expression. - pairs = [ - f"{quoter(k)}={quoter(v if type(v) is str else query_var(v))}" for k, v in items - ] - return "&".join(pairs) - - -def get_str_query(*args: Any, **kwargs: Any) -> Union[str, None]: - """Return a query string from supported args.""" - query: Union[str, Mapping[str, QueryVariable], None] - if kwargs: - if args: - msg = "Either kwargs or single query parameter must be present" - raise ValueError(msg) - query = kwargs - elif len(args) == 1: - query = args[0] - else: - raise ValueError("Either kwargs or single query parameter must be present") - - if query is None: - return None - if not query: - return "" - if type(query) is dict: - return get_str_query_from_sequence_iterable(query.items()) - if type(query) is str or isinstance(query, str): - return QUERY_QUOTER(query) - if isinstance(query, Mapping): - return get_str_query_from_sequence_iterable(query.items()) - if isinstance(query, (bytes, bytearray, memoryview)): # type: ignore[unreachable] - msg = "Invalid query type: bytes, bytearray and memoryview are forbidden" - raise TypeError(msg) - if isinstance(query, Sequence): - # We don't expect sequence values if we're given a list of pairs - # already; only mappings like builtin `dict` which can't have the - # same key pointing to multiple values are allowed to use - # `_query_seq_pairs`. - return get_str_query_from_iterable(query) - raise TypeError( - "Invalid query type: only str, mapping or " - "sequence of (key, value) pairs is allowed" - ) diff --git a/venv/lib/python3.12/site-packages/yarl/_quoters.py b/venv/lib/python3.12/site-packages/yarl/_quoters.py deleted file mode 100644 index 0feb5b1..0000000 --- a/venv/lib/python3.12/site-packages/yarl/_quoters.py +++ /dev/null @@ -1,33 +0,0 @@ -"""Quoting and unquoting utilities for URL parts.""" - -from typing import Union -from urllib.parse import quote - -from ._quoting import _Quoter, _Unquoter - -QUOTER = _Quoter(requote=False) -REQUOTER = _Quoter() -PATH_QUOTER = _Quoter(safe="@:", protected="/+", requote=False) -PATH_REQUOTER = _Quoter(safe="@:", protected="/+") -QUERY_QUOTER = _Quoter(safe="?/:@", protected="=+&;", qs=True, requote=False) -QUERY_REQUOTER = _Quoter(safe="?/:@", protected="=+&;", qs=True) -QUERY_PART_QUOTER = _Quoter(safe="?/:@", qs=True, requote=False) -FRAGMENT_QUOTER = _Quoter(safe="?/:@", requote=False) -FRAGMENT_REQUOTER = _Quoter(safe="?/:@") - -UNQUOTER = _Unquoter() -PATH_UNQUOTER = _Unquoter(unsafe="+") -PATH_SAFE_UNQUOTER = _Unquoter(ignore="/%", unsafe="+") -QS_UNQUOTER = _Unquoter(qs=True) -UNQUOTER_PLUS = _Unquoter(plus=True) # to match urllib.parse.unquote_plus - - -def human_quote(s: Union[str, None], unsafe: str) -> Union[str, None]: - if not s: - return s - for c in "%" + unsafe: - if c in s: - s = s.replace(c, f"%{ord(c):02X}") - if s.isprintable(): - return s - return "".join(c if c.isprintable() else quote(c) for c in s) diff --git a/venv/lib/python3.12/site-packages/yarl/_quoting.py b/venv/lib/python3.12/site-packages/yarl/_quoting.py deleted file mode 100644 index 25d76c8..0000000 --- a/venv/lib/python3.12/site-packages/yarl/_quoting.py +++ /dev/null @@ -1,19 +0,0 @@ -import os -import sys -from typing import TYPE_CHECKING - -__all__ = ("_Quoter", "_Unquoter") - - -NO_EXTENSIONS = bool(os.environ.get("YARL_NO_EXTENSIONS")) # type: bool -if sys.implementation.name != "cpython": - NO_EXTENSIONS = True - - -if TYPE_CHECKING or NO_EXTENSIONS: - from ._quoting_py import _Quoter, _Unquoter -else: - try: - from ._quoting_c import _Quoter, _Unquoter - except ImportError: # pragma: no cover - from ._quoting_py import _Quoter, _Unquoter # type: ignore[assignment] diff --git a/venv/lib/python3.12/site-packages/yarl/_quoting_c.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/yarl/_quoting_c.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index 6a0f1f6be9019579412338747f74b73ce93bfaf4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1092184 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%0D<&E3){dA~DPvpxw1YOXs(XJN$L9Eh2~#AGGt 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 diff --git a/venv/lib/python3.12/site-packages/yarl/_quoting_c.pyx b/venv/lib/python3.12/site-packages/yarl/_quoting_c.pyx deleted file mode 100644 index 91b0644..0000000 --- a/venv/lib/python3.12/site-packages/yarl/_quoting_c.pyx +++ /dev/null @@ -1,453 +0,0 @@ -# cython: language_level=3, freethreading_compatible=True - -from cpython.exc cimport PyErr_NoMemory -from cpython.mem cimport PyMem_Free, PyMem_Malloc, PyMem_Realloc -from cpython.unicode cimport ( - PyUnicode_DATA, - PyUnicode_DecodeASCII, - PyUnicode_DecodeUTF8Stateful, - PyUnicode_GET_LENGTH, - PyUnicode_KIND, - PyUnicode_READ, -) -from libc.stdint cimport uint8_t, uint64_t -from libc.string cimport memcpy, memset - -from string import ascii_letters, digits - - -cdef str GEN_DELIMS = ":/?#[]@" -cdef str SUB_DELIMS_WITHOUT_QS = "!$'()*," -cdef str SUB_DELIMS = SUB_DELIMS_WITHOUT_QS + '+?=;' -cdef str RESERVED = GEN_DELIMS + SUB_DELIMS -cdef str UNRESERVED = ascii_letters + digits + '-._~' -cdef str ALLOWED = UNRESERVED + SUB_DELIMS_WITHOUT_QS -cdef str QS = '+&=;' - -DEF BUF_SIZE = 8 * 1024 # 8KiB - -cdef inline Py_UCS4 _to_hex(uint8_t v) noexcept: - if v < 10: - return <Py_UCS4>(v+0x30) # ord('0') == 0x30 - else: - return <Py_UCS4>(v+0x41-10) # ord('A') == 0x41 - - -cdef inline int _from_hex(Py_UCS4 v) noexcept: - if '0' <= v <= '9': - return <int>(v) - 0x30 # ord('0') == 0x30 - elif 'A' <= v <= 'F': - return <int>(v) - 0x41 + 10 # ord('A') == 0x41 - elif 'a' <= v <= 'f': - return <int>(v) - 0x61 + 10 # ord('a') == 0x61 - else: - return -1 - - -cdef inline int _is_lower_hex(Py_UCS4 v) noexcept: - return 'a' <= v <= 'f' - - -cdef inline long _restore_ch(Py_UCS4 d1, Py_UCS4 d2): - cdef int digit1 = _from_hex(d1) - if digit1 < 0: - return -1 - cdef int digit2 = _from_hex(d2) - if digit2 < 0: - return -1 - return digit1 << 4 | digit2 - - -cdef uint8_t ALLOWED_TABLE[16] -cdef uint8_t ALLOWED_NOTQS_TABLE[16] - - -cdef inline bint bit_at(uint8_t array[], uint64_t ch) noexcept: - return array[ch >> 3] & (1 << (ch & 7)) - - -cdef inline void set_bit(uint8_t array[], uint64_t ch) noexcept: - array[ch >> 3] |= (1 << (ch & 7)) - - -memset(ALLOWED_TABLE, 0, sizeof(ALLOWED_TABLE)) -memset(ALLOWED_NOTQS_TABLE, 0, sizeof(ALLOWED_NOTQS_TABLE)) - -for i in range(128): - if chr(i) in ALLOWED: - set_bit(ALLOWED_TABLE, i) - set_bit(ALLOWED_NOTQS_TABLE, i) - if chr(i) in QS: - set_bit(ALLOWED_NOTQS_TABLE, i) - -# ----------------- writer --------------------------- - -cdef struct Writer: - char *buf - bint heap_allocated_buf - Py_ssize_t size - Py_ssize_t pos - bint changed - - -cdef inline void _init_writer(Writer* writer, char* buf): - writer.buf = buf - writer.heap_allocated_buf = False - writer.size = BUF_SIZE - writer.pos = 0 - writer.changed = 0 - - -cdef inline void _release_writer(Writer* writer): - if writer.heap_allocated_buf: - PyMem_Free(writer.buf) - - -cdef inline int _write_char(Writer* writer, Py_UCS4 ch, bint changed): - cdef char * buf - cdef Py_ssize_t size - - if writer.pos == writer.size: - # reallocate - size = writer.size + BUF_SIZE - if not writer.heap_allocated_buf: - buf = <char*>PyMem_Malloc(size) - if buf == NULL: - PyErr_NoMemory() - return -1 - memcpy(buf, writer.buf, writer.size) - writer.heap_allocated_buf = True - else: - buf = <char*>PyMem_Realloc(writer.buf, size) - if buf == NULL: - PyErr_NoMemory() - return -1 - writer.buf = buf - writer.size = size - writer.buf[writer.pos] = <char>ch - writer.pos += 1 - writer.changed |= changed - return 0 - - -cdef inline int _write_pct(Writer* writer, uint8_t ch, bint changed): - if _write_char(writer, '%', changed) < 0: - return -1 - if _write_char(writer, _to_hex(<uint8_t>ch >> 4), changed) < 0: - return -1 - return _write_char(writer, _to_hex(<uint8_t>ch & 0x0f), changed) - - -cdef inline int _write_utf8(Writer* writer, Py_UCS4 symbol): - cdef uint64_t utf = <uint64_t> symbol - - if utf < 0x80: - return _write_pct(writer, <uint8_t>utf, True) - elif utf < 0x800: - if _write_pct(writer, <uint8_t>(0xc0 | (utf >> 6)), True) < 0: - return -1 - return _write_pct(writer, <uint8_t>(0x80 | (utf & 0x3f)), True) - elif 0xD800 <= utf <= 0xDFFF: - # surogate pair, ignored - return 0 - elif utf < 0x10000: - if _write_pct(writer, <uint8_t>(0xe0 | (utf >> 12)), True) < 0: - return -1 - if _write_pct(writer, <uint8_t>(0x80 | ((utf >> 6) & 0x3f)), - True) < 0: - return -1 - return _write_pct(writer, <uint8_t>(0x80 | (utf & 0x3f)), True) - elif utf > 0x10FFFF: - # symbol is too large - return 0 - else: - if _write_pct(writer, <uint8_t>(0xf0 | (utf >> 18)), True) < 0: - return -1 - if _write_pct(writer, <uint8_t>(0x80 | ((utf >> 12) & 0x3f)), - True) < 0: - return -1 - if _write_pct(writer, <uint8_t>(0x80 | ((utf >> 6) & 0x3f)), - True) < 0: - return -1 - return _write_pct(writer, <uint8_t>(0x80 | (utf & 0x3f)), True) - - -# --------------------- end writer -------------------------- - - -cdef class _Quoter: - cdef bint _qs - cdef bint _requote - - cdef uint8_t _safe_table[16] - cdef uint8_t _protected_table[16] - - def __init__( - self, *, str safe='', str protected='', bint qs=False, bint requote=True, - ): - cdef Py_UCS4 ch - - self._qs = qs - self._requote = requote - - if not self._qs: - memcpy(self._safe_table, - ALLOWED_NOTQS_TABLE, - sizeof(self._safe_table)) - else: - memcpy(self._safe_table, - ALLOWED_TABLE, - sizeof(self._safe_table)) - for ch in safe: - if ord(ch) > 127: - raise ValueError("Only safe symbols with ORD < 128 are allowed") - set_bit(self._safe_table, ch) - - memset(self._protected_table, 0, sizeof(self._protected_table)) - for ch in protected: - if ord(ch) > 127: - raise ValueError("Only safe symbols with ORD < 128 are allowed") - set_bit(self._safe_table, ch) - set_bit(self._protected_table, ch) - - def __call__(self, val): - if val is None: - return None - if type(val) is not str: - if isinstance(val, str): - # derived from str - val = str(val) - else: - raise TypeError("Argument should be str") - return self._do_quote_or_skip(<str>val) - - cdef str _do_quote_or_skip(self, str val): - cdef char[BUF_SIZE] buffer - cdef Py_UCS4 ch - cdef Py_ssize_t length = PyUnicode_GET_LENGTH(val) - cdef Py_ssize_t idx = length - cdef bint must_quote = 0 - cdef Writer writer - cdef int kind = PyUnicode_KIND(val) - cdef const void *data = PyUnicode_DATA(val) - - # If everything in the string is in the safe - # table and all ASCII, we can skip quoting - while idx: - idx -= 1 - ch = PyUnicode_READ(kind, data, idx) - if ch >= 128 or not bit_at(self._safe_table, ch): - must_quote = 1 - break - - if not must_quote: - return val - - _init_writer(&writer, &buffer[0]) - try: - return self._do_quote(<str>val, length, kind, data, &writer) - finally: - _release_writer(&writer) - - cdef str _do_quote( - self, - str val, - Py_ssize_t length, - int kind, - const void *data, - Writer *writer - ): - cdef Py_UCS4 ch - cdef long chl - cdef int changed - cdef Py_ssize_t idx = 0 - - while idx < length: - ch = PyUnicode_READ(kind, data, idx) - idx += 1 - if ch == '%' and self._requote and idx <= length - 2: - chl = _restore_ch( - PyUnicode_READ(kind, data, idx), - PyUnicode_READ(kind, data, idx + 1) - ) - if chl != -1: - ch = <Py_UCS4>chl - idx += 2 - if ch < 128: - if bit_at(self._protected_table, ch): - if _write_pct(writer, ch, True) < 0: - raise - continue - - if bit_at(self._safe_table, ch): - if _write_char(writer, ch, True) < 0: - raise - continue - - changed = (_is_lower_hex(PyUnicode_READ(kind, data, idx - 2)) or - _is_lower_hex(PyUnicode_READ(kind, data, idx - 1))) - if _write_pct(writer, ch, changed) < 0: - raise - continue - else: - ch = '%' - - if self._write(writer, ch) < 0: - raise - - if not writer.changed: - return val - else: - return PyUnicode_DecodeASCII(writer.buf, writer.pos, "strict") - - cdef inline int _write(self, Writer *writer, Py_UCS4 ch): - if self._qs: - if ch == ' ': - return _write_char(writer, '+', True) - - if ch < 128 and bit_at(self._safe_table, ch): - return _write_char(writer, ch, False) - - return _write_utf8(writer, ch) - - -cdef class _Unquoter: - cdef str _ignore - cdef bint _has_ignore - cdef str _unsafe - cdef bytes _unsafe_bytes - cdef Py_ssize_t _unsafe_bytes_len - cdef const unsigned char * _unsafe_bytes_char - cdef bint _qs - cdef bint _plus # to match urllib.parse.unquote_plus - cdef _Quoter _quoter - cdef _Quoter _qs_quoter - - def __init__(self, *, ignore="", unsafe="", qs=False, plus=False): - self._ignore = ignore - self._has_ignore = bool(self._ignore) - self._unsafe = unsafe - # unsafe may only be extended ascii characters (0-255) - self._unsafe_bytes = self._unsafe.encode('ascii') - self._unsafe_bytes_len = len(self._unsafe_bytes) - self._unsafe_bytes_char = self._unsafe_bytes - self._qs = qs - self._plus = plus - self._quoter = _Quoter() - self._qs_quoter = _Quoter(qs=True) - - def __call__(self, val): - if val is None: - return None - if type(val) is not str: - if isinstance(val, str): - # derived from str - val = str(val) - else: - raise TypeError("Argument should be str") - return self._do_unquote(<str>val) - - cdef str _do_unquote(self, str val): - cdef Py_ssize_t length = PyUnicode_GET_LENGTH(val) - if length == 0: - return val - - cdef list ret = [] - cdef char buffer[4] - cdef Py_ssize_t buflen = 0 - cdef Py_ssize_t consumed - cdef str unquoted - cdef Py_UCS4 ch = 0 - cdef long chl = 0 - cdef Py_ssize_t idx = 0 - cdef Py_ssize_t start_pct - cdef int kind = PyUnicode_KIND(val) - cdef const void *data = PyUnicode_DATA(val) - cdef bint changed = 0 - while idx < length: - ch = PyUnicode_READ(kind, data, idx) - idx += 1 - if ch == '%' and idx <= length - 2: - changed = 1 - chl = _restore_ch( - PyUnicode_READ(kind, data, idx), - PyUnicode_READ(kind, data, idx + 1) - ) - if chl != -1: - ch = <Py_UCS4>chl - idx += 2 - assert buflen < 4 - buffer[buflen] = ch - buflen += 1 - try: - unquoted = PyUnicode_DecodeUTF8Stateful(buffer, buflen, - NULL, &consumed) - except UnicodeDecodeError: - start_pct = idx - buflen * 3 - buffer[0] = ch - buflen = 1 - ret.append(val[start_pct : idx - 3]) - try: - unquoted = PyUnicode_DecodeUTF8Stateful(buffer, buflen, - NULL, &consumed) - except UnicodeDecodeError: - buflen = 0 - ret.append(val[idx - 3 : idx]) - continue - if not unquoted: - assert consumed == 0 - continue - assert consumed == buflen - buflen = 0 - if self._qs and unquoted in '+=&;': - ret.append(self._qs_quoter(unquoted)) - elif ( - (self._unsafe_bytes_len and unquoted in self._unsafe) or - (self._has_ignore and unquoted in self._ignore) - ): - ret.append(self._quoter(unquoted)) - else: - ret.append(unquoted) - continue - else: - ch = '%' - - if buflen: - start_pct = idx - 1 - buflen * 3 - ret.append(val[start_pct : idx - 1]) - buflen = 0 - - if ch == '+': - if ( - (not self._qs and not self._plus) or - (self._unsafe_bytes_len and self._is_char_unsafe(ch)) - ): - ret.append('+') - else: - changed = 1 - ret.append(' ') - continue - - if self._unsafe_bytes_len and self._is_char_unsafe(ch): - changed = 1 - ret.append('%') - h = hex(ord(ch)).upper()[2:] - for ch in h: - ret.append(ch) - continue - - ret.append(ch) - - if not changed: - return val - - if buflen: - ret.append(val[length - buflen * 3 : length]) - - return ''.join(ret) - - cdef inline bint _is_char_unsafe(self, Py_UCS4 ch): - for i in range(self._unsafe_bytes_len): - if ch == self._unsafe_bytes_char[i]: - return True - return False diff --git a/venv/lib/python3.12/site-packages/yarl/_quoting_py.py b/venv/lib/python3.12/site-packages/yarl/_quoting_py.py deleted file mode 100644 index 4cc47bc..0000000 --- a/venv/lib/python3.12/site-packages/yarl/_quoting_py.py +++ /dev/null @@ -1,213 +0,0 @@ -import codecs -import re -from string import ascii_letters, ascii_lowercase, digits -from typing import Union, cast, overload - -BASCII_LOWERCASE = ascii_lowercase.encode("ascii") -BPCT_ALLOWED = {f"%{i:02X}".encode("ascii") for i in range(256)} -GEN_DELIMS = ":/?#[]@" -SUB_DELIMS_WITHOUT_QS = "!$'()*," -SUB_DELIMS = SUB_DELIMS_WITHOUT_QS + "+&=;" -RESERVED = GEN_DELIMS + SUB_DELIMS -UNRESERVED = ascii_letters + digits + "-._~" -ALLOWED = UNRESERVED + SUB_DELIMS_WITHOUT_QS - - -_IS_HEX = re.compile(b"[A-Z0-9][A-Z0-9]") -_IS_HEX_STR = re.compile("[A-Fa-f0-9][A-Fa-f0-9]") - -utf8_decoder = codecs.getincrementaldecoder("utf-8") - - -class _Quoter: - def __init__( - self, - *, - safe: str = "", - protected: str = "", - qs: bool = False, - requote: bool = True, - ) -> None: - self._safe = safe - self._protected = protected - self._qs = qs - self._requote = requote - - @overload - def __call__(self, val: str) -> str: ... - @overload - def __call__(self, val: None) -> None: ... - def __call__(self, val: Union[str, None]) -> Union[str, None]: - if val is None: - return None - if not isinstance(val, str): - raise TypeError("Argument should be str") - if not val: - return "" - bval = val.encode("utf8", errors="ignore") - ret = bytearray() - pct = bytearray() - safe = self._safe - safe += ALLOWED - if not self._qs: - safe += "+&=;" - safe += self._protected - bsafe = safe.encode("ascii") - idx = 0 - while idx < len(bval): - ch = bval[idx] - idx += 1 - - if pct: - if ch in BASCII_LOWERCASE: - ch = ch - 32 # convert to uppercase - pct.append(ch) - if len(pct) == 3: # pragma: no branch # peephole optimizer - buf = pct[1:] - if not _IS_HEX.match(buf): - ret.extend(b"%25") - pct.clear() - idx -= 2 - continue - try: - unquoted = chr(int(pct[1:].decode("ascii"), base=16)) - except ValueError: - ret.extend(b"%25") - pct.clear() - idx -= 2 - continue - - if unquoted in self._protected: - ret.extend(pct) - elif unquoted in safe: - ret.append(ord(unquoted)) - else: - ret.extend(pct) - pct.clear() - - # special case, if we have only one char after "%" - elif len(pct) == 2 and idx == len(bval): - ret.extend(b"%25") - pct.clear() - idx -= 1 - - continue - - elif ch == ord("%") and self._requote: - pct.clear() - pct.append(ch) - - # special case if "%" is last char - if idx == len(bval): - ret.extend(b"%25") - - continue - - if self._qs and ch == ord(" "): - ret.append(ord("+")) - continue - if ch in bsafe: - ret.append(ch) - continue - - ret.extend((f"%{ch:02X}").encode("ascii")) - - ret2 = ret.decode("ascii") - if ret2 == val: - return val - return ret2 - - -class _Unquoter: - def __init__( - self, - *, - ignore: str = "", - unsafe: str = "", - qs: bool = False, - plus: bool = False, - ) -> None: - self._ignore = ignore - self._unsafe = unsafe - self._qs = qs - self._plus = plus # to match urllib.parse.unquote_plus - self._quoter = _Quoter() - self._qs_quoter = _Quoter(qs=True) - - @overload - def __call__(self, val: str) -> str: ... - @overload - def __call__(self, val: None) -> None: ... - def __call__(self, val: Union[str, None]) -> Union[str, None]: - if val is None: - return None - if not isinstance(val, str): - raise TypeError("Argument should be str") - if not val: - return "" - decoder = cast(codecs.BufferedIncrementalDecoder, utf8_decoder()) - ret = [] - idx = 0 - while idx < len(val): - ch = val[idx] - idx += 1 - if ch == "%" and idx <= len(val) - 2: - pct = val[idx : idx + 2] - if _IS_HEX_STR.fullmatch(pct): - b = bytes([int(pct, base=16)]) - idx += 2 - try: - unquoted = decoder.decode(b) - except UnicodeDecodeError: - start_pct = idx - 3 - len(decoder.buffer) * 3 - ret.append(val[start_pct : idx - 3]) - decoder.reset() - try: - unquoted = decoder.decode(b) - except UnicodeDecodeError: - ret.append(val[idx - 3 : idx]) - continue - if not unquoted: - continue - if self._qs and unquoted in "+=&;": - to_add = self._qs_quoter(unquoted) - if to_add is None: # pragma: no cover - raise RuntimeError("Cannot quote None") - ret.append(to_add) - elif unquoted in self._unsafe or unquoted in self._ignore: - to_add = self._quoter(unquoted) - if to_add is None: # pragma: no cover - raise RuntimeError("Cannot quote None") - ret.append(to_add) - else: - ret.append(unquoted) - continue - - if decoder.buffer: - start_pct = idx - 1 - len(decoder.buffer) * 3 - ret.append(val[start_pct : idx - 1]) - decoder.reset() - - if ch == "+": - if (not self._qs and not self._plus) or ch in self._unsafe: - ret.append("+") - else: - ret.append(" ") - continue - - if ch in self._unsafe: - ret.append("%") - h = hex(ord(ch)).upper()[2:] - for ch in h: - ret.append(ch) - continue - - ret.append(ch) - - if decoder.buffer: - ret.append(val[-len(decoder.buffer) * 3 :]) - - ret2 = "".join(ret) - if ret2 == val: - return val - return ret2 diff --git a/venv/lib/python3.12/site-packages/yarl/_url.py b/venv/lib/python3.12/site-packages/yarl/_url.py deleted file mode 100644 index 1fa347f..0000000 --- a/venv/lib/python3.12/site-packages/yarl/_url.py +++ /dev/null @@ -1,1604 +0,0 @@ -import re -import sys -import warnings -from collections.abc import Mapping, Sequence -from enum import Enum -from functools import _CacheInfo, lru_cache -from ipaddress import ip_address -from typing import TYPE_CHECKING, Any, NoReturn, TypedDict, TypeVar, Union, overload -from urllib.parse import SplitResult, uses_relative - -import idna -from multidict import MultiDict, MultiDictProxy -from propcache.api import under_cached_property as cached_property - -from ._parse import ( - USES_AUTHORITY, - SplitURLType, - make_netloc, - query_to_pairs, - split_netloc, - split_url, - unsplit_result, -) -from ._path import normalize_path, normalize_path_segments -from ._query import ( - Query, - QueryVariable, - SimpleQuery, - get_str_query, - get_str_query_from_iterable, - get_str_query_from_sequence_iterable, -) -from ._quoters import ( - FRAGMENT_QUOTER, - FRAGMENT_REQUOTER, - PATH_QUOTER, - PATH_REQUOTER, - PATH_SAFE_UNQUOTER, - PATH_UNQUOTER, - QS_UNQUOTER, - QUERY_QUOTER, - QUERY_REQUOTER, - QUOTER, - REQUOTER, - UNQUOTER, - human_quote, -) - -DEFAULT_PORTS = {"http": 80, "https": 443, "ws": 80, "wss": 443, "ftp": 21} -USES_RELATIVE = frozenset(uses_relative) - -# Special schemes https://url.spec.whatwg.org/#special-scheme -# are not allowed to have an empty host https://url.spec.whatwg.org/#url-representation -SCHEME_REQUIRES_HOST = frozenset(("http", "https", "ws", "wss", "ftp")) - - -# reg-name: unreserved / pct-encoded / sub-delims -# this pattern matches anything that is *not* in those classes. and is only used -# on lower-cased ASCII values. -NOT_REG_NAME = re.compile( - r""" - # any character not in the unreserved or sub-delims sets, plus % - # (validated with the additional check for pct-encoded sequences below) - [^a-z0-9\-._~!$&'()*+,;=%] - | - # % only allowed if it is part of a pct-encoded - # sequence of 2 hex digits. - %(?![0-9a-f]{2}) - """, - re.VERBOSE, -) - -_T = TypeVar("_T") - -if sys.version_info >= (3, 11): - from typing import Self -else: - Self = Any - - -class UndefinedType(Enum): - """Singleton type for use with not set sentinel values.""" - - _singleton = 0 - - -UNDEFINED = UndefinedType._singleton - - -class CacheInfo(TypedDict): - """Host encoding cache.""" - - idna_encode: _CacheInfo - idna_decode: _CacheInfo - ip_address: _CacheInfo - host_validate: _CacheInfo - encode_host: _CacheInfo - - -class _InternalURLCache(TypedDict, total=False): - _val: SplitURLType - _origin: "URL" - absolute: bool - hash: int - scheme: str - raw_authority: str - authority: str - raw_user: Union[str, None] - user: Union[str, None] - raw_password: Union[str, None] - password: Union[str, None] - raw_host: Union[str, None] - host: Union[str, None] - host_subcomponent: Union[str, None] - host_port_subcomponent: Union[str, None] - port: Union[int, None] - explicit_port: Union[int, None] - raw_path: str - path: str - _parsed_query: list[tuple[str, str]] - query: "MultiDictProxy[str]" - raw_query_string: str - query_string: str - path_qs: str - raw_path_qs: str - raw_fragment: str - fragment: str - raw_parts: tuple[str, ...] - parts: tuple[str, ...] - parent: "URL" - raw_name: str - name: str - raw_suffix: str - suffix: str - raw_suffixes: tuple[str, ...] - suffixes: tuple[str, ...] - - -def rewrite_module(obj: _T) -> _T: - obj.__module__ = "yarl" - return obj - - -@lru_cache -def encode_url(url_str: str) -> "URL": - """Parse unencoded URL.""" - cache: _InternalURLCache = {} - host: Union[str, None] - scheme, netloc, path, query, fragment = split_url(url_str) - if not netloc: # netloc - host = "" - else: - if ":" in netloc or "@" in netloc or "[" in netloc: - # Complex netloc - username, password, host, port = split_netloc(netloc) - else: - username = password = port = None - host = netloc - if host is None: - if scheme in SCHEME_REQUIRES_HOST: - msg = ( - "Invalid URL: host is required for " - f"absolute urls with the {scheme} scheme" - ) - raise ValueError(msg) - else: - host = "" - host = _encode_host(host, validate_host=False) - # Remove brackets as host encoder adds back brackets for IPv6 addresses - cache["raw_host"] = host[1:-1] if "[" in host else host - cache["explicit_port"] = port - if password is None and username is None: - # Fast path for URLs without user, password - netloc = host if port is None else f"{host}:{port}" - cache["raw_user"] = None - cache["raw_password"] = None - else: - raw_user = REQUOTER(username) if username else username - raw_password = REQUOTER(password) if password else password - netloc = make_netloc(raw_user, raw_password, host, port) - cache["raw_user"] = raw_user - cache["raw_password"] = raw_password - - if path: - path = PATH_REQUOTER(path) - if netloc and "." in path: - path = normalize_path(path) - if query: - query = QUERY_REQUOTER(query) - if fragment: - fragment = FRAGMENT_REQUOTER(fragment) - - cache["scheme"] = scheme - cache["raw_path"] = "/" if not path and netloc else path - cache["raw_query_string"] = query - cache["raw_fragment"] = fragment - - self = object.__new__(URL) - self._scheme = scheme - self._netloc = netloc - self._path = path - self._query = query - self._fragment = fragment - self._cache = cache - return self - - -@lru_cache -def pre_encoded_url(url_str: str) -> "URL": - """Parse pre-encoded URL.""" - self = object.__new__(URL) - val = split_url(url_str) - self._scheme, self._netloc, self._path, self._query, self._fragment = val - self._cache = {} - return self - - -@lru_cache -def build_pre_encoded_url( - scheme: str, - authority: str, - user: Union[str, None], - password: Union[str, None], - host: str, - port: Union[int, None], - path: str, - query_string: str, - fragment: str, -) -> "URL": - """Build a pre-encoded URL from parts.""" - self = object.__new__(URL) - self._scheme = scheme - if authority: - self._netloc = authority - elif host: - if port is not None: - port = None if port == DEFAULT_PORTS.get(scheme) else port - if user is None and password is None: - self._netloc = host if port is None else f"{host}:{port}" - else: - self._netloc = make_netloc(user, password, host, port) - else: - self._netloc = "" - self._path = path - self._query = query_string - self._fragment = fragment - self._cache = {} - return self - - -def from_parts_uncached( - scheme: str, netloc: str, path: str, query: str, fragment: str -) -> "URL": - """Create a new URL from parts.""" - self = object.__new__(URL) - self._scheme = scheme - self._netloc = netloc - self._path = path - self._query = query - self._fragment = fragment - self._cache = {} - return self - - -from_parts = lru_cache(from_parts_uncached) - - -@rewrite_module -class URL: - # Don't derive from str - # follow pathlib.Path design - # probably URL will not suffer from pathlib problems: - # it's intended for libraries like aiohttp, - # not to be passed into standard library functions like os.open etc. - - # URL grammar (RFC 3986) - # pct-encoded = "%" HEXDIG HEXDIG - # reserved = gen-delims / sub-delims - # gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@" - # sub-delims = "!" / "$" / "&" / "'" / "(" / ")" - # / "*" / "+" / "," / ";" / "=" - # unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" - # URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] - # hier-part = "//" authority path-abempty - # / path-absolute - # / path-rootless - # / path-empty - # scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) - # authority = [ userinfo "@" ] host [ ":" port ] - # userinfo = *( unreserved / pct-encoded / sub-delims / ":" ) - # host = IP-literal / IPv4address / reg-name - # IP-literal = "[" ( IPv6address / IPvFuture ) "]" - # IPvFuture = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" ) - # IPv6address = 6( h16 ":" ) ls32 - # / "::" 5( h16 ":" ) ls32 - # / [ h16 ] "::" 4( h16 ":" ) ls32 - # / [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32 - # / [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32 - # / [ *3( h16 ":" ) h16 ] "::" h16 ":" ls32 - # / [ *4( h16 ":" ) h16 ] "::" ls32 - # / [ *5( h16 ":" ) h16 ] "::" h16 - # / [ *6( h16 ":" ) h16 ] "::" - # ls32 = ( h16 ":" h16 ) / IPv4address - # ; least-significant 32 bits of address - # h16 = 1*4HEXDIG - # ; 16 bits of address represented in hexadecimal - # IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet - # dec-octet = DIGIT ; 0-9 - # / %x31-39 DIGIT ; 10-99 - # / "1" 2DIGIT ; 100-199 - # / "2" %x30-34 DIGIT ; 200-249 - # / "25" %x30-35 ; 250-255 - # reg-name = *( unreserved / pct-encoded / sub-delims ) - # port = *DIGIT - # path = path-abempty ; begins with "/" or is empty - # / path-absolute ; begins with "/" but not "//" - # / path-noscheme ; begins with a non-colon segment - # / path-rootless ; begins with a segment - # / path-empty ; zero characters - # path-abempty = *( "/" segment ) - # path-absolute = "/" [ segment-nz *( "/" segment ) ] - # path-noscheme = segment-nz-nc *( "/" segment ) - # path-rootless = segment-nz *( "/" segment ) - # path-empty = 0<pchar> - # segment = *pchar - # segment-nz = 1*pchar - # segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" ) - # ; non-zero-length segment without any colon ":" - # pchar = unreserved / pct-encoded / sub-delims / ":" / "@" - # query = *( pchar / "/" / "?" ) - # fragment = *( pchar / "/" / "?" ) - # URI-reference = URI / relative-ref - # relative-ref = relative-part [ "?" query ] [ "#" fragment ] - # relative-part = "//" authority path-abempty - # / path-absolute - # / path-noscheme - # / path-empty - # absolute-URI = scheme ":" hier-part [ "?" query ] - __slots__ = ("_cache", "_scheme", "_netloc", "_path", "_query", "_fragment") - - _cache: _InternalURLCache - _scheme: str - _netloc: str - _path: str - _query: str - _fragment: str - - def __new__( - cls, - val: Union[str, SplitResult, "URL", UndefinedType] = UNDEFINED, - *, - encoded: bool = False, - strict: Union[bool, None] = None, - ) -> "URL": - if strict is not None: # pragma: no cover - warnings.warn("strict parameter is ignored") - if type(val) is str: - return pre_encoded_url(val) if encoded else encode_url(val) - if type(val) is cls: - return val - if type(val) is SplitResult: - if not encoded: - raise ValueError("Cannot apply decoding to SplitResult") - return from_parts(*val) - if isinstance(val, str): - return pre_encoded_url(str(val)) if encoded else encode_url(str(val)) - if val is UNDEFINED: - # Special case for UNDEFINED since it might be unpickling and we do - # not want to cache as the `__set_state__` call would mutate the URL - # object in the `pre_encoded_url` or `encoded_url` caches. - self = object.__new__(URL) - self._scheme = self._netloc = self._path = self._query = self._fragment = "" - self._cache = {} - return self - raise TypeError("Constructor parameter should be str") - - @classmethod - def build( - cls, - *, - scheme: str = "", - authority: str = "", - user: Union[str, None] = None, - password: Union[str, None] = None, - host: str = "", - port: Union[int, None] = None, - path: str = "", - query: Union[Query, None] = None, - query_string: str = "", - fragment: str = "", - encoded: bool = False, - ) -> "URL": - """Creates and returns a new URL""" - - if authority and (user or password or host or port): - raise ValueError( - 'Can\'t mix "authority" with "user", "password", "host" or "port".' - ) - if port is not None and not isinstance(port, int): - raise TypeError(f"The port is required to be int, got {type(port)!r}.") - if port and not host: - raise ValueError('Can\'t build URL with "port" but without "host".') - if query and query_string: - raise ValueError('Only one of "query" or "query_string" should be passed') - if ( - scheme is None # type: ignore[redundant-expr] - or authority is None # type: ignore[redundant-expr] - or host is None # type: ignore[redundant-expr] - or path is None # type: ignore[redundant-expr] - or query_string is None # type: ignore[redundant-expr] - or fragment is None - ): - raise TypeError( - 'NoneType is illegal for "scheme", "authority", "host", "path", ' - '"query_string", and "fragment" args, use empty string instead.' - ) - - if query: - query_string = get_str_query(query) or "" - - if encoded: - return build_pre_encoded_url( - scheme, - authority, - user, - password, - host, - port, - path, - query_string, - fragment, - ) - - self = object.__new__(URL) - self._scheme = scheme - _host: Union[str, None] = None - if authority: - user, password, _host, port = split_netloc(authority) - _host = _encode_host(_host, validate_host=False) if _host else "" - elif host: - _host = _encode_host(host, validate_host=True) - else: - self._netloc = "" - - if _host is not None: - if port is not None: - port = None if port == DEFAULT_PORTS.get(scheme) else port - if user is None and password is None: - self._netloc = _host if port is None else f"{_host}:{port}" - else: - self._netloc = make_netloc(user, password, _host, port, True) - - path = PATH_QUOTER(path) if path else path - if path and self._netloc: - if "." in path: - path = normalize_path(path) - if path[0] != "/": - msg = ( - "Path in a URL with authority should " - "start with a slash ('/') if set" - ) - raise ValueError(msg) - - self._path = path - if not query and query_string: - query_string = QUERY_QUOTER(query_string) - self._query = query_string - self._fragment = FRAGMENT_QUOTER(fragment) if fragment else fragment - self._cache = {} - return self - - def __init_subclass__(cls) -> NoReturn: - raise TypeError(f"Inheriting a class {cls!r} from URL is forbidden") - - def __str__(self) -> str: - if not self._path and self._netloc and (self._query or self._fragment): - path = "/" - else: - path = self._path - if (port := self.explicit_port) is not None and port == DEFAULT_PORTS.get( - self._scheme - ): - # port normalization - using None for default ports to remove from rendering - # https://datatracker.ietf.org/doc/html/rfc3986.html#section-6.2.3 - host = self.host_subcomponent - netloc = make_netloc(self.raw_user, self.raw_password, host, None) - else: - netloc = self._netloc - return unsplit_result(self._scheme, netloc, path, self._query, self._fragment) - - def __repr__(self) -> str: - return f"{self.__class__.__name__}('{str(self)}')" - - def __bytes__(self) -> bytes: - return str(self).encode("ascii") - - def __eq__(self, other: object) -> bool: - if type(other) is not URL: - return NotImplemented - - path1 = "/" if not self._path and self._netloc else self._path - path2 = "/" if not other._path and other._netloc else other._path - return ( - self._scheme == other._scheme - and self._netloc == other._netloc - and path1 == path2 - and self._query == other._query - and self._fragment == other._fragment - ) - - def __hash__(self) -> int: - if (ret := self._cache.get("hash")) is None: - path = "/" if not self._path and self._netloc else self._path - ret = self._cache["hash"] = hash( - (self._scheme, self._netloc, path, self._query, self._fragment) - ) - return ret - - def __le__(self, other: object) -> bool: - if type(other) is not URL: - return NotImplemented - return self._val <= other._val - - def __lt__(self, other: object) -> bool: - if type(other) is not URL: - return NotImplemented - return self._val < other._val - - def __ge__(self, other: object) -> bool: - if type(other) is not URL: - return NotImplemented - return self._val >= other._val - - def __gt__(self, other: object) -> bool: - if type(other) is not URL: - return NotImplemented - return self._val > other._val - - def __truediv__(self, name: str) -> "URL": - if not isinstance(name, str): - return NotImplemented # type: ignore[unreachable] - return self._make_child((str(name),)) - - def __mod__(self, query: Query) -> "URL": - return self.update_query(query) - - def __bool__(self) -> bool: - return bool(self._netloc or self._path or self._query or self._fragment) - - def __getstate__(self) -> tuple[SplitResult]: - return (tuple.__new__(SplitResult, self._val),) - - def __setstate__( - self, state: Union[tuple[SplitURLType], tuple[None, _InternalURLCache]] - ) -> None: - if state[0] is None and isinstance(state[1], dict): - # default style pickle - val = state[1]["_val"] - else: - unused: list[object] - val, *unused = state - self._scheme, self._netloc, self._path, self._query, self._fragment = val - self._cache = {} - - def _cache_netloc(self) -> None: - """Cache the netloc parts of the URL.""" - c = self._cache - split_loc = split_netloc(self._netloc) - c["raw_user"], c["raw_password"], c["raw_host"], c["explicit_port"] = split_loc - - def is_absolute(self) -> bool: - """A check for absolute URLs. - - Return True for absolute ones (having scheme or starting - with //), False otherwise. - - Is is preferred to call the .absolute property instead - as it is cached. - """ - return self.absolute - - def is_default_port(self) -> bool: - """A check for default port. - - Return True if port is default for specified scheme, - e.g. 'http://python.org' or 'http://python.org:80', False - otherwise. - - Return False for relative URLs. - - """ - if (explicit := self.explicit_port) is None: - # If the explicit port is None, then the URL must be - # using the default port unless its a relative URL - # which does not have an implicit port / default port - return self._netloc != "" - return explicit == DEFAULT_PORTS.get(self._scheme) - - def origin(self) -> "URL": - """Return an URL with scheme, host and port parts only. - - user, password, path, query and fragment are removed. - - """ - # TODO: add a keyword-only option for keeping user/pass maybe? - return self._origin - - @cached_property - def _val(self) -> SplitURLType: - return (self._scheme, self._netloc, self._path, self._query, self._fragment) - - @cached_property - def _origin(self) -> "URL": - """Return an URL with scheme, host and port parts only. - - user, password, path, query and fragment are removed. - """ - if not (netloc := self._netloc): - raise ValueError("URL should be absolute") - if not (scheme := self._scheme): - raise ValueError("URL should have scheme") - if "@" in netloc: - encoded_host = self.host_subcomponent - netloc = make_netloc(None, None, encoded_host, self.explicit_port) - elif not self._path and not self._query and not self._fragment: - return self - return from_parts(scheme, netloc, "", "", "") - - def relative(self) -> "URL": - """Return a relative part of the URL. - - scheme, user, password, host and port are removed. - - """ - if not self._netloc: - raise ValueError("URL should be absolute") - return from_parts("", "", self._path, self._query, self._fragment) - - @cached_property - def absolute(self) -> bool: - """A check for absolute URLs. - - Return True for absolute ones (having scheme or starting - with //), False otherwise. - - """ - # `netloc`` is an empty string for relative URLs - # Checking `netloc` is faster than checking `hostname` - # because `hostname` is a property that does some extra work - # to parse the host from the `netloc` - return self._netloc != "" - - @cached_property - def scheme(self) -> str: - """Scheme for absolute URLs. - - Empty string for relative URLs or URLs starting with // - - """ - return self._scheme - - @cached_property - def raw_authority(self) -> str: - """Encoded authority part of URL. - - Empty string for relative URLs. - - """ - return self._netloc - - @cached_property - def authority(self) -> str: - """Decoded authority part of URL. - - Empty string for relative URLs. - - """ - return make_netloc(self.user, self.password, self.host, self.port) - - @cached_property - def raw_user(self) -> Union[str, None]: - """Encoded user part of URL. - - None if user is missing. - - """ - # not .username - self._cache_netloc() - return self._cache["raw_user"] - - @cached_property - def user(self) -> Union[str, None]: - """Decoded user part of URL. - - None if user is missing. - - """ - if (raw_user := self.raw_user) is None: - return None - return UNQUOTER(raw_user) - - @cached_property - def raw_password(self) -> Union[str, None]: - """Encoded password part of URL. - - None if password is missing. - - """ - self._cache_netloc() - return self._cache["raw_password"] - - @cached_property - def password(self) -> Union[str, None]: - """Decoded password part of URL. - - None if password is missing. - - """ - if (raw_password := self.raw_password) is None: - return None - return UNQUOTER(raw_password) - - @cached_property - def raw_host(self) -> Union[str, None]: - """Encoded host part of URL. - - None for relative URLs. - - When working with IPv6 addresses, use the `host_subcomponent` property instead - as it will return the host subcomponent with brackets. - """ - # Use host instead of hostname for sake of shortness - # May add .hostname prop later - self._cache_netloc() - return self._cache["raw_host"] - - @cached_property - def host(self) -> Union[str, None]: - """Decoded host part of URL. - - None for relative URLs. - - """ - if (raw := self.raw_host) is None: - return None - if raw and raw[-1].isdigit() or ":" in raw: - # IP addresses are never IDNA encoded - return raw - return _idna_decode(raw) - - @cached_property - def host_subcomponent(self) -> Union[str, None]: - """Return the host subcomponent part of URL. - - None for relative URLs. - - https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2 - - `IP-literal = "[" ( IPv6address / IPvFuture ) "]"` - - Examples: - - `http://example.com:8080` -> `example.com` - - `http://example.com:80` -> `example.com` - - `https://127.0.0.1:8443` -> `127.0.0.1` - - `https://[::1]:8443` -> `[::1]` - - `http://[::1]` -> `[::1]` - - """ - if (raw := self.raw_host) is None: - return None - return f"[{raw}]" if ":" in raw else raw - - @cached_property - def host_port_subcomponent(self) -> Union[str, None]: - """Return the host and port subcomponent part of URL. - - Trailing dots are removed from the host part. - - This value is suitable for use in the Host header of an HTTP request. - - None for relative URLs. - - https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2 - `IP-literal = "[" ( IPv6address / IPvFuture ) "]"` - https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.3 - port = *DIGIT - - Examples: - - `http://example.com:8080` -> `example.com:8080` - - `http://example.com:80` -> `example.com` - - `http://example.com.:80` -> `example.com` - - `https://127.0.0.1:8443` -> `127.0.0.1:8443` - - `https://[::1]:8443` -> `[::1]:8443` - - `http://[::1]` -> `[::1]` - - """ - if (raw := self.raw_host) is None: - return None - if raw[-1] == ".": - # Remove all trailing dots from the netloc as while - # they are valid FQDNs in DNS, TLS validation fails. - # See https://github.com/aio-libs/aiohttp/issues/3636. - # To avoid string manipulation we only call rstrip if - # the last character is a dot. - raw = raw.rstrip(".") - port = self.explicit_port - if port is None or port == DEFAULT_PORTS.get(self._scheme): - return f"[{raw}]" if ":" in raw else raw - return f"[{raw}]:{port}" if ":" in raw else f"{raw}:{port}" - - @cached_property - def port(self) -> Union[int, None]: - """Port part of URL, with scheme-based fallback. - - None for relative URLs or URLs without explicit port and - scheme without default port substitution. - - """ - if (explicit_port := self.explicit_port) is not None: - return explicit_port - return DEFAULT_PORTS.get(self._scheme) - - @cached_property - def explicit_port(self) -> Union[int, None]: - """Port part of URL, without scheme-based fallback. - - None for relative URLs or URLs without explicit port. - - """ - self._cache_netloc() - return self._cache["explicit_port"] - - @cached_property - def raw_path(self) -> str: - """Encoded path of URL. - - / for absolute URLs without path part. - - """ - return self._path if self._path or not self._netloc else "/" - - @cached_property - def path(self) -> str: - """Decoded path of URL. - - / for absolute URLs without path part. - - """ - return PATH_UNQUOTER(self._path) if self._path else "/" if self._netloc else "" - - @cached_property - def path_safe(self) -> str: - """Decoded path of URL. - - / for absolute URLs without path part. - - / (%2F) and % (%25) are not decoded - - """ - if self._path: - return PATH_SAFE_UNQUOTER(self._path) - return "/" if self._netloc else "" - - @cached_property - def _parsed_query(self) -> list[tuple[str, str]]: - """Parse query part of URL.""" - return query_to_pairs(self._query) - - @cached_property - def query(self) -> "MultiDictProxy[str]": - """A MultiDictProxy representing parsed query parameters in decoded - representation. - - Empty value if URL has no query part. - - """ - return MultiDictProxy(MultiDict(self._parsed_query)) - - @cached_property - def raw_query_string(self) -> str: - """Encoded query part of URL. - - Empty string if query is missing. - - """ - return self._query - - @cached_property - def query_string(self) -> str: - """Decoded query part of URL. - - Empty string if query is missing. - - """ - return QS_UNQUOTER(self._query) if self._query else "" - - @cached_property - def path_qs(self) -> str: - """Decoded path of URL with query.""" - return self.path if not (q := self.query_string) else f"{self.path}?{q}" - - @cached_property - def raw_path_qs(self) -> str: - """Encoded path of URL with query.""" - if q := self._query: - return f"{self._path}?{q}" if self._path or not self._netloc else f"/?{q}" - return self._path if self._path or not self._netloc else "/" - - @cached_property - def raw_fragment(self) -> str: - """Encoded fragment part of URL. - - Empty string if fragment is missing. - - """ - return self._fragment - - @cached_property - def fragment(self) -> str: - """Decoded fragment part of URL. - - Empty string if fragment is missing. - - """ - return UNQUOTER(self._fragment) if self._fragment else "" - - @cached_property - def raw_parts(self) -> tuple[str, ...]: - """A tuple containing encoded *path* parts. - - ('/',) for absolute URLs if *path* is missing. - - """ - path = self._path - if self._netloc: - return ("/", *path[1:].split("/")) if path else ("/",) - if path and path[0] == "/": - return ("/", *path[1:].split("/")) - return tuple(path.split("/")) - - @cached_property - def parts(self) -> tuple[str, ...]: - """A tuple containing decoded *path* parts. - - ('/',) for absolute URLs if *path* is missing. - - """ - return tuple(UNQUOTER(part) for part in self.raw_parts) - - @cached_property - def parent(self) -> "URL": - """A new URL with last part of path removed and cleaned up query and - fragment. - - """ - path = self._path - if not path or path == "/": - if self._fragment or self._query: - return from_parts(self._scheme, self._netloc, path, "", "") - return self - parts = path.split("/") - return from_parts(self._scheme, self._netloc, "/".join(parts[:-1]), "", "") - - @cached_property - def raw_name(self) -> str: - """The last part of raw_parts.""" - parts = self.raw_parts - if not self._netloc: - return parts[-1] - parts = parts[1:] - return parts[-1] if parts else "" - - @cached_property - def name(self) -> str: - """The last part of parts.""" - return UNQUOTER(self.raw_name) - - @cached_property - def raw_suffix(self) -> str: - name = self.raw_name - i = name.rfind(".") - return name[i:] if 0 < i < len(name) - 1 else "" - - @cached_property - def suffix(self) -> str: - return UNQUOTER(self.raw_suffix) - - @cached_property - def raw_suffixes(self) -> tuple[str, ...]: - name = self.raw_name - if name.endswith("."): - return () - name = name.lstrip(".") - return tuple("." + suffix for suffix in name.split(".")[1:]) - - @cached_property - def suffixes(self) -> tuple[str, ...]: - return tuple(UNQUOTER(suffix) for suffix in self.raw_suffixes) - - def _make_child(self, paths: "Sequence[str]", encoded: bool = False) -> "URL": - """ - add paths to self._path, accounting for absolute vs relative paths, - keep existing, but do not create new, empty segments - """ - parsed: list[str] = [] - needs_normalize: bool = False - for idx, path in enumerate(reversed(paths)): - # empty segment of last is not removed - last = idx == 0 - if path and path[0] == "/": - raise ValueError( - f"Appending path {path!r} starting from slash is forbidden" - ) - # We need to quote the path if it is not already encoded - # This cannot be done at the end because the existing - # path is already quoted and we do not want to double quote - # the existing path. - path = path if encoded else PATH_QUOTER(path) - needs_normalize |= "." in path - segments = path.split("/") - segments.reverse() - # remove trailing empty segment for all but the last path - parsed += segments[1:] if not last and segments[0] == "" else segments - - if (path := self._path) and (old_segments := path.split("/")): - # If the old path ends with a slash, the last segment is an empty string - # and should be removed before adding the new path segments. - old = old_segments[:-1] if old_segments[-1] == "" else old_segments - old.reverse() - parsed += old - - # If the netloc is present, inject a leading slash when adding a - # path to an absolute URL where there was none before. - if (netloc := self._netloc) and parsed and parsed[-1] != "": - parsed.append("") - - parsed.reverse() - if not netloc or not needs_normalize: - return from_parts(self._scheme, netloc, "/".join(parsed), "", "") - - path = "/".join(normalize_path_segments(parsed)) - # If normalizing the path segments removed the leading slash, add it back. - if path and path[0] != "/": - path = f"/{path}" - return from_parts(self._scheme, netloc, path, "", "") - - def with_scheme(self, scheme: str) -> "URL": - """Return a new URL with scheme replaced.""" - # N.B. doesn't cleanup query/fragment - if not isinstance(scheme, str): - raise TypeError("Invalid scheme type") - lower_scheme = scheme.lower() - netloc = self._netloc - if not netloc and lower_scheme in SCHEME_REQUIRES_HOST: - msg = ( - "scheme replacement is not allowed for " - f"relative URLs for the {lower_scheme} scheme" - ) - raise ValueError(msg) - return from_parts(lower_scheme, netloc, self._path, self._query, self._fragment) - - def with_user(self, user: Union[str, None]) -> "URL": - """Return a new URL with user replaced. - - Autoencode user if needed. - - Clear user/password if user is None. - - """ - # N.B. doesn't cleanup query/fragment - if user is None: - password = None - elif isinstance(user, str): - user = QUOTER(user) - password = self.raw_password - else: - raise TypeError("Invalid user type") - if not (netloc := self._netloc): - raise ValueError("user replacement is not allowed for relative URLs") - encoded_host = self.host_subcomponent or "" - netloc = make_netloc(user, password, encoded_host, self.explicit_port) - return from_parts(self._scheme, netloc, self._path, self._query, self._fragment) - - def with_password(self, password: Union[str, None]) -> "URL": - """Return a new URL with password replaced. - - Autoencode password if needed. - - Clear password if argument is None. - - """ - # N.B. doesn't cleanup query/fragment - if password is None: - pass - elif isinstance(password, str): - password = QUOTER(password) - else: - raise TypeError("Invalid password type") - if not (netloc := self._netloc): - raise ValueError("password replacement is not allowed for relative URLs") - encoded_host = self.host_subcomponent or "" - port = self.explicit_port - netloc = make_netloc(self.raw_user, password, encoded_host, port) - return from_parts(self._scheme, netloc, self._path, self._query, self._fragment) - - def with_host(self, host: str) -> "URL": - """Return a new URL with host replaced. - - Autoencode host if needed. - - Changing host for relative URLs is not allowed, use .join() - instead. - - """ - # N.B. doesn't cleanup query/fragment - if not isinstance(host, str): - raise TypeError("Invalid host type") - if not (netloc := self._netloc): - raise ValueError("host replacement is not allowed for relative URLs") - if not host: - raise ValueError("host removing is not allowed") - encoded_host = _encode_host(host, validate_host=True) if host else "" - port = self.explicit_port - netloc = make_netloc(self.raw_user, self.raw_password, encoded_host, port) - return from_parts(self._scheme, netloc, self._path, self._query, self._fragment) - - def with_port(self, port: Union[int, None]) -> "URL": - """Return a new URL with port replaced. - - Clear port to default if None is passed. - - """ - # N.B. doesn't cleanup query/fragment - if port is not None: - if isinstance(port, bool) or not isinstance(port, int): - raise TypeError(f"port should be int or None, got {type(port)}") - if not (0 <= port <= 65535): - raise ValueError(f"port must be between 0 and 65535, got {port}") - if not (netloc := self._netloc): - raise ValueError("port replacement is not allowed for relative URLs") - encoded_host = self.host_subcomponent or "" - netloc = make_netloc(self.raw_user, self.raw_password, encoded_host, port) - return from_parts(self._scheme, netloc, self._path, self._query, self._fragment) - - def with_path( - self, - path: str, - *, - encoded: bool = False, - keep_query: bool = False, - keep_fragment: bool = False, - ) -> "URL": - """Return a new URL with path replaced.""" - netloc = self._netloc - if not encoded: - path = PATH_QUOTER(path) - if netloc: - path = normalize_path(path) if "." in path else path - if path and path[0] != "/": - path = f"/{path}" - query = self._query if keep_query else "" - fragment = self._fragment if keep_fragment else "" - return from_parts(self._scheme, netloc, path, query, fragment) - - @overload - def with_query(self, query: Query) -> "URL": ... - - @overload - def with_query(self, **kwargs: QueryVariable) -> "URL": ... - - def with_query(self, *args: Any, **kwargs: Any) -> "URL": - """Return a new URL with query part replaced. - - Accepts any Mapping (e.g. dict, multidict.MultiDict instances) - or str, autoencode the argument if needed. - - A sequence of (key, value) pairs is supported as well. - - It also can take an arbitrary number of keyword arguments. - - Clear query if None is passed. - - """ - # N.B. doesn't cleanup query/fragment - query = get_str_query(*args, **kwargs) or "" - return from_parts_uncached( - self._scheme, self._netloc, self._path, query, self._fragment - ) - - @overload - def extend_query(self, query: Query) -> "URL": ... - - @overload - def extend_query(self, **kwargs: QueryVariable) -> "URL": ... - - def extend_query(self, *args: Any, **kwargs: Any) -> "URL": - """Return a new URL with query part combined with the existing. - - This method will not remove existing query parameters. - - Example: - >>> url = URL('http://example.com/?a=1&b=2') - >>> url.extend_query(a=3, c=4) - URL('http://example.com/?a=1&b=2&a=3&c=4') - """ - if not (new_query := get_str_query(*args, **kwargs)): - return self - if query := self._query: - # both strings are already encoded so we can use a simple - # string join - query += new_query if query[-1] == "&" else f"&{new_query}" - else: - query = new_query - return from_parts_uncached( - self._scheme, self._netloc, self._path, query, self._fragment - ) - - @overload - def update_query(self, query: Query) -> "URL": ... - - @overload - def update_query(self, **kwargs: QueryVariable) -> "URL": ... - - def update_query(self, *args: Any, **kwargs: Any) -> "URL": - """Return a new URL with query part updated. - - This method will overwrite existing query parameters. - - Example: - >>> url = URL('http://example.com/?a=1&b=2') - >>> url.update_query(a=3, c=4) - URL('http://example.com/?a=3&b=2&c=4') - """ - in_query: Union[str, Mapping[str, QueryVariable], None] - if kwargs: - if args: - msg = "Either kwargs or single query parameter must be present" - raise ValueError(msg) - in_query = kwargs - elif len(args) == 1: - in_query = args[0] - else: - raise ValueError("Either kwargs or single query parameter must be present") - - if in_query is None: - query = "" - elif not in_query: - query = self._query - elif isinstance(in_query, Mapping): - qm: MultiDict[QueryVariable] = MultiDict(self._parsed_query) - qm.update(in_query) - query = get_str_query_from_sequence_iterable(qm.items()) - elif isinstance(in_query, str): - qstr: MultiDict[str] = MultiDict(self._parsed_query) - qstr.update(query_to_pairs(in_query)) - query = get_str_query_from_iterable(qstr.items()) - elif isinstance(in_query, (bytes, bytearray, memoryview)): # type: ignore[unreachable] - msg = "Invalid query type: bytes, bytearray and memoryview are forbidden" - raise TypeError(msg) - elif isinstance(in_query, Sequence): - # We don't expect sequence values if we're given a list of pairs - # already; only mappings like builtin `dict` which can't have the - # same key pointing to multiple values are allowed to use - # `_query_seq_pairs`. - qs: MultiDict[SimpleQuery] = MultiDict(self._parsed_query) - qs.update(in_query) - query = get_str_query_from_iterable(qs.items()) - else: - raise TypeError( - "Invalid query type: only str, mapping or " - "sequence of (key, value) pairs is allowed" - ) - return from_parts_uncached( - self._scheme, self._netloc, self._path, query, self._fragment - ) - - def without_query_params(self, *query_params: str) -> "URL": - """Remove some keys from query part and return new URL.""" - params_to_remove = set(query_params) & self.query.keys() - if not params_to_remove: - return self - return self.with_query( - tuple( - (name, value) - for name, value in self.query.items() - if name not in params_to_remove - ) - ) - - def with_fragment(self, fragment: Union[str, None]) -> "URL": - """Return a new URL with fragment replaced. - - Autoencode fragment if needed. - - Clear fragment to default if None is passed. - - """ - # N.B. doesn't cleanup query/fragment - if fragment is None: - raw_fragment = "" - elif not isinstance(fragment, str): - raise TypeError("Invalid fragment type") - else: - raw_fragment = FRAGMENT_QUOTER(fragment) - if self._fragment == raw_fragment: - return self - return from_parts( - self._scheme, self._netloc, self._path, self._query, raw_fragment - ) - - def with_name( - self, - name: str, - *, - keep_query: bool = False, - keep_fragment: bool = False, - ) -> "URL": - """Return a new URL with name (last part of path) replaced. - - Query and fragment parts are cleaned up. - - Name is encoded if needed. - - """ - # N.B. DOES cleanup query/fragment - if not isinstance(name, str): - raise TypeError("Invalid name type") - if "/" in name: - raise ValueError("Slash in name is not allowed") - name = PATH_QUOTER(name) - if name in (".", ".."): - raise ValueError(". and .. values are forbidden") - parts = list(self.raw_parts) - if netloc := self._netloc: - if len(parts) == 1: - parts.append(name) - else: - parts[-1] = name - parts[0] = "" # replace leading '/' - else: - parts[-1] = name - if parts[0] == "/": - parts[0] = "" # replace leading '/' - - query = self._query if keep_query else "" - fragment = self._fragment if keep_fragment else "" - return from_parts(self._scheme, netloc, "/".join(parts), query, fragment) - - def with_suffix( - self, - suffix: str, - *, - keep_query: bool = False, - keep_fragment: bool = False, - ) -> "URL": - """Return a new URL with suffix (file extension of name) replaced. - - Query and fragment parts are cleaned up. - - suffix is encoded if needed. - """ - if not isinstance(suffix, str): - raise TypeError("Invalid suffix type") - if suffix and not suffix[0] == "." or suffix == "." or "/" in suffix: - raise ValueError(f"Invalid suffix {suffix!r}") - name = self.raw_name - if not name: - raise ValueError(f"{self!r} has an empty name") - old_suffix = self.raw_suffix - suffix = PATH_QUOTER(suffix) - name = name + suffix if not old_suffix else name[: -len(old_suffix)] + suffix - if name in (".", ".."): - raise ValueError(". and .. values are forbidden") - parts = list(self.raw_parts) - if netloc := self._netloc: - if len(parts) == 1: - parts.append(name) - else: - parts[-1] = name - parts[0] = "" # replace leading '/' - else: - parts[-1] = name - if parts[0] == "/": - parts[0] = "" # replace leading '/' - - query = self._query if keep_query else "" - fragment = self._fragment if keep_fragment else "" - return from_parts(self._scheme, netloc, "/".join(parts), query, fragment) - - def join(self, url: "URL") -> "URL": - """Join URLs - - Construct a full (“absolute”) URL by combining a “base URL” - (self) with another URL (url). - - Informally, this uses components of the base URL, in - particular the addressing scheme, the network location and - (part of) the path, to provide missing components in the - relative URL. - - """ - if type(url) is not URL: - raise TypeError("url should be URL") - - scheme = url._scheme or self._scheme - if scheme != self._scheme or scheme not in USES_RELATIVE: - return url - - # scheme is in uses_authority as uses_authority is a superset of uses_relative - if (join_netloc := url._netloc) and scheme in USES_AUTHORITY: - return from_parts(scheme, join_netloc, url._path, url._query, url._fragment) - - orig_path = self._path - if join_path := url._path: - if join_path[0] == "/": - path = join_path - elif not orig_path: - path = f"/{join_path}" - elif orig_path[-1] == "/": - path = f"{orig_path}{join_path}" - else: - # … - # and relativizing ".." - # parts[0] is / for absolute urls, - # this join will add a double slash there - path = "/".join([*self.parts[:-1], ""]) + join_path - # which has to be removed - if orig_path[0] == "/": - path = path[1:] - path = normalize_path(path) if "." in path else path - else: - path = orig_path - - return from_parts( - scheme, - self._netloc, - path, - url._query if join_path or url._query else self._query, - url._fragment if join_path or url._fragment else self._fragment, - ) - - def joinpath(self, *other: str, encoded: bool = False) -> "URL": - """Return a new URL with the elements in other appended to the path.""" - return self._make_child(other, encoded=encoded) - - def human_repr(self) -> str: - """Return decoded human readable string for URL representation.""" - user = human_quote(self.user, "#/:?@[]") - password = human_quote(self.password, "#/:?@[]") - if (host := self.host) and ":" in host: - host = f"[{host}]" - path = human_quote(self.path, "#?") - if TYPE_CHECKING: - assert path is not None - query_string = "&".join( - "{}={}".format(human_quote(k, "#&+;="), human_quote(v, "#&+;=")) - for k, v in self.query.items() - ) - fragment = human_quote(self.fragment, "") - if TYPE_CHECKING: - assert fragment is not None - netloc = make_netloc(user, password, host, self.explicit_port) - return unsplit_result(self._scheme, netloc, path, query_string, fragment) - - -_DEFAULT_IDNA_SIZE = 256 -_DEFAULT_ENCODE_SIZE = 512 - - -@lru_cache(_DEFAULT_IDNA_SIZE) -def _idna_decode(raw: str) -> str: - try: - return idna.decode(raw.encode("ascii")) - except UnicodeError: # e.g. '::1' - return raw.encode("ascii").decode("idna") - - -@lru_cache(_DEFAULT_IDNA_SIZE) -def _idna_encode(host: str) -> str: - try: - return idna.encode(host, uts46=True).decode("ascii") - except UnicodeError: - return host.encode("idna").decode("ascii") - - -@lru_cache(_DEFAULT_ENCODE_SIZE) -def _encode_host(host: str, validate_host: bool) -> str: - """Encode host part of URL.""" - # If the host ends with a digit or contains a colon, its likely - # an IP address. - if host and (host[-1].isdigit() or ":" in host): - raw_ip, sep, zone = host.partition("%") - # If it looks like an IP, we check with _ip_compressed_version - # and fall-through if its not an IP address. This is a performance - # optimization to avoid parsing IP addresses as much as possible - # because it is orders of magnitude slower than almost any other - # operation this library does. - # Might be an IP address, check it - # - # IP Addresses can look like: - # https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2 - # - 127.0.0.1 (last character is a digit) - # - 2001:db8::ff00:42:8329 (contains a colon) - # - 2001:db8::ff00:42:8329%eth0 (contains a colon) - # - [2001:db8::ff00:42:8329] (contains a colon -- brackets should - # have been removed before it gets here) - # Rare IP Address formats are not supported per: - # https://datatracker.ietf.org/doc/html/rfc3986#section-7.4 - # - # IP parsing is slow, so its wrapped in an LRU - try: - ip = ip_address(raw_ip) - except ValueError: - pass - else: - # These checks should not happen in the - # LRU to keep the cache size small - host = ip.compressed - if ip.version == 6: - return f"[{host}%{zone}]" if sep else f"[{host}]" - return f"{host}%{zone}" if sep else host - - # IDNA encoding is slow, skip it for ASCII-only strings - if host.isascii(): - # Check for invalid characters explicitly; _idna_encode() does this - # for non-ascii host names. - host = host.lower() - if validate_host and (invalid := NOT_REG_NAME.search(host)): - value, pos, extra = invalid.group(), invalid.start(), "" - if value == "@" or (value == ":" and "@" in host[pos:]): - # this looks like an authority string - extra = ( - ", if the value includes a username or password, " - "use 'authority' instead of 'host'" - ) - raise ValueError( - f"Host {host!r} cannot contain {value!r} (at position {pos}){extra}" - ) from None - return host - - return _idna_encode(host) - - -@rewrite_module -def cache_clear() -> None: - """Clear all LRU caches.""" - _idna_encode.cache_clear() - _idna_decode.cache_clear() - _encode_host.cache_clear() - - -@rewrite_module -def cache_info() -> CacheInfo: - """Report cache statistics.""" - return { - "idna_encode": _idna_encode.cache_info(), - "idna_decode": _idna_decode.cache_info(), - "ip_address": _encode_host.cache_info(), - "host_validate": _encode_host.cache_info(), - "encode_host": _encode_host.cache_info(), - } - - -@rewrite_module -def cache_configure( - *, - idna_encode_size: Union[int, None] = _DEFAULT_IDNA_SIZE, - idna_decode_size: Union[int, None] = _DEFAULT_IDNA_SIZE, - ip_address_size: Union[int, None, UndefinedType] = UNDEFINED, - host_validate_size: Union[int, None, UndefinedType] = UNDEFINED, - encode_host_size: Union[int, None, UndefinedType] = UNDEFINED, -) -> None: - """Configure LRU cache sizes.""" - global _idna_decode, _idna_encode, _encode_host - # ip_address_size, host_validate_size are no longer - # used, but are kept for backwards compatibility. - if ip_address_size is not UNDEFINED or host_validate_size is not UNDEFINED: - warnings.warn( - "cache_configure() no longer accepts the " - "ip_address_size or host_validate_size arguments, " - "they are used to set the encode_host_size instead " - "and will be removed in the future", - DeprecationWarning, - stacklevel=2, - ) - - if encode_host_size is not None: - for size in (ip_address_size, host_validate_size): - if size is None: - encode_host_size = None - elif encode_host_size is UNDEFINED: - if size is not UNDEFINED: - encode_host_size = size - elif size is not UNDEFINED: - if TYPE_CHECKING: - assert isinstance(size, int) - assert isinstance(encode_host_size, int) - encode_host_size = max(size, encode_host_size) - if encode_host_size is UNDEFINED: - encode_host_size = _DEFAULT_ENCODE_SIZE - - _encode_host = lru_cache(encode_host_size)(_encode_host.__wrapped__) - _idna_decode = lru_cache(idna_decode_size)(_idna_decode.__wrapped__) - _idna_encode = lru_cache(idna_encode_size)(_idna_encode.__wrapped__) diff --git a/venv/lib/python3.12/site-packages/yarl/py.typed b/venv/lib/python3.12/site-packages/yarl/py.typed deleted file mode 100644 index dcf2c80..0000000 --- a/venv/lib/python3.12/site-packages/yarl/py.typed +++ /dev/null @@ -1 +0,0 @@ -# Placeholder diff --git a/venv/lib64 b/venv/lib64 deleted file mode 120000 index 7951405..0000000 --- a/venv/lib64 +++ /dev/null @@ -1 +0,0 @@ -lib \ No newline at end of file diff --git a/venv/pyvenv.cfg b/venv/pyvenv.cfg deleted file mode 100644 index 1777c52..0000000 --- a/venv/pyvenv.cfg +++ /dev/null @@ -1,5 +0,0 @@ -home = /usr/bin -include-system-site-packages = false -version = 3.12.3 -executable = /usr/bin/python3.12 -command = /usr/bin/python3 -m venv /home/matsv/Documents/telegram-sticker-downloader/venv

    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%0D9`sbHk+eOEX@BNP`YeV0jkB55 zcBb_+Q&np-iSBjxY%*^8WYMe6l-6E#~dD@yEXw{qRGwP?sdp|wzUop60gFe+Wea_9&B38A&simrBM&0K8Q)o|v8qW%| zWDo3Ss6ot(w@}&BX%f$cP%t_UBBQiWVi*NA8G?OCXZ z$c)~WQ01cNs*4HCPuhF4>BuLbybt7RiCLr@Wl))Luy13P`m{)5h)$RU&$;2Qzd@yT zX7oW6-0`ML@`l+AcWILVl0I+~DcYx|t#W==WN%y4k?Bn#?s@YndE1#hJsbwRAf!BV zq|g|OSZdpW##mcoQ@1y!%i0v_S!fUKY0ai6Dv_v2vq~#s<7HaAnZ))smT6d_qh5h0 zDyp}dHqnUa!ILT~{s3)lTPrQacA; zo%NN<)Y%-h76X@qa3B@`mPjUaL!~oSnMkFNpT*FLuj=aBSUXbZOSihAs68Ms;0J3^eKW3wN*8> ztuqLjBVaQKwX`*wa=u5#k`Yi%ALqi zK~pL#`FT}WwKeYQSbZy*BT&%QboQ;a@xrS1#umS5E8^X14EIm38~q-}QGAc87Z?U} zP4o_dmtu8Qbwe%JnNR%%R1^y?s`^~H+M<(+rV)m21!+rjb8U5~B>Xg^rm>Bxr!n&0 z6!+vvQ~cArQQKVK-r(m3k4&0cs>60<`BgRk5m08@$)~7jC)`$7+bSQwP?3>H`+EA` zvuB5vmX(cx%QPM1PUV{tsh)fX?KtZ0_s5{AdAc0(jUfwu*cmK@qVx79|wig*Nr#&;DKU z?4-{P+#}t=&2m3()TG|T4Bepxb8xdOls73DEQb(`nA3A&!CT?frqMxyfz(2RcsLiu z0>_t?iTE*IX~3z1oc9MzPFcDvS~@@*>)cgU?bUueSAd?0)-_U3+Sb@y?Kdd8)7;Wr zJ5@g1%1LZ>vrPppd1cmfUv6+9=avq+w82E7XNblb1cN0=k#{G%O-l$U z(3IBC;VxojZEcK3*Tyw|xti#(v|GDIJr8d5+nlCc3{P!SWAjS?LUx5}aA;4b)nOD* zNDYQ)(f)|EDlw4Gs>4g(36DOvIi07Cf%ITcud5#6s25#wWU1VSVcNT+F3;0AjUc^Z zq2D?)O-GF7vDT{kRaKsvSZm9=^==i7jcSTPow{!k|JKxDGZr82Psh7!v4s&XLrm|> zhgsM==-sT^*4kDt7p=AJt(1$p_8_yot=4BY{DV6j0Y8|s`w?!SX+KG+KHNa_(+P%; zoFGG{SCA8lh=&vY*dB2+)Om&T5K17NTTd{&vnr;p;hVMV=etKjdyu_4b4x3)33JLRziVf+G+F;4fJNh<@T$$HlxP2h>c-NG_YG7 zaE^d;)9jPn{lqlq~``XDV9vdKI@E1`&k)O~j+ z_yD~p*_qfthhqbmbdtkl**pi$Cb|;Ijph`!Nw(9sfjS+?8^L`vdQC@_6S}M4UN)Jd9RT&X#TTa6*8B_qT}+Cl z4yF5^(w)rV?M|a8krJ0GlYUw0Xu|YXN@TMszlW!*z`&aD>v`(bbjo~`>SrMCj{)>< zZ_fZNH@s49pf}gOi=MzgL+|VMsa*wM3}<0{aCtK0UG#Q)yApl;xX!;xb3Zr1N8^2$ z>s36XU%wB_ZX!Pnw40=NSDdOfcBf;{+VZ}s`;!CSNrgUIOr-sc_NO-mG^>&& zI#r;~!nx`MZV2N6WQb{34NID%pnd_p=WHgU-aEgzRF5cejNA~Mi}x=A-j?$F4SEmM z%L%<;?blICwO4&8+@CkNZucM^Hcr#~YJO1zFOu|84d~gBUqha9b40Siu0^FB%IYRsE3d~d=(<<$wCN(_xXa;s%gZ6bCHmkdCKCU zz_9pYm{=nfojr|w5)MeoP7QV!G zv6ne469YYioY>(3EWNf*ubYTRG)k*6gS&|i(Yt|@HR_h{Q`uamKhT(R^hF0R3)JxZ zMyFQ3ULy~Pc&~dHYeg=Qd2JbtrYm0-I^wOcK6;cH${{||f#mdD%5RdU?sDnDtas?T z&&|{O9$wOU^%&Q`N)8123mUCb=}mq+8qCnp;yYycC9yu&KiEY7rWf+36qD9>UP^j@ z!@n{|UcKv0iOyWQt1nP7!*TC@L(|W2A-#=lHy7AmhK%*Gnp%kSL8Q=8>e)rqEpM;m z?Nx-S>kU{3TkO`NStHI=G#xRbPnlJMp?KzH68a_$4Mu%*CP_b+E~yA#E_eF-^>FBR z(%U7=!Z*(fUzUe2X)YU#t1g2Hof*C))q#Z0ToS%3E`?@FI2gAqbXi6T1@4xKgoLW4 z;dH~QmI-SJTa|_LK}W+w2~!z@`3PN=hczz=%Pt9PDi2?VOHdxZTpHFSk_p>lNjPdb z6)%wCWntlEVY4m^mwhR@Mj&o^I2UE%Y%B}kT}E{fh`S`5jq-3dmWFMyG@Pp?;cS$J zFGZF^sV)<~E%GG1Bz$*S*pAD>Su77{v0UUyWGbv`N!V~p!=_mp&c@QPaJje}w&RlU z-6bL$;Y<3$OQ?pZM8TF_M)euGRtC@$YxAj?RGelSbRuXluig!$rB^(YRNat~q4!Pc zNVT~Eq*oz&Gd_e(S2>ldQJOxPrDm>1zAH;-=IQ7fB|>kK(<%QPP37JEfcj8CDxt=x z?lga_shdua=V+ZdPGU)RHxDWlm=Y zMa_G)W)e^Na_M12)v8*0bW@|xadqd?Zf`u*tzOlwS>If>sYG=)wG9w$sA(nC zzN(rd)i<@QsA_Us>gwn@s@q<*qN&zptJ3hm&j1(&%*V*Q4WXaV`L7167xn7Q>J8tH zQeR=>8r5%|s2F<5t3OfZoq=sshqLKr(xEQ5ZJ2C6V0JJ$s-C$kXK?BBLp0rSX*rxE zL%Ov1?a8_1gRxmHNX+B{<8(BmZMCZ@EA*~YfUPN@_o%DH*%F6nt#ue4>l9DAQ%Sd*W{zQd-kuYci zHLD6Hid5Xj_Eog}VV9%2QV!Ry*W{FS^(MAaW!|`@Sn3^L(qul-g?F_*dseHrtJfyt zeXWTN-wQzbzYGXpZE=p8a4NOiO^=@63KAsun3!EC?RKBaX9@J7r ztx2LHQCl&2q?GWTF?_Iy-l-&Jj;_+XA!I}PIEW`??oRpsn{hN?RRB}*1n4^}xyT%t ziMQ?)=qrRlZ%|vB1lR@7r!{M&2HHxXH#n(5@T48CPTyb3)2={{beMN%)qA3*8a+MK z4#^3FjZig#99fw@nxq>}RjOOJh2R-=It82TB8O2&)zyp3Ru53mCd^jRK>SkL1oC{6 znheglE0aaljEQO3y&RMd7i0Hq~Dx2kBe|g1@Ug9-s`JLOFt)^iPL(? zi%Yv%{nU|oFUhMk5ly*^_aR1Q@^)6CJXyCMHX=M#pA66R50iHFkjqpWMRZm739VF# zbfLcTvqn9aqyEnS@Xw&yN>lCu+16xNZ?$?Ns5=u?4Bi)1LzY7ePBK)uYh&w@ADJG5 zHgOUu^@^iwR)L=Hk-MM^QQd`?CZ(eK&OR=yKh{$RfwrL!VU|%GH6*mEJ%<6jk4@kA zL)RJ{T!MX2#0a70ESAnFJd~&;*^IPVpiYvjOxQk=fqUc;7;>VL(OosauWJ07#mHv7 z_vAN7zBxmg^wfV=g;EnoEtsWUs)2;7H}<`*!*@rjn7yzmEdq4)U__+K_D4j|h(yVT z{Cz*OxL41T^ydKi%ch~n0-RU>)d}NPzI}{SkZ%vdC87+*LjyhKAScdt^=2czII=V8 z-vASJ>B=V$tf99767*#|a&pxfnLb~+rvD6zGeK3V>Uc1^>({=i$3HS&qZ<6o=MZUN zHPaG$0M43%^&e;!6tPXczMrB)n1TM@%n{h$)99dfoljDiDc>){Dx4n4K(ZG;)S{*&xKT{z(aBkJyPmUG?6Q$0)2(<$dfcf zrLH)u22vhVqKf0`)ywFqE!exS7GCGdQ0C=9H)1L14-X+pzhsn4 z+%bDN2O=>BiUmY?Iswd7Y9`XiQGnBH|vC^cI9$)AuAW`M>rfXi} zs_&ptnOc~xPfXS*FHqyai_%sux7x8(G zV%A9*LG=-1Z`P<}!b>nB$__1*&IzBaBB@sD2_7n#@Xs?RJ1k<=x zOBbzh=$Qv;)9tG&r(2gdQ!@2GweHOXD{Oq_#MV+bCPPE7kUXL!8zWT=ZZL zbuWs(*lkMCXLjYf3)SX-#xgX?Co{_Vo^p8KQP>A4J8k_*dO{JE3o{w=+Ceb?7&*vO zae9swm}v{yjyvHxa>>A@>62Ht*U>Qsimk>gxOr3#{2`bgP+A2-)51tGubbAJh1w;9 zLr`F8;?F14iGfIEflR5*j43riOs&DgGbK;1G1s0|-!XxEH|ae!6-9qI)D3!9Q(|MH z->9FO5jDp8sRuntm5iK@$}Cpa$2<=#9ZG7cu(>H)nOFu9h^#Md;Zz$Yd6cCfVsb?9|03w0+t2mNs|7=`$B4pFuaMO`}|;jV0S%Xhz--atJWO9iBcJ{oGp*Ee}tgl!A00NI9&<$T)LO15A0xz zMEiul?O7ez+|Zxh=Dhfx=5^EFjuOlGeo6ikk>3ix_c4Q-8h=?`qgpPd{B5d8rCzUm zrjAL5RwtdSX+EIVwrb}pmd>@L`qjW6y+rdgsLZGi$8?|E9<;B}(zl5N4{ug2C)y-mFYV%VsM%d0&N=nl32)~HmpsagN!WK6T|4?IMC3Dw zfMv`YBmj(+&FQm1254`Bc1#F(o9r~I(52st2mL(MGw?7G=tb$^Dw2c^!=BA$8&$^9o7E0v=)|jU(P~=B%($}}8u*l-;p>}C z>Yx>OD9VM`s&kC1Q(5{lD;`7XuFv$#1F9!wY5fc;*u1H1^kkMc-ntW6vG3-THMVHDNFRE0w0_ygjMG5`E70J;`oIU-haLO-c7~iej3OmSy@5x4GbjOZT#g{CH$Q2)xrFb{1_4F0!@rIH{8Iy>oVn)zDjmUJ16{ls z$bW04xy#{3DCYcgIvlPh@izkTcdRh+IV?4oj?6!>(@pSW%*Nx zk7&-GA)}eY?F-Gdim(2*t&Fe4l}%uF$NM{N1%mWD#suDfRbGR?99;zC7Z=Q34kr!^ zO8bBFjsMo&2St2m8{`ol`JMej3OF9aYef7-_&dHF^53mvd71x@B0k&SVaG$*dnLy- zVR87^O9sv?d*g!n_VjQ<$LRpsaSBZxnO_(kH6-W8K<@b?s5s1kGh(Th#K zN1IGIu9VY{?Z)|LKiEn4g6Vf$V&Zi)n{YGYYbEp_j?dw*M0}^i#B*W@Sr7{NlEXjB z_`Qg?&V)sx|0#wZ4ql;uC|z9s;%g8uZ^B(O#Q!tJRYfeN{|A3Xh|hoDlkc%PIQ%Ew z;D57>3g3tLrR>Pas_>YW#q9y+QSrdQ5 z2g3b_jDH5=OZy!$Y5o%UeGTCle8u6}h!694!B~aqc<;Ez i).decode('ascii')) - - -cdef inline str http_method_str(int i): - if i < METHODS_COUNT: - return _http_method[i] - else: - return "" - -cdef inline object find_header(bytes raw_header): - cdef Py_ssize_t size - cdef char *buf - cdef int idx - PyBytes_AsStringAndSize(raw_header, &buf, &size) - idx = _find_header.find_header(buf, size) - if idx == -1: - return raw_header.decode('utf-8', 'surrogateescape') - return headers[idx] - - -@cython.freelist(DEFAULT_FREELIST_SIZE) -cdef class RawRequestMessage: - cdef readonly str method - cdef readonly str path - cdef readonly object version # HttpVersion - cdef readonly object headers # CIMultiDict - cdef readonly object raw_headers # tuple - cdef readonly object should_close - cdef readonly object compression - cdef readonly object upgrade - cdef readonly object chunked - cdef readonly object url # yarl.URL - - def __init__(self, method, path, version, headers, raw_headers, - should_close, compression, upgrade, chunked, url): - self.method = method - self.path = path - self.version = version - self.headers = headers - self.raw_headers = raw_headers - self.should_close = should_close - self.compression = compression - self.upgrade = upgrade - self.chunked = chunked - self.url = url - - def __repr__(self): - info = [] - info.append(("method", self.method)) - info.append(("path", self.path)) - info.append(("version", self.version)) - info.append(("headers", self.headers)) - info.append(("raw_headers", self.raw_headers)) - info.append(("should_close", self.should_close)) - info.append(("compression", self.compression)) - info.append(("upgrade", self.upgrade)) - info.append(("chunked", self.chunked)) - info.append(("url", self.url)) - sinfo = ', '.join(name + '=' + repr(val) for name, val in info) - return '' - - def _replace(self, **dct): - cdef RawRequestMessage ret - ret = _new_request_message(self.method, - self.path, - self.version, - self.headers, - self.raw_headers, - self.should_close, - self.compression, - self.upgrade, - self.chunked, - self.url) - if "method" in dct: - ret.method = dct["method"] - if "path" in dct: - ret.path = dct["path"] - if "version" in dct: - ret.version = dct["version"] - if "headers" in dct: - ret.headers = dct["headers"] - if "raw_headers" in dct: - ret.raw_headers = dct["raw_headers"] - if "should_close" in dct: - ret.should_close = dct["should_close"] - if "compression" in dct: - ret.compression = dct["compression"] - if "upgrade" in dct: - ret.upgrade = dct["upgrade"] - if "chunked" in dct: - ret.chunked = dct["chunked"] - if "url" in dct: - ret.url = dct["url"] - return ret - -cdef _new_request_message(str method, - str path, - object version, - object headers, - object raw_headers, - bint should_close, - object compression, - bint upgrade, - bint chunked, - object url): - cdef RawRequestMessage ret - ret = RawRequestMessage.__new__(RawRequestMessage) - ret.method = method - ret.path = path - ret.version = version - ret.headers = headers - ret.raw_headers = raw_headers - ret.should_close = should_close - ret.compression = compression - ret.upgrade = upgrade - ret.chunked = chunked - ret.url = url - return ret - - -@cython.freelist(DEFAULT_FREELIST_SIZE) -cdef class RawResponseMessage: - cdef readonly object version # HttpVersion - cdef readonly int code - cdef readonly str reason - cdef readonly object headers # CIMultiDict - cdef readonly object raw_headers # tuple - cdef readonly object should_close - cdef readonly object compression - cdef readonly object upgrade - cdef readonly object chunked - - def __init__(self, version, code, reason, headers, raw_headers, - should_close, compression, upgrade, chunked): - self.version = version - self.code = code - self.reason = reason - self.headers = headers - self.raw_headers = raw_headers - self.should_close = should_close - self.compression = compression - self.upgrade = upgrade - self.chunked = chunked - - def __repr__(self): - info = [] - info.append(("version", self.version)) - info.append(("code", self.code)) - info.append(("reason", self.reason)) - info.append(("headers", self.headers)) - info.append(("raw_headers", self.raw_headers)) - info.append(("should_close", self.should_close)) - info.append(("compression", self.compression)) - info.append(("upgrade", self.upgrade)) - info.append(("chunked", self.chunked)) - sinfo = ', '.join(name + '=' + repr(val) for name, val in info) - return '' - - -cdef _new_response_message(object version, - int code, - str reason, - object headers, - object raw_headers, - bint should_close, - object compression, - bint upgrade, - bint chunked): - cdef RawResponseMessage ret - ret = RawResponseMessage.__new__(RawResponseMessage) - ret.version = version - ret.code = code - ret.reason = reason - ret.headers = headers - ret.raw_headers = raw_headers - ret.should_close = should_close - ret.compression = compression - ret.upgrade = upgrade - ret.chunked = chunked - return ret - - -@cython.internal -cdef class HttpParser: - - cdef: - cparser.llhttp_t* _cparser - cparser.llhttp_settings_t* _csettings - - bytes _raw_name - object _name - bytes _raw_value - bint _has_value - - object _protocol - object _loop - object _timer - - size_t _max_line_size - size_t _max_field_size - size_t _max_headers - bint _response_with_body - bint _read_until_eof - - bint _started - object _url - bytearray _buf - str _path - str _reason - list _headers - list _raw_headers - bint _upgraded - list _messages - object _payload - bint _payload_error - object _payload_exception - object _last_error - bint _auto_decompress - int _limit - - str _content_encoding - - Py_buffer py_buf - - def __cinit__(self): - self._cparser = \ - PyMem_Malloc(sizeof(cparser.llhttp_t)) - if self._cparser is NULL: - raise MemoryError() - - self._csettings = \ - PyMem_Malloc(sizeof(cparser.llhttp_settings_t)) - if self._csettings is NULL: - raise MemoryError() - - def __dealloc__(self): - PyMem_Free(self._cparser) - PyMem_Free(self._csettings) - - cdef _init( - self, cparser.llhttp_type mode, - object protocol, object loop, int limit, - object timer=None, - size_t max_line_size=8190, size_t max_headers=32768, - size_t max_field_size=8190, payload_exception=None, - bint response_with_body=True, bint read_until_eof=False, - bint auto_decompress=True, - ): - cparser.llhttp_settings_init(self._csettings) - cparser.llhttp_init(self._cparser, mode, self._csettings) - self._cparser.data = self - self._cparser.content_length = 0 - - self._protocol = protocol - self._loop = loop - self._timer = timer - - self._buf = bytearray() - self._payload = None - self._payload_error = 0 - self._payload_exception = payload_exception - self._messages = [] - - self._raw_name = EMPTY_BYTES - self._raw_value = EMPTY_BYTES - self._has_value = False - - self._max_line_size = max_line_size - self._max_headers = max_headers - self._max_field_size = max_field_size - self._response_with_body = response_with_body - self._read_until_eof = read_until_eof - self._upgraded = False - self._auto_decompress = auto_decompress - self._content_encoding = None - - self._csettings.on_url = cb_on_url - self._csettings.on_status = cb_on_status - self._csettings.on_header_field = cb_on_header_field - self._csettings.on_header_value = cb_on_header_value - self._csettings.on_headers_complete = cb_on_headers_complete - self._csettings.on_body = cb_on_body - self._csettings.on_message_begin = cb_on_message_begin - self._csettings.on_message_complete = cb_on_message_complete - self._csettings.on_chunk_header = cb_on_chunk_header - self._csettings.on_chunk_complete = cb_on_chunk_complete - - self._last_error = None - self._limit = limit - - cdef _process_header(self): - cdef str value - if self._raw_name is not EMPTY_BYTES: - name = find_header(self._raw_name) - value = self._raw_value.decode('utf-8', 'surrogateescape') - - self._headers.append((name, value)) - - if name is CONTENT_ENCODING: - self._content_encoding = value - - self._has_value = False - self._raw_headers.append((self._raw_name, self._raw_value)) - self._raw_name = EMPTY_BYTES - self._raw_value = EMPTY_BYTES - - cdef _on_header_field(self, char* at, size_t length): - if self._has_value: - self._process_header() - - if self._raw_name is EMPTY_BYTES: - self._raw_name = at[:length] - else: - self._raw_name += at[:length] - - cdef _on_header_value(self, char* at, size_t length): - if self._raw_value is EMPTY_BYTES: - self._raw_value = at[:length] - else: - self._raw_value += at[:length] - self._has_value = True - - cdef _on_headers_complete(self): - self._process_header() - - should_close = not cparser.llhttp_should_keep_alive(self._cparser) - upgrade = self._cparser.upgrade - chunked = self._cparser.flags & cparser.F_CHUNKED - - raw_headers = tuple(self._raw_headers) - headers = CIMultiDictProxy(CIMultiDict(self._headers)) - - if self._cparser.type == cparser.HTTP_REQUEST: - allowed = upgrade and headers.get("upgrade", "").lower() in ALLOWED_UPGRADES - if allowed or self._cparser.method == cparser.HTTP_CONNECT: - self._upgraded = True - else: - if upgrade and self._cparser.status_code == 101: - self._upgraded = True - - # do not support old websocket spec - if SEC_WEBSOCKET_KEY1 in headers: - raise InvalidHeader(SEC_WEBSOCKET_KEY1) - - encoding = None - enc = self._content_encoding - if enc is not None: - self._content_encoding = None - enc = enc.lower() - if enc in ('gzip', 'deflate', 'br'): - encoding = enc - - if self._cparser.type == cparser.HTTP_REQUEST: - method = http_method_str(self._cparser.method) - msg = _new_request_message( - method, self._path, - self.http_version(), headers, raw_headers, - should_close, encoding, upgrade, chunked, self._url) - else: - msg = _new_response_message( - self.http_version(), self._cparser.status_code, self._reason, - headers, raw_headers, should_close, encoding, - upgrade, chunked) - - if ( - ULLONG_MAX > self._cparser.content_length > 0 or chunked or - self._cparser.method == cparser.HTTP_CONNECT or - (self._cparser.status_code >= 199 and - self._cparser.content_length == 0 and - self._read_until_eof) - ): - payload = StreamReader( - self._protocol, timer=self._timer, loop=self._loop, - limit=self._limit) - else: - payload = EMPTY_PAYLOAD - - self._payload = payload - if encoding is not None and self._auto_decompress: - self._payload = DeflateBuffer(payload, encoding) - - if not self._response_with_body: - payload = EMPTY_PAYLOAD - - self._messages.append((msg, payload)) - - cdef _on_message_complete(self): - self._payload.feed_eof() - self._payload = None - - cdef _on_chunk_header(self): - self._payload.begin_http_chunk_receiving() - - cdef _on_chunk_complete(self): - self._payload.end_http_chunk_receiving() - - cdef object _on_status_complete(self): - pass - - cdef inline http_version(self): - cdef cparser.llhttp_t* parser = self._cparser - - if parser.http_major == 1: - if parser.http_minor == 0: - return HttpVersion10 - elif parser.http_minor == 1: - return HttpVersion11 - - return HttpVersion(parser.http_major, parser.http_minor) - - ### Public API ### - - def feed_eof(self): - cdef bytes desc - - if self._payload is not None: - if self._cparser.flags & cparser.F_CHUNKED: - raise TransferEncodingError( - "Not enough data to satisfy transfer length header.") - elif self._cparser.flags & cparser.F_CONTENT_LENGTH: - raise ContentLengthError( - "Not enough data to satisfy content length header.") - elif cparser.llhttp_get_errno(self._cparser) != cparser.HPE_OK: - desc = cparser.llhttp_get_error_reason(self._cparser) - raise PayloadEncodingError(desc.decode('latin-1')) - else: - self._payload.feed_eof() - elif self._started: - self._on_headers_complete() - if self._messages: - return self._messages[-1][0] - - def feed_data(self, data): - cdef: - size_t data_len - size_t nb - cdef cparser.llhttp_errno_t errno - - PyObject_GetBuffer(data, &self.py_buf, PyBUF_SIMPLE) - data_len = self.py_buf.len - - errno = cparser.llhttp_execute( - self._cparser, - self.py_buf.buf, - data_len) - - if errno is cparser.HPE_PAUSED_UPGRADE: - cparser.llhttp_resume_after_upgrade(self._cparser) - - nb = cparser.llhttp_get_error_pos(self._cparser) - self.py_buf.buf - - PyBuffer_Release(&self.py_buf) - - if errno not in (cparser.HPE_OK, cparser.HPE_PAUSED_UPGRADE): - if self._payload_error == 0: - if self._last_error is not None: - ex = self._last_error - self._last_error = None - else: - after = cparser.llhttp_get_error_pos(self._cparser) - before = data[:after - self.py_buf.buf] - after_b = after.split(b"\r\n", 1)[0] - before = before.rsplit(b"\r\n", 1)[-1] - data = before + after_b - pointer = " " * (len(repr(before))-1) + "^" - ex = parser_error_from_errno(self._cparser, data, pointer) - self._payload = None - raise ex - - if self._messages: - messages = self._messages - self._messages = [] - else: - messages = () - - if self._upgraded: - return messages, True, data[nb:] - else: - return messages, False, b"" - - def set_upgraded(self, val): - self._upgraded = val - - -cdef class HttpRequestParser(HttpParser): - - def __init__( - self, protocol, loop, int limit, timer=None, - size_t max_line_size=8190, size_t max_headers=32768, - size_t max_field_size=8190, payload_exception=None, - bint response_with_body=True, bint read_until_eof=False, - bint auto_decompress=True, - ): - self._init(cparser.HTTP_REQUEST, protocol, loop, limit, timer, - max_line_size, max_headers, max_field_size, - payload_exception, response_with_body, read_until_eof, - auto_decompress) - - cdef object _on_status_complete(self): - cdef int idx1, idx2 - if not self._buf: - return - self._path = self._buf.decode('utf-8', 'surrogateescape') - try: - idx3 = len(self._path) - if self._cparser.method == cparser.HTTP_CONNECT: - # authority-form, - # https://datatracker.ietf.org/doc/html/rfc7230#section-5.3.3 - self._url = URL.build(authority=self._path, encoded=True) - elif idx3 > 1 and self._path[0] == '/': - # origin-form, - # https://datatracker.ietf.org/doc/html/rfc7230#section-5.3.1 - idx1 = self._path.find("?") - if idx1 == -1: - query = "" - idx2 = self._path.find("#") - if idx2 == -1: - path = self._path - fragment = "" - else: - path = self._path[0: idx2] - fragment = self._path[idx2+1:] - - else: - path = self._path[0:idx1] - idx1 += 1 - idx2 = self._path.find("#", idx1+1) - if idx2 == -1: - query = self._path[idx1:] - fragment = "" - else: - query = self._path[idx1: idx2] - fragment = self._path[idx2+1:] - - self._url = URL.build( - path=path, - query_string=query, - fragment=fragment, - encoded=True, - ) - else: - # absolute-form for proxy maybe, - # https://datatracker.ietf.org/doc/html/rfc7230#section-5.3.2 - self._url = URL(self._path, encoded=True) - finally: - PyByteArray_Resize(self._buf, 0) - - -cdef class HttpResponseParser(HttpParser): - - def __init__( - self, protocol, loop, int limit, timer=None, - size_t max_line_size=8190, size_t max_headers=32768, - size_t max_field_size=8190, payload_exception=None, - bint response_with_body=True, bint read_until_eof=False, - bint auto_decompress=True - ): - self._init(cparser.HTTP_RESPONSE, protocol, loop, limit, timer, - max_line_size, max_headers, max_field_size, - payload_exception, response_with_body, read_until_eof, - auto_decompress) - # Use strict parsing on dev mode, so users are warned about broken servers. - if not DEBUG: - cparser.llhttp_set_lenient_headers(self._cparser, 1) - cparser.llhttp_set_lenient_optional_cr_before_lf(self._cparser, 1) - cparser.llhttp_set_lenient_spaces_after_chunk_size(self._cparser, 1) - - cdef object _on_status_complete(self): - if self._buf: - self._reason = self._buf.decode('utf-8', 'surrogateescape') - PyByteArray_Resize(self._buf, 0) - else: - self._reason = self._reason or '' - -cdef int cb_on_message_begin(cparser.llhttp_t* parser) except -1: - cdef HttpParser pyparser = parser.data - - pyparser._started = True - pyparser._headers = [] - pyparser._raw_headers = [] - PyByteArray_Resize(pyparser._buf, 0) - pyparser._path = None - pyparser._reason = None - return 0 - - -cdef int cb_on_url(cparser.llhttp_t* parser, - const char *at, size_t length) except -1: - cdef HttpParser pyparser = parser.data - try: - if length > pyparser._max_line_size: - raise LineTooLong( - 'Status line is too long', pyparser._max_line_size, length) - extend(pyparser._buf, at, length) - except BaseException as ex: - pyparser._last_error = ex - return -1 - else: - return 0 - - -cdef int cb_on_status(cparser.llhttp_t* parser, - const char *at, size_t length) except -1: - cdef HttpParser pyparser = parser.data - cdef str reason - try: - if length > pyparser._max_line_size: - raise LineTooLong( - 'Status line is too long', pyparser._max_line_size, length) - extend(pyparser._buf, at, length) - except BaseException as ex: - pyparser._last_error = ex - return -1 - else: - return 0 - - -cdef int cb_on_header_field(cparser.llhttp_t* parser, - const char *at, size_t length) except -1: - cdef HttpParser pyparser = parser.data - cdef Py_ssize_t size - try: - pyparser._on_status_complete() - size = len(pyparser._raw_name) + length - if size > pyparser._max_field_size: - raise LineTooLong( - 'Header name is too long', pyparser._max_field_size, size) - pyparser._on_header_field(at, length) - except BaseException as ex: - pyparser._last_error = ex - return -1 - else: - return 0 - - -cdef int cb_on_header_value(cparser.llhttp_t* parser, - const char *at, size_t length) except -1: - cdef HttpParser pyparser = parser.data - cdef Py_ssize_t size - try: - size = len(pyparser._raw_value) + length - if size > pyparser._max_field_size: - raise LineTooLong( - 'Header value is too long', pyparser._max_field_size, size) - pyparser._on_header_value(at, length) - except BaseException as ex: - pyparser._last_error = ex - return -1 - else: - return 0 - - -cdef int cb_on_headers_complete(cparser.llhttp_t* parser) except -1: - cdef HttpParser pyparser = parser.data - try: - pyparser._on_status_complete() - pyparser._on_headers_complete() - except BaseException as exc: - pyparser._last_error = exc - return -1 - else: - if pyparser._upgraded or pyparser._cparser.method == cparser.HTTP_CONNECT: - return 2 - else: - return 0 - - -cdef int cb_on_body(cparser.llhttp_t* parser, - const char *at, size_t length) except -1: - cdef HttpParser pyparser = parser.data - cdef bytes body = at[:length] - try: - pyparser._payload.feed_data(body, length) - except BaseException as underlying_exc: - reraised_exc = underlying_exc - if pyparser._payload_exception is not None: - reraised_exc = pyparser._payload_exception(str(underlying_exc)) - - set_exception(pyparser._payload, reraised_exc, underlying_exc) - - pyparser._payload_error = 1 - return -1 - else: - return 0 - - -cdef int cb_on_message_complete(cparser.llhttp_t* parser) except -1: - cdef HttpParser pyparser = parser.data - try: - pyparser._started = False - pyparser._on_message_complete() - except BaseException as exc: - pyparser._last_error = exc - return -1 - else: - return 0 - - -cdef int cb_on_chunk_header(cparser.llhttp_t* parser) except -1: - cdef HttpParser pyparser = parser.data - try: - pyparser._on_chunk_header() - except BaseException as exc: - pyparser._last_error = exc - return -1 - else: - return 0 - - -cdef int cb_on_chunk_complete(cparser.llhttp_t* parser) except -1: - cdef HttpParser pyparser = parser.data - try: - pyparser._on_chunk_complete() - except BaseException as exc: - pyparser._last_error = exc - return -1 - else: - return 0 - - -cdef parser_error_from_errno(cparser.llhttp_t* parser, data, pointer): - cdef cparser.llhttp_errno_t errno = cparser.llhttp_get_errno(parser) - cdef bytes desc = cparser.llhttp_get_error_reason(parser) - - err_msg = "{}:\n\n {!r}\n {}".format(desc.decode("latin-1"), data, pointer) - - if errno in {cparser.HPE_CB_MESSAGE_BEGIN, - cparser.HPE_CB_HEADERS_COMPLETE, - cparser.HPE_CB_MESSAGE_COMPLETE, - cparser.HPE_CB_CHUNK_HEADER, - cparser.HPE_CB_CHUNK_COMPLETE, - cparser.HPE_INVALID_CONSTANT, - cparser.HPE_INVALID_HEADER_TOKEN, - cparser.HPE_INVALID_CONTENT_LENGTH, - cparser.HPE_INVALID_CHUNK_SIZE, - cparser.HPE_INVALID_EOF_STATE, - cparser.HPE_INVALID_TRANSFER_ENCODING}: - return BadHttpMessage(err_msg) - elif errno == cparser.HPE_INVALID_METHOD: - return BadHttpMethod(error=err_msg) - elif errno in {cparser.HPE_INVALID_STATUS, - cparser.HPE_INVALID_VERSION}: - return BadStatusLine(error=err_msg) - elif errno == cparser.HPE_INVALID_URL: - return InvalidURLError(err_msg) - - return BadHttpMessage(err_msg) diff --git a/venv/lib/python3.12/site-packages/aiohttp/_http_writer.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/aiohttp/_http_writer.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index 85c2314e604920fca6514377f573cdea4b0f4176..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 511688 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%0Da7SI>af$$YbWaAQk}o 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 G!T$#*3A&g7 diff --git a/venv/lib/python3.12/site-packages/aiohttp/_http_writer.pyx b/venv/lib/python3.12/site-packages/aiohttp/_http_writer.pyx deleted file mode 100644 index 4a3ae1f..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/_http_writer.pyx +++ /dev/null @@ -1,160 +0,0 @@ -from cpython.bytes cimport PyBytes_FromStringAndSize -from cpython.exc cimport PyErr_NoMemory -from cpython.mem cimport PyMem_Free, PyMem_Malloc, PyMem_Realloc -from cpython.object cimport PyObject_Str -from libc.stdint cimport uint8_t, uint64_t -from libc.string cimport memcpy - -from multidict import istr - -DEF BUF_SIZE = 16 * 1024 # 16KiB -cdef char BUFFER[BUF_SIZE] - -cdef object _istr = istr - - -# ----------------- writer --------------------------- - -cdef struct Writer: - char *buf - Py_ssize_t size - Py_ssize_t pos - - -cdef inline void _init_writer(Writer* writer): - writer.buf = &BUFFER[0] - writer.size = BUF_SIZE - writer.pos = 0 - - -cdef inline void _release_writer(Writer* writer): - if writer.buf != BUFFER: - PyMem_Free(writer.buf) - - -cdef inline int _write_byte(Writer* writer, uint8_t ch): - cdef char * buf - cdef Py_ssize_t size - - if writer.pos == writer.size: - # reallocate - size = writer.size + BUF_SIZE - if writer.buf == BUFFER: - buf = PyMem_Malloc(size) - if buf == NULL: - PyErr_NoMemory() - return -1 - memcpy(buf, writer.buf, writer.size) - else: - buf = PyMem_Realloc(writer.buf, size) - if buf == NULL: - PyErr_NoMemory() - return -1 - writer.buf = buf - writer.size = size - writer.buf[writer.pos] = ch - writer.pos += 1 - return 0 - - -cdef inline int _write_utf8(Writer* writer, Py_UCS4 symbol): - cdef uint64_t utf = symbol - - if utf < 0x80: - return _write_byte(writer, utf) - elif utf < 0x800: - if _write_byte(writer, (0xc0 | (utf >> 6))) < 0: - return -1 - return _write_byte(writer, (0x80 | (utf & 0x3f))) - elif 0xD800 <= utf <= 0xDFFF: - # surogate pair, ignored - return 0 - elif utf < 0x10000: - if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: - return -1 - if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: - return -1 - return _write_byte(writer, (0x80 | (utf & 0x3f))) - elif utf > 0x10FFFF: - # symbol is too large - return 0 - else: - if _write_byte(writer, (0xf0 | (utf >> 18))) < 0: - return -1 - if _write_byte(writer, - (0x80 | ((utf >> 12) & 0x3f))) < 0: - return -1 - if _write_byte(writer, - (0x80 | ((utf >> 6) & 0x3f))) < 0: - return -1 - return _write_byte(writer, (0x80 | (utf & 0x3f))) - - -cdef inline int _write_str(Writer* writer, str s): - cdef Py_UCS4 ch - for ch in s: - if _write_utf8(writer, ch) < 0: - return -1 - - -cdef inline int _write_str_raise_on_nlcr(Writer* writer, object s): - cdef Py_UCS4 ch - cdef str out_str - if type(s) is str: - out_str = s - elif type(s) is _istr: - out_str = PyObject_Str(s) - elif not isinstance(s, str): - raise TypeError("Cannot serialize non-str key {!r}".format(s)) - else: - out_str = str(s) - - for ch in out_str: - if ch == 0x0D or ch == 0x0A: - raise ValueError( - "Newline or carriage return detected in headers. " - "Potential header injection attack." - ) - if _write_utf8(writer, ch) < 0: - return -1 - - -# --------------- _serialize_headers ---------------------- - -def _serialize_headers(str status_line, headers): - cdef Writer writer - cdef object key - cdef object val - - _init_writer(&writer) - - try: - if _write_str(&writer, status_line) < 0: - raise - if _write_byte(&writer, b'\r') < 0: - raise - if _write_byte(&writer, b'\n') < 0: - raise - - for key, val in headers.items(): - if _write_str_raise_on_nlcr(&writer, key) < 0: - raise - if _write_byte(&writer, b':') < 0: - raise - if _write_byte(&writer, b' ') < 0: - raise - if _write_str_raise_on_nlcr(&writer, val) < 0: - raise - if _write_byte(&writer, b'\r') < 0: - raise - if _write_byte(&writer, b'\n') < 0: - raise - - if _write_byte(&writer, b'\r') < 0: - raise - if _write_byte(&writer, b'\n') < 0: - raise - - return PyBytes_FromStringAndSize(writer.buf, writer.pos) - finally: - _release_writer(&writer) diff --git a/venv/lib/python3.12/site-packages/aiohttp/_websocket/.hash/mask.pxd.hash b/venv/lib/python3.12/site-packages/aiohttp/_websocket/.hash/mask.pxd.hash deleted file mode 100644 index eadfed3..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/_websocket/.hash/mask.pxd.hash +++ /dev/null @@ -1 +0,0 @@ -b01999d409b29bd916e067bc963d5f2d9ee63cfc9ae0bccb769910131417bf93 /home/runner/work/aiohttp/aiohttp/aiohttp/_websocket/mask.pxd diff --git a/venv/lib/python3.12/site-packages/aiohttp/_websocket/.hash/mask.pyx.hash b/venv/lib/python3.12/site-packages/aiohttp/_websocket/.hash/mask.pyx.hash deleted file mode 100644 index 5cd7ae6..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/_websocket/.hash/mask.pyx.hash +++ /dev/null @@ -1 +0,0 @@ -0478ceb55d0ed30ef1a7da742cd003449bc69a07cf9fdb06789bd2b347cbfffe /home/runner/work/aiohttp/aiohttp/aiohttp/_websocket/mask.pyx diff --git a/venv/lib/python3.12/site-packages/aiohttp/_websocket/.hash/reader_c.pxd.hash b/venv/lib/python3.12/site-packages/aiohttp/_websocket/.hash/reader_c.pxd.hash deleted file mode 100644 index f2feb6a..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/_websocket/.hash/reader_c.pxd.hash +++ /dev/null @@ -1 +0,0 @@ -9e5fe78ed0ebce5414d2b8e01868d90c1facc20b84d2d5ff6c23e86e44a155ae /home/runner/work/aiohttp/aiohttp/aiohttp/_websocket/reader_c.pxd diff --git a/venv/lib/python3.12/site-packages/aiohttp/_websocket/__init__.py b/venv/lib/python3.12/site-packages/aiohttp/_websocket/__init__.py deleted file mode 100644 index 836257c..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/_websocket/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""WebSocket protocol versions 13 and 8.""" diff --git a/venv/lib/python3.12/site-packages/aiohttp/_websocket/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/_websocket/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index beeae51718bc092350400583a2e2887e250fcdea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 263 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 PUp4C8ZJJ-TGEn|E71Oj0 diff --git a/venv/lib/python3.12/site-packages/aiohttp/_websocket/__pycache__/models.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/_websocket/__pycache__/models.cpython-312.pyc deleted file mode 100644 index 10f3abc9ea5395751e85806727d036636bc9b481..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3473 zcmb7GU2I!P6`pI~YhT;(PvZQv1-901X>mpE{(;J}Tk1G&)@^bfY^T{=v0UBwP7>m=GVcXpFnB;=-cyIm5>jy(Jh{iusbFZvPLF}MRa0Gma8J^64dUB ztLoO>66)lNTvc?X>d`$_ukNj?x?1(=zN%mMOTdZOCF>qb(Y=;OS1qsZvsB%0 z`SgJ0*L$ph9<+M&kQLO!jZi$y15<@`rEb$S7@_b#*9oppUd;eq*j=mn8@XenGs_oRZQ_nYFNwV$5UfQdMsC%%x8E{R=bfJ%Z?bu z%$r3XnaGW0)6>R{Yz}Of&1pP5o+%VkqhQ8d&KS;)^5}RZV0m@)oV#N><7<$;E~OoBOqsfon~3&OGjkTv!wzzS*kg3aMp z??CffYv5>8YYly7Q||9zbf`Jj5eJVobFE`9ZOTLKVWKUdZ}9Ew?09$P5(xWcpLP?V z`u}K0We72f9;6;UM7?^Ls(OU_^j_-M`)ELqHvI7b_e~YX?YUxOk+yFHuD6XBWZQ>; zr`(31NVW;|lqCcgfEMp(AyBh0LIi;Kq;py^t4+39APaVQhO=5KKh5O{pd4ThP(dPP zxECwbdPIAKD{Ugk4!z@W&kWpS*5LADxi$w_2UJRUU$_@5)OtkQ;tFM~&e%)16Jf*{ zN-uZe7zp+>zzTU99RzO#Ld}s@Fw(r*mPE5B+|2BFNVvZ_+6wkTS5I#<^E42~kx?9p zk^t;zg$8gOcJ%bVooTO%3%=kw1r%6z=K-F(Zjw+pl`RP)K2<<+3CTmfA{Rg;5p8v$ z4}X5KSn>}gOQC+M%t=(4b>SbD2PE0@u0YgjsBxcgDYb3jGM622ESD|QF~LlC9A-lF zRPZL)>}&8Z_b}=#v04e;js8^B_EP#BtbTe6j#HHm_Ud$9*G?`7U z*tJ4Vi{ZKnzdzO~i9|Q3o0dhbS6_{tO`Jc!-yN6O>##)J#bujTX2k|=q+%?_Vo-5; z!LHYqL%`Vf@eT?O~3JhY!-Gk9B;|5L^lu46HAof42O zA?R^$wQXy51@@qokQ?2C_QLk=MSvejYl0_6x0g8RI#KSq?~?C9H~}8Hx~~n1G=Mc) z+|AyAFEf2kTyhL}N z>(FWAE%~HLTKz}fmEZGypa$=GAFD^!``2&(Ry`$bzt4XdNzmQmTxj++;&kuEffK=f zz)c(~mV_&HPY7mrY3voyz#%c1vJ3#1O*Ur()$w>XPTe857Y^ny!&n~tx1$Js4#y7x zG|30y==am>{XahX{?Uzd?|*hHd~#DgDb5l19ilpiX{~w*9s=%i%@I2g24k2`c(7yB z60KCg<`NsnMQ~GB+P1~~#t_g+_7?#@Ss}lZPw&VsjrEAY!OdHSRB9a>3g>D|1D!c&?K6~E0N!w(7W#1&vpNI3^AsxPI zK$#aa68k#LfB4=`q7I<|pN+0w0iT>{Zx!|NW9|RaAaj|*E0ZA^xCcThWSw@D5D@{d zC-Wj;&=4->%1pzdHVdF)1VOwPUPcM8H&-0-CIzq5=xvBOXHnS;Z_joTG&*l5mPCDD zM~~07P6zj8?v$u_&`9-a7= iyqOr^8qhXL-=0U6POVPw5vcYCB`LAmct)TSZul2O8arhG diff --git a/venv/lib/python3.12/site-packages/aiohttp/_websocket/__pycache__/reader.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/_websocket/__pycache__/reader.cpython-312.pyc deleted file mode 100644 index 633cc2718ca0dd81faae9ae485a28124900c7ee6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 759 zcmZ`$&x_MQ7@bMdB>iPnup;3N8be#Wei@3T`-1a_2t%MY$Htd=Y;A{aIZt0 z1I+Z05=I>2=_5=dmjsbs+t%#>>9?x0w#JqTTIDmbVp)hdmKDov61qX3id-Kn1MG!72hAj1 zmZpKNa6*-&zqIyQd+$xyfCN-c=nHFlIcCYl>dM9Wm%g6rPf1sBzUhaAvIeDuegr3c z2v~&1fcV((Z5EA;UE&OV9I(h>*u#Bl`;~~fe6O^E$T;vwvT$RBgOTC6JtIt~ZC7hI zjL2oU657sz-N%t(yJWyvXjo(1i_(8FmZ_`ZWTD>n2^xC%4lVHj$)2NU{FsXn!f#;b z80g1f^SgNV?ZaP!n33l>aPj(KdwRKcB$eipmf7KOHpk&BTd%e0)tg7^#_wsq^b;tj csIThAT;uQ}()ffAg(~=T?yewyhLE3s09N|pWdHyG diff --git a/venv/lib/python3.12/site-packages/aiohttp/_websocket/__pycache__/reader_c.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/_websocket/__pycache__/reader_c.cpython-312.pyc deleted file mode 100644 index 14cdd73baba67ae5d50a072ea47aaa35bb0a5f5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17608 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≦lIX{RkG-ebjufc`>+VYF>BLJu=n( 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 diff --git a/venv/lib/python3.12/site-packages/aiohttp/_websocket/__pycache__/writer.cpython-312.pyc b/venv/lib/python3.12/site-packages/aiohttp/_websocket/__pycache__/writer.cpython-312.pyc deleted file mode 100644 index 0f13895327f2648ac0db3a2a8dbb42978c47d460..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6382 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 diff --git a/venv/lib/python3.12/site-packages/aiohttp/_websocket/helpers.py b/venv/lib/python3.12/site-packages/aiohttp/_websocket/helpers.py deleted file mode 100644 index 0bb58df..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/_websocket/helpers.py +++ /dev/null @@ -1,147 +0,0 @@ -"""Helpers for WebSocket protocol versions 13 and 8.""" - -import functools -import re -from struct import Struct -from typing import TYPE_CHECKING, Final, List, Optional, Pattern, Tuple - -from ..helpers import NO_EXTENSIONS -from .models import WSHandshakeError - -UNPACK_LEN3 = Struct("!Q").unpack_from -UNPACK_CLOSE_CODE = Struct("!H").unpack -PACK_LEN1 = Struct("!BB").pack -PACK_LEN2 = Struct("!BBH").pack -PACK_LEN3 = Struct("!BBQ").pack -PACK_CLOSE_CODE = Struct("!H").pack -PACK_RANDBITS = Struct("!L").pack -MSG_SIZE: Final[int] = 2**14 -MASK_LEN: Final[int] = 4 - -WS_KEY: Final[bytes] = b"258EAFA5-E914-47DA-95CA-C5AB0DC85B11" - - -# Used by _websocket_mask_python -@functools.lru_cache -def _xor_table() -> List[bytes]: - return [bytes(a ^ b for a in range(256)) for b in range(256)] - - -def _websocket_mask_python(mask: bytes, data: bytearray) -> None: - """Websocket masking function. - - `mask` is a `bytes` object of length 4; `data` is a `bytearray` - object of any length. The contents of `data` are masked with `mask`, - as specified in section 5.3 of RFC 6455. - - Note that this function mutates the `data` argument. - - This pure-python implementation may be replaced by an optimized - version when available. - - """ - assert isinstance(data, bytearray), data - assert len(mask) == 4, mask - - if data: - _XOR_TABLE = _xor_table() - a, b, c, d = (_XOR_TABLE[n] for n in mask) - data[::4] = data[::4].translate(a) - data[1::4] = data[1::4].translate(b) - data[2::4] = data[2::4].translate(c) - data[3::4] = data[3::4].translate(d) - - -if TYPE_CHECKING or NO_EXTENSIONS: # pragma: no cover - websocket_mask = _websocket_mask_python -else: - try: - from .mask import _websocket_mask_cython # type: ignore[import-not-found] - - websocket_mask = _websocket_mask_cython - except ImportError: # pragma: no cover - websocket_mask = _websocket_mask_python - - -_WS_EXT_RE: Final[Pattern[str]] = re.compile( - r"^(?:;\s*(?:" - r"(server_no_context_takeover)|" - r"(client_no_context_takeover)|" - r"(server_max_window_bits(?:=(\d+))?)|" - r"(client_max_window_bits(?:=(\d+))?)))*$" -) - -_WS_EXT_RE_SPLIT: Final[Pattern[str]] = re.compile(r"permessage-deflate([^,]+)?") - - -def ws_ext_parse(extstr: Optional[str], isserver: bool = False) -> Tuple[int, bool]: - if not extstr: - return 0, False - - compress = 0 - notakeover = False - for ext in _WS_EXT_RE_SPLIT.finditer(extstr): - defext = ext.group(1) - # Return compress = 15 when get `permessage-deflate` - if not defext: - compress = 15 - break - match = _WS_EXT_RE.match(defext) - if match: - compress = 15 - if isserver: - # Server never fail to detect compress handshake. - # Server does not need to send max wbit to client - if match.group(4): - compress = int(match.group(4)) - # Group3 must match if group4 matches - # Compress wbit 8 does not support in zlib - # If compress level not support, - # CONTINUE to next extension - if compress > 15 or compress < 9: - compress = 0 - continue - if match.group(1): - notakeover = True - # Ignore regex group 5 & 6 for client_max_window_bits - break - else: - if match.group(6): - compress = int(match.group(6)) - # Group5 must match if group6 matches - # Compress wbit 8 does not support in zlib - # If compress level not support, - # FAIL the parse progress - if compress > 15 or compress < 9: - raise WSHandshakeError("Invalid window size") - if match.group(2): - notakeover = True - # Ignore regex group 5 & 6 for client_max_window_bits - break - # Return Fail if client side and not match - elif not isserver: - raise WSHandshakeError("Extension for deflate not supported" + ext.group(1)) - - return compress, notakeover - - -def ws_ext_gen( - compress: int = 15, isserver: bool = False, server_notakeover: bool = False -) -> str: - # client_notakeover=False not used for server - # compress wbit 8 does not support in zlib - if compress < 9 or compress > 15: - raise ValueError( - "Compress wbits must between 9 and 15, zlib does not support wbits=8" - ) - enabledext = ["permessage-deflate"] - if not isserver: - enabledext.append("client_max_window_bits") - - if compress < 15: - enabledext.append("server_max_window_bits=" + str(compress)) - if server_notakeover: - enabledext.append("server_no_context_takeover") - # if client_notakeover: - # enabledext.append('client_no_context_takeover') - return "; ".join(enabledext) diff --git a/venv/lib/python3.12/site-packages/aiohttp/_websocket/mask.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/aiohttp/_websocket/mask.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index 51788d23ba43956fda73be7d0de032a1882a4f97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 258728 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℘GZCInl`xWd_B5)>%rSj%#g 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 diff --git a/venv/lib/python3.12/site-packages/aiohttp/_websocket/mask.pxd b/venv/lib/python3.12/site-packages/aiohttp/_websocket/mask.pxd deleted file mode 100644 index 90983de..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/_websocket/mask.pxd +++ /dev/null @@ -1,3 +0,0 @@ -"""Cython declarations for websocket masking.""" - -cpdef void _websocket_mask_cython(bytes mask, bytearray data) diff --git a/venv/lib/python3.12/site-packages/aiohttp/_websocket/mask.pyx b/venv/lib/python3.12/site-packages/aiohttp/_websocket/mask.pyx deleted file mode 100644 index 2d956c8..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/_websocket/mask.pyx +++ /dev/null @@ -1,48 +0,0 @@ -from cpython cimport PyBytes_AsString - - -#from cpython cimport PyByteArray_AsString # cython still not exports that -cdef extern from "Python.h": - char* PyByteArray_AsString(bytearray ba) except NULL - -from libc.stdint cimport uint32_t, uint64_t, uintmax_t - - -cpdef void _websocket_mask_cython(bytes mask, bytearray data): - """Note, this function mutates its `data` argument - """ - cdef: - Py_ssize_t data_len, i - # bit operations on signed integers are implementation-specific - unsigned char * in_buf - const unsigned char * mask_buf - uint32_t uint32_msk - uint64_t uint64_msk - - assert len(mask) == 4 - - data_len = len(data) - in_buf = PyByteArray_AsString(data) - mask_buf = PyBytes_AsString(mask) - uint32_msk = (mask_buf)[0] - - # TODO: align in_data ptr to achieve even faster speeds - # does it need in python ?! malloc() always aligns to sizeof(long) bytes - - if sizeof(size_t) >= 8: - uint64_msk = uint32_msk - uint64_msk = (uint64_msk << 32) | uint32_msk - - while data_len >= 8: - (in_buf)[0] ^= uint64_msk - in_buf += 8 - data_len -= 8 - - - while data_len >= 4: - (in_buf)[0] ^= uint32_msk - in_buf += 4 - data_len -= 4 - - for i in range(0, data_len): - in_buf[i] ^= mask_buf[i] diff --git a/venv/lib/python3.12/site-packages/aiohttp/_websocket/models.py b/venv/lib/python3.12/site-packages/aiohttp/_websocket/models.py deleted file mode 100644 index 7e89b96..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/_websocket/models.py +++ /dev/null @@ -1,84 +0,0 @@ -"""Models for WebSocket protocol versions 13 and 8.""" - -import json -from enum import IntEnum -from typing import Any, Callable, Final, NamedTuple, Optional, cast - -WS_DEFLATE_TRAILING: Final[bytes] = bytes([0x00, 0x00, 0xFF, 0xFF]) - - -class WSCloseCode(IntEnum): - OK = 1000 - GOING_AWAY = 1001 - PROTOCOL_ERROR = 1002 - UNSUPPORTED_DATA = 1003 - ABNORMAL_CLOSURE = 1006 - INVALID_TEXT = 1007 - POLICY_VIOLATION = 1008 - MESSAGE_TOO_BIG = 1009 - MANDATORY_EXTENSION = 1010 - INTERNAL_ERROR = 1011 - SERVICE_RESTART = 1012 - TRY_AGAIN_LATER = 1013 - BAD_GATEWAY = 1014 - - -class WSMsgType(IntEnum): - # websocket spec types - CONTINUATION = 0x0 - TEXT = 0x1 - BINARY = 0x2 - PING = 0x9 - PONG = 0xA - CLOSE = 0x8 - - # aiohttp specific types - CLOSING = 0x100 - CLOSED = 0x101 - ERROR = 0x102 - - text = TEXT - binary = BINARY - ping = PING - pong = PONG - close = CLOSE - closing = CLOSING - closed = CLOSED - error = ERROR - - -class WSMessage(NamedTuple): - type: WSMsgType - # To type correctly, this would need some kind of tagged union for each type. - data: Any - extra: Optional[str] - - def json(self, *, loads: Callable[[Any], Any] = json.loads) -> Any: - """Return parsed JSON data. - - .. versionadded:: 0.22 - """ - return loads(self.data) - - -# Constructing the tuple directly to avoid the overhead of -# the lambda and arg processing since NamedTuples are constructed -# with a run time built lambda -# https://github.com/python/cpython/blob/d83fcf8371f2f33c7797bc8f5423a8bca8c46e5c/Lib/collections/__init__.py#L441 -WS_CLOSED_MESSAGE = tuple.__new__(WSMessage, (WSMsgType.CLOSED, None, None)) -WS_CLOSING_MESSAGE = tuple.__new__(WSMessage, (WSMsgType.CLOSING, None, None)) - - -class WebSocketError(Exception): - """WebSocket protocol parser error.""" - - def __init__(self, code: int, message: str) -> None: - self.code = code - super().__init__(code, message) - - def __str__(self) -> str: - return cast(str, self.args[1]) - - -class WSHandshakeError(Exception): - """WebSocket protocol handshake error.""" diff --git a/venv/lib/python3.12/site-packages/aiohttp/_websocket/reader.py b/venv/lib/python3.12/site-packages/aiohttp/_websocket/reader.py deleted file mode 100644 index 23f3226..0000000 --- a/venv/lib/python3.12/site-packages/aiohttp/_websocket/reader.py +++ /dev/null @@ -1,31 +0,0 @@ -"""Reader for WebSocket protocol versions 13 and 8.""" - -from typing import TYPE_CHECKING - -from ..helpers import NO_EXTENSIONS - -if TYPE_CHECKING or NO_EXTENSIONS: # pragma: no cover - from .reader_py import ( - WebSocketDataQueue as WebSocketDataQueuePython, - WebSocketReader as WebSocketReaderPython, - ) - - WebSocketReader = WebSocketReaderPython - WebSocketDataQueue = WebSocketDataQueuePython -else: - try: - from .reader_c import ( # type: ignore[import-not-found] - WebSocketDataQueue as WebSocketDataQueueCython, - WebSocketReader as WebSocketReaderCython, - ) - - WebSocketReader = WebSocketReaderCython - WebSocketDataQueue = WebSocketDataQueueCython - except ImportError: # pragma: no cover - from .reader_py import ( - WebSocketDataQueue as WebSocketDataQueuePython, - WebSocketReader as WebSocketReaderPython, - ) - - WebSocketReader = WebSocketReaderPython - WebSocketDataQueue = WebSocketDataQueuePython diff --git a/venv/lib/python3.12/site-packages/aiohttp/_websocket/reader_c.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/aiohttp/_websocket/reader_c.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index 142f11fb44f2e5b575ab6fb719c97e37789ab25b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1818512 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%0A+c5lH2%hnZKm+c)nQthE8DH~nWJG>fx@ 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�Plbz1E6!$06Zc2+a7L* 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 z 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